From 776601cd745adeedc5346f4af0d09d97fce45dd8 Mon Sep 17 00:00:00 2001 From: timo08 Date: Thu, 10 Aug 2017 08:59:38 +0200 Subject: [PATCH 01/30] Set preselect option for Host downtime options ITC-1395 --- app/Controller/SystemdowntimesController.php | 3 ++- app/View/Systemdowntimes/add_hostdowntime.ctp | 3 +++ app/View/Systemsettings/index.ctp | 12 ++++++++++-- .../openITCOCKPIT/InitialDatabase/Systemsetting.php | 8 ++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/Controller/SystemdowntimesController.php b/app/Controller/SystemdowntimesController.php index 1081eb295e..e82aaac2ad 100755 --- a/app/Controller/SystemdowntimesController.php +++ b/app/Controller/SystemdowntimesController.php @@ -116,7 +116,8 @@ public function index() public function addHostdowntime() { $selected = $this->request->data('Systemdowntime.object_id'); - + $preselectedDowntimetype=$this->Systemsetting->findByKey("FRONTEND.PRESELECTED_DOWNTIME_OPTION"); + $this->set('preselectedDowntimetype', $preselectedDowntimetype['Systemsetting']['value']); $this->Frontend->setJson('dateformat', MY_DATEFORMAT); $customFildsToRefill = [ diff --git a/app/View/Systemdowntimes/add_hostdowntime.ctp b/app/View/Systemdowntimes/add_hostdowntime.ctp index 8d414be7e8..ed6137869d 100644 --- a/app/View/Systemdowntimes/add_hostdowntime.ctp +++ b/app/View/Systemdowntimes/add_hostdowntime.ctp @@ -83,7 +83,10 @@ 'label' => ['text' => __('Maintenance period for'), 'class' => 'col-xs-1 col-md-1 col-lg-1'], 'class' => 'chosen col col-xs-12', 'wrapInput' => 'col col-xs-10 col-md-10 col-lg-10', + 'selected' => $preselectedDowntimetype, ]); + //var_dump($psd); + //echo $psd; echo $this->Form->input('comment', [ 'value' => __('In maintenance'), 'label' => ['text' => __('Comment'), 'class' => 'col-xs-1 col-md-1 col-lg-1'], diff --git a/app/View/Systemsettings/index.ctp b/app/View/Systemsettings/index.ctp index 11cbf35d50..fec9556ab2 100644 --- a/app/View/Systemsettings/index.ctp +++ b/app/View/Systemsettings/index.ctp @@ -113,7 +113,6 @@ echo $this->Html->createSelect($options, 'data[' . $i . '][Systemsetting][value]', $value['value']); break; - case 'FRONTEND.AUTH_METHOD': $options = [ 'session' => 'PHP session', @@ -141,7 +140,6 @@ name="data[][Systemsetting][value]">Html->createSelect($options, 'data[' . $i . '][Systemsetting][value]', $value['value']); break; + case 'FRONTEND.PRESELECTED_DOWNTIME_OPTION': + $options = [ + '0' => 'Individual host', + '1' => 'Host including services', + '2' => 'Host and dependent Hosts (triggered)', + '3' => 'Host and dependent Hosts (non-triggered)', + ]; + echo $this->Html->createSelect($options, 'data[' . $i . '][Systemsetting][value]', $value['value']); + break; + case 'ARCHIVE.AGE.SERVICECHECKS': case 'ARCHIVE.AGE.HOSTCHECKS': case 'ARCHIVE.AGE.STATEHISTORIES': diff --git a/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php b/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php index e92be89670..c7cb35c290 100644 --- a/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php +++ b/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php @@ -531,6 +531,14 @@ public function getData() 'section' => 'FRONTEND' ], ], + [ + 'Systemsetting' => [ + 'key' => 'FRONTEND.PRESELECTED_DOWNTIME_OPTION', + 'value' => '0', + 'info' => 'Set preselected Host downtime options individual', + 'section' => 'FRONTEND' + ], + ], [ 'Systemsetting' => [ 'key' => 'CHECK_MK.BIN', From 79fdb4a2ab50d349dfff9055d53790150d23b708 Mon Sep 17 00:00:00 2001 From: timo08 Date: Thu, 10 Aug 2017 09:42:54 +0200 Subject: [PATCH 02/30] Add option to Host commands ITC-1395 --- app/Controller/HostsController.php | 3 +++ app/View/Hosts/browser.ctp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Controller/HostsController.php b/app/Controller/HostsController.php index 9f4a1adfd7..51da9fc9e1 100644 --- a/app/Controller/HostsController.php +++ b/app/Controller/HostsController.php @@ -2406,6 +2406,9 @@ public function browser($id = null){ $this->Frontend->setJson('hostUuid', $host['Host']['uuid']); $this->set('QueryHandler', new QueryHandler($this->Systemsetting->getQueryHandlerPath())); + + $preselectedDowntimetype=$this->Systemsetting->findByKey("FRONTEND.PRESELECTED_DOWNTIME_OPTION"); + $this->set('preselectedDowntimetype', $preselectedDowntimetype['Systemsetting']['value']); } /** diff --git a/app/View/Hosts/browser.ctp b/app/View/Hosts/browser.ctp index 5766a6830e..20c3b68716 100644 --- a/app/View/Hosts/browser.ctp +++ b/app/View/Hosts/browser.ctp @@ -919,7 +919,7 @@ $Hoststatus = new Hoststatus($hoststatus['Hoststatus']); 3 => __('Hosts and dependent Hosts (non-triggered)'), ]; ?> - Form->input('type', ['options' => $hostdowntimetyps, 'label' => __('Maintenance period for') . ':']) ?> + Form->input('type', ['options' => $hostdowntimetyps, 'selected' => $preselectedDowntimetype, 'label' => __('Maintenance period for') . ':']) ?> Form->input('comment', ['value' => __('In progress'), 'label' => __('Comment') . ':']); ?>
From 1938fff047e306059687fc1d3abe3910f5faa62a Mon Sep 17 00:00:00 2001 From: timo08 Date: Thu, 10 Aug 2017 14:33:44 +0200 Subject: [PATCH 03/30] Update CodeStyle ITC-1395 --- app/Controller/HostsController.php | 1266 +++++++++-------- app/Controller/SystemdowntimesController.php | 199 ++- .../InitialDatabase/Systemsetting.php | 656 +++++---- 3 files changed, 1058 insertions(+), 1063 deletions(-) diff --git a/app/Controller/HostsController.php b/app/Controller/HostsController.php index 51da9fc9e1..2c78af3290 100644 --- a/app/Controller/HostsController.php +++ b/app/Controller/HostsController.php @@ -89,125 +89,131 @@ class HostsController extends AppController { 'Servicetemplategroup', ]; public $listFilters = [ - 'index' => [ + 'index' => [ 'fields' => [ - 'Host.name' => ['label' => 'Hostname', 'searchType' => 'wildcard'], - 'Host.address' => ['label' => 'IP-Address', 'searchType' => 'wildcard'], - 'Hoststatus.output' => ['label' => 'Output', 'searchType' => 'wildcard'], - 'Host.keywords' => ['label' => 'Tag', 'searchType' => 'wildcardMulti', 'hidden' => true], - - 'Hoststatus.current_state' => ['label' => 'Current state', 'type' => 'checkbox', 'searchType' => 'nix', 'options' => - [ - '0' => [ - 'name' => 'Hoststatus.up', - 'value' => 1, - 'label' => 'Up', - 'data' => 'Filter.Hoststatus.current_state', - ], - '1' => [ - 'name' => 'Hoststatus.down', - 'value' => 1, - 'label' => 'Down', - 'data' => 'Filter.Hoststatus.current_state', - ], - '2' => [ - 'name' => 'Hoststatus.unreachable', - 'value' => 1, - 'label' => 'Unreachable', - 'data' => 'Filter.Hoststatus.current_state', + 'Host.name' => ['label' => 'Hostname','searchType' => 'wildcard'], + 'Host.address' => ['label' => 'IP-Address','searchType' => 'wildcard'], + 'Hoststatus.output' => ['label' => 'Output','searchType' => 'wildcard'], + 'Host.keywords' => ['label' => 'Tag','searchType' => 'wildcardMulti','hidden' => true], + + 'Hoststatus.current_state' => [ + 'label' => 'Current state','type' => 'checkbox','searchType' => 'nix','options' => + [ + '0' => [ + 'name' => 'Hoststatus.up', + 'value' => 1, + 'label' => 'Up', + 'data' => 'Filter.Hoststatus.current_state', + ], + '1' => [ + 'name' => 'Hoststatus.down', + 'value' => 1, + 'label' => 'Down', + 'data' => 'Filter.Hoststatus.current_state', + ], + '2' => [ + 'name' => 'Hoststatus.unreachable', + 'value' => 1, + 'label' => 'Unreachable', + 'data' => 'Filter.Hoststatus.current_state', + ], ], - ], ], - 'Hoststatus.problem_has_been_acknowledged' => ['label' => 'Acknowledged', 'type' => 'checkbox', 'searchType' => 'nix', 'options' => - [ - '1' => [ - 'name' => 'Acknowledged', - 'value' => 1, - 'label' => 'Acknowledged', - 'data' => 'Filter.Hoststatus.problem_has_been_acknowledged', + 'Hoststatus.problem_has_been_acknowledged' => [ + 'label' => 'Acknowledged','type' => 'checkbox','searchType' => 'nix','options' => + [ + '1' => [ + 'name' => 'Acknowledged', + 'value' => 1, + 'label' => 'Acknowledged', + 'data' => 'Filter.Hoststatus.problem_has_been_acknowledged', + ], ], - ], ], - 'Hoststatus.scheduled_downtime_depth' => ['label' => 'In Downtime', 'type' => 'checkbox', 'searchType' => 'greater', 'options' => - [ - '0' => [ - 'name' => 'Downtime', - 'value' => 1, - 'label' => 'In Downtime', - 'data' => 'Filter.Hoststatus.scheduled_downtime_depth', + 'Hoststatus.scheduled_downtime_depth' => [ + 'label' => 'In Downtime','type' => 'checkbox','searchType' => 'greater','options' => + [ + '0' => [ + 'name' => 'Downtime', + 'value' => 1, + 'label' => 'In Downtime', + 'data' => 'Filter.Hoststatus.scheduled_downtime_depth', + ], ], - ], ], ], ], - 'listToPdf' => [ + 'listToPdf' => [ 'fields' => [ - 'Host.name' => ['label' => 'Hostname', 'searchType' => 'wildcard'], - 'Host.address' => ['label' => 'IP-Address', 'searchType' => 'wildcard'], - 'Hoststatus.output' => ['label' => 'Output', 'searchType' => 'wildcard'], - 'Host.keywords' => ['label' => 'Tag', 'searchType' => 'wildcardMulti', 'hidden' => true], - - 'Hoststatus.current_state' => ['label' => 'Current state', 'type' => 'checkbox', 'searchType' => 'nix', 'options' => - [ - '0' => [ - 'name' => 'Hoststatus.up', - 'value' => 1, - 'label' => 'Up', - 'data' => 'Filter.Hoststatus.current_state', - ], - '1' => [ - 'name' => 'Hoststatus.down', - 'value' => 1, - 'label' => 'Down', - 'data' => 'Filter.Hoststatus.current_state', - ], - '2' => [ - 'name' => 'Hoststatus.unreachable', - 'value' => 1, - 'label' => 'Unreachable', - 'data' => 'Filter.Hoststatus.current_state', + 'Host.name' => ['label' => 'Hostname','searchType' => 'wildcard'], + 'Host.address' => ['label' => 'IP-Address','searchType' => 'wildcard'], + 'Hoststatus.output' => ['label' => 'Output','searchType' => 'wildcard'], + 'Host.keywords' => ['label' => 'Tag','searchType' => 'wildcardMulti','hidden' => true], + + 'Hoststatus.current_state' => [ + 'label' => 'Current state','type' => 'checkbox','searchType' => 'nix','options' => + [ + '0' => [ + 'name' => 'Hoststatus.up', + 'value' => 1, + 'label' => 'Up', + 'data' => 'Filter.Hoststatus.current_state', + ], + '1' => [ + 'name' => 'Hoststatus.down', + 'value' => 1, + 'label' => 'Down', + 'data' => 'Filter.Hoststatus.current_state', + ], + '2' => [ + 'name' => 'Hoststatus.unreachable', + 'value' => 1, + 'label' => 'Unreachable', + 'data' => 'Filter.Hoststatus.current_state', + ], ], - ], ], - 'Hoststatus.problem_has_been_acknowledged' => ['label' => 'Acknowledged', 'type' => 'checkbox', 'searchType' => 'nix', 'options' => - [ - '1' => [ - 'name' => 'Acknowledged', - 'value' => 1, - 'label' => 'Acknowledged', - 'data' => 'Filter.Hoststatus.problem_has_been_acknowledged', + 'Hoststatus.problem_has_been_acknowledged' => [ + 'label' => 'Acknowledged','type' => 'checkbox','searchType' => 'nix','options' => + [ + '1' => [ + 'name' => 'Acknowledged', + 'value' => 1, + 'label' => 'Acknowledged', + 'data' => 'Filter.Hoststatus.problem_has_been_acknowledged', + ], ], - ], ], - 'Hoststatus.scheduled_downtime_depth' => ['label' => 'In Downtime', 'type' => 'checkbox', 'searchType' => 'greater', 'options' => - [ - '0' => [ - 'name' => 'Downtime', - 'value' => 1, - 'label' => 'In Downtime', - 'data' => 'Filter.Hoststatus.scheduled_downtime_depth', + 'Hoststatus.scheduled_downtime_depth' => [ + 'label' => 'In Downtime','type' => 'checkbox','searchType' => 'greater','options' => + [ + '0' => [ + 'name' => 'Downtime', + 'value' => 1, + 'label' => 'In Downtime', + 'data' => 'Filter.Hoststatus.scheduled_downtime_depth', + ], ], - ], ], ], ], 'notMnotMonitored' => [ 'fields' => [ - 'Host.name' => ['label' => 'Hostname', 'searchType' => 'wildcard'], - 'Host.address' => ['label' => 'IP-Address', 'searchType' => 'wildcard'], - 'Host.tags' => ['label' => 'Tag', 'searchType' => 'wildcard', 'hidden' => true], + 'Host.name' => ['label' => 'Hostname','searchType' => 'wildcard'], + 'Host.address' => ['label' => 'IP-Address','searchType' => 'wildcard'], + 'Host.tags' => ['label' => 'Tag','searchType' => 'wildcard','hidden' => true], ], ], - 'disabled' => [ + 'disabled' => [ 'fields' => [ - 'Host.name' => ['label' => 'Hostname', 'searchType' => 'wildcard'], - 'Host.address' => ['label' => 'IP-Address', 'searchType' => 'wildcard'], - 'Host.tags' => ['label' => 'Tag', 'searchType' => 'wildcard', 'hidden' => true], + 'Host.name' => ['label' => 'Hostname','searchType' => 'wildcard'], + 'Host.address' => ['label' => 'IP-Address','searchType' => 'wildcard'], + 'Host.tags' => ['label' => 'Tag','searchType' => 'wildcard','hidden' => true], ], ], ]; - public function index(){ + public function index() { $HostControllerRequest = new HostControllerRequest($this->request); $HostCondition = new HostConditions(); $User = new User($this->Auth); @@ -219,7 +225,7 @@ public function index(){ if ($HostControllerRequest->isRequestFromBrowser() === true) { $browserContainerIds = $HostControllerRequest->getBrowserContainerIdsByRequest(); foreach ($browserContainerIds as $containerIdToCheck) { - if (!in_array($containerIdToCheck, $this->MY_RIGHTS)) { + if (!in_array($containerIdToCheck,$this->MY_RIGHTS)) { $this->render403(); return; } @@ -231,14 +237,14 @@ public function index(){ if ($User->isRecursiveBrowserEnabled()) { //get recursive container ids $containerIdToResolve = $browserContainerIds; - $containerIds = Hash::extract($this->Container->children($containerIdToResolve[0], false, ['Container.id']), '{n}.Container.id'); + $containerIds = Hash::extract($this->Container->children($containerIdToResolve[0],false,['Container.id']),'{n}.Container.id'); $recursiveContainerIds = []; foreach ($containerIds as $containerId) { - if (in_array($containerId, $this->MY_RIGHTS)) { + if (in_array($containerId,$this->MY_RIGHTS)) { $recursiveContainerIds[] = $containerId; } } - $HostCondition->setContainerIds(array_merge($HostCondition->getContainerIds(), $recursiveContainerIds)); + $HostCondition->setContainerIds(array_merge($HostCondition->getContainerIds(),$recursiveContainerIds)); } } @@ -247,33 +253,33 @@ public function index(){ )); if ($this->DbBackend->isNdoUtils()) { - $query = $this->Host->getHostIndexQuery($HostCondition, $this->ListFilter->buildConditions()); + $query = $this->Host->getHostIndexQuery($HostCondition,$this->ListFilter->buildConditions()); $this->Host->virtualFieldsForIndex(); $modelName = 'Host'; } if ($this->DbBackend->isCrateDb()) { - $query = $this->Hoststatus->getHostIndexQuery($HostCondition, $this->ListFilter->buildConditions()); + $query = $this->Hoststatus->getHostIndexQuery($HostCondition,$this->ListFilter->buildConditions()); $modelName = 'Hoststatus'; } if ($this->isApiRequest()) { - $all_hosts = $this->{$modelName}->find('all', $query); + $all_hosts = $this->{$modelName}->find('all',$query); } else { - $this->Paginator->settings = array_merge($this->Paginator->settings, $query); - $all_hosts = $this->Paginator->paginate($modelName, [], [key($this->Paginator->settings['order'])]); + $this->Paginator->settings = array_merge($this->Paginator->settings,$query); + $all_hosts = $this->Paginator->paginate($modelName,[],[key($this->Paginator->settings['order'])]); } - $this->set('all_hosts', $all_hosts); - $this->set('_serialize', ['all_hosts']); + $this->set('all_hosts',$all_hosts); + $this->set('_serialize',['all_hosts']); - $this->set('username', $User->getFullName()); - $this->set('userRights', $this->MY_RIGHTS); - $this->set('myNamedFilters', $this->request->data); + $this->set('username',$User->getFullName()); + $this->set('userRights',$this->MY_RIGHTS); + $this->set('myNamedFilters',$this->request->data); - $this->set('QueryHandler', new QueryHandler($this->Systemsetting->getQueryHandlerPath())); - $this->set('masterInstance', $this->Systemsetting->getMasterInstanceName()); + $this->set('QueryHandler',new QueryHandler($this->Systemsetting->getQueryHandlerPath())); + $this->set('masterInstance',$this->Systemsetting->getMasterInstanceName()); $SatelliteNames = []; $ModuleManager = new ModuleManager('DistributeModule'); @@ -281,10 +287,10 @@ public function index(){ $SatelliteModel = $ModuleManager->loadModel('Satellite'); $SatelliteNames = $SatelliteModel->find('list'); } - $this->set('SatelliteNames', $SatelliteNames); + $this->set('SatelliteNames',$SatelliteNames); } - public function view($id = null){ + public function view($id = null) { if (!$this->isApiRequest()) { throw new MethodNotAllowedException(); @@ -293,7 +299,7 @@ public function view($id = null){ throw new NotFoundException(__('Invalid host')); } $host = $this->Host->findById($id); - $containerIdsToCheck = Hash::extract($host, 'Container.{n}.HostsToContainer.container_id'); + $containerIdsToCheck = Hash::extract($host,'Container.{n}.HostsToContainer.container_id'); $containerIdsToCheck[] = $host['Host']['container_id']; if (!$this->allowedByContainerId($containerIdsToCheck)) { $this->render403(); @@ -304,16 +310,16 @@ public function view($id = null){ $hoststatus = $this->Hoststatus->byUuid($host['Host']['uuid']); if (empty($hoststatus)) { $hoststatus = [ - 'Hoststatus' => [] + 'Hoststatus' => [] ]; } - $host = Hash::merge($host, $hoststatus); + $host = Hash::merge($host,$hoststatus); - $this->set('host', $host); - $this->set('_serialize', ['host']); + $this->set('host',$host); + $this->set('_serialize',['host']); } - public function notMonitored(){ + public function notMonitored() { $HostControllerRequest = new HostControllerRequest($this->request); $HostCondition = new HostConditions(); $User = new User($this->Auth); @@ -326,33 +332,33 @@ public function notMonitored(){ if ($this->DbBackend->isNdoUtils()) { - $query = $this->Host->getHostNotMonitoredQuery($HostCondition, $this->ListFilter->buildConditions()); + $query = $this->Host->getHostNotMonitoredQuery($HostCondition,$this->ListFilter->buildConditions()); $modelName = 'Host'; } if ($this->DbBackend->isCrateDb()) { $this->loadModel('CrateModule.CrateHost'); - $query = $this->CrateHost->getHostNotMonitoredQuery($HostCondition, $this->ListFilter->buildConditions()); + $query = $this->CrateHost->getHostNotMonitoredQuery($HostCondition,$this->ListFilter->buildConditions()); $this->CrateHost->alias = 'Host'; $modelName = 'CrateHost'; } if ($this->isApiRequest()) { - $all_hosts = $this->{$modelName}->find('all', $query); + $all_hosts = $this->{$modelName}->find('all',$query); } else { - $this->Paginator->settings = array_merge($this->Paginator->settings, $query); - $all_hosts = $this->Paginator->paginate($modelName, [], [key($this->Paginator->settings['order'])]); + $this->Paginator->settings = array_merge($this->Paginator->settings,$query); + $all_hosts = $this->Paginator->paginate($modelName,[],[key($this->Paginator->settings['order'])]); } - $this->set('all_hosts', $all_hosts); - $this->set('_serialize', ['all_hosts']); + $this->set('all_hosts',$all_hosts); + $this->set('_serialize',['all_hosts']); - $this->set('userRights', $this->MY_RIGHTS); - $this->set('myNamedFilters', $this->request->data); + $this->set('userRights',$this->MY_RIGHTS); + $this->set('myNamedFilters',$this->request->data); - $this->set('QueryHandler', new QueryHandler($this->Systemsetting->getQueryHandlerPath())); - $this->set('masterInstance', $this->Systemsetting->getMasterInstanceName()); + $this->set('QueryHandler',new QueryHandler($this->Systemsetting->getQueryHandlerPath())); + $this->set('masterInstance',$this->Systemsetting->getMasterInstanceName()); $SatelliteNames = []; $ModuleManager = new ModuleManager('DistributeModule'); @@ -360,32 +366,32 @@ public function notMonitored(){ $SatelliteModel = $ModuleManager->loadModel('Satellite'); $SatelliteNames = $SatelliteModel->find('list'); } - $this->set('SatelliteNames', $SatelliteNames); + $this->set('SatelliteNames',$SatelliteNames); } - public function edit($id = null){ - $this->set('MY_RIGHTS', $this->MY_RIGHTS); - $this->set('MY_WRITABLE_CONTAINERS', $this->getWriteContainers()); + public function edit($id = null) { + $this->set('MY_RIGHTS',$this->MY_RIGHTS); + $this->set('MY_WRITABLE_CONTAINERS',$this->getWriteContainers()); $userId = $this->Auth->user('id'); if (!$this->Host->exists($id)) { throw new NotFoundException(__('Invalid host')); } - $_host = $this->Host->find('first', [ + $_host = $this->Host->find('first',[ 'conditions' => [ 'Host.id' => $id, ], - 'contain' => [ + 'contain' => [ 'Container', ], - 'fields' => [ + 'fields' => [ 'Host.container_id', 'Container.*', ], ]); - $containerIdsToCheck = Hash::extract($_host, 'Container.{n}.HostsToContainer.container_id'); + $containerIdsToCheck = Hash::extract($_host,'Container.{n}.HostsToContainer.container_id'); $containerIdsToCheck[] = $_host['Host']['container_id']; if (!$this->allowedByContainerId($containerIdsToCheck)) { $this->render403(); @@ -394,20 +400,20 @@ public function edit($id = null){ } $host = $this->Host->prepareForView($id); $host_for_changelog = $host; - $this->set('back_url', $this->referer()); - $this->Frontend->setJson('lang_minutes', __('minutes')); - $this->Frontend->setJson('lang_seconds', __('seconds')); - $this->Frontend->setJson('lang_and', __('and')); - $this->Frontend->setJson('dns_hostname_lookup_failed', __('Could not resolve hostname')); - $this->Frontend->setJson('dns_ipaddress_lookup_failed', __('Could not reverse lookup your ip address')); - $this->Frontend->setJson('hostname_placeholder', __('Will be auto detected if you enter a ip address')); - $this->Frontend->setJson('address_placeholder', __('Will be auto detected if you enter a FQDN')); - $this->Frontend->setJson('hostId', $id); + $this->set('back_url',$this->referer()); + $this->Frontend->setJson('lang_minutes',__('minutes')); + $this->Frontend->setJson('lang_seconds',__('seconds')); + $this->Frontend->setJson('lang_and',__('and')); + $this->Frontend->setJson('dns_hostname_lookup_failed',__('Could not resolve hostname')); + $this->Frontend->setJson('dns_ipaddress_lookup_failed',__('Could not reverse lookup your ip address')); + $this->Frontend->setJson('hostname_placeholder',__('Will be auto detected if you enter a ip address')); + $this->Frontend->setJson('address_placeholder',__('Will be auto detected if you enter a FQDN')); + $this->Frontend->setJson('hostId',$id); // Checking if the user hit submit and a validation error happens, to refill input fields $Customvariable = []; $customFieldsToRefill = [ - 'Host' => [ + 'Host' => [ 'notification_interval', 'notify_on_recovery', 'notify_on_down', @@ -468,10 +474,10 @@ public function edit($id = null){ $hosttemplates = $this->Hosttemplate->find('list'); $hostgroups = $this->Hostgroup->findList([ 'recursive' => -1, - 'contain' => [ + 'contain' => [ 'Container', ], - ], 'id'); + ],'id'); // End changelog // Data to refill form @@ -483,25 +489,25 @@ public function edit($id = null){ $containerIds = $this->Tree->resolveChildrenOfContainerIds($containerId); - $_hosttemplates = $this->Hosttemplate->hosttemplatesByContainerId($containerIds, 'list', $host['Host']['host_type']); - $_hostgroups = $this->Hostgroup->hostgroupsByContainerId($containerIds, 'list', 'id'); - $_parenthosts = $this->Host->hostsByContainerIdExcludeHostId($containerIds, 'list', $id); - $_timeperiods = $this->Timeperiod->timeperiodsByContainerId($containerIds, 'list'); - $_contacts = $this->Contact->contactsByContainerId($containerIds, 'list'); - $_contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds, 'list'); + $_hosttemplates = $this->Hosttemplate->hosttemplatesByContainerId($containerIds,'list',$host['Host']['host_type']); + $_hostgroups = $this->Hostgroup->hostgroupsByContainerId($containerIds,'list','id'); + $_parenthosts = $this->Host->hostsByContainerIdExcludeHostId($containerIds,'list',$id); + $_timeperiods = $this->Timeperiod->timeperiodsByContainerId($containerIds,'list'); + $_contacts = $this->Contact->contactsByContainerId($containerIds,'list'); + $_contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds,'list'); - $this->set(compact(['_hosttemplates', '_hostgroups', '_parenthosts', '_timeperiods', '_contacts', '_contactgroups', 'id'])); + $this->set(compact(['_hosttemplates','_hostgroups','_parenthosts','_timeperiods','_contacts','_contactgroups','id'])); // End form refill if ($this->hasRootPrivileges === true) { - $containers = $this->Tree->easyPath($this->MY_RIGHTS, OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); + $containers = $this->Tree->easyPath($this->MY_RIGHTS,OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); } else { - $containers = $this->Tree->easyPath($this->getWriteContainers(), OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); + $containers = $this->Tree->easyPath($this->getWriteContainers(),OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); } //Fehlende bzw. neu angelegte CommandArgummente ermitteln und anzeigen - $commandarguments = $this->Commandargument->find('all', [ - 'recursive' => -1, + $commandarguments = $this->Commandargument->find('all',[ + 'recursive' => -1, 'conditions' => [ 'Commandargument.command_id' => $host['Host']['command_id'], ], @@ -510,7 +516,7 @@ public function edit($id = null){ $contacts_for_changelog = []; foreach ($host['Contact'] as $contact_id) { $contacts_for_changelog[] = [ - 'id' => $contact_id, + 'id' => $contact_id, 'name' => $contacts[$contact_id], ]; } @@ -518,7 +524,7 @@ public function edit($id = null){ foreach ($host['Contactgroup'] as $contactgroup_id) { if (isset($contactgroups[$contactgroup_id])) { $contactgroups_for_changelog[] = [ - 'id' => $contactgroup_id, + 'id' => $contactgroup_id, 'name' => $contactgroups[$contactgroup_id], ]; } @@ -527,7 +533,7 @@ public function edit($id = null){ foreach ($host['Hostgroup'] as $hostgroup_id) { if (isset($hostgroups[$hostgroup_id])) { $hostgroups_for_changelog[] = [ - 'id' => $hostgroup_id, + 'id' => $hostgroup_id, 'name' => $hostgroups[$hostgroup_id], ]; } @@ -535,7 +541,7 @@ public function edit($id = null){ $parenthosts_for_changelog = []; foreach ($host['Parenthost'] as $parenthost_id) { $parenthosts_for_changelog[] = [ - 'id' => $parenthost_id, + 'id' => $parenthost_id, 'name' => $hosts[$parenthost_id], ]; } @@ -547,15 +553,15 @@ public function edit($id = null){ $masterInstance = $this->Systemsetting->findAsArraySection('FRONTEND')['FRONTEND']['FRONTEND.MASTER_INSTANCE']; $ContactsInherited = $this->__inheritContactsAndContactgroups($host); - $this->Frontend->setJson('ContactsInherited', $ContactsInherited); + $this->Frontend->setJson('ContactsInherited',$ContactsInherited); - $this->set('back_url', $this->referer()); + $this->set('back_url',$this->referer()); //get sharing containers - $sharingContainers = $this->getSharingContainers($host['Host']['container_id'], false); + $sharingContainers = $this->getSharingContainers($host['Host']['container_id'],false); //get the already shared containers if (is_array($host['Container']) && !empty($host['Container'])) { - $sharedContainers = array_diff($host['Container'], [$host['Host']['container_id']]); + $sharedContainers = array_diff($host['Container'],[$host['Host']['container_id']]); } else { $sharedContainers = []; } @@ -581,17 +587,17 @@ public function edit($id = null){ ])); if ($this->request->is('post') || $this->request->is('put')) { $ext_data_for_changelog = [ - 'Contact' => [ + 'Contact' => [ 'Contact' => [], ], 'Contactgroup' => [ 'Contactgroup' => [], ], - 'Hostgroup' => [], - 'Parenthost' => [], + 'Hostgroup' => [], + 'Parenthost' => [], ]; if ($this->request->data('Host.Contact')) { - if ($contactsForChangelog = $this->Contact->find('list', [ + if ($contactsForChangelog = $this->Contact->find('list',[ 'conditions' => [ 'Contact.id' => $this->request->data['Host']['Contact'], ], @@ -599,7 +605,7 @@ public function edit($id = null){ ) { foreach ($contactsForChangelog as $contactId => $contactName) { $ext_data_for_changelog['Contact'][] = [ - 'id' => $contactId, + 'id' => $contactId, 'name' => $contactName, ]; } @@ -607,16 +613,16 @@ public function edit($id = null){ } } if ($this->request->data('Host.Contactgroup')) { - if ($contactgroupsForChangelog = $this->Contactgroup->find('all', [ - 'recursive' => -1, - 'contain' => [ + if ($contactgroupsForChangelog = $this->Contactgroup->find('all',[ + 'recursive' => -1, + 'contain' => [ 'Container' => [ 'fields' => [ 'Container.name', ], ], ], - 'fields' => [ + 'fields' => [ 'Contactgroup.id', ], 'conditions' => [ @@ -626,7 +632,7 @@ public function edit($id = null){ ) { foreach ($contactgroupsForChangelog as $contactgroupData) { $ext_data_for_changelog['Contactgroup'][] = [ - 'id' => $contactgroupData['Contactgroup']['id'], + 'id' => $contactgroupData['Contactgroup']['id'], 'name' => $contactgroupData['Container']['name'], ]; } @@ -634,16 +640,16 @@ public function edit($id = null){ } } if ($this->request->data('Host.Hostgroup')) { - if ($hostgroupsForChangelog = $this->Hostgroup->find('all', [ - 'recursive' => -1, - 'contain' => [ + if ($hostgroupsForChangelog = $this->Hostgroup->find('all',[ + 'recursive' => -1, + 'contain' => [ 'Container' => [ 'fields' => [ 'Container.name', ], ], ], - 'fields' => [ + 'fields' => [ 'Hostgroup.id', ], 'conditions' => [ @@ -653,7 +659,7 @@ public function edit($id = null){ ) { foreach ($hostgroupsForChangelog as $hostgroupData) { $ext_data_for_changelog['Hostgroup'][] = [ - 'id' => $hostgroupData['Hostgroup']['id'], + 'id' => $hostgroupData['Hostgroup']['id'], 'name' => $hostgroupData['Container']['name'], ]; } @@ -661,7 +667,7 @@ public function edit($id = null){ } } if ($this->request->data('Host.notify_period_id')) { - if ($timeperiodsForChangelog = $this->Timeperiod->find('list', [ + if ($timeperiodsForChangelog = $this->Timeperiod->find('list',[ 'conditions' => [ 'Timeperiod.id' => $this->request->data['Host']['notify_period_id'], ], @@ -669,7 +675,7 @@ public function edit($id = null){ ) { foreach ($timeperiodsForChangelog as $timeperiodId => $timeperiodName) { $ext_data_for_changelog['NotifyPeriod'] = [ - 'id' => $timeperiodId, + 'id' => $timeperiodId, 'name' => $timeperiodName, ]; } @@ -677,7 +683,7 @@ public function edit($id = null){ } } if ($this->request->data('Host.check_period_id')) { - if ($timeperiodsForChangelog = $this->Timeperiod->find('list', [ + if ($timeperiodsForChangelog = $this->Timeperiod->find('list',[ 'conditions' => [ 'Timeperiod.id' => $this->request->data['Host']['check_period_id'], ], @@ -685,7 +691,7 @@ public function edit($id = null){ ) { foreach ($timeperiodsForChangelog as $timeperiodId => $timeperiodName) { $ext_data_for_changelog['CheckPeriod'] = [ - 'id' => $timeperiodId, + 'id' => $timeperiodId, 'name' => $timeperiodName, ]; } @@ -693,7 +699,7 @@ public function edit($id = null){ } } if ($this->request->data('Host.hosttemplate_id')) { - if ($hosttemplatesForChangelog = $this->Hosttemplate->find('list', [ + if ($hosttemplatesForChangelog = $this->Hosttemplate->find('list',[ 'conditions' => [ 'Hosttemplate.id' => $this->request->data['Host']['hosttemplate_id'], ], @@ -701,7 +707,7 @@ public function edit($id = null){ ) { foreach ($hosttemplatesForChangelog as $hosttemplateId => $hosttemplateName) { $ext_data_for_changelog['Hosttemplate'] = [ - 'id' => $hosttemplateId, + 'id' => $hosttemplateId, 'name' => $hosttemplateName, ]; } @@ -709,7 +715,7 @@ public function edit($id = null){ } } if ($this->request->data('Host.command_id')) { - if ($commandsForChangelog = $this->Command->find('list', [ + if ($commandsForChangelog = $this->Command->find('list',[ 'conditions' => [ 'Command.id' => $this->request->data['Host']['command_id'], ], @@ -717,7 +723,7 @@ public function edit($id = null){ ) { foreach ($commandsForChangelog as $commandId => $commandName) { $ext_data_for_changelog['CheckCommand'] = [ - 'id' => $commandId, + 'id' => $commandId, 'name' => $commandName, ]; } @@ -725,7 +731,7 @@ public function edit($id = null){ } } if ($this->request->data('Host.Parenthost')) { - if ($hostsForChangelog = $this->Host->find('list', [ + if ($hostsForChangelog = $this->Host->find('list',[ 'conditions' => [ 'Host.id' => $this->request->data['Host']['Parenthost'], ], @@ -733,7 +739,7 @@ public function edit($id = null){ ) { foreach ($hostsForChangelog as $hostId => $hostName) { $ext_data_for_changelog['Parenthost'][] = [ - 'id' => $hostId, + 'id' => $hostId, 'name' => $hostName, ]; } @@ -750,13 +756,13 @@ public function edit($id = null){ if (isset($this->request->data['Host']['hosttemplate_id']) && $this->Hosttemplate->exists($this->request->data['Host']['hosttemplate_id'])) { $hosttemplate = $this->Hosttemplate->findById($this->request->data['Host']['hosttemplate_id']); } - $data_to_save = $this->Host->prepareForSave($this->_diffWithTemplate($this->request->data, $hosttemplate), - $this->request->data, 'edit'); + $data_to_save = $this->Host->prepareForSave($this->_diffWithTemplate($this->request->data,$hosttemplate), + $this->request->data,'edit'); $data_to_save['Host']['own_customvariables'] = 0; //Add Customvariables data to $data_to_save $data_to_save['Customvariable'] = []; if (isset($this->request->data['Customvariable'])) { - $customVariableDiffer = new CustomVariableDiffer($this->request->data['Customvariable'], $hosttemplate['Customvariable']); + $customVariableDiffer = new CustomVariableDiffer($this->request->data['Customvariable'],$hosttemplate['Customvariable']); $customVariablesToSaveRepository = $customVariableDiffer->getCustomVariablesToSaveAsRepository(); $data_to_save['Customvariable'] = $customVariablesToSaveRepository->getAllCustomVariablesAsArray(); if (!empty($data_to_save)) { @@ -771,9 +777,9 @@ public function edit($id = null){ ]); $this->Customvariable->deleteAll([ - 'object_id' => $host['Host']['id'], + 'object_id' => $host['Host']['id'], 'objecttype_id' => OBJECT_HOST, - ], false); + ],false); } @@ -792,84 +798,84 @@ public function edit($id = null){ $this->request->data('Host.container_id'), $userId, $this->request->data['Host']['name'], - array_merge($this->request->data, $ext_data_for_changelog), + array_merge($this->request->data,$ext_data_for_changelog), $host_for_changelog ); if ($changelog_data) { - CakeLog::write('log', serialize($changelog_data)); + CakeLog::write('log',serialize($changelog_data)); } - $this->setFlash(__('Host modified successfully', $host['Host']['id'])); + $this->setFlash(__('Host modified successfully',$host['Host']['id'])); $this->loadModel('Tenant'); //$this->Tenant->hostCounter($this->request->data['Host']['container_id'], '+'); - $redirect = $this->Host->redirect($this->request->params, ['action' => 'index']); + $redirect = $this->Host->redirect($this->request->params,['action' => 'index']); $this->redirect($redirect); } else { - $this->setFlash(__('Data could not be saved'), false); + $this->setFlash(__('Data could not be saved'),false); } } } - public function sharing($id = null){ - $this->set('MY_RIGHTS', $this->MY_RIGHTS); + public function sharing($id = null) { + $this->set('MY_RIGHTS',$this->MY_RIGHTS); $userId = $this->Auth->user('id'); if (!$this->Host->exists($id)) { throw new NotFoundException(__('Invalid host')); } - $host = $this->Host->find('first', [ + $host = $this->Host->find('first',[ 'conditions' => [ 'Host.id' => $id, ], - 'contain' => [ + 'contain' => [ 'Container', ], ]); - $containerIdsToCheck = Hash::extract($host, 'Container.{n}.HostsToContainer.container_id'); + $containerIdsToCheck = Hash::extract($host,'Container.{n}.HostsToContainer.container_id'); $containerIdsToCheck[] = $host['Host']['container_id']; if (!$this->allowedByContainerId($containerIdsToCheck)) { $this->render403(); return; } - $containers = $this->Tree->easyPath($this->MY_RIGHTS, OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); + $containers = $this->Tree->easyPath($this->MY_RIGHTS,OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); - $sharingContainers = array_diff_key($containers, [$host['Host']['container_id'] => $host['Host']['container_id']]); + $sharingContainers = array_diff_key($containers,[$host['Host']['container_id'] => $host['Host']['container_id']]); if ($this->request->is('post') || $this->request->is('put')) { $this->request->data['Container']['Container'][] = $this->request->data['Host']['container_id']; - if ($this->Host->saveAll(Hash::merge($this->request->data, $host))) { + if ($this->Host->saveAll(Hash::merge($this->request->data,$host))) { if ($this->request->ext == 'json') { $this->serializeId(); // REST API ID serialization } else { $this->setFlash(__('Host modified successfully')); - $redirect = $this->Host->redirect($this->request->params, ['action' => 'index']); + $redirect = $this->Host->redirect($this->request->params,['action' => 'index']); $this->redirect($redirect); } } else { if ($this->request->ext == 'json') { $this->serializeErrorMessage(); } else { - $this->setFlash(__('Data could not be saved'), false); + $this->setFlash(__('Data could not be saved'),false); } } } - $this->set(compact(['host', 'containers', 'sharingContainers'])); + $this->set(compact(['host','containers','sharingContainers'])); } - public function edit_details($host_id = null){ - $this->set('MY_RIGHTS', $this->MY_RIGHTS); - $this->set('back_url', $this->referer()); + public function edit_details($host_id = null) { + $this->set('MY_RIGHTS',$this->MY_RIGHTS); + $this->set('back_url',$this->referer()); $containerIds = $this->Tree->resolveChildrenOfContainerIds($this->MY_RIGHTS); - $contacts = $this->Contact->contactsByContainerId($containerIds, 'list', 'id'); - $contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds, 'list', 'id'); + $contacts = $this->Contact->contactsByContainerId($containerIds,'list','id'); + $contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds,'list','id'); if ($this->request->is('post') || $this->request->is('put')) { foreach (func_get_args() as $host_id) { $this->Host->unbindModel([ - 'hasMany' => ['Hostcommandargumentvalue', 'HostescalationHostMembership', 'HostdependencyHostMembership', 'Service', 'Customvariable'], - 'hasAndBelongsToMany' => ['Parenthost', 'Hostgroup'], - 'belongsTo' => ['CheckPeriod', 'NotifyPeriod', 'CheckCommand'], + 'hasMany' => ['Hostcommandargumentvalue','HostescalationHostMembership','HostdependencyHostMembership','Service','Customvariable'], + 'hasAndBelongsToMany' => ['Parenthost','Hostgroup'], + 'belongsTo' => ['CheckPeriod','NotifyPeriod','CheckCommand'], ] ); $data = ['Host' => []]; @@ -891,8 +897,8 @@ public function edit_details($host_id = null){ if ($this->request->data('Host.keep_contacts') == 1) { if (!empty($host['Contact'])) { //Merge exsting contacts with new contacts - $_contacts = Hash::extract($host['Contact'], '{n}.id'); - $_contacts = Hash::merge($_contacts, $this->request->data('Host.Contact')); + $_contacts = Hash::extract($host['Contact'],'{n}.id'); + $_contacts = Hash::merge($_contacts,$this->request->data('Host.Contact')); $_contacts = array_unique($_contacts); } else { // There are no old contacts to overwirte, wo we take the current request data @@ -913,8 +919,8 @@ public function edit_details($host_id = null){ if ($this->request->data('Host.keep_contactgroups') == 1) { if (!empty($host['Contactgroup'])) { //Merge existing contactgroups to new contact groups - $_contactgroups = Hash::extract($host['Contactgroup'], '{n}.id'); - $_contactgroups = Hash::merge($_contactgroups, $this->request->data('Host.Contactgroup')); + $_contactgroups = Hash::extract($host['Contactgroup'],'{n}.id'); + $_contactgroups = Hash::merge($_contactgroups,$this->request->data('Host.Contactgroup')); $_contactgroups = array_unique($_contactgroups); } else { // There are no old contact groups to overwirte, wo we take the current request data @@ -953,11 +959,11 @@ public function edit_details($host_id = null){ if ($this->request->data('Host.keep_tags') == 1) { if (!empty($host['Host']['tags'])) { //Host has tags, lets merge this - $data['Host']['tags'] = implode(',', array_unique(Hash::merge(explode(',', $host['Host']['tags']), explode(',', $data['Host']['tags'])))); + $data['Host']['tags'] = implode(',',array_unique(Hash::merge(explode(',',$host['Host']['tags']),explode(',',$data['Host']['tags'])))); } else { if (!empty($host['Hosttemplate']['tags'])) { //The host has no own tags, lets merge from hosttemplate - $data['Host']['tags'] = implode(',', array_unique(Hash::merge(explode(',', $host['Hosttemplate']['tags']), explode(',', $data['Host']['tags'])))); + $data['Host']['tags'] = implode(',',array_unique(Hash::merge(explode(',',$host['Hosttemplate']['tags']),explode(',',$data['Host']['tags'])))); } } } @@ -971,17 +977,17 @@ public function edit_details($host_id = null){ } } $this->setFlash(__('Host modified successfully')); - $redirect = $this->Host->redirect($this->request->params, ['action' => 'index']); + $redirect = $this->Host->redirect($this->request->params,['action' => 'index']); $this->redirect($redirect); return; } - $this->set(compact(['contacts', 'contactgroups'])); + $this->set(compact(['contacts','contactgroups'])); } - public function add(){ - $this->set('MY_RIGHTS', $this->MY_RIGHTS); + public function add() { + $this->set('MY_RIGHTS',$this->MY_RIGHTS); //Empty variables, get field if Model::save() fails for refill $_hosttemplates = []; $_hostgroups = []; @@ -992,20 +998,20 @@ public function add(){ $userId = $this->Auth->user('id'); - $this->set('back_url', $this->referer()); - $this->Frontend->setJson('lang_minutes', __('minutes')); - $this->Frontend->setJson('lang_seconds', __('seconds')); - $this->Frontend->setJson('lang_and', __('and')); - $this->Frontend->setJson('dns_hostname_lookup_failed', __('Could not resolve hostname')); - $this->Frontend->setJson('dns_ipaddress_lookup_failed', __('Could not reverse lookup your ip address')); - $this->Frontend->setJson('hostname_placeholder', __('Will be auto detected if you enter a ip address')); - $this->Frontend->setJson('address_placeholder', __('Will be auto detected if you enter a FQDN')); + $this->set('back_url',$this->referer()); + $this->Frontend->setJson('lang_minutes',__('minutes')); + $this->Frontend->setJson('lang_seconds',__('seconds')); + $this->Frontend->setJson('lang_and',__('and')); + $this->Frontend->setJson('dns_hostname_lookup_failed',__('Could not resolve hostname')); + $this->Frontend->setJson('dns_ipaddress_lookup_failed',__('Could not reverse lookup your ip address')); + $this->Frontend->setJson('hostname_placeholder',__('Will be auto detected if you enter a ip address')); + $this->Frontend->setJson('address_placeholder',__('Will be auto detected if you enter a FQDN')); // Checking if the user hit submit and a validation error happens, to refill input fields $Customvariable = []; $customFieldsToRefill = [ - 'Host' => [ + 'Host' => [ 'notification_interval', 'notify_on_recovery', 'notify_on_down', @@ -1056,20 +1062,20 @@ public function add(){ $commands = $this->Command->hostCommands('list'); if ($this->hasRootPrivileges === true) { - $containers = $this->Tree->easyPath($this->MY_RIGHTS, OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); + $containers = $this->Tree->easyPath($this->MY_RIGHTS,OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); } else { - $containers = $this->Tree->easyPath($this->getWriteContainers(), OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); + $containers = $this->Tree->easyPath($this->getWriteContainers(),OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); } $masterInstance = $this->Systemsetting->findAsArraySection('FRONTEND')['FRONTEND']['FRONTEND.MASTER_INSTANCE']; - $this->set('back_url', $this->referer()); + $this->set('back_url',$this->referer()); if ($this->request->is('post') || $this->request->is('put')) { $ext_data_for_changelog = []; if ($this->request->data('Host.Contact')) { - if ($contactsForChangelog = $this->Contact->find('list', [ + if ($contactsForChangelog = $this->Contact->find('list',[ 'conditions' => [ 'Contact.id' => $this->request->data['Host']['Contact'], ], @@ -1077,7 +1083,7 @@ public function add(){ ) { foreach ($contactsForChangelog as $contactId => $contactName) { $ext_data_for_changelog['Contact'][] = [ - 'id' => $contactId, + 'id' => $contactId, 'name' => $contactName, ]; } @@ -1085,16 +1091,16 @@ public function add(){ } } if ($this->request->data('Host.Contactgroup')) { - if ($contactgroupsForChangelog = $this->Contactgroup->find('all', [ - 'recursive' => -1, - 'contain' => [ + if ($contactgroupsForChangelog = $this->Contactgroup->find('all',[ + 'recursive' => -1, + 'contain' => [ 'Container' => [ 'fields' => [ 'Container.name', ], ], ], - 'fields' => [ + 'fields' => [ 'Contactgroup.id', ], 'conditions' => [ @@ -1104,7 +1110,7 @@ public function add(){ ) { foreach ($contactgroupsForChangelog as $contactgroupData) { $ext_data_for_changelog['Contactgroup'][] = [ - 'id' => $contactgroupData['Contactgroup']['id'], + 'id' => $contactgroupData['Contactgroup']['id'], 'name' => $contactgroupData['Container']['name'], ]; } @@ -1112,16 +1118,16 @@ public function add(){ } } if ($this->request->data('Host.Hostgroup')) { - if ($hostgroupsForChangelog = $this->Hostgroup->find('all', [ - 'recursive' => -1, - 'contain' => [ + if ($hostgroupsForChangelog = $this->Hostgroup->find('all',[ + 'recursive' => -1, + 'contain' => [ 'Container' => [ 'fields' => [ 'Container.name', ], ], ], - 'fields' => [ + 'fields' => [ 'Hostgroup.id', ], 'conditions' => [ @@ -1131,7 +1137,7 @@ public function add(){ ) { foreach ($hostgroupsForChangelog as $hostgroupData) { $ext_data_for_changelog['Hostgroup'][] = [ - 'id' => $hostgroupData['Hostgroup']['id'], + 'id' => $hostgroupData['Hostgroup']['id'], 'name' => $hostgroupData['Container']['name'], ]; } @@ -1139,7 +1145,7 @@ public function add(){ } } if ($this->request->data('Host.notify_period_id')) { - if ($timeperiodsForChangelog = $this->Timeperiod->find('list', [ + if ($timeperiodsForChangelog = $this->Timeperiod->find('list',[ 'conditions' => [ 'Timeperiod.id' => $this->request->data['Host']['notify_period_id'], ], @@ -1147,7 +1153,7 @@ public function add(){ ) { foreach ($timeperiodsForChangelog as $timeperiodId => $timeperiodName) { $ext_data_for_changelog['NotifyPeriod'] = [ - 'id' => $timeperiodId, + 'id' => $timeperiodId, 'name' => $timeperiodName, ]; } @@ -1155,7 +1161,7 @@ public function add(){ } } if ($this->request->data('Host.check_period_id')) { - if ($timeperiodsForChangelog = $this->Timeperiod->find('list', [ + if ($timeperiodsForChangelog = $this->Timeperiod->find('list',[ 'conditions' => [ 'Timeperiod.id' => $this->request->data['Host']['check_period_id'], ], @@ -1163,7 +1169,7 @@ public function add(){ ) { foreach ($timeperiodsForChangelog as $timeperiodId => $timeperiodName) { $ext_data_for_changelog['CheckPeriod'] = [ - 'id' => $timeperiodId, + 'id' => $timeperiodId, 'name' => $timeperiodName, ]; } @@ -1171,7 +1177,7 @@ public function add(){ } } if ($this->request->data('Host.hosttemplate_id')) { - if ($hosttemplatesForChangelog = $this->Hosttemplate->find('list', [ + if ($hosttemplatesForChangelog = $this->Hosttemplate->find('list',[ 'conditions' => [ 'Hosttemplate.id' => $this->request->data['Host']['hosttemplate_id'], ], @@ -1179,7 +1185,7 @@ public function add(){ ) { foreach ($hosttemplatesForChangelog as $hosttemplateId => $hosttemplateName) { $ext_data_for_changelog['Hosttemplate'] = [ - 'id' => $hosttemplateId, + 'id' => $hosttemplateId, 'name' => $hosttemplateName, ]; } @@ -1187,7 +1193,7 @@ public function add(){ } } if ($this->request->data('Host.command_id')) { - if ($commandsForChangelog = $this->Command->find('list', [ + if ($commandsForChangelog = $this->Command->find('list',[ 'conditions' => [ 'Command.id' => $this->request->data['Host']['command_id'], ], @@ -1195,7 +1201,7 @@ public function add(){ ) { foreach ($commandsForChangelog as $commandId => $commandName) { $ext_data_for_changelog['CheckCommand'] = [ - 'id' => $commandId, + 'id' => $commandId, 'name' => $commandName, ]; } @@ -1203,7 +1209,7 @@ public function add(){ } } if ($this->request->data('Host.Parenthost')) { - if ($hostsForChangelog = $this->Host->find('list', [ + if ($hostsForChangelog = $this->Host->find('list',[ 'conditions' => [ 'Host.id' => $this->request->data['Host']['Parenthost'], ], @@ -1211,7 +1217,7 @@ public function add(){ ) { foreach ($hostsForChangelog as $hostId => $hostName) { $ext_data_for_changelog['Parenthost'][] = [ - 'id' => $hostId, + 'id' => $hostId, 'name' => $hostName, ]; } @@ -1250,10 +1256,10 @@ public function add(){ ) { $hosttemplate = $this->Hosttemplate->findById($this->request->data['Host']['hosttemplate_id']); } - App::uses('UUID', 'Lib'); + App::uses('UUID','Lib'); $data_to_save = $this->Host->prepareForSave( - $this->_diffWithTemplate($this->request->data, $hosttemplate), + $this->_diffWithTemplate($this->request->data,$hosttemplate), $this->request->data, 'add' ); @@ -1261,7 +1267,7 @@ public function add(){ //Add Customvariables data to $data_to_save $data_to_save['Customvariable'] = []; if (isset($this->request->data['Customvariable'])) { - $customVariableDiffer = new CustomVariableDiffer($this->request->data['Customvariable'], $hosttemplate['Customvariable']); + $customVariableDiffer = new CustomVariableDiffer($this->request->data['Customvariable'],$hosttemplate['Customvariable']); $customVariablesToSaveRepository = $customVariableDiffer->getCustomVariablesToSaveAsRepository(); $data_to_save['Customvariable'] = $customVariablesToSaveRepository->getAllCustomVariablesAsArray(); if (!empty($data_to_save)) { @@ -1285,16 +1291,16 @@ public function add(){ $this->request->data('Host.container_id'), $userId, $this->request->data['Host']['name'], - array_merge($this->request->data, $ext_data_for_changelog) + array_merge($this->request->data,$ext_data_for_changelog) ); if ($changelog_data) { - CakeLog::write('log', serialize($changelog_data)); + CakeLog::write('log',serialize($changelog_data)); } if ($this->request->ext == 'json') { $this->serializeId(); // REST API ID serialization } else { - $this->setFlash(__('Host created successfully', $this->Host->id)); + $this->setFlash(__('Host created successfully',$this->Host->id)); $this->loadModel('Tenant'); // $this->Tenant->hostCounter($this->request->data['Host']['container_id'], '+'); $this->redirect(['action' => 'notMonitored']); @@ -1303,35 +1309,35 @@ public function add(){ if ($this->request->ext == 'json') { $this->serializeErrorMessage(); } else { - $this->setFlash(__('Data could not be saved'), false); + $this->setFlash(__('Data could not be saved'),false); } //Refil data that was loaded by ajax due to selected container id if ($this->Container->exists($this->request->data('Host.container_id'))) { $container_id = $this->request->data('Host.container_id'); $containerIds = $this->Tree->resolveChildrenOfContainerIds($container_id); - $_hosttemplates = $this->Hosttemplate->hosttemplatesByContainerId($containerIds, 'list'); - $_hostgroups = $this->Hostgroup->hostgroupsByContainerId($containerIds, 'list', 'id'); - $_parenthosts = $this->Host->hostsByContainerId($containerIds, 'list'); - $_timeperiods = $this->Timeperiod->timeperiodsByContainerId($containerIds, 'list'); - $_contacts = $this->Contact->contactsByContainerId($containerIds, 'list'); - $_contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds, 'list'); + $_hosttemplates = $this->Hosttemplate->hosttemplatesByContainerId($containerIds,'list'); + $_hostgroups = $this->Hostgroup->hostgroupsByContainerId($containerIds,'list','id'); + $_parenthosts = $this->Host->hostsByContainerId($containerIds,'list'); + $_timeperiods = $this->Timeperiod->timeperiodsByContainerId($containerIds,'list'); + $_contacts = $this->Contact->contactsByContainerId($containerIds,'list'); + $_contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds,'list'); } - $this->setFlash(__('Data could not be saved'), false); + $this->setFlash(__('Data could not be saved'),false); } } $sharingContainers = []; //Refil ajax stuff if set or not - $this->set(compact(['_hosttemplates', '_hostgroups', '_parenthosts', '_timeperiods', '_contacts', '_contactgroups', 'commands', 'containers', 'masterInstance', 'Customvariable', 'sharingContainers'])); + $this->set(compact(['_hosttemplates','_hostgroups','_parenthosts','_timeperiods','_contacts','_contactgroups','commands','containers','masterInstance','Customvariable','sharingContainers'])); } - public function getSharingContainers($containerId = null, $jsonOutput = true){ + public function getSharingContainers($containerId = null,$jsonOutput = true) { if ($jsonOutput) { $this->autoRender = false; } - $containers = $this->Tree->easyPath($this->MY_RIGHTS, OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); - $sharingContainers = array_diff_key($containers, [$containerId => $containerId]); + $containers = $this->Tree->easyPath($this->MY_RIGHTS,OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); + $sharingContainers = array_diff_key($containers,[$containerId => $containerId]); if ($jsonOutput) { echo json_encode($sharingContainers); @@ -1341,26 +1347,26 @@ public function getSharingContainers($containerId = null, $jsonOutput = true){ } - public function disabled(){ + public function disabled() { //$this->__unbindAssociations('Service'); if (!isset($this->request->params['named']['BrowserContainerId'])) { $conditions = [ - 'Host.disabled' => 1, + 'Host.disabled' => 1, 'HostsToContainers.container_id' => $this->MY_RIGHTS, ]; } - $conditions = $this->ListFilter->buildConditions([], $conditions); + $conditions = $this->ListFilter->buildConditions([],$conditions); $query = [ - 'recurisve' => -1, + 'recurisve' => -1, 'conditions' => [ $conditions, ], - 'contain' => [ + 'contain' => [ 'Hosttemplate', 'Container', ], //'contain' => [], - 'fields' => [ + 'fields' => [ 'Host.id', 'Host.uuid', 'Host.name', @@ -1371,26 +1377,26 @@ public function disabled(){ 'Hosttemplate.name', ], - 'joins' => [ + 'joins' => [ [ - 'table' => 'hosts_to_containers', - 'alias' => 'HostsToContainers', - 'type' => 'LEFT', + 'table' => 'hosts_to_containers', + 'alias' => 'HostsToContainers', + 'type' => 'LEFT', 'conditions' => [ 'HostsToContainers.host_id = Host.id', ], ], ], - 'order' => ['Host.name' => 'asc'], - 'group' => [ + 'order' => ['Host.name' => 'asc'], + 'group' => [ 'Host.id', ], ]; if ($this->isApiRequest()) { - $disabledHosts = $this->Host->find('all', $query); + $disabledHosts = $this->Host->find('all',$query); } else { - $this->Paginator->settings = array_merge($this->Paginator->settings, $query); + $this->Paginator->settings = array_merge($this->Paginator->settings,$query); $disabledHosts = $this->Paginator->paginate(); } @@ -1405,19 +1411,19 @@ public function disabled(){ $deletedHostCount = $this->DeletedHost->find('count');*/ $this->set(compact(['disabledHosts'])); - $this->set('_serialize', ['disabledHosts']); + $this->set('_serialize',['disabledHosts']); } - public function deactivate($id = null, $return = false){ + public function deactivate($id = null,$return = false) { if (!$this->Host->exists($id)) { throw new NotFoundException(__('Invalid host')); } $this->__unbindAssociations('Host'); - if ($this->Host->updateAll(['Host.disabled' => 1], ['Host.id' => $id])) { + if ($this->Host->updateAll(['Host.disabled' => 1],['Host.id' => $id])) { $this->loadModel('Service'); $this->__unbindAssociations('Service'); - if ($this->Service->updateAll(['Service.disabled' => 1], ['Service.host_id' => $id])) { + if ($this->Service->updateAll(['Service.disabled' => 1],['Service.host_id' => $id])) { if ($return === false) { $this->setFlash(__('Host disabled')); $this->redirect(['action' => 'index']); @@ -1426,8 +1432,8 @@ public function deactivate($id = null, $return = false){ return true; } else { if ($return === false) { - $this->setFlash(__('Could not disable services from host'), false); - $this->Host->updateAll(['Host.disabled' => 0], ['Host.id' => $id]); + $this->setFlash(__('Could not disable services from host'),false); + $this->Host->updateAll(['Host.disabled' => 0],['Host.id' => $id]); $this->redirect(['action' => 'index']); } @@ -1436,27 +1442,27 @@ public function deactivate($id = null, $return = false){ } if ($return === false) { - $this->setFlash(__('Could not disable host'), false); + $this->setFlash(__('Could not disable host'),false); $this->redirect(['action' => 'index']); } return false; } - public function mass_deactivate($id = null){ + public function mass_deactivate($id = null) { $flash = ''; foreach (func_get_args() as $host_id) { $host = $this->Host->findById($host_id); if (!empty($host)) { $this->__unbindAssociations('Host'); - if ($this->Host->updateAll(['Host.disabled' => 1], ['Host.id' => $host['Host']['id']])) { + if ($this->Host->updateAll(['Host.disabled' => 1],['Host.id' => $host['Host']['id']])) { $this->loadModel('Service'); $this->__unbindAssociations('Service'); - if ($this->Service->updateAll(['Service.disabled' => 1], ['Service.host_id' => $host['Host']['id']])) { + if ($this->Service->updateAll(['Service.disabled' => 1],['Service.host_id' => $host['Host']['id']])) { $flash .= __('Host ' . h($host['Host']['name']) . ' disabled successfully
'); } else { $flash .= __('Services of Host ' . h($host['Host']['name']) . ' could not disabled successfully
'); - $this->Host->updateAll(['Host.disabled' => 0], ['Host.id' => $host['Host']['id']]); + $this->Host->updateAll(['Host.disabled' => 0],['Host.id' => $host['Host']['id']]); } } } @@ -1466,29 +1472,29 @@ public function mass_deactivate($id = null){ } - public function enable($id = null){ + public function enable($id = null) { if (!$this->Host->exists($id)) { throw new NotFoundException(__('Invalid host')); } $this->__unbindAssociations('Host'); - if ($this->Host->updateAll(['Host.disabled' => 0], ['Host.id' => $id])) { + if ($this->Host->updateAll(['Host.disabled' => 0],['Host.id' => $id])) { $this->loadModel('Service'); $this->__unbindAssociations('Service'); - if ($this->Service->updateAll(['Service.disabled' => 0], ['Service.host_id' => $id])) { + if ($this->Service->updateAll(['Service.disabled' => 0],['Service.host_id' => $id])) { $this->setFlash(__('Host enabled')); $this->redirect(['action' => 'index']); } else { - $this->setFlash(__('Could not enable services from host'), false); - $this->Host->updateAll(['Host.disabled' => 0], ['Host.id' => $id]); + $this->setFlash(__('Could not enable services from host'),false); + $this->Host->updateAll(['Host.disabled' => 0],['Host.id' => $id]); $this->redirect(['action' => 'index']); } } - $this->setFlash(__('Could not enable host'), false); + $this->setFlash(__('Could not enable host'),false); $this->redirect(['action' => 'index']); } - public function delete($id = null){ + public function delete($id = null) { if (!$this->Host->exists($id)) { throw new NotFoundException(__('Invalid host')); } @@ -1499,7 +1505,7 @@ public function delete($id = null){ $host = $this->Host->findById($id); - $containerIdsToCheck = Hash::extract($host, 'Container.{n}.HostsToContainer.container_id'); + $containerIdsToCheck = Hash::extract($host,'Container.{n}.HostsToContainer.container_id'); $containerIdsToCheck[] = $host['Host']['container_id']; if (!$this->allowedByContainerId($containerIdsToCheck)) { $this->render403(); @@ -1507,15 +1513,15 @@ public function delete($id = null){ return; } - if ($this->Host->__delete($host, $this->Auth->user('id'))) { - $this->Flash->success('Host deleted', [ + if ($this->Host->__delete($host,$this->Auth->user('id'))) { + $this->Flash->success('Host deleted',[ 'key' => 'positive', ]); $this->redirect(['action' => 'index']); } - $this->Flash->error('Could not delete host', [ - 'key' => 'positive', + $this->Flash->error('Could not delete host',[ + 'key' => 'positive', 'params' => [ 'usedBy' => $this->Host->usedBy, ] @@ -1528,13 +1534,13 @@ public function delete($id = null){ * Call: mass_delete(1,5,10,15); * Or as HTML URL: /hosts/mass_delete/3/6/5/4/8/2/1/9 */ - public function mass_delete($id = null){ + public function mass_delete($id = null) { $msgCollect = []; foreach (func_get_args() as $host_id) { if ($this->Host->exists($host_id)) { $host = $this->Host->findById($host_id); - $containerIdsToCheck = Hash::extract($host, 'Container.{n}.HostsToContainer.container_id'); + $containerIdsToCheck = Hash::extract($host,'Container.{n}.HostsToContainer.container_id'); $containerIdsToCheck[] = $host['Host']['container_id']; if (!$this->allowedByContainerId($containerIdsToCheck)) { $this->render403(); @@ -1542,16 +1548,16 @@ public function mass_delete($id = null){ return; } - if (!$this->Host->__delete($host, $this->Auth->user('id'))) { + if (!$this->Host->__delete($host,$this->Auth->user('id'))) { $msgCollect[] = $this->Host->usedBy; } } } if (!empty($msgCollect)) { - $messages = call_user_func_array('array_merge_recursive', $msgCollect); - $this->Flash->error('Could not delete host', [ - 'key' => 'positive', + $messages = call_user_func_array('array_merge_recursive',$msgCollect); + $this->Flash->error('Could not delete host',[ + 'key' => 'positive', 'params' => [ 'usedBy' => $messages, ] @@ -1559,28 +1565,28 @@ public function mass_delete($id = null){ $this->redirect(['action' => 'index']); } - $this->Flash->success('Host deleted', [ + $this->Flash->success('Host deleted',[ 'key' => 'positive', ]); $this->redirect(['action' => 'index']); } - public function copy($id = null){ + public function copy($id = null) { $userId = $this->Auth->user('id'); $validationErrors = []; if ($this->request->is('post') || $this->request->is('put')) { $validationError = false; $dataToSaveArray = []; $this->loadModel('Hosttemplate'); - App::uses('UUID', 'Lib'); + App::uses('UUID','Lib'); //We want to save/validate the data and save it foreach ($this->request->data['Host'] as $key => $host2copy) { if (!$this->Host->exists($host2copy)) { continue; } - $sourceHost = $this->Host->find('first', [ - 'recursive' => -1, - 'fields' => [ + $sourceHost = $this->Host->find('first',[ + 'recursive' => -1, + 'fields' => [ 'Host.name', 'Host.hosttemplate_id', 'Host.container_id', @@ -1615,45 +1621,45 @@ public function copy($id = null){ 'Host.own_customvariables', 'Host.satellite_id' ], - 'contain' => [ - 'Parenthost' => [ + 'contain' => [ + 'Parenthost' => [ 'fields' => [ 'id', 'name', ], ], - 'Container' => [ + 'Container' => [ 'fields' => [ 'id', 'name', ], ], - 'CheckPeriod' => [ + 'CheckPeriod' => [ 'fields' => [ 'CheckPeriod.id', 'CheckPeriod.name' ] ], - 'NotifyPeriod' => [ + 'NotifyPeriod' => [ 'fields' => [ 'NotifyPeriod.id', 'NotifyPeriod.name' ] ], - 'CheckCommand' => [ + 'CheckCommand' => [ 'fields' => [ 'CheckCommand.id', 'CheckCommand.name', ] ], - 'Contact' => [ + 'Contact' => [ 'fields' => [ 'Contact.id', 'Contact.name' ], ], - 'Contactgroup' => [ - 'fields' => [ + 'Contactgroup' => [ + 'fields' => [ 'Contactgroup.id', ], 'Container' => [ @@ -1668,15 +1674,15 @@ public function copy($id = null){ 'value', ], ], - 'Customvariable' => [ + 'Customvariable' => [ 'fields' => [ 'name', 'value', 'objecttype_id' ], ], - 'Hostgroup' => [ - 'fields' => [ + 'Hostgroup' => [ + 'fields' => [ 'Hostgroup.id', ], 'Container' => [ @@ -1691,49 +1697,49 @@ public function copy($id = null){ ], ]); - $hosttemplate = $this->Hosttemplate->find('first', [ - 'recursive' => -1, - 'contain' => [ - 'Customvariable' => [ + $hosttemplate = $this->Hosttemplate->find('first',[ + 'recursive' => -1, + 'contain' => [ + 'Customvariable' => [ 'fields' => [ 'name', 'value', ], ], - 'CheckPeriod' => [ + 'CheckPeriod' => [ 'fields' => [ 'CheckPeriod.id', 'CheckPeriod.name' ] ], - 'NotifyPeriod' => [ + 'NotifyPeriod' => [ 'fields' => [ 'NotifyPeriod.id', 'NotifyPeriod.name' ] ], - 'CheckCommand' => [ + 'CheckCommand' => [ 'fields' => [ 'CheckCommand.id', 'CheckCommand.name', ] ], - 'Contact' => [ + 'Contact' => [ 'fields' => [ 'id', 'name', ], ], - 'Contactgroup' => [ - 'fields' => ['id'], + 'Contactgroup' => [ + 'fields' => ['id'], 'Container' => [ 'fields' => [ 'name', ], ], ], - 'Hostgroup' => [ - 'fields' => ['id'], + 'Hostgroup' => [ + 'fields' => ['id'], 'Container' => [ 'fields' => [ 'name', @@ -1752,46 +1758,46 @@ public function copy($id = null){ ] ]); - $sourceHost = Hash::remove($sourceHost, 'Host.id'); - $sourceHost = Hash::remove($sourceHost, '{s}.{n}.{s}.host_id'); + $sourceHost = Hash::remove($sourceHost,'Host.id'); + $sourceHost = Hash::remove($sourceHost,'{s}.{n}.{s}.host_id'); - $contactIds = (!empty($sourceHost['Contact'])) ? Hash::extract($sourceHost['Contact'], '{n}.id') : []; - $contactgroupIds = (!empty($sourceHost['Contactgroup'])) ? Hash::extract($sourceHost['Contactgroup'], '{n}.id') : []; - $hostgroupIds = (!empty($sourceHost['Hostgroup'])) ? Hash::extract($sourceHost['Hostgroup'], '{n}.id') : []; - $customVariables = (!empty($sourceHost['Customvariable']) && !is_null($sourceHost['Customvariable'])) ? Hash::remove($sourceHost['Customvariable'], '{n}.object_id') : []; - $parentHostIds = (!empty($sourceHost['Parenthost'])) ? Hash::extract($sourceHost['Parenthost'], '{n}.id') : []; - $containerIds = (!empty($sourceHost['Container'])) ? Hash::extract($sourceHost['Container'], '{n}.id') : []; + $contactIds = (!empty($sourceHost['Contact'])) ? Hash::extract($sourceHost['Contact'],'{n}.id') : []; + $contactgroupIds = (!empty($sourceHost['Contactgroup'])) ? Hash::extract($sourceHost['Contactgroup'],'{n}.id') : []; + $hostgroupIds = (!empty($sourceHost['Hostgroup'])) ? Hash::extract($sourceHost['Hostgroup'],'{n}.id') : []; + $customVariables = (!empty($sourceHost['Customvariable']) && !is_null($sourceHost['Customvariable'])) ? Hash::remove($sourceHost['Customvariable'],'{n}.object_id') : []; + $parentHostIds = (!empty($sourceHost['Parenthost'])) ? Hash::extract($sourceHost['Parenthost'],'{n}.id') : []; + $containerIds = (!empty($sourceHost['Container'])) ? Hash::extract($sourceHost['Container'],'{n}.id') : []; $newHostData = [ - 'Host' => Hash::merge( - $sourceHost['Host'], [ - 'uuid' => UUID::v4(), - 'name' => $host2copy['name'], - 'description' => $host2copy['description'], - 'host_url' => $host2copy['host_url'], - 'address' => $host2copy['address'], - 'Contact' => $contactIds, + 'Host' => Hash::merge( + $sourceHost['Host'],[ + 'uuid' => UUID::v4(), + 'name' => $host2copy['name'], + 'description' => $host2copy['description'], + 'host_url' => $host2copy['host_url'], + 'address' => $host2copy['address'], + 'Contact' => $contactIds, 'Contactgroup' => $contactgroupIds, - 'Hostgroup' => $hostgroupIds, + 'Hostgroup' => $hostgroupIds, ]), - 'Contact' => ['Contact' => $contactIds], - 'Contactgroup' => ['Contactgroup' => $contactgroupIds], - 'Hostgroup' => ['Hostgroup' => $hostgroupIds], - 'Container' => ['Container' => $containerIds], - 'Customvariable' => $customVariables, - 'Hostcommandargumentvalue' => (!empty($sourceHost['Hostcommandargumentvalue'])) ? Hash::remove($sourceHost['Hostcommandargumentvalue'], '{n}.host_id') : [], - 'Parenthost' => ['Parenthost' => $parentHostIds] + 'Contact' => ['Contact' => $contactIds], + 'Contactgroup' => ['Contactgroup' => $contactgroupIds], + 'Hostgroup' => ['Hostgroup' => $hostgroupIds], + 'Container' => ['Container' => $containerIds], + 'Customvariable' => $customVariables, + 'Hostcommandargumentvalue' => (!empty($sourceHost['Hostcommandargumentvalue'])) ? Hash::remove($sourceHost['Hostcommandargumentvalue'],'{n}.host_id') : [], + 'Parenthost' => ['Parenthost' => $parentHostIds] ]; /* Data for Changelog Start*/ $sourceHost['Customvariable'] = $customVariables; - $hosttemplate['Customvariable'] = (!empty($sourceHost['Customvariable']) && !is_null($sourceHost['Customvariable'])) ? Hash::remove($sourceHost['Customvariable'], '{n}.object_id') : [];; + $hosttemplate['Customvariable'] = (!empty($sourceHost['Customvariable']) && !is_null($sourceHost['Customvariable'])) ? Hash::remove($sourceHost['Customvariable'],'{n}.object_id') : [];; if (!empty($sourceHost['Parenthost'])) { $parenthosts = []; foreach ($sourceHost['Parenthost'] as $parenthost) { $parenthosts[] = [ - 'id' => $parenthost['id'], + 'id' => $parenthost['id'], 'name' => $parenthost['name'] ]; } @@ -1801,16 +1807,16 @@ public function copy($id = null){ $contactgroups = []; foreach ($sourceHost['Contactgroup'] as $contactgroup) { $contactgroups[] = [ - 'id' => $contactgroup['id'], + 'id' => $contactgroup['id'], 'name' => $contactgroup['Container']['name'] ]; } $sourceHost['Contactgroup'] = $contactgroups; - } elseif (empty($sourceHost['Contactgroup']) && !empty($hosttemplate['Contactgroup'])) { + } else if (empty($sourceHost['Contactgroup']) && !empty($hosttemplate['Contactgroup'])) { $contactgroups = []; foreach ($hosttemplate['Contactgroup'] as $contactgroup) { $contactgroups[] = [ - 'id' => $contactgroup['id'], + 'id' => $contactgroup['id'], 'name' => $contactgroup['Container']['name'] ]; } @@ -1821,16 +1827,16 @@ public function copy($id = null){ $hostgroups = []; foreach ($sourceHost['Hostgroup'] as $hostgroup) { $hostgroups[] = [ - 'id' => $hostgroup['id'], + 'id' => $hostgroup['id'], 'name' => $hostgroup['Container']['name'] ]; } $sourceHost['Hostgroup'] = $hostgroups; - } elseif (empty($sourceHost['Hostgroup']) && !empty($hosttemplate['Hostgroup'])) { + } else if (empty($sourceHost['Hostgroup']) && !empty($hosttemplate['Hostgroup'])) { $hostgroups = []; foreach ($hosttemplate['Hostgroup'] as $hostgroup) { $hostgroups[] = [ - 'id' => $hostgroup['id'], + 'id' => $hostgroup['id'], 'name' => $hostgroup['Container']['name'] ]; } @@ -1842,7 +1848,7 @@ public function copy($id = null){ if ($this->Host->validates()) { $dataToSaveArray[$host2copy['source']] = $newHostData; $dataForChangeLog[$host2copy['source']] = [ - 'Host' => $sourceHost, + 'Host' => $sourceHost, 'Hosttemplate' => $hosttemplate ]; } else { @@ -1859,7 +1865,7 @@ public function copy($id = null){ foreach ($dataToSaveArray as $sourceHostId => $data) { $this->Host->create(); if ($this->Host->saveAll($data)) { - $hostDataAfterSave = $this->Host->dataForChangelogCopy($dataForChangeLog[$sourceHostId]['Host'], $dataForChangeLog[$sourceHostId]['Hosttemplate']); + $hostDataAfterSave = $this->Host->dataForChangelogCopy($dataForChangeLog[$sourceHostId]['Host'],$dataForChangeLog[$sourceHostId]['Hosttemplate']); $changelog_data = $this->Changelog->parseDataForChangelog( $this->params['action'], $this->params['controller'], @@ -1871,12 +1877,12 @@ public function copy($id = null){ $hostDataAfterSave ); if ($changelog_data) { - CakeLog::write('log', serialize($changelog_data)); + CakeLog::write('log',serialize($changelog_data)); } $hostId = $this->Host->id; - $services = $this->Service->find('all', [ - 'recursive' => -1, - 'fields' => [ + $services = $this->Service->find('all',[ + 'recursive' => -1, + 'fields' => [ 'Service.name', 'Service.servicetemplate_id', 'Service.check_period_id', @@ -1913,33 +1919,33 @@ public function copy($id = null){ 'Service.own_contactgroups', 'Service.own_customvariables', ], - 'contain' => [ - 'CheckPeriod' => [ + 'contain' => [ + 'CheckPeriod' => [ 'fields' => [ 'CheckPeriod.id', 'CheckPeriod.name' ] ], - 'NotifyPeriod' => [ + 'NotifyPeriod' => [ 'fields' => [ 'NotifyPeriod.id', 'NotifyPeriod.name' ] ], - 'CheckCommand' => [ + 'CheckCommand' => [ 'fields' => [ 'CheckCommand.id', 'CheckCommand.name', ] ], - 'Contact' => [ + 'Contact' => [ 'fields' => [ 'Contact.id', 'Contact.name' ], ], - 'Contactgroup' => [ - 'fields' => [ + 'Contactgroup' => [ + 'fields' => [ 'Contactgroup.id', ], 'Container' => [ @@ -1948,25 +1954,25 @@ public function copy($id = null){ ] ] ], - 'Servicecommandargumentvalue' => [ + 'Servicecommandargumentvalue' => [ 'fields' => [ - 'commandargument_id', 'value', + 'commandargument_id','value', ], ], 'Serviceeventcommandargumentvalue' => [ 'fields' => [ - 'commandargument_id', 'value', + 'commandargument_id','value', ], ], - 'Customvariable' => [ + 'Customvariable' => [ 'fields' => [ 'name', 'value', 'objecttype_id' ], ], - 'Servicegroup' => [ - 'fields' => [ + 'Servicegroup' => [ + 'fields' => [ 'Servicegroup.id', ], 'Container' => [ @@ -1977,7 +1983,7 @@ public function copy($id = null){ ], ], 'conditions' => [ - 'Service.host_id' => $sourceHostId, + 'Service.host_id' => $sourceHostId, 'Service.service_type' => $this->Service->serviceTypes('copy'), ], ]); @@ -1988,9 +1994,9 @@ public function copy($id = null){ if (isset($servicetemplates[$service['Service']['servicetemplate_id']])) { $servicetemplate = $servicetemplates[$service['Service']['servicetemplate_id']]; } else { - $servicetemplates[$service['Service']['servicetemplate_id']] = $this->Servicetemplate->find('first', [ - 'recursive' => -1, - 'fields' => [ + $servicetemplates[$service['Service']['servicetemplate_id']] = $this->Servicetemplate->find('first',[ + 'recursive' => -1, + 'fields' => [ 'Servicetemplate.template_name', 'Servicetemplate.name', 'Servicetemplate.check_period_id', @@ -2024,33 +2030,33 @@ public function copy($id = null){ 'Servicetemplate.is_volatile', 'Servicetemplate.check_freshness', ], - 'contain' => [ - 'CheckPeriod' => [ + 'contain' => [ + 'CheckPeriod' => [ 'fields' => [ 'CheckPeriod.id', 'CheckPeriod.name' ] ], - 'NotifyPeriod' => [ + 'NotifyPeriod' => [ 'fields' => [ 'NotifyPeriod.id', 'NotifyPeriod.name' ] ], - 'CheckCommand' => [ + 'CheckCommand' => [ 'fields' => [ 'CheckCommand.id', 'CheckCommand.name', ] ], - 'Contact' => [ + 'Contact' => [ 'fields' => [ 'Contact.id', 'Contact.name' ], ], - 'Contactgroup' => [ - 'fields' => [ + 'Contactgroup' => [ + 'fields' => [ 'Contactgroup.id', ], 'Container' => [ @@ -2059,8 +2065,8 @@ public function copy($id = null){ ] ] ], - 'Servicegroup' => [ - 'fields' => [ + 'Servicegroup' => [ + 'fields' => [ 'Servicegroup.id', ], 'Container' => [ @@ -2069,7 +2075,7 @@ public function copy($id = null){ ] ] ], - 'Servicetemplatecommandargumentvalue' => [ + 'Servicetemplatecommandargumentvalue' => [ 'fields' => [ 'id', 'commandargument_id', @@ -2083,9 +2089,9 @@ public function copy($id = null){ 'value', ], ], - 'Customvariable' => [ + 'Customvariable' => [ 'fields' => [ - 'name', 'value', + 'name','value', ], ], ], @@ -2096,48 +2102,48 @@ public function copy($id = null){ ); $servicetemplate = $servicetemplates[$service['Service']['servicetemplate_id']]; } - $service = Hash::remove($service, 'Service.id'); - $service = Hash::remove($service, '{s}.{n}.{s}.service_id'); - $contactIds = (!empty($service['Contact'])) ? Hash::extract($service['Contact'], '{n}.id') : []; - $contactgroupIds = (!empty($service['Contactgroup'])) ? Hash::extract($service['Contactgroup'], '{n}.id') : []; - $servicegroupIds = (!empty($service['Servicegroup'])) ? Hash::extract($service['Servicegroup'], '{n}.id') : []; - $customVariables = (!empty($service['Customvariable'])) ? Hash::remove($service['Customvariable'], '{n}.object_id') : []; + $service = Hash::remove($service,'Service.id'); + $service = Hash::remove($service,'{s}.{n}.{s}.service_id'); + $contactIds = (!empty($service['Contact'])) ? Hash::extract($service['Contact'],'{n}.id') : []; + $contactgroupIds = (!empty($service['Contactgroup'])) ? Hash::extract($service['Contactgroup'],'{n}.id') : []; + $servicegroupIds = (!empty($service['Servicegroup'])) ? Hash::extract($service['Servicegroup'],'{n}.id') : []; + $customVariables = (!empty($service['Customvariable'])) ? Hash::remove($service['Customvariable'],'{n}.object_id') : []; $newServiceData = [ - 'Service' => Hash::merge( - $service['Service'], [ - 'uuid' => UUID::v4(), - 'host_id' => $hostId, - 'Contact' => $contactIds, + 'Service' => Hash::merge( + $service['Service'],[ + 'uuid' => UUID::v4(), + 'host_id' => $hostId, + 'Contact' => $contactIds, 'Contactgroup' => $contactgroupIds, 'Servicegroup' => $servicegroupIds ]), - 'Contact' => ['Contact' => $contactIds], - 'Contactgroup' => ['Contactgroup' => $contactgroupIds], - 'Servicegroup' => ['Servicegroup' => $servicegroupIds], - 'Customvariable' => $customVariables, - 'Servicecommandargumentvalue' => (!empty($service['Servicecommandargumentvalue'])) ? Hash::remove($service['Servicecommandargumentvalue'], '{n}.service_id') : [], - 'Serviceeventcommandargumentvalue' => (!empty($service['Serviceeventcommandargumentvalue'])) ? Hash::remove($service['Serviceeventcommandargumentvalue'], '{n}.service_id') : [], + 'Contact' => ['Contact' => $contactIds], + 'Contactgroup' => ['Contactgroup' => $contactgroupIds], + 'Servicegroup' => ['Servicegroup' => $servicegroupIds], + 'Customvariable' => $customVariables, + 'Servicecommandargumentvalue' => (!empty($service['Servicecommandargumentvalue'])) ? Hash::remove($service['Servicecommandargumentvalue'],'{n}.service_id') : [], + 'Serviceeventcommandargumentvalue' => (!empty($service['Serviceeventcommandargumentvalue'])) ? Hash::remove($service['Serviceeventcommandargumentvalue'],'{n}.service_id') : [], ]; /* Data for Changelog Start*/ - $service['Host'] = ['id' => $hostId, 'name' => $data['Host']['name']]; + $service['Host'] = ['id' => $hostId,'name' => $data['Host']['name']]; $service['Customvariable'] = $customVariables; - $servicetemplate['Customvariable'] = (!empty($service['Customvariable']) && !is_null($service['Customvariable'])) ? Hash::remove($service['Customvariable'], '{n}.object_id') : [];; + $servicetemplate['Customvariable'] = (!empty($service['Customvariable']) && !is_null($service['Customvariable'])) ? Hash::remove($service['Customvariable'],'{n}.object_id') : [];; if (!empty($service['Contactgroup'])) { $contactgroups = []; foreach ($service['Contactgroup'] as $contactgroup) { $contactgroups[] = [ - 'id' => $contactgroup['id'], + 'id' => $contactgroup['id'], 'name' => $contactgroup['Container']['name'] ]; } $service['Contactgroup'] = $contactgroups; - } elseif (empty($service['Contactgroup']) && !empty($servicetemplate['Contactgroup'])) { + } else if (empty($service['Contactgroup']) && !empty($servicetemplate['Contactgroup'])) { $contactgroups = []; foreach ($servicetemplate['Contactgroup'] as $contactgroup) { $contactgroups[] = [ - 'id' => $contactgroup['id'], + 'id' => $contactgroup['id'], 'name' => $contactgroup['Container']['name'] ]; } @@ -2148,16 +2154,16 @@ public function copy($id = null){ $servicegroups = []; foreach ($service['Servicegroup'] as $servicegroup) { $servicegroups[] = [ - 'id' => $servicegroup['id'], + 'id' => $servicegroup['id'], 'name' => $servicegroup['Container']['name'] ]; } $service['Servicegroup'] = $servicegroups; - } elseif (empty($service['Servicegroup']) && !empty($servicetemplate['Servicegroup'])) { + } else if (empty($service['Servicegroup']) && !empty($servicetemplate['Servicegroup'])) { $servicegroups = []; foreach ($servicetemplate['Servicegroup'] as $servicegroup) { $servicegroups[] = [ - 'id' => $servicegroup['id'], + 'id' => $servicegroup['id'], 'name' => $servicegroup['Container']['name'] ]; } @@ -2166,7 +2172,7 @@ public function copy($id = null){ /* Data for Changelog End*/ $this->Service->create(); if ($this->Service->saveAll($newServiceData)) { - $serviceDataAfterSave = $this->Service->dataForChangelogCopy($service, $servicetemplate); + $serviceDataAfterSave = $this->Service->dataForChangelogCopy($service,$servicetemplate); $changelog_data = $this->Changelog->parseDataForChangelog( $this->params['action'], 'services', @@ -2178,19 +2184,19 @@ public function copy($id = null){ $serviceDataAfterSave ); if ($changelog_data) { - CakeLog::write('log', serialize($changelog_data)); + CakeLog::write('log',serialize($changelog_data)); } } } } } $this->setFlash(__('Host copied successfully')); - $redirect = $this->Host->redirect($this->request->params, ['action' => 'index']); + $redirect = $this->Host->redirect($this->request->params,['action' => 'index']); $this->redirect($redirect); } else { if (isset($validationErrors['Host'])) { $this->Host->validationErrors = $validationErrors['Host']; - $this->setFlash(__('Could not copy host/s'), false); + $this->setFlash(__('Could not copy host/s'),false); /* For multiple "line" validation errors the array we gibe the view needs to look like this: array( @@ -2222,18 +2228,18 @@ public function copy($id = null){ } } $this->set(compact(['hosts'])); - $this->set('back_url', $this->referer()); + $this->set('back_url',$this->referer()); } - public function browser($id = null){ + public function browser($id = null) { if (!$this->Host->exists($id)) { throw new NotFoundException(__('Invalid host')); } - $host = $this->Host->find('first', [ - 'recursive' => -1, - 'contain' => [ + $host = $this->Host->find('first',[ + 'recursive' => -1, + 'contain' => [ 'Parenthost' => [ 'fields' => [ 'uuid', @@ -2247,21 +2253,21 @@ public function browser($id = null){ ]); $hoststatus = $this->Hoststatus->byUuid($host['Host']['uuid']); $parenthosts = $host['Parenthost']; - $parentHostStatus = $this->Hoststatus->byUuid(Hash::extract($host['Parenthost'], '{n}.uuid'), [ + $parentHostStatus = $this->Hoststatus->byUuid(Hash::extract($host['Parenthost'],'{n}.uuid'),[ 'conditions' => [ 'Hoststatus.current_state > 0' ] ]); $browseByUUID = false; $conditionsToFind = ['Host.id' => $id]; - if (preg_match('/\-/', $id)) { + if (preg_match('/\-/',$id)) { $browseByUUID = true; $conditionsToFind = ['Host.uuid' => $id]; } - $_host = $this->Host->find('first', [ + $_host = $this->Host->find('first',[ 'conditions' => $conditionsToFind, - 'contain' => [ + 'contain' => [ 'Contactgroup' => [ 'Container', ], @@ -2284,11 +2290,11 @@ public function browser($id = null){ $host = $this->Host->prepareForView($id); - $containerIdsToCheck = Hash::extract($_host, 'Container.{n}.HostsToContainer.container_id'); + $containerIdsToCheck = Hash::extract($_host,'Container.{n}.HostsToContainer.container_id'); $containerIdsToCheck[] = $_host['Host']['container_id']; //Check if user is permitted to see this object - if (!$this->allowedByContainerId($containerIdsToCheck, false)) { + if (!$this->allowedByContainerId($containerIdsToCheck,false)) { $this->render403(); return; @@ -2300,12 +2306,12 @@ public function browser($id = null){ $allowEdit = true; } - $services = $this->Service->find('all', [ - 'recursive' => -1, + $services = $this->Service->find('all',[ + 'recursive' => -1, 'conditions' => [ 'Service.host_id' => $id, ], - 'fields' => [ + 'fields' => [ 'Service.id', 'Service.uuid', 'Service.name', @@ -2315,11 +2321,11 @@ public function browser($id = null){ 'Service.active_checks_enabled', 'Host.uuid', ], - 'contain' => [ + 'contain' => [ 'Host', 'Servicetemplate', ], - 'order' => 'Service.name', + 'order' => 'Service.name', ]); @@ -2327,29 +2333,29 @@ public function browser($id = null){ if (!empty($_host['Hostcommandargumentvalue'])) { //The service has own command argument values $_commandarguments = $this->Hostcommandargumentvalue->findAllByHostId($_host['Host']['id']); - $_commandarguments = Hash::sort($_commandarguments, '{n}.Commandargument.name', 'asc', 'natural'); + $_commandarguments = Hash::sort($_commandarguments,'{n}.Commandargument.name','asc','natural'); foreach ($_commandarguments as $commandargument) { $commandarguments[$commandargument['Commandargument']['name']] = $commandargument['Hostcommandargumentvalue']['value']; } } else { //The service command arguments are from the template $_commandarguments = $this->Hosttemplatecommandargumentvalue->findAllByHosttemplateId($host['Hosttemplate']['id']); - $_commandarguments = Hash::sort($_commandarguments, '{n}.Commandargument.name', 'asc', 'natural'); + $_commandarguments = Hash::sort($_commandarguments,'{n}.Commandargument.name','asc','natural'); foreach ($_commandarguments as $commandargument) { $commandarguments[$commandargument['Commandargument']['name']] = $commandargument['Hosttemplatecommandargumentvalue']['value']; } } - $ContactsInherited = $this->__inheritContactsAndContactgroups($host, $_host); + $ContactsInherited = $this->__inheritContactsAndContactgroups($host,$_host); $parenthosts = []; if (!empty($host['Parenthost'])) { - $parenthosts = $this->Host->find('all', [ - 'recursive' => -1, + $parenthosts = $this->Host->find('all',[ + 'recursive' => -1, 'conditions' => [ 'Host.id' => $host['Parenthost'], ], - 'fields' => [ + 'fields' => [ 'Host.id', 'Host.uuid', 'Host.name', @@ -2363,19 +2369,19 @@ public function browser($id = null){ if (!empty($hoststatus) && $hoststatus['Hoststatus']['problem_has_been_acknowledged'] > 0) { $acknowledged = $this->AcknowledgedHost->byHostUuid($host['Host']['uuid']); } - $ticketSystem = $this->Systemsetting->find('first', [ + $ticketSystem = $this->Systemsetting->find('first',[ 'conditions' => ['key' => 'TICKET_SYSTEM.URL'], ]); - $servicestatus = $this->Servicestatus->byUuid(Hash::extract($services, '{n}.Service.uuid')); + $servicestatus = $this->Servicestatus->byUuid(Hash::extract($services,'{n}.Service.uuid')); $username = $this->Auth->user('full_name'); - $mainContainer = $this->Tree->treePath($host['Host']['container_id'], ['delimiter' => '/']); + $mainContainer = $this->Tree->treePath($host['Host']['container_id'],['delimiter' => '/']); //get the already shared containers if (is_array($host['Container']) && !empty($host['Container'])) { foreach ($host['Container'] as $container) { if ($container != $host['Host']['container_id']) { - $sharedContainers[] = $this->Tree->treePath($container, ['delimiter' => '/']); + $sharedContainers[] = $this->Tree->treePath($container,['delimiter' => '/']); } } } else { @@ -2402,13 +2408,13 @@ public function browser($id = null){ ]) ); - $this->Frontend->setJson('dateformat', MY_DATEFORMAT); - $this->Frontend->setJson('hostUuid', $host['Host']['uuid']); + $this->Frontend->setJson('dateformat',MY_DATEFORMAT); + $this->Frontend->setJson('hostUuid',$host['Host']['uuid']); - $this->set('QueryHandler', new QueryHandler($this->Systemsetting->getQueryHandlerPath())); + $this->set('QueryHandler',new QueryHandler($this->Systemsetting->getQueryHandlerPath())); - $preselectedDowntimetype=$this->Systemsetting->findByKey("FRONTEND.PRESELECTED_DOWNTIME_OPTION"); - $this->set('preselectedDowntimetype', $preselectedDowntimetype['Systemsetting']['value']); + $preselectedDowntimetype = $this->Systemsetting->findByKey("FRONTEND.PRESELECTED_DOWNTIME_OPTION"); + $this->set('preselectedDowntimetype',$preselectedDowntimetype['Systemsetting']['value']); } /** @@ -2420,11 +2426,11 @@ public function browser($id = null){ * * @return string */ - public function longOutputByUuid($uuid = null, $parseBbcode = true, $nl2br = true){ + public function longOutputByUuid($uuid = null,$parseBbcode = true,$nl2br = true) { $this->autoRender = false; - $result = $this->Host->find('first', [ - 'recursive' => -1, - 'fields' => [ + $result = $this->Host->find('first',[ + 'recursive' => -1, + 'fields' => [ 'Host.id', 'Host.uuid' ], @@ -2433,7 +2439,7 @@ public function longOutputByUuid($uuid = null, $parseBbcode = true, $nl2br = tru ] ]); if (!empty($result)) { - $hoststatus = $this->Hoststatus->byUuid($result['Host']['uuid'], [ + $hoststatus = $this->Hoststatus->byUuid($result['Host']['uuid'],[ 'fields' => [ 'Hoststatus.long_output' ] @@ -2441,9 +2447,9 @@ public function longOutputByUuid($uuid = null, $parseBbcode = true, $nl2br = tru if (!empty($hoststatus)) { if ($parseBbcode === true) { if ($nl2br === true) { - return $this->Bbcode->nagiosNl2br($this->Bbcode->asHtml($hoststatus['Hoststatus']['long_output'], $nl2br)); + return $this->Bbcode->nagiosNl2br($this->Bbcode->asHtml($hoststatus['Hoststatus']['long_output'],$nl2br)); } else { - return $this->Bbcode->asHtml($hoststatus['Hoststatus']['long_output'], $nl2br); + return $this->Bbcode->asHtml($hoststatus['Hoststatus']['long_output'],$nl2br); } } @@ -2455,11 +2461,11 @@ public function longOutputByUuid($uuid = null, $parseBbcode = true, $nl2br = tru } - public function gethostbyname(){ + public function gethostbyname() { $this->autoRender = false; if ($this->request->is('ajax') && isset($this->request->data['hostname']) && $this->request->data['hostname'] != '') { $ip = gethostbyname($this->request->data['hostname']); - if (filter_var($ip, FILTER_VALIDATE_IP)) { + if (filter_var($ip,FILTER_VALIDATE_IP)) { echo $ip; return; @@ -2468,9 +2474,9 @@ public function gethostbyname(){ echo ''; } - public function gethostbyaddr(){ + public function gethostbyaddr() { $this->autoRender = false; - if ($this->request->is('ajax') && isset($this->request->data['address']) && filter_var($this->request->data['address'], FILTER_VALIDATE_IP)) { + if ($this->request->is('ajax') && isset($this->request->data['address']) && filter_var($this->request->data['address'],FILTER_VALIDATE_IP)) { $fqdn = gethostbyaddr($this->request->data['address']); if (strlen($fqdn) > 0 && $fqdn != $this->request->data['address']) { echo $fqdn; @@ -2481,7 +2487,7 @@ public function gethostbyaddr(){ echo ''; } - public function loadHosttemplate($hosttemplate_id = null){ + public function loadHosttemplate($hosttemplate_id = null) { $this->allowOnlyAjaxRequests(); $this->loadModel('Hosttemplate'); @@ -2490,11 +2496,11 @@ public function loadHosttemplate($hosttemplate_id = null){ } $hosttemplate = $this->Hosttemplate->find( - 'first', [ + 'first',[ 'conditions' => [ 'Hosttemplate.id' => $hosttemplate_id, ], - 'contain' => [ + 'contain' => [ 'Contactgroup' => 'Container', 'CheckCommand', 'Container', @@ -2503,23 +2509,23 @@ public function loadHosttemplate($hosttemplate_id = null){ 'Contact', 'Hosttemplatecommandargumentvalue', 'CheckPeriod', - 'Hostgroup' => 'Container' + 'Hostgroup' => 'Container' ], ] ); $this->set(compact(['hosttemplate'])); - $this->set('_serialize', ['hosttemplate']); + $this->set('_serialize',['hosttemplate']); } - public function addCustomMacro($counter){ + public function addCustomMacro($counter) { $this->allowOnlyAjaxRequests(); - $this->set('objecttype_id', OBJECT_HOST); - $this->set('counter', $counter); + $this->set('objecttype_id',OBJECT_HOST); + $this->set('counter',$counter); } - public function loadTemplateMacros($hosttemplate_id = null){ + public function loadTemplateMacros($hosttemplate_id = null) { if (!$this->request->is('ajax')) { throw new MethodNotAllowedException(); } @@ -2530,12 +2536,12 @@ public function loadTemplateMacros($hosttemplate_id = null){ } if ($this->Hosttemplate->exists($hosttemplate_id)) { - $hosttemplate = $this->Hosttemplate->find('first', [ + $hosttemplate = $this->Hosttemplate->find('first',[ 'conditions' => [ 'Hosttemplate.id' => $hosttemplate_id, ], - 'recursive' => -1, - 'contain' => [ + 'recursive' => -1, + 'contain' => [ 'Customvariable' => [ 'fields' => [ 'Customvariable.name', @@ -2544,23 +2550,23 @@ public function loadTemplateMacros($hosttemplate_id = null){ ], ], ], - 'fields' => [ + 'fields' => [ 'Hosttemplate.id', ], ]); } - $this->set('hosttemplate', $hosttemplate); + $this->set('hosttemplate',$hosttemplate); } - public function loadParametersByCommandId($command_id = null, $hosttemplate_id = null){ + public function loadParametersByCommandId($command_id = null,$hosttemplate_id = null) { if (!$this->request->is('ajax')) { throw new MethodNotAllowedException(); } $test = []; $commandarguments = []; if ($command_id) { - $commandarguments = $this->Commandargument->find('all', [ - 'recursive' => -1, + $commandarguments = $this->Commandargument->find('all',[ + 'recursive' => -1, 'conditions' => [ 'Commandargument.command_id' => $command_id, ], @@ -2568,12 +2574,12 @@ public function loadParametersByCommandId($command_id = null, $hosttemplate_id = //print_r($commandarguments); foreach ($commandarguments as $key => $commandargument) { if ($hosttemplate_id) { - $hosttemplate_command_argument_value = $this->Hosttemplatecommandargumentvalue->find('first', [ + $hosttemplate_command_argument_value = $this->Hosttemplatecommandargumentvalue->find('first',[ 'conditions' => [ - 'Hosttemplatecommandargumentvalue.hosttemplate_id' => $hosttemplate_id, + 'Hosttemplatecommandargumentvalue.hosttemplate_id' => $hosttemplate_id, 'Hosttemplatecommandargumentvalue.commandargument_id' => $commandargument['Commandargument']['id'], ], - 'fields' => 'Hosttemplatecommandargumentvalue.value', + 'fields' => 'Hosttemplatecommandargumentvalue.value', ]); if (isset($hosttemplate_command_argument_value['Hosttemplatecommandargumentvalue']['value'])) { $commandarguments[$key]['Hosttemplatecommandargumentvalue']['value'] = $hosttemplate_command_argument_value['Hosttemplatecommandargumentvalue']['value']; @@ -2585,7 +2591,7 @@ public function loadParametersByCommandId($command_id = null, $hosttemplate_id = $this->set(compact('commandarguments')); } - public function loadArguments($command_id = null, $hosttemplate_id = null){ + public function loadArguments($command_id = null,$hosttemplate_id = null) { if (!$this->request->is('ajax')) { throw new MethodNotAllowedException(); } @@ -2596,9 +2602,9 @@ public function loadArguments($command_id = null, $hosttemplate_id = null){ $commandarguments = []; - $commandarguments = $this->Hosttemplatecommandargumentvalue->find('all', [ + $commandarguments = $this->Hosttemplatecommandargumentvalue->find('all',[ 'conditions' => [ - 'Commandargument.command_id' => $command_id, + 'Commandargument.command_id' => $command_id, 'Hosttemplatecommandargumentvalue.hosttemplate_id' => $hosttemplate_id, ], ]); @@ -2606,35 +2612,35 @@ public function loadArguments($command_id = null, $hosttemplate_id = null){ //Checking if the hosttemplade has own arguments defined if (empty($commandarguments)) { - $commandarguments = $this->Commandargument->find('all', [ - 'recursive' => -1, + $commandarguments = $this->Commandargument->find('all',[ + 'recursive' => -1, 'conditions' => [ 'Commandargument.command_id' => $command_id, ], ]); } - $this->set('commandarguments', $commandarguments); + $this->set('commandarguments',$commandarguments); } - public function loadArgumentsAdd($command_id = null){ + public function loadArgumentsAdd($command_id = null) { if (!$this->request->is('ajax')) { throw new MethodNotAllowedException(); } $commandarguments = []; - $commandarguments = $this->Commandargument->find('all', [ - 'recursive' => -1, + $commandarguments = $this->Commandargument->find('all',[ + 'recursive' => -1, 'conditions' => [ 'Commandargument.command_id' => $command_id, ], ]); - $this->set('commandarguments', $commandarguments); + $this->set('commandarguments',$commandarguments); $this->render('load_arguments'); } - public function loadHosttemplatesArguments($hosttemplate_id = null){ + public function loadHosttemplatesArguments($hosttemplate_id = null) { if (!$this->request->is('ajax')) { throw new MethodNotAllowedException(); } @@ -2646,13 +2652,13 @@ public function loadHosttemplatesArguments($hosttemplate_id = null){ $this->loadModel('Commandargument'); $this->loadModel('Hosttemplatecommandargumentvalue'); - $commandarguments = $this->Hosttemplatecommandargumentvalue->find('all', [ + $commandarguments = $this->Hosttemplatecommandargumentvalue->find('all',[ // 'recursive' => -1, 'conditions' => [ 'hosttemplate_id' => $hosttemplate_id, ], ]); - $commandarguments = Hash::remove($commandarguments, '{n}.Hosttemplatecommandargumentvalue.id'); + $commandarguments = Hash::remove($commandarguments,'{n}.Hosttemplatecommandargumentvalue.id'); // Renaming Hosttemplatecommandargumentvalue to Hostcommandargumentvalue that we can render the view load_arguments with values $_commandarguments = []; @@ -2664,11 +2670,11 @@ public function loadHosttemplatesArguments($hosttemplate_id = null){ $c['Commandargument'] = $commandargument['Commandargument']; $_commandarguments[] = $c; } - $this->set('commandarguments', $_commandarguments); + $this->set('commandarguments',$_commandarguments); $this->render('load_arguments'); } - private function _diffWithTemplate($host, $hosttemplate){ + private function _diffWithTemplate($host,$hosttemplate) { $diff_array = []; //Host-/Hosttemplate fields $fields = [ @@ -2696,19 +2702,19 @@ private function _diffWithTemplate($host, $hosttemplate){ 'host_url' ]; $compare_array = [ - 'Host' => [ - ['Host.{(' . implode('|', array_values(Hash::merge($fields, ['name', 'description', 'address', 'satellite_id', 'host_type']))) . ')}', false], - ['{^Contact$}.{^Contact$}.{n}', false], - ['{^Contactgroup$}.{^Contactgroup$}.{n}', false], - ['{^Hostgroup$}.{^Hostgroup$}.{n}', false], - ['Hostcommandargumentvalue.{n}.{(commandargument_id|value|id)}', false], + 'Host' => [ + ['Host.{(' . implode('|',array_values(Hash::merge($fields,['name','description','address','satellite_id','host_type']))) . ')}',false], + ['{^Contact$}.{^Contact$}.{n}',false], + ['{^Contactgroup$}.{^Contactgroup$}.{n}',false], + ['{^Hostgroup$}.{^Hostgroup$}.{n}',false], + ['Hostcommandargumentvalue.{n}.{(commandargument_id|value|id)}',false], ], 'Hosttemplate' => [ - ['Hosttemplate.{(' . implode('|', array_values($fields)) . ')}', false], - ['{^Contact$}.{n}.id', true], - ['{^Contactgroup$}.{n}.id', true], - ['{^Hostgroup$}.{n}.id', true], - ['Hosttemplatecommandargumentvalue.{n}.{(commandargument_id|value)}', false], + ['Hosttemplate.{(' . implode('|',array_values($fields)) . ')}',false], + ['{^Contact$}.{n}.id',true], + ['{^Contactgroup$}.{n}.id',true], + ['{^Hostgroup$}.{n}.id',true], + ['Hosttemplatecommandargumentvalue.{n}.{(commandargument_id|value)}',false], ], ]; $diff_array = []; @@ -2716,19 +2722,19 @@ private function _diffWithTemplate($host, $hosttemplate){ $extractPath = $compare_array['Hosttemplate'][$key][0]; if ($data[0] == 'Hostcommandargumentvalue.{n}.{(commandargument_id|value|id)}') { if (isset($host['Hostcommandargumentvalue'])) { - if (!empty(Hash::diff(Set::classicExtract($host, $data[0]), Set::classicExtract($hosttemplate, $compare_array['Hosttemplate'][$key][0])))) { - $diff_data = Set::classicExtract($host, $data[0]); + if (!empty(Hash::diff(Set::classicExtract($host,$data[0]),Set::classicExtract($hosttemplate,$compare_array['Hosttemplate'][$key][0])))) { + $diff_data = Set::classicExtract($host,$data[0]); $diff_array['Hostcommandargumentvalue'] = $diff_data; } } } else { //$Key for DiffArray with preg_replace ==> from 'Customvariable.{n}.{(name|value)}'' to 'Customvariable' - $possible_key = preg_replace('/(\{.*\})|(\.)/', '', $data[0]); - $diff_data = $this->Host->getDiffAsArray($this->Host->prepareForCompare(Set::classicExtract($host, $data[0]), $data[1]), - $this->Host->prepareForCompare(Set::classicExtract($hosttemplate, $compare_array['Hosttemplate'][$key][0]), + $possible_key = preg_replace('/(\{.*\})|(\.)/','',$data[0]); + $diff_data = $this->Host->getDiffAsArray($this->Host->prepareForCompare(Set::classicExtract($host,$data[0]),$data[1]), + $this->Host->prepareForCompare(Set::classicExtract($hosttemplate,$compare_array['Hosttemplate'][$key][0]), $compare_array['Hosttemplate'][$key][1])); if (!empty($diff_data)) { - $diff_array = Hash::merge($diff_array, (!empty($possible_key)) ? [$possible_key => $diff_data] : $diff_data); + $diff_array = Hash::merge($diff_array,(!empty($possible_key)) ? [$possible_key => $diff_data] : $diff_data); } } } @@ -2736,11 +2742,11 @@ private function _diffWithTemplate($host, $hosttemplate){ } //This function return the controller name - protected function controller(){ + protected function controller() { return 'HostsController'; } - public function getHostByAjax($id = null){ + public function getHostByAjax($id = null) { if (!$this->Host->exists($id)) { throw new NotFoundException(__('Invalid host')); } @@ -2750,11 +2756,11 @@ public function getHostByAjax($id = null){ } $host = $this->Host->findById($id); - $this->set('host', $host); - $this->set('_serialize', ['host']); + $this->set('host',$host); + $this->set('_serialize',['host']); } - public function listToPdf(){ + public function listToPdf() { $HostControllerRequest = new HostControllerRequest($this->request); $HostCondition = new HostConditions(); $User = new User($this->Auth); @@ -2768,24 +2774,24 @@ public function listToPdf(){ )); if ($this->DbBackend->isNdoUtils()) { - $query = $this->Host->getHostIndexQuery($HostCondition, $this->ListFilter->buildConditions()); + $query = $this->Host->getHostIndexQuery($HostCondition,$this->ListFilter->buildConditions()); $this->Host->virtualFieldsForIndex(); $modelName = 'Host'; } if ($this->DbBackend->isCrateDb()) { - $query = $this->Hoststatus->getHostIndexQuery($HostCondition, $this->ListFilter->buildConditions()); + $query = $this->Hoststatus->getHostIndexQuery($HostCondition,$this->ListFilter->buildConditions()); $modelName = 'Hoststatus'; } - if(isset($query['limit'])){ + if (isset($query['limit'])) { unset($query['limit']); } - $all_hosts = $this->{$modelName}->find('all', $query); + $all_hosts = $this->{$modelName}->find('all',$query); - $this->set('all_hosts', $all_hosts); + $this->set('all_hosts',$all_hosts); - $this->set('masterInstance', $this->Systemsetting->getMasterInstanceName()); + $this->set('masterInstance',$this->Systemsetting->getMasterInstanceName()); $SatelliteNames = []; $ModuleManager = new ModuleManager('DistributeModule'); @@ -2793,7 +2799,7 @@ public function listToPdf(){ $SatelliteModel = $ModuleManager->loadModel('Satellite'); $SatelliteNames = $SatelliteModel->find('list'); } - $this->set('SatelliteNames', $SatelliteNames); + $this->set('SatelliteNames',$SatelliteNames); $filename = 'Hosts_' . strtotime('now') . '.pdf'; $binary_path = '/usr/bin/wkhtmltopdf'; @@ -2801,22 +2807,22 @@ public function listToPdf(){ $binary_path = '/usr/local/bin/wkhtmltopdf'; } $this->pdfConfig = [ - 'engine' => 'CakePdf.WkHtmlToPdf', - 'margin' => [ + 'engine' => 'CakePdf.WkHtmlToPdf', + 'margin' => [ 'bottom' => 15, - 'left' => 0, - 'right' => 0, - 'top' => 15, + 'left' => 0, + 'right' => 0, + 'top' => 15, ], - 'encoding' => 'UTF-8', - 'download' => true, - 'binary' => $binary_path, - 'orientation' => 'portrait', - 'filename' => $filename, + 'encoding' => 'UTF-8', + 'download' => true, + 'binary' => $binary_path, + 'orientation' => 'portrait', + 'filename' => $filename, 'no-pdf-compression' => '*', - 'image-dpi' => '900', - 'background' => true, - 'no-background' => false, + 'image-dpi' => '900', + 'background' => true, + 'no-background' => false, ]; } @@ -2825,103 +2831,103 @@ public function listToPdf(){ * $host is from prepareForView() but ther are no names in the service contact, only ids * $_host is from $this->Host->findById, because of contact names */ - protected function __inheritContactsAndContactgroups($host, $_host = []){ + protected function __inheritContactsAndContactgroups($host,$_host = []) { $diffExists = 0; if ($host['Host']['own_contacts'] == 0 && $host['Host']['own_contactgroups'] == 0) { - $ContactsCombined = Hash::combine($host['Hosttemplate']['Contact'], '{n}.id', '{n}.id'); - $ContactgroupsCombined = Hash::combine($host['Hosttemplate']['Contactgroup'], '{n}.id', '{n}.id'); + $ContactsCombined = Hash::combine($host['Hosttemplate']['Contact'],'{n}.id','{n}.id'); + $ContactgroupsCombined = Hash::combine($host['Hosttemplate']['Contactgroup'],'{n}.id','{n}.id'); if (isset($this->request->data['Host']['Contact']) || isset($this->request->data['Host']['Contactgroup'])) { if (isset($this->request->data['Host']['Contact']) && is_array($this->request->data['Host']['Contact'])) { $diffExists += sizeof( array_merge( - array_diff($this->request->data['Host']['Contact'], $ContactsCombined), - array_diff($ContactsCombined, $this->request->data['Host']['Contact']) + array_diff($this->request->data['Host']['Contact'],$ContactsCombined), + array_diff($ContactsCombined,$this->request->data['Host']['Contact']) ) ); } if (isset($this->request->data['Host']['Contactgroup']) && is_array($this->request->data['Host']['Contactgroup'])) { $diffExists += sizeof( array_merge( - array_diff($this->request->data['Host']['Contactgroup'], $ContactgroupsCombined), - array_diff($ContactgroupsCombined, $this->request->data['Host']['Contactgroup']) + array_diff($this->request->data['Host']['Contactgroup'],$ContactgroupsCombined), + array_diff($ContactgroupsCombined,$this->request->data['Host']['Contactgroup']) ) ); } } if ($diffExists > 0) { return [ - 'inherit' => false, - 'source' => 'Host', - 'Contact' => $this->request->data('Host.Contact'), + 'inherit' => false, + 'source' => 'Host', + 'Contact' => $this->request->data('Host.Contact'), 'Contactgroup' => $this->request->data('Host.Contactgroup'), ]; } return [ - 'inherit' => true, - 'source' => 'Hosttemplate', - 'Contact' => Hash::combine($host['Hosttemplate']['Contact'], '{n}.id', '{n}.name'), - 'Contactgroup' => Hash::combine($host['Hosttemplate']['Contactgroup'], '{n}.id', '{n}.Container.name'), + 'inherit' => true, + 'source' => 'Hosttemplate', + 'Contact' => Hash::combine($host['Hosttemplate']['Contact'],'{n}.id','{n}.name'), + 'Contactgroup' => Hash::combine($host['Hosttemplate']['Contactgroup'],'{n}.id','{n}.Container.name'), ]; } if (!empty($_host)) { return [ - 'inherit' => false, - 'source' => 'Host', - 'Contact' => Hash::combine($_host['Contact'], '{n}.id', '{n}.name'), - 'Contactgroup' => Hash::combine($_host['Contactgroup'], '{n}.id', '{n}.Container.name'), + 'inherit' => false, + 'source' => 'Host', + 'Contact' => Hash::combine($_host['Contact'],'{n}.id','{n}.name'), + 'Contactgroup' => Hash::combine($_host['Contactgroup'],'{n}.id','{n}.Container.name'), ]; } - $ContactsCombined = Hash::combine($host['Contact'], '{n}.id', '{n}.id'); - $ContactgroupsCombined = Hash::combine($host['Contactgroup'], '{n}.id', '{n}.id'); + $ContactsCombined = Hash::combine($host['Contact'],'{n}.id','{n}.id'); + $ContactgroupsCombined = Hash::combine($host['Contactgroup'],'{n}.id','{n}.id'); if (isset($this->request->data['Host']['Contact']) || isset($this->request->data['Host']['Contactgroup'])) { if (isset($this->request->data['Host']['Contact']) && is_array($this->request->data['Host']['Contact'])) { $diffExists += sizeof( array_merge( - array_diff($this->request->data['Host']['Contact'], $ContactsCombined), - array_diff($ContactsCombined, $this->request->data['Host']['Contact']) + array_diff($this->request->data['Host']['Contact'],$ContactsCombined), + array_diff($ContactsCombined,$this->request->data['Host']['Contact']) ) ); } if (isset($this->request->data['Host']['Contactgroup']) && is_array($this->request->data['Host']['Contactgroup'])) { $diffExists += sizeof( array_merge( - array_diff($this->request->data['Host']['Contactgroup'], $ContactgroupsCombined), - array_diff($ContactgroupsCombined, $this->request->data['Host']['Contactgroup']) + array_diff($this->request->data['Host']['Contactgroup'],$ContactgroupsCombined), + array_diff($ContactgroupsCombined,$this->request->data['Host']['Contactgroup']) ) ); } } if ($diffExists > 0) { return [ - 'inherit' => false, - 'source' => 'Host', - 'Contact' => $this->request->data['Host']['Contact'], + 'inherit' => false, + 'source' => 'Host', + 'Contact' => $this->request->data['Host']['Contact'], 'Contactgroup' => $this->request->data['Host']['Contactgroup'], ]; } return [ - 'inherit' => false, - 'source' => 'Host', - 'Contact' => Hash::combine($host['Contact'], '{n}.id', '{n}.name'), - 'Contactgroup' => Hash::combine($host['Contactgroup'], '{n}.id', '{n}.Container.name'), + 'inherit' => false, + 'source' => 'Host', + 'Contact' => Hash::combine($host['Contact'],'{n}.id','{n}.name'), + 'Contactgroup' => Hash::combine($host['Contactgroup'],'{n}.id','{n}.Container.name'), ]; } - public function ping(){ + public function ping() { $this->allowOnlyAjaxRequests(); $output = []; - exec('ping ' . escapeshellarg($this->getNamedParameter('address', '')) . ' -c 4 -W 5', $output); + exec('ping ' . escapeshellarg($this->getNamedParameter('address','')) . ' -c 4 -W 5',$output); - $this->set('output', $output); - $this->set('_serialize', ['output']); + $this->set('output',$output); + $this->set('_serialize',['output']); } /** @@ -2929,7 +2935,7 @@ public function ping(){ * Works if $this->request->data = array( * 'Host' => array( */ - public function addParentHosts(){ + public function addParentHosts() { $this->allowOnlyPostRequests(); $data = $this->request->data; @@ -2955,7 +2961,7 @@ public function addParentHosts(){ } - public function loadElementsByContainerId($container_id = null, $host_id = 0){ + public function loadElementsByContainerId($container_id = null,$host_id = 0) { $hosttemplate_type = GENERIC_HOST; if (!$this->request->is('ajax')) { throw new MethodNotAllowedException(); @@ -2966,8 +2972,8 @@ public function loadElementsByContainerId($container_id = null, $host_id = 0){ } if ($host_id != 0) { - $host = $this->Host->find('first', [ - 'recursive' => -1, + $host = $this->Host->find('first',[ + 'recursive' => -1, 'conditions' => [ 'Host.id' => $host_id ] @@ -2979,40 +2985,40 @@ public function loadElementsByContainerId($container_id = null, $host_id = 0){ $containerIds = $this->Tree->resolveChildrenOfContainerIds($container_id); - $hosttemplates = $this->Hosttemplate->hosttemplatesByContainerId($containerIds, 'list', $hosttemplate_type); + $hosttemplates = $this->Hosttemplate->hosttemplatesByContainerId($containerIds,'list',$hosttemplate_type); $hosttemplates = $this->Hosttemplate->chosenPlaceholder($hosttemplates); $hosttemplates = $this->Hosttemplate->makeItJavaScriptAble($hosttemplates); $hostgroups = $this->Host->makeItJavaScriptAble( - $this->Hostgroup->hostgroupsByContainerId($containerIds, 'list', 'id') + $this->Hostgroup->hostgroupsByContainerId($containerIds,'list','id') ); - $parenthosts = $this->Host->hostsByContainerId($containerIds, 'list'); + $parenthosts = $this->Host->hostsByContainerId($containerIds,'list'); if ($host_id != 0 && isset($parenthosts[$host_id])) { unset($parenthosts[$host_id]); } $parenthosts = $this->Host->makeItJavaScriptAble($parenthosts); - $timeperiods = $this->Timeperiod->timeperiodsByContainerId($containerIds, 'list'); + $timeperiods = $this->Timeperiod->timeperiodsByContainerId($containerIds,'list'); $timeperiods = $this->Host->makeItJavaScriptAble($timeperiods); $checkperiods = $timeperiods; - $contacts = $this->Contact->contactsByContainerId($containerIds, 'list'); + $contacts = $this->Contact->contactsByContainerId($containerIds,'list'); $contacts = $this->Host->makeItJavaScriptAble($contacts); - $contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds, 'list'); + $contactgroups = $this->Contactgroup->contactgroupsByContainerId($containerIds,'list'); $contactgroups = $this->Host->makeItJavaScriptAble($contactgroups); - $this->set(compact(['hosttemplates', 'hostgroups', 'parenthosts', 'timeperiods', 'checkperiods', 'contacts', 'contactgroups'])); - $this->set('_serialize', ['hosttemplates', 'hostgroups', 'parenthosts', 'timeperiods', 'checkperiods', 'contacts', 'contactgroups']); + $this->set(compact(['hosttemplates','hostgroups','parenthosts','timeperiods','checkperiods','contacts','contactgroups'])); + $this->set('_serialize',['hosttemplates','hostgroups','parenthosts','timeperiods','checkperiods','contacts','contactgroups']); } //Acl - public function checkcommand(){ + public function checkcommand() { return null; } - public function allocateServiceTemplateGroup($host_id = 0){ + public function allocateServiceTemplateGroup($host_id = 0) { //Form got submitted if (!empty($this->request->data)) { @@ -3030,7 +3036,7 @@ public function allocateServiceTemplateGroup($host_id = 0){ $this->loadModel('Service'); $this->loadModel('Servicetemplate'); $host = $this->Host->findById($host_id); - App::uses('UUID', 'Lib'); + App::uses('UUID','Lib'); foreach ($this->request->data('Service.ServicesToAdd') as $servicetemplateIdToAdd) { if (!isset($servicetemplateCache[$servicetemplateIdToAdd])) { $servicetemplateCache[$servicetemplateIdToAdd] = $this->Servicetemplate->findById($servicetemplateIdToAdd); @@ -3052,7 +3058,7 @@ public function allocateServiceTemplateGroup($host_id = 0){ $service['Contact']['Contact'] = $service['Contact']; $service['Contactgroup']['Contactgroup'] = $service['Contactgroup']; - $data_to_save = $this->Service->prepareForSave([], $service, 'add'); + $data_to_save = $this->Service->prepareForSave([],$service,'add'); $this->Service->create(); if ($this->Service->saveAll($data_to_save)) { $changelog_data = $this->Changelog->parseDataForChangelog( @@ -3066,20 +3072,20 @@ public function allocateServiceTemplateGroup($host_id = 0){ $service ); if ($changelog_data) { - CakeLog::write('log', serialize($changelog_data)); + CakeLog::write('log',serialize($changelog_data)); } } } $this->setFlash(__('Services created successfully')); - $this->redirect(['controller' => 'services', 'action' => 'serviceList', $host['Host']['id']]); + $this->redirect(['controller' => 'services','action' => 'serviceList',$host['Host']['id']]); } else { - $this->setFlash(__('Target host does not exist'), false); + $this->setFlash(__('Target host does not exist'),false); } } } $host = $this->Host->findById($host_id); - $allServicetemplategroups = $this->Servicetemplategroup->find('all', [ - 'fields' => ['Servicetemplategroup.id', 'Container.name'], + $allServicetemplategroups = $this->Servicetemplategroup->find('all',[ + 'fields' => ['Servicetemplategroup.id','Container.name'], ]); $serviceTemplateGroups = []; foreach ($allServicetemplategroups as $servicetemplategroup) { @@ -3087,7 +3093,7 @@ public function allocateServiceTemplateGroup($host_id = 0){ } - $this->set('back_url', $this->referer()); + $this->set('back_url',$this->referer()); $this->set(compact([ 'host', 'serviceTemplateGroups', @@ -3095,7 +3101,7 @@ public function allocateServiceTemplateGroup($host_id = 0){ } - public function getServiceTemplatesfromGroup($stg_id = 0){ + public function getServiceTemplatesfromGroup($stg_id = 0) { if (!$this->Servicetemplategroup->exists($stg_id)) { throw new NotFoundException(__('Invalid Servicetemplategroup')); } @@ -3105,7 +3111,7 @@ public function getServiceTemplatesfromGroup($stg_id = 0){ $hostid = $_REQUEST['host_id']; $host = $this->Host->findById($hostid); $servicetemplategroup = $this->Servicetemplategroup->findById($stg_id); - $this->set(compact(['servicetemplategroup', 'host'])); - $this->set('_serialize', ['servicetemplategroup', 'host']); + $this->set(compact(['servicetemplategroup','host'])); + $this->set('_serialize',['servicetemplategroup','host']); } } diff --git a/app/Controller/SystemdowntimesController.php b/app/Controller/SystemdowntimesController.php index e82aaac2ad..642d7e0278 100755 --- a/app/Controller/SystemdowntimesController.php +++ b/app/Controller/SystemdowntimesController.php @@ -26,12 +26,11 @@ /** * @property Systemdowntime $Systemdowntime - * @property Host $Host - * @property Service $Service - * @property Hostgroup $Hostgroup + * @property Host $Host + * @property Service $Service + * @property Hostgroup $Hostgroup */ -class SystemdowntimesController extends AppController -{ +class SystemdowntimesController extends AppController { public $uses = [ 'Systemdowntime', 'Host', @@ -54,50 +53,49 @@ class SystemdowntimesController extends AppController ]; public $layout = 'Admin.default'; - public function index() - { + public function index() { $paginatorLimit = $this->Paginator->settings['limit']; - $requestSettings = $this->Systemdowntime->listSettings($this->request, $paginatorLimit); + $requestSettings = $this->Systemdowntime->listSettings($this->request,$paginatorLimit); if (isset($this->Paginator->settings['conditions'])) { - $this->Paginator->settings['conditions'] = Hash::merge($this->Paginator->settings['conditions'], $requestSettings['conditions']); + $this->Paginator->settings['conditions'] = Hash::merge($this->Paginator->settings['conditions'],$requestSettings['conditions']); } else { $this->Paginator->settings['conditions'] = $requestSettings['conditions']; } $this->Paginator->settings['limit'] = $requestSettings['paginator']['limit']; - $this->Paginator->settings['conditions'] = Hash::merge($this->Paginator->settings['conditions'], $requestSettings['conditions']); - $this->Paginator->settings = Hash::merge($this->Paginator->settings, $requestSettings['default']); + $this->Paginator->settings['conditions'] = Hash::merge($this->Paginator->settings['conditions'],$requestSettings['conditions']); + $this->Paginator->settings = Hash::merge($this->Paginator->settings,$requestSettings['default']); $all_systemdowntimes = $this->Paginator->paginate(); - foreach($all_systemdowntimes as $dKey => $systemdowntime){ - switch($systemdowntime['Systemdowntime']['objecttype_id']){ + foreach ($all_systemdowntimes as $dKey => $systemdowntime) { + switch ($systemdowntime['Systemdowntime']['objecttype_id']) { case OBJECT_HOST: - if(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']] == WRITE_RIGHT){ + if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']] == WRITE_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = true; - }else{ + } else { $all_systemdowntimes[$dKey]['canDelete'] = false; } break; case OBJECT_SERVICE: - if(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']] == WRITE_RIGHT){ + if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']] == WRITE_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = true; - }else{ + } else { $all_systemdowntimes[$dKey]['canDelete'] = false; } break; case OBJECT_HOSTGROUP: - if(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == WRITE_RIGHT){ + if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == WRITE_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = true; - }elseif(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == READ_RIGHT){ + } else if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == READ_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = false; - }else{ + } else { unset($all_systemdowntimes[$dKey]); } break; @@ -108,17 +106,16 @@ public function index() } - $this->set('DowntimeListsettings', $requestSettings['Listsettings']); - $this->set('all_systemdowntimes', $all_systemdowntimes); - $this->set('paginatorLimit', $paginatorLimit); + $this->set('DowntimeListsettings',$requestSettings['Listsettings']); + $this->set('all_systemdowntimes',$all_systemdowntimes); + $this->set('paginatorLimit',$paginatorLimit); } - public function addHostdowntime() - { + public function addHostdowntime() { $selected = $this->request->data('Systemdowntime.object_id'); - $preselectedDowntimetype=$this->Systemsetting->findByKey("FRONTEND.PRESELECTED_DOWNTIME_OPTION"); - $this->set('preselectedDowntimetype', $preselectedDowntimetype['Systemsetting']['value']); - $this->Frontend->setJson('dateformat', MY_DATEFORMAT); + $preselectedDowntimetype = $this->Systemsetting->findByKey("FRONTEND.PRESELECTED_DOWNTIME_OPTION"); + $this->set('preselectedDowntimetype',$preselectedDowntimetype['Systemsetting']['value']); + $this->Frontend->setJson('dateformat',MY_DATEFORMAT); $customFildsToRefill = [ 'Systemdowntime' => [ @@ -135,38 +132,38 @@ public function addHostdowntime() $containerIds = $this->Tree->resolveChildrenOfContainerIds($this->MY_RIGHTS); $writeContainerIds = []; - foreach($containerIds as $containerId){ - if(isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT){ + foreach ($containerIds as $containerId) { + if (isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT) { $writeContainerIds[] = $containerId; } } - $hosts = $this->Host->hostsByContainerId($writeContainerIds, 'list'); + $hosts = $this->Host->hostsByContainerId($writeContainerIds,'list'); - $this->set(compact(['hosts', 'selected'])); - $this->set('back_url', $this->referer()); + $this->set(compact(['hosts','selected'])); + $this->set('back_url',$this->referer()); if ($this->request->is('post') || $this->request->is('put')) { if (isset($this->request->data['Systemdowntime']['weekdays']) && is_array($this->request->data['Systemdowntime']['weekdays'])) { - $this->request->data['Systemdowntime']['weekdays'] = implode(',', $this->request->data['Systemdowntime']['weekdays']); + $this->request->data['Systemdowntime']['weekdays'] = implode(',',$this->request->data['Systemdowntime']['weekdays']); } $this->request->data = $this->_rewritePostData(); //Try validate the data: foreach ($this->request->data as $request) { - if($request['Systemdowntime']['is_recurring'] ){ + if ($request['Systemdowntime']['is_recurring']) { $this->Systemdowntime->validate = Hash::merge( $this->Systemdowntime->validate, [ 'from_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, - ], + ], ], - 'to_date' => [ + 'to_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ] ] @@ -188,13 +185,13 @@ public function addHostdowntime() $this->Systemdowntime->create(); $this->Systemdowntime->save($request); } else { - $start = strtotime($request['Systemdowntime']['from_date'].' '.$request['Systemdowntime']['from_time']); - $end = strtotime($request['Systemdowntime']['to_date'].' '.$request['Systemdowntime']['to_time']); + $start = strtotime($request['Systemdowntime']['from_date'] . ' ' . $request['Systemdowntime']['from_time']); + $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'host') { - $host = $this->Host->find('first', [ - 'recursive' => -1, - 'fields' => [ + $host = $this->Host->find('first',[ + 'recursive' => -1, + 'fields' => [ 'Host.uuid' ], 'conditions' => [ @@ -209,25 +206,24 @@ public function addHostdowntime() 'comment' => $request['Systemdowntime']['comment'], 'author' => $this->Auth->user('full_name'), ]; - $this->GearmanClient->sendBackground('createHostDowntime', $payload); + $this->GearmanClient->sendBackground('createHostDowntime',$payload); } } } else { - $this->setFlash(__('Downtime could not be saved'), false); + $this->setFlash(__('Downtime could not be saved'),false); $this->CustomValidationErrors->loadModel($this->Systemdowntime); - $this->CustomValidationErrors->customFields(['from_date', 'from_time', 'to_date', 'to_time', 'downtimetype']); + $this->CustomValidationErrors->customFields(['from_date','from_time','to_date','to_time','downtimetype']); $this->CustomValidationErrors->fetchErrors(); return; } } $this->setFlash(__('Downtime successfully saved')); - $this->redirect(['controller' => 'downtimes', 'action' => 'index']); + $this->redirect(['controller' => 'downtimes','action' => 'index']); } } - public function addHostgroupdowntime() - { - $this->Frontend->setJson('dateformat', MY_DATEFORMAT); + public function addHostgroupdowntime() { + $this->Frontend->setJson('dateformat',MY_DATEFORMAT); $selected = $this->request->data('Systemdowntime.object_id'); $customFildsToRefill = [ @@ -245,36 +241,36 @@ public function addHostgroupdowntime() $containerIds = $this->Tree->resolveChildrenOfContainerIds($this->MY_RIGHTS); $writeContainerIds = []; - foreach($containerIds as $containerId){ - if(isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT){ + foreach ($containerIds as $containerId) { + if (isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT) { $writeContainerIds[] = $containerId; } } - $hostgroups = $this->Hostgroup->hostgroupsByContainerId($writeContainerIds, 'list', 'id'); - $this->set(compact(['hostgroups', 'selected'])); - $this->set('back_url', $this->referer()); + $hostgroups = $this->Hostgroup->hostgroupsByContainerId($writeContainerIds,'list','id'); + $this->set(compact(['hostgroups','selected'])); + $this->set('back_url',$this->referer()); if ($this->request->is('post') || $this->request->is('put')) { if (isset($this->request->data['Systemdowntime']['weekdays']) && is_array($this->request->data['Systemdowntime']['weekdays'])) { - $this->request->data['Systemdowntime']['weekdays'] = implode(',', $this->request->data['Systemdowntime']['weekdays']); + $this->request->data['Systemdowntime']['weekdays'] = implode(',',$this->request->data['Systemdowntime']['weekdays']); } $this->request->data = $this->_rewritePostData(); //Try validate the data: foreach ($this->request->data as $request) { - if($request['Systemdowntime']['is_recurring']){ + if ($request['Systemdowntime']['is_recurring']) { $this->Systemdowntime->validate = Hash::merge( $this->Systemdowntime->validate, [ 'from_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ], ], - 'to_date' => [ + 'to_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ] ] @@ -292,15 +288,15 @@ public function addHostgroupdowntime() * Normal downtimes, will be sent to sudo_servers unix socket. */ - if($request['Systemdowntime']['is_recurring'] == 1) { + if ($request['Systemdowntime']['is_recurring'] == 1) { $this->Systemdowntime->create(); $this->Systemdowntime->save($request); } else { - $start = strtotime($request['Systemdowntime']['from_date'].' '.$request['Systemdowntime']['from_time']); - $end = strtotime($request['Systemdowntime']['to_date'].' '.$request['Systemdowntime']['to_time']); + $start = strtotime($request['Systemdowntime']['from_date'] . ' ' . $request['Systemdowntime']['from_time']); + $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'hostgroup') { - $hostgroup = $this->Hostgroup->find('first', [ + $hostgroup = $this->Hostgroup->find('first',[ 'recursive' => -1, 'conditions' => [ 'Hostgroup.id' => $request['Systemdowntime']['object_id'], @@ -310,35 +306,34 @@ public function addHostgroupdowntime() ], ]); - $payload = [ + $payload = [ 'hostgroupUuid' => $hostgroup['Hostgroup']['uuid'], 'downtimetype' => $request['Systemdowntime']['downtimetype_id'], 'start' => $start, 'end' => $end, 'comment' => $request['Systemdowntime']['comment'], 'author' => $this->Auth->user('full_name'), - ]; + ]; - $this->GearmanClient->sendBackground('createHostgroupDowntime', $payload); + $this->GearmanClient->sendBackground('createHostgroupDowntime',$payload); } } } else { - $this->setFlash(__('Downtime could not be saved'), false); + $this->setFlash(__('Downtime could not be saved'),false); $this->CustomValidationErrors->loadModel($this->Systemdowntime); - $this->CustomValidationErrors->customFields(['from_date', 'from_time', 'to_date', 'to_time', 'downtimetype']); + $this->CustomValidationErrors->customFields(['from_date','from_time','to_date','to_time','downtimetype']); $this->CustomValidationErrors->fetchErrors(); return; } } $this->setFlash(__('Downtime successfully saved')); - $this->redirect(['controller' => 'downtimes', 'action' => 'index']); + $this->redirect(['controller' => 'downtimes','action' => 'index']); } } - public function addServicedowntime() - { - $this->Frontend->setJson('dateformat', MY_DATEFORMAT); + public function addServicedowntime() { + $this->Frontend->setJson('dateformat',MY_DATEFORMAT); $selected = $this->request->data('Systemdowntime.object_id'); $customFildsToRefill = [ @@ -356,40 +351,40 @@ public function addServicedowntime() $containerIds = $this->Tree->resolveChildrenOfContainerIds($this->MY_RIGHTS); $writeContainerIds = []; - foreach($containerIds as $containerId){ - if(isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT){ + foreach ($containerIds as $containerId) { + if (isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT) { $writeContainerIds[] = $containerId; } } $services = $this->Service->servicesByHostContainerIds($writeContainerIds); - $services = Hash::combine($services, '{n}.Service.id', ['%s/%s', '{n}.Host.name', '{n}.{n}.ServiceDescription'], '{n}.Host.name'); + $services = Hash::combine($services,'{n}.Service.id',['%s/%s','{n}.Host.name','{n}.{n}.ServiceDescription'],'{n}.Host.name'); - $this->set(compact(['services', 'selected'])); - $this->set('back_url', $this->referer()); + $this->set(compact(['services','selected'])); + $this->set('back_url',$this->referer()); if ($this->request->is('post') || $this->request->is('put')) { if (isset($this->request->data['Systemdowntime']['weekdays']) && is_array($this->request->data['Systemdowntime']['weekdays'])) { - $this->request->data['Systemdowntime']['weekdays'] = implode(',', $this->request->data['Systemdowntime']['weekdays']); + $this->request->data['Systemdowntime']['weekdays'] = implode(',',$this->request->data['Systemdowntime']['weekdays']); } $this->request->data = $this->_rewritePostData(); //Try validate the data: foreach ($this->request->data as $request) { - if($request['Systemdowntime']['is_recurring']){ + if ($request['Systemdowntime']['is_recurring']) { $this->Systemdowntime->validate = Hash::merge( $this->Systemdowntime->validate, [ 'from_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ], ], - 'to_date' => [ + 'to_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ] ] @@ -412,21 +407,21 @@ public function addServicedowntime() $this->Systemdowntime->create(); $this->Systemdowntime->save($request); } else { - $start = strtotime($request['Systemdowntime']['from_date'].' '.$request['Systemdowntime']['from_time']); - $end = strtotime($request['Systemdowntime']['to_date'].' '.$request['Systemdowntime']['to_time']); + $start = strtotime($request['Systemdowntime']['from_date'] . ' ' . $request['Systemdowntime']['from_time']); + $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'service') { $service = $this->Service->findById($request['Systemdowntime']['object_id']); - $service = $this->Service->find('first', [ - 'recursive' => -1, - 'contain' => [ + $service = $this->Service->find('first',[ + 'recursive' => -1, + 'contain' => [ 'Host' => [ 'fields' => [ 'Host.uuid' ] ] ], - 'fields' => [ + 'fields' => [ 'Service.uuid' ], 'conditions' => [ @@ -441,25 +436,24 @@ public function addServicedowntime() 'comment' => $request['Systemdowntime']['comment'], 'author' => $this->Auth->user('full_name'), ]; - $this->GearmanClient->sendBackground('createServiceDowntime', $payload); + $this->GearmanClient->sendBackground('createServiceDowntime',$payload); } } } else { - $this->setFlash(__('Downtime could not be saved'), false); + $this->setFlash(__('Downtime could not be saved'),false); $this->CustomValidationErrors->loadModel($this->Systemdowntime); - $this->CustomValidationErrors->customFields(['from_date', 'from_time', 'to_date', 'to_time', 'downtimetype']); + $this->CustomValidationErrors->customFields(['from_date','from_time','to_date','to_time','downtimetype']); $this->CustomValidationErrors->fetchErrors(); return; } } - $this->redirect(['controller' => 'downtimes', 'action' => 'service']); + $this->redirect(['controller' => 'downtimes','action' => 'service']); } } - public function delete($id = null, $cascade = true) - { + public function delete($id = null,$cascade = true) { if (!$this->request->is('post')) { throw new MethodNotAllowedException(); } @@ -480,8 +474,7 @@ public function delete($id = null, $cascade = true) } - private function _rewritePostData() - { + private function _rewritePostData() { /* why we need this function? The problem is, may be a user want to save the downtime for more that one hast. the array we get from $this->reuqest->data looks like this: array( @@ -539,7 +532,7 @@ private function _rewritePostData() ) */ - if(empty($this->request->data('Systemdowntime.object_id'))){ + if (empty($this->request->data('Systemdowntime.object_id'))) { return [$this->request->data]; } $return = []; diff --git a/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php b/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php index c7cb35c290..53ecef18db 100644 --- a/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php +++ b/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php @@ -25,8 +25,7 @@ namespace itnovum\openITCOCKPIT\InitialDatabase; -class Systemsetting extends Importer -{ +class Systemsetting extends Importer { /** * @property \Systemsetting $Model */ @@ -34,11 +33,10 @@ class Systemsetting extends Importer /** * @return bool */ - public function import() - { + public function import() { $data = $this->getData(); foreach ($data as $record) { - if(isset($record['Systemsetting']['id'])){ + if (isset($record['Systemsetting']['id'])) { unset($record['Systemsetting']['id']); } if (!$this->exists($record['Systemsetting']['key'])) { @@ -50,9 +48,8 @@ public function import() return true; } - public function exists($key) - { - $record = $this->Model->find('first', [ + public function exists($key) { + $record = $this->Model->find('first',[ 'conditions' => [ 'Systemsetting.key' => $key, ], @@ -64,647 +61,646 @@ public function exists($key) /** * @return array */ - public function getData() - { + public function getData() { $data = [ [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.SOCKET', - 'value' => '/usr/share/openitcockpit/app/run/', - 'info' => 'Path where the sudo server will try to create its socket file', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.SOCKET', + 'value' => '/usr/share/openitcockpit/app/run/', + 'info' => 'Path where the sudo server will try to create its socket file', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.SOCKET_NAME', - 'value' => 'sudo.sock', - 'info' => 'Sudoservers socket name', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.SOCKET_NAME', + 'value' => 'sudo.sock', + 'info' => 'Sudoservers socket name', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.SOCKETPERMISSIONS', - 'value' => '49588', - 'info' => 'Permissions of the socket file', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.SOCKETPERMISSIONS', + 'value' => '49588', + 'info' => 'Permissions of the socket file', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.FOLDERPERMISSIONS', - 'value' => '16877', - 'info' => 'Permissions of the socket folder', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.FOLDERPERMISSIONS', + 'value' => '16877', + 'info' => 'Permissions of the socket folder', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.API_KEY', - 'value' => '1fea123e07f730f76e661bced33a94152378611e', - 'info' => 'API key for the sudoserver socket API', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.API_KEY', + 'value' => '1fea123e07f730f76e661bced33a94152378611e', + 'info' => 'API key for the sudoserver socket API', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.WORKERSOCKET_NAME', - 'value' => 'worker.sock', - 'info' => 'Sudoservers worker socket name', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.WORKERSOCKET_NAME', + 'value' => 'worker.sock', + 'info' => 'Sudoservers worker socket name', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.WORKERSOCKETPERMISSIONS', - 'value' => '49588', - 'info' => 'Permissions of the worker socket file', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.WORKERSOCKETPERMISSIONS', + 'value' => '49588', + 'info' => 'Permissions of the worker socket file', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.RESPONSESOCKET_NAME', - 'value' => 'response.sock', - 'info' => 'Sudoservers worker socket name', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.RESPONSESOCKET_NAME', + 'value' => 'response.sock', + 'info' => 'Sudoservers worker socket name', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'SUDO_SERVER.RESPONSESOCKETPERMISSIONS', - 'value' => '49588', - 'info' => 'Permissions of the worker socket file', - 'section' => 'SUDO_SERVER' + 'key' => 'SUDO_SERVER.RESPONSESOCKETPERMISSIONS', + 'value' => '49588', + 'info' => 'Permissions of the worker socket file', + 'section' => 'SUDO_SERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'WEBSERVER.USER', - 'value' => 'www-data', - 'info' => 'Username of the webserver', - 'section' => 'WEBSERVER' + 'key' => 'WEBSERVER.USER', + 'value' => 'www-data', + 'info' => 'Username of the webserver', + 'section' => 'WEBSERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'WEBSERVER.GROUP', - 'value' => 'www-data', - 'info' => 'Usergroup of the webserver', - 'section' => 'WEBSERVER' + 'key' => 'WEBSERVER.GROUP', + 'value' => 'www-data', + 'info' => 'Usergroup of the webserver', + 'section' => 'WEBSERVER' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.USER', - 'value' => 'nagios', - 'info' => 'The user of your monitoring system', - 'section' => 'MONITORING' + 'key' => 'MONITORING.USER', + 'value' => 'nagios', + 'info' => 'The user of your monitoring system', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.GROUP', - 'value' => 'nagios', - 'info' => 'The group of your monitoring system', - 'section' => 'MONITORING' + 'key' => 'MONITORING.GROUP', + 'value' => 'nagios', + 'info' => 'The group of your monitoring system', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.FROM_ADDRESS', - 'value' => 'foo@example.org', - 'info' => 'Sender mail address for notifications', - 'section' => 'MONITORING' + 'key' => 'MONITORING.FROM_ADDRESS', + 'value' => 'foo@example.org', + 'info' => 'Sender mail address for notifications', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.FROM_NAME', - 'value' => 'openITCOCKPIT Notification', - 'info' => 'The name we should display in your mail client', - 'section' => 'MONITORING' + 'key' => 'MONITORING.FROM_NAME', + 'value' => 'openITCOCKPIT Notification', + 'info' => 'The name we should display in your mail client', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.MESSAGE_HEADER', - 'value' => '**** openITCOCKPIT notification by it-novum GmbH ****', - 'info' => 'The header in the plain text mail', - 'section' => 'MONITORING' + 'key' => 'MONITORING.MESSAGE_HEADER', + 'value' => '**** openITCOCKPIT notification by it-novum GmbH ****', + 'info' => 'The header in the plain text mail', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.ACK_RECEIVER_SERVER', - 'value' => 'imap.gmail.com:993/imap/ssl', - 'info' => 'Email server to connect. Must be provided in following format: server.com:port/imap[/ssl]', - 'section' => 'MONITORING' + 'key' => 'MONITORING.ACK_RECEIVER_SERVER', + 'value' => 'imap.gmail.com:993/imap/ssl', + 'info' => 'Email server to connect. Must be provided in following format: server.com:port/imap[/ssl]', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.ACK_RECEIVER_ADDRESS', - 'value' => 'my_email@gmail.com', - 'info' => 'Username for sender notification mail', - 'section' => 'MONITORING' + 'key' => 'MONITORING.ACK_RECEIVER_ADDRESS', + 'value' => 'my_email@gmail.com', + 'info' => 'Username for sender notification mail', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.ACK_RECEIVER_PASSWORD', - 'value' => 'my_password', - 'info' => 'Password for sender notification mail', - 'section' => 'MONITORING' + 'key' => 'MONITORING.ACK_RECEIVER_PASSWORD', + 'value' => 'my_password', + 'info' => 'Password for sender notification mail', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.CMD', - 'value' => '/opt/openitc/nagios/var/rw/nagios.cmd', - 'info' => 'The command pipe for your monitoring system', - 'section' => 'MONITORING' + 'key' => 'MONITORING.CMD', + 'value' => '/opt/openitc/nagios/var/rw/nagios.cmd', + 'info' => 'The command pipe for your monitoring system', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.HOST.INITSTATE', - 'value' => 'u', - 'info' => 'Host initial state [o,d,u]', - 'section' => 'MONITORING' + 'key' => 'MONITORING.HOST.INITSTATE', + 'value' => 'u', + 'info' => 'Host initial state [o,d,u]', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.SERVICE.INITSTATE', - 'value' => 'u', - 'info' => 'Service initial state [o,w,u,c]', - 'section' => 'MONITORING' + 'key' => 'MONITORING.SERVICE.INITSTATE', + 'value' => 'u', + 'info' => 'Service initial state [o,w,u,c]', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.RESTART', - 'value' => 'service nagios restart', - 'info' => 'Command to restart your monitoring software', - 'section' => 'MONITORING' + 'key' => 'MONITORING.RESTART', + 'value' => 'service nagios restart', + 'info' => 'Command to restart your monitoring software', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.RELOAD', - 'value' => 'service nagios reload', - 'info' => 'Command to reload your monitoring software', - 'section' => 'MONITORING' + 'key' => 'MONITORING.RELOAD', + 'value' => 'service nagios reload', + 'info' => 'Command to reload your monitoring software', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.STOP', - 'value' => 'service nagios stop', - 'info' => 'Command to stop your monitoring software', - 'section' => 'MONITORING' + 'key' => 'MONITORING.STOP', + 'value' => 'service nagios stop', + 'info' => 'Command to stop your monitoring software', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.START', - 'value' => 'service nagios start', - 'info' => 'Command to start your monitoring software', - 'section' => 'MONITORING' + 'key' => 'MONITORING.START', + 'value' => 'service nagios start', + 'info' => 'Command to start your monitoring software', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.STATUS', - 'value' => 'service nagios status', - 'info' => 'Command to query the status of your monitoring software', - 'section' => 'MONITORING' + 'key' => 'MONITORING.STATUS', + 'value' => 'service nagios status', + 'info' => 'Command to query the status of your monitoring software', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.CORECONFIG', - 'value' => '/etc/openitcockpit/nagios.cfg', - 'info' => 'Path to monitoring core configuration file', - 'section' => 'MONITORING' + 'key' => 'MONITORING.CORECONFIG', + 'value' => '/etc/openitcockpit/nagios.cfg', + 'info' => 'Path to monitoring core configuration file', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.STATUS_DAT', - 'value' => '/opt/openitc/nagios/var/status.dat', - 'info' => 'Path to the status.dat of the monitoring system', - 'section' => 'MONITORING' + 'key' => 'MONITORING.STATUS_DAT', + 'value' => '/opt/openitc/nagios/var/status.dat', + 'info' => 'Path to the status.dat of the monitoring system', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.FRESHNESS_THRESHOLD_ADDITION', - 'value' => '300', - 'info' => 'Value in seconds that get added to the service check interval for passive services, before the monitoring system will fire up the freshness check', - 'section' => 'MONITORING' + 'key' => 'MONITORING.FRESHNESS_THRESHOLD_ADDITION', + 'value' => '300', + 'info' => 'Value in seconds that get added to the service check interval for passive services, before the monitoring system will fire up the freshness check', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.AFTER_EXPORT', - 'value' => '#echo 1', - 'info' => 'A command that get executed on each export (Notice: this command runs as root, so be careful)', - 'section' => 'MONITORING' + 'key' => 'MONITORING.AFTER_EXPORT', + 'value' => '#echo 1', + 'info' => 'A command that get executed on each export (Notice: this command runs as root, so be careful)', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.SINGLE_INSTANCE_SYNC', - 'value' => '0', - 'info' => 'If enabled, you can select which openITCOCKPIT instance you like to push the new configuration to. If disabled all instances will be synchronized', - 'section' => 'MONITORING', + 'key' => 'MONITORING.SINGLE_INSTANCE_SYNC', + 'value' => '0', + 'info' => 'If enabled, you can select which openITCOCKPIT instance you like to push the new configuration to. If disabled all instances will be synchronized', + 'section' => 'MONITORING', ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.QUERY_HANDLER', - 'value' => '/opt/openitc/nagios/var/rw/nagios.qh', - 'info' => 'Path to the query handler of your monitoring engine', - 'section' => 'MONITORING' + 'key' => 'MONITORING.QUERY_HANDLER', + 'value' => '/opt/openitc/nagios/var/rw/nagios.qh', + 'info' => 'Path to the query handler of your monitoring engine', + 'section' => 'MONITORING' ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.HOST_CHECK_ACTIVE_DEFAULT', - 'value' => '1', - 'info' => 'If enabled, new host templates will have active_checks enabled by default', - 'section' => 'MONITORING', + 'key' => 'MONITORING.HOST_CHECK_ACTIVE_DEFAULT', + 'value' => '1', + 'info' => 'If enabled, new host templates will have active_checks enabled by default', + 'section' => 'MONITORING', ], ], [ 'Systemsetting' => [ - 'key' => 'MONITORING.SERVICE_CHECK_ACTIVE_DEFAULT', - 'value' => '1', - 'info' => 'If enabled, new service templates will have active_checks enabled by default', - 'section' => 'MONITORING', + 'key' => 'MONITORING.SERVICE_CHECK_ACTIVE_DEFAULT', + 'value' => '1', + 'info' => 'If enabled, new service templates will have active_checks enabled by default', + 'section' => 'MONITORING', ], ], [ 'Systemsetting' => [ - 'key' => 'SYSTEM.ADDRESS', - 'value' => '127.0.0.1', - 'info' => 'The IP address or FQDN of the system', - 'section' => 'SYSTEM' + 'key' => 'SYSTEM.ADDRESS', + 'value' => '127.0.0.1', + 'info' => 'The IP address or FQDN of the system', + 'section' => 'SYSTEM' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SYSTEMNAME', - 'value' => 'openITCOCKPIT', - 'info' => 'The name of your system', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SYSTEMNAME', + 'value' => 'openITCOCKPIT', + 'info' => 'The name of your system', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SHOW_EXPORT_RUNNING', - 'value' => 'yes', - 'info' => 'Show if an export is running in headarea', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SHOW_EXPORT_RUNNING', + 'value' => 'yes', + 'info' => 'Show if an export is running in headarea', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.MASTER_INSTANCE', - 'value' => 'Mastersystem', - 'info' => 'The name of your openITCOCKPIT main instance', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.MASTER_INSTANCE', + 'value' => 'Mastersystem', + 'info' => 'The name of your openITCOCKPIT main instance', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.AUTH_METHOD', - 'value' => 'session', - 'info' => 'The authentication method that shoud be used for login', - 'section' => 'FRONTEND', + 'key' => 'FRONTEND.AUTH_METHOD', + 'value' => 'session', + 'info' => 'The authentication method that shoud be used for login', + 'section' => 'FRONTEND', ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.TYPE', - 'value' => 'adldap', - 'info' => 'LDAP server type', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.TYPE', + 'value' => 'adldap', + 'info' => 'LDAP server type', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.ADDRESS', - 'value' => '192.168.1.10', - 'info' => 'The address or hostname of your LDAP server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.ADDRESS', + 'value' => '192.168.1.10', + 'info' => 'The address or hostname of your LDAP server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.PORT', - 'value' => '389', - 'info' => 'The port where your LDAP server is listen to. Notice: If you want to use TLS the default port 389 shoud work as well! (SSL default Port is 636)', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.PORT', + 'value' => '389', + 'info' => 'The port where your LDAP server is listen to. Notice: If you want to use TLS the default port 389 shoud work as well! (SSL default Port is 636)', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.QUERY', - 'value' => '(&(objectClass=user)(samaccounttype=805306368)(objectCategory=person)(cn=*))', - 'info' => 'Your Filter Query', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.QUERY', + 'value' => '(&(objectClass=user)(samaccounttype=805306368)(objectCategory=person)(cn=*))', + 'info' => 'Your Filter Query', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.BASEDN', - 'value' => 'DC=example,DC=org', - 'info' => 'Your BASEDN', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.BASEDN', + 'value' => 'DC=example,DC=org', + 'info' => 'Your BASEDN', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.USERNAME', - 'value' => 'administrator', - 'info' => 'The username that the system will use to connect to your LDAP server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.USERNAME', + 'value' => 'administrator', + 'info' => 'The username that the system will use to connect to your LDAP server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.PASSWORD', - 'value' => 'Testing123!', - 'info' => 'The password that the system will use to connect to your LDAP server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.PASSWORD', + 'value' => 'Testing123!', + 'info' => 'The password that the system will use to connect to your LDAP server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.SUFFIX', - 'value' => '@example.org', - 'info' => 'The Suffix of your domain', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.SUFFIX', + 'value' => '@example.org', + 'info' => 'The Suffix of your domain', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.LDAP.USE_TLS', - 'value' => '1', - 'info' => 'If PHP should upgrade the security of a plain connection to a TLS encrypted connection', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.LDAP.USE_TLS', + 'value' => '1', + 'info' => 'If PHP should upgrade the security of a plain connection to a TLS encrypted connection', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SSO.CLIENT_ID', - 'value' => 'my_client_id', - 'info' => 'Client id generated in SSO Server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SSO.CLIENT_ID', + 'value' => 'my_client_id', + 'info' => 'Client id generated in SSO Server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SSO.CLIENT_SECRET', - 'value' => 'some_client_password', - 'info' => 'Client secret generated in SSO Server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SSO.CLIENT_SECRET', + 'value' => 'some_client_password', + 'info' => 'Client secret generated in SSO Server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SSO.AUTH_ENDPOINT', - 'value' => 'https://sso.server.com/authorization.oauth2', - 'info' => 'Authorization endpoint of SSO Server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SSO.AUTH_ENDPOINT', + 'value' => 'https://sso.server.com/authorization.oauth2', + 'info' => 'Authorization endpoint of SSO Server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SSO.TOKEN_ENDPOINT', - 'value' => 'https://sso.server.com/token.oauth2', - 'info' => 'Token endpoint of SSO Server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SSO.TOKEN_ENDPOINT', + 'value' => 'https://sso.server.com/token.oauth2', + 'info' => 'Token endpoint of SSO Server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SSO.USER_ENDPOINT', - 'value' => 'https://sso.server.com/userinfo.oauth2', - 'info' => 'User info endpoint of SSO Server', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SSO.USER_ENDPOINT', + 'value' => 'https://sso.server.com/userinfo.oauth2', + 'info' => 'User info endpoint of SSO Server', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SSO.NO_EMAIL_MESSAGE', - 'value' => 'Email address not found. Please contact your administrator', - 'info' => 'The error message that appears when provided E-mail address was not found in openITCOCKPIT', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SSO.NO_EMAIL_MESSAGE', + 'value' => 'Email address not found. Please contact your administrator', + 'info' => 'The error message that appears when provided E-mail address was not found in openITCOCKPIT', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.SSO.LOG_OFF_LINK', - 'value' => 'https://sso.server.com/sso/logoff', - 'info' => 'SSO Server log out link', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.SSO.LOG_OFF_LINK', + 'value' => 'https://sso.server.com/sso/logoff', + 'info' => 'SSO Server log out link', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.CERT.DEFAULT_USER_EMAIL', - 'value' => 'default.user@email.de', - 'info' => 'Default user E-mail address to be used if no E-mail address was found during the login with certificate', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.CERT.DEFAULT_USER_EMAIL', + 'value' => 'default.user@email.de', + 'info' => 'Default user E-mail address to be used if no E-mail address was found during the login with certificate', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.HIDDEN_USER_IN_CHANGELOG', - 'value' => '0', - 'info' => 'Hide the user name in the change log due to privacy reasons', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.HIDDEN_USER_IN_CHANGELOG', + 'value' => '0', + 'info' => 'Hide the user name in the change log due to privacy reasons', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'FRONTEND.PRESELECTED_DOWNTIME_OPTION', - 'value' => '0', - 'info' => 'Set preselected Host downtime options individual', - 'section' => 'FRONTEND' + 'key' => 'FRONTEND.PRESELECTED_DOWNTIME_OPTION', + 'value' => '0', + 'info' => 'Set preselected Host downtime options individual', + 'section' => 'FRONTEND' ], ], [ 'Systemsetting' => [ - 'key' => 'CHECK_MK.BIN', - 'value' => '/opt/openitc/nagios/3rd/check_mk/bin/check_mk', - 'info' => 'Path to check_mk binary', - 'section' => 'CHECK_MK' + 'key' => 'CHECK_MK.BIN', + 'value' => '/opt/openitc/nagios/3rd/check_mk/bin/check_mk', + 'info' => 'Path to check_mk binary', + 'section' => 'CHECK_MK' ], ], [ 'Systemsetting' => [ - 'key' => 'CHECK_MK.MATCH', - 'value' => '(perl|dsmc|java|ksh|VBoxHeadless)', - 'info' => 'These are the services that should not be compressed by check_mk as regular expression', - 'section' => 'CHECK_MK' + 'key' => 'CHECK_MK.MATCH', + 'value' => '(perl|dsmc|java|ksh|VBoxHeadless)', + 'info' => 'These are the services that should not be compressed by check_mk as regular expression', + 'section' => 'CHECK_MK' ], ], [ 'Systemsetting' => [ - 'key' => 'CHECK_MK.ETC', - 'value' => '/opt/openitc/nagios/3rd/check_mk/etc/', - 'info' => 'Path to Check_MK confi files', - 'section' => 'CHECK_MK' + 'key' => 'CHECK_MK.ETC', + 'value' => '/opt/openitc/nagios/3rd/check_mk/etc/', + 'info' => 'Path to Check_MK confi files', + 'section' => 'CHECK_MK' ], ], [ 'Systemsetting' => [ - 'key' => 'CHECK_MK.VAR', - 'value' => '/opt/openitc/nagios/3rd/check_mk/var/', - 'info' => 'Path to Check_MK variable files', - 'section' => 'CHECK_MK' + 'key' => 'CHECK_MK.VAR', + 'value' => '/opt/openitc/nagios/3rd/check_mk/var/', + 'info' => 'Path to Check_MK variable files', + 'section' => 'CHECK_MK' ], ], [ 'Systemsetting' => [ - 'key' => 'CHECK_MK.ACTIVE_CHECK', - 'value' => 'CHECK_MK_ACTIVE', - 'info' => 'The name of the check_mk active check service template', - 'section' => 'CHECK_MK' + 'key' => 'CHECK_MK.ACTIVE_CHECK', + 'value' => 'CHECK_MK_ACTIVE', + 'info' => 'The name of the check_mk active check service template', + 'section' => 'CHECK_MK' ], ], [ 'Systemsetting' => [ - 'key' => 'ARCHIVE.AGE.SERVICECHECKS', - 'value' => '2', - 'info' => 'Time in weeks how long service check results will be stored', - 'section' => 'ARCHIVE' + 'key' => 'ARCHIVE.AGE.SERVICECHECKS', + 'value' => '2', + 'info' => 'Time in weeks how long service check results will be stored', + 'section' => 'ARCHIVE' ], ], [ 'Systemsetting' => [ - 'key' => 'ARCHIVE.AGE.HOSTCHECKS', - 'value' => '2', - 'info' => 'Time in weeks how long host check results will be stored', - 'section' => 'ARCHIVE' + 'key' => 'ARCHIVE.AGE.HOSTCHECKS', + 'value' => '2', + 'info' => 'Time in weeks how long host check results will be stored', + 'section' => 'ARCHIVE' ], ], [ 'Systemsetting' => [ - 'key' => 'ARCHIVE.AGE.STATEHISTORIES', - 'value' => '53', - 'info' => 'Time in weeks how long state change events will be stored', - 'section' => 'ARCHIVE' + 'key' => 'ARCHIVE.AGE.STATEHISTORIES', + 'value' => '53', + 'info' => 'Time in weeks how long state change events will be stored', + 'section' => 'ARCHIVE' ], ], [ 'Systemsetting' => [ - 'key' => 'ARCHIVE.AGE.LOGENTRIES', - 'value' => '2', - 'info' => 'Time in weeks how long logentries will be stored', - 'section' => 'ARCHIVE' + 'key' => 'ARCHIVE.AGE.LOGENTRIES', + 'value' => '2', + 'info' => 'Time in weeks how long logentries will be stored', + 'section' => 'ARCHIVE' ], ], [ 'Systemsetting' => [ - 'key' => 'ARCHIVE.AGE.NOTIFICATIONS', - 'value' => '2', - 'info' => 'Time in weeks how long notifications will be stored (keep eq to CONTACTNOTIFICATIONS AND CONTACTNOTIFICATIONMETHODS)', - 'section' => 'ARCHIVE' + 'key' => 'ARCHIVE.AGE.NOTIFICATIONS', + 'value' => '2', + 'info' => 'Time in weeks how long notifications will be stored (keep eq to CONTACTNOTIFICATIONS AND CONTACTNOTIFICATIONMETHODS)', + 'section' => 'ARCHIVE' ], ], [ 'Systemsetting' => [ - 'key' => 'ARCHIVE.AGE.CONTACTNOTIFICATIONS', - 'value' => '2', - 'info' => 'Time in weeks how long contactnotifications will be stored (keep eq to NOTIFICATIONS AND CONTACTNOTIFICATIONMETHODS)', - 'section' => 'ARCHIVE' + 'key' => 'ARCHIVE.AGE.CONTACTNOTIFICATIONS', + 'value' => '2', + 'info' => 'Time in weeks how long contactnotifications will be stored (keep eq to NOTIFICATIONS AND CONTACTNOTIFICATIONMETHODS)', + 'section' => 'ARCHIVE' ], ], [ 'Systemsetting' => [ - 'key' => 'ARCHIVE.AGE.CONTACTNOTIFICATIONMETHODS', - 'value' => '2', - 'info' => 'Time in weeks how long contactnotificationmethods will be stored (keep eq to NOTIFICATIONS AND CONTACTNOTIFICATIONS)', - 'section' => 'ARCHIVE' + 'key' => 'ARCHIVE.AGE.CONTACTNOTIFICATIONMETHODS', + 'value' => '2', + 'info' => 'Time in weeks how long contactnotificationmethods will be stored (keep eq to NOTIFICATIONS AND CONTACTNOTIFICATIONS)', + 'section' => 'ARCHIVE' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.SUDO_SERVER_STATUS', - 'value' => 'service sudo_server status', - 'info' => 'Command to query the status of your sudo_server', - 'section' => 'INIT' + 'key' => 'INIT.SUDO_SERVER_STATUS', + 'value' => 'service sudo_server status', + 'info' => 'Command to query the status of your sudo_server', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.GEARMAN_WORKER_STATUS', - 'value' => 'service gearman_worker status', - 'info' => 'Command to query the status of gearman_worker', - 'section' => 'INIT' + 'key' => 'INIT.GEARMAN_WORKER_STATUS', + 'value' => 'service gearman_worker status', + 'info' => 'Command to query the status of gearman_worker', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.OITC_CMD_STATUS', - 'value' => 'service oitc_cmd status', - 'info' => 'Command to query the status of your oitc_cmd', - 'section' => 'INIT' + 'key' => 'INIT.OITC_CMD_STATUS', + 'value' => 'service oitc_cmd status', + 'info' => 'Command to query the status of your oitc_cmd', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.NPCD_STATUS', - 'value' => 'service npcd status', - 'info' => 'Command to query the status of your NPCD', - 'section' => 'INIT' + 'key' => 'INIT.NPCD_STATUS', + 'value' => 'service npcd status', + 'info' => 'Command to query the status of your NPCD', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.NDO_STATUS', - 'value' => 'service ndo status', - 'info' => 'Command to query the status of your NDOUtils', - 'section' => 'INIT' + 'key' => 'INIT.NDO_STATUS', + 'value' => 'service ndo status', + 'info' => 'Command to query the status of your NDOUtils', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.STATUSENIGNE_STATUS', - 'value' => 'service statusengine status', - 'info' => 'Command to query the status of your statusengine', - 'section' => 'INIT' + 'key' => 'INIT.STATUSENIGNE_STATUS', + 'value' => 'service statusengine status', + 'info' => 'Command to query the status of your statusengine', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.GEARMAN_JOB_SERVER_STATUS', - 'value' => 'service gearman-job-server status', - 'info' => 'Command to query the status of gearman-job-server', - 'section' => 'INIT' + 'key' => 'INIT.GEARMAN_JOB_SERVER_STATUS', + 'value' => 'service gearman-job-server status', + 'info' => 'Command to query the status of gearman-job-server', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'INIT.PHPNSTA_STATUS', - 'value' => 'service phpNSTA status', - 'info' => 'Command to query the status of phpNSTA', - 'section' => 'INIT' + 'key' => 'INIT.PHPNSTA_STATUS', + 'value' => 'service phpNSTA status', + 'info' => 'Command to query the status of phpNSTA', + 'section' => 'INIT' ], ], [ 'Systemsetting' => [ - 'key' => 'TICKET_SYSTEM.URL', - 'value' => '', - 'info' => 'Link to the ticket system', - 'section' => 'TICKET_SYSTEM' + 'key' => 'TICKET_SYSTEM.URL', + 'value' => '', + 'info' => 'Link to the ticket system', + 'section' => 'TICKET_SYSTEM' ], ], ]; From 6acb110da0f1b1d7b08a0697d58b70ffae483184 Mon Sep 17 00:00:00 2001 From: timo08 Date: Thu, 7 Sep 2017 16:04:59 +0200 Subject: [PATCH 04/30] Set preselect option for Host downtime options in host mass change ITC-1395 --- app/Controller/HostsController.php | 3 +++ app/View/Hosts/index.ctp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Controller/HostsController.php b/app/Controller/HostsController.php index 1fbc98ff3c..28292ad049 100644 --- a/app/Controller/HostsController.php +++ b/app/Controller/HostsController.php @@ -281,6 +281,9 @@ public function index() { $this->set('QueryHandler',new QueryHandler($this->Systemsetting->getQueryHandlerPath())); $this->set('masterInstance',$this->Systemsetting->getMasterInstanceName()); + $preselectedDowntimetype = $this->Systemsetting->findByKey("FRONTEND.PRESELECTED_DOWNTIME_OPTION"); + $this->set('preselectedDowntimetype',$preselectedDowntimetype['Systemsetting']['value']); + $SatelliteNames = []; $ModuleManager = new ModuleManager('DistributeModule'); if ($ModuleManager->moduleExists()) { diff --git a/app/View/Hosts/index.ctp b/app/View/Hosts/index.ctp index 43caa057c1..03a476ba51 100644 --- a/app/View/Hosts/index.ctp +++ b/app/View/Hosts/index.ctp @@ -555,7 +555,7 @@ $this->Paginator->options(['url' => $this->params['named']]); 3 => __('Hosts and dependent Hosts (non-triggered)'), ]; ?> - Form->input('type', ['options' => $hostdowntimetyps, 'label' => __('Maintenance period for') . ':']) ?> + Form->input('type', ['options' => $hostdowntimetyps, 'label' => __('Maintenance period for') . ':', 'selected' => $preselectedDowntimetype]) ?> Form->input('comment', ['value' => __('In progress'), 'label' => __('Comment') . ':']); ?> From 8845df5c8bc59d2cdf4b0b1526a63f46d9b0f72a Mon Sep 17 00:00:00 2001 From: Timo Triebensky <30630233+timo08@users.noreply.github.com> Date: Tue, 12 Sep 2017 12:37:20 +0200 Subject: [PATCH 05/30] Update Systemsetting.php delete automatic page refresh option --- .../openITCOCKPIT/InitialDatabase/Systemsetting.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php b/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php index 7775643c85..53ecef18db 100644 --- a/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php +++ b/app/src/itnovum/openITCOCKPIT/InitialDatabase/Systemsetting.php @@ -527,14 +527,6 @@ public function getData() { 'section' => 'FRONTEND' ], ], - [ - 'Systemsetting' => [ - 'key' => 'FRONTEND.AUTOMATIC_PAGE_REFRESH', - 'value' => '0', - 'info' => 'Set seconds for automatic site refresh, set 0 to turn off.', - 'section' => 'FRONTEND' - ], - ], [ 'Systemsetting' => [ 'key' => 'FRONTEND.PRESELECTED_DOWNTIME_OPTION', From 9d30176f5d1b2b51661c8a8795af76758cb653b2 Mon Sep 17 00:00:00 2001 From: m4ximum Date: Thu, 14 Sep 2017 14:37:00 +0200 Subject: [PATCH 06/30] [+]saving current state of containerdowntimes development ITC-1520 --- app/Console/Command/GearmanWorkerShell.php | 4 + app/Controller/SystemdowntimesController.php | 234 +++++++++++++----- .../NagiosModule/Model/Externalcommand.php | 27 ++ app/View/Downtimes/host.ctp | 5 + .../Systemdowntimes/add_containerdowntime.ctp | 176 +++++++++++++ 5 files changed, 381 insertions(+), 65 deletions(-) create mode 100644 app/View/Systemdowntimes/add_containerdowntime.ctp diff --git a/app/Console/Command/GearmanWorkerShell.php b/app/Console/Command/GearmanWorkerShell.php index 957bfbb212..f0e7b76476 100644 --- a/app/Console/Command/GearmanWorkerShell.php +++ b/app/Console/Command/GearmanWorkerShell.php @@ -503,6 +503,10 @@ public function runTask($job) { $this->Externalcommand->setServiceDowntime($payload); break; + case 'createContainerDowntime': + $this->Externalcommand->setContainerDowntime($payload); + break; + //Called by NagiosModule/CmdController/submit case 'cmd_external_command': $this->Externalcommand->runCmdCommand($payload); diff --git a/app/Controller/SystemdowntimesController.php b/app/Controller/SystemdowntimesController.php index 1081eb295e..426ea65d33 100755 --- a/app/Controller/SystemdowntimesController.php +++ b/app/Controller/SystemdowntimesController.php @@ -26,12 +26,11 @@ /** * @property Systemdowntime $Systemdowntime - * @property Host $Host - * @property Service $Service - * @property Hostgroup $Hostgroup + * @property Host $Host + * @property Service $Service + * @property Hostgroup $Hostgroup */ -class SystemdowntimesController extends AppController -{ +class SystemdowntimesController extends AppController { public $uses = [ 'Systemdowntime', 'Host', @@ -54,8 +53,7 @@ class SystemdowntimesController extends AppController ]; public $layout = 'Admin.default'; - public function index() - { + public function index() { $paginatorLimit = $this->Paginator->settings['limit']; $requestSettings = $this->Systemdowntime->listSettings($this->request, $paginatorLimit); @@ -70,34 +68,34 @@ public function index() $this->Paginator->settings = Hash::merge($this->Paginator->settings, $requestSettings['default']); $all_systemdowntimes = $this->Paginator->paginate(); - foreach($all_systemdowntimes as $dKey => $systemdowntime){ - switch($systemdowntime['Systemdowntime']['objecttype_id']){ + foreach ($all_systemdowntimes as $dKey => $systemdowntime) { + switch ($systemdowntime['Systemdowntime']['objecttype_id']) { case OBJECT_HOST: - if(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']] == WRITE_RIGHT){ + if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['Host']['container_id']] == WRITE_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = true; - }else{ + } else { $all_systemdowntimes[$dKey]['canDelete'] = false; } break; case OBJECT_SERVICE: - if(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']] == WRITE_RIGHT){ + if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['ServiceHost']['container_id']] == WRITE_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = true; - }else{ + } else { $all_systemdowntimes[$dKey]['canDelete'] = false; } break; case OBJECT_HOSTGROUP: - if(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == WRITE_RIGHT){ + if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == WRITE_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = true; - }elseif(isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && - $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == READ_RIGHT){ + } else if (isset($this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']]) && + $this->MY_RIGHTS_LEVEL[$systemdowntime['Hostgroup']['container_id']] == READ_RIGHT) { $all_systemdowntimes[$dKey]['canDelete'] = false; - }else{ + } else { unset($all_systemdowntimes[$dKey]); } break; @@ -113,8 +111,7 @@ public function index() $this->set('paginatorLimit', $paginatorLimit); } - public function addHostdowntime() - { + public function addHostdowntime() { $selected = $this->request->data('Systemdowntime.object_id'); $this->Frontend->setJson('dateformat', MY_DATEFORMAT); @@ -134,8 +131,8 @@ public function addHostdowntime() $containerIds = $this->Tree->resolveChildrenOfContainerIds($this->MY_RIGHTS); $writeContainerIds = []; - foreach($containerIds as $containerId){ - if(isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT){ + foreach ($containerIds as $containerId) { + if (isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT) { $writeContainerIds[] = $containerId; } @@ -153,19 +150,19 @@ public function addHostdowntime() $this->request->data = $this->_rewritePostData(); //Try validate the data: foreach ($this->request->data as $request) { - if($request['Systemdowntime']['is_recurring'] ){ + if ($request['Systemdowntime']['is_recurring']) { $this->Systemdowntime->validate = Hash::merge( $this->Systemdowntime->validate, [ 'from_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, - ], + ], ], - 'to_date' => [ + 'to_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ] ] @@ -187,13 +184,13 @@ public function addHostdowntime() $this->Systemdowntime->create(); $this->Systemdowntime->save($request); } else { - $start = strtotime($request['Systemdowntime']['from_date'].' '.$request['Systemdowntime']['from_time']); - $end = strtotime($request['Systemdowntime']['to_date'].' '.$request['Systemdowntime']['to_time']); + $start = strtotime($request['Systemdowntime']['from_date'] . ' ' . $request['Systemdowntime']['from_time']); + $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'host') { $host = $this->Host->find('first', [ - 'recursive' => -1, - 'fields' => [ + 'recursive' => -1, + 'fields' => [ 'Host.uuid' ], 'conditions' => [ @@ -224,8 +221,7 @@ public function addHostdowntime() } } - public function addHostgroupdowntime() - { + public function addHostgroupdowntime() { $this->Frontend->setJson('dateformat', MY_DATEFORMAT); $selected = $this->request->data('Systemdowntime.object_id'); @@ -244,8 +240,8 @@ public function addHostgroupdowntime() $containerIds = $this->Tree->resolveChildrenOfContainerIds($this->MY_RIGHTS); $writeContainerIds = []; - foreach($containerIds as $containerId){ - if(isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT){ + foreach ($containerIds as $containerId) { + if (isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT) { $writeContainerIds[] = $containerId; } @@ -261,19 +257,19 @@ public function addHostgroupdowntime() $this->request->data = $this->_rewritePostData(); //Try validate the data: foreach ($this->request->data as $request) { - if($request['Systemdowntime']['is_recurring']){ + if ($request['Systemdowntime']['is_recurring']) { $this->Systemdowntime->validate = Hash::merge( $this->Systemdowntime->validate, [ 'from_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ], ], - 'to_date' => [ + 'to_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ] ] @@ -291,12 +287,12 @@ public function addHostgroupdowntime() * Normal downtimes, will be sent to sudo_servers unix socket. */ - if($request['Systemdowntime']['is_recurring'] == 1) { + if ($request['Systemdowntime']['is_recurring'] == 1) { $this->Systemdowntime->create(); $this->Systemdowntime->save($request); } else { - $start = strtotime($request['Systemdowntime']['from_date'].' '.$request['Systemdowntime']['from_time']); - $end = strtotime($request['Systemdowntime']['to_date'].' '.$request['Systemdowntime']['to_time']); + $start = strtotime($request['Systemdowntime']['from_date'] . ' ' . $request['Systemdowntime']['from_time']); + $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'hostgroup') { $hostgroup = $this->Hostgroup->find('first', [ @@ -309,16 +305,16 @@ public function addHostgroupdowntime() ], ]); - $payload = [ + $payload = [ 'hostgroupUuid' => $hostgroup['Hostgroup']['uuid'], 'downtimetype' => $request['Systemdowntime']['downtimetype_id'], 'start' => $start, 'end' => $end, 'comment' => $request['Systemdowntime']['comment'], 'author' => $this->Auth->user('full_name'), - ]; + ]; - $this->GearmanClient->sendBackground('createHostgroupDowntime', $payload); + $this->GearmanClient->sendBackground('createHostgroupDowntime', $payload); } } @@ -335,8 +331,7 @@ public function addHostgroupdowntime() } } - public function addServicedowntime() - { + public function addServicedowntime() { $this->Frontend->setJson('dateformat', MY_DATEFORMAT); $selected = $this->request->data('Systemdowntime.object_id'); @@ -355,8 +350,8 @@ public function addServicedowntime() $containerIds = $this->Tree->resolveChildrenOfContainerIds($this->MY_RIGHTS); $writeContainerIds = []; - foreach($containerIds as $containerId){ - if(isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT){ + foreach ($containerIds as $containerId) { + if (isset($this->MY_RIGHTS_LEVEL[$containerId]) && $this->MY_RIGHTS_LEVEL[$containerId] == WRITE_RIGHT) { $writeContainerIds[] = $containerId; } @@ -376,19 +371,19 @@ public function addServicedowntime() $this->request->data = $this->_rewritePostData(); //Try validate the data: foreach ($this->request->data as $request) { - if($request['Systemdowntime']['is_recurring']){ + if ($request['Systemdowntime']['is_recurring']) { $this->Systemdowntime->validate = Hash::merge( $this->Systemdowntime->validate, [ 'from_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ], ], - 'to_date' => [ + 'to_date' => [ 'notBlank' => [ - 'required' => false, + 'required' => false, 'allowEmpty' => true, ] ] @@ -411,21 +406,21 @@ public function addServicedowntime() $this->Systemdowntime->create(); $this->Systemdowntime->save($request); } else { - $start = strtotime($request['Systemdowntime']['from_date'].' '.$request['Systemdowntime']['from_time']); - $end = strtotime($request['Systemdowntime']['to_date'].' '.$request['Systemdowntime']['to_time']); + $start = strtotime($request['Systemdowntime']['from_date'] . ' ' . $request['Systemdowntime']['from_time']); + $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'service') { $service = $this->Service->findById($request['Systemdowntime']['object_id']); $service = $this->Service->find('first', [ - 'recursive' => -1, - 'contain' => [ + 'recursive' => -1, + 'contain' => [ 'Host' => [ 'fields' => [ 'Host.uuid' ] ] ], - 'fields' => [ + 'fields' => [ 'Service.uuid' ], 'conditions' => [ @@ -457,8 +452,118 @@ public function addServicedowntime() } } - public function delete($id = null, $cascade = true) - { + public function addContainerdowntime() { + $this->Frontend->setJson('dateformat', MY_DATEFORMAT); + $selected = $this->request->data('Systemdowntime.object_id'); + + $customFildsToRefill = [ + 'Systemdowntime' => [ + 'from_date', + 'from_time', + 'to_date', + 'to_time', + 'is_recurring', + 'weekdays', + 'day_of_month' + ], + ]; + $this->CustomValidationErrors->checkForRefill($customFildsToRefill); + + $this->set('back_url', $this->referer()); + + if ($this->hasRootPrivileges === true) { + $containers = $this->Tree->easyPath($this->MY_RIGHTS,OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); + } else { + $containers = $this->Tree->easyPath($this->getWriteContainers(),OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); + } + + $this->set(compact('containers', 'selected')); + + + if ($this->request->is('post') || $this->request->is('put')) { + if (isset($this->request->data['Systemdowntime']['weekdays']) && is_array($this->request->data['Systemdowntime']['weekdays'])) { + $this->request->data['Systemdowntime']['weekdays'] = implode(',', $this->request->data['Systemdowntime']['weekdays']); + } + $this->request->data = $this->_rewritePostData(); + //Try validate the data: + foreach ($this->request->data as $request) { + if ($request['Systemdowntime']['is_recurring']) { + $this->Systemdowntime->validate = Hash::merge( + $this->Systemdowntime->validate, + [ + 'from_date' => [ + 'notBlank' => [ + 'required' => false, + 'allowEmpty' => true, + ], + ], + 'to_date' => [ + 'notBlank' => [ + 'required' => false, + 'allowEmpty' => true, + ] + ] + ] + ); + } + $this->Systemdowntime->set($request); + if ($this->Systemdowntime->validates()) { + /* The data is valide and we can save it. + * We need to use the foreach, becasue validates() cant handel saveAll() data :( + * + * How ever, at this point we passed the validation, so the data is valid. + * Now we need to check, if this is just a downtime, or an recurring downtime, because + * these guys we want to save in our systemdowntimestable + * Normal downtimes, will be sent to sudo_servers unix socket. + */ + + if ($request['Systemdowntime']['is_recurring'] == 1) { + $this->Systemdowntime->create(); + $this->Systemdowntime->save($request); + } else { + $start = strtotime($request['Systemdowntime']['from_date'] . ' ' . $request['Systemdowntime']['from_time']); + $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); + //Just a normal nagios downtime + if ($request['Systemdowntime']['downtimetype'] == 'container') { + $hostgroup = $this->Hostgroup->find('first', [ + 'recursive' => -1, + 'conditions' => [ + 'Hostgroup.id' => $request['Systemdowntime']['object_id'], + ], + 'fields' => [ + 'Hostgroup.uuid', + ], + ]); + + $payload = [ + 'hostgroupUuid' => $hostgroup['Hostgroup']['uuid'], + 'downtimetype' => $request['Systemdowntime']['downtimetype_id'], + 'start' => $start, + 'end' => $end, + 'comment' => $request['Systemdowntime']['comment'], + 'author' => $this->Auth->user('full_name'), + ]; + + $this->GearmanClient->sendBackground('createContainerDowntime', $payload); + } + } + + } else { + $this->setFlash(__('Downtime could not be saved'), false); + $this->CustomValidationErrors->loadModel($this->Systemdowntime); + $this->CustomValidationErrors->customFields(['from_date', 'from_time', 'to_date', 'to_time', 'downtimetype']); + $this->CustomValidationErrors->fetchErrors(); + return; + } + } + $this->setFlash(__('Downtime successfully saved')); + $this->redirect(['controller' => 'downtimes', 'action' => 'index']); + } + + } + + + public function delete($id = null, $cascade = true) { if (!$this->request->is('post')) { throw new MethodNotAllowedException(); } @@ -479,8 +584,7 @@ public function delete($id = null, $cascade = true) } - private function _rewritePostData() - { + private function _rewritePostData() { /* why we need this function? The problem is, may be a user want to save the downtime for more that one hast. the array we get from $this->reuqest->data looks like this: array( @@ -538,7 +642,7 @@ private function _rewritePostData() ) */ - if(empty($this->request->data('Systemdowntime.object_id'))){ + if (empty($this->request->data('Systemdowntime.object_id'))) { return [$this->request->data]; } $return = []; diff --git a/app/Plugin/NagiosModule/Model/Externalcommand.php b/app/Plugin/NagiosModule/Model/Externalcommand.php index b97f6133c1..f9a9f3f2bc 100644 --- a/app/Plugin/NagiosModule/Model/Externalcommand.php +++ b/app/Plugin/NagiosModule/Model/Externalcommand.php @@ -896,6 +896,33 @@ public function setServiceDowntime($options) $this->_write('SCHEDULE_SVC_DOWNTIME;'.$options['hostUuid'].';'.$options['serviceUuid'].';'.$options['start'].';'.$options['end'].';1;0;'.$options['duration'].';'.$options['author'].';'.$options['comment'].''); } + public function setContainerDowntime($options){ + $_options = [ + 'duration' => $options['end'] - $options['start'], + 'downtimetype' => 0, + ]; + + $options = Hash::merge($_options, $options); + + //@TODO get all hosts from container(s) + + + switch ($options['downtimetype']) { + case 0: + //Host only + + break; + case 1: + //Host inc services + + break; + default: + + break; + } + + } + /** * Create an external command to disable host or host + services notifications * ### Options diff --git a/app/View/Downtimes/host.ctp b/app/View/Downtimes/host.ctp index c53a4fa3dd..80120937b2 100644 --- a/app/View/Downtimes/host.ctp +++ b/app/View/Downtimes/host.ctp @@ -72,6 +72,11 @@ + Acl->hasPermission('addHostdowntime', 'systemdowntimes')): ?> +
  • + +
  • +
    Html->link(__('Filter'), 'javascript:', ['class' => 'oitc-list-filter btn btn-xs btn-primary toggle', 'hide-on-render' => 'true', 'icon' => 'fa fa-filter']); ?> diff --git a/app/View/Systemdowntimes/add_containerdowntime.ctp b/app/View/Systemdowntimes/add_containerdowntime.ctp new file mode 100644 index 0000000000..622f1b34d2 --- /dev/null +++ b/app/View/Systemdowntimes/add_containerdowntime.ctp @@ -0,0 +1,176 @@ + +// +// This file is dual licensed +// +// 1. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// + +// 2. +// If you purchased an openITCOCKPIT Enterprise Edition you can use this file +// under the terms of the openITCOCKPIT Enterprise Edition license agreement. +// License agreement and license key will be shipped with the order +// confirmation. +?> +
    +
    +

    + + + > + + +

    +
    +
    +
    + +
    +
    + +

    + +
    +
    +
    +
    +
    + Form->create('Systemdowntime', [ + 'class' => 'form-horizontal clear', + ]); + $containerdowntimetypes = [ + 0 => __('Hosts only'), + 1 => __('Hosts including services'), + ]; + + echo $this->CustomValidationErrors->errorHTML('downtimetype', ['class' => 'text-danger']); + echo $this->Form->input('objecttype_id', [ + 'type' => 'hidden', + 'value' => OBJECT_NODE, + ]); + echo $this->Form->input('downtimetype', [ + 'type' => 'hidden', + 'value' => 'hostgroup', + ]); + echo $this->Form->input('object_id', [ + 'options' => $containers, + 'selected' => $selected, + 'multiple' => true, + 'label' => ['text' => __('Container'), 'class' => 'col-xs-1 col-md-1 col-lg-1'], + 'class' => 'chosen col col-xs-12', + 'wrapInput' => 'col col-xs-10 col-md-10 col-lg-10', + ]); + echo $this->Form->input('downtimetype_id', [ + 'options' => $containerdowntimetypes, + 'label' => ['text' => __('Maintenance period for'), 'class' => 'col-xs-1 col-md-1 col-lg-1'], + 'class' => 'chosen col col-xs-12', + 'wrapInput' => 'col col-xs-10 col-md-10 col-lg-10', + ]); + echo $this->Form->input('comment', [ + 'value' => __('In maintenance'), + 'label' => ['text' => __('Comment'), 'class' => 'col-xs-1 col-md-1 col-lg-1'], + 'wrapInput' => 'col col-xs-10 col-md-10 col-lg-10', + ]); + + echo $this->Form->fancyCheckbox('is_recurring', [ + 'caption' => __('Recurring downtime'), + 'wrapGridClass' => 'col col-xs-1 no-padding', + 'captionGridClass' => 'col col-xs-1 col-md-1 col-lg-1 no-padding', + 'captionClass' => 'control-label text-left no-padding', + 'checked' => (bool)$this->CustomValidationErrors->refill('is_recurring', false), + ]); + ?> +
    + +
    + +
    + +
    + +
    + CustomValidationErrors->errorHTML('from_date'); ?> +
    +
    +
    + +
    + CustomValidationErrors->errorHTML('from_time'); ?> +
    +
    +
    + + + +
    + +
    + +
    + CustomValidationErrors->errorHTML('to_date'); ?> +
    +
    +
    + +
    + CustomValidationErrors->errorHTML('to_time'); ?> +
    +
    +
    +
    +
    + Form->formActions(); ?> +
    +
    +
    \ No newline at end of file From 74c1d79283942f89398301b8987e2f1093d10e5c Mon Sep 17 00:00:00 2001 From: m4ximum Date: Fri, 22 Sep 2017 13:22:11 +0200 Subject: [PATCH 07/30] [+]creating container downtimes working ITC-1520 [+]reformatted constants component --- .../Component/ConstantsComponent.php | 214 ++++++------ app/Controller/SystemdowntimesController.php | 54 +-- .../NagiosModule/Model/Externalcommand.php | 310 ++++++++++-------- .../Systemdowntimes/add_containerdowntime.ctp | 27 +- 4 files changed, 328 insertions(+), 277 deletions(-) diff --git a/app/Controller/Component/ConstantsComponent.php b/app/Controller/Component/ConstantsComponent.php index 4c13c54b34..d3ee9dc4d2 100644 --- a/app/Controller/Component/ConstantsComponent.php +++ b/app/Controller/Component/ConstantsComponent.php @@ -43,90 +43,90 @@ public function __construct() { $this->defines['monitoring'] = [ //Models - 'MONITORING_HOSTSTATUS' => $monitoring . 'Module.Hoststatus', - 'MONITORING_SERVICESTATUS' => $monitoring . 'Module.Servicestatus', - 'MONITORING_OBJECTS' => $monitoring . 'Module.Objects', - 'MONITORING_EXTERNALCOMMAND' => $monitoring . 'Module.Externalcommand', - 'MONITORING_DOWNTIME' => $monitoring . 'Module.Downtime', - 'MONITORING_LOGENTRY' => $monitoring . 'Module.Logentry', - 'MONITORING_NAGIOSTAT' => $monitoring . 'Module.Nagiostat', - 'MONITORING_NOTIFICATION' => $monitoring . 'Module.Notification', - 'MONITORING_NOTIFICATION_HOST' => $monitoring . 'Module.NotificationHost', - 'MONITORING_NOTIFICATION_SERVICE' => $monitoring . 'Module.NotificationService', - 'MONITORING_SERVICECHECK' => $monitoring . 'Module.Servicecheck', - 'MONITORING_STATEHISTORY_HOST' => $monitoring . 'Module.StatehistoryHost', - 'MONITORING_STATEHISTORY_SERVICE' => $monitoring . 'Module.StatehistoryService', - 'MONITORING_STATEHISTORY' => $monitoring . 'Module.Statehistory', - 'MONITORING_HOSTCHECK' => $monitoring . 'Module.Hostcheck', - 'MONITORING_ACKNOWLEDGED' => $monitoring . 'Module.Acknowledged', - 'MONITORING_ACKNOWLEDGED_HOST' => $monitoring . 'Module.AcknowledgedHost', - 'MONITORING_ACKNOWLEDGED_SERVICE' => $monitoring . 'Module.AcknowledgedService', - 'MONITORING_CONTACTNOTIFICATION' => $monitoring . 'Module.Contactnotification', + 'MONITORING_HOSTSTATUS' => $monitoring . 'Module.Hoststatus', + 'MONITORING_SERVICESTATUS' => $monitoring . 'Module.Servicestatus', + 'MONITORING_OBJECTS' => $monitoring . 'Module.Objects', + 'MONITORING_EXTERNALCOMMAND' => $monitoring . 'Module.Externalcommand', + 'MONITORING_DOWNTIME' => $monitoring . 'Module.Downtime', + 'MONITORING_LOGENTRY' => $monitoring . 'Module.Logentry', + 'MONITORING_NAGIOSTAT' => $monitoring . 'Module.Nagiostat', + 'MONITORING_NOTIFICATION' => $monitoring . 'Module.Notification', + 'MONITORING_NOTIFICATION_HOST' => $monitoring . 'Module.NotificationHost', + 'MONITORING_NOTIFICATION_SERVICE' => $monitoring . 'Module.NotificationService', + 'MONITORING_SERVICECHECK' => $monitoring . 'Module.Servicecheck', + 'MONITORING_STATEHISTORY_HOST' => $monitoring . 'Module.StatehistoryHost', + 'MONITORING_STATEHISTORY_SERVICE' => $monitoring . 'Module.StatehistoryService', + 'MONITORING_STATEHISTORY' => $monitoring . 'Module.Statehistory', + 'MONITORING_HOSTCHECK' => $monitoring . 'Module.Hostcheck', + 'MONITORING_ACKNOWLEDGED' => $monitoring . 'Module.Acknowledged', + 'MONITORING_ACKNOWLEDGED_HOST' => $monitoring . 'Module.AcknowledgedHost', + 'MONITORING_ACKNOWLEDGED_SERVICE' => $monitoring . 'Module.AcknowledgedService', + 'MONITORING_CONTACTNOTIFICATION' => $monitoring . 'Module.Contactnotification', 'MONITORING_CONTACTNOTIFICATIONMETHOD' => $monitoring . 'Module.Contactnotificationmethod', - 'MONITORING_PARENTHOST' => $monitoring . 'Module.Parenthost', - 'MONITORING_COMMENTHISTORY' => $monitoring . 'Module.Commenthistory', - 'MONITORING_FLAPPINGHISTORY' => $monitoring . 'Module.Flappinghistory', + 'MONITORING_PARENTHOST' => $monitoring . 'Module.Parenthost', + 'MONITORING_COMMENTHISTORY' => $monitoring . 'Module.Commenthistory', + 'MONITORING_FLAPPINGHISTORY' => $monitoring . 'Module.Flappinghistory', 'MONITORING_CORECONFIG_MODEL' => $monitoring . 'Module.Coreconfig', //Components - 'MONITORING_CORECONFIG' => $monitoring . 'Module.CoreConfig', + 'MONITORING_CORECONFIG' => $monitoring . 'Module.CoreConfig', ]; $this->define($this->defines['monitoring']); //Object definitions $this->defines['objects'] = [ - 'OBJECT_TENANT' => 1 << 0, - 'OBJECT_USER' => 1 << 1, - 'OBJECT_NODE' => 1 << 2, - 'OBJECT_LOCATION' => 1 << 3, - 'OBJECT_DEVICEGROUP' => 1 << 4, - 'OBJECT_CONTACT' => 1 << 5, - 'OBJECT_CONTACTGROUP' => 1 << 6, - 'OBJECT_TIMEPERIOD' => 1 << 7, - 'OBJECT_HOST' => 1 << 8, - 'OBJECT_HOSTTEMPLATE' => 1 << 9, - 'OBJECT_HOSTGROUP' => 1 << 10, - 'OBJECT_SERVICE' => 1 << 11, - 'OBJECT_SERVICETEMPLATE' => 1 << 12, - 'OBJECT_SERVICEGROUP' => 1 << 13, - 'OBJECT_COMMAND' => 1 << 14, - 'OBJECT_SATELLITE' => 1 << 15, + 'OBJECT_TENANT' => 1 << 0, + 'OBJECT_USER' => 1 << 1, + 'OBJECT_NODE' => 1 << 2, + 'OBJECT_LOCATION' => 1 << 3, + 'OBJECT_DEVICEGROUP' => 1 << 4, + 'OBJECT_CONTACT' => 1 << 5, + 'OBJECT_CONTACTGROUP' => 1 << 6, + 'OBJECT_TIMEPERIOD' => 1 << 7, + 'OBJECT_HOST' => 1 << 8, + 'OBJECT_HOSTTEMPLATE' => 1 << 9, + 'OBJECT_HOSTGROUP' => 1 << 10, + 'OBJECT_SERVICE' => 1 << 11, + 'OBJECT_SERVICETEMPLATE' => 1 << 12, + 'OBJECT_SERVICEGROUP' => 1 << 13, + 'OBJECT_COMMAND' => 1 << 14, + 'OBJECT_SATELLITE' => 1 << 15, 'OBJECT_SERVICETEMPLATEGROUP' => 1 << 16, - 'OBJECT_HOSTESCALATION' => 1 << 17, - 'OBJECT_SERVICEESCALATION' => 1 << 18, - 'OBJECT_HOSTDEPENDENCY' => 1 << 19, - 'OBJECT_SERVICEDEPENDENCY' => 1 << 20, - 'OBJECT_INSTANTREPORT' => 1 << 21, + 'OBJECT_HOSTESCALATION' => 1 << 17, + 'OBJECT_SERVICEESCALATION' => 1 << 18, + 'OBJECT_HOSTDEPENDENCY' => 1 << 19, + 'OBJECT_SERVICEDEPENDENCY' => 1 << 20, + 'OBJECT_INSTANTREPORT' => 1 << 21, ]; $this->define($this->defines['objects']); //Container type definitions $this->defines['container_types'] = [ - 'CT_GLOBAL' => 1, - 'CT_TENANT' => 2, - 'CT_LOCATION' => 3, - 'CT_DEVICEGROUP' => 4, - 'CT_NODE' => 5, - 'CT_CONTACTGROUP' => 6, - 'CT_HOSTGROUP' => 7, - 'CT_SERVICEGROUP' => 8, + 'CT_GLOBAL' => 1, + 'CT_TENANT' => 2, + 'CT_LOCATION' => 3, + 'CT_DEVICEGROUP' => 4, + 'CT_NODE' => 5, + 'CT_CONTACTGROUP' => 6, + 'CT_HOSTGROUP' => 7, + 'CT_SERVICEGROUP' => 8, 'CT_SERVICETEMPLATEGROUP' => 9, ]; $this->define($this->defines['container_types']); //Container definitions and properties $this->defines['containers'] = [ - "GLOBAL_CONTAINER" => [ - 'properties' => OBJECT_TENANT ^ OBJECT_USER ^ OBJECT_NODE ^ OBJECT_CONTACT ^ OBJECT_CONTACTGROUP ^ OBJECT_TIMEPERIOD ^ OBJECT_HOST ^ OBJECT_HOSTTEMPLATE ^ OBJECT_HOSTGROUP ^ OBJECT_SERVICE ^ OBJECT_SERVICETEMPLATE ^ OBJECT_SERVICEGROUP ^ OBJECT_SATELLITE ^ OBJECT_SERVICETEMPLATEGROUP ^ OBJECT_HOSTESCALATION ^ OBJECT_SERVICEESCALATION ^ OBJECT_HOSTDEPENDENCY ^ OBJECT_SERVICEDEPENDENCY ^ OBJECT_INSTANTREPORT, + "GLOBAL_CONTAINER" => [ + 'properties' => OBJECT_TENANT ^ OBJECT_USER ^ OBJECT_NODE ^ OBJECT_CONTACT ^ OBJECT_CONTACTGROUP ^ OBJECT_TIMEPERIOD ^ OBJECT_HOST ^ OBJECT_HOSTTEMPLATE ^ OBJECT_HOSTGROUP ^ OBJECT_SERVICE ^ OBJECT_SERVICETEMPLATE ^ OBJECT_SERVICEGROUP ^ OBJECT_SATELLITE ^ OBJECT_SERVICETEMPLATEGROUP ^ OBJECT_HOSTESCALATION ^ OBJECT_SERVICEESCALATION ^ OBJECT_HOSTDEPENDENCY ^ OBJECT_SERVICEDEPENDENCY ^ OBJECT_INSTANTREPORT, 'container_type' => CT_GLOBAL, ], - "TENANT_CONTAINER" => [ - 'properties' => OBJECT_USER ^ OBJECT_NODE ^ OBJECT_LOCATION ^ OBJECT_CONTACT ^ OBJECT_CONTACTGROUP ^ OBJECT_TIMEPERIOD ^ OBJECT_HOST ^ OBJECT_HOSTTEMPLATE ^ OBJECT_HOSTGROUP ^ OBJECT_SERVICE ^ OBJECT_SERVICETEMPLATE ^ OBJECT_SERVICEGROUP ^ OBJECT_SATELLITE ^ OBJECT_SERVICETEMPLATEGROUP ^ OBJECT_HOSTESCALATION ^ OBJECT_SERVICEESCALATION ^ OBJECT_HOSTDEPENDENCY ^ OBJECT_SERVICEDEPENDENCY ^ OBJECT_INSTANTREPORT, + "TENANT_CONTAINER" => [ + 'properties' => OBJECT_USER ^ OBJECT_NODE ^ OBJECT_LOCATION ^ OBJECT_CONTACT ^ OBJECT_CONTACTGROUP ^ OBJECT_TIMEPERIOD ^ OBJECT_HOST ^ OBJECT_HOSTTEMPLATE ^ OBJECT_HOSTGROUP ^ OBJECT_SERVICE ^ OBJECT_SERVICETEMPLATE ^ OBJECT_SERVICEGROUP ^ OBJECT_SATELLITE ^ OBJECT_SERVICETEMPLATEGROUP ^ OBJECT_HOSTESCALATION ^ OBJECT_SERVICEESCALATION ^ OBJECT_HOSTDEPENDENCY ^ OBJECT_SERVICEDEPENDENCY ^ OBJECT_INSTANTREPORT, 'container_type' => CT_TENANT, ], - "LOCATION_CONTAINER" => [ - 'properties' => OBJECT_NODE ^ OBJECT_SATELLITE, + "LOCATION_CONTAINER" => [ + 'properties' => OBJECT_NODE ^ OBJECT_SATELLITE, 'container_type' => CT_LOCATION, ], /*"DEVICEGROUP_CONTAINER" => [ @@ -137,24 +137,24 @@ public function __construct() { 'properties' => OBJECT_USER^OBJECT_NODE^OBJECT_LOCATION^OBJECT_CONTACT^OBJECT_CONTACTGROUP^OBJECT_TIMEPERIOD^OBJECT_HOST^OBJECT_HOSTTEMPLATE^OBJECT_HOSTGROUP^OBJECT_SERVICE^OBJECT_SERVICETEMPLATE^OBJECT_SERVICEGROUP, 'container_type' => CT_NODE ],*/ - "NODE_CONTAINER" => [ - 'properties' => OBJECT_USER ^ OBJECT_NODE ^ OBJECT_LOCATION ^ OBJECT_CONTACT ^ OBJECT_CONTACTGROUP ^ OBJECT_TIMEPERIOD ^ OBJECT_HOST ^ OBJECT_HOSTGROUP ^ OBJECT_SERVICEGROUP ^ OBJECT_SATELLITE ^ OBJECT_HOSTTEMPLATE ^ OBJECT_SERVICETEMPLATE ^ OBJECT_SERVICETEMPLATEGROUP ^ OBJECT_INSTANTREPORT, + "NODE_CONTAINER" => [ + 'properties' => OBJECT_USER ^ OBJECT_NODE ^ OBJECT_LOCATION ^ OBJECT_CONTACT ^ OBJECT_CONTACTGROUP ^ OBJECT_TIMEPERIOD ^ OBJECT_HOST ^ OBJECT_HOSTGROUP ^ OBJECT_SERVICEGROUP ^ OBJECT_SATELLITE ^ OBJECT_HOSTTEMPLATE ^ OBJECT_SERVICETEMPLATE ^ OBJECT_SERVICETEMPLATEGROUP ^ OBJECT_INSTANTREPORT, 'container_type' => CT_NODE, ], - "CONTACTGROUP_CONTAINER" => [ - 'properties' => OBJECT_CONTACT, + "CONTACTGROUP_CONTAINER" => [ + 'properties' => OBJECT_CONTACT, 'container_type' => CT_CONTACTGROUP, ], - "HOSTGROUP_CONTAINER" => [ - 'properties' => OBJECT_HOST, + "HOSTGROUP_CONTAINER" => [ + 'properties' => OBJECT_HOST, 'container_type' => CT_HOSTGROUP, ], - "SERVICEGROUP_CONTAINER" => [ - 'properties' => OBJECT_SERVICE, + "SERVICEGROUP_CONTAINER" => [ + 'properties' => OBJECT_SERVICE, 'container_type' => CT_SERVICEGROUP, ], "SERVICETEMPLATEGROUP_CONTAINER" => [ - 'properties' => OBJECT_SERVICETEMPLATE, + 'properties' => OBJECT_SERVICETEMPLATE, 'container_type' => CT_SERVICETEMPLATEGROUP, ], //"DEBUG_CONTAINER" => [ @@ -165,8 +165,8 @@ public function __construct() { //Command type definitions $this->defines['command_types'] = [ - "CHECK_COMMAND" => 1, - "HOSTCHECK_COMMAND" => 2, + "CHECK_COMMAND" => 1, + "HOSTCHECK_COMMAND" => 2, "NOTIFICATION_COMMAND" => 3, "EVENTHANDLER_COMMAND" => 4, ]; @@ -175,44 +175,44 @@ public function __construct() { //Service type definitions $this->defines['service_types'] = [ "GENERIC_SERVICE" => 1, // 2^0 - "EVK_SERVICE" => 2, // 2^1 - "SLA_SERVICE" => 4, - 'MK_SERVICE' => 8, + "EVK_SERVICE" => 2, // 2^1 + "SLA_SERVICE" => 4, + 'MK_SERVICE' => 8, ]; $this->define($this->defines['service_types']); //Host type definitions $this->defines['host_types'] = [ "GENERIC_HOST" => 1, // 2^0 - "EVK_HOST" => 2, // 2^1 - "SLA_HOST" => 4, + "EVK_HOST" => 2, // 2^1 + "SLA_HOST" => 4, ]; $this->define($this->defines['host_types']); //Servicetemplate type definitions $this->defines['hosttemplate_types'] = [ "GENERIC_HOSTTEMPLATE" => 1, // 2^0 - "EVK_HOSTTEMPLATE" => 2, // 2^1 - "SLA_HOSTTEMPLATE" => 4, + "EVK_HOSTTEMPLATE" => 2, // 2^1 + "SLA_HOSTTEMPLATE" => 4, ]; $this->define($this->defines['hosttemplate_types']); //Permission level definitions $this->defines['container_permission_levels'] = [ - 'READ_RIGHT' => 1 << 0, + 'READ_RIGHT' => 1 << 0, 'WRITE_RIGHT' => 1 << 1, ]; $this->define($this->defines['container_permission_levels']); $this->defines['modules'] = [ - 'AUTOREPORT_MODULE' => 1 << 0, + 'AUTOREPORT_MODULE' => 1 << 0, 'EVENTCORRELATION_MODULE' => 1 << 1, - 'DISTRIBUTE_MODULE' => 1 << 2, - 'IDOIT_MODULE' => 1 << 3, - 'MAP_MODULE' => 1 << 4, - 'MK_MODULE' => 1 << 5, - 'MASSENVERSAND_MODULE' => 1 << 6, - 'SAP_MODULE' => 1 << 7, + 'DISTRIBUTE_MODULE' => 1 << 2, + 'IDOIT_MODULE' => 1 << 3, + 'MAP_MODULE' => 1 << 4, + 'MK_MODULE' => 1 << 5, + 'MASSENVERSAND_MODULE' => 1 << 6, + 'SAP_MODULE' => 1 << 7, ]; $this->define($this->defines['modules']); } @@ -280,25 +280,25 @@ public function containerProperties($object = null, $exclude = []) { */ public function objectByModelName($modelName = '') { $objects = [ - 'Tenant' => OBJECT_TENANT, - 'User' => OBJECT_USER, - 'Container' => OBJECT_NODE, - 'Location' => OBJECT_LOCATION, + 'Tenant' => OBJECT_TENANT, + 'User' => OBJECT_USER, + 'Container' => OBJECT_NODE, + 'Location' => OBJECT_LOCATION, //'Devicegroup' => OBJECT_DEVICEGROUP, - 'Contact' => OBJECT_CONTACT, - 'Contactgroup' => OBJECT_CONTACTGROUP, - 'Timeperiod' => OBJECT_TIMEPERIOD, - 'Host' => OBJECT_HOST, - 'Hosttemplate' => OBJECT_HOSTTEMPLATE, - 'Hostgroup' => OBJECT_HOSTGROUP, - 'Service' => OBJECT_SERVICE, - 'Servicetemplate' => OBJECT_SERVICETEMPLATE, + 'Contact' => OBJECT_CONTACT, + 'Contactgroup' => OBJECT_CONTACTGROUP, + 'Timeperiod' => OBJECT_TIMEPERIOD, + 'Host' => OBJECT_HOST, + 'Hosttemplate' => OBJECT_HOSTTEMPLATE, + 'Hostgroup' => OBJECT_HOSTGROUP, + 'Service' => OBJECT_SERVICE, + 'Servicetemplate' => OBJECT_SERVICETEMPLATE, 'Servicetemplategroup' => OBJECT_SERVICETEMPLATEGROUP, - 'Servicegroup' => OBJECT_SERVICEGROUP, - 'Hostescalation' => OBJECT_HOSTESCALATION, - 'Serviceescalation' => OBJECT_SERVICEESCALATION, - 'Hostdependency' => OBJECT_HOSTDEPENDENCY, - 'Servicedependency' => OBJECT_SERVICEDEPENDENCY, + 'Servicegroup' => OBJECT_SERVICEGROUP, + 'Hostescalation' => OBJECT_HOSTESCALATION, + 'Serviceescalation' => OBJECT_SERVICEESCALATION, + 'Hostdependency' => OBJECT_HOSTDEPENDENCY, + 'Servicedependency' => OBJECT_SERVICEDEPENDENCY, ]; if (isset($objects[$modelName])) { @@ -318,13 +318,13 @@ public function objectByModelName($modelName = '') { public function containertypeByModelName($modelName = '') { $objects = [ 'Servicetemplate' => CT_SERVICETEMPLATEGROUP, - 'Servicegroup' => CT_SERVICEGROUP, - 'Hostgroup' => CT_HOSTGROUP, - 'Contactgroup' => CT_CONTACTGROUP, + 'Servicegroup' => CT_SERVICEGROUP, + 'Hostgroup' => CT_HOSTGROUP, + 'Contactgroup' => CT_CONTACTGROUP, //'Devicegroup' => CT_DEVICEGROUP, - 'Location' => CT_LOCATION, - 'Tenant' => CT_TENANT, - 'Container' => CT_GLOBAL, + 'Location' => CT_LOCATION, + 'Tenant' => CT_TENANT, + 'Container' => CT_GLOBAL, ]; if (isset($objects[$modelName])) { diff --git a/app/Controller/SystemdowntimesController.php b/app/Controller/SystemdowntimesController.php index 426ea65d33..dc08e60d59 100755 --- a/app/Controller/SystemdowntimesController.php +++ b/app/Controller/SystemdowntimesController.php @@ -456,7 +456,7 @@ public function addContainerdowntime() { $this->Frontend->setJson('dateformat', MY_DATEFORMAT); $selected = $this->request->data('Systemdowntime.object_id'); - $customFildsToRefill = [ + $customFieldsToRefill = [ 'Systemdowntime' => [ 'from_date', 'from_time', @@ -464,17 +464,18 @@ public function addContainerdowntime() { 'to_time', 'is_recurring', 'weekdays', - 'day_of_month' + 'day_of_month', + 'inherit_downtime' ], ]; - $this->CustomValidationErrors->checkForRefill($customFildsToRefill); + $this->CustomValidationErrors->checkForRefill($customFieldsToRefill); $this->set('back_url', $this->referer()); if ($this->hasRootPrivileges === true) { - $containers = $this->Tree->easyPath($this->MY_RIGHTS,OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); + $containers = $this->Tree->easyPath($this->MY_RIGHTS, OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); } else { - $containers = $this->Tree->easyPath($this->getWriteContainers(),OBJECT_HOST,[],$this->hasRootPrivileges,[CT_HOSTGROUP]); + $containers = $this->Tree->easyPath($this->getWriteContainers(), OBJECT_HOST, [], $this->hasRootPrivileges, [CT_HOSTGROUP]); } $this->set(compact('containers', 'selected')); @@ -509,7 +510,7 @@ public function addContainerdowntime() { $this->Systemdowntime->set($request); if ($this->Systemdowntime->validates()) { /* The data is valide and we can save it. - * We need to use the foreach, becasue validates() cant handel saveAll() data :( + * We need to use the foreach, becasue validates() cant handle saveAll() data :( * * How ever, at this point we passed the validation, so the data is valid. * Now we need to check, if this is just a downtime, or an recurring downtime, because @@ -525,23 +526,34 @@ public function addContainerdowntime() { $end = strtotime($request['Systemdowntime']['to_date'] . ' ' . $request['Systemdowntime']['to_time']); //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'container') { - $hostgroup = $this->Hostgroup->find('first', [ - 'recursive' => -1, - 'conditions' => [ - 'Hostgroup.id' => $request['Systemdowntime']['object_id'], - ], - 'fields' => [ - 'Hostgroup.uuid', - ], - ]); + + $childrenContainers = []; + if($request['Systemdowntime']['object_id'] == ROOT_CONTAINER && $request['Systemdowntime']['inherit_downtime'] == 1){ + $childrenContainers = $this->Tree->resolveChildrenOfContainerIds($request['Systemdowntime']['object_id'], true); + }else if($request['Systemdowntime']['object_id'] != ROOT_CONTAINER && $request['Systemdowntime']['inherit_downtime'] == 1){ + $childrenContainers = $this->Tree->resolveChildrenOfContainerIds($request['Systemdowntime']['object_id']); + $childrenContainers = $this->Tree->removeRootContainer($childrenContainers); + } + + //check if the user has rights for each children container + $myChildrenContainer = []; + foreach ($childrenContainers as $childrenContainer){ + if(in_array($childrenContainer, $this->MY_RIGHTS)){ + $myChildrenContainer[] = $childrenContainer; + } + } + + //@TODO also sharing container! hosts_to_containers $payload = [ - 'hostgroupUuid' => $hostgroup['Hostgroup']['uuid'], - 'downtimetype' => $request['Systemdowntime']['downtimetype_id'], - 'start' => $start, - 'end' => $end, - 'comment' => $request['Systemdowntime']['comment'], - 'author' => $this->Auth->user('full_name'), + 'containerId' => $request['Systemdowntime']['object_id'], + 'childrenContainer' => $myChildrenContainer, + 'inherit_downtime' => $request['Systemdowntime']['inherit_downtime'], + 'downtimetype' => $request['Systemdowntime']['downtimetype_id'], + 'start' => $start, + 'end' => $end, + 'comment' => $request['Systemdowntime']['comment'], + 'author' => $this->Auth->user('full_name'), ]; $this->GearmanClient->sendBackground('createContainerDowntime', $payload); diff --git a/app/Plugin/NagiosModule/Model/Externalcommand.php b/app/Plugin/NagiosModule/Model/Externalcommand.php index f9a9f3f2bc..d1901cc022 100644 --- a/app/Plugin/NagiosModule/Model/Externalcommand.php +++ b/app/Plugin/NagiosModule/Model/Externalcommand.php @@ -23,8 +23,7 @@ // License agreement and license key will be shipped with the order // confirmation. -class Externalcommand extends NagiosModuleAppModel -{ +class Externalcommand extends NagiosModuleAppModel { public $useTable = false; /** @@ -34,13 +33,12 @@ class Externalcommand extends NagiosModuleAppModel * @author Daniel Ziegler * @since 3.0 */ - private function _initialize() - { + private function _initialize() { $this->nagiosCmd = null; - if (!file_exists(Configure::read('NagiosModule.PREFIX').Configure::read('NagiosModule.NAGIOS_CMD'))) { - throw new NotFoundException('Error file '.Configure::read('NagiosModule.PREFIX').Configure::read('NagiosModule.NAGIOS_CMD').' does not exist'); + if (!file_exists(Configure::read('NagiosModule.PREFIX') . Configure::read('NagiosModule.NAGIOS_CMD'))) { + throw new NotFoundException('Error file ' . Configure::read('NagiosModule.PREFIX') . Configure::read('NagiosModule.NAGIOS_CMD') . ' does not exist'); } - $this->nagiosCmd = fopen(Configure::read('NagiosModule.PREFIX').Configure::read('NagiosModule.NAGIOS_CMD'), 'w+'); + $this->nagiosCmd = fopen(Configure::read('NagiosModule.PREFIX') . Configure::read('NagiosModule.NAGIOS_CMD'), 'w+'); } /** @@ -50,24 +48,23 @@ private function _initialize() * - `type` The type of the external command ('hostOnly' or 'hostAndServices') * - `satellite_id` The id of the satellite system * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0 */ - public function rescheduleHost($options = [], $timestamp = null) - { + public function rescheduleHost($options = [], $timestamp = null) { if ($timestamp === null) { $timestamp = time(); } if ($options['type'] == 'hostOnly') { - $this->_write('SCHEDULE_FORCED_HOST_CHECK;'.$options['uuid'].';'.$timestamp, $options['satellite_id']); + $this->_write('SCHEDULE_FORCED_HOST_CHECK;' . $options['uuid'] . ';' . $timestamp, $options['satellite_id']); } else { - $this->_write('SCHEDULE_FORCED_HOST_CHECK;'.$options['uuid'].';'.$timestamp, $options['satellite_id']); - $this->_write('SCHEDULE_FORCED_HOST_SVC_CHECKS;'.$options['uuid'].';'.$timestamp, $options['satellite_id']); + $this->_write('SCHEDULE_FORCED_HOST_CHECK;' . $options['uuid'] . ';' . $timestamp, $options['satellite_id']); + $this->_write('SCHEDULE_FORCED_HOST_SVC_CHECKS;' . $options['uuid'] . ';' . $timestamp, $options['satellite_id']); } } @@ -79,15 +76,14 @@ public function rescheduleHost($options = [], $timestamp = null) * - `uuid` The UUID of the host you want to reschedule * - `type` The type of the external command ('hostOnly' or 'hostAndServices') * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function rescheduleHostWithQuery($options = []) - { + public function rescheduleHostWithQuery($options = []) { $this->Host = ClassRegistry::init('Host'); $host = $this->Host->find('first', [ 'conditions' => [ @@ -110,15 +106,14 @@ public function rescheduleHostWithQuery($options = []) * - `hostgroupUuid` The UUID of the host you want to reschedule * - `type` The type of the external command ('hostOnly' or 'hostAndServices') * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function rescheduleHostgroup($options, $timestamp = null) - { + public function rescheduleHostgroup($options, $timestamp = null) { $this->Hostgroup = ClassRegistry::init('Hostgroup'); $hostgroup = $this->Hostgroup->find('first', [ 'recursive' => -1, @@ -177,16 +172,15 @@ public function rescheduleHostgroup($options, $timestamp = null) * @author Daniel Ziegler * @since 3.0 */ - public function passiveTransferHostCheckresult($options) - { + public function passiveTransferHostCheckresult($options) { $_options = ['comment' => 'No comment given', 'state' => 2, 'forceHardstate' => 0, 'repetitions' => 1]; $options = Hash::merge($_options, $options); if ($options['forceHardstate'] == 1 && $options['repetitions'] >= 1) { for ($i = 0; $i < $options['repetitions']; $i++) { - $this->_write('PROCESS_HOST_CHECK_RESULT;'.$options['uuid'].';'.$options['state'].';'.$options['comment']); + $this->_write('PROCESS_HOST_CHECK_RESULT;' . $options['uuid'] . ';' . $options['state'] . ';' . $options['comment']); } } else { - $this->_write('PROCESS_HOST_CHECK_RESULT;'.$options['uuid'].';'.$options['state'].';'.$options['comment']); + $this->_write('PROCESS_HOST_CHECK_RESULT;' . $options['uuid'] . ';' . $options['state'] . ';' . $options['comment']); } } @@ -210,16 +204,15 @@ public function passiveTransferHostCheckresult($options) * @author Daniel Ziegler * @since 3.0 */ - public function passiveTransferServiceCheckresult($options) - { + public function passiveTransferServiceCheckresult($options) { $_options = ['comment' => 'No comment given', 'state' => 3, 'forceHardstate' => 0, 'repetitions' => 1]; $options = Hash::merge($_options, $options); if ($options['forceHardstate'] == 1 && $options['repetitions'] >= 1) { for ($i = 0; $i < $options['repetitions']; $i++) { - $this->_write('PROCESS_SERVICE_CHECK_RESULT;'.$options['hostUuid'].';'.$options['serviceUuid'].';'.$options['state'].';'.$options['comment']); + $this->_write('PROCESS_SERVICE_CHECK_RESULT;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';' . $options['state'] . ';' . $options['comment']); } } else { - $this->_write('PROCESS_SERVICE_CHECK_RESULT;'.$options['hostUuid'].';'.$options['serviceUuid'].';'.$options['state'].';'.$options['comment']); + $this->_write('PROCESS_SERVICE_CHECK_RESULT;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';' . $options['state'] . ';' . $options['comment']); } } @@ -237,18 +230,17 @@ public function passiveTransferServiceCheckresult($options) * @author Daniel Ziegler * @since 3.0 */ - public function enableOrDisableHostFlapdetection($options) - { + public function enableOrDisableHostFlapdetection($options) { $_options = ['condition' => 1]; $options = Hash::merge($_options, $options); if ($options['condition'] == 1) { - $this->_write('ENABLE_HOST_FLAP_DETECTION;'.$options['uuid']); + $this->_write('ENABLE_HOST_FLAP_DETECTION;' . $options['uuid']); return; } - $this->_write('DISABLE_HOST_FLAP_DETECTION;'.$options['uuid']); + $this->_write('DISABLE_HOST_FLAP_DETECTION;' . $options['uuid']); } /** @@ -264,18 +256,17 @@ public function enableOrDisableHostFlapdetection($options) * @author Daniel Ziegler * @since 3.0 */ - public function enableOrDisableServiceFlapdetection($options) - { + public function enableOrDisableServiceFlapdetection($options) { $_options = ['condition' => 1]; $options = Hash::merge($_options, $options); if ($options['condition'] == 1) { - $this->_write('ENABLE_SVC_FLAP_DETECTION;'.$options['hostUuid'].';'.$options['serviceUuid']); + $this->_write('ENABLE_SVC_FLAP_DETECTION;' . $options['hostUuid'] . ';' . $options['serviceUuid']); return; } - $this->_write('DISABLE_SVC_FLAP_DETECTION;'.$options['hostUuid'].';'.$options['serviceUuid']); + $this->_write('DISABLE_SVC_FLAP_DETECTION;' . $options['hostUuid'] . ';' . $options['serviceUuid']); } /** @@ -285,19 +276,18 @@ public function enableOrDisableServiceFlapdetection($options) * - `serviceUuid` The UUID of the service you want to reschedule * - `satellite_id` The satellite_id * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0 */ - public function rescheduleService($options, $timestamp = null) - { + public function rescheduleService($options, $timestamp = null) { if ($timestamp === null) { $timestamp = time(); } - $this->_write('SCHEDULE_FORCED_SVC_CHECK;'.$options['hostUuid'].';'.$options['serviceUuid'].';'.$timestamp, $options['satellite_id']); + $this->_write('SCHEDULE_FORCED_SVC_CHECK;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';' . $timestamp, $options['satellite_id']); } /** @@ -306,15 +296,14 @@ public function rescheduleService($options, $timestamp = null) * ### Options * - `uuid` The UUID of the service you want to reschedule * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function rescheduleServiceWithQuery($options = [], $timestamp = null) - { + public function rescheduleServiceWithQuery($options = [], $timestamp = null) { $this->Service = ClassRegistry::init('Service'); $service = $this->Service->find('first', [ 'conditions' => [ @@ -355,23 +344,22 @@ public function rescheduleServiceWithQuery($options = [], $timestamp = null) * @author Daniel Ziegler * @since 3.0 */ - public function sendCustomHostNotification($options) - { + public function sendCustomHostNotification($options) { switch ($options['type']) { case 1: - $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;'.$options['hostUuid'].';1;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;' . $options['hostUuid'] . ';1;' . $options['author'] . ';' . $options['comment']); break; case 2: - $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;'.$options['hostUuid'].';2;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;' . $options['hostUuid'] . ';2;' . $options['author'] . ';' . $options['comment']); break; case 3: - $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;'.$options['hostUuid'].';3;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;' . $options['hostUuid'] . ';3;' . $options['author'] . ';' . $options['comment']); break; default: - $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;'.$options['hostUuid'].';0;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_HOST_NOTIFICATION;' . $options['hostUuid'] . ';0;' . $options['author'] . ';' . $options['comment']); break; } } @@ -392,23 +380,22 @@ public function sendCustomHostNotification($options) * @author Daniel Ziegler * @since 3.0 */ - public function sendCustomServiceNotification($options) - { + public function sendCustomServiceNotification($options) { switch ($options['type']) { case 1: - $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;'.$options['hostUuid'].';'.$options['serviceUuid'].';1;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';1;' . $options['author'] . ';' . $options['comment']); break; case 2: - $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;'.$options['hostUuid'].';'.$options['serviceUuid'].';2;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';2;' . $options['author'] . ';' . $options['comment']); break; case 3: - $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;'.$options['hostUuid'].';'.$options['serviceUuid'].';3;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';3;' . $options['author'] . ';' . $options['comment']); break; default: - $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;'.$options['hostUuid'].';'.$options['serviceUuid'].';0;'.$options['author'].';'.$options['comment']); + $this->_write('SEND_CUSTOM_SVC_NOTIFICATION;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';0;' . $options['author'] . ';' . $options['comment']); break; } } @@ -429,15 +416,14 @@ public function sendCustomServiceNotification($options) * @since 3.0 * @version 3.0.1 */ - public function setHostAck($options) - { + public function setHostAck($options) { $_options = [ 'type' => 'hostOnly', ]; $options = Hash::merge($_options, $options); - $this->_write('ACKNOWLEDGE_HOST_PROBLEM;'.$options['hostUuid'].';'.$options['sticky'].';1;1;'.$options['author'].';'.$options['comment']); + $this->_write('ACKNOWLEDGE_HOST_PROBLEM;' . $options['hostUuid'] . ';' . $options['sticky'] . ';1;1;' . $options['author'] . ';' . $options['comment']); if ($options['type'] == 'hostAndServices') { //Set ACK for host + services @@ -497,8 +483,7 @@ public function setHostAck($options) * @since 3.0 * @version 3.0.1 */ - public function setHostAckWithQuery($options) - { + public function setHostAckWithQuery($options) { $_options = [ 'type' => 'hostOnly', ]; @@ -514,7 +499,7 @@ public function setHostAckWithQuery($options) if (isset($hoststatus[$options['hostUuid']]['Hoststatus']['current_state'])) { if ($hoststatus[$options['hostUuid']]['Hoststatus']['current_state'] > 0) { - $this->_write('ACKNOWLEDGE_HOST_PROBLEM;'.$options['hostUuid'].';'.$options['sticky'].';1;1;'.$options['author'].';'.$options['comment']); + $this->_write('ACKNOWLEDGE_HOST_PROBLEM;' . $options['hostUuid'] . ';' . $options['sticky'] . ';1;1;' . $options['author'] . ';' . $options['comment']); } } @@ -575,8 +560,7 @@ public function setHostAckWithQuery($options) * @author Daniel Ziegler * @since 3.0.1 */ - public function setHostgroupAck($options) - { + public function setHostgroupAck($options) { $this->Hostgroup = ClassRegistry::init('Hostgroup'); $this->Hoststatus = ClassRegistry::init(MONITORING_HOSTSTATUS); $hostgroup = $this->Hostgroup->find('first', [ @@ -626,9 +610,8 @@ public function setHostgroupAck($options) * @author Daniel Ziegler * @since 3.0 */ - public function setServiceAck($options) - { - $this->_write('ACKNOWLEDGE_SVC_PROBLEM;'.$options['hostUuid'].';'.$options['serviceUuid'].';'.$options['sticky'].';1;1;'.$options['author'].';'.$options['comment']); + public function setServiceAck($options) { + $this->_write('ACKNOWLEDGE_SVC_PROBLEM;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';' . $options['sticky'] . ';1;1;' . $options['author'] . ';' . $options['comment']); } /** @@ -647,8 +630,7 @@ public function setServiceAck($options) * @author Daniel Ziegler * @since 3.0.1 */ - public function setServiceAckWithQuery($options) - { + public function setServiceAckWithQuery($options) { $this->Servicestatus = ClassRegistry::init(MONITORING_SERVICESTATUS); $servicestatus = $this->Servicestatus->byUuid($options['serviceUuid'], [ 'fields' => [ @@ -682,8 +664,7 @@ public function setServiceAckWithQuery($options) * @author Daniel Ziegler * @since 3.0 */ - public function setHostDowntime($options) - { + public function setHostDowntime($options) { $_options = [ 'duration' => $options['end'] - $options['start'], 'downtimetype' => 0, @@ -694,23 +675,23 @@ public function setHostDowntime($options) switch ($options['downtimetype']) { case 0: //Host only - $this->_write('SCHEDULE_HOST_DOWNTIME;'.$options['hostUuid'].';'.$options['start'].';'.$options['end'].';1;0;'.$options['duration'].';'.$options['author'].';'.$options['comment']); + $this->_write('SCHEDULE_HOST_DOWNTIME;' . $options['hostUuid'] . ';' . $options['start'] . ';' . $options['end'] . ';1;0;' . $options['duration'] . ';' . $options['author'] . ';' . $options['comment']); break; case 1: //Host inc services - $this->_write('SCHEDULE_HOST_DOWNTIME;'.$options['hostUuid'].';'.$options['start'].';'.$options['end'].';1;0;'.$options['duration'].';'.$options['author'].';'.$options['comment']); - $this->_write('SCHEDULE_HOST_SVC_DOWNTIME;'.$options['hostUuid'].';'.$options['start'].';'.$options['end'].';1;0;'.$options['duration'].';'.$options['author'].';'.$options['comment']); + $this->_write('SCHEDULE_HOST_DOWNTIME;' . $options['hostUuid'] . ';' . $options['start'] . ';' . $options['end'] . ';1;0;' . $options['duration'] . ';' . $options['author'] . ';' . $options['comment']); + $this->_write('SCHEDULE_HOST_SVC_DOWNTIME;' . $options['hostUuid'] . ';' . $options['start'] . ';' . $options['end'] . ';1;0;' . $options['duration'] . ';' . $options['author'] . ';' . $options['comment']); break; case 2: //Host triggered - $this->_write('SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME;'.$options['hostUuid'].';'.$options['start'].';'.$options['end'].';1;0;'.$options['duration'].';'.$options['author'].';'.$options['comment']); + $this->_write('SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME;' . $options['hostUuid'] . ';' . $options['start'] . ';' . $options['end'] . ';1;0;' . $options['duration'] . ';' . $options['author'] . ';' . $options['comment']); break; case 3: //Host non triggerd - $this->_write('SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;'.$options['hostUuid'].';'.$options['start'].';'.$options['end'].';1;0;'.$options['duration'].';'.$options['author'].';'.$options['comment']); + $this->_write('SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME;' . $options['hostUuid'] . ';' . $options['start'] . ';' . $options['end'] . ';1;0;' . $options['duration'] . ';' . $options['author'] . ';' . $options['comment']); break; } } @@ -732,8 +713,7 @@ public function setHostDowntime($options) * @author Daniel Ziegler * @since 3.0 */ - public function setHostgroupDowntime($options) - { + public function setHostgroupDowntime($options) { $_options = [ 'duration' => $options['end'] - $options['start'], 'downtimetype' => 0, @@ -744,9 +724,9 @@ public function setHostgroupDowntime($options) $this->Hostgroup = ClassRegistry::init('Hostgroup'); $this->Host = ClassRegistry::init('Host'); $hostgroup = $this->Hostgroup->find('first', [ - 'recursive' => -1, + 'recursive' => -1, 'contain' => [ - 'Host' => [ + 'Host' => [ 'fields' => [ 'Host.id', 'Host.uuid', @@ -763,13 +743,13 @@ public function setHostgroupDowntime($options) ] ]); $hostIds = []; - if(!empty($hostgroup['Host'])){ + if (!empty($hostgroup['Host'])) { $hostIds = Hash::extract($hostgroup['Host'], '{n}.id'); } $hostTemlateIds = Hash::extract($hostgroup, 'Hosttemplate.{n}.id'); $hostsByHosttemplateIds = $this->Host->find('all', [ - 'recursive' => -1, - 'contain' => [ + 'recursive' => -1, + 'contain' => [ 'Hostgroup', 'Hosttemplate' => [ 'Hostgroup' => [ @@ -781,11 +761,11 @@ public function setHostgroupDowntime($options) ], 'conditions' => [ 'Host.hosttemplate_id' => $hostTemlateIds, - 'NOT' => [ + 'NOT' => [ 'Host.id' => $hostIds ] ], - 'fields' => [ + 'fields' => [ 'Host.uuid' ] ]); @@ -889,14 +869,13 @@ public function setHostgroupDowntime($options) * @author Daniel Ziegler * @since 3.0 */ - public function setServiceDowntime($options) - { + public function setServiceDowntime($options) { $_options['duration'] = $options['end'] - $options['start']; $options = Hash::merge($_options, $options); - $this->_write('SCHEDULE_SVC_DOWNTIME;'.$options['hostUuid'].';'.$options['serviceUuid'].';'.$options['start'].';'.$options['end'].';1;0;'.$options['duration'].';'.$options['author'].';'.$options['comment'].''); + $this->_write('SCHEDULE_SVC_DOWNTIME;' . $options['hostUuid'] . ';' . $options['serviceUuid'] . ';' . $options['start'] . ';' . $options['end'] . ';1;0;' . $options['duration'] . ';' . $options['author'] . ';' . $options['comment'] . ''); } - public function setContainerDowntime($options){ + public function setContainerDowntime($options) { $_options = [ 'duration' => $options['end'] - $options['start'], 'downtimetype' => 0, @@ -904,20 +883,83 @@ public function setContainerDowntime($options){ $options = Hash::merge($_options, $options); - //@TODO get all hosts from container(s) + $this->Host = ClassRegistry::init('Host'); + $hostUuids = []; + switch ($options['inherit_downtime']) { + case 0: + //only hosts in the selected containers will be considered + $hostUuids = $this->Host->find('all', [ + 'recursive' => -1, + 'conditions' => [ + 'Host.container_id' => $options['containerId'], + 'Host.disabled' => 0, + ], + 'fields' => [ + 'Host.uuid' + ] + ]); + break; + case 1: + //all hosts in the selected and the children container will be considered + //@TODO get all children container from the selection + $lookupContainerIds = []; + if (!empty($options['childrenContainer'])) { + $lookupContainerIds = array_merge([$options['containerId']], $options['childrenContainer']); + } + $hostUuids = $this->Host->find('all', [ + 'recursive' => -1, + 'conditions' => [ + 'Host.container_id' => $lookupContainerIds, + 'Host.disabled' => 0, + ], + 'fields' => [ + 'Host.uuid' + ] + ]); + break; + } switch ($options['downtimetype']) { case 0: //Host only + foreach ($hostUuids as $hostUuid) { + $this->setHostDowntime([ + 'hostUuid' => $hostUuid['Host']['uuid'], + 'start' => $options['start'], + 'end' => $options['end'], + 'comment' => $options['comment'], + 'author' => $options['author'], + 'downtimetype' => 0, + ]); + } break; case 1: //Host inc services + foreach ($hostUuids as $hostUuid) { + $this->setHostDowntime([ + 'hostUuid' => $hostUuid['Host']['uuid'], + 'start' => $options['start'], + 'end' => $options['end'], + 'comment' => $options['comment'], + 'author' => $options['author'], + 'downtimetype' => 1, + ]); + } break; default: - + foreach ($hostUuids as $hostUuid) { + $this->setHostDowntime([ + 'hostUuid' => $hostUuid['Host']['uuid'], + 'start' => $options['start'], + 'end' => $options['end'], + 'comment' => $options['comment'], + 'author' => $options['author'], + 'downtimetype' => $options['downtimetype'], + ]); + } break; } @@ -929,18 +971,17 @@ public function setContainerDowntime($options){ * - `uuid` The UUID of the host you want to reschedule * - `type` The type of the external command ('hostOnly' or 'hostAndServices') * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function disableHostNotifications($options = []) - { - $this->_write('DISABLE_HOST_NOTIFICATIONS;'.$options['uuid'], 0); + public function disableHostNotifications($options = []) { + $this->_write('DISABLE_HOST_NOTIFICATIONS;' . $options['uuid'], 0); if ($options['type'] == 'hostAndServices') { - $this->_write('DISABLE_HOST_SVC_NOTIFICATIONS;'.$options['uuid'], 0); + $this->_write('DISABLE_HOST_SVC_NOTIFICATIONS;' . $options['uuid'], 0); } } @@ -950,18 +991,17 @@ public function disableHostNotifications($options = []) * - `uuid` The UUID of the host * - `type` The type of the external command ('hostOnly' or 'hostAndServices') * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function enableHostNotifications($options = []) - { - $this->_write('ENABLE_HOST_NOTIFICATIONS;'.$options['uuid'], 0); + public function enableHostNotifications($options = []) { + $this->_write('ENABLE_HOST_NOTIFICATIONS;' . $options['uuid'], 0); if ($options['type'] == 'hostAndServices') { - $this->_write('ENABLE_HOST_SVC_NOTIFICATIONS;'.$options['uuid'], 0); + $this->_write('ENABLE_HOST_SVC_NOTIFICATIONS;' . $options['uuid'], 0); } } @@ -971,15 +1011,14 @@ public function enableHostNotifications($options = []) * - `hostgroupUuid` The UUID of the host * - `type` The type of the external command ('hostOnly' or 'hostAndServices') * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function disableHostgroupNotifications($options = []) - { + public function disableHostgroupNotifications($options = []) { $this->Hostgroup = ClassRegistry::init('Hostgroup'); $hostgroup = $this->Hostgroup->find('first', [ 'recursive' => -1, @@ -1008,15 +1047,14 @@ public function disableHostgroupNotifications($options = []) * - `hostgroupUuid` The UUID of the host * - `type` The type of the external command ('hostOnly' or 'hostAndServices') * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function enableHostgroupNotifications($options = []) - { + public function enableHostgroupNotifications($options = []) { $this->Hostgroup = ClassRegistry::init('Hostgroup'); $hostgroup = $this->Hostgroup->find('first', [ 'recursive' => -1, @@ -1045,16 +1083,15 @@ public function enableHostgroupNotifications($options = []) * - `hostUuid` The UUID of the host * - `serviceUuid` The UUID of the service * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function disableServiceNotifications($options = []) - { - $this->_write('DISABLE_SVC_NOTIFICATIONS;'.$options['hostUuid'].';'.$options['serviceUuid'], 0); + public function disableServiceNotifications($options = []) { + $this->_write('DISABLE_SVC_NOTIFICATIONS;' . $options['hostUuid'] . ';' . $options['serviceUuid'], 0); } /** @@ -1063,16 +1100,15 @@ public function disableServiceNotifications($options = []) * - `hostUuid` The UUID of the host * - `serviceUuid` The UUID of the service * - * @param array $options with the options + * @param array $options with the options * @param integer $timestamp timestamp, when nagios should reschedule the host * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function enableServiceNotifications($options = []) - { - $this->_write('ENABLE_SVC_NOTIFICATIONS;'.$options['hostUuid'].';'.$options['serviceUuid'], 0); + public function enableServiceNotifications($options = []) { + $this->_write('ENABLE_SVC_NOTIFICATIONS;' . $options['hostUuid'] . ';' . $options['serviceUuid'], 0); } /** @@ -1081,9 +1117,8 @@ public function enableServiceNotifications($options = []) * @author Daniel Ziegler * @since 3.0 */ - private function _prefix() - { - return '['.time().'] '; + private function _prefix() { + return '[' . time() . '] '; } /** @@ -1100,10 +1135,9 @@ private function _prefix() * @author Daniel Ziegler * @since 3.0 */ - public function runCmdCommand($payload) - { + public function runCmdCommand($payload) { $payload['parameters'] = (array)$payload['parameters']; - $this->_write($payload['command'].';'.implode(';', $payload['parameters']), isset($payload['satelliteId']) ? $payload['satelliteId'] : 0); + $this->_write($payload['command'] . ';' . implode(';', $payload['parameters']), isset($payload['satelliteId']) ? $payload['satelliteId'] : 0); } @@ -1115,17 +1149,16 @@ public function runCmdCommand($payload) * coming soon ;) * * @param int $internal_downtime_id with the options - * @param int $downtimehistory_id of nagios_downtimehistory for force delete //May be not needed or coming + * @param int $downtimehistory_id of nagios_downtimehistory for force delete //May be not needed or coming * soon ;) * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function deleteHostDowntime($internal_downtime_id = 0, $downtimehistory_id = 0) - { + public function deleteHostDowntime($internal_downtime_id = 0, $downtimehistory_id = 0) { if ($internal_downtime_id > 0) { - $this->_write('DEL_HOST_DOWNTIME;'.$internal_downtime_id); + $this->_write('DEL_HOST_DOWNTIME;' . $internal_downtime_id); } } @@ -1137,16 +1170,15 @@ public function deleteHostDowntime($internal_downtime_id = 0, $downtimehistory_i * coming soon ;) * * @param int $internal_downtime_id with the options - * @param int $downtimehistory_id of nagios_downtimehistory for force //May be not needed or coming soon ;) + * @param int $downtimehistory_id of nagios_downtimehistory for force //May be not needed or coming soon ;) * * @return void * @author Daniel Ziegler * @since 3.0.1 */ - public function deleteServiceDowntime($internal_downtime_id = 0, $downtimehistory_id = 0) - { + public function deleteServiceDowntime($internal_downtime_id = 0, $downtimehistory_id = 0) { if ($internal_downtime_id > 0) { - $this->_write('DEL_SVC_DOWNTIME;'.$internal_downtime_id); + $this->_write('DEL_SVC_DOWNTIME;' . $internal_downtime_id); } } @@ -1157,12 +1189,11 @@ public function deleteServiceDowntime($internal_downtime_id = 0, $downtimehistor * @author Daniel Ziegler * @since 3.0 */ - public function test() - { + public function test() { try { $this->_initialize(); } catch (Exception $e) { - echo $e->getMessage().PHP_EOL; + echo $e->getMessage() . PHP_EOL; } } @@ -1174,8 +1205,7 @@ public function test() * @author Daniel Ziegler * @since 3.0 */ - private function _write($content = '', $satellite_id = 0) - { + private function _write($content = '', $satellite_id = 0) { if ($satellite_id > 0) { //Loading distributed Monitoring support, if plugin is loaded/installed $modulePlugins = array_filter(CakePlugin::loaded(), function ($value) { @@ -1193,26 +1223,26 @@ private function _write($content = '', $satellite_id = 0) 'conditions' => [ 'Satellite.id' => $satellite_id ], - 'fields' => [ + 'fields' => [ 'Satellite.id', 'Satellite.name' ] ]); if (isset($result['Satellite']['name'])) { - $file = fopen('/opt/openitc/nagios/var/rw/'.md5($result['Satellite']['name']).'_nagios.cmd', 'a+'); - fwrite($file, $this->_prefix().$content.PHP_EOL); + $file = fopen('/opt/openitc/nagios/var/rw/' . md5($result['Satellite']['name']) . '_nagios.cmd', 'a+'); + fwrite($file, $this->_prefix() . $content . PHP_EOL); fclose($file); } unset($result); - }else{ + } else { return false; } } else { //Host or service from master system or command for master nagios.cmd if ($this->_is_resource()) { - fwrite($this->nagiosCmd, $this->_prefix().$content.PHP_EOL); + fwrite($this->nagiosCmd, $this->_prefix() . $content . PHP_EOL); // If the nagios cmd is missing your ressource crashes. So if we fclose the file // we dont need to restart the sudo_server if nagios.cmd was missing some times $this->close(); @@ -1226,8 +1256,7 @@ private function _write($content = '', $satellite_id = 0) * @author Daniel Ziegler * @since 3.0 */ - public function close() - { + public function close() { if ($this->_is_resource()) { fclose($this->nagiosCmd); } @@ -1243,8 +1272,7 @@ public function close() * @author Daniel Ziegler * @since 3.0 */ - private function _is_resource($recursive = false) - { + private function _is_resource($recursive = false) { if (is_resource($this->nagiosCmd)) { return true; } diff --git a/app/View/Systemdowntimes/add_containerdowntime.ctp b/app/View/Systemdowntimes/add_containerdowntime.ctp index 622f1b34d2..b53a961d93 100644 --- a/app/View/Systemdowntimes/add_containerdowntime.ctp +++ b/app/View/Systemdowntimes/add_containerdowntime.ctp @@ -64,7 +64,7 @@ ]); echo $this->Form->input('downtimetype', [ 'type' => 'hidden', - 'value' => 'hostgroup', + 'value' => 'container', ]); echo $this->Form->input('object_id', [ 'options' => $containers, @@ -88,11 +88,19 @@ echo $this->Form->fancyCheckbox('is_recurring', [ 'caption' => __('Recurring downtime'), - 'wrapGridClass' => 'col col-xs-1 no-padding', + 'wrapGridClass' => 'col col-xs-1 no-padding', 'captionGridClass' => 'col col-xs-1 col-md-1 col-lg-1 no-padding', - 'captionClass' => 'control-label text-left no-padding', + 'captionClass' => 'control-label text-left no-padding', 'checked' => (bool)$this->CustomValidationErrors->refill('is_recurring', false), ]); + + echo $this->Form->fancyCheckbox('inherit_downtime', [ + 'caption' => __('Inherit downtime'), + 'wrapGridClass' => 'col col-xs-1 no-padding', + 'captionGridClass' => 'col col-xs-1 col-md-1 col-lg-1 no-padding', + 'captionClass' => 'control-label text-left no-padding', + 'checked' => (bool)$this->CustomValidationErrors->refill('inherit_downtime', false), + ]); ?>
    @@ -138,7 +146,8 @@
    -
    CustomValidationErrors->errorHTML('from_time'); ?> @@ -153,7 +162,8 @@ :
    CustomValidationErrors->errorHTML('to_date'); ?> @@ -161,7 +171,8 @@
    -
    CustomValidationErrors->errorHTML('to_time'); ?> From e030c50fd90db7917a0f36dd85ea5e016f6cce7f Mon Sep 17 00:00:00 2001 From: m4ximum Date: Mon, 25 Sep 2017 11:34:19 +0200 Subject: [PATCH 08/30] [-]multiple same hostdowntimes through container sharing is now fixed ITC-1520 --- app/Controller/SystemdowntimesController.php | 126 ++++++++++++++---- .../NagiosModule/Model/Externalcommand.php | 42 +----- 2 files changed, 104 insertions(+), 64 deletions(-) diff --git a/app/Controller/SystemdowntimesController.php b/app/Controller/SystemdowntimesController.php index dc08e60d59..71660361a7 100755 --- a/app/Controller/SystemdowntimesController.php +++ b/app/Controller/SystemdowntimesController.php @@ -480,14 +480,103 @@ public function addContainerdowntime() { $this->set(compact('containers', 'selected')); - if ($this->request->is('post') || $this->request->is('put')) { if (isset($this->request->data['Systemdowntime']['weekdays']) && is_array($this->request->data['Systemdowntime']['weekdays'])) { $this->request->data['Systemdowntime']['weekdays'] = implode(',', $this->request->data['Systemdowntime']['weekdays']); } $this->request->data = $this->_rewritePostData(); - //Try validate the data: + + + //get all host UUIDS + $hostUuids = []; foreach ($this->request->data as $request) { + $childrenContainers = []; + if ($request['Systemdowntime']['object_id'] == ROOT_CONTAINER && $request['Systemdowntime']['inherit_downtime'] == 1) { + $childrenContainers = $this->Tree->resolveChildrenOfContainerIds($request['Systemdowntime']['object_id'], true); + } else if ($request['Systemdowntime']['object_id'] != ROOT_CONTAINER && $request['Systemdowntime']['inherit_downtime'] == 1) { + $childrenContainers = $this->Tree->resolveChildrenOfContainerIds($request['Systemdowntime']['object_id']); + $childrenContainers = $this->Tree->removeRootContainer($childrenContainers); + } + + //check if the user has rights for each children container + $myChildrenContainer = []; + foreach ($childrenContainers as $childrenContainer) { + if (in_array($childrenContainer, $this->MY_RIGHTS)) { + $myChildrenContainer[] = $childrenContainer; + } + } + + switch ($request['Systemdowntime']['inherit_downtime']) { + case 0: + //only hosts in the selected containers will be considered + $result = $this->Host->find('all', [ + 'recursive' => -1, + 'conditions' => [ + 'Host.container_id' => $request['Systemdowntime']['object_id'], + 'Host.disabled' => 0, + ], + 'fields' => [ + 'Host.uuid' + ] + ]); + if (!empty($result)) { + $hostUuids[] = Hash::extract($result, '{n}.Host.uuid'); + } + + break; + case 1: + //all hosts in the selected and the children container will be considered + $lookupContainerIds = []; + if (!empty($myChildrenContainer)) { + $lookupContainerIds = array_merge([$request['Systemdowntime']['object_id']], $myChildrenContainer); + } + + $conditions = [ + 'HostsToContainers.container_id' => $lookupContainerIds, + 'Host.disabled' => 0, + ]; + + $result = $this->Host->find('all', [ + 'recursive' => -1, + 'joins' => [ + [ + 'table' => 'hosts_to_containers', + 'alias' => 'HostsToContainers', + 'type' => 'LEFT', + 'conditions' => [ + 'HostsToContainers.host_id = Host.id', + ], + ], + ], + 'conditions' => $conditions, + 'order' => [ + 'Host.name' => 'ASC', + ], + 'fields' => [ + 'Host.uuid', + ], + ]); + if (!empty($result)) { + $hostUuids[] = Hash::extract($result, '{n}.Host.uuid'); + } + break; + } + } + + //get rid of same uuids + $allHostUuids = []; + $mapping = []; + foreach ($hostUuids as $key => $data) { + foreach ($data as $hostUuid) { + if (!in_array($hostUuid, $mapping)) { + $mapping[] = $hostUuid; + $allHostUuids[$key][] = $hostUuid; + } + } + } + + //Try validate the data: + foreach ($this->request->data as $key => $request) { if ($request['Systemdowntime']['is_recurring']) { $this->Systemdowntime->validate = Hash::merge( $this->Systemdowntime->validate, @@ -507,6 +596,7 @@ public function addContainerdowntime() { ] ); } + $this->Systemdowntime->set($request); if ($this->Systemdowntime->validates()) { /* The data is valide and we can save it. @@ -527,33 +617,15 @@ public function addContainerdowntime() { //Just a normal nagios downtime if ($request['Systemdowntime']['downtimetype'] == 'container') { - $childrenContainers = []; - if($request['Systemdowntime']['object_id'] == ROOT_CONTAINER && $request['Systemdowntime']['inherit_downtime'] == 1){ - $childrenContainers = $this->Tree->resolveChildrenOfContainerIds($request['Systemdowntime']['object_id'], true); - }else if($request['Systemdowntime']['object_id'] != ROOT_CONTAINER && $request['Systemdowntime']['inherit_downtime'] == 1){ - $childrenContainers = $this->Tree->resolveChildrenOfContainerIds($request['Systemdowntime']['object_id']); - $childrenContainers = $this->Tree->removeRootContainer($childrenContainers); - } - - //check if the user has rights for each children container - $myChildrenContainer = []; - foreach ($childrenContainers as $childrenContainer){ - if(in_array($childrenContainer, $this->MY_RIGHTS)){ - $myChildrenContainer[] = $childrenContainer; - } - } - - //@TODO also sharing container! hosts_to_containers - $payload = [ 'containerId' => $request['Systemdowntime']['object_id'], - 'childrenContainer' => $myChildrenContainer, - 'inherit_downtime' => $request['Systemdowntime']['inherit_downtime'], - 'downtimetype' => $request['Systemdowntime']['downtimetype_id'], - 'start' => $start, - 'end' => $end, - 'comment' => $request['Systemdowntime']['comment'], - 'author' => $this->Auth->user('full_name'), + 'hostUuids' => isset($allHostUuids[$key])?$allHostUuids[$key]:[], + 'inherit_downtime' => $request['Systemdowntime']['inherit_downtime'], + 'downtimetype' => $request['Systemdowntime']['downtimetype_id'], + 'start' => $start, + 'end' => $end, + 'comment' => $request['Systemdowntime']['comment'], + 'author' => $this->Auth->user('full_name'), ]; $this->GearmanClient->sendBackground('createContainerDowntime', $payload); diff --git a/app/Plugin/NagiosModule/Model/Externalcommand.php b/app/Plugin/NagiosModule/Model/Externalcommand.php index d1901cc022..415cdbe73a 100644 --- a/app/Plugin/NagiosModule/Model/Externalcommand.php +++ b/app/Plugin/NagiosModule/Model/Externalcommand.php @@ -883,41 +883,9 @@ public function setContainerDowntime($options) { $options = Hash::merge($_options, $options); - $this->Host = ClassRegistry::init('Host'); - $hostUuids = []; - switch ($options['inherit_downtime']) { - case 0: - //only hosts in the selected containers will be considered - $hostUuids = $this->Host->find('all', [ - 'recursive' => -1, - 'conditions' => [ - 'Host.container_id' => $options['containerId'], - 'Host.disabled' => 0, - ], - 'fields' => [ - 'Host.uuid' - ] - ]); - break; - case 1: - //all hosts in the selected and the children container will be considered - //@TODO get all children container from the selection - $lookupContainerIds = []; - if (!empty($options['childrenContainer'])) { - $lookupContainerIds = array_merge([$options['containerId']], $options['childrenContainer']); - } - $hostUuids = $this->Host->find('all', [ - 'recursive' => -1, - 'conditions' => [ - 'Host.container_id' => $lookupContainerIds, - 'Host.disabled' => 0, - ], - 'fields' => [ - 'Host.uuid' - ] - ]); - break; + if (!empty($options['hostUuids'])) { + $hostUuids = $options['hostUuids']; } switch ($options['downtimetype']) { @@ -925,7 +893,7 @@ public function setContainerDowntime($options) { //Host only foreach ($hostUuids as $hostUuid) { $this->setHostDowntime([ - 'hostUuid' => $hostUuid['Host']['uuid'], + 'hostUuid' => $hostUuid, 'start' => $options['start'], 'end' => $options['end'], 'comment' => $options['comment'], @@ -939,7 +907,7 @@ public function setContainerDowntime($options) { //Host inc services foreach ($hostUuids as $hostUuid) { $this->setHostDowntime([ - 'hostUuid' => $hostUuid['Host']['uuid'], + 'hostUuid' => $hostUuid, 'start' => $options['start'], 'end' => $options['end'], 'comment' => $options['comment'], @@ -952,7 +920,7 @@ public function setContainerDowntime($options) { default: foreach ($hostUuids as $hostUuid) { $this->setHostDowntime([ - 'hostUuid' => $hostUuid['Host']['uuid'], + 'hostUuid' => $hostUuid, 'start' => $options['start'], 'end' => $options['end'], 'comment' => $options['comment'], From 5c929a7d420abb1a11c1a06a4090467d40f8b7f5 Mon Sep 17 00:00:00 2001 From: m4ximum Date: Mon, 25 Sep 2017 13:33:17 +0200 Subject: [PATCH 09/30] [-]fixed Typo in gearman worker shell ITC-1520 --- app/Console/Command/GearmanWorkerShell.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Console/Command/GearmanWorkerShell.php b/app/Console/Command/GearmanWorkerShell.php index f0e7b76476..c28498ecf7 100644 --- a/app/Console/Command/GearmanWorkerShell.php +++ b/app/Console/Command/GearmanWorkerShell.php @@ -143,7 +143,7 @@ public function getOptionParser() { public function start() { if ($this->status()) { - $this->out("Notice: oITC GearmanWorker is allready running!"); + $this->out("Notice: oITC GearmanWorker is already running!"); exit(0); } From cc8775d4ac1d0b80b28b278ee5966ae2582c1e3a Mon Sep 17 00:00:00 2001 From: nook24 Date: Mon, 25 Sep 2017 14:04:06 +0200 Subject: [PATCH 10/30] ITC-1536 Refactor all PHP dependencies tp PHP Composer --- app/Console/Command/CompressShell.php | 4 +- app/Console/Command/SudoServerShell.php | 111 +- app/Controller/DocumentationsController.php | 4 +- app/Vendor/Ratchet/composer.json | 76 - app/Vendor/Ratchet/composer.lock | 734 ---- app/Vendor/Ratchet/vendor/autoload.php | 7 - .../Ratchet/vendor/cboden/ratchet/.gitignore | 5 - .../Ratchet/vendor/cboden/ratchet/.travis.yml | 10 - .../vendor/cboden/ratchet/CHANGELOG.md | 97 - .../Ratchet/vendor/cboden/ratchet/LICENSE | 19 - .../Ratchet/vendor/cboden/ratchet/Makefile | 35 - .../Ratchet/vendor/cboden/ratchet/README.md | 90 - .../vendor/cboden/ratchet/composer.json | 33 - .../vendor/cboden/ratchet/phpunit.xml.dist | 30 - .../Ratchet/AbstractConnectionDecorator.php | 41 - .../vendor/cboden/ratchet/src/Ratchet/App.php | 127 - .../src/Ratchet/ComponentInterface.php | 31 - .../src/Ratchet/ConnectionInterface.php | 26 - .../Guzzle/Http/Message/RequestFactory.php | 34 - .../src/Ratchet/Http/HttpRequestParser.php | 56 - .../ratchet/src/Ratchet/Http/HttpServer.php | 90 - .../src/Ratchet/Http/HttpServerInterface.php | 14 - .../ratchet/src/Ratchet/Http/OriginCheck.php | 79 - .../ratchet/src/Ratchet/Http/Router.php | 92 - .../src/Ratchet/MessageComponentInterface.php | 5 - .../ratchet/src/Ratchet/MessageInterface.php | 12 - .../ratchet/src/Ratchet/Server/EchoServer.php | 23 - .../src/Ratchet/Server/FlashPolicy.php | 188 - .../src/Ratchet/Server/IoConnection.php | 38 - .../ratchet/src/Ratchet/Server/IoServer.php | 134 - .../src/Ratchet/Server/IpBlackList.php | 111 - .../Session/Serialize/HandlerInterface.php | 16 - .../Session/Serialize/PhpBinaryHandler.php | 33 - .../Ratchet/Session/Serialize/PhpHandler.php | 38 - .../src/Ratchet/Session/SessionProvider.php | 161 - .../Session/Storage/Proxy/VirtualProxy.php | 54 - .../Session/Storage/VirtualSessionStorage.php | 82 - .../ratchet/src/Ratchet/Wamp/Exception.php | 5 - .../src/Ratchet/Wamp/JsonException.php | 31 - .../src/Ratchet/Wamp/ServerProtocol.php | 157 - .../cboden/ratchet/src/Ratchet/Wamp/Topic.php | 88 - .../ratchet/src/Ratchet/Wamp/TopicManager.php | 114 - .../src/Ratchet/Wamp/WampConnection.php | 102 - .../ratchet/src/Ratchet/Wamp/WampServer.php | 69 - .../src/Ratchet/Wamp/WampServerInterface.php | 43 - .../Encoding/ToggleableValidator.php | 31 - .../Ratchet/WebSocket/Encoding/Validator.php | 93 - .../WebSocket/Encoding/ValidatorInterface.php | 12 - .../WebSocket/Version/DataInterface.php | 28 - .../WebSocket/Version/FrameInterface.php | 38 - .../src/Ratchet/WebSocket/Version/Hixie76.php | 120 - .../WebSocket/Version/Hixie76/Connection.php | 19 - .../WebSocket/Version/Hixie76/Frame.php | 86 - .../src/Ratchet/WebSocket/Version/HyBi10.php | 15 - .../WebSocket/Version/MessageInterface.php | 15 - .../src/Ratchet/WebSocket/Version/RFC6455.php | 271 -- .../WebSocket/Version/RFC6455/Connection.php | 33 - .../WebSocket/Version/RFC6455/Frame.php | 450 --- .../Version/RFC6455/HandshakeVerifier.php | 137 - .../WebSocket/Version/RFC6455/Message.php | 107 - .../WebSocket/Version/VersionInterface.php | 57 - .../src/Ratchet/WebSocket/VersionManager.php | 90 - .../src/Ratchet/WebSocket/WsServer.php | 227 -- .../Ratchet/WebSocket/WsServerInterface.php | 14 - .../autobahn/bin/fuzzingserver-noutf8.php | 17 - .../tests/autobahn/bin/fuzzingserver.php | 15 - .../tests/autobahn/fuzzingclient-all.json | 16 - .../tests/autobahn/fuzzingclient-profile.json | 12 - .../tests/autobahn/fuzzingclient-quick.json | 12 - .../vendor/cboden/ratchet/tests/bootstrap.php | 5 - .../AbstractMessageComponentTestCase.php | 50 - .../tests/helpers/Ratchet/Mock/Component.php | 35 - .../tests/helpers/Ratchet/Mock/Connection.php | 20 - .../Ratchet/Mock/ConnectionDecorator.php | 22 - .../helpers/Ratchet/Mock/WampComponent.php | 43 - .../tests/helpers/Ratchet/NullComponent.php | 28 - .../Wamp/Stub/WsWampServerInterface.php | 7 - .../Stub/WsMessageComponentInterface.php | 7 - .../ratchet/tests/integration/GuzzleTest.php | 53 - .../unit/AbstractConnectionDecoratorTest.php | 147 - .../Http/Message/RequestFactoryTest.php | 67 - .../tests/unit/Http/HttpRequestParserTest.php | 51 - .../tests/unit/Http/HttpServerTest.php | 64 - .../tests/unit/Http/OriginCheckTest.php | 46 - .../ratchet/tests/unit/Http/RouterTest.php | 88 - .../tests/unit/Server/EchoServerTest.php | 26 - .../unit/Server/FlashPolicyComponentTest.php | 152 - .../tests/unit/Server/IoConnectionTest.php | 32 - .../tests/unit/Server/IoServerTest.php | 118 - .../unit/Server/IpBlackListComponentTest.php | 125 - .../unit/Session/Serialize/PhpHandlerTest.php | 36 - .../unit/Session/SessionComponentTest.php | 138 - .../tests/unit/Wamp/ServerProtocolTest.php | 269 -- .../tests/unit/Wamp/TopicManagerTest.php | 197 - .../ratchet/tests/unit/Wamp/TopicTest.php | 112 - .../tests/unit/Wamp/WampConnectionTest.php | 69 - .../tests/unit/Wamp/WampServerTest.php | 50 - .../unit/WebSocket/Version/Hixie76Test.php | 83 - .../unit/WebSocket/Version/HyBi10Test.php | 67 - .../WebSocket/Version/RFC6455/FrameTest.php | 503 --- .../Version/RFC6455/HandshakeVerifierTest.php | 170 - .../WebSocket/Version/RFC6455/MessageTest.php | 63 - .../unit/WebSocket/Version/RFC6455Test.php | 151 - .../unit/WebSocket/VersionManagerTest.php | 91 - .../tests/unit/WebSocket/WsServerTest.php | 51 - .../Ratchet/vendor/composer/ClassLoader.php | 354 -- .../vendor/composer/autoload_classmap.php | 10 - .../vendor/composer/autoload_namespaces.php | 28 - .../Ratchet/vendor/composer/autoload_psr4.php | 9 - .../Ratchet/vendor/composer/autoload_real.php | 48 - .../Ratchet/vendor/composer/installed.json | 737 ---- .../Ratchet/vendor/cujojs/when/.gitignore | 4 - .../Ratchet/vendor/cujojs/when/.gitmodules | 0 .../Ratchet/vendor/cujojs/when/.travis.yml | 3 - .../Ratchet/vendor/cujojs/when/LICENSE.txt | 24 - .../Ratchet/vendor/cujojs/when/README.md | 279 -- .../Ratchet/vendor/cujojs/when/apply.js | 68 - .../Ratchet/vendor/cujojs/when/cancelable.js | 66 - .../Ratchet/vendor/cujojs/when/delay.js | 59 - .../Ratchet/vendor/cujojs/when/package.json | 39 - .../Ratchet/vendor/cujojs/when/test/all.js | 98 - .../Ratchet/vendor/cujojs/when/test/any.js | 104 - .../Ratchet/vendor/cujojs/when/test/apply.js | 32 - .../Ratchet/vendor/cujojs/when/test/buster.js | 16 - .../vendor/cujojs/when/test/cancelable.js | 79 - .../Ratchet/vendor/cujojs/when/test/chain.js | 170 - .../Ratchet/vendor/cujojs/when/test/defer.js | 203 - .../Ratchet/vendor/cujojs/when/test/delay.js | 71 - .../vendor/cujojs/when/test/isPromise.js | 59 - .../Ratchet/vendor/cujojs/when/test/map.js | 101 - .../vendor/cujojs/when/test/promise.js | 313 -- .../Ratchet/vendor/cujojs/when/test/reduce.js | 202 - .../Ratchet/vendor/cujojs/when/test/some.js | 126 - .../vendor/cujojs/when/test/timeout.js | 62 - .../Ratchet/vendor/cujojs/when/test/when.js | 167 - .../Ratchet/vendor/cujojs/when/timed.js | 31 - .../Ratchet/vendor/cujojs/when/timeout.js | 73 - app/Vendor/Ratchet/vendor/cujojs/when/when.js | 738 ---- .../vendor/evenement/evenement/.gitignore | 2 - .../vendor/evenement/evenement/.travis.yml | 12 - .../vendor/evenement/evenement/LICENSE | 19 - .../vendor/evenement/evenement/README.md | 74 - .../vendor/evenement/evenement/composer.json | 25 - .../evenement/evenement/doc/00-intro.md | 28 - .../vendor/evenement/evenement/doc/01-api.md | 77 - .../evenement/doc/02-plugin-system.md | 147 - .../evenement/evenement/phpunit.xml.dist | 25 - .../evenement/src/Evenement/EventEmitter.php | 73 - .../evenement/src/Evenement/EventEmitter2.php | 114 - .../src/Evenement/EventEmitterInterface.php | 22 - .../Evenement/Tests/EventEmitter2Test.php | 160 - .../Evenement/Tests/EventEmitterTest.php | 236 -- .../tests/Evenement/Tests/Listener.php | 38 - .../evenement/evenement/tests/bootstrap.php | 28 - .../vendor/gimite/web-socket-js/.gitignore | 3 - .../vendor/gimite/web-socket-js/LICENSE.txt | 9 - .../vendor/gimite/web-socket-js/NEWS.md | 17 - .../vendor/gimite/web-socket-js/README.md | 169 - .../gimite/web-socket-js/WebSocketMain.swf | Bin 177215 -> 0 bytes .../web-socket-js/WebSocketMainInsecure.zip | Bin 170394 -> 0 bytes .../vendor/gimite/web-socket-js/bower.json | 20 - .../gimite/web-socket-js/flash-src/.gitignore | 1 - .../flash-src/build.properties.sample | 2 - .../gimite/web-socket-js/flash-src/build.sh | 25 - .../gimite/web-socket-js/flash-src/build.xml | 98 - .../net/gimite/websocket/IWebSocketLogger.as | 11 - .../src/net/gimite/websocket/WebSocket.as | 614 --- .../net/gimite/websocket/WebSocketEvent.as | 41 - .../net/gimite/websocket/WebSocketFrame.as | 21 - .../src/net/gimite/websocket/WebSocketMain.as | 160 - .../gimite/websocket/WebSocketMainInsecure.as | 20 - .../com/adobe/net/proxies/RFC2817Socket.as | 204 - .../third-party/com/gsolo/encryption/MD5.as | 375 -- .../third-party/com/gsolo/encryption/SHA1.as | 218 - .../third-party/com/hurlant/crypto/Crypto.as | 287 -- .../crypto/cert/MozillaRootCertificates.as | 3235 --------------- .../hurlant/crypto/cert/X509Certificate.as | 218 - .../crypto/cert/X509CertificateCollection.as | 57 - .../com/hurlant/crypto/hash/HMAC.as | 82 - .../com/hurlant/crypto/hash/IHMAC.as | 27 - .../com/hurlant/crypto/hash/IHash.as | 21 - .../com/hurlant/crypto/hash/MAC.as | 137 - .../com/hurlant/crypto/hash/MD2.as | 124 - .../com/hurlant/crypto/hash/MD5.as | 204 - .../com/hurlant/crypto/hash/SHA1.as | 106 - .../com/hurlant/crypto/hash/SHA224.as | 28 - .../com/hurlant/crypto/hash/SHA256.as | 115 - .../com/hurlant/crypto/hash/SHABase.as | 71 - .../com/hurlant/crypto/prng/ARC4.as | 90 - .../com/hurlant/crypto/prng/IPRNG.as | 20 - .../com/hurlant/crypto/prng/Random.as | 119 - .../com/hurlant/crypto/prng/TLSPRF.as | 142 - .../com/hurlant/crypto/rsa/RSAKey.as | 339 -- .../com/hurlant/crypto/symmetric/AESKey.as | 2797 ------------- .../hurlant/crypto/symmetric/BlowFishKey.as | 375 -- .../com/hurlant/crypto/symmetric/CBCMode.as | 55 - .../com/hurlant/crypto/symmetric/CFB8Mode.as | 61 - .../com/hurlant/crypto/symmetric/CFBMode.as | 64 - .../com/hurlant/crypto/symmetric/CTRMode.as | 58 - .../com/hurlant/crypto/symmetric/DESKey.as | 365 -- .../com/hurlant/crypto/symmetric/ECBMode.as | 86 - .../com/hurlant/crypto/symmetric/ICipher.as | 21 - .../com/hurlant/crypto/symmetric/IMode.as | 15 - .../com/hurlant/crypto/symmetric/IPad.as | 32 - .../hurlant/crypto/symmetric/IStreamCipher.as | 21 - .../hurlant/crypto/symmetric/ISymmetricKey.as | 35 - .../com/hurlant/crypto/symmetric/IVMode.as | 110 - .../com/hurlant/crypto/symmetric/NullPad.as | 34 - .../com/hurlant/crypto/symmetric/OFBMode.as | 52 - .../com/hurlant/crypto/symmetric/PKCS5.as | 44 - .../com/hurlant/crypto/symmetric/SSLPad.as | 44 - .../hurlant/crypto/symmetric/SimpleIVMode.as | 60 - .../com/hurlant/crypto/symmetric/TLSPad.as | 42 - .../hurlant/crypto/symmetric/TripleDESKey.as | 88 - .../com/hurlant/crypto/symmetric/XTeaKey.as | 94 - .../com/hurlant/crypto/symmetric/aeskey.pl | 29 - .../com/hurlant/crypto/symmetric/dump.txt | 2304 ----------- .../com/hurlant/crypto/tests/AESKeyTest.as | 1220 ------ .../com/hurlant/crypto/tests/ARC4Test.as | 58 - .../hurlant/crypto/tests/BigIntegerTest.as | 39 - .../hurlant/crypto/tests/BlowFishKeyTest.as | 148 - .../com/hurlant/crypto/tests/CBCModeTest.as | 160 - .../com/hurlant/crypto/tests/CFB8ModeTest.as | 71 - .../com/hurlant/crypto/tests/CFBModeTest.as | 98 - .../com/hurlant/crypto/tests/CTRModeTest.as | 109 - .../com/hurlant/crypto/tests/DESKeyTest.as | 112 - .../com/hurlant/crypto/tests/ECBModeTest.as | 151 - .../com/hurlant/crypto/tests/HMACTest.as | 184 - .../com/hurlant/crypto/tests/ITestHarness.as | 20 - .../com/hurlant/crypto/tests/MD2Test.as | 56 - .../com/hurlant/crypto/tests/MD5Test.as | 58 - .../com/hurlant/crypto/tests/OFBModeTest.as | 101 - .../com/hurlant/crypto/tests/RSAKeyTest.as | 92 - .../com/hurlant/crypto/tests/SHA1Test.as | 198 - .../com/hurlant/crypto/tests/SHA224Test.as | 58 - .../com/hurlant/crypto/tests/SHA256Test.as | 60 - .../com/hurlant/crypto/tests/TLSPRFTest.as | 51 - .../com/hurlant/crypto/tests/TestCase.as | 42 - .../hurlant/crypto/tests/TripleDESKeyTest.as | 59 - .../com/hurlant/crypto/tests/XTeaKeyTest.as | 66 - .../com/hurlant/crypto/tls/BulkCiphers.as | 102 - .../com/hurlant/crypto/tls/CipherSuites.as | 117 - .../hurlant/crypto/tls/IConnectionState.as | 14 - .../hurlant/crypto/tls/ISecurityParameters.as | 29 - .../com/hurlant/crypto/tls/KeyExchanges.as | 24 - .../com/hurlant/crypto/tls/MACs.as | 38 - .../hurlant/crypto/tls/SSLConnectionState.as | 171 - .../com/hurlant/crypto/tls/SSLEvent.as | 26 - .../crypto/tls/SSLSecurityParameters.as | 340 -- .../com/hurlant/crypto/tls/TLSConfig.as | 70 - .../hurlant/crypto/tls/TLSConnectionState.as | 151 - .../com/hurlant/crypto/tls/TLSEngine.as | 896 ----- .../com/hurlant/crypto/tls/TLSError.as | 39 - .../com/hurlant/crypto/tls/TLSEvent.as | 27 - .../crypto/tls/TLSSecurityParameters.as | 197 - .../com/hurlant/crypto/tls/TLSSocket.as | 370 -- .../com/hurlant/crypto/tls/TLSSocketEvent.as | 26 - .../com/hurlant/crypto/tls/TLSTest.as | 180 - .../com/hurlant/math/BarrettReduction.as | 90 - .../com/hurlant/math/BigInteger.as | 1543 ------- .../com/hurlant/math/ClassicReduction.as | 35 - .../com/hurlant/math/IReduction.as | 11 - .../com/hurlant/math/MontgomeryReduction.as | 85 - .../com/hurlant/math/NullReduction.as | 34 - .../com/hurlant/math/bi_internal.as | 11 - .../third-party/com/hurlant/util/ArrayUtil.as | 25 - .../third-party/com/hurlant/util/Base64.as | 189 - .../third-party/com/hurlant/util/Hex.as | 66 - .../third-party/com/hurlant/util/Memory.as | 28 - .../com/hurlant/util/der/ByteString.as | 43 - .../third-party/com/hurlant/util/der/DER.as | 210 - .../com/hurlant/util/der/IAsn1Type.as | 21 - .../com/hurlant/util/der/Integer.as | 44 - .../third-party/com/hurlant/util/der/OID.as | 35 - .../com/hurlant/util/der/ObjectIdentifier.as | 112 - .../third-party/com/hurlant/util/der/PEM.as | 118 - .../com/hurlant/util/der/PrintableString.as | 49 - .../com/hurlant/util/der/Sequence.as | 90 - .../third-party/com/hurlant/util/der/Set.as | 27 - .../third-party/com/hurlant/util/der/Type.as | 94 - .../com/hurlant/util/der/UTCTime.as | 60 - .../vendor/gimite/web-socket-js/sample.html | 75 - .../gimite/web-socket-js/src/swfobject.js | 777 ---- .../vendor/gimite/web-socket-js/swfobject.js | 4 - .../vendor/gimite/web-socket-js/web_socket.js | 398 -- .../Guzzle/Common/AbstractHasDispatcher.php | 49 - .../common/Guzzle/Common/Collection.php | 403 -- .../guzzle/common/Guzzle/Common/Event.php | 52 - .../Exception/BadMethodCallException.php | 5 - .../Common/Exception/ExceptionCollection.php | 108 - .../Common/Exception/GuzzleException.php | 8 - .../Exception/InvalidArgumentException.php | 5 - .../Common/Exception/RuntimeException.php | 5 - .../Exception/UnexpectedValueException.php | 5 - .../Guzzle/Common/FromConfigInterface.php | 18 - .../Guzzle/Common/HasDispatcherInterface.php | 54 - .../common/Guzzle/Common/ToArrayInterface.php | 16 - .../guzzle/common/Guzzle/Common/Version.php | 29 - .../guzzle/common/Guzzle/Common/composer.json | 20 - .../Http/AbstractEntityBodyDecorator.php | 221 - .../http/Guzzle/Http/CachingEntityBody.php | 229 -- .../vendor/guzzle/http/Guzzle/Http/Client.php | 506 --- .../http/Guzzle/Http/ClientInterface.php | 223 -- .../http/Guzzle/Http/Curl/CurlHandle.php | 464 --- .../http/Guzzle/Http/Curl/CurlMulti.php | 363 -- .../Guzzle/Http/Curl/CurlMultiInterface.php | 58 - .../http/Guzzle/Http/Curl/CurlMultiProxy.php | 147 - .../http/Guzzle/Http/Curl/CurlVersion.php | 66 - .../http/Guzzle/Http/Curl/RequestMediator.php | 147 - .../guzzle/http/Guzzle/Http/EntityBody.php | 201 - .../http/Guzzle/Http/EntityBodyInterface.php | 73 - .../Http/Exception/BadResponseException.php | 69 - .../ClientErrorResponseException.php | 8 - .../CouldNotRewindStreamException.php | 7 - .../Guzzle/Http/Exception/CurlException.php | 101 - .../Guzzle/Http/Exception/HttpException.php | 10 - .../Http/Exception/MultiTransferException.php | 145 - .../Http/Exception/RequestException.php | 39 - .../ServerErrorResponseException.php | 8 - .../Exception/TooManyRedirectsException.php | 5 - .../http/Guzzle/Http/IoEmittingEntityBody.php | 83 - .../Guzzle/Http/Message/AbstractMessage.php | 220 - .../Http/Message/EntityEnclosingRequest.php | 247 -- .../EntityEnclosingRequestInterface.php | 137 - .../http/Guzzle/Http/Message/Header.php | 182 - .../Http/Message/Header/CacheControl.php | 121 - .../Http/Message/Header/HeaderCollection.php | 108 - .../Http/Message/Header/HeaderFactory.php | 26 - .../Message/Header/HeaderFactoryInterface.php | 19 - .../Http/Message/Header/HeaderInterface.php | 83 - .../http/Guzzle/Http/Message/Header/Link.php | 93 - .../Guzzle/Http/Message/MessageInterface.php | 102 - .../http/Guzzle/Http/Message/PostFile.php | 124 - .../Guzzle/Http/Message/PostFileInterface.php | 83 - .../http/Guzzle/Http/Message/Request.php | 638 --- .../Guzzle/Http/Message/RequestFactory.php | 359 -- .../Http/Message/RequestFactoryInterface.php | 105 - .../Guzzle/Http/Message/RequestInterface.php | 318 -- .../http/Guzzle/Http/Message/Response.php | 968 ----- .../guzzle/http/Guzzle/Http/Mimetypes.php | 962 ----- .../Http/QueryAggregator/CommaAggregator.php | 20 - .../QueryAggregator/DuplicateAggregator.php | 22 - .../Http/QueryAggregator/PhpAggregator.php | 27 - .../QueryAggregatorInterface.php | 22 - .../guzzle/http/Guzzle/Http/QueryString.php | 276 -- .../http/Guzzle/Http/ReadLimitEntityBody.php | 105 - .../http/Guzzle/Http/RedirectPlugin.php | 250 -- .../http/Guzzle/Http/Resources/cacert.pem | 3554 ----------------- .../http/Guzzle/Http/Resources/cacert.pem.md5 | 1 - .../guzzle/http/Guzzle/Http/StaticClient.php | 157 - .../vendor/guzzle/http/Guzzle/Http/Url.php | 549 --- .../guzzle/http/Guzzle/Http/composer.json | 32 - .../Guzzle/Parser/Cookie/CookieParser.php | 86 - .../Parser/Cookie/CookieParserInterface.php | 33 - .../Parser/Message/AbstractMessageParser.php | 58 - .../Guzzle/Parser/Message/MessageParser.php | 110 - .../Parser/Message/MessageParserInterface.php | 27 - .../Parser/Message/PeclHttpMessageParser.php | 48 - .../parser/Guzzle/Parser/ParserRegistry.php | 75 - .../Parser/UriTemplate/PeclUriTemplate.php | 26 - .../Guzzle/Parser/UriTemplate/UriTemplate.php | 254 -- .../UriTemplate/UriTemplateInterface.php | 21 - .../parser/Guzzle/Parser/Url/UrlParser.php | 48 - .../Guzzle/Parser/Url/UrlParserInterface.php | 19 - .../guzzle/parser/Guzzle/Parser/composer.json | 19 - .../Guzzle/Stream/PhpStreamRequestFactory.php | 276 -- .../guzzle/stream/Guzzle/Stream/Stream.php | 289 -- .../stream/Guzzle/Stream/StreamInterface.php | 218 - .../Stream/StreamRequestFactoryInterface.php | 24 - .../guzzle/stream/Guzzle/Stream/composer.json | 30 - .../vendor/monolog/monolog/.gitattributes | 3 - .../Ratchet/vendor/monolog/monolog/.gitignore | 5 - .../vendor/monolog/monolog/.travis.yml | 15 - .../vendor/monolog/monolog/CHANGELOG.mdown | 127 - .../Ratchet/vendor/monolog/monolog/LICENSE | 19 - .../vendor/monolog/monolog/README.mdown | 255 -- .../vendor/monolog/monolog/composer.json | 44 - .../vendor/monolog/monolog/doc/extending.md | 76 - .../vendor/monolog/monolog/doc/sockets.md | 37 - .../vendor/monolog/monolog/doc/usage.md | 162 - .../vendor/monolog/monolog/phpunit.xml.dist | 15 - .../monolog/src/Monolog/ErrorHandler.php | 208 - .../Monolog/Formatter/ChromePHPFormatter.php | 79 - .../Monolog/Formatter/ElasticaFormatter.php | 87 - .../Monolog/Formatter/FormatterInterface.php | 36 - .../Formatter/GelfMessageFormatter.php | 101 - .../src/Monolog/Formatter/HtmlFormatter.php | 127 - .../src/Monolog/Formatter/JsonFormatter.php | 38 - .../src/Monolog/Formatter/LineFormatter.php | 101 - .../Monolog/Formatter/LogstashFormatter.php | 146 - .../Monolog/Formatter/NormalizerFormatter.php | 137 - .../src/Monolog/Formatter/ScalarFormatter.php | 48 - .../Monolog/Formatter/WildfireFormatter.php | 102 - .../src/Monolog/Handler/AbstractHandler.php | 184 - .../Handler/AbstractProcessingHandler.php | 66 - .../Monolog/Handler/AbstractSyslogHandler.php | 92 - .../src/Monolog/Handler/AmqpHandler.php | 69 - .../src/Monolog/Handler/BufferHandler.php | 98 - .../src/Monolog/Handler/ChromePHPHandler.php | 183 - .../src/Monolog/Handler/CouchDBHandler.php | 72 - .../src/Monolog/Handler/CubeHandler.php | 145 - .../Handler/DoctrineCouchDBHandler.php | 45 - .../src/Monolog/Handler/DynamoDbHandler.php | 90 - .../Monolog/Handler/ElasticSearchHandler.php | 128 - .../src/Monolog/Handler/ErrorLogHandler.php | 63 - .../ActivationStrategyInterface.php | 28 - .../ChannelLevelActivationStrategy.php | 57 - .../ErrorLevelActivationStrategy.php | 32 - .../Monolog/Handler/FingersCrossedHandler.php | 118 - .../src/Monolog/Handler/FirePHPHandler.php | 184 - .../src/Monolog/Handler/GelfHandler.php | 66 - .../src/Monolog/Handler/GroupHandler.php | 80 - .../src/Monolog/Handler/HandlerInterface.php | 90 - .../src/Monolog/Handler/HipChatHandler.php | 250 -- .../src/Monolog/Handler/LogglyHandler.php | 69 - .../src/Monolog/Handler/MailHandler.php | 55 - .../Handler/MissingExtensionException.php | 22 - .../src/Monolog/Handler/MongoDBHandler.php | 55 - .../Monolog/Handler/NativeMailerHandler.php | 71 - .../src/Monolog/Handler/NewRelicHandler.php | 102 - .../src/Monolog/Handler/NullHandler.php | 45 - .../src/Monolog/Handler/PushoverHandler.php | 128 - .../src/Monolog/Handler/RavenHandler.php | 167 - .../src/Monolog/Handler/RedisHandler.php | 58 - .../Monolog/Handler/RotatingFileHandler.php | 149 - .../src/Monolog/Handler/SocketHandler.php | 285 -- .../src/Monolog/Handler/StreamHandler.php | 80 - .../Monolog/Handler/SwiftMailerHandler.php | 55 - .../src/Monolog/Handler/SyslogHandler.php | 67 - .../Monolog/Handler/SyslogUdp/UdpSocket.php | 62 - .../src/Monolog/Handler/SyslogUdpHandler.php | 80 - .../src/Monolog/Handler/TestHandler.php | 140 - .../Monolog/Handler/ZendMonitorHandler.php | 95 - .../monolog/monolog/src/Monolog/Logger.php | 582 --- .../src/Monolog/Processor/GitProcessor.php | 64 - .../Processor/IntrospectionProcessor.php | 82 - .../Processor/MemoryPeakUsageProcessor.php | 40 - .../src/Monolog/Processor/MemoryProcessor.php | 50 - .../Processor/MemoryUsageProcessor.php | 40 - .../Monolog/Processor/ProcessIdProcessor.php | 31 - .../Processor/PsrLogMessageProcessor.php | 42 - .../src/Monolog/Processor/UidProcessor.php | 38 - .../src/Monolog/Processor/WebProcessor.php | 66 - .../monolog/monolog/src/Monolog/Registry.php | 118 - .../tests/Monolog/ErrorHandlerTest.php | 31 - .../Formatter/ChromePHPFormatterTest.php | 158 - .../Formatter/ElasticaFormatterTest.php | 80 - .../Formatter/GelfMessageFormatterTest.php | 187 - .../Monolog/Formatter/JsonFormatterTest.php | 41 - .../Monolog/Formatter/LineFormatterTest.php | 166 - .../Formatter/LogstashFormatterTest.php | 293 -- .../Formatter/NormalizerFormatterTest.php | 182 - .../Monolog/Formatter/ScalarFormatterTest.php | 97 - .../Formatter/WildfireFormatterTest.php | 111 - .../Functional/Handler/FirePHPHandlerTest.php | 32 - .../Monolog/Handler/AbstractHandlerTest.php | 104 - .../Handler/AbstractProcessingHandlerTest.php | 80 - .../tests/Monolog/Handler/AmqpHandlerTest.php | 80 - .../Monolog/Handler/BufferHandlerTest.php | 149 - .../Monolog/Handler/ChromePHPHandlerTest.php | 139 - .../Monolog/Handler/CouchDBHandlerTest.php | 41 - .../Handler/DoctrineCouchDBHandlerTest.php | 52 - .../Monolog/Handler/DynamoDbHandlerTest.php | 73 - .../Handler/ElasticSearchHandlerTest.php | 239 -- .../Monolog/Handler/ErrorLogHandlerTest.php | 43 - .../Handler/FingersCrossedHandlerTest.php | 189 - .../Monolog/Handler/FirePHPHandlerTest.php | 94 - .../tests/Monolog/Handler/Fixtures/.gitkeep | 0 .../tests/Monolog/Handler/GelfHandlerTest.php | 94 - .../tests/Monolog/Handler/GelfMocks.php | 25 - .../Monolog/Handler/GroupHandlerTest.php | 89 - .../Monolog/Handler/HipChatHandlerTest.php | 167 - .../tests/Monolog/Handler/MailHandlerTest.php | 75 - .../tests/Monolog/Handler/MockRavenClient.php | 26 - .../Monolog/Handler/MongoDBHandlerTest.php | 63 - .../Handler/NativeMailerHandlerTest.php | 43 - .../Monolog/Handler/NewRelicHandlerTest.php | 102 - .../tests/Monolog/Handler/NullHandlerTest.php | 33 - .../Monolog/Handler/PushoverHandlerTest.php | 142 - .../Monolog/Handler/RavenHandlerTest.php | 139 - .../Monolog/Handler/RedisHandlerTest.php | 71 - .../Handler/RotatingFileHandlerTest.php | 99 - .../Monolog/Handler/SocketHandlerTest.php | 283 -- .../Monolog/Handler/StreamHandlerTest.php | 88 - .../Monolog/Handler/SyslogHandlerTest.php | 43 - .../Monolog/Handler/SyslogUdpHandlerTest.php | 39 - .../tests/Monolog/Handler/TestHandlerTest.php | 56 - .../tests/Monolog/Handler/UdpSocketTest.php | 45 - .../Handler/ZendMonitorHandlerTest.php | 69 - .../monolog/tests/Monolog/LoggerTest.php | 409 -- .../Monolog/Processor/GitProcessorTest.php | 29 - .../Processor/IntrospectionProcessorTest.php | 123 - .../MemoryPeakUsageProcessorTest.php | 29 - .../Processor/MemoryUsageProcessorTest.php | 29 - .../Processor/ProcessIdProcessorTest.php | 30 - .../Monolog/Processor/UidProcessorTest.php | 27 - .../Monolog/Processor/WebProcessorTest.php | 83 - .../tests/Monolog/PsrLogCompatTest.php | 47 - .../monolog/tests/Monolog/TestCase.php | 58 - .../monolog/monolog/tests/bootstrap.php | 15 - app/Vendor/Ratchet/vendor/psr/log/.gitignore | 1 - app/Vendor/Ratchet/vendor/psr/log/LICENSE | 19 - .../vendor/psr/log/Psr/Log/AbstractLogger.php | 120 - .../log/Psr/Log/InvalidArgumentException.php | 7 - .../vendor/psr/log/Psr/Log/LogLevel.php | 18 - .../psr/log/Psr/Log/LoggerAwareInterface.php | 17 - .../psr/log/Psr/Log/LoggerAwareTrait.php | 22 - .../psr/log/Psr/Log/LoggerInterface.php | 114 - .../vendor/psr/log/Psr/Log/LoggerTrait.php | 131 - .../vendor/psr/log/Psr/Log/NullLogger.php | 27 - .../log/Psr/Log/Test/LoggerInterfaceTest.php | 130 - app/Vendor/Ratchet/vendor/psr/log/README.md | 45 - .../Ratchet/vendor/psr/log/composer.json | 22 - .../Ratchet/vendor/react/promise/.gitignore | 4 - .../Ratchet/vendor/react/promise/.travis.yml | 12 - .../Ratchet/vendor/react/promise/CHANGELOG.md | 26 - .../Ratchet/vendor/react/promise/LICENSE | 22 - .../Ratchet/vendor/react/promise/README.md | 499 --- .../vendor/react/promise/composer.json | 21 - .../vendor/react/promise/phpunit.xml.dist | 25 - .../promise/src/React/Promise/Deferred.php | 105 - .../src/React/Promise/DeferredPromise.php | 18 - .../src/React/Promise/DeferredResolver.php | 28 - .../src/React/Promise/FulfilledPromise.php | 30 - .../promise/src/React/Promise/LazyPromise.php | 27 - .../src/React/Promise/PromiseInterface.php | 8 - .../src/React/Promise/PromisorInterface.php | 8 - .../src/React/Promise/RejectedPromise.php | 30 - .../src/React/Promise/ResolverInterface.php | 10 - .../react/promise/src/React/Promise/Util.php | 26 - .../react/promise/src/React/Promise/When.php | 168 - .../React/Promise/DeferredProgressTest.php | 349 -- .../React/Promise/DeferredPromiseTest.php | 23 - .../React/Promise/DeferredRejectTest.php | 160 - .../React/Promise/DeferredResolveTest.php | 196 - .../React/Promise/DeferredResolverTest.php | 33 - .../tests/React/Promise/DeferredTest.php | 87 - .../tests/React/Promise/ErrorCollector.php | 38 - .../React/Promise/FulfilledPromiseTest.php | 143 - .../tests/React/Promise/LazyPromiseTest.php | 88 - .../React/Promise/RejectedPromiseTest.php | 148 - .../tests/React/Promise/Stub/CallableStub.php | 10 - .../promise/tests/React/Promise/TestCase.php | 53 - .../React/Promise/UtilPromiseForTest.php | 68 - .../Promise/UtilRejectedPromiseForTest.php | 68 - .../tests/React/Promise/WhenAllTest.php | 113 - .../tests/React/Promise/WhenAnyTest.php | 134 - .../tests/React/Promise/WhenLazyTest.php | 28 - .../tests/React/Promise/WhenMapTest.php | 129 - .../tests/React/Promise/WhenReduceTest.php | 294 -- .../tests/React/Promise/WhenRejectTest.php | 70 - .../tests/React/Promise/WhenResolveTest.php | 100 - .../tests/React/Promise/WhenSomeTest.php | 119 - .../vendor/react/promise/tests/bootstrap.php | 4 - .../Ratchet/vendor/react/react/.gitignore | 2 - .../Ratchet/vendor/react/react/.travis.yml | 24 - .../Ratchet/vendor/react/react/CHANGELOG.md | 84 - app/Vendor/Ratchet/vendor/react/react/LICENSE | 19 - .../Ratchet/vendor/react/react/README.md | 104 - .../Ratchet/vendor/react/react/UPGRADE-0.3.md | 33 - .../vendor/react/react/benchmark/bench.php | 47 - .../vendor/react/react/benchmark/timers.php | 32 - .../Ratchet/vendor/react/react/composer.json | 38 - .../Ratchet/vendor/react/react/composer.lock | 151 - .../react/react/examples/dns-resolver.php | 23 - .../react/react/examples/echo-server.php | 18 - .../react/react/examples/http-client.php | 40 - .../react/examples/parallel-download.php | 46 - .../react/examples/pump-shitload-of-data.php | 23 - .../react/react/examples/scalability.php | 21 - .../vendor/react/react/examples/tcp-chat.php | 35 - .../react/react/examples/test-close-conn.php | 22 - .../react/react/examples/test-memory-http.php | 28 - .../react/react/examples/test-memory.php | 26 - .../vendor/react/react/phpunit.xml.dist | 25 - .../vendor/react/react/resources/avatar.png | Bin 10038 -> 0 bytes .../vendor/react/react/resources/logo.png | Bin 2718 -> 0 bytes .../vendor/react/react/resources/logo.psd | Bin 555922 -> 0 bytes .../react/react/resources/logo_huge.png | Bin 57139 -> 0 bytes .../vendor/react/react/scripts/do-split.sh | 21 - .../react/react/scripts/git-subsplit.sh | 232 -- .../react/src/React/Cache/ArrayCache.php | 29 - .../react/src/React/Cache/CacheInterface.php | 13 - .../react/react/src/React/Cache/README.md | 86 - .../react/react/src/React/Cache/composer.json | 19 - .../src/React/Dns/BadServerException.php | 7 - .../react/src/React/Dns/Config/Config.php | 8 - .../React/Dns/Config/FilesystemFactory.php | 74 - .../react/src/React/Dns/Model/HeaderBag.php | 56 - .../react/src/React/Dns/Model/Message.php | 47 - .../react/src/React/Dns/Model/Record.php | 21 - .../src/React/Dns/Protocol/BinaryDumper.php | 62 - .../react/src/React/Dns/Protocol/Parser.php | 228 -- .../src/React/Dns/Query/CachedExecutor.php | 68 - .../react/src/React/Dns/Query/Executor.php | 108 - .../src/React/Dns/Query/ExecutorInterface.php | 8 - .../react/react/src/React/Dns/Query/Query.php | 19 - .../react/src/React/Dns/Query/RecordBag.php | 27 - .../react/src/React/Dns/Query/RecordCache.php | 82 - .../src/React/Dns/Query/RetryExecutor.php | 51 - .../src/React/Dns/Query/TimeoutException.php | 7 - .../react/react/src/React/Dns/README.md | 55 - .../src/React/Dns/RecordNotFoundException.php | 7 - .../react/src/React/Dns/Resolver/Factory.php | 60 - .../react/src/React/Dns/Resolver/Resolver.php | 59 - .../react/react/src/React/Dns/composer.json | 21 - .../react/react/src/React/Dns/doc/rfc1034.txt | 3077 -------------- .../react/react/src/React/Dns/doc/rfc1035.txt | 3077 -------------- .../react/src/React/EventLoop/Factory.php | 20 - .../react/src/React/EventLoop/LibEvLoop.php | 152 - .../src/React/EventLoop/LibEventLoop.php | 222 - .../src/React/EventLoop/LoopInterface.php | 24 - .../react/react/src/React/EventLoop/README.md | 62 - .../src/React/EventLoop/StreamSelectLoop.php | 189 - .../react/src/React/EventLoop/Timer/Timer.php | 68 - .../React/EventLoop/Timer/TimerInterface.php | 15 - .../src/React/EventLoop/Timer/Timers.php | 104 - .../react/src/React/EventLoop/composer.json | 22 - .../react/react/src/React/Http/README.md | 30 - .../react/react/src/React/Http/Request.php | 86 - .../src/React/Http/RequestHeaderParser.php | 57 - .../react/react/src/React/Http/Response.php | 137 - .../react/src/React/Http/ResponseCodes.php | 72 - .../react/react/src/React/Http/Server.php | 62 - .../react/src/React/Http/ServerInterface.php | 9 - .../react/react/src/React/Http/composer.json | 20 - .../react/src/React/HttpClient/Client.php | 35 - .../react/src/React/HttpClient/Factory.php | 19 - .../react/src/React/HttpClient/README.md | 56 - .../react/src/React/HttpClient/Request.php | 253 -- .../src/React/HttpClient/RequestData.php | 81 - .../react/src/React/HttpClient/Response.php | 134 - .../react/src/React/HttpClient/composer.json | 21 - .../react/src/React/Socket/Connection.php | 41 - .../src/React/Socket/ConnectionException.php | 7 - .../src/React/Socket/ConnectionInterface.php | 12 - .../react/react/src/React/Socket/README.md | 53 - .../react/react/src/React/Socket/Server.php | 73 - .../src/React/Socket/ServerInterface.php | 13 - .../react/src/React/Socket/composer.json | 21 - .../SocketClient/ConnectionException.php | 7 - .../src/React/SocketClient/Connector.php | 104 - .../React/SocketClient/ConnectorInterface.php | 8 - .../react/src/React/SocketClient/README.md | 63 - .../React/SocketClient/SecureConnector.php | 32 - .../React/SocketClient/StreamEncryption.php | 97 - .../src/React/SocketClient/composer.json | 21 - .../react/react/src/React/Stream/Buffer.php | 132 - .../react/src/React/Stream/BufferedSink.php | 59 - .../src/React/Stream/CompositeStream.php | 84 - .../react/react/src/React/Stream/README.md | 67 - .../react/src/React/Stream/ReadableStream.php | 42 - .../React/Stream/ReadableStreamInterface.php | 19 - .../react/react/src/React/Stream/Stream.php | 136 - .../src/React/Stream/StreamInterface.php | 13 - .../react/src/React/Stream/ThroughStream.php | 33 - .../react/react/src/React/Stream/Util.php | 45 - .../react/src/React/Stream/WritableStream.php | 40 - .../React/Stream/WritableStreamInterface.php | 18 - .../react/src/React/Stream/composer.json | 23 - .../React/Tests/Cache/ArrayCacheTest.php | 61 - .../Dns/Config/FilesystemFactoryTest.php | 67 - .../React/Tests/Dns/Fixtures/etc/resolv.conf | 1 - .../Tests/Dns/Protocol/BinaryDumperTest.php | 47 - .../React/Tests/Dns/Protocol/ParserTest.php | 246 -- .../Tests/Dns/Query/CachedExecutorTest.php | 114 - .../React/Tests/Dns/Query/ExecutorTest.php | 306 -- .../React/Tests/Dns/Query/RecordBagTest.php | 63 - .../React/Tests/Dns/Query/RecordCacheTest.php | 122 - .../Tests/Dns/Query/RetryExecutorTest.php | 184 - .../React/Tests/Dns/Resolver/FactoryTest.php | 77 - .../Resolver/PickRandomAnswerOfTypeTest.php | 102 - .../React/Tests/Dns/Resolver/ResolverTest.php | 142 - .../Tests/EventLoop/AbstractLoopTest.php | 207 - .../React/Tests/EventLoop/LibEvLoopTest.php | 22 - .../Tests/EventLoop/LibEventLoopTest.php | 26 - .../Tests/EventLoop/StreamSelectLoopTest.php | 18 - .../EventLoop/Timer/AbstractTimerTest.php | 76 - .../Tests/EventLoop/Timer/LibEvTimerTest.php | 17 - .../EventLoop/Timer/LibEventTimerTest.php | 17 - .../EventLoop/Timer/StreamSelectTimerTest.php | 13 - .../Tests/Http/RequestHeaderParserTest.php | 137 - .../tests/React/Tests/Http/RequestTest.php | 27 - .../tests/React/Tests/Http/ResponseTest.php | 166 - .../tests/React/Tests/Http/ServerTest.php | 81 - .../React/Tests/HttpClient/RequestTest.php | 408 -- .../React/Tests/HttpClient/ResponseTest.php | 81 - .../React/Tests/Socket/ConnectionTest.php | 77 - .../tests/React/Tests/Socket/ServerTest.php | 167 - .../React/Tests/Socket/Stub/CallableStub.php | 10 - .../Tests/Socket/Stub/ConnectionStub.php | 63 - .../React/Tests/Socket/Stub/ServerStub.php | 22 - .../tests/React/Tests/Socket/TestCase.php | 41 - .../Tests/SocketClient/ConnectorTest.php | 102 - .../tests/React/Tests/Stream/BufferTest.php | 210 - .../React/Tests/Stream/BufferedSinkTest.php | 195 - .../Tests/Stream/CompositeStreamTest.php | 156 - .../React/Tests/Stream/ReadableStreamTest.php | 49 - .../tests/React/Tests/Stream/StreamTest.php | 137 - .../Tests/Stream/Stub/ReadableStreamStub.php | 61 - .../React/Tests/Stream/ThroughStreamTest.php | 143 - .../tests/React/Tests/Stream/UtilTest.php | 158 - .../React/Tests/Stream/WritableStreamTest.php | 72 - .../vendor/react/react/tests/bootstrap.php | 4 - .../Component/EventDispatcher/.gitignore | 3 - .../Component/EventDispatcher/CHANGELOG.md | 23 - .../ContainerAwareEventDispatcher.php | 202 - .../Debug/TraceableEventDispatcher.php | 372 -- .../TraceableEventDispatcherInterface.php | 34 - .../RegisterListenersPass.php | 106 - .../Component/EventDispatcher/Event.php | 129 - .../EventDispatcher/EventDispatcher.php | 185 - .../EventDispatcherInterface.php | 96 - .../EventSubscriberInterface.php | 50 - .../EventDispatcher/GenericEvent.php | 186 - .../ImmutableEventDispatcher.php | 92 - .../Symfony/Component/EventDispatcher/LICENSE | 19 - .../Component/EventDispatcher/README.md | 25 - .../ContainerAwareEventDispatcherTest.php | 250 -- .../Debug/TraceableEventDispatcherTest.php | 171 - .../RegisterListenersPassTest.php | 140 - .../Tests/EventDispatcherTest.php | 345 -- .../EventDispatcher/Tests/EventTest.php | 84 - .../Tests/GenericEventTest.php | 140 - .../Tests/ImmutableEventDispatcherTest.php | 106 - .../Component/EventDispatcher/composer.json | 40 - .../EventDispatcher/phpunit.xml.dist | 30 - .../Component/HttpFoundation/.gitignore | 3 - .../Component/HttpFoundation/AcceptHeader.php | 172 - .../HttpFoundation/AcceptHeaderItem.php | 226 -- .../HttpFoundation/ApacheRequest.php | 43 - .../HttpFoundation/BinaryFileResponse.php | 290 -- .../Component/HttpFoundation/CHANGELOG.md | 111 - .../Component/HttpFoundation/Cookie.php | 210 - .../ExpressionRequestMatcher.php | 47 - .../File/Exception/AccessDeniedException.php | 30 - .../File/Exception/FileException.php | 21 - .../File/Exception/FileNotFoundException.php | 30 - .../Exception/UnexpectedTypeException.php | 20 - .../File/Exception/UploadException.php | 21 - .../Component/HttpFoundation/File/File.php | 160 - .../File/MimeType/ExtensionGuesser.php | 99 - .../MimeType/ExtensionGuesserInterface.php | 26 - .../MimeType/FileBinaryMimeTypeGuesser.php | 87 - .../File/MimeType/FileinfoMimeTypeGuesser.php | 71 - .../MimeType/MimeTypeExtensionGuesser.php | 805 ---- .../File/MimeType/MimeTypeGuesser.php | 132 - .../MimeType/MimeTypeGuesserInterface.php | 35 - .../HttpFoundation/File/UploadedFile.php | 313 -- .../Component/HttpFoundation/FileBag.php | 155 - .../Component/HttpFoundation/HeaderBag.php | 323 -- .../Component/HttpFoundation/IpUtils.php | 121 - .../Component/HttpFoundation/JsonResponse.php | 180 - .../Symfony/Component/HttpFoundation/LICENSE | 19 - .../Component/HttpFoundation/ParameterBag.php | 305 -- .../Component/HttpFoundation/README.md | 48 - .../HttpFoundation/RedirectResponse.php | 106 - .../Component/HttpFoundation/Request.php | 1854 --------- .../HttpFoundation/RequestMatcher.php | 160 - .../RequestMatcherInterface.php | 33 - .../Component/HttpFoundation/RequestStack.php | 103 - .../stubs/SessionHandlerInterface.php | 100 - .../Component/HttpFoundation/Response.php | 1257 ------ .../HttpFoundation/ResponseHeaderBag.php | 319 -- .../Component/HttpFoundation/ServerBag.php | 91 - .../Session/Attribute/AttributeBag.php | 157 - .../Attribute/AttributeBagInterface.php | 72 - .../Attribute/NamespacedAttributeBag.php | 158 - .../Session/Flash/AutoExpireFlashBag.php | 175 - .../HttpFoundation/Session/Flash/FlashBag.php | 180 - .../Session/Flash/FlashBagInterface.php | 93 - .../HttpFoundation/Session/Session.php | 251 -- .../Session/SessionBagInterface.php | 48 - .../Session/SessionInterface.php | 208 - .../Handler/MemcacheSessionHandler.php | 119 - .../Handler/MemcachedSessionHandler.php | 125 - .../Storage/Handler/MongoDbSessionHandler.php | 173 - .../Handler/NativeFileSessionHandler.php | 58 - .../Storage/Handler/NativeSessionHandler.php | 24 - .../Storage/Handler/NullSessionHandler.php | 72 - .../Storage/Handler/PdoSessionHandler.php | 253 -- .../Handler/WriteCheckSessionHandler.php | 91 - .../Session/Storage/MetadataBag.php | 170 - .../Storage/MockArraySessionStorage.php | 268 -- .../Storage/MockFileSessionStorage.php | 138 - .../Session/Storage/NativeSessionStorage.php | 433 -- .../Storage/PhpBridgeSessionStorage.php | 68 - .../Session/Storage/Proxy/AbstractProxy.php | 154 - .../Session/Storage/Proxy/NativeProxy.php | 41 - .../Storage/Proxy/SessionHandlerProxy.php | 95 - .../Storage/SessionStorageInterface.php | 145 - .../HttpFoundation/StreamedResponse.php | 133 - .../Tests/AcceptHeaderItemTest.php | 112 - .../HttpFoundation/Tests/AcceptHeaderTest.php | 102 - .../Tests/ApacheRequestTest.php | 92 - .../Tests/BinaryFileResponseTest.php | 214 - .../HttpFoundation/Tests/CookieTest.php | 145 - .../HttpFoundation/Tests/File/FileTest.php | 169 - .../Tests/File/Fixtures/.unknownextension | 1 - .../Tests/File/Fixtures/directory/.empty | 0 .../HttpFoundation/Tests/File/Fixtures/test | Bin 35 -> 0 bytes .../Tests/File/Fixtures/test.gif | Bin 35 -> 0 bytes .../Tests/File/MimeType/MimeTypeTest.php | 105 - .../Tests/File/UploadedFileTest.php | 272 -- .../HttpFoundation/Tests/FileBagTest.php | 148 - .../HttpFoundation/Tests/HeaderBagTest.php | 216 - .../HttpFoundation/Tests/IpUtilsTest.php | 81 - .../HttpFoundation/Tests/JsonResponseTest.php | 204 - .../HttpFoundation/Tests/ParameterBagTest.php | 254 -- .../Tests/RedirectResponseTest.php | 83 - .../Tests/RequestMatcherTest.php | 130 - .../HttpFoundation/Tests/RequestTest.php | 1656 -------- .../Tests/ResponseHeaderBagTest.php | 286 -- .../HttpFoundation/Tests/ResponseTest.php | 807 ---- .../HttpFoundation/Tests/ResponseTestCase.php | 88 - .../HttpFoundation/Tests/ServerBagTest.php | 123 - .../Session/Attribute/AttributeBagTest.php | 193 - .../Attribute/NamespacedAttributeBagTest.php | 183 - .../Session/Flash/AutoExpireFlashBagTest.php | 155 - .../Tests/Session/Flash/FlashBagTest.php | 155 - .../Tests/Session/SessionTest.php | 227 -- .../Handler/MemcacheSessionHandlerTest.php | 132 - .../Handler/MemcachedSessionHandlerTest.php | 127 - .../Handler/MongoDbSessionHandlerTest.php | 181 - .../Handler/NativeFileSessionHandlerTest.php | 80 - .../Handler/NativeSessionHandlerTest.php | 39 - .../Handler/NullSessionHandlerTest.php | 57 - .../Storage/Handler/PdoSessionHandlerTest.php | 111 - .../Handler/WriteCheckSessionHandlerTest.php | 94 - .../Tests/Session/Storage/MetadataBagTest.php | 135 - .../Storage/MockArraySessionStorageTest.php | 106 - .../Storage/MockFileSessionStorageTest.php | 126 - .../Storage/NativeSessionStorageTest.php | 283 -- .../Storage/PhpBridgeSessionStorageTest.php | 123 - .../Storage/Proxy/AbstractProxyTest.php | 212 - .../Session/Storage/Proxy/NativeProxyTest.php | 35 - .../Storage/Proxy/SessionHandlerProxyTest.php | 126 - .../Tests/StreamedResponseTest.php | 114 - .../Component/HttpFoundation/composer.json | 32 - .../Component/HttpFoundation/phpunit.xml.dist | 30 - .../Symfony/Component/Routing/.gitignore | 3 - .../Component/Routing/Annotation/Route.php | 161 - .../Symfony/Component/Routing/CHANGELOG.md | 169 - .../Component/Routing/CompiledRoute.php | 134 - .../Routing/Exception/ExceptionInterface.php | 23 - .../Exception/InvalidParameterException.php | 23 - .../Exception/MethodNotAllowedException.php | 46 - .../MissingMandatoryParametersException.php | 24 - .../Exception/ResourceNotFoundException.php | 25 - .../Exception/RouteNotFoundException.php | 23 - .../ConfigurableRequirementsInterface.php | 55 - .../Generator/Dumper/GeneratorDumper.php | 45 - .../Dumper/GeneratorDumperInterface.php | 41 - .../Generator/Dumper/PhpGeneratorDumper.php | 124 - .../Routing/Generator/UrlGenerator.php | 339 -- .../Generator/UrlGeneratorInterface.php | 87 - .../routing/Symfony/Component/Routing/LICENSE | 19 - .../Routing/Loader/AnnotationClassLoader.php | 268 -- .../Loader/AnnotationDirectoryLoader.php | 77 - .../Routing/Loader/AnnotationFileLoader.php | 122 - .../Routing/Loader/ClosureLoader.php | 52 - .../Routing/Loader/PhpFileLoader.php | 62 - .../Routing/Loader/XmlFileLoader.php | 245 -- .../Routing/Loader/YamlFileLoader.php | 217 - .../Loader/schema/routing/routing-1.0.xsd | 70 - .../Routing/Matcher/ApacheUrlMatcher.php | 122 - .../Matcher/Dumper/ApacheMatcherDumper.php | 281 -- .../Matcher/Dumper/DumperCollection.php | 159 - .../Matcher/Dumper/DumperPrefixCollection.php | 108 - .../Routing/Matcher/Dumper/DumperRoute.php | 64 - .../Routing/Matcher/Dumper/MatcherDumper.php | 45 - .../Matcher/Dumper/MatcherDumperInterface.php | 39 - .../Matcher/Dumper/PhpMatcherDumper.php | 402 -- .../Matcher/RedirectableUrlMatcher.php | 67 - .../RedirectableUrlMatcherInterface.php | 35 - .../Matcher/RequestMatcherInterface.php | 39 - .../Routing/Matcher/TraceableUrlMatcher.php | 131 - .../Component/Routing/Matcher/UrlMatcher.php | 244 -- .../Routing/Matcher/UrlMatcherInterface.php | 43 - .../Symfony/Component/Routing/README.md | 34 - .../Component/Routing/RequestContext.php | 315 -- .../Routing/RequestContextAwareInterface.php | 36 - .../Symfony/Component/Routing/Route.php | 646 --- .../Component/Routing/RouteCollection.php | 285 -- .../Component/Routing/RouteCompiler.php | 233 -- .../Routing/RouteCompilerInterface.php | 32 - .../Symfony/Component/Routing/Router.php | 323 -- .../Component/Routing/RouterInterface.php | 32 - .../Routing/Tests/Annotation/RouteTest.php | 50 - .../Routing/Tests/CompiledRouteTest.php | 26 - .../AnnotatedClasses/AbstractClass.php | 16 - .../Fixtures/AnnotatedClasses/BarClass.php | 19 - .../Fixtures/AnnotatedClasses/FooClass.php | 16 - .../Tests/Fixtures/CustomXmlFileLoader.php | 26 - .../Tests/Fixtures/RedirectableUrlMatcher.php | 30 - .../Routing/Tests/Fixtures/annotated.php | 0 .../Tests/Fixtures/dumper/url_matcher1.apache | 163 - .../Tests/Fixtures/dumper/url_matcher1.php | 312 -- .../Tests/Fixtures/dumper/url_matcher2.apache | 7 - .../Tests/Fixtures/dumper/url_matcher2.php | 344 -- .../Tests/Fixtures/dumper/url_matcher3.php | 50 - .../Routing/Tests/Fixtures/empty.yml | 0 .../Component/Routing/Tests/Fixtures/foo.xml | 0 .../Component/Routing/Tests/Fixtures/foo1.xml | 0 .../Routing/Tests/Fixtures/incomplete.yml | 2 - .../Routing/Tests/Fixtures/missing_id.xml | 8 - .../Routing/Tests/Fixtures/missing_path.xml | 8 - .../Tests/Fixtures/namespaceprefix.xml | 13 - .../Fixtures/nonesense_resource_plus_path.yml | 3 - .../nonesense_type_without_resource.yml | 3 - .../Routing/Tests/Fixtures/nonvalid.xml | 11 - .../Routing/Tests/Fixtures/nonvalid.yml | 1 - .../Routing/Tests/Fixtures/nonvalid2.yml | 1 - .../Routing/Tests/Fixtures/nonvalidkeys.yml | 3 - .../Routing/Tests/Fixtures/nonvalidnode.xml | 8 - .../Routing/Tests/Fixtures/nonvalidroute.xml | 13 - .../Tests/Fixtures/special_route_name.yml | 2 - .../Routing/Tests/Fixtures/validpattern.php | 27 - .../Routing/Tests/Fixtures/validpattern.xml | 25 - .../Routing/Tests/Fixtures/validpattern.yml | 22 - .../Routing/Tests/Fixtures/validresource.xml | 13 - .../Routing/Tests/Fixtures/validresource.yml | 8 - .../Routing/Tests/Fixtures/withdoctype.xml | 3 - .../Dumper/PhpGeneratorDumperTest.php | 150 - .../Tests/Generator/UrlGeneratorTest.php | 671 ---- .../Loader/AbstractAnnotationLoaderTest.php | 31 - .../Loader/AnnotationClassLoaderTest.php | 158 - .../Loader/AnnotationDirectoryLoaderTest.php | 53 - .../Tests/Loader/AnnotationFileLoaderTest.php | 47 - .../Tests/Loader/ClosureLoaderTest.php | 48 - .../Tests/Loader/PhpFileLoaderTest.php | 48 - .../Tests/Loader/XmlFileLoaderTest.php | 124 - .../Tests/Loader/YamlFileLoaderTest.php | 107 - .../Tests/Matcher/ApacheUrlMatcherTest.php | 152 - .../Dumper/ApacheMatcherDumperTest.php | 196 - .../Matcher/Dumper/DumperCollectionTest.php | 33 - .../Dumper/DumperPrefixCollectionTest.php | 123 - .../Matcher/Dumper/PhpMatcherDumperTest.php | 264 -- .../Matcher/RedirectableUrlMatcherTest.php | 86 - .../Tests/Matcher/TraceableUrlMatcherTest.php | 101 - .../Routing/Tests/Matcher/UrlMatcherTest.php | 406 -- .../Routing/Tests/RequestContextTest.php | 101 - .../Routing/Tests/RouteCollectionTest.php | 304 -- .../Routing/Tests/RouteCompilerTest.php | 253 -- .../Component/Routing/Tests/RouteTest.php | 240 -- .../Component/Routing/Tests/RouterTest.php | 163 - .../Symfony/Component/Routing/composer.json | 44 - .../Component/Routing/phpunit.xml.dist | 29 - .../vendor/tavendo/AutobahnJS/.gitignore | 2 - .../vendor/tavendo/AutobahnJS/.gitmodules | 3 - .../Ratchet/vendor/tavendo/AutobahnJS/LICENSE | 18 - .../vendor/tavendo/AutobahnJS/README.md | 92 - .../vendor/tavendo/AutobahnJS/SConstruct | 86 - .../tavendo/AutobahnJS/autobahn/autobahn.js | 824 ---- .../tavendo/AutobahnJS/autobahn/license.js | 13 - .../vendor/tavendo/AutobahnJS/version.txt | 1 - app/Vendor/WideImage/Canvas.php | 167 - app/Vendor/WideImage/Coordinate.php | 208 - app/Vendor/WideImage/Exception.php | 31 - app/Vendor/WideImage/Font/GDF.php | 48 - app/Vendor/WideImage/Font/PS.php | 60 - app/Vendor/WideImage/Font/TTF.php | 75 - app/Vendor/WideImage/Image.php | 964 ----- app/Vendor/WideImage/Mapper/BMP.php | 51 - app/Vendor/WideImage/Mapper/GD.php | 44 - app/Vendor/WideImage/Mapper/GD2.php | 41 - app/Vendor/WideImage/Mapper/GIF.php | 50 - app/Vendor/WideImage/Mapper/JPEG.php | 41 - app/Vendor/WideImage/Mapper/PNG.php | 41 - app/Vendor/WideImage/Mapper/TGA.php | 48 - app/Vendor/WideImage/MapperFactory.php | 126 - app/Vendor/WideImage/Operation/AddNoise.php | 153 - .../WideImage/Operation/ApplyConvolution.php | 48 - .../WideImage/Operation/ApplyFilter.php | 67 - app/Vendor/WideImage/Operation/ApplyMask.php | 105 - .../WideImage/Operation/AsGrayscale.php | 49 - app/Vendor/WideImage/Operation/AsNegative.php | 63 - app/Vendor/WideImage/Operation/AutoCrop.php | 162 - .../Operation/CopyChannelsPalette.php | 90 - .../Operation/CopyChannelsTrueColor.php | 67 - .../WideImage/Operation/CorrectGamma.php | 48 - app/Vendor/WideImage/Operation/Crop.php | 86 - app/Vendor/WideImage/Operation/Flip.php | 54 - app/Vendor/WideImage/Operation/GetMask.php | 67 - app/Vendor/WideImage/Operation/Merge.php | 78 - app/Vendor/WideImage/Operation/Mirror.php | 55 - app/Vendor/WideImage/Operation/Resize.php | 157 - .../WideImage/Operation/ResizeCanvas.php | 107 - app/Vendor/WideImage/Operation/Rotate.php | 64 - .../WideImage/Operation/RoundCorners.php | 114 - app/Vendor/WideImage/Operation/Unsharp.php | 135 - app/Vendor/WideImage/OperationFactory.php | 57 - app/Vendor/WideImage/PaletteImage.php | 136 - app/Vendor/WideImage/TrueColorImage.php | 218 - app/Vendor/WideImage/WideImage.php | 377 -- app/Vendor/WideImage/vendor/de77/BMP.php | 264 -- app/Vendor/WideImage/vendor/de77/TGA.php | 206 - app/Vendor/autoload.php | 7 - app/Vendor/bin/doctrine-dbal | 1 - app/Vendor/bootstrap/custom_bootstrap.less | 53 - app/Vendor/bootstrap/custom_overrides.less | 0 app/Vendor/bootstrap/custom_variables.less | 1 - app/Vendor/bootstrap/less/alerts.less | 67 - app/Vendor/bootstrap/less/badges.less | 55 - app/Vendor/bootstrap/less/bootstrap.less | 49 - app/Vendor/bootstrap/less/breadcrumbs.less | 26 - app/Vendor/bootstrap/less/button-groups.less | 226 -- app/Vendor/bootstrap/less/buttons.less | 155 - app/Vendor/bootstrap/less/carousel.less | 232 -- app/Vendor/bootstrap/less/close.less | 33 - app/Vendor/bootstrap/less/code.less | 63 - .../bootstrap/less/component-animations.less | 29 - app/Vendor/bootstrap/less/dropdowns.less | 213 - app/Vendor/bootstrap/less/forms.less | 419 -- app/Vendor/bootstrap/less/glyphicons.less | 233 -- app/Vendor/bootstrap/less/grid.less | 100 - app/Vendor/bootstrap/less/input-groups.less | 157 - app/Vendor/bootstrap/less/jumbotron.less | 44 - app/Vendor/bootstrap/less/labels.less | 64 - app/Vendor/bootstrap/less/list-group.less | 110 - app/Vendor/bootstrap/less/media.less | 56 - app/Vendor/bootstrap/less/mixins.less | 926 ----- app/Vendor/bootstrap/less/modals.less | 138 - app/Vendor/bootstrap/less/navbar.less | 616 --- app/Vendor/bootstrap/less/navs.less | 242 -- app/Vendor/bootstrap/less/normalize.less | 423 -- app/Vendor/bootstrap/less/pager.less | 55 - app/Vendor/bootstrap/less/pagination.less | 88 - app/Vendor/bootstrap/less/panels.less | 230 -- app/Vendor/bootstrap/less/popovers.less | 133 - app/Vendor/bootstrap/less/print.less | 101 - app/Vendor/bootstrap/less/progress-bars.less | 80 - .../bootstrap/less/responsive-utilities.less | 93 - app/Vendor/bootstrap/less/scaffolding.less | 134 - app/Vendor/bootstrap/less/tables.less | 233 -- app/Vendor/bootstrap/less/theme.less | 247 -- app/Vendor/bootstrap/less/thumbnails.less | 36 - app/Vendor/bootstrap/less/tooltip.less | 95 - app/Vendor/bootstrap/less/type.less | 296 -- app/Vendor/bootstrap/less/utilities.less | 56 - app/Vendor/bootstrap/less/variables.less | 827 ---- app/Vendor/bootstrap/less/wells.less | 29 - app/Vendor/composer/ClassLoader.php | 445 --- app/Vendor/composer/LICENSE | 21 - app/Vendor/composer/autoload_classmap.php | 9 - app/Vendor/composer/autoload_files.php | 12 - app/Vendor/composer/autoload_namespaces.php | 16 - app/Vendor/composer/autoload_psr4.php | 22 - app/Vendor/composer/autoload_real.php | 70 - app/Vendor/composer/autoload_static.php | 150 - app/Vendor/composer/installed.json | 1039 ----- app/Vendor/crate/crate-dbal/.gitignore | 11 - app/Vendor/crate/crate-dbal/.scrutinizer.yml | 41 - app/Vendor/crate/crate-dbal/.travis.yml | 32 - app/Vendor/crate/crate-dbal/AUTHORS.rst | 13 - app/Vendor/crate/crate-dbal/CHANGES.txt | 99 - app/Vendor/crate/crate-dbal/DEVELOP.rst | 64 - app/Vendor/crate/crate-dbal/LICENSE | 218 - app/Vendor/crate/crate-dbal/README.rst | 77 - app/Vendor/crate/crate-dbal/Vagrantfile | 15 - app/Vendor/crate/crate-dbal/composer.json | 29 - .../crate/crate-dbal/devtools/create_tag.sh | 86 - app/Vendor/crate/crate-dbal/docs/bootstrap.py | 189 - app/Vendor/crate/crate-dbal/docs/buildout.cfg | 15 - app/Vendor/crate/crate-dbal/docs/conf.py | 14 - .../crate/crate-dbal/docs/docutils.conf | 2 - app/Vendor/crate/crate-dbal/docs/index.rst | 33 - .../crate/crate-dbal/docs/installation.rst | 41 - .../crate/crate-dbal/docs/requirements.txt | 1 - app/Vendor/crate/crate-dbal/docs/usage.rst | 88 - app/Vendor/crate/crate-dbal/docs/versions.cfg | 23 - app/Vendor/crate/crate-dbal/phpunit.xml.dist | 22 - app/Vendor/crate/crate-dbal/provisioning.sh | 22 - .../src/Crate/DBAL/Driver/PDOCrate/Driver.php | 104 - .../DBAL/Driver/PDOCrate/PDOConnection.php | 51 - .../Crate/DBAL/Platforms/Crate057Platform.php | 72 - .../Crate/DBAL/Platforms/CratePlatform.php | 757 ---- .../DBAL/Platforms/Keywords/CrateKeywords.php | 125 - .../Crate/DBAL/Schema/CrateSchemaManager.php | 112 - .../src/Crate/DBAL/Types/ArrayType.php | 85 - .../src/Crate/DBAL/Types/MapType.php | 92 - .../src/Crate/DBAL/Types/TimestampType.php | 80 - .../Test/DBAL/DBALFunctionalTestCase.php | 116 - .../Test/DBAL/Functional/BindingTest.php | 128 - .../Test/DBAL/Functional/ConnectionTest.php | 90 - .../Test/DBAL/Functional/DataAccessTest.php | 600 --- .../DBAL/Functional/ModifyLimitQueryTest.php | 126 - .../DBAL/Functional/NamedParametersTest.php | 179 - .../Functional/Schema/SchemaManagerTest.php | 232 -- .../DBAL/Functional/TypeConversionTest.php | 178 - .../DBAL/Functional/Types/MapTypeTest.php | 52 - .../Crate/Test/DBAL/Functional/WriteTest.php | 205 - .../Test/DBAL/Platforms/CratePlatformTest.php | 476 --- app/Vendor/crate/crate-pdo/.gitignore | 15 - app/Vendor/crate/crate-pdo/.scrutinizer.yml | 36 - app/Vendor/crate/crate-pdo/.travis.yml | 32 - app/Vendor/crate/crate-pdo/AUTHORS.rst | 15 - app/Vendor/crate/crate-pdo/CHANGES.txt | 119 - app/Vendor/crate/crate-pdo/DEVELOP.rst | 68 - app/Vendor/crate/crate-pdo/LICENSE | 218 - app/Vendor/crate/crate-pdo/NOTICE | 17 - app/Vendor/crate/crate-pdo/README.rst | 69 - app/Vendor/crate/crate-pdo/Vagrantfile | 15 - app/Vendor/crate/crate-pdo/composer.json | 27 - .../crate/crate-pdo/devtools/create_tag.sh | 95 - app/Vendor/crate/crate-pdo/docs/conf.py | 14 - app/Vendor/crate/crate-pdo/docs/docutils.conf | 3 - app/Vendor/crate/crate-pdo/docs/index.rst | 30 - .../crate/crate-pdo/docs/installation.rst | 25 - .../crate/crate-pdo/docs/requirements.txt | 1 - app/Vendor/crate/crate-pdo/docs/usage.rst | 118 - app/Vendor/crate/crate-pdo/phpunit.xml.dist | 25 - app/Vendor/crate/crate-pdo/provisioning.sh | 23 - .../PDO/Exception/ExceptionInterface.php | 27 - .../Exception/InvalidArgumentException.php | 31 - .../Crate/PDO/Exception/LogicException.php | 26 - .../PDO/Exception/OutOfBoundsException.php | 27 - .../src/Crate/PDO/Exception/PDOException.php | 29 - .../Crate/PDO/Exception/RuntimeException.php | 27 - .../PDO/Exception/UnsupportedException.php | 33 - .../crate-pdo/src/Crate/PDO/Http/Client.php | 231 -- .../src/Crate/PDO/Http/ClientInterface.php | 49 - .../PDO/Http/InternalClientInterface.php | 66 - .../crate-pdo/src/Crate/PDO/Http/Server.php | 110 - .../crate/crate-pdo/src/Crate/PDO/PDO.php | 398 -- .../crate-pdo/src/Crate/PDO/PDOInterface.php | 49 - .../crate-pdo/src/Crate/PDO/PDOStatement.php | 639 --- .../crate-pdo/src/Crate/Stdlib/ArrayUtils.php | 56 - .../crate-pdo/src/Crate/Stdlib/Collection.php | 153 - .../src/Crate/Stdlib/CollectionInterface.php | 63 - .../crate-pdo/src/Crate/Stdlib/CrateConst.php | 52 - .../Stdlib/Exception/ExceptionInterface.php | 27 - .../Exception/InvalidArgumentException.php | 29 - .../PDO/AbstractIntegrationTest.php | 64 - .../PDO/PDOStatementTest.php | 317 -- .../test/CrateIntegrationTest/PDO/PDOTest.php | 75 - .../PDO/Exception/PDOExceptionTest.php | 44 - .../Exception/UnsupportedExceptionTest.php | 44 - .../test/CrateTest/PDO/Http/ClientTest.php | 237 -- .../test/CrateTest/PDO/Http/ServerTest.php | 143 - .../test/CrateTest/PDO/PDOParseDSNTest.php | 112 - .../test/CrateTest/PDO/PDOStatementTest.php | 952 ----- .../crate-pdo/test/CrateTest/PDO/PDOTest.php | 363 -- .../test/CrateTest/Stdlib/ArrayUtilsTest.php | 54 - .../test/CrateTest/Stdlib/CollectionTest.php | 111 - app/Vendor/ddeboer/imap/.gitignore | 2 - app/Vendor/ddeboer/imap/.scrutinizer.yml | 5 - app/Vendor/ddeboer/imap/.travis.yml | 20 - app/Vendor/ddeboer/imap/LICENSE | 19 - app/Vendor/ddeboer/imap/README.md | 211 - app/Vendor/ddeboer/imap/composer.json | 32 - app/Vendor/ddeboer/imap/composer.lock | 930 ----- app/Vendor/ddeboer/imap/phpunit.xml.dist | 9 - app/Vendor/ddeboer/imap/src/Connection.php | 160 - .../AuthenticationFailedException.php | 17 - .../ddeboer/imap/src/Exception/Exception.php | 24 - .../MailboxDoesNotExistException.php | 11 - .../src/Exception/MessageDeleteException.php | 11 - .../MessageDoesNotExistException.php | 17 - .../src/Exception/MessageMoveException.php | 17 - app/Vendor/ddeboer/imap/src/Mailbox.php | 143 - app/Vendor/ddeboer/imap/src/Message.php | 331 -- .../ddeboer/imap/src/Message/Attachment.php | 30 - .../ddeboer/imap/src/Message/EmailAddress.php | 66 - .../ddeboer/imap/src/Message/Headers.php | 83 - app/Vendor/ddeboer/imap/src/Message/Part.php | 354 -- .../ddeboer/imap/src/MessageIterator.php | 31 - app/Vendor/ddeboer/imap/src/Parameters.php | 46 - .../imap/src/Search/AbstractCondition.php | 26 - .../imap/src/Search/Date/AbstractDate.php | 58 - .../ddeboer/imap/src/Search/Date/After.php | 20 - .../ddeboer/imap/src/Search/Date/Before.php | 20 - .../ddeboer/imap/src/Search/Date/On.php | 20 - .../imap/src/Search/Email/AbstractEmail.php | 50 - .../imap/src/Search/Email/FromAddress.php | 20 - .../ddeboer/imap/src/Search/Email/To.php | 21 - .../ddeboer/imap/src/Search/Flag/Answered.php | 22 - .../ddeboer/imap/src/Search/Flag/Flagged.php | 22 - .../ddeboer/imap/src/Search/Flag/Recent.php | 22 - .../ddeboer/imap/src/Search/Flag/Seen.php | 22 - .../imap/src/Search/Flag/Unanswered.php | 22 - .../imap/src/Search/Flag/Unflagged.php | 22 - .../ddeboer/imap/src/Search/Flag/Unseen.php | 22 - .../imap/src/Search/LogicalOperator/All.php | 22 - .../Search/LogicalOperator/OrConditions.php | 22 - .../ddeboer/imap/src/Search/State/Deleted.php | 22 - .../imap/src/Search/State/NewMessage.php | 21 - .../ddeboer/imap/src/Search/State/Old.php | 21 - .../imap/src/Search/State/Undeleted.php | 22 - .../imap/src/Search/Text/AbstractText.php | 51 - .../ddeboer/imap/src/Search/Text/Body.php | 20 - .../ddeboer/imap/src/Search/Text/Keyword.php | 20 - .../ddeboer/imap/src/Search/Text/Subject.php | 20 - .../ddeboer/imap/src/Search/Text/Text.php | 20 - .../imap/src/Search/Text/Unkeyword.php | 20 - .../ddeboer/imap/src/SearchExpression.php | 42 - app/Vendor/ddeboer/imap/src/Server.php | 120 - app/Vendor/ddeboer/transcoder/.gitignore | 2 - app/Vendor/ddeboer/transcoder/.travis.yml | 16 - app/Vendor/ddeboer/transcoder/LICENSE | 22 - app/Vendor/ddeboer/transcoder/README.md | 132 - app/Vendor/ddeboer/transcoder/composer.json | 37 - .../ddeboer/transcoder/phpunit.xml.dist | 11 - .../Exception/ExtensionMissingException.php | 8 - .../Exception/IllegalCharacterException.php | 17 - .../UndetectableEncodingException.php | 11 - .../UnsupportedEncodingException.php | 16 - .../transcoder/src/IconvTranscoder.php | 43 - .../ddeboer/transcoder/src/MbTranscoder.php | 80 - .../ddeboer/transcoder/src/Transcoder.php | 72 - .../transcoder/src/TranscoderInterface.php | 21 - app/Vendor/doctrine/annotations/LICENSE | 19 - app/Vendor/doctrine/annotations/README.md | 19 - app/Vendor/doctrine/annotations/composer.json | 31 - .../Common/Annotations/Annotation.php | 79 - .../Annotations/Annotation/Attribute.php | 47 - .../Annotations/Annotation/Attributes.php | 37 - .../Common/Annotations/Annotation/Enum.php | 84 - .../Annotation/IgnoreAnnotation.php | 54 - .../Annotations/Annotation/Required.php | 33 - .../Common/Annotations/Annotation/Target.php | 107 - .../Annotations/AnnotationException.php | 197 - .../Common/Annotations/AnnotationReader.php | 394 -- .../Common/Annotations/AnnotationRegistry.php | 151 - .../Common/Annotations/CachedReader.php | 235 -- .../Doctrine/Common/Annotations/DocLexer.php | 134 - .../Doctrine/Common/Annotations/DocParser.php | 1138 ------ .../Common/Annotations/FileCacheReader.php | 288 -- .../Common/Annotations/IndexedReader.php | 119 - .../Doctrine/Common/Annotations/PhpParser.php | 91 - .../Doctrine/Common/Annotations/Reader.php | 89 - .../Annotations/SimpleAnnotationReader.php | 127 - .../Common/Annotations/TokenParser.php | 187 - app/Vendor/doctrine/cache/.coveralls.yml | 4 - app/Vendor/doctrine/cache/.gitignore | 4 - app/Vendor/doctrine/cache/.travis.yml | 42 - app/Vendor/doctrine/cache/LICENSE | 19 - app/Vendor/doctrine/cache/README.md | 14 - app/Vendor/doctrine/cache/UPGRADE.md | 16 - app/Vendor/doctrine/cache/build.properties | 3 - app/Vendor/doctrine/cache/build.xml | 110 - app/Vendor/doctrine/cache/composer.json | 37 - .../lib/Doctrine/Common/Cache/ApcCache.php | 118 - .../lib/Doctrine/Common/Cache/ApcuCache.php | 106 - .../lib/Doctrine/Common/Cache/ArrayCache.php | 142 - .../cache/lib/Doctrine/Common/Cache/Cache.php | 116 - .../Doctrine/Common/Cache/CacheProvider.php | 312 -- .../lib/Doctrine/Common/Cache/ChainCache.php | 147 - .../Doctrine/Common/Cache/ClearableCache.php | 40 - .../Doctrine/Common/Cache/CouchbaseCache.php | 121 - .../lib/Doctrine/Common/Cache/FileCache.php | 286 -- .../Doctrine/Common/Cache/FilesystemCache.php | 111 - .../Doctrine/Common/Cache/FlushableCache.php | 37 - .../Doctrine/Common/Cache/MemcacheCache.php | 126 - .../Doctrine/Common/Cache/MemcachedCache.php | 146 - .../Doctrine/Common/Cache/MongoDBCache.php | 197 - .../Doctrine/Common/Cache/MultiGetCache.php | 39 - .../Doctrine/Common/Cache/MultiPutCache.php | 41 - .../Doctrine/Common/Cache/PhpFileCache.php | 120 - .../lib/Doctrine/Common/Cache/PredisCache.php | 136 - .../lib/Doctrine/Common/Cache/RedisCache.php | 180 - .../lib/Doctrine/Common/Cache/RiakCache.php | 250 -- .../Doctrine/Common/Cache/SQLite3Cache.php | 220 - .../lib/Doctrine/Common/Cache/Version.php | 25 - .../lib/Doctrine/Common/Cache/VoidCache.php | 78 - .../Doctrine/Common/Cache/WinCacheCache.php | 109 - .../lib/Doctrine/Common/Cache/XcacheCache.php | 112 - .../Doctrine/Common/Cache/ZendDataCache.php | 83 - app/Vendor/doctrine/cache/phpunit.xml.dist | 25 - app/Vendor/doctrine/collections/.gitignore | 1 - app/Vendor/doctrine/collections/.travis.yml | 21 - app/Vendor/doctrine/collections/LICENSE | 19 - app/Vendor/doctrine/collections/README.md | 25 - app/Vendor/doctrine/collections/composer.json | 29 - .../Collections/AbstractLazyCollection.php | 343 -- .../Common/Collections/ArrayCollection.php | 387 -- .../Common/Collections/Collection.php | 263 -- .../Doctrine/Common/Collections/Criteria.php | 259 -- .../Expr/ClosureExpressionVisitor.php | 227 -- .../Common/Collections/Expr/Comparison.php | 103 - .../Collections/Expr/CompositeExpression.php | 90 - .../Common/Collections/Expr/Expression.php | 35 - .../Collections/Expr/ExpressionVisitor.php | 82 - .../Common/Collections/Expr/Value.php | 52 - .../Common/Collections/ExpressionBuilder.php | 166 - .../Common/Collections/Selectable.php | 48 - .../doctrine/collections/phpunit.xml.dist | 31 - app/Vendor/doctrine/common/LICENSE | 19 - app/Vendor/doctrine/common/README.md | 12 - app/Vendor/doctrine/common/UPGRADE_TO_2_1 | 39 - app/Vendor/doctrine/common/UPGRADE_TO_2_2 | 61 - app/Vendor/doctrine/common/composer.json | 36 - .../lib/Doctrine/Common/ClassLoader.php | 280 -- .../lib/Doctrine/Common/CommonException.php | 29 - .../common/lib/Doctrine/Common/Comparable.php | 46 - .../common/lib/Doctrine/Common/EventArgs.php | 67 - .../lib/Doctrine/Common/EventManager.php | 154 - .../lib/Doctrine/Common/EventSubscriber.php | 42 - .../common/lib/Doctrine/Common/Lexer.php | 37 - .../Doctrine/Common/NotifyPropertyChanged.php | 42 - .../Persistence/AbstractManagerRegistry.php | 264 -- .../Common/Persistence/ConnectionRegistry.php | 62 - .../Persistence/Event/LifecycleEventArgs.php | 89 - .../Event/LoadClassMetadataEventArgs.php | 75 - .../Persistence/Event/ManagerEventArgs.php | 59 - .../Persistence/Event/OnClearEventArgs.php | 86 - .../Persistence/Event/PreUpdateEventArgs.php | 137 - .../Common/Persistence/ManagerRegistry.php | 111 - .../Mapping/AbstractClassMetadataFactory.php | 429 -- .../Persistence/Mapping/ClassMetadata.php | 174 - .../Mapping/ClassMetadataFactory.php | 76 - .../Mapping/Driver/AnnotationDriver.php | 256 -- .../Mapping/Driver/DefaultFileLocator.php | 173 - .../Persistence/Mapping/Driver/FileDriver.php | 214 - .../Mapping/Driver/FileLocator.php | 73 - .../Mapping/Driver/MappingDriver.php | 58 - .../Mapping/Driver/MappingDriverChain.php | 165 - .../Persistence/Mapping/Driver/PHPDriver.php | 70 - .../Mapping/Driver/StaticPHPDriver.php | 142 - .../Mapping/Driver/SymfonyFileLocator.php | 239 -- .../Persistence/Mapping/MappingException.php | 98 - .../Persistence/Mapping/ReflectionService.php | 87 - .../Mapping/RuntimeReflectionService.php | 104 - .../Mapping/StaticReflectionService.php | 83 - .../Common/Persistence/ObjectManager.php | 169 - .../Common/Persistence/ObjectManagerAware.php | 51 - .../Persistence/ObjectManagerDecorator.php | 140 - .../Common/Persistence/ObjectRepository.php | 81 - .../Common/Persistence/PersistentObject.php | 254 -- .../lib/Doctrine/Common/Persistence/Proxy.php | 59 - .../Common/PropertyChangedListener.php | 45 - .../Common/Proxy/AbstractProxyFactory.php | 248 -- .../lib/Doctrine/Common/Proxy/Autoloader.php | 92 - .../Exception/InvalidArgumentException.php | 92 - .../Proxy/Exception/OutOfBoundsException.php | 42 - .../Common/Proxy/Exception/ProxyException.php | 31 - .../Exception/UnexpectedValueException.php | 64 - .../lib/Doctrine/Common/Proxy/Proxy.php | 90 - .../Doctrine/Common/Proxy/ProxyDefinition.php | 70 - .../Doctrine/Common/Proxy/ProxyGenerator.php | 1037 ----- .../Reflection/ClassFinderInterface.php | 37 - .../Common/Reflection/Psr0FindFile.php | 79 - .../ReflectionProviderInterface.php | 48 - .../RuntimePublicReflectionProperty.php | 76 - .../Reflection/StaticReflectionClass.php | 433 -- .../Reflection/StaticReflectionMethod.php | 362 -- .../Reflection/StaticReflectionParser.php | 307 -- .../Reflection/StaticReflectionProperty.php | 178 - .../lib/Doctrine/Common/Util/ClassUtils.php | 109 - .../common/lib/Doctrine/Common/Util/Debug.php | 158 - .../lib/Doctrine/Common/Util/Inflector.php | 31 - .../common/lib/Doctrine/Common/Version.php | 53 - app/Vendor/doctrine/dbal/LICENSE | 19 - app/Vendor/doctrine/dbal/README.md | 14 - app/Vendor/doctrine/dbal/SECURITY.md | 14 - app/Vendor/doctrine/dbal/UPGRADE.md | 244 -- app/Vendor/doctrine/dbal/bin/doctrine-dbal | 4 - .../doctrine/dbal/bin/doctrine-dbal.php | 74 - app/Vendor/doctrine/dbal/composer.json | 37 - .../Doctrine/DBAL/Cache/ArrayStatement.php | 148 - .../Doctrine/DBAL/Cache/CacheException.php | 43 - .../Doctrine/DBAL/Cache/QueryCacheProfile.php | 141 - .../DBAL/Cache/ResultCacheStatement.php | 221 - .../dbal/lib/Doctrine/DBAL/Configuration.php | 152 - .../dbal/lib/Doctrine/DBAL/Connection.php | 1626 -------- .../lib/Doctrine/DBAL/ConnectionException.php | 60 - .../Connections/MasterSlaveConnection.php | 390 -- .../dbal/lib/Doctrine/DBAL/DBALException.php | 259 -- .../dbal/lib/Doctrine/DBAL/Driver.php | 75 - .../DBAL/Driver/AbstractDB2Driver.php | 60 - .../DBAL/Driver/AbstractDriverException.php | 75 - .../DBAL/Driver/AbstractMySQLDriver.php | 175 - .../DBAL/Driver/AbstractOracleDriver.php | 151 - .../DBAL/Driver/AbstractPostgreSQLDriver.php | 148 - .../DBAL/Driver/AbstractSQLAnywhereDriver.php | 141 - .../DBAL/Driver/AbstractSQLServerDriver.php | 104 - .../DBAL/Driver/AbstractSQLiteDriver.php | 113 - .../lib/Doctrine/DBAL/Driver/Connection.php | 110 - .../Doctrine/DBAL/Driver/DriverException.php | 59 - .../Driver/DrizzlePDOMySql/Connection.php | 42 - .../DBAL/Driver/DrizzlePDOMySql/Driver.php | 78 - .../DBAL/Driver/ExceptionConverterDriver.php | 44 - .../DBAL/Driver/IBMDB2/DB2Connection.php | 178 - .../Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php | 67 - .../DBAL/Driver/IBMDB2/DB2Exception.php | 24 - .../DBAL/Driver/IBMDB2/DB2Statement.php | 362 -- .../Doctrine/DBAL/Driver/Mysqli/Driver.php | 49 - .../DBAL/Driver/Mysqli/MysqliConnection.php | 266 -- .../DBAL/Driver/Mysqli/MysqliException.php | 32 - .../DBAL/Driver/Mysqli/MysqliStatement.php | 403 -- .../lib/Doctrine/DBAL/Driver/OCI8/Driver.php | 71 - .../DBAL/Driver/OCI8/OCI8Connection.php | 233 -- .../DBAL/Driver/OCI8/OCI8Exception.php | 35 - .../DBAL/Driver/OCI8/OCI8Statement.php | 357 -- .../Doctrine/DBAL/Driver/PDOConnection.php | 133 - .../lib/Doctrine/DBAL/Driver/PDOException.php | 75 - .../Doctrine/DBAL/Driver/PDOIbm/Driver.php | 83 - .../Doctrine/DBAL/Driver/PDOMySql/Driver.php | 89 - .../Doctrine/DBAL/Driver/PDOOracle/Driver.php | 78 - .../Doctrine/DBAL/Driver/PDOPgSql/Driver.php | 112 - .../Doctrine/DBAL/Driver/PDOSqlite/Driver.php | 98 - .../DBAL/Driver/PDOSqlsrv/Connection.php | 69 - .../Doctrine/DBAL/Driver/PDOSqlsrv/Driver.php | 81 - .../DBAL/Driver/PDOSqlsrv/Statement.php | 49 - .../lib/Doctrine/DBAL/Driver/PDOStatement.php | 156 - .../DBAL/Driver/PingableConnection.php | 39 - .../Doctrine/DBAL/Driver/ResultStatement.php | 95 - .../DBAL/Driver/SQLAnywhere/Driver.php | 104 - .../SQLAnywhere/SQLAnywhereConnection.php | 223 -- .../SQLAnywhere/SQLAnywhereException.php | 94 - .../SQLAnywhere/SQLAnywhereStatement.php | 347 -- .../Doctrine/DBAL/Driver/SQLSrv/Driver.php | 68 - .../DBAL/Driver/SQLSrv/LastInsertId.php | 50 - .../DBAL/Driver/SQLSrv/SQLSrvConnection.php | 192 - .../DBAL/Driver/SQLSrv/SQLSrvException.php | 56 - .../DBAL/Driver/SQLSrv/SQLSrvStatement.php | 384 -- .../DBAL/Driver/ServerInfoAwareConnection.php | 44 - .../lib/Doctrine/DBAL/Driver/Statement.php | 128 - .../dbal/lib/Doctrine/DBAL/DriverManager.php | 424 -- .../DBAL/Event/ConnectionEventArgs.php | 78 - .../DBAL/Event/Listeners/MysqlSessionInit.php | 80 - .../Event/Listeners/OracleSessionInit.php | 90 - .../DBAL/Event/Listeners/SQLSessionInit.php | 66 - .../SchemaAlterTableAddColumnEventArgs.php | 114 - .../SchemaAlterTableChangeColumnEventArgs.php | 114 - .../DBAL/Event/SchemaAlterTableEventArgs.php | 98 - .../SchemaAlterTableRemoveColumnEventArgs.php | 114 - .../SchemaAlterTableRenameColumnEventArgs.php | 129 - .../Event/SchemaColumnDefinitionEventArgs.php | 137 - .../SchemaCreateTableColumnEventArgs.php | 114 - .../DBAL/Event/SchemaCreateTableEventArgs.php | 128 - .../DBAL/Event/SchemaDropTableEventArgs.php | 100 - .../Doctrine/DBAL/Event/SchemaEventArgs.php | 55 - .../Event/SchemaIndexDefinitionEventArgs.php | 121 - .../dbal/lib/Doctrine/DBAL/Events.php | 51 - .../DBAL/Exception/ConnectionException.php | 31 - .../ConstraintViolationException.php | 31 - .../DatabaseObjectExistsException.php | 35 - .../DatabaseObjectNotFoundException.php | 35 - .../DBAL/Exception/DriverException.php | 82 - ...ForeignKeyConstraintViolationException.php | 32 - .../Exception/InvalidArgumentException.php | 40 - .../Exception/InvalidFieldNameException.php | 31 - .../Exception/NonUniqueFieldNameException.php | 31 - .../NotNullConstraintViolationException.php | 32 - .../DBAL/Exception/ReadOnlyException.php | 31 - .../DBAL/Exception/ServerException.php | 31 - .../DBAL/Exception/SyntaxErrorException.php | 31 - .../DBAL/Exception/TableExistsException.php | 31 - .../DBAL/Exception/TableNotFoundException.php | 31 - .../UniqueConstraintViolationException.php | 32 - .../lib/Doctrine/DBAL/Id/TableGenerator.php | 165 - .../DBAL/Id/TableGeneratorSchemaVisitor.php | 89 - .../dbal/lib/Doctrine/DBAL/LockMode.php | 43 - .../lib/Doctrine/DBAL/Logging/DebugStack.php | 78 - .../Doctrine/DBAL/Logging/EchoSQLLogger.php | 56 - .../lib/Doctrine/DBAL/Logging/LoggerChain.php | 67 - .../lib/Doctrine/DBAL/Logging/SQLLogger.php | 51 - .../DBAL/Platforms/AbstractPlatform.php | 3536 ---------------- .../Doctrine/DBAL/Platforms/DB2Platform.php | 882 ---- .../DBAL/Platforms/DrizzlePlatform.php | 624 --- .../DBAL/Platforms/Keywords/DB2Keywords.php | 441 -- .../Platforms/Keywords/DrizzleKeywords.php | 345 -- .../DBAL/Platforms/Keywords/KeywordList.php | 73 - .../DBAL/Platforms/Keywords/MsSQLKeywords.php | 43 - .../Platforms/Keywords/MySQL57Keywords.php | 281 -- .../DBAL/Platforms/Keywords/MySQLKeywords.php | 273 -- .../Platforms/Keywords/OracleKeywords.php | 161 - .../Keywords/PostgreSQL91Keywords.php | 148 - .../Keywords/PostgreSQL92Keywords.php | 50 - .../Platforms/Keywords/PostgreSQLKeywords.php | 135 - .../Keywords/ReservedKeywordsValidator.php | 143 - .../Keywords/SQLAnywhere11Keywords.php | 55 - .../Keywords/SQLAnywhere12Keywords.php | 64 - .../Keywords/SQLAnywhere16Keywords.php | 56 - .../Keywords/SQLAnywhereKeywords.php | 281 -- .../Keywords/SQLServer2005Keywords.php | 56 - .../Keywords/SQLServer2008Keywords.php | 51 - .../Keywords/SQLServer2012Keywords.php | 55 - .../Platforms/Keywords/SQLServerKeywords.php | 231 -- .../Platforms/Keywords/SQLiteKeywords.php | 168 - .../DBAL/Platforms/MySQL57Platform.php | 67 - .../Doctrine/DBAL/Platforms/MySqlPlatform.php | 1093 ----- .../DBAL/Platforms/OraclePlatform.php | 1176 ------ .../DBAL/Platforms/PostgreSQL91Platform.php | 65 - .../DBAL/Platforms/PostgreSQL92Platform.php | 85 - .../DBAL/Platforms/PostgreSqlPlatform.php | 1188 ------ .../DBAL/Platforms/SQLAnywhere11Platform.php | 47 - .../DBAL/Platforms/SQLAnywhere12Platform.php | 135 - .../DBAL/Platforms/SQLAnywhere16Platform.php | 60 - .../DBAL/Platforms/SQLAnywherePlatform.php | 1491 ------- .../DBAL/Platforms/SQLAzurePlatform.php | 50 - .../DBAL/Platforms/SQLServer2005Platform.php | 63 - .../DBAL/Platforms/SQLServer2008Platform.php | 119 - .../DBAL/Platforms/SQLServer2012Platform.php | 158 - .../DBAL/Platforms/SQLServerPlatform.php | 1627 -------- .../DBAL/Platforms/SqlitePlatform.php | 1118 ------ .../Doctrine/DBAL/Portability/Connection.php | 150 - .../Doctrine/DBAL/Portability/Statement.php | 240 -- .../Query/Expression/CompositeExpression.php | 134 - .../Query/Expression/ExpressionBuilder.php | 313 -- .../lib/Doctrine/DBAL/Query/QueryBuilder.php | 1354 ------- .../Doctrine/DBAL/Query/QueryException.php | 54 - .../dbal/lib/Doctrine/DBAL/README.markdown | 0 .../dbal/lib/Doctrine/DBAL/SQLParserUtils.php | 243 -- .../Doctrine/DBAL/SQLParserUtilsException.php | 53 - .../Doctrine/DBAL/Schema/AbstractAsset.php | 227 -- .../DBAL/Schema/AbstractSchemaManager.php | 1113 ------ .../dbal/lib/Doctrine/DBAL/Schema/Column.php | 487 --- .../lib/Doctrine/DBAL/Schema/ColumnDiff.php | 84 - .../lib/Doctrine/DBAL/Schema/Comparator.php | 519 --- .../lib/Doctrine/DBAL/Schema/Constraint.php | 66 - .../Doctrine/DBAL/Schema/DB2SchemaManager.php | 218 - .../DBAL/Schema/DrizzleSchemaManager.php | 119 - .../DBAL/Schema/ForeignKeyConstraint.php | 389 -- .../lib/Doctrine/DBAL/Schema/Identifier.php | 48 - .../dbal/lib/Doctrine/DBAL/Schema/Index.php | 358 -- .../DBAL/Schema/MySqlSchemaManager.php | 252 -- .../DBAL/Schema/OracleSchemaManager.php | 425 -- .../DBAL/Schema/PostgreSqlSchemaManager.php | 438 -- .../DBAL/Schema/SQLAnywhereSchemaManager.php | 243 -- .../DBAL/Schema/SQLServerSchemaManager.php | 311 -- .../dbal/lib/Doctrine/DBAL/Schema/Schema.php | 510 --- .../lib/Doctrine/DBAL/Schema/SchemaConfig.php | 129 - .../lib/Doctrine/DBAL/Schema/SchemaDiff.php | 204 - .../Doctrine/DBAL/Schema/SchemaException.php | 181 - .../lib/Doctrine/DBAL/Schema/Sequence.php | 166 - .../DBAL/Schema/SqliteSchemaManager.php | 433 -- .../AbstractSchemaSynchronizer.php | 65 - .../Synchronizer/SchemaSynchronizer.php | 101 - .../SingleDatabaseSynchronizer.php | 176 - .../dbal/lib/Doctrine/DBAL/Schema/Table.php | 850 ---- .../lib/Doctrine/DBAL/Schema/TableDiff.php | 170 - .../dbal/lib/Doctrine/DBAL/Schema/View.php | 53 - .../DBAL/Schema/Visitor/AbstractVisitor.php | 85 - .../Visitor/CreateSchemaSqlCollector.php | 148 - .../Schema/Visitor/DropSchemaSqlCollector.php | 126 - .../Doctrine/DBAL/Schema/Visitor/Graphviz.php | 174 - .../DBAL/Schema/Visitor/NamespaceVisitor.php | 37 - .../Schema/Visitor/RemoveNamespacedAssets.php | 94 - .../DBAL/Schema/Visitor/SchemaDiffVisitor.php | 82 - .../Doctrine/DBAL/Schema/Visitor/Visitor.php | 82 - .../DBAL/Sharding/PoolingShardConnection.php | 272 -- .../DBAL/Sharding/PoolingShardManager.php | 134 - .../SQLAzureFederationsSynchronizer.php | 298 -- .../SQLAzure/SQLAzureShardManager.php | 243 -- .../SQLAzure/Schema/MultiTenantVisitor.php | 169 - .../ShardChoser/MultiTenantShardChoser.php | 39 - .../DBAL/Sharding/ShardChoser/ShardChoser.php | 41 - .../Doctrine/DBAL/Sharding/ShardManager.php | 93 - .../DBAL/Sharding/ShardingException.php | 78 - .../dbal/lib/Doctrine/DBAL/Statement.php | 315 -- .../Tools/Console/Command/ImportCommand.php | 130 - .../Console/Command/ReservedWordsCommand.php | 172 - .../Tools/Console/Command/RunSqlCommand.php | 88 - .../DBAL/Tools/Console/ConsoleRunner.php | 107 - .../Tools/Console/Helper/ConnectionHelper.php | 71 - .../lib/Doctrine/DBAL/Types/ArrayType.php | 81 - .../lib/Doctrine/DBAL/Types/BigIntType.php | 63 - .../lib/Doctrine/DBAL/Types/BinaryType.php | 78 - .../dbal/lib/Doctrine/DBAL/Types/BlobType.php | 77 - .../lib/Doctrine/DBAL/Types/BooleanType.php | 70 - .../DBAL/Types/ConversionException.php | 68 - .../lib/Doctrine/DBAL/Types/DateTimeType.php | 77 - .../Doctrine/DBAL/Types/DateTimeTzType.php | 90 - .../dbal/lib/Doctrine/DBAL/Types/DateType.php | 72 - .../lib/Doctrine/DBAL/Types/DecimalType.php | 54 - .../lib/Doctrine/DBAL/Types/FloatType.php | 49 - .../dbal/lib/Doctrine/DBAL/Types/GuidType.php | 55 - .../lib/Doctrine/DBAL/Types/IntegerType.php | 63 - .../lib/Doctrine/DBAL/Types/JsonArrayType.php | 81 - .../lib/Doctrine/DBAL/Types/ObjectType.php | 80 - .../Doctrine/DBAL/Types/SimpleArrayType.php | 83 - .../lib/Doctrine/DBAL/Types/SmallIntType.php | 62 - .../lib/Doctrine/DBAL/Types/StringType.php | 54 - .../dbal/lib/Doctrine/DBAL/Types/TextType.php | 54 - .../dbal/lib/Doctrine/DBAL/Types/TimeType.php | 72 - .../dbal/lib/Doctrine/DBAL/Types/Type.php | 341 -- .../Doctrine/DBAL/Types/VarDateTimeType.php | 56 - .../dbal/lib/Doctrine/DBAL/Version.php | 53 - .../DBAL/VersionAwarePlatformDriver.php | 47 - app/Vendor/doctrine/inflector/.gitignore | 4 - app/Vendor/doctrine/inflector/.travis.yml | 21 - app/Vendor/doctrine/inflector/LICENSE | 19 - app/Vendor/doctrine/inflector/README.md | 6 - app/Vendor/doctrine/inflector/composer.json | 29 - .../Doctrine/Common/Inflector/Inflector.php | 482 --- .../doctrine/inflector/phpunit.xml.dist | 31 - app/Vendor/doctrine/lexer/LICENSE | 19 - app/Vendor/doctrine/lexer/README.md | 5 - app/Vendor/doctrine/lexer/composer.json | 24 - .../Doctrine/Common/Lexer/AbstractLexer.php | 327 -- app/Vendor/guzzlehttp/guzzle/.travis.yml | 41 - app/Vendor/guzzlehttp/guzzle/CHANGELOG.md | 1243 ------ app/Vendor/guzzlehttp/guzzle/LICENSE | 19 - app/Vendor/guzzlehttp/guzzle/README.md | 90 - app/Vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 ------ app/Vendor/guzzlehttp/guzzle/composer.json | 41 - app/Vendor/guzzlehttp/guzzle/src/Client.php | 408 -- .../guzzlehttp/guzzle/src/ClientInterface.php | 84 - .../guzzle/src/Cookie/CookieJar.php | 265 -- .../guzzle/src/Cookie/CookieJarInterface.php | 84 - .../guzzle/src/Cookie/FileCookieJar.php | 90 - .../guzzle/src/Cookie/SessionCookieJar.php | 71 - .../guzzle/src/Cookie/SetCookie.php | 404 -- .../src/Exception/BadResponseException.php | 7 - .../guzzle/src/Exception/ClientException.php | 7 - .../guzzle/src/Exception/ConnectException.php | 37 - .../guzzle/src/Exception/GuzzleException.php | 4 - .../guzzle/src/Exception/RequestException.php | 210 - .../guzzle/src/Exception/SeekException.php | 27 - .../guzzle/src/Exception/ServerException.php | 7 - .../Exception/TooManyRedirectsException.php | 4 - .../src/Exception/TransferException.php | 4 - .../guzzle/src/Handler/CurlFactory.php | 536 --- .../src/Handler/CurlFactoryInterface.php | 27 - .../guzzle/src/Handler/CurlHandler.php | 45 - .../guzzle/src/Handler/CurlMultiHandler.php | 197 - .../guzzle/src/Handler/EasyHandle.php | 92 - .../guzzle/src/Handler/MockHandler.php | 176 - .../guzzlehttp/guzzle/src/Handler/Proxy.php | 55 - .../guzzle/src/Handler/StreamHandler.php | 490 --- .../guzzlehttp/guzzle/src/HandlerStack.php | 273 -- .../guzzle/src/MessageFormatter.php | 182 - .../guzzlehttp/guzzle/src/Middleware.php | 254 -- app/Vendor/guzzlehttp/guzzle/src/Pool.php | 123 - .../guzzle/src/PrepareBodyMiddleware.php | 112 - .../guzzle/src/RedirectMiddleware.php | 231 -- .../guzzlehttp/guzzle/src/RequestOptions.php | 244 -- .../guzzlehttp/guzzle/src/RetryMiddleware.php | 112 - .../guzzlehttp/guzzle/src/TransferStats.php | 126 - .../guzzlehttp/guzzle/src/UriTemplate.php | 241 -- .../guzzlehttp/guzzle/src/functions.php | 329 -- .../guzzle/src/functions_include.php | 6 - app/Vendor/guzzlehttp/promises/CHANGELOG.md | 65 - app/Vendor/guzzlehttp/promises/LICENSE | 19 - app/Vendor/guzzlehttp/promises/Makefile | 13 - app/Vendor/guzzlehttp/promises/README.md | 504 --- app/Vendor/guzzlehttp/promises/composer.json | 34 - .../promises/src/AggregateException.php | 16 - .../promises/src/CancellationException.php | 9 - .../guzzlehttp/promises/src/Coroutine.php | 151 - .../guzzlehttp/promises/src/EachPromise.php | 229 -- .../promises/src/FulfilledPromise.php | 82 - .../guzzlehttp/promises/src/Promise.php | 280 -- .../promises/src/PromiseInterface.php | 93 - .../promises/src/PromisorInterface.php | 15 - .../promises/src/RejectedPromise.php | 87 - .../promises/src/RejectionException.php | 47 - .../guzzlehttp/promises/src/TaskQueue.php | 66 - .../promises/src/TaskQueueInterface.php | 25 - .../guzzlehttp/promises/src/functions.php | 457 --- .../promises/src/functions_include.php | 6 - app/Vendor/guzzlehttp/psr7/CHANGELOG.md | 110 - app/Vendor/guzzlehttp/psr7/LICENSE | 19 - app/Vendor/guzzlehttp/psr7/README.md | 739 ---- app/Vendor/guzzlehttp/psr7/composer.json | 39 - .../guzzlehttp/psr7/src/AppendStream.php | 233 -- .../guzzlehttp/psr7/src/BufferStream.php | 137 - .../guzzlehttp/psr7/src/CachingStream.php | 138 - .../guzzlehttp/psr7/src/DroppingStream.php | 42 - app/Vendor/guzzlehttp/psr7/src/FnStream.php | 149 - .../guzzlehttp/psr7/src/InflateStream.php | 52 - .../guzzlehttp/psr7/src/LazyOpenStream.php | 39 - .../guzzlehttp/psr7/src/LimitStream.php | 155 - .../guzzlehttp/psr7/src/MessageTrait.php | 183 - .../guzzlehttp/psr7/src/MultipartStream.php | 153 - .../guzzlehttp/psr7/src/NoSeekStream.php | 22 - app/Vendor/guzzlehttp/psr7/src/PumpStream.php | 165 - app/Vendor/guzzlehttp/psr7/src/Request.php | 142 - app/Vendor/guzzlehttp/psr7/src/Response.php | 132 - .../guzzlehttp/psr7/src/ServerRequest.php | 358 -- app/Vendor/guzzlehttp/psr7/src/Stream.php | 257 -- .../psr7/src/StreamDecoratorTrait.php | 149 - .../guzzlehttp/psr7/src/StreamWrapper.php | 121 - .../guzzlehttp/psr7/src/UploadedFile.php | 316 -- app/Vendor/guzzlehttp/psr7/src/Uri.php | 702 ---- .../guzzlehttp/psr7/src/UriNormalizer.php | 216 - .../guzzlehttp/psr7/src/UriResolver.php | 219 - app/Vendor/guzzlehttp/psr7/src/functions.php | 828 ---- .../guzzlehttp/psr7/src/functions_include.php | 6 - app/Vendor/minify/.coveralls.yml | 3 - app/Vendor/minify/.gitignore | 10 - app/Vendor/minify/.travis.yml | 15 - app/Vendor/minify/GitHub.txt | 1 - app/Vendor/minify/LICENSE | 18 - app/Vendor/minify/README.md | 140 - app/Vendor/minify/bin/minifycss | 45 - app/Vendor/minify/bin/minifyjs | 45 - app/Vendor/minify/composer.json | 35 - app/Vendor/minify/data/js/keywords_after.txt | 7 - app/Vendor/minify/data/js/keywords_before.txt | 27 - .../minify/data/js/keywords_reserved.txt | 47 - app/Vendor/minify/data/js/operators_after.txt | 45 - .../minify/data/js/operators_before.txt | 43 - app/Vendor/minify/makefile | 5 - app/Vendor/minify/phpunit.xml.dist | 12 - app/Vendor/minify/src/CSS.php | 515 --- app/Vendor/minify/src/Exception.php | 9 - app/Vendor/minify/src/JS.php | 448 --- app/Vendor/minify/src/Minify.php | 372 -- app/Vendor/minify/tests/bootstrap.php | 3 - app/Vendor/minify/tests/css/CSSTest.php | 429 -- .../minify/tests/css/sample/bom/bom.css | 3 - .../css/sample/combine_imports/import.css | 3 - .../css/sample/combine_imports/index.css | 1 - .../css/sample/combine_imports/index2.css | 1 - .../css/sample/combine_imports/index3.css | 2 - .../css/sample/combine_imports/index4.css | 2 - .../css/sample/combine_imports/index5.css | 2 - .../css/sample/combine_imports/index6a.css | 1 - .../css/sample/combine_imports/index6b.css | 1 - .../convert_relative_path/source/absolute.css | 1 - .../convert_relative_path/source/external.css | 1 - .../convert_relative_path/source/issue29.css | 1 - .../convert_relative_path/source/issue39.css | 10 - .../source/nested/nested.css | 1 - .../convert_relative_path/source/relative.css | 1 - .../convert_relative_path/target/relative.css | 1 - .../css/sample/import_files/facebook.png | Bin 178 -> 0 bytes .../tests/css/sample/import_files/file.png | Bin 178 -> 0 bytes .../tests/css/sample/import_files/index.css | 1 - .../css/sample/import_files/instagram.png | Bin 178 -> 0 bytes .../tests/css/sample/import_files/issue49.css | 3 - .../tests/css/sample/import_files/vimeo.png | Bin 178 -> 0 bytes app/Vendor/minify/tests/js/AbstractTest.php | 135 - app/Vendor/minify/tests/js/JSTest.php | 594 --- .../minify/tests/js/sample/source/script1.js | 1 - .../minify/tests/js/sample/source/script2.js | 1 - app/Vendor/parsedown/.travis.yml | 10 - app/Vendor/parsedown/LICENSE.txt | 20 - app/Vendor/parsedown/Parsedown.php | 1528 ------- app/Vendor/parsedown/ParsedownExtra.php | 526 --- app/Vendor/parsedown/README.md | 48 - app/Vendor/psr/http-message/CHANGELOG.md | 36 - app/Vendor/psr/http-message/LICENSE | 19 - app/Vendor/psr/http-message/README.md | 13 - app/Vendor/psr/http-message/composer.json | 26 - .../psr/http-message/src/MessageInterface.php | 187 - .../psr/http-message/src/RequestInterface.php | 129 - .../http-message/src/ResponseInterface.php | 68 - .../src/ServerRequestInterface.php | 261 -- .../psr/http-message/src/StreamInterface.php | 158 - .../src/UploadedFileInterface.php | 123 - .../psr/http-message/src/UriInterface.php | 323 -- app/Vendor/symfony/filesystem/.gitignore | 3 - app/Vendor/symfony/filesystem/CHANGELOG.md | 43 - .../Exception/ExceptionInterface.php | 21 - .../Exception/FileNotFoundException.php | 34 - .../filesystem/Exception/IOException.php | 39 - .../Exception/IOExceptionInterface.php | 27 - app/Vendor/symfony/filesystem/Filesystem.php | 706 ---- app/Vendor/symfony/filesystem/LICENSE | 19 - app/Vendor/symfony/filesystem/LockHandler.php | 112 - app/Vendor/symfony/filesystem/README.md | 13 - .../filesystem/Tests/ExceptionTest.php | 47 - .../filesystem/Tests/FilesystemTest.php | 1484 ------- .../filesystem/Tests/FilesystemTestCase.php | 166 - .../Tests/Fixtures/MockStream/MockStream.php | 46 - .../filesystem/Tests/LockHandlerTest.php | 101 - app/Vendor/symfony/filesystem/composer.json | 33 - .../symfony/filesystem/phpunit.xml.dist | 28 - app/Vendor/yuicompressor-2.4.7.jar | Bin 891148 -> 0 bytes app/composer.json | 8 +- app/composer.lock | 991 ++++- 1765 files changed, 967 insertions(+), 241375 deletions(-) delete mode 100755 app/Vendor/Ratchet/composer.json delete mode 100644 app/Vendor/Ratchet/composer.lock delete mode 100644 app/Vendor/Ratchet/vendor/autoload.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/.travis.yml delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/CHANGELOG.md delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/Makefile delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/README.md delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/AbstractConnectionDecorator.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/App.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/ComponentInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/ConnectionInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/Guzzle/Http/Message/RequestFactory.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpRequestParser.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServer.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/OriginCheck.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/Router.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/MessageComponentInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/MessageInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/EchoServer.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/FlashPolicy.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoConnection.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IpBlackList.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Serialize/HandlerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Serialize/PhpBinaryHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Serialize/PhpHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/SessionProvider.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/Proxy/VirtualProxy.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/VirtualSessionStorage.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Exception.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/JsonException.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/ServerProtocol.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Topic.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/TopicManager.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampConnection.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServer.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/ToggleableValidator.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/Validator.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/ValidatorInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/DataInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/FrameInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Connection.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Frame.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/HyBi10.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/MessageInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Connection.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Frame.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/HandshakeVerifier.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Message.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/VersionInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/VersionManager.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServer.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/bin/fuzzingserver-noutf8.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/bin/fuzzingserver.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-all.json delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-profile.json delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-quick.json delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/bootstrap.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/AbstractMessageComponentTestCase.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Component.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Connection.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/ConnectionDecorator.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/WampComponent.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/NullComponent.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Wamp/Stub/WsWampServerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/WebSocket/Stub/WsMessageComponentInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/integration/GuzzleTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/AbstractConnectionDecoratorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/Guzzle/Http/Message/RequestFactoryTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpRequestParserTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpServerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/OriginCheckTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/RouterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/EchoServerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/FlashPolicyComponentTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoConnectionTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoServerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IpBlackListComponentTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/Serialize/PhpHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/SessionComponentTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/ServerProtocolTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicManagerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampConnectionTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampServerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/Hixie76Test.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/HyBi10Test.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/FrameTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/HandshakeVerifierTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/MessageTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455Test.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/VersionManagerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/WsServerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/composer/ClassLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/composer/autoload_classmap.php delete mode 100644 app/Vendor/Ratchet/vendor/composer/autoload_namespaces.php delete mode 100644 app/Vendor/Ratchet/vendor/composer/autoload_psr4.php delete mode 100644 app/Vendor/Ratchet/vendor/composer/autoload_real.php delete mode 100644 app/Vendor/Ratchet/vendor/composer/installed.json delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/.gitmodules delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/.travis.yml delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/LICENSE.txt delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/README.md delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/apply.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/cancelable.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/delay.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/package.json delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/all.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/any.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/apply.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/buster.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/cancelable.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/chain.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/defer.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/delay.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/isPromise.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/map.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/promise.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/reduce.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/some.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/timeout.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/test/when.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/timed.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/timeout.js delete mode 100644 app/Vendor/Ratchet/vendor/cujojs/when/when.js delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/.travis.yml delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/README.md delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/doc/00-intro.md delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/doc/01-api.md delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/doc/02-plugin-system.md delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter.php delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter2.php delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitter2Test.php delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php delete mode 100644 app/Vendor/Ratchet/vendor/evenement/evenement/tests/bootstrap.php delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/LICENSE.txt delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/NEWS.md delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/README.md delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/WebSocketMain.swf delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/WebSocketMainInsecure.zip delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/bower.json delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.properties.sample delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.sh delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.xml delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/IWebSocketLogger.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocket.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketEvent.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketFrame.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMain.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMainInsecure.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/adobe/net/proxies/RFC2817Socket.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/MD5.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/SHA1.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/Crypto.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/MozillaRootCertificates.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509Certificate.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509CertificateCollection.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/HMAC.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHMAC.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHash.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MAC.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MD2.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MD5.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA1.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA224.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA256.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHABase.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/prng/ARC4.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/prng/IPRNG.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/prng/Random.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/prng/TLSPRF.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/rsa/RSAKey.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/AESKey.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/BlowFishKey.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/CBCMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/CFB8Mode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/CFBMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/CTRMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/DESKey.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/ECBMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/ICipher.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/IMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/IPad.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/IStreamCipher.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/ISymmetricKey.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/IVMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/NullPad.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/OFBMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/PKCS5.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SSLPad.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SimpleIVMode.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TLSPad.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TripleDESKey.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/XTeaKey.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/aeskey.pl delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/dump.txt delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/AESKeyTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/ARC4Test.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/BigIntegerTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/BlowFishKeyTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/CBCModeTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/CFB8ModeTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/CFBModeTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/CTRModeTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/DESKeyTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/ECBModeTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/HMACTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/ITestHarness.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/MD2Test.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/MD5Test.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/OFBModeTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/RSAKeyTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/SHA1Test.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/SHA224Test.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/SHA256Test.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/TLSPRFTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/TestCase.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/TripleDESKeyTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tests/XTeaKeyTest.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/BulkCiphers.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/CipherSuites.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/IConnectionState.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/ISecurityParameters.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/KeyExchanges.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/MACs.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/SSLConnectionState.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/SSLEvent.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/SSLSecurityParameters.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSConfig.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSConnectionState.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSEngine.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSError.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSEvent.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSSecurityParameters.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSSocket.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSSocketEvent.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/tls/TLSTest.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/math/BarrettReduction.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/math/BigInteger.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/math/ClassicReduction.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/math/IReduction.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/math/MontgomeryReduction.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/math/NullReduction.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/math/bi_internal.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/ArrayUtil.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/Base64.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/Hex.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/Memory.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/ByteString.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/DER.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/IAsn1Type.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/Integer.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/OID.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/ObjectIdentifier.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/PEM.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/PrintableString.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/Sequence.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/Set.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/Type.as delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/util/der/UTCTime.as delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/sample.html delete mode 100755 app/Vendor/Ratchet/vendor/gimite/web-socket-js/src/swfobject.js delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/swfobject.js delete mode 100644 app/Vendor/Ratchet/vendor/gimite/web-socket-js/web_socket.js delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Collection.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Event.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/ExceptionCollection.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/InvalidArgumentException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/RuntimeException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/UnexpectedValueException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/FromConfigInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/HasDispatcherInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/ToArrayInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Version.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Client.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ClientInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlHandle.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiProxy.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBody.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/BadResponseException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/CouldNotRewindStreamException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/CurlException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/MultiTransferException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/TooManyRedirectsException.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/IoEmittingEntityBody.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/Link.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/PostFile.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Request.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Response.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Mimetypes.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryString.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem.md5 delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/StaticClient.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Url.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/AbstractMessageParser.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/PeclHttpMessageParser.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplate.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParser.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/Stream.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/StreamRequestFactoryInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/.gitattributes delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/.travis.yml delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/CHANGELOG.mdown delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/README.mdown delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/doc/extending.md delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/doc/sockets.md delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/doc/usage.md delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/ErrorHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Logger.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Registry.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Functional/Handler/FirePHPHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfMocks.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/LoggerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/TestCase.php delete mode 100644 app/Vendor/Ratchet/vendor/monolog/monolog/tests/bootstrap.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/AbstractLogger.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/InvalidArgumentException.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LogLevel.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LoggerAwareInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LoggerAwareTrait.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LoggerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LoggerTrait.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/NullLogger.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/README.md delete mode 100644 app/Vendor/Ratchet/vendor/psr/log/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/.travis.yml delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/CHANGELOG.md delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/Deferred.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredPromise.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredResolver.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/FulfilledPromise.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/LazyPromise.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/PromiseInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/PromisorInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/RejectedPromise.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/ResolverInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/Util.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/When.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredProgressTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredPromiseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredRejectTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolveTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolverTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/ErrorCollector.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/FulfilledPromiseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/LazyPromiseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/RejectedPromiseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/Stub/CallableStub.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/TestCase.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilPromiseForTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilRejectedPromiseForTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAllTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAnyTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenLazyTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenMapTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenReduceTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenRejectTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenResolveTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenSomeTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/promise/tests/bootstrap.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/react/react/.travis.yml delete mode 100644 app/Vendor/Ratchet/vendor/react/react/CHANGELOG.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/react/react/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/UPGRADE-0.3.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/benchmark/bench.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/benchmark/timers.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/composer.lock delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/dns-resolver.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/echo-server.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/http-client.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/parallel-download.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/pump-shitload-of-data.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/scalability.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/tcp-chat.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/test-close-conn.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/test-memory-http.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/examples/test-memory.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/react/react/resources/avatar.png delete mode 100644 app/Vendor/Ratchet/vendor/react/react/resources/logo.png delete mode 100644 app/Vendor/Ratchet/vendor/react/react/resources/logo.psd delete mode 100644 app/Vendor/Ratchet/vendor/react/react/resources/logo_huge.png delete mode 100755 app/Vendor/Ratchet/vendor/react/react/scripts/do-split.sh delete mode 100755 app/Vendor/Ratchet/vendor/react/react/scripts/git-subsplit.sh delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Cache/ArrayCache.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Cache/CacheInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Cache/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Cache/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/BadServerException.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Config/Config.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Config/FilesystemFactory.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/HeaderBag.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Message.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Record.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/BinaryDumper.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/Parser.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/CachedExecutor.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/Executor.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/ExecutorInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/Query.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordBag.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordCache.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RetryExecutor.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/TimeoutException.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/RecordNotFoundException.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Resolver/Factory.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Resolver/Resolver.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/doc/rfc1034.txt delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Dns/doc/rfc1035.txt delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/Factory.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/LibEvLoop.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/LibEventLoop.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/LoopInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/StreamSelectLoop.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/Timer/Timer.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/Timer/TimerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/Timer/Timers.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/EventLoop/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/Request.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/RequestHeaderParser.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/Response.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/ResponseCodes.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/Server.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/ServerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Http/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/HttpClient/Client.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/HttpClient/Factory.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/HttpClient/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/HttpClient/Request.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/HttpClient/RequestData.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/HttpClient/Response.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/HttpClient/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Socket/Connection.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Socket/ConnectionException.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Socket/ConnectionInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Socket/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Socket/Server.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Socket/ServerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Socket/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/SocketClient/ConnectionException.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/SocketClient/Connector.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/SocketClient/ConnectorInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/SocketClient/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/SocketClient/SecureConnector.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/SocketClient/StreamEncryption.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/SocketClient/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/Buffer.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/BufferedSink.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/CompositeStream.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/README.md delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/ReadableStream.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/ReadableStreamInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/Stream.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/StreamInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/ThroughStream.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/Util.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/WritableStream.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/WritableStreamInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/src/React/Stream/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Cache/ArrayCacheTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Config/FilesystemFactoryTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Fixtures/etc/resolv.conf delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Protocol/BinaryDumperTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Protocol/ParserTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Query/CachedExecutorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Query/ExecutorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Query/RecordBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Query/RecordCacheTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Query/RetryExecutorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Resolver/FactoryTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Resolver/PickRandomAnswerOfTypeTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Dns/Resolver/ResolverTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/AbstractLoopTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/LibEvLoopTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/LibEventLoopTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/StreamSelectLoopTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/Timer/AbstractTimerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/Timer/LibEvTimerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/Timer/LibEventTimerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/EventLoop/Timer/StreamSelectTimerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Http/RequestHeaderParserTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Http/RequestTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Http/ResponseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Http/ServerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/HttpClient/RequestTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/HttpClient/ResponseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Socket/ConnectionTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Socket/ServerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Socket/Stub/CallableStub.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Socket/Stub/ConnectionStub.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Socket/Stub/ServerStub.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Socket/TestCase.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/SocketClient/ConnectorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/BufferTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/BufferedSinkTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/CompositeStreamTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/ReadableStreamTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/StreamTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/Stub/ReadableStreamStub.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/ThroughStreamTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/UtilTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/React/Tests/Stream/WritableStreamTest.php delete mode 100644 app/Vendor/Ratchet/vendor/react/react/tests/bootstrap.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ContainerAwareEventDispatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/ImmutableEventDispatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/AcceptHeaderItem.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ApacheRequest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/BinaryFileResponse.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/CHANGELOG.md delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Cookie.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ExpressionRequestMatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/AccessDeniedException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/FileNotFoundException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/UnexpectedTypeException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/Exception/UploadException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/File.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesser.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/ExtensionGuesserInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileBinaryMimeTypeGuesser.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/FileinfoMimeTypeGuesser.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeExtensionGuesser.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesser.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/MimeType/MimeTypeGuesserInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/File/UploadedFile.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/FileBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/IpUtils.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/JsonResponse.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ParameterBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/README.md delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ServerBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/CookieTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/FileTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/FileBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ServerBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CompiledRoute.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RequestMatcherInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/README.md delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Route.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCollection.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Router.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouterInterface.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Annotation/RouteTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/CompiledRouteTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/annotated.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/empty.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/foo.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/foo1.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/incomplete.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_id.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_path.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.yml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RequestContextTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCollectionTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCompilerTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouterTest.php delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/composer.json delete mode 100644 app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/phpunit.xml.dist delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitignore delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitmodules delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/LICENSE delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/README.md delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/SConstruct delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/autobahn.js delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/license.js delete mode 100644 app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/version.txt delete mode 100755 app/Vendor/WideImage/Canvas.php delete mode 100755 app/Vendor/WideImage/Coordinate.php delete mode 100755 app/Vendor/WideImage/Exception.php delete mode 100755 app/Vendor/WideImage/Font/GDF.php delete mode 100755 app/Vendor/WideImage/Font/PS.php delete mode 100755 app/Vendor/WideImage/Font/TTF.php delete mode 100755 app/Vendor/WideImage/Image.php delete mode 100755 app/Vendor/WideImage/Mapper/BMP.php delete mode 100755 app/Vendor/WideImage/Mapper/GD.php delete mode 100755 app/Vendor/WideImage/Mapper/GD2.php delete mode 100755 app/Vendor/WideImage/Mapper/GIF.php delete mode 100755 app/Vendor/WideImage/Mapper/JPEG.php delete mode 100755 app/Vendor/WideImage/Mapper/PNG.php delete mode 100755 app/Vendor/WideImage/Mapper/TGA.php delete mode 100755 app/Vendor/WideImage/MapperFactory.php delete mode 100755 app/Vendor/WideImage/Operation/AddNoise.php delete mode 100755 app/Vendor/WideImage/Operation/ApplyConvolution.php delete mode 100755 app/Vendor/WideImage/Operation/ApplyFilter.php delete mode 100755 app/Vendor/WideImage/Operation/ApplyMask.php delete mode 100755 app/Vendor/WideImage/Operation/AsGrayscale.php delete mode 100755 app/Vendor/WideImage/Operation/AsNegative.php delete mode 100755 app/Vendor/WideImage/Operation/AutoCrop.php delete mode 100755 app/Vendor/WideImage/Operation/CopyChannelsPalette.php delete mode 100755 app/Vendor/WideImage/Operation/CopyChannelsTrueColor.php delete mode 100755 app/Vendor/WideImage/Operation/CorrectGamma.php delete mode 100755 app/Vendor/WideImage/Operation/Crop.php delete mode 100755 app/Vendor/WideImage/Operation/Flip.php delete mode 100755 app/Vendor/WideImage/Operation/GetMask.php delete mode 100755 app/Vendor/WideImage/Operation/Merge.php delete mode 100755 app/Vendor/WideImage/Operation/Mirror.php delete mode 100755 app/Vendor/WideImage/Operation/Resize.php delete mode 100755 app/Vendor/WideImage/Operation/ResizeCanvas.php delete mode 100755 app/Vendor/WideImage/Operation/Rotate.php delete mode 100755 app/Vendor/WideImage/Operation/RoundCorners.php delete mode 100755 app/Vendor/WideImage/Operation/Unsharp.php delete mode 100755 app/Vendor/WideImage/OperationFactory.php delete mode 100755 app/Vendor/WideImage/PaletteImage.php delete mode 100755 app/Vendor/WideImage/TrueColorImage.php delete mode 100755 app/Vendor/WideImage/WideImage.php delete mode 100755 app/Vendor/WideImage/vendor/de77/BMP.php delete mode 100755 app/Vendor/WideImage/vendor/de77/TGA.php delete mode 100644 app/Vendor/autoload.php delete mode 120000 app/Vendor/bin/doctrine-dbal delete mode 100644 app/Vendor/bootstrap/custom_bootstrap.less delete mode 100644 app/Vendor/bootstrap/custom_overrides.less delete mode 100644 app/Vendor/bootstrap/custom_variables.less delete mode 100755 app/Vendor/bootstrap/less/alerts.less delete mode 100755 app/Vendor/bootstrap/less/badges.less delete mode 100755 app/Vendor/bootstrap/less/bootstrap.less delete mode 100755 app/Vendor/bootstrap/less/breadcrumbs.less delete mode 100755 app/Vendor/bootstrap/less/button-groups.less delete mode 100755 app/Vendor/bootstrap/less/buttons.less delete mode 100755 app/Vendor/bootstrap/less/carousel.less delete mode 100755 app/Vendor/bootstrap/less/close.less delete mode 100755 app/Vendor/bootstrap/less/code.less delete mode 100755 app/Vendor/bootstrap/less/component-animations.less delete mode 100755 app/Vendor/bootstrap/less/dropdowns.less delete mode 100755 app/Vendor/bootstrap/less/forms.less delete mode 100755 app/Vendor/bootstrap/less/glyphicons.less delete mode 100755 app/Vendor/bootstrap/less/grid.less delete mode 100755 app/Vendor/bootstrap/less/input-groups.less delete mode 100755 app/Vendor/bootstrap/less/jumbotron.less delete mode 100755 app/Vendor/bootstrap/less/labels.less delete mode 100755 app/Vendor/bootstrap/less/list-group.less delete mode 100755 app/Vendor/bootstrap/less/media.less delete mode 100755 app/Vendor/bootstrap/less/mixins.less delete mode 100755 app/Vendor/bootstrap/less/modals.less delete mode 100755 app/Vendor/bootstrap/less/navbar.less delete mode 100755 app/Vendor/bootstrap/less/navs.less delete mode 100755 app/Vendor/bootstrap/less/normalize.less delete mode 100755 app/Vendor/bootstrap/less/pager.less delete mode 100755 app/Vendor/bootstrap/less/pagination.less delete mode 100755 app/Vendor/bootstrap/less/panels.less delete mode 100755 app/Vendor/bootstrap/less/popovers.less delete mode 100755 app/Vendor/bootstrap/less/print.less delete mode 100755 app/Vendor/bootstrap/less/progress-bars.less delete mode 100755 app/Vendor/bootstrap/less/responsive-utilities.less delete mode 100755 app/Vendor/bootstrap/less/scaffolding.less delete mode 100755 app/Vendor/bootstrap/less/tables.less delete mode 100755 app/Vendor/bootstrap/less/theme.less delete mode 100755 app/Vendor/bootstrap/less/thumbnails.less delete mode 100755 app/Vendor/bootstrap/less/tooltip.less delete mode 100755 app/Vendor/bootstrap/less/type.less delete mode 100755 app/Vendor/bootstrap/less/utilities.less delete mode 100755 app/Vendor/bootstrap/less/variables.less delete mode 100755 app/Vendor/bootstrap/less/wells.less delete mode 100644 app/Vendor/composer/ClassLoader.php delete mode 100644 app/Vendor/composer/LICENSE delete mode 100644 app/Vendor/composer/autoload_classmap.php delete mode 100644 app/Vendor/composer/autoload_files.php delete mode 100644 app/Vendor/composer/autoload_namespaces.php delete mode 100644 app/Vendor/composer/autoload_psr4.php delete mode 100644 app/Vendor/composer/autoload_real.php delete mode 100644 app/Vendor/composer/autoload_static.php delete mode 100644 app/Vendor/composer/installed.json delete mode 100644 app/Vendor/crate/crate-dbal/.gitignore delete mode 100644 app/Vendor/crate/crate-dbal/.scrutinizer.yml delete mode 100644 app/Vendor/crate/crate-dbal/.travis.yml delete mode 100644 app/Vendor/crate/crate-dbal/AUTHORS.rst delete mode 100644 app/Vendor/crate/crate-dbal/CHANGES.txt delete mode 100644 app/Vendor/crate/crate-dbal/DEVELOP.rst delete mode 100644 app/Vendor/crate/crate-dbal/LICENSE delete mode 100644 app/Vendor/crate/crate-dbal/README.rst delete mode 100644 app/Vendor/crate/crate-dbal/Vagrantfile delete mode 100644 app/Vendor/crate/crate-dbal/composer.json delete mode 100755 app/Vendor/crate/crate-dbal/devtools/create_tag.sh delete mode 100644 app/Vendor/crate/crate-dbal/docs/bootstrap.py delete mode 100644 app/Vendor/crate/crate-dbal/docs/buildout.cfg delete mode 100644 app/Vendor/crate/crate-dbal/docs/conf.py delete mode 100644 app/Vendor/crate/crate-dbal/docs/docutils.conf delete mode 100644 app/Vendor/crate/crate-dbal/docs/index.rst delete mode 100644 app/Vendor/crate/crate-dbal/docs/installation.rst delete mode 100644 app/Vendor/crate/crate-dbal/docs/requirements.txt delete mode 100644 app/Vendor/crate/crate-dbal/docs/usage.rst delete mode 100644 app/Vendor/crate/crate-dbal/docs/versions.cfg delete mode 100644 app/Vendor/crate/crate-dbal/phpunit.xml.dist delete mode 100644 app/Vendor/crate/crate-dbal/provisioning.sh delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Driver/PDOCrate/Driver.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Driver/PDOCrate/PDOConnection.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Platforms/Crate057Platform.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Platforms/CratePlatform.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Platforms/Keywords/CrateKeywords.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Schema/CrateSchemaManager.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Types/ArrayType.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Types/MapType.php delete mode 100644 app/Vendor/crate/crate-dbal/src/Crate/DBAL/Types/TimestampType.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/DBALFunctionalTestCase.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/BindingTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/ConnectionTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/DataAccessTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/ModifyLimitQueryTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/NamedParametersTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/Schema/SchemaManagerTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/TypeConversionTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/Types/MapTypeTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Functional/WriteTest.php delete mode 100644 app/Vendor/crate/crate-dbal/test/Crate/Test/DBAL/Platforms/CratePlatformTest.php delete mode 100644 app/Vendor/crate/crate-pdo/.gitignore delete mode 100644 app/Vendor/crate/crate-pdo/.scrutinizer.yml delete mode 100644 app/Vendor/crate/crate-pdo/.travis.yml delete mode 100644 app/Vendor/crate/crate-pdo/AUTHORS.rst delete mode 100644 app/Vendor/crate/crate-pdo/CHANGES.txt delete mode 100644 app/Vendor/crate/crate-pdo/DEVELOP.rst delete mode 100644 app/Vendor/crate/crate-pdo/LICENSE delete mode 100644 app/Vendor/crate/crate-pdo/NOTICE delete mode 100644 app/Vendor/crate/crate-pdo/README.rst delete mode 100644 app/Vendor/crate/crate-pdo/Vagrantfile delete mode 100644 app/Vendor/crate/crate-pdo/composer.json delete mode 100755 app/Vendor/crate/crate-pdo/devtools/create_tag.sh delete mode 100644 app/Vendor/crate/crate-pdo/docs/conf.py delete mode 100644 app/Vendor/crate/crate-pdo/docs/docutils.conf delete mode 100644 app/Vendor/crate/crate-pdo/docs/index.rst delete mode 100644 app/Vendor/crate/crate-pdo/docs/installation.rst delete mode 100644 app/Vendor/crate/crate-pdo/docs/requirements.txt delete mode 100644 app/Vendor/crate/crate-pdo/docs/usage.rst delete mode 100644 app/Vendor/crate/crate-pdo/phpunit.xml.dist delete mode 100755 app/Vendor/crate/crate-pdo/provisioning.sh delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Exception/ExceptionInterface.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Exception/InvalidArgumentException.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Exception/LogicException.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Exception/OutOfBoundsException.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Exception/PDOException.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Exception/RuntimeException.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Exception/UnsupportedException.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Http/Client.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Http/ClientInterface.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Http/InternalClientInterface.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/Http/Server.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/PDO.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/PDOInterface.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/PDO/PDOStatement.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/Stdlib/ArrayUtils.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/Stdlib/Collection.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/Stdlib/CollectionInterface.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/Stdlib/CrateConst.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/Stdlib/Exception/ExceptionInterface.php delete mode 100644 app/Vendor/crate/crate-pdo/src/Crate/Stdlib/Exception/InvalidArgumentException.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateIntegrationTest/PDO/AbstractIntegrationTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateIntegrationTest/PDO/PDOStatementTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateIntegrationTest/PDO/PDOTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/PDO/Exception/PDOExceptionTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/PDO/Exception/UnsupportedExceptionTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/PDO/Http/ClientTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/PDO/Http/ServerTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/PDO/PDOParseDSNTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/PDO/PDOStatementTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/PDO/PDOTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/Stdlib/ArrayUtilsTest.php delete mode 100644 app/Vendor/crate/crate-pdo/test/CrateTest/Stdlib/CollectionTest.php delete mode 100644 app/Vendor/ddeboer/imap/.gitignore delete mode 100644 app/Vendor/ddeboer/imap/.scrutinizer.yml delete mode 100644 app/Vendor/ddeboer/imap/.travis.yml delete mode 100644 app/Vendor/ddeboer/imap/LICENSE delete mode 100644 app/Vendor/ddeboer/imap/README.md delete mode 100644 app/Vendor/ddeboer/imap/composer.json delete mode 100644 app/Vendor/ddeboer/imap/composer.lock delete mode 100644 app/Vendor/ddeboer/imap/phpunit.xml.dist delete mode 100644 app/Vendor/ddeboer/imap/src/Connection.php delete mode 100644 app/Vendor/ddeboer/imap/src/Exception/AuthenticationFailedException.php delete mode 100644 app/Vendor/ddeboer/imap/src/Exception/Exception.php delete mode 100644 app/Vendor/ddeboer/imap/src/Exception/MailboxDoesNotExistException.php delete mode 100644 app/Vendor/ddeboer/imap/src/Exception/MessageDeleteException.php delete mode 100644 app/Vendor/ddeboer/imap/src/Exception/MessageDoesNotExistException.php delete mode 100644 app/Vendor/ddeboer/imap/src/Exception/MessageMoveException.php delete mode 100644 app/Vendor/ddeboer/imap/src/Mailbox.php delete mode 100644 app/Vendor/ddeboer/imap/src/Message.php delete mode 100644 app/Vendor/ddeboer/imap/src/Message/Attachment.php delete mode 100644 app/Vendor/ddeboer/imap/src/Message/EmailAddress.php delete mode 100644 app/Vendor/ddeboer/imap/src/Message/Headers.php delete mode 100644 app/Vendor/ddeboer/imap/src/Message/Part.php delete mode 100644 app/Vendor/ddeboer/imap/src/MessageIterator.php delete mode 100644 app/Vendor/ddeboer/imap/src/Parameters.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/AbstractCondition.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Date/AbstractDate.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Date/After.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Date/Before.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Date/On.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Email/AbstractEmail.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Email/FromAddress.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Email/To.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Flag/Answered.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Flag/Flagged.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Flag/Recent.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Flag/Seen.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Flag/Unanswered.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Flag/Unflagged.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Flag/Unseen.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/LogicalOperator/All.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/LogicalOperator/OrConditions.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/State/Deleted.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/State/NewMessage.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/State/Old.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/State/Undeleted.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Text/AbstractText.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Text/Body.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Text/Keyword.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Text/Subject.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Text/Text.php delete mode 100644 app/Vendor/ddeboer/imap/src/Search/Text/Unkeyword.php delete mode 100644 app/Vendor/ddeboer/imap/src/SearchExpression.php delete mode 100644 app/Vendor/ddeboer/imap/src/Server.php delete mode 100644 app/Vendor/ddeboer/transcoder/.gitignore delete mode 100644 app/Vendor/ddeboer/transcoder/.travis.yml delete mode 100644 app/Vendor/ddeboer/transcoder/LICENSE delete mode 100644 app/Vendor/ddeboer/transcoder/README.md delete mode 100644 app/Vendor/ddeboer/transcoder/composer.json delete mode 100644 app/Vendor/ddeboer/transcoder/phpunit.xml.dist delete mode 100644 app/Vendor/ddeboer/transcoder/src/Exception/ExtensionMissingException.php delete mode 100644 app/Vendor/ddeboer/transcoder/src/Exception/IllegalCharacterException.php delete mode 100644 app/Vendor/ddeboer/transcoder/src/Exception/UndetectableEncodingException.php delete mode 100644 app/Vendor/ddeboer/transcoder/src/Exception/UnsupportedEncodingException.php delete mode 100644 app/Vendor/ddeboer/transcoder/src/IconvTranscoder.php delete mode 100644 app/Vendor/ddeboer/transcoder/src/MbTranscoder.php delete mode 100644 app/Vendor/ddeboer/transcoder/src/Transcoder.php delete mode 100644 app/Vendor/ddeboer/transcoder/src/TranscoderInterface.php delete mode 100644 app/Vendor/doctrine/annotations/LICENSE delete mode 100644 app/Vendor/doctrine/annotations/README.md delete mode 100644 app/Vendor/doctrine/annotations/composer.json delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php delete mode 100644 app/Vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php delete mode 100644 app/Vendor/doctrine/cache/.coveralls.yml delete mode 100644 app/Vendor/doctrine/cache/.gitignore delete mode 100644 app/Vendor/doctrine/cache/.travis.yml delete mode 100644 app/Vendor/doctrine/cache/LICENSE delete mode 100644 app/Vendor/doctrine/cache/README.md delete mode 100644 app/Vendor/doctrine/cache/UPGRADE.md delete mode 100644 app/Vendor/doctrine/cache/build.properties delete mode 100644 app/Vendor/doctrine/cache/build.xml delete mode 100644 app/Vendor/doctrine/cache/composer.json delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcuCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiPutCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php delete mode 100644 app/Vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php delete mode 100644 app/Vendor/doctrine/cache/phpunit.xml.dist delete mode 100644 app/Vendor/doctrine/collections/.gitignore delete mode 100644 app/Vendor/doctrine/collections/.travis.yml delete mode 100644 app/Vendor/doctrine/collections/LICENSE delete mode 100644 app/Vendor/doctrine/collections/README.md delete mode 100644 app/Vendor/doctrine/collections/composer.json delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Criteria.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Comparison.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Expression.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php delete mode 100644 app/Vendor/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php delete mode 100644 app/Vendor/doctrine/collections/phpunit.xml.dist delete mode 100644 app/Vendor/doctrine/common/LICENSE delete mode 100644 app/Vendor/doctrine/common/README.md delete mode 100644 app/Vendor/doctrine/common/UPGRADE_TO_2_1 delete mode 100644 app/Vendor/doctrine/common/UPGRADE_TO_2_2 delete mode 100644 app/Vendor/doctrine/common/composer.json delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/CommonException.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Comparable.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/EventManager.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Lexer.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerDecorator.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectRepository.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Persistence/Proxy.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/PropertyChangedListener.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/Autoloader.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/Exception/InvalidArgumentException.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/Exception/OutOfBoundsException.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/Exception/ProxyException.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/Exception/UnexpectedValueException.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/Proxy.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/ProxyDefinition.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Proxy/ProxyGenerator.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/ClassFinderInterface.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/Psr0FindFile.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/ReflectionProviderInterface.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/RuntimePublicReflectionProperty.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionClass.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionMethod.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionParser.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionProperty.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Util/ClassUtils.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Util/Inflector.php delete mode 100644 app/Vendor/doctrine/common/lib/Doctrine/Common/Version.php delete mode 100644 app/Vendor/doctrine/dbal/LICENSE delete mode 100644 app/Vendor/doctrine/dbal/README.md delete mode 100644 app/Vendor/doctrine/dbal/SECURITY.md delete mode 100644 app/Vendor/doctrine/dbal/UPGRADE.md delete mode 100755 app/Vendor/doctrine/dbal/bin/doctrine-dbal delete mode 100644 app/Vendor/doctrine/dbal/bin/doctrine-dbal.php delete mode 100644 app/Vendor/doctrine/dbal/composer.json delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Cache/ArrayStatement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Cache/CacheException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Cache/QueryCacheProfile.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Cache/ResultCacheStatement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Configuration.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/ConnectionException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Connections/MasterSlaveConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractDB2Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractDriverException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractOracleDriver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractPostgreSQLDriver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLAnywhereDriver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLServerDriver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractSQLiteDriver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Connection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/DriverException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/DrizzlePDOMySql/Connection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/DrizzlePDOMySql/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/ExceptionConverterDriver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Connection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Exception.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/IBMDB2/DB2Statement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Mysqli/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Mysqli/MysqliConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Mysqli/MysqliException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Mysqli/MysqliStatement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/OCI8/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/OCI8/OCI8Exception.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOIbm/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOMySql/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOOracle/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOPgSql/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOSqlite/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOSqlsrv/Connection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOSqlsrv/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOSqlsrv/Statement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PingableConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/ResultStatement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLAnywhere/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLAnywhere/SQLAnywhereConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLAnywhere/SQLAnywhereException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLAnywhere/SQLAnywhereStatement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLSrv/Driver.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLSrv/LastInsertId.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLSrv/SQLSrvConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLSrv/SQLSrvException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/SQLSrv/SQLSrvStatement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/ServerInfoAwareConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/Statement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/DriverManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/ConnectionEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/Listeners/MysqlSessionInit.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/Listeners/OracleSessionInit.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/Listeners/SQLSessionInit.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaAlterTableAddColumnEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaAlterTableChangeColumnEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaAlterTableEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaAlterTableRemoveColumnEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaAlterTableRenameColumnEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaColumnDefinitionEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaCreateTableColumnEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaCreateTableEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaDropTableEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Event/SchemaIndexDefinitionEventArgs.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Events.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConnectionException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/ConstraintViolationException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/DatabaseObjectExistsException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/DatabaseObjectNotFoundException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/DriverException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/ForeignKeyConstraintViolationException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/InvalidArgumentException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/InvalidFieldNameException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/NonUniqueFieldNameException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/NotNullConstraintViolationException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/ReadOnlyException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/ServerException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/SyntaxErrorException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/TableExistsException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/TableNotFoundException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Exception/UniqueConstraintViolationException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Id/TableGenerator.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Id/TableGeneratorSchemaVisitor.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/LockMode.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/DebugStack.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/EchoSQLLogger.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/LoggerChain.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Logging/SQLLogger.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/DB2Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/DrizzlePlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/DB2Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/DrizzleKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/KeywordList.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MsSQLKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQL57Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/MySQLKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/OracleKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/PostgreSQL91Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/PostgreSQL92Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/PostgreSQLKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/ReservedKeywordsValidator.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLAnywhere11Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLAnywhere12Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLAnywhere16Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLAnywhereKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLServer2005Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLServer2008Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLServer2012Keywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLServerKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/Keywords/SQLiteKeywords.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySQL57Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/OraclePlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/PostgreSQL91Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/PostgreSQL92Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLAnywhere11Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLAnywhere12Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLAnywhere16Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLAnywherePlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLAzurePlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLServer2005Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLServer2008Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLServer2012Platform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SQLServerPlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SqlitePlatform.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Portability/Connection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Portability/Statement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Query/Expression/CompositeExpression.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Query/Expression/ExpressionBuilder.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryBuilder.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Query/QueryException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/README.markdown delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtils.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/SQLParserUtilsException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/AbstractAsset.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Column.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/ColumnDiff.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Comparator.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Constraint.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/DB2SchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/DrizzleSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/ForeignKeyConstraint.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Identifier.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Index.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/MySqlSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/OracleSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/PostgreSqlSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/SQLAnywhereSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/SQLServerSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Schema.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/SchemaConfig.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/SchemaDiff.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/SchemaException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Sequence.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/SqliteSchemaManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Synchronizer/AbstractSchemaSynchronizer.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Synchronizer/SchemaSynchronizer.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Synchronizer/SingleDatabaseSynchronizer.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Table.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/TableDiff.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/View.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/AbstractVisitor.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/CreateSchemaSqlCollector.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/DropSchemaSqlCollector.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/Graphviz.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/NamespaceVisitor.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/RemoveNamespacedAssets.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/SchemaDiffVisitor.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/Visitor/Visitor.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/PoolingShardConnection.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/PoolingShardManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureFederationsSynchronizer.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/SQLAzure/SQLAzureShardManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/SQLAzure/Schema/MultiTenantVisitor.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/ShardChoser/MultiTenantShardChoser.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/ShardChoser/ShardChoser.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/ShardManager.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Sharding/ShardingException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Tools/Console/Command/ImportCommand.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Tools/Console/Command/ReservedWordsCommand.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Tools/Console/Command/RunSqlCommand.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Tools/Console/ConsoleRunner.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Tools/Console/Helper/ConnectionHelper.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ArrayType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BigIntType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BinaryType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BlobType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/BooleanType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ConversionException.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeTzType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DecimalType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/FloatType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/GuidType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/IntegerType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/JsonArrayType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/ObjectType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/SimpleArrayType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/SmallIntType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/StringType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/TextType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/TimeType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeType.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/Version.php delete mode 100644 app/Vendor/doctrine/dbal/lib/Doctrine/DBAL/VersionAwarePlatformDriver.php delete mode 100644 app/Vendor/doctrine/inflector/.gitignore delete mode 100644 app/Vendor/doctrine/inflector/.travis.yml delete mode 100644 app/Vendor/doctrine/inflector/LICENSE delete mode 100644 app/Vendor/doctrine/inflector/README.md delete mode 100644 app/Vendor/doctrine/inflector/composer.json delete mode 100644 app/Vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php delete mode 100644 app/Vendor/doctrine/inflector/phpunit.xml.dist delete mode 100644 app/Vendor/doctrine/lexer/LICENSE delete mode 100644 app/Vendor/doctrine/lexer/README.md delete mode 100644 app/Vendor/doctrine/lexer/composer.json delete mode 100644 app/Vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/.travis.yml delete mode 100644 app/Vendor/guzzlehttp/guzzle/CHANGELOG.md delete mode 100644 app/Vendor/guzzlehttp/guzzle/LICENSE delete mode 100644 app/Vendor/guzzlehttp/guzzle/README.md delete mode 100644 app/Vendor/guzzlehttp/guzzle/UPGRADING.md delete mode 100644 app/Vendor/guzzlehttp/guzzle/composer.json delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Client.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/ClientInterface.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/ClientException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/RequestException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/SeekException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/ServerException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Exception/TransferException.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/Proxy.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/HandlerStack.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/MessageFormatter.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Middleware.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/Pool.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/RequestOptions.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/RetryMiddleware.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/TransferStats.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/UriTemplate.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/functions.php delete mode 100644 app/Vendor/guzzlehttp/guzzle/src/functions_include.php delete mode 100644 app/Vendor/guzzlehttp/promises/CHANGELOG.md delete mode 100644 app/Vendor/guzzlehttp/promises/LICENSE delete mode 100644 app/Vendor/guzzlehttp/promises/Makefile delete mode 100644 app/Vendor/guzzlehttp/promises/README.md delete mode 100644 app/Vendor/guzzlehttp/promises/composer.json delete mode 100644 app/Vendor/guzzlehttp/promises/src/AggregateException.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/CancellationException.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/Coroutine.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/EachPromise.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/FulfilledPromise.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/Promise.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/PromiseInterface.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/PromisorInterface.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/RejectedPromise.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/RejectionException.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/TaskQueue.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/TaskQueueInterface.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/functions.php delete mode 100644 app/Vendor/guzzlehttp/promises/src/functions_include.php delete mode 100644 app/Vendor/guzzlehttp/psr7/CHANGELOG.md delete mode 100644 app/Vendor/guzzlehttp/psr7/LICENSE delete mode 100644 app/Vendor/guzzlehttp/psr7/README.md delete mode 100644 app/Vendor/guzzlehttp/psr7/composer.json delete mode 100644 app/Vendor/guzzlehttp/psr7/src/AppendStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/BufferStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/CachingStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/DroppingStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/FnStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/InflateStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/LazyOpenStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/LimitStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/MessageTrait.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/MultipartStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/NoSeekStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/PumpStream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/Request.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/Response.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/ServerRequest.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/Stream.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/StreamWrapper.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/UploadedFile.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/Uri.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/UriNormalizer.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/UriResolver.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/functions.php delete mode 100644 app/Vendor/guzzlehttp/psr7/src/functions_include.php delete mode 100644 app/Vendor/minify/.coveralls.yml delete mode 100644 app/Vendor/minify/.gitignore delete mode 100644 app/Vendor/minify/.travis.yml delete mode 100644 app/Vendor/minify/GitHub.txt delete mode 100644 app/Vendor/minify/LICENSE delete mode 100644 app/Vendor/minify/README.md delete mode 100755 app/Vendor/minify/bin/minifycss delete mode 100755 app/Vendor/minify/bin/minifyjs delete mode 100644 app/Vendor/minify/composer.json delete mode 100644 app/Vendor/minify/data/js/keywords_after.txt delete mode 100644 app/Vendor/minify/data/js/keywords_before.txt delete mode 100644 app/Vendor/minify/data/js/keywords_reserved.txt delete mode 100644 app/Vendor/minify/data/js/operators_after.txt delete mode 100644 app/Vendor/minify/data/js/operators_before.txt delete mode 100644 app/Vendor/minify/makefile delete mode 100644 app/Vendor/minify/phpunit.xml.dist delete mode 100644 app/Vendor/minify/src/CSS.php delete mode 100644 app/Vendor/minify/src/Exception.php delete mode 100644 app/Vendor/minify/src/JS.php delete mode 100644 app/Vendor/minify/src/Minify.php delete mode 100644 app/Vendor/minify/tests/bootstrap.php delete mode 100644 app/Vendor/minify/tests/css/CSSTest.php delete mode 100644 app/Vendor/minify/tests/css/sample/bom/bom.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/import.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/index.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/index2.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/index3.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/index4.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/index5.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/index6a.css delete mode 100644 app/Vendor/minify/tests/css/sample/combine_imports/index6b.css delete mode 100644 app/Vendor/minify/tests/css/sample/convert_relative_path/source/absolute.css delete mode 100644 app/Vendor/minify/tests/css/sample/convert_relative_path/source/external.css delete mode 100644 app/Vendor/minify/tests/css/sample/convert_relative_path/source/issue29.css delete mode 100644 app/Vendor/minify/tests/css/sample/convert_relative_path/source/issue39.css delete mode 100644 app/Vendor/minify/tests/css/sample/convert_relative_path/source/nested/nested.css delete mode 100644 app/Vendor/minify/tests/css/sample/convert_relative_path/source/relative.css delete mode 100644 app/Vendor/minify/tests/css/sample/convert_relative_path/target/relative.css delete mode 100644 app/Vendor/minify/tests/css/sample/import_files/facebook.png delete mode 100644 app/Vendor/minify/tests/css/sample/import_files/file.png delete mode 100644 app/Vendor/minify/tests/css/sample/import_files/index.css delete mode 100644 app/Vendor/minify/tests/css/sample/import_files/instagram.png delete mode 100644 app/Vendor/minify/tests/css/sample/import_files/issue49.css delete mode 100644 app/Vendor/minify/tests/css/sample/import_files/vimeo.png delete mode 100644 app/Vendor/minify/tests/js/AbstractTest.php delete mode 100644 app/Vendor/minify/tests/js/JSTest.php delete mode 100644 app/Vendor/minify/tests/js/sample/source/script1.js delete mode 100644 app/Vendor/minify/tests/js/sample/source/script2.js delete mode 100755 app/Vendor/parsedown/.travis.yml delete mode 100755 app/Vendor/parsedown/LICENSE.txt delete mode 100755 app/Vendor/parsedown/Parsedown.php delete mode 100644 app/Vendor/parsedown/ParsedownExtra.php delete mode 100755 app/Vendor/parsedown/README.md delete mode 100644 app/Vendor/psr/http-message/CHANGELOG.md delete mode 100644 app/Vendor/psr/http-message/LICENSE delete mode 100644 app/Vendor/psr/http-message/README.md delete mode 100644 app/Vendor/psr/http-message/composer.json delete mode 100644 app/Vendor/psr/http-message/src/MessageInterface.php delete mode 100644 app/Vendor/psr/http-message/src/RequestInterface.php delete mode 100644 app/Vendor/psr/http-message/src/ResponseInterface.php delete mode 100644 app/Vendor/psr/http-message/src/ServerRequestInterface.php delete mode 100644 app/Vendor/psr/http-message/src/StreamInterface.php delete mode 100644 app/Vendor/psr/http-message/src/UploadedFileInterface.php delete mode 100644 app/Vendor/psr/http-message/src/UriInterface.php delete mode 100644 app/Vendor/symfony/filesystem/.gitignore delete mode 100644 app/Vendor/symfony/filesystem/CHANGELOG.md delete mode 100644 app/Vendor/symfony/filesystem/Exception/ExceptionInterface.php delete mode 100644 app/Vendor/symfony/filesystem/Exception/FileNotFoundException.php delete mode 100644 app/Vendor/symfony/filesystem/Exception/IOException.php delete mode 100644 app/Vendor/symfony/filesystem/Exception/IOExceptionInterface.php delete mode 100644 app/Vendor/symfony/filesystem/Filesystem.php delete mode 100644 app/Vendor/symfony/filesystem/LICENSE delete mode 100644 app/Vendor/symfony/filesystem/LockHandler.php delete mode 100644 app/Vendor/symfony/filesystem/README.md delete mode 100644 app/Vendor/symfony/filesystem/Tests/ExceptionTest.php delete mode 100644 app/Vendor/symfony/filesystem/Tests/FilesystemTest.php delete mode 100644 app/Vendor/symfony/filesystem/Tests/FilesystemTestCase.php delete mode 100644 app/Vendor/symfony/filesystem/Tests/Fixtures/MockStream/MockStream.php delete mode 100644 app/Vendor/symfony/filesystem/Tests/LockHandlerTest.php delete mode 100644 app/Vendor/symfony/filesystem/composer.json delete mode 100644 app/Vendor/symfony/filesystem/phpunit.xml.dist delete mode 100644 app/Vendor/yuicompressor-2.4.7.jar diff --git a/app/Console/Command/CompressShell.php b/app/Console/Command/CompressShell.php index 6ae21151ef..65baa3c70a 100644 --- a/app/Console/Command/CompressShell.php +++ b/app/Console/Command/CompressShell.php @@ -23,8 +23,8 @@ // License agreement and license key will be shipped with the order // confirmation. -require_once APP.'Vendor'.DS.'minify'.DS.'src'.DS.'Minify.php'; -require_once APP.'Vendor'.DS.'minify'.DS.'src'.DS.'JS.php'; +//require_once APP.'Vendor'.DS.'minify'.DS.'src'.DS.'Minify.php'; +//require_once APP.'Vendor'.DS.'minify'.DS.'src'.DS.'JS.php'; use MatthiasMullie\Minify; diff --git a/app/Console/Command/SudoServerShell.php b/app/Console/Command/SudoServerShell.php index 2f4f0bd891..49374d9dab 100755 --- a/app/Console/Command/SudoServerShell.php +++ b/app/Console/Command/SudoServerShell.php @@ -23,26 +23,27 @@ // License agreement and license key will be shipped with the order // confirmation. -require APP.'/Vendor/Ratchet/vendor/autoload.php'; +//require APP.'/Vendor/Ratchet/vendor/autoload.php'; +use itnovum\openITCOCKPIT\Ratchet\Overwrites\HttpServerSize; use Ratchet\Server\IoServer; use Ratchet\WebSocket\WsServer; use Ratchet\Http\HttpServer; +use React\Socket\Server; +use React\Socket\Server as Reactor; -require_once APP.'/Lib/SudoMessageInterface.php'; +require_once APP . '/Lib/SudoMessageInterface.php'; App::import('Model', 'Export'); //public $tasks = array('WriteConfiguration'); -class SudoServerShell extends AppShell -{ +class SudoServerShell extends AppShell { public $uses = [MONITORING_EXTERNALCOMMAND, MONITORING_NAGIOSTAT, 'Systemsetting', 'Export']; //public $tasks = ['NagiosExport']; //public $tasks = ['SudoWorker']; - public function main() - { + public function main() { Configure::load('nagios'); App::uses('Folder', 'Utility'); @@ -92,13 +93,11 @@ public function main() } } - public function _welcome() - { + public function _welcome() { //Disable CakePHP welcome messages } - public function getOptionParser() - { + public function getOptionParser() { $parser = parent::getOptionParser(); $parser->addOptions([ 'daemon' => ['short' => 'd', 'help' => __d('oitc_console', 'Starts SudoServer in daemon mode, instead of as a forground process')], @@ -114,8 +113,7 @@ public function getOptionParser() return $parser; } - public function daemonizing() - { + public function daemonizing() { $this->_systemCheck(); if ($this->status()) { $this->out('SudoServer already running'); @@ -137,13 +135,12 @@ public function daemonizing() chmod($this->pidFile, 0000); $this->stdout->styles('green', ['text' => 'green']); - $this->out('Finished daemonizing... [My PID = '.$SudoServerPid.']'); + $this->out('Finished daemonizing... [My PID = ' . $SudoServerPid . ']'); } - public function status() - { + public function status() { foreach ($this->_getPid() as $pid) { - exec('ps -eaf |grep '.escapeshellarg($pid).' |grep -v grep', $output); + exec('ps -eaf |grep ' . escapeshellarg($pid) . ' |grep -v grep', $output); foreach ($output as $line) { if (preg_match('#.*app/Console/cake.php -working .*/app sudo_server (-d|--daemon|--restart)#', $line)) { return true; @@ -158,8 +155,7 @@ public function status() return false; } - private function _getPid() - { + private function _getPid() { $return = []; if (file_exists($this->pidFile)) { $pids = file($this->pidFile); @@ -174,8 +170,7 @@ private function _getPid() return $return; } - public function stop($exit = true) - { + public function stop($exit = true) { if (!$this->status()) { $this->out("Notice: SudoServer isn't running!"); if ($exit) { @@ -223,8 +218,7 @@ public function stop($exit = true) return true; } - public function restart() - { + public function restart() { if ($this->stop(false)) { sleep(1); $this->daemonizing(); @@ -234,14 +228,12 @@ public function restart() /* * Pacemaker likes this function, we dont know why :) */ - public function probe() - { + public function probe() { echo "restart\n"; exit(0); } - private function _systemCheck() - { + private function _systemCheck() { if (!function_exists('pcntl_fork')) { $this->out('Error: PHP function "pcntl_fork()" not found or is disabled for security reasons. Please check your php.ini'); exit(3); @@ -264,8 +256,7 @@ private function _systemCheck() } - private function _bootstrap() - { + private function _bootstrap() { $this->Systemsetting->getDataSource()->reconnect(); $this->_systemsettings = $this->Systemsetting->findAsArray(); @@ -293,34 +284,30 @@ private function _bootstrap() $SudoInterface = new SudoMessageInterface($this); + $loop = React\EventLoop\Factory::create(); $loop->addPeriodicTimer(0.01, [$SudoInterface, 'eventLoop']); - $webSock = new React\Socket\Server($loop); - $webSock->listen(8081, '0.0.0.0'); - - $webServer = new Ratchet\Server\IoServer( - new Ratchet\Http\HttpServer( - new Ratchet\WebSocket\WsServer( - $SudoInterface - ) + $Server = new IoServer( + new HttpServerSize( + new WsServer($SudoInterface) ), - $webSock + new Reactor(sprintf('%s:%s', '0.0.0.0', 8081), $loop), + $loop ); + try { - $loop->run(); + $Server->run(); } catch (Exception $e) { debug($e); } } - public function createSocket() - { + public function createSocket() { return socket_create(AF_UNIX, SOCK_DGRAM, 0); } - public function bindSocket() - { + public function bindSocket() { if (!is_dir($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'])) { mkdir($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET']); } @@ -329,8 +316,8 @@ public function bindSocket() $this->deleteSocket(); - socket_bind($this->socket, $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME']); - if (file_exists($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'])) { + socket_bind($this->socket, $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME']); + if (file_exists($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'])) { $this->setFilePermissions(); return true; @@ -339,29 +326,25 @@ public function bindSocket() } } - function deleteSocket() - { - if (file_exists($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'])) { - unlink($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME']); + function deleteSocket() { + if (file_exists($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'])) { + unlink($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME']); } } - public function setFolderPermissions() - { + public function setFolderPermissions() { chown($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'], $this->_systemsettings['WEBSERVER']['WEBSERVER.USER']); chgrp($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'], $this->_systemsettings['MONITORING']['MONITORING.GROUP']); chmod($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'], $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.FOLDERPERMISSIONS']); } - public function setFilePermissions() - { - chown($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'], $this->_systemsettings['WEBSERVER']['WEBSERVER.USER']); - chgrp($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'], $this->_systemsettings['MONITORING']['MONITORING.GROUP']); - chmod($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'], $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKETPERMISSIONS']); + public function setFilePermissions() { + chown($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'], $this->_systemsettings['WEBSERVER']['WEBSERVER.USER']); + chgrp($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'], $this->_systemsettings['MONITORING']['MONITORING.GROUP']); + chmod($this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET_NAME'], $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKETPERMISSIONS']); } - public function sendToWorkerSocket($data = []) - { + public function sendToWorkerSocket($data = []) { /*$data = [ 'task' => $task, //'sourceTask' => $task, @@ -370,23 +353,21 @@ public function sendToWorkerSocket($data = []) 'requestor' => $this->requestor, ];*/ $data = json_encode($data); - if (!socket_sendto($this->sudoWorkerSocket, $data, strlen($data), 0, $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.WORKERSOCKET_NAME'])) { - $this->out(__('Could not connect to UNIX socket ').$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.WORKERSOCKET_NAME']); + if (!socket_sendto($this->sudoWorkerSocket, $data, strlen($data), 0, $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.WORKERSOCKET_NAME'])) { + $this->out(__('Could not connect to UNIX socket ') . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.WORKERSOCKET_NAME']); } } - public function sendToResponseSocket($data = []) - { + public function sendToResponseSocket($data = []) { $socket = socket_create(AF_UNIX, SOCK_DGRAM, 0); $data = json_encode($data); - if (!socket_sendto($socket, $data, strlen($data), 0, $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.RESPONSESOCKET_NAME'])) { - $this->out(__('Could not connect to UNIX socket ').$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'].$this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.RESPONSESOCKET_NAME']); + if (!socket_sendto($socket, $data, strlen($data), 0, $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.RESPONSESOCKET_NAME'])) { + $this->out(__('Could not connect to UNIX socket ') . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.SOCKET'] . $this->_systemsettings['SUDO_SERVER']['SUDO_SERVER.RESPONSESOCKET_NAME']); } unset($socket); } - function sigchld_handler($signal) - { + function sigchld_handler($signal) { //Get the dead child pid and clean up the zombie process $dead_child_pid = pcntl_wait($status, WNOHANG); // Dieser Child muss neu erstellt werden! diff --git a/app/Controller/DocumentationsController.php b/app/Controller/DocumentationsController.php index 5da32c7f0b..473a9acf29 100755 --- a/app/Controller/DocumentationsController.php +++ b/app/Controller/DocumentationsController.php @@ -911,8 +911,8 @@ public function wiki($categoryUrl = null, $pageUrl = null, $language = 'en') $renderPage = true; App::uses('File', 'Utility'); - require_once APP.'Vendor'.DS.'parsedown'.DS.'Parsedown.php'; - require_once APP.'Vendor'.DS.'parsedown'.DS.'ParsedownExtra.php'; + //require_once APP.'Vendor'.DS.'parsedown'.DS.'Parsedown.php'; + //require_once APP.'Vendor'.DS.'parsedown'.DS.'ParsedownExtra.php'; $basePath = APP.'docs'.DS.$language; $categoryDirectory = $wiki[$categoryUrl]['directory']; diff --git a/app/Vendor/Ratchet/composer.json b/app/Vendor/Ratchet/composer.json deleted file mode 100755 index 016eb849df..0000000000 --- a/app/Vendor/Ratchet/composer.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "cboden/Ratchet-examples" - , "type": "library" - , "homepage": "http://socketo.me" - , "keywords": ["WebSocket", "demo", "Ratchet"] - , "license": "MIT" - , "minimum-stability": "dev" - , "authors": [ - { - "name": "Chris Boden" - , "email": "cboden@gmail.com" - , "role": "Developer" - } - ] - , "autoload": { - "psr-0": { - "Ratchet\\Cookbook": "src" - , "Ratchet\\Tutorials": "src" - , "Ratchet\\Website": "src" - , "Ratchet\\Tests\\Cookbook": "tests" - , "Ratchet\\Tests\\Tutorials": "tests" - , "Ratchet\\Tests\\Website": "tests" - - } - } - , "require": { - "php": ">=5.3.3" - , "cboden/Ratchet": "master" - , "monolog/monolog": "dev-master" - , "cujojs/when": "dev-master" - , "tavendo/AutobahnJS": "dev-master" - , "gimite/web-socket-js": "dev-master" - ,"react/react": "0.3.*" - } - , "repositories": [ - { - "type": "package" - , "package": { - "name": "gimite/web-socket-js" - , "type": "library" - , "version": "dev-master" - , "source": { - "url": "https://github.com/gimite/web-socket-js" - , "type": "git" - , "reference": "master" - } - } - } - , { - "type": "package" - , "package": { - "name": "tavendo/AutobahnJS" - , "type": "library" - , "version": "dev-master" - , "source": { - "url": "https://github.com/tavendo/AutobahnJS.git" - , "type": "git" - , "reference": "v0.6.0" - } - } - } - , { - "type": "package" - , "package": { - "name": "cujojs/when" - , "type": "library" - , "version": "dev-master" - , "source": { - "url": "https://github.com/cujojs/when.git" - , "type": "git" - , "reference": "00fdea1f49c697f97754b8ed6416082f362830ad" - } - } - } - ] -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/composer.lock b/app/Vendor/Ratchet/composer.lock deleted file mode 100644 index d7b7cf3bfa..0000000000 --- a/app/Vendor/Ratchet/composer.lock +++ /dev/null @@ -1,734 +0,0 @@ -{ - "_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": "e8645ca26c4f726a5a57f12bc82dfff4", - "packages": [ - { - "name": "cboden/ratchet", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/cboden/Ratchet.git", - "reference": "36215fbc7b1c072109bb9f675b9836a5c2190763" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cboden/Ratchet/zipball/36215fbc7b1c072109bb9f675b9836a5c2190763", - "reference": "36215fbc7b1c072109bb9f675b9836a5c2190763", - "shasum": "" - }, - "require": { - "guzzle/http": ">=3.6.0,<3.9.0-dev", - "php": ">=5.3.9", - "react/socket": ">=0.3.0,<0.5-dev", - "symfony/http-foundation": "~2.2", - "symfony/routing": "~2.2" - }, - "type": "library", - "autoload": { - "psr-0": { - "Ratchet": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "http://res.im", - "role": "Developer" - } - ], - "description": "PHP WebSocket library", - "homepage": "http://socketo.me", - "keywords": [ - "Ratchet", - "WebSockets", - "server", - "sockets" - ], - "time": "2014-02-05 01:42:38" - }, - { - "name": "cujojs/when", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/cujojs/when.git", - "reference": "00fdea1f49c697f97754b8ed6416082f362830ad" - }, - "type": "library", - "time": "2012-03-19 13:01:08" - }, - { - "name": "evenement/evenement", - "version": "1.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "8b0918f8374327dfed4408fe467980ab41d556dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/8b0918f8374327dfed4408fe467980ab41d556dd", - "reference": "8b0918f8374327dfed4408fe467980ab41d556dd", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "psr-0": { - "Evenement": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch", - "homepage": "http://wiedler.ch/igor/" - } - ], - "description": "Événement is a very simple event dispatching library for PHP 5.3", - "keywords": [ - "event-dispatcher" - ], - "time": "2012-12-29 17:04:52" - }, - { - "name": "gimite/web-socket-js", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/gimite/web-socket-js", - "reference": "master" - }, - "type": "library", - "time": "2014-01-16 13:33:03" - }, - { - "name": "guzzle/common", - "version": "v3.8.1", - "target-dir": "Guzzle/Common", - "source": { - "type": "git", - "url": "https://github.com/guzzle/common.git", - "reference": "67f6c3fd04bae387d47c2a673fa623ed8f4189bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/common/zipball/67f6c3fd04bae387d47c2a673fa623ed8f4189bb", - "reference": "67f6c3fd04bae387d47c2a673fa623ed8f4189bb", - "shasum": "" - }, - "require": { - "php": ">=5.3.2", - "symfony/event-dispatcher": ">=2.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "autoload": { - "psr-0": { - "Guzzle\\Common": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Common libraries used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "collection", - "common", - "event", - "exception" - ], - "time": "2014-01-28 22:29:15" - }, - { - "name": "guzzle/http", - "version": "v3.8.1", - "target-dir": "Guzzle/Http", - "source": { - "type": "git", - "url": "https://github.com/guzzle/http.git", - "reference": "565fd64be16d91c840f497c5de76f86d54a822d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/http/zipball/565fd64be16d91c840f497c5de76f86d54a822d8", - "reference": "565fd64be16d91c840f497c5de76f86d54a822d8", - "shasum": "" - }, - "require": { - "guzzle/common": "self.version", - "guzzle/parser": "self.version", - "guzzle/stream": "self.version", - "php": ">=5.3.2" - }, - "suggest": { - "ext-curl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "autoload": { - "psr-0": { - "Guzzle\\Http": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "HTTP libraries used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "Guzzle", - "client", - "curl", - "http", - "http client" - ], - "time": "2014-01-23 18:23:29" - }, - { - "name": "guzzle/parser", - "version": "v3.8.1", - "target-dir": "Guzzle/Parser", - "source": { - "type": "git", - "url": "https://github.com/guzzle/parser.git", - "reference": "3f52387052f2e4ef083145a0f73c3654aa14e086" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/parser/zipball/3f52387052f2e4ef083145a0f73c3654aa14e086", - "reference": "3f52387052f2e4ef083145a0f73c3654aa14e086", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "autoload": { - "psr-0": { - "Guzzle\\Parser": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Interchangeable parsers used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "URI Template", - "cookie", - "http", - "message", - "url" - ], - "time": "2013-10-24 00:04:09" - }, - { - "name": "guzzle/stream", - "version": "v3.8.1", - "target-dir": "Guzzle/Stream", - "source": { - "type": "git", - "url": "https://github.com/guzzle/stream.git", - "reference": "fa8af730ca714861c0001cfba64aaecc5f21bb96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/stream/zipball/fa8af730ca714861c0001cfba64aaecc5f21bb96", - "reference": "fa8af730ca714861c0001cfba64aaecc5f21bb96", - "shasum": "" - }, - "require": { - "guzzle/common": "self.version", - "php": ">=5.3.2" - }, - "suggest": { - "guzzle/http": "To convert Guzzle request objects to PHP streams" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "autoload": { - "psr-0": { - "Guzzle\\Stream": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle stream wrapper component", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "Guzzle", - "component", - "stream" - ], - "time": "2014-01-28 22:14:17" - }, - { - "name": "monolog/monolog", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "7f783c0ab09dc341f858882e2d2ce6fc36ca1351" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/7f783c0ab09dc341f858882e2d2ce6fc36ca1351", - "reference": "7f783c0ab09dc341f858882e2d2ce6fc36ca1351", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "require-dev": { - "aws/aws-sdk-php": "~2.4.8", - "doctrine/couchdb": "dev-master", - "mlehner/gelf-php": "1.0.*", - "phpunit/phpunit": "~3.7.0", - "raven/raven": "~0.5", - "ruflin/elastica": "0.90.*" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server", - "raven/raven": "Allow sending log messages to a Sentry server", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7.x-dev" - } - }, - "autoload": { - "psr-0": { - "Monolog": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be", - "role": "Developer" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "time": "2014-01-17 14:16:06" - }, - { - "name": "psr/log", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "a78d6504ff5d4367497785ab2ade91db3a9fbe11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/a78d6504ff5d4367497785ab2ade91db3a9fbe11", - "reference": "a78d6504ff5d4367497785ab2ade91db3a9fbe11", - "shasum": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Psr\\Log\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2014-01-18 15:33:09" - }, - { - "name": "react/promise", - "version": "1.0.x-dev", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "d6de8cae1dbb4878d909c41cb89aff764504472c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/d6de8cae1dbb4878d909c41cb89aff764504472c", - "reference": "d6de8cae1dbb4878d909c41cb89aff764504472c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "React\\Promise": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@googlemail.com", - "homepage": "http://sorgalla.com", - "role": "maintainer" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "time": "2013-04-03 14:05:55" - }, - { - "name": "react/react", - "version": "0.3.x-dev", - "source": { - "type": "git", - "url": "https://github.com/reactphp/react.git", - "reference": "0dac387e29f10db50dc23acc1da746f53862a662" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/react/zipball/0dac387e29f10db50dc23acc1da746f53862a662", - "reference": "0dac387e29f10db50dc23acc1da746f53862a662", - "shasum": "" - }, - "require": { - "evenement/evenement": "1.0.*", - "guzzle/parser": "~3.0", - "php": ">=5.3.3", - "react/promise": "~1.0" - }, - "replace": { - "react/cache": "self.version", - "react/dns": "self.version", - "react/event-loop": "self.version", - "react/http": "self.version", - "react/http-client": "self.version", - "react/socket": "self.version", - "react/socket-client": "self.version", - "react/stream": "self.version" - }, - "suggest": { - "ext-libev": "*", - "ext-libevent": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - }, - "autoload": { - "psr-0": { - "React": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Nuclear Reactor written in PHP.", - "keywords": [ - "event-loop", - "reactor" - ], - "time": "2013-09-22 12:33:29" - }, - { - "name": "symfony/event-dispatcher", - "version": "dev-master", - "target-dir": "Symfony/Component/EventDispatcher", - "source": { - "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "8f680ceb1eaec6f5f2404bea5c1c2af516a68494" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/8f680ceb1eaec6f5f2404bea5c1c2af516a68494", - "reference": "8f680ceb1eaec6f5f2404bea5c1c2af516a68494", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/dependency-injection": "~2.0", - "symfony/stopwatch": "~2.2" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "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 EventDispatcher Component", - "homepage": "http://symfony.com", - "time": "2014-02-04 11:21:37" - }, - { - "name": "symfony/http-foundation", - "version": "dev-master", - "target-dir": "Symfony/Component/HttpFoundation", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "70ab340b31615dbf95727cb2246c784f04da837d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/70ab340b31615dbf95727cb2246c784f04da837d", - "reference": "70ab340b31615dbf95727cb2246c784f04da837d", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "classmap": [ - "Symfony/Component/HttpFoundation/Resources/stubs" - ] - }, - "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 HttpFoundation Component", - "homepage": "http://symfony.com", - "time": "2014-02-03 17:15:42" - }, - { - "name": "symfony/routing", - "version": "dev-master", - "target-dir": "Symfony/Component/Routing", - "source": { - "type": "git", - "url": "https://github.com/symfony/Routing.git", - "reference": "de78561327de0ed8b463b9c2a9d23f775720d01d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/de78561327de0ed8b463b9c2a9d23f775720d01d", - "reference": "de78561327de0ed8b463b9c2a9d23f775720d01d", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "psr/log": "~1.0", - "symfony/config": "~2.2", - "symfony/expression-language": "~2.4", - "symfony/yaml": "~2.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "autoload": { - "psr-0": { - "Symfony\\Component\\Routing\\": "" - } - }, - "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 Routing Component", - "homepage": "http://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "time": "2014-02-03 11:24:19" - }, - { - "name": "tavendo/AutobahnJS", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/tavendo/AutobahnJS.git", - "reference": "v0.6.0" - }, - "type": "library", - "time": "2012-03-21 17:30:31" - } - ], - "packages-dev": [ - - ], - "aliases": [ - - ], - "minimum-stability": "dev", - "stability-flags": { - "monolog/monolog": 20, - "cujojs/when": 20, - "tavendo/autobahnjs": 20, - "gimite/web-socket-js": 20 - }, - "platform": { - "php": ">=5.3.3" - }, - "platform-dev": [ - - ] -} diff --git a/app/Vendor/Ratchet/vendor/autoload.php b/app/Vendor/Ratchet/vendor/autoload.php deleted file mode 100644 index 8652c87372..0000000000 --- a/app/Vendor/Ratchet/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - Ratchet\Http\Router - * BC: Decoupled HTTP from WebSocket component -> Ratchet\Http\HttpServer - * BF: Single sub-protocol selection to conform with RFC6455 - * BF: Sanity checks on WAMP protocol to prevent errors - -* 0.2.8 (2013-09-19) - - * React 0.3 support - -* 0.2.7 (2013-06-09) - - * BF: Sub-protocol negotation with Guzzle 3.6 - -* 0.2.6 (2013-06-01) - - * Guzzle 3.6 support - -* 0.2.5 (2013-04-01) - - * Fixed Hixie-76 handshake bug - -* 0.2.4 (2013-03-09) - - * Support for Symfony 2.2 and Guzzle 2.3 - * Minor bug fixes when handling errors - -* 0.2.3 (2012-11-21) - - * Bumped dep: Guzzle to v3, React to v0.2.4 - * More tests - -* 0.2.2 (2012-10-20) - - * Bumped deps to use React v0.2 - -* 0.2.1 (2012-10-13) - - * BF: No more UTF-8 warnings in browsers (no longer sending empty sub-protocol string) - * Documentation corrections - * Using new composer structure - -* 0.2 (2012-09-07) - - * Ratchet passes every non-binary-frame test from the Autobahn Testsuite - * Major performance improvements - * BC: Renamed "WampServer" to "ServerProtocol" - * BC: New "WampServer" component passes Topic container objects of subscribed Connections - * Option to turn off UTF-8 checks in order to increase performance - * Switched dependency guzzle/guzzle to guzzle/http (no API changes) - * mbstring no longer required - -* 0.1.5 (2012-07-12) - - * BF: Error where service wouldn't run on PHP <= 5.3.8 - * Dependency library updates - -* 0.1.4 (2012-06-17) - - * Fixed dozens of failing AB tests - * BF: Proper socket buffer handling - -* 0.1.3 (2012-06-15) - - * Major refactor inside WebSocket protocol handling, more loosley coupled - * BF: Proper error handling on failed WebSocket connections - * BF: Handle TCP message concatenation - * Inclusion of the AutobahnTestSuite checking WebSocket protocol compliance - * mb_string now a requirement - -* 0.1.2 (2012-05-19) - - * BC/BF: Updated WAMP API to coincide with the official spec - * Tweaks to improve running as a long lived process - -* 0.1.1 (2012-05-14) - - * Separated interfaces allowing WebSockets to support multiple sub protocols - * BF: remoteAddress variable on connections returns proper value - -* 0.1 (2012-05-11) - - * First release with components: IoServer, WsServer, SessionProvider, WampServer, FlashPolicy, IpBlackList - * I/O now handled by React, making Ratchet fully asynchronous \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/LICENSE b/app/Vendor/Ratchet/vendor/cboden/ratchet/LICENSE deleted file mode 100644 index 66857ea5b2..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2014 Chris Boden - -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/app/Vendor/Ratchet/vendor/cboden/ratchet/Makefile b/app/Vendor/Ratchet/vendor/cboden/ratchet/Makefile deleted file mode 100644 index 9bd90f0d4a..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# This file is intended to ease the author's development and testing process -# Users do not need to use `make`; Ratchet does not need to be compiled - -test: - phpunit - -cover: - phpunit --coverage-text --coverage-html=reports/coverage - -abtests: - ulimit -n 2048 && php tests/autobahn/bin/fuzzingserver.php 8001 LibEvent & - ulimit -n 2048 && php tests/autobahn/bin/fuzzingserver.php 8002 StreamSelect & - ulimit -n 2048 && php tests/autobahn/bin/fuzzingserver-noutf8.php 8003 StreamSelect & - ulimit -n 2048 && php tests/autobahn/bin/fuzzingserver.php 8004 LibEv & - wstest -m testeeserver -w ws://localhost:8000 & - wstest -m fuzzingclient -s tests/autobahn/fuzzingclient-all.json - killall php wstest - -abtest: - ulimit -n 2048 && php tests/autobahn/bin/fuzzingserver.php 8000 StreamSelect & - wstest -m fuzzingclient -s tests/autobahn/fuzzingclient-quick.json - killall php - -profile: - php -d 'xdebug.profiler_enable=1' tests/autobahn/bin/fuzzingserver.php 8000 LibEvent & - wstest -m fuzzingclient -s tests/autobahn/fuzzingclient-profile.json - killall php - -apidocs: - apigen --title Ratchet -d reports/api -s src/ \ - -s vendor/react \ - -s vendor/guzzle \ - -s vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session \ - -s vendor/symfony/routing/Symfony/Component/Routing \ - -s vendor/evenement/evenement/src/Evenement diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/README.md b/app/Vendor/Ratchet/vendor/cboden/ratchet/README.md deleted file mode 100644 index a86317338a..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/README.md +++ /dev/null @@ -1,90 +0,0 @@ -#Ratchet - -[![Build Status](https://secure.travis-ci.org/cboden/Ratchet.png?branch=master)](http://travis-ci.org/cboden/Ratchet) -[![Latest Stable Version](https://poser.pugx.org/cboden/Ratchet/v/stable.png)](https://packagist.org/packages/cboden/Ratchet) - -A PHP 5.3 library for asynchronously serving WebSockets. -Build up your application through simple interfaces and re-use your application without changing any of its code just by combining different components. - -##WebSocket Compliance - -* Supports the RFC6455, HyBi-10+, and Hixie76 protocol versions (at the same time) -* Tested on Chrome 13 - 31, Firefox 6 - 26, Safari 5.0.1 - 6.1, iOS 4.2 - 7 -* Ratchet [passes](http://socketo.me/reports/ab/) the [Autobahn Testsuite](http://autobahn.ws/testsuite) (non-binary messages) - -##Requirements - -Shell access is required and root access is recommended. -To avoid proxy/firewall blockage it's recommended WebSockets are requested on port 80 or 443 (SSL), which requires root access. -In order to do this, along with your sync web stack, you can either use a reverse proxy or two separate machines. -You can find more details in the [server conf docs](http://socketo.me/docs/deploy#serverconfiguration). - -PHP 5.3.9 (or higher) is required. If you have access, PHP 5.4 is *highly* recommended for its performance improvements. - -### Documentation - -User and API documentation is available on Ratchet's website: http://socketo.me - -See https://github.com/cboden/Ratchet-examples for some out-of-the-box working demos using Ratchet. - -Need help? Have a question? Want to provide feedback? Write a message on the [Google Groups Mailing List](https://groups.google.com/forum/#!forum/ratchet-php). - ---- - -###A quick example - -```php -clients = new \SplObjectStorage; - } - - public function onOpen(ConnectionInterface $conn) { - $this->clients->attach($conn); - } - - public function onMessage(ConnectionInterface $from, $msg) { - foreach ($this->clients as $client) { - if ($from != $client) { - $client->send($msg); - } - } - } - - public function onClose(ConnectionInterface $conn) { - $this->clients->detach($conn); - } - - public function onError(ConnectionInterface $conn, \Exception $e) { - $conn->close(); - } -} - - // Run the server application through the WebSocket protocol on port 8080 - $app = new Ratchet\App('localhost', 8080); - $app->route('/chat', new MyChat); - $app->route('/echo', new Ratchet\Server\EchoServer, array('*')); - $app->run(); -``` - - $ php chat.php - -```javascript - // Then some JavaScript in the browser: - var conn = new WebSocket('ws://localhost:8080/echo'); - conn.onmessage = function(e) { console.log(e.data); }; - conn.send('Hello Me!'); -``` \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/composer.json b/app/Vendor/Ratchet/vendor/cboden/ratchet/composer.json deleted file mode 100644 index 82796a8805..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/composer.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "cboden/Ratchet" - , "type": "library" - , "description": "PHP WebSocket library" - , "keywords": ["WebSockets", "Server", "Ratchet", "Sockets"] - , "homepage": "http://socketo.me" - , "repository": "https://github.com/cboden/Ratchet" - , "license": "MIT" - , "authors": [ - { - "name": "Chris Boden" - , "email": "cboden@gmail.com" - , "role": "Developer" - } - ] - , "support": { - "forum": "https://groups.google.com/forum/#!forum/ratchet-php" - , "issues": "https://github.com/cboden/Ratchet/issues" - , "irc": "irc://irc.freenode.org/reactphp" - } - , "autoload": { - "psr-0": { - "Ratchet": "src" - } - } - , "require": { - "php": ">=5.3.9" - , "react/socket": ">=0.3.0,<0.5-dev" - , "guzzle/http": ">=3.6.0,<3.9.0-dev" - , "symfony/http-foundation": "~2.2" - , "symfony/routing": "~2.2" - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/phpunit.xml.dist b/app/Vendor/Ratchet/vendor/cboden/ratchet/phpunit.xml.dist deleted file mode 100644 index 0cc5451bf2..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/phpunit.xml.dist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - ./tests/unit/ - - - - - - ./tests/integration/ - - - - - - ./src/ - - - \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/AbstractConnectionDecorator.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/AbstractConnectionDecorator.php deleted file mode 100644 index 8db272a6cc..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/AbstractConnectionDecorator.php +++ /dev/null @@ -1,41 +0,0 @@ -wrappedConn = $conn; - } - - /** - * @return ConnectionInterface - */ - protected function getConnection() { - return $this->wrappedConn; - } - - public function __set($name, $value) { - $this->wrappedConn->$name = $value; - } - - public function __get($name) { - return $this->wrappedConn->$name; - } - - public function __isset($name) { - return isset($this->wrappedConn->$name); - } - - public function __unset($name) { - unset($this->wrappedConn->$name); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/App.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/App.php deleted file mode 100644 index 0b151b034b..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/App.php +++ /dev/null @@ -1,127 +0,0 @@ -httpHost = $httpHost; - - $socket = new Reactor($loop); - $socket->listen($port, $address); - - $this->routes = new RouteCollection; - $this->_server = new IoServer(new HttpServer(new Router(new UrlMatcher($this->routes, new RequestContext))), $socket, $loop); - - $policy = new FlashPolicy; - $policy->addAllowedAccess($httpHost, 80); - $policy->addAllowedAccess($httpHost, $port); - $flashSock = new Reactor($loop); - $this->flashServer = new IoServer($policy, $flashSock); - - if (80 == $port) { - $flashSock->listen(843, '0.0.0.0'); - } else { - $flashSock->listen(8843); - } - } - - /** - * Add an endpiont/application to the server - * @param string $path The URI the client will connect to - * @param ComponentInterface $controller Your application to server for the route. If not specified, assumed to be for a WebSocket - * @param array $allowedOrigins An array of hosts allowed to connect (same host by default), ['*'] for any - * @param string $httpHost Override the $httpHost variable provided in the __construct - * @return ComponentInterface|WsServer - */ - public function route($path, ComponentInterface $controller, array $allowedOrigins = array(), $httpHost = null) { - if ($controller instanceof HttpServerInterface || $controller instanceof WsServer) { - $decorated = $controller; - } elseif ($controller instanceof WampServerInterface) { - $decorated = new WsServer(new WampServer($controller)); - } elseif ($controller instanceof MessageComponentInterface) { - $decorated = new WsServer($controller); - } else { - $decorated = $controller; - } - - $httpHost = $httpHost ?: $this->httpHost; - - $allowedOrigins = array_values($allowedOrigins); - if (0 === count($allowedOrigins)) { - $allowedOrigins[] = $httpHost; - } - if ('*' !== $allowedOrigins[0]) { - $decorated = new OriginCheck($decorated, $allowedOrigins); - } - - $this->routes->add('rr-' . ++$this->_routeCounter, new Route($path, array('_controller' => $decorated), array('Origin' => $this->httpHost), array(), $httpHost)); - - return $decorated; - } - - /** - * Run the server by entering the event loop - */ - public function run() { - $this->_server->run(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/ComponentInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/ComponentInterface.php deleted file mode 100644 index 35a9fcb7db..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/ComponentInterface.php +++ /dev/null @@ -1,31 +0,0 @@ -entityEnclosingRequestClass; - $request = new $c($method, $url, $headers); - $request->setBody(EntityBody::factory($body)); - - return $request; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpRequestParser.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpRequestParser.php deleted file mode 100644 index 5e5dd91fb2..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpRequestParser.php +++ /dev/null @@ -1,56 +0,0 @@ -httpBuffer)) { - $context->httpBuffer = ''; - } - - $context->httpBuffer .= $data; - - if (strlen($context->httpBuffer) > (int)$this->maxSize) { - throw new \OverflowException("Maximum buffer size of {$this->maxSize} exceeded parsing HTTP header"); - } - - if ($this->isEom($context->httpBuffer)) { - $request = RequestFactory::getInstance()->fromMessage($context->httpBuffer); - - unset($context->httpBuffer); - - return $request; - } - } - - /** - * Determine if the message has been buffered as per the HTTP specification - * @param string $message - * @return boolean - */ - public function isEom($message) { - return (boolean)strpos($message, static::EOM); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServer.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServer.php deleted file mode 100644 index f1b8f69f33..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServer.php +++ /dev/null @@ -1,90 +0,0 @@ -_httpServer = $component; - $this->_reqParser = new HttpRequestParser; - } - - /** - * {@inheritdoc} - */ - public function onOpen(ConnectionInterface $conn) { - $conn->httpHeadersReceived = false; - } - - /** - * {@inheritdoc} - */ - public function onMessage(ConnectionInterface $from, $msg) { - if (true !== $from->httpHeadersReceived) { - try { - if (null === ($request = $this->_reqParser->onMessage($from, $msg))) { - return; - } - } catch (\OverflowException $oe) { - return $this->close($from, 413); - } - - $from->httpHeadersReceived = true; - - return $this->_httpServer->onOpen($from, $request); - } - - $this->_httpServer->onMessage($from, $msg); - } - - /** - * {@inheritdoc} - */ - public function onClose(ConnectionInterface $conn) { - if ($conn->httpHeadersReceived) { - $this->_httpServer->onClose($conn); - } - } - - /** - * {@inheritdoc} - */ - public function onError(ConnectionInterface $conn, \Exception $e) { - if ($conn->httpHeadersReceived) { - $this->_httpServer->onError($conn, $e); - } else { - $this->close($conn, 500); - } - } - - /** - * Close a connection with an HTTP response - * @param \Ratchet\ConnectionInterface $conn - * @param int $code HTTP status code - * @return null - */ - protected function close(ConnectionInterface $conn, $code = 400) { - $response = new Response($code, array( - 'X-Powered-By' => \Ratchet\VERSION - )); - - $conn->send((string)$response); - $conn->close(); - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServerInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServerInterface.php deleted file mode 100644 index 79b7d55877..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/HttpServerInterface.php +++ /dev/null @@ -1,14 +0,0 @@ -_component = $component; - $this->allowedOrigins += $allowed; - } - - /** - * {@inheritdoc} - */ - public function onOpen(ConnectionInterface $conn, RequestInterface $request = null) { - $header = (string)$request->getHeader('Origin'); - $origin = parse_url($header, PHP_URL_HOST) ?: $header; - - if (!in_array($origin, $this->allowedOrigins)) { - return $this->close($conn, 403); - } - - return $this->_component->onOpen($conn, $request); - } - - /** - * {@inheritdoc} - */ - function onMessage(ConnectionInterface $from, $msg) { - return $this->_component->onMessage($from, $msg); - } - - /** - * {@inheritdoc} - */ - function onClose(ConnectionInterface $conn) { - return $this->_component->onClose($conn); - } - - /** - * {@inheritdoc} - */ - function onError(ConnectionInterface $conn, \Exception $e) { - return $this->_component->onError($conn, $e); - } - - /** - * Close a connection with an HTTP response - * @param \Ratchet\ConnectionInterface $conn - * @param int $code HTTP status code - * @return null - */ - protected function close(ConnectionInterface $conn, $code = 400) { - $response = new Response($code, array( - 'X-Powered-By' => \Ratchet\VERSION - )); - - $conn->send((string)$response); - $conn->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/Router.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/Router.php deleted file mode 100644 index 8e6611e210..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Http/Router.php +++ /dev/null @@ -1,92 +0,0 @@ -_matcher = $matcher; - } - - /** - * {@inheritdoc} - * @throws \UnexpectedValueException If a controller is not \Ratchet\Http\HttpServerInterface - */ - public function onOpen(ConnectionInterface $conn, RequestInterface $request = null) { - if (null === $request) { - throw new \UnexpectedValueException('$request can not be null'); - } - - $context = $this->_matcher->getContext(); - $context->setMethod($request->getMethod()); - $context->setHost($request->getHost()); - - try { - $route = $this->_matcher->match($request->getPath()); - } catch (MethodNotAllowedException $nae) { - return $this->close($conn, 403); - } catch (ResourceNotFoundException $nfe) { - return $this->close($conn, 404); - } - - if (is_string($route['_controller']) && class_exists($route['_controller'])) { - $route['_controller'] = new $route['_controller']; - } - - if (!($route['_controller'] instanceof HttpServerInterface)) { - throw new \UnexpectedValueException('All routes must implement Ratchet\Http\HttpServerInterface'); - } - - $conn->controller = $route['_controller']; - $conn->controller->onOpen($conn, $request); - } - - /** - * {@inheritdoc} - */ - function onMessage(ConnectionInterface $from, $msg) { - $from->controller->onMessage($from, $msg); - } - - /** - * {@inheritdoc} - */ - function onClose(ConnectionInterface $conn) { - if (isset($conn->controller)) { - $conn->controller->onClose($conn); - } - } - - /** - * {@inheritdoc} - */ - function onError(ConnectionInterface $conn, \Exception $e) { - if (isset($conn->controller)) { - $conn->controller->onError($conn, $e); - } - } - - /** - * Close a connection with an HTTP response - * @param \Ratchet\ConnectionInterface $conn - * @param int $code HTTP status code - * @return null - */ - protected function close(ConnectionInterface $conn, $code = 400) { - $response = new Response($code, array( - 'X-Powered-By' => \Ratchet\VERSION - )); - - $conn->send((string)$response); - $conn->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/MessageComponentInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/MessageComponentInterface.php deleted file mode 100644 index ee99547460..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/MessageComponentInterface.php +++ /dev/null @@ -1,5 +0,0 @@ -send($msg); - } - - public function onClose(ConnectionInterface $conn) { - } - - public function onError(ConnectionInterface $conn, \Exception $e) { - $conn->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/FlashPolicy.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/FlashPolicy.php deleted file mode 100644 index f0ee26f1d6..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/FlashPolicy.php +++ /dev/null @@ -1,188 +0,0 @@ -'; - - /** - * Stores an array of allowed domains and their ports - * @var array - */ - protected $_access = array(); - - /** - * @var string - */ - protected $_siteControl = ''; - - /** - * @var string - */ - protected $_cache = ''; - - /** - * @var string - */ - protected $_cacheValid = false; - - /** - * Add a domain to an allowed access list. - * - * @param string $domain Specifies a requesting domain to be granted access. Both named domains and IP - * addresses are acceptable values. Subdomains are considered different domains. A wildcard (*) can - * be used to match all domains when used alone, or multiple domains (subdomains) when used as a - * prefix for an explicit, second-level domain name separated with a dot (.) - * @param string $ports A comma-separated list of ports or range of ports that a socket connection - * is allowed to connect to. A range of ports is specified through a dash (-) between two port numbers. - * Ranges can be used with individual ports when separated with a comma. A single wildcard (*) can - * be used to allow all ports. - * @param bool $secure - * @throws \UnexpectedValueException - * @return FlashPolicy - */ - public function addAllowedAccess($domain, $ports = '*', $secure = false) { - if (!$this->validateDomain($domain)) { - throw new \UnexpectedValueException('Invalid domain'); - } - - if (!$this->validatePorts($ports)) { - throw new \UnexpectedValueException('Invalid Port'); - } - - $this->_access[] = array($domain, $ports, (boolean)$secure); - $this->_cacheValid = false; - - return $this; - } - - /** - * site-control defines the meta-policy for the current domain. A meta-policy specifies acceptable - * domain policy files other than the master policy file located in the target domain's root and named - * crossdomain.xml. - * - * @param string $permittedCrossDomainPolicies - * @throws \UnexpectedValueException - * @return FlashPolicy - */ - public function setSiteControl($permittedCrossDomainPolicies = 'all') { - if (!$this->validateSiteControl($permittedCrossDomainPolicies)) { - throw new \UnexpectedValueException('Invalid site control set'); - } - - $this->_siteControl = $permittedCrossDomainPolicies; - $this->_cacheValid = false; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function onOpen(ConnectionInterface $conn) { - } - - /** - * {@inheritdoc} - */ - public function onMessage(ConnectionInterface $from, $msg) { - if (!$this->_cacheValid) { - $this->_cache = $this->renderPolicy()->asXML(); - $this->_cacheValid = true; - } - - $from->send($this->_cache . "\0"); - $from->close(); - } - - /** - * {@inheritdoc} - */ - public function onClose(ConnectionInterface $conn) { - } - - /** - * {@inheritdoc} - */ - public function onError(ConnectionInterface $conn, \Exception $e) { - $conn->close(); - } - - /** - * Builds the crossdomain file based on the template policy - * - * @throws \UnexpectedValueException - * @return \SimpleXMLElement - */ - public function renderPolicy() { - $policy = new \SimpleXMLElement($this->_policy); - - $siteControl = $policy->addChild('site-control'); - - if ($this->_siteControl == '') { - $this->setSiteControl(); - } - - $siteControl->addAttribute('permitted-cross-domain-policies', $this->_siteControl); - - if (empty($this->_access)) { - throw new \UnexpectedValueException('You must add a domain through addAllowedAccess()'); - } - - foreach ($this->_access as $access) { - $tmp = $policy->addChild('allow-access-from'); - $tmp->addAttribute('domain', $access[0]); - $tmp->addAttribute('to-ports', $access[1]); - $tmp->addAttribute('secure', ($access[2] === true) ? 'true' : 'false'); - } - - return $policy; - } - - /** - * Make sure the proper site control was passed - * - * @param string $permittedCrossDomainPolicies - * @return bool - */ - public function validateSiteControl($permittedCrossDomainPolicies) { - //'by-content-type' and 'by-ftp-filename' are not available for sockets - return (bool)in_array($permittedCrossDomainPolicies, array('none', 'master-only', 'all')); - } - - /** - * Validate for proper domains (wildcards allowed) - * - * @param string $domain - * @return bool - */ - public function validateDomain($domain) { - return (bool)preg_match("/^((http(s)?:\/\/)?([a-z0-9-_]+\.|\*\.)*([a-z0-9-_\.]+)|\*)$/i", $domain); - } - - /** - * Make sure valid ports were passed - * - * @param string $port - * @return bool - */ - public function validatePorts($port) { - return (bool)preg_match('/^(\*|(\d+[,-]?)*\d+)$/', $port); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoConnection.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoConnection.php deleted file mode 100644 index 0bc63a9c0f..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoConnection.php +++ /dev/null @@ -1,38 +0,0 @@ -conn = $conn; - } - - /** - * {@inheritdoc} - */ - public function send($data) { - $this->conn->write($data); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function close() { - $this->conn->end(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php deleted file mode 100644 index b27ee93144..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IoServer.php +++ /dev/null @@ -1,134 +0,0 @@ -loop = $loop; - $this->app = $app; - - $socket->on('connection', array($this, 'handleConnect')); - - $this->handlers = new \SplFixedArray(3); - $this->handlers[0] = array($this, 'handleData'); - $this->handlers[1] = array($this, 'handleEnd'); - $this->handlers[2] = array($this, 'handleError'); - } - - /** - * @param \Ratchet\MessageComponentInterface $component The application that I/O will call when events are received - * @param int $port The port to server sockets on - * @param string $address The address to receive sockets on (0.0.0.0 means receive connections from any) - * @return IoServer - */ - public static function factory(MessageComponentInterface $component, $port = 80, $address = '0.0.0.0') { - $loop = LoopFactory::create(); - $socket = new Reactor($loop); - $socket->listen($port, $address); - - return new static($component, $socket, $loop); - } - - /** - * Run the application by entering the event loop - * @throws \RuntimeException If a loop was not previously specified - */ - public function run() { - if (null === $this->loop) { - throw new \RuntimeException("A React Loop was not provided during instantiation"); - } - - // @codeCoverageIgnoreStart - $this->loop->run(); - // @codeCoverageIgnoreEnd - } - - /** - * Triggered when a new connection is received from React - * @param \React\Socket\ConnectionInterface $conn - */ - public function handleConnect($conn) { - $conn->decor = new IoConnection($conn); - - $conn->decor->resourceId = (int)$conn->stream; - $conn->decor->remoteAddress = $conn->getRemoteAddress(); - - $this->app->onOpen($conn->decor); - - $conn->on('data', $this->handlers[0]); - $conn->on('end', $this->handlers[1]); - $conn->on('error', $this->handlers[2]); - } - - /** - * Data has been received from React - * @param string $data - * @param \React\Socket\ConnectionInterface $conn - */ - public function handleData($data, $conn) { - try { - $this->app->onMessage($conn->decor, $data); - } catch (\Exception $e) { - $this->handleError($e, $conn); - } - } - - /** - * A connection has been closed by React - * @param \React\Socket\ConnectionInterface $conn - */ - public function handleEnd($conn) { - try { - $this->app->onClose($conn->decor); - } catch (\Exception $e) { - $this->handleError($e, $conn); - } - - unset($conn->decor); - } - - /** - * An error has occurred, let the listening application know - * @param \Exception $e - * @param \React\Socket\ConnectionInterface $conn - */ - public function handleError(\Exception $e, $conn) { - $this->app->onError($conn->decor, $e); - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IpBlackList.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IpBlackList.php deleted file mode 100644 index e4ed24eb5b..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Server/IpBlackList.php +++ /dev/null @@ -1,111 +0,0 @@ -_decorating = $component; - } - - /** - * Add an address to the blacklist that will not be allowed to connect to your application - * @param string $ip IP address to block from connecting to your application - * @return IpBlackList - */ - public function blockAddress($ip) { - $this->_blacklist[$ip] = true; - - return $this; - } - - /** - * Unblock an address so they can access your application again - * @param string $ip IP address to unblock from connecting to your application - * @return IpBlackList - */ - public function unblockAddress($ip) { - if (isset($this->_blacklist[$this->filterAddress($ip)])) { - unset($this->_blacklist[$this->filterAddress($ip)]); - } - - return $this; - } - - /** - * @param string $address - * @return bool - */ - public function isBlocked($address) { - return (isset($this->_blacklist[$this->filterAddress($address)])); - } - - /** - * Get an array of all the addresses blocked - * @return array - */ - public function getBlockedAddresses() { - return array_keys($this->_blacklist); - } - - /** - * @param string $address - * @return string - */ - public function filterAddress($address) { - if (strstr($address, ':') && substr_count($address, '.') == 3) { - list($address, $port) = explode(':', $address); - } - - return $address; - } - - /** - * {@inheritdoc} - */ - function onOpen(ConnectionInterface $conn) { - if ($this->isBlocked($conn->remoteAddress)) { - return $conn->close(); - } - - return $this->_decorating->onOpen($conn); - } - - /** - * {@inheritdoc} - */ - function onMessage(ConnectionInterface $from, $msg) { - return $this->_decorating->onMessage($from, $msg); - } - - /** - * {@inheritdoc} - */ - function onClose(ConnectionInterface $conn) { - if (!$this->isBlocked($conn->remoteAddress)) { - $this->_decorating->onClose($conn); - } - } - - /** - * {@inheritdoc} - */ - function onError(ConnectionInterface $conn, \Exception $e) { - if (!$this->isBlocked($conn->remoteAddress)) { - $this->_decorating->onError($conn, $e); - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Serialize/HandlerInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Serialize/HandlerInterface.php deleted file mode 100644 index f1c7c0c2ee..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Serialize/HandlerInterface.php +++ /dev/null @@ -1,16 +0,0 @@ -_app = $app; - $this->_handler = $handler; - $this->_null = new NullSessionHandler; - - ini_set('session.auto_start', 0); - ini_set('session.cache_limiter', ''); - ini_set('session.use_cookies', 0); - - $this->setOptions($options); - - if (null === $serializer) { - $serialClass = __NAMESPACE__ . "\\Serialize\\{$this->toClassCase(ini_get('session.serialize_handler'))}Handler"; // awesome/terrible hack, eh? - if (!class_exists($serialClass)) { - throw new \RuntimeException('Unable to parse session serialize handler'); - } - - $serializer = new $serialClass; - } - - $this->_serializer = $serializer; - } - - /** - * {@inheritdoc} - */ - function onOpen(ConnectionInterface $conn) { - if (!isset($conn->WebSocket) || null === ($id = $conn->WebSocket->request->getCookie(ini_get('session.name')))) { - $saveHandler = $this->_null; - $id = ''; - } else { - $saveHandler = $this->_handler; - } - - $conn->Session = new Session(new VirtualSessionStorage($saveHandler, $id, $this->_serializer)); - - if (ini_get('session.auto_start')) { - $conn->Session->start(); - } - - return $this->_app->onOpen($conn); - } - - /** - * {@inheritdoc} - */ - function onMessage(ConnectionInterface $from, $msg) { - return $this->_app->onMessage($from, $msg); - } - - /** - * {@inheritdoc} - */ - function onClose(ConnectionInterface $conn) { - // "close" session for Connection - - return $this->_app->onClose($conn); - } - - /** - * {@inheritdoc} - */ - function onError(ConnectionInterface $conn, \Exception $e) { - return $this->_app->onError($conn, $e); - } - - /** - * {@inheritdoc} - */ - public function getSubProtocols() { - if ($this->_app instanceof WsServerInterface) { - return $this->_app->getSubProtocols(); - } else { - return array(); - } - } - - /** - * Set all the php session. ini options - * © Symfony - * @param array $options - * @return array - */ - protected function setOptions(array $options) { - $all = array( - 'auto_start', 'cache_limiter', 'cookie_domain', 'cookie_httponly', - 'cookie_lifetime', 'cookie_path', 'cookie_secure', - 'entropy_file', 'entropy_length', 'gc_divisor', - 'gc_maxlifetime', 'gc_probability', 'hash_bits_per_character', - 'hash_function', 'name', 'referer_check', - 'serialize_handler', 'use_cookies', - 'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled', - 'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name', - 'upload_progress.freq', 'upload_progress.min-freq', 'url_rewriter.tags' - ); - - foreach ($all as $key) { - if (!array_key_exists($key, $options)) { - $options[$key] = ini_get("session.{$key}"); - } else { - ini_set("session.{$key}", $options[$key]); - } - } - - return $options; - } - - /** - * @param string $langDef Input to convert - * @return string - */ - protected function toClassCase($langDef) { - return str_replace(' ', '', ucwords(str_replace('_', ' ', $langDef))); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/Proxy/VirtualProxy.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/Proxy/VirtualProxy.php deleted file mode 100644 index a549d4ec6c..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/Proxy/VirtualProxy.php +++ /dev/null @@ -1,54 +0,0 @@ -saveHandlerName = 'user'; - $this->_sessionName = ini_get('session.name'); - } - - /** - * {@inheritdoc} - */ - public function getId() { - return $this->_sessionId; - } - - /** - * {@inheritdoc} - */ - public function setId($id) { - $this->_sessionId = $id; - } - - /** - * {@inheritdoc} - */ - public function getName() { - return $this->_sessionName; - } - - /** - * DO NOT CALL THIS METHOD - * @internal - */ - public function setName($name) { - throw new \RuntimeException("Can not change session name in VirtualProxy"); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/VirtualSessionStorage.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/VirtualSessionStorage.php deleted file mode 100644 index dc16388c0f..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Session/Storage/VirtualSessionStorage.php +++ /dev/null @@ -1,82 +0,0 @@ -setSaveHandler($handler); - $this->saveHandler->setId($sessionId); - $this->_serializer = $serializer; - $this->setMetadataBag(null); - } - - /** - * {@inheritdoc} - */ - public function start() { - if ($this->started && !$this->closed) { - return true; - } - - $rawData = $this->saveHandler->read($this->saveHandler->getId()); - $sessionData = $this->_serializer->unserialize($rawData); - - $this->loadSession($sessionData); - - if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) { - $this->saveHandler->setActive(false); - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function regenerate($destroy = false, $lifetime = null) { - // .. ? - } - - /** - * {@inheritdoc} - */ - public function save() { - // get the data from the bags? - // serialize the data - // save the data using the saveHandler -// $this->saveHandler->write($this->saveHandler->getId(), - - if (!$this->saveHandler->isWrapper() && !$this->getSaveHandler()->isSessionHandlerInterface()) { - $this->saveHandler->setActive(false); - } - - $this->closed = true; - } - - /** - * {@inheritdoc} - */ - public function setSaveHandler($saveHandler = null) { - if (!($saveHandler instanceof \SessionHandlerInterface)) { - throw new \InvalidArgumentException('Handler must be instance of SessionHandlerInterface'); - } - - if (!($saveHandler instanceof VirtualProxy)) { - $saveHandler = new VirtualProxy($saveHandler); - } - - $this->saveHandler = $saveHandler; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Exception.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Exception.php deleted file mode 100644 index 9b0ca24104..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Exception.php +++ /dev/null @@ -1,5 +0,0 @@ -_decorating = $serverComponent; - $this->connections = new \SplObjectStorage; - } - - /** - * {@inheritdoc} - */ - public function getSubProtocols() { - if ($this->_decorating instanceof WsServerInterface) { - $subs = $this->_decorating->getSubProtocols(); - $subs[] = 'wamp'; - - return $subs; - } else { - return array('wamp'); - } - } - - /** - * {@inheritdoc} - */ - public function onOpen(ConnectionInterface $conn) { - $decor = new WampConnection($conn); - $this->connections->attach($conn, $decor); - - $this->_decorating->onOpen($decor); - } - - /** - * {@inheritdoc} - * @throws \Exception - * @throws JsonException - */ - public function onMessage(ConnectionInterface $from, $msg) { - $from = $this->connections[$from]; - - if (null === ($json = @json_decode($msg, true))) { - throw new JsonException; - } - - if (!is_array($json) || $json !== array_values($json)) { - throw new \UnexpectedValueException("Invalid WAMP message format"); - } - - switch ($json[0]) { - case static::MSG_PREFIX: - $from->WAMP->prefixes[$json[1]] = $json[2]; - break; - - case static::MSG_CALL: - array_shift($json); - $callID = array_shift($json); - $procURI = array_shift($json); - - if (count($json) == 1 && is_array($json[0])) { - $json = $json[0]; - } - - $this->_decorating->onCall($from, $callID, $procURI, $json); - break; - - case static::MSG_SUBSCRIBE: - $this->_decorating->onSubscribe($from, $from->getUri($json[1])); - break; - - case static::MSG_UNSUBSCRIBE: - $this->_decorating->onUnSubscribe($from, $from->getUri($json[1])); - break; - - case static::MSG_PUBLISH: - $exclude = (array_key_exists(3, $json) ? $json[3] : null); - if (!is_array($exclude)) { - if (true === (boolean)$exclude) { - $exclude = array($from->WAMP->sessionId); - } else { - $exclude = array(); - } - } - - $eligible = (array_key_exists(4, $json) ? $json[4] : array()); - - $this->_decorating->onPublish($from, $from->getUri($json[1]), $json[2], $exclude, $eligible); - break; - - default: - throw new Exception('Invalid message type'); - } - } - - /** - * {@inheritdoc} - */ - public function onClose(ConnectionInterface $conn) { - $decor = $this->connections[$conn]; - $this->connections->detach($conn); - - $this->_decorating->onClose($decor); - } - - /** - * {@inheritdoc} - */ - public function onError(ConnectionInterface $conn, \Exception $e) { - return $this->_decorating->onError($this->connections[$conn], $e); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Topic.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Topic.php deleted file mode 100644 index 688195a5ea..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/Topic.php +++ /dev/null @@ -1,88 +0,0 @@ -id = $topicId; - $this->subscribers = new \SplObjectStorage; - } - - /** - * @return string - */ - public function getId() { - return $this->id; - } - - public function __toString() { - return $this->getId(); - } - - /** - * Send a message to all the connections in this topic - * @param string $msg - * @return Topic - */ - public function broadcast($msg) { - foreach ($this->subscribers as $client) { - $client->event($this->id, $msg); - } - - return $this; - } - - /** - * @param WampConnection $conn - * @return boolean - */ - public function has(ConnectionInterface $conn) { - return $this->subscribers->contains($conn); - } - - /** - * @param WampConnection $conn - * @return Topic - */ - public function add(ConnectionInterface $conn) { - $this->subscribers->attach($conn); - - return $this; - } - - /** - * @param WampConnection $conn - * @return Topic - */ - public function remove(ConnectionInterface $conn) { - if ($this->subscribers->contains($conn)) { - $this->subscribers->detach($conn); - } - - return $this; - } - - /** - * {@inheritdoc} - */ - public function getIterator() { - return $this->subscribers; - } - - /** - * {@inheritdoc} - */ - public function count() { - return $this->subscribers->count(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/TopicManager.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/TopicManager.php deleted file mode 100644 index 602079155d..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/TopicManager.php +++ /dev/null @@ -1,114 +0,0 @@ -app = $app; - } - - /** - * {@inheritdoc} - */ - public function onOpen(ConnectionInterface $conn) { - $conn->WAMP->subscriptions = new \SplObjectStorage; - $this->app->onOpen($conn); - } - - /** - * {@inheritdoc} - */ - public function onCall(ConnectionInterface $conn, $id, $topic, array $params) { - $this->app->onCall($conn, $id, $this->getTopic($topic), $params); - } - - /** - * {@inheritdoc} - */ - public function onSubscribe(ConnectionInterface $conn, $topic) { - $topicObj = $this->getTopic($topic); - - if ($conn->WAMP->subscriptions->contains($topicObj)) { - return; - } - - $this->topicLookup[$topic]->add($conn); - $conn->WAMP->subscriptions->attach($topicObj); - $this->app->onSubscribe($conn, $topicObj); - } - - /** - * {@inheritdoc} - */ - public function onUnsubscribe(ConnectionInterface $conn, $topic) { - $topicObj = $this->getTopic($topic); - - if ($conn->WAMP->subscriptions->contains($topicObj)) { - $conn->WAMP->subscriptions->detach($topicObj); - } else { - return; - } - - $this->topicLookup[$topic]->remove($conn); - $this->app->onUnsubscribe($conn, $topicObj); - } - - /** - * {@inheritdoc} - */ - public function onPublish(ConnectionInterface $conn, $topic, $event, array $exclude, array $eligible) { - $this->app->onPublish($conn, $this->getTopic($topic), $event, $exclude, $eligible); - } - - /** - * {@inheritdoc} - */ - public function onClose(ConnectionInterface $conn) { - $this->app->onClose($conn); - - foreach ($this->topicLookup as $topic) { - $topic->remove($conn); - } - } - - /** - * {@inheritdoc} - */ - public function onError(ConnectionInterface $conn, \Exception $e) { - $this->app->onError($conn, $e); - } - - /** - * {@inheritdoc} - */ - public function getSubProtocols() { - if ($this->app instanceof WsServerInterface) { - return $this->app->getSubProtocols(); - } - - return array(); - } - - /** - * @param string - * @return Topic - */ - protected function getTopic($topic) { - if (!array_key_exists($topic, $this->topicLookup)) { - $this->topicLookup[$topic] = new Topic($topic); - } - - return $this->topicLookup[$topic]; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampConnection.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampConnection.php deleted file mode 100644 index de13844bc9..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampConnection.php +++ /dev/null @@ -1,102 +0,0 @@ -WAMP = new \StdClass; - $this->WAMP->sessionId = uniqid(); - $this->WAMP->prefixes = array(); - - $this->send(json_encode(array(WAMP::MSG_WELCOME, $this->WAMP->sessionId, 1, \Ratchet\VERSION))); - } - - /** - * Successfully respond to a call made by the client - * @param string $id The unique ID given by the client to respond to - * @param array $data An array of data to return to the client - * @return WampConnection - */ - public function callResult($id, array $data = array()) { - return $this->send(json_encode(array(WAMP::MSG_CALL_RESULT, $id, $data))); - } - - /** - * Respond with an error to a client call - * @param string $id The unique ID given by the client to respond to - * @param string $errorUri The URI given to identify the specific error - * @param string $desc A developer-oriented description of the error - * @param string $details An optional human readable detail message to send back - * @return WampConnection - */ - public function callError($id, $errorUri, $desc = '', $details = null) { - if ($errorUri instanceof Topic) { - $errorUri = (string)$errorUri; - } - - $data = array(WAMP::MSG_CALL_ERROR, $id, $errorUri, $desc); - - if (null !== $details) { - $data[] = $details; - } - - return $this->send(json_encode($data)); - } - - /** - * @param string $topic The topic to broadcast to - * @param mixed $msg Data to send with the event. Anything that is json'able - * @return WampConnection - */ - public function event($topic, $msg) { - return $this->send(json_encode(array(WAMP::MSG_EVENT, (string)$topic, $msg))); - } - - /** - * @param string $curie - * @param string $uri - * @return WampConnection - */ - public function prefix($curie, $uri) { - $this->WAMP->prefixes[$curie] = (string)$uri; - - return $this->send(json_encode(array(WAMP::MSG_PREFIX, $curie, (string)$uri))); - } - - /** - * Get the full request URI from the connection object if a prefix has been established for it - * @param string $uri - * @return string - */ - public function getUri($uri) { - return (array_key_exists($uri, $this->WAMP->prefixes) ? $this->WAMP->prefixes[$uri] : $uri); - } - - /** - * @internal - */ - public function send($data) { - $this->getConnection()->send($data); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function close($opt = null) { - $this->getConnection()->close($opt); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServer.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServer.php deleted file mode 100644 index 9e7951f511..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServer.php +++ /dev/null @@ -1,69 +0,0 @@ -wampProtocol = new ServerProtocol(new TopicManager($app)); - } - - /** - * {@inheritdoc} - */ - public function onOpen(ConnectionInterface $conn) { - $this->wampProtocol->onOpen($conn); - } - - /** - * {@inheritdoc} - */ - public function onMessage(ConnectionInterface $conn, $msg) { - try { - $this->wampProtocol->onMessage($conn, $msg); - } catch (JsonException $je) { - $conn->close(1007); - } catch (\UnexpectedValueException $uve) { - $conn->close(1007); - } - } - - /** - * {@inheritdoc} - */ - public function onClose(ConnectionInterface $conn) { - $this->wampProtocol->onClose($conn); - } - - /** - * {@inheritdoc} - */ - public function onError(ConnectionInterface $conn, \Exception $e) { - $this->wampProtocol->onError($conn, $e); - } - - /** - * {@inheritdoc} - */ - public function getSubProtocols() { - return $this->wampProtocol->getSubProtocols(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServerInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServerInterface.php deleted file mode 100644 index bef93b1612..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/Wamp/WampServerInterface.php +++ /dev/null @@ -1,43 +0,0 @@ -validator = new Validator; - $this->on = (boolean)$on; - } - - /** - * {@inheritdoc} - */ - public function checkEncoding($str, $encoding) { - if (!(boolean)$this->on) { - return true; - } - - return $this->validator->checkEncoding($str, $encoding); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/Validator.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/Validator.php deleted file mode 100644 index 0dc8a24356..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/Validator.php +++ /dev/null @@ -1,93 +0,0 @@ -hasMbString = extension_loaded('mbstring'); - $this->hasIconv = extension_loaded('iconv'); - } - - /** - * @param string $str The value to check the encoding - * @param string $against The type of encoding to check against - * @return bool - */ - public function checkEncoding($str, $against) { - if ('UTF-8' == $against) { - return $this->isUtf8($str); - } - - if ($this->hasMbString) { - return mb_check_encoding($str, $against); - } elseif ($this->hasIconv) { - return ($str == iconv($against, "{$against}//IGNORE", $str)); - } - - return true; - } - - protected function isUtf8($str) { - if ($this->hasMbString) { - if (false === mb_check_encoding($str, 'UTF-8')) { - return false; - } - } elseif ($this->hasIconv) { - if ($str != iconv('UTF-8', 'UTF-8//IGNORE', $str)) { - return false; - } - } - - $state = static::UTF8_ACCEPT; - - for ($i = 0, $len = strlen($str); $i < $len; $i++) { - $state = static::$dfa[256 + ($state << 4) + static::$dfa[ord($str[$i])]]; - - if (static::UTF8_REJECT === $state) { - return false; - } - } - - return true; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/ValidatorInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/ValidatorInterface.php deleted file mode 100644 index c5769e839a..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Encoding/ValidatorInterface.php +++ /dev/null @@ -1,12 +0,0 @@ -getHeader('Sec-WebSocket-Key2')); - } - - /** - * {@inheritdoc} - */ - public function getVersionNumber() { - return 0; - } - - /** - * @param \Guzzle\Http\Message\RequestInterface $request - * @return \Guzzle\Http\Message\Response - * @throws \UnderflowException If there hasn't been enough data received - */ - public function handshake(RequestInterface $request) { - $body = substr($request->getBody(), 0, 8); - if (8 !== strlen($body)) { - throw new \UnderflowException("Not enough data received to issue challenge response"); - } - - $challenge = $this->sign((string)$request->getHeader('Sec-WebSocket-Key1'), (string)$request->getHeader('Sec-WebSocket-Key2'), $body); - - $headers = array( - 'Upgrade' => 'WebSocket' - , 'Connection' => 'Upgrade' - , 'Sec-WebSocket-Origin' => (string)$request->getHeader('Origin') - , 'Sec-WebSocket-Location' => 'ws://' . (string)$request->getHeader('Host') . $request->getPath() - ); - - $response = new Response(101, $headers, $challenge); - $response->setStatus(101, 'WebSocket Protocol Handshake'); - - return $response; - } - - /** - * {@inheritdoc} - */ - public function upgradeConnection(ConnectionInterface $conn, MessageInterface $coalescedCallback) { - $upgraded = new Connection($conn); - - if (!isset($upgraded->WebSocket)) { - $upgraded->WebSocket = new \StdClass; - } - - $upgraded->WebSocket->coalescedCallback = $coalescedCallback; - - return $upgraded; - } - - public function onMessage(ConnectionInterface $from, $data) { - $overflow = ''; - - if (!isset($from->WebSocket->frame)) { - $from->WebSocket->frame = $this->newFrame(); - } - - $from->WebSocket->frame->addBuffer($data); - if ($from->WebSocket->frame->isCoalesced()) { - $overflow = $from->WebSocket->frame->extractOverflow(); - - $parsed = $from->WebSocket->frame->getPayload(); - unset($from->WebSocket->frame); - - $from->WebSocket->coalescedCallback->onMessage($from, $parsed); - - unset($from->WebSocket->frame); - } - - if (strlen($overflow) > 0) { - $this->onMessage($from, $overflow); - } - } - - public function newFrame() { - return new Frame; - } - - public function generateKeyNumber($key) { - if (0 === substr_count($key, ' ')) { - return 0; - } - - return preg_replace('[\D]', '', $key) / substr_count($key, ' '); - } - - protected function sign($key1, $key2, $code) { - return md5( - pack('N', $this->generateKeyNumber($key1)) - . pack('N', $this->generateKeyNumber($key2)) - . $code - , true); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Connection.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Connection.php deleted file mode 100644 index 82053eb1b8..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Connection.php +++ /dev/null @@ -1,19 +0,0 @@ -getConnection()->send(chr(0) . $msg . chr(255)); - - return $this; - } - - public function close() { - $this->getConnection()->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Frame.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Frame.php deleted file mode 100644 index a1722074e8..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/Hixie76/Frame.php +++ /dev/null @@ -1,86 +0,0 @@ -_data[0] == chr(0) && substr($this->_data, -1) == chr(255)); - } - - /** - * {@inheritdoc} - */ - public function addBuffer($buf) { - $this->_data .= (string)$buf; - } - - /** - * {@inheritdoc} - */ - public function isFinal() { - return true; - } - - /** - * {@inheritdoc} - */ - public function isMasked() { - return false; - } - - /** - * {@inheritdoc} - */ - public function getOpcode() { - return 1; - } - - /** - * {@inheritdoc} - */ - public function getPayloadLength() { - if (!$this->isCoalesced()) { - throw new \UnderflowException('Not enough of the message has been buffered to determine the length of the payload'); - } - - return strlen($this->_data) - 2; - } - - /** - * {@inheritdoc} - */ - public function getMaskingKey() { - return ''; - } - - /** - * {@inheritdoc} - */ - public function getPayload() { - if (!$this->isCoalesced()) { - return new \UnderflowException('Not enough data buffered to read payload'); - } - - return substr($this->_data, 1, strlen($this->_data) - 2); - } - - public function getContents() { - return $this->_data; - } - - public function extractOverflow() { - return ''; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/HyBi10.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/HyBi10.php deleted file mode 100644 index 70329c611e..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/HyBi10.php +++ /dev/null @@ -1,15 +0,0 @@ -getHeader('Sec-WebSocket-Version'); - - return ($version >= 6 && $version < 13); - } - - public function getVersionNumber() { - return 6; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/MessageInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/MessageInterface.php deleted file mode 100644 index ff291634d8..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/MessageInterface.php +++ /dev/null @@ -1,15 +0,0 @@ -_verifier = new HandshakeVerifier; - $this->setCloseCodes(); - - if (null === $validator) { - $validator = new Validator; - } - - $this->validator = $validator; - } - - /** - * {@inheritdoc} - */ - public function isProtocol(RequestInterface $request) { - $version = (int)(string)$request->getHeader('Sec-WebSocket-Version'); - - return ($this->getVersionNumber() === $version); - } - - /** - * {@inheritdoc} - */ - public function getVersionNumber() { - return 13; - } - - /** - * {@inheritdoc} - */ - public function handshake(RequestInterface $request) { - if (true !== $this->_verifier->verifyAll($request)) { - return new Response(400); - } - - return new Response(101, array( - 'Upgrade' => 'websocket' - , 'Connection' => 'Upgrade' - , 'Sec-WebSocket-Accept' => $this->sign((string)$request->getHeader('Sec-WebSocket-Key')) - )); - } - - /** - * @param \Ratchet\ConnectionInterface $conn - * @param \Ratchet\MessageInterface $coalescedCallback - * @return \Ratchet\WebSocket\Version\RFC6455\Connection - */ - public function upgradeConnection(ConnectionInterface $conn, MessageInterface $coalescedCallback) { - $upgraded = new Connection($conn); - - if (!isset($upgraded->WebSocket)) { - $upgraded->WebSocket = new \StdClass; - } - - $upgraded->WebSocket->coalescedCallback = $coalescedCallback; - - return $upgraded; - } - - /** - * @param \Ratchet\WebSocket\Version\RFC6455\Connection $from - * @param string $data - */ - public function onMessage(ConnectionInterface $from, $data) { - $overflow = ''; - - if (!isset($from->WebSocket->message)) { - $from->WebSocket->message = $this->newMessage(); - } - - // There is a frame fragment attached to the connection, add to it - if (!isset($from->WebSocket->frame)) { - $from->WebSocket->frame = $this->newFrame(); - } - - $from->WebSocket->frame->addBuffer($data); - if ($from->WebSocket->frame->isCoalesced()) { - $frame = $from->WebSocket->frame; - - if (false !== $frame->getRsv1() || - false !== $frame->getRsv2() || - false !== $frame->getRsv3() - ) { - return $from->close($frame::CLOSE_PROTOCOL); - } - - if (!$frame->isMasked()) { - return $from->close($frame::CLOSE_PROTOCOL); - } - - $opcode = $frame->getOpcode(); - - if ($opcode > 2) { - if ($frame->getPayloadLength() > 125 || !$frame->isFinal()) { - return $from->close($frame::CLOSE_PROTOCOL); - } - - switch ($opcode) { - case $frame::OP_CLOSE: - $closeCode = 0; - - $bin = $frame->getPayload(); - - if (empty($bin)) { - return $from->close(); - } - - if (strlen($bin) >= 2) { - list($closeCode) = array_merge(unpack('n*', substr($bin, 0, 2))); - } - - if (!$this->isValidCloseCode($closeCode)) { - return $from->close($frame::CLOSE_PROTOCOL); - } - - if (!$this->validator->checkEncoding(substr($bin, 2), 'UTF-8')) { - return $from->close($frame::CLOSE_BAD_PAYLOAD); - } - - return $from->close($frame); - break; - case $frame::OP_PING: - $from->send($this->newFrame($frame->getPayload(), true, $frame::OP_PONG)); - break; - case $frame::OP_PONG: - break; - default: - return $from->close($frame::CLOSE_PROTOCOL); - break; - } - - $overflow = $from->WebSocket->frame->extractOverflow(); - - unset($from->WebSocket->frame, $frame, $opcode); - - if (strlen($overflow) > 0) { - $this->onMessage($from, $overflow); - } - - return; - } - - $overflow = $from->WebSocket->frame->extractOverflow(); - - if ($frame::OP_CONTINUE == $frame->getOpcode() && 0 == count($from->WebSocket->message)) { - return $from->close($frame::CLOSE_PROTOCOL); - } - - if (count($from->WebSocket->message) > 0 && $frame::OP_CONTINUE != $frame->getOpcode()) { - return $from->close($frame::CLOSE_PROTOCOL); - } - - $from->WebSocket->message->addFrame($from->WebSocket->frame); - unset($from->WebSocket->frame); - } - - if ($from->WebSocket->message->isCoalesced()) { - $parsed = $from->WebSocket->message->getPayload(); - unset($from->WebSocket->message); - - if (!$this->validator->checkEncoding($parsed, 'UTF-8')) { - return $from->close(Frame::CLOSE_BAD_PAYLOAD); - } - - $from->WebSocket->coalescedCallback->onMessage($from, $parsed); - } - - if (strlen($overflow) > 0) { - $this->onMessage($from, $overflow); - } - } - - /** - * @return RFC6455\Message - */ - public function newMessage() { - return new Message; - } - - /** - * @param string|null $payload - * @param bool|null $final - * @param int|null $opcode - * @return RFC6455\Frame - */ - public function newFrame($payload = null, $final = null, $opcode = null) { - return new Frame($payload, $final, $opcode); - } - - /** - * Used when doing the handshake to encode the key, verifying client/server are speaking the same language - * @param string $key - * @return string - * @internal - */ - public function sign($key) { - return base64_encode(sha1($key . static::GUID, true)); - } - - /** - * Determine if a close code is valid - * @param int|string - * @return bool - */ - public function isValidCloseCode($val) { - if (array_key_exists($val, $this->closeCodes)) { - return true; - } - - if ($val >= 3000 && $val <= 4999) { - return true; - } - - return false; - } - - /** - * Creates a private lookup of valid, private close codes - */ - protected function setCloseCodes() { - $this->closeCodes[Frame::CLOSE_NORMAL] = true; - $this->closeCodes[Frame::CLOSE_GOING_AWAY] = true; - $this->closeCodes[Frame::CLOSE_PROTOCOL] = true; - $this->closeCodes[Frame::CLOSE_BAD_DATA] = true; - //$this->closeCodes[Frame::CLOSE_NO_STATUS] = true; - //$this->closeCodes[Frame::CLOSE_ABNORMAL] = true; - $this->closeCodes[Frame::CLOSE_BAD_PAYLOAD] = true; - $this->closeCodes[Frame::CLOSE_POLICY] = true; - $this->closeCodes[Frame::CLOSE_TOO_BIG] = true; - $this->closeCodes[Frame::CLOSE_MAND_EXT] = true; - $this->closeCodes[Frame::CLOSE_SRV_ERR] = true; - //$this->closeCodes[Frame::CLOSE_TLS] = true; - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Connection.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Connection.php deleted file mode 100644 index 2d89493d24..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Connection.php +++ /dev/null @@ -1,33 +0,0 @@ -getConnection()->send($msg->getContents()); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function close($code = 1000) { - if ($code instanceof DataInterface) { - $this->send($code); - } else { - $this->send(new Frame(pack('n', $code), true, Frame::OP_CLOSE)); - } - - $this->getConnection()->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Frame.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Frame.php deleted file mode 100644 index 146bd06f4a..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Frame.php +++ /dev/null @@ -1,450 +0,0 @@ -defPayLen = strlen($payload); - $this->firstByte = ($final ? 128 : 0) + $opcode; - $this->secondByte = $this->defPayLen; - $this->isCoalesced = true; - - $ext = ''; - if ($this->defPayLen > 65535) { - $ext = pack('NN', 0, $this->defPayLen); - $this->secondByte = 127; - } elseif ($this->defPayLen > 125) { - $ext = pack('n', $this->defPayLen); - $this->secondByte = 126; - } - - $this->data = chr($this->firstByte) . chr($this->secondByte) . $ext . $payload; - $this->bytesRecvd = 2 + strlen($ext) + $this->defPayLen; - } - - /** - * {@inheritdoc} - */ - public function isCoalesced() { - if (true === $this->isCoalesced) { - return true; - } - - try { - $payload_length = $this->getPayloadLength(); - $payload_start = $this->getPayloadStartingByte(); - } catch (\UnderflowException $e) { - return false; - } - - $this->isCoalesced = $this->bytesRecvd >= $payload_length + $payload_start; - - return $this->isCoalesced; - } - - /** - * {@inheritdoc} - */ - public function addBuffer($buf) { - $len = strlen($buf); - - $this->data .= $buf; - $this->bytesRecvd += $len; - - if ($this->firstByte === -1 && $this->bytesRecvd !== 0) { - $this->firstByte = ord($this->data[0]); - } - - if ($this->secondByte === -1 && $this->bytesRecvd >= 2) { - $this->secondByte = ord($this->data[1]); - } - } - - /** - * {@inheritdoc} - */ - public function isFinal() { - if (-1 === $this->firstByte) { - throw new \UnderflowException('Not enough bytes received to determine if this is the final frame in message'); - } - - return 128 === ($this->firstByte & 128); - } - - /** - * @return boolean - * @throws \UnderflowException - */ - public function getRsv1() { - if (-1 === $this->firstByte) { - throw new \UnderflowException('Not enough bytes received to determine reserved bit'); - } - - return 64 === ($this->firstByte & 64); - } - - /** - * @return boolean - * @throws \UnderflowException - */ - public function getRsv2() { - if (-1 === $this->firstByte) { - throw new \UnderflowException('Not enough bytes received to determine reserved bit'); - } - - return 32 === ($this->firstByte & 32); - } - - /** - * @return boolean - * @throws \UnderflowException - */ - public function getRsv3() { - if (-1 === $this->firstByte) { - throw new \UnderflowException('Not enough bytes received to determine reserved bit'); - } - - return 16 == ($this->firstByte & 16); - } - - /** - * {@inheritdoc} - */ - public function isMasked() { - if (-1 === $this->secondByte) { - throw new \UnderflowException("Not enough bytes received ({$this->bytesRecvd}) to determine if mask is set"); - } - - return 128 === ($this->secondByte & 128); - } - - /** - * {@inheritdoc} - */ - public function getMaskingKey() { - if (!$this->isMasked()) { - return ''; - } - - $start = 1 + $this->getNumPayloadBytes(); - - if ($this->bytesRecvd < $start + static::MASK_LENGTH) { - throw new \UnderflowException('Not enough data buffered to calculate the masking key'); - } - - return substr($this->data, $start, static::MASK_LENGTH); - } - - /** - * Create a 4 byte masking key - * @return string - */ - public function generateMaskingKey() { - $mask = ''; - - for ($i = 1; $i <= static::MASK_LENGTH; $i++) { - $mask .= chr(rand(32, 126)); - } - - return $mask; - } - - /** - * Apply a mask to the payload - * @param string|null If NULL is passed a masking key will be generated - * @throws \OutOfBoundsException - * @throws \InvalidArgumentException If there is an issue with the given masking key - * @return Frame - */ - public function maskPayload($maskingKey = null) { - if (null === $maskingKey) { - $maskingKey = $this->generateMaskingKey(); - } - - if (static::MASK_LENGTH !== strlen($maskingKey)) { - throw new \InvalidArgumentException("Masking key must be " . static::MASK_LENGTH ." characters"); - } - - if (extension_loaded('mbstring') && true !== mb_check_encoding($maskingKey, 'US-ASCII')) { - throw new \OutOfBoundsException("Masking key MUST be ASCII"); - } - - $this->unMaskPayload(); - - $this->secondByte = $this->secondByte | 128; - $this->data[1] = chr($this->secondByte); - - $this->data = substr_replace($this->data, $maskingKey, $this->getNumPayloadBytes() + 1, 0); - - $this->bytesRecvd += static::MASK_LENGTH; - $this->data = substr_replace($this->data, $this->applyMask($maskingKey), $this->getPayloadStartingByte(), $this->getPayloadLength()); - - return $this; - } - - /** - * Remove a mask from the payload - * @throws \UnderFlowException If the frame is not coalesced - * @return Frame - */ - public function unMaskPayload() { - if (!$this->isCoalesced()) { - throw new \UnderflowException('Frame must be coalesced before applying mask'); - } - - if (!$this->isMasked()) { - return $this; - } - - $maskingKey = $this->getMaskingKey(); - - $this->secondByte = $this->secondByte & ~128; - $this->data[1] = chr($this->secondByte); - - $this->data = substr_replace($this->data, '', $this->getNumPayloadBytes() + 1, static::MASK_LENGTH); - - $this->bytesRecvd -= static::MASK_LENGTH; - $this->data = substr_replace($this->data, $this->applyMask($maskingKey), $this->getPayloadStartingByte(), $this->getPayloadLength()); - - return $this; - } - - /** - * Apply a mask to a string or the payload of the instance - * @param string $maskingKey The 4 character masking key to be applied - * @param string|null $payload A string to mask or null to use the payload - * @throws \UnderflowException If using the payload but enough hasn't been buffered - * @return string The masked string - */ - public function applyMask($maskingKey, $payload = null) { - if (null === $payload) { - if (!$this->isCoalesced()) { - throw new \UnderflowException('Frame must be coalesced to apply a mask'); - } - - $payload = substr($this->data, $this->getPayloadStartingByte(), $this->getPayloadLength()); - } - - $applied = ''; - for ($i = 0, $len = strlen($payload); $i < $len; $i++) { - $applied .= $payload[$i] ^ $maskingKey[$i % static::MASK_LENGTH]; - } - - return $applied; - } - - /** - * {@inheritdoc} - */ - public function getOpcode() { - if (-1 === $this->firstByte) { - throw new \UnderflowException('Not enough bytes received to determine opcode'); - } - - return ($this->firstByte & ~240); - } - - /** - * Gets the decimal value of bits 9 (10th) through 15 inclusive - * @return int - * @throws \UnderflowException If the buffer doesn't have enough data to determine this - */ - protected function getFirstPayloadVal() { - if (-1 === $this->secondByte) { - throw new \UnderflowException('Not enough bytes received'); - } - - return $this->secondByte & 127; - } - - /** - * @return int (7|23|71) Number of bits defined for the payload length in the fame - * @throws \UnderflowException - */ - protected function getNumPayloadBits() { - if (-1 === $this->secondByte) { - throw new \UnderflowException('Not enough bytes received'); - } - - // By default 7 bits are used to describe the payload length - // These are bits 9 (10th) through 15 inclusive - $bits = 7; - - // Get the value of those bits - $check = $this->getFirstPayloadVal(); - - // If the value is 126 the 7 bits plus the next 16 are used to describe the payload length - if ($check >= 126) { - $bits += 16; - } - - // If the value of the initial payload length are is 127 an additional 48 bits are used to describe length - // Note: The documentation specifies the length is to be 63 bits, but I think that's a typo and is 64 (16+48) - if ($check === 127) { - $bits += 48; - } - - return $bits; - } - - /** - * This just returns the number of bytes used in the frame to describe the payload length (as opposed to # of bits) - * @see getNumPayloadBits - */ - protected function getNumPayloadBytes() { - return (1 + $this->getNumPayloadBits()) / 8; - } - - /** - * {@inheritdoc} - */ - public function getPayloadLength() { - if ($this->defPayLen !== -1) { - return $this->defPayLen; - } - - $this->defPayLen = $this->getFirstPayloadVal(); - if ($this->defPayLen <= 125) { - return $this->getPayloadLength(); - } - - $byte_length = $this->getNumPayloadBytes(); - if ($this->bytesRecvd < 1 + $byte_length) { - throw new \UnderflowException('Not enough data buffered to determine payload length'); - } - - $len = 0; - for ($i = 2; $i <= $byte_length; $i++) { - $len <<= 8; - $len += ord($this->data[$i]); - } - - $this->defPayLen = $len; - - return $this->getPayloadLength(); - } - - /** - * {@inheritdoc} - */ - public function getPayloadStartingByte() { - return 1 + $this->getNumPayloadBytes() + ($this->isMasked() ? static::MASK_LENGTH : 0); - } - - /** - * {@inheritdoc} - * @todo Consider not checking mask, always returning the payload, masked or not - */ - public function getPayload() { - if (!$this->isCoalesced()) { - throw new \UnderflowException('Can not return partial message'); - } - - $payload = substr($this->data, $this->getPayloadStartingByte(), $this->getPayloadLength()); - - if ($this->isMasked()) { - $payload = $this->applyMask($this->getMaskingKey(), $payload); - } - - return $payload; - } - - /** - * Get the raw contents of the frame - * @todo This is untested, make sure the substr is right - trying to return the frame w/o the overflow - */ - public function getContents() { - return substr($this->data, 0, $this->getPayloadStartingByte() + $this->getPayloadLength()); - } - - /** - * Sometimes clients will concatenate more than one frame over the wire - * This method will take the extra bytes off the end and return them - * @todo Consider returning new Frame - * @return string - */ - public function extractOverflow() { - if ($this->isCoalesced()) { - $endPoint = $this->getPayloadLength(); - $endPoint += $this->getPayloadStartingByte(); - - if ($this->bytesRecvd > $endPoint) { - $overflow = substr($this->data, $endPoint); - $this->data = substr($this->data, 0, $endPoint); - - return $overflow; - } - } - - return ''; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/HandshakeVerifier.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/HandshakeVerifier.php deleted file mode 100644 index 41057cc2e1..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/HandshakeVerifier.php +++ /dev/null @@ -1,137 +0,0 @@ -verifyMethod($request->getMethod()); - $passes += (int)$this->verifyHTTPVersion($request->getProtocolVersion()); - $passes += (int)$this->verifyRequestURI($request->getPath()); - $passes += (int)$this->verifyHost((string)$request->getHeader('Host')); - $passes += (int)$this->verifyUpgradeRequest((string)$request->getHeader('Upgrade')); - $passes += (int)$this->verifyConnection((string)$request->getHeader('Connection')); - $passes += (int)$this->verifyKey((string)$request->getHeader('Sec-WebSocket-Key')); - //$passes += (int)$this->verifyVersion($headers['Sec-WebSocket-Version']); // Temporarily breaking functionality - - return (7 === $passes); - } - - /** - * Test the HTTP method. MUST be "GET" - * @param string - * @return bool - */ - public function verifyMethod($val) { - return ('get' === strtolower($val)); - } - - /** - * Test the HTTP version passed. MUST be 1.1 or greater - * @param string|int - * @return bool - */ - public function verifyHTTPVersion($val) { - return (1.1 <= (double)$val); - } - - /** - * @param string - * @return bool - */ - public function verifyRequestURI($val) { - if ($val[0] != '/') { - return false; - } - - if (false !== strstr($val, '#')) { - return false; - } - - if (!extension_loaded('mbstring')) { - return true; - } - - return mb_check_encoding($val, 'US-ASCII'); - } - - /** - * @param string|null - * @return bool - * @todo Find out if I can find the master socket, ensure the port is attached to header if not 80 or 443 - not sure if this is possible, as I tried to hide it - * @todo Once I fix HTTP::getHeaders just verify this isn't NULL or empty...or maybe need to verify it's a valid domain??? Or should it equal $_SERVER['HOST'] ? - */ - public function verifyHost($val) { - return (null !== $val); - } - - /** - * Verify the Upgrade request to WebSockets. - * @param string $val MUST equal "websocket" - * @return bool - */ - public function verifyUpgradeRequest($val) { - return ('websocket' === strtolower($val)); - } - - /** - * Verify the Connection header - * @param string $val MUST equal "Upgrade" - * @return bool - */ - public function verifyConnection($val) { - $val = strtolower($val); - - if ('upgrade' === $val) { - return true; - } - - $vals = explode(',', str_replace(', ', ',', $val)); - - return (false !== array_search('upgrade', $vals)); - } - - /** - * This function verifies the nonce is valid (64 big encoded, 16 bytes random string) - * @param string|null - * @return bool - * @todo The spec says we don't need to base64_decode - can I just check if the length is 24 and not decode? - * @todo Check the spec to see what the encoding of the key could be - */ - public function verifyKey($val) { - return (16 === strlen(base64_decode((string)$val))); - } - - /** - * Verify the version passed matches this RFC - * @param string|int MUST equal 13|"13" - * @return bool - * @todo Ran in to a problem here...I'm having HyBi use the RFC files, this breaks it! oops - */ - public function verifyVersion($val) { - return (13 === (int)$val); - } - - /** - * @todo Write logic for this method. See section 4.2.1.8 - */ - public function verifyProtocol($val) { - } - - /** - * @todo Write logic for this method. See section 4.2.1.9 - */ - public function verifyExtensions($val) { - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Message.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Message.php deleted file mode 100644 index fd200474c9..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/RFC6455/Message.php +++ /dev/null @@ -1,107 +0,0 @@ -_frames = new \SplDoublyLinkedList; - } - - /** - * {@inheritdoc} - */ - public function count() { - return count($this->_frames); - } - - /** - * {@inheritdoc} - */ - public function isCoalesced() { - if (count($this->_frames) == 0) { - return false; - } - - $last = $this->_frames->top(); - - return ($last->isCoalesced() && $last->isFinal()); - } - - /** - * {@inheritdoc} - * @todo Also, I should perhaps check the type...control frames (ping/pong/close) are not to be considered part of a message - */ - public function addFrame(FrameInterface $fragment) { - $this->_frames->push($fragment); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function getOpcode() { - if (count($this->_frames) == 0) { - throw new \UnderflowException('No frames have been added to this message'); - } - - return $this->_frames->bottom()->getOpcode(); - } - - /** - * {@inheritdoc} - */ - public function getPayloadLength() { - $len = 0; - - foreach ($this->_frames as $frame) { - try { - $len += $frame->getPayloadLength(); - } catch (\UnderflowException $e) { - // Not an error, want the current amount buffered - } - } - - return $len; - } - - /** - * {@inheritdoc} - */ - public function getPayload() { - if (!$this->isCoalesced()) { - throw new \UnderflowException('Message has not been put back together yet'); - } - - $buffer = ''; - - foreach ($this->_frames as $frame) { - $buffer .= $frame->getPayload(); - } - - return $buffer; - } - - /** - * {@inheritdoc} - */ - public function getContents() { - if (!$this->isCoalesced()) { - throw new \UnderflowException("Message has not been put back together yet"); - } - - $buffer = ''; - - foreach ($this->_frames as $frame) { - $buffer .= $frame->getContents(); - } - - return $buffer; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/VersionInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/VersionInterface.php deleted file mode 100644 index ddc1170b59..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/Version/VersionInterface.php +++ /dev/null @@ -1,57 +0,0 @@ -versions as $version) { - if ($version->isProtocol($request)) { - return $version; - } - } - - throw new \InvalidArgumentException("Version not found"); - } - - /** - * @param \Guzzle\Http\Message\RequestInterface - * @return bool - */ - public function isVersionEnabled(RequestInterface $request) { - foreach ($this->versions as $version) { - if ($version->isProtocol($request)) { - return true; - } - } - - return false; - } - - /** - * Enable support for a specific version of the WebSocket protocol - * @param \Ratchet\WebSocket\Version\VersionInterface $version - * @return VersionManager - */ - public function enableVersion(VersionInterface $version) { - $this->versions[$version->getVersionNumber()] = $version; - - if (empty($this->versionString)) { - $this->versionString = (string)$version->getVersionNumber(); - } else { - $this->versionString .= ", {$version->getVersionNumber()}"; - } - - return $this; - } - - /** - * Disable support for a specific WebSocket protocol version - * @param int $versionId The version ID to un-support - * @return VersionManager - */ - public function disableVersion($versionId) { - unset($this->versions[$versionId]); - - $this->versionString = implode(',', array_keys($this->versions)); - - return $this; - } - - /** - * Get a string of version numbers supported (comma delimited) - * @return string - */ - public function getSupportedVersionString() { - return $this->versionString; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServer.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServer.php deleted file mode 100644 index c76fd3f3f6..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServer.php +++ /dev/null @@ -1,227 +0,0 @@ -versioner = new VersionManager; - $this->validator = new ToggleableValidator; - - $this->versioner - ->enableVersion(new Version\RFC6455($this->validator)) - ->enableVersion(new Version\HyBi10($this->validator)) - ->enableVersion(new Version\Hixie76) - ; - - $this->component = $component; - $this->connections = new \SplObjectStorage; - } - - /** - * {@inheritdoc} - */ - public function onOpen(ConnectionInterface $conn, RequestInterface $request = null) { - if (null === $request) { - throw new \UnexpectedValueException('$request can not be null'); - } - - $conn->WebSocket = new \StdClass; - $conn->WebSocket->request = $request; - $conn->WebSocket->established = false; - - $this->attemptUpgrade($conn); - } - - /** - * {@inheritdoc} - */ - public function onMessage(ConnectionInterface $from, $msg) { - if (true === $from->WebSocket->established) { - return $from->WebSocket->version->onMessage($this->connections[$from], $msg); - } - - $this->attemptUpgrade($from, $msg); - } - - protected function attemptUpgrade(ConnectionInterface $conn, $data = '') { - if ('' !== $data) { - $conn->WebSocket->request->getBody()->write($data); - } else { - if (!$this->versioner->isVersionEnabled($conn->WebSocket->request)) { - return $this->close($conn); - } - - $conn->WebSocket->version = $this->versioner->getVersion($conn->WebSocket->request); - } - - try { - $response = $conn->WebSocket->version->handshake($conn->WebSocket->request); - } catch (\UnderflowException $e) { - return; - } - - if (null !== ($subHeader = $conn->WebSocket->request->getHeader('Sec-WebSocket-Protocol'))) { - if ('' !== ($agreedSubProtocols = $this->getSubProtocolString($subHeader->normalize()))) { - $response->setHeader('Sec-WebSocket-Protocol', $agreedSubProtocols); - } - } - - $response->setHeader('X-Powered-By', \Ratchet\VERSION); - $conn->send((string)$response); - - if (101 != $response->getStatusCode()) { - return $conn->close(); - } - - $upgraded = $conn->WebSocket->version->upgradeConnection($conn, $this->component); - - $this->connections->attach($conn, $upgraded); - - $upgraded->WebSocket->established = true; - - return $this->component->onOpen($upgraded); - } - - /** - * {@inheritdoc} - */ - public function onClose(ConnectionInterface $conn) { - if ($this->connections->contains($conn)) { - $decor = $this->connections[$conn]; - $this->connections->detach($conn); - - $this->component->onClose($decor); - } - } - - /** - * {@inheritdoc} - */ - public function onError(ConnectionInterface $conn, \Exception $e) { - if ($conn->WebSocket->established && $this->connections->contains($conn)) { - $this->component->onError($this->connections[$conn], $e); - } else { - $conn->close(); - } - } - - /** - * Disable a specific version of the WebSocket protocol - * @param int $versionId Version ID to disable - * @return WsServer - */ - public function disableVersion($versionId) { - $this->versioner->disableVersion($versionId); - - return $this; - } - - /** - * Toggle weather to check encoding of incoming messages - * @param bool - * @return WsServer - */ - public function setEncodingChecks($opt) { - $this->validator->on = (boolean)$opt; - - return $this; - } - - /** - * @param string - * @return boolean - */ - public function isSubProtocolSupported($name) { - if (!$this->isSpGenerated) { - if ($this->component instanceof WsServerInterface) { - $this->acceptedSubProtocols = array_flip($this->component->getSubProtocols()); - } - - $this->isSpGenerated = true; - } - - return array_key_exists($name, $this->acceptedSubProtocols); - } - - /** - * @param \Traversable|null $requested - * @return string - */ - protected function getSubProtocolString(\Traversable $requested = null) { - if (null !== $requested) { - foreach ($requested as $sub) { - if ($this->isSubProtocolSupported($sub)) { - return $sub; - } - } - } - - return ''; - } - - /** - * Close a connection with an HTTP response - * @param \Ratchet\ConnectionInterface $conn - * @param int $code HTTP status code - */ - protected function close(ConnectionInterface $conn, $code = 400) { - $response = new Response($code, array( - 'Sec-WebSocket-Version' => $this->versioner->getSupportedVersionString() - , 'X-Powered-By' => \Ratchet\VERSION - )); - - $conn->send((string)$response); - $conn->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServerInterface.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServerInterface.php deleted file mode 100644 index 24c7ab9143..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/src/Ratchet/WebSocket/WsServerInterface.php +++ /dev/null @@ -1,14 +0,0 @@ - 1 ? $argv[1] : 8000; - $impl = sprintf('React\EventLoop\%sLoop', $argc > 2 ? $argv[2] : 'StreamSelect'); - - $loop = new $impl; - $sock = new React\Socket\Server($loop); - $web = new Ratchet\WebSocket\WsServer(new Ratchet\Server\EchoServer); - $app = new Ratchet\Http\HttpServer($web); - $web->setEncodingChecks(false); - - $sock->listen($port, '0.0.0.0'); - - $server = new Ratchet\Server\IoServer($app, $sock, $loop); - $server->run(); diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/bin/fuzzingserver.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/bin/fuzzingserver.php deleted file mode 100644 index 093a5cf42f..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/bin/fuzzingserver.php +++ /dev/null @@ -1,15 +0,0 @@ - 1 ? $argv[1] : 8000; - $impl = sprintf('React\EventLoop\%sLoop', $argc > 2 ? $argv[2] : 'StreamSelect'); - - $loop = new $impl; - $sock = new React\Socket\Server($loop); - $app = new Ratchet\Http\HttpServer(new Ratchet\WebSocket\WsServer(new Ratchet\Server\EchoServer)); - - $sock->listen($port, '0.0.0.0'); - - $server = new Ratchet\Server\IoServer($app, $sock, $loop); - $server->run(); diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-all.json b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-all.json deleted file mode 100644 index dd9cddb575..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-all.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "options": {"failByDrop": false} - , "outdir": "reports/ab" - - , "servers": [ - {"agent": "Ratchet/0.3 libevent", "url": "ws://localhost:8001", "options": {"version": 18}} - , {"agent": "Ratchet/0.3 libev", "url": "ws://localhost:8004", "options": {"version": 18}} - , {"agent": "Ratchet/0.3 streams", "url": "ws://localhost:8002", "options": {"version": 18}} - , {"agent": "Ratchet/0.3 -utf8", "url": "ws://localhost:8003", "options": {"version": 18}} - , {"agent": "AutobahnTestSuite/0.5.9", "url": "ws://localhost:8000", "options": {"version": 18}} - ] - - , "cases": ["*"] - , "exclude-cases": ["1.2.*", "2.3", "2.4", "2.6", "9.2.*", "9.4.*", "9.6.*", "9.8.*"] - , "exclude-agent-cases": {} -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-profile.json b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-profile.json deleted file mode 100644 index e81a9fd4ec..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-profile.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "options": {"failByDrop": false} - , "outdir": "reports/profile" - - , "servers": [ - {"agent": "Ratchet", "url": "ws://localhost:8000", "options": {"version": 18}} - ] - - , "cases": ["9.7.4"] - , "exclude-cases": ["1.2.*", "2.3", "2.4", "2.6", "9.2.*", "9.4.*", "9.6.*", "9.8.*"] - , "exclude-agent-cases": {} -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-quick.json b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-quick.json deleted file mode 100644 index 3023fb8871..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/autobahn/fuzzingclient-quick.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "options": {"failByDrop": false} - , "outdir": "reports/rfc" - - , "servers": [ - {"agent": "Ratchet", "url": "ws://localhost:8000", "options": {"version": 18}} - ] - - , "cases": ["*"] - , "exclude-cases": ["1.2.*", "2.3", "2.4", "2.6", "9.2.*", "9.4.*", "9.6.*", "9.8.*"] - , "exclude-agent-cases": {} -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/bootstrap.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/bootstrap.php deleted file mode 100644 index 9d21c770d5..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/bootstrap.php +++ /dev/null @@ -1,5 +0,0 @@ -add('Ratchet', __DIR__ . '/helpers'); - $loader->register(); diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/AbstractMessageComponentTestCase.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/AbstractMessageComponentTestCase.php deleted file mode 100644 index 2ab458e026..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/AbstractMessageComponentTestCase.php +++ /dev/null @@ -1,50 +0,0 @@ -_app = $this->getMock($this->getComponentClassString()); - $decorator = $this->getDecoratorClassString(); - $this->_serv = new $decorator($this->_app); - $this->_conn = $this->getMock('\Ratchet\ConnectionInterface'); - - $this->doOpen($this->_conn); - } - - protected function doOpen($conn) { - $this->_serv->onOpen($conn); - } - - public function isExpectedConnection() { - return new \PHPUnit_Framework_Constraint_IsInstanceOf($this->getConnectionClassString()); - } - - public function testOpen() { - $this->_app->expects($this->once())->method('onOpen')->with($this->isExpectedConnection()); - $this->doOpen($this->getMock('\Ratchet\ConnectionInterface')); - } - - public function testOnClose() { - $this->_app->expects($this->once())->method('onClose')->with($this->isExpectedConnection()); - $this->_serv->onClose($this->_conn); - } - - public function testOnError() { - $e = new \Exception('Whoops!'); - $this->_app->expects($this->once())->method('onError')->with($this->isExpectedConnection(), $e); - $this->_serv->onError($this->_conn, $e); - } - - public function passthroughMessageTest($value) { - $this->_app->expects($this->once())->method('onMessage')->with($this->isExpectedConnection(), $value); - $this->_serv->onMessage($this->_conn, $value); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Component.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Component.php deleted file mode 100644 index d2ef27d30c..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Component.php +++ /dev/null @@ -1,35 +0,0 @@ -last[__FUNCTION__] = func_get_args(); - } - - public function onOpen(ConnectionInterface $conn) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onMessage(ConnectionInterface $from, $msg) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onClose(ConnectionInterface $conn) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onError(ConnectionInterface $conn, \Exception $e) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function getSubProtocols() { - return $this->protocols; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Connection.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Connection.php deleted file mode 100644 index 525487f9d3..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/Connection.php +++ /dev/null @@ -1,20 +0,0 @@ - '' - , 'close' => false - ); - - public $remoteAddress = '127.0.0.1'; - - public function send($data) { - $this->last[__FUNCTION__] = $data; - } - - public function close() { - $this->last[__FUNCTION__] = true; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/ConnectionDecorator.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/ConnectionDecorator.php deleted file mode 100644 index c8a0d17610..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/ConnectionDecorator.php +++ /dev/null @@ -1,22 +0,0 @@ - '' - , 'end' => false - ); - - public function send($data) { - $this->last[__FUNCTION__] = $data; - - $this->getConnection()->send($data); - } - - public function close() { - $this->last[__FUNCTION__] = true; - - $this->getConnection()->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/WampComponent.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/WampComponent.php deleted file mode 100644 index 87af27c760..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/Mock/WampComponent.php +++ /dev/null @@ -1,43 +0,0 @@ -protocols; - } - - public function onCall(ConnectionInterface $conn, $id, $procURI, array $params) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onSubscribe(ConnectionInterface $conn, $topic) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onUnSubscribe(ConnectionInterface $conn, $topic) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onPublish(ConnectionInterface $conn, $topic, $event, array $exclude, array $eligible) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onOpen(ConnectionInterface $conn) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onClose(ConnectionInterface $conn) { - $this->last[__FUNCTION__] = func_get_args(); - } - - public function onError(ConnectionInterface $conn, \Exception $e) { - $this->last[__FUNCTION__] = func_get_args(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/NullComponent.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/NullComponent.php deleted file mode 100644 index 43528306b6..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/helpers/Ratchet/NullComponent.php +++ /dev/null @@ -1,28 +0,0 @@ - 'websocket' - , 'Connection' => 'Upgrade' - , 'Host' => 'localhost:8080' - , 'Origin' => 'chrome://newtab' - , 'Sec-WebSocket-Protocol' => 'one, two, three' - , 'Sec-WebSocket-Key' => '9bnXNp3ae6FbFFRtPdiPXA==' - , 'Sec-WebSocket-Version' => '13' - ); - - public function setUp() { - $this->_request = new Request('GET', 'http://localhost', $this->_headers); - } - - public function testGetHeaderString() { - $this->assertEquals('Upgrade', (string)$this->_request->getHeader('connection')); - $this->assertEquals('9bnXNp3ae6FbFFRtPdiPXA==', (string)$this->_request->getHeader('Sec-Websocket-Key')); - } - - public function testGetHeaderInteger() { - $this->assertSame('13', (string)$this->_request->getHeader('Sec-Websocket-Version')); - $this->assertSame(13, (int)(string)$this->_request->getHeader('Sec-WebSocket-Version')); - } - - public function testGetHeaderObject() { - $this->assertInstanceOf('Guzzle\Http\Message\Header', $this->_request->getHeader('Origin')); - $this->assertNull($this->_request->getHeader('Non-existant-header')); - } - - public function testHeaderObjectNormalizeValues() { - $expected = 1 + substr_count($this->_headers['Sec-WebSocket-Protocol'], ','); - $protocols = $this->_request->getHeader('Sec-WebSocket-Protocol')->normalize(); - $count = 0; - - foreach ($protocols as $protocol) { - $count++; - } - - $this->assertEquals($expected, $count); - $this->assertEquals($expected, count($protocols)); - } - - public function testRequestFactoryCreateSignature() { - $ref = new \ReflectionMethod('Guzzle\Http\Message\RequestFactory', 'create'); - $this->assertEquals(2, $ref->getNumberOfRequiredParameters()); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/AbstractConnectionDecoratorTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/AbstractConnectionDecoratorTest.php deleted file mode 100644 index 905cce1d58..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/AbstractConnectionDecoratorTest.php +++ /dev/null @@ -1,147 +0,0 @@ -mock = $this->getMock('\Ratchet\ConnectionInterface'); - $this->l1 = new ConnectionDecorator($this->mock); - $this->l2 = new ConnectionDecorator($this->l1); - } - - public function testGet() { - $var = 'hello'; - $val = 'world'; - - $this->mock->$var = $val; - - $this->assertEquals($val, $this->l1->$var); - $this->assertEquals($val, $this->l2->$var); - } - - public function testSet() { - $var = 'Chris'; - $val = 'Boden'; - - $this->l1->$var = $val; - - $this->assertEquals($val, $this->mock->$var); - } - - public function testSetLevel2() { - $var = 'Try'; - $val = 'Again'; - - $this->l2->$var = $val; - - $this->assertEquals($val, $this->mock->$var); - } - - public function testIsSetTrue() { - $var = 'PHP'; - $val = 'Ratchet'; - - $this->mock->$var = $val; - - $this->assertTrue(isset($this->l1->$var)); - $this->assertTrue(isset($this->l2->$var)); - } - - public function testIsSetFalse() { - $var = 'herp'; - $val = 'derp'; - - $this->assertFalse(isset($this->l1->$var)); - $this->assertFalse(isset($this->l2->$var)); - } - - public function testUnset() { - $var = 'Flying'; - $val = 'Monkey'; - - $this->mock->$var = $val; - unset($this->l1->$var); - - $this->assertFalse(isset($this->mock->$var)); - } - - public function testUnsetLevel2() { - $var = 'Flying'; - $val = 'Monkey'; - - $this->mock->$var = $val; - unset($this->l2->$var); - - $this->assertFalse(isset($this->mock->$var)); - } - - public function testGetConnection() { - $class = new \ReflectionClass('\\Ratchet\\AbstractConnectionDecorator'); - $method = $class->getMethod('getConnection'); - $method->setAccessible(true); - - $conn = $method->invokeArgs($this->l1, array()); - - $this->assertSame($this->mock, $conn); - } - - public function testGetConnectionLevel2() { - $class = new \ReflectionClass('\\Ratchet\\AbstractConnectionDecorator'); - $method = $class->getMethod('getConnection'); - $method->setAccessible(true); - - $conn = $method->invokeArgs($this->l2, array()); - - $this->assertSame($this->l1, $conn); - } - - public function testWrapperCanStoreSelfInDecorator() { - $this->mock->decorator = $this->l1; - - $this->assertSame($this->l1, $this->l2->decorator); - } - - public function testDecoratorRecursion() { - $this->mock->decorator = new \stdClass; - $this->mock->decorator->conn = $this->l1; - - $this->assertSame($this->l1, $this->mock->decorator->conn); - $this->assertSame($this->l1, $this->l1->decorator->conn); - $this->assertSame($this->l1, $this->l2->decorator->conn); - } - - public function testDecoratorRecursionLevel2() { - $this->mock->decorator = new \stdClass; - $this->mock->decorator->conn = $this->l2; - - $this->assertSame($this->l2, $this->mock->decorator->conn); - $this->assertSame($this->l2, $this->l1->decorator->conn); - $this->assertSame($this->l2, $this->l2->decorator->conn); - - // just for fun - $this->assertSame($this->l2, $this->l2->decorator->conn->decorator->conn->decorator->conn); - } - - public function testWarningGettingNothing() { - $this->setExpectedException('PHPUnit_Framework_Error'); - $var = $this->mock->nonExistant; - } - - public function testWarningGettingNothingLevel1() { - $this->setExpectedException('PHPUnit_Framework_Error'); - $var = $this->l1->nonExistant; - } - - public function testWarningGettingNothingLevel2() { - $this->setExpectedException('PHPUnit_Framework_Error'); - $var = $this->l2->nonExistant; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/Guzzle/Http/Message/RequestFactoryTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/Guzzle/Http/Message/RequestFactoryTest.php deleted file mode 100644 index 8cada8c74f..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/Guzzle/Http/Message/RequestFactoryTest.php +++ /dev/null @@ -1,67 +0,0 @@ -factory = RequestFactory::getInstance(); - } - - public function testMessageProvider() { - return array( - 'status' => 'GET / HTTP/1.1' - , 'headers' => array( - 'Upgrade' => 'WebSocket' - , 'Connection' => 'Upgrade' - , 'Host' => 'localhost:8000' - , 'Sec-WebSocket-Key1' => '> b3lU Z0 fh f 3+83394 6 (zG4' - , 'Sec-WebSocket-Key2' => ',3Z0X0677 dV-d [159 Z*4' - ) - , 'body' => "123456\r\n\r\n" - ); - } - - public function combineMessage($status, array $headers, $body = '') { - $message = $status . "\r\n"; - - foreach ($headers as $key => $val) { - $message .= "{$key}: {$val}\r\n"; - } - - $message .= "\r\n{$body}"; - - return $message; - } - - public function testExpectedDataFromGuzzleHeaders() { - $parts = $this->testMessageProvider(); - $message = $this->combineMessage($parts['status'], $parts['headers'], $parts['body']); - $object = $this->factory->fromMessage($message); - - foreach ($parts['headers'] as $key => $val) { - $this->assertEquals($val, $object->getHeader($key, true)); - } - } - - public function testExpectedDataFromNonGuzzleHeaders() { - $parts = $this->testMessageProvider(); - $message = $this->combineMessage($parts['status'], $parts['headers'], $parts['body']); - $object = $this->factory->fromMessage($message); - - $this->assertNull($object->getHeader('Nope', true)); - $this->assertNull($object->getHeader('Nope')); - } - - public function testExpectedDataFromNonGuzzleBody() { - $parts = $this->testMessageProvider(); - $message = $this->combineMessage($parts['status'], $parts['headers'], $parts['body']); - $object = $this->factory->fromMessage($message); - - $this->assertEquals($parts['body'], (string)$object->getBody()); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpRequestParserTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpRequestParserTest.php deleted file mode 100644 index 89a0e806f9..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpRequestParserTest.php +++ /dev/null @@ -1,51 +0,0 @@ -parser = new HttpRequestParser; - } - - public function headersProvider() { - return array( - array(false, "GET / HTTP/1.1\r\nHost: socketo.me\r\n") - , array(true, "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\n") - , array(true, "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\n1") - , array(true, "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\nHixie✖") - , array(true, "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\nHixie✖\r\n\r\n") - , array(true, "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\nHixie\r\n") - ); - } - - /** - * @dataProvider headersProvider - */ - public function testIsEom($expected, $message) { - $this->assertEquals($expected, $this->parser->isEom($message)); - } - - public function testBufferOverflowResponse() { - $conn = $this->getMock('\Ratchet\ConnectionInterface'); - - $this->parser->maxSize = 20; - - $this->assertNull($this->parser->onMessage($conn, "GET / HTTP/1.1\r\n")); - - $this->setExpectedException('OverflowException'); - - $this->parser->onMessage($conn, "Header-Is: Too Big"); - } - - public function testReturnTypeIsRequest() { - $conn = $this->getMock('\Ratchet\ConnectionInterface'); - $return = $this->parser->onMessage($conn, "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\n"); - - $this->assertInstanceOf('\Guzzle\Http\Message\RequestInterface', $return); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpServerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpServerTest.php deleted file mode 100644 index 2c069f15cc..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/HttpServerTest.php +++ /dev/null @@ -1,64 +0,0 @@ -_conn->httpHeadersReceived = true; - } - - public function getConnectionClassString() { - return '\Ratchet\ConnectionInterface'; - } - - public function getDecoratorClassString() { - return '\Ratchet\Http\HttpServer'; - } - - public function getComponentClassString() { - return '\Ratchet\Http\HttpServerInterface'; - } - - public function testOpen() { - $headers = "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\n"; - - $this->_conn->httpHeadersReceived = false; - $this->_app->expects($this->once())->method('onOpen')->with($this->isExpectedConnection()); - $this->_serv->onMessage($this->_conn, $headers); - } - - public function testOnMessageAfterHeaders() { - $headers = "GET / HTTP/1.1\r\nHost: socketo.me\r\n\r\n"; - $this->_conn->httpHeadersReceived = false; - $this->_serv->onMessage($this->_conn, $headers); - - $message = "Hello World!"; - $this->_app->expects($this->once())->method('onMessage')->with($this->isExpectedConnection(), $message); - $this->_serv->onMessage($this->_conn, $message); - } - - public function testBufferOverflow() { - $this->_conn->expects($this->once())->method('close'); - $this->_conn->httpHeadersReceived = false; - - $this->_serv->onMessage($this->_conn, str_repeat('a', 5000)); - } - - public function testCloseIfNotEstablished() { - $this->_conn->httpHeadersReceived = false; - $this->_conn->expects($this->once())->method('close'); - $this->_serv->onError($this->_conn, new \Exception('Whoops!')); - } - - public function testBufferHeaders() { - $this->_conn->httpHeadersReceived = false; - $this->_app->expects($this->never())->method('onOpen'); - $this->_app->expects($this->never())->method('onMessage'); - - $this->_serv->onMessage($this->_conn, "GET / HTTP/1.1"); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/OriginCheckTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/OriginCheckTest.php deleted file mode 100644 index 34db4391a4..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/OriginCheckTest.php +++ /dev/null @@ -1,46 +0,0 @@ -_reqStub = $this->getMock('Guzzle\Http\Message\RequestInterface'); - $this->_reqStub->expects($this->any())->method('getHeader')->will($this->returnValue('localhost')); - - parent::setUp(); - - $this->_serv->allowedOrigins[] = 'localhost'; - } - - protected function doOpen($conn) { - $this->_serv->onOpen($conn, $this->_reqStub); - } - - public function getConnectionClassString() { - return '\Ratchet\ConnectionInterface'; - } - - public function getDecoratorClassString() { - return '\Ratchet\Http\OriginCheck'; - } - - public function getComponentClassString() { - return '\Ratchet\Http\HttpServerInterface'; - } - - public function testCloseOnNonMatchingOrigin() { - $this->_serv->allowedOrigins = array('socketo.me'); - $this->_conn->expects($this->once())->method('close'); - - $this->_serv->onOpen($this->_conn, $this->_reqStub); - } - - public function testOnMessage() { - $this->passthroughMessageTest('Hello World!'); - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/RouterTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/RouterTest.php deleted file mode 100644 index 8656dd34e9..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Http/RouterTest.php +++ /dev/null @@ -1,88 +0,0 @@ -_conn = $this->getMock('\Ratchet\ConnectionInterface'); - $this->_req = $this->getMock('\Guzzle\Http\Message\RequestInterface'); - $this->_matcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface'); - $this->_matcher - ->expects($this->any()) - ->method('getContext') - ->will($this->returnValue($this->getMock('Symfony\Component\Routing\RequestContext'))); - $this->_router = new Router($this->_matcher); - - $this->_req->expects($this->any())->method('getPath')->will($this->returnValue('/whatever')); - } - - public function testFourOhFour() { - $this->_conn->expects($this->once())->method('close'); - - $nope = new ResourceNotFoundException; - $this->_matcher->expects($this->any())->method('match')->will($this->throwException($nope)); - - $this->_router->onOpen($this->_conn, $this->_req); - } - - public function testNullRequest() { - $this->setExpectedException('\UnexpectedValueException'); - $this->_router->onOpen($this->_conn); - } - - public function testControllerIsMessageComponentInterface() { - $this->setExpectedException('\UnexpectedValueException'); - $this->_matcher->expects($this->any())->method('match')->will($this->returnValue(array('_controller' => new \StdClass))); - $this->_router->onOpen($this->_conn, $this->_req); - } - - public function testControllerOnOpen() { - $controller = $this->getMockBuilder('\Ratchet\WebSocket\WsServer')->disableOriginalConstructor()->getMock(); - $this->_matcher->expects($this->any())->method('match')->will($this->returnValue(array('_controller' => $controller))); - $this->_router->onOpen($this->_conn, $this->_req); - - $expectedConn = new \PHPUnit_Framework_Constraint_IsInstanceOf('\Ratchet\ConnectionInterface'); - $controller->expects($this->once())->method('onOpen')->with($expectedConn, $this->_req); - - $this->_matcher->expects($this->any())->method('match')->will($this->returnValue(array('_controller' => $controller))); - $this->_router->onOpen($this->_conn, $this->_req); - } - - public function testControllerOnMessageBubbles() { - $message = "The greatest trick the Devil ever pulled was convincing the world he didn't exist"; - $controller = $this->getMockBuilder('\Ratchet\WebSocket\WsServer')->disableOriginalConstructor()->getMock(); - $controller->expects($this->once())->method('onMessage')->with($this->_conn, $message); - - $this->_conn->controller = $controller; - - $this->_router->onMessage($this->_conn, $message); - } - - public function testControllerOnCloseBubbles() { - $controller = $this->getMockBuilder('\Ratchet\WebSocket\WsServer')->disableOriginalConstructor()->getMock(); - $controller->expects($this->once())->method('onClose')->with($this->_conn); - - $this->_conn->controller = $controller; - - $this->_router->onClose($this->_conn); - } - - public function testControllerOnErrorBubbles() { - $e= new \Exception('One cannot be betrayed if one has no exceptions'); - $controller = $this->getMockBuilder('\Ratchet\WebSocket\WsServer')->disableOriginalConstructor()->getMock(); - $controller->expects($this->once())->method('onError')->with($this->_conn, $e); - - $this->_conn->controller = $controller; - - $this->_router->onError($this->_conn, $e); - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/EchoServerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/EchoServerTest.php deleted file mode 100644 index 47fb0e283b..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/EchoServerTest.php +++ /dev/null @@ -1,26 +0,0 @@ -_conn = $this->getMock('\Ratchet\ConnectionInterface'); - $this->_comp = new EchoServer; - } - - public function testMessageEchod() { - $message = 'Tillsonburg, my back still aches when I hear that word.'; - $this->_conn->expects($this->once())->method('send')->with($message); - $this->_comp->onMessage($this->_conn, $message); - } - - public function testErrorClosesConnection() { - ob_start(); - $this->_conn->expects($this->once())->method('close'); - $this->_comp->onError($this->_conn, new \Exception); - ob_end_clean(); - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/FlashPolicyComponentTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/FlashPolicyComponentTest.php deleted file mode 100644 index 67f88a7215..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/FlashPolicyComponentTest.php +++ /dev/null @@ -1,152 +0,0 @@ -_policy = new FlashPolicy(); - } - - public function testPolicyRender() { - $this->_policy->setSiteControl('all'); - $this->_policy->addAllowedAccess('example.com', '*'); - $this->_policy->addAllowedAccess('dev.example.com', '*'); - - $this->assertInstanceOf('SimpleXMLElement', $this->_policy->renderPolicy()); - } - - public function testInvalidPolicyReader() { - $this->setExpectedException('UnexpectedValueException'); - $this->_policy->renderPolicy(); - } - - public function testInvalidDomainPolicyReader() { - $this->setExpectedException('UnexpectedValueException'); - $this->_policy->setSiteControl('all'); - $this->_policy->addAllowedAccess('dev.example.*', '*'); - $this->_policy->renderPolicy(); - } - - /** - * @dataProvider siteControl - */ - public function testSiteControlValidation($accept, $permittedCrossDomainPolicies) { - $this->assertEquals($accept, $this->_policy->validateSiteControl($permittedCrossDomainPolicies)); - } - - public static function siteControl() { - return array( - array(true, 'all') - , array(true, 'none') - , array(true, 'master-only') - , array(false, 'by-content-type') - , array(false, 'by-ftp-filename') - , array(false, '') - , array(false, 'all ') - , array(false, 'asdf') - , array(false, '@893830') - , array(false, '*') - ); - } - - /** - * @dataProvider URI - */ - public function testDomainValidation($accept, $domain) { - $this->assertEquals($accept, $this->_policy->validateDomain($domain)); - } - - public static function URI() { - return array( - array(true, '*') - , array(true, 'example.com') - , array(true, 'exam-ple.com') - , array(true, '*.example.com') - , array(true, 'www.example.com') - , array(true, 'dev.dev.example.com') - , array(true, 'http://example.com') - , array(true, 'https://example.com') - , array(true, 'http://*.example.com') - , array(false, 'exam*ple.com') - , array(true, '127.0.255.1') - , array(true, 'localhost') - , array(false, 'www.example.*') - , array(false, 'www.exa*le.com') - , array(false, 'www.example.*com') - , array(false, '*.example.*') - , array(false, 'gasldf*$#a0sdf0a8sdf') - ); - } - - /** - * @dataProvider ports - */ - public function testPortValidation($accept, $ports) { - $this->assertEquals($accept, $this->_policy->validatePorts($ports)); - } - - public static function ports() { - return array( - array(true, '*') - , array(true, '80') - , array(true, '80,443') - , array(true, '507,516-523') - , array(true, '507,516-523,333') - , array(true, '507,516-523,507,516-523') - , array(false, '516-') - , array(true, '516-523,11') - , array(false, '516,-523,11') - , array(false, 'example') - , array(false, 'asdf,123') - , array(false, '--') - , array(false, ',,,') - , array(false, '838*') - ); - } - - public function testAddAllowedAccessOnlyAcceptsValidPorts() { - $this->setExpectedException('UnexpectedValueException'); - - $this->_policy->addAllowedAccess('*', 'nope'); - } - - public function testSetSiteControlThrowsException() { - $this->setExpectedException('UnexpectedValueException'); - - $this->_policy->setSiteControl('nope'); - } - - public function testErrorClosesConnection() { - $conn = $this->getMock('\\Ratchet\\ConnectionInterface'); - $conn->expects($this->once())->method('close'); - - $this->_policy->onError($conn, new \Exception); - } - - public function testOnMessageSendsString() { - $this->_policy->addAllowedAccess('*', '*'); - - $conn = $this->getMock('\\Ratchet\\ConnectionInterface'); - $conn->expects($this->once())->method('send')->with($this->isType('string')); - - $this->_policy->onMessage($conn, ' '); - } - - public function testOnOpenExists() { - $this->assertTrue(method_exists($this->_policy, 'onOpen')); - $conn = $this->getMock('\Ratchet\ConnectionInterface'); - $this->_policy->onOpen($conn); - } - - public function testOnCloseExists() { - $this->assertTrue(method_exists($this->_policy, 'onClose')); - $conn = $this->getMock('\Ratchet\ConnectionInterface'); - $this->_policy->onClose($conn); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoConnectionTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoConnectionTest.php deleted file mode 100644 index 0cb7fb47a8..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoConnectionTest.php +++ /dev/null @@ -1,32 +0,0 @@ -sock = $this->getMock('\\React\\Socket\\ConnectionInterface'); - $this->conn = new IoConnection($this->sock); - } - - public function testCloseBubbles() { - $this->sock->expects($this->once())->method('end'); - $this->conn->close(); - } - - public function testSendBubbles() { - $msg = '6 hour rides are productive'; - - $this->sock->expects($this->once())->method('write')->with($msg); - $this->conn->send($msg); - } - - public function testSendReturnsSelf() { - $this->assertSame($this->conn, $this->conn->send('fluent interface')); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoServerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoServerTest.php deleted file mode 100644 index 2b0258cda6..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IoServerTest.php +++ /dev/null @@ -1,118 +0,0 @@ -app = $this->getMock('\\Ratchet\\MessageComponentInterface'); - - $loop = new StreamSelectLoop; - $this->reactor = new Server($loop); - $this->reactor->listen(0); - - $this->port = $this->reactor->getPort(); - $this->server = new IoServer($this->app, $this->reactor, $loop); - } - - public function testOnOpen() { - $this->app->expects($this->once())->method('onOpen')->with($this->isInstanceOf('\\Ratchet\\ConnectionInterface')); - - $client = stream_socket_client("tcp://localhost:{$this->port}"); - - $this->server->loop->tick(); - - //$this->assertTrue(is_string($this->app->last['onOpen'][0]->remoteAddress)); - //$this->assertTrue(is_int($this->app->last['onOpen'][0]->resourceId)); - } - - public function testOnData() { - $msg = 'Hello World!'; - - $this->app->expects($this->once())->method('onMessage')->with( - $this->isInstanceOf('\\Ratchet\\ConnectionInterface') - , $msg - ); - - $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - socket_set_option($client, SOL_SOCKET, SO_REUSEADDR, 1); - socket_set_option($client, SOL_SOCKET, SO_SNDBUF, 4096); - socket_set_block($client); - socket_connect($client, 'localhost', $this->port); - - $this->server->loop->tick(); - - socket_write($client, $msg); - $this->server->loop->tick(); - - socket_shutdown($client, 1); - socket_shutdown($client, 0); - socket_close($client); - - $this->server->loop->tick(); - } - - public function testOnClose() { - $this->app->expects($this->once())->method('onClose')->with($this->isInstanceOf('\\Ratchet\\ConnectionInterface')); - - $client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - socket_set_option($client, SOL_SOCKET, SO_REUSEADDR, 1); - socket_set_option($client, SOL_SOCKET, SO_SNDBUF, 4096); - socket_set_block($client); - socket_connect($client, 'localhost', $this->port); - - $this->server->loop->tick(); - - socket_shutdown($client, 1); - socket_shutdown($client, 0); - socket_close($client); - - $this->server->loop->tick(); - } - - public function testFactory() { - $this->assertInstanceOf('\\Ratchet\\Server\\IoServer', IoServer::factory($this->app, 0)); - } - - public function testNoLoopProvidedError() { - $this->setExpectedException('RuntimeException'); - - $io = new IoServer($this->app, $this->reactor); - $io->run(); - } - - public function testOnErrorPassesException() { - $conn = $this->getMock('\\React\\Socket\\ConnectionInterface'); - $conn->decor = $this->getMock('\\Ratchet\\ConnectionInterface'); - $err = new \Exception("Nope"); - - $this->app->expects($this->once())->method('onError')->with($conn->decor, $err); - - $this->server->handleError($err, $conn); - } - - public function onErrorCalledWhenExceptionThrown() { - $this->markTestIncomplete("Need to learn how to throw an exception from a mock"); - - $conn = $this->getMock('\\React\\Socket\\ConnectionInterface'); - $this->server->handleConnect($conn); - - $e = new \Exception; - $this->app->expects($this->once())->method('onMessage')->with($this->isInstanceOf('\\Ratchet\\ConnectionInterface'), 'f')->will($e); - $this->app->expects($this->once())->method('onError')->with($this->instanceOf('\\Ratchet\\ConnectionInterface', $e)); - - $this->server->handleData('f', $conn); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IpBlackListComponentTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IpBlackListComponentTest.php deleted file mode 100644 index 419f077546..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Server/IpBlackListComponentTest.php +++ /dev/null @@ -1,125 +0,0 @@ -mock = $this->getMock('\\Ratchet\\MessageComponentInterface'); - $this->blocker = new IpBlackList($this->mock); - } - - public function testOnOpen() { - $this->mock->expects($this->exactly(3))->method('onOpen'); - - $conn1 = $this->newConn(); - $conn2 = $this->newConn(); - $conn3 = $this->newConn(); - - $this->blocker->onOpen($conn1); - $this->blocker->onOpen($conn3); - $this->blocker->onOpen($conn2); - } - - public function testBlockDoesNotTriggerOnOpen() { - $conn = $this->newConn(); - - $this->blocker->blockAddress($conn->remoteAddress); - - $this->mock->expects($this->never())->method('onOpen'); - - $ret = $this->blocker->onOpen($conn); - } - - public function testBlockDoesNotTriggerOnClose() { - $conn = $this->newConn(); - - $this->blocker->blockAddress($conn->remoteAddress); - - $this->mock->expects($this->never())->method('onClose'); - - $ret = $this->blocker->onOpen($conn); - } - - public function testOnMessageDecoration() { - $conn = $this->newConn(); - $msg = 'Hello not being blocked'; - - $this->mock->expects($this->once())->method('onMessage')->with($conn, $msg); - - $this->blocker->onMessage($conn, $msg); - } - - public function testOnCloseDecoration() { - $conn = $this->newConn(); - - $this->mock->expects($this->once())->method('onClose')->with($conn); - - $this->blocker->onClose($conn); - } - - public function testBlockClosesConnection() { - $conn = $this->newConn(); - $this->blocker->blockAddress($conn->remoteAddress); - - $conn->expects($this->once())->method('close'); - - $this->blocker->onOpen($conn); - } - - public function testAddAndRemoveWithFluentInterfaces() { - $blockOne = '127.0.0.1'; - $blockTwo = '192.168.1.1'; - $unblock = '75.119.207.140'; - - $this->blocker - ->blockAddress($unblock) - ->blockAddress($blockOne) - ->unblockAddress($unblock) - ->blockAddress($blockTwo) - ; - - $this->assertEquals(array($blockOne, $blockTwo), $this->blocker->getBlockedAddresses()); - } - - public function testDecoratorPassesErrors() { - $conn = $this->newConn(); - $e = new \Exception('I threw an error'); - - $this->mock->expects($this->once())->method('onError')->with($conn, $e); - - $this->blocker->onError($conn, $e); - } - - public function addressProvider() { - return array( - array('127.0.0.1', '127.0.0.1') - , array('localhost', 'localhost') - , array('fe80::1%lo0', 'fe80::1%lo0') - , array('127.0.0.1', '127.0.0.1:6392') - ); - } - - /** - * @dataProvider addressProvider - */ - public function testFilterAddress($expected, $input) { - $this->assertEquals($expected, $this->blocker->filterAddress($input)); - } - - public function testUnblockingSilentlyFails() { - $this->assertInstanceOf('\\Ratchet\\Server\\IpBlackList', $this->blocker->unblockAddress('localhost')); - } - - protected function newConn() { - $conn = $this->getMock('\\Ratchet\\ConnectionInterface'); - $conn->remoteAddress = '127.0.0.1'; - - return $conn; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/Serialize/PhpHandlerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/Serialize/PhpHandlerTest.php deleted file mode 100644 index cf1ef48fd2..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/Serialize/PhpHandlerTest.php +++ /dev/null @@ -1,36 +0,0 @@ -_handler = new PhpHandler; - } - - public function serializedProvider() { - return array( - array( - '_sf2_attributes|a:2:{s:5:"hello";s:5:"world";s:4:"last";i:1332872102;}_sf2_flashes|a:0:{}' - , array( - '_sf2_attributes' => array( - 'hello' => 'world' - , 'last' => 1332872102 - ) - , '_sf2_flashes' => array() - ) - ) - ); - } - - /** - * @dataProvider serializedProvider - */ - public function testUnserialize($in, $expected) { - $this->assertEquals($expected, $this->_handler->unserialize($in)); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/SessionComponentTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/SessionComponentTest.php deleted file mode 100644 index c91f13e878..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Session/SessionComponentTest.php +++ /dev/null @@ -1,138 +0,0 @@ -markTestSkipped('Dependency of Symfony HttpFoundation failed'); - } - - parent::setUp(); - $this->_serv = new SessionProvider($this->_app, new NullSessionHandler); - } - - public function tearDown() { - ini_set('session.serialize_handler', 'php'); - } - - public function getConnectionClassString() { - return '\Ratchet\ConnectionInterface'; - } - - public function getDecoratorClassString() { - return '\Ratchet\NullComponent'; - } - - public function getComponentClassString() { - return '\Ratchet\MessageComponentInterface'; - } - - public function classCaseProvider() { - return array( - array('php', 'Php') - , array('php_binary', 'PhpBinary') - ); - } - - /** - * @dataProvider classCaseProvider - */ - public function testToClassCase($in, $out) { - $ref = new \ReflectionClass('\\Ratchet\\Session\\SessionProvider'); - $method = $ref->getMethod('toClassCase'); - $method->setAccessible(true); - - $component = new SessionProvider($this->getMock('Ratchet\\MessageComponentInterface'), $this->getMock('\SessionHandlerInterface')); - $this->assertEquals($out, $method->invokeArgs($component, array($in))); - } - - /** - * I think I have severely butchered this test...it's not so much of a unit test as it is a full-fledged component test - */ - public function testConnectionValueFromPdo() { - if (!extension_loaded('PDO') || !extension_loaded('pdo_sqlite')) { - return $this->markTestSkipped('Session test requires PDO and pdo_sqlite'); - } - - $sessionId = md5('testSession'); - - $dbOptions = array( - 'db_table' => 'sessions' - , 'db_id_col' => 'sess_id' - , 'db_data_col' => 'sess_data' - , 'db_time_col' => 'sess_time' - ); - - $pdo = new \PDO("sqlite::memory:"); - $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - $pdo->exec(vsprintf("CREATE TABLE %s (%s VARCHAR(255) PRIMARY KEY, %s TEXT, %s INTEGER)", $dbOptions)); - $pdo->prepare(vsprintf("INSERT INTO %s (%s, %s, %s) VALUES (?, ?, ?)", $dbOptions))->execute(array($sessionId, base64_encode('_sf2_attributes|a:2:{s:5:"hello";s:5:"world";s:4:"last";i:1332872102;}_sf2_flashes|a:0:{}'), time())); - - $component = new SessionProvider($this->getMock('Ratchet\\MessageComponentInterface'), new PdoSessionHandler($pdo, $dbOptions), array('auto_start' => 1)); - $connection = $this->getMock('Ratchet\\ConnectionInterface'); - - $headers = $this->getMock('Guzzle\\Http\\Message\\Request', array('getCookie'), array('POST', '/', array())); - $headers->expects($this->once())->method('getCookie', array(ini_get('session.name')))->will($this->returnValue($sessionId)); - - $connection->WebSocket = new \StdClass; - $connection->WebSocket->request = $headers; - - $component->onOpen($connection); - - $this->assertEquals('world', $connection->Session->get('hello')); - } - - protected function newConn() { - $conn = $this->getMock('Ratchet\ConnectionInterface'); - - $headers = $this->getMock('Guzzle\Http\Message\Request', array('getCookie'), array('POST', '/', array())); - $headers->expects($this->once())->method('getCookie', array(ini_get('session.name')))->will($this->returnValue(null)); - - $conn->WebSocket = new \StdClass; - $conn->WebSocket->request = $headers; - - return $conn; - } - - public function testOnMessageDecorator() { - $message = "Database calls are usually blocking :("; - $this->_app->expects($this->once())->method('onMessage')->with($this->isExpectedConnection(), $message); - $this->_serv->onMessage($this->_conn, $message); - } - - public function testGetSubProtocolsReturnsArray() { - $mock = $this->getMock('Ratchet\\MessageComponentInterface'); - $comp = new SessionProvider($mock, new NullSessionHandler); - - $this->assertInternalType('array', $comp->getSubProtocols()); - } - - public function testGetSubProtocolsGetFromApp() { - $mock = $this->getMock('Ratchet\WebSocket\Stub\WsMessageComponentInterface'); - $mock->expects($this->once())->method('getSubProtocols')->will($this->returnValue(array('hello', 'world'))); - $comp = new SessionProvider($mock, new NullSessionHandler); - - $this->assertGreaterThanOrEqual(2, count($comp->getSubProtocols())); - } - - public function testRejectInvalidSeralizers() { - if (!function_exists('wddx_serialize_value')) { - $this->markTestSkipped(); - } - - ini_set('session.serialize_handler', 'wddx'); - $this->setExpectedException('\RuntimeException'); - new SessionProvider($this->getMock('\Ratchet\MessageComponentInterface'), $this->getMock('\SessionHandlerInterface')); - } -} diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/ServerProtocolTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/ServerProtocolTest.php deleted file mode 100644 index b4f57a4fe5..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/ServerProtocolTest.php +++ /dev/null @@ -1,269 +0,0 @@ -_app = new TestComponent; - $this->_comp = new ServerProtocol($this->_app); - } - - protected function newConn() { - return new Connection; - } - - public function invalidMessageProvider() { - return array( - array(0) - , array(3) - , array(4) - , array(8) - , array(9) - ); - } - - /** - * @dataProvider invalidMessageProvider - */ - public function testInvalidMessages($type) { - $this->setExpectedException('\Ratchet\Wamp\Exception'); - - $conn = $this->newConn(); - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, json_encode(array($type))); - } - - public function testWelcomeMessage() { - $conn = $this->newConn(); - - $this->_comp->onOpen($conn); - - $message = $conn->last['send']; - $json = json_decode($message); - - $this->assertEquals(4, count($json)); - $this->assertEquals(0, $json[0]); - $this->assertTrue(is_string($json[1])); - $this->assertEquals(1, $json[2]); - } - - public function testSubscribe() { - $uri = 'http://example.com'; - $clientMessage = array(5, $uri); - - $conn = $this->newConn(); - - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, json_encode($clientMessage)); - - $this->assertEquals($uri, $this->_app->last['onSubscribe'][1]); - } - - public function testUnSubscribe() { - $uri = 'http://example.com/endpoint'; - $clientMessage = array(6, $uri); - - $conn = $this->newConn(); - - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, json_encode($clientMessage)); - - $this->assertEquals($uri, $this->_app->last['onUnSubscribe'][1]); - } - - public function callProvider() { - return array( - array(2, 'a', 'b') - , array(2, array('a', 'b')) - , array(1, 'one') - , array(3, 'one', 'two', 'three') - , array(3, array('un', 'deux', 'trois')) - , array(2, 'hi', array('hello', 'world')) - , array(2, array('hello', 'world'), 'hi') - , array(2, array('hello' => 'world', 'herp' => 'derp')) - ); - } - - /** - * @dataProvider callProvider - */ - public function testCall() { - $args = func_get_args(); - $paramNum = array_shift($args); - - $uri = 'http://example.com/endpoint/' . rand(1, 100); - $id = uniqid(); - $clientMessage = array_merge(array(2, $id, $uri), $args); - - $conn = $this->newConn(); - - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, json_encode($clientMessage)); - - $this->assertEquals($id, $this->_app->last['onCall'][1]); - $this->assertEquals($uri, $this->_app->last['onCall'][2]); - - $this->assertEquals($paramNum, count($this->_app->last['onCall'][3])); - } - - public function testPublish() { - $conn = $this->newConn(); - - $topic = 'pubsubhubbub'; - $event = 'Here I am, publishing data'; - - $clientMessage = array(7, $topic, $event); - - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, json_encode($clientMessage)); - - $this->assertEquals($topic, $this->_app->last['onPublish'][1]); - $this->assertEquals($event, $this->_app->last['onPublish'][2]); - $this->assertEquals(array(), $this->_app->last['onPublish'][3]); - $this->assertEquals(array(), $this->_app->last['onPublish'][4]); - } - - public function testPublishAndExcludeMe() { - $conn = $this->newConn(); - - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, json_encode(array(7, 'topic', 'event', true))); - - $this->assertEquals($conn->WAMP->sessionId, $this->_app->last['onPublish'][3][0]); - } - - public function testPublishAndEligible() { - $conn = $this->newConn(); - - $buddy = uniqid(); - $friend = uniqid(); - - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, json_encode(array(7, 'topic', 'event', false, array($buddy, $friend)))); - - $this->assertEquals(array(), $this->_app->last['onPublish'][3]); - $this->assertEquals(2, count($this->_app->last['onPublish'][4])); - } - - public function eventProvider() { - return array( - array('http://example.com', array('one', 'two')) - , array('curie', array(array('hello' => 'world', 'herp' => 'derp'))) - ); - } - - /** - * @dataProvider eventProvider - */ - public function testEvent($topic, $payload) { - $conn = new WampConnection($this->newConn()); - $conn->event($topic, $payload); - - $eventString = $conn->last['send']; - - $this->assertSame(array(8, $topic, $payload), json_decode($eventString, true)); - } - - public function testOnClosePropagation() { - $conn = new Connection; - - $this->_comp->onOpen($conn); - $this->_comp->onClose($conn); - - $class = new \ReflectionClass('\\Ratchet\\Wamp\\WampConnection'); - $method = $class->getMethod('getConnection'); - $method->setAccessible(true); - - $check = $method->invokeArgs($this->_app->last['onClose'][0], array()); - - $this->assertSame($conn, $check); - } - - public function testOnErrorPropagation() { - $conn = new Connection; - - $e = new \Exception('Nope'); - - $this->_comp->onOpen($conn); - $this->_comp->onError($conn, $e); - - $class = new \ReflectionClass('\\Ratchet\\Wamp\\WampConnection'); - $method = $class->getMethod('getConnection'); - $method->setAccessible(true); - - $check = $method->invokeArgs($this->_app->last['onError'][0], array()); - - $this->assertSame($conn, $check); - $this->assertSame($e, $this->_app->last['onError'][1]); - } - - public function testPrefix() { - $conn = new WampConnection($this->newConn()); - $this->_comp->onOpen($conn); - - $shortIn = 'incoming'; - $longIn = 'http://example.com/incoming/'; - - $this->_comp->onMessage($conn, json_encode(array(1, $shortIn, $longIn))); - - $this->assertEquals($longIn, $conn->WAMP->prefixes[$shortIn]); - $this->assertEquals($longIn, $conn->getUri($shortIn)); - } - - public function testMessageMustBeJson() { - $this->setExpectedException('\\Ratchet\\Wamp\\JsonException'); - - $conn = new Connection; - - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, 'Hello World!'); - } - - public function testGetSubProtocolsReturnsArray() { - $this->assertTrue(is_array($this->_comp->getSubProtocols())); - } - - public function testGetSubProtocolsGetFromApp() { - $this->_app->protocols = array('hello', 'world'); - - $this->assertGreaterThanOrEqual(3, count($this->_comp->getSubProtocols())); - } - - public function testWampOnMessageApp() { - $app = $this->getMock('\\Ratchet\\Wamp\\WampServerInterface'); - $wamp = new ServerProtocol($app); - - $this->assertContains('wamp', $wamp->getSubProtocols()); - } - - public function badFormatProvider() { - return array( - array(json_encode(true)) - , array('{"valid":"json", "invalid": "message"}') - , array('{"0": "fail", "hello": "world"}') - ); - } - - /** - * @dataProvider badFormatProvider - */ - public function testValidJsonButInvalidProtocol($message) { - $this->setExpectedException('\UnexpectedValueException'); - - $conn = $this->newConn(); - $this->_comp->onOpen($conn); - $this->_comp->onMessage($conn, $message); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicManagerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicManagerTest.php deleted file mode 100644 index e096a28eda..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicManagerTest.php +++ /dev/null @@ -1,197 +0,0 @@ -conn = $this->getMock('\Ratchet\ConnectionInterface'); - $this->mock = $this->getMock('\Ratchet\Wamp\WampServerInterface'); - $this->mngr = new TopicManager($this->mock); - - $this->conn->WAMP = new \StdClass; - $this->mngr->onOpen($this->conn); - } - - public function testGetTopicReturnsTopicObject() { - $class = new \ReflectionClass('Ratchet\Wamp\TopicManager'); - $method = $class->getMethod('getTopic'); - $method->setAccessible(true); - - $topic = $method->invokeArgs($this->mngr, array('The Topic')); - - $this->assertInstanceOf('Ratchet\Wamp\Topic', $topic); - } - - public function testGetTopicCreatesTopicWithSameName() { - $name = 'The Topic'; - - $class = new \ReflectionClass('Ratchet\Wamp\TopicManager'); - $method = $class->getMethod('getTopic'); - $method->setAccessible(true); - - $topic = $method->invokeArgs($this->mngr, array($name)); - - $this->assertEquals($name, $topic->getId()); - } - - public function testGetTopicReturnsSameObject() { - $class = new \ReflectionClass('Ratchet\Wamp\TopicManager'); - $method = $class->getMethod('getTopic'); - $method->setAccessible(true); - - $topic = $method->invokeArgs($this->mngr, array('No copy')); - $again = $method->invokeArgs($this->mngr, array('No copy')); - - $this->assertSame($topic, $again); - } - - public function testOnOpen() { - $this->mock->expects($this->once())->method('onOpen'); - $this->mngr->onOpen($this->conn); - } - - public function testOnCall() { - $id = uniqid(); - - $this->mock->expects($this->once())->method('onCall')->with( - $this->conn - , $id - , $this->isInstanceOf('Ratchet\Wamp\Topic') - , array() - ); - - $this->mngr->onCall($this->conn, $id, 'new topic', array()); - } - - public function testOnSubscribeCreatesTopicObject() { - $this->mock->expects($this->once())->method('onSubscribe')->with( - $this->conn, $this->isInstanceOf('Ratchet\Wamp\Topic') - ); - - $this->mngr->onSubscribe($this->conn, 'new topic'); - } - - public function testTopicIsInConnectionOnSubscribe() { - $name = 'New Topic'; - - $class = new \ReflectionClass('Ratchet\Wamp\TopicManager'); - $method = $class->getMethod('getTopic'); - $method->setAccessible(true); - - $topic = $method->invokeArgs($this->mngr, array($name)); - - $this->mngr->onSubscribe($this->conn, $name); - - $this->assertTrue($this->conn->WAMP->subscriptions->contains($topic)); - } - - public function testDoubleSubscriptionFiresOnce() { - $this->mock->expects($this->exactly(1))->method('onSubscribe'); - - $this->mngr->onSubscribe($this->conn, 'same topic'); - $this->mngr->onSubscribe($this->conn, 'same topic'); - } - - public function testUnsubscribeEvent() { - $name = 'in and out'; - $this->mock->expects($this->once())->method('onUnsubscribe')->with( - $this->conn, $this->isInstanceOf('Ratchet\Wamp\Topic') - ); - - $this->mngr->onSubscribe($this->conn, $name); - $this->mngr->onUnsubscribe($this->conn, $name); - } - - public function testUnsubscribeFiresOnce() { - $name = 'getting sleepy'; - $this->mock->expects($this->exactly(1))->method('onUnsubscribe'); - - $this->mngr->onSubscribe($this->conn, $name); - $this->mngr->onUnsubscribe($this->conn, $name); - $this->mngr->onUnsubscribe($this->conn, $name); - } - - public function testUnsubscribeRemovesTopicFromConnection() { - $name = 'Bye Bye Topic'; - - $class = new \ReflectionClass('Ratchet\Wamp\TopicManager'); - $method = $class->getMethod('getTopic'); - $method->setAccessible(true); - - $topic = $method->invokeArgs($this->mngr, array($name)); - - $this->mngr->onSubscribe($this->conn, $name); - $this->mngr->onUnsubscribe($this->conn, $name); - - $this->assertFalse($this->conn->WAMP->subscriptions->contains($topic)); - } - - public function testOnPublishBubbles() { - $msg = 'Cover all the code!'; - - $this->mock->expects($this->once())->method('onPublish')->with( - $this->conn - , $this->isInstanceOf('Ratchet\Wamp\Topic') - , $msg - , $this->isType('array') - , $this->isType('array') - ); - - $this->mngr->onPublish($this->conn, 'topic coverage', $msg, array(), array()); - } - - public function testOnCloseBubbles() { - $this->mock->expects($this->once())->method('onClose')->with($this->conn); - $this->mngr->onClose($this->conn); - } - - public function testConnIsRemovedFromTopicOnClose() { - $name = 'State testing'; - - $class = new \ReflectionClass('Ratchet\Wamp\TopicManager'); - $method = $class->getMethod('getTopic'); - $method->setAccessible(true); - - $topic = $method->invokeArgs($this->mngr, array($name)); - - $this->mngr->onSubscribe($this->conn, $name); - $this->mngr->onClose($this->conn); - - $this->assertFalse($topic->has($this->conn)); - } - - public function testOnErrorBubbles() { - $e = new \Exception('All work and no play makes Chris a dull boy'); - $this->mock->expects($this->once())->method('onError')->with($this->conn, $e); - - $this->mngr->onError($this->conn, $e); - } - - public function testGetSubProtocolsReturnsArray() { - $this->assertInternalType('array', $this->mngr->getSubProtocols()); - } - - public function testGetSubProtocolsBubbles() { - $subs = array('hello', 'world'); - $app = $this->getMock('Ratchet\Wamp\Stub\WsWampServerInterface'); - $app->expects($this->once())->method('getSubProtocols')->will($this->returnValue($subs)); - $mngr = new TopicManager($app); - - $this->assertEquals($subs, $mngr->getSubProtocols()); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicTest.php deleted file mode 100644 index 0a2102bba1..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/TopicTest.php +++ /dev/null @@ -1,112 +0,0 @@ -assertEquals($id, $topic->getId()); - } - - public function testAddAndCount() { - $topic = new Topic('merp'); - - $topic->add($this->newConn()); - $topic->add($this->newConn()); - $topic->add($this->newConn()); - - $this->assertEquals(3, count($topic)); - } - - public function testRemove() { - $topic = new Topic('boop'); - $tracked = $this->newConn(); - - $topic->add($this->newConn()); - $topic->add($tracked); - $topic->add($this->newConn()); - - $topic->remove($tracked); - - $this->assertEquals(2, count($topic)); - } - - public function testBroadcast() { - $msg = 'Hello World!'; - $name = 'Batman'; - $protocol = json_encode(array(8, $name, $msg)); - - $first = $this->getMock('Ratchet\\Wamp\\WampConnection', array('send'), array($this->getMock('\\Ratchet\\ConnectionInterface'))); - $second = $this->getMock('Ratchet\\Wamp\\WampConnection', array('send'), array($this->getMock('\\Ratchet\\ConnectionInterface'))); - - $first->expects($this->once()) - ->method('send') - ->with($this->equalTo($protocol)); - - $second->expects($this->once()) - ->method('send') - ->with($this->equalTo($protocol)); - - $topic = new Topic($name); - $topic->add($first); - $topic->add($second); - - $topic->broadcast($msg); - } - - public function testIterator() { - $first = $this->newConn(); - $second = $this->newConn(); - $third = $this->newConn(); - - $topic = new Topic('Joker'); - $topic->add($first)->add($second)->add($third); - - $check = array($first, $second, $third); - - foreach ($topic as $mock) { - $this->assertNotSame(false, array_search($mock, $check)); - } - } - - public function testToString() { - $name = 'Bane'; - $topic = new Topic($name); - - $this->assertEquals($name, (string)$topic); - } - - public function testDoesHave() { - $conn = $this->newConn(); - $topic = new Topic('Two Face'); - $topic->add($conn); - - $this->assertTrue($topic->has($conn)); - } - - public function testDoesNotHave() { - $conn = $this->newConn(); - $topic = new Topic('Alfred'); - - $this->assertFalse($topic->has($conn)); - } - - public function testDoesNotHaveAfterRemove() { - $conn = $this->newConn(); - $topic = new Topic('Ras'); - - $topic->add($conn)->remove($conn); - - $this->assertFalse($topic->has($conn)); - } - - protected function newConn() { - return new WampConnection($this->getMock('\\Ratchet\\ConnectionInterface')); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampConnectionTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampConnectionTest.php deleted file mode 100644 index 7f82f98a9b..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampConnectionTest.php +++ /dev/null @@ -1,69 +0,0 @@ -mock = $this->getMock('\\Ratchet\\ConnectionInterface'); - $this->conn = new WampConnection($this->mock); - } - - public function testCallResult() { - $callId = uniqid(); - $data = array('hello' => 'world', 'herp' => 'derp'); - - $this->mock->expects($this->once())->method('send')->with(json_encode(array(3, $callId, $data))); - - $this->conn->callResult($callId, $data); - } - - public function testCallError() { - $callId = uniqid(); - $uri = 'http://example.com/end/point'; - - $this->mock->expects($this->once())->method('send')->with(json_encode(array(4, $callId, $uri, ''))); - - $this->conn->callError($callId, $uri); - } - - public function testDetailedCallError() { - $callId = uniqid(); - $uri = 'http://example.com/end/point'; - $desc = 'beep boop beep'; - $detail = 'Error: Too much awesome'; - - $this->mock->expects($this->once())->method('send')->with(json_encode(array(4, $callId, $uri, $desc, $detail))); - - $this->conn->callError($callId, $uri, $desc, $detail); - } - - public function testPrefix() { - $shortOut = 'outgoing'; - $longOut = 'http://example.com/outgoing'; - - $this->mock->expects($this->once())->method('send')->with(json_encode(array(1, $shortOut, $longOut))); - - $this->conn->prefix($shortOut, $longOut); - } - - public function testGetUriWhenNoCurieGiven() { - $uri = 'http://example.com/noshort'; - - $this->assertEquals($uri, $this->conn->getUri($uri)); - } - - public function testClose() { - $mock = $this->getMock('\\Ratchet\\ConnectionInterface'); - $conn = new WampConnection($mock); - - $mock->expects($this->once())->method('close'); - - $conn->close(); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampServerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampServerTest.php deleted file mode 100644 index e76d69361d..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/Wamp/WampServerTest.php +++ /dev/null @@ -1,50 +0,0 @@ -_app->expects($this->once())->method('onPublish')->with( - $this->isExpectedConnection() - , new \PHPUnit_Framework_Constraint_IsInstanceOf('\Ratchet\Wamp\Topic') - , $published - , array() - , array() - ); - - $this->_serv->onMessage($this->_conn, json_encode(array(7, 'topic', $published))); - } - - public function testGetSubProtocols() { - // todo: could expand on this - $this->assertInternalType('array', $this->_serv->getSubProtocols()); - } - - public function testConnectionClosesOnInvalidJson() { - $this->_conn->expects($this->once())->method('close'); - $this->_serv->onMessage($this->_conn, 'invalid json'); - } - - public function testConnectionClosesOnProtocolError() { - $this->_conn->expects($this->once())->method('close'); - $this->_serv->onMessage($this->_conn, json_encode(array('valid' => 'json', 'invalid' => 'protocol'))); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/Hixie76Test.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/Hixie76Test.php deleted file mode 100644 index 07d863b16e..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/Hixie76Test.php +++ /dev/null @@ -1,83 +0,0 @@ -_version = new Hixie76; - } - - public function testClassImplementsVersionInterface() { - $constraint = $this->isInstanceOf('\\Ratchet\\WebSocket\\Version\\VersionInterface'); - $this->assertThat($this->_version, $constraint); - } - - /** - * @dataProvider keyProvider - */ - public function testKeySigningForHandshake($accept, $key) { - $this->assertEquals($accept, $this->_version->generateKeyNumber($key)); - } - - public static function keyProvider() { - return array( - array(179922739, '17 9 G`ZD9 2 2b 7X 3 /r90') - , array(906585445, '3e6b263 4 17 80') - , array(0, '3e6b26341780') - ); - } - - public function headerProvider() { - $key1 = base64_decode('QTN+ICszNiA2IDJvICBWOG4gNyAgc08yODhZ'); - $key2 = base64_decode('TzEyICAgeVsgIFFSNDUgM1IgLiAyOFggNC00dn4z'); - - $headers = "GET / HTTP/1.1"; - $headers .= "Upgrade: WebSocket{$this->_crlf}"; - $headers .= "Connection: Upgrade{$this->_crlf}"; - $headers .= "Host: socketo.me{$this->_crlf}"; - $headers .= "Origin: http://fiddle.jshell.net{$this->_crlf}"; - $headers .= "Sec-WebSocket-Key1:17 Z4< F94 N3 7P41 7{$this->_crlf}"; - $headers .= "Sec-WebSocket-Key2:1 23C3:,2% 1-29 4 f0{$this->_crlf}"; - $headers .= "(Key3):70:00:EE:6E:33:20:90:69{$this->_crlf}"; - $headers .= $this->_crlf; - - return $headers; - } - - public function testNoUpgradeBeforeBody() { - $headers = $this->headerProvider(); - - $mockConn = $this->getMock('\Ratchet\ConnectionInterface'); - $mockApp = $this->getMock('\Ratchet\MessageComponentInterface'); - - $server = new HttpServer(new WsServer($mockApp)); - $server->onOpen($mockConn); - $mockApp->expects($this->exactly(0))->method('onOpen'); - $server->onMessage($mockConn, $headers); - } - - public function testTcpFragmentedUpgrade() { - $headers = $this->headerProvider(); - $body = base64_decode($this->_body); - - $mockConn = $this->getMock('\Ratchet\ConnectionInterface'); - $mockApp = $this->getMock('\Ratchet\MessageComponentInterface'); - - $server = new HttpServer(new WsServer($mockApp)); - $server->onOpen($mockConn); - $server->onMessage($mockConn, $headers); - - $mockApp->expects($this->once())->method('onOpen'); - $server->onMessage($mockConn, $body . $this->_crlf . $this->_crlf); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/HyBi10Test.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/HyBi10Test.php deleted file mode 100644 index 74044dff2d..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/HyBi10Test.php +++ /dev/null @@ -1,67 +0,0 @@ -_version = new HyBi10(); - } - - /** - * Is this useful? - */ - public function testClassImplementsVersionInterface() { - $constraint = $this->isInstanceOf('\\Ratchet\\WebSocket\\Version\\VersionInterface'); - $this->assertThat($this->_version, $constraint); - } - - /** - * @dataProvider HandshakeProvider - */ - public function testKeySigningForHandshake($key, $accept) { - $this->assertEquals($accept, $this->_version->sign($key)); - } - - public static function HandshakeProvider() { - return array( - array('x3JJHMbDL1EzLkh9GBhXDw==', 'HSmrc0sMlYUkAGmm5OPpG2HaGWk=') - , array('dGhlIHNhbXBsZSBub25jZQ==', 's3pPLMBiTxaQ9kYGzzhZRbK+xOo=') - ); - } - - /** - * @dataProvider UnframeMessageProvider - */ - public function testUnframeMessage($message, $framed) { -// $decoded = $this->_version->unframe(base64_decode($framed)); - $frame = new Frame; - $frame->addBuffer(base64_decode($framed)); - - $this->assertEquals($message, $frame->getPayload()); - } - - public static function UnframeMessageProvider() { - return array( - array('Hello World!', 'gYydAIfa1WXrtvIg0LXvbOP7') - , array('!@#$%^&*()-=_+[]{}\|/.,<>`~', 'gZv+h96r38f9j9vZ+IHWrvOWoayF9oX6gtfRqfKXwOeg') - , array('ಠ_ಠ', 'gYfnSpu5B/g75gf4Ow==') - , array("The quick brown fox jumps over the lazy dog. All work and no play makes Chris a dull boy. I'm trying to get past 128 characters for a unit test here...", 'gf4Amahb14P8M7Kj2S6+4MN7tfHHLLmjzjSvo8IuuvPbe7j1zSn398A+9+/JIa6jzDSwrYh7lu/Ee6Ds2jD34sY/9+3He6fvySL37skwsvCIGL/xwSj34og/ou/Ee7Xs0XX3o+F8uqPcKa7qxjz398d7sObce6fi2y/3sppj9+DAOqXiyy+y8dt7sezae7aj3TW+94gvsvDce7/m2j75rYY=') - ); - } - - public function testUnframeMatchesPreFraming() { - $string = 'Hello World!'; - $framed = $this->_version->newFrame($string)->getContents(); - - $frame = new Frame; - $frame->addBuffer($framed); - - $this->assertEquals($string, $frame->getPayload()); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/FrameTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/FrameTest.php deleted file mode 100644 index ca4447cf12..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/FrameTest.php +++ /dev/null @@ -1,503 +0,0 @@ -_frame = new Frame; - } - - /** - * Encode the fake binary string to send over the wire - * @param string of 1's and 0's - * @return string - */ - public static function encode($in) { - if (strlen($in) > 8) { - $out = ''; - - while (strlen($in) >= 8) { - $out .= static::encode(substr($in, 0, 8)); - $in = substr($in, 8); - } - - return $out; - } - - return chr(bindec($in)); - } - - /** - * This is a data provider - * @param string The UTF8 message - * @param string The WebSocket framed message, then base64_encoded - */ - public static function UnframeMessageProvider() { - return array( - array('Hello World!', 'gYydAIfa1WXrtvIg0LXvbOP7') - , array('!@#$%^&*()-=_+[]{}\|/.,<>`~', 'gZv+h96r38f9j9vZ+IHWrvOWoayF9oX6gtfRqfKXwOeg') - , array('ಠ_ಠ', 'gYfnSpu5B/g75gf4Ow==') - , array("The quick brown fox jumps over the lazy dog. All work and no play makes Chris a dull boy. I'm trying to get past 128 characters for a unit test here...", 'gf4Amahb14P8M7Kj2S6+4MN7tfHHLLmjzjSvo8IuuvPbe7j1zSn398A+9+/JIa6jzDSwrYh7lu/Ee6Ds2jD34sY/9+3He6fvySL37skwsvCIGL/xwSj34og/ou/Ee7Xs0XX3o+F8uqPcKa7qxjz398d7sObce6fi2y/3sppj9+DAOqXiyy+y8dt7sezae7aj3TW+94gvsvDce7/m2j75rYY=') - ); - } - - public static function underflowProvider() { - return array( - array('isFinal', '') - , array('getRsv1', '') - , array('getRsv2', '') - , array('getRsv3', '') - , array('getOpcode', '') - , array('isMasked', '10000001') - , array('getPayloadLength', '10000001') - , array('getPayloadLength', '1000000111111110') - , array('getMaskingKey', '1000000110000111') - , array('getPayload', '100000011000000100011100101010101001100111110100') - ); - } - - /** - * @dataProvider underflowProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::isFinal - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getRsv1 - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getRsv2 - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getRsv3 - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getOpcode - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::isMasked - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayloadLength - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getMaskingKey - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayload - */ - public function testUnderflowExceptionFromAllTheMethodsMimickingBuffering($method, $bin) { - $this->setExpectedException('\UnderflowException'); - - if (!empty($bin)) { - $this->_frame->addBuffer(static::encode($bin)); - } - - call_user_func(array($this->_frame, $method)); - } - - /** - * A data provider for testing the first byte of a WebSocket frame - * @param bool Given, is the byte indicate this is the final frame - * @param int Given, what is the expected opcode - * @param string of 0|1 Each character represents a bit in the byte - */ - public static function firstByteProvider() { - return array( - array(false, false, false, true, 8, '00011000') - , array(true, false, true, false, 10, '10101010') - , array(false, false, false, false, 15, '00001111') - , array(true, false, false, false, 1, '10000001') - , array(true, true, true, true, 15, '11111111') - , array(true, true, false, false, 7, '11000111') - ); - } - - /** - * @dataProvider firstByteProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::isFinal - */ - public function testFinCodeFromBits($fin, $rsv1, $rsv2, $rsv3, $opcode, $bin) { - $this->_frame->addBuffer(static::encode($bin)); - $this->assertEquals($fin, $this->_frame->isFinal()); - } - - /** - * @dataProvider firstByteProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getRsv1 - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getRsv2 - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getRsv3 - */ - public function testGetRsvFromBits($fin, $rsv1, $rsv2, $rsv3, $opcode, $bin) { - $this->_frame->addBuffer(static::encode($bin)); - - $this->assertEquals($rsv1, $this->_frame->getRsv1()); - $this->assertEquals($rsv2, $this->_frame->getRsv2()); - $this->assertEquals($rsv3, $this->_frame->getRsv3()); - } - - /** - * @dataProvider firstByteProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getOpcode - */ - public function testOpcodeFromBits($fin, $rsv1, $rsv2, $rsv3, $opcode, $bin) { - $this->_frame->addBuffer(static::encode($bin)); - $this->assertEquals($opcode, $this->_frame->getOpcode()); - } - - /** - * @dataProvider UnframeMessageProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::isFinal - */ - public function testFinCodeFromFullMessage($msg, $encoded) { - $this->_frame->addBuffer(base64_decode($encoded)); - $this->assertTrue($this->_frame->isFinal()); - } - - /** - * @dataProvider UnframeMessageProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getOpcode - */ - public function testOpcodeFromFullMessage($msg, $encoded) { - $this->_frame->addBuffer(base64_decode($encoded)); - $this->assertEquals(1, $this->_frame->getOpcode()); - } - - public static function payloadLengthDescriptionProvider() { - return array( - array(7, '01110101') - , array(7, '01111101') - , array(23, '01111110') - , array(71, '01111111') - , array(7, '00000000') // Should this throw an exception? Can a payload be empty? - , array(7, '00000001') - ); - } - - /** - * @dataProvider payloadLengthDescriptionProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::addBuffer - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getFirstPayloadVal - */ - public function testFirstPayloadDesignationValue($bits, $bin) { - $this->_frame->addBuffer(static::encode($this->_firstByteFinText)); - $this->_frame->addBuffer(static::encode($bin)); - - $ref = new \ReflectionClass($this->_frame); - $cb = $ref->getMethod('getFirstPayloadVal'); - $cb->setAccessible(true); - - $this->assertEquals(bindec($bin), $cb->invoke($this->_frame)); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getFirstPayloadVal - */ - public function testFirstPayloadValUnderflow() { - $ref = new \ReflectionClass($this->_frame); - $cb = $ref->getMethod('getFirstPayloadVal'); - $cb->setAccessible(true); - - $this->setExpectedException('UnderflowException'); - $cb->invoke($this->_frame); - } - - /** - * @dataProvider payloadLengthDescriptionProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getNumPayloadBits - */ - public function testDetermineHowManyBitsAreUsedToDescribePayload($expected_bits, $bin) { - $this->_frame->addBuffer(static::encode($this->_firstByteFinText)); - $this->_frame->addBuffer(static::encode($bin)); - - $ref = new \ReflectionClass($this->_frame); - $cb = $ref->getMethod('getNumPayloadBits'); - $cb->setAccessible(true); - - $this->assertEquals($expected_bits, $cb->invoke($this->_frame)); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getNumPayloadBits - */ - public function testgetNumPayloadBitsUnderflow() { - $ref = new \ReflectionClass($this->_frame); - $cb = $ref->getMethod('getNumPayloadBits'); - $cb->setAccessible(true); - - $this->setExpectedException('UnderflowException'); - $cb->invoke($this->_frame); - } - - public function secondByteProvider() { - return array( - array(true, 1, '10000001') - , array(false, 1, '00000001') - , array(true, 125, $this->_secondByteMaskedSPL) - ); - } - - /** - * @dataProvider secondByteProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::isMasked - */ - public function testIsMaskedReturnsExpectedValue($masked, $payload_length, $bin) { - $this->_frame->addBuffer(static::encode($this->_firstByteFinText)); - $this->_frame->addBuffer(static::encode($bin)); - - $this->assertEquals($masked, $this->_frame->isMasked()); - } - - /** - * @dataProvider UnframeMessageProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::isMasked - */ - public function testIsMaskedFromFullMessage($msg, $encoded) { - $this->_frame->addBuffer(base64_decode($encoded)); - $this->assertTrue($this->_frame->isMasked()); - } - - /** - * @dataProvider secondByteProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayloadLength - */ - public function testGetPayloadLengthWhenOnlyFirstFrameIsUsed($masked, $payload_length, $bin) { - $this->_frame->addBuffer(static::encode($this->_firstByteFinText)); - $this->_frame->addBuffer(static::encode($bin)); - - $this->assertEquals($payload_length, $this->_frame->getPayloadLength()); - } - - /** - * @dataProvider UnframeMessageProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayloadLength - * @todo Not yet testing when second additional payload length descriptor - */ - public function testGetPayloadLengthFromFullMessage($msg, $encoded) { - $this->_frame->addBuffer(base64_decode($encoded)); - $this->assertEquals(strlen($msg), $this->_frame->getPayloadLength()); - } - - public function maskingKeyProvider() { - $frame = new Frame; - - return array( - array($frame->generateMaskingKey()) - , array($frame->generateMaskingKey()) - , array($frame->generateMaskingKey()) - ); - } - - /** - * @dataProvider maskingKeyProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getMaskingKey - * @todo I I wrote the dataProvider incorrectly, skipping for now - */ - public function testGetMaskingKey($mask) { - $this->_frame->addBuffer(static::encode($this->_firstByteFinText)); - $this->_frame->addBuffer(static::encode($this->_secondByteMaskedSPL)); - $this->_frame->addBuffer($mask); - - $this->assertEquals($mask, $this->_frame->getMaskingKey()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getMaskingKey - */ - public function testGetMaskingKeyOnUnmaskedPayload() { - $frame = new Frame('Hello World!'); - - $this->assertEquals('', $frame->getMaskingKey()); - } - - /** - * @dataProvider UnframeMessageProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayload - * @todo Move this test to bottom as it requires all methods of the class - */ - public function testUnframeFullMessage($unframed, $base_framed) { - $this->_frame->addBuffer(base64_decode($base_framed)); - $this->assertEquals($unframed, $this->_frame->getPayload()); - } - - public static function messageFragmentProvider() { - return array( - array(false, '', '', '', '', '') - ); - } - - /** - * @dataProvider UnframeMessageProvider - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayload - */ - public function testCheckPiecingTogetherMessage($msg, $encoded) { - $framed = base64_decode($encoded); - for ($i = 0, $len = strlen($framed);$i < $len; $i++) { - $this->_frame->addBuffer(substr($framed, $i, 1)); - } - - $this->assertEquals($msg, $this->_frame->getPayload()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::__construct - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayloadLength - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayload - */ - public function testLongCreate() { - $len = 65525; - $pl = $this->generateRandomString($len); - - $frame = new Frame($pl, true, Frame::OP_PING); - - $this->assertTrue($frame->isFinal()); - $this->assertEquals(Frame::OP_PING, $frame->getOpcode()); - $this->assertFalse($frame->isMasked()); - $this->assertEquals($len, $frame->getPayloadLength()); - $this->assertEquals($pl, $frame->getPayload()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::__construct - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getPayloadLength - */ - public function testReallyLongCreate() { - $len = 65575; - - $frame = new Frame($this->generateRandomString($len)); - - $this->assertEquals($len, $frame->getPayloadLength()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::__construct - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::extractOverflow - */ - public function testExtractOverflow() { - $string1 = $this->generateRandomString(); - $frame1 = new Frame($string1); - - $string2 = $this->generateRandomString(); - $frame2 = new Frame($string2); - - $cat = new Frame; - $cat->addBuffer($frame1->getContents() . $frame2->getContents()); - - $this->assertEquals($frame1->getContents(), $cat->getContents()); - $this->assertEquals($string1, $cat->getPayload()); - - $uncat = new Frame; - $uncat->addBuffer($cat->extractOverflow()); - - $this->assertEquals($string1, $cat->getPayload()); - $this->assertEquals($string2, $uncat->getPayload()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::extractOverflow - */ - public function testEmptyExtractOverflow() { - $string = $this->generateRandomString(); - $frame = new Frame($string); - - $this->assertEquals($string, $frame->getPayload()); - $this->assertEquals('', $frame->extractOverflow()); - $this->assertEquals($string, $frame->getPayload()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::getContents - */ - public function testGetContents() { - $msg = 'The quick brown fox jumps over the lazy dog.'; - - $frame1 = new Frame($msg); - $frame2 = new Frame($msg); - $frame2->maskPayload(); - - $this->assertNotEquals($frame1->getContents(), $frame2->getContents()); - $this->assertEquals(strlen($frame1->getContents()) + 4, strlen($frame2->getContents())); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::maskPayload - */ - public function testMasking() { - $msg = 'The quick brown fox jumps over the lazy dog.'; - $frame = new Frame($msg); - $frame->maskPayload(); - - $this->assertTrue($frame->isMasked()); - $this->assertEquals($msg, $frame->getPayload()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::unMaskPayload - */ - public function testUnMaskPayload() { - $string = $this->generateRandomString(); - $frame = new Frame($string); - $frame->maskPayload()->unMaskPayload(); - - $this->assertFalse($frame->isMasked()); - $this->assertEquals($string, $frame->getPayload()); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::generateMaskingKey - */ - public function testGenerateMaskingKey() { - $dupe = false; - $done = array(); - - for ($i = 0; $i < 10; $i++) { - $new = $this->_frame->generateMaskingKey(); - - if (in_array($new, $done)) { - $dupe = true; - } - - $done[] = $new; - } - - $this->assertEquals(4, strlen($new)); - $this->assertFalse($dupe); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::maskPayload - */ - public function testGivenMaskIsValid() { - $this->setExpectedException('InvalidArgumentException'); - $this->_frame->maskPayload('hello world'); - } - - /** - * @covers Ratchet\WebSocket\Version\RFC6455\Frame::maskPayload - */ - public function testGivenMaskIsValidAscii() { - if (!extension_loaded('mbstring')) { - return $this->markTestSkipped("mbstring required for this test"); - } - - $this->setExpectedException('OutOfBoundsException'); - $this->_frame->maskPayload('x✖'); - } - - protected function generateRandomString($length = 10, $addSpaces = true, $addNumbers = true) { - $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"$%&/()=[]{}'; // ยง - - $useChars = array(); - for($i = 0; $i < $length; $i++) { - $useChars[] = $characters[mt_rand(0, strlen($characters) - 1)]; - } - - if($addSpaces === true) { - array_push($useChars, ' ', ' ', ' ', ' ', ' ', ' '); - } - - if($addNumbers === true) { - array_push($useChars, rand(0, 9), rand(0, 9), rand(0, 9)); - } - - shuffle($useChars); - - $randomString = trim(implode('', $useChars)); - $randomString = substr($randomString, 0, $length); - - return $randomString; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/HandshakeVerifierTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/HandshakeVerifierTest.php deleted file mode 100644 index cdaec6d10a..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/HandshakeVerifierTest.php +++ /dev/null @@ -1,170 +0,0 @@ -_v = new HandshakeVerifier; - } - - public static function methodProvider() { - return array( - array(true, 'GET') - , array(true, 'get') - , array(true, 'Get') - , array(false, 'POST') - , array(false, 'DELETE') - , array(false, 'PUT') - , array(false, 'PATCH') - ); - } - - /** - * @dataProvider methodProvider - */ - public function testMethodMustBeGet($result, $in) { - $this->assertEquals($result, $this->_v->verifyMethod($in)); - } - - public static function httpVersionProvider() { - return array( - array(true, 1.1) - , array(true, '1.1') - , array(true, 1.2) - , array(true, '1.2') - , array(true, 2) - , array(true, '2') - , array(true, '2.0') - , array(false, '1.0') - , array(false, 1) - , array(false, '0.9') - , array(false, '') - , array(false, 'hello') - ); - } - - /** - * @dataProvider httpVersionProvider - */ - public function testHttpVersionIsAtLeast1Point1($expected, $in) { - $this->assertEquals($expected, $this->_v->verifyHTTPVersion($in)); - } - - public static function uRIProvider() { - return array( - array(true, '/chat') - , array(true, '/hello/world?key=val') - , array(false, '/chat#bad') - , array(false, 'nope') - , array(false, '/ ಠ_ಠ ') - , array(false, '/✖') - ); - } - - /** - * @dataProvider URIProvider - */ - public function testRequestUri($expected, $in) { - $this->assertEquals($expected, $this->_v->verifyRequestURI($in)); - } - - public static function hostProvider() { - return array( - array(true, 'server.example.com') - , array(false, null) - ); - } - - /** - * @dataProvider HostProvider - */ - public function testVerifyHostIsSet($expected, $in) { - $this->assertEquals($expected, $this->_v->verifyHost($in)); - } - - public static function upgradeProvider() { - return array( - array(true, 'websocket') - , array(true, 'Websocket') - , array(true, 'webSocket') - , array(false, null) - , array(false, '') - ); - } - - /** - * @dataProvider upgradeProvider - */ - public function testVerifyUpgradeIsWebSocket($expected, $val) { - $this->assertEquals($expected, $this->_v->verifyUpgradeRequest($val)); - } - - public static function connectionProvider() { - return array( - array(true, 'Upgrade') - , array(true, 'upgrade') - , array(true, 'keep-alive, Upgrade') - , array(true, 'Upgrade, keep-alive') - , array(true, 'keep-alive, Upgrade, something') - , array(false, '') - , array(false, null) - ); - } - - /** - * @dataProvider connectionProvider - */ - public function testConnectionHeaderVerification($expected, $val) { - $this->assertEquals($expected, $this->_v->verifyConnection($val)); - } - - public static function keyProvider() { - return array( - array(true, 'hkfa1L7uwN6DCo4IS3iWAw==') - , array(true, '765vVoQpKSGJwPzJIMM2GA==') - , array(true, 'AQIDBAUGBwgJCgsMDQ4PEC==') - , array(true, 'axa2B/Yz2CdpfQAY2Q5P7w==') - , array(false, 0) - , array(false, 'Hello World') - , array(false, '1234567890123456') - , array(false, '123456789012345678901234') - , array(true, base64_encode('UTF8allthngs+✓')) - , array(true, 'dGhlIHNhbXBsZSBub25jZQ==') - ); - } - - /** - * @dataProvider keyProvider - */ - public function testKeyIsBase64Encoded16BitNonce($expected, $val) { - $this->assertEquals($expected, $this->_v->verifyKey($val)); - } - - public static function versionProvider() { - return array( - array(true, 13) - , array(true, '13') - , array(false, 12) - , array(false, 14) - , array(false, '14') - , array(false, 'hi') - , array(false, '') - , array(false, null) - ); - } - - /** - * @dataProvider versionProvider - */ - public function testVersionEquals13($expected, $in) { - $this->assertEquals($expected, $this->_v->verifyVersion($in)); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/MessageTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/MessageTest.php deleted file mode 100644 index 4b7217064b..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455/MessageTest.php +++ /dev/null @@ -1,63 +0,0 @@ -message = new Message; - } - - public function testNoFrames() { - $this->assertFalse($this->message->isCoalesced()); - } - - public function testNoFramesOpCode() { - $this->setExpectedException('UnderflowException'); - $this->message->getOpCode(); - } - - public function testFragmentationPayload() { - $a = 'Hello '; - $b = 'World!'; - - $f1 = new Frame($a, false); - $f2 = new Frame($b, true, Frame::OP_CONTINUE); - - $this->message->addFrame($f1)->addFrame($f2); - - $this->assertEquals(strlen($a . $b), $this->message->getPayloadLength()); - $this->assertEquals($a . $b, $this->message->getPayload()); - } - - public function testUnbufferedFragment() { - $this->message->addFrame(new Frame('The quick brow', false)); - - $this->setExpectedException('UnderflowException'); - $this->message->getPayload(); - } - - public function testGetOpCode() { - $this->message - ->addFrame(new Frame('The quick brow', false, Frame::OP_TEXT)) - ->addFrame(new Frame('n fox jumps ov', false, Frame::OP_CONTINUE)) - ->addFrame(new Frame('er the lazy dog', true, Frame::OP_CONTINUE)) - ; - - $this->assertEquals(Frame::OP_TEXT, $this->message->getOpCode()); - } - - public function testGetUnBufferedPayloadLength() { - $this->message - ->addFrame(new Frame('The quick brow', false, Frame::OP_TEXT)) - ->addFrame(new Frame('n fox jumps ov', false, Frame::OP_CONTINUE)) - ; - - $this->assertEquals(28, $this->message->getPayloadLength()); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455Test.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455Test.php deleted file mode 100644 index 89a9ae6b8e..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/Version/RFC6455Test.php +++ /dev/null @@ -1,151 +0,0 @@ -version = new RFC6455; - } - - /** - * @dataProvider handshakeProvider - */ - public function testKeySigningForHandshake($key, $accept) { - $this->assertEquals($accept, $this->version->sign($key)); - } - - public static function handshakeProvider() { - return array( - array('x3JJHMbDL1EzLkh9GBhXDw==', 'HSmrc0sMlYUkAGmm5OPpG2HaGWk=') - , array('dGhlIHNhbXBsZSBub25jZQ==', 's3pPLMBiTxaQ9kYGzzhZRbK+xOo=') - ); - } - - /** - * @dataProvider UnframeMessageProvider - */ - public function testUnframeMessage($message, $framed) { - $frame = new Frame; - $frame->addBuffer(base64_decode($framed)); - - $this->assertEquals($message, $frame->getPayload()); - } - - public static function UnframeMessageProvider() { - return array( - array('Hello World!', 'gYydAIfa1WXrtvIg0LXvbOP7') - , array('!@#$%^&*()-=_+[]{}\|/.,<>`~', 'gZv+h96r38f9j9vZ+IHWrvOWoayF9oX6gtfRqfKXwOeg') - , array('ಠ_ಠ', 'gYfnSpu5B/g75gf4Ow==') - , array("The quick brown fox jumps over the lazy dog. All work and no play makes Chris a dull boy. I'm trying to get past 128 characters for a unit test here...", 'gf4Amahb14P8M7Kj2S6+4MN7tfHHLLmjzjSvo8IuuvPbe7j1zSn398A+9+/JIa6jzDSwrYh7lu/Ee6Ds2jD34sY/9+3He6fvySL37skwsvCIGL/xwSj34og/ou/Ee7Xs0XX3o+F8uqPcKa7qxjz398d7sObce6fi2y/3sppj9+DAOqXiyy+y8dt7sezae7aj3TW+94gvsvDce7/m2j75rYY=') - ); - } - - public function testUnframeMatchesPreFraming() { - $string = 'Hello World!'; - $framed = $this->version->newFrame($string)->getContents(); - - $frame = new Frame; - $frame->addBuffer($framed); - - $this->assertEquals($string, $frame->getPayload()); - } - - public static $good_rest = 'GET /chat HTTP/1.1'; - - public static $good_header = array( - 'Host' => 'server.example.com' - , 'Upgrade' => 'websocket' - , 'Connection' => 'Upgrade' - , 'Sec-WebSocket-Key' => 'dGhlIHNhbXBsZSBub25jZQ==' - , 'Origin' => 'http://example.com' - , 'Sec-WebSocket-Protocol' => 'chat, superchat' - , 'Sec-WebSocket-Version' => 13 - ); - - public function caseVariantProvider() { - return array( - array('Sec-Websocket-Version') - , array('sec-websocket-version') - , array('SEC-WEBSOCKET-VERSION') - , array('sEC-wEBsOCKET-vERSION') - ); - } - - /** - * @dataProvider caseVariantProvider - */ - public function testIsProtocolWithCaseInsensitivity($headerName) { - $header = static::$good_header; - unset($header['Sec-WebSocket-Version']); - $header[$headerName] = 13; - - $this->assertTrue($this->version->isProtocol(new EntityEnclosingRequest('get', '/', $header))); - } - - /** - * A helper function to try and quickly put together a valid WebSocket HTTP handshake - * but optionally replace a piece to an invalid value for failure testing - */ - public static function getAndSpliceHeader($key = null, $val = null) { - $headers = static::$good_header; - - if (null !== $key && null !== $val) { - $headers[$key] = $val; - } - - $header = ''; - foreach ($headers as $key => $val) { - if (!empty($key)) { - $header .= "{$key}: "; - } - - $header .= "{$val}\r\n"; - } - $header .= "\r\n"; - - return $header; - } - - public static function headerHandshakeProvider() { - return array( - array(false, "GET /test HTTP/1.0\r\n" . static::getAndSpliceHeader()) - , array(true, static::$good_rest . "\r\n" . static::getAndSpliceHeader()) - , array(false, "POST / HTTP:/1.1\r\n" . static::getAndSpliceHeader()) - , array(false, static::$good_rest . "\r\n" . static::getAndSpliceHeader('Upgrade', 'useless')) - , array(false, "GET /ಠ_ಠ HTTP/1.1\r\n" . static::getAndSpliceHeader()) - , array(true, static::$good_rest . "\r\n" . static::getAndSpliceHeader('Connection', 'Herp, Upgrade, Derp')) - ); - } - - /** - * @dataProvider headerHandshakeProvider - */ - public function testVariousHeadersToCheckHandshakeTolerance($pass, $header) { - $request = RequestFactory::getInstance()->fromMessage($header); - $response = $this->version->handshake($request); - - $this->assertInstanceOf('\\Guzzle\\Http\\Message\\Response', $response); - - if ($pass) { - $this->assertEquals(101, $response->getStatusCode()); - } else { - $this->assertGreaterThanOrEqual(400, $response->getStatusCode()); - } - } - - public function testNewMessage() { - $this->assertInstanceOf('\\Ratchet\\WebSocket\\Version\\RFC6455\\Message', $this->version->newMessage()); - } - - public function testNewFrame() { - $this->assertInstanceOf('\\Ratchet\\WebSocket\\Version\\RFC6455\\Frame', $this->version->newFrame()); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/VersionManagerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/VersionManagerTest.php deleted file mode 100644 index 6083548286..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/VersionManagerTest.php +++ /dev/null @@ -1,91 +0,0 @@ -vm = new VersionManager; - } - - public function testFluentInterface() { - $rfc = new RFC6455; - - $this->assertSame($this->vm, $this->vm->enableVersion($rfc)); - $this->assertSame($this->vm, $this->vm->disableVersion(13)); - } - - public function testGetVersion() { - $rfc = new RFC6455; - $this->vm->enableVersion($rfc); - - $req = new EntityEnclosingRequest('get', '/', array( - 'Host' => 'socketo.me' - , 'Sec-WebSocket-Version' => 13 - )); - - $this->assertSame($rfc, $this->vm->getVersion($req)); - } - - public function testGetNopeVersionAndDisable() { - $req = new EntityEnclosingRequest('get', '/', array( - 'Host' => 'socketo.me' - , 'Sec-WebSocket-Version' => 13 - )); - - $this->setExpectedException('InvalidArgumentException'); - - $this->vm->getVersion($req); - } - - public function testYesIsVersionEnabled() { - $this->vm->enableVersion(new RFC6455); - - $this->assertTrue($this->vm->isVersionEnabled(new EntityEnclosingRequest('get', '/', array( - 'Host' => 'socketo.me' - , 'Sec-WebSocket-Version' => 13 - )))); - } - - public function testNoIsVersionEnabled() { - $this->assertFalse($this->vm->isVersionEnabled(new EntityEnclosingRequest('get', '/', array( - 'Host' => 'socketo.me' - , 'Sec-WebSocket-Version' => 9000 - )))); - } - - public function testGetSupportedVersionString() { - $v1 = new RFC6455; - $v2 = new HyBi10; - - $this->vm->enableVersion($v1); - $this->vm->enableVersion($v2); - - $string = $this->vm->getSupportedVersionString(); - $values = explode(',', $string); - - $this->assertContains($v1->getVersionNumber(), $values); - $this->assertContains($v2->getVersionNumber(), $values); - } - - public function testGetSupportedVersionAfterRemoval() { - $this->vm->enableVersion(new RFC6455); - $this->vm->enableVersion(new HyBi10); - $this->vm->enableVersion(new Hixie76); - - $this->vm->disableVersion(0); - - $values = explode(',', $this->vm->getSupportedVersionString()); - - $this->assertEquals(2, count($values)); - $this->assertFalse(array_search(0, $values)); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/WsServerTest.php b/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/WsServerTest.php deleted file mode 100644 index c923e16842..0000000000 --- a/app/Vendor/Ratchet/vendor/cboden/ratchet/tests/unit/WebSocket/WsServerTest.php +++ /dev/null @@ -1,51 +0,0 @@ -comp = new MockComponent; - $this->serv = new WsServer($this->comp); - } - - public function testIsSubProtocolSupported() { - $this->comp->protocols = array('hello', 'world'); - - $this->assertTrue($this->serv->isSubProtocolSupported('hello')); - $this->assertFalse($this->serv->isSubProtocolSupported('nope')); - } - - public function protocolProvider() { - return array( - array('hello', array('hello', 'world'), array('hello', 'world')) - , array('', array('hello', 'world'), array('wamp')) - , array('', array(), null) - , array('wamp', array('hello', 'wamp', 'world'), array('herp', 'derp', 'wamp')) - , array('wamp', array('wamp'), array('wamp')) - ); - } - - /** - * @dataProvider protocolProvider - */ - public function testGetSubProtocolString($expected, $supported, $requested) { - $this->comp->protocols = $supported; - $req = (null === $requested ? $requested : new \ArrayIterator($requested)); - - $class = new \ReflectionClass('Ratchet\\WebSocket\\WsServer'); - $method = $class->getMethod('getSubProtocolString'); - $method->setAccessible(true); - - $this->assertSame($expected, $method->invokeArgs($this->serv, array($req))); - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/composer/ClassLoader.php b/app/Vendor/Ratchet/vendor/composer/ClassLoader.php deleted file mode 100644 index f438e319cd..0000000000 --- a/app/Vendor/Ratchet/vendor/composer/ClassLoader.php +++ /dev/null @@ -1,354 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0 class loader - * - * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - - public function getPrefixes() - { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-0 base directories - * @param bool $prepend Whether to prepend the directories - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - */ - public function setPsr4($prefix, $paths) { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - include $file; - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 - if ('\\' == $class[0]) { - $class = substr($class, 1); - } - - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . '.php'; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { - if (0 === strpos($class, $prefix)) { - foreach ($this->prefixDirsPsr4[$prefix] as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . '.php'; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - // Remember that this class does not exist. - return $this->classMap[$class] = false; - } -} diff --git a/app/Vendor/Ratchet/vendor/composer/autoload_classmap.php b/app/Vendor/Ratchet/vendor/composer/autoload_classmap.php deleted file mode 100644 index 2cc2fd2c08..0000000000 --- a/app/Vendor/Ratchet/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,10 +0,0 @@ - $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php', -); diff --git a/app/Vendor/Ratchet/vendor/composer/autoload_namespaces.php b/app/Vendor/Ratchet/vendor/composer/autoload_namespaces.php deleted file mode 100644 index 0f0ed6cada..0000000000 --- a/app/Vendor/Ratchet/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,28 +0,0 @@ - array($vendorDir . '/symfony/routing'), - 'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'), - 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), - 'React\\Promise' => array($vendorDir . '/react/promise/src'), - 'React' => array($vendorDir . '/react/react/src'), - 'Ratchet\\Website' => array($baseDir . '/src'), - 'Ratchet\\Tutorials' => array($baseDir . '/src'), - 'Ratchet\\Tests\\Website' => array($baseDir . '/tests'), - 'Ratchet\\Tests\\Tutorials' => array($baseDir . '/tests'), - 'Ratchet\\Tests\\Cookbook' => array($baseDir . '/tests'), - 'Ratchet\\Cookbook' => array($baseDir . '/src'), - 'Ratchet' => array($vendorDir . '/cboden/ratchet/src'), - 'Psr\\Log\\' => array($vendorDir . '/psr/log'), - 'Monolog' => array($vendorDir . '/monolog/monolog/src'), - 'Guzzle\\Stream' => array($vendorDir . '/guzzle/stream'), - 'Guzzle\\Parser' => array($vendorDir . '/guzzle/parser'), - 'Guzzle\\Http' => array($vendorDir . '/guzzle/http'), - 'Guzzle\\Common' => array($vendorDir . '/guzzle/common'), - 'Evenement' => array($vendorDir . '/evenement/evenement/src'), -); diff --git a/app/Vendor/Ratchet/vendor/composer/autoload_psr4.php b/app/Vendor/Ratchet/vendor/composer/autoload_psr4.php deleted file mode 100644 index b265c64a22..0000000000 --- a/app/Vendor/Ratchet/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,9 +0,0 @@ - $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - - $loader->register(true); - - return $loader; - } -} diff --git a/app/Vendor/Ratchet/vendor/composer/installed.json b/app/Vendor/Ratchet/vendor/composer/installed.json deleted file mode 100644 index dbc361b8e3..0000000000 --- a/app/Vendor/Ratchet/vendor/composer/installed.json +++ /dev/null @@ -1,737 +0,0 @@ -[ - { - "name": "guzzle/parser", - "version": "v3.8.1", - "version_normalized": "3.8.1.0", - "target-dir": "Guzzle/Parser", - "source": { - "type": "git", - "url": "https://github.com/guzzle/parser.git", - "reference": "3f52387052f2e4ef083145a0f73c3654aa14e086" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/parser/zipball/3f52387052f2e4ef083145a0f73c3654aa14e086", - "reference": "3f52387052f2e4ef083145a0f73c3654aa14e086", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "time": "2013-10-24 00:04:09", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Guzzle\\Parser": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Interchangeable parsers used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "URI Template", - "cookie", - "http", - "message", - "url" - ] - }, - { - "name": "psr/log", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "a78d6504ff5d4367497785ab2ade91db3a9fbe11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/a78d6504ff5d4367497785ab2ade91db3a9fbe11", - "reference": "a78d6504ff5d4367497785ab2ade91db3a9fbe11", - "shasum": "" - }, - "time": "2014-01-18 15:33:09", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "Psr\\Log\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "keywords": [ - "log", - "psr", - "psr-3" - ] - }, - { - "name": "symfony/event-dispatcher", - "version": "dev-master", - "version_normalized": "9999999-dev", - "target-dir": "Symfony/Component/EventDispatcher", - "source": { - "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "8f680ceb1eaec6f5f2404bea5c1c2af516a68494" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/8f680ceb1eaec6f5f2404bea5c1c2af516a68494", - "reference": "8f680ceb1eaec6f5f2404bea5c1c2af516a68494", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/dependency-injection": "~2.0", - "symfony/stopwatch": "~2.2" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "time": "2014-02-04 11:21:37", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "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 EventDispatcher Component", - "homepage": "http://symfony.com" - }, - { - "name": "guzzle/common", - "version": "v3.8.1", - "version_normalized": "3.8.1.0", - "target-dir": "Guzzle/Common", - "source": { - "type": "git", - "url": "https://github.com/guzzle/common.git", - "reference": "67f6c3fd04bae387d47c2a673fa623ed8f4189bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/common/zipball/67f6c3fd04bae387d47c2a673fa623ed8f4189bb", - "reference": "67f6c3fd04bae387d47c2a673fa623ed8f4189bb", - "shasum": "" - }, - "require": { - "php": ">=5.3.2", - "symfony/event-dispatcher": ">=2.1" - }, - "time": "2014-01-28 22:29:15", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Guzzle\\Common": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Common libraries used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "collection", - "common", - "event", - "exception" - ] - }, - { - "name": "guzzle/stream", - "version": "v3.8.1", - "version_normalized": "3.8.1.0", - "target-dir": "Guzzle/Stream", - "source": { - "type": "git", - "url": "https://github.com/guzzle/stream.git", - "reference": "fa8af730ca714861c0001cfba64aaecc5f21bb96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/stream/zipball/fa8af730ca714861c0001cfba64aaecc5f21bb96", - "reference": "fa8af730ca714861c0001cfba64aaecc5f21bb96", - "shasum": "" - }, - "require": { - "guzzle/common": "self.version", - "php": ">=5.3.2" - }, - "suggest": { - "guzzle/http": "To convert Guzzle request objects to PHP streams" - }, - "time": "2014-01-28 22:14:17", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Guzzle\\Stream": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle stream wrapper component", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "Guzzle", - "component", - "stream" - ] - }, - { - "name": "guzzle/http", - "version": "v3.8.1", - "version_normalized": "3.8.1.0", - "target-dir": "Guzzle/Http", - "source": { - "type": "git", - "url": "https://github.com/guzzle/http.git", - "reference": "565fd64be16d91c840f497c5de76f86d54a822d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/http/zipball/565fd64be16d91c840f497c5de76f86d54a822d8", - "reference": "565fd64be16d91c840f497c5de76f86d54a822d8", - "shasum": "" - }, - "require": { - "guzzle/common": "self.version", - "guzzle/parser": "self.version", - "guzzle/stream": "self.version", - "php": ">=5.3.2" - }, - "suggest": { - "ext-curl": "*" - }, - "time": "2014-01-23 18:23:29", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Guzzle\\Http": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "HTTP libraries used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "Guzzle", - "client", - "curl", - "http", - "http client" - ] - }, - { - "name": "symfony/routing", - "version": "dev-master", - "version_normalized": "9999999-dev", - "target-dir": "Symfony/Component/Routing", - "source": { - "type": "git", - "url": "https://github.com/symfony/Routing.git", - "reference": "de78561327de0ed8b463b9c2a9d23f775720d01d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/de78561327de0ed8b463b9c2a9d23f775720d01d", - "reference": "de78561327de0ed8b463b9c2a9d23f775720d01d", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "psr/log": "~1.0", - "symfony/config": "~2.2", - "symfony/expression-language": "~2.4", - "symfony/yaml": "~2.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/yaml": "For using the YAML loader" - }, - "time": "2014-02-03 11:24:19", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "Symfony\\Component\\Routing\\": "" - } - }, - "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 Routing Component", - "homepage": "http://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ] - }, - { - "name": "symfony/http-foundation", - "version": "dev-master", - "version_normalized": "9999999-dev", - "target-dir": "Symfony/Component/HttpFoundation", - "source": { - "type": "git", - "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "70ab340b31615dbf95727cb2246c784f04da837d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/70ab340b31615dbf95727cb2246c784f04da837d", - "reference": "70ab340b31615dbf95727cb2246c784f04da837d", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2014-02-03 17:15:42", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "classmap": [ - "Symfony/Component/HttpFoundation/Resources/stubs" - ] - }, - "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 HttpFoundation Component", - "homepage": "http://symfony.com" - }, - { - "name": "cboden/ratchet", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/cboden/Ratchet.git", - "reference": "36215fbc7b1c072109bb9f675b9836a5c2190763" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cboden/Ratchet/zipball/36215fbc7b1c072109bb9f675b9836a5c2190763", - "reference": "36215fbc7b1c072109bb9f675b9836a5c2190763", - "shasum": "" - }, - "require": { - "guzzle/http": ">=3.6.0,<3.9.0-dev", - "php": ">=5.3.9", - "react/socket": ">=0.3.0,<0.5-dev", - "symfony/http-foundation": "~2.2", - "symfony/routing": "~2.2" - }, - "time": "2014-02-05 01:42:38", - "type": "library", - "installation-source": "source", - "autoload": { - "psr-0": { - "Ratchet": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "http://res.im", - "role": "Developer" - } - ], - "description": "PHP WebSocket library", - "homepage": "http://socketo.me", - "keywords": [ - "Ratchet", - "WebSockets", - "server", - "sockets" - ] - }, - { - "name": "monolog/monolog", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "7f783c0ab09dc341f858882e2d2ce6fc36ca1351" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/7f783c0ab09dc341f858882e2d2ce6fc36ca1351", - "reference": "7f783c0ab09dc341f858882e2d2ce6fc36ca1351", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "require-dev": { - "aws/aws-sdk-php": "~2.4.8", - "doctrine/couchdb": "dev-master", - "mlehner/gelf-php": "1.0.*", - "phpunit/phpunit": "~3.7.0", - "raven/raven": "~0.5", - "ruflin/elastica": "0.90.*" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server", - "raven/raven": "Allow sending log messages to a Sentry server", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "time": "2014-01-17 14:16:06", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7.x-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "Monolog": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be", - "role": "Developer" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ] - }, - { - "name": "cujojs/when", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/cujojs/when.git", - "reference": "00fdea1f49c697f97754b8ed6416082f362830ad" - }, - "type": "library", - "installation-source": "source" - }, - { - "name": "tavendo/AutobahnJS", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/tavendo/AutobahnJS.git", - "reference": "v0.6.0" - }, - "type": "library", - "installation-source": "source" - }, - { - "name": "gimite/web-socket-js", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/gimite/web-socket-js", - "reference": "master" - }, - "type": "library", - "installation-source": "source" - }, - { - "name": "react/promise", - "version": "1.0.x-dev", - "version_normalized": "1.0.9999999.9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "d6de8cae1dbb4878d909c41cb89aff764504472c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/d6de8cae1dbb4878d909c41cb89aff764504472c", - "reference": "d6de8cae1dbb4878d909c41cb89aff764504472c", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2013-04-03 14:05:55", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "React\\Promise": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@googlemail.com", - "homepage": "http://sorgalla.com", - "role": "maintainer" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP" - }, - { - "name": "evenement/evenement", - "version": "1.0.x-dev", - "version_normalized": "1.0.9999999.9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "8b0918f8374327dfed4408fe467980ab41d556dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/8b0918f8374327dfed4408fe467980ab41d556dd", - "reference": "8b0918f8374327dfed4408fe467980ab41d556dd", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2012-12-29 17:04:52", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "Evenement": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch", - "homepage": "http://wiedler.ch/igor/" - } - ], - "description": "Événement is a very simple event dispatching library for PHP 5.3", - "keywords": [ - "event-dispatcher" - ] - }, - { - "name": "react/react", - "version": "0.3.x-dev", - "version_normalized": "0.3.9999999.9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/reactphp/react.git", - "reference": "0dac387e29f10db50dc23acc1da746f53862a662" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/react/zipball/0dac387e29f10db50dc23acc1da746f53862a662", - "reference": "0dac387e29f10db50dc23acc1da746f53862a662", - "shasum": "" - }, - "require": { - "evenement/evenement": "1.0.*", - "guzzle/parser": "~3.0", - "php": ">=5.3.3", - "react/promise": "~1.0" - }, - "replace": { - "react/cache": "self.version", - "react/dns": "self.version", - "react/event-loop": "self.version", - "react/http": "self.version", - "react/http-client": "self.version", - "react/socket": "self.version", - "react/socket-client": "self.version", - "react/stream": "self.version" - }, - "suggest": { - "ext-libev": "*", - "ext-libevent": "*" - }, - "time": "2013-09-22 12:33:29", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "React": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Nuclear Reactor written in PHP.", - "keywords": [ - "event-loop", - "reactor" - ] - } -] diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/.gitignore b/app/Vendor/Ratchet/vendor/cujojs/when/.gitignore deleted file mode 100644 index 4ccbb5bc6a..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.npmignore -.idea/ -experiments/ -node_modules/ \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/.gitmodules b/app/Vendor/Ratchet/vendor/cujojs/when/.gitmodules deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/.travis.yml b/app/Vendor/Ratchet/vendor/cujojs/when/.travis.yml deleted file mode 100644 index 2d26206d58..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - 0.6 diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/LICENSE.txt b/app/Vendor/Ratchet/vendor/cujojs/when/LICENSE.txt deleted file mode 100644 index 09a1063e40..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/LICENSE.txt +++ /dev/null @@ -1,24 +0,0 @@ -Open Source Initiative OSI - The MIT License - -http://www.opensource.org/licenses/mit-license.php - -Copyright (c) 2011 Brian Cavalier - -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. \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/README.md b/app/Vendor/Ratchet/vendor/cujojs/when/README.md deleted file mode 100644 index 729bcd5a64..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/README.md +++ /dev/null @@ -1,279 +0,0 @@ -Please Note: this project has moved from briancavalier/when to cujojs/when. -Any existing forks have been automatically moved to cujojs/when. However, -you'll need to update your clone and submodule remotes manually. - -Update the url in your .git/config, and also .gitmodules for submodules: - -``` -git://github.com/cujojs/when.git -https://cujojs@github.com/cujojs/when.git -``` - -Helpful link for updating submodules: -[Git Submodules: Adding, Using, Removing, Updating](http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/) - ----- - -[![Build Status](https://secure.travis-ci.org/cujojs/when.png)](http://travis-ci.org/cujojs/when) - -A lightweight [CommonJS](http://wiki.commonjs.org/wiki/Promises) [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) and `when()` implementation. It also provides several other useful Promise-related concepts, such as joining and chaining, and has a robust unit test suite. - -It's **just over 1k** when compiled with Google Closure (w/advanced optimizations) and gzipped. - -when.js was derived from the async core of [wire.js](https://github.com/cujojs/wire). - -What's New? -=========== - -### 1.0.4 - -* [Travis CI](http://travis-ci.org/cujojs/when) integration -* Fix for cancelable deferred not invoking progress callbacks. ([#24](https://github.com/cujojs/when/pull/24) Thanks [@scothis](https://github.com/scothis)) -* The promise returned by `when.chain` now rejects when the input promise rejects. - -### 1.0.3 - -* Fix for specific situation where `null` could incorrectly be used as a promise resolution value ([#23](https://github.com/cujojs/when/pull/23)) - -### 1.0.2 - -* Updated README for running unit tests in both Node and Browsers. See **Running the Unit Tests** below. -* Set package name to 'when' in package.json - -### 1.0.1 - -* Fix for rejections propagating in some cases when they shouldn't have been ([#19](https://github.com/cujojs/when/issues/19)) -* Using [buster.js](http://busterjs.org/) for unit tests now. - -### 1.0.0 - -* First official when.js release as a part of [cujojs](https://github.com/cujojs). -* Added [when/cancelable](https://github.com/cujojs/when/wiki/when-cancelable) decorator for creating cancelable deferreds -* Added [when/delay](https://github.com/cujojs/when/wiki/when-delay) and [when/timeout](https://github.com/cujojs/when/wiki/when-timeout) helpers for creating delayed promises and promises that timeout and reject if not resolved first. - -[Full Changelog](https://github.com/cujojs/when/wiki/Changelog) - -Quick Start -=========== - -### AMD - -1. `git clone https://github.com/cujojs/when` or `git submodule add https://github.com/cujojs/when` -1. Configure your loader with a package: - - ```javascript - packages: [ - { name: 'when', location: 'path/to/when/', main: 'when' }, - // ... other packages ... - ] - ``` - -1. `define(['when', ...], function(when, ...) { ... });` or `require(['when', ...], function(when, ...) { ... });` - -### Script Tag - -1. `git clone https://github.com/cujojs/when` or `git submodule add https://github.com/cujojs/when` -1. `` -1. `when` will be available as `window.when` - -### Node - -1. `npm install git://github.com/cujojs/when` (**NOTE:** npm seems to require a url that starts with "git" rather than http or https) -1. `var when = require('when');` - -### RingoJS - -1. `ringo-admin install cujojs/when` -1. `var when = require('when');` - -Docs & Examples -=============== - -See the API section below, and the [wiki for more detailed docs](https://github.com/cujojs/when/wiki) and [examples](https://github.com/cujojs/when/wiki/Examples) - -API -=== - -when() ------- - -Register a handler for a promise or immediate value: - -```javascript -when(promiseOrValue, callback, errback, progressback) - -// Always returns a promise, so can be chained: - -when(promiseOrValue, callback, errback, progressback).then(anotherCallback, anotherErrback, anotherProgressback) -``` - -when.defer() ------------- - -Create a new Deferred containing separate `promise` and `resolver` parts: - -```javascript -var deferred = when.defer(); - -var promise = deferred.promise; -var resolver = deferred.resolver; -``` - -The deferred has the full `promise` + `resolver` API: - -```javascript -deferred.then(callback, errback, progressback); -deferred.resolve(value); -deferred.reject(reason); -deferred.progress(update); -``` - -The `promise` API: - -```javascript -// var promise = deferred.promise; -promise.then(callback, errback, progressback); -``` - -The `resolver` API: - -```javascript -// var resolver = deferred.resolver; -resolver.resolve(value); -resolver.reject(err); -resolver.progress(update); -``` - -when.isPromise() ----------------- - -```javscript -var is = when.isPromise(anything); -``` - -Return true if `anything` is truthy and implements the then() promise API. Note that this will return true for both a deferred (i.e. `when.defer()`), and a `deferred.promise` since both implement the promise API. - - -when.some() ------------ - -```javascript -when.some(promisesOrValues, howMany, callback, errback, progressback) -``` - -Return a promise that will resolve when `howMany` of the supplied `promisesOrValues` have resolved. The resolution value of the returned promise will be an array of length `howMany` containing the resolutions values of the triggering `promisesOrValues`. - -when.all() ----------- - -```javascript -when.all(promisesOrValues, callback, errback, progressback) -``` - -Return a promise that will resolve only once *all* the supplied `promisesOrValues` have resolved. The resolution value of the returned promise will be an array containing the resolution values of each of the `promisesOrValues`. - -when.any() ----------- - -```javascript -when.any(promisesOrValues, callback, errback, progressback) -``` - -Return a promise that will resolve when any one of the supplied `promisesOrValues` has resolved. The resolution value of the returned promise will be the resolution value of the triggering `promiseOrValue`. - -when.chain() ------------- - -```javascript -when.chain(promiseOrValue, resolver, optionalValue) -``` - -Ensure that resolution of `promiseOrValue` will complete `resolver` with the completion value of `promiseOrValue`, or instead with `optionalValue` if it is provided. - -Returns a new promise that will complete when `promiseOrValue` is completed, with the completion value of `promiseOrValue`, or instead with `optionalValue` if it is provided. - -**Note:** If `promiseOrValue` is not an immediate value, it can be anything that supports the promise API (i.e. `then()`), so you can pass a `deferred` as well. Similarly, `resolver` can be anything that supports the resolver API (i.e. `resolve()`, `reject()`), so a `deferred` will work there, too. - -when.map() ----------- - -```javascript -when.map(promisesOrValues, mapFunc) -``` - -Traditional map function, similar to `Array.prototype.map()`, but allows input to contain promises and/or values, and mapFunc may return either a value or a promise. - -The map function should have the signature: - -```javascript -mapFunc(item) -``` - -Where: - -* `item` is a fully resolved value of a promise or value in `promisesOrValues` - -when.reduce() -------------- - -```javascript -when.reduce(promisesOrValues, reduceFunc, initialValue) -``` - -Traditional reduce function, similar to `Array.prototype.reduce()`, but input may contain promises and/or values, and reduceFunc may return either a value or a promise, *and* initialValue may be a promise for the starting value. - -The reduce function should have the signature: - -```javascript -reduceFunc(currentValue, nextItem, index, total) -``` - -Where: - -* `currentValue` is the current accumulated reduce value -* `nextItem` is the fully resolved value of the promise or value at `index` in `promisesOrValues` -* `index` the *basis* of `nextItem` ... practically speaking, this is the array index of the promiseOrValue corresponding to `nextItem` -* `total` is the total number of items in `promisesOrValues` - -when/apply ----------- - -```javascript -function functionThatAcceptsMultipleArgs(array) { - // ... -} - -var functionThatAcceptsAnArray = apply(functionThatAcceptsMultipleArgs); -``` - -Helper that allows using callbacks that take multiple args, instead of an array, with `when.all/some/map`: - -```javascript -when.all(arrayOfPromisesOrValues, apply(functionThatAcceptsMultipleArgs)); -``` - -[See the wiki](https://github.com/cujojs/when/wiki/when-apply) for more info and examples. - -Running the Unit Tests -====================== - -Install [buster.js](http://busterjs.org/) - -`npm install -g buster` - -Run unit tests in Node: - -1. `buster test -e node` - -Run unit tests in Browsers (and Node): - -1. `buster server` - this will print a url -2. Point browsers at /capture, e.g. `localhost:1111/capture` -3. `buster test` or `buster test -e browser` - -References ----------- - -Much of this code was inspired by @[unscriptable](https://github.com/unscriptable)'s [tiny promises](https://github.com/unscriptable/promises), the async innards of [wire.js](https://github.com/cujojs/wire), and some gists [here](https://gist.github.com/870729), [here](https://gist.github.com/892345), [here](https://gist.github.com/894356), and [here](https://gist.github.com/894360) - -Some of the code has been influenced by the great work in [Q](https://github.com/kriskowal/q), [Dojo's Deferred](https://github.com/dojo/dojo), and [uber.js](https://github.com/phiggins42/uber.js). diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/apply.js b/app/Vendor/Ratchet/vendor/cujojs/when/apply.js deleted file mode 100644 index 885b633c63..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/apply.js +++ /dev/null @@ -1,68 +0,0 @@ -/** @license MIT License (c) copyright B Cavalier & J Hann */ - -/** - * apply.js - * Helper for using arguments-based and variadic callbacks with any - * {@link Promise} that resolves to an array. - * - * @author brian@hovercraftstudios.com - */ - -(function(define) { -define(function() { - - var toString = Object.prototype.toString; - - /** - * Creates a function that accepts a function that takes individual - * arguments (it can be variadic, too), and returns a new function that - * takes a single array as its only param: - * - * function argBased(a, b, c) { - * return a + b + c; - * } - * - * argBased(1, 2, 3); // 6 - * - * // Create an array-based version of argBased - * var arrayBased = apply(argBased); - * var inputs = [1, 2, 3]; - * - * arrayBased(inputs); // 6 - * - * With promises: - * - * var d = when.defer(); - * d.promise.then(arrayBased); - * - * d.resolve([1, 2, 3]); // arrayBased called with args 1, 2, 3 -> 6 - * - * @param f {Function} arguments-based function - * - * @returns {Function} a new function that accepts an array - */ - return function(f) { - /** - * @param array {Array} must be an array of arguments to use to apply the original function - * - * @returns the result of applying f with the arguments in array. - */ - return function(array) { - // It better be an array - if(toString.call(array) != '[object Array]') throw new Error('apply called with non-array arg'); - - return f.apply(null, array); - } - }; - -}); -})(typeof define == 'function' - ? define - : function (factory) { typeof module != 'undefined' - ? (module.exports = factory()) - : (this.when_apply = factory()); - } - // Boilerplate for AMD, Node, and browser global -); - - diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/cancelable.js b/app/Vendor/Ratchet/vendor/cujojs/when/cancelable.js deleted file mode 100644 index 48799a7b9a..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/cancelable.js +++ /dev/null @@ -1,66 +0,0 @@ -/** @license MIT License (c) copyright B Cavalier & J Hann */ - -/** - * cancelable.js - * - * Decorator that makes a deferred "cancelable". It adds a cancel() method that - * will call a special cancel handler function and then reject the deferred. The - * cancel handler can be used to do resource cleanup, or anything else that should - * be done before any other rejection handlers are executed. - * - * Usage: - * - * var cancelableDeferred = cancelable(when.defer(), myCancelHandler); - * - * @author brian@hovercraftstudios.com - */ - -(function(define) { -define(['./when'], function(when) { - - /** - * Makes deferred cancelable, adding a cancel() method. - * - * @param deferred {Deferred} the {@link Deferred} to make cancelable - * @param canceler {Function} cancel handler function to execute when this deferred is canceled. This - * is guaranteed to run before all other rejection handlers. The canceler will NOT be executed if the - * deferred is rejected in the standard way, i.e. deferred.reject(). It ONLY executes if the deferred - * is canceled, i.e. deferred.cancel() - * - * @returns deferred, with an added cancel() method. - */ - return function(deferred, canceler) { - - var delegate = when.defer(); - - // Add a cancel method to the deferred to reject the delegate - // with the special canceled indicator. - deferred.cancel = function() { - delegate.reject(canceler(deferred)); - }; - - // Ensure that the original resolve, reject, and progress all forward - // to the delegate - deferred.then(delegate.resolve, delegate.reject, delegate.progress); - - // Replace deferred's promise with the delegate promise - deferred.promise = delegate.promise; - - // Also replace deferred.then to allow it to be called safely and - // observe the cancellation - deferred.then = delegate.promise.then; - - return deferred; - }; - -}); -})(typeof define == 'function' - ? define - : function (deps, factory) { typeof module != 'undefined' - ? (module.exports = factory(require('./when'))) - : (this.when_cancelable = factory(this.when)); - } - // Boilerplate for AMD, Node, and browser global -); - - diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/delay.js b/app/Vendor/Ratchet/vendor/cujojs/when/delay.js deleted file mode 100644 index 6e7f8c6dd9..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/delay.js +++ /dev/null @@ -1,59 +0,0 @@ -/** @license MIT License (c) copyright B Cavalier & J Hann */ - -/** - * delay.js - * - * Helper that returns a promise that resolves after a delay. - * - * @author brian@hovercraftstudios.com - */ - -(function(define) { -define(['./when'], function(when) { - - var undef; - - /** - * Creates a new promise that will resolve after a msec delay. If promise - * is supplied, the delay will start *after* the supplied promise is resolved. - * - * Usage: - * // Do something after 1 second, similar to using setTimeout - * delay(1000).then(doSomething); - * // or - * when(delay(1000), doSomething); - * - * // Do something 1 second after triggeringPromise resolves - * delay(triggeringPromise, 1000).then(doSomething, handleRejection); - * // or - * when(delay(triggeringPromise, 1000), doSomething, handleRejection); - * - * @param [promise] anything - any promise or value after which the delay will start - * @param msec {Number} delay in milliseconds - */ - return function delay(promise, msec) { - if(arguments.length < 2) { - msec = promise >>> 0; - promise = undef; - } - - return when(promise, function(val) { - var deferred = when.defer(); - setTimeout(function() { - deferred.resolve(val); - }, msec); - return deferred.promise; - }); - }; - -}); -})(typeof define == 'function' - ? define - : function (deps, factory) { typeof module != 'undefined' - ? (module.exports = factory(require('./when'))) - : (this.when_delay = factory(this.when)); - } - // Boilerplate for AMD, Node, and browser global -); - - diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/package.json b/app/Vendor/Ratchet/vendor/cujojs/when/package.json deleted file mode 100644 index ce93bd1a24..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "when", - "version": "1.0.4", - "description": "A lightweight Promise and when() implementation, plus other async goodies.", - "keywords": ["promises", "when", "async"], - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/mit-license.php" - } - ], - "repositories": [ - { - "type": "git", - "url": "https://github.com/cujojs/when" - } - ], - "bugs": "https://github.com/cujojs/when/issues", - "maintainers": [ - { - "name": "Brian Cavalier", - "web": "http://hovercraftstudios.com" - }, - { - "name": "John Hann", - "web": "http://unscriptable.com" - } - ], - "devDependencies": { - "buster": "~0.4" - }, - "main": "./when", - "directories": { - "test": "test" - }, - "scripts": { - "test": "buster test -e node" - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/all.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/all.js deleted file mode 100644 index 0d89eafd2d..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/all.js +++ /dev/null @@ -1,98 +0,0 @@ -(function(buster, when) { - -var assert = buster.assert; - -function resolved(val) { - var d = when.defer(); - d.resolve(val); - return d.promise; -} - -function rejected(val) { - var d = when.defer(); - d.reject(val); - return d.promise; -} - -buster.testCase('when.all', { - - 'should resolve empty input': function(done) { - when.all([], - function(result) { - assert.equals(result, []); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should resolve values array': function(done) { - var input = [1, 2, 3]; - when.all(input, - function(results) { - assert.equals(results, input); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should resolve promises array': function(done) { - var input = [resolved(1), resolved(2), resolved(3)]; - when.all(input, - function(results) { - assert.equals(results, [1, 2, 3]); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should resolve sparse array input': function(done) { - var input = [, 1, , 1, 1 ]; - when.all(input, - function(results) { - assert.equals(results, input); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reject if any input promise rejects': function(done) { - var input = [resolved(1), rejected(2), resolved(3)]; - when.all(input, - function() { - buster.fail(); - done(); - }, - function(failed) { - assert.equals(failed, 2); - done(); - } - ); - }, - - 'should throw if called with something other than an array': function() { - assert.exception(function() { - when.all(1, 2, 3); - }); - } -}); - -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/any.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/any.js deleted file mode 100644 index 1a85091227..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/any.js +++ /dev/null @@ -1,104 +0,0 @@ -(function(buster, when) { - -var assert = buster.assert; -var refute = buster.refute; - -function contains(array, item) { - for(var i=array.length - 1; i >= 0; --i) { - if(array[i] === item) { - return true; - } - } - - return false; -} - -function resolved(val) { - var d = when.defer(); - d.resolve(val); - return d.promise; -} - -function rejected(val) { - var d = when.defer(); - d.reject(val); - return d.promise; -} - -buster.testCase('when.any', { - - 'should resolve to undefined with empty input array': function(done) { - when.any([], - function(result) { - refute.defined(result); - done(); - }, - function() { - buster.fail(); - done() - } - ); - }, - - 'should resolve with an input value': function(done) { - var input = [1, 2, 3]; - when.any(input, - function(result) { - assert(contains(input, result)); - done(); - }, - function () { - buster.fail(); - done() - } - ); - }, - - 'should resolve with a promised input value': function(done) { - var input = [resolved(1), resolved(2), resolved(3)]; - when.any(input, - function(result) { - assert(contains([1, 2, 3], result)); - done(); - }, - function() { - buster.fail(); - done() - } - ); - }, - - 'should reject with a rejected input value': function(done) { - var input = [rejected(1), resolved(2), resolved(3)]; - when.any(input, - function() { - buster.fail(); - done() - }, - function(result) { - assert.equals(result, 1); - done(); - } - ); - }, - - 'should resolve when first input promise resolves': function(done) { - var input = [resolved(1), rejected(2), rejected(3)]; - when.any(input, - function(result) { - assert.equals(result, 1); - done(); - }, - function() { - buster.fail(); - done() - } - ); - } - -}); - -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/apply.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/apply.js deleted file mode 100644 index cfe1e9fff0..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/apply.js +++ /dev/null @@ -1,32 +0,0 @@ -(function(buster, apply) { - -var assert = buster.assert; - -// variadic arguments-based callback -function f() { - var sum, i = arguments.length; - - sum = 0; - while(i) { - sum += arguments[--i]; - } - - return sum; -} - -buster.testCase('when/apply', { - 'should spread array onto arguments': function() { - assert.equals(6, apply(f)([1,2,3])); - }, - - 'should fail for non Array-like input': function() { - assert.exception(function() { - apply(f)(1,2,3); - }); - } -}); - -})( - this.buster || require('buster'), - this.when_apply || require('../apply') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/buster.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/buster.js deleted file mode 100644 index 328cb11230..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/buster.js +++ /dev/null @@ -1,16 +0,0 @@ -var tests = ['*.js']; - -exports['node'] = { - environment: 'node', - tests: tests -}; - -// FIXME: Something has changed with buster's browser testing, and either -// it is not working at all, or this configuration is not valid -//var browserTests = tests.map(function(t) { return './test/' + t; }); -//exports['browser'] = { -// environment: 'browser', -// rootPath: '../', -// tests: browserTests, -// sources: [ './when.js', './apply.js', './delay.js', './timeout.js', './cancelable.js' ] -//}; \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/cancelable.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/cancelable.js deleted file mode 100644 index 6cc0f565fa..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/cancelable.js +++ /dev/null @@ -1,79 +0,0 @@ -(function(buster, when, cancelable) { - -var assert = buster.assert; - -buster.testCase('when/cancelable', { - 'should decorate deferred with a cancel() method': function() { - var c = cancelable(when.defer(), function() {}); - assert.typeOf(c.cancel, 'function'); - }, - - 'should propagate a rejection when a cancelable deferred is canceled': function(done) { - var c = cancelable(when.defer(), function() { return 1; }); - c.cancel(); - - c.then( - function() { - buster.fail(); - done(); - }, - function(v) { - assert.equals(v, 1); - done(); - } - ); - }, - - 'should not invoke canceler when rejected normally': function(done) { - var c = cancelable(when.defer(), function() { return 1; }); - c.reject(2); - - c.then( - function() { - buster.fail(); - done(); - }, - function(v) { - assert.equals(v, 2); - done(); - } - ); - }, - - 'should propagate the unaltered resolution value': function(done) { - var c = cancelable(when.defer(), function() { return false; }); - c.resolve(true); - - c.then( - function(val) { - assert(val); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should call progback for cancelable deferred': function(done) { - var expected, c; - - expected = {}; - c = cancelable(when.defer()); - - c.then(null, null, function (status) { - assert.same(status, expected); - done(); - }); - - c.progress(expected); - } - -}); - -})( - this.buster || require('buster'), - this.when || require('../when'), - this.when_cancelable || require('../cancelable') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/chain.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/chain.js deleted file mode 100644 index 31d4d53dc8..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/chain.js +++ /dev/null @@ -1,170 +0,0 @@ -(function(buster, when) { - -var assert, refute, fail; - -assert = buster.assert; -refute = buster.refute; -fail = buster.assertions.fail; - -buster.testCase('when.chain', { - 'should return a promise for an input value': function() { - var d, result; - - d = when.defer(); - - result = when.chain(1, d.resolver); - - assert.typeOf(result.then, 'function'); - refute.equals(result, d); - refute.equals(result, d.promise); - }, - - 'should return a promise for an input promise': function() { - var d1, d2, result; - - d1 = when.defer(); - d2 = when.defer(); - - result = when.chain(d1.promise, d2.resolver); - - assert.typeOf(result.then, 'function'); - refute.equals(result, d1); - refute.equals(result, d1.promise); - refute.equals(result, d2); - refute.equals(result, d2.promise); - }, - - 'should resolve resolver with input value': function(done) { - var d = when.defer(); - - d.promise.then( - function(val) { assert.equals(val, 1); }, - function() { fail('promise should not have rejected'); } - ).then(done, done); - - when.chain(1, d.resolver); - }, - - 'should resolve resolver with input promise value': function(done) { - var d, input; - - d = when.defer(); - - d.promise.then( - function(val) { assert.equals(val, 1); }, - function() { fail('promise should not have rejected'); } - ).then(done, done); - - input = when.defer(); - input.resolve(1); - - when.chain(input.promise, d.resolver); - }, - - 'should resolve resolver with provided value when input is a value': function(done) { - var d = when.defer(); - - d.promise.then( - function(val) { assert.equals(val, 2); }, - function() { fail('promise should not have rejected'); } - ).then(done, done); - - when.chain(1, d.resolver, 2); - }, - - 'should resolve resolver with provided value when input is a promise': function(done) { - var d, input; - - d = when.defer(); - - d.promise.then( - function(val) { assert.equals(val, 2); }, - function() { fail('promise should not have rejected'); } - ).then(done, done); - - input = when.defer(); - input.resolve(1); - - when.chain(input.promise, d.resolver, 2); - }, - - 'should reject resolver with input promise rejection reason': function(done) { - var d, input; - - d = when.defer(); - - d.promise.then( - function() { fail('promise should not have resolved'); }, - function (val) { assert.equals(val, 1); } - ).then(done, done); - - input = when.defer(); - input.reject(1); - - when.chain(input.promise, d.resolver); - }, - - 'should reject resolver with input promise rejection reason when optional value provided': function(done) { - var d, input; - - d = when.defer(); - - d.promise.then( - function() { fail('promise should not have resolved'); }, - function (val) { assert.equals(val, 1); } - ).then(done, done); - - input = when.defer(); - input.reject(1); - - when.chain(input.promise, d.resolver, 2); - }, - - 'should return a preomise that resolves with the input promise resolution value': function(done) { - var d, input; - - input = when.defer(); - d = when.defer(); - - input.resolve(1); - - when.chain(input, d).then( - function(val) { assert.equals(val, 1); }, - function() { fail('promise should not have rejected'); } - ).then(done, done); - }, - - 'should return a preomise that resolves with the optional resolution value': function(done) { - var d, input; - - input = when.defer(); - d = when.defer(); - - input.resolve(1); - - when.chain(input, d, 2).then( - function(val) { assert.equals(val, 2); }, - function() { fail('promise should not have rejected'); } - ).then(done, done); - }, - - 'should return a promise that rejects with the input promise rejection value': function(done) { - var d, input; - - input = when.defer(); - d = when.defer(); - - input.reject(1); - - when.chain(input, d).then( - function() { fail('promise should not have resolved'); }, - function(val) { assert.equals(val, 1); } - ).then(done, done); - } - -}) - -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/defer.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/defer.js deleted file mode 100644 index eb1f3900b9..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/defer.js +++ /dev/null @@ -1,203 +0,0 @@ -(function(buster, when) { - -var assert = buster.assert; - -buster.testCase('when.defer', { - - 'should resolve': function(done) { - var d = when.defer(); - - d.promise.then( - function(val) { - assert.equals(val, 1); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - - d.resolve(1); - }, - - 'should reject': function(done) { - var d = when.defer(); - - d.promise.then( - function() { - buster.fail(); - done(); - }, - function(val) { - assert.equals(val, 1); - done(); - } - ); - - d.reject(1); - }, - - 'should progress': function(done) { - var d = when.defer(); - - d.promise.then( - function() { - buster.fail(); - done(); - }, - function() { - buster.fail(); - done(); - }, - function(val) { - assert.equals(val, 1); - done(); - } - ); - - d.progress(1); - }, - - 'should allow resolve after progress': function(done) { - var d = when.defer(); - - var progressed = false; - d.promise.then( - function(val) { - assert(progressed); - assert.equals(val, 2); - done(); - }, - function() { - buster.fail(); - done(); - }, - function(val) { - assert.equals(val, 1); - progressed = true; - } - ); - - d.progress(1); - d.resolve(2); - }, - - 'should allow reject after progress': function(done) { - var d = when.defer(); - - var progressed = false; - d.promise.then( - function() { - buster.fail(); - done(); - }, - function(val) { - assert(progressed); - assert.equals(val, 2); - done(); - }, - function(val) { - assert.equals(val, 1); - progressed = true; - } - ); - - d.progress(1); - d.reject(2); - }, - - 'should throw if resolved when already resolved': function() { - var d = when.defer(); - d.resolve(1); - - assert.exception(function() { - d.resolve(); - }); - }, - - 'should throw if rejected when already resolved': function() { - var d = when.defer(); - d.resolve(1); - - assert.exception(function() { - d.reject(); - }); - }, - - 'should throw on progress when already resolved': function() { - var d = when.defer(); - d.resolve(1); - - assert.exception(function() { - d.progress(); - }); - }, - - 'should throw if resolved when already rejected': function() { - var d = when.defer(); - d.resolve(1); - - assert.exception(function() { - d.resolve(); - }); - }, - - 'should throw if rejected when already rejected': function() { - var d = when.defer(); - d.resolve(1); - - assert.exception(function() { - d.reject(); - }); - }, - - 'should throw on progress when already rejected': function() { - var d = when.defer(); - d.resolve(1); - - assert.exception(function() { - d.progress(); - }); - }, - - 'should invoke newly added callback when already resolved': function(done) { - var d = when.defer(); - - d.resolve(1); - - d.promise.then( - function(val) { - assert.equals(val, 1); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should invoke newly added errback when already rejected': function(done) { - var d = when.defer(); - - d.reject(1); - - d.promise.then( - function () { - buster.fail(); - done(); - }, - function (val) { - assert.equals(val, 1); - done(); - } - ); - } - -}); - -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/delay.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/delay.js deleted file mode 100644 index 99c127b09e..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/delay.js +++ /dev/null @@ -1,71 +0,0 @@ -(function(buster, when, delay) { - -var assert = buster.assert; - -function now() { - return (new Date()).getTime(); -} - -buster.testCase('when/delay', { - 'should resolve after delay': function(done) { - delay(0).then( - function() { - assert(true); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should resolve with provided value after delay': function(done) { - delay(1, 0).then( - function(val) { - assert.equals(val, 1); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should delay by the provided value': function(done) { - var start = now(); - - delay(100).then( - function() { - assert((now() - start) > 50); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should not delay if rejected': function(done) { - var d = when.defer(); - d.reject(1); - - delay(d.promise, 0).then( - function() { - buster.fail(); - done(); - }, - function(val) { - assert.equals(val, 1); - done(); - } - ); - } -}); -})( - this.buster || require('buster'), - this.when || require('../when'), - this.when_delay || require('../delay') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/isPromise.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/isPromise.js deleted file mode 100644 index 2b83a4292a..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/isPromise.js +++ /dev/null @@ -1,59 +0,0 @@ -(function(buster, when) { - -var fakePromise, undef; - -fakePromise = { - then:function () {} -}; - -function assertIsPromise(it) { - buster.assert(when.isPromise(it)); -} - -function assertIsNotPromise(it) { - buster.refute(when.isPromise(it)); -} - -buster.testCase('when.isPromise', { - - 'should return true for promise': function() { - assertIsPromise(fakePromise); - }, - - 'should return false for non-promise': function() { - var inputs = [ - 1, - 0, - 'not a promise', - true, - false, - undef, - null, - '', - /foo/, - {}, - new Object(), - new RegExp('foo'), - new Date(), - new Boolean(), - [], - new Array() - ]; - - for(var i = inputs.length - 1; i >= 0; --i) { - assertIsNotPromise(inputs[i]); - } - }, - - 'should return true for delegated promise': function() { - function T() {} - - T.prototype = fakePromise; - assertIsPromise(new T()); - } -}); - -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/map.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/map.js deleted file mode 100644 index 1a98facf3d..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/map.js +++ /dev/null @@ -1,101 +0,0 @@ -(function(buster, when) { - -var assert = buster.assert; - -function mapper(val) { - return val * 2; -} - -function deferredMapper(val) { - var d = when.defer(); - - setTimeout(function() { - d.resolve(mapper(val)); - }, Math.random() * 10); - - return d.promise; -} - -function resolved(val) { - var d = when.defer(); - d.resolve(val); - return d.promise; -} - -buster.testCase('when.map', { - - 'should map input values array': function(done) { - var input = [1, 2, 3]; - when.map(input, mapper).then( - function(results) { - assert.equals(results, [2,4,6]); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should map input promises array': function(done) { - var input = [resolved(1), resolved(2), resolved(3)]; - when.map(input, mapper).then( - function(results) { - assert.equals(results, [2,4,6]); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should map mixed input array': function(done) { - var input = [1, resolved(2), 3]; - when.map(input, mapper).then( - function(results) { - assert.equals(results, [2,4,6]); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should map input when mapper returns a promise': function(done) { - var input = [1,2,3]; - when.map(input, deferredMapper).then( - function(results) { - assert.equals(results, [2,4,6]); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should map input promises when mapper returns a promise': function(done) { - var input = [resolved(1),resolved(2),resolved(3)]; - when.map(input, deferredMapper).then( - function(results) { - assert.equals(results, [2,4,6]); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - } - -}); -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/promise.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/promise.js deleted file mode 100644 index ed76f653ed..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/promise.js +++ /dev/null @@ -1,313 +0,0 @@ -(function(buster, when) { - -var assert = buster.assert; - -var defer, isFrozen, undef; - -defer = when.defer; - -function f() {} - -function fail(done) { - return function() { - buster.fail(); - done(); - }; -} - -// In case of testing in an environment without Object.isFrozen -isFrozen = Object.isFrozen || function() { return true; }; - -buster.testCase('promise', { - - 'should be frozen': function() { - assert(Object.isFrozen(defer().promise)); - }, - - 'should allow a single callback function': function() { - assert.typeOf(defer().promise.then(f).then, 'function'); - }, - - 'should allow a callback and errback function': function() { - assert.typeOf(defer().promise.then(f, f).then, 'function'); - }, - - 'should allow a callback, errback, and progback function': function() { - assert.typeOf(defer().promise.then(f, f, f).then, 'function'); - }, - - 'should allow null and undefined': function() { - assert.typeOf(defer().promise.then().then, 'function'); - - assert.typeOf(defer().promise.then(null).then, 'function'); - assert.typeOf(defer().promise.then(null, null).then, 'function'); - assert.typeOf(defer().promise.then(null, null, null).then, 'function'); - - assert.typeOf(defer().promise.then(undef).then, 'function'); - assert.typeOf(defer().promise.then(undef, undef).then, 'function'); - assert.typeOf(defer().promise.then(undef, undef, undef).then, 'function'); - }, - - 'should allow functions and null or undefined to be mixed': function() { - assert.typeOf(defer().promise.then(f, null).then, 'function'); - assert.typeOf(defer().promise.then(f, null, null).then, 'function'); - assert.typeOf(defer().promise.then(null, f).then, 'function'); - assert.typeOf(defer().promise.then(null, f, null).then, 'function'); - assert.typeOf(defer().promise.then(null, null, f).then, 'function'); - }, - - 'should throw if non-function arguments are provided': function() { - assert.exception(function() { defer().promise.then(1); }); - assert.exception(function() { defer().promise.then(1, null); }); - assert.exception(function() { defer().promise.then(1, null, null); }); - assert.exception(function() { defer().promise.then(null, 1); }); - assert.exception(function() { defer().promise.then(null, 1, null); }); - assert.exception(function() { defer().promise.then(null, null, 1); }); - - }, - - 'should forward result when callback is null': function(done) { - var d = when.defer(); - - function fail(e) { - buster.fail(e); - done(); - } - - d.promise.then( - null, - fail - ).then( - function(val) { - assert.equals(val, 1); - done(); - }, - fail - ); - - d.resolve(1); - }, - - 'should forward callback result to next callback': function(done) { - var d = when.defer(); - - d.promise.then( - function(val) { - return val + 1; - }, - fail(done) - ).then( - function(val) { - assert.equals(val, 2); - done(); - }, - fail(done) - ); - - d.resolve(1); - }, - - 'should forward previous result instead of undefined': function(done) { - var d = when.defer(); - - d.promise.then( - function() { - // intentionally return undefined - }, - fail(done) - ).then( - function(val) { - assert.equals(val, 1); - done(); - }, - fail(done) - ); - - d.resolve(1); - }, - - 'should forward previous rejection value instead of undefined': function(done) { - var d = when.defer(); - - d.promise.then( - fail(done), - function() { - // presence of rejection handler is enough to switch back - // to resolve mode, even though it returns undefined. - // The ONLY way to propagate a rejection is to re-throw or - // return a rejected promise; - } - ).then( - function(val) { - assert.equals(val, 1); - done(); - }, - fail(done) - ); - - d.reject(1); - }, - - 'should forward promised callback result value to next callback': function(done) { - var d = when.defer(); - - d.promise.then( - function(val) { - var d = when.defer(); - d.resolve(val + 1); - return d.promise; - }, - fail(done) - ).then( - function(val) { - assert.equals(val, 2); - done(); - }, - fail(done) - ); - - d.resolve(1); - }, - - 'should switch from callbacks to errbacks when callback returns a rejection': function(done) { - var d = when.defer(); - - d.promise.then( - function(val) { - var d = when.defer(); - d.reject(val + 1); - return d.promise; - }, - fail(done) - ).then( - fail(done), - function(val) { - assert.equals(val, 2); - done(); - } - ); - - d.resolve(1); - }, - - 'should switch from callbacks to errbacks when callback throws': function(done) { - var d = when.defer(); - - d.promise.then( - function(val) { - throw val + 1; - }, - fail(done) - ).then( - fail(done), - function(val) { - assert.equals(val, 2); - done(); - } - ); - - d.resolve(1); - }, - - 'should switch from errbacks to callbacks when errback does not explicitly propagate': function(done) { - var d = when.defer(); - - d.promise.then( - fail(done), - function(val) { - return val + 1; - } - ).then( - function(val) { - assert.equals(val, 2); - done(); - }, - fail(done) - ); - - d.reject(1); - }, - - 'should switch from errbacks to callbacks when errback returns a resolution': function(done) { - var d = when.defer(); - - d.promise.then( - fail, - function(val) { - var d = when.defer(); - d.resolve(val + 1); - return d.promise; - } - ).then( - function(val) { - assert.equals(val, 2); - done(); - }, - fail - ); - - d.reject(1); - }, - - 'should propagate rejections when errback throws': function(done) { - var d = when.defer(); - - d.promise.then( - fail(done), - function(val) { - throw val + 1; - } - ).then( - fail(done), - function(val) { - assert.equals(val, 2); - done(); - } - ); - - d.reject(1); - }, - - 'should propagate rejections when errback returns a rejection': function(done) { - var d = when.defer(); - - d.promise.then( - fail(done), - function(val) { - var d = when.defer(); - d.reject(val + 1); - return d.promise; - } - ).then( - function() { - buster.fail(); - done(); - }, - function(val) { - assert.equals(val, 2); - done(); - } - ); - - d.reject(1); - }, - - 'should call progback': function(done) { - var expected, d; - - expected = {}; - d = when.defer(); - - d.promise.then(null, null, function (status) { - assert.same(status, expected); - done(); - }); - - d.progress(expected); - } - -}); -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/reduce.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/reduce.js deleted file mode 100644 index ae1c7f249f..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/reduce.js +++ /dev/null @@ -1,202 +0,0 @@ -(function(buster, when) { - -var assert = buster.assert; - -function plus(sum, val) { - return sum + val; -} - -function resolved(val) { - var d = when.defer(); - d.resolve(val); - return d.promise; -} - -function later(val) { - var d = when.defer(); - - setTimeout(function() { - d.resolve(val); - }, Math.random() * 50); - - return d.promise; -} - -buster.testCase('when.reduce', { - - 'should reduce values without initial value': function(done) { - when.reduce([1,2,3], plus).then( - function(result) { - assert.equals(result, 6); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce values with initial value': function(done) { - when.reduce([1,2,3], plus, 1).then( - function(result) { - assert.equals(result, 7); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce values with initial promise': function(done) { - when.reduce([1,2,3], plus, resolved(1)).then( - function(result) { - assert.equals(result, 7); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce promised values without initial value': function() { - var input = [resolved(1), resolved(2), resolved(3)]; - when.reduce(input, plus).then( - function(result) { - assert.equals(result, 6); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce promised values with initial value': function() { - var input = [resolved(1), resolved(2), resolved(3)]; - when.reduce(input, plus, 1).then( - function(result) { - assert.equals(result, 7); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce promised values with initial promise': function() { - var input = [resolved(1), resolved(2), resolved(3)]; - when.reduce(input, plus, resolved(1)).then( - function(result) { - assert.equals(result, 7); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce empty input with initial value': function() { - var input = []; - when.reduce(input, plus, 1).then( - function(result) { - assert.equals(result, 1); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce empty input with initial promise': function() { - when.reduce([], plus, resolved(1)).then( - function(result) { - assert.equals(result, 1); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should throw TypeError when input is empty and no initial value or promise provided': function() { - assert.exception(function() { - when.reduce([], plus); - }, 'TypeError'); - }, - - 'should allow sparse array input without initial': function(done) { - when.reduce([ , , 1, , 1, 1], plus).then( - function(result) { - assert.equals(result, 3); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should allow sparse array input with initial': function(done) { - when.reduce([ , , 1, , 1, 1], plus, 1).then( - function(result) { - assert.equals(result, 4); - done(); - }, - function() { - buster.fail(); - done(); - } - ); - }, - - 'should reduce in input order': function(done) { - when.reduce([later(1), later(2), later(3)], plus, '').then( - function(result) { - assert.equals(result, '123'); - done(); - }, - function() { - buster.fail(); - done(); - } - ) - }, - - 'should provide correct basis value': function(done) { - function insertIntoArray(arr, val, i) { - arr[i] = val; - return arr; - } - - when.reduce([later(1), later(2), later(3)], insertIntoArray, []).then( - function(result) { - assert.equals(result, [1,2,3]); - done(); - }, - function() { - buster.fail(); - done(); - } - ) - } -}); - -})( - this.buster || require('buster'), - this.when || require('../when') -); diff --git a/app/Vendor/Ratchet/vendor/cujojs/when/test/some.js b/app/Vendor/Ratchet/vendor/cujojs/when/test/some.js deleted file mode 100644 index 7a74d75184..0000000000 --- a/app/Vendor/Ratchet/vendor/cujojs/when/test/some.js +++ /dev/null @@ -1,126 +0,0 @@ -(function(buster, when) { - -var assert = buster.assert; - -function resolved(val) { - var d = when.defer(); - d.resolve(val); - return d.promise; -} - -function rejected(val) { - var d = when.defer(); - d.reject(val); - return d.promise; -} - -function contains(array, value) { - for(var i = array.length-1; i >= 0; i--) { - if(array[i] === value) { - return true; - } - } - - return false; -} - -function subset(subset, superset) { - var i, subsetLen; - - subsetLen = subset.length; - - if (subsetLen > superset.length) { - return false; - } - - for(i = 0; i>> 0; - args = arguments; - - // If no initialValue, use first item of array (we know length !== 0 here) - // and adjust i to start at second item - if(args.length <= 1) { - // Skip to the first real element in the array - for(;;) { - if(i in arr) { - reduced = arr[i++]; - break; - } - - // If we reached the end of the array without finding any real - // elements, it's a TypeError - if(++i >= len) { - throw new TypeError(); - } - } - } else { - // If initialValue provided, use it - reduced = args[1]; - } - - // Do the actual reduce - for(;i < len; ++i) { - // Skip holes - if(i in arr) - reduced = reduceFunc(reduced, arr[i], i, arr); - } - - return reduced; - }; - - /** - * Trusted Promise constructor. A Promise created from this constructor is - * a trusted when.js promise. Any other duck-typed promise is considered - * untrusted. - */ - function Promise() {} - - /** - * Create an already-resolved promise for the supplied value - * @private - * - * @param value anything - * @return {Promise} - */ - function resolved(value) { - - var p = new Promise(); - - p.then = function(callback) { - checkCallbacks(arguments); - - var nextValue; - try { - if(callback) nextValue = callback(value); - return promise(nextValue === undef ? value : nextValue); - } catch(e) { - return rejected(e); - } - }; - - return freeze(p); - } - - /** - * Create an already-rejected {@link Promise} with the supplied - * rejection reason. - * @private - * - * @param reason rejection reason - * @return {Promise} - */ - function rejected(reason) { - - var p = new Promise(); - - p.then = function(callback, errback) { - checkCallbacks(arguments); - - var nextValue; - try { - if(errback) { - nextValue = errback(reason); - return promise(nextValue === undef ? reason : nextValue) - } - - return rejected(reason); - - } catch(e) { - return rejected(e); - } - }; - - return freeze(p); - } - - /** - * Helper that checks arrayOfCallbacks to ensure that each element is either - * a function, or null or undefined. - * - * @param arrayOfCallbacks {Array} array to check - * @throws {Error} if any element of arrayOfCallbacks is something other than - * a Functions, null, or undefined. - */ - function checkCallbacks(arrayOfCallbacks) { - var arg, i = arrayOfCallbacks.length; - while(i) { - arg = arrayOfCallbacks[--i]; - if (arg != null && typeof arg != 'function') throw new Error('callback is not a function'); - } - } - - /** - * Creates a new, CommonJS compliant, Deferred with fully isolated - * resolver and promise parts, either or both of which may be given out - * safely to consumers. - * The Deferred itself has the full API: resolve, reject, progress, and - * then. The resolver has resolve, reject, and progress. The promise - * only has then. - * - * @memberOf when - * @function - * - * @returns {Deferred} - */ - function defer() { - var deferred, promise, listeners, progressHandlers, _then, _progress, complete; - - listeners = []; - progressHandlers = []; - - /** - * Pre-resolution then() that adds the supplied callback, errback, and progback - * functions to the registered listeners - * - * @private - * - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler - * - * @throws {Error} if any argument is not null, undefined, or a Function - */ - _then = function unresolvedThen(callback, errback, progback) { - // Check parameters and fail immediately if any supplied parameter - // is not null/undefined and is also not a function. - // That is, any non-null/undefined parameter must be a function. - checkCallbacks(arguments); - - var deferred = defer(); - - listeners.push(function(promise) { - promise.then(callback, errback) - .then(deferred.resolve, deferred.reject, deferred.progress); - }); - - progback && progressHandlers.push(progback); - - return deferred.promise; - }; - - /** - * Registers a handler for this {@link Deferred}'s {@link Promise}. Even though all arguments - * are optional, each argument that *is* supplied must be null, undefined, or a Function. - * Any other value will cause an Error to be thrown. - * - * @memberOf Promise - * - * @param [callback] {Function} resolution handler - * @param [errback] {Function} rejection handler - * @param [progback] {Function} progress handler - * - * @throws {Error} if any argument is not null, undefined, or a Function - */ - function then(callback, errback, progback) { - return _then(callback, errback, progback); - } - - /** - * Resolves this {@link Deferred}'s {@link Promise} with val as the - * resolution value. - * - * @memberOf Resolver - * - * @param val anything - */ - function resolve(val) { - complete(resolved(val)); - } - - /** - * Rejects this {@link Deferred}'s {@link Promise} with err as the - * reason. - * - * @memberOf Resolver - * - * @param err anything - */ - function reject(err) { - complete(rejected(err)); - } - - /** - * @private - * @param update - */ - _progress = function(update) { - var progress, i = 0; - while (progress = progressHandlers[i++]) progress(update); - }; - - /** - * Emits a progress update to all progress observers registered with - * this {@link Deferred}'s {@link Promise} - * - * @memberOf Resolver - * - * @param update anything - */ - function progress(update) { - _progress(update); - } - - /** - * Transition from pre-resolution state to post-resolution state, notifying - * all listeners of the resolution or rejection - * - * @private - * - * @param completed {Promise} the completed value of this deferred - */ - complete = function(completed) { - var listener, i = 0; - - // Replace _then with one that directly notifies with the result. - _then = completed.then; - - // Replace complete so that this Deferred can only be completed - // once. Also Replace _progress, so that subsequent attempts to issue - // progress throw. - complete = _progress = function alreadyCompleted() { - // TODO: Consider silently returning here so that parties who - // have a reference to the resolver cannot tell that the promise - // has been resolved using try/catch - throw new Error("already completed"); - }; - - // Free progressHandlers array since we'll never issue progress events - // for this promise again now that it's completed - progressHandlers = undef; - - // Notify listeners - // Traverse all listeners registered directly with this Deferred - - while (listener = listeners[i++]) { - listener(completed); - } - - listeners = []; - }; - - /** - * The full Deferred object, with both {@link Promise} and {@link Resolver} - * parts - * @class Deferred - * @name Deferred - * @augments Resolver - * @augments Promise - */ - deferred = {}; - - // Promise and Resolver parts - // Freeze Promise and Resolver APIs - - /** - * The Promise API - * @namespace Promise - * @name Promise - */ - promise = new Promise(); - promise.then = deferred.then = then; - - /** - * The {@link Promise} for this {@link Deferred} - * @memberOf Deferred - * @name promise - * @type {Promise} - */ - deferred.promise = freeze(promise); - - /** - * The {@link Resolver} for this {@link Deferred} - * @namespace Resolver - * @name Resolver - * @memberOf Deferred - * @name resolver - * @type {Resolver} - */ - deferred.resolver = freeze({ - resolve: (deferred.resolve = resolve), - reject: (deferred.reject = reject), - progress: (deferred.progress = progress) - }); - - return deferred; - } - - /** - * Determines if promiseOrValue is a promise or not. Uses the feature - * test from http://wiki.commonjs.org/wiki/Promises/A to determine if - * promiseOrValue is a promise. - * - * @param promiseOrValue anything - * - * @returns {Boolean} true if promiseOrValue is a {@link Promise} - */ - function isPromise(promiseOrValue) { - return promiseOrValue && typeof promiseOrValue.then === 'function'; - } - - /** - * Register an observer for a promise or immediate value. - * - * @function - * @name when - * @namespace - * - * @param promiseOrValue anything - * @param {Function} [callback] callback to be called when promiseOrValue is - * successfully resolved. If promiseOrValue is an immediate value, callback - * will be invoked immediately. - * @param {Function} [errback] callback to be called when promiseOrValue is - * rejected. - * @param {Function} [progressHandler] callback to be called when progress updates - * are issued for promiseOrValue. - * - * @returns {Promise} a new {@link Promise} that will complete with the return - * value of callback or errback or the completion value of promiseOrValue if - * callback and/or errback is not supplied. - */ - function when(promiseOrValue, callback, errback, progressHandler) { - // Get a promise for the input promiseOrValue - // See promise() - var trustedPromise = promise(promiseOrValue); - - // Register promise handlers - return trustedPromise.then(callback, errback, progressHandler); - } - - /** - * Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if - * promiseOrValue is a foreign promise, or a new, already-resolved {@link Promise} - * whose resolution value is promiseOrValue if promiseOrValue is an immediate value. - * - * Note that this function is not safe to export since it will return its - * input when promiseOrValue is a {@link Promise} - * - * @private - * - * @param promiseOrValue anything - * - * @returns Guaranteed to return a trusted Promise. If promiseOrValue is a when.js {@link Promise} - * returns promiseOrValue, otherwise, returns a new, already-resolved, when.js {@link Promise} - * whose resolution value is: - * * the resolution value of promiseOrValue if it's a foreign promise, or - * * promiseOrValue if it's a value - */ - function promise(promiseOrValue) { - var promise, deferred; - - if(promiseOrValue instanceof Promise) { - // It's a when.js promise, so we trust it - promise = promiseOrValue; - - } else { - // It's not a when.js promise. Check to see if it's a foreign promise - // or a value. - - deferred = defer(); - if(isPromise(promiseOrValue)) { - // It's a compliant promise, but we don't know where it came from, - // so we don't trust its implementation entirely. Introduce a trusted - // middleman when.js promise - - // IMPORTANT: This is the only place when.js should ever call .then() on - // an untrusted promise. - promiseOrValue.then(deferred.resolve, deferred.reject, deferred.progress); - promise = deferred.promise; - - } else { - // It's a value, not a promise. Create an already-resolved promise - // for it. - deferred.resolve(promiseOrValue); - promise = deferred.promise; - } - } - - return promise; - } - - /** - * Return a promise that will resolve when howMany of the supplied promisesOrValues - * have resolved. The resolution value of the returned promise will be an array of - * length howMany containing the resolutions values of the triggering promisesOrValues. - * - * @memberOf when - * - * @param promisesOrValues {Array} array of anything, may contain a mix - * of {@link Promise}s and values - * @param howMany - * @param [callback] - * @param [errback] - * @param [progressHandler] - * - * @returns {Promise} - */ - function some(promisesOrValues, howMany, callback, errback, progressHandler) { - var toResolve, results, ret, deferred, resolver, rejecter, handleProgress, len, i; - - len = promisesOrValues.length >>> 0; - - toResolve = Math.max(0, Math.min(howMany, len)); - results = []; - deferred = defer(); - ret = when(deferred, callback, errback, progressHandler); - - // Wrapper so that resolver can be replaced - function resolve(val) { - resolver(val); - } - - // Wrapper so that rejecter can be replaced - function reject(err) { - rejecter(err); - } - - // Wrapper so that progress can be replaced - function progress(update) { - handleProgress(update); - } - - function complete() { - resolver = rejecter = handleProgress = noop; - } - - // No items in the input, resolve immediately - if (!toResolve) { - deferred.resolve(results); - - } else { - // Resolver for promises. Captures the value and resolves - // the returned promise when toResolve reaches zero. - // Overwrites resolver var with a noop once promise has - // be resolved to cover case where n < promises.length - resolver = function(val) { - // This orders the values based on promise resolution order - // Another strategy would be to use the original position of - // the corresponding promise. - results.push(val); - - if (!--toResolve) { - complete(); - deferred.resolve(results); - } - }; - - // Rejecter for promises. Rejects returned promise - // immediately, and overwrites rejecter var with a noop - // once promise to cover case where n < promises.length. - // TODO: Consider rejecting only when N (or promises.length - N?) - // promises have been rejected instead of only one? - rejecter = function(err) { - complete(); - deferred.reject(err); - }; - - handleProgress = deferred.progress; - - // TODO: Replace while with forEach - for(i = 0; i < len; ++i) { - if(i in promisesOrValues) { - when(promisesOrValues[i], resolve, reject, progress); - } - } - } - - return ret; - } - - /** - * Return a promise that will resolve only once all the supplied promisesOrValues - * have resolved. The resolution value of the returned promise will be an array - * containing the resolution values of each of the promisesOrValues. - * - * @memberOf when - * - * @param promisesOrValues {Array} array of anything, may contain a mix - * of {@link Promise}s and values - * @param [callback] {Function} - * @param [errback] {Function} - * @param [progressHandler] {Function} - * - * @returns {Promise} - */ - function all(promisesOrValues, callback, errback, progressHandler) { - var results, promise; - - results = allocateArray(promisesOrValues.length); - promise = reduce(promisesOrValues, reduceIntoArray, results); - - return when(promise, callback, errback, progressHandler); - } - - function reduceIntoArray(current, val, i) { - current[i] = val; - return current; - } - - /** - * Return a promise that will resolve when any one of the supplied promisesOrValues - * has resolved. The resolution value of the returned promise will be the resolution - * value of the triggering promiseOrValue. - * - * @memberOf when - * - * @param promisesOrValues {Array} array of anything, may contain a mix - * of {@link Promise}s and values - * @param [callback] {Function} - * @param [errback] {Function} - * @param [progressHandler] {Function} - * - * @returns {Promise} - */ - function any(promisesOrValues, callback, errback, progressHandler) { - - function unwrapSingleResult(val) { - return callback(val[0]); - } - - return some(promisesOrValues, 1, unwrapSingleResult, errback, progressHandler); - } - - /** - * Traditional map function, similar to `Array.prototype.map()`, but allows - * input to contain {@link Promise}s and/or values, and mapFunc may return - * either a value or a {@link Promise} - * - * @memberOf when - * - * @param promisesOrValues {Array} array of anything, may contain a mix - * of {@link Promise}s and values - * @param mapFunc {Function} mapping function mapFunc(value) which may return - * either a {@link Promise} or value - * - * @returns {Promise} a {@link Promise} that will resolve to an array containing - * the mapped output values. - */ - function map(promisesOrValues, mapFunc) { - - var results, i; - - // Since we know the resulting length, we can preallocate the results - // array to avoid array expansions. - i = promisesOrValues.length; - results = allocateArray(i); - - // Since mapFunc may be async, get all invocations of it into flight - // asap, and then use reduce() to collect all the results - for(;i >= 0; --i) { - if(i in promisesOrValues) - results[i] = when(promisesOrValues[i], mapFunc); - } - - // Could use all() here, but that would result in another array - // being allocated, i.e. map() would end up allocating 2 arrays - // of size len instead of just 1. Since all() uses reduce() - // anyway, avoid the additional allocation by calling reduce - // directly. - return reduce(results, reduceIntoArray, results); - } - - /** - * Traditional reduce function, similar to `Array.prototype.reduce()`, but - * input may contain {@link Promise}s and/or values, but reduceFunc - * may return either a value or a {@link Promise}, *and* initialValue may - * be a {@link Promise} for the starting value. - * - * @memberOf when - * - * @param promisesOrValues {Array} array of anything, may contain a mix - * of {@link Promise}s and values - * @param reduceFunc {Function} reduce function reduce(currentValue, nextValue, index, total), - * where total is the total number of items being reduced, and will be the same - * in each call to reduceFunc. - * @param initialValue starting value, or a {@link Promise} for the starting value - * - * @returns {Promise} that will resolve to the final reduced value - */ - function reduce(promisesOrValues, reduceFunc, initialValue) { - - var total, args; - - total = promisesOrValues.length; - - // Skip promisesOrValues, since it will be used as 'this' in the call - // to the actual reduce engine below. - - // Wrap the supplied reduceFunc with one that handles promises and then - // delegates to the supplied. - - args = [ - function (current, val, i) { - return when(current, function (c) { - return when(val, function (value) { - return reduceFunc(c, value, i, total); - }); - }); - } - ]; - - if (arguments.length >= 3) args.push(initialValue); - - return promise(reduceArray.apply(promisesOrValues, args)); - } - - /** - * Ensure that resolution of promiseOrValue will complete resolver with the completion - * value of promiseOrValue, or instead with resolveValue if it is provided. - * - * @memberOf when - * - * @param promiseOrValue - * @param resolver {Resolver} - * @param [resolveValue] anything - * - * @returns {Promise} - */ - function chain(promiseOrValue, resolver, resolveValue) { - var useResolveValue = arguments.length > 2; - - return when(promiseOrValue, - function(val) { - if(useResolveValue) val = resolveValue; - resolver.resolve(val); - return val; - }, - function(e) { - resolver.reject(e); - return rejected(e); - }, - resolver.progress - ); - } - - // - // Public API - // - - when.defer = defer; - - when.isPromise = isPromise; - when.some = some; - when.all = all; - when.any = any; - - when.reduce = reduce; - when.map = map; - - when.chain = chain; - - return when; -}); -})(typeof define == 'function' - ? define - : function (factory) { typeof module != 'undefined' - ? (module.exports = factory()) - : (this.when = factory()); - } - // Boilerplate for AMD, Node, and browser global -); diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/.gitignore b/app/Vendor/Ratchet/vendor/evenement/evenement/.gitignore deleted file mode 100644 index 987e2a253c..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -composer.lock -vendor diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/.travis.yml b/app/Vendor/Ratchet/vendor/evenement/evenement/.travis.yml deleted file mode 100644 index 913a832bcb..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: php - -php: - - 5.3 - - 5.4 - - 5.5 - -before_script: - - wget http://getcomposer.org/composer.phar - - php composer.phar install - -script: phpunit --coverage-text diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/LICENSE b/app/Vendor/Ratchet/vendor/evenement/evenement/LICENSE deleted file mode 100644 index d9a37d0a04..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Igor Wiedler - -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/app/Vendor/Ratchet/vendor/evenement/evenement/README.md b/app/Vendor/Ratchet/vendor/evenement/evenement/README.md deleted file mode 100644 index 684c5c08bd..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# Événement - -Événement is a very simple event dispatching library for PHP 5.3. - -It has the same design goals as [Silex](http://silex-project.org) and -[Pimple](http://pimple-project.org), to empower the user while staying concise -and simple. - -It is very strongly inspired by the EventEmitter API found in -[node.js](http://nodejs.org). It includes an implementation of -[EventEmitter2](https://github.com/hij1nx/EventEmitter2), that extends -the original EventEmitter. - -[![Build Status](https://secure.travis-ci.org/igorw/evenement.png)](http://travis-ci.org/igorw/evenement) - -## Fetch - -The recommended way to install Événement is [through composer](http://getcomposer.org). - -Just create a composer.json file for your project: - -```JSON -{ - "require": { - "evenement/evenement": "1.0.*" - } -} -``` - -And run these two commands to install it: - - $ curl -s http://getcomposer.org/installer | php - $ php composer.phar install - -Now you can add the autoloader, and you will have access to the library: - -```php -on('user.create', function (User $user) use ($logger) { - $logger->log(sprintf("User '%s' was created.", $user->getLogin())); -}); -``` - -### Emitting Events - -```php -emit('user.create', array($user)); -``` - -Tests ------ - - $ phpunit - -License -------- -MIT, see LICENSE. diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/composer.json b/app/Vendor/Ratchet/vendor/evenement/evenement/composer.json deleted file mode 100644 index 2d14e2ccce..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/composer.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "evenement/evenement", - "description": "Événement is a very simple event dispatching library for PHP 5.3", - "keywords": ["event-dispatcher"], - "license": "MIT", - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "require": { - "php": ">=5.3.0" - }, - "autoload": { - "psr-0": { - "Evenement": "src" - } - }, - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/doc/00-intro.md b/app/Vendor/Ratchet/vendor/evenement/evenement/doc/00-intro.md deleted file mode 100644 index 6c28a2ab2c..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/doc/00-intro.md +++ /dev/null @@ -1,28 +0,0 @@ -# Introduction - -Événement is is French and means "event". The événement library aims to -provide a simple way of subscribing to events and notifying those subscribers -whenever an event occurs. - -The API that it exposes is almost a direct port of the EventEmitter API found -in node.js. It also includes an "EventEmitter". There are some minor -differences however. - -The EventEmitter is an implementation of the publish-subscribe pattern, which -is a generalized version of the observer pattern. The observer pattern -specifies an observable subject, which observers can register themselves to. -Once something interesting happens, the subject notifies its observers. - -Pub/sub takes the same idea but encapsulates the observation logic inside a -separate object which manages all of its subscribers or listeners. Subscribers -are bound to an event name, and will only receive notifications of the events -they subscribed to. - -**TLDR: What does evenement do, in short? It provides a mapping from event -names to a list of listener functions and triggers each listener for a given -event when it is emitted.** - -Why do we do this, you ask? To achieve decoupling. - -It allows you to design a system where the core will emit events, and modules -are able to subscribe to these events. And respond to them. diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/doc/01-api.md b/app/Vendor/Ratchet/vendor/evenement/evenement/doc/01-api.md deleted file mode 100644 index 1407637632..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/doc/01-api.md +++ /dev/null @@ -1,77 +0,0 @@ -# API - -The API that événement exposes is defined by the -`Evenement\EventEmitterInterface`. The interface is useful if you want to -define an interface that extends the emitter and implicitly defines certain -events to be emitted, or if you want to type hint an `EventEmitter` to be -passed to a method without coupling to the specific implementation. - -## on($event, callable $listener) - -Allows you to subscribe to an event. - -Example: - - $emitter->on('user.created', function (User $user) use ($logger) { - $logger->log(sprintf("User '%s' was created.", $user->getLogin())); - }); - -Since the listener can be any callable, you could also use an instance method -instead of the anonymous function: - - $loggerSubscriber = new LoggerSubscriber($logger); - $emitter->on('user.created', array($loggerSubscriber, 'onUserCreated')); - -This has the benefit that listener does not even need to know that the emitter -exists. - -You can also accept more than one parameter for the listener: - - $emitter->on('numbers_added', function ($result, $a, $b) {}); - -## once($event, callable $listener) - -Convenience method that adds a listener which is guaranteed to only be called -once. - -Example: - - $conn->once('connected', function () use ($conn, $data) { - $conn->send($data); - }); - -## emit($event, array $arguments = []) - -Emit an event, which will call all listeners. - -Example: - - $conn->emit('data', array($data)); - -The second argument to emit is an array of listener arguments. This is how you -specify more args: - - $result = $a + $b; - $emitter->emit('numbers_added', array($result, $a, $b)); - -## listeners($event) - -Allows you to inspect the listeners attached to an event. Particularly useful -to check if there are any listeners at all. - -Example: - - $e = new \RuntimeException('Everything is broken!'); - if (0 === count($emitter->listeners('error'))) { - throw $e; - } - -## removeListener($event, callable $listener) - -Remove a specific listener for a specific event. - -## removeAllListeners($event = null) - -Remove all listeners for a specific event or all listeners alltogether. This -is useful for long-running processes, where you want to remove listeners in -order to allow them to get garbage collected. diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/doc/02-plugin-system.md b/app/Vendor/Ratchet/vendor/evenement/evenement/doc/02-plugin-system.md deleted file mode 100644 index 8c6acbfce2..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/doc/02-plugin-system.md +++ /dev/null @@ -1,147 +0,0 @@ -# Example: Plugin system - -In this example I will show you how to create a generic plugin system with -événement where plugins can alter the behaviour of the app. The app is a blog. -Boring, I know. By using the EventEmitter it will be easy to extend this blog -with additional functionality without modifying the core system. - -The blog is quite basic. Users are able to create blog posts when they log in. -The users are stored in a static config file, so there is no sign up process. -Once logged in they get a "new post" link which gives them a form where they -can create a new blog post with plain HTML. That will store the post in a -document database. The index lists all blog post titles by date descending. -Clicking on the post title will take you to the full post. - -## Plugin structure - -The goal of the plugin system is to allow features to be added to the blog -without modifying any core files of the blog. - -The plugins are managed through a config file, `plugins.json`. This JSON file -contains a JSON-encoded list of class-names for plugin classes. This allows -you to enable and disable plugins in a central location. The initial -`plugins.json` is just an empty array: - - [] - -A plugin class must implement the `PluginInterface`: - - interface PluginInterface - { - function attachEvents(EventEmitterInterface $emitter); - } - -The `attachEvents` method allows the plugin to attach any events to the -emitter. For example: - - class FooPlugin implements PluginInterface - { - public function attachEvents(EventEmitterInterface $emitter) - { - $emitter->on('foo', function () { - echo 'bar!'; - }); - } - } - -The blog system creates an emitter instance and loads the plugins: - - $emitter = new EventEmitter(); - - $pluginClasses = json_decode(file_get_contents('plugins.json'), true); - foreach ($pluginClasses as $pluginClass) { - $plugin = new $pluginClass(); - $pluginClass->attachEvents($emitter); - } - -This is the base system. There are no plugins yet, and there are no events yet -either. That's because I don't know which extension points will be needed. I -will add them on demand. - -## Feature: Markdown - -Writing blog posts in HTML sucks! Wouldn't it be great if I could write them -in a nice format such as markdown, and have that be converted to HTML for me? - -This feature will need two extension points. I need to be able to mark posts -as markdown, and I need to be able to hook into the rendering of the post body -and convert it from markdown to HTML. So the blog needs two new events: -`post.create` and `post.render`. - -In the code that creates the post, I'll insert the `post.create` event: - - class PostEvent - { - public $post; - - public function __construct(array $post) - { - $this->post = $post; - } - } - - $post = createPostFromRequest($_POST); - - $event = new PostEvent($post); - $emitter->emit('post.create', array($event)); - $post = $event->post; - - $db->save('post', $post); - -This shows that you can wrap a value in an event object to make it mutable, -allowing listeners to change it. - -The same thing for the `post.render` event: - - public function renderPostBody(array $post) - { - $emitter = $this->emitter; - - $event = new PostEvent($post); - $emitter->emit('post.render', array($event)); - $post = $event->post; - - return $post['body']; - } - -

    -

    - -Ok, the events are in place. It's time to create the first plugin, woohoo! I -will call this the `MarkdownPlugin`, so here's `plugins.json`: - - [ - "MarkdownPlugin" - ] - -The `MarkdownPlugin` class will be autoloaded, so I don't have to worry about -including any files. I just have to worry about implementing the plugin class. -The `markdown` function represents a markdown to HTML converter. - - class MarkdownPlugin implements PluginInterface - { - public function attachEvents(EventEmitterInterface $emitter) - { - $emitter->on('post.create', function (PostEvent $event) { - $event->post['format'] = 'markdown'; - }); - - $emitter->on('post.render', function (PostEvent $event) { - if (isset($event->post['format']) && 'markdown' === $event->post['format']) { - $event->post['body'] = markdown($event->post['body']); - } - }); - } - } - -There you go, the blog now renders posts as markdown. But all of the previous -posts before the addition of the markdown plugin are still rendered correctly -as raw HTML. - -## Feature: Comments - -TODO - -## Feature: Comment spam control - -TODO diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/phpunit.xml.dist b/app/Vendor/Ratchet/vendor/evenement/evenement/phpunit.xml.dist deleted file mode 100644 index 8be0651849..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/phpunit.xml.dist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ./tests/Evenement/ - - - - - - ./src/ - - - diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter.php b/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter.php deleted file mode 100644 index df591c8576..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Evenement; - -class EventEmitter implements EventEmitterInterface -{ - protected $listeners = array(); - - public function on($event, $listener) - { - if (!is_callable($listener)) { - throw new \InvalidArgumentException('The provided listener was not a valid callable.'); - } - - if (!isset($this->listeners[$event])) { - $this->listeners[$event] = array(); - } - - $this->listeners[$event][] = $listener; - } - - public function once($event, $listener) - { - $that = $this; - - $onceListener = function () use ($that, &$onceListener, $event, $listener) { - $that->removeListener($event, $onceListener); - - call_user_func_array($listener, func_get_args()); - }; - - $this->on($event, $onceListener); - } - - public function removeListener($event, $listener) - { - if (isset($this->listeners[$event])) { - if (false !== $index = array_search($listener, $this->listeners[$event], true)) { - unset($this->listeners[$event][$index]); - } - } - } - - public function removeAllListeners($event = null) - { - if ($event !== null) { - unset($this->listeners[$event]); - } else { - $this->listeners = array(); - } - } - - public function listeners($event) - { - return isset($this->listeners[$event]) ? $this->listeners[$event] : array(); - } - - public function emit($event, array $arguments = array()) - { - foreach ($this->listeners($event) as $listener) { - call_user_func_array($listener, $arguments); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter2.php b/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter2.php deleted file mode 100644 index b051609986..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitter2.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Evenement; - -class EventEmitter2 extends EventEmitter -{ - protected $options; - protected $anyListeners = array(); - - public function __construct(array $options = array()) - { - $this->options = array_merge(array( - 'delimiter' => '.', - ), $options); - } - - public function onAny($listener) - { - $this->anyListeners[] = $listener; - } - - public function offAny($listener) - { - if (false !== $index = array_search($listener, $this->anyListeners, true)) { - unset($this->anyListeners[$index]); - } - } - - public function many($event, $timesToListen, $listener) - { - $that = $this; - - $timesListened = 0; - - if ($timesToListen == 0) { - return; - } - - if ($timesToListen < 0) { - throw new \OutOfRangeException('You cannot listen less than zero times.'); - } - - $manyListener = function () use ($that, &$timesListened, &$manyListener, $event, $timesToListen, $listener) { - if (++$timesListened == $timesToListen) { - $that->removeListener($event, $manyListener); - } - - call_user_func_array($listener, func_get_args()); - }; - - $this->on($event, $manyListener); - } - - public function emit($event, array $arguments = array()) - { - foreach ($this->anyListeners as $listener) { - call_user_func_array($listener, $arguments); - } - - parent::emit($event, $arguments); - } - - public function listeners($event) - { - $matchedListeners = array(); - - foreach ($this->listeners as $name => $listeners) { - foreach ($listeners as $listener) { - if ($this->matchEventName($event, $name)) { - $matchedListeners[] = $listener; - } - } - } - - return $matchedListeners; - } - - protected function matchEventName($matchPattern, $eventName) - { - $patternParts = explode($this->options['delimiter'], $matchPattern); - $nameParts = explode($this->options['delimiter'], $eventName); - - if (count($patternParts) != count($nameParts)) { - return false; - } - - $size = min(count($patternParts), count($nameParts)); - for ($i = 0; $i < $size; $i++) { - $patternPart = $patternParts[$i]; - $namePart = $nameParts[$i]; - - if ('*' === $patternPart || '*' === $namePart) { - continue; - } - - if ($namePart === $patternPart) { - continue; - } - - return false; - } - - return true; - } -} diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php b/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php deleted file mode 100644 index 665a9478c3..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/src/Evenement/EventEmitterInterface.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Evenement; - -interface EventEmitterInterface -{ - public function on($event, $listener); - public function once($event, $listener); - public function removeListener($event, $listener); - public function removeAllListeners($event = null); - public function listeners($event); - public function emit($event, array $arguments = array()); -} diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitter2Test.php b/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitter2Test.php deleted file mode 100644 index 7be4290452..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitter2Test.php +++ /dev/null @@ -1,160 +0,0 @@ -emitter = new EventEmitter2(); - } - - // matching tests from - // test/wildcardEvents/addListener.js - - public function testWildcardMatching7() - { - $listenerCalled = 0; - - $listener = function () use (&$listenerCalled) { - $listenerCalled++; - }; - - $this->emitter->on('*.test', $listener); - $this->emitter->on('*.*', $listener); - $this->emitter->on('*', $listener); - - $this->emitter->emit('other.emit'); - $this->emitter->emit('foo.test'); - - $this->assertSame(3, $listenerCalled); - } - - public function testWildcardMatching8() - { - $listenerCalled = 0; - - $listener = function () use (&$listenerCalled) { - $listenerCalled++; - }; - - $this->emitter->on('foo.test', $listener); - $this->emitter->on('*.*', $listener); - $this->emitter->on('*', $listener); - - $this->emitter->emit('*.*'); - $this->emitter->emit('foo.test'); - $this->emitter->emit('*'); - - $this->assertSame(5, $listenerCalled); - } - - public function testOnAny() - { - $this->emitter->onAny(function () {}); - } - - public function testOnAnyWithEmit() - { - $listenerCalled = 0; - - $this->emitter->onAny(function () use (&$listenerCalled) { - $listenerCalled++; - }); - - $this->assertSame(0, $listenerCalled); - - $this->emitter->emit('foo'); - - $this->assertSame(1, $listenerCalled); - - $this->emitter->emit('bar'); - - $this->assertSame(2, $listenerCalled); - } - - public function testoffAnyWithEmit() - { - $listenerCalled = 0; - - $listener = function () use (&$listenerCalled) { - $listenerCalled++; - }; - - $this->emitter->onAny($listener); - $this->emitter->offAny($listener); - - $this->assertSame(0, $listenerCalled); - $this->emitter->emit('foo'); - $this->assertSame(0, $listenerCalled); - } - - /** - * @dataProvider provideMany - */ - public function testMany($amount) - { - $listenerCalled = 0; - - $this->emitter->many('foo', $amount, function () use (&$listenerCalled) { - $listenerCalled++; - }); - - for ($i = 0; $i < $amount; $i++) { - $this->assertSame($i, $listenerCalled); - $this->emitter->emit('foo'); - } - - $this->emitter->emit('foo'); - $this->assertSame($amount, $listenerCalled); - } - - public function provideMany() - { - return array( - array(0), - array(1), - array(2), - array(3), - array(4), - array(400), - ); - } - - /** - * @expectedException OutOfRangeException - */ - public function testManyWithLessThanZeroTtl() - { - $this->emitter->many('foo', -1, function () {}); - $this->emitter->emit('foo'); - } -} diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php b/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php deleted file mode 100644 index 3f6be1dd68..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/EventEmitterTest.php +++ /dev/null @@ -1,236 +0,0 @@ -emitter = new EventEmitter(); - } - - public function testAddListenerWithLambda() - { - $this->emitter->on('foo', function () {}); - } - - public function testAddListenerWithMethod() - { - $listener = new Listener(); - $this->emitter->on('foo', array($listener, 'onFoo')); - } - - public function testAddListenerWithStaticMethod() - { - $this->emitter->on('bar', array('Evenement\Tests\Listener', 'onBar')); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testAddListenerWithInvalidListener() - { - $this->emitter->on('foo', 'not a callable'); - } - - public function testOnce() - { - $listenerCalled = 0; - - $this->emitter->once('foo', function () use (&$listenerCalled) { - $listenerCalled++; - }); - - $this->assertSame(0, $listenerCalled); - - $this->emitter->emit('foo'); - - $this->assertSame(1, $listenerCalled); - - $this->emitter->emit('foo'); - - $this->assertSame(1, $listenerCalled); - } - - public function testEmitWithoutArguments() - { - $listenerCalled = false; - - $this->emitter->on('foo', function () use (&$listenerCalled) { - $listenerCalled = true; - }); - - $this->assertSame(false, $listenerCalled); - $this->emitter->emit('foo'); - $this->assertSame(true, $listenerCalled); - } - - public function testEmitWithOneArgument() - { - $test = $this; - - $listenerCalled = false; - - $this->emitter->on('foo', function ($value) use (&$listenerCalled, $test) { - $listenerCalled = true; - - $test->assertSame('bar', $value); - }); - - $this->assertSame(false, $listenerCalled); - $this->emitter->emit('foo', array('bar')); - $this->assertSame(true, $listenerCalled); - } - - public function testEmitWithTwoArguments() - { - $test = $this; - - $listenerCalled = false; - - $this->emitter->on('foo', function ($arg1, $arg2) use (&$listenerCalled, $test) { - $listenerCalled = true; - - $test->assertSame('bar', $arg1); - $test->assertSame('baz', $arg2); - }); - - $this->assertSame(false, $listenerCalled); - $this->emitter->emit('foo', array('bar', 'baz')); - $this->assertSame(true, $listenerCalled); - } - - public function testEmitWithNoListeners() - { - $this->emitter->emit('foo'); - $this->emitter->emit('foo', array('bar')); - $this->emitter->emit('foo', array('bar', 'baz')); - } - - public function testEmitWithTwoListeners() - { - $listenersCalled = 0; - - $this->emitter->on('foo', function () use (&$listenersCalled) { - $listenersCalled++; - }); - - $this->emitter->on('foo', function () use (&$listenersCalled) { - $listenersCalled++; - }); - - $this->assertSame(0, $listenersCalled); - $this->emitter->emit('foo'); - $this->assertSame(2, $listenersCalled); - } - - public function testRemoveListenerMatching() - { - $listenersCalled = 0; - - $listener = function () use (&$listenersCalled) { - $listenersCalled++; - }; - - $this->emitter->on('foo', $listener); - $this->emitter->removeListener('foo', $listener); - - $this->assertSame(0, $listenersCalled); - $this->emitter->emit('foo'); - $this->assertSame(0, $listenersCalled); - } - - public function testRemoveListenerNotMatching() - { - $listenersCalled = 0; - - $listener = function () use (&$listenersCalled) { - $listenersCalled++; - }; - - $this->emitter->on('foo', $listener); - $this->emitter->removeListener('bar', $listener); - - $this->assertSame(0, $listenersCalled); - $this->emitter->emit('foo'); - $this->assertSame(1, $listenersCalled); - } - - public function testRemoveAllListenersMatching() - { - $listenersCalled = 0; - - $this->emitter->on('foo', function () use (&$listenersCalled) { - $listenersCalled++; - }); - - $this->emitter->removeAllListeners('foo'); - - $this->assertSame(0, $listenersCalled); - $this->emitter->emit('foo'); - $this->assertSame(0, $listenersCalled); - } - - public function testRemoveAllListenersNotMatching() - { - $listenersCalled = 0; - - $this->emitter->on('foo', function () use (&$listenersCalled) { - $listenersCalled++; - }); - - $this->emitter->removeAllListeners('bar'); - - $this->assertSame(0, $listenersCalled); - $this->emitter->emit('foo'); - $this->assertSame(1, $listenersCalled); - } - - public function testRemoveAllListenersWithoutArguments() - { - $listenersCalled = 0; - - $this->emitter->on('foo', function () use (&$listenersCalled) { - $listenersCalled++; - }); - - $this->emitter->on('bar', function () use (&$listenersCalled) { - $listenersCalled++; - }); - - $this->emitter->removeAllListeners(); - - $this->assertSame(0, $listenersCalled); - $this->emitter->emit('foo'); - $this->emitter->emit('bar'); - $this->assertSame(0, $listenersCalled); - } -} diff --git a/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php b/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php deleted file mode 100644 index 7032442aa8..0000000000 --- a/app/Vendor/Ratchet/vendor/evenement/evenement/tests/Evenement/Tests/Listener.php +++ /dev/null @@ -1,38 +0,0 @@ -add('Evenement\Tests', __DIR__); diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/.gitignore b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/.gitignore deleted file mode 100644 index a4513fcd83..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -test.html -WebSocket.swc -flash-src-websocket diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/LICENSE.txt b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/LICENSE.txt deleted file mode 100644 index aee9d042fc..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/LICENSE.txt +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) 2013, Hiroshi Ichikawa -All rights reserved. - -Redistribution and use in source and binary forms, 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. -Neither the name of the Hiroshi Ichikawa nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/NEWS.md b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/NEWS.md deleted file mode 100644 index cec6d97b3f..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/NEWS.md +++ /dev/null @@ -1,17 +0,0 @@ -- 2011-12-27 - - web-socket-js now speaks WebSocket defined in RFC 6455, which is - equivalent to hybi-13 to hybi-17. It no longer supports old draft - protocols. - -- 2011-12-17 - - web-socket-js now uses MozWebSocket when available. i.e. When you load - web_socket.js, WebSocket is defined as alias of MozWebSocket when - available. - -- 2011-09-18 - - web-socket-js now speaks WebSocket version hybi-10. Old versions spoke - hixie-76. If you really need web-socket-js which speaks hixie-76, you can - get it from - [hixie-76 branch](https://github.com/gimite/web-socket-js/tree/hixie-76), - but the branch is no longer maintained. Implementation of hybi-10 is - mostly done by Joel Martin (kanaka). diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/README.md b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/README.md deleted file mode 100644 index b359e4d9cb..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/README.md +++ /dev/null @@ -1,169 +0,0 @@ -## How to try the sample - -Assuming you have Web server (e.g. Apache) running at **http://example.com/** . - -1. Download [web-socket-ruby](http://github.com/gimite/web-socket-ruby/tree/master). -2. Run sample Web Socket server (echo server) in example.com with: (#1)
    -``` -$ ruby web-socket-ruby/samples/echo_server.rb example.com 10081 -``` -3. If your server already provides socket policy file at port **843**, modify the file to allow access to port **10081**. Otherwise you can skip this step. See below for details. -4. Publish the web-socket-js directory with your Web server (e.g. put it in ~/public_html). -5. Change ws://localhost:10081 to **ws://example.com:10081** in sample.html. -6. Open sample.html in your browser. -7. After "onopen" is shown, input something, click [Send] and confirm echo back. - -\#1: First argument of echo_server.rb means that it accepts Web Socket connection from HTML pages in example.com. - - -## How to use it in your application - -- Copy swfobject.js, web_socket.js, WebSocketMain.swf to your application directory. -- Write JavaScript code: - -```html - - - - - -``` - -- Put Flash socket policy file to your server unless you use web-socket-ruby or em-websocket as your WebSocket server. See "Flash socket policy file" section below for details. - - -## Troubleshooting - -If it doesn't work, try these: - -1. Try Chrome and IE 8 or 9. - - - It doesn't work on Chrome:
    - It's likely an issue of your code or the server. Debug your code as usual e.g. using console.log. - - It works on Chrome but it doesn't work on IE:
    - It's likely an issue of web-socket-js specific configuration (e.g. 3 and 4 below). - - It works on both Chrome and IE, but it doesn't work on your browser:
    - Check "Supported environment" section below. Your browser may not be supported by web-socket-js. - -2. Add this line before your code: - WEB_SOCKET_DEBUG = true; -and use Developer Tools (Chrome/Safari) or Firebug (Firefox) to see if console.log outputs any errors. - -3. Make sure you do NOT open your HTML page as local file e.g. file:///.../sample.html. web-socket-js doesn't work on local file. Open it via Web server e.g. http:///.../sample.html. - -4. Make sure you host your HTML page and WebSocketMain.swf in the same domain. Otherwise, see "How to host HTML file and SWF file in different domains" section. - -5. If you are NOT using web-socket-ruby or em-websocket as your WebSocket server, you need to place Flash socket policy file on your server. See "Flash socket policy file" section below for details. - -6. Check if sample.html bundled with web-socket-js works. - -7. Make sure the port used for WebSocket (10081 in example above) is not blocked by your server/client's firewall. - -8. Install [debugger version of Flash Player](http://www.adobe.com/support/flashplayer/downloads.html) to see Flash errors. - -9. If you followed the steps above and you still have an issue, please [report here](https://github.com/gimite/web-socket-js/issues) with these information: - - - The WebSocket server library you use (e.g. em-websocket, pywebsocket) and its version - - The Web browser you use and its version - - The exact message you are trying to send from the server or the client - - The result of all steps above, especially error message in step 2 if any - - -## Supported environments - -It should work on: - -- Google Chrome 4 or later, Firefox 6 or later (uses native WebSocket or MozWebSocket implementation) -- Firefox 3 to 5, Internet Explorer 8, 9 + Flash Player 10 or later - -It may or may not work on other browsers such as Safari, Opera or IE 6. Patch for these browsers are appreciated, but I will not work on fixing issues specific to these browsers by myself. - - -## Limitations/differences compared to native WebSocket - -- You need some more lines in your JavaScript code. See "How to use it in your application" section above for details. -- It requires Flash Player 10 or later unless the browser supports native WebSocket. -- Your server must provide Flash socket policy file, unless you use web-socket-ruby or em-websocket. See "Flash socket policy file" section below for details. -- It has limited support for Cookies on WebSocket. See "Cookie support" section below for details. -- It doesn't use proxies specified in browser config. See "Proxy support" section below for details. - - -### Flash socket policy file - -This implementation uses Flash's socket, which means that your server must provide Flash socket policy file to declare the server accepts connections from Flash. - -If you use [web-socket-ruby](http://github.com/gimite/web-socket-ruby/tree/master) or [em-websocket](https://github.com/igrigorik/em-websocket), you don't need anything special, because they handle Flash socket policy file request. But if you already provide socket policy file at port **843**, you need to modify the file to allow access to Web Socket port, because it precedes what the libraries provide. - -If you use other Web Socket server implementation, you need to provide socket policy file yourself. See [Setting up A Flash Socket Policy File](http://www.lightsphere.com/dev/articles/flash_socket_policy.html) for details. Implementation of socket policy file server is available at: - -- The article above (Perl implementation) -- [Ruby implementation](https://github.com/futurechimp/flash_policy_server) -- [Node.js implementation](https://github.com/3rd-Eden/FlashPolicyFileServer) - -Actually, it's still better to provide socket policy file at port 843 even if you use web-socket-ruby or em-websocket. Flash always try to connect to port 843 first, so providing the file at port 843 makes startup faster. - - -### Cookie support - -web-socket-js has limited supported for Cookies on WebSocket. - -Cookie is sent if Web Socket host is exactly the same as the origin of JavaScript (The port can be different). Otherwise it is not sent, because I don't know way to send right Cookie (which is Cookie of the host of Web Socket, I heard). Also, HttpOnly Cookies are not sent. - -Note that it's technically possible that client sends arbitrary string as Cookie and any other headers (by modifying this library for example) once you place Flash socket policy file in your server. So don't trust Cookie and other headers if you allow connection from untrusted origin. - - -### Proxy support - -[The WebSocket spec](http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10) specifies instructions for User Agents to support proxied connections by implementing the HTTP CONNECT method. - -The AS3 Socket class doesn't implement this mechanism, which renders it useless for the scenarios where the user trying to open a socket is behind a proxy. - -The class RFC2817Socket (by Christian Cantrell) effectively lets us implement this, as long as the proxy settings are known and provided by the interface that instantiates the WebSocket. As such, if you want to support proxied conncetions, you'll have to supply this information to the WebSocket constructor when Flash is being used. One way to go about it would be to ask the user for proxy settings information if the initial connection fails. - - -## How to host HTML file and SWF file in different domains - -By default, HTML file and SWF file must be in the same domain. You can follow steps below to allow hosting them in different domain. - -**WARNING**: If you use the method below, HTML files in ANY domains can send arbitrary TCP data to your WebSocket server, regardless of configuration in Flash socket policy file. Arbitrary TCP data means that they can even fake request headers including Origin and Cookie. - -1. Unzip WebSocketMainInsecure.zip to extract WebSocketMainInsecure.swf. -2. Put WebSocketMainInsecure.swf on your server, instead of WebSocketMain.swf. -3. In JavaScript, set WEB_SOCKET_SWF_LOCATION to URL of your WebSocketMainInsecure.swf. - - -## How to build WebSocketMain.swf - -Install [Flex 4 SDK](http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4). - - $ cd flash-src - $ ./build.sh - - -## WebSocket protocol versions - -- web-socket-js speaks WebSocket protocol defined in [RFC 6455](http://tools.ietf.org/html/rfc6455). -- web-socket-js doesn't speak old draft versions of WebSocket protocol including hixie-76, which was supported by old version of this library. If you really need web-socket-js which speaks hixie-76, you can get it from [hixie-76 branch](https://github.com/gimite/web-socket-js/tree/hixie-76), but the branch is no longer maintained. - - -## License - -New BSD License. diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/WebSocketMain.swf b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/WebSocketMain.swf deleted file mode 100644 index 2585879abf90a1db3a152311e3b25b222fea6b2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177215 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

    anz|4Q{zmDr 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

    A7yPd%+Kq9Ns0p7M(P>mnVfBI$2#>rnxl8GJBVH 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 diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/WebSocketMainInsecure.zip b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/WebSocketMainInsecure.zip deleted file mode 100644 index 13159d556e195615406a2d57ac235ed2bd83c02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170394 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 z 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 diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/bower.json b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/bower.json deleted file mode 100644 index 42fa7a2095..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/bower.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "gimite/web-socket-js", - "version": "1.0.1", - "description": "HTML5 Web Socket implementation powered by Flash", - "license": "New BSD", - "ignore": [ - "flash-src", - "src", - ".gitignore", - "LICENSE.txt", - "NEWS.md", - "README.md", - "sample.html", - "WebSocketMainInsecure.zip" - ], - "dependencies": { - }, - "devDependencies": { - } -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/.gitignore b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/.gitignore deleted file mode 100644 index 56fb545fa6..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build.properties diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.properties.sample b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.properties.sample deleted file mode 100644 index 6ae878699a..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.properties.sample +++ /dev/null @@ -1,2 +0,0 @@ -# Point this to your Flex SDK directory. -FLEX_HOME=/usr/local/share/flex_sdk_4 diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.sh b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.sh deleted file mode 100755 index 8f32185b61..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -# A script to build WebSocketMain.swf and WebSocketMainInsecure.zip. - -# You need Flex 4 SDK: -# http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4 - -mxmlc \ - -static-link-runtime-shared-libraries \ - -target-player=10.0.0 \ - -output=../WebSocketMain.swf \ - -source-path=src -source-path=third-party \ - src/net/gimite/websocket/WebSocketMain.as && - -mxmlc \ - -static-link-runtime-shared-libraries \ - -target-player=10.0.0 \ - -output=../WebSocketMainInsecure.swf \ - -source-path=src -source-path=third-party \ - src/net/gimite/websocket/WebSocketMainInsecure.as && - -cd .. && - -zip WebSocketMainInsecure.zip WebSocketMainInsecure.swf && -rm WebSocketMainInsecure.swf diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.xml b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.xml deleted file mode 100644 index 178f719660..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/build.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - true - 10 - - - - - - - - - true - 10 - - - - - - - - - - true - - - - - - - - - - - - true - - - - - - - - - - true - - - - - - - - \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/IWebSocketLogger.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/IWebSocketLogger.as deleted file mode 100644 index c3384f3475..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/IWebSocketLogger.as +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright: Hiroshi Ichikawa -// License: New BSD License - -package net.gimite.websocket { - -public interface IWebSocketLogger { - function log(message:String):void; - function error(message:String):void; -} - -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocket.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocket.as deleted file mode 100644 index 6ae5abae02..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocket.as +++ /dev/null @@ -1,614 +0,0 @@ -// Copyright: Hiroshi Ichikawa -// License: New BSD License -// Reference: http://dev.w3.org/html5/websockets/ -// Reference: http://tools.ietf.org/html/rfc6455 - -package net.gimite.websocket { - -import com.adobe.net.proxies.RFC2817Socket; -import com.gsolo.encryption.SHA1; -import com.hurlant.crypto.tls.TLSConfig; -import com.hurlant.crypto.tls.TLSEngine; -import com.hurlant.crypto.tls.TLSSecurityParameters; -import com.hurlant.crypto.tls.TLSSocket; - -import flash.display.*; -import flash.errors.*; -import flash.events.*; -import flash.external.*; -import flash.net.*; -import flash.system.*; -import flash.utils.*; - -import mx.controls.*; -import mx.core.*; -import mx.events.*; -import mx.utils.*; - -public class WebSocket extends EventDispatcher { - - private static const WEB_SOCKET_GUID:String = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - - private static const CONNECTING:int = 0; - private static const OPEN:int = 1; - private static const CLOSING:int = 2; - private static const CLOSED:int = 3; - - private static const OPCODE_CONTINUATION:int = 0x00; - private static const OPCODE_TEXT:int = 0x01; - private static const OPCODE_BINARY:int = 0x02; - private static const OPCODE_CLOSE:int = 0x08; - private static const OPCODE_PING:int = 0x09; - private static const OPCODE_PONG:int = 0x0a; - - private static const STATUS_NORMAL_CLOSURE:int = 1000; - private static const STATUS_NO_CODE:int = 1005; - private static const STATUS_CLOSED_ABNORMALLY:int = 1006; - private static const STATUS_CONNECTION_ERROR:int = 5000; - - private var id:int; - private var url:String; - private var scheme:String; - private var host:String; - private var port:uint; - private var path:String; - private var origin:String; - private var requestedProtocols:Array; - private var cookie:String; - private var headers:String; - - private var rawSocket:Socket; - private var tlsSocket:TLSSocket; - private var tlsConfig:TLSConfig; - private var socket:Socket; - - private var acceptedProtocol:String; - private var expectedDigest:String; - - private var buffer:ByteArray = new ByteArray(); - private var fragmentsBuffer:ByteArray = null; - private var headerState:int = 0; - private var readyState:int = CONNECTING; - - private var logger:IWebSocketLogger; - private var base64Encoder:Base64Encoder = new Base64Encoder(); - - public function WebSocket( - id:int, url:String, protocols:Array, origin:String, - proxyHost:String, proxyPort:int, - cookie:String, headers:String, - logger:IWebSocketLogger) { - this.logger = logger; - this.id = id; - this.url = url; - var m:Array = url.match(/^(\w+):\/\/([^\/:]+)(:(\d+))?(\/.*)?(\?.*)?$/); - if (!m) fatal("SYNTAX_ERR: invalid url: " + url); - this.scheme = m[1]; - this.host = m[2]; - var defaultPort:int = scheme == "wss" ? 443 : 80; - this.port = parseInt(m[4]) || defaultPort; - this.path = (m[5] || "/") + (m[6] || ""); - this.origin = origin; - this.requestedProtocols = protocols; - this.cookie = cookie; - // if present and not the empty string, headers MUST end with \r\n - // headers should be zero or more complete lines, for example - // "Header1: xxx\r\nHeader2: yyyy\r\n" - this.headers = headers; - - if (proxyHost != null && proxyPort != 0){ - if (scheme == "wss") { - fatal("wss with proxy is not supported"); - } - var proxySocket:RFC2817Socket = new RFC2817Socket(); - proxySocket.setProxyInfo(proxyHost, proxyPort); - proxySocket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); - rawSocket = socket = proxySocket; - } else { - rawSocket = new Socket(); - if (scheme == "wss") { - tlsConfig= new TLSConfig(TLSEngine.CLIENT, - null, null, null, null, null, - TLSSecurityParameters.PROTOCOL_VERSION); - tlsConfig.trustAllCertificates = true; - tlsConfig.ignoreCommonNameMismatch = true; - tlsSocket = new TLSSocket(); - tlsSocket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); - socket = tlsSocket; - } else { - rawSocket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData); - socket = rawSocket; - } - } - rawSocket.addEventListener(Event.CLOSE, onSocketClose); - rawSocket.addEventListener(Event.CONNECT, onSocketConnect); - rawSocket.addEventListener(IOErrorEvent.IO_ERROR, onSocketIoError); - rawSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSocketSecurityError); - rawSocket.connect(host, port); - } - - /** - * @return This WebSocket's ID. - */ - public function getId():int { - return this.id; - } - - /** - * @return this WebSocket's readyState. - */ - public function getReadyState():int { - return this.readyState; - } - - public function getAcceptedProtocol():String { - return this.acceptedProtocol; - } - - public function send(encData:String):int { - var data:String; - try { - data = decodeURIComponent(encData); - } catch (ex:URIError) { - logger.error("SYNTAX_ERR: URIError in send()"); - return 0; - } - logger.log("send: " + data); - var dataBytes:ByteArray = new ByteArray(); - dataBytes.writeUTFBytes(data); - if (readyState == OPEN) { - var frame:WebSocketFrame = new WebSocketFrame(); - frame.opcode = OPCODE_TEXT; - frame.payload = dataBytes; - if (sendFrame(frame)) { - return -1; - } else { - return dataBytes.length; - } - } else if (readyState == CLOSING || readyState == CLOSED) { - return dataBytes.length; - } else { - fatal("invalid state"); - return 0; - } - } - - public function close( - code:int = STATUS_NO_CODE, reason:String = "", origin:String = "client"):void { - if (code != STATUS_NORMAL_CLOSURE && - code != STATUS_NO_CODE && - code != STATUS_CONNECTION_ERROR) { - logger.error(StringUtil.substitute( - "Fail connection by {0}: code={1} reason={2}", origin, code, reason)); - } - var closeConnection:Boolean = - code == STATUS_CONNECTION_ERROR || origin == "server"; - try { - if (readyState == OPEN && code != STATUS_CONNECTION_ERROR) { - var frame:WebSocketFrame = new WebSocketFrame(); - frame.opcode = OPCODE_CLOSE; - frame.payload = new ByteArray(); - if (origin == "client" && code != STATUS_NO_CODE) { - frame.payload.writeShort(code); - frame.payload.writeUTFBytes(reason); - } - sendFrame(frame); - } - if (closeConnection) { - socket.close(); - } - } catch (ex:Error) { - logger.error("Error: " + ex.message); - } - if (closeConnection) { - logger.log("closed"); - var fireErrorEvent:Boolean = readyState != CONNECTING && code == STATUS_CONNECTION_ERROR; - readyState = CLOSED; - if (fireErrorEvent) { - dispatchEvent(new WebSocketEvent("error")); - } else { - var wasClean:Boolean = code != STATUS_CLOSED_ABNORMALLY && code != STATUS_CONNECTION_ERROR; - var eventCode:int = code == STATUS_CONNECTION_ERROR ? STATUS_CLOSED_ABNORMALLY : code; - dispatchCloseEvent(wasClean, eventCode, reason); - } - } else { - logger.log("closing"); - readyState = CLOSING; - } - } - - private function onSocketConnect(event:Event):void { - logger.log("connected"); - - if (scheme == "wss") { - logger.log("starting SSL/TLS"); - tlsSocket.startTLS(rawSocket, host, tlsConfig); - } - - var defaultPort:int = scheme == "wss" ? 443 : 80; - var hostValue:String = host + (port == defaultPort ? "" : ":" + port); - var key:String = generateKey(); - - SHA1.b64pad = "="; - expectedDigest = SHA1.b64_sha1(key + WEB_SOCKET_GUID); - - var opt:String = ""; - if (requestedProtocols.length > 0) { - opt += "Sec-WebSocket-Protocol: " + requestedProtocols.join(",") + "\r\n"; - } - // if caller passes additional headers they must end with "\r\n" - if (headers) opt += headers; - - var req:String = StringUtil.substitute( - "GET {0} HTTP/1.1\r\n" + - "Host: {1}\r\n" + - "Upgrade: websocket\r\n" + - "Connection: Upgrade\r\n" + - "Sec-WebSocket-Key: {2}\r\n" + - "Origin: {3}\r\n" + - "Sec-WebSocket-Version: 13\r\n" + - "Cookie: {4}\r\n" + - "{5}" + - "\r\n", - path, hostValue, key, origin, cookie, opt); - logger.log("request header:\n" + req); - socket.writeUTFBytes(req); - socket.flush(); - } - - private function onSocketClose(event:Event):void { - logger.log("closed"); - readyState = CLOSED; - dispatchCloseEvent(false, STATUS_CLOSED_ABNORMALLY, ""); - } - - private function onSocketIoError(event:IOErrorEvent):void { - var message:String; - if (readyState == CONNECTING) { - message = "cannot connect to Web Socket server at " + url + " (IoError: " + event.text + ")"; - } else { - message = - "error communicating with Web Socket server at " + url + - " (IoError: " + event.text + ")"; - } - onConnectionError(message); - } - - private function onSocketSecurityError(event:SecurityErrorEvent):void { - var message:String; - if (readyState == CONNECTING) { - message = - "cannot connect to Web Socket server at " + url + " (SecurityError: " + event.text + ")\n" + - "make sure the server is running and Flash socket policy file is correctly placed"; - } else { - message = - "error communicating with Web Socket server at " + url + - " (SecurityError: " + event.text + ")"; - } - onConnectionError(message); - } - - private function onConnectionError(message:String):void { - if (readyState == CLOSED) return; - logger.error(message); - close(STATUS_CONNECTION_ERROR); - } - - private function onSocketData(event:ProgressEvent):void { - var pos:int = buffer.length; - socket.readBytes(buffer, pos); - for (; pos < buffer.length; ++pos) { - if (headerState < 4) { - // try to find "\r\n\r\n" - if ((headerState == 0 || headerState == 2) && buffer[pos] == 0x0d) { - ++headerState; - } else if ((headerState == 1 || headerState == 3) && buffer[pos] == 0x0a) { - ++headerState; - } else { - headerState = 0; - } - if (headerState == 4) { - var headerStr:String = readUTFBytes(buffer, 0, pos + 1); - logger.log("response header:\n" + headerStr); - if (!validateHandshake(headerStr)) return; - removeBufferBefore(pos + 1); - pos = -1; - readyState = OPEN; - this.dispatchEvent(new WebSocketEvent("open")); - } - } else { - var frame:WebSocketFrame = parseFrame(); - if (frame) { - removeBufferBefore(frame.length); - pos = -1; - if (frame.rsv != 0) { - close(1002, "RSV must be 0."); - } else if (frame.mask) { - close(1002, "Frame from server must not be masked."); - } else if (frame.opcode >= 0x08 && frame.opcode <= 0x0f && frame.payload.length >= 126) { - close(1004, "Payload of control frame must be less than 126 bytes."); - } else { - switch (frame.opcode) { - case OPCODE_CONTINUATION: - if (fragmentsBuffer == null) { - close(1002, "Unexpected continuation frame"); - } else { - fragmentsBuffer.writeBytes(frame.payload); - if (frame.fin) { - data = readUTFBytes(fragmentsBuffer, 0, fragmentsBuffer.length); - try { - this.dispatchEvent(new WebSocketEvent("message", encodeURIComponent(data))); - } catch (ex:URIError) { - close(1007, "URIError while encoding the received data."); - } - fragmentsBuffer = null; - } - } - break; - case OPCODE_TEXT: - if (frame.fin) { - var data:String = readUTFBytes(frame.payload, 0, frame.payload.length); - try { - this.dispatchEvent(new WebSocketEvent("message", encodeURIComponent(data))); - } catch (ex:URIError) { - close(1007, "URIError while encoding the received data."); - } - } else { - fragmentsBuffer = new ByteArray(); - fragmentsBuffer.writeBytes(frame.payload); - } - break; - case OPCODE_BINARY: - // See https://github.com/gimite/web-socket-js/pull/89 - // for discussion about supporting binary data. - close(1003, "Received binary data, which is not supported."); - break; - case OPCODE_CLOSE: - // Extracts code and reason string. - var code:int = STATUS_NO_CODE; - var reason:String = ""; - if (frame.payload.length >= 2) { - frame.payload.endian = Endian.BIG_ENDIAN; - frame.payload.position = 0; - code = frame.payload.readUnsignedShort(); - reason = readUTFBytes(frame.payload, 2, frame.payload.length - 2); - } - logger.log("received closing frame"); - close(code, reason, "server"); - break; - case OPCODE_PING: - sendPong(frame.payload); - break; - case OPCODE_PONG: - break; - default: - close(1002, "Received unknown opcode: " + frame.opcode); - break; - } - } - } - } - } - } - - private function validateHandshake(headerStr:String):Boolean { - var lines:Array = headerStr.split(/\r\n/); - if (!lines[0].match(/^HTTP\/1.1 101 /)) { - onConnectionError("bad response: " + lines[0]); - return false; - } - var header:Object = {}; - var lowerHeader:Object = {}; - for (var i:int = 1; i < lines.length; ++i) { - if (lines[i].length == 0) continue; - var m:Array = lines[i].match(/^(\S+):(.*)$/); - if (!m) { - onConnectionError("failed to parse response header line: " + lines[i]); - return false; - } - var key:String = m[1].toLowerCase(); - var value:String = StringUtil.trim(m[2]); - header[key] = value; - lowerHeader[key] = value.toLowerCase(); - } - if (lowerHeader["upgrade"] != "websocket") { - onConnectionError("invalid Upgrade: " + header["Upgrade"]); - return false; - } - if (lowerHeader["connection"] != "upgrade") { - onConnectionError("invalid Connection: " + header["Connection"]); - return false; - } - if (!lowerHeader["sec-websocket-accept"]) { - onConnectionError( - "The WebSocket server speaks old WebSocket protocol, " + - "which is not supported by web-socket-js. " + - "It requires WebSocket protocol HyBi 10. " + - "Try newer version of the server if available."); - return false; - } - var replyDigest:String = header["sec-websocket-accept"] - if (replyDigest != expectedDigest) { - onConnectionError("digest doesn't match: " + replyDigest + " != " + expectedDigest); - return false; - } - if (requestedProtocols.length > 0) { - acceptedProtocol = header["sec-websocket-protocol"]; - if (requestedProtocols.indexOf(acceptedProtocol) < 0) { - onConnectionError("protocol doesn't match: '" + - acceptedProtocol + "' not in '" + requestedProtocols.join(",") + "'"); - return false; - } - } - return true; - } - - private function sendPong(payload:ByteArray):Boolean { - var frame:WebSocketFrame = new WebSocketFrame(); - frame.opcode = OPCODE_PONG; - frame.payload = payload; - return sendFrame(frame); - } - - private function sendFrame(frame:WebSocketFrame):Boolean { - - var plength:uint = frame.payload.length; - - // Generates a mask. - var mask:ByteArray = new ByteArray(); - for (var i:int = 0; i < 4; i++) { - mask.writeByte(randomInt(0, 255)); - } - - var header:ByteArray = new ByteArray(); - // FIN + RSV + opcode - header.writeByte((frame.fin ? 0x80 : 0x00) | (frame.rsv << 4) | frame.opcode); - if (plength <= 125) { - header.writeByte(0x80 | plength); // Masked + length - } else if (plength > 125 && plength < 65536) { - header.writeByte(0x80 | 126); // Masked + 126 - header.writeShort(plength); - } else if (plength >= 65536 && plength < 4294967296) { - header.writeByte(0x80 | 127); // Masked + 127 - header.writeUnsignedInt(0); // zero high order bits - header.writeUnsignedInt(plength); - } else { - fatal("Send frame size too large"); - } - header.writeBytes(mask); - - var maskedPayload:ByteArray = new ByteArray(); - maskedPayload.length = frame.payload.length; - for (i = 0; i < frame.payload.length; i++) { - maskedPayload[i] = mask[i % 4] ^ frame.payload[i]; - } - - try { - socket.writeBytes(header); - socket.writeBytes(maskedPayload); - socket.flush(); - } catch (ex:Error) { - logger.error("Error while sending frame: " + ex.message); - setTimeout(function():void { - if (readyState != CLOSED) { - close(STATUS_CONNECTION_ERROR); - } - }, 0); - return false; - } - return true; - - } - - private function parseFrame():WebSocketFrame { - - var frame:WebSocketFrame = new WebSocketFrame(); - var hlength:uint = 0; - var plength:uint = 0; - - hlength = 2; - if (buffer.length < hlength) { - return null; - } - - frame.fin = (buffer[0] & 0x80) != 0; - frame.rsv = (buffer[0] & 0x70) >> 4; - frame.opcode = buffer[0] & 0x0f; - // Payload unmasking is not implemented because masking frames from server - // is not allowed. This field is used only for error checking. - frame.mask = (buffer[1] & 0x80) != 0; - plength = buffer[1] & 0x7f; - - if (plength == 126) { - - hlength = 4; - if (buffer.length < hlength) { - return null; - } - buffer.endian = Endian.BIG_ENDIAN; - buffer.position = 2; - plength = buffer.readUnsignedShort(); - - } else if (plength == 127) { - - hlength = 10; - if (buffer.length < hlength) { - return null; - } - buffer.endian = Endian.BIG_ENDIAN; - buffer.position = 2; - // Protocol allows 64-bit length, but we only handle 32-bit - var big:uint = buffer.readUnsignedInt(); // Skip high 32-bits - plength = buffer.readUnsignedInt(); // Low 32-bits - if (big != 0) { - fatal("Frame length exceeds 4294967295. Bailing out!"); - return null; - } - - } - - if (buffer.length < hlength + plength) { - return null; - } - - frame.length = hlength + plength; - frame.payload = new ByteArray(); - buffer.position = hlength; - buffer.readBytes(frame.payload, 0, plength); - return frame; - - } - - private function dispatchCloseEvent(wasClean:Boolean, code:int, reason:String):void { - var event:WebSocketEvent = new WebSocketEvent("close"); - event.wasClean = wasClean; - event.code = code; - event.reason = reason; - dispatchEvent(event); - } - - private function removeBufferBefore(pos:int):void { - if (pos == 0) return; - var nextBuffer:ByteArray = new ByteArray(); - buffer.position = pos; - buffer.readBytes(nextBuffer); - buffer = nextBuffer; - } - - private function generateKey():String { - var vals:ByteArray = new ByteArray(); - vals.length = 16; - for (var i:int = 0; i < vals.length; ++i) { - vals[i] = randomInt(0, 127); - } - base64Encoder.reset(); - base64Encoder.encodeBytes(vals); - return base64Encoder.toString(); - } - - private function readUTFBytes(buffer:ByteArray, start:int, numBytes:int):String { - buffer.position = start; - var data:String = ""; - for(var i:int = start; i < start + numBytes; ++i) { - // Workaround of a bug of ByteArray#readUTFBytes() that bytes after "\x00" is discarded. - if (buffer[i] == 0x00) { - data += buffer.readUTFBytes(i - buffer.position) + "\x00"; - buffer.position = i + 1; - } - } - data += buffer.readUTFBytes(start + numBytes - buffer.position); - return data; - } - - private function randomInt(min:uint, max:uint):uint { - return min + Math.floor(Math.random() * (Number(max) - min + 1)); - } - - private function fatal(message:String):void { - logger.error(message); - throw message; - } - -} - -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketEvent.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketEvent.as deleted file mode 100644 index 1188f58133..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketEvent.as +++ /dev/null @@ -1,41 +0,0 @@ -package net.gimite.websocket { - -import flash.events.Event; - -/** - * This class represents a generic websocket event. It contains the standard "type" - * parameter as well as a "message" parameter. - */ -public class WebSocketEvent extends Event { - - public static const OPEN:String = "open"; - public static const CLOSE:String = "close"; - public static const MESSAGE:String = "message"; - public static const ERROR:String = "error"; - - public var message:String; - public var wasClean:Boolean; - public var code:int; - public var reason:String; - - public function WebSocketEvent( - type:String, message:String = null, bubbles:Boolean = false, cancelable:Boolean = false) { - super(type, bubbles, cancelable); - this.message = message; - } - - public override function clone():Event { - var event:WebSocketEvent = new WebSocketEvent( - this.type, this.message, this.bubbles, this.cancelable); - event.wasClean = wasClean; - event.code = code; - event.reason = reason; - return event; - } - - public override function toString():String { - return "WebSocketEvent: " + this.type + ": " + this.message; - } -} - -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketFrame.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketFrame.as deleted file mode 100644 index 1ce1c545a6..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketFrame.as +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright: Hiroshi Ichikawa -// License: New BSD License - -package net.gimite.websocket { - -import flash.utils.ByteArray; - -public class WebSocketFrame { - - public var fin:Boolean = true; - public var rsv:int = 0; - public var opcode:int = -1; - public var payload:ByteArray; - - // Fields below are not used when used as a parameter of sendFrame(). - public var length:uint = 0; - public var mask:Boolean = false; - -} - -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMain.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMain.as deleted file mode 100644 index 3daa5721e5..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMain.as +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright: Hiroshi Ichikawa -// License: New BSD License - -package net.gimite.websocket { - -import flash.display.Sprite; -import flash.external.ExternalInterface; -import flash.system.Security; -import flash.utils.setTimeout; - -import mx.utils.URLUtil; - -/** - * Provides JavaScript API of WebSocket. - */ -public class WebSocketMain extends Sprite implements IWebSocketLogger{ - - private var callerUrl:String; - private var debug:Boolean = false; - private var manualPolicyFileLoaded:Boolean = false; - private var webSockets:Array = []; - private var eventQueue:Array = []; - - public function WebSocketMain() { - ExternalInterface.addCallback("setCallerUrl", setCallerUrl); - ExternalInterface.addCallback("setDebug", setDebug); - ExternalInterface.addCallback("create", create); - ExternalInterface.addCallback("send", send); - ExternalInterface.addCallback("close", close); - ExternalInterface.addCallback("loadManualPolicyFile", loadManualPolicyFile); - ExternalInterface.addCallback("receiveEvents", receiveEvents); - ExternalInterface.call("WebSocket.__onFlashInitialized"); - } - - public function setCallerUrl(url:String):void { - callerUrl = url; - } - - public function setDebug(val:Boolean):void { - debug = val; - if (val) { - log("debug enabled"); - } - } - - private function loadDefaultPolicyFile(wsUrl:String):void { - var policyUrl:String = "xmlsocket://" + URLUtil.getServerName(wsUrl) + ":843"; - log("policy file: " + policyUrl); - Security.loadPolicyFile(policyUrl); - } - - public function loadManualPolicyFile(policyUrl:String):void { - log("policy file: " + policyUrl); - Security.loadPolicyFile(policyUrl); - manualPolicyFileLoaded = true; - } - - public function log(message:String):void { - if (debug) { - ExternalInterface.call("WebSocket.__log", encodeURIComponent("[WebSocket] " + message)); - } - } - - public function error(message:String):void { - ExternalInterface.call("WebSocket.__error", encodeURIComponent("[WebSocket] " + message)); - } - - private function parseEvent(event:WebSocketEvent):Object { - var webSocket:WebSocket = event.target as WebSocket; - var eventObj:Object = {}; - eventObj.type = event.type; - eventObj.webSocketId = webSocket.getId(); - eventObj.readyState = webSocket.getReadyState(); - eventObj.protocol = webSocket.getAcceptedProtocol(); - if (event.message !== null) { - eventObj.message = event.message; - } - if (event.wasClean) { - eventObj.wasClean = event.wasClean; - } - if (event.code) { - eventObj.code = event.code; - } - if (event.reason !== null) { - eventObj.reason = event.reason; - } - return eventObj; - } - - public function create( - webSocketId:int, - url:String, protocols:Array, - proxyHost:String = null, proxyPort:int = 0, - headers:String = null):void { - if (!manualPolicyFileLoaded) { - loadDefaultPolicyFile(url); - } - var newSocket:WebSocket = new WebSocket( - webSocketId, url, protocols, getOrigin(), proxyHost, proxyPort, - getCookie(url), headers, this); - newSocket.addEventListener("open", onSocketEvent); - newSocket.addEventListener("close", onSocketEvent); - newSocket.addEventListener("error", onSocketEvent); - newSocket.addEventListener("message", onSocketEvent); - webSockets[webSocketId] = newSocket; - } - - public function send(webSocketId:int, encData:String):int { - var webSocket:WebSocket = webSockets[webSocketId]; - return webSocket.send(encData); - } - - public function close(webSocketId:int):void { - var webSocket:WebSocket = webSockets[webSocketId]; - webSocket.close(); - } - - public function receiveEvents():Object { - var result:Object = eventQueue; - eventQueue = []; - return result; - } - - private function getOrigin():String { - return (URLUtil.getProtocol(this.callerUrl) + "://" + - URLUtil.getServerNameWithPort(this.callerUrl)).toLowerCase(); - } - - private function getCookie(url:String):String { - if (URLUtil.getServerName(url).toLowerCase() == - URLUtil.getServerName(this.callerUrl).toLowerCase()) { - return ExternalInterface.call("function(){return document.cookie}"); - } else { - return ""; - } - } - - /** - * Socket event handler. - */ - public function onSocketEvent(event:WebSocketEvent):void { - var eventObj:Object = parseEvent(event); - eventQueue.push(eventObj); - processEvents(); - } - - /** - * Process our event queue. If javascript is unresponsive, set - * a timeout and try again. - */ - public function processEvents():void { - if (eventQueue.length == 0) return; - if (!ExternalInterface.call("WebSocket.__onFlashEvent")) { - setTimeout(processEvents, 500); - } - } - -} - -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMainInsecure.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMainInsecure.as deleted file mode 100644 index 7a368a0f0d..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/src/net/gimite/websocket/WebSocketMainInsecure.as +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright: Hiroshi Ichikawa -// License: New BSD License - -package net.gimite.websocket { - -import flash.system.Security; - -public class WebSocketMainInsecure extends WebSocketMain { - - public function WebSocketMainInsecure() { - Security.allowDomain("*"); - // Also allows HTTP -> HTTPS call. Since we have already allowed arbitrary domains, allowing - // HTTP -> HTTPS would not be more dangerous. - Security.allowInsecureDomain("*"); - super(); - } - -} - -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/adobe/net/proxies/RFC2817Socket.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/adobe/net/proxies/RFC2817Socket.as deleted file mode 100644 index c52ee39b60..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/adobe/net/proxies/RFC2817Socket.as +++ /dev/null @@ -1,204 +0,0 @@ -/* - Adobe Systems Incorporated(r) Source Code License Agreement - Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved. - - Please read this Source Code License Agreement carefully before using - the source code. - - Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive, - no-charge, royalty-free, irrevocable copyright license, to reproduce, - prepare derivative works of, publicly display, publicly perform, and - distribute this source code and such derivative works in source or - object code form without any attribution requirements. - - The name "Adobe Systems Incorporated" must not be used to endorse or promote products - derived from the source code without prior written permission. - - You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and - against any loss, damage, claims or lawsuits, including attorney's - fees that arise or result from your use or distribution of the source - code. - - THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT - ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF - NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA - OR ITS SUPPLIERS 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 SOURCE CODE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -package com.adobe.net.proxies -{ - import flash.events.Event; - import flash.events.IOErrorEvent; - import flash.events.ProgressEvent; - import flash.net.Socket; - - /** - * This class allows TCP socket connections through HTTP proxies in accordance with - * RFC 2817: - * - * ftp://ftp.rfc-editor.org/in-notes/rfc2817.txt - * - * It can also be used to make direct connections to a destination, as well. If you - * pass the host and port into the constructor, no proxy will be used. You can also - * call connect, passing in the host and the port, and if you didn't set the proxy - * info, a direct connection will be made. A proxy is only used after you have called - * the setProxyInfo function. - * - * The connection to and negotiation with the proxy is completely hidden. All the - * same events are thrown whether you are using a proxy or not, and the data you - * receive from the target server will look exact as it would if you were connected - * to it directly rather than through a proxy. - * - * @author Christian Cantrell - * - **/ - public class RFC2817Socket - extends Socket - { - private var proxyHost:String = null; - private var host:String = null; - private var proxyPort:int = 0; - private var port:int = 0; - private var deferredEventHandlers:Object = new Object(); - private var buffer:String = new String(); - - /** - * Construct a new RFC2817Socket object. If you pass in the host and the port, - * no proxy will be used. If you want to use a proxy, instantiate with no - * arguments, call setProxyInfo, then call connect. - **/ - public function RFC2817Socket(host:String = null, port:int = 0) - { - if (host != null && port != 0) - { - super(host, port); - } - } - - /** - * Set the proxy host and port number. Your connection will only proxied if - * this function has been called. - **/ - public function setProxyInfo(host:String, port:int):void - { - this.proxyHost = host; - this.proxyPort = port; - - var deferredSocketDataHandler:Object = this.deferredEventHandlers[ProgressEvent.SOCKET_DATA]; - var deferredConnectHandler:Object = this.deferredEventHandlers[Event.CONNECT]; - - if (deferredSocketDataHandler != null) - { - super.removeEventListener(ProgressEvent.SOCKET_DATA, deferredSocketDataHandler.listener, deferredSocketDataHandler.useCapture); - } - - if (deferredConnectHandler != null) - { - super.removeEventListener(Event.CONNECT, deferredConnectHandler.listener, deferredConnectHandler.useCapture); - } - } - - /** - * Connect to the specified host over the specified port. If you want your - * connection proxied, call the setProxyInfo function first. - **/ - public override function connect(host:String, port:int):void - { - if (this.proxyHost == null) - { - this.redirectConnectEvent(); - this.redirectSocketDataEvent(); - super.connect(host, port); - } - else - { - this.host = host; - this.port = port; - super.addEventListener(Event.CONNECT, this.onConnect); - super.addEventListener(ProgressEvent.SOCKET_DATA, this.onSocketData); - super.connect(this.proxyHost, this.proxyPort); - } - } - - private function onConnect(event:Event):void - { - this.writeUTFBytes("CONNECT "+this.host+":"+this.port+" HTTP/1.1\n\n"); - this.flush(); - this.redirectConnectEvent(); - } - - private function onSocketData(event:ProgressEvent):void - { - while (this.bytesAvailable != 0) - { - this.buffer += this.readUTFBytes(1); - if (this.buffer.search(/\r?\n\r?\n$/) != -1) - { - this.checkResponse(event); - break; - } - } - } - - private function checkResponse(event:ProgressEvent):void - { - var responseCode:String = this.buffer.substr(this.buffer.indexOf(" ")+1, 3); - - if (responseCode.search(/^2/) == -1) - { - var ioError:IOErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR); - ioError.text = "Error connecting to the proxy ["+this.proxyHost+"] on port ["+this.proxyPort+"]: " + this.buffer; - this.dispatchEvent(ioError); - } - else - { - this.redirectSocketDataEvent(); - this.dispatchEvent(new Event(Event.CONNECT)); - if (this.bytesAvailable > 0) - { - this.dispatchEvent(event); - } - } - this.buffer = null; - } - - private function redirectConnectEvent():void - { - super.removeEventListener(Event.CONNECT, onConnect); - var deferredEventHandler:Object = this.deferredEventHandlers[Event.CONNECT]; - if (deferredEventHandler != null) - { - super.addEventListener(Event.CONNECT, deferredEventHandler.listener, deferredEventHandler.useCapture, deferredEventHandler.priority, deferredEventHandler.useWeakReference); - } - } - - private function redirectSocketDataEvent():void - { - super.removeEventListener(ProgressEvent.SOCKET_DATA, onSocketData); - var deferredEventHandler:Object = this.deferredEventHandlers[ProgressEvent.SOCKET_DATA]; - if (deferredEventHandler != null) - { - super.addEventListener(ProgressEvent.SOCKET_DATA, deferredEventHandler.listener, deferredEventHandler.useCapture, deferredEventHandler.priority, deferredEventHandler.useWeakReference); - } - } - - public override function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int=0.0, useWeakReference:Boolean=false):void - { - if (type == Event.CONNECT || type == ProgressEvent.SOCKET_DATA) - { - this.deferredEventHandlers[type] = {listener:listener,useCapture:useCapture, priority:priority, useWeakReference:useWeakReference}; - } - else - { - super.addEventListener(type, listener, useCapture, priority, useWeakReference); - } - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/MD5.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/MD5.as deleted file mode 100644 index e5d9c4a4b0..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/MD5.as +++ /dev/null @@ -1,375 +0,0 @@ -package com.gsolo.encryption { - public class MD5 { - /* - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.2-alpha Copyright (C) Paul Johnston 1999 - 2005 - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - * - * Converted to AS3 By Geoffrey Williams - */ - - /* - * Configurable variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - */ - - public static const HEX_FORMAT_LOWERCASE:uint = 0; - public static const HEX_FORMAT_UPPERCASE:uint = 1; - - public static const BASE64_PAD_CHARACTER_DEFAULT_COMPLIANCE:String = ""; - public static const BASE64_PAD_CHARACTER_RFC_COMPLIANCE:String = "="; - - public static var hexcase:uint = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ - public static var b64pad:String = ""; /* base-64 pad character. "=" for strict RFC compliance */ - - public static function encrypt (string:String):String { - return hex_md5 (string); - } - - /* - * These are the functions you'll usually want to call - * They take string arguments and return either hex or base-64 encoded strings - */ - public static function hex_md5 (string:String):String { - return rstr2hex (rstr_md5 (str2rstr_utf8 (string))); - } - - public static function b64_md5 (string:String):String { - return rstr2b64 (rstr_md5 (str2rstr_utf8 (string))); - } - - public static function any_md5 (string:String, encoding:String):String { - return rstr2any (rstr_md5 (str2rstr_utf8 (string)), encoding); - } - public static function hex_hmac_md5 (key:String, data:String):String { - return rstr2hex (rstr_hmac_md5 (str2rstr_utf8 (key), str2rstr_utf8 (data))); - } - public static function b64_hmac_md5 (key:String, data:String):String { - return rstr2b64 (rstr_hmac_md5 (str2rstr_utf8 (key), str2rstr_utf8 (data))); - } - public static function any_hmac_md5 (key:String, data:String, encoding:String):String { - return rstr2any(rstr_hmac_md5(str2rstr_utf8(key), str2rstr_utf8(data)), encoding); - } - - /* - * Perform a simple self-test to see if the VM is working - */ - public static function md5_vm_test ():Boolean { - return hex_md5 ("abc") == "900150983cd24fb0d6963f7d28e17f72"; - } - - /* - * Calculate the MD5 of a raw string - */ - public static function rstr_md5 (string:String):String { - return binl2rstr (binl_md5 (rstr2binl (string), string.length * 8)); - } - - /* - * Calculate the HMAC-MD5, of a key and some data (raw strings) - */ - public static function rstr_hmac_md5 (key:String, data:String):String { - var bkey:Array = rstr2binl (key); - if (bkey.length > 16) bkey = binl_md5 (bkey, key.length * 8); - - var ipad:Array = new Array(16), opad:Array = new Array(16); - for(var i:Number = 0; i < 16; i++) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - - var hash:Array = binl_md5 (ipad.concat (rstr2binl (data)), 512 + data.length * 8); - return binl2rstr (binl_md5 (opad.concat (hash), 512 + 128)); - } - - /* - * Convert a raw string to a hex string - */ - public static function rstr2hex (input:String):String { - var hex_tab:String = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; - var output:String = ""; - var x:Number; - for(var i:Number = 0; i < input.length; i++) { - x = input.charCodeAt(i); - output += hex_tab.charAt((x >>> 4) & 0x0F) - + hex_tab.charAt( x & 0x0F); - } - return output; - } - - /* - * Convert a raw string to a base-64 string - */ - public static function rstr2b64 (input:String):String { - var tab:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var output:String = ""; - var len:Number = input.length; - for(var i:Number = 0; i < len; i += 3) { - var triplet:Number = (input.charCodeAt(i) << 16) - | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0) - | (i + 2 < len ? input.charCodeAt(i+2) : 0); - for(var j:Number = 0; j < 4; j++) { - if(i * 8 + j * 6 > input.length * 8) output += b64pad; - else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); - } - } - return output; - } - - /* - * Convert a raw string to an arbitrary string encoding - */ - public static function rstr2any(input:String, encoding:String):String { - var divisor:Number = encoding.length; - var remainders:Array = []; - var i:Number, q:Number, x:Number, quotient:Array; - - /* Convert to an array of 16-bit big-endian values, forming the dividend */ - var dividend:Array = new Array(input.length / 2); - for(i = 0; i < dividend.length; i++) { - dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); - } - - /* - * Repeatedly perform a long division. The binary array forms the dividend, - * the length of the encoding is the divisor. Once computed, the quotient - * forms the dividend for the next step. We stop when the dividend is zero. - * All remainders are stored for later use. - */ - while(dividend.length > 0) { - quotient = []; - x = 0; - for(i = 0; i < dividend.length; i++) { - x = (x << 16) + dividend[i]; - q = Math.floor(x / divisor); - x -= q * divisor; - if(quotient.length > 0 || q > 0) - quotient[quotient.length] = q; - } - remainders[remainders.length] = x; - dividend = quotient; - } - - /* Convert the remainders to the output string */ - var output:String = ""; - for(i = remainders.length - 1; i >= 0; i--) - output += encoding.charAt (remainders[i]); - - return output; - } - - /* - * Encode a string as utf-8. - * For efficiency, this assumes the input is valid utf-16. - */ - public static function str2rstr_utf8 (input:String):String { - var output:String = ""; - var i:Number = -1; - var x:Number, y:Number; - - while(++i < input.length) { - /* Decode utf-16 surrogate pairs */ - x = input.charCodeAt(i); - y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; - if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) { - x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); - i++; - } - - /* Encode output as utf-8 */ - if(x <= 0x7F) - output += String.fromCharCode(x); - else if(x <= 0x7FF) - output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F), - 0x80 | ( x & 0x3F)); - else if(x <= 0xFFFF) - output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - else if(x <= 0x1FFFFF) - output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), - 0x80 | ((x >>> 12) & 0x3F), - 0x80 | ((x >>> 6 ) & 0x3F), - 0x80 | ( x & 0x3F)); - } - return output; - } - - /* - * Encode a string as utf-16 - */ - public static function str2rstr_utf16le (input:String):String { - var output:String = ""; - for(var i:Number = 0; i < input.length; i++) - output += String.fromCharCode( input.charCodeAt(i) & 0xFF, - (input.charCodeAt(i) >>> 8) & 0xFF); - return output; - } - - public static function str2rstr_utf16be (input:String):String { - var output:String = ""; - for(var i:Number = 0; i < input.length; i++) - output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, - input.charCodeAt(i) & 0xFF); - return output; - } - - /* - * Convert a raw string to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ - public static function rstr2binl (input:String):Array { - var output:Array = new Array(input.length >> 2); - for(var i:Number = 0; i < output.length; i++) - output[i] = 0; - for(i = 0; i < input.length * 8; i += 8) - output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32); - return output; - } - - /* - * Convert an array of little-endian words to a string - */ - public static function binl2rstr (input:Array):String { - var output:String = ""; - for(var i:Number = 0; i < input.length * 32; i += 8) - output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF); - return output; - } - - /* - * Calculate the MD5 of an array of little-endian words, and a bit length. - */ - public static function binl_md5 (x:Array, len:Number):Array { - /* append padding */ - x[len >> 5] |= 0x80 << ((len) % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; - - var a:Number = 1732584193; - var b:Number = -271733879; - var c:Number = -1732584194; - var d:Number = 271733878; - - for(var i:Number = 0; i < x.length; i += 16) { - var olda:Number = a; - var oldb:Number = b; - var oldc:Number = c; - var oldd:Number = d; - - a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); - d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); - c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); - b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); - a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); - d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); - c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); - b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); - a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); - d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); - c = md5_ff(c, d, a, b, x[i+10], 17, -42063); - b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); - a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); - d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); - c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); - b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); - - a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); - d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); - c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); - b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); - a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); - d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); - c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); - b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); - a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); - d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); - c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); - b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); - a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); - d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); - c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); - b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); - - a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); - d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); - c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); - b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); - a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); - d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); - c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); - b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); - a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); - d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); - c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); - b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); - a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); - d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); - c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); - b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); - - a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); - d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); - c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); - b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); - a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); - d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); - c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); - b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); - a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); - d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); - c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); - b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); - a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); - d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); - c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); - b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - } - return [a, b, c, d]; - } - - /* - * These functions implement the four basic operations the algorithm uses. - */ - public static function md5_cmn (q:Number, a:Number, b:Number, x:Number, s:Number, t:Number):Number { - return safe_add (bit_rol (safe_add (safe_add (a, q), safe_add(x, t)), s), b); - } - public static function md5_ff (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number { - return md5_cmn ((b & c) | ((~b) & d), a, b, x, s, t); - } - public static function md5_gg (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number { - return md5_cmn ((b & d) | (c & (~d)), a, b, x, s, t); - } - public static function md5_hh (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number { - return md5_cmn (b ^ c ^ d, a, b, x, s, t); - } - public static function md5_ii (a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number { - return md5_cmn (c ^ (b | (~d)), a, b, x, s, t); - } - - /* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - public static function safe_add (x:Number, y:Number):Number { - var lsw:Number = (x & 0xFFFF) + (y & 0xFFFF); - var msw:Number = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); - } - - /* - * Bitwise rotate a 32-bit number to the left. - */ - public static function bit_rol (num:Number, cnt:Number):Number { - return (num << cnt) | (num >>> (32 - cnt)); - } - - } -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/SHA1.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/SHA1.as deleted file mode 100644 index 12f64c5f35..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/gsolo/encryption/SHA1.as +++ /dev/null @@ -1,218 +0,0 @@ -package com.gsolo.encryption { - public class SHA1 { - /* - * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined - * in FIPS PUB 180-1 - * Version 2.1a Copyright Paul Johnston 2000 - 2002. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for details. - * - * Converted to AS3 By Geoffrey Williams - */ - - /* - * Configurable variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - */ - - public static const HEX_FORMAT_LOWERCASE:uint = 0; - public static const HEX_FORMAT_UPPERCASE:uint = 1; - - public static const BASE64_PAD_CHARACTER_DEFAULT_COMPLIANCE:String = ""; - public static const BASE64_PAD_CHARACTER_RFC_COMPLIANCE:String = "="; - - public static const BITS_PER_CHAR_ASCII:uint = 8; - public static const BITS_PER_CHAR_UNICODE:uint = 8; - - public static var hexcase:uint = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ - public static var b64pad:String = ""; /* base-64 pad character. "=" for strict RFC compliance */ - public static var chrsz:uint = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ - - public static function encrypt (string:String):String { - return hex_sha1 (string); - } - - /* - * These are the functions you'll usually want to call - * They take string arguments and return either hex or base-64 encoded strings - */ - public static function hex_sha1 (string:String):String { - return binb2hex (core_sha1( str2binb(string), string.length * chrsz)); - } - - public static function b64_sha1 (string:String):String { - return binb2b64 (core_sha1 (str2binb (string), string.length * chrsz)); - } - - public static function str_sha1 (string:String):String { - return binb2str (core_sha1 (str2binb (string), string.length * chrsz)); - } - - public static function hex_hmac_sha1 (key:String, data:String):String { - return binb2hex (core_hmac_sha1 (key, data)); - } - - public static function b64_hmac_sha1 (key:String, data:String):String { - return binb2b64 (core_hmac_sha1 (key, data)); - } - - public static function str_hmac_sha1 (key:String, data:String):String { - return binb2str (core_hmac_sha1 (key, data)); - } - - /* - * Perform a simple self-test to see if the VM is working - */ - public static function sha1_vm_test ():Boolean { - return hex_sha1 ("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d"; - } - - /* - * Calculate the SHA-1 of an array of big-endian words, and a bit length - */ - public static function core_sha1 (x:Array, len:Number):Array { - /* append padding */ - x[len >> 5] |= 0x80 << (24 - len % 32); - x[((len + 64 >> 9) << 4) + 15] = len; - - var w:Array = new Array(80); - var a:Number = 1732584193; - var b:Number = -271733879; - var c:Number = -1732584194; - var d:Number = 271733878; - var e:Number = -1009589776; - - for(var i:Number = 0; i < x.length; i += 16) { - var olda:Number = a; - var oldb:Number = b; - var oldc:Number = c; - var oldd:Number = d; - var olde:Number = e; - - for(var j:Number = 0; j < 80; j++) { - if(j < 16) w[j] = x[i + j]; - else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); - var t:Number = safe_add (safe_add (rol (a, 5), sha1_ft (j, b, c, d)), safe_add (safe_add (e, w[j]), sha1_kt (j))); - e = d; - d = c; - c = rol(b, 30); - b = a; - a = t; - } - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - e = safe_add(e, olde); - } - - return [a, b, c, d, e]; - } - - /* - * Perform the appropriate triplet combination function for the current - * iteration - */ - public static function sha1_ft (t:Number, b:Number, c:Number, d:Number):Number { - if(t < 20) return (b & c) | ((~b) & d); - if(t < 40) return b ^ c ^ d; - if(t < 60) return (b & c) | (b & d) | (c & d); - return b ^ c ^ d; - } - - /* - * Determine the appropriate additive constant for the current iteration - */ - public static function sha1_kt (t:Number):Number { - return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514; - } - - /* - * Calculate the HMAC-SHA1 of a key and some data - */ - public static function core_hmac_sha1 (key:String, data:String):Array { - var bkey:Array = str2binb (key); - if (bkey.length > 16) bkey = core_sha1 (bkey, key.length * chrsz); - - var ipad:Array = new Array(16), opad:Array = new Array(16); - for(var i:Number = 0; i < 16; i++) { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - - var hash:Array = core_sha1 (ipad.concat (str2binb(data)), 512 + data.length * chrsz); - return core_sha1 (opad.concat (hash), 512 + 160); - } - - /* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - public static function safe_add (x:Number, y:Number):Number { - var lsw:Number = (x & 0xFFFF) + (y & 0xFFFF); - var msw:Number = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); - } - - /* - * Bitwise rotate a 32-bit number to the left. - */ - public static function rol (num:Number, cnt:Number):Number { - return (num << cnt) | (num >>> (32 - cnt)); - } - - /* - * Convert an 8-bit or 16-bit string to an array of big-endian words - * In 8-bit function, characters >255 have their hi-byte silently ignored. - */ - public static function str2binb (str:String):Array { - var bin:Array = new Array (); - var mask:Number = (1 << chrsz) - 1; - for (var i:Number = 0; i < str.length * chrsz; i += chrsz) bin[i>>5] |= (str.charCodeAt (i / chrsz) & mask) << (32 - chrsz - i%32); - return bin; - } - - /* - * Convert an array of big-endian words to a string - */ - public static function binb2str (bin:Array):String { - var str:String = ""; - var mask:Number = (1 << chrsz) - 1; - for (var i:Number = 0; i < bin.length * 32; i += chrsz) str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask); - return str; - } - - /* - * Convert an array of big-endian words to a hex string. - */ - public static function binb2hex (binarray:Array):String { - var hex_tab:String = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; - var str:String = ""; - for(var i:Number = 0; i < binarray.length * 4; i++) { - str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + - hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); - } - return str; - } - - /* - * Convert an array of big-endian words to a base-64 string - */ - public static function binb2b64 (binarray:Array):String { - var tab:String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var str:String = ""; - for(var i:Number = 0; i < binarray.length * 4; i += 3) { - var triplet:Number = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16) - | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 ) - | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF); - for(var j:Number = 0; j < 4; j++) { - if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; - else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); - } - } - return str; - } - } -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/Crypto.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/Crypto.as deleted file mode 100644 index 32ec97a2d4..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/Crypto.as +++ /dev/null @@ -1,287 +0,0 @@ -/** - * Crypto - * - * An abstraction layer to instanciate our crypto algorithms - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto -{ - import com.hurlant.crypto.hash.HMAC; - import com.hurlant.crypto.hash.MAC; - import com.hurlant.crypto.hash.IHash; - import com.hurlant.crypto.hash.MD2; - import com.hurlant.crypto.hash.MD5; - import com.hurlant.crypto.hash.SHA1; - import com.hurlant.crypto.hash.SHA224; - import com.hurlant.crypto.hash.SHA256; - import com.hurlant.crypto.prng.ARC4; - import com.hurlant.crypto.rsa.RSAKey; - import com.hurlant.crypto.symmetric.AESKey; - import com.hurlant.crypto.symmetric.BlowFishKey; - import com.hurlant.crypto.symmetric.CBCMode; - import com.hurlant.crypto.symmetric.CFB8Mode; - import com.hurlant.crypto.symmetric.CFBMode; - import com.hurlant.crypto.symmetric.CTRMode; - import com.hurlant.crypto.symmetric.DESKey; - import com.hurlant.crypto.symmetric.ECBMode; - import com.hurlant.crypto.symmetric.ICipher; - import com.hurlant.crypto.symmetric.IMode; - import com.hurlant.crypto.symmetric.IPad; - import com.hurlant.crypto.symmetric.ISymmetricKey; - import com.hurlant.crypto.symmetric.IVMode; - import com.hurlant.crypto.symmetric.NullPad; - import com.hurlant.crypto.symmetric.OFBMode; - import com.hurlant.crypto.symmetric.PKCS5; - import com.hurlant.crypto.symmetric.SimpleIVMode; - import com.hurlant.crypto.symmetric.TripleDESKey; - import com.hurlant.crypto.symmetric.XTeaKey; - import com.hurlant.util.Base64; - - import flash.utils.ByteArray; - - /** - * A class to make it easy to use the rest of the framework. - * As a side-effect, using this class will cause most of the framework - * to be linked into your application, which is not always what you want. - * - * If you want to optimize your download size, don't use this class. - * (But feel free to read it to get ideas on how to get the algorithm you want.) - */ - public class Crypto - { - private var b64:Base64; // we don't use it, but we want the swc to include it, so cheap trick. - - public function Crypto(){ - } - - /** - * Things that should work, among others: - * "aes" - * "aes-128-ecb" - * "aes-128-cbc" - * "aes-128-cfb" - * "aes-128-cfb8" - * "aes-128-ofb" - * "aes-192-cfb" - * "aes-256-ofb" - * "blowfish-cbc" - * "des-ecb" - * "xtea" - * "xtea-ecb" - * "xtea-cbc" - * "xtea-cfb" - * "xtea-cfb8" - * "xtea-ofb" - * "rc4" - * "simple-aes-cbc" - */ - public static function getCipher(name:String, key:ByteArray, pad:IPad=null):ICipher { - // split name into an array. - var keys:Array = name.split("-"); - switch (keys[0]) { - /** - * "simple" is a special case. It means: - * "If using an IV mode, prepend the IV to the ciphertext" - */ - case "simple": - keys.shift(); - name = keys.join("-"); - var cipher:ICipher = getCipher(name, key, pad); - if (cipher is IVMode) { - return new SimpleIVMode(cipher as IVMode); - } else { - return cipher; - } - /** - * we support both "aes-128" and "aes128" - * Technically, you could use "aes192-128", but you'd - * only be hurting yourself. - */ - case "aes": - case "aes128": - case "aes192": - case "aes256": - keys.shift(); - if (key.length*8==keys[0]) { - // support for "aes-128-..." and such. - keys.shift(); - } - return getMode(keys[0], new AESKey(key), pad); - break; - case "bf": - case "blowfish": - keys.shift(); - return getMode(keys[0], new BlowFishKey(key), pad); - /** - * des-ede and des-ede3 are both equivalent to des3. - * the choice between 2tdes and 3tdes is made based - * on the length of the key provided. - */ - case "des": - keys.shift(); - if (keys[0]!="ede" && keys[0]!="ede3") { - return getMode(keys[0], new DESKey(key), pad); - } - if (keys.length==1) { - keys.push("ecb"); // default mode for 2tdes and 3tdes with openssl enc - } - // fall-through to triple des - case "3des": - case "des3": - keys.shift(); - return getMode(keys[0], new TripleDESKey(key), pad); - case "xtea": - keys.shift(); - return getMode(keys[0], new XTeaKey(key), pad); - break; - /** - * Technically, you could say "rc4-128" or whatever, - * but really, the length of the key is what counts here. - */ - case "rc4": - keys.shift(); - return new ARC4(key); - break; - } - return null; - } - - /** - * Returns the size of a key for a given cipher identifier. - */ - public static function getKeySize(name:String):uint { - var keys:Array = name.split("-"); - switch (keys[0]) { - case "simple": - keys.shift(); - return getKeySize(keys.join("-")); - case "aes128": - return 16; - case "aes192": - return 24; - case "aes256": - return 32; - case "aes": - keys.shift(); - return parseInt(keys[0])/8; - case "bf": - case "blowfish": - return 16; - case "des": - keys.shift(); - switch (keys[0]) { - case "ede": - return 16; - case "ede3": - return 24; - default: - return 8; - } - case "3des": - case "des3": - return 24; - case "xtea": - return 8; - case "rc4": - if (parseInt(keys[1])>0) { - return parseInt(keys[1])/8; - } - return 16; // why not. - } - return 0; // unknown; - } - - private static function getMode(name:String, alg:ISymmetricKey, padding:IPad=null):IMode { - switch (name) { - case "ecb": - return new ECBMode(alg, padding); - case "cfb": - return new CFBMode(alg, padding); - case "cfb8": - return new CFB8Mode(alg, padding); - case "ofb": - return new OFBMode(alg, padding); - case "ctr": - return new CTRMode(alg, padding); - case "cbc": - default: - return new CBCMode(alg, padding); - } - } - - /** - * Things that should work: - * "md5" - * "sha" - * "sha1" - * "sha224" - * "sha256" - */ - public static function getHash(name:String):IHash { - switch(name) { - case "md2": - return new MD2; - case "md5": - return new MD5; - case "sha": // let's hope you didn't mean sha-0 - case "sha1": - return new SHA1; - case "sha224": - return new SHA224; - case "sha256": - return new SHA256; - } - return null; - } - - /** - * Things that should work: - * "sha1" - * "md5-64" - * "hmac-md5-96" - * "hmac-sha1-128" - * "hmac-sha256-192" - * etc. - */ - public static function getHMAC(name:String):HMAC { - var keys:Array = name.split("-"); - if (keys[0]=="hmac") keys.shift(); - var bits:uint = 0; - if (keys.length>1) { - bits = parseInt(keys[1]); - } - return new HMAC(getHash(keys[0]), bits); - } - - - public static function getMAC(name:String):MAC { - - var keys:Array = name.split("-"); - if (keys[0]=="mac") keys.shift(); - var bits:uint = 0; - if (keys.length > 1) { - bits = parseInt(keys[1]); - } - return new MAC(getHash(keys[0]), bits); - } - - - public static function getPad(name:String):IPad { - switch(name) { - case "null": - return new NullPad; - case "pkcs5": - default: - return new PKCS5; - } - } - - /** mostly useless. - */ - public static function getRSA(E:String, M:String):RSAKey { - return RSAKey.parsePublicKey(M,E); - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/MozillaRootCertificates.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/MozillaRootCertificates.as deleted file mode 100755 index cc2e2697a9..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/MozillaRootCertificates.as +++ /dev/null @@ -1,3235 +0,0 @@ -/* THIS IS A GENERATED FILE */ -/** - * MozillaRootCertificates - * - * A list of built-in Certificate Authorities, - * pilfered from Mozilla. - * - * See certs/tool/grabRootCAs.pl for details. - * - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.cert { - public class MozillaRootCertificates extends X509CertificateCollection { - public function MozillaRootCertificates() { - super.addPEMCertificate("Verisign/RSA Secure Server CA", - // X500 Subject, for lookups. - "MF8xCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdSU0EgRGF0YSBTZWN1cml0eSwgSW5jLjEuMCwGA1UE"+ - "CxMlU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG\n"+ - "A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD\n"+ - "VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0\n"+ - "MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV\n"+ - "BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy\n"+ - "dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ\n"+ - "ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII\n"+ - "0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI\n"+ - "uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI\n"+ - "hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3\n"+ - "YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc\n"+ - "1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GTE CyberTrust Root CA", - // X500 Subject, for lookups. - "MEUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBD"+ - "eWJlclRydXN0IFJvb3Q=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD\n"+ - "VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv\n"+ - "b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV\n"+ - "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU\n"+ - "cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv\n"+ - "RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M\n"+ - "ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5\n"+ - "1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz\n"+ - "dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl\n"+ - "IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy\n"+ - "bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GTE CyberTrust Global Root", - // X500 Subject, for lookups. - "MHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBD"+ - "eWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFs"+ - "IFJvb3Q=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD\n"+ - "VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\n"+ - "bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\n"+ - "b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV\n"+ - "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\n"+ - "cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\n"+ - "b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH\n"+ - "iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS\n"+ - "r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4\n"+ - "04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r\n"+ - "GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9\n"+ - "3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P\n"+ - "lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Thawte Personal Basic CA", - // X500 Subject, for lookups. - "MIHLMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRv"+ - "d24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNl"+ - "cnZpY2VzIERpdmlzaW9uMSEwHwYDVQQDExhUaGF3dGUgUGVyc29uYWwgQmFzaWMgQ0ExKDAmBgkq"+ - "hkiG9w0BCQEWGXBlcnNvbmFsLWJhc2ljQHRoYXd0ZS5jb20=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx\n"+ - "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD\n"+ - "VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT\n"+ - "ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj\n"+ - "IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X\n"+ - "DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw\n"+ - "EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE\n"+ - "ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy\n"+ - "dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD\n"+ - "QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN\n"+ - "BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53\n"+ - "dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK\n"+ - "wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7\n"+ - "G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF\n"+ - "AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7\n"+ - "c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P\n"+ - "9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Thawte Personal Premium CA", - // X500 Subject, for lookups. - "MIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRv"+ - "d24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNl"+ - "cnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgG"+ - "CSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29t", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx\n"+ - "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD\n"+ - "VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT\n"+ - "ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p\n"+ - "dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv\n"+ - "bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa\n"+ - "QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY\n"+ - "BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u\n"+ - "IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl\n"+ - "bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu\n"+ - "Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs\n"+ - "Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI\n"+ - "Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD\n"+ - "ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG\n"+ - "SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH\n"+ - "b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh\n"+ - "KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Thawte Personal Freemail CA", - // X500 Subject, for lookups. - "MIHRMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRv"+ - "d24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNl"+ - "cnZpY2VzIERpdmlzaW9uMSQwIgYDVQQDExtUaGF3dGUgUGVyc29uYWwgRnJlZW1haWwgQ0ExKzAp"+ - "BgkqhkiG9w0BCQEWHHBlcnNvbmFsLWZyZWVtYWlsQHRoYXd0ZS5jb20=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx\n"+ - "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD\n"+ - "VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT\n"+ - "ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt\n"+ - "YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu\n"+ - "Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT\n"+ - "AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa\n"+ - "MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp\n"+ - "b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG\n"+ - "cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh\n"+ - "d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY\n"+ - "DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E\n"+ - "rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq\n"+ - "uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN\n"+ - "BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP\n"+ - "MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa\n"+ - "/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei\n"+ - "gQ==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Thawte Server CA", - // X500 Subject, for lookups. - "MIHEMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRv"+ - "d24xHTAbBgNVBAoTFFRoYXd0ZSBDb25zdWx0aW5nIGNjMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u"+ - "IFNlcnZpY2VzIERpdmlzaW9uMRkwFwYDVQQDExBUaGF3dGUgU2VydmVyIENBMSYwJAYJKoZIhvcN"+ - "AQkBFhdzZXJ2ZXItY2VydHNAdGhhd3RlLmNvbQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx\n"+ - "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\n"+ - "VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\n"+ - "biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm\n"+ - "MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx\n"+ - "MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT\n"+ - "DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3\n"+ - "dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl\n"+ - "cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3\n"+ - "DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD\n"+ - "gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91\n"+ - "yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX\n"+ - "L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj\n"+ - "EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG\n"+ - "7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e\n"+ - "QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ\n"+ - "qdq5snUb9kLy78fyGPmJvKP/iiMucEc=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Thawte Premium Server CA", - // X500 Subject, for lookups. - "MIHOMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRv"+ - "d24xHTAbBgNVBAoTFFRoYXd0ZSBDb25zdWx0aW5nIGNjMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u"+ - "IFNlcnZpY2VzIERpdmlzaW9uMSEwHwYDVQQDExhUaGF3dGUgUHJlbWl1bSBTZXJ2ZXIgQ0ExKDAm"+ - "BgkqhkiG9w0BCQEWGXByZW1pdW0tc2VydmVyQHRoYXd0ZS5jb20=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx\n"+ - "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\n"+ - "VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\n"+ - "biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy\n"+ - "dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t\n"+ - "MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB\n"+ - "MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG\n"+ - "A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp\n"+ - "b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl\n"+ - "cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv\n"+ - "bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE\n"+ - "VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ\n"+ - "ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR\n"+ - "uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG\n"+ - "9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI\n"+ - "hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM\n"+ - "pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Equifax Secure CA", - // X500 Subject, for lookups. - "ME4xCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3Vy"+ - "ZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHk=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\n"+ - "UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy\n"+ - "dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1\n"+ - "MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx\n"+ - "dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B\n"+ - "AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f\n"+ - "BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A\n"+ - "cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC\n"+ - "AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ\n"+ - "MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm\n"+ - "aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw\n"+ - "ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj\n"+ - "IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF\n"+ - "MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\n"+ - "A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y\n"+ - "7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh\n"+ - "1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("ABAecom (sub., Am. Bankers Assn.) Root CA", - // X500 Subject, for lookups. - "MIGJMQswCQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNV"+ - "BAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcN"+ - "AQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw\n"+ - "gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv\n"+ - "bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv\n"+ - "b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05\n"+ - "OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG\n"+ - "A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N\n"+ - "LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB\n"+ - "FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\n"+ - "ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM\n"+ - "0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG\n"+ - "PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU\n"+ - "LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs\n"+ - "iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU\n"+ - "+/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB\n"+ - "Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k\n"+ - "qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir\n"+ - "vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ\n"+ - "w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8\n"+ - "eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/\n"+ - "O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Digital Signature Trust Co. Global CA 1", - // X500 Subject, for lookups. - "MEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xETAP"+ - "BgNVBAsTCERTVENBIEUx", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV\n"+ - "UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL\n"+ - "EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ\n"+ - "BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x\n"+ - "ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg\n"+ - "bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ\n"+ - "j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV\n"+ - "Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG\n"+ - "SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx\n"+ - "JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI\n"+ - "RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw\n"+ - "MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5\n"+ - "fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i\n"+ - "+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG\n"+ - "SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN\n"+ - "QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+\n"+ - "gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Digital Signature Trust Co. Global CA 3", - // X500 Subject, for lookups. - "MEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xETAP"+ - "BgNVBAsTCERTVENBIEUy", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV\n"+ - "UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL\n"+ - "EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ\n"+ - "BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x\n"+ - "ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/\n"+ - "k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso\n"+ - "LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o\n"+ - "TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG\n"+ - "SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx\n"+ - "JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI\n"+ - "RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3\n"+ - "MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C\n"+ - "TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5\n"+ - "WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG\n"+ - "SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR\n"+ - "xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL\n"+ - "B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Digital Signature Trust Co. Global CA 2", - // X500 Subject, for lookups. - "MIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx"+ - "JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx"+ - "FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNv"+ - "bQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw\n"+ - "CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp\n"+ - "dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE\n"+ - "CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B\n"+ - "CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx\n"+ - "ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO\n"+ - "U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0\n"+ - "IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx\n"+ - "ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN\n"+ - "AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf\n"+ - "WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK\n"+ - "xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE\n"+ - "zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F\n"+ - "5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv\n"+ - "OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG\n"+ - "9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz\n"+ - "ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME\n"+ - "lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG\n"+ - "Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q\n"+ - "gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k\n"+ - "Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Digital Signature Trust Co. Global CA 4", - // X500 Subject, for lookups. - "MIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx"+ - "JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx"+ - "FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNv"+ - "bQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw\n"+ - "CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp\n"+ - "dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE\n"+ - "CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B\n"+ - "CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy\n"+ - "MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO\n"+ - "U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0\n"+ - "IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx\n"+ - "ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN\n"+ - "AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV\n"+ - "p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw\n"+ - "BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl\n"+ - "5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi\n"+ - "3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+\n"+ - "QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG\n"+ - "9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ\n"+ - "2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN\n"+ - "I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL\n"+ - "553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q\n"+ - "10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN\n"+ - "uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 1 Public Primary Certification Authority", - // X500 Subject, for lookups. - "MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg"+ - "MSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ\n"+ - "BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh\n"+ - "c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05\n"+ - "NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD\n"+ - "VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp\n"+ - "bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB\n"+ - "jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N\n"+ - "H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR\n"+ - "4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN\n"+ - "BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo\n"+ - "EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5\n"+ - "FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx\n"+ - "lA==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 2 Public Primary Certification Authority", - // X500 Subject, for lookups. - "MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg"+ - "MiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG\n"+ - "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz\n"+ - "cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2\n"+ - "MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV\n"+ - "BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt\n"+ - "YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN\n"+ - "ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh\n"+ - "YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7\n"+ - "FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G\n"+ - "CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg\n"+ - "J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc\n"+ - "r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 3 Public Primary Certification Authority", - // X500 Subject, for lookups. - "MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg"+ - "MyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG\n"+ - "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz\n"+ - "cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2\n"+ - "MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV\n"+ - "BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt\n"+ - "YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN\n"+ - "ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE\n"+ - "BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is\n"+ - "I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G\n"+ - "CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do\n"+ - "lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc\n"+ - "AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 1 Public Primary Certification Authority - G2", - // X500 Subject, for lookups. - "MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNz"+ - "IDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx"+ - "KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UE"+ - "CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yaw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ\n"+ - "BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh\n"+ - "c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy\n"+ - "MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp\n"+ - "emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X\n"+ - "DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw\n"+ - "FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg\n"+ - "UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo\n"+ - "YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5\n"+ - "MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB\n"+ - "AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK\n"+ - "VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm\n"+ - "Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID\n"+ - "AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J\n"+ - "h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul\n"+ - "uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68\n"+ - "DzFc6PLZ\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 2 Public Primary Certification Authority - G2", - // X500 Subject, for lookups. - "MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNz"+ - "IDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx"+ - "KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UE"+ - "CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yaw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw\n"+ - "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns\n"+ - "YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH\n"+ - "MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y\n"+ - "aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe\n"+ - "Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX\n"+ - "MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj\n"+ - "IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx\n"+ - "KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s\n"+ - "eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B\n"+ - "AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM\n"+ - "HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw\n"+ - "DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC\n"+ - "AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji\n"+ - "nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX\n"+ - "rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn\n"+ - "jBJ7xUS0rg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 3 Public Primary Certification Authority - G2", - // X500 Subject, for lookups. - "MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNz"+ - "IDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx"+ - "KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UE"+ - "CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yaw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ\n"+ - "BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh\n"+ - "c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy\n"+ - "MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp\n"+ - "emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X\n"+ - "DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw\n"+ - "FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg\n"+ - "UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo\n"+ - "YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5\n"+ - "MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB\n"+ - "AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4\n"+ - "pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0\n"+ - "13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID\n"+ - "AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk\n"+ - "U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i\n"+ - "F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY\n"+ - "oJ2daZH9\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 4 Public Primary Certification Authority - G2", - // X500 Subject, for lookups. - "MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNz"+ - "IDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx"+ - "KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UE"+ - "CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yaw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ\n"+ - "BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh\n"+ - "c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy\n"+ - "MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp\n"+ - "emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X\n"+ - "DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw\n"+ - "FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg\n"+ - "UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo\n"+ - "YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5\n"+ - "MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB\n"+ - "AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM\n"+ - "HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK\n"+ - "qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID\n"+ - "AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj\n"+ - "cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y\n"+ - "cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP\n"+ - "T8qAkbYp\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GlobalSign Root CA", - // X500 Subject, for lookups. - "MFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290"+ - "IENBMRswGQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0E=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG\n"+ - "A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\n"+ - "b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\n"+ - "MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\n"+ - "YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\n"+ - "aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\n"+ - "jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\n"+ - "xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\n"+ - "1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\n"+ - "snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\n"+ - "U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\n"+ - "9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU\n"+ - "YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B\n"+ - "AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7\n"+ - "5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q\n"+ - "gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR\n"+ - "rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7\n"+ - "ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o\n"+ - "Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GlobalSign Root CA - R2", - // X500 Subject, for lookups. - "MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIyMRMwEQYDVQQKEwpHbG9iYWxTaWdu"+ - "MRMwEQYDVQQDEwpHbG9iYWxTaWdu", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G\n"+ - "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp\n"+ - "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1\n"+ - "MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG\n"+ - "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\n"+ - "hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL\n"+ - "v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8\n"+ - "eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq\n"+ - "tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd\n"+ - "C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa\n"+ - "zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB\n"+ - "mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH\n"+ - "V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n\n"+ - "bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG\n"+ - "3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs\n"+ - "J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO\n"+ - "291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS\n"+ - "ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd\n"+ - "AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\n"+ - "TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("ValiCert Class 1 VA", - // X500 Subject, for lookups. - "MIG7MSQwIgYDVQQHExtWYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmsxFzAVBgNVBAoTDlZhbGlD"+ - "ZXJ0LCBJbmMuMTUwMwYDVQQLEyxWYWxpQ2VydCBDbGFzcyAxIFBvbGljeSBWYWxpZGF0aW9uIEF1"+ - "dGhvcml0eTEhMB8GA1UEAxMYaHR0cDovL3d3dy52YWxpY2VydC5jb20vMSAwHgYJKoZIhvcNAQkB"+ - "FhFpbmZvQHZhbGljZXJ0LmNvbQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\n"+ - "IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\n"+ - "BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\n"+ - "aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n"+ - "9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy\n"+ - "NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\n"+ - "azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\n"+ - "YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\n"+ - "Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\n"+ - "cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y\n"+ - "LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+\n"+ - "TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y\n"+ - "TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0\n"+ - "LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW\n"+ - "I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw\n"+ - "nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("ValiCert Class 2 VA", - // X500 Subject, for lookups. - "MIG7MSQwIgYDVQQHExtWYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmsxFzAVBgNVBAoTDlZhbGlD"+ - "ZXJ0LCBJbmMuMTUwMwYDVQQLEyxWYWxpQ2VydCBDbGFzcyAyIFBvbGljeSBWYWxpZGF0aW9uIEF1"+ - "dGhvcml0eTEhMB8GA1UEAxMYaHR0cDovL3d3dy52YWxpY2VydC5jb20vMSAwHgYJKoZIhvcNAQkB"+ - "FhFpbmZvQHZhbGljZXJ0LmNvbQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\n"+ - "IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\n"+ - "BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\n"+ - "aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n"+ - "9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\n"+ - "NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\n"+ - "azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\n"+ - "YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\n"+ - "Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\n"+ - "cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\n"+ - "dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\n"+ - "WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\n"+ - "v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\n"+ - "UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\n"+ - "IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\n"+ - "W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("RSA Root Certificate 1", - // X500 Subject, for lookups. - "MIG7MSQwIgYDVQQHExtWYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmsxFzAVBgNVBAoTDlZhbGlD"+ - "ZXJ0LCBJbmMuMTUwMwYDVQQLEyxWYWxpQ2VydCBDbGFzcyAzIFBvbGljeSBWYWxpZGF0aW9uIEF1"+ - "dGhvcml0eTEhMB8GA1UEAxMYaHR0cDovL3d3dy52YWxpY2VydC5jb20vMSAwHgYJKoZIhvcNAQkB"+ - "FhFpbmZvQHZhbGljZXJ0LmNvbQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\n"+ - "IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\n"+ - "BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\n"+ - "aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\n"+ - "9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy\n"+ - "NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\n"+ - "azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\n"+ - "YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\n"+ - "Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\n"+ - "cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD\n"+ - "cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs\n"+ - "2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY\n"+ - "JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE\n"+ - "Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ\n"+ - "n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A\n"+ - "PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 1 Public Primary Certification Authority - G3", - // X500 Subject, for lookups. - "MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT"+ - "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9y"+ - "IGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy"+ - "aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw\n"+ - "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\n"+ - "cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\n"+ - "LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\n"+ - "aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\n"+ - "dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\n"+ - "VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\n"+ - "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\n"+ - "bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\n"+ - "IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\n"+ - "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4\n"+ - "nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO\n"+ - "8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV\n"+ - "ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb\n"+ - "PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2\n"+ - "6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr\n"+ - "n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a\n"+ - "qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4\n"+ - "wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3\n"+ - "ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs\n"+ - "pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4\n"+ - "E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 2 Public Primary Certification Authority - G3", - // X500 Subject, for lookups. - "MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT"+ - "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9y"+ - "IGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFBy"+ - "aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ\n"+ - "BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy\n"+ - "aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s\n"+ - "IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp\n"+ - "Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\n"+ - "eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV\n"+ - "BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp\n"+ - "Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu\n"+ - "Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g\n"+ - "Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt\n"+ - "IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU\n"+ - "J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO\n"+ - "JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY\n"+ - "wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o\n"+ - "koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN\n"+ - "qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E\n"+ - "Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe\n"+ - "xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u\n"+ - "7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU\n"+ - "sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI\n"+ - "sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP\n"+ - "cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 3 Public Primary Certification Authority - G3", - // X500 Subject, for lookups. - "MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT"+ - "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9y"+ - "IGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy"+ - "aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\n"+ - "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\n"+ - "cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\n"+ - "LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\n"+ - "aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\n"+ - "dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\n"+ - "VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\n"+ - "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\n"+ - "bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\n"+ - "IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\n"+ - "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b\n"+ - "N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t\n"+ - "KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu\n"+ - "kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm\n"+ - "CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ\n"+ - "Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu\n"+ - "imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te\n"+ - "2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe\n"+ - "DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\n"+ - "/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p\n"+ - "F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt\n"+ - "TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Class 4 Public Primary Certification Authority - G3", - // X500 Subject, for lookups. - "MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT"+ - "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9y"+ - "IGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy"+ - "aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\n"+ - "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\n"+ - "cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\n"+ - "LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\n"+ - "aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\n"+ - "dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\n"+ - "VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\n"+ - "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\n"+ - "bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\n"+ - "IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\n"+ - "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1\n"+ - "GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ\n"+ - "+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd\n"+ - "U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm\n"+ - "NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY\n"+ - "ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/\n"+ - "ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1\n"+ - "CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq\n"+ - "g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm\n"+ - "fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c\n"+ - "2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/\n"+ - "bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Entrust.net Secure Server CA", - // X500 Subject, for lookups. - "MIHDMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRy"+ - "dXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg"+ - "MTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2Vy"+ - "dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n"+ - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n"+ - "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n"+ - "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n"+ - "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1\n"+ - "MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE\n"+ - "ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j\n"+ - "b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\n"+ - "bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg\n"+ - "U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA\n"+ - "A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/\n"+ - "I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3\n"+ - "wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC\n"+ - "AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb\n"+ - "oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5\n"+ - "BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\n"+ - "dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk\n"+ - "MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\n"+ - "b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\n"+ - "dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0\n"+ - "MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi\n"+ - "E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa\n"+ - "MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI\n"+ - "hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN\n"+ - "95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd\n"+ - "2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Entrust.net Secure Personal CA", - // X500 Subject, for lookups. - "MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRy"+ - "dXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl"+ - "MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u"+ - "ZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC\n"+ - "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u\n"+ - "ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh\n"+ - "Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\n"+ - "BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe\n"+ - "Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU\n"+ - "MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D\n"+ - "bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl\n"+ - "MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq\n"+ - "RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G\n"+ - "CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo\n"+ - "6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux\n"+ - "5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm\n"+ - "AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC\n"+ - "ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50\n"+ - "cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m\n"+ - "by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp\n"+ - "IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg\n"+ - "Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg\n"+ - "KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV\n"+ - "HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E\n"+ - "BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE\n"+ - "FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA\n"+ - "BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7\n"+ - "pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz\n"+ - "wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a\n"+ - "EkP/TOYGJqibGapEPHayXOw=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Entrust.net Premium 2048 Secure Server CA", - // X500 Subject, for lookups. - "MIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18y"+ - "MDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50"+ - "cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRo"+ - "b3JpdHkgKDIwNDgp", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML\n"+ - "RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp\n"+ - "bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5\n"+ - "IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp\n"+ - "ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy\n"+ - "MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3\n"+ - "LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp\n"+ - "YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG\n"+ - "A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp\n"+ - "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq\n"+ - "K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe\n"+ - "sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX\n"+ - "MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT\n"+ - "XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/\n"+ - "HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH\n"+ - "4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA\n"+ - "vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G\n"+ - "CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA\n"+ - "WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo\n"+ - "oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ\n"+ - "h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18\n"+ - "f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN\n"+ - "B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy\n"+ - "vUxFnmG6v4SBkgPR0ml8xQ==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Baltimore CyberTrust Root", - // X500 Subject, for lookups. - "MFoxCzAJBgNVBAYTAklFMRIwEAYDVQQKEwlCYWx0aW1vcmUxEzARBgNVBAsTCkN5YmVyVHJ1c3Qx"+ - "IjAgBgNVBAMTGUJhbHRpbW9yZSBDeWJlclRydXN0IFJvb3Q=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n"+ - "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n"+ - "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n"+ - "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n"+ - "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n"+ - "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n"+ - "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n"+ - "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n"+ - "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n"+ - "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n"+ - "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n"+ - "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n"+ - "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n"+ - "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n"+ - "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n"+ - "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n"+ - "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n"+ - "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n"+ - "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Equifax Secure Global eBusiness CA", - // X500 Subject, for lookups. - "MFoxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNFcXVpZmF4IFNlY3VyZSBJbmMuMS0wKwYDVQQDEyRF"+ - "cXVpZmF4IFNlY3VyZSBHbG9iYWwgZUJ1c2luZXNzIENBLTE=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc\n"+ - "MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT\n"+ - "ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw\n"+ - "MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj\n"+ - "dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l\n"+ - "c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC\n"+ - "UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc\n"+ - "58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/\n"+ - "o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH\n"+ - "MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr\n"+ - "aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA\n"+ - "A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA\n"+ - "Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv\n"+ - "8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Equifax Secure eBusiness CA 1", - // X500 Subject, for lookups. - "MFMxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNFcXVpZmF4IFNlY3VyZSBJbmMuMSYwJAYDVQQDEx1F"+ - "cXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc\n"+ - "MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT\n"+ - "ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw\n"+ - "MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j\n"+ - "LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ\n"+ - "KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo\n"+ - "RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu\n"+ - "WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw\n"+ - "Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD\n"+ - "AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK\n"+ - "eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM\n"+ - "zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+\n"+ - "WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN\n"+ - "/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Equifax Secure eBusiness CA 2", - // X500 Subject, for lookups. - "ME4xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5FcXVpZmF4IFNlY3VyZTEmMCQGA1UECxMdRXF1aWZh"+ - "eCBTZWN1cmUgZUJ1c2luZXNzIENBLTI=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\n"+ - "UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj\n"+ - "dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0\n"+ - "NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD\n"+ - "VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B\n"+ - "AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G\n"+ - "vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/\n"+ - "BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C\n"+ - "AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX\n"+ - "MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl\n"+ - "IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw\n"+ - "NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq\n"+ - "y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF\n"+ - "MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\n"+ - "A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy\n"+ - "0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1\n"+ - "E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Visa International Global Root 2", - // X500 Subject, for lookups. - "MGExCzAJBgNVBAYTAlVTMQ0wCwYDVQQKEwRWSVNBMS8wLQYDVQQLEyZWaXNhIEludGVybmF0aW9u"+ - "YWwgU2VydmljZSBBc3NvY2lhdGlvbjESMBAGA1UEAxMJR1AgUm9vdCAy", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx\n"+ - "DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2\n"+ - "aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1\n"+ - "MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT\n"+ - "QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp\n"+ - "b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\n"+ - "AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX\n"+ - "ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i\n"+ - "/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU\n"+ - "58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g\n"+ - "halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E\n"+ - "1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/\n"+ - "ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\n"+ - "MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb\n"+ - "mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ\n"+ - "kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN\n"+ - "dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ\n"+ - "ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn\n"+ - "B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("beTRUSTed Root CA", - // X500 Subject, for lookups. - "MFoxCzAJBgNVBAYTAldXMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAMTEmJlVFJVU1RlZCBS"+ - "b290IENBczEaMBgGA1UEAxMRYmVUUlVTVGVkIFJvb3QgQ0E=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX\n"+ - "VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD\n"+ - "QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX\n"+ - "DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl\n"+ - "ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU\n"+ - "ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT\n"+ - "CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P\n"+ - "6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM\n"+ - "jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX\n"+ - "2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N\n"+ - "R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j\n"+ - "rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV\n"+ - "HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa\n"+ - "gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1\n"+ - "bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0\n"+ - "ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy\n"+ - "YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl\n"+ - "ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl\n"+ - "cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0\n"+ - "L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx\n"+ - "CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV\n"+ - "HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ\n"+ - "KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo\n"+ - "Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2\n"+ - "jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe\n"+ - "1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5\n"+ - "mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc\n"+ - "tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("AddTrust Low-Value Services Root", - // X500 Subject, for lookups. - "MGUxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg"+ - "VFRQIE5ldHdvcmsxITAfBgNVBAMTGEFkZFRydXN0IENsYXNzIDEgQ0EgUm9vdA==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU\n"+ - "MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3\n"+ - "b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw\n"+ - "MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\n"+ - "QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD\n"+ - "VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA\n"+ - "A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul\n"+ - "CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n\n"+ - "tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl\n"+ - "dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch\n"+ - "PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC\n"+ - "+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O\n"+ - "BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E\n"+ - "BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl\n"+ - "MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk\n"+ - "ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB\n"+ - "IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X\n"+ - "7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz\n"+ - "43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY\n"+ - "eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl\n"+ - "pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA\n"+ - "WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("AddTrust External Root", - // X500 Subject, for lookups. - "MG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3Qg"+ - "RXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3Q=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU\n"+ - "MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs\n"+ - "IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290\n"+ - "MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux\n"+ - "FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h\n"+ - "bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v\n"+ - "dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt\n"+ - "H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9\n"+ - "uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX\n"+ - "mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX\n"+ - "a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN\n"+ - "E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0\n"+ - "WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD\n"+ - "VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0\n"+ - "Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU\n"+ - "cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx\n"+ - "IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN\n"+ - "AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH\n"+ - "YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n"+ - "6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC\n"+ - "Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX\n"+ - "c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a\n"+ - "mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("AddTrust Public Services Root", - // X500 Subject, for lookups. - "MGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg"+ - "VFRQIE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU\n"+ - "MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3\n"+ - "b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx\n"+ - "MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB\n"+ - "ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV\n"+ - "BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC\n"+ - "AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV\n"+ - "6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX\n"+ - "GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP\n"+ - "dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH\n"+ - "1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF\n"+ - "62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW\n"+ - "BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw\n"+ - "AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL\n"+ - "MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU\n"+ - "cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv\n"+ - "b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6\n"+ - "IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/\n"+ - "iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao\n"+ - "GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh\n"+ - "4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm\n"+ - "XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("AddTrust Qualified Certificates Root", - // X500 Subject, for lookups. - "MGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg"+ - "VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU\n"+ - "MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3\n"+ - "b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1\n"+ - "MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK\n"+ - "EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh\n"+ - "BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B\n"+ - "AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq\n"+ - "xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G\n"+ - "87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i\n"+ - "2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U\n"+ - "WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1\n"+ - "0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G\n"+ - "A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T\n"+ - "AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr\n"+ - "pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL\n"+ - "ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm\n"+ - "aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv\n"+ - "hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm\n"+ - "hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X\n"+ - "dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3\n"+ - "P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y\n"+ - "iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no\n"+ - "xqE=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Verisign Time Stamping Authority CA", - // X500 Subject, for lookups. - "MIGlMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0"+ - "d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9y"+ - "cGEgKGMpMDAxLDAqBgNVBAMTI1ZlcmlTaWduIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5IENB", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB\n"+ - "wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL\n"+ - "EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\n"+ - "IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1\n"+ - "dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\n"+ - "cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO\n"+ - "VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx\n"+ - "OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j\n"+ - "b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1\n"+ - "dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli\n"+ - "zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU\n"+ - "/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11\n"+ - "S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/\n"+ - "AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0\n"+ - "dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0\n"+ - "cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG\n"+ - "AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j\n"+ - "b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW\n"+ - "HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea\n"+ - "w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU\n"+ - "58dzq6wf7iWbwBbtt8pb8BQ=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Thawte Time Stamping CA", - // X500 Subject, for lookups. - "MIGLMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRQwEgYDVQQHEwtEdXJiYW52"+ - "aWxsZTEPMA0GA1UEChMGVGhhd3RlMR0wGwYDVQQLExRUaGF3dGUgQ2VydGlmaWNhdGlvbjEfMB0G"+ - "A1UEAxMWVGhhd3RlIFRpbWVzdGFtcGluZyBDQQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx\n"+ - "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN\n"+ - "BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd\n"+ - "BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN\n"+ - "MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g\n"+ - "Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG\n"+ - "A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l\n"+ - "c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT\n"+ - "6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa\n"+ - "Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL\n"+ - "8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB\n"+ - "Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC\n"+ - "9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ\n"+ - "pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ\n"+ - "CayJSdM=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Entrust.net Global Secure Server CA", - // X500 Subject, for lookups. - "MIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9D"+ - "UFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRy"+ - "dXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRp"+ - "ZmljYXRpb24gQXV0aG9yaXR5", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML\n"+ - "RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu\n"+ - "Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg\n"+ - "RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl\n"+ - "IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa\n"+ - "Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE\n"+ - "CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\n"+ - "dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk\n"+ - "MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\n"+ - "b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO\n"+ - "8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB\n"+ - "bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2\n"+ - "dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4\n"+ - "QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT\n"+ - "C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp\n"+ - "bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw\n"+ - "IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy\n"+ - "ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw\n"+ - "KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD\n"+ - "VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud\n"+ - "DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2\n"+ - "fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia\n"+ - "d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF\n"+ - "JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U\n"+ - "yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Entrust.net Global Secure Personal CA", - // X500 Subject, for lookups. - "MIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0Ff"+ - "Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50"+ - "cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRp"+ - "b24gQXV0aG9yaXR5", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML\n"+ - "RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp\n"+ - "bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw\n"+ - "IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu\n"+ - "dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy\n"+ - "MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3\n"+ - "LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp\n"+ - "YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG\n"+ - "A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\n"+ - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny\n"+ - "Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0\n"+ - "iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn\n"+ - "5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd\n"+ - "BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0\n"+ - "MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy\n"+ - "ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l\n"+ - "dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh\n"+ - "dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy\n"+ - "MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY\n"+ - "MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF\n"+ - "fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w\n"+ - "AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS\n"+ - "hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/\n"+ - "GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd\n"+ - "zmVml64mXg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("AOL Time Warner Root Certification Authority 1", - // X500 Subject, for lookups. - "MIGDMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUQU9MIFRpbWUgV2FybmVyIEluYy4xHDAaBgNVBAsT"+ - "E0FtZXJpY2EgT25saW5lIEluYy4xNzA1BgNVBAMTLkFPTCBUaW1lIFdhcm5lciBSb290IENlcnRp"+ - "ZmljYXRpb24gQXV0aG9yaXR5IDE=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx\n"+ - "HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh\n"+ - "IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0\n"+ - "aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1\n"+ - "MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg\n"+ - "SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M\n"+ - "IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw\n"+ - "DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U\n"+ - "0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI\n"+ - "TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf\n"+ - "RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF\n"+ - "zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh\n"+ - "BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA\n"+ - "AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY\n"+ - "PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/\n"+ - "BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn\n"+ - "9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT\n"+ - "Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF\n"+ - "Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX\n"+ - "n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW\n"+ - "H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("AOL Time Warner Root Certification Authority 2", - // X500 Subject, for lookups. - "MIGDMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUQU9MIFRpbWUgV2FybmVyIEluYy4xHDAaBgNVBAsT"+ - "E0FtZXJpY2EgT25saW5lIEluYy4xNzA1BgNVBAMTLkFPTCBUaW1lIFdhcm5lciBSb290IENlcnRp"+ - "ZmljYXRpb24gQXV0aG9yaXR5IDI=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx\n"+ - "HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh\n"+ - "IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0\n"+ - "aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz\n"+ - "NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg\n"+ - "SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M\n"+ - "IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw\n"+ - "DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ\n"+ - "7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb\n"+ - "m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY\n"+ - "xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ\n"+ - "YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq\n"+ - "JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx\n"+ - "I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz\n"+ - "kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh\n"+ - "EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S\n"+ - "Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM\n"+ - "gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu\n"+ - "rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n"+ - "FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO\n"+ - "1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu\n"+ - "h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP\n"+ - "yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q\n"+ - "7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT\n"+ - "RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/\n"+ - "ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB\n"+ - "M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ\n"+ - "my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO\n"+ - "AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT\n"+ - "9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H\n"+ - "hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5\n"+ - "fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("beTRUSTed Root CA-Baltimore Implementation", - // X500 Subject, for lookups. - "MGYxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYD"+ - "VQQDEypiZVRSVVNUZWQgUm9vdCBDQS1CYWx0aW1vcmUgSW1wbGVtZW50YXRpb24=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli\n"+ - "ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq\n"+ - "YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy\n"+ - "MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk\n"+ - "MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl\n"+ - "ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN\n"+ - "AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i\n"+ - "805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6\n"+ - "l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B\n"+ - "FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp\n"+ - "kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7\n"+ - "eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa\n"+ - "MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A\n"+ - "AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig\n"+ - "dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu\n"+ - "dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk\n"+ - "IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g\n"+ - "UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l\n"+ - "bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl\n"+ - "LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k\n"+ - "ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By\n"+ - "b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc\n"+ - "cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud\n"+ - "DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA\n"+ - "WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6\n"+ - "7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY\n"+ - "gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb\n"+ - "4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9\n"+ - "CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("beTRUSTed Root CA - Entrust Implementation", - // X500 Subject, for lookups. - "MGYxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYD"+ - "VQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli\n"+ - "ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq\n"+ - "YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy\n"+ - "MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk\n"+ - "MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl\n"+ - "ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN\n"+ - "AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO\n"+ - "K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD\n"+ - "d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj\n"+ - "DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe\n"+ - "yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt\n"+ - "VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB\n"+ - "MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI\n"+ - "KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp\n"+ - "ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug\n"+ - "b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0\n"+ - "aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu\n"+ - "dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg\n"+ - "Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0\n"+ - "cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF\n"+ - "BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz\n"+ - "L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug\n"+ - "eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv\n"+ - "b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w\n"+ - "bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw\n"+ - "ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA\n"+ - "FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw\n"+ - "qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE\n"+ - "kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ\n"+ - "5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB\n"+ - "evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz\n"+ - "ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k\n"+ - "XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh\n"+ - "xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("beTRUSTed Root CA - RSA Implementation", - // X500 Subject, for lookups. - "MGIxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMS8wLQYD"+ - "VQQDEyZiZVRSVVNUZWQgUm9vdCBDQSAtIFJTQSBJbXBsZW1lbnRhdGlvbg==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi\n"+ - "MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB\n"+ - "czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp\n"+ - "b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli\n"+ - "ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm\n"+ - "YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG\n"+ - "SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn\n"+ - "HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I\n"+ - "1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk\n"+ - "tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU\n"+ - "GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er\n"+ - "cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY\n"+ - "MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+\n"+ - "AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j\n"+ - "b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB\n"+ - "OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh\n"+ - "dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu\n"+ - "IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl\n"+ - "LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS\n"+ - "ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo\n"+ - "ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w\n"+ - "cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME\n"+ - "GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt\n"+ - "z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g\n"+ - "6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK\n"+ - "mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd\n"+ - "LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb\n"+ - "J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3\n"+ - "SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("RSA Security 2048 v3", - // X500 Subject, for lookups. - "MDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4"+ - "IFYz", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6\n"+ - "MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp\n"+ - "dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX\n"+ - "BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy\n"+ - "MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp\n"+ - "eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg\n"+ - "/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl\n"+ - "wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh\n"+ - "AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2\n"+ - "PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu\n"+ - "AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB\n"+ - "BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR\n"+ - "MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc\n"+ - "HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/\n"+ - "Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+\n"+ - "f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO\n"+ - "rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch\n"+ - "6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3\n"+ - "7CAFYd4=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("RSA Security 1024 v3", - // X500 Subject, for lookups. - "MDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAxMDI0"+ - "IFYz", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6\n"+ - "MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp\n"+ - "dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX\n"+ - "BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx\n"+ - "MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O\n"+ - "isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY\n"+ - "78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9\n"+ - "zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G\n"+ - "A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd\n"+ - "BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA\n"+ - "Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN\n"+ - "T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD\n"+ - "mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GeoTrust Global CA", - // X500 Subject, for lookups. - "MEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz"+ - "dCBHbG9iYWwgQ0E=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\n"+ - "MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\n"+ - "YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\n"+ - "EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\n"+ - "R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\n"+ - "9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\n"+ - "fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\n"+ - "iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\n"+ - "1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\n"+ - "bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\n"+ - "MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\n"+ - "ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\n"+ - "uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\n"+ - "Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\n"+ - "tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\n"+ - "PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\n"+ - "hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\n"+ - "5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GeoTrust Global CA 2", - // X500 Subject, for lookups. - "MEQxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMR0wGwYDVQQDExRHZW9UcnVz"+ - "dCBHbG9iYWwgQ0EgMg==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW\n"+ - "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs\n"+ - "IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG\n"+ - "EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg\n"+ - "R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A\n"+ - "PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8\n"+ - "Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL\n"+ - "TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL\n"+ - "5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7\n"+ - "S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe\n"+ - "2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n"+ - "FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap\n"+ - "EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td\n"+ - "EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv\n"+ - "/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN\n"+ - "A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0\n"+ - "abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF\n"+ - "I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz\n"+ - "4iIprn2DQKi6bA==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GeoTrust Universal CA", - // X500 Subject, for lookups. - "MEUxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMR4wHAYDVQQDExVHZW9UcnVz"+ - "dCBVbml2ZXJzYWwgQ0E=", - "-----BEGIN CERTIFICATE-----\n"+ - "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\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("GeoTrust Universal CA 2", - // X500 Subject, for lookups. - "MEcxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMSAwHgYDVQQDExdHZW9UcnVz"+ - "dCBVbml2ZXJzYWwgQ0EgMg==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW\n"+ - "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy\n"+ - "c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD\n"+ - "VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1\n"+ - "c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\n"+ - "AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81\n"+ - "WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG\n"+ - "FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq\n"+ - "XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL\n"+ - "se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb\n"+ - "KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd\n"+ - "IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73\n"+ - "y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt\n"+ - "hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc\n"+ - "QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4\n"+ - "Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV\n"+ - "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV\n"+ - "HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ\n"+ - "KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\n"+ - "dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ\n"+ - "L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr\n"+ - "Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo\n"+ - "ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY\n"+ - "T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz\n"+ - "GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m\n"+ - "1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV\n"+ - "OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH\n"+ - "6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX\n"+ - "QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("UTN-USER First-Network Applications", - // X500 Subject, for lookups. - "MIGjMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w"+ - "HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy"+ - "dXN0LmNvbTErMCkGA1UEAxMiVVROLVVTRVJGaXJzdC1OZXR3b3JrIEFwcGxpY2F0aW9ucw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB\n"+ - "ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\n"+ - "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\n"+ - "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt\n"+ - "TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1\n"+ - "NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0\n"+ - "IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD\n"+ - "VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS\n"+ - "Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n"+ - "DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2\n"+ - "N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH\n"+ - "iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe\n"+ - "YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1\n"+ - "axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g\n"+ - "yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD\n"+ - "AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh\n"+ - "ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V\n"+ - "VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB\n"+ - "BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y\n"+ - "IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs\n"+ - "QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4\n"+ - "ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM\n"+ - "YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb\n"+ - "QErNaLly7HF27FSOH4UMAWr6pjisH8SE\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("America Online Root Certification Authority 1", - // X500 Subject, for lookups. - "MGMxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNBbWVyaWNhIE9ubGluZSBJbmMuMTYwNAYDVQQDEy1B"+ - "bWVyaWNhIE9ubGluZSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IDE=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc\n"+ - "MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP\n"+ - "bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2\n"+ - "MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft\n"+ - "ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg\n"+ - "Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n"+ - "ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk\n"+ - "hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym\n"+ - "1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW\n"+ - "OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb\n"+ - "2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko\n"+ - "O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw\n"+ - "AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU\n"+ - "AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\n"+ - "BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF\n"+ - "Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb\n"+ - "LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir\n"+ - "oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C\n"+ - "MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds\n"+ - "sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("America Online Root Certification Authority 2", - // X500 Subject, for lookups. - "MGMxCzAJBgNVBAYTAlVTMRwwGgYDVQQKExNBbWVyaWNhIE9ubGluZSBJbmMuMTYwNAYDVQQDEy1B"+ - "bWVyaWNhIE9ubGluZSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IDI=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc\n"+ - "MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP\n"+ - "bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2\n"+ - "MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft\n"+ - "ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg\n"+ - "Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP\n"+ - "ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC\n"+ - "206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci\n"+ - "KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2\n"+ - "JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9\n"+ - "BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e\n"+ - "Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B\n"+ - "PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67\n"+ - "Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq\n"+ - "Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ\n"+ - "o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3\n"+ - "+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj\n"+ - "YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj\n"+ - "FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE\n"+ - "AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn\n"+ - "xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2\n"+ - "LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc\n"+ - "obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8\n"+ - "CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe\n"+ - "IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA\n"+ - "DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F\n"+ - "AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX\n"+ - "Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb\n"+ - "AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl\n"+ - "Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw\n"+ - "RY8mkaKO/qk=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Visa eCommerce Root", - // X500 Subject, for lookups. - "MGsxCzAJBgNVBAYTAlVTMQ0wCwYDVQQKEwRWSVNBMS8wLQYDVQQLEyZWaXNhIEludGVybmF0aW9u"+ - "YWwgU2VydmljZSBBc3NvY2lhdGlvbjEcMBoGA1UEAxMTVmlzYSBlQ29tbWVyY2UgUm9vdA==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr\n"+ - "MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl\n"+ - "cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\n"+ - "bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw\n"+ - "CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h\n"+ - "dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l\n"+ - "cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h\n"+ - "2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E\n"+ - "lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV\n"+ - "ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq\n"+ - "299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t\n"+ - "vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL\n"+ - "dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD\n"+ - "AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF\n"+ - "AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR\n"+ - "zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3\n"+ - "LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd\n"+ - "7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw\n"+ - "++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\n"+ - "398znM/jra6O1I7mT1GvFpLgXPYHDw==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("TC TrustCenter, Germany, Class 2 CA", - // X500 Subject, for lookups. - "MIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgG"+ - "A1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEi"+ - "MCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlm"+ - "aWNhdGVAdHJ1c3RjZW50ZXIuZGU=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF\n"+ - "MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU\n"+ - "QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI\n"+ - "MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN\n"+ - "AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla\n"+ - "Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy\n"+ - "ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y\n"+ - "IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1\n"+ - "c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA\n"+ - "dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y\n"+ - "AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw\n"+ - "TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8\n"+ - "/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF\n"+ - "MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3\n"+ - "LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G\n"+ - "CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/\n"+ - "jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms\n"+ - "Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("TC TrustCenter, Germany, Class 3 CA", - // X500 Subject, for lookups. - "MIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgG"+ - "A1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEi"+ - "MCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlm"+ - "aWNhdGVAdHJ1c3RjZW50ZXIuZGU=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF\n"+ - "MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU\n"+ - "QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI\n"+ - "MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN\n"+ - "AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla\n"+ - "Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy\n"+ - "ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y\n"+ - "IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1\n"+ - "c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA\n"+ - "dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF\n"+ - "Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw\n"+ - "Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW\n"+ - "w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF\n"+ - "MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3\n"+ - "LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G\n"+ - "CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE\n"+ - "Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD\n"+ - "2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Certum Root CA", - // X500 Subject, for lookups. - "MD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl"+ - "cnR1bSBDQQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM\n"+ - "MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD\n"+ - "QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM\n"+ - "MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD\n"+ - "QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E\n"+ - "jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo\n"+ - "ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI\n"+ - "ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu\n"+ - "Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg\n"+ - "AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7\n"+ - "HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA\n"+ - "uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa\n"+ - "TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg\n"+ - "xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q\n"+ - "CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x\n"+ - "O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs\n"+ - "6GAqm4VKQPNriiTsBhYscw==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Comodo AAA Services root", - // X500 Subject, for lookups. - "MHsxCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1Nh"+ - "bGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNh"+ - "dGUgU2VydmljZXM=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb\n"+ - "MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\n"+ - "GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj\n"+ - "YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL\n"+ - "MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\n"+ - "BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM\n"+ - "GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\n"+ - "ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua\n"+ - "BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe\n"+ - "3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4\n"+ - "YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR\n"+ - "rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm\n"+ - "ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU\n"+ - "oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\n"+ - "MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v\n"+ - "QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t\n"+ - "b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF\n"+ - "AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q\n"+ - "GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\n"+ - "Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2\n"+ - "G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi\n"+ - "l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3\n"+ - "smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Comodo Secure Services root", - // X500 Subject, for lookups. - "MH4xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1Nh"+ - "bGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSQwIgYDVQQDDBtTZWN1cmUgQ2VydGlm"+ - "aWNhdGUgU2VydmljZXM=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb\n"+ - "MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\n"+ - "GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp\n"+ - "ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow\n"+ - "fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n"+ - "A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV\n"+ - "BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB\n"+ - "BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM\n"+ - "cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S\n"+ - "HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996\n"+ - "CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk\n"+ - "3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz\n"+ - "6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV\n"+ - "HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud\n"+ - "EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv\n"+ - "Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw\n"+ - "Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww\n"+ - "DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0\n"+ - "5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj\n"+ - "Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI\n"+ - "gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ\n"+ - "aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl\n"+ - "izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Comodo Trusted Services root", - // X500 Subject, for lookups. - "MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1Nh"+ - "bGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRp"+ - "ZmljYXRlIFNlcnZpY2Vz", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb\n"+ - "MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\n"+ - "GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0\n"+ - "aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla\n"+ - "MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n"+ - "BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD\n"+ - "VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B\n"+ - "AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW\n"+ - "fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt\n"+ - "TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL\n"+ - "fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW\n"+ - "1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7\n"+ - "kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G\n"+ - "A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD\n"+ - "VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v\n"+ - "ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo\n"+ - "dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu\n"+ - "Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/\n"+ - "HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32\n"+ - "pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS\n"+ - "jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+\n"+ - "xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn\n"+ - "dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("IPS Chained CAs root", - // X500 Subject, for lookups. - "MIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25h"+ - "MS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQK"+ - "FCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hh"+ - "aW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVk"+ - "IENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBz"+ - "LmVz", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT\n"+ - "MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE\n"+ - "ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE\n"+ - "ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq\n"+ - "SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD\n"+ - "VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx\n"+ - "HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha\n"+ - "Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl\n"+ - "bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg\n"+ - "cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu\n"+ - "ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD\n"+ - "QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp\n"+ - "bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP\n"+ - "aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ\n"+ - "spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB\n"+ - "hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB\n"+ - "Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O\n"+ - "BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5\n"+ - "PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE\n"+ - "CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ\n"+ - "bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt\n"+ - "YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD\n"+ - "aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT\n"+ - "IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI\n"+ - "hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E\n"+ - "BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG\n"+ - "CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB\n"+ - "BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw\n"+ - "EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC\n"+ - "BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg\n"+ - "aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw\n"+ - "cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv\n"+ - "aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3\n"+ - "dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB\n"+ - "BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w\n"+ - "NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5\n"+ - "Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz\n"+ - "MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz\n"+ - "L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF\n"+ - "BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W\n"+ - "WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN\n"+ - "HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN\n"+ - "b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("IPS CLASE1 root", - // X500 Subject, for lookups. - "MIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25h"+ - "MS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQK"+ - "FCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xB"+ - "U0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRp"+ - "ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXM=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT\n"+ - "MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE\n"+ - "ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE\n"+ - "ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl\n"+ - "SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl\n"+ - "SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3\n"+ - "DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw\n"+ - "NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD\n"+ - "VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n\n"+ - "IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g\n"+ - "IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv\n"+ - "biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv\n"+ - "biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN\n"+ - "BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS\n"+ - "zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS\n"+ - "YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ\n"+ - "KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb\n"+ - "adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk\n"+ - "ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE\n"+ - "BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT\n"+ - "ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC\n"+ - "LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g\n"+ - "QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g\n"+ - "QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD\n"+ - "VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr\n"+ - "BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB\n"+ - "FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC\n"+ - "AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB\n"+ - "D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp\n"+ - "ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC\n"+ - "BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito\n"+ - "dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG\n"+ - "SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D\n"+ - "TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw\n"+ - "czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov\n"+ - "L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq\n"+ - "MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu\n"+ - "Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy\n"+ - "Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v\n"+ - "Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK\n"+ - "Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj\n"+ - "V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+\n"+ - "hjM+5i9Ibq9UkE6tsSU=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("IPS CLASE3 root", - // X500 Subject, for lookups. - "MIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25h"+ - "MS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQK"+ - "FCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xB"+ - "U0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRp"+ - "ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXM=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT\n"+ - "MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE\n"+ - "ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE\n"+ - "ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl\n"+ - "SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl\n"+ - "SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3\n"+ - "DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx\n"+ - "MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD\n"+ - "VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n\n"+ - "IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g\n"+ - "IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv\n"+ - "biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv\n"+ - "biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN\n"+ - "BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ\n"+ - "H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY\n"+ - "8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr\n"+ - "SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj\n"+ - "mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk\n"+ - "ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE\n"+ - "BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT\n"+ - "ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC\n"+ - "LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g\n"+ - "QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g\n"+ - "QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD\n"+ - "VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr\n"+ - "BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB\n"+ - "FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC\n"+ - "AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB\n"+ - "D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp\n"+ - "ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC\n"+ - "BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito\n"+ - "dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG\n"+ - "SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D\n"+ - "TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw\n"+ - "czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov\n"+ - "L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq\n"+ - "MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu\n"+ - "Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy\n"+ - "Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v\n"+ - "Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD\n"+ - "qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9\n"+ - "D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy\n"+ - "r33I6unUVtkOE7LFRVA=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("IPS CLASEA1 root", - // X500 Subject, for lookups. - "MIIBFDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25h"+ - "MS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQK"+ - "FCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS8wLQYDVQQLEyZJUFMgQ0EgQ0xB"+ - "U0VBMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmSVBTIENBIENMQVNFQTEgQ2Vy"+ - "dGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lcw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT\n"+ - "MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE\n"+ - "ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE\n"+ - "ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm\n"+ - "SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT\n"+ - "JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI\n"+ - "hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3\n"+ - "MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ\n"+ - "BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp\n"+ - "bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G\n"+ - "LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh\n"+ - "dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj\n"+ - "YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw\n"+ - "gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8\n"+ - "m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd\n"+ - "ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8\n"+ - "eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47\n"+ - "3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh\n"+ - "ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ\n"+ - "BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp\n"+ - "bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G\n"+ - "LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh\n"+ - "dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj\n"+ - "YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC\n"+ - "AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF\n"+ - "BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB\n"+ - "BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg\n"+ - "hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud\n"+ - "EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD\n"+ - "QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG\n"+ - "SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC\n"+ - "AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j\n"+ - "cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2\n"+ - "b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu\n"+ - "aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI\n"+ - "BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s\n"+ - "MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz\n"+ - "MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz\n"+ - "MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF\n"+ - "BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA\n"+ - "AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF\n"+ - "aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL\n"+ - "H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("IPS CLASEA3 root", - // X500 Subject, for lookups. - "MIIBFDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25h"+ - "MS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQK"+ - "FCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS8wLQYDVQQLEyZJUFMgQ0EgQ0xB"+ - "U0VBMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmSVBTIENBIENMQVNFQTMgQ2Vy"+ - "dGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lcw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT\n"+ - "MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE\n"+ - "ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE\n"+ - "ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm\n"+ - "SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT\n"+ - "JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI\n"+ - "hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3\n"+ - "MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ\n"+ - "BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp\n"+ - "bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G\n"+ - "LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh\n"+ - "dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj\n"+ - "YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw\n"+ - "gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN\n"+ - "G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU\n"+ - "VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn\n"+ - "6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8\n"+ - "2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh\n"+ - "ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ\n"+ - "BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp\n"+ - "bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G\n"+ - "LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh\n"+ - "dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj\n"+ - "YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC\n"+ - "AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF\n"+ - "BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB\n"+ - "BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg\n"+ - "hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud\n"+ - "EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD\n"+ - "QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG\n"+ - "SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC\n"+ - "AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j\n"+ - "cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2\n"+ - "b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu\n"+ - "aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI\n"+ - "BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s\n"+ - "MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz\n"+ - "MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz\n"+ - "MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF\n"+ - "BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca\n"+ - "2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI\n"+ - "3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS\n"+ - "AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("IPS Servidores root", - // X500 Subject, for lookups. - "MIGjMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQkFSQ0VMT05BMRIwEAYDVQQHEwlCQVJDRUxPTkEx"+ - "GTAXBgNVBAoTEElQUyBTZWd1cmlkYWQgQ0ExGDAWBgNVBAsTD0NlcnRpZmljYWNpb25lczEXMBUG"+ - "A1UEAxMOSVBTIFNFUlZJRE9SRVMxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lcw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYD\n"+ - "VQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBT\n"+ - "IFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD\n"+ - "Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVz\n"+ - "MB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMxCzAJBgNVBAYTAkVT\n"+ - "MRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE\n"+ - "ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcw\n"+ - "FQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu\n"+ - "aXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyY\n"+ - "XZhkJAk8IbPMGbWOlI6H0fg3PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1\n"+ - "gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4\n"+ - "Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lY\n"+ - "JN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsU\n"+ - "dx+2/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14\n"+ - "cJ58GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("IPS Timestamping root", - // X500 Subject, for lookups. - "MIIBHjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25h"+ - "MS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQK"+ - "FCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGlt"+ - "ZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0"+ - "YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p"+ - "cHMuZXM=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT\n"+ - "MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE\n"+ - "ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE\n"+ - "ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr\n"+ - "SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG\n"+ - "A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\n"+ - "eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx\n"+ - "OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy\n"+ - "Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l\n"+ - "dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw\n"+ - "cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh\n"+ - "bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU\n"+ - "aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B\n"+ - "CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n"+ - "vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4\n"+ - "Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY\n"+ - "q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G\n"+ - "A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL\n"+ - "0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ\n"+ - "BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ\n"+ - "UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp\n"+ - "cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg\n"+ - "Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD\n"+ - "EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w\n"+ - "HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM\n"+ - "BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB\n"+ - "BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB\n"+ - "FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD\n"+ - "VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw\n"+ - "cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl\n"+ - "IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0\n"+ - "dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v\n"+ - "d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG\n"+ - "SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U\n"+ - "aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz\n"+ - "LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC\n"+ - "AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp\n"+ - "bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy\n"+ - "MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj\n"+ - "ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF\n"+ - "BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI\n"+ - "hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3\n"+ - "6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I\n"+ - "3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("QuoVadis Root CA", - // X500 Subject, for lookups. - "MH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290"+ - "IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmlj"+ - "YXRpb24gQXV0aG9yaXR5", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC\n"+ - "TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0\n"+ - "aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0\n"+ - "aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz\n"+ - "MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw\n"+ - "IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR\n"+ - "dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG\n"+ - "9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp\n"+ - "li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D\n"+ - "rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ\n"+ - "WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug\n"+ - "F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU\n"+ - "xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC\n"+ - "Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv\n"+ - "dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw\n"+ - "ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl\n"+ - "IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh\n"+ - "c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy\n"+ - "ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\n"+ - "Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI\n"+ - "KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T\n"+ - "KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq\n"+ - "y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p\n"+ - "dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD\n"+ - "VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL\n"+ - "MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk\n"+ - "fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8\n"+ - "7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R\n"+ - "cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y\n"+ - "mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW\n"+ - "xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK\n"+ - "SnQ2+Q==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("QuoVadis Root CA 2", - // X500 Subject, for lookups. - "MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W"+ - "YWRpcyBSb290IENBIDI=", - "-----BEGIN CERTIFICATE-----\n"+ - "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\n"+ - "8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("QuoVadis Root CA 3", - // X500 Subject, for lookups. - "MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W"+ - "YWRpcyBSb290IENBIDM=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x\n"+ - "GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv\n"+ - "b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV\n"+ - "BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W\n"+ - "YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM\n"+ - "V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB\n"+ - "4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr\n"+ - "H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd\n"+ - "8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv\n"+ - "vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT\n"+ - "mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe\n"+ - "btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc\n"+ - "T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt\n"+ - "WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ\n"+ - "c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A\n"+ - "4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD\n"+ - "VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG\n"+ - "CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0\n"+ - "aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\n"+ - "aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu\n"+ - "dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw\n"+ - "czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G\n"+ - "A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC\n"+ - "TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg\n"+ - "Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0\n"+ - "7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem\n"+ - "d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd\n"+ - "+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B\n"+ - "4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN\n"+ - "t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x\n"+ - "DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57\n"+ - "k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s\n"+ - "zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j\n"+ - "Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT\n"+ - "mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK\n"+ - "4SVhM7JZG+Ju1zdXtg2pEto=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Security Communication Root CA", - // X500 Subject, for lookups. - "MFAxCzAJBgNVBAYTAkpQMRgwFgYDVQQKEw9TRUNPTSBUcnVzdC5uZXQxJzAlBgNVBAsTHlNlY3Vy"+ - "aXR5IENvbW11bmljYXRpb24gUm9vdENBMQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY\n"+ - "MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t\n"+ - "dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5\n"+ - "WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD\n"+ - "VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3\n"+ - "DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8\n"+ - "9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ\n"+ - "DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9\n"+ - "Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N\n"+ - "QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ\n"+ - "xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G\n"+ - "A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T\n"+ - "AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG\n"+ - "kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr\n"+ - "Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5\n"+ - "Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU\n"+ - "JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot\n"+ - "RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Sonera Class 1 Root CA", - // X500 Subject, for lookups. - "MDkxCzAJBgNVBAYTAkZJMQ8wDQYDVQQKEwZTb25lcmExGTAXBgNVBAMTEFNvbmVyYSBDbGFzczEg"+ - "Q0E=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP\n"+ - "MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx\n"+ - "MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV\n"+ - "BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI\n"+ - "hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG\n"+ - "29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk\n"+ - "oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk\n"+ - "3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL\n"+ - "qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN\n"+ - "nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw\n"+ - "DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG\n"+ - "MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX\n"+ - "ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H\n"+ - "DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO\n"+ - "TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv\n"+ - "kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w\n"+ - "zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Sonera Class 2 Root CA", - // X500 Subject, for lookups. - "MDkxCzAJBgNVBAYTAkZJMQ8wDQYDVQQKEwZTb25lcmExGTAXBgNVBAMTEFNvbmVyYSBDbGFzczIg"+ - "Q0E=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP\n"+ - "MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx\n"+ - "MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV\n"+ - "BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI\n"+ - "hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o\n"+ - "Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt\n"+ - "5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s\n"+ - "3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej\n"+ - "vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu\n"+ - "8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw\n"+ - "DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG\n"+ - "MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil\n"+ - "zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/\n"+ - "3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD\n"+ - "FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6\n"+ - "Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2\n"+ - "ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Staat der Nederlanden Root CA", - // X500 Subject, for lookups. - "MFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMT"+ - "HVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO\n"+ - "TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh\n"+ - "dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy\n"+ - "MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk\n"+ - "ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB\n"+ - "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn\n"+ - "ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71\n"+ - "9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO\n"+ - "hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U\n"+ - "tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o\n"+ - "BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh\n"+ - "SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww\n"+ - "OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv\n"+ - "cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA\n"+ - "7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k\n"+ - "/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm\n"+ - "eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6\n"+ - "u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy\n"+ - "7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR\n"+ - "iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("TDC Internet Root CA", - // X500 Subject, for lookups. - "MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl"+ - "cm5ldCBSb290IENB", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE\n"+ - "SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg\n"+ - "Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV\n"+ - "BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl\n"+ - "cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA\n"+ - "vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu\n"+ - "Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a\n"+ - "0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1\n"+ - "4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN\n"+ - "eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD\n"+ - "R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG\n"+ - "A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu\n"+ - "dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME\n"+ - "Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3\n"+ - "WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw\n"+ - "HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ\n"+ - "KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO\n"+ - "Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX\n"+ - "wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+\n"+ - "2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89\n"+ - "9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0\n"+ - "jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38\n"+ - "aQNiuJkFBT1reBK9sG9l\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("TDC OCES Root CA", - // X500 Subject, for lookups. - "MDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENB", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE\n"+ - "SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw\n"+ - "ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU\n"+ - "REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n"+ - "MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr\n"+ - "2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s\n"+ - "2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU\n"+ - "GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj\n"+ - "dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r\n"+ - "TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/\n"+ - "BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB\n"+ - "AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv\n"+ - "c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl\n"+ - "ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu\n"+ - "MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg\n"+ - "T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud\n"+ - "HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD\n"+ - "VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny\n"+ - "bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy\n"+ - "MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ\n"+ - "J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG\n"+ - "SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom\n"+ - "JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO\n"+ - "inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y\n"+ - "caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB\n"+ - "mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ\n"+ - "YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9\n"+ - "BKNDLdr8C2LqL19iUw==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("UTN DATACorp SGC Root CA", - // X500 Subject, for lookups. - "MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w"+ - "HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy"+ - "dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dD", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB\n"+ - "kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\n"+ - "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\n"+ - "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw\n"+ - "IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG\n"+ - "EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD\n"+ - "VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu\n"+ - "dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN\n"+ - "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6\n"+ - "E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ\n"+ - "D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK\n"+ - "4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq\n"+ - "lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW\n"+ - "bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB\n"+ - "o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT\n"+ - "MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js\n"+ - "LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr\n"+ - "BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB\n"+ - "AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft\n"+ - "Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj\n"+ - "j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH\n"+ - "KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv\n"+ - "2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3\n"+ - "mfnGV/TJVTl4uix5yaaIK/QI\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("UTN USERFirst Email Root CA", - // X500 Subject, for lookups. - "MIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w"+ - "HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy"+ - "dXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5k"+ - "IEVtYWls", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB\n"+ - "rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\n"+ - "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\n"+ - "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt\n"+ - "Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa\n"+ - "Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV\n"+ - "BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l\n"+ - "dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE\n"+ - "AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls\n"+ - "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B\n"+ - "YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9\n"+ - "hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l\n"+ - "L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm\n"+ - "SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM\n"+ - "1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws\n"+ - "6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n"+ - "DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw\n"+ - "Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50\n"+ - "aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH\n"+ - "AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u\n"+ - "7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0\n"+ - "xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ\n"+ - "rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim\n"+ - "eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk\n"+ - "USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("UTN USERFirst Hardware Root CA", - // X500 Subject, for lookups. - "MIGXMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w"+ - "HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy"+ - "dXN0LmNvbTEfMB0GA1UEAxMWVVROLVVTRVJGaXJzdC1IYXJkd2FyZQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB\n"+ - "lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\n"+ - "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\n"+ - "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt\n"+ - "SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG\n"+ - "A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe\n"+ - "MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v\n"+ - "d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh\n"+ - "cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn\n"+ - "0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ\n"+ - "M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a\n"+ - "MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd\n"+ - "oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI\n"+ - "DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy\n"+ - "oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD\n"+ - "VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0\n"+ - "dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy\n"+ - "bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF\n"+ - "BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\n"+ - "//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli\n"+ - "CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE\n"+ - "CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t\n"+ - "3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS\n"+ - "KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("UTN USERFirst Object Root CA", - // X500 Subject, for lookups. - "MIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w"+ - "HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy"+ - "dXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJGaXJzdC1PYmplY3Q=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB\n"+ - "lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\n"+ - "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\n"+ - "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt\n"+ - "T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV\n"+ - "BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc\n"+ - "BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3\n"+ - "dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC\n"+ - "ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP\n"+ - "HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO\n"+ - "KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo\n"+ - "5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+\n"+ - "pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb\n"+ - "kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC\n"+ - "AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\n"+ - "FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov\n"+ - "L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV\n"+ - "HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN\n"+ - "AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw\n"+ - "NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB\n"+ - "mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU\n"+ - "4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5\n"+ - "81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR\n"+ - "Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Camerfirma Chambers of Commerce Root", - // X500 Subject, for lookups. - "MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBBODI3NDMyODcx"+ - "IzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIwIAYDVQQDExlDaGFtYmVycyBv"+ - "ZiBDb21tZXJjZSBSb290", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn\n"+ - "MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL\n"+ - "ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg\n"+ - "b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa\n"+ - "MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB\n"+ - "ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw\n"+ - "IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B\n"+ - "AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb\n"+ - "unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d\n"+ - "BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq\n"+ - "7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3\n"+ - "0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX\n"+ - "roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG\n"+ - "A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j\n"+ - "aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p\n"+ - "26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA\n"+ - "BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud\n"+ - "EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN\n"+ - "BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz\n"+ - "aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB\n"+ - "AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd\n"+ - "p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi\n"+ - "1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc\n"+ - "XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0\n"+ - "eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu\n"+ - "tGWaIZDgqtCYvDi1czyL+Nw=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Camerfirma Global Chambersign Root", - // X500 Subject, for lookups. - "MH0xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBBODI3NDMyODcx"+ - "IzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSAwHgYDVQQDExdHbG9iYWwgQ2hh"+ - "bWJlcnNpZ24gUm9vdA==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn\n"+ - "MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL\n"+ - "ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo\n"+ - "YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9\n"+ - "MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy\n"+ - "NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G\n"+ - "A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA\n"+ - "A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0\n"+ - "Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s\n"+ - "QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV\n"+ - "eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795\n"+ - "B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh\n"+ - "z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T\n"+ - "AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i\n"+ - "ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w\n"+ - "TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH\n"+ - "MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD\n"+ - "VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE\n"+ - "VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh\n"+ - "bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B\n"+ - "AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM\n"+ - "bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi\n"+ - "ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG\n"+ - "VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c\n"+ - "ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/\n"+ - "AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("NetLock Qualified (Class QA) Root", - // X500 Subject, for lookups. - "MIHJMQswCQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFs"+ - "b3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMT"+ - "OU5ldExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFk"+ - "bzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx\n"+ - "ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0\n"+ - "b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD\n"+ - "EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz\n"+ - "aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w\n"+ - "MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G\n"+ - "A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh\n"+ - "Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l\n"+ - "dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh\n"+ - "bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq\n"+ - "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq\n"+ - "eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe\n"+ - "r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5\n"+ - "3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd\n"+ - "vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l\n"+ - "mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC\n"+ - "wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg\n"+ - "hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0\n"+ - "TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh\n"+ - "biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg\n"+ - "ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg\n"+ - "dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6\n"+ - "b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl\n"+ - "c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0\n"+ - "ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3\n"+ - "dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu\n"+ - "ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh\n"+ - "bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo\n"+ - "ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3\n"+ - "Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u\n"+ - "ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA\n"+ - "A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ\n"+ - "MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+\n"+ - "NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR\n"+ - "VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY\n"+ - "83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3\n"+ - "macqaJVmlaut74nLYKkGEsaUR+ko\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("NetLock Notary (Class A) Root", - // X500 Subject, for lookups. - "MIGvMQswCQYDVQQGEwJIVTEQMA4GA1UECBMHSHVuZ2FyeTERMA8GA1UEBxMIQnVkYXBlc3QxJzAl"+ - "BgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZh"+ - "bnlraWFkb2sxNjA0BgNVBAMTLU5ldExvY2sgS296amVneXpvaSAoQ2xhc3MgQSkgVGFudXNpdHZh"+ - "bnlraWFkbw==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV\n"+ - "MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe\n"+ - "TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0\n"+ - "dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB\n"+ - "KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0\n"+ - "N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC\n"+ - "dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu\n"+ - "MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL\n"+ - "b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG\n"+ - "9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD\n"+ - "zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi\n"+ - "3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8\n"+ - "WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY\n"+ - "Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi\n"+ - "NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC\n"+ - "ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4\n"+ - "QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0\n"+ - "YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz\n"+ - "aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu\n"+ - "IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm\n"+ - "ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg\n"+ - "ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs\n"+ - "amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv\n"+ - "IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3\n"+ - "Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6\n"+ - "ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1\n"+ - "YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg\n"+ - "dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs\n"+ - "b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G\n"+ - "CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO\n"+ - "xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP\n"+ - "0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ\n"+ - "QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk\n"+ - "f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK\n"+ - "8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("NetLock Business (Class B) Root", - // X500 Subject, for lookups. - "MIGZMQswCQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFs"+ - "b3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMT"+ - "KU5ldExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRv", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx\n"+ - "ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0\n"+ - "b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD\n"+ - "EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05\n"+ - "OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G\n"+ - "A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh\n"+ - "Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l\n"+ - "dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG\n"+ - "SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK\n"+ - "gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX\n"+ - "iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc\n"+ - "Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E\n"+ - "BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G\n"+ - "SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu\n"+ - "b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh\n"+ - "bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv\n"+ - "Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln\n"+ - "aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0\n"+ - "IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh\n"+ - "c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph\n"+ - "biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo\n"+ - "ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP\n"+ - "UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj\n"+ - "YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo\n"+ - "dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA\n"+ - "bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06\n"+ - "sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa\n"+ - "n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS\n"+ - "NitjrFgBazMpUIaD8QFI\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("NetLock Express (Class C) Root", - // X500 Subject, for lookups. - "MIGbMQswCQYDVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFs"+ - "b3phdGJpenRvbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxNDAyBgNVBAMT"+ - "K05ldExvY2sgRXhwcmVzc3ogKENsYXNzIEMpIFRhbnVzaXR2YW55a2lhZG8=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx\n"+ - "ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0\n"+ - "b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD\n"+ - "EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X\n"+ - "DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw\n"+ - "DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u\n"+ - "c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr\n"+ - "TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN\n"+ - "BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA\n"+ - "OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC\n"+ - "2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW\n"+ - "RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P\n"+ - "AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW\n"+ - "ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0\n"+ - "YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz\n"+ - "b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO\n"+ - "ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB\n"+ - "IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs\n"+ - "b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs\n"+ - "ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s\n"+ - "YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg\n"+ - "a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g\n"+ - "SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0\n"+ - "aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg\n"+ - "YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg\n"+ - "Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY\n"+ - "ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g\n"+ - "pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4\n"+ - "Fp1hBWeAyNDYpQcCNJgEjTME1A==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("XRamp Global CA Root", - // X500 Subject, for lookups. - "MIGCMQswCQYDVQQGEwJVUzEeMBwGA1UECxMVd3d3LnhyYW1wc2VjdXJpdHkuY29tMSQwIgYDVQQK"+ - "ExtYUmFtcCBTZWN1cml0eSBTZXJ2aWNlcyBJbmMxLTArBgNVBAMTJFhSYW1wIEdsb2JhbCBDZXJ0"+ - "aWZpY2F0aW9uIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB\n"+ - "gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk\n"+ - "MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY\n"+ - "UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx\n"+ - "NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3\n"+ - "dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy\n"+ - "dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\n"+ - "dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6\n"+ - "38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP\n"+ - "KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q\n"+ - "DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4\n"+ - "qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa\n"+ - "JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi\n"+ - "PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P\n"+ - "BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs\n"+ - "jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0\n"+ - "eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD\n"+ - "ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR\n"+ - "vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\n"+ - "qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa\n"+ - "IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy\n"+ - "i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ\n"+ - "O+7ETPTsJ3xCwnR8gooJybQDJbw=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Go Daddy Class 2 CA", - // X500 Subject, for lookups. - "MGMxCzAJBgNVBAYTAlVTMSEwHwYDVQQKExhUaGUgR28gRGFkZHkgR3JvdXAsIEluYy4xMTAvBgNV"+ - "BAsTKEdvIERhZGR5IENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHk=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh\n"+ - "MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE\n"+ - "YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3\n"+ - "MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo\n"+ - "ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg\n"+ - "MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\n"+ - "ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA\n"+ - "PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w\n"+ - "wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi\n"+ - "EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY\n"+ - "avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+\n"+ - "YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE\n"+ - "sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h\n"+ - "/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5\n"+ - "IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj\n"+ - "YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD\n"+ - "ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy\n"+ - "OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P\n"+ - "TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\n"+ - "HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER\n"+ - "dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf\n"+ - "ReYNnyicsbkqWletNw+vHX/bvZ8=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Starfield Class 2 CA", - // X500 Subject, for lookups. - "MGgxCzAJBgNVBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw"+ - "MAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\n"+ - "MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\n"+ - "U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\n"+ - "NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\n"+ - "ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\n"+ - "ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\n"+ - "DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\n"+ - "8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\n"+ - "+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\n"+ - "X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\n"+ - "K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\n"+ - "1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\n"+ - "A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\n"+ - "zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\n"+ - "YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\n"+ - "bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\n"+ - "DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\n"+ - "L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\n"+ - "eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\n"+ - "xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\n"+ - "VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\n"+ - "WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("StartCom Ltd.", - // X500 Subject, for lookups. - "MIGwMQswCQYDVQQGEwJJTDEPMA0GA1UECBMGSXNyYWVsMQ4wDAYDVQQHEwVFaWxhdDEWMBQGA1UE"+ - "ChMNU3RhcnRDb20gTHRkLjEaMBgGA1UECxMRQ0EgQXV0aG9yaXR5IERlcC4xKTAnBgNVBAMTIEZy"+ - "ZWUgU1NMIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJhZG1pbkBzdGFy"+ - "dGNvbS5vcmc=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx\n"+ - "DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0\n"+ - "Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG\n"+ - "cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS\n"+ - "YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0\n"+ - "OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp\n"+ - "bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp\n"+ - "dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\n"+ - "dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG\n"+ - "9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x\n"+ - "18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5\n"+ - "yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI\n"+ - "LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G\n"+ - "A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW\n"+ - "zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT\n"+ - "BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x\n"+ - "GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD\n"+ - "ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh\n"+ - "cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV\n"+ - "HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G\n"+ - "CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy\n"+ - "BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j\n"+ - "cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ\n"+ - "YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/\n"+ - "YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1\n"+ - "ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p\n"+ - "00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb\n"+ - "cCOxgN8aIDjnfg==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("StartCom Certification Authority", - // X500 Subject, for lookups. - "MH0xCzAJBgNVBAYTAklMMRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMSswKQYDVQQLEyJTZWN1cmUg"+ - "RGlnaXRhbCBDZXJ0aWZpY2F0ZSBTaWduaW5nMSkwJwYDVQQDEyBTdGFydENvbSBDZXJ0aWZpY2F0"+ - "aW9uIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW\n"+ - "MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg\n"+ - "Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh\n"+ - "dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9\n"+ - "MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi\n"+ - "U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh\n"+ - "cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\n"+ - "A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk\n"+ - "pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf\n"+ - "OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C\n"+ - "Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT\n"+ - "Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi\n"+ - "HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM\n"+ - "Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w\n"+ - "+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+\n"+ - "Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3\n"+ - "Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B\n"+ - "26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID\n"+ - "AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\n"+ - "FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j\n"+ - "ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js\n"+ - "LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM\n"+ - "BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0\n"+ - "Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy\n"+ - "dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh\n"+ - "cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh\n"+ - "YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg\n"+ - "dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp\n"+ - "bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ\n"+ - "YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT\n"+ - "TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ\n"+ - "9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8\n"+ - "jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW\n"+ - "FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz\n"+ - "ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1\n"+ - "ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L\n"+ - "EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu\n"+ - "L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\n"+ - "yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC\n"+ - "O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V\n"+ - "um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh\n"+ - "NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Taiwan GRCA", - // X500 Subject, for lookups. - "MD8xCzAJBgNVBAYTAlRXMTAwLgYDVQQKDCdHb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBB"+ - "dXRob3JpdHk=", - "-----BEGIN CERTIFICATE-----\n"+ - "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\n"+ - "pYYsfPQS\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Firmaprofesional Root CA", - // X500 Subject, for lookups. - "MIGdMQswCQYDVQQGEwJFUzEiMCAGA1UEBxMZQy8gTXVudGFuZXIgMjQ0IEJhcmNlbG9uYTFCMEAG"+ - "A1UEAxM5QXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYy"+ - "NjM0MDY4MSYwJAYJKoZIhvcNAQkBFhdjYUBmaXJtYXByb2Zlc2lvbmFsLmNvbQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx\n"+ - "IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1\n"+ - "dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\n"+ - "MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w\n"+ - "HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx\n"+ - "IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1\n"+ - "dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\n"+ - "MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w\n"+ - "ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u\n"+ - "Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY\n"+ - "rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z\n"+ - "hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay\n"+ - "BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL\n"+ - "iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb\n"+ - "AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv\n"+ - "bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0\n"+ - "MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E\n"+ - "FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n\n"+ - "VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq\n"+ - "u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m\n"+ - "hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl\n"+ - "ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp\n"+ - "QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5\n"+ - "quGnM/b9Sh/22WA=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Wells Fargo Root CA", - // X500 Subject, for lookups. - "MIGCMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLV2VsbHMgRmFyZ28xLDAqBgNVBAsTI1dlbGxzIEZh"+ - "cmdvIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS8wLQYDVQQDEyZXZWxscyBGYXJnbyBSb290IENl"+ - "cnRpZmljYXRlIEF1dGhvcml0eQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC\n"+ - "VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD\n"+ - "ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v\n"+ - "dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0\n"+ - "MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww\n"+ - "KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G\n"+ - "A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi\n"+ - "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13\n"+ - "5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE\n"+ - "SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O\n"+ - "JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu\n"+ - "ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE\n"+ - "AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB\n"+ - "AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB\n"+ - "CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw\n"+ - "b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo\n"+ - "7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/\n"+ - "0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7\n"+ - "nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx\n"+ - "x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ\n"+ - "33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Swisscom Root CA 1", - // X500 Subject, for lookups. - "MGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0"+ - "aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAx", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk\n"+ - "MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0\n"+ - "YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg\n"+ - "Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT\n"+ - "AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp\n"+ - "Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN\n"+ - "BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9\n"+ - "m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih\n"+ - "FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/\n"+ - "TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F\n"+ - "EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco\n"+ - "kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu\n"+ - "HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF\n"+ - "vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo\n"+ - "19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC\n"+ - "L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW\n"+ - "bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX\n"+ - "JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw\n"+ - "FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j\n"+ - "BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc\n"+ - "K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf\n"+ - "ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik\n"+ - "Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB\n"+ - "sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e\n"+ - "3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR\n"+ - "ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip\n"+ - "mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH\n"+ - "b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf\n"+ - "rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms\n"+ - "hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y\n"+ - "zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6\n"+ - "MBr1mmz0DlP5OlvRHA==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("DigiCert Assured ID Root CA", - // X500 Subject, for lookups. - "MGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp"+ - "Y2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQQ==", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl\n"+ - "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"+ - "d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv\n"+ - "b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG\n"+ - "EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl\n"+ - "cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi\n"+ - "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c\n"+ - "JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP\n"+ - "mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+\n"+ - "wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4\n"+ - "VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/\n"+ - "AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB\n"+ - "AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\n"+ - "BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun\n"+ - "pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC\n"+ - "dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf\n"+ - "fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm\n"+ - "NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx\n"+ - "H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n"+ - "+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("DigiCert Global Root CA", - // X500 Subject, for lookups. - "MGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp"+ - "Y2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENB", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n"+ - "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"+ - "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n"+ - "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n"+ - "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"+ - "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n"+ - "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n"+ - "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n"+ - "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n"+ - "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n"+ - "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n"+ - "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n"+ - "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n"+ - "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n"+ - "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n"+ - "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n"+ - "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n"+ - "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n"+ - "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n"+ - "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("DigiCert High Assurance EV Root CA", - // X500 Subject, for lookups. - "MGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp"+ - "Y2VydC5jb20xKzApBgNVBAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0E=", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\n"+ - "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"+ - "d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\n"+ - "ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\n"+ - "MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\n"+ - "LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\n"+ - "RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n"+ - "+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\n"+ - "PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\n"+ - "xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\n"+ - "Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\n"+ - "hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\n"+ - "EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\n"+ - "MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\n"+ - "FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\n"+ - "nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\n"+ - "eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\n"+ - "hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\n"+ - "Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\n"+ - "vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n"+ - "+OkuE6N36B9K\n"+ - "-----END CERTIFICATE-----"); - super.addPEMCertificate("Certplus Class 2 Primary CA", - // X500 Subject, for lookups. - "MD0xCzAJBgNVBAYTAkZSMREwDwYDVQQKEwhDZXJ0cGx1czEbMBkGA1UEAxMSQ2xhc3MgMiBQcmlt"+ - "YXJ5IENB", - "-----BEGIN CERTIFICATE-----\n"+ - "MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw\n"+ - "PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz\n"+ - "cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9\n"+ - "MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz\n"+ - "IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ\n"+ - "ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR\n"+ - "VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL\n"+ - "kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd\n"+ - "EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas\n"+ - "H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0\n"+ - "HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud\n"+ - "DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4\n"+ - "QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu\n"+ - "Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/\n"+ - "AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8\n"+ - "yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR\n"+ - "FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA\n"+ - "ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB\n"+ - "kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\n"+ - "l7+ijrRU\n"+ - "-----END CERTIFICATE-----"); - } - override public function addPEMCertificate(name:String,subject:String,pem:String):void { - throw new Error("Cannot add certificates to the Root CA store."); - } - override public function addCertificate(cert:X509Certificate):void { - throw new Error("Cannot add certificates to the Root CA store."); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509Certificate.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509Certificate.as deleted file mode 100755 index db4ea1c42e..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509Certificate.as +++ /dev/null @@ -1,218 +0,0 @@ -/** - * X509Certificate - * - * A representation for a X509 Certificate, with - * methods to parse, verify and sign it. - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.cert { - import com.hurlant.crypto.hash.IHash; - import com.hurlant.crypto.hash.MD2; - import com.hurlant.crypto.hash.MD5; - import com.hurlant.crypto.hash.SHA1; - import com.hurlant.crypto.rsa.RSAKey; - import com.hurlant.util.ArrayUtil; - import com.hurlant.util.Base64; - import com.hurlant.util.der.ByteString; - import com.hurlant.util.der.DER; - import com.hurlant.util.der.OID; - import com.hurlant.util.der.ObjectIdentifier; - import com.hurlant.util.der.PEM; - import com.hurlant.util.der.PrintableString; - import com.hurlant.util.der.Sequence; - import com.hurlant.util.der.Type; - - import flash.utils.ByteArray; - - public class X509Certificate { - private var _loaded:Boolean; - private var _param:*; - private var _obj:Object; - public function X509Certificate(p:*) { - _loaded = false; - _param = p; - // lazy initialization, to avoid unnecessary parsing of every builtin CA at start-up. - } - private function load():void { - if (_loaded) return; - var p:* = _param; - var b:ByteArray; - if (p is String) { - b = PEM.readCertIntoArray(p as String); - } else if (p is ByteArray) { - b = p; - } - if (b!=null) { - _obj = DER.parse(b, Type.TLS_CERT); - _loaded = true; - } else { - throw new Error("Invalid x509 Certificate parameter: "+p); - } - } - public function isSigned(store:X509CertificateCollection, CAs:X509CertificateCollection, time:Date=null):Boolean { - load(); - // check timestamps first. cheapest. - if (time==null) { - time = new Date; - } - var notBefore:Date = getNotBefore(); - var notAfter:Date = getNotAfter(); - if (time.getTime()notAfter.getTime()) return false; // cert died of old age. - // check signature. - var subject:String = getIssuerPrincipal(); - // try from CA first, since they're treated better. - var parent:X509Certificate = CAs.getCertificate(subject); - var parentIsAuthoritative:Boolean = false; - if (parent == null) { - parent = store.getCertificate(subject); - if (parent == null) { - return false; // issuer not found - } - } else { - parentIsAuthoritative = true; - } - if (parent == this) { // pathological case. avoid infinite loop - return false; // isSigned() returns false if we're self-signed. - } - if (!(parentIsAuthoritative&&parent.isSelfSigned(time)) && - !parent.isSigned(store, CAs, time)) { - return false; - } - var key:RSAKey = parent.getPublicKey(); - return verifyCertificate(key); - } - public function isSelfSigned(time:Date):Boolean { - load(); - - var key:RSAKey = getPublicKey(); - return verifyCertificate(key); - } - private function verifyCertificate(key:RSAKey):Boolean { - var algo:String = getAlgorithmIdentifier(); - var hash:IHash; - var oid:String; - switch (algo) { - case OID.SHA1_WITH_RSA_ENCRYPTION: - hash = new SHA1; - oid = OID.SHA1_ALGORITHM; - break; - case OID.MD2_WITH_RSA_ENCRYPTION: - hash = new MD2; - oid = OID.MD2_ALGORITHM; - break; - case OID.MD5_WITH_RSA_ENCRYPTION: - hash = new MD5; - oid = OID.MD5_ALGORITHM; - break; - default: - return false; - } - var data:ByteArray = _obj.signedCertificate_bin; - var buf:ByteArray = new ByteArray; - key.verify(_obj.encrypted, buf, _obj.encrypted.length); - buf.position=0; - data = hash.hash(data); - var obj:Object = DER.parse(buf, Type.RSA_SIGNATURE); - if (obj.algorithm.algorithmId.toString() != oid) { - return false; // wrong algorithm - } - if (!ArrayUtil.equals(obj.hash, data)) { - return false; // hashes don't match - } - return true; - } - - /** - * This isn't used anywhere so far. - * It would become useful if we started to offer facilities - * to generate and sign X509 certificates. - * - * @param key - * @param algo - * @return - * - */ - private function signCertificate(key:RSAKey, algo:String):ByteArray { - var hash:IHash; - var oid:String; - switch (algo) { - case OID.SHA1_WITH_RSA_ENCRYPTION: - hash = new SHA1; - oid = OID.SHA1_ALGORITHM; - break; - case OID.MD2_WITH_RSA_ENCRYPTION: - hash = new MD2; - oid = OID.MD2_ALGORITHM; - break; - case OID.MD5_WITH_RSA_ENCRYPTION: - hash = new MD5; - oid = OID.MD5_ALGORITHM; - break; - default: - return null - } - var data:ByteArray = _obj.signedCertificate_bin; - data = hash.hash(data); - var seq1:Sequence = new Sequence; - seq1[0] = new Sequence; - seq1[0][0] = new ObjectIdentifier(0,0, oid); - seq1[0][1] = null; - seq1[1] = new ByteString; - seq1[1].writeBytes(data); - data = seq1.toDER(); - var buf:ByteArray = new ByteArray; - key.sign(data, buf, data.length); - return buf; - } - - public function getPublicKey():RSAKey { - load(); - var pk:ByteArray = _obj.signedCertificate.subjectPublicKeyInfo.subjectPublicKey as ByteArray; - pk.position = 0; - var rsaKey:Object = DER.parse(pk, [{name:"N"},{name:"E"}]); - return new RSAKey(rsaKey.N, rsaKey.E.valueOf()); - } - - /** - * Returns a subject principal, as an opaque base64 string. - * This is only used as a hash key for known certificates. - * - * Note that this assumes X509 DER-encoded certificates are uniquely encoded, - * as we look for exact matches between Issuer and Subject fields. - * - */ - public function getSubjectPrincipal():String { - load(); - return Base64.encodeByteArray(_obj.signedCertificate.subject_bin); - } - /** - * Returns an issuer principal, as an opaque base64 string. - * This is only used to quickly find matching parent certificates. - * - * Note that this assumes X509 DER-encoded certificates are uniquely encoded, - * as we look for exact matches between Issuer and Subject fields. - * - */ - public function getIssuerPrincipal():String { - load(); - return Base64.encodeByteArray(_obj.signedCertificate.issuer_bin); - } - public function getAlgorithmIdentifier():String { - return _obj.algorithmIdentifier.algorithmId.toString(); - } - public function getNotBefore():Date { - return _obj.signedCertificate.validity.notBefore.date; - } - public function getNotAfter():Date { - return _obj.signedCertificate.validity.notAfter.date; - } - - public function getCommonName():String { - var subject:Sequence = _obj.signedCertificate.subject; - return (subject.findAttributeValue(OID.COMMON_NAME) as PrintableString).getString(); - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509CertificateCollection.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509CertificateCollection.as deleted file mode 100755 index db11e40937..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/cert/X509CertificateCollection.as +++ /dev/null @@ -1,57 +0,0 @@ -/** - * X509CertificateCollection - * - * A class to store and index X509 Certificates by Subject. - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.cert { - - public class X509CertificateCollection { - - private var _map:Object; - - public function X509CertificateCollection() { - _map = {}; - } - - /** - * Mostly meant for built-in CA loading. - * This entry-point allows to index CAs without parsing them. - * - * @param name A friendly name. not currently used - * @param subject base64 DER encoded Subject principal for the Cert - * @param pem PEM encoded certificate data - * - */ - public function addPEMCertificate(name:String, subject:String, pem:String):void { - _map[subject] = new X509Certificate(pem); - } - - /** - * Adds a X509 certificate to the collection. - * This call will force the certificate to be parsed. - * - * @param cert A X509 certificate - * - */ - public function addCertificate(cert:X509Certificate):void { - var subject:String = cert.getSubjectPrincipal(); - _map[subject] = cert; - } - - /** - * Returns a X509 Certificate present in the collection, given - * a base64 DER encoded X500 Subject principal - * - * @param subject A Base64 DER-encoded Subject principal - * @return A matching certificate, or null. - * - */ - public function getCertificate(subject:String):X509Certificate { - return _map[subject]; - } - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/HMAC.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/HMAC.as deleted file mode 100644 index 8215afcfc8..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/HMAC.as +++ /dev/null @@ -1,82 +0,0 @@ -/** - * HMAC - * - * An ActionScript 3 implementation of HMAC, Keyed-Hashing for Message - * Authentication, as defined by RFC-2104 - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - import flash.utils.ByteArray; - import com.hurlant.util.Hex; - - public class HMAC implements IHMAC - { - private var hash:IHash; - private var bits:uint; - - /** - * Create a HMAC object, using a Hash function, and - * optionally a number of bits to return. - * The HMAC will be truncated to that size if needed. - */ - public function HMAC(hash:IHash, bits:uint=0) { - this.hash = hash; - this.bits = bits; - } - - - public function getHashSize():uint { - if (bits!=0) { - return bits/8; - } else { - return hash.getHashSize(); - } - } - - /** - * Compute a HMAC using a key and some data. - * It doesn't modify either, and returns a new ByteArray with the HMAC value. - */ - public function compute(key:ByteArray, data:ByteArray):ByteArray { - var hashKey:ByteArray; - if (key.length>hash.getInputSize()) { - hashKey = hash.hash(key); - } else { - hashKey = new ByteArray; - hashKey.writeBytes(key); - } - while (hashKey.length0 && bits<8*outerHash.length) { - outerHash.length = bits/8; - } - return outerHash; - } - public function dispose():void { - hash = null; - bits = 0; - } - public function toString():String { - return "hmac-"+(bits>0?bits+"-":"")+hash.toString(); - } - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHMAC.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHMAC.as deleted file mode 100755 index f0ee06394d..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHMAC.as +++ /dev/null @@ -1,27 +0,0 @@ -/** - * HMAC - * - * An ActionScript 3 interface for HMAC & MAC - * implementations. - * - * Loosely copyrighted by Bobby Parker - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - import flash.utils.ByteArray; - - public interface IHMAC - { - function getHashSize():uint; - /** - * Compute a HMAC using a key and some data. - * It doesn't modify either, and returns a new ByteArray with the HMAC value. - */ - function compute(key:ByteArray, data:ByteArray):ByteArray; - function dispose():void; - function toString():String; - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHash.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHash.as deleted file mode 100644 index 32c5321a9f..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/IHash.as +++ /dev/null @@ -1,21 +0,0 @@ -/** - * IHash - * - * An interface for each hash function to implement - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - import flash.utils.ByteArray; - - public interface IHash - { - function getInputSize():uint; - function getHashSize():uint; - function hash(src:ByteArray):ByteArray; - function toString():String; - function getPadSize():int; - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MAC.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MAC.as deleted file mode 100755 index 0815d6c58f..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MAC.as +++ /dev/null @@ -1,137 +0,0 @@ -/** - * MAC - * - * An ActionScript 3 implementation of MAC, Message Authentication Code - * for use with SSL 3.0. - * Loosely copyrighted by Bobby Parker. - * As3crypto copyrighted by Henri Torgemane. - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - import flash.utils.ByteArray; - import com.hurlant.util.Hex; - - public class MAC implements IHMAC - { - private var hash:IHash; - private var bits:uint; - private var pad_1:ByteArray; - private var pad_2:ByteArray; - private var innerHash:ByteArray; - private var outerHash:ByteArray; - private var outerKey:ByteArray; - private var innerKey:ByteArray; - /** - * Create a MAC object (for SSL 3.0 ) and - * optionally a number of bits to return. - * The MAC will be truncated to that size if needed. - */ - public function MAC(hash:IHash, bits:uint=0) { - this.hash = hash; - this.bits = bits; - innerHash = new ByteArray(); - outerHash = new ByteArray(); - innerKey = new ByteArray(); - outerKey = new ByteArray(); - - - if (hash != null) { - var pad_size:int = hash.getPadSize(); - pad_1 = new ByteArray(); - pad_2 = new ByteArray(); - - for (var x:int = 0; x < pad_size; x++) { - pad_1.writeByte(0x36); - pad_2.writeByte(0x5c); - } - } - } - - public function setPadSize(pad_size:int) : void { } - - public function getHashSize():uint { - if (bits!=0) { - return bits/8; - } else { - return hash.getHashSize(); - } - } - - - /** - * Compute a MAC using a key and some data. - * - */ - public function compute(key:ByteArray, data:ByteArray):ByteArray { - // take that incoming key and do hash(key + pad_2 + hash(key + pad_1 + sequence + length + record) - // note that data = (sequence + type + length + record) - - if (pad_1 == null) { - var pad_size:int = hash.getPadSize(); - pad_1 = new ByteArray(); - pad_2 = new ByteArray(); - - for (var x:int = 0; x < pad_size; x++) { - pad_1.writeByte(0x36); - pad_2.writeByte(0x5c); - } - } - - // Do some preliminary checking on stuff - /* - if (key.length > hash.getInputSize()) { - hashKey = hash.hash(key); - } else { - hashKey = new ByteArray; - hashKey.writeBytes(key); - } - - while (hashKey.length < hash.getInputSize() ) { - hashKey[hashKey.length] = 0; - } */ - // Henri's conventions work just fine here.. - - innerKey.length = 0; - outerKey.length = 0; - // trace("MAC Key: " + Hex.fromArray(key)); - // trace("Key Length: " + key.length); - // trace("Pad_1 : " + Hex.fromArray(pad_1)); - // inner hash calc - innerKey.writeBytes(key); - innerKey.writeBytes(pad_1); - innerKey.writeBytes(data); - // trace("MAC Inner Key: " + Hex.fromArray(innerKey)); - - innerHash = hash.hash(innerKey); - // trace("MAC Inner Hash: " + Hex.fromArray(innerHash)); - - // outer hash calc - outerKey.writeBytes(key); - outerKey.writeBytes(pad_2); - outerKey.writeBytes(innerHash); - - // trace("MAC Outer Key: " + Hex.fromArray(outerKey)); - outerHash = hash.hash(outerKey); - - - if (bits > 0 && bits < 8*outerHash.length) { - outerHash.length = bits/8; - } - - // trace("MAC for record: " + Hex.fromArray(outerHash)); - return outerHash; - - } - - public function dispose():void { - hash = null; - bits = 0; - } - public function toString():String { - return "mac-"+(bits>0?bits+"-":"")+hash.toString(); - } - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MD2.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MD2.as deleted file mode 100644 index e104f0dd16..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/MD2.as +++ /dev/null @@ -1,124 +0,0 @@ -/** - * MD2 - * - * An ActionScript 3 implementation of the RSA Data Security, Inc MD2 Message - * Digest Algorithm, as defined in RFC 1319 - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - * - * Excerpt from http://en.wikipedia.org/wiki/MD2: - * > - * > Rogier and Chauvaud (1997) described collisions of MD2's compression function, - * > although they were unable to extend the attack to the full MD2. - * > - * > In 2004, MD2 was shown to be vulnerable to a preimage attack with time - * > complexity equivalent to 2104 applications of the compression function - * > (Muller, 2004). - * > The author concludes, "MD2 can no longer be considered a secure one-way - * > hash function". - * - * also, this implementaton is quite slow. - */ - -package com.hurlant.crypto.hash -{ - import flash.utils.ByteArray; - - public class MD2 implements IHash - { - public static const HASH_SIZE:int = 16; - public var pad_size:int = 48; // probably will never get used, only here for SSL 3.0 support - - private static const S:Array = [ // PI Digits - 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 19, - 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 76, 130, 202, - 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, 138, 23, 229, 18, -190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 245, 142, 187, 47, 238, 122, -169, 104, 121, 145, 21, 178, 7, 63, 148, 194, 16, 137, 11, 34, 95, 33, -128, 127, 93, 154, 90, 144, 50, 39, 53, 62, 204, 231, 191, 247, 151, 3, -255, 25, 48, 179, 72, 165, 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, - 79, 184, 56, 210, 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, - 69, 157, 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, - 27, 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, - 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, 234, 38, - 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, 129, 77, 82, -106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, 8, 12, 189, 177, 74, -120, 136, 149, 139, 227, 99, 232, 109, 233, 203, 213, 254, 59, 0, 29, 57, -242, 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10, - 49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 ]; - - - public function MD2() { } - - public function getInputSize():uint - { - return 16; - } - - public function getPadSize():int { - return pad_size; - } - - public function getHashSize():uint - { - return HASH_SIZE; - } - - public function hash(src:ByteArray):ByteArray - { - var savedLength:uint = src.length; - - // 3.1 Step 1. Padding - var i:uint = (16-src.length%16) || 16; - do { - src[src.length]=i; - } while (src.length%16!=0); - - // 3.2 Step 2. Checksum - var len:uint = src.length; - var checksum:ByteArray = new ByteArray; - var L:uint = 0; - for (i = 0;i> 5] |= 0x80 << ((len) % 32); - x[(((len + 64) >>> 9) << 4) + 14] = len; - - var a:uint = 0x67452301; // 1732584193; - var b:uint = 0xEFCDAB89; //-271733879; - var c:uint = 0x98BADCFE; //-1732584194; - var d:uint = 0x10325476; // 271733878; - - for(var i:uint = 0; i < x.length; i += 16) - { - x[i]||=0; x[i+1]||=0; x[i+2]||=0; x[i+3]||=0; - x[i+4]||=0; x[i+5]||=0; x[i+6]||=0; x[i+7]||=0; - x[i+8]||=0; x[i+9]||=0; x[i+10]||=0; x[i+11]||=0; - x[i+12]||=0; x[i+13]||=0; x[i+14]||=0; x[i+15]||=0; - - var olda:uint = a; - var oldb:uint = b; - var oldc:uint = c; - var oldd:uint = d; - - a = ff(a, b, c, d, x[i+ 0], 7 , 0xD76AA478); - d = ff(d, a, b, c, x[i+ 1], 12, 0xE8C7B756); - c = ff(c, d, a, b, x[i+ 2], 17, 0x242070DB); - b = ff(b, c, d, a, x[i+ 3], 22, 0xC1BDCEEE); - a = ff(a, b, c, d, x[i+ 4], 7 , 0xF57C0FAF); - d = ff(d, a, b, c, x[i+ 5], 12, 0x4787C62A); - c = ff(c, d, a, b, x[i+ 6], 17, 0xA8304613); - b = ff(b, c, d, a, x[i+ 7], 22, 0xFD469501); - a = ff(a, b, c, d, x[i+ 8], 7 , 0x698098D8); - d = ff(d, a, b, c, x[i+ 9], 12, 0x8B44F7AF); - c = ff(c, d, a, b, x[i+10], 17, 0xFFFF5BB1); - b = ff(b, c, d, a, x[i+11], 22, 0x895CD7BE); - a = ff(a, b, c, d, x[i+12], 7 , 0x6B901122); - d = ff(d, a, b, c, x[i+13], 12, 0xFD987193); - c = ff(c, d, a, b, x[i+14], 17, 0xA679438E); - b = ff(b, c, d, a, x[i+15], 22, 0x49B40821); - - a = gg(a, b, c, d, x[i+ 1], 5 , 0xf61e2562); - d = gg(d, a, b, c, x[i+ 6], 9 , 0xc040b340); - c = gg(c, d, a, b, x[i+11], 14, 0x265e5a51); - b = gg(b, c, d, a, x[i+ 0], 20, 0xe9b6c7aa); - a = gg(a, b, c, d, x[i+ 5], 5 , 0xd62f105d); - d = gg(d, a, b, c, x[i+10], 9 , 0x2441453); - c = gg(c, d, a, b, x[i+15], 14, 0xd8a1e681); - b = gg(b, c, d, a, x[i+ 4], 20, 0xe7d3fbc8); - a = gg(a, b, c, d, x[i+ 9], 5 , 0x21e1cde6); - d = gg(d, a, b, c, x[i+14], 9 , 0xc33707d6); - c = gg(c, d, a, b, x[i+ 3], 14, 0xf4d50d87); - b = gg(b, c, d, a, x[i+ 8], 20, 0x455a14ed); - a = gg(a, b, c, d, x[i+13], 5 , 0xa9e3e905); - d = gg(d, a, b, c, x[i+ 2], 9 , 0xfcefa3f8); - c = gg(c, d, a, b, x[i+ 7], 14, 0x676f02d9); - b = gg(b, c, d, a, x[i+12], 20, 0x8d2a4c8a); - - a = hh(a, b, c, d, x[i+ 5], 4 , 0xfffa3942); - d = hh(d, a, b, c, x[i+ 8], 11, 0x8771f681); - c = hh(c, d, a, b, x[i+11], 16, 0x6d9d6122); - b = hh(b, c, d, a, x[i+14], 23, 0xfde5380c); - a = hh(a, b, c, d, x[i+ 1], 4 , 0xa4beea44); - d = hh(d, a, b, c, x[i+ 4], 11, 0x4bdecfa9); - c = hh(c, d, a, b, x[i+ 7], 16, 0xf6bb4b60); - b = hh(b, c, d, a, x[i+10], 23, 0xbebfbc70); - a = hh(a, b, c, d, x[i+13], 4 , 0x289b7ec6); - d = hh(d, a, b, c, x[i+ 0], 11, 0xeaa127fa); - c = hh(c, d, a, b, x[i+ 3], 16, 0xd4ef3085); - b = hh(b, c, d, a, x[i+ 6], 23, 0x4881d05); - a = hh(a, b, c, d, x[i+ 9], 4 , 0xd9d4d039); - d = hh(d, a, b, c, x[i+12], 11, 0xe6db99e5); - c = hh(c, d, a, b, x[i+15], 16, 0x1fa27cf8); - b = hh(b, c, d, a, x[i+ 2], 23, 0xc4ac5665); - - a = ii(a, b, c, d, x[i+ 0], 6 , 0xf4292244); - d = ii(d, a, b, c, x[i+ 7], 10, 0x432aff97); - c = ii(c, d, a, b, x[i+14], 15, 0xab9423a7); - b = ii(b, c, d, a, x[i+ 5], 21, 0xfc93a039); - a = ii(a, b, c, d, x[i+12], 6 , 0x655b59c3); - d = ii(d, a, b, c, x[i+ 3], 10, 0x8f0ccc92); - c = ii(c, d, a, b, x[i+10], 15, 0xffeff47d); - b = ii(b, c, d, a, x[i+ 1], 21, 0x85845dd1); - a = ii(a, b, c, d, x[i+ 8], 6 , 0x6fa87e4f); - d = ii(d, a, b, c, x[i+15], 10, 0xfe2ce6e0); - c = ii(c, d, a, b, x[i+ 6], 15, 0xa3014314); - b = ii(b, c, d, a, x[i+13], 21, 0x4e0811a1); - a = ii(a, b, c, d, x[i+ 4], 6 , 0xf7537e82); - d = ii(d, a, b, c, x[i+11], 10, 0xbd3af235); - c = ii(c, d, a, b, x[i+ 2], 15, 0x2ad7d2bb); - b = ii(b, c, d, a, x[i+ 9], 21, 0xeb86d391); - - a += olda; - b += oldb; - c += oldc; - d += oldd; - - } - return [ a, b, c, d ]; - } - - /* - * Bitwise rotate a 32-bit number to the left. - */ - private function rol(num:uint, cnt:uint):uint - { - return (num << cnt) | (num >>> (32 - cnt)); - } - - /* - * These functions implement the four basic operations the algorithm uses. - */ - private function cmn(q:uint, a:uint, b:uint, x:uint, s:uint, t:uint):uint { - return rol(a + q + x + t, s) + b; - } - private function ff(a:uint, b:uint, c:uint, d:uint, x:uint, s:uint, t:uint):uint { - return cmn((b & c) | ((~b) & d), a, b, x, s, t); - } - private function gg(a:uint, b:uint, c:uint, d:uint, x:uint, s:uint, t:uint):uint { - return cmn((b & d) | (c & (~d)), a, b, x, s, t); - } - private function hh(a:uint, b:uint, c:uint, d:uint, x:uint, s:uint, t:uint):uint { - return cmn(b ^ c ^ d, a, b, x, s, t); - } - private function ii(a:uint, b:uint, c:uint, d:uint, x:uint, s:uint, t:uint):uint { - return cmn(c ^ (b | (~d)), a, b, x, s, t); - } - - public function toString():String { - return "md5"; - } - } -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA1.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA1.as deleted file mode 100644 index 5b186f3c93..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA1.as +++ /dev/null @@ -1,106 +0,0 @@ -/** - * SHA1 - * - * An ActionScript 3 implementation of Secure Hash Algorithm, SHA-1, as defined - * in FIPS PUB 180-1 - * Copyright (c) 2007 Henri Torgemane - * - * Derived from: - * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined - * in FIPS PUB 180-1 - * Version 2.1a Copyright Paul Johnston 2000 - 2002. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - - - public class SHA1 extends SHABase implements IHash - { - public static const HASH_SIZE:int = 20; - - public override function getHashSize():uint { - return HASH_SIZE; - } - - protected override function core(x:Array, len:uint):Array - { - /* append padding */ - x[len >> 5] |= 0x80 << (24 - len % 32); - x[((len + 64 >> 9) << 4) + 15] = len; - - var w:Array = []; - var a:uint = 0x67452301; //1732584193; - var b:uint = 0xEFCDAB89; //-271733879; - var c:uint = 0x98BADCFE; //-1732584194; - var d:uint = 0x10325476; //271733878; - var e:uint = 0xC3D2E1F0; //-1009589776; - - for(var i:uint = 0; i < x.length; i += 16) - { - - var olda:uint = a; - var oldb:uint = b; - var oldc:uint = c; - var oldd:uint = d; - var olde:uint = e; - - for(var j:uint = 0; j < 80; j++) - { - if (j < 16) { - w[j] = x[i + j] || 0; - } else { - w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); - } - var t:uint = rol(a,5) + ft(j,b,c,d) + e + w[j] + kt(j); - e = d; - d = c; - c = rol(b, 30); - b = a; - a = t; - } - a += olda; - b += oldb; - c += oldc; - d += oldd; - e += olde; - } - return [ a, b, c, d, e ]; - - } - - /* - * Bitwise rotate a 32-bit number to the left. - */ - private function rol(num:uint, cnt:uint):uint - { - return (num << cnt) | (num >>> (32 - cnt)); - } - - /* - * Perform the appropriate triplet combination function for the current - * iteration - */ - private function ft(t:uint, b:uint, c:uint, d:uint):uint - { - if(t < 20) return (b & c) | ((~b) & d); - if(t < 40) return b ^ c ^ d; - if(t < 60) return (b & c) | (b & d) | (c & d); - return b ^ c ^ d; - } - - /* - * Determine the appropriate additive constant for the current iteration - */ - private function kt(t:uint):uint - { - return (t < 20) ? 0x5A827999 : (t < 40) ? 0x6ED9EBA1 : - (t < 60) ? 0x8F1BBCDC : 0xCA62C1D6; - } - public override function toString():String { - return "sha1"; - } - } -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA224.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA224.as deleted file mode 100644 index 345aa3dfd0..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA224.as +++ /dev/null @@ -1,28 +0,0 @@ -/** - * SHA224 - * - * An ActionScript 3 implementation of Secure Hash Algorithm, SHA-224, as defined - * in FIPS PUB 180-2 - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - public class SHA224 extends SHA256 - { - function SHA224() { - h = [ - 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, - 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 - ]; - } - - public override function getHashSize():uint { - return 28; - } - public override function toString():String { - return "sha224"; - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA256.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA256.as deleted file mode 100644 index 67bdbb46ce..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHA256.as +++ /dev/null @@ -1,115 +0,0 @@ -/** - * SHA256 - * - * An ActionScript 3 implementation of Secure Hash Algorithm, SHA-256, as defined - * in FIPS PUB 180-2 - * Copyright (c) 2007 Henri Torgemane - * - * Derived from: - * A JavaScript implementation of the Secure Hash Standard - * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/ - * Derived from: - * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined - * in FIPS PUB 180-1 - * Version 2.1a Copyright Paul Johnston 2000 - 2002. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - - - public class SHA256 extends SHABase implements IHash - { - - protected static const k:Array = [ - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; - protected var h:Array = [ - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 - ]; - - public function SHA256(){ - } - - public override function getHashSize():uint - { - return 32; - } - - protected override function core(x:Array, len:uint):Array { - /* append padding */ - x[len >> 5] |= 0x80 << (24 - len % 32); - x[((len + 64 >> 9) << 4) + 15] = len; - - var w:Array = []; - var a:uint = h[0]; - var b:uint = h[1]; - var c:uint = h[2]; - var d:uint = h[3]; - var e:uint = h[4]; - var f:uint = h[5]; - var g:uint = h[6]; - var h:uint = h[7]; - - for (var i:uint=0; i>>3); - var s1:uint = rrol(w[j-2], 17)^rrol(w[j-2],19)^(w[j-2]>>>10); - w[j] = w[j-16] + s0 + w[j-7] + s1; - } - var t2:uint = (rrol(a,2) ^ rrol(a,13) ^ rrol(a,22)) + ((a&b) ^ (a&c) ^ (b&c)); - var t1:uint = h + (rrol(e,6) ^ rrol(e,11) ^ rrol(e,25)) + ((e&f)^(g&~e)) + k[j] + w[j] - h = g; - g = f; - f = e; - e = d + t1; - d = c; - c = b; - b = a; - a = t1 + t2; - - } - a += olda; - b += oldb; - c += oldc; - d += oldd; - e += olde; - f += oldf; - g += oldg; - h += oldh; - } - return [ a,b,c,d,e,f,g,h ]; - } - - /* - * Bitwise rotate a 32-bit number to the right. - */ - protected function rrol(num:uint, cnt:uint):uint { - return (num << (32-cnt)) | (num >>> cnt); - } - - public override function toString():String { - return "sha256"; - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHABase.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHABase.as deleted file mode 100644 index dc9bafea3a..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/hash/SHABase.as +++ /dev/null @@ -1,71 +0,0 @@ -/** - * SHABase - * - * An ActionScript 3 abstract class for the SHA family of hash functions - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.hash -{ - import flash.utils.ByteArray; - import flash.utils.Endian; - - public class SHABase implements IHash - { - - public function SHABase() { } - - public var pad_size:int = 40; - public function getInputSize():uint - { - return 64; - } - - public function getHashSize():uint - { - return 0; - } - - public function getPadSize():int - { - return pad_size; - } - - public function hash(src:ByteArray):ByteArray - { - var savedLength:uint = src.length; - var savedEndian:String = src.endian; - - src.endian = Endian.BIG_ENDIAN; - var len:uint = savedLength *8; - // pad to nearest int. - while (src.length%4!=0) { - src[src.length]=0; - } - // convert ByteArray to an array of uint - src.position=0; - var a:Array = []; - for (var i:uint=0;i>> 8; - pool[pptr++] = t&255; - } - pptr=0; - seed(); - } - - public function seed(x:int = 0):void { - if (x==0) { - x = new Date().getTime(); - } - pool[pptr++] ^= x & 255; - pool[pptr++] ^= (x>>8)&255; - pool[pptr++] ^= (x>>16)&255; - pool[pptr++] ^= (x>>24)&255; - pptr %= psize; - seeded = true; - } - - /** - * Gather anything we have that isn't entirely predictable: - * - memory used - * - system capabilities - * - timing stuff - * - installed fonts - */ - public function autoSeed():void { - var b:ByteArray = new ByteArray; - b.writeUnsignedInt(System.totalMemory); - b.writeUTF(Capabilities.serverString); - b.writeUnsignedInt(getTimer()); - b.writeUnsignedInt((new Date).getTime()); - var a:Array = Font.enumerateFonts(true); - for each (var f:Font in a) { - b.writeUTF(f.fontName); - b.writeUTF(f.fontStyle); - b.writeUTF(f.fontType); - } - b.position=0; - while (b.bytesAvailable>=4) { - seed(b.readUnsignedInt()); - } - } - - - public function nextBytes(buffer:ByteArray, length:int):void { - while (length--) { - buffer.writeByte(nextByte()); - } - } - public function nextByte():int { - if (!ready) { - if (!seeded) { - autoSeed(); - } - state.init(pool); - pool.length = 0; - pptr = 0; - ready = true; - } - return state.next(); - } - public function dispose():void { - for (var i:uint=0;i= src.length) { - src.position = 0; - } - var bl:uint = getBlockSize(); - var end:int = src.position + length; - while (src.position= src.length) { - src.position = 0; - } - var bl:uint = getBlockSize(); - var end:int = src.position + length; - while (src.position=p && n>11) { - out[--n] = src[i--]; - } - out[--n] = 0; - if (type==0x02) { // type 2 - var rng:Random = new Random; - var x:int = 0; - while (n>2) { - do { - x = rng.nextByte(); - } while (x==0); - out[--n] = x; - } - } else { // type 1 - while (n>2) { - out[--n] = 0xFF; - } - } - out[--n] = type; - out[--n] = 0; - return out; - } - - /** - * - * @param src - * @param n - * @param type Not used. - * @return - * - */ - private function pkcs1unpad(src:BigInteger, n:uint, type:uint = 0x02):ByteArray { - var b:ByteArray = src.toByteArray(); - var out:ByteArray = new ByteArray; - - b.position = 0; - var i:int = 0; - while (i>1; - var key:RSAKey = new RSAKey(null,0,null); - key.e = parseInt(E, 16); - var ee:BigInteger = new BigInteger(E,16, true); - for (;;) { - for (;;) { - key.p = bigRandom(B-qs, rng); - if (key.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE)==0 && - key.p.isProbablePrime(10)) break; - } - for (;;) { - key.q = bigRandom(qs, rng); - if (key.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE)==0 && - key.q.isProbablePrime(10)) break; - } - if (key.p.compareTo(key.q)<=0) { - var t:BigInteger = key.p; - key.p = key.q; - key.q = t; - } - var p1:BigInteger = key.p.subtract(BigInteger.ONE); - var q1:BigInteger = key.q.subtract(BigInteger.ONE); - var phi:BigInteger = p1.multiply(q1); - if (phi.gcd(ee).compareTo(BigInteger.ONE)==0) { - key.n = key.p.multiply(key.q); - key.d = ee.modInverse(phi); - key.dmp1 = key.d.mod(p1); - key.dmq1 = key.d.mod(q1); - key.coeff = key.q.modInverse(key.p); - break; - } - } - return key; - } - - protected static function bigRandom(bits:int, rnd:Random):BigInteger { - if (bits<2) return BigInteger.nbv(1); - var x:ByteArray = new ByteArray; - rnd.nextBytes(x, (bits>>3)); - x.position = 0; - var b:BigInteger = new BigInteger(x,0,true); - b.primify(bits, 1); - return b; - } - - protected function doPublic(x:BigInteger):BigInteger { - return x.modPowInt(e, n); - } - - protected function doPrivate2(x:BigInteger):BigInteger { - if (p==null && q==null) { - return x.modPow(d,n); - } - - var xp:BigInteger = x.mod(p).modPow(dmp1, p); - var xq:BigInteger = x.mod(q).modPow(dmq1, q); - - while (xp.compareTo(xq)<0) { - xp = xp.add(p); - } - var r:BigInteger = xp.subtract(xq).multiply(coeff).mod(p).multiply(q).add(xq); - - return r; - } - - protected function doPrivate(x:BigInteger):BigInteger { - if (p==null || q==null) { - return x.modPow(d, n); - } - // TODO: re-calculate any missing CRT params - var xp:BigInteger = x.mod(p).modPow(dmp1, p); - var xq:BigInteger = x.mod(q).modPow(dmq1, q); - - while (xp.compareTo(xq)<0) { - xp = xp.add(p); - } - return xp.subtract(xq).multiply(coeff).mod(p).multiply(q).add(xq); - } - - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/AESKey.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/AESKey.as deleted file mode 100644 index a2280b7bea..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/AESKey.as +++ /dev/null @@ -1,2797 +0,0 @@ -/** - * AESKey - * - * An ActionScript 3 implementation of the Advanced Encryption Standard, as - * defined in FIPS PUB 197 - * Copyright (c) 2007 Henri Torgemane - * - * Derived from: - * A public domain implementation from Karl Malbrain, malbrain@yahoo.com - * (http://www.geocities.com/malbrain/aestable_c.html) - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric -{ - import com.hurlant.crypto.prng.Random; - import com.hurlant.util.Hex; - import com.hurlant.util.Memory; - - import flash.utils.ByteArray; - - public class AESKey implements ISymmetricKey - { - // AES only supports Nb=4 - private static const Nb:uint = 4; // number of columns in the state & expanded key - - // TODO: - // - move those tables in binary files, then - // - [Embed()] them as ByteArray directly. - // (should result in smaller .swf, and faster initialization time.) - - private static const _Sbox:Array = [ // forward s-box - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]; - private static const _InvSbox:Array = [ // inverse s-box - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; - private static const _Xtime2Sbox:Array = [ // combined Xtimes2[Sbox[]] - 0xc6, 0xf8, 0xee, 0xf6, 0xff, 0xd6, 0xde, 0x91, 0x60, 0x02, 0xce, 0x56, 0xe7, 0xb5, 0x4d, 0xec, - 0x8f, 0x1f, 0x89, 0xfa, 0xef, 0xb2, 0x8e, 0xfb, 0x41, 0xb3, 0x5f, 0x45, 0x23, 0x53, 0xe4, 0x9b, - 0x75, 0xe1, 0x3d, 0x4c, 0x6c, 0x7e, 0xf5, 0x83, 0x68, 0x51, 0xd1, 0xf9, 0xe2, 0xab, 0x62, 0x2a, - 0x08, 0x95, 0x46, 0x9d, 0x30, 0x37, 0x0a, 0x2f, 0x0e, 0x24, 0x1b, 0xdf, 0xcd, 0x4e, 0x7f, 0xea, - 0x12, 0x1d, 0x58, 0x34, 0x36, 0xdc, 0xb4, 0x5b, 0xa4, 0x76, 0xb7, 0x7d, 0x52, 0xdd, 0x5e, 0x13, - 0xa6, 0xb9, 0x00, 0xc1, 0x40, 0xe3, 0x79, 0xb6, 0xd4, 0x8d, 0x67, 0x72, 0x94, 0x98, 0xb0, 0x85, - 0xbb, 0xc5, 0x4f, 0xed, 0x86, 0x9a, 0x66, 0x11, 0x8a, 0xe9, 0x04, 0xfe, 0xa0, 0x78, 0x25, 0x4b, - 0xa2, 0x5d, 0x80, 0x05, 0x3f, 0x21, 0x70, 0xf1, 0x63, 0x77, 0xaf, 0x42, 0x20, 0xe5, 0xfd, 0xbf, - 0x81, 0x18, 0x26, 0xc3, 0xbe, 0x35, 0x88, 0x2e, 0x93, 0x55, 0xfc, 0x7a, 0xc8, 0xba, 0x32, 0xe6, - 0xc0, 0x19, 0x9e, 0xa3, 0x44, 0x54, 0x3b, 0x0b, 0x8c, 0xc7, 0x6b, 0x28, 0xa7, 0xbc, 0x16, 0xad, - 0xdb, 0x64, 0x74, 0x14, 0x92, 0x0c, 0x48, 0xb8, 0x9f, 0xbd, 0x43, 0xc4, 0x39, 0x31, 0xd3, 0xf2, - 0xd5, 0x8b, 0x6e, 0xda, 0x01, 0xb1, 0x9c, 0x49, 0xd8, 0xac, 0xf3, 0xcf, 0xca, 0xf4, 0x47, 0x10, - 0x6f, 0xf0, 0x4a, 0x5c, 0x38, 0x57, 0x73, 0x97, 0xcb, 0xa1, 0xe8, 0x3e, 0x96, 0x61, 0x0d, 0x0f, - 0xe0, 0x7c, 0x71, 0xcc, 0x90, 0x06, 0xf7, 0x1c, 0xc2, 0x6a, 0xae, 0x69, 0x17, 0x99, 0x3a, 0x27, - 0xd9, 0xeb, 0x2b, 0x22, 0xd2, 0xa9, 0x07, 0x33, 0x2d, 0x3c, 0x15, 0xc9, 0x87, 0xaa, 0x50, 0xa5, - 0x03, 0x59, 0x09, 0x1a, 0x65, 0xd7, 0x84, 0xd0, 0x82, 0x29, 0x5a, 0x1e, 0x7b, 0xa8, 0x6d, 0x2c]; - private static const _Xtime3Sbox:Array = [ // combined Xtimes3[Sbox[]] - 0xa5, 0x84, 0x99, 0x8d, 0x0d, 0xbd, 0xb1, 0x54, 0x50, 0x03, 0xa9, 0x7d, 0x19, 0x62, 0xe6, 0x9a, - 0x45, 0x9d, 0x40, 0x87, 0x15, 0xeb, 0xc9, 0x0b, 0xec, 0x67, 0xfd, 0xea, 0xbf, 0xf7, 0x96, 0x5b, - 0xc2, 0x1c, 0xae, 0x6a, 0x5a, 0x41, 0x02, 0x4f, 0x5c, 0xf4, 0x34, 0x08, 0x93, 0x73, 0x53, 0x3f, - 0x0c, 0x52, 0x65, 0x5e, 0x28, 0xa1, 0x0f, 0xb5, 0x09, 0x36, 0x9b, 0x3d, 0x26, 0x69, 0xcd, 0x9f, - 0x1b, 0x9e, 0x74, 0x2e, 0x2d, 0xb2, 0xee, 0xfb, 0xf6, 0x4d, 0x61, 0xce, 0x7b, 0x3e, 0x71, 0x97, - 0xf5, 0x68, 0x00, 0x2c, 0x60, 0x1f, 0xc8, 0xed, 0xbe, 0x46, 0xd9, 0x4b, 0xde, 0xd4, 0xe8, 0x4a, - 0x6b, 0x2a, 0xe5, 0x16, 0xc5, 0xd7, 0x55, 0x94, 0xcf, 0x10, 0x06, 0x81, 0xf0, 0x44, 0xba, 0xe3, - 0xf3, 0xfe, 0xc0, 0x8a, 0xad, 0xbc, 0x48, 0x04, 0xdf, 0xc1, 0x75, 0x63, 0x30, 0x1a, 0x0e, 0x6d, - 0x4c, 0x14, 0x35, 0x2f, 0xe1, 0xa2, 0xcc, 0x39, 0x57, 0xf2, 0x82, 0x47, 0xac, 0xe7, 0x2b, 0x95, - 0xa0, 0x98, 0xd1, 0x7f, 0x66, 0x7e, 0xab, 0x83, 0xca, 0x29, 0xd3, 0x3c, 0x79, 0xe2, 0x1d, 0x76, - 0x3b, 0x56, 0x4e, 0x1e, 0xdb, 0x0a, 0x6c, 0xe4, 0x5d, 0x6e, 0xef, 0xa6, 0xa8, 0xa4, 0x37, 0x8b, - 0x32, 0x43, 0x59, 0xb7, 0x8c, 0x64, 0xd2, 0xe0, 0xb4, 0xfa, 0x07, 0x25, 0xaf, 0x8e, 0xe9, 0x18, - 0xd5, 0x88, 0x6f, 0x72, 0x24, 0xf1, 0xc7, 0x51, 0x23, 0x7c, 0x9c, 0x21, 0xdd, 0xdc, 0x86, 0x85, - 0x90, 0x42, 0xc4, 0xaa, 0xd8, 0x05, 0x01, 0x12, 0xa3, 0x5f, 0xf9, 0xd0, 0x91, 0x58, 0x27, 0xb9, - 0x38, 0x13, 0xb3, 0x33, 0xbb, 0x70, 0x89, 0xa7, 0xb6, 0x22, 0x92, 0x20, 0x49, 0xff, 0x78, 0x7a, - 0x8f, 0xf8, 0x80, 0x17, 0xda, 0x31, 0xc6, 0xb8, 0xc3, 0xb0, 0x77, 0x11, 0xcb, 0xfc, 0xd6, 0x3a]; - // modular multiplication tables - // based on: - - // Xtime2[x] = (x & 0x80 ? 0x1b : 0) ^ (x + x) - // Xtime3[x] = x^Xtime2[x]; - private static const _Xtime2:Array = [ - 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, - 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, - 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, - 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, - 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, - 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, - 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, - 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, - 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05, - 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25, - 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, - 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, - 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, - 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, - 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, - 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5]; - private static const _Xtime9:Array = [ - 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, - 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, - 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, - 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, - 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, - 0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, - 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, - 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, - 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, - 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, - 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, - 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, - 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, - 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, - 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, - 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46]; - private static const _XtimeB:Array = [ - 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, - 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, - 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, - 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, - 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, - 0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, - 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, - 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, - 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, - 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, - 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, - 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, - 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, - 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, - 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, - 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3]; - private static const _XtimeD:Array = [ - 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, - 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, - 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, - 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, - 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, - 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, - 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, - 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, - 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, - 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, - 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, - 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, - 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, - 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, - 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, - 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97]; - private static const _XtimeE:Array = [ - 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, - 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, - 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, - 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, - 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, - 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, - 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, - 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, - 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, - 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, - 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, - 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, - 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, - 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, - 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, - 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d]; - static private var _Rcon:Array = [ - 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; - static private var Sbox:ByteArray; - static private var InvSbox:ByteArray; - static private var Xtime2Sbox:ByteArray - static private var Xtime3Sbox:ByteArray - static private var Xtime2:ByteArray; - static private var Xtime9:ByteArray; - static private var XtimeB:ByteArray; - static private var XtimeD:ByteArray; - static private var XtimeE:ByteArray; - static private var Rcon:ByteArray; - // static initializer - { - static private var i:uint; - Sbox = new ByteArray; - InvSbox = new ByteArray; - Xtime2Sbox = new ByteArray; - Xtime3Sbox = new ByteArray; - Xtime2 = new ByteArray; - Xtime9 = new ByteArray; - XtimeB = new ByteArray; - XtimeD = new ByteArray; - XtimeE = new ByteArray; - /* - for (i=0;i<256;i++) { - Sbox[i] = _Sbox[i]; - InvSbox[i] = _InvSbox[i]; - Xtime2Sbox[i] = _Xtime2Sbox[i]; - Xtime3Sbox[i] = _Xtime3Sbox[i]; - Xtime2[i] = _Xtime2[i]; - Xtime9[i] = _Xtime9[i]; - XtimeB[i] = _XtimeB[i]; - XtimeD[i] = _XtimeD[i]; - XtimeE[i] = _XtimeE[i]; - } - */ - Sbox[0] = _Sbox[0] - InvSbox[0] = _InvSbox[0] - Xtime2Sbox[0] = _Xtime2Sbox[0] - Xtime3Sbox[0] = _Xtime3Sbox[0] - Xtime2[0] = _Xtime2[0] - Xtime9[0] = _Xtime9[0] - XtimeB[0] = _XtimeB[0] - XtimeD[0] = _XtimeD[0] - XtimeE[0] = _XtimeE[0] - Sbox[1] = _Sbox[1] - InvSbox[1] = _InvSbox[1] - Xtime2Sbox[1] = _Xtime2Sbox[1] - Xtime3Sbox[1] = _Xtime3Sbox[1] - Xtime2[1] = _Xtime2[1] - Xtime9[1] = _Xtime9[1] - XtimeB[1] = _XtimeB[1] - XtimeD[1] = _XtimeD[1] - XtimeE[1] = _XtimeE[1] - Sbox[2] = _Sbox[2] - InvSbox[2] = _InvSbox[2] - Xtime2Sbox[2] = _Xtime2Sbox[2] - Xtime3Sbox[2] = _Xtime3Sbox[2] - Xtime2[2] = _Xtime2[2] - Xtime9[2] = _Xtime9[2] - XtimeB[2] = _XtimeB[2] - XtimeD[2] = _XtimeD[2] - XtimeE[2] = _XtimeE[2] - Sbox[3] = _Sbox[3] - InvSbox[3] = _InvSbox[3] - Xtime2Sbox[3] = _Xtime2Sbox[3] - Xtime3Sbox[3] = _Xtime3Sbox[3] - Xtime2[3] = _Xtime2[3] - Xtime9[3] = _Xtime9[3] - XtimeB[3] = _XtimeB[3] - XtimeD[3] = _XtimeD[3] - XtimeE[3] = _XtimeE[3] - Sbox[4] = _Sbox[4] - InvSbox[4] = _InvSbox[4] - Xtime2Sbox[4] = _Xtime2Sbox[4] - Xtime3Sbox[4] = _Xtime3Sbox[4] - Xtime2[4] = _Xtime2[4] - Xtime9[4] = _Xtime9[4] - XtimeB[4] = _XtimeB[4] - XtimeD[4] = _XtimeD[4] - XtimeE[4] = _XtimeE[4] - Sbox[5] = _Sbox[5] - InvSbox[5] = _InvSbox[5] - Xtime2Sbox[5] = _Xtime2Sbox[5] - Xtime3Sbox[5] = _Xtime3Sbox[5] - Xtime2[5] = _Xtime2[5] - Xtime9[5] = _Xtime9[5] - XtimeB[5] = _XtimeB[5] - XtimeD[5] = _XtimeD[5] - XtimeE[5] = _XtimeE[5] - Sbox[6] = _Sbox[6] - InvSbox[6] = _InvSbox[6] - Xtime2Sbox[6] = _Xtime2Sbox[6] - Xtime3Sbox[6] = _Xtime3Sbox[6] - Xtime2[6] = _Xtime2[6] - Xtime9[6] = _Xtime9[6] - XtimeB[6] = _XtimeB[6] - XtimeD[6] = _XtimeD[6] - XtimeE[6] = _XtimeE[6] - Sbox[7] = _Sbox[7] - InvSbox[7] = _InvSbox[7] - Xtime2Sbox[7] = _Xtime2Sbox[7] - Xtime3Sbox[7] = _Xtime3Sbox[7] - Xtime2[7] = _Xtime2[7] - Xtime9[7] = _Xtime9[7] - XtimeB[7] = _XtimeB[7] - XtimeD[7] = _XtimeD[7] - XtimeE[7] = _XtimeE[7] - Sbox[8] = _Sbox[8] - InvSbox[8] = _InvSbox[8] - Xtime2Sbox[8] = _Xtime2Sbox[8] - Xtime3Sbox[8] = _Xtime3Sbox[8] - Xtime2[8] = _Xtime2[8] - Xtime9[8] = _Xtime9[8] - XtimeB[8] = _XtimeB[8] - XtimeD[8] = _XtimeD[8] - XtimeE[8] = _XtimeE[8] - Sbox[9] = _Sbox[9] - InvSbox[9] = _InvSbox[9] - Xtime2Sbox[9] = _Xtime2Sbox[9] - Xtime3Sbox[9] = _Xtime3Sbox[9] - Xtime2[9] = _Xtime2[9] - Xtime9[9] = _Xtime9[9] - XtimeB[9] = _XtimeB[9] - XtimeD[9] = _XtimeD[9] - XtimeE[9] = _XtimeE[9] - Sbox[10] = _Sbox[10] - InvSbox[10] = _InvSbox[10] - Xtime2Sbox[10] = _Xtime2Sbox[10] - Xtime3Sbox[10] = _Xtime3Sbox[10] - Xtime2[10] = _Xtime2[10] - Xtime9[10] = _Xtime9[10] - XtimeB[10] = _XtimeB[10] - XtimeD[10] = _XtimeD[10] - XtimeE[10] = _XtimeE[10] - Sbox[11] = _Sbox[11] - InvSbox[11] = _InvSbox[11] - Xtime2Sbox[11] = _Xtime2Sbox[11] - Xtime3Sbox[11] = _Xtime3Sbox[11] - Xtime2[11] = _Xtime2[11] - Xtime9[11] = _Xtime9[11] - XtimeB[11] = _XtimeB[11] - XtimeD[11] = _XtimeD[11] - XtimeE[11] = _XtimeE[11] - Sbox[12] = _Sbox[12] - InvSbox[12] = _InvSbox[12] - Xtime2Sbox[12] = _Xtime2Sbox[12] - Xtime3Sbox[12] = _Xtime3Sbox[12] - Xtime2[12] = _Xtime2[12] - Xtime9[12] = _Xtime9[12] - XtimeB[12] = _XtimeB[12] - XtimeD[12] = _XtimeD[12] - XtimeE[12] = _XtimeE[12] - Sbox[13] = _Sbox[13] - InvSbox[13] = _InvSbox[13] - Xtime2Sbox[13] = _Xtime2Sbox[13] - Xtime3Sbox[13] = _Xtime3Sbox[13] - Xtime2[13] = _Xtime2[13] - Xtime9[13] = _Xtime9[13] - XtimeB[13] = _XtimeB[13] - XtimeD[13] = _XtimeD[13] - XtimeE[13] = _XtimeE[13] - Sbox[14] = _Sbox[14] - InvSbox[14] = _InvSbox[14] - Xtime2Sbox[14] = _Xtime2Sbox[14] - Xtime3Sbox[14] = _Xtime3Sbox[14] - Xtime2[14] = _Xtime2[14] - Xtime9[14] = _Xtime9[14] - XtimeB[14] = _XtimeB[14] - XtimeD[14] = _XtimeD[14] - XtimeE[14] = _XtimeE[14] - Sbox[15] = _Sbox[15] - InvSbox[15] = _InvSbox[15] - Xtime2Sbox[15] = _Xtime2Sbox[15] - Xtime3Sbox[15] = _Xtime3Sbox[15] - Xtime2[15] = _Xtime2[15] - Xtime9[15] = _Xtime9[15] - XtimeB[15] = _XtimeB[15] - XtimeD[15] = _XtimeD[15] - XtimeE[15] = _XtimeE[15] - Sbox[16] = _Sbox[16] - InvSbox[16] = _InvSbox[16] - Xtime2Sbox[16] = _Xtime2Sbox[16] - Xtime3Sbox[16] = _Xtime3Sbox[16] - Xtime2[16] = _Xtime2[16] - Xtime9[16] = _Xtime9[16] - XtimeB[16] = _XtimeB[16] - XtimeD[16] = _XtimeD[16] - XtimeE[16] = _XtimeE[16] - Sbox[17] = _Sbox[17] - InvSbox[17] = _InvSbox[17] - Xtime2Sbox[17] = _Xtime2Sbox[17] - Xtime3Sbox[17] = _Xtime3Sbox[17] - Xtime2[17] = _Xtime2[17] - Xtime9[17] = _Xtime9[17] - XtimeB[17] = _XtimeB[17] - XtimeD[17] = _XtimeD[17] - XtimeE[17] = _XtimeE[17] - Sbox[18] = _Sbox[18] - InvSbox[18] = _InvSbox[18] - Xtime2Sbox[18] = _Xtime2Sbox[18] - Xtime3Sbox[18] = _Xtime3Sbox[18] - Xtime2[18] = _Xtime2[18] - Xtime9[18] = _Xtime9[18] - XtimeB[18] = _XtimeB[18] - XtimeD[18] = _XtimeD[18] - XtimeE[18] = _XtimeE[18] - Sbox[19] = _Sbox[19] - InvSbox[19] = _InvSbox[19] - Xtime2Sbox[19] = _Xtime2Sbox[19] - Xtime3Sbox[19] = _Xtime3Sbox[19] - Xtime2[19] = _Xtime2[19] - Xtime9[19] = _Xtime9[19] - XtimeB[19] = _XtimeB[19] - XtimeD[19] = _XtimeD[19] - XtimeE[19] = _XtimeE[19] - Sbox[20] = _Sbox[20] - InvSbox[20] = _InvSbox[20] - Xtime2Sbox[20] = _Xtime2Sbox[20] - Xtime3Sbox[20] = _Xtime3Sbox[20] - Xtime2[20] = _Xtime2[20] - Xtime9[20] = _Xtime9[20] - XtimeB[20] = _XtimeB[20] - XtimeD[20] = _XtimeD[20] - XtimeE[20] = _XtimeE[20] - Sbox[21] = _Sbox[21] - InvSbox[21] = _InvSbox[21] - Xtime2Sbox[21] = _Xtime2Sbox[21] - Xtime3Sbox[21] = _Xtime3Sbox[21] - Xtime2[21] = _Xtime2[21] - Xtime9[21] = _Xtime9[21] - XtimeB[21] = _XtimeB[21] - XtimeD[21] = _XtimeD[21] - XtimeE[21] = _XtimeE[21] - Sbox[22] = _Sbox[22] - InvSbox[22] = _InvSbox[22] - Xtime2Sbox[22] = _Xtime2Sbox[22] - Xtime3Sbox[22] = _Xtime3Sbox[22] - Xtime2[22] = _Xtime2[22] - Xtime9[22] = _Xtime9[22] - XtimeB[22] = _XtimeB[22] - XtimeD[22] = _XtimeD[22] - XtimeE[22] = _XtimeE[22] - Sbox[23] = _Sbox[23] - InvSbox[23] = _InvSbox[23] - Xtime2Sbox[23] = _Xtime2Sbox[23] - Xtime3Sbox[23] = _Xtime3Sbox[23] - Xtime2[23] = _Xtime2[23] - Xtime9[23] = _Xtime9[23] - XtimeB[23] = _XtimeB[23] - XtimeD[23] = _XtimeD[23] - XtimeE[23] = _XtimeE[23] - Sbox[24] = _Sbox[24] - InvSbox[24] = _InvSbox[24] - Xtime2Sbox[24] = _Xtime2Sbox[24] - Xtime3Sbox[24] = _Xtime3Sbox[24] - Xtime2[24] = _Xtime2[24] - Xtime9[24] = _Xtime9[24] - XtimeB[24] = _XtimeB[24] - XtimeD[24] = _XtimeD[24] - XtimeE[24] = _XtimeE[24] - Sbox[25] = _Sbox[25] - InvSbox[25] = _InvSbox[25] - Xtime2Sbox[25] = _Xtime2Sbox[25] - Xtime3Sbox[25] = _Xtime3Sbox[25] - Xtime2[25] = _Xtime2[25] - Xtime9[25] = _Xtime9[25] - XtimeB[25] = _XtimeB[25] - XtimeD[25] = _XtimeD[25] - XtimeE[25] = _XtimeE[25] - Sbox[26] = _Sbox[26] - InvSbox[26] = _InvSbox[26] - Xtime2Sbox[26] = _Xtime2Sbox[26] - Xtime3Sbox[26] = _Xtime3Sbox[26] - Xtime2[26] = _Xtime2[26] - Xtime9[26] = _Xtime9[26] - XtimeB[26] = _XtimeB[26] - XtimeD[26] = _XtimeD[26] - XtimeE[26] = _XtimeE[26] - Sbox[27] = _Sbox[27] - InvSbox[27] = _InvSbox[27] - Xtime2Sbox[27] = _Xtime2Sbox[27] - Xtime3Sbox[27] = _Xtime3Sbox[27] - Xtime2[27] = _Xtime2[27] - Xtime9[27] = _Xtime9[27] - XtimeB[27] = _XtimeB[27] - XtimeD[27] = _XtimeD[27] - XtimeE[27] = _XtimeE[27] - Sbox[28] = _Sbox[28] - InvSbox[28] = _InvSbox[28] - Xtime2Sbox[28] = _Xtime2Sbox[28] - Xtime3Sbox[28] = _Xtime3Sbox[28] - Xtime2[28] = _Xtime2[28] - Xtime9[28] = _Xtime9[28] - XtimeB[28] = _XtimeB[28] - XtimeD[28] = _XtimeD[28] - XtimeE[28] = _XtimeE[28] - Sbox[29] = _Sbox[29] - InvSbox[29] = _InvSbox[29] - Xtime2Sbox[29] = _Xtime2Sbox[29] - Xtime3Sbox[29] = _Xtime3Sbox[29] - Xtime2[29] = _Xtime2[29] - Xtime9[29] = _Xtime9[29] - XtimeB[29] = _XtimeB[29] - XtimeD[29] = _XtimeD[29] - XtimeE[29] = _XtimeE[29] - Sbox[30] = _Sbox[30] - InvSbox[30] = _InvSbox[30] - Xtime2Sbox[30] = _Xtime2Sbox[30] - Xtime3Sbox[30] = _Xtime3Sbox[30] - Xtime2[30] = _Xtime2[30] - Xtime9[30] = _Xtime9[30] - XtimeB[30] = _XtimeB[30] - XtimeD[30] = _XtimeD[30] - XtimeE[30] = _XtimeE[30] - Sbox[31] = _Sbox[31] - InvSbox[31] = _InvSbox[31] - Xtime2Sbox[31] = _Xtime2Sbox[31] - Xtime3Sbox[31] = _Xtime3Sbox[31] - Xtime2[31] = _Xtime2[31] - Xtime9[31] = _Xtime9[31] - XtimeB[31] = _XtimeB[31] - XtimeD[31] = _XtimeD[31] - XtimeE[31] = _XtimeE[31] - Sbox[32] = _Sbox[32] - InvSbox[32] = _InvSbox[32] - Xtime2Sbox[32] = _Xtime2Sbox[32] - Xtime3Sbox[32] = _Xtime3Sbox[32] - Xtime2[32] = _Xtime2[32] - Xtime9[32] = _Xtime9[32] - XtimeB[32] = _XtimeB[32] - XtimeD[32] = _XtimeD[32] - XtimeE[32] = _XtimeE[32] - Sbox[33] = _Sbox[33] - InvSbox[33] = _InvSbox[33] - Xtime2Sbox[33] = _Xtime2Sbox[33] - Xtime3Sbox[33] = _Xtime3Sbox[33] - Xtime2[33] = _Xtime2[33] - Xtime9[33] = _Xtime9[33] - XtimeB[33] = _XtimeB[33] - XtimeD[33] = _XtimeD[33] - XtimeE[33] = _XtimeE[33] - Sbox[34] = _Sbox[34] - InvSbox[34] = _InvSbox[34] - Xtime2Sbox[34] = _Xtime2Sbox[34] - Xtime3Sbox[34] = _Xtime3Sbox[34] - Xtime2[34] = _Xtime2[34] - Xtime9[34] = _Xtime9[34] - XtimeB[34] = _XtimeB[34] - XtimeD[34] = _XtimeD[34] - XtimeE[34] = _XtimeE[34] - Sbox[35] = _Sbox[35] - InvSbox[35] = _InvSbox[35] - Xtime2Sbox[35] = _Xtime2Sbox[35] - Xtime3Sbox[35] = _Xtime3Sbox[35] - Xtime2[35] = _Xtime2[35] - Xtime9[35] = _Xtime9[35] - XtimeB[35] = _XtimeB[35] - XtimeD[35] = _XtimeD[35] - XtimeE[35] = _XtimeE[35] - Sbox[36] = _Sbox[36] - InvSbox[36] = _InvSbox[36] - Xtime2Sbox[36] = _Xtime2Sbox[36] - Xtime3Sbox[36] = _Xtime3Sbox[36] - Xtime2[36] = _Xtime2[36] - Xtime9[36] = _Xtime9[36] - XtimeB[36] = _XtimeB[36] - XtimeD[36] = _XtimeD[36] - XtimeE[36] = _XtimeE[36] - Sbox[37] = _Sbox[37] - InvSbox[37] = _InvSbox[37] - Xtime2Sbox[37] = _Xtime2Sbox[37] - Xtime3Sbox[37] = _Xtime3Sbox[37] - Xtime2[37] = _Xtime2[37] - Xtime9[37] = _Xtime9[37] - XtimeB[37] = _XtimeB[37] - XtimeD[37] = _XtimeD[37] - XtimeE[37] = _XtimeE[37] - Sbox[38] = _Sbox[38] - InvSbox[38] = _InvSbox[38] - Xtime2Sbox[38] = _Xtime2Sbox[38] - Xtime3Sbox[38] = _Xtime3Sbox[38] - Xtime2[38] = _Xtime2[38] - Xtime9[38] = _Xtime9[38] - XtimeB[38] = _XtimeB[38] - XtimeD[38] = _XtimeD[38] - XtimeE[38] = _XtimeE[38] - Sbox[39] = _Sbox[39] - InvSbox[39] = _InvSbox[39] - Xtime2Sbox[39] = _Xtime2Sbox[39] - Xtime3Sbox[39] = _Xtime3Sbox[39] - Xtime2[39] = _Xtime2[39] - Xtime9[39] = _Xtime9[39] - XtimeB[39] = _XtimeB[39] - XtimeD[39] = _XtimeD[39] - XtimeE[39] = _XtimeE[39] - Sbox[40] = _Sbox[40] - InvSbox[40] = _InvSbox[40] - Xtime2Sbox[40] = _Xtime2Sbox[40] - Xtime3Sbox[40] = _Xtime3Sbox[40] - Xtime2[40] = _Xtime2[40] - Xtime9[40] = _Xtime9[40] - XtimeB[40] = _XtimeB[40] - XtimeD[40] = _XtimeD[40] - XtimeE[40] = _XtimeE[40] - Sbox[41] = _Sbox[41] - InvSbox[41] = _InvSbox[41] - Xtime2Sbox[41] = _Xtime2Sbox[41] - Xtime3Sbox[41] = _Xtime3Sbox[41] - Xtime2[41] = _Xtime2[41] - Xtime9[41] = _Xtime9[41] - XtimeB[41] = _XtimeB[41] - XtimeD[41] = _XtimeD[41] - XtimeE[41] = _XtimeE[41] - Sbox[42] = _Sbox[42] - InvSbox[42] = _InvSbox[42] - Xtime2Sbox[42] = _Xtime2Sbox[42] - Xtime3Sbox[42] = _Xtime3Sbox[42] - Xtime2[42] = _Xtime2[42] - Xtime9[42] = _Xtime9[42] - XtimeB[42] = _XtimeB[42] - XtimeD[42] = _XtimeD[42] - XtimeE[42] = _XtimeE[42] - Sbox[43] = _Sbox[43] - InvSbox[43] = _InvSbox[43] - Xtime2Sbox[43] = _Xtime2Sbox[43] - Xtime3Sbox[43] = _Xtime3Sbox[43] - Xtime2[43] = _Xtime2[43] - Xtime9[43] = _Xtime9[43] - XtimeB[43] = _XtimeB[43] - XtimeD[43] = _XtimeD[43] - XtimeE[43] = _XtimeE[43] - Sbox[44] = _Sbox[44] - InvSbox[44] = _InvSbox[44] - Xtime2Sbox[44] = _Xtime2Sbox[44] - Xtime3Sbox[44] = _Xtime3Sbox[44] - Xtime2[44] = _Xtime2[44] - Xtime9[44] = _Xtime9[44] - XtimeB[44] = _XtimeB[44] - XtimeD[44] = _XtimeD[44] - XtimeE[44] = _XtimeE[44] - Sbox[45] = _Sbox[45] - InvSbox[45] = _InvSbox[45] - Xtime2Sbox[45] = _Xtime2Sbox[45] - Xtime3Sbox[45] = _Xtime3Sbox[45] - Xtime2[45] = _Xtime2[45] - Xtime9[45] = _Xtime9[45] - XtimeB[45] = _XtimeB[45] - XtimeD[45] = _XtimeD[45] - XtimeE[45] = _XtimeE[45] - Sbox[46] = _Sbox[46] - InvSbox[46] = _InvSbox[46] - Xtime2Sbox[46] = _Xtime2Sbox[46] - Xtime3Sbox[46] = _Xtime3Sbox[46] - Xtime2[46] = _Xtime2[46] - Xtime9[46] = _Xtime9[46] - XtimeB[46] = _XtimeB[46] - XtimeD[46] = _XtimeD[46] - XtimeE[46] = _XtimeE[46] - Sbox[47] = _Sbox[47] - InvSbox[47] = _InvSbox[47] - Xtime2Sbox[47] = _Xtime2Sbox[47] - Xtime3Sbox[47] = _Xtime3Sbox[47] - Xtime2[47] = _Xtime2[47] - Xtime9[47] = _Xtime9[47] - XtimeB[47] = _XtimeB[47] - XtimeD[47] = _XtimeD[47] - XtimeE[47] = _XtimeE[47] - Sbox[48] = _Sbox[48] - InvSbox[48] = _InvSbox[48] - Xtime2Sbox[48] = _Xtime2Sbox[48] - Xtime3Sbox[48] = _Xtime3Sbox[48] - Xtime2[48] = _Xtime2[48] - Xtime9[48] = _Xtime9[48] - XtimeB[48] = _XtimeB[48] - XtimeD[48] = _XtimeD[48] - XtimeE[48] = _XtimeE[48] - Sbox[49] = _Sbox[49] - InvSbox[49] = _InvSbox[49] - Xtime2Sbox[49] = _Xtime2Sbox[49] - Xtime3Sbox[49] = _Xtime3Sbox[49] - Xtime2[49] = _Xtime2[49] - Xtime9[49] = _Xtime9[49] - XtimeB[49] = _XtimeB[49] - XtimeD[49] = _XtimeD[49] - XtimeE[49] = _XtimeE[49] - Sbox[50] = _Sbox[50] - InvSbox[50] = _InvSbox[50] - Xtime2Sbox[50] = _Xtime2Sbox[50] - Xtime3Sbox[50] = _Xtime3Sbox[50] - Xtime2[50] = _Xtime2[50] - Xtime9[50] = _Xtime9[50] - XtimeB[50] = _XtimeB[50] - XtimeD[50] = _XtimeD[50] - XtimeE[50] = _XtimeE[50] - Sbox[51] = _Sbox[51] - InvSbox[51] = _InvSbox[51] - Xtime2Sbox[51] = _Xtime2Sbox[51] - Xtime3Sbox[51] = _Xtime3Sbox[51] - Xtime2[51] = _Xtime2[51] - Xtime9[51] = _Xtime9[51] - XtimeB[51] = _XtimeB[51] - XtimeD[51] = _XtimeD[51] - XtimeE[51] = _XtimeE[51] - Sbox[52] = _Sbox[52] - InvSbox[52] = _InvSbox[52] - Xtime2Sbox[52] = _Xtime2Sbox[52] - Xtime3Sbox[52] = _Xtime3Sbox[52] - Xtime2[52] = _Xtime2[52] - Xtime9[52] = _Xtime9[52] - XtimeB[52] = _XtimeB[52] - XtimeD[52] = _XtimeD[52] - XtimeE[52] = _XtimeE[52] - Sbox[53] = _Sbox[53] - InvSbox[53] = _InvSbox[53] - Xtime2Sbox[53] = _Xtime2Sbox[53] - Xtime3Sbox[53] = _Xtime3Sbox[53] - Xtime2[53] = _Xtime2[53] - Xtime9[53] = _Xtime9[53] - XtimeB[53] = _XtimeB[53] - XtimeD[53] = _XtimeD[53] - XtimeE[53] = _XtimeE[53] - Sbox[54] = _Sbox[54] - InvSbox[54] = _InvSbox[54] - Xtime2Sbox[54] = _Xtime2Sbox[54] - Xtime3Sbox[54] = _Xtime3Sbox[54] - Xtime2[54] = _Xtime2[54] - Xtime9[54] = _Xtime9[54] - XtimeB[54] = _XtimeB[54] - XtimeD[54] = _XtimeD[54] - XtimeE[54] = _XtimeE[54] - Sbox[55] = _Sbox[55] - InvSbox[55] = _InvSbox[55] - Xtime2Sbox[55] = _Xtime2Sbox[55] - Xtime3Sbox[55] = _Xtime3Sbox[55] - Xtime2[55] = _Xtime2[55] - Xtime9[55] = _Xtime9[55] - XtimeB[55] = _XtimeB[55] - XtimeD[55] = _XtimeD[55] - XtimeE[55] = _XtimeE[55] - Sbox[56] = _Sbox[56] - InvSbox[56] = _InvSbox[56] - Xtime2Sbox[56] = _Xtime2Sbox[56] - Xtime3Sbox[56] = _Xtime3Sbox[56] - Xtime2[56] = _Xtime2[56] - Xtime9[56] = _Xtime9[56] - XtimeB[56] = _XtimeB[56] - XtimeD[56] = _XtimeD[56] - XtimeE[56] = _XtimeE[56] - Sbox[57] = _Sbox[57] - InvSbox[57] = _InvSbox[57] - Xtime2Sbox[57] = _Xtime2Sbox[57] - Xtime3Sbox[57] = _Xtime3Sbox[57] - Xtime2[57] = _Xtime2[57] - Xtime9[57] = _Xtime9[57] - XtimeB[57] = _XtimeB[57] - XtimeD[57] = _XtimeD[57] - XtimeE[57] = _XtimeE[57] - Sbox[58] = _Sbox[58] - InvSbox[58] = _InvSbox[58] - Xtime2Sbox[58] = _Xtime2Sbox[58] - Xtime3Sbox[58] = _Xtime3Sbox[58] - Xtime2[58] = _Xtime2[58] - Xtime9[58] = _Xtime9[58] - XtimeB[58] = _XtimeB[58] - XtimeD[58] = _XtimeD[58] - XtimeE[58] = _XtimeE[58] - Sbox[59] = _Sbox[59] - InvSbox[59] = _InvSbox[59] - Xtime2Sbox[59] = _Xtime2Sbox[59] - Xtime3Sbox[59] = _Xtime3Sbox[59] - Xtime2[59] = _Xtime2[59] - Xtime9[59] = _Xtime9[59] - XtimeB[59] = _XtimeB[59] - XtimeD[59] = _XtimeD[59] - XtimeE[59] = _XtimeE[59] - Sbox[60] = _Sbox[60] - InvSbox[60] = _InvSbox[60] - Xtime2Sbox[60] = _Xtime2Sbox[60] - Xtime3Sbox[60] = _Xtime3Sbox[60] - Xtime2[60] = _Xtime2[60] - Xtime9[60] = _Xtime9[60] - XtimeB[60] = _XtimeB[60] - XtimeD[60] = _XtimeD[60] - XtimeE[60] = _XtimeE[60] - Sbox[61] = _Sbox[61] - InvSbox[61] = _InvSbox[61] - Xtime2Sbox[61] = _Xtime2Sbox[61] - Xtime3Sbox[61] = _Xtime3Sbox[61] - Xtime2[61] = _Xtime2[61] - Xtime9[61] = _Xtime9[61] - XtimeB[61] = _XtimeB[61] - XtimeD[61] = _XtimeD[61] - XtimeE[61] = _XtimeE[61] - Sbox[62] = _Sbox[62] - InvSbox[62] = _InvSbox[62] - Xtime2Sbox[62] = _Xtime2Sbox[62] - Xtime3Sbox[62] = _Xtime3Sbox[62] - Xtime2[62] = _Xtime2[62] - Xtime9[62] = _Xtime9[62] - XtimeB[62] = _XtimeB[62] - XtimeD[62] = _XtimeD[62] - XtimeE[62] = _XtimeE[62] - Sbox[63] = _Sbox[63] - InvSbox[63] = _InvSbox[63] - Xtime2Sbox[63] = _Xtime2Sbox[63] - Xtime3Sbox[63] = _Xtime3Sbox[63] - Xtime2[63] = _Xtime2[63] - Xtime9[63] = _Xtime9[63] - XtimeB[63] = _XtimeB[63] - XtimeD[63] = _XtimeD[63] - XtimeE[63] = _XtimeE[63] - Sbox[64] = _Sbox[64] - InvSbox[64] = _InvSbox[64] - Xtime2Sbox[64] = _Xtime2Sbox[64] - Xtime3Sbox[64] = _Xtime3Sbox[64] - Xtime2[64] = _Xtime2[64] - Xtime9[64] = _Xtime9[64] - XtimeB[64] = _XtimeB[64] - XtimeD[64] = _XtimeD[64] - XtimeE[64] = _XtimeE[64] - Sbox[65] = _Sbox[65] - InvSbox[65] = _InvSbox[65] - Xtime2Sbox[65] = _Xtime2Sbox[65] - Xtime3Sbox[65] = _Xtime3Sbox[65] - Xtime2[65] = _Xtime2[65] - Xtime9[65] = _Xtime9[65] - XtimeB[65] = _XtimeB[65] - XtimeD[65] = _XtimeD[65] - XtimeE[65] = _XtimeE[65] - Sbox[66] = _Sbox[66] - InvSbox[66] = _InvSbox[66] - Xtime2Sbox[66] = _Xtime2Sbox[66] - Xtime3Sbox[66] = _Xtime3Sbox[66] - Xtime2[66] = _Xtime2[66] - Xtime9[66] = _Xtime9[66] - XtimeB[66] = _XtimeB[66] - XtimeD[66] = _XtimeD[66] - XtimeE[66] = _XtimeE[66] - Sbox[67] = _Sbox[67] - InvSbox[67] = _InvSbox[67] - Xtime2Sbox[67] = _Xtime2Sbox[67] - Xtime3Sbox[67] = _Xtime3Sbox[67] - Xtime2[67] = _Xtime2[67] - Xtime9[67] = _Xtime9[67] - XtimeB[67] = _XtimeB[67] - XtimeD[67] = _XtimeD[67] - XtimeE[67] = _XtimeE[67] - Sbox[68] = _Sbox[68] - InvSbox[68] = _InvSbox[68] - Xtime2Sbox[68] = _Xtime2Sbox[68] - Xtime3Sbox[68] = _Xtime3Sbox[68] - Xtime2[68] = _Xtime2[68] - Xtime9[68] = _Xtime9[68] - XtimeB[68] = _XtimeB[68] - XtimeD[68] = _XtimeD[68] - XtimeE[68] = _XtimeE[68] - Sbox[69] = _Sbox[69] - InvSbox[69] = _InvSbox[69] - Xtime2Sbox[69] = _Xtime2Sbox[69] - Xtime3Sbox[69] = _Xtime3Sbox[69] - Xtime2[69] = _Xtime2[69] - Xtime9[69] = _Xtime9[69] - XtimeB[69] = _XtimeB[69] - XtimeD[69] = _XtimeD[69] - XtimeE[69] = _XtimeE[69] - Sbox[70] = _Sbox[70] - InvSbox[70] = _InvSbox[70] - Xtime2Sbox[70] = _Xtime2Sbox[70] - Xtime3Sbox[70] = _Xtime3Sbox[70] - Xtime2[70] = _Xtime2[70] - Xtime9[70] = _Xtime9[70] - XtimeB[70] = _XtimeB[70] - XtimeD[70] = _XtimeD[70] - XtimeE[70] = _XtimeE[70] - Sbox[71] = _Sbox[71] - InvSbox[71] = _InvSbox[71] - Xtime2Sbox[71] = _Xtime2Sbox[71] - Xtime3Sbox[71] = _Xtime3Sbox[71] - Xtime2[71] = _Xtime2[71] - Xtime9[71] = _Xtime9[71] - XtimeB[71] = _XtimeB[71] - XtimeD[71] = _XtimeD[71] - XtimeE[71] = _XtimeE[71] - Sbox[72] = _Sbox[72] - InvSbox[72] = _InvSbox[72] - Xtime2Sbox[72] = _Xtime2Sbox[72] - Xtime3Sbox[72] = _Xtime3Sbox[72] - Xtime2[72] = _Xtime2[72] - Xtime9[72] = _Xtime9[72] - XtimeB[72] = _XtimeB[72] - XtimeD[72] = _XtimeD[72] - XtimeE[72] = _XtimeE[72] - Sbox[73] = _Sbox[73] - InvSbox[73] = _InvSbox[73] - Xtime2Sbox[73] = _Xtime2Sbox[73] - Xtime3Sbox[73] = _Xtime3Sbox[73] - Xtime2[73] = _Xtime2[73] - Xtime9[73] = _Xtime9[73] - XtimeB[73] = _XtimeB[73] - XtimeD[73] = _XtimeD[73] - XtimeE[73] = _XtimeE[73] - Sbox[74] = _Sbox[74] - InvSbox[74] = _InvSbox[74] - Xtime2Sbox[74] = _Xtime2Sbox[74] - Xtime3Sbox[74] = _Xtime3Sbox[74] - Xtime2[74] = _Xtime2[74] - Xtime9[74] = _Xtime9[74] - XtimeB[74] = _XtimeB[74] - XtimeD[74] = _XtimeD[74] - XtimeE[74] = _XtimeE[74] - Sbox[75] = _Sbox[75] - InvSbox[75] = _InvSbox[75] - Xtime2Sbox[75] = _Xtime2Sbox[75] - Xtime3Sbox[75] = _Xtime3Sbox[75] - Xtime2[75] = _Xtime2[75] - Xtime9[75] = _Xtime9[75] - XtimeB[75] = _XtimeB[75] - XtimeD[75] = _XtimeD[75] - XtimeE[75] = _XtimeE[75] - Sbox[76] = _Sbox[76] - InvSbox[76] = _InvSbox[76] - Xtime2Sbox[76] = _Xtime2Sbox[76] - Xtime3Sbox[76] = _Xtime3Sbox[76] - Xtime2[76] = _Xtime2[76] - Xtime9[76] = _Xtime9[76] - XtimeB[76] = _XtimeB[76] - XtimeD[76] = _XtimeD[76] - XtimeE[76] = _XtimeE[76] - Sbox[77] = _Sbox[77] - InvSbox[77] = _InvSbox[77] - Xtime2Sbox[77] = _Xtime2Sbox[77] - Xtime3Sbox[77] = _Xtime3Sbox[77] - Xtime2[77] = _Xtime2[77] - Xtime9[77] = _Xtime9[77] - XtimeB[77] = _XtimeB[77] - XtimeD[77] = _XtimeD[77] - XtimeE[77] = _XtimeE[77] - Sbox[78] = _Sbox[78] - InvSbox[78] = _InvSbox[78] - Xtime2Sbox[78] = _Xtime2Sbox[78] - Xtime3Sbox[78] = _Xtime3Sbox[78] - Xtime2[78] = _Xtime2[78] - Xtime9[78] = _Xtime9[78] - XtimeB[78] = _XtimeB[78] - XtimeD[78] = _XtimeD[78] - XtimeE[78] = _XtimeE[78] - Sbox[79] = _Sbox[79] - InvSbox[79] = _InvSbox[79] - Xtime2Sbox[79] = _Xtime2Sbox[79] - Xtime3Sbox[79] = _Xtime3Sbox[79] - Xtime2[79] = _Xtime2[79] - Xtime9[79] = _Xtime9[79] - XtimeB[79] = _XtimeB[79] - XtimeD[79] = _XtimeD[79] - XtimeE[79] = _XtimeE[79] - Sbox[80] = _Sbox[80] - InvSbox[80] = _InvSbox[80] - Xtime2Sbox[80] = _Xtime2Sbox[80] - Xtime3Sbox[80] = _Xtime3Sbox[80] - Xtime2[80] = _Xtime2[80] - Xtime9[80] = _Xtime9[80] - XtimeB[80] = _XtimeB[80] - XtimeD[80] = _XtimeD[80] - XtimeE[80] = _XtimeE[80] - Sbox[81] = _Sbox[81] - InvSbox[81] = _InvSbox[81] - Xtime2Sbox[81] = _Xtime2Sbox[81] - Xtime3Sbox[81] = _Xtime3Sbox[81] - Xtime2[81] = _Xtime2[81] - Xtime9[81] = _Xtime9[81] - XtimeB[81] = _XtimeB[81] - XtimeD[81] = _XtimeD[81] - XtimeE[81] = _XtimeE[81] - Sbox[82] = _Sbox[82] - InvSbox[82] = _InvSbox[82] - Xtime2Sbox[82] = _Xtime2Sbox[82] - Xtime3Sbox[82] = _Xtime3Sbox[82] - Xtime2[82] = _Xtime2[82] - Xtime9[82] = _Xtime9[82] - XtimeB[82] = _XtimeB[82] - XtimeD[82] = _XtimeD[82] - XtimeE[82] = _XtimeE[82] - Sbox[83] = _Sbox[83] - InvSbox[83] = _InvSbox[83] - Xtime2Sbox[83] = _Xtime2Sbox[83] - Xtime3Sbox[83] = _Xtime3Sbox[83] - Xtime2[83] = _Xtime2[83] - Xtime9[83] = _Xtime9[83] - XtimeB[83] = _XtimeB[83] - XtimeD[83] = _XtimeD[83] - XtimeE[83] = _XtimeE[83] - Sbox[84] = _Sbox[84] - InvSbox[84] = _InvSbox[84] - Xtime2Sbox[84] = _Xtime2Sbox[84] - Xtime3Sbox[84] = _Xtime3Sbox[84] - Xtime2[84] = _Xtime2[84] - Xtime9[84] = _Xtime9[84] - XtimeB[84] = _XtimeB[84] - XtimeD[84] = _XtimeD[84] - XtimeE[84] = _XtimeE[84] - Sbox[85] = _Sbox[85] - InvSbox[85] = _InvSbox[85] - Xtime2Sbox[85] = _Xtime2Sbox[85] - Xtime3Sbox[85] = _Xtime3Sbox[85] - Xtime2[85] = _Xtime2[85] - Xtime9[85] = _Xtime9[85] - XtimeB[85] = _XtimeB[85] - XtimeD[85] = _XtimeD[85] - XtimeE[85] = _XtimeE[85] - Sbox[86] = _Sbox[86] - InvSbox[86] = _InvSbox[86] - Xtime2Sbox[86] = _Xtime2Sbox[86] - Xtime3Sbox[86] = _Xtime3Sbox[86] - Xtime2[86] = _Xtime2[86] - Xtime9[86] = _Xtime9[86] - XtimeB[86] = _XtimeB[86] - XtimeD[86] = _XtimeD[86] - XtimeE[86] = _XtimeE[86] - Sbox[87] = _Sbox[87] - InvSbox[87] = _InvSbox[87] - Xtime2Sbox[87] = _Xtime2Sbox[87] - Xtime3Sbox[87] = _Xtime3Sbox[87] - Xtime2[87] = _Xtime2[87] - Xtime9[87] = _Xtime9[87] - XtimeB[87] = _XtimeB[87] - XtimeD[87] = _XtimeD[87] - XtimeE[87] = _XtimeE[87] - Sbox[88] = _Sbox[88] - InvSbox[88] = _InvSbox[88] - Xtime2Sbox[88] = _Xtime2Sbox[88] - Xtime3Sbox[88] = _Xtime3Sbox[88] - Xtime2[88] = _Xtime2[88] - Xtime9[88] = _Xtime9[88] - XtimeB[88] = _XtimeB[88] - XtimeD[88] = _XtimeD[88] - XtimeE[88] = _XtimeE[88] - Sbox[89] = _Sbox[89] - InvSbox[89] = _InvSbox[89] - Xtime2Sbox[89] = _Xtime2Sbox[89] - Xtime3Sbox[89] = _Xtime3Sbox[89] - Xtime2[89] = _Xtime2[89] - Xtime9[89] = _Xtime9[89] - XtimeB[89] = _XtimeB[89] - XtimeD[89] = _XtimeD[89] - XtimeE[89] = _XtimeE[89] - Sbox[90] = _Sbox[90] - InvSbox[90] = _InvSbox[90] - Xtime2Sbox[90] = _Xtime2Sbox[90] - Xtime3Sbox[90] = _Xtime3Sbox[90] - Xtime2[90] = _Xtime2[90] - Xtime9[90] = _Xtime9[90] - XtimeB[90] = _XtimeB[90] - XtimeD[90] = _XtimeD[90] - XtimeE[90] = _XtimeE[90] - Sbox[91] = _Sbox[91] - InvSbox[91] = _InvSbox[91] - Xtime2Sbox[91] = _Xtime2Sbox[91] - Xtime3Sbox[91] = _Xtime3Sbox[91] - Xtime2[91] = _Xtime2[91] - Xtime9[91] = _Xtime9[91] - XtimeB[91] = _XtimeB[91] - XtimeD[91] = _XtimeD[91] - XtimeE[91] = _XtimeE[91] - Sbox[92] = _Sbox[92] - InvSbox[92] = _InvSbox[92] - Xtime2Sbox[92] = _Xtime2Sbox[92] - Xtime3Sbox[92] = _Xtime3Sbox[92] - Xtime2[92] = _Xtime2[92] - Xtime9[92] = _Xtime9[92] - XtimeB[92] = _XtimeB[92] - XtimeD[92] = _XtimeD[92] - XtimeE[92] = _XtimeE[92] - Sbox[93] = _Sbox[93] - InvSbox[93] = _InvSbox[93] - Xtime2Sbox[93] = _Xtime2Sbox[93] - Xtime3Sbox[93] = _Xtime3Sbox[93] - Xtime2[93] = _Xtime2[93] - Xtime9[93] = _Xtime9[93] - XtimeB[93] = _XtimeB[93] - XtimeD[93] = _XtimeD[93] - XtimeE[93] = _XtimeE[93] - Sbox[94] = _Sbox[94] - InvSbox[94] = _InvSbox[94] - Xtime2Sbox[94] = _Xtime2Sbox[94] - Xtime3Sbox[94] = _Xtime3Sbox[94] - Xtime2[94] = _Xtime2[94] - Xtime9[94] = _Xtime9[94] - XtimeB[94] = _XtimeB[94] - XtimeD[94] = _XtimeD[94] - XtimeE[94] = _XtimeE[94] - Sbox[95] = _Sbox[95] - InvSbox[95] = _InvSbox[95] - Xtime2Sbox[95] = _Xtime2Sbox[95] - Xtime3Sbox[95] = _Xtime3Sbox[95] - Xtime2[95] = _Xtime2[95] - Xtime9[95] = _Xtime9[95] - XtimeB[95] = _XtimeB[95] - XtimeD[95] = _XtimeD[95] - XtimeE[95] = _XtimeE[95] - Sbox[96] = _Sbox[96] - InvSbox[96] = _InvSbox[96] - Xtime2Sbox[96] = _Xtime2Sbox[96] - Xtime3Sbox[96] = _Xtime3Sbox[96] - Xtime2[96] = _Xtime2[96] - Xtime9[96] = _Xtime9[96] - XtimeB[96] = _XtimeB[96] - XtimeD[96] = _XtimeD[96] - XtimeE[96] = _XtimeE[96] - Sbox[97] = _Sbox[97] - InvSbox[97] = _InvSbox[97] - Xtime2Sbox[97] = _Xtime2Sbox[97] - Xtime3Sbox[97] = _Xtime3Sbox[97] - Xtime2[97] = _Xtime2[97] - Xtime9[97] = _Xtime9[97] - XtimeB[97] = _XtimeB[97] - XtimeD[97] = _XtimeD[97] - XtimeE[97] = _XtimeE[97] - Sbox[98] = _Sbox[98] - InvSbox[98] = _InvSbox[98] - Xtime2Sbox[98] = _Xtime2Sbox[98] - Xtime3Sbox[98] = _Xtime3Sbox[98] - Xtime2[98] = _Xtime2[98] - Xtime9[98] = _Xtime9[98] - XtimeB[98] = _XtimeB[98] - XtimeD[98] = _XtimeD[98] - XtimeE[98] = _XtimeE[98] - Sbox[99] = _Sbox[99] - InvSbox[99] = _InvSbox[99] - Xtime2Sbox[99] = _Xtime2Sbox[99] - Xtime3Sbox[99] = _Xtime3Sbox[99] - Xtime2[99] = _Xtime2[99] - Xtime9[99] = _Xtime9[99] - XtimeB[99] = _XtimeB[99] - XtimeD[99] = _XtimeD[99] - XtimeE[99] = _XtimeE[99] - Sbox[100] = _Sbox[100] - InvSbox[100] = _InvSbox[100] - Xtime2Sbox[100] = _Xtime2Sbox[100] - Xtime3Sbox[100] = _Xtime3Sbox[100] - Xtime2[100] = _Xtime2[100] - Xtime9[100] = _Xtime9[100] - XtimeB[100] = _XtimeB[100] - XtimeD[100] = _XtimeD[100] - XtimeE[100] = _XtimeE[100] - Sbox[101] = _Sbox[101] - InvSbox[101] = _InvSbox[101] - Xtime2Sbox[101] = _Xtime2Sbox[101] - Xtime3Sbox[101] = _Xtime3Sbox[101] - Xtime2[101] = _Xtime2[101] - Xtime9[101] = _Xtime9[101] - XtimeB[101] = _XtimeB[101] - XtimeD[101] = _XtimeD[101] - XtimeE[101] = _XtimeE[101] - Sbox[102] = _Sbox[102] - InvSbox[102] = _InvSbox[102] - Xtime2Sbox[102] = _Xtime2Sbox[102] - Xtime3Sbox[102] = _Xtime3Sbox[102] - Xtime2[102] = _Xtime2[102] - Xtime9[102] = _Xtime9[102] - XtimeB[102] = _XtimeB[102] - XtimeD[102] = _XtimeD[102] - XtimeE[102] = _XtimeE[102] - Sbox[103] = _Sbox[103] - InvSbox[103] = _InvSbox[103] - Xtime2Sbox[103] = _Xtime2Sbox[103] - Xtime3Sbox[103] = _Xtime3Sbox[103] - Xtime2[103] = _Xtime2[103] - Xtime9[103] = _Xtime9[103] - XtimeB[103] = _XtimeB[103] - XtimeD[103] = _XtimeD[103] - XtimeE[103] = _XtimeE[103] - Sbox[104] = _Sbox[104] - InvSbox[104] = _InvSbox[104] - Xtime2Sbox[104] = _Xtime2Sbox[104] - Xtime3Sbox[104] = _Xtime3Sbox[104] - Xtime2[104] = _Xtime2[104] - Xtime9[104] = _Xtime9[104] - XtimeB[104] = _XtimeB[104] - XtimeD[104] = _XtimeD[104] - XtimeE[104] = _XtimeE[104] - Sbox[105] = _Sbox[105] - InvSbox[105] = _InvSbox[105] - Xtime2Sbox[105] = _Xtime2Sbox[105] - Xtime3Sbox[105] = _Xtime3Sbox[105] - Xtime2[105] = _Xtime2[105] - Xtime9[105] = _Xtime9[105] - XtimeB[105] = _XtimeB[105] - XtimeD[105] = _XtimeD[105] - XtimeE[105] = _XtimeE[105] - Sbox[106] = _Sbox[106] - InvSbox[106] = _InvSbox[106] - Xtime2Sbox[106] = _Xtime2Sbox[106] - Xtime3Sbox[106] = _Xtime3Sbox[106] - Xtime2[106] = _Xtime2[106] - Xtime9[106] = _Xtime9[106] - XtimeB[106] = _XtimeB[106] - XtimeD[106] = _XtimeD[106] - XtimeE[106] = _XtimeE[106] - Sbox[107] = _Sbox[107] - InvSbox[107] = _InvSbox[107] - Xtime2Sbox[107] = _Xtime2Sbox[107] - Xtime3Sbox[107] = _Xtime3Sbox[107] - Xtime2[107] = _Xtime2[107] - Xtime9[107] = _Xtime9[107] - XtimeB[107] = _XtimeB[107] - XtimeD[107] = _XtimeD[107] - XtimeE[107] = _XtimeE[107] - Sbox[108] = _Sbox[108] - InvSbox[108] = _InvSbox[108] - Xtime2Sbox[108] = _Xtime2Sbox[108] - Xtime3Sbox[108] = _Xtime3Sbox[108] - Xtime2[108] = _Xtime2[108] - Xtime9[108] = _Xtime9[108] - XtimeB[108] = _XtimeB[108] - XtimeD[108] = _XtimeD[108] - XtimeE[108] = _XtimeE[108] - Sbox[109] = _Sbox[109] - InvSbox[109] = _InvSbox[109] - Xtime2Sbox[109] = _Xtime2Sbox[109] - Xtime3Sbox[109] = _Xtime3Sbox[109] - Xtime2[109] = _Xtime2[109] - Xtime9[109] = _Xtime9[109] - XtimeB[109] = _XtimeB[109] - XtimeD[109] = _XtimeD[109] - XtimeE[109] = _XtimeE[109] - Sbox[110] = _Sbox[110] - InvSbox[110] = _InvSbox[110] - Xtime2Sbox[110] = _Xtime2Sbox[110] - Xtime3Sbox[110] = _Xtime3Sbox[110] - Xtime2[110] = _Xtime2[110] - Xtime9[110] = _Xtime9[110] - XtimeB[110] = _XtimeB[110] - XtimeD[110] = _XtimeD[110] - XtimeE[110] = _XtimeE[110] - Sbox[111] = _Sbox[111] - InvSbox[111] = _InvSbox[111] - Xtime2Sbox[111] = _Xtime2Sbox[111] - Xtime3Sbox[111] = _Xtime3Sbox[111] - Xtime2[111] = _Xtime2[111] - Xtime9[111] = _Xtime9[111] - XtimeB[111] = _XtimeB[111] - XtimeD[111] = _XtimeD[111] - XtimeE[111] = _XtimeE[111] - Sbox[112] = _Sbox[112] - InvSbox[112] = _InvSbox[112] - Xtime2Sbox[112] = _Xtime2Sbox[112] - Xtime3Sbox[112] = _Xtime3Sbox[112] - Xtime2[112] = _Xtime2[112] - Xtime9[112] = _Xtime9[112] - XtimeB[112] = _XtimeB[112] - XtimeD[112] = _XtimeD[112] - XtimeE[112] = _XtimeE[112] - Sbox[113] = _Sbox[113] - InvSbox[113] = _InvSbox[113] - Xtime2Sbox[113] = _Xtime2Sbox[113] - Xtime3Sbox[113] = _Xtime3Sbox[113] - Xtime2[113] = _Xtime2[113] - Xtime9[113] = _Xtime9[113] - XtimeB[113] = _XtimeB[113] - XtimeD[113] = _XtimeD[113] - XtimeE[113] = _XtimeE[113] - Sbox[114] = _Sbox[114] - InvSbox[114] = _InvSbox[114] - Xtime2Sbox[114] = _Xtime2Sbox[114] - Xtime3Sbox[114] = _Xtime3Sbox[114] - Xtime2[114] = _Xtime2[114] - Xtime9[114] = _Xtime9[114] - XtimeB[114] = _XtimeB[114] - XtimeD[114] = _XtimeD[114] - XtimeE[114] = _XtimeE[114] - Sbox[115] = _Sbox[115] - InvSbox[115] = _InvSbox[115] - Xtime2Sbox[115] = _Xtime2Sbox[115] - Xtime3Sbox[115] = _Xtime3Sbox[115] - Xtime2[115] = _Xtime2[115] - Xtime9[115] = _Xtime9[115] - XtimeB[115] = _XtimeB[115] - XtimeD[115] = _XtimeD[115] - XtimeE[115] = _XtimeE[115] - Sbox[116] = _Sbox[116] - InvSbox[116] = _InvSbox[116] - Xtime2Sbox[116] = _Xtime2Sbox[116] - Xtime3Sbox[116] = _Xtime3Sbox[116] - Xtime2[116] = _Xtime2[116] - Xtime9[116] = _Xtime9[116] - XtimeB[116] = _XtimeB[116] - XtimeD[116] = _XtimeD[116] - XtimeE[116] = _XtimeE[116] - Sbox[117] = _Sbox[117] - InvSbox[117] = _InvSbox[117] - Xtime2Sbox[117] = _Xtime2Sbox[117] - Xtime3Sbox[117] = _Xtime3Sbox[117] - Xtime2[117] = _Xtime2[117] - Xtime9[117] = _Xtime9[117] - XtimeB[117] = _XtimeB[117] - XtimeD[117] = _XtimeD[117] - XtimeE[117] = _XtimeE[117] - Sbox[118] = _Sbox[118] - InvSbox[118] = _InvSbox[118] - Xtime2Sbox[118] = _Xtime2Sbox[118] - Xtime3Sbox[118] = _Xtime3Sbox[118] - Xtime2[118] = _Xtime2[118] - Xtime9[118] = _Xtime9[118] - XtimeB[118] = _XtimeB[118] - XtimeD[118] = _XtimeD[118] - XtimeE[118] = _XtimeE[118] - Sbox[119] = _Sbox[119] - InvSbox[119] = _InvSbox[119] - Xtime2Sbox[119] = _Xtime2Sbox[119] - Xtime3Sbox[119] = _Xtime3Sbox[119] - Xtime2[119] = _Xtime2[119] - Xtime9[119] = _Xtime9[119] - XtimeB[119] = _XtimeB[119] - XtimeD[119] = _XtimeD[119] - XtimeE[119] = _XtimeE[119] - Sbox[120] = _Sbox[120] - InvSbox[120] = _InvSbox[120] - Xtime2Sbox[120] = _Xtime2Sbox[120] - Xtime3Sbox[120] = _Xtime3Sbox[120] - Xtime2[120] = _Xtime2[120] - Xtime9[120] = _Xtime9[120] - XtimeB[120] = _XtimeB[120] - XtimeD[120] = _XtimeD[120] - XtimeE[120] = _XtimeE[120] - Sbox[121] = _Sbox[121] - InvSbox[121] = _InvSbox[121] - Xtime2Sbox[121] = _Xtime2Sbox[121] - Xtime3Sbox[121] = _Xtime3Sbox[121] - Xtime2[121] = _Xtime2[121] - Xtime9[121] = _Xtime9[121] - XtimeB[121] = _XtimeB[121] - XtimeD[121] = _XtimeD[121] - XtimeE[121] = _XtimeE[121] - Sbox[122] = _Sbox[122] - InvSbox[122] = _InvSbox[122] - Xtime2Sbox[122] = _Xtime2Sbox[122] - Xtime3Sbox[122] = _Xtime3Sbox[122] - Xtime2[122] = _Xtime2[122] - Xtime9[122] = _Xtime9[122] - XtimeB[122] = _XtimeB[122] - XtimeD[122] = _XtimeD[122] - XtimeE[122] = _XtimeE[122] - Sbox[123] = _Sbox[123] - InvSbox[123] = _InvSbox[123] - Xtime2Sbox[123] = _Xtime2Sbox[123] - Xtime3Sbox[123] = _Xtime3Sbox[123] - Xtime2[123] = _Xtime2[123] - Xtime9[123] = _Xtime9[123] - XtimeB[123] = _XtimeB[123] - XtimeD[123] = _XtimeD[123] - XtimeE[123] = _XtimeE[123] - Sbox[124] = _Sbox[124] - InvSbox[124] = _InvSbox[124] - Xtime2Sbox[124] = _Xtime2Sbox[124] - Xtime3Sbox[124] = _Xtime3Sbox[124] - Xtime2[124] = _Xtime2[124] - Xtime9[124] = _Xtime9[124] - XtimeB[124] = _XtimeB[124] - XtimeD[124] = _XtimeD[124] - XtimeE[124] = _XtimeE[124] - Sbox[125] = _Sbox[125] - InvSbox[125] = _InvSbox[125] - Xtime2Sbox[125] = _Xtime2Sbox[125] - Xtime3Sbox[125] = _Xtime3Sbox[125] - Xtime2[125] = _Xtime2[125] - Xtime9[125] = _Xtime9[125] - XtimeB[125] = _XtimeB[125] - XtimeD[125] = _XtimeD[125] - XtimeE[125] = _XtimeE[125] - Sbox[126] = _Sbox[126] - InvSbox[126] = _InvSbox[126] - Xtime2Sbox[126] = _Xtime2Sbox[126] - Xtime3Sbox[126] = _Xtime3Sbox[126] - Xtime2[126] = _Xtime2[126] - Xtime9[126] = _Xtime9[126] - XtimeB[126] = _XtimeB[126] - XtimeD[126] = _XtimeD[126] - XtimeE[126] = _XtimeE[126] - Sbox[127] = _Sbox[127] - InvSbox[127] = _InvSbox[127] - Xtime2Sbox[127] = _Xtime2Sbox[127] - Xtime3Sbox[127] = _Xtime3Sbox[127] - Xtime2[127] = _Xtime2[127] - Xtime9[127] = _Xtime9[127] - XtimeB[127] = _XtimeB[127] - XtimeD[127] = _XtimeD[127] - XtimeE[127] = _XtimeE[127] - Sbox[128] = _Sbox[128] - InvSbox[128] = _InvSbox[128] - Xtime2Sbox[128] = _Xtime2Sbox[128] - Xtime3Sbox[128] = _Xtime3Sbox[128] - Xtime2[128] = _Xtime2[128] - Xtime9[128] = _Xtime9[128] - XtimeB[128] = _XtimeB[128] - XtimeD[128] = _XtimeD[128] - XtimeE[128] = _XtimeE[128] - Sbox[129] = _Sbox[129] - InvSbox[129] = _InvSbox[129] - Xtime2Sbox[129] = _Xtime2Sbox[129] - Xtime3Sbox[129] = _Xtime3Sbox[129] - Xtime2[129] = _Xtime2[129] - Xtime9[129] = _Xtime9[129] - XtimeB[129] = _XtimeB[129] - XtimeD[129] = _XtimeD[129] - XtimeE[129] = _XtimeE[129] - Sbox[130] = _Sbox[130] - InvSbox[130] = _InvSbox[130] - Xtime2Sbox[130] = _Xtime2Sbox[130] - Xtime3Sbox[130] = _Xtime3Sbox[130] - Xtime2[130] = _Xtime2[130] - Xtime9[130] = _Xtime9[130] - XtimeB[130] = _XtimeB[130] - XtimeD[130] = _XtimeD[130] - XtimeE[130] = _XtimeE[130] - Sbox[131] = _Sbox[131] - InvSbox[131] = _InvSbox[131] - Xtime2Sbox[131] = _Xtime2Sbox[131] - Xtime3Sbox[131] = _Xtime3Sbox[131] - Xtime2[131] = _Xtime2[131] - Xtime9[131] = _Xtime9[131] - XtimeB[131] = _XtimeB[131] - XtimeD[131] = _XtimeD[131] - XtimeE[131] = _XtimeE[131] - Sbox[132] = _Sbox[132] - InvSbox[132] = _InvSbox[132] - Xtime2Sbox[132] = _Xtime2Sbox[132] - Xtime3Sbox[132] = _Xtime3Sbox[132] - Xtime2[132] = _Xtime2[132] - Xtime9[132] = _Xtime9[132] - XtimeB[132] = _XtimeB[132] - XtimeD[132] = _XtimeD[132] - XtimeE[132] = _XtimeE[132] - Sbox[133] = _Sbox[133] - InvSbox[133] = _InvSbox[133] - Xtime2Sbox[133] = _Xtime2Sbox[133] - Xtime3Sbox[133] = _Xtime3Sbox[133] - Xtime2[133] = _Xtime2[133] - Xtime9[133] = _Xtime9[133] - XtimeB[133] = _XtimeB[133] - XtimeD[133] = _XtimeD[133] - XtimeE[133] = _XtimeE[133] - Sbox[134] = _Sbox[134] - InvSbox[134] = _InvSbox[134] - Xtime2Sbox[134] = _Xtime2Sbox[134] - Xtime3Sbox[134] = _Xtime3Sbox[134] - Xtime2[134] = _Xtime2[134] - Xtime9[134] = _Xtime9[134] - XtimeB[134] = _XtimeB[134] - XtimeD[134] = _XtimeD[134] - XtimeE[134] = _XtimeE[134] - Sbox[135] = _Sbox[135] - InvSbox[135] = _InvSbox[135] - Xtime2Sbox[135] = _Xtime2Sbox[135] - Xtime3Sbox[135] = _Xtime3Sbox[135] - Xtime2[135] = _Xtime2[135] - Xtime9[135] = _Xtime9[135] - XtimeB[135] = _XtimeB[135] - XtimeD[135] = _XtimeD[135] - XtimeE[135] = _XtimeE[135] - Sbox[136] = _Sbox[136] - InvSbox[136] = _InvSbox[136] - Xtime2Sbox[136] = _Xtime2Sbox[136] - Xtime3Sbox[136] = _Xtime3Sbox[136] - Xtime2[136] = _Xtime2[136] - Xtime9[136] = _Xtime9[136] - XtimeB[136] = _XtimeB[136] - XtimeD[136] = _XtimeD[136] - XtimeE[136] = _XtimeE[136] - Sbox[137] = _Sbox[137] - InvSbox[137] = _InvSbox[137] - Xtime2Sbox[137] = _Xtime2Sbox[137] - Xtime3Sbox[137] = _Xtime3Sbox[137] - Xtime2[137] = _Xtime2[137] - Xtime9[137] = _Xtime9[137] - XtimeB[137] = _XtimeB[137] - XtimeD[137] = _XtimeD[137] - XtimeE[137] = _XtimeE[137] - Sbox[138] = _Sbox[138] - InvSbox[138] = _InvSbox[138] - Xtime2Sbox[138] = _Xtime2Sbox[138] - Xtime3Sbox[138] = _Xtime3Sbox[138] - Xtime2[138] = _Xtime2[138] - Xtime9[138] = _Xtime9[138] - XtimeB[138] = _XtimeB[138] - XtimeD[138] = _XtimeD[138] - XtimeE[138] = _XtimeE[138] - Sbox[139] = _Sbox[139] - InvSbox[139] = _InvSbox[139] - Xtime2Sbox[139] = _Xtime2Sbox[139] - Xtime3Sbox[139] = _Xtime3Sbox[139] - Xtime2[139] = _Xtime2[139] - Xtime9[139] = _Xtime9[139] - XtimeB[139] = _XtimeB[139] - XtimeD[139] = _XtimeD[139] - XtimeE[139] = _XtimeE[139] - Sbox[140] = _Sbox[140] - InvSbox[140] = _InvSbox[140] - Xtime2Sbox[140] = _Xtime2Sbox[140] - Xtime3Sbox[140] = _Xtime3Sbox[140] - Xtime2[140] = _Xtime2[140] - Xtime9[140] = _Xtime9[140] - XtimeB[140] = _XtimeB[140] - XtimeD[140] = _XtimeD[140] - XtimeE[140] = _XtimeE[140] - Sbox[141] = _Sbox[141] - InvSbox[141] = _InvSbox[141] - Xtime2Sbox[141] = _Xtime2Sbox[141] - Xtime3Sbox[141] = _Xtime3Sbox[141] - Xtime2[141] = _Xtime2[141] - Xtime9[141] = _Xtime9[141] - XtimeB[141] = _XtimeB[141] - XtimeD[141] = _XtimeD[141] - XtimeE[141] = _XtimeE[141] - Sbox[142] = _Sbox[142] - InvSbox[142] = _InvSbox[142] - Xtime2Sbox[142] = _Xtime2Sbox[142] - Xtime3Sbox[142] = _Xtime3Sbox[142] - Xtime2[142] = _Xtime2[142] - Xtime9[142] = _Xtime9[142] - XtimeB[142] = _XtimeB[142] - XtimeD[142] = _XtimeD[142] - XtimeE[142] = _XtimeE[142] - Sbox[143] = _Sbox[143] - InvSbox[143] = _InvSbox[143] - Xtime2Sbox[143] = _Xtime2Sbox[143] - Xtime3Sbox[143] = _Xtime3Sbox[143] - Xtime2[143] = _Xtime2[143] - Xtime9[143] = _Xtime9[143] - XtimeB[143] = _XtimeB[143] - XtimeD[143] = _XtimeD[143] - XtimeE[143] = _XtimeE[143] - Sbox[144] = _Sbox[144] - InvSbox[144] = _InvSbox[144] - Xtime2Sbox[144] = _Xtime2Sbox[144] - Xtime3Sbox[144] = _Xtime3Sbox[144] - Xtime2[144] = _Xtime2[144] - Xtime9[144] = _Xtime9[144] - XtimeB[144] = _XtimeB[144] - XtimeD[144] = _XtimeD[144] - XtimeE[144] = _XtimeE[144] - Sbox[145] = _Sbox[145] - InvSbox[145] = _InvSbox[145] - Xtime2Sbox[145] = _Xtime2Sbox[145] - Xtime3Sbox[145] = _Xtime3Sbox[145] - Xtime2[145] = _Xtime2[145] - Xtime9[145] = _Xtime9[145] - XtimeB[145] = _XtimeB[145] - XtimeD[145] = _XtimeD[145] - XtimeE[145] = _XtimeE[145] - Sbox[146] = _Sbox[146] - InvSbox[146] = _InvSbox[146] - Xtime2Sbox[146] = _Xtime2Sbox[146] - Xtime3Sbox[146] = _Xtime3Sbox[146] - Xtime2[146] = _Xtime2[146] - Xtime9[146] = _Xtime9[146] - XtimeB[146] = _XtimeB[146] - XtimeD[146] = _XtimeD[146] - XtimeE[146] = _XtimeE[146] - Sbox[147] = _Sbox[147] - InvSbox[147] = _InvSbox[147] - Xtime2Sbox[147] = _Xtime2Sbox[147] - Xtime3Sbox[147] = _Xtime3Sbox[147] - Xtime2[147] = _Xtime2[147] - Xtime9[147] = _Xtime9[147] - XtimeB[147] = _XtimeB[147] - XtimeD[147] = _XtimeD[147] - XtimeE[147] = _XtimeE[147] - Sbox[148] = _Sbox[148] - InvSbox[148] = _InvSbox[148] - Xtime2Sbox[148] = _Xtime2Sbox[148] - Xtime3Sbox[148] = _Xtime3Sbox[148] - Xtime2[148] = _Xtime2[148] - Xtime9[148] = _Xtime9[148] - XtimeB[148] = _XtimeB[148] - XtimeD[148] = _XtimeD[148] - XtimeE[148] = _XtimeE[148] - Sbox[149] = _Sbox[149] - InvSbox[149] = _InvSbox[149] - Xtime2Sbox[149] = _Xtime2Sbox[149] - Xtime3Sbox[149] = _Xtime3Sbox[149] - Xtime2[149] = _Xtime2[149] - Xtime9[149] = _Xtime9[149] - XtimeB[149] = _XtimeB[149] - XtimeD[149] = _XtimeD[149] - XtimeE[149] = _XtimeE[149] - Sbox[150] = _Sbox[150] - InvSbox[150] = _InvSbox[150] - Xtime2Sbox[150] = _Xtime2Sbox[150] - Xtime3Sbox[150] = _Xtime3Sbox[150] - Xtime2[150] = _Xtime2[150] - Xtime9[150] = _Xtime9[150] - XtimeB[150] = _XtimeB[150] - XtimeD[150] = _XtimeD[150] - XtimeE[150] = _XtimeE[150] - Sbox[151] = _Sbox[151] - InvSbox[151] = _InvSbox[151] - Xtime2Sbox[151] = _Xtime2Sbox[151] - Xtime3Sbox[151] = _Xtime3Sbox[151] - Xtime2[151] = _Xtime2[151] - Xtime9[151] = _Xtime9[151] - XtimeB[151] = _XtimeB[151] - XtimeD[151] = _XtimeD[151] - XtimeE[151] = _XtimeE[151] - Sbox[152] = _Sbox[152] - InvSbox[152] = _InvSbox[152] - Xtime2Sbox[152] = _Xtime2Sbox[152] - Xtime3Sbox[152] = _Xtime3Sbox[152] - Xtime2[152] = _Xtime2[152] - Xtime9[152] = _Xtime9[152] - XtimeB[152] = _XtimeB[152] - XtimeD[152] = _XtimeD[152] - XtimeE[152] = _XtimeE[152] - Sbox[153] = _Sbox[153] - InvSbox[153] = _InvSbox[153] - Xtime2Sbox[153] = _Xtime2Sbox[153] - Xtime3Sbox[153] = _Xtime3Sbox[153] - Xtime2[153] = _Xtime2[153] - Xtime9[153] = _Xtime9[153] - XtimeB[153] = _XtimeB[153] - XtimeD[153] = _XtimeD[153] - XtimeE[153] = _XtimeE[153] - Sbox[154] = _Sbox[154] - InvSbox[154] = _InvSbox[154] - Xtime2Sbox[154] = _Xtime2Sbox[154] - Xtime3Sbox[154] = _Xtime3Sbox[154] - Xtime2[154] = _Xtime2[154] - Xtime9[154] = _Xtime9[154] - XtimeB[154] = _XtimeB[154] - XtimeD[154] = _XtimeD[154] - XtimeE[154] = _XtimeE[154] - Sbox[155] = _Sbox[155] - InvSbox[155] = _InvSbox[155] - Xtime2Sbox[155] = _Xtime2Sbox[155] - Xtime3Sbox[155] = _Xtime3Sbox[155] - Xtime2[155] = _Xtime2[155] - Xtime9[155] = _Xtime9[155] - XtimeB[155] = _XtimeB[155] - XtimeD[155] = _XtimeD[155] - XtimeE[155] = _XtimeE[155] - Sbox[156] = _Sbox[156] - InvSbox[156] = _InvSbox[156] - Xtime2Sbox[156] = _Xtime2Sbox[156] - Xtime3Sbox[156] = _Xtime3Sbox[156] - Xtime2[156] = _Xtime2[156] - Xtime9[156] = _Xtime9[156] - XtimeB[156] = _XtimeB[156] - XtimeD[156] = _XtimeD[156] - XtimeE[156] = _XtimeE[156] - Sbox[157] = _Sbox[157] - InvSbox[157] = _InvSbox[157] - Xtime2Sbox[157] = _Xtime2Sbox[157] - Xtime3Sbox[157] = _Xtime3Sbox[157] - Xtime2[157] = _Xtime2[157] - Xtime9[157] = _Xtime9[157] - XtimeB[157] = _XtimeB[157] - XtimeD[157] = _XtimeD[157] - XtimeE[157] = _XtimeE[157] - Sbox[158] = _Sbox[158] - InvSbox[158] = _InvSbox[158] - Xtime2Sbox[158] = _Xtime2Sbox[158] - Xtime3Sbox[158] = _Xtime3Sbox[158] - Xtime2[158] = _Xtime2[158] - Xtime9[158] = _Xtime9[158] - XtimeB[158] = _XtimeB[158] - XtimeD[158] = _XtimeD[158] - XtimeE[158] = _XtimeE[158] - Sbox[159] = _Sbox[159] - InvSbox[159] = _InvSbox[159] - Xtime2Sbox[159] = _Xtime2Sbox[159] - Xtime3Sbox[159] = _Xtime3Sbox[159] - Xtime2[159] = _Xtime2[159] - Xtime9[159] = _Xtime9[159] - XtimeB[159] = _XtimeB[159] - XtimeD[159] = _XtimeD[159] - XtimeE[159] = _XtimeE[159] - Sbox[160] = _Sbox[160] - InvSbox[160] = _InvSbox[160] - Xtime2Sbox[160] = _Xtime2Sbox[160] - Xtime3Sbox[160] = _Xtime3Sbox[160] - Xtime2[160] = _Xtime2[160] - Xtime9[160] = _Xtime9[160] - XtimeB[160] = _XtimeB[160] - XtimeD[160] = _XtimeD[160] - XtimeE[160] = _XtimeE[160] - Sbox[161] = _Sbox[161] - InvSbox[161] = _InvSbox[161] - Xtime2Sbox[161] = _Xtime2Sbox[161] - Xtime3Sbox[161] = _Xtime3Sbox[161] - Xtime2[161] = _Xtime2[161] - Xtime9[161] = _Xtime9[161] - XtimeB[161] = _XtimeB[161] - XtimeD[161] = _XtimeD[161] - XtimeE[161] = _XtimeE[161] - Sbox[162] = _Sbox[162] - InvSbox[162] = _InvSbox[162] - Xtime2Sbox[162] = _Xtime2Sbox[162] - Xtime3Sbox[162] = _Xtime3Sbox[162] - Xtime2[162] = _Xtime2[162] - Xtime9[162] = _Xtime9[162] - XtimeB[162] = _XtimeB[162] - XtimeD[162] = _XtimeD[162] - XtimeE[162] = _XtimeE[162] - Sbox[163] = _Sbox[163] - InvSbox[163] = _InvSbox[163] - Xtime2Sbox[163] = _Xtime2Sbox[163] - Xtime3Sbox[163] = _Xtime3Sbox[163] - Xtime2[163] = _Xtime2[163] - Xtime9[163] = _Xtime9[163] - XtimeB[163] = _XtimeB[163] - XtimeD[163] = _XtimeD[163] - XtimeE[163] = _XtimeE[163] - Sbox[164] = _Sbox[164] - InvSbox[164] = _InvSbox[164] - Xtime2Sbox[164] = _Xtime2Sbox[164] - Xtime3Sbox[164] = _Xtime3Sbox[164] - Xtime2[164] = _Xtime2[164] - Xtime9[164] = _Xtime9[164] - XtimeB[164] = _XtimeB[164] - XtimeD[164] = _XtimeD[164] - XtimeE[164] = _XtimeE[164] - Sbox[165] = _Sbox[165] - InvSbox[165] = _InvSbox[165] - Xtime2Sbox[165] = _Xtime2Sbox[165] - Xtime3Sbox[165] = _Xtime3Sbox[165] - Xtime2[165] = _Xtime2[165] - Xtime9[165] = _Xtime9[165] - XtimeB[165] = _XtimeB[165] - XtimeD[165] = _XtimeD[165] - XtimeE[165] = _XtimeE[165] - Sbox[166] = _Sbox[166] - InvSbox[166] = _InvSbox[166] - Xtime2Sbox[166] = _Xtime2Sbox[166] - Xtime3Sbox[166] = _Xtime3Sbox[166] - Xtime2[166] = _Xtime2[166] - Xtime9[166] = _Xtime9[166] - XtimeB[166] = _XtimeB[166] - XtimeD[166] = _XtimeD[166] - XtimeE[166] = _XtimeE[166] - Sbox[167] = _Sbox[167] - InvSbox[167] = _InvSbox[167] - Xtime2Sbox[167] = _Xtime2Sbox[167] - Xtime3Sbox[167] = _Xtime3Sbox[167] - Xtime2[167] = _Xtime2[167] - Xtime9[167] = _Xtime9[167] - XtimeB[167] = _XtimeB[167] - XtimeD[167] = _XtimeD[167] - XtimeE[167] = _XtimeE[167] - Sbox[168] = _Sbox[168] - InvSbox[168] = _InvSbox[168] - Xtime2Sbox[168] = _Xtime2Sbox[168] - Xtime3Sbox[168] = _Xtime3Sbox[168] - Xtime2[168] = _Xtime2[168] - Xtime9[168] = _Xtime9[168] - XtimeB[168] = _XtimeB[168] - XtimeD[168] = _XtimeD[168] - XtimeE[168] = _XtimeE[168] - Sbox[169] = _Sbox[169] - InvSbox[169] = _InvSbox[169] - Xtime2Sbox[169] = _Xtime2Sbox[169] - Xtime3Sbox[169] = _Xtime3Sbox[169] - Xtime2[169] = _Xtime2[169] - Xtime9[169] = _Xtime9[169] - XtimeB[169] = _XtimeB[169] - XtimeD[169] = _XtimeD[169] - XtimeE[169] = _XtimeE[169] - Sbox[170] = _Sbox[170] - InvSbox[170] = _InvSbox[170] - Xtime2Sbox[170] = _Xtime2Sbox[170] - Xtime3Sbox[170] = _Xtime3Sbox[170] - Xtime2[170] = _Xtime2[170] - Xtime9[170] = _Xtime9[170] - XtimeB[170] = _XtimeB[170] - XtimeD[170] = _XtimeD[170] - XtimeE[170] = _XtimeE[170] - Sbox[171] = _Sbox[171] - InvSbox[171] = _InvSbox[171] - Xtime2Sbox[171] = _Xtime2Sbox[171] - Xtime3Sbox[171] = _Xtime3Sbox[171] - Xtime2[171] = _Xtime2[171] - Xtime9[171] = _Xtime9[171] - XtimeB[171] = _XtimeB[171] - XtimeD[171] = _XtimeD[171] - XtimeE[171] = _XtimeE[171] - Sbox[172] = _Sbox[172] - InvSbox[172] = _InvSbox[172] - Xtime2Sbox[172] = _Xtime2Sbox[172] - Xtime3Sbox[172] = _Xtime3Sbox[172] - Xtime2[172] = _Xtime2[172] - Xtime9[172] = _Xtime9[172] - XtimeB[172] = _XtimeB[172] - XtimeD[172] = _XtimeD[172] - XtimeE[172] = _XtimeE[172] - Sbox[173] = _Sbox[173] - InvSbox[173] = _InvSbox[173] - Xtime2Sbox[173] = _Xtime2Sbox[173] - Xtime3Sbox[173] = _Xtime3Sbox[173] - Xtime2[173] = _Xtime2[173] - Xtime9[173] = _Xtime9[173] - XtimeB[173] = _XtimeB[173] - XtimeD[173] = _XtimeD[173] - XtimeE[173] = _XtimeE[173] - Sbox[174] = _Sbox[174] - InvSbox[174] = _InvSbox[174] - Xtime2Sbox[174] = _Xtime2Sbox[174] - Xtime3Sbox[174] = _Xtime3Sbox[174] - Xtime2[174] = _Xtime2[174] - Xtime9[174] = _Xtime9[174] - XtimeB[174] = _XtimeB[174] - XtimeD[174] = _XtimeD[174] - XtimeE[174] = _XtimeE[174] - Sbox[175] = _Sbox[175] - InvSbox[175] = _InvSbox[175] - Xtime2Sbox[175] = _Xtime2Sbox[175] - Xtime3Sbox[175] = _Xtime3Sbox[175] - Xtime2[175] = _Xtime2[175] - Xtime9[175] = _Xtime9[175] - XtimeB[175] = _XtimeB[175] - XtimeD[175] = _XtimeD[175] - XtimeE[175] = _XtimeE[175] - Sbox[176] = _Sbox[176] - InvSbox[176] = _InvSbox[176] - Xtime2Sbox[176] = _Xtime2Sbox[176] - Xtime3Sbox[176] = _Xtime3Sbox[176] - Xtime2[176] = _Xtime2[176] - Xtime9[176] = _Xtime9[176] - XtimeB[176] = _XtimeB[176] - XtimeD[176] = _XtimeD[176] - XtimeE[176] = _XtimeE[176] - Sbox[177] = _Sbox[177] - InvSbox[177] = _InvSbox[177] - Xtime2Sbox[177] = _Xtime2Sbox[177] - Xtime3Sbox[177] = _Xtime3Sbox[177] - Xtime2[177] = _Xtime2[177] - Xtime9[177] = _Xtime9[177] - XtimeB[177] = _XtimeB[177] - XtimeD[177] = _XtimeD[177] - XtimeE[177] = _XtimeE[177] - Sbox[178] = _Sbox[178] - InvSbox[178] = _InvSbox[178] - Xtime2Sbox[178] = _Xtime2Sbox[178] - Xtime3Sbox[178] = _Xtime3Sbox[178] - Xtime2[178] = _Xtime2[178] - Xtime9[178] = _Xtime9[178] - XtimeB[178] = _XtimeB[178] - XtimeD[178] = _XtimeD[178] - XtimeE[178] = _XtimeE[178] - Sbox[179] = _Sbox[179] - InvSbox[179] = _InvSbox[179] - Xtime2Sbox[179] = _Xtime2Sbox[179] - Xtime3Sbox[179] = _Xtime3Sbox[179] - Xtime2[179] = _Xtime2[179] - Xtime9[179] = _Xtime9[179] - XtimeB[179] = _XtimeB[179] - XtimeD[179] = _XtimeD[179] - XtimeE[179] = _XtimeE[179] - Sbox[180] = _Sbox[180] - InvSbox[180] = _InvSbox[180] - Xtime2Sbox[180] = _Xtime2Sbox[180] - Xtime3Sbox[180] = _Xtime3Sbox[180] - Xtime2[180] = _Xtime2[180] - Xtime9[180] = _Xtime9[180] - XtimeB[180] = _XtimeB[180] - XtimeD[180] = _XtimeD[180] - XtimeE[180] = _XtimeE[180] - Sbox[181] = _Sbox[181] - InvSbox[181] = _InvSbox[181] - Xtime2Sbox[181] = _Xtime2Sbox[181] - Xtime3Sbox[181] = _Xtime3Sbox[181] - Xtime2[181] = _Xtime2[181] - Xtime9[181] = _Xtime9[181] - XtimeB[181] = _XtimeB[181] - XtimeD[181] = _XtimeD[181] - XtimeE[181] = _XtimeE[181] - Sbox[182] = _Sbox[182] - InvSbox[182] = _InvSbox[182] - Xtime2Sbox[182] = _Xtime2Sbox[182] - Xtime3Sbox[182] = _Xtime3Sbox[182] - Xtime2[182] = _Xtime2[182] - Xtime9[182] = _Xtime9[182] - XtimeB[182] = _XtimeB[182] - XtimeD[182] = _XtimeD[182] - XtimeE[182] = _XtimeE[182] - Sbox[183] = _Sbox[183] - InvSbox[183] = _InvSbox[183] - Xtime2Sbox[183] = _Xtime2Sbox[183] - Xtime3Sbox[183] = _Xtime3Sbox[183] - Xtime2[183] = _Xtime2[183] - Xtime9[183] = _Xtime9[183] - XtimeB[183] = _XtimeB[183] - XtimeD[183] = _XtimeD[183] - XtimeE[183] = _XtimeE[183] - Sbox[184] = _Sbox[184] - InvSbox[184] = _InvSbox[184] - Xtime2Sbox[184] = _Xtime2Sbox[184] - Xtime3Sbox[184] = _Xtime3Sbox[184] - Xtime2[184] = _Xtime2[184] - Xtime9[184] = _Xtime9[184] - XtimeB[184] = _XtimeB[184] - XtimeD[184] = _XtimeD[184] - XtimeE[184] = _XtimeE[184] - Sbox[185] = _Sbox[185] - InvSbox[185] = _InvSbox[185] - Xtime2Sbox[185] = _Xtime2Sbox[185] - Xtime3Sbox[185] = _Xtime3Sbox[185] - Xtime2[185] = _Xtime2[185] - Xtime9[185] = _Xtime9[185] - XtimeB[185] = _XtimeB[185] - XtimeD[185] = _XtimeD[185] - XtimeE[185] = _XtimeE[185] - Sbox[186] = _Sbox[186] - InvSbox[186] = _InvSbox[186] - Xtime2Sbox[186] = _Xtime2Sbox[186] - Xtime3Sbox[186] = _Xtime3Sbox[186] - Xtime2[186] = _Xtime2[186] - Xtime9[186] = _Xtime9[186] - XtimeB[186] = _XtimeB[186] - XtimeD[186] = _XtimeD[186] - XtimeE[186] = _XtimeE[186] - Sbox[187] = _Sbox[187] - InvSbox[187] = _InvSbox[187] - Xtime2Sbox[187] = _Xtime2Sbox[187] - Xtime3Sbox[187] = _Xtime3Sbox[187] - Xtime2[187] = _Xtime2[187] - Xtime9[187] = _Xtime9[187] - XtimeB[187] = _XtimeB[187] - XtimeD[187] = _XtimeD[187] - XtimeE[187] = _XtimeE[187] - Sbox[188] = _Sbox[188] - InvSbox[188] = _InvSbox[188] - Xtime2Sbox[188] = _Xtime2Sbox[188] - Xtime3Sbox[188] = _Xtime3Sbox[188] - Xtime2[188] = _Xtime2[188] - Xtime9[188] = _Xtime9[188] - XtimeB[188] = _XtimeB[188] - XtimeD[188] = _XtimeD[188] - XtimeE[188] = _XtimeE[188] - Sbox[189] = _Sbox[189] - InvSbox[189] = _InvSbox[189] - Xtime2Sbox[189] = _Xtime2Sbox[189] - Xtime3Sbox[189] = _Xtime3Sbox[189] - Xtime2[189] = _Xtime2[189] - Xtime9[189] = _Xtime9[189] - XtimeB[189] = _XtimeB[189] - XtimeD[189] = _XtimeD[189] - XtimeE[189] = _XtimeE[189] - Sbox[190] = _Sbox[190] - InvSbox[190] = _InvSbox[190] - Xtime2Sbox[190] = _Xtime2Sbox[190] - Xtime3Sbox[190] = _Xtime3Sbox[190] - Xtime2[190] = _Xtime2[190] - Xtime9[190] = _Xtime9[190] - XtimeB[190] = _XtimeB[190] - XtimeD[190] = _XtimeD[190] - XtimeE[190] = _XtimeE[190] - Sbox[191] = _Sbox[191] - InvSbox[191] = _InvSbox[191] - Xtime2Sbox[191] = _Xtime2Sbox[191] - Xtime3Sbox[191] = _Xtime3Sbox[191] - Xtime2[191] = _Xtime2[191] - Xtime9[191] = _Xtime9[191] - XtimeB[191] = _XtimeB[191] - XtimeD[191] = _XtimeD[191] - XtimeE[191] = _XtimeE[191] - Sbox[192] = _Sbox[192] - InvSbox[192] = _InvSbox[192] - Xtime2Sbox[192] = _Xtime2Sbox[192] - Xtime3Sbox[192] = _Xtime3Sbox[192] - Xtime2[192] = _Xtime2[192] - Xtime9[192] = _Xtime9[192] - XtimeB[192] = _XtimeB[192] - XtimeD[192] = _XtimeD[192] - XtimeE[192] = _XtimeE[192] - Sbox[193] = _Sbox[193] - InvSbox[193] = _InvSbox[193] - Xtime2Sbox[193] = _Xtime2Sbox[193] - Xtime3Sbox[193] = _Xtime3Sbox[193] - Xtime2[193] = _Xtime2[193] - Xtime9[193] = _Xtime9[193] - XtimeB[193] = _XtimeB[193] - XtimeD[193] = _XtimeD[193] - XtimeE[193] = _XtimeE[193] - Sbox[194] = _Sbox[194] - InvSbox[194] = _InvSbox[194] - Xtime2Sbox[194] = _Xtime2Sbox[194] - Xtime3Sbox[194] = _Xtime3Sbox[194] - Xtime2[194] = _Xtime2[194] - Xtime9[194] = _Xtime9[194] - XtimeB[194] = _XtimeB[194] - XtimeD[194] = _XtimeD[194] - XtimeE[194] = _XtimeE[194] - Sbox[195] = _Sbox[195] - InvSbox[195] = _InvSbox[195] - Xtime2Sbox[195] = _Xtime2Sbox[195] - Xtime3Sbox[195] = _Xtime3Sbox[195] - Xtime2[195] = _Xtime2[195] - Xtime9[195] = _Xtime9[195] - XtimeB[195] = _XtimeB[195] - XtimeD[195] = _XtimeD[195] - XtimeE[195] = _XtimeE[195] - Sbox[196] = _Sbox[196] - InvSbox[196] = _InvSbox[196] - Xtime2Sbox[196] = _Xtime2Sbox[196] - Xtime3Sbox[196] = _Xtime3Sbox[196] - Xtime2[196] = _Xtime2[196] - Xtime9[196] = _Xtime9[196] - XtimeB[196] = _XtimeB[196] - XtimeD[196] = _XtimeD[196] - XtimeE[196] = _XtimeE[196] - Sbox[197] = _Sbox[197] - InvSbox[197] = _InvSbox[197] - Xtime2Sbox[197] = _Xtime2Sbox[197] - Xtime3Sbox[197] = _Xtime3Sbox[197] - Xtime2[197] = _Xtime2[197] - Xtime9[197] = _Xtime9[197] - XtimeB[197] = _XtimeB[197] - XtimeD[197] = _XtimeD[197] - XtimeE[197] = _XtimeE[197] - Sbox[198] = _Sbox[198] - InvSbox[198] = _InvSbox[198] - Xtime2Sbox[198] = _Xtime2Sbox[198] - Xtime3Sbox[198] = _Xtime3Sbox[198] - Xtime2[198] = _Xtime2[198] - Xtime9[198] = _Xtime9[198] - XtimeB[198] = _XtimeB[198] - XtimeD[198] = _XtimeD[198] - XtimeE[198] = _XtimeE[198] - Sbox[199] = _Sbox[199] - InvSbox[199] = _InvSbox[199] - Xtime2Sbox[199] = _Xtime2Sbox[199] - Xtime3Sbox[199] = _Xtime3Sbox[199] - Xtime2[199] = _Xtime2[199] - Xtime9[199] = _Xtime9[199] - XtimeB[199] = _XtimeB[199] - XtimeD[199] = _XtimeD[199] - XtimeE[199] = _XtimeE[199] - Sbox[200] = _Sbox[200] - InvSbox[200] = _InvSbox[200] - Xtime2Sbox[200] = _Xtime2Sbox[200] - Xtime3Sbox[200] = _Xtime3Sbox[200] - Xtime2[200] = _Xtime2[200] - Xtime9[200] = _Xtime9[200] - XtimeB[200] = _XtimeB[200] - XtimeD[200] = _XtimeD[200] - XtimeE[200] = _XtimeE[200] - Sbox[201] = _Sbox[201] - InvSbox[201] = _InvSbox[201] - Xtime2Sbox[201] = _Xtime2Sbox[201] - Xtime3Sbox[201] = _Xtime3Sbox[201] - Xtime2[201] = _Xtime2[201] - Xtime9[201] = _Xtime9[201] - XtimeB[201] = _XtimeB[201] - XtimeD[201] = _XtimeD[201] - XtimeE[201] = _XtimeE[201] - Sbox[202] = _Sbox[202] - InvSbox[202] = _InvSbox[202] - Xtime2Sbox[202] = _Xtime2Sbox[202] - Xtime3Sbox[202] = _Xtime3Sbox[202] - Xtime2[202] = _Xtime2[202] - Xtime9[202] = _Xtime9[202] - XtimeB[202] = _XtimeB[202] - XtimeD[202] = _XtimeD[202] - XtimeE[202] = _XtimeE[202] - Sbox[203] = _Sbox[203] - InvSbox[203] = _InvSbox[203] - Xtime2Sbox[203] = _Xtime2Sbox[203] - Xtime3Sbox[203] = _Xtime3Sbox[203] - Xtime2[203] = _Xtime2[203] - Xtime9[203] = _Xtime9[203] - XtimeB[203] = _XtimeB[203] - XtimeD[203] = _XtimeD[203] - XtimeE[203] = _XtimeE[203] - Sbox[204] = _Sbox[204] - InvSbox[204] = _InvSbox[204] - Xtime2Sbox[204] = _Xtime2Sbox[204] - Xtime3Sbox[204] = _Xtime3Sbox[204] - Xtime2[204] = _Xtime2[204] - Xtime9[204] = _Xtime9[204] - XtimeB[204] = _XtimeB[204] - XtimeD[204] = _XtimeD[204] - XtimeE[204] = _XtimeE[204] - Sbox[205] = _Sbox[205] - InvSbox[205] = _InvSbox[205] - Xtime2Sbox[205] = _Xtime2Sbox[205] - Xtime3Sbox[205] = _Xtime3Sbox[205] - Xtime2[205] = _Xtime2[205] - Xtime9[205] = _Xtime9[205] - XtimeB[205] = _XtimeB[205] - XtimeD[205] = _XtimeD[205] - XtimeE[205] = _XtimeE[205] - Sbox[206] = _Sbox[206] - InvSbox[206] = _InvSbox[206] - Xtime2Sbox[206] = _Xtime2Sbox[206] - Xtime3Sbox[206] = _Xtime3Sbox[206] - Xtime2[206] = _Xtime2[206] - Xtime9[206] = _Xtime9[206] - XtimeB[206] = _XtimeB[206] - XtimeD[206] = _XtimeD[206] - XtimeE[206] = _XtimeE[206] - Sbox[207] = _Sbox[207] - InvSbox[207] = _InvSbox[207] - Xtime2Sbox[207] = _Xtime2Sbox[207] - Xtime3Sbox[207] = _Xtime3Sbox[207] - Xtime2[207] = _Xtime2[207] - Xtime9[207] = _Xtime9[207] - XtimeB[207] = _XtimeB[207] - XtimeD[207] = _XtimeD[207] - XtimeE[207] = _XtimeE[207] - Sbox[208] = _Sbox[208] - InvSbox[208] = _InvSbox[208] - Xtime2Sbox[208] = _Xtime2Sbox[208] - Xtime3Sbox[208] = _Xtime3Sbox[208] - Xtime2[208] = _Xtime2[208] - Xtime9[208] = _Xtime9[208] - XtimeB[208] = _XtimeB[208] - XtimeD[208] = _XtimeD[208] - XtimeE[208] = _XtimeE[208] - Sbox[209] = _Sbox[209] - InvSbox[209] = _InvSbox[209] - Xtime2Sbox[209] = _Xtime2Sbox[209] - Xtime3Sbox[209] = _Xtime3Sbox[209] - Xtime2[209] = _Xtime2[209] - Xtime9[209] = _Xtime9[209] - XtimeB[209] = _XtimeB[209] - XtimeD[209] = _XtimeD[209] - XtimeE[209] = _XtimeE[209] - Sbox[210] = _Sbox[210] - InvSbox[210] = _InvSbox[210] - Xtime2Sbox[210] = _Xtime2Sbox[210] - Xtime3Sbox[210] = _Xtime3Sbox[210] - Xtime2[210] = _Xtime2[210] - Xtime9[210] = _Xtime9[210] - XtimeB[210] = _XtimeB[210] - XtimeD[210] = _XtimeD[210] - XtimeE[210] = _XtimeE[210] - Sbox[211] = _Sbox[211] - InvSbox[211] = _InvSbox[211] - Xtime2Sbox[211] = _Xtime2Sbox[211] - Xtime3Sbox[211] = _Xtime3Sbox[211] - Xtime2[211] = _Xtime2[211] - Xtime9[211] = _Xtime9[211] - XtimeB[211] = _XtimeB[211] - XtimeD[211] = _XtimeD[211] - XtimeE[211] = _XtimeE[211] - Sbox[212] = _Sbox[212] - InvSbox[212] = _InvSbox[212] - Xtime2Sbox[212] = _Xtime2Sbox[212] - Xtime3Sbox[212] = _Xtime3Sbox[212] - Xtime2[212] = _Xtime2[212] - Xtime9[212] = _Xtime9[212] - XtimeB[212] = _XtimeB[212] - XtimeD[212] = _XtimeD[212] - XtimeE[212] = _XtimeE[212] - Sbox[213] = _Sbox[213] - InvSbox[213] = _InvSbox[213] - Xtime2Sbox[213] = _Xtime2Sbox[213] - Xtime3Sbox[213] = _Xtime3Sbox[213] - Xtime2[213] = _Xtime2[213] - Xtime9[213] = _Xtime9[213] - XtimeB[213] = _XtimeB[213] - XtimeD[213] = _XtimeD[213] - XtimeE[213] = _XtimeE[213] - Sbox[214] = _Sbox[214] - InvSbox[214] = _InvSbox[214] - Xtime2Sbox[214] = _Xtime2Sbox[214] - Xtime3Sbox[214] = _Xtime3Sbox[214] - Xtime2[214] = _Xtime2[214] - Xtime9[214] = _Xtime9[214] - XtimeB[214] = _XtimeB[214] - XtimeD[214] = _XtimeD[214] - XtimeE[214] = _XtimeE[214] - Sbox[215] = _Sbox[215] - InvSbox[215] = _InvSbox[215] - Xtime2Sbox[215] = _Xtime2Sbox[215] - Xtime3Sbox[215] = _Xtime3Sbox[215] - Xtime2[215] = _Xtime2[215] - Xtime9[215] = _Xtime9[215] - XtimeB[215] = _XtimeB[215] - XtimeD[215] = _XtimeD[215] - XtimeE[215] = _XtimeE[215] - Sbox[216] = _Sbox[216] - InvSbox[216] = _InvSbox[216] - Xtime2Sbox[216] = _Xtime2Sbox[216] - Xtime3Sbox[216] = _Xtime3Sbox[216] - Xtime2[216] = _Xtime2[216] - Xtime9[216] = _Xtime9[216] - XtimeB[216] = _XtimeB[216] - XtimeD[216] = _XtimeD[216] - XtimeE[216] = _XtimeE[216] - Sbox[217] = _Sbox[217] - InvSbox[217] = _InvSbox[217] - Xtime2Sbox[217] = _Xtime2Sbox[217] - Xtime3Sbox[217] = _Xtime3Sbox[217] - Xtime2[217] = _Xtime2[217] - Xtime9[217] = _Xtime9[217] - XtimeB[217] = _XtimeB[217] - XtimeD[217] = _XtimeD[217] - XtimeE[217] = _XtimeE[217] - Sbox[218] = _Sbox[218] - InvSbox[218] = _InvSbox[218] - Xtime2Sbox[218] = _Xtime2Sbox[218] - Xtime3Sbox[218] = _Xtime3Sbox[218] - Xtime2[218] = _Xtime2[218] - Xtime9[218] = _Xtime9[218] - XtimeB[218] = _XtimeB[218] - XtimeD[218] = _XtimeD[218] - XtimeE[218] = _XtimeE[218] - Sbox[219] = _Sbox[219] - InvSbox[219] = _InvSbox[219] - Xtime2Sbox[219] = _Xtime2Sbox[219] - Xtime3Sbox[219] = _Xtime3Sbox[219] - Xtime2[219] = _Xtime2[219] - Xtime9[219] = _Xtime9[219] - XtimeB[219] = _XtimeB[219] - XtimeD[219] = _XtimeD[219] - XtimeE[219] = _XtimeE[219] - Sbox[220] = _Sbox[220] - InvSbox[220] = _InvSbox[220] - Xtime2Sbox[220] = _Xtime2Sbox[220] - Xtime3Sbox[220] = _Xtime3Sbox[220] - Xtime2[220] = _Xtime2[220] - Xtime9[220] = _Xtime9[220] - XtimeB[220] = _XtimeB[220] - XtimeD[220] = _XtimeD[220] - XtimeE[220] = _XtimeE[220] - Sbox[221] = _Sbox[221] - InvSbox[221] = _InvSbox[221] - Xtime2Sbox[221] = _Xtime2Sbox[221] - Xtime3Sbox[221] = _Xtime3Sbox[221] - Xtime2[221] = _Xtime2[221] - Xtime9[221] = _Xtime9[221] - XtimeB[221] = _XtimeB[221] - XtimeD[221] = _XtimeD[221] - XtimeE[221] = _XtimeE[221] - Sbox[222] = _Sbox[222] - InvSbox[222] = _InvSbox[222] - Xtime2Sbox[222] = _Xtime2Sbox[222] - Xtime3Sbox[222] = _Xtime3Sbox[222] - Xtime2[222] = _Xtime2[222] - Xtime9[222] = _Xtime9[222] - XtimeB[222] = _XtimeB[222] - XtimeD[222] = _XtimeD[222] - XtimeE[222] = _XtimeE[222] - Sbox[223] = _Sbox[223] - InvSbox[223] = _InvSbox[223] - Xtime2Sbox[223] = _Xtime2Sbox[223] - Xtime3Sbox[223] = _Xtime3Sbox[223] - Xtime2[223] = _Xtime2[223] - Xtime9[223] = _Xtime9[223] - XtimeB[223] = _XtimeB[223] - XtimeD[223] = _XtimeD[223] - XtimeE[223] = _XtimeE[223] - Sbox[224] = _Sbox[224] - InvSbox[224] = _InvSbox[224] - Xtime2Sbox[224] = _Xtime2Sbox[224] - Xtime3Sbox[224] = _Xtime3Sbox[224] - Xtime2[224] = _Xtime2[224] - Xtime9[224] = _Xtime9[224] - XtimeB[224] = _XtimeB[224] - XtimeD[224] = _XtimeD[224] - XtimeE[224] = _XtimeE[224] - Sbox[225] = _Sbox[225] - InvSbox[225] = _InvSbox[225] - Xtime2Sbox[225] = _Xtime2Sbox[225] - Xtime3Sbox[225] = _Xtime3Sbox[225] - Xtime2[225] = _Xtime2[225] - Xtime9[225] = _Xtime9[225] - XtimeB[225] = _XtimeB[225] - XtimeD[225] = _XtimeD[225] - XtimeE[225] = _XtimeE[225] - Sbox[226] = _Sbox[226] - InvSbox[226] = _InvSbox[226] - Xtime2Sbox[226] = _Xtime2Sbox[226] - Xtime3Sbox[226] = _Xtime3Sbox[226] - Xtime2[226] = _Xtime2[226] - Xtime9[226] = _Xtime9[226] - XtimeB[226] = _XtimeB[226] - XtimeD[226] = _XtimeD[226] - XtimeE[226] = _XtimeE[226] - Sbox[227] = _Sbox[227] - InvSbox[227] = _InvSbox[227] - Xtime2Sbox[227] = _Xtime2Sbox[227] - Xtime3Sbox[227] = _Xtime3Sbox[227] - Xtime2[227] = _Xtime2[227] - Xtime9[227] = _Xtime9[227] - XtimeB[227] = _XtimeB[227] - XtimeD[227] = _XtimeD[227] - XtimeE[227] = _XtimeE[227] - Sbox[228] = _Sbox[228] - InvSbox[228] = _InvSbox[228] - Xtime2Sbox[228] = _Xtime2Sbox[228] - Xtime3Sbox[228] = _Xtime3Sbox[228] - Xtime2[228] = _Xtime2[228] - Xtime9[228] = _Xtime9[228] - XtimeB[228] = _XtimeB[228] - XtimeD[228] = _XtimeD[228] - XtimeE[228] = _XtimeE[228] - Sbox[229] = _Sbox[229] - InvSbox[229] = _InvSbox[229] - Xtime2Sbox[229] = _Xtime2Sbox[229] - Xtime3Sbox[229] = _Xtime3Sbox[229] - Xtime2[229] = _Xtime2[229] - Xtime9[229] = _Xtime9[229] - XtimeB[229] = _XtimeB[229] - XtimeD[229] = _XtimeD[229] - XtimeE[229] = _XtimeE[229] - Sbox[230] = _Sbox[230] - InvSbox[230] = _InvSbox[230] - Xtime2Sbox[230] = _Xtime2Sbox[230] - Xtime3Sbox[230] = _Xtime3Sbox[230] - Xtime2[230] = _Xtime2[230] - Xtime9[230] = _Xtime9[230] - XtimeB[230] = _XtimeB[230] - XtimeD[230] = _XtimeD[230] - XtimeE[230] = _XtimeE[230] - Sbox[231] = _Sbox[231] - InvSbox[231] = _InvSbox[231] - Xtime2Sbox[231] = _Xtime2Sbox[231] - Xtime3Sbox[231] = _Xtime3Sbox[231] - Xtime2[231] = _Xtime2[231] - Xtime9[231] = _Xtime9[231] - XtimeB[231] = _XtimeB[231] - XtimeD[231] = _XtimeD[231] - XtimeE[231] = _XtimeE[231] - Sbox[232] = _Sbox[232] - InvSbox[232] = _InvSbox[232] - Xtime2Sbox[232] = _Xtime2Sbox[232] - Xtime3Sbox[232] = _Xtime3Sbox[232] - Xtime2[232] = _Xtime2[232] - Xtime9[232] = _Xtime9[232] - XtimeB[232] = _XtimeB[232] - XtimeD[232] = _XtimeD[232] - XtimeE[232] = _XtimeE[232] - Sbox[233] = _Sbox[233] - InvSbox[233] = _InvSbox[233] - Xtime2Sbox[233] = _Xtime2Sbox[233] - Xtime3Sbox[233] = _Xtime3Sbox[233] - Xtime2[233] = _Xtime2[233] - Xtime9[233] = _Xtime9[233] - XtimeB[233] = _XtimeB[233] - XtimeD[233] = _XtimeD[233] - XtimeE[233] = _XtimeE[233] - Sbox[234] = _Sbox[234] - InvSbox[234] = _InvSbox[234] - Xtime2Sbox[234] = _Xtime2Sbox[234] - Xtime3Sbox[234] = _Xtime3Sbox[234] - Xtime2[234] = _Xtime2[234] - Xtime9[234] = _Xtime9[234] - XtimeB[234] = _XtimeB[234] - XtimeD[234] = _XtimeD[234] - XtimeE[234] = _XtimeE[234] - Sbox[235] = _Sbox[235] - InvSbox[235] = _InvSbox[235] - Xtime2Sbox[235] = _Xtime2Sbox[235] - Xtime3Sbox[235] = _Xtime3Sbox[235] - Xtime2[235] = _Xtime2[235] - Xtime9[235] = _Xtime9[235] - XtimeB[235] = _XtimeB[235] - XtimeD[235] = _XtimeD[235] - XtimeE[235] = _XtimeE[235] - Sbox[236] = _Sbox[236] - InvSbox[236] = _InvSbox[236] - Xtime2Sbox[236] = _Xtime2Sbox[236] - Xtime3Sbox[236] = _Xtime3Sbox[236] - Xtime2[236] = _Xtime2[236] - Xtime9[236] = _Xtime9[236] - XtimeB[236] = _XtimeB[236] - XtimeD[236] = _XtimeD[236] - XtimeE[236] = _XtimeE[236] - Sbox[237] = _Sbox[237] - InvSbox[237] = _InvSbox[237] - Xtime2Sbox[237] = _Xtime2Sbox[237] - Xtime3Sbox[237] = _Xtime3Sbox[237] - Xtime2[237] = _Xtime2[237] - Xtime9[237] = _Xtime9[237] - XtimeB[237] = _XtimeB[237] - XtimeD[237] = _XtimeD[237] - XtimeE[237] = _XtimeE[237] - Sbox[238] = _Sbox[238] - InvSbox[238] = _InvSbox[238] - Xtime2Sbox[238] = _Xtime2Sbox[238] - Xtime3Sbox[238] = _Xtime3Sbox[238] - Xtime2[238] = _Xtime2[238] - Xtime9[238] = _Xtime9[238] - XtimeB[238] = _XtimeB[238] - XtimeD[238] = _XtimeD[238] - XtimeE[238] = _XtimeE[238] - Sbox[239] = _Sbox[239] - InvSbox[239] = _InvSbox[239] - Xtime2Sbox[239] = _Xtime2Sbox[239] - Xtime3Sbox[239] = _Xtime3Sbox[239] - Xtime2[239] = _Xtime2[239] - Xtime9[239] = _Xtime9[239] - XtimeB[239] = _XtimeB[239] - XtimeD[239] = _XtimeD[239] - XtimeE[239] = _XtimeE[239] - Sbox[240] = _Sbox[240] - InvSbox[240] = _InvSbox[240] - Xtime2Sbox[240] = _Xtime2Sbox[240] - Xtime3Sbox[240] = _Xtime3Sbox[240] - Xtime2[240] = _Xtime2[240] - Xtime9[240] = _Xtime9[240] - XtimeB[240] = _XtimeB[240] - XtimeD[240] = _XtimeD[240] - XtimeE[240] = _XtimeE[240] - Sbox[241] = _Sbox[241] - InvSbox[241] = _InvSbox[241] - Xtime2Sbox[241] = _Xtime2Sbox[241] - Xtime3Sbox[241] = _Xtime3Sbox[241] - Xtime2[241] = _Xtime2[241] - Xtime9[241] = _Xtime9[241] - XtimeB[241] = _XtimeB[241] - XtimeD[241] = _XtimeD[241] - XtimeE[241] = _XtimeE[241] - Sbox[242] = _Sbox[242] - InvSbox[242] = _InvSbox[242] - Xtime2Sbox[242] = _Xtime2Sbox[242] - Xtime3Sbox[242] = _Xtime3Sbox[242] - Xtime2[242] = _Xtime2[242] - Xtime9[242] = _Xtime9[242] - XtimeB[242] = _XtimeB[242] - XtimeD[242] = _XtimeD[242] - XtimeE[242] = _XtimeE[242] - Sbox[243] = _Sbox[243] - InvSbox[243] = _InvSbox[243] - Xtime2Sbox[243] = _Xtime2Sbox[243] - Xtime3Sbox[243] = _Xtime3Sbox[243] - Xtime2[243] = _Xtime2[243] - Xtime9[243] = _Xtime9[243] - XtimeB[243] = _XtimeB[243] - XtimeD[243] = _XtimeD[243] - XtimeE[243] = _XtimeE[243] - Sbox[244] = _Sbox[244] - InvSbox[244] = _InvSbox[244] - Xtime2Sbox[244] = _Xtime2Sbox[244] - Xtime3Sbox[244] = _Xtime3Sbox[244] - Xtime2[244] = _Xtime2[244] - Xtime9[244] = _Xtime9[244] - XtimeB[244] = _XtimeB[244] - XtimeD[244] = _XtimeD[244] - XtimeE[244] = _XtimeE[244] - Sbox[245] = _Sbox[245] - InvSbox[245] = _InvSbox[245] - Xtime2Sbox[245] = _Xtime2Sbox[245] - Xtime3Sbox[245] = _Xtime3Sbox[245] - Xtime2[245] = _Xtime2[245] - Xtime9[245] = _Xtime9[245] - XtimeB[245] = _XtimeB[245] - XtimeD[245] = _XtimeD[245] - XtimeE[245] = _XtimeE[245] - Sbox[246] = _Sbox[246] - InvSbox[246] = _InvSbox[246] - Xtime2Sbox[246] = _Xtime2Sbox[246] - Xtime3Sbox[246] = _Xtime3Sbox[246] - Xtime2[246] = _Xtime2[246] - Xtime9[246] = _Xtime9[246] - XtimeB[246] = _XtimeB[246] - XtimeD[246] = _XtimeD[246] - XtimeE[246] = _XtimeE[246] - Sbox[247] = _Sbox[247] - InvSbox[247] = _InvSbox[247] - Xtime2Sbox[247] = _Xtime2Sbox[247] - Xtime3Sbox[247] = _Xtime3Sbox[247] - Xtime2[247] = _Xtime2[247] - Xtime9[247] = _Xtime9[247] - XtimeB[247] = _XtimeB[247] - XtimeD[247] = _XtimeD[247] - XtimeE[247] = _XtimeE[247] - Sbox[248] = _Sbox[248] - InvSbox[248] = _InvSbox[248] - Xtime2Sbox[248] = _Xtime2Sbox[248] - Xtime3Sbox[248] = _Xtime3Sbox[248] - Xtime2[248] = _Xtime2[248] - Xtime9[248] = _Xtime9[248] - XtimeB[248] = _XtimeB[248] - XtimeD[248] = _XtimeD[248] - XtimeE[248] = _XtimeE[248] - Sbox[249] = _Sbox[249] - InvSbox[249] = _InvSbox[249] - Xtime2Sbox[249] = _Xtime2Sbox[249] - Xtime3Sbox[249] = _Xtime3Sbox[249] - Xtime2[249] = _Xtime2[249] - Xtime9[249] = _Xtime9[249] - XtimeB[249] = _XtimeB[249] - XtimeD[249] = _XtimeD[249] - XtimeE[249] = _XtimeE[249] - Sbox[250] = _Sbox[250] - InvSbox[250] = _InvSbox[250] - Xtime2Sbox[250] = _Xtime2Sbox[250] - Xtime3Sbox[250] = _Xtime3Sbox[250] - Xtime2[250] = _Xtime2[250] - Xtime9[250] = _Xtime9[250] - XtimeB[250] = _XtimeB[250] - XtimeD[250] = _XtimeD[250] - XtimeE[250] = _XtimeE[250] - Sbox[251] = _Sbox[251] - InvSbox[251] = _InvSbox[251] - Xtime2Sbox[251] = _Xtime2Sbox[251] - Xtime3Sbox[251] = _Xtime3Sbox[251] - Xtime2[251] = _Xtime2[251] - Xtime9[251] = _Xtime9[251] - XtimeB[251] = _XtimeB[251] - XtimeD[251] = _XtimeD[251] - XtimeE[251] = _XtimeE[251] - Sbox[252] = _Sbox[252] - InvSbox[252] = _InvSbox[252] - Xtime2Sbox[252] = _Xtime2Sbox[252] - Xtime3Sbox[252] = _Xtime3Sbox[252] - Xtime2[252] = _Xtime2[252] - Xtime9[252] = _Xtime9[252] - XtimeB[252] = _XtimeB[252] - XtimeD[252] = _XtimeD[252] - XtimeE[252] = _XtimeE[252] - Sbox[253] = _Sbox[253] - InvSbox[253] = _InvSbox[253] - Xtime2Sbox[253] = _Xtime2Sbox[253] - Xtime3Sbox[253] = _Xtime3Sbox[253] - Xtime2[253] = _Xtime2[253] - Xtime9[253] = _Xtime9[253] - XtimeB[253] = _XtimeB[253] - XtimeD[253] = _XtimeD[253] - XtimeE[253] = _XtimeE[253] - Sbox[254] = _Sbox[254] - InvSbox[254] = _InvSbox[254] - Xtime2Sbox[254] = _Xtime2Sbox[254] - Xtime3Sbox[254] = _Xtime3Sbox[254] - Xtime2[254] = _Xtime2[254] - Xtime9[254] = _Xtime9[254] - XtimeB[254] = _XtimeB[254] - XtimeD[254] = _XtimeD[254] - XtimeE[254] = _XtimeE[254] - Sbox[255] = _Sbox[255] - InvSbox[255] = _InvSbox[255] - Xtime2Sbox[255] = _Xtime2Sbox[255] - Xtime3Sbox[255] = _Xtime3Sbox[255] - Xtime2[255] = _Xtime2[255] - Xtime9[255] = _Xtime9[255] - XtimeB[255] = _XtimeB[255] - XtimeD[255] = _XtimeD[255] - XtimeE[255] = _XtimeE[255] - Rcon = new ByteArray; - /* - for (i=0;i<_Rcon.length;i++) { - Rcon[i] = _Rcon[i]; - } - */ - Rcon[0] = _Rcon[0]; - Rcon[1] = _Rcon[1]; - Rcon[2] = _Rcon[2]; - Rcon[3] = _Rcon[3]; - Rcon[4] = _Rcon[4]; - Rcon[5] = _Rcon[5]; - Rcon[6] = _Rcon[6]; - Rcon[7] = _Rcon[7]; - Rcon[8] = _Rcon[8]; - Rcon[9] = _Rcon[9]; - Rcon[10] = _Rcon[10]; - Rcon[11] = _Rcon[11]; - } - - private var key:ByteArray; - private var keyLength:uint; - private var Nr:uint; - private var state:ByteArray; - private var tmp:ByteArray; - - public function AESKey(key:ByteArray) { - tmp = new ByteArray; - state = new ByteArray; - keyLength = key.length; - this.key = new ByteArray; - this.key.writeBytes(key); - expandKey(); - } - - // produce Nb bytes for each round - private function expandKey():void { - var tmp0:uint, tmp1:uint, tmp2:uint, tmp3:uint, tmp4:uint; - var idx:uint; - var Nk:uint = key.length/4; - Nr = Nk+6; - - for( idx = Nk; idx < Nb * (Nr + 1); idx++ ) { - tmp0 = key[4*idx - 4]; - tmp1 = key[4*idx - 3]; - tmp2 = key[4*idx - 2]; - tmp3 = key[4*idx - 1]; - if( !(idx % Nk) ) { - tmp4 = tmp3; - tmp3 = Sbox[tmp0]; - tmp0 = Sbox[tmp1] ^ Rcon[idx/Nk]; - tmp1 = Sbox[tmp2]; - tmp2 = Sbox[tmp4]; - } else if( Nk > 6 && idx % Nk == 4 ) { - tmp0 = Sbox[tmp0]; - tmp1 = Sbox[tmp1]; - tmp2 = Sbox[tmp2]; - tmp3 = Sbox[tmp3]; - } - - key[4*idx+0] = key[4*idx - 4*Nk + 0] ^ tmp0; - key[4*idx+1] = key[4*idx - 4*Nk + 1] ^ tmp1; - key[4*idx+2] = key[4*idx - 4*Nk + 2] ^ tmp2; - key[4*idx+3] = key[4*idx - 4*Nk + 3] ^ tmp3; - } - } - - - public function getBlockSize():uint - { - return 16; - } - - // encrypt one 128 bit block - public function encrypt(block:ByteArray, index:uint=0):void - { - var round:uint; - state.position=0; - state.writeBytes(block, index, Nb*4); - - addRoundKey(key, 0); - for ( round = 1; round < Nr + 1; round++ ) { - if (round < Nr) { - mixSubColumns(); - } else { - shiftRows(); - } - addRoundKey(key, round * Nb * 4); - } - - block.position=index; - block.writeBytes(state); - } - - public function decrypt(block:ByteArray, index:uint=0):void - { - var round:uint; - state.position=0; - state.writeBytes(block, index, Nb*4); - - addRoundKey(key, Nr*Nb*4); - invShiftRows(); - for( round = Nr; round--; ) - { - addRoundKey( key, round*Nb*4); - if (round) { - invMixSubColumns(); - } - } - - block.position=index; - block.writeBytes(state); - } - - public function dispose():void { - var i:uint; - var r:Random = new Random; - for (i=0;i>> 24)] + S1[(x >>> 16) & 0xff]) ^ S2[(x >>> 8) & 0xff]) + S3[x & 0xff]); - } - - /** - * apply the encryption cycle to each value pair in the table. - */ - private function processTable(xl:uint, xr:uint, table:Array):void - { - var size:uint = table.length; - - for (var s:uint = 0; s < size; s += 2) - { - xl ^= P[0]; - - for (var i:uint = 1; i < ROUNDS; i += 2) - { - xr ^= F(xl) ^ P[i]; - xl ^= F(xr) ^ P[i + 1]; - } - - xr ^= P[ROUNDS + 1]; - - table[s] = xr; - table[s + 1] = xl; - - xr = xl; // end of cycle swap - xl = table[s]; - } - } - - private function setKey(key:ByteArray):void - { - /* - * - comments are from _Applied Crypto_, Schneier, p338 please be - * careful comparing the two, AC numbers the arrays from 1, the enclosed - * code from 0. - * - * (1) Initialise the S-boxes and the P-array, with a fixed string This - * string contains the hexadecimal digits of pi (3.141...) - */ - S0 = KS0.concat(); - S1 = KS1.concat(); - S2 = KS2.concat(); - S3 = KS3.concat(); - P = KP.concat(); - - /* - * (2) Now, XOR P[0] with the first 32 bits of the key, XOR P[1] with - * the second 32-bits of the key, and so on for all bits of the key (up - * to P[17]). Repeatedly cycle through the key bits until the entire - * P-array has been XOR-ed with the key bits - */ - var keyLength:uint= key.length; - var keyIndex:uint = 0; - - for (var i:uint = 0; i < P_SZ; i++) - { - // get the 32 bits of the key, in 4 * 8 bit chunks - var data:uint = 0x0000000; - for (var j:uint = 0; j < 4; j++) - { - // create a 32 bit block - data = (data << 8) | (key[keyIndex++] & 0xff); - - // wrap when we get to the end of the key - if (keyIndex >= keyLength) - { - keyIndex = 0; - } - } - // XOR the newly created 32 bit chunk onto the P-array - P[i] ^= data; - } - - /* - * (3) Encrypt the all-zero string with the Blowfish algorithm, using - * the subkeys described in (1) and (2) - * - * (4) Replace P1 and P2 with the output of step (3) - * - * (5) Encrypt the output of step(3) using the Blowfish algorithm, with - * the modified subkeys. - * - * (6) Replace P3 and P4 with the output of step (5) - * - * (7) Continue the process, replacing all elements of the P-array and - * then all four S-boxes in order, with the output of the continuously - * changing Blowfish algorithm - */ - - processTable(0, 0, P); - processTable(P[P_SZ - 2], P[P_SZ - 1], S0); - processTable(S0[SBOX_SK - 2], S0[SBOX_SK - 1], S1); - processTable(S1[SBOX_SK - 2], S1[SBOX_SK - 1], S2); - processTable(S2[SBOX_SK - 2], S2[SBOX_SK - 1], S3); - } - - /** - * Encrypt the given input starting at the given offset and place the result - * in the provided buffer starting at the given offset. The input will be an - * exact multiple of our blocksize. - */ - private function encryptBlock(src:ByteArray, srcIndex:uint, dst:ByteArray, dstIndex:uint):void - { - var xl:uint = BytesTo32bits(src, srcIndex); - var xr:uint = BytesTo32bits(src, srcIndex + 4); - - xl ^= P[0]; - - for (var i:uint = 1; i < ROUNDS; i += 2) - { - xr ^= F(xl) ^ P[i]; - xl ^= F(xr) ^ P[i + 1]; - } - - xr ^= P[ROUNDS + 1]; - - Bits32ToBytes(xr, dst, dstIndex); - Bits32ToBytes(xl, dst, dstIndex + 4); - } - - /** - * Decrypt the given input starting at the given offset and place the result - * in the provided buffer starting at the given offset. The input will be an - * exact multiple of our blocksize. - */ - private function decryptBlock(src:ByteArray, srcIndex:uint, dst:ByteArray, dstIndex:uint):void - { - var xl:uint = BytesTo32bits(src, srcIndex); - var xr:uint = BytesTo32bits(src, srcIndex + 4); - - xl ^= P[ROUNDS + 1]; - - for (var i:uint = ROUNDS; i > 0; i -= 2) - { - xr ^= F(xl) ^ P[i]; - xl ^= F(xr) ^ P[i - 1]; - } - - xr ^= P[0]; - - Bits32ToBytes(xr, dst, dstIndex); - Bits32ToBytes(xl, dst, dstIndex + 4); - } - - private function BytesTo32bits(b:ByteArray, i:uint):uint - { - return ((b[i] & 0xff) << 24) | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | ((b[i + 3] & 0xff)); - } - - private function Bits32ToBytes(i:uint, b:ByteArray, offset:uint):void - { - b[offset + 3] = i; - b[offset + 2] = (i >> 8); - b[offset + 1] = (i >> 16); - b[offset] = (i >> 24); - } - - public function toString():String { - return "blowfish"; - } - - } - -} diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/CBCMode.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/CBCMode.as deleted file mode 100644 index e3781bee31..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/CBCMode.as +++ /dev/null @@ -1,55 +0,0 @@ -/** - * CBCMode - * - * An ActionScript 3 implementation of the CBC confidentiality mode - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric -{ - import flash.utils.ByteArray; - - /** - * CBC confidentiality mode. why not. - */ - public class CBCMode extends IVMode implements IMode - { - - public function CBCMode(key:ISymmetricKey, padding:IPad = null) { - super(key, padding); - } - - public function encrypt(src:ByteArray):void { - padding.pad(src); - var vector:ByteArray = getIV4e(); - for (var i:uint=0;i=0;--j) { - X[j]++; - if (X[j]!=0) - break; - } - } - } - public function toString():String { - return key.toString()+"-ctr"; - } - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/DESKey.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/DESKey.as deleted file mode 100644 index 4a0b755824..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/DESKey.as +++ /dev/null @@ -1,365 +0,0 @@ -/** - * DESKey - * - * An Actionscript 3 implementation of the Data Encryption Standard (DES) - * Copyright (c) 2007 Henri Torgemane - * - * Derived from: - * The Bouncy Castle Crypto package, - * Copyright (c) 2000-2004 The Legion Of The Bouncy Castle - * (http://www.bouncycastle.org) - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric -{ - import flash.utils.ByteArray; - import com.hurlant.util.Hex; - import com.hurlant.util.Memory; - - public class DESKey implements ISymmetricKey - { - /** - * what follows is mainly taken from "Applied Cryptography", by Bruce - * Schneier, however it also bears great resemblance to Richard - * Outerbridge's D3DES... - */ - - private static const Df_Key:Array = [ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, - 0x10, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 ]; - - private static const bytebit:Array = [ 128, 64, 32, 16, 8, 4, 2, 1 ]; - - private static const bigbyte:Array = [ 0x800000, 0x400000, 0x200000, 0x100000, 0x80000, 0x40000, 0x20000, 0x10000, 0x8000, - 0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 ]; - - /* - * Use the key schedule specified in the Standard (ANSI X3.92-1981). - */ - - private static const pc1:Array = [ 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, - 59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, - 4, 27, 19, 11, 3 ]; - - private static const totrot:Array = [ 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 ]; - - private static const pc2:Array = [ 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, - 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 ]; - - private static const SP1:Array = [ 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, - 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, - 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, - 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, - 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, - 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, - 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, - 0x00010400, 0x00000000, 0x01010004 ]; - - private static const SP2:Array = [ 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, - 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, - 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, - 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, - 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, - 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, - 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, - 0x80100020, 0x80108020, 0x00108000 ]; - - private static const SP3:Array = [ 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, - 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, - 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, - 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, - 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, - 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, - 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, - 0x00000008, 0x08020008, 0x00020200 ]; - - private static const SP4:Array = [ 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, - 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, - 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, - 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, - 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, - 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, - 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, - 0x00800000, 0x00002000, 0x00802080 ]; - - private static const SP5:Array = [ 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, - 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, - 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, - 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, - 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, - 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, - 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, - 0x40080000, 0x02080100, 0x40000100 ]; - - private static const SP6:Array = [ 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, - 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, - 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, - 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, - 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, - 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, - 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, - 0x20000000, 0x00400010, 0x20004010 ]; - - private static const SP7:Array = [ 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, - 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, - 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, - 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, - 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, - 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, - 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, - 0x04000800, 0x00000800, 0x00200002 ]; - - private static const SP8:Array = [ 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, - 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, - 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, - 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, - 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, - 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, - 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, - 0x00040040, 0x10000000, 0x10041000 ]; - - - protected var key:ByteArray; - protected var encKey:Array; - protected var decKey:Array; - - - public function DESKey(key:ByteArray) { - this.key = key; - this.encKey = generateWorkingKey(true, key, 0); - this.decKey = generateWorkingKey(false, key, 0); - } - - public function getBlockSize():uint - { - return 8; - } - - public function decrypt(block:ByteArray, index:uint=0):void - { - desFunc(decKey, block, index, block, index); - } - - public function dispose():void - { - var i:uint=0; - for (i=0;i>> 3)] & bytebit[l & 07]) != 0); - } - - for (var i:uint = 0; i < 16; i++) - { - var m:uint; - var n:uint; - - if (encrypting) - { - m = i << 1; - } - else - { - m = (15 - i) << 1; - } - - n = m + 1; - newKey[m] = newKey[n] = 0; - - for (j = 0; j < 28; j++) - { - l = j + totrot[i]; - if (l < 28) - { - pcr[j] = pc1m[l]; - } - else - { - pcr[j] = pc1m[l - 28]; - } - } - - for (j = 28; j < 56; j++) - { - l = j + totrot[i]; - if (l < 56) - { - pcr[j] = pc1m[l]; - } - else - { - pcr[j] = pc1m[l - 28]; - } - } - - for (j = 0; j < 24; j++) - { - if (pcr[pc2[j]]) - { - newKey[m] |= bigbyte[j]; - } - - if (pcr[pc2[j + 24]]) - { - newKey[n] |= bigbyte[j]; - } - } - } - - // - // store the processed key - // - for (i = 0; i != 32; i += 2) - { - var i1:uint; - var i2:uint; - - i1 = newKey[i]; - i2 = newKey[i + 1]; - - newKey[i] = ((i1 & 0x00fc0000) << 6) | ((i1 & 0x00000fc0) << 10) | ((i2 & 0x00fc0000) >>> 10) - | ((i2 & 0x00000fc0) >>> 6); - - newKey[i + 1] = ((i1 & 0x0003f000) << 12) | ((i1 & 0x0000003f) << 16) | ((i2 & 0x0003f000) >>> 4) - | (i2 & 0x0000003f); - } - return newKey; - } - - /** - * the DES engine. - */ - protected function desFunc(wKey:Array, inp:ByteArray, inOff:uint, out:ByteArray, outOff:uint):void - { - var work:uint; - var right:uint; - var left:uint; - - left = (inp[inOff + 0] & 0xff) << 24; - left |= (inp[inOff + 1] & 0xff) << 16; - left |= (inp[inOff + 2] & 0xff) << 8; - left |= (inp[inOff + 3] & 0xff); - - right = (inp[inOff + 4] & 0xff) << 24; - right |= (inp[inOff + 5] & 0xff) << 16; - right |= (inp[inOff + 6] & 0xff) << 8; - right |= (inp[inOff + 7] & 0xff); - - work = ((left >>> 4) ^ right) & 0x0f0f0f0f; - right ^= work; - left ^= (work << 4); - work = ((left >>> 16) ^ right) & 0x0000ffff; - right ^= work; - left ^= (work << 16); - work = ((right >>> 2) ^ left) & 0x33333333; - left ^= work; - right ^= (work << 2); - work = ((right >>> 8) ^ left) & 0x00ff00ff; - left ^= work; - right ^= (work << 8); - right = ((right << 1) | ((right >>> 31) & 1)) & 0xffffffff; - work = (left ^ right) & 0xaaaaaaaa; - left ^= work; - right ^= work; - left = ((left << 1) | ((left >>> 31) & 1)) & 0xffffffff; - - for (var round:uint = 0; round < 8; round++) - { - var fval:uint; - - work = (right << 28) | (right >>> 4); - work ^= wKey[round * 4 + 0]; - fval = SP7[work & 0x3f]; - fval |= SP5[(work >>> 8) & 0x3f]; - fval |= SP3[(work >>> 16) & 0x3f]; - fval |= SP1[(work >>> 24) & 0x3f]; - work = right ^ wKey[round * 4 + 1]; - fval |= SP8[work & 0x3f]; - fval |= SP6[(work >>> 8) & 0x3f]; - fval |= SP4[(work >>> 16) & 0x3f]; - fval |= SP2[(work >>> 24) & 0x3f]; - left ^= fval; - work = (left << 28) | (left >>> 4); - work ^= wKey[round * 4 + 2]; - fval = SP7[work & 0x3f]; - fval |= SP5[(work >>> 8) & 0x3f]; - fval |= SP3[(work >>> 16) & 0x3f]; - fval |= SP1[(work >>> 24) & 0x3f]; - work = left ^ wKey[round * 4 + 3]; - fval |= SP8[work & 0x3f]; - fval |= SP6[(work >>> 8) & 0x3f]; - fval |= SP4[(work >>> 16) & 0x3f]; - fval |= SP2[(work >>> 24) & 0x3f]; - right ^= fval; - } - - right = (right << 31) | (right >>> 1); - work = (left ^ right) & 0xaaaaaaaa; - left ^= work; - right ^= work; - left = (left << 31) | (left >>> 1); - work = ((left >>> 8) ^ right) & 0x00ff00ff; - right ^= work; - left ^= (work << 8); - work = ((left >>> 2) ^ right) & 0x33333333; - right ^= work; - left ^= (work << 2); - work = ((right >>> 16) ^ left) & 0x0000ffff; - left ^= work; - right ^= (work << 16); - work = ((right >>> 4) ^ left) & 0x0f0f0f0f; - left ^= work; - right ^= (work << 4); - - out[outOff + 0] = ((right >>> 24) & 0xff); - out[outOff + 1] = ((right >>> 16) & 0xff); - out[outOff + 2] = ((right >>> 8) & 0xff); - out[outOff + 3] = (right & 0xff); - out[outOff + 4] = ((left >>> 24) & 0xff); - out[outOff + 5] = ((left >>> 16) & 0xff); - out[outOff + 6] = ((left >>> 8) & 0xff); - out[outOff + 7] = (left & 0xff); - } - - - public function toString():String { - return "des"; - } - - - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/ECBMode.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/ECBMode.as deleted file mode 100644 index b2a7b77769..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/ECBMode.as +++ /dev/null @@ -1,86 +0,0 @@ -/** - * ECBMode - * - * An ActionScript 3 implementation of the ECB confidentiality mode - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric -{ - import flash.utils.ByteArray; - import com.hurlant.util.Memory; - import com.hurlant.util.Hex; - - /** - * ECB mode. - * This uses a padding and a symmetric key. - * If no padding is given, PKCS#5 is used. - */ - public class ECBMode implements IMode, ICipher - { - private var key:ISymmetricKey; - private var padding:IPad; - - public function ECBMode(key:ISymmetricKey, padding:IPad = null) { - this.key = key; - if (padding == null) { - padding = new PKCS5(key.getBlockSize()); - } else { - padding.setBlockSize(key.getBlockSize()); - } - this.padding = padding; - } - - public function getBlockSize():uint { - return key.getBlockSize(); - } - - public function encrypt(src:ByteArray):void { - padding.pad(src); - src.position = 0; - var blockSize:uint = key.getBlockSize(); - var tmp:ByteArray = new ByteArray; - var dst:ByteArray = new ByteArray; - for (var i:uint=0;i0;i--) { - var v:uint = a[a.length-1]; - a.length--; - if (c!=v) throw new Error("PKCS#5:unpad: Invalid padding value. expected ["+c+"], found ["+v+"]"); - } - // that is all. - } - - public function setBlockSize(bs:uint):void { - blockSize = bs; - } - - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SSLPad.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SSLPad.as deleted file mode 100755 index 8dd13246f7..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SSLPad.as +++ /dev/null @@ -1,44 +0,0 @@ -/** - * TLSPad - * - * A padding implementation used by TLS - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric { - import flash.utils.ByteArray; - import com.hurlant.util.Hex; - import com.hurlant.crypto.tls.TLSError; - - public class SSLPad implements IPad { - private var blockSize:uint; - - public function SSLPad(blockSize:uint=0) { - this.blockSize = blockSize; - } - public function pad(a:ByteArray):void { - var c:uint = blockSize - (a.length+1)%blockSize; - for (var i:uint=0;i<=c;i++) { - a[a.length] = c; - } - - } - public function unpad(a:ByteArray):void { - var c:uint = a.length%blockSize; - if (c!=0) throw new TLSError("SSLPad::unpad: ByteArray.length isn't a multiple of the blockSize", TLSError.bad_record_mac); - c = a[a.length-1]; - for (var i:uint=c;i>0;i--) { - var v:uint = a[a.length-1]; - a.length--; - // But LOOK! SSL 3.0 doesn't care about this, bytes are arbitrary! - // if (c!=v) throw new TLSError("SSLPad:unpad: Invalid padding value. expected ["+c+"], found ["+v+"]", TLSError.bad_record_mac); - } - a.length--; - - } - public function setBlockSize(bs:uint):void { - blockSize = bs; - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SimpleIVMode.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SimpleIVMode.as deleted file mode 100644 index 590f0dfe65..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/SimpleIVMode.as +++ /dev/null @@ -1,60 +0,0 @@ -/** - * SimpleIVMode - * - * A convenience class that automatically places the IV - * at the beginning of the encrypted stream, so it doesn't have to - * be handled explicitely. - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric -{ - import flash.utils.ByteArray; - import com.hurlant.util.Memory; - - public class SimpleIVMode implements IMode, ICipher - { - protected var mode:IVMode; - protected var cipher:ICipher; - - public function SimpleIVMode(mode:IVMode) { - this.mode = mode; - cipher = mode as ICipher; - } - - public function getBlockSize():uint { - return mode.getBlockSize(); - } - - public function dispose():void { - mode.dispose(); - mode = null; - cipher = null; - Memory.gc(); - } - - public function encrypt(src:ByteArray):void { - cipher.encrypt(src); - var tmp:ByteArray = new ByteArray; - tmp.writeBytes(mode.IV); - tmp.writeBytes(src); - src.position=0; - src.writeBytes(tmp); - } - - public function decrypt(src:ByteArray):void { - var tmp:ByteArray = new ByteArray; - tmp.writeBytes(src, 0, getBlockSize()); - mode.IV = tmp; - tmp = new ByteArray; - tmp.writeBytes(src, getBlockSize()); - cipher.decrypt(tmp); - src.length=0; - src.writeBytes(tmp); - } - public function toString():String { - return "simple-"+cipher.toString(); - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TLSPad.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TLSPad.as deleted file mode 100644 index f3b6182c10..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TLSPad.as +++ /dev/null @@ -1,42 +0,0 @@ -/** - * TLSPad - * - * A padding implementation used by TLS - * Copyright (c) 2007 Henri Torgemane - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric { - import flash.utils.ByteArray; - import com.hurlant.util.Hex; - import com.hurlant.crypto.tls.TLSError; - - public class TLSPad implements IPad { - private var blockSize:uint; - - public function TLSPad(blockSize:uint=0) { - this.blockSize = blockSize; - } - public function pad(a:ByteArray):void { - var c:uint = blockSize - (a.length+1)%blockSize; - for (var i:uint=0;i<=c;i++) { - a[a.length] = c; - } - } - public function unpad(a:ByteArray):void { - var c:uint = a.length%blockSize; - if (c!=0) throw new TLSError("TLSPad::unpad: ByteArray.length isn't a multiple of the blockSize", TLSError.bad_record_mac); - c = a[a.length-1]; - for (var i:uint=c;i>0;i--) { - var v:uint = a[a.length-1]; - a.length--; - if (c!=v) throw new TLSError("TLSPad:unpad: Invalid padding value. expected ["+c+"], found ["+v+"]", TLSError.bad_record_mac); - } - a.length--; - // mostly ripped off from PKCS5.as, but with subtle differences - } - public function setBlockSize(bs:uint):void { - blockSize = bs; - } - } -} \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TripleDESKey.as b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TripleDESKey.as deleted file mode 100644 index 1e750117d5..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/flash-src/third-party/com/hurlant/crypto/symmetric/TripleDESKey.as +++ /dev/null @@ -1,88 +0,0 @@ -/** - * TripleDESKey - * - * An Actionscript 3 implementation of Triple DES - * Copyright (c) 2007 Henri Torgemane - * - * Derived from: - * The Bouncy Castle Crypto package, - * Copyright (c) 2000-2004 The Legion Of The Bouncy Castle - * (http://www.bouncycastle.org) - * - * See LICENSE.txt for full license information. - */ -package com.hurlant.crypto.symmetric -{ - import flash.utils.ByteArray; - import com.hurlant.util.Memory; - import com.hurlant.util.Hex; - - public class TripleDESKey extends DESKey - { - protected var encKey2:Array; - protected var encKey3:Array; - protected var decKey2:Array; - protected var decKey3:Array; - - /** - * This supports 2TDES and 3TDES. - * If the key passed is 128 bits, 2TDES is used. - * If the key has 192 bits, 3TDES is used. - * Other key lengths give "undefined" results. - */ - public function TripleDESKey(key:ByteArray) - { - super(key); - encKey2 = generateWorkingKey(false, key, 8); - decKey2 = generateWorkingKey(true, key, 8); - if (key.length>16) { - encKey3 = generateWorkingKey(true, key, 16); - decKey3 = generateWorkingKey(false, key, 16); - } else { - encKey3 = encKey; - decKey3 = decKey; - } - } - - public override function dispose():void - { - super.dispose(); - var i:uint = 0; - if (encKey2!=null) { - for (i=0;i> 5)) + v1) ^ (sum + k[sum & 3]); - sum += delta; - v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); - } - block.position-=8; - block.writeUnsignedInt(v0); - block.writeUnsignedInt(v1); - } - - public function decrypt(block:ByteArray, index:uint=0):void { - block.position = index; - var v0:uint = block.readUnsignedInt(); - var v1:uint = block.readUnsignedInt(); - var i:uint; - var delta:uint = 0x9E3779B9; - var sum:uint = delta*NUM_ROUNDS; - for (i=0; i> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); - sum -= delta; - v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); - } - block.position-=8; - block.writeUnsignedInt(v0); - block.writeUnsignedInt(v1); - } - - public function dispose():void { - //private var k:Array; - var r:Random = new Random; - for (var i:uint=0;i

    - - - - -
    - diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/src/swfobject.js b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/src/swfobject.js deleted file mode 100755 index 9378c8f756..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/src/swfobject.js +++ /dev/null @@ -1,777 +0,0 @@ -/*! SWFObject v2.2 - is released under the MIT License -*/ - -var swfobject = function() { - - var UNDEF = "undefined", - OBJECT = "object", - SHOCKWAVE_FLASH = "Shockwave Flash", - SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", - FLASH_MIME_TYPE = "application/x-shockwave-flash", - EXPRESS_INSTALL_ID = "SWFObjectExprInst", - ON_READY_STATE_CHANGE = "onreadystatechange", - - win = window, - doc = document, - nav = navigator, - - plugin = false, - domLoadFnArr = [main], - regObjArr = [], - objIdArr = [], - listenersArr = [], - storedAltContent, - storedAltContentId, - storedCallbackFn, - storedCallbackObj, - isDomLoaded = false, - isExpressInstallActive = false, - dynamicStylesheet, - dynamicStylesheetMedia, - autoHideShow = true, - - /* Centralized function for browser feature detection - - User agent string detection is only used when no good alternative is possible - - Is executed directly for optimal performance - */ - ua = function() { - var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, - u = nav.userAgent.toLowerCase(), - p = nav.platform.toLowerCase(), - windows = p ? /win/.test(p) : /win/.test(u), - mac = p ? /mac/.test(p) : /mac/.test(u), - webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit - ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html - playerVersion = [0,0,0], - d = null; - if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { - d = nav.plugins[SHOCKWAVE_FLASH].description; - if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+ - plugin = true; - ie = false; // cascaded feature detection for Internet Explorer - d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); - playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); - playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); - playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; - } - } - else if (typeof win.ActiveXObject != UNDEF) { - try { - var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); - if (a) { // a will return null when ActiveX is disabled - d = a.GetVariable("$version"); - if (d) { - ie = true; // cascaded feature detection for Internet Explorer - d = d.split(" ")[1].split(","); - playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; - } - } - } - catch(e) {} - } - return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; - }(), - - /* Cross-browser onDomLoad - - Will fire an event as soon as the DOM of a web page is loaded - - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/ - - Regular onload serves as fallback - */ - onDomLoad = function() { - if (!ua.w3) { return; } - if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically - callDomLoadFunctions(); - } - if (!isDomLoaded) { - if (typeof doc.addEventListener != UNDEF) { - doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false); - } - if (ua.ie && ua.win) { - doc.attachEvent(ON_READY_STATE_CHANGE, function() { - if (doc.readyState == "complete") { - doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); - callDomLoadFunctions(); - } - }); - if (win == top) { // if not inside an iframe - (function(){ - if (isDomLoaded) { return; } - try { - doc.documentElement.doScroll("left"); - } - catch(e) { - setTimeout(arguments.callee, 0); - return; - } - callDomLoadFunctions(); - })(); - } - } - if (ua.wk) { - (function(){ - if (isDomLoaded) { return; } - if (!/loaded|complete/.test(doc.readyState)) { - setTimeout(arguments.callee, 0); - return; - } - callDomLoadFunctions(); - })(); - } - addLoadEvent(callDomLoadFunctions); - } - }(); - - function callDomLoadFunctions() { - if (isDomLoaded) { return; } - try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early - var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span")); - t.parentNode.removeChild(t); - } - catch (e) { return; } - isDomLoaded = true; - var dl = domLoadFnArr.length; - for (var i = 0; i < dl; i++) { - domLoadFnArr[i](); - } - } - - function addDomLoadEvent(fn) { - if (isDomLoaded) { - fn(); - } - else { - domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ - } - } - - /* Cross-browser onload - - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/ - - Will fire an event as soon as a web page including all of its assets are loaded - */ - function addLoadEvent(fn) { - if (typeof win.addEventListener != UNDEF) { - win.addEventListener("load", fn, false); - } - else if (typeof doc.addEventListener != UNDEF) { - doc.addEventListener("load", fn, false); - } - else if (typeof win.attachEvent != UNDEF) { - addListener(win, "onload", fn); - } - else if (typeof win.onload == "function") { - var fnOld = win.onload; - win.onload = function() { - fnOld(); - fn(); - }; - } - else { - win.onload = fn; - } - } - - /* Main function - - Will preferably execute onDomLoad, otherwise onload (as a fallback) - */ - function main() { - if (plugin) { - testPlayerVersion(); - } - else { - matchVersions(); - } - } - - /* Detect the Flash Player version for non-Internet Explorer browsers - - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description: - a. Both release and build numbers can be detected - b. Avoid wrong descriptions by corrupt installers provided by Adobe - c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports - - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available - */ - function testPlayerVersion() { - var b = doc.getElementsByTagName("body")[0]; - var o = createElement(OBJECT); - o.setAttribute("type", FLASH_MIME_TYPE); - var t = b.appendChild(o); - if (t) { - var counter = 0; - (function(){ - if (typeof t.GetVariable != UNDEF) { - var d = t.GetVariable("$version"); - if (d) { - d = d.split(" ")[1].split(","); - ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; - } - } - else if (counter < 10) { - counter++; - setTimeout(arguments.callee, 10); - return; - } - b.removeChild(o); - t = null; - matchVersions(); - })(); - } - else { - matchVersions(); - } - } - - /* Perform Flash Player and SWF version matching; static publishing only - */ - function matchVersions() { - var rl = regObjArr.length; - if (rl > 0) { - for (var i = 0; i < rl; i++) { // for each registered object element - var id = regObjArr[i].id; - var cb = regObjArr[i].callbackFn; - var cbObj = {success:false, id:id}; - if (ua.pv[0] > 0) { - var obj = getElementById(id); - if (obj) { - if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match! - setVisibility(id, true); - if (cb) { - cbObj.success = true; - cbObj.ref = getObjectById(id); - cb(cbObj); - } - } - else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported - var att = {}; - att.data = regObjArr[i].expressInstall; - att.width = obj.getAttribute("width") || "0"; - att.height = obj.getAttribute("height") || "0"; - if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); } - if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); } - // parse HTML object param element's name-value pairs - var par = {}; - var p = obj.getElementsByTagName("param"); - var pl = p.length; - for (var j = 0; j < pl; j++) { - if (p[j].getAttribute("name").toLowerCase() != "movie") { - par[p[j].getAttribute("name")] = p[j].getAttribute("value"); - } - } - showExpressInstall(att, par, id, cb); - } - else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF - displayAltContent(obj); - if (cb) { cb(cbObj); } - } - } - } - else { // if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content) - setVisibility(id, true); - if (cb) { - var o = getObjectById(id); // test whether there is an HTML object element or not - if (o && typeof o.SetVariable != UNDEF) { - cbObj.success = true; - cbObj.ref = o; - } - cb(cbObj); - } - } - } - } - } - - function getObjectById(objectIdStr) { - var r = null; - var o = getElementById(objectIdStr); - if (o && o.nodeName == "OBJECT") { - if (typeof o.SetVariable != UNDEF) { - r = o; - } - else { - var n = o.getElementsByTagName(OBJECT)[0]; - if (n) { - r = n; - } - } - } - return r; - } - - /* Requirements for Adobe Express Install - - only one instance can be active at a time - - fp 6.0.65 or higher - - Win/Mac OS only - - no Webkit engines older than version 312 - */ - function canExpressInstall() { - return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312); - } - - /* Show the Adobe Express Install dialog - - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 - */ - function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { - isExpressInstallActive = true; - storedCallbackFn = callbackFn || null; - storedCallbackObj = {success:false, id:replaceElemIdStr}; - var obj = getElementById(replaceElemIdStr); - if (obj) { - if (obj.nodeName == "OBJECT") { // static publishing - storedAltContent = abstractAltContent(obj); - storedAltContentId = null; - } - else { // dynamic publishing - storedAltContent = obj; - storedAltContentId = replaceElemIdStr; - } - att.id = EXPRESS_INSTALL_ID; - if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; } - if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; } - doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; - var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", - fv = "MMredirectURL=" + win.location.toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; - if (typeof par.flashvars != UNDEF) { - par.flashvars += "&" + fv; - } - else { - par.flashvars = fv; - } - // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it, - // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work - if (ua.ie && ua.win && obj.readyState != 4) { - var newObj = createElement("div"); - replaceElemIdStr += "SWFObjectNew"; - newObj.setAttribute("id", replaceElemIdStr); - obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf - obj.style.display = "none"; - (function(){ - if (obj.readyState == 4) { - obj.parentNode.removeChild(obj); - } - else { - setTimeout(arguments.callee, 10); - } - })(); - } - createSWF(att, par, replaceElemIdStr); - } - } - - /* Functions to abstract and display alternative content - */ - function displayAltContent(obj) { - if (ua.ie && ua.win && obj.readyState != 4) { - // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it, - // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work - var el = createElement("div"); - obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content - el.parentNode.replaceChild(abstractAltContent(obj), el); - obj.style.display = "none"; - (function(){ - if (obj.readyState == 4) { - obj.parentNode.removeChild(obj); - } - else { - setTimeout(arguments.callee, 10); - } - })(); - } - else { - obj.parentNode.replaceChild(abstractAltContent(obj), obj); - } - } - - function abstractAltContent(obj) { - var ac = createElement("div"); - if (ua.win && ua.ie) { - ac.innerHTML = obj.innerHTML; - } - else { - var nestedObj = obj.getElementsByTagName(OBJECT)[0]; - if (nestedObj) { - var c = nestedObj.childNodes; - if (c) { - var cl = c.length; - for (var i = 0; i < cl; i++) { - if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) { - ac.appendChild(c[i].cloneNode(true)); - } - } - } - } - } - return ac; - } - - /* Cross-browser dynamic SWF creation - */ - function createSWF(attObj, parObj, id) { - var r, el = getElementById(id); - if (ua.wk && ua.wk < 312) { return r; } - if (el) { - if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content - attObj.id = id; - } - if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML - var att = ""; - for (var i in attObj) { - if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries - if (i.toLowerCase() == "data") { - parObj.movie = attObj[i]; - } - else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword - att += ' class="' + attObj[i] + '"'; - } - else if (i.toLowerCase() != "classid") { - att += ' ' + i + '="' + attObj[i] + '"'; - } - } - } - var par = ""; - for (var j in parObj) { - if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries - par += ''; - } - } - el.outerHTML = '' + par + ''; - objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only) - r = getElementById(attObj.id); - } - else { // well-behaving browsers - var o = createElement(OBJECT); - o.setAttribute("type", FLASH_MIME_TYPE); - for (var m in attObj) { - if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries - if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword - o.setAttribute("class", attObj[m]); - } - else if (m.toLowerCase() != "classid") { // filter out IE specific attribute - o.setAttribute(m, attObj[m]); - } - } - } - for (var n in parObj) { - if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element - createObjParam(o, n, parObj[n]); - } - } - el.parentNode.replaceChild(o, el); - r = o; - } - } - return r; - } - - function createObjParam(el, pName, pValue) { - var p = createElement("param"); - p.setAttribute("name", pName); - p.setAttribute("value", pValue); - el.appendChild(p); - } - - /* Cross-browser SWF removal - - Especially needed to safely and completely remove a SWF in Internet Explorer - */ - function removeSWF(id) { - var obj = getElementById(id); - if (obj && obj.nodeName == "OBJECT") { - if (ua.ie && ua.win) { - obj.style.display = "none"; - (function(){ - if (obj.readyState == 4) { - removeObjectInIE(id); - } - else { - setTimeout(arguments.callee, 10); - } - })(); - } - else { - obj.parentNode.removeChild(obj); - } - } - } - - function removeObjectInIE(id) { - var obj = getElementById(id); - if (obj) { - for (var i in obj) { - if (typeof obj[i] == "function") { - obj[i] = null; - } - } - obj.parentNode.removeChild(obj); - } - } - - /* Functions to optimize JavaScript compression - */ - function getElementById(id) { - var el = null; - try { - el = doc.getElementById(id); - } - catch (e) {} - return el; - } - - function createElement(el) { - return doc.createElement(el); - } - - /* Updated attachEvent function for Internet Explorer - - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks - */ - function addListener(target, eventType, fn) { - target.attachEvent(eventType, fn); - listenersArr[listenersArr.length] = [target, eventType, fn]; - } - - /* Flash Player and SWF content version matching - */ - function hasPlayerVersion(rv) { - var pv = ua.pv, v = rv.split("."); - v[0] = parseInt(v[0], 10); - v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0" - v[2] = parseInt(v[2], 10) || 0; - return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; - } - - /* Cross-browser dynamic CSS creation - - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php - */ - function createCSS(sel, decl, media, newStyle) { - if (ua.ie && ua.mac) { return; } - var h = doc.getElementsByTagName("head")[0]; - if (!h) { return; } // to also support badly authored HTML pages that lack a head element - var m = (media && typeof media == "string") ? media : "screen"; - if (newStyle) { - dynamicStylesheet = null; - dynamicStylesheetMedia = null; - } - if (!dynamicStylesheet || dynamicStylesheetMedia != m) { - // create dynamic stylesheet + get a global reference to it - var s = createElement("style"); - s.setAttribute("type", "text/css"); - s.setAttribute("media", m); - dynamicStylesheet = h.appendChild(s); - if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) { - dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1]; - } - dynamicStylesheetMedia = m; - } - // add style rule - if (ua.ie && ua.win) { - if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) { - dynamicStylesheet.addRule(sel, decl); - } - } - else { - if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) { - dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}")); - } - } - } - - function setVisibility(id, isVisible) { - if (!autoHideShow) { return; } - var v = isVisible ? "visible" : "hidden"; - if (isDomLoaded && getElementById(id)) { - getElementById(id).style.visibility = v; - } - else { - createCSS("#" + id, "visibility:" + v); - } - } - - /* Filter to avoid XSS attacks - */ - function urlEncodeIfNecessary(s) { - var regex = /[\\\"<>\.;]/; - var hasBadChars = regex.exec(s) != null; - return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s; - } - - /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only) - */ - var cleanup = function() { - if (ua.ie && ua.win) { - window.attachEvent("onunload", function() { - // remove listeners to avoid memory leaks - var ll = listenersArr.length; - for (var i = 0; i < ll; i++) { - listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]); - } - // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect - var il = objIdArr.length; - for (var j = 0; j < il; j++) { - removeSWF(objIdArr[j]); - } - // cleanup library's main closures to avoid memory leaks - for (var k in ua) { - ua[k] = null; - } - ua = null; - for (var l in swfobject) { - swfobject[l] = null; - } - swfobject = null; - }); - } - }(); - - return { - /* Public API - - Reference: http://code.google.com/p/swfobject/wiki/documentation - */ - registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) { - if (ua.w3 && objectIdStr && swfVersionStr) { - var regObj = {}; - regObj.id = objectIdStr; - regObj.swfVersion = swfVersionStr; - regObj.expressInstall = xiSwfUrlStr; - regObj.callbackFn = callbackFn; - regObjArr[regObjArr.length] = regObj; - setVisibility(objectIdStr, false); - } - else if (callbackFn) { - callbackFn({success:false, id:objectIdStr}); - } - }, - - getObjectById: function(objectIdStr) { - if (ua.w3) { - return getObjectById(objectIdStr); - } - }, - - embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { - var callbackObj = {success:false, id:replaceElemIdStr}; - if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { - setVisibility(replaceElemIdStr, false); - addDomLoadEvent(function() { - widthStr += ""; // auto-convert to string - heightStr += ""; - var att = {}; - if (attObj && typeof attObj === OBJECT) { - for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs - att[i] = attObj[i]; - } - } - att.data = swfUrlStr; - att.width = widthStr; - att.height = heightStr; - var par = {}; - if (parObj && typeof parObj === OBJECT) { - for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs - par[j] = parObj[j]; - } - } - if (flashvarsObj && typeof flashvarsObj === OBJECT) { - for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs - if (typeof par.flashvars != UNDEF) { - par.flashvars += "&" + k + "=" + flashvarsObj[k]; - } - else { - par.flashvars = k + "=" + flashvarsObj[k]; - } - } - } - if (hasPlayerVersion(swfVersionStr)) { // create SWF - var obj = createSWF(att, par, replaceElemIdStr); - if (att.id == replaceElemIdStr) { - setVisibility(replaceElemIdStr, true); - } - callbackObj.success = true; - callbackObj.ref = obj; - } - else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install - att.data = xiSwfUrlStr; - showExpressInstall(att, par, replaceElemIdStr, callbackFn); - return; - } - else { // show alternative content - setVisibility(replaceElemIdStr, true); - } - if (callbackFn) { callbackFn(callbackObj); } - }); - } - else if (callbackFn) { callbackFn(callbackObj); } - }, - - switchOffAutoHideShow: function() { - autoHideShow = false; - }, - - ua: ua, - - getFlashPlayerVersion: function() { - return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; - }, - - hasFlashPlayerVersion: hasPlayerVersion, - - createSWF: function(attObj, parObj, replaceElemIdStr) { - if (ua.w3) { - return createSWF(attObj, parObj, replaceElemIdStr); - } - else { - return undefined; - } - }, - - showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) { - if (ua.w3 && canExpressInstall()) { - showExpressInstall(att, par, replaceElemIdStr, callbackFn); - } - }, - - removeSWF: function(objElemIdStr) { - if (ua.w3) { - removeSWF(objElemIdStr); - } - }, - - createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) { - if (ua.w3) { - createCSS(selStr, declStr, mediaStr, newStyleBoolean); - } - }, - - addDomLoadEvent: addDomLoadEvent, - - addLoadEvent: addLoadEvent, - - getQueryParamValue: function(param) { - var q = doc.location.search || doc.location.hash; - if (q) { - if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark - if (param == null) { - return urlEncodeIfNecessary(q); - } - var pairs = q.split("&"); - for (var i = 0; i < pairs.length; i++) { - if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { - return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); - } - } - } - return ""; - }, - - // For internal usage only - expressInstallCallback: function() { - if (isExpressInstallActive) { - var obj = getElementById(EXPRESS_INSTALL_ID); - if (obj && storedAltContent) { - obj.parentNode.replaceChild(storedAltContent, obj); - if (storedAltContentId) { - setVisibility(storedAltContentId, true); - if (ua.ie && ua.win) { storedAltContent.style.display = "block"; } - } - if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); } - } - isExpressInstallActive = false; - } - } - }; -}(); diff --git a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/swfobject.js b/app/Vendor/Ratchet/vendor/gimite/web-socket-js/swfobject.js deleted file mode 100644 index 8eafe9dd83..0000000000 --- a/app/Vendor/Ratchet/vendor/gimite/web-socket-js/swfobject.js +++ /dev/null @@ -1,4 +0,0 @@ -/* SWFObject v2.2 - is released under the MIT License -*/ -var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab -// License: New BSD License -// Reference: http://dev.w3.org/html5/websockets/ -// Reference: http://tools.ietf.org/html/rfc6455 - -(function() { - - if (window.WEB_SOCKET_FORCE_FLASH) { - // Keeps going. - } else if (window.WebSocket) { - return; - } else if (window.MozWebSocket) { - // Firefox. - window.WebSocket = MozWebSocket; - return; - } - - var logger; - if (window.WEB_SOCKET_LOGGER) { - logger = WEB_SOCKET_LOGGER; - } else if (window.console && window.console.log && window.console.error) { - // In some environment, console is defined but console.log or console.error is missing. - logger = window.console; - } else { - logger = {log: function(){ }, error: function(){ }}; - } - - // swfobject.hasFlashPlayerVersion("10.0.0") doesn't work with Gnash. - if (swfobject.getFlashPlayerVersion().major < 10) { - logger.error("Flash Player >= 10.0.0 is required."); - return; - } - if (location.protocol == "file:") { - logger.error( - "WARNING: web-socket-js doesn't work in file:///... URL " + - "unless you set Flash Security Settings properly. " + - "Open the page via Web server i.e. http://..."); - } - - /** - * Our own implementation of WebSocket class using Flash. - * @param {string} url - * @param {array or string} protocols - * @param {string} proxyHost - * @param {int} proxyPort - * @param {string} headers - */ - window.WebSocket = function(url, protocols, proxyHost, proxyPort, headers) { - var self = this; - self.__id = WebSocket.__nextId++; - WebSocket.__instances[self.__id] = self; - self.readyState = WebSocket.CONNECTING; - self.bufferedAmount = 0; - self.__events = {}; - if (!protocols) { - protocols = []; - } else if (typeof protocols == "string") { - protocols = [protocols]; - } - // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc. - // Otherwise, when onopen fires immediately, onopen is called before it is set. - self.__createTask = setTimeout(function() { - WebSocket.__addTask(function() { - self.__createTask = null; - WebSocket.__flash.create( - self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null); - }); - }, 0); - }; - - /** - * Send data to the web socket. - * @param {string} data The data to send to the socket. - * @return {boolean} True for success, false for failure. - */ - WebSocket.prototype.send = function(data) { - if (this.readyState == WebSocket.CONNECTING) { - throw "INVALID_STATE_ERR: Web Socket connection has not been established"; - } - // We use encodeURIComponent() here, because FABridge doesn't work if - // the argument includes some characters. We don't use escape() here - // because of this: - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions - // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't - // preserve all Unicode characters either e.g. "\uffff" in Firefox. - // Note by wtritch: Hopefully this will not be necessary using ExternalInterface. Will require - // additional testing. - var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data)); - if (result < 0) { // success - return true; - } else { - this.bufferedAmount += result; - return false; - } - }; - - /** - * Close this web socket gracefully. - */ - WebSocket.prototype.close = function() { - if (this.__createTask) { - clearTimeout(this.__createTask); - this.__createTask = null; - this.readyState = WebSocket.CLOSED; - return; - } - if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) { - return; - } - this.readyState = WebSocket.CLOSING; - WebSocket.__flash.close(this.__id); - }; - - /** - * Implementation of {@link
    DOM 2 EventTarget Interface} - * - * @param {string} type - * @param {function} listener - * @param {boolean} useCapture - * @return void - */ - WebSocket.prototype.addEventListener = function(type, listener, useCapture) { - if (!(type in this.__events)) { - this.__events[type] = []; - } - this.__events[type].push(listener); - }; - - /** - * Implementation of {@link DOM 2 EventTarget Interface} - * - * @param {string} type - * @param {function} listener - * @param {boolean} useCapture - * @return void - */ - WebSocket.prototype.removeEventListener = function(type, listener, useCapture) { - if (!(type in this.__events)) return; - var events = this.__events[type]; - for (var i = events.length - 1; i >= 0; --i) { - if (events[i] === listener) { - events.splice(i, 1); - break; - } - } - }; - - /** - * Implementation of {@link DOM 2 EventTarget Interface} - * - * @param {Event} event - * @return void - */ - WebSocket.prototype.dispatchEvent = function(event) { - var events = this.__events[event.type] || []; - for (var i = 0; i < events.length; ++i) { - events[i](event); - } - var handler = this["on" + event.type]; - if (handler) handler.apply(this, [event]); - }; - - /** - * Handles an event from Flash. - * @param {Object} flashEvent - */ - WebSocket.prototype.__handleEvent = function(flashEvent) { - - if ("readyState" in flashEvent) { - this.readyState = flashEvent.readyState; - } - if ("protocol" in flashEvent) { - this.protocol = flashEvent.protocol; - } - - var jsEvent; - if (flashEvent.type == "open" || flashEvent.type == "error") { - jsEvent = this.__createSimpleEvent(flashEvent.type); - } else if (flashEvent.type == "close") { - jsEvent = this.__createSimpleEvent("close"); - jsEvent.wasClean = flashEvent.wasClean ? true : false; - jsEvent.code = flashEvent.code; - jsEvent.reason = flashEvent.reason; - } else if (flashEvent.type == "message") { - var data = decodeURIComponent(flashEvent.message); - jsEvent = this.__createMessageEvent("message", data); - } else { - throw "unknown event type: " + flashEvent.type; - } - - this.dispatchEvent(jsEvent); - - }; - - WebSocket.prototype.__createSimpleEvent = function(type) { - if (document.createEvent && window.Event) { - var event = document.createEvent("Event"); - event.initEvent(type, false, false); - return event; - } else { - return {type: type, bubbles: false, cancelable: false}; - } - }; - - WebSocket.prototype.__createMessageEvent = function(type, data) { - if (window.MessageEvent && typeof(MessageEvent) == "function" && !window.opera) { - return new MessageEvent("message", { - "view": window, - "bubbles": false, - "cancelable": false, - "data": data - }); - } else if (document.createEvent && window.MessageEvent && !window.opera) { - var event = document.createEvent("MessageEvent"); - event.initMessageEvent("message", false, false, data, null, null, window, null); - return event; - } else { - // Old IE and Opera, the latter one truncates the data parameter after any 0x00 bytes. - return {type: type, data: data, bubbles: false, cancelable: false}; - } - }; - - /** - * Define the WebSocket readyState enumeration. - */ - WebSocket.CONNECTING = 0; - WebSocket.OPEN = 1; - WebSocket.CLOSING = 2; - WebSocket.CLOSED = 3; - - // Field to check implementation of WebSocket. - WebSocket.__isFlashImplementation = true; - WebSocket.__initialized = false; - WebSocket.__flash = null; - WebSocket.__instances = {}; - WebSocket.__tasks = []; - WebSocket.__nextId = 0; - - /** - * Load a new flash security policy file. - * @param {string} url - */ - WebSocket.loadFlashPolicyFile = function(url){ - WebSocket.__addTask(function() { - WebSocket.__flash.loadManualPolicyFile(url); - }); - }; - - /** - * Loads WebSocketMain.swf and creates WebSocketMain object in Flash. - */ - WebSocket.__initialize = function() { - - if (WebSocket.__initialized) return; - WebSocket.__initialized = true; - - if (WebSocket.__swfLocation) { - // For backword compatibility. - window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation; - } - if (!window.WEB_SOCKET_SWF_LOCATION) { - logger.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf"); - return; - } - if (!window.WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR && - !WEB_SOCKET_SWF_LOCATION.match(/(^|\/)WebSocketMainInsecure\.swf(\?.*)?$/) && - WEB_SOCKET_SWF_LOCATION.match(/^\w+:\/\/([^\/]+)/)) { - var swfHost = RegExp.$1; - if (location.host != swfHost) { - logger.error( - "[WebSocket] You must host HTML and WebSocketMain.swf in the same host " + - "('" + location.host + "' != '" + swfHost + "'). " + - "See also 'How to host HTML file and SWF file in different domains' section " + - "in README.md. If you use WebSocketMainInsecure.swf, you can suppress this message " + - "by WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR = true;"); - } - } - var container = document.createElement("div"); - container.id = "webSocketContainer"; - // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents - // Flash from loading at least in IE. So we move it out of the screen at (-100, -100). - // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash - // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is - // the best we can do as far as we know now. - container.style.position = "absolute"; - if (WebSocket.__isFlashLite()) { - container.style.left = "0px"; - container.style.top = "0px"; - } else { - container.style.left = "-100px"; - container.style.top = "-100px"; - } - var holder = document.createElement("div"); - holder.id = "webSocketFlash"; - container.appendChild(holder); - document.body.appendChild(container); - // See this article for hasPriority: - // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html - swfobject.embedSWF( - WEB_SOCKET_SWF_LOCATION, - "webSocketFlash", - "1" /* width */, - "1" /* height */, - "10.0.0" /* SWF version */, - null, - null, - {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"}, - null, - function(e) { - if (!e.success) { - logger.error("[WebSocket] swfobject.embedSWF failed"); - } - } - ); - - }; - - /** - * Called by Flash to notify JS that it's fully loaded and ready - * for communication. - */ - WebSocket.__onFlashInitialized = function() { - // We need to set a timeout here to avoid round-trip calls - // to flash during the initialization process. - setTimeout(function() { - WebSocket.__flash = document.getElementById("webSocketFlash"); - WebSocket.__flash.setCallerUrl(location.href); - WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG); - for (var i = 0; i < WebSocket.__tasks.length; ++i) { - WebSocket.__tasks[i](); - } - WebSocket.__tasks = []; - }, 0); - }; - - /** - * Called by Flash to notify WebSockets events are fired. - */ - WebSocket.__onFlashEvent = function() { - setTimeout(function() { - try { - // Gets events using receiveEvents() instead of getting it from event object - // of Flash event. This is to make sure to keep message order. - // It seems sometimes Flash events don't arrive in the same order as they are sent. - var events = WebSocket.__flash.receiveEvents(); - for (var i = 0; i < events.length; ++i) { - WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]); - } - } catch (e) { - logger.error(e); - } - }, 0); - return true; - }; - - // Called by Flash. - WebSocket.__log = function(message) { - logger.log(decodeURIComponent(message)); - }; - - // Called by Flash. - WebSocket.__error = function(message) { - logger.error(decodeURIComponent(message)); - }; - - WebSocket.__addTask = function(task) { - if (WebSocket.__flash) { - task(); - } else { - WebSocket.__tasks.push(task); - } - }; - - /** - * Test if the browser is running flash lite. - * @return {boolean} True if flash lite is running, false otherwise. - */ - WebSocket.__isFlashLite = function() { - if (!window.navigator || !window.navigator.mimeTypes) { - return false; - } - var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"]; - if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) { - return false; - } - return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false; - }; - - if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) { - // NOTE: - // This fires immediately if web_socket.js is dynamically loaded after - // the document is loaded. - swfobject.addDomLoadEvent(function() { - WebSocket.__initialize(); - }); - } - -})(); diff --git a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php b/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php deleted file mode 100644 index d1e842b1cf..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php +++ /dev/null @@ -1,49 +0,0 @@ -eventDispatcher = $eventDispatcher; - - return $this; - } - - public function getEventDispatcher() - { - if (!$this->eventDispatcher) { - $this->eventDispatcher = new EventDispatcher(); - } - - return $this->eventDispatcher; - } - - public function dispatch($eventName, array $context = array()) - { - return $this->getEventDispatcher()->dispatch($eventName, new Event($context)); - } - - public function addSubscriber(EventSubscriberInterface $subscriber) - { - $this->getEventDispatcher()->addSubscriber($subscriber); - - return $this; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Collection.php b/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Collection.php deleted file mode 100644 index 5cb1535d07..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Collection.php +++ /dev/null @@ -1,403 +0,0 @@ -data = $data; - } - - /** - * Create a new collection from an array, validate the keys, and add default values where missing - * - * @param array $config Configuration values to apply. - * @param array $defaults Default parameters - * @param array $required Required parameter names - * - * @return self - * @throws InvalidArgumentException if a parameter is missing - */ - public static function fromConfig(array $config = array(), array $defaults = array(), array $required = array()) - { - $data = $config + $defaults; - - if ($missing = array_diff($required, array_keys($data))) { - throw new InvalidArgumentException('Config is missing the following keys: ' . implode(', ', $missing)); - } - - return new self($data); - } - - public function count() - { - return count($this->data); - } - - public function getIterator() - { - return new \ArrayIterator($this->data); - } - - public function toArray() - { - return $this->data; - } - - /** - * Removes all key value pairs - * - * @return Collection - */ - public function clear() - { - $this->data = array(); - - return $this; - } - - /** - * Get all or a subset of matching key value pairs - * - * @param array $keys Pass an array of keys to retrieve only a subset of key value pairs - * - * @return array Returns an array of all matching key value pairs - */ - public function getAll(array $keys = null) - { - return $keys ? array_intersect_key($this->data, array_flip($keys)) : $this->data; - } - - /** - * Get a specific key value. - * - * @param string $key Key to retrieve. - * - * @return mixed|null Value of the key or NULL - */ - public function get($key) - { - return isset($this->data[$key]) ? $this->data[$key] : null; - } - - /** - * Set a key value pair - * - * @param string $key Key to set - * @param mixed $value Value to set - * - * @return Collection Returns a reference to the object - */ - public function set($key, $value) - { - $this->data[$key] = $value; - - return $this; - } - - /** - * Add a value to a key. If a key of the same name has already been added, the key value will be converted into an - * array and the new value will be pushed to the end of the array. - * - * @param string $key Key to add - * @param mixed $value Value to add to the key - * - * @return Collection Returns a reference to the object. - */ - public function add($key, $value) - { - if (!array_key_exists($key, $this->data)) { - $this->data[$key] = $value; - } elseif (is_array($this->data[$key])) { - $this->data[$key][] = $value; - } else { - $this->data[$key] = array($this->data[$key], $value); - } - - return $this; - } - - /** - * Remove a specific key value pair - * - * @param string $key A key to remove - * - * @return Collection - */ - public function remove($key) - { - unset($this->data[$key]); - - return $this; - } - - /** - * Get all keys in the collection - * - * @return array - */ - public function getKeys() - { - return array_keys($this->data); - } - - /** - * Returns whether or not the specified key is present. - * - * @param string $key The key for which to check the existence. - * - * @return bool - */ - public function hasKey($key) - { - return array_key_exists($key, $this->data); - } - - /** - * Case insensitive search the keys in the collection - * - * @param string $key Key to search for - * - * @return bool|string Returns false if not found, otherwise returns the key - */ - public function keySearch($key) - { - foreach (array_keys($this->data) as $k) { - if (!strcasecmp($k, $key)) { - return $k; - } - } - - return false; - } - - /** - * Checks if any keys contains a certain value - * - * @param string $value Value to search for - * - * @return mixed Returns the key if the value was found FALSE if the value was not found. - */ - public function hasValue($value) - { - return array_search($value, $this->data); - } - - /** - * Replace the data of the object with the value of an array - * - * @param array $data Associative array of data - * - * @return Collection Returns a reference to the object - */ - public function replace(array $data) - { - $this->data = $data; - - return $this; - } - - /** - * Add and merge in a Collection or array of key value pair data. - * - * @param Collection|array $data Associative array of key value pair data - * - * @return Collection Returns a reference to the object. - */ - public function merge($data) - { - foreach ($data as $key => $value) { - $this->add($key, $value); - } - - return $this; - } - - /** - * Over write key value pairs in this collection with all of the data from an array or collection. - * - * @param array|\Traversable $data Values to override over this config - * - * @return self - */ - public function overwriteWith($data) - { - if (is_array($data)) { - $this->data = $data + $this->data; - } elseif ($data instanceof Collection) { - $this->data = $data->toArray() + $this->data; - } else { - foreach ($data as $key => $value) { - $this->data[$key] = $value; - } - } - - return $this; - } - - /** - * Returns a Collection containing all the elements of the collection after applying the callback function to each - * one. The Closure should accept three parameters: (string) $key, (string) $value, (array) $context and return a - * modified value - * - * @param \Closure $closure Closure to apply - * @param array $context Context to pass to the closure - * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection - * - * @return Collection - */ - public function map(\Closure $closure, array $context = array(), $static = true) - { - $collection = $static ? new static() : new self(); - foreach ($this as $key => $value) { - $collection->add($key, $closure($key, $value, $context)); - } - - return $collection; - } - - /** - * Iterates over each key value pair in the collection passing them to the Closure. If the Closure function returns - * true, the current value from input is returned into the result Collection. The Closure must accept three - * parameters: (string) $key, (string) $value and return Boolean TRUE or FALSE for each value. - * - * @param \Closure $closure Closure evaluation function - * @param bool $static Set to TRUE to use the same class as the return rather than returning a Collection - * - * @return Collection - */ - public function filter(\Closure $closure, $static = true) - { - $collection = ($static) ? new static() : new self(); - foreach ($this->data as $key => $value) { - if ($closure($key, $value)) { - $collection->add($key, $value); - } - } - - return $collection; - } - - public function offsetExists($offset) - { - return isset($this->data[$offset]); - } - - public function offsetGet($offset) - { - return isset($this->data[$offset]) ? $this->data[$offset] : null; - } - - public function offsetSet($offset, $value) - { - $this->data[$offset] = $value; - } - - public function offsetUnset($offset) - { - unset($this->data[$offset]); - } - - /** - * Set a value into a nested array key. Keys will be created as needed to set the value. - * - * @param string $path Path to set - * @param mixed $value Value to set at the key - * - * @return self - * @throws RuntimeException when trying to setPath using a nested path that travels through a scalar value - */ - public function setPath($path, $value) - { - $current =& $this->data; - $queue = explode('/', $path); - while (null !== ($key = array_shift($queue))) { - if (!is_array($current)) { - throw new RuntimeException("Trying to setPath {$path}, but {$key} is set and is not an array"); - } elseif (!$queue) { - $current[$key] = $value; - } elseif (isset($current[$key])) { - $current =& $current[$key]; - } else { - $current[$key] = array(); - $current =& $current[$key]; - } - } - - return $this; - } - - /** - * Gets a value from the collection using an array path (e.g. foo/baz/bar would retrieve bar from two nested arrays) - * Allows for wildcard searches which recursively combine matches up to the level at which the wildcard occurs. This - * can be useful for accepting any key of a sub-array and combining matching keys from each diverging path. - * - * @param string $path Path to traverse and retrieve a value from - * @param string $separator Character used to add depth to the search - * @param mixed $data Optional data to descend into (used when wildcards are encountered) - * - * @return mixed|null - */ - public function getPath($path, $separator = '/', $data = null) - { - if ($data === null) { - $data =& $this->data; - } - - $path = is_array($path) ? $path : explode($separator, $path); - while (null !== ($part = array_shift($path))) { - if (!is_array($data)) { - return null; - } elseif (isset($data[$part])) { - $data =& $data[$part]; - } elseif ($part != '*') { - return null; - } else { - // Perform a wildcard search by diverging and merging paths - $result = array(); - foreach ($data as $value) { - if (!$path) { - $result = array_merge_recursive($result, (array) $value); - } elseif (null !== ($test = $this->getPath($path, $separator, $value))) { - $result = array_merge_recursive($result, (array) $test); - } - } - return $result; - } - } - - return $data; - } - - /** - * Inject configuration settings into an input string - * - * @param string $input Input to inject - * - * @return string - * @deprecated - */ - public function inject($input) - { - Version::warn(__METHOD__ . ' is deprecated'); - $replace = array(); - foreach ($this->data as $key => $val) { - $replace['{' . $key . '}'] = $val; - } - - return strtr($input, $replace); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Event.php b/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Event.php deleted file mode 100644 index fad76a9b81..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Event.php +++ /dev/null @@ -1,52 +0,0 @@ -context = $context; - } - - public function getIterator() - { - return new \ArrayIterator($this->context); - } - - public function offsetGet($offset) - { - return isset($this->context[$offset]) ? $this->context[$offset] : null; - } - - public function offsetSet($offset, $value) - { - $this->context[$offset] = $value; - } - - public function offsetExists($offset) - { - return isset($this->context[$offset]); - } - - public function offsetUnset($offset) - { - unset($this->context[$offset]); - } - - public function toArray() - { - return $this->context; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php b/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php deleted file mode 100644 index 08d1c7256d..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/BadMethodCallException.php +++ /dev/null @@ -1,5 +0,0 @@ -shortMessage = $message; - } - - /** - * Set all of the exceptions - * - * @param array $exceptions Array of exceptions - * - * @return self - */ - public function setExceptions(array $exceptions) - { - $this->exceptions = array(); - foreach ($exceptions as $exception) { - $this->add($exception); - } - - return $this; - } - - /** - * Add exceptions to the collection - * - * @param ExceptionCollection|\Exception $e Exception to add - * - * @return ExceptionCollection; - */ - public function add($e) - { - $this->exceptions[] = $e; - if ($this->message) { - $this->message .= "\n"; - } - - $this->message .= $this->getExceptionMessage($e, 0); - - return $this; - } - - /** - * Get the total number of request exceptions - * - * @return int - */ - public function count() - { - return count($this->exceptions); - } - - /** - * Allows array-like iteration over the request exceptions - * - * @return \ArrayIterator - */ - public function getIterator() - { - return new \ArrayIterator($this->exceptions); - } - - /** - * Get the first exception in the collection - * - * @return \Exception - */ - public function getFirst() - { - return $this->exceptions ? $this->exceptions[0] : null; - } - - private function getExceptionMessage(\Exception $e, $depth = 0) - { - static $sp = ' '; - $prefix = $depth ? str_repeat($sp, $depth) : ''; - $message = "{$prefix}(" . get_class($e) . ') ' . $e->getFile() . ' line ' . $e->getLine() . "\n"; - - if ($e instanceof self) { - if ($e->shortMessage) { - $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->shortMessage) . "\n"; - } - foreach ($e as $ee) { - $message .= "\n" . $this->getExceptionMessage($ee, $depth + 1); - } - } else { - $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getMessage()) . "\n"; - $message .= "\n{$prefix}{$sp}" . str_replace("\n", "\n{$prefix}{$sp}", $e->getTraceAsString()) . "\n"; - } - - return str_replace(getcwd(), '.', $message); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php b/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php deleted file mode 100644 index 458e6f2ea1..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/common/Guzzle/Common/Exception/GuzzleException.php +++ /dev/null @@ -1,8 +0,0 @@ -=5.3.2", - "symfony/event-dispatcher": ">=2.1" - }, - "autoload": { - "psr-0": { "Guzzle\\Common": "" } - }, - "target-dir": "Guzzle/Common", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php deleted file mode 100644 index 5005a887cf..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/AbstractEntityBodyDecorator.php +++ /dev/null @@ -1,221 +0,0 @@ -body = $body; - } - - public function __toString() - { - return (string) $this->body; - } - - /** - * Allow decorators to implement custom methods - * - * @param string $method Missing method name - * @param array $args Method arguments - * - * @return mixed - */ - public function __call($method, array $args) - { - return call_user_func_array(array($this->body, $method), $args); - } - - public function close() - { - return $this->body->close(); - } - - public function setRewindFunction($callable) - { - $this->body->setRewindFunction($callable); - - return $this; - } - - public function rewind() - { - return $this->body->rewind(); - } - - public function compress($filter = 'zlib.deflate') - { - return $this->body->compress($filter); - } - - public function uncompress($filter = 'zlib.inflate') - { - return $this->body->uncompress($filter); - } - - public function getContentLength() - { - return $this->getSize(); - } - - public function getContentType() - { - return $this->body->getContentType(); - } - - public function getContentMd5($rawOutput = false, $base64Encode = false) - { - $hash = Stream::getHash($this, 'md5', $rawOutput); - - return $hash && $base64Encode ? base64_encode($hash) : $hash; - } - - public function getContentEncoding() - { - return $this->body->getContentEncoding(); - } - - public function getMetaData($key = null) - { - return $this->body->getMetaData($key); - } - - public function getStream() - { - return $this->body->getStream(); - } - - public function setStream($stream, $size = 0) - { - $this->body->setStream($stream, $size); - - return $this; - } - - public function detachStream() - { - $this->body->detachStream(); - - return $this; - } - - public function getWrapper() - { - return $this->body->getWrapper(); - } - - public function getWrapperData() - { - return $this->body->getWrapperData(); - } - - public function getStreamType() - { - return $this->body->getStreamType(); - } - - public function getUri() - { - return $this->body->getUri(); - } - - public function getSize() - { - return $this->body->getSize(); - } - - public function isReadable() - { - return $this->body->isReadable(); - } - - public function isRepeatable() - { - return $this->isSeekable() && $this->isReadable(); - } - - public function isWritable() - { - return $this->body->isWritable(); - } - - public function isConsumed() - { - return $this->body->isConsumed(); - } - - /** - * Alias of isConsumed() - * {@inheritdoc} - */ - public function feof() - { - return $this->isConsumed(); - } - - public function isLocal() - { - return $this->body->isLocal(); - } - - public function isSeekable() - { - return $this->body->isSeekable(); - } - - public function setSize($size) - { - $this->body->setSize($size); - - return $this; - } - - public function seek($offset, $whence = SEEK_SET) - { - return $this->body->seek($offset, $whence); - } - - public function read($length) - { - return $this->body->read($length); - } - - public function write($string) - { - return $this->body->write($string); - } - - public function readLine($maxLength = null) - { - return $this->body->readLine($maxLength); - } - - public function ftell() - { - return $this->body->ftell(); - } - - public function getCustomData($key) - { - return $this->body->getCustomData($key); - } - - public function setCustomData($key, $value) - { - $this->body->setCustomData($key, $value); - - return $this; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php deleted file mode 100644 index c65c136504..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/CachingEntityBody.php +++ /dev/null @@ -1,229 +0,0 @@ -remoteStream = $body; - $this->body = new EntityBody(fopen('php://temp', 'r+')); - } - - /** - * Will give the contents of the buffer followed by the exhausted remote stream. - * - * Warning: Loads the entire stream into memory - * - * @return string - */ - public function __toString() - { - $pos = $this->ftell(); - $this->rewind(); - - $str = ''; - while (!$this->isConsumed()) { - $str .= $this->read(16384); - } - - $this->seek($pos); - - return $str; - } - - public function getSize() - { - return max($this->body->getSize(), $this->remoteStream->getSize()); - } - - /** - * {@inheritdoc} - * @throws RuntimeException When seeking with SEEK_END or when seeking past the total size of the buffer stream - */ - public function seek($offset, $whence = SEEK_SET) - { - if ($whence == SEEK_SET) { - $byte = $offset; - } elseif ($whence == SEEK_CUR) { - $byte = $offset + $this->ftell(); - } else { - throw new RuntimeException(__CLASS__ . ' supports only SEEK_SET and SEEK_CUR seek operations'); - } - - // You cannot skip ahead past where you've read from the remote stream - if ($byte > $this->body->getSize()) { - throw new RuntimeException( - "Cannot seek to byte {$byte} when the buffered stream only contains {$this->body->getSize()} bytes" - ); - } - - return $this->body->seek($byte); - } - - public function rewind() - { - return $this->seek(0); - } - - /** - * Does not support custom rewind functions - * - * @throws RuntimeException - */ - public function setRewindFunction($callable) - { - throw new RuntimeException(__CLASS__ . ' does not support custom stream rewind functions'); - } - - public function read($length) - { - // Perform a regular read on any previously read data from the buffer - $data = $this->body->read($length); - $remaining = $length - strlen($data); - - // More data was requested so read from the remote stream - if ($remaining) { - // If data was written to the buffer in a position that would have been filled from the remote stream, - // then we must skip bytes on the remote stream to emulate overwriting bytes from that position. This - // mimics the behavior of other PHP stream wrappers. - $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes); - - if ($this->skipReadBytes) { - $len = strlen($remoteData); - $remoteData = substr($remoteData, $this->skipReadBytes); - $this->skipReadBytes = max(0, $this->skipReadBytes - $len); - } - - $data .= $remoteData; - $this->body->write($remoteData); - } - - return $data; - } - - public function write($string) - { - // When appending to the end of the currently read stream, you'll want to skip bytes from being read from - // the remote stream to emulate other stream wrappers. Basically replacing bytes of data of a fixed length. - $overflow = (strlen($string) + $this->ftell()) - $this->remoteStream->ftell(); - if ($overflow > 0) { - $this->skipReadBytes += $overflow; - } - - return $this->body->write($string); - } - - /** - * {@inheritdoc} - * @link http://php.net/manual/en/function.fgets.php - */ - public function readLine($maxLength = null) - { - $buffer = ''; - $size = 0; - while (!$this->isConsumed()) { - $byte = $this->read(1); - $buffer .= $byte; - // Break when a new line is found or the max length - 1 is reached - if ($byte == PHP_EOL || ++$size == $maxLength - 1) { - break; - } - } - - return $buffer; - } - - public function isConsumed() - { - return $this->body->isConsumed() && $this->remoteStream->isConsumed(); - } - - /** - * Close both the remote stream and buffer stream - */ - public function close() - { - return $this->remoteStream->close() && $this->body->close(); - } - - public function setStream($stream, $size = 0) - { - $this->remoteStream->setStream($stream, $size); - } - - public function getContentType() - { - return $this->remoteStream->getContentType(); - } - - public function getContentEncoding() - { - return $this->remoteStream->getContentEncoding(); - } - - public function getMetaData($key = null) - { - return $this->remoteStream->getMetaData($key); - } - - public function getStream() - { - return $this->remoteStream->getStream(); - } - - public function getWrapper() - { - return $this->remoteStream->getWrapper(); - } - - public function getWrapperData() - { - return $this->remoteStream->getWrapperData(); - } - - public function getStreamType() - { - return $this->remoteStream->getStreamType(); - } - - public function getUri() - { - return $this->remoteStream->getUri(); - } - - /** - * Always retrieve custom data from the remote stream - * {@inheritdoc} - */ - public function getCustomData($key) - { - return $this->remoteStream->getCustomData($key); - } - - /** - * Always set custom data on the remote stream - * {@inheritdoc} - */ - public function setCustomData($key, $value) - { - $this->remoteStream->setCustomData($key, $value); - - return $this; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Client.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Client.php deleted file mode 100644 index 3bda450e19..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Client.php +++ /dev/null @@ -1,506 +0,0 @@ -setConfig($config ?: new Collection()); - $this->initSsl(); - $this->setBaseUrl($baseUrl); - $this->defaultHeaders = new Collection(); - $this->setRequestFactory(RequestFactory::getInstance()); - $this->userAgent = $this->getDefaultUserAgent(); - if (!$this->config[self::DISABLE_REDIRECTS]) { - $this->addSubscriber(new RedirectPlugin()); - } - } - - final public function setConfig($config) - { - if ($config instanceof Collection) { - $this->config = $config; - } elseif (is_array($config)) { - $this->config = new Collection($config); - } else { - throw new InvalidArgumentException('Config must be an array or Collection'); - } - - return $this; - } - - final public function getConfig($key = false) - { - return $key ? $this->config[$key] : $this->config; - } - - /** - * Set a default request option on the client that will be used as a default for each request - * - * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo) - * @param mixed $value Value to set - * - * @return $this - */ - public function setDefaultOption($keyOrPath, $value) - { - $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath; - $this->config->setPath($keyOrPath, $value); - - return $this; - } - - /** - * Retrieve a default request option from the client - * - * @param string $keyOrPath request.options key (e.g. allow_redirects) or path to a nested key (e.g. headers/foo) - * - * @return mixed|null - */ - public function getDefaultOption($keyOrPath) - { - $keyOrPath = self::REQUEST_OPTIONS . '/' . $keyOrPath; - - return $this->config->getPath($keyOrPath); - } - - final public function setSslVerification($certificateAuthority = true, $verifyPeer = true, $verifyHost = 2) - { - $opts = $this->config[self::CURL_OPTIONS] ?: array(); - - if ($certificateAuthority === true) { - // use bundled CA bundle, set secure defaults - $opts[CURLOPT_CAINFO] = __DIR__ . '/Resources/cacert.pem'; - $opts[CURLOPT_SSL_VERIFYPEER] = true; - $opts[CURLOPT_SSL_VERIFYHOST] = 2; - } elseif ($certificateAuthority === false) { - unset($opts[CURLOPT_CAINFO]); - $opts[CURLOPT_SSL_VERIFYPEER] = false; - $opts[CURLOPT_SSL_VERIFYHOST] = 0; - } elseif ($verifyPeer !== true && $verifyPeer !== false && $verifyPeer !== 1 && $verifyPeer !== 0) { - throw new InvalidArgumentException('verifyPeer must be 1, 0 or boolean'); - } elseif ($verifyHost !== 0 && $verifyHost !== 1 && $verifyHost !== 2) { - throw new InvalidArgumentException('verifyHost must be 0, 1 or 2'); - } else { - $opts[CURLOPT_SSL_VERIFYPEER] = $verifyPeer; - $opts[CURLOPT_SSL_VERIFYHOST] = $verifyHost; - if (is_file($certificateAuthority)) { - unset($opts[CURLOPT_CAPATH]); - $opts[CURLOPT_CAINFO] = $certificateAuthority; - } elseif (is_dir($certificateAuthority)) { - unset($opts[CURLOPT_CAINFO]); - $opts[CURLOPT_CAPATH] = $certificateAuthority; - } else { - throw new RuntimeException( - 'Invalid option passed to ' . self::SSL_CERT_AUTHORITY . ': ' . $certificateAuthority - ); - } - } - - $this->config->set(self::CURL_OPTIONS, $opts); - - return $this; - } - - public function createRequest($method = 'GET', $uri = null, $headers = null, $body = null, array $options = array()) - { - if (!$uri) { - $url = $this->getBaseUrl(); - } else { - if (!is_array($uri)) { - $templateVars = null; - } else { - list($uri, $templateVars) = $uri; - } - if (substr($uri, 0, 4) === 'http') { - // Use absolute URLs as-is - $url = $this->expandTemplate($uri, $templateVars); - } else { - $url = Url::factory($this->getBaseUrl())->combine($this->expandTemplate($uri, $templateVars)); - } - } - - // If default headers are provided, then merge them under any explicitly provided headers for the request - if (count($this->defaultHeaders)) { - if (!$headers) { - $headers = $this->defaultHeaders->toArray(); - } elseif (is_array($headers)) { - $headers += $this->defaultHeaders->toArray(); - } elseif ($headers instanceof Collection) { - $headers = $headers->toArray() + $this->defaultHeaders->toArray(); - } - } - - return $this->prepareRequest($this->requestFactory->create($method, (string) $url, $headers, $body), $options); - } - - public function getBaseUrl($expand = true) - { - return $expand ? $this->expandTemplate($this->baseUrl) : $this->baseUrl; - } - - public function setBaseUrl($url) - { - $this->baseUrl = $url; - - return $this; - } - - public function setUserAgent($userAgent, $includeDefault = false) - { - if ($includeDefault) { - $userAgent .= ' ' . $this->getDefaultUserAgent(); - } - $this->userAgent = $userAgent; - - return $this; - } - - /** - * Get the default User-Agent string to use with Guzzle - * - * @return string - */ - public function getDefaultUserAgent() - { - return 'Guzzle/' . Version::VERSION - . ' curl/' . CurlVersion::getInstance()->get('version') - . ' PHP/' . PHP_VERSION; - } - - public function get($uri = null, $headers = null, $options = array()) - { - // BC compat: $options can be a string, resource, etc to specify where the response body is downloaded - return is_array($options) - ? $this->createRequest('GET', $uri, $headers, null, $options) - : $this->createRequest('GET', $uri, $headers, $options); - } - - public function head($uri = null, $headers = null, array $options = array()) - { - return $this->createRequest('HEAD', $uri, $headers, null, $options); - } - - public function delete($uri = null, $headers = null, $body = null, array $options = array()) - { - return $this->createRequest('DELETE', $uri, $headers, $body, $options); - } - - public function put($uri = null, $headers = null, $body = null, array $options = array()) - { - return $this->createRequest('PUT', $uri, $headers, $body, $options); - } - - public function patch($uri = null, $headers = null, $body = null, array $options = array()) - { - return $this->createRequest('PATCH', $uri, $headers, $body, $options); - } - - public function post($uri = null, $headers = null, $postBody = null, array $options = array()) - { - return $this->createRequest('POST', $uri, $headers, $postBody, $options); - } - - public function options($uri = null, array $options = array()) - { - return $this->createRequest('OPTIONS', $uri, $options); - } - - public function send($requests) - { - if (!($requests instanceof RequestInterface)) { - return $this->sendMultiple($requests); - } - - try { - /** @var $requests RequestInterface */ - $this->getCurlMulti()->add($requests)->send(); - return $requests->getResponse(); - } catch (ExceptionCollection $e) { - throw $e->getFirst(); - } - } - - /** - * Set a curl multi object to be used internally by the client for transferring requests. - * - * @param CurlMultiInterface $curlMulti Multi object - * - * @return self - */ - public function setCurlMulti(CurlMultiInterface $curlMulti) - { - $this->curlMulti = $curlMulti; - - return $this; - } - - /** - * @return CurlMultiInterface|CurlMultiProxy - */ - public function getCurlMulti() - { - if (!$this->curlMulti) { - $this->curlMulti = new CurlMultiProxy(); - } - - return $this->curlMulti; - } - - public function setRequestFactory(RequestFactoryInterface $factory) - { - $this->requestFactory = $factory; - - return $this; - } - - /** - * Set the URI template expander to use with the client - * - * @param UriTemplateInterface $uriTemplate URI template expander - * - * @return self - */ - public function setUriTemplate(UriTemplateInterface $uriTemplate) - { - $this->uriTemplate = $uriTemplate; - - return $this; - } - - /** - * Copy the cacert.pem file from the phar if it is not in the temp folder and validate the MD5 checksum - * - * @param bool $md5Check Set to false to not perform the MD5 validation - * - * @return string Returns the path to the extracted cacert - * @throws RuntimeException if the file cannot be copied or there is a MD5 mismatch - */ - public function preparePharCacert($md5Check = true) - { - $from = __DIR__ . '/Resources/cacert.pem'; - $certFile = sys_get_temp_dir() . '/guzzle-cacert.pem'; - if (!file_exists($certFile) && !copy($from, $certFile)) { - throw new RuntimeException("Could not copy {$from} to {$certFile}: " . var_export(error_get_last(), true)); - } elseif ($md5Check) { - $actualMd5 = md5_file($certFile); - $expectedMd5 = trim(file_get_contents("{$from}.md5")); - if ($actualMd5 != $expectedMd5) { - throw new RuntimeException("{$certFile} MD5 mismatch: expected {$expectedMd5} but got {$actualMd5}"); - } - } - - return $certFile; - } - - /** - * Expand a URI template while merging client config settings into the template variables - * - * @param string $template Template to expand - * @param array $variables Variables to inject - * - * @return string - */ - protected function expandTemplate($template, array $variables = null) - { - $expansionVars = $this->getConfig()->toArray(); - if ($variables) { - $expansionVars = $variables + $expansionVars; - } - - return $this->getUriTemplate()->expand($template, $expansionVars); - } - - /** - * Get the URI template expander used by the client - * - * @return UriTemplateInterface - */ - protected function getUriTemplate() - { - if (!$this->uriTemplate) { - $this->uriTemplate = ParserRegistry::getInstance()->getParser('uri_template'); - } - - return $this->uriTemplate; - } - - /** - * Send multiple requests in parallel - * - * @param array $requests Array of RequestInterface objects - * - * @return array Returns an array of Response objects - */ - protected function sendMultiple(array $requests) - { - $curlMulti = $this->getCurlMulti(); - foreach ($requests as $request) { - $curlMulti->add($request); - } - $curlMulti->send(); - - /** @var $request RequestInterface */ - $result = array(); - foreach ($requests as $request) { - $result[] = $request->getResponse(); - } - - return $result; - } - - /** - * Prepare a request to be sent from the Client by adding client specific behaviors and properties to the request. - * - * @param RequestInterface $request Request to prepare for the client - * @param array $options Options to apply to the request - * - * @return RequestInterface - */ - protected function prepareRequest(RequestInterface $request, array $options = array()) - { - $request->setClient($this)->setEventDispatcher(clone $this->getEventDispatcher()); - - if ($curl = $this->config[self::CURL_OPTIONS]) { - $request->getCurlOptions()->overwriteWith(CurlHandle::parseCurlConfig($curl)); - } - - if ($params = $this->config[self::REQUEST_PARAMS]) { - Version::warn('request.params is deprecated. Use request.options to add default request options.'); - $request->getParams()->overwriteWith($params); - } - - if ($this->userAgent && !$request->hasHeader('User-Agent')) { - $request->setHeader('User-Agent', $this->userAgent); - } - - if ($defaults = $this->config[self::REQUEST_OPTIONS]) { - $this->requestFactory->applyOptions($request, $defaults, RequestFactoryInterface::OPTIONS_AS_DEFAULTS); - } - - if ($options) { - $this->requestFactory->applyOptions($request, $options); - } - - $this->dispatch('client.create_request', array('client' => $this, 'request' => $request)); - - return $request; - } - - /** - * Initializes SSL settings - */ - protected function initSsl() - { - if ('system' == ($authority = $this->config[self::SSL_CERT_AUTHORITY])) { - return; - } - - if ($authority === null) { - $authority = true; - } - - if ($authority === true && substr(__FILE__, 0, 7) == 'phar://') { - $authority = $this->preparePharCacert(); - $that = $this; - $this->getEventDispatcher()->addListener('request.before_send', function ($event) use ($authority, $that) { - if ($authority == $event['request']->getCurlOptions()->get(CURLOPT_CAINFO)) { - $that->preparePharCacert(false); - } - }); - } - - $this->setSslVerification($authority); - } - - /** - * @deprecated - */ - public function getDefaultHeaders() - { - Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to retrieve default request options'); - return $this->defaultHeaders; - } - - /** - * @deprecated - */ - public function setDefaultHeaders($headers) - { - Version::warn(__METHOD__ . ' is deprecated. Use the request.options array to specify default request options'); - if ($headers instanceof Collection) { - $this->defaultHeaders = $headers; - } elseif (is_array($headers)) { - $this->defaultHeaders = new Collection($headers); - } else { - throw new InvalidArgumentException('Headers must be an array or Collection'); - } - - return $this; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ClientInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ClientInterface.php deleted file mode 100644 index 10e4de2ab0..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ClientInterface.php +++ /dev/null @@ -1,223 +0,0 @@ -getCurlOptions(); - $mediator = new RequestMediator($request, $requestCurlOptions->get('emit_io')); - $tempContentLength = null; - $method = $request->getMethod(); - $bodyAsString = $requestCurlOptions->get(self::BODY_AS_STRING); - - // Prepare url - $url = (string)$request->getUrl(); - if(($pos = strpos($url, '#')) !== false ){ - // strip fragment from url - $url = substr($url, 0, $pos); - } - - // Array of default cURL options. - $curlOptions = array( - CURLOPT_URL => $url, - CURLOPT_CONNECTTIMEOUT => 150, - CURLOPT_RETURNTRANSFER => false, - CURLOPT_HEADER => false, - CURLOPT_PORT => $request->getPort(), - CURLOPT_HTTPHEADER => array(), - CURLOPT_WRITEFUNCTION => array($mediator, 'writeResponseBody'), - CURLOPT_HEADERFUNCTION => array($mediator, 'receiveResponseHeader'), - CURLOPT_HTTP_VERSION => $request->getProtocolVersion() === '1.0' - ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1, - // Verifies the authenticity of the peer's certificate - CURLOPT_SSL_VERIFYPEER => 1, - // Certificate must indicate that the server is the server to which you meant to connect - CURLOPT_SSL_VERIFYHOST => 2 - ); - - if (defined('CURLOPT_PROTOCOLS')) { - // Allow only HTTP and HTTPS protocols - $curlOptions[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; - } - - // Add CURLOPT_ENCODING if Accept-Encoding header is provided - if ($acceptEncodingHeader = $request->getHeader('Accept-Encoding')) { - $curlOptions[CURLOPT_ENCODING] = (string) $acceptEncodingHeader; - // Let cURL set the Accept-Encoding header, prevents duplicate values - $request->removeHeader('Accept-Encoding'); - } - - // Enable curl debug information if the 'debug' param was set - if ($requestCurlOptions->get('debug')) { - $curlOptions[CURLOPT_STDERR] = fopen('php://temp', 'r+'); - // @codeCoverageIgnoreStart - if (false === $curlOptions[CURLOPT_STDERR]) { - throw new RuntimeException('Unable to create a stream for CURLOPT_STDERR'); - } - // @codeCoverageIgnoreEnd - $curlOptions[CURLOPT_VERBOSE] = true; - } - - // Specify settings according to the HTTP method - if ($method == 'GET') { - $curlOptions[CURLOPT_HTTPGET] = true; - } elseif ($method == 'HEAD') { - $curlOptions[CURLOPT_NOBODY] = true; - // HEAD requests do not use a write function - unset($curlOptions[CURLOPT_WRITEFUNCTION]); - } elseif (!($request instanceof EntityEnclosingRequest)) { - $curlOptions[CURLOPT_CUSTOMREQUEST] = $method; - } else { - - $curlOptions[CURLOPT_CUSTOMREQUEST] = $method; - - // Handle sending raw bodies in a request - if ($request->getBody()) { - // You can send the body as a string using curl's CURLOPT_POSTFIELDS - if ($bodyAsString) { - $curlOptions[CURLOPT_POSTFIELDS] = (string) $request->getBody(); - // Allow curl to add the Content-Length for us to account for the times when - // POST redirects are followed by GET requests - if ($tempContentLength = $request->getHeader('Content-Length')) { - $tempContentLength = (int) (string) $tempContentLength; - } - // Remove the curl generated Content-Type header if none was set manually - if (!$request->hasHeader('Content-Type')) { - $curlOptions[CURLOPT_HTTPHEADER][] = 'Content-Type:'; - } - } else { - $curlOptions[CURLOPT_UPLOAD] = true; - // Let cURL handle setting the Content-Length header - if ($tempContentLength = $request->getHeader('Content-Length')) { - $tempContentLength = (int) (string) $tempContentLength; - $curlOptions[CURLOPT_INFILESIZE] = $tempContentLength; - } - // Add a callback for curl to read data to send with the request only if a body was specified - $curlOptions[CURLOPT_READFUNCTION] = array($mediator, 'readRequestBody'); - // Attempt to seek to the start of the stream - $request->getBody()->seek(0); - } - - } else { - - // Special handling for POST specific fields and files - $postFields = false; - if (count($request->getPostFiles())) { - $postFields = $request->getPostFields()->useUrlEncoding(false)->urlEncode(); - foreach ($request->getPostFiles() as $key => $data) { - $prefixKeys = count($data) > 1; - foreach ($data as $index => $file) { - // Allow multiple files in the same key - $fieldKey = $prefixKeys ? "{$key}[{$index}]" : $key; - $postFields[$fieldKey] = $file->getCurlValue(); - } - } - } elseif (count($request->getPostFields())) { - $postFields = (string) $request->getPostFields()->useUrlEncoding(true); - } - - if ($postFields !== false) { - if ($method == 'POST') { - unset($curlOptions[CURLOPT_CUSTOMREQUEST]); - $curlOptions[CURLOPT_POST] = true; - } - $curlOptions[CURLOPT_POSTFIELDS] = $postFields; - $request->removeHeader('Content-Length'); - } - } - - // If the Expect header is not present, prevent curl from adding it - if (!$request->hasHeader('Expect')) { - $curlOptions[CURLOPT_HTTPHEADER][] = 'Expect:'; - } - } - - // If a Content-Length header was specified but we want to allow curl to set one for us - if (null !== $tempContentLength) { - $request->removeHeader('Content-Length'); - } - - // Set custom cURL options - foreach ($requestCurlOptions->toArray() as $key => $value) { - if (is_numeric($key)) { - $curlOptions[$key] = $value; - } - } - - // Do not set an Accept header by default - if (!isset($curlOptions[CURLOPT_ENCODING])) { - $curlOptions[CURLOPT_HTTPHEADER][] = 'Accept:'; - } - - // Add any custom headers to the request. Empty headers will cause curl to not send the header at all. - foreach ($request->getHeaderLines() as $line) { - $curlOptions[CURLOPT_HTTPHEADER][] = $line; - } - - // Add the content-length header back if it was temporarily removed - if ($tempContentLength) { - $request->setHeader('Content-Length', $tempContentLength); - } - - // Apply the options to a new cURL handle. - $handle = curl_init(); - - // Enable the progress function if the 'progress' param was set - if ($requestCurlOptions->get('progress')) { - // Wrap the function in a function that provides the curl handle to the mediator's progress function - // Using this rather than injecting the handle into the mediator prevents a circular reference - $curlOptions[CURLOPT_PROGRESSFUNCTION] = function () use ($mediator, $handle) { - $args = func_get_args(); - $args[] = $handle; - - // PHP 5.5 pushed the handle onto the start of the args - if (is_resource($args[0])) { - array_shift($args); - } - - call_user_func_array(array($mediator, 'progress'), $args); - }; - $curlOptions[CURLOPT_NOPROGRESS] = false; - } - - curl_setopt_array($handle, $curlOptions); - - return new static($handle, $curlOptions); - } - - /** - * Construct a new CurlHandle object that wraps a cURL handle - * - * @param resource $handle Configured cURL handle resource - * @param Collection|array $options Curl options to use with the handle - * - * @throws InvalidArgumentException - */ - public function __construct($handle, $options) - { - if (!is_resource($handle)) { - throw new InvalidArgumentException('Invalid handle provided'); - } - if (is_array($options)) { - $this->options = new Collection($options); - } elseif ($options instanceof Collection) { - $this->options = $options; - } else { - throw new InvalidArgumentException('Expected array or Collection'); - } - $this->handle = $handle; - } - - /** - * Destructor - */ - public function __destruct() - { - $this->close(); - } - - /** - * Close the curl handle - */ - public function close() - { - if (is_resource($this->handle)) { - curl_close($this->handle); - } - $this->handle = null; - } - - /** - * Check if the handle is available and still OK - * - * @return bool - */ - public function isAvailable() - { - return is_resource($this->handle); - } - - /** - * Get the last error that occurred on the cURL handle - * - * @return string - */ - public function getError() - { - return $this->isAvailable() ? curl_error($this->handle) : ''; - } - - /** - * Get the last error number that occurred on the cURL handle - * - * @return int - */ - public function getErrorNo() - { - if ($this->errorNo) { - return $this->errorNo; - } - - return $this->isAvailable() ? curl_errno($this->handle) : CURLE_OK; - } - - /** - * Set the curl error number - * - * @param int $error Error number to set - * - * @return CurlHandle - */ - public function setErrorNo($error) - { - $this->errorNo = $error; - - return $this; - } - - /** - * Get cURL curl_getinfo data - * - * @param int $option Option to retrieve. Pass null to retrieve all data as an array. - * - * @return array|mixed - */ - public function getInfo($option = null) - { - if (!is_resource($this->handle)) { - return null; - } - - if (null !== $option) { - return curl_getinfo($this->handle, $option) ?: null; - } - - return curl_getinfo($this->handle) ?: array(); - } - - /** - * Get the stderr output - * - * @param bool $asResource Set to TRUE to get an fopen resource - * - * @return string|resource|null - */ - public function getStderr($asResource = false) - { - $stderr = $this->getOptions()->get(CURLOPT_STDERR); - if (!$stderr) { - return null; - } - - if ($asResource) { - return $stderr; - } - - fseek($stderr, 0); - $e = stream_get_contents($stderr); - fseek($stderr, 0, SEEK_END); - - return $e; - } - - /** - * Get the URL that this handle is connecting to - * - * @return Url - */ - public function getUrl() - { - return Url::factory($this->options->get(CURLOPT_URL)); - } - - /** - * Get the wrapped curl handle - * - * @return resource|null Returns the cURL handle or null if it was closed - */ - public function getHandle() - { - return $this->isAvailable() ? $this->handle : null; - } - - /** - * Get the cURL setopt options of the handle. Changing values in the return object will have no effect on the curl - * handle after it is created. - * - * @return Collection - */ - public function getOptions() - { - return $this->options; - } - - /** - * Update a request based on the log messages of the CurlHandle - * - * @param RequestInterface $request Request to update - */ - public function updateRequestFromTransfer(RequestInterface $request) - { - if (!$request->getResponse()) { - return; - } - - // Update the transfer stats of the response - $request->getResponse()->setInfo($this->getInfo()); - - if (!$log = $this->getStderr(true)) { - return; - } - - // Parse the cURL stderr output for outgoing requests - $headers = ''; - fseek($log, 0); - while (($line = fgets($log)) !== false) { - if ($line && $line[0] == '>') { - $headers = substr(trim($line), 2) . "\r\n"; - while (($line = fgets($log)) !== false) { - if ($line[0] == '*' || $line[0] == '<') { - break; - } else { - $headers .= trim($line) . "\r\n"; - } - } - } - } - - // Add request headers to the request exactly as they were sent - if ($headers) { - $parsed = ParserRegistry::getInstance()->getParser('message')->parseRequest($headers); - if (!empty($parsed['headers'])) { - $request->setHeaders(array()); - foreach ($parsed['headers'] as $name => $value) { - $request->setHeader($name, $value); - } - } - if (!empty($parsed['version'])) { - $request->setProtocolVersion($parsed['version']); - } - } - } - - /** - * Parse the config and replace curl.* configurators into the constant based values so it can be used elsewhere - * - * @param array|Collection $config The configuration we want to parse - * - * @return array - */ - public static function parseCurlConfig($config) - { - $curlOptions = array(); - foreach ($config as $key => $value) { - if (is_string($key) && defined($key)) { - // Convert constants represented as string to constant int values - $key = constant($key); - } - if (is_string($value) && defined($value)) { - $value = constant($value); - } - $curlOptions[$key] = $value; - } - - return $curlOptions; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php deleted file mode 100644 index f09ca0cac8..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php +++ /dev/null @@ -1,363 +0,0 @@ - array('CURLM_BAD_HANDLE', 'The passed-in handle is not a valid CURLM handle.'), - CURLM_BAD_EASY_HANDLE => array('CURLM_BAD_EASY_HANDLE', "An easy handle was not good/valid. It could mean that it isn't an easy handle at all, or possibly that the handle already is in used by this or another multi handle."), - CURLM_OUT_OF_MEMORY => array('CURLM_OUT_OF_MEMORY', 'You are doomed.'), - CURLM_INTERNAL_ERROR => array('CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!') - ); - - public function __construct() - { - $this->multiHandle = curl_multi_init(); - // @codeCoverageIgnoreStart - if ($this->multiHandle === false) { - throw new CurlException('Unable to create multi handle'); - } - // @codeCoverageIgnoreEnd - $this->reset(); - } - - public function __destruct() - { - if (is_resource($this->multiHandle)) { - curl_multi_close($this->multiHandle); - } - } - - public function add(RequestInterface $request) - { - $this->requests[] = $request; - // If requests are currently transferring and this is async, then the - // request must be prepared now as the send() method is not called. - $this->beforeSend($request); - $this->dispatch(self::ADD_REQUEST, array('request' => $request)); - - return $this; - } - - public function all() - { - return $this->requests; - } - - public function remove(RequestInterface $request) - { - $this->removeHandle($request); - if (($index = array_search($request, $this->requests, true)) !== false) { - $request = $this->requests[$index]; - unset($this->requests[$index]); - $this->requests = array_values($this->requests); - $this->dispatch(self::REMOVE_REQUEST, array('request' => $request)); - return true; - } - - return false; - } - - public function reset($hard = false) - { - // Remove each request - if ($this->requests) { - foreach ($this->requests as $request) { - $this->remove($request); - } - } - - $this->handles = new \SplObjectStorage(); - $this->requests = $this->resourceHash = $this->exceptions = $this->successful = array(); - } - - public function send() - { - $this->perform(); - $exceptions = $this->exceptions; - $successful = $this->successful; - $this->reset(); - - if ($exceptions) { - $this->throwMultiException($exceptions, $successful); - } - } - - public function count() - { - return count($this->requests); - } - - /** - * Build and throw a MultiTransferException - * - * @param array $exceptions Exceptions encountered - * @param array $successful Successful requests - * @throws MultiTransferException - */ - protected function throwMultiException(array $exceptions, array $successful) - { - $multiException = new MultiTransferException('Errors during multi transfer'); - - while ($e = array_shift($exceptions)) { - $multiException->addFailedRequestWithException($e['request'], $e['exception']); - } - - // Add successful requests - foreach ($successful as $request) { - if (!$multiException->containsRequest($request)) { - $multiException->addSuccessfulRequest($request); - } - } - - throw $multiException; - } - - /** - * Prepare for sending - * - * @param RequestInterface $request Request to prepare - * @throws \Exception on error preparing the request - */ - protected function beforeSend(RequestInterface $request) - { - try { - $state = $request->setState(RequestInterface::STATE_TRANSFER); - if ($state == RequestInterface::STATE_TRANSFER) { - // Add the request curl handle to the multi handle - $handle = $this->createCurlHandle($request)->getHandle(); - $this->checkCurlResult(curl_multi_add_handle($this->multiHandle, $handle)); - } else { - // Requests might decide they don't need to be sent just before transfer (e.g. CachePlugin) - $this->remove($request); - if ($state == RequestInterface::STATE_COMPLETE) { - $this->successful[] = $request; - } - } - } catch (\Exception $e) { - // Queue the exception to be thrown when sent - $this->removeErroredRequest($request, $e); - } - } - - /** - * Create a curl handle for a request - * - * @param RequestInterface $request Request - * - * @return CurlHandle - */ - protected function createCurlHandle(RequestInterface $request) - { - $wrapper = CurlHandle::factory($request); - $this->handles[$request] = $wrapper; - $this->resourceHash[(int) $wrapper->getHandle()] = $request; - - return $wrapper; - } - - /** - * Get the data from the multi handle - */ - protected function perform() - { - $event = new Event(array('curl_multi' => $this)); - - while ($this->requests) { - // Notify each request as polling - $blocking = $total = 0; - foreach ($this->requests as $request) { - ++$total; - $event['request'] = $request; - $request->getEventDispatcher()->dispatch(self::POLLING_REQUEST, $event); - // The blocking variable just has to be non-falsey to block the loop - if ($request->getParams()->hasKey(self::BLOCKING)) { - ++$blocking; - } - } - if ($blocking == $total) { - // Sleep to prevent eating CPU because no requests are actually pending a select call - usleep(500); - } else { - $this->executeHandles(); - } - } - } - - /** - * Execute and select curl handles - */ - private function executeHandles() - { - // The first curl_multi_select often times out no matter what, but is usually required for fast transfers - $selectTimeout = 0.001; - $active = false; - do { - while (($mrc = curl_multi_exec($this->multiHandle, $active)) == CURLM_CALL_MULTI_PERFORM); - $this->checkCurlResult($mrc); - $this->processMessages(); - if ($active && curl_multi_select($this->multiHandle, $selectTimeout) === -1) { - // Perform a usleep if a select returns -1: https://bugs.php.net/bug.php?id=61141 - usleep(150); - } - $selectTimeout = 1; - } while ($active); - } - - /** - * Process any received curl multi messages - */ - private function processMessages() - { - while ($done = curl_multi_info_read($this->multiHandle)) { - $request = $this->resourceHash[(int) $done['handle']]; - try { - $this->processResponse($request, $this->handles[$request], $done); - $this->successful[] = $request; - } catch (\Exception $e) { - $this->removeErroredRequest($request, $e); - } - } - } - - /** - * Remove a request that encountered an exception - * - * @param RequestInterface $request Request to remove - * @param \Exception $e Exception encountered - */ - protected function removeErroredRequest(RequestInterface $request, \Exception $e = null) - { - $this->exceptions[] = array('request' => $request, 'exception' => $e); - $this->remove($request); - $this->dispatch(self::MULTI_EXCEPTION, array('exception' => $e, 'all_exceptions' => $this->exceptions)); - } - - /** - * Check for errors and fix headers of a request based on a curl response - * - * @param RequestInterface $request Request to process - * @param CurlHandle $handle Curl handle object - * @param array $curl Array returned from curl_multi_info_read - * - * @throws CurlException on Curl error - */ - protected function processResponse(RequestInterface $request, CurlHandle $handle, array $curl) - { - // Set the transfer stats on the response - $handle->updateRequestFromTransfer($request); - // Check if a cURL exception occurred, and if so, notify things - $curlException = $this->isCurlException($request, $handle, $curl); - - // Always remove completed curl handles. They can be added back again - // via events if needed (e.g. ExponentialBackoffPlugin) - $this->removeHandle($request); - - if (!$curlException) { - $state = $request->setState(RequestInterface::STATE_COMPLETE, array('handle' => $handle)); - // Only remove the request if it wasn't resent as a result of the state change - if ($state != RequestInterface::STATE_TRANSFER) { - $this->remove($request); - } - } else { - // Set the state of the request to an error - $state = $request->setState(RequestInterface::STATE_ERROR, array('exception' => $curlException)); - // Allow things to ignore the error if possible - if ($state != RequestInterface::STATE_TRANSFER) { - $this->remove($request); - } - // The error was not handled, so fail - if ($state == RequestInterface::STATE_ERROR) { - /** @var CurlException $curlException */ - throw $curlException; - } - } - } - - /** - * Remove a curl handle from the curl multi object - * - * @param RequestInterface $request Request that owns the handle - */ - protected function removeHandle(RequestInterface $request) - { - if (isset($this->handles[$request])) { - $handle = $this->handles[$request]; - curl_multi_remove_handle($this->multiHandle, $handle->getHandle()); - unset($this->handles[$request]); - unset($this->resourceHash[(int) $handle->getHandle()]); - $handle->close(); - } - } - - /** - * Check if a cURL transfer resulted in what should be an exception - * - * @param RequestInterface $request Request to check - * @param CurlHandle $handle Curl handle object - * @param array $curl Array returned from curl_multi_info_read - * - * @return CurlException|bool - */ - private function isCurlException(RequestInterface $request, CurlHandle $handle, array $curl) - { - if (CURLM_OK == $curl['result'] || CURLM_CALL_MULTI_PERFORM == $curl['result']) { - return false; - } - - $handle->setErrorNo($curl['result']); - $e = new CurlException(sprintf('[curl] %s: %s [url] %s', - $handle->getErrorNo(), $handle->getError(), $handle->getUrl())); - $e->setCurlHandle($handle) - ->setRequest($request) - ->setCurlInfo($handle->getInfo()) - ->setError($handle->getError(), $handle->getErrorNo()); - - return $e; - } - - /** - * Throw an exception for a cURL multi response if needed - * - * @param int $code Curl response code - * @throws CurlException - */ - private function checkCurlResult($code) - { - if ($code != CURLM_OK && $code != CURLM_CALL_MULTI_PERFORM) { - throw new CurlException(isset($this->multiErrors[$code]) - ? "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}" - : 'Unexpected cURL error: ' . $code - ); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php deleted file mode 100644 index 0ead757350..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlMultiInterface.php +++ /dev/null @@ -1,58 +0,0 @@ -maxHandles = $maxHandles; - // You can get some weird "Too many open files" errors when sending a large amount of requests in parallel. - // These two statements autoload classes before a system runs out of file descriptors so that you can get back - // valuable error messages if you run out. - class_exists('Guzzle\Http\Message\Response'); - class_exists('Guzzle\Http\Exception\CurlException'); - } - - public function add(RequestInterface $request) - { - $this->queued[] = $request; - - return $this; - } - - public function all() - { - $requests = $this->queued; - foreach ($this->handles as $handle) { - $requests = array_merge($requests, $handle->all()); - } - - return $requests; - } - - public function remove(RequestInterface $request) - { - foreach ($this->queued as $i => $r) { - if ($request === $r) { - unset($this->queued[$i]); - return true; - } - } - - foreach ($this->handles as $handle) { - if ($handle->remove($request)) { - return true; - } - } - - return false; - } - - public function reset($hard = false) - { - $this->queued = array(); - $this->groups = array(); - foreach ($this->handles as $handle) { - $handle->reset(); - } - if ($hard) { - $this->handles = array(); - } - - return $this; - } - - public function send() - { - if ($this->queued) { - $group = $this->getAvailableHandle(); - // Add this handle to a list of handles than is claimed - $this->groups[] = $group; - while ($request = array_shift($this->queued)) { - $group->add($request); - } - try { - $group->send(); - array_pop($this->groups); - $this->cleanupHandles(); - } catch (\Exception $e) { - // Remove the group and cleanup if an exception was encountered and no more requests in group - if (!$group->count()) { - array_pop($this->groups); - $this->cleanupHandles(); - } - throw $e; - } - } - } - - public function count() - { - return count($this->all()); - } - - /** - * Get an existing available CurlMulti handle or create a new one - * - * @return CurlMulti - */ - protected function getAvailableHandle() - { - // Grab a handle that is not claimed - foreach ($this->handles as $h) { - if (!in_array($h, $this->groups, true)) { - return $h; - } - } - - // All are claimed, so create one - $handle = new CurlMulti(); - $handle->setEventDispatcher($this->getEventDispatcher()); - $this->handles[] = $handle; - - return $handle; - } - - /** - * Trims down unused CurlMulti handles to limit the number of open connections - */ - protected function cleanupHandles() - { - if ($diff = max(0, count($this->handles) - $this->maxHandles)) { - for ($i = count($this->handles) - 1; $i > 0 && $diff > 0; $i--) { - if (!count($this->handles[$i])) { - unset($this->handles[$i]); - $diff--; - } - } - $this->handles = array_values($this->handles); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php deleted file mode 100644 index c3f99dd25d..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/CurlVersion.php +++ /dev/null @@ -1,66 +0,0 @@ -version) { - $this->version = curl_version(); - } - - return $this->version; - } - - /** - * Get a specific type of curl information - * - * @param string $type Version information to retrieve. This value is one of: - * - version_number: cURL 24 bit version number - * - version: cURL version number, as a string - * - ssl_version_number: OpenSSL 24 bit version number - * - ssl_version: OpenSSL version number, as a string - * - libz_version: zlib version number, as a string - * - host: Information about the host where cURL was built - * - features: A bitmask of the CURL_VERSION_XXX constants - * - protocols: An array of protocols names supported by cURL - * - * @return string|float|bool if the $type is found, and false if not found - */ - public function get($type) - { - $version = $this->getAll(); - - return isset($version[$type]) ? $version[$type] : false; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php deleted file mode 100644 index 5d1a0cd872..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Curl/RequestMediator.php +++ /dev/null @@ -1,147 +0,0 @@ -request = $request; - $this->emitIo = $emitIo; - } - - /** - * Receive a response header from curl - * - * @param resource $curl Curl handle - * @param string $header Received header - * - * @return int - */ - public function receiveResponseHeader($curl, $header) - { - static $normalize = array("\r", "\n"); - $length = strlen($header); - $header = str_replace($normalize, '', $header); - - if (strpos($header, 'HTTP/') === 0) { - - $startLine = explode(' ', $header, 3); - $code = $startLine[1]; - $status = isset($startLine[2]) ? $startLine[2] : ''; - - // Only download the body of the response to the specified response - // body when a successful response is received. - if ($code >= 200 && $code < 300) { - $body = $this->request->getResponseBody(); - } else { - $body = EntityBody::factory(); - } - - $response = new Response($code, null, $body); - $response->setStatus($code, $status); - $this->request->startResponse($response); - - $this->request->dispatch('request.receive.status_line', array( - 'request' => $this, - 'line' => $header, - 'status_code' => $code, - 'reason_phrase' => $status - )); - - } elseif ($pos = strpos($header, ':')) { - $this->request->getResponse()->addHeader( - trim(substr($header, 0, $pos)), - trim(substr($header, $pos + 1)) - ); - } - - return $length; - } - - /** - * Received a progress notification - * - * @param int $downloadSize Total download size - * @param int $downloaded Amount of bytes downloaded - * @param int $uploadSize Total upload size - * @param int $uploaded Amount of bytes uploaded - * @param resource $handle CurlHandle object - */ - public function progress($downloadSize, $downloaded, $uploadSize, $uploaded, $handle = null) - { - $this->request->dispatch('curl.callback.progress', array( - 'request' => $this->request, - 'handle' => $handle, - 'download_size' => $downloadSize, - 'downloaded' => $downloaded, - 'upload_size' => $uploadSize, - 'uploaded' => $uploaded - )); - } - - /** - * Write data to the response body of a request - * - * @param resource $curl Curl handle - * @param string $write Data that was received - * - * @return int - */ - public function writeResponseBody($curl, $write) - { - if ($this->emitIo) { - $this->request->dispatch('curl.callback.write', array( - 'request' => $this->request, - 'write' => $write - )); - } - - if ($response = $this->request->getResponse()) { - return $response->getBody()->write($write); - } else { - // Unexpected data received before response headers - abort transfer - return 0; - } - } - - /** - * Read data from the request body and send it to curl - * - * @param resource $ch Curl handle - * @param resource $fd File descriptor - * @param int $length Amount of data to read - * - * @return string - */ - public function readRequestBody($ch, $fd, $length) - { - if (!($body = $this->request->getBody())) { - return ''; - } - - $read = (string) $body->read($length); - if ($this->emitIo) { - $this->request->dispatch('curl.callback.read', array('request' => $this->request, 'read' => $read)); - } - - return $read; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBody.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBody.php deleted file mode 100644 index b60d170f02..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBody.php +++ /dev/null @@ -1,201 +0,0 @@ -rewindFunction = $callable; - - return $this; - } - - public function rewind() - { - return $this->rewindFunction ? call_user_func($this->rewindFunction, $this) : parent::rewind(); - } - - /** - * Create a new EntityBody from a string - * - * @param string $string String of data - * - * @return EntityBody - */ - public static function fromString($string) - { - $stream = fopen('php://temp', 'r+'); - if ($string !== '') { - fwrite($stream, $string); - rewind($stream); - } - - return new static($stream); - } - - public function compress($filter = 'zlib.deflate') - { - $result = $this->handleCompression($filter); - $this->contentEncoding = $result ? $filter : false; - - return $result; - } - - public function uncompress($filter = 'zlib.inflate') - { - $offsetStart = 0; - - // When inflating gzipped data, the first 10 bytes must be stripped - // if a gzip header is present - if ($filter == 'zlib.inflate') { - // @codeCoverageIgnoreStart - if (!$this->isReadable() || ($this->isConsumed() && !$this->isSeekable())) { - return false; - } - // @codeCoverageIgnoreEnd - if (stream_get_contents($this->stream, 3, 0) === "\x1f\x8b\x08") { - $offsetStart = 10; - } - } - - $this->contentEncoding = false; - - return $this->handleCompression($filter, $offsetStart); - } - - public function getContentLength() - { - return $this->getSize(); - } - - public function getContentType() - { - return $this->getUri() ? Mimetypes::getInstance()->fromFilename($this->getUri()) : null; - } - - public function getContentMd5($rawOutput = false, $base64Encode = false) - { - if ($hash = self::getHash($this, 'md5', $rawOutput)) { - return $hash && $base64Encode ? base64_encode($hash) : $hash; - } else { - return false; - } - } - - /** - * Calculate the MD5 hash of an entity body - * - * @param EntityBodyInterface $body Entity body to calculate the hash for - * @param bool $rawOutput Whether or not to use raw output - * @param bool $base64Encode Whether or not to base64 encode raw output (only if raw output is true) - * - * @return bool|string Returns an MD5 string on success or FALSE on failure - * @deprecated This will be deprecated soon - * @codeCoverageIgnore - */ - public static function calculateMd5(EntityBodyInterface $body, $rawOutput = false, $base64Encode = false) - { - Version::warn(__CLASS__ . ' is deprecated. Use getContentMd5()'); - return $body->getContentMd5($rawOutput, $base64Encode); - } - - public function setStreamFilterContentEncoding($streamFilterContentEncoding) - { - $this->contentEncoding = $streamFilterContentEncoding; - - return $this; - } - - public function getContentEncoding() - { - return strtr($this->contentEncoding, array( - 'zlib.deflate' => 'gzip', - 'bzip2.compress' => 'compress' - )) ?: false; - } - - protected function handleCompression($filter, $offsetStart = 0) - { - // @codeCoverageIgnoreStart - if (!$this->isReadable() || ($this->isConsumed() && !$this->isSeekable())) { - return false; - } - // @codeCoverageIgnoreEnd - - $handle = fopen('php://temp', 'r+'); - $filter = @stream_filter_append($handle, $filter, STREAM_FILTER_WRITE); - if (!$filter) { - return false; - } - - // Seek to the offset start if possible - $this->seek($offsetStart); - while ($data = fread($this->stream, 8096)) { - fwrite($handle, $data); - } - - fclose($this->stream); - $this->stream = $handle; - stream_filter_remove($filter); - $stat = fstat($this->stream); - $this->size = $stat['size']; - $this->rebuildCache(); - $this->seek(0); - - // Remove any existing rewind function as the underlying stream has been replaced - $this->rewindFunction = null; - - return true; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php deleted file mode 100644 index e640f57850..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/EntityBodyInterface.php +++ /dev/null @@ -1,73 +0,0 @@ -isClientError()) { - $label = 'Client error response'; - $class = __NAMESPACE__ . '\\ClientErrorResponseException'; - } elseif ($response->isServerError()) { - $label = 'Server error response'; - $class = __NAMESPACE__ . '\\ServerErrorResponseException'; - } else { - $label = 'Unsuccessful response'; - $class = __CLASS__; - } - - $message = $label . PHP_EOL . implode(PHP_EOL, array( - '[status code] ' . $response->getStatusCode(), - '[reason phrase] ' . $response->getReasonPhrase(), - '[url] ' . $request->getUrl(), - )); - - $e = new $class($message); - $e->setResponse($response); - $e->setRequest($request); - - return $e; - } - - /** - * Set the response that caused the exception - * - * @param Response $response Response to set - */ - public function setResponse(Response $response) - { - $this->response = $response; - } - - /** - * Get the response that caused the exception - * - * @return Response - */ - public function getResponse() - { - return $this->response; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php deleted file mode 100644 index 04d7ddc05e..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ClientErrorResponseException.php +++ /dev/null @@ -1,8 +0,0 @@ -curlError = $error; - $this->curlErrorNo = $number; - - return $this; - } - - /** - * Set the associated curl handle - * - * @param CurlHandle $handle Curl handle - * - * @return self - */ - public function setCurlHandle(CurlHandle $handle) - { - $this->handle = $handle; - - return $this; - } - - /** - * Get the associated cURL handle - * - * @return CurlHandle|null - */ - public function getCurlHandle() - { - return $this->handle; - } - - /** - * Get the associated cURL error message - * - * @return string|null - */ - public function getError() - { - return $this->curlError; - } - - /** - * Get the associated cURL error number - * - * @return int|null - */ - public function getErrorNo() - { - return $this->curlErrorNo; - } - - /** - * Returns curl information about the transfer - * - * @return array - */ - public function getCurlInfo() - { - return $this->curlInfo; - } - - /** - * Set curl transfer information - * - * @param array $info Array of curl transfer information - * - * @return self - * @link http://php.net/manual/en/function.curl-getinfo.php - */ - public function setCurlInfo(array $info) - { - $this->curlInfo = $info; - - return $this; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php deleted file mode 100644 index ee87295d36..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/HttpException.php +++ /dev/null @@ -1,10 +0,0 @@ -successfulRequests, $this->failedRequests); - } - - /** - * Add to the array of successful requests - * - * @param RequestInterface $request Successful request - * - * @return self - */ - public function addSuccessfulRequest(RequestInterface $request) - { - $this->successfulRequests[] = $request; - - return $this; - } - - /** - * Add to the array of failed requests - * - * @param RequestInterface $request Failed request - * - * @return self - */ - public function addFailedRequest(RequestInterface $request) - { - $this->failedRequests[] = $request; - - return $this; - } - - /** - * Add to the array of failed requests and associate with exceptions - * - * @param RequestInterface $request Failed request - * @param \Exception $exception Exception to add and associate with - * - * @return self - */ - public function addFailedRequestWithException(RequestInterface $request, \Exception $exception) - { - $this->add($exception) - ->addFailedRequest($request) - ->exceptionForRequest[spl_object_hash($request)] = $exception; - - return $this; - } - - /** - * Get the Exception that caused the given $request to fail - * - * @param RequestInterface $request Failed command - * - * @return \Exception|null - */ - public function getExceptionForFailedRequest(RequestInterface $request) - { - $oid = spl_object_hash($request); - - return isset($this->exceptionForRequest[$oid]) ? $this->exceptionForRequest[$oid] : null; - } - - /** - * Set all of the successful requests - * - * @param array Array of requests - * - * @return self - */ - public function setSuccessfulRequests(array $requests) - { - $this->successfulRequests = $requests; - - return $this; - } - - /** - * Set all of the failed requests - * - * @param array Array of requests - * - * @return self - */ - public function setFailedRequests(array $requests) - { - $this->failedRequests = $requests; - - return $this; - } - - /** - * Get an array of successful requests sent in the multi transfer - * - * @return array - */ - public function getSuccessfulRequests() - { - return $this->successfulRequests; - } - - /** - * Get an array of failed requests sent in the multi transfer - * - * @return array - */ - public function getFailedRequests() - { - return $this->failedRequests; - } - - /** - * Check if the exception object contains a request - * - * @param RequestInterface $request Request to check - * - * @return bool - */ - public function containsRequest(RequestInterface $request) - { - return in_array($request, $this->failedRequests, true) || in_array($request, $this->successfulRequests, true); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php deleted file mode 100644 index 274df2cb16..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/RequestException.php +++ /dev/null @@ -1,39 +0,0 @@ -request = $request; - - return $this; - } - - /** - * Get the request that caused the exception - * - * @return RequestInterface - */ - public function getRequest() - { - return $this->request; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php deleted file mode 100644 index f0f7cfe481..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Exception/ServerErrorResponseException.php +++ /dev/null @@ -1,8 +0,0 @@ -eventDispatcher = $eventDispatcher; - - return $this; - } - - public function getEventDispatcher() - { - if (!$this->eventDispatcher) { - $this->eventDispatcher = new EventDispatcher(); - } - - return $this->eventDispatcher; - } - - public function dispatch($eventName, array $context = array()) - { - return $this->getEventDispatcher()->dispatch($eventName, new Event($context)); - } - - /** - * {@inheritdoc} - * @codeCoverageIgnore - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - $this->getEventDispatcher()->addSubscriber($subscriber); - - return $this; - } - - public function read($length) - { - $event = array( - 'body' => $this, - 'length' => $length, - 'read' => $this->body->read($length) - ); - $this->dispatch('body.read', $event); - - return $event['read']; - } - - public function write($string) - { - $event = array( - 'body' => $this, - 'write' => $string, - 'result' => $this->body->write($string) - ); - $this->dispatch('body.write', $event); - - return $event['result']; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php deleted file mode 100644 index 0d066ffceb..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/AbstractMessage.php +++ /dev/null @@ -1,220 +0,0 @@ -params = new Collection(); - $this->headerFactory = new HeaderFactory(); - $this->headers = new HeaderCollection(); - } - - /** - * Set the header factory to use to create headers - * - * @param HeaderFactoryInterface $factory - * - * @return self - */ - public function setHeaderFactory(HeaderFactoryInterface $factory) - { - $this->headerFactory = $factory; - - return $this; - } - - public function getParams() - { - return $this->params; - } - - public function addHeader($header, $value) - { - if (isset($this->headers[$header])) { - $this->headers[$header]->add($value); - } elseif ($value instanceof HeaderInterface) { - $this->headers[$header] = $value; - } else { - $this->headers[$header] = $this->headerFactory->createHeader($header, $value); - } - - return $this; - } - - public function addHeaders(array $headers) - { - foreach ($headers as $key => $value) { - $this->addHeader($key, $value); - } - - return $this; - } - - public function getHeader($header) - { - return $this->headers[$header]; - } - - public function getHeaders() - { - return $this->headers; - } - - public function getHeaderLines() - { - $headers = array(); - foreach ($this->headers as $value) { - $headers[] = $value->getName() . ': ' . $value; - } - - return $headers; - } - - public function setHeader($header, $value) - { - unset($this->headers[$header]); - $this->addHeader($header, $value); - - return $this; - } - - public function setHeaders(array $headers) - { - $this->headers->clear(); - foreach ($headers as $key => $value) { - $this->addHeader($key, $value); - } - - return $this; - } - - public function hasHeader($header) - { - return isset($this->headers[$header]); - } - - public function removeHeader($header) - { - unset($this->headers[$header]); - - return $this; - } - - /** - * @deprecated Use $message->getHeader()->parseParams() - * @codeCoverageIgnore - */ - public function getTokenizedHeader($header, $token = ';') - { - Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader()->parseParams()'); - if ($this->hasHeader($header)) { - $data = new Collection(); - foreach ($this->getHeader($header)->parseParams() as $values) { - foreach ($values as $key => $value) { - if ($value === '') { - $data->set($data->count(), $key); - } else { - $data->add($key, $value); - } - } - } - return $data; - } - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function setTokenizedHeader($header, $data, $token = ';') - { - Version::warn(__METHOD__ . ' is deprecated.'); - return $this; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function getCacheControlDirective($directive) - { - Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->getDirective()'); - if (!($header = $this->getHeader('Cache-Control'))) { - return null; - } - - return $header->getDirective($directive); - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function hasCacheControlDirective($directive) - { - Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->hasDirective()'); - if ($header = $this->getHeader('Cache-Control')) { - return $header->hasDirective($directive); - } else { - return false; - } - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function addCacheControlDirective($directive, $value = true) - { - Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->addDirective()'); - if (!($header = $this->getHeader('Cache-Control'))) { - $this->addHeader('Cache-Control', ''); - $header = $this->getHeader('Cache-Control'); - } - - $header->addDirective($directive, $value); - - return $this; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function removeCacheControlDirective($directive) - { - Version::warn(__METHOD__ . ' is deprecated. Use $message->getHeader(\'Cache-Control\')->removeDirective()'); - if ($header = $this->getHeader('Cache-Control')) { - $header->removeDirective($directive); - } - - return $this; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php deleted file mode 100644 index 212850a254..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequest.php +++ /dev/null @@ -1,247 +0,0 @@ -postFields = new QueryString(); - parent::__construct($method, $url, $headers); - } - - /** - * @return string - */ - public function __toString() - { - // Only attempt to include the POST data if it's only fields - if (count($this->postFields) && empty($this->postFiles)) { - return parent::__toString() . (string) $this->postFields; - } - - return parent::__toString() . $this->body; - } - - public function setState($state, array $context = array()) - { - parent::setState($state, $context); - if ($state == self::STATE_TRANSFER && !$this->body && !count($this->postFields) && !count($this->postFiles)) { - $this->setHeader('Content-Length', 0)->removeHeader('Transfer-Encoding'); - } - - return $this->state; - } - - public function setBody($body, $contentType = null) - { - $this->body = EntityBody::factory($body); - - // Auto detect the Content-Type from the path of the request if possible - if ($contentType === null && !$this->hasHeader('Content-Type')) { - $contentType = $this->body->getContentType(); - } - - if ($contentType) { - $this->setHeader('Content-Type', $contentType); - } - - // Always add the Expect 100-Continue header if the body cannot be rewound. This helps with redirects. - if (!$this->body->isSeekable() && $this->expectCutoff !== false) { - $this->setHeader('Expect', '100-Continue'); - } - - // Set the Content-Length header if it can be determined - $size = $this->body->getContentLength(); - if ($size !== null && $size !== false) { - $this->setHeader('Content-Length', $size); - if ($size > $this->expectCutoff) { - $this->setHeader('Expect', '100-Continue'); - } - } elseif (!$this->hasHeader('Content-Length')) { - if ('1.1' == $this->protocolVersion) { - $this->setHeader('Transfer-Encoding', 'chunked'); - } else { - throw new RequestException( - 'Cannot determine Content-Length and cannot use chunked Transfer-Encoding when using HTTP/1.0' - ); - } - } - - return $this; - } - - public function getBody() - { - return $this->body; - } - - /** - * Set the size that the entity body of the request must exceed before adding the Expect: 100-Continue header. - * - * @param int|bool $size Cutoff in bytes. Set to false to never send the expect header (even with non-seekable data) - * - * @return self - */ - public function setExpectHeaderCutoff($size) - { - $this->expectCutoff = $size; - if ($size === false || !$this->body) { - $this->removeHeader('Expect'); - } elseif ($this->body && $this->body->getSize() && $this->body->getSize() > $size) { - $this->setHeader('Expect', '100-Continue'); - } - - return $this; - } - - public function configureRedirects($strict = false, $maxRedirects = 5) - { - $this->getParams()->set(RedirectPlugin::STRICT_REDIRECTS, $strict); - if ($maxRedirects == 0) { - $this->getParams()->set(RedirectPlugin::DISABLE, true); - } else { - $this->getParams()->set(RedirectPlugin::MAX_REDIRECTS, $maxRedirects); - } - - return $this; - } - - public function getPostField($field) - { - return $this->postFields->get($field); - } - - public function getPostFields() - { - return $this->postFields; - } - - public function setPostField($key, $value) - { - $this->postFields->set($key, $value); - $this->processPostFields(); - - return $this; - } - - public function addPostFields($fields) - { - $this->postFields->merge($fields); - $this->processPostFields(); - - return $this; - } - - public function removePostField($field) - { - $this->postFields->remove($field); - $this->processPostFields(); - - return $this; - } - - public function getPostFiles() - { - return $this->postFiles; - } - - public function getPostFile($fieldName) - { - return isset($this->postFiles[$fieldName]) ? $this->postFiles[$fieldName] : null; - } - - public function removePostFile($fieldName) - { - unset($this->postFiles[$fieldName]); - $this->processPostFields(); - - return $this; - } - - public function addPostFile($field, $filename = null, $contentType = null, $postname = null) - { - $data = null; - - if ($field instanceof PostFileInterface) { - $data = $field; - } elseif (is_array($filename)) { - // Allow multiple values to be set in a single key - foreach ($filename as $file) { - $this->addPostFile($field, $file, $contentType); - } - return $this; - } elseif (!is_string($filename)) { - throw new RequestException('The path to a file must be a string'); - } elseif (!empty($filename)) { - // Adding an empty file will cause cURL to error out - $data = new PostFile($field, $filename, $contentType, $postname); - } - - if ($data) { - if (!isset($this->postFiles[$data->getFieldName()])) { - $this->postFiles[$data->getFieldName()] = array($data); - } else { - $this->postFiles[$data->getFieldName()][] = $data; - } - $this->processPostFields(); - } - - return $this; - } - - public function addPostFiles(array $files) - { - foreach ($files as $key => $file) { - if ($file instanceof PostFileInterface) { - $this->addPostFile($file, null, null, false); - } elseif (is_string($file)) { - // Convert non-associative array keys into 'file' - if (is_numeric($key)) { - $key = 'file'; - } - $this->addPostFile($key, $file, null, false); - } else { - throw new RequestException('File must be a string or instance of PostFileInterface'); - } - } - - return $this; - } - - /** - * Determine what type of request should be sent based on post fields - */ - protected function processPostFields() - { - if (!$this->postFiles) { - $this->removeHeader('Expect')->setHeader('Content-Type', self::URL_ENCODED); - } else { - $this->setHeader('Content-Type', self::MULTIPART); - if ($this->expectCutoff !== false) { - $this->setHeader('Expect', '100-Continue'); - } - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php deleted file mode 100644 index 49ad4595d6..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/EntityEnclosingRequestInterface.php +++ /dev/null @@ -1,137 +0,0 @@ - filenames where filename can be a string or PostFileInterface - * - * @return self - */ - public function addPostFiles(array $files); - - /** - * Configure how redirects are handled for the request - * - * @param bool $strict Set to true to follow strict RFC compliance when redirecting POST requests. Most - * browsers with follow a 301-302 redirect for a POST request with a GET request. This is - * the default behavior of Guzzle. Enable strict redirects to redirect these responses - * with a POST rather than a GET request. - * @param int $maxRedirects Specify the maximum number of allowed redirects. Set to 0 to disable redirects. - * - * @return self - */ - public function configureRedirects($strict = false, $maxRedirects = 5); -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header.php deleted file mode 100644 index 50597b2a69..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header.php +++ /dev/null @@ -1,182 +0,0 @@ -header = trim($header); - $this->glue = $glue; - - foreach ((array) $values as $value) { - foreach ((array) $value as $v) { - $this->values[] = $v; - } - } - } - - public function __toString() - { - return implode($this->glue . ' ', $this->toArray()); - } - - public function add($value) - { - $this->values[] = $value; - - return $this; - } - - public function getName() - { - return $this->header; - } - - public function setName($name) - { - $this->header = $name; - - return $this; - } - - public function setGlue($glue) - { - $this->glue = $glue; - - return $this; - } - - public function getGlue() - { - return $this->glue; - } - - /** - * Normalize the header to be a single header with an array of values. - * - * If any values of the header contains the glue string value (e.g. ","), then the value will be exploded into - * multiple entries in the header. - * - * @return self - */ - public function normalize() - { - $values = $this->toArray(); - - for ($i = 0, $total = count($values); $i < $total; $i++) { - if (strpos($values[$i], $this->glue) !== false) { - // Explode on glue when the glue is not inside of a comma - foreach (preg_split('/' . preg_quote($this->glue) . '(?=([^"]*"[^"]*")*[^"]*$)/', $values[$i]) as $v) { - $values[] = trim($v); - } - unset($values[$i]); - } - } - - $this->values = array_values($values); - - return $this; - } - - public function hasValue($searchValue) - { - return in_array($searchValue, $this->toArray()); - } - - public function removeValue($searchValue) - { - $this->values = array_values(array_filter($this->values, function ($value) use ($searchValue) { - return $value != $searchValue; - })); - - return $this; - } - - public function toArray() - { - return $this->values; - } - - public function count() - { - return count($this->toArray()); - } - - public function getIterator() - { - return new \ArrayIterator($this->toArray()); - } - - public function parseParams() - { - $params = $matches = array(); - $callback = array($this, 'trimHeader'); - - // Normalize the header into a single array and iterate over all values - foreach ($this->normalize()->toArray() as $val) { - $part = array(); - foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { - if (!preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { - continue; - } - $pieces = array_map($callback, $matches[0]); - $part[$pieces[0]] = isset($pieces[1]) ? $pieces[1] : ''; - } - if ($part) { - $params[] = $part; - } - } - - return $params; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function hasExactHeader($header) - { - Version::warn(__METHOD__ . ' is deprecated'); - return $this->header == $header; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function raw() - { - Version::warn(__METHOD__ . ' is deprecated. Use toArray()'); - return $this->toArray(); - } - - /** - * Trim a header by removing excess spaces and wrapping quotes - * - * @param $str - * - * @return string - */ - protected function trimHeader($str) - { - static $trimmed = "\"' \n\t"; - - return trim($str, $trimmed); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php deleted file mode 100644 index 77789e51fd..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/CacheControl.php +++ /dev/null @@ -1,121 +0,0 @@ -directives = null; - } - - public function removeValue($searchValue) - { - parent::removeValue($searchValue); - $this->directives = null; - } - - /** - * Check if a specific cache control directive exists - * - * @param string $param Directive to retrieve - * - * @return bool - */ - public function hasDirective($param) - { - $directives = $this->getDirectives(); - - return isset($directives[$param]); - } - - /** - * Get a specific cache control directive - * - * @param string $param Directive to retrieve - * - * @return string|bool|null - */ - public function getDirective($param) - { - $directives = $this->getDirectives(); - - return isset($directives[$param]) ? $directives[$param] : null; - } - - /** - * Add a cache control directive - * - * @param string $param Directive to add - * @param string $value Value to set - * - * @return self - */ - public function addDirective($param, $value) - { - $directives = $this->getDirectives(); - $directives[$param] = $value; - $this->updateFromDirectives($directives); - - return $this; - } - - /** - * Remove a cache control directive by name - * - * @param string $param Directive to remove - * - * @return self - */ - public function removeDirective($param) - { - $directives = $this->getDirectives(); - unset($directives[$param]); - $this->updateFromDirectives($directives); - - return $this; - } - - /** - * Get an associative array of cache control directives - * - * @return array - */ - public function getDirectives() - { - if ($this->directives === null) { - $this->directives = array(); - foreach ($this->parseParams() as $collection) { - foreach ($collection as $key => $value) { - $this->directives[$key] = $value === '' ? true : $value; - } - } - } - - return $this->directives; - } - - /** - * Updates the header value based on the parsed directives - * - * @param array $directives Array of cache control directives - */ - protected function updateFromDirectives(array $directives) - { - $this->directives = $directives; - $this->values = array(); - - foreach ($directives as $key => $value) { - $this->values[] = $value === true ? $key : "{$key}={$value}"; - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php deleted file mode 100644 index 8c7f6aefba..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderCollection.php +++ /dev/null @@ -1,108 +0,0 @@ -headers = $headers; - } - - public function __clone() - { - foreach ($this->headers as &$header) { - $header = clone $header; - } - } - - /** - * Clears the header collection - */ - public function clear() - { - $this->headers = array(); - } - - /** - * Set a header on the collection - * - * @param HeaderInterface $header Header to add - * - * @return self - */ - public function add(HeaderInterface $header) - { - $this->headers[strtolower($header->getName())] = $header; - - return $this; - } - - /** - * Get an array of header objects - * - * @return array - */ - public function getAll() - { - return $this->headers; - } - - /** - * Alias of offsetGet - */ - public function get($key) - { - return $this->offsetGet($key); - } - - public function count() - { - return count($this->headers); - } - - public function offsetExists($offset) - { - return isset($this->headers[strtolower($offset)]); - } - - public function offsetGet($offset) - { - $l = strtolower($offset); - - return isset($this->headers[$l]) ? $this->headers[$l] : null; - } - - public function offsetSet($offset, $value) - { - $this->add($value); - } - - public function offsetUnset($offset) - { - unset($this->headers[strtolower($offset)]); - } - - public function getIterator() - { - return new \ArrayIterator($this->headers); - } - - public function toArray() - { - $result = array(); - foreach ($this->headers as $header) { - $result[$header->getName()] = $header->toArray(); - } - - return $result; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php deleted file mode 100644 index 0273be52f8..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactory.php +++ /dev/null @@ -1,26 +0,0 @@ - 'Guzzle\Http\Message\Header\CacheControl', - 'link' => 'Guzzle\Http\Message\Header\Link', - ); - - public function createHeader($header, $value = null) - { - $lowercase = strtolower($header); - - return isset($this->mapping[$lowercase]) - ? new $this->mapping[$lowercase]($header, $value) - : new Header($header, $value); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php deleted file mode 100644 index 9457cf64a1..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/Header/HeaderFactoryInterface.php +++ /dev/null @@ -1,19 +0,0 @@ -", "rel=\"{$rel}\""); - - foreach ($params as $k => $v) { - $values[] = "{$k}=\"{$v}\""; - } - - return $this->add(implode('; ', $values)); - } - - /** - * Check if a specific link exists for a given rel attribute - * - * @param string $rel rel value - * - * @return bool - */ - public function hasLink($rel) - { - return $this->getLink($rel) !== null; - } - - /** - * Get a specific link for a given rel attribute - * - * @param string $rel Rel value - * - * @return array|null - */ - public function getLink($rel) - { - foreach ($this->getLinks() as $link) { - if (isset($link['rel']) && $link['rel'] == $rel) { - return $link; - } - } - - return null; - } - - /** - * Get an associative array of links - * - * For example: - * Link: ; rel=front; type="image/jpeg", ; rel=back; type="image/jpeg" - * - * - * var_export($response->getLinks()); - * array( - * array( - * 'url' => 'http:/.../front.jpeg', - * 'rel' => 'back', - * 'type' => 'image/jpeg', - * ) - * ) - * - * - * @return array - */ - public function getLinks() - { - $links = $this->parseParams(); - - foreach ($links as &$link) { - $key = key($link); - unset($link[$key]); - $link['url'] = trim($key, '<> '); - } - - return $links; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php deleted file mode 100644 index 62bcd43913..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/MessageInterface.php +++ /dev/null @@ -1,102 +0,0 @@ -fieldName = $fieldName; - $this->setFilename($filename); - $this->postname = $postname ? $postname : basename($filename); - $this->contentType = $contentType ?: $this->guessContentType(); - } - - public function setFieldName($name) - { - $this->fieldName = $name; - - return $this; - } - - public function getFieldName() - { - return $this->fieldName; - } - - public function setFilename($filename) - { - // Remove leading @ symbol - if (strpos($filename, '@') === 0) { - $filename = substr($filename, 1); - } - - if (!is_readable($filename)) { - throw new InvalidArgumentException("Unable to open {$filename} for reading"); - } - - $this->filename = $filename; - - return $this; - } - - public function setPostname($postname) - { - $this->postname = $postname; - - return $this; - } - - public function getFilename() - { - return $this->filename; - } - - public function getPostname() - { - return $this->postname; - } - - public function setContentType($type) - { - $this->contentType = $type; - - return $this; - } - - public function getContentType() - { - return $this->contentType; - } - - public function getCurlValue() - { - // PHP 5.5 introduced a CurlFile object that deprecates the old @filename syntax - // See: https://wiki.php.net/rfc/curl-file-upload - if (function_exists('curl_file_create')) { - return curl_file_create($this->filename, $this->contentType, $this->postname); - } - - // Use the old style if using an older version of PHP - $value = "@{$this->filename};filename=" . $this->postname; - if ($this->contentType) { - $value .= ';type=' . $this->contentType; - } - - return $value; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function getCurlString() - { - Version::warn(__METHOD__ . ' is deprecated. Use getCurlValue()'); - return $this->getCurlValue(); - } - - /** - * Determine the Content-Type of the file - */ - protected function guessContentType() - { - return Mimetypes::getInstance()->fromFilename($this->filename) ?: 'application/octet-stream'; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php deleted file mode 100644 index 7f0779d1e8..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/PostFileInterface.php +++ /dev/null @@ -1,83 +0,0 @@ -method = strtoupper($method); - $this->curlOptions = new Collection(); - $this->setUrl($url); - - if ($headers) { - // Special handling for multi-value headers - foreach ($headers as $key => $value) { - // Deal with collisions with Host and Authorization - if ($key == 'host' || $key == 'Host') { - $this->setHeader($key, $value); - } elseif ($value instanceof HeaderInterface) { - $this->addHeader($key, $value); - } else { - foreach ((array) $value as $v) { - $this->addHeader($key, $v); - } - } - } - } - - $this->setState(self::STATE_NEW); - } - - public function __clone() - { - if ($this->eventDispatcher) { - $this->eventDispatcher = clone $this->eventDispatcher; - } - $this->curlOptions = clone $this->curlOptions; - $this->params = clone $this->params; - $this->url = clone $this->url; - $this->response = $this->responseBody = null; - $this->headers = clone $this->headers; - - $this->setState(RequestInterface::STATE_NEW); - $this->dispatch('request.clone', array('request' => $this)); - } - - /** - * Get the HTTP request as a string - * - * @return string - */ - public function __toString() - { - return $this->getRawHeaders() . "\r\n\r\n"; - } - - /** - * Default method that will throw exceptions if an unsuccessful response is received. - * - * @param Event $event Received - * @throws BadResponseException if the response is not successful - */ - public static function onRequestError(Event $event) - { - $e = BadResponseException::factory($event['request'], $event['response']); - $event['request']->setState(self::STATE_ERROR, array('exception' => $e) + $event->toArray()); - throw $e; - } - - public function setClient(ClientInterface $client) - { - $this->client = $client; - - return $this; - } - - public function getClient() - { - return $this->client; - } - - public function getRawHeaders() - { - $protocolVersion = $this->protocolVersion ?: '1.1'; - - return trim($this->method . ' ' . $this->getResource()) . ' ' - . strtoupper(str_replace('https', 'http', $this->url->getScheme())) - . '/' . $protocolVersion . "\r\n" . implode("\r\n", $this->getHeaderLines()); - } - - public function setUrl($url) - { - if ($url instanceof Url) { - $this->url = $url; - } else { - $this->url = Url::factory($url); - } - - // Update the port and host header - $this->setPort($this->url->getPort()); - - if ($this->url->getUsername() || $this->url->getPassword()) { - $this->setAuth($this->url->getUsername(), $this->url->getPassword()); - // Remove the auth info from the URL - $this->url->setUsername(null); - $this->url->setPassword(null); - } - - return $this; - } - - public function send() - { - if (!$this->client) { - throw new RuntimeException('A client must be set on the request'); - } - - return $this->client->send($this); - } - - public function getResponse() - { - return $this->response; - } - - public function getQuery($asString = false) - { - return $asString - ? (string) $this->url->getQuery() - : $this->url->getQuery(); - } - - public function getMethod() - { - return $this->method; - } - - public function getScheme() - { - return $this->url->getScheme(); - } - - public function setScheme($scheme) - { - $this->url->setScheme($scheme); - - return $this; - } - - public function getHost() - { - return $this->url->getHost(); - } - - public function setHost($host) - { - $this->url->setHost($host); - $this->setPort($this->url->getPort()); - - return $this; - } - - public function getProtocolVersion() - { - return $this->protocolVersion; - } - - public function setProtocolVersion($protocol) - { - $this->protocolVersion = $protocol; - - return $this; - } - - public function getPath() - { - return '/' . ltrim($this->url->getPath(), '/'); - } - - public function setPath($path) - { - $this->url->setPath($path); - - return $this; - } - - public function getPort() - { - return $this->url->getPort(); - } - - public function setPort($port) - { - $this->url->setPort($port); - - // Include the port in the Host header if it is not the default port for the scheme of the URL - $scheme = $this->url->getScheme(); - if (($scheme == 'http' && $port != 80) || ($scheme == 'https' && $port != 443)) { - $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost() . ':' . $port); - } else { - $this->headers['host'] = $this->headerFactory->createHeader('Host', $this->url->getHost()); - } - - return $this; - } - - public function getUsername() - { - return $this->username; - } - - public function getPassword() - { - return $this->password; - } - - public function setAuth($user, $password = '', $scheme = CURLAUTH_BASIC) - { - static $authMap = array( - 'basic' => CURLAUTH_BASIC, - 'digest' => CURLAUTH_DIGEST, - 'ntlm' => CURLAUTH_NTLM, - 'any' => CURLAUTH_ANY - ); - - // If we got false or null, disable authentication - if (!$user) { - $this->password = $this->username = null; - $this->removeHeader('Authorization'); - $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH); - return $this; - } - - if (!is_numeric($scheme)) { - $scheme = strtolower($scheme); - if (!isset($authMap[$scheme])) { - throw new InvalidArgumentException($scheme . ' is not a valid authentication type'); - } - $scheme = $authMap[$scheme]; - } - - $this->username = $user; - $this->password = $password; - - // Bypass CURL when using basic auth to promote connection reuse - if ($scheme == CURLAUTH_BASIC) { - $this->getCurlOptions()->remove(CURLOPT_HTTPAUTH); - $this->setHeader('Authorization', 'Basic ' . base64_encode($this->username . ':' . $this->password)); - } else { - $this->getCurlOptions() - ->set(CURLOPT_HTTPAUTH, $scheme) - ->set(CURLOPT_USERPWD, $this->username . ':' . $this->password); - } - - return $this; - } - - public function getResource() - { - $resource = $this->getPath(); - if ($query = (string) $this->url->getQuery()) { - $resource .= '?' . $query; - } - - return $resource; - } - - public function getUrl($asObject = false) - { - return $asObject ? clone $this->url : (string) $this->url; - } - - public function getState() - { - return $this->state; - } - - public function setState($state, array $context = array()) - { - $oldState = $this->state; - $this->state = $state; - - switch ($state) { - case self::STATE_NEW: - $this->response = null; - break; - case self::STATE_TRANSFER: - if ($oldState !== $state) { - // Fix Content-Length and Transfer-Encoding collisions - if ($this->hasHeader('Transfer-Encoding') && $this->hasHeader('Content-Length')) { - $this->removeHeader('Transfer-Encoding'); - } - $this->dispatch('request.before_send', array('request' => $this)); - } - break; - case self::STATE_COMPLETE: - if ($oldState !== $state) { - $this->processResponse($context); - $this->responseBody = null; - } - break; - case self::STATE_ERROR: - if (isset($context['exception'])) { - $this->dispatch('request.exception', array( - 'request' => $this, - 'response' => isset($context['response']) ? $context['response'] : $this->response, - 'exception' => isset($context['exception']) ? $context['exception'] : null - )); - } - } - - return $this->state; - } - - public function getCurlOptions() - { - return $this->curlOptions; - } - - public function startResponse(Response $response) - { - $this->state = self::STATE_TRANSFER; - $response->setEffectiveUrl((string) $this->getUrl()); - $this->response = $response; - - return $this; - } - - public function setResponse(Response $response, $queued = false) - { - $response->setEffectiveUrl((string) $this->url); - - if ($queued) { - $ed = $this->getEventDispatcher(); - $ed->addListener('request.before_send', $f = function ($e) use ($response, &$f, $ed) { - $e['request']->setResponse($response); - $ed->removeListener('request.before_send', $f); - }, -9999); - } else { - $this->response = $response; - // If a specific response body is specified, then use it instead of the response's body - if ($this->responseBody && !$this->responseBody->getCustomData('default') && !$response->isRedirect()) { - $this->getResponseBody()->write((string) $this->response->getBody()); - } else { - $this->responseBody = $this->response->getBody(); - } - $this->setState(self::STATE_COMPLETE); - } - - return $this; - } - - public function setResponseBody($body) - { - // Attempt to open a file for writing if a string was passed - if (is_string($body)) { - // @codeCoverageIgnoreStart - if (!($body = fopen($body, 'w+'))) { - throw new InvalidArgumentException('Could not open ' . $body . ' for writing'); - } - // @codeCoverageIgnoreEnd - } - - $this->responseBody = EntityBody::factory($body); - - return $this; - } - - public function getResponseBody() - { - if ($this->responseBody === null) { - $this->responseBody = EntityBody::factory()->setCustomData('default', true); - } - - return $this->responseBody; - } - - /** - * Determine if the response body is repeatable (readable + seekable) - * - * @return bool - * @deprecated Use getResponseBody()->isSeekable() - * @codeCoverageIgnore - */ - public function isResponseBodyRepeatable() - { - Version::warn(__METHOD__ . ' is deprecated. Use $request->getResponseBody()->isRepeatable()'); - return !$this->responseBody ? true : $this->responseBody->isRepeatable(); - } - - public function getCookies() - { - if ($cookie = $this->getHeader('Cookie')) { - $data = ParserRegistry::getInstance()->getParser('cookie')->parseCookie($cookie); - return $data['cookies']; - } - - return array(); - } - - public function getCookie($name) - { - $cookies = $this->getCookies(); - - return isset($cookies[$name]) ? $cookies[$name] : null; - } - - public function addCookie($name, $value) - { - if (!$this->hasHeader('Cookie')) { - $this->setHeader('Cookie', "{$name}={$value}"); - } else { - $this->getHeader('Cookie')->add("{$name}={$value}"); - } - - // Always use semicolons to separate multiple cookie headers - $this->getHeader('Cookie')->setGlue(';'); - - return $this; - } - - public function removeCookie($name) - { - if ($cookie = $this->getHeader('Cookie')) { - foreach ($cookie as $cookieValue) { - if (strpos($cookieValue, $name . '=') === 0) { - $cookie->removeValue($cookieValue); - } - } - } - - return $this; - } - - public function setEventDispatcher(EventDispatcherInterface $eventDispatcher) - { - $this->eventDispatcher = $eventDispatcher; - $this->eventDispatcher->addListener('request.error', array(__CLASS__, 'onRequestError'), -255); - - return $this; - } - - public function getEventDispatcher() - { - if (!$this->eventDispatcher) { - $this->setEventDispatcher(new EventDispatcher()); - } - - return $this->eventDispatcher; - } - - public function dispatch($eventName, array $context = array()) - { - $context['request'] = $this; - - return $this->getEventDispatcher()->dispatch($eventName, new Event($context)); - } - - public function addSubscriber(EventSubscriberInterface $subscriber) - { - $this->getEventDispatcher()->addSubscriber($subscriber); - - return $this; - } - - /** - * Get an array containing the request and response for event notifications - * - * @return array - */ - protected function getEventArray() - { - return array( - 'request' => $this, - 'response' => $this->response - ); - } - - /** - * Process a received response - * - * @param array $context Contextual information - * @throws RequestException|BadResponseException on unsuccessful responses - */ - protected function processResponse(array $context = array()) - { - if (!$this->response) { - // If no response, then processResponse shouldn't have been called - $e = new RequestException('Error completing request'); - $e->setRequest($this); - throw $e; - } - - $this->state = self::STATE_COMPLETE; - - // A request was sent, but we don't know if we'll send more or if the final response will be successful - $this->dispatch('request.sent', $this->getEventArray() + $context); - - // Some response processors will remove the response or reset the state (example: ExponentialBackoffPlugin) - if ($this->state == RequestInterface::STATE_COMPLETE) { - - // The request completed, so the HTTP transaction is complete - $this->dispatch('request.complete', $this->getEventArray()); - - // If the response is bad, allow listeners to modify it or throw exceptions. You can change the response by - // modifying the Event object in your listeners or calling setResponse() on the request - if ($this->response->isError()) { - $event = new Event($this->getEventArray()); - $this->getEventDispatcher()->dispatch('request.error', $event); - // Allow events of request.error to quietly change the response - if ($event['response'] !== $this->response) { - $this->response = $event['response']; - } - } - - // If a successful response was received, dispatch an event - if ($this->response->isSuccessful()) { - $this->dispatch('request.success', $this->getEventArray()); - } - } - } - - /** - * @deprecated Use Guzzle\Plugin\Cache\DefaultCanCacheStrategy - * @codeCoverageIgnore - */ - public function canCache() - { - Version::warn(__METHOD__ . ' is deprecated. Use Guzzle\Plugin\Cache\DefaultCanCacheStrategy.'); - if (class_exists('Guzzle\Plugin\Cache\DefaultCanCacheStrategy')) { - $canCache = new \Guzzle\Plugin\Cache\DefaultCanCacheStrategy(); - return $canCache->canCacheRequest($this); - } else { - return false; - } - } - - /** - * @deprecated Use the history plugin (not emitting a warning as this is built-into the RedirectPlugin for now) - * @codeCoverageIgnore - */ - public function setIsRedirect($isRedirect) - { - $this->isRedirect = $isRedirect; - - return $this; - } - - /** - * @deprecated Use the history plugin - * @codeCoverageIgnore - */ - public function isRedirect() - { - Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin to track this.'); - return $this->isRedirect; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php deleted file mode 100644 index 598a2f697c..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactory.php +++ /dev/null @@ -1,359 +0,0 @@ -methods = array_flip(get_class_methods(__CLASS__)); - } - - public function fromMessage($message) - { - $parsed = ParserRegistry::getInstance()->getParser('message')->parseRequest($message); - - if (!$parsed) { - return false; - } - - $request = $this->fromParts($parsed['method'], $parsed['request_url'], - $parsed['headers'], $parsed['body'], $parsed['protocol'], - $parsed['version']); - - // EntityEnclosingRequest adds an "Expect: 100-Continue" header when using a raw request body for PUT or POST - // requests. This factory method should accurately reflect the message, so here we are removing the Expect - // header if one was not supplied in the message. - if (!isset($parsed['headers']['Expect']) && !isset($parsed['headers']['expect'])) { - $request->removeHeader('Expect'); - } - - return $request; - } - - public function fromParts( - $method, - array $urlParts, - $headers = null, - $body = null, - $protocol = 'HTTP', - $protocolVersion = '1.1' - ) { - return $this->create($method, Url::buildUrl($urlParts), $headers, $body) - ->setProtocolVersion($protocolVersion); - } - - public function create($method, $url, $headers = null, $body = null, array $options = array()) - { - $method = strtoupper($method); - - if ($method == 'GET' || $method == 'HEAD' || $method == 'TRACE' || $method == 'OPTIONS') { - // Handle non-entity-enclosing request methods - $request = new $this->requestClass($method, $url, $headers); - if ($body) { - // The body is where the response body will be stored - $type = gettype($body); - if ($type == 'string' || $type == 'resource' || $type == 'object') { - $request->setResponseBody($body); - } - } - } else { - // Create an entity enclosing request by default - $request = new $this->entityEnclosingRequestClass($method, $url, $headers); - if ($body || $body === '0') { - // Add POST fields and files to an entity enclosing request if an array is used - if (is_array($body) || $body instanceof Collection) { - // Normalize PHP style cURL uploads with a leading '@' symbol - foreach ($body as $key => $value) { - if (is_string($value) && substr($value, 0, 1) == '@') { - $request->addPostFile($key, $value); - unset($body[$key]); - } - } - // Add the fields if they are still present and not all files - $request->addPostFields($body); - } else { - // Add a raw entity body body to the request - $request->setBody($body, (string) $request->getHeader('Content-Type')); - if ((string) $request->getHeader('Transfer-Encoding') == 'chunked') { - $request->removeHeader('Content-Length'); - } - } - } - } - - if ($options) { - $this->applyOptions($request, $options); - } - - return $request; - } - - /** - * Clone a request while changing the method. Emulates the behavior of - * {@see Guzzle\Http\Message\Request::clone}, but can change the HTTP method. - * - * @param RequestInterface $request Request to clone - * @param string $method Method to set - * - * @return RequestInterface - */ - public function cloneRequestWithMethod(RequestInterface $request, $method) - { - // Create the request with the same client if possible - if ($request->getClient()) { - $cloned = $request->getClient()->createRequest($method, $request->getUrl(), $request->getHeaders()); - } else { - $cloned = $this->create($method, $request->getUrl(), $request->getHeaders()); - } - - $cloned->getCurlOptions()->replace($request->getCurlOptions()->toArray()); - $cloned->setEventDispatcher(clone $request->getEventDispatcher()); - // Ensure that that the Content-Length header is not copied if changing to GET or HEAD - if (!($cloned instanceof EntityEnclosingRequestInterface)) { - $cloned->removeHeader('Content-Length'); - } elseif ($request instanceof EntityEnclosingRequestInterface) { - $cloned->setBody($request->getBody()); - } - $cloned->getParams()->replace($request->getParams()->toArray()); - $cloned->dispatch('request.clone', array('request' => $cloned)); - - return $cloned; - } - - public function applyOptions(RequestInterface $request, array $options = array(), $flags = self::OPTIONS_NONE) - { - // Iterate over each key value pair and attempt to apply a config using function visitors - foreach ($options as $key => $value) { - $method = "visit_{$key}"; - if (isset($this->methods[$method])) { - $this->{$method}($request, $value, $flags); - } - } - } - - protected function visit_headers(RequestInterface $request, $value, $flags) - { - if (!is_array($value)) { - throw new InvalidArgumentException('headers value must be an array'); - } - - if ($flags & self::OPTIONS_AS_DEFAULTS) { - // Merge headers in but do not overwrite existing values - foreach ($value as $key => $header) { - if (!$request->hasHeader($key)) { - $request->setHeader($key, $header); - } - } - } else { - $request->addHeaders($value); - } - } - - protected function visit_body(RequestInterface $request, $value, $flags) - { - if ($request instanceof EntityEnclosingRequestInterface) { - $request->setBody($value); - } else { - throw new InvalidArgumentException('Attempting to set a body on a non-entity-enclosing request'); - } - } - - protected function visit_allow_redirects(RequestInterface $request, $value, $flags) - { - if ($value === false) { - $request->getParams()->set(RedirectPlugin::DISABLE, true); - } - } - - protected function visit_auth(RequestInterface $request, $value, $flags) - { - if (!is_array($value)) { - throw new InvalidArgumentException('auth value must be an array'); - } - - $request->setAuth($value[0], isset($value[1]) ? $value[1] : null, isset($value[2]) ? $value[2] : 'basic'); - } - - protected function visit_query(RequestInterface $request, $value, $flags) - { - if (!is_array($value)) { - throw new InvalidArgumentException('query value must be an array'); - } - - if ($flags & self::OPTIONS_AS_DEFAULTS) { - // Merge query string values in but do not overwrite existing values - $query = $request->getQuery(); - $query->overwriteWith(array_diff_key($value, $query->toArray())); - } else { - $request->getQuery()->overwriteWith($value); - } - } - - protected function visit_cookies(RequestInterface $request, $value, $flags) - { - if (!is_array($value)) { - throw new InvalidArgumentException('cookies value must be an array'); - } - - foreach ($value as $name => $v) { - $request->addCookie($name, $v); - } - } - - protected function visit_events(RequestInterface $request, $value, $flags) - { - if (!is_array($value)) { - throw new InvalidArgumentException('events value must be an array'); - } - - foreach ($value as $name => $method) { - if (is_array($method)) { - $request->getEventDispatcher()->addListener($name, $method[0], $method[1]); - } else { - $request->getEventDispatcher()->addListener($name, $method); - } - } - } - - protected function visit_plugins(RequestInterface $request, $value, $flags) - { - if (!is_array($value)) { - throw new InvalidArgumentException('plugins value must be an array'); - } - - foreach ($value as $plugin) { - $request->addSubscriber($plugin); - } - } - - protected function visit_exceptions(RequestInterface $request, $value, $flags) - { - if ($value === false || $value === 0) { - $dispatcher = $request->getEventDispatcher(); - foreach ($dispatcher->getListeners('request.error') as $listener) { - if (is_array($listener) && $listener[0] == 'Guzzle\Http\Message\Request' && $listener[1] = 'onRequestError') { - $dispatcher->removeListener('request.error', $listener); - break; - } - } - } - } - - protected function visit_save_to(RequestInterface $request, $value, $flags) - { - $request->setResponseBody($value); - } - - protected function visit_params(RequestInterface $request, $value, $flags) - { - if (!is_array($value)) { - throw new InvalidArgumentException('params value must be an array'); - } - - $request->getParams()->overwriteWith($value); - } - - protected function visit_timeout(RequestInterface $request, $value, $flags) - { - if (defined('CURLOPT_TIMEOUT_MS')) { - $request->getCurlOptions()->set(CURLOPT_TIMEOUT_MS, $value * 1000); - } else { - $request->getCurlOptions()->set(CURLOPT_TIMEOUT, $value); - } - } - - protected function visit_connect_timeout(RequestInterface $request, $value, $flags) - { - if (defined('CURLOPT_CONNECTTIMEOUT_MS')) { - $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT_MS, $value * 1000); - } else { - $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT, $value); - } - } - - protected function visit_debug(RequestInterface $request, $value, $flags) - { - if ($value) { - $request->getCurlOptions()->set(CURLOPT_VERBOSE, true); - } - } - - protected function visit_verify(RequestInterface $request, $value, $flags) - { - $curl = $request->getCurlOptions(); - if ($value === true || is_string($value)) { - $curl[CURLOPT_SSL_VERIFYHOST] = 2; - $curl[CURLOPT_SSL_VERIFYPEER] = true; - if ($value !== true) { - $curl[CURLOPT_CAINFO] = $value; - } - } elseif ($value === false) { - unset($curl[CURLOPT_CAINFO]); - $curl[CURLOPT_SSL_VERIFYHOST] = 0; - $curl[CURLOPT_SSL_VERIFYPEER] = false; - } - } - - protected function visit_proxy(RequestInterface $request, $value, $flags) - { - $request->getCurlOptions()->set(CURLOPT_PROXY, $value, $flags); - } - - protected function visit_cert(RequestInterface $request, $value, $flags) - { - if (is_array($value)) { - $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value[0]); - $request->getCurlOptions()->set(CURLOPT_SSLCERTPASSWD, $value[1]); - } else { - $request->getCurlOptions()->set(CURLOPT_SSLCERT, $value); - } - } - - protected function visit_ssl_key(RequestInterface $request, $value, $flags) - { - if (is_array($value)) { - $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value[0]); - $request->getCurlOptions()->set(CURLOPT_SSLKEYPASSWD, $value[1]); - } else { - $request->getCurlOptions()->set(CURLOPT_SSLKEY, $value); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php deleted file mode 100644 index 6088f10e99..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Message/RequestFactoryInterface.php +++ /dev/null @@ -1,105 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 208 => 'Already Reported', - 226 => 'IM Used', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 425 => 'Reserved for WebDAV advanced collections expired proposal', - 426 => 'Upgrade required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates (Experimental)', - 507 => 'Insufficient Storage', - 508 => 'Loop Detected', - 510 => 'Not Extended', - 511 => 'Network Authentication Required', - ); - - /** @var EntityBodyInterface The response body */ - protected $body; - - /** @var string The reason phrase of the response (human readable code) */ - protected $reasonPhrase; - - /** @var string The status code of the response */ - protected $statusCode; - - /** @var array Information about the request */ - protected $info = array(); - - /** @var string The effective URL that returned this response */ - protected $effectiveUrl; - - /** @var array Cacheable response codes (see RFC 2616:13.4) */ - protected static $cacheResponseCodes = array(200, 203, 206, 300, 301, 410); - - /** - * Create a new Response based on a raw response message - * - * @param string $message Response message - * - * @return self|bool Returns false on error - */ - public static function fromMessage($message) - { - $data = ParserRegistry::getInstance()->getParser('message')->parseResponse($message); - if (!$data) { - return false; - } - - $response = new static($data['code'], $data['headers'], $data['body']); - $response->setProtocol($data['protocol'], $data['version']) - ->setStatus($data['code'], $data['reason_phrase']); - - // Set the appropriate Content-Length if the one set is inaccurate (e.g. setting to X) - $contentLength = (string) $response->getHeader('Content-Length'); - $actualLength = strlen($data['body']); - if (strlen($data['body']) > 0 && $contentLength != $actualLength) { - $response->setHeader('Content-Length', $actualLength); - } - - return $response; - } - - /** - * Construct the response - * - * @param string $statusCode The response status code (e.g. 200, 404, etc) - * @param ToArrayInterface|array $headers The response headers - * @param string|resource|EntityBodyInterface $body The body of the response - * - * @throws BadResponseException if an invalid response code is given - */ - public function __construct($statusCode, $headers = null, $body = null) - { - parent::__construct(); - $this->setStatus($statusCode); - $this->body = EntityBody::factory($body !== null ? $body : ''); - - if ($headers) { - if (is_array($headers)) { - $this->setHeaders($headers); - } elseif ($headers instanceof ToArrayInterface) { - $this->setHeaders($headers->toArray()); - } else { - throw new BadResponseException('Invalid headers argument received'); - } - } - } - - /** - * @return string - */ - public function __toString() - { - return $this->getMessage(); - } - - public function serialize() - { - return json_encode(array( - 'status' => $this->statusCode, - 'body' => (string) $this->body, - 'headers' => $this->headers->toArray() - )); - } - - public function unserialize($serialize) - { - $data = json_decode($serialize, true); - $this->__construct($data['status'], $data['headers'], $data['body']); - } - - /** - * Get the response entity body - * - * @param bool $asString Set to TRUE to return a string of the body rather than a full body object - * - * @return EntityBodyInterface|string - */ - public function getBody($asString = false) - { - return $asString ? (string) $this->body : $this->body; - } - - /** - * Set the response entity body - * - * @param EntityBodyInterface|string $body Body to set - * - * @return self - */ - public function setBody($body) - { - $this->body = EntityBody::factory($body); - - return $this; - } - - /** - * Set the protocol and protocol version of the response - * - * @param string $protocol Response protocol - * @param string $version Protocol version - * - * @return self - */ - public function setProtocol($protocol, $version) - { - $this->protocol = $protocol; - $this->protocolVersion = $version; - - return $this; - } - - /** - * Get the protocol used for the response (e.g. HTTP) - * - * @return string - */ - public function getProtocol() - { - return $this->protocol; - } - - /** - * Get the HTTP protocol version - * - * @return string - */ - public function getProtocolVersion() - { - return $this->protocolVersion; - } - - /** - * Get a cURL transfer information - * - * @param string $key A single statistic to check - * - * @return array|string|null Returns all stats if no key is set, a single stat if a key is set, or null if a key - * is set and not found - * @link http://www.php.net/manual/en/function.curl-getinfo.php - */ - public function getInfo($key = null) - { - if ($key === null) { - return $this->info; - } elseif (array_key_exists($key, $this->info)) { - return $this->info[$key]; - } else { - return null; - } - } - - /** - * Set the transfer information - * - * @param array $info Array of cURL transfer stats - * - * @return self - */ - public function setInfo(array $info) - { - $this->info = $info; - - return $this; - } - - /** - * Set the response status - * - * @param int $statusCode Response status code to set - * @param string $reasonPhrase Response reason phrase - * - * @return self - * @throws BadResponseException when an invalid response code is received - */ - public function setStatus($statusCode, $reasonPhrase = '') - { - $this->statusCode = (int) $statusCode; - - if (!$reasonPhrase && isset(self::$statusTexts[$this->statusCode])) { - $this->reasonPhrase = self::$statusTexts[$this->statusCode]; - } else { - $this->reasonPhrase = $reasonPhrase; - } - - return $this; - } - - /** - * Get the response status code - * - * @return integer - */ - public function getStatusCode() - { - return $this->statusCode; - } - - /** - * Get the entire response as a string - * - * @return string - */ - public function getMessage() - { - $message = $this->getRawHeaders(); - - // Only include the body in the message if the size is < 2MB - $size = $this->body->getSize(); - if ($size < 2097152) { - $message .= (string) $this->body; - } - - return $message; - } - - /** - * Get the the raw message headers as a string - * - * @return string - */ - public function getRawHeaders() - { - $headers = 'HTTP/1.1 ' . $this->statusCode . ' ' . $this->reasonPhrase . "\r\n"; - $lines = $this->getHeaderLines(); - if (!empty($lines)) { - $headers .= implode("\r\n", $lines) . "\r\n"; - } - - return $headers . "\r\n"; - } - - /** - * Get the response reason phrase- a human readable version of the numeric - * status code - * - * @return string - */ - public function getReasonPhrase() - { - return $this->reasonPhrase; - } - - /** - * Get the Accept-Ranges HTTP header - * - * @return string Returns what partial content range types this server supports. - */ - public function getAcceptRanges() - { - return (string) $this->getHeader('Accept-Ranges'); - } - - /** - * Calculate the age of the response - * - * @return integer - */ - public function calculateAge() - { - $age = $this->getHeader('Age'); - - if ($age === null && $this->getDate()) { - $age = time() - strtotime($this->getDate()); - } - - return $age === null ? null : (int) (string) $age; - } - - /** - * Get the Age HTTP header - * - * @return integer|null Returns the age the object has been in a proxy cache in seconds. - */ - public function getAge() - { - return (string) $this->getHeader('Age'); - } - - /** - * Get the Allow HTTP header - * - * @return string|null Returns valid actions for a specified resource. To be used for a 405 Method not allowed. - */ - public function getAllow() - { - return (string) $this->getHeader('Allow'); - } - - /** - * Check if an HTTP method is allowed by checking the Allow response header - * - * @param string $method Method to check - * - * @return bool - */ - public function isMethodAllowed($method) - { - $allow = $this->getHeader('Allow'); - if ($allow) { - foreach (explode(',', $allow) as $allowable) { - if (!strcasecmp(trim($allowable), $method)) { - return true; - } - } - } - - return false; - } - - /** - * Get the Cache-Control HTTP header - * - * @return string - */ - public function getCacheControl() - { - return (string) $this->getHeader('Cache-Control'); - } - - /** - * Get the Connection HTTP header - * - * @return string - */ - public function getConnection() - { - return (string) $this->getHeader('Connection'); - } - - /** - * Get the Content-Encoding HTTP header - * - * @return string|null - */ - public function getContentEncoding() - { - return (string) $this->getHeader('Content-Encoding'); - } - - /** - * Get the Content-Language HTTP header - * - * @return string|null Returns the language the content is in. - */ - public function getContentLanguage() - { - return (string) $this->getHeader('Content-Language'); - } - - /** - * Get the Content-Length HTTP header - * - * @return integer Returns the length of the response body in bytes - */ - public function getContentLength() - { - return (int) (string) $this->getHeader('Content-Length'); - } - - /** - * Get the Content-Location HTTP header - * - * @return string|null Returns an alternate location for the returned data (e.g /index.htm) - */ - public function getContentLocation() - { - return (string) $this->getHeader('Content-Location'); - } - - /** - * Get the Content-Disposition HTTP header - * - * @return string|null Returns the Content-Disposition header - */ - public function getContentDisposition() - { - return (string) $this->getHeader('Content-Disposition'); - } - - /** - * Get the Content-MD5 HTTP header - * - * @return string|null Returns a Base64-encoded binary MD5 sum of the content of the response. - */ - public function getContentMd5() - { - return (string) $this->getHeader('Content-MD5'); - } - - /** - * Get the Content-Range HTTP header - * - * @return string Returns where in a full body message this partial message belongs (e.g. bytes 21010-47021/47022). - */ - public function getContentRange() - { - return (string) $this->getHeader('Content-Range'); - } - - /** - * Get the Content-Type HTTP header - * - * @return string Returns the mime type of this content. - */ - public function getContentType() - { - return (string) $this->getHeader('Content-Type'); - } - - /** - * Checks if the Content-Type is of a certain type. This is useful if the - * Content-Type header contains charset information and you need to know if - * the Content-Type matches a particular type. - * - * @param string $type Content type to check against - * - * @return bool - */ - public function isContentType($type) - { - return stripos($this->getHeader('Content-Type'), $type) !== false; - } - - /** - * Get the Date HTTP header - * - * @return string|null Returns the date and time that the message was sent. - */ - public function getDate() - { - return (string) $this->getHeader('Date'); - } - - /** - * Get the ETag HTTP header - * - * @return string|null Returns an identifier for a specific version of a resource, often a Message digest. - */ - public function getEtag() - { - return (string) $this->getHeader('ETag'); - } - - /** - * Get the Expires HTTP header - * - * @return string|null Returns the date/time after which the response is considered stale. - */ - public function getExpires() - { - return (string) $this->getHeader('Expires'); - } - - /** - * Get the Last-Modified HTTP header - * - * @return string|null Returns the last modified date for the requested object, in RFC 2822 format - * (e.g. Tue, 15 Nov 1994 12:45:26 GMT) - */ - public function getLastModified() - { - return (string) $this->getHeader('Last-Modified'); - } - - /** - * Get the Location HTTP header - * - * @return string|null Used in redirection, or when a new resource has been created. - */ - public function getLocation() - { - return (string) $this->getHeader('Location'); - } - - /** - * Get the Pragma HTTP header - * - * @return Header|null Returns the implementation-specific headers that may have various effects anywhere along - * the request-response chain. - */ - public function getPragma() - { - return (string) $this->getHeader('Pragma'); - } - - /** - * Get the Proxy-Authenticate HTTP header - * - * @return string|null Authentication to access the proxy (e.g. Basic) - */ - public function getProxyAuthenticate() - { - return (string) $this->getHeader('Proxy-Authenticate'); - } - - /** - * Get the Retry-After HTTP header - * - * @return int|null If an entity is temporarily unavailable, this instructs the client to try again after a - * specified period of time. - */ - public function getRetryAfter() - { - return (string) $this->getHeader('Retry-After'); - } - - /** - * Get the Server HTTP header - * - * @return string|null A name for the server - */ - public function getServer() - { - return (string) $this->getHeader('Server'); - } - - /** - * Get the Set-Cookie HTTP header - * - * @return string|null An HTTP cookie. - */ - public function getSetCookie() - { - return (string) $this->getHeader('Set-Cookie'); - } - - /** - * Get the Trailer HTTP header - * - * @return string|null The Trailer general field value indicates that the given set of header fields is present in - * the trailer of a message encoded with chunked transfer-coding. - */ - public function getTrailer() - { - return (string) $this->getHeader('Trailer'); - } - - /** - * Get the Transfer-Encoding HTTP header - * - * @return string|null The form of encoding used to safely transfer the entity to the user - */ - public function getTransferEncoding() - { - return (string) $this->getHeader('Transfer-Encoding'); - } - - /** - * Get the Vary HTTP header - * - * @return string|null Tells downstream proxies how to match future request headers to decide whether the cached - * response can be used rather than requesting a fresh one from the origin server. - */ - public function getVary() - { - return (string) $this->getHeader('Vary'); - } - - /** - * Get the Via HTTP header - * - * @return string|null Informs the client of proxies through which the response was sent. - */ - public function getVia() - { - return (string) $this->getHeader('Via'); - } - - /** - * Get the Warning HTTP header - * - * @return string|null A general warning about possible problems with the entity body - */ - public function getWarning() - { - return (string) $this->getHeader('Warning'); - } - - /** - * Get the WWW-Authenticate HTTP header - * - * @return string|null Indicates the authentication scheme that should be used to access the requested entity - */ - public function getWwwAuthenticate() - { - return (string) $this->getHeader('WWW-Authenticate'); - } - - /** - * Checks if HTTP Status code is a Client Error (4xx) - * - * @return bool - */ - public function isClientError() - { - return $this->statusCode >= 400 && $this->statusCode < 500; - } - - /** - * Checks if HTTP Status code is Server OR Client Error (4xx or 5xx) - * - * @return boolean - */ - public function isError() - { - return $this->isClientError() || $this->isServerError(); - } - - /** - * Checks if HTTP Status code is Information (1xx) - * - * @return bool - */ - public function isInformational() - { - return $this->statusCode < 200; - } - - /** - * Checks if HTTP Status code is a Redirect (3xx) - * - * @return bool - */ - public function isRedirect() - { - return $this->statusCode >= 300 && $this->statusCode < 400; - } - - /** - * Checks if HTTP Status code is Server Error (5xx) - * - * @return bool - */ - public function isServerError() - { - return $this->statusCode >= 500 && $this->statusCode < 600; - } - - /** - * Checks if HTTP Status code is Successful (2xx | 304) - * - * @return bool - */ - public function isSuccessful() - { - return ($this->statusCode >= 200 && $this->statusCode < 300) || $this->statusCode == 304; - } - - /** - * Check if the response can be cached based on the response headers - * - * @return bool Returns TRUE if the response can be cached or false if not - */ - public function canCache() - { - // Check if the response is cacheable based on the code - if (!in_array((int) $this->getStatusCode(), self::$cacheResponseCodes)) { - return false; - } - - // Make sure a valid body was returned and can be cached - if ((!$this->getBody()->isReadable() || !$this->getBody()->isSeekable()) - && ($this->getContentLength() > 0 || $this->getTransferEncoding() == 'chunked')) { - return false; - } - - // Never cache no-store resources (this is a private cache, so private - // can be cached) - if ($this->getHeader('Cache-Control') && $this->getHeader('Cache-Control')->hasDirective('no-store')) { - return false; - } - - return $this->isFresh() || $this->getFreshness() === null || $this->canValidate(); - } - - /** - * Gets the number of seconds from the current time in which this response is still considered fresh - * - * @return int|null Returns the number of seconds - */ - public function getMaxAge() - { - if ($header = $this->getHeader('Cache-Control')) { - // s-max-age, then max-age, then Expires - if ($age = $header->getDirective('s-maxage')) { - return $age; - } - if ($age = $header->getDirective('max-age')) { - return $age; - } - } - - if ($this->getHeader('Expires')) { - return strtotime($this->getExpires()) - time(); - } - - return null; - } - - /** - * Check if the response is considered fresh. - * - * A response is considered fresh when its age is less than or equal to the freshness lifetime (maximum age) of the - * response. - * - * @return bool|null - */ - public function isFresh() - { - $fresh = $this->getFreshness(); - - return $fresh === null ? null : $fresh >= 0; - } - - /** - * Check if the response can be validated against the origin server using a conditional GET request. - * - * @return bool - */ - public function canValidate() - { - return $this->getEtag() || $this->getLastModified(); - } - - /** - * Get the freshness of the response by returning the difference of the maximum lifetime of the response and the - * age of the response (max-age - age). - * - * Freshness values less than 0 mean that the response is no longer fresh and is ABS(freshness) seconds expired. - * Freshness values of greater than zero is the number of seconds until the response is no longer fresh. A NULL - * result means that no freshness information is available. - * - * @return int - */ - public function getFreshness() - { - $maxAge = $this->getMaxAge(); - $age = $this->calculateAge(); - - return $maxAge && $age ? ($maxAge - $age) : null; - } - - /** - * Parse the JSON response body and return an array - * - * @return array|string|int|bool|float - * @throws RuntimeException if the response body is not in JSON format - */ - public function json() - { - $data = json_decode((string) $this->body, true); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new RuntimeException('Unable to parse response body into JSON: ' . json_last_error()); - } - - return $data === null ? array() : $data; - } - - /** - * Parse the XML response body and return a \SimpleXMLElement. - * - * In order to prevent XXE attacks, this method disables loading external - * entities. If you rely on external entities, then you must parse the - * XML response manually by accessing the response body directly. - * - * @return \SimpleXMLElement - * @throws RuntimeException if the response body is not in XML format - * @link http://websec.io/2012/08/27/Preventing-XXE-in-PHP.html - */ - public function xml() - { - $errorMessage = null; - $internalErrors = libxml_use_internal_errors(true); - $disableEntities = libxml_disable_entity_loader(true); - libxml_clear_errors(); - - try { - $xml = new \SimpleXMLElement((string) $this->body ?: '', LIBXML_NONET); - if ($error = libxml_get_last_error()) { - $errorMessage = $error->message; - } - } catch (\Exception $e) { - $errorMessage = $e->getMessage(); - } - - libxml_clear_errors(); - libxml_use_internal_errors($internalErrors); - libxml_disable_entity_loader($disableEntities); - - if ($errorMessage) { - throw new RuntimeException('Unable to parse response body into XML: ' . $errorMessage); - } - - return $xml; - } - - /** - * Get the redirect count of this response - * - * @return int - */ - public function getRedirectCount() - { - return (int) $this->params->get(RedirectPlugin::REDIRECT_COUNT); - } - - /** - * Set the effective URL that resulted in this response (e.g. the last redirect URL) - * - * @param string $url The effective URL - * - * @return self - */ - public function setEffectiveUrl($url) - { - $this->effectiveUrl = $url; - - return $this; - } - - /** - * Get the effective URL that resulted in this response (e.g. the last redirect URL) - * - * @return string - */ - public function getEffectiveUrl() - { - return $this->effectiveUrl; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function getPreviousResponse() - { - Version::warn(__METHOD__ . ' is deprecated. Use the HistoryPlugin.'); - return null; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function setRequest($request) - { - Version::warn(__METHOD__ . ' is deprecated'); - return $this; - } - - /** - * @deprecated - * @codeCoverageIgnore - */ - public function getRequest() - { - Version::warn(__METHOD__ . ' is deprecated'); - return null; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Mimetypes.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Mimetypes.php deleted file mode 100644 index d71586a05b..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Mimetypes.php +++ /dev/null @@ -1,962 +0,0 @@ - 'text/vnd.in3d.3dml', - '3g2' => 'video/3gpp2', - '3gp' => 'video/3gpp', - '7z' => 'application/x-7z-compressed', - 'aab' => 'application/x-authorware-bin', - 'aac' => 'audio/x-aac', - 'aam' => 'application/x-authorware-map', - 'aas' => 'application/x-authorware-seg', - 'abw' => 'application/x-abiword', - 'ac' => 'application/pkix-attr-cert', - 'acc' => 'application/vnd.americandynamics.acc', - 'ace' => 'application/x-ace-compressed', - 'acu' => 'application/vnd.acucobol', - 'acutc' => 'application/vnd.acucorp', - 'adp' => 'audio/adpcm', - 'aep' => 'application/vnd.audiograph', - 'afm' => 'application/x-font-type1', - 'afp' => 'application/vnd.ibm.modcap', - 'ahead' => 'application/vnd.ahead.space', - 'ai' => 'application/postscript', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'air' => 'application/vnd.adobe.air-application-installer-package+zip', - 'ait' => 'application/vnd.dvb.ait', - 'ami' => 'application/vnd.amiga.ami', - 'apk' => 'application/vnd.android.package-archive', - 'application' => 'application/x-ms-application', - 'apr' => 'application/vnd.lotus-approach', - 'asa' => 'text/plain', - 'asax' => 'application/octet-stream', - 'asc' => 'application/pgp-signature', - 'ascx' => 'text/plain', - 'asf' => 'video/x-ms-asf', - 'ashx' => 'text/plain', - 'asm' => 'text/x-asm', - 'asmx' => 'text/plain', - 'aso' => 'application/vnd.accpac.simply.aso', - 'asp' => 'text/plain', - 'aspx' => 'text/plain', - 'asx' => 'video/x-ms-asf', - 'atc' => 'application/vnd.acucorp', - 'atom' => 'application/atom+xml', - 'atomcat' => 'application/atomcat+xml', - 'atomsvc' => 'application/atomsvc+xml', - 'atx' => 'application/vnd.antix.game-component', - 'au' => 'audio/basic', - 'avi' => 'video/x-msvideo', - 'aw' => 'application/applixware', - 'axd' => 'text/plain', - 'azf' => 'application/vnd.airzip.filesecure.azf', - 'azs' => 'application/vnd.airzip.filesecure.azs', - 'azw' => 'application/vnd.amazon.ebook', - 'bat' => 'application/x-msdownload', - 'bcpio' => 'application/x-bcpio', - 'bdf' => 'application/x-font-bdf', - 'bdm' => 'application/vnd.syncml.dm+wbxml', - 'bed' => 'application/vnd.realvnc.bed', - 'bh2' => 'application/vnd.fujitsu.oasysprs', - 'bin' => 'application/octet-stream', - 'bmi' => 'application/vnd.bmi', - 'bmp' => 'image/bmp', - 'book' => 'application/vnd.framemaker', - 'box' => 'application/vnd.previewsystems.box', - 'boz' => 'application/x-bzip2', - 'bpk' => 'application/octet-stream', - 'btif' => 'image/prs.btif', - 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', - 'c' => 'text/x-c', - 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', - 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', - 'c4d' => 'application/vnd.clonk.c4group', - 'c4f' => 'application/vnd.clonk.c4group', - 'c4g' => 'application/vnd.clonk.c4group', - 'c4p' => 'application/vnd.clonk.c4group', - 'c4u' => 'application/vnd.clonk.c4group', - 'cab' => 'application/vnd.ms-cab-compressed', - 'car' => 'application/vnd.curl.car', - 'cat' => 'application/vnd.ms-pki.seccat', - 'cc' => 'text/x-c', - 'cct' => 'application/x-director', - 'ccxml' => 'application/ccxml+xml', - 'cdbcmsg' => 'application/vnd.contact.cmsg', - 'cdf' => 'application/x-netcdf', - 'cdkey' => 'application/vnd.mediastation.cdkey', - 'cdmia' => 'application/cdmi-capability', - 'cdmic' => 'application/cdmi-container', - 'cdmid' => 'application/cdmi-domain', - 'cdmio' => 'application/cdmi-object', - 'cdmiq' => 'application/cdmi-queue', - 'cdx' => 'chemical/x-cdx', - 'cdxml' => 'application/vnd.chemdraw+xml', - 'cdy' => 'application/vnd.cinderella', - 'cer' => 'application/pkix-cert', - 'cfc' => 'application/x-coldfusion', - 'cfm' => 'application/x-coldfusion', - 'cgm' => 'image/cgm', - 'chat' => 'application/x-chat', - 'chm' => 'application/vnd.ms-htmlhelp', - 'chrt' => 'application/vnd.kde.kchart', - 'cif' => 'chemical/x-cif', - 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', - 'cil' => 'application/vnd.ms-artgalry', - 'cla' => 'application/vnd.claymore', - 'class' => 'application/java-vm', - 'clkk' => 'application/vnd.crick.clicker.keyboard', - 'clkp' => 'application/vnd.crick.clicker.palette', - 'clkt' => 'application/vnd.crick.clicker.template', - 'clkw' => 'application/vnd.crick.clicker.wordbank', - 'clkx' => 'application/vnd.crick.clicker', - 'clp' => 'application/x-msclip', - 'cmc' => 'application/vnd.cosmocaller', - 'cmdf' => 'chemical/x-cmdf', - 'cml' => 'chemical/x-cml', - 'cmp' => 'application/vnd.yellowriver-custom-menu', - 'cmx' => 'image/x-cmx', - 'cod' => 'application/vnd.rim.cod', - 'com' => 'application/x-msdownload', - 'conf' => 'text/plain', - 'cpio' => 'application/x-cpio', - 'cpp' => 'text/x-c', - 'cpt' => 'application/mac-compactpro', - 'crd' => 'application/x-mscardfile', - 'crl' => 'application/pkix-crl', - 'crt' => 'application/x-x509-ca-cert', - 'cryptonote' => 'application/vnd.rig.cryptonote', - 'cs' => 'text/plain', - 'csh' => 'application/x-csh', - 'csml' => 'chemical/x-csml', - 'csp' => 'application/vnd.commonspace', - 'css' => 'text/css', - 'cst' => 'application/x-director', - 'csv' => 'text/csv', - 'cu' => 'application/cu-seeme', - 'curl' => 'text/vnd.curl', - 'cww' => 'application/prs.cww', - 'cxt' => 'application/x-director', - 'cxx' => 'text/x-c', - 'dae' => 'model/vnd.collada+xml', - 'daf' => 'application/vnd.mobius.daf', - 'dataless' => 'application/vnd.fdsn.seed', - 'davmount' => 'application/davmount+xml', - 'dcr' => 'application/x-director', - 'dcurl' => 'text/vnd.curl.dcurl', - 'dd2' => 'application/vnd.oma.dd2+xml', - 'ddd' => 'application/vnd.fujixerox.ddd', - 'deb' => 'application/x-debian-package', - 'def' => 'text/plain', - 'deploy' => 'application/octet-stream', - 'der' => 'application/x-x509-ca-cert', - 'dfac' => 'application/vnd.dreamfactory', - 'dic' => 'text/x-c', - 'dir' => 'application/x-director', - 'dis' => 'application/vnd.mobius.dis', - 'dist' => 'application/octet-stream', - 'distz' => 'application/octet-stream', - 'djv' => 'image/vnd.djvu', - 'djvu' => 'image/vnd.djvu', - 'dll' => 'application/x-msdownload', - 'dmg' => 'application/octet-stream', - 'dms' => 'application/octet-stream', - 'dna' => 'application/vnd.dna', - 'doc' => 'application/msword', - 'docm' => 'application/vnd.ms-word.document.macroenabled.12', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dot' => 'application/msword', - 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'dp' => 'application/vnd.osgi.dp', - 'dpg' => 'application/vnd.dpgraph', - 'dra' => 'audio/vnd.dra', - 'dsc' => 'text/prs.lines.tag', - 'dssc' => 'application/dssc+der', - 'dtb' => 'application/x-dtbook+xml', - 'dtd' => 'application/xml-dtd', - 'dts' => 'audio/vnd.dts', - 'dtshd' => 'audio/vnd.dts.hd', - 'dump' => 'application/octet-stream', - 'dvi' => 'application/x-dvi', - 'dwf' => 'model/vnd.dwf', - 'dwg' => 'image/vnd.dwg', - 'dxf' => 'image/vnd.dxf', - 'dxp' => 'application/vnd.spotfire.dxp', - 'dxr' => 'application/x-director', - 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', - 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', - 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', - 'ecma' => 'application/ecmascript', - 'edm' => 'application/vnd.novadigm.edm', - 'edx' => 'application/vnd.novadigm.edx', - 'efif' => 'application/vnd.picsel', - 'ei6' => 'application/vnd.pg.osasli', - 'elc' => 'application/octet-stream', - 'eml' => 'message/rfc822', - 'emma' => 'application/emma+xml', - 'eol' => 'audio/vnd.digital-winds', - 'eot' => 'application/vnd.ms-fontobject', - 'eps' => 'application/postscript', - 'epub' => 'application/epub+zip', - 'es3' => 'application/vnd.eszigno3+xml', - 'esf' => 'application/vnd.epson.esf', - 'et3' => 'application/vnd.eszigno3+xml', - 'etx' => 'text/x-setext', - 'exe' => 'application/x-msdownload', - 'exi' => 'application/exi', - 'ext' => 'application/vnd.novadigm.ext', - 'ez' => 'application/andrew-inset', - 'ez2' => 'application/vnd.ezpix-album', - 'ez3' => 'application/vnd.ezpix-package', - 'f' => 'text/x-fortran', - 'f4v' => 'video/x-f4v', - 'f77' => 'text/x-fortran', - 'f90' => 'text/x-fortran', - 'fbs' => 'image/vnd.fastbidsheet', - 'fcs' => 'application/vnd.isac.fcs', - 'fdf' => 'application/vnd.fdf', - 'fe_launch' => 'application/vnd.denovo.fcselayout-link', - 'fg5' => 'application/vnd.fujitsu.oasysgp', - 'fgd' => 'application/x-director', - 'fh' => 'image/x-freehand', - 'fh4' => 'image/x-freehand', - 'fh5' => 'image/x-freehand', - 'fh7' => 'image/x-freehand', - 'fhc' => 'image/x-freehand', - 'fig' => 'application/x-xfig', - 'fli' => 'video/x-fli', - 'flo' => 'application/vnd.micrografx.flo', - 'flv' => 'video/x-flv', - 'flw' => 'application/vnd.kde.kivio', - 'flx' => 'text/vnd.fmi.flexstor', - 'fly' => 'text/vnd.fly', - 'fm' => 'application/vnd.framemaker', - 'fnc' => 'application/vnd.frogans.fnc', - 'for' => 'text/x-fortran', - 'fpx' => 'image/vnd.fpx', - 'frame' => 'application/vnd.framemaker', - 'fsc' => 'application/vnd.fsc.weblaunch', - 'fst' => 'image/vnd.fst', - 'ftc' => 'application/vnd.fluxtime.clip', - 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', - 'fvt' => 'video/vnd.fvt', - 'fxp' => 'application/vnd.adobe.fxp', - 'fxpl' => 'application/vnd.adobe.fxp', - 'fzs' => 'application/vnd.fuzzysheet', - 'g2w' => 'application/vnd.geoplan', - 'g3' => 'image/g3fax', - 'g3w' => 'application/vnd.geospace', - 'gac' => 'application/vnd.groove-account', - 'gdl' => 'model/vnd.gdl', - 'geo' => 'application/vnd.dynageo', - 'gex' => 'application/vnd.geometry-explorer', - 'ggb' => 'application/vnd.geogebra.file', - 'ggt' => 'application/vnd.geogebra.tool', - 'ghf' => 'application/vnd.groove-help', - 'gif' => 'image/gif', - 'gim' => 'application/vnd.groove-identity-message', - 'gmx' => 'application/vnd.gmx', - 'gnumeric' => 'application/x-gnumeric', - 'gph' => 'application/vnd.flographit', - 'gqf' => 'application/vnd.grafeq', - 'gqs' => 'application/vnd.grafeq', - 'gram' => 'application/srgs', - 'gre' => 'application/vnd.geometry-explorer', - 'grv' => 'application/vnd.groove-injector', - 'grxml' => 'application/srgs+xml', - 'gsf' => 'application/x-font-ghostscript', - 'gtar' => 'application/x-gtar', - 'gtm' => 'application/vnd.groove-tool-message', - 'gtw' => 'model/vnd.gtw', - 'gv' => 'text/vnd.graphviz', - 'gxt' => 'application/vnd.geonext', - 'h' => 'text/x-c', - 'h261' => 'video/h261', - 'h263' => 'video/h263', - 'h264' => 'video/h264', - 'hal' => 'application/vnd.hal+xml', - 'hbci' => 'application/vnd.hbci', - 'hdf' => 'application/x-hdf', - 'hh' => 'text/x-c', - 'hlp' => 'application/winhlp', - 'hpgl' => 'application/vnd.hp-hpgl', - 'hpid' => 'application/vnd.hp-hpid', - 'hps' => 'application/vnd.hp-hps', - 'hqx' => 'application/mac-binhex40', - 'hta' => 'application/octet-stream', - 'htc' => 'text/html', - 'htke' => 'application/vnd.kenameaapp', - 'htm' => 'text/html', - 'html' => 'text/html', - 'hvd' => 'application/vnd.yamaha.hv-dic', - 'hvp' => 'application/vnd.yamaha.hv-voice', - 'hvs' => 'application/vnd.yamaha.hv-script', - 'i2g' => 'application/vnd.intergeo', - 'icc' => 'application/vnd.iccprofile', - 'ice' => 'x-conference/x-cooltalk', - 'icm' => 'application/vnd.iccprofile', - 'ico' => 'image/x-icon', - 'ics' => 'text/calendar', - 'ief' => 'image/ief', - 'ifb' => 'text/calendar', - 'ifm' => 'application/vnd.shana.informed.formdata', - 'iges' => 'model/iges', - 'igl' => 'application/vnd.igloader', - 'igm' => 'application/vnd.insors.igm', - 'igs' => 'model/iges', - 'igx' => 'application/vnd.micrografx.igx', - 'iif' => 'application/vnd.shana.informed.interchange', - 'imp' => 'application/vnd.accpac.simply.imp', - 'ims' => 'application/vnd.ms-ims', - 'in' => 'text/plain', - 'ini' => 'text/plain', - 'ipfix' => 'application/ipfix', - 'ipk' => 'application/vnd.shana.informed.package', - 'irm' => 'application/vnd.ibm.rights-management', - 'irp' => 'application/vnd.irepository.package+xml', - 'iso' => 'application/octet-stream', - 'itp' => 'application/vnd.shana.informed.formtemplate', - 'ivp' => 'application/vnd.immervision-ivp', - 'ivu' => 'application/vnd.immervision-ivu', - 'jad' => 'text/vnd.sun.j2me.app-descriptor', - 'jam' => 'application/vnd.jam', - 'jar' => 'application/java-archive', - 'java' => 'text/x-java-source', - 'jisp' => 'application/vnd.jisp', - 'jlt' => 'application/vnd.hp-jlyt', - 'jnlp' => 'application/x-java-jnlp-file', - 'joda' => 'application/vnd.joost.joda-archive', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'jpgm' => 'video/jpm', - 'jpgv' => 'video/jpeg', - 'jpm' => 'video/jpm', - 'js' => 'text/javascript', - 'json' => 'application/json', - 'kar' => 'audio/midi', - 'karbon' => 'application/vnd.kde.karbon', - 'kfo' => 'application/vnd.kde.kformula', - 'kia' => 'application/vnd.kidspiration', - 'kml' => 'application/vnd.google-earth.kml+xml', - 'kmz' => 'application/vnd.google-earth.kmz', - 'kne' => 'application/vnd.kinar', - 'knp' => 'application/vnd.kinar', - 'kon' => 'application/vnd.kde.kontour', - 'kpr' => 'application/vnd.kde.kpresenter', - 'kpt' => 'application/vnd.kde.kpresenter', - 'ksp' => 'application/vnd.kde.kspread', - 'ktr' => 'application/vnd.kahootz', - 'ktx' => 'image/ktx', - 'ktz' => 'application/vnd.kahootz', - 'kwd' => 'application/vnd.kde.kword', - 'kwt' => 'application/vnd.kde.kword', - 'lasxml' => 'application/vnd.las.las+xml', - 'latex' => 'application/x-latex', - 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', - 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', - 'les' => 'application/vnd.hhe.lesson-player', - 'lha' => 'application/octet-stream', - 'link66' => 'application/vnd.route66.link66+xml', - 'list' => 'text/plain', - 'list3820' => 'application/vnd.ibm.modcap', - 'listafp' => 'application/vnd.ibm.modcap', - 'log' => 'text/plain', - 'lostxml' => 'application/lost+xml', - 'lrf' => 'application/octet-stream', - 'lrm' => 'application/vnd.ms-lrm', - 'ltf' => 'application/vnd.frogans.ltf', - 'lvp' => 'audio/vnd.lucent.voice', - 'lwp' => 'application/vnd.lotus-wordpro', - 'lzh' => 'application/octet-stream', - 'm13' => 'application/x-msmediaview', - 'm14' => 'application/x-msmediaview', - 'm1v' => 'video/mpeg', - 'm21' => 'application/mp21', - 'm2a' => 'audio/mpeg', - 'm2v' => 'video/mpeg', - 'm3a' => 'audio/mpeg', - 'm3u' => 'audio/x-mpegurl', - 'm3u8' => 'application/vnd.apple.mpegurl', - 'm4a' => 'audio/mp4', - 'm4u' => 'video/vnd.mpegurl', - 'm4v' => 'video/mp4', - 'ma' => 'application/mathematica', - 'mads' => 'application/mads+xml', - 'mag' => 'application/vnd.ecowin.chart', - 'maker' => 'application/vnd.framemaker', - 'man' => 'text/troff', - 'mathml' => 'application/mathml+xml', - 'mb' => 'application/mathematica', - 'mbk' => 'application/vnd.mobius.mbk', - 'mbox' => 'application/mbox', - 'mc1' => 'application/vnd.medcalcdata', - 'mcd' => 'application/vnd.mcd', - 'mcurl' => 'text/vnd.curl.mcurl', - 'mdb' => 'application/x-msaccess', - 'mdi' => 'image/vnd.ms-modi', - 'me' => 'text/troff', - 'mesh' => 'model/mesh', - 'meta4' => 'application/metalink4+xml', - 'mets' => 'application/mets+xml', - 'mfm' => 'application/vnd.mfmp', - 'mgp' => 'application/vnd.osgeo.mapguide.package', - 'mgz' => 'application/vnd.proteus.magazine', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mif' => 'application/vnd.mif', - 'mime' => 'message/rfc822', - 'mj2' => 'video/mj2', - 'mjp2' => 'video/mj2', - 'mlp' => 'application/vnd.dolby.mlp', - 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', - 'mmf' => 'application/vnd.smaf', - 'mmr' => 'image/vnd.fujixerox.edmics-mmr', - 'mny' => 'application/x-msmoney', - 'mobi' => 'application/x-mobipocket-ebook', - 'mods' => 'application/mods+xml', - 'mov' => 'video/quicktime', - 'movie' => 'video/x-sgi-movie', - 'mp2' => 'audio/mpeg', - 'mp21' => 'application/mp21', - 'mp2a' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mp4' => 'video/mp4', - 'mp4a' => 'audio/mp4', - 'mp4s' => 'application/mp4', - 'mp4v' => 'video/mp4', - 'mpc' => 'application/vnd.mophun.certificate', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpg4' => 'video/mp4', - 'mpga' => 'audio/mpeg', - 'mpkg' => 'application/vnd.apple.installer+xml', - 'mpm' => 'application/vnd.blueice.multipass', - 'mpn' => 'application/vnd.mophun.application', - 'mpp' => 'application/vnd.ms-project', - 'mpt' => 'application/vnd.ms-project', - 'mpy' => 'application/vnd.ibm.minipay', - 'mqy' => 'application/vnd.mobius.mqy', - 'mrc' => 'application/marc', - 'mrcx' => 'application/marcxml+xml', - 'ms' => 'text/troff', - 'mscml' => 'application/mediaservercontrol+xml', - 'mseed' => 'application/vnd.fdsn.mseed', - 'mseq' => 'application/vnd.mseq', - 'msf' => 'application/vnd.epson.msf', - 'msh' => 'model/mesh', - 'msi' => 'application/x-msdownload', - 'msl' => 'application/vnd.mobius.msl', - 'msty' => 'application/vnd.muvee.style', - 'mts' => 'model/vnd.mts', - 'mus' => 'application/vnd.musician', - 'musicxml' => 'application/vnd.recordare.musicxml+xml', - 'mvb' => 'application/x-msmediaview', - 'mwf' => 'application/vnd.mfer', - 'mxf' => 'application/mxf', - 'mxl' => 'application/vnd.recordare.musicxml', - 'mxml' => 'application/xv+xml', - 'mxs' => 'application/vnd.triscape.mxs', - 'mxu' => 'video/vnd.mpegurl', - 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', - 'n3' => 'text/n3', - 'nb' => 'application/mathematica', - 'nbp' => 'application/vnd.wolfram.player', - 'nc' => 'application/x-netcdf', - 'ncx' => 'application/x-dtbncx+xml', - 'ngdat' => 'application/vnd.nokia.n-gage.data', - 'nlu' => 'application/vnd.neurolanguage.nlu', - 'nml' => 'application/vnd.enliven', - 'nnd' => 'application/vnd.noblenet-directory', - 'nns' => 'application/vnd.noblenet-sealer', - 'nnw' => 'application/vnd.noblenet-web', - 'npx' => 'image/vnd.net-fpx', - 'nsf' => 'application/vnd.lotus-notes', - 'oa2' => 'application/vnd.fujitsu.oasys2', - 'oa3' => 'application/vnd.fujitsu.oasys3', - 'oas' => 'application/vnd.fujitsu.oasys', - 'obd' => 'application/x-msbinder', - 'oda' => 'application/oda', - 'odb' => 'application/vnd.oasis.opendocument.database', - 'odc' => 'application/vnd.oasis.opendocument.chart', - 'odf' => 'application/vnd.oasis.opendocument.formula', - 'odft' => 'application/vnd.oasis.opendocument.formula-template', - 'odg' => 'application/vnd.oasis.opendocument.graphics', - 'odi' => 'application/vnd.oasis.opendocument.image', - 'odm' => 'application/vnd.oasis.opendocument.text-master', - 'odp' => 'application/vnd.oasis.opendocument.presentation', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', - 'odt' => 'application/vnd.oasis.opendocument.text', - 'oga' => 'audio/ogg', - 'ogg' => 'audio/ogg', - 'ogv' => 'video/ogg', - 'ogx' => 'application/ogg', - 'onepkg' => 'application/onenote', - 'onetmp' => 'application/onenote', - 'onetoc' => 'application/onenote', - 'onetoc2' => 'application/onenote', - 'opf' => 'application/oebps-package+xml', - 'oprc' => 'application/vnd.palm', - 'org' => 'application/vnd.lotus-organizer', - 'osf' => 'application/vnd.yamaha.openscoreformat', - 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', - 'otc' => 'application/vnd.oasis.opendocument.chart-template', - 'otf' => 'application/x-font-otf', - 'otg' => 'application/vnd.oasis.opendocument.graphics-template', - 'oth' => 'application/vnd.oasis.opendocument.text-web', - 'oti' => 'application/vnd.oasis.opendocument.image-template', - 'otp' => 'application/vnd.oasis.opendocument.presentation-template', - 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', - 'ott' => 'application/vnd.oasis.opendocument.text-template', - 'oxt' => 'application/vnd.openofficeorg.extension', - 'p' => 'text/x-pascal', - 'p10' => 'application/pkcs10', - 'p12' => 'application/x-pkcs12', - 'p7b' => 'application/x-pkcs7-certificates', - 'p7c' => 'application/pkcs7-mime', - 'p7m' => 'application/pkcs7-mime', - 'p7r' => 'application/x-pkcs7-certreqresp', - 'p7s' => 'application/pkcs7-signature', - 'p8' => 'application/pkcs8', - 'pas' => 'text/x-pascal', - 'paw' => 'application/vnd.pawaafile', - 'pbd' => 'application/vnd.powerbuilder6', - 'pbm' => 'image/x-portable-bitmap', - 'pcf' => 'application/x-font-pcf', - 'pcl' => 'application/vnd.hp-pcl', - 'pclxl' => 'application/vnd.hp-pclxl', - 'pct' => 'image/x-pict', - 'pcurl' => 'application/vnd.curl.pcurl', - 'pcx' => 'image/x-pcx', - 'pdb' => 'application/vnd.palm', - 'pdf' => 'application/pdf', - 'pfa' => 'application/x-font-type1', - 'pfb' => 'application/x-font-type1', - 'pfm' => 'application/x-font-type1', - 'pfr' => 'application/font-tdpfr', - 'pfx' => 'application/x-pkcs12', - 'pgm' => 'image/x-portable-graymap', - 'pgn' => 'application/x-chess-pgn', - 'pgp' => 'application/pgp-encrypted', - 'php' => 'text/x-php', - 'phps' => 'application/x-httpd-phps', - 'pic' => 'image/x-pict', - 'pkg' => 'application/octet-stream', - 'pki' => 'application/pkixcmp', - 'pkipath' => 'application/pkix-pkipath', - 'plb' => 'application/vnd.3gpp.pic-bw-large', - 'plc' => 'application/vnd.mobius.plc', - 'plf' => 'application/vnd.pocketlearn', - 'pls' => 'application/pls+xml', - 'pml' => 'application/vnd.ctc-posml', - 'png' => 'image/png', - 'pnm' => 'image/x-portable-anymap', - 'portpkg' => 'application/vnd.macports.portpkg', - 'pot' => 'application/vnd.ms-powerpoint', - 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', - 'ppd' => 'application/vnd.cups-ppd', - 'ppm' => 'image/x-portable-pixmap', - 'pps' => 'application/vnd.ms-powerpoint', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'ppt' => 'application/vnd.ms-powerpoint', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'pqa' => 'application/vnd.palm', - 'prc' => 'application/x-mobipocket-ebook', - 'pre' => 'application/vnd.lotus-freelance', - 'prf' => 'application/pics-rules', - 'ps' => 'application/postscript', - 'psb' => 'application/vnd.3gpp.pic-bw-small', - 'psd' => 'image/vnd.adobe.photoshop', - 'psf' => 'application/x-font-linux-psf', - 'pskcxml' => 'application/pskc+xml', - 'ptid' => 'application/vnd.pvi.ptid1', - 'pub' => 'application/x-mspublisher', - 'pvb' => 'application/vnd.3gpp.pic-bw-var', - 'pwn' => 'application/vnd.3m.post-it-notes', - 'pya' => 'audio/vnd.ms-playready.media.pya', - 'pyv' => 'video/vnd.ms-playready.media.pyv', - 'qam' => 'application/vnd.epson.quickanime', - 'qbo' => 'application/vnd.intu.qbo', - 'qfx' => 'application/vnd.intu.qfx', - 'qps' => 'application/vnd.publishare-delta-tree', - 'qt' => 'video/quicktime', - 'qwd' => 'application/vnd.quark.quarkxpress', - 'qwt' => 'application/vnd.quark.quarkxpress', - 'qxb' => 'application/vnd.quark.quarkxpress', - 'qxd' => 'application/vnd.quark.quarkxpress', - 'qxl' => 'application/vnd.quark.quarkxpress', - 'qxt' => 'application/vnd.quark.quarkxpress', - 'ra' => 'audio/x-pn-realaudio', - 'ram' => 'audio/x-pn-realaudio', - 'rar' => 'application/x-rar-compressed', - 'ras' => 'image/x-cmu-raster', - 'rb' => 'text/plain', - 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', - 'rdf' => 'application/rdf+xml', - 'rdz' => 'application/vnd.data-vision.rdz', - 'rep' => 'application/vnd.businessobjects', - 'res' => 'application/x-dtbresource+xml', - 'resx' => 'text/xml', - 'rgb' => 'image/x-rgb', - 'rif' => 'application/reginfo+xml', - 'rip' => 'audio/vnd.rip', - 'rl' => 'application/resource-lists+xml', - 'rlc' => 'image/vnd.fujixerox.edmics-rlc', - 'rld' => 'application/resource-lists-diff+xml', - 'rm' => 'application/vnd.rn-realmedia', - 'rmi' => 'audio/midi', - 'rmp' => 'audio/x-pn-realaudio-plugin', - 'rms' => 'application/vnd.jcp.javame.midlet-rms', - 'rnc' => 'application/relax-ng-compact-syntax', - 'roff' => 'text/troff', - 'rp9' => 'application/vnd.cloanto.rp9', - 'rpss' => 'application/vnd.nokia.radio-presets', - 'rpst' => 'application/vnd.nokia.radio-preset', - 'rq' => 'application/sparql-query', - 'rs' => 'application/rls-services+xml', - 'rsd' => 'application/rsd+xml', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'rtx' => 'text/richtext', - 's' => 'text/x-asm', - 'saf' => 'application/vnd.yamaha.smaf-audio', - 'sbml' => 'application/sbml+xml', - 'sc' => 'application/vnd.ibm.secure-container', - 'scd' => 'application/x-msschedule', - 'scm' => 'application/vnd.lotus-screencam', - 'scq' => 'application/scvp-cv-request', - 'scs' => 'application/scvp-cv-response', - 'scurl' => 'text/vnd.curl.scurl', - 'sda' => 'application/vnd.stardivision.draw', - 'sdc' => 'application/vnd.stardivision.calc', - 'sdd' => 'application/vnd.stardivision.impress', - 'sdkd' => 'application/vnd.solent.sdkm+xml', - 'sdkm' => 'application/vnd.solent.sdkm+xml', - 'sdp' => 'application/sdp', - 'sdw' => 'application/vnd.stardivision.writer', - 'see' => 'application/vnd.seemail', - 'seed' => 'application/vnd.fdsn.seed', - 'sema' => 'application/vnd.sema', - 'semd' => 'application/vnd.semd', - 'semf' => 'application/vnd.semf', - 'ser' => 'application/java-serialized-object', - 'setpay' => 'application/set-payment-initiation', - 'setreg' => 'application/set-registration-initiation', - 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', - 'sfs' => 'application/vnd.spotfire.sfs', - 'sgl' => 'application/vnd.stardivision.writer-global', - 'sgm' => 'text/sgml', - 'sgml' => 'text/sgml', - 'sh' => 'application/x-sh', - 'shar' => 'application/x-shar', - 'shf' => 'application/shf+xml', - 'sig' => 'application/pgp-signature', - 'silo' => 'model/mesh', - 'sis' => 'application/vnd.symbian.install', - 'sisx' => 'application/vnd.symbian.install', - 'sit' => 'application/x-stuffit', - 'sitx' => 'application/x-stuffitx', - 'skd' => 'application/vnd.koan', - 'skm' => 'application/vnd.koan', - 'skp' => 'application/vnd.koan', - 'skt' => 'application/vnd.koan', - 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', - 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', - 'slt' => 'application/vnd.epson.salt', - 'sm' => 'application/vnd.stepmania.stepchart', - 'smf' => 'application/vnd.stardivision.math', - 'smi' => 'application/smil+xml', - 'smil' => 'application/smil+xml', - 'snd' => 'audio/basic', - 'snf' => 'application/x-font-snf', - 'so' => 'application/octet-stream', - 'spc' => 'application/x-pkcs7-certificates', - 'spf' => 'application/vnd.yamaha.smaf-phrase', - 'spl' => 'application/x-futuresplash', - 'spot' => 'text/vnd.in3d.spot', - 'spp' => 'application/scvp-vp-response', - 'spq' => 'application/scvp-vp-request', - 'spx' => 'audio/ogg', - 'src' => 'application/x-wais-source', - 'sru' => 'application/sru+xml', - 'srx' => 'application/sparql-results+xml', - 'sse' => 'application/vnd.kodak-descriptor', - 'ssf' => 'application/vnd.epson.ssf', - 'ssml' => 'application/ssml+xml', - 'st' => 'application/vnd.sailingtracker.track', - 'stc' => 'application/vnd.sun.xml.calc.template', - 'std' => 'application/vnd.sun.xml.draw.template', - 'stf' => 'application/vnd.wt.stf', - 'sti' => 'application/vnd.sun.xml.impress.template', - 'stk' => 'application/hyperstudio', - 'stl' => 'application/vnd.ms-pki.stl', - 'str' => 'application/vnd.pg.format', - 'stw' => 'application/vnd.sun.xml.writer.template', - 'sub' => 'image/vnd.dvb.subtitle', - 'sus' => 'application/vnd.sus-calendar', - 'susp' => 'application/vnd.sus-calendar', - 'sv4cpio' => 'application/x-sv4cpio', - 'sv4crc' => 'application/x-sv4crc', - 'svc' => 'application/vnd.dvb.service', - 'svd' => 'application/vnd.svd', - 'svg' => 'image/svg+xml', - 'svgz' => 'image/svg+xml', - 'swa' => 'application/x-director', - 'swf' => 'application/x-shockwave-flash', - 'swi' => 'application/vnd.aristanetworks.swi', - 'sxc' => 'application/vnd.sun.xml.calc', - 'sxd' => 'application/vnd.sun.xml.draw', - 'sxg' => 'application/vnd.sun.xml.writer.global', - 'sxi' => 'application/vnd.sun.xml.impress', - 'sxm' => 'application/vnd.sun.xml.math', - 'sxw' => 'application/vnd.sun.xml.writer', - 't' => 'text/troff', - 'tao' => 'application/vnd.tao.intent-module-archive', - 'tar' => 'application/x-tar', - 'tcap' => 'application/vnd.3gpp2.tcap', - 'tcl' => 'application/x-tcl', - 'teacher' => 'application/vnd.smart.teacher', - 'tei' => 'application/tei+xml', - 'teicorpus' => 'application/tei+xml', - 'tex' => 'application/x-tex', - 'texi' => 'application/x-texinfo', - 'texinfo' => 'application/x-texinfo', - 'text' => 'text/plain', - 'tfi' => 'application/thraud+xml', - 'tfm' => 'application/x-tex-tfm', - 'thmx' => 'application/vnd.ms-officetheme', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'tmo' => 'application/vnd.tmobile-livetv', - 'torrent' => 'application/x-bittorrent', - 'tpl' => 'application/vnd.groove-tool-template', - 'tpt' => 'application/vnd.trid.tpt', - 'tr' => 'text/troff', - 'tra' => 'application/vnd.trueapp', - 'trm' => 'application/x-msterminal', - 'tsd' => 'application/timestamped-data', - 'tsv' => 'text/tab-separated-values', - 'ttc' => 'application/x-font-ttf', - 'ttf' => 'application/x-font-ttf', - 'ttl' => 'text/turtle', - 'twd' => 'application/vnd.simtech-mindmapper', - 'twds' => 'application/vnd.simtech-mindmapper', - 'txd' => 'application/vnd.genomatix.tuxedo', - 'txf' => 'application/vnd.mobius.txf', - 'txt' => 'text/plain', - 'u32' => 'application/x-authorware-bin', - 'udeb' => 'application/x-debian-package', - 'ufd' => 'application/vnd.ufdl', - 'ufdl' => 'application/vnd.ufdl', - 'umj' => 'application/vnd.umajin', - 'unityweb' => 'application/vnd.unity', - 'uoml' => 'application/vnd.uoml+xml', - 'uri' => 'text/uri-list', - 'uris' => 'text/uri-list', - 'urls' => 'text/uri-list', - 'ustar' => 'application/x-ustar', - 'utz' => 'application/vnd.uiq.theme', - 'uu' => 'text/x-uuencode', - 'uva' => 'audio/vnd.dece.audio', - 'uvd' => 'application/vnd.dece.data', - 'uvf' => 'application/vnd.dece.data', - 'uvg' => 'image/vnd.dece.graphic', - 'uvh' => 'video/vnd.dece.hd', - 'uvi' => 'image/vnd.dece.graphic', - 'uvm' => 'video/vnd.dece.mobile', - 'uvp' => 'video/vnd.dece.pd', - 'uvs' => 'video/vnd.dece.sd', - 'uvt' => 'application/vnd.dece.ttml+xml', - 'uvu' => 'video/vnd.uvvu.mp4', - 'uvv' => 'video/vnd.dece.video', - 'uvva' => 'audio/vnd.dece.audio', - 'uvvd' => 'application/vnd.dece.data', - 'uvvf' => 'application/vnd.dece.data', - 'uvvg' => 'image/vnd.dece.graphic', - 'uvvh' => 'video/vnd.dece.hd', - 'uvvi' => 'image/vnd.dece.graphic', - 'uvvm' => 'video/vnd.dece.mobile', - 'uvvp' => 'video/vnd.dece.pd', - 'uvvs' => 'video/vnd.dece.sd', - 'uvvt' => 'application/vnd.dece.ttml+xml', - 'uvvu' => 'video/vnd.uvvu.mp4', - 'uvvv' => 'video/vnd.dece.video', - 'uvvx' => 'application/vnd.dece.unspecified', - 'uvx' => 'application/vnd.dece.unspecified', - 'vcd' => 'application/x-cdlink', - 'vcf' => 'text/x-vcard', - 'vcg' => 'application/vnd.groove-vcard', - 'vcs' => 'text/x-vcalendar', - 'vcx' => 'application/vnd.vcx', - 'vis' => 'application/vnd.visionary', - 'viv' => 'video/vnd.vivo', - 'vor' => 'application/vnd.stardivision.writer', - 'vox' => 'application/x-authorware-bin', - 'vrml' => 'model/vrml', - 'vsd' => 'application/vnd.visio', - 'vsf' => 'application/vnd.vsf', - 'vss' => 'application/vnd.visio', - 'vst' => 'application/vnd.visio', - 'vsw' => 'application/vnd.visio', - 'vtu' => 'model/vnd.vtu', - 'vxml' => 'application/voicexml+xml', - 'w3d' => 'application/x-director', - 'wad' => 'application/x-doom', - 'wav' => 'audio/x-wav', - 'wax' => 'audio/x-ms-wax', - 'wbmp' => 'image/vnd.wap.wbmp', - 'wbs' => 'application/vnd.criticaltools.wbs+xml', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wcm' => 'application/vnd.ms-works', - 'wdb' => 'application/vnd.ms-works', - 'weba' => 'audio/webm', - 'webm' => 'video/webm', - 'webp' => 'image/webp', - 'wg' => 'application/vnd.pmi.widget', - 'wgt' => 'application/widget', - 'wks' => 'application/vnd.ms-works', - 'wm' => 'video/x-ms-wm', - 'wma' => 'audio/x-ms-wma', - 'wmd' => 'application/x-ms-wmd', - 'wmf' => 'application/x-msmetafile', - 'wml' => 'text/vnd.wap.wml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'wmls' => 'text/vnd.wap.wmlscript', - 'wmlsc' => 'application/vnd.wap.wmlscriptc', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wmz' => 'application/x-ms-wmz', - 'woff' => 'application/x-font-woff', - 'wpd' => 'application/vnd.wordperfect', - 'wpl' => 'application/vnd.ms-wpl', - 'wps' => 'application/vnd.ms-works', - 'wqd' => 'application/vnd.wqd', - 'wri' => 'application/x-mswrite', - 'wrl' => 'model/vrml', - 'wsdl' => 'application/wsdl+xml', - 'wspolicy' => 'application/wspolicy+xml', - 'wtb' => 'application/vnd.webturbo', - 'wvx' => 'video/x-ms-wvx', - 'x32' => 'application/x-authorware-bin', - 'x3d' => 'application/vnd.hzn-3d-crossword', - 'xap' => 'application/x-silverlight-app', - 'xar' => 'application/vnd.xara', - 'xbap' => 'application/x-ms-xbap', - 'xbd' => 'application/vnd.fujixerox.docuworks.binder', - 'xbm' => 'image/x-xbitmap', - 'xdf' => 'application/xcap-diff+xml', - 'xdm' => 'application/vnd.syncml.dm+xml', - 'xdp' => 'application/vnd.adobe.xdp+xml', - 'xdssc' => 'application/dssc+xml', - 'xdw' => 'application/vnd.fujixerox.docuworks', - 'xenc' => 'application/xenc+xml', - 'xer' => 'application/patch-ops-error+xml', - 'xfdf' => 'application/vnd.adobe.xfdf', - 'xfdl' => 'application/vnd.xfdl', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'xhvml' => 'application/xv+xml', - 'xif' => 'image/vnd.xiff', - 'xla' => 'application/vnd.ms-excel', - 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', - 'xlc' => 'application/vnd.ms-excel', - 'xlm' => 'application/vnd.ms-excel', - 'xls' => 'application/vnd.ms-excel', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xlt' => 'application/vnd.ms-excel', - 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'xlw' => 'application/vnd.ms-excel', - 'xml' => 'application/xml', - 'xo' => 'application/vnd.olpc-sugar', - 'xop' => 'application/xop+xml', - 'xpi' => 'application/x-xpinstall', - 'xpm' => 'image/x-xpixmap', - 'xpr' => 'application/vnd.is-xpr', - 'xps' => 'application/vnd.ms-xpsdocument', - 'xpw' => 'application/vnd.intercon.formnet', - 'xpx' => 'application/vnd.intercon.formnet', - 'xsl' => 'application/xml', - 'xslt' => 'application/xslt+xml', - 'xsm' => 'application/vnd.syncml+xml', - 'xspf' => 'application/xspf+xml', - 'xul' => 'application/vnd.mozilla.xul+xml', - 'xvm' => 'application/xv+xml', - 'xvml' => 'application/xv+xml', - 'xwd' => 'image/x-xwindowdump', - 'xyz' => 'chemical/x-xyz', - 'yaml' => 'text/yaml', - 'yang' => 'application/yang', - 'yin' => 'application/yin+xml', - 'yml' => 'text/yaml', - 'zaz' => 'application/vnd.zzazz.deck+xml', - 'zip' => 'application/zip', - 'zir' => 'application/vnd.zul', - 'zirz' => 'application/vnd.zul', - 'zmm' => 'application/vnd.handheld-entertainment+xml' - ); - - /** - * Get a singleton instance of the class - * - * @return self - * @codeCoverageIgnore - */ - public static function getInstance() - { - if (!self::$instance) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Get a mimetype value from a file extension - * - * @param string $extension File extension - * - * @return string|null - * - */ - public function fromExtension($extension) - { - $extension = strtolower($extension); - - return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null; - } - - /** - * Get a mimetype from a filename - * - * @param string $filename Filename to generate a mimetype from - * - * @return string|null - */ - public function fromFilename($filename) - { - return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php deleted file mode 100644 index 4b4e49d052..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/CommaAggregator.php +++ /dev/null @@ -1,20 +0,0 @@ -isUrlEncoding()) { - return array($query->encodeValue($key) => implode(',', array_map(array($query, 'encodeValue'), $value))); - } else { - return array($key => implode(',', $value)); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php deleted file mode 100644 index 1bf1730e4e..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/DuplicateAggregator.php +++ /dev/null @@ -1,22 +0,0 @@ -isUrlEncoding()) { - return array($query->encodeValue($key) => array_map(array($query, 'encodeValue'), $value)); - } else { - return array($key => $value); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php deleted file mode 100644 index 133ea2bd96..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/PhpAggregator.php +++ /dev/null @@ -1,27 +0,0 @@ - $v) { - $k = "{$key}[{$k}]"; - if (is_array($v)) { - $ret = array_merge($ret, self::aggregate($k, $v, $query)); - } else { - $ret[$query->encodeValue($k)] = $query->encodeValue($v); - } - } - - return $ret; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php deleted file mode 100644 index 72bee620c8..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/QueryAggregator/QueryAggregatorInterface.php +++ /dev/null @@ -1,22 +0,0 @@ -add($key, $value); - $foundDuplicates = true; - } elseif ($paramIsPhpStyleArray) { - $q[$key] = array($value); - } else { - $q[$key] = $value; - } - } else { - $q->add($key, self::BLANK); - } - } - - // Use the duplicate aggregator if duplicates were found and not using PHP style arrays - if ($foundDuplicates && !$foundPhpStyle) { - $q->setAggregator(new DuplicateAggregator()); - } - - return $q; - } - - /** - * Convert the query string parameters to a query string string - * - * @return string - */ - public function __toString() - { - if (!$this->data) { - return ''; - } - - $queryString = ''; - - foreach ($this->prepareData($this->data) as $name => $value) { - foreach ((array) $value as $v) { - if ($queryString) { - $queryString .= $this->fieldSeparator; - } - $queryString .= $name; - if ($v !== self::BLANK) { - $queryString .= $this->valueSeparator . $v; - } - } - } - - return $queryString; - } - - /** - * Get the query string field separator - * - * @return string - */ - public function getFieldSeparator() - { - return $this->fieldSeparator; - } - - /** - * Get the query string value separator - * - * @return string - */ - public function getValueSeparator() - { - return $this->valueSeparator; - } - - /** - * Returns the type of URL encoding used by the query string - * - * One of: false, "RFC 3986", or "application/x-www-form-urlencoded" - * - * @return bool|string - */ - public function getUrlEncoding() - { - return $this->urlEncode; - } - - /** - * Returns true or false if using URL encoding - * - * @return bool - */ - public function isUrlEncoding() - { - return $this->urlEncode !== false; - } - - /** - * Provide a function for combining multi-valued query string parameters into a single or multiple fields - * - * @param null|QueryAggregatorInterface $aggregator Pass in a QueryAggregatorInterface object to handle converting - * deeply nested query string variables into a flattened array. - * Pass null to use the default PHP style aggregator. For legacy - * reasons, this function accepts a callable that must accepts a - * $key, $value, and query object. - * @return self - * @see \Guzzle\Http\QueryString::aggregateUsingComma() - */ - public function setAggregator(QueryAggregatorInterface $aggregator = null) - { - // Use the default aggregator if none was set - if (!$aggregator) { - if (!self::$defaultAggregator) { - self::$defaultAggregator = new PhpAggregator(); - } - $aggregator = self::$defaultAggregator; - } - - $this->aggregator = $aggregator; - - return $this; - } - - /** - * Set whether or not field names and values should be rawurlencoded - * - * @param bool|string $encode Set to TRUE to use RFC 3986 encoding (rawurlencode), false to disable encoding, or - * form_urlencoding to use application/x-www-form-urlencoded encoding (urlencode) - * @return self - */ - public function useUrlEncoding($encode) - { - $this->urlEncode = ($encode === true) ? self::RFC_3986 : $encode; - - return $this; - } - - /** - * Set the query string separator - * - * @param string $separator The query string separator that will separate fields - * - * @return self - */ - public function setFieldSeparator($separator) - { - $this->fieldSeparator = $separator; - - return $this; - } - - /** - * Set the query string value separator - * - * @param string $separator The query string separator that will separate values from fields - * - * @return self - */ - public function setValueSeparator($separator) - { - $this->valueSeparator = $separator; - - return $this; - } - - /** - * Returns an array of url encoded field names and values - * - * @return array - */ - public function urlEncode() - { - return $this->prepareData($this->data); - } - - /** - * URL encodes a value based on the url encoding type of the query string object - * - * @param string $value Value to encode - * - * @return string - */ - public function encodeValue($value) - { - if ($this->urlEncode == self::RFC_3986) { - return rawurlencode($value); - } elseif ($this->urlEncode == self::FORM_URLENCODED) { - return urlencode($value); - } else { - return (string) $value; - } - } - - /** - * Url encode parameter data and convert nested query strings into a flattened hash. - * - * @param array $data The data to encode - * - * @return array Returns an array of encoded values and keys - */ - protected function prepareData(array $data) - { - // If no aggregator is present then set the default - if (!$this->aggregator) { - $this->setAggregator(null); - } - - $temp = array(); - foreach ($data as $key => $value) { - if (is_array($value)) { - $temp = array_merge($temp, $this->aggregator->aggregate($key, $value, $this)); - } else { - $temp[$this->encodeValue($key)] = $this->encodeValue($value); - } - } - - return $temp; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php deleted file mode 100644 index 1173908c56..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/ReadLimitEntityBody.php +++ /dev/null @@ -1,105 +0,0 @@ -setLimit($limit)->setOffset($offset); - } - - /** - * Returns only a subset of the decorated entity body when cast as a string - * {@inheritdoc} - */ - public function __toString() - { - return substr((string) $this->body, $this->offset, $this->limit) ?: ''; - } - - public function isConsumed() - { - return (($this->offset + $this->limit) - $this->body->ftell()) <= 0; - } - - /** - * Returns the Content-Length of the limited subset of data - * {@inheritdoc} - */ - public function getContentLength() - { - $length = $this->body->getContentLength(); - - return $length === false - ? $this->limit - : min($this->limit, min($length, $this->offset + $this->limit) - $this->offset); - } - - /** - * Allow for a bounded seek on the read limited entity body - * {@inheritdoc} - */ - public function seek($offset, $whence = SEEK_SET) - { - return $whence === SEEK_SET - ? $this->body->seek(max($this->offset, min($this->offset + $this->limit, $offset))) - : false; - } - - /** - * Set the offset to start limiting from - * - * @param int $offset Offset to seek to and begin byte limiting from - * - * @return self - */ - public function setOffset($offset) - { - $this->body->seek($offset); - $this->offset = $offset; - - return $this; - } - - /** - * Set the limit of bytes that the decorator allows to be read from the stream - * - * @param int $limit Total number of bytes to allow to be read from the stream - * - * @return self - */ - public function setLimit($limit) - { - $this->limit = $limit; - - return $this; - } - - public function read($length) - { - // Check if the current position is less than the total allowed bytes + original offset - $remaining = ($this->offset + $this->limit) - $this->body->ftell(); - if ($remaining > 0) { - // Only return the amount of requested data, ensuring that the byte limit is not exceeded - return $this->body->read(min($remaining, $length)); - } else { - return false; - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php deleted file mode 100644 index 1a824b8b76..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/RedirectPlugin.php +++ /dev/null @@ -1,250 +0,0 @@ - array('onRequestSent', 100), - 'request.clone' => 'cleanupRequest', - 'request.before_send' => 'cleanupRequest' - ); - } - - /** - * Clean up the parameters of a request when it is cloned - * - * @param Event $event Event emitted - */ - public function cleanupRequest(Event $event) - { - $params = $event['request']->getParams(); - unset($params[self::REDIRECT_COUNT]); - unset($params[self::PARENT_REQUEST]); - } - - /** - * Called when a request receives a redirect response - * - * @param Event $event Event emitted - */ - public function onRequestSent(Event $event) - { - $response = $event['response']; - $request = $event['request']; - - // Only act on redirect requests with Location headers - if (!$response || $request->getParams()->get(self::DISABLE)) { - return; - } - - // Trace the original request based on parameter history - $original = $this->getOriginalRequest($request); - - // Terminating condition to set the effective response on the original request - if (!$response->isRedirect() || !$response->hasHeader('Location')) { - if ($request !== $original) { - // This is a terminating redirect response, so set it on the original request - $response->getParams()->set(self::REDIRECT_COUNT, $original->getParams()->get(self::REDIRECT_COUNT)); - $original->setResponse($response); - $response->setEffectiveUrl($request->getUrl()); - } - return; - } - - $this->sendRedirectRequest($original, $request, $response); - } - - /** - * Get the original request that initiated a series of redirects - * - * @param RequestInterface $request Request to get the original request from - * - * @return RequestInterface - */ - protected function getOriginalRequest(RequestInterface $request) - { - $original = $request; - // The number of redirects is held on the original request, so determine which request that is - while ($parent = $original->getParams()->get(self::PARENT_REQUEST)) { - $original = $parent; - } - - return $original; - } - - /** - * Create a redirect request for a specific request object - * - * Takes into account strict RFC compliant redirection (e.g. redirect POST with POST) vs doing what most clients do - * (e.g. redirect POST with GET). - * - * @param RequestInterface $request Request being redirected - * @param RequestInterface $original Original request - * @param int $statusCode Status code of the redirect - * @param string $location Location header of the redirect - * - * @return RequestInterface Returns a new redirect request - * @throws CouldNotRewindStreamException If the body needs to be rewound but cannot - */ - protected function createRedirectRequest( - RequestInterface $request, - $statusCode, - $location, - RequestInterface $original - ) { - $redirectRequest = null; - $strict = $original->getParams()->get(self::STRICT_REDIRECTS); - - // Switch method to GET for 303 redirects. 301 and 302 redirects also switch to GET unless we are forcing RFC - // compliance to emulate what most browsers do. NOTE: IE only switches methods on 301/302 when coming from a POST. - if ($request instanceof EntityEnclosingRequestInterface && ($statusCode == 303 || (!$strict && $statusCode <= 302))) { - $redirectRequest = RequestFactory::getInstance()->cloneRequestWithMethod($request, 'GET'); - } else { - $redirectRequest = clone $request; - } - - $redirectRequest->setIsRedirect(true); - // Always use the same response body when redirecting - $redirectRequest->setResponseBody($request->getResponseBody()); - - $location = Url::factory($location); - // If the location is not absolute, then combine it with the original URL - if (!$location->isAbsolute()) { - $originalUrl = $redirectRequest->getUrl(true); - // Remove query string parameters and just take what is present on the redirect Location header - $originalUrl->getQuery()->clear(); - $location = $originalUrl->combine((string) $location, true); - } - - $redirectRequest->setUrl($location); - - // Add the parent request to the request before it sends (make sure it's before the onRequestClone event too) - $redirectRequest->getEventDispatcher()->addListener( - 'request.before_send', - $func = function ($e) use (&$func, $request, $redirectRequest) { - $redirectRequest->getEventDispatcher()->removeListener('request.before_send', $func); - $e['request']->getParams()->set(RedirectPlugin::PARENT_REQUEST, $request); - } - ); - - // Rewind the entity body of the request if needed - if ($redirectRequest instanceof EntityEnclosingRequestInterface && $redirectRequest->getBody()) { - $body = $redirectRequest->getBody(); - // Only rewind the body if some of it has been read already, and throw an exception if the rewind fails - if ($body->ftell() && !$body->rewind()) { - throw new CouldNotRewindStreamException( - 'Unable to rewind the non-seekable entity body of the request after redirecting. cURL probably ' - . 'sent part of body before the redirect occurred. Try adding acustom rewind function using on the ' - . 'entity body of the request using setRewindFunction().' - ); - } - } - - return $redirectRequest; - } - - /** - * Prepare the request for redirection and enforce the maximum number of allowed redirects per client - * - * @param RequestInterface $original Original request - * @param RequestInterface $request Request to prepare and validate - * @param Response $response The current response - * - * @return RequestInterface - */ - protected function prepareRedirection(RequestInterface $original, RequestInterface $request, Response $response) - { - $params = $original->getParams(); - // This is a new redirect, so increment the redirect counter - $current = $params[self::REDIRECT_COUNT] + 1; - $params[self::REDIRECT_COUNT] = $current; - // Use a provided maximum value or default to a max redirect count of 5 - $max = isset($params[self::MAX_REDIRECTS]) ? $params[self::MAX_REDIRECTS] : $this->defaultMaxRedirects; - - // Throw an exception if the redirect count is exceeded - if ($current > $max) { - $this->throwTooManyRedirectsException($original, $max); - return false; - } else { - // Create a redirect request based on the redirect rules set on the request - return $this->createRedirectRequest( - $request, - $response->getStatusCode(), - trim($response->getLocation()), - $original - ); - } - } - - /** - * Send a redirect request and handle any errors - * - * @param RequestInterface $original The originating request - * @param RequestInterface $request The current request being redirected - * @param Response $response The response of the current request - * - * @throws BadResponseException|\Exception - */ - protected function sendRedirectRequest(RequestInterface $original, RequestInterface $request, Response $response) - { - // Validate and create a redirect request based on the original request and current response - if ($redirectRequest = $this->prepareRedirection($original, $request, $response)) { - try { - $redirectRequest->send(); - } catch (BadResponseException $e) { - $e->getResponse(); - if (!$e->getResponse()) { - throw $e; - } - } - } - } - - /** - * Throw a too many redirects exception for a request - * - * @param RequestInterface $original Request - * @param int $max Max allowed redirects - * - * @throws TooManyRedirectsException when too many redirects have been issued - */ - protected function throwTooManyRedirectsException(RequestInterface $original, $max) - { - $original->getEventDispatcher()->addListener( - 'request.complete', - $func = function ($e) use (&$func, $original, $max) { - $original->getEventDispatcher()->removeListener('request.complete', $func); - $str = "{$max} redirects were issued for this request:\n" . $e['request']->getRawHeaders(); - throw new TooManyRedirectsException($str); - } - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem deleted file mode 100644 index 93d3d2dbf4..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem +++ /dev/null @@ -1,3554 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 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.87 $ $Date: 2012/12/29 16:32:45 $ - -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 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 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----- - -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----- -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 ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -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----- - -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 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----- - -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 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----- -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 -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 Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -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 ------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----- - -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 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----- -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 ------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----- -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 -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----- -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 ------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----- -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 ------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----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem.md5 b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem.md5 deleted file mode 100644 index 7112ccf62c..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Resources/cacert.pem.md5 +++ /dev/null @@ -1 +0,0 @@ -349ba2d6964db9ca558c9e1daf38e428 diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/StaticClient.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/StaticClient.php deleted file mode 100644 index dbd4c18413..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/StaticClient.php +++ /dev/null @@ -1,157 +0,0 @@ -createRequest($method, $url, null, null, $options); - - if (isset($options['stream'])) { - if ($options['stream'] instanceof StreamRequestFactoryInterface) { - return $options['stream']->fromRequest($request); - } elseif ($options['stream'] == true) { - $streamFactory = new PhpStreamRequestFactory(); - return $streamFactory->fromRequest($request); - } - } - - return $request->send(); - } - - /** - * Send a GET request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return \Guzzle\Http\Message\Response - * @see Guzzle::request for a list of available options - */ - public static function get($url, $options = array()) - { - return self::request('GET', $url, $options); - } - - /** - * Send a HEAD request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return \Guzzle\Http\Message\Response - * @see Guzzle::request for a list of available options - */ - public static function head($url, $options = array()) - { - return self::request('HEAD', $url, $options); - } - - /** - * Send a DELETE request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return \Guzzle\Http\Message\Response - * @see Guzzle::request for a list of available options - */ - public static function delete($url, $options = array()) - { - return self::request('DELETE', $url, $options); - } - - /** - * Send a POST request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return \Guzzle\Http\Message\Response - * @see Guzzle::request for a list of available options - */ - public static function post($url, $options = array()) - { - return self::request('POST', $url, $options); - } - - /** - * Send a PUT request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return \Guzzle\Http\Message\Response - * @see Guzzle::request for a list of available options - */ - public static function put($url, $options = array()) - { - return self::request('PUT', $url, $options); - } - - /** - * Send a PATCH request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return \Guzzle\Http\Message\Response - * @see Guzzle::request for a list of available options - */ - public static function patch($url, $options = array()) - { - return self::request('PATCH', $url, $options); - } - - /** - * Send an OPTIONS request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return \Guzzle\Http\Message\Response - * @see Guzzle::request for a list of available options - */ - public static function options($url, $options = array()) - { - return self::request('OPTIONS', $url, $options); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Url.php b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Url.php deleted file mode 100644 index 91de5c4f3c..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/Url.php +++ /dev/null @@ -1,549 +0,0 @@ - null, 'host' => null, 'path' => null, 'port' => null, 'query' => null, - 'user' => null, 'pass' => null, 'fragment' => null); - - if (false === ($parts = parse_url($url))) { - throw new InvalidArgumentException('Was unable to parse malformed url: ' . $url); - } - - $parts += $defaults; - - // Convert the query string into a QueryString object - if ($parts['query'] || 0 !== strlen($parts['query'])) { - $parts['query'] = QueryString::fromString($parts['query']); - } - - return new static($parts['scheme'], $parts['host'], $parts['user'], - $parts['pass'], $parts['port'], $parts['path'], $parts['query'], - $parts['fragment']); - } - - /** - * Build a URL from parse_url parts. The generated URL will be a relative URL if a scheme or host are not provided. - * - * @param array $parts Array of parse_url parts - * - * @return string - */ - public static function buildUrl(array $parts) - { - $url = $scheme = ''; - - if (isset($parts['scheme'])) { - $scheme = $parts['scheme']; - $url .= $scheme . ':'; - } - - if (isset($parts['host'])) { - $url .= '//'; - if (isset($parts['user'])) { - $url .= $parts['user']; - if (isset($parts['pass'])) { - $url .= ':' . $parts['pass']; - } - $url .= '@'; - } - - $url .= $parts['host']; - - // Only include the port if it is not the default port of the scheme - if (isset($parts['port']) - && !(($scheme == 'http' && $parts['port'] == 80) || ($scheme == 'https' && $parts['port'] == 443)) - ) { - $url .= ':' . $parts['port']; - } - } - - // Add the path component if present - if (isset($parts['path']) && 0 !== strlen($parts['path'])) { - // Always ensure that the path begins with '/' if set and something is before the path - if ($url && $parts['path'][0] != '/' && substr($url, -1) != '/') { - $url .= '/'; - } - $url .= $parts['path']; - } - - // Add the query string if present - if (isset($parts['query'])) { - $url .= '?' . $parts['query']; - } - - // Ensure that # is only added to the url if fragment contains anything. - if (isset($parts['fragment'])) { - $url .= '#' . $parts['fragment']; - } - - return $url; - } - - /** - * Create a new URL from URL parts - * - * @param string $scheme Scheme of the URL - * @param string $host Host of the URL - * @param string $username Username of the URL - * @param string $password Password of the URL - * @param int $port Port of the URL - * @param string $path Path of the URL - * @param QueryString|array|string $query Query string of the URL - * @param string $fragment Fragment of the URL - */ - public function __construct($scheme, $host, $username = null, $password = null, $port = null, $path = null, QueryString $query = null, $fragment = null) - { - $this->scheme = $scheme; - $this->host = $host; - $this->port = $port; - $this->username = $username; - $this->password = $password; - $this->fragment = $fragment; - if (!$query) { - $this->query = new QueryString(); - } else { - $this->setQuery($query); - } - $this->setPath($path); - } - - /** - * Clone the URL - */ - public function __clone() - { - $this->query = clone $this->query; - } - - /** - * Returns the URL as a URL string - * - * @return string - */ - public function __toString() - { - return self::buildUrl($this->getParts()); - } - - /** - * Get the parts of the URL as an array - * - * @return array - */ - public function getParts() - { - $query = (string) $this->query; - - return array( - 'scheme' => $this->scheme, - 'user' => $this->username, - 'pass' => $this->password, - 'host' => $this->host, - 'port' => $this->port, - 'path' => $this->getPath(), - 'query' => $query !== '' ? $query : null, - 'fragment' => $this->fragment, - ); - } - - /** - * Set the host of the request. - * - * @param string $host Host to set (e.g. www.yahoo.com, yahoo.com) - * - * @return Url - */ - public function setHost($host) - { - if (strpos($host, ':') === false) { - $this->host = $host; - } else { - list($host, $port) = explode(':', $host); - $this->host = $host; - $this->setPort($port); - } - - return $this; - } - - /** - * Get the host part of the URL - * - * @return string - */ - public function getHost() - { - return $this->host; - } - - /** - * Set the scheme part of the URL (http, https, ftp, etc) - * - * @param string $scheme Scheme to set - * - * @return Url - */ - public function setScheme($scheme) - { - $this->scheme = $scheme; - - return $this; - } - - /** - * Get the scheme part of the URL - * - * @return string - */ - public function getScheme() - { - return $this->scheme; - } - - /** - * Set the port part of the URL - * - * @param int $port Port to set - * - * @return Url - */ - public function setPort($port) - { - $this->port = $port; - - return $this; - } - - /** - * Get the port part of the URl. Will return the default port for a given scheme if no port has been set. - * - * @return int|null - */ - public function getPort() - { - if ($this->port) { - return $this->port; - } elseif ($this->scheme == 'http') { - return 80; - } elseif ($this->scheme == 'https') { - return 443; - } - - return null; - } - - /** - * Set the path part of the URL - * - * @param array|string $path Path string or array of path segments - * - * @return Url - */ - public function setPath($path) - { - static $pathReplace = array(' ' => '%20', '?' => '%3F'); - if (is_array($path)) { - $path = '/' . implode('/', $path); - } - - $this->path = strtr($path, $pathReplace); - - return $this; - } - - /** - * Normalize the URL so that double slashes and relative paths are removed - * - * @return Url - */ - public function normalizePath() - { - if (!$this->path || $this->path == '/' || $this->path == '*') { - return $this; - } - - $results = array(); - $segments = $this->getPathSegments(); - foreach ($segments as $segment) { - if ($segment == '..') { - array_pop($results); - } elseif ($segment != '.' && $segment != '') { - $results[] = $segment; - } - } - - // Combine the normalized parts and add the leading slash if needed - $this->path = ($this->path[0] == '/' ? '/' : '') . implode('/', $results); - - // Add the trailing slash if necessary - if ($this->path != '/' && end($segments) == '') { - $this->path .= '/'; - } - - return $this; - } - - /** - * Add a relative path to the currently set path - * - * @param string $relativePath Relative path to add - * - * @return Url - */ - public function addPath($relativePath) - { - if (!$relativePath || $relativePath == '/') { - return $this; - } - - // Add a leading slash if needed - if ($relativePath[0] != '/') { - $relativePath = '/' . $relativePath; - } - - return $this->setPath(str_replace('//', '/', $this->getPath() . $relativePath)); - } - - /** - * Get the path part of the URL - * - * @return string - */ - public function getPath() - { - return $this->path; - } - - /** - * Get the path segments of the URL as an array - * - * @return array - */ - public function getPathSegments() - { - return array_slice(explode('/', $this->getPath()), 1); - } - - /** - * Set the password part of the URL - * - * @param string $password Password to set - * - * @return Url - */ - public function setPassword($password) - { - $this->password = $password; - - return $this; - } - - /** - * Get the password part of the URL - * - * @return null|string - */ - public function getPassword() - { - return $this->password; - } - - /** - * Set the username part of the URL - * - * @param string $username Username to set - * - * @return Url - */ - public function setUsername($username) - { - $this->username = $username; - - return $this; - } - - /** - * Get the username part of the URl - * - * @return null|string - */ - public function getUsername() - { - return $this->username; - } - - /** - * Get the query part of the URL as a QueryString object - * - * @return QueryString - */ - public function getQuery() - { - return $this->query; - } - - /** - * Set the query part of the URL - * - * @param QueryString|string|array $query Query to set - * - * @return Url - */ - public function setQuery($query) - { - if (is_string($query)) { - $output = null; - parse_str($query, $output); - $this->query = new QueryString($output); - } elseif (is_array($query)) { - $this->query = new QueryString($query); - } elseif ($query instanceof QueryString) { - $this->query = $query; - } - - return $this; - } - - /** - * Get the fragment part of the URL - * - * @return null|string - */ - public function getFragment() - { - return $this->fragment; - } - - /** - * Set the fragment part of the URL - * - * @param string $fragment Fragment to set - * - * @return Url - */ - public function setFragment($fragment) - { - $this->fragment = $fragment; - - return $this; - } - - /** - * Check if this is an absolute URL - * - * @return bool - */ - public function isAbsolute() - { - return $this->scheme && $this->host; - } - - /** - * Combine the URL with another URL. Follows the rules specific in RFC 3986 section 5.4. - * - * @param string $url Relative URL to combine with - * @param bool $strictRfc3986 Set to true to use strict RFC 3986 compliance when merging paths. When first - * released, Guzzle used an incorrect algorithm for combining relative URL paths. In - * order to not break users, we introduced this flag to allow the merging of URLs based - * on strict RFC 3986 section 5.4.1. This means that "http://a.com/foo/baz" merged with - * "bar" would become "http://a.com/foo/bar". When this value is set to false, it would - * become "http://a.com/foo/baz/bar". - * @return Url - * @throws InvalidArgumentException - * @link http://tools.ietf.org/html/rfc3986#section-5.4 - */ - public function combine($url, $strictRfc3986 = false) - { - $url = self::factory($url); - - // Use the more absolute URL as the base URL - if (!$this->isAbsolute() && $url->isAbsolute()) { - $url = $url->combine($this); - } - - // Passing a URL with a scheme overrides everything - if ($buffer = $url->getScheme()) { - $this->scheme = $buffer; - $this->host = $url->getHost(); - $this->port = $url->getPort(); - $this->username = $url->getUsername(); - $this->password = $url->getPassword(); - $this->path = $url->getPath(); - $this->query = $url->getQuery(); - $this->fragment = $url->getFragment(); - return $this; - } - - // Setting a host overrides the entire rest of the URL - if ($buffer = $url->getHost()) { - $this->host = $buffer; - $this->port = $url->getPort(); - $this->username = $url->getUsername(); - $this->password = $url->getPassword(); - $this->path = $url->getPath(); - $this->query = $url->getQuery(); - $this->fragment = $url->getFragment(); - return $this; - } - - $path = $url->getPath(); - $query = $url->getQuery(); - - if (!$path) { - if (count($query)) { - $this->addQuery($query, $strictRfc3986); - } - } else { - if ($path[0] == '/') { - $this->path = $path; - } elseif ($strictRfc3986) { - $this->path .= '/../' . $path; - } else { - $this->path .= '/' . $path; - } - $this->normalizePath(); - $this->addQuery($query, $strictRfc3986); - } - - $this->fragment = $url->getFragment(); - - return $this; - } - - private function addQuery(QueryString $new, $strictRfc386) - { - if (!$strictRfc386) { - $new->merge($this->query); - } - - $this->query = $new; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/composer.json b/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/composer.json deleted file mode 100644 index 9384a5bf91..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/http/Guzzle/Http/composer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "guzzle/http", - "description": "HTTP libraries used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": ["http client", "http", "client", "Guzzle", "curl"], - "license": "MIT", - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "require": { - "php": ">=5.3.2", - "guzzle/common": "self.version", - "guzzle/parser": "self.version", - "guzzle/stream": "self.version" - }, - "suggest": { - "ext-curl": "*" - }, - "autoload": { - "psr-0": { "Guzzle\\Http": "" } - }, - "target-dir": "Guzzle/Http", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php deleted file mode 100644 index 8e825f9bde..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParser.php +++ /dev/null @@ -1,86 +0,0 @@ - 'Domain', - 'path' => 'Path', - 'max_age' => 'Max-Age', - 'expires' => 'Expires', - 'version' => 'Version', - 'secure' => 'Secure', - 'port' => 'Port', - 'discard' => 'Discard', - 'comment' => 'Comment', - 'comment_url' => 'Comment-Url', - 'http_only' => 'HttpOnly' - ); - - public function parseCookie($cookie, $host = null, $path = null, $decode = false) - { - // Explode the cookie string using a series of semicolons - $pieces = array_filter(array_map('trim', explode(';', $cookie))); - - // The name of the cookie (first kvp) must include an equal sign. - if (empty($pieces) || !strpos($pieces[0], '=')) { - return false; - } - - // Create the default return array - $data = array_merge(array_fill_keys(array_keys(self::$cookieParts), null), array( - 'cookies' => array(), - 'data' => array(), - 'path' => $path ?: '/', - 'http_only' => false, - 'discard' => false, - 'domain' => $host - )); - $foundNonCookies = 0; - - // Add the cookie pieces into the parsed data array - foreach ($pieces as $part) { - - $cookieParts = explode('=', $part, 2); - $key = trim($cookieParts[0]); - - if (count($cookieParts) == 1) { - // Can be a single value (e.g. secure, httpOnly) - $value = true; - } else { - // Be sure to strip wrapping quotes - $value = trim($cookieParts[1], " \n\r\t\0\x0B\""); - if ($decode) { - $value = urldecode($value); - } - } - - // Only check for non-cookies when cookies have been found - if (!empty($data['cookies'])) { - foreach (self::$cookieParts as $mapValue => $search) { - if (!strcasecmp($search, $key)) { - $data[$mapValue] = $mapValue == 'port' ? array_map('trim', explode(',', $value)) : $value; - $foundNonCookies++; - continue 2; - } - } - } - - // If cookies have not yet been retrieved, or this value was not found in the pieces array, treat it as a - // cookie. IF non-cookies have been parsed, then this isn't a cookie, it's cookie data. Cookies then data. - $data[$foundNonCookies ? 'data' : 'cookies'][$key] = $value; - } - - // Calculate the expires date - if (!$data['expires'] && $data['max_age']) { - $data['expires'] = time() + (int) $data['max_age']; - } - - return $data; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php deleted file mode 100644 index d21ffe21c1..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Cookie/CookieParserInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - $requestUrl, - 'scheme' => 'http' - ); - - // Check for the Host header - if (isset($parts['headers']['Host'])) { - $urlParts['host'] = $parts['headers']['Host']; - } elseif (isset($parts['headers']['host'])) { - $urlParts['host'] = $parts['headers']['host']; - } else { - $urlParts['host'] = null; - } - - if (false === strpos($urlParts['host'], ':')) { - $urlParts['port'] = ''; - } else { - $hostParts = explode(':', $urlParts['host']); - $urlParts['host'] = trim($hostParts[0]); - $urlParts['port'] = (int) trim($hostParts[1]); - if ($urlParts['port'] == 443) { - $urlParts['scheme'] = 'https'; - } - } - - // Check if a query is present - $path = $urlParts['path']; - $qpos = strpos($path, '?'); - if ($qpos) { - $urlParts['query'] = substr($path, $qpos + 1); - $urlParts['path'] = substr($path, 0, $qpos); - } else { - $urlParts['query'] = ''; - } - - return $urlParts; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php deleted file mode 100644 index 104740068e..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParser.php +++ /dev/null @@ -1,110 +0,0 @@ -parseMessage($message); - - // Parse the protocol and protocol version - if (isset($parts['start_line'][2])) { - $startParts = explode('/', $parts['start_line'][2]); - $protocol = strtoupper($startParts[0]); - $version = isset($startParts[1]) ? $startParts[1] : '1.1'; - } else { - $protocol = 'HTTP'; - $version = '1.1'; - } - - $parsed = array( - 'method' => strtoupper($parts['start_line'][0]), - 'protocol' => $protocol, - 'version' => $version, - 'headers' => $parts['headers'], - 'body' => $parts['body'] - ); - - $parsed['request_url'] = $this->getUrlPartsFromMessage($parts['start_line'][1], $parsed); - - return $parsed; - } - - public function parseResponse($message) - { - if (!$message) { - return false; - } - - $parts = $this->parseMessage($message); - list($protocol, $version) = explode('/', trim($parts['start_line'][0])); - - return array( - 'protocol' => $protocol, - 'version' => $version, - 'code' => $parts['start_line'][1], - 'reason_phrase' => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '', - 'headers' => $parts['headers'], - 'body' => $parts['body'] - ); - } - - /** - * Parse a message into parts - * - * @param string $message Message to parse - * - * @return array - */ - protected function parseMessage($message) - { - $startLine = null; - $headers = array(); - $body = ''; - - // Iterate over each line in the message, accounting for line endings - $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); - for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { - - $line = $lines[$i]; - - // If two line breaks were encountered, then this is the end of body - if (empty($line)) { - if ($i < $totalLines - 1) { - $body = implode('', array_slice($lines, $i + 2)); - } - break; - } - - // Parse message headers - if (!$startLine) { - $startLine = explode(' ', $line, 3); - } elseif (strpos($line, ':')) { - $parts = explode(':', $line, 2); - $key = trim($parts[0]); - $value = isset($parts[1]) ? trim($parts[1]) : ''; - if (!isset($headers[$key])) { - $headers[$key] = $value; - } elseif (!is_array($headers[$key])) { - $headers[$key] = array($headers[$key], $value); - } else { - $headers[$key][] = $value; - } - } - } - - return array( - 'start_line' => $startLine, - 'headers' => $headers, - 'body' => $body - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php deleted file mode 100644 index cc448088db..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Message/MessageParserInterface.php +++ /dev/null @@ -1,27 +0,0 @@ - $parts->requestMethod, - 'protocol' => 'HTTP', - 'version' => number_format($parts->httpVersion, 1), - 'headers' => $parts->headers, - 'body' => $parts->body - ); - - $parsed['request_url'] = $this->getUrlPartsFromMessage($parts->requestUrl, $parsed); - - return $parsed; - } - - public function parseResponse($message) - { - if (!$message) { - return false; - } - - $parts = http_parse_message($message); - - return array( - 'protocol' => 'HTTP', - 'version' => number_format($parts->httpVersion, 1), - 'code' => $parts->responseCode, - 'reason_phrase' => $parts->responseStatus, - 'headers' => $parts->headers, - 'body' => $parts->body - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php deleted file mode 100644 index f8386831c2..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/ParserRegistry.php +++ /dev/null @@ -1,75 +0,0 @@ - 'Guzzle\\Parser\\Message\\MessageParser', - 'cookie' => 'Guzzle\\Parser\\Cookie\\CookieParser', - 'url' => 'Guzzle\\Parser\\Url\\UrlParser', - 'uri_template' => 'Guzzle\\Parser\\UriTemplate\\UriTemplate', - ); - - /** - * @return self - * @codeCoverageIgnore - */ - public static function getInstance() - { - if (!self::$instance) { - self::$instance = new static; - } - - return self::$instance; - } - - public function __construct() - { - // Use the PECL URI template parser if available - if (extension_loaded('uri_template')) { - $this->mapping['uri_template'] = 'Guzzle\\Parser\\UriTemplate\\PeclUriTemplate'; - } - } - - /** - * Get a parser by name from an instance - * - * @param string $name Name of the parser to retrieve - * - * @return mixed|null - */ - public function getParser($name) - { - if (!isset($this->instances[$name])) { - if (!isset($this->mapping[$name])) { - return null; - } - $class = $this->mapping[$name]; - $this->instances[$name] = new $class(); - } - - return $this->instances[$name]; - } - - /** - * Register a custom parser by name with the register - * - * @param string $name Name or handle of the parser to register - * @param mixed $parser Instantiated parser to register - */ - public function registerParser($name, $parser) - { - $this->instances[$name] = $parser; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php deleted file mode 100644 index b0764e8377..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/PeclUriTemplate.php +++ /dev/null @@ -1,26 +0,0 @@ - true, '#' => true, '.' => true, '/' => true, ';' => true, '?' => true, '&' => true - ); - - /** @var array Delimiters */ - private static $delims = array( - ':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' - ); - - /** @var array Percent encoded delimiters */ - private static $delimsPct = array( - '%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', - '%3B', '%3D' - ); - - public function expand($template, array $variables) - { - if ($this->regex == self::DEFAULT_PATTERN && false === strpos($template, '{')) { - return $template; - } - - $this->template = $template; - $this->variables = $variables; - - return preg_replace_callback($this->regex, array($this, 'expandMatch'), $this->template); - } - - /** - * Set the regex patten used to expand URI templates - * - * @param string $regexPattern - */ - public function setRegex($regexPattern) - { - $this->regex = $regexPattern; - } - - /** - * Parse an expression into parts - * - * @param string $expression Expression to parse - * - * @return array Returns an associative array of parts - */ - private function parseExpression($expression) - { - // Check for URI operators - $operator = ''; - - if (isset(self::$operatorHash[$expression[0]])) { - $operator = $expression[0]; - $expression = substr($expression, 1); - } - - $values = explode(',', $expression); - foreach ($values as &$value) { - $value = trim($value); - $varspec = array(); - $substrPos = strpos($value, ':'); - if ($substrPos) { - $varspec['value'] = substr($value, 0, $substrPos); - $varspec['modifier'] = ':'; - $varspec['position'] = (int) substr($value, $substrPos + 1); - } elseif (substr($value, -1) == '*') { - $varspec['modifier'] = '*'; - $varspec['value'] = substr($value, 0, -1); - } else { - $varspec['value'] = (string) $value; - $varspec['modifier'] = ''; - } - $value = $varspec; - } - - return array( - 'operator' => $operator, - 'values' => $values - ); - } - - /** - * Process an expansion - * - * @param array $matches Matches met in the preg_replace_callback - * - * @return string Returns the replacement string - */ - private function expandMatch(array $matches) - { - static $rfc1738to3986 = array( - '+' => '%20', - '%7e' => '~' - ); - - $parsed = self::parseExpression($matches[1]); - $replacements = array(); - - $prefix = $parsed['operator']; - $joiner = $parsed['operator']; - $useQueryString = false; - if ($parsed['operator'] == '?') { - $joiner = '&'; - $useQueryString = true; - } elseif ($parsed['operator'] == '&') { - $useQueryString = true; - } elseif ($parsed['operator'] == '#') { - $joiner = ','; - } elseif ($parsed['operator'] == ';') { - $useQueryString = true; - } elseif ($parsed['operator'] == '' || $parsed['operator'] == '+') { - $joiner = ','; - $prefix = ''; - } - - foreach ($parsed['values'] as $value) { - - if (!array_key_exists($value['value'], $this->variables) || $this->variables[$value['value']] === null) { - continue; - } - - $variable = $this->variables[$value['value']]; - $actuallyUseQueryString = $useQueryString; - $expanded = ''; - - if (is_array($variable)) { - - $isAssoc = $this->isAssoc($variable); - $kvp = array(); - foreach ($variable as $key => $var) { - - if ($isAssoc) { - $key = rawurlencode($key); - $isNestedArray = is_array($var); - } else { - $isNestedArray = false; - } - - if (!$isNestedArray) { - $var = rawurlencode($var); - if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { - $var = $this->decodeReserved($var); - } - } - - if ($value['modifier'] == '*') { - if ($isAssoc) { - if ($isNestedArray) { - // Nested arrays must allow for deeply nested structures - $var = strtr(http_build_query(array($key => $var)), $rfc1738to3986); - } else { - $var = $key . '=' . $var; - } - } elseif ($key > 0 && $actuallyUseQueryString) { - $var = $value['value'] . '=' . $var; - } - } - - $kvp[$key] = $var; - } - - if (empty($variable)) { - $actuallyUseQueryString = false; - } elseif ($value['modifier'] == '*') { - $expanded = implode($joiner, $kvp); - if ($isAssoc) { - // Don't prepend the value name when using the explode modifier with an associative array - $actuallyUseQueryString = false; - } - } else { - if ($isAssoc) { - // When an associative array is encountered and the explode modifier is not set, then the - // result must be a comma separated list of keys followed by their respective values. - foreach ($kvp as $k => &$v) { - $v = $k . ',' . $v; - } - } - $expanded = implode(',', $kvp); - } - - } else { - if ($value['modifier'] == ':') { - $variable = substr($variable, 0, $value['position']); - } - $expanded = rawurlencode($variable); - if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { - $expanded = $this->decodeReserved($expanded); - } - } - - if ($actuallyUseQueryString) { - if (!$expanded && $joiner != '&') { - $expanded = $value['value']; - } else { - $expanded = $value['value'] . '=' . $expanded; - } - } - - $replacements[] = $expanded; - } - - $ret = implode($joiner, $replacements); - if ($ret && $prefix) { - return $prefix . $ret; - } - - return $ret; - } - - /** - * Determines if an array is associative - * - * @param array $array Array to check - * - * @return bool - */ - private function isAssoc(array $array) - { - return (bool) count(array_filter(array_keys($array), 'is_string')); - } - - /** - * Removes percent encoding on reserved characters (used with + and # modifiers) - * - * @param string $string String to fix - * - * @return string - */ - private function decodeReserved($string) - { - return str_replace(self::$delimsPct, self::$delims, $string); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php deleted file mode 100644 index c81d51548e..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/UriTemplate/UriTemplateInterface.php +++ /dev/null @@ -1,21 +0,0 @@ -utf8 = $utf8; - } - - public function parseUrl($url) - { - Version::warn(__CLASS__ . ' is deprecated. Just use parse_url()'); - - static $defaults = array('scheme' => null, 'host' => null, 'path' => null, 'port' => null, 'query' => null, - 'user' => null, 'pass' => null, 'fragment' => null); - - $parts = parse_url($url); - - // Need to handle query parsing specially for UTF-8 requirements - if ($this->utf8 && isset($parts['query'])) { - $queryPos = strpos($url, '?'); - if (isset($parts['fragment'])) { - $parts['query'] = substr($url, $queryPos + 1, strpos($url, '#') - $queryPos - 1); - } else { - $parts['query'] = substr($url, $queryPos + 1); - } - } - - return $parts + $defaults; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php b/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php deleted file mode 100644 index 89ac4b3077..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/parser/Guzzle/Parser/Url/UrlParserInterface.php +++ /dev/null @@ -1,19 +0,0 @@ -=5.3.2" - }, - "autoload": { - "psr-0": { "Guzzle\\Parser": "" } - }, - "target-dir": "Guzzle/Parser", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php b/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php deleted file mode 100644 index 9949e456f5..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/PhpStreamRequestFactory.php +++ /dev/null @@ -1,276 +0,0 @@ -contextOptions = stream_context_get_options($context); - $this->context = $context; - } elseif (is_array($context) || !$context) { - $this->contextOptions = $context; - $this->createContext($params); - } elseif ($context) { - throw new InvalidArgumentException('$context must be an array or resource'); - } - - // Dispatch the before send event - $request->dispatch('request.before_send', array( - 'request' => $request, - 'context' => $this->context, - 'context_options' => $this->contextOptions - )); - - $this->setUrl($request); - $this->addDefaultContextOptions($request); - $this->addSslOptions($request); - $this->addBodyOptions($request); - $this->addProxyOptions($request); - - // Create the file handle but silence errors - return $this->createStream($params) - ->setCustomData('request', $request) - ->setCustomData('response_headers', $this->getLastResponseHeaders()); - } - - /** - * Set an option on the context and the internal options array - * - * @param string $wrapper Stream wrapper name of http - * @param string $name Context name - * @param mixed $value Context value - * @param bool $overwrite Set to true to overwrite an existing value - */ - protected function setContextValue($wrapper, $name, $value, $overwrite = false) - { - if (!isset($this->contextOptions[$wrapper])) { - $this->contextOptions[$wrapper] = array($name => $value); - } elseif (!$overwrite && isset($this->contextOptions[$wrapper][$name])) { - return; - } - $this->contextOptions[$wrapper][$name] = $value; - stream_context_set_option($this->context, $wrapper, $name, $value); - } - - /** - * Create a stream context - * - * @param array $params Parameter array - */ - protected function createContext(array $params) - { - $options = $this->contextOptions; - $this->context = $this->createResource(function () use ($params, $options) { - return stream_context_create($options, $params); - }); - } - - /** - * Get the last response headers received by the HTTP request - * - * @return array - */ - public function getLastResponseHeaders() - { - return $this->lastResponseHeaders; - } - - /** - * Adds the default context options to the stream context options - * - * @param RequestInterface $request Request - */ - protected function addDefaultContextOptions(RequestInterface $request) - { - $this->setContextValue('http', 'method', $request->getMethod()); - $headers = $request->getHeaderLines(); - - // "Connection: close" is required to get streams to work in HTTP 1.1 - if (!$request->hasHeader('Connection')) { - $headers[] = 'Connection: close'; - } - - $this->setContextValue('http', 'header', $headers); - $this->setContextValue('http', 'protocol_version', $request->getProtocolVersion()); - $this->setContextValue('http', 'ignore_errors', true); - } - - /** - * Set the URL to use with the factory - * - * @param RequestInterface $request Request that owns the URL - */ - protected function setUrl(RequestInterface $request) - { - $this->url = $request->getUrl(true); - - // Check for basic Auth username - if ($request->getUsername()) { - $this->url->setUsername($request->getUsername()); - } - - // Check for basic Auth password - if ($request->getPassword()) { - $this->url->setPassword($request->getPassword()); - } - } - - /** - * Add SSL options to the stream context - * - * @param RequestInterface $request Request - */ - protected function addSslOptions(RequestInterface $request) - { - if ($request->getCurlOptions()->get(CURLOPT_SSL_VERIFYPEER)) { - $this->setContextValue('ssl', 'verify_peer', true, true); - if ($cafile = $request->getCurlOptions()->get(CURLOPT_CAINFO)) { - $this->setContextValue('ssl', 'cafile', $cafile, true); - } - } else { - $this->setContextValue('ssl', 'verify_peer', false, true); - } - } - - /** - * Add body (content) specific options to the context options - * - * @param RequestInterface $request - */ - protected function addBodyOptions(RequestInterface $request) - { - // Add the content for the request if needed - if (!($request instanceof EntityEnclosingRequestInterface)) { - return; - } - - if (count($request->getPostFields())) { - $this->setContextValue('http', 'content', (string) $request->getPostFields(), true); - } elseif ($request->getBody()) { - $this->setContextValue('http', 'content', (string) $request->getBody(), true); - } - - // Always ensure a content-length header is sent - if (isset($this->contextOptions['http']['content'])) { - $headers = isset($this->contextOptions['http']['header']) ? $this->contextOptions['http']['header'] : array(); - $headers[] = 'Content-Length: ' . strlen($this->contextOptions['http']['content']); - $this->setContextValue('http', 'header', $headers, true); - } - } - - /** - * Add proxy parameters to the context if needed - * - * @param RequestInterface $request Request - */ - protected function addProxyOptions(RequestInterface $request) - { - if ($proxy = $request->getCurlOptions()->get(CURLOPT_PROXY)) { - $this->setContextValue('http', 'proxy', $proxy); - } - } - - /** - * Create the stream for the request with the context options - * - * @param array $params Parameters of the stream - * - * @return StreamInterface - */ - protected function createStream(array $params) - { - $http_response_header = null; - $url = $this->url; - $context = $this->context; - $fp = $this->createResource(function () use ($context, $url, &$http_response_header) { - return fopen((string) $url, 'r', false, $context); - }); - - // Determine the class to instantiate - $className = isset($params['stream_class']) ? $params['stream_class'] : __NAMESPACE__ . '\\Stream'; - - /** @var $stream StreamInterface */ - $stream = new $className($fp); - - // Track the response headers of the request - if (isset($http_response_header)) { - $this->lastResponseHeaders = $http_response_header; - $this->processResponseHeaders($stream); - } - - return $stream; - } - - /** - * Process response headers - * - * @param StreamInterface $stream - */ - protected function processResponseHeaders(StreamInterface $stream) - { - // Set the size on the stream if it was returned in the response - foreach ($this->lastResponseHeaders as $header) { - if ((stripos($header, 'Content-Length:')) === 0) { - $stream->setSize(trim(substr($header, 15))); - } - } - } - - /** - * Create a resource and check to ensure it was created successfully - * - * @param callable $callback Closure to invoke that must return a valid resource - * - * @return resource - * @throws RuntimeException on error - */ - protected function createResource($callback) - { - // Turn off error reporting while we try to initiate the request - $level = error_reporting(0); - $resource = call_user_func($callback); - error_reporting($level); - - // If the resource could not be created, then grab the last error and throw an exception - if (false === $resource) { - $message = 'Error creating resource. '; - foreach (error_get_last() as $key => $value) { - $message .= "[{$key}] {$value} "; - } - throw new RuntimeException(trim($message)); - } - - return $resource; - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/Stream.php b/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/Stream.php deleted file mode 100644 index de7e9528a0..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/Stream.php +++ /dev/null @@ -1,289 +0,0 @@ - array( - 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, - 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, 'c+b' => true, - 'rt' => true, 'w+t' => true, 'r+t' => true, 'x+t' => true, 'c+t' => true, 'a+' => true - ), - 'write' => array( - 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, 'c+' => true, - 'wb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, 'c+b' => true, - 'w+t' => true, 'r+t' => true, 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true - ) - ); - - /** - * @param resource $stream Stream resource to wrap - * @param int $size Size of the stream in bytes. Only pass if the size cannot be obtained from the stream. - * - * @throws InvalidArgumentException if the stream is not a stream resource - */ - public function __construct($stream, $size = null) - { - $this->setStream($stream, $size); - } - - /** - * Closes the stream when the helper is destructed - */ - public function __destruct() - { - $this->close(); - } - - public function __toString() - { - if (!$this->isReadable() || (!$this->isSeekable() && $this->isConsumed())) { - return ''; - } - - $originalPos = $this->ftell(); - $body = stream_get_contents($this->stream, -1, 0); - $this->seek($originalPos); - - return $body; - } - - public function close() - { - if (is_resource($this->stream)) { - fclose($this->stream); - } - $this->cache[self::IS_READABLE] = false; - $this->cache[self::IS_WRITABLE] = false; - } - - /** - * Calculate a hash of a Stream - * - * @param StreamInterface $stream Stream to calculate the hash for - * @param string $algo Hash algorithm (e.g. md5, crc32, etc) - * @param bool $rawOutput Whether or not to use raw output - * - * @return bool|string Returns false on failure or a hash string on success - */ - public static function getHash(StreamInterface $stream, $algo, $rawOutput = false) - { - $pos = $stream->ftell(); - if (!$stream->seek(0)) { - return false; - } - - $ctx = hash_init($algo); - while ($data = $stream->read(8192)) { - hash_update($ctx, $data); - } - - $out = hash_final($ctx, (bool) $rawOutput); - $stream->seek($pos); - - return $out; - } - - public function getMetaData($key = null) - { - $meta = stream_get_meta_data($this->stream); - - return !$key ? $meta : (array_key_exists($key, $meta) ? $meta[$key] : null); - } - - public function getStream() - { - return $this->stream; - } - - public function setStream($stream, $size = null) - { - if (!is_resource($stream)) { - throw new InvalidArgumentException('Stream must be a resource'); - } - - $this->size = $size; - $this->stream = $stream; - $this->rebuildCache(); - - return $this; - } - - public function detachStream() - { - $this->stream = null; - - return $this; - } - - public function getWrapper() - { - return $this->cache[self::WRAPPER_TYPE]; - } - - public function getWrapperData() - { - return $this->getMetaData('wrapper_data') ?: array(); - } - - public function getStreamType() - { - return $this->cache[self::STREAM_TYPE]; - } - - public function getUri() - { - return $this->cache['uri']; - } - - public function getSize() - { - if ($this->size !== null) { - return $this->size; - } - - // If the stream is a file based stream and local, then use fstat - clearstatcache(true, $this->cache['uri']); - $stats = fstat($this->stream); - if (isset($stats['size'])) { - $this->size = $stats['size']; - return $this->size; - } elseif ($this->cache[self::IS_READABLE] && $this->cache[self::SEEKABLE]) { - // Only get the size based on the content if the the stream is readable and seekable - $pos = $this->ftell(); - $this->size = strlen((string) $this); - $this->seek($pos); - return $this->size; - } - - return false; - } - - public function isReadable() - { - return $this->cache[self::IS_READABLE]; - } - - public function isRepeatable() - { - return $this->cache[self::IS_READABLE] && $this->cache[self::SEEKABLE]; - } - - public function isWritable() - { - return $this->cache[self::IS_WRITABLE]; - } - - public function isConsumed() - { - return feof($this->stream); - } - - public function feof() - { - return $this->isConsumed(); - } - - public function isLocal() - { - return $this->cache[self::IS_LOCAL]; - } - - public function isSeekable() - { - return $this->cache[self::SEEKABLE]; - } - - public function setSize($size) - { - $this->size = $size; - - return $this; - } - - public function seek($offset, $whence = SEEK_SET) - { - return $this->cache[self::SEEKABLE] ? fseek($this->stream, $offset, $whence) === 0 : false; - } - - public function read($length) - { - return fread($this->stream, $length); - } - - public function write($string) - { - // We can't know the size after writing anything - $this->size = null; - - return fwrite($this->stream, $string); - } - - public function ftell() - { - return ftell($this->stream); - } - - public function rewind() - { - return $this->seek(0); - } - - public function readLine($maxLength = null) - { - if (!$this->cache[self::IS_READABLE]) { - return false; - } else { - return $maxLength ? fgets($this->getStream(), $maxLength) : fgets($this->getStream()); - } - } - - public function setCustomData($key, $value) - { - $this->customData[$key] = $value; - - return $this; - } - - public function getCustomData($key) - { - return isset($this->customData[$key]) ? $this->customData[$key] : null; - } - - /** - * Reprocess stream metadata - */ - protected function rebuildCache() - { - $this->cache = stream_get_meta_data($this->stream); - $this->cache[self::IS_LOCAL] = stream_is_local($this->stream); - $this->cache[self::IS_READABLE] = isset(self::$readWriteHash['read'][$this->cache['mode']]); - $this->cache[self::IS_WRITABLE] = isset(self::$readWriteHash['write'][$this->cache['mode']]); - } -} diff --git a/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php b/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php deleted file mode 100644 index 6d7dc37613..0000000000 --- a/app/Vendor/Ratchet/vendor/guzzle/stream/Guzzle/Stream/StreamInterface.php +++ /dev/null @@ -1,218 +0,0 @@ -=5.3.2", - "guzzle/common": "self.version" - }, - "suggest": { - "guzzle/http": "To convert Guzzle request objects to PHP streams" - }, - "autoload": { - "psr-0": { "Guzzle\\Stream": "" } - }, - "target-dir": "Guzzle/Stream", - "extra": { - "branch-alias": { - "dev-master": "3.7-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/.gitattributes b/app/Vendor/Ratchet/vendor/monolog/monolog/.gitattributes deleted file mode 100644 index 4afe792410..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -.gitattributes export-ignore -.gitignore export-ignore -.travis.yml export-ignore diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/.gitignore b/app/Vendor/Ratchet/vendor/monolog/monolog/.gitignore deleted file mode 100644 index 0a3fb552a2..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -vendor -composer.phar -phpunit.xml -composer.lock -.DS_Store diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/.travis.yml b/app/Vendor/Ratchet/vendor/monolog/monolog/.travis.yml deleted file mode 100644 index d0d1b27eb5..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: php - -php: - - 5.3.3 - - 5.3 - - 5.4 - - 5.5 - - hhvm - -before_script: - - if [ "`phpenv version-name`" != "hhvm" ]; then echo "extension = mongo.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi - - if [ "`phpenv version-name`" != "hhvm" ]; then echo "extension = amqp.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi - - composer install --prefer-source - -script: ./vendor/bin/phpunit diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/CHANGELOG.mdown b/app/Vendor/Ratchet/vendor/monolog/monolog/CHANGELOG.mdown deleted file mode 100644 index 5c71cbddbd..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/CHANGELOG.mdown +++ /dev/null @@ -1,127 +0,0 @@ -### 1.7.0 (2013-11-14) - - * Added ElasticSearchHandler to send logs to an Elastic Search server - * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB - * Added SyslogUdpHandler to send logs to a remote syslogd server - * Added LogglyHandler to send logs to a Loggly account - * Added $level to IntrospectionProcessor so it only adds backtraces when needed - * Added $version to LogstashFormatter to allow using the new v1 Logstash format - * Added $appName to NewRelicHandler - * Added configuration of Pushover notification retries/expiry - * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default - * Added chainability to most setters for all handlers - * Fixed RavenHandler batch processing so it takes the message from the record with highest priority - * Fixed HipChatHandler batch processing so it sends all messages at once - * Fixed issues with eAccelerator - * Fixed and improved many small things - -### 1.6.0 (2013-07-29) - - * Added HipChatHandler to send logs to a HipChat chat room - * Added ErrorLogHandler to send logs to PHP's error_log function - * Added NewRelicHandler to send logs to NewRelic's service - * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler - * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel - * Added stack traces output when normalizing exceptions (json output & co) - * Added Monolog\Logger::API constant (currently 1) - * Added support for ChromePHP's v4.0 extension - * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel - * Added support for sending messages to multiple users at once with the PushoverHandler - * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler) - * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now - * Fixed issue in RotatingFileHandler when an open_basedir restriction is active - * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0 - * Fixed SyslogHandler issue when many were used concurrently with different facilities - -### 1.5.0 (2013-04-23) - - * Added ProcessIdProcessor to inject the PID in log records - * Added UidProcessor to inject a unique identifier to all log records of one request/run - * Added support for previous exceptions in the LineFormatter exception serialization - * Added Monolog\Logger::getLevels() to get all available levels - * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle - -### 1.4.1 (2013-04-01) - - * Fixed exception formatting in the LineFormatter to be more minimalistic - * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0 - * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days - * Fixed WebProcessor array access so it checks for data presence - * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors - -### 1.4.0 (2013-02-13) - - * Added RedisHandler to log to Redis via the Predis library or the phpredis extension - * Added ZendMonitorHandler to log to the Zend Server monitor - * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor - * Added `$useSSL` option to the PushoverHandler which is enabled by default - * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously - * Fixed header injection capability in the NativeMailHandler - -### 1.3.1 (2013-01-11) - - * Fixed LogstashFormatter to be usable with stream handlers - * Fixed GelfMessageFormatter levels on Windows - -### 1.3.0 (2013-01-08) - - * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface` - * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance - * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash) - * Added PushoverHandler to send mobile notifications - * Added CouchDBHandler and DoctrineCouchDBHandler - * Added RavenHandler to send data to Sentry servers - * Added support for the new MongoClient class in MongoDBHandler - * Added microsecond precision to log records' timestamps - * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing - the oldest entries - * Fixed normalization of objects with cyclic references - -### 1.2.1 (2012-08-29) - - * Added new $logopts arg to SyslogHandler to provide custom openlog options - * Fixed fatal error in SyslogHandler - -### 1.2.0 (2012-08-18) - - * Added AmqpHandler (for use with AMQP servers) - * Added CubeHandler - * Added NativeMailerHandler::addHeader() to send custom headers in mails - * Added the possibility to specify more than one recipient in NativeMailerHandler - * Added the possibility to specify float timeouts in SocketHandler - * Added NOTICE and EMERGENCY levels to conform with RFC 5424 - * Fixed the log records to use the php default timezone instead of UTC - * Fixed BufferHandler not being flushed properly on PHP fatal errors - * Fixed normalization of exotic resource types - * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog - -### 1.1.0 (2012-04-23) - - * Added Monolog\Logger::isHandling() to check if a handler will - handle the given log level - * Added ChromePHPHandler - * Added MongoDBHandler - * Added GelfHandler (for use with Graylog2 servers) - * Added SocketHandler (for use with syslog-ng for example) - * Added NormalizerFormatter - * Added the possibility to change the activation strategy of the FingersCrossedHandler - * Added possibility to show microseconds in logs - * Added `server` and `referer` to WebProcessor output - -### 1.0.2 (2011-10-24) - - * Fixed bug in IE with large response headers and FirePHPHandler - -### 1.0.1 (2011-08-25) - - * Added MemoryPeakUsageProcessor and MemoryUsageProcessor - * Added Monolog\Logger::getName() to get a logger's channel name - -### 1.0.0 (2011-07-06) - - * Added IntrospectionProcessor to get info from where the logger was called - * Fixed WebProcessor in CLI - -### 1.0.0-RC1 (2011-07-01) - - * Initial release diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/LICENSE b/app/Vendor/Ratchet/vendor/monolog/monolog/LICENSE deleted file mode 100644 index 5df1c397f7..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) Jordi Boggiano - -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/app/Vendor/Ratchet/vendor/monolog/monolog/README.mdown b/app/Vendor/Ratchet/vendor/monolog/monolog/README.mdown deleted file mode 100644 index a519b9f852..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/README.mdown +++ /dev/null @@ -1,255 +0,0 @@ -Monolog - Logging for PHP 5.3+ [![Build Status](https://secure.travis-ci.org/Seldaek/monolog.png)](http://travis-ci.org/Seldaek/monolog) -============================== - -[![Total Downloads](https://poser.pugx.org/monolog/monolog/downloads.png)](https://packagist.org/packages/monolog/monolog) -[![Latest Stable Version](https://poser.pugx.org/monolog/monolog/v/stable.png)](https://packagist.org/packages/monolog/monolog) - - -Monolog sends your logs to files, sockets, inboxes, databases and various -web services. See the complete list of handlers below. Special handlers -allow you to build advanced logging strategies. - -This library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) -interface that you can type-hint against in your own libraries to keep -a maximum of interoperability. You can also use it in your applications to -make sure you can always use another compatible logger at a later time. - -Usage ------ - -```php -pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); - -// add records to the log -$log->addWarning('Foo'); -$log->addError('Bar'); -``` - -Core Concepts -------------- - -Every `Logger` instance has a channel (name) and a stack of handlers. Whenever -you add a record to the logger, it traverses the handler stack. Each handler -decides whether it handled fully the record, and if so, the propagation of the -record ends there. - -This allows for flexible logging setups, for example having a `StreamHandler` at -the bottom of the stack that will log anything to disk, and on top of that add -a `MailHandler` that will send emails only when an error message is logged. -Handlers also have a `$bubble` property which defines whether they block the -record or not if they handled it. In this example, setting the `MailHandler`'s -`$bubble` argument to false means that records handled by the `MailHandler` will -not propagate to the `StreamHandler` anymore. - -You can create many `Logger`s, each defining a channel (e.g.: db, request, -router, ..) and each of them combining various handlers, which can be shared -or not. The channel is reflected in the logs and allows you to easily see or -filter records. - -Each Handler also has a Formatter, a default one with settings that make sense -will be created if you don't set one. The formatters normalize and format -incoming records so that they can be used by the handlers to output useful -information. - -Custom severity levels are not available. Only the eight -[RFC 5424](http://tools.ietf.org/html/rfc5424) levels (debug, info, notice, -warning, error, critical, alert, emergency) are present for basic filtering -purposes, but for sorting and other use cases that would require -flexibility, you should add Processors to the Logger that can add extra -information (tags, user ip, ..) to the records before they are handled. - -Log Levels ----------- - -Monolog supports the logging levels described by [RFC 5424](http://tools.ietf.org/html/rfc5424). - -- **DEBUG** (100): Detailed debug information. - -- **INFO** (200): Interesting events. Examples: User logs in, SQL logs. - -- **NOTICE** (250): Normal but significant events. - -- **WARNING** (300): Exceptional occurrences that are not errors. Examples: - Use of deprecated APIs, poor use of an API, undesirable things that are not - necessarily wrong. - -- **ERROR** (400): Runtime errors that do not require immediate action but - should typically be logged and monitored. - -- **CRITICAL** (500): Critical conditions. Example: Application component - unavailable, unexpected exception. - -- **ALERT** (550): Action must be taken immediately. Example: Entire website - down, database unavailable, etc. This should trigger the SMS alerts and wake - you up. - -- **EMERGENCY** (600): Emergency: system is unusable. - -Docs -==== - -**See the `doc` directory for more detailed documentation. -The following is only a list of all parts that come with Monolog.** - -Handlers --------- - -### Log to files and syslog - -- _StreamHandler_: Logs records into any PHP stream, use this for log files. -- _RotatingFileHandler_: Logs records to a file and creates one logfile per day. - It will also delete files older than `$maxFiles`. You should use - [logrotate](http://linuxcommand.org/man_pages/logrotate8.html) for high profile - setups though, this is just meant as a quick and dirty solution. -- _SyslogHandler_: Logs records to the syslog. -- _ErrorLogHandler_: Logs records to PHP's - [`error_log()`](http://docs.php.net/manual/en/function.error-log.php) function. - -### Send alerts and emails - -- _NativeMailerHandler_: Sends emails using PHP's - [`mail()`](http://php.net/manual/en/function.mail.php) function. -- _SwiftMailerHandler_: Sends emails using a [`Swift_Mailer`](http://swiftmailer.org/) instance. -- _PushoverHandler_: Sends mobile notifications via the [Pushover](https://www.pushover.net/) API. -- _HipChatHandler_: Logs records to a [HipChat](http://hipchat.com) chat room using its API. - -### Log specific servers and networked logging - -- _SocketHandler_: Logs records to [sockets](http://php.net/fsockopen), use this - for UNIX and TCP sockets. See an [example](https://github.com/Seldaek/monolog/blob/master/doc/sockets.md). -- _AmqpHandler_: Logs records to an [amqp](http://www.amqp.org/) compatible - server. Requires the [php-amqp](http://pecl.php.net/package/amqp) extension (1.0+). -- _GelfHandler_: Logs records to a [Graylog2](http://www.graylog2.org) server. -- _CubeHandler_: Logs records to a [Cube](http://square.github.com/cube/) server. -- _RavenHandler_: Logs records to a [Sentry](http://getsentry.com/) server using - [raven](https://packagist.org/packages/raven/raven). -- _ZendMonitorHandler_: Logs records to the Zend Monitor present in Zend Server. -- _NewRelicHandler_: Logs records to a [NewRelic](http://newrelic.com/) application. -- _LogglyHandler_: Logs records to a [Loggly](http://www.loggly.com/) account. -- _SyslogUdpHandler_: Logs records to a remote [Syslogd](http://www.rsyslog.com/) server. - -### Logging in development - -- _FirePHPHandler_: Handler for [FirePHP](http://www.firephp.org/), providing - inline `console` messages within [FireBug](http://getfirebug.com/). -- _ChromePHPHandler_: Handler for [ChromePHP](http://www.chromephp.com/), providing - inline `console` messages within Chrome. - -### Log to databases - -- _RedisHandler_: Logs records to a [redis](http://redis.io) server. -- _MongoDBHandler_: Handler to write records in MongoDB via a - [Mongo](http://pecl.php.net/package/mongo) extension connection. -- _CouchDBHandler_: Logs records to a CouchDB server. -- _DoctrineCouchDBHandler_: Logs records to a CouchDB server via the Doctrine CouchDB ODM. -- _ElasticSearchHandler_: Logs records to an Elastic Search server. -- _DynamoDbHandler_: Logs records to a DynamoDB table with the [AWS SDK](https://github.com/aws/aws-sdk-php). - -### Wrappers / Special Handlers - -- _FingersCrossedHandler_: A very interesting wrapper. It takes a logger as - parameter and will accumulate log records of all levels until a record - exceeds the defined severity level. At which point it delivers all records, - including those of lower severity, to the handler it wraps. This means that - until an error actually happens you will not see anything in your logs, but - when it happens you will have the full information, including debug and info - records. This provides you with all the information you need, but only when - you need it. -- _NullHandler_: Any record it can handle will be thrown away. This can be used - to put on top of an existing handler stack to disable it temporarily. -- _BufferHandler_: This handler will buffer all the log records it receives - until `close()` is called at which point it will call `handleBatch()` on the - handler it wraps with all the log messages at once. This is very useful to - send an email with all records at once for example instead of having one mail - for every log record. -- _GroupHandler_: This handler groups other handlers. Every record received is - sent to all the handlers it is configured with. -- _TestHandler_: Used for testing, it records everything that is sent to it and - has accessors to read out the information. - -Formatters ----------- - -- _LineFormatter_: Formats a log record into a one-line string. -- _HtmlFormatter_: Used to format log records into a human readable html table, mainly suitable for emails. -- _NormalizerFormatter_: Normalizes objects/resources down to strings so a record can easily be serialized/encoded. -- _ScalarFormatter_: Used to format log records into an associative array of scalar values. -- _JsonFormatter_: Encodes a log record into json. -- _WildfireFormatter_: Used to format log records into the Wildfire/FirePHP protocol, only useful for the FirePHPHandler. -- _ChromePHPFormatter_: Used to format log records into the ChromePHP format, only useful for the ChromePHPHandler. -- _GelfFormatter_: Used to format log records into Gelf message instances, only useful for the GelfHandler. -- _LogstashFormatter_: Used to format log records into [logstash](http://logstash.net/) event json, useful for any handler listed under inputs [here](http://logstash.net/docs/1.1.5/). -- _ElasticaFormatter_: Used to format log records into an Elastica\Document object, only useful for the ElasticSearchHandler. - -Processors ----------- - -- _IntrospectionProcessor_: Adds the line/file/class/method from which the log call originated. -- _WebProcessor_: Adds the current request URI, request method and client IP to a log record. -- _MemoryUsageProcessor_: Adds the current memory usage to a log record. -- _MemoryPeakUsageProcessor_: Adds the peak memory usage to a log record. -- _ProcessIdProcessor_: Adds the process id to a log record. -- _UidProcessor_: Adds a unique identifier to a log record. -- _GitProcessor_: Adds the current git branch and commit to a log record. - -Utilities ---------- - -- _ErrorHandler_: The `Monolog\ErrorHandler` class allows you to easily register - a Logger instance as an exception handler, error handler or fatal error handler. -- _ErrorLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain log - level is reached. -- _ChannelLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain - log level is reached, depending on which channel received the log record. - -About -===== - -Requirements ------------- - -- Any flavor of PHP 5.3 or above should do -- [optional] PHPUnit 3.5+ to execute the test suite (phpunit --version) - -Submitting bugs and feature requests ------------------------------------- - -Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues) - -Frameworks Integration ----------------------- - -- Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) - can be used very easily with Monolog since it implements the interface. -- [Symfony2](http://symfony.com) comes out of the box with Monolog. -- [Silex](http://silex.sensiolabs.org/) comes out of the box with Monolog. -- [Laravel 4](http://laravel.com/) comes out of the box with Monolog. -- [PPI](http://www.ppi.io/) comes out of the box with Monolog. -- [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin. -- [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer. -- [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog. -- [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog. - -Author ------- - -Jordi Boggiano - -
    -See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) which participated in this project. - -License -------- - -Monolog is licensed under the MIT License - see the `LICENSE` file for details - -Acknowledgements ----------------- - -This library is heavily inspired by Python's [Logbook](http://packages.python.org/Logbook/) -library, although most concepts have been adjusted to fit to the PHP world. diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/composer.json b/app/Vendor/Ratchet/vendor/monolog/monolog/composer.json deleted file mode 100644 index 9b15319435..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "monolog/monolog", - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "keywords": ["log", "logging", "psr-3"], - "homepage": "http://github.com/Seldaek/monolog", - "type": "library", - "license": "MIT", - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "~3.7.0", - "mlehner/gelf-php": "1.0.*", - "raven/raven": "~0.5", - "ruflin/elastica": "0.90.*", - "doctrine/couchdb": "dev-master", - "aws/aws-sdk-php": "~2.4.8" - }, - "suggest": { - "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server", - "raven/raven": "Allow sending log messages to a Sentry server", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB" - }, - "autoload": { - "psr-0": {"Monolog": "src/"} - }, - "extra": { - "branch-alias": { - "dev-master": "1.7.x-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/doc/extending.md b/app/Vendor/Ratchet/vendor/monolog/monolog/doc/extending.md deleted file mode 100644 index bb39ddcfe2..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/doc/extending.md +++ /dev/null @@ -1,76 +0,0 @@ -Extending Monolog -================= - -Monolog is fully extensible, allowing you to adapt your logger to your needs. - -Writing your own handler ------------------------- - -Monolog provides many built-in handlers. But if the one you need does not -exist, you can write it and use it in your logger. The only requirement is -to implement `Monolog\Handler\HandlerInterface`. - -Let's write a PDOHandler to log records to a database. We will extend the -abstract class provided by Monolog to keep things DRY. - -```php -pdo = $pdo; - parent::__construct($level, $bubble); - } - - protected function write(array $record) - { - if (!$this->initialized) { - $this->initialize(); - } - - $this->statement->execute(array( - 'channel' => $record['channel'], - 'level' => $record['level'], - 'message' => $record['formatted'], - 'time' => $record['datetime']->format('U'), - )); - } - - private function initialize() - { - $this->pdo->exec( - 'CREATE TABLE IF NOT EXISTS monolog ' - .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)' - ); - $this->statement = $this->pdo->prepare( - 'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)' - ); - - $this->initialized = true; - } -} -``` - -You can now use this handler in your logger: - -```php -pushHandler(new PDOHandler(new PDO('sqlite:logs.sqlite'))); - -// You can now use your logger -$logger->addInfo('My logger is now ready'); -``` - -The `Monolog\Handler\AbstractProcessingHandler` class provides most of the -logic needed for the handler, including the use of processors and the formatting -of the record (which is why we use ``$record['formatted']`` instead of ``$record['message']``). diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/doc/sockets.md b/app/Vendor/Ratchet/vendor/monolog/monolog/doc/sockets.md deleted file mode 100644 index fad30a9f4b..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/doc/sockets.md +++ /dev/null @@ -1,37 +0,0 @@ -Sockets Handler -=============== - -This handler allows you to write your logs to sockets using [fsockopen](http://php.net/fsockopen) -or [pfsockopen](http://php.net/pfsockopen). - -Persistent sockets are mainly useful in web environments where you gain some performance not closing/opening -the connections between requests. - -Basic Example -------------- - -```php -setPersistent(true); - -// Now add the handler -$logger->pushHandler($handler, Logger::DEBUG); - -// You can now use your logger -$logger->addInfo('My logger is now ready'); - -``` - -In this example, using syslog-ng, you should see the log on the log server: - - cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] [] - diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/doc/usage.md b/app/Vendor/Ratchet/vendor/monolog/monolog/doc/usage.md deleted file mode 100644 index 846bd51a3e..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/doc/usage.md +++ /dev/null @@ -1,162 +0,0 @@ -Using Monolog -============= - -Installation ------------- - -Monolog is available on Packagist ([monolog/monolog](http://packagist.org/packages/monolog/monolog)) -and as such installable via [Composer](http://getcomposer.org/). - -```bash -php composer.phar require monolog/monolog '~1.7' -``` - -If you do not use Composer, you can grab the code from GitHub, and use any -PSR-0 compatible autoloader (e.g. the [Symfony2 ClassLoader component](https://github.com/symfony/ClassLoader)) -to load Monolog classes. - -Configuring a logger --------------------- - -Here is a basic setup to log to a file and to firephp on the DEBUG level: - -```php -pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG)); -$logger->pushHandler(new FirePHPHandler()); - -// You can now use your logger -$logger->addInfo('My logger is now ready'); -``` - -Let's explain it. The first step is to create the logger instance which will -be used in your code. The argument is a channel name, which is useful when -you use several loggers (see below for more details about it). - -The logger itself does not know how to handle a record. It delegates it to -some handlers. The code above registers two handlers in the stack to allow -handling records in two different ways. - -Note that the FirePHPHandler is called first as it is added on top of the -stack. This allows you to temporarily add a logger with bubbling disabled if -you want to override other configured loggers. - -Adding extra data in the records --------------------------------- - -Monolog provides two different ways to add extra informations along the simple -textual message. - -### Using the logging context - -The first way is the context, allowing to pass an array of data along the -record: - -```php -addInfo('Adding a new user', array('username' => 'Seldaek')); -``` - -Simple handlers (like the StreamHandler for instance) will simply format -the array to a string but richer handlers can take advantage of the context -(FirePHP is able to display arrays in pretty way for instance). - -### Using processors - -The second way is to add extra data for all records by using a processor. -Processors can be any callable. They will get the record as parameter and -must return it after having eventually changed the `extra` part of it. Let's -write a processor adding some dummy data in the record: - -```php -pushProcessor(function ($record) { - $record['extra']['dummy'] = 'Hello world!'; - - return $record; -}); -``` - -Monolog provides some built-in processors that can be used in your project. -Look at the [README file](https://github.com/Seldaek/monolog/blob/master/README.mdown) for the list. - -> Tip: processors can also be registered on a specific handler instead of - the logger to apply only for this handler. - -Leveraging channels -------------------- - -Channels are a great way to identify to which part of the application a record -is related. This is useful in big applications (and is leveraged by -MonologBundle in Symfony2). - -Picture two loggers sharing a handler that writes to a single log file. -Channels would allow you to identify the logger that issued every record. -You can easily grep through the log files filtering this or that channel. - -```php -pushHandler($stream); -$logger->pushHandler($firephp); - -// Create a logger for the security-related stuff with a different channel -$securityLogger = new Logger('security'); -$securityLogger->pushHandler($stream); -$securityLogger->pushHandler($firephp); -``` - -Customizing log format ----------------------- - -In Monolog it's easy to customize the format of the logs written into files, -sockets, mails, databases and other handlers. Most of the handlers use the - -```php -$record['formatted'] -``` - -value to be automatically put into the log device. This value depends on the -formatter settings. You can choose between predefined formatter classes or -write your own (e.g. a multiline text file for human-readable output). - -To configure a predefined formatter class, just set it as the handler's field: - -```php -// the default date format is "Y-m-d H:i:s" -$dateFormat = "Y n j, g:i a"; -// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n" -$output = "%datetime% > %level_name% > %message% %context% %extra%\n"; -// finally, create a formatter -$formatter = new LineFormatter($output, $dateFormat); - -// Create a handler -$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG); -$stream->setFormatter($formatter); -// bind it to a logger object -$securityLogger = new Logger('security'); -$securityLogger->pushHandler($stream); -``` - -You may also reuse the same formatter between multiple handlers and share those -handlers between multiple loggers. diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/phpunit.xml.dist b/app/Vendor/Ratchet/vendor/monolog/monolog/phpunit.xml.dist deleted file mode 100644 index 175457071b..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/phpunit.xml.dist +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - tests/Monolog/ - - - - - - src/Monolog/ - - - diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/ErrorHandler.php deleted file mode 100644 index d870767e0f..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/ErrorHandler.php +++ /dev/null @@ -1,208 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Psr\Log\LoggerInterface; -use Psr\Log\LogLevel; - -/** - * Monolog error handler - * - * A facility to enable logging of runtime errors, exceptions and fatal errors. - * - * Quick setup: ErrorHandler::register($logger); - * - * @author Jordi Boggiano - */ -class ErrorHandler -{ - private $logger; - - private $previousExceptionHandler; - private $uncaughtExceptionLevel; - - private $previousErrorHandler; - private $errorLevelMap; - - private $fatalLevel; - private $reservedMemory; - private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR); - - public function __construct(LoggerInterface $logger) - { - $this->logger = $logger; - } - - /** - * Registers a new ErrorHandler for a given Logger - * - * By default it will handle errors, exceptions and fatal errors - * - * @param LoggerInterface $logger - * @param array|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling - * @param int|false $exceptionLevel a LogLevel::* constant, or false to disable exception handling - * @param int|false $fatalLevel a LogLevel::* constant, or false to disable fatal error handling - * @return ErrorHandler - */ - public static function register(LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null) - { - $handler = new static($logger); - if ($errorLevelMap !== false) { - $handler->registerErrorHandler($errorLevelMap); - } - if ($exceptionLevel !== false) { - $handler->registerExceptionHandler($exceptionLevel); - } - if ($fatalLevel !== false) { - $handler->registerFatalHandler($fatalLevel); - } - - return $handler; - } - - public function registerExceptionHandler($level = null, $callPrevious = true) - { - $prev = set_exception_handler(array($this, 'handleException')); - $this->uncaughtExceptionLevel = $level; - if ($callPrevious && $prev) { - $this->previousExceptionHandler = $prev; - } - } - - public function registerErrorHandler(array $levelMap = array(), $callPrevious = true, $errorTypes = -1) - { - $prev = set_error_handler(array($this, 'handleError'), $errorTypes); - $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap); - if ($callPrevious) { - $this->previousErrorHandler = $prev ?: true; - } - } - - public function registerFatalHandler($level = null, $reservedMemorySize = 20) - { - register_shutdown_function(array($this, 'handleFatalError')); - - $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize); - $this->fatalLevel = $level; - } - - protected function defaultErrorLevelMap() - { - return array( - E_ERROR => LogLevel::CRITICAL, - E_WARNING => LogLevel::WARNING, - E_PARSE => LogLevel::ALERT, - E_NOTICE => LogLevel::NOTICE, - E_CORE_ERROR => LogLevel::CRITICAL, - E_CORE_WARNING => LogLevel::WARNING, - E_COMPILE_ERROR => LogLevel::ALERT, - E_COMPILE_WARNING => LogLevel::WARNING, - E_USER_ERROR => LogLevel::ERROR, - E_USER_WARNING => LogLevel::WARNING, - E_USER_NOTICE => LogLevel::NOTICE, - E_STRICT => LogLevel::NOTICE, - E_RECOVERABLE_ERROR => LogLevel::ERROR, - E_DEPRECATED => LogLevel::NOTICE, - E_USER_DEPRECATED => LogLevel::NOTICE, - ); - } - - /** - * @private - */ - public function handleException(\Exception $e) - { - $this->logger->log( - $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel, - 'Uncaught exception', - array('exception' => $e) - ); - - if ($this->previousExceptionHandler) { - call_user_func($this->previousExceptionHandler, $e); - } - } - - /** - * @private - */ - public function handleError($code, $message, $file = '', $line = 0, $context = array()) - { - if (!(error_reporting() & $code)) { - return; - } - - $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL; - $this->logger->log($level, self::codeToString($code).': '.$message, array('file' => $file, 'line' => $line)); - - if ($this->previousErrorHandler === true) { - return false; - } elseif ($this->previousErrorHandler) { - return call_user_func($this->previousErrorHandler, $code, $message, $file, $line, $context); - } - } - - /** - * @private - */ - public function handleFatalError() - { - $this->reservedMemory = null; - - $lastError = error_get_last(); - if ($lastError && in_array($lastError['type'], self::$fatalErrors)) { - $this->logger->log( - $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel, - 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'], - array('file' => $lastError['file'], 'line' => $lastError['line']) - ); - } - } - - private static function codeToString($code) - { - switch ($code) { - case E_ERROR: - return 'E_ERROR'; - case E_WARNING: - return 'E_WARNING'; - case E_PARSE: - return 'E_PARSE'; - case E_NOTICE: - return 'E_NOTICE'; - case E_CORE_ERROR: - return 'E_CORE_ERROR'; - case E_CORE_WARNING: - return 'E_CORE_WARNING'; - case E_COMPILE_ERROR: - return 'E_COMPILE_ERROR'; - case E_COMPILE_WARNING: - return 'E_COMPILE_WARNING'; - case E_USER_ERROR: - return 'E_USER_ERROR'; - case E_USER_WARNING: - return 'E_USER_WARNING'; - case E_USER_NOTICE: - return 'E_USER_NOTICE'; - case E_STRICT: - return 'E_STRICT'; - case E_RECOVERABLE_ERROR: - return 'E_RECOVERABLE_ERROR'; - case E_DEPRECATED: - return 'E_DEPRECATED'; - case E_USER_DEPRECATED: - return 'E_USER_DEPRECATED'; - } - - return 'Unknown PHP error'; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php deleted file mode 100644 index 56d3e278a5..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -/** - * Formats a log message according to the ChromePHP array format - * - * @author Christophe Coevoet - */ -class ChromePHPFormatter implements FormatterInterface -{ - /** - * Translates Monolog log levels to Wildfire levels. - */ - private $logLevels = array( - Logger::DEBUG => 'log', - Logger::INFO => 'info', - Logger::NOTICE => 'info', - Logger::WARNING => 'warn', - Logger::ERROR => 'error', - Logger::CRITICAL => 'error', - Logger::ALERT => 'error', - Logger::EMERGENCY => 'error', - ); - - /** - * {@inheritdoc} - */ - public function format(array $record) - { - // Retrieve the line and file if set and remove them from the formatted extra - $backtrace = 'unknown'; - if (isset($record['extra']['file']) && isset($record['extra']['line'])) { - $backtrace = $record['extra']['file'].' : '.$record['extra']['line']; - unset($record['extra']['file']); - unset($record['extra']['line']); - } - - $message = array('message' => $record['message']); - if ($record['context']) { - $message['context'] = $record['context']; - } - if ($record['extra']) { - $message['extra'] = $record['extra']; - } - if (count($message) === 1) { - $message = reset($message); - } - - return array( - $record['channel'], - $message, - $backtrace, - $this->logLevels[$record['level']], - ); - } - - public function formatBatch(array $records) - { - $formatted = array(); - - foreach ($records as $record) { - $formatted[] = $this->format($record); - } - - return $formatted; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php deleted file mode 100644 index b0b0cf066f..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Elastica\Document; - -/** - * Format a log message into an Elastica Document - * - * @author Jelle Vink - */ -class ElasticaFormatter extends NormalizerFormatter -{ - /** - * @var string Elastic search index name - */ - protected $index; - - /** - * @var string Elastic search document type - */ - protected $type; - - /** - * @param string $index Elastic Search index name - * @param string $type Elastic Search document type - */ - public function __construct($index, $type) - { - parent::__construct(\DateTime::ISO8601); - $this->index = $index; - $this->type = $type; - } - - /** - * {@inheritdoc} - */ - public function format(array $record) - { - $record = parent::format($record); - - return $this->getDocument($record); - } - - /** - * Getter index - * @return string - */ - public function getIndex() - { - return $this->index; - } - - /** - * Getter type - * @return string - */ - public function getType() - { - return $this->type; - } - - /** - * Convert a log message into an Elastica Document - * - * @param array $record Log message - * @return Document - */ - protected function getDocument($record) - { - $document = new Document(); - $document->setData($record); - $document->setType($this->type); - $document->setIndex($this->index); - - return $document; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php deleted file mode 100644 index b5de751112..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * Interface for formatters - * - * @author Jordi Boggiano - */ -interface FormatterInterface -{ - /** - * Formats a log record. - * - * @param array $record A record to format - * @return mixed The formatted record - */ - public function format(array $record); - - /** - * Formats a set of log records. - * - * @param array $records A set of records to format - * @return mixed The formatted set of records - */ - public function formatBatch(array $records); -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php deleted file mode 100644 index 6ebfaa7f17..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Gelf\Message; - -/** - * Serializes a log message to GELF - * @see http://www.graylog2.org/about/gelf - * - * @author Matt Lehner - */ -class GelfMessageFormatter extends NormalizerFormatter -{ - /** - * @var string the name of the system for the Gelf log message - */ - protected $systemName; - - /** - * @var string a prefix for 'extra' fields from the Monolog record (optional) - */ - protected $extraPrefix; - - /** - * @var string a prefix for 'context' fields from the Monolog record (optional) - */ - protected $contextPrefix; - - /** - * Translates Monolog log levels to Graylog2 log priorities. - */ - private $logLevels = array( - Logger::DEBUG => 7, - Logger::INFO => 6, - Logger::NOTICE => 5, - Logger::WARNING => 4, - Logger::ERROR => 3, - Logger::CRITICAL => 2, - Logger::ALERT => 1, - Logger::EMERGENCY => 0, - ); - - public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_') - { - parent::__construct('U.u'); - - $this->systemName = $systemName ?: gethostname(); - - $this->extraPrefix = $extraPrefix; - $this->contextPrefix = $contextPrefix; - } - - /** - * {@inheritdoc} - */ - public function format(array $record) - { - $record = parent::format($record); - $message = new Message(); - $message - ->setTimestamp($record['datetime']) - ->setShortMessage((string) $record['message']) - ->setFacility($record['channel']) - ->setHost($this->systemName) - ->setLine(isset($record['extra']['line']) ? $record['extra']['line'] : null) - ->setFile(isset($record['extra']['file']) ? $record['extra']['file'] : null) - ->setLevel($this->logLevels[$record['level']]); - - // Do not duplicate these values in the additional fields - unset($record['extra']['line']); - unset($record['extra']['file']); - - foreach ($record['extra'] as $key => $val) { - $message->setAdditional($this->extraPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); - } - - foreach ($record['context'] as $key => $val) { - $message->setAdditional($this->contextPrefix . $key, is_scalar($val) ? $val : $this->toJson($val)); - } - - if (null === $message->getFile() && isset($record['context']['exception'])) { - if (preg_match("/^(.+):([0-9]+)$/", $record['context']['exception']['file'], $matches)) { - $message->setFile($matches[1]); - $message->setLine($matches[2]); - } - } - - return $message; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php deleted file mode 100644 index d853547ba1..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -/** - * Formats incoming records into an HTML table - * - * This is especially useful for html email logging - * - * @author Tiago Brito - */ -class HtmlFormatter extends NormalizerFormatter -{ - /** - * Translates Monolog log levels to html color priorities. - */ - private $logLevels = array( - Logger::DEBUG => '#cccccc', - Logger::INFO => '#468847', - Logger::NOTICE => '#3a87ad', - Logger::WARNING => '#c09853', - Logger::ERROR => '#f0ad4e', - Logger::CRITICAL => '#b94a48', - Logger::ALERT => '#d9534f', - Logger::EMERGENCY => '#ffffff', - ); - - /** - * @param string $dateFormat The format of the timestamp: one supported by DateTime::format - */ - public function __construct($dateFormat = null) - { - parent::__construct($dateFormat); - } - - /** - * Creates an HTML table row - * - * @param string $th Row header content - * @param string $td Row standard cell content - * @return string - */ - private function addRow($th, $td = ' ') - { - $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8'); - $td = '
    '.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'
    '; - - return "\n$th:\n".$td."\n"; - } - - /** - * Create a HTML h1 tag - * - * @param string $title Text to be in the h1 - * @param integer $level Error level - * @return string - */ - private function addTitle($title, $level) - { - $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8'); - - return '

    '.$title.'

    '; - } - /** - * Formats a log record. - * - * @param array $record A record to format - * @return mixed The formatted record - */ - public function format(array $record) - { - $output = $this->addTitle($record['level_name'], $record['level']); - $output .= ''; - - $output .= $this->addRow('Message', (string) $record['message']); - $output .= $this->addRow('Time', $record['datetime']->format('Y-m-d\TH:i:s.uO')); - $output .= $this->addRow('Channel', $record['channel']); - if ($record['context']) { - $output .= $this->addRow('Context', $this->convertToString($record['context'])); - } - if ($record['extra']) { - $output .= $this->addRow('Extra', $this->convertToString($record['extra'])); - } - - return $output.'
    '; - } - - /** - * Formats a set of log records. - * - * @param array $records A set of records to format - * @return mixed The formatted set of records - */ - public function formatBatch(array $records) - { - $message = ''; - foreach ($records as $record) { - $message .= $this->format($record); - } - - return $message; - } - - protected function convertToString($data) - { - if (null === $data || is_scalar($data)) { - return (string) $data; - } - - $data = $this->normalize($data); - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - return str_replace('\\/', '/', json_encode($data)); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php deleted file mode 100644 index 822af0ea43..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * Encodes whatever record data is passed to it as json - * - * This can be useful to log to databases or remote APIs - * - * @author Jordi Boggiano - */ -class JsonFormatter implements FormatterInterface -{ - /** - * {@inheritdoc} - */ - public function format(array $record) - { - return json_encode($record); - } - - /** - * {@inheritdoc} - */ - public function formatBatch(array $records) - { - return json_encode($records); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php deleted file mode 100644 index af3d14b149..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Exception; - -/** - * Formats incoming records into a one-line string - * - * This is especially useful for logging to files - * - * @author Jordi Boggiano - * @author Christophe Coevoet - */ -class LineFormatter extends NormalizerFormatter -{ - const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; - - protected $format; - - /** - * @param string $format The format of the message - * @param string $dateFormat The format of the timestamp: one supported by DateTime::format - */ - public function __construct($format = null, $dateFormat = null) - { - $this->format = $format ?: static::SIMPLE_FORMAT; - parent::__construct($dateFormat); - } - - /** - * {@inheritdoc} - */ - public function format(array $record) - { - $vars = parent::format($record); - - $output = $this->format; - foreach ($vars['extra'] as $var => $val) { - if (false !== strpos($output, '%extra.'.$var.'%')) { - $output = str_replace('%extra.'.$var.'%', $this->convertToString($val), $output); - unset($vars['extra'][$var]); - } - } - foreach ($vars as $var => $val) { - if (false !== strpos($output, '%'.$var.'%')) { - $output = str_replace('%'.$var.'%', $this->convertToString($val), $output); - } - } - - return $output; - } - - public function formatBatch(array $records) - { - $message = ''; - foreach ($records as $record) { - $message .= $this->format($record); - } - - return $message; - } - - protected function normalizeException(Exception $e) - { - $previousText = ''; - if ($previous = $e->getPrevious()) { - do { - $previousText .= ', '.get_class($previous).': '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine(); - } while ($previous = $previous->getPrevious()); - } - - return '[object] ('.get_class($e).': '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')'; - } - - protected function convertToString($data) - { - if (null === $data || is_bool($data)) { - return var_export($data, true); - } - - if (is_scalar($data)) { - return (string) $data; - } - - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return $this->toJson($data, true); - } - - return str_replace('\\/', '/', @json_encode($data)); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php deleted file mode 100644 index b084c4a529..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php +++ /dev/null @@ -1,146 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * Serializes a log message to Logstash Event Format - * - * @see http://logstash.net/ - * @see https://github.com/logstash/logstash/blob/master/lib/logstash/event.rb - * - * @author Tim Mower - */ -class LogstashFormatter extends NormalizerFormatter -{ - const V0 = 0; - const V1 = 1; - - /** - * @var string the name of the system for the Logstash log message, used to fill the @source field - */ - protected $systemName; - - /** - * @var string an application name for the Logstash log message, used to fill the @type field - */ - protected $applicationName; - - /** - * @var string a prefix for 'extra' fields from the Monolog record (optional) - */ - protected $extraPrefix; - - /** - * @var string a prefix for 'context' fields from the Monolog record (optional) - */ - protected $contextPrefix; - - /** - * @var integer logstash format version to use - */ - protected $version; - - /** - * @param string $applicationName the application that sends the data, used as the "type" field of logstash - * @param string $systemName the system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine - * @param string $extraPrefix prefix for extra keys inside logstash "fields" - * @param string $contextPrefix prefix for context keys inside logstash "fields", defaults to ctxt_ - */ - public function __construct($applicationName, $systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $version = self::V0) - { - // logstash requires a ISO 8601 format date with optional millisecond precision. - parent::__construct('Y-m-d\TH:i:s.uP'); - - $this->systemName = $systemName ?: gethostname(); - $this->applicationName = $applicationName; - $this->extraPrefix = $extraPrefix; - $this->contextPrefix = $contextPrefix; - $this->version = $version; - } - - /** - * {@inheritdoc} - */ - public function format(array $record) - { - $record = parent::format($record); - - if ($this->version === self::V1) { - $message = $this->formatV1($record); - } else { - $message = $this->formatV0($record); - } - - return $this->toJson($message) . "\n"; - } - - protected function formatV0(array $record) - { - $message = array( - '@timestamp' => $record['datetime'], - '@message' => $record['message'], - '@tags' => array($record['channel']), - '@source' => $this->systemName, - '@fields' => array( - 'channel' => $record['channel'], - 'level' => $record['level'] - ) - ); - - if ($this->applicationName) { - $message['@type'] = $this->applicationName; - } - - if (isset($record['extra']['server'])) { - $message['@source_host'] = $record['extra']['server']; - } - if (isset($record['extra']['url'])) { - $message['@source_path'] = $record['extra']['url']; - } - foreach ($record['extra'] as $key => $val) { - $message['@fields'][$this->extraPrefix . $key] = $val; - } - - foreach ($record['context'] as $key => $val) { - $message['@fields'][$this->contextPrefix . $key] = $val; - } - - return $message; - } - - protected function formatV1(array $record) - { - $message = array( - '@timestamp' => $record['datetime'], - '@version' => 1, - 'message' => $record['message'], - 'host' => $this->systemName, - 'type' => $record['channel'], - 'channel' => $record['channel'], - 'level' => $record['level_name'] - ); - - if ($this->applicationName) { - $message['type'] = $this->applicationName; - } - - foreach ($record['extra'] as $key => $val) { - $message[$this->extraPrefix . $key] = $val; - } - - foreach ($record['context'] as $key => $val) { - $message[$this->contextPrefix . $key] = $val; - } - - return $message; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php deleted file mode 100644 index 765fed4566..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Exception; - -/** - * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets - * - * @author Jordi Boggiano - */ -class NormalizerFormatter implements FormatterInterface -{ - const SIMPLE_DATE = "Y-m-d H:i:s"; - - protected $dateFormat; - - /** - * @param string $dateFormat The format of the timestamp: one supported by DateTime::format - */ - public function __construct($dateFormat = null) - { - $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE; - } - - /** - * {@inheritdoc} - */ - public function format(array $record) - { - return $this->normalize($record); - } - - /** - * {@inheritdoc} - */ - public function formatBatch(array $records) - { - foreach ($records as $key => $record) { - $records[$key] = $this->format($record); - } - - return $records; - } - - protected function normalize($data) - { - if (null === $data || is_scalar($data)) { - return $data; - } - - if (is_array($data) || $data instanceof \Traversable) { - $normalized = array(); - - $count = 1; - foreach ($data as $key => $value) { - if ($count++ >= 1000) { - $normalized['...'] = 'Over 1000 items, aborting normalization'; - break; - } - $normalized[$key] = $this->normalize($value); - } - - return $normalized; - } - - if ($data instanceof \DateTime) { - return $data->format($this->dateFormat); - } - - if (is_object($data)) { - if ($data instanceof Exception) { - return $this->normalizeException($data); - } - - return sprintf("[object] (%s: %s)", get_class($data), $this->toJson($data, true)); - } - - if (is_resource($data)) { - return '[resource]'; - } - - return '[unknown('.gettype($data).')]'; - } - - protected function normalizeException(Exception $e) - { - $data = array( - 'class' => get_class($e), - 'message' => $e->getMessage(), - 'file' => $e->getFile().':'.$e->getLine(), - ); - - $trace = $e->getTrace(); - array_shift($trace); - foreach ($trace as $frame) { - if (isset($frame['file'])) { - $data['trace'][] = $frame['file'].':'.$frame['line']; - } else { - $data['trace'][] = json_encode($frame); - } - } - - if ($previous = $e->getPrevious()) { - $data['previous'] = $this->normalizeException($previous); - } - - return $data; - } - - protected function toJson($data, $ignoreErrors = false) - { - // suppress json_encode errors since it's twitchy with some inputs - if ($ignoreErrors) { - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return @json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - return @json_encode($data); - } - - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - return json_encode($data); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php deleted file mode 100644 index 5d345d53c6..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * Formats data into an associative array of scalar values. - * Objects and arrays will be JSON encoded. - * - * @author Andrew Lawson - */ -class ScalarFormatter extends NormalizerFormatter -{ - /** - * {@inheritdoc} - */ - public function format(array $record) - { - foreach ($record as $key => $value) { - $record[$key] = $this->normalizeValue($value); - } - - return $record; - } - - /** - * @param mixed $value - * @return mixed - */ - protected function normalizeValue($value) - { - $normalized = $this->normalize($value); - - if (is_array($normalized) || is_object($normalized)) { - return $this->toJson($normalized, true); - } - - return $normalized; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php deleted file mode 100644 index b3e9b18644..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -/** - * Serializes a log message according to Wildfire's header requirements - * - * @author Eric Clemmons (@ericclemmons) - * @author Christophe Coevoet - * @author Kirill chEbba Chebunin - */ -class WildfireFormatter extends NormalizerFormatter -{ - /** - * Translates Monolog log levels to Wildfire levels. - */ - private $logLevels = array( - Logger::DEBUG => 'LOG', - Logger::INFO => 'INFO', - Logger::NOTICE => 'INFO', - Logger::WARNING => 'WARN', - Logger::ERROR => 'ERROR', - Logger::CRITICAL => 'ERROR', - Logger::ALERT => 'ERROR', - Logger::EMERGENCY => 'ERROR', - ); - - /** - * {@inheritdoc} - */ - public function format(array $record) - { - // Retrieve the line and file if set and remove them from the formatted extra - $file = $line = ''; - if (isset($record['extra']['file'])) { - $file = $record['extra']['file']; - unset($record['extra']['file']); - } - if (isset($record['extra']['line'])) { - $line = $record['extra']['line']; - unset($record['extra']['line']); - } - - $record = $this->normalize($record); - $message = array('message' => $record['message']); - $handleError = false; - if ($record['context']) { - $message['context'] = $record['context']; - $handleError = true; - } - if ($record['extra']) { - $message['extra'] = $record['extra']; - $handleError = true; - } - if (count($message) === 1) { - $message = reset($message); - } - - // Create JSON object describing the appearance of the message in the console - $json = $this->toJson(array( - array( - 'Type' => $this->logLevels[$record['level']], - 'File' => $file, - 'Line' => $line, - 'Label' => $record['channel'], - ), - $message, - ), $handleError); - - // The message itself is a serialization of the above JSON object + it's length - return sprintf( - '%s|%s|', - strlen($json), - $json - ); - } - - public function formatBatch(array $records) - { - throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); - } - - protected function normalize($data) - { - if (is_object($data) && !$data instanceof \DateTime) { - return $data; - } - - return parent::normalize($data); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php deleted file mode 100644 index 3bb21b7131..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php +++ /dev/null @@ -1,184 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Formatter\FormatterInterface; -use Monolog\Formatter\LineFormatter; - -/** - * Base Handler class providing the Handler structure - * - * @author Jordi Boggiano - */ -abstract class AbstractHandler implements HandlerInterface -{ - protected $level = Logger::DEBUG; - protected $bubble = true; - - /** - * @var FormatterInterface - */ - protected $formatter; - protected $processors = array(); - - /** - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct($level = Logger::DEBUG, $bubble = true) - { - $this->level = $level; - $this->bubble = $bubble; - } - - /** - * {@inheritdoc} - */ - public function isHandling(array $record) - { - return $record['level'] >= $this->level; - } - - /** - * {@inheritdoc} - */ - public function handleBatch(array $records) - { - foreach ($records as $record) { - $this->handle($record); - } - } - - /** - * Closes the handler. - * - * This will be called automatically when the object is destroyed - */ - public function close() - { - } - - /** - * {@inheritdoc} - */ - public function pushProcessor($callback) - { - if (!is_callable($callback)) { - throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); - } - array_unshift($this->processors, $callback); - - return $this; - } - - /** - * {@inheritdoc} - */ - public function popProcessor() - { - if (!$this->processors) { - throw new \LogicException('You tried to pop from an empty processor stack.'); - } - - return array_shift($this->processors); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(FormatterInterface $formatter) - { - $this->formatter = $formatter; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - if (!$this->formatter) { - $this->formatter = $this->getDefaultFormatter(); - } - - return $this->formatter; - } - - /** - * Sets minimum logging level at which this handler will be triggered. - * - * @param integer $level - * @return self - */ - public function setLevel($level) - { - $this->level = $level; - - return $this; - } - - /** - * Gets minimum logging level at which this handler will be triggered. - * - * @return integer - */ - public function getLevel() - { - return $this->level; - } - - /** - * Sets the bubbling behavior. - * - * @param Boolean $bubble true means that this handler allows bubbling. - * false means that bubbling is not permitted. - * @return self - */ - public function setBubble($bubble) - { - $this->bubble = $bubble; - - return $this; - } - - /** - * Gets the bubbling behavior. - * - * @return Boolean true means that this handler allows bubbling. - * false means that bubbling is not permitted. - */ - public function getBubble() - { - return $this->bubble; - } - - public function __destruct() - { - try { - $this->close(); - } catch (\Exception $e) { - // do nothing - } - } - - /** - * Gets the default formatter. - * - * @return FormatterInterface - */ - protected function getDefaultFormatter() - { - return new LineFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php deleted file mode 100644 index 6f18f72e13..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -/** - * Base Handler class providing the Handler structure - * - * Classes extending it should (in most cases) only implement write($record) - * - * @author Jordi Boggiano - * @author Christophe Coevoet - */ -abstract class AbstractProcessingHandler extends AbstractHandler -{ - /** - * {@inheritdoc} - */ - public function handle(array $record) - { - if (!$this->isHandling($record)) { - return false; - } - - $record = $this->processRecord($record); - - $record['formatted'] = $this->getFormatter()->format($record); - - $this->write($record); - - return false === $this->bubble; - } - - /** - * Writes the record down to the log of the implementing handler - * - * @param array $record - * @return void - */ - abstract protected function write(array $record); - - /** - * Processes a record. - * - * @param array $record - * @return array - */ - protected function processRecord(array $record) - { - if ($this->processors) { - foreach ($this->processors as $processor) { - $record = call_user_func($processor, $record); - } - } - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php deleted file mode 100644 index 3eb83bd4c2..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; - -/** - * Common syslog functionality - */ -abstract class AbstractSyslogHandler extends AbstractProcessingHandler -{ - protected $facility; - - /** - * Translates Monolog log levels to syslog log priorities. - */ - protected $logLevels = array( - Logger::DEBUG => LOG_DEBUG, - Logger::INFO => LOG_INFO, - Logger::NOTICE => LOG_NOTICE, - Logger::WARNING => LOG_WARNING, - Logger::ERROR => LOG_ERR, - Logger::CRITICAL => LOG_CRIT, - Logger::ALERT => LOG_ALERT, - Logger::EMERGENCY => LOG_EMERG, - ); - - /** - * List of valid log facility names. - */ - protected $facilities = array( - 'auth' => LOG_AUTH, - 'authpriv' => LOG_AUTHPRIV, - 'cron' => LOG_CRON, - 'daemon' => LOG_DAEMON, - 'kern' => LOG_KERN, - 'lpr' => LOG_LPR, - 'mail' => LOG_MAIL, - 'news' => LOG_NEWS, - 'syslog' => LOG_SYSLOG, - 'user' => LOG_USER, - 'uucp' => LOG_UUCP, - ); - - /** - * @param mixed $facility - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct($facility = LOG_USER, $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($level, $bubble); - - if (!defined('PHP_WINDOWS_VERSION_BUILD')) { - $this->facilities['local0'] = LOG_LOCAL0; - $this->facilities['local1'] = LOG_LOCAL1; - $this->facilities['local2'] = LOG_LOCAL2; - $this->facilities['local3'] = LOG_LOCAL3; - $this->facilities['local4'] = LOG_LOCAL4; - $this->facilities['local5'] = LOG_LOCAL5; - $this->facilities['local6'] = LOG_LOCAL6; - $this->facilities['local7'] = LOG_LOCAL7; - } - - // convert textual description of facility to syslog constant - if (array_key_exists(strtolower($facility), $this->facilities)) { - $facility = $this->facilities[strtolower($facility)]; - } elseif (!in_array($facility, array_values($this->facilities), true)) { - throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given'); - } - - $this->facility = $facility; - } - - /** - * {@inheritdoc} - */ - protected function getDefaultFormatter() - { - return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%'); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php deleted file mode 100644 index 00703436c5..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Formatter\JsonFormatter; - -class AmqpHandler extends AbstractProcessingHandler -{ - /** - * @var \AMQPExchange $exchange - */ - protected $exchange; - - /** - * @param \AMQPExchange $exchange AMQP exchange, ready for use - * @param string $exchangeName - * @param int $level - * @param bool $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct(\AMQPExchange $exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = true) - { - $this->exchange = $exchange; - $this->exchange->setName($exchangeName); - - parent::__construct($level, $bubble); - } - - /** - * {@inheritDoc} - */ - protected function write(array $record) - { - $data = $record["formatted"]; - - $routingKey = sprintf( - '%s.%s', - substr($record['level_name'], 0, 4), - $record['channel'] - ); - - $this->exchange->publish( - $data, - strtolower($routingKey), - 0, - array( - 'delivery_mode' => 2, - 'Content-type' => 'application/json' - ) - ); - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new JsonFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php deleted file mode 100644 index 6a80273398..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php +++ /dev/null @@ -1,98 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Buffers all records until closing the handler and then pass them as batch. - * - * This is useful for a MailHandler to send only one mail per request instead of - * sending one per log message. - * - * @author Christophe Coevoet - */ -class BufferHandler extends AbstractHandler -{ - protected $handler; - protected $bufferSize = 0; - protected $bufferLimit; - protected $flushOnOverflow; - protected $buffer = array(); - - /** - * @param HandlerInterface $handler Handler. - * @param integer $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded - */ - public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false) - { - parent::__construct($level, $bubble); - $this->handler = $handler; - $this->bufferLimit = (int) $bufferLimit; - $this->flushOnOverflow = $flushOnOverflow; - - // __destructor() doesn't get called on Fatal errors - register_shutdown_function(array($this, 'close')); - } - - /** - * {@inheritdoc} - */ - public function handle(array $record) - { - if ($record['level'] < $this->level) { - return false; - } - - if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { - if ($this->flushOnOverflow) { - $this->flush(); - } else { - array_shift($this->buffer); - $this->bufferSize--; - } - } - - if ($this->processors) { - foreach ($this->processors as $processor) { - $record = call_user_func($processor, $record); - } - } - - $this->buffer[] = $record; - $this->bufferSize++; - - return false === $this->bubble; - } - - public function flush() - { - if ($this->bufferSize === 0) { - return; - } - - $this->handler->handleBatch($this->buffer); - $this->bufferSize = 0; - $this->buffer = array(); - } - - /** - * {@inheritdoc} - */ - public function close() - { - $this->flush(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php deleted file mode 100644 index 705400b15c..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php +++ /dev/null @@ -1,183 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\ChromePHPFormatter; -use Monolog\Logger; - -/** - * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) - * - * @author Christophe Coevoet - */ -class ChromePHPHandler extends AbstractProcessingHandler -{ - /** - * Version of the extension - */ - const VERSION = '4.0'; - - /** - * Header name - */ - const HEADER_NAME = 'X-ChromeLogger-Data'; - - protected static $initialized = false; - - /** - * Tracks whether we sent too much data - * - * Chrome limits the headers to 256KB, so when we sent 240KB we stop sending - * - * @var Boolean - */ - protected static $overflowed = false; - - protected static $json = array( - 'version' => self::VERSION, - 'columns' => array('label', 'log', 'backtrace', 'type'), - 'rows' => array(), - ); - - protected static $sendHeaders = true; - - /** - * {@inheritdoc} - */ - public function handleBatch(array $records) - { - $messages = array(); - - foreach ($records as $record) { - if ($record['level'] < $this->level) { - continue; - } - $messages[] = $this->processRecord($record); - } - - if (!empty($messages)) { - $messages = $this->getFormatter()->formatBatch($messages); - self::$json['rows'] = array_merge(self::$json['rows'], $messages); - $this->send(); - } - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new ChromePHPFormatter(); - } - - /** - * Creates & sends header for a record - * - * @see sendHeader() - * @see send() - * @param array $record - */ - protected function write(array $record) - { - self::$json['rows'][] = $record['formatted']; - - $this->send(); - } - - /** - * Sends the log header - * - * @see sendHeader() - */ - protected function send() - { - if (self::$overflowed) { - return; - } - - if (!self::$initialized) { - self::$sendHeaders = $this->headersAccepted(); - self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; - - self::$initialized = true; - } - - $json = @json_encode(self::$json); - $data = base64_encode(utf8_encode($json)); - if (strlen($data) > 240*1024) { - self::$overflowed = true; - - $record = array( - 'message' => 'Incomplete logs, chrome header size limit reached', - 'context' => array(), - 'level' => Logger::WARNING, - 'level_name' => Logger::getLevelName(Logger::WARNING), - 'channel' => 'monolog', - 'datetime' => new \DateTime(), - 'extra' => array(), - ); - self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); - $json = @json_encode(self::$json); - $data = base64_encode(utf8_encode($json)); - } - - $this->sendHeader(self::HEADER_NAME, $data); - } - - /** - * Send header string to the client - * - * @param string $header - * @param string $content - */ - protected function sendHeader($header, $content) - { - if (!headers_sent() && self::$sendHeaders) { - header(sprintf('%s: %s', $header, $content)); - } - } - - /** - * Verifies if the headers are accepted by the current user agent - * - * @return Boolean - */ - protected function headersAccepted() - { - return !isset($_SERVER['HTTP_USER_AGENT']) - || preg_match('{\bChrome/\d+[\.\d+]*\b}', $_SERVER['HTTP_USER_AGENT']); - } - - /** - * BC getter for the sendHeaders property that has been made static - */ - public function __get($property) - { - if ('sendHeaders' !== $property) { - throw new \InvalidArgumentException('Undefined property '.$property); - } - - return static::$sendHeaders; - } - - /** - * BC setter for the sendHeaders property that has been made static - */ - public function __set($property, $value) - { - if ('sendHeaders' !== $property) { - throw new \InvalidArgumentException('Undefined property '.$property); - } - - static::$sendHeaders = $value; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php deleted file mode 100644 index 4877b345d6..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\JsonFormatter; -use Monolog\Logger; - -/** - * CouchDB handler - * - * @author Markus Bachmann - */ -class CouchDBHandler extends AbstractProcessingHandler -{ - private $options; - - public function __construct(array $options = array(), $level = Logger::DEBUG, $bubble = true) - { - $this->options = array_merge(array( - 'host' => 'localhost', - 'port' => 5984, - 'dbname' => 'logger', - 'username' => null, - 'password' => null, - ), $options); - - parent::__construct($level, $bubble); - } - - /** - * {@inheritDoc} - */ - protected function write(array $record) - { - $basicAuth = null; - if ($this->options['username']) { - $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); - } - - $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; - $context = stream_context_create(array( - 'http' => array( - 'method' => 'POST', - 'content' => $record['formatted'], - 'ignore_errors' => true, - 'max_redirects' => 0, - 'header' => 'Content-type: application/json', - ) - )); - - if (false === @file_get_contents($url, null, $context)) { - throw new \RuntimeException(sprintf('Could not connect to %s', $url)); - } - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new JsonFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php deleted file mode 100644 index d968720c88..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Logs to Cube. - * - * @link http://square.github.com/cube/ - * @author Wan Chen - */ -class CubeHandler extends AbstractProcessingHandler -{ - private $udpConnection = null; - private $httpConnection = null; - private $scheme = null; - private $host = null; - private $port = null; - private $acceptedSchemes = array('http', 'udp'); - - /** - * Create a Cube handler - * - * @throws UnexpectedValueException when given url is not a valid url. - * A valid url must consists of three parts : protocol://host:port - * Only valid protocol used by Cube are http and udp - */ - public function __construct($url, $level = Logger::DEBUG, $bubble = true) - { - $urlInfos = parse_url($url); - - if (!isset($urlInfos['scheme']) || !isset($urlInfos['host']) || !isset($urlInfos['port'])) { - throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); - } - - if (!in_array($urlInfos['scheme'], $this->acceptedSchemes)) { - throw new \UnexpectedValueException( - 'Invalid protocol (' . $urlInfos['scheme'] . ').' - . ' Valid options are ' . implode(', ', $this->acceptedSchemes)); - } - - $this->scheme = $urlInfos['scheme']; - $this->host = $urlInfos['host']; - $this->port = $urlInfos['port']; - - parent::__construct($level, $bubble); - } - - /** - * Establish a connection to an UDP socket - * - * @throws LogicException when unable to connect to the socket - */ - protected function connectUdp() - { - if (!extension_loaded('sockets')) { - throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); - } - - $this->udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); - if (!$this->udpConnection) { - throw new \LogicException('Unable to create a socket'); - } - - if (!socket_connect($this->udpConnection, $this->host, $this->port)) { - throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); - } - } - - /** - * Establish a connection to a http server - */ - protected function connectHttp() - { - if (!extension_loaded('curl')) { - throw new \LogicException('The curl extension is needed to use http URLs with the CubeHandler'); - } - - $this->httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); - - if (!$this->httpConnection) { - throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); - } - - curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); - curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - $date = $record['datetime']; - - $data = array('time' => $date->format('Y-m-d\TH:i:s.uO')); - unset($record['datetime']); - - if (isset($record['context']['type'])) { - $data['type'] = $record['context']['type']; - unset($record['context']['type']); - } else { - $data['type'] = $record['channel']; - } - - $data['data'] = $record['context']; - $data['data']['level'] = $record['level']; - - $this->{'write'.$this->scheme}(json_encode($data)); - } - - private function writeUdp($data) - { - if (!$this->udpConnection) { - $this->connectUdp(); - } - - socket_send($this->udpConnection, $data, strlen($data), 0); - } - - private function writeHttp($data) - { - if (!$this->httpConnection) { - $this->connectHttp(); - } - - curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); - curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, array( - 'Content-Type: application/json', - 'Content-Length: ' . strlen('['.$data.']')) - ); - - return curl_exec($this->httpConnection); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php deleted file mode 100644 index b91ffec905..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Formatter\NormalizerFormatter; -use Doctrine\CouchDB\CouchDBClient; - -/** - * CouchDB handler for Doctrine CouchDB ODM - * - * @author Markus Bachmann - */ -class DoctrineCouchDBHandler extends AbstractProcessingHandler -{ - private $client; - - public function __construct(CouchDBClient $client, $level = Logger::DEBUG, $bubble = true) - { - $this->client = $client; - parent::__construct($level, $bubble); - } - - /** - * {@inheritDoc} - */ - protected function write(array $record) - { - $this->client->postDocument($record['formatted']); - } - - protected function getDefaultFormatter() - { - return new NormalizerFormatter; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php deleted file mode 100644 index 5702c5fb70..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Aws\Common\Aws; -use Aws\DynamoDb\DynamoDbClient; -use Monolog\Formatter\ScalarFormatter; -use Monolog\Handler\AbstractProcessingHandler; -use Monolog\Logger; - -/** - * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) - * - * @link https://github.com/aws/aws-sdk-php/ - * @author Andrew Lawson - */ -class DynamoDbHandler extends AbstractProcessingHandler -{ - const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; - - /** - * @var DynamoDbClient - */ - protected $client; - - /** - * @var string - */ - protected $table; - - /** - * @param DynamoDbClient $client - * @param string $table - * @param integer $level - * @param boolean $bubble - */ - public function __construct(DynamoDbClient $client, $table, $level = Logger::DEBUG, $bubble = true) - { - if (!defined('Aws\Common\Aws::VERSION') || version_compare('3.0', Aws::VERSION, '<=')) { - throw new \RuntimeException('The DynamoDbHandler is only known to work with the AWS SDK 2.x releases'); - } - - $this->client = $client; - $this->table = $table; - - parent::__construct($level, $bubble); - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - $filtered = $this->filterEmptyFields($record['formatted']); - $formatted = $this->client->formatAttributes($filtered); - - $this->client->putItem(array( - 'TableName' => $this->table, - 'Item' => $formatted - )); - } - - /** - * @param array $record - * @return array - */ - protected function filterEmptyFields(array $record) - { - return array_filter($record, function ($value) { - return !empty($value) || false === $value || 0 === $value; - }); - } - - /** - * {@inheritdoc} - */ - protected function getDefaultFormatter() - { - return new ScalarFormatter(self::DATE_FORMAT); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php deleted file mode 100644 index 96e5d57f22..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\FormatterInterface; -use Monolog\Formatter\ElasticaFormatter; -use Monolog\Logger; -use Elastica\Client; -use Elastica\Exception\ExceptionInterface; - -/** - * Elastic Search handler - * - * Usage example: - * - * $client = new \Elastica\Client(); - * $options = array( - * 'index' => 'elastic_index_name', - * 'type' => 'elastic_doc_type', - * ); - * $handler = new ElasticSearchHandler($client, $options); - * $log = new Logger('application'); - * $log->pushHandler($handler); - * - * @author Jelle Vink - */ -class ElasticSearchHandler extends AbstractProcessingHandler -{ - /** - * @var Client - */ - protected $client; - - /** - * @var array Handler config options - */ - protected $options = array(); - - /** - * @param Client $client Elastica Client object - * @param array $options Handler configuration - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($level, $bubble); - $this->client = $client; - $this->options = array_merge( - array( - 'index' => 'monolog', // Elastic index name - 'type' => 'record', // Elastic document type - 'ignore_error' => false, // Suppress Elastica exceptions - ), - $options - ); - } - - /** - * {@inheritDoc} - */ - protected function write(array $record) - { - $this->bulkSend(array($record['formatted'])); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(FormatterInterface $formatter) - { - if ($formatter instanceof ElasticaFormatter) { - return parent::setFormatter($formatter); - } - throw new \InvalidArgumentException('ElasticSearchHandler is only compatible with ElasticaFormatter'); - } - - /** - * Getter options - * @return array - */ - public function getOptions() - { - return $this->options; - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new ElasticaFormatter($this->options['index'], $this->options['type']); - } - - /** - * {@inheritdoc} - */ - public function handleBatch(array $records) - { - $documents = $this->getFormatter()->formatBatch($records); - $this->bulkSend($documents); - } - - /** - * Use Elasticsearch bulk API to send list of documents - * @param array $documents - * @throws \RuntimeException - */ - protected function bulkSend(array $documents) - { - try { - $this->client->addDocuments($documents); - } catch (ExceptionInterface $e) { - if (!$this->options['ignore_error']) { - throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); - } - } - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php deleted file mode 100644 index 9e11c3b725..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Stores to PHP error_log() handler. - * - * @author Elan Ruusamäe - */ -class ErrorLogHandler extends AbstractProcessingHandler -{ - const OPERATING_SYSTEM = 0; - const SAPI = 4; - - protected $messageType; - - /** - * @param integer $messageType Says where the error should go. - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($level, $bubble); - - if (false === in_array($messageType, self::getAvailableTypes())) { - $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); - throw new \InvalidArgumentException($message); - } - - $this->messageType = $messageType; - } - - /** - * @return array With all available types - */ - public static function getAvailableTypes() - { - return array( - self::OPERATING_SYSTEM, - self::SAPI, - ); - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - error_log((string) $record['formatted'], $this->messageType); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php deleted file mode 100644 index c3e42efefa..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler\FingersCrossed; - -/** - * Interface for activation strategies for the FingersCrossedHandler. - * - * @author Johannes M. Schmitt - */ -interface ActivationStrategyInterface -{ - /** - * Returns whether the given record activates the handler. - * - * @param array $record - * @return Boolean - */ - public function isHandlerActivated(array $record); -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php deleted file mode 100644 index 646d57a8c8..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php +++ /dev/null @@ -1,57 +0,0 @@ - -* -* For the full copyright and license information, please view the LICENSE -* file that was distributed with this source code. -*/ - -namespace Monolog\Handler\FingersCrossed; - -/** - * Channel and Error level based monolog activation strategy. Allows to trigger activation - * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except - * for records of the 'sql' channel; those should trigger activation on level 'WARN'. - * - * Example: - * - * - * $activationStrategy = new ChannelLevelActivationStrategy( - * Logger::CRITICAL, - * array( - * 'request' => Logger::ALERT, - * 'sensitive' => Logger::ERROR, - * ) - * ); - * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); - * - * - * @author Mike Meessen - */ -class ChannelLevelActivationStrategy implements ActivationStrategyInterface -{ - private $defaultActionLevel; - private $channelToActionLevel; - - /** - * @param int $defaultActionLevel The default action level to be used if the record's category doesn't match any - * @param array $categoryToActionLevel An array that maps channel names to action levels. - */ - public function __construct($defaultActionLevel, $channelToActionLevel = array()) - { - $this->defaultActionLevel = $defaultActionLevel; - $this->channelToActionLevel = $channelToActionLevel; - } - - public function isHandlerActivated(array $record) - { - if (isset($this->channelToActionLevel[$record['channel']])) { - return $record['level'] >= $this->channelToActionLevel[$record['channel']]; - } - - return $record['level'] >= $this->defaultActionLevel; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php deleted file mode 100644 index 7cd8ef1b62..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler\FingersCrossed; - -/** - * Error level based activation strategy. - * - * @author Johannes M. Schmitt - */ -class ErrorLevelActivationStrategy implements ActivationStrategyInterface -{ - private $actionLevel; - - public function __construct($actionLevel) - { - $this->actionLevel = $actionLevel; - } - - public function isHandlerActivated(array $record) - { - return $record['level'] >= $this->actionLevel; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php deleted file mode 100644 index bc51e4e3be..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; -use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; -use Monolog\Logger; - -/** - * Buffers all records until a certain level is reached - * - * The advantage of this approach is that you don't get any clutter in your log files. - * Only requests which actually trigger an error (or whatever your actionLevel is) will be - * in the logs, but they will contain all records, not only those above the level threshold. - * - * You can find the various activation strategies in the - * Monolog\Handler\FingersCrossed\ namespace. - * - * @author Jordi Boggiano - */ -class FingersCrossedHandler extends AbstractHandler -{ - protected $handler; - protected $activationStrategy; - protected $buffering = true; - protected $bufferSize; - protected $buffer = array(); - protected $stopBuffering; - - /** - * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). - * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action - * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $stopBuffering Whether the handler should stop buffering after being triggered (default true) - */ - public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true) - { - if (null === $activationStrategy) { - $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); - } - - // convert simple int activationStrategy to an object - if (!$activationStrategy instanceof ActivationStrategyInterface) { - $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); - } - - $this->handler = $handler; - $this->activationStrategy = $activationStrategy; - $this->bufferSize = $bufferSize; - $this->bubble = $bubble; - $this->stopBuffering = $stopBuffering; - } - - /** - * {@inheritdoc} - */ - public function isHandling(array $record) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function handle(array $record) - { - if ($this->processors) { - foreach ($this->processors as $processor) { - $record = call_user_func($processor, $record); - } - } - - if ($this->buffering) { - $this->buffer[] = $record; - if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { - array_shift($this->buffer); - } - if ($this->activationStrategy->isHandlerActivated($record)) { - if ($this->stopBuffering) { - $this->buffering = false; - } - if (!$this->handler instanceof HandlerInterface) { - if (!is_callable($this->handler)) { - throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); - } - $this->handler = call_user_func($this->handler, $record, $this); - if (!$this->handler instanceof HandlerInterface) { - throw new \RuntimeException("The factory callable should return a HandlerInterface"); - } - } - $this->handler->handleBatch($this->buffer); - $this->buffer = array(); - } - } else { - $this->handler->handle($record); - } - - return false === $this->bubble; - } - - /** - * Resets the state of the handler. Stops forwarding records to the wrapped handler. - */ - public function reset() - { - $this->buffering = true; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php deleted file mode 100644 index 46a039ad72..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php +++ /dev/null @@ -1,184 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\WildfireFormatter; - -/** - * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. - * - * @author Eric Clemmons (@ericclemmons) - */ -class FirePHPHandler extends AbstractProcessingHandler -{ - /** - * WildFire JSON header message format - */ - const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; - - /** - * FirePHP structure for parsing messages & their presentation - */ - const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; - - /** - * Must reference a "known" plugin, otherwise headers won't display in FirePHP - */ - const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; - - /** - * Header prefix for Wildfire to recognize & parse headers - */ - const HEADER_PREFIX = 'X-Wf'; - - /** - * Whether or not Wildfire vendor-specific headers have been generated & sent yet - */ - protected static $initialized = false; - - /** - * Shared static message index between potentially multiple handlers - * @var int - */ - protected static $messageIndex = 1; - - protected static $sendHeaders = true; - - /** - * Base header creation function used by init headers & record headers - * - * @param array $meta Wildfire Plugin, Protocol & Structure Indexes - * @param string $message Log message - * @return array Complete header string ready for the client as key and message as value - */ - protected function createHeader(array $meta, $message) - { - $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta)); - - return array($header => $message); - } - - /** - * Creates message header from record - * - * @see createHeader() - * @param array $record - * @return string - */ - protected function createRecordHeader(array $record) - { - // Wildfire is extensible to support multiple protocols & plugins in a single request, - // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. - return $this->createHeader( - array(1, 1, 1, self::$messageIndex++), - $record['formatted'] - ); - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new WildfireFormatter(); - } - - /** - * Wildfire initialization headers to enable message parsing - * - * @see createHeader() - * @see sendHeader() - * @return array - */ - protected function getInitHeaders() - { - // Initial payload consists of required headers for Wildfire - return array_merge( - $this->createHeader(array('Protocol', 1), self::PROTOCOL_URI), - $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI), - $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI) - ); - } - - /** - * Send header string to the client - * - * @param string $header - * @param string $content - */ - protected function sendHeader($header, $content) - { - if (!headers_sent() && self::$sendHeaders) { - header(sprintf('%s: %s', $header, $content)); - } - } - - /** - * Creates & sends header for a record, ensuring init headers have been sent prior - * - * @see sendHeader() - * @see sendInitHeaders() - * @param array $record - */ - protected function write(array $record) - { - // WildFire-specific headers must be sent prior to any messages - if (!self::$initialized) { - self::$sendHeaders = $this->headersAccepted(); - - foreach ($this->getInitHeaders() as $header => $content) { - $this->sendHeader($header, $content); - } - - self::$initialized = true; - } - - $header = $this->createRecordHeader($record); - $this->sendHeader(key($header), current($header)); - } - - /** - * Verifies if the headers are accepted by the current user agent - * - * @return Boolean - */ - protected function headersAccepted() - { - return !isset($_SERVER['HTTP_USER_AGENT']) - || preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT']) - || isset($_SERVER['HTTP_X_FIREPHP_VERSION']); - } - - /** - * BC getter for the sendHeaders property that has been made static - */ - public function __get($property) - { - if ('sendHeaders' !== $property) { - throw new \InvalidArgumentException('Undefined property '.$property); - } - - return static::$sendHeaders; - } - - /** - * BC setter for the sendHeaders property that has been made static - */ - public function __set($property, $value) - { - if ('sendHeaders' !== $property) { - throw new \InvalidArgumentException('Undefined property '.$property); - } - - static::$sendHeaders = $value; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php deleted file mode 100644 index 34d48e7506..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Gelf\IMessagePublisher; -use Monolog\Logger; -use Monolog\Handler\AbstractProcessingHandler; -use Monolog\Formatter\GelfMessageFormatter; - -/** - * Handler to send messages to a Graylog2 (http://www.graylog2.org) server - * - * @author Matt Lehner - */ -class GelfHandler extends AbstractProcessingHandler -{ - /** - * @var Gelf\IMessagePublisher the publisher object that sends the message to the server - */ - protected $publisher; - - /** - * @param Gelf\IMessagePublisher $publisher a publisher object - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct(IMessagePublisher $publisher, $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($level, $bubble); - - $this->publisher = $publisher; - } - - /** - * {@inheritdoc} - */ - public function close() - { - $this->publisher = null; - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - $this->publisher->publish($record['formatted']); - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new GelfMessageFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php deleted file mode 100644 index 99384d35f1..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -/** - * Forwards records to multiple handlers - * - * @author Lenar Lõhmus - */ -class GroupHandler extends AbstractHandler -{ - protected $handlers; - - /** - * @param array $handlers Array of Handlers. - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct(array $handlers, $bubble = true) - { - foreach ($handlers as $handler) { - if (!$handler instanceof HandlerInterface) { - throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); - } - } - - $this->handlers = $handlers; - $this->bubble = $bubble; - } - - /** - * {@inheritdoc} - */ - public function isHandling(array $record) - { - foreach ($this->handlers as $handler) { - if ($handler->isHandling($record)) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - public function handle(array $record) - { - if ($this->processors) { - foreach ($this->processors as $processor) { - $record = call_user_func($processor, $record); - } - } - - foreach ($this->handlers as $handler) { - $handler->handle($record); - } - - return false === $this->bubble; - } - - /** - * {@inheritdoc} - */ - public function handleBatch(array $records) - { - foreach ($this->handlers as $handler) { - $handler->handleBatch($records); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php deleted file mode 100644 index accff037c1..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\FormatterInterface; - -/** - * Interface that all Monolog Handlers must implement - * - * @author Jordi Boggiano - */ -interface HandlerInterface -{ - /** - * Checks whether the given record will be handled by this handler. - * - * This is mostly done for performance reasons, to avoid calling processors for nothing. - * - * Handlers should still check the record levels within handle(), returning false in isHandling() - * is no guarantee that handle() will not be called, and isHandling() might not be called - * for a given record. - * - * @param array $record - * - * @return Boolean - */ - public function isHandling(array $record); - - /** - * Handles a record. - * - * All records may be passed to this method, and the handler should discard - * those that it does not want to handle. - * - * The return value of this function controls the bubbling process of the handler stack. - * Unless the bubbling is interrupted (by returning true), the Logger class will keep on - * calling further handlers in the stack with a given log record. - * - * @param array $record The record to handle - * @return Boolean true means that this handler handled the record, and that bubbling is not permitted. - * false means the record was either not processed or that this handler allows bubbling. - */ - public function handle(array $record); - - /** - * Handles a set of records at once. - * - * @param array $records The records to handle (an array of record arrays) - */ - public function handleBatch(array $records); - - /** - * Adds a processor in the stack. - * - * @param callable $callback - * @return self - */ - public function pushProcessor($callback); - - /** - * Removes the processor on top of the stack and returns it. - * - * @return callable - */ - public function popProcessor(); - - /** - * Sets the formatter. - * - * @param FormatterInterface $formatter - * @return self - */ - public function setFormatter(FormatterInterface $formatter); - - /** - * Gets the formatter. - * - * @return FormatterInterface - */ - public function getFormatter(); -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php deleted file mode 100644 index 5a6a46b0e6..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php +++ /dev/null @@ -1,250 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Sends notifications through the hipchat api to a hipchat room - * - * Notes: - * API token - HipChat API token - * Room - HipChat Room Id or name, where messages are sent - * Name - Name used to send the message (from) - * notify - Should the message trigger a notification in the clients - * - * @author Rafael Dohms - * @see https://www.hipchat.com/docs/api - */ -class HipChatHandler extends SocketHandler -{ - /** - * The maximum allowed length for the name used in the "from" field. - */ - const MAXIMUM_NAME_LENGTH = 15; - - /** - * @var string - */ - private $token; - - /** - * @var array - */ - private $room; - - /** - * @var string - */ - private $name; - - /** - * @var boolean - */ - private $notify; - - /** - * @param string $token HipChat API Token - * @param string $room The room that should be alerted of the message (Id or Name) - * @param string $name Name used in the "from" field - * @param bool $notify Trigger a notification in clients or not - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $useSSL Whether to connect via SSL. - */ - public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true) - { - if (!$this->validateName($name)) { - throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.'); - } - - $connectionString = $useSSL ? 'ssl://api.hipchat.com:443' : 'api.hipchat.com:80'; - parent::__construct($connectionString, $level, $bubble); - - $this->token = $token; - $this->name = $name; - $this->notify = $notify; - $this->room = $room; - } - - /** - * {@inheritdoc} - * - * @param array $record - * @return string - */ - protected function generateDataStream($record) - { - $content = $this->buildContent($record); - - return $this->buildHeader($content) . $content; - } - - /** - * Builds the body of API call - * - * @param array $record - * @return string - */ - private function buildContent($record) - { - $dataArray = array( - 'from' => $this->name, - 'room_id' => $this->room, - 'notify' => $this->notify, - 'message' => $record['formatted'], - 'message_format' => 'text', - 'color' => $this->getAlertColor($record['level']), - ); - - return http_build_query($dataArray); - } - - /** - * Builds the header of the API Call - * - * @param string $content - * @return string - */ - private function buildHeader($content) - { - $header = "POST /v1/rooms/message?format=json&auth_token=".$this->token." HTTP/1.1\r\n"; - $header .= "Host: api.hipchat.com\r\n"; - $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; - $header .= "Content-Length: " . strlen($content) . "\r\n"; - $header .= "\r\n"; - - return $header; - } - - /** - * Assigns a color to each level of log records. - * - * @param integer $level - * @return string - */ - protected function getAlertColor($level) - { - switch (true) { - case $level >= Logger::ERROR: - return 'red'; - case $level >= Logger::WARNING: - return 'yellow'; - case $level >= Logger::INFO: - return 'green'; - case $level == Logger::DEBUG: - return 'gray'; - default: - return 'yellow'; - } - } - - /** - * {@inheritdoc} - * - * @param array $record - */ - public function write(array $record) - { - parent::write($record); - $this->closeSocket(); - } - - /** - * {@inheritdoc} - */ - public function handleBatch(array $records) - { - if (count($records) == 0) { - return true; - } - - $batchRecord = $this->combineRecords($records); - - if (!$this->isHandling($batchRecord)) { - return false; - } - - $this->write($batchRecord); - - return false === $this->bubble; - } - - /** - * Combines multiple records into one. Error level of the combined record - * will be the highest level from the given records. Datetime will be taken - * from the first record. - * - * @param $records - * @return array - */ - private function combineRecords($records) - { - $messages = array(); - $formattedMessages = array(); - $level = 0; - $levelName = null; - $datetime = null; - - foreach ($records as $record) { - - $record = $this->processRecord($record); - $record['formatted'] = $this->getFormatter()->format($record); - - $messages[] = $record['message']; - $formattedMessages[] = $record['formatted']; - - if ($record['level'] > $level) { - $level = $record['level']; - $levelName = $record['level_name']; - } - - if (null === $datetime) { - $datetime = $record['datetime']; - } - } - - $batchRecord = array( - 'message' => implode(PHP_EOL, $messages), - 'formatted' => implode('', $formattedMessages), - 'level' => $level, - 'level_name' => $levelName, - 'datetime' => $datetime, - 'context' => array(), - 'extra' => array(), - ); - - return $batchRecord; - } - - /** - * Validates the supplied name for the "from" field. - * - * If the `mb_strlen()` function is available, it will use that, as HipChat - * allows UTF-8 characters. Otherwise, it will fall back to `strlen()`. - * - * Note that this might cause false failures in the specific case of using - * a valid name with less than 16 characters, but 16 or more bytes, on a - * system where `mb_strlen()` is unavailable. - * - * @param string $name Name to validate - * @return Boolean - */ - private function validateName($name) - { - if (function_exists('mb_strlen')) { - return (mb_strlen($name) <= static::MAXIMUM_NAME_LENGTH); - } - - return (strlen($name) <= static::MAXIMUM_NAME_LENGTH); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php deleted file mode 100644 index e0061a5315..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Formatter\JsonFormatter; - -/** - * Sends errors to Loggly. - * - * @author Przemek Sobstel - */ -class LogglyHandler extends AbstractProcessingHandler -{ - const HOST = 'logs-01.loggly.com'; - - protected $token; - - protected $tag; - - public function __construct($token, $level = Logger::DEBUG, $bubble = true) - { - if (!extension_loaded('curl')) { - throw new \LogicException('The curl extension is needed to use the LogglyHandler'); - } - - $this->token = $token; - - parent::__construct($level, $bubble); - } - - public function setTag($tag) - { - $this->tag = $tag; - } - - protected function write(array $record) - { - $url = sprintf("http://%s/inputs/%s/", self::HOST, $this->token); - if ($this->tag) { - $url .= sprintf("tag/%s/", $this->tag); - } - - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $record["formatted"]); - curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - - curl_exec($ch); - curl_close($ch); - } - - protected function getDefaultFormatter() - { - return new JsonFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php deleted file mode 100644 index 86292727f3..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -/** - * Base class for all mail handlers - * - * @author Gyula Sallai - */ -abstract class MailHandler extends AbstractProcessingHandler -{ - /** - * {@inheritdoc} - */ - public function handleBatch(array $records) - { - $messages = array(); - - foreach ($records as $record) { - if ($record['level'] < $this->level) { - continue; - } - $messages[] = $this->processRecord($record); - } - - if (!empty($messages)) { - $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); - } - } - - /** - * Send a mail with the given content - * - * @param string $content - * @param array $records the array of log records that formed this content - */ - abstract protected function send($content, array $records); - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - $this->send((string) $record['formatted'], array($record)); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php deleted file mode 100644 index 0cb21cd227..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -/** - * Exception can be thrown if an extension for an handler is missing - * - * @author Christian Bergau - */ -class MissingExtensionException extends \Exception -{ - -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php deleted file mode 100644 index 6c431f2b19..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Formatter\NormalizerFormatter; - -/** - * Logs to a MongoDB database. - * - * usage example: - * - * $log = new Logger('application'); - * $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod"); - * $log->pushHandler($mongodb); - * - * @author Thomas Tourlourat - */ -class MongoDBHandler extends AbstractProcessingHandler -{ - protected $mongoCollection; - - public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = true) - { - if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo)) { - throw new \InvalidArgumentException('MongoClient or Mongo instance required'); - } - - $this->mongoCollection = $mongo->selectCollection($database, $collection); - - parent::__construct($level, $bubble); - } - - protected function write(array $record) - { - $this->mongoCollection->save($record["formatted"]); - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new NormalizerFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php deleted file mode 100644 index 3033c0ba55..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * NativeMailerHandler uses the mail() function to send the emails - * - * @author Christophe Coevoet - */ -class NativeMailerHandler extends MailHandler -{ - protected $to; - protected $subject; - protected $headers = array( - 'Content-type: text/plain; charset=utf-8' - ); - protected $maxColumnWidth; - - /** - * @param string|array $to The receiver of the mail - * @param string $subject The subject of the mail - * @param string $from The sender of the mail - * @param integer $level The minimum logging level at which this handler will be triggered - * @param boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param int $maxColumnWidth The maximum column width that the message lines will have - */ - public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = true, $maxColumnWidth = 70) - { - parent::__construct($level, $bubble); - $this->to = is_array($to) ? $to : array($to); - $this->subject = $subject; - $this->addHeader(sprintf('From: %s', $from)); - $this->maxColumnWidth = $maxColumnWidth; - } - - /** - * @param string|array $headers Custom added headers - */ - public function addHeader($headers) - { - foreach ((array) $headers as $header) { - if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { - throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); - } - $this->headers[] = $header; - } - } - - /** - * {@inheritdoc} - */ - protected function send($content, array $records) - { - $content = wordwrap($content, $this->maxColumnWidth); - $headers = implode("\r\n", $this->headers) . "\r\n"; - foreach ($this->to as $to) { - mail($to, $this->subject, $content, $headers); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php deleted file mode 100644 index 31bc5d2ffe..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Class to record a log on a NewRelic application - * - * @see https://newrelic.com/docs/php/new-relic-for-php - */ -class NewRelicHandler extends AbstractProcessingHandler -{ - /** - * Name of the New Relic application that will receive logs from this handler. - * - * @var string - */ - protected $appName; - - /** - * {@inheritDoc} - * - * @param string $appName - */ - public function __construct($level = Logger::ERROR, $bubble = true, $appName = null) - { - parent::__construct($level, $bubble); - - $this->appName = $appName; - } - - /** - * {@inheritDoc} - */ - protected function write(array $record) - { - if (!$this->isNewRelicEnabled()) { - throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); - } - - if ($appName = $this->getAppName($record['context'])) { - $this->setNewRelicAppName($appName); - } - - if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) { - newrelic_notice_error($record['message'], $record['context']['exception']); - unset($record['context']['exception']); - } else { - newrelic_notice_error($record['message']); - } - - foreach ($record['context'] as $key => $parameter) { - newrelic_add_custom_parameter($key, $parameter); - } - } - - /** - * Checks whether the NewRelic extension is enabled in the system. - * - * @return bool - */ - protected function isNewRelicEnabled() - { - return extension_loaded('newrelic'); - } - - /** - * Returns the appname where this log should be sent. Each log can override the default appname, set in this - * handler's constructor, by providing the appname in its context. - * - * @param array $context - * @return null|string - */ - protected function getAppName(array $context) - { - if (isset($context['appname'])) { - return $context['appname']; - } - - return $this->appName; - } - - /** - * Sets the NewRelic application that should receive this log. - * - * @param string $appName - */ - protected function setNewRelicAppName($appName) - { - newrelic_set_appname($appName); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php deleted file mode 100644 index 3754e45dbc..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Blackhole - * - * Any record it can handle will be thrown away. This can be used - * to put on top of an existing stack to override it temporarily. - * - * @author Jordi Boggiano - */ -class NullHandler extends AbstractHandler -{ - /** - * @param integer $level The minimum logging level at which this handler will be triggered - */ - public function __construct($level = Logger::DEBUG) - { - parent::__construct($level, false); - } - - /** - * {@inheritdoc} - */ - public function handle(array $record) - { - if ($record['level'] < $this->level) { - return false; - } - - return true; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php deleted file mode 100644 index b1dff9b64f..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Sends notifications through the pushover api to mobile phones - * - * @author Sebastian Göttschkes - * @see https://www.pushover.net/api - */ -class PushoverHandler extends SocketHandler -{ - private $token; - private $users; - private $title; - private $user; - private $retry; - private $expire; - - private $highPriorityLevel; - private $emergencyLevel; - - /** - * @param string $token Pushover api token - * @param string|array $users Pushover user id or array of ids the message will be sent to - * @param string $title Title sent to the Pushover API - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $useSSL Whether to connect via SSL. Required when pushing messages to users that are not - * the pushover.net app owner. OpenSSL is required for this option. - * @param integer $highPriorityLevel The minimum logging level at which this handler will start - * sending "high priority" requests to the Pushover API - * @param integer $emergencyLevel The minimum logging level at which this handler will start - * sending "emergency" requests to the Pushover API - * @param integer $retry The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user. - * @param integer $expire The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds). - */ - public function __construct($token, $users, $title = null, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, $retry = 30, $expire = 25200) - { - $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; - parent::__construct($connectionString, $level, $bubble); - - $this->token = $token; - $this->users = (array) $users; - $this->title = $title ?: gethostname(); - $this->highPriorityLevel = $highPriorityLevel; - $this->emergencyLevel = $emergencyLevel; - $this->retry = $retry; - $this->expire = $expire; - } - - protected function generateDataStream($record) - { - $content = $this->buildContent($record); - - return $this->buildHeader($content) . $content; - } - - private function buildContent($record) - { - // Pushover has a limit of 512 characters on title and message combined. - $maxMessageLength = 512 - strlen($this->title); - $message = substr($record['message'], 0, $maxMessageLength); - $timestamp = $record['datetime']->getTimestamp(); - - $dataArray = array( - 'token' => $this->token, - 'user' => $this->user, - 'message' => $message, - 'title' => $this->title, - 'timestamp' => $timestamp - ); - - if ($record['level'] >= $this->emergencyLevel) { - $dataArray['priority'] = 2; - $dataArray['retry'] = $this->retry; - $dataArray['expire'] = $this->expire; - } elseif ($record['level'] >= $this->highPriorityLevel) { - $dataArray['priority'] = 1; - } - - return http_build_query($dataArray); - } - - private function buildHeader($content) - { - $header = "POST /1/messages.json HTTP/1.1\r\n"; - $header .= "Host: api.pushover.net\r\n"; - $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; - $header .= "Content-Length: " . strlen($content) . "\r\n"; - $header .= "\r\n"; - - return $header; - } - - public function write(array $record) - { - foreach ($this->users as $user) { - $this->user = $user; - - parent::write($record); - $this->closeSocket(); - } - - $this->user = null; - } - - public function setHighPriorityLevel($value) - { - $this->highPriorityLevel = $value; - } - - public function setEmergencyLevel($value) - { - $this->emergencyLevel = $value; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php deleted file mode 100644 index 653e61c1c5..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\LineFormatter; -use Monolog\Formatter\FormatterInterface; -use Monolog\Logger; -use Monolog\Handler\AbstractProcessingHandler; -use Raven_Client; - -/** - * Handler to send messages to a Sentry (https://github.com/dcramer/sentry) server - * using raven-php (https://github.com/getsentry/raven-php) - * - * @author Marc Abramowitz - */ -class RavenHandler extends AbstractProcessingHandler -{ - /** - * Translates Monolog log levels to Raven log levels. - */ - private $logLevels = array( - Logger::DEBUG => Raven_Client::DEBUG, - Logger::INFO => Raven_Client::INFO, - Logger::NOTICE => Raven_Client::INFO, - Logger::WARNING => Raven_Client::WARNING, - Logger::ERROR => Raven_Client::ERROR, - Logger::CRITICAL => Raven_Client::FATAL, - Logger::ALERT => Raven_Client::FATAL, - Logger::EMERGENCY => Raven_Client::FATAL, - ); - - /** - * @var Raven_Client the client object that sends the message to the server - */ - protected $ravenClient; - - /** - * @var LineFormatter The formatter to use for the logs generated via handleBatch() - */ - protected $batchFormatter; - - /** - * @param Raven_Client $ravenClient - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($level, $bubble); - - $this->ravenClient = $ravenClient; - } - - /** - * {@inheritdoc} - */ - public function handleBatch(array $records) - { - $level = $this->level; - - // filter records based on their level - $records = array_filter($records, function ($record) use ($level) { - return $record['level'] >= $level; - }); - - if (!$records) { - return; - } - - // the record with the highest severity is the "main" one - $record = array_reduce($records, function ($highest, $record) { - if ($record['level'] >= $highest['level']) { - return $record; - } - - return $highest; - }); - - // the other ones are added as a context item - $logs = array(); - foreach ($records as $r) { - $logs[] = $this->processRecord($r); - } - - if ($logs) { - $record['context']['logs'] = (string) $this->getBatchFormatter()->formatBatch($logs); - } - - $this->handle($record); - } - - /** - * Sets the formatter for the logs generated by handleBatch(). - * - * @param FormatterInterface $formatter - */ - public function setBatchFormatter(FormatterInterface $formatter) - { - $this->batchFormatter = $formatter; - } - - /** - * Gets the formatter for the logs generated by handleBatch(). - * - * @return FormatterInterface - */ - public function getBatchFormatter() - { - if (!$this->batchFormatter) { - $this->batchFormatter = $this->getDefaultBatchFormatter(); - } - - return $this->batchFormatter; - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - $options = array(); - $options['level'] = $this->logLevels[$record['level']]; - if (!empty($record['context'])) { - $options['extra']['context'] = $record['context']; - } - if (!empty($record['extra'])) { - $options['extra']['extra'] = $record['extra']; - } - - if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) { - $options['extra']['message'] = $record['formatted']; - $this->ravenClient->captureException($record['context']['exception'], $options); - - return; - } - - $this->ravenClient->captureMessage($record['formatted'], array(), $options); - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new LineFormatter('[%channel%] %message%'); - } - - /** - * Gets the default formatter for the logs generated by handleBatch(). - * - * @return FormatterInterface - */ - protected function getDefaultBatchFormatter() - { - return new LineFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php deleted file mode 100644 index 3fc7f34bd1..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; - -/** - * Logs to a Redis key using rpush - * - * usage example: - * - * $log = new Logger('application'); - * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); - * $log->pushHandler($redis); - * - * @author Thomas Tourlourat - */ -class RedisHandler extends AbstractProcessingHandler -{ - private $redisClient; - private $redisKey; - - # redis instance, key to use - public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = true) - { - if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { - throw new \InvalidArgumentException('Predis\Client or Redis instance required'); - } - - $this->redisClient = $redis; - $this->redisKey = $key; - - parent::__construct($level, $bubble); - } - - protected function write(array $record) - { - $this->redisClient->rpush($this->redisKey, $record["formatted"]); - } - - /** - * {@inheritDoc} - */ - protected function getDefaultFormatter() - { - return new LineFormatter(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php deleted file mode 100644 index a02ff516ee..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php +++ /dev/null @@ -1,149 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Stores logs to files that are rotated every day and a limited number of files are kept. - * - * This rotation is only intended to be used as a workaround. Using logrotate to - * handle the rotation is strongly encouraged when you can use it. - * - * @author Christophe Coevoet - * @author Jordi Boggiano - */ -class RotatingFileHandler extends StreamHandler -{ - protected $filename; - protected $maxFiles; - protected $mustRotate; - protected $nextRotation; - protected $filenameFormat; - protected $dateFormat; - - /** - * @param string $filename - * @param integer $maxFiles The maximal amount of files to keep (0 means unlimited) - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true) - { - $this->filename = $filename; - $this->maxFiles = (int) $maxFiles; - $this->nextRotation = new \DateTime('tomorrow'); - $this->filenameFormat = '{filename}-{date}'; - $this->dateFormat = 'Y-m-d'; - - parent::__construct($this->getTimedFilename(), $level, $bubble); - } - - /** - * {@inheritdoc} - */ - public function close() - { - parent::close(); - - if (true === $this->mustRotate) { - $this->rotate(); - } - } - - public function setFilenameFormat($filenameFormat, $dateFormat) - { - $this->filenameFormat = $filenameFormat; - $this->dateFormat = $dateFormat; - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - // on the first record written, if the log is new, we should rotate (once per day) - if (null === $this->mustRotate) { - $this->mustRotate = !file_exists($this->url); - } - - if ($this->nextRotation < $record['datetime']) { - $this->mustRotate = true; - $this->close(); - } - - parent::write($record); - } - - /** - * Rotates the files. - */ - protected function rotate() - { - // update filename - $this->url = $this->getTimedFilename(); - $this->nextRotation = new \DateTime('tomorrow'); - - // skip GC of old logs if files are unlimited - if (0 === $this->maxFiles) { - return; - } - - $logFiles = glob($this->getGlobPattern()); - if ($this->maxFiles >= count($logFiles)) { - // no files to remove - return; - } - - // Sorting the files by name to remove the older ones - usort($logFiles, function ($a, $b) { - return strcmp($b, $a); - }); - - foreach (array_slice($logFiles, $this->maxFiles) as $file) { - if (is_writable($file)) { - unlink($file); - } - } - } - - protected function getTimedFilename() - { - $fileInfo = pathinfo($this->filename); - $timedFilename = str_replace( - array('{filename}', '{date}'), - array($fileInfo['filename'], date($this->dateFormat)), - $fileInfo['dirname'] . '/' . $this->filenameFormat - ); - - if (!empty($fileInfo['extension'])) { - $timedFilename .= '.'.$fileInfo['extension']; - } - - return $timedFilename; - } - - protected function getGlobPattern() - { - $fileInfo = pathinfo($this->filename); - $glob = str_replace( - array('{filename}', '{date}'), - array($fileInfo['filename'], '*'), - $fileInfo['dirname'] . '/' . $this->filenameFormat - ); - if (!empty($fileInfo['extension'])) { - $glob .= '.'.$fileInfo['extension']; - } - - return $glob; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php deleted file mode 100644 index 4faa327d63..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php +++ /dev/null @@ -1,285 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Stores to any socket - uses fsockopen() or pfsockopen(). - * - * @author Pablo de Leon Belloc - * @see http://php.net/manual/en/function.fsockopen.php - */ -class SocketHandler extends AbstractProcessingHandler -{ - private $connectionString; - private $connectionTimeout; - private $resource; - private $timeout = 0; - private $persistent = false; - private $errno; - private $errstr; - - /** - * @param string $connectionString Socket connection string - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($level, $bubble); - $this->connectionString = $connectionString; - $this->connectionTimeout = (float) ini_get('default_socket_timeout'); - } - - /** - * Connect (if necessary) and write to the socket - * - * @param array $record - * - * @throws \UnexpectedValueException - * @throws \RuntimeException - */ - public function write(array $record) - { - $this->connectIfNotConnected(); - $data = $this->generateDataStream($record); - $this->writeToSocket($data); - } - - /** - * We will not close a PersistentSocket instance so it can be reused in other requests. - */ - public function close() - { - if (!$this->isPersistent()) { - $this->closeSocket(); - } - } - - /** - * Close socket, if open - */ - public function closeSocket() - { - if (is_resource($this->resource)) { - fclose($this->resource); - $this->resource = null; - } - } - - /** - * Set socket connection to nbe persistent. It only has effect before the connection is initiated. - * - * @param type $boolean - */ - public function setPersistent($boolean) - { - $this->persistent = (boolean) $boolean; - } - - /** - * Set connection timeout. Only has effect before we connect. - * - * @param float $seconds - * - * @see http://php.net/manual/en/function.fsockopen.php - */ - public function setConnectionTimeout($seconds) - { - $this->validateTimeout($seconds); - $this->connectionTimeout = (float) $seconds; - } - - /** - * Set write timeout. Only has effect before we connect. - * - * @param float $seconds - * - * @see http://php.net/manual/en/function.stream-set-timeout.php - */ - public function setTimeout($seconds) - { - $this->validateTimeout($seconds); - $this->timeout = (float) $seconds; - } - - /** - * Get current connection string - * - * @return string - */ - public function getConnectionString() - { - return $this->connectionString; - } - - /** - * Get persistent setting - * - * @return boolean - */ - public function isPersistent() - { - return $this->persistent; - } - - /** - * Get current connection timeout setting - * - * @return float - */ - public function getConnectionTimeout() - { - return $this->connectionTimeout; - } - - /** - * Get current in-transfer timeout - * - * @return float - */ - public function getTimeout() - { - return $this->timeout; - } - - /** - * Check to see if the socket is currently available. - * - * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. - * - * @return boolean - */ - public function isConnected() - { - return is_resource($this->resource) - && !feof($this->resource); // on TCP - other party can close connection. - } - - /** - * Wrapper to allow mocking - */ - protected function pfsockopen() - { - return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); - } - - /** - * Wrapper to allow mocking - */ - protected function fsockopen() - { - return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); - } - - /** - * Wrapper to allow mocking - * - * @see http://php.net/manual/en/function.stream-set-timeout.php - */ - protected function streamSetTimeout() - { - $seconds = floor($this->timeout); - $microseconds = round(($this->timeout - $seconds)*1e6); - - return stream_set_timeout($this->resource, $seconds, $microseconds); - } - - /** - * Wrapper to allow mocking - */ - protected function fwrite($data) - { - return @fwrite($this->resource, $data); - } - - /** - * Wrapper to allow mocking - */ - protected function streamGetMetadata() - { - return stream_get_meta_data($this->resource); - } - - private function validateTimeout($value) - { - $ok = filter_var($value, FILTER_VALIDATE_FLOAT); - if ($ok === false || $value < 0) { - throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); - } - } - - private function connectIfNotConnected() - { - if ($this->isConnected()) { - return; - } - $this->connect(); - } - - protected function generateDataStream($record) - { - return (string) $record['formatted']; - } - - private function connect() - { - $this->createSocketResource(); - $this->setSocketTimeout(); - } - - private function createSocketResource() - { - if ($this->isPersistent()) { - $resource = $this->pfsockopen(); - } else { - $resource = $this->fsockopen(); - } - if (!$resource) { - throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); - } - $this->resource = $resource; - } - - private function setSocketTimeout() - { - if (!$this->streamSetTimeout()) { - throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); - } - } - - private function writeToSocket($data) - { - $length = strlen($data); - $sent = 0; - while ($this->isConnected() && $sent < $length) { - if (0 == $sent) { - $chunk = $this->fwrite($data); - } else { - $chunk = $this->fwrite(substr($data, $sent)); - } - if ($chunk === false) { - throw new \RuntimeException("Could not write to socket"); - } - $sent += $chunk; - $socketInfo = $this->streamGetMetadata(); - if ($socketInfo['timed_out']) { - throw new \RuntimeException("Write timed-out"); - } - } - if (!$this->isConnected() && $sent < $length) { - throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); - } - } - -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php deleted file mode 100644 index 281752949b..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Stores to any stream resource - * - * Can be used to store into php://stderr, remote and local files, etc. - * - * @author Jordi Boggiano - */ -class StreamHandler extends AbstractProcessingHandler -{ - protected $stream; - protected $url; - private $errorMessage; - - /** - * @param string $stream - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct($stream, $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($level, $bubble); - if (is_resource($stream)) { - $this->stream = $stream; - } else { - $this->url = $stream; - } - } - - /** - * {@inheritdoc} - */ - public function close() - { - if (is_resource($this->stream)) { - fclose($this->stream); - } - $this->stream = null; - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - if (null === $this->stream) { - if (!$this->url) { - throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); - } - $this->errorMessage = null; - set_error_handler(array($this, 'customErrorHandler')); - $this->stream = fopen($this->url, 'a'); - restore_error_handler(); - if (!is_resource($this->stream)) { - $this->stream = null; - throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url)); - } - } - fwrite($this->stream, (string) $record['formatted']); - } - - private function customErrorHandler($code, $msg) - { - $this->errorMessage = preg_replace('{^fopen\(.*?\): }', '', $msg); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php deleted file mode 100644 index ca03ccaa9a..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * SwiftMailerHandler uses Swift_Mailer to send the emails - * - * @author Gyula Sallai - */ -class SwiftMailerHandler extends MailHandler -{ - protected $mailer; - protected $message; - - /** - * @param \Swift_Mailer $mailer The mailer to use - * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true) - { - parent::__construct($level, $bubble); - $this->mailer = $mailer; - if (!$message instanceof \Swift_Message && is_callable($message)) { - $message = call_user_func($message); - } - if (!$message instanceof \Swift_Message) { - throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); - } - $this->message = $message; - } - - /** - * {@inheritdoc} - */ - protected function send($content, array $records) - { - $message = clone $this->message; - $message->setBody($content); - - $this->mailer->send($message); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php deleted file mode 100644 index 47c73e12a9..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Logs to syslog service. - * - * usage example: - * - * $log = new Logger('application'); - * $syslog = new SyslogHandler('myfacility', 'local6'); - * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); - * $syslog->setFormatter($formatter); - * $log->pushHandler($syslog); - * - * @author Sven Paulus - */ -class SyslogHandler extends AbstractSyslogHandler -{ - protected $ident; - protected $logopts; - - /** - * @param string $ident - * @param mixed $facility - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID - */ - public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID) - { - parent::__construct($facility, $level, $bubble); - - $this->ident = $ident; - $this->logopts = $logopts; - } - - /** - * {@inheritdoc} - */ - public function close() - { - closelog(); - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - if (!openlog($this->ident, $this->logopts, $this->facility)) { - throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"'); - } - syslog($this->logLevels[$record['level']], (string) $record['formatted']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php deleted file mode 100644 index d87ab9d348..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler\SyslogUdp; - -class UdpSocket -{ - const DATAGRAM_MAX_LENGTH = 2048; - - public function __construct($ip, $port = 514) - { - $this->ip = $ip; - $this->port = $port; - $this->socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); - } - - public function write($line, $header = "") - { - $remaining = $line; - while (!is_null($remaining)) { - list($chunk, $remaining) = $this->splitLineIfNessesary($remaining, $header); - $this->send($chunk); - } - } - - public function close() - { - socket_close($this->socket); - } - - protected function send($chunk) - { - socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); - } - - protected function splitLineIfNessesary($line, $header) - { - if ($this->shouldSplitLine($line, $header)) { - $chunkSize = self::DATAGRAM_MAX_LENGTH - strlen($header); - $chunk = $header . substr($line, 0, $chunkSize); - $remaining = substr($line, $chunkSize); - } else { - $chunk = $header . $line; - $remaining = null; - } - - return array($chunk, $remaining); - } - - protected function shouldSplitLine($remaining, $header) - { - return strlen($header.$remaining) > self::DATAGRAM_MAX_LENGTH; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php deleted file mode 100644 index 4aadffc548..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\Handler\SyslogUdp\UdpSocket; - -/** - * A Handler for logging to a remote syslogd server. - * - * @author Jesper Skovgaard Nielsen - */ -class SyslogUdpHandler extends AbstractSyslogHandler -{ - /** - * @param string $host - * @param int $port - * @param mixed $facility - * @param integer $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - */ - public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true) - { - parent::__construct($facility, $level, $bubble); - - $this->socket = new UdpSocket($host, $port ?: 514); - } - - protected function write(array $record) - { - $lines = $this->splitMessageIntoLines($record['formatted']); - - $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']]); - - foreach ($lines as $line) { - $this->socket->write($line, $header); - } - } - - public function close() - { - $this->socket->close(); - } - - private function splitMessageIntoLines($message) - { - if (is_array($message)) { - $message = implode("\n", $message); - } - - return preg_split('/$\R?^/m', $message); - } - - /** - * Make common syslog header (see rfc5424) - */ - private function makeCommonSyslogHeader($severity) - { - $priority = $severity + $this->facility; - - return "<$priority>: "; - } - - /** - * Inject your own socket, mainly used for testing - */ - public function setSocket($socket) - { - $this->socket = $socket; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php deleted file mode 100644 index 085d9e1719..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php +++ /dev/null @@ -1,140 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -/** - * Used for testing purposes. - * - * It records all records and gives you access to them for verification. - * - * @author Jordi Boggiano - */ -class TestHandler extends AbstractProcessingHandler -{ - protected $records = array(); - protected $recordsByLevel = array(); - - public function getRecords() - { - return $this->records; - } - - public function hasEmergency($record) - { - return $this->hasRecord($record, Logger::EMERGENCY); - } - - public function hasAlert($record) - { - return $this->hasRecord($record, Logger::ALERT); - } - - public function hasCritical($record) - { - return $this->hasRecord($record, Logger::CRITICAL); - } - - public function hasError($record) - { - return $this->hasRecord($record, Logger::ERROR); - } - - public function hasWarning($record) - { - return $this->hasRecord($record, Logger::WARNING); - } - - public function hasNotice($record) - { - return $this->hasRecord($record, Logger::NOTICE); - } - - public function hasInfo($record) - { - return $this->hasRecord($record, Logger::INFO); - } - - public function hasDebug($record) - { - return $this->hasRecord($record, Logger::DEBUG); - } - - public function hasEmergencyRecords() - { - return isset($this->recordsByLevel[Logger::EMERGENCY]); - } - - public function hasAlertRecords() - { - return isset($this->recordsByLevel[Logger::ALERT]); - } - - public function hasCriticalRecords() - { - return isset($this->recordsByLevel[Logger::CRITICAL]); - } - - public function hasErrorRecords() - { - return isset($this->recordsByLevel[Logger::ERROR]); - } - - public function hasWarningRecords() - { - return isset($this->recordsByLevel[Logger::WARNING]); - } - - public function hasNoticeRecords() - { - return isset($this->recordsByLevel[Logger::NOTICE]); - } - - public function hasInfoRecords() - { - return isset($this->recordsByLevel[Logger::INFO]); - } - - public function hasDebugRecords() - { - return isset($this->recordsByLevel[Logger::DEBUG]); - } - - protected function hasRecord($record, $level) - { - if (!isset($this->recordsByLevel[$level])) { - return false; - } - - if (is_array($record)) { - $record = $record['message']; - } - - foreach ($this->recordsByLevel[$level] as $rec) { - if ($rec['message'] === $record) { - return true; - } - } - - return false; - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - $this->recordsByLevel[$record['level']][] = $record; - $this->records[] = $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php deleted file mode 100644 index f22cf21874..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\NormalizerFormatter; -use Monolog\Logger; - -/** - * Handler sending logs to Zend Monitor - * - * @author Christian Bergau - */ -class ZendMonitorHandler extends AbstractProcessingHandler -{ - /** - * Monolog level / ZendMonitor Custom Event priority map - * - * @var array - */ - protected $levelMap = array( - Logger::DEBUG => 1, - Logger::INFO => 2, - Logger::NOTICE => 3, - Logger::WARNING => 4, - Logger::ERROR => 5, - Logger::CRITICAL => 6, - Logger::ALERT => 7, - Logger::EMERGENCY => 0, - ); - - /** - * Construct - * - * @param int $level - * @param bool $bubble - * @throws MissingExtensionException - */ - public function __construct($level = Logger::DEBUG, $bubble = true) - { - if (!function_exists('zend_monitor_custom_event')) { - throw new MissingExtensionException('You must have Zend Server installed in order to use this handler'); - } - parent::__construct($level, $bubble); - } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - $this->writeZendMonitorCustomEvent( - $this->levelMap[$record['level']], - $record['message'], - $record['formatted'] - ); - } - - /** - * Write a record to Zend Monitor - * - * @param int $level - * @param string $message - * @param array $formatted - */ - protected function writeZendMonitorCustomEvent($level, $message, $formatted) - { - zend_monitor_custom_event($level, $message, $formatted); - } - - /** - * {@inheritdoc} - */ - public function getDefaultFormatter() - { - return new NormalizerFormatter(); - } - - /** - * Get the level map - * - * @return array - */ - public function getLevelMap() - { - return $this->levelMap; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Logger.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Logger.php deleted file mode 100644 index 4a74db3512..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Logger.php +++ /dev/null @@ -1,582 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Monolog\Handler\HandlerInterface; -use Monolog\Handler\StreamHandler; -use Psr\Log\LoggerInterface; -use Psr\Log\InvalidArgumentException; - -/** - * Monolog log channel - * - * It contains a stack of Handlers and a stack of Processors, - * and uses them to store records that are added to it. - * - * @author Jordi Boggiano - */ -class Logger implements LoggerInterface -{ - /** - * Detailed debug information - */ - const DEBUG = 100; - - /** - * Interesting events - * - * Examples: User logs in, SQL logs. - */ - const INFO = 200; - - /** - * Uncommon events - */ - const NOTICE = 250; - - /** - * Exceptional occurrences that are not errors - * - * Examples: Use of deprecated APIs, poor use of an API, - * undesirable things that are not necessarily wrong. - */ - const WARNING = 300; - - /** - * Runtime errors - */ - const ERROR = 400; - - /** - * Critical conditions - * - * Example: Application component unavailable, unexpected exception. - */ - const CRITICAL = 500; - - /** - * Action must be taken immediately - * - * Example: Entire website down, database unavailable, etc. - * This should trigger the SMS alerts and wake you up. - */ - const ALERT = 550; - - /** - * Urgent alert. - */ - const EMERGENCY = 600; - - /** - * Monolog API version - * - * This is only bumped when API breaks are done and should - * follow the major version of the library - * - * @var int - */ - const API = 1; - - /** - * Logging levels from syslog protocol defined in RFC 5424 - * - * @var array $levels Logging levels - */ - protected static $levels = array( - 100 => 'DEBUG', - 200 => 'INFO', - 250 => 'NOTICE', - 300 => 'WARNING', - 400 => 'ERROR', - 500 => 'CRITICAL', - 550 => 'ALERT', - 600 => 'EMERGENCY', - ); - - /** - * @var DateTimeZone - */ - protected static $timezone; - - /** - * @var string - */ - protected $name; - - /** - * The handler stack - * - * @var HandlerInterface[] - */ - protected $handlers; - - /** - * Processors that will process all log records - * - * To process records of a single handler instead, add the processor on that specific handler - * - * @var callable[] - */ - protected $processors; - - /** - * @param string $name The logging channel - * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. - * @param callable[] $processors Optional array of processors - */ - public function __construct($name, array $handlers = array(), array $processors = array()) - { - $this->name = $name; - $this->handlers = $handlers; - $this->processors = $processors; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Pushes a handler on to the stack. - * - * @param HandlerInterface $handler - */ - public function pushHandler(HandlerInterface $handler) - { - array_unshift($this->handlers, $handler); - } - - /** - * Pops a handler from the stack - * - * @return HandlerInterface - */ - public function popHandler() - { - if (!$this->handlers) { - throw new \LogicException('You tried to pop from an empty handler stack.'); - } - - return array_shift($this->handlers); - } - - /** - * Adds a processor on to the stack. - * - * @param callable $callback - */ - public function pushProcessor($callback) - { - if (!is_callable($callback)) { - throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), '.var_export($callback, true).' given'); - } - array_unshift($this->processors, $callback); - } - - /** - * Removes the processor on top of the stack and returns it. - * - * @return callable - */ - public function popProcessor() - { - if (!$this->processors) { - throw new \LogicException('You tried to pop from an empty processor stack.'); - } - - return array_shift($this->processors); - } - - /** - * Adds a log record. - * - * @param integer $level The logging level - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addRecord($level, $message, array $context = array()) - { - if (!$this->handlers) { - $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG)); - } - - if (!static::$timezone) { - static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC'); - } - - $record = array( - 'message' => (string) $message, - 'context' => $context, - 'level' => $level, - 'level_name' => static::getLevelName($level), - 'channel' => $this->name, - 'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone)->setTimezone(static::$timezone), - 'extra' => array(), - ); - // check if any handler will handle this message - $handlerKey = null; - foreach ($this->handlers as $key => $handler) { - if ($handler->isHandling($record)) { - $handlerKey = $key; - break; - } - } - // none found - if (null === $handlerKey) { - return false; - } - - // found at least one, process message and dispatch it - foreach ($this->processors as $processor) { - $record = call_user_func($processor, $record); - } - while (isset($this->handlers[$handlerKey]) && - false === $this->handlers[$handlerKey]->handle($record)) { - $handlerKey++; - } - - return true; - } - - /** - * Adds a log record at the DEBUG level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addDebug($message, array $context = array()) - { - return $this->addRecord(static::DEBUG, $message, $context); - } - - /** - * Adds a log record at the INFO level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addInfo($message, array $context = array()) - { - return $this->addRecord(static::INFO, $message, $context); - } - - /** - * Adds a log record at the NOTICE level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addNotice($message, array $context = array()) - { - return $this->addRecord(static::NOTICE, $message, $context); - } - - /** - * Adds a log record at the WARNING level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addWarning($message, array $context = array()) - { - return $this->addRecord(static::WARNING, $message, $context); - } - - /** - * Adds a log record at the ERROR level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addError($message, array $context = array()) - { - return $this->addRecord(static::ERROR, $message, $context); - } - - /** - * Adds a log record at the CRITICAL level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addCritical($message, array $context = array()) - { - return $this->addRecord(static::CRITICAL, $message, $context); - } - - /** - * Adds a log record at the ALERT level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addAlert($message, array $context = array()) - { - return $this->addRecord(static::ALERT, $message, $context); - } - - /** - * Adds a log record at the EMERGENCY level. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function addEmergency($message, array $context = array()) - { - return $this->addRecord(static::EMERGENCY, $message, $context); - } - - /** - * Gets all supported logging levels. - * - * @return array Assoc array with human-readable level names => level codes. - */ - public static function getLevels() - { - return array_flip(static::$levels); - } - - /** - * Gets the name of the logging level. - * - * @param integer $level - * @return string - */ - public static function getLevelName($level) - { - if (!isset(static::$levels[$level])) { - throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); - } - - return static::$levels[$level]; - } - - /** - * Checks whether the Logger has a handler that listens on the given level - * - * @param integer $level - * @return Boolean - */ - public function isHandling($level) - { - $record = array( - 'level' => $level, - ); - - foreach ($this->handlers as $handler) { - if ($handler->isHandling($record)) { - return true; - } - } - - return false; - } - - /** - * Adds a log record at an arbitrary level. - * - * This method allows for compatibility with common interfaces. - * - * @param mixed $level The log level - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function log($level, $message, array $context = array()) - { - if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) { - $level = constant(__CLASS__.'::'.strtoupper($level)); - } - - return $this->addRecord($level, $message, $context); - } - - /** - * Adds a log record at the DEBUG level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function debug($message, array $context = array()) - { - return $this->addRecord(static::DEBUG, $message, $context); - } - - /** - * Adds a log record at the INFO level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function info($message, array $context = array()) - { - return $this->addRecord(static::INFO, $message, $context); - } - - /** - * Adds a log record at the INFO level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function notice($message, array $context = array()) - { - return $this->addRecord(static::NOTICE, $message, $context); - } - - /** - * Adds a log record at the WARNING level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function warn($message, array $context = array()) - { - return $this->addRecord(static::WARNING, $message, $context); - } - - /** - * Adds a log record at the WARNING level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function warning($message, array $context = array()) - { - return $this->addRecord(static::WARNING, $message, $context); - } - - /** - * Adds a log record at the ERROR level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function err($message, array $context = array()) - { - return $this->addRecord(static::ERROR, $message, $context); - } - - /** - * Adds a log record at the ERROR level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function error($message, array $context = array()) - { - return $this->addRecord(static::ERROR, $message, $context); - } - - /** - * Adds a log record at the CRITICAL level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function crit($message, array $context = array()) - { - return $this->addRecord(static::CRITICAL, $message, $context); - } - - /** - * Adds a log record at the CRITICAL level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function critical($message, array $context = array()) - { - return $this->addRecord(static::CRITICAL, $message, $context); - } - - /** - * Adds a log record at the ALERT level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function alert($message, array $context = array()) - { - return $this->addRecord(static::ALERT, $message, $context); - } - - /** - * Adds a log record at the EMERGENCY level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function emerg($message, array $context = array()) - { - return $this->addRecord(static::EMERGENCY, $message, $context); - } - - /** - * Adds a log record at the EMERGENCY level. - * - * This method allows for compatibility with common interfaces. - * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed - */ - public function emergency($message, array $context = array()) - { - return $this->addRecord(static::EMERGENCY, $message, $context); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php deleted file mode 100644 index 96c2abfefc..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\Logger; - -/** - * Injects Git branch and Git commit SHA in all records - * - * @author Nick Otter - * @author Jordi Boggiano - */ -class GitProcessor -{ - private $level; - private static $cache; - - public function __construct($level = Logger::DEBUG) - { - $this->level = $level; - } - - /** - * @param array $record - * @return array - */ - public function __invoke(array $record) - { - // return if the level is not high enough - if ($record['level'] < $this->level) { - return $record; - } - - $record['extra']['git'] = self::getGitInfo(); - - return $record; - } - - private static function getGitInfo() - { - if (self::$cache) { - return self::$cache; - } - - $branches = `git branch -v --no-abbrev`; - if (preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { - return self::$cache = array( - 'branch' => $matches[1], - 'commit' => $matches[2], - ); - } - - return self::$cache = array(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php deleted file mode 100644 index a2c48ce6af..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\Logger; - -/** - * Injects line/file:class/function where the log message came from - * - * Warning: This only works if the handler processes the logs directly. - * If you put the processor on a handler that is behind a FingersCrossedHandler - * for example, the processor will only be called once the trigger level is reached, - * and all the log records will have the same file/line/.. data from the call that - * triggered the FingersCrossedHandler. - * - * @author Jordi Boggiano - */ -class IntrospectionProcessor -{ - private $level; - - private $skipClassesPartials; - - public function __construct($level = Logger::DEBUG, array $skipClassesPartials = array('Monolog\\')) - { - $this->level = $level; - $this->skipClassesPartials = $skipClassesPartials; - } - - /** - * @param array $record - * @return array - */ - public function __invoke(array $record) - { - // return if the level is not high enough - if ($record['level'] < $this->level) { - return $record; - } - - $trace = debug_backtrace(); - - // skip first since it's always the current method - array_shift($trace); - // the call_user_func call is also skipped - array_shift($trace); - - $i = 0; - - while (isset($trace[$i]['class'])) { - foreach ($this->skipClassesPartials as $part) { - if (strpos($trace[$i]['class'], $part) !== false) { - $i++; - continue 2; - } - } - break; - } - - // we should have the call source now - $record['extra'] = array_merge( - $record['extra'], - array( - 'file' => isset($trace[$i-1]['file']) ? $trace[$i-1]['file'] : null, - 'line' => isset($trace[$i-1]['line']) ? $trace[$i-1]['line'] : null, - 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, - 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, - ) - ); - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php deleted file mode 100644 index e48672bf2e..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -/** - * Injects memory_get_peak_usage in all records - * - * @see Monolog\Processor\MemoryProcessor::__construct() for options - * @author Rob Jensen - */ -class MemoryPeakUsageProcessor extends MemoryProcessor -{ - /** - * @param array $record - * @return array - */ - public function __invoke(array $record) - { - $bytes = memory_get_peak_usage($this->realUsage); - $formatted = self::formatBytes($bytes); - - $record['extra'] = array_merge( - $record['extra'], - array( - 'memory_peak_usage' => $formatted, - ) - ); - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php deleted file mode 100644 index 7551043e12..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -/** - * Some methods that are common for all memory processors - * - * @author Rob Jensen - */ -abstract class MemoryProcessor -{ - protected $realUsage; - - /** - * @param boolean $realUsage - */ - public function __construct($realUsage = true) - { - $this->realUsage = (boolean) $realUsage; - } - - /** - * Formats bytes into a human readable string - * - * @param int $bytes - * @return string - */ - protected static function formatBytes($bytes) - { - $bytes = (int) $bytes; - - if ($bytes > 1024*1024) { - return round($bytes/1024/1024, 2).' MB'; - } elseif ($bytes > 1024) { - return round($bytes/1024, 2).' KB'; - } - - return $bytes . ' B'; - } - -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php deleted file mode 100644 index 2c4a8079f0..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -/** - * Injects memory_get_usage in all records - * - * @see Monolog\Processor\MemoryProcessor::__construct() for options - * @author Rob Jensen - */ -class MemoryUsageProcessor extends MemoryProcessor -{ - /** - * @param array $record - * @return array - */ - public function __invoke(array $record) - { - $bytes = memory_get_usage($this->realUsage); - $formatted = self::formatBytes($bytes); - - $record['extra'] = array_merge( - $record['extra'], - array( - 'memory_usage' => $formatted, - ) - ); - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php deleted file mode 100644 index 9d3f5590fd..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -/** - * Adds value of getmypid into records - * - * @author Andreas Hörnicke - */ -class ProcessIdProcessor -{ - /** - * @param array $record - * @return array - */ - public function __invoke(array $record) - { - $record['extra']['process_id'] = getmypid(); - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php deleted file mode 100644 index b63fcccce3..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -/** - * Processes a record's message according to PSR-3 rules - * - * It replaces {foo} with the value from $context['foo'] - * - * @author Jordi Boggiano - */ -class PsrLogMessageProcessor -{ - /** - * @param array $record - * @return array - */ - public function __invoke(array $record) - { - if (false === strpos($record['message'], '{')) { - return $record; - } - - $replacements = array(); - foreach ($record['context'] as $key => $val) { - $replacements['{'.$key.'}'] = $val; - } - - $record['message'] = strtr($record['message'], $replacements); - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php deleted file mode 100644 index 80270d08ad..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -/** - * Adds a unique identifier into records - * - * @author Simon Mönch - */ -class UidProcessor -{ - private $uid; - - public function __construct($length = 7) - { - if (!is_int($length) || $length > 32 || $length < 1) { - throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); - } - - $this->uid = substr(hash('md5', uniqid('', true)), 0, $length); - } - - public function __invoke(array $record) - { - $record['extra']['uid'] = $this->uid; - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php deleted file mode 100644 index 4c2bc191a1..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -/** - * Injects url/method and remote IP of the current web request in all records - * - * @author Jordi Boggiano - */ -class WebProcessor -{ - protected $serverData; - - /** - * @param mixed $serverData array or object w/ ArrayAccess that provides access to the $_SERVER data - */ - public function __construct($serverData = null) - { - if (null === $serverData) { - $this->serverData =& $_SERVER; - } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) { - $this->serverData = $serverData; - } else { - throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); - } - } - - /** - * @param array $record - * @return array - */ - public function __invoke(array $record) - { - // skip processing if for some reason request data - // is not present (CLI or wonky SAPIs) - if (!isset($this->serverData['REQUEST_URI'])) { - return $record; - } - - $record['extra'] = array_merge( - $record['extra'], - array( - 'url' => $this->serverData['REQUEST_URI'], - 'ip' => isset($this->serverData['REMOTE_ADDR']) ? $this->serverData['REMOTE_ADDR'] : null, - 'http_method' => isset($this->serverData['REQUEST_METHOD']) ? $this->serverData['REQUEST_METHOD'] : null, - 'server' => isset($this->serverData['SERVER_NAME']) ? $this->serverData['SERVER_NAME'] : null, - 'referrer' => isset($this->serverData['HTTP_REFERER']) ? $this->serverData['HTTP_REFERER'] : null, - ) - ); - - if (isset($this->serverData['UNIQUE_ID'])) { - $record['extra']['unique_id'] = $this->serverData['UNIQUE_ID']; - } - - return $record; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Registry.php b/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Registry.php deleted file mode 100644 index a3eba0790a..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/src/Monolog/Registry.php +++ /dev/null @@ -1,118 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use InvalidArgumentException; - -/** - * Monolog log registry - * - * Allows to get `Logger` instances in the global scope - * via static method calls on this class. - * - * - * $application = new Monolog\Logger('application'); - * $api = new Monolog\Logger('api'); - * - * Monolog\Registry::addLogger($application); - * Monolog\Registry::addLogger($api); - * - * function testLogger() - * { - * Monolog\Registry::api()->addError('Sent to $api Logger instance'); - * Monolog\Registry::application()->addError('Sent to $application Logger instance'); - * } - * - * - * @author Tomas Tatarko - */ -class Registry -{ - /** - * List of all loggers in the registry (ba named indexes) - * - * @var Logger[] - */ - private static $loggers = array(); - - /** - * Adds new logging channel to the registry - * - * @param Logger $logger Instance of the logging channel - * @param string|null $name Name of the logging channel ($logger->getName() by default) - * @param boolean $overwrite Overwrite instance in the registry if the given name already exists? - * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists - */ - public static function addLogger(Logger $logger, $name = null, $overwrite = false) - { - $name = $name ?: $logger->getName(); - - if (isset(self::$loggers[$name]) && !$overwrite) { - throw new InvalidArgumentException('Logger with the given name already exists'); - } - - self::$loggers[$name] = $logger; - } - - /** - * Removes instance from registry by name or instance - * - * @param string|Logger $logger Name or logger instance - */ - public static function removeLogger($logger) - { - if ($logger instanceof Logger) { - if (false !== ($idx = array_search($logger, self::$loggers, true))) { - unset(self::$loggers[$idx]); - } - } else { - unset(self::$loggers[$logger]); - } - } - - /** - * Clears the registry - */ - public static function clear() - { - self::$loggers = array(); - } - - /** - * Gets Logger instance from the registry - * - * @param string $name Name of the requested Logger instance - * @return Logger Requested instance of Logger - * @throws \InvalidArgumentException If named Logger instance is not in the registry - */ - public static function getInstance($name) - { - if (!isset(self::$loggers[$name])) { - throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); - } - - return self::$loggers[$name]; - } - - /** - * Gets Logger instance from the registry via static method call - * - * @param string $name Name of the requested Logger instance - * @param array $arguments Arguments passed to static method call - * @return Logger Requested instance of Logger - * @throws \InvalidArgumentException If named Logger instance is not in the registry - */ - public static function __callStatic($name, $arguments) - { - return self::getInstance($name); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php deleted file mode 100644 index a9a3f301f8..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Monolog\Handler\TestHandler; - -class ErrorHandlerTest extends \PHPUnit_Framework_TestCase -{ - public function testHandleError() - { - $logger = new Logger('test', array($handler = new TestHandler)); - $errHandler = new ErrorHandler($logger); - - $errHandler->registerErrorHandler(array(E_USER_NOTICE => Logger::EMERGENCY), false); - trigger_error('Foo', E_USER_ERROR); - $this->assertCount(1, $handler->getRecords()); - $this->assertTrue($handler->hasErrorRecords()); - trigger_error('Foo', E_USER_NOTICE); - $this->assertCount(2, $handler->getRecords()); - $this->assertTrue($handler->hasEmergencyRecords()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php deleted file mode 100644 index e7f7334e2c..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -class ChromePHPFormatterTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Formatter\ChromePHPFormatter::format - */ - public function testDefaultFormat() - { - $formatter = new ChromePHPFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1'), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertEquals( - array( - 'meh', - array( - 'message' => 'log', - 'context' => array('from' => 'logger'), - 'extra' => array('ip' => '127.0.0.1'), - ), - 'unknown', - 'error' - ), - $message - ); - } - - /** - * @covers Monolog\Formatter\ChromePHPFormatter::format - */ - public function testFormatWithFileAndLine() - { - $formatter = new ChromePHPFormatter(); - $record = array( - 'level' => Logger::CRITICAL, - 'level_name' => 'CRITICAL', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertEquals( - array( - 'meh', - array( - 'message' => 'log', - 'context' => array('from' => 'logger'), - 'extra' => array('ip' => '127.0.0.1'), - ), - 'test : 14', - 'error' - ), - $message - ); - } - - /** - * @covers Monolog\Formatter\ChromePHPFormatter::format - */ - public function testFormatWithoutContext() - { - $formatter = new ChromePHPFormatter(); - $record = array( - 'level' => Logger::DEBUG, - 'level_name' => 'DEBUG', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertEquals( - array( - 'meh', - 'log', - 'unknown', - 'log' - ), - $message - ); - } - - /** - * @covers Monolog\Formatter\ChromePHPFormatter::formatBatch - */ - public function testBatchFormatThrowException() - { - $formatter = new ChromePHPFormatter(); - $records = array( - array( - 'level' => Logger::INFO, - 'level_name' => 'INFO', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ), - array( - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'foo', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log2', - ), - ); - - $this->assertEquals( - array( - array( - 'meh', - 'log', - 'unknown', - 'info' - ), - array( - 'foo', - 'log2', - 'unknown', - 'warn' - ), - ), - $formatter->formatBatch($records) - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php deleted file mode 100644 index 59f159f06d..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Monolog\Formatter\ElasticaFormatter; - -class ElasticaFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function setUp() - { - if (!class_exists("Elastica\Document")) { - $this->markTestSkipped("ruflin/elastica not installed"); - } - } - - /** - * @covers Monolog\Formatter\ElasticaFormatter::__construct - * @covers Monolog\Formatter\ElasticaFormatter::format - * @covers Monolog\Formatter\ElasticaFormatter::getDocument - */ - public function testFormat() - { - // test log message - $msg = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - // expected values - $expected = $msg; - $expected['datetime'] = '1970-01-01T00:00:00+0000'; - $expected['context'] = array( - 'class' => '[object] (stdClass: {})', - 'foo' => 7, - 0 => 'bar', - ); - - // format log message - $formatter = new ElasticaFormatter('my_index', 'doc_type'); - $doc = $formatter->format($msg); - $this->assertInstanceOf('Elastica\Document', $doc); - - // Document parameters - $params = $doc->getParams(); - $this->assertEquals('my_index', $params['_index']); - $this->assertEquals('doc_type', $params['_type']); - - // Document data values - $data = $doc->getData(); - foreach (array_keys($expected) as $key) { - $this->assertEquals($expected[$key], $data[$key]); - } - } - - /** - * @covers Monolog\Formatter\ElasticaFormatter::getIndex - * @covers Monolog\Formatter\ElasticaFormatter::getType - */ - public function testGetters() - { - $formatter = new ElasticaFormatter('my_index', 'doc_type'); - $this->assertEquals('my_index', $formatter->getIndex()); - $this->assertEquals('doc_type', $formatter->getType()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php deleted file mode 100644 index d8867d9f10..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php +++ /dev/null @@ -1,187 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Monolog\Formatter\GelfMessageFormatter; - -class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function setUp() - { - if (!class_exists("Gelf\Message")) { - $this->markTestSkipped("mlehner/gelf-php not installed"); - } - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testDefaultFormatter() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - $this->assertEquals(0, $message->getTimestamp()); - $this->assertEquals('log', $message->getShortMessage()); - $this->assertEquals('meh', $message->getFacility()); - $this->assertEquals(null, $message->getLine()); - $this->assertEquals(null, $message->getFile()); - $this->assertEquals(3, $message->getLevel()); - $this->assertNotEmpty($message->getHost()); - - $formatter = new GelfMessageFormatter('mysystem'); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - $this->assertEquals('mysystem', $message->getHost()); - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithFileAndLine() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - $this->assertEquals('test', $message->getFile()); - $this->assertEquals(14, $message->getLine()); - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithContext() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_ctxt_from', $message_array); - $this->assertEquals('logger', $message_array['_ctxt_from']); - - // Test with extraPrefix - $formatter = new GelfMessageFormatter(null, null, 'CTX'); - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_CTXfrom', $message_array); - $this->assertEquals('logger', $message_array['_CTXfrom']); - - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithContextContainingException() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger', 'exception' => array( - 'class' => '\Exception', - 'file' => '/some/file/in/dir.php:56', - 'trace' => array('/some/file/1.php:23', '/some/file/2.php:3') - )), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log' - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $this->assertEquals("/some/file/in/dir.php", $message->getFile()); - $this->assertEquals("56", $message->getLine()); - - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithExtra() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_key', $message_array); - $this->assertEquals('pair', $message_array['_key']); - - // Test with extraPrefix - $formatter = new GelfMessageFormatter(null, 'EXT'); - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_EXTkey', $message_array); - $this->assertEquals('pair', $message_array['_EXTkey']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php deleted file mode 100644 index ba6152c943..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Monolog\TestCase; - -class JsonFormatterTest extends TestCase -{ - /** - * @covers Monolog\Formatter\JsonFormatter::format - */ - public function testFormat() - { - $formatter = new JsonFormatter(); - $record = $this->getRecord(); - $this->assertEquals(json_encode($record), $formatter->format($record)); - } - - /** - * @covers Monolog\Formatter\JsonFormatter::formatBatch - */ - public function testFormatBatch() - { - $formatter = new JsonFormatter(); - $records = array( - $this->getRecord(Logger::WARNING), - $this->getRecord(Logger::DEBUG), - ); - $this->assertEquals(json_encode($records), $formatter->formatBatch($records)); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php deleted file mode 100644 index 7d7643a793..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php +++ /dev/null @@ -1,166 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * @covers Monolog\Formatter\LineFormatter - */ -class LineFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function testDefFormatWithString() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'context' => array(), - 'message' => 'foo', - 'datetime' => new \DateTime, - 'extra' => array(), - )); - $this->assertEquals('['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message); - } - - public function testDefFormatWithArrayContext() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'message' => 'foo', - 'datetime' => new \DateTime, - 'extra' => array(), - 'context' => array( - 'foo' => 'bar', - 'baz' => 'qux', - 'bool' => false, - 'null' => null, - ) - )); - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foo {"foo":"bar","baz":"qux","bool":false,"null":null} []'."\n", $message); - } - - public function testDefFormatExtras() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array('ip' => '127.0.0.1'), - 'message' => 'log', - )); - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] {"ip":"127.0.0.1"}'."\n", $message); - } - - public function testFormatExtras() - { - $formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra.file% %extra%\n", 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array('ip' => '127.0.0.1', 'file' => 'test'), - 'message' => 'log', - )); - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] test {"ip":"127.0.0.1"}'."\n", $message); - } - - public function testDefFormatWithObject() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array('foo' => new TestFoo, 'bar' => new TestBar, 'baz' => array(), 'res' => fopen('php://memory', 'rb')), - 'message' => 'foobar', - )); - - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foobar [] {"foo":"[object] (Monolog\\\\Formatter\\\\TestFoo: {\\"foo\\":\\"foo\\"})","bar":"[object] (Monolog\\\\Formatter\\\\TestBar: {})","baz":[],"res":"[resource]"}'."\n", $message); - } - - public function testDefFormatWithException() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'CRITICAL', - 'channel' => 'core', - 'context' => array('exception' => new \RuntimeException('Foo')), - 'datetime' => new \DateTime, - 'extra' => array(), - 'message' => 'foobar', - )); - - $path = str_replace('\\/', '/', json_encode(__FILE__)); - - $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException: Foo at '.substr($path, 1, -1).':'.(__LINE__-8).')"} []'."\n", $message); - } - - public function testDefFormatWithPreviousException() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $previous = new \LogicException('Wut?'); - $message = $formatter->format(array( - 'level_name' => 'CRITICAL', - 'channel' => 'core', - 'context' => array('exception' => new \RuntimeException('Foo', 0, $previous)), - 'datetime' => new \DateTime, - 'extra' => array(), - 'message' => 'foobar', - )); - - $path = str_replace('\\/', '/', json_encode(__FILE__)); - - $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException: Foo at '.substr($path, 1, -1).':'.(__LINE__-8).', LogicException: Wut? at '.substr($path, 1, -1).':'.(__LINE__-12).')"} []'."\n", $message); - } - - public function testBatchFormat() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->formatBatch(array( - array( - 'level_name' => 'CRITICAL', - 'channel' => 'test', - 'message' => 'bar', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'message' => 'foo', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - )); - $this->assertEquals('['.date('Y-m-d').'] test.CRITICAL: bar [] []'."\n".'['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message); - } -} - -class TestFoo -{ - public $foo = 'foo'; -} - -class TestBar -{ - public function __toString() - { - return 'bar'; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php deleted file mode 100644 index b02a098809..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php +++ /dev/null @@ -1,293 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Monolog\Formatter\LogstashFormatter; - -class LogstashFormatterTest extends \PHPUnit_Framework_TestCase -{ - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testDefaultFormatter() - { - $formatter = new LogstashFormatter('test', 'hostname'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); - $this->assertEquals('log', $message['@message']); - $this->assertEquals('meh', $message['@fields']['channel']); - $this->assertContains('meh', $message['@tags']); - $this->assertEquals(Logger::ERROR, $message['@fields']['level']); - $this->assertEquals('test', $message['@type']); - $this->assertEquals('hostname', $message['@source']); - - $formatter = new LogstashFormatter('mysystem'); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('mysystem', $message['@type']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithFileAndLine() - { - $formatter = new LogstashFormatter('test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('test', $message['@fields']['file']); - $this->assertEquals(14, $message['@fields']['line']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithContext() - { - $formatter = new LogstashFormatter('test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('ctxt_from', $message_array); - $this->assertEquals('logger', $message_array['ctxt_from']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, null, 'CTX'); - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('CTXfrom', $message_array); - $this->assertEquals('logger', $message_array['CTXfrom']); - - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithExtra() - { - $formatter = new LogstashFormatter('test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('key', $message_array); - $this->assertEquals('pair', $message_array['key']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, 'EXT'); - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('EXTkey', $message_array); - $this->assertEquals('pair', $message_array['EXTkey']); - } - - public function testFormatWithApplicationName() - { - $formatter = new LogstashFormatter('app', 'test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('@type', $message); - $this->assertEquals('app', $message['@type']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testDefaultFormatterV1() - { - $formatter = new LogstashFormatter('test', 'hostname', null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); - $this->assertEquals("1", $message['@version']); - $this->assertEquals('log', $message['message']); - $this->assertEquals('meh', $message['channel']); - $this->assertEquals('ERROR', $message['level']); - $this->assertEquals('test', $message['type']); - $this->assertEquals('hostname', $message['host']); - - $formatter = new LogstashFormatter('mysystem', null, null, 'ctxt_', LogstashFormatter::V1); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('mysystem', $message['type']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithFileAndLineV1() - { - $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('test', $message['file']); - $this->assertEquals(14, $message['line']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithContextV1() - { - $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('ctxt_from', $message); - $this->assertEquals('logger', $message['ctxt_from']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, null, 'CTX', LogstashFormatter::V1); - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('CTXfrom', $message); - $this->assertEquals('logger', $message['CTXfrom']); - - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithExtraV1() - { - $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('key', $message); - $this->assertEquals('pair', $message['key']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, 'EXT', 'ctxt_', LogstashFormatter::V1); - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('EXTkey', $message); - $this->assertEquals('pair', $message['EXTkey']); - } - - public function testFormatWithApplicationNameV1() - { - $formatter = new LogstashFormatter('app', 'test', null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log' - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('type', $message); - $this->assertEquals('app', $message['type']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php deleted file mode 100644 index 7477871284..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php +++ /dev/null @@ -1,182 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * @covers Monolog\Formatter\NormalizerFormatter - */ -class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function testFormat() - { - $formatter = new NormalizerFormatter('Y-m-d'); - $formatted = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'message' => 'foo', - 'datetime' => new \DateTime, - 'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')), - 'context' => array( - 'foo' => 'bar', - 'baz' => 'qux', - ), - )); - - $this->assertEquals(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'message' => 'foo', - 'datetime' => date('Y-m-d'), - 'extra' => array( - 'foo' => '[object] (Monolog\\Formatter\\TestFooNorm: {"foo":"foo"})', - 'bar' => '[object] (Monolog\\Formatter\\TestBarNorm: {})', - 'baz' => array(), - 'res' => '[resource]', - ), - 'context' => array( - 'foo' => 'bar', - 'baz' => 'qux', - ) - ), $formatted); - } - - public function testFormatExceptions() - { - $formatter = new NormalizerFormatter('Y-m-d'); - $e = new \LogicException('bar'); - $e2 = new \RuntimeException('foo', 0, $e); - $formatted = $formatter->format(array( - 'exception' => $e2, - )); - - $this->assertGreaterThan(5, count($formatted['exception']['trace'])); - $this->assertTrue(isset($formatted['exception']['previous'])); - unset($formatted['exception']['trace'], $formatted['exception']['previous']); - - $this->assertEquals(array( - 'exception' => array( - 'class' => get_class($e2), - 'message' => $e2->getMessage(), - 'file' => $e2->getFile().':'.$e2->getLine(), - ) - ), $formatted); - } - - public function testBatchFormat() - { - $formatter = new NormalizerFormatter('Y-m-d'); - $formatted = $formatter->formatBatch(array( - array( - 'level_name' => 'CRITICAL', - 'channel' => 'test', - 'message' => 'bar', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'message' => 'foo', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - )); - $this->assertEquals(array( - array( - 'level_name' => 'CRITICAL', - 'channel' => 'test', - 'message' => 'bar', - 'context' => array(), - 'datetime' => date('Y-m-d'), - 'extra' => array(), - ), - array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'message' => 'foo', - 'context' => array(), - 'datetime' => date('Y-m-d'), - 'extra' => array(), - ), - ), $formatted); - } - - /** - * Test issue #137 - */ - public function testIgnoresRecursiveObjectReferences() - { - // set up the recursion - $foo = new \stdClass(); - $bar = new \stdClass(); - - $foo->bar = $bar; - $bar->foo = $foo; - - // set an error handler to assert that the error is not raised anymore - $that = $this; - set_error_handler(function ($level, $message, $file, $line, $context) use ($that) { - if (error_reporting() & $level) { - restore_error_handler(); - $that->fail("$message should not be raised"); - } - }); - - $formatter = new NormalizerFormatter(); - $reflMethod = new \ReflectionMethod($formatter, 'toJson'); - $reflMethod->setAccessible(true); - $res = $reflMethod->invoke($formatter, array($foo, $bar), true); - - restore_error_handler(); - - $this->assertEquals(@json_encode(array($foo, $bar)), $res); - } - - public function testIgnoresInvalidTypes() - { - // set up the recursion - $resource = fopen(__FILE__, 'r'); - - // set an error handler to assert that the error is not raised anymore - $that = $this; - set_error_handler(function ($level, $message, $file, $line, $context) use ($that) { - if (error_reporting() & $level) { - restore_error_handler(); - $that->fail("$message should not be raised"); - } - }); - - $formatter = new NormalizerFormatter(); - $reflMethod = new \ReflectionMethod($formatter, 'toJson'); - $reflMethod->setAccessible(true); - $res = $reflMethod->invoke($formatter, array($resource), true); - - restore_error_handler(); - - $this->assertEquals(@json_encode(array($resource)), $res); - } -} - -class TestFooNorm -{ - public $foo = 'foo'; -} - -class TestBarNorm -{ - public function __toString() - { - return 'bar'; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php deleted file mode 100644 index 6320c89e25..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php +++ /dev/null @@ -1,97 +0,0 @@ -formatter = new ScalarFormatter(); - } - - public function buildTrace(\Exception $e) - { - $data = array(); - $trace = $e->getTrace(); - array_shift($trace); - foreach ($trace as $frame) { - if (isset($frame['file'])) { - $data[] = $frame['file'].':'.$frame['line']; - } else { - $data[] = json_encode($frame); - } - } - - return $data; - } - - public function encodeJson($data) - { - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - return json_encode($data); - } - - public function testFormat() - { - $exception = new \Exception('foo'); - $formatted = $this->formatter->format(array( - 'foo' => 'string', - 'bar' => 1, - 'baz' => false, - 'bam' => array(1,2,3), - 'bat' => array('foo' => 'bar'), - 'bap' => \DateTime::createFromFormat(\DateTime::ISO8601, '1970-01-01T00:00:00+0000'), - 'ban' => $exception - )); - - $this->assertSame(array( - 'foo' => 'string', - 'bar' => 1, - 'baz' => false, - 'bam' => $this->encodeJson(array(1,2,3)), - 'bat' => $this->encodeJson(array('foo' => 'bar')), - 'bap' => '1970-01-01 00:00:00', - 'ban' => $this->encodeJson(array( - 'class' => get_class($exception), - 'message' => $exception->getMessage(), - 'file' => $exception->getFile() . ':' . $exception->getLine(), - 'trace' => $this->buildTrace($exception) - )) - ), $formatted); - } - - public function testFormatWithErrorContext() - { - $context = array('file' => 'foo', 'line' => 1); - $formatted = $this->formatter->format(array( - 'context' => $context - )); - - $this->assertSame(array( - 'context' => $this->encodeJson($context) - ), $formatted); - } - - public function testFormatWithExceptionContext() - { - $exception = new \Exception('foo'); - $formatted = $this->formatter->format(array( - 'context' => array( - 'exception' => $exception - ) - )); - - $this->assertSame(array( - 'context' => $this->encodeJson(array( - 'exception' => array( - 'class' => get_class($exception), - 'message' => $exception->getMessage(), - 'file' => $exception->getFile() . ':' . $exception->getLine(), - 'trace' => $this->buildTrace($exception) - ) - )) - ), $formatted); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php deleted file mode 100644 index 0b07e330fd..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -class WildfireFormatterTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Formatter\WildfireFormatter::format - */ - public function testDefaultFormat() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1'), - 'message' => 'log', - ); - - $message = $wildfire->format($record); - - $this->assertEquals( - '125|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},' - .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|', - $message - ); - } - - /** - * @covers Monolog\Formatter\WildfireFormatter::format - */ - public function testFormatWithFileAndLine() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = $wildfire->format($record); - - $this->assertEquals( - '129|[{"Type":"ERROR","File":"test","Line":14,"Label":"meh"},' - .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|', - $message - ); - } - - /** - * @covers Monolog\Formatter\WildfireFormatter::format - */ - public function testFormatWithoutContext() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = $wildfire->format($record); - - $this->assertEquals( - '58|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},"log"]|', - $message - ); - } - - /** - * @covers Monolog\Formatter\WildfireFormatter::formatBatch - * @expectedException BadMethodCallException - */ - public function testBatchFormatThrowException() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $wildfire->formatBatch(array($record)); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Functional/Handler/FirePHPHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Functional/Handler/FirePHPHandlerTest.php deleted file mode 100644 index 65b530970e..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Functional/Handler/FirePHPHandlerTest.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -spl_autoload_register(function($class) { - $file = __DIR__.'/../../../../src/'.strtr($class, '\\', '/').'.php'; - if (file_exists($file)) { - require $file; - - return true; - } -}); - -use Monolog\Logger; -use Monolog\Handler\FirePHPHandler; -use Monolog\Handler\ChromePHPHandler; - -$logger = new Logger('firephp'); -$logger->pushHandler(new FirePHPHandler); -$logger->pushHandler(new ChromePHPHandler()); - -$logger->addDebug('Debug'); -$logger->addInfo('Info'); -$logger->addWarning('Warning'); -$logger->addError('Error'); diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php deleted file mode 100644 index 01d522fa41..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php +++ /dev/null @@ -1,104 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; -use Monolog\Processor\WebProcessor; - -class AbstractHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\AbstractHandler::__construct - * @covers Monolog\Handler\AbstractHandler::getLevel - * @covers Monolog\Handler\AbstractHandler::setLevel - * @covers Monolog\Handler\AbstractHandler::getBubble - * @covers Monolog\Handler\AbstractHandler::setBubble - * @covers Monolog\Handler\AbstractHandler::getFormatter - * @covers Monolog\Handler\AbstractHandler::setFormatter - */ - public function testConstructAndGetSet() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false)); - $this->assertEquals(Logger::WARNING, $handler->getLevel()); - $this->assertEquals(false, $handler->getBubble()); - - $handler->setLevel(Logger::ERROR); - $handler->setBubble(true); - $handler->setFormatter($formatter = new LineFormatter); - $this->assertEquals(Logger::ERROR, $handler->getLevel()); - $this->assertEquals(true, $handler->getBubble()); - $this->assertSame($formatter, $handler->getFormatter()); - } - - /** - * @covers Monolog\Handler\AbstractHandler::handleBatch - */ - public function testHandleBatch() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - $handler->expects($this->exactly(2)) - ->method('handle'); - $handler->handleBatch(array($this->getRecord(), $this->getRecord())); - } - - /** - * @covers Monolog\Handler\AbstractHandler::isHandling - */ - public function testIsHandling() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false)); - $this->assertTrue($handler->isHandling($this->getRecord())); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\AbstractHandler::getFormatter - * @covers Monolog\Handler\AbstractHandler::getDefaultFormatter - */ - public function testGetFormatterInitializesDefault() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - $this->assertInstanceOf('Monolog\Formatter\LineFormatter', $handler->getFormatter()); - } - - /** - * @covers Monolog\Handler\AbstractHandler::pushProcessor - * @covers Monolog\Handler\AbstractHandler::popProcessor - * @expectedException LogicException - */ - public function testPushPopProcessor() - { - $logger = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - $processor1 = new WebProcessor; - $processor2 = new WebProcessor; - - $logger->pushProcessor($processor1); - $logger->pushProcessor($processor2); - - $this->assertEquals($processor2, $logger->popProcessor()); - $this->assertEquals($processor1, $logger->popProcessor()); - $logger->popProcessor(); - } - - /** - * @covers Monolog\Handler\AbstractHandler::pushProcessor - * @expectedException InvalidArgumentException - */ - public function testPushProcessorWithNonCallable() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - - $handler->pushProcessor(new \stdClass()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php deleted file mode 100644 index 96871d3ee8..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Processor\WebProcessor; - -class AbstractProcessingHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleLowerLevelMessage() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, true)); - $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleBubbling() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, true)); - $this->assertFalse($handler->handle($this->getRecord())); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleNotBubbling() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, false)); - $this->assertTrue($handler->handle($this->getRecord())); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleIsFalseWhenNotHandled() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, false)); - $this->assertTrue($handler->handle($this->getRecord())); - $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::processRecord - */ - public function testProcessRecord() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler'); - $handler->pushProcessor(new WebProcessor(array( - 'REQUEST_URI' => '', - 'REQUEST_METHOD' => '', - 'REMOTE_ADDR' => '', - 'SERVER_NAME' => '', - 'UNIQUE_ID' => '', - ))); - $handledRecord = null; - $handler->expects($this->once()) - ->method('write') - ->will($this->returnCallback(function($record) use (&$handledRecord) { - $handledRecord = $record; - })) - ; - $handler->handle($this->getRecord()); - $this->assertEquals(6, count($handledRecord['extra'])); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php deleted file mode 100644 index 249f2b72cb..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\RotatingFileHandler - */ -class AmqpHandlerTest extends TestCase -{ - public function setUp() - { - if (!class_exists('AMQPConnection') || !class_exists('AMQPExchange')) { - $this->markTestSkipped("amqp-php not installed"); - } - - if (!class_exists('AMQPChannel')) { - $this->markTestSkipped("Please update AMQP to version >= 1.0"); - } - } - - public function testHandle() - { - $messages = array(); - - $exchange = $this->getMock('AMQPExchange', array('publish', 'setName'), array(), '', false); - $exchange->expects($this->once()) - ->method('setName') - ->with('log') - ; - $exchange->expects($this->any()) - ->method('publish') - ->will($this->returnCallback(function ($message, $routing_key, $flags = 0, $attributes = array()) use (&$messages) { - $messages[] = array($message, $routing_key, $flags, $attributes); - })) - ; - - $handler = new AmqpHandler($exchange, 'log'); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - array( - 'message' => 'test', - 'context' => array( - 'data' => array(), - 'foo' => 34, - ), - 'level' => 300, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'extra' => array(), - ), - 'warn.test', - 0, - array( - 'delivery_mode' => 2, - 'Content-type' => 'application/json' - ) - ); - - $handler->handle($record); - - $this->assertCount(1, $messages); - $messages[0][0] = json_decode($messages[0][0], true); - unset($messages[0][0]['datetime']); - $this->assertEquals($expected, $messages[0]); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php deleted file mode 100644 index beb08cf8a0..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php +++ /dev/null @@ -1,149 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class BufferHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\BufferHandler::__construct - * @covers Monolog\Handler\BufferHandler::handle - * @covers Monolog\Handler\BufferHandler::close - */ - public function testHandleBuffers() - { - $test = new TestHandler(); - $handler = new BufferHandler($test); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - $handler->close(); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - - /** - * @covers Monolog\Handler\BufferHandler::close - * @covers Monolog\Handler\BufferHandler::flush - */ - public function testDestructPropagatesRecords() - { - $test = new TestHandler(); - $handler = new BufferHandler($test); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->__destruct(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleBufferLimit() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 2); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->close(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertFalse($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleBufferLimitWithFlushOnOverflow() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 3, Logger::DEBUG, true, true); - - // send two records - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertCount(0, $test->getRecords()); - - // overflow - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertTrue($test->hasDebugRecords()); - $this->assertCount(3, $test->getRecords()); - - // should buffer again - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertCount(3, $test->getRecords()); - - $handler->close(); - $this->assertCount(5, $test->getRecords()); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleLevel() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 0, Logger::INFO); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->close(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertFalse($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::flush - */ - public function testFlush() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 0); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->flush(); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue($test->hasDebugRecords()); - $this->assertFalse($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new BufferHandler($test); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->flush(); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php deleted file mode 100644 index 9fa4d50682..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\ChromePHPHandler - */ -class ChromePHPHandlerTest extends TestCase -{ - protected function setUp() - { - TestChromePHPHandler::reset(); - } - - public function testHeaders() - { - $handler = new TestChromePHPHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( - 'version' => ChromePHPHandler::VERSION, - 'columns' => array('label', 'log', 'backtrace', 'type'), - 'rows' => array( - 'test', - 'test', - ), - 'request_uri' => '', - )))) - ); - - $this->assertEquals($expected, $handler->getHeaders()); - } - - public function testHeadersOverflow() - { - $handler = new TestChromePHPHandler(); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 150*1024))); - - // overflow chrome headers limit - $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 100*1024))); - - $expected = array( - 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( - 'version' => ChromePHPHandler::VERSION, - 'columns' => array('label', 'log', 'backtrace', 'type'), - 'rows' => array( - array( - 'test', - 'test', - 'unknown', - 'log', - ), - array( - 'test', - str_repeat('a', 150*1024), - 'unknown', - 'warn', - ), - array( - 'monolog', - 'Incomplete logs, chrome header size limit reached', - 'unknown', - 'warn', - ), - ), - 'request_uri' => '', - )))) - ); - - $this->assertEquals($expected, $handler->getHeaders()); - } - - public function testConcurrentHandlers() - { - $handler = new TestChromePHPHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $handler2 = new TestChromePHPHandler(); - $handler2->setFormatter($this->getIdentityFormatter()); - $handler2->handle($this->getRecord(Logger::DEBUG)); - $handler2->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( - 'version' => ChromePHPHandler::VERSION, - 'columns' => array('label', 'log', 'backtrace', 'type'), - 'rows' => array( - 'test', - 'test', - 'test', - 'test', - ), - 'request_uri' => '', - )))) - ); - - $this->assertEquals($expected, $handler2->getHeaders()); - } -} - -class TestChromePHPHandler extends ChromePHPHandler -{ - protected $headers = array(); - - public static function reset() - { - self::$initialized = false; - self::$overflowed = false; - self::$json['rows'] = array(); - } - - protected function sendHeader($header, $content) - { - $this->headers[$header] = $content; - } - - public function getHeaders() - { - return $this->headers; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php deleted file mode 100644 index 78a1d15cdc..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class CouchDBHandlerTest extends TestCase -{ - public function testHandle() - { - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - 'message' => 'test', - 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), - 'extra' => array(), - ); - - $handler = new CouchDBHandler(); - - try { - $handler->handle($record); - } catch (\RuntimeException $e) { - $this->markTestSkipped('Could not connect to couchdb server on http://localhost:5984'); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php deleted file mode 100644 index d67da90aec..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class DoctrineCouchDBHandlerTest extends TestCase -{ - protected function setup() - { - if (!class_exists('Doctrine\CouchDB\CouchDBClient')) { - $this->markTestSkipped('The "doctrine/couchdb" package is not installed'); - } - } - - public function testHandle() - { - $client = $this->getMockBuilder('Doctrine\\CouchDB\\CouchDBClient') - ->setMethods(array('postDocument')) - ->disableOriginalConstructor() - ->getMock(); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - 'message' => 'test', - 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), - 'extra' => array(), - ); - - $client->expects($this->once()) - ->method('postDocument') - ->with($expected); - - $handler = new DoctrineCouchDBHandler($client); - $handler->handle($record); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php deleted file mode 100644 index a38a8cb771..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -class DynamoDbHandlerTest extends TestCase -{ - public function setUp() - { - if (!class_exists('Aws\DynamoDb\DynamoDbClient')) { - $this->markTestSkipped('aws/aws-sdk-php not installed'); - } - - $this->client = $this->getMockBuilder('Aws\DynamoDb\DynamoDbClient') - ->setMethods(array('formatAttributes', '__call')) - ->disableOriginalConstructor()->getMock(); - } - - public function testConstruct() - { - $this->assertInstanceOf('Monolog\Handler\DynamoDbHandler', new DynamoDbHandler($this->client, 'foo')); - } - - public function testInterface() - { - $this->assertInstanceOf('Monolog\Handler\HandlerInterface', new DynamoDbHandler($this->client, 'foo')); - } - - public function testGetFormatter() - { - $handler = new DynamoDbHandler($this->client, 'foo'); - $this->assertInstanceOf('Monolog\Formatter\ScalarFormatter', $handler->getFormatter()); - } - - public function testHandle() - { - $record = $this->getRecord(); - $formatter = $this->getMock('Monolog\Formatter\FormatterInterface'); - $formatted = array('foo' => 1, 'bar' => 2); - $handler = new DynamoDbHandler($this->client, 'foo'); - $handler->setFormatter($formatter); - - $formatter - ->expects($this->once()) - ->method('format') - ->with($record) - ->will($this->returnValue($formatted)); - $this->client - ->expects($this->once()) - ->method('formatAttributes') - ->with($this->isType('array')) - ->will($this->returnValue($formatted)); - $this->client - ->expects($this->once()) - ->method('__call') - ->with('putItem', array(array( - 'TableName' => 'foo', - 'Item' => $formatted - ))); - - $handler->handle($record); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php deleted file mode 100644 index 65c587aefb..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php +++ /dev/null @@ -1,239 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Handler\ElasticSearchHandler; -use Monolog\Formatter\ElasticaFormatter; -use Monolog\Formatter\NormalizerFormatter; -use Monolog\TestCase; -use Monolog\Logger; -use Elastica\Client; -use Elastica\Request; -use Elastica\Response; - -class ElasticSearchHandlerTest extends TestCase -{ - /** - * @var Client mock - */ - protected $client; - - /** - * @var array Default handler options - */ - protected $options = array( - 'index' => 'my_index', - 'type' => 'doc_type', - ); - - public function setUp() - { - // Elastica lib required - if (!class_exists("Elastica\Client")) { - $this->markTestSkipped("ruflin/elastica not installed"); - } - - // base mock Elastica Client object - $this->client = $this->getMockBuilder('Elastica\Client') - ->setMethods(array('addDocuments')) - ->disableOriginalConstructor() - ->getMock(); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::write - * @covers Monolog\Handler\ElasticSearchHandler::handleBatch - * @covers Monolog\Handler\ElasticSearchHandler::bulkSend - * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter - */ - public function testHandle() - { - // log message - $msg = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - // format expected result - $formatter = new ElasticaFormatter($this->options['index'], $this->options['type']); - $expected = array($formatter->format($msg)); - - // setup ES client mock - $this->client->expects($this->any()) - ->method('addDocuments') - ->with($expected); - - // perform tests - $handler = new ElasticSearchHandler($this->client, $this->options); - $handler->handle($msg); - $handler->handleBatch(array($msg)); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::setFormatter - */ - public function testSetFormatter() - { - $handler = new ElasticSearchHandler($this->client); - $formatter = new ElasticaFormatter('index_new', 'type_new'); - $handler->setFormatter($formatter); - $this->assertInstanceOf('Monolog\Formatter\ElasticaFormatter', $handler->getFormatter()); - $this->assertEquals('index_new', $handler->getFormatter()->getIndex()); - $this->assertEquals('type_new', $handler->getFormatter()->getType()); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::setFormatter - * @expectedException InvalidArgumentException - * @expectedExceptionMessage ElasticSearchHandler is only compatible with ElasticaFormatter - */ - public function testSetFormatterInvalid() - { - $handler = new ElasticSearchHandler($this->client); - $formatter = new NormalizerFormatter(); - $handler->setFormatter($formatter); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::__construct - * @covers Monolog\Handler\ElasticSearchHandler::getOptions - */ - public function testOptions() - { - $expected = array( - 'index' => $this->options['index'], - 'type' => $this->options['type'], - 'ignore_error' => false, - ); - $handler = new ElasticSearchHandler($this->client, $this->options); - $this->assertEquals($expected, $handler->getOptions()); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::bulkSend - * @dataProvider providerTestConnectionErrors - */ - public function testConnectionErrors($ignore, $expectedError) - { - $clientOpts = array('host' => '127.0.0.1', 'port' => 1); - $client = new Client($clientOpts); - $handlerOpts = array('ignore_error' => $ignore); - $handler = new ElasticSearchHandler($client, $handlerOpts); - - if ($expectedError) { - $this->setExpectedException($expectedError[0], $expectedError[1]); - $handler->handle($this->getRecord()); - } else { - $this->assertFalse($handler->handle($this->getRecord())); - } - } - - /** - * @return array - */ - public function providerTestConnectionErrors() - { - return array( - array(false, array('RuntimeException', 'Error sending messages to Elasticsearch')), - array(true, false), - ); - } - - /** - * Integration test using localhost Elastic Search server - * - * @covers Monolog\Handler\ElasticSearchHandler::__construct - * @covers Monolog\Handler\ElasticSearchHandler::handleBatch - * @covers Monolog\Handler\ElasticSearchHandler::bulkSend - * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter - */ - public function testHandleIntegration() - { - $msg = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $expected = $msg; - $expected['datetime'] = $msg['datetime']->format(\DateTime::ISO8601); - $expected['context'] = array( - 'class' => '[object] (stdClass: {})', - 'foo' => 7, - 0 => 'bar', - ); - - $client = new Client(); - $handler = new ElasticSearchHandler($client, $this->options); - try { - $handler->handleBatch(array($msg)); - } catch(\RuntimeException $e) { - $this->markTestSkipped("Cannot connect to Elastic Search server on localhost"); - } - - // check document id from ES server response - $documentId = $this->getCreatedDocId($client->getLastResponse()); - $this->assertNotEmpty($documentId, 'No elastic document id received'); - - // retrieve document source from ES and validate - $document = $this->getDocSourceFromElastic( - $client, - $this->options['index'], - $this->options['type'], - $documentId - ); - $this->assertEquals($expected, $document); - - // remove test index from ES - $client->request("/{$this->options['index']}", Request::DELETE); - } - - /** - * Return last created document id from ES response - * @param Response $response Elastica Response object - * @return string|null - */ - protected function getCreatedDocId(Response $response) - { - $data = $response->getData(); - if (!empty($data['items'][0]['create']['_id'])) { - return $data['items'][0]['create']['_id']; - } - } - - /** - * Retrieve document by id from Elasticsearch - * @param Client $client Elastica client - * @param string $index - * @param string $type - * @param string $documentId - * @return array - */ - protected function getDocSourceFromElastic(Client $client, $index, $type, $documentId) - { - $resp = $client->request("/{$index}/{$type}/{$documentId}", Request::GET); - $data = $resp->getData(); - if (!empty($data['_source'])) { - return $data['_source']; - } - return array(); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php deleted file mode 100644 index 19bfdb5ee0..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php +++ /dev/null @@ -1,43 +0,0 @@ -handle($this->getRecord(Logger::ERROR)); - - $this->assertStringMatchesFormat('[%s] test.ERROR: test [] []', $GLOBALS['error_log'][0]); - $this->assertSame($GLOBALS['error_log'][1], $type); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php deleted file mode 100644 index 7713e6a93b..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php +++ /dev/null @@ -1,189 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; -use Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy; - -class FingersCrossedHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\FingersCrossedHandler::__construct - * @covers Monolog\Handler\FingersCrossedHandler::handle - */ - public function testHandleBuffers() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 3); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - */ - public function testHandleStopsBufferingAfterTrigger() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::reset - */ - public function testHandleRestartBufferingAfterReset() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->reset(); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - */ - public function testHandleRestartBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::WARNING, 0, false, false); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - */ - public function testHandleBufferLimit() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::WARNING, 2); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertFalse($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - */ - public function testHandleWithCallback() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler(function($record, $handler) use ($test) { - return $test; - }); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 3); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @expectedException RuntimeException - */ - public function testHandleWithBadCallbackThrowsException() - { - $handler = new FingersCrossedHandler(function($record, $handler) { - return 'foo'; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::isHandling - */ - public function testIsHandlingAlways() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::ERROR); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::__construct - * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::__construct - * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::isHandlerActivated - */ - public function testErrorLevelActivationStrategy() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::__construct - * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::isHandlerActivated - */ - public function testChannelLevelActivationStrategy() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy(Logger::ERROR, array('othertest' => Logger::DEBUG))); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertFalse($test->hasWarningRecords()); - $record = $this->getRecord(Logger::DEBUG); - $record['channel'] = 'othertest'; - $handler->handle($record); - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::INFO); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php deleted file mode 100644 index 2b7b76d984..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\FirePHPHandler - */ -class FirePHPHandlerTest extends TestCase -{ - public function setUp() - { - TestFirePHPHandler::reset(); - } - - public function testHeaders() - { - $handler = new TestFirePHPHandler; - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-Wf-Protocol-1' => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2', - 'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1', - 'X-Wf-1-Plugin-1' => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3', - 'X-Wf-1-1-1-1' => 'test', - 'X-Wf-1-1-1-2' => 'test', - ); - - $this->assertEquals($expected, $handler->getHeaders()); - } - - public function testConcurrentHandlers() - { - $handler = new TestFirePHPHandler; - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $handler2 = new TestFirePHPHandler; - $handler2->setFormatter($this->getIdentityFormatter()); - $handler2->handle($this->getRecord(Logger::DEBUG)); - $handler2->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-Wf-Protocol-1' => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2', - 'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1', - 'X-Wf-1-Plugin-1' => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3', - 'X-Wf-1-1-1-1' => 'test', - 'X-Wf-1-1-1-2' => 'test', - ); - - $expected2 = array( - 'X-Wf-1-1-1-3' => 'test', - 'X-Wf-1-1-1-4' => 'test', - ); - - $this->assertEquals($expected, $handler->getHeaders()); - $this->assertEquals($expected2, $handler2->getHeaders()); - } -} - -class TestFirePHPHandler extends FirePHPHandler -{ - protected $headers = array(); - - public static function reset() - { - self::$initialized = false; - self::$messageIndex = 1; - } - - protected function sendHeader($header, $content) - { - $this->headers[$header] = $content; - } - - public function getHeaders() - { - return $this->headers; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php deleted file mode 100644 index 8e9b9f8ad4..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\GelfMessageFormatter; - -class GelfHandlerTest extends TestCase -{ - public function setUp() - { - if (!class_exists("Gelf\MessagePublisher") || !class_exists("Gelf\Message")) { - $this->markTestSkipped("mlehner/gelf-php not installed"); - } - - require_once __DIR__ . '/GelfMocks.php'; - } - - /** - * @covers Monolog\Handler\GelfHandler::__construct - */ - public function testConstruct() - { - $handler = new GelfHandler($this->getMessagePublisher()); - $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler); - } - - protected function getHandler($messagePublisher) - { - $handler = new GelfHandler($messagePublisher); - - return $handler; - } - - protected function getMessagePublisher() - { - return new MockMessagePublisher('localhost'); - } - - public function testDebug() - { - $messagePublisher = $this->getMessagePublisher(); - $handler = $this->getHandler($messagePublisher); - - $record = $this->getRecord(Logger::DEBUG, "A test debug message"); - $handler->handle($record); - - $this->assertEquals(7, $messagePublisher->lastMessage->getLevel()); - $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); - $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); - $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); - } - - public function testWarning() - { - $messagePublisher = $this->getMessagePublisher(); - $handler = $this->getHandler($messagePublisher); - - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $handler->handle($record); - - $this->assertEquals(4, $messagePublisher->lastMessage->getLevel()); - $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); - $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); - $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); - } - - public function testInjectedGelfMessageFormatter() - { - $messagePublisher = $this->getMessagePublisher(); - $handler = $this->getHandler($messagePublisher); - - $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); - - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $record['extra']['blarg'] = 'yep'; - $record['context']['from'] = 'logger'; - $handler->handle($record); - - $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost()); - $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray()); - $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfMocks.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfMocks.php deleted file mode 100644 index dda8711406..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GelfMocks.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Gelf\MessagePublisher; -use Gelf\Message; - -class MockMessagePublisher extends MessagePublisher -{ - public function publish(Message $message) - { - $this->lastMessage = $message; - } - - public $lastMessage = null; -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php deleted file mode 100644 index c6298a6e6e..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class GroupHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\GroupHandler::__construct - * @expectedException InvalidArgumentException - */ - public function testConstructorOnlyTakesHandler() - { - new GroupHandler(array(new TestHandler(), "foo")); - } - - /** - * @covers Monolog\Handler\GroupHandler::__construct - * @covers Monolog\Handler\GroupHandler::handle - */ - public function testHandle() - { - $testHandlers = array(new TestHandler(), new TestHandler()); - $handler = new GroupHandler($testHandlers); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - foreach ($testHandlers as $test) { - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - } - - /** - * @covers Monolog\Handler\GroupHandler::handleBatch - */ - public function testHandleBatch() - { - $testHandlers = array(new TestHandler(), new TestHandler()); - $handler = new GroupHandler($testHandlers); - $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO))); - foreach ($testHandlers as $test) { - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - } - - /** - * @covers Monolog\Handler\GroupHandler::isHandling - */ - public function testIsHandling() - { - $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING)); - $handler = new GroupHandler($testHandlers); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR))); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\GroupHandler::handle - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new GroupHandler(array($test)); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php deleted file mode 100644 index 8b9e4d4440..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php +++ /dev/null @@ -1,167 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @author Rafael Dohms - * @see https://www.hipchat.com/docs/api - */ -class HipChatHandlerTest extends TestCase -{ - - private $res; - private $handler; - - public function testWriteHeader() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/v1\/rooms\/message\?format=json&auth_token=.* HTTP\/1.1\\r\\nHost: api.hipchat.com\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - /** - * @depends testWriteHeader - */ - public function testWriteContent($content) - { - $this->assertRegexp('/from=Monolog&room_id=room1¬ify=0&message=test1&message_format=text&color=red$/', $content); - } - - public function testWriteWithComplexMessage() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content); - } - - /** - * @dataProvider provideLevelColors - */ - public function testWriteWithErrorLevelsAndColors($level, $expectedColor) - { - $this->createHandler(); - $this->handler->handle($this->getRecord($level, 'Backup of database "example" finished in 16 minutes.')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/color='.$expectedColor.'/', $content); - } - - public function provideLevelColors() - { - return array( - array(Logger::DEBUG, 'gray'), - array(Logger::INFO, 'green'), - array(Logger::WARNING, 'yellow'), - array(Logger::ERROR, 'red'), - array(Logger::CRITICAL, 'red'), - array(Logger::ALERT, 'red'), - array(Logger::EMERGENCY,'red'), - array(Logger::NOTICE, 'green'), - ); - } - - /** - * @dataProvider provideBatchRecords - */ - public function testHandleBatch($records, $expectedColor) - { - $this->createHandler(); - - $this->handler->handleBatch($records); - - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/color='.$expectedColor.'/', $content); - } - - public function provideBatchRecords() - { - return array( - array( - array( - array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()), - array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), - array('level' => Logger::CRITICAL, 'message' => 'Everything is broken!', 'level_name' => 'critical', 'datetime' => new \DateTime()) - ), - 'red', - ), - array( - array( - array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()), - array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), - ), - 'yellow', - ), - array( - array( - array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()), - array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), - ), - 'green', - ), - array( - array( - array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()), - ), - 'gray', - ), - ); - } - - private function createHandler($token = 'myToken', $room = 'room1', $name = 'Monolog', $notify = false) - { - $constructorArgs = array($token, $room, $name, $notify, Logger::DEBUG); - $this->res = fopen('php://memory', 'a'); - $this->handler = $this->getMock( - '\Monolog\Handler\HipChatHandler', - array('fsockopen', 'streamSetTimeout', 'closeSocket'), - $constructorArgs - ); - - $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->handler, 'localhost:1234'); - - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - $this->handler->expects($this->any()) - ->method('closeSocket') - ->will($this->returnValue(true)); - - $this->handler->setFormatter($this->getIdentityFormatter()); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testCreateWithTooLongName() - { - $hipChatHandler = new \Monolog\Handler\HipChatHandler('token', 'room', 'SixteenCharsHere'); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php deleted file mode 100644 index 6754f3d623..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\TestCase; - -class MailHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\MailHandler::handleBatch - */ - public function testHandleBatch() - { - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter->expects($this->once()) - ->method('formatBatch'); // Each record is formatted - - $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); - $handler->expects($this->once()) - ->method('send'); - $handler->expects($this->never()) - ->method('write'); // write is for individual records - - $handler->setFormatter($formatter); - - $handler->handleBatch($this->getMultipleRecords()); - } - - /** - * @covers Monolog\Handler\MailHandler::handleBatch - */ - public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel() - { - $records = array( - $this->getRecord(Logger::DEBUG, 'debug message 1'), - $this->getRecord(Logger::DEBUG, 'debug message 2'), - $this->getRecord(Logger::INFO, 'information'), - ); - - $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); - $handler->expects($this->never()) - ->method('send'); - $handler->setLevel(Logger::ERROR); - - $handler->handleBatch($records); - } - - /** - * @covers Monolog\Handler\MailHandler::write - */ - public function testHandle() - { - $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); - - $record = $this->getRecord(); - $records = array($record); - $records[0]['formatted'] = '['.$record['datetime']->format('Y-m-d H:i:s').'] test.WARNING: test [] []'."\n"; - - $handler->expects($this->once()) - ->method('send') - ->with($records[0]['formatted'], $records); - - $handler->handle($record); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php deleted file mode 100644 index fbaab9bc3d..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Raven_Client; - -class MockRavenClient extends Raven_Client -{ - public function capture($data, $stack, $vars = null) - { - $this->lastData = $data; - $this->lastStack = $stack; - } - - public $lastData; - public $lastStack; -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php deleted file mode 100644 index 7f06d666ce..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class MongoDBHandlerTest extends TestCase -{ - /** - * @expectedException InvalidArgumentException - */ - public function testConstructorShouldThrowExceptionForInvalidMongo() - { - new MongoDBHandler(new \stdClass(), 'DB', 'Collection'); - } - - public function testHandle() - { - $mongo = $this->getMock('Mongo', array('selectCollection'), array(), '', false); - $collection = $this->getMock('stdClass', array('save')); - - $mongo->expects($this->once()) - ->method('selectCollection') - ->with('DB', 'Collection') - ->will($this->returnValue($collection)); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - 'message' => 'test', - 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), - 'extra' => array(), - ); - - $collection->expects($this->once()) - ->method('save') - ->with($expected); - - $handler = new MongoDBHandler($mongo, 'DB', 'Collection'); - $handler->handle($record); - } -} - -if (!class_exists('Mongo')) { - class Mongo - { - public function selectCollection() {} - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php deleted file mode 100644 index 50ceace0f0..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -class NativeMailerHandlerTest extends TestCase -{ - /** - * @expectedException InvalidArgumentException - */ - public function testConstructorHeaderInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', "receiver@example.org\r\nFrom: faked@attacker.org"); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testSetterHeaderInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); - $mailer->addHeader("Content-Type: text/html\r\nFrom: faked@attacker.org"); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testSetterArrayHeaderInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); - $mailer->addHeader(array("Content-Type: text/html\r\nFrom: faked@attacker.org")); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php deleted file mode 100644 index f959a36a89..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Psr\Log\LogLevel; - -class NewRelicHandlerTest extends TestCase -{ - public static $appname; - - public function setUp() - { - $this::$appname = null; - } - - /** - * @expectedException Monolog\Handler\MissingExtensionException - */ - public function testThehandlerThrowsAnExceptionIfTheNRExtensionIsNotLoaded() - { - $handler = new StubNewRelicHandlerWithoutExtension(); - $handler->handle($this->getRecord(Logger::ERROR)); - } - - public function testThehandlerCanHandleTheRecord() - { - $handler = new StubNewRelicHandler(); - $handler->handle($this->getRecord(Logger::ERROR)); - } - - public function testThehandlerCanAddParamsToTheNewRelicTrace() - { - $handler = new StubNewRelicHandler(); - $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('a' => 'b'))); - } - - public function testTheAppNameIsNullByDefault() - { - $handler = new StubNewRelicHandler(); - $handler->handle($this->getRecord(Logger::ERROR, 'log message')); - - $this->assertEquals(null, $this::$appname); - } - - public function testTheAppNameCanBeInjectedFromtheConstructor() - { - $handler = new StubNewRelicHandler(LogLevel::ALERT, false, 'myAppName'); - $handler->handle($this->getRecord(Logger::ERROR, 'log message')); - - $this->assertEquals('myAppName', $this::$appname); - } - - public function testTheAppNameCanBeOverriddenFromEachLog() - { - $handler = new StubNewRelicHandler(LogLevel::ALERT, false, 'myAppName'); - $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('appname' => 'logAppName'))); - - $this->assertEquals('logAppName', $this::$appname); - } -} - -class StubNewRelicHandlerWithoutExtension extends NewRelicHandler -{ - protected function isNewRelicEnabled() - { - return false; - } -} - -class StubNewRelicHandler extends NewRelicHandler -{ - protected function isNewRelicEnabled() - { - return true; - } -} - -function newrelic_notice_error() -{ - return true; -} - -function newrelic_set_appname($appname) -{ - return NewRelicHandlerTest::$appname = $appname; -} - -function newrelic_add_custom_parameter() -{ - return true; -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php deleted file mode 100644 index 292df78c7f..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\NullHandler::handle - */ -class NullHandlerTest extends TestCase -{ - public function testHandle() - { - $handler = new NullHandler(); - $this->assertTrue($handler->handle($this->getRecord())); - } - - public function testHandleLowerLevelRecord() - { - $handler = new NullHandler(Logger::WARNING); - $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php deleted file mode 100644 index e048a02a63..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * Almost all examples (expected header, titles, messages) taken from - * https://www.pushover.net/api - * @author Sebastian Göttschkes - * @see https://www.pushover.net/api - */ -class PushoverHandlerTest extends TestCase -{ - - private $res; - private $handler; - - public function testWriteHeader() - { - $this->createHandler(); - $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/1\/messages.json HTTP\/1.1\\r\\nHost: api.pushover.net\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - /** - * @depends testWriteHeader - */ - public function testWriteContent($content) - { - $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}$/', $content); - } - - public function testWriteWithComplexTitle() - { - $this->createHandler('myToken', 'myUser', 'Backup finished - SQL1', Logger::EMERGENCY); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/title=Backup\+finished\+-\+SQL1/', $content); - } - - public function testWriteWithComplexMessage() - { - $this->createHandler(); - $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content); - } - - public function testWriteWithTooLongMessage() - { - $message = str_pad('test', 520, 'a'); - $this->createHandler(); - $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications - $this->handler->handle($this->getRecord(Logger::CRITICAL, $message)); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $expectedMessage = substr($message, 0, 505); - - $this->assertRegexp('/message=' . $expectedMessage . '&title/', $content); - } - - public function testWriteWithHighPriority() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}&priority=1$/', $content); - } - - public function testWriteWithEmergencyPriority() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200$/', $content); - } - - public function testWriteToMultipleUsers() - { - $this->createHandler('myToken', array('userA', 'userB')); - $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/token=myToken&user=userA&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200POST/', $content); - $this->assertRegexp('/token=myToken&user=userB&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200$/', $content); - } - - private function createHandler($token = 'myToken', $user = 'myUser', $title = 'Monolog') - { - $constructorArgs = array($token, $user, $title); - $this->res = fopen('php://memory', 'a'); - $this->handler = $this->getMock( - '\Monolog\Handler\PushoverHandler', - array('fsockopen', 'streamSetTimeout', 'closeSocket'), - $constructorArgs - ); - - $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->handler, 'localhost:1234'); - - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - $this->handler->expects($this->any()) - ->method('closeSocket') - ->will($this->returnValue(true)); - - $this->handler->setFormatter($this->getIdentityFormatter()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php deleted file mode 100644 index 8d3ea81f2f..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; -use Monolog\Handler\RavenHandler; - -class RavenHandlerTest extends TestCase -{ - public function setUp() - { - if (!class_exists("Raven_Client")) { - $this->markTestSkipped("raven/raven not installed"); - } - - require_once __DIR__ . '/MockRavenClient.php'; - } - - /** - * @covers Monolog\Handler\RavenHandler::__construct - */ - public function testConstruct() - { - $handler = new RavenHandler($this->getRavenClient()); - $this->assertInstanceOf('Monolog\Handler\RavenHandler', $handler); - } - - protected function getHandler($ravenClient) - { - $handler = new RavenHandler($ravenClient); - - return $handler; - } - - protected function getRavenClient() - { - $dsn = 'http://43f6017361224d098402974103bfc53d:a6a0538fc2934ba2bed32e08741b2cd3@marca.python.live.cheggnet.com:9000/1'; - - return new MockRavenClient($dsn); - } - - public function testDebug() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $record = $this->getRecord(Logger::DEBUG, "A test debug message"); - $handler->handle($record); - - $this->assertEquals($ravenClient::DEBUG, $ravenClient->lastData['level']); - $this->assertContains($record['message'], $ravenClient->lastData['message']); - } - - public function testWarning() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $handler->handle($record); - - $this->assertEquals($ravenClient::WARNING, $ravenClient->lastData['level']); - $this->assertContains($record['message'], $ravenClient->lastData['message']); - } - - public function testException() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - try { - $this->methodThatThrowsAnException(); - } catch (\Exception $e) { - $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('exception' => $e)); - $handler->handle($record); - } - - $this->assertEquals($record['message'], $ravenClient->lastData['message']); - } - - public function testHandleBatch() - { - $records = $this->getMultipleRecords(); - $records[] = $this->getRecord(Logger::WARNING, 'warning'); - $records[] = $this->getRecord(Logger::WARNING, 'warning'); - - $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $logFormatter->expects($this->once())->method('formatBatch'); - - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter->expects($this->once())->method('format')->with($this->callback(function($record) { - return $record['level'] == 400; - })); - - $handler = $this->getHandler($this->getRavenClient()); - $handler->setBatchFormatter($logFormatter); - $handler->setFormatter($formatter); - $handler->handleBatch($records); - } - - public function testHandleBatchDoNothingIfRecordsAreBelowLevel() - { - $records = array( - $this->getRecord(Logger::DEBUG, 'debug message 1'), - $this->getRecord(Logger::DEBUG, 'debug message 2'), - $this->getRecord(Logger::INFO, 'information'), - ); - - $handler = $this->getMock('Monolog\Handler\RavenHandler', null, array($this->getRavenClient())); - $handler->expects($this->never())->method('handle'); - $handler->setLevel(Logger::ERROR); - $handler->handleBatch($records); - } - - public function testGetSetBatchFormatter() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $handler->setBatchFormatter($formatter = new LineFormatter()); - $this->assertSame($formatter, $handler->getBatchFormatter()); - } - - private function methodThatThrowsAnException() - { - throw new \Exception('This is an exception'); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php deleted file mode 100644 index 3629f8a247..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; - -class RedisHandlerTest extends TestCase -{ - /** - * @expectedException InvalidArgumentException - */ - public function testConstructorShouldThrowExceptionForInvalidRedis() - { - new RedisHandler(new \stdClass(), 'key'); - } - - public function testConstructorShouldWorkWithPredis() - { - $redis = $this->getMock('Predis\Client'); - $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key')); - } - - public function testConstructorShouldWorkWithRedis() - { - $redis = $this->getMock('Redis'); - $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key')); - } - - public function testPredisHandle() - { - $redis = $this->getMock('Predis\Client', array('rpush')); - - // Predis\Client uses rpush - $redis->expects($this->once()) - ->method('rpush') - ->with('key', 'test'); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $handler = new RedisHandler($redis, 'key'); - $handler->setFormatter(new LineFormatter("%message%")); - $handler->handle($record); - } - - public function testRedisHandle() - { - $redis = $this->getMock('Redis', array('rpush')); - - // Redis uses rPush - $redis->expects($this->once()) - ->method('rPush') - ->with('key', 'test'); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $handler = new RedisHandler($redis, 'key'); - $handler->setFormatter(new LineFormatter("%message%")); - $handler->handle($record); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php deleted file mode 100644 index f4cefda178..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -/** - * @covers Monolog\Handler\RotatingFileHandler - */ -class RotatingFileHandlerTest extends TestCase -{ - public function setUp() - { - $dir = __DIR__.'/Fixtures'; - chmod($dir, 0777); - if (!is_writable($dir)) { - $this->markTestSkipped($dir.' must be writeable to test the RotatingFileHandler.'); - } - } - - public function testRotationCreatesNewFile() - { - touch(__DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot'); - - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot'); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord()); - - $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot'; - $this->assertTrue(file_exists($log)); - $this->assertEquals('test', file_get_contents($log)); - } - - /** - * @dataProvider rotationTests - */ - public function testRotation($createFile) - { - touch($old1 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot'); - touch($old2 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400 * 2).'.rot'); - touch($old3 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400 * 3).'.rot'); - touch($old4 = __DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400 * 4).'.rot'); - - $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot'; - - if ($createFile) { - touch($log); - } - - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord()); - - $handler->close(); - - $this->assertTrue(file_exists($log)); - $this->assertTrue(file_exists($old1)); - $this->assertEquals($createFile, file_exists($old2)); - $this->assertEquals($createFile, file_exists($old3)); - $this->assertEquals($createFile, file_exists($old4)); - $this->assertEquals('test', file_get_contents($log)); - } - - public function rotationTests() - { - return array( - 'Rotation is triggered when the file of the current day is not present' - => array(true), - 'Rotation is not triggered when the file is already present' - => array(false), - ); - } - - public function testReuseCurrentFile() - { - $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot'; - file_put_contents($log, "foo"); - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot'); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord()); - $this->assertEquals('footest', file_get_contents($log)); - } - - public function tearDown() - { - foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) { - unlink($file); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php deleted file mode 100644 index c642bea8b9..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php +++ /dev/null @@ -1,283 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @author Pablo de Leon Belloc - */ -class SocketHandlerTest extends TestCase -{ - /** - * @var Monolog\Handler\SocketHandler - */ - private $handler; - - /** - * @var resource - */ - private $res; - - /** - * @expectedException UnexpectedValueException - */ - public function testInvalidHostname() - { - $this->createHandler('garbage://here'); - $this->writeRecord('data'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testBadConnectionTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setConnectionTimeout(-1); - } - - public function testSetConnectionTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setConnectionTimeout(10.1); - $this->assertEquals(10.1, $this->handler->getConnectionTimeout()); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testBadTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setTimeout(-1); - } - - public function testSetTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setTimeout(10.25); - $this->assertEquals(10.25, $this->handler->getTimeout()); - } - - public function testSetConnectionString() - { - $this->createHandler('tcp://localhost:9090'); - $this->assertEquals('tcp://localhost:9090', $this->handler->getConnectionString()); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testExceptionIsThrownOnFsockopenError() - { - $this->setMockHandler(array('fsockopen')); - $this->handler->expects($this->once()) - ->method('fsockopen') - ->will($this->returnValue(false)); - $this->writeRecord('Hello world'); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testExceptionIsThrownOnPfsockopenError() - { - $this->setMockHandler(array('pfsockopen')); - $this->handler->expects($this->once()) - ->method('pfsockopen') - ->will($this->returnValue(false)); - $this->handler->setPersistent(true); - $this->writeRecord('Hello world'); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testExceptionIsThrownIfCannotSetTimeout() - { - $this->setMockHandler(array('streamSetTimeout')); - $this->handler->expects($this->once()) - ->method('streamSetTimeout') - ->will($this->returnValue(false)); - $this->writeRecord('Hello world'); - } - - /** - * @expectedException RuntimeException - */ - public function testWriteFailsOnIfFwriteReturnsFalse() - { - $this->setMockHandler(array('fwrite')); - - $callback = function($arg) { - $map = array( - 'Hello world' => 6, - 'world' => false, - ); - - return $map[$arg]; - }; - - $this->handler->expects($this->exactly(2)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - - $this->writeRecord('Hello world'); - } - - /** - * @expectedException RuntimeException - */ - public function testWriteFailsIfStreamTimesOut() - { - $this->setMockHandler(array('fwrite', 'streamGetMetadata')); - - $callback = function($arg) { - $map = array( - 'Hello world' => 6, - 'world' => 5, - ); - - return $map[$arg]; - }; - - $this->handler->expects($this->exactly(1)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - $this->handler->expects($this->exactly(1)) - ->method('streamGetMetadata') - ->will($this->returnValue(array('timed_out' => true))); - - $this->writeRecord('Hello world'); - } - - /** - * @expectedException RuntimeException - */ - public function testWriteFailsOnIncompleteWrite() - { - $this->setMockHandler(array('fwrite', 'streamGetMetadata')); - - $res = $this->res; - $callback = function($string) use ($res) { - fclose($res); - - return strlen('Hello'); - }; - - $this->handler->expects($this->exactly(1)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - $this->handler->expects($this->exactly(1)) - ->method('streamGetMetadata') - ->will($this->returnValue(array('timed_out' => false))); - - $this->writeRecord('Hello world'); - } - - public function testWriteWithMemoryFile() - { - $this->setMockHandler(); - $this->writeRecord('test1'); - $this->writeRecord('test2'); - $this->writeRecord('test3'); - fseek($this->res, 0); - $this->assertEquals('test1test2test3', fread($this->res, 1024)); - } - - public function testWriteWithMock() - { - $this->setMockHandler(array('fwrite')); - - $callback = function($arg) { - $map = array( - 'Hello world' => 6, - 'world' => 5, - ); - - return $map[$arg]; - }; - - $this->handler->expects($this->exactly(2)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - - $this->writeRecord('Hello world'); - } - - public function testClose() - { - $this->setMockHandler(); - $this->writeRecord('Hello world'); - $this->assertInternalType('resource', $this->res); - $this->handler->close(); - $this->assertFalse(is_resource($this->res), "Expected resource to be closed after closing handler"); - } - - public function testCloseDoesNotClosePersistentSocket() - { - $this->setMockHandler(); - $this->handler->setPersistent(true); - $this->writeRecord('Hello world'); - $this->assertTrue(is_resource($this->res)); - $this->handler->close(); - $this->assertTrue(is_resource($this->res)); - } - - private function createHandler($connectionString) - { - $this->handler = new SocketHandler($connectionString); - $this->handler->setFormatter($this->getIdentityFormatter()); - } - - private function writeRecord($string) - { - $this->handler->handle($this->getRecord(Logger::WARNING, $string)); - } - - private function setMockHandler(array $methods = array()) - { - $this->res = fopen('php://memory', 'a'); - - $defaultMethods = array('fsockopen', 'pfsockopen', 'streamSetTimeout'); - $newMethods = array_diff($methods, $defaultMethods); - - $finalMethods = array_merge($defaultMethods, $newMethods); - - $this->handler = $this->getMock( - '\Monolog\Handler\SocketHandler', $finalMethods, array('localhost:1234') - ); - - if (!in_array('fsockopen', $methods)) { - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - } - - if (!in_array('pfsockopen', $methods)) { - $this->handler->expects($this->any()) - ->method('pfsockopen') - ->will($this->returnValue($this->res)); - } - - if (!in_array('streamSetTimeout', $methods)) { - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - } - - $this->handler->setFormatter($this->getIdentityFormatter()); - } - -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php deleted file mode 100644 index 63d4fef6d4..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class StreamHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWrite() - { - $handle = fopen('php://memory', 'a+'); - $handler = new StreamHandler($handle); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::WARNING, 'test')); - $handler->handle($this->getRecord(Logger::WARNING, 'test2')); - $handler->handle($this->getRecord(Logger::WARNING, 'test3')); - fseek($handle, 0); - $this->assertEquals('testtest2test3', fread($handle, 100)); - } - - /** - * @covers Monolog\Handler\StreamHandler::close - */ - public function testClose() - { - $handle = fopen('php://memory', 'a+'); - $handler = new StreamHandler($handle); - $this->assertTrue(is_resource($handle)); - $handler->close(); - $this->assertFalse(is_resource($handle)); - } - - /** - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteCreatesTheStreamResource() - { - $handler = new StreamHandler('php://memory'); - $handler->handle($this->getRecord()); - } - - /** - * @expectedException LogicException - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteMissingResource() - { - $handler = new StreamHandler(null); - $handler->handle($this->getRecord()); - } - - /** - * @expectedException UnexpectedValueException - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteInvalidResource() - { - $handler = new StreamHandler('bogus://url'); - $handler->handle($this->getRecord()); - } - - /** - * @expectedException UnexpectedValueException - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteNonExistingResource() - { - $handler = new StreamHandler('/foo/bar/baz/'.rand(0, 10000)); - $handler->handle($this->getRecord()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php deleted file mode 100644 index 98219ac12d..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; -use Monolog\Logger; - -class SyslogHandlerTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Handler\SyslogHandler::__construct - */ - public function testConstruct() - { - $handler = new SyslogHandler('test'); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - - $handler = new SyslogHandler('test', LOG_USER); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - - $handler = new SyslogHandler('test', 'user'); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - - $handler = new SyslogHandler('test', LOG_USER, Logger::DEBUG, true, LOG_PERROR); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - } - - /** - * @covers Monolog\Handler\SyslogHandler::__construct - */ - public function testConstructInvalidFacility() - { - $this->setExpectedException('UnexpectedValueException'); - $handler = new SyslogHandler('test', 'unknown'); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php deleted file mode 100644 index 1cc2148a1e..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php +++ /dev/null @@ -1,39 +0,0 @@ -setFormatter(new \Monolog\Formatter\ChromePHPFormatter()); - - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('write'), array('lol', 'lol')); - $socket->expects($this->at(0)) - ->method('write') - ->with("lol", "<".(LOG_AUTHPRIV + LOG_WARNING).">: "); - $socket->expects($this->at(1)) - ->method('write') - ->with("hej", "<".(LOG_AUTHPRIV + LOG_WARNING).">: "); - - $handler->setSocket($socket); - - $handler->handle($this->getRecordWithMessage("hej\nlol")); - } - - protected function getRecordWithMessage($msg) - { - return array('message' => $msg, 'level' => \Monolog\Logger::WARNING, 'context' => null, 'extra' => array(), 'channel' => 'lol'); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php deleted file mode 100644 index 801d80a9a2..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\TestHandler - */ -class TestHandlerTest extends TestCase -{ - /** - * @dataProvider methodProvider - */ - public function testHandler($method, $level) - { - $handler = new TestHandler; - $record = $this->getRecord($level, 'test'.$method); - $this->assertFalse($handler->{'has'.$method}($record)); - $this->assertFalse($handler->{'has'.$method.'Records'}()); - $handler->handle($record); - - $this->assertFalse($handler->{'has'.$method}('bar')); - $this->assertTrue($handler->{'has'.$method}($record)); - $this->assertTrue($handler->{'has'.$method}('test'.$method)); - $this->assertTrue($handler->{'has'.$method.'Records'}()); - - $records = $handler->getRecords(); - unset($records[0]['formatted']); - $this->assertEquals(array($record), $records); - } - - public function methodProvider() - { - return array( - array('Emergency', Logger::EMERGENCY), - array('Alert' , Logger::ALERT), - array('Critical' , Logger::CRITICAL), - array('Error' , Logger::ERROR), - array('Warning' , Logger::WARNING), - array('Info' , Logger::INFO), - array('Notice' , Logger::NOTICE), - array('Debug' , Logger::DEBUG), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php deleted file mode 100644 index d16b0a3d8f..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php +++ /dev/null @@ -1,45 +0,0 @@ -getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); - - $socket->expects($this->at(0)) - ->method('send') - ->with("HEADER: The quick brown fox jumps over the lazy dog"); - - $socket->write("The quick brown fox jumps over the lazy dog", "HEADER: "); - } - - public function testWeSplitLongMessages() - { - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); - - $socket->expects($this->at(1)) - ->method('send') - ->with("The quick brown fox jumps over the lazy dog"); - - $aStringOfLength2048 = str_repeat("derp", 2048/4); - - $socket->write($aStringOfLength2048."The quick brown fox jumps over the lazy dog"); - } - - public function testAllSplitMessagesHasAHeader() - { - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); - - $socket->expects($this->exactly(5)) - ->method('send') - ->with($this->stringStartsWith("HEADER")); - - $aStringOfLength8192 = str_repeat("derp", 2048); - - $socket->write($aStringOfLength8192, "HEADER"); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php deleted file mode 100644 index 416039e65d..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -class ZendMonitorHandlerTest extends TestCase -{ - protected $zendMonitorHandler; - - public function setUp() - { - if (!function_exists('zend_monitor_custom_event')) { - $this->markTestSkipped('ZendServer is not installed'); - } - } - - /** - * @covers Monolog\Handler\ZendMonitorHandler::write - */ - public function testWrite() - { - $record = $this->getRecord(); - $formatterResult = array( - 'message' => $record['message'] - ); - - $zendMonitor = $this->getMockBuilder('Monolog\Handler\ZendMonitorHandler') - ->setMethods(array('writeZendMonitorCustomEvent', 'getDefaultFormatter')) - ->getMock(); - - $formatterMock = $this->getMockBuilder('Monolog\Formatter\NormalizerFormatter') - ->disableOriginalConstructor() - ->getMock(); - - $formatterMock->expects($this->once()) - ->method('format') - ->will($this->returnValue($formatterResult)); - - $zendMonitor->expects($this->once()) - ->method('getDefaultFormatter') - ->will($this->returnValue($formatterMock)); - - $levelMap = $zendMonitor->getLevelMap(); - - $zendMonitor->expects($this->once()) - ->method('writeZendMonitorCustomEvent') - ->with($levelMap[$record['level']], $record['message'], $formatterResult); - - $zendMonitor->handle($record); - } - - /** - * @covers Monolog\Handler\ZendMonitorHandler::getDefaultFormatter - */ - public function testGetDefaultFormatterReturnsNormalizerFormatter() - { - $zendMonitor = new ZendMonitorHandler(); - $this->assertInstanceOf('Monolog\Formatter\NormalizerFormatter', $zendMonitor->getDefaultFormatter()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/LoggerTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/LoggerTest.php deleted file mode 100644 index 8bcbbf90a1..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/LoggerTest.php +++ /dev/null @@ -1,409 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Monolog\Processor\WebProcessor; -use Monolog\Handler\TestHandler; - -class LoggerTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Logger::getName - */ - public function testGetName() - { - $logger = new Logger('foo'); - $this->assertEquals('foo', $logger->getName()); - } - - /** - * @covers Monolog\Logger::getLevelName - */ - public function testGetLevelName() - { - $this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR)); - } - - /** - * @covers Monolog\Logger::getLevelName - * @expectedException InvalidArgumentException - */ - public function testGetLevelNameThrows() - { - Logger::getLevelName(5); - } - - /** - * @covers Monolog\Logger::__construct - */ - public function testChannel() - { - $logger = new Logger('foo'); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->addWarning('test'); - list($record) = $handler->getRecords(); - $this->assertEquals('foo', $record['channel']); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testLog() - { - $logger = new Logger(__METHOD__); - - $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle')); - $handler->expects($this->once()) - ->method('handle'); - $logger->pushHandler($handler); - - $this->assertTrue($logger->addWarning('test')); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testLogNotHandled() - { - $logger = new Logger(__METHOD__); - - $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR)); - $handler->expects($this->never()) - ->method('handle'); - $logger->pushHandler($handler); - - $this->assertFalse($logger->addWarning('test')); - } - - public function testHandlersInCtor() - { - $handler1 = new TestHandler; - $handler2 = new TestHandler; - $logger = new Logger(__METHOD__, array($handler1, $handler2)); - - $this->assertEquals($handler1, $logger->popHandler()); - $this->assertEquals($handler2, $logger->popHandler()); - } - - public function testProcessorsInCtor() - { - $processor1 = new WebProcessor; - $processor2 = new WebProcessor; - $logger = new Logger(__METHOD__, array(), array($processor1, $processor2)); - - $this->assertEquals($processor1, $logger->popProcessor()); - $this->assertEquals($processor2, $logger->popProcessor()); - } - - /** - * @covers Monolog\Logger::pushHandler - * @covers Monolog\Logger::popHandler - * @expectedException LogicException - */ - public function testPushPopHandler() - { - $logger = new Logger(__METHOD__); - $handler1 = new TestHandler; - $handler2 = new TestHandler; - - $logger->pushHandler($handler1); - $logger->pushHandler($handler2); - - $this->assertEquals($handler2, $logger->popHandler()); - $this->assertEquals($handler1, $logger->popHandler()); - $logger->popHandler(); - } - - /** - * @covers Monolog\Logger::pushProcessor - * @covers Monolog\Logger::popProcessor - * @expectedException LogicException - */ - public function testPushPopProcessor() - { - $logger = new Logger(__METHOD__); - $processor1 = new WebProcessor; - $processor2 = new WebProcessor; - - $logger->pushProcessor($processor1); - $logger->pushProcessor($processor2); - - $this->assertEquals($processor2, $logger->popProcessor()); - $this->assertEquals($processor1, $logger->popProcessor()); - $logger->popProcessor(); - } - - /** - * @covers Monolog\Logger::pushProcessor - * @expectedException InvalidArgumentException - */ - public function testPushProcessorWithNonCallable() - { - $logger = new Logger(__METHOD__); - - $logger->pushProcessor(new \stdClass()); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testProcessorsAreExecuted() - { - $logger = new Logger(__METHOD__); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->pushProcessor(function($record) { - $record['extra']['win'] = true; - - return $record; - }); - $logger->addError('test'); - list($record) = $handler->getRecords(); - $this->assertTrue($record['extra']['win']); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testProcessorsAreCalledOnlyOnce() - { - $logger = new Logger(__METHOD__); - $handler = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler->expects($this->any()) - ->method('handle') - ->will($this->returnValue(true)) - ; - $logger->pushHandler($handler); - - $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor') - ->disableOriginalConstructor() - ->setMethods(array('__invoke')) - ->getMock() - ; - $processor->expects($this->once()) - ->method('__invoke') - ->will($this->returnArgument(0)) - ; - $logger->pushProcessor($processor); - - $logger->addError('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testProcessorsNotCalledWhenNotHandled() - { - $logger = new Logger(__METHOD__); - $handler = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler); - $that = $this; - $logger->pushProcessor(function($record) use ($that) { - $that->fail('The processor should not be called'); - }); - $logger->addAlert('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testHandlersNotCalledBeforeFirstHandling() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->never()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $handler1->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler1); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler2->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler2); - - $handler3 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler3->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $handler3->expects($this->never()) - ->method('handle') - ; - $logger->pushHandler($handler3); - - $logger->debug('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testBubblingWhenTheHandlerReturnsFalse() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler1->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler1); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler2->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler2); - - $logger->debug('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testNotBubblingWhenTheHandlerReturnsTrue() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler1->expects($this->never()) - ->method('handle') - ; - $logger->pushHandler($handler1); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler2->expects($this->once()) - ->method('handle') - ->will($this->returnValue(true)) - ; - $logger->pushHandler($handler2); - - $logger->debug('test'); - } - - /** - * @covers Monolog\Logger::isHandling - */ - public function testIsHandling() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - - $logger->pushHandler($handler1); - $this->assertFalse($logger->isHandling(Logger::DEBUG)); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - - $logger->pushHandler($handler2); - $this->assertTrue($logger->isHandling(Logger::DEBUG)); - } - - /** - * @dataProvider logMethodProvider - * @covers Monolog\Logger::addDebug - * @covers Monolog\Logger::addInfo - * @covers Monolog\Logger::addNotice - * @covers Monolog\Logger::addWarning - * @covers Monolog\Logger::addError - * @covers Monolog\Logger::addCritical - * @covers Monolog\Logger::addAlert - * @covers Monolog\Logger::addEmergency - * @covers Monolog\Logger::debug - * @covers Monolog\Logger::info - * @covers Monolog\Logger::notice - * @covers Monolog\Logger::warn - * @covers Monolog\Logger::err - * @covers Monolog\Logger::crit - * @covers Monolog\Logger::alert - * @covers Monolog\Logger::emerg - */ - public function testLogMethods($method, $expectedLevel) - { - $logger = new Logger('foo'); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->{$method}('test'); - list($record) = $handler->getRecords(); - $this->assertEquals($expectedLevel, $record['level']); - } - - public function logMethodProvider() - { - return array( - // monolog methods - array('addDebug', Logger::DEBUG), - array('addInfo', Logger::INFO), - array('addNotice', Logger::NOTICE), - array('addWarning', Logger::WARNING), - array('addError', Logger::ERROR), - array('addCritical', Logger::CRITICAL), - array('addAlert', Logger::ALERT), - array('addEmergency', Logger::EMERGENCY), - - // ZF/Sf2 compat methods - array('debug', Logger::DEBUG), - array('info', Logger::INFO), - array('notice', Logger::NOTICE), - array('warn', Logger::WARNING), - array('err', Logger::ERROR), - array('crit', Logger::CRITICAL), - array('alert', Logger::ALERT), - array('emerg', Logger::EMERGENCY), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php deleted file mode 100644 index 5adb505dc4..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class GitProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\GitProcessor::__invoke - */ - public function testProcessor() - { - $processor = new GitProcessor(); - $record = $processor($this->getRecord()); - - $this->assertArrayHasKey('git', $record['extra']); - $this->assertTrue(!is_array($record['extra']['git']['branch'])); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php deleted file mode 100644 index 0dd411d75b..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Acme; - -class Tester -{ - public function test($handler, $record) - { - $handler->handle($record); - } -} - -function tester($handler, $record) -{ - $handler->handle($record); -} - -namespace Monolog\Processor; - -use Monolog\Logger; -use Monolog\TestCase; -use Monolog\Handler\TestHandler; - -class IntrospectionProcessorTest extends TestCase -{ - public function getHandler() - { - $processor = new IntrospectionProcessor(); - $handler = new TestHandler(); - $handler->pushProcessor($processor); - - return $handler; - } - - public function testProcessorFromClass() - { - $handler = $this->getHandler(); - $tester = new \Acme\Tester; - $tester->test($handler, $this->getRecord()); - list($record) = $handler->getRecords(); - $this->assertEquals(__FILE__, $record['extra']['file']); - $this->assertEquals(18, $record['extra']['line']); - $this->assertEquals('Acme\Tester', $record['extra']['class']); - $this->assertEquals('test', $record['extra']['function']); - } - - public function testProcessorFromFunc() - { - $handler = $this->getHandler(); - \Acme\tester($handler, $this->getRecord()); - list($record) = $handler->getRecords(); - $this->assertEquals(__FILE__, $record['extra']['file']); - $this->assertEquals(24, $record['extra']['line']); - $this->assertEquals(null, $record['extra']['class']); - $this->assertEquals('Acme\tester', $record['extra']['function']); - } - - public function testLevelTooLow() - { - $input = array( - 'level' => Logger::DEBUG, - 'extra' => array(), - ); - - $expected = $input; - - $processor = new IntrospectionProcessor(Logger::CRITICAL); - $actual = $processor($input); - - $this->assertEquals($expected, $actual); - } - - public function testLevelEqual() - { - $input = array( - 'level' => Logger::CRITICAL, - 'extra' => array(), - ); - - $expected = $input; - $expected['extra'] = array( - 'file' => null, - 'line' => null, - 'class' => 'ReflectionMethod', - 'function' => 'invokeArgs', - ); - - $processor = new IntrospectionProcessor(Logger::CRITICAL); - $actual = $processor($input); - - $this->assertEquals($expected, $actual); - } - - public function testLevelHigher() - { - $input = array( - 'level' => Logger::EMERGENCY, - 'extra' => array(), - ); - - $expected = $input; - $expected['extra'] = array( - 'file' => null, - 'line' => null, - 'class' => 'ReflectionMethod', - 'function' => 'invokeArgs', - ); - - $processor = new IntrospectionProcessor(Logger::CRITICAL); - $actual = $processor($input); - - $this->assertEquals($expected, $actual); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php deleted file mode 100644 index 4bdf22c363..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class MemoryPeakUsageProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke - * @covers Monolog\Processor\MemoryProcessor::formatBytes - */ - public function testProcessor() - { - $processor = new MemoryPeakUsageProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('memory_peak_usage', $record['extra']); - $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_peak_usage']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php deleted file mode 100644 index a30d6de630..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class MemoryUsageProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\MemoryUsageProcessor::__invoke - * @covers Monolog\Processor\MemoryProcessor::formatBytes - */ - public function testProcessor() - { - $processor = new MemoryUsageProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('memory_usage', $record['extra']); - $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_usage']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php deleted file mode 100644 index 458d2a33a6..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class ProcessIdProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\ProcessIdProcessor::__invoke - */ - public function testProcessor() - { - $processor = new ProcessIdProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('process_id', $record['extra']); - $this->assertInternalType('int', $record['extra']['process_id']); - $this->assertGreaterThan(0, $record['extra']['process_id']); - $this->assertEquals(getmypid(), $record['extra']['process_id']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php deleted file mode 100644 index 7ced62ca0e..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class UidProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\UidProcessor::__invoke - */ - public function testProcessor() - { - $processor = new UidProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('uid', $record['extra']); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php deleted file mode 100644 index df29fdd63f..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class WebProcessorTest extends TestCase -{ - public function testProcessor() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'HTTP_REFERER' => 'D', - 'SERVER_NAME' => 'F', - 'UNIQUE_ID' => 'G', - ); - - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']); - $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']); - $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']); - $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']); - $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']); - $this->assertEquals($server['UNIQUE_ID'], $record['extra']['unique_id']); - } - - public function testProcessorDoNothingIfNoRequestUri() - { - $server = array( - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - ); - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertEmpty($record['extra']); - } - - public function testProcessorReturnNullIfNoHttpReferer() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'SERVER_NAME' => 'F', - ); - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertNull($record['extra']['referrer']); - } - - public function testProcessorDoesNotAddUniqueIdIfNotPresent() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'SERVER_NAME' => 'F', - ); - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertFalse(isset($record['extra']['unique_id'])); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testInvalidData() - { - new WebProcessor(new \stdClass); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php deleted file mode 100644 index ab89944962..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Monolog\Handler\TestHandler; -use Monolog\Formatter\LineFormatter; -use Monolog\Processor\PsrLogMessageProcessor; -use Psr\Log\Test\LoggerInterfaceTest; - -class PsrLogCompatTest extends LoggerInterfaceTest -{ - private $handler; - - public function getLogger() - { - $logger = new Logger('foo'); - $logger->pushHandler($handler = new TestHandler); - $logger->pushProcessor(new PsrLogMessageProcessor); - $handler->setFormatter(new LineFormatter('%level_name% %message%')); - - $this->handler = $handler; - - return $logger; - } - - public function getLogs() - { - $convert = function ($record) { - $lower = function ($match) { - return strtolower($match[0]); - }; - - return preg_replace_callback('{^[A-Z]+}', $lower, $record['formatted']); - }; - - return array_map($convert, $this->handler->getRecords()); - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/TestCase.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/TestCase.php deleted file mode 100644 index 1067b91974..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/Monolog/TestCase.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -class TestCase extends \PHPUnit_Framework_TestCase -{ - /** - * @return array Record - */ - protected function getRecord($level = Logger::WARNING, $message = 'test', $context = array()) - { - return array( - 'message' => $message, - 'context' => $context, - 'level' => $level, - 'level_name' => Logger::getLevelName($level), - 'channel' => 'test', - 'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))), - 'extra' => array(), - ); - } - - /** - * @return array - */ - protected function getMultipleRecords() - { - return array( - $this->getRecord(Logger::DEBUG, 'debug message 1'), - $this->getRecord(Logger::DEBUG, 'debug message 2'), - $this->getRecord(Logger::INFO, 'information'), - $this->getRecord(Logger::WARNING, 'warning'), - $this->getRecord(Logger::ERROR, 'error') - ); - } - - /** - * @return Monolog\Formatter\FormatterInterface - */ - protected function getIdentityFormatter() - { - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter->expects($this->any()) - ->method('format') - ->will($this->returnCallback(function($record) { return $record['message']; })); - - return $formatter; - } -} diff --git a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/bootstrap.php b/app/Vendor/Ratchet/vendor/monolog/monolog/tests/bootstrap.php deleted file mode 100644 index 05e49edab0..0000000000 --- a/app/Vendor/Ratchet/vendor/monolog/monolog/tests/bootstrap.php +++ /dev/null @@ -1,15 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -$loader = require __DIR__ . "/../vendor/autoload.php"; -$loader->add('Monolog\\', __DIR__); - -date_default_timezone_set('UTC'); diff --git a/app/Vendor/Ratchet/vendor/psr/log/.gitignore b/app/Vendor/Ratchet/vendor/psr/log/.gitignore deleted file mode 100644 index 22d0d82f80..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/.gitignore +++ /dev/null @@ -1 +0,0 @@ -vendor diff --git a/app/Vendor/Ratchet/vendor/psr/log/LICENSE b/app/Vendor/Ratchet/vendor/psr/log/LICENSE deleted file mode 100644 index 474c952b4b..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 PHP Framework Interoperability Group - -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/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/AbstractLogger.php b/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/AbstractLogger.php deleted file mode 100644 index 00f9034521..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/AbstractLogger.php +++ /dev/null @@ -1,120 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * @return null - */ - public function alert($message, array $context = array()) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * @return null - */ - public function critical($message, array $context = array()) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * @return null - */ - public function error($message, array $context = array()) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * @return null - */ - public function warning($message, array $context = array()) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * @return null - */ - public function notice($message, array $context = array()) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * @return null - */ - public function info($message, array $context = array()) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * @return null - */ - public function debug($message, array $context = array()) - { - $this->log(LogLevel::DEBUG, $message, $context); - } -} diff --git a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/InvalidArgumentException.php b/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/InvalidArgumentException.php deleted file mode 100644 index 67f852d1db..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/InvalidArgumentException.php +++ /dev/null @@ -1,7 +0,0 @@ -logger = $logger; - } -} diff --git a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LoggerInterface.php b/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LoggerInterface.php deleted file mode 100644 index 476bb962af..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/LoggerInterface.php +++ /dev/null @@ -1,114 +0,0 @@ -log(LogLevel::EMERGENCY, $message, $context); - } - - /** - * Action must be taken immediately. - * - * Example: Entire website down, database unavailable, etc. This should - * trigger the SMS alerts and wake you up. - * - * @param string $message - * @param array $context - * @return null - */ - public function alert($message, array $context = array()) - { - $this->log(LogLevel::ALERT, $message, $context); - } - - /** - * Critical conditions. - * - * Example: Application component unavailable, unexpected exception. - * - * @param string $message - * @param array $context - * @return null - */ - public function critical($message, array $context = array()) - { - $this->log(LogLevel::CRITICAL, $message, $context); - } - - /** - * Runtime errors that do not require immediate action but should typically - * be logged and monitored. - * - * @param string $message - * @param array $context - * @return null - */ - public function error($message, array $context = array()) - { - $this->log(LogLevel::ERROR, $message, $context); - } - - /** - * Exceptional occurrences that are not errors. - * - * Example: Use of deprecated APIs, poor use of an API, undesirable things - * that are not necessarily wrong. - * - * @param string $message - * @param array $context - * @return null - */ - public function warning($message, array $context = array()) - { - $this->log(LogLevel::WARNING, $message, $context); - } - - /** - * Normal but significant events. - * - * @param string $message - * @param array $context - * @return null - */ - public function notice($message, array $context = array()) - { - $this->log(LogLevel::NOTICE, $message, $context); - } - - /** - * Interesting events. - * - * Example: User logs in, SQL logs. - * - * @param string $message - * @param array $context - * @return null - */ - public function info($message, array $context = array()) - { - $this->log(LogLevel::INFO, $message, $context); - } - - /** - * Detailed debug information. - * - * @param string $message - * @param array $context - * @return null - */ - public function debug($message, array $context = array()) - { - $this->log(LogLevel::DEBUG, $message, $context); - } - - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * @return null - */ - abstract public function log($level, $message, array $context = array()); -} diff --git a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/NullLogger.php b/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/NullLogger.php deleted file mode 100644 index 553a3c593a..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/NullLogger.php +++ /dev/null @@ -1,27 +0,0 @@ -logger) { }` - * blocks. - */ -class NullLogger extends AbstractLogger -{ - /** - * Logs with an arbitrary level. - * - * @param mixed $level - * @param string $message - * @param array $context - * @return null - */ - public function log($level, $message, array $context = array()) - { - // noop - } -} diff --git a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php deleted file mode 100644 index 7f8cabcc36..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php +++ /dev/null @@ -1,130 +0,0 @@ - " - * - * Example ->error('Foo') would yield "error Foo" - * - * @return string[] - */ - abstract function getLogs(); - - public function testImplements() - { - $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); - } - - /** - * @dataProvider provideLevelsAndMessages - */ - public function testLogsAtAllLevels($level, $message) - { - $logger = $this->getLogger(); - $logger->{$level}($message, array('user' => 'Bob')); - $logger->log($level, $message, array('user' => 'Bob')); - - $expected = array( - $level.' message of level '.$level.' with context: Bob', - $level.' message of level '.$level.' with context: Bob', - ); - $this->assertEquals($expected, $this->getLogs()); - } - - public function provideLevelsAndMessages() - { - return array( - LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), - LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), - LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), - LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), - LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), - LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), - LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), - LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), - ); - } - - /** - * @expectedException \Psr\Log\InvalidArgumentException - */ - public function testThrowsOnInvalidLevel() - { - $logger = $this->getLogger(); - $logger->log('invalid level', 'Foo'); - } - - public function testContextReplacement() - { - $logger = $this->getLogger(); - $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); - - $expected = array('info {Message {nothing} Bob Bar a}'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testObjectCastToString() - { - $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); - $dummy->expects($this->once()) - ->method('__toString') - ->will($this->returnValue('DUMMY')); - - $this->getLogger()->warning($dummy); - - $expected = array('warning DUMMY'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextCanContainAnything() - { - $context = array( - 'bool' => true, - 'null' => null, - 'string' => 'Foo', - 'int' => 0, - 'float' => 0.5, - 'nested' => array('with object' => new DummyTest), - 'object' => new \DateTime, - 'resource' => fopen('php://memory', 'r'), - ); - - $this->getLogger()->warning('Crazy context data', $context); - - $expected = array('warning Crazy context data'); - $this->assertEquals($expected, $this->getLogs()); - } - - public function testContextExceptionKeyCanBeExceptionOrOtherValues() - { - $logger = $this->getLogger(); - $logger->warning('Random message', array('exception' => 'oops')); - $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); - - $expected = array( - 'warning Random message', - 'critical Uncaught Exception!' - ); - $this->assertEquals($expected, $this->getLogs()); - } -} - -class DummyTest -{ -} diff --git a/app/Vendor/Ratchet/vendor/psr/log/README.md b/app/Vendor/Ratchet/vendor/psr/log/README.md deleted file mode 100644 index 574bc1cb2a..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/README.md +++ /dev/null @@ -1,45 +0,0 @@ -PSR Log -======= - -This repository holds all interfaces/classes/traits related to -[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md). - -Note that this is not a logger of its own. It is merely an interface that -describes a logger. See the specification for more details. - -Usage ------ - -If you need a logger, you can use the interface like this: - -```php -logger = $logger; - } - - public function doSomething() - { - if ($this->logger) { - $this->logger->info('Doing work'); - } - - // do something useful - } -} -``` - -You can then pick one of the implementations of the interface to get a logger. - -If you want to implement the interface, you can require this package and -implement `Psr\Log\LoggerInterface` in your code. Please read the -[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) -for details. diff --git a/app/Vendor/Ratchet/vendor/psr/log/composer.json b/app/Vendor/Ratchet/vendor/psr/log/composer.json deleted file mode 100644 index 0dc0174a8c..0000000000 --- a/app/Vendor/Ratchet/vendor/psr/log/composer.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "psr/log", - "description": "Common interface for logging libraries", - "keywords": ["psr", "psr-3", "log"], - "license": "MIT", - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "autoload": { - "psr-0": { - "Psr\\Log\\": "" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/.gitignore b/app/Vendor/Ratchet/vendor/react/promise/.gitignore deleted file mode 100644 index c4bcb78f74..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -composer.lock -composer.phar -phpunit.xml -vendor/ diff --git a/app/Vendor/Ratchet/vendor/react/promise/.travis.yml b/app/Vendor/Ratchet/vendor/react/promise/.travis.yml deleted file mode 100644 index 6b9b05b0a0..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: php - -php: - - 5.3.3 - - 5.3 - - 5.4 - - 5.5 - -before_script: - - composer install - -script: phpunit --coverage-text diff --git a/app/Vendor/Ratchet/vendor/react/promise/CHANGELOG.md b/app/Vendor/Ratchet/vendor/react/promise/CHANGELOG.md deleted file mode 100644 index 3a1dec3be3..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/CHANGELOG.md +++ /dev/null @@ -1,26 +0,0 @@ -CHANGELOG -========= - -* 1.0.4 (2013-04-03) - - * Trigger PHP errors when invalid callback is passed. - * Fully resolve rejection value before calling rejection handler. - * Add When::lazy() to create lazy promises which will be initialized once a - consumer calls the then() method. - -* 1.0.3 (2012-11-17) - - * Add `PromisorInterface` for objects that have a `promise()` method. - -* 1.0.2 (2012-11-14) - - * Fix bug in When::any() not correctly unwrapping to a single result value - * $promiseOrValue argument of When::resolve() and When::reject() is now optional - -* 1.0.1 (2012-11-13) - - * Prevent deep recursion which was reaching `xdebug.max_nesting_level` default of 100 - -* 1.0.0 (2012-11-07) - - * First tagged release diff --git a/app/Vendor/Ratchet/vendor/react/promise/LICENSE b/app/Vendor/Ratchet/vendor/react/promise/LICENSE deleted file mode 100644 index 9bfcd4113c..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012 Jan Sorgalla - -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/app/Vendor/Ratchet/vendor/react/promise/README.md b/app/Vendor/Ratchet/vendor/react/promise/README.md deleted file mode 100644 index 44a30666ac..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/README.md +++ /dev/null @@ -1,499 +0,0 @@ -React/Promise -============= - -A lightweight implementation of -[CommonJS Promises/A](http://wiki.commonjs.org/wiki/Promises/A) for PHP. - -[![Build Status](https://secure.travis-ci.org/reactphp/promise.png?branch=master)](http://travis-ci.org/reactphp/promise) - -Table of Contents ------------------ - -1. [Introduction](#introduction) -2. [Concepts](#concepts) - * [Deferred](#deferred) - * [Promise](#promise) - * [Resolver](#resolver) -3. [API](#api) - * [Deferred](#deferred-1) - * [Promise](#promise-1) - * [Resolver](#resolver-1) - * [When](#when) - * [When::all()](#whenall) - * [When::any()](#whenany) - * [When::some()](#whensome) - * [When::map()](#whenmap) - * [When::reduce()](#whenreduce) - * [When::resolve()](#whenresolve) - * [When::reject()](#whenreject) - * [When::lazy()](#whenlazy) - * [Promisor](#promisor) -4. [Examples](#examples) - * [How to use Deferred](#how-to-use-deferred) - * [How Promise forwarding works](#how-promise-forwarding-works) - * [Resolution forwarding](#resolution-forwarding) - * [Rejection forwarding](#rejection-forwarding) - * [Mixed resolution and rejection forwarding](#mixed-resolution-and-rejection-forwarding) - * [Progress event forwarding](#progress-event-forwarding) -5. [Credits](#credits) -6. [License](#license) - -Introduction ------------- - -React/Promise is a library implementing -[CommonJS Promises/A](http://wiki.commonjs.org/wiki/Promises/A) for PHP. - -It also provides several other useful Promise-related concepts, such as joining -multiple Promises and mapping and reducing collections of Promises. - -If you've never heard about Promises before, -[read this first](https://gist.github.com/3889970). - -Concepts --------- - -### Deferred - -A **Deferred** represents a computation or unit of work that may not have -completed yet. Typically (but not always), that computation will be something -that executes asynchronously and completes at some point in the future. - -### Promise - -While a Deferred represents the computation itself, a **Promise** represents -the result of that computation. Thus, each Deferred has a Promise that acts as -a placeholder for its actual result. - -### Resolver - -A **Resolver** can resolve, reject or trigger progress notifications on behalf -of a Deferred without knowing any details about consumers. - -Sometimes it can be useful to hand out a resolver and allow another -(possibly untrusted) party to provide the resolution value for a Promise. - -API ---- - -### Deferred - -A deferred represents an operation whose resolution is pending. It has separate -Promise and Resolver parts that can be safely given out to separate groups of -consumers and producers to allow safe, one-way communication. - -``` php -$deferred = new React\Promise\Deferred(); - -$promise = $deferred->promise(); -$resolver = $deferred->resolver(); -``` - -Although a Deferred has the full Promise + Resolver API, this should be used for -convenience only by the creator of the deferred. Only the Promise and Resolver -should be given to consumers and producers. - -``` php -$deferred = new React\Promise\Deferred(); - -$deferred->then(callable $fulfilledHandler = null, callable $errorHandler = null, callable $progressHandler = null); -$deferred->resolve(mixed $promiseOrValue = null); -$deferred->reject(mixed $reason = null); -$deferred->progress(mixed $update = null); -``` - -### Promise - -The Promise represents the eventual outcome, which is either fulfillment -(success) and an associated value, or rejection (failure) and an associated -reason. The Promise provides mechanisms for arranging to call a function on its -value or reason, and produces a new Promise for the result. - -A Promise has a single method `then()` which registers new fulfilled, error and -progress handlers with this Promise (all parameters are optional): - -``` php -$newPromise = $promise->then(callable $fulfilledHandler = null, callable $errorHandler = null, callable $progressHandler = null); -``` - - * `$fulfilledHandler` will be invoked once the Promise is fulfilled and passed - the result as the first argument. - * `$errorHandler` will be invoked once the Promise is rejected and passed the - reason as the first argument. - * `$progressHandler` will be invoked whenever the producer of the Promise - triggers progress notifications and passed a single argument (whatever it - wants) to indicate progress. - -Returns a new Promise that will fulfill with the return value of either -`$fulfilledHandler` or `$errorHandler`, whichever is called, or will reject with -the thrown exception if either throws. - -Once in the fulfilled or rejected state, a Promise becomes immutable. -Neither its state nor its result (or error) can be modified. - -A Promise makes the following guarantees about handlers registered in -the same call to `then()`: - - 1. Only one of `$fulfilledHandler` or `$errorHandler` will be called, - never both. - 2. `$fulfilledHandler` and `$errorHandler` will never be called more - than once. - 3. `$progressHandler` may be called multiple times. - -#### See also - -* [When::resolve()](#whenresolve) - Creating a resolved Promise -* [When::reject()](#whenreject) - Creating a rejected Promise - -### Resolver - -The Resolver represents the responsibility of fulfilling, rejecting and -notifying the associated Promise. - -A Resolver has 3 methods: `resolve()`, `reject()` and `progress()`: - -``` php -$resolver->resolve(mixed $result = null); -``` - -Resolves a Deferred. All consumers are notified by having their -`$fulfilledHandler` (which they registered via `$promise->then()`) called with -`$result`. - -If `$result` itself is a promise, the Deferred will transition to the state of -this promise once it is resolved. - -``` php -$resolver->reject(mixed $reason = null); -``` - -Rejects a Deferred, signalling that the Deferred's computation failed. -All consumers are notified by having their `$errorHandler` (which they -registered via `$promise->then()`) called with `$reason`. - -If `$reason` itself is a promise, the Deferred will be rejected with the outcome -of this promise regardless whether it fulfills or rejects. - -``` php -$resolver->progress(mixed $update = null); -``` - -Triggers progress notifications, to indicate to consumers that the computation -is making progress toward its result. - -All consumers are notified by having their `$progressHandler` (which they -registered via `$promise->then()`) called with `$update`. - -### When - -The `React\Promise\When` class provides useful methods for creating, joining, -mapping and reducing collections of Promises. - -#### When::all() - -``` php -$promise = React\Promise\When::all(array|React\Promise\PromiseInterface $promisesOrValues, callable $fulfilledHandler = null, callable $errorHandler = null, callable $progressHandler = null); -``` - -Returns a Promise that will resolve only once all the items in -`$promisesOrValues` have resolved. The resolution value of the returned Promise -will be an array containing the resolution values of each of the items in -`$promisesOrValues`. - -#### When::any() - -``` php -$promise = React\Promise\When::any(array|React\Promise\PromiseInterface $promisesOrValues, callable $fulfilledHandler = null, callable $errorHandler = null, callable $progressHandler = null); -``` - -Returns a Promise that will resolve when any one of the items in -`$promisesOrValues` resolves. The resolution value of the returned Promise -will be the resolution value of the triggering item. - -The returned Promise will only reject if *all* items in `$promisesOrValues` are -rejected. The rejection value will be an array of all rejection reasons. - -#### When::some() - -``` php -$promise = React\Promise\When::some(array|React\Promise\PromiseInterface $promisesOrValues, integer $howMany, callable $fulfilledHandler = null, callable $errorHandler = null, callable $progressHandler = null); -``` - -Returns a Promise that will resolve when `$howMany` of the supplied items in -`$promisesOrValues` resolve. The resolution value of the returned Promise -will be an array of length `$howMany` containing the resolution values of the -triggering items. - -The returned Promise will reject if it becomes impossible for `$howMany` items -to resolve (that is, when `(count($promisesOrValues) - $howMany) + 1` items -reject). The rejection value will be an array of -`(count($promisesOrValues) - $howMany) + 1` rejection reasons. - -#### When::map() - -``` php -$promise = React\Promise\When::map(array|React\Promise\PromiseInterface $promisesOrValues, callable $mapFunc); -``` - -Traditional map function, similar to `array_map()`, but allows input to contain -Promises and/or values, and `$mapFunc` may return either a value or a Promise. - -The map function receives each item as argument, where item is a fully resolved -value of a Promise or value in `$promisesOrValues`. - -#### When::reduce() - -``` php -$promise = React\Promise\When::reduce(array|React\Promise\PromiseInterface $promisesOrValues, callable $reduceFunc , $initialValue = null); -``` - -Traditional reduce function, similar to `array_reduce()`, but input may contain -Promises and/or values, and `$reduceFunc` may return either a value or a -Promise, *and* `$initialValue` may be a Promise or a value for the starting -value. - -#### When::resolve() - -``` php -$promise = React\Promise\When::resolve(mixed $promiseOrValue); -``` - -Creates a resolved Promise for the supplied `$promiseOrValue`. - -If `$promiseOrValue` is a value, it will be the resolution value of the -returned Promise. - -If `$promiseOrValue` is a Promise, it will simply be returned. - -#### When::reject() - -``` php -$promise = React\Promise\When::reject(mixed $promiseOrValue); -``` - -Creates a rejected Promise for the supplied `$promiseOrValue`. - -If `$promiseOrValue` is a value, it will be the rejection value of the -returned Promise. - -If `$promiseOrValue` is a Promise, its completion value will be the rejected -value of the returned Promise. - -This can be useful in situations where you need to reject a Promise without -throwing an exception. For example, it allows you to propagate a rejection with -the value of another Promise. - -#### When::lazy() - -``` php -$promise = React\Promise\When::lazy(callable $factory); -``` - -Creates a Promise which will be lazily initialized by `$factory` once a consumer -calls the `then()` method. - -```php -$factory = function () { - $deferred = new React\Promise\Deferred(); - - // Do some heavy stuff here and resolve the Deferred once completed - - return $deferred->promise(); -}; - -$promise = React\Promise\When::lazy($factory); - -// $factory will only be executed once we call then() -$promise->then(function ($value) { -}); -``` - -### Promisor - -The `React\Promise\PromisorInterface` provides a common interface for objects -that provide a promise. `React\Promise\Deferred` implements it, but since it -is part of the public API anyone can implement it. - -Examples --------- - -### How to use Deferred - -``` php -function getAwesomeResultPromise() -{ - $deferred = new React\Promise\Deferred(); - - // Pass only the Resolver, to provide the resolution value for the Promise - computeAwesomeResultAsynchronously($deferred->resolver()); - - // Return only the Promise, so that the caller cannot - // resolve, reject, or otherwise muck with the original Deferred. - return $deferred->promise(); -} - -getAwesomeResultPromise() - ->then( - function ($result) { - // Deferred resolved, do something with $result - }, - function ($reason) { - // Deferred rejected, do something with $reason - }, - function ($update) { - // Progress notification triggered, do something with $update - } - ); -``` - -### How Promise forwarding works - -A few simple examples to show how the mechanics of Promises/A forwarding works. -These examples are contrived, of course, and in real usage, Promise chains will -typically be spread across several function calls, or even several levels of -your application architecture. - -#### Resolution forwarding - -Resolved Promises forward resolution values to the next Promise. -The first Promise, `$deferred->promise()`, will resolve with the value passed -to `$deferred->resolve()` below. - -Each call to `then()` returns a new Promise that will resolve with the return -value of the previous handler. This creates a Promise "pipeline". - -``` php -$deferred = new React\Promise\Deferred(); - -$deferred->promise() - ->then(function ($x) { - // $x will be the value passed to $deferred->resolve() below - // and returns a *new Promise* for $x + 1 - return $x + 1; - }) - ->then(function ($x) { - // $x === 2 - // This handler receives the return value of the - // previous handler. - return $x + 1; - }) - ->then(function ($x) { - // $x === 3 - // This handler receives the return value of the - // previous handler. - return $x + 1; - }) - ->then(function ($x) { - // $x === 4 - // This handler receives the return value of the - // previous handler. - echo 'Resolve ' . $x; - }); - -$deferred->resolve(1); // Prints "Resolve 4" -``` - -#### Rejection forwarding - -Rejected Promises behave similarly, and also work similarly to try/catch: -When you catch an exception, you must rethrow for it to propagate. - -Similarly, when you handle a rejected Promise, to propagate the rejection, -"rethrow" it by either returning a rejected Promise, or actually throwing -(since Promise translates thrown exceptions into rejections) - -``` php -$deferred = new React\Promise\Deferred(); - -$deferred->promise() - ->then(function ($x) { - throw new \Exception($x + 1); - }) - ->then(null, function (\Exception $x) { - // Propagate the rejection - throw $x; - }) - ->then(null, function (\Exception $x) { - // Can also propagate by returning another rejection - return React\Promise\When::reject((integer) $x->getMessage() + 1); - }) - ->then(null, function ($x) { - echo 'Reject ' . $x; // 3 - }); - -$deferred->resolve(1); // Prints "Reject 3" -``` - -#### Mixed resolution and rejection forwarding - -Just like try/catch, you can choose to propagate or not. Mixing resolutions and -rejections will still forward handler results in a predictable way. - -``` php -$deferred = new React\Promise\Deferred(); - -$deferred->promise() - ->then(function ($x) { - return $x + 1; - }) - ->then(function ($x) { - throw \Exception($x + 1); - }) - ->then(null, function (\Exception $x) { - // Handle the rejection, and don't propagate. - // This is like catch without a rethrow - return (integer) $x->getMessage() + 1; - }) - ->then(function ($x) { - echo 'Mixed ' . $x; // 4 - }); - -$deferred->resolve(1); // Prints "Mixed 4" -``` - -#### Progress event forwarding - -In the same way as resolution and rejection handlers, your progress handler -**MUST** return a progress event to be propagated to the next link in the chain. -If you return nothing, `null` will be propagated. - -Also in the same way as resolutions and rejections, if you don't register a -progress handler, the update will be propagated through. - -If your progress handler throws an exception, the exception will be propagated -to the next link in the chain. The best thing to do is to ensure your progress -handlers do not throw exceptions. - -This gives you the opportunity to transform progress events at each step in the -chain so that they are meaningful to the next step. It also allows you to choose -not to transform them, and simply let them propagate untransformed, by not -registering a progress handler. - -``` php -$deferred = new React\Promise\Deferred(); - -$deferred->promise() - ->then(null, null, function ($update) { - return $update + 1; - }) - ->then(null, null, function ($update) { - echo 'Progress ' . $update; // 2 - }); - -$deferred->progress(1); // Prints "Progress 2" -``` - -Credits -------- - -React/Promise is a port of [when.js](https://github.com/cujojs/when) -by [Brian Cavalier](https://github.com/briancavalier). - -Also, large parts of the documentation have been ported from the when.js -[Wiki](https://github.com/cujojs/when/wiki) and the -[API docs](https://github.com/cujojs/when/blob/master/docs/api.md). - -License -------- - -React/Promise is released under the [MIT](https://github.com/reactphp/promise/blob/master/LICENSE) license. diff --git a/app/Vendor/Ratchet/vendor/react/promise/composer.json b/app/Vendor/Ratchet/vendor/react/promise/composer.json deleted file mode 100644 index 9f12fc1bfd..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/composer.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "react/promise", - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "license": "MIT", - "authors": [ - {"name": "Jan Sorgalla", "email": "jsorgalla@googlemail.com"} - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-0": { - "React\\Promise": "src/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/phpunit.xml.dist b/app/Vendor/Ratchet/vendor/react/promise/phpunit.xml.dist deleted file mode 100644 index 0f98aea7fe..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/phpunit.xml.dist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ./tests/React/Promise/ - - - - - - ./src/ - - - diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/Deferred.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/Deferred.php deleted file mode 100644 index ef084aeee2..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/Deferred.php +++ /dev/null @@ -1,105 +0,0 @@ -completed) { - return $this->completed->then($fulfilledHandler, $errorHandler, $progressHandler); - } - - $deferred = new static(); - - if (is_callable($progressHandler)) { - $progHandler = function ($update) use ($deferred, $progressHandler) { - try { - $deferred->progress(call_user_func($progressHandler, $update)); - } catch (\Exception $e) { - $deferred->progress($e); - } - }; - } else { - if (null !== $progressHandler) { - trigger_error('Invalid $progressHandler argument passed to then(), must be null or callable.', E_USER_NOTICE); - } - - $progHandler = array($deferred, 'progress'); - } - - $this->handlers[] = function ($promise) use ($fulfilledHandler, $errorHandler, $deferred, $progHandler) { - $promise - ->then($fulfilledHandler, $errorHandler) - ->then( - array($deferred, 'resolve'), - array($deferred, 'reject'), - $progHandler - ); - }; - - $this->progressHandlers[] = $progHandler; - - return $deferred->promise(); - } - - public function resolve($result = null) - { - if (null !== $this->completed) { - return Util::promiseFor($result); - } - - $this->completed = Util::promiseFor($result); - - $this->processQueue($this->handlers, $this->completed); - - $this->progressHandlers = $this->handlers = array(); - - return $this->completed; - } - - public function reject($reason = null) - { - return $this->resolve(Util::rejectedPromiseFor($reason)); - } - - public function progress($update = null) - { - if (null !== $this->completed) { - return; - } - - $this->processQueue($this->progressHandlers, $update); - } - - public function promise() - { - if (null === $this->promise) { - $this->promise = new DeferredPromise($this); - } - - return $this->promise; - } - - public function resolver() - { - if (null === $this->resolver) { - $this->resolver = new DeferredResolver($this); - } - - return $this->resolver; - } - - protected function processQueue($queue, $value) - { - foreach ($queue as $handler) { - call_user_func($handler, $value); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredPromise.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredPromise.php deleted file mode 100644 index 6ca2f4fc66..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredPromise.php +++ /dev/null @@ -1,18 +0,0 @@ -deferred = $deferred; - } - - public function then($fulfilledHandler = null, $errorHandler = null, $progressHandler = null) - { - return $this->deferred->then($fulfilledHandler, $errorHandler, $progressHandler); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredResolver.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredResolver.php deleted file mode 100644 index aa6b5b6ae7..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/DeferredResolver.php +++ /dev/null @@ -1,28 +0,0 @@ -deferred = $deferred; - } - - public function resolve($result = null) - { - return $this->deferred->resolve($result); - } - - public function reject($reason = null) - { - return $this->deferred->reject($reason); - } - - public function progress($update = null) - { - return $this->deferred->progress($update); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/FulfilledPromise.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/FulfilledPromise.php deleted file mode 100644 index 0d5aa1449d..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/FulfilledPromise.php +++ /dev/null @@ -1,30 +0,0 @@ -result = $result; - } - - public function then($fulfilledHandler = null, $errorHandler = null, $progressHandler = null) - { - try { - $result = $this->result; - - if (is_callable($fulfilledHandler)) { - $result = call_user_func($fulfilledHandler, $result); - } elseif (null !== $fulfilledHandler) { - trigger_error('Invalid $fulfilledHandler argument passed to then(), must be null or callable.', E_USER_NOTICE); - } - - return Util::promiseFor($result); - } catch (\Exception $exception) { - return new RejectedPromise($exception); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/LazyPromise.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/LazyPromise.php deleted file mode 100644 index 308f7e95da..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/LazyPromise.php +++ /dev/null @@ -1,27 +0,0 @@ -factory = $factory; - } - - public function then($fulfilledHandler = null, $errorHandler = null, $progressHandler = null) - { - if (null === $this->promise) { - try { - $this->promise = Util::promiseFor(call_user_func($this->factory)); - } catch (\Exception $exception) { - $this->promise = new RejectedPromise($exception); - } - } - - return $this->promise->then($fulfilledHandler, $errorHandler, $progressHandler); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/PromiseInterface.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/PromiseInterface.php deleted file mode 100644 index 9d23be2e79..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/PromiseInterface.php +++ /dev/null @@ -1,8 +0,0 @@ -reason = $reason; - } - - public function then($fulfilledHandler = null, $errorHandler = null, $progressHandler = null) - { - try { - if (!is_callable($errorHandler)) { - if (null !== $errorHandler) { - trigger_error('Invalid $errorHandler argument passed to then(), must be null or callable.', E_USER_NOTICE); - } - - return new RejectedPromise($this->reason); - } - - return Util::promiseFor(call_user_func($errorHandler, $this->reason)); - } catch (\Exception $exception) { - return new RejectedPromise($exception); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/ResolverInterface.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/ResolverInterface.php deleted file mode 100644 index 32d735e23e..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/ResolverInterface.php +++ /dev/null @@ -1,10 +0,0 @@ -then(function ($value) { - return new RejectedPromise($value); - }); - } - - return new RejectedPromise($promiseOrValue); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/When.php b/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/When.php deleted file mode 100644 index 321f0bc018..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/src/React/Promise/When.php +++ /dev/null @@ -1,168 +0,0 @@ -then($fulfilledHandler, $errorHandler, $progressHandler); - } - - public static function any($promisesOrValues, $fulfilledHandler = null, $errorHandler = null, $progressHandler = null) - { - $unwrapSingleResult = function ($val) use ($fulfilledHandler) { - $val = array_shift($val); - - return $fulfilledHandler ? $fulfilledHandler($val) : $val; - }; - - return static::some($promisesOrValues, 1, $unwrapSingleResult, $errorHandler, $progressHandler); - } - - public static function some($promisesOrValues, $howMany, $fulfilledHandler = null, $errorHandler = null, $progressHandler = null) - { - return When::resolve($promisesOrValues)->then(function ($array) use ($howMany, $fulfilledHandler, $errorHandler, $progressHandler) { - if (!is_array($array)) { - $array = array(); - } - - $len = count($array); - $toResolve = max(0, min($howMany, $len)); - $values = array(); - $deferred = new Deferred(); - - if (!$toResolve) { - $deferred->resolve($values); - } else { - $toReject = ($len - $toResolve) + 1; - $reasons = array(); - - $progress = array($deferred, 'progress'); - - $fulfillOne = function ($val, $i) use (&$values, &$toResolve, $deferred) { - $values[$i] = $val; - - if (0 === --$toResolve) { - $deferred->resolve($values); - - return true; - } - }; - - $rejectOne = function ($reason, $i) use (&$reasons, &$toReject, $deferred) { - $reasons[$i] = $reason; - - if (0 === --$toReject) { - $deferred->reject($reasons); - - return true; - } - }; - - foreach ($array as $i => $promiseOrValue) { - $fulfiller = function ($val) use ($i, &$fulfillOne, &$rejectOne) { - $reset = $fulfillOne($val, $i); - - if (true === $reset) { - $fulfillOne = $rejectOne = function () {}; - } - }; - - $rejecter = function ($val) use ($i, &$fulfillOne, &$rejectOne) { - $reset = $rejectOne($val, $i); - - if (true === $reset) { - $fulfillOne = $rejectOne = function () {}; - } - }; - - When::resolve($promiseOrValue)->then($fulfiller, $rejecter, $progress); - } - } - - return $deferred->then($fulfilledHandler, $errorHandler, $progressHandler); - }); - } - - public static function map($promisesOrValues, $mapFunc) - { - return When::resolve($promisesOrValues)->then(function ($array) use ($mapFunc) { - if (!is_array($array)) { - $array = array(); - } - - $toResolve = count($array); - $results = array(); - $deferred = new Deferred(); - - if (!$toResolve) { - $deferred->resolve($results); - } else { - $resolve = function ($item, $i) use ($mapFunc, &$results, &$toResolve, $deferred) { - When::resolve($item) - ->then($mapFunc) - ->then( - function ($mapped) use (&$results, $i, &$toResolve, $deferred) { - $results[$i] = $mapped; - - if (0 === --$toResolve) { - $deferred->resolve($results); - } - }, - array($deferred, 'reject') - ); - }; - - foreach ($array as $i => $item) { - $resolve($item, $i); - } - } - - return $deferred->promise(); - }); - } - - public static function reduce($promisesOrValues, $reduceFunc , $initialValue = null) - { - return When::resolve($promisesOrValues)->then(function ($array) use ($reduceFunc, $initialValue) { - if (!is_array($array)) { - $array = array(); - } - - $total = count($array); - $i = 0; - - // Wrap the supplied $reduceFunc with one that handles promises and then - // delegates to the supplied. - $wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $total, &$i) { - return When::resolve($current)->then(function ($c) use ($reduceFunc, $total, &$i, $val) { - return When::resolve($val)->then(function ($value) use ($reduceFunc, $total, &$i, $c) { - return call_user_func($reduceFunc, $c, $value, $i++, $total); - }); - }); - }; - - return array_reduce($array, $wrappedReduceFunc, $initialValue); - }); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredProgressTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredProgressTest.php deleted file mode 100644 index 838105da94..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredProgressTest.php +++ /dev/null @@ -1,349 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($sentinel); - - $d - ->promise() - ->then($this->expectCallableNever(), $this->expectCallableNever(), $mock); - - $d - ->resolver() - ->progress($sentinel); - } - - /** @test */ - public function shouldPropagateProgressToDownstreamPromises() - { - $sentinel = new \stdClass(); - - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->will($this->returnArgument(0)); - - $mock2 = $this->createCallableMock(); - $mock2 - ->expects($this->once()) - ->method('__invoke') - ->with($sentinel); - - $d - ->promise() - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock - ) - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock2 - ); - - $d - ->resolver() - ->progress($sentinel); - } - - /** @test */ - public function shouldPropagateTransformedProgressToDownstreamPromises() - { - $sentinel = new \stdClass(); - - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->will($this->returnValue($sentinel)); - - $mock2 = $this->createCallableMock(); - $mock2 - ->expects($this->once()) - ->method('__invoke') - ->with($sentinel); - - $d - ->promise() - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock - ) - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock2 - ); - - $d - ->resolver() - ->progress(1); - } - - /** @test */ - public function shouldPropagateCaughtExceptionValueAsProgress() - { - $exception = new \Exception(); - - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->will($this->throwException($exception)); - - $mock2 = $this->createCallableMock(); - $mock2 - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($exception)); - - $d - ->promise() - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock - ) - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock2 - ); - - $d - ->resolver() - ->progress(1); - } - - /** @test */ - public function shouldForwardProgressEventsWhenIntermediaryCallbackTiedToAResolvedPromiseReturnsAPromise() - { - $sentinel = new \stdClass(); - - $d = new Deferred(); - $d2 = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($sentinel); - - // resolve $d BEFORE calling attaching progress handler - $d - ->resolver() - ->resolve(); - - $d - ->promise() - ->then(function () use ($d2) { - return $d2->promise(); - }) - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock - ); - - $d2 - ->resolver() - ->progress($sentinel); - } - - /** @test */ - public function shouldForwardProgressEventsWhenIntermediaryCallbackTiedToAnUnresolvedPromiseReturnsAPromise() - { - $sentinel = new \stdClass(); - - $d = new Deferred(); - $d2 = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($sentinel); - - $d - ->promise() - ->then(function () use ($d2) { - return $d2->promise(); - }) - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock - ); - - // resolve $d AFTER calling attaching progress handler - $d - ->resolver() - ->resolve(); - $d2 - ->resolver() - ->progress($sentinel); - } - - /** @test */ - public function shouldForwardProgressWhenResolvedWithAnotherPromise() - { - $sentinel = new \stdClass(); - - $d = new Deferred(); - $d2 = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->will($this->returnValue($sentinel)); - - $mock2 = $this->createCallableMock(); - $mock2 - ->expects($this->once()) - ->method('__invoke') - ->with($sentinel); - - $d - ->promise() - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock - ) - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock2 - ); - - $d - ->resolver() - ->resolve($d2->promise()); - $d2 - ->resolver() - ->progress($sentinel); - } - - /** @test */ - public function shouldAllowResolveAfterProgress() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->at(0)) - ->method('__invoke') - ->with($this->identicalTo(1)); - $mock - ->expects($this->at(1)) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $d - ->promise() - ->then( - $mock, - $this->expectCallableNever(), - $mock - ); - - $d - ->resolver() - ->progress(1); - $d - ->resolver() - ->resolve(2); - } - - /** @test */ - public function shouldAllowRejectAfterProgress() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->at(0)) - ->method('__invoke') - ->with($this->identicalTo(1)); - $mock - ->expects($this->at(1)) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $d - ->promise() - ->then( - $this->expectCallableNever(), - $mock, - $mock - ); - - $d - ->resolver() - ->progress(1); - $d - ->resolver() - ->reject(2); - } - - /** - * @test - * @dataProvider invalidCallbackDataProvider - **/ - public function shouldIgnoreNonFunctionsAndTriggerPhpNotice($var) - { - $errorCollector = new ErrorCollector(); - $errorCollector->register(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d = new Deferred(); - $d - ->then( - null, - null, - $var - ) - ->then( - $this->expectCallableNever(), - $this->expectCallableNever(), - $mock - ); - - $d->progress(1); - - $errorCollector->assertCollectedError('Invalid $progressHandler argument passed to then(), must be null or callable.', E_USER_NOTICE); - $errorCollector->unregister(); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredPromiseTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredPromiseTest.php deleted file mode 100644 index 123f65c7bd..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredPromiseTest.php +++ /dev/null @@ -1,23 +0,0 @@ -getMock('React\\Promise\\Deferred'); - $mock - ->expects($this->once()) - ->method('then') - ->with(1, 2, 3); - - $p = new DeferredPromise($mock); - $p->then(1, 2, 3); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredRejectTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredRejectTest.php deleted file mode 100644 index f10d9beb01..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredRejectTest.php +++ /dev/null @@ -1,160 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($this->expectCallableNever(), $mock); - - $d - ->resolver() - ->reject(1); - } - - /** @test */ - public function shouldRejectWithFulfilledPromise() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($this->expectCallableNever(), $mock); - - $d - ->resolver() - ->reject(new FulfilledPromise(1)); - } - - /** @test */ - public function shouldRejectWithRejectedPromise() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($this->expectCallableNever(), $mock); - - $d - ->resolver() - ->reject(new RejectedPromise(1)); - } - - /** @test */ - public function shouldReturnAPromiseForTheRejectionValue() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->resolver() - ->reject(1) - ->then($this->expectCallableNever(), $mock); - } - - /** @test */ - public function shouldInvokeNewlyAddedErrbackWhenAlreadyRejected() - { - $d = new Deferred(); - $d - ->resolver() - ->reject(1); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($this->expectCallableNever(), $mock); - } - - /** @test */ - public function shouldForwardReasonWhenCallbackIsNull() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d = new Deferred(); - $d - ->then( - $this->expectCallableNever() - ) - ->then( - $this->expectCallableNever(), - $mock - ); - - $d->reject(1); - } - - /** - * @test - * @dataProvider invalidCallbackDataProvider - **/ - public function shouldIgnoreNonFunctionsAndTriggerPhpNotice($var) - { - $errorCollector = new ErrorCollector(); - $errorCollector->register(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d = new Deferred(); - $d - ->then( - null, - $var - ) - ->then( - $this->expectCallableNever(), - $mock - ); - - $d->reject(1); - - $errorCollector->assertCollectedError('Invalid $errorHandler argument passed to then(), must be null or callable.', E_USER_NOTICE); - $errorCollector->unregister(); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolveTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolveTest.php deleted file mode 100644 index 3ee7027c1e..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolveTest.php +++ /dev/null @@ -1,196 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($mock); - - $d - ->resolver() - ->resolve(1); - } - - /** @test */ - public function shouldResolveWithPromisedValue() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($mock); - - $d - ->resolver() - ->resolve(new FulfilledPromise(1)); - } - - /** @test */ - public function shouldRejectWhenResolvedWithRejectedPromise() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($this->expectCallableNever(), $mock); - - $d - ->resolver() - ->resolve(new RejectedPromise(1)); - } - - /** @test */ - public function shouldReturnAPromiseForTheResolutionValue() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->resolver() - ->resolve(1) - ->then($mock); - } - - /** @test */ - public function shouldReturnAPromiseForAPromisedResolutionValue() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->resolver() - ->resolve(When::resolve(1)) - ->then($mock); - } - - /** @test */ - public function shouldReturnAPromiseForAPromisedRejectionValue() - { - $d = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - // Both the returned promise, and the deferred's own promise should - // be rejected with the same value - $d - ->resolver() - ->resolve(When::reject(1)) - ->then($this->expectCallableNever(), $mock); - } - - /** @test */ - public function shouldInvokeNewlyAddedCallbackWhenAlreadyResolved() - { - $d = new Deferred(); - $d - ->resolver() - ->resolve(1); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d - ->promise() - ->then($mock, $this->expectCallableNever()); - } - - /** @test */ - public function shouldForwardValueWhenCallbackIsNull() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d = new Deferred(); - $d - ->then( - null, - $this->expectCallableNever() - ) - ->then( - $mock, - $this->expectCallableNever() - ); - - $d->resolve(1); - } - - /** - * @test - * @dataProvider invalidCallbackDataProvider - **/ - public function shouldIgnoreNonFunctionsAndTriggerPhpNotice($var) - { - $errorCollector = new ErrorCollector(); - $errorCollector->register(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $d = new Deferred(); - $d - ->then( - $var - ) - ->then( - $mock, - $this->expectCallableNever() - ); - - $d->resolve(1); - - $errorCollector->assertCollectedError('Invalid $fulfilledHandler argument passed to then(), must be null or callable.', E_USER_NOTICE); - $errorCollector->unregister(); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolverTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolverTest.php deleted file mode 100644 index 349bdc2c5e..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredResolverTest.php +++ /dev/null @@ -1,33 +0,0 @@ -getMock('React\\Promise\\Deferred'); - $mock - ->expects($this->once()) - ->method('resolve') - ->with(1); - $mock - ->expects($this->once()) - ->method('reject') - ->with(1); - $mock - ->expects($this->once()) - ->method('progress') - ->with(1); - - $p = new DeferredResolver($mock); - $p->resolve(1); - $p->reject(1); - $p->progress(1); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredTest.php deleted file mode 100644 index 51eb25200c..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/DeferredTest.php +++ /dev/null @@ -1,87 +0,0 @@ -resolve(1); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $d->resolve(2)->then($mock); - } - - /** @test */ - public function shouldReturnAPromiseForPassedInRejectionValueWhenAlreadyResolved() - { - $d = new Deferred(); - $d->resolve(1); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $d->reject(2)->then($this->expectCallableNever(), $mock); - } - - /** @test */ - public function shouldReturnSilentlyOnProgressWhenAlreadyResolved() - { - $d = new Deferred(); - $d->resolve(1); - - $this->assertNull($d->progress()); - } - - /** @test */ - public function shouldReturnAPromiseForPassedInResolutionValueWhenAlreadyRejected() - { - $d = new Deferred(); - $d->reject(1); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $d->resolve(2)->then($mock); - } - - /** @test */ - public function shouldReturnAPromiseForPassedInRejectionValueWhenAlreadyRejected() - { - $d = new Deferred(); - $d->reject(1); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $d->reject(2)->then($this->expectCallableNever(), $mock); - } - - /** @test */ - public function shouldReturnSilentlyOnProgressWhenAlreadyRejected() - { - $d = new Deferred(); - $d->reject(1); - - $this->assertNull($d->progress()); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/ErrorCollector.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/ErrorCollector.php deleted file mode 100644 index 648ab68aab..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/ErrorCollector.php +++ /dev/null @@ -1,38 +0,0 @@ -errors = &$errors; - } - - public function unregister() - { - $this->errors = array(); - restore_error_handler(); - } - - public function assertCollectedError($errstr, $errno) - { - foreach ($this->errors as $error) { - if ($error['errstr'] === $errstr && $error['errno'] === $errno) { - return; - } - } - - $message = 'Error with level ' . $errno . ' and message "' . $errstr . '" not found in ' . var_export($this->errors, true); - - throw new \PHPUnit_Framework_AssertionFailedError($message); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/FulfilledPromiseTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/FulfilledPromiseTest.php deleted file mode 100644 index ef574a8e9a..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/FulfilledPromiseTest.php +++ /dev/null @@ -1,143 +0,0 @@ -assertInstanceOf('React\\Promise\\PromiseInterface', $p->then()); - } - - /** @test */ - public function shouldReturnAllowNull() - { - $p = new FulfilledPromise(); - $this->assertInstanceOf('React\\Promise\\PromiseInterface', $p->then(null, null, null)); - } - - /** @test */ - public function shouldForwardResultWhenCallbackIsNull() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $p = new FulfilledPromise(1); - $p - ->then( - null, - $this->expectCallableNever() - ) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldForwardCallbackResultToNextCallback() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $p = new FulfilledPromise(1); - $p - ->then( - function ($val) { - return $val + 1; - }, - $this->expectCallableNever() - ) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldForwardPromisedCallbackResultValueToNextCallback() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $p = new FulfilledPromise(1); - $p - ->then( - function ($val) { - return new FulfilledPromise($val + 1); - }, - $this->expectCallableNever() - ) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldSwitchFromCallbacksToErrbacksWhenCallbackReturnsARejection() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $p = new FulfilledPromise(1); - $p - ->then( - function ($val) { - return new RejectedPromise($val + 1); - }, - $this->expectCallableNever() - ) - ->then( - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldSwitchFromCallbacksToErrbacksWhenCallbackThrows() - { - $exception = new \Exception(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->will($this->throwException($exception)); - - $mock2 = $this->createCallableMock(); - $mock2 - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($exception)); - - $p = new FulfilledPromise(1); - $p - ->then( - $mock, - $this->expectCallableNever() - ) - ->then( - $this->expectCallableNever(), - $mock2 - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/LazyPromiseTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/LazyPromiseTest.php deleted file mode 100644 index 52a2517f7b..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/LazyPromiseTest.php +++ /dev/null @@ -1,88 +0,0 @@ -createCallableMock(); - $factory - ->expects($this->never()) - ->method('__invoke'); - - new LazyPromise($factory); - } - - /** @test */ - public function shouldCallFactoryIfThenIsInvoked() - { - $factory = $this->createCallableMock(); - $factory - ->expects($this->once()) - ->method('__invoke'); - - $p = new LazyPromise($factory); - $p->then(); - } - - /** @test */ - public function shouldReturnPromiseFromFactory() - { - $factory = $this->createCallableMock(); - $factory - ->expects($this->once()) - ->method('__invoke') - ->will($this->returnValue(new FulfilledPromise(1))); - - $fulfilledHandler = $this->createCallableMock(); - $fulfilledHandler - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - $p = new LazyPromise($factory); - - $p->then($fulfilledHandler); - } - - /** @test */ - public function shouldReturnPromiseIfFactoryReturnsNull() - { - $factory = $this->createCallableMock(); - $factory - ->expects($this->once()) - ->method('__invoke') - ->will($this->returnValue(null)); - - $p = new LazyPromise($factory); - $this->assertInstanceOf('React\\Promise\\PromiseInterface', $p->then()); - } - - /** @test */ - public function shouldReturnRejectedPromiseIfFactoryThrowsException() - { - $exception = new \Exception(); - - $factory = $this->createCallableMock(); - $factory - ->expects($this->once()) - ->method('__invoke') - ->will($this->throwException($exception)); - - $errorHandler = $this->createCallableMock(); - $errorHandler - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($exception)); - - $p = new LazyPromise($factory); - - $p->then($this->expectCallableNever(), $errorHandler); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/RejectedPromiseTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/RejectedPromiseTest.php deleted file mode 100644 index df95380397..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/RejectedPromiseTest.php +++ /dev/null @@ -1,148 +0,0 @@ -assertInstanceOf('React\\Promise\\PromiseInterface', $p->then()); - } - - /** @test */ - public function shouldReturnAllowNull() - { - $p = new RejectedPromise(); - $this->assertInstanceOf('React\\Promise\\PromiseInterface', $p->then(null, null, null)); - } - - /** @test */ - public function shouldForwardUndefinedRejectionValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with(null); - - $p = new RejectedPromise(1); - $p - ->then( - $this->expectCallableNever(), - function () { - // Presence of rejection handler is enough to switch back - // to resolve mode, even though it returns undefined. - // The ONLY way to propagate a rejection is to re-throw or - // return a rejected promise; - } - ) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldSwitchFromErrbacksToCallbacksWhenErrbackDoesNotExplicitlyPropagate() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $p = new RejectedPromise(1); - $p - ->then( - $this->expectCallableNever(), - function ($val) { - return $val + 1; - } - ) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldSwitchFromErrbacksToCallbacksWhenErrbackReturnsAResolution() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $p = new RejectedPromise(1); - $p - ->then( - $this->expectCallableNever(), - function ($val) { - return new FulfilledPromise($val + 1); - } - ) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldPropagateRejectionsWhenErrbackThrows() - { - $exception = new \Exception(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->will($this->throwException($exception)); - - $mock2 = $this->createCallableMock(); - $mock2 - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($exception)); - - $p = new RejectedPromise(1); - $p - ->then( - $this->expectCallableNever(), - $mock - ) - ->then( - $this->expectCallableNever(), - $mock2 - ); - } - - /** @test */ - public function shouldPropagateRejectionsWhenErrbackReturnsARejection() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $p = new RejectedPromise(1); - $p - ->then( - $this->expectCallableNever(), - function ($val) { - return new RejectedPromise($val + 1); - } - ) - ->then( - $this->expectCallableNever(), - $mock - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/Stub/CallableStub.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/Stub/CallableStub.php deleted file mode 100644 index 0120893358..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/Stub/CallableStub.php +++ /dev/null @@ -1,10 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->exactly($amount)) - ->method('__invoke'); - - return $mock; - } - - public function expectCallableOnce() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke'); - - return $mock; - } - - public function expectCallableNever() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->never()) - ->method('__invoke'); - - return $mock; - } - - public function createCallableMock() - { - return $this->getMock('React\\Promise\Stub\CallableStub'); - } - - public function invalidCallbackDataProvider() - { - return array( - 'empty string' => array(''), - 'true' => array(true), - 'false' => array(false), - 'object' => array(new \stdClass), - 'truthy' => array(1), - 'falsey' => array(0) - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilPromiseForTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilPromiseForTest.php deleted file mode 100644 index cdadf2e3ad..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilPromiseForTest.php +++ /dev/null @@ -1,68 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - Util::promiseFor($expected) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldResolveAFulfilledPromise() - { - $expected = 123; - - $resolved = new FulfilledPromise($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - Util::promiseFor($resolved) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldRejectARejectedPromise() - { - $expected = 123; - - $resolved = new RejectedPromise($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - Util::promiseFor($resolved) - ->then( - $this->expectCallableNever(), - $mock - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilRejectedPromiseForTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilRejectedPromiseForTest.php deleted file mode 100644 index 3c2265a731..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/UtilRejectedPromiseForTest.php +++ /dev/null @@ -1,68 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - Util::rejectedPromiseFor($expected) - ->then( - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldRejectWithFulfilledPromise() - { - $expected = 123; - - $resolved = new FulfilledPromise($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - Util::rejectedPromiseFor($resolved) - ->then( - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldRejectWithRejectedPromise() - { - $expected = 123; - - $resolved = new RejectedPromise($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - Util::rejectedPromiseFor($resolved) - ->then( - $this->expectCallableNever(), - $mock - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAllTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAllTest.php deleted file mode 100644 index 555eb3828c..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAllTest.php +++ /dev/null @@ -1,113 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array())); - - When::all(array(), $mock); - } - - /** @test */ - public function shouldResolveValuesArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1, 2, 3))); - - When::all( - array(1, 2, 3), - $mock - ); - } - - /** @test */ - public function shouldResolvePromisesArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1, 2, 3))); - - When::all( - array(When::resolve(1), When::resolve(2), When::resolve(3)), - $mock - ); - } - - /** @test */ - public function shouldResolveSparseArrayInput() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(null, 1, null, 1, 1))); - - When::all( - array(null, 1, null, 1, 1), - $mock - ); - } - - /** @test */ - public function shouldRejectIfAnyInputPromiseRejects() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - When::all( - array(When::resolve(1), When::reject(2), When::resolve(3)), - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldAcceptAPromiseForAnArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1, 2, 3))); - - When::all( - When::resolve(array(1, 2, 3)), - $mock - ); - } - - /** @test */ - public function shouldResolveToEmptyArrayWhenInputPromiseDoesNotResolveToArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array())); - - When::all( - When::resolve(1), - $mock - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAnyTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAnyTest.php deleted file mode 100644 index 467fec1aa1..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenAnyTest.php +++ /dev/null @@ -1,134 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(null)); - - When::any(array(), $mock); - } - - /** @test */ - public function shouldResolveWithAnInputValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - When::any( - array(1, 2, 3), - $mock - ); - } - - /** @test */ - public function shouldResolveWithAPromisedInputValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - When::any( - array(When::resolve(1), When::resolve(2), When::resolve(3)), - $mock - ); - } - - /** @test */ - public function shouldRejectWithAllRejectedInputValuesIfAllInputsAreRejected() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(0 => 1, 1 => 2, 2 => 3))); - - When::any( - array(When::reject(1), When::reject(2), When::reject(3)), - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldResolveWhenFirstInputPromiseResolves() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - When::any( - array(When::resolve(1), When::reject(2), When::reject(3)), - $mock - ); - } - - /** @test */ - public function shouldAcceptAPromiseForAnArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - When::any( - When::resolve(array(1, 2, 3)), - $mock - ); - } - - /** @test */ - public function shouldResolveToNullArrayWhenInputPromiseDoesNotResolveToArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(null)); - - When::any( - When::resolve(1), - $mock - ); - } - - /** @test */ - public function shouldNotRelyOnArryIndexesWhenUnwrappingToASingleResolutionValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - $d1 = new Deferred(); - $d2 = new Deferred(); - - When::any( - array('abc' => $d1->promise(), 1 => $d2->promise()), - $mock - ); - - $d2->resolve(2); - $d1->resolve(1); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenLazyTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenLazyTest.php deleted file mode 100644 index a6512388cb..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenLazyTest.php +++ /dev/null @@ -1,28 +0,0 @@ -assertInstanceOf('React\\Promise\\PromiseInterface', When::lazy(function () {})); - } - - /** @test */ - public function shouldCallFactoryIfThenIsInvoked() - { - $factory = $this->createCallableMock(); - $factory - ->expects($this->once()) - ->method('__invoke'); - - When::lazy($factory) - ->then(); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenMapTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenMapTest.php deleted file mode 100644 index 9dfc88a9b4..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenMapTest.php +++ /dev/null @@ -1,129 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(2, 4, 6))); - - When::map( - array(1, 2, 3), - $this->mapper() - )->then($mock); - } - - /** @test */ - public function shouldMapInputPromisesArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(2, 4, 6))); - - When::map( - array(When::resolve(1), When::resolve(2), When::resolve(3)), - $this->mapper() - )->then($mock); - } - - /** @test */ - public function shouldMapMixedInputArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(2, 4, 6))); - - When::map( - array(1, When::resolve(2), 3), - $this->mapper() - )->then($mock); - } - - /** @test */ - public function shouldMapInputWhenMapperReturnsAPromise() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(2, 4, 6))); - - When::map( - array(1, 2, 3), - $this->promiseMapper() - )->then($mock); - } - - /** @test */ - public function shouldAcceptAPromiseForAnArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(2, 4, 6))); - - When::map( - When::resolve(array(1, When::resolve(2), 3)), - $this->mapper() - )->then($mock); - } - - /** @test */ - public function shouldResolveToEmptyArrayWhenInputPromiseDoesNotResolveToArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array())); - - When::map( - When::resolve(1), - $this->mapper() - )->then($mock); - } - - /** @test */ - public function shouldRejectWhenInputContainsRejection() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - When::map( - array(When::resolve(1), When::reject(2), When::resolve(3)), - $this->mapper() - )->then($this->expectCallableNever(), $mock); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenReduceTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenReduceTest.php deleted file mode 100644 index 425019f944..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenReduceTest.php +++ /dev/null @@ -1,294 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(6)); - - When::reduce( - array(1, 2, 3), - $this->plus() - )->then($mock); - } - - /** @test */ - public function shouldReduceValuesWithInitialValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(7)); - - When::reduce( - array(1, 2, 3), - $this->plus(), - 1 - )->then($mock); - } - - /** @test */ - public function shouldReduceValuesWithInitialPromise() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(7)); - - When::reduce( - array(1, 2, 3), - $this->plus(), - When::resolve(1) - )->then($mock); - } - - /** @test */ - public function shouldReducePromisedValuesWithoutInitialValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(6)); - - When::reduce( - array(When::resolve(1), When::resolve(2), When::resolve(3)), - $this->plus() - )->then($mock); - } - - /** @test */ - public function shouldReducePromisedValuesWithInitialValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(7)); - - When::reduce( - array(When::resolve(1), When::resolve(2), When::resolve(3)), - $this->plus(), - 1 - )->then($mock); - } - - /** @test */ - public function shouldReducePromisedValuesWithInitialPromise() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(7)); - - When::reduce( - array(When::resolve(1), When::resolve(2), When::resolve(3)), - $this->plus(), - When::resolve(1) - )->then($mock); - } - - /** @test */ - public function shouldReduceEmptyInputWithInitialValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - When::reduce( - array(), - $this->plus(), - 1 - )->then($mock); - } - - /** @test */ - public function shouldReduceEmptyInputWithInitialPromise() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - When::reduce( - array(), - $this->plus(), - When::resolve(1) - )->then($mock); - } - - /** @test */ - public function shouldRejectWhenInputContainsRejection() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(2)); - - When::reduce( - array(When::resolve(1), When::reject(2), When::resolve(3)), - $this->plus(), - When::resolve(1) - )->then($this->expectCallableNever(), $mock); - } - - /** @test */ - public function shouldResolveWithNullWhenInputIsEmptyAndNoInitialValueOrPromiseProvided() - { - // Note: this is different from when.js's behavior! - // In when.reduce(), this rejects with a TypeError exception (following - // JavaScript's [].reduce behavior. - // We're following PHP's array_reduce behavior and resolve with NULL. - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(null)); - - When::reduce( - array(), - $this->plus() - )->then($mock); - } - - /** @test */ - public function shouldAllowSparseArrayInputWithoutInitialValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(3)); - - When::reduce( - array(null, null, 1, null, 1, 1), - $this->plus() - )->then($mock); - } - - /** @test */ - public function shouldAllowSparseArrayInputWithInitialValue() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(4)); - - When::reduce( - array(null, null, 1, null, 1, 1), - $this->plus(), - 1 - )->then($mock); - } - - /** @test */ - public function shouldReduceInInputOrder() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo('123')); - - When::reduce( - array(1, 2, 3), - $this->append(), - '' - )->then($mock); - } - - /** @test */ - public function shouldAcceptAPromiseForAnArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo('123')); - - When::reduce( - When::resolve(array(1, 2, 3)), - $this->append(), - '' - )->then($mock); - } - - /** @test */ - public function shouldResolveToInitialValueWhenInputPromiseDoesNotResolveToAnArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(1)); - - When::reduce( - When::resolve(1), - $this->plus(), - 1 - )->then($mock); - } - - /** @test */ - public function shouldProvideCorrectBasisValue() - { - $insertIntoArray = function ($arr, $val, $i) { - $arr[$i] = $val; - - return $arr; - }; - - $d1 = new Deferred(); - $d2 = new Deferred(); - $d3 = new Deferred(); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1, 2, 3))); - - When::reduce( - array($d1->promise(), $d2->promise(), $d3->promise()), - $insertIntoArray, - array() - )->then($mock); - - $d3->resolve(3); - $d1->resolve(1); - $d2->resolve(2); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenRejectTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenRejectTest.php deleted file mode 100644 index 1116eabdff..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenRejectTest.php +++ /dev/null @@ -1,70 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - When::reject($expected) - ->then( - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldRejectAResolvedPromise() - { - $expected = 123; - - $d = new Deferred(); - $d->resolve($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - When::reject($d->promise()) - ->then( - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldRejectARejectedPromise() - { - $expected = 123; - - $d = new Deferred(); - $d->reject($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - When::reject($d->promise()) - ->then( - $this->expectCallableNever(), - $mock - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenResolveTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenResolveTest.php deleted file mode 100644 index ab591423c0..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenResolveTest.php +++ /dev/null @@ -1,100 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - When::resolve($expected) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldResolveAResolvedPromise() - { - $expected = 123; - - $d = new Deferred(); - $d->resolve($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - When::resolve($d->promise()) - ->then( - $mock, - $this->expectCallableNever() - ); - } - - /** @test */ - public function shouldRejectARejectedPromise() - { - $expected = 123; - - $d = new Deferred(); - $d->reject($expected); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo($expected)); - - When::resolve($d->promise()) - ->then( - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldSupportDeepNestingInPromiseChains() - { - $d = new Deferred(); - $d->resolve(false); - - $result = When::resolve(When::resolve($d->then(function ($val) { - $d = new Deferred(); - $d->resolve($val); - - $identity = function ($val) { - return $val; - }; - - return When::resolve($d->then($identity))->then( - function ($val) { - return !$val; - } - ); - }))); - - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(true)); - - $result->then($mock); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenSomeTest.php b/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenSomeTest.php deleted file mode 100644 index 9704b7347f..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/React/Promise/WhenSomeTest.php +++ /dev/null @@ -1,119 +0,0 @@ -createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array())); - - When::some(array(), 1, $mock); - } - - /** @test */ - public function shouldResolveValuesArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1, 2))); - - When::some( - array(1, 2, 3), - 2, - $mock - ); - } - - /** @test */ - public function shouldResolvePromisesArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1, 2))); - - When::some( - array(When::resolve(1), When::resolve(2), When::resolve(3)), - 2, - $mock - ); - } - - /** @test */ - public function shouldResolveSparseArrayInput() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(null, 1))); - - When::some( - array(null, 1, null, 2, 3), - 2, - $mock - ); - } - - /** @test */ - public function shouldRejectIfAnyInputPromiseRejectsBeforeDesiredNumberOfInputsAreResolved() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1 => 2, 2 => 3))); - - When::some( - array(When::resolve(1), When::reject(2), When::reject(3)), - 2, - $this->expectCallableNever(), - $mock - ); - } - - /** @test */ - public function shouldAcceptAPromiseForAnArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array(1, 2))); - - When::some( - When::resolve(array(1, 2, 3)), - 2, - $mock - ); - } - - /** @test */ - public function shouldResolveToEmptyArrayWhenInputPromiseDoesNotResolveToArray() - { - $mock = $this->createCallableMock(); - $mock - ->expects($this->once()) - ->method('__invoke') - ->with($this->identicalTo(array())); - - When::some( - When::resolve(1), - 1, - $mock - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/promise/tests/bootstrap.php b/app/Vendor/Ratchet/vendor/react/promise/tests/bootstrap.php deleted file mode 100644 index e2333359bc..0000000000 --- a/app/Vendor/Ratchet/vendor/react/promise/tests/bootstrap.php +++ /dev/null @@ -1,4 +0,0 @@ -add('React\Promise', __DIR__); diff --git a/app/Vendor/Ratchet/vendor/react/react/.gitignore b/app/Vendor/Ratchet/vendor/react/react/.gitignore deleted file mode 100644 index 7c97585fc2..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.subsplit -vendor diff --git a/app/Vendor/Ratchet/vendor/react/react/.travis.yml b/app/Vendor/Ratchet/vendor/react/react/.travis.yml deleted file mode 100644 index 6ef5fe32e8..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -language: php - -php: - - 5.3.3 - - 5.3 - - 5.4 - - 5.5 - -matrix: - allow_failures: - - php: 5.5 - -before_script: - - sudo apt-get install -y libevent-dev - - sh -c " if [ \"\$(php --re libevent | grep 'does not exist')\" != '' ]; then - wget http://pecl.php.net/get/libevent-0.0.5.tgz; - tar -xzf libevent-0.0.5.tgz; - cd libevent-0.0.5 && phpize && ./configure && make && sudo make install; - echo "extension=libevent.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; - fi" - - composer self-update - - composer install --dev --prefer-source - -script: phpunit --coverage-text diff --git a/app/Vendor/Ratchet/vendor/react/react/CHANGELOG.md b/app/Vendor/Ratchet/vendor/react/react/CHANGELOG.md deleted file mode 100644 index 96500ca176..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/CHANGELOG.md +++ /dev/null @@ -1,84 +0,0 @@ -CHANGELOG -========= - -### 0.3.3 (2013-xx-xx) - - * Bug fix: [EventLoop] No error on removing non-existent streams (@clue) - * Bug fix: [EventLoop] Do not silently remove feof listeners in `LibEvLoop` - * Bug fix: [Stream] Correctly detect closed connections - -### 0.3.2 (2013-05-10) - - * Feature: [Dns] Support default port for IPv6 addresses (@clue) - * Bug fix: [Stream] Make sure CompositeStream is closed properly - -### 0.3.1 (2013-04-21) - - * Feature: [Socket] Support binding to IPv6 addresses (@clue) - * Feature: [SocketClient] Support connecting to IPv6 addresses (@clue) - * Bug fix: [Stream] Allow any `ReadableStreamInterface` on `BufferedSink::createPromise()` - * Bug fix: [HttpClient] Correct requirement for socket-client - -### 0.3.0 (2013-04-14) - - * BC break: [EventLoop] New timers API (@nrk) - * BC break: [EventLoop] Remove check on return value from stream callbacks (@nrk) - * BC break: [HttpClient] Socket connection handling moved to new SocketClient component - * Feature: [SocketClient] New SocketClient component extracted from HttpClient (@clue) - * Feature: [Stream] Factory method for BufferedSink - -### 0.2.7 (2013-01-05) - - * Bug fix: [EventLoop] Fix libevent timers with PHP 5.3 - * Bug fix: [EventLoop] Fix libevent timer cancellation (@nrk) - -### 0.2.6 (2012-12-26) - - * Feature: [Cache] New cache component, used by DNS - * Bug fix: [Http] Emit end event when Response closes (@beaucollins) - * Bug fix: [EventLoop] Plug memory issue in libevent timers (@cameronjacobson) - * Bug fix: [EventLoop] Correctly pause LibEvLoop on stop() - -### 0.2.5 (2012-11-26) - - * Feature: [Stream] Make BufferedSink trigger progress events on the promise (@jsor) - * Feature: [HttpClient] Use a promise-based API internally - * Bug fix: [HttpClient] Use DNS resolver correctly - -### 0.2.4 (2012-11-18) - - * Feature: [Stream] Added ThroughStream, CompositeStream, ReadableStream and WritableStream - * Feature: [Stream] Added BufferedSink - * Feature: [Dns] Change to promise-based API (@jsor) - -### 0.2.3 (2012-11-14) - - * Feature: LibEvLoop, integration of `php-libev` - * Bug fix: Forward drain events from HTTP response (@cs278) - * Dependency: Updated guzzle deps to `3.0.*` - -### 0.2.2 (2012-10-28) - - * Major: Dropped Espresso as a core component now available as `react/espresso` only - * Feature: DNS executor timeout handling (@arnaud-lb) - * Feature: DNS retry executor (@arnaud-lb) - * Feature: HTTP client (@arnaud-lb) - -### 0.2.1 (2012-10-14) - - * Feature: Support HTTP 1.1 continue - * Bug fix: Check for EOF in `Buffer::write()` - * Bug fix: Make `Espresso\Stack` work with invokables (such as `Espresso\Application`) - * Minor adjustments to DNS parser - -### 0.2.0 (2012-09-10) - - * Feature: DNS resolver - -### 0.1.1 (2012-07-12) - - * Bug fix: Testing and functional against PHP >= 5.3.3 and <= 5.3.8 - -### 0.1.0 (2012-07-11) - - * First tagged release diff --git a/app/Vendor/Ratchet/vendor/react/react/LICENSE b/app/Vendor/Ratchet/vendor/react/react/LICENSE deleted file mode 100644 index 3db24de9df..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Igor Wiedler - -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/app/Vendor/Ratchet/vendor/react/react/README.md b/app/Vendor/Ratchet/vendor/react/react/README.md deleted file mode 100644 index b8dc0ca49f..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# React - -Event-driven, non-blocking I/O with PHP. - -[![Build Status](https://secure.travis-ci.org/reactphp/react.png?branch=master)](http://travis-ci.org/reactphp/react) - -## Install - -The recommended way to install react is [through composer](http://getcomposer.org). - -```JSON -{ - "require": { - "react/react": "0.3.*" - } -} -``` - -## What is it? - -React is a low-level library for event-driven programming in PHP. At its core -is an event loop, on top of which it provides low-level utilities, such as: -Streams abstraction, async dns resolver, network client/server, http -client/server, interaction with processes. Third-party libraries can use these -components to create async network clients/servers and more. - -The event loop is based on the reactor pattern (hence the name) and strongly -inspired by libraries such as EventMachine (Ruby), Twisted (Python) and -Node.js (V8). - -## Design goals - -* Usable with a bare minimum of PHP extensions, add more extensions to get better performance. -* Provide a standalone event-loop component that can be re-used by other libraries. -* Decouple parts so they can be replaced by alternate implementations. - -React is non-blocking by default. Use workers for blocking I/O. - -## High-level abstractions - -There are two main abstractions that make dealing with control flow a lot more -manageable. - -* **Stream:** A stream represents an I/O source (ReadableStream) or - destination (WritableStream). These can be used to model pipes, similar - to a unix pipe that is composed of processes. Streams represent very large - values as chunks. - -* **Promise:** A promise represents an eventual return value. Promises can be - composed and are a lot easier to deal with than traditional CPS callback - spaghetti and allow for almost sane error handling. Promises represent the - computation for producing single values. - -You should use these abstractions whenever you can. - -## Usage - -Here is an example of a simple HTTP server listening on port 1337: -```php - 'text/plain'); - - $response->writeHead(200, $headers); - $response->end($text); -}; - -$loop = React\EventLoop\Factory::create(); -$socket = new React\Socket\Server($loop); -$http = new React\Http\Server($socket); - -$http->on('request', $app); - -$socket->listen(1337); -$loop->run(); -``` - -## Documentation - -Superficial documentation can be found in the README files of the individual -components. See `src/React/*/README.md`. - -## Community - -Check out #reactphp on irc.freenode.net. Also follow -[@reactphp](https://twitter.com/reactphp) on twitter. - -## Tests - -To run the test suite, you need install the dependencies via composer, then -run PHPUnit. - - $ composer install - $ phpunit - -## License - -MIT, see LICENSE. diff --git a/app/Vendor/Ratchet/vendor/react/react/UPGRADE-0.3.md b/app/Vendor/Ratchet/vendor/react/react/UPGRADE-0.3.md deleted file mode 100644 index e26bce8142..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/UPGRADE-0.3.md +++ /dev/null @@ -1,33 +0,0 @@ -UPGRADE for 0.3.x -================= - -EventLoop ---------- - -* The timer callback now receives a `Timer` instance, with the following - useful methods: - - * `cancel` - * `isActive` - * `setData($data)` - * `getData` - - And some other less common ones. These are prefered over - `LoopInterface::cancelTimer` and `LoopInterface::isTimerActive`. - -* You can no longer return a boolean from a periodic timer callback to abort - it. - -HttpClient ----------- - -* `HttpClient\*ConnectionManager` has been moved to `SocketClient\*Connector`, - and the `getConnection` method has been renamed to `create`. - - Before: - - $connectionManager->getConnection($host, $port); - - After: - - $connector->create($host, $port); diff --git a/app/Vendor/Ratchet/vendor/react/react/benchmark/bench.php b/app/Vendor/Ratchet/vendor/react/react/benchmark/bench.php deleted file mode 100644 index 0a21c83569..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/benchmark/bench.php +++ /dev/null @@ -1,47 +0,0 @@ -prev = microtime(true); - } - - public function snap() { - $prev = $this->prev; - - $current = microtime(true); - $this->prev = $current; - - return $current - $prev; - } - - public function printSnap($name) { - printf("%-40s: %s s\n", $name, $this->snap()); - } -} - -function benchLoops(array $tests) { - $loops = array( - 'StreamSelectLoop', - 'LibEventLoop', - 'LibEvLoop', - // 'LibUvLoop', - ); - - foreach ($tests as $testName => $test) { - foreach ($loops as $loopName) { - $loopClass = "React\\EventLoop\\$loopName"; - $loop = new $loopClass(); - - $bench = new Bench(); - $bench->start(); - - $test($loop); - - $bench->printSnap("$loopName: $testName"); - } - - printf("----------------------------------------\n"); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/benchmark/timers.php b/app/Vendor/Ratchet/vendor/react/react/benchmark/timers.php deleted file mode 100644 index e0c30a34bb..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/benchmark/timers.php +++ /dev/null @@ -1,32 +0,0 @@ - function ($loop) use ($x) { - for ($i = 0; $i < $x; $i++) { - $loop->addTimer(1, function ($signature, $loop) {}); - } - $loop->run(); - }, - $x . ' periodic timers' => function ($loop) use ($x) { - for ($i = 0; $i < $x; $i++) { - $loop->addPeriodicTimer(2, function ($signature, $loop) use (&$i, $x) { - if ($i >= $x) { - $loop->cancelTimer($signature); - } - }); - } - $loop->run(); - }, -); - -benchLoops($tests); diff --git a/app/Vendor/Ratchet/vendor/react/react/composer.json b/app/Vendor/Ratchet/vendor/react/react/composer.json deleted file mode 100644 index b001417b1c..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/composer.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "react/react", - "description": "Nuclear Reactor written in PHP.", - "keywords": ["event-loop", "reactor"], - "license": "MIT", - "support": { - "issues": "https://github.com/reactphp/react/issues", - "irc": "irc://irc.freenode.org/reactphp" - }, - "require": { - "php": ">=5.3.3", - "evenement/evenement": "1.0.*", - "guzzle/parser": "~3.0", - "react/promise": "~1.0" - }, - "replace": { - "react/event-loop": "self.version", - "react/cache": "self.version", - "react/stream": "self.version", - "react/socket": "self.version", - "react/socket-client": "self.version", - "react/http": "self.version", - "react/http-client": "self.version", - "react/dns": "self.version" - }, - "suggest": { - "ext-libevent": "*", - "ext-libev": "*" - }, - "autoload": { - "psr-0": { "React": "src" } - }, - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/composer.lock b/app/Vendor/Ratchet/vendor/react/react/composer.lock deleted file mode 100644 index 5cb848ad00..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/composer.lock +++ /dev/null @@ -1,151 +0,0 @@ -{ - "_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": "cff88550c9ac83dc0aa91c6fe6adb377", - "packages": [ - { - "name": "evenement/evenement", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement", - "reference": "v1.0.0" - }, - "dist": { - "type": "zip", - "url": "https://github.com/igorw/evenement/zipball/v1.0.0", - "reference": "v1.0.0", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Evenement": "src" - } - }, - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch", - "homepage": "http://wiedler.ch/igor/" - } - ], - "description": "Événement is a very simple event dispatching library for PHP 5.3", - "keywords": [ - "event-dispatcher" - ], - "time": "2012-05-30 08:01:08" - }, - { - "name": "guzzle/parser", - "version": "v3.4.0", - "target-dir": "Guzzle/Parser", - "source": { - "type": "git", - "url": "https://github.com/guzzle/parser.git", - "reference": "v3.4.0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/parser/zipball/v3.4.0", - "reference": "v3.4.0", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "psr-0": { - "Guzzle\\Parser": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Interchangeable parsers used by Guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "URI Template", - "cookie", - "http", - "message", - "url" - ], - "time": "2013-03-07 22:13:59" - }, - { - "name": "react/promise", - "version": "v1.0.4", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "v1.0.4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/v1.0.4", - "reference": "v1.0.4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "React\\Promise": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@googlemail.com", - "homepage": "http://sorgalla.com", - "role": "maintainer" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "time": "2013-04-03 14:05:55" - } - ], - "packages-dev": [ - - ], - "aliases": [ - - ], - "minimum-stability": "stable", - "stability-flags": [ - - ], - "platform": { - "php": ">=5.3.3" - }, - "platform-dev": [ - - ] -} diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/dns-resolver.php b/app/Vendor/Ratchet/vendor/react/react/examples/dns-resolver.php deleted file mode 100644 index 3cac3bee6e..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/dns-resolver.php +++ /dev/null @@ -1,23 +0,0 @@ -create('8.8.8.8', $loop); - -$domain = 'igor.io'; - -$dns - ->resolve($domain) - ->then(function ($ip) { - echo "Host: $ip\n"; - }, function ($e) { - echo "Error: {$e->getMessage()}\n"; - }); - -echo "Resolving domain $domain...\n"; - -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/echo-server.php b/app/Vendor/Ratchet/vendor/react/react/examples/echo-server.php deleted file mode 100644 index 8f1ec12c21..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/echo-server.php +++ /dev/null @@ -1,18 +0,0 @@ -on('connection', function ($conn) { - $conn->pipe($conn); -}); - -echo "Socket server listening on port 4000.\n"; -echo "You can connect to it by running: telnet localhost 4000\n"; - -$socket->listen(4000); -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/http-client.php b/app/Vendor/Ratchet/vendor/react/react/examples/http-client.php deleted file mode 100644 index af8925ae4b..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/http-client.php +++ /dev/null @@ -1,40 +0,0 @@ -createCached('8.8.8.8', $loop); - -$factory = new React\HttpClient\Factory(); -$client = $factory->create($loop, $dnsResolver); - -$request = $client->request('GET', 'https://api.github.com/repos/reactphp/react/commits'); -$request->on('response', function ($response) { - $buffer = ''; - - $response->on('data', function ($data) use (&$buffer) { - $buffer .= $data; - echo "."; - }); - - $response->on('end', function () use (&$buffer) { - $decoded = json_decode($buffer, true); - $latest = $decoded[0]['commit']; - $author = $latest['author']['name']; - $date = date('F j, Y', strtotime($latest['author']['date'])); - - echo "\n"; - echo "Latest commit on react was done by {$author} on {$date}\n"; - echo "{$latest['message']}\n"; - }); -}); -$request->on('end', function ($error, $response) { - echo $error; -}); -$request->end(); - -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/parallel-download.php b/app/Vendor/Ratchet/vendor/react/react/examples/parallel-download.php deleted file mode 100644 index a6de5fe2f5..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/parallel-download.php +++ /dev/null @@ -1,46 +0,0 @@ - 'http://nodejs.org/dist/v0.6.18/node-v0.6.18.tar.gz', - 'php-5.4.3.tar.gz' => 'http://it.php.net/get/php-5.4.3.tar.gz/from/this/mirror', -); - -foreach ($files as $file => $url) { - $readStream = fopen($url, 'r'); - $writeStream = fopen($file, 'w'); - - stream_set_blocking($readStream, 0); - stream_set_blocking($writeStream, 0); - - $read = new React\Stream\Stream($readStream, $loop); - $write = new React\Stream\Stream($writeStream, $loop); - - $read->on('end', function () use ($file, &$files) { - unset($files[$file]); - echo "Finished downloading $file\n"; - }); - - $read->pipe($write); -} - -$loop->addPeriodicTimer(5, function ($timer) use (&$files) { - if (0 === count($files)) { - $timer->cancel(); - } - - foreach ($files as $file => $url) { - $mbytes = filesize($file) / (1024 * 1024); - $formatted = number_format($mbytes, 3); - echo "$file: $formatted MiB\n"; - } -}); - -echo "This script will show the download status every 5 seconds.\n"; - -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/pump-shitload-of-data.php b/app/Vendor/Ratchet/vendor/react/react/examples/pump-shitload-of-data.php deleted file mode 100644 index 7efad58e2c..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/pump-shitload-of-data.php +++ /dev/null @@ -1,23 +0,0 @@ -on('connection', function ($conn) { - $shitload = str_repeat('a', 1024*1024*32); - $conn->write($shitload); - $conn->end(); -}); - -echo "Socket server listening on port 4000.\n"; -echo "You can connect to it by running: telnet localhost 4000\n"; - -$socket->listen(4000); -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/scalability.php b/app/Vendor/Ratchet/vendor/react/react/examples/scalability.php deleted file mode 100644 index 842761188d..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/scalability.php +++ /dev/null @@ -1,21 +0,0 @@ -addReadStream($s, function ($s) use ($i) { - $c=stream_socket_accept($s); - $len=strlen($i)+4; - fwrite($c,"HTTP/1.1 200 OK\r\nContent-Length: $len\r\n\r\nHi:$i\n"); - echo "Served on port 800$i\n"; - }); -} - -echo "Access your brand new HTTP server on 127.0.0.1:800x. Replace x with any number from 0-9\n"; - -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/tcp-chat.php b/app/Vendor/Ratchet/vendor/react/react/examples/tcp-chat.php deleted file mode 100644 index 8ed2ffc538..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/tcp-chat.php +++ /dev/null @@ -1,35 +0,0 @@ -on('connection', function ($conn) use ($conns) { - $conns->attach($conn); - - $conn->on('data', function ($data) use ($conns, $conn) { - foreach ($conns as $current) { - if ($conn === $current) { - continue; - } - - $current->write($conn->getRemoteAddress().': '); - $current->write($data); - } - }); - - $conn->on('end', function () use ($conns, $conn) { - $conns->detach($conn); - }); -}); - -echo "Socket server listening on port 4000.\n"; -echo "You can connect to it by running: telnet localhost 4000\n"; - -$socket->listen(4000); -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/test-close-conn.php b/app/Vendor/Ratchet/vendor/react/react/examples/test-close-conn.php deleted file mode 100644 index a949aeaab9..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/test-close-conn.php +++ /dev/null @@ -1,22 +0,0 @@ -on('connection', function ($conn) use (&$i, $loop) { - $i++; - - $conn->on('end', function () use (&$i) { - $i--; - }); -}); - -$loop->addPeriodicTimer(2, function () use (&$i) { - echo "$i open connections?\n"; -}); - -$socket->listen(8080); -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/test-memory-http.php b/app/Vendor/Ratchet/vendor/react/react/examples/test-memory-http.php deleted file mode 100644 index 634dd8bc4e..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/test-memory-http.php +++ /dev/null @@ -1,28 +0,0 @@ -on('request', function ($request, $response) use (&$i) { - $i++; - $response->writeHead(); - $response->end("Hello World!\n"); -}); - -$loop->addPeriodicTimer(2, function () use (&$i) { - $kmem = memory_get_usage(true) / 1024; - echo "Request: $i\n"; - echo "Memory: $kmem KiB\n"; -}); - -$socket->listen(8080); -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/examples/test-memory.php b/app/Vendor/Ratchet/vendor/react/react/examples/test-memory.php deleted file mode 100644 index 4e478011f4..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/examples/test-memory.php +++ /dev/null @@ -1,26 +0,0 @@ -addPeriodicTimer(0.001, function () use (&$i, $loop) { - $i++; - - // $loop->addTimer(1, function ($timer) { - // }); - - $loop->addPeriodicTimer(1, function ($timer) { - $timer->cancel(); - }); -}); - -$loop->addPeriodicTimer(2, function () use (&$i) { - $kmem = memory_get_usage(true) / 1024; - echo "Run: $i\n"; - echo "Memory: $kmem KiB\n"; -}); - -$loop->run(); diff --git a/app/Vendor/Ratchet/vendor/react/react/phpunit.xml.dist b/app/Vendor/Ratchet/vendor/react/react/phpunit.xml.dist deleted file mode 100644 index 7059643f5c..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/phpunit.xml.dist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - ./tests/React/ - - - - - - ./src/ - - - diff --git a/app/Vendor/Ratchet/vendor/react/react/resources/avatar.png b/app/Vendor/Ratchet/vendor/react/react/resources/avatar.png deleted file mode 100644 index a3a9445403dd593fd102481019356775421d5b8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10038 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

    RT~@@YGlUE2+%PA4fbM9pxJ~)@`1y5 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

    qxni_bg_jG`x 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 ~{0LOa+ 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 QAt@M=f*~pR|5*zDA0nY*Q~&?~ diff --git a/app/Vendor/Ratchet/vendor/react/react/resources/logo_huge.png b/app/Vendor/Ratchet/vendor/react/react/resources/logo_huge.png deleted file mode 100644 index c08bcdb27b6407680007b955598721643506c817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57139 zcmbTdWmKHY(kMKG1t+*mAV{zQf;$9vcOM3KcS~>!!QI{6-I5U8b#QkNdb8hm@3YU3 zyY9EvS3hR@d8VtnyQ;doY{HckB+-zGkO2SynzWRd3IG7x{-@oCi16n#%y8D^&ljPK zxR#5my_t)cqe?a*EV3}E}X}M_0%khHkZJCY#>ci|| z>+lB~0N@w$a4-g2LtH3KAm)~K0+eU%-INrTrUI0j9P%vk4xbsTZoG>g@>(;oine80OkMC<^9wC>otgy;(xlhSPM}8@1(Tkl_);h zJ3%Nom|2*>ESxM9oUF{OAKAIMxELweSXfy=ENmcFHYQds-j8g&EG!g%1LdF5oJ`Gl zRm3Fz9_!DO0HuYCivuqRhy zAO>*;J6SroSlZiB{6*2&#NO3Kfb!2w|91(t4)XH3Wr4CG<#0Agik0omIA zwXXl^?d+lg`F9%s*WS)*o(>R@3dGso)d~DZ9%fYkAphar|9hanI{ujrucDLXAE6lA zh}nZ(Z6S6p(qaOXe|}*$wKU~rVdZ9FW#wXL;bLRq>Y9pK&e! zjQck(*Z&ij_mdOE*u~yS&EDST9}Q5luy?U{wy<}g_@v4~A#V(}wEOG%FY)~EYQ-Q< zmTnMJ2`777ivQs+ujT(`d=|FM2K1M5{Fk!)^XiWV{?+`C>i>E8 z&*p*H{n;^2f3`-E4)zWJund+K6H)V6I_}i1aMgArV;@?2%(yZvduemk)O2@sZ6?*F z84xx>dP_+e6NdE;UOetC|8}4hB2F%y$^gnHb-2e*>`k;MocC|}^XVw;Y-`@RFFTpw z5Spx1omN#Hmc4qtI4^rw_qL7lbUSK4K0(yo)m@{N*L=tPZ`Z7=Irj9HuZW=p&|ykZ z!hb;UrO*G;aPsqGv5QSRyI}LG+x6wh-Tp$Cm5nh*sROCt57ms_zr0gAn4*q3~ z?3;&jjQzyqvk8=wy&|rwr;#Ur4v%|pC`u=kSEBo~9i1ecN%g4Tg7AAC6Wx_Cn{OR1!tk?JOn8J`+5=5c#YIDI-i{Jgs1Fu1b_K{wUTAMtTn zA@Aao8@##@IIK^CCUbNyI=w1#%?J@^ouvEqshn7!R>-^kzdWq&v=kV5j?Eh<9bXe=s0KFL?Cn@Y?RhLr4^GGK zJ8;Wo51zQ$Lix6MI(jsF?%VqPB*(|eAqGG zWVL&|WC%WNgi0E64RO9gwIu$Ap<+C$r-OFmD*>CZcE6xc&9JtqcjNE`VV~XmK2~8x z6PYCpu{|eXZpEg6MX*P%Q1)?!iD1PD0!G8oy&~^qRf2}+S;_If*00lP-@Z%*AiDQE z*Ck^%jDCj+U>OHkA$;Eoy!#k~ZG6uUC$Q?mv9%|Izd@$_RxAY-rwJ+1iK!zf`=lUHPK|lYotS<9;iQ zIh2CxZ`hiS!2}(@ncx$NfVt0;gtzGFc7!!UjQWaJ>7e)>yzYg1Aq4@>*br>rdV^PS zqx2LijLi(rjqOvIODo#JGve4GL<2Im@F~BR9akJ;&H>cf5hJ8EjIzc1vQ*J(2vUZIROTu5UNqpMV{Z`1n=X|~Z}#Fpeq;oz8Yb3+)ro*`S{CvIl%XI zd}Dm8`qm((I-Xh$n@MGCmcQsI^+6|oQvSdA8Z6Nf`bpBcxXf39URdm0i*W8|3^M>@ zQQ+N`0s1;xDjOKVxMb*wFlu4FpsX0a=1WB#K^wL(=v_O5bF!^R%*}q<=Zd^f1%VWV z%2c`!Q84N_`m~LvBGP1t`9*ld0rH1L;-nRc@8Z8c$YG7nB;%LXZcysLQx8o2To6Y! zALmxoYqQ5CW?%@1(Suhw{`FokWqGfBcmn{VK#1h_k?n8jI(MWK==eTuSxec!%bAq4 zxFus4#qf@wYLH%r>7X&H7+xwO+Vo4(c~zLGnw%>`s+n_ES}O$5kr$9r5y-)(@I|2O z=qL0Z0XWLkb10&a2UMPHjevN}zprT!)H0ThlOF!Ik8GCcRd*&k7uDMG9?;bs03Nl# zFY+RkpJvhf2B42)>oS9DrIg;M`B%{2Cu+&PJqB&GMKVj`Y&%%ORC>`gS;8osSvwr1 z>?+TaGM!~q4{fP?kxg-zuzS^j%NCkc6%pT&~R^ zQF@Dsn}oH>qXlNObaWSWq5Ue^^Ng)6Scg;dD{O>rFD|z2Mwg$WiJ6c!x}sWPG~TJA zDmL=#-`IW%`jq@r6=ro@xZpu~KD*`{!*N{W~m+3tBlp3X76U&)P0n35jp83*VP% zG>0+$xK8uKV#9NNm;$^Xzm-;#^}~guLG$puWwnBQugIy}QPM4JY*AT*VH?g{MxO@I zlT$S65k0wB!}Q&-#8!V>q>(CHz)1}{C_Hq3u_#I8lyd1Sol?|LinLb-Ubg-6s6$Gt z%=yyh*u${SWK(}F%hYfj;(wAfqVXf@^5Xfp*5_l#?=)H=gK1ek70l^xUj=5#R-@qB z|GBjZv%}ZF!we6H7(`XK$$~VbJ@yukhUyndIr~x2?NOCBzaV!2a5Q?C0a6&D&-3B! zj~~-&C#nrB{ax!HouDHEY0p|BS~7`TcgdPu)gnYR?qZcNYMA=i*lmwQQFq1gH<&K*g<0suWnSG-I_mBp^NkBcFH3U_g6by zFCAu=5V^#TYgQHEH0&W<2;pfqDy;8T!i0}rbpJEV-4t%+Jz@HO_*4&9uiZbo5)uiV zn6zsyj*lO$(G+Sk_p|o6O^CIx7?yv^CMBx|brav~^!DDbWRs9pqqVFXFMQOkro-4O!WHsUUB$oc&gxZ3++x*DA9sck}sCC97Y z)G%QqY0dgUXyD=DDu%!}iGxgX))-bl(aY$?O%W2ezIjm0xyf|&G+hb~an)H6lhQyx zGw5SSrA0gGjym~nNrwuIMU?0d`TD&cbgK9=MVo4@`#tsVjy*q;-ohq>b7;@cmo!f& z=L_Cr#;o%mVE7k&&>9JX$RAuvHIlngLorRUOK40&(Q68c`nc96Vpe#=LGn3H*7!k!VlPy*0H%SuQB{Y>;UiS!t#Aya)uR~K6;!tqm`v5#W8%18Cz5Q0 zT@9aH;#Ip@OOPuIZ!)&oL|8A{4GJub;@siDFKifjd&JG(@&=~8HZoK-015CeP^Q-0o1_2j?0U@sZP5Dt7gL+;83ZKz9 zJ!bAZ`%LpYL&;}5GnekLx{3d~b5YlKq|f&!^NZ2WL*Ave<{>l@1z?Z1VX@igdD-H+ z88z|wpuI;0)ChE761;=$cPFoIrqy%nznv5(~dY^ zLZGtY)uQcMLq(5=r%*lfeIosR@LC=B4vYP{!EwL(aWUle$LCYtHxbJ7>#bRt`{0BP z$%*#5x(`arLDw>TcN#EbWq^15+g9o@@o{(TbRwZf_0ug6fdN6afcVI#?SR0QsWUZ$sbtCHqehn$i--Xi*lL82& z2DA>}l)o#$LbYx@x4zeU)<@)bV@ToJIY*ADqtCOm@zyR!?fQk9qnWTz$Toh$y3+j! z+`r{}=$mE!FH6&dwTI#Q{9+n#F2N~)iPb|Uc{LrM%Ubdk(c&EQI(HSFIY4l@Ttjg5wJ&BKSu|37eU6XZ{ZN&XW}(%k?quTf)SI zNZ>NS;6|^}Pp6z+Kd=yfwg_&Sty{~ZJjJ@t+G?+q;hV93FLaS&BMhRx)*l_D5e~Q* zk*$_J78x>dD-VI3ezrg_sA6zK7$%zX!nExu134Wy1+D&bB1FXkJsyGQ%%~u6X~h>W zRb<;THUprz4w``taUqke?X9S2(+AaX;@a8coh40%sh3eeSeiu@w{X=!!~lwlrO11g zsB$AH%k}W)(NE{Y`T;E(ps*=`FNtUHWf|E@8;6_e%vsI@Ak6S~hekNK8jQRfIKbL} zbB}|lEZuGZpGP>GCw&9lB0+2v)Tizfmzn-$syx6rjbL34!}`Jsqdd%u=8;;1)6o&SDIqQPhF!UD2AV zI-=($@UL7?vmpnyUzO&V85`pEB+}49o=rS?%*zY(M5ya>MeEJ&pN+2XZ6Oulaa&S$ zU<#-Zj#z}}I)J%JC0`yZ?Tzs`9n2o$0s|jqzslSmVsLdD!NN5UR_!a^cU)z*Dn_&N zQ#4P=rPPDeI1h1;&Otq7iM39S>`TWJ|Y~>@8IX>oMdjjITtK^Q{DA6 ziso)kIgvtV5=MV&?-mNeAimKYwS%6{U_8P?iT(JftOVQ3NL6UgR$iV=hTHr5x@Ny^ z!w=w{f3*1xvcGLuzFXQ1vB@@9eC$6bs0trM&9e$kEKO+FNV+}wHo}2IFA%ATuMvO= zNUHzIdVK2!yt~O%w`{qoR#1}h>O)>hoh%&O)aut_7FBN2)BTz4Nq~)3fq9f0fc-}n zH?GnGMOX&(#~hLLx^p(n46*ADQAPVS)DW0CvcL+9-{-qAY_0#Aa*Y%*_x|1;b@$?P8OXrb3xeYEyUTT8x+2nZ}X2v%& z3Uhv*&x@_L4TAHm;*hdJ$tKno8-=o@j$4s%3%FAyg3{a-gepAY;ttc?jDA<;jDu{V9ypl0a=Rqm26}N>Rp#V z;@e}A=Ge5>sdcC~oDGIIQ{S~6sH^#+g=8^1Fgzq&VRvx`fyA*JFyNuQEwnJv&=lzf)W z9N_M&%X?N|*!EE4>$O&WhrRP*imOJ{^nB=k#dy*E&f3F$aoqhES_K;{V)_wta^04l zm;5l|^e#pgeS&1qvNA3Wy+A~~k&}5ZP6U^w>u#O~|8x754Ld!C?72aMdYM4oF_SMr zhc|-*G9VK+sO&fue-4jUq~3G7JcnH8v#v&Fu0cw8BFv>8dguN#+Xtg6xUv@gK_Uiy zASj8kt@!oGAE$LU6aK;sh`ado;I zar^jOIk=r|Rv@hYPuyz{?|h8-;%bizyFaok>$bK=s0>=$u|@^1k23^PG~=^a^@Jn; zSYnoNm*E`2UzPP{AIMfKxo1F=qO#UqRPT9{l-QUJ9)6=O&LF0)1W%9NeualolU9lG z21dT(OUiZ4LR|FK}&?^~S3$=1P`s-y)8X z4W}fAo8sIX18VU?!X*|OXX>wuVX%wf)5L1S7Fbw z=EyfvBgT)Y$LP4e`&Qd6I!uK_THhp|H!!c`f6G?IK+usfkLZE{JFzn!SgFkRALlpw zir_BidEne&dSjwFlb&Bp>#UsW+fTb0*ogVIa|f}jG_)3G2{bsrG7MWlb|fAymqSp_ z2SIxP?f0dKrpfRJ=Of2le(lYBC((vqFoL(!&{*Zgo^dE3TIFcheY=R}7kigl+2$Y@Jt>Iwlv_e8VdVOWVJ9 zi{Cc@Xmr$T51(s>+-taJE^WQel9{?jB$(NR0O1xrPln zs?#<;Ta650c_NlZ-9?=!1q7fWej?W^&ysUIt2`aYeY0LuoQ$?S;s| zB;uTp(&fvhlClKtst_ zEeC6WbIu18`jHZfqw|cV0B1l7@yI@~pehO-fK*dO!VYuPHB)o09(ee`OYKz9=_HQ& zeQ-=(FpGjNNca1p6=tQj03oe0?i7PWL*Sl88s--r*SaNVy@pzK(cDD%aW{n-nID?H zHpJy%w@;YZkb=yb>Cl7Vc7cF}X4sCRKG7Y3Q$707f~vDj}Y zk}JbLVx7PYj@Zzr$5IzYv3a(-?vkyhkBc9$4c)G~L*<({$bFwKHZDf8C!HS$H!e;x z^2kSCsP;I|mNVu-rvmA(-M1gH&N{Bp{W0;*e*I-r(Kal)SWO>(@h7PCMP$@=0G|k` zeBzy>gU7}h^~(KF>Q(dL5FN)>S=H8z74WSI!Aex543|Jl-dH&Yj_Xcqcg4%l@`7Ky zTT3J72mM1x90$C^tylE+n?gN>ra?=DQHKEslma>_OSZf}bDw%aS4);NpG{G(A+N z9`7{PS57dhaDaQ7Jgc*+LTF8PG*O5>fYiFIJ#SNn5L@t~D83vH6$Avyz-URNRH~NY zO^D`F!`p}~gy&z+PnoX@cTCM@`q{NHxe}){PgfsHkk5^}IVNb2DMx@nU6mQd#xs~b z%+b>k!CZZYhd6Zm=?08`OImSQ$n{{209`f8t~Jd=5i7(H?a$_LCj%=_&e18jWFTHp zq@ua7K7a;)ud0a|o}%`UT7$O48#cfy`M^!=e7U)`+?g(){OVlHKgV(wF@XnE?qF8% zxG`cpf9LYCqqzPkynGe&roZucm~3@*ufm1rKXH~Jb3Wd-&OW1+%q}()O5}SygD9SC z!{hz6)%fO6!?VO^uVNi|6oSI%!JC&IV^wc^k4vLmb#*N=&ffl`woe#FfZLN2%f@At z6YqDrol6AVrR&&_N_!Yt(K6!UT%W3~KVZ{n<8rCwz!PrtK%0CdAbN`*6E%1Ufa}|; zvRDrXV{%S>#dgNO+Dyn$<@B3bLRTF+uC8cdDHq2#O>nPA^0Wl}W#(P4pPn+%L;IP^ z#rJ!O?I(X6kQ%L1fs8|5jN8{6d=)Qh)fw5nT_L8ORE1`N7q;u&)M%!Iv6@J6@SI8; zL_HC}%;VB6-rB74_fG8+{>+tgDT}m{1&AIZsb9{AxH|I*7TN7+`-ApxwA+71#I(iN zdy|rqp@P=xaFn@P)-Tr1?iHG${;sknBPz5+;aQPn*7i5 z%Y_62#vVy6QAkl@{LlJ_UFz+rd!o8TYBW37?%?HIPAO16agcSRFlx`?eBE19Y*^F| zP{f>Oqwjv7_Wo0Pmc`Ytfp@x^SyXd9h>IhLMziB$2=irkn;aS%aR;-H<_)WGJNZ4Q znHd>V{;!6wSe>t((A<;r_VoE3f61E1=d&l~RXszc5*YQZw3kf(JE1&xzXx**_j=X) zPx{r@4MM)wDT{nxb}BYI4AJW1sF3@`dc9ybKA7F{9yc1m3S*-1WhS3H0^lQ;m!xL> zT*EuvCOLmbnqYocemo39E=mS2*`In+F~jvkCZV0(jX!^StX%%OJzai1O!87MuNoN{ z#(++&M!LVEtqEXnj#ba^fZInygzneuUn|p(MxbN{Zf@J&`={skppao95;Au?;9&B| z-JF%4p`mYHz`w!Qq1bm39y2?mfu~t^`%Sl8YVC=THxWBkg%L@zi;lJt5VVY;G?~;R zGNy^yoaEjY$@=am$|Uancs`)M3Sj<*B~9=ry~+D#hNI0!t)i4L(zg-9>$HS>TMd3Bxa+bJMq;p(RDsmr@M}h0%Ni7F-f=IfL_>v8 zQP8m%0w#3e&$7b{AMMhq2G-hXnIF|vWM^N7Kx-JDU z{QxE?5hnVZ)eS&8ag%7S_`@%l^{pJ`k2QZzeV4$^QzE)L!*_!zAEHFs8q|GhxV(ug zohqsov5RYiqhTgU0D{OJo`d7c+k8hr7J!#XE!}E%+3}Z*Vdi#M$R4*>rBRU>!Q)5V z9_w3`3Y=o9njq&>_1Nco`mZCSI><~BEi?vNne(+b*tO%LOZJ*E391XOD^>3BJ!SN8 zXnwY{FxtZO%7l%ILo*ljg|j(WG05{#QG$^Og=N9QYOh`gx^o(mqg_%XS&xn;cfJ(6 zN;wEjrkzn%{`Xp$=i3M1HjkGlZ214Oe+1zNmhpR*KUTgJKM4`j!F(W8Zz$s|mkCMP z@U3h6F>D}L8O@lcA$p^~pI({n3c$mw&}w3M(B@h?eq_GTn~c}+TvIu?!R1Ioc6bwY zNfgjXp{b8e9Kb-d9fg{I@?j{;SeaXsOMoknD3CPBkud;*d|mNlyp0{u5I~7Z<1IDP zr>$;^Q>B8+xpX>Faep*qAdDl^5|d1SGxr;3_;SuP6t1%oiyEkPb7Eyp4Q;m(DUo@f zu*LYx1KzK!C~Jkcxmo!}k_N3RQ9S-_l%}lIdS`^-Kp#!(#_8Q|aYZ*}lxAaq?Kjw8 zaa#E09KUkH6kzZ)L=Tl4ma_Rh<;Fo-<5uI@4)6bye7nEcS}iU3y=f-Ia9OwfMkhr! z*t0RJ(rD3%>C-i&V$#g-WP3(JqvA7zHH-XlhfV)z6Sv&1QaHRi8ar!Evqot$>}}GF zwM}cI$}R_mMBp3C9PL0Dqu9yV#x8O~9_}o%8JILW;j}Q)0pK@@C~a0oHi4WWqBn&0 zlaM2H3Iw?iW3dV`3%GM|jo*KX!&|E3MBtpi507W{2r7H8{q&nd7~wY=Ad`36$fi^@ z(Yyu0#=nswSuULKP2sv|E$zqODvqYjOz9`RzQFh+q{`d&fz{QD!A7Zt)#;79uzhov zWtjKig>AEz{9#4O9Ph5MM&HXgBd&k4_Nwq5Z+Nc-T1tnMk~>$9VN&pnOoC$$#|xh> z5YKl?__c`~Ot(_4PJ$Q_h1WG>$1UQgI42jf32%3GVwa@glcU%^-kQnOt11IbM)#7$ z1F`hi7+6uhr#Y&{+XPo7DU6oc=?A{cP*gL~uTHf#_@p)`QbQa6^;P2l`PQZh-XEEN z$VxQ=*H!qJniANPo2_N%o+CGR_ltfVEH<{5K@}Ehh@%*dW}+A$r)sj)(V7u@@R$wd zV4zmXgau?y&@pe9AfC3sJID2arS+!bDd`8T<#|R4jkB<_u2}6uBkofRb+wF%F_uJU z>W`W>ImK-LqR7a-cq3>mJ=T9be4mH_O`6Fv&*??hq&-eIr5S&UufL8{NWujn@C_+2 znihBPM>q-L!BZB{{zLfGV~MqJ-N`nYWQNSdmKmJtVBm@cuBj@nb^HnTf%)e>p z`vkD5N46rW{W8C1K!3;wO2FF)psq|xbXzt2XT+cs0qzvft2Aa-&&hPLBA&#ZB!>937u|n0Kuq6l z6!qvGjV|R{v_Ao7RNhERuGv=z)YXT;RwM<_S)P&0uB0qm&a$VdKou1e{ukb-15jzS z>-&KGo~+s>$DOp04^B};>6b>P!wa`qkw>X6VB*F1aljD@kAekF)sTv+^hPZVw)6r3 zQ@WEHic({Mou{&4x*LZUi8pcWRBEP<+m^d4t0ioB=QY4($vooTvkcNgeL-2#^A1L` z;b77_L{AhrqI1-O#ACFVGMLB{&Yxu4U3)l-UNt@{R9Q3DVBl0OIP8TJ`5~SL3Abl! zpvOr_6sF?F9!%but55ylUP=^Lw?mEjG5hd74H$OoE9B!#5@MhCIqNM4dA~~H^Z8IG zqaV~+S`cp*G?Cg$PPjTkjy>^jfyae3Py@Zu*d_x@xrA)+s>%_ovdz2gc?lq;h+>5c zCAbe^2Q81XP@_lrMn-hLe9Fmmo$qvjoYz!|8M; zS8?Cy&!b4^1%CBKL(!|oZ>%$Vhjp*Kled{_Sh!NLgdzWd6Ht0{#)?jdw_fX+% zm5-;>uW;E$!FJrix_F(>iTm|u?irK}@0K(pKJS{zxvr8p;Pi1kJ6j0qLfl1t*Ic~C zxh*MBhkg8VzlG7ge&qKX`(?%O32vNes~(r9St#|+cFbC0Xpj8?Sa^E(44`StH^}<* zR}@zg8=Ls-GNc)UqUo{F*#16x!?0Zn?7n#Xqy0?Z&l4IeZ*N>|7tEL3{s~_7y9rOv zFsszSXeErRBxhFE&Bu2a-c-HWHv+ZFse>BhIj*d5tpIMD-?p$TC`L7a_HX++yCZoc zV%m3=F-Xyxr*;Qx2XmI&n~tX|Jo&?C{=!1{r)TJ2w=3%E3&!jPn++s_{PTxCGwd^+ z9Uk0(I>qffpPBxY{vmUOm???6JUb}1>z_qMRuDD9R-co=EOMOb4xaZtNuuyvUd&p@ zFQ;q~?Exy%oJGyFk(7HID=L-C;p}=D;g2if7nuo-;JXGiiRkdWJXihTYI`%+&^^Tj8(A;_-di=X-v9p)a(YPImrm zf5j4_qQ;HojKIPydwa>(Q?l-FdPXD(4cZ-TO(gM<6+p+G8zuCLYVb9M?CK-*;Xp?h zl6@>f>Lstu=+#C@Ma=~>swM242stPT2(roj^Ds1Ak|n!4=WY>~+><4J5GsO&pVf^5@;}8XxxWDn0}x`c3@g ze(cVFEmL=u@YmG$L*A5;D`T8ZQfy~4U?VHb8<)gU+R&nifQh7Kvu%QFl9`yTOw8M$ zHF7EKOeY(+kZ4b&+~Sz6#kLiI469XQqN}Akc4$A6a;+0oYnB(GQB|n5PTnot_R_=K zvt6P72+>d>g=O)NRcRSp(J@!$1bIbov@j@^oF~Lqg%xTWHixK5L#f=3Eo+eJ@RZ zBiPp>c*u=X`p6G6<)NsY@P#eHSacg(@K@RH0JR!Rsi+U*M)BCm#`k?e-`m=O%Kx&p zz6H21oC|pSi9Cv9%2dcQFLe>HIBkE&nJmkSo+`{JtVkU-X5@AdNNz#eyRWagpR@aQ za%N0eY7u}R2!gA-anDz%STF#C3Ic-R$|gJnvmA5<+-VcuZ}$>&1XKXiG|;N%#Tv3$ zYC6-uY-*cgy}v~^>T21MP&*9Nrj}hO5tc*(>JHgehQ0;hCUuN{;5m=t7NRzvl(MnJI8ckRu27@!rl(k*YXA(~7G0CqMt-w~oj9qIK3vJmiUD9aBt&`l(%Jd0&!|djr7ghDZi`tYMoeKXNPBhrdS0c%z?MXM~G6?0+1KD zqD2~cS!v+XWU2+bZkGm~<0CxO-9OAQR#P+L7;zZ%r9oyWHL`kXF|x#~CDp8(P(M`R zrqh)+N5GMFBRo;^>Fq_kBC!+Z#JsdyMJ?3t+!XH@M405GU7h)OsjCFKSk``}pB=jD zD~M75bO+V$_2mQ}poi3lYgR6tXyD$5vzlwnbCTA-* zFZvvxZT(wxCxqO?cY7|_ogtGxEDv5rY?jYYt}%Y2kSA}kiiekDmGY^v)nFf!Rk)wc zj40~6<5!~&H+wJ)hwv3ZL7!Lq_Qy2~!q27?9axHA7c@e3v}HX*37a~*xWk}^AFRiT zD&(9c;-#qZ+HW_9(?6@&_VI*aD94U3=`> z%ERLYpNRRN*M2d({dXjqZ>@qSj&tH}Wn;!t<)MvC8=B5^555{JBjKt@S?%2R)@ty> zJiX&laJ6qcBEPD3W`*Xu7ha<8G_9Z+cU5ZV1R7<_kp0R@VRig$q+_OdFbq2(;Qw%a zcQTUxuYO1ZJtRLbcNLrO;k$5?z`V62V4$rUI1PJn*FOryC;xtuivF7H?ppG3Ap#i%;9|l0T?crl`?X^BXy@GPS%Nz;;qN>Toh& z@?-w;^UFJH9Sq3dS-7VX0BAhm&Iix|>h`f;X*da$-?Q^5tETvp`^)X6Hk*m}ka>o# z!{H)c9G+;w#w7MnsMt{;Iq5>gEp(7o#0r)_k-I6=cKe#oPK&Ckt^ZD=M1NUOf%#?$D9a>0Zkp52d3Y(kFwiSd88;*e{$jR${iDI-|D!y$C&HtQqNCg z$U~X$Q2dIx@t&PR?h8i+YT+H6bzL(I#Acov*1<{+Qe2g*FRSYxiK|vT#VqD}@~&NO z_Is&5EyLM?Xgrq#XDnvb-S=kv*RerHojHd0KYi7)seRk$AHBv5T;y;Pq2KuEF^2_x z-wX9jJ~d-wAj-yB#DIpj8wNB}W%_H+31F z+Syv$`8R3g2MtKnuq9_zuoz4+NBFA}<@wPaO42hV8`)0}KoiwXd43Tt?l)`f?<9gr z-GNSv4Efs4TO%~nnnp^64^gxwJcR6)Dqy2cNKqX&YlatvG_poQUm4VFkMa(sGTr-s$Eb|PIq^4b`?oZ-g9yGEnK&j z$N9ybajW@gjCp$)R(8Bx_c;j0vQ5p;=h>}(Pz3n8V^+!@t=g;~usH>y-!J7G#}D#E zQ^YMx2W)s`hQ8zk^2W)Yvp8+06tIA)HkM|ymv z6^fU+`qNeamVx*uycx7J@_^Bo-|DZ1=zIhA=>BaV+I>4uGK97c?EH(9?cRGZSkp~$ zuI6agjd9`(MT$Y;KBv z)E6nf^g^smdnEH!pe3HGx_OZWfrR_s?&}>a8Ly#V*ZZGiOh5C1FphHHu+X+;c-;SP z@K1HCD@+5vwVh%cC!L-iCZ7mCrqR&M^=iqOp8mLWQf;|=h>o6tlk<^vy(2moC*gr? zJIe2B{#Ef|&D}p8Jybw?!f$advErL0qS>2u74fJH!qLlo@~^*i4WAKKTfOZSe1sR< z5t9~guOBr1V-!x;viSsTImy{>EeCklGKt{&V$4LcTyyf3!) zx8&u#hsz9?QWWIDw}qf?jwmP#v#;UVXjfI>@4;u5V#CL|@#*I`_Ndi-EsE7!Y*BaK zid6@jW^hS*owb$JGxsw$=ZS8eUKkv0k1u?$mzoAn{588~kdXJ~H3Dd)Upd&F4Yh^W%E3!|pY_V_2pT9liKNe9ypeeXre>D3p= zh;G7dG?Qx}yYM5yVcAc4N3)~LNn?KMr}HplufYJzFY-|RJzwc63t5oAyVy(PIs9f1 zlivAgk`OiY@aNdn8yS9U%L;Cm8%Gmd(dzre%`XEb7CTx&bIfMEEjQUo zzrPth)!68jK61l-Sa+2vbC@4Rgn^kf5+R>saOJul@0F8fA)90<_~w@uT%=Q1sotU; zZT?$8M#Vw8BEj{um6QW2CQ@>lfprC3mnnp4!&4&Q((Sukxx1n)D$n}5;E-5RKKN(us?U@Rn&DX!>E~FT6SChal)Z&kKd(PQC z1vtk_vXyw$0tQfi*$$~s?TzmI&A1FMC(s4Me)cWaQt^oD)QC#42+!(+4Ua>KIo5o; zU?Nlp-6rmFWN0V&p&1UF9YmeH>ys|ZreTtNga?pCXpsSbyh!U*k2SMDnm(S_L#^x? zD|}c^W3!R#a&Szw`R^gmK9P4pd{?n%2g6hdK7U*LM(fZ zXdl16mh}LU_qPmJyOQ2R5j;@B@O5{WJKWXsN2Y_q5^MF@JNN8Er`71O-Is)9@!ho#Heba$jMqbSeVfX^%Iz)--xM z!KjB?tR_10i;3^*HPn*!xhp!sm||LAM{9sg5v_A)v#=_>=rA+8yjWVu!oe%(3dgPO z^CAZvQdeV)l+N(gm|7ok`x=GteN|3E!#Tj~)ii^QmVXfVxWBM+s3-ZWHb<-`fw=9P2&-R7&++DvCJCP;#fMMw>iC>v>c>9-Zj8_lwClrn zwSFBPFasIv>OCrCaqqC&jhm>KE0z&uS!;2R;_|)ihgG=FjfB61^>5EAE^vhL>ERhv z*UiVZkfhqns!9P;h2zSR^F;hT1|6H8^m`CSD21t`5bWuX*o<=YKXg}UqKHYy(Y*@_ zk3m#xz6(n`YH{6ISelq$9YWE4YNR*7_0W-4b2yR0P&I3g4LuZZwl2NDjL=6s?H7B` ztlnd)?qZmt;{LG*be);`ubTk|8e|cy(e7!Mg*F2PO5Mo5H~pmSu9NYJI4uLmh!}zO z-|uhXLa@~U<@Du+2&O35A1DKxD%9Va8GajSb8q;7flb#M0Rz_@jBt+ySTIr@3v^ek zxv`JZ#yro{#y~~rh-u!JZ=C&rwO?uHeG?1>s{pz`EClhVtX9-lY>Vp9_x>cn6r{4I z2(V85n0^VN!Qjpas=k?VErm6Dia_=-emUY*`yD$MY4D9csLwzn9KZ8hp)Xnbl%?EM z3EA2*Q`Ov}fkF4Hfzin!2YG<06b?o05!`e_K?a<2`&{X=aIL~gn2tUs*fuyzPo?bE zz&XPr(7G8KciPgFU?`Q$n%p`dCS@9oBX;|5Hpr%jFPUA)(@)*Yyx_R0&2@cnB#ruhST5p#5jG6a0fNG+>Pi+c`NX>%FTDv8IZqIiY zTKn~p5m0K*k$cxI?)uw)$DpN`&p`bL$Vh?P#dbF&Z+y zI)mXQ(NcyS`#PV#@F4%#yJc>-E!QtCF?%-*`N_6i71PmpOf;i*Zjtj>77#tbB3flE zK%)F!$(z+{)OIs#UEY}RvJDg!^!|A&Ej>aF-)k*0ve1pv=kv2p1)uf3(wPmbf77g5 zv8UYYC&S;&JRM%gi2G?S3ysU?lA|f?raae_PPIMCtu$&ial%$9O;jH!7#;_gtZ@Qy z*xFj2CHYc*>uCjQoBkiBzCxj{Z3z-5xI4k!9fG^NySux)yK8WQ!vPNNkl^m_!Ga## zW%Az4yLUce_g>wrtGcUJ@HNkaS8Z!gZ%4`2hbdaeBfnd=VojKNuD$KFt|)_q}&OJ;ZbghD>zU0aUXTLpQUnsTtpK~`WM z{#*{LBgecpJ&6E@j3~3qsQkA;9mDIuca~r~JLoX~{K$6;B)}IcMj^+#`jeaAp%1SC za+uO;{7hL3kH4!sCEnUWimeNqr-3fnZ4zT|ZzmY*AV;d;L*6bqHcQ;Ju6jXYu#K^+ z*Ww56+xe`-+3Rqnstrd>1fibtk%Os_y87Y!$2_i$v>y$BJXPrG3-qTW07&z3mJ`F* zL}}1aqKe?ML?fW*{0jF~P`Oi(YEA;X}kcs3WUS&>kwtcMwB* zDpoT!qsM*+^D@$a*MadhlwiRS|CJ7+R)+2c2$dSxe4Hu#`RKc|h>u_PK3T(zf$V+u70K zNkX(#Pb}ca8+_b@j@{(q>dFf~c)f7VsjGv7_fasI_pPQDX`%jotM3PN%_fxpoXd9ulIG(`>C?^q^Jfi5@YmlN znJuz>LjFqfBama_YDkChOo3{WQy9F7|tU})6sq1sfX-U2 z?#}%mvp_q1&$qd0O$un0I1BrN{(byUACJ9{I0XVeH$upLh5qOE7XP~(aRdfg%*vSO z*eC(t8hmf$E8S?{%gGuJuBHe6MvQyS|MeDm zL;>xqxq-kT#v}rw3jFY$YuO~Dr0Dbv9t}SFjthRZ-EB4HU94qio`xyPppzjOE2*?; zy)ma$_1$uDSI<1cFJ>Clg38V zq9vHda>)vZztq24DR1!A3Co(vPK0`FQk?u%xEn@3SC~mOQ31W5+UgDnBo+w4%?3$O zvE!!U{;Tlv5@fR0a3!_U{Y>H+RIR;cm_D&001cfZZ!>)n#u0%K+q}#UT2r~{z(`%> zP-W5;wuCPzD{W`~=C?{LPS96zvuO8*omdC5U=9>KX2q33T7>MQj?VF5$=AvTu$_p? zNdwObF9~bl;$&>TKN(ENBN9{_pU#qowJ`Pd3&ptDlUB&3`g0ktAD=_0N-2uOr(izP z!uFdR*~Yen&?#cHw+tllW0Q7LY!71;cbm~#u=SgmpVoPu5Zf++TDI$_)EnTsy<%&! zYI51yEHXbC%%=aJIf1vyXq=FMm<4x*?ksh~wlUOv`!jbLfP|N_Hh_NPm?IJg+I*J1 zNziF^`)0Ef8sRR#5mydfSC%si=^S2v@oOXu;yzK9M^McTNZpg8mRj7zBr-ghVX*Uq zWTHiKR{9qlA5(+IVpNj$LS3l-#N_&ohU-2xd}a(CiscBV>nK~J*%UR|Y(L|tpYs-Y zI0mVB0czO0p(rf8pU-lnJR|a+h`fS z+DM*E!s_FG`Y|^9iqX%uf5u-BBv~tXWO}Q(qQ*@>9Q`bJBVEi8a{Io7m?-4|_=g%T z%{}QCezkj9T|~hVD0?If$=aw+V)3UO!ZH(B+O(`A|IvP^M}mRPPF*XKkmIj@G2sGX zv^-i+mC?jy>}1X*Ot1Vg&ZQTwCoy7Tn)c%cd)u>;jKL=TA$3vY4JoN&QU?pwf|&kn z?K?8y#wyQY7-kiOCQg=&c^fm-m!lIWT3o^YVLmYK>O8Os^D7{ysXaZcLj_ped*4Rz zX$pJ{VSMHuV%Q)Z@re?L zp5K07jjv+@Qp#x$<;>u&-6@QxiPKqRw)AToHYpY4E(J>*+K8A9MU8t|u*dvv)&>;g z3@4S0krT9hwHI(qL51YJxs?pnpT>`nG;670MaI!XyX&76_Q2jpLoIx8DI<(x(jJVnc zp&;M|tm(2d)`^;7|L%evUV~DHsYt0rU1f@>VTKOfM#woM zU2e5muA(uvW^@UVbh}(C{!0dKpT1mKBM{RBa=j)($@uUWGZ<+PNk(%I1KWJdV2(-) z4OngoI&3YP&*p?J*Vc6`s;L)Y&$T051R2bMO2JnQC`a`4*Y)4aoK$I8xCb8Ch~q;o z(aW(BbK^X<_pL7l%HMj4pjLu~$!JV%hbsN**#k@FX@9G#c?Uia8YsD*3}~Erysra> zxit{iy}fHv618w=z+s7c+aKbB>YoneSolcA>=p=W?TB?d8ey};FEF8s+BB!+-g-ogWpZ|r5 zWN1<5--bj|AB?+Gbt*y-Vb2}PaGYe@zv0Wu)Zk4~BdS=PCqNUI5Nk`0K(<9avDe;t zpwx~Em+fqbMz|on2w_OY)ls?JM*uF1kQXon9v=X$(J#Hc2e)e1vR%^g_bLuy_b zf{=6I;(44epwUa<0E)TxPfW7&mZ8V&!tgL9E8qjK* zo-Nieh_tG+W6e+giB zcKOT^FXfp_w!h@7XEFL1nuMzvHcjRq&FvbI$<>+3uS!B)idh9Xo?gC4Ss#{LCf{a) zD*P2VsScfy#>tj2bID_vU~wW3@y+$cA+*~)r(E#r@{Nie_p$@lfC`oAX9dH|z0`K| z6%QpVW@0<8Rv3)!bpdz+3ZYs(9r#n75AQ6~QDOw-iR_y1dkuB%NO0AGIu(o>i(M@| zpLRbk;r*srom&&Qjk)hz%Oy>H78v)Mt6k`_TLWy36Ogte^a0IygR zviB?E$M>7V4Zb-RyaYcRj_@NcX9`Iq#eWCMwL=XSzBZ(=`rvf-p^pQePJB-FK4x8% z0V$;Jvm%^z7hf^WrA+om=U;YlW$6HP)n~Uu3baE#?glI1HTu)vIdM<8+;O>XyWSH! zBNFE1(D zyuKb8b?tRb)Eu+#8oORW{9O9@OIce?(L|oSyrlkxB}Xe^bnG>O`zAjT&A1`R{E$2X zsf~94=?A_hjeJ&KQ5_rYu7*gc(TYkll^gcW(yAv(5gsgvL^+W*P32Y{+h=FTYNjHP zGWAq}OB=T$o>La#lBGmGfluUm%T97esH{g0l0 zYzXxo1%Bej?+uDZWfyB}@j&@c!H1rQC_$Jm_~?XVZ%#s6C(Z85Frp;C=Qq>Noh$e8 zHP3rlUS32qHUqDnw2Mrp#}kg;{g<;5)^5_XZw9Py%}g(-Rb~)V0c{NmH<(z@Y;}lS zS_&=Il#7wfn+r{QpO^WLO4FTOy+yEGZy?LAHP5YwZ5F)8$gsjwH+$;Te^>`IN+y)| zLIN%&BO-7BU6-1l^-0cjV64w=H8)DgHak<^*WdBaJ3S_{&OfAm>1ErW^%^Rf&^SK| zSEC5P%YVJaA75o?UCytKc|P^PYT{t#MiJ+Nz`&C~Pku~fI{53c< zmrE1~>--_~N&H6X`%17=vNhGBfC?sw${X-ZKbX7V(od+CVAi*{9ewjh>#AF){PWrA zqwVhM$D>WtnrbB+Cy^c4Y7j`PSK(NRI1vO9eUyy&{@(W*G}{yOHV@?)I+1^ZfRJ>CImAAta7<6a!$$odFXY@6AGSGvOIP&;owC|?k z&l2}`Ua;wfiG;H#un3dBZ0GqHO#DyKEAa=P?_Z4qLH}=?_pUmg-MtQzx4`?Xld&Ht zn%=F$ErNkhdmKcs;FHzkVbFxY$$hWKGT6JfvI-2IWl{NyVSc=6Cqt#$qRzHl-dXOT zBdb3@?dnl(TLlBT2Y?@UefOXRKB4=W$y+jXNF778PrAN=v&XC?nFlRkgrbZ&;@Lsg z$8Dct-+gYMBz1+Ct!Nb?j>+@D<4y%}?_-a$MmMDp(@E6Md(g>}*5$&~k_HB#CZ^1S zCu$!w9r+6A5_&r+I?|9wm+L4M;e-pExoTEz8~Bc6<)YcAHv%dKUkJKA{wS;eJfHb! zGRi6|5k+{P+V}VMj4BX#cltP&A`ZNII5|0TOlzwz3D|e-koiYY0>lU7hvwO6V9u;? zRh`f+Hf3XzwO5x)Nuk8#r1SG>UIw2TAHNH=NP*~qIHt!(HB(~g2cD+s)O)PWHdZ;d zyr+_tEC#LN&J0eH)BQ3%DTNjz!CmAWuK%IgV9(Wcu@DYM!C=;&jD`(_rT$`nuS5uuja(XXKDXF)x=>8O58KRAu0o+#E}=howvRIrkH3D$DR$$VCi;ruaLEet?rrCH6IPu5b+|52m1)&d zHCMN8cdIhFHo=EBP3Q=d7Z|-!vjag>hnCKx)xVI12RqWBI@f%^YRr~kYI|eRF&Q#g z)^TT8_K(F2L9pS*Svgmd`J1QA271*DL++Vviw-Jj$NaGLCr-UcVe0ZvjTMtmGDC-U z2hUt91`=6lZFR9`Z;LIi20)>YZ#=^_3udn!;ptl&qKv6wOAkez>1ONgh71pWc#@}!=G4Wiwj{*G}HhTRxCi{95CU~tY zg-6!@OIk)UiP5JB!$2HnwW4XEn@J4@*5E&D6S9A~#zK(}5KH)s|IV8jd9pYg zTEMcBHq4}>-GYa{;$dWtZ>|gSXpmV$)xd|9Wa~FQw`GdRwk*@-p*PUz3zrSWAUVUo zDtIh1<3qCNqdH@A?gDJD!axf{UN_%G5UNzS=R4gJSNDS z)rFOp@d6rGdoOqMmM6n%Ww{^x{KSbwU3e`;4zzmjze=Jp)r2$d3Ae#R{=q9WOe9(~ z#of;QyF)k)PEaq5ZX;$O?OH|IrkYucP_?Gzv3srk_{-0j;Xu*qkWWfl4^k&mE6%k= zh%7CRq1FJaw?%ZO-pppoPLDp^T8~Y>QN>;=A|{vWE;8^ZBDRHo4FXNTKYe>*R3kyv zVdZ&$ScI!-Ywonim+TT$YSd7^2VAIrd-?#bAnG%W*xb!w-;yjR@Q3QB>>P+(wKkDM z)L@-pwAc0ZDaI6QoMN!<;qCT0xaPIWz{30Pb-V9YmD=OUWVmGDSNFHL%3Yg+bD7?n zuUIh*5zXGIXJM9sAw!e+qqMlPB5<{^t%Ql)kDS=Ts+E8#Ne&xEiSR>UnRzF$+Bd*v z1kc8k=jV&I&D63$4bsqw%>cd|SjXi0nFbX$~^xd;;=wH9n_f4npEoqZ7bJNZt6;gK(>6?`NTU^u3aweJ5*bZ zWM^j>u0SU`ez+;0LIJx;L(7L7at4tcA6NukDyCL(h$%ttTgZoMFdl2g#(vJeVHhHI zv0)B5uvp8Rw5QSjB_5!0b$@I-0zbnCR)KDcb02CcHO>k-*-7oygS#4Pq$1EA;bSK^ z#5;KUD(S-mD^PUH3?VQ)uh@2%*a$XL0iCL5N8wQCD4!pH3$P}zI zBi~%JVUem(^x<2!o+ca~pqtUM`v)Dy`HKSt?jX$gM?heMZxB);-K?UH9#D+L|8)O?9Lq3$`2SIh;#cAZYpK!MdBzyco z99nh^970UvQ7%_ZpUO66F2}qQ!>7?MEiQ*ZAs2ysww zZ+*dD3AXvakVcQSj@iLrsRA5ZS^6;$-jR?JwSrZkE%rIM&nDSE+td)Y|J1j{)n++& z=Y{XKnnBINU7^nrN^Z^F&i2d6MPx0y-8&z!8eLO3VMU|}>)J1m)trgJ_j%4eBw(%ypH_FYd`a?8^-e+vApq; zm+%lYeODQ0fTfdE`7)0k_L4?)^v5>(hF8L0Xe&^k>e;`@US(&y1Fpa3=Yx4S4ABIj!UnC_QoL@Vk^~P!GZ^w~7Wc~eHuIsnc&m%GzFzn?D z?lqSo6C%U!tg?3emQbQjhryI3%+zXTtAqKYA+F*17iKH!kL_LT=oJ`0wf)`sR<*qV z967~ScuP4GHi_lT26(S7o_s2;%4|eJ3;@jei0blWT?SEv4+C{Tj{Y|W-6axlU<^cS znhsXA#n;qKiZK?;%^y8e`e1rcBdf(0$U!R?C8J-?pdxX9X(IT-t+~3_A}03|zo+in z612BsA#8b@NT9}=VHqR5u(-@+bqoid7;c>EH-2mnZ$5ynAH9>uJ((^8>)VWo7KoZ)hit2f>d+ymT;k`?eY(nM+xqdzIfm7& zh3s#9cEVg8&j7WuEeko!$J0p3Twnr_T^E0dJJ;qP4#Hb=0U-tow7yMi-sN)-8R)C? zcO?-cZ{JG>0+n939D#Z|f^DE03t4dZRWk<3cDRv-Gp*CWkc}jtS+S0L&nR8(3biD34i2H`cG_au-jFFU+qdwGRWh zvO(4n*OVPi`V*G87zVsGaT^=B*DRj|ym-q$O_YH1H>evIV^GmvT_%^v0qLh#KVW(~ zEzuCumYFqX47!wl=C)DL`05Oo5sX-}6L;05cZrEGQ-iQ*)YXw1%$+?EapPs3)o~Z^IkRO0#J>|OB0+J<1L!}-)Fl35h-;zhw z6?s-+@saw-Et#{RV8cir3`VE50E(-8ztHi|+qGDy_k;7(MAb$tnKfbD7ru4d2PgCp zvZqa?{OzEyOMdS-E^aM&HBvJUHsI&oyIW^_prHL5x%JPQT~&G_W&+Rc*)ylWe8Zr3 zBwkHA{?I+6*Nwi$$!AGO7|v;V?v)kt8>mmE1gCMH?$@oInn^a=cEsxL0ZzlDkzB4f z(_k!mghDODPxycnfEN|mR<;UiV(K@M>mI3J+AKm_AY{F^?oFf+^V^k+@|9Dz}w9YiB?-cNoZznA0!{+D9BzQY!T_3eVZ z`Kk5-?C5g`;P@Khp9Jnc(Z7O_>D1s^pIl#<_X0uworNYZp^`x1A(eZHpV}k7MpdEO z#oR_6QeHEci3`O|GKZ-nW#R*NhCUgF@AGHwyxpxx&@4SaP#0KWQG}krzcP6_CN!_* z3mLa{5iKttb{lG?k~6^a=AGN!i(^%@TP!0MjB}yw`}(eJr$K1oO!!6pY!~zic*^u) z%-+!~1`2dYQ8V{lOBwkb{v=*6*j`)ZWZU7n;rIKe8`As%H>^H@r`B5$hxX$_hu)~g zSkt+Qy4LqMAql5I&*f7Ic!V>b;1BCmTo*iV=C~0Yb~jsu6hN%~s{%b1f;y=2l#*e8 zwoWu%1O3NR{9dIvzn4W$Qvp6zN1LEyOSF$GJ-@Zp*ukFeDY!tq zi)qvw`%KXaS7`36_JNCDPMs0C)Q{C=Gj}#wvD!PXhNoDx&L0m%bujR)ednm-I^Z?pEe`^+8-m8|P1+#LS9b)g7kDEgPr91Z1 zs@LjK@2`A6@Yl#I$8Tnoq@7Wuuvj6)AcL$d6htnY2Y6hpKGs2fIa&Y>9l&LHicCspfUaEZb2Na-TWhP&Sk-ZR;g^ zR(yolR%t$d!@acVFx*|Lgek4cvhfGw@vq8h>2VSWrpKcx3R61-7s_UMUso+B)=kKr zrt;O0s`KUA)4Yb^&LT)Zd4HGc&9y0(s zhe(B<+X;&ctF=Yzgy;-WnNE59q@{7>J$|q+2==p_alfzCH|p^-Cr>)rygfyC*n6|q zPWW_+bfwZ(x+C5X%y`gNVZ(3W?D?RLsw z)mzg$gmY27GplL?rs!qxB0pTNH8pxSb42^CRwN;dJ5hAAQ1`!h0*DLXJs}%(85>r~ z?YC&;fS73(gB}y$$b?M*A?g*kYKNdBKYis8J$E7g%(q^vWVpoK(m)XYu-gtyM2;B9bSt^XklA40 zoJkM)3Rv_?Xjypi!L`?6QH4Uj-@ErFfIgKz(F<{d7q)sPg|KhARInOa5=n(Zhxy(w zezd}*3MZSZkZN9LyiP~Ea-Q*r%^FP&ub*%kT+g_|{^uyQzGg<@D^TAXm^HBKTee7i}KTAj>?xa~E z?)61=JpwRf)9={iSO?LZ2zcyhs|S8!#BY-jr-VGI{YEQ}SW8D=U&JL|txad>Rtk`FpU0ov5H9<)uJbIZe`h8&e^6v;M1>9DY zzJKbWEzX2%>ND0yxUbGh3mf|7!dsW5?R%+l?iGt?uW5a*@Ke0T4Sj3AsYk;1Pwp5% zhF*wvn^6%;LuUo<3e59sJnh@1T9Kx^UUbijKO6E&=;IUP&c?ryNQ7dyqskbK`RTri zJNcrkHcsdOhK8y2lVG0cJG}q+=2c9sV+(d8NiNc?=198mfegr#evcxMofdzd?jb|V z-gl@&1?xh$HYE=&lZs#wF|P)12Gi+QT)$>49BG;Vy)2#} zrf|Ml5Yc>x1xz7uBN}by&2B9rgK!n47u=efk!!1A$J=6z!It#vRfLI>ootm_(}W&; zPC2sM>@^Br!+8*Rt;O(J4&%N-XxlM!wKs&LM`$Qqn?JvmF8{}odl-LKV>Yw})?!PK zYxYMlb+oEUpY;}x>TFWY!)bY;1_YQ@c=lCK$|zQ&JJ2ewh`9NIuMvD!9Q=$CbICS#0SA5Gi(Uk}8V79ve7L{> zxu5hQtr23*l!xKkq1wW}q*~+lI~~Jxxs~4c)HcSowzKv-N^WOM0d+Z{YN&$Fc3=0; zCQDexXfm*F7Kq968r?8r(1jhy;TpvB$U{Ti#RZc{&#>5@viTu6w*dG;mC|c4wK$Ll@N#2Ai{qXX>aBwB+#43v!|Tkq{oOt*x@Z z2RB29N#*V&)=0bg0b37!T1|};Y;AE`20L_JMrhbT-05#wF`MvfL%wb^Tl7N^HDAaXvqugF8KCf(paKkx|Bg#fIhUF6^>6}jr1v*x%HS0+XoKGc$t{#`NUGIz$C%Ch>6( zAo9Y`XCBYN|KWI5g4WORDa%sHN~=z=+PZ2|v#*P%jWew}qso-(@2VIu`K7SH4!cw@ z55pg4sW!&m)4hfmT&MR?q{>~5D5^YAAs+;a>U$L6M8I0crfXlrHunGJqFidUE6~Z3 z^}1(j(dQ&6)T-|OW;L=aW@iw2-`lg{-n?aBbqrbjmtX3$P#}y%I7I7bP0x+p9`Q1e zDt&X(Lhz1SLEi7)nlA@&s;W*jR~VekaoR0bhkHSP``Ix$qXI3oe>QyINIYDxXA@Ev zP`^B~Qk#pOYtm!SO)XWYM|I^Nu(S}^HmT>1!3d@@lglI}$yainooj+&Gw~|^33{@e>xh$^C5iVTF z3tmM$J7n2D7t!e7WK`+rTsa79g430y4i6xR=mcpuZ8}~6p_q*Nmzu7Li~^A#H=OY{ z(k?6);Lgmq7waaP|JB(8;XS+Rk#fuH75L_{uy!TFtHe-Jq$#Q#(b2qR7^DvY)`+v5 zyW$s9K>m)G!&o!T^v6qABI1v$*THur+Cn8NXwAr}LojF0QbrN7e3N4Cz7MYaf-MzM z4KCyX;Ix;#kiRecTQB!WNZmM`zDt?V0P8NqcV6aBHHH9ePwQ2xg~y#wCIf+2>(w`> z=wBrV*V=mP7mi;jOHpaSnPrULPqj`mw2X2^#KVK%j-RktFKm^@h$YdBJn1 z(Og8lmzXoNSu+00MjiWmOlI|^M^w|mNH6ua-?QU$7ZWTIr@Zm?d zJl}f6`aTATXZ=7QLhi1vM_{HQ2IR`U1=ACC=z7Y2MQz(J_yK1XA7ERXo4CR2oxN?; z)OSJe4>l086GSvX1HvQrl$50LVmTXs8LD(&d7Ty?lX-L-6*s1( zMmN!&<*Hqx36xPLWynufg zHbmVGFLrM|h|$t76Cn`wXl_-0PUis5k8+CTxf`>e%8+>J?{y)046OGu7SdAX0?c z#RI(D!a@oC`rQQbWSqo=I+$DytNtnk~*6ti~a#Rsk*Qbk0=bK$#-${Za9s zNW^P&lQ=%=$YCUa%v*keAI1EnUVhl5t3k3MG`$z3blCbCTZX{3S=-}zF$`=llchiq z;DB6S1(r`>W9k&Hdj7$tkkQp>V>wWK_V&fcj6t}@PLHGOBCb3ySXHA!3fBU|he*l( zN#-_%sg3^}IDJHWJ~UeU=weYe_%a*I2b;*wL3Bm7p@jKz3SYUk{9y6>Y1Mfei6w@P z+kpgD9f(AO0I-a1rfz1u2aQg0=6aZqY}Sj~VQIKAYQurQ?`C|BIJUcy9ZV1RqjZNR zQvix}pr9HxQfZFGR7M1^#7fIF7|NNBRTnkM9i%j$X~=7{m460iYlnp3}K*aG}G_>bJ!atLt8d z*tPw+Ut7CM(Kkzt%O96wlWE=4dfi-w{TXev2WA~WN&ps6i}~r@@vt7C41F#B`_bjf zcfqq*+wyj+^x4O{lBHhh--2QWE>Cc|P)hgvZtrL^1EWT85etnDuC=^Yz|_EKH&#Fq zs~=*wQV_+Li$L9iI;gZR!hOcEsIM8`TQA7XekLrqr8Sp~=d2$a1{{tc!U$W#Db`ak zK0cH63)Tn^k(*=L5=F>&>bqxXRJs;sUR)#j+H4Mpbu`-kGgNev5#0#~_XH7AT>uVl z+gxJx-5*S5*r_Ut)Q@b15D`^Ob4YT)>P?7GjJZg`dE7 zCF0aV$K)`aX@T>XbMyR}?#FVN66>p9nTCxvZdZZv-mVc~*I;tI#SLM9jCXH1j=Jeo zD-uLigIwP`wE94!H{`CpMMyCpPpP7odz>j;8PFw|y7s?^l(dIBHeamCEmf04u&7H! z_sa9~v*jpM%VhO{c}bko7ELLZCI-c0zxx3X0ZV_E*}0IgndsSc&HWzKU5ZtU9e-;f zrQzX@DM0J87LqxzBT%kZrvvr1`sLSERo>ZjBH&r`+78!SnRUWoy}Y61LOAIgYd+E_ zvO`*W4Rq@Lv3iiP8b}6k({M=0D0#$f4e75CW78urVXfYr$mbX#_4CPi^FqGVehqNs zvLG!-A>e5KEvO#BsuR}+>Mazf6Dp6xfUE? z_9=mfp%k>=uC%t5=8?yeQ`rY=A(1CbjFGL6_GYTSz40mJ2ST^g^E8N>>X_+x?A02g zOC_UBNtYQ*{X(uvG5RGGO4fe-xt|dh+_XIf%mx~KUTy%;910~vE_@)l8yRwEI`}17 z5)l?A6^s=rA{kRI#)34Gf~AxuMjaSyuF+HN)n^6DX%VsmunN6)%W0KqQyeEd_V~@L zSp_W{zB(s7dNAUe@-9^F!o@@VyVEIklB5?NqQqn}`_XBRs%LQqr_ zuct0n(ur%-i9@K{`xipelW$l}TL%940Ix2y!gKpyR1z$x7(_ko*|f#=Qt3sjh0y)> z+-=+eD~kf5k(75t$|SX;ZVkq=hVcXr@%_Wjr`N&&;ydGY19Dtmh1VL5`KaM9$lJ#liCJbrgwCKaH zzDB3do_nbiWA7pz_w5>LG5PV_iwvK<>lO)Dj9(x}1I3Q~emF21nj2%uj;UX8gNr17 zc_KKc2#^u&Zv6A1?(te5^ct?SPa?;okaqgq8oOn!fmtm8OCCGeCzN$g$E_O?cK6$u zOP~~?>MQQc#Kx4S#q7kyfbf7x9nK2%sPk5n5|HX}9YMDRCOn{fZh_X|jzD5*cl&lX zERb#%QhaAy$9+)to1Ad*tlpk zZ?XLT66NGykw+Sh3x7qtjB{2rP6PCEd!Z2>9}6Tu)+Z zCyOmSfn|+(^8;G~TU%Qhw|wW*A;7#oB-tm3t$TeYrbKriADMlg7ot&zg@Nm$A@4yu z85g(Dy|QC0sn!JzTo)qu^>*&1@8(6xRb5M&ECkniQO@65Z5bqgQBJ(4y5?6b*a!qp z2`_)^%l{?6ocwlGXOYTqdsy-|%TYaTSXzmLgF|t+omesVeAo!=M*CCI28F}tlXOTl z^J-ASe33(uzs2y1j{=*TXLgDwqv|wFxrkN43=hSq zv$m=Gp7+Qt&A9FXTpP6F?}^dm=@?lBGz?Smurl~+%DygeWE$pD(j9MR!oS761J$oy z81yNKp9!k5K}w3Q+?~W{&@S+lY0Ujku8WfaAq$4j8kali`?gc)_Mj{q(ZjVe7mKV_ zZJIj7Ls&F+t4_r$S;7VlXU$mnk008W8n!>?W|4AhXXk*P;H-Gcmi zqn-mmG$lGY_m^`kA*uSnbF+vp`A&}XSJMDG^Al>pXO)-L5hFT^Yw@Xyj8Tg#!RwSb zNn;L$(?M&hx}c}SAknrJ&^${T1}18%;(k)Z=G(N>8-BoTOFd4i$DTw%aM|>+(5yvv zPj&XVU*DCRkW%6M*i6Q?&uYFJJKo3E&I_PXypPnUT^&l9UJs$?Zv3x_Rj>8hVx{x_ z-bW@=VXy2+jTVAW2bp^$I?XqOr?n<8%NNIL%;4xu2dkH>>n!GzLu#A}(0lOw(E9jH zT7}Zdlv7|@@5d4|&hJ-uDRUcwT$_C6R@hDp_pBAFmmHzjw7a;zr(1U~zb12M9Q1^` zUlIO2e_s#1d;A#rEa<&~?K2v_i4nq`1o_yX@?(i%`hnkz3%#oq{xEurD6H7XCE%{P z!gzdheLgHfu*(U2kiFdTdEGc%ecURSj|f}t@KrhbDfDFYN%THO9AH6tRT{B>noSJ< z9CSfolxtOcGFRv3vd$$mrxf^s^T$l+Cgz4v;b5q?bSjIQ_!ZG$g5Dj!Zn7JcTX!6& zWr*)55sXIHw4?FhSK%~bppD#@6`k%HAcSJTz4sE@HnX+8t>1S$-PAR39lPYR@`!RM zG?RKx^`C>1B7H8J#ZCve_29Lm9x7i65{Z{fZ&|-kw8X(4s9r&5^JVgzu)@qqkU(E4 z?*UirT|uhxXNpLN!?`bS%1D_uQr_9!7zRO zb}54Ey1xn+Sdstdc3kB7GMH{_YB#IJwDVf+=&No07xJ_=Wirnajoa%Ahda^pU6+kDIX?->s-s%f>-?45hOxc*Dl;da6Zq|GhiKfAjBbk#>G(t2(D$ zKU$1fB^q0#pdlId)YCq1I|q_k7o^6Zd5DtYZj*{nyHzlq>KJ`PN9X!XHHz&j5X{9> zh4|)dI9(n6`m128_x^0FC=)9PWhp%!H#w_9B1qdEdW(F>we@zn&+M!CMoU$!s)`1n z8^ePIVml$&glk^+{VK<;*>GmP2A8p*`Gy(&EV^|q@Ugs=-jv^Z2sZc0zt(mnU-yyf zJeq)BgmrFEz6VMKLQnNfRLuTGaq1Cf+OEdBTzn|~I!%ZeBElPu(ROI#G2^rco4t?B z;;6`dO%sSZ^c~9l(kvZM@}^eMN#b!3HX^&kZK~jZ6@DabTUpiH`e4#8{*)o>HhXho zmh5r!WXB^s^JmjyCLaMGGVr4s@oVug@v>#mqjrSX&QMu9?XmrPLZC=JKmS&8?nloo zu@_&Vgt^r!?_)`UUU6~+4EiswV|81&>tu;T<-zLXIwRdt9q=<>=n}M++#|xX;!< z%090)kEOgA_ug-vfG7Cw*f9s4saVE33>lAP%!)P^tSa)8+@qzmVK zFP5PQ^0J*%^%N9n%c;`FDGskec$BV({00~B0IIW+4%j?b^Ij<1sgkcs z`Tgn`*K;`n>Z(Vp14j(knuA}rE%;EgpU~F?lEH=&@**N08qenF36sslMkj@vRBX20 ztjORmBEP!Cv~VD9X5*XJSxUTb-Y2p6YR9m!=8|>gVTLkzO_=sx z60>UuUIXswiGAJ;i>^*P#6|R57Oj~a_yj~#EjJd`cAS=V*?^HhWks4nhIEwnKI2>j z5n;MCjjxI}Iw8ed+z}%D@^Im%*^jhpgGQs6$j10@(V!rb@;$3wDGTh(kj62a^ArmJ zKZ2`i3fj9gS|6&A&VXM}Jz9pOeibMO*ndNZr-AeZ%N7W6NyC$wiIIB8)z9)a!yt(~zo^uq56qR0&@bCrvJj>weog$(|Do*7Z(% zOEk0vyia@7Cdw5YbJjik?ntPW{zcTT`eBC)rK}AGHfK_{Hbm$)En{#U-64_`q-sM}V(noS1v|PnhV_JXUW8bH+59hEE!A{6628R&j2eXs zb9JxJdzgtG&Do7!t;YK5-{fhKlAnw;{0!njeq3wnK@?d3UBaBRrtsejH|5Fki<5Y8 zSQ!`7>JxN8gaa$?J!n0GBL-U}^)H*!rNNNfEnx2V2 zBY!p!b6lgLuM^|2cg>h%AI?BioVZvu5U4db7z4ppW|K>;s)8#V>T*;6M+ra0&^1OF zo(?FH9{D}j$dTxQ1S#$Ef>KN%V-ywLmaCxJ)C!SsA_LF5lWLo6`97fr9>K3~a9+yA zqMxV5Ya;s_Pn6|r=}0<|C3H@c8uf$s7J#azZ-kwsRKl1B!Zeyjw?uRP(UNf$^PwV# zNM4^}dFTiA&^-~=VZF}53GE}L3Pq^A%t1QVaSW?a`7Yj*sZlfdhB8? z%uQK8eN9+~(Onp_!Y%sH-P!P@fcK4>Ew(2{hr!~KcpKU5dVHiVsxsLrmrw%pvZlKV z<8<88Z*c2S&*26ptWcwQDq(k*AxUCwYdc zICK>YRM7mOVmT7koywWHyWpxJeK3Mely>zG>tsy)DEKl!l*`<_)0KzR-*CNrxdPrZ zF?p%(cL*J;mh<8Fu%nd%%k=GxK4w2$T2<#e5?1d1g=Itq2@R|U&#kA7=l@F)&pG^A zcd_d0mZdn>(W3^Qk~jn(z07z#%n%7HnlENwT8cvhL$qh4IxsRtFCD{M^m*})aemM5c30|6wd|8cj@?1xs?DV>Z?eb2OCP1nIAIDk+WrkDuK~) zQQ-Vy*8Giq{2^Y>MQnT~w?anPG{}QlmjHe(e6ra)I}rCv?OBiLr^~XwK2Mr8KJ_j?bq^Y zc?p(gk=ES(<>`|5L0gn3&L;A?Ix}e)tEtsu! z%2kXCrKK}mPhVff#)e+1%bmOV2FSnLYdf$BHNosT;9Sn`At!I)J^$u+^KbrJ^iO5! zi~BCn?AFw6jtZ&@!?3$cH_b|%tTa^uY^;$|0sq#h>p@gkFW3B*YXLium|HY)(w*!| zwQO~IRCQO3RQz_v5zf}0&ZALUWfhE1usbB0@R&aZowq%a|6|LGO=?Q zKyCds{hmGTM#2Jvq4M*uUQK_-qF2bS+cY3K{c3d?gI>N4MrZN13Sq*7$0UDsrm#=U zsppw$Yim2(JG41)D+jD_e5GGp3M;q~!;VT9)O)L$Q`2U*TV8;$KR5B#)m_@vMZhbN zH?4Ya!^@y^Dwb2v0DC;TS+LKBs#I4nzfeJ}Q&7dlC$SMiY^7>c0P?A;y(KP@K^-(x zes#o$8Z35dZy^(fIB)7aKkA0p9zC^^*G5zIi_dyo){1)ObHOK8tXRmuib?Q)xOqxn zxfDD%e-eYN*|Vyn6WY_c(&$_1K|L!?y?njQn^u{H^Z$pbckr(> z+Mb8on2l}QY8u;4PHfvY8{2GSGsKdeok z_r@-!=x1!99di6_%py|~ zQ~XZM{i~xvy2z56k6iv(KDWBR7rWj$37|G$^I?)(RY0ZM`M6r&Al*b3%p^CJd`}Pf z1b$n$(cfB;qWJ_}4uSe5?K?kWHs4p&KdwM&3b}es#*;#2mKo;G5hHSD|DMJ_>^adf z=Guiot^E_z28#@wJP+o=U_n(Xiv{Z_h5C^YH6tdbhCYCE88dW{5+@m%uVJg+&RmV9 zcOJCLN;&3yVOgoi$!ywte2G9%hmLvuN+D3UWM}p#bjkb zTCBBv{(S^qM_|?cv{krVDM3I5uzHC&PP?766;WEf#mO%&rcEbPv&cKKH{v=uHaVZ$ z{nPg&2d|3ytxuXXc3j`O`|1UM@lf0}-4s#d+Cifn*{Y_!8sd=QildF+_bko)Rkt@6 zX4gHj9qU)=`arSG?$=cI3ZMsd{pJ{2rES7=jQWAB7chzZU!DEB5(OceUdf4=xYcF{ z{ZT5}(?wc+N60l}+9Bz(%rVj17ayDi3Bp|cte6MF0fQ3h-4nCYd?JS>vKPpB%=5d(H;1im1i96`*W|0VS{L@t{;)I{ zEAFA^yYrz8=$cQLTX0+V9@Q5ALZy$}a;n4pt-`$Wn~h}x?>hzgA0v{h9AfQCK{b@` z!YAE$XU##CjC;X8c1ZW94Z+@DGl0et-8t!YAu58U%=GAyNFNZ)FIYmKSCC z&M>`jJW9GM6aos6Oe{^u<>cC=$*{)T>E7%rgNBAE3F}`bnrM2ko_hXW$_Oh6e8Oht!c7z zzz8cm@*l?GrtkO~>|&IfN4N~X*v-^x??>E?^QoU2(sn7FWmz6|Kk4L-<#kF0KPM;C zTBA%1H(fyorxsbP^Z@7HW8c3=^|)61IJ>_^qM?Tcm`Zu&xBieXys%ws2lXcP3+cCq zYz99SrI>L2r&(1(7PDbzD!-Ikk&(Hvag2@SDC18its|fbSR-n?uhM{lci% zu~YNmH2eqFG_w-9NL*|Yj@F1Z1=@~gW4Kbx0*<+vlcu-#dgRlOJk|P6jh_abkIDE6 zIyi_G2GV$zY3mrK!}F4*q??%^9$@&UJ{(2&o*IBTUQ!kGFh)t=FuCb2K7r+R_|U`g z&I5cfmddW5$#JX&L9Ja}Mnel)?#t4N^_v{D#D`VgwX8i*yQ*q|oj=ccRAldi85?UJ zq;1ILEikBbi+KOoDUXcvI?GqGKgm-6j}^Q&GE&CUQKBeg53;h>V& zMC(h&uSTmQ(yeL5W_->1^hF;NK6xjqse{3De5Y$C@n#(JNY60VC!>sf|p` zTA4>Px-1L4_~hCd)AkEdsR?v*8+l4i?Mu1-c@ohy`|&@vQM|gVDLWY_cVtU%V*10HN3i68`<|MCm=M{g{#0&f<`r2Dry9$u2lOE)C)mg+ zTa8e|%_g_rFsAhU3q4jdNu}*xxY+E<=3YOEe^;RccrT4h5Znl}x z`GI8W3ww0+1B>Ry2BG6mx6`7gqYb)y%%jz?{1XQF4Yu|sNt}8&R8&b$?Fxj9CuQpu z^roC~BohNyH$5XE_5)%dvF_lb>}87u;#yC&#GlO8l%J=&JNT&!Qx!p9&r@sRu{~Fd z-^Up`9SD^i@|NbHma5mDwEL%wS;4G!UZyyfn0MH zjgVS+rz|_IgQ!XOm@hBRl4|PB@Kyjc{_(qzA+(2Z=zd`|x4`CChm5!jd||3O*paE{ zK{Ir$lf{uM-r<6eXXU%Sg50SBi_)J%p4aHae8Q(?DHJ3*ek$ywh+?JWKQntXa|NUr zRYB?T=AwML9{|J;hl@zz!nl;^LQER(k{ ziC-B~1QZ;Xfq~-7)<}l+ z$hHP|5cUdWvWNe+@H+bINcYg?_1jGO@k!^0++C5q)K0(<$LI9Y<{`U8sW7FIB0F>TZ8@u32DqJxhnHa}Ojfsr1RTT?U??yY4N*-ORTeRo126 zW*m6?FeR0=RIM2Nzy~qy%6aau->jH+Bia6BgYA<0cR3PnQXg*5hcvd9Tu@+AodOqk z4z~|A$%8kbJ-7f@;Px>n&p^)!F~NRsEUbVRIdOaa>|9>lo)Svna4%5I)%8r};^??M72(r#@bQuB(j>;SRULJP_WtaD%rrws^u7d?yu_r*^qbVI zNE5iBMP%DXUOs-W>hQkeDBXd+AtQSKP5}C#R2;q-8a_qD0dc>NANmL8qLT_aKP2m5 zn7@v2NUBn5SQC@| zbj@lu92Mo%{;feEYf<(r&hKREkIepuyfy$&TmJOpz}ahG;?t(}LOs=7ER;ep+NP^! z)9>-`yk+S2KrrU{z|ZjXs8Wcq>Sd$5BO0p~W5sxe0mG(S;pH!~G*O}*19_%LVlg@& zpD+4d`uQBj$+PRws#_yyCtsG9JWh4r3Z$HW+IhZ{q5A!vN&YWhG9uc2sV}rnA!4A{ zkuY@HXaEZmC)KhGjR-ocMvjc870}T*r_+~pLyWF=`Lp8EVsm)Vzgk{jzZ zy-C4X!eI_dJxf8b`a1EQpDmORAI|efWj}uM@1|&6BwBBR2QD~`V3KNMom)Vwuvz7hr`_@(z?0l$^trZ&Hl>DswlSE9 za2c`8*?bR|p+Qoa`54Xdu%=kE({!DbTlkJ=pGD8{u}?_!Eg0wyH1X~t`nj(~zSnxs z&t+;g{fH*Q==_i-W-YV}qlIA-SjpUvpGtW(1j1&zotkKUcMSj36X3b5cnEr(SU^b! z?Z<&S1X69Os9eI-2tYo1xpBSwnWwJb?sHSicmpX={C;X&(|r;Q%*_n0y;_ODvs;+= z99B$lH%U+J1o`vfeJi@_cMCDKlh~cR7NUuh`hr=x^!Q>e#YCy5awOih#H4)QRU5MWH(_qr{IIH}mh!$G)xS68q$xDy zMj+G={~JNxS}zp%)~dn;kUx6JJkGUc~7)&jdhQqlWvP_ z2i;u=Ts;_=U=WVj0@MhbWfI9li0z|lvW!(6D!X#;mTxTu?FDoi$swy#A4!GSJ}&65cxmG9hGUPz1Cn&r4d6B!}h#= zLOeW6ks5U&(=kG{nE7-8>z*;$eq9iqN;fx1flP!xG+c3`lAVMvlV{lcHU{nHn zWZj+bN~;ktfkDZKiC*f8r)F|zNZC(VIha_V*VpC5KzDXo_XB$C2eu<${VCE81NnQT|DKfo66~bk; z`el=IN~;0J=@$L@_tPQ?&uV9EAac_6>A`o!qK*;6@3xL`kj{_{&23cmtX8p0H|1jS zpWy!iwsk+3XonIFJG)Mz0OLmD8^sM074a>c`?}YpstpQYooROJb4CZ>)ossx)x!Ru zGF$4lx0I%M+}oqsMmBRBV;6~^;{Y)MH@#n*mgz(y)hsC<{dJ4uenF&5nr_u*ucbmu zAk;k4@0Rn^M(l5e-OX53C3fUtT z$Nw38NZ^dWm^3~*fX9~``2jdhf|ZTZKRX}_BMOZg9m@K_yaE|ImEULu zR3N4UmUsC}3eQ;QrC~vOubGFccH3dpM~?Mz!+AtRgln+E>%$uyoVqt4TK&UoY@&c` z(PgUs^1VOwmbQfAngikb>~6~?8;=W^@dnF%eYD<(;SRbM!f_R}cpQ-(=q7J%KdP7< zQm|rjI}A*?sEFywb057;uyr6#jYqN(~9Yn=B-^U5#f z%(ks4&;;!(k+kXI(%&OeggyLaMLpku3f89Yv^ZG(c1!;7@hT9`;h zrxv;giTRXI^R##&ckbbtpgl0BHqxLJLH)ebd^-9SS3xnzQ)?BBKb#kT!g*IqhZn$^ z8p^bv38XJq|5f~JFc|tZ3fd|5kfcCGC&5J9Wg0U(3`ffjz@r+_kaS^(tT1)!Gzw=& z9v>$>kMb{(=ute!`OER8gM1S1htv-9#-HJ3?g%&sBu?{T1J?py!1h57k#Hn%zjv^F z3(|ugJ~7$BKysRg!YA|<>YhX_@pl|Iuu&PeCI29nVaok3ddg%6BTyKw{4aKl^y0Eh z6;O^tyL)CVlsTiJ9E)~DO))()NpR<{moe#oK4&{4#W(XTC}8=$*jUqKKq+zR`X@TT zS_nZ-q%3Fwo>IAY5jIv5HbXk|A%7Mdh^viN? z_`gAA2N&v@n!Q*ALxQxrMnb8$&+=Vr<~R}~ui7!aWvHr-#RE`Flip*%EIzbDi`Ha< zv&RaH%Y26z)D&V|??G4YDlzAUlOA}N&lS%u>t1Y4fUy^ax`PF6v))CInH z+Z%FpW)4_EAtM9&GlUOI)5(C(67C1UViR2@(P0<155ChD@HDc@285n~0SzU$4gK?uW;>IuhC`uo@08G-=dBZ50}%pKh6I$-Y12!KQ;ZW#S|Ty!g4pIkZ4 z)qW1osAK48H-dt5V}unhyOlD_hD!NiCue3r-!RJTc+fx>aUtc&&9s3b`G@oRnPY|)navoLIyxG zh3c)&2LCqZfziUVcG=zA2YoY7&%01y;SWmsFi|LOxeL<^axmL${KUu~0{MDoSQ1OL zVpJrgSs8=35T}&*)2>NU9Qkdmj%W+mOAwsnvJN|vE<;Y9C!AWOJ1?$-P;uq=DKwU; z_cA@D(Q=Unjof7Ew#nav>T`9F#so8dltt=VPL#Fm%lsie**V1PmIb_*xkXrY5g~ni;fs-HF6Bk$j@Lw1L>iIkW3FpZQlU<)}vKK z->^~`PWy=c=3kx*&GDL(@H2m2O8>&@Ud~9DN7J-kvBX{UWv)OVK~3x;))R2`^b|`| zSFpq#?kdF)Q8CkBivj^V_#PDC>9;cGc5v8$6a4^DrZ*(4`Uu8^F&o=ME*tn0rx>;f zJgg0xPF7{pGIb#Pxk-g86MfYyE&M$pDsmQscG}JDGvaW?d@yz}9Kr(stPOz|^&y)e zlmoG;JY3QJyjOU@TZ`Wsn^ngWh?`*`Qaw={oMqzEos1!>Q@%BJe*=-nw|>N&{5ptn?AevIdNBWBQ@%uHxmri$nTAUo zlK(^=n)EVb_i+ha@+WBCIMZTytn97b1D?Q=ropsEG3aqM+6*IJbIAUL zaQ^%?KrR#pdBct?gnt7ex7jOqBttL~qups9hrySxX~Q~YVlelP^$MxvHS6{DwcQYT z;r`OM2jo7lk-Pe8+m@>uUk2Sq{!c8*?{~<8C+9x(u?ie|xduk_XeN|w7*p@|U*8Dq zZ9mneV&qekQMhz?715_6X^TgAbH@4{vr70i2lX+FruBpCBCf@1!Fr?pqCGwDC%!w= zw*RBO=~dO?2OFCD-VNr)2=3Bfb-A_UM{)5vhV=pWo{{&0LwgFSkGB)4H@W!>_!-vu zW!F_^#RyKMamV7)-Vq#pf`EHMF>#d6zHfT%44ez8kl49?vCy8G7QcisZsqFLKY9h)mh)<_{WC@l`mM#F%)~j+)I3+T*{w z;T!4iPr1_MO|{XQT(fii9`p-Ks$6o}X;>aF2EICi4IXhXUB9G#BDMKGKq3At*kO3O ztV3REZ`T%n&Aot%KIEO5^81*Yj`M$E3+2rr2CtDa_oO|R_*~QfMMd<^E{B)U++{u z4ej&<1?wmf)q1EL>rHP5TvyLOB^Jp(h5LI;JK%5tpZK-=^Sb6er{=x8`x9@tqN0TF z514wlUz$$Jl+U%t_bw$pPvgsW?*HBF-Wnc*@fdGv=wgR5za|Um1>K>NYY1F2a~5y) zm#ALgtfH8@m!>ZCC`;`sHidMRW;F$Bm5UQ<;n-#T?+0tqG*rS^YwxXf~>#r<{l%{{9*Df z@&nG>2$9!&W`dxtRy0&5QnrhL!N>w`x8DAv>>vI03&R|ld411n<^;#YV{&I)|BtNS zqTRXBv-pVk5tC7UCI8q(0q}*cKXr^1q#wNHNRPrt8|p=ta5~J z8CKMzj`a6PY`xPloR$)t@tW9eC8VH8g8J^E!0%vfCqmO z^3C}tM(o&(A5BoyQ0X_q5lzh|h+g^ncc|3qobGt~YG(R-hE>lTU7^u67OSF8ue(Wg z?!W;yl1S5X4=N|}udw1%D=n}AqGyKZ0dD??CTiKXrwpce^ihw2XZh zw%HM#PJCdSzs{cn&PddpQu0UbBc6^mHgYD zZrcott!F7r319psdUzw8;nV^O`ce7U7eAWYu;&?Dmx0IPAcJHpHsbfn^46pKOra&I zI9pJg^5ek}0II1;hjNJ|Pyu)Hk-A5yumZVKEdw~v=PCHZV&`RO9v`h}f8iqO>5Br= z%adgIRa9r!zdqT=o!&hGK{&{GUPkw3v`T!ibpSV5wi$UC($2ycEnZwZH#%>ZPq~t{ zaV1}Zo`wuis4-HDLLTCK-^Ek?phaqR*dZi`R@^96$3I}0N8+AH2Vfq55Y$2`C4P*_ zSmUIWy|_(@C;nZl3GnVJ7uA;4XE{!^@P$9qVJSp{DWnigPgxkyPiwz4U5*!h))1P) zF2H5UH9!2J))Vb+9+&Pte^w}}&iL1TN2wCj%_Zha!$Siml^-l0Exk;M{rjvbh&Y6g z5>gWo$X(6bI`L+S2vxiT4sMB#>|`w$dU-3)Onvujs783By}9=h1uC3byVD)P>{0LG zzeIr#mS~zOTw34nNK4(FDAUd+^+gi~2zv8hpD1h+nJ&jR(p2f4I<2R)$9_CAF!8FS zN==?tt6WFNv}HEY8ch%ny!B$TXgN-N)mmZzx_;p3-AHU=4GD(HOU`eiKg%uH%Bz=k zNRrPKBsS7LXXZK*@#u{KnT3e}QO3kVujK@%>8#w_@5V_u*GxyI>zJSSb!F#F$tKKrf>2BRW672Cfv0nI}itUiH(K7*B-2 z{#u&)mB#pZV6g8TQ@FD7`EnQ@{5tU4-5uLTIdU)eO1u{XruE*Q-w<1*R~%VEua1Ju z>S#mg-_)EC7Bg?!7G6RpT^I*AB0of#|Mv}~E4Jr)k*xSiu|IXn8pV*b#5MrT>S6sR zEh=ac-XMxZ-(ou{(P6~^St#F#>D=u`pEba0r!yrJ|5Xi47a^mWQ?)oSemB=#Cb{6u zSG0J(lSQv&LSo)*LnDf*@wQL4R`R=_?@?P!!j>oaghPn<-=qZxgh20+3!M>E)0tbO z;mS#cZyoxURMR!1gv+_|5-uDu!v4leU$J^UBZjlc5fJ{!FQ5z#pRElZmQGOIq(D{c z`wnA{p(@fV#lHNu%>YvDH4!Z*YN23-&1&k7C??TF0XB(H8&xc}>1+m%-aB{5BA8M1 z=1QVQ#_e{zL-lC|^xsI@HuOieb4UKJwpt!|WE%ssM*TtcM$@}8&eRiwt(1ODu4p7S zsEK@PNZkw}w$({%BrHU6!q+W_mnsFjb~M;rYRZyOg}>0pA@`jA16q9#i#~zA*It;j zvdR*Do8oI9_M<^Hxd!ic;{$tGtszozmjchg&qfbq)MI9CER$^8Vq7T>iDgbTz*$7s z!|eIkrYota9u?Gw{aumk$#5|OmU;-S_h?UY z#fdH1>KV3EWp$;uaKceOhLS8*=_+i*B=L&i*IaksSc@ZT++R)1DqHXqyV?br&7ueIkN=_@V4I2NZ zJq)%ZKIGf)M$rRij#;=bZ$wL8Cy5zR-|^(AIzaiXEX(xduZbpqmjN=PE^(G^hGsXa zd*jt_dP5QkT0BMyucbq2nj+lY+5Vcs^)B1y>m9P>u@6o}W}yl+Jw1oi;|pk?Pj4h+ ztV#3cN4WI{L3Q}l2xo6|oE^b0^dg7U51mO|X7QkR}&qeDl;ezVibW&d6_w>E>GB9Yfu+f|^N z^j;EQ^KSyWXUm7V!Rpt^Kh|BkkGu-Q31+LSH??=a&~#?mze)eH>~424ldhk-4g5B{ zN6U1w87vzKzVczRcqr$X%0>%vi(C~_u(`#@JjFPZInMdX>ij)#l~;I`X6Vo`OJ-?S zrqdl0wo`p0%yScra_9n6=7Hq%^T+M?7_R-r_T@dz+J_vq zF!u*GZ$os}f2i}@$AbSg5wF{9x0Jc%a2v$i>F2)x;~rj(@8Rt5?sZ@|wbn=4;I;>M z?uRa6ED=R+P^Sx+lh2El<|jeQ&#HQG8u$VG&g&AF_@9j0bCSmT_(ZW1f0bAy+d!Ac zB!Lf_A9}jE6AL+GT^DqbE+5cOl_YF^!CiuCbhsM@HWwaU5c6S3zB8>uvZs75>+4{tUBfY+G|ZUa!gFii*>SfwtCPU zoI>=j4{Qa}LLI(=pL)d5{$woN+X?D=uUb5sSp29RAB4XNZjAl7X8!ZOzRqhrPg7ga ziS|B14XB6}P7biSFk{jmzVYyh+4uKx^n8Zs9=^MkR^NZ@c6M}phBhx;)js>53s8V8cDUb|i;vH(9azYdQgkfE z1U2tJ9BNW~#ttSzWHuoT_3qc!t=NNVs=WqfBpiuP!(W2oLZj^LY8!%JS~$-N<>Tq7 z^sS7;tV%hmGo;IW_MsFPg)-7x%eJhJ6kkwL+ul&E9a0$E>smOkZfwKpSGdd>pWX6j zRLG)RncEFP@_>Yi46I|swHu{=wf5jo4Iek(5~ja1pL_MJjR{vf1LXW9`-Y3-lG$M= zR8I7zRF}^Un8iIyUcA7z<}!dW-WDBX(Yhtfjx8`VD)9qhzO)~ z@F*Wg0*n(XXQBE(ZBd8&6`5bt`NDkToxGMq7JAL`nBUjU@cCH5+3HP-WcZ7+8Ml|f z+{|M2mNJml$?>wifPRV58fL$ZWEp^{Nv}pX8vel=-7dqIGBG&OSOU2!AO%OABHp;l zBS_B}9aEWNNz@UC<8HdiU&{QX&s!}RC(>Zma-cYQ#l1DGiG>q1dM+lGTgg=SEg-<2 z&V$KNv$N!8V^TUT);-UB*;Dn5Ok`qlX=<)odD2h;cp8Vv0#L!H^R3v0(eRpoC7-+* zNoC}5WHQ{8L0Ax3h@|$yyt?=EZ)^j)gT+;jzAWk&jEr9~axJ$#_wd>@dn^AKj ztTOe=c`$tiy=@l%$JmDyi-MNy1(j^w&4+#J_j)pWud%?dQ&f#t`KC=(cT(f*GRNQ; z;ez2pS8uENM_wA+`)ojG|3Rps({Q9POcb28I^DJ*qfvZBt~hb9Vosb>6m=!*h_GJ| zxF)suVeZSEpTx96vc+$_34QZqm}^!{D@&(B4|n-vjIM?sjZ)@Zw_m{7okX-6>s zhU6PVaUY5vU=;(Z!edvgvud>{25nHO;gy$mb>d-voT+g)MI>kU=x87KY>`% z<6TZx#(#}3NC-2b32GPM;Ucp zCMUypX)}uGD&L{52F(@0gC);>T+&m`06m-f>mPcH7iVfg+t@bf1yxV+WIVA?0~7-c zQRZ(-*VzdnWnBgrO-$8T^B!Oli^bB~>u0Nv&bl&ey639wR}HU9YQ&wr1uAsFO_LQzXM~|;6gdMsmJGtG<4hS4zbN5I@Q_2i_suc zkbigxOX`Ucf5G&}Gjz+eHGt?Q5)O6y%$e!Vs;%*aFRo?OL2(v=_`5JG45^(8ARBQ+}Q~sFk`4qa_d#laN#S-*e z%Xl_rwo*;?*oM*61CGCe?H;(^j)*<8L_MXM2xKvJ?7Jc#laSe9HpEc8AjdX|A=!RgLb$LxFQE zXJ=+^yZclwTXiH5Ov=JxjTIA|^P!&Ut=ocfSc_*usfz4E=wHP#>Bq$el8ni+SXO#Mc-yq|AXmNHU#ICSCT}twEmB7(P7ni;$?Zs)LuPfV z_~@m30{BOMxtP>1pMS8UHqBOVZ0tHKh+nCS9j;VZ;?;3Y9JXPlb#$sDdu$nKzqZ$t zlCE3FLJ(XMObT)62U}CgyixeA==gIW6rVGhV@ac_V326co`rU8gM`-2QHUtK^Ai5| ziDRo>j8?Pd6jws1rtgZ`{dLF5oU|k$sL`~UkavbFb;x2+B$J~ue@j|7C8v>uv3Wi) zxE((mi2ad(ap?=!Rlfv&>chXB)=wL10`x0qPNhZ`-SL*m`U2<_pDu3{3TrvX%*>hh zbf8ZzN_N(y9&1m)F-KQ2a^9d8HIYfQJy?D2W%d5t(rPq-tkC&n8WK??ma0=-Ka^Sm z(e>_bd3(|vb*3nb#;~GKhZj3yc8iWLRWU=9KMsEk18P zzZXB8q1$c?i#}?I^S5~y4Mz5`EC2R(n_jS(dR3*_&P26R$HhlZkQX%cDXO>)+aEk& zM2;FQK4rDbl0!?HPLr-JdfZ4P`BqMq8Pf-hr?PFb*EHJH#Twsk8CLIMEZMvyl+A$5 zKk#H55v7hVEQhDm<8!nO3J`T+EC3y?)(Ylz`%-!U=cO9I*@T}+Eskx^z38rTLy)Rz z{h?PRj2l`>l-JgZ3#3{>sX_(Aut3vM>?ME;ChjZ`D({@FEM9}LH68{}7pdBv?)n@s zarH(H4XZCA+obr%%J>*;odVOn(=dsoR%4a`Wu_^NQ=syXCG4PU->Um2UO5GeboGo? zWfbo#OobUhIk&erHTdrge8l+oj91gVt~=KC^)6+-&Hy&xvzca7drQj~5T?_iJFWt# z%`Mx^s3V0_zLC>S*Gyr*Uj%ejOB<>dlH7h-(NqZw17TJR>22Ab=t72hWq+h%GiO0V z-CIRImSj?sXkG8~edx$MDzX7^yp-tR&0n6qv_ilgB*tu}=emp{Qe3;Xmc(*7T0u81 zm+FMq9|e+W^STN7HY~$ca#GX3Ey&b)m%v(b@a#%VVASi}PVanIZsSickfhF5lb1Eh zR{xM-I_q9(vI{ZRXY22)lV9oMIjVtJS1KsTzUXjPg@}%)W?^_+Wpox%NK0W)?%%Up z*OleuMXfEjil0n8#(8N|`13VOyRDM|6vI{*!9QGtaK|pUxDU?7fJ-Vw=^twp9{s=1 zkk_L!M!ma;v_md9Fr+;&VhXg8*-OT%CE>*c{RIQDshRXfnzIkR?@W zUY_f`(HkGz2_gi%n$o!WWK!H7x9Qy9)MdQL59 zy2dnUF%&Y2v985oVluu^ZHAO})()`BjKrQzRhj}z zEFgZVPJva^RqIuYiUi@k;-y|mfC5!mB0OLD{%`awi8yKTV@xZ7(0U$;7<-20?{!oN3FFpugRNsuJ+apUo7*?=lCg}Vt_qeANsfpFS4cE@9 zmrO5}`ekukE9k9)^yI>K6{0;z#ir=N18K0r*t%|)xD?q_F{ydm=)@Fc2V~=2oepM> z*~dE~cQSC{u##FYGAQ8f-}Ugq9=?t}P;Fnqf*MVITIm-y`SeFGlm@=`hcX=?{~wtU zaY=;W3ptj>BvXPIWLE+TYU8j0TFCs}s1zIooXgFKjK`kU>GuiEyh3JHqjsDlkLqz! zF)B%909kuMyNd?WDmlD27wb3bdQmjn&<6%=xqy-Uc2Jbmt3z*zcnR>oVJu_gOQlw& zNHDMJmN1!1NXfx?y-}z7C7Kz{avo*3J^m+Ok)?NLS93VVo8m)$!G}*mZ)`;@8rXD# zwt-M()$P$ftq6#MTT;}bXNFBHkC%nu#JF>o!xr-IjtPt{(4vIw*Sqy8@%wr_v8D&mKF)# z#{7(ym0WyXRd~=07U%%7-l@+Sla?5`2Cd&)P^c&|nUa<4@B<~Bbe}2Q6N7!jm2jBZ z${<^S3oIdU5m06k3B*hE^k%E^Yje)Z%X&~jNS*V*1S%$v1~S0lOIm67BC2)@N%du2 z3#;k=S6SWG%%DmGJg)s3ki(QqDi7+old#k}7u8wJ5Khat5=xJIj~yymW>duLDoq0z z0#{cjH-N~KPivR0%1kA1j*wj2quy|;VXnz*PmrL0%}WbPq1EGtDme2otLI;bm|xRY zXjMo0DqCr=`S?BWTfNAG=b-T*UmKC&7nc9%>96_7+xVmQD%q9(gfDv@($4E5_bO?& z_pouAG=g^6Y0+Y&egGm#oz1|aR9C3lj=H7MJu|CoES^j2zXSV5P9u7xV$avu%CLm%Mjlr8505cpAaia_66yY~S z3)8=M*(gaZz8}sPUNFB~M$hV*80D-`rt2PBNjxGp*{2nB;!R#>MC6umIqGixPf~+~ zGi`h7*iV)L)1kztRJ&g!IX-8kUvuzk{^0c-Z)(6~T%q(0bH_J^03hupj6~bt54QOn_G=ez62_Sw)S$(?Ib1*>?$Tf8 z7oh!aKntHw3=c&IfiR$x=ZQQ{oE~+ezjf922)KI#Cyg>zxX4DJGd*K3UI3l3)od%i zq=H9~qOa?#cg6|)D>{A-ECEh+@0Pw%5D)C4<`_;@$Tdtu_EVSaySPjwts;`I1UlBZiurQwVlD4V0Ia$n~Y~GsK|3CVODTd$58T zDg~Hd(N6GH5XpH)P+@*`w@w@CJY4naxNwz*hu{v^!Q}a7^K{#=f24tF2kKN>lD@wy zABJcDwM+yKj$IA0c^0iCDb2TN!f^;=6S4jniTiZULwsi$>-P`JyltVZJNJy^X@#>- zQ<16-Eny`?m>{1k(YIn~ob7HJy#uOnv{5rdfOl0X8K@dLS0u)D6eIGrC?79|gx&>R^<_cCplVXE%?4R4!4$)0qCX@*;zk0m$BTOiQ zidVjJ(`UIf!0%xfjcSk^Q}F_3 z0P)?%{+@MLw_bWSd1n6iA7V)w#4TfK%L8f}>tqW;xOasY4H_x@+6)yBwHcYZ`xx}1 z8p1?S$XEKYkQ0heGOz5HYe*=rA^hFDhe7HE1`High|R23#vH3*468;xL5+!P`F*?y zx9*_d3xEomb=Vt2rLV>hR-lPhPf)}yG~>`edCE?3U&kEY5euo3i+<|Qdi(uSRn~R9wuj&@0E}z-O3B!)xBRfjX6dBWH3rfRPo^X)Bm?E0{Sh||~UZuz7 z-@+R%E5;sJA9fZh3c56~RIF(0fYlg~Moo+5^I^8#CpY{noye)NBHT2f>K?RIR5}*( z*nxWXUM$R#zB3FTS4zCgvI#*tz;IxjyFtzzEz;bZ!Q!GeY!$+(rd;5d3ty<^>L-Nr zh})I)YOEY&kfEn*yIVlj4=|8V#ZD`>zRp<;XZdW57nsrl-(Fj#PBTVrmx8N}M$nhI zE_d1d*3JwWYa>?zoc##v%L3-Sp)BZ(3o4ce5sedmeEGL4hesQHg+`hRx68m-W?^Xq(S{f$1VqE>S%H>FkZf1}cW zjRVmM0Q7#47?KPsnDXj%+}Y1E``B!_lI6z0xGH)p|#}F zYnM@A^5(GIw~SgGJ<+4h-+;N-i))4fARJW|q%TTtHv0*T#He%*{j7_xosMV2-ju%U z{s2%Ux>9NPf+flc<*6e~q(?tH{ePTV8Klum2U{cRFXf9j|0<*l`I_c>WYj7r+e0;q zAT5m_il$839psmP#I_S}S2>~wP55%5y&hgJ*VpyCJ+*S>4sAQS9C!(9{BA#AVm_Z^ z7Q3$Z`?o!$vJRP1vOGo9k=)(=y)%dWwe(uyyirfMf=0A|?p|M@)OFGP7fOg4@qRvJ zlWTIe>RQD$t1`hIe|hDTBSkXJ@k%T+3lNLqlml7svM-8rQS3f&?S6L)+4~t zzHwrBt&9MNE&b;1v@P~~XRTS8kyBGrhX2YVM&mk`w%WqzOsY|7uhC5;>@M1 z)w4#l84mFK961Ry(MhlTYwISRKokF9iq4{*{^>-dvD{AZSAOG(*f+7F#YjQcCCho6 z%5b_)0PV_ZcanzZ^+f{N%v4E4duWzD8%K-3U9?o+v%!3)u4337FYwVYiYUi>j!T(0 zMIRcsR-g&>fU<*wQNX$N#%UwTlIs@-8GkO}UsHI$h;5R?=yl30(a^Pv_JeCZzR%~~ zL7V`+=!3Un@&A5PXgE`DJ`P4+8v&zHyi!fXb@Fgc(>IfnuYV%Br}aJysa)jO=WQ+{ zs-F28AXx_{Y4=ERIG5$bo)8S@$U}AV80ya#Lybjf*imtL5}UFcO-1fCY3TCgXS{2Q zNda?WWp1<{#))!m&C5{yxYrnR^i$_Zpf0uJ7x~Yc&cjm7n80B1R9*iHCV2Z-;`%s- z*9faWu4h>{EXM(XaO2^O>dn&QobVe%X_M+_!0Q}a-}6e0DYeb|ba9V9LD;SZ{};Xh z;vv>gs0(7@1H}D#(|SYXjId`Oh=|57fo2THssGi>kzNyqSId6&4YVm!l5ssXQG^X^ zNL_diRBJhy@D2s7(Fhm&D_1~0zJnN*nj*WrS2gF2Hw&z! zMXQi8kYOZL4Qq@-vT%F*AJcgwDi3?w=Gx!gmXlV*iZqt)kqho)$<{R%2+vi z=fKn~8uN8{QG-#eT;p6(9Ie-2aeS$K$JAnPJlrU!l}I%qVlBK^{EyS_5q`SLHDV=R zJs~R|Lh-FlQgKLTf%a#(jr)arXA_@(Dt&PSwiHPPt_*9}??PA!viC}$qfx!Z*XbB} zbyEj1^V|Yoxa2K3mGo_u1%ZV31O}37XvIv!ozY@~MFIg0?Tr`{YE>LFV_%5HNjyvE z_v)}C&r^z;hv-7pCgm5vk4mq+DeY%=CKEjR1P#}Wj6T^qTAAV&|5u$>4^bamR8@zI z+h_B6HJQ?%0rQtf)4G3?Qak{Xrz*e29)^tT4!*!tk9a?`J_$O${Y^mw35b5uUDG`a zB!AN{L~=Y9+G*F}*mKUBvLT(m&a)GUAVSW66}H7%b^aMrX9qL|X#tQ%bML!2_R3KN zA}l>rcdT9obMmiaVd5DmOgETJn|xbMQV%r%D-3bGnhiKc=M-&83>?Far1Ca%5v#4| z(ZTCK&wJNFeYAONTC|<8I+{+H_jg7INlS6{q<@nwu5|Zcr-brKsQu9I*;YT6JP6Zg ztRh}h`+LODm;T0bnqNRqBHsBnkuJQu>#tOL6*;=q9>jSw)G(wQ=?@>GHa8gq34AvC zD=R8NM}ryy_W(%opmvcHfwK|TgZ~Z#c&1a>MAN{9%`jh@Dsg-@-$^kW?E}zPLt;;V zQ0U@H2WGP3^!4%gW0`91L-y}hug5Er^Wb|N8jaR6a4bM5sS*{P&a0IeNM@sS3!jq9 z?4WP^Dk0XXIhrXvVZcU1^sT%jUvBs>oMa-lHu?72jVsAz?mn-a_*4-f zP0Mq4TsFIQwfs%1LN4uPF)~&!%H;-gZ157>Vz8+%i@XXlzsDuVxgve-NR(fLRn7E% zuA6kwMlvTN|Ke&E8H9e2v4>=j!2jRZci<pRqreXR2E^)q}#6Q>Bx>`P?jggB07n^eZ|tL{j#PQ-sb z%ZftmAz4bAl^Zu8_NZ*4hP&jEx(PMWWHY&}>CR; z+qo>SOOD!tF`UKX5tvFB#eH5Lb}b<2b!hxIG8^u6sqfWTnDRvtnZa`&<-K)NMzD%t z7)hhmi;T4G8gTiAqZ0hrOVTIMq zd>rs%28|997ed_lB?6igBcqiT`CT5ZCnP4mC4?G^{cjf&Ur$dA#*&&^r>SDy$UCcK zgdB1ekCY=Jvu{H-J~HFeWvV7&|Dp=33QX-@!^VkG(f>25HA7zQ>t(Hv?--5TVH7o% zE$o6`0lPoBp)2VjDh+mcFy&H)HIA$)s_aDCbHxR3l4aCHOt${OU@FP?e@tvB)aN4F z!n~#hS~fddtq#|sgmb5jX&lI7dQ-FxzTz8g2h<35X)nHT{91wsGb>=AofV&QYAFWM z>pmA1-9LP}mR_Q5tH6(y;4$8kWreImd|^?3PO zG~6z~7JbUj>@|=P@5wjqsH^7^SgVw!2BX#Pb59r+8`mm6h(PYLuHm%<_Va8kNF&hI z<+&W=;jK4E*8bq0^)I%@(P2Ux?+OsFRC^@tdPFq+IYuH`gLdjGgRz*68A%AHRs!ra z#<*cGWfFW^UwJ2hMvvav6^#-`Bl)?{V+h(?gEwcELc|tA>TkU4S0(v;1qGKD7lSrk z#pb0~0<7jo{s6_VeyIODdq++QL7LX7tq{4qVQMFy9sex~JoAcAIwY z$HJ5dRW9X1eXQlGN{NT^(>3wFdLUQ80r){;v`TThmmx|K6mzzH7U=md^SNHAwO*o- zmC7VxIT?U_)nm3&&0k!s(@Pm|q(lld#>)f&o2buq0}k_>ohX8mrjZYXR}6KZs&yE^ z4Ox_7lj=FmB+nYs;uk5pqW(#EvESs#8C>9N`f~zHSWutoQ;?q>M#|HYyK|CBADTp!4KETsr z67OekS!l%G41D9zaJtT&%Sse0ZH(ey^_JeX?2}YfHt`0$l%6yO_0Y{%xD1C;_}wvh zH;-HZL_)HItJg}|kPQURTcb{Y6y?3Y(#-7=fNZ`gMtD-xkx}@r;g^L{-+#4=#iyC zkkYwqGx;*`QS1P?U_5n_AxD#r7wiyH&ElO#w2dsdjk(wh^ytC0!e38JBS zYz||Zwp7XON67Uyrx7Z+n$3F2&G<>zmAF!4GcGO{`l|UJhUO6D`c%G_`wYH4G~RyJbd{D z{=&xM>0MYy0LM$QhgSbgUHSD}XZY|dm=at%mDTI9c1#Ov?vBiS5R*7e{fPij*i3#? zzVG0!_@bGK?3t#;`b)>1+f(|a*KL3y5Au)s4_@x^xXk(LN>Zp&=YjxOW5WG)sy{3z z%yYMYgG1omiv@X49oz04$|lIJ@E(rJY|MvKQn9K!Y}ClWKM(gpas2Yx$eElmI&`5Rb3%380EPwPy9b97%ux z9&d>WV|B}gde-uY0`%N^swF)Po5Ru|Q0GIMS9r#R$;LQRNSx3#QN@j@;*j=PLseZms~K zM@Xj`C*E?D$LqHS-$!I})iz7G&Qv~?iO?QFcArvHd5p_ys2xw~p>EzQ`~DR_-~2S+ z8H2b*1K{B++I1=ZZcJU_(j|LheEM7;5+5*&C>Da>z2)PvxwqaRI>-~iCLgfY2a~QX z`JQ7wN%RoFR+Y@Gvd?0U|39Xvi(xa}gs>yq>Q%J4LFCRx1 zI^6>5=mvwh3h8cUIZl^cYvFHc5JNfAaTY_>j7*6-I^kUb8>Y5KffFw3#BcI_{`b*( z+cHMR5Th@QncZCxbqjC#nhe!Py!2FLTKMuE5t~{ru0NslM6lB%2)4FWhRD?P_7}ug zKVJMljGoA_&4Cp%e-t{>ylpho&fRFuzD&WUS34sWG3G!(voiP(=}@QK-fSb5WJewQ z^O9?4d=o}xqxE?53yDi=)|BPROnn@!w11P2W%HsA&M>cyh@z8GE&E4i?y|6G5$x2K+xmxjJSXQ?27P}u$~9#dwSlQ}d! z@DR;!+r9BZbW>S4`Liw!eUNpKUl`oV;q6x>qs5`In-apFh%KAipM;N_!ZZJzV)P8nFsh?S3*S3Ujp?egEHdzM4& zYft;(t#*Ky7e|r4PTqF6?8U--s+r3GaiQ{SAj*f`EfP1rP&Z49B~l6F2l7&2XgEwB z>^ynEcu@l>?kXDPZ^_z7nU=F#0dklGxI$Q+#<9T!Yg>Hz>jwGoJ*G{3)DKhNDCVUy zr^vkhr6Td%7vv9sUj$0|=N|R(p=t+gvOAk^nxjppDC!5=R5gs6KaxL`F(`_Mm_ERzUqt6vr4~&oW&-v-Al}ZSxJF{Z4|&Msmi0~;H=o0 zyDRMtggJ{|P~eBlHVV56E}1gl8{&4HiYycU-r&X#jlVg@g^YPiLM@HoUZUg;!jnTf zP)yL&Oy>k~w>49_xBy?j69fgsc!&TAyHt;8f-lcD!9k}7<6_Qnnh++C&$jB#h5%gF zj4vc^n4D0`)o8q1{}Kxy2&has=O|AvRkoI(=f7>LN&XYt^f~>?=+mergy}=dT3yF# z=1TA~K>1w9ZajliH~2tx^!Wz`oG^hpKitM2rhK?TfsGy5O#3Gt zwf-|GCLHTF^k~W+=2mwGb9%H%wkokTU=S>A0yf1iPfbm1COm(dh0LbW`f!*?dPUqo z_kl6a8U1gfq9PFXY8NHOFt~km*+PN6y7SXOznbW@c>dCMyt%s3lCd{p(BwEH9FfK| z{O*rEO7*^5L*5+bwTgZfOf>)Cs%F8z=>rU*$(-H3(>}hdgiJym9;p>;N*_DcRx0A* zIZ8&>NHZ!Xb3N|u9tZP=D=`{)hfe};eHXr}GwHSgAVoAu{oDv}zwwURqR{q2WFski za=(fCXibIjY?dDCS$-@1)92i~#N(K_?x6|g3JB}hRx&q-N$bj~6!4@-!+oi2i3~5jtA8 z{oJ2RN?mn7+x?MkMj#z)o5M_;^94@Wdi963EZBZB&hdI^s+~2yg zVQvmzNXg7l+cAw#iSBQ$@JPzL(oALKsXnt7`Jtm4UUrWPksPI3Al-Y0qhhO-P$Gl; zVO)*}{MH^_H}0lS!NIm_=^t@gzwBN1@FOnyh&s~)ihR|c>!v3H3+lDdW4ktn#Rh=G zZ$t0IsEV*Sd4S=ICw$(S=#L4n>{1=*+k(HSe}c~W>6|%;cu>9vTF;p*G;?f{JXkt* zb0%JHYinDqmsS5u1yl{JjKX{#3u=e)kA|PS<`{CsW+v2h;#R{c?l?9=C2=g|q1o|- zC`Rf%mzbH}*SB0ufYe`#*pWrFQrFsgSZr$A47A^bX`AhzcqCe3QYZ~?68%w_2Uu1f zF>O8Pwqy_+y?p1N{~|JvLHMgFU%CO3-s#<}?XP;U4{tnxI8NMy9uPGdX{twCmie~$ zk{CxobqM+eBmCr>V))rT7bQO9OP~(a(=Iel+g08FbfJch16*HrmiT_4JH zlj%}xi5ZYqJ(WovE)Q815qAL}$C#h#Re3&9ES_DUc;ko6s>!RFQauoSDzNr2`S2z$ zz3c1nCx(JgoT8OmR|4TUKpU9B$ItJ-z5B(6H_T7ZX~T#rQfwhGwdBcB_ua=h6P;9& z|DBhTFA+~NESTL5gPMc+J!xs7E~5jcGhndoD>g^ff+D?HBqJ(LClSa?00Ya! zVpiTHQlbcdQe2j92r`Z9

    BekxUBx&hjuwmpo;8bvves!kpOZ_}dT(to#|^*${`hUo6w3EYlCYn51X9>gJYY zd~U%Gdg5@QnCn%ZQdfE=6r*pU<_X{!+A}-Bu~Bm9PT{K`ax zCI3f$C+8~HCB`mXH!r#jq5LIum+>n!>ldB@u5bT*Uuj$U?9q&@pogK)@PUom@%52( zs=}xL8(#haY**QM=09F|+T0G44`i%10Rus(tjf^zb zho9}D+1$8|forbp_}?mtMD1%nF^4FlCQM-SvJKE579 zmoaltgWL@tNhKF>ufHUEtRTlNeQzBUo#U$i7!wFJ7owbA14>>}Wj=Hf)z}iOyWBZC zW68DBZQ~s5`v~PX)g(fmjG#p>1o^UhrZ`GOozU&O-aQkIj)fa>p6IVKlN0s~b@rB= zQd2GqMF<}eey`X4k; zf|I7KeI1sQ*jLLb(^Y18PL{IXA>@4{JDCIitpwO)2!~=%TO_}1j&e3P`ZA9NmAP#( zO1ZZz1@Lkf_NL#phAJJX-!NnaRS2dQuCH*i8E_Q)J=tG36X?JaR`R}KkEK}=EzfJa zITJ{M%Qlnw4o+=%2p?VtUY@hh7D3o8fv@d1!X`MWg(_&pijz(H&pp%V;Ga8IA~fY+ z)bMm{NO%hc)jE3H9$w7Ye|G+BHPx`1AVKl=n#|Jg@eS&V68e5}X)kS*Xi# zcjv+aO<^&8z^afaXGbcK)JO;HkKOK{kW8e}?u=fUyj}D@k#Y8+E}Y=%@cgSzV3Se( zA=%o|U+_C<5hJYt3v^&^o;cO?UE(q_jryIWK~io%7)#3Qu1`4Yv~0-w^!o;%g_;IF zV(rU~*K9E7%bnkJpe$cCj{y@3o-ha0EKv1q>YKx;`>?on3@IyBkIaS$GiERLWa+ql z)6r?h_g0MjIs*kxMz4Dox|dHV%xp4^^MuY-qv;P?O_>WO9`Zp}9Zdrr^!#||qy((b zpJg?XyfyGq+FD;)KHIpI^mx3oz0D;Zb`Y$ZUBCM;btO@?wZjws;jme#xPCub94QN= z`?JTG#Nk;K4lQ36fywi9e$I>{ohm8Rl`*`n_n$tSy1!2OE4S7AsJ#W^#ffR_LB{ys zZr1E>xZ6iZ;O530o(;->PJcFrm(+N|myPG0pgvGv>Bn*BG3w#B3Hv;q#2uK0dmp{- zaV$bQN%<-MKKVp-+?lE0P8M>gqLepFsp3Jy;y_n^Ju^Yjub{>>=Zb8BNsHyf c7k7BH_s|Vaq%Ukz?)~pkQ_@zfkT(zeALTpLVE_OC diff --git a/app/Vendor/Ratchet/vendor/react/react/scripts/do-split.sh b/app/Vendor/Ratchet/vendor/react/react/scripts/do-split.sh deleted file mode 100755 index 20473c96a6..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/scripts/do-split.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# -# Using git-subsplit -# https://github.com/dflydev/git-subsplit - -GIT_SUBSPLIT=$(pwd)/$(dirname $0)/git-subsplit.sh - -$GIT_SUBSPLIT init https://github.com/reactphp/react - -$GIT_SUBSPLIT update - -$GIT_SUBSPLIT publish " - src/React/EventLoop:git@github.com:reactphp/event-loop.git - src/React/Stream:git@github.com:reactphp/stream.git - src/React/Cache:git@github.com:reactphp/cache.git - src/React/Socket:git@github.com:reactphp/socket.git - src/React/SocketClient:git@github.com:reactphp/socket-client.git - src/React/Http:git@github.com:reactphp/http.git - src/React/HttpClient:git@github.com:reactphp/http-client.git - src/React/Dns:git@github.com:reactphp/dns.git -" --heads=master diff --git a/app/Vendor/Ratchet/vendor/react/react/scripts/git-subsplit.sh b/app/Vendor/Ratchet/vendor/react/react/scripts/git-subsplit.sh deleted file mode 100755 index d956c12169..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/scripts/git-subsplit.sh +++ /dev/null @@ -1,232 +0,0 @@ -#!/bin/bash -# -# git-subsplit.sh: Automate and simplify the process of managing one-way -# read-only subtree splits. -# -# Copyright (C) 2012 Dragonfly Development Inc. -# -if [ $# -eq 0 ]; then - set -- -h -fi -OPTS_SPEC="\ -git subsplit init url -git subsplit publish splits --heads= --tags= --splits= -git subsplit update --- -h,help show the help -q quiet -n,dry-run do everything except actually send the updates -work-dir directory that contains the subsplit working directory - - options for 'publish' -heads= only publish for listed heads instead of all heads -no-heads do not publish any heads -tags= only publish for listed tags instead of all tags -no-tags do not publish any tags -update fetch updates from repository before publishing -rebuild-tags rebuild all tags (as opposed to skipping tags that are already synced) -" -eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)" - -# We can run this from anywhere. -NONGIT_OK=1 - -PATH=$PATH:$(git --exec-path) - -. git-sh-setup - -if [ "$(hash git-subtree &>/dev/null && echo OK)" = "" ] -then - die "Git subplit needs git subtree; install git subtree or upgrade git to >=1.7.11" -fi - -ANNOTATE= -QUIET= -COMMAND= -SPLITS= -REPO_URL= -WORK_DIR="${PWD}/.subsplit" -HEADS= -TAGS= -REBUILD_TAGS= -DRY_RUN= - -subsplit_main() -{ - while [ $# -gt 0 ]; do - opt="$1" - shift - case "$opt" in - -q) QUIET=1 ;; - --heads) HEADS="$1"; shift ;; - --no-heads) NO_HEADS=1 ;; - --tags) TAGS="$1"; shift ;; - --no-tags) NO_TAGS=1 ;; - --update) UPDATE=1 ;; - -n) DRY_RUN="--dry-run" ;; - --dry-run) DRY_RUN="--dry-run" ;; - --rebuild-tags) REBUILD_TAGS=1 ;; - --) break ;; - *) die "Unexpected option: $opt" ;; - esac - done - - COMMAND="$1" - shift - - case "$COMMAND" in - init) - if [ $# -lt 1 ]; then die "init command requires url to be passed as first argument"; fi - REPO_URL="$1" - shift - subsplit_init - ;; - publish) - if [ $# -lt 1 ]; then die "publish command requires splits to be passed as first argument"; fi - SPLITS="$1" - shift - subsplit_publish - ;; - update) - subsplit_update - ;; - *) die "Unknown command '$COMMAND'" ;; - esac -} -say() -{ - if [ -z "$QUIET" ]; then - echo "$@" >&2 - fi -} - -subsplit_require_work_dir() -{ - if [ ! -e "$WORK_DIR" ] - then - die "Working directory not found at ${WORK_DIR}; please run init first" - fi - - pushd "$WORK_DIR" >/dev/null -} - -subsplit_init() -{ - if [ -e "$WORK_DIR" ] - then - die "Working directory already found at ${WORK_DIR}; please remove or run update" - fi - - say "Initializing subsplit from origin (${REPO_URL})" - - git clone -q "$REPO_URL" "$WORK_DIR" || die "Could not clone repository" -} - -subsplit_publish() -{ - subsplit_require_work_dir - - if [ -n "$UPDATE" ]; - then - subsplit_update - fi - - if [ -z "$HEADS" ] && [ -z "$NO_HEADS" ] - then - # If heads are not specified and we want heads, discover them. - HEADS="$(git ls-remote origin 2>/dev/null | grep "refs/heads/" | cut -f3- -d/)" - fi - - if [ -z "$TAGS" ] && [ -z "$NO_TAGS" ] - then - # If tags are not specified and we want tags, discover them. - TAGS="$(git ls-remote origin 2>/dev/null | grep -v "\^{}" | grep "refs/tags/" | cut -f3 -d/)" - fi - - for SPLIT in $SPLITS - do - SUBPATH=$(echo "$SPLIT" | cut -f1 -d:) - REMOTE_URL=$(echo "$SPLIT" | cut -f2- -d:) - REMOTE_NAME=$(echo "$SPLIT" | git hash-object --stdin) - - if ! git remote | grep "^${REMOTE_NAME}$" >/dev/null - then - git remote add "$REMOTE_NAME" "$REMOTE_URL" - fi - - - say "Syncing ${SUBPATH} -> ${REMOTE_URL}" - - for HEAD in $HEADS - do - if ! git show-ref --quiet --verify -- "refs/remotes/origin/${HEAD}" - then - say " - skipping head '${HEAD}' (does not exist)" - continue - fi - LOCAL_BRANCH="${REMOTE_NAME}-branch-${HEAD}" - say " - syncing branch '${HEAD}'" - git branch -D "$LOCAL_BRANCH" >/dev/null 2>&1 - git subtree split -q --prefix="$SUBPATH" --branch="$LOCAL_BRANCH" "origin/${HEAD}" >/dev/null - if [ $? -eq 0 ] - then - PUSH_CMD="git push -q ${DRY_RUN} --force $REMOTE_NAME ${LOCAL_BRANCH}:${HEAD}" - if [ -n "$DRY_RUN" ] - then - echo \# $PUSH_CMD - $PUSH_CMD - else - $PUSH_CMD - fi - fi - done - - for TAG in $TAGS - do - if ! git show-ref --quiet --verify -- "refs/tags/${TAG}" - then - say " - skipping tag '${TAG}' (does not exist)" - continue - fi - LOCAL_TAG="${REMOTE_NAME}-tag-${TAG}" - if git branch | grep "${LOCAL_TAG}$" >/dev/null && [ -z "$REBUILD_TAGS" ] - then - say " - skpping tag '${TAG}' (already synced)" - continue - fi - say " - syncing tag '${TAG}'" - say " - deleting '${LOCAL_TAG}'" - git branch -D "$LOCAL_TAG" >/dev/null 2>&1 - say " - subtree split for '${TAG}'" - git subtree split -q --annotate="${ANNOTATE}" --prefix="$SUBPATH" --branch="$LOCAL_TAG" "$TAG" >/dev/null - say " - subtree split for '${TAG}' [DONE]" - if [ $? -eq 0 ] - then - PUSH_CMD="git push -q ${DRY_RUN} --force ${REMOTE_NAME} ${LOCAL_TAG}:refs/tags/${TAG}" - if [ -n "$DRY_RUN" ] - then - echo \# $PUSH_CMD - $PUSH_CMD - else - $PUSH_CMD - fi - fi - done - done - - popd >/dev/null -} - -subsplit_update() -{ - subsplit_require_work_dir - - say "Updating subsplit from origin" - - git fetch -q origin - git fetch -q -t origin - - popd >/dev/null -} - -subsplit_main "$@" diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/ArrayCache.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/ArrayCache.php deleted file mode 100644 index 94900e7561..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/ArrayCache.php +++ /dev/null @@ -1,29 +0,0 @@ -data[$key])) { - return When::reject(); - } - - return When::resolve($this->data[$key]); - } - - public function set($key, $value) - { - $this->data[$key] = $value; - } - - public function remove($key) - { - unset($this->data[$key]); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/CacheInterface.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/CacheInterface.php deleted file mode 100644 index fd5f2d5405..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/CacheInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -get('foo') - ->then('var_dump'); - -This example fetches the value of the key `foo` and passes it to the -`var_dump` function. You can use any of the composition provided by -[promises](https://github.com/reactphp/promise). - -If the key `foo` does not exist, the promise will be rejected. - -### set - - $cache->set('foo', 'bar'); - -This example eventually sets the value of the key `foo` to `bar`. If it -already exists, it is overridden. No guarantees are made as to when the cache -value is set. If the cache implementation has to go over the network to store -it, it may take a while. - -### remove - - $cache->remove('foo'); - -This example eventually removes the key `foo` from the cache. As with `set`, -this may not happen instantly. - -## Common usage - -### Fallback get - -A common use case of caches is to attempt fetching a cached value and as a -fallback retrieve it from the original data source if not found. Here is an -example of that: - - $cache - ->get('foo') - ->then(null, 'getFooFromDb') - ->then('var_dump'); - -First an attempt is made to retrieve the value of `foo`. A promise rejection -handler of the function `getFooFromDb` is registered. `getFooFromDb` is a -function (can be any PHP callable) that will be called if the key does not -exist in the cache. - -`getFooFromDb` can handle the missing key by returning a promise for the -actual value from the database (or any other data source). As a result, this -chain will correctly fall back, and provide the value in both cases. - -### Fallback get and set - -To expand on the fallback get example, often you want to set the value on the -cache after fetching it from the data source. - - $cache - ->get('foo') - ->then(null, array($this, 'getAndCacheFooFromDb')) - ->then('var_dump'); - - public function getAndCacheFooFromDb() - { - return $this->db - ->get('foo') - ->then(array($this, 'cacheFooFromDb')); - } - - public function cacheFooFromDb($foo) - { - $this->cache->set('foo', $foo); - - return $foo; - } - -By using chaining you can easily conditionally cache the value if it is -fetched from the database. diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/composer.json b/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/composer.json deleted file mode 100644 index 3b73b6ad17..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Cache/composer.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "react/cache", - "description": "Async caching.", - "keywords": ["cache"], - "license": "MIT", - "require": { - "php": ">=5.3.2", - "react/promise": "~1.0" - }, - "autoload": { - "psr-0": { "React\\Cache": "" } - }, - "target-dir": "React/Cache", - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/BadServerException.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/BadServerException.php deleted file mode 100644 index 3bf50f15cb..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/BadServerException.php +++ /dev/null @@ -1,7 +0,0 @@ -loop = $loop; - } - - public function create($filename) - { - return $this - ->loadEtcResolvConf($filename) - ->then(array($this, 'parseEtcResolvConf')); - } - - public function parseEtcResolvConf($contents) - { - $nameservers = array(); - - $contents = preg_replace('/^#/', '', $contents); - $lines = preg_split('/\r?\n/is', $contents); - foreach ($lines as $line) { - if (preg_match('/^nameserver (.+)/', $line, $match)) { - $nameservers[] = $match[1]; - } - } - - $config = new Config(); - $config->nameservers = $nameservers; - - return When::resolve($config); - } - - public function loadEtcResolvConf($filename) - { - if (!file_exists($filename)) { - return When::reject(new \InvalidArgumentException("The filename for /etc/resolv.conf given does not exist: $filename")); - } - - try { - $deferred = new Deferred(); - - $fd = fopen($filename, 'r'); - stream_set_blocking($fd, 0); - - $contents = ''; - - $stream = new Stream($fd, $this->loop); - $stream->on('data', function ($data) use (&$contents) { - $contents .= $data; - }); - $stream->on('end', function () use (&$contents, $deferred) { - $deferred->resolve($contents); - }); - $stream->on('error', function ($error) use ($deferred) { - $deferred->reject($error); - }); - - return $deferred->promise(); - } catch (\Exception $e) { - return When::reject($e); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/HeaderBag.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/HeaderBag.php deleted file mode 100644 index 193e65cd48..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/HeaderBag.php +++ /dev/null @@ -1,56 +0,0 @@ - 0, - 'anCount' => 0, - 'nsCount' => 0, - 'arCount' => 0, - 'qr' => 0, - 'opcode' => Message::OPCODE_QUERY, - 'aa' => 0, - 'tc' => 0, - 'rd' => 0, - 'ra' => 0, - 'z' => 0, - 'rcode' => Message::RCODE_OK, - ); - - public function get($name) - { - return isset($this->attributes[$name]) ? $this->attributes[$name] : null; - } - - public function set($name, $value) - { - $this->attributes[$name] = $value; - } - - public function isQuery() - { - return 0 === $this->attributes['qr']; - } - - public function isResponse() - { - return 1 === $this->attributes['qr']; - } - - public function isTruncated() - { - return 1 === $this->attributes['tc']; - } - - public function populateCounts(Message $message) - { - $this->attributes['qdCount'] = count($message->questions); - $this->attributes['anCount'] = count($message->answers); - $this->attributes['nsCount'] = count($message->authority); - $this->attributes['arCount'] = count($message->additional); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Message.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Message.php deleted file mode 100644 index a3ced691c1..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Message.php +++ /dev/null @@ -1,47 +0,0 @@ -header = new HeaderBag(); - } - - public function prepare() - { - $this->header->populateCounts($this); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Record.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Record.php deleted file mode 100644 index 029d2324ba..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Model/Record.php +++ /dev/null @@ -1,21 +0,0 @@ -name = $name; - $this->type = $type; - $this->class = $class; - $this->ttl = $ttl; - $this->data = $data; - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/BinaryDumper.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/BinaryDumper.php deleted file mode 100644 index 35d6ae601a..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/BinaryDumper.php +++ /dev/null @@ -1,62 +0,0 @@ -headerToBinary($message->header); - $data .= $this->questionToBinary($message->questions); - - return $data; - } - - private function headerToBinary(HeaderBag $header) - { - $data = ''; - - $data .= pack('n', $header->get('id')); - - $flags = 0x00; - $flags = ($flags << 1) | $header->get('qr'); - $flags = ($flags << 4) | $header->get('opcode'); - $flags = ($flags << 1) | $header->get('aa'); - $flags = ($flags << 1) | $header->get('tc'); - $flags = ($flags << 1) | $header->get('rd'); - $flags = ($flags << 1) | $header->get('ra'); - $flags = ($flags << 3) | $header->get('z'); - $flags = ($flags << 4) | $header->get('rcode'); - - $data .= pack('n', $flags); - - $data .= pack('n', $header->get('qdCount')); - $data .= pack('n', $header->get('anCount')); - $data .= pack('n', $header->get('nsCount')); - $data .= pack('n', $header->get('arCount')); - - return $data; - } - - private function questionToBinary(array $questions) - { - $data = ''; - - foreach ($questions as $question) { - $labels = explode('.', $question['name']); - foreach ($labels as $label) { - $data .= chr(strlen($label)).$label; - } - $data .= "\x00"; - - $data .= pack('n*', $question['type'], $question['class']); - } - - return $data; - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/Parser.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/Parser.php deleted file mode 100644 index 1099328a11..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Protocol/Parser.php +++ /dev/null @@ -1,228 +0,0 @@ -data .= $data; - - if (!$message->header->get('id')) { - if (!$this->parseHeader($message)) { - return; - } - } - - if ($message->header->get('qdCount') != count($message->questions)) { - if (!$this->parseQuestion($message)) { - return; - } - } - - if ($message->header->get('anCount') != count($message->answers)) { - if (!$this->parseAnswer($message)) { - return; - } - } - - return $message; - } - - public function parseHeader(Message $message) - { - if (strlen($message->data) < 12) { - return; - } - - $header = substr($message->data, 0, 12); - $message->consumed += 12; - - list($id, $fields, $qdCount, $anCount, $nsCount, $arCount) = array_values(unpack('n*', $header)); - - $rcode = $fields & bindec('1111'); - $z = ($fields >> 4) & bindec('111'); - $ra = ($fields >> 7) & 1; - $rd = ($fields >> 8) & 1; - $tc = ($fields >> 9) & 1; - $aa = ($fields >> 10) & 1; - $opcode = ($fields >> 11) & bindec('1111'); - $qr = ($fields >> 15) & 1; - - $vars = compact('id', 'qdCount', 'anCount', 'nsCount', 'arCount', - 'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z', 'rcode'); - - - foreach ($vars as $name => $value) { - $message->header->set($name, $value); - } - - return $message; - } - - public function parseQuestion(Message $message) - { - if (strlen($message->data) < 2) { - return; - } - - $consumed = $message->consumed; - - list($labels, $consumed) = $this->readLabels($message->data, $consumed); - - if (null === $labels) { - return; - } - - if (strlen($message->data) - $consumed < 4) { - return; - } - - list($type, $class) = array_values(unpack('n*', substr($message->data, $consumed, 4))); - $consumed += 4; - - $message->consumed = $consumed; - - $message->questions[] = array( - 'name' => implode('.', $labels), - 'type' => $type, - 'class' => $class, - ); - - if ($message->header->get('qdCount') != count($message->questions)) { - return $this->parseQuestion($message); - } - - return $message; - } - - public function parseAnswer(Message $message) - { - if (strlen($message->data) < 2) { - return; - } - - $consumed = $message->consumed; - - list($labels, $consumed) = $this->readLabels($message->data, $consumed); - - if (null === $labels) { - return; - } - - if (strlen($message->data) - $consumed < 10) { - return; - } - - list($type, $class) = array_values(unpack('n*', substr($message->data, $consumed, 4))); - $consumed += 4; - - list($ttl) = array_values(unpack('N', substr($message->data, $consumed, 4))); - $consumed += 4; - - list($rdLength) = array_values(unpack('n', substr($message->data, $consumed, 2))); - $consumed += 2; - - $rdata = null; - - if (Message::TYPE_A === $type) { - $ip = substr($message->data, $consumed, $rdLength); - $consumed += $rdLength; - - $rdata = inet_ntop($ip); - } - - if (Message::TYPE_CNAME === $type) { - list($bodyLabels, $consumed) = $this->readLabels($message->data, $consumed); - - $rdata = implode('.', $bodyLabels); - } - - $message->consumed = $consumed; - - $name = implode('.', $labels); - $ttl = $this->signedLongToUnsignedLong($ttl); - $record = new Record($name, $type, $class, $ttl, $rdata); - - $message->answers[] = $record; - - if ($message->header->get('anCount') != count($message->answers)) { - return $this->parseAnswer($message); - } - - return $message; - } - - private function readLabels($data, $consumed) - { - $labels = array(); - - while (true) { - if ($this->isEndOfLabels($data, $consumed)) { - $consumed += 1; - break; - } - - if ($this->isCompressedLabel($data, $consumed)) { - list($newLabels, $consumed) = $this->getCompressedLabel($data, $consumed); - $labels = array_merge($labels, $newLabels); - break; - } - - $length = ord(substr($data, $consumed, 1)); - $consumed += 1; - - if (strlen($data) - $consumed < $length) { - return array(null, null); - } - - $labels[] = substr($data, $consumed, $length); - $consumed += $length; - } - - return array($labels, $consumed); - } - - public function isEndOfLabels($data, $consumed) - { - $length = ord(substr($data, $consumed, 1)); - return 0 === $length; - } - - public function getCompressedLabel($data, $consumed) - { - list($nameOffset, $consumed) = $this->getCompressedLabelOffset($data, $consumed); - list($labels) = $this->readLabels($data, $nameOffset); - - return array($labels, $consumed); - } - - public function isCompressedLabel($data, $consumed) - { - $mask = 0xc000; // 1100000000000000 - list($peek) = array_values(unpack('n', substr($data, $consumed, 2))); - - return (bool) ($peek & $mask); - } - - public function getCompressedLabelOffset($data, $consumed) - { - $mask = 0x3fff; // 0011111111111111 - list($peek) = array_values(unpack('n', substr($data, $consumed, 2))); - - return array($peek & $mask, $consumed + 2); - } - - public function signedLongToUnsignedLong($i) - { - return $i & 0x80000000 ? $i - 0xffffffff : $i; - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/CachedExecutor.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/CachedExecutor.php deleted file mode 100644 index 3fbca5fc53..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/CachedExecutor.php +++ /dev/null @@ -1,68 +0,0 @@ -executor = $executor; - $this->cache = $cache; - } - - public function query($nameserver, Query $query) - { - $that = $this; - $executor = $this->executor; - $cache = $this->cache; - - return $this->cache - ->lookup($query) - ->then( - function ($cachedRecords) use ($that, $query) { - return $that->buildResponse($query, $cachedRecords); - }, - function () use ($executor, $cache, $nameserver, $query) { - return $executor - ->query($nameserver, $query) - ->then(function ($response) use ($cache, $query) { - $cache->storeResponseMessage($query->currentTime, $response); - return $response; - }); - } - ); - } - - public function buildResponse(Query $query, array $cachedRecords) - { - $response = new Message(); - - $response->header->set('id', $this->generateId()); - $response->header->set('qr', 1); - $response->header->set('opcode', Message::OPCODE_QUERY); - $response->header->set('rd', 1); - $response->header->set('rcode', Message::RCODE_OK); - - $response->questions[] = new Record($query->name, $query->type, $query->class); - - foreach ($cachedRecords as $record) { - $response->answers[] = $record; - } - - $response->prepare(); - - return $response; - } - - protected function generateId() - { - return mt_rand(0, 0xffff); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/Executor.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/Executor.php deleted file mode 100644 index 0a4650b8f9..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/Executor.php +++ /dev/null @@ -1,108 +0,0 @@ -loop = $loop; - $this->parser = $parser; - $this->dumper = $dumper; - $this->timeout = $timeout; - } - - public function query($nameserver, Query $query) - { - $request = $this->prepareRequest($query); - - $queryData = $this->dumper->toBinary($request); - $transport = strlen($queryData) > 512 ? 'tcp' : 'udp'; - - return $this->doQuery($nameserver, $transport, $queryData, $query->name); - } - - public function prepareRequest(Query $query) - { - $request = new Message(); - $request->header->set('id', $this->generateId()); - $request->header->set('rd', 1); - $request->questions[] = (array) $query; - $request->prepare(); - - return $request; - } - - public function doQuery($nameserver, $transport, $queryData, $name) - { - $that = $this; - $parser = $this->parser; - $loop = $this->loop; - - $response = new Message(); - $deferred = new Deferred(); - - $retryWithTcp = function () use ($that, $nameserver, $queryData, $name) { - return $that->doQuery($nameserver, 'tcp', $queryData, $name); - }; - - $timer = $this->loop->addTimer($this->timeout, function () use (&$conn, $name, $deferred) { - $conn->close(); - $deferred->reject(new TimeoutException(sprintf("DNS query for %s timed out", $name))); - }); - - $conn = $this->createConnection($nameserver, $transport); - $conn->on('data', function ($data) use ($retryWithTcp, $conn, $parser, $response, $transport, $deferred, $timer) { - $responseReady = $parser->parseChunk($data, $response); - - if (!$responseReady) { - return; - } - - $timer->cancel(); - - if ($response->header->isTruncated()) { - if ('tcp' === $transport) { - $deferred->reject(new BadServerException('The server set the truncated bit although we issued a TCP request')); - } else { - $conn->end(); - $deferred->resolve($retryWithTcp()); - } - - return; - } - - $conn->end(); - $deferred->resolve($response); - }); - $conn->write($queryData); - - return $deferred->promise(); - } - - protected function generateId() - { - return mt_rand(0, 0xffff); - } - - protected function createConnection($nameserver, $transport) - { - $fd = stream_socket_client("$transport://$nameserver"); - $conn = new Connection($fd, $this->loop); - - return $conn; - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/ExecutorInterface.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/ExecutorInterface.php deleted file mode 100644 index 2f7a6359ee..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/ExecutorInterface.php +++ /dev/null @@ -1,8 +0,0 @@ -name = $name; - $this->type = $type; - $this->class = $class; - $this->currentTime = $currentTime; - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordBag.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordBag.php deleted file mode 100644 index 358cf5da08..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordBag.php +++ /dev/null @@ -1,27 +0,0 @@ -records[$record->data] = array($currentTime + $record->ttl, $record); - } - - public function all() - { - return array_values(array_map( - function ($value) { - list($expiresAt, $record) = $value; - return $record; - }, - $this->records - )); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordCache.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordCache.php deleted file mode 100644 index 6ff0d6af42..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RecordCache.php +++ /dev/null @@ -1,82 +0,0 @@ -cache = $cache; - } - - public function lookup(Query $query) - { - $id = $this->serializeQueryToIdentity($query); - - $expiredAt = $this->expiredAt; - - return $this->cache - ->get($id) - ->then(function ($value) use ($query, $expiredAt) { - $recordBag = unserialize($value); - - if (null !== $expiredAt && $expiredAt <= $query->currentTime) { - return When::reject(); - } - - return $recordBag->all(); - }); - } - - public function storeResponseMessage($currentTime, Message $message) - { - foreach ($message->answers as $record) { - $this->storeRecord($currentTime, $record); - } - } - - public function storeRecord($currentTime, Record $record) - { - $id = $this->serializeRecordToIdentity($record); - - $cache = $this->cache; - - $this->cache - ->get($id) - ->then( - function ($value) { - return unserialize($value); - }, - function ($e) { - return new RecordBag(); - } - ) - ->then(function ($recordBag) use ($id, $currentTime, $record, $cache) { - $recordBag->set($currentTime, $record); - $cache->set($id, serialize($recordBag)); - }); - } - - public function expire($currentTime) - { - $this->expiredAt = $currentTime; - } - - public function serializeQueryToIdentity(Query $query) - { - return sprintf('%s:%s:%s', $query->name, $query->type, $query->class); - } - - public function serializeRecordToIdentity(Record $record) - { - return sprintf('%s:%s:%s', $record->name, $record->type, $record->class); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RetryExecutor.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RetryExecutor.php deleted file mode 100644 index 240b4c4344..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/RetryExecutor.php +++ /dev/null @@ -1,51 +0,0 @@ -executor = $executor; - $this->retries = $retries; - } - - public function query($nameserver, Query $query) - { - $deferred = new Deferred(); - - $this->tryQuery($nameserver, $query, $this->retries, $deferred->resolver()); - - return $deferred->promise(); - } - - public function tryQuery($nameserver, Query $query, $retries, $resolver) - { - $that = $this; - $errorback = function ($error) use ($nameserver, $query, $retries, $resolver, $that) { - if (!$error instanceof TimeoutException) { - $resolver->reject($error); - return; - } - if (0 >= $retries) { - $error = new \RuntimeException( - sprintf("DNS query for %s failed: too many retries", $query->name), - 0, - $error - ); - $resolver->reject($error); - return; - } - $that->tryQuery($nameserver, $query, $retries-1, $resolver); - }; - - $this->executor - ->query($nameserver, $query) - ->then(array($resolver, 'resolve'), $errorback); - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/TimeoutException.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/TimeoutException.php deleted file mode 100644 index 90bf806b85..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Query/TimeoutException.php +++ /dev/null @@ -1,7 +0,0 @@ -create('8.8.8.8', $loop); - - $dns->resolve('igor.io')->then(function ($ip) { - echo "Host: $ip\n"; - }); - -But there's more. - -## Caching - -You can cache results by configuring the resolver to use a `CachedExecutor`: - - $loop = React\EventLoop\Factory::create(); - $factory = new React\Dns\Resolver\Factory(); - $dns = $factory->createCached('8.8.8.8', $loop); - - $dns->resolve('igor.io')->then(function ($ip) { - echo "Host: $ip\n"; - }); - - ... - - $dns->resolve('igor.io')->then(function ($ip) { - echo "Host: $ip\n"; - }); - -If the first call returns before the second, only one query will be executed. -The second result will be served from cache. - -## Todo - -* Implement message body parsing for types other than A and CNAME: NS, SOA, PTR, MX, TXT, AAAA -* Implement `authority` and `additional` message parts -* Respect /etc/hosts - -# References - -* [RFC1034](http://tools.ietf.org/html/rfc1034) Domain Names - Concepts and Facilities -* [RFC1035](http://tools.ietf.org/html/rfc1035) Domain Names - Implementation and Specification diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/RecordNotFoundException.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/RecordNotFoundException.php deleted file mode 100644 index 0028413da8..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/RecordNotFoundException.php +++ /dev/null @@ -1,7 +0,0 @@ -addPortToServerIfMissing($nameserver); - $executor = $this->createRetryExecutor($loop); - - return new Resolver($nameserver, $executor); - } - - public function createCached($nameserver, LoopInterface $loop) - { - $nameserver = $this->addPortToServerIfMissing($nameserver); - $executor = $this->createCachedExecutor($loop); - - return new Resolver($nameserver, $executor); - } - - protected function createExecutor(LoopInterface $loop) - { - return new Executor($loop, new Parser(), new BinaryDumper()); - } - - protected function createRetryExecutor(LoopInterface $loop) - { - return new RetryExecutor($this->createExecutor($loop)); - } - - protected function createCachedExecutor(LoopInterface $loop) - { - return new CachedExecutor($this->createRetryExecutor($loop), new RecordCache(new ArrayCache())); - } - - protected function addPortToServerIfMissing($nameserver) - { - if (strpos($nameserver, '[') === false && substr_count($nameserver, ':') >= 2) { - // several colons, but not enclosed in square brackets => enclose IPv6 address in square brackets - $nameserver = '[' . $nameserver . ']'; - } - // assume a dummy scheme when checking for the port, otherwise parse_url() fails - if (parse_url('dummy://' . $nameserver, PHP_URL_PORT) === null) { - $nameserver .= ':53'; - } - - return $nameserver; - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Resolver/Resolver.php b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Resolver/Resolver.php deleted file mode 100644 index 6125879d29..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/Resolver/Resolver.php +++ /dev/null @@ -1,59 +0,0 @@ -nameserver = $nameserver; - $this->executor = $executor; - } - - public function resolve($domain) - { - $that = $this; - - $query = new Query($domain, Message::TYPE_A, Message::CLASS_IN, time()); - - return $this->executor - ->query($this->nameserver, $query) - ->then(function (Message $response) use ($that) { - return $that->extractAddress($response, Message::TYPE_A); - }); - } - - public function extractAddress(Message $response, $type) - { - $answer = $this->pickRandomAnswerOfType($response, $type); - $address = $answer->data; - return $address; - } - - public function pickRandomAnswerOfType(Message $response, $type) - { - // TODO: filter by name to make sure domain matches - // TODO: resolve CNAME aliases - - $filteredAnswers = array_filter($response->answers, function ($answer) use ($type) { - return $type === $answer->type; - }); - - if (0 === count($filteredAnswers)) { - $message = sprintf('DNS Request did not return valid answer. Received answers: %s', json_encode($response->answers)); - throw new RecordNotFoundException($message); - } - - $answer = $filteredAnswers[array_rand($filteredAnswers)]; - - return $answer; - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/composer.json b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/composer.json deleted file mode 100644 index b26eb170df..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/composer.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "react/dns", - "description": "Async DNS resolver.", - "keywords": ["dns", "dns-resolver"], - "license": "MIT", - "require": { - "php": ">=5.3.2", - "react/cache": "0.3.*", - "react/socket": "0.3.*", - "react/promise": "~1.0" - }, - "autoload": { - "psr-0": { "React\\Dns": "" } - }, - "target-dir": "React/Dns", - "extra": { - "branch-alias": { - "dev-master": "0.3-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/doc/rfc1034.txt b/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/doc/rfc1034.txt deleted file mode 100644 index 55cdb21fe6..0000000000 --- a/app/Vendor/Ratchet/vendor/react/react/src/React/Dns/doc/rfc1034.txt +++ /dev/null @@ -1,3077 +0,0 @@ -Network Working Group P. Mockapetris -Request for Comments: 1034 ISI -Obsoletes: RFCs 882, 883, 973 November 1987 - - - DOMAIN NAMES - CONCEPTS AND FACILITIES - - - -1. STATUS OF THIS MEMO - -This RFC is an introduction to the Domain Name System (DNS), and omits -many details which can be found in a companion RFC, "Domain Names - -Implementation and Specification" [RFC-1035]. That RFC assumes that the -reader is familiar with the concepts discussed in this memo. - -A subset of DNS functions and data types constitute an official -protocol. The official protocol includes standard queries and their -responses and most of the Internet class data formats (e.g., host -addresses). - -However, the domain system is intentionally extensible. Researchers are -continuously proposing, implementing and experimenting with new data -types, query types, classes, functions, etc. Thus while the components -of the official protocol are expected to stay essentially unchanged and -operate as a production service, experimental behavior should always be -expected in extensions beyond the official protocol. Experimental or -obsolete features are clearly marked in these RFCs, and such information -should be used with caution. - -The reader is especially cautioned not to depend on the values which -appear in examples to be current or complete, since their purpose is -primarily pedagogical. Distribution of this memo is unlimited. - -2. INTRODUCTION - -This RFC introduces domain style names, their use for Internet mail and -host address support, and the protocols and servers used to implement -domain name facilities. - -2.1. The history of domain names - -The impetus for the development of the domain system was growth in the -Internet: - - - Host name to address mappings were maintained by the Network - Information Center (NIC) in a single file (HOSTS.TXT) which - was FTPed by all hosts [RFC-952, RFC-953]. The total network - - - -Mockapetris [Page 1] - -RFC 1034 Domain Concepts and Facilities November 1987 - - - bandwidth consumed in distributing a new version by this - scheme is proportional to the square of the number of hosts in - the network, and even when multiple levels of FTP are used, - the outgoing FTP load on the NIC host is considerable. - Explosive growth in the number of hosts didn't bode well for - the future. - - - The network population was also changing in character. The - timeshared hosts that made up the original ARPANET were being - replaced with local networks of workstations. Local - organizations were administering their own names and - addresses, but had to wait for the NIC to change HOSTS.TXT to - make changes visible to the Internet at large. Organizations - also wanted some local structure on the name space. - - - The applications on the Internet were getting more - sophisticated and creating a need for general purpose name - service. - - -The result was several ideas about name spaces and their management -[IEN-116, RFC-799, RFC-819, RFC-830]. The proposals varied, but a -common thread was the idea of a hierarchical name space, with the -hierarchy roughly corresponding to organizational structure, and names -using "." as the character to mark the boundary between hierarchy -levels. A design using a distributed database and generalized resources -was described in [RFC-882, RFC-883]. Based on experience with several -implementations, the system evolved into the scheme described in this -memo. - -The terms "domain" or "domain name" are used in many contexts beyond the -DNS described here. Very often, the term domain name is used to refer -to a name with structure indicated by dots, but no relation to the DNS. -This is particularly true in mail addressing [Quarterman 86]. - -2.2. DNS design goals - -The design goals of the DNS influence its structure. They are: - - - The primary goal is a consistent name space which will be used - for referring to resources. In order to avoid the problems - caused by ad hoc encodings, names should not be required to - contain network identifiers, addresses, routes, or similar - information as part of the name. - - - The sheer size of the database and frequency of updates - suggest that it must be maintained in a distributed manner, - with local caching to improve performance. Approaches that - - - -Mockapetris [Page 2] - -RFC 1034 Domain Concepts and Facilities November 1987 - - - attempt to collect a consistent copy of the entire database - will become more and more expensive and difficult, and hence - should be avoided. The same principle holds for the structure - of the name space, and in particular mechanisms for creating - and deleting names; these should also be distributed. - - - Where there tradeoffs between the cost of acquiring data, the - speed of updates, and the accuracy of caches, the source of - the data should control the tradeoff. - - - The costs of implementing such a facility dictate that it be - generally useful, and not restricted to a single application. - We should be able to use names to retrieve host addresses, - mailbox data, and other as yet undetermined information. All - data associated with a name is tagged with a type, and queries - can be limited to a single type. - - - Because we want the name space to be useful in dissimilar - networks and applications, we provide the ability to use the - same name space with different protocol families or - management. For example, host address formats differ between - protocols, though all protocols have the notion of address. - The DNS tags all data with a class as well as the type, so - that we can allow parallel use of different formats for data - of type address. - - - We want name server transactions to be independent of the - communications system that carries them. Some systems may - wish to use datagrams for queries and responses, and only - establish virtual circuits for transactions that need the - reliability (e.g., database updates, long transactions); other - systems will use virtual circuits exclusively. - - - The system should be useful across a wide spectrum of host - capabilities. Both personal computers and large timeshared - hosts should be able to use the system, though perhaps in - different ways. - -2.3. Assumptions about usage - -The organization of the domain system derives from some assumptions -about the needs and usage patterns of its user community and is designed -to avoid many of the the complicated problems found in general purpose -database systems. - -The assumptions are: - - - The size of the total database will initially be proportional - - - -Mockapetris [Page 3] - -RFC 1034 Domain Concepts and Facilities November 1987 - - - to the number of hosts using the system, but will eventually - grow to be proportional to the number of users on those hosts - as mailboxes and other information are added to the domain - system. - - - Most of the data in the system will change very slowly (e.g., - mailbox bindings, host addresses), but that the system should - be able to deal with subsets that change more rapidly (on the - order of seconds or minutes). - - - The administrative boundaries used to distribute - responsibility for the database will usually correspond to - organizations that have one or more hosts. Each organization - that has responsibility for a particular set of domains will - provide redundant name servers, either on the organization's - own hosts or other hosts that the organization arranges to - use. - - - Clients of the domain system should be able to identify - trusted name servers they prefer to use before accepting - referrals to name servers outside of this "trusted" set. - - - Access to information is more critical than instantaneous - updates or guarantees of consistency. Hence the update - process allows updates to percolate out through the users of - the domain system rather than guaranteeing that all copies are - simultaneously updated. When updates are unavailable due to - network or host failure, the usual course is to believe old - information while continuing efforts to update it. The - general model is that copies are distributed with timeouts for - refreshing. The distributor sets the timeout value and the - recipient of the distribution is responsible for performing - the refresh. In special situations, very short intervals can - be specified, or the owner can prohibit copies. - - - In any system that has a distributed database, a particular - name server may be presented with a query that can only be - answered by some other server. The two general approaches to - dealing with this problem are "recursive", in which the first - server pursues the query for the client at another server, and - "iterative", in which the server refers the client to another - server and lets the client pursue the query. Both approaches - have advantages and disadvantages, but the iterative approach - is preferred for the datagram style of access. The domain - system requires implementation of the iterative approach, but - allows the recursive approach as an option. - - - - - -Mockapetris [Page 4] - -RFC 1034 Domain Concepts and Facilities November 1987 - - -The domain system assumes that all data originates in master files -scattered through the hosts that use the domain system. These master -files are updated by local system administrators. Master files are text -files that are read by a local name server, and hence become available -through the name servers to users of the domain system. The user -programs access name servers through standard programs called resolvers. - -The standard format of master files allows them to be exchanged between -hosts (via FTP, mail, or some other mechanism); this facility is useful -when an organization wants a domain, but doesn't want to support a name -server. The organization can maintain the master files locally using a -text editor, transfer them to a foreign host which runs a name server, -and then arrange with the system administrator of the name server to get -the files loaded. - -Each host's name servers and resolvers are configured by a local system -administrator [RFC-1033]. For a name server, this configuration data -includes the identity of local master files and instructions on which -non-local master files are to be loaded from foreign servers. The name -server uses the master files or copies to load its zones. For -resolvers, the configuration data identifies the name servers which -should be the primary sources of information. - -The domain system defines procedures for accessing the data and for -referrals to other name servers. The domain system also defines -procedures for caching retrieved data and for periodic refreshing of -data defined by the system administrator. - -The system administrators provide: - - - The definition of zone boundaries. - - - Master files of data. - - - Updates to master files. - - - Statements of the refresh policies desired. - -The domain system provides: - - - Standard formats for resource data. - - - Standard methods for querying the database. - - - Standard methods for name servers to refresh local data from - foreign name servers. - - - - - -Mockapetris [Page 5] - -RFC 1034 Domain Concepts and Facilities November 1987 - - -2.4. Elements of the DNS - -The DNS has three major components: - - - The DOMAIN NAME SPACE and RESOURCE RECORDS, which are - specifications for a tree structured name space and data - associated with the names. Conceptually, each node and leaf - of the domain name space tree names a set of information, and - query operations are attempts to extract specific types of - information from a particular set. A query names the domain - name of interest and describes the type of resource - information that is desired. For example, the Internet - uses some of its domain names to identify hosts; queries for - address resources return Internet host addresses. - - - NAME SERVERS are server programs which hold information about - the domain tree's structure and set information. A name - server may cache structure or set information about any part - of the domain tree, but in general a particular name server - has complete information about a subset of the domain space, - and pointers to other name servers that can be used to lead to - information from any part of the domain tree. Name servers - know the parts of the domain tree for which they have complete - information; a name server is said to be an AUTHORITY for - these parts of the name space. Authoritative information is - organized into units called ZONEs, and these zones can be - automatically distributed to the name servers which provide - redundant service for the data in a zone. - - - RESOLVERS are programs that extract information from name - servers in response to client requests. Resolvers must be - able to access at least one name server and use that name - server's information to answer a query directly, or pursue the - query using referrals to other name servers. A resolver will - typically be a system routine that is directly accessible to - user programs; hence no protocol is necessary between the - resolver and the user program. - -These three components roughly correspond to the three layers or views -of the domain system: - - - From the user's point of view, the domain system is accessed - through a simple procedure or OS call to a local resolver. - The domain space consists of a single tree and the user can - request information from any section of the tree. - - - From the resolver's point of view, the domain system is - composed of an unknown number of name servers. Each name - - - -Mockapetris [Page 6] - -RFC 1034 Domain Concepts and Facilities November 1987 - - - server has one or more pieces of the whole domain tree's data, - but the resolver views each of these databases as essentially - static. - - - From a name server's point of view, the domain system consists - of separate sets of local information called zones. The name - server has local copies of some of the zones. The name server - must periodically refresh its zones from master copies in - local files or foreign name servers. The name server must - concurrently process queries that arrive from resolvers. - -In the interests of performance, implementations may couple these -functions. For example, a resolver on the same machine as a name server -might share a database consisting of the the zones managed by the name -server and the cache managed by the resolver. - -3. DOMAIN NAME SPACE and RESOURCE RECORDS - -3.1. Name space specifications and terminology - -The domain name space is a tree structure. Each node and leaf on the -tree corresponds to a resource set (which may be empty). The domain -system makes no distinctions between the uses of the interior nodes and -leaves, and this memo uses the term "node" to refer to both. - -Each node has a label, which is zero to 63 octets in length. Brother -nodes may not have the same label, although the same label can be used -for nodes which are not brothers. One label is reserved, and that is -the null (i.e., zero length) label used for the root. - -The domain name of a node is the list of the labels on the path from the -node to the root of the tree. By convention, the labels that compose a -domain name are printed or read left to right, from the most specific -(lowest, farthest from the root) to the least specific (highest, closest -to the root). - -Internally, programs that manipulate domain names should represent them -as sequences of labels, where each label is a length octet followed by -an octet string. Because all domain names end at the root, which has a -null string for a label, these internal representations can use a length -byte of zero to terminate a domain name. - -By convention, domain names can be stored with arbitrary case, but -domain name comparisons for all present domain functions are done in a -case-insensitive manner, assuming an ASCII character set, and a high -order zero bit. This means that you are free to create a node with -label "A" or a node with label "a", but not both as brothers; you could -refer to either using "a" or "A". When you receive a domain name or - - - -Mockapetris [Page 7] - -RFC 1034 Domain Concepts and Facilities November 1987 - - -label, you should preserve its case. The rationale for this choice is -that we may someday need to add full binary domain names for new -services; existing services would not be changed. - -When a user needs to type a domain name, the length of each label is -omitted and the labels are separated by dots ("."). Since a complete -domain name ends with the root label, this leads to a printed form which -ends in a dot. We use this property to distinguish between: - - - a character string which represents a complete domain name - (often called "absolute"). For example, "poneria.ISI.EDU." - - - a character string that represents the starting labels of a - domain name which is incomplete, and should be completed by - local software using knowledge of the local domain (often - called "relative"). For example, "poneria" used in the - ISI.EDU domain. - -Relative names are either taken relative to a well known origin, or to a -list of domains used as a search list. Relative names appear mostly at -the user interface, where their interpretation varies from -implementation to implementation, and in master files, where they are -relative to a single origin domain name. The most common interpretation -uses the root "." as either the single origin or as one of the members -of the search list, so a multi-label relative name is often one where -the trailing dot has been omitted to save typing. - -To simplify implementations, the total number of octets that represent a -domain name (i.e., the sum of all label octets and label lengths) is -limited to 255. - -A domain is identified by a domain name, and consists of that part of -the domain name space that is at or below the domain name which -specifies the domain. A domain is a subdomain of another domain if it -is contained within that domain. This relationship can be tested by -seeing if the subdomain's name ends with the containing domain's name. -For example, A.B.C.D is a subdomain of B.C.D, C.D, D, and " ". - -3.2. Administrative guidelines on use - -As a matter of policy, the DNS technical specifications do not mandate a -particular tree structure or rules for selecting labels; its goal is to -be as general as possible, so that it can be used to build arbitrary -applications. In particular, the system was designed so that the name -space did not have to be organized along the lines of network -boundaries, name servers, etc. The rationale for this is not that the -name space should have no implied semantics, but rather that the choice -of implied semantics should be left open to be used for the problem at - - - -Mockapetris [Page 8] - -RFC 1034 Domain Concepts and Facilities November 1987 - - -hand, and that different parts of the tree can have different implied -semantics. For example, the IN-ADDR.ARPA domain is organized and -distributed by network and host address because its role is to translate -from network or host numbers to names; NetBIOS domains [RFC-1001, RFC- -1002] are flat because that is appropriate for that application. - -However, there are some guidelines that apply to the "normal" parts of -the name space used for hosts, mailboxes, etc., that will make the name -space more uniform, provide for growth, and minimize problems as -software is converted from the older host table. The political -decisions about the top levels of the tree originated in RFC-920. -Current policy for the top levels is discussed in [RFC-1032]. MILNET -conversion issues are covered in [RFC-1031]. - -Lower domains which will eventually be broken into multiple zones should -provide branching at the top of the domain so that the eventual -decomposition can be done without renaming. Node labels which use -special characters, leading digits, etc., are likely to break older -software which depends on more restrictive choices. - -3.3. Technical guidelines on use - -Before the DNS can be used to hold naming information for some kind of -object, two needs must be met: - - - A convention for mapping between object names and domain - names. This describes how information about an object is - accessed. - - - RR types and data formats for describing the object. - -These rules can be quite simple or fairly complex. Very often, the -designer must take into account existing formats and plan for upward -compatibility for existing usage. Multiple mappings or levels of -mapping may be required. - -For hosts, the mapping depends on the existing syntax for host names -which is a subset of the usual text representation for domain names, -together with RR formats for describing host addresses, etc. Because we -need a reliable inverse mapping from address to host name, a special -mapping for addresses into the IN-ADDR.ARPA domain is also defined. - -For mailboxes, the mapping is slightly more complex. The usual mail -address @ is mapped into a domain name by -converting into a single label (regardles of dots it -contains), converting into a domain name using the usual -text format for domain names (dots denote label breaks), and -concatenating the two to form a single domain name. Thus the mailbox - - - -Mockapetris [Page 9] - -RFC 1034 Domain Concepts and Facilities November 1987 - - -HOSTMASTER@SRI-NIC.ARPA is represented as a domain name by -HOSTMASTER.SRI-NIC.ARPA. An appreciation for the reasons behind this -design also must take into account the scheme for mail exchanges [RFC- -974]. - -The typical user is not concerned with defining these rules, but should -understand that they usually are the result of numerous compromises -between desires for upward compatibility with old usage, interactions -between different object definitions, and the inevitable urge to add new -features when defining the rules. The way the DNS is used to support -some object is often more crucial than the restrictions inherent in the -DNS. - -3.4. Example name space - -The following figure shows a part of the current domain name space, and -is used in many examples in this RFC. Note that the tree is a very -small subset of the actual name space. - - | - | - +---------------------+------------------+ - | | | - MIL EDU ARPA - | | | - | | | - +-----+-----+ | +------+-----+-----+ - | | | | | | | - BRL NOSC DARPA | IN-ADDR SRI-NIC ACC - | - +--------+------------------+---------------+--------+ - | | | | | - UCI MIT | UDEL YALE - | ISI - | | - +---+---+ | - | | | - LCS ACHILLES +--+-----+-----+--------+ - | | | | | | - XX A C VAXA VENERA Mockapetris - -In this example, the root domain has three immediate subdomains: MIL, -EDU, and ARPA. The LCS.MIT.EDU domain has one immediate subdomain named -XX.LCS.MIT.EDU. All of the leaves are also domains. - -3.5. Preferred name syntax - -The DNS specifications attempt to be as general as possible in the rules - - - -Mockapetris [Page 10] - -RFC 1034 Domain Concepts and Facilities November 1987 - - -for constructing domain names. The idea is that the name of any -existing object can be expressed as a domain name with minimal changes. -However, when assigning a domain name for an object, the prudent user -will select a name which satisfies both the rules of the domain system -and any existing rules for the object, whether these rules are published -or implied by existing programs. - -For example, when naming a mail domain, the user should satisfy both the -rules of this memo and those in RFC-822. When creating a new host name, -the old rules for HOSTS.TXT should be followed. This avoids problems -when old software is converted to use domain names. - -The following syntax will result in fewer problems with many -applications that use domain names (e.g., mail, TELNET). - - ::= | " " - - ::= %1$s. - -', htmlspecialchars($url, ENT_QUOTES, 'UTF-8'))); - - $this->headers->set('Location', $url); - - return $this; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php deleted file mode 100644 index 88a61b642d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php +++ /dev/null @@ -1,1854 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -use Symfony\Component\HttpFoundation\Session\SessionInterface; - -/** - * Request represents an HTTP request. - * - * The methods dealing with URL accept / return a raw path (% encoded): - * * getBasePath - * * getBaseUrl - * * getPathInfo - * * getRequestUri - * * getUri - * * getUriForPath - * - * @author Fabien Potencier - * - * @api - */ -class Request -{ - const HEADER_CLIENT_IP = 'client_ip'; - const HEADER_CLIENT_HOST = 'client_host'; - const HEADER_CLIENT_PROTO = 'client_proto'; - const HEADER_CLIENT_PORT = 'client_port'; - - protected static $trustedProxies = array(); - - /** - * @var string[] - */ - protected static $trustedHostPatterns = array(); - - /** - * @var string[] - */ - protected static $trustedHosts = array(); - - /** - * Names for headers that can be trusted when - * using trusted proxies. - * - * The default names are non-standard, but widely used - * by popular reverse proxies (like Apache mod_proxy or Amazon EC2). - */ - protected static $trustedHeaders = array( - self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR', - self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST', - self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO', - self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT', - ); - - protected static $httpMethodParameterOverride = false; - - /** - * Custom parameters - * - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $attributes; - - /** - * Request body parameters ($_POST) - * - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $request; - - /** - * Query string parameters ($_GET) - * - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $query; - - /** - * Server and execution environment parameters ($_SERVER) - * - * @var \Symfony\Component\HttpFoundation\ServerBag - * - * @api - */ - public $server; - - /** - * Uploaded files ($_FILES) - * - * @var \Symfony\Component\HttpFoundation\FileBag - * - * @api - */ - public $files; - - /** - * Cookies ($_COOKIE) - * - * @var \Symfony\Component\HttpFoundation\ParameterBag - * - * @api - */ - public $cookies; - - /** - * Headers (taken from the $_SERVER) - * - * @var \Symfony\Component\HttpFoundation\HeaderBag - * - * @api - */ - public $headers; - - /** - * @var string - */ - protected $content; - - /** - * @var array - */ - protected $languages; - - /** - * @var array - */ - protected $charsets; - - /** - * @var array - */ - protected $encodings; - - /** - * @var array - */ - protected $acceptableContentTypes; - - /** - * @var string - */ - protected $pathInfo; - - /** - * @var string - */ - protected $requestUri; - - /** - * @var string - */ - protected $baseUrl; - - /** - * @var string - */ - protected $basePath; - - /** - * @var string - */ - protected $method; - - /** - * @var string - */ - protected $format; - - /** - * @var \Symfony\Component\HttpFoundation\Session\SessionInterface - */ - protected $session; - - /** - * @var string - */ - protected $locale; - - /** - * @var string - */ - protected $defaultLocale = 'en'; - - /** - * @var array - */ - protected static $formats; - - protected static $requestFactory; - - /** - * Constructor. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string $content The raw body data - * - * @api - */ - public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) - { - $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content); - } - - /** - * Sets the parameters for this request. - * - * This method also re-initializes all properties. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * @param string $content The raw body data - * - * @api - */ - public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) - { - $this->request = new ParameterBag($request); - $this->query = new ParameterBag($query); - $this->attributes = new ParameterBag($attributes); - $this->cookies = new ParameterBag($cookies); - $this->files = new FileBag($files); - $this->server = new ServerBag($server); - $this->headers = new HeaderBag($this->server->getHeaders()); - - $this->content = $content; - $this->languages = null; - $this->charsets = null; - $this->encodings = null; - $this->acceptableContentTypes = null; - $this->pathInfo = null; - $this->requestUri = null; - $this->baseUrl = null; - $this->basePath = null; - $this->method = null; - $this->format = null; - } - - /** - * Creates a new request with values from PHP's super globals. - * - * @return Request A new request - * - * @api - */ - public static function createFromGlobals() - { - $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER); - - if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded') - && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH')) - ) { - parse_str($request->getContent(), $data); - $request->request = new ParameterBag($data); - } - - return $request; - } - - /** - * Creates a Request based on a given URI and configuration. - * - * The information contained in the URI always take precedence - * over the other information (server and parameters). - * - * @param string $uri The URI - * @param string $method The HTTP method - * @param array $parameters The query (GET) or request (POST) parameters - * @param array $cookies The request cookies ($_COOKIE) - * @param array $files The request files ($_FILES) - * @param array $server The server parameters ($_SERVER) - * @param string $content The raw body data - * - * @return Request A Request instance - * - * @api - */ - public static function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null) - { - $server = array_replace(array( - 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => 80, - 'HTTP_HOST' => 'localhost', - 'HTTP_USER_AGENT' => 'Symfony/2.X', - 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', - 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'REMOTE_ADDR' => '127.0.0.1', - 'SCRIPT_NAME' => '', - 'SCRIPT_FILENAME' => '', - 'SERVER_PROTOCOL' => 'HTTP/1.1', - 'REQUEST_TIME' => time(), - ), $server); - - $server['PATH_INFO'] = ''; - $server['REQUEST_METHOD'] = strtoupper($method); - - $components = parse_url($uri); - if (isset($components['host'])) { - $server['SERVER_NAME'] = $components['host']; - $server['HTTP_HOST'] = $components['host']; - } - - if (isset($components['scheme'])) { - if ('https' === $components['scheme']) { - $server['HTTPS'] = 'on'; - $server['SERVER_PORT'] = 443; - } else { - unset($server['HTTPS']); - $server['SERVER_PORT'] = 80; - } - } - - if (isset($components['port'])) { - $server['SERVER_PORT'] = $components['port']; - $server['HTTP_HOST'] = $server['HTTP_HOST'].':'.$components['port']; - } - - if (isset($components['user'])) { - $server['PHP_AUTH_USER'] = $components['user']; - } - - if (isset($components['pass'])) { - $server['PHP_AUTH_PW'] = $components['pass']; - } - - if (!isset($components['path'])) { - $components['path'] = '/'; - } - - switch (strtoupper($method)) { - case 'POST': - case 'PUT': - case 'DELETE': - if (!isset($server['CONTENT_TYPE'])) { - $server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; - } - case 'PATCH': - $request = $parameters; - $query = array(); - break; - default: - $request = array(); - $query = $parameters; - break; - } - - $queryString = ''; - if (isset($components['query'])) { - parse_str(html_entity_decode($components['query']), $qs); - - if ($query) { - $query = array_replace($qs, $query); - $queryString = http_build_query($query, '', '&'); - } else { - $query = $qs; - $queryString = $components['query']; - } - } elseif ($query) { - $queryString = http_build_query($query, '', '&'); - } - - $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : ''); - $server['QUERY_STRING'] = $queryString; - - return self::createRequestFromFactory($query, $request, array(), $cookies, $files, $server, $content); - } - - /** - * Sets a callable able to create a Request instance. - * - * This is mainly useful when you need to override the Request class - * to keep BC with an existing system. It should not be used for any - * other purpose. - * - * @param callable|null $callable A PHP callable - */ - public static function setFactory($callable) - { - self::$requestFactory = $callable; - } - - /** - * Clones a request and overrides some of its parameters. - * - * @param array $query The GET parameters - * @param array $request The POST parameters - * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) - * @param array $cookies The COOKIE parameters - * @param array $files The FILES parameters - * @param array $server The SERVER parameters - * - * @return Request The duplicated request - * - * @api - */ - public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) - { - $dup = clone $this; - if ($query !== null) { - $dup->query = new ParameterBag($query); - } - if ($request !== null) { - $dup->request = new ParameterBag($request); - } - if ($attributes !== null) { - $dup->attributes = new ParameterBag($attributes); - } - if ($cookies !== null) { - $dup->cookies = new ParameterBag($cookies); - } - if ($files !== null) { - $dup->files = new FileBag($files); - } - if ($server !== null) { - $dup->server = new ServerBag($server); - $dup->headers = new HeaderBag($dup->server->getHeaders()); - } - $dup->languages = null; - $dup->charsets = null; - $dup->encodings = null; - $dup->acceptableContentTypes = null; - $dup->pathInfo = null; - $dup->requestUri = null; - $dup->baseUrl = null; - $dup->basePath = null; - $dup->method = null; - $dup->format = null; - - if (!$dup->get('_format') && $this->get('_format')) { - $dup->attributes->set('_format', $this->get('_format')); - } - - if (!$dup->getRequestFormat(null)) { - $dup->setRequestFormat($format = $this->getRequestFormat(null)); - } - - return $dup; - } - - /** - * Clones the current request. - * - * Note that the session is not cloned as duplicated requests - * are most of the time sub-requests of the main one. - */ - public function __clone() - { - $this->query = clone $this->query; - $this->request = clone $this->request; - $this->attributes = clone $this->attributes; - $this->cookies = clone $this->cookies; - $this->files = clone $this->files; - $this->server = clone $this->server; - $this->headers = clone $this->headers; - } - - /** - * Returns the request as a string. - * - * @return string The request - */ - public function __toString() - { - return - sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n". - $this->headers."\r\n". - $this->getContent(); - } - - /** - * Overrides the PHP global variables according to this request instance. - * - * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE. - * $_FILES is never override, see rfc1867 - * - * @api - */ - public function overrideGlobals() - { - $_GET = $this->query->all(); - $_POST = $this->request->all(); - $_SERVER = $this->server->all(); - $_COOKIE = $this->cookies->all(); - - foreach ($this->headers->all() as $key => $value) { - $key = strtoupper(str_replace('-', '_', $key)); - if (in_array($key, array('CONTENT_TYPE', 'CONTENT_LENGTH'))) { - $_SERVER[$key] = implode(', ', $value); - } else { - $_SERVER['HTTP_'.$key] = implode(', ', $value); - } - } - - $request = array('g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE); - - $requestOrder = ini_get('request_order') ?: ini_get('variables_order'); - $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp'; - - $_REQUEST = array(); - foreach (str_split($requestOrder) as $order) { - $_REQUEST = array_merge($_REQUEST, $request[$order]); - } - } - - /** - * Sets a list of trusted proxies. - * - * You should only list the reverse proxies that you manage directly. - * - * @param array $proxies A list of trusted proxies - * - * @api - */ - public static function setTrustedProxies(array $proxies) - { - self::$trustedProxies = $proxies; - } - - /** - * Gets the list of trusted proxies. - * - * @return array An array of trusted proxies. - */ - public static function getTrustedProxies() - { - return self::$trustedProxies; - } - - /** - * Sets a list of trusted host patterns. - * - * You should only list the hosts you manage using regexs. - * - * @param array $hostPatterns A list of trusted host patterns - */ - public static function setTrustedHosts(array $hostPatterns) - { - self::$trustedHostPatterns = array_map(function ($hostPattern) { - return sprintf('{%s}i', str_replace('}', '\\}', $hostPattern)); - }, $hostPatterns); - // we need to reset trusted hosts on trusted host patterns change - self::$trustedHosts = array(); - } - - /** - * Gets the list of trusted host patterns. - * - * @return array An array of trusted host patterns. - */ - public static function getTrustedHosts() - { - return self::$trustedHostPatterns; - } - - /** - * Sets the name for trusted headers. - * - * The following header keys are supported: - * - * * Request::HEADER_CLIENT_IP: defaults to X-Forwarded-For (see getClientIp()) - * * Request::HEADER_CLIENT_HOST: defaults to X-Forwarded-Host (see getClientHost()) - * * Request::HEADER_CLIENT_PORT: defaults to X-Forwarded-Port (see getClientPort()) - * * Request::HEADER_CLIENT_PROTO: defaults to X-Forwarded-Proto (see getScheme() and isSecure()) - * - * Setting an empty value allows to disable the trusted header for the given key. - * - * @param string $key The header key - * @param string $value The header name - * - * @throws \InvalidArgumentException - */ - public static function setTrustedHeaderName($key, $value) - { - if (!array_key_exists($key, self::$trustedHeaders)) { - throw new \InvalidArgumentException(sprintf('Unable to set the trusted header name for key "%s".', $key)); - } - - self::$trustedHeaders[$key] = $value; - } - - /** - * Gets the trusted proxy header name. - * - * @param string $key The header key - * - * @return string The header name - * - * @throws \InvalidArgumentException - */ - public static function getTrustedHeaderName($key) - { - if (!array_key_exists($key, self::$trustedHeaders)) { - throw new \InvalidArgumentException(sprintf('Unable to get the trusted header name for key "%s".', $key)); - } - - return self::$trustedHeaders[$key]; - } - - /** - * Normalizes a query string. - * - * It builds a normalized query string, where keys/value pairs are alphabetized, - * have consistent escaping and unneeded delimiters are removed. - * - * @param string $qs Query string - * - * @return string A normalized query string for the Request - */ - public static function normalizeQueryString($qs) - { - if ('' == $qs) { - return ''; - } - - $parts = array(); - $order = array(); - - foreach (explode('&', $qs) as $param) { - if ('' === $param || '=' === $param[0]) { - // Ignore useless delimiters, e.g. "x=y&". - // Also ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway. - // PHP also does not include them when building _GET. - continue; - } - - $keyValuePair = explode('=', $param, 2); - - // GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded). - // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str. This is why we use urldecode and then normalize to - // RFC 3986 with rawurlencode. - $parts[] = isset($keyValuePair[1]) ? - rawurlencode(urldecode($keyValuePair[0])).'='.rawurlencode(urldecode($keyValuePair[1])) : - rawurlencode(urldecode($keyValuePair[0])); - $order[] = urldecode($keyValuePair[0]); - } - - array_multisort($order, SORT_ASC, $parts); - - return implode('&', $parts); - } - - /** - * Enables support for the _method request parameter to determine the intended HTTP method. - * - * Be warned that enabling this feature might lead to CSRF issues in your code. - * Check that you are using CSRF tokens when required. - * - * The HTTP method can only be overridden when the real HTTP method is POST. - */ - public static function enableHttpMethodParameterOverride() - { - self::$httpMethodParameterOverride = true; - } - - /** - * Checks whether support for the _method request parameter is enabled. - * - * @return Boolean True when the _method request parameter is enabled, false otherwise - */ - public static function getHttpMethodParameterOverride() - { - return self::$httpMethodParameterOverride; - } - - /** - * Gets a "parameter" value. - * - * This method is mainly useful for libraries that want to provide some flexibility. - * - * Order of precedence: GET, PATH, POST - * - * Avoid using this method in controllers: - * - * * slow - * * prefer to get from a "named" source - * - * It is better to explicitly get request parameters from the appropriate - * public property instead (query, attributes, request). - * - * @param string $key the key - * @param mixed $default the default value - * @param Boolean $deep is parameter deep in multidimensional array - * - * @return mixed - */ - public function get($key, $default = null, $deep = false) - { - return $this->query->get($key, $this->attributes->get($key, $this->request->get($key, $default, $deep), $deep), $deep); - } - - /** - * Gets the Session. - * - * @return SessionInterface|null The session - * - * @api - */ - public function getSession() - { - return $this->session; - } - - /** - * Whether the request contains a Session which was started in one of the - * previous requests. - * - * @return Boolean - * - * @api - */ - public function hasPreviousSession() - { - // the check for $this->session avoids malicious users trying to fake a session cookie with proper name - return $this->hasSession() && $this->cookies->has($this->session->getName()); - } - - /** - * Whether the request contains a Session object. - * - * This method does not give any information about the state of the session object, - * like whether the session is started or not. It is just a way to check if this Request - * is associated with a Session instance. - * - * @return Boolean true when the Request contains a Session object, false otherwise - * - * @api - */ - public function hasSession() - { - return null !== $this->session; - } - - /** - * Sets the Session. - * - * @param SessionInterface $session The Session - * - * @api - */ - public function setSession(SessionInterface $session) - { - $this->session = $session; - } - - /** - * Returns the client IP addresses. - * - * In the returned array the most trusted IP address is first, and the - * least trusted one last. The "real" client IP address is the last one, - * but this is also the least trusted one. Trusted proxies are stripped. - * - * Use this method carefully; you should use getClientIp() instead. - * - * @return array The client IP addresses - * - * @see getClientIp() - */ - public function getClientIps() - { - $ip = $this->server->get('REMOTE_ADDR'); - - if (!self::$trustedProxies) { - return array($ip); - } - - if (!self::$trustedHeaders[self::HEADER_CLIENT_IP] || !$this->headers->has(self::$trustedHeaders[self::HEADER_CLIENT_IP])) { - return array($ip); - } - - $clientIps = array_map('trim', explode(',', $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_IP]))); - $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from - - $ip = $clientIps[0]; // Fallback to this when the client IP falls into the range of trusted proxies - - // Eliminate all IPs from the forwarded IP chain which are trusted proxies - foreach ($clientIps as $key => $clientIp) { - if (IpUtils::checkIp($clientIp, self::$trustedProxies)) { - unset($clientIps[$key]); - } - } - - // Now the IP chain contains only untrusted proxies and the client IP - return $clientIps ? array_reverse($clientIps) : array($ip); - } - - /** - * Returns the client IP address. - * - * This method can read the client IP address from the "X-Forwarded-For" header - * when trusted proxies were set via "setTrustedProxies()". The "X-Forwarded-For" - * header value is a comma+space separated list of IP addresses, the left-most - * being the original client, and each successive proxy that passed the request - * adding the IP address where it received the request from. - * - * If your reverse proxy uses a different header name than "X-Forwarded-For", - * ("Client-Ip" for instance), configure it via "setTrustedHeaderName()" with - * the "client-ip" key. - * - * @return string The client IP address - * - * @see getClientIps() - * @see http://en.wikipedia.org/wiki/X-Forwarded-For - * - * @api - */ - public function getClientIp() - { - $ipAddresses = $this->getClientIps(); - - return $ipAddresses[0]; - } - - /** - * Returns current script name. - * - * @return string - * - * @api - */ - public function getScriptName() - { - return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', '')); - } - - /** - * Returns the path being requested relative to the executed script. - * - * The path info always starts with a /. - * - * Suppose this request is instantiated from /mysite on localhost: - * - * * http://localhost/mysite returns an empty string - * * http://localhost/mysite/about returns '/about' - * * http://localhost/mysite/enco%20ded returns '/enco%20ded' - * * http://localhost/mysite/about?var=1 returns '/about' - * - * @return string The raw path (i.e. not urldecoded) - * - * @api - */ - public function getPathInfo() - { - if (null === $this->pathInfo) { - $this->pathInfo = $this->preparePathInfo(); - } - - return $this->pathInfo; - } - - /** - * Returns the root path from which this request is executed. - * - * Suppose that an index.php file instantiates this request object: - * - * * http://localhost/index.php returns an empty string - * * http://localhost/index.php/page returns an empty string - * * http://localhost/web/index.php returns '/web' - * * http://localhost/we%20b/index.php returns '/we%20b' - * - * @return string The raw path (i.e. not urldecoded) - * - * @api - */ - public function getBasePath() - { - if (null === $this->basePath) { - $this->basePath = $this->prepareBasePath(); - } - - return $this->basePath; - } - - /** - * Returns the root URL from which this request is executed. - * - * The base URL never ends with a /. - * - * This is similar to getBasePath(), except that it also includes the - * script filename (e.g. index.php) if one exists. - * - * @return string The raw URL (i.e. not urldecoded) - * - * @api - */ - public function getBaseUrl() - { - if (null === $this->baseUrl) { - $this->baseUrl = $this->prepareBaseUrl(); - } - - return $this->baseUrl; - } - - /** - * Gets the request's scheme. - * - * @return string - * - * @api - */ - public function getScheme() - { - return $this->isSecure() ? 'https' : 'http'; - } - - /** - * Returns the port on which the request is made. - * - * This method can read the client port from the "X-Forwarded-Port" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Port" header must contain the client port. - * - * If your reverse proxy uses a different header name than "X-Forwarded-Port", - * configure it via "setTrustedHeaderName()" with the "client-port" key. - * - * @return string - * - * @api - */ - public function getPort() - { - if (self::$trustedProxies) { - if (self::$trustedHeaders[self::HEADER_CLIENT_PORT] && $port = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PORT])) { - return $port; - } - - if (self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && 'https' === $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO], 'http')) { - return 443; - } - } - - if ($host = $this->headers->get('HOST')) { - if (false !== $pos = strrpos($host, ':')) { - return intval(substr($host, $pos + 1)); - } - - return 'https' === $this->getScheme() ? 443 : 80; - } - - return $this->server->get('SERVER_PORT'); - } - - /** - * Returns the user. - * - * @return string|null - */ - public function getUser() - { - return $this->server->get('PHP_AUTH_USER'); - } - - /** - * Returns the password. - * - * @return string|null - */ - public function getPassword() - { - return $this->server->get('PHP_AUTH_PW'); - } - - /** - * Gets the user info. - * - * @return string A user name and, optionally, scheme-specific information about how to gain authorization to access the server - */ - public function getUserInfo() - { - $userinfo = $this->getUser(); - - $pass = $this->getPassword(); - if ('' != $pass) { - $userinfo .= ":$pass"; - } - - return $userinfo; - } - - /** - * Returns the HTTP host being requested. - * - * The port name will be appended to the host if it's non-standard. - * - * @return string - * - * @api - */ - public function getHttpHost() - { - $scheme = $this->getScheme(); - $port = $this->getPort(); - - if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) { - return $this->getHost(); - } - - return $this->getHost().':'.$port; - } - - /** - * Returns the requested URI. - * - * @return string The raw URI (i.e. not urldecoded) - * - * @api - */ - public function getRequestUri() - { - if (null === $this->requestUri) { - $this->requestUri = $this->prepareRequestUri(); - } - - return $this->requestUri; - } - - /** - * Gets the scheme and HTTP host. - * - * If the URL was called with basic authentication, the user - * and the password are not added to the generated string. - * - * @return string The scheme and HTTP host - */ - public function getSchemeAndHttpHost() - { - return $this->getScheme().'://'.$this->getHttpHost(); - } - - /** - * Generates a normalized URI for the Request. - * - * @return string A normalized URI for the Request - * - * @see getQueryString() - * - * @api - */ - public function getUri() - { - if (null !== $qs = $this->getQueryString()) { - $qs = '?'.$qs; - } - - return $this->getSchemeAndHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs; - } - - /** - * Generates a normalized URI for the given path. - * - * @param string $path A path to use instead of the current one - * - * @return string The normalized URI for the path - * - * @api - */ - public function getUriForPath($path) - { - return $this->getSchemeAndHttpHost().$this->getBaseUrl().$path; - } - - /** - * Generates the normalized query string for the Request. - * - * It builds a normalized query string, where keys/value pairs are alphabetized - * and have consistent escaping. - * - * @return string|null A normalized query string for the Request - * - * @api - */ - public function getQueryString() - { - $qs = static::normalizeQueryString($this->server->get('QUERY_STRING')); - - return '' === $qs ? null : $qs; - } - - /** - * Checks whether the request is secure or not. - * - * This method can read the client port from the "X-Forwarded-Proto" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Proto" header must contain the protocol: "https" or "http". - * - * If your reverse proxy uses a different header name than "X-Forwarded-Proto" - * ("SSL_HTTPS" for instance), configure it via "setTrustedHeaderName()" with - * the "client-proto" key. - * - * @return Boolean - * - * @api - */ - public function isSecure() - { - if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && $proto = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO])) { - return in_array(strtolower(current(explode(',', $proto))), array('https', 'on', 'ssl', '1')); - } - - return 'on' == strtolower($this->server->get('HTTPS')) || 1 == $this->server->get('HTTPS'); - } - - /** - * Returns the host name. - * - * This method can read the client port from the "X-Forwarded-Host" header - * when trusted proxies were set via "setTrustedProxies()". - * - * The "X-Forwarded-Host" header must contain the client host name. - * - * If your reverse proxy uses a different header name than "X-Forwarded-Host", - * configure it via "setTrustedHeaderName()" with the "client-host" key. - * - * @return string - * - * @throws \UnexpectedValueException when the host name is invalid - * - * @api - */ - public function getHost() - { - if (self::$trustedProxies && self::$trustedHeaders[self::HEADER_CLIENT_HOST] && $host = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_HOST])) { - $elements = explode(',', $host); - - $host = $elements[count($elements) - 1]; - } elseif (!$host = $this->headers->get('HOST')) { - if (!$host = $this->server->get('SERVER_NAME')) { - $host = $this->server->get('SERVER_ADDR', ''); - } - } - - // trim and remove port number from host - // host is lowercase as per RFC 952/2181 - $host = strtolower(preg_replace('/:\d+$/', '', trim($host))); - - // as the host can come from the user (HTTP_HOST and depending on the configuration, SERVER_NAME too can come from the user) - // check that it does not contain forbidden characters (see RFC 952 and RFC 2181) - if ($host && !preg_match('/^\[?(?:[a-zA-Z0-9-:\]_]+\.?)+$/', $host)) { - throw new \UnexpectedValueException(sprintf('Invalid Host "%s"', $host)); - } - - if (count(self::$trustedHostPatterns) > 0) { - // to avoid host header injection attacks, you should provide a list of trusted host patterns - - if (in_array($host, self::$trustedHosts)) { - return $host; - } - - foreach (self::$trustedHostPatterns as $pattern) { - if (preg_match($pattern, $host)) { - self::$trustedHosts[] = $host; - - return $host; - } - } - - throw new \UnexpectedValueException(sprintf('Untrusted Host "%s"', $host)); - } - - return $host; - } - - /** - * Sets the request method. - * - * @param string $method - * - * @api - */ - public function setMethod($method) - { - $this->method = null; - $this->server->set('REQUEST_METHOD', $method); - } - - /** - * Gets the request "intended" method. - * - * If the X-HTTP-Method-Override header is set, and if the method is a POST, - * then it is used to determine the "real" intended HTTP method. - * - * The _method request parameter can also be used to determine the HTTP method, - * but only if enableHttpMethodParameterOverride() has been called. - * - * The method is always an uppercased string. - * - * @return string The request method - * - * @api - * - * @see getRealMethod - */ - public function getMethod() - { - if (null === $this->method) { - $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET')); - - if ('POST' === $this->method) { - if ($method = $this->headers->get('X-HTTP-METHOD-OVERRIDE')) { - $this->method = strtoupper($method); - } elseif (self::$httpMethodParameterOverride) { - $this->method = strtoupper($this->request->get('_method', $this->query->get('_method', 'POST'))); - } - } - } - - return $this->method; - } - - /** - * Gets the "real" request method. - * - * @return string The request method - * - * @see getMethod - */ - public function getRealMethod() - { - return strtoupper($this->server->get('REQUEST_METHOD', 'GET')); - } - - /** - * Gets the mime type associated with the format. - * - * @param string $format The format - * - * @return string The associated mime type (null if not found) - * - * @api - */ - public function getMimeType($format) - { - if (null === static::$formats) { - static::initializeFormats(); - } - - return isset(static::$formats[$format]) ? static::$formats[$format][0] : null; - } - - /** - * Gets the format associated with the mime type. - * - * @param string $mimeType The associated mime type - * - * @return string|null The format (null if not found) - * - * @api - */ - public function getFormat($mimeType) - { - if (false !== $pos = strpos($mimeType, ';')) { - $mimeType = substr($mimeType, 0, $pos); - } - - if (null === static::$formats) { - static::initializeFormats(); - } - - foreach (static::$formats as $format => $mimeTypes) { - if (in_array($mimeType, (array) $mimeTypes)) { - return $format; - } - } - - return null; - } - - /** - * Associates a format with mime types. - * - * @param string $format The format - * @param string|array $mimeTypes The associated mime types (the preferred one must be the first as it will be used as the content type) - * - * @api - */ - public function setFormat($format, $mimeTypes) - { - if (null === static::$formats) { - static::initializeFormats(); - } - - static::$formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes); - } - - /** - * Gets the request format. - * - * Here is the process to determine the format: - * - * * format defined by the user (with setRequestFormat()) - * * _format request parameter - * * $default - * - * @param string $default The default format - * - * @return string The request format - * - * @api - */ - public function getRequestFormat($default = 'html') - { - if (null === $this->format) { - $this->format = $this->get('_format', $default); - } - - return $this->format; - } - - /** - * Sets the request format. - * - * @param string $format The request format. - * - * @api - */ - public function setRequestFormat($format) - { - $this->format = $format; - } - - /** - * Gets the format associated with the request. - * - * @return string|null The format (null if no content type is present) - * - * @api - */ - public function getContentType() - { - return $this->getFormat($this->headers->get('CONTENT_TYPE')); - } - - /** - * Sets the default locale. - * - * @param string $locale - * - * @api - */ - public function setDefaultLocale($locale) - { - $this->defaultLocale = $locale; - - if (null === $this->locale) { - $this->setPhpDefaultLocale($locale); - } - } - - /** - * Sets the locale. - * - * @param string $locale - * - * @api - */ - public function setLocale($locale) - { - $this->setPhpDefaultLocale($this->locale = $locale); - } - - /** - * Get the locale. - * - * @return string - */ - public function getLocale() - { - return null === $this->locale ? $this->defaultLocale : $this->locale; - } - - /** - * Checks if the request method is of specified type. - * - * @param string $method Uppercase request method (GET, POST etc). - * - * @return Boolean - */ - public function isMethod($method) - { - return $this->getMethod() === strtoupper($method); - } - - /** - * Checks whether the method is safe or not. - * - * @return Boolean - * - * @api - */ - public function isMethodSafe() - { - return in_array($this->getMethod(), array('GET', 'HEAD')); - } - - /** - * Returns the request body content. - * - * @param Boolean $asResource If true, a resource will be returned - * - * @return string|resource The request body content or a resource to read the body stream. - * - * @throws \LogicException - */ - public function getContent($asResource = false) - { - if (false === $this->content || (true === $asResource && null !== $this->content)) { - throw new \LogicException('getContent() can only be called once when using the resource return type.'); - } - - if (true === $asResource) { - $this->content = false; - - return fopen('php://input', 'rb'); - } - - if (null === $this->content) { - $this->content = file_get_contents('php://input'); - } - - return $this->content; - } - - /** - * Gets the Etags. - * - * @return array The entity tags - */ - public function getETags() - { - return preg_split('/\s*,\s*/', $this->headers->get('if_none_match'), null, PREG_SPLIT_NO_EMPTY); - } - - /** - * @return Boolean - */ - public function isNoCache() - { - return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma'); - } - - /** - * Returns the preferred language. - * - * @param array $locales An array of ordered available locales - * - * @return string|null The preferred locale - * - * @api - */ - public function getPreferredLanguage(array $locales = null) - { - $preferredLanguages = $this->getLanguages(); - - if (empty($locales)) { - return isset($preferredLanguages[0]) ? $preferredLanguages[0] : null; - } - - if (!$preferredLanguages) { - return $locales[0]; - } - - $extendedPreferredLanguages = array(); - foreach ($preferredLanguages as $language) { - $extendedPreferredLanguages[] = $language; - if (false !== $position = strpos($language, '_')) { - $superLanguage = substr($language, 0, $position); - if (!in_array($superLanguage, $preferredLanguages)) { - $extendedPreferredLanguages[] = $superLanguage; - } - } - } - - $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales)); - - return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0]; - } - - /** - * Gets a list of languages acceptable by the client browser. - * - * @return array Languages ordered in the user browser preferences - * - * @api - */ - public function getLanguages() - { - if (null !== $this->languages) { - return $this->languages; - } - - $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all(); - $this->languages = array(); - foreach (array_keys($languages) as $lang) { - if (strstr($lang, '-')) { - $codes = explode('-', $lang); - if ($codes[0] == 'i') { - // Language not listed in ISO 639 that are not variants - // of any listed language, which can be registered with the - // i-prefix, such as i-cherokee - if (count($codes) > 1) { - $lang = $codes[1]; - } - } else { - for ($i = 0, $max = count($codes); $i < $max; $i++) { - if ($i == 0) { - $lang = strtolower($codes[0]); - } else { - $lang .= '_'.strtoupper($codes[$i]); - } - } - } - } - - $this->languages[] = $lang; - } - - return $this->languages; - } - - /** - * Gets a list of charsets acceptable by the client browser. - * - * @return array List of charsets in preferable order - * - * @api - */ - public function getCharsets() - { - if (null !== $this->charsets) { - return $this->charsets; - } - - return $this->charsets = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Charset'))->all()); - } - - /** - * Gets a list of encodings acceptable by the client browser. - * - * @return array List of encodings in preferable order - */ - public function getEncodings() - { - if (null !== $this->encodings) { - return $this->encodings; - } - - return $this->encodings = array_keys(AcceptHeader::fromString($this->headers->get('Accept-Encoding'))->all()); - } - - /** - * Gets a list of content types acceptable by the client browser - * - * @return array List of content types in preferable order - * - * @api - */ - public function getAcceptableContentTypes() - { - if (null !== $this->acceptableContentTypes) { - return $this->acceptableContentTypes; - } - - return $this->acceptableContentTypes = array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all()); - } - - /** - * Returns true if the request is a XMLHttpRequest. - * - * It works if your JavaScript library set an X-Requested-With HTTP header. - * It is known to work with common JavaScript frameworks: - * @link http://en.wikipedia.org/wiki/List_of_Ajax_frameworks#JavaScript - * - * @return Boolean true if the request is an XMLHttpRequest, false otherwise - * - * @api - */ - public function isXmlHttpRequest() - { - return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); - } - - /* - * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24) - * - * Code subject to the new BSD license (http://framework.zend.com/license/new-bsd). - * - * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) - */ - - protected function prepareRequestUri() - { - $requestUri = ''; - - if ($this->headers->has('X_ORIGINAL_URL')) { - // IIS with Microsoft Rewrite Module - $requestUri = $this->headers->get('X_ORIGINAL_URL'); - $this->headers->remove('X_ORIGINAL_URL'); - $this->server->remove('HTTP_X_ORIGINAL_URL'); - $this->server->remove('UNENCODED_URL'); - $this->server->remove('IIS_WasUrlRewritten'); - } elseif ($this->headers->has('X_REWRITE_URL')) { - // IIS with ISAPI_Rewrite - $requestUri = $this->headers->get('X_REWRITE_URL'); - $this->headers->remove('X_REWRITE_URL'); - } elseif ($this->server->get('IIS_WasUrlRewritten') == '1' && $this->server->get('UNENCODED_URL') != '') { - // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem) - $requestUri = $this->server->get('UNENCODED_URL'); - $this->server->remove('UNENCODED_URL'); - $this->server->remove('IIS_WasUrlRewritten'); - } elseif ($this->server->has('REQUEST_URI')) { - $requestUri = $this->server->get('REQUEST_URI'); - // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path - $schemeAndHttpHost = $this->getSchemeAndHttpHost(); - if (strpos($requestUri, $schemeAndHttpHost) === 0) { - $requestUri = substr($requestUri, strlen($schemeAndHttpHost)); - } - } elseif ($this->server->has('ORIG_PATH_INFO')) { - // IIS 5.0, PHP as CGI - $requestUri = $this->server->get('ORIG_PATH_INFO'); - if ('' != $this->server->get('QUERY_STRING')) { - $requestUri .= '?'.$this->server->get('QUERY_STRING'); - } - $this->server->remove('ORIG_PATH_INFO'); - } - - // normalize the request URI to ease creating sub-requests from this request - $this->server->set('REQUEST_URI', $requestUri); - - return $requestUri; - } - - /** - * Prepares the base URL. - * - * @return string - */ - protected function prepareBaseUrl() - { - $filename = basename($this->server->get('SCRIPT_FILENAME')); - - if (basename($this->server->get('SCRIPT_NAME')) === $filename) { - $baseUrl = $this->server->get('SCRIPT_NAME'); - } elseif (basename($this->server->get('PHP_SELF')) === $filename) { - $baseUrl = $this->server->get('PHP_SELF'); - } elseif (basename($this->server->get('ORIG_SCRIPT_NAME')) === $filename) { - $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility - } else { - // Backtrack up the script_filename to find the portion matching - // php_self - $path = $this->server->get('PHP_SELF', ''); - $file = $this->server->get('SCRIPT_FILENAME', ''); - $segs = explode('/', trim($file, '/')); - $segs = array_reverse($segs); - $index = 0; - $last = count($segs); - $baseUrl = ''; - do { - $seg = $segs[$index]; - $baseUrl = '/'.$seg.$baseUrl; - ++$index; - } while ($last > $index && (false !== $pos = strpos($path, $baseUrl)) && 0 != $pos); - } - - // Does the baseUrl have anything in common with the request_uri? - $requestUri = $this->getRequestUri(); - - if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) { - // full $baseUrl matches - return $prefix; - } - - if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, dirname($baseUrl))) { - // directory portion of $baseUrl matches - return rtrim($prefix, '/'); - } - - $truncatedRequestUri = $requestUri; - if (false !== $pos = strpos($requestUri, '?')) { - $truncatedRequestUri = substr($requestUri, 0, $pos); - } - - $basename = basename($baseUrl); - if (empty($basename) || !strpos(rawurldecode($truncatedRequestUri), $basename)) { - // no match whatsoever; set it blank - return ''; - } - - // If using mod_rewrite or ISAPI_Rewrite strip the script filename - // out of baseUrl. $pos !== 0 makes sure it is not matching a value - // from PATH_INFO or QUERY_STRING - if (strlen($requestUri) >= strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && $pos !== 0) { - $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); - } - - return rtrim($baseUrl, '/'); - } - - /** - * Prepares the base path. - * - * @return string base path - */ - protected function prepareBasePath() - { - $filename = basename($this->server->get('SCRIPT_FILENAME')); - $baseUrl = $this->getBaseUrl(); - if (empty($baseUrl)) { - return ''; - } - - if (basename($baseUrl) === $filename) { - $basePath = dirname($baseUrl); - } else { - $basePath = $baseUrl; - } - - if ('\\' === DIRECTORY_SEPARATOR) { - $basePath = str_replace('\\', '/', $basePath); - } - - return rtrim($basePath, '/'); - } - - /** - * Prepares the path info. - * - * @return string path info - */ - protected function preparePathInfo() - { - $baseUrl = $this->getBaseUrl(); - - if (null === ($requestUri = $this->getRequestUri())) { - return '/'; - } - - $pathInfo = '/'; - - // Remove the query string from REQUEST_URI - if ($pos = strpos($requestUri, '?')) { - $requestUri = substr($requestUri, 0, $pos); - } - - if (null !== $baseUrl && false === $pathInfo = substr($requestUri, strlen($baseUrl))) { - // If substr() returns false then PATH_INFO is set to an empty string - return '/'; - } elseif (null === $baseUrl) { - return $requestUri; - } - - return (string) $pathInfo; - } - - /** - * Initializes HTTP request formats. - */ - protected static function initializeFormats() - { - static::$formats = array( - 'html' => array('text/html', 'application/xhtml+xml'), - 'txt' => array('text/plain'), - 'js' => array('application/javascript', 'application/x-javascript', 'text/javascript'), - 'css' => array('text/css'), - 'json' => array('application/json', 'application/x-json'), - 'xml' => array('text/xml', 'application/xml', 'application/x-xml'), - 'rdf' => array('application/rdf+xml'), - 'atom' => array('application/atom+xml'), - 'rss' => array('application/rss+xml'), - ); - } - - /** - * Sets the default PHP locale. - * - * @param string $locale - */ - private function setPhpDefaultLocale($locale) - { - // if either the class Locale doesn't exist, or an exception is thrown when - // setting the default locale, the intl module is not installed, and - // the call can be ignored: - try { - if (class_exists('Locale', false)) { - \Locale::setDefault($locale); - } - } catch (\Exception $e) { - } - } - - /* - * Returns the prefix as encoded in the string when the string starts with - * the given prefix, false otherwise. - * - * @param string $string The urlencoded string - * @param string $prefix The prefix not encoded - * - * @return string|false The prefix as it is encoded in $string, or false - */ - private function getUrlencodedPrefix($string, $prefix) - { - if (0 !== strpos(rawurldecode($string), $prefix)) { - return false; - } - - $len = strlen($prefix); - - if (preg_match("#^(%[[:xdigit:]]{2}|.){{$len}}#", $string, $match)) { - return $match[0]; - } - - return false; - } - - private static function createRequestFromFactory(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) - { - if (self::$requestFactory) { - $request = call_user_func(self::$requestFactory, $query, $request, $attributes, $cookies, $files, $server, $content); - - if (!$request instanceof Request) { - throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.'); - } - - return $request; - } - - return new static($query, $request, $attributes, $cookies, $files, $server, $content); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php deleted file mode 100644 index da95c3acc1..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcher.php +++ /dev/null @@ -1,160 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * RequestMatcher compares a pre-defined set of checks against a Request instance. - * - * @author Fabien Potencier - * - * @api - */ -class RequestMatcher implements RequestMatcherInterface -{ - /** - * @var string - */ - private $path; - - /** - * @var string - */ - private $host; - - /** - * @var array - */ - private $methods = array(); - - /** - * @var string - */ - private $ips = array(); - - /** - * @var array - */ - private $attributes = array(); - - /** - * @param string|null $path - * @param string|null $host - * @param string|string[]|null $methods - * @param string|string[]|null $ips - * @param array $attributes - */ - public function __construct($path = null, $host = null, $methods = null, $ips = null, array $attributes = array()) - { - $this->matchPath($path); - $this->matchHost($host); - $this->matchMethod($methods); - $this->matchIps($ips); - foreach ($attributes as $k => $v) { - $this->matchAttribute($k, $v); - } - } - - /** - * Adds a check for the URL host name. - * - * @param string $regexp A Regexp - */ - public function matchHost($regexp) - { - $this->host = $regexp; - } - - /** - * Adds a check for the URL path info. - * - * @param string $regexp A Regexp - */ - public function matchPath($regexp) - { - $this->path = $regexp; - } - - /** - * Adds a check for the client IP. - * - * @param string $ip A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 - */ - public function matchIp($ip) - { - $this->matchIps($ip); - } - - /** - * Adds a check for the client IP. - * - * @param string|string[] $ips A specific IP address or a range specified using IP/netmask like 192.168.1.0/24 - */ - public function matchIps($ips) - { - $this->ips = (array) $ips; - } - - /** - * Adds a check for the HTTP method. - * - * @param string|string[]|null $method An HTTP method or an array of HTTP methods - */ - public function matchMethod($method) - { - $this->methods = array_map('strtoupper', (array) $method); - } - - /** - * Adds a check for request attribute. - * - * @param string $key The request attribute name - * @param string $regexp A Regexp - */ - public function matchAttribute($key, $regexp) - { - $this->attributes[$key] = $regexp; - } - - /** - * {@inheritdoc} - * - * @api - */ - public function matches(Request $request) - { - if ($this->methods && !in_array($request->getMethod(), $this->methods)) { - return false; - } - - foreach ($this->attributes as $key => $pattern) { - if (!preg_match('{'.$pattern.'}', $request->attributes->get($key))) { - return false; - } - } - - if (null !== $this->path && !preg_match('{'.$this->path.'}', rawurldecode($request->getPathInfo()))) { - return false; - } - - if (null !== $this->host && !preg_match('{'.$this->host.'}i', $request->getHost())) { - return false; - } - - if (IpUtils::checkIp($request->getClientIp(), $this->ips)) { - return true; - } - - // Note to future implementors: add additional checks above the - // foreach above or else your check might not be run! - return count($this->ips) === 0; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php deleted file mode 100644 index 695fd21788..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestMatcherInterface.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * RequestMatcherInterface is an interface for strategies to match a Request. - * - * @author Fabien Potencier - * - * @api - */ -interface RequestMatcherInterface -{ - /** - * Decides whether the rule(s) implemented by the strategy matches the supplied request. - * - * @param Request $request The request to check for a match - * - * @return Boolean true if the request matches, false otherwise - * - * @api - */ - public function matches(Request $request); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php deleted file mode 100644 index 4b0ef28dee..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RequestStack.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Request stack that controls the lifecycle of requests. - * - * @author Benjamin Eberlei - */ -class RequestStack -{ - /** - * @var Request[] - */ - private $requests = array(); - - /** - * Pushes a Request on the stack. - * - * This method should generally not be called directly as the stack - * management should be taken care of by the application itself. - */ - public function push(Request $request) - { - $this->requests[] = $request; - } - - /** - * Pops the current request from the stack. - * - * This operation lets the current request go out of scope. - * - * This method should generally not be called directly as the stack - * management should be taken care of by the application itself. - * - * @return Request|null - */ - public function pop() - { - if (!$this->requests) { - return null; - } - - return array_pop($this->requests); - } - - /** - * @return Request|null - */ - public function getCurrentRequest() - { - return end($this->requests) ?: null; - } - - /** - * Gets the master Request. - * - * Be warned that making your code aware of the master request - * might make it un-compatible with other features of your framework - * like ESI support. - * - * @return Request|null - */ - public function getMasterRequest() - { - if (!$this->requests) { - return null; - } - - return $this->requests[0]; - } - - /** - * Returns the parent request of the current. - * - * Be warned that making your code aware of the parent request - * might make it un-compatible with other features of your framework - * like ESI support. - * - * If current Request is the master request, it returns null. - * - * @return Request|null - */ - public function getParentRequest() - { - $pos = count($this->requests) - 2; - - if (!isset($this->requests[$pos])) { - return null; - } - - return $this->requests[$pos]; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php deleted file mode 100644 index b6bbfc2d93..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/** - * SessionHandlerInterface - * - * Provides forward compatibility with PHP 5.4 - * - * Extensive documentation can be found at php.net, see links: - * - * @see http://php.net/sessionhandlerinterface - * @see http://php.net/session.customhandler - * @see http://php.net/session-set-save-handler - * - * @author Drak - */ -interface SessionHandlerInterface -{ - /** - * Open session. - * - * @see http://php.net/sessionhandlerinterface.open - * - * @param string $savePath Save path. - * @param string $sessionName Session Name. - * - * @throws \RuntimeException If something goes wrong starting the session. - * - * @return boolean - */ - public function open($savePath, $sessionName); - - /** - * Close session. - * - * @see http://php.net/sessionhandlerinterface.close - * - * @return boolean - */ - public function close(); - - /** - * Read session. - * - * @param string $sessionId - * - * @see http://php.net/sessionhandlerinterface.read - * - * @throws \RuntimeException On fatal error but not "record not found". - * - * @return string String as stored in persistent storage or empty string in all other cases. - */ - public function read($sessionId); - - /** - * Commit session to storage. - * - * @see http://php.net/sessionhandlerinterface.write - * - * @param string $sessionId Session ID. - * @param string $data Session serialized data to save. - * - * @return boolean - */ - public function write($sessionId, $data); - - /** - * Destroys this session. - * - * @see http://php.net/sessionhandlerinterface.destroy - * - * @param string $sessionId Session ID. - * - * @throws \RuntimeException On fatal error. - * - * @return boolean - */ - public function destroy($sessionId); - - /** - * Garbage collection for storage. - * - * @see http://php.net/sessionhandlerinterface.gc - * - * @param integer $lifetime Max lifetime in seconds to keep sessions stored. - * - * @throws \RuntimeException On fatal error. - * - * @return boolean - */ - public function gc($lifetime); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php deleted file mode 100644 index bc9a193c7d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php +++ /dev/null @@ -1,1257 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * Response represents an HTTP response. - * - * @author Fabien Potencier - * - * @api - */ -class Response -{ - const HTTP_CONTINUE = 100; - const HTTP_SWITCHING_PROTOCOLS = 101; - const HTTP_PROCESSING = 102; // RFC2518 - const HTTP_OK = 200; - const HTTP_CREATED = 201; - const HTTP_ACCEPTED = 202; - const HTTP_NON_AUTHORITATIVE_INFORMATION = 203; - const HTTP_NO_CONTENT = 204; - const HTTP_RESET_CONTENT = 205; - const HTTP_PARTIAL_CONTENT = 206; - const HTTP_MULTI_STATUS = 207; // RFC4918 - const HTTP_ALREADY_REPORTED = 208; // RFC5842 - const HTTP_IM_USED = 226; // RFC3229 - const HTTP_MULTIPLE_CHOICES = 300; - const HTTP_MOVED_PERMANENTLY = 301; - const HTTP_FOUND = 302; - const HTTP_SEE_OTHER = 303; - const HTTP_NOT_MODIFIED = 304; - const HTTP_USE_PROXY = 305; - const HTTP_RESERVED = 306; - const HTTP_TEMPORARY_REDIRECT = 307; - const HTTP_PERMANENTLY_REDIRECT = 308; // RFC-reschke-http-status-308-07 - const HTTP_BAD_REQUEST = 400; - const HTTP_UNAUTHORIZED = 401; - const HTTP_PAYMENT_REQUIRED = 402; - const HTTP_FORBIDDEN = 403; - const HTTP_NOT_FOUND = 404; - const HTTP_METHOD_NOT_ALLOWED = 405; - const HTTP_NOT_ACCEPTABLE = 406; - const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407; - const HTTP_REQUEST_TIMEOUT = 408; - const HTTP_CONFLICT = 409; - const HTTP_GONE = 410; - const HTTP_LENGTH_REQUIRED = 411; - const HTTP_PRECONDITION_FAILED = 412; - const HTTP_REQUEST_ENTITY_TOO_LARGE = 413; - const HTTP_REQUEST_URI_TOO_LONG = 414; - const HTTP_UNSUPPORTED_MEDIA_TYPE = 415; - const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416; - const HTTP_EXPECTATION_FAILED = 417; - const HTTP_I_AM_A_TEAPOT = 418; // RFC2324 - const HTTP_UNPROCESSABLE_ENTITY = 422; // RFC4918 - const HTTP_LOCKED = 423; // RFC4918 - const HTTP_FAILED_DEPENDENCY = 424; // RFC4918 - const HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425; // RFC2817 - const HTTP_UPGRADE_REQUIRED = 426; // RFC2817 - const HTTP_PRECONDITION_REQUIRED = 428; // RFC6585 - const HTTP_TOO_MANY_REQUESTS = 429; // RFC6585 - const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; // RFC6585 - const HTTP_INTERNAL_SERVER_ERROR = 500; - const HTTP_NOT_IMPLEMENTED = 501; - const HTTP_BAD_GATEWAY = 502; - const HTTP_SERVICE_UNAVAILABLE = 503; - const HTTP_GATEWAY_TIMEOUT = 504; - const HTTP_VERSION_NOT_SUPPORTED = 505; - const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506; // RFC2295 - const HTTP_INSUFFICIENT_STORAGE = 507; // RFC4918 - const HTTP_LOOP_DETECTED = 508; // RFC5842 - const HTTP_NOT_EXTENDED = 510; // RFC2774 - const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC6585 - - /** - * @var \Symfony\Component\HttpFoundation\ResponseHeaderBag - */ - public $headers; - - /** - * @var string - */ - protected $content; - - /** - * @var string - */ - protected $version; - - /** - * @var integer - */ - protected $statusCode; - - /** - * @var string - */ - protected $statusText; - - /** - * @var string - */ - protected $charset; - - /** - * Status codes translation table. - * - * The list of codes is complete according to the - * {@link http://www.iana.org/assignments/http-status-codes/ Hypertext Transfer Protocol (HTTP) Status Code Registry} - * (last updated 2012-02-13). - * - * Unless otherwise noted, the status code is defined in RFC2616. - * - * @var array - */ - public static $statusTexts = array( - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', // RFC2518 - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', // RFC4918 - 208 => 'Already Reported', // RFC5842 - 226 => 'IM Used', // RFC3229 - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 306 => 'Reserved', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', // RFC-reschke-http-status-308-07 - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 418 => 'I\'m a teapot', // RFC2324 - 422 => 'Unprocessable Entity', // RFC4918 - 423 => 'Locked', // RFC4918 - 424 => 'Failed Dependency', // RFC4918 - 425 => 'Reserved for WebDAV advanced collections expired proposal', // RFC2817 - 426 => 'Upgrade Required', // RFC2817 - 428 => 'Precondition Required', // RFC6585 - 429 => 'Too Many Requests', // RFC6585 - 431 => 'Request Header Fields Too Large', // RFC6585 - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates (Experimental)', // RFC2295 - 507 => 'Insufficient Storage', // RFC4918 - 508 => 'Loop Detected', // RFC5842 - 510 => 'Not Extended', // RFC2774 - 511 => 'Network Authentication Required', // RFC6585 - ); - - /** - * Constructor. - * - * @param mixed $content The response content, see setContent() - * @param integer $status The response status code - * @param array $headers An array of response headers - * - * @throws \InvalidArgumentException When the HTTP status code is not valid - * - * @api - */ - public function __construct($content = '', $status = 200, $headers = array()) - { - $this->headers = new ResponseHeaderBag($headers); - $this->setContent($content); - $this->setStatusCode($status); - $this->setProtocolVersion('1.0'); - if (!$this->headers->has('Date')) { - $this->setDate(new \DateTime(null, new \DateTimeZone('UTC'))); - } - } - - /** - * Factory method for chainability - * - * Example: - * - * return Response::create($body, 200) - * ->setSharedMaxAge(300); - * - * @param mixed $content The response content, see setContent() - * @param integer $status The response status code - * @param array $headers An array of response headers - * - * @return Response - */ - public static function create($content = '', $status = 200, $headers = array()) - { - return new static($content, $status, $headers); - } - - /** - * Returns the Response as an HTTP string. - * - * The string representation of the Response is the same as the - * one that will be sent to the client only if the prepare() method - * has been called before. - * - * @return string The Response as an HTTP string - * - * @see prepare() - */ - public function __toString() - { - return - sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n". - $this->headers."\r\n". - $this->getContent(); - } - - /** - * Clones the current Response instance. - */ - public function __clone() - { - $this->headers = clone $this->headers; - } - - /** - * Prepares the Response before it is sent to the client. - * - * This method tweaks the Response to ensure that it is - * compliant with RFC 2616. Most of the changes are based on - * the Request that is "associated" with this Response. - * - * @param Request $request A Request instance - * - * @return Response The current response. - */ - public function prepare(Request $request) - { - $headers = $this->headers; - - if ($this->isInformational() || in_array($this->statusCode, array(204, 304))) { - $this->setContent(null); - } - - // Content-type based on the Request - if (!$headers->has('Content-Type')) { - $format = $request->getRequestFormat(); - if (null !== $format && $mimeType = $request->getMimeType($format)) { - $headers->set('Content-Type', $mimeType); - } - } - - // Fix Content-Type - $charset = $this->charset ?: 'UTF-8'; - if (!$headers->has('Content-Type')) { - $headers->set('Content-Type', 'text/html; charset='.$charset); - } elseif (0 === stripos($headers->get('Content-Type'), 'text/') && false === stripos($headers->get('Content-Type'), 'charset')) { - // add the charset - $headers->set('Content-Type', $headers->get('Content-Type').'; charset='.$charset); - } - - // Fix Content-Length - if ($headers->has('Transfer-Encoding')) { - $headers->remove('Content-Length'); - } - - if ($request->isMethod('HEAD')) { - // cf. RFC2616 14.13 - $length = $headers->get('Content-Length'); - $this->setContent(null); - if ($length) { - $headers->set('Content-Length', $length); - } - } - - // Fix protocol - if ('HTTP/1.0' != $request->server->get('SERVER_PROTOCOL')) { - $this->setProtocolVersion('1.1'); - } - - // Check if we need to send extra expire info headers - if ('1.0' == $this->getProtocolVersion() && 'no-cache' == $this->headers->get('Cache-Control')) { - $this->headers->set('pragma', 'no-cache'); - $this->headers->set('expires', -1); - } - - $this->ensureIEOverSSLCompatibility($request); - - return $this; - } - - /** - * Sends HTTP headers. - * - * @return Response - */ - public function sendHeaders() - { - // headers have already been sent by the developer - if (headers_sent()) { - return $this; - } - - // status - header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode); - - // headers - foreach ($this->headers->allPreserveCase() as $name => $values) { - foreach ($values as $value) { - header($name.': '.$value, false, $this->statusCode); - } - } - - // cookies - foreach ($this->headers->getCookies() as $cookie) { - setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly()); - } - - return $this; - } - - /** - * Sends content for the current web response. - * - * @return Response - */ - public function sendContent() - { - echo $this->content; - - return $this; - } - - /** - * Sends HTTP headers and content. - * - * @return Response - * - * @api - */ - public function send() - { - $this->sendHeaders(); - $this->sendContent(); - - if (function_exists('fastcgi_finish_request')) { - fastcgi_finish_request(); - } elseif ('cli' !== PHP_SAPI) { - // ob_get_level() never returns 0 on some Windows configurations, so if - // the level is the same two times in a row, the loop should be stopped. - $previous = null; - $obStatus = ob_get_status(1); - while (($level = ob_get_level()) > 0 && $level !== $previous) { - $previous = $level; - if ($obStatus[$level - 1]) { - if (version_compare(PHP_VERSION, '5.4', '>=')) { - if (isset($obStatus[$level - 1]['flags']) && ($obStatus[$level - 1]['flags'] & PHP_OUTPUT_HANDLER_REMOVABLE)) { - ob_end_flush(); - } - } else { - if (isset($obStatus[$level - 1]['del']) && $obStatus[$level - 1]['del']) { - ob_end_flush(); - } - } - } - } - flush(); - } - - return $this; - } - - /** - * Sets the response content. - * - * Valid types are strings, numbers, null, and objects that implement a __toString() method. - * - * @param mixed $content Content that can be cast to string - * - * @return Response - * - * @throws \UnexpectedValueException - * - * @api - */ - public function setContent($content) - { - if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content, '__toString'))) { - throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', gettype($content))); - } - - $this->content = (string) $content; - - return $this; - } - - /** - * Gets the current response content. - * - * @return string Content - * - * @api - */ - public function getContent() - { - return $this->content; - } - - /** - * Sets the HTTP protocol version (1.0 or 1.1). - * - * @param string $version The HTTP protocol version - * - * @return Response - * - * @api - */ - public function setProtocolVersion($version) - { - $this->version = $version; - - return $this; - } - - /** - * Gets the HTTP protocol version. - * - * @return string The HTTP protocol version - * - * @api - */ - public function getProtocolVersion() - { - return $this->version; - } - - /** - * Sets the response status code. - * - * @param integer $code HTTP status code - * @param mixed $text HTTP status text - * - * If the status text is null it will be automatically populated for the known - * status codes and left empty otherwise. - * - * @return Response - * - * @throws \InvalidArgumentException When the HTTP status code is not valid - * - * @api - */ - public function setStatusCode($code, $text = null) - { - $this->statusCode = $code = (int) $code; - if ($this->isInvalid()) { - throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code)); - } - - if (null === $text) { - $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : ''; - - return $this; - } - - if (false === $text) { - $this->statusText = ''; - - return $this; - } - - $this->statusText = $text; - - return $this; - } - - /** - * Retrieves the status code for the current web response. - * - * @return integer Status code - * - * @api - */ - public function getStatusCode() - { - return $this->statusCode; - } - - /** - * Sets the response charset. - * - * @param string $charset Character set - * - * @return Response - * - * @api - */ - public function setCharset($charset) - { - $this->charset = $charset; - - return $this; - } - - /** - * Retrieves the response charset. - * - * @return string Character set - * - * @api - */ - public function getCharset() - { - return $this->charset; - } - - /** - * Returns true if the response is worth caching under any circumstance. - * - * Responses marked "private" with an explicit Cache-Control directive are - * considered uncacheable. - * - * Responses with neither a freshness lifetime (Expires, max-age) nor cache - * validator (Last-Modified, ETag) are considered uncacheable. - * - * @return Boolean true if the response is worth caching, false otherwise - * - * @api - */ - public function isCacheable() - { - if (!in_array($this->statusCode, array(200, 203, 300, 301, 302, 404, 410))) { - return false; - } - - if ($this->headers->hasCacheControlDirective('no-store') || $this->headers->getCacheControlDirective('private')) { - return false; - } - - return $this->isValidateable() || $this->isFresh(); - } - - /** - * Returns true if the response is "fresh". - * - * Fresh responses may be served from cache without any interaction with the - * origin. A response is considered fresh when it includes a Cache-Control/max-age - * indicator or Expires header and the calculated age is less than the freshness lifetime. - * - * @return Boolean true if the response is fresh, false otherwise - * - * @api - */ - public function isFresh() - { - return $this->getTtl() > 0; - } - - /** - * Returns true if the response includes headers that can be used to validate - * the response with the origin server using a conditional GET request. - * - * @return Boolean true if the response is validateable, false otherwise - * - * @api - */ - public function isValidateable() - { - return $this->headers->has('Last-Modified') || $this->headers->has('ETag'); - } - - /** - * Marks the response as "private". - * - * It makes the response ineligible for serving other clients. - * - * @return Response - * - * @api - */ - public function setPrivate() - { - $this->headers->removeCacheControlDirective('public'); - $this->headers->addCacheControlDirective('private'); - - return $this; - } - - /** - * Marks the response as "public". - * - * It makes the response eligible for serving other clients. - * - * @return Response - * - * @api - */ - public function setPublic() - { - $this->headers->addCacheControlDirective('public'); - $this->headers->removeCacheControlDirective('private'); - - return $this; - } - - /** - * Returns true if the response must be revalidated by caches. - * - * This method indicates that the response must not be served stale by a - * cache in any circumstance without first revalidating with the origin. - * When present, the TTL of the response should not be overridden to be - * greater than the value provided by the origin. - * - * @return Boolean true if the response must be revalidated by a cache, false otherwise - * - * @api - */ - public function mustRevalidate() - { - return $this->headers->hasCacheControlDirective('must-revalidate') || $this->headers->has('proxy-revalidate'); - } - - /** - * Returns the Date header as a DateTime instance. - * - * @return \DateTime A \DateTime instance - * - * @throws \RuntimeException When the header is not parseable - * - * @api - */ - public function getDate() - { - return $this->headers->getDate('Date', new \DateTime()); - } - - /** - * Sets the Date header. - * - * @param \DateTime $date A \DateTime instance - * - * @return Response - * - * @api - */ - public function setDate(\DateTime $date) - { - $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Date', $date->format('D, d M Y H:i:s').' GMT'); - - return $this; - } - - /** - * Returns the age of the response. - * - * @return integer The age of the response in seconds - */ - public function getAge() - { - if (null !== $age = $this->headers->get('Age')) { - return (int) $age; - } - - return max(time() - $this->getDate()->format('U'), 0); - } - - /** - * Marks the response stale by setting the Age header to be equal to the maximum age of the response. - * - * @return Response - * - * @api - */ - public function expire() - { - if ($this->isFresh()) { - $this->headers->set('Age', $this->getMaxAge()); - } - - return $this; - } - - /** - * Returns the value of the Expires header as a DateTime instance. - * - * @return \DateTime|null A DateTime instance or null if the header does not exist - * - * @api - */ - public function getExpires() - { - try { - return $this->headers->getDate('Expires'); - } catch (\RuntimeException $e) { - // according to RFC 2616 invalid date formats (e.g. "0" and "-1") must be treated as in the past - return \DateTime::createFromFormat(DATE_RFC2822, 'Sat, 01 Jan 00 00:00:00 +0000'); - } - } - - /** - * Sets the Expires HTTP header with a DateTime instance. - * - * Passing null as value will remove the header. - * - * @param \DateTime|null $date A \DateTime instance or null to remove the header - * - * @return Response - * - * @api - */ - public function setExpires(\DateTime $date = null) - { - if (null === $date) { - $this->headers->remove('Expires'); - } else { - $date = clone $date; - $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Expires', $date->format('D, d M Y H:i:s').' GMT'); - } - - return $this; - } - - /** - * Returns the number of seconds after the time specified in the response's Date - * header when the response should no longer be considered fresh. - * - * First, it checks for a s-maxage directive, then a max-age directive, and then it falls - * back on an expires header. It returns null when no maximum age can be established. - * - * @return integer|null Number of seconds - * - * @api - */ - public function getMaxAge() - { - if ($this->headers->hasCacheControlDirective('s-maxage')) { - return (int) $this->headers->getCacheControlDirective('s-maxage'); - } - - if ($this->headers->hasCacheControlDirective('max-age')) { - return (int) $this->headers->getCacheControlDirective('max-age'); - } - - if (null !== $this->getExpires()) { - return $this->getExpires()->format('U') - $this->getDate()->format('U'); - } - - return null; - } - - /** - * Sets the number of seconds after which the response should no longer be considered fresh. - * - * This methods sets the Cache-Control max-age directive. - * - * @param integer $value Number of seconds - * - * @return Response - * - * @api - */ - public function setMaxAge($value) - { - $this->headers->addCacheControlDirective('max-age', $value); - - return $this; - } - - /** - * Sets the number of seconds after which the response should no longer be considered fresh by shared caches. - * - * This methods sets the Cache-Control s-maxage directive. - * - * @param integer $value Number of seconds - * - * @return Response - * - * @api - */ - public function setSharedMaxAge($value) - { - $this->setPublic(); - $this->headers->addCacheControlDirective('s-maxage', $value); - - return $this; - } - - /** - * Returns the response's time-to-live in seconds. - * - * It returns null when no freshness information is present in the response. - * - * When the responses TTL is <= 0, the response may not be served from cache without first - * revalidating with the origin. - * - * @return integer|null The TTL in seconds - * - * @api - */ - public function getTtl() - { - if (null !== $maxAge = $this->getMaxAge()) { - return $maxAge - $this->getAge(); - } - - return null; - } - - /** - * Sets the response's time-to-live for shared caches. - * - * This method adjusts the Cache-Control/s-maxage directive. - * - * @param integer $seconds Number of seconds - * - * @return Response - * - * @api - */ - public function setTtl($seconds) - { - $this->setSharedMaxAge($this->getAge() + $seconds); - - return $this; - } - - /** - * Sets the response's time-to-live for private/client caches. - * - * This method adjusts the Cache-Control/max-age directive. - * - * @param integer $seconds Number of seconds - * - * @return Response - * - * @api - */ - public function setClientTtl($seconds) - { - $this->setMaxAge($this->getAge() + $seconds); - - return $this; - } - - /** - * Returns the Last-Modified HTTP header as a DateTime instance. - * - * @return \DateTime|null A DateTime instance or null if the header does not exist - * - * @throws \RuntimeException When the HTTP header is not parseable - * - * @api - */ - public function getLastModified() - { - return $this->headers->getDate('Last-Modified'); - } - - /** - * Sets the Last-Modified HTTP header with a DateTime instance. - * - * Passing null as value will remove the header. - * - * @param \DateTime|null $date A \DateTime instance or null to remove the header - * - * @return Response - * - * @api - */ - public function setLastModified(\DateTime $date = null) - { - if (null === $date) { - $this->headers->remove('Last-Modified'); - } else { - $date = clone $date; - $date->setTimezone(new \DateTimeZone('UTC')); - $this->headers->set('Last-Modified', $date->format('D, d M Y H:i:s').' GMT'); - } - - return $this; - } - - /** - * Returns the literal value of the ETag HTTP header. - * - * @return string|null The ETag HTTP header or null if it does not exist - * - * @api - */ - public function getEtag() - { - return $this->headers->get('ETag'); - } - - /** - * Sets the ETag value. - * - * @param string|null $etag The ETag unique identifier or null to remove the header - * @param Boolean $weak Whether you want a weak ETag or not - * - * @return Response - * - * @api - */ - public function setEtag($etag = null, $weak = false) - { - if (null === $etag) { - $this->headers->remove('Etag'); - } else { - if (0 !== strpos($etag, '"')) { - $etag = '"'.$etag.'"'; - } - - $this->headers->set('ETag', (true === $weak ? 'W/' : '').$etag); - } - - return $this; - } - - /** - * Sets the response's cache headers (validation and/or expiration). - * - * Available options are: etag, last_modified, max_age, s_maxage, private, and public. - * - * @param array $options An array of cache options - * - * @return Response - * - * @throws \InvalidArgumentException - * - * @api - */ - public function setCache(array $options) - { - if ($diff = array_diff(array_keys($options), array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public'))) { - throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', array_values($diff)))); - } - - if (isset($options['etag'])) { - $this->setEtag($options['etag']); - } - - if (isset($options['last_modified'])) { - $this->setLastModified($options['last_modified']); - } - - if (isset($options['max_age'])) { - $this->setMaxAge($options['max_age']); - } - - if (isset($options['s_maxage'])) { - $this->setSharedMaxAge($options['s_maxage']); - } - - if (isset($options['public'])) { - if ($options['public']) { - $this->setPublic(); - } else { - $this->setPrivate(); - } - } - - if (isset($options['private'])) { - if ($options['private']) { - $this->setPrivate(); - } else { - $this->setPublic(); - } - } - - return $this; - } - - /** - * Modifies the response so that it conforms to the rules defined for a 304 status code. - * - * This sets the status, removes the body, and discards any headers - * that MUST NOT be included in 304 responses. - * - * @return Response - * - * @see http://tools.ietf.org/html/rfc2616#section-10.3.5 - * - * @api - */ - public function setNotModified() - { - $this->setStatusCode(304); - $this->setContent(null); - - // remove headers that MUST NOT be included with 304 Not Modified responses - foreach (array('Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified') as $header) { - $this->headers->remove($header); - } - - return $this; - } - - /** - * Returns true if the response includes a Vary header. - * - * @return Boolean true if the response includes a Vary header, false otherwise - * - * @api - */ - public function hasVary() - { - return null !== $this->headers->get('Vary'); - } - - /** - * Returns an array of header names given in the Vary header. - * - * @return array An array of Vary names - * - * @api - */ - public function getVary() - { - if (!$vary = $this->headers->get('Vary')) { - return array(); - } - - return is_array($vary) ? $vary : preg_split('/[\s,]+/', $vary); - } - - /** - * Sets the Vary header. - * - * @param string|array $headers - * @param Boolean $replace Whether to replace the actual value of not (true by default) - * - * @return Response - * - * @api - */ - public function setVary($headers, $replace = true) - { - $this->headers->set('Vary', $headers, $replace); - - return $this; - } - - /** - * Determines if the Response validators (ETag, Last-Modified) match - * a conditional value specified in the Request. - * - * If the Response is not modified, it sets the status code to 304 and - * removes the actual content by calling the setNotModified() method. - * - * @param Request $request A Request instance - * - * @return Boolean true if the Response validators match the Request, false otherwise - * - * @api - */ - public function isNotModified(Request $request) - { - if (!$request->isMethodSafe()) { - return false; - } - - $lastModified = $request->headers->get('If-Modified-Since'); - $notModified = false; - if ($etags = $request->getEtags()) { - $notModified = (in_array($this->getEtag(), $etags) || in_array('*', $etags)) && (!$lastModified || $this->headers->get('Last-Modified') == $lastModified); - } elseif ($lastModified) { - $notModified = $lastModified == $this->headers->get('Last-Modified'); - } - - if ($notModified) { - $this->setNotModified(); - } - - return $notModified; - } - - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html - /** - * Is response invalid? - * - * @return Boolean - * - * @api - */ - public function isInvalid() - { - return $this->statusCode < 100 || $this->statusCode >= 600; - } - - /** - * Is response informative? - * - * @return Boolean - * - * @api - */ - public function isInformational() - { - return $this->statusCode >= 100 && $this->statusCode < 200; - } - - /** - * Is response successful? - * - * @return Boolean - * - * @api - */ - public function isSuccessful() - { - return $this->statusCode >= 200 && $this->statusCode < 300; - } - - /** - * Is the response a redirect? - * - * @return Boolean - * - * @api - */ - public function isRedirection() - { - return $this->statusCode >= 300 && $this->statusCode < 400; - } - - /** - * Is there a client error? - * - * @return Boolean - * - * @api - */ - public function isClientError() - { - return $this->statusCode >= 400 && $this->statusCode < 500; - } - - /** - * Was there a server side error? - * - * @return Boolean - * - * @api - */ - public function isServerError() - { - return $this->statusCode >= 500 && $this->statusCode < 600; - } - - /** - * Is the response OK? - * - * @return Boolean - * - * @api - */ - public function isOk() - { - return 200 === $this->statusCode; - } - - /** - * Is the response forbidden? - * - * @return Boolean - * - * @api - */ - public function isForbidden() - { - return 403 === $this->statusCode; - } - - /** - * Is the response a not found error? - * - * @return Boolean - * - * @api - */ - public function isNotFound() - { - return 404 === $this->statusCode; - } - - /** - * Is the response a redirect of some form? - * - * @param string $location - * - * @return Boolean - * - * @api - */ - public function isRedirect($location = null) - { - return in_array($this->statusCode, array(201, 301, 302, 303, 307, 308)) && (null === $location ?: $location == $this->headers->get('Location')); - } - - /** - * Is the response empty? - * - * @return Boolean - * - * @api - */ - public function isEmpty() - { - return in_array($this->statusCode, array(201, 204, 304)); - } - - /** - * Check if we need to remove Cache-Control for SSL encrypted downloads when using IE < 9 - * - * @link http://support.microsoft.com/kb/323308 - */ - protected function ensureIEOverSSLCompatibility(Request $request) - { - if (false !== stripos($this->headers->get('Content-Disposition'), 'attachment') && preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) == 1 && true === $request->isSecure()) { - if (intval(preg_replace("/(MSIE )(.*?);/", "$2", $match[0])) < 9) { - $this->headers->remove('Cache-Control'); - } - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php deleted file mode 100644 index f52f048875..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php +++ /dev/null @@ -1,319 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ResponseHeaderBag is a container for Response HTTP headers. - * - * @author Fabien Potencier - * - * @api - */ -class ResponseHeaderBag extends HeaderBag -{ - const COOKIES_FLAT = 'flat'; - const COOKIES_ARRAY = 'array'; - - const DISPOSITION_ATTACHMENT = 'attachment'; - const DISPOSITION_INLINE = 'inline'; - - /** - * @var array - */ - protected $computedCacheControl = array(); - - /** - * @var array - */ - protected $cookies = array(); - - /** - * @var array - */ - protected $headerNames = array(); - - /** - * Constructor. - * - * @param array $headers An array of HTTP headers - * - * @api - */ - public function __construct(array $headers = array()) - { - parent::__construct($headers); - - if (!isset($this->headers['cache-control'])) { - $this->set('Cache-Control', ''); - } - } - - /** - * {@inheritdoc} - */ - public function __toString() - { - $cookies = ''; - foreach ($this->getCookies() as $cookie) { - $cookies .= 'Set-Cookie: '.$cookie."\r\n"; - } - - ksort($this->headerNames); - - return parent::__toString().$cookies; - } - - /** - * Returns the headers, with original capitalizations. - * - * @return array An array of headers - */ - public function allPreserveCase() - { - return array_combine($this->headerNames, $this->headers); - } - - /** - * {@inheritdoc} - * - * @api - */ - public function replace(array $headers = array()) - { - $this->headerNames = array(); - - parent::replace($headers); - - if (!isset($this->headers['cache-control'])) { - $this->set('Cache-Control', ''); - } - } - - /** - * {@inheritdoc} - * - * @api - */ - public function set($key, $values, $replace = true) - { - parent::set($key, $values, $replace); - - $uniqueKey = strtr(strtolower($key), '_', '-'); - $this->headerNames[$uniqueKey] = $key; - - // ensure the cache-control header has sensible defaults - if (in_array($uniqueKey, array('cache-control', 'etag', 'last-modified', 'expires'))) { - $computed = $this->computeCacheControlValue(); - $this->headers['cache-control'] = array($computed); - $this->headerNames['cache-control'] = 'Cache-Control'; - $this->computedCacheControl = $this->parseCacheControl($computed); - } - } - - /** - * {@inheritdoc} - * - * @api - */ - public function remove($key) - { - parent::remove($key); - - $uniqueKey = strtr(strtolower($key), '_', '-'); - unset($this->headerNames[$uniqueKey]); - - if ('cache-control' === $uniqueKey) { - $this->computedCacheControl = array(); - } - } - - /** - * {@inheritdoc} - */ - public function hasCacheControlDirective($key) - { - return array_key_exists($key, $this->computedCacheControl); - } - - /** - * {@inheritdoc} - */ - public function getCacheControlDirective($key) - { - return array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null; - } - - /** - * Sets a cookie. - * - * @param Cookie $cookie - * - * @api - */ - public function setCookie(Cookie $cookie) - { - $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie; - } - - /** - * Removes a cookie from the array, but does not unset it in the browser - * - * @param string $name - * @param string $path - * @param string $domain - * - * @api - */ - public function removeCookie($name, $path = '/', $domain = null) - { - if (null === $path) { - $path = '/'; - } - - unset($this->cookies[$domain][$path][$name]); - - if (empty($this->cookies[$domain][$path])) { - unset($this->cookies[$domain][$path]); - - if (empty($this->cookies[$domain])) { - unset($this->cookies[$domain]); - } - } - } - - /** - * Returns an array with all cookies - * - * @param string $format - * - * @throws \InvalidArgumentException When the $format is invalid - * - * @return array - * - * @api - */ - public function getCookies($format = self::COOKIES_FLAT) - { - if (!in_array($format, array(self::COOKIES_FLAT, self::COOKIES_ARRAY))) { - throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', array(self::COOKIES_FLAT, self::COOKIES_ARRAY)))); - } - - if (self::COOKIES_ARRAY === $format) { - return $this->cookies; - } - - $flattenedCookies = array(); - foreach ($this->cookies as $path) { - foreach ($path as $cookies) { - foreach ($cookies as $cookie) { - $flattenedCookies[] = $cookie; - } - } - } - - return $flattenedCookies; - } - - /** - * Clears a cookie in the browser - * - * @param string $name - * @param string $path - * @param string $domain - * - * @api - */ - public function clearCookie($name, $path = '/', $domain = null) - { - $this->setCookie(new Cookie($name, null, 1, $path, $domain)); - } - - /** - * Generates a HTTP Content-Disposition field-value. - * - * @param string $disposition One of "inline" or "attachment" - * @param string $filename A unicode string - * @param string $filenameFallback A string containing only ASCII characters that - * is semantically equivalent to $filename. If the filename is already ASCII, - * it can be omitted, or just copied from $filename - * - * @return string A string suitable for use as a Content-Disposition field-value. - * - * @throws \InvalidArgumentException - * @see RFC 6266 - */ - public function makeDisposition($disposition, $filename, $filenameFallback = '') - { - if (!in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) { - throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE)); - } - - if ('' == $filenameFallback) { - $filenameFallback = $filename; - } - - // filenameFallback is not ASCII. - if (!preg_match('/^[\x20-\x7e]*$/', $filenameFallback)) { - throw new \InvalidArgumentException('The filename fallback must only contain ASCII characters.'); - } - - // percent characters aren't safe in fallback. - if (false !== strpos($filenameFallback, '%')) { - throw new \InvalidArgumentException('The filename fallback cannot contain the "%" character.'); - } - - // path separators aren't allowed in either. - if (false !== strpos($filename, '/') || false !== strpos($filename, '\\') || false !== strpos($filenameFallback, '/') || false !== strpos($filenameFallback, '\\')) { - throw new \InvalidArgumentException('The filename and the fallback cannot contain the "/" and "\\" characters.'); - } - - $output = sprintf('%s; filename="%s"', $disposition, str_replace('"', '\\"', $filenameFallback)); - - if ($filename !== $filenameFallback) { - $output .= sprintf("; filename*=utf-8''%s", rawurlencode($filename)); - } - - return $output; - } - - /** - * Returns the calculated value of the cache-control header. - * - * This considers several other headers and calculates or modifies the - * cache-control header to a sensible, conservative value. - * - * @return string - */ - protected function computeCacheControlValue() - { - if (!$this->cacheControl && !$this->has('ETag') && !$this->has('Last-Modified') && !$this->has('Expires')) { - return 'no-cache'; - } - - if (!$this->cacheControl) { - // conservative by default - return 'private, must-revalidate'; - } - - $header = $this->getCacheControlHeader(); - if (isset($this->cacheControl['public']) || isset($this->cacheControl['private'])) { - return $header; - } - - // public if s-maxage is defined, private otherwise - if (!isset($this->cacheControl['s-maxage'])) { - return $header.', private'; - } - - return $header; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ServerBag.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ServerBag.php deleted file mode 100644 index de6dbc9fb5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ServerBag.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * ServerBag is a container for HTTP headers from the $_SERVER variable. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - * @author Robert Kiss - */ -class ServerBag extends ParameterBag -{ - /** - * Gets the HTTP headers. - * - * @return array - */ - public function getHeaders() - { - $headers = array(); - $contentHeaders = array('CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true); - foreach ($this->parameters as $key => $value) { - if (0 === strpos($key, 'HTTP_')) { - $headers[substr($key, 5)] = $value; - } - // CONTENT_* are not prefixed with HTTP_ - elseif (isset($contentHeaders[$key])) { - $headers[$key] = $value; - } - } - - if (isset($this->parameters['PHP_AUTH_USER'])) { - $headers['PHP_AUTH_USER'] = $this->parameters['PHP_AUTH_USER']; - $headers['PHP_AUTH_PW'] = isset($this->parameters['PHP_AUTH_PW']) ? $this->parameters['PHP_AUTH_PW'] : ''; - } else { - /* - * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default - * For this workaround to work, add these lines to your .htaccess file: - * RewriteCond %{HTTP:Authorization} ^(.+)$ - * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - * - * A sample .htaccess file: - * RewriteEngine On - * RewriteCond %{HTTP:Authorization} ^(.+)$ - * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - * RewriteCond %{REQUEST_FILENAME} !-f - * RewriteRule ^(.*)$ app.php [QSA,L] - */ - - $authorizationHeader = null; - if (isset($this->parameters['HTTP_AUTHORIZATION'])) { - $authorizationHeader = $this->parameters['HTTP_AUTHORIZATION']; - } elseif (isset($this->parameters['REDIRECT_HTTP_AUTHORIZATION'])) { - $authorizationHeader = $this->parameters['REDIRECT_HTTP_AUTHORIZATION']; - } - - if (null !== $authorizationHeader) { - if (0 === stripos($authorizationHeader, 'basic')) { - // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic - $exploded = explode(':', base64_decode(substr($authorizationHeader, 6))); - if (count($exploded) == 2) { - list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded; - } - } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest'))) { - // In some circumstances PHP_AUTH_DIGEST needs to be set - $headers['PHP_AUTH_DIGEST'] = $authorizationHeader; - $this->parameters['PHP_AUTH_DIGEST'] = $authorizationHeader; - } - } - } - - // PHP_AUTH_USER/PHP_AUTH_PW - if (isset($headers['PHP_AUTH_USER'])) { - $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']); - } elseif (isset($headers['PHP_AUTH_DIGEST'])) { - $headers['AUTHORIZATION'] = $headers['PHP_AUTH_DIGEST']; - } - - return $headers; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php deleted file mode 100644 index af416d6d3a..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBag.php +++ /dev/null @@ -1,157 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -/** - * This class relates to session attribute storage - */ -class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable -{ - private $name = 'attributes'; - - /** - * @var string - */ - private $storageKey; - - /** - * @var array - */ - protected $attributes = array(); - - /** - * Constructor. - * - * @param string $storageKey The key used to store attributes in the session - */ - public function __construct($storageKey = '_sf2_attributes') - { - $this->storageKey = $storageKey; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$attributes) - { - $this->attributes = &$attributes; - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - return array_key_exists($name, $this->attributes); - } - - /** - * {@inheritdoc} - */ - public function get($name, $default = null) - { - return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default; - } - - /** - * {@inheritdoc} - */ - public function set($name, $value) - { - $this->attributes[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function all() - { - return $this->attributes; - } - - /** - * {@inheritdoc} - */ - public function replace(array $attributes) - { - $this->attributes = array(); - foreach ($attributes as $key => $value) { - $this->set($key, $value); - } - } - - /** - * {@inheritdoc} - */ - public function remove($name) - { - $retval = null; - if (array_key_exists($name, $this->attributes)) { - $retval = $this->attributes[$name]; - unset($this->attributes[$name]); - } - - return $retval; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - $return = $this->attributes; - $this->attributes = array(); - - return $return; - } - - /** - * Returns an iterator for attributes. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->attributes); - } - - /** - * Returns the number of attributes. - * - * @return integer The number of attributes - */ - public function count() - { - return count($this->attributes); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php deleted file mode 100644 index 6356056edd..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/AttributeBagInterface.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * Attributes store. - * - * @author Drak - */ -interface AttributeBagInterface extends SessionBagInterface -{ - /** - * Checks if an attribute is defined. - * - * @param string $name The attribute name - * - * @return Boolean true if the attribute is defined, false otherwise - */ - public function has($name); - - /** - * Returns an attribute. - * - * @param string $name The attribute name - * @param mixed $default The default value if not found - * - * @return mixed - */ - public function get($name, $default = null); - - /** - * Sets an attribute. - * - * @param string $name - * @param mixed $value - */ - public function set($name, $value); - - /** - * Returns attributes. - * - * @return array Attributes - */ - public function all(); - - /** - * Sets attributes. - * - * @param array $attributes Attributes - */ - public function replace(array $attributes); - - /** - * Removes an attribute. - * - * @param string $name - * - * @return mixed The removed value or null when it does not exist - */ - public function remove($name); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php deleted file mode 100644 index 7cafb2241c..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Attribute/NamespacedAttributeBag.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Attribute; - -/** - * This class provides structured storage of session attributes using - * a name spacing character in the key. - * - * @author Drak - */ -class NamespacedAttributeBag extends AttributeBag -{ - /** - * Namespace character. - * - * @var string - */ - private $namespaceCharacter; - - /** - * Constructor. - * - * @param string $storageKey Session storage key. - * @param string $namespaceCharacter Namespace character to use in keys. - */ - public function __construct($storageKey = '_sf2_attributes', $namespaceCharacter = '/') - { - $this->namespaceCharacter = $namespaceCharacter; - parent::__construct($storageKey); - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - $attributes = $this->resolveAttributePath($name); - $name = $this->resolveKey($name); - - if (null === $attributes) { - return false; - } - - return array_key_exists($name, $attributes); - } - - /** - * {@inheritdoc} - */ - public function get($name, $default = null) - { - $attributes = $this->resolveAttributePath($name); - $name = $this->resolveKey($name); - - if (null === $attributes) { - return $default; - } - - return array_key_exists($name, $attributes) ? $attributes[$name] : $default; - } - - /** - * {@inheritdoc} - */ - public function set($name, $value) - { - $attributes = & $this->resolveAttributePath($name, true); - $name = $this->resolveKey($name); - $attributes[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function remove($name) - { - $retval = null; - $attributes = & $this->resolveAttributePath($name); - $name = $this->resolveKey($name); - if (null !== $attributes && array_key_exists($name, $attributes)) { - $retval = $attributes[$name]; - unset($attributes[$name]); - } - - return $retval; - } - - /** - * Resolves a path in attributes property and returns it as a reference. - * - * This method allows structured namespacing of session attributes. - * - * @param string $name Key name - * @param boolean $writeContext Write context, default false - * - * @return array - */ - protected function &resolveAttributePath($name, $writeContext = false) - { - $array = & $this->attributes; - $name = (strpos($name, $this->namespaceCharacter) === 0) ? substr($name, 1) : $name; - - // Check if there is anything to do, else return - if (!$name) { - return $array; - } - - $parts = explode($this->namespaceCharacter, $name); - if (count($parts) < 2) { - if (!$writeContext) { - return $array; - } - - $array[$parts[0]] = array(); - - return $array; - } - - unset($parts[count($parts)-1]); - - foreach ($parts as $part) { - if (null !== $array && !array_key_exists($part, $array)) { - $array[$part] = $writeContext ? array() : null; - } - - $array = & $array[$part]; - } - - return $array; - } - - /** - * Resolves the key from the name. - * - * This is the last part in a dot separated string. - * - * @param string $name - * - * @return string - */ - protected function resolveKey($name) - { - if (false !== $pos = strrpos($name, $this->namespaceCharacter)) { - $name = substr($name, $pos+1); - } - - return $name; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php deleted file mode 100644 index 25a62604d2..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php +++ /dev/null @@ -1,175 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -/** - * AutoExpireFlashBag flash message container. - * - * @author Drak - */ -class AutoExpireFlashBag implements FlashBagInterface -{ - private $name = 'flashes'; - - /** - * Flash messages. - * - * @var array - */ - private $flashes = array('display' => array(), 'new' => array()); - - /** - * The storage key for flashes in the session - * - * @var string - */ - private $storageKey; - - /** - * Constructor. - * - * @param string $storageKey The key used to store flashes in the session. - */ - public function __construct($storageKey = '_sf2_flashes') - { - $this->storageKey = $storageKey; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$flashes) - { - $this->flashes = &$flashes; - - // The logic: messages from the last request will be stored in new, so we move them to previous - // This request we will show what is in 'display'. What is placed into 'new' this time round will - // be moved to display next time round. - $this->flashes['display'] = array_key_exists('new', $this->flashes) ? $this->flashes['new'] : array(); - $this->flashes['new'] = array(); - } - - /** - * {@inheritdoc} - */ - public function add($type, $message) - { - $this->flashes['new'][$type][] = $message; - } - - /** - * {@inheritdoc} - */ - public function peek($type, array $default = array()) - { - return $this->has($type) ? $this->flashes['display'][$type] : $default; - } - - /** - * {@inheritdoc} - */ - public function peekAll() - { - return array_key_exists('display', $this->flashes) ? (array) $this->flashes['display'] : array(); - } - - /** - * {@inheritdoc} - */ - public function get($type, array $default = array()) - { - $return = $default; - - if (!$this->has($type)) { - return $return; - } - - if (isset($this->flashes['display'][$type])) { - $return = $this->flashes['display'][$type]; - unset($this->flashes['display'][$type]); - } - - return $return; - } - - /** - * {@inheritdoc} - */ - public function all() - { - $return = $this->flashes['display']; - $this->flashes = array('new' => array(), 'display' => array()); - - return $return; - } - - /** - * {@inheritdoc} - */ - public function setAll(array $messages) - { - $this->flashes['new'] = $messages; - } - - /** - * {@inheritdoc} - */ - public function set($type, $messages) - { - $this->flashes['new'][$type] = (array) $messages; - } - - /** - * {@inheritdoc} - */ - public function has($type) - { - return array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type]; - } - - /** - * {@inheritdoc} - */ - public function keys() - { - return array_keys($this->flashes['display']); - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - return $this->all(); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php deleted file mode 100644 index 2bd7786d7a..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php +++ /dev/null @@ -1,180 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -/** - * FlashBag flash message container. - * - * \IteratorAggregate implementation is deprecated and will be removed in 3.0. - * - * @author Drak - */ -class FlashBag implements FlashBagInterface, \IteratorAggregate -{ - private $name = 'flashes'; - - /** - * Flash messages. - * - * @var array - */ - private $flashes = array(); - - /** - * The storage key for flashes in the session - * - * @var string - */ - private $storageKey; - - /** - * Constructor. - * - * @param string $storageKey The key used to store flashes in the session. - */ - public function __construct($storageKey = '_sf2_flashes') - { - $this->storageKey = $storageKey; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$flashes) - { - $this->flashes = &$flashes; - } - - /** - * {@inheritdoc} - */ - public function add($type, $message) - { - $this->flashes[$type][] = $message; - } - - /** - * {@inheritdoc} - */ - public function peek($type, array $default = array()) - { - return $this->has($type) ? $this->flashes[$type] : $default; - } - - /** - * {@inheritdoc} - */ - public function peekAll() - { - return $this->flashes; - } - - /** - * {@inheritdoc} - */ - public function get($type, array $default = array()) - { - if (!$this->has($type)) { - return $default; - } - - $return = $this->flashes[$type]; - - unset($this->flashes[$type]); - - return $return; - } - - /** - * {@inheritdoc} - */ - public function all() - { - $return = $this->peekAll(); - $this->flashes = array(); - - return $return; - } - - /** - * {@inheritdoc} - */ - public function set($type, $messages) - { - $this->flashes[$type] = (array) $messages; - } - - /** - * {@inheritdoc} - */ - public function setAll(array $messages) - { - $this->flashes = $messages; - } - - /** - * {@inheritdoc} - */ - public function has($type) - { - return array_key_exists($type, $this->flashes) && $this->flashes[$type]; - } - - /** - * {@inheritdoc} - */ - public function keys() - { - return array_keys($this->flashes); - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - return $this->all(); - } - - /** - * Returns an iterator for flashes. - * - * @deprecated Will be removed in 3.0. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->all()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php deleted file mode 100644 index a68dcfddda..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php +++ /dev/null @@ -1,93 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Flash; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * FlashBagInterface. - * - * @author Drak - */ -interface FlashBagInterface extends SessionBagInterface -{ - /** - * Adds a flash message for type. - * - * @param string $type - * @param string $message - */ - public function add($type, $message); - - /** - * Registers a message for a given type. - * - * @param string $type - * @param string|array $message - */ - public function set($type, $message); - - /** - * Gets flash messages for a given type. - * - * @param string $type Message category type. - * @param array $default Default value if $type does not exist. - * - * @return array - */ - public function peek($type, array $default = array()); - - /** - * Gets all flash messages. - * - * @return array - */ - public function peekAll(); - - /** - * Gets and clears flash from the stack. - * - * @param string $type - * @param array $default Default value if $type does not exist. - * - * @return array - */ - public function get($type, array $default = array()); - - /** - * Gets and clears flashes from the stack. - * - * @return array - */ - public function all(); - - /** - * Sets all flash messages. - */ - public function setAll(array $messages); - - /** - * Has flash messages for a given type? - * - * @param string $type - * - * @return boolean - */ - public function has($type); - - /** - * Returns a list of all defined types. - * - * @return array - */ - public function keys(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php deleted file mode 100644 index ac626fd589..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Session.php +++ /dev/null @@ -1,251 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; - -/** - * Session. - * - * @author Fabien Potencier - * @author Drak - * - * @api - */ -class Session implements SessionInterface, \IteratorAggregate, \Countable -{ - /** - * Storage driver. - * - * @var SessionStorageInterface - */ - protected $storage; - - /** - * @var string - */ - private $flashName; - - /** - * @var string - */ - private $attributeName; - - /** - * Constructor. - * - * @param SessionStorageInterface $storage A SessionStorageInterface instance. - * @param AttributeBagInterface $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag) - * @param FlashBagInterface $flashes A FlashBagInterface instance (defaults null for default FlashBag) - */ - public function __construct(SessionStorageInterface $storage = null, AttributeBagInterface $attributes = null, FlashBagInterface $flashes = null) - { - $this->storage = $storage ?: new NativeSessionStorage(); - - $attributes = $attributes ?: new AttributeBag(); - $this->attributeName = $attributes->getName(); - $this->registerBag($attributes); - - $flashes = $flashes ?: new FlashBag(); - $this->flashName = $flashes->getName(); - $this->registerBag($flashes); - } - - /** - * {@inheritdoc} - */ - public function start() - { - return $this->storage->start(); - } - - /** - * {@inheritdoc} - */ - public function has($name) - { - return $this->storage->getBag($this->attributeName)->has($name); - } - - /** - * {@inheritdoc} - */ - public function get($name, $default = null) - { - return $this->storage->getBag($this->attributeName)->get($name, $default); - } - - /** - * {@inheritdoc} - */ - public function set($name, $value) - { - $this->storage->getBag($this->attributeName)->set($name, $value); - } - - /** - * {@inheritdoc} - */ - public function all() - { - return $this->storage->getBag($this->attributeName)->all(); - } - - /** - * {@inheritdoc} - */ - public function replace(array $attributes) - { - $this->storage->getBag($this->attributeName)->replace($attributes); - } - - /** - * {@inheritdoc} - */ - public function remove($name) - { - return $this->storage->getBag($this->attributeName)->remove($name); - } - - /** - * {@inheritdoc} - */ - public function clear() - { - $this->storage->getBag($this->attributeName)->clear(); - } - - /** - * {@inheritdoc} - */ - public function isStarted() - { - return $this->storage->isStarted(); - } - - /** - * Returns an iterator for attributes. - * - * @return \ArrayIterator An \ArrayIterator instance - */ - public function getIterator() - { - return new \ArrayIterator($this->storage->getBag($this->attributeName)->all()); - } - - /** - * Returns the number of attributes. - * - * @return int The number of attributes - */ - public function count() - { - return count($this->storage->getBag($this->attributeName)->all()); - } - - /** - * {@inheritdoc} - */ - public function invalidate($lifetime = null) - { - $this->storage->clear(); - - return $this->migrate(true, $lifetime); - } - - /** - * {@inheritdoc} - */ - public function migrate($destroy = false, $lifetime = null) - { - return $this->storage->regenerate($destroy, $lifetime); - } - - /** - * {@inheritdoc} - */ - public function save() - { - $this->storage->save(); - } - - /** - * {@inheritdoc} - */ - public function getId() - { - return $this->storage->getId(); - } - - /** - * {@inheritdoc} - */ - public function setId($id) - { - $this->storage->setId($id); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->storage->getName(); - } - - /** - * {@inheritdoc} - */ - public function setName($name) - { - $this->storage->setName($name); - } - - /** - * {@inheritdoc} - */ - public function getMetadataBag() - { - return $this->storage->getMetadataBag(); - } - - /** - * {@inheritdoc} - */ - public function registerBag(SessionBagInterface $bag) - { - $this->storage->registerBag($bag); - } - - /** - * {@inheritdoc} - */ - public function getBag($name) - { - return $this->storage->getBag($name); - } - - /** - * Gets the flashbag interface. - * - * @return FlashBagInterface - */ - public function getFlashBag() - { - return $this->getBag($this->flashName); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php deleted file mode 100644 index f8d3d32712..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionBagInterface.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -/** - * Session Bag store. - * - * @author Drak - */ -interface SessionBagInterface -{ - /** - * Gets this bag's name - * - * @return string - */ - public function getName(); - - /** - * Initializes the Bag - * - * @param array $array - */ - public function initialize(array &$array); - - /** - * Gets the storage key for this bag. - * - * @return string - */ - public function getStorageKey(); - - /** - * Clears out data from bag. - * - * @return mixed Whatever data was contained. - */ - public function clear(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php deleted file mode 100644 index dc2f7bc4f3..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/SessionInterface.php +++ /dev/null @@ -1,208 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session; - -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; - -/** - * Interface for the session. - * - * @author Drak - */ -interface SessionInterface -{ - /** - * Starts the session storage. - * - * @return Boolean True if session started. - * - * @throws \RuntimeException If session fails to start. - * - * @api - */ - public function start(); - - /** - * Returns the session ID. - * - * @return string The session ID. - * - * @api - */ - public function getId(); - - /** - * Sets the session ID - * - * @param string $id - * - * @api - */ - public function setId($id); - - /** - * Returns the session name. - * - * @return mixed The session name. - * - * @api - */ - public function getName(); - - /** - * Sets the session name. - * - * @param string $name - * - * @api - */ - public function setName($name); - - /** - * Invalidates the current session. - * - * Clears all session attributes and flashes and regenerates the - * session and deletes the old session from persistence. - * - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - * - * @return Boolean True if session invalidated, false if error. - * - * @api - */ - public function invalidate($lifetime = null); - - /** - * Migrates the current session to a new session id while maintaining all - * session attributes. - * - * @param Boolean $destroy Whether to delete the old session or leave it to garbage collection. - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - * - * @return Boolean True if session migrated, false if error. - * - * @api - */ - public function migrate($destroy = false, $lifetime = null); - - /** - * Force the session to be saved and closed. - * - * This method is generally not required for real sessions as - * the session will be automatically saved at the end of - * code execution. - */ - public function save(); - - /** - * Checks if an attribute is defined. - * - * @param string $name The attribute name - * - * @return Boolean true if the attribute is defined, false otherwise - * - * @api - */ - public function has($name); - - /** - * Returns an attribute. - * - * @param string $name The attribute name - * @param mixed $default The default value if not found. - * - * @return mixed - * - * @api - */ - public function get($name, $default = null); - - /** - * Sets an attribute. - * - * @param string $name - * @param mixed $value - * - * @api - */ - public function set($name, $value); - - /** - * Returns attributes. - * - * @return array Attributes - * - * @api - */ - public function all(); - - /** - * Sets attributes. - * - * @param array $attributes Attributes - */ - public function replace(array $attributes); - - /** - * Removes an attribute. - * - * @param string $name - * - * @return mixed The removed value or null when it does not exist - * - * @api - */ - public function remove($name); - - /** - * Clears all attributes. - * - * @api - */ - public function clear(); - - /** - * Checks if the session was started. - * - * @return Boolean - */ - public function isStarted(); - - /** - * Registers a SessionBagInterface with the session. - * - * @param SessionBagInterface $bag - */ - public function registerBag(SessionBagInterface $bag); - - /** - * Gets a bag instance by name. - * - * @param string $name - * - * @return SessionBagInterface - */ - public function getBag($name); - - /** - * Gets session meta. - * - * @return MetadataBag - */ - public function getMetadataBag(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php deleted file mode 100644 index b2384505ae..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcacheSessionHandler.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * MemcacheSessionHandler. - * - * @author Drak - */ -class MemcacheSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \Memcache Memcache driver. - */ - private $memcache; - - /** - * @var integer Time to live in seconds - */ - private $ttl; - - /** - * @var string Key prefix for shared environments. - */ - private $prefix; - - /** - * Constructor. - * - * List of available options: - * * prefix: The prefix to use for the memcache keys in order to avoid collision - * * expiretime: The time to live in seconds - * - * @param \Memcache $memcache A \Memcache instance - * @param array $options An associative array of Memcache options - * - * @throws \InvalidArgumentException When unsupported options are passed - */ - public function __construct(\Memcache $memcache, array $options = array()) - { - if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) { - throw new \InvalidArgumentException(sprintf( - 'The following options are not supported "%s"', implode(', ', $diff) - )); - } - - $this->memcache = $memcache; - $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400; - $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s'; - } - - /** - * {@inheritDoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return $this->memcache->close(); - } - - /** - * {@inheritDoc} - */ - public function read($sessionId) - { - return $this->memcache->get($this->prefix.$sessionId) ?: ''; - } - - /** - * {@inheritDoc} - */ - public function write($sessionId, $data) - { - return $this->memcache->set($this->prefix.$sessionId, $data, 0, time() + $this->ttl); - } - - /** - * {@inheritDoc} - */ - public function destroy($sessionId) - { - return $this->memcache->delete($this->prefix.$sessionId); - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - // not required here because memcache will auto expire the records anyhow. - return true; - } - - /** - * Return a Memcache instance - * - * @return \Memcache - */ - protected function getMemcache() - { - return $this->memcache; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php deleted file mode 100644 index ed7d6edf4b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MemcachedSessionHandler.php +++ /dev/null @@ -1,125 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * MemcachedSessionHandler. - * - * Memcached based session storage handler based on the Memcached class - * provided by the PHP memcached extension. - * - * @see http://php.net/memcached - * - * @author Drak - */ -class MemcachedSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \Memcached Memcached driver. - */ - private $memcached; - - /** - * @var integer Time to live in seconds - */ - private $ttl; - - /** - * @var string Key prefix for shared environments. - */ - private $prefix; - - /** - * Constructor. - * - * List of available options: - * * prefix: The prefix to use for the memcached keys in order to avoid collision - * * expiretime: The time to live in seconds - * - * @param \Memcached $memcached A \Memcached instance - * @param array $options An associative array of Memcached options - * - * @throws \InvalidArgumentException When unsupported options are passed - */ - public function __construct(\Memcached $memcached, array $options = array()) - { - $this->memcached = $memcached; - - if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) { - throw new \InvalidArgumentException(sprintf( - 'The following options are not supported "%s"', implode(', ', $diff) - )); - } - - $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400; - $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s'; - } - - /** - * {@inheritDoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function read($sessionId) - { - return $this->memcached->get($this->prefix.$sessionId) ?: ''; - } - - /** - * {@inheritDoc} - */ - public function write($sessionId, $data) - { - return $this->memcached->set($this->prefix.$sessionId, $data, time() + $this->ttl); - } - - /** - * {@inheritDoc} - */ - public function destroy($sessionId) - { - return $this->memcached->delete($this->prefix.$sessionId); - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - // not required here because memcached will auto expire the records anyhow. - return true; - } - - /** - * Return a Memcached instance - * - * @return \Memcached - */ - protected function getMemcached() - { - return $this->memcached; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php deleted file mode 100644 index 4d819fe3f8..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/MongoDbSessionHandler.php +++ /dev/null @@ -1,173 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * MongoDB session handler - * - * @author Markus Bachmann - */ -class MongoDbSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \Mongo - */ - private $mongo; - - /** - * @var \MongoCollection - */ - private $collection; - - /** - * @var array - */ - private $options; - - /** - * Constructor. - * - * List of available options: - * * database: The name of the database [required] - * * collection: The name of the collection [required] - * * id_field: The field name for storing the session id [default: _id] - * * data_field: The field name for storing the session data [default: data] - * * time_field: The field name for storing the timestamp [default: time] - * - * @param \Mongo|\MongoClient $mongo A MongoClient or Mongo instance - * @param array $options An associative array of field options - * - * @throws \InvalidArgumentException When MongoClient or Mongo instance not provided - * @throws \InvalidArgumentException When "database" or "collection" not provided - */ - public function __construct($mongo, array $options) - { - if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo)) { - throw new \InvalidArgumentException('MongoClient or Mongo instance required'); - } - - if (!isset($options['database']) || !isset($options['collection'])) { - throw new \InvalidArgumentException('You must provide the "database" and "collection" option for MongoDBSessionHandler'); - } - - $this->mongo = $mongo; - - $this->options = array_merge(array( - 'id_field' => '_id', - 'data_field' => 'data', - 'time_field' => 'time', - ), $options); - } - - /** - * {@inheritDoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function destroy($sessionId) - { - $this->getCollection()->remove(array( - $this->options['id_field'] => $sessionId - )); - - return true; - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - /* Note: MongoDB 2.2+ supports TTL collections, which may be used in - * place of this method by indexing the "time_field" field with an - * "expireAfterSeconds" option. Regardless of whether TTL collections - * are used, consider indexing this field to make the remove query more - * efficient. - * - * See: http://docs.mongodb.org/manual/tutorial/expire-data/ - */ - $time = new \MongoDate(time() - $lifetime); - - $this->getCollection()->remove(array( - $this->options['time_field'] => array('$lt' => $time), - )); - - return true; - } - - /** - * {@inheritDoc] - */ - public function write($sessionId, $data) - { - $this->getCollection()->update( - array($this->options['id_field'] => $sessionId), - array('$set' => array( - $this->options['data_field'] => new \MongoBinData($data, \MongoBinData::BYTE_ARRAY), - $this->options['time_field'] => new \MongoDate(), - )), - array('upsert' => true, 'multiple' => false) - ); - - return true; - } - - /** - * {@inheritDoc} - */ - public function read($sessionId) - { - $dbData = $this->getCollection()->findOne(array( - $this->options['id_field'] => $sessionId, - )); - - return null === $dbData ? '' : $dbData[$this->options['data_field']]->bin; - } - - /** - * Return a "MongoCollection" instance - * - * @return \MongoCollection - */ - private function getCollection() - { - if (null === $this->collection) { - $this->collection = $this->mongo->selectCollection($this->options['database'], $this->options['collection']); - } - - return $this->collection; - } - - /** - * Return a Mongo instance - * - * @return \Mongo - */ - protected function getMongo() - { - return $this->mongo; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php deleted file mode 100644 index f39235cbfb..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeFileSessionHandler.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * NativeFileSessionHandler. - * - * Native session handler using PHP's built in file storage. - * - * @author Drak - */ -class NativeFileSessionHandler extends NativeSessionHandler -{ - /** - * Constructor. - * - * @param string $savePath Path of directory to save session files. - * Default null will leave setting as defined by PHP. - * '/path', 'N;/path', or 'N;octal-mode;/path - * - * @see http://php.net/session.configuration.php#ini.session.save-path for further details. - * - * @throws \InvalidArgumentException On invalid $savePath - */ - public function __construct($savePath = null) - { - if (null === $savePath) { - $savePath = ini_get('session.save_path'); - } - - $baseDir = $savePath; - - if ($count = substr_count($savePath, ';')) { - if ($count > 2) { - throw new \InvalidArgumentException(sprintf('Invalid argument $savePath \'%s\'', $savePath)); - } - - // characters after last ';' are the path - $baseDir = ltrim(strrchr($savePath, ';'), ';'); - } - - if ($baseDir && !is_dir($baseDir)) { - mkdir($baseDir, 0777, true); - } - - ini_set('session.save_path', $savePath); - ini_set('session.save_handler', 'files'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php deleted file mode 100644 index 1260ad0d29..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NativeSessionHandler.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Adds SessionHandler functionality if available. - * - * @see http://php.net/sessionhandler - */ - -if (version_compare(phpversion(), '5.4.0', '>=')) { - class NativeSessionHandler extends \SessionHandler {} -} else { - class NativeSessionHandler {} -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php deleted file mode 100644 index 62068aff1b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/NullSessionHandler.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * NullSessionHandler. - * - * Can be used in unit testing or in a situations where persisted sessions are not desired. - * - * @author Drak - * - * @api - */ -class NullSessionHandler implements \SessionHandlerInterface -{ - /** - * {@inheritdoc} - */ - public function open($savePath, $sessionName) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritdoc} - */ - public function read($sessionId) - { - return ''; - } - - /** - * {@inheritdoc} - */ - public function write($sessionId, $data) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function destroy($sessionId) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function gc($lifetime) - { - return true; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php deleted file mode 100644 index baf8eea8f6..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php +++ /dev/null @@ -1,253 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * PdoSessionHandler. - * - * @author Fabien Potencier - * @author Michael Williams - */ -class PdoSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \PDO PDO instance. - */ - private $pdo; - - /** - * @var array Database options. - */ - private $dbOptions; - - /** - * Constructor. - * - * List of available options: - * * db_table: The name of the table [required] - * * db_id_col: The column where to store the session id [default: sess_id] - * * db_data_col: The column where to store the session data [default: sess_data] - * * db_time_col: The column where to store the timestamp [default: sess_time] - * - * @param \PDO $pdo A \PDO instance - * @param array $dbOptions An associative array of DB options - * - * @throws \InvalidArgumentException When "db_table" option is not provided - */ - public function __construct(\PDO $pdo, array $dbOptions = array()) - { - if (!array_key_exists('db_table', $dbOptions)) { - throw new \InvalidArgumentException('You must provide the "db_table" option for a PdoSessionStorage.'); - } - if (\PDO::ERRMODE_EXCEPTION !== $pdo->getAttribute(\PDO::ATTR_ERRMODE)) { - throw new \InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION))', __CLASS__)); - } - $this->pdo = $pdo; - $this->dbOptions = array_merge(array( - 'db_id_col' => 'sess_id', - 'db_data_col' => 'sess_data', - 'db_time_col' => 'sess_time', - ), $dbOptions); - } - - /** - * {@inheritDoc} - */ - public function open($path, $name) - { - return true; - } - - /** - * {@inheritDoc} - */ - public function close() - { - return true; - } - - /** - * {@inheritDoc} - */ - public function destroy($id) - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbIdCol = $this->dbOptions['db_id_col']; - - // delete the record associated with this id - $sql = "DELETE FROM $dbTable WHERE $dbIdCol = :id"; - - try { - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->execute(); - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); - } - - return true; - } - - /** - * {@inheritDoc} - */ - public function gc($lifetime) - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - // delete the session records that have expired - $sql = "DELETE FROM $dbTable WHERE $dbTimeCol < :time"; - - try { - $stmt = $this->pdo->prepare($sql); - $stmt->bindValue(':time', time() - $lifetime, \PDO::PARAM_INT); - $stmt->execute(); - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to manipulate session data: %s', $e->getMessage()), 0, $e); - } - - return true; - } - - /** - * {@inheritDoc} - */ - public function read($id) - { - // get table/columns - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - - try { - $sql = "SELECT $dbDataCol FROM $dbTable WHERE $dbIdCol = :id"; - - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - - $stmt->execute(); - // it is recommended to use fetchAll so that PDO can close the DB cursor - // we anyway expect either no rows, or one row with one column. fetchColumn, seems to be buggy #4777 - $sessionRows = $stmt->fetchAll(\PDO::FETCH_NUM); - - if (count($sessionRows) == 1) { - return base64_decode($sessionRows[0][0]); - } - - // session does not exist, create it - $this->createNewSession($id); - - return ''; - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to read the session data: %s', $e->getMessage()), 0, $e); - } - } - - /** - * {@inheritDoc} - */ - public function write($id, $data) - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - //session data can contain non binary safe characters so we need to encode it - $encoded = base64_encode($data); - - try { - $driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME); - - if ('mysql' === $driver) { - // MySQL would report $stmt->rowCount() = 0 on UPDATE when the data is left unchanged - // it could result in calling createNewSession() whereas the session already exists in - // the DB which would fail as the id is unique - $stmt = $this->pdo->prepare( - "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time) " . - "ON DUPLICATE KEY UPDATE $dbDataCol = VALUES($dbDataCol), $dbTimeCol = VALUES($dbTimeCol)" - ); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - } elseif ('oci' === $driver) { - $stmt = $this->pdo->prepare("MERGE INTO $dbTable USING DUAL ON($dbIdCol = :id) ". - "WHEN NOT MATCHED THEN INSERT ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, sysdate) " . - "WHEN MATCHED THEN UPDATE SET $dbDataCol = :data WHERE $dbIdCol = :id"); - - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->execute(); - } else { - $stmt = $this->pdo->prepare("UPDATE $dbTable SET $dbDataCol = :data, $dbTimeCol = :time WHERE $dbIdCol = :id"); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - - if (!$stmt->rowCount()) { - // No session exists in the database to update. This happens when we have called - // session_regenerate_id() - $this->createNewSession($id, $data); - } - } - } catch (\PDOException $e) { - throw new \RuntimeException(sprintf('PDOException was thrown when trying to write the session data: %s', $e->getMessage()), 0, $e); - } - - return true; - } - - /** - * Creates a new session with the given $id and $data - * - * @param string $id - * @param string $data - * - * @return boolean True. - */ - private function createNewSession($id, $data = '') - { - // get table/column - $dbTable = $this->dbOptions['db_table']; - $dbDataCol = $this->dbOptions['db_data_col']; - $dbIdCol = $this->dbOptions['db_id_col']; - $dbTimeCol = $this->dbOptions['db_time_col']; - - $sql = "INSERT INTO $dbTable ($dbIdCol, $dbDataCol, $dbTimeCol) VALUES (:id, :data, :time)"; - - //session data can contain non binary safe characters so we need to encode it - $encoded = base64_encode($data); - $stmt = $this->pdo->prepare($sql); - $stmt->bindParam(':id', $id, \PDO::PARAM_STR); - $stmt->bindParam(':data', $encoded, \PDO::PARAM_STR); - $stmt->bindValue(':time', time(), \PDO::PARAM_INT); - $stmt->execute(); - - return true; - } - - /** - * Return a PDO instance - * - * @return \PDO - */ - protected function getConnection() - { - return $this->pdo; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php deleted file mode 100644 index c43c9d05fe..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Handler/WriteCheckSessionHandler.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; - -/** - * Wraps another SessionHandlerInterface to only write the session when it has been modified. - * - * @author Adrien Brault - */ -class WriteCheckSessionHandler implements \SessionHandlerInterface -{ - /** - * @var \SessionHandlerInterface - */ - private $wrappedSessionHandler; - - /** - * @var array sessionId => session - */ - private $readSessions; - - public function __construct(\SessionHandlerInterface $wrappedSessionHandler) - { - $this->wrappedSessionHandler = $wrappedSessionHandler; - } - - /** - * {@inheritdoc} - */ - public function close() - { - return $this->wrappedSessionHandler->close(); - } - - /** - * {@inheritdoc} - */ - public function destroy($sessionId) - { - return $this->wrappedSessionHandler->destroy($sessionId); - } - - /** - * {@inheritdoc} - */ - public function gc($maxLifetime) - { - return $this->wrappedSessionHandler->gc($maxLifetime); - } - - /** - * {@inheritdoc} - */ - public function open($savePath, $sessionId) - { - return $this->wrappedSessionHandler->open($savePath, $sessionId); - } - - /** - * {@inheritdoc} - */ - public function read($sessionId) - { - $session = $this->wrappedSessionHandler->read($sessionId); - - $this->readSessions[$sessionId] = $session; - - return $session; - } - - /** - * {@inheritdoc} - */ - public function write($sessionId, $sessionData) - { - if (isset($this->readSessions[$sessionId]) && $sessionData === $this->readSessions[$sessionId]) { - return true; - } - - return $this->wrappedSessionHandler->write($sessionId, $sessionData); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php deleted file mode 100644 index 44212979c3..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.php +++ /dev/null @@ -1,170 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * Metadata container. - * - * Adds metadata to the session. - * - * @author Drak - */ -class MetadataBag implements SessionBagInterface -{ - const CREATED = 'c'; - const UPDATED = 'u'; - const LIFETIME = 'l'; - - /** - * @var string - */ - private $name = '__metadata'; - - /** - * @var string - */ - private $storageKey; - - /** - * @var array - */ - protected $meta = array(self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0); - - /** - * Unix timestamp. - * - * @var integer - */ - private $lastUsed; - - /** - * @var integer - */ - private $updateThreshold; - - /** - * Constructor. - * - * @param string $storageKey The key used to store bag in the session. - * @param integer $updateThreshold The time to wait between two UPDATED updates - */ - public function __construct($storageKey = '_sf2_meta', $updateThreshold = 0) - { - $this->storageKey = $storageKey; - $this->updateThreshold = $updateThreshold; - } - - /** - * {@inheritdoc} - */ - public function initialize(array &$array) - { - $this->meta = &$array; - - if (isset($array[self::CREATED])) { - $this->lastUsed = $this->meta[self::UPDATED]; - - $timeStamp = time(); - if ($timeStamp - $array[self::UPDATED] >= $this->updateThreshold) { - $this->meta[self::UPDATED] = $timeStamp; - } - } else { - $this->stampCreated(); - } - } - - /** - * Gets the lifetime that the session cookie was set with. - * - * @return integer - */ - public function getLifetime() - { - return $this->meta[self::LIFETIME]; - } - - /** - * Stamps a new session's metadata. - * - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - */ - public function stampNew($lifetime = null) - { - $this->stampCreated($lifetime); - } - - /** - * {@inheritdoc} - */ - public function getStorageKey() - { - return $this->storageKey; - } - - /** - * Gets the created timestamp metadata. - * - * @return integer Unix timestamp - */ - public function getCreated() - { - return $this->meta[self::CREATED]; - } - - /** - * Gets the last used metadata. - * - * @return integer Unix timestamp - */ - public function getLastUsed() - { - return $this->lastUsed; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - // nothing to do - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - /** - * Sets name. - * - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - private function stampCreated($lifetime = null) - { - $timeStamp = time(); - $this->meta[self::CREATED] = $this->meta[self::UPDATED] = $this->lastUsed = $timeStamp; - $this->meta[self::LIFETIME] = (null === $lifetime) ? ini_get('session.cookie_lifetime') : $lifetime; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php deleted file mode 100644 index 8b1c2137f6..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.php +++ /dev/null @@ -1,268 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * MockArraySessionStorage mocks the session for unit tests. - * - * No PHP session is actually started since a session can be initialized - * and shutdown only once per PHP execution cycle. - * - * When doing functional testing, you should use MockFileSessionStorage instead. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - * @author Drak - */ -class MockArraySessionStorage implements SessionStorageInterface -{ - /** - * @var string - */ - protected $id = ''; - - /** - * @var string - */ - protected $name; - - /** - * @var boolean - */ - protected $started = false; - - /** - * @var boolean - */ - protected $closed = false; - - /** - * @var array - */ - protected $data = array(); - - /** - * @var MetadataBag - */ - protected $metadataBag; - - /** - * @var array - */ - protected $bags; - - /** - * Constructor. - * - * @param string $name Session name - * @param MetadataBag $metaBag MetadataBag instance. - */ - public function __construct($name = 'MOCKSESSID', MetadataBag $metaBag = null) - { - $this->name = $name; - $this->setMetadataBag($metaBag); - } - - /** - * Sets the session data. - * - * @param array $array - */ - public function setSessionData(array $array) - { - $this->data = $array; - } - - /** - * {@inheritdoc} - */ - public function start() - { - if ($this->started && !$this->closed) { - return true; - } - - if (empty($this->id)) { - $this->id = $this->generateId(); - } - - $this->loadSession(); - - return true; - } - - /** - * {@inheritdoc} - */ - public function regenerate($destroy = false, $lifetime = null) - { - if (!$this->started) { - $this->start(); - } - - $this->metadataBag->stampNew($lifetime); - $this->id = $this->generateId(); - - return true; - } - - /** - * {@inheritdoc} - */ - public function getId() - { - return $this->id; - } - - /** - * {@inheritdoc} - */ - public function setId($id) - { - if ($this->started) { - throw new \LogicException('Cannot set session ID after the session has started.'); - } - - $this->id = $id; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->name; - } - - /** - * {@inheritdoc} - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * {@inheritdoc} - */ - public function save() - { - if (!$this->started || $this->closed) { - throw new \RuntimeException("Trying to save a session that was not started yet or was already closed"); - } - // nothing to do since we don't persist the session data - $this->closed = false; - $this->started = false; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - // clear out the bags - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // clear out the session - $this->data = array(); - - // reconnect the bags to the session - $this->loadSession(); - } - - /** - * {@inheritdoc} - */ - public function registerBag(SessionBagInterface $bag) - { - $this->bags[$bag->getName()] = $bag; - } - - /** - * {@inheritdoc} - */ - public function getBag($name) - { - if (!isset($this->bags[$name])) { - throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name)); - } - - if (!$this->started) { - $this->start(); - } - - return $this->bags[$name]; - } - - /** - * {@inheritdoc} - */ - public function isStarted() - { - return $this->started; - } - - /** - * Sets the MetadataBag. - * - * @param MetadataBag $bag - */ - public function setMetadataBag(MetadataBag $bag = null) - { - if (null === $bag) { - $bag = new MetadataBag(); - } - - $this->metadataBag = $bag; - } - - /** - * Gets the MetadataBag. - * - * @return MetadataBag - */ - public function getMetadataBag() - { - return $this->metadataBag; - } - - /** - * Generates a session ID. - * - * This doesn't need to be particularly cryptographically secure since this is just - * a mock. - * - * @return string - */ - protected function generateId() - { - return hash('sha256', uniqid(mt_rand())); - } - - protected function loadSession() - { - $bags = array_merge($this->bags, array($this->metadataBag)); - - foreach ($bags as $bag) { - $key = $bag->getStorageKey(); - $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : array(); - $bag->initialize($this->data[$key]); - } - - $this->started = true; - $this->closed = false; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php deleted file mode 100644 index f1a699b697..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/MockFileSessionStorage.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -/** - * MockFileSessionStorage is used to mock sessions for - * functional testing when done in a single PHP process. - * - * No PHP session is actually started since a session can be initialized - * and shutdown only once per PHP execution cycle and this class does - * not pollute any session related globals, including session_*() functions - * or session.* PHP ini directives. - * - * @author Drak - */ -class MockFileSessionStorage extends MockArraySessionStorage -{ - /** - * @var string - */ - private $savePath; - - /** - * Constructor. - * - * @param string $savePath Path of directory to save session files. - * @param string $name Session name. - * @param MetadataBag $metaBag MetadataBag instance. - */ - public function __construct($savePath = null, $name = 'MOCKSESSID', MetadataBag $metaBag = null) - { - if (null === $savePath) { - $savePath = sys_get_temp_dir(); - } - - if (!is_dir($savePath)) { - mkdir($savePath, 0777, true); - } - - $this->savePath = $savePath; - - parent::__construct($name, $metaBag); - } - - /** - * {@inheritdoc} - */ - public function start() - { - if ($this->started) { - return true; - } - - if (!$this->id) { - $this->id = $this->generateId(); - } - - $this->read(); - - $this->started = true; - - return true; - } - - /** - * {@inheritdoc} - */ - public function regenerate($destroy = false, $lifetime = null) - { - if (!$this->started) { - $this->start(); - } - - if ($destroy) { - $this->destroy(); - } - - return parent::regenerate($destroy, $lifetime); - } - - /** - * {@inheritdoc} - */ - public function save() - { - if (!$this->started) { - throw new \RuntimeException("Trying to save a session that was not started yet or was already closed"); - } - - file_put_contents($this->getFilePath(), serialize($this->data)); - - // this is needed for Silex, where the session object is re-used across requests - // in functional tests. In Symfony, the container is rebooted, so we don't have - // this issue - $this->started = false; - } - - /** - * Deletes a session from persistent storage. - * Deliberately leaves session data in memory intact. - */ - private function destroy() - { - if (is_file($this->getFilePath())) { - unlink($this->getFilePath()); - } - } - - /** - * Calculate path to file. - * - * @return string File path - */ - private function getFilePath() - { - return $this->savePath.'/'.$this->id.'.mocksess'; - } - - /** - * Reads session from storage and loads session. - */ - private function read() - { - $filePath = $this->getFilePath(); - $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : array(); - - $this->loadSession(); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php deleted file mode 100644 index 083df9de40..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php +++ /dev/null @@ -1,433 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; -use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; - -/** - * This provides a base class for session attribute storage. - * - * @author Drak - */ -class NativeSessionStorage implements SessionStorageInterface -{ - /** - * Array of SessionBagInterface - * - * @var SessionBagInterface[] - */ - protected $bags; - - /** - * @var Boolean - */ - protected $started = false; - - /** - * @var Boolean - */ - protected $closed = false; - - /** - * @var AbstractProxy - */ - protected $saveHandler; - - /** - * @var MetadataBag - */ - protected $metadataBag; - - /** - * Constructor. - * - * Depending on how you want the storage driver to behave you probably - * want to override this constructor entirely. - * - * List of options for $options array with their defaults. - * @see http://php.net/session.configuration for options - * but we omit 'session.' from the beginning of the keys for convenience. - * - * ("auto_start", is not supported as it tells PHP to start a session before - * PHP starts to execute user-land code. Setting during runtime has no effect). - * - * cache_limiter, "nocache" (use "0" to prevent headers from being sent entirely). - * cookie_domain, "" - * cookie_httponly, "" - * cookie_lifetime, "0" - * cookie_path, "/" - * cookie_secure, "" - * entropy_file, "" - * entropy_length, "0" - * gc_divisor, "100" - * gc_maxlifetime, "1440" - * gc_probability, "1" - * hash_bits_per_character, "4" - * hash_function, "0" - * name, "PHPSESSID" - * referer_check, "" - * serialize_handler, "php" - * use_cookies, "1" - * use_only_cookies, "1" - * use_trans_sid, "0" - * upload_progress.enabled, "1" - * upload_progress.cleanup, "1" - * upload_progress.prefix, "upload_progress_" - * upload_progress.name, "PHP_SESSION_UPLOAD_PROGRESS" - * upload_progress.freq, "1%" - * upload_progress.min-freq, "1" - * url_rewriter.tags, "a=href,area=href,frame=src,form=,fieldset=" - * - * @param array $options Session configuration options. - * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler - * @param MetadataBag $metaBag MetadataBag. - */ - public function __construct(array $options = array(), $handler = null, MetadataBag $metaBag = null) - { - session_cache_limiter(''); // disable by default because it's managed by HeaderBag (if used) - ini_set('session.use_cookies', 1); - - if (version_compare(phpversion(), '5.4.0', '>=')) { - session_register_shutdown(); - } else { - register_shutdown_function('session_write_close'); - } - - $this->setMetadataBag($metaBag); - $this->setOptions($options); - $this->setSaveHandler($handler); - } - - /** - * Gets the save handler instance. - * - * @return AbstractProxy - */ - public function getSaveHandler() - { - return $this->saveHandler; - } - - /** - * {@inheritdoc} - */ - public function start() - { - if ($this->started && !$this->closed) { - return true; - } - - if (version_compare(phpversion(), '5.4.0', '>=') && \PHP_SESSION_ACTIVE === session_status()) { - throw new \RuntimeException('Failed to start the session: already started by PHP.'); - } - - if (version_compare(phpversion(), '5.4.0', '<') && isset($_SESSION) && session_id()) { - // not 100% fool-proof, but is the most reliable way to determine if a session is active in PHP 5.3 - throw new \RuntimeException('Failed to start the session: already started by PHP ($_SESSION is set).'); - } - - if (ini_get('session.use_cookies') && headers_sent($file, $line)) { - throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line)); - } - - // ok to try and start the session - if (!session_start()) { - throw new \RuntimeException('Failed to start the session'); - } - - $this->loadSession(); - if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) { - // This condition matches only PHP 5.3 with internal save handlers - $this->saveHandler->setActive(true); - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function getId() - { - if (!$this->started && !$this->closed) { - return ''; // returning empty is consistent with session_id() behaviour - } - - return $this->saveHandler->getId(); - } - - /** - * {@inheritdoc} - */ - public function setId($id) - { - $this->saveHandler->setId($id); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return $this->saveHandler->getName(); - } - - /** - * {@inheritdoc} - */ - public function setName($name) - { - $this->saveHandler->setName($name); - } - - /** - * {@inheritdoc} - */ - public function regenerate($destroy = false, $lifetime = null) - { - if (null !== $lifetime) { - ini_set('session.cookie_lifetime', $lifetime); - } - - if ($destroy) { - $this->metadataBag->stampNew(); - } - - $ret = session_regenerate_id($destroy); - - // workaround for https://bugs.php.net/bug.php?id=61470 as suggested by David Grudl - if ('files' === $this->getSaveHandler()->getSaveHandlerName()) { - session_write_close(); - if (isset($_SESSION)) { - $backup = $_SESSION; - session_start(); - $_SESSION = $backup; - } else { - session_start(); - } - - $this->loadSession(); - } - - return $ret; - } - - /** - * {@inheritdoc} - */ - public function save() - { - session_write_close(); - - if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) { - // This condition matches only PHP 5.3 with internal save handlers - $this->saveHandler->setActive(false); - } - - $this->closed = true; - $this->started = false; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - // clear out the bags - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // clear out the session - $_SESSION = array(); - - // reconnect the bags to the session - $this->loadSession(); - } - - /** - * {@inheritdoc} - */ - public function registerBag(SessionBagInterface $bag) - { - $this->bags[$bag->getName()] = $bag; - } - - /** - * {@inheritdoc} - */ - public function getBag($name) - { - if (!isset($this->bags[$name])) { - throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name)); - } - - if ($this->saveHandler->isActive() && !$this->started) { - $this->loadSession(); - } elseif (!$this->started) { - $this->start(); - } - - return $this->bags[$name]; - } - - /** - * Sets the MetadataBag. - * - * @param MetadataBag $metaBag - */ - public function setMetadataBag(MetadataBag $metaBag = null) - { - if (null === $metaBag) { - $metaBag = new MetadataBag(); - } - - $this->metadataBag = $metaBag; - } - - /** - * Gets the MetadataBag. - * - * @return MetadataBag - */ - public function getMetadataBag() - { - return $this->metadataBag; - } - - /** - * {@inheritdoc} - */ - public function isStarted() - { - return $this->started; - } - - /** - * Sets session.* ini variables. - * - * For convenience we omit 'session.' from the beginning of the keys. - * Explicitly ignores other ini keys. - * - * @param array $options Session ini directives array(key => value). - * - * @see http://php.net/session.configuration - */ - public function setOptions(array $options) - { - $validOptions = array_flip(array( - 'cache_limiter', 'cookie_domain', 'cookie_httponly', - 'cookie_lifetime', 'cookie_path', 'cookie_secure', - 'entropy_file', 'entropy_length', 'gc_divisor', - 'gc_maxlifetime', 'gc_probability', 'hash_bits_per_character', - 'hash_function', 'name', 'referer_check', - 'serialize_handler', 'use_cookies', - 'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled', - 'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name', - 'upload_progress.freq', 'upload_progress.min-freq', 'url_rewriter.tags', - )); - - foreach ($options as $key => $value) { - if (isset($validOptions[$key])) { - ini_set('session.'.$key, $value); - } - } - } - - /** - * Registers session save handler as a PHP session handler. - * - * To use internal PHP session save handlers, override this method using ini_set with - * session.save_handler and session.save_path e.g. - * - * ini_set('session.save_handler', 'files'); - * ini_set('session.save_path', /tmp'); - * - * or pass in a NativeSessionHandler instance which configures session.save_handler in the - * constructor, for a template see NativeFileSessionHandler or use handlers in - * composer package drak/native-session - * - * @see http://php.net/session-set-save-handler - * @see http://php.net/sessionhandlerinterface - * @see http://php.net/sessionhandler - * @see http://github.com/drak/NativeSession - * - * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $saveHandler - * - * @throws \InvalidArgumentException - */ - public function setSaveHandler($saveHandler = null) - { - if (!$saveHandler instanceof AbstractProxy && - !$saveHandler instanceof NativeSessionHandler && - !$saveHandler instanceof \SessionHandlerInterface && - null !== $saveHandler) { - throw new \InvalidArgumentException('Must be instance of AbstractProxy or NativeSessionHandler; implement \SessionHandlerInterface; or be null.'); - } - - // Wrap $saveHandler in proxy and prevent double wrapping of proxy - if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) { - $saveHandler = new SessionHandlerProxy($saveHandler); - } elseif (!$saveHandler instanceof AbstractProxy) { - $saveHandler = version_compare(phpversion(), '5.4.0', '>=') ? - new SessionHandlerProxy(new \SessionHandler()) : new NativeProxy(); - } - $this->saveHandler = $saveHandler; - - if ($this->saveHandler instanceof \SessionHandlerInterface) { - if (version_compare(phpversion(), '5.4.0', '>=')) { - session_set_save_handler($this->saveHandler, false); - } else { - session_set_save_handler( - array($this->saveHandler, 'open'), - array($this->saveHandler, 'close'), - array($this->saveHandler, 'read'), - array($this->saveHandler, 'write'), - array($this->saveHandler, 'destroy'), - array($this->saveHandler, 'gc') - ); - } - } - } - - /** - * Load the session with attributes. - * - * After starting the session, PHP retrieves the session from whatever handlers - * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()). - * PHP takes the return value from the read() handler, unserializes it - * and populates $_SESSION with the result automatically. - * - * @param array|null $session - */ - protected function loadSession(array &$session = null) - { - if (null === $session) { - $session = &$_SESSION; - } - - $bags = array_merge($this->bags, array($this->metadataBag)); - - foreach ($bags as $bag) { - $key = $bag->getStorageKey(); - $session[$key] = isset($session[$key]) ? $session[$key] : array(); - $bag->initialize($session[$key]); - } - - $this->started = true; - $this->closed = false; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php deleted file mode 100644 index f70b5e6227..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; -use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler; - -/** - * Allows session to be started by PHP and managed by Symfony2 - * - * @author Drak - */ -class PhpBridgeSessionStorage extends NativeSessionStorage -{ - /** - * Constructor. - * - * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler - * @param MetadataBag $metaBag MetadataBag - */ - public function __construct($handler = null, MetadataBag $metaBag = null) - { - $this->setMetadataBag($metaBag); - $this->setSaveHandler($handler); - } - - /** - * {@inheritdoc} - */ - public function start() - { - if ($this->started && !$this->closed) { - return true; - } - - $this->loadSession(); - if (!$this->saveHandler->isWrapper() && !$this->saveHandler->isSessionHandlerInterface()) { - // This condition matches only PHP 5.3 + internal save handlers - $this->saveHandler->setActive(true); - } - - return true; - } - - /** - * {@inheritdoc} - */ - public function clear() - { - // clear out the bags and nothing else that may be set - // since the purpose of this driver is to share a handler - foreach ($this->bags as $bag) { - $bag->clear(); - } - - // reconnect the bags to the session - $this->loadSession(); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php deleted file mode 100644 index ee6eb89728..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/AbstractProxy.php +++ /dev/null @@ -1,154 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -/** - * AbstractProxy. - * - * @author Drak - */ -abstract class AbstractProxy -{ - /** - * Flag if handler wraps an internal PHP session handler (using \SessionHandler). - * - * @var boolean - */ - protected $wrapper = false; - - /** - * @var boolean - */ - protected $active = false; - - /** - * @var string - */ - protected $saveHandlerName; - - /** - * Gets the session.save_handler name. - * - * @return string - */ - public function getSaveHandlerName() - { - return $this->saveHandlerName; - } - - /** - * Is this proxy handler and instance of \SessionHandlerInterface. - * - * @return boolean - */ - public function isSessionHandlerInterface() - { - return ($this instanceof \SessionHandlerInterface); - } - - /** - * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. - * - * @return Boolean - */ - public function isWrapper() - { - return $this->wrapper; - } - - /** - * Has a session started? - * - * @return Boolean - */ - public function isActive() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - return $this->active = \PHP_SESSION_ACTIVE === session_status(); - } - - return $this->active; - } - - /** - * Sets the active flag. - * - * Has no effect under PHP 5.4+ as status is detected - * automatically in isActive() - * - * @internal - * - * @param Boolean $flag - * - * @throws \LogicException - */ - public function setActive($flag) - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - throw new \LogicException('This method is disabled in PHP 5.4.0+'); - } - - $this->active = (bool) $flag; - } - - /** - * Gets the session ID. - * - * @return string - */ - public function getId() - { - return session_id(); - } - - /** - * Sets the session ID. - * - * @param string $id - * - * @throws \LogicException - */ - public function setId($id) - { - if ($this->isActive()) { - throw new \LogicException('Cannot change the ID of an active session'); - } - - session_id($id); - } - - /** - * Gets the session name. - * - * @return string - */ - public function getName() - { - return session_name(); - } - - /** - * Sets the session name. - * - * @param string $name - * - * @throws \LogicException - */ - public function setName($name) - { - if ($this->isActive()) { - throw new \LogicException('Cannot change the name of an active session'); - } - - session_name($name); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php deleted file mode 100644 index 23eebb3281..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/NativeProxy.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -/** - * NativeProxy. - * - * This proxy is built-in session handlers in PHP 5.3.x - * - * @author Drak - */ -class NativeProxy extends AbstractProxy -{ - /** - * Constructor. - */ - public function __construct() - { - // this makes an educated guess as to what the handler is since it should already be set. - $this->saveHandlerName = ini_get('session.save_handler'); - } - - /** - * Returns true if this handler wraps an internal PHP session save handler using \SessionHandler. - * - * @return Boolean False. - */ - public function isWrapper() - { - return false; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php deleted file mode 100644 index e1f4fff1fa..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; - -/** - * SessionHandler proxy. - * - * @author Drak - */ -class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface -{ - /** - * @var \SessionHandlerInterface - */ - protected $handler; - - /** - * Constructor. - * - * @param \SessionHandlerInterface $handler - */ - public function __construct(\SessionHandlerInterface $handler) - { - $this->handler = $handler; - $this->wrapper = ($handler instanceof \SessionHandler); - $this->saveHandlerName = $this->wrapper ? ini_get('session.save_handler') : 'user'; - } - - // \SessionHandlerInterface - - /** - * {@inheritdoc} - */ - public function open($savePath, $sessionName) - { - $return = (bool) $this->handler->open($savePath, $sessionName); - - if (true === $return) { - $this->active = true; - } - - return $return; - } - - /** - * {@inheritdoc} - */ - public function close() - { - $this->active = false; - - return (bool) $this->handler->close(); - } - - /** - * {@inheritdoc} - */ - public function read($id) - { - return (string) $this->handler->read($id); - } - - /** - * {@inheritdoc} - */ - public function write($id, $data) - { - return (bool) $this->handler->write($id, $data); - } - - /** - * {@inheritdoc} - */ - public function destroy($id) - { - return (bool) $this->handler->destroy($id); - } - - /** - * {@inheritdoc} - */ - public function gc($maxlifetime) - { - return (bool) $this->handler->gc($maxlifetime); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php deleted file mode 100644 index 74f19c5216..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Session/Storage/SessionStorageInterface.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\SessionBagInterface; - -/** - * StorageInterface. - * - * @author Fabien Potencier - * @author Drak - * - * @api - */ -interface SessionStorageInterface -{ - /** - * Starts the session. - * - * @throws \RuntimeException If something goes wrong starting the session. - * - * @return boolean True if started. - * - * @api - */ - public function start(); - - /** - * Checks if the session is started. - * - * @return boolean True if started, false otherwise. - */ - public function isStarted(); - - /** - * Returns the session ID - * - * @return string The session ID or empty. - * - * @api - */ - public function getId(); - - /** - * Sets the session ID - * - * @param string $id - * - * @api - */ - public function setId($id); - - /** - * Returns the session name - * - * @return mixed The session name. - * - * @api - */ - public function getName(); - - /** - * Sets the session name - * - * @param string $name - * - * @api - */ - public function setName($name); - - /** - * Regenerates id that represents this storage. - * - * This method must invoke session_regenerate_id($destroy) unless - * this interface is used for a storage object designed for unit - * or functional testing where a real PHP session would interfere - * with testing. - * - * Note regenerate+destroy should not clear the session data in memory - * only delete the session data from persistent storage. - * - * @param Boolean $destroy Destroy session when regenerating? - * @param integer $lifetime Sets the cookie lifetime for the session cookie. A null value - * will leave the system settings unchanged, 0 sets the cookie - * to expire with browser session. Time is in seconds, and is - * not a Unix timestamp. - * - * @return Boolean True if session regenerated, false if error - * - * @throws \RuntimeException If an error occurs while regenerating this storage - * - * @api - */ - public function regenerate($destroy = false, $lifetime = null); - - /** - * Force the session to be saved and closed. - * - * This method must invoke session_write_close() unless this interface is - * used for a storage object design for unit or functional testing where - * a real PHP session would interfere with testing, in which case it - * it should actually persist the session data if required. - * - * @throws \RuntimeException If the session is saved without being started, or if the session - * is already closed. - */ - public function save(); - - /** - * Clear all session data in memory. - */ - public function clear(); - - /** - * Gets a SessionBagInterface by name. - * - * @param string $name - * - * @return SessionBagInterface - * - * @throws \InvalidArgumentException If the bag does not exist - */ - public function getBag($name); - - /** - * Registers a SessionBagInterface for use. - * - * @param SessionBagInterface $bag - */ - public function registerBag(SessionBagInterface $bag); - - /** - * @return MetadataBag - */ - public function getMetadataBag(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php deleted file mode 100644 index d9fece658f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/StreamedResponse.php +++ /dev/null @@ -1,133 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation; - -/** - * StreamedResponse represents a streamed HTTP response. - * - * A StreamedResponse uses a callback for its content. - * - * The callback should use the standard PHP functions like echo - * to stream the response back to the client. The flush() method - * can also be used if needed. - * - * @see flush() - * - * @author Fabien Potencier - * - * @api - */ -class StreamedResponse extends Response -{ - protected $callback; - protected $streamed; - - /** - * Constructor. - * - * @param callable|null $callback A valid PHP callback or null to set it later - * @param integer $status The response status code - * @param array $headers An array of response headers - * - * @api - */ - public function __construct($callback = null, $status = 200, $headers = array()) - { - parent::__construct(null, $status, $headers); - - if (null !== $callback) { - $this->setCallback($callback); - } - $this->streamed = false; - } - - /** - * Factory method for chainability - * - * @param callable|null $callback A valid PHP callback or null to set it later - * @param integer $status The response status code - * @param array $headers An array of response headers - * - * @return StreamedResponse - */ - public static function create($callback = null, $status = 200, $headers = array()) - { - return new static($callback, $status, $headers); - } - - /** - * Sets the PHP callback associated with this Response. - * - * @param callable $callback A valid PHP callback - * - * @throws \LogicException - */ - public function setCallback($callback) - { - if (!is_callable($callback)) { - throw new \LogicException('The Response callback must be a valid PHP callable.'); - } - $this->callback = $callback; - } - - /** - * {@inheritdoc} - */ - public function prepare(Request $request) - { - $this->headers->set('Cache-Control', 'no-cache'); - - return parent::prepare($request); - } - - /** - * {@inheritdoc} - * - * This method only sends the content once. - */ - public function sendContent() - { - if ($this->streamed) { - return; - } - - $this->streamed = true; - - if (null === $this->callback) { - throw new \LogicException('The Response callback must not be null.'); - } - - call_user_func($this->callback); - } - - /** - * {@inheritdoc} - * - * @throws \LogicException when the content is not null - */ - public function setContent($content) - { - if (null !== $content) { - throw new \LogicException('The content cannot be set on a StreamedResponse instance.'); - } - } - - /** - * {@inheritdoc} - * - * @return false - */ - public function getContent() - { - return false; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php deleted file mode 100644 index 582fbdefe1..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderItemTest.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\AcceptHeaderItem; - -class AcceptHeaderItemTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider provideFromStringData - */ - public function testFromString($string, $value, array $attributes) - { - $item = AcceptHeaderItem::fromString($string); - $this->assertEquals($value, $item->getValue()); - $this->assertEquals($attributes, $item->getAttributes()); - } - - public function provideFromStringData() - { - return array( - array( - 'text/html', - 'text/html', array() - ), - array( - '"this;should,not=matter"', - 'this;should,not=matter', array() - ), - array( - "text/plain; charset=utf-8;param=\"this;should,not=matter\";\tfootnotes=true", - 'text/plain', array('charset' => 'utf-8', 'param' => 'this;should,not=matter', 'footnotes' => 'true') - ), - array( - '"this;should,not=matter";charset=utf-8', - 'this;should,not=matter', array('charset' => 'utf-8') - ), - ); - } - - /** - * @dataProvider provideToStringData - */ - public function testToString($value, array $attributes, $string) - { - $item = new AcceptHeaderItem($value, $attributes); - $this->assertEquals($string, (string) $item); - } - - public function provideToStringData() - { - return array( - array( - 'text/html', array(), - 'text/html' - ), - array( - 'text/plain', array('charset' => 'utf-8', 'param' => 'this;should,not=matter', 'footnotes' => 'true'), - 'text/plain;charset=utf-8;param="this;should,not=matter";footnotes=true' - ), - ); - } - - public function testValue() - { - $item = new AcceptHeaderItem('value', array()); - $this->assertEquals('value', $item->getValue()); - - $item->setValue('new value'); - $this->assertEquals('new value', $item->getValue()); - - $item->setValue(1); - $this->assertEquals('1', $item->getValue()); - } - - public function testQuality() - { - $item = new AcceptHeaderItem('value', array()); - $this->assertEquals(1.0, $item->getQuality()); - - $item->setQuality(0.5); - $this->assertEquals(0.5, $item->getQuality()); - - $item->setAttribute('q', 0.75); - $this->assertEquals(0.75, $item->getQuality()); - $this->assertFalse($item->hasAttribute('q')); - } - - public function testAttribute() - { - $item = new AcceptHeaderItem('value', array()); - $this->assertEquals(array(), $item->getAttributes()); - $this->assertFalse($item->hasAttribute('test')); - $this->assertNull($item->getAttribute('test')); - $this->assertEquals('default', $item->getAttribute('test', 'default')); - - $item->setAttribute('test', 'value'); - $this->assertEquals(array('test' => 'value'), $item->getAttributes()); - $this->assertTrue($item->hasAttribute('test')); - $this->assertEquals('value', $item->getAttribute('test')); - $this->assertEquals('value', $item->getAttribute('test', 'default')); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php deleted file mode 100644 index 9b3b58e214..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/AcceptHeaderTest.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\AcceptHeader; -use Symfony\Component\HttpFoundation\AcceptHeaderItem; - -class AcceptHeaderTest extends \PHPUnit_Framework_TestCase -{ - public function testFirst() - { - $header = AcceptHeader::fromString('text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c'); - $this->assertSame('text/html', $header->first()->getValue()); - } - - /** - * @dataProvider provideFromStringData - */ - public function testFromString($string, array $items) - { - $header = AcceptHeader::fromString($string); - $parsed = array_values($header->all()); - // reset index since the fixtures don't have them set - foreach ($parsed as $item) { - $item->setIndex(0); - } - $this->assertEquals($items, $parsed); - } - - public function provideFromStringData() - { - return array( - array('', array()), - array('gzip', array(new AcceptHeaderItem('gzip'))), - array('gzip,deflate,sdch', array(new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch'))), - array("gzip, deflate\t,sdch", array(new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch'))), - array('"this;should,not=matter"', array(new AcceptHeaderItem('this;should,not=matter'))), - ); - } - - /** - * @dataProvider provideToStringData - */ - public function testToString(array $items, $string) - { - $header = new AcceptHeader($items); - $this->assertEquals($string, (string) $header); - } - - public function provideToStringData() - { - return array( - array(array(), ''), - array(array(new AcceptHeaderItem('gzip')), 'gzip'), - array(array(new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch')), 'gzip,deflate,sdch'), - array(array(new AcceptHeaderItem('this;should,not=matter')), 'this;should,not=matter'), - ); - } - - /** - * @dataProvider provideFilterData - */ - public function testFilter($string, $filter, array $values) - { - $header = AcceptHeader::fromString($string)->filter($filter); - $this->assertEquals($values, array_keys($header->all())); - } - - public function provideFilterData() - { - return array( - array('fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', '/fr.*/', array('fr-FR', 'fr')), - ); - } - - /** - * @dataProvider provideSortingData - */ - public function testSorting($string, array $values) - { - $header = AcceptHeader::fromString($string); - $this->assertEquals($values, array_keys($header->all())); - } - - public function provideSortingData() - { - return array( - 'quality has priority' => array('*;q=0.3,ISO-8859-1,utf-8;q=0.7', array('ISO-8859-1', 'utf-8', '*')), - 'order matters when q is equal' => array('*;q=0.3,ISO-8859-1;q=0.7,utf-8;q=0.7', array('ISO-8859-1', 'utf-8', '*')), - 'order matters when q is equal2' => array('*;q=0.3,utf-8;q=0.7,ISO-8859-1;q=0.7', array('utf-8', 'ISO-8859-1', '*')), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php deleted file mode 100644 index 965a7d2bf0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ApacheRequestTest.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\ApacheRequest; - -class ApacheRequestTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider provideServerVars - */ - public function testUriMethods($server, $expectedRequestUri, $expectedBaseUrl, $expectedPathInfo) - { - $request = new ApacheRequest(); - $request->server->replace($server); - - $this->assertEquals($expectedRequestUri, $request->getRequestUri(), '->getRequestUri() is correct'); - $this->assertEquals($expectedBaseUrl, $request->getBaseUrl(), '->getBaseUrl() is correct'); - $this->assertEquals($expectedPathInfo, $request->getPathInfo(), '->getPathInfo() is correct'); - } - - public function provideServerVars() - { - return array( - array( - array( - 'REQUEST_URI' => '/foo/app_dev.php/bar', - 'SCRIPT_NAME' => '/foo/app_dev.php', - 'PATH_INFO' => '/bar', - ), - '/foo/app_dev.php/bar', - '/foo/app_dev.php', - '/bar' - ), - array( - array( - 'REQUEST_URI' => '/foo/bar', - 'SCRIPT_NAME' => '/foo/app_dev.php', - ), - '/foo/bar', - '/foo', - '/bar', - ), - array( - array( - 'REQUEST_URI' => '/app_dev.php/foo/bar', - 'SCRIPT_NAME' => '/app_dev.php', - 'PATH_INFO' => '/foo/bar', - ), - '/app_dev.php/foo/bar', - '/app_dev.php', - '/foo/bar', - ), - array( - array( - 'REQUEST_URI' => '/foo/bar', - 'SCRIPT_NAME' => '/app_dev.php', - ), - '/foo/bar', - '', - '/foo/bar', - ), - array( - array( - 'REQUEST_URI' => '/app_dev.php', - 'SCRIPT_NAME' => '/app_dev.php', - ), - '/app_dev.php', - '/app_dev.php', - '/', - ), - array( - array( - 'REQUEST_URI' => '/', - 'SCRIPT_NAME' => '/app_dev.php', - ), - '/', - '', - '/', - ), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php deleted file mode 100644 index 75863168d1..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php +++ /dev/null @@ -1,214 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\BinaryFileResponse; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\ResponseHeaderBag; - -class BinaryFileResponseTest extends ResponseTestCase -{ - public function testConstruction() - { - $response = new BinaryFileResponse('README.md', 404, array('X-Header' => 'Foo'), true, null, true, true); - $this->assertEquals(404, $response->getStatusCode()); - $this->assertEquals('Foo', $response->headers->get('X-Header')); - $this->assertTrue($response->headers->has('ETag')); - $this->assertTrue($response->headers->has('Last-Modified')); - $this->assertFalse($response->headers->has('Content-Disposition')); - - $response = BinaryFileResponse::create('README.md', 404, array(), true, ResponseHeaderBag::DISPOSITION_INLINE); - $this->assertEquals(404, $response->getStatusCode()); - $this->assertFalse($response->headers->has('ETag')); - $this->assertEquals('inline; filename="README.md"', $response->headers->get('Content-Disposition')); - } - - /** - * @expectedException \LogicException - */ - public function testSetContent() - { - $response = new BinaryFileResponse('README.md'); - $response->setContent('foo'); - } - - public function testGetContent() - { - $response = new BinaryFileResponse('README.md'); - $this->assertFalse($response->getContent()); - } - - /** - * @dataProvider provideRanges - */ - public function testRequests($requestRange, $offset, $length, $responseRange) - { - $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif')->setAutoEtag(); - - // do a request to get the ETag - $request = Request::create('/'); - $response->prepare($request); - $etag = $response->headers->get('ETag'); - - // prepare a request for a range of the testing file - $request = Request::create('/'); - $request->headers->set('If-Range', $etag); - $request->headers->set('Range', $requestRange); - - $file = fopen(__DIR__.'/File/Fixtures/test.gif', 'r'); - fseek($file, $offset); - $data = fread($file, $length); - fclose($file); - - $this->expectOutputString($data); - $response = clone $response; - $response->prepare($request); - $response->sendContent(); - - $this->assertEquals(206, $response->getStatusCode()); - $this->assertEquals('binary', $response->headers->get('Content-Transfer-Encoding')); - $this->assertEquals($responseRange, $response->headers->get('Content-Range')); - } - - public function provideRanges() - { - return array( - array('bytes=1-4', 1, 4, 'bytes 1-4/35'), - array('bytes=-5', 30, 5, 'bytes 30-34/35'), - array('bytes=30-', 30, 5, 'bytes 30-34/35'), - array('bytes=30-30', 30, 1, 'bytes 30-30/35'), - array('bytes=30-34', 30, 5, 'bytes 30-34/35'), - ); - } - - /** - * @dataProvider provideFullFileRanges - */ - public function testFullFileRequests($requestRange) - { - $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif')->setAutoEtag(); - - // prepare a request for a range of the testing file - $request = Request::create('/'); - $request->headers->set('Range', $requestRange); - - $file = fopen(__DIR__.'/File/Fixtures/test.gif', 'r'); - $data = fread($file, 35); - fclose($file); - - $this->expectOutputString($data); - $response = clone $response; - $response->prepare($request); - $response->sendContent(); - - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('binary', $response->headers->get('Content-Transfer-Encoding')); - } - - public function provideFullFileRanges() - { - return array( - array('bytes=0-'), - array('bytes=0-34'), - array('bytes=-35'), - // Syntactical invalid range-request should also return the full resource - array('bytes=20-10'), - array('bytes=50-40'), - ); - } - - /** - * @dataProvider provideInvalidRanges - */ - public function testInvalidRequests($requestRange) - { - $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif')->setAutoEtag(); - - // prepare a request for a range of the testing file - $request = Request::create('/'); - $request->headers->set('Range', $requestRange); - - $response = clone $response; - $response->prepare($request); - $response->sendContent(); - - $this->assertEquals(416, $response->getStatusCode()); - $this->assertEquals('binary', $response->headers->get('Content-Transfer-Encoding')); - #$this->assertEquals('', $response->headers->get('Content-Range')); - } - - public function provideInvalidRanges() - { - return array( - array('bytes=-40'), - array('bytes=30-40') - ); - } - - public function testXSendfile() - { - $request = Request::create('/'); - $request->headers->set('X-Sendfile-Type', 'X-Sendfile'); - - BinaryFileResponse::trustXSendfileTypeHeader(); - $response = BinaryFileResponse::create('README.md'); - $response->prepare($request); - - $this->expectOutputString(''); - $response->sendContent(); - - $this->assertContains('README.md', $response->headers->get('X-Sendfile')); - } - - /** - * @dataProvider getSampleXAccelMappings - */ - public function testXAccelMapping($realpath, $mapping, $virtual) - { - $request = Request::create('/'); - $request->headers->set('X-Sendfile-Type', 'X-Accel-Redirect'); - $request->headers->set('X-Accel-Mapping', $mapping); - - $file = $this->getMockBuilder('Symfony\Component\HttpFoundation\File\File') - ->disableOriginalConstructor() - ->getMock(); - $file->expects($this->any()) - ->method('getRealPath') - ->will($this->returnValue($realpath)); - $file->expects($this->any()) - ->method('isReadable') - ->will($this->returnValue(true)); - - BinaryFileResponse::trustXSendFileTypeHeader(); - $response = new BinaryFileResponse('README.md'); - $reflection = new \ReflectionObject($response); - $property = $reflection->getProperty('file'); - $property->setAccessible(true); - $property->setValue($response, $file); - - $response->prepare($request); - $this->assertEquals($virtual, $response->headers->get('X-Accel-Redirect')); - } - - public function getSampleXAccelMappings() - { - return array( - array('/var/www/var/www/files/foo.txt', '/files/=/var/www/', '/files/var/www/files/foo.txt'), - array('/home/foo/bar.txt', '/files/=/var/www/,/baz/=/home/foo/', '/baz/bar.txt'), - ); - } - - protected function provideResponse() - { - return new BinaryFileResponse('README.md'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/CookieTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/CookieTest.php deleted file mode 100644 index def1c7a378..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/CookieTest.php +++ /dev/null @@ -1,145 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\Cookie; - -/** - * CookieTest - * - * @author John Kary - * @author Hugo Hamon - */ -class CookieTest extends \PHPUnit_Framework_TestCase -{ - public function invalidNames() - { - return array( - array(''), - array(",MyName"), - array(";MyName"), - array(" MyName"), - array("\tMyName"), - array("\rMyName"), - array("\nMyName"), - array("\013MyName"), - array("\014MyName"), - ); - } - - /** - * @dataProvider invalidNames - * @expectedException \InvalidArgumentException - * @covers Symfony\Component\HttpFoundation\Cookie::__construct - */ - public function testInstantiationThrowsExceptionIfCookieNameContainsInvalidCharacters($name) - { - new Cookie($name); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testInvalidExpiration() - { - $cookie = new Cookie('MyCookie', 'foo', 'bar'); - } - - /** - * @covers Symfony\Component\HttpFoundation\Cookie::getValue - */ - public function testGetValue() - { - $value = 'MyValue'; - $cookie = new Cookie('MyCookie', $value); - - $this->assertSame($value, $cookie->getValue(), '->getValue() returns the proper value'); - } - - public function testGetPath() - { - $cookie = new Cookie('foo', 'bar'); - - $this->assertSame('/', $cookie->getPath(), '->getPath() returns / as the default path'); - } - - public function testGetExpiresTime() - { - $cookie = new Cookie('foo', 'bar', 3600); - - $this->assertEquals(3600, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date'); - } - - public function testConstructorWithDateTime() - { - $expire = new \DateTime(); - $cookie = new Cookie('foo', 'bar', $expire); - - $this->assertEquals($expire->format('U'), $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date'); - } - - public function testGetExpiresTimeWithStringValue() - { - $value = "+1 day"; - $cookie = new Cookie('foo', 'bar', $value); - $expire = strtotime($value); - - $this->assertEquals($expire, $cookie->getExpiresTime(), '->getExpiresTime() returns the expire date'); - } - - public function testGetDomain() - { - $cookie = new Cookie('foo', 'bar', 3600, '/', '.myfoodomain.com'); - - $this->assertEquals('.myfoodomain.com', $cookie->getDomain(), '->getDomain() returns the domain name on which the cookie is valid'); - } - - public function testIsSecure() - { - $cookie = new Cookie('foo', 'bar', 3600, '/', '.myfoodomain.com', true); - - $this->assertTrue($cookie->isSecure(), '->isSecure() returns whether the cookie is transmitted over HTTPS'); - } - - public function testIsHttpOnly() - { - $cookie = new Cookie('foo', 'bar', 3600, '/', '.myfoodomain.com', false, true); - - $this->assertTrue($cookie->isHttpOnly(), '->isHttpOnly() returns whether the cookie is only transmitted over HTTP'); - } - - public function testCookieIsNotCleared() - { - $cookie = new Cookie('foo', 'bar', time()+3600*24); - - $this->assertFalse($cookie->isCleared(), '->isCleared() returns false if the cookie did not expire yet'); - } - - public function testCookieIsCleared() - { - $cookie = new Cookie('foo', 'bar', time()-20); - - $this->assertTrue($cookie->isCleared(), '->isCleared() returns true if the cookie has expired'); - } - - public function testToString() - { - $cookie = new Cookie('foo', 'bar', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true); - $this->assertEquals('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; path=/; domain=.myfoodomain.com; secure; httponly', $cookie->__toString(), '->__toString() returns string representation of the cookie'); - - $cookie = new Cookie('foo', null, 1, '/admin/', '.myfoodomain.com'); - $this->assertEquals('foo=deleted; expires='.gmdate("D, d-M-Y H:i:s T", time()-31536001).'; path=/admin/; domain=.myfoodomain.com; httponly', $cookie->__toString(), '->__toString() returns string representation of a cleared cookie if value is NULL'); - - $cookie = new Cookie('foo', 'bar', 0, '/', ''); - $this->assertEquals('foo=bar; path=/; httponly', $cookie->__toString()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/FileTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/FileTest.php deleted file mode 100644 index b64d5f5121..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/FileTest.php +++ /dev/null @@ -1,169 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\File; - -use Symfony\Component\HttpFoundation\File\File; -use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser; - -class FileTest extends \PHPUnit_Framework_TestCase -{ - protected $file; - - public function testGetMimeTypeUsesMimeTypeGuessers() - { - $file = new File(__DIR__.'/Fixtures/test.gif'); - $guesser = $this->createMockGuesser($file->getPathname(), 'image/gif'); - - MimeTypeGuesser::getInstance()->register($guesser); - - $this->assertEquals('image/gif', $file->getMimeType()); - } - - public function testGuessExtensionWithoutGuesser() - { - $file = new File(__DIR__.'/Fixtures/directory/.empty'); - - $this->assertNull($file->guessExtension()); - } - - public function testGuessExtensionIsBasedOnMimeType() - { - $file = new File(__DIR__.'/Fixtures/test'); - $guesser = $this->createMockGuesser($file->getPathname(), 'image/gif'); - - MimeTypeGuesser::getInstance()->register($guesser); - - $this->assertEquals('gif', $file->guessExtension()); - } - - public function testConstructWhenFileNotExists() - { - $this->setExpectedException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException'); - - new File(__DIR__.'/Fixtures/not_here'); - } - - public function testMove() - { - $path = __DIR__.'/Fixtures/test.copy.gif'; - $targetDir = __DIR__.'/Fixtures/directory'; - $targetPath = $targetDir.'/test.copy.gif'; - @unlink($path); - @unlink($targetPath); - copy(__DIR__.'/Fixtures/test.gif', $path); - - $file = new File($path); - $movedFile = $file->move($targetDir); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\File\File', $movedFile); - - $this->assertTrue(file_exists($targetPath)); - $this->assertFalse(file_exists($path)); - $this->assertEquals(realpath($targetPath), $movedFile->getRealPath()); - - @unlink($targetPath); - } - - public function testMoveWithNewName() - { - $path = __DIR__.'/Fixtures/test.copy.gif'; - $targetDir = __DIR__.'/Fixtures/directory'; - $targetPath = $targetDir.'/test.newname.gif'; - @unlink($path); - @unlink($targetPath); - copy(__DIR__.'/Fixtures/test.gif', $path); - - $file = new File($path); - $movedFile = $file->move($targetDir, 'test.newname.gif'); - - $this->assertTrue(file_exists($targetPath)); - $this->assertFalse(file_exists($path)); - $this->assertEquals(realpath($targetPath), $movedFile->getRealPath()); - - @unlink($targetPath); - } - - public function getFilenameFixtures() - { - return array( - array('original.gif', 'original.gif'), - array('..\\..\\original.gif', 'original.gif'), - array('../../original.gif', 'original.gif'), - array('файлfile.gif', 'файлfile.gif'), - array('..\\..\\файлfile.gif', 'файлfile.gif'), - array('../../файлfile.gif', 'файлfile.gif'), - ); - } - - /** - * @dataProvider getFilenameFixtures - */ - public function testMoveWithNonLatinName($filename, $sanitizedFilename) - { - $path = __DIR__.'/Fixtures/'.$sanitizedFilename; - $targetDir = __DIR__.'/Fixtures/directory/'; - $targetPath = $targetDir.$sanitizedFilename; - @unlink($path); - @unlink($targetPath); - copy(__DIR__.'/Fixtures/test.gif', $path); - - $file = new File($path); - $movedFile = $file->move($targetDir,$filename); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\File\File', $movedFile); - - $this->assertTrue(file_exists($targetPath)); - $this->assertFalse(file_exists($path)); - $this->assertEquals(realpath($targetPath), $movedFile->getRealPath()); - - @unlink($targetPath); - } - - public function testMoveToAnUnexistentDirectory() - { - $sourcePath = __DIR__.'/Fixtures/test.copy.gif'; - $targetDir = __DIR__.'/Fixtures/directory/sub'; - $targetPath = $targetDir.'/test.copy.gif'; - @unlink($sourcePath); - @unlink($targetPath); - @rmdir($targetDir); - copy(__DIR__.'/Fixtures/test.gif', $sourcePath); - - $file = new File($sourcePath); - $movedFile = $file->move($targetDir); - - $this->assertFileExists($targetPath); - $this->assertFileNotExists($sourcePath); - $this->assertEquals(realpath($targetPath), $movedFile->getRealPath()); - - @unlink($sourcePath); - @unlink($targetPath); - @rmdir($targetDir); - } - - public function testGetExtension() - { - $file = new File(__DIR__.'/Fixtures/test.gif'); - $this->assertEquals('gif', $file->getExtension()); - } - - protected function createMockGuesser($path, $mimeType) - { - $guesser = $this->getMock('Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface'); - $guesser - ->expects($this->once()) - ->method('guess') - ->with($this->equalTo($path)) - ->will($this->returnValue($mimeType)) - ; - - return $guesser; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension deleted file mode 100644 index 4d1ae35ba2..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/.unknownextension +++ /dev/null @@ -1 +0,0 @@ -f \ No newline at end of file diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/directory/.empty deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test deleted file mode 100644 index b636f4b8df536b0a85e7cea1a6cf3f0bd3179b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 jcmZ?wbh9u|WMp7uXkcLY4+c66KmZb9U}AD%WUvMRyAlZ1 diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/Fixtures/test.gif deleted file mode 100644 index b636f4b8df536b0a85e7cea1a6cf3f0bd3179b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 jcmZ?wbh9u|WMp7uXkcLY4+c66KmZb9U}AD%WUvMRyAlZ1 diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php deleted file mode 100644 index 1078fc2d41..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php +++ /dev/null @@ -1,105 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\File\MimeType; - -use Symfony\Component\HttpFoundation\File\File; -use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser; -use Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser; -use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; -use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException; - -class MimeTypeTest extends \PHPUnit_Framework_TestCase -{ - protected $path; - - public function testGuessImageWithoutExtension() - { - if (extension_loaded('fileinfo')) { - $this->assertEquals('image/gif', MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test')); - } else { - $this->assertNull(MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test')); - } - } - - public function testGuessImageWithDirectory() - { - $this->setExpectedException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException'); - - MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/directory'); - } - - public function testGuessImageWithFileBinaryMimeTypeGuesser() - { - $guesser = MimeTypeGuesser::getInstance(); - $guesser->register(new FileBinaryMimeTypeGuesser()); - if (extension_loaded('fileinfo')) { - $this->assertEquals('image/gif', MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test')); - } else { - $this->assertNull(MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test')); - } - } - - public function testGuessImageWithKnownExtension() - { - if (extension_loaded('fileinfo')) { - $this->assertEquals('image/gif', MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test.gif')); - } else { - $this->assertNull(MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test.gif')); - } - } - - public function testGuessFileWithUnknownExtension() - { - if (extension_loaded('fileinfo')) { - $this->assertEquals('application/octet-stream', MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/.unknownextension')); - } else { - $this->assertNull(MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/.unknownextension')); - } - } - - public function testGuessWithIncorrectPath() - { - $this->setExpectedException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException'); - MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/not_here'); - } - - public function testGuessWithNonReadablePath() - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - $this->markTestSkipped('Can not verify chmod operations on Windows'); - } - - if (in_array(get_current_user(), array('root'))) { - $this->markTestSkipped('This test will fail if run under superuser'); - } - - $path = __DIR__.'/../Fixtures/to_delete'; - touch($path); - @chmod($path, 0333); - - if (get_current_user() != 'root' && substr(sprintf('%o', fileperms($path)), -4) == '0333') { - $this->setExpectedException('Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException'); - MimeTypeGuesser::getInstance()->guess($path); - } else { - $this->markTestSkipped('Can not verify chmod operations, change of file permissions failed'); - } - } - - public static function tearDownAfterClass() - { - $path = __DIR__.'/../Fixtures/to_delete'; - if (file_exists($path)) { - @chmod($path, 0666); - @unlink($path); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php deleted file mode 100644 index 5b48970d5e..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/File/UploadedFileTest.php +++ /dev/null @@ -1,272 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\File; - -use Symfony\Component\HttpFoundation\File\UploadedFile; - -class UploadedFileTest extends \PHPUnit_Framework_TestCase -{ - protected function setUp() - { - if (!ini_get('file_uploads')) { - $this->markTestSkipped('file_uploads is disabled in php.ini'); - } - } - - public function testConstructWhenFileNotExists() - { - $this->setExpectedException('Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException'); - - new UploadedFile( - __DIR__.'/Fixtures/not_here', - 'original.gif', - null - ); - } - - public function testFileUploadsWithNoMimeType() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - null, - filesize(__DIR__.'/Fixtures/test.gif'), - UPLOAD_ERR_OK - ); - - $this->assertEquals('application/octet-stream', $file->getClientMimeType()); - - if (extension_loaded('fileinfo')) { - $this->assertEquals('image/gif', $file->getMimeType()); - } - } - - public function testFileUploadsWithUnknownMimeType() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/.unknownextension', - 'original.gif', - null, - filesize(__DIR__.'/Fixtures/.unknownextension'), - UPLOAD_ERR_OK - ); - - $this->assertEquals('application/octet-stream', $file->getClientMimeType()); - } - - public function testGuessClientExtension() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - 'image/gif', - filesize(__DIR__.'/Fixtures/test.gif'), - null - ); - - $this->assertEquals('gif', $file->guessClientExtension()); - } - - public function testGuessClientExtensionWithIncorrectMimeType() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - 'image/jpeg', - filesize(__DIR__.'/Fixtures/test.gif'), - null - ); - - $this->assertEquals('jpeg', $file->guessClientExtension()); - } - - public function testErrorIsOkByDefault() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - 'image/gif', - filesize(__DIR__.'/Fixtures/test.gif'), - null - ); - - $this->assertEquals(UPLOAD_ERR_OK, $file->getError()); - } - - public function testGetClientOriginalName() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - 'image/gif', - filesize(__DIR__.'/Fixtures/test.gif'), - null - ); - - $this->assertEquals('original.gif', $file->getClientOriginalName()); - } - - public function testGetClientOriginalExtension() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - 'image/gif', - filesize(__DIR__.'/Fixtures/test.gif'), - null - ); - - $this->assertEquals('gif', $file->getClientOriginalExtension()); - } - - /** - * @expectedException \Symfony\Component\HttpFoundation\File\Exception\FileException - */ - public function testMoveLocalFileIsNotAllowed() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - 'image/gif', - filesize(__DIR__.'/Fixtures/test.gif'), - UPLOAD_ERR_OK - ); - - $movedFile = $file->move(__DIR__.'/Fixtures/directory'); - } - - public function testMoveLocalFileIsAllowedInTestMode() - { - $path = __DIR__.'/Fixtures/test.copy.gif'; - $targetDir = __DIR__.'/Fixtures/directory'; - $targetPath = $targetDir.'/test.copy.gif'; - @unlink($path); - @unlink($targetPath); - copy(__DIR__.'/Fixtures/test.gif', $path); - - $file = new UploadedFile( - $path, - 'original.gif', - 'image/gif', - filesize($path), - UPLOAD_ERR_OK, - true - ); - - $movedFile = $file->move(__DIR__.'/Fixtures/directory'); - - $this->assertTrue(file_exists($targetPath)); - $this->assertFalse(file_exists($path)); - $this->assertEquals(realpath($targetPath), $movedFile->getRealPath()); - - @unlink($targetPath); - } - - public function testGetClientOriginalNameSanitizeFilename() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - '../../original.gif', - 'image/gif', - filesize(__DIR__.'/Fixtures/test.gif'), - null - ); - - $this->assertEquals('original.gif', $file->getClientOriginalName()); - } - - public function testGetSize() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - 'image/gif', - filesize(__DIR__.'/Fixtures/test.gif'), - null - ); - - $this->assertEquals(filesize(__DIR__.'/Fixtures/test.gif'), $file->getSize()); - - $file = new UploadedFile( - __DIR__.'/Fixtures/test', - 'original.gif', - 'image/gif' - ); - - $this->assertEquals(filesize(__DIR__.'/Fixtures/test'), $file->getSize()); - } - - public function testGetExtension() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - null - ); - - $this->assertEquals('gif', $file->getExtension()); - } - - public function testIsValid() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - null, - filesize(__DIR__.'/Fixtures/test.gif'), - UPLOAD_ERR_OK, - true - ); - - $this->assertTrue($file->isValid()); - } - - /** - * @dataProvider uploadedFileErrorProvider - */ - public function testIsInvalidOnUploadError($error) - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - null, - filesize(__DIR__.'/Fixtures/test.gif'), - $error - ); - - $this->assertFalse($file->isValid()); - } - - public function uploadedFileErrorProvider() - { - return array( - array(UPLOAD_ERR_INI_SIZE), - array(UPLOAD_ERR_FORM_SIZE), - array(UPLOAD_ERR_PARTIAL), - array(UPLOAD_ERR_NO_TMP_DIR), - array(UPLOAD_ERR_EXTENSION), - ); - } - - public function testIsInvalidIfNotHttpUpload() - { - $file = new UploadedFile( - __DIR__.'/Fixtures/test.gif', - 'original.gif', - null, - filesize(__DIR__.'/Fixtures/test.gif'), - UPLOAD_ERR_OK - ); - - $this->assertFalse($file->isValid()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/FileBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/FileBagTest.php deleted file mode 100644 index 1f29d56bc0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/FileBagTest.php +++ /dev/null @@ -1,148 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\File\UploadedFile; -use Symfony\Component\HttpFoundation\FileBag; - -/** - * FileBagTest. - * - * @author Fabien Potencier - * @author Bulat Shakirzyanov - */ -class FileBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @expectedException \InvalidArgumentException - */ - public function testFileMustBeAnArrayOrUploadedFile() - { - new FileBag(array('file' => 'foo')); - } - - public function testShouldConvertsUploadedFiles() - { - $tmpFile = $this->createTempFile(); - $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0); - - $bag = new FileBag(array('file' => array( - 'name' => basename($tmpFile), - 'type' => 'text/plain', - 'tmp_name' => $tmpFile, - 'error' => 0, - 'size' => 100 - ))); - - $this->assertEquals($file, $bag->get('file')); - } - - public function testShouldSetEmptyUploadedFilesToNull() - { - $bag = new FileBag(array('file' => array( - 'name' => '', - 'type' => '', - 'tmp_name' => '', - 'error' => UPLOAD_ERR_NO_FILE, - 'size' => 0 - ))); - - $this->assertNull($bag->get('file')); - } - - public function testShouldConvertUploadedFilesWithPhpBug() - { - $tmpFile = $this->createTempFile(); - $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0); - - $bag = new FileBag(array( - 'child' => array( - 'name' => array( - 'file' => basename($tmpFile), - ), - 'type' => array( - 'file' => 'text/plain', - ), - 'tmp_name' => array( - 'file' => $tmpFile, - ), - 'error' => array( - 'file' => 0, - ), - 'size' => array( - 'file' => 100, - ), - ) - )); - - $files = $bag->all(); - $this->assertEquals($file, $files['child']['file']); - } - - public function testShouldConvertNestedUploadedFilesWithPhpBug() - { - $tmpFile = $this->createTempFile(); - $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0); - - $bag = new FileBag(array( - 'child' => array( - 'name' => array( - 'sub' => array('file' => basename($tmpFile)) - ), - 'type' => array( - 'sub' => array('file' => 'text/plain') - ), - 'tmp_name' => array( - 'sub' => array('file' => $tmpFile) - ), - 'error' => array( - 'sub' => array('file' => 0) - ), - 'size' => array( - 'sub' => array('file' => 100) - ), - ) - )); - - $files = $bag->all(); - $this->assertEquals($file, $files['child']['sub']['file']); - } - - public function testShouldNotConvertNestedUploadedFiles() - { - $tmpFile = $this->createTempFile(); - $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0); - $bag = new FileBag(array('image' => array('file' => $file))); - - $files = $bag->all(); - $this->assertEquals($file, $files['image']['file']); - } - - protected function createTempFile() - { - return tempnam(sys_get_temp_dir().'/form_test', 'FormTest'); - } - - protected function setUp() - { - mkdir(sys_get_temp_dir().'/form_test', 0777, true); - } - - protected function tearDown() - { - foreach (glob(sys_get_temp_dir().'/form_test/*') as $file) { - unlink($file); - } - - rmdir(sys_get_temp_dir().'/form_test'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php deleted file mode 100644 index b1bfefbf87..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/HeaderBagTest.php +++ /dev/null @@ -1,216 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\HeaderBag; - -class HeaderBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Symfony\Component\HttpFoundation\HeaderBag::__construct - */ - public function testConstructor() - { - $bag = new HeaderBag(array('foo' => 'bar')); - $this->assertTrue($bag->has('foo')); - } - - public function testToStringNull() - { - $bag = new HeaderBag(); - $this->assertEquals('', $bag->__toString()); - } - - public function testToStringNotNull() - { - $bag = new HeaderBag(array('foo' => 'bar')); - $this->assertEquals("Foo: bar\r\n", $bag->__toString()); - } - - public function testKeys() - { - $bag = new HeaderBag(array('foo' => 'bar')); - $keys = $bag->keys(); - $this->assertEquals("foo", $keys[0]); - } - - public function testGetDate() - { - $bag = new HeaderBag(array('foo' => 'Tue, 4 Sep 2012 20:00:00 +0200')); - $headerDate = $bag->getDate('foo'); - $this->assertInstanceOf('DateTime', $headerDate); - } - - /** - * @expectedException \RuntimeException - */ - public function testGetDateException() - { - $bag = new HeaderBag(array('foo' => 'Tue')); - $headerDate = $bag->getDate('foo'); - } - - public function testGetCacheControlHeader() - { - $bag = new HeaderBag(); - $bag->addCacheControlDirective('public', '#a'); - $this->assertTrue($bag->hasCacheControlDirective('public')); - $this->assertEquals('#a', $bag->getCacheControlDirective('public')); - } - - /** - * @covers Symfony\Component\HttpFoundation\HeaderBag::all - */ - public function testAll() - { - $bag = new HeaderBag(array('foo' => 'bar')); - $this->assertEquals(array('foo' => array('bar')), $bag->all(), '->all() gets all the input'); - - $bag = new HeaderBag(array('FOO' => 'BAR')); - $this->assertEquals(array('foo' => array('BAR')), $bag->all(), '->all() gets all the input key are lower case'); - } - - /** - * @covers Symfony\Component\HttpFoundation\HeaderBag::replace - */ - public function testReplace() - { - $bag = new HeaderBag(array('foo' => 'bar')); - - $bag->replace(array('NOPE' => 'BAR')); - $this->assertEquals(array('nope' => array('BAR')), $bag->all(), '->replace() replaces the input with the argument'); - $this->assertFalse($bag->has('foo'), '->replace() overrides previously set the input'); - } - - /** - * @covers Symfony\Component\HttpFoundation\HeaderBag::get - */ - public function testGet() - { - $bag = new HeaderBag(array('foo' => 'bar', 'fuzz' => 'bizz')); - $this->assertEquals( 'bar', $bag->get('foo'), '->get return current value'); - $this->assertEquals( 'bar', $bag->get('FoO'), '->get key in case insensitive'); - $this->assertEquals( array('bar'), $bag->get('foo', 'nope', false), '->get return the value as array'); - - // defaults - $this->assertNull($bag->get('none'), '->get unknown values returns null'); - $this->assertEquals( 'default', $bag->get('none', 'default'), '->get unknown values returns default'); - $this->assertEquals( array('default'), $bag->get('none', 'default', false), '->get unknown values returns default as array'); - - $bag->set('foo', 'bor', false); - $this->assertEquals( 'bar', $bag->get('foo'), '->get return first value'); - $this->assertEquals( array('bar', 'bor'), $bag->get('foo', 'nope', false), '->get return all values as array'); - } - - public function testSetAssociativeArray() - { - $bag = new HeaderBag(); - $bag->set('foo', array('bad-assoc-index' => 'value')); - $this->assertSame('value', $bag->get('foo')); - $this->assertEquals(array('value'), $bag->get('foo', 'nope', false), 'assoc indices of multi-valued headers are ignored'); - } - - /** - * @covers Symfony\Component\HttpFoundation\HeaderBag::contains - */ - public function testContains() - { - $bag = new HeaderBag(array('foo' => 'bar', 'fuzz' => 'bizz')); - $this->assertTrue( $bag->contains('foo', 'bar'), '->contains first value'); - $this->assertTrue( $bag->contains('fuzz', 'bizz'), '->contains second value'); - $this->assertFalse( $bag->contains('nope', 'nope'), '->contains unknown value'); - $this->assertFalse( $bag->contains('foo', 'nope'), '->contains unknown value'); - - // Multiple values - $bag->set('foo', 'bor', false); - $this->assertTrue( $bag->contains('foo', 'bar'), '->contains first value'); - $this->assertTrue( $bag->contains('foo', 'bor'), '->contains second value'); - $this->assertFalse( $bag->contains('foo', 'nope'), '->contains unknown value'); - } - - public function testCacheControlDirectiveAccessors() - { - $bag = new HeaderBag(); - $bag->addCacheControlDirective('public'); - - $this->assertTrue($bag->hasCacheControlDirective('public')); - $this->assertTrue($bag->getCacheControlDirective('public')); - $this->assertEquals('public', $bag->get('cache-control')); - - $bag->addCacheControlDirective('max-age', 10); - $this->assertTrue($bag->hasCacheControlDirective('max-age')); - $this->assertEquals(10, $bag->getCacheControlDirective('max-age')); - $this->assertEquals('max-age=10, public', $bag->get('cache-control')); - - $bag->removeCacheControlDirective('max-age'); - $this->assertFalse($bag->hasCacheControlDirective('max-age')); - } - - public function testCacheControlDirectiveParsing() - { - $bag = new HeaderBag(array('cache-control' => 'public, max-age=10')); - $this->assertTrue($bag->hasCacheControlDirective('public')); - $this->assertTrue($bag->getCacheControlDirective('public')); - - $this->assertTrue($bag->hasCacheControlDirective('max-age')); - $this->assertEquals(10, $bag->getCacheControlDirective('max-age')); - - $bag->addCacheControlDirective('s-maxage', 100); - $this->assertEquals('max-age=10, public, s-maxage=100', $bag->get('cache-control')); - } - - public function testCacheControlDirectiveParsingQuotedZero() - { - $bag = new HeaderBag(array('cache-control' => 'max-age="0"')); - $this->assertTrue($bag->hasCacheControlDirective('max-age')); - $this->assertEquals(0, $bag->getCacheControlDirective('max-age')); - } - - public function testCacheControlDirectiveOverrideWithReplace() - { - $bag = new HeaderBag(array('cache-control' => 'private, max-age=100')); - $bag->replace(array('cache-control' => 'public, max-age=10')); - $this->assertTrue($bag->hasCacheControlDirective('public')); - $this->assertTrue($bag->getCacheControlDirective('public')); - - $this->assertTrue($bag->hasCacheControlDirective('max-age')); - $this->assertEquals(10, $bag->getCacheControlDirective('max-age')); - } - - /** - * @covers Symfony\Component\HttpFoundation\HeaderBag::getIterator - */ - public function testGetIterator() - { - $headers = array('foo' => 'bar', 'hello' => 'world', 'third' => 'charm'); - $headerBag = new HeaderBag($headers); - - $i = 0; - foreach ($headerBag as $key => $val) { - $i++; - $this->assertEquals(array($headers[$key]), $val); - } - - $this->assertEquals(count($headers), $i); - } - - /** - * @covers Symfony\Component\HttpFoundation\HeaderBag::count - */ - public function testCount() - { - $headers = array('foo' => 'bar', 'HELLO' => 'WORLD'); - $headerBag = new HeaderBag($headers); - - $this->assertEquals(count($headers), count($headerBag)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php deleted file mode 100644 index 726ba6a347..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\IpUtils; - -class IpUtilsTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider testIpv4Provider - */ - public function testIpv4($matches, $remoteAddr, $cidr) - { - $this->assertSame($matches, IpUtils::checkIp($remoteAddr, $cidr)); - } - - public function testIpv4Provider() - { - return array( - array(true, '192.168.1.1', '192.168.1.1'), - array(true, '192.168.1.1', '192.168.1.1/1'), - array(true, '192.168.1.1', '192.168.1.0/24'), - array(false, '192.168.1.1', '1.2.3.4/1'), - array(false, '192.168.1.1', '192.168.1/33'), - array(true, '192.168.1.1', array('1.2.3.4/1', '192.168.1.0/24')), - array(true, '192.168.1.1', array('192.168.1.0/24', '1.2.3.4/1')), - array(false, '192.168.1.1', array('1.2.3.4/1', '4.3.2.1/1')), - ); - } - - /** - * @dataProvider testIpv6Provider - */ - public function testIpv6($matches, $remoteAddr, $cidr) - { - if (!defined('AF_INET6')) { - $this->markTestSkipped('Only works when PHP is compiled without the option "disable-ipv6".'); - } - - $this->assertSame($matches, IpUtils::checkIp($remoteAddr, $cidr)); - } - - public function testIpv6Provider() - { - return array( - array(true, '2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'), - array(false, '2a00:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'), - array(false, '2a01:198:603:0:396e:4789:8e99:890f', '::1'), - array(true, '0:0:0:0:0:0:0:1', '::1'), - array(false, '0:0:603:0:396e:4789:8e99:0001', '::1'), - array(true, '2a01:198:603:0:396e:4789:8e99:890f', array('::1', '2a01:198:603:0::/65')), - array(true, '2a01:198:603:0:396e:4789:8e99:890f', array('2a01:198:603:0::/65', '::1')), - array(false, '2a01:198:603:0:396e:4789:8e99:890f', array('::1', '1a01:198:603:0::/65')), - ); - } - - /** - * @expectedException \RuntimeException - */ - public function testAnIpv6WithOptionDisabledIpv6() - { - if (!extension_loaded('sockets')) { - $this->markTestSkipped('Only works when the socket extension is enabled'); - } - - if (defined('AF_INET6')) { - $this->markTestSkipped('Only works when PHP is compiled with the option "disable-ipv6".'); - } - - IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php deleted file mode 100644 index c7ea72676d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/JsonResponseTest.php +++ /dev/null @@ -1,204 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\JsonResponse; - -class JsonResponseTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructorEmptyCreatesJsonObject() - { - $response = new JsonResponse(); - $this->assertSame('{}', $response->getContent()); - } - - public function testConstructorWithArrayCreatesJsonArray() - { - $response = new JsonResponse(array(0, 1, 2, 3)); - $this->assertSame('[0,1,2,3]', $response->getContent()); - } - - public function testConstructorWithAssocArrayCreatesJsonObject() - { - $response = new JsonResponse(array('foo' => 'bar')); - $this->assertSame('{"foo":"bar"}', $response->getContent()); - } - - public function testConstructorWithSimpleTypes() - { - $response = new JsonResponse('foo'); - $this->assertSame('"foo"', $response->getContent()); - - $response = new JsonResponse(0); - $this->assertSame('0', $response->getContent()); - - $response = new JsonResponse(0.1); - $this->assertSame('0.1', $response->getContent()); - - $response = new JsonResponse(true); - $this->assertSame('true', $response->getContent()); - } - - public function testConstructorWithCustomStatus() - { - $response = new JsonResponse(array(), 202); - $this->assertSame(202, $response->getStatusCode()); - } - - public function testConstructorAddsContentTypeHeader() - { - $response = new JsonResponse(); - $this->assertSame('application/json', $response->headers->get('Content-Type')); - } - - public function testConstructorWithCustomHeaders() - { - $response = new JsonResponse(array(), 200, array('ETag' => 'foo')); - $this->assertSame('application/json', $response->headers->get('Content-Type')); - $this->assertSame('foo', $response->headers->get('ETag')); - } - - public function testConstructorWithCustomContentType() - { - $headers = array('Content-Type' => 'application/vnd.acme.blog-v1+json'); - - $response = new JsonResponse(array(), 200, $headers); - $this->assertSame('application/vnd.acme.blog-v1+json', $response->headers->get('Content-Type')); - } - - public function testCreate() - { - $response = JsonResponse::create(array('foo' => 'bar'), 204); - - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertEquals('{"foo":"bar"}', $response->getContent()); - $this->assertEquals(204, $response->getStatusCode()); - } - - public function testStaticCreateEmptyJsonObject() - { - $response = JsonResponse::create(); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertSame('{}', $response->getContent()); - } - - public function testStaticCreateJsonArray() - { - $response = JsonResponse::create(array(0, 1, 2, 3)); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertSame('[0,1,2,3]', $response->getContent()); - } - - public function testStaticCreateJsonObject() - { - $response = JsonResponse::create(array('foo' => 'bar')); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertSame('{"foo":"bar"}', $response->getContent()); - } - - public function testStaticCreateWithSimpleTypes() - { - $response = JsonResponse::create('foo'); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertSame('"foo"', $response->getContent()); - - $response = JsonResponse::create(0); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertSame('0', $response->getContent()); - - $response = JsonResponse::create(0.1); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertSame('0.1', $response->getContent()); - - $response = JsonResponse::create(true); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); - $this->assertSame('true', $response->getContent()); - } - - public function testStaticCreateWithCustomStatus() - { - $response = JsonResponse::create(array(), 202); - $this->assertSame(202, $response->getStatusCode()); - } - - public function testStaticCreateAddsContentTypeHeader() - { - $response = JsonResponse::create(); - $this->assertSame('application/json', $response->headers->get('Content-Type')); - } - - public function testStaticCreateWithCustomHeaders() - { - $response = JsonResponse::create(array(), 200, array('ETag' => 'foo')); - $this->assertSame('application/json', $response->headers->get('Content-Type')); - $this->assertSame('foo', $response->headers->get('ETag')); - } - - public function testStaticCreateWithCustomContentType() - { - $headers = array('Content-Type' => 'application/vnd.acme.blog-v1+json'); - - $response = JsonResponse::create(array(), 200, $headers); - $this->assertSame('application/vnd.acme.blog-v1+json', $response->headers->get('Content-Type')); - } - - public function testSetCallback() - { - $response = JsonResponse::create(array('foo' => 'bar'))->setCallback('callback'); - - $this->assertEquals('callback({"foo":"bar"});', $response->getContent()); - $this->assertEquals('text/javascript', $response->headers->get('Content-Type')); - } - - public function testJsonEncodeFlags() - { - $response = new JsonResponse('<>\'&"'); - - $this->assertEquals('"\u003C\u003E\u0027\u0026\u0022"', $response->getContent()); - } - - public function testGetEncodingOptions() - { - $response = new JsonResponse(); - - $this->assertEquals(JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT, $response->getEncodingOptions()); - } - - public function testSetEncodingOptions() - { - $response = new JsonResponse(); - $response->setData(array(array(1, 2, 3))); - - $this->assertEquals('[[1,2,3]]', $response->getContent()); - - $response->setEncodingOptions(JSON_FORCE_OBJECT); - - $this->assertEquals('{"0":{"0":1,"1":2,"2":3}}', $response->getContent()); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testSetCallbackInvalidIdentifier() - { - $response = new JsonResponse('foo'); - $response->setCallback('+invalid'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testSetContent() - { - JsonResponse::create("\xB1\x31"); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php deleted file mode 100644 index 7f4f243b48..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php +++ /dev/null @@ -1,254 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\ParameterBag; - -class ParameterBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::__construct - */ - public function testConstructor() - { - $this->testAll(); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::all - */ - public function testAll() - { - $bag = new ParameterBag(array('foo' => 'bar')); - $this->assertEquals(array('foo' => 'bar'), $bag->all(), '->all() gets all the input'); - } - - public function testKeys() - { - $bag = new ParameterBag(array('foo' => 'bar')); - $this->assertEquals(array('foo'), $bag->keys()); - } - - public function testAdd() - { - $bag = new ParameterBag(array('foo' => 'bar')); - $bag->add(array('bar' => 'bas')); - $this->assertEquals(array('foo' => 'bar', 'bar' => 'bas'), $bag->all()); - } - - public function testRemove() - { - $bag = new ParameterBag(array('foo' => 'bar')); - $bag->add(array('bar' => 'bas')); - $this->assertEquals(array('foo' => 'bar', 'bar' => 'bas'), $bag->all()); - $bag->remove('bar'); - $this->assertEquals(array('foo' => 'bar'), $bag->all()); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::replace - */ - public function testReplace() - { - $bag = new ParameterBag(array('foo' => 'bar')); - - $bag->replace(array('FOO' => 'BAR')); - $this->assertEquals(array('FOO' => 'BAR'), $bag->all(), '->replace() replaces the input with the argument'); - $this->assertFalse($bag->has('foo'), '->replace() overrides previously set the input'); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::get - */ - public function testGet() - { - $bag = new ParameterBag(array('foo' => 'bar', 'null' => null)); - - $this->assertEquals('bar', $bag->get('foo'), '->get() gets the value of a parameter'); - $this->assertEquals('default', $bag->get('unknown', 'default'), '->get() returns second argument as default if a parameter is not defined'); - $this->assertNull($bag->get('null', 'default'), '->get() returns null if null is set'); - } - - public function testGetDoesNotUseDeepByDefault() - { - $bag = new ParameterBag(array('foo' => array('bar' => 'moo'))); - - $this->assertNull($bag->get('foo[bar]')); - } - - /** - * @dataProvider getInvalidPaths - * @expectedException \InvalidArgumentException - */ - public function testGetDeepWithInvalidPaths($path) - { - $bag = new ParameterBag(array('foo' => array('bar' => 'moo'))); - - $bag->get($path, null, true); - } - - public function getInvalidPaths() - { - return array( - array('foo[['), - array('foo[d'), - array('foo[bar]]'), - array('foo[bar]d'), - ); - } - - public function testGetDeep() - { - $bag = new ParameterBag(array('foo' => array('bar' => array('moo' => 'boo')))); - - $this->assertEquals(array('moo' => 'boo'), $bag->get('foo[bar]', null, true)); - $this->assertEquals('boo', $bag->get('foo[bar][moo]', null, true)); - $this->assertEquals('default', $bag->get('foo[bar][foo]', 'default', true)); - $this->assertEquals('default', $bag->get('bar[moo][foo]', 'default', true)); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::set - */ - public function testSet() - { - $bag = new ParameterBag(array()); - - $bag->set('foo', 'bar'); - $this->assertEquals('bar', $bag->get('foo'), '->set() sets the value of parameter'); - - $bag->set('foo', 'baz'); - $this->assertEquals('baz', $bag->get('foo'), '->set() overrides previously set parameter'); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::has - */ - public function testHas() - { - $bag = new ParameterBag(array('foo' => 'bar')); - - $this->assertTrue($bag->has('foo'), '->has() returns true if a parameter is defined'); - $this->assertFalse($bag->has('unknown'), '->has() return false if a parameter is not defined'); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::getAlpha - */ - public function testGetAlpha() - { - $bag = new ParameterBag(array('word' => 'foo_BAR_012')); - - $this->assertEquals('fooBAR', $bag->getAlpha('word'), '->getAlpha() gets only alphabetic characters'); - $this->assertEquals('', $bag->getAlpha('unknown'), '->getAlpha() returns empty string if a parameter is not defined'); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::getAlnum - */ - public function testGetAlnum() - { - $bag = new ParameterBag(array('word' => 'foo_BAR_012')); - - $this->assertEquals('fooBAR012', $bag->getAlnum('word'), '->getAlnum() gets only alphanumeric characters'); - $this->assertEquals('', $bag->getAlnum('unknown'), '->getAlnum() returns empty string if a parameter is not defined'); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::getDigits - */ - public function testGetDigits() - { - $bag = new ParameterBag(array('word' => 'foo_BAR_012')); - - $this->assertEquals('012', $bag->getDigits('word'), '->getDigits() gets only digits as string'); - $this->assertEquals('', $bag->getDigits('unknown'), '->getDigits() returns empty string if a parameter is not defined'); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::getInt - */ - public function testGetInt() - { - $bag = new ParameterBag(array('digits' => '0123')); - - $this->assertEquals(123, $bag->getInt('digits'), '->getInt() gets a value of parameter as integer'); - $this->assertEquals(0, $bag->getInt('unknown'), '->getInt() returns zero if a parameter is not defined'); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::filter - */ - public function testFilter() - { - $bag = new ParameterBag(array( - 'digits' => '0123ab', - 'email' => 'example@example.com', - 'url' => 'http://example.com/foo', - 'dec' => '256', - 'hex' => '0x100', - 'array' => array('bang'), - )); - - $this->assertEmpty($bag->filter('nokey'), '->filter() should return empty by default if no key is found'); - - $this->assertEquals('0123', $bag->filter('digits', '', false, FILTER_SANITIZE_NUMBER_INT), '->filter() gets a value of parameter as integer filtering out invalid characters'); - - $this->assertEquals('example@example.com', $bag->filter('email', '', false, FILTER_VALIDATE_EMAIL), '->filter() gets a value of parameter as email'); - - $this->assertEquals('http://example.com/foo', $bag->filter('url', '', false, FILTER_VALIDATE_URL, array('flags' => FILTER_FLAG_PATH_REQUIRED)), '->filter() gets a value of parameter as URL with a path'); - - // This test is repeated for code-coverage - $this->assertEquals('http://example.com/foo', $bag->filter('url', '', false, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED), '->filter() gets a value of parameter as URL with a path'); - - $this->assertFalse($bag->filter('dec', '', false, FILTER_VALIDATE_INT, array( - 'flags' => FILTER_FLAG_ALLOW_HEX, - 'options' => array('min_range' => 1, 'max_range' => 0xff)) - ), '->filter() gets a value of parameter as integer between boundaries'); - - $this->assertFalse($bag->filter('hex', '', false, FILTER_VALIDATE_INT, array( - 'flags' => FILTER_FLAG_ALLOW_HEX, - 'options' => array('min_range' => 1, 'max_range' => 0xff)) - ), '->filter() gets a value of parameter as integer between boundaries'); - - $this->assertEquals(array('bang'), $bag->filter('array', '', false), '->filter() gets a value of parameter as an array'); - - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::getIterator - */ - public function testGetIterator() - { - $parameters = array('foo' => 'bar', 'hello' => 'world'); - $bag = new ParameterBag($parameters); - - $i = 0; - foreach ($bag as $key => $val) { - $i++; - $this->assertEquals($parameters[$key], $val); - } - - $this->assertEquals(count($parameters), $i); - } - - /** - * @covers Symfony\Component\HttpFoundation\ParameterBag::count - */ - public function testCount() - { - $parameters = array('foo' => 'bar', 'hello' => 'world'); - $bag = new ParameterBag($parameters); - - $this->assertEquals(count($parameters), count($bag)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php deleted file mode 100644 index 2a097d6fd4..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RedirectResponseTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\RedirectResponse; - -class RedirectResponseTest extends \PHPUnit_Framework_TestCase -{ - public function testGenerateMetaRedirect() - { - $response = new RedirectResponse('foo.bar'); - - $this->assertEquals(1, preg_match( - '##', - preg_replace(array('/\s+/', '/\'/'), array(' ', '"'), $response->getContent()) - )); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testRedirectResponseConstructorNullUrl() - { - $response = new RedirectResponse(null); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testRedirectResponseConstructorWrongStatusCode() - { - $response = new RedirectResponse('foo.bar', 404); - } - - public function testGenerateLocationHeader() - { - $response = new RedirectResponse('foo.bar'); - - $this->assertTrue($response->headers->has('Location')); - $this->assertEquals('foo.bar', $response->headers->get('Location')); - } - - public function testGetTargetUrl() - { - $response = new RedirectResponse('foo.bar'); - - $this->assertEquals('foo.bar', $response->getTargetUrl()); - } - - public function testSetTargetUrl() - { - $response = new RedirectResponse('foo.bar'); - $response->setTargetUrl('baz.beep'); - - $this->assertEquals('baz.beep', $response->getTargetUrl()); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testSetTargetUrlNull() - { - $response = new RedirectResponse('foo.bar'); - $response->setTargetUrl(null); - } - - public function testCreate() - { - $response = RedirectResponse::create('foo', 301); - - $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $response); - $this->assertEquals(301, $response->getStatusCode()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php deleted file mode 100644 index 0e1a0f5caf..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestMatcherTest.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\RequestMatcher; -use Symfony\Component\HttpFoundation\Request; - -class RequestMatcherTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider testMethodFixtures - */ - public function testMethod($requestMethod, $matcherMethod, $isMatch) - { - $matcher = new RequestMatcher(); - $matcher->matchMethod($matcherMethod); - $request = Request::create('', $requestMethod); - $this->assertSame($isMatch, $matcher->matches($request)); - - $matcher = new RequestMatcher(null, null, $matcherMethod); - $request = Request::create('', $requestMethod); - $this->assertSame($isMatch, $matcher->matches($request)); - } - - public function testMethodFixtures() - { - return array( - array('get', 'get', true), - array('get', array('get', 'post'), true), - array('get', 'post', false), - array('get', 'GET', true), - array('get', array('GET', 'POST'), true), - array('get', 'POST', false), - ); - } - - /** - * @dataProvider testHostFixture - */ - public function testHost($pattern, $isMatch) - { - $matcher = new RequestMatcher(); - $request = Request::create('', 'get', array(), array(), array(), array('HTTP_HOST' => 'foo.example.com')); - - $matcher->matchHost($pattern); - $this->assertSame($isMatch, $matcher->matches($request)); - - $matcher= new RequestMatcher(null, $pattern); - $this->assertSame($isMatch, $matcher->matches($request)); - } - - public function testHostFixture() - { - return array( - array('.*\.example\.com', true), - array('\.example\.com$', true), - array('^.*\.example\.com$', true), - array('.*\.sensio\.com', false), - array('.*\.example\.COM', true), - array('\.example\.COM$', true), - array('^.*\.example\.COM$', true), - array('.*\.sensio\.COM', false), ); - } - - public function testPath() - { - $matcher = new RequestMatcher(); - - $request = Request::create('/admin/foo'); - - $matcher->matchPath('/admin/.*'); - $this->assertTrue($matcher->matches($request)); - - $matcher->matchPath('/admin'); - $this->assertTrue($matcher->matches($request)); - - $matcher->matchPath('^/admin/.*$'); - $this->assertTrue($matcher->matches($request)); - - $matcher->matchMethod('/blog/.*'); - $this->assertFalse($matcher->matches($request)); - } - - public function testPathWithLocaleIsNotSupported() - { - $matcher = new RequestMatcher(); - $request = Request::create('/en/login'); - $request->setLocale('en'); - - $matcher->matchPath('^/{_locale}/login$'); - $this->assertFalse($matcher->matches($request)); - } - - public function testPathWithEncodedCharacters() - { - $matcher = new RequestMatcher(); - $request = Request::create('/admin/fo%20o'); - $matcher->matchPath('^/admin/fo o*$'); - $this->assertTrue($matcher->matches($request)); - } - - public function testAttributes() - { - $matcher = new RequestMatcher(); - - $request = Request::create('/admin/foo'); - $request->attributes->set('foo', 'foo_bar'); - - $matcher->matchAttribute('foo', 'foo_.*'); - $this->assertTrue($matcher->matches($request)); - - $matcher->matchAttribute('foo', 'foo'); - $this->assertTrue($matcher->matches($request)); - - $matcher->matchAttribute('foo', '^foo_bar$'); - $this->assertTrue($matcher->matches($request)); - - $matcher->matchAttribute('foo', 'babar'); - $this->assertFalse($matcher->matches($request)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestTest.php deleted file mode 100644 index db331f283d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/RequestTest.php +++ /dev/null @@ -1,1656 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; -use Symfony\Component\HttpFoundation\Session\Session; -use Symfony\Component\HttpFoundation\Request; - -class RequestTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Symfony\Component\HttpFoundation\Request::__construct - */ - public function testConstructor() - { - $this->testInitialize(); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::initialize - */ - public function testInitialize() - { - $request = new Request(); - - $request->initialize(array('foo' => 'bar')); - $this->assertEquals('bar', $request->query->get('foo'), '->initialize() takes an array of query parameters as its first argument'); - - $request->initialize(array(), array('foo' => 'bar')); - $this->assertEquals('bar', $request->request->get('foo'), '->initialize() takes an array of request parameters as its second argument'); - - $request->initialize(array(), array(), array('foo' => 'bar')); - $this->assertEquals('bar', $request->attributes->get('foo'), '->initialize() takes an array of attributes as its third argument'); - - $request->initialize(array(), array(), array(), array(), array(), array('HTTP_FOO' => 'bar')); - $this->assertEquals('bar', $request->headers->get('FOO'), '->initialize() takes an array of HTTP headers as its fourth argument'); - } - - public function testGetLocale() - { - $request = new Request(); - $request->setLocale('pl'); - $locale = $request->getLocale(); - $this->assertEquals('pl', $locale); - } - - public function testGetUser() - { - $request = Request::create('http://user_test:password_test@test.com/'); - $user = $request->getUser(); - - $this->assertEquals('user_test', $user); - } - - public function testGetPassword() - { - $request = Request::create('http://user_test:password_test@test.com/'); - $password = $request->getPassword(); - - $this->assertEquals('password_test', $password); - } - - public function testIsNoCache() - { - $request = new Request(); - $isNoCache = $request->isNoCache(); - - $this->assertFalse($isNoCache); - } - - public function testGetContentType() - { - $request = new Request(); - $contentType = $request->getContentType(); - - $this->assertNull($contentType); - } - - public function testSetDefaultLocale() - { - $request = new Request(); - $request->setDefaultLocale('pl'); - $locale = $request->getLocale(); - - $this->assertEquals('pl', $locale); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::create - */ - public function testCreate() - { - $request = Request::create('http://test.com/foo?bar=baz'); - $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('bar=baz', $request->getQueryString()); - $this->assertEquals(80, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://test.com/foo', 'GET', array('bar' => 'baz')); - $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('bar=baz', $request->getQueryString()); - $this->assertEquals(80, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://test.com/foo?bar=foo', 'GET', array('bar' => 'baz')); - $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('bar=baz', $request->getQueryString()); - $this->assertEquals(80, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('https://test.com/foo?bar=baz'); - $this->assertEquals('https://test.com/foo?bar=baz', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('bar=baz', $request->getQueryString()); - $this->assertEquals(443, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertTrue($request->isSecure()); - - $request = Request::create('test.com:90/foo'); - $this->assertEquals('http://test.com:90/foo', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('test.com', $request->getHost()); - $this->assertEquals('test.com:90', $request->getHttpHost()); - $this->assertEquals(90, $request->getPort()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('https://test.com:90/foo'); - $this->assertEquals('https://test.com:90/foo', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('test.com', $request->getHost()); - $this->assertEquals('test.com:90', $request->getHttpHost()); - $this->assertEquals(90, $request->getPort()); - $this->assertTrue($request->isSecure()); - - $request = Request::create('https://127.0.0.1:90/foo'); - $this->assertEquals('https://127.0.0.1:90/foo', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('127.0.0.1', $request->getHost()); - $this->assertEquals('127.0.0.1:90', $request->getHttpHost()); - $this->assertEquals(90, $request->getPort()); - $this->assertTrue($request->isSecure()); - - $request = Request::create('https://[::1]:90/foo'); - $this->assertEquals('https://[::1]:90/foo', $request->getUri()); - $this->assertEquals('/foo', $request->getPathInfo()); - $this->assertEquals('[::1]', $request->getHost()); - $this->assertEquals('[::1]:90', $request->getHttpHost()); - $this->assertEquals(90, $request->getPort()); - $this->assertTrue($request->isSecure()); - - $json = '{"jsonrpc":"2.0","method":"echo","id":7,"params":["Hello World"]}'; - $request = Request::create('http://example.com/jsonrpc', 'POST', array(), array(), array(), array(), $json); - $this->assertEquals($json, $request->getContent()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://test.com'); - $this->assertEquals('http://test.com/', $request->getUri()); - $this->assertEquals('/', $request->getPathInfo()); - $this->assertEquals('', $request->getQueryString()); - $this->assertEquals(80, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://test.com?test=1'); - $this->assertEquals('http://test.com/?test=1', $request->getUri()); - $this->assertEquals('/', $request->getPathInfo()); - $this->assertEquals('test=1', $request->getQueryString()); - $this->assertEquals(80, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://test.com:90/?test=1'); - $this->assertEquals('http://test.com:90/?test=1', $request->getUri()); - $this->assertEquals('/', $request->getPathInfo()); - $this->assertEquals('test=1', $request->getQueryString()); - $this->assertEquals(90, $request->getPort()); - $this->assertEquals('test.com:90', $request->getHttpHost()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://test:test@test.com'); - $this->assertEquals('http://test.com/', $request->getUri()); - $this->assertEquals('/', $request->getPathInfo()); - $this->assertEquals('', $request->getQueryString()); - $this->assertEquals(80, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertEquals('test', $request->getUser()); - $this->assertEquals('test', $request->getPassword()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://testnopass@test.com'); - $this->assertEquals('http://test.com/', $request->getUri()); - $this->assertEquals('/', $request->getPathInfo()); - $this->assertEquals('', $request->getQueryString()); - $this->assertEquals(80, $request->getPort()); - $this->assertEquals('test.com', $request->getHttpHost()); - $this->assertEquals('testnopass', $request->getUser()); - $this->assertNull($request->getPassword()); - $this->assertFalse($request->isSecure()); - - $request = Request::create('http://test.com/?foo'); - $this->assertEquals('/?foo', $request->getRequestUri()); - $this->assertEquals(array('foo' => ''), $request->query->all()); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::create - */ - public function testCreateCheckPrecedence() - { - // server is used by default - $request = Request::create('/', 'DELETE', array(), array(), array(), array( - 'HTTP_HOST' => 'example.com', - 'HTTPS' => 'on', - 'SERVER_PORT' => 443, - 'PHP_AUTH_USER' => 'fabien', - 'PHP_AUTH_PW' => 'pa$$', - 'QUERY_STRING' => 'foo=bar', - 'CONTENT_TYPE' => 'application/json', - )); - $this->assertEquals('example.com', $request->getHost()); - $this->assertEquals(443, $request->getPort()); - $this->assertTrue($request->isSecure()); - $this->assertEquals('fabien', $request->getUser()); - $this->assertEquals('pa$$', $request->getPassword()); - $this->assertEquals('', $request->getQueryString()); - $this->assertEquals('application/json', $request->headers->get('CONTENT_TYPE')); - - // URI has precedence over server - $request = Request::create('http://thomas:pokemon@example.net:8080/?foo=bar', 'GET', array(), array(), array(), array( - 'HTTP_HOST' => 'example.com', - 'HTTPS' => 'on', - 'SERVER_PORT' => 443, - )); - $this->assertEquals('example.net', $request->getHost()); - $this->assertEquals(8080, $request->getPort()); - $this->assertFalse($request->isSecure()); - $this->assertEquals('thomas', $request->getUser()); - $this->assertEquals('pokemon', $request->getPassword()); - $this->assertEquals('foo=bar', $request->getQueryString()); - } - - public function testDuplicate() - { - $request = new Request(array('foo' => 'bar'), array('foo' => 'bar'), array('foo' => 'bar'), array(), array(), array('HTTP_FOO' => 'bar')); - $dup = $request->duplicate(); - - $this->assertEquals($request->query->all(), $dup->query->all(), '->duplicate() duplicates a request an copy the current query parameters'); - $this->assertEquals($request->request->all(), $dup->request->all(), '->duplicate() duplicates a request an copy the current request parameters'); - $this->assertEquals($request->attributes->all(), $dup->attributes->all(), '->duplicate() duplicates a request an copy the current attributes'); - $this->assertEquals($request->headers->all(), $dup->headers->all(), '->duplicate() duplicates a request an copy the current HTTP headers'); - - $dup = $request->duplicate(array('foo' => 'foobar'), array('foo' => 'foobar'), array('foo' => 'foobar'), array(), array(), array('HTTP_FOO' => 'foobar')); - - $this->assertEquals(array('foo' => 'foobar'), $dup->query->all(), '->duplicate() overrides the query parameters if provided'); - $this->assertEquals(array('foo' => 'foobar'), $dup->request->all(), '->duplicate() overrides the request parameters if provided'); - $this->assertEquals(array('foo' => 'foobar'), $dup->attributes->all(), '->duplicate() overrides the attributes if provided'); - $this->assertEquals(array('foo' => array('foobar')), $dup->headers->all(), '->duplicate() overrides the HTTP header if provided'); - } - - public function testDuplicateWithFormat() - { - $request = new Request(array(), array(), array('_format' => 'json')); - $dup = $request->duplicate(); - - $this->assertEquals('json', $dup->getRequestFormat()); - $this->assertEquals('json', $dup->attributes->get('_format')); - - $request = new Request(); - $request->setRequestFormat('xml'); - $dup = $request->duplicate(); - - $this->assertEquals('xml', $dup->getRequestFormat()); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getFormat - * @covers Symfony\Component\HttpFoundation\Request::setFormat - * @dataProvider getFormatToMimeTypeMapProvider - */ - public function testGetFormatFromMimeType($format, $mimeTypes) - { - $request = new Request(); - foreach ($mimeTypes as $mime) { - $this->assertEquals($format, $request->getFormat($mime)); - } - $request->setFormat($format, $mimeTypes); - foreach ($mimeTypes as $mime) { - $this->assertEquals($format, $request->getFormat($mime)); - } - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getFormat - */ - public function testGetFormatFromMimeTypeWithParameters() - { - $request = new Request(); - $this->assertEquals('json', $request->getFormat('application/json; charset=utf-8')); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getMimeType - * @dataProvider getFormatToMimeTypeMapProvider - */ - public function testGetMimeTypeFromFormat($format, $mimeTypes) - { - if (null !== $format) { - $request = new Request(); - $this->assertEquals($mimeTypes[0], $request->getMimeType($format)); - } - } - - public function getFormatToMimeTypeMapProvider() - { - return array( - array(null, array(null, 'unexistent-mime-type')), - array('txt', array('text/plain')), - array('js', array('application/javascript', 'application/x-javascript', 'text/javascript')), - array('css', array('text/css')), - array('json', array('application/json', 'application/x-json')), - array('xml', array('text/xml', 'application/xml', 'application/x-xml')), - array('rdf', array('application/rdf+xml')), - array('atom',array('application/atom+xml')), - ); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getUri - */ - public function testGetUri() - { - $server = array(); - - // Standard Request on non default PORT - // http://host:8080/index.php/path/info?query=string - - $server['HTTP_HOST'] = 'host:8080'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '8080'; - - $server['QUERY_STRING'] = 'query=string'; - $server['REQUEST_URI'] = '/index.php/path/info?query=string'; - $server['SCRIPT_NAME'] = '/index.php'; - $server['PATH_INFO'] = '/path/info'; - $server['PATH_TRANSLATED'] = 'redirect:/index.php/path/info'; - $server['PHP_SELF'] = '/index_dev.php/path/info'; - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - - $request = new Request(); - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://host:8080/index.php/path/info?query=string', $request->getUri(), '->getUri() with non default port'); - - // Use std port number - $server['HTTP_HOST'] = 'host'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://host/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port'); - - // Without HOST HEADER - unset($server['HTTP_HOST']); - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://servername/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port without HOST_HEADER'); - - // Request with URL REWRITING (hide index.php) - // RewriteCond %{REQUEST_FILENAME} !-f - // RewriteRule ^(.*)$ index.php [QSA,L] - // http://host:8080/path/info?query=string - $server = array(); - $server['HTTP_HOST'] = 'host:8080'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '8080'; - - $server['REDIRECT_QUERY_STRING'] = 'query=string'; - $server['REDIRECT_URL'] = '/path/info'; - $server['SCRIPT_NAME'] = '/index.php'; - $server['QUERY_STRING'] = 'query=string'; - $server['REQUEST_URI'] = '/path/info?toto=test&1=1'; - $server['SCRIPT_NAME'] = '/index.php'; - $server['PHP_SELF'] = '/index.php'; - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://host:8080/path/info?query=string', $request->getUri(), '->getUri() with rewrite'); - - // Use std port number - // http://host/path/info?query=string - $server['HTTP_HOST'] = 'host'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://host/path/info?query=string', $request->getUri(), '->getUri() with rewrite and default port'); - - // Without HOST HEADER - unset($server['HTTP_HOST']); - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://servername/path/info?query=string', $request->getUri(), '->getUri() with rewrite, default port without HOST_HEADER'); - - // With encoded characters - - $server = array( - 'HTTP_HOST' => 'host:8080', - 'SERVER_NAME' => 'servername', - 'SERVER_PORT' => '8080', - 'QUERY_STRING' => 'query=string', - 'REQUEST_URI' => '/ba%20se/index_dev.php/foo%20bar/in+fo?query=string', - 'SCRIPT_NAME' => '/ba se/index_dev.php', - 'PATH_TRANSLATED' => 'redirect:/index.php/foo bar/in+fo', - 'PHP_SELF' => '/ba se/index_dev.php/path/info', - 'SCRIPT_FILENAME' => '/some/where/ba se/index_dev.php', - ); - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals( - 'http://host:8080/ba%20se/index_dev.php/foo%20bar/in+fo?query=string', - $request->getUri() - ); - - // with user info - - $server['PHP_AUTH_USER'] = 'fabien'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://host:8080/ba%20se/index_dev.php/foo%20bar/in+fo?query=string', $request->getUri()); - - $server['PHP_AUTH_PW'] = 'symfony'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://host:8080/ba%20se/index_dev.php/foo%20bar/in+fo?query=string', $request->getUri()); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getUriForPath - */ - public function testGetUriForPath() - { - $request = Request::create('http://test.com/foo?bar=baz'); - $this->assertEquals('http://test.com/some/path', $request->getUriForPath('/some/path')); - - $request = Request::create('http://test.com:90/foo?bar=baz'); - $this->assertEquals('http://test.com:90/some/path', $request->getUriForPath('/some/path')); - - $request = Request::create('https://test.com/foo?bar=baz'); - $this->assertEquals('https://test.com/some/path', $request->getUriForPath('/some/path')); - - $request = Request::create('https://test.com:90/foo?bar=baz'); - $this->assertEquals('https://test.com:90/some/path', $request->getUriForPath('/some/path')); - - $server = array(); - - // Standard Request on non default PORT - // http://host:8080/index.php/path/info?query=string - - $server['HTTP_HOST'] = 'host:8080'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '8080'; - - $server['QUERY_STRING'] = 'query=string'; - $server['REQUEST_URI'] = '/index.php/path/info?query=string'; - $server['SCRIPT_NAME'] = '/index.php'; - $server['PATH_INFO'] = '/path/info'; - $server['PATH_TRANSLATED'] = 'redirect:/index.php/path/info'; - $server['PHP_SELF'] = '/index_dev.php/path/info'; - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - - $request = new Request(); - - $request->initialize(array(), array(), array(), array(), array(),$server); - - $this->assertEquals('http://host:8080/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with non default port'); - - // Use std port number - $server['HTTP_HOST'] = 'host'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://host/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port'); - - // Without HOST HEADER - unset($server['HTTP_HOST']); - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://servername/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port without HOST_HEADER'); - - // Request with URL REWRITING (hide index.php) - // RewriteCond %{REQUEST_FILENAME} !-f - // RewriteRule ^(.*)$ index.php [QSA,L] - // http://host:8080/path/info?query=string - $server = array(); - $server['HTTP_HOST'] = 'host:8080'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '8080'; - - $server['REDIRECT_QUERY_STRING'] = 'query=string'; - $server['REDIRECT_URL'] = '/path/info'; - $server['SCRIPT_NAME'] = '/index.php'; - $server['QUERY_STRING'] = 'query=string'; - $server['REQUEST_URI'] = '/path/info?toto=test&1=1'; - $server['SCRIPT_NAME'] = '/index.php'; - $server['PHP_SELF'] = '/index.php'; - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://host:8080/some/path', $request->getUriForPath('/some/path'), '->getUri() with rewrite'); - - // Use std port number - // http://host/path/info?query=string - $server['HTTP_HOST'] = 'host'; - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://host/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite and default port'); - - // Without HOST HEADER - unset($server['HTTP_HOST']); - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '80'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('http://servername/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite, default port without HOST_HEADER'); - $this->assertEquals('servername', $request->getHttpHost()); - - // with user info - - $server['PHP_AUTH_USER'] = 'fabien'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://servername/some/path', $request->getUriForPath('/some/path')); - - $server['PHP_AUTH_PW'] = 'symfony'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://servername/some/path', $request->getUriForPath('/some/path')); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getUserInfo - */ - public function testGetUserInfo() - { - $request = new Request(); - - $server['PHP_AUTH_USER'] = 'fabien'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('fabien', $request->getUserInfo()); - - $server['PHP_AUTH_USER'] = '0'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('0', $request->getUserInfo()); - - $server['PHP_AUTH_PW'] = '0'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('0:0', $request->getUserInfo()); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getSchemeAndHttpHost - */ - public function testGetSchemeAndHttpHost() - { - $request = new Request(); - - $server['SERVER_NAME'] = 'servername'; - $server['SERVER_PORT'] = '90'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost()); - - $server['PHP_AUTH_USER'] = 'fabien'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost()); - - $server['PHP_AUTH_USER'] = '0'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost()); - - $server['PHP_AUTH_PW'] = '0'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost()); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::getQueryString - * @covers Symfony\Component\HttpFoundation\Request::normalizeQueryString - * @dataProvider getQueryStringNormalizationData - */ - public function testGetQueryString($query, $expectedQuery, $msg) - { - $request = new Request(); - - $request->server->set('QUERY_STRING', $query); - $this->assertSame($expectedQuery, $request->getQueryString(), $msg); - } - - public function getQueryStringNormalizationData() - { - return array( - array('foo', 'foo', 'works with valueless parameters'), - array('foo=', 'foo=', 'includes a dangling equal sign'), - array('bar=&foo=bar', 'bar=&foo=bar', '->works with empty parameters'), - array('foo=bar&bar=', 'bar=&foo=bar', 'sorts keys alphabetically'), - - // GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded). - // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str. - array('him=John%20Doe&her=Jane+Doe', 'her=Jane%20Doe&him=John%20Doe', 'normalizes spaces in both encodings "%20" and "+"'), - - array('foo[]=1&foo[]=2', 'foo%5B%5D=1&foo%5B%5D=2', 'allows array notation'), - array('foo=1&foo=2', 'foo=1&foo=2', 'allows repeated parameters'), - array('pa%3Dram=foo%26bar%3Dbaz&test=test', 'pa%3Dram=foo%26bar%3Dbaz&test=test', 'works with encoded delimiters'), - array('0', '0', 'allows "0"'), - array('Jane Doe&John%20Doe', 'Jane%20Doe&John%20Doe', 'normalizes encoding in keys'), - array('her=Jane Doe&him=John%20Doe', 'her=Jane%20Doe&him=John%20Doe', 'normalizes encoding in values'), - array('foo=bar&&&test&&', 'foo=bar&test', 'removes unneeded delimiters'), - array('formula=e=m*c^2', 'formula=e%3Dm%2Ac%5E2', 'correctly treats only the first "=" as delimiter and the next as value'), - - // Ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway. - // PHP also does not include them when building _GET. - array('foo=bar&=a=b&=x=y', 'foo=bar', 'removes params with empty key'), - ); - } - - public function testGetQueryStringReturnsNull() - { - $request = new Request(); - - $this->assertNull($request->getQueryString(), '->getQueryString() returns null for non-existent query string'); - - $request->server->set('QUERY_STRING', ''); - $this->assertNull($request->getQueryString(), '->getQueryString() returns null for empty query string'); - } - - public function testGetHost() - { - $request = new Request(); - - $request->initialize(array('foo' => 'bar')); - $this->assertEquals('', $request->getHost(), '->getHost() return empty string if not initialized'); - - $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.example.com')); - $this->assertEquals('www.example.com', $request->getHost(), '->getHost() from Host Header'); - - // Host header with port number - $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.example.com:8080')); - $this->assertEquals('www.example.com', $request->getHost(), '->getHost() from Host Header with port number'); - - // Server values - $request->initialize(array(), array(), array(), array(), array(), array('SERVER_NAME' => 'www.example.com')); - $this->assertEquals('www.example.com', $request->getHost(), '->getHost() from server name'); - - $request->initialize(array(), array(), array(), array(), array(), array('SERVER_NAME' => 'www.example.com', 'HTTP_HOST' => 'www.host.com')); - $this->assertEquals('www.host.com', $request->getHost(), '->getHost() value from Host header has priority over SERVER_NAME '); - } - - public function testGetPort() - { - $request = Request::create('http://example.com', 'GET', array(), array(), array(), array( - 'HTTP_X_FORWARDED_PROTO' => 'https', - 'HTTP_X_FORWARDED_PORT' => '443' - )); - $port = $request->getPort(); - - $this->assertEquals(80, $port, 'Without trusted proxies FORWARDED_PROTO and FORWARDED_PORT are ignored.'); - - Request::setTrustedProxies(array('1.1.1.1')); - $request = Request::create('http://example.com', 'GET', array(), array(), array(), array( - 'HTTP_X_FORWARDED_PROTO' => 'https', - 'HTTP_X_FORWARDED_PORT' => '8443' - )); - $port = $request->getPort(); - - $this->assertEquals(8443, $port, 'With PROTO and PORT set PORT takes precedence.'); - - $request = Request::create('http://example.com', 'GET', array(), array(), array(), array( - 'HTTP_X_FORWARDED_PROTO' => 'https' - )); - $port = $request->getPort(); - - $this->assertEquals(443, $port, 'With only PROTO set getPort() defaults to 443.'); - - $request = Request::create('http://example.com', 'GET', array(), array(), array(), array( - 'HTTP_X_FORWARDED_PROTO' => 'http' - )); - $port = $request->getPort(); - - $this->assertEquals(80, $port, 'If X_FORWARDED_PROTO is set to HTTP return 80.'); - - $request = Request::create('http://example.com', 'GET', array(), array(), array(), array( - 'HTTP_X_FORWARDED_PROTO' => 'On' - )); - $port = $request->getPort(); - $this->assertEquals(443, $port, 'With only PROTO set and value is On, getPort() defaults to 443.'); - - $request = Request::create('http://example.com', 'GET', array(), array(), array(), array( - 'HTTP_X_FORWARDED_PROTO' => '1' - )); - $port = $request->getPort(); - $this->assertEquals(443, $port, 'With only PROTO set and value is 1, getPort() defaults to 443.'); - - $request = Request::create('http://example.com', 'GET', array(), array(), array(), array( - 'HTTP_X_FORWARDED_PROTO' => 'something-else' - )); - $port = $request->getPort(); - $this->assertEquals(80, $port, 'With only PROTO set and value is not recognized, getPort() defaults to 80.'); - - Request::setTrustedProxies(array()); - } - - /** - * @expectedException \RuntimeException - */ - public function testGetHostWithFakeHttpHostValue() - { - $request = new Request(); - $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.host.com?query=string')); - $request->getHost(); - } - - /** - * @covers Symfony\Component\HttpFoundation\Request::setMethod - * @covers Symfony\Component\HttpFoundation\Request::getMethod - */ - public function testGetSetMethod() - { - $request = new Request(); - - $this->assertEquals('GET', $request->getMethod(), '->getMethod() returns GET if no method is defined'); - - $request->setMethod('get'); - $this->assertEquals('GET', $request->getMethod(), '->getMethod() returns an uppercased string'); - - $request->setMethod('PURGE'); - $this->assertEquals('PURGE', $request->getMethod(), '->getMethod() returns the method even if it is not a standard one'); - - $request->setMethod('POST'); - $this->assertEquals('POST', $request->getMethod(), '->getMethod() returns the method POST if no _method is defined'); - - $request->setMethod('POST'); - $request->request->set('_method', 'purge'); - $this->assertEquals('POST', $request->getMethod(), '->getMethod() does not return the method from _method if defined and POST but support not enabled'); - - $request = new Request(); - $request->setMethod('POST'); - $request->request->set('_method', 'purge'); - - $this->assertFalse(Request::getHttpMethodParameterOverride(), 'httpMethodParameterOverride should be disabled by default'); - - Request::enableHttpMethodParameterOverride(); - - $this->assertTrue(Request::getHttpMethodParameterOverride(), 'httpMethodParameterOverride should be enabled now but it is not'); - - $this->assertEquals('PURGE', $request->getMethod(), '->getMethod() returns the method from _method if defined and POST'); - $this->disableHttpMethodParameterOverride(); - - $request = new Request(); - $request->setMethod('POST'); - $request->query->set('_method', 'purge'); - $this->assertEquals('POST', $request->getMethod(), '->getMethod() does not return the method from _method if defined and POST but support not enabled'); - - $request = new Request(); - $request->setMethod('POST'); - $request->query->set('_method', 'purge'); - Request::enableHttpMethodParameterOverride(); - $this->assertEquals('PURGE', $request->getMethod(), '->getMethod() returns the method from _method if defined and POST'); - $this->disableHttpMethodParameterOverride(); - - $request = new Request(); - $request->setMethod('POST'); - $request->headers->set('X-HTTP-METHOD-OVERRIDE', 'delete'); - $this->assertEquals('DELETE', $request->getMethod(), '->getMethod() returns the method from X-HTTP-Method-Override even though _method is set if defined and POST'); - - $request = new Request(); - $request->setMethod('POST'); - $request->headers->set('X-HTTP-METHOD-OVERRIDE', 'delete'); - $this->assertEquals('DELETE', $request->getMethod(), '->getMethod() returns the method from X-HTTP-Method-Override if defined and POST'); - } - - /** - * @dataProvider testGetClientIpsProvider - */ - public function testGetClientIp($expected, $remoteAddr, $httpForwardedFor, $trustedProxies) - { - $request = $this->getRequestInstanceForClientIpTests($remoteAddr, $httpForwardedFor, $trustedProxies); - - $this->assertEquals($expected[0], $request->getClientIp()); - - Request::setTrustedProxies(array()); - } - - /** - * @dataProvider testGetClientIpsProvider - */ - public function testGetClientIps($expected, $remoteAddr, $httpForwardedFor, $trustedProxies) - { - $request = $this->getRequestInstanceForClientIpTests($remoteAddr, $httpForwardedFor, $trustedProxies); - - $this->assertEquals($expected, $request->getClientIps()); - - Request::setTrustedProxies(array()); - } - - public function testGetClientIpsProvider() - { - // $expected $remoteAddr $httpForwardedFor $trustedProxies - return array( - // simple IPv4 - array(array('88.88.88.88'), '88.88.88.88', null, null), - // trust the IPv4 remote addr - array(array('88.88.88.88'), '88.88.88.88', null, array('88.88.88.88')), - - // simple IPv6 - array(array('::1'), '::1', null, null), - // trust the IPv6 remote addr - array(array('::1'), '::1', null, array('::1')), - - // forwarded for with remote IPv4 addr not trusted - array(array('127.0.0.1'), '127.0.0.1', '88.88.88.88', null), - // forwarded for with remote IPv4 addr trusted - array(array('88.88.88.88'), '127.0.0.1', '88.88.88.88', array('127.0.0.1')), - // forwarded for with remote IPv4 and all FF addrs trusted - array(array('88.88.88.88'), '127.0.0.1', '88.88.88.88', array('127.0.0.1', '88.88.88.88')), - // forwarded for with remote IPv4 range trusted - array(array('88.88.88.88'), '123.45.67.89', '88.88.88.88', array('123.45.67.0/24')), - - // forwarded for with remote IPv6 addr not trusted - array(array('1620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3', null), - // forwarded for with remote IPv6 addr trusted - array(array('2620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3', array('1620:0:1cfe:face:b00c::3')), - // forwarded for with remote IPv6 range trusted - array(array('88.88.88.88'), '2a01:198:603:0:396e:4789:8e99:890f', '88.88.88.88', array('2a01:198:603:0::/65')), - - // multiple forwarded for with remote IPv4 addr trusted - array(array('88.88.88.88', '87.65.43.21', '127.0.0.1'), '123.45.67.89', '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89')), - // multiple forwarded for with remote IPv4 addr and some reverse proxies trusted - array(array('87.65.43.21', '127.0.0.1'), '123.45.67.89', '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89', '88.88.88.88')), - // multiple forwarded for with remote IPv4 addr and some reverse proxies trusted but in the middle - array(array('88.88.88.88', '127.0.0.1'), '123.45.67.89', '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89', '87.65.43.21')), - // multiple forwarded for with remote IPv4 addr and all reverse proxies trusted - array(array('127.0.0.1'), '123.45.67.89', '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89', '87.65.43.21', '88.88.88.88', '127.0.0.1')), - - // multiple forwarded for with remote IPv6 addr trusted - array(array('2620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', array('1620:0:1cfe:face:b00c::3')), - // multiple forwarded for with remote IPv6 addr and some reverse proxies trusted - array(array('3620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', array('1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3')), - // multiple forwarded for with remote IPv4 addr and some reverse proxies trusted but in the middle - array(array('2620:0:1cfe:face:b00c::3', '4620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '4620:0:1cfe:face:b00c::3,3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', array('1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3')), - ); - } - - public function testGetContentWorksTwiceInDefaultMode() - { - $req = new Request(); - $this->assertEquals('', $req->getContent()); - $this->assertEquals('', $req->getContent()); - } - - public function testGetContentReturnsResource() - { - $req = new Request(); - $retval = $req->getContent(true); - $this->assertInternalType('resource', $retval); - $this->assertEquals("", fread($retval, 1)); - $this->assertTrue(feof($retval)); - } - - /** - * @expectedException \LogicException - * @dataProvider getContentCantBeCalledTwiceWithResourcesProvider - */ - public function testGetContentCantBeCalledTwiceWithResources($first, $second) - { - $req = new Request(); - $req->getContent($first); - $req->getContent($second); - } - - public function getContentCantBeCalledTwiceWithResourcesProvider() - { - return array( - 'Resource then fetch' => array(true, false), - 'Resource then resource' => array(true, true), - 'Fetch then resource' => array(false, true), - ); - } - - public function provideOverloadedMethods() - { - return array( - array('PUT'), - array('DELETE'), - array('PATCH'), - array('put'), - array('delete'), - array('patch'), - - ); - } - - /** - * @dataProvider provideOverloadedMethods - */ - public function testCreateFromGlobals($method) - { - $normalizedMethod = strtoupper($method); - - $_GET['foo1'] = 'bar1'; - $_POST['foo2'] = 'bar2'; - $_COOKIE['foo3'] = 'bar3'; - $_FILES['foo4'] = array('bar4'); - $_SERVER['foo5'] = 'bar5'; - - $request = Request::createFromGlobals(); - $this->assertEquals('bar1', $request->query->get('foo1'), '::fromGlobals() uses values from $_GET'); - $this->assertEquals('bar2', $request->request->get('foo2'), '::fromGlobals() uses values from $_POST'); - $this->assertEquals('bar3', $request->cookies->get('foo3'), '::fromGlobals() uses values from $_COOKIE'); - $this->assertEquals(array('bar4'), $request->files->get('foo4'), '::fromGlobals() uses values from $_FILES'); - $this->assertEquals('bar5', $request->server->get('foo5'), '::fromGlobals() uses values from $_SERVER'); - - unset($_GET['foo1'], $_POST['foo2'], $_COOKIE['foo3'], $_FILES['foo4'], $_SERVER['foo5']); - - $_SERVER['REQUEST_METHOD'] = $method; - $_SERVER['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; - $request = RequestContentProxy::createFromGlobals(); - $this->assertEquals($normalizedMethod, $request->getMethod()); - $this->assertEquals('mycontent', $request->request->get('content')); - - unset($_SERVER['REQUEST_METHOD'], $_SERVER['CONTENT_TYPE']); - - Request::createFromGlobals(); - Request::enableHttpMethodParameterOverride(); - $_POST['_method'] = $method; - $_POST['foo6'] = 'bar6'; - $_SERVER['REQUEST_METHOD'] = 'PoSt'; - $request = Request::createFromGlobals(); - $this->assertEquals($normalizedMethod, $request->getMethod()); - $this->assertEquals('POST', $request->getRealMethod()); - $this->assertEquals('bar6', $request->request->get('foo6')); - - unset($_POST['_method'], $_POST['foo6'], $_SERVER['REQUEST_METHOD']); - $this->disableHttpMethodParameterOverride(); - } - - public function testOverrideGlobals() - { - $request = new Request(); - $request->initialize(array('foo' => 'bar')); - - // as the Request::overrideGlobals really work, it erase $_SERVER, so we must backup it - $server = $_SERVER; - - $request->overrideGlobals(); - - $this->assertEquals(array('foo' => 'bar'), $_GET); - - $request->initialize(array(), array('foo' => 'bar')); - $request->overrideGlobals(); - - $this->assertEquals(array('foo' => 'bar'), $_POST); - - $this->assertArrayNotHasKey('HTTP_X_FORWARDED_PROTO', $_SERVER); - - $request->headers->set('X_FORWARDED_PROTO', 'https'); - - Request::setTrustedProxies(array('1.1.1.1')); - $this->assertTrue($request->isSecure()); - Request::setTrustedProxies(array()); - - $request->overrideGlobals(); - - $this->assertArrayHasKey('HTTP_X_FORWARDED_PROTO', $_SERVER); - - $request->headers->set('CONTENT_TYPE', 'multipart/form-data'); - $request->headers->set('CONTENT_LENGTH', 12345); - $request->overrideGlobals(); - $this->assertArrayHasKey('CONTENT_TYPE', $_SERVER); - $this->assertArrayHasKey('CONTENT_LENGTH', $_SERVER); - - // restore initial $_SERVER array - $_SERVER = $server; - } - - public function testGetScriptName() - { - $request = new Request(); - $this->assertEquals('', $request->getScriptName()); - - $server = array(); - $server['SCRIPT_NAME'] = '/index.php'; - - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('/index.php', $request->getScriptName()); - - $server = array(); - $server['ORIG_SCRIPT_NAME'] = '/frontend.php'; - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('/frontend.php', $request->getScriptName()); - - $server = array(); - $server['SCRIPT_NAME'] = '/index.php'; - $server['ORIG_SCRIPT_NAME'] = '/frontend.php'; - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('/index.php', $request->getScriptName()); - } - - public function testGetBasePath() - { - $request = new Request(); - $this->assertEquals('', $request->getBasePath()); - - $server = array(); - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - $request->initialize(array(), array(), array(), array(), array(), $server); - $this->assertEquals('', $request->getBasePath()); - - $server = array(); - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - $server['SCRIPT_NAME'] = '/index.php'; - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('', $request->getBasePath()); - - $server = array(); - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - $server['PHP_SELF'] = '/index.php'; - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('', $request->getBasePath()); - - $server = array(); - $server['SCRIPT_FILENAME'] = '/some/where/index.php'; - $server['ORIG_SCRIPT_NAME'] = '/index.php'; - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('', $request->getBasePath()); - } - - public function testGetPathInfo() - { - $request = new Request(); - $this->assertEquals('/', $request->getPathInfo()); - - $server = array(); - $server['REQUEST_URI'] = '/path/info'; - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('/path/info', $request->getPathInfo()); - - $server = array(); - $server['REQUEST_URI'] = '/path%20test/info'; - $request->initialize(array(), array(), array(), array(), array(), $server); - - $this->assertEquals('/path%20test/info', $request->getPathInfo()); - } - - public function testGetPreferredLanguage() - { - $request = new Request(); - $this->assertNull($request->getPreferredLanguage()); - $this->assertNull($request->getPreferredLanguage(array())); - $this->assertEquals('fr', $request->getPreferredLanguage(array('fr'))); - $this->assertEquals('fr', $request->getPreferredLanguage(array('fr', 'en'))); - $this->assertEquals('en', $request->getPreferredLanguage(array('en', 'fr'))); - $this->assertEquals('fr-ch', $request->getPreferredLanguage(array('fr-ch', 'fr-fr'))); - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6'); - $this->assertEquals('en', $request->getPreferredLanguage(array('en', 'en-us'))); - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6'); - $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en'))); - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, en-us; q=0.8'); - $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en'))); - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, en-us; q=0.8, fr-fr; q=0.6, fr; q=0.5'); - $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en'))); - } - - public function testIsXmlHttpRequest() - { - $request = new Request(); - $this->assertFalse($request->isXmlHttpRequest()); - - $request->headers->set('X-Requested-With', 'XMLHttpRequest'); - $this->assertTrue($request->isXmlHttpRequest()); - - $request->headers->remove('X-Requested-With'); - $this->assertFalse($request->isXmlHttpRequest()); - } - - public function testIntlLocale() - { - if (!extension_loaded('intl')) { - $this->markTestSkipped('The intl extension is needed to run this test.'); - } - - $request = new Request(); - - $request->setDefaultLocale('fr'); - $this->assertEquals('fr', $request->getLocale()); - $this->assertEquals('fr', \Locale::getDefault()); - - $request->setLocale('en'); - $this->assertEquals('en', $request->getLocale()); - $this->assertEquals('en', \Locale::getDefault()); - - $request->setDefaultLocale('de'); - $this->assertEquals('en', $request->getLocale()); - $this->assertEquals('en', \Locale::getDefault()); - } - - public function testGetCharsets() - { - $request = new Request(); - $this->assertEquals(array(), $request->getCharsets()); - $request->headers->set('Accept-Charset', 'ISO-8859-1, US-ASCII, UTF-8; q=0.8, ISO-10646-UCS-2; q=0.6'); - $this->assertEquals(array(), $request->getCharsets()); // testing caching - - $request = new Request(); - $request->headers->set('Accept-Charset', 'ISO-8859-1, US-ASCII, UTF-8; q=0.8, ISO-10646-UCS-2; q=0.6'); - $this->assertEquals(array('ISO-8859-1', 'US-ASCII', 'UTF-8', 'ISO-10646-UCS-2'), $request->getCharsets()); - - $request = new Request(); - $request->headers->set('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'); - $this->assertEquals(array('ISO-8859-1', 'utf-8', '*'), $request->getCharsets()); - } - - public function testGetEncodings() - { - $request = new Request(); - $this->assertEquals(array(), $request->getEncodings()); - $request->headers->set('Accept-Encoding', 'gzip,deflate,sdch'); - $this->assertEquals(array(), $request->getEncodings()); // testing caching - - $request = new Request(); - $request->headers->set('Accept-Encoding', 'gzip,deflate,sdch'); - $this->assertEquals(array('gzip', 'deflate', 'sdch'), $request->getEncodings()); - - $request = new Request(); - $request->headers->set('Accept-Encoding', 'gzip;q=0.4,deflate;q=0.9,compress;q=0.7'); - $this->assertEquals(array('deflate', 'compress', 'gzip'), $request->getEncodings()); - } - - public function testGetAcceptableContentTypes() - { - $request = new Request(); - $this->assertEquals(array(), $request->getAcceptableContentTypes()); - $request->headers->set('Accept', 'application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*'); - $this->assertEquals(array(), $request->getAcceptableContentTypes()); // testing caching - - $request = new Request(); - $request->headers->set('Accept', 'application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*'); - $this->assertEquals(array('application/vnd.wap.wmlscriptc', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml', 'application/xhtml+xml', 'text/html', 'multipart/mixed', '*/*'), $request->getAcceptableContentTypes()); - } - - public function testGetLanguages() - { - $request = new Request(); - $this->assertEquals(array(), $request->getLanguages()); - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6'); - $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages()); - $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages()); - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, en-us; q=0.6, en; q=0.8'); - $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); // Test out of order qvalues - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, en, en-us'); - $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); // Test equal weighting without qvalues - - $request = new Request(); - $request->headers->set('Accept-language', 'zh; q=0.6, en, en-us; q=0.6'); - $this->assertEquals(array('en', 'zh', 'en_US'), $request->getLanguages()); // Test equal weighting with qvalues - - $request = new Request(); - $request->headers->set('Accept-language', 'zh, i-cherokee; q=0.6'); - $this->assertEquals(array('zh', 'cherokee'), $request->getLanguages()); - } - - public function testGetRequestFormat() - { - $request = new Request(); - $this->assertEquals('html', $request->getRequestFormat()); - - $request = new Request(); - $this->assertNull($request->getRequestFormat(null)); - - $request = new Request(); - $this->assertNull($request->setRequestFormat('foo')); - $this->assertEquals('foo', $request->getRequestFormat(null)); - } - - public function testHasSession() - { - $request = new Request(); - - $this->assertFalse($request->hasSession()); - $request->setSession(new Session(new MockArraySessionStorage())); - $this->assertTrue($request->hasSession()); - } - - public function testGetSession() - { - $request = new Request(); - - $request->setSession(new Session(new MockArraySessionStorage())); - $this->assertTrue($request->hasSession()); - - $session = $request->getSession(); - $this->assertObjectHasAttribute('storage', $session); - $this->assertObjectHasAttribute('flashName', $session); - $this->assertObjectHasAttribute('attributeName', $session); - } - - public function testHasPreviousSession() - { - $request = new Request(); - - $this->assertFalse($request->hasPreviousSession()); - $request->cookies->set('MOCKSESSID', 'foo'); - $this->assertFalse($request->hasPreviousSession()); - $request->setSession(new Session(new MockArraySessionStorage())); - $this->assertTrue($request->hasPreviousSession()); - } - - public function testToString() - { - $request = new Request(); - - $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6'); - - $this->assertContains('Accept-Language: zh, en-us; q=0.8, en; q=0.6', $request->__toString()); - } - - public function testIsMethod() - { - $request = new Request(); - $request->setMethod('POST'); - $this->assertTrue($request->isMethod('POST')); - $this->assertTrue($request->isMethod('post')); - $this->assertFalse($request->isMethod('GET')); - $this->assertFalse($request->isMethod('get')); - - $request->setMethod('GET'); - $this->assertTrue($request->isMethod('GET')); - $this->assertTrue($request->isMethod('get')); - $this->assertFalse($request->isMethod('POST')); - $this->assertFalse($request->isMethod('post')); - } - - /** - * @dataProvider getBaseUrlData - */ - public function testGetBaseUrl($uri, $server, $expectedBaseUrl, $expectedPathInfo) - { - $request = Request::create($uri, 'GET', array(), array(), array(), $server); - - $this->assertSame($expectedBaseUrl, $request->getBaseUrl(), 'baseUrl'); - $this->assertSame($expectedPathInfo, $request->getPathInfo(), 'pathInfo'); - } - - public function getBaseUrlData() - { - return array( - array( - '/foo%20bar', - array( - 'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php', - 'SCRIPT_NAME' => '/foo bar/app.php', - 'PHP_SELF' => '/foo bar/app.php', - ), - '/foo%20bar', - '/', - ), - array( - '/foo%20bar/home', - array( - 'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php', - 'SCRIPT_NAME' => '/foo bar/app.php', - 'PHP_SELF' => '/foo bar/app.php', - ), - '/foo%20bar', - '/home', - ), - array( - '/foo%20bar/app.php/home', - array( - 'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php', - 'SCRIPT_NAME' => '/foo bar/app.php', - 'PHP_SELF' => '/foo bar/app.php', - ), - '/foo%20bar/app.php', - '/home', - ), - array( - '/foo%20bar/app.php/home%3Dbaz', - array( - 'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php', - 'SCRIPT_NAME' => '/foo bar/app.php', - 'PHP_SELF' => '/foo bar/app.php', - ), - '/foo%20bar/app.php', - '/home%3Dbaz', - ), - array( - '/foo/bar+baz', - array( - 'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo/app.php', - 'SCRIPT_NAME' => '/foo/app.php', - 'PHP_SELF' => '/foo/app.php', - ), - '/foo', - '/bar+baz', - ), - ); - } - - /** - * @dataProvider urlencodedStringPrefixData - */ - public function testUrlencodedStringPrefix($string, $prefix, $expect) - { - $request = new Request(); - - $me = new \ReflectionMethod($request, 'getUrlencodedPrefix'); - $me->setAccessible(true); - - $this->assertSame($expect, $me->invoke($request, $string, $prefix)); - } - - public function urlencodedStringPrefixData() - { - return array( - array('foo', 'foo', 'foo'), - array('fo%6f', 'foo', 'fo%6f'), - array('foo/bar', 'foo', 'foo'), - array('fo%6f/bar', 'foo', 'fo%6f'), - array('f%6f%6f/bar', 'foo', 'f%6f%6f'), - array('%66%6F%6F/bar', 'foo', '%66%6F%6F'), - array('fo+o/bar', 'fo+o', 'fo+o'), - array('fo%2Bo/bar', 'fo+o', 'fo%2Bo'), - ); - } - - private function disableHttpMethodParameterOverride() - { - $class = new \ReflectionClass('Symfony\\Component\\HttpFoundation\\Request'); - $property = $class->getProperty('httpMethodParameterOverride'); - $property->setAccessible(true); - $property->setValue(false); - } - - private function getRequestInstanceForClientIpTests($remoteAddr, $httpForwardedFor, $trustedProxies) - { - $request = new Request(); - - $server = array('REMOTE_ADDR' => $remoteAddr); - if (null !== $httpForwardedFor) { - $server['HTTP_X_FORWARDED_FOR'] = $httpForwardedFor; - } - - if ($trustedProxies) { - Request::setTrustedProxies($trustedProxies); - } - - $request->initialize(array(), array(), array(), array(), array(), $server); - - return $request; - } - - public function testTrustedProxies() - { - $request = Request::create('http://example.com/'); - $request->server->set('REMOTE_ADDR', '3.3.3.3'); - $request->headers->set('X_FORWARDED_FOR', '1.1.1.1, 2.2.2.2'); - $request->headers->set('X_FORWARDED_HOST', 'foo.example.com, real.example.com:8080'); - $request->headers->set('X_FORWARDED_PROTO', 'https'); - $request->headers->set('X_FORWARDED_PORT', 443); - $request->headers->set('X_MY_FOR', '3.3.3.3, 4.4.4.4'); - $request->headers->set('X_MY_HOST', 'my.example.com'); - $request->headers->set('X_MY_PROTO', 'http'); - $request->headers->set('X_MY_PORT', 81); - - // no trusted proxies - $this->assertEquals('3.3.3.3', $request->getClientIp()); - $this->assertEquals('example.com', $request->getHost()); - $this->assertEquals(80, $request->getPort()); - $this->assertFalse($request->isSecure()); - - // disabling proxy trusting - Request::setTrustedProxies(array()); - $this->assertEquals('3.3.3.3', $request->getClientIp()); - $this->assertEquals('example.com', $request->getHost()); - $this->assertEquals(80, $request->getPort()); - $this->assertFalse($request->isSecure()); - - // trusted proxy via setTrustedProxies() - Request::setTrustedProxies(array('3.3.3.3', '2.2.2.2')); - $this->assertEquals('1.1.1.1', $request->getClientIp()); - $this->assertEquals('real.example.com', $request->getHost()); - $this->assertEquals(443, $request->getPort()); - $this->assertTrue($request->isSecure()); - - // check various X_FORWARDED_PROTO header values - $request->headers->set('X_FORWARDED_PROTO', 'ssl'); - $this->assertTrue($request->isSecure()); - - $request->headers->set('X_FORWARDED_PROTO', 'https, http'); - $this->assertTrue($request->isSecure()); - - // custom header names - Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X_MY_FOR'); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X_MY_HOST'); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X_MY_PORT'); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X_MY_PROTO'); - $this->assertEquals('4.4.4.4', $request->getClientIp()); - $this->assertEquals('my.example.com', $request->getHost()); - $this->assertEquals(81, $request->getPort()); - $this->assertFalse($request->isSecure()); - - // disabling via empty header names - Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, null); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, null); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, null); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, null); - $this->assertEquals('3.3.3.3', $request->getClientIp()); - $this->assertEquals('example.com', $request->getHost()); - $this->assertEquals(80, $request->getPort()); - $this->assertFalse($request->isSecure()); - - // reset - Request::setTrustedProxies(array()); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X_FORWARDED_FOR'); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X_FORWARDED_HOST'); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X_FORWARDED_PORT'); - Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X_FORWARDED_PROTO'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testSetTrustedProxiesInvalidHeaderName() - { - Request::create('http://example.com/'); - Request::setTrustedHeaderName('bogus name', 'X_MY_FOR'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testGetTrustedProxiesInvalidHeaderName() - { - Request::create('http://example.com/'); - Request::getTrustedHeaderName('bogus name'); - } - - /** - * @dataProvider iisRequestUriProvider - */ - public function testIISRequestUri($headers, $server, $expectedRequestUri) - { - $request = new Request(); - $request->headers->replace($headers); - $request->server->replace($server); - - $this->assertEquals($expectedRequestUri, $request->getRequestUri(), '->getRequestUri() is correct'); - - $subRequestUri = '/bar/foo'; - $subRequest = Request::create($subRequestUri, 'get', array(), array(), array(), $request->server->all()); - $this->assertEquals($subRequestUri, $subRequest->getRequestUri(), '->getRequestUri() is correct in sub request'); - } - - public function iisRequestUriProvider() - { - return array( - array( - array( - 'X_ORIGINAL_URL' => '/foo/bar', - ), - array(), - '/foo/bar' - ), - array( - array( - 'X_REWRITE_URL' => '/foo/bar', - ), - array(), - '/foo/bar' - ), - array( - array(), - array( - 'IIS_WasUrlRewritten' => '1', - 'UNENCODED_URL' => '/foo/bar' - ), - '/foo/bar' - ), - array( - array( - 'X_ORIGINAL_URL' => '/foo/bar', - ), - array( - 'HTTP_X_ORIGINAL_URL' => '/foo/bar' - ), - '/foo/bar' - ), - array( - array( - 'X_ORIGINAL_URL' => '/foo/bar', - ), - array( - 'IIS_WasUrlRewritten' => '1', - 'UNENCODED_URL' => '/foo/bar' - ), - '/foo/bar' - ), - array( - array( - 'X_ORIGINAL_URL' => '/foo/bar', - ), - array( - 'HTTP_X_ORIGINAL_URL' => '/foo/bar', - 'IIS_WasUrlRewritten' => '1', - 'UNENCODED_URL' => '/foo/bar' - ), - '/foo/bar' - ), - array( - array(), - array( - 'ORIG_PATH_INFO' => '/foo/bar', - ), - '/foo/bar' - ), - array( - array(), - array( - 'ORIG_PATH_INFO' => '/foo/bar', - 'QUERY_STRING' => 'foo=bar', - ), - '/foo/bar?foo=bar' - ) - ); - } - - public function testTrustedHosts() - { - // create a request - $request = Request::create('/'); - - // no trusted host set -> no host check - $request->headers->set('host', 'evil.com'); - $this->assertEquals('evil.com', $request->getHost()); - - // add a trusted domain and all its subdomains - Request::setTrustedHosts(array('.*\.?trusted.com$')); - - // untrusted host - $request->headers->set('host', 'evil.com'); - try { - $request->getHost(); - $this->fail('Request::getHost() should throw an exception when host is not trusted.'); - } catch (\UnexpectedValueException $e) { - $this->assertEquals('Untrusted Host "evil.com"', $e->getMessage()); - } - - // trusted hosts - $request->headers->set('host', 'trusted.com'); - $this->assertEquals('trusted.com', $request->getHost()); - $this->assertEquals(80, $request->getPort()); - - $request->server->set('HTTPS', true); - $request->headers->set('host', 'trusted.com'); - $this->assertEquals('trusted.com', $request->getHost()); - $this->assertEquals(443, $request->getPort()); - $request->server->set('HTTPS', false); - - $request->headers->set('host', 'trusted.com:8000'); - $this->assertEquals('trusted.com', $request->getHost()); - $this->assertEquals(8000, $request->getPort()); - - $request->headers->set('host', 'subdomain.trusted.com'); - $this->assertEquals('subdomain.trusted.com', $request->getHost()); - - // reset request for following tests - Request::setTrustedHosts(array()); - } - - public function testFactory() - { - Request::setFactory(function (array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) { - return new NewRequest(); - }); - - $this->assertEquals('foo', Request::create('/')->getFoo()); - - Request::setFactory(null); - } -} - -class RequestContentProxy extends Request -{ - public function getContent($asResource = false) - { - return http_build_query(array('_method' => 'PUT', 'content' => 'mycontent')); - } -} - -class NewRequest extends Request -{ - public function getFoo() - { - return 'foo'; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php deleted file mode 100644 index 1cb327860d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseHeaderBagTest.php +++ /dev/null @@ -1,286 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\ResponseHeaderBag; -use Symfony\Component\HttpFoundation\Cookie; - -class ResponseHeaderBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Symfony\Component\HttpFoundation\ResponseHeaderBag::allPreserveCase - * @dataProvider provideAllPreserveCase - */ - public function testAllPreserveCase($headers, $expected) - { - $bag = new ResponseHeaderBag($headers); - - $this->assertEquals($expected, $bag->allPreserveCase(), '->allPreserveCase() gets all input keys in original case'); - } - - public function provideAllPreserveCase() - { - return array( - array( - array('fOo' => 'BAR'), - array('fOo' => array('BAR'), 'Cache-Control' => array('no-cache')) - ), - array( - array('ETag' => 'xyzzy'), - array('ETag' => array('xyzzy'), 'Cache-Control' => array('private, must-revalidate')) - ), - array( - array('Content-MD5' => 'Q2hlY2sgSW50ZWdyaXR5IQ=='), - array('Content-MD5' => array('Q2hlY2sgSW50ZWdyaXR5IQ=='), 'Cache-Control' => array('no-cache')) - ), - array( - array('P3P' => 'CP="CAO PSA OUR"'), - array('P3P' => array('CP="CAO PSA OUR"'), 'Cache-Control' => array('no-cache')) - ), - array( - array('WWW-Authenticate' => 'Basic realm="WallyWorld"'), - array('WWW-Authenticate' => array('Basic realm="WallyWorld"'), 'Cache-Control' => array('no-cache')) - ), - array( - array('X-UA-Compatible' => 'IE=edge,chrome=1'), - array('X-UA-Compatible' => array('IE=edge,chrome=1'), 'Cache-Control' => array('no-cache')) - ), - array( - array('X-XSS-Protection' => '1; mode=block'), - array('X-XSS-Protection' => array('1; mode=block'), 'Cache-Control' => array('no-cache')) - ), - ); - } - - public function testCacheControlHeader() - { - $bag = new ResponseHeaderBag(array()); - $this->assertEquals('no-cache', $bag->get('Cache-Control')); - $this->assertTrue($bag->hasCacheControlDirective('no-cache')); - - $bag = new ResponseHeaderBag(array('Cache-Control' => 'public')); - $this->assertEquals('public', $bag->get('Cache-Control')); - $this->assertTrue($bag->hasCacheControlDirective('public')); - - $bag = new ResponseHeaderBag(array('ETag' => 'abcde')); - $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control')); - $this->assertTrue($bag->hasCacheControlDirective('private')); - $this->assertTrue($bag->hasCacheControlDirective('must-revalidate')); - $this->assertFalse($bag->hasCacheControlDirective('max-age')); - - $bag = new ResponseHeaderBag(array('Expires' => 'Wed, 16 Feb 2011 14:17:43 GMT')); - $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(array( - 'Expires' => 'Wed, 16 Feb 2011 14:17:43 GMT', - 'Cache-Control' => 'max-age=3600' - )); - $this->assertEquals('max-age=3600, private', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(array('Last-Modified' => 'abcde')); - $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(array('Etag' => 'abcde', 'Last-Modified' => 'abcde')); - $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(array('cache-control' => 'max-age=100')); - $this->assertEquals('max-age=100, private', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(array('cache-control' => 's-maxage=100')); - $this->assertEquals('s-maxage=100', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(array('cache-control' => 'private, max-age=100')); - $this->assertEquals('max-age=100, private', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(array('cache-control' => 'public, max-age=100')); - $this->assertEquals('max-age=100, public', $bag->get('Cache-Control')); - - $bag = new ResponseHeaderBag(); - $bag->set('Last-Modified', 'abcde'); - $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control')); - } - - public function testToStringIncludesCookieHeaders() - { - $bag = new ResponseHeaderBag(array()); - $bag->setCookie(new Cookie('foo', 'bar')); - - $this->assertContains("Set-Cookie: foo=bar; path=/; httponly", explode("\r\n", $bag->__toString())); - - $bag->clearCookie('foo'); - - $this->assertContains("Set-Cookie: foo=deleted; expires=".gmdate("D, d-M-Y H:i:s T", time() - 31536001)."; path=/; httponly", explode("\r\n", $bag->__toString())); - } - - public function testReplace() - { - $bag = new ResponseHeaderBag(array()); - $this->assertEquals('no-cache', $bag->get('Cache-Control')); - $this->assertTrue($bag->hasCacheControlDirective('no-cache')); - - $bag->replace(array('Cache-Control' => 'public')); - $this->assertEquals('public', $bag->get('Cache-Control')); - $this->assertTrue($bag->hasCacheControlDirective('public')); - } - - public function testReplaceWithRemove() - { - $bag = new ResponseHeaderBag(array()); - $this->assertEquals('no-cache', $bag->get('Cache-Control')); - $this->assertTrue($bag->hasCacheControlDirective('no-cache')); - - $bag->remove('Cache-Control'); - $bag->replace(array()); - $this->assertEquals('no-cache', $bag->get('Cache-Control')); - $this->assertTrue($bag->hasCacheControlDirective('no-cache')); - } - - public function testCookiesWithSameNames() - { - $bag = new ResponseHeaderBag(); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/foo', 'foo.bar')); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/bar', 'foo.bar')); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/bar', 'bar.foo')); - $bag->setCookie(new Cookie('foo', 'bar')); - - $this->assertCount(4, $bag->getCookies()); - - $headers = explode("\r\n", $bag->__toString()); - $this->assertContains("Set-Cookie: foo=bar; path=/path/foo; domain=foo.bar; httponly", $headers); - $this->assertContains("Set-Cookie: foo=bar; path=/path/foo; domain=foo.bar; httponly", $headers); - $this->assertContains("Set-Cookie: foo=bar; path=/path/bar; domain=bar.foo; httponly", $headers); - $this->assertContains("Set-Cookie: foo=bar; path=/; httponly", $headers); - - $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); - $this->assertTrue(isset($cookies['foo.bar']['/path/foo']['foo'])); - $this->assertTrue(isset($cookies['foo.bar']['/path/bar']['foo'])); - $this->assertTrue(isset($cookies['bar.foo']['/path/bar']['foo'])); - $this->assertTrue(isset($cookies['']['/']['foo'])); - } - - public function testRemoveCookie() - { - $bag = new ResponseHeaderBag(); - $bag->setCookie(new Cookie('foo', 'bar', 0, '/path/foo', 'foo.bar')); - $bag->setCookie(new Cookie('bar', 'foo', 0, '/path/bar', 'foo.bar')); - - $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); - $this->assertTrue(isset($cookies['foo.bar']['/path/foo'])); - - $bag->removeCookie('foo', '/path/foo', 'foo.bar'); - - $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); - $this->assertFalse(isset($cookies['foo.bar']['/path/foo'])); - - $bag->removeCookie('bar', '/path/bar', 'foo.bar'); - - $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); - $this->assertFalse(isset($cookies['foo.bar'])); - } - - public function testRemoveCookieWithNullRemove() - { - $bag = new ResponseHeaderBag(); - $bag->setCookie(new Cookie('foo', 'bar', 0)); - $bag->setCookie(new Cookie('bar', 'foo', 0)); - - $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); - $this->assertTrue(isset($cookies['']['/'])); - - $bag->removeCookie('foo', null); - $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); - $this->assertFalse(isset($cookies['']['/']['foo'])); - - $bag->removeCookie('bar', null); - $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY); - $this->assertFalse(isset($cookies['']['/']['bar'])); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testGetCookiesWithInvalidArgument() - { - $bag = new ResponseHeaderBag(); - - $cookies = $bag->getCookies('invalid_argument'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testMakeDispositionInvalidDisposition() - { - $headers = new ResponseHeaderBag(); - - $headers->makeDisposition('invalid', 'foo.html'); - } - - /** - * @dataProvider provideMakeDisposition - */ - public function testMakeDisposition($disposition, $filename, $filenameFallback, $expected) - { - $headers = new ResponseHeaderBag(); - - $this->assertEquals($expected, $headers->makeDisposition($disposition, $filename, $filenameFallback)); - } - - public function testToStringDoesntMessUpHeaders() - { - $headers = new ResponseHeaderBag(); - - $headers->set('Location', 'http://www.symfony.com'); - $headers->set('Content-type', 'text/html'); - - (string) $headers; - - $allHeaders = $headers->allPreserveCase(); - $this->assertEquals(array('http://www.symfony.com'), $allHeaders['Location']); - $this->assertEquals(array('text/html'), $allHeaders['Content-type']); - } - - public function provideMakeDisposition() - { - return array( - array('attachment', 'foo.html', 'foo.html', 'attachment; filename="foo.html"'), - array('attachment', 'foo.html', '', 'attachment; filename="foo.html"'), - array('attachment', 'foo bar.html', '', 'attachment; filename="foo bar.html"'), - array('attachment', 'foo "bar".html', '', 'attachment; filename="foo \\"bar\\".html"'), - array('attachment', 'foo%20bar.html', 'foo bar.html', 'attachment; filename="foo bar.html"; filename*=utf-8\'\'foo%2520bar.html'), - array('attachment', 'föö.html', 'foo.html', 'attachment; filename="foo.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html'), - ); - } - - /** - * @dataProvider provideMakeDispositionFail - * @expectedException \InvalidArgumentException - */ - public function testMakeDispositionFail($disposition, $filename) - { - $headers = new ResponseHeaderBag(); - - $headers->makeDisposition($disposition, $filename); - } - - public function provideMakeDispositionFail() - { - return array( - array('attachment', 'foo%20bar.html'), - array('attachment', 'foo/bar.html'), - array('attachment', '/foo.html'), - array('attachment', 'foo\bar.html'), - array('attachment', '\foo.html'), - array('attachment', 'föö.html'), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php deleted file mode 100644 index 11eb38c723..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTest.php +++ /dev/null @@ -1,807 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; - -class ResponseTest extends ResponseTestCase -{ - public function testCreate() - { - $response = Response::create('foo', 301, array('Foo' => 'bar')); - - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response); - $this->assertEquals(301, $response->getStatusCode()); - $this->assertEquals('bar', $response->headers->get('foo')); - } - - public function testToString() - { - $response = new Response(); - $response = explode("\r\n", $response); - $this->assertEquals("HTTP/1.0 200 OK", $response[0]); - $this->assertEquals("Cache-Control: no-cache", $response[1]); - } - - public function testClone() - { - $response = new Response(); - $responseClone = clone $response; - $this->assertEquals($response, $responseClone); - } - - public function testSendHeaders() - { - $response = new Response(); - $headers = $response->sendHeaders(); - $this->assertObjectHasAttribute('headers', $headers); - $this->assertObjectHasAttribute('content', $headers); - $this->assertObjectHasAttribute('version', $headers); - $this->assertObjectHasAttribute('statusCode', $headers); - $this->assertObjectHasAttribute('statusText', $headers); - $this->assertObjectHasAttribute('charset', $headers); - } - - public function testSend() - { - $response = new Response(); - $responseSend = $response->send(); - $this->assertObjectHasAttribute('headers', $responseSend); - $this->assertObjectHasAttribute('content', $responseSend); - $this->assertObjectHasAttribute('version', $responseSend); - $this->assertObjectHasAttribute('statusCode', $responseSend); - $this->assertObjectHasAttribute('statusText', $responseSend); - $this->assertObjectHasAttribute('charset', $responseSend); - } - - public function testGetCharset() - { - $response = new Response(); - $charsetOrigin = 'UTF-8'; - $response->setCharset($charsetOrigin); - $charset = $response->getCharset(); - $this->assertEquals($charsetOrigin, $charset); - } - - public function testIsCacheable() - { - $response = new Response(); - $this->assertFalse($response->isCacheable()); - } - - public function testIsCacheableWithErrorCode() - { - $response = new Response('', 500); - $this->assertFalse($response->isCacheable()); - } - - public function testIsCacheableWithNoStoreDirective() - { - $response = new Response(); - $response->headers->set('cache-control', 'private'); - $this->assertFalse($response->isCacheable()); - } - - public function testIsCacheableWithSetTtl() - { - $response = new Response(); - $response->setTtl(10); - $this->assertTrue($response->isCacheable()); - } - - public function testMustRevalidate() - { - $response = new Response(); - $this->assertFalse($response->mustRevalidate()); - } - - public function testSetNotModified() - { - $response = new Response(); - $modified = $response->setNotModified(); - $this->assertObjectHasAttribute('headers', $modified); - $this->assertObjectHasAttribute('content', $modified); - $this->assertObjectHasAttribute('version', $modified); - $this->assertObjectHasAttribute('statusCode', $modified); - $this->assertObjectHasAttribute('statusText', $modified); - $this->assertObjectHasAttribute('charset', $modified); - $this->assertEquals(304, $modified->getStatusCode()); - } - - public function testIsSuccessful() - { - $response = new Response(); - $this->assertTrue($response->isSuccessful()); - } - - public function testIsNotModified() - { - $response = new Response(); - $modified = $response->isNotModified(new Request()); - $this->assertFalse($modified); - } - - public function testIsNotModifiedNotSafe() - { - $request = Request::create('/homepage', 'POST'); - - $response = new Response(); - $this->assertFalse($response->isNotModified($request)); - } - - public function testIsNotModifiedLastModified() - { - $modified = 'Sun, 25 Aug 2013 18:33:31 GMT'; - - $request = new Request(); - $request->headers->set('If-Modified-Since', $modified); - - $response = new Response(); - $response->headers->set('Last-Modified', $modified); - - $this->assertTrue($response->isNotModified($request)); - - $response->headers->set('Last-Modified', ''); - $this->assertFalse($response->isNotModified($request)); - } - - public function testIsNotModifiedEtag() - { - $etagOne = 'randomly_generated_etag'; - $etagTwo = 'randomly_generated_etag_2'; - - $request = new Request(); - $request->headers->set('if_none_match', sprintf('%s, %s, %s', $etagOne, $etagTwo, 'etagThree')); - - $response = new Response(); - - $response->headers->set('ETag', $etagOne); - $this->assertTrue($response->isNotModified($request)); - - $response->headers->set('ETag', $etagTwo); - $this->assertTrue($response->isNotModified($request)); - - $response->headers->set('ETag', ''); - $this->assertFalse($response->isNotModified($request)); - } - - public function testIsValidateable() - { - $response = new Response('', 200, array('Last-Modified' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822))); - $this->assertTrue($response->isValidateable(), '->isValidateable() returns true if Last-Modified is present'); - - $response = new Response('', 200, array('ETag' => '"12345"')); - $this->assertTrue($response->isValidateable(), '->isValidateable() returns true if ETag is present'); - - $response = new Response(); - $this->assertFalse($response->isValidateable(), '->isValidateable() returns false when no validator is present'); - } - - public function testGetDate() - { - $response = new Response('', 200, array('Date' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822))); - $this->assertEquals(0, $this->createDateTimeOneHourAgo()->diff($response->getDate())->format('%s'), '->getDate() returns the Date header if present'); - - $response = new Response(); - $date = $response->getDate(); - $this->assertLessThan(1, $date->diff(new \DateTime(), true)->format('%s'), '->getDate() returns the current Date if no Date header present'); - - $response = new Response('', 200, array('Date' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822))); - $now = $this->createDateTimeNow(); - $response->headers->set('Date', $now->format(DATE_RFC2822)); - $this->assertEquals(0, $now->diff($response->getDate())->format('%s'), '->getDate() returns the date when the header has been modified'); - - $response = new Response('', 200); - $response->headers->remove('Date'); - $this->assertInstanceOf('\DateTime', $response->getDate()); - } - - public function testGetMaxAge() - { - $response = new Response(); - $response->headers->set('Cache-Control', 's-maxage=600, max-age=0'); - $this->assertEquals(600, $response->getMaxAge(), '->getMaxAge() uses s-maxage cache control directive when present'); - - $response = new Response(); - $response->headers->set('Cache-Control', 'max-age=600'); - $this->assertEquals(600, $response->getMaxAge(), '->getMaxAge() falls back to max-age when no s-maxage directive present'); - - $response = new Response(); - $response->headers->set('Cache-Control', 'must-revalidate'); - $response->headers->set('Expires', $this->createDateTimeOneHourLater()->format(DATE_RFC2822)); - $this->assertEquals(3600, $response->getMaxAge(), '->getMaxAge() falls back to Expires when no max-age or s-maxage directive present'); - - $response = new Response(); - $response->headers->set('Cache-Control', 'must-revalidate'); - $response->headers->set('Expires', -1); - $this->assertEquals('Sat, 01 Jan 00 00:00:00 +0000', $response->getExpires()->format(DATE_RFC822)); - - $response = new Response(); - $this->assertNull($response->getMaxAge(), '->getMaxAge() returns null if no freshness information available'); - } - - public function testSetSharedMaxAge() - { - $response = new Response(); - $response->setSharedMaxAge(20); - - $cacheControl = $response->headers->get('Cache-Control'); - $this->assertEquals('public, s-maxage=20', $cacheControl); - } - - public function testIsPrivate() - { - $response = new Response(); - $response->headers->set('Cache-Control', 'max-age=100'); - $response->setPrivate(); - $this->assertEquals(100, $response->headers->getCacheControlDirective('max-age'), '->isPrivate() adds the private Cache-Control directive when set to true'); - $this->assertTrue($response->headers->getCacheControlDirective('private'), '->isPrivate() adds the private Cache-Control directive when set to true'); - - $response = new Response(); - $response->headers->set('Cache-Control', 'public, max-age=100'); - $response->setPrivate(); - $this->assertEquals(100, $response->headers->getCacheControlDirective('max-age'), '->isPrivate() adds the private Cache-Control directive when set to true'); - $this->assertTrue($response->headers->getCacheControlDirective('private'), '->isPrivate() adds the private Cache-Control directive when set to true'); - $this->assertFalse($response->headers->hasCacheControlDirective('public'), '->isPrivate() removes the public Cache-Control directive'); - } - - public function testExpire() - { - $response = new Response(); - $response->headers->set('Cache-Control', 'max-age=100'); - $response->expire(); - $this->assertEquals(100, $response->headers->get('Age'), '->expire() sets the Age to max-age when present'); - - $response = new Response(); - $response->headers->set('Cache-Control', 'max-age=100, s-maxage=500'); - $response->expire(); - $this->assertEquals(500, $response->headers->get('Age'), '->expire() sets the Age to s-maxage when both max-age and s-maxage are present'); - - $response = new Response(); - $response->headers->set('Cache-Control', 'max-age=5, s-maxage=500'); - $response->headers->set('Age', '1000'); - $response->expire(); - $this->assertEquals(1000, $response->headers->get('Age'), '->expire() does nothing when the response is already stale/expired'); - - $response = new Response(); - $response->expire(); - $this->assertFalse($response->headers->has('Age'), '->expire() does nothing when the response does not include freshness information'); - - $response = new Response(); - $response->headers->set('Expires', -1); - $response->expire(); - $this->assertNull($response->headers->get('Age'), '->expire() does not set the Age when the response is expired'); - } - - public function testGetTtl() - { - $response = new Response(); - $this->assertNull($response->getTtl(), '->getTtl() returns null when no Expires or Cache-Control headers are present'); - - $response = new Response(); - $response->headers->set('Expires', $this->createDateTimeOneHourLater()->format(DATE_RFC2822)); - $this->assertLessThan(1, 3600 - $response->getTtl(), '->getTtl() uses the Expires header when no max-age is present'); - - $response = new Response(); - $response->headers->set('Expires', $this->createDateTimeOneHourAgo()->format(DATE_RFC2822)); - $this->assertLessThan(0, $response->getTtl(), '->getTtl() returns negative values when Expires is in past'); - - $response = new Response(); - $response->headers->set('Expires', $response->getDate()->format(DATE_RFC2822)); - $response->headers->set('Age', 0); - $this->assertSame(0, $response->getTtl(), '->getTtl() correctly handles zero'); - - $response = new Response(); - $response->headers->set('Cache-Control', 'max-age=60'); - $this->assertLessThan(1, 60 - $response->getTtl(), '->getTtl() uses Cache-Control max-age when present'); - } - - public function testSetClientTtl() - { - $response = new Response(); - $response->setClientTtl(10); - - $this->assertEquals($response->getMaxAge(), $response->getAge() + 10); - } - - public function testGetSetProtocolVersion() - { - $response = new Response(); - - $this->assertEquals('1.0', $response->getProtocolVersion()); - - $response->setProtocolVersion('1.1'); - - $this->assertEquals('1.1', $response->getProtocolVersion()); - } - - public function testGetVary() - { - $response = new Response(); - $this->assertEquals(array(), $response->getVary(), '->getVary() returns an empty array if no Vary header is present'); - - $response = new Response(); - $response->headers->set('Vary', 'Accept-Language'); - $this->assertEquals(array('Accept-Language'), $response->getVary(), '->getVary() parses a single header name value'); - - $response = new Response(); - $response->headers->set('Vary', 'Accept-Language User-Agent X-Foo'); - $this->assertEquals(array('Accept-Language', 'User-Agent', 'X-Foo'), $response->getVary(), '->getVary() parses multiple header name values separated by spaces'); - - $response = new Response(); - $response->headers->set('Vary', 'Accept-Language,User-Agent, X-Foo'); - $this->assertEquals(array('Accept-Language', 'User-Agent', 'X-Foo'), $response->getVary(), '->getVary() parses multiple header name values separated by commas'); - } - - public function testSetVary() - { - $response = new Response(); - $response->setVary('Accept-Language'); - $this->assertEquals(array('Accept-Language'), $response->getVary()); - - $response->setVary('Accept-Language, User-Agent'); - $this->assertEquals(array('Accept-Language', 'User-Agent'), $response->getVary(), '->setVary() replace the vary header by default'); - - $response->setVary('X-Foo', false); - $this->assertEquals(array('Accept-Language', 'User-Agent'), $response->getVary(), '->setVary() doesn\'t change the Vary header if replace is set to false'); - } - - public function testDefaultContentType() - { - $headerMock = $this->getMock('Symfony\Component\HttpFoundation\ResponseHeaderBag', array('set')); - $headerMock->expects($this->at(0)) - ->method('set') - ->with('Content-Type', 'text/html'); - $headerMock->expects($this->at(1)) - ->method('set') - ->with('Content-Type', 'text/html; charset=UTF-8'); - - $response = new Response('foo'); - $response->headers = $headerMock; - - $response->prepare(new Request()); - } - - public function testContentTypeCharset() - { - $response = new Response(); - $response->headers->set('Content-Type', 'text/css'); - - // force fixContentType() to be called - $response->prepare(new Request()); - - $this->assertEquals('text/css; charset=UTF-8', $response->headers->get('Content-Type')); - } - - public function testPrepareDoesNothingIfContentTypeIsSet() - { - $response = new Response('foo'); - $response->headers->set('Content-Type', 'text/plain'); - - $response->prepare(new Request()); - - $this->assertEquals('text/plain; charset=UTF-8', $response->headers->get('content-type')); - } - - public function testPrepareDoesNothingIfRequestFormatIsNotDefined() - { - $response = new Response('foo'); - - $response->prepare(new Request()); - - $this->assertEquals('text/html; charset=UTF-8', $response->headers->get('content-type')); - } - - public function testPrepareSetContentType() - { - $response = new Response('foo'); - $request = Request::create('/'); - $request->setRequestFormat('json'); - - $response->prepare($request); - - $this->assertEquals('application/json', $response->headers->get('content-type')); - } - - public function testPrepareRemovesContentForHeadRequests() - { - $response = new Response('foo'); - $request = Request::create('/', 'HEAD'); - - $length = 12345; - $response->headers->set('Content-Length', $length); - $response->prepare($request); - - $this->assertEquals('', $response->getContent()); - $this->assertEquals($length, $response->headers->get('Content-Length'), 'Content-Length should be as if it was GET; see RFC2616 14.13'); - } - - public function testPrepareRemovesContentForInformationalResponse() - { - $response = new Response('foo'); - $request = Request::create('/'); - - $response->setContent('content'); - $response->setStatusCode(101); - $response->prepare($request); - $this->assertEquals('', $response->getContent()); - - $response->setContent('content'); - $response->setStatusCode(304); - $response->prepare($request); - $this->assertEquals('', $response->getContent()); - } - - public function testPrepareRemovesContentLength() - { - $response = new Response('foo'); - $request = Request::create('/'); - - $response->headers->set('Content-Length', 12345); - $response->prepare($request); - $this->assertEquals(12345, $response->headers->get('Content-Length')); - - $response->headers->set('Transfer-Encoding', 'chunked'); - $response->prepare($request); - $this->assertFalse($response->headers->has('Content-Length')); - } - - public function testPrepareSetsPragmaOnHttp10Only() - { - $request = Request::create('/', 'GET'); - $request->server->set('SERVER_PROTOCOL', 'HTTP/1.0'); - - $response = new Response('foo'); - $response->prepare($request); - $this->assertEquals('no-cache', $response->headers->get('pragma')); - $this->assertEquals('-1', $response->headers->get('expires')); - - $request->server->set('SERVER_PROTOCOL', 'HTTP/1.1'); - $response = new Response('foo'); - $response->prepare($request); - $this->assertFalse($response->headers->has('pragma')); - $this->assertFalse($response->headers->has('expires')); - } - - public function testSetCache() - { - $response = new Response(); - //array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public') - try { - $response->setCache(array("wrong option" => "value")); - $this->fail('->setCache() throws an InvalidArgumentException if an option is not supported'); - } catch (\Exception $e) { - $this->assertInstanceOf('InvalidArgumentException', $e, '->setCache() throws an InvalidArgumentException if an option is not supported'); - $this->assertContains('"wrong option"', $e->getMessage()); - } - - $options = array('etag' => '"whatever"'); - $response->setCache($options); - $this->assertEquals($response->getEtag(), '"whatever"'); - - $now = new \DateTime(); - $options = array('last_modified' => $now); - $response->setCache($options); - $this->assertEquals($response->getLastModified()->getTimestamp(), $now->getTimestamp()); - - $options = array('max_age' => 100); - $response->setCache($options); - $this->assertEquals($response->getMaxAge(), 100); - - $options = array('s_maxage' => 200); - $response->setCache($options); - $this->assertEquals($response->getMaxAge(), 200); - - $this->assertTrue($response->headers->hasCacheControlDirective('public')); - $this->assertFalse($response->headers->hasCacheControlDirective('private')); - - $response->setCache(array('public' => true)); - $this->assertTrue($response->headers->hasCacheControlDirective('public')); - $this->assertFalse($response->headers->hasCacheControlDirective('private')); - - $response->setCache(array('public' => false)); - $this->assertFalse($response->headers->hasCacheControlDirective('public')); - $this->assertTrue($response->headers->hasCacheControlDirective('private')); - - $response->setCache(array('private' => true)); - $this->assertFalse($response->headers->hasCacheControlDirective('public')); - $this->assertTrue($response->headers->hasCacheControlDirective('private')); - - $response->setCache(array('private' => false)); - $this->assertTrue($response->headers->hasCacheControlDirective('public')); - $this->assertFalse($response->headers->hasCacheControlDirective('private')); - } - - public function testSendContent() - { - $response = new Response('test response rendering', 200); - - ob_start(); - $response->sendContent(); - $string = ob_get_clean(); - $this->assertContains('test response rendering', $string); - } - - public function testSetPublic() - { - $response = new Response(); - $response->setPublic(); - - $this->assertTrue($response->headers->hasCacheControlDirective('public')); - $this->assertFalse($response->headers->hasCacheControlDirective('private')); - } - - public function testSetExpires() - { - $response = new Response(); - $response->setExpires(null); - - $this->assertNull($response->getExpires(), '->setExpires() remove the header when passed null'); - - $now = new \DateTime(); - $response->setExpires($now); - - $this->assertEquals($response->getExpires()->getTimestamp(), $now->getTimestamp()); - } - - public function testSetLastModified() - { - $response = new Response(); - $response->setLastModified(new \DateTime()); - $this->assertNotNull($response->getLastModified()); - - $response->setLastModified(null); - $this->assertNull($response->getLastModified()); - } - - public function testIsInvalid() - { - $response = new Response(); - - try { - $response->setStatusCode(99); - $this->fail(); - } catch (\InvalidArgumentException $e) { - $this->assertTrue($response->isInvalid()); - } - - try { - $response->setStatusCode(650); - $this->fail(); - } catch (\InvalidArgumentException $e) { - $this->assertTrue($response->isInvalid()); - } - - $response = new Response('', 200); - $this->assertFalse($response->isInvalid()); - } - - /** - * @dataProvider getStatusCodeFixtures - */ - public function testSetStatusCode($code, $text, $expectedText) - { - $response = new Response(); - - $response->setStatusCode($code, $text); - - $statusText = new \ReflectionProperty($response, 'statusText'); - $statusText->setAccessible(true); - - $this->assertEquals($expectedText, $statusText->getValue($response)); - } - - public function getStatusCodeFixtures() - { - return array( - array('200', null, 'OK'), - array('200', false, ''), - array('200', 'foo', 'foo'), - array('199', null, ''), - array('199', false, ''), - array('199', 'foo', 'foo') - ); - } - - public function testIsInformational() - { - $response = new Response('', 100); - $this->assertTrue($response->isInformational()); - - $response = new Response('', 200); - $this->assertFalse($response->isInformational()); - } - - public function testIsRedirectRedirection() - { - foreach (array(301, 302, 303, 307) as $code) { - $response = new Response('', $code); - $this->assertTrue($response->isRedirection()); - $this->assertTrue($response->isRedirect()); - } - - $response = new Response('', 304); - $this->assertTrue($response->isRedirection()); - $this->assertFalse($response->isRedirect()); - - $response = new Response('', 200); - $this->assertFalse($response->isRedirection()); - $this->assertFalse($response->isRedirect()); - - $response = new Response('', 404); - $this->assertFalse($response->isRedirection()); - $this->assertFalse($response->isRedirect()); - - $response = new Response('', 301, array('Location' => '/good-uri')); - $this->assertFalse($response->isRedirect('/bad-uri')); - $this->assertTrue($response->isRedirect('/good-uri')); - } - - public function testIsNotFound() - { - $response = new Response('', 404); - $this->assertTrue($response->isNotFound()); - - $response = new Response('', 200); - $this->assertFalse($response->isNotFound()); - } - - public function testIsEmpty() - { - foreach (array(201, 204, 304) as $code) { - $response = new Response('', $code); - $this->assertTrue($response->isEmpty()); - } - - $response = new Response('', 200); - $this->assertFalse($response->isEmpty()); - } - - public function testIsForbidden() - { - $response = new Response('', 403); - $this->assertTrue($response->isForbidden()); - - $response = new Response('', 200); - $this->assertFalse($response->isForbidden()); - } - - public function testIsOk() - { - $response = new Response('', 200); - $this->assertTrue($response->isOk()); - - $response = new Response('', 404); - $this->assertFalse($response->isOk()); - } - - public function testIsServerOrClientError() - { - $response = new Response('', 404); - $this->assertTrue($response->isClientError()); - $this->assertFalse($response->isServerError()); - - $response = new Response('', 500); - $this->assertFalse($response->isClientError()); - $this->assertTrue($response->isServerError()); - } - - public function testHasVary() - { - $response = new Response(); - $this->assertFalse($response->hasVary()); - - $response->setVary('User-Agent'); - $this->assertTrue($response->hasVary()); - } - - public function testSetEtag() - { - $response = new Response('', 200, array('ETag' => '"12345"')); - $response->setEtag(); - - $this->assertNull($response->headers->get('Etag'), '->setEtag() removes Etags when call with null'); - } - - /** - * @dataProvider validContentProvider - */ - public function testSetContent($content) - { - $response = new Response(); - $response->setContent($content); - $this->assertEquals((string) $content, $response->getContent()); - } - - /** - * @expectedException \UnexpectedValueException - * @dataProvider invalidContentProvider - */ - public function testSetContentInvalid($content) - { - $response = new Response(); - $response->setContent($content); - } - - public function testSettersAreChainable() - { - $response = new Response(); - - $setters = array( - 'setProtocolVersion' => '1.0', - 'setCharset' => 'UTF-8', - 'setPublic' => null, - 'setPrivate' => null, - 'setDate' => new \DateTime, - 'expire' => null, - 'setMaxAge' => 1, - 'setSharedMaxAge' => 1, - 'setTtl' => 1, - 'setClientTtl' => 1, - ); - - foreach ($setters as $setter => $arg) { - $this->assertEquals($response, $response->{$setter}($arg)); - } - } - - public function validContentProvider() - { - return array( - 'obj' => array(new StringableObject()), - 'string' => array('Foo'), - 'int' => array(2), - ); - } - - public function invalidContentProvider() - { - return array( - 'obj' => array(new \stdClass), - 'array' => array(array()), - 'bool' => array(true, '1'), - ); - } - - protected function createDateTimeOneHourAgo() - { - $date = new \DateTime(); - - return $date->sub(new \DateInterval('PT1H')); - } - - protected function createDateTimeOneHourLater() - { - $date = new \DateTime(); - - return $date->add(new \DateInterval('PT1H')); - } - - protected function createDateTimeNow() - { - return new \DateTime(); - } - - protected function provideResponse() - { - return new Response(); - } -} - -class StringableObject -{ - public function __toString() - { - return 'Foo'; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php deleted file mode 100644 index 94c770a894..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ResponseTestCase.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\Request; - -abstract class ResponseTestCase extends \PHPUnit_Framework_TestCase -{ - public function testNoCacheControlHeaderOnAttachmentUsingHTTPSAndMSIE() - { - // Check for HTTPS and IE 8 - $request = new Request(); - $request->server->set('HTTPS', true); - $request->server->set('HTTP_USER_AGENT', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'); - - $response = $this->provideResponse(); - $response->headers->set('Content-Disposition', 'attachment; filename="fname.ext"'); - $response->prepare($request); - - $this->assertFalse($response->headers->has('Cache-Control')); - - // Check for IE 10 and HTTPS - $request->server->set('HTTP_USER_AGENT', 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'); - - $response = $this->provideResponse(); - $response->headers->set('Content-Disposition', 'attachment; filename="fname.ext"'); - $response->prepare($request); - - $this->assertTrue($response->headers->has('Cache-Control')); - - // Check for IE 9 and HTTPS - $request->server->set('HTTP_USER_AGENT', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)'); - - $response = $this->provideResponse(); - $response->headers->set('Content-Disposition', 'attachment; filename="fname.ext"'); - $response->prepare($request); - - $this->assertTrue($response->headers->has('Cache-Control')); - - // Check for IE 9 and HTTP - $request->server->set('HTTPS', false); - - $response = $this->provideResponse(); - $response->headers->set('Content-Disposition', 'attachment; filename="fname.ext"'); - $response->prepare($request); - - $this->assertTrue($response->headers->has('Cache-Control')); - - // Check for IE 8 and HTTP - $request->server->set('HTTP_USER_AGENT', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'); - - $response = $this->provideResponse(); - $response->headers->set('Content-Disposition', 'attachment; filename="fname.ext"'); - $response->prepare($request); - - $this->assertTrue($response->headers->has('Cache-Control')); - - // Check for non-IE and HTTPS - $request->server->set('HTTPS', true); - $request->server->set('HTTP_USER_AGENT', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17'); - - $response = $this->provideResponse(); - $response->headers->set('Content-Disposition', 'attachment; filename="fname.ext"'); - $response->prepare($request); - - $this->assertTrue($response->headers->has('Cache-Control')); - - // Check for non-IE and HTTP - $request->server->set('HTTPS', false); - - $response = $this->provideResponse(); - $response->headers->set('Content-Disposition', 'attachment; filename="fname.ext"'); - $response->prepare($request); - - $this->assertTrue($response->headers->has('Cache-Control')); - } - - abstract protected function provideResponse(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ServerBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ServerBagTest.php deleted file mode 100644 index 89920f1fbc..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/ServerBagTest.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\ServerBag; - -/** - * ServerBagTest - * - * @author Bulat Shakirzyanov - */ -class ServerBagTest extends \PHPUnit_Framework_TestCase -{ - public function testShouldExtractHeadersFromServerArray() - { - $server = array( - 'SOME_SERVER_VARIABLE' => 'value', - 'SOME_SERVER_VARIABLE2' => 'value', - 'ROOT' => 'value', - 'HTTP_CONTENT_TYPE' => 'text/html', - 'HTTP_CONTENT_LENGTH' => '0', - 'HTTP_ETAG' => 'asdf', - 'PHP_AUTH_USER' => 'foo', - 'PHP_AUTH_PW' => 'bar', - ); - - $bag = new ServerBag($server); - - $this->assertEquals(array( - 'CONTENT_TYPE' => 'text/html', - 'CONTENT_LENGTH' => '0', - 'ETAG' => 'asdf', - 'AUTHORIZATION' => 'Basic '.base64_encode('foo:bar'), - 'PHP_AUTH_USER' => 'foo', - 'PHP_AUTH_PW' => 'bar', - ), $bag->getHeaders()); - } - - public function testHttpPasswordIsOptional() - { - $bag = new ServerBag(array('PHP_AUTH_USER' => 'foo')); - - $this->assertEquals(array( - 'AUTHORIZATION' => 'Basic '.base64_encode('foo:'), - 'PHP_AUTH_USER' => 'foo', - 'PHP_AUTH_PW' => '' - ), $bag->getHeaders()); - } - - public function testHttpBasicAuthWithPhpCgi() - { - $bag = new ServerBag(array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('foo:bar'))); - - $this->assertEquals(array( - 'AUTHORIZATION' => 'Basic '.base64_encode('foo:bar'), - 'PHP_AUTH_USER' => 'foo', - 'PHP_AUTH_PW' => 'bar' - ), $bag->getHeaders()); - } - - public function testHttpBasicAuthWithPhpCgiRedirect() - { - $bag = new ServerBag(array('REDIRECT_HTTP_AUTHORIZATION' => 'Basic '.base64_encode('foo:bar'))); - - $this->assertEquals(array( - 'AUTHORIZATION' => 'Basic '.base64_encode('foo:bar'), - 'PHP_AUTH_USER' => 'foo', - 'PHP_AUTH_PW' => 'bar' - ), $bag->getHeaders()); - } - - public function testHttpBasicAuthWithPhpCgiEmptyPassword() - { - $bag = new ServerBag(array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('foo:'))); - - $this->assertEquals(array( - 'AUTHORIZATION' => 'Basic '.base64_encode('foo:'), - 'PHP_AUTH_USER' => 'foo', - 'PHP_AUTH_PW' => '' - ), $bag->getHeaders()); - } - - public function testHttpDigestAuthWithPhpCgi() - { - $digest = 'Digest username="foo", realm="acme", nonce="'.md5('secret').'", uri="/protected, qop="auth"'; - $bag = new ServerBag(array('HTTP_AUTHORIZATION' => $digest)); - - $this->assertEquals(array( - 'AUTHORIZATION' => $digest, - 'PHP_AUTH_DIGEST' => $digest, - ), $bag->getHeaders()); - } - - public function testHttpDigestAuthWithPhpCgiRedirect() - { - $digest = 'Digest username="foo", realm="acme", nonce="'.md5('secret').'", uri="/protected, qop="auth"'; - $bag = new ServerBag(array('REDIRECT_HTTP_AUTHORIZATION' => $digest)); - - $this->assertEquals(array( - 'AUTHORIZATION' => $digest, - 'PHP_AUTH_DIGEST' => $digest, - ), $bag->getHeaders()); - } - - public function testOAuthBearerAuth() - { - $headerContent = 'Bearer L-yLEOr9zhmUYRkzN1jwwxwQ-PBNiKDc8dgfB4hTfvo'; - $bag = new ServerBag(array('HTTP_AUTHORIZATION' => $headerContent)); - - $this->assertEquals(array( - 'AUTHORIZATION' => $headerContent, - ), $bag->getHeaders()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php deleted file mode 100644 index 93c634cde0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/AttributeBagTest.php +++ /dev/null @@ -1,193 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Attribute; - -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; - -/** - * Tests AttributeBag - * - * @author Drak - */ -class AttributeBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var array - */ - private $array; - - /** - * @var AttributeBag - */ - private $bag; - - protected function setUp() - { - $this->array = array( - 'hello' => 'world', - 'always' => 'be happy', - 'user.login' => 'drak', - 'csrf.token' => array( - 'a' => '1234', - 'b' => '4321', - ), - 'category' => array( - 'fishing' => array( - 'first' => 'cod', - 'second' => 'sole') - ), - ); - $this->bag = new AttributeBag('_sf2'); - $this->bag->initialize($this->array); - } - - protected function tearDown() - { - $this->bag = null; - $this->array = array(); - } - - public function testInitialize() - { - $bag = new AttributeBag(); - $bag->initialize($this->array); - $this->assertEquals($this->array, $bag->all()); - $array = array('should' => 'change'); - $bag->initialize($array); - $this->assertEquals($array, $bag->all()); - } - - public function testGetStorageKey() - { - $this->assertEquals('_sf2', $this->bag->getStorageKey()); - $attributeBag = new AttributeBag('test'); - $this->assertEquals('test', $attributeBag->getStorageKey()); - } - - public function testGetSetName() - { - $this->assertEquals('attributes', $this->bag->getName()); - $this->bag->setName('foo'); - $this->assertEquals('foo', $this->bag->getName()); - } - - /** - * @dataProvider attributesProvider - */ - public function testHas($key, $value, $exists) - { - $this->assertEquals($exists, $this->bag->has($key)); - } - - /** - * @dataProvider attributesProvider - */ - public function testGet($key, $value, $expected) - { - $this->assertEquals($value, $this->bag->get($key)); - } - - public function testGetDefaults() - { - $this->assertNull($this->bag->get('user2.login')); - $this->assertEquals('default', $this->bag->get('user2.login', 'default')); - } - - /** - * @dataProvider attributesProvider - */ - public function testSet($key, $value, $expected) - { - $this->bag->set($key, $value); - $this->assertEquals($value, $this->bag->get($key)); - } - - public function testAll() - { - $this->assertEquals($this->array, $this->bag->all()); - - $this->bag->set('hello', 'fabien'); - $array = $this->array; - $array['hello'] = 'fabien'; - $this->assertEquals($array, $this->bag->all()); - } - - public function testReplace() - { - $array = array(); - $array['name'] = 'jack'; - $array['foo.bar'] = 'beep'; - $this->bag->replace($array); - $this->assertEquals($array, $this->bag->all()); - $this->assertNull($this->bag->get('hello')); - $this->assertNull($this->bag->get('always')); - $this->assertNull($this->bag->get('user.login')); - } - - public function testRemove() - { - $this->assertEquals('world', $this->bag->get('hello')); - $this->bag->remove('hello'); - $this->assertNull($this->bag->get('hello')); - - $this->assertEquals('be happy', $this->bag->get('always')); - $this->bag->remove('always'); - $this->assertNull($this->bag->get('always')); - - $this->assertEquals('drak', $this->bag->get('user.login')); - $this->bag->remove('user.login'); - $this->assertNull($this->bag->get('user.login')); - } - - public function testClear() - { - $this->bag->clear(); - $this->assertEquals(array(), $this->bag->all()); - } - - public function attributesProvider() - { - return array( - array('hello', 'world', true), - array('always', 'be happy', true), - array('user.login', 'drak', true), - array('csrf.token', array('a' => '1234', 'b' => '4321'), true), - array('category', array('fishing' => array('first' => 'cod', 'second' => 'sole')), true), - array('user2.login', null, false), - array('never', null, false), - array('bye', null, false), - array('bye/for/now', null, false), - ); - } - - /** - * @covers Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag::getIterator - */ - public function testGetIterator() - { - $i = 0; - foreach ($this->bag as $key => $val) { - $this->assertEquals($this->array[$key], $val); - $i++; - } - - $this->assertEquals(count($this->array), $i); - } - - /** - * @covers Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag::count - */ - public function testCount() - { - $this->assertEquals(count($this->array), count($this->bag)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php deleted file mode 100644 index 0c46a515a0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php +++ /dev/null @@ -1,183 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Attribute; - -use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag; - -/** - * Tests NamespacedAttributeBag - * - * @author Drak - */ -class NamespacedAttributeBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var array - */ - private $array; - - /** - * @var NamespacedAttributeBag - */ - private $bag; - - protected function setUp() - { - $this->array = array( - 'hello' => 'world', - 'always' => 'be happy', - 'user.login' => 'drak', - 'csrf.token' => array( - 'a' => '1234', - 'b' => '4321', - ), - 'category' => array( - 'fishing' => array( - 'first' => 'cod', - 'second' => 'sole') - ), - ); - $this->bag = new NamespacedAttributeBag('_sf2', '/'); - $this->bag->initialize($this->array); - } - - protected function tearDown() - { - $this->bag = null; - $this->array = array(); - } - - public function testInitialize() - { - $bag = new NamespacedAttributeBag(); - $bag->initialize($this->array); - $this->assertEquals($this->array, $this->bag->all()); - $array = array('should' => 'not stick'); - $bag->initialize($array); - - // should have remained the same - $this->assertEquals($this->array, $this->bag->all()); - } - - public function testGetStorageKey() - { - $this->assertEquals('_sf2', $this->bag->getStorageKey()); - $attributeBag = new NamespacedAttributeBag('test'); - $this->assertEquals('test', $attributeBag->getStorageKey()); - } - - /** - * @dataProvider attributesProvider - */ - public function testHas($key, $value, $exists) - { - $this->assertEquals($exists, $this->bag->has($key)); - } - - /** - * @dataProvider attributesProvider - */ - public function testGet($key, $value, $expected) - { - $this->assertEquals($value, $this->bag->get($key)); - } - - public function testGetDefaults() - { - $this->assertNull($this->bag->get('user2.login')); - $this->assertEquals('default', $this->bag->get('user2.login', 'default')); - } - - /** - * @dataProvider attributesProvider - */ - public function testSet($key, $value, $expected) - { - $this->bag->set($key, $value); - $this->assertEquals($value, $this->bag->get($key)); - } - - public function testAll() - { - $this->assertEquals($this->array, $this->bag->all()); - - $this->bag->set('hello', 'fabien'); - $array = $this->array; - $array['hello'] = 'fabien'; - $this->assertEquals($array, $this->bag->all()); - } - - public function testReplace() - { - $array = array(); - $array['name'] = 'jack'; - $array['foo.bar'] = 'beep'; - $this->bag->replace($array); - $this->assertEquals($array, $this->bag->all()); - $this->assertNull($this->bag->get('hello')); - $this->assertNull($this->bag->get('always')); - $this->assertNull($this->bag->get('user.login')); - } - - public function testRemove() - { - $this->assertEquals('world', $this->bag->get('hello')); - $this->bag->remove('hello'); - $this->assertNull($this->bag->get('hello')); - - $this->assertEquals('be happy', $this->bag->get('always')); - $this->bag->remove('always'); - $this->assertNull($this->bag->get('always')); - - $this->assertEquals('drak', $this->bag->get('user.login')); - $this->bag->remove('user.login'); - $this->assertNull($this->bag->get('user.login')); - } - - public function testRemoveExistingNamespacedAttribute() - { - $this->assertSame('cod', $this->bag->remove('category/fishing/first')); - } - - public function testRemoveNonexistingNamespacedAttribute() - { - $this->assertNull($this->bag->remove('foo/bar/baz')); - } - - public function testClear() - { - $this->bag->clear(); - $this->assertEquals(array(), $this->bag->all()); - } - - public function attributesProvider() - { - return array( - array('hello', 'world', true), - array('always', 'be happy', true), - array('user.login', 'drak', true), - array('csrf.token', array('a' => '1234', 'b' => '4321'), true), - array('csrf.token/a', '1234', true), - array('csrf.token/b', '4321', true), - array('category', array('fishing' => array('first' => 'cod', 'second' => 'sole')), true), - array('category/fishing', array('first' => 'cod', 'second' => 'sole'), true), - array('category/fishing/missing/first', null, false), - array('category/fishing/first', 'cod', true), - array('category/fishing/second', 'sole', true), - array('category/fishing/missing/second', null, false), - array('user2.login', null, false), - array('never', null, false), - array('bye', null, false), - array('bye/for/now', null, false), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php deleted file mode 100644 index 5d44b78e99..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/AutoExpireFlashBagTest.php +++ /dev/null @@ -1,155 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Flash; - -use Symfony\Component\HttpFoundation\Session\Flash\AutoExpireFlashBag as FlashBag; - -/** - * AutoExpireFlashBagTest - * - * @author Drak - */ -class AutoExpireFlashBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \Symfony\Component\HttpFoundation\Session\Flash\AutoExpireFlashBag - */ - private $bag; - - /** - * @var array - */ - protected $array = array(); - - protected function setUp() - { - parent::setUp(); - $this->bag = new FlashBag(); - $this->array = array('new' => array('notice' => array('A previous flash message'))); - $this->bag->initialize($this->array); - } - - public function tearDown() - { - $this->bag = null; - parent::tearDown(); - } - - public function testInitialize() - { - $bag = new FlashBag(); - $array = array('new' => array('notice' => array('A previous flash message'))); - $bag->initialize($array); - $this->assertEquals(array('A previous flash message'), $bag->peek('notice')); - $array = array('new' => array( - 'notice' => array('Something else'), - 'error' => array('a'), - )); - $bag->initialize($array); - $this->assertEquals(array('Something else'), $bag->peek('notice')); - $this->assertEquals(array('a'), $bag->peek('error')); - } - - public function testGetStorageKey() - { - $this->assertEquals('_sf2_flashes', $this->bag->getStorageKey()); - $attributeBag = new FlashBag('test'); - $this->assertEquals('test', $attributeBag->getStorageKey()); - } - - public function testGetSetName() - { - $this->assertEquals('flashes', $this->bag->getName()); - $this->bag->setName('foo'); - $this->assertEquals('foo', $this->bag->getName()); - } - - public function testPeek() - { - $this->assertEquals(array(), $this->bag->peek('non_existing')); - $this->assertEquals(array('default'), $this->bag->peek('non_existing', array('default'))); - $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice')); - $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice')); - } - - public function testSet() - { - $this->bag->set('notice', 'Foo'); - $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice')); - } - - public function testHas() - { - $this->assertFalse($this->bag->has('nothing')); - $this->assertTrue($this->bag->has('notice')); - } - - public function testKeys() - { - $this->assertEquals(array('notice'), $this->bag->keys()); - } - - public function testPeekAll() - { - $array = array( - 'new' => array( - 'notice' => 'Foo', - 'error' => 'Bar', - ), - ); - - $this->bag->initialize($array); - $this->assertEquals(array( - 'notice' => 'Foo', - 'error' => 'Bar', - ), $this->bag->peekAll() - ); - - $this->assertEquals(array( - 'notice' => 'Foo', - 'error' => 'Bar', - ), $this->bag->peekAll() - ); - } - - public function testGet() - { - $this->assertEquals(array(), $this->bag->get('non_existing')); - $this->assertEquals(array('default'), $this->bag->get('non_existing', array('default'))); - $this->assertEquals(array('A previous flash message'), $this->bag->get('notice')); - $this->assertEquals(array(), $this->bag->get('notice')); - } - - public function testSetAll() - { - $this->bag->setAll(array('a' => 'first', 'b' => 'second')); - $this->assertFalse($this->bag->has('a')); - $this->assertFalse($this->bag->has('b')); - } - - public function testAll() - { - $this->bag->set('notice', 'Foo'); - $this->bag->set('error', 'Bar'); - $this->assertEquals(array( - 'notice' => array('A previous flash message'), - ), $this->bag->all() - ); - - $this->assertEquals(array(), $this->bag->all()); - } - - public function testClear() - { - $this->assertEquals(array('notice' => array('A previous flash message')), $this->bag->clear()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php deleted file mode 100644 index 1dbfd2f0e9..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php +++ /dev/null @@ -1,155 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Flash; - -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface; - -/** - * FlashBagTest - * - * @author Drak - */ -class FlashBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \Symfony\Component\HttpFoundation\SessionFlash\FlashBagInterface - */ - private $bag; - - /** - * @var array - */ - protected $array = array(); - - protected function setUp() - { - parent::setUp(); - $this->bag = new FlashBag(); - $this->array = array('notice' => array('A previous flash message')); - $this->bag->initialize($this->array); - } - - public function tearDown() - { - $this->bag = null; - parent::tearDown(); - } - - public function testInitialize() - { - $bag = new FlashBag(); - $bag->initialize($this->array); - $this->assertEquals($this->array, $bag->peekAll()); - $array = array('should' => array('change')); - $bag->initialize($array); - $this->assertEquals($array, $bag->peekAll()); - } - - public function testGetStorageKey() - { - $this->assertEquals('_sf2_flashes', $this->bag->getStorageKey()); - $attributeBag = new FlashBag('test'); - $this->assertEquals('test', $attributeBag->getStorageKey()); - } - - public function testGetSetName() - { - $this->assertEquals('flashes', $this->bag->getName()); - $this->bag->setName('foo'); - $this->assertEquals('foo', $this->bag->getName()); - } - - public function testPeek() - { - $this->assertEquals(array(), $this->bag->peek('non_existing')); - $this->assertEquals(array('default'), $this->bag->peek('not_existing', array('default'))); - $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice')); - $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice')); - } - - public function testGet() - { - $this->assertEquals(array(), $this->bag->get('non_existing')); - $this->assertEquals(array('default'), $this->bag->get('not_existing', array('default'))); - $this->assertEquals(array('A previous flash message'), $this->bag->get('notice')); - $this->assertEquals(array(), $this->bag->get('notice')); - } - - public function testAll() - { - $this->bag->set('notice', 'Foo'); - $this->bag->set('error', 'Bar'); - $this->assertEquals(array( - 'notice' => array('Foo'), - 'error' => array('Bar')), $this->bag->all() - ); - - $this->assertEquals(array(), $this->bag->all()); - } - - public function testSet() - { - $this->bag->set('notice', 'Foo'); - $this->bag->set('notice', 'Bar'); - $this->assertEquals(array('Bar'), $this->bag->peek('notice')); - } - - public function testHas() - { - $this->assertFalse($this->bag->has('nothing')); - $this->assertTrue($this->bag->has('notice')); - } - - public function testKeys() - { - $this->assertEquals(array('notice'), $this->bag->keys()); - } - - public function testPeekAll() - { - $this->bag->set('notice', 'Foo'); - $this->bag->set('error', 'Bar'); - $this->assertEquals(array( - 'notice' => array('Foo'), - 'error' => array('Bar'), - ), $this->bag->peekAll() - ); - $this->assertTrue($this->bag->has('notice')); - $this->assertTrue($this->bag->has('error')); - $this->assertEquals(array( - 'notice' => array('Foo'), - 'error' => array('Bar'), - ), $this->bag->peekAll() - ); - } - - /** - * @covers Symfony\Component\HttpFoundation\Session\Flash\FlashBag::getIterator - */ - public function testGetIterator() - { - $flashes = array('hello' => 'world', 'beep' => 'boop', 'notice' => 'nope'); - foreach ($flashes as $key => $val) { - $this->bag->set($key, $val); - } - - $i = 0; - foreach ($this->bag as $key => $val) { - $this->assertEquals(array($flashes[$key]), $val); - $i++; - } - - $this->assertEquals(count($flashes), $i); - $this->assertEquals(0, count($this->bag->all())); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php deleted file mode 100644 index 9d5ad35284..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/SessionTest.php +++ /dev/null @@ -1,227 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session; - -use Symfony\Component\HttpFoundation\Session\Session; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; -use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; - -/** - * SessionTest - * - * @author Fabien Potencier - * @author Robert Schönthal - * @author Drak - */ -class SessionTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface - */ - protected $storage; - - /** - * @var \Symfony\Component\HttpFoundation\Session\SessionInterface - */ - protected $session; - - protected function setUp() - { - $this->storage = new MockArraySessionStorage(); - $this->session = new Session($this->storage, new AttributeBag(), new FlashBag()); - } - - protected function tearDown() - { - $this->storage = null; - $this->session = null; - } - - public function testStart() - { - $this->assertEquals('', $this->session->getId()); - $this->assertTrue($this->session->start()); - $this->assertNotEquals('', $this->session->getId()); - } - - public function testIsStarted() - { - $this->assertFalse($this->session->isStarted()); - $this->session->start(); - $this->assertTrue($this->session->isStarted()); - } - - public function testSetId() - { - $this->assertEquals('', $this->session->getId()); - $this->session->setId('0123456789abcdef'); - $this->session->start(); - $this->assertEquals('0123456789abcdef', $this->session->getId()); - } - - public function testSetName() - { - $this->assertEquals('MOCKSESSID', $this->session->getName()); - $this->session->setName('session.test.com'); - $this->session->start(); - $this->assertEquals('session.test.com', $this->session->getName()); - } - - public function testGet() - { - // tests defaults - $this->assertNull($this->session->get('foo')); - $this->assertEquals(1, $this->session->get('foo', 1)); - } - - /** - * @dataProvider setProvider - */ - public function testSet($key, $value) - { - $this->session->set($key, $value); - $this->assertEquals($value, $this->session->get($key)); - } - - /** - * @dataProvider setProvider - */ - public function testHas($key, $value) - { - $this->session->set($key, $value); - $this->assertTrue($this->session->has($key)); - $this->assertFalse($this->session->has($key.'non_value')); - } - - public function testReplace() - { - $this->session->replace(array('happiness' => 'be good', 'symfony' => 'awesome')); - $this->assertEquals(array('happiness' => 'be good', 'symfony' => 'awesome'), $this->session->all()); - $this->session->replace(array()); - $this->assertEquals(array(), $this->session->all()); - } - - /** - * @dataProvider setProvider - */ - public function testAll($key, $value, $result) - { - $this->session->set($key, $value); - $this->assertEquals($result, $this->session->all()); - } - - /** - * @dataProvider setProvider - */ - public function testClear($key, $value) - { - $this->session->set('hi', 'fabien'); - $this->session->set($key, $value); - $this->session->clear(); - $this->assertEquals(array(), $this->session->all()); - } - - public function setProvider() - { - return array( - array('foo', 'bar', array('foo' => 'bar')), - array('foo.bar', 'too much beer', array('foo.bar' => 'too much beer')), - array('great', 'symfony2 is great', array('great' => 'symfony2 is great')), - ); - } - - /** - * @dataProvider setProvider - */ - public function testRemove($key, $value) - { - $this->session->set('hi.world', 'have a nice day'); - $this->session->set($key, $value); - $this->session->remove($key); - $this->assertEquals(array('hi.world' => 'have a nice day'), $this->session->all()); - } - - public function testInvalidate() - { - $this->session->set('invalidate', 123); - $this->session->invalidate(); - $this->assertEquals(array(), $this->session->all()); - } - - public function testMigrate() - { - $this->session->set('migrate', 321); - $this->session->migrate(); - $this->assertEquals(321, $this->session->get('migrate')); - } - - public function testMigrateDestroy() - { - $this->session->set('migrate', 333); - $this->session->migrate(true); - $this->assertEquals(333, $this->session->get('migrate')); - } - - public function testSave() - { - $this->session->start(); - $this->session->save(); - } - - public function testGetId() - { - $this->assertEquals('', $this->session->getId()); - $this->session->start(); - $this->assertNotEquals('', $this->session->getId()); - } - - public function testGetFlashBag() - { - $this->assertInstanceOf('Symfony\\Component\\HttpFoundation\\Session\\Flash\\FlashBagInterface', $this->session->getFlashBag()); - } - - /** - * @covers Symfony\Component\HttpFoundation\Session\Session::getIterator - */ - public function testGetIterator() - { - $attributes = array('hello' => 'world', 'symfony2' => 'rocks'); - foreach ($attributes as $key => $val) { - $this->session->set($key, $val); - } - - $i = 0; - foreach ($this->session as $key => $val) { - $this->assertEquals($attributes[$key], $val); - $i++; - } - - $this->assertEquals(count($attributes), $i); - } - - /** - * @covers \Symfony\Component\HttpFoundation\Session\Session::count - */ - public function testGetCount() - { - $this->session->set('hello', 'world'); - $this->session->set('symfony2', 'rocks'); - - $this->assertEquals(2, count($this->session)); - } - - public function testGetMeta() - { - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\MetadataBag', $this->session->getMetadataBag()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php deleted file mode 100644 index 8d38ab3de9..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandler; - -class MemcacheSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - const PREFIX = 'prefix_'; - const TTL = 1000; - /** - * @var MemcacheSessionHandler - */ - protected $storage; - - protected $memcache; - - protected function setUp() - { - if (!class_exists('Memcache')) { - $this->markTestSkipped('Skipped tests Memcache class is not present'); - } - - $this->memcache = $this->getMock('Memcache'); - $this->storage = new MemcacheSessionHandler( - $this->memcache, - array('prefix' => self::PREFIX, 'expiretime' => self::TTL) - ); - } - - protected function tearDown() - { - $this->memcache = null; - $this->storage = null; - } - - public function testOpenSession() - { - $this->assertTrue($this->storage->open('', '')); - } - - public function testCloseSession() - { - $this->memcache - ->expects($this->once()) - ->method('close') - ->will($this->returnValue(true)) - ; - - $this->assertTrue($this->storage->close()); - } - - public function testReadSession() - { - $this->memcache - ->expects($this->once()) - ->method('get') - ->with(self::PREFIX.'id') - ; - - $this->assertEquals('', $this->storage->read('id')); - } - - public function testWriteSession() - { - $this->memcache - ->expects($this->once()) - ->method('set') - ->with(self::PREFIX.'id', 'data', 0, $this->equalTo(time() + self::TTL, 2)) - ->will($this->returnValue(true)) - ; - - $this->assertTrue($this->storage->write('id', 'data')); - } - - public function testDestroySession() - { - $this->memcache - ->expects($this->once()) - ->method('delete') - ->with(self::PREFIX.'id') - ->will($this->returnValue(true)) - ; - - $this->assertTrue($this->storage->destroy('id')); - } - - public function testGcSession() - { - $this->assertTrue($this->storage->gc(123)); - } - - /** - * @dataProvider getOptionFixtures - */ - public function testSupportedOptions($options, $supported) - { - try { - new MemcacheSessionHandler($this->memcache, $options); - $this->assertTrue($supported); - } catch (\InvalidArgumentException $e) { - $this->assertFalse($supported); - } - } - - public function getOptionFixtures() - { - return array( - array(array('prefix' => 'session'), true), - array(array('expiretime' => 100), true), - array(array('prefix' => 'session', 'expiretime' => 200), true), - array(array('expiretime' => 100, 'foo' => 'bar'), false), - ); - } - - public function testGetConnection() - { - $method = new \ReflectionMethod($this->storage, 'getMemcache'); - $method->setAccessible(true); - - $this->assertInstanceOf('\Memcache', $method->invoke($this->storage)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php deleted file mode 100644 index 72be327252..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler; - -class MemcachedSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - const PREFIX = 'prefix_'; - const TTL = 1000; - - /** - * @var MemcachedSessionHandler - */ - protected $storage; - - protected $memcached; - - protected function setUp() - { - if (!class_exists('Memcached')) { - $this->markTestSkipped('Skipped tests Memcached class is not present'); - } - - $this->memcached = $this->getMock('Memcached'); - $this->storage = new MemcachedSessionHandler( - $this->memcached, - array('prefix' => self::PREFIX, 'expiretime' => self::TTL) - ); - } - - protected function tearDown() - { - $this->memcached = null; - $this->storage = null; - } - - public function testOpenSession() - { - $this->assertTrue($this->storage->open('', '')); - } - - public function testCloseSession() - { - $this->assertTrue($this->storage->close()); - } - - public function testReadSession() - { - $this->memcached - ->expects($this->once()) - ->method('get') - ->with(self::PREFIX.'id') - ; - - $this->assertEquals('', $this->storage->read('id')); - } - - public function testWriteSession() - { - $this->memcached - ->expects($this->once()) - ->method('set') - ->with(self::PREFIX.'id', 'data', $this->equalTo(time() + self::TTL, 2)) - ->will($this->returnValue(true)) - ; - - $this->assertTrue($this->storage->write('id', 'data')); - } - - public function testDestroySession() - { - $this->memcached - ->expects($this->once()) - ->method('delete') - ->with(self::PREFIX.'id') - ->will($this->returnValue(true)) - ; - - $this->assertTrue($this->storage->destroy('id')); - } - - public function testGcSession() - { - $this->assertTrue($this->storage->gc(123)); - } - - /** - * @dataProvider getOptionFixtures - */ - public function testSupportedOptions($options, $supported) - { - try { - new MemcachedSessionHandler($this->memcached, $options); - $this->assertTrue($supported); - } catch (\InvalidArgumentException $e) { - $this->assertFalse($supported); - } - } - - public function getOptionFixtures() - { - return array( - array(array('prefix' => 'session'), true), - array(array('expiretime' => 100), true), - array(array('prefix' => 'session', 'expiretime' => 200), true), - array(array('expiretime' => 100, 'foo' => 'bar'), false), - ); - } - - public function testGetConnection() - { - $method = new \ReflectionMethod($this->storage, 'getMemcached'); - $method->setAccessible(true); - - $this->assertInstanceOf('\Memcached', $method->invoke($this->storage)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php deleted file mode 100644 index d907ce4a90..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php +++ /dev/null @@ -1,181 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandler; - -/** - * @author Markus Bachmann - */ -class MongoDbSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \PHPUnit_Framework_MockObject_MockObject - */ - private $mongo; - private $storage; - public $options; - - protected function setUp() - { - if (!extension_loaded('mongo')) { - $this->markTestSkipped('MongoDbSessionHandler requires the PHP "mongo" extension.'); - } - - $mongoClass = version_compare(phpversion('mongo'), '1.3.0', '<') ? 'Mongo' : 'MongoClient'; - - $this->mongo = $this->getMockBuilder($mongoClass) - ->disableOriginalConstructor() - ->getMock(); - - $this->options = array( - 'id_field' => '_id', - 'data_field' => 'data', - 'time_field' => 'time', - 'database' => 'sf2-test', - 'collection' => 'session-test' - ); - - $this->storage = new MongoDbSessionHandler($this->mongo, $this->options); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testConstructorShouldThrowExceptionForInvalidMongo() - { - new MongoDbSessionHandler(new \stdClass(), $this->options); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testConstructorShouldThrowExceptionForMissingOptions() - { - new MongoDbSessionHandler($this->mongo, array()); - } - - public function testOpenMethodAlwaysReturnTrue() - { - $this->assertTrue($this->storage->open('test', 'test'), 'The "open" method should always return true'); - } - - public function testCloseMethodAlwaysReturnTrue() - { - $this->assertTrue($this->storage->close(), 'The "close" method should always return true'); - } - - public function testWrite() - { - $collection = $this->getMockBuilder('MongoCollection') - ->disableOriginalConstructor() - ->getMock(); - - $this->mongo->expects($this->once()) - ->method('selectCollection') - ->with($this->options['database'], $this->options['collection']) - ->will($this->returnValue($collection)); - - $that = $this; - $data = array(); - - $collection->expects($this->once()) - ->method('update') - ->will($this->returnCallback(function ($criteria, $updateData, $options) use ($that, &$data) { - $that->assertEquals(array($that->options['id_field'] => 'foo'), $criteria); - $that->assertEquals(array('upsert' => true, 'multiple' => false), $options); - - $data = $updateData['$set']; - })); - - $this->assertTrue($this->storage->write('foo', 'bar')); - - $this->assertEquals('bar', $data[$this->options['data_field']]->bin); - $that->assertInstanceOf('MongoDate', $data[$this->options['time_field']]); - } - - public function testReplaceSessionData() - { - $collection = $this->getMockBuilder('MongoCollection') - ->disableOriginalConstructor() - ->getMock(); - - $this->mongo->expects($this->once()) - ->method('selectCollection') - ->with($this->options['database'], $this->options['collection']) - ->will($this->returnValue($collection)); - - $data = array(); - - $collection->expects($this->exactly(2)) - ->method('update') - ->will($this->returnCallback(function ($criteria, $updateData, $options) use (&$data) { - $data = $updateData; - })); - - $this->storage->write('foo', 'bar'); - $this->storage->write('foo', 'foobar'); - - $this->assertEquals('foobar', $data['$set'][$this->options['data_field']]->bin); - } - - public function testDestroy() - { - $collection = $this->getMockBuilder('MongoCollection') - ->disableOriginalConstructor() - ->getMock(); - - $this->mongo->expects($this->once()) - ->method('selectCollection') - ->with($this->options['database'], $this->options['collection']) - ->will($this->returnValue($collection)); - - $collection->expects($this->once()) - ->method('remove') - ->with(array($this->options['id_field'] => 'foo')); - - $this->assertTrue($this->storage->destroy('foo')); - } - - public function testGc() - { - $collection = $this->getMockBuilder('MongoCollection') - ->disableOriginalConstructor() - ->getMock(); - - $this->mongo->expects($this->once()) - ->method('selectCollection') - ->with($this->options['database'], $this->options['collection']) - ->will($this->returnValue($collection)); - - $that = $this; - - $collection->expects($this->once()) - ->method('remove') - ->will($this->returnCallback(function ($criteria) use ($that) { - $that->assertInstanceOf('MongoDate', $criteria[$that->options['time_field']]['$lt']); - $that->assertGreaterThanOrEqual(time() - -1, $criteria[$that->options['time_field']]['$lt']->sec); - })); - - $this->assertTrue($this->storage->gc(-1)); - } - - public function testGetConnection() - { - $method = new \ReflectionMethod($this->storage, 'getMongo'); - $method->setAccessible(true); - - $mongoClass = (version_compare(phpversion('mongo'), '1.3.0', '<')) ? '\Mongo' : '\MongoClient'; - - $this->assertInstanceOf($mongoClass, $method->invoke($this->storage)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php deleted file mode 100644 index 20cefabf49..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler; -use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; - -/** - * Test class for NativeFileSessionHandler. - * - * @author Drak - * - * @runTestsInSeparateProcesses - */ -class NativeFileSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - public function testConstruct() - { - $storage = new NativeSessionStorage(array('name' => 'TESTING'), new NativeFileSessionHandler(sys_get_temp_dir())); - - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->assertEquals('files', $storage->getSaveHandler()->getSaveHandlerName()); - $this->assertEquals('files', ini_get('session.save_handler')); - } else { - $this->assertEquals('files', $storage->getSaveHandler()->getSaveHandlerName()); - $this->assertEquals('user', ini_get('session.save_handler')); - } - - $this->assertEquals(sys_get_temp_dir(), ini_get('session.save_path')); - $this->assertEquals('TESTING', ini_get('session.name')); - } - - /** - * @dataProvider savePathDataProvider - */ - public function testConstructSavePath($savePath, $expectedSavePath, $path) - { - $handler = new NativeFileSessionHandler($savePath); - $this->assertEquals($expectedSavePath, ini_get('session.save_path')); - $this->assertTrue(is_dir(realpath($path))); - - rmdir($path); - } - - public function savePathDataProvider() - { - $base = sys_get_temp_dir(); - - return array( - array("$base/foo", "$base/foo", "$base/foo"), - array("5;$base/foo", "5;$base/foo", "$base/foo"), - array("5;0600;$base/foo", "5;0600;$base/foo", "$base/foo"), - ); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testConstructException() - { - $handler = new NativeFileSessionHandler('something;invalid;with;too-many-args'); - } - - public function testConstructDefault() - { - $path = ini_get('session.save_path'); - $storage = new NativeSessionStorage(array('name' => 'TESTING'), new NativeFileSessionHandler()); - - $this->assertEquals($path, ini_get('session.save_path')); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php deleted file mode 100644 index 7880615db0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler; - -/** - * Test class for NativeSessionHandler. - * - * @author Drak - * - * @runTestsInSeparateProcesses - */ -class NativeSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - public function testConstruct() - { - $handler = new NativeSessionHandler(); - - // note for PHPUnit optimisers - the use of assertTrue/False - // here is deliberate since the tests do not require the classes to exist - drak - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->assertFalse($handler instanceof \SessionHandler); - $this->assertTrue($handler instanceof NativeSessionHandler); - } else { - $this->assertTrue($handler instanceof \SessionHandler); - $this->assertTrue($handler instanceof NativeSessionHandler); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php deleted file mode 100644 index 371ab6f3fa..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler; -use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; -use Symfony\Component\HttpFoundation\Session\Session; - -/** - * Test class for NullSessionHandler. - * - * @author Drak - * - * @runTestsInSeparateProcesses - */ -class NullSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - public function testSaveHandlers() - { - $storage = $this->getStorage(); - $this->assertEquals('user', ini_get('session.save_handler')); - } - - public function testSession() - { - session_id('nullsessionstorage'); - $storage = $this->getStorage(); - $session = new Session($storage); - $this->assertNull($session->get('something')); - $session->set('something', 'unique'); - $this->assertEquals('unique', $session->get('something')); - } - - public function testNothingIsPersisted() - { - session_id('nullsessionstorage'); - $storage = $this->getStorage(); - $session = new Session($storage); - $session->start(); - $this->assertEquals('nullsessionstorage', $session->getId()); - $this->assertNull($session->get('something')); - } - - public function getStorage() - { - return new NativeSessionStorage(array(), new NullSessionHandler()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php deleted file mode 100644 index 06da0096f3..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler; - -class PdoSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - private $pdo; - - protected function setUp() - { - if (!class_exists('PDO') || !in_array('sqlite', \PDO::getAvailableDrivers())) { - $this->markTestSkipped('This test requires SQLite support in your environment'); - } - - $this->pdo = new \PDO("sqlite::memory:"); - $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - $sql = "CREATE TABLE sessions (sess_id VARCHAR(255) PRIMARY KEY, sess_data TEXT, sess_time INTEGER)"; - $this->pdo->exec($sql); - } - - public function testIncompleteOptions() - { - $this->setExpectedException('InvalidArgumentException'); - $storage = new PdoSessionHandler($this->pdo, array(), array()); - } - - public function testWrongPdoErrMode() - { - $pdo = new \PDO("sqlite::memory:"); - $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_SILENT); - $pdo->exec("CREATE TABLE sessions (sess_id VARCHAR(255) PRIMARY KEY, sess_data TEXT, sess_time INTEGER)"); - - $this->setExpectedException('InvalidArgumentException'); - $storage = new PdoSessionHandler($pdo, array('db_table' => 'sessions'), array()); - } - - public function testWrongTableOptionsWrite() - { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'bad_name'), array()); - $this->setExpectedException('RuntimeException'); - $storage->write('foo', 'bar'); - } - - public function testWrongTableOptionsRead() - { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'bad_name'), array()); - $this->setExpectedException('RuntimeException'); - $storage->read('foo', 'bar'); - } - - public function testWriteRead() - { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); - $storage->write('foo', 'bar'); - $this->assertEquals('bar', $storage->read('foo'), 'written value can be read back correctly'); - } - - public function testMultipleInstances() - { - $storage1 = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); - $storage1->write('foo', 'bar'); - - $storage2 = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); - $this->assertEquals('bar', $storage2->read('foo'), 'values persist between instances'); - } - - public function testSessionDestroy() - { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); - $storage->write('foo', 'bar'); - $this->assertEquals(1, count($this->pdo->query('SELECT * FROM sessions')->fetchAll())); - - $storage->destroy('foo'); - - $this->assertEquals(0, count($this->pdo->query('SELECT * FROM sessions')->fetchAll())); - } - - public function testSessionGC() - { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); - - $storage->write('foo', 'bar'); - $storage->write('baz', 'bar'); - - $this->assertEquals(2, count($this->pdo->query('SELECT * FROM sessions')->fetchAll())); - - $storage->gc(-1); - $this->assertEquals(0, count($this->pdo->query('SELECT * FROM sessions')->fetchAll())); - } - - public function testGetConnection() - { - $storage = new PdoSessionHandler($this->pdo, array('db_table' => 'sessions'), array()); - - $method = new \ReflectionMethod($storage, 'getConnection'); - $method->setAccessible(true); - - $this->assertInstanceOf('\PDO', $method->invoke($storage)); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php deleted file mode 100644 index dcfd94bd1e..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php +++ /dev/null @@ -1,94 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\WriteCheckSessionHandler; - -/** - * @author Adrien Brault - */ -class WriteCheckSessionHandlerTest extends \PHPUnit_Framework_TestCase -{ - public function test() - { - $wrappedSessionHandlerMock = $this->getMock('SessionHandlerInterface'); - $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock); - - $wrappedSessionHandlerMock - ->expects($this->once()) - ->method('close') - ->with() - ->will($this->returnValue(true)) - ; - - $this->assertEquals(true, $writeCheckSessionHandler->close()); - } - - public function testWrite() - { - $wrappedSessionHandlerMock = $this->getMock('SessionHandlerInterface'); - $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock); - - $wrappedSessionHandlerMock - ->expects($this->once()) - ->method('write') - ->with('foo', 'bar') - ->will($this->returnValue(true)) - ; - - $this->assertEquals(true, $writeCheckSessionHandler->write('foo', 'bar')); - } - - public function testSkippedWrite() - { - $wrappedSessionHandlerMock = $this->getMock('SessionHandlerInterface'); - $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock); - - $wrappedSessionHandlerMock - ->expects($this->once()) - ->method('read') - ->with('foo') - ->will($this->returnValue('bar')) - ; - - $wrappedSessionHandlerMock - ->expects($this->never()) - ->method('write') - ; - - $this->assertEquals('bar', $writeCheckSessionHandler->read('foo')); - $this->assertEquals(true, $writeCheckSessionHandler->write('foo', 'bar')); - } - - public function testNonSkippedWrite() - { - $wrappedSessionHandlerMock = $this->getMock('SessionHandlerInterface'); - $writeCheckSessionHandler = new WriteCheckSessionHandler($wrappedSessionHandlerMock); - - $wrappedSessionHandlerMock - ->expects($this->once()) - ->method('read') - ->with('foo') - ->will($this->returnValue('bar')) - ; - - $wrappedSessionHandlerMock - ->expects($this->once()) - ->method('write') - ->with('foo', 'baZZZ') - ->will($this->returnValue(true)) - ; - - $this->assertEquals('bar', $writeCheckSessionHandler->read('foo')); - $this->assertEquals(true, $writeCheckSessionHandler->write('foo', 'baZZZ')); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php deleted file mode 100644 index c502c38ae6..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MetadataBagTest.php +++ /dev/null @@ -1,135 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\Storage\MetadataBag; - -/** - * Test class for MetadataBag. - */ -class MetadataBagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var MetadataBag - */ - protected $bag; - - /** - * @var array - */ - protected $array = array(); - - protected function setUp() - { - $this->bag = new MetadataBag(); - $this->array = array(MetadataBag::CREATED => 1234567, MetadataBag::UPDATED => 12345678, MetadataBag::LIFETIME => 0); - $this->bag->initialize($this->array); - } - - protected function tearDown() - { - $this->array = array(); - $this->bag = null; - } - - public function testInitialize() - { - $sessionMetadata = array(); - - $bag1 = new MetadataBag(); - $bag1->initialize($sessionMetadata); - $this->assertGreaterThanOrEqual(time(), $bag1->getCreated()); - $this->assertEquals($bag1->getCreated(), $bag1->getLastUsed()); - - sleep(1); - $bag2 = new MetadataBag(); - $bag2->initialize($sessionMetadata); - $this->assertEquals($bag1->getCreated(), $bag2->getCreated()); - $this->assertEquals($bag1->getLastUsed(), $bag2->getLastUsed()); - $this->assertEquals($bag2->getCreated(), $bag2->getLastUsed()); - - sleep(1); - $bag3 = new MetadataBag(); - $bag3->initialize($sessionMetadata); - $this->assertEquals($bag1->getCreated(), $bag3->getCreated()); - $this->assertGreaterThan($bag2->getLastUsed(), $bag3->getLastUsed()); - $this->assertNotEquals($bag3->getCreated(), $bag3->getLastUsed()); - } - - public function testGetSetName() - { - $this->assertEquals('__metadata', $this->bag->getName()); - $this->bag->setName('foo'); - $this->assertEquals('foo', $this->bag->getName()); - - } - - public function testGetStorageKey() - { - $this->assertEquals('_sf2_meta', $this->bag->getStorageKey()); - } - - public function testGetLifetime() - { - $bag = new MetadataBag(); - $array = array(MetadataBag::CREATED => 1234567, MetadataBag::UPDATED => 12345678, MetadataBag::LIFETIME => 1000); - $bag->initialize($array); - $this->assertEquals(1000, $bag->getLifetime()); - } - - public function testGetCreated() - { - $this->assertEquals(1234567, $this->bag->getCreated()); - } - - public function testGetLastUsed() - { - $this->assertLessThanOrEqual(time(), $this->bag->getLastUsed()); - } - - public function testClear() - { - $this->bag->clear(); - } - - public function testSkipLastUsedUpdate() - { - $bag = new MetadataBag('', 30); - $timeStamp = time(); - - $created = $timeStamp - 15; - $sessionMetadata = array( - MetadataBag::CREATED => $created, - MetadataBag::UPDATED => $created, - MetadataBag::LIFETIME => 1000 - ); - $bag->initialize($sessionMetadata); - - $this->assertEquals($created, $sessionMetadata[MetadataBag::UPDATED]); - } - - public function testDoesNotSkipLastUsedUpdate() - { - $bag = new MetadataBag('', 30); - $timeStamp = time(); - - $created = $timeStamp - 45; - $sessionMetadata = array( - MetadataBag::CREATED => $created, - MetadataBag::UPDATED => $created, - MetadataBag::LIFETIME => 1000 - ); - $bag->initialize($sessionMetadata); - - $this->assertEquals($timeStamp, $sessionMetadata[MetadataBag::UPDATED]); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php deleted file mode 100644 index c56ea4a600..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockArraySessionStorageTest.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; - -/** - * Test class for MockArraySessionStorage. - * - * @author Drak - */ -class MockArraySessionStorageTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var MockArraySessionStorage - */ - private $storage; - - /** - * @var AttributeBag - */ - private $attributes; - - /** - * @var FlashBag - */ - private $flashes; - - private $data; - - protected function setUp() - { - $this->attributes = new AttributeBag(); - $this->flashes = new FlashBag(); - - $this->data = array( - $this->attributes->getStorageKey() => array('foo' => 'bar'), - $this->flashes->getStorageKey() => array('notice' => 'hello'), - ); - - $this->storage = new MockArraySessionStorage(); - $this->storage->registerBag($this->flashes); - $this->storage->registerBag($this->attributes); - $this->storage->setSessionData($this->data); - } - - protected function tearDown() - { - $this->data = null; - $this->flashes = null; - $this->attributes = null; - $this->storage = null; - } - - public function testStart() - { - $this->assertEquals('', $this->storage->getId()); - $this->storage->start(); - $id = $this->storage->getId(); - $this->assertNotEquals('', $id); - $this->storage->start(); - $this->assertEquals($id, $this->storage->getId()); - } - - public function testRegenerate() - { - $this->storage->start(); - $id = $this->storage->getId(); - $this->storage->regenerate(); - $this->assertNotEquals($id, $this->storage->getId()); - $this->assertEquals(array('foo' => 'bar'), $this->storage->getBag('attributes')->all()); - $this->assertEquals(array('notice' => 'hello'), $this->storage->getBag('flashes')->peekAll()); - - $id = $this->storage->getId(); - $this->storage->regenerate(true); - $this->assertNotEquals($id, $this->storage->getId()); - $this->assertEquals(array('foo' => 'bar'), $this->storage->getBag('attributes')->all()); - $this->assertEquals(array('notice' => 'hello'), $this->storage->getBag('flashes')->peekAll()); - } - - public function testGetId() - { - $this->assertEquals('', $this->storage->getId()); - $this->storage->start(); - $this->assertNotEquals('', $this->storage->getId()); - } - - /** - * @expectedException \RuntimeException - */ - public function testUnstartedSave() - { - $this->storage->save(); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php deleted file mode 100644 index 329c090d8d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/MockFileSessionStorageTest.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; - -/** - * Test class for MockFileSessionStorage. - * - * @author Drak - */ -class MockFileSessionStorageTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var string - */ - private $sessionDir; - - /** - * @var FileMockSessionStorage - */ - protected $storage; - - protected function setUp() - { - $this->sessionDir = sys_get_temp_dir().'/sf2test'; - $this->storage = $this->getStorage(); - } - - protected function tearDown() - { - $this->sessionDir = null; - $this->storage = null; - array_map('unlink', glob($this->sessionDir.'/*.session')); - if (is_dir($this->sessionDir)) { - rmdir($this->sessionDir); - } - } - - public function testStart() - { - $this->assertEquals('', $this->storage->getId()); - $this->assertTrue($this->storage->start()); - $id = $this->storage->getId(); - $this->assertNotEquals('', $this->storage->getId()); - $this->assertTrue($this->storage->start()); - $this->assertEquals($id, $this->storage->getId()); - } - - public function testRegenerate() - { - $this->storage->start(); - $this->storage->getBag('attributes')->set('regenerate', 1234); - $this->storage->regenerate(); - $this->assertEquals(1234, $this->storage->getBag('attributes')->get('regenerate')); - $this->storage->regenerate(true); - $this->assertEquals(1234, $this->storage->getBag('attributes')->get('regenerate')); - } - - public function testGetId() - { - $this->assertEquals('', $this->storage->getId()); - $this->storage->start(); - $this->assertNotEquals('', $this->storage->getId()); - } - - public function testSave() - { - $this->storage->start(); - $id = $this->storage->getId(); - $this->assertNotEquals('108', $this->storage->getBag('attributes')->get('new')); - $this->assertFalse($this->storage->getBag('flashes')->has('newkey')); - $this->storage->getBag('attributes')->set('new', '108'); - $this->storage->getBag('flashes')->set('newkey', 'test'); - $this->storage->save(); - - $storage = $this->getStorage(); - $storage->setId($id); - $storage->start(); - $this->assertEquals('108', $storage->getBag('attributes')->get('new')); - $this->assertTrue($storage->getBag('flashes')->has('newkey')); - $this->assertEquals(array('test'), $storage->getBag('flashes')->peek('newkey')); - } - - public function testMultipleInstances() - { - $storage1 = $this->getStorage(); - $storage1->start(); - $storage1->getBag('attributes')->set('foo', 'bar'); - $storage1->save(); - - $storage2 = $this->getStorage(); - $storage2->setId($storage1->getId()); - $storage2->start(); - $this->assertEquals('bar', $storage2->getBag('attributes')->get('foo'), 'values persist between instances'); - } - - /** - * @expectedException \RuntimeException - */ - public function testSaveWithoutStart() - { - $storage1 = $this->getStorage(); - $storage1->save(); - } - - private function getStorage() - { - $storage = new MockFileSessionStorage($this->sessionDir); - $storage->registerBag(new FlashBag()); - $storage->registerBag(new AttributeBag()); - - return $storage; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php deleted file mode 100644 index 691ee14593..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php +++ /dev/null @@ -1,283 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler; -use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; -use Symfony\Component\HttpFoundation\Session\Flash\FlashBag; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy; -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; - -/** - * Test class for NativeSessionStorage. - * - * @author Drak - * - * These tests require separate processes. - * - * @runTestsInSeparateProcesses - */ -class NativeSessionStorageTest extends \PHPUnit_Framework_TestCase -{ - private $savePath; - - protected function setUp() - { - ini_set('session.save_handler', 'files'); - ini_set('session.save_path', $this->savePath = sys_get_temp_dir().'/sf2test'); - if (!is_dir($this->savePath)) { - mkdir($this->savePath); - } - } - - protected function tearDown() - { - session_write_close(); - array_map('unlink', glob($this->savePath.'/*')); - if (is_dir($this->savePath)) { - rmdir($this->savePath); - } - - $this->savePath = null; - } - - /** - * @param array $options - * - * @return NativeSessionStorage - */ - protected function getStorage(array $options = array()) - { - $storage = new NativeSessionStorage($options); - $storage->registerBag(new AttributeBag()); - - return $storage; - } - - public function testBag() - { - $storage = $this->getStorage(); - $bag = new FlashBag(); - $storage->registerBag($bag); - $this->assertSame($bag, $storage->getBag($bag->getName())); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testRegisterBagException() - { - $storage = $this->getStorage(); - $storage->getBag('non_existing'); - } - - public function testGetId() - { - $storage = $this->getStorage(); - $this->assertEquals('', $storage->getId()); - - $storage->start(); - $this->assertNotEquals('', $storage->getId()); - - $storage->save(); - $this->assertNotEquals('', $storage->getId()); - } - - public function testRegenerate() - { - $storage = $this->getStorage(); - $storage->start(); - $id = $storage->getId(); - $storage->getBag('attributes')->set('lucky', 7); - $storage->regenerate(); - $this->assertNotEquals($id, $storage->getId()); - $this->assertEquals(7, $storage->getBag('attributes')->get('lucky')); - } - - public function testRegenerateDestroy() - { - $storage = $this->getStorage(); - $storage->start(); - $id = $storage->getId(); - $storage->getBag('attributes')->set('legs', 11); - $storage->regenerate(true); - $this->assertNotEquals($id, $storage->getId()); - $this->assertEquals(11, $storage->getBag('attributes')->get('legs')); - } - - public function testDefaultSessionCacheLimiter() - { - ini_set('session.cache_limiter', 'nocache'); - - $storage = new NativeSessionStorage(); - $this->assertEquals('', ini_get('session.cache_limiter')); - } - - public function testExplicitSessionCacheLimiter() - { - ini_set('session.cache_limiter', 'nocache'); - - $storage = new NativeSessionStorage(array('cache_limiter' => 'public')); - $this->assertEquals('public', ini_get('session.cache_limiter')); - } - - public function testCookieOptions() - { - $options = array( - 'cookie_lifetime' => 123456, - 'cookie_path' => '/my/cookie/path', - 'cookie_domain' => 'symfony2.example.com', - 'cookie_secure' => true, - 'cookie_httponly' => false, - ); - - $this->getStorage($options); - $temp = session_get_cookie_params(); - $gco = array(); - - foreach ($temp as $key => $value) { - $gco['cookie_'.$key] = $value; - } - - $this->assertEquals($options, $gco); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testSetSaveHandlerException() - { - $storage = $this->getStorage(); - $storage->setSaveHandler(new \stdClass); - } - - public function testSetSaveHandler53() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - $this->markTestSkipped('Test skipped, for PHP 5.3 only.'); - } - - ini_set('session.save_handler', 'files'); - $storage = $this->getStorage(); - $storage->setSaveHandler(); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(null); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new NativeSessionHandler()); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandlerProxy(new SessionHandler())); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandler()); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new NativeProxy()); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy', $storage->getSaveHandler()); - } - - public function testSetSaveHandler54() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->markTestSkipped('Test skipped, for PHP 5.4 only.'); - } - - ini_set('session.save_handler', 'files'); - $storage = $this->getStorage(); - $storage->setSaveHandler(); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(null); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandlerProxy(new NativeSessionHandler())); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new NativeSessionHandler()); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandlerProxy(new SessionHandler())); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - $storage->setSaveHandler(new SessionHandler()); - $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler()); - } - - /** - * @expectedException \RuntimeException - */ - public function testStartedOutside53() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - $this->markTestSkipped('Test skipped, for PHP 5.3 only.'); - } - - $storage = $this->getStorage(); - - $this->assertFalse(isset($_SESSION)); - - session_start(); - $this->assertTrue(isset($_SESSION)); - // PHP session might have started, but the storage driver has not, so false is correct here - $this->assertFalse($storage->isStarted()); - - $key = $storage->getMetadataBag()->getStorageKey(); - $this->assertFalse(isset($_SESSION[$key])); - $storage->start(); - } - - /** - * @expectedException \RuntimeException - */ - public function testCanStartOutside54() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->markTestSkipped('Test skipped, for PHP 5.4 only.'); - } - - $storage = $this->getStorage(); - - $this->assertFalse(isset($_SESSION)); - $this->assertFalse($storage->getSaveHandler()->isActive()); - $this->assertFalse($storage->isStarted()); - - session_start(); - $this->assertTrue(isset($_SESSION)); - $this->assertTrue($storage->getSaveHandler()->isActive()); - // PHP session might have started, but the storage driver has not, so false is correct here - $this->assertFalse($storage->isStarted()); - - $key = $storage->getMetadataBag()->getStorageKey(); - $this->assertFalse(isset($_SESSION[$key])); - $storage->start(); - } -} - -class SessionHandler implements \SessionHandlerInterface -{ - public function open($savePath, $sessionName) - { - } - - public function close() - { - } - - public function read($id) - { - } - - public function write($id, $data) - { - } - - public function destroy($id) - { - } - - public function gc($maxlifetime) - { - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php deleted file mode 100644 index 0510f3fe9a..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage; - -use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage; -use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag; - -/** - * Test class for PhpSessionStorage. - * - * @author Drak - * - * These tests require separate processes. - * - * @runTestsInSeparateProcesses - */ -class PhpBridgeSessionStorageTest extends \PHPUnit_Framework_TestCase -{ - private $savePath; - - protected function setUp() - { - ini_set('session.save_handler', 'files'); - ini_set('session.save_path', $this->savePath = sys_get_temp_dir().'/sf2test'); - if (!is_dir($this->savePath)) { - mkdir($this->savePath); - } - } - - protected function tearDown() - { - session_write_close(); - array_map('unlink', glob($this->savePath.'/*')); - if (is_dir($this->savePath)) { - rmdir($this->savePath); - } - - $this->savePath = null; - } - - /** - * @return PhpBridgeSessionStorage - */ - protected function getStorage() - { - $storage = new PhpBridgeSessionStorage(); - $storage->registerBag(new AttributeBag()); - - return $storage; - } - - public function testPhpSession53() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - $this->markTestSkipped('Test skipped, for PHP 5.3 only.'); - } - - $storage = $this->getStorage(); - - $this->assertFalse(isset($_SESSION)); - $this->assertFalse($storage->getSaveHandler()->isActive()); - - session_start(); - $this->assertTrue(isset($_SESSION)); - // in PHP 5.3 we cannot reliably tell if a session has started - $this->assertFalse($storage->getSaveHandler()->isActive()); - // PHP session might have started, but the storage driver has not, so false is correct here - $this->assertFalse($storage->isStarted()); - - $key = $storage->getMetadataBag()->getStorageKey(); - $this->assertFalse(isset($_SESSION[$key])); - $storage->start(); - $this->assertTrue(isset($_SESSION[$key])); - } - - public function testPhpSession54() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->markTestSkipped('Test skipped, for PHP 5.4 only.'); - } - - $storage = $this->getStorage(); - - $this->assertFalse(isset($_SESSION)); - $this->assertFalse($storage->getSaveHandler()->isActive()); - $this->assertFalse($storage->isStarted()); - - session_start(); - $this->assertTrue(isset($_SESSION)); - // in PHP 5.4 we can reliably detect a session started - $this->assertTrue($storage->getSaveHandler()->isActive()); - // PHP session might have started, but the storage driver has not, so false is correct here - $this->assertFalse($storage->isStarted()); - - $key = $storage->getMetadataBag()->getStorageKey(); - $this->assertFalse(isset($_SESSION[$key])); - $storage->start(); - $this->assertTrue(isset($_SESSION[$key])); - } - - public function testClear() - { - $storage = $this->getStorage(); - session_start(); - $_SESSION['drak'] = 'loves symfony'; - $storage->getBag('attributes')->set('symfony', 'greatness'); - $key = $storage->getBag('attributes')->getStorageKey(); - $this->assertEquals($_SESSION[$key], array('symfony' => 'greatness')); - $this->assertEquals($_SESSION['drak'], 'loves symfony'); - $storage->clear(); - $this->assertEquals($_SESSION[$key], array()); - $this->assertEquals($_SESSION['drak'], 'loves symfony'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php deleted file mode 100644 index 58b632aeb0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php +++ /dev/null @@ -1,212 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Proxy; - -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy; - -// Note until PHPUnit_Mock_Objects 1.2 is released you cannot mock abstracts due to -// https://github.com/sebastianbergmann/phpunit-mock-objects/issues/73 -class ConcreteProxy extends AbstractProxy -{ - -} - -class ConcreteSessionHandlerInterfaceProxy extends AbstractProxy implements \SessionHandlerInterface -{ - public function open($savePath, $sessionName) - { - } - - public function close() - { - } - - public function read($id) - { - } - - public function write($id, $data) - { - } - - public function destroy($id) - { - } - - public function gc($maxlifetime) - { - } -} - -/** - * Test class for AbstractProxy. - * - * @author Drak - */ -class AbstractProxyTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var AbstractProxy - */ - protected $proxy; - - protected function setUp() - { - $this->proxy = new ConcreteProxy(); - } - - protected function tearDown() - { - $this->proxy = null; - } - - public function testGetSaveHandlerName() - { - $this->assertNull($this->proxy->getSaveHandlerName()); - } - - public function testIsSessionHandlerInterface() - { - $this->assertFalse($this->proxy->isSessionHandlerInterface()); - $sh = new ConcreteSessionHandlerInterfaceProxy(); - $this->assertTrue($sh->isSessionHandlerInterface()); - } - - public function testIsWrapper() - { - $this->assertFalse($this->proxy->isWrapper()); - } - - public function testIsActivePhp53() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - $this->markTestSkipped('Test skipped, for PHP 5.3 only.'); - } - - $this->assertFalse($this->proxy->isActive()); - } - - /** - * @runInSeparateProcess - */ - public function testIsActivePhp54() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->markTestSkipped('Test skipped, for PHP 5.4 only.'); - } - - $this->assertFalse($this->proxy->isActive()); - session_start(); - $this->assertTrue($this->proxy->isActive()); - } - - public function testSetActivePhp53() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - $this->markTestSkipped('Test skipped, for PHP 5.3 only.'); - } - - $this->proxy->setActive(true); - $this->assertTrue($this->proxy->isActive()); - $this->proxy->setActive(false); - $this->assertFalse($this->proxy->isActive()); - } - - /** - * @runInSeparateProcess - * @expectedException \LogicException - */ - public function testSetActivePhp54() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->markTestSkipped('Test skipped, for PHP 5.4 only.'); - } - - $this->proxy->setActive(true); - } - - /** - * @runInSeparateProcess - */ - public function testName() - { - $this->assertEquals(session_name(), $this->proxy->getName()); - $this->proxy->setName('foo'); - $this->assertEquals('foo', $this->proxy->getName()); - $this->assertEquals(session_name(), $this->proxy->getName()); - } - - /** - * @expectedException \LogicException - */ - public function testNameExceptionPhp53() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - $this->markTestSkipped('Test skipped, for PHP 5.3 only.'); - } - - $this->proxy->setActive(true); - $this->proxy->setName('foo'); - } - - /** - * @runInSeparateProcess - * @expectedException \LogicException - */ - public function testNameExceptionPhp54() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->markTestSkipped('Test skipped, for PHP 5.4 only.'); - } - - session_start(); - $this->proxy->setName('foo'); - } - - /** - * @runInSeparateProcess - */ - public function testId() - { - $this->assertEquals(session_id(), $this->proxy->getId()); - $this->proxy->setId('foo'); - $this->assertEquals('foo', $this->proxy->getId()); - $this->assertEquals(session_id(), $this->proxy->getId()); - } - - /** - * @expectedException \LogicException - */ - public function testIdExceptionPhp53() - { - if (version_compare(phpversion(), '5.4.0', '>=')) { - $this->markTestSkipped('Test skipped, for PHP 5.3 only.'); - } - - $this->proxy->setActive(true); - $this->proxy->setId('foo'); - } - - /** - * @runInSeparateProcess - * @expectedException \LogicException - */ - public function testIdExceptionPhp54() - { - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->markTestSkipped('Test skipped, for PHP 5.4 only.'); - } - - session_start(); - $this->proxy->setId('foo'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php deleted file mode 100644 index e9184ce06e..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/NativeProxyTest.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Proxy; - -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy; - -/** - * Test class for NativeProxy. - * - * @author Drak - */ -class NativeProxyTest extends \PHPUnit_Framework_TestCase -{ - public function testIsWrapper() - { - $proxy = new NativeProxy(); - $this->assertFalse($proxy->isWrapper()); - } - - public function testGetSaveHandlerName() - { - $name = ini_get('session.save_handler'); - $proxy = new NativeProxy(); - $this->assertEquals($name, $proxy->getSaveHandlerName()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php deleted file mode 100644 index 74d8419060..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Proxy; - -use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy; - -/** - * Tests for SessionHandlerProxy class. - * - * @author Drak - * - * @runTestsInSeparateProcesses - */ -class SessionHandlerProxyTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var \PHPUnit_Framework_MockObject_Matcher - */ - private $mock; - - /** - * @var SessionHandlerProxy - */ - private $proxy; - - protected function setUp() - { - $this->mock = $this->getMock('SessionHandlerInterface'); - $this->proxy = new SessionHandlerProxy($this->mock); - } - - protected function tearDown() - { - $this->mock = null; - $this->proxy = null; - } - - public function testOpen() - { - $this->mock->expects($this->once()) - ->method('open') - ->will($this->returnValue(true)); - - $this->assertFalse($this->proxy->isActive()); - $this->proxy->open('name', 'id'); - if (version_compare(phpversion(), '5.4.0', '<')) { - $this->assertTrue($this->proxy->isActive()); - } else { - $this->assertFalse($this->proxy->isActive()); - } - } - - public function testOpenFalse() - { - $this->mock->expects($this->once()) - ->method('open') - ->will($this->returnValue(false)); - - $this->assertFalse($this->proxy->isActive()); - $this->proxy->open('name', 'id'); - $this->assertFalse($this->proxy->isActive()); - } - - public function testClose() - { - $this->mock->expects($this->once()) - ->method('close') - ->will($this->returnValue(true)); - - $this->assertFalse($this->proxy->isActive()); - $this->proxy->close(); - $this->assertFalse($this->proxy->isActive()); - } - - public function testCloseFalse() - { - $this->mock->expects($this->once()) - ->method('close') - ->will($this->returnValue(false)); - - $this->assertFalse($this->proxy->isActive()); - $this->proxy->close(); - $this->assertFalse($this->proxy->isActive()); - } - - public function testRead() - { - $this->mock->expects($this->once()) - ->method('read'); - - $this->proxy->read('id'); - } - - public function testWrite() - { - $this->mock->expects($this->once()) - ->method('write'); - - $this->proxy->write('id', 'data'); - } - - public function testDestroy() - { - $this->mock->expects($this->once()) - ->method('destroy'); - - $this->proxy->destroy('id'); - } - - public function testGc() - { - $this->mock->expects($this->once()) - ->method('gc'); - - $this->proxy->gc(86400); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php deleted file mode 100644 index 0dfe651600..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Tests/StreamedResponseTest.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\HttpFoundation\Tests; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\StreamedResponse; - -class StreamedResponseTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $response = new StreamedResponse(function () { echo 'foo'; }, 404, array('Content-Type' => 'text/plain')); - - $this->assertEquals(404, $response->getStatusCode()); - $this->assertEquals('text/plain', $response->headers->get('Content-Type')); - } - - public function testPrepareWith11Protocol() - { - $response = new StreamedResponse(function () { echo 'foo'; }); - $request = Request::create('/'); - $request->server->set('SERVER_PROTOCOL', 'HTTP/1.1'); - - $response->prepare($request); - - $this->assertEquals('1.1', $response->getProtocolVersion()); - $this->assertNotEquals('chunked', $response->headers->get('Transfer-Encoding'), 'Apache assumes responses with a Transfer-Encoding header set to chunked to already be encoded.'); - $this->assertEquals('no-cache, private', $response->headers->get('Cache-Control')); - } - - public function testPrepareWith10Protocol() - { - $response = new StreamedResponse(function () { echo 'foo'; }); - $request = Request::create('/'); - $request->server->set('SERVER_PROTOCOL', 'HTTP/1.0'); - - $response->prepare($request); - - $this->assertEquals('1.0', $response->getProtocolVersion()); - $this->assertNull($response->headers->get('Transfer-Encoding')); - $this->assertEquals('no-cache, private', $response->headers->get('Cache-Control')); - } - - public function testPrepareWithHeadRequest() - { - $response = new StreamedResponse(function () { echo 'foo'; }); - $request = Request::create('/', 'HEAD'); - - $response->prepare($request); - } - - public function testSendContent() - { - $called = 0; - - $response = new StreamedResponse(function () use (&$called) { ++$called; }); - - $response->sendContent(); - $this->assertEquals(1, $called); - - $response->sendContent(); - $this->assertEquals(1, $called); - } - - /** - * @expectedException \LogicException - */ - public function testSendContentWithNonCallable() - { - $response = new StreamedResponse(null); - $response->sendContent(); - } - - /** - * @expectedException \LogicException - */ - public function testSetCallbackNonCallable() - { - $response = new StreamedResponse(null); - $response->setCallback(null); - } - - /** - * @expectedException \LogicException - */ - public function testSetContent() - { - $response = new StreamedResponse(function () { echo 'foo'; }); - $response->setContent('foo'); - } - - public function testGetContent() - { - $response = new StreamedResponse(function () { echo 'foo'; }); - $this->assertFalse($response->getContent()); - } - - public function testCreate() - { - $response = StreamedResponse::create(function () {}, 204); - - $this->assertInstanceOf('Symfony\Component\HttpFoundation\StreamedResponse', $response); - $this->assertEquals(204, $response->getStatusCode()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/composer.json b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/composer.json deleted file mode 100644 index 805268fb04..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/composer.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "symfony/http-foundation", - "type": "library", - "description": "Symfony HttpFoundation Component", - "keywords": [], - "homepage": "http://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "autoload": { - "psr-0": { "Symfony\\Component\\HttpFoundation\\": "" }, - "classmap": [ "Symfony/Component/HttpFoundation/Resources/stubs" ] - }, - "target-dir": "Symfony/Component/HttpFoundation", - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/phpunit.xml.dist b/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/phpunit.xml.dist deleted file mode 100644 index df11f72c0f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/phpunit.xml.dist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - ./Tests/ - - - - - - ./ - - ./Resources - ./Tests - ./vendor - - - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/.gitignore b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/.gitignore deleted file mode 100644 index c49a5d8df5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php deleted file mode 100644 index ebda0971c5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Annotation/Route.php +++ /dev/null @@ -1,161 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Annotation; - -/** - * Annotation class for @Route(). - * - * @Annotation - * - * @author Fabien Potencier - */ -class Route -{ - private $path; - private $name; - private $requirements = array(); - private $options = array(); - private $defaults = array(); - private $host; - private $methods = array(); - private $schemes = array(); - private $condition; - - /** - * Constructor. - * - * @param array $data An array of key/value parameters. - * - * @throws \BadMethodCallException - */ - public function __construct(array $data) - { - if (isset($data['value'])) { - $data['path'] = $data['value']; - unset($data['value']); - } - - foreach ($data as $key => $value) { - $method = 'set'.str_replace('_', '', $key); - if (!method_exists($this, $method)) { - throw new \BadMethodCallException(sprintf("Unknown property '%s' on annotation '%s'.", $key, get_class($this))); - } - $this->$method($value); - } - } - - /** - * @deprecated Deprecated in 2.2, to be removed in 3.0. Use setPath instead. - */ - public function setPattern($pattern) - { - $this->path = $pattern; - } - - /** - * @deprecated Deprecated in 2.2, to be removed in 3.0. Use getPath instead. - */ - public function getPattern() - { - return $this->path; - } - - public function setPath($path) - { - $this->path = $path; - } - - public function getPath() - { - return $this->path; - } - - public function setHost($pattern) - { - $this->host = $pattern; - } - - public function getHost() - { - return $this->host; - } - - public function setName($name) - { - $this->name = $name; - } - - public function getName() - { - return $this->name; - } - - public function setRequirements($requirements) - { - $this->requirements = $requirements; - } - - public function getRequirements() - { - return $this->requirements; - } - - public function setOptions($options) - { - $this->options = $options; - } - - public function getOptions() - { - return $this->options; - } - - public function setDefaults($defaults) - { - $this->defaults = $defaults; - } - - public function getDefaults() - { - return $this->defaults; - } - - public function setSchemes($schemes) - { - $this->schemes = is_array($schemes) ? $schemes : array($schemes); - } - - public function getSchemes() - { - return $this->schemes; - } - - public function setMethods($methods) - { - $this->methods = is_array($methods) ? $methods : array($methods); - } - - public function getMethods() - { - return $this->methods; - } - - public function setCondition($condition) - { - $this->condition = $condition; - } - - public function getCondition() - { - return $this->condition; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md deleted file mode 100644 index 8b604ead11..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CHANGELOG.md +++ /dev/null @@ -1,169 +0,0 @@ -CHANGELOG -========= - -2.5.0 ------ - - * [DEPRECATION] The `ApacheMatcherDumper` and `ApacheUrlMatcher` were deprecated and - will be removed in Symfony 3.0, since the performance gains were minimal and - it's hard to replicate the behaviour of PHP implementation. - -2.3.0 ------ - - * added RequestContext::getQueryString() - -2.2.0 ------ - - * [DEPRECATION] Several route settings have been renamed (the old ones will be removed in 3.0): - - * The `pattern` setting for a route has been deprecated in favor of `path` - * The `_scheme` and `_method` requirements have been moved to the `schemes` and `methods` settings - - Before: - - ``` - article_edit: - pattern: /article/{id} - requirements: { '_method': 'POST|PUT', '_scheme': 'https', 'id': '\d+' } - - - POST|PUT - https - \d+ - - - $route = new Route(); - $route->setPattern('/article/{id}'); - $route->setRequirement('_method', 'POST|PUT'); - $route->setRequirement('_scheme', 'https'); - ``` - - After: - - ``` - article_edit: - path: /article/{id} - methods: [POST, PUT] - schemes: https - requirements: { 'id': '\d+' } - - - \d+ - - - $route = new Route(); - $route->setPath('/article/{id}'); - $route->setMethods(array('POST', 'PUT')); - $route->setSchemes('https'); - ``` - - * [BC BREAK] RouteCollection does not behave like a tree structure anymore but as - a flat array of Routes. So when using PHP to build the RouteCollection, you must - make sure to add routes to the sub-collection before adding it to the parent - collection (this is not relevant when using YAML or XML for Route definitions). - - Before: - - ``` - $rootCollection = new RouteCollection(); - $subCollection = new RouteCollection(); - $rootCollection->addCollection($subCollection); - $subCollection->add('foo', new Route('/foo')); - ``` - - After: - - ``` - $rootCollection = new RouteCollection(); - $subCollection = new RouteCollection(); - $subCollection->add('foo', new Route('/foo')); - $rootCollection->addCollection($subCollection); - ``` - - Also one must call `addCollection` from the bottom to the top hierarchy. - So the correct sequence is the following (and not the reverse): - - ``` - $childCollection->->addCollection($grandchildCollection); - $rootCollection->addCollection($childCollection); - ``` - - * [DEPRECATION] The methods `RouteCollection::getParent()` and `RouteCollection::getRoot()` - have been deprecated and will be removed in Symfony 2.3. - * [BC BREAK] Misusing the `RouteCollection::addPrefix` method to add defaults, requirements - or options without adding a prefix is not supported anymore. So if you called `addPrefix` - with an empty prefix or `/` only (both have no relevance), like - `addPrefix('', $defaultsArray, $requirementsArray, $optionsArray)` - you need to use the new dedicated methods `addDefaults($defaultsArray)`, - `addRequirements($requirementsArray)` or `addOptions($optionsArray)` instead. - * [DEPRECATION] The `$options` parameter to `RouteCollection::addPrefix()` has been deprecated - because adding options has nothing to do with adding a path prefix. If you want to add options - to all child routes of a RouteCollection, you can use `addOptions()`. - * [DEPRECATION] The method `RouteCollection::getPrefix()` has been deprecated - because it suggested that all routes in the collection would have this prefix, which is - not necessarily true. On top of that, since there is no tree structure anymore, this method - is also useless. Don't worry about performance, prefix optimization for matching is still done - in the dumper, which was also improved in 2.2.0 to find even more grouping possibilities. - * [DEPRECATION] `RouteCollection::addCollection(RouteCollection $collection)` should now only be - used with a single parameter. The other params `$prefix`, `$default`, `$requirements` and `$options` - will still work, but have been deprecated. The `addPrefix` method should be used for this - use-case instead. - Before: `$parentCollection->addCollection($collection, '/prefix', array(...), array(...))` - After: - ``` - $collection->addPrefix('/prefix', array(...), array(...)); - $parentCollection->addCollection($collection); - ``` - * added support for the method default argument values when defining a @Route - * Adjacent placeholders without separator work now, e.g. `/{x}{y}{z}.{_format}`. - * Characters that function as separator between placeholders are now whitelisted - to fix routes with normal text around a variable, e.g. `/prefix{var}suffix`. - * [BC BREAK] The default requirement of a variable has been changed slightly. - Previously it disallowed the previous and the next char around a variable. Now - it disallows the slash (`/`) and the next char. Using the previous char added - no value and was problematic because the route `/index.{_format}` would be - matched by `/index.ht/ml`. - * The default requirement now uses possessive quantifiers when possible which - improves matching performance by up to 20% because it prevents backtracking - when it's not needed. - * The ConfigurableRequirementsInterface can now also be used to disable the requirements - check on URL generation completely by calling `setStrictRequirements(null)`. It - improves performance in production environment as you should know that params always - pass the requirements (otherwise it would break your link anyway). - * There is no restriction on the route name anymore. So non-alphanumeric characters - are now also allowed. - * [BC BREAK] `RouteCompilerInterface::compile(Route $route)` was made static - (only relevant if you implemented your own RouteCompiler). - * Added possibility to generate relative paths and network paths in the UrlGenerator, e.g. - "../parent-file" and "//example.com/dir/file". The third parameter in - `UrlGeneratorInterface::generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)` - now accepts more values and you should use the constants defined in `UrlGeneratorInterface` for - claritiy. The old method calls with a Boolean parameter will continue to work because they - equal the signature using the constants. - -2.1.0 ------ - - * added RequestMatcherInterface - * added RequestContext::fromRequest() - * the UrlMatcher does not throw a \LogicException anymore when the required - scheme is not the current one - * added TraceableUrlMatcher - * added the possibility to define options, default values and requirements - for placeholders in prefix, including imported routes - * added RouterInterface::getRouteCollection - * [BC BREAK] the UrlMatcher urldecodes the route parameters only once, they - were decoded twice before. Note that the `urldecode()` calls have been - changed for a single `rawurldecode()` in order to support `+` for input - paths. - * added RouteCollection::getRoot method to retrieve the root of a - RouteCollection tree - * [BC BREAK] made RouteCollection::setParent private which could not have - been used anyway without creating inconsistencies - * [BC BREAK] RouteCollection::remove also removes a route from parent - collections (not only from its children) - * added ConfigurableRequirementsInterface that allows to disable exceptions - (and generate empty URLs instead) when generating a route with an invalid - parameter value diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CompiledRoute.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CompiledRoute.php deleted file mode 100644 index 7878455427..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/CompiledRoute.php +++ /dev/null @@ -1,134 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -/** - * CompiledRoutes are returned by the RouteCompiler class. - * - * @author Fabien Potencier - */ -class CompiledRoute -{ - private $variables; - private $tokens; - private $staticPrefix; - private $regex; - private $pathVariables; - private $hostVariables; - private $hostRegex; - private $hostTokens; - - /** - * Constructor. - * - * @param string $staticPrefix The static prefix of the compiled route - * @param string $regex The regular expression to use to match this route - * @param array $tokens An array of tokens to use to generate URL for this route - * @param array $pathVariables An array of path variables - * @param string|null $hostRegex Host regex - * @param array $hostTokens Host tokens - * @param array $hostVariables An array of host variables - * @param array $variables An array of variables (variables defined in the path and in the host patterns) - */ - public function __construct($staticPrefix, $regex, array $tokens, array $pathVariables, $hostRegex = null, array $hostTokens = array(), array $hostVariables = array(), array $variables = array()) - { - $this->staticPrefix = (string) $staticPrefix; - $this->regex = $regex; - $this->tokens = $tokens; - $this->pathVariables = $pathVariables; - $this->hostRegex = $hostRegex; - $this->hostTokens = $hostTokens; - $this->hostVariables = $hostVariables; - $this->variables = $variables; - } - - /** - * Returns the static prefix. - * - * @return string The static prefix - */ - public function getStaticPrefix() - { - return $this->staticPrefix; - } - - /** - * Returns the regex. - * - * @return string The regex - */ - public function getRegex() - { - return $this->regex; - } - - /** - * Returns the host regex - * - * @return string|null The host regex or null - */ - public function getHostRegex() - { - return $this->hostRegex; - } - - /** - * Returns the tokens. - * - * @return array The tokens - */ - public function getTokens() - { - return $this->tokens; - } - - /** - * Returns the host tokens. - * - * @return array The tokens - */ - public function getHostTokens() - { - return $this->hostTokens; - } - - /** - * Returns the variables. - * - * @return array The variables - */ - public function getVariables() - { - return $this->variables; - } - - /** - * Returns the path variables. - * - * @return array The variables - */ - public function getPathVariables() - { - return $this->pathVariables; - } - - /** - * Returns the host variables. - * - * @return array The variables - */ - public function getHostVariables() - { - return $this->hostVariables; - } - -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php deleted file mode 100644 index 5289f525fc..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ExceptionInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Exception; - -/** - * ExceptionInterface - * - * @author Alexandre Salomé - * - * @api - */ -interface ExceptionInterface -{ -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php deleted file mode 100644 index 4f12469529..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/InvalidParameterException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Exception; - -/** - * Exception thrown when a parameter is not valid - * - * @author Alexandre Salomé - * - * @api - */ -class InvalidParameterException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php deleted file mode 100644 index 32f109137f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MethodNotAllowedException.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Exception; - -/** - * The resource was found but the request method is not allowed. - * - * This exception should trigger an HTTP 405 response in your application code. - * - * @author Kris Wallsmith - * - * @api - */ -class MethodNotAllowedException extends \RuntimeException implements ExceptionInterface -{ - /** - * @var array - */ - protected $allowedMethods = array(); - - public function __construct(array $allowedMethods, $message = null, $code = 0, \Exception $previous = null) - { - $this->allowedMethods = array_map('strtoupper', $allowedMethods); - - parent::__construct($message, $code, $previous); - } - - /** - * Gets the allowed HTTP methods. - * - * @return array - */ - public function getAllowedMethods() - { - return $this->allowedMethods; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php deleted file mode 100644 index 5a523fa559..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/MissingMandatoryParametersException.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Exception; - -/** - * Exception thrown when a route cannot be generated because of missing - * mandatory parameters. - * - * @author Alexandre Salomé - * - * @api - */ -class MissingMandatoryParametersException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php deleted file mode 100644 index 362a0d61f3..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/ResourceNotFoundException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Exception; - -/** - * The resource was not found. - * - * This exception should trigger an HTTP 404 response in your application code. - * - * @author Kris Wallsmith - * - * @api - */ -class ResourceNotFoundException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php deleted file mode 100644 index fd275bebe9..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Exception/RouteNotFoundException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Exception; - -/** - * Exception thrown when a route does not exist - * - * @author Alexandre Salomé - * - * @api - */ -class RouteNotFoundException extends \InvalidArgumentException implements ExceptionInterface -{ -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php deleted file mode 100644 index 8c25f34b12..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/ConfigurableRequirementsInterface.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Generator; - -/** - * ConfigurableRequirementsInterface must be implemented by URL generators that - * can be configured whether an exception should be generated when the parameters - * do not match the requirements. It is also possible to disable the requirements - * check for URL generation completely. - * - * The possible configurations and use-cases: - * - setStrictRequirements(true): Throw an exception for mismatching requirements. This - * is mostly useful in development environment. - * - setStrictRequirements(false): Don't throw an exception but return null as URL for - * mismatching requirements and log the problem. Useful when you cannot control all - * params because they come from third party libs but don't want to have a 404 in - * production environment. It should log the mismatch so one can review it. - * - setStrictRequirements(null): Return the URL with the given parameters without - * checking the requirements at all. When generating a URL you should either trust - * your params or you validated them beforehand because otherwise it would break your - * link anyway. So in production environment you should know that params always pass - * the requirements. Thus this option allows to disable the check on URL generation for - * performance reasons (saving a preg_match for each requirement every time a URL is - * generated). - * - * @author Fabien Potencier - * @author Tobias Schultze - */ -interface ConfigurableRequirementsInterface -{ - /** - * Enables or disables the exception on incorrect parameters. - * Passing null will deactivate the requirements check completely. - * - * @param Boolean|null $enabled - */ - public function setStrictRequirements($enabled); - - /** - * Returns whether to throw an exception on incorrect parameters. - * Null means the requirements check is deactivated completely. - * - * @return Boolean|null - */ - public function isStrictRequirements(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php deleted file mode 100644 index 4739bd8365..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumper.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Generator\Dumper; - -use Symfony\Component\Routing\RouteCollection; - -/** - * GeneratorDumper is the base class for all built-in generator dumpers. - * - * @author Fabien Potencier - */ -abstract class GeneratorDumper implements GeneratorDumperInterface -{ - /** - * @var RouteCollection - */ - private $routes; - - /** - * Constructor. - * - * @param RouteCollection $routes The RouteCollection to dump - */ - public function __construct(RouteCollection $routes) - { - $this->routes = $routes; - } - - /** - * {@inheritdoc} - */ - public function getRoutes() - { - return $this->routes; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php deleted file mode 100644 index deb0c0a2dd..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/GeneratorDumperInterface.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Generator\Dumper; - -use Symfony\Component\Routing\RouteCollection; - -/** - * GeneratorDumperInterface is the interface that all generator dumper classes must implement. - * - * @author Fabien Potencier - * - * @api - */ -interface GeneratorDumperInterface -{ - /** - * Dumps a set of routes to a string representation of executable code - * that can then be used to generate a URL of such a route. - * - * @param array $options An array of options - * - * @return string Executable code - */ - public function dump(array $options = array()); - - /** - * Gets the routes to dump. - * - * @return RouteCollection A RouteCollection instance - */ - public function getRoutes(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php deleted file mode 100644 index 8d4203019c..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/Dumper/PhpGeneratorDumper.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Generator\Dumper; - -/** - * PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes. - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -class PhpGeneratorDumper extends GeneratorDumper -{ - /** - * Dumps a set of routes to a PHP class. - * - * Available options: - * - * * class: The class name - * * base_class: The base class name - * - * @param array $options An array of options - * - * @return string A PHP class representing the generator class - * - * @api - */ - public function dump(array $options = array()) - { - $options = array_merge(array( - 'class' => 'ProjectUrlGenerator', - 'base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', - ), $options); - - return <<generateDeclaredRoutes()}; - - /** - * Constructor. - */ - public function __construct(RequestContext \$context, LoggerInterface \$logger = null) - { - \$this->context = \$context; - \$this->logger = \$logger; - } - -{$this->generateGenerateMethod()} -} - -EOF; - } - - /** - * Generates PHP code representing an array of defined routes - * together with the routes properties (e.g. requirements). - * - * @return string PHP code - */ - private function generateDeclaredRoutes() - { - $routes = "array(\n"; - foreach ($this->getRoutes()->all() as $name => $route) { - $compiledRoute = $route->compile(); - - $properties = array(); - $properties[] = $compiledRoute->getVariables(); - $properties[] = $route->getDefaults(); - $properties[] = $route->getRequirements(); - $properties[] = $compiledRoute->getTokens(); - $properties[] = $compiledRoute->getHostTokens(); - $properties[] = $route->getSchemes(); - - $routes .= sprintf(" '%s' => %s,\n", $name, str_replace("\n", '', var_export($properties, true))); - } - $routes .= ' )'; - - return $routes; - } - - /** - * Generates PHP code representing the `generate` method that implements the UrlGeneratorInterface. - * - * @return string PHP code - */ - private function generateGenerateMethod() - { - return <<doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$referenceType, \$hostTokens, \$requiredSchemes); - } -EOF; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php deleted file mode 100644 index 468708479b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGenerator.php +++ /dev/null @@ -1,339 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Generator; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\RequestContext; -use Symfony\Component\Routing\Exception\InvalidParameterException; -use Symfony\Component\Routing\Exception\RouteNotFoundException; -use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; -use Psr\Log\LoggerInterface; - -/** - * UrlGenerator can generate a URL or a path for any route in the RouteCollection - * based on the passed parameters. - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInterface -{ - /** - * @var RouteCollection - */ - protected $routes; - - /** - * @var RequestContext - */ - protected $context; - - /** - * @var Boolean|null - */ - protected $strictRequirements = true; - - /** - * @var LoggerInterface|null - */ - protected $logger; - - /** - * This array defines the characters (besides alphanumeric ones) that will not be percent-encoded in the path segment of the generated URL. - * - * PHP's rawurlencode() encodes all chars except "a-zA-Z0-9-._~" according to RFC 3986. But we want to allow some chars - * to be used in their literal form (reasons below). Other chars inside the path must of course be encoded, e.g. - * "?" and "#" (would be interpreted wrongly as query and fragment identifier), - * "'" and """ (are used as delimiters in HTML). - */ - protected $decodedChars = array( - // the slash can be used to designate a hierarchical structure and we want allow using it with this meaning - // some webservers don't allow the slash in encoded form in the path for security reasons anyway - // see http://stackoverflow.com/questions/4069002/http-400-if-2f-part-of-get-url-in-jboss - '%2F' => '/', - // the following chars are general delimiters in the URI specification but have only special meaning in the authority component - // so they can safely be used in the path in unencoded form - '%40' => '@', - '%3A' => ':', - // these chars are only sub-delimiters that have no predefined meaning and can therefore be used literally - // so URI producing applications can use these chars to delimit subcomponents in a path segment without being encoded for better readability - '%3B' => ';', - '%2C' => ',', - '%3D' => '=', - '%2B' => '+', - '%21' => '!', - '%2A' => '*', - '%7C' => '|', - ); - - /** - * Constructor. - * - * @param RouteCollection $routes A RouteCollection instance - * @param RequestContext $context The context - * @param LoggerInterface|null $logger A logger instance - * - * @api - */ - public function __construct(RouteCollection $routes, RequestContext $context, LoggerInterface $logger = null) - { - $this->routes = $routes; - $this->context = $context; - $this->logger = $logger; - } - - /** - * {@inheritdoc} - */ - public function setContext(RequestContext $context) - { - $this->context = $context; - } - - /** - * {@inheritdoc} - */ - public function getContext() - { - return $this->context; - } - - /** - * {@inheritdoc} - */ - public function setStrictRequirements($enabled) - { - $this->strictRequirements = null === $enabled ? null : (Boolean) $enabled; - } - - /** - * {@inheritdoc} - */ - public function isStrictRequirements() - { - return $this->strictRequirements; - } - - /** - * {@inheritDoc} - */ - public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH) - { - if (null === $route = $this->routes->get($name)) { - throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name)); - } - - // the Route has a cache of its own and is not recompiled as long as it does not get modified - $compiledRoute = $route->compile(); - - return $this->doGenerate($compiledRoute->getVariables(), $route->getDefaults(), $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $referenceType, $compiledRoute->getHostTokens(), $route->getSchemes()); - } - - /** - * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route - * @throws InvalidParameterException When a parameter value for a placeholder is not correct because - * it does not match the requirement - */ - protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array()) - { - $variables = array_flip($variables); - $mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters); - - // all params must be given - if ($diff = array_diff_key($variables, $mergedParams)) { - throw new MissingMandatoryParametersException(sprintf('Some mandatory parameters are missing ("%s") to generate a URL for route "%s".', implode('", "', array_keys($diff)), $name)); - } - - $url = ''; - $optional = true; - foreach ($tokens as $token) { - if ('variable' === $token[0]) { - if (!$optional || !array_key_exists($token[3], $defaults) || null !== $mergedParams[$token[3]] && (string) $mergedParams[$token[3]] !== (string) $defaults[$token[3]]) { - // check requirement - if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#', $mergedParams[$token[3]])) { - $message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]); - if ($this->strictRequirements) { - throw new InvalidParameterException($message); - } - - if ($this->logger) { - $this->logger->error($message); - } - - return null; - } - - $url = $token[1].$mergedParams[$token[3]].$url; - $optional = false; - } - } else { - // static text - $url = $token[1].$url; - $optional = false; - } - } - - if ('' === $url) { - $url = '/'; - } - - // the contexts base URL is already encoded (see Symfony\Component\HttpFoundation\Request) - $url = strtr(rawurlencode($url), $this->decodedChars); - - // the path segments "." and ".." are interpreted as relative reference when resolving a URI; see http://tools.ietf.org/html/rfc3986#section-3.3 - // so we need to encode them as they are not used for this purpose here - // otherwise we would generate a URI that, when followed by a user agent (e.g. browser), does not match this route - $url = strtr($url, array('/../' => '/%2E%2E/', '/./' => '/%2E/')); - if ('/..' === substr($url, -3)) { - $url = substr($url, 0, -2).'%2E%2E'; - } elseif ('/.' === substr($url, -2)) { - $url = substr($url, 0, -1).'%2E'; - } - - $schemeAuthority = ''; - if ($host = $this->context->getHost()) { - $scheme = $this->context->getScheme(); - - if ($requiredSchemes) { - $schemeMatched = false; - foreach ($requiredSchemes as $requiredScheme) { - if ($scheme === $requiredScheme) { - $schemeMatched = true; - - break; - } - } - - if (!$schemeMatched) { - $referenceType = self::ABSOLUTE_URL; - $scheme = current($requiredSchemes); - } - - } elseif (isset($requirements['_scheme']) && ($req = strtolower($requirements['_scheme'])) && $scheme !== $req) { - // We do this for BC; to be removed if _scheme is not supported anymore - $referenceType = self::ABSOLUTE_URL; - $scheme = $req; - } - - if ($hostTokens) { - $routeHost = ''; - foreach ($hostTokens as $token) { - if ('variable' === $token[0]) { - if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#', $mergedParams[$token[3]])) { - $message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]); - - if ($this->strictRequirements) { - throw new InvalidParameterException($message); - } - - if ($this->logger) { - $this->logger->error($message); - } - - return null; - } - - $routeHost = $token[1].$mergedParams[$token[3]].$routeHost; - } else { - $routeHost = $token[1].$routeHost; - } - } - - if ($routeHost !== $host) { - $host = $routeHost; - if (self::ABSOLUTE_URL !== $referenceType) { - $referenceType = self::NETWORK_PATH; - } - } - } - - if (self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) { - $port = ''; - if ('http' === $scheme && 80 != $this->context->getHttpPort()) { - $port = ':'.$this->context->getHttpPort(); - } elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) { - $port = ':'.$this->context->getHttpsPort(); - } - - $schemeAuthority = self::NETWORK_PATH === $referenceType ? '//' : "$scheme://"; - $schemeAuthority .= $host.$port; - } - } - - if (self::RELATIVE_PATH === $referenceType) { - $url = self::getRelativePath($this->context->getPathInfo(), $url); - } else { - $url = $schemeAuthority.$this->context->getBaseUrl().$url; - } - - // add a query string if needed - $extra = array_diff_key($parameters, $variables, $defaults); - if ($extra && $query = http_build_query($extra, '', '&')) { - $url .= '?'.$query; - } - - return $url; - } - - /** - * Returns the target path as relative reference from the base path. - * - * Only the URIs path component (no schema, host etc.) is relevant and must be given, starting with a slash. - * Both paths must be absolute and not contain relative parts. - * Relative URLs from one resource to another are useful when generating self-contained downloadable document archives. - * Furthermore, they can be used to reduce the link size in documents. - * - * Example target paths, given a base path of "/a/b/c/d": - * - "/a/b/c/d" -> "" - * - "/a/b/c/" -> "./" - * - "/a/b/" -> "../" - * - "/a/b/c/other" -> "other" - * - "/a/x/y" -> "../../x/y" - * - * @param string $basePath The base path - * @param string $targetPath The target path - * - * @return string The relative target path - */ - public static function getRelativePath($basePath, $targetPath) - { - if ($basePath === $targetPath) { - return ''; - } - - $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath); - $targetDirs = explode('/', isset($targetPath[0]) && '/' === $targetPath[0] ? substr($targetPath, 1) : $targetPath); - array_pop($sourceDirs); - $targetFile = array_pop($targetDirs); - - foreach ($sourceDirs as $i => $dir) { - if (isset($targetDirs[$i]) && $dir === $targetDirs[$i]) { - unset($sourceDirs[$i], $targetDirs[$i]); - } else { - break; - } - } - - $targetDirs[] = $targetFile; - $path = str_repeat('../', count($sourceDirs)).implode('/', $targetDirs); - - // A reference to the same base directory or an empty subdirectory must be prefixed with "./". - // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used - // as the first segment of a relative-path reference, as it would be mistaken for a scheme name - // (see http://tools.ietf.org/html/rfc3986#section-4.2). - return '' === $path || '/' === $path[0] - || false !== ($colonPos = strpos($path, ':')) && ($colonPos < ($slashPos = strpos($path, '/')) || false === $slashPos) - ? "./$path" : $path; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php deleted file mode 100644 index 8e3b2778b9..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Generator/UrlGeneratorInterface.php +++ /dev/null @@ -1,87 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Generator; - -use Symfony\Component\Routing\Exception\InvalidParameterException; -use Symfony\Component\Routing\Exception\MissingMandatoryParametersException; -use Symfony\Component\Routing\Exception\RouteNotFoundException; -use Symfony\Component\Routing\RequestContextAwareInterface; - -/** - * UrlGeneratorInterface is the interface that all URL generator classes must implement. - * - * The constants in this interface define the different types of resource references that - * are declared in RFC 3986: http://tools.ietf.org/html/rfc3986 - * We are using the term "URL" instead of "URI" as this is more common in web applications - * and we do not need to distinguish them as the difference is mostly semantical and - * less technical. Generating URIs, i.e. representation-independent resource identifiers, - * is also possible. - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -interface UrlGeneratorInterface extends RequestContextAwareInterface -{ - /** - * Generates an absolute URL, e.g. "http://example.com/dir/file". - */ - const ABSOLUTE_URL = true; - - /** - * Generates an absolute path, e.g. "/dir/file". - */ - const ABSOLUTE_PATH = false; - - /** - * Generates a relative path based on the current request path, e.g. "../parent-file". - * @see UrlGenerator::getRelativePath() - */ - const RELATIVE_PATH = 'relative'; - - /** - * Generates a network path, e.g. "//example.com/dir/file". - * Such reference reuses the current scheme but specifies the host. - */ - const NETWORK_PATH = 'network'; - - /** - * Generates a URL or path for a specific route based on the given parameters. - * - * Parameters that reference placeholders in the route pattern will substitute them in the - * path or host. Extra params are added as query string to the URL. - * - * When the passed reference type cannot be generated for the route because it requires a different - * host or scheme than the current one, the method will return a more comprehensive reference - * that includes the required params. For example, when you call this method with $referenceType = ABSOLUTE_PATH - * but the route requires the https scheme whereas the current scheme is http, it will instead return an - * ABSOLUTE_URL with the https scheme and the current host. This makes sure the generated URL matches - * the route in any case. - * - * If there is no route with the given name, the generator must throw the RouteNotFoundException. - * - * @param string $name The name of the route - * @param mixed $parameters An array of parameters - * @param Boolean|string $referenceType The type of reference to be generated (one of the constants) - * - * @return string The generated URL - * - * @throws RouteNotFoundException If the named route doesn't exist - * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route - * @throws InvalidParameterException When a parameter value for a placeholder is not correct because - * it does not match the requirement - * - * @api - */ - public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/LICENSE b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/LICENSE deleted file mode 100644 index 0b3292cf90..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2014 Fabien Potencier - -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/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php deleted file mode 100644 index 2c5fb18199..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationClassLoader.php +++ /dev/null @@ -1,268 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Loader; - -use Doctrine\Common\Annotations\Reader; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Config\Loader\LoaderInterface; -use Symfony\Component\Config\Loader\LoaderResolverInterface; - -/** - * AnnotationClassLoader loads routing information from a PHP class and its methods. - * - * You need to define an implementation for the getRouteDefaults() method. Most of the - * time, this method should define some PHP callable to be called for the route - * (a controller in MVC speak). - * - * The @Route annotation can be set on the class (for global parameters), - * and on each method. - * - * The @Route annotation main value is the route path. The annotation also - * recognizes several parameters: requirements, options, defaults, schemes, - * methods, host, and name. The name parameter is mandatory. - * Here is an example of how you should be able to use it: - * - * /** - * * @Route("/Blog") - * * / - * class Blog - * { - * /** - * * @Route("/", name="blog_index") - * * / - * public function index() - * { - * } - * - * /** - * * @Route("/{id}", name="blog_post", requirements = {"id" = "\d+"}) - * * / - * public function show() - * { - * } - * } - * - * @author Fabien Potencier - */ -abstract class AnnotationClassLoader implements LoaderInterface -{ - /** - * @var Reader - */ - protected $reader; - - /** - * @var string - */ - protected $routeAnnotationClass = 'Symfony\\Component\\Routing\\Annotation\\Route'; - - /** - * @var integer - */ - protected $defaultRouteIndex = 0; - - /** - * Constructor. - * - * @param Reader $reader - */ - public function __construct(Reader $reader) - { - $this->reader = $reader; - } - - /** - * Sets the annotation class to read route properties from. - * - * @param string $class A fully-qualified class name - */ - public function setRouteAnnotationClass($class) - { - $this->routeAnnotationClass = $class; - } - - /** - * Loads from annotations from a class. - * - * @param string $class A class name - * @param string|null $type The resource type - * - * @return RouteCollection A RouteCollection instance - * - * @throws \InvalidArgumentException When route can't be parsed - */ - public function load($class, $type = null) - { - if (!class_exists($class)) { - throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class)); - } - - $class = new \ReflectionClass($class); - if ($class->isAbstract()) { - throw new \InvalidArgumentException(sprintf('Annotations from class "%s" cannot be read as it is abstract.', $class)); - } - - $globals = $this->getGlobals($class); - - $collection = new RouteCollection(); - $collection->addResource(new FileResource($class->getFileName())); - - foreach ($class->getMethods() as $method) { - $this->defaultRouteIndex = 0; - foreach ($this->reader->getMethodAnnotations($method) as $annot) { - if ($annot instanceof $this->routeAnnotationClass) { - $this->addRoute($collection, $annot, $globals, $class, $method); - } - } - } - - return $collection; - } - - protected function addRoute(RouteCollection $collection, $annot, $globals, \ReflectionClass $class, \ReflectionMethod $method) - { - $name = $annot->getName(); - if (null === $name) { - $name = $this->getDefaultRouteName($class, $method); - } - - $defaults = array_replace($globals['defaults'], $annot->getDefaults()); - foreach ($method->getParameters() as $param) { - if (!isset($defaults[$param->getName()]) && $param->isOptional()) { - $defaults[$param->getName()] = $param->getDefaultValue(); - } - } - $requirements = array_replace($globals['requirements'], $annot->getRequirements()); - $options = array_replace($globals['options'], $annot->getOptions()); - $schemes = array_replace($globals['schemes'], $annot->getSchemes()); - $methods = array_replace($globals['methods'], $annot->getMethods()); - - $host = $annot->getHost(); - if (null === $host) { - $host = $globals['host']; - } - - $condition = $annot->getCondition(); - if (null === $condition) { - $condition = $globals['condition']; - } - - $route = $this->createRoute($globals['path'].$annot->getPath(), $defaults, $requirements, $options, $host, $schemes, $methods, $condition); - - $this->configureRoute($route, $class, $method, $annot); - - $collection->add($name, $route); - } - - /** - * {@inheritdoc} - */ - public function supports($resource, $type = null) - { - return is_string($resource) && preg_match('/^(?:\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)+$/', $resource) && (!$type || 'annotation' === $type); - } - - /** - * {@inheritdoc} - */ - public function setResolver(LoaderResolverInterface $resolver) - { - } - - /** - * {@inheritdoc} - */ - public function getResolver() - { - } - - /** - * Gets the default route name for a class method. - * - * @param \ReflectionClass $class - * @param \ReflectionMethod $method - * - * @return string - */ - protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method) - { - $name = strtolower(str_replace('\\', '_', $class->name).'_'.$method->name); - if ($this->defaultRouteIndex > 0) { - $name .= '_'.$this->defaultRouteIndex; - } - $this->defaultRouteIndex++; - - return $name; - } - - protected function getGlobals(\ReflectionClass $class) - { - $globals = array( - 'path' => '', - 'requirements' => array(), - 'options' => array(), - 'defaults' => array(), - 'schemes' => array(), - 'methods' => array(), - 'host' => '', - 'condition' => '', - ); - - if ($annot = $this->reader->getClassAnnotation($class, $this->routeAnnotationClass)) { - // for BC reasons - if (null !== $annot->getPath()) { - $globals['path'] = $annot->getPath(); - } elseif (null !== $annot->getPattern()) { - $globals['path'] = $annot->getPattern(); - } - - if (null !== $annot->getRequirements()) { - $globals['requirements'] = $annot->getRequirements(); - } - - if (null !== $annot->getOptions()) { - $globals['options'] = $annot->getOptions(); - } - - if (null !== $annot->getDefaults()) { - $globals['defaults'] = $annot->getDefaults(); - } - - if (null !== $annot->getSchemes()) { - $globals['schemes'] = $annot->getSchemes(); - } - - if (null !== $annot->getMethods()) { - $globals['methods'] = $annot->getMethods(); - } - - if (null !== $annot->getHost()) { - $globals['host'] = $annot->getHost(); - } - - if (null !== $annot->getCondition()) { - $globals['condition'] = $annot->getCondition(); - } - } - - return $globals; - } - - protected function createRoute($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition) - { - return new Route($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition); - } - - abstract protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php deleted file mode 100644 index abd68ed6c4..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationDirectoryLoader.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Loader; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Config\Resource\DirectoryResource; - -/** - * AnnotationDirectoryLoader loads routing information from annotations set - * on PHP classes and methods. - * - * @author Fabien Potencier - */ -class AnnotationDirectoryLoader extends AnnotationFileLoader -{ - /** - * Loads from annotations from a directory. - * - * @param string $path A directory path - * @param string|null $type The resource type - * - * @return RouteCollection A RouteCollection instance - * - * @throws \InvalidArgumentException When the directory does not exist or its routes cannot be parsed - */ - public function load($path, $type = null) - { - $dir = $this->locator->locate($path); - - $collection = new RouteCollection(); - $collection->addResource(new DirectoryResource($dir, '/\.php$/')); - $files = iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY)); - usort($files, function (\SplFileInfo $a, \SplFileInfo $b) { - return (string) $a > (string) $b ? 1 : -1; - }); - - foreach ($files as $file) { - if (!$file->isFile() || '.php' !== substr($file->getFilename(), -4)) { - continue; - } - - if ($class = $this->findClass($file)) { - $refl = new \ReflectionClass($class); - if ($refl->isAbstract()) { - continue; - } - - $collection->addCollection($this->loader->load($class, $type)); - } - } - - return $collection; - } - - /** - * {@inheritdoc} - */ - public function supports($resource, $type = null) - { - try { - $path = $this->locator->locate($resource); - } catch (\Exception $e) { - return false; - } - - return is_string($resource) && is_dir($path) && (!$type || 'annotation' === $type); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php deleted file mode 100644 index 33776fdc86..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/AnnotationFileLoader.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Loader; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Config\Loader\FileLoader; -use Symfony\Component\Config\FileLocatorInterface; - -/** - * AnnotationFileLoader loads routing information from annotations set - * on a PHP class and its methods. - * - * @author Fabien Potencier - */ -class AnnotationFileLoader extends FileLoader -{ - protected $loader; - - /** - * Constructor. - * - * @param FileLocatorInterface $locator A FileLocator instance - * @param AnnotationClassLoader $loader An AnnotationClassLoader instance - * @param string|array $paths A path or an array of paths where to look for resources - * - * @throws \RuntimeException - */ - public function __construct(FileLocatorInterface $locator, AnnotationClassLoader $loader, $paths = array()) - { - if (!function_exists('token_get_all')) { - throw new \RuntimeException('The Tokenizer extension is required for the routing annotation loaders.'); - } - - parent::__construct($locator, $paths); - - $this->loader = $loader; - } - - /** - * Loads from annotations from a file. - * - * @param string $file A PHP file path - * @param string|null $type The resource type - * - * @return RouteCollection A RouteCollection instance - * - * @throws \InvalidArgumentException When the file does not exist or its routes cannot be parsed - */ - public function load($file, $type = null) - { - $path = $this->locator->locate($file); - - $collection = new RouteCollection(); - if ($class = $this->findClass($path)) { - $collection->addResource(new FileResource($path)); - $collection->addCollection($this->loader->load($class, $type)); - } - - return $collection; - } - - /** - * {@inheritdoc} - */ - public function supports($resource, $type = null) - { - return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'annotation' === $type); - } - - /** - * Returns the full class name for the first class in the file. - * - * @param string $file A PHP file path - * - * @return string|false Full class name if found, false otherwise - */ - protected function findClass($file) - { - $class = false; - $namespace = false; - $tokens = token_get_all(file_get_contents($file)); - for ($i = 0, $count = count($tokens); $i < $count; $i++) { - $token = $tokens[$i]; - - if (!is_array($token)) { - continue; - } - - if (true === $class && T_STRING === $token[0]) { - return $namespace.'\\'.$token[1]; - } - - if (true === $namespace && T_STRING === $token[0]) { - $namespace = ''; - do { - $namespace .= $token[1]; - $token = $tokens[++$i]; - } while ($i < $count && is_array($token) && in_array($token[0], array(T_NS_SEPARATOR, T_STRING))); - } - - if (T_CLASS === $token[0]) { - $class = true; - } - - if (T_NAMESPACE === $token[0]) { - $namespace = true; - } - } - - return false; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php deleted file mode 100644 index 8212c2916d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/ClosureLoader.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Loader; - -use Symfony\Component\Config\Loader\Loader; -use Symfony\Component\Routing\RouteCollection; - -/** - * ClosureLoader loads routes from a PHP closure. - * - * The Closure must return a RouteCollection instance. - * - * @author Fabien Potencier - * - * @api - */ -class ClosureLoader extends Loader -{ - /** - * Loads a Closure. - * - * @param \Closure $closure A Closure - * @param string|null $type The resource type - * - * @return RouteCollection A RouteCollection instance - * - * @api - */ - public function load($closure, $type = null) - { - return call_user_func($closure); - } - - /** - * {@inheritdoc} - * - * @api - */ - public function supports($resource, $type = null) - { - return $resource instanceof \Closure && (!$type || 'closure' === $type); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php deleted file mode 100644 index 98b7efbf47..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/PhpFileLoader.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Loader; - -use Symfony\Component\Config\Loader\FileLoader; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Routing\RouteCollection; - -/** - * PhpFileLoader loads routes from a PHP file. - * - * The file must return a RouteCollection instance. - * - * @author Fabien Potencier - * - * @api - */ -class PhpFileLoader extends FileLoader -{ - /** - * Loads a PHP file. - * - * @param string $file A PHP file path - * @param string|null $type The resource type - * - * @return RouteCollection A RouteCollection instance - * - * @api - */ - public function load($file, $type = null) - { - // the loader variable is exposed to the included file below - $loader = $this; - - $path = $this->locator->locate($file); - $this->setCurrentDir(dirname($path)); - - $collection = include $path; - $collection->addResource(new FileResource($path)); - - return $collection; - } - - /** - * {@inheritdoc} - * - * @api - */ - public function supports($resource, $type = null) - { - return is_string($resource) && 'php' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'php' === $type); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php deleted file mode 100644 index 5838b8d341..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/XmlFileLoader.php +++ /dev/null @@ -1,245 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Loader; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\Route; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Config\Loader\FileLoader; -use Symfony\Component\Config\Util\XmlUtils; - -/** - * XmlFileLoader loads XML routing files. - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -class XmlFileLoader extends FileLoader -{ - const NAMESPACE_URI = 'http://symfony.com/schema/routing'; - const SCHEME_PATH = '/schema/routing/routing-1.0.xsd'; - - /** - * Loads an XML file. - * - * @param string $file An XML file path - * @param string|null $type The resource type - * - * @return RouteCollection A RouteCollection instance - * - * @throws \InvalidArgumentException When the file cannot be loaded or when the XML cannot be - * parsed because it does not validate against the scheme. - * - * @api - */ - public function load($file, $type = null) - { - $path = $this->locator->locate($file); - - $xml = $this->loadFile($path); - - $collection = new RouteCollection(); - $collection->addResource(new FileResource($path)); - - // process routes and imports - foreach ($xml->documentElement->childNodes as $node) { - if (!$node instanceof \DOMElement) { - continue; - } - - $this->parseNode($collection, $node, $path, $file); - } - - return $collection; - } - - /** - * Parses a node from a loaded XML file. - * - * @param RouteCollection $collection Collection to associate with the node - * @param \DOMElement $node Element to parse - * @param string $path Full path of the XML file being processed - * @param string $file Loaded file name - * - * @throws \InvalidArgumentException When the XML is invalid - */ - protected function parseNode(RouteCollection $collection, \DOMElement $node, $path, $file) - { - if (self::NAMESPACE_URI !== $node->namespaceURI) { - return; - } - - switch ($node->localName) { - case 'route': - $this->parseRoute($collection, $node, $path); - break; - case 'import': - $this->parseImport($collection, $node, $path, $file); - break; - default: - throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "route" or "import".', $node->localName, $path)); - } - } - - /** - * {@inheritdoc} - * - * @api - */ - public function supports($resource, $type = null) - { - return is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'xml' === $type); - } - - /** - * Parses a route and adds it to the RouteCollection. - * - * @param RouteCollection $collection RouteCollection instance - * @param \DOMElement $node Element to parse that represents a Route - * @param string $path Full path of the XML file being processed - * - * @throws \InvalidArgumentException When the XML is invalid - */ - protected function parseRoute(RouteCollection $collection, \DOMElement $node, $path) - { - if ('' === ($id = $node->getAttribute('id')) || (!$node->hasAttribute('pattern') && !$node->hasAttribute('path'))) { - throw new \InvalidArgumentException(sprintf('The element in file "%s" must have an "id" and a "path" attribute.', $path)); - } - - if ($node->hasAttribute('pattern')) { - if ($node->hasAttribute('path')) { - throw new \InvalidArgumentException(sprintf('The element in file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path)); - } - - $node->setAttribute('path', $node->getAttribute('pattern')); - $node->removeAttribute('pattern'); - } - - $schemes = preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY); - $methods = preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY); - - list($defaults, $requirements, $options, $condition) = $this->parseConfigs($node, $path); - - $route = new Route($node->getAttribute('path'), $defaults, $requirements, $options, $node->getAttribute('host'), $schemes, $methods, $condition); - $collection->add($id, $route); - } - - /** - * Parses an import and adds the routes in the resource to the RouteCollection. - * - * @param RouteCollection $collection RouteCollection instance - * @param \DOMElement $node Element to parse that represents a Route - * @param string $path Full path of the XML file being processed - * @param string $file Loaded file name - * - * @throws \InvalidArgumentException When the XML is invalid - */ - protected function parseImport(RouteCollection $collection, \DOMElement $node, $path, $file) - { - if ('' === $resource = $node->getAttribute('resource')) { - throw new \InvalidArgumentException(sprintf('The element in file "%s" must have a "resource" attribute.', $path)); - } - - $type = $node->getAttribute('type'); - $prefix = $node->getAttribute('prefix'); - $host = $node->hasAttribute('host') ? $node->getAttribute('host') : null; - $schemes = $node->hasAttribute('schemes') ? preg_split('/[\s,\|]++/', $node->getAttribute('schemes'), -1, PREG_SPLIT_NO_EMPTY) : null; - $methods = $node->hasAttribute('methods') ? preg_split('/[\s,\|]++/', $node->getAttribute('methods'), -1, PREG_SPLIT_NO_EMPTY) : null; - - list($defaults, $requirements, $options, $condition) = $this->parseConfigs($node, $path); - - $this->setCurrentDir(dirname($path)); - - $subCollection = $this->import($resource, ('' !== $type ? $type : null), false, $file); - /* @var $subCollection RouteCollection */ - $subCollection->addPrefix($prefix); - if (null !== $host) { - $subCollection->setHost($host); - } - if (null !== $condition) { - $subCollection->setCondition($condition); - } - if (null !== $schemes) { - $subCollection->setSchemes($schemes); - } - if (null !== $methods) { - $subCollection->setMethods($methods); - } - $subCollection->addDefaults($defaults); - $subCollection->addRequirements($requirements); - $subCollection->addOptions($options); - - $collection->addCollection($subCollection); - } - - /** - * Loads an XML file. - * - * @param string $file An XML file path - * - * @return \DOMDocument - * - * @throws \InvalidArgumentException When loading of XML file fails because of syntax errors - * or when the XML structure is not as expected by the scheme - - * see validate() - */ - protected function loadFile($file) - { - return XmlUtils::loadFile($file, __DIR__.static::SCHEME_PATH); - } - - /** - * Parses the config elements (default, requirement, option). - * - * @param \DOMElement $node Element to parse that contains the configs - * @param string $path Full path of the XML file being processed - * - * @return array An array with the defaults as first item, requirements as second and options as third. - * - * @throws \InvalidArgumentException When the XML is invalid - */ - private function parseConfigs(\DOMElement $node, $path) - { - $defaults = array(); - $requirements = array(); - $options = array(); - $condition = null; - - foreach ($node->getElementsByTagNameNS(self::NAMESPACE_URI, '*') as $n) { - switch ($n->localName) { - case 'default': - if ($n->hasAttribute('xsi:nil') && 'true' == $n->getAttribute('xsi:nil')) { - $defaults[$n->getAttribute('key')] = null; - } else { - $defaults[$n->getAttribute('key')] = trim($n->textContent); - } - - break; - case 'requirement': - $requirements[$n->getAttribute('key')] = trim($n->textContent); - break; - case 'option': - $options[$n->getAttribute('key')] = trim($n->textContent); - break; - case 'condition': - $condition = trim($n->textContent); - break; - default: - throw new \InvalidArgumentException(sprintf('Unknown tag "%s" used in file "%s". Expected "default", "requirement" or "option".', $n->localName, $path)); - } - } - - return array($defaults, $requirements, $options, $condition); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php deleted file mode 100644 index 8dca68b7a7..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/YamlFileLoader.php +++ /dev/null @@ -1,217 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Loader; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\Route; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Yaml\Parser as YamlParser; -use Symfony\Component\Config\Loader\FileLoader; - -/** - * YamlFileLoader loads Yaml routing files. - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -class YamlFileLoader extends FileLoader -{ - private static $availableKeys = array( - 'resource', 'type', 'prefix', 'pattern', 'path', 'host', 'schemes', 'methods', 'defaults', 'requirements', 'options', 'condition' - ); - private $yamlParser; - - /** - * Loads a Yaml file. - * - * @param string $file A Yaml file path - * @param string|null $type The resource type - * - * @return RouteCollection A RouteCollection instance - * - * @throws \InvalidArgumentException When a route can't be parsed because YAML is invalid - * - * @api - */ - public function load($file, $type = null) - { - $path = $this->locator->locate($file); - - if (!stream_is_local($path)) { - throw new \InvalidArgumentException(sprintf('This is not a local file "%s".', $path)); - } - - if (!file_exists($path)) { - throw new \InvalidArgumentException(sprintf('File "%s" not found.', $path)); - } - - if (null === $this->yamlParser) { - $this->yamlParser = new YamlParser(); - } - - $config = $this->yamlParser->parse(file_get_contents($path)); - - $collection = new RouteCollection(); - $collection->addResource(new FileResource($path)); - - // empty file - if (null === $config) { - return $collection; - } - - // not an array - if (!is_array($config)) { - throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $path)); - } - - foreach ($config as $name => $config) { - if (isset($config['pattern'])) { - if (isset($config['path'])) { - throw new \InvalidArgumentException(sprintf('The file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path)); - } - - $config['path'] = $config['pattern']; - unset($config['pattern']); - } - - $this->validate($config, $name, $path); - - if (isset($config['resource'])) { - $this->parseImport($collection, $config, $path, $file); - } else { - $this->parseRoute($collection, $name, $config, $path); - } - } - - return $collection; - } - - /** - * {@inheritdoc} - * - * @api - */ - public function supports($resource, $type = null) - { - return is_string($resource) && 'yml' === pathinfo($resource, PATHINFO_EXTENSION) && (!$type || 'yaml' === $type); - } - - /** - * Parses a route and adds it to the RouteCollection. - * - * @param RouteCollection $collection A RouteCollection instance - * @param string $name Route name - * @param array $config Route definition - * @param string $path Full path of the YAML file being processed - */ - protected function parseRoute(RouteCollection $collection, $name, array $config, $path) - { - $defaults = isset($config['defaults']) ? $config['defaults'] : array(); - $requirements = isset($config['requirements']) ? $config['requirements'] : array(); - $options = isset($config['options']) ? $config['options'] : array(); - $host = isset($config['host']) ? $config['host'] : ''; - $schemes = isset($config['schemes']) ? $config['schemes'] : array(); - $methods = isset($config['methods']) ? $config['methods'] : array(); - $condition = isset($config['condition']) ? $config['condition'] : null; - - $route = new Route($config['path'], $defaults, $requirements, $options, $host, $schemes, $methods, $condition); - - $collection->add($name, $route); - } - - /** - * Parses an import and adds the routes in the resource to the RouteCollection. - * - * @param RouteCollection $collection A RouteCollection instance - * @param array $config Route definition - * @param string $path Full path of the YAML file being processed - * @param string $file Loaded file name - */ - protected function parseImport(RouteCollection $collection, array $config, $path, $file) - { - $type = isset($config['type']) ? $config['type'] : null; - $prefix = isset($config['prefix']) ? $config['prefix'] : ''; - $defaults = isset($config['defaults']) ? $config['defaults'] : array(); - $requirements = isset($config['requirements']) ? $config['requirements'] : array(); - $options = isset($config['options']) ? $config['options'] : array(); - $host = isset($config['host']) ? $config['host'] : null; - $condition = isset($config['condition']) ? $config['condition'] : null; - $schemes = isset($config['schemes']) ? $config['schemes'] : null; - $methods = isset($config['methods']) ? $config['methods'] : null; - - $this->setCurrentDir(dirname($path)); - - $subCollection = $this->import($config['resource'], $type, false, $file); - /* @var $subCollection RouteCollection */ - $subCollection->addPrefix($prefix); - if (null !== $host) { - $subCollection->setHost($host); - } - if (null !== $condition) { - $subCollection->setCondition($condition); - } - if (null !== $schemes) { - $subCollection->setSchemes($schemes); - } - if (null !== $methods) { - $subCollection->setMethods($methods); - } - $subCollection->addDefaults($defaults); - $subCollection->addRequirements($requirements); - $subCollection->addOptions($options); - - $collection->addCollection($subCollection); - } - - /** - * Validates the route configuration. - * - * @param array $config A resource config - * @param string $name The config key - * @param string $path The loaded file path - * - * @throws \InvalidArgumentException If one of the provided config keys is not supported, - * something is missing or the combination is nonsense - */ - protected function validate($config, $name, $path) - { - if (!is_array($config)) { - throw new \InvalidArgumentException(sprintf('The definition of "%s" in "%s" must be a YAML array.', $name, $path)); - } - if ($extraKeys = array_diff(array_keys($config), self::$availableKeys)) { - throw new \InvalidArgumentException(sprintf( - 'The routing file "%s" contains unsupported keys for "%s": "%s". Expected one of: "%s".', - $path, $name, implode('", "', $extraKeys), implode('", "', self::$availableKeys) - )); - } - if (isset($config['resource']) && isset($config['path'])) { - throw new \InvalidArgumentException(sprintf( - 'The routing file "%s" must not specify both the "resource" key and the "path" key for "%s". Choose between an import and a route definition.', - $path, $name - )); - } - if (!isset($config['resource']) && isset($config['type'])) { - throw new \InvalidArgumentException(sprintf( - 'The "type" key for the route definition "%s" in "%s" is unsupported. It is only available for imports in combination with the "resource" key.', - $name, $path - )); - } - if (!isset($config['resource']) && !isset($config['path'])) { - throw new \InvalidArgumentException(sprintf( - 'You must define a "path" for the route "%s" in file "%s".', - $name, $path - )); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd deleted file mode 100644 index 9ab969a41d..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Loader/schema/routing/routing-1.0.xsd +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php deleted file mode 100644 index 35b1dc50ed..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/ApacheUrlMatcher.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher; - -use Symfony\Component\Routing\Exception\MethodNotAllowedException; - -/** - * ApacheUrlMatcher matches URL based on Apache mod_rewrite matching (see ApacheMatcherDumper). - * - * @deprecated Deprecated since version 2.5, to be removed in 3.0. - * The performance gains are minimal and it's very hard to replicate - * the behavior of PHP implementation. - * - * @author Fabien Potencier - * @author Arnaud Le Blanc - */ -class ApacheUrlMatcher extends UrlMatcher -{ - /** - * Tries to match a URL based on Apache mod_rewrite matching. - * - * Returns false if no route matches the URL. - * - * @param string $pathinfo The pathinfo to be parsed - * - * @return array An array of parameters - * - * @throws MethodNotAllowedException If the current method is not allowed - */ - public function match($pathinfo) - { - $parameters = array(); - $defaults = array(); - $allow = array(); - $route = null; - - foreach ($this->denormalizeValues($_SERVER) as $key => $value) { - $name = $key; - - // skip non-routing variables - // this improves performance when $_SERVER contains many usual - // variables like HTTP_*, DOCUMENT_ROOT, REQUEST_URI, ... - if (false === strpos($name, '_ROUTING_')) { - continue; - } - - while (0 === strpos($name, 'REDIRECT_')) { - $name = substr($name, 9); - } - - // expect _ROUTING__ - // or _ROUTING_ - - if (0 !== strpos($name, '_ROUTING_')) { - continue; - } - if (false !== $pos = strpos($name, '_', 9)) { - $type = substr($name, 9, $pos-9); - $name = substr($name, $pos+1); - } else { - $type = substr($name, 9); - } - - if ('param' === $type) { - if ('' !== $value) { - $parameters[$name] = $value; - } - } elseif ('default' === $type) { - $defaults[$name] = $value; - } elseif ('route' === $type) { - $route = $value; - } elseif ('allow' === $type) { - $allow[] = $name; - } - - unset($_SERVER[$key]); - } - - if (null !== $route) { - $parameters['_route'] = $route; - - return $this->mergeDefaults($parameters, $defaults); - } elseif (0 < count($allow)) { - throw new MethodNotAllowedException($allow); - } else { - return parent::match($pathinfo); - } - } - - /** - * Denormalizes an array of values. - * - * @param string[] $values - * - * @return array - */ - private function denormalizeValues(array $values) - { - $normalizedValues = array(); - foreach ($values as $key => $value) { - if (preg_match('~^(.*)\[(\d+)\]$~', $key, $matches)) { - if (!isset($normalizedValues[$matches[1]])) { - $normalizedValues[$matches[1]] = array(); - } - $normalizedValues[$matches[1]][(int) $matches[2]] = $value; - } else { - $normalizedValues[$key] = $value; - } - } - - return $normalizedValues; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php deleted file mode 100644 index fc76c19277..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/ApacheMatcherDumper.php +++ /dev/null @@ -1,281 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher\Dumper; - -use Symfony\Component\Routing\Route; - -/** - * Dumps a set of Apache mod_rewrite rules. - * - * @deprecated Deprecated since version 2.5, to be removed in 3.0. - * The performance gains are minimal and it's very hard to replicate - * the behavior of PHP implementation. - * - * @author Fabien Potencier - * @author Kris Wallsmith - */ -class ApacheMatcherDumper extends MatcherDumper -{ - /** - * Dumps a set of Apache mod_rewrite rules. - * - * Available options: - * - * * script_name: The script name (app.php by default) - * * base_uri: The base URI ("" by default) - * - * @param array $options An array of options - * - * @return string A string to be used as Apache rewrite rules - * - * @throws \LogicException When the route regex is invalid - */ - public function dump(array $options = array()) - { - $options = array_merge(array( - 'script_name' => 'app.php', - 'base_uri' => '', - ), $options); - - $options['script_name'] = self::escape($options['script_name'], ' ', '\\'); - - $rules = array("# skip \"real\" requests\nRewriteCond %{REQUEST_FILENAME} -f\nRewriteRule .* - [QSA,L]"); - $methodVars = array(); - $hostRegexUnique = 0; - $prevHostRegex = ''; - - foreach ($this->getRoutes()->all() as $name => $route) { - if ($route->getCondition()) { - throw new \LogicException(sprintf('Unable to dump the routes for Apache as route "%s" has a condition.', $name)); - } - - $compiledRoute = $route->compile(); - $hostRegex = $compiledRoute->getHostRegex(); - - if (null !== $hostRegex && $prevHostRegex !== $hostRegex) { - $prevHostRegex = $hostRegex; - $hostRegexUnique++; - - $rule = array(); - - $regex = $this->regexToApacheRegex($hostRegex); - $regex = self::escape($regex, ' ', '\\'); - - $rule[] = sprintf('RewriteCond %%{HTTP:Host} %s', $regex); - - $variables = array(); - $variables[] = sprintf('E=__ROUTING_host_%s:1', $hostRegexUnique); - - foreach ($compiledRoute->getHostVariables() as $i => $variable) { - $variables[] = sprintf('E=__ROUTING_host_%s_%s:%%%d', $hostRegexUnique, $variable, $i+1); - } - - $variables = implode(',', $variables); - - $rule[] = sprintf('RewriteRule .? - [%s]', $variables); - - $rules[] = implode("\n", $rule); - } - - $rules[] = $this->dumpRoute($name, $route, $options, $hostRegexUnique); - - if ($req = $route->getRequirement('_method')) { - $methods = explode('|', strtoupper($req)); - $methodVars = array_merge($methodVars, $methods); - } - } - if (0 < count($methodVars)) { - $rule = array('# 405 Method Not Allowed'); - $methodVars = array_values(array_unique($methodVars)); - if (in_array('GET', $methodVars) && !in_array('HEAD', $methodVars)) { - $methodVars[] = 'HEAD'; - } - foreach ($methodVars as $i => $methodVar) { - $rule[] = sprintf('RewriteCond %%{ENV:_ROUTING__allow_%s} =1%s', $methodVar, isset($methodVars[$i + 1]) ? ' [OR]' : ''); - } - $rule[] = sprintf('RewriteRule .* %s [QSA,L]', $options['script_name']); - - $rules[] = implode("\n", $rule); - } - - return implode("\n\n", $rules)."\n"; - } - - /** - * Dumps a single route - * - * @param string $name Route name - * @param Route $route The route - * @param array $options Options - * @param bool $hostRegexUnique Unique identifier for the host regex - * - * @return string The compiled route - */ - private function dumpRoute($name, $route, array $options, $hostRegexUnique) - { - $compiledRoute = $route->compile(); - - // prepare the apache regex - $regex = $this->regexToApacheRegex($compiledRoute->getRegex()); - $regex = '^'.self::escape(preg_quote($options['base_uri']).substr($regex, 1), ' ', '\\'); - - $methods = $this->getRouteMethods($route); - - $hasTrailingSlash = (!$methods || in_array('HEAD', $methods)) && '/$' === substr($regex, -2) && '^/$' !== $regex; - - $variables = array('E=_ROUTING_route:'.$name); - foreach ($compiledRoute->getHostVariables() as $variable) { - $variables[] = sprintf('E=_ROUTING_param_%s:%%{ENV:__ROUTING_host_%s_%s}', $variable, $hostRegexUnique, $variable); - } - foreach ($compiledRoute->getPathVariables() as $i => $variable) { - $variables[] = 'E=_ROUTING_param_'.$variable.':%'.($i + 1); - } - foreach ($this->normalizeValues($route->getDefaults()) as $key => $value) { - $variables[] = 'E=_ROUTING_default_'.$key.':'.strtr($value, array( - ':' => '\\:', - '=' => '\\=', - '\\' => '\\\\', - ' ' => '\\ ', - )); - } - $variables = implode(',', $variables); - - $rule = array("# $name"); - - // method mismatch - if (0 < count($methods)) { - $allow = array(); - foreach ($methods as $method) { - $allow[] = 'E=_ROUTING_allow_'.$method.':1'; - } - - if ($compiledRoute->getHostRegex()) { - $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique); - } - - $rule[] = "RewriteCond %{REQUEST_URI} $regex"; - $rule[] = sprintf("RewriteCond %%{REQUEST_METHOD} !^(%s)$ [NC]", implode('|', $methods)); - $rule[] = sprintf('RewriteRule .* - [S=%d,%s]', $hasTrailingSlash ? 2 : 1, implode(',', $allow)); - } - - // redirect with trailing slash appended - if ($hasTrailingSlash) { - if ($compiledRoute->getHostRegex()) { - $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique); - } - - $rule[] = 'RewriteCond %{REQUEST_URI} '.substr($regex, 0, -2).'$'; - $rule[] = 'RewriteRule .* $0/ [QSA,L,R=301]'; - } - - // the main rule - - if ($compiledRoute->getHostRegex()) { - $rule[] = sprintf("RewriteCond %%{ENV:__ROUTING_host_%s} =1", $hostRegexUnique); - } - - $rule[] = "RewriteCond %{REQUEST_URI} $regex"; - $rule[] = "RewriteRule .* {$options['script_name']} [QSA,L,$variables]"; - - return implode("\n", $rule); - } - - /** - * Returns methods allowed for a route - * - * @param Route $route The route - * - * @return array The methods - */ - private function getRouteMethods(Route $route) - { - $methods = array(); - if ($req = $route->getRequirement('_method')) { - $methods = explode('|', strtoupper($req)); - // GET and HEAD are equivalent - if (in_array('GET', $methods) && !in_array('HEAD', $methods)) { - $methods[] = 'HEAD'; - } - } - - return $methods; - } - - /** - * Converts a regex to make it suitable for mod_rewrite - * - * @param string $regex The regex - * - * @return string The converted regex - */ - private function regexToApacheRegex($regex) - { - $regexPatternEnd = strrpos($regex, $regex[0]); - - return preg_replace('/\?P<.+?>/', '', substr($regex, 1, $regexPatternEnd - 1)); - } - - /** - * Escapes a string. - * - * @param string $string The string to be escaped - * @param string $char The character to be escaped - * @param string $with The character to be used for escaping - * - * @return string The escaped string - */ - private static function escape($string, $char, $with) - { - $escaped = false; - $output = ''; - foreach (str_split($string) as $symbol) { - if ($escaped) { - $output .= $symbol; - $escaped = false; - continue; - } - if ($symbol === $char) { - $output .= $with.$char; - continue; - } - if ($symbol === $with) { - $escaped = true; - } - $output .= $symbol; - } - - return $output; - } - - /** - * Normalizes an array of values. - * - * @param array $values - * - * @return string[] - */ - private function normalizeValues(array $values) - { - $normalizedValues = array(); - foreach ($values as $key => $value) { - if (is_array($value)) { - foreach ($value as $index => $bit) { - $normalizedValues[sprintf('%s[%s]', $key, $index)] = $bit; - } - } else { - $normalizedValues[$key] = (string) $value; - } - } - - return $normalizedValues; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php deleted file mode 100644 index 612ac0d25a..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperCollection.php +++ /dev/null @@ -1,159 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher\Dumper; - -/** - * Collection of routes. - * - * @author Arnaud Le Blanc - */ -class DumperCollection implements \IteratorAggregate -{ - /** - * @var DumperCollection|null - */ - private $parent; - - /** - * @var (DumperCollection|DumperRoute)[] - */ - private $children = array(); - - /** - * @var array - */ - private $attributes = array(); - - /** - * Returns the children routes and collections. - * - * @return (DumperCollection|DumperRoute)[] Array of DumperCollection|DumperRoute - */ - public function all() - { - return $this->children; - } - - /** - * Adds a route or collection - * - * @param DumperRoute|DumperCollection The route or collection - */ - public function add($child) - { - if ($child instanceof DumperCollection) { - $child->setParent($this); - } - $this->children[] = $child; - } - - /** - * Sets children. - * - * @param array $children The children - */ - public function setAll(array $children) - { - foreach ($children as $child) { - if ($child instanceof DumperCollection) { - $child->setParent($this); - } - } - $this->children = $children; - } - - /** - * Returns an iterator over the children. - * - * @return \Iterator The iterator - */ - public function getIterator() - { - return new \ArrayIterator($this->children); - } - - /** - * Returns the root of the collection. - * - * @return DumperCollection The root collection - */ - public function getRoot() - { - return (null !== $this->parent) ? $this->parent->getRoot() : $this; - } - - /** - * Returns the parent collection. - * - * @return DumperCollection|null The parent collection or null if the collection has no parent - */ - protected function getParent() - { - return $this->parent; - } - - /** - * Sets the parent collection. - * - * @param DumperCollection $parent The parent collection - */ - protected function setParent(DumperCollection $parent) - { - $this->parent = $parent; - } - - /** - * Returns true if the attribute is defined. - * - * @param string $name The attribute name - * - * @return Boolean true if the attribute is defined, false otherwise - */ - public function hasAttribute($name) - { - return array_key_exists($name, $this->attributes); - } - - /** - * Returns an attribute by name. - * - * @param string $name The attribute name - * @param mixed $default Default value is the attribute doesn't exist - * - * @return mixed The attribute value - */ - public function getAttribute($name, $default = null) - { - return $this->hasAttribute($name) ? $this->attributes[$name] : $default; - } - - /** - * Sets an attribute by name. - * - * @param string $name The attribute name - * @param mixed $value The attribute value - */ - public function setAttribute($name, $value) - { - $this->attributes[$name] = $value; - } - - /** - * Sets multiple attributes. - * - * @param array $attributes The attributes - */ - public function setAttributes($attributes) - { - $this->attributes = $attributes; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php deleted file mode 100644 index 26382b0b4f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher\Dumper; - -/** - * Prefix tree of routes preserving routes order. - * - * @author Arnaud Le Blanc - */ -class DumperPrefixCollection extends DumperCollection -{ - /** - * @var string - */ - private $prefix = ''; - - /** - * Returns the prefix. - * - * @return string The prefix - */ - public function getPrefix() - { - return $this->prefix; - } - - /** - * Sets the prefix. - * - * @param string $prefix The prefix - */ - public function setPrefix($prefix) - { - $this->prefix = $prefix; - } - - /** - * Adds a route in the tree. - * - * @param DumperRoute $route The route - * - * @return DumperPrefixCollection The node the route was added to - * - * @throws \LogicException - */ - public function addPrefixRoute(DumperRoute $route) - { - $prefix = $route->getRoute()->compile()->getStaticPrefix(); - - // Same prefix, add to current leave - if ($this->prefix === $prefix) { - $this->add($route); - - return $this; - } - - // Prefix starts with route's prefix - if ('' === $this->prefix || 0 === strpos($prefix, $this->prefix)) { - $collection = new DumperPrefixCollection(); - $collection->setPrefix(substr($prefix, 0, strlen($this->prefix)+1)); - $this->add($collection); - - return $collection->addPrefixRoute($route); - } - - // No match, fallback to parent (recursively) - - if (null === $parent = $this->getParent()) { - throw new \LogicException("The collection root must not have a prefix"); - } - - return $parent->addPrefixRoute($route); - } - - /** - * Merges nodes whose prefix ends with a slash - * - * Children of a node whose prefix ends with a slash are moved to the parent node - */ - public function mergeSlashNodes() - { - $children = array(); - - foreach ($this as $child) { - if ($child instanceof self) { - $child->mergeSlashNodes(); - if ('/' === substr($child->prefix, -1)) { - $children = array_merge($children, $child->all()); - } else { - $children[] = $child; - } - } else { - $children[] = $child; - } - } - - $this->setAll($children); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php deleted file mode 100644 index 2928cdcc0b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/DumperRoute.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher\Dumper; - -use Symfony\Component\Routing\Route; - -/** - * Container for a Route. - * - * @author Arnaud Le Blanc - */ -class DumperRoute -{ - /** - * @var string - */ - private $name; - - /** - * @var Route - */ - private $route; - - /** - * Constructor. - * - * @param string $name The route name - * @param Route $route The route - */ - public function __construct($name, Route $route) - { - $this->name = $name; - $this->route = $route; - } - - /** - * Returns the route name. - * - * @return string The route name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns the route. - * - * @return Route The route - */ - public function getRoute() - { - return $this->route; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php deleted file mode 100644 index 52edc017e8..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumper.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher\Dumper; - -use Symfony\Component\Routing\RouteCollection; - -/** - * MatcherDumper is the abstract class for all built-in matcher dumpers. - * - * @author Fabien Potencier - */ -abstract class MatcherDumper implements MatcherDumperInterface -{ - /** - * @var RouteCollection - */ - private $routes; - - /** - * Constructor. - * - * @param RouteCollection $routes The RouteCollection to dump - */ - public function __construct(RouteCollection $routes) - { - $this->routes = $routes; - } - - /** - * {@inheritdoc} - */ - public function getRoutes() - { - return $this->routes; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php deleted file mode 100644 index 5e7c134b9f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/MatcherDumperInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher\Dumper; - -use Symfony\Component\Routing\RouteCollection; - -/** - * MatcherDumperInterface is the interface that all matcher dumper classes must implement. - * - * @author Fabien Potencier - */ -interface MatcherDumperInterface -{ - /** - * Dumps a set of routes to a string representation of executable code - * that can then be used to match a request against these routes. - * - * @param array $options An array of options - * - * @return string Executable code - */ - public function dump(array $options = array()); - - /** - * Gets the routes to dump. - * - * @return RouteCollection A RouteCollection instance - */ - public function getRoutes(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php deleted file mode 100644 index 784f3099da..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php +++ /dev/null @@ -1,402 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher\Dumper; - -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\ExpressionLanguage\ExpressionLanguage; - -/** - * PhpMatcherDumper creates a PHP class able to match URLs for a given set of routes. - * - * @author Fabien Potencier - * @author Tobias Schultze - * @author Arnaud Le Blanc - */ -class PhpMatcherDumper extends MatcherDumper -{ - private $expressionLanguage; - - /** - * Dumps a set of routes to a PHP class. - * - * Available options: - * - * * class: The class name - * * base_class: The base class name - * - * @param array $options An array of options - * - * @return string A PHP class representing the matcher class - */ - public function dump(array $options = array()) - { - $options = array_replace(array( - 'class' => 'ProjectUrlMatcher', - 'base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', - ), $options); - - // trailing slash support is only enabled if we know how to redirect the user - $interfaces = class_implements($options['base_class']); - $supportsRedirections = isset($interfaces['Symfony\\Component\\Routing\\Matcher\\RedirectableUrlMatcherInterface']); - - return <<context = \$context; - } - -{$this->generateMatchMethod($supportsRedirections)} -} - -EOF; - } - - /** - * Generates the code for the match method implementing UrlMatcherInterface. - * - * @param Boolean $supportsRedirections Whether redirections are supported by the base class - * - * @return string Match method as PHP code - */ - private function generateMatchMethod($supportsRedirections) - { - $code = rtrim($this->compileRoutes($this->getRoutes(), $supportsRedirections), "\n"); - - return <<context; - \$request = \$this->request; - -$code - - throw 0 < count(\$allow) ? new MethodNotAllowedException(array_unique(\$allow)) : new ResourceNotFoundException(); - } -EOF; - } - - /** - * Generates PHP code to match a RouteCollection with all its routes. - * - * @param RouteCollection $routes A RouteCollection instance - * @param Boolean $supportsRedirections Whether redirections are supported by the base class - * - * @return string PHP code - */ - private function compileRoutes(RouteCollection $routes, $supportsRedirections) - { - $fetchedHost = false; - - $groups = $this->groupRoutesByHostRegex($routes); - $code = ''; - - foreach ($groups as $collection) { - if (null !== $regex = $collection->getAttribute('host_regex')) { - if (!$fetchedHost) { - $code .= " \$host = \$this->context->getHost();\n\n"; - $fetchedHost = true; - } - - $code .= sprintf(" if (preg_match(%s, \$host, \$hostMatches)) {\n", var_export($regex, true)); - } - - $tree = $this->buildPrefixTree($collection); - $groupCode = $this->compilePrefixRoutes($tree, $supportsRedirections); - - if (null !== $regex) { - // apply extra indention at each line (except empty ones) - $groupCode = preg_replace('/^.{2,}$/m', ' $0', $groupCode); - $code .= $groupCode; - $code .= " }\n\n"; - } else { - $code .= $groupCode; - } - } - - return $code; - } - - /** - * Generates PHP code recursively to match a tree of routes - * - * @param DumperPrefixCollection $collection A DumperPrefixCollection instance - * @param Boolean $supportsRedirections Whether redirections are supported by the base class - * @param string $parentPrefix Prefix of the parent collection - * - * @return string PHP code - */ - private function compilePrefixRoutes(DumperPrefixCollection $collection, $supportsRedirections, $parentPrefix = '') - { - $code = ''; - $prefix = $collection->getPrefix(); - $optimizable = 1 < strlen($prefix) && 1 < count($collection->all()); - $optimizedPrefix = $parentPrefix; - - if ($optimizable) { - $optimizedPrefix = $prefix; - - $code .= sprintf(" if (0 === strpos(\$pathinfo, %s)) {\n", var_export($prefix, true)); - } - - foreach ($collection as $route) { - if ($route instanceof DumperCollection) { - $code .= $this->compilePrefixRoutes($route, $supportsRedirections, $optimizedPrefix); - } else { - $code .= $this->compileRoute($route->getRoute(), $route->getName(), $supportsRedirections, $optimizedPrefix)."\n"; - } - } - - if ($optimizable) { - $code .= " }\n\n"; - // apply extra indention at each line (except empty ones) - $code = preg_replace('/^.{2,}$/m', ' $0', $code); - } - - return $code; - } - - /** - * Compiles a single Route to PHP code used to match it against the path info. - * - * @param Route $route A Route instance - * @param string $name The name of the Route - * @param Boolean $supportsRedirections Whether redirections are supported by the base class - * @param string|null $parentPrefix The prefix of the parent collection used to optimize the code - * - * @return string PHP code - * - * @throws \LogicException - */ - private function compileRoute(Route $route, $name, $supportsRedirections, $parentPrefix = null) - { - $code = ''; - $compiledRoute = $route->compile(); - $conditions = array(); - $hasTrailingSlash = false; - $matches = false; - $hostMatches = false; - $methods = array(); - - if ($req = $route->getRequirement('_method')) { - $methods = explode('|', strtoupper($req)); - // GET and HEAD are equivalent - if (in_array('GET', $methods) && !in_array('HEAD', $methods)) { - $methods[] = 'HEAD'; - } - } - - $supportsTrailingSlash = $supportsRedirections && (!$methods || in_array('HEAD', $methods)); - - if (!count($compiledRoute->getPathVariables()) && false !== preg_match('#^(.)\^(?P.*?)\$\1#', $compiledRoute->getRegex(), $m)) { - if ($supportsTrailingSlash && substr($m['url'], -1) === '/') { - $conditions[] = sprintf("rtrim(\$pathinfo, '/') === %s", var_export(rtrim(str_replace('\\', '', $m['url']), '/'), true)); - $hasTrailingSlash = true; - } else { - $conditions[] = sprintf("\$pathinfo === %s", var_export(str_replace('\\', '', $m['url']), true)); - } - } else { - if ($compiledRoute->getStaticPrefix() && $compiledRoute->getStaticPrefix() !== $parentPrefix) { - $conditions[] = sprintf("0 === strpos(\$pathinfo, %s)", var_export($compiledRoute->getStaticPrefix(), true)); - } - - $regex = $compiledRoute->getRegex(); - if ($supportsTrailingSlash && $pos = strpos($regex, '/$')) { - $regex = substr($regex, 0, $pos).'/?$'.substr($regex, $pos + 2); - $hasTrailingSlash = true; - } - $conditions[] = sprintf("preg_match(%s, \$pathinfo, \$matches)", var_export($regex, true)); - - $matches = true; - } - - if ($compiledRoute->getHostVariables()) { - $hostMatches = true; - } - - if ($route->getCondition()) { - $conditions[] = $this->getExpressionLanguage()->compile($route->getCondition(), array('context', 'request')); - } - - $conditions = implode(' && ', $conditions); - - $code .= <<context->getMethod() != '$methods[0]') { - \$allow[] = '$methods[0]'; - goto $gotoname; - } - - -EOF; - } else { - $methods = implode("', '", $methods); - $code .= <<context->getMethod(), array('$methods'))) { - \$allow = array_merge(\$allow, array('$methods')); - goto $gotoname; - } - - -EOF; - } - } - - if ($hasTrailingSlash) { - $code .= <<redirect(\$pathinfo.'/', '$name'); - } - - -EOF; - } - - if ($schemes = $route->getSchemes()) { - if (!$supportsRedirections) { - throw new \LogicException('The "schemes" requirement is only supported for URL matchers that implement RedirectableUrlMatcherInterface.'); - } - $schemes = str_replace("\n", '', var_export(array_flip($schemes), true)); - $code .= <<context->getScheme()])) { - return \$this->redirect(\$pathinfo, '$name', key(\$requiredSchemes)); - } - - -EOF; - } - - // optimize parameters array - if ($matches || $hostMatches) { - $vars = array(); - if ($hostMatches) { - $vars[] = '$hostMatches'; - } - if ($matches) { - $vars[] = '$matches'; - } - $vars[] = "array('_route' => '$name')"; - - $code .= sprintf( - " return \$this->mergeDefaults(array_replace(%s), %s);\n", - implode(', ', $vars), - str_replace("\n", '', var_export($route->getDefaults(), true)) - ); - - } elseif ($route->getDefaults()) { - $code .= sprintf(" return %s;\n", str_replace("\n", '', var_export(array_replace($route->getDefaults(), array('_route' => $name)), true))); - } else { - $code .= sprintf(" return array('_route' => '%s');\n", $name); - } - $code .= " }\n"; - - if ($methods) { - $code .= " $gotoname:\n"; - } - - return $code; - } - - /** - * Groups consecutive routes having the same host regex. - * - * The result is a collection of collections of routes having the same host regex. - * - * @param RouteCollection $routes A flat RouteCollection - * - * @return DumperCollection A collection with routes grouped by host regex in sub-collections - */ - private function groupRoutesByHostRegex(RouteCollection $routes) - { - $groups = new DumperCollection(); - - $currentGroup = new DumperCollection(); - $currentGroup->setAttribute('host_regex', null); - $groups->add($currentGroup); - - foreach ($routes as $name => $route) { - $hostRegex = $route->compile()->getHostRegex(); - if ($currentGroup->getAttribute('host_regex') !== $hostRegex) { - $currentGroup = new DumperCollection(); - $currentGroup->setAttribute('host_regex', $hostRegex); - $groups->add($currentGroup); - } - $currentGroup->add(new DumperRoute($name, $route)); - } - - return $groups; - } - - /** - * Organizes the routes into a prefix tree. - * - * Routes order is preserved such that traversing the tree will traverse the - * routes in the origin order. - * - * @param DumperCollection $collection A collection of routes - * - * @return DumperPrefixCollection - */ - private function buildPrefixTree(DumperCollection $collection) - { - $tree = new DumperPrefixCollection(); - $current = $tree; - - foreach ($collection as $route) { - $current = $current->addPrefixRoute($route); - } - - $tree->mergeSlashNodes(); - - return $tree; - } - - private function getExpressionLanguage() - { - if (null === $this->expressionLanguage) { - if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { - throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); - } - $this->expressionLanguage = new ExpressionLanguage(); - } - - return $this->expressionLanguage; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php deleted file mode 100644 index 3d13181f46..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcher.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher; - -use Symfony\Component\Routing\Exception\ResourceNotFoundException; -use Symfony\Component\Routing\Route; - -/** - * @author Fabien Potencier - * - * @api - */ -abstract class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface -{ - /** - * {@inheritdoc} - */ - public function match($pathinfo) - { - try { - $parameters = parent::match($pathinfo); - } catch (ResourceNotFoundException $e) { - if ('/' === substr($pathinfo, -1) || !in_array($this->context->getMethod(), array('HEAD', 'GET'))) { - throw $e; - } - - try { - parent::match($pathinfo.'/'); - - return $this->redirect($pathinfo.'/', null); - } catch (ResourceNotFoundException $e2) { - throw $e; - } - } - - return $parameters; - } - - /** - * {@inheritDoc} - */ - protected function handleRouteRequirements($pathinfo, $name, Route $route) - { - // expression condition - if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), array('context' => $this->context, 'request' => $this->request))) { - return array(self::REQUIREMENT_MISMATCH, null); - } - - // check HTTP scheme requirement - $scheme = $this->context->getScheme(); - $schemes = $route->getSchemes(); - if ($schemes && !$route->hasScheme($scheme)) { - return array(self::ROUTE_MATCH, $this->redirect($pathinfo, $name, current($schemes))); - } - - return array(self::REQUIREMENT_MATCH, null); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php deleted file mode 100644 index ea91e07511..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RedirectableUrlMatcherInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher; - -/** - * RedirectableUrlMatcherInterface knows how to redirect the user. - * - * @author Fabien Potencier - * - * @api - */ -interface RedirectableUrlMatcherInterface -{ - /** - * Redirects the user to another URL. - * - * @param string $path The path info to redirect to. - * @param string $route The route name that matched - * @param string|null $scheme The URL scheme (null to keep the current one) - * - * @return array An array of parameters - * - * @api - */ - public function redirect($path, $route, $scheme = null); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RequestMatcherInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RequestMatcherInterface.php deleted file mode 100644 index b5def3d468..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/RequestMatcherInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Routing\Exception\ResourceNotFoundException; -use Symfony\Component\Routing\Exception\MethodNotAllowedException; - -/** - * RequestMatcherInterface is the interface that all request matcher classes must implement. - * - * @author Fabien Potencier - */ -interface RequestMatcherInterface -{ - /** - * Tries to match a request with a set of routes. - * - * If the matcher can not find information, it must throw one of the exceptions documented - * below. - * - * @param Request $request The request to match - * - * @return array An array of parameters - * - * @throws ResourceNotFoundException If no matching resource could be found - * @throws MethodNotAllowedException If a matching resource was found but the request method is not allowed - */ - public function matchRequest(Request $request); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php deleted file mode 100644 index 22af699d4a..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/TraceableUrlMatcher.php +++ /dev/null @@ -1,131 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher; - -use Symfony\Component\Routing\Exception\ExceptionInterface; -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; - -/** - * TraceableUrlMatcher helps debug path info matching by tracing the match. - * - * @author Fabien Potencier - */ -class TraceableUrlMatcher extends UrlMatcher -{ - const ROUTE_DOES_NOT_MATCH = 0; - const ROUTE_ALMOST_MATCHES = 1; - const ROUTE_MATCHES = 2; - - protected $traces; - - public function getTraces($pathinfo) - { - $this->traces = array(); - - try { - $this->match($pathinfo); - } catch (ExceptionInterface $e) { - } - - return $this->traces; - } - - protected function matchCollection($pathinfo, RouteCollection $routes) - { - foreach ($routes as $name => $route) { - $compiledRoute = $route->compile(); - - if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) { - // does it match without any requirements? - $r = new Route($route->getPath(), $route->getDefaults(), array(), $route->getOptions()); - $cr = $r->compile(); - if (!preg_match($cr->getRegex(), $pathinfo)) { - $this->addTrace(sprintf('Path "%s" does not match', $route->getPath()), self::ROUTE_DOES_NOT_MATCH, $name, $route); - - continue; - } - - foreach ($route->getRequirements() as $n => $regex) { - $r = new Route($route->getPath(), $route->getDefaults(), array($n => $regex), $route->getOptions()); - $cr = $r->compile(); - - if (in_array($n, $cr->getVariables()) && !preg_match($cr->getRegex(), $pathinfo)) { - $this->addTrace(sprintf('Requirement for "%s" does not match (%s)', $n, $regex), self::ROUTE_ALMOST_MATCHES, $name, $route); - - continue 2; - } - } - - continue; - } - - // check host requirement - $hostMatches = array(); - if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) { - $this->addTrace(sprintf('Host "%s" does not match the requirement ("%s")', $this->context->getHost(), $route->getHost()), self::ROUTE_ALMOST_MATCHES, $name, $route); - - continue; - } - - // check HTTP method requirement - if ($req = $route->getRequirement('_method')) { - // HEAD and GET are equivalent as per RFC - if ('HEAD' === $method = $this->context->getMethod()) { - $method = 'GET'; - } - - if (!in_array($method, $req = explode('|', strtoupper($req)))) { - $this->allow = array_merge($this->allow, $req); - - $this->addTrace(sprintf('Method "%s" does not match the requirement ("%s")', $this->context->getMethod(), implode(', ', $req)), self::ROUTE_ALMOST_MATCHES, $name, $route); - - continue; - } - } - - // check condition - if ($condition = $route->getCondition()) { - if (!$this->getExpressionLanguage()->evaluate($condition, array('context' => $this->context, 'request' => $this->request))) { - $this->addTrace(sprintf('Condition "%s" does not evaluate to "true"', $condition), self::ROUTE_ALMOST_MATCHES, $name, $route); - - continue; - } - } - - // check HTTP scheme requirement - if ($requiredSchemes = $route->getSchemes()) { - $scheme = $this->context->getScheme(); - - if (!$route->hasScheme($scheme)) { - $this->addTrace(sprintf('Scheme "%s" does not match any of the required schemes ("%s"); the user will be redirected to first required scheme', $scheme, implode(', ', $requiredSchemes)), self::ROUTE_ALMOST_MATCHES, $name, $route); - - return true; - } - } - - $this->addTrace('Route matches!', self::ROUTE_MATCHES, $name, $route); - - return true; - } - } - - private function addTrace($log, $level = self::ROUTE_DOES_NOT_MATCH, $name = null, $route = null) - { - $this->traces[] = array( - 'log' => $log, - 'name' => $name, - 'level' => $level, - 'path' => null !== $route ? $route->getPath() : null, - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php deleted file mode 100644 index 8d081a8629..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcher.php +++ /dev/null @@ -1,244 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher; - -use Symfony\Component\Routing\Exception\MethodNotAllowedException; -use Symfony\Component\Routing\Exception\ResourceNotFoundException; -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\RequestContext; -use Symfony\Component\Routing\Route; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\ExpressionLanguage\ExpressionLanguage; - -/** - * UrlMatcher matches URL based on a set of routes. - * - * @author Fabien Potencier - * - * @api - */ -class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface -{ - const REQUIREMENT_MATCH = 0; - const REQUIREMENT_MISMATCH = 1; - const ROUTE_MATCH = 2; - - /** - * @var RequestContext - */ - protected $context; - - /** - * @var array - */ - protected $allow = array(); - - /** - * @var RouteCollection - */ - protected $routes; - - protected $request; - protected $expressionLanguage; - - /** - * Constructor. - * - * @param RouteCollection $routes A RouteCollection instance - * @param RequestContext $context The context - * - * @api - */ - public function __construct(RouteCollection $routes, RequestContext $context) - { - $this->routes = $routes; - $this->context = $context; - } - - /** - * {@inheritdoc} - */ - public function setContext(RequestContext $context) - { - $this->context = $context; - } - - /** - * {@inheritdoc} - */ - public function getContext() - { - return $this->context; - } - - /** - * {@inheritdoc} - */ - public function match($pathinfo) - { - $this->allow = array(); - - if ($ret = $this->matchCollection(rawurldecode($pathinfo), $this->routes)) { - return $ret; - } - - throw 0 < count($this->allow) - ? new MethodNotAllowedException(array_unique(array_map('strtoupper', $this->allow))) - : new ResourceNotFoundException(); - } - - /** - * {@inheritdoc} - */ - public function matchRequest(Request $request) - { - $this->request = $request; - - $ret = $this->match($request->getPathInfo()); - - $this->request = null; - - return $ret; - } - - /** - * Tries to match a URL with a set of routes. - * - * @param string $pathinfo The path info to be parsed - * @param RouteCollection $routes The set of routes - * - * @return array An array of parameters - * - * @throws ResourceNotFoundException If the resource could not be found - * @throws MethodNotAllowedException If the resource was found but the request method is not allowed - */ - protected function matchCollection($pathinfo, RouteCollection $routes) - { - foreach ($routes as $name => $route) { - $compiledRoute = $route->compile(); - - // check the static prefix of the URL first. Only use the more expensive preg_match when it matches - if ('' !== $compiledRoute->getStaticPrefix() && 0 !== strpos($pathinfo, $compiledRoute->getStaticPrefix())) { - continue; - } - - if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) { - continue; - } - - $hostMatches = array(); - if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) { - continue; - } - - // check HTTP method requirement - if ($req = $route->getRequirement('_method')) { - // HEAD and GET are equivalent as per RFC - if ('HEAD' === $method = $this->context->getMethod()) { - $method = 'GET'; - } - - if (!in_array($method, $req = explode('|', strtoupper($req)))) { - $this->allow = array_merge($this->allow, $req); - - continue; - } - } - - $status = $this->handleRouteRequirements($pathinfo, $name, $route); - - if (self::ROUTE_MATCH === $status[0]) { - return $status[1]; - } - - if (self::REQUIREMENT_MISMATCH === $status[0]) { - continue; - } - - return $this->getAttributes($route, $name, array_replace($matches, $hostMatches)); - } - } - - /** - * Returns an array of values to use as request attributes. - * - * As this method requires the Route object, it is not available - * in matchers that do not have access to the matched Route instance - * (like the PHP and Apache matcher dumpers). - * - * @param Route $route The route we are matching against - * @param string $name The name of the route - * @param array $attributes An array of attributes from the matcher - * - * @return array An array of parameters - */ - protected function getAttributes(Route $route, $name, array $attributes) - { - $attributes['_route'] = $name; - - return $this->mergeDefaults($attributes, $route->getDefaults()); - } - - /** - * Handles specific route requirements. - * - * @param string $pathinfo The path - * @param string $name The route name - * @param Route $route The route - * - * @return array The first element represents the status, the second contains additional information - */ - protected function handleRouteRequirements($pathinfo, $name, Route $route) - { - // expression condition - if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), array('context' => $this->context, 'request' => $this->request))) { - return array(self::REQUIREMENT_MISMATCH, null); - } - - // check HTTP scheme requirement - $scheme = $this->context->getScheme(); - $status = $route->getSchemes() && !$route->hasScheme($scheme) ? self::REQUIREMENT_MISMATCH : self::REQUIREMENT_MATCH; - - return array($status, null); - } - - /** - * Get merged default parameters. - * - * @param array $params The parameters - * @param array $defaults The defaults - * - * @return array Merged default parameters - */ - protected function mergeDefaults($params, $defaults) - { - foreach ($params as $key => $value) { - if (!is_int($key)) { - $defaults[$key] = $value; - } - } - - return $defaults; - } - - protected function getExpressionLanguage() - { - if (null === $this->expressionLanguage) { - if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) { - throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.'); - } - $this->expressionLanguage = new ExpressionLanguage(); - } - - return $this->expressionLanguage; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php deleted file mode 100644 index dd718b1569..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Matcher/UrlMatcherInterface.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Matcher; - -use Symfony\Component\Routing\RequestContextAwareInterface; -use Symfony\Component\Routing\Exception\ResourceNotFoundException; -use Symfony\Component\Routing\Exception\MethodNotAllowedException; - -/** - * UrlMatcherInterface is the interface that all URL matcher classes must implement. - * - * @author Fabien Potencier - * - * @api - */ -interface UrlMatcherInterface extends RequestContextAwareInterface -{ - /** - * Tries to match a URL path with a set of routes. - * - * If the matcher can not find information, it must throw one of the exceptions documented - * below. - * - * @param string $pathinfo The path info to be parsed (raw format, i.e. not urldecoded) - * - * @return array An array of parameters - * - * @throws ResourceNotFoundException If the resource could not be found - * @throws MethodNotAllowedException If the resource was found but the request method is not allowed - * - * @api - */ - public function match($pathinfo); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/README.md b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/README.md deleted file mode 100644 index 83febc79bb..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/README.md +++ /dev/null @@ -1,34 +0,0 @@ -Routing Component -================= - -Routing associates a request with the code that will convert it to a response. - -The example below demonstrates how you can set up a fully working routing -system: - - use Symfony\Component\HttpFoundation\Request; - use Symfony\Component\Routing\Matcher\UrlMatcher; - use Symfony\Component\Routing\RequestContext; - use Symfony\Component\Routing\RouteCollection; - use Symfony\Component\Routing\Route; - - $routes = new RouteCollection(); - $routes->add('hello', new Route('/hello', array('controller' => 'foo'))); - - $context = new RequestContext(); - - // this is optional and can be done without a Request instance - $context->fromRequest(Request::createFromGlobals()); - - $matcher = new UrlMatcher($routes, $context); - - $parameters = $matcher->match('/hello'); - -Resources ---------- - -You can run the unit tests with the following command: - - $ cd path/to/Symfony/Component/Routing/ - $ composer.phar install - $ phpunit diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php deleted file mode 100644 index cb53696896..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContext.php +++ /dev/null @@ -1,315 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -use Symfony\Component\HttpFoundation\Request; - -/** - * Holds information about the current request. - * - * @author Fabien Potencier - * - * @api - */ -class RequestContext -{ - private $baseUrl; - private $pathInfo; - private $method; - private $host; - private $scheme; - private $httpPort; - private $httpsPort; - private $queryString; - - /** - * @var array - */ - private $parameters = array(); - - /** - * Constructor. - * - * @param string $baseUrl The base URL - * @param string $method The HTTP method - * @param string $host The HTTP host name - * @param string $scheme The HTTP scheme - * @param integer $httpPort The HTTP port - * @param integer $httpsPort The HTTPS port - * @param string $path The path - * @param string $queryString The query string - * - * @api - */ - public function __construct($baseUrl = '', $method = 'GET', $host = 'localhost', $scheme = 'http', $httpPort = 80, $httpsPort = 443, $path = '/', $queryString = '') - { - $this->baseUrl = $baseUrl; - $this->method = strtoupper($method); - $this->host = $host; - $this->scheme = strtolower($scheme); - $this->httpPort = $httpPort; - $this->httpsPort = $httpsPort; - $this->pathInfo = $path; - $this->queryString = $queryString; - } - - public function fromRequest(Request $request) - { - $this->setBaseUrl($request->getBaseUrl()); - $this->setPathInfo($request->getPathInfo()); - $this->setMethod($request->getMethod()); - $this->setHost($request->getHost()); - $this->setScheme($request->getScheme()); - $this->setHttpPort($request->isSecure() ? $this->httpPort : $request->getPort()); - $this->setHttpsPort($request->isSecure() ? $request->getPort() : $this->httpsPort); - $this->setQueryString($request->server->get('QUERY_STRING')); - } - - /** - * Gets the base URL. - * - * @return string The base URL - */ - public function getBaseUrl() - { - return $this->baseUrl; - } - - /** - * Sets the base URL. - * - * @param string $baseUrl The base URL - * - * @api - */ - public function setBaseUrl($baseUrl) - { - $this->baseUrl = $baseUrl; - } - - /** - * Gets the path info. - * - * @return string The path info - */ - public function getPathInfo() - { - return $this->pathInfo; - } - - /** - * Sets the path info. - * - * @param string $pathInfo The path info - */ - public function setPathInfo($pathInfo) - { - $this->pathInfo = $pathInfo; - } - - /** - * Gets the HTTP method. - * - * The method is always an uppercased string. - * - * @return string The HTTP method - */ - public function getMethod() - { - return $this->method; - } - - /** - * Sets the HTTP method. - * - * @param string $method The HTTP method - * - * @api - */ - public function setMethod($method) - { - $this->method = strtoupper($method); - } - - /** - * Gets the HTTP host. - * - * @return string The HTTP host - */ - public function getHost() - { - return $this->host; - } - - /** - * Sets the HTTP host. - * - * @param string $host The HTTP host - * - * @api - */ - public function setHost($host) - { - $this->host = $host; - } - - /** - * Gets the HTTP scheme. - * - * @return string The HTTP scheme - */ - public function getScheme() - { - return $this->scheme; - } - - /** - * Sets the HTTP scheme. - * - * @param string $scheme The HTTP scheme - * - * @api - */ - public function setScheme($scheme) - { - $this->scheme = strtolower($scheme); - } - - /** - * Gets the HTTP port. - * - * @return string The HTTP port - */ - public function getHttpPort() - { - return $this->httpPort; - } - - /** - * Sets the HTTP port. - * - * @param string $httpPort The HTTP port - * - * @api - */ - public function setHttpPort($httpPort) - { - $this->httpPort = $httpPort; - } - - /** - * Gets the HTTPS port. - * - * @return string The HTTPS port - */ - public function getHttpsPort() - { - return $this->httpsPort; - } - - /** - * Sets the HTTPS port. - * - * @param string $httpsPort The HTTPS port - * - * @api - */ - public function setHttpsPort($httpsPort) - { - $this->httpsPort = $httpsPort; - } - - /** - * Gets the query string. - * - * @return string The query string - */ - public function getQueryString() - { - return $this->queryString; - } - - /** - * Sets the query string. - * - * @param string $queryString The query string - * - * @api - */ - public function setQueryString($queryString) - { - $this->queryString = $queryString; - } - - /** - * Returns the parameters. - * - * @return array The parameters - */ - public function getParameters() - { - return $this->parameters; - } - - /** - * Sets the parameters. - * - * This method implements a fluent interface. - * - * @param array $parameters The parameters - * - * @return Route The current Route instance - */ - public function setParameters(array $parameters) - { - $this->parameters = $parameters; - - return $this; - } - - /** - * Gets a parameter value. - * - * @param string $name A parameter name - * - * @return mixed The parameter value - */ - public function getParameter($name) - { - return isset($this->parameters[$name]) ? $this->parameters[$name] : null; - } - - /** - * Checks if a parameter value is set for the given parameter. - * - * @param string $name A parameter name - * - * @return Boolean true if the parameter value is set, false otherwise - */ - public function hasParameter($name) - { - return array_key_exists($name, $this->parameters); - } - - /** - * Sets a parameter value. - * - * @param string $name A parameter name - * @param mixed $parameter The parameter value - * - * @api - */ - public function setParameter($name, $parameter) - { - $this->parameters[$name] = $parameter; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php deleted file mode 100644 index daf52549dd..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RequestContextAwareInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -/** - * @api - */ -interface RequestContextAwareInterface -{ - /** - * Sets the request context. - * - * @param RequestContext $context The context - * - * @api - */ - public function setContext(RequestContext $context); - - /** - * Gets the request context. - * - * @return RequestContext The context - * - * @api - */ - public function getContext(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Route.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Route.php deleted file mode 100644 index 0800554146..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Route.php +++ /dev/null @@ -1,646 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -/** - * A Route describes a route and its parameters. - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -class Route implements \Serializable -{ - /** - * @var string - */ - private $path = '/'; - - /** - * @var string - */ - private $host = ''; - - /** - * @var array - */ - private $schemes = array(); - - /** - * @var array - */ - private $methods = array(); - - /** - * @var array - */ - private $defaults = array(); - - /** - * @var array - */ - private $requirements = array(); - - /** - * @var array - */ - private $options = array(); - - /** - * @var null|CompiledRoute - */ - private $compiled; - - private $condition; - - /** - * Constructor. - * - * Available options: - * - * * compiler_class: A class name able to compile this route instance (RouteCompiler by default) - * - * @param string $path The path pattern to match - * @param array $defaults An array of default parameter values - * @param array $requirements An array of requirements for parameters (regexes) - * @param array $options An array of options - * @param string $host The host pattern to match - * @param string|array $schemes A required URI scheme or an array of restricted schemes - * @param string|array $methods A required HTTP method or an array of restricted methods - * @param string $condition A condition that should evaluate to true for the route to match - * - * @api - */ - public function __construct($path, array $defaults = array(), array $requirements = array(), array $options = array(), $host = '', $schemes = array(), $methods = array(), $condition = null) - { - $this->setPath($path); - $this->setDefaults($defaults); - $this->setRequirements($requirements); - $this->setOptions($options); - $this->setHost($host); - // The conditions make sure that an initial empty $schemes/$methods does not override the corresponding requirement. - // They can be removed when the BC layer is removed. - if ($schemes) { - $this->setSchemes($schemes); - } - if ($methods) { - $this->setMethods($methods); - } - $this->setCondition($condition); - } - - public function serialize() - { - return serialize(array( - 'path' => $this->path, - 'host' => $this->host, - 'defaults' => $this->defaults, - 'requirements' => $this->requirements, - 'options' => $this->options, - 'schemes' => $this->schemes, - 'methods' => $this->methods, - 'condition' => $this->condition, - )); - } - - public function unserialize($data) - { - $data = unserialize($data); - $this->path = $data['path']; - $this->host = $data['host']; - $this->defaults = $data['defaults']; - $this->requirements = $data['requirements']; - $this->options = $data['options']; - $this->schemes = $data['schemes']; - $this->methods = $data['methods']; - $this->condition = $data['condition']; - } - - /** - * Returns the pattern for the path. - * - * @return string The pattern - * - * @deprecated Deprecated in 2.2, to be removed in 3.0. Use getPath instead. - */ - public function getPattern() - { - return $this->path; - } - - /** - * Sets the pattern for the path. - * - * This method implements a fluent interface. - * - * @param string $pattern The path pattern - * - * @return Route The current Route instance - * - * @deprecated Deprecated in 2.2, to be removed in 3.0. Use setPath instead. - */ - public function setPattern($pattern) - { - return $this->setPath($pattern); - } - - /** - * Returns the pattern for the path. - * - * @return string The path pattern - */ - public function getPath() - { - return $this->path; - } - - /** - * Sets the pattern for the path. - * - * This method implements a fluent interface. - * - * @param string $pattern The path pattern - * - * @return Route The current Route instance - */ - public function setPath($pattern) - { - // A pattern must start with a slash and must not have multiple slashes at the beginning because the - // generated path for this route would be confused with a network path, e.g. '//domain.com/path'. - $this->path = '/'.ltrim(trim($pattern), '/'); - $this->compiled = null; - - return $this; - } - - /** - * Returns the pattern for the host. - * - * @return string The host pattern - */ - public function getHost() - { - return $this->host; - } - - /** - * Sets the pattern for the host. - * - * This method implements a fluent interface. - * - * @param string $pattern The host pattern - * - * @return Route The current Route instance - */ - public function setHost($pattern) - { - $this->host = (string) $pattern; - $this->compiled = null; - - return $this; - } - - /** - * Returns the lowercased schemes this route is restricted to. - * So an empty array means that any scheme is allowed. - * - * @return array The schemes - */ - public function getSchemes() - { - return $this->schemes; - } - - /** - * Sets the schemes (e.g. 'https') this route is restricted to. - * So an empty array means that any scheme is allowed. - * - * This method implements a fluent interface. - * - * @param string|array $schemes The scheme or an array of schemes - * - * @return Route The current Route instance - */ - public function setSchemes($schemes) - { - $this->schemes = array_map('strtolower', (array) $schemes); - - // this is to keep BC and will be removed in a future version - if ($this->schemes) { - $this->requirements['_scheme'] = implode('|', $this->schemes); - } else { - unset($this->requirements['_scheme']); - } - - $this->compiled = null; - - return $this; - } - - /** - * Checks if a scheme requirement has been set. - * - * @param string $scheme - * - * @return Boolean true if the scheme requirement exists, otherwise false - */ - public function hasScheme($scheme) - { - $scheme = strtolower($scheme); - foreach ($this->schemes as $requiredScheme) { - if ($scheme === $requiredScheme) { - return true; - } - } - - return false; - } - - /** - * Returns the uppercased HTTP methods this route is restricted to. - * So an empty array means that any method is allowed. - * - * @return array The schemes - */ - public function getMethods() - { - return $this->methods; - } - - /** - * Sets the HTTP methods (e.g. 'POST') this route is restricted to. - * So an empty array means that any method is allowed. - * - * This method implements a fluent interface. - * - * @param string|array $methods The method or an array of methods - * - * @return Route The current Route instance - */ - public function setMethods($methods) - { - $this->methods = array_map('strtoupper', (array) $methods); - - // this is to keep BC and will be removed in a future version - if ($this->methods) { - $this->requirements['_method'] = implode('|', $this->methods); - } else { - unset($this->requirements['_method']); - } - - $this->compiled = null; - - return $this; - } - - /** - * Returns the options. - * - * @return array The options - */ - public function getOptions() - { - return $this->options; - } - - /** - * Sets the options. - * - * This method implements a fluent interface. - * - * @param array $options The options - * - * @return Route The current Route instance - */ - public function setOptions(array $options) - { - $this->options = array( - 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler', - ); - - return $this->addOptions($options); - } - - /** - * Adds options. - * - * This method implements a fluent interface. - * - * @param array $options The options - * - * @return Route The current Route instance - */ - public function addOptions(array $options) - { - foreach ($options as $name => $option) { - $this->options[$name] = $option; - } - $this->compiled = null; - - return $this; - } - - /** - * Sets an option value. - * - * This method implements a fluent interface. - * - * @param string $name An option name - * @param mixed $value The option value - * - * @return Route The current Route instance - * - * @api - */ - public function setOption($name, $value) - { - $this->options[$name] = $value; - $this->compiled = null; - - return $this; - } - - /** - * Get an option value. - * - * @param string $name An option name - * - * @return mixed The option value or null when not given - */ - public function getOption($name) - { - return isset($this->options[$name]) ? $this->options[$name] : null; - } - - /** - * Checks if an option has been set - * - * @param string $name An option name - * - * @return Boolean true if the option is set, false otherwise - */ - public function hasOption($name) - { - return array_key_exists($name, $this->options); - } - - /** - * Returns the defaults. - * - * @return array The defaults - */ - public function getDefaults() - { - return $this->defaults; - } - - /** - * Sets the defaults. - * - * This method implements a fluent interface. - * - * @param array $defaults The defaults - * - * @return Route The current Route instance - */ - public function setDefaults(array $defaults) - { - $this->defaults = array(); - - return $this->addDefaults($defaults); - } - - /** - * Adds defaults. - * - * This method implements a fluent interface. - * - * @param array $defaults The defaults - * - * @return Route The current Route instance - */ - public function addDefaults(array $defaults) - { - foreach ($defaults as $name => $default) { - $this->defaults[$name] = $default; - } - $this->compiled = null; - - return $this; - } - - /** - * Gets a default value. - * - * @param string $name A variable name - * - * @return mixed The default value or null when not given - */ - public function getDefault($name) - { - return isset($this->defaults[$name]) ? $this->defaults[$name] : null; - } - - /** - * Checks if a default value is set for the given variable. - * - * @param string $name A variable name - * - * @return Boolean true if the default value is set, false otherwise - */ - public function hasDefault($name) - { - return array_key_exists($name, $this->defaults); - } - - /** - * Sets a default value. - * - * @param string $name A variable name - * @param mixed $default The default value - * - * @return Route The current Route instance - * - * @api - */ - public function setDefault($name, $default) - { - $this->defaults[$name] = $default; - $this->compiled = null; - - return $this; - } - - /** - * Returns the requirements. - * - * @return array The requirements - */ - public function getRequirements() - { - return $this->requirements; - } - - /** - * Sets the requirements. - * - * This method implements a fluent interface. - * - * @param array $requirements The requirements - * - * @return Route The current Route instance - */ - public function setRequirements(array $requirements) - { - $this->requirements = array(); - - return $this->addRequirements($requirements); - } - - /** - * Adds requirements. - * - * This method implements a fluent interface. - * - * @param array $requirements The requirements - * - * @return Route The current Route instance - */ - public function addRequirements(array $requirements) - { - foreach ($requirements as $key => $regex) { - $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); - } - $this->compiled = null; - - return $this; - } - - /** - * Returns the requirement for the given key. - * - * @param string $key The key - * - * @return string|null The regex or null when not given - */ - public function getRequirement($key) - { - return isset($this->requirements[$key]) ? $this->requirements[$key] : null; - } - - /** - * Checks if a requirement is set for the given key. - * - * @param string $key A variable name - * - * @return Boolean true if a requirement is specified, false otherwise - */ - public function hasRequirement($key) - { - return array_key_exists($key, $this->requirements); - } - - /** - * Sets a requirement for the given key. - * - * @param string $key The key - * @param string $regex The regex - * - * @return Route The current Route instance - * - * @api - */ - public function setRequirement($key, $regex) - { - $this->requirements[$key] = $this->sanitizeRequirement($key, $regex); - $this->compiled = null; - - return $this; - } - - /** - * Returns the condition. - * - * @return string The condition - */ - public function getCondition() - { - return $this->condition; - } - - /** - * Sets the condition. - * - * This method implements a fluent interface. - * - * @param string $condition The condition - * - * @return Route The current Route instance - */ - public function setCondition($condition) - { - $this->condition = (string) $condition; - $this->compiled = null; - - return $this; - } - - /** - * Compiles the route. - * - * @return CompiledRoute A CompiledRoute instance - * - * @throws \LogicException If the Route cannot be compiled because the - * path or host pattern is invalid - * - * @see RouteCompiler which is responsible for the compilation process - */ - public function compile() - { - if (null !== $this->compiled) { - return $this->compiled; - } - - $class = $this->getOption('compiler_class'); - - return $this->compiled = $class::compile($this); - } - - private function sanitizeRequirement($key, $regex) - { - if (!is_string($regex)) { - throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" must be a string.', $key)); - } - - if ('' !== $regex && '^' === $regex[0]) { - $regex = (string) substr($regex, 1); // returns false for a single character - } - - if ('$' === substr($regex, -1)) { - $regex = substr($regex, 0, -1); - } - - if ('' === $regex) { - throw new \InvalidArgumentException(sprintf('Routing requirement for "%s" cannot be empty.', $key)); - } - - // this is to keep BC and will be removed in a future version - if ('_scheme' === $key) { - $this->setSchemes(explode('|', $regex)); - } elseif ('_method' === $key) { - $this->setMethods(explode('|', $regex)); - } - - return $regex; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCollection.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCollection.php deleted file mode 100644 index f028324242..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCollection.php +++ /dev/null @@ -1,285 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -use Symfony\Component\Config\Resource\ResourceInterface; - -/** - * A RouteCollection represents a set of Route instances. - * - * When adding a route at the end of the collection, an existing route - * with the same name is removed first. So there can only be one route - * with a given name. - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -class RouteCollection implements \IteratorAggregate, \Countable -{ - /** - * @var Route[] - */ - private $routes = array(); - - /** - * @var array - */ - private $resources = array(); - - public function __clone() - { - foreach ($this->routes as $name => $route) { - $this->routes[$name] = clone $route; - } - } - - /** - * Gets the current RouteCollection as an Iterator that includes all routes. - * - * It implements \IteratorAggregate. - * - * @see all() - * - * @return \ArrayIterator An \ArrayIterator object for iterating over routes - */ - public function getIterator() - { - return new \ArrayIterator($this->routes); - } - - /** - * Gets the number of Routes in this collection. - * - * @return int The number of routes - */ - public function count() - { - return count($this->routes); - } - - /** - * Adds a route. - * - * @param string $name The route name - * @param Route $route A Route instance - * - * @api - */ - public function add($name, Route $route) - { - unset($this->routes[$name]); - - $this->routes[$name] = $route; - } - - /** - * Returns all routes in this collection. - * - * @return Route[] An array of routes - */ - public function all() - { - return $this->routes; - } - - /** - * Gets a route by name. - * - * @param string $name The route name - * - * @return Route|null A Route instance or null when not found - */ - public function get($name) - { - return isset($this->routes[$name]) ? $this->routes[$name] : null; - } - - /** - * Removes a route or an array of routes by name from the collection - * - * @param string|array $name The route name or an array of route names - */ - public function remove($name) - { - foreach ((array) $name as $n) { - unset($this->routes[$n]); - } - } - - /** - * Adds a route collection at the end of the current set by appending all - * routes of the added collection. - * - * @param RouteCollection $collection A RouteCollection instance - * - * @api - */ - public function addCollection(RouteCollection $collection) - { - // we need to remove all routes with the same names first because just replacing them - // would not place the new route at the end of the merged array - foreach ($collection->all() as $name => $route) { - unset($this->routes[$name]); - $this->routes[$name] = $route; - } - - $this->resources = array_merge($this->resources, $collection->getResources()); - } - - /** - * Adds a prefix to the path of all child routes. - * - * @param string $prefix An optional prefix to add before each pattern of the route collection - * @param array $defaults An array of default values - * @param array $requirements An array of requirements - * - * @api - */ - public function addPrefix($prefix, array $defaults = array(), array $requirements = array()) - { - $prefix = trim(trim($prefix), '/'); - - if ('' === $prefix) { - return; - } - - foreach ($this->routes as $route) { - $route->setPath('/'.$prefix.$route->getPath()); - $route->addDefaults($defaults); - $route->addRequirements($requirements); - } - } - - /** - * Sets the host pattern on all routes. - * - * @param string $pattern The pattern - * @param array $defaults An array of default values - * @param array $requirements An array of requirements - */ - public function setHost($pattern, array $defaults = array(), array $requirements = array()) - { - foreach ($this->routes as $route) { - $route->setHost($pattern); - $route->addDefaults($defaults); - $route->addRequirements($requirements); - } - } - - /** - * Sets a condition on all routes. - * - * Existing conditions will be overridden. - * - * @param string $condition The condition - */ - public function setCondition($condition) - { - foreach ($this->routes as $route) { - $route->setCondition($condition); - } - } - - /** - * Adds defaults to all routes. - * - * An existing default value under the same name in a route will be overridden. - * - * @param array $defaults An array of default values - */ - public function addDefaults(array $defaults) - { - if ($defaults) { - foreach ($this->routes as $route) { - $route->addDefaults($defaults); - } - } - } - - /** - * Adds requirements to all routes. - * - * An existing requirement under the same name in a route will be overridden. - * - * @param array $requirements An array of requirements - */ - public function addRequirements(array $requirements) - { - if ($requirements) { - foreach ($this->routes as $route) { - $route->addRequirements($requirements); - } - } - } - - /** - * Adds options to all routes. - * - * An existing option value under the same name in a route will be overridden. - * - * @param array $options An array of options - */ - public function addOptions(array $options) - { - if ($options) { - foreach ($this->routes as $route) { - $route->addOptions($options); - } - } - } - - /** - * Sets the schemes (e.g. 'https') all child routes are restricted to. - * - * @param string|array $schemes The scheme or an array of schemes - */ - public function setSchemes($schemes) - { - foreach ($this->routes as $route) { - $route->setSchemes($schemes); - } - } - - /** - * Sets the HTTP methods (e.g. 'POST') all child routes are restricted to. - * - * @param string|array $methods The method or an array of methods - */ - public function setMethods($methods) - { - foreach ($this->routes as $route) { - $route->setMethods($methods); - } - } - - /** - * Returns an array of resources loaded to build this collection. - * - * @return ResourceInterface[] An array of resources - */ - public function getResources() - { - return array_unique($this->resources); - } - - /** - * Adds a resource for this collection. - * - * @param ResourceInterface $resource A resource instance - */ - public function addResource(ResourceInterface $resource) - { - $this->resources[] = $resource; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php deleted file mode 100644 index 7ced4b3af8..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompiler.php +++ /dev/null @@ -1,233 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -/** - * RouteCompiler compiles Route instances to CompiledRoute instances. - * - * @author Fabien Potencier - * @author Tobias Schultze - */ -class RouteCompiler implements RouteCompilerInterface -{ - const REGEX_DELIMITER = '#'; - - /** - * This string defines the characters that are automatically considered separators in front of - * optional placeholders (with default and no static text following). Such a single separator - * can be left out together with the optional placeholder from matching and generating URLs. - */ - const SEPARATORS = '/,;.:-_~+*=@|'; - - /** - * {@inheritDoc} - * - * @throws \LogicException If a variable is referenced more than once - * @throws \DomainException If a variable name is numeric because PHP raises an error for such - * subpatterns in PCRE and thus would break matching, e.g. "(?P<123>.+)". - */ - public static function compile(Route $route) - { - $staticPrefix = null; - $hostVariables = array(); - $pathVariables = array(); - $variables = array(); - $tokens = array(); - $regex = null; - $hostRegex = null; - $hostTokens = array(); - - if ('' !== $host = $route->getHost()) { - $result = self::compilePattern($route, $host, true); - - $hostVariables = $result['variables']; - $variables = array_merge($variables, $hostVariables); - - $hostTokens = $result['tokens']; - $hostRegex = $result['regex']; - } - - $path = $route->getPath(); - - $result = self::compilePattern($route, $path, false); - - $staticPrefix = $result['staticPrefix']; - - $pathVariables = $result['variables']; - $variables = array_merge($variables, $pathVariables); - - $tokens = $result['tokens']; - $regex = $result['regex']; - - return new CompiledRoute( - $staticPrefix, - $regex, - $tokens, - $pathVariables, - $hostRegex, - $hostTokens, - $hostVariables, - array_unique($variables) - ); - } - - private static function compilePattern(Route $route, $pattern, $isHost) - { - $tokens = array(); - $variables = array(); - $matches = array(); - $pos = 0; - $defaultSeparator = $isHost ? '.' : '/'; - - // Match all variables enclosed in "{}" and iterate over them. But we only want to match the innermost variable - // in case of nested "{}", e.g. {foo{bar}}. This in ensured because \w does not match "{" or "}" itself. - preg_match_all('#\{\w+\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); - foreach ($matches as $match) { - $varName = substr($match[0][0], 1, -1); - // get all static text preceding the current variable - $precedingText = substr($pattern, $pos, $match[0][1] - $pos); - $pos = $match[0][1] + strlen($match[0][0]); - $precedingChar = strlen($precedingText) > 0 ? substr($precedingText, -1) : ''; - $isSeparator = '' !== $precedingChar && false !== strpos(static::SEPARATORS, $precedingChar); - - if (is_numeric($varName)) { - throw new \DomainException(sprintf('Variable name "%s" cannot be numeric in route pattern "%s". Please use a different name.', $varName, $pattern)); - } - if (in_array($varName, $variables)) { - throw new \LogicException(sprintf('Route pattern "%s" cannot reference variable name "%s" more than once.', $pattern, $varName)); - } - - if ($isSeparator && strlen($precedingText) > 1) { - $tokens[] = array('text', substr($precedingText, 0, -1)); - } elseif (!$isSeparator && strlen($precedingText) > 0) { - $tokens[] = array('text', $precedingText); - } - - $regexp = $route->getRequirement($varName); - if (null === $regexp) { - $followingPattern = (string) substr($pattern, $pos); - // Find the next static character after the variable that functions as a separator. By default, this separator and '/' - // are disallowed for the variable. This default requirement makes sure that optional variables can be matched at all - // and that the generating-matching-combination of URLs unambiguous, i.e. the params used for generating the URL are - // the same that will be matched. Example: new Route('/{page}.{_format}', array('_format' => 'html')) - // If {page} would also match the separating dot, {_format} would never match as {page} will eagerly consume everything. - // Also even if {_format} was not optional the requirement prevents that {page} matches something that was originally - // part of {_format} when generating the URL, e.g. _format = 'mobile.html'. - $nextSeparator = self::findNextSeparator($followingPattern); - $regexp = sprintf( - '[^%s%s]+', - preg_quote($defaultSeparator, self::REGEX_DELIMITER), - $defaultSeparator !== $nextSeparator && '' !== $nextSeparator ? preg_quote($nextSeparator, self::REGEX_DELIMITER) : '' - ); - if (('' !== $nextSeparator && !preg_match('#^\{\w+\}#', $followingPattern)) || '' === $followingPattern) { - // When we have a separator, which is disallowed for the variable, we can optimize the regex with a possessive - // quantifier. This prevents useless backtracking of PCRE and improves performance by 20% for matching those patterns. - // Given the above example, there is no point in backtracking into {page} (that forbids the dot) when a dot must follow - // after it. This optimization cannot be applied when the next char is no real separator or when the next variable is - // directly adjacent, e.g. '/{x}{y}'. - $regexp .= '+'; - } - } - - $tokens[] = array('variable', $isSeparator ? $precedingChar : '', $regexp, $varName); - $variables[] = $varName; - } - - if ($pos < strlen($pattern)) { - $tokens[] = array('text', substr($pattern, $pos)); - } - - // find the first optional token - $firstOptional = PHP_INT_MAX; - if (!$isHost) { - for ($i = count($tokens) - 1; $i >= 0; $i--) { - $token = $tokens[$i]; - if ('variable' === $token[0] && $route->hasDefault($token[3])) { - $firstOptional = $i; - } else { - break; - } - } - } - - // compute the matching regexp - $regexp = ''; - for ($i = 0, $nbToken = count($tokens); $i < $nbToken; $i++) { - $regexp .= self::computeRegexp($tokens, $i, $firstOptional); - } - - return array( - 'staticPrefix' => 'text' === $tokens[0][0] ? $tokens[0][1] : '', - 'regex' => self::REGEX_DELIMITER.'^'.$regexp.'$'.self::REGEX_DELIMITER.'s', - 'tokens' => array_reverse($tokens), - 'variables' => $variables, - ); - } - - /** - * Returns the next static character in the Route pattern that will serve as a separator. - * - * @param string $pattern The route pattern - * - * @return string The next static character that functions as separator (or empty string when none available) - */ - private static function findNextSeparator($pattern) - { - if ('' == $pattern) { - // return empty string if pattern is empty or false (false which can be returned by substr) - return ''; - } - // first remove all placeholders from the pattern so we can find the next real static character - $pattern = preg_replace('#\{\w+\}#', '', $pattern); - - return isset($pattern[0]) && false !== strpos(static::SEPARATORS, $pattern[0]) ? $pattern[0] : ''; - } - - /** - * Computes the regexp used to match a specific token. It can be static text or a subpattern. - * - * @param array $tokens The route tokens - * @param integer $index The index of the current token - * @param integer $firstOptional The index of the first optional token - * - * @return string The regexp pattern for a single token - */ - private static function computeRegexp(array $tokens, $index, $firstOptional) - { - $token = $tokens[$index]; - if ('text' === $token[0]) { - // Text tokens - return preg_quote($token[1], self::REGEX_DELIMITER); - } else { - // Variable tokens - if (0 === $index && 0 === $firstOptional) { - // When the only token is an optional variable token, the separator is required - return sprintf('%s(?P<%s>%s)?', preg_quote($token[1], self::REGEX_DELIMITER), $token[3], $token[2]); - } else { - $regexp = sprintf('%s(?P<%s>%s)', preg_quote($token[1], self::REGEX_DELIMITER), $token[3], $token[2]); - if ($index >= $firstOptional) { - // Enclose each optional token in a subpattern to make it optional. - // "?:" means it is non-capturing, i.e. the portion of the subject string that - // matched the optional subpattern is not passed back. - $regexp = "(?:$regexp"; - $nbTokens = count($tokens); - if ($nbTokens - 1 == $index) { - // Close the optional subpatterns - $regexp .= str_repeat(")?", $nbTokens - $firstOptional - (0 === $firstOptional ? 1 : 0)); - } - } - - return $regexp; - } - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php deleted file mode 100644 index e6f8ee6dea..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouteCompilerInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -/** - * RouteCompilerInterface is the interface that all RouteCompiler classes must implement. - * - * @author Fabien Potencier - */ -interface RouteCompilerInterface -{ - /** - * Compiles the current route instance. - * - * @param Route $route A Route instance - * - * @return CompiledRoute A CompiledRoute instance - * - * @throws \LogicException If the Route cannot be compiled because the - * path or host pattern is invalid - */ - public static function compile(Route $route); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Router.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Router.php deleted file mode 100644 index 62abec3872..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Router.php +++ /dev/null @@ -1,323 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -use Symfony\Component\Config\Loader\LoaderInterface; -use Symfony\Component\Config\ConfigCache; -use Psr\Log\LoggerInterface; -use Symfony\Component\Routing\Generator\ConfigurableRequirementsInterface; -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -use Symfony\Component\Routing\Generator\Dumper\GeneratorDumperInterface; -use Symfony\Component\Routing\Matcher\RequestMatcherInterface; -use Symfony\Component\Routing\Matcher\UrlMatcherInterface; -use Symfony\Component\Routing\Matcher\Dumper\MatcherDumperInterface; -use Symfony\Component\HttpFoundation\Request; - -/** - * The Router class is an example of the integration of all pieces of the - * routing system for easier use. - * - * @author Fabien Potencier - */ -class Router implements RouterInterface, RequestMatcherInterface -{ - /** - * @var UrlMatcherInterface|null - */ - protected $matcher; - - /** - * @var UrlGeneratorInterface|null - */ - protected $generator; - - /** - * @var RequestContext - */ - protected $context; - - /** - * @var LoaderInterface - */ - protected $loader; - - /** - * @var RouteCollection|null - */ - protected $collection; - - /** - * @var mixed - */ - protected $resource; - - /** - * @var array - */ - protected $options = array(); - - /** - * @var LoggerInterface|null - */ - protected $logger; - - /** - * Constructor. - * - * @param LoaderInterface $loader A LoaderInterface instance - * @param mixed $resource The main resource to load - * @param array $options An array of options - * @param RequestContext $context The context - * @param LoggerInterface $logger A logger instance - */ - public function __construct(LoaderInterface $loader, $resource, array $options = array(), RequestContext $context = null, LoggerInterface $logger = null) - { - $this->loader = $loader; - $this->resource = $resource; - $this->logger = $logger; - $this->context = $context ?: new RequestContext(); - $this->setOptions($options); - } - - /** - * Sets options. - * - * Available options: - * - * * cache_dir: The cache directory (or null to disable caching) - * * debug: Whether to enable debugging or not (false by default) - * * resource_type: Type hint for the main resource (optional) - * - * @param array $options An array of options - * - * @throws \InvalidArgumentException When unsupported option is provided - */ - public function setOptions(array $options) - { - $this->options = array( - 'cache_dir' => null, - 'debug' => false, - 'generator_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', - 'generator_base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', - 'generator_dumper_class' => 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper', - 'generator_cache_class' => 'ProjectUrlGenerator', - 'matcher_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', - 'matcher_base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', - 'matcher_dumper_class' => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper', - 'matcher_cache_class' => 'ProjectUrlMatcher', - 'resource_type' => null, - 'strict_requirements' => true, - ); - - // check option names and live merge, if errors are encountered Exception will be thrown - $invalid = array(); - foreach ($options as $key => $value) { - if (array_key_exists($key, $this->options)) { - $this->options[$key] = $value; - } else { - $invalid[] = $key; - } - } - - if ($invalid) { - throw new \InvalidArgumentException(sprintf('The Router does not support the following options: "%s".', implode('", "', $invalid))); - } - } - - /** - * Sets an option. - * - * @param string $key The key - * @param mixed $value The value - * - * @throws \InvalidArgumentException - */ - public function setOption($key, $value) - { - if (!array_key_exists($key, $this->options)) { - throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key)); - } - - $this->options[$key] = $value; - } - - /** - * Gets an option value. - * - * @param string $key The key - * - * @return mixed The value - * - * @throws \InvalidArgumentException - */ - public function getOption($key) - { - if (!array_key_exists($key, $this->options)) { - throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key)); - } - - return $this->options[$key]; - } - - /** - * {@inheritdoc} - */ - public function getRouteCollection() - { - if (null === $this->collection) { - $this->collection = $this->loader->load($this->resource, $this->options['resource_type']); - } - - return $this->collection; - } - - /** - * {@inheritdoc} - */ - public function setContext(RequestContext $context) - { - $this->context = $context; - - if (null !== $this->matcher) { - $this->getMatcher()->setContext($context); - } - if (null !== $this->generator) { - $this->getGenerator()->setContext($context); - } - } - - /** - * {@inheritdoc} - */ - public function getContext() - { - return $this->context; - } - - /** - * {@inheritdoc} - */ - public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH) - { - return $this->getGenerator()->generate($name, $parameters, $referenceType); - } - - /** - * {@inheritdoc} - */ - public function match($pathinfo) - { - return $this->getMatcher()->match($pathinfo); - } - - /** - * {@inheritdoc} - */ - public function matchRequest(Request $request) - { - $matcher = $this->getMatcher(); - if (!$matcher instanceof RequestMatcherInterface) { - // fallback to the default UrlMatcherInterface - return $matcher->match($request->getPathInfo()); - } - - return $matcher->matchRequest($request); - } - - /** - * Gets the UrlMatcher instance associated with this Router. - * - * @return UrlMatcherInterface A UrlMatcherInterface instance - */ - public function getMatcher() - { - if (null !== $this->matcher) { - return $this->matcher; - } - - if (null === $this->options['cache_dir'] || null === $this->options['matcher_cache_class']) { - return $this->matcher = new $this->options['matcher_class']($this->getRouteCollection(), $this->context); - } - - $class = $this->options['matcher_cache_class']; - $cache = new ConfigCache($this->options['cache_dir'].'/'.$class.'.php', $this->options['debug']); - if (!$cache->isFresh()) { - $dumper = $this->getMatcherDumperInstance(); - - $options = array( - 'class' => $class, - 'base_class' => $this->options['matcher_base_class'], - ); - - $cache->write($dumper->dump($options), $this->getRouteCollection()->getResources()); - } - - require_once $cache; - - return $this->matcher = new $class($this->context); - } - - /** - * Gets the UrlGenerator instance associated with this Router. - * - * @return UrlGeneratorInterface A UrlGeneratorInterface instance - */ - public function getGenerator() - { - if (null !== $this->generator) { - return $this->generator; - } - - if (null === $this->options['cache_dir'] || null === $this->options['generator_cache_class']) { - $this->generator = new $this->options['generator_class']($this->getRouteCollection(), $this->context, $this->logger); - } else { - $class = $this->options['generator_cache_class']; - $cache = new ConfigCache($this->options['cache_dir'].'/'.$class.'.php', $this->options['debug']); - if (!$cache->isFresh()) { - $dumper = $this->getGeneratorDumperInstance(); - - $options = array( - 'class' => $class, - 'base_class' => $this->options['generator_base_class'], - ); - - $cache->write($dumper->dump($options), $this->getRouteCollection()->getResources()); - } - - require_once $cache; - - $this->generator = new $class($this->context, $this->logger); - } - - if ($this->generator instanceof ConfigurableRequirementsInterface) { - $this->generator->setStrictRequirements($this->options['strict_requirements']); - } - - return $this->generator; - } - - /** - * @return GeneratorDumperInterface - */ - protected function getGeneratorDumperInstance() - { - return new $this->options['generator_dumper_class']($this->getRouteCollection()); - } - - /** - * @return MatcherDumperInterface - */ - protected function getMatcherDumperInstance() - { - return new $this->options['matcher_dumper_class']($this->getRouteCollection()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouterInterface.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouterInterface.php deleted file mode 100644 index a10ae34e07..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/RouterInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing; - -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -use Symfony\Component\Routing\Matcher\UrlMatcherInterface; - -/** - * RouterInterface is the interface that all Router classes must implement. - * - * This interface is the concatenation of UrlMatcherInterface and UrlGeneratorInterface. - * - * @author Fabien Potencier - */ -interface RouterInterface extends UrlMatcherInterface, UrlGeneratorInterface -{ - /** - * Gets the RouteCollection instance associated with this Router. - * - * @return RouteCollection A RouteCollection instance - */ - public function getRouteCollection(); -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Annotation/RouteTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Annotation/RouteTest.php deleted file mode 100644 index bd0167089e..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Annotation/RouteTest.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Annotation; - -use Symfony\Component\Routing\Annotation\Route; - -class RouteTest extends \PHPUnit_Framework_TestCase -{ - /** - * @expectedException \BadMethodCallException - */ - public function testInvalidRouteParameter() - { - $route = new Route(array('foo' => 'bar')); - } - - /** - * @dataProvider getValidParameters - */ - public function testRouteParameters($parameter, $value, $getter) - { - $route = new Route(array($parameter => $value)); - $this->assertEquals($route->$getter(), $value); - } - - public function getValidParameters() - { - return array( - array('value', '/Blog', 'getPattern'), - array('value', '/Blog', 'getPath'), - array('requirements', array('_method' => 'GET'), 'getRequirements'), - array('options', array('compiler_class' => 'RouteCompiler'), 'getOptions'), - array('name', 'blog_index', 'getName'), - array('defaults', array('_controller' => 'MyBlogBundle:Blog:index'), 'getDefaults'), - array('schemes', array('https'), 'getSchemes'), - array('methods', array('GET', 'POST'), 'getMethods'), - array('host', array('{locale}.example.com'), 'getHost'), - array('condition', array('context.getMethod() == "GET"'), 'getCondition'), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/CompiledRouteTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/CompiledRouteTest.php deleted file mode 100644 index 215ebb707b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/CompiledRouteTest.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests; - -use Symfony\Component\Routing\CompiledRoute; - -class CompiledRouteTest extends \PHPUnit_Framework_TestCase -{ - public function testAccessors() - { - $compiled = new CompiledRoute('prefix', 'regex', array('tokens'), array(), array(), array(), array(), array('variables')); - $this->assertEquals('prefix', $compiled->getStaticPrefix(), '__construct() takes a static prefix as its second argument'); - $this->assertEquals('regex', $compiled->getRegex(), '__construct() takes a regexp as its third argument'); - $this->assertEquals(array('tokens'), $compiled->getTokens(), '__construct() takes an array of tokens as its fourth argument'); - $this->assertEquals(array('variables'), $compiled->getVariables(), '__construct() takes an array of variables as its ninth argument'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php deleted file mode 100644 index 56bcab2a91..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses; - -abstract class AbstractClass -{ -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php deleted file mode 100644 index a3882773c4..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/BarClass.php +++ /dev/null @@ -1,19 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses; - -class BarClass -{ - public function routeAction($arg1, $arg2 = 'defaultValue2', $arg3 = 'defaultValue3') - { - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php deleted file mode 100644 index 320dc35003..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/AnnotatedClasses/FooClass.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses; - -class FooClass -{ -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php deleted file mode 100644 index 2e9b028de8..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/CustomXmlFileLoader.php +++ /dev/null @@ -1,26 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures; - -use Symfony\Component\Routing\Loader\XmlFileLoader; -use Symfony\Component\Config\Util\XmlUtils; - -/** - * XmlFileLoader with schema validation turned off - */ -class CustomXmlFileLoader extends XmlFileLoader -{ - protected function loadFile($file) - { - return XmlUtils::loadFile($file, function () { return true; }); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php deleted file mode 100644 index e95c1f266b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/RedirectableUrlMatcher.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Fixtures; - -use Symfony\Component\Routing\Matcher\UrlMatcher; -use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface; - -/** - * @author Fabien Potencier - */ -class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface -{ - public function redirect($path, $route, $scheme = null) - { - return array( - '_controller' => 'Some controller reference...', - 'path' => $path, - 'scheme' => $scheme, - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/annotated.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/annotated.php deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache deleted file mode 100644 index 26a561cc91..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.apache +++ /dev/null @@ -1,163 +0,0 @@ -# skip "real" requests -RewriteCond %{REQUEST_FILENAME} -f -RewriteRule .* - [QSA,L] - -# foo -RewriteCond %{REQUEST_URI} ^/foo/(baz|symfony)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:foo,E=_ROUTING_param_bar:%1,E=_ROUTING_default_def:test] - -# foobar -RewriteCond %{REQUEST_URI} ^/foo(?:/([^/]++))?$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:foobar,E=_ROUTING_param_bar:%1,E=_ROUTING_default_bar:toto] - -# bar -RewriteCond %{REQUEST_URI} ^/bar/([^/]++)$ -RewriteCond %{REQUEST_METHOD} !^(GET|HEAD)$ [NC] -RewriteRule .* - [S=1,E=_ROUTING_allow_GET:1,E=_ROUTING_allow_HEAD:1] -RewriteCond %{REQUEST_URI} ^/bar/([^/]++)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:bar,E=_ROUTING_param_foo:%1] - -# baragain -RewriteCond %{REQUEST_URI} ^/baragain/([^/]++)$ -RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$ [NC] -RewriteRule .* - [S=1,E=_ROUTING_allow_GET:1,E=_ROUTING_allow_POST:1,E=_ROUTING_allow_HEAD:1] -RewriteCond %{REQUEST_URI} ^/baragain/([^/]++)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baragain,E=_ROUTING_param_foo:%1] - -# baz -RewriteCond %{REQUEST_URI} ^/test/baz$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz] - -# baz2 -RewriteCond %{REQUEST_URI} ^/test/baz\.html$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz2] - -# baz3 -RewriteCond %{REQUEST_URI} ^/test/baz3$ -RewriteRule .* $0/ [QSA,L,R=301] -RewriteCond %{REQUEST_URI} ^/test/baz3/$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz3] - -# baz4 -RewriteCond %{REQUEST_URI} ^/test/([^/]++)$ -RewriteRule .* $0/ [QSA,L,R=301] -RewriteCond %{REQUEST_URI} ^/test/([^/]++)/$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz4,E=_ROUTING_param_foo:%1] - -# baz5 -RewriteCond %{REQUEST_URI} ^/test/([^/]++)/$ -RewriteCond %{REQUEST_METHOD} !^(GET|HEAD)$ [NC] -RewriteRule .* - [S=2,E=_ROUTING_allow_GET:1,E=_ROUTING_allow_HEAD:1] -RewriteCond %{REQUEST_URI} ^/test/([^/]++)$ -RewriteRule .* $0/ [QSA,L,R=301] -RewriteCond %{REQUEST_URI} ^/test/([^/]++)/$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz5,E=_ROUTING_param_foo:%1] - -# baz5unsafe -RewriteCond %{REQUEST_URI} ^/testunsafe/([^/]++)/$ -RewriteCond %{REQUEST_METHOD} !^(POST)$ [NC] -RewriteRule .* - [S=1,E=_ROUTING_allow_POST:1] -RewriteCond %{REQUEST_URI} ^/testunsafe/([^/]++)/$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz5unsafe,E=_ROUTING_param_foo:%1] - -# baz6 -RewriteCond %{REQUEST_URI} ^/test/baz$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz6,E=_ROUTING_default_foo:bar\ baz] - -# baz7 -RewriteCond %{REQUEST_URI} ^/te\ st/baz$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz7] - -# baz8 -RewriteCond %{REQUEST_URI} ^/te\\\ st/baz$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz8] - -# baz9 -RewriteCond %{REQUEST_URI} ^/test/(te\\\ st)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:baz9,E=_ROUTING_param_baz:%1] - -RewriteCond %{HTTP:Host} ^a\.example\.com$ -RewriteRule .? - [E=__ROUTING_host_1:1] - -# route1 -RewriteCond %{ENV:__ROUTING_host_1} =1 -RewriteCond %{REQUEST_URI} ^/route1$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route1] - -# route2 -RewriteCond %{ENV:__ROUTING_host_1} =1 -RewriteCond %{REQUEST_URI} ^/c2/route2$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route2] - -RewriteCond %{HTTP:Host} ^b\.example\.com$ -RewriteRule .? - [E=__ROUTING_host_2:1] - -# route3 -RewriteCond %{ENV:__ROUTING_host_2} =1 -RewriteCond %{REQUEST_URI} ^/c2/route3$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route3] - -RewriteCond %{HTTP:Host} ^a\.example\.com$ -RewriteRule .? - [E=__ROUTING_host_3:1] - -# route4 -RewriteCond %{ENV:__ROUTING_host_3} =1 -RewriteCond %{REQUEST_URI} ^/route4$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route4] - -RewriteCond %{HTTP:Host} ^c\.example\.com$ -RewriteRule .? - [E=__ROUTING_host_4:1] - -# route5 -RewriteCond %{ENV:__ROUTING_host_4} =1 -RewriteCond %{REQUEST_URI} ^/route5$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route5] - -# route6 -RewriteCond %{REQUEST_URI} ^/route6$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route6] - -RewriteCond %{HTTP:Host} ^([^\.]++)\.example\.com$ -RewriteRule .? - [E=__ROUTING_host_5:1,E=__ROUTING_host_5_var1:%1] - -# route11 -RewriteCond %{ENV:__ROUTING_host_5} =1 -RewriteCond %{REQUEST_URI} ^/route11$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route11,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1}] - -# route12 -RewriteCond %{ENV:__ROUTING_host_5} =1 -RewriteCond %{REQUEST_URI} ^/route12$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route12,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1},E=_ROUTING_default_var1:val] - -# route13 -RewriteCond %{ENV:__ROUTING_host_5} =1 -RewriteCond %{REQUEST_URI} ^/route13/([^/]++)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route13,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1},E=_ROUTING_param_name:%1] - -# route14 -RewriteCond %{ENV:__ROUTING_host_5} =1 -RewriteCond %{REQUEST_URI} ^/route14/([^/]++)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route14,E=_ROUTING_param_var1:%{ENV:__ROUTING_host_5_var1},E=_ROUTING_param_name:%1,E=_ROUTING_default_var1:val] - -RewriteCond %{HTTP:Host} ^c\.example\.com$ -RewriteRule .? - [E=__ROUTING_host_6:1] - -# route15 -RewriteCond %{ENV:__ROUTING_host_6} =1 -RewriteCond %{REQUEST_URI} ^/route15/([^/]++)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route15,E=_ROUTING_param_name:%1] - -# route16 -RewriteCond %{REQUEST_URI} ^/route16/([^/]++)$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route16,E=_ROUTING_param_name:%1,E=_ROUTING_default_var1:val] - -# route17 -RewriteCond %{REQUEST_URI} ^/route17$ -RewriteRule .* app.php [QSA,L,E=_ROUTING_route:route17] - -# 405 Method Not Allowed -RewriteCond %{ENV:_ROUTING__allow_GET} =1 [OR] -RewriteCond %{ENV:_ROUTING__allow_HEAD} =1 [OR] -RewriteCond %{ENV:_ROUTING__allow_POST} =1 -RewriteRule .* app.php [QSA,L] diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php deleted file mode 100644 index 248a4f153f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php +++ /dev/null @@ -1,312 +0,0 @@ -context = $context; - } - - public function match($pathinfo) - { - $allow = array(); - $pathinfo = rawurldecode($pathinfo); - $context = $this->context; - $request = $this->request; - - // foo - if (0 === strpos($pathinfo, '/foo') && preg_match('#^/foo/(?Pbaz|symfony)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo')), array ( 'def' => 'test',)); - } - - if (0 === strpos($pathinfo, '/bar')) { - // bar - if (preg_match('#^/bar/(?P[^/]++)$#s', $pathinfo, $matches)) { - if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) { - $allow = array_merge($allow, array('GET', 'HEAD')); - goto not_bar; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar')), array ()); - } - not_bar: - - // barhead - if (0 === strpos($pathinfo, '/barhead') && preg_match('#^/barhead/(?P[^/]++)$#s', $pathinfo, $matches)) { - if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) { - $allow = array_merge($allow, array('GET', 'HEAD')); - goto not_barhead; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'barhead')), array ()); - } - not_barhead: - - } - - if (0 === strpos($pathinfo, '/test')) { - if (0 === strpos($pathinfo, '/test/baz')) { - // baz - if ($pathinfo === '/test/baz') { - return array('_route' => 'baz'); - } - - // baz2 - if ($pathinfo === '/test/baz.html') { - return array('_route' => 'baz2'); - } - - // baz3 - if ($pathinfo === '/test/baz3/') { - return array('_route' => 'baz3'); - } - - } - - // baz4 - if (preg_match('#^/test/(?P[^/]++)/$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz4')), array ()); - } - - // baz5 - if (preg_match('#^/test/(?P[^/]++)/$#s', $pathinfo, $matches)) { - if ($this->context->getMethod() != 'POST') { - $allow[] = 'POST'; - goto not_baz5; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz5')), array ()); - } - not_baz5: - - // baz.baz6 - if (preg_match('#^/test/(?P[^/]++)/$#s', $pathinfo, $matches)) { - if ($this->context->getMethod() != 'PUT') { - $allow[] = 'PUT'; - goto not_bazbaz6; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz.baz6')), array ()); - } - not_bazbaz6: - - } - - // foofoo - if ($pathinfo === '/foofoo') { - return array ( 'def' => 'test', '_route' => 'foofoo',); - } - - // quoter - if (preg_match('#^/(?P[\']+)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'quoter')), array ()); - } - - // space - if ($pathinfo === '/spa ce') { - return array('_route' => 'space'); - } - - if (0 === strpos($pathinfo, '/a')) { - if (0 === strpos($pathinfo, '/a/b\'b')) { - // foo1 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo1')), array ()); - } - - // bar1 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar1')), array ()); - } - - } - - // overridden - if (preg_match('#^/a/(?P.*)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'overridden')), array ()); - } - - if (0 === strpos($pathinfo, '/a/b\'b')) { - // foo2 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo2')), array ()); - } - - // bar2 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar2')), array ()); - } - - } - - } - - if (0 === strpos($pathinfo, '/multi')) { - // helloWorld - if (0 === strpos($pathinfo, '/multi/hello') && preg_match('#^/multi/hello(?:/(?P[^/]++))?$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'helloWorld')), array ( 'who' => 'World!',)); - } - - // overridden2 - if ($pathinfo === '/multi/new') { - return array('_route' => 'overridden2'); - } - - // hey - if ($pathinfo === '/multi/hey/') { - return array('_route' => 'hey'); - } - - } - - // foo3 - if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo3')), array ()); - } - - // bar3 - if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar3')), array ()); - } - - if (0 === strpos($pathinfo, '/aba')) { - // ababa - if ($pathinfo === '/ababa') { - return array('_route' => 'ababa'); - } - - // foo4 - if (preg_match('#^/aba/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo4')), array ()); - } - - } - - $host = $this->context->getHost(); - - if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) { - // route1 - if ($pathinfo === '/route1') { - return array('_route' => 'route1'); - } - - // route2 - if ($pathinfo === '/c2/route2') { - return array('_route' => 'route2'); - } - - } - - if (preg_match('#^b\\.example\\.com$#s', $host, $hostMatches)) { - // route3 - if ($pathinfo === '/c2/route3') { - return array('_route' => 'route3'); - } - - } - - if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) { - // route4 - if ($pathinfo === '/route4') { - return array('_route' => 'route4'); - } - - } - - if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) { - // route5 - if ($pathinfo === '/route5') { - return array('_route' => 'route5'); - } - - } - - // route6 - if ($pathinfo === '/route6') { - return array('_route' => 'route6'); - } - - if (preg_match('#^(?P[^\\.]++)\\.example\\.com$#s', $host, $hostMatches)) { - if (0 === strpos($pathinfo, '/route1')) { - // route11 - if ($pathinfo === '/route11') { - return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route11')), array ()); - } - - // route12 - if ($pathinfo === '/route12') { - return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route12')), array ( 'var1' => 'val',)); - } - - // route13 - if (0 === strpos($pathinfo, '/route13') && preg_match('#^/route13/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route13')), array ()); - } - - // route14 - if (0 === strpos($pathinfo, '/route14') && preg_match('#^/route14/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route14')), array ( 'var1' => 'val',)); - } - - } - - } - - if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) { - // route15 - if (0 === strpos($pathinfo, '/route15') && preg_match('#^/route15/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'route15')), array ()); - } - - } - - if (0 === strpos($pathinfo, '/route1')) { - // route16 - if (0 === strpos($pathinfo, '/route16') && preg_match('#^/route16/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'route16')), array ( 'var1' => 'val',)); - } - - // route17 - if ($pathinfo === '/route17') { - return array('_route' => 'route17'); - } - - } - - if (0 === strpos($pathinfo, '/a')) { - // a - if ($pathinfo === '/a/a...') { - return array('_route' => 'a'); - } - - if (0 === strpos($pathinfo, '/a/b')) { - // b - if (preg_match('#^/a/b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'b')), array ()); - } - - // c - if (0 === strpos($pathinfo, '/a/b/c') && preg_match('#^/a/b/c/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'c')), array ()); - } - - } - - } - - throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException(); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache deleted file mode 100644 index 309f2ff0e5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.apache +++ /dev/null @@ -1,7 +0,0 @@ -# skip "real" requests -RewriteCond %{REQUEST_FILENAME} -f -RewriteRule .* - [QSA,L] - -# foo -RewriteCond %{REQUEST_URI} ^/foo$ -RewriteRule .* ap\ p_d\ ev.php [QSA,L,E=_ROUTING_route:foo] diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php deleted file mode 100644 index acf1163c5b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php +++ /dev/null @@ -1,344 +0,0 @@ -context = $context; - } - - public function match($pathinfo) - { - $allow = array(); - $pathinfo = rawurldecode($pathinfo); - $context = $this->context; - $request = $this->request; - - // foo - if (0 === strpos($pathinfo, '/foo') && preg_match('#^/foo/(?Pbaz|symfony)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo')), array ( 'def' => 'test',)); - } - - if (0 === strpos($pathinfo, '/bar')) { - // bar - if (preg_match('#^/bar/(?P[^/]++)$#s', $pathinfo, $matches)) { - if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) { - $allow = array_merge($allow, array('GET', 'HEAD')); - goto not_bar; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar')), array ()); - } - not_bar: - - // barhead - if (0 === strpos($pathinfo, '/barhead') && preg_match('#^/barhead/(?P[^/]++)$#s', $pathinfo, $matches)) { - if (!in_array($this->context->getMethod(), array('GET', 'HEAD'))) { - $allow = array_merge($allow, array('GET', 'HEAD')); - goto not_barhead; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'barhead')), array ()); - } - not_barhead: - - } - - if (0 === strpos($pathinfo, '/test')) { - if (0 === strpos($pathinfo, '/test/baz')) { - // baz - if ($pathinfo === '/test/baz') { - return array('_route' => 'baz'); - } - - // baz2 - if ($pathinfo === '/test/baz.html') { - return array('_route' => 'baz2'); - } - - // baz3 - if (rtrim($pathinfo, '/') === '/test/baz3') { - if (substr($pathinfo, -1) !== '/') { - return $this->redirect($pathinfo.'/', 'baz3'); - } - - return array('_route' => 'baz3'); - } - - } - - // baz4 - if (preg_match('#^/test/(?P[^/]++)/?$#s', $pathinfo, $matches)) { - if (substr($pathinfo, -1) !== '/') { - return $this->redirect($pathinfo.'/', 'baz4'); - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz4')), array ()); - } - - // baz5 - if (preg_match('#^/test/(?P[^/]++)/$#s', $pathinfo, $matches)) { - if ($this->context->getMethod() != 'POST') { - $allow[] = 'POST'; - goto not_baz5; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz5')), array ()); - } - not_baz5: - - // baz.baz6 - if (preg_match('#^/test/(?P[^/]++)/$#s', $pathinfo, $matches)) { - if ($this->context->getMethod() != 'PUT') { - $allow[] = 'PUT'; - goto not_bazbaz6; - } - - return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz.baz6')), array ()); - } - not_bazbaz6: - - } - - // foofoo - if ($pathinfo === '/foofoo') { - return array ( 'def' => 'test', '_route' => 'foofoo',); - } - - // quoter - if (preg_match('#^/(?P[\']+)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'quoter')), array ()); - } - - // space - if ($pathinfo === '/spa ce') { - return array('_route' => 'space'); - } - - if (0 === strpos($pathinfo, '/a')) { - if (0 === strpos($pathinfo, '/a/b\'b')) { - // foo1 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo1')), array ()); - } - - // bar1 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar1')), array ()); - } - - } - - // overridden - if (preg_match('#^/a/(?P.*)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'overridden')), array ()); - } - - if (0 === strpos($pathinfo, '/a/b\'b')) { - // foo2 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo2')), array ()); - } - - // bar2 - if (preg_match('#^/a/b\'b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar2')), array ()); - } - - } - - } - - if (0 === strpos($pathinfo, '/multi')) { - // helloWorld - if (0 === strpos($pathinfo, '/multi/hello') && preg_match('#^/multi/hello(?:/(?P[^/]++))?$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'helloWorld')), array ( 'who' => 'World!',)); - } - - // overridden2 - if ($pathinfo === '/multi/new') { - return array('_route' => 'overridden2'); - } - - // hey - if (rtrim($pathinfo, '/') === '/multi/hey') { - if (substr($pathinfo, -1) !== '/') { - return $this->redirect($pathinfo.'/', 'hey'); - } - - return array('_route' => 'hey'); - } - - } - - // foo3 - if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo3')), array ()); - } - - // bar3 - if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar3')), array ()); - } - - if (0 === strpos($pathinfo, '/aba')) { - // ababa - if ($pathinfo === '/ababa') { - return array('_route' => 'ababa'); - } - - // foo4 - if (preg_match('#^/aba/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo4')), array ()); - } - - } - - $host = $this->context->getHost(); - - if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) { - // route1 - if ($pathinfo === '/route1') { - return array('_route' => 'route1'); - } - - // route2 - if ($pathinfo === '/c2/route2') { - return array('_route' => 'route2'); - } - - } - - if (preg_match('#^b\\.example\\.com$#s', $host, $hostMatches)) { - // route3 - if ($pathinfo === '/c2/route3') { - return array('_route' => 'route3'); - } - - } - - if (preg_match('#^a\\.example\\.com$#s', $host, $hostMatches)) { - // route4 - if ($pathinfo === '/route4') { - return array('_route' => 'route4'); - } - - } - - if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) { - // route5 - if ($pathinfo === '/route5') { - return array('_route' => 'route5'); - } - - } - - // route6 - if ($pathinfo === '/route6') { - return array('_route' => 'route6'); - } - - if (preg_match('#^(?P[^\\.]++)\\.example\\.com$#s', $host, $hostMatches)) { - if (0 === strpos($pathinfo, '/route1')) { - // route11 - if ($pathinfo === '/route11') { - return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route11')), array ()); - } - - // route12 - if ($pathinfo === '/route12') { - return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route12')), array ( 'var1' => 'val',)); - } - - // route13 - if (0 === strpos($pathinfo, '/route13') && preg_match('#^/route13/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route13')), array ()); - } - - // route14 - if (0 === strpos($pathinfo, '/route14') && preg_match('#^/route14/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route14')), array ( 'var1' => 'val',)); - } - - } - - } - - if (preg_match('#^c\\.example\\.com$#s', $host, $hostMatches)) { - // route15 - if (0 === strpos($pathinfo, '/route15') && preg_match('#^/route15/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'route15')), array ()); - } - - } - - if (0 === strpos($pathinfo, '/route1')) { - // route16 - if (0 === strpos($pathinfo, '/route16') && preg_match('#^/route16/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'route16')), array ( 'var1' => 'val',)); - } - - // route17 - if ($pathinfo === '/route17') { - return array('_route' => 'route17'); - } - - } - - if (0 === strpos($pathinfo, '/a')) { - // a - if ($pathinfo === '/a/a...') { - return array('_route' => 'a'); - } - - if (0 === strpos($pathinfo, '/a/b')) { - // b - if (preg_match('#^/a/b/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'b')), array ()); - } - - // c - if (0 === strpos($pathinfo, '/a/b/c') && preg_match('#^/a/b/c/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'c')), array ()); - } - - } - - } - - // secure - if ($pathinfo === '/secure') { - $requiredSchemes = array ( 'https' => 0,); - if (!isset($requiredSchemes[$this->context->getScheme()])) { - return $this->redirect($pathinfo, 'secure', key($requiredSchemes)); - } - - return array('_route' => 'secure'); - } - - // nonsecure - if ($pathinfo === '/nonsecure') { - $requiredSchemes = array ( 'http' => 0,); - if (!isset($requiredSchemes[$this->context->getScheme()])) { - return $this->redirect($pathinfo, 'nonsecure', key($requiredSchemes)); - } - - return array('_route' => 'nonsecure'); - } - - throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException(); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php deleted file mode 100644 index c3463fa772..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php +++ /dev/null @@ -1,50 +0,0 @@ -context = $context; - } - - public function match($pathinfo) - { - $allow = array(); - $pathinfo = rawurldecode($pathinfo); - $context = $this->context; - $request = $this->request; - - if (0 === strpos($pathinfo, '/rootprefix')) { - // static - if ($pathinfo === '/rootprefix/test') { - return array('_route' => 'static'); - } - - // dynamic - if (preg_match('#^/rootprefix/(?P[^/]++)$#s', $pathinfo, $matches)) { - return $this->mergeDefaults(array_replace($matches, array('_route' => 'dynamic')), array ()); - } - - } - - // with-condition - if ($pathinfo === '/with-condition' && ($context->getMethod() == "GET")) { - return array('_route' => 'with-condition'); - } - - throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException(); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/empty.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/empty.yml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/foo.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/foo.xml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/foo1.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/foo1.xml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/incomplete.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/incomplete.yml deleted file mode 100644 index df64d324f9..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/incomplete.yml +++ /dev/null @@ -1,2 +0,0 @@ -blog_show: - defaults: { _controller: MyBlogBundle:Blog:show } diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_id.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_id.xml deleted file mode 100644 index 4ea4115f28..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_id.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_path.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_path.xml deleted file mode 100644 index ef5bc088dd..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/missing_path.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml deleted file mode 100644 index bdd6a47329..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/namespaceprefix.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - MyBundle:Blog:show - \w+ - en|fr|de - RouteCompiler - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml deleted file mode 100644 index a3e9473727..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_resource_plus_path.yml +++ /dev/null @@ -1,3 +0,0 @@ -blog_show: - resource: validpattern.yml - path: /test diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml deleted file mode 100644 index 547cda3b61..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonesense_type_without_resource.yml +++ /dev/null @@ -1,3 +0,0 @@ -blog_show: - path: /blog/{slug} - type: custom diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml deleted file mode 100644 index 755e44304c..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - MyBundle:Blog:show - GET - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml deleted file mode 100644 index 257cc5642c..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid.yml +++ /dev/null @@ -1 +0,0 @@ -foo diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml deleted file mode 100644 index cfa9992bbc..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalid2.yml +++ /dev/null @@ -1 +0,0 @@ -route: string diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml deleted file mode 100644 index 015e270fb1..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidkeys.yml +++ /dev/null @@ -1,3 +0,0 @@ -someroute: - resource: path/to/some.yml - name_prefix: test_ diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml deleted file mode 100644 index 863ef03b90..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidnode.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - bar - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml deleted file mode 100644 index a46961eee5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/nonvalidroute.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - MyBundle:Blog:show - GET - - baz - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml deleted file mode 100644 index 78be239aa4..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/special_route_name.yml +++ /dev/null @@ -1,2 +0,0 @@ -"#$péß^a|": - path: "true" diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.php deleted file mode 100644 index b652d94656..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.php +++ /dev/null @@ -1,27 +0,0 @@ -add('blog_show', new Route( - '/blog/{slug}', - array('_controller' => 'MyBlogBundle:Blog:show'), - array('locale' => '\w+'), - array('compiler_class' => 'RouteCompiler'), - '{locale}.example.com', - array('https'), - array('GET','POST','put','OpTiOnS'), - 'context.getMethod() == "GET"' -)); -$collection->add('blog_show_legacy', new Route( - '/blog/{slug}', - array('_controller' => 'MyBlogBundle:Blog:show'), - array('_method' => 'GET|POST|put|OpTiOnS', '_scheme' => 'https', 'locale' => '\w+',), - array('compiler_class' => 'RouteCompiler'), - '{locale}.example.com', - array(), - array(), - 'context.getMethod() == "GET"' -)); - -return $collection; diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.xml deleted file mode 100644 index a8221314cb..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - MyBundle:Blog:show - \w+ - - context.getMethod() == "GET" - - - - MyBundle:Blog:show - - GET|POST|put|OpTiOnS - hTTps - \w+ - - context.getMethod() == "GET" - - - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.yml deleted file mode 100644 index 26136c3969..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validpattern.yml +++ /dev/null @@ -1,22 +0,0 @@ -blog_show: - path: /blog/{slug} - defaults: { _controller: "MyBundle:Blog:show" } - host: "{locale}.example.com" - requirements: { 'locale': '\w+' } - methods: ['GET','POST','put','OpTiOnS'] - schemes: ['https'] - condition: 'context.getMethod() == "GET"' - options: - compiler_class: RouteCompiler - -blog_show_legacy: - pattern: /blog/{slug} - defaults: { _controller: "MyBundle:Blog:show" } - host: "{locale}.example.com" - requirements: { '_method': 'GET|POST|put|OpTiOnS', _scheme: https, 'locale': '\w+' } - condition: 'context.getMethod() == "GET"' - options: - compiler_class: RouteCompiler - -blog_show_inherited: - path: /blog/{slug} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.xml deleted file mode 100644 index b7a15ddc7e..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - 123 - \d+ - - context.getMethod() == "POST" - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.yml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.yml deleted file mode 100644 index faf2263ae5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/validresource.yml +++ /dev/null @@ -1,8 +0,0 @@ -_blog: - resource: validpattern.yml - prefix: /{foo} - defaults: { 'foo': '123' } - requirements: { 'foo': '\d+' } - options: { 'foo': 'bar' } - host: "" - condition: 'context.getMethod() == "POST"' diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml deleted file mode 100644 index f217d5bcac..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Fixtures/withdoctype.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php deleted file mode 100644 index 4165741b06..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php +++ /dev/null @@ -1,150 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Generator\Dumper; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper; -use Symfony\Component\Routing\RequestContext; - -class PhpGeneratorDumperTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var RouteCollection - */ - private $routeCollection; - - /** - * @var PhpGeneratorDumper - */ - private $generatorDumper; - - /** - * @var string - */ - private $testTmpFilepath; - - protected function setUp() - { - parent::setUp(); - - $this->routeCollection = new RouteCollection(); - $this->generatorDumper = new PhpGeneratorDumper($this->routeCollection); - $this->testTmpFilepath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_generator.php'; - @unlink($this->testTmpFilepath); - } - - protected function tearDown() - { - parent::tearDown(); - - @unlink($this->testTmpFilepath); - - $this->routeCollection = null; - $this->generatorDumper = null; - $this->testTmpFilepath = null; - } - - public function testDumpWithRoutes() - { - $this->routeCollection->add('Test', new Route('/testing/{foo}')); - $this->routeCollection->add('Test2', new Route('/testing2')); - - file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump()); - include $this->testTmpFilepath; - - $projectUrlGenerator = new \ProjectUrlGenerator(new RequestContext('/app.php')); - - $absoluteUrlWithParameter = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), true); - $absoluteUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), true); - $relativeUrlWithParameter = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), false); - $relativeUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), false); - - $this->assertEquals($absoluteUrlWithParameter, 'http://localhost/app.php/testing/bar'); - $this->assertEquals($absoluteUrlWithoutParameter, 'http://localhost/app.php/testing2'); - $this->assertEquals($relativeUrlWithParameter, '/app.php/testing/bar'); - $this->assertEquals($relativeUrlWithoutParameter, '/app.php/testing2'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testDumpWithoutRoutes() - { - file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'WithoutRoutesUrlGenerator'))); - include $this->testTmpFilepath; - - $projectUrlGenerator = new \WithoutRoutesUrlGenerator(new RequestContext('/app.php')); - - $projectUrlGenerator->generate('Test', array()); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException - */ - public function testGenerateNonExistingRoute() - { - $this->routeCollection->add('Test', new Route('/test')); - - file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'NonExistingRoutesUrlGenerator'))); - include $this->testTmpFilepath; - - $projectUrlGenerator = new \NonExistingRoutesUrlGenerator(new RequestContext()); - $url = $projectUrlGenerator->generate('NonExisting', array()); - } - - public function testDumpForRouteWithDefaults() - { - $this->routeCollection->add('Test', new Route('/testing/{foo}', array('foo' => 'bar'))); - - file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'DefaultRoutesUrlGenerator'))); - include $this->testTmpFilepath; - - $projectUrlGenerator = new \DefaultRoutesUrlGenerator(new RequestContext()); - $url = $projectUrlGenerator->generate('Test', array()); - - $this->assertEquals($url, '/testing'); - } - - public function testDumpWithSchemeRequirement() - { - $this->routeCollection->add('Test1', new Route('/testing', array(), array(), array(), '', array('ftp', 'https'))); - $this->routeCollection->add('Test2', new Route('/testing_bc', array(), array('_scheme' => 'https'))); // BC - - file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'SchemeUrlGenerator'))); - include $this->testTmpFilepath; - - $projectUrlGenerator = new \SchemeUrlGenerator(new RequestContext('/app.php')); - - $absoluteUrl = $projectUrlGenerator->generate('Test1', array(), true); - $absoluteUrlBC = $projectUrlGenerator->generate('Test2', array(), true); - $relativeUrl = $projectUrlGenerator->generate('Test1', array(), false); - $relativeUrlBC = $projectUrlGenerator->generate('Test2', array(), false); - - $this->assertEquals($absoluteUrl, 'ftp://localhost/app.php/testing'); - $this->assertEquals($absoluteUrlBC, 'https://localhost/app.php/testing_bc'); - $this->assertEquals($relativeUrl, 'ftp://localhost/app.php/testing'); - $this->assertEquals($relativeUrlBC, 'https://localhost/app.php/testing_bc'); - - $projectUrlGenerator = new \SchemeUrlGenerator(new RequestContext('/app.php', 'GET', 'localhost', 'https')); - - $absoluteUrl = $projectUrlGenerator->generate('Test1', array(), true); - $absoluteUrlBC = $projectUrlGenerator->generate('Test2', array(), true); - $relativeUrl = $projectUrlGenerator->generate('Test1', array(), false); - $relativeUrlBC = $projectUrlGenerator->generate('Test2', array(), false); - - $this->assertEquals($absoluteUrl, 'https://localhost/app.php/testing'); - $this->assertEquals($absoluteUrlBC, 'https://localhost/app.php/testing_bc'); - $this->assertEquals($relativeUrl, '/app.php/testing'); - $this->assertEquals($relativeUrlBC, '/app.php/testing_bc'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php deleted file mode 100644 index 143e3448a2..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php +++ /dev/null @@ -1,671 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Generator; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\Generator\UrlGenerator; -use Symfony\Component\Routing\Generator\UrlGeneratorInterface; -use Symfony\Component\Routing\RequestContext; - -class UrlGeneratorTest extends \PHPUnit_Framework_TestCase -{ - public function testAbsoluteUrlWithPort80() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes)->generate('test', array(), true); - - $this->assertEquals('http://localhost/app.php/testing', $url); - } - - public function testAbsoluteSecureUrlWithPort443() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes, array('scheme' => 'https'))->generate('test', array(), true); - - $this->assertEquals('https://localhost/app.php/testing', $url); - } - - public function testAbsoluteUrlWithNonStandardPort() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes, array('httpPort' => 8080))->generate('test', array(), true); - - $this->assertEquals('http://localhost:8080/app.php/testing', $url); - } - - public function testAbsoluteSecureUrlWithNonStandardPort() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes, array('httpsPort' => 8080, 'scheme' => 'https'))->generate('test', array(), true); - - $this->assertEquals('https://localhost:8080/app.php/testing', $url); - } - - public function testRelativeUrlWithoutParameters() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes)->generate('test', array(), false); - - $this->assertEquals('/app.php/testing', $url); - } - - public function testRelativeUrlWithParameter() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}')); - $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), false); - - $this->assertEquals('/app.php/testing/bar', $url); - } - - public function testRelativeUrlWithNullParameter() - { - $routes = $this->getRoutes('test', new Route('/testing.{format}', array('format' => null))); - $url = $this->getGenerator($routes)->generate('test', array(), false); - - $this->assertEquals('/app.php/testing', $url); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testRelativeUrlWithNullParameterButNotOptional() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}/bar', array('foo' => null))); - // This must raise an exception because the default requirement for "foo" is "[^/]+" which is not met with these params. - // Generating path "/testing//bar" would be wrong as matching this route would fail. - $this->getGenerator($routes)->generate('test', array(), false); - } - - public function testRelativeUrlWithOptionalZeroParameter() - { - $routes = $this->getRoutes('test', new Route('/testing/{page}')); - $url = $this->getGenerator($routes)->generate('test', array('page' => 0), false); - - $this->assertEquals('/app.php/testing/0', $url); - } - - public function testNotPassedOptionalParameterInBetween() - { - $routes = $this->getRoutes('test', new Route('/{slug}/{page}', array('slug' => 'index', 'page' => 0))); - $this->assertSame('/app.php/index/1', $this->getGenerator($routes)->generate('test', array('page' => 1))); - $this->assertSame('/app.php/', $this->getGenerator($routes)->generate('test')); - } - - public function testRelativeUrlWithExtraParameters() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), false); - - $this->assertEquals('/app.php/testing?foo=bar', $url); - } - - public function testAbsoluteUrlWithExtraParameters() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), true); - - $this->assertEquals('http://localhost/app.php/testing?foo=bar', $url); - } - - public function testUrlWithNullExtraParameters() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $url = $this->getGenerator($routes)->generate('test', array('foo' => null), true); - - $this->assertEquals('http://localhost/app.php/testing', $url); - } - - public function testUrlWithExtraParametersFromGlobals() - { - $routes = $this->getRoutes('test', new Route('/testing')); - $generator = $this->getGenerator($routes); - $context = new RequestContext('/app.php'); - $context->setParameter('bar', 'bar'); - $generator->setContext($context); - $url = $generator->generate('test', array('foo' => 'bar')); - - $this->assertEquals('/app.php/testing?foo=bar', $url); - } - - public function testUrlWithGlobalParameter() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}')); - $generator = $this->getGenerator($routes); - $context = new RequestContext('/app.php'); - $context->setParameter('foo', 'bar'); - $generator->setContext($context); - $url = $generator->generate('test', array()); - - $this->assertEquals('/app.php/testing/bar', $url); - } - - public function testGlobalParameterHasHigherPriorityThanDefault() - { - $routes = $this->getRoutes('test', new Route('/{_locale}', array('_locale' => 'en'))); - $generator = $this->getGenerator($routes); - $context = new RequestContext('/app.php'); - $context->setParameter('_locale', 'de'); - $generator->setContext($context); - $url = $generator->generate('test', array()); - - $this->assertSame('/app.php/de', $url); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException - */ - public function testGenerateWithoutRoutes() - { - $routes = $this->getRoutes('foo', new Route('/testing/{foo}')); - $this->getGenerator($routes)->generate('test', array(), true); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\MissingMandatoryParametersException - */ - public function testGenerateForRouteWithoutMandatoryParameter() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}')); - $this->getGenerator($routes)->generate('test', array(), true); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testGenerateForRouteWithInvalidOptionalParameter() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+'))); - $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), true); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testGenerateForRouteWithInvalidParameter() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}', array(), array('foo' => '1|2'))); - $this->getGenerator($routes)->generate('test', array('foo' => '0'), true); - } - - public function testGenerateForRouteWithInvalidOptionalParameterNonStrict() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+'))); - $generator = $this->getGenerator($routes); - $generator->setStrictRequirements(false); - $this->assertNull($generator->generate('test', array('foo' => 'bar'), true)); - } - - public function testGenerateForRouteWithInvalidOptionalParameterNonStrictWithLogger() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+'))); - $logger = $this->getMock('Psr\Log\LoggerInterface'); - $logger->expects($this->once()) - ->method('error'); - $generator = $this->getGenerator($routes, array(), $logger); - $generator->setStrictRequirements(false); - $this->assertNull($generator->generate('test', array('foo' => 'bar'), true)); - } - - public function testGenerateForRouteWithInvalidParameterButDisabledRequirementsCheck() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+'))); - $generator = $this->getGenerator($routes); - $generator->setStrictRequirements(null); - $this->assertSame('/app.php/testing/bar', $generator->generate('test', array('foo' => 'bar'))); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testGenerateForRouteWithInvalidMandatoryParameter() - { - $routes = $this->getRoutes('test', new Route('/testing/{foo}', array(), array('foo' => 'd+'))); - $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), true); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testRequiredParamAndEmptyPassed() - { - $routes = $this->getRoutes('test', new Route('/{slug}', array(), array('slug' => '.+'))); - $this->getGenerator($routes)->generate('test', array('slug' => '')); - } - - public function testSchemeRequirementDoesNothingIfSameCurrentScheme() - { - $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'http'))); // BC - $this->assertEquals('/app.php/', $this->getGenerator($routes)->generate('test')); - - $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'https'))); // BC - $this->assertEquals('/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test')); - - $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('http'))); - $this->assertEquals('/app.php/', $this->getGenerator($routes)->generate('test')); - - $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('https'))); - $this->assertEquals('/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test')); - } - - public function testSchemeRequirementForcesAbsoluteUrl() - { - $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'https'))); // BC - $this->assertEquals('https://localhost/app.php/', $this->getGenerator($routes)->generate('test')); - - $routes = $this->getRoutes('test', new Route('/', array(), array('_scheme' => 'http'))); // BC - $this->assertEquals('http://localhost/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test')); - - $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('https'))); - $this->assertEquals('https://localhost/app.php/', $this->getGenerator($routes)->generate('test')); - - $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('http'))); - $this->assertEquals('http://localhost/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test')); - } - - public function testSchemeRequirementCreatesUrlForFirstRequiredScheme() - { - $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('Ftp', 'https'))); - $this->assertEquals('ftp://localhost/app.php/', $this->getGenerator($routes)->generate('test')); - } - - public function testPathWithTwoStartingSlashes() - { - $routes = $this->getRoutes('test', new Route('//path-and-not-domain')); - - // this must not generate '//path-and-not-domain' because that would be a network path - $this->assertSame('/path-and-not-domain', $this->getGenerator($routes, array('BaseUrl' => ''))->generate('test')); - } - - public function testNoTrailingSlashForMultipleOptionalParameters() - { - $routes = $this->getRoutes('test', new Route('/category/{slug1}/{slug2}/{slug3}', array('slug2' => null, 'slug3' => null))); - - $this->assertEquals('/app.php/category/foo', $this->getGenerator($routes)->generate('test', array('slug1' => 'foo'))); - } - - public function testWithAnIntegerAsADefaultValue() - { - $routes = $this->getRoutes('test', new Route('/{default}', array('default' => 0))); - - $this->assertEquals('/app.php/foo', $this->getGenerator($routes)->generate('test', array('default' => 'foo'))); - } - - public function testNullForOptionalParameterIsIgnored() - { - $routes = $this->getRoutes('test', new Route('/test/{default}', array('default' => 0))); - - $this->assertEquals('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => null))); - } - - public function testQueryParamSameAsDefault() - { - $routes = $this->getRoutes('test', new Route('/test', array('default' => 'value'))); - - $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => 'foo'))); - $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => 'value'))); - $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test')); - } - - public function testGenerateWithSpecialRouteName() - { - $routes = $this->getRoutes('$péß^a|', new Route('/bar')); - - $this->assertSame('/app.php/bar', $this->getGenerator($routes)->generate('$péß^a|')); - } - - public function testUrlEncoding() - { - // This tests the encoding of reserved characters that are used for delimiting of URI components (defined in RFC 3986) - // and other special ASCII chars. These chars are tested as static text path, variable path and query param. - $chars = '@:[]/()*\'" +,;-._~&$<>|{}%\\^`!?foo=bar#id'; - $routes = $this->getRoutes('test', new Route("/$chars/{varpath}", array(), array('varpath' => '.+'))); - $this->assertSame('/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id' - .'/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id' - .'?query=%40%3A%5B%5D%2F%28%29%2A%27%22+%2B%2C%3B-._%7E%26%24%3C%3E%7C%7B%7D%25%5C%5E%60%21%3Ffoo%3Dbar%23id', - $this->getGenerator($routes)->generate('test', array( - 'varpath' => $chars, - 'query' => $chars - )) - ); - } - - public function testEncodingOfRelativePathSegments() - { - $routes = $this->getRoutes('test', new Route('/dir/../dir/..')); - $this->assertSame('/app.php/dir/%2E%2E/dir/%2E%2E', $this->getGenerator($routes)->generate('test')); - $routes = $this->getRoutes('test', new Route('/dir/./dir/.')); - $this->assertSame('/app.php/dir/%2E/dir/%2E', $this->getGenerator($routes)->generate('test')); - $routes = $this->getRoutes('test', new Route('/a./.a/a../..a/...')); - $this->assertSame('/app.php/a./.a/a../..a/...', $this->getGenerator($routes)->generate('test')); - } - - public function testAdjacentVariables() - { - $routes = $this->getRoutes('test', new Route('/{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => '\d+'))); - $generator = $this->getGenerator($routes); - $this->assertSame('/app.php/foo123', $generator->generate('test', array('x' => 'foo', 'y' => '123'))); - $this->assertSame('/app.php/foo123bar.xml', $generator->generate('test', array('x' => 'foo', 'y' => '123', 'z' => 'bar', '_format' => 'xml'))); - - // The default requirement for 'x' should not allow the separator '.' in this case because it would otherwise match everything - // and following optional variables like _format could never match. - $this->setExpectedException('Symfony\Component\Routing\Exception\InvalidParameterException'); - $generator->generate('test', array('x' => 'do.t', 'y' => '123', 'z' => 'bar', '_format' => 'xml')); - } - - public function testOptionalVariableWithNoRealSeparator() - { - $routes = $this->getRoutes('test', new Route('/get{what}', array('what' => 'All'))); - $generator = $this->getGenerator($routes); - - $this->assertSame('/app.php/get', $generator->generate('test')); - $this->assertSame('/app.php/getSites', $generator->generate('test', array('what' => 'Sites'))); - } - - public function testRequiredVariableWithNoRealSeparator() - { - $routes = $this->getRoutes('test', new Route('/get{what}Suffix')); - $generator = $this->getGenerator($routes); - - $this->assertSame('/app.php/getSitesSuffix', $generator->generate('test', array('what' => 'Sites'))); - } - - public function testDefaultRequirementOfVariable() - { - $routes = $this->getRoutes('test', new Route('/{page}.{_format}')); - $generator = $this->getGenerator($routes); - - $this->assertSame('/app.php/index.mobile.html', $generator->generate('test', array('page' => 'index', '_format' => 'mobile.html'))); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testDefaultRequirementOfVariableDisallowsSlash() - { - $routes = $this->getRoutes('test', new Route('/{page}.{_format}')); - $this->getGenerator($routes)->generate('test', array('page' => 'index', '_format' => 'sl/ash')); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testDefaultRequirementOfVariableDisallowsNextSeparator() - { - $routes = $this->getRoutes('test', new Route('/{page}.{_format}')); - $this->getGenerator($routes)->generate('test', array('page' => 'do.t', '_format' => 'html')); - } - - public function testWithHostDifferentFromContext() - { - $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com')); - - $this->assertEquals('//fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test', array('name' =>'Fabien', 'locale' => 'fr'))); - } - - public function testWithHostSameAsContext() - { - $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com')); - - $this->assertEquals('/app.php/Fabien', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', array('name' =>'Fabien', 'locale' => 'fr'))); - } - - public function testWithHostSameAsContextAndAbsolute() - { - $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com')); - - $this->assertEquals('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', array('name' =>'Fabien', 'locale' => 'fr'), true)); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testUrlWithInvalidParameterInHost() - { - $routes = $this->getRoutes('test', new Route('/', array(), array('foo' => 'bar'), array(), '{foo}.example.com')); - $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), false); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testUrlWithInvalidParameterInHostWhenParamHasADefaultValue() - { - $routes = $this->getRoutes('test', new Route('/', array('foo' => 'bar'), array('foo' => 'bar'), array(), '{foo}.example.com')); - $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), false); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException - */ - public function testUrlWithInvalidParameterEqualsDefaultValueInHost() - { - $routes = $this->getRoutes('test', new Route('/', array('foo' => 'baz'), array('foo' => 'bar'), array(), '{foo}.example.com')); - $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), false); - } - - public function testUrlWithInvalidParameterInHostInNonStrictMode() - { - $routes = $this->getRoutes('test', new Route('/', array(), array('foo' => 'bar'), array(), '{foo}.example.com')); - $generator = $this->getGenerator($routes); - $generator->setStrictRequirements(false); - $this->assertNull($generator->generate('test', array('foo' => 'baz'), false)); - } - - public function testGenerateNetworkPathBC() - { - $routes = $this->getRoutes('test', new Route('/{name}', array(), array('_scheme' => 'http'), array(), '{locale}.example.com')); - - $this->assertSame('//fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test', - array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'network path with different host' - ); - $this->assertSame('//fr.example.com/app.php/Fabien?query=string', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', - array('name' =>'Fabien', 'locale' => 'fr', 'query' => 'string'), UrlGeneratorInterface::NETWORK_PATH), 'network path although host same as context' - ); - $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test', - array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'absolute URL because scheme requirement does not match context' - ); - $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test', - array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::ABSOLUTE_URL), 'absolute URL with same scheme because it is requested' - ); - } - - public function testGenerateNetworkPath() - { - $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com', array('http'))); - - $this->assertSame('//fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test', - array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'network path with different host' - ); - $this->assertSame('//fr.example.com/app.php/Fabien?query=string', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', - array('name' =>'Fabien', 'locale' => 'fr', 'query' => 'string'), UrlGeneratorInterface::NETWORK_PATH), 'network path although host same as context' - ); - $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test', - array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'absolute URL because scheme requirement does not match context' - ); - $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test', - array('name' =>'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::ABSOLUTE_URL), 'absolute URL with same scheme because it is requested' - ); - } - - public function testGenerateRelativePath() - { - $routes = new RouteCollection(); - $routes->add('article', new Route('/{author}/{article}/')); - $routes->add('comments', new Route('/{author}/{article}/comments')); - $routes->add('host', new Route('/{article}', array(), array(), array(), '{author}.example.com')); - $routes->add('schemeBC', new Route('/{author}', array(), array('_scheme' => 'https'))); // BC - $routes->add('scheme', new Route('/{author}/blog', array(), array(), array(), '', array('https'))); - $routes->add('unrelated', new Route('/about')); - - $generator = $this->getGenerator($routes, array('host' => 'example.com', 'pathInfo' => '/fabien/symfony-is-great/')); - - $this->assertSame('comments', $generator->generate('comments', - array('author' =>'fabien', 'article' => 'symfony-is-great'), UrlGeneratorInterface::RELATIVE_PATH) - ); - $this->assertSame('comments?page=2', $generator->generate('comments', - array('author' =>'fabien', 'article' => 'symfony-is-great', 'page' => 2), UrlGeneratorInterface::RELATIVE_PATH) - ); - $this->assertSame('../twig-is-great/', $generator->generate('article', - array('author' =>'fabien', 'article' => 'twig-is-great'), UrlGeneratorInterface::RELATIVE_PATH) - ); - $this->assertSame('../../bernhard/forms-are-great/', $generator->generate('article', - array('author' =>'bernhard', 'article' => 'forms-are-great'), UrlGeneratorInterface::RELATIVE_PATH) - ); - $this->assertSame('//bernhard.example.com/app.php/forms-are-great', $generator->generate('host', - array('author' =>'bernhard', 'article' => 'forms-are-great'), UrlGeneratorInterface::RELATIVE_PATH) - ); - $this->assertSame('https://example.com/app.php/bernhard', $generator->generate('schemeBC', - array('author' =>'bernhard'), UrlGeneratorInterface::RELATIVE_PATH) - ); - $this->assertSame('https://example.com/app.php/bernhard/blog', $generator->generate('scheme', - array('author' =>'bernhard'), UrlGeneratorInterface::RELATIVE_PATH) - ); - $this->assertSame('../../about', $generator->generate('unrelated', - array(), UrlGeneratorInterface::RELATIVE_PATH) - ); - } - - /** - * @dataProvider provideRelativePaths - */ - public function testGetRelativePath($sourcePath, $targetPath, $expectedPath) - { - $this->assertSame($expectedPath, UrlGenerator::getRelativePath($sourcePath, $targetPath)); - } - - public function provideRelativePaths() - { - return array( - array( - '/same/dir/', - '/same/dir/', - '' - ), - array( - '/same/file', - '/same/file', - '' - ), - array( - '/', - '/file', - 'file' - ), - array( - '/', - '/dir/file', - 'dir/file' - ), - array( - '/dir/file.html', - '/dir/different-file.html', - 'different-file.html' - ), - array( - '/same/dir/extra-file', - '/same/dir/', - './' - ), - array( - '/parent/dir/', - '/parent/', - '../' - ), - array( - '/parent/dir/extra-file', - '/parent/', - '../' - ), - array( - '/a/b/', - '/x/y/z/', - '../../x/y/z/' - ), - array( - '/a/b/c/d/e', - '/a/c/d', - '../../../c/d' - ), - array( - '/a/b/c//', - '/a/b/c/', - '../' - ), - array( - '/a/b/c/', - '/a/b/c//', - './/' - ), - array( - '/root/a/b/c/', - '/root/x/b/c/', - '../../../x/b/c/' - ), - array( - '/a/b/c/d/', - '/a', - '../../../../a' - ), - array( - '/special-chars/sp%20ce/1€/mäh/e=mc²', - '/special-chars/sp%20ce/1€/<µ>/e=mc²', - '../<µ>/e=mc²' - ), - array( - 'not-rooted', - 'dir/file', - 'dir/file' - ), - array( - '//dir/', - '', - '../../' - ), - array( - '/dir/', - '/dir/file:with-colon', - './file:with-colon' - ), - array( - '/dir/', - '/dir/subdir/file:with-colon', - 'subdir/file:with-colon' - ), - array( - '/dir/', - '/dir/:subdir/', - './:subdir/' - ), - ); - } - - protected function getGenerator(RouteCollection $routes, array $parameters = array(), $logger = null) - { - $context = new RequestContext('/app.php'); - foreach ($parameters as $key => $value) { - $method = 'set'.$key; - $context->$method($value); - } - $generator = new UrlGenerator($routes, $context, $logger); - - return $generator; - } - - protected function getRoutes($name, Route $route) - { - $routes = new RouteCollection(); - $routes->add($name, $route); - - return $routes; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php deleted file mode 100644 index 288bf64ffa..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AbstractAnnotationLoaderTest.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -abstract class AbstractAnnotationLoaderTest extends \PHPUnit_Framework_TestCase -{ - public function getReader() - { - return $this->getMockBuilder('Doctrine\Common\Annotations\Reader') - ->disableOriginalConstructor() - ->getMock() - ; - } - - public function getClassLoader($reader) - { - return $this->getMockBuilder('Symfony\Component\Routing\Loader\AnnotationClassLoader') - ->setConstructorArgs(array($reader)) - ->getMockForAbstractClass() - ; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php deleted file mode 100644 index 3b39a666ed..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationClassLoaderTest.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Routing\Annotation\Route; - -class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest -{ - protected $loader; - - protected function setUp() - { - parent::setUp(); - - $this->reader = $this->getReader(); - $this->loader = $this->getClassLoader($this->reader); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testLoadMissingClass() - { - $this->loader->load('MissingClass'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testLoadAbstractClass() - { - $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\AbstractClass'); - } - - /** - * @dataProvider provideTestSupportsChecksResource - */ - public function testSupportsChecksResource($resource, $expectedSupports) - { - $this->assertSame($expectedSupports, $this->loader->supports($resource), '->supports() returns true if the resource is loadable'); - } - - public function provideTestSupportsChecksResource() - { - return array( - array('class', true), - array('\fully\qualified\class\name', true), - array('namespaced\class\without\leading\slash', true), - array('ÿClassWithLegalSpecialCharacters', true), - array('5', false), - array('foo.foo', false), - array(null, false), - ); - } - - public function testSupportsChecksTypeIfSpecified() - { - $this->assertTrue($this->loader->supports('class', 'annotation'), '->supports() checks the resource type if specified'); - $this->assertFalse($this->loader->supports('class', 'foo'), '->supports() checks the resource type if specified'); - } - - public function getLoadTests() - { - return array( - array( - 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass', - array('name' => 'route1'), - array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3') - ), - array( - 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass', - array('name' => 'route1', 'defaults' => array('arg2' => 'foo')), - array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3') - ), - array( - 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass', - array('name' => 'route1', 'defaults' => array('arg2' => 'foobar')), - array('arg2' => 'defaultValue2', 'arg3' =>'defaultValue3') - ), - array( - 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass', - array('name' => 'route1', 'defaults' => array('arg2' => 'foo'), 'condition' => 'context.getMethod() == "GET"'), - array('arg2' => 'defaultValue2', 'arg3' =>'defaultValue3') - ), - ); - } - - /** - * @dataProvider getLoadTests - */ - public function testLoad($className, $routeDatas = array(), $methodArgs = array()) - { - $routeDatas = array_replace(array( - 'name' => 'route', - 'path' => '/', - 'requirements' => array(), - 'options' => array(), - 'defaults' => array(), - 'schemes' => array(), - 'methods' => array(), - 'condition' => null, - ), $routeDatas); - - $this->reader - ->expects($this->once()) - ->method('getMethodAnnotations') - ->will($this->returnValue(array($this->getAnnotatedRoute($routeDatas)))) - ; - $routeCollection = $this->loader->load($className); - $route = $routeCollection->get($routeDatas['name']); - - $this->assertSame($routeDatas['path'], $route->getPath(), '->load preserves path annotation'); - $this->assertSame($routeDatas['requirements'],$route->getRequirements(), '->load preserves requirements annotation'); - $this->assertCount(0, array_intersect($route->getOptions(), $routeDatas['options']), '->load preserves options annotation'); - $this->assertSame(array_replace($methodArgs, $routeDatas['defaults']), $route->getDefaults(), '->load preserves defaults annotation'); - $this->assertEquals($routeDatas['condition'], $route->getCondition(), '->load preserves condition annotation'); - } - - public function testClassRouteLoad() - { - $classRouteDatas = array('path' => '/classRoutePrefix'); - - $routeDatas = array( - 'name' => 'route1', - 'path' => '/', - ); - - $this->reader - ->expects($this->once()) - ->method('getClassAnnotation') - ->will($this->returnValue($this->getAnnotatedRoute($classRouteDatas))) - ; - - $this->reader - ->expects($this->once()) - ->method('getMethodAnnotations') - ->will($this->returnValue(array($this->getAnnotatedRoute($routeDatas)))) - ; - $routeCollection = $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass'); - $route = $routeCollection->get($routeDatas['name']); - - $this->assertSame($classRouteDatas['path'].$routeDatas['path'], $route->getPath(), '->load preserves class route path annotation'); - } - - private function getAnnotatedRoute($datas) - { - return new Route($datas); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php deleted file mode 100644 index 29126ba4f2..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationDirectoryLoaderTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader; -use Symfony\Component\Config\FileLocator; - -class AnnotationDirectoryLoaderTest extends AbstractAnnotationLoaderTest -{ - protected $loader; - protected $reader; - - protected function setUp() - { - parent::setUp(); - - $this->reader = $this->getReader(); - $this->loader = new AnnotationDirectoryLoader(new FileLocator(), $this->getClassLoader($this->reader)); - } - - public function testLoad() - { - $this->reader->expects($this->exactly(2))->method('getClassAnnotation'); - - $this->reader - ->expects($this->any()) - ->method('getMethodAnnotations') - ->will($this->returnValue(array())) - ; - - $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses'); - } - - public function testSupports() - { - $fixturesDir = __DIR__.'/../Fixtures'; - - $this->assertTrue($this->loader->supports($fixturesDir), '->supports() returns true if the resource is loadable'); - $this->assertFalse($this->loader->supports('foo.foo'), '->supports() returns true if the resource is loadable'); - - $this->assertTrue($this->loader->supports($fixturesDir, 'annotation'), '->supports() checks the resource type if specified'); - $this->assertFalse($this->loader->supports($fixturesDir, 'foo'), '->supports() checks the resource type if specified'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php deleted file mode 100644 index f0a8a0e329..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/AnnotationFileLoaderTest.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Routing\Loader\AnnotationFileLoader; -use Symfony\Component\Config\FileLocator; - -class AnnotationFileLoaderTest extends AbstractAnnotationLoaderTest -{ - protected $loader; - protected $reader; - - protected function setUp() - { - parent::setUp(); - - $this->reader = $this->getReader(); - $this->loader = new AnnotationFileLoader(new FileLocator(), $this->getClassLoader($this->reader)); - } - - public function testLoad() - { - $this->reader->expects($this->once())->method('getClassAnnotation'); - - $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses/FooClass.php'); - } - - public function testSupports() - { - $fixture = __DIR__.'/../Fixtures/annotated.php'; - - $this->assertTrue($this->loader->supports($fixture), '->supports() returns true if the resource is loadable'); - $this->assertFalse($this->loader->supports('foo.foo'), '->supports() returns true if the resource is loadable'); - - $this->assertTrue($this->loader->supports($fixture, 'annotation'), '->supports() checks the resource type if specified'); - $this->assertFalse($this->loader->supports($fixture, 'foo'), '->supports() checks the resource type if specified'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php deleted file mode 100644 index d34fa87ec5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/ClosureLoaderTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Routing\Loader\ClosureLoader; -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; - -class ClosureLoaderTest extends \PHPUnit_Framework_TestCase -{ - public function testSupports() - { - $loader = new ClosureLoader(); - - $closure = function () {}; - - $this->assertTrue($loader->supports($closure), '->supports() returns true if the resource is loadable'); - $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable'); - - $this->assertTrue($loader->supports($closure, 'closure'), '->supports() checks the resource type if specified'); - $this->assertFalse($loader->supports($closure, 'foo'), '->supports() checks the resource type if specified'); - } - - public function testLoad() - { - $loader = new ClosureLoader(); - - $route = new Route('/'); - $routes = $loader->load(function () use ($route) { - $routes = new RouteCollection(); - - $routes->add('foo', $route); - - return $routes; - }); - - $this->assertEquals($route, $routes->get('foo'), '->load() loads a \Closure resource'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php deleted file mode 100644 index bf76d3465b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Config\FileLocator; -use Symfony\Component\Routing\Loader\PhpFileLoader; - -class PhpFileLoaderTest extends \PHPUnit_Framework_TestCase -{ - public function testSupports() - { - $loader = new PhpFileLoader($this->getMock('Symfony\Component\Config\FileLocator')); - - $this->assertTrue($loader->supports('foo.php'), '->supports() returns true if the resource is loadable'); - $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable'); - - $this->assertTrue($loader->supports('foo.php', 'php'), '->supports() checks the resource type if specified'); - $this->assertFalse($loader->supports('foo.php', 'foo'), '->supports() checks the resource type if specified'); - } - - public function testLoadWithRoute() - { - $loader = new PhpFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $routeCollection = $loader->load('validpattern.php'); - $routes = $routeCollection->all(); - - $this->assertCount(2, $routes, 'Two routes are loaded'); - $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); - - foreach ($routes as $route) { - $this->assertSame('/blog/{slug}', $route->getPath()); - $this->assertSame('MyBlogBundle:Blog:show', $route->getDefault('_controller')); - $this->assertSame('{locale}.example.com', $route->getHost()); - $this->assertSame('RouteCompiler', $route->getOption('compiler_class')); - $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods()); - $this->assertEquals(array('https'), $route->getSchemes()); - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php deleted file mode 100644 index f83b9ecba8..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php +++ /dev/null @@ -1,124 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Config\FileLocator; -use Symfony\Component\Routing\Loader\XmlFileLoader; -use Symfony\Component\Routing\Tests\Fixtures\CustomXmlFileLoader; - -class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase -{ - public function testSupports() - { - $loader = new XmlFileLoader($this->getMock('Symfony\Component\Config\FileLocator')); - - $this->assertTrue($loader->supports('foo.xml'), '->supports() returns true if the resource is loadable'); - $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable'); - - $this->assertTrue($loader->supports('foo.xml', 'xml'), '->supports() checks the resource type if specified'); - $this->assertFalse($loader->supports('foo.xml', 'foo'), '->supports() checks the resource type if specified'); - } - - public function testLoadWithRoute() - { - $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $routeCollection = $loader->load('validpattern.xml'); - $routes = $routeCollection->all(); - - $this->assertCount(3, $routes, 'Three routes are loaded'); - $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); - - $identicalRoutes = array_slice($routes, 0, 2); - - foreach ($identicalRoutes as $route) { - $this->assertSame('/blog/{slug}', $route->getPath()); - $this->assertSame('{locale}.example.com', $route->getHost()); - $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller')); - $this->assertSame('\w+', $route->getRequirement('locale')); - $this->assertSame('RouteCompiler', $route->getOption('compiler_class')); - $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods()); - $this->assertEquals(array('https'), $route->getSchemes()); - $this->assertEquals('context.getMethod() == "GET"', $route->getCondition()); - } - } - - public function testLoadWithNamespacePrefix() - { - $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $routeCollection = $loader->load('namespaceprefix.xml'); - - $this->assertCount(1, $routeCollection->all(), 'One route is loaded'); - - $route = $routeCollection->get('blog_show'); - $this->assertSame('/blog/{slug}', $route->getPath()); - $this->assertSame('{_locale}.example.com', $route->getHost()); - $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller')); - $this->assertSame('\w+', $route->getRequirement('slug')); - $this->assertSame('en|fr|de', $route->getRequirement('_locale')); - $this->assertSame(null, $route->getDefault('slug')); - $this->assertSame('RouteCompiler', $route->getOption('compiler_class')); - } - - public function testLoadWithImport() - { - $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $routeCollection = $loader->load('validresource.xml'); - $routes = $routeCollection->all(); - - $this->assertCount(3, $routes, 'Three routes are loaded'); - $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); - - foreach ($routes as $route) { - $this->assertSame('/{foo}/blog/{slug}', $route->getPath()); - $this->assertSame('123', $route->getDefault('foo')); - $this->assertSame('\d+', $route->getRequirement('foo')); - $this->assertSame('bar', $route->getOption('foo')); - $this->assertSame('', $route->getHost()); - $this->assertSame('context.getMethod() == "POST"', $route->getCondition()); - } - } - - /** - * @expectedException \InvalidArgumentException - * @dataProvider getPathsToInvalidFiles - */ - public function testLoadThrowsExceptionWithInvalidFile($filePath) - { - $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $loader->load($filePath); - } - - /** - * @expectedException \InvalidArgumentException - * @dataProvider getPathsToInvalidFiles - */ - public function testLoadThrowsExceptionWithInvalidFileEvenWithoutSchemaValidation($filePath) - { - $loader = new CustomXmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $loader->load($filePath); - } - - public function getPathsToInvalidFiles() - { - return array(array('nonvalidnode.xml'), array('nonvalidroute.xml'), array('nonvalid.xml'), array('missing_id.xml'), array('missing_path.xml')); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Document types are not allowed. - */ - public function testDocTypeIsNotAllowed() - { - $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $loader->load('withdoctype.xml'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php deleted file mode 100644 index e7a86a93da..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Loader; - -use Symfony\Component\Config\FileLocator; -use Symfony\Component\Routing\Loader\YamlFileLoader; -use Symfony\Component\Config\Resource\FileResource; - -class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase -{ - public function testSupports() - { - $loader = new YamlFileLoader($this->getMock('Symfony\Component\Config\FileLocator')); - - $this->assertTrue($loader->supports('foo.yml'), '->supports() returns true if the resource is loadable'); - $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable'); - - $this->assertTrue($loader->supports('foo.yml', 'yaml'), '->supports() checks the resource type if specified'); - $this->assertFalse($loader->supports('foo.yml', 'foo'), '->supports() checks the resource type if specified'); - } - - public function testLoadDoesNothingIfEmpty() - { - $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $collection = $loader->load('empty.yml'); - - $this->assertEquals(array(), $collection->all()); - $this->assertEquals(array(new FileResource(realpath(__DIR__.'/../Fixtures/empty.yml'))), $collection->getResources()); - } - - /** - * @expectedException \InvalidArgumentException - * @dataProvider getPathsToInvalidFiles - */ - public function testLoadThrowsExceptionWithInvalidFile($filePath) - { - $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $loader->load($filePath); - } - - public function getPathsToInvalidFiles() - { - return array(array('nonvalid.yml'), array('nonvalid2.yml'), array('incomplete.yml'), array('nonvalidkeys.yml'), array('nonesense_resource_plus_path.yml'), array('nonesense_type_without_resource.yml')); - } - - public function testLoadSpecialRouteName() - { - $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $routeCollection = $loader->load('special_route_name.yml'); - $route = $routeCollection->get('#$péß^a|'); - - $this->assertInstanceOf('Symfony\Component\Routing\Route', $route); - $this->assertSame('/true', $route->getPath()); - } - - public function testLoadWithRoute() - { - $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $routeCollection = $loader->load('validpattern.yml'); - $routes = $routeCollection->all(); - - $this->assertCount(3, $routes, 'Three routes are loaded'); - $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); - - $identicalRoutes = array_slice($routes, 0, 2); - - foreach ($identicalRoutes as $route) { - $this->assertSame('/blog/{slug}', $route->getPath()); - $this->assertSame('{locale}.example.com', $route->getHost()); - $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller')); - $this->assertSame('\w+', $route->getRequirement('locale')); - $this->assertSame('RouteCompiler', $route->getOption('compiler_class')); - $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods()); - $this->assertEquals(array('https'), $route->getSchemes()); - $this->assertEquals('context.getMethod() == "GET"', $route->getCondition()); - } - } - - public function testLoadWithResource() - { - $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures'))); - $routeCollection = $loader->load('validresource.yml'); - $routes = $routeCollection->all(); - - $this->assertCount(3, $routes, 'Three routes are loaded'); - $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes); - - foreach ($routes as $route) { - $this->assertSame('/{foo}/blog/{slug}', $route->getPath()); - $this->assertSame('123', $route->getDefault('foo')); - $this->assertSame('\d+', $route->getRequirement('foo')); - $this->assertSame('bar', $route->getOption('foo')); - $this->assertSame('', $route->getHost()); - $this->assertSame('context.getMethod() == "POST"', $route->getCondition()); - } - } - -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php deleted file mode 100644 index 2810cbad51..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/ApacheUrlMatcherTest.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\RequestContext; -use Symfony\Component\Routing\Matcher\ApacheUrlMatcher; - -class ApacheUrlMatcherTest extends \PHPUnit_Framework_TestCase -{ - protected $server; - - protected function setUp() - { - $this->server = $_SERVER; - } - - protected function tearDown() - { - $_SERVER = $this->server; - } - - /** - * @dataProvider getMatchData - */ - public function testMatch($name, $pathinfo, $server, $expect) - { - $collection = new RouteCollection(); - $context = new RequestContext(); - $matcher = new ApacheUrlMatcher($collection, $context); - - $_SERVER = $server; - - $result = $matcher->match($pathinfo, $server); - $this->assertSame(var_export($expect, true), var_export($result, true)); - } - - public function getMatchData() - { - return array( - array( - 'Simple route', - '/hello/world', - array( - '_ROUTING_route' => 'hello', - '_ROUTING_param__controller' => 'AcmeBundle:Default:index', - '_ROUTING_param_name' => 'world', - ), - array( - '_controller' => 'AcmeBundle:Default:index', - 'name' => 'world', - '_route' => 'hello', - ), - ), - array( - 'Route with params and defaults', - '/hello/hugo', - array( - '_ROUTING_route' => 'hello', - '_ROUTING_param__controller' => 'AcmeBundle:Default:index', - '_ROUTING_param_name' => 'hugo', - '_ROUTING_default_name' => 'world', - ), - array( - 'name' => 'hugo', - '_controller' => 'AcmeBundle:Default:index', - '_route' => 'hello', - ), - ), - array( - 'Route with defaults only', - '/hello', - array( - '_ROUTING_route' => 'hello', - '_ROUTING_param__controller' => 'AcmeBundle:Default:index', - '_ROUTING_default_name' => 'world', - ), - array( - 'name' => 'world', - '_controller' => 'AcmeBundle:Default:index', - '_route' => 'hello', - ), - ), - array( - 'Redirect with many ignored attributes', - '/legacy/{cat1}/{cat2}/{id}.html', - array( - '_ROUTING_route' => 'product_view', - '_ROUTING_param__controller' => 'FrameworkBundle:Redirect:redirect', - '_ROUTING_default_ignoreAttributes[0]' => 'attr_a', - '_ROUTING_default_ignoreAttributes[1]' => 'attr_b', - ), - array( - 'ignoreAttributes' => array('attr_a', 'attr_b'), - '_controller' => 'FrameworkBundle:Redirect:redirect', - '_route' => 'product_view', - ) - ), - array( - 'REDIRECT_ envs', - '/hello/world', - array( - 'REDIRECT__ROUTING_route' => 'hello', - 'REDIRECT__ROUTING_param__controller' => 'AcmeBundle:Default:index', - 'REDIRECT__ROUTING_param_name' => 'world', - ), - array( - '_controller' => 'AcmeBundle:Default:index', - 'name' => 'world', - '_route' => 'hello', - ), - ), - array( - 'REDIRECT_REDIRECT_ envs', - '/hello/world', - array( - 'REDIRECT_REDIRECT__ROUTING_route' => 'hello', - 'REDIRECT_REDIRECT__ROUTING_param__controller' => 'AcmeBundle:Default:index', - 'REDIRECT_REDIRECT__ROUTING_param_name' => 'world', - ), - array( - '_controller' => 'AcmeBundle:Default:index', - 'name' => 'world', - '_route' => 'hello', - ), - ), - array( - 'REDIRECT_REDIRECT_ envs', - '/hello/world', - array( - 'REDIRECT_REDIRECT__ROUTING_route' => 'hello', - 'REDIRECT_REDIRECT__ROUTING_param__controller' => 'AcmeBundle:Default:index', - 'REDIRECT_REDIRECT__ROUTING_param_name' => 'world', - ), - array( - '_controller' => 'AcmeBundle:Default:index', - 'name' => 'world', - '_route' => 'hello', - ), - ) - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php deleted file mode 100644 index 72bee71002..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/ApacheMatcherDumperTest.php +++ /dev/null @@ -1,196 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher\Dumper; - -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\Matcher\Dumper\ApacheMatcherDumper; - -class ApacheMatcherDumperTest extends \PHPUnit_Framework_TestCase -{ - protected static $fixturesPath; - - public static function setUpBeforeClass() - { - self::$fixturesPath = realpath(__DIR__.'/../../Fixtures/'); - } - - public function testDump() - { - $dumper = new ApacheMatcherDumper($this->getRouteCollection()); - - $this->assertStringEqualsFile(self::$fixturesPath.'/dumper/url_matcher1.apache', $dumper->dump(), '->dump() dumps basic routes to the correct apache format.'); - } - - /** - * @dataProvider provideEscapeFixtures - */ - public function testEscapePattern($src, $dest, $char, $with, $message) - { - $r = new \ReflectionMethod(new ApacheMatcherDumper($this->getRouteCollection()), 'escape'); - $r->setAccessible(true); - $this->assertEquals($dest, $r->invoke(null, $src, $char, $with), $message); - } - - public function provideEscapeFixtures() - { - return array( - array('foo', 'foo', ' ', '-', 'Preserve string that should not be escaped'), - array('fo-o', 'fo-o', ' ', '-', 'Preserve string that should not be escaped'), - array('fo o', 'fo- o', ' ', '-', 'Escape special characters'), - array('fo-- o', 'fo--- o', ' ', '-', 'Escape special characters'), - array('fo- o', 'fo- o', ' ', '-', 'Do not escape already escaped string'), - ); - } - - public function testEscapeScriptName() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo')); - $dumper = new ApacheMatcherDumper($collection); - $this->assertStringEqualsFile(self::$fixturesPath.'/dumper/url_matcher2.apache', $dumper->dump(array('script_name' => 'ap p_d\ ev.php'))); - } - - private function getRouteCollection() - { - $collection = new RouteCollection(); - - // defaults and requirements - $collection->add('foo', new Route( - '/foo/{bar}', - array('def' => 'test'), - array('bar' => 'baz|symfony') - )); - // defaults parameters in pattern - $collection->add('foobar', new Route( - '/foo/{bar}', - array('bar' => 'toto') - )); - // method requirement - $collection->add('bar', new Route( - '/bar/{foo}', - array(), - array('_method' => 'GET|head') - )); - // method requirement (again) - $collection->add('baragain', new Route( - '/baragain/{foo}', - array(), - array('_method' => 'get|post') - )); - // simple - $collection->add('baz', new Route( - '/test/baz' - )); - // simple with extension - $collection->add('baz2', new Route( - '/test/baz.html' - )); - // trailing slash - $collection->add('baz3', new Route( - '/test/baz3/' - )); - // trailing slash with variable - $collection->add('baz4', new Route( - '/test/{foo}/' - )); - // trailing slash and safe method - $collection->add('baz5', new Route( - '/test/{foo}/', - array(), - array('_method' => 'get') - )); - // trailing slash and unsafe method - $collection->add('baz5unsafe', new Route( - '/testunsafe/{foo}/', - array(), - array('_method' => 'post') - )); - // complex - $collection->add('baz6', new Route( - '/test/baz', - array('foo' => 'bar baz') - )); - // space in path - $collection->add('baz7', new Route( - '/te st/baz' - )); - // space preceded with \ in path - $collection->add('baz8', new Route( - '/te\\ st/baz' - )); - // space preceded with \ in requirement - $collection->add('baz9', new Route( - '/test/{baz}', - array(), - array( - 'baz' => 'te\\\\ st', - ) - )); - - $collection1 = new RouteCollection(); - - $route1 = new Route('/route1', array(), array(), array(), 'a.example.com'); - $collection1->add('route1', $route1); - - $collection2 = new RouteCollection(); - - $route2 = new Route('/route2', array(), array(), array(), 'a.example.com'); - $collection2->add('route2', $route2); - - $route3 = new Route('/route3', array(), array(), array(), 'b.example.com'); - $collection2->add('route3', $route3); - - $collection2->addPrefix('/c2'); - $collection1->addCollection($collection2); - - $route4 = new Route('/route4', array(), array(), array(), 'a.example.com'); - $collection1->add('route4', $route4); - - $route5 = new Route('/route5', array(), array(), array(), 'c.example.com'); - $collection1->add('route5', $route5); - - $route6 = new Route('/route6', array(), array(), array(), null); - $collection1->add('route6', $route6); - - $collection->addCollection($collection1); - - // host and variables - - $collection1 = new RouteCollection(); - - $route11 = new Route('/route11', array(), array(), array(), '{var1}.example.com'); - $collection1->add('route11', $route11); - - $route12 = new Route('/route12', array('var1' => 'val'), array(), array(), '{var1}.example.com'); - $collection1->add('route12', $route12); - - $route13 = new Route('/route13/{name}', array(), array(), array(), '{var1}.example.com'); - $collection1->add('route13', $route13); - - $route14 = new Route('/route14/{name}', array('var1' => 'val'), array(), array(), '{var1}.example.com'); - $collection1->add('route14', $route14); - - $route15 = new Route('/route15/{name}', array(), array(), array(), 'c.example.com'); - $collection1->add('route15', $route15); - - $route16 = new Route('/route16/{name}', array('var1' => 'val'), array(), array(), null); - $collection1->add('route16', $route16); - - $route17 = new Route('/route17', array(), array(), array(), null); - $collection1->add('route17', $route17); - - $collection->addCollection($collection1); - - return $collection; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php deleted file mode 100644 index 7b6001c1f6..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperCollectionTest.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher\Dumper; - -use Symfony\Component\Routing\Matcher\Dumper\DumperCollection; - -class DumperCollectionTest extends \PHPUnit_Framework_TestCase -{ - public function testGetRoot() - { - $a = new DumperCollection(); - - $b = new DumperCollection(); - $a->add($b); - - $c = new DumperCollection(); - $b->add($c); - - $d = new DumperCollection(); - $c->add($d); - - $this->assertSame($a, $c->getRoot()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php deleted file mode 100644 index de01a75d0b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/DumperPrefixCollectionTest.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher\Dumper; - -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\Matcher\Dumper\DumperPrefixCollection; -use Symfony\Component\Routing\Matcher\Dumper\DumperRoute; -use Symfony\Component\Routing\Matcher\Dumper\DumperCollection; - -class DumperPrefixCollectionTest extends \PHPUnit_Framework_TestCase -{ - public function testAddPrefixRoute() - { - $coll = new DumperPrefixCollection(); - $coll->setPrefix(''); - - $route = new DumperRoute('bar', new Route('/foo/bar')); - $coll = $coll->addPrefixRoute($route); - - $route = new DumperRoute('bar2', new Route('/foo/bar')); - $coll = $coll->addPrefixRoute($route); - - $route = new DumperRoute('qux', new Route('/foo/qux')); - $coll = $coll->addPrefixRoute($route); - - $route = new DumperRoute('bar3', new Route('/foo/bar')); - $coll = $coll->addPrefixRoute($route); - - $route = new DumperRoute('bar4', new Route('')); - $result = $coll->addPrefixRoute($route); - - $expect = <<<'EOF' - |-coll / - | |-coll /f - | | |-coll /fo - | | | |-coll /foo - | | | | |-coll /foo/ - | | | | | |-coll /foo/b - | | | | | | |-coll /foo/ba - | | | | | | | |-coll /foo/bar - | | | | | | | | |-route bar /foo/bar - | | | | | | | | |-route bar2 /foo/bar - | | | | | |-coll /foo/q - | | | | | | |-coll /foo/qu - | | | | | | | |-coll /foo/qux - | | | | | | | | |-route qux /foo/qux - | | | | | |-coll /foo/b - | | | | | | |-coll /foo/ba - | | | | | | | |-coll /foo/bar - | | | | | | | | |-route bar3 /foo/bar - | |-route bar4 / - -EOF; - - $this->assertSame($expect, $this->collectionToString($result->getRoot(), ' ')); - } - - public function testMergeSlashNodes() - { - $coll = new DumperPrefixCollection(); - $coll->setPrefix(''); - - $route = new DumperRoute('bar', new Route('/foo/bar')); - $coll = $coll->addPrefixRoute($route); - - $route = new DumperRoute('bar2', new Route('/foo/bar')); - $coll = $coll->addPrefixRoute($route); - - $route = new DumperRoute('qux', new Route('/foo/qux')); - $coll = $coll->addPrefixRoute($route); - - $route = new DumperRoute('bar3', new Route('/foo/bar')); - $result = $coll->addPrefixRoute($route); - - $result->getRoot()->mergeSlashNodes(); - - $expect = <<<'EOF' - |-coll /f - | |-coll /fo - | | |-coll /foo - | | | |-coll /foo/b - | | | | |-coll /foo/ba - | | | | | |-coll /foo/bar - | | | | | | |-route bar /foo/bar - | | | | | | |-route bar2 /foo/bar - | | | |-coll /foo/q - | | | | |-coll /foo/qu - | | | | | |-coll /foo/qux - | | | | | | |-route qux /foo/qux - | | | |-coll /foo/b - | | | | |-coll /foo/ba - | | | | | |-coll /foo/bar - | | | | | | |-route bar3 /foo/bar - -EOF; - - $this->assertSame($expect, $this->collectionToString($result->getRoot(), ' ')); - } - - private function collectionToString(DumperCollection $collection, $prefix) - { - $string = ''; - foreach ($collection as $route) { - if ($route instanceof DumperCollection) { - $string .= sprintf("%s|-coll %s\n", $prefix, $route->getPrefix()); - $string .= $this->collectionToString($route, $prefix.'| '); - } else { - $string .= sprintf("%s|-route %s %s\n", $prefix, $route->getName(), $route->getRoute()->getPath()); - } - } - - return $string; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php deleted file mode 100644 index 473af6aa5c..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php +++ /dev/null @@ -1,264 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher\Dumper; - -use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper; -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; - -class PhpMatcherDumperTest extends \PHPUnit_Framework_TestCase -{ - /** - * @expectedException \LogicException - */ - public function testDumpWhenSchemeIsUsedWithoutAProperDumper() - { - $collection = new RouteCollection(); - $collection->add('secure', new Route( - '/secure', - array(), - array('_scheme' => 'https') - )); - $dumper = new PhpMatcherDumper($collection); - $dumper->dump(); - } - - /** - * @dataProvider getRouteCollections - */ - public function testDump(RouteCollection $collection, $fixture, $options = array()) - { - $basePath = __DIR__.'/../../Fixtures/dumper/'; - - $dumper = new PhpMatcherDumper($collection); - $this->assertStringEqualsFile($basePath.$fixture, $dumper->dump($options), '->dump() correctly dumps routes as optimized PHP code.'); - } - - public function getRouteCollections() - { - /* test case 1 */ - - $collection = new RouteCollection(); - - $collection->add('overridden', new Route('/overridden')); - - // defaults and requirements - $collection->add('foo', new Route( - '/foo/{bar}', - array('def' => 'test'), - array('bar' => 'baz|symfony') - )); - // method requirement - $collection->add('bar', new Route( - '/bar/{foo}', - array(), - array('_method' => 'GET|head') - )); - // GET method requirement automatically adds HEAD as valid - $collection->add('barhead', new Route( - '/barhead/{foo}', - array(), - array('_method' => 'GET') - )); - // simple - $collection->add('baz', new Route( - '/test/baz' - )); - // simple with extension - $collection->add('baz2', new Route( - '/test/baz.html' - )); - // trailing slash - $collection->add('baz3', new Route( - '/test/baz3/' - )); - // trailing slash with variable - $collection->add('baz4', new Route( - '/test/{foo}/' - )); - // trailing slash and method - $collection->add('baz5', new Route( - '/test/{foo}/', - array(), - array('_method' => 'post') - )); - // complex name - $collection->add('baz.baz6', new Route( - '/test/{foo}/', - array(), - array('_method' => 'put') - )); - // defaults without variable - $collection->add('foofoo', new Route( - '/foofoo', - array('def' => 'test') - )); - // pattern with quotes - $collection->add('quoter', new Route( - '/{quoter}', - array(), - array('quoter' => '[\']+') - )); - // space in pattern - $collection->add('space', new Route( - '/spa ce' - )); - - // prefixes - $collection1 = new RouteCollection(); - $collection1->add('overridden', new Route('/overridden1')); - $collection1->add('foo1', new Route('/{foo}')); - $collection1->add('bar1', new Route('/{bar}')); - $collection1->addPrefix('/b\'b'); - $collection2 = new RouteCollection(); - $collection2->addCollection($collection1); - $collection2->add('overridden', new Route('/{var}', array(), array('var' => '.*'))); - $collection1 = new RouteCollection(); - $collection1->add('foo2', new Route('/{foo1}')); - $collection1->add('bar2', new Route('/{bar1}')); - $collection1->addPrefix('/b\'b'); - $collection2->addCollection($collection1); - $collection2->addPrefix('/a'); - $collection->addCollection($collection2); - - // overridden through addCollection() and multiple sub-collections with no own prefix - $collection1 = new RouteCollection(); - $collection1->add('overridden2', new Route('/old')); - $collection1->add('helloWorld', new Route('/hello/{who}', array('who' => 'World!'))); - $collection2 = new RouteCollection(); - $collection3 = new RouteCollection(); - $collection3->add('overridden2', new Route('/new')); - $collection3->add('hey', new Route('/hey/')); - $collection2->addCollection($collection3); - $collection1->addCollection($collection2); - $collection1->addPrefix('/multi'); - $collection->addCollection($collection1); - - // "dynamic" prefix - $collection1 = new RouteCollection(); - $collection1->add('foo3', new Route('/{foo}')); - $collection1->add('bar3', new Route('/{bar}')); - $collection1->addPrefix('/b'); - $collection1->addPrefix('{_locale}'); - $collection->addCollection($collection1); - - // route between collections - $collection->add('ababa', new Route('/ababa')); - - // collection with static prefix but only one route - $collection1 = new RouteCollection(); - $collection1->add('foo4', new Route('/{foo}')); - $collection1->addPrefix('/aba'); - $collection->addCollection($collection1); - - // prefix and host - - $collection1 = new RouteCollection(); - - $route1 = new Route('/route1', array(), array(), array(), 'a.example.com'); - $collection1->add('route1', $route1); - - $collection2 = new RouteCollection(); - - $route2 = new Route('/c2/route2', array(), array(), array(), 'a.example.com'); - $collection1->add('route2', $route2); - - $route3 = new Route('/c2/route3', array(), array(), array(), 'b.example.com'); - $collection1->add('route3', $route3); - - $route4 = new Route('/route4', array(), array(), array(), 'a.example.com'); - $collection1->add('route4', $route4); - - $route5 = new Route('/route5', array(), array(), array(), 'c.example.com'); - $collection1->add('route5', $route5); - - $route6 = new Route('/route6', array(), array(), array(), null); - $collection1->add('route6', $route6); - - $collection->addCollection($collection1); - - // host and variables - - $collection1 = new RouteCollection(); - - $route11 = new Route('/route11', array(), array(), array(), '{var1}.example.com'); - $collection1->add('route11', $route11); - - $route12 = new Route('/route12', array('var1' => 'val'), array(), array(), '{var1}.example.com'); - $collection1->add('route12', $route12); - - $route13 = new Route('/route13/{name}', array(), array(), array(), '{var1}.example.com'); - $collection1->add('route13', $route13); - - $route14 = new Route('/route14/{name}', array('var1' => 'val'), array(), array(), '{var1}.example.com'); - $collection1->add('route14', $route14); - - $route15 = new Route('/route15/{name}', array(), array(), array(), 'c.example.com'); - $collection1->add('route15', $route15); - - $route16 = new Route('/route16/{name}', array('var1' => 'val'), array(), array(), null); - $collection1->add('route16', $route16); - - $route17 = new Route('/route17', array(), array(), array(), null); - $collection1->add('route17', $route17); - - $collection->addCollection($collection1); - - // multiple sub-collections with a single route and a prefix each - $collection1 = new RouteCollection(); - $collection1->add('a', new Route('/a...')); - $collection2 = new RouteCollection(); - $collection2->add('b', new Route('/{var}')); - $collection3 = new RouteCollection(); - $collection3->add('c', new Route('/{var}')); - $collection3->addPrefix('/c'); - $collection2->addCollection($collection3); - $collection2->addPrefix('/b'); - $collection1->addCollection($collection2); - $collection1->addPrefix('/a'); - $collection->addCollection($collection1); - - /* test case 2 */ - - $redirectCollection = clone $collection; - - // force HTTPS redirection - $redirectCollection->add('secure', new Route( - '/secure', - array(), - array('_scheme' => 'https') - )); - - // force HTTP redirection - $redirectCollection->add('nonsecure', new Route( - '/nonsecure', - array(), - array('_scheme' => 'http') - )); - - /* test case 3 */ - - $rootprefixCollection = new RouteCollection(); - $rootprefixCollection->add('static', new Route('/test')); - $rootprefixCollection->add('dynamic', new Route('/{var}')); - $rootprefixCollection->addPrefix('rootprefix'); - $route = new Route('/with-condition'); - $route->setCondition('context.getMethod() == "GET"'); - $rootprefixCollection->add('with-condition', $route); - - return array( - array($collection, 'url_matcher1.php', array()), - array($redirectCollection, 'url_matcher2.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')), - array($rootprefixCollection, 'url_matcher3.php', array()) - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php deleted file mode 100644 index 5cbb605479..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/RedirectableUrlMatcherTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher; - -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\RequestContext; - -class RedirectableUrlMatcherTest extends \PHPUnit_Framework_TestCase -{ - public function testRedirectWhenNoSlash() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo/')); - - $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext())); - $matcher->expects($this->once())->method('redirect'); - $matcher->match('/foo'); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException - */ - public function testRedirectWhenNoSlashForNonSafeMethod() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo/')); - - $context = new RequestContext(); - $context->setMethod('POST'); - $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, $context)); - $matcher->match('/foo'); - } - - public function testSchemeRedirectBC() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array('_scheme' => 'https'))); - - $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext())); - $matcher - ->expects($this->once()) - ->method('redirect') - ->with('/foo', 'foo', 'https') - ->will($this->returnValue(array('_route' => 'foo'))) - ; - $matcher->match('/foo'); - } - - public function testSchemeRedirectRedirectsToFirstScheme() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('FTP', 'HTTPS'))); - - $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext())); - $matcher - ->expects($this->once()) - ->method('redirect') - ->with('/foo', 'foo', 'ftp') - ->will($this->returnValue(array('_route' => 'foo'))) - ; - $matcher->match('/foo'); - } - - public function testNoSchemaRedirectIfOnOfMultipleSchemesMatches() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('https', 'http'))); - - $matcher = $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($coll, new RequestContext())); - $matcher - ->expects($this->never()) - ->method('redirect') - ; - $matcher->match('/foo'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php deleted file mode 100644 index 969ab0a2f0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/TraceableUrlMatcherTest.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher; - -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\RequestContext; -use Symfony\Component\Routing\Matcher\TraceableUrlMatcher; - -class TraceableUrlMatcherTest extends \PHPUnit_Framework_TestCase -{ - public function test() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array('_method' => 'POST'))); - $coll->add('bar', new Route('/bar/{id}', array(), array('id' => '\d+'))); - $coll->add('bar1', new Route('/bar/{name}', array(), array('id' => '\w+', '_method' => 'POST'))); - $coll->add('bar2', new Route('/foo', array(), array(), array(), 'baz')); - $coll->add('bar3', new Route('/foo1', array(), array(), array(), 'baz')); - $coll->add('bar4', new Route('/foo2', array(), array(), array(), 'baz', array(), array(), 'context.getMethod() == "GET"')); - - $context = new RequestContext(); - $context->setHost('baz'); - - $matcher = new TraceableUrlMatcher($coll, $context); - $traces = $matcher->getTraces('/babar'); - $this->assertEquals(array(0, 0, 0, 0, 0, 0), $this->getLevels($traces)); - - $traces = $matcher->getTraces('/foo'); - $this->assertEquals(array(1, 0, 0, 2), $this->getLevels($traces)); - - $traces = $matcher->getTraces('/bar/12'); - $this->assertEquals(array(0, 2), $this->getLevels($traces)); - - $traces = $matcher->getTraces('/bar/dd'); - $this->assertEquals(array(0, 1, 1, 0, 0, 0), $this->getLevels($traces)); - - $traces = $matcher->getTraces('/foo1'); - $this->assertEquals(array(0, 0, 0, 0, 2), $this->getLevels($traces)); - - $context->setMethod('POST'); - $traces = $matcher->getTraces('/foo'); - $this->assertEquals(array(2), $this->getLevels($traces)); - - $traces = $matcher->getTraces('/bar/dd'); - $this->assertEquals(array(0, 1, 2), $this->getLevels($traces)); - - $traces = $matcher->getTraces('/foo2'); - $this->assertEquals(array(0, 0, 0, 0, 0, 1), $this->getLevels($traces)); - } - - public function testMatchRouteOnMultipleHosts() - { - $routes = new RouteCollection(); - $routes->add('first', new Route( - '/mypath/', - array('_controller' => 'MainBundle:Info:first'), - array(), - array(), - 'some.example.com' - )); - - $routes->add('second', new Route( - '/mypath/', - array('_controller' => 'MainBundle:Info:second'), - array(), - array(), - 'another.example.com' - )); - - $context = new RequestContext(); - $context->setHost('baz'); - - $matcher = new TraceableUrlMatcher($routes, $context); - - $traces = $matcher->getTraces('/mypath/'); - $this->assertEquals( - array(TraceableUrlMatcher::ROUTE_ALMOST_MATCHES, TraceableUrlMatcher::ROUTE_ALMOST_MATCHES), - $this->getLevels($traces) - ); - } - - public function getLevels($traces) - { - $levels = array(); - foreach ($traces as $trace) { - $levels[] = $trace['level']; - } - - return $levels; - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php deleted file mode 100644 index b03b0c3aa0..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php +++ /dev/null @@ -1,406 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests\Matcher; - -use Symfony\Component\Routing\Exception\MethodNotAllowedException; -use Symfony\Component\Routing\Exception\ResourceNotFoundException; -use Symfony\Component\Routing\Matcher\UrlMatcher; -use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\RequestContext; - -class UrlMatcherTest extends \PHPUnit_Framework_TestCase -{ - public function testNoMethodSoAllowed() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo')); - - $matcher = new UrlMatcher($coll, new RequestContext()); - $matcher->match('/foo'); - } - - public function testMethodNotAllowed() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array('_method' => 'post'))); - - $matcher = new UrlMatcher($coll, new RequestContext()); - - try { - $matcher->match('/foo'); - $this->fail(); - } catch (MethodNotAllowedException $e) { - $this->assertEquals(array('POST'), $e->getAllowedMethods()); - } - } - - public function testHeadAllowedWhenRequirementContainsGet() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array('_method' => 'get'))); - - $matcher = new UrlMatcher($coll, new RequestContext('', 'head')); - $matcher->match('/foo'); - } - - public function testMethodNotAllowedAggregatesAllowedMethods() - { - $coll = new RouteCollection(); - $coll->add('foo1', new Route('/foo', array(), array('_method' => 'post'))); - $coll->add('foo2', new Route('/foo', array(), array('_method' => 'put|delete'))); - - $matcher = new UrlMatcher($coll, new RequestContext()); - - try { - $matcher->match('/foo'); - $this->fail(); - } catch (MethodNotAllowedException $e) { - $this->assertEquals(array('POST', 'PUT', 'DELETE'), $e->getAllowedMethods()); - } - } - - public function testMatch() - { - // test the patterns are matched and parameters are returned - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo/{bar}')); - $matcher = new UrlMatcher($collection, new RequestContext()); - try { - $matcher->match('/no-match'); - $this->fail(); - } catch (ResourceNotFoundException $e) {} - $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz'), $matcher->match('/foo/baz')); - - // test that defaults are merged - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo/{bar}', array('def' => 'test'))); - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz', 'def' => 'test'), $matcher->match('/foo/baz')); - - // test that route "method" is ignored if no method is given in the context - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo', array(), array('_method' => 'GET|head'))); - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertInternalType('array', $matcher->match('/foo')); - - // route does not match with POST method context - $matcher = new UrlMatcher($collection, new RequestContext('', 'post')); - try { - $matcher->match('/foo'); - $this->fail(); - } catch (MethodNotAllowedException $e) {} - - // route does match with GET or HEAD method context - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertInternalType('array', $matcher->match('/foo')); - $matcher = new UrlMatcher($collection, new RequestContext('', 'head')); - $this->assertInternalType('array', $matcher->match('/foo')); - - // route with an optional variable as the first segment - $collection = new RouteCollection(); - $collection->add('bar', new Route('/{bar}/foo', array('bar' => 'bar'), array('bar' => 'foo|bar'))); - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => 'bar', 'bar' => 'bar'), $matcher->match('/bar/foo')); - $this->assertEquals(array('_route' => 'bar', 'bar' => 'foo'), $matcher->match('/foo/foo')); - - $collection = new RouteCollection(); - $collection->add('bar', new Route('/{bar}', array('bar' => 'bar'), array('bar' => 'foo|bar'))); - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => 'bar', 'bar' => 'foo'), $matcher->match('/foo')); - $this->assertEquals(array('_route' => 'bar', 'bar' => 'bar'), $matcher->match('/')); - - // route with only optional variables - $collection = new RouteCollection(); - $collection->add('bar', new Route('/{foo}/{bar}', array('foo' => 'foo', 'bar' => 'bar'), array())); - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => 'bar', 'foo' => 'foo', 'bar' => 'bar'), $matcher->match('/')); - $this->assertEquals(array('_route' => 'bar', 'foo' => 'a', 'bar' => 'bar'), $matcher->match('/a')); - $this->assertEquals(array('_route' => 'bar', 'foo' => 'a', 'bar' => 'b'), $matcher->match('/a/b')); - } - - public function testMatchWithPrefixes() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/{foo}')); - $collection->addPrefix('/b'); - $collection->addPrefix('/a'); - - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => 'foo', 'foo' => 'foo'), $matcher->match('/a/b/foo')); - } - - public function testMatchWithDynamicPrefix() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/{foo}')); - $collection->addPrefix('/b'); - $collection->addPrefix('/{_locale}'); - - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_locale' => 'fr', '_route' => 'foo', 'foo' => 'foo'), $matcher->match('/fr/b/foo')); - } - - public function testMatchSpecialRouteName() - { - $collection = new RouteCollection(); - $collection->add('$péß^a|', new Route('/bar')); - - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => '$péß^a|'), $matcher->match('/bar')); - } - - public function testMatchNonAlpha() - { - $collection = new RouteCollection(); - $chars = '!"$%éà &\'()*+,./:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\[]^_`abcdefghijklmnopqrstuvwxyz{|}~-'; - $collection->add('foo', new Route('/{foo}/bar', array(), array('foo' => '['.preg_quote($chars).']+'))); - - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => 'foo', 'foo' => $chars), $matcher->match('/'.rawurlencode($chars).'/bar')); - $this->assertEquals(array('_route' => 'foo', 'foo' => $chars), $matcher->match('/'.strtr($chars, array('%' => '%25')).'/bar')); - } - - public function testMatchWithDotMetacharacterInRequirements() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/{foo}/bar', array(), array('foo' => '.+'))); - - $matcher = new UrlMatcher($collection, new RequestContext()); - $this->assertEquals(array('_route' => 'foo', 'foo' => "\n"), $matcher->match('/'.urlencode("\n").'/bar'), 'linefeed character is matched'); - } - - public function testMatchOverriddenRoute() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo')); - - $collection1 = new RouteCollection(); - $collection1->add('foo', new Route('/foo1')); - - $collection->addCollection($collection1); - - $matcher = new UrlMatcher($collection, new RequestContext()); - - $this->assertEquals(array('_route' => 'foo'), $matcher->match('/foo1')); - $this->setExpectedException('Symfony\Component\Routing\Exception\ResourceNotFoundException'); - $this->assertEquals(array(), $matcher->match('/foo')); - } - - public function testMatchRegression() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo/{foo}')); - $coll->add('bar', new Route('/foo/bar/{foo}')); - - $matcher = new UrlMatcher($coll, new RequestContext()); - $this->assertEquals(array('foo' => 'bar', '_route' => 'bar'), $matcher->match('/foo/bar/bar')); - - $collection = new RouteCollection(); - $collection->add('foo', new Route('/{bar}')); - $matcher = new UrlMatcher($collection, new RequestContext()); - try { - $matcher->match('/'); - $this->fail(); - } catch (ResourceNotFoundException $e) { - } - } - - public function testDefaultRequirementForOptionalVariables() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/{page}.{_format}', array('page' => 'index', '_format' => 'html'))); - - $matcher = new UrlMatcher($coll, new RequestContext()); - $this->assertEquals(array('page' => 'my-page', '_format' => 'xml', '_route' => 'test'), $matcher->match('/my-page.xml')); - } - - public function testMatchingIsEager() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/{foo}-{bar}-', array(), array('foo' => '.+', 'bar' => '.+'))); - - $matcher = new UrlMatcher($coll, new RequestContext()); - $this->assertEquals(array('foo' => 'text1-text2-text3', 'bar' => 'text4', '_route' => 'test'), $matcher->match('/text1-text2-text3-text4-')); - } - - public function testAdjacentVariables() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/{w}{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => 'y|Y'))); - - $matcher = new UrlMatcher($coll, new RequestContext()); - // 'w' eagerly matches as much as possible and the other variables match the remaining chars. - // This also shows that the variables w-z must all exclude the separating char (the dot '.' in this case) by default requirement. - // Otherwise they would also consume '.xml' and _format would never match as it's an optional variable. - $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'Y', 'z' => 'Z','_format' => 'xml', '_route' => 'test'), $matcher->match('/wwwwwxYZ.xml')); - // As 'y' has custom requirement and can only be of value 'y|Y', it will leave 'ZZZ' to variable z. - // So with carefully chosen requirements adjacent variables, can be useful. - $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'y', 'z' => 'ZZZ','_format' => 'html', '_route' => 'test'), $matcher->match('/wwwwwxyZZZ')); - // z and _format are optional. - $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'y', 'z' => 'default-z','_format' => 'html', '_route' => 'test'), $matcher->match('/wwwwwxy')); - - $this->setExpectedException('Symfony\Component\Routing\Exception\ResourceNotFoundException'); - $matcher->match('/wxy.html'); - } - - public function testOptionalVariableWithNoRealSeparator() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/get{what}', array('what' => 'All'))); - $matcher = new UrlMatcher($coll, new RequestContext()); - - $this->assertEquals(array('what' => 'All', '_route' => 'test'), $matcher->match('/get')); - $this->assertEquals(array('what' => 'Sites', '_route' => 'test'), $matcher->match('/getSites')); - - // Usually the character in front of an optional parameter can be left out, e.g. with pattern '/get/{what}' just '/get' would match. - // But here the 't' in 'get' is not a separating character, so it makes no sense to match without it. - $this->setExpectedException('Symfony\Component\Routing\Exception\ResourceNotFoundException'); - $matcher->match('/ge'); - } - - public function testRequiredVariableWithNoRealSeparator() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/get{what}Suffix')); - $matcher = new UrlMatcher($coll, new RequestContext()); - - $this->assertEquals(array('what' => 'Sites', '_route' => 'test'), $matcher->match('/getSitesSuffix')); - } - - public function testDefaultRequirementOfVariable() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/{page}.{_format}')); - $matcher = new UrlMatcher($coll, new RequestContext()); - - $this->assertEquals(array('page' => 'index', '_format' => 'mobile.html', '_route' => 'test'), $matcher->match('/index.mobile.html')); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException - */ - public function testDefaultRequirementOfVariableDisallowsSlash() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/{page}.{_format}')); - $matcher = new UrlMatcher($coll, new RequestContext()); - - $matcher->match('/index.sl/ash'); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException - */ - public function testDefaultRequirementOfVariableDisallowsNextSeparator() - { - $coll = new RouteCollection(); - $coll->add('test', new Route('/{page}.{_format}', array(), array('_format' => 'html|xml'))); - $matcher = new UrlMatcher($coll, new RequestContext()); - - $matcher->match('/do.t.html'); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException - */ - public function testSchemeRequirementBC() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array('_scheme' => 'https'))); - $matcher = new UrlMatcher($coll, new RequestContext()); - $matcher->match('/foo'); - } - /** - * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException - */ - public function testSchemeRequirement() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('https'))); - $matcher = new UrlMatcher($coll, new RequestContext()); - $matcher->match('/foo'); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException - */ - public function testCondition() - { - $coll = new RouteCollection(); - $route = new Route('/foo'); - $route->setCondition('context.getMethod() == "POST"'); - $coll->add('foo', $route); - $matcher = new UrlMatcher($coll, new RequestContext()); - $matcher->match('/foo'); - } - - public function testDecodeOnce() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo/{foo}')); - - $matcher = new UrlMatcher($coll, new RequestContext()); - $this->assertEquals(array('foo' => 'bar%23', '_route' => 'foo'), $matcher->match('/foo/bar%2523')); - } - - public function testCannotRelyOnPrefix() - { - $coll = new RouteCollection(); - - $subColl = new RouteCollection(); - $subColl->add('bar', new Route('/bar')); - $subColl->addPrefix('/prefix'); - // overwrite the pattern, so the prefix is not valid anymore for this route in the collection - $subColl->get('bar')->setPattern('/new'); - - $coll->addCollection($subColl); - - $matcher = new UrlMatcher($coll, new RequestContext()); - $this->assertEquals(array('_route' => 'bar'), $matcher->match('/new')); - } - - public function testWithHost() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo/{foo}', array(), array(), array(), '{locale}.example.com')); - - $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com')); - $this->assertEquals(array('foo' => 'bar', '_route' => 'foo', 'locale' => 'en'), $matcher->match('/foo/bar')); - } - - public function testWithHostOnRouteCollection() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo/{foo}')); - $coll->add('bar', new Route('/bar/{foo}', array(), array(), array(), '{locale}.example.net')); - $coll->setHost('{locale}.example.com'); - - $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com')); - $this->assertEquals(array('foo' => 'bar', '_route' => 'foo', 'locale' => 'en'), $matcher->match('/foo/bar')); - - $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com')); - $this->assertEquals(array('foo' => 'bar', '_route' => 'bar', 'locale' => 'en'), $matcher->match('/bar/bar')); - } - - /** - * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException - */ - public function testWithOutHostHostDoesNotMatch() - { - $coll = new RouteCollection(); - $coll->add('foo', new Route('/foo/{foo}', array(), array(), array(), '{locale}.example.com')); - - $matcher = new UrlMatcher($coll, new RequestContext('', 'GET', 'example.com')); - $matcher->match('/foo/bar'); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RequestContextTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RequestContextTest.php deleted file mode 100644 index 21a299956f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RequestContextTest.php +++ /dev/null @@ -1,101 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests; - -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Routing\RequestContext; - -class RequestContextTest extends \PHPUnit_Framework_TestCase -{ - public function testConstruct() - { - $requestContext = new RequestContext( - 'foo', - 'post', - 'foo.bar', - 'HTTPS', - 8080, - 444, - '/baz', - 'bar=foobar' - ); - - $this->assertEquals('foo', $requestContext->getBaseUrl()); - $this->assertEquals('POST', $requestContext->getMethod()); - $this->assertEquals('foo.bar', $requestContext->getHost()); - $this->assertEquals('https', $requestContext->getScheme()); - $this->assertSame(8080, $requestContext->getHttpPort()); - $this->assertSame(444, $requestContext->getHttpsPort()); - $this->assertEquals('/baz', $requestContext->getPathInfo()); - $this->assertEquals('bar=foobar', $requestContext->getQueryString()); - } - - public function testFromRequest() - { - $request = Request::create('https://test.com:444/foo?bar=baz'); - $requestContext = new RequestContext(); - $requestContext->setHttpPort(123); - $requestContext->fromRequest($request); - - $this->assertEquals('', $requestContext->getBaseUrl()); - $this->assertEquals('GET', $requestContext->getMethod()); - $this->assertEquals('test.com', $requestContext->getHost()); - $this->assertEquals('https', $requestContext->getScheme()); - $this->assertEquals('/foo', $requestContext->getPathInfo()); - $this->assertEquals('bar=baz', $requestContext->getQueryString()); - $this->assertSame(123, $requestContext->getHttpPort()); - $this->assertSame(444, $requestContext->getHttpsPort()); - - $request = Request::create('http://test.com:8080/foo?bar=baz'); - $requestContext = new RequestContext(); - $requestContext->setHttpsPort(567); - $requestContext->fromRequest($request); - - $this->assertSame(8080, $requestContext->getHttpPort()); - $this->assertSame(567, $requestContext->getHttpsPort()); - } - - public function testGetParameters() - { - $requestContext = new RequestContext(); - $this->assertEquals(array(), $requestContext->getParameters()); - - $requestContext->setParameters(array('foo' => 'bar')); - $this->assertEquals(array('foo' => 'bar'), $requestContext->getParameters()); - } - - public function testHasParameter() - { - $requestContext = new RequestContext(); - $requestContext->setParameters(array('foo' => 'bar')); - - $this->assertTrue($requestContext->hasParameter('foo')); - $this->assertFalse($requestContext->hasParameter('baz')); - } - - public function testGetParameter() - { - $requestContext = new RequestContext(); - $requestContext->setParameters(array('foo' => 'bar')); - - $this->assertEquals('bar', $requestContext->getParameter('foo')); - $this->assertNull($requestContext->getParameter('baz')); - } - - public function testSetParameter() - { - $requestContext = new RequestContext(); - $requestContext->setParameter('foo', 'bar'); - - $this->assertEquals('bar', $requestContext->getParameter('foo')); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCollectionTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCollectionTest.php deleted file mode 100644 index 4c12ed56df..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCollectionTest.php +++ /dev/null @@ -1,304 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests; - -use Symfony\Component\Routing\RouteCollection; -use Symfony\Component\Routing\Route; -use Symfony\Component\Config\Resource\FileResource; - -class RouteCollectionTest extends \PHPUnit_Framework_TestCase -{ - public function testRoute() - { - $collection = new RouteCollection(); - $route = new Route('/foo'); - $collection->add('foo', $route); - $this->assertEquals(array('foo' => $route), $collection->all(), '->add() adds a route'); - $this->assertEquals($route, $collection->get('foo'), '->get() returns a route by name'); - $this->assertNull($collection->get('bar'), '->get() returns null if a route does not exist'); - } - - public function testOverriddenRoute() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo')); - $collection->add('foo', new Route('/foo1')); - - $this->assertEquals('/foo1', $collection->get('foo')->getPath()); - } - - public function testDeepOverriddenRoute() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo')); - - $collection1 = new RouteCollection(); - $collection1->add('foo', new Route('/foo1')); - - $collection2 = new RouteCollection(); - $collection2->add('foo', new Route('/foo2')); - - $collection1->addCollection($collection2); - $collection->addCollection($collection1); - - $this->assertEquals('/foo2', $collection1->get('foo')->getPath()); - $this->assertEquals('/foo2', $collection->get('foo')->getPath()); - } - - public function testIterator() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo')); - - $collection1 = new RouteCollection(); - $collection1->add('bar', $bar = new Route('/bar')); - $collection1->add('foo', $foo = new Route('/foo-new')); - $collection->addCollection($collection1); - $collection->add('last', $last = new Route('/last')); - - $this->assertInstanceOf('\ArrayIterator', $collection->getIterator()); - $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'last' => $last), $collection->getIterator()->getArrayCopy()); - } - - public function testCount() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo')); - - $collection1 = new RouteCollection(); - $collection1->add('bar', new Route('/bar')); - $collection->addCollection($collection1); - - $this->assertCount(2, $collection); - } - - public function testAddCollection() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/foo')); - - $collection1 = new RouteCollection(); - $collection1->add('bar', $bar = new Route('/bar')); - $collection1->add('foo', $foo = new Route('/foo-new')); - - $collection2 = new RouteCollection(); - $collection2->add('grandchild', $grandchild = new Route('/grandchild')); - - $collection1->addCollection($collection2); - $collection->addCollection($collection1); - $collection->add('last', $last = new Route('/last')); - - $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'grandchild' => $grandchild, 'last' => $last), $collection->all(), - '->addCollection() imports routes of another collection, overrides if necessary and adds them at the end'); - } - - public function testAddCollectionWithResources() - { - $collection = new RouteCollection(); - $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml')); - $collection1 = new RouteCollection(); - $collection1->addResource($foo1 = new FileResource(__DIR__.'/Fixtures/foo1.xml')); - $collection->addCollection($collection1); - $this->assertEquals(array($foo, $foo1), $collection->getResources(), '->addCollection() merges resources'); - } - - public function testAddDefaultsAndRequirementsAndOptions() - { - $collection = new RouteCollection(); - $collection->add('foo', new Route('/{placeholder}')); - $collection1 = new RouteCollection(); - $collection1->add('bar', new Route('/{placeholder}', - array('_controller' => 'fixed', 'placeholder' => 'default'), array('placeholder' => '.+'), array('option' => 'value')) - ); - $collection->addCollection($collection1); - - $collection->addDefaults(array('placeholder' => 'new-default')); - $this->assertEquals(array('placeholder' => 'new-default'), $collection->get('foo')->getDefaults(), '->addDefaults() adds defaults to all routes'); - $this->assertEquals(array('_controller' => 'fixed', 'placeholder' => 'new-default'), $collection->get('bar')->getDefaults(), - '->addDefaults() adds defaults to all routes and overwrites existing ones'); - - $collection->addRequirements(array('placeholder' => '\d+')); - $this->assertEquals(array('placeholder' => '\d+'), $collection->get('foo')->getRequirements(), '->addRequirements() adds requirements to all routes'); - $this->assertEquals(array('placeholder' => '\d+'), $collection->get('bar')->getRequirements(), - '->addRequirements() adds requirements to all routes and overwrites existing ones'); - - $collection->addOptions(array('option' => 'new-value')); - $this->assertEquals( - array('option' => 'new-value', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), - $collection->get('bar')->getOptions(), '->addOptions() adds options to all routes and overwrites existing ones' - ); - } - - public function testAddPrefix() - { - $collection = new RouteCollection(); - $collection->add('foo', $foo = new Route('/foo')); - $collection2 = new RouteCollection(); - $collection2->add('bar', $bar = new Route('/bar')); - $collection->addCollection($collection2); - $collection->addPrefix(' / '); - $this->assertSame('/foo', $collection->get('foo')->getPattern(), '->addPrefix() trims the prefix and a single slash has no effect'); - $collection->addPrefix('/{admin}', array('admin' => 'admin'), array('admin' => '\d+')); - $this->assertEquals('/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() adds a prefix to all routes'); - $this->assertEquals('/{admin}/bar', $collection->get('bar')->getPath(), '->addPrefix() adds a prefix to all routes'); - $this->assertEquals(array('admin' => 'admin'), $collection->get('foo')->getDefaults(), '->addPrefix() adds defaults to all routes'); - $this->assertEquals(array('admin' => 'admin'), $collection->get('bar')->getDefaults(), '->addPrefix() adds defaults to all routes'); - $this->assertEquals(array('admin' => '\d+'), $collection->get('foo')->getRequirements(), '->addPrefix() adds requirements to all routes'); - $this->assertEquals(array('admin' => '\d+'), $collection->get('bar')->getRequirements(), '->addPrefix() adds requirements to all routes'); - $collection->addPrefix('0'); - $this->assertEquals('/0/{admin}/foo', $collection->get('foo')->getPattern(), '->addPrefix() ensures a prefix must start with a slash and must not end with a slash'); - $collection->addPrefix('/ /'); - $this->assertSame('/ /0/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() can handle spaces if desired'); - $this->assertSame('/ /0/{admin}/bar', $collection->get('bar')->getPath(), 'the route pattern of an added collection is in synch with the added prefix'); - } - - public function testAddPrefixOverridesDefaultsAndRequirements() - { - $collection = new RouteCollection(); - $collection->add('foo', $foo = new Route('/foo')); - $collection->add('bar', $bar = new Route('/bar', array(), array('_scheme' => 'http'))); - $collection->addPrefix('/admin', array(), array('_scheme' => 'https')); - - $this->assertEquals('https', $collection->get('foo')->getRequirement('_scheme'), '->addPrefix() overrides existing requirements'); - $this->assertEquals('https', $collection->get('bar')->getRequirement('_scheme'), '->addPrefix() overrides existing requirements'); - } - - public function testResource() - { - $collection = new RouteCollection(); - $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml')); - $collection->addResource($bar = new FileResource(__DIR__.'/Fixtures/bar.xml')); - $collection->addResource(new FileResource(__DIR__.'/Fixtures/foo.xml')); - - $this->assertEquals(array($foo, $bar), $collection->getResources(), - '->addResource() adds a resource and getResources() only returns unique ones by comparing the string representation'); - } - - public function testUniqueRouteWithGivenName() - { - $collection1 = new RouteCollection(); - $collection1->add('foo', new Route('/old')); - $collection2 = new RouteCollection(); - $collection3 = new RouteCollection(); - $collection3->add('foo', $new = new Route('/new')); - - $collection2->addCollection($collection3); - $collection1->addCollection($collection2); - - $this->assertSame($new, $collection1->get('foo'), '->get() returns new route that overrode previous one'); - // size of 1 because collection1 contains /new but not /old anymore - $this->assertCount(1, $collection1->getIterator(), '->addCollection() removes previous routes when adding new routes with the same name'); - } - - public function testGet() - { - $collection1 = new RouteCollection(); - $collection1->add('a', $a = new Route('/a')); - $collection2 = new RouteCollection(); - $collection2->add('b', $b = new Route('/b')); - $collection1->addCollection($collection2); - $collection1->add('$péß^a|', $c = new Route('/special')); - - $this->assertSame($b, $collection1->get('b'), '->get() returns correct route in child collection'); - $this->assertSame($c, $collection1->get('$péß^a|'), '->get() can handle special characters'); - $this->assertNull($collection2->get('a'), '->get() does not return the route defined in parent collection'); - $this->assertNull($collection1->get('non-existent'), '->get() returns null when route does not exist'); - $this->assertNull($collection1->get(0), '->get() does not disclose internal child RouteCollection'); - } - - public function testRemove() - { - $collection = new RouteCollection(); - $collection->add('foo', $foo = new Route('/foo')); - - $collection1 = new RouteCollection(); - $collection1->add('bar', $bar = new Route('/bar')); - $collection->addCollection($collection1); - $collection->add('last', $last = new Route('/last')); - - $collection->remove('foo'); - $this->assertSame(array('bar' => $bar, 'last' => $last), $collection->all(), '->remove() can remove a single route'); - $collection->remove(array('bar', 'last')); - $this->assertSame(array(), $collection->all(), '->remove() accepts an array and can remove multiple routes at once'); - } - - public function testSetHost() - { - $collection = new RouteCollection(); - $routea = new Route('/a'); - $routeb = new Route('/b', array(), array(), array(), '{locale}.example.net'); - $collection->add('a', $routea); - $collection->add('b', $routeb); - - $collection->setHost('{locale}.example.com'); - - $this->assertEquals('{locale}.example.com', $routea->getHost()); - $this->assertEquals('{locale}.example.com', $routeb->getHost()); - } - - public function testSetCondition() - { - $collection = new RouteCollection(); - $routea = new Route('/a'); - $routeb = new Route('/b', array(), array(), array(), '{locale}.example.net', array(), array(), 'context.getMethod() == "GET"'); - $collection->add('a', $routea); - $collection->add('b', $routeb); - - $collection->setCondition('context.getMethod() == "POST"'); - - $this->assertEquals('context.getMethod() == "POST"', $routea->getCondition()); - $this->assertEquals('context.getMethod() == "POST"', $routeb->getCondition()); - } - - public function testClone() - { - $collection = new RouteCollection(); - $collection->add('a', new Route('/a')); - $collection->add('b', new Route('/b', array('placeholder' => 'default'), array('placeholder' => '.+'))); - - $clonedCollection = clone $collection; - - $this->assertCount(2, $clonedCollection); - $this->assertEquals($collection->get('a'), $clonedCollection->get('a')); - $this->assertNotSame($collection->get('a'), $clonedCollection->get('a')); - $this->assertEquals($collection->get('b'), $clonedCollection->get('b')); - $this->assertNotSame($collection->get('b'), $clonedCollection->get('b')); - } - - public function testSetSchemes() - { - $collection = new RouteCollection(); - $routea = new Route('/a', array(), array(), array(), '', 'http'); - $routeb = new Route('/b'); - $collection->add('a', $routea); - $collection->add('b', $routeb); - - $collection->setSchemes(array('http', 'https')); - - $this->assertEquals(array('http', 'https'), $routea->getSchemes()); - $this->assertEquals(array('http', 'https'), $routeb->getSchemes()); - } - - public function testSetMethods() - { - $collection = new RouteCollection(); - $routea = new Route('/a', array(), array(), array(), '', array(), array('GET', 'POST')); - $routeb = new Route('/b'); - $collection->add('a', $routea); - $collection->add('b', $routeb); - - $collection->setMethods('PUT'); - - $this->assertEquals(array('PUT'), $routea->getMethods()); - $this->assertEquals(array('PUT'), $routeb->getMethods()); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCompilerTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCompilerTest.php deleted file mode 100644 index d663ae960b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteCompilerTest.php +++ /dev/null @@ -1,253 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests; - -use Symfony\Component\Routing\Route; - -class RouteCompilerTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider provideCompileData - */ - public function testCompile($name, $arguments, $prefix, $regex, $variables, $tokens) - { - $r = new \ReflectionClass('Symfony\\Component\\Routing\\Route'); - $route = $r->newInstanceArgs($arguments); - - $compiled = $route->compile(); - $this->assertEquals($prefix, $compiled->getStaticPrefix(), $name.' (static prefix)'); - $this->assertEquals($regex, $compiled->getRegex(), $name.' (regex)'); - $this->assertEquals($variables, $compiled->getVariables(), $name.' (variables)'); - $this->assertEquals($tokens, $compiled->getTokens(), $name.' (tokens)'); - } - - public function provideCompileData() - { - return array( - array( - 'Static route', - array('/foo'), - '/foo', '#^/foo$#s', array(), array( - array('text', '/foo'), - )), - - array( - 'Route with a variable', - array('/foo/{bar}'), - '/foo', '#^/foo/(?P[^/]++)$#s', array('bar'), array( - array('variable', '/', '[^/]++', 'bar'), - array('text', '/foo'), - )), - - array( - 'Route with a variable that has a default value', - array('/foo/{bar}', array('bar' => 'bar')), - '/foo', '#^/foo(?:/(?P[^/]++))?$#s', array('bar'), array( - array('variable', '/', '[^/]++', 'bar'), - array('text', '/foo'), - )), - - array( - 'Route with several variables', - array('/foo/{bar}/{foobar}'), - '/foo', '#^/foo/(?P[^/]++)/(?P[^/]++)$#s', array('bar', 'foobar'), array( - array('variable', '/', '[^/]++', 'foobar'), - array('variable', '/', '[^/]++', 'bar'), - array('text', '/foo'), - )), - - array( - 'Route with several variables that have default values', - array('/foo/{bar}/{foobar}', array('bar' => 'bar', 'foobar' => '')), - '/foo', '#^/foo(?:/(?P[^/]++)(?:/(?P[^/]++))?)?$#s', array('bar', 'foobar'), array( - array('variable', '/', '[^/]++', 'foobar'), - array('variable', '/', '[^/]++', 'bar'), - array('text', '/foo'), - )), - - array( - 'Route with several variables but some of them have no default values', - array('/foo/{bar}/{foobar}', array('bar' => 'bar')), - '/foo', '#^/foo/(?P[^/]++)/(?P[^/]++)$#s', array('bar', 'foobar'), array( - array('variable', '/', '[^/]++', 'foobar'), - array('variable', '/', '[^/]++', 'bar'), - array('text', '/foo'), - )), - - array( - 'Route with an optional variable as the first segment', - array('/{bar}', array('bar' => 'bar')), - '', '#^/(?P[^/]++)?$#s', array('bar'), array( - array('variable', '/', '[^/]++', 'bar'), - )), - - array( - 'Route with a requirement of 0', - array('/{bar}', array('bar' => null), array('bar' => '0')), - '', '#^/(?P0)?$#s', array('bar'), array( - array('variable', '/', '0', 'bar'), - )), - - array( - 'Route with an optional variable as the first segment with requirements', - array('/{bar}', array('bar' => 'bar'), array('bar' => '(foo|bar)')), - '', '#^/(?P(foo|bar))?$#s', array('bar'), array( - array('variable', '/', '(foo|bar)', 'bar'), - )), - - array( - 'Route with only optional variables', - array('/{foo}/{bar}', array('foo' => 'foo', 'bar' => 'bar')), - '', '#^/(?P[^/]++)?(?:/(?P[^/]++))?$#s', array('foo', 'bar'), array( - array('variable', '/', '[^/]++', 'bar'), - array('variable', '/', '[^/]++', 'foo'), - )), - - array( - 'Route with a variable in last position', - array('/foo-{bar}'), - '/foo', '#^/foo\-(?P[^/]++)$#s', array('bar'), array( - array('variable', '-', '[^/]++', 'bar'), - array('text', '/foo'), - )), - - array( - 'Route with nested placeholders', - array('/{static{var}static}'), - '/{static', '#^/\{static(?P[^/]+)static\}$#s', array('var'), array( - array('text', 'static}'), - array('variable', '', '[^/]+', 'var'), - array('text', '/{static'), - )), - - array( - 'Route without separator between variables', - array('/{w}{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => '(y|Y)')), - '', '#^/(?P[^/\.]+)(?P[^/\.]+)(?P(y|Y))(?:(?P[^/\.]++)(?:\.(?P<_format>[^/]++))?)?$#s', array('w', 'x', 'y', 'z', '_format'), array( - array('variable', '.', '[^/]++', '_format'), - array('variable', '', '[^/\.]++', 'z'), - array('variable', '', '(y|Y)', 'y'), - array('variable', '', '[^/\.]+', 'x'), - array('variable', '/', '[^/\.]+', 'w'), - )), - - array( - 'Route with a format', - array('/foo/{bar}.{_format}'), - '/foo', '#^/foo/(?P[^/\.]++)\.(?P<_format>[^/]++)$#s', array('bar', '_format'), array( - array('variable', '.', '[^/]++', '_format'), - array('variable', '/', '[^/\.]++', 'bar'), - array('text', '/foo'), - )), - ); - } - - /** - * @expectedException \LogicException - */ - public function testRouteWithSameVariableTwice() - { - $route = new Route('/{name}/{name}'); - - $compiled = $route->compile(); - } - - /** - * @dataProvider getNumericVariableNames - * @expectedException \DomainException - */ - public function testRouteWithNumericVariableName($name) - { - $route = new Route('/{'. $name.'}'); - $route->compile(); - } - - public function getNumericVariableNames() - { - return array( - array('09'), - array('123'), - array('1e2') - ); - } - - /** - * @dataProvider provideCompileWithHostData - */ - public function testCompileWithHost($name, $arguments, $prefix, $regex, $variables, $pathVariables, $tokens, $hostRegex, $hostVariables, $hostTokens) - { - $r = new \ReflectionClass('Symfony\\Component\\Routing\\Route'); - $route = $r->newInstanceArgs($arguments); - - $compiled = $route->compile(); - $this->assertEquals($prefix, $compiled->getStaticPrefix(), $name.' (static prefix)'); - $this->assertEquals($regex, str_replace(array("\n", ' '), '', $compiled->getRegex()), $name.' (regex)'); - $this->assertEquals($variables, $compiled->getVariables(), $name.' (variables)'); - $this->assertEquals($pathVariables, $compiled->getPathVariables(), $name.' (path variables)'); - $this->assertEquals($tokens, $compiled->getTokens(), $name.' (tokens)'); - $this->assertEquals($hostRegex, str_replace(array("\n", ' '), '', $compiled->getHostRegex()), $name.' (host regex)'); - $this->assertEquals($hostVariables, $compiled->getHostVariables(), $name.' (host variables)'); - $this->assertEquals($hostTokens, $compiled->getHostTokens(), $name.' (host tokens)'); - } - - public function provideCompileWithHostData() - { - return array( - array( - 'Route with host pattern', - array('/hello', array(), array(), array(), 'www.example.com'), - '/hello', '#^/hello$#s', array(), array(), array( - array('text', '/hello'), - ), - '#^www\.example\.com$#s', array(), array( - array('text', 'www.example.com'), - ), - ), - array( - 'Route with host pattern and some variables', - array('/hello/{name}', array(), array(), array(), 'www.example.{tld}'), - '/hello', '#^/hello/(?P[^/]++)$#s', array('tld', 'name'), array('name'), array( - array('variable', '/', '[^/]++', 'name'), - array('text', '/hello'), - ), - '#^www\.example\.(?P[^\.]++)$#s', array('tld'), array( - array('variable', '.', '[^\.]++', 'tld'), - array('text', 'www.example'), - ), - ), - array( - 'Route with variable at beginning of host', - array('/hello', array(), array(), array(), '{locale}.example.{tld}'), - '/hello', '#^/hello$#s', array('locale', 'tld'), array(), array( - array('text', '/hello'), - ), - '#^(?P[^\.]++)\.example\.(?P[^\.]++)$#s', array('locale', 'tld'), array( - array('variable', '.', '[^\.]++', 'tld'), - array('text', '.example'), - array('variable', '', '[^\.]++', 'locale'), - ), - ), - array( - 'Route with host variables that has a default value', - array('/hello', array('locale' => 'a', 'tld' => 'b'), array(), array(), '{locale}.example.{tld}'), - '/hello', '#^/hello$#s', array('locale', 'tld'), array(), array( - array('text', '/hello'), - ), - '#^(?P[^\.]++)\.example\.(?P[^\.]++)$#s', array('locale', 'tld'), array( - array('variable', '.', '[^\.]++', 'tld'), - array('text', '.example'), - array('variable', '', '[^\.]++', 'locale'), - ), - ), - ); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteTest.php deleted file mode 100644 index cbd5ccb43b..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouteTest.php +++ /dev/null @@ -1,240 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests; - -use Symfony\Component\Routing\Route; - -class RouteTest extends \PHPUnit_Framework_TestCase -{ - public function testConstructor() - { - $route = new Route('/{foo}', array('foo' => 'bar'), array('foo' => '\d+'), array('foo' => 'bar'), '{locale}.example.com'); - $this->assertEquals('/{foo}', $route->getPath(), '__construct() takes a path as its first argument'); - $this->assertEquals(array('foo' => 'bar'), $route->getDefaults(), '__construct() takes defaults as its second argument'); - $this->assertEquals(array('foo' => '\d+'), $route->getRequirements(), '__construct() takes requirements as its third argument'); - $this->assertEquals('bar', $route->getOption('foo'), '__construct() takes options as its fourth argument'); - $this->assertEquals('{locale}.example.com', $route->getHost(), '__construct() takes a host pattern as its fifth argument'); - - $route = new Route('/', array(), array(), array(), '', array('Https'), array('POST', 'put'), 'context.getMethod() == "GET"'); - $this->assertEquals(array('https'), $route->getSchemes(), '__construct() takes schemes as its sixth argument and lowercases it'); - $this->assertEquals(array('POST', 'PUT'), $route->getMethods(), '__construct() takes methods as its seventh argument and uppercases it'); - $this->assertEquals('context.getMethod() == "GET"', $route->getCondition(), '__construct() takes a condition as its eight argument'); - - $route = new Route('/', array(), array(), array(), '', 'Https', 'Post'); - $this->assertEquals(array('https'), $route->getSchemes(), '__construct() takes a single scheme as its sixth argument'); - $this->assertEquals(array('POST'), $route->getMethods(), '__construct() takes a single method as its seventh argument'); - } - - public function testPath() - { - $route = new Route('/{foo}'); - $route->setPath('/{bar}'); - $this->assertEquals('/{bar}', $route->getPath(), '->setPath() sets the path'); - $route->setPath(''); - $this->assertEquals('/', $route->getPath(), '->setPath() adds a / at the beginning of the path if needed'); - $route->setPath('bar'); - $this->assertEquals('/bar', $route->getPath(), '->setPath() adds a / at the beginning of the path if needed'); - $this->assertEquals($route, $route->setPath(''), '->setPath() implements a fluent interface'); - $route->setPath('//path'); - $this->assertEquals('/path', $route->getPath(), '->setPath() does not allow two slashes "//" at the beginning of the path as it would be confused with a network path when generating the path from the route'); - } - - public function testOptions() - { - $route = new Route('/{foo}'); - $route->setOptions(array('foo' => 'bar')); - $this->assertEquals(array_merge(array( - 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler', - ), array('foo' => 'bar')), $route->getOptions(), '->setOptions() sets the options'); - $this->assertEquals($route, $route->setOptions(array()), '->setOptions() implements a fluent interface'); - - $route->setOptions(array('foo' => 'foo')); - $route->addOptions(array('bar' => 'bar')); - $this->assertEquals($route, $route->addOptions(array()), '->addOptions() implements a fluent interface'); - $this->assertEquals(array('foo' => 'foo', 'bar' => 'bar', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), $route->getOptions(), '->addDefaults() keep previous defaults'); - } - - public function testOption() - { - $route = new Route('/{foo}'); - $this->assertFalse($route->hasOption('foo'), '->hasOption() return false if option is not set'); - $this->assertEquals($route, $route->setOption('foo', 'bar'), '->setOption() implements a fluent interface'); - $this->assertEquals('bar', $route->getOption('foo'), '->setOption() sets the option'); - $this->assertTrue($route->hasOption('foo'), '->hasOption() return true if option is set'); - } - - public function testDefaults() - { - $route = new Route('/{foo}'); - $route->setDefaults(array('foo' => 'bar')); - $this->assertEquals(array('foo' => 'bar'), $route->getDefaults(), '->setDefaults() sets the defaults'); - $this->assertEquals($route, $route->setDefaults(array()), '->setDefaults() implements a fluent interface'); - - $route->setDefault('foo', 'bar'); - $this->assertEquals('bar', $route->getDefault('foo'), '->setDefault() sets a default value'); - - $route->setDefault('foo2', 'bar2'); - $this->assertEquals('bar2', $route->getDefault('foo2'), '->getDefault() return the default value'); - $this->assertNull($route->getDefault('not_defined'), '->getDefault() return null if default value is not set'); - - $route->setDefault('_controller', $closure = function () { return 'Hello'; }); - $this->assertEquals($closure, $route->getDefault('_controller'), '->setDefault() sets a default value'); - - $route->setDefaults(array('foo' => 'foo')); - $route->addDefaults(array('bar' => 'bar')); - $this->assertEquals($route, $route->addDefaults(array()), '->addDefaults() implements a fluent interface'); - $this->assertEquals(array('foo' => 'foo', 'bar' => 'bar'), $route->getDefaults(), '->addDefaults() keep previous defaults'); - } - - public function testRequirements() - { - $route = new Route('/{foo}'); - $route->setRequirements(array('foo' => '\d+')); - $this->assertEquals(array('foo' => '\d+'), $route->getRequirements(), '->setRequirements() sets the requirements'); - $this->assertEquals('\d+', $route->getRequirement('foo'), '->getRequirement() returns a requirement'); - $this->assertNull($route->getRequirement('bar'), '->getRequirement() returns null if a requirement is not defined'); - $route->setRequirements(array('foo' => '^\d+$')); - $this->assertEquals('\d+', $route->getRequirement('foo'), '->getRequirement() removes ^ and $ from the path'); - $this->assertEquals($route, $route->setRequirements(array()), '->setRequirements() implements a fluent interface'); - - $route->setRequirements(array('foo' => '\d+')); - $route->addRequirements(array('bar' => '\d+')); - $this->assertEquals($route, $route->addRequirements(array()), '->addRequirements() implements a fluent interface'); - $this->assertEquals(array('foo' => '\d+', 'bar' => '\d+'), $route->getRequirements(), '->addRequirement() keep previous requirements'); - } - - public function testRequirement() - { - $route = new Route('/{foo}'); - $this->assertFalse($route->hasRequirement('foo'), '->hasRequirement() return false if requirement is not set'); - $route->setRequirement('foo', '^\d+$'); - $this->assertEquals('\d+', $route->getRequirement('foo'), '->setRequirement() removes ^ and $ from the path'); - $this->assertTrue($route->hasRequirement('foo'), '->hasRequirement() return true if requirement is set'); - } - - /** - * @dataProvider getInvalidRequirements - * @expectedException \InvalidArgumentException - */ - public function testSetInvalidRequirement($req) - { - $route = new Route('/{foo}'); - $route->setRequirement('foo', $req); - } - - public function getInvalidRequirements() - { - return array( - array(''), - array(array()), - array('^$'), - array('^'), - array('$') - ); - } - - public function testHost() - { - $route = new Route('/'); - $route->setHost('{locale}.example.net'); - $this->assertEquals('{locale}.example.net', $route->getHost(), '->setHost() sets the host pattern'); - } - - public function testScheme() - { - $route = new Route('/'); - $this->assertEquals(array(), $route->getSchemes(), 'schemes is initialized with array()'); - $this->assertFalse($route->hasScheme('http')); - $route->setSchemes('hTTp'); - $this->assertEquals(array('http'), $route->getSchemes(), '->setSchemes() accepts a single scheme string and lowercases it'); - $this->assertTrue($route->hasScheme('htTp')); - $this->assertFalse($route->hasScheme('httpS')); - $route->setSchemes(array('HttpS', 'hTTp')); - $this->assertEquals(array('https', 'http'), $route->getSchemes(), '->setSchemes() accepts an array of schemes and lowercases them'); - $this->assertTrue($route->hasScheme('htTp')); - $this->assertTrue($route->hasScheme('httpS')); - } - - public function testSchemeIsBC() - { - $route = new Route('/'); - $route->setRequirement('_scheme', 'http|https'); - $this->assertEquals('http|https', $route->getRequirement('_scheme')); - $this->assertEquals(array('http', 'https'), $route->getSchemes()); - $this->assertTrue($route->hasScheme('https')); - $this->assertTrue($route->hasScheme('http')); - $this->assertFalse($route->hasScheme('ftp')); - $route->setSchemes(array('hTTp')); - $this->assertEquals('http', $route->getRequirement('_scheme')); - $route->setSchemes(array()); - $this->assertNull($route->getRequirement('_scheme')); - } - - public function testMethod() - { - $route = new Route('/'); - $this->assertEquals(array(), $route->getMethods(), 'methods is initialized with array()'); - $route->setMethods('gEt'); - $this->assertEquals(array('GET'), $route->getMethods(), '->setMethods() accepts a single method string and uppercases it'); - $route->setMethods(array('gEt', 'PosT')); - $this->assertEquals(array('GET', 'POST'), $route->getMethods(), '->setMethods() accepts an array of methods and uppercases them'); - } - - public function testMethodIsBC() - { - $route = new Route('/'); - $route->setRequirement('_method', 'GET|POST'); - $this->assertEquals('GET|POST', $route->getRequirement('_method')); - $this->assertEquals(array('GET', 'POST'), $route->getMethods()); - $route->setMethods(array('gEt')); - $this->assertEquals('GET', $route->getRequirement('_method')); - $route->setMethods(array()); - $this->assertNull($route->getRequirement('_method')); - } - - public function testCondition() - { - $route = new Route('/'); - $this->assertEquals(null, $route->getCondition()); - $route->setCondition('context.getMethod() == "GET"'); - $this->assertEquals('context.getMethod() == "GET"', $route->getCondition()); - } - - public function testCompile() - { - $route = new Route('/{foo}'); - $this->assertInstanceOf('Symfony\Component\Routing\CompiledRoute', $compiled = $route->compile(), '->compile() returns a compiled route'); - $this->assertSame($compiled, $route->compile(), '->compile() only compiled the route once if unchanged'); - $route->setRequirement('foo', '.*'); - $this->assertNotSame($compiled, $route->compile(), '->compile() recompiles if the route was modified'); - } - - public function testPattern() - { - $route = new Route('/{foo}'); - $this->assertEquals('/{foo}', $route->getPattern()); - - $route->setPattern('/bar'); - $this->assertEquals('/bar', $route->getPattern()); - } - - public function testSerialize() - { - $route = new Route('/{foo}', array('foo' => 'default'), array('foo' => '\d+')); - - $serialized = serialize($route); - $unserialized = unserialize($serialized); - - $this->assertEquals($route, $unserialized); - $this->assertNotSame($route, $unserialized); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouterTest.php b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouterTest.php deleted file mode 100644 index 42a344c74a..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/Tests/RouterTest.php +++ /dev/null @@ -1,163 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Routing\Tests; - -use Symfony\Component\Routing\Router; -use Symfony\Component\HttpFoundation\Request; - -class RouterTest extends \PHPUnit_Framework_TestCase -{ - private $router = null; - - private $loader = null; - - protected function setUp() - { - $this->loader = $this->getMock('Symfony\Component\Config\Loader\LoaderInterface'); - $this->router = new Router($this->loader, 'routing.yml'); - } - - public function testSetOptionsWithSupportedOptions() - { - $this->router->setOptions(array( - 'cache_dir' => './cache', - 'debug' => true, - 'resource_type' => 'ResourceType' - )); - - $this->assertSame('./cache', $this->router->getOption('cache_dir')); - $this->assertTrue($this->router->getOption('debug')); - $this->assertSame('ResourceType', $this->router->getOption('resource_type')); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The Router does not support the following options: "option_foo", "option_bar" - */ - public function testSetOptionsWithUnsupportedOptions() - { - $this->router->setOptions(array( - 'cache_dir' => './cache', - 'option_foo' => true, - 'option_bar' => 'baz', - 'resource_type' => 'ResourceType' - )); - } - - public function testSetOptionWithSupportedOption() - { - $this->router->setOption('cache_dir', './cache'); - - $this->assertSame('./cache', $this->router->getOption('cache_dir')); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The Router does not support the "option_foo" option - */ - public function testSetOptionWithUnsupportedOption() - { - $this->router->setOption('option_foo', true); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The Router does not support the "option_foo" option - */ - public function testGetOptionWithUnsupportedOption() - { - $this->router->getOption('option_foo', true); - } - - public function testThatRouteCollectionIsLoaded() - { - $this->router->setOption('resource_type', 'ResourceType'); - - $routeCollection = $this->getMock('Symfony\Component\Routing\RouteCollection'); - - $this->loader->expects($this->once()) - ->method('load')->with('routing.yml', 'ResourceType') - ->will($this->returnValue($routeCollection)); - - $this->assertSame($routeCollection, $this->router->getRouteCollection()); - } - - /** - * @dataProvider provideMatcherOptionsPreventingCaching - */ - public function testMatcherIsCreatedIfCacheIsNotConfigured($option) - { - $this->router->setOption($option, null); - - $this->loader->expects($this->once()) - ->method('load')->with('routing.yml', null) - ->will($this->returnValue($this->getMock('Symfony\Component\Routing\RouteCollection'))); - - $this->assertInstanceOf('Symfony\\Component\\Routing\\Matcher\\UrlMatcher', $this->router->getMatcher()); - - } - - public function provideMatcherOptionsPreventingCaching() - { - return array( - array('cache_dir'), - array('matcher_cache_class') - ); - } - - /** - * @dataProvider provideGeneratorOptionsPreventingCaching - */ - public function testGeneratorIsCreatedIfCacheIsNotConfigured($option) - { - $this->router->setOption($option, null); - - $this->loader->expects($this->once()) - ->method('load')->with('routing.yml', null) - ->will($this->returnValue($this->getMock('Symfony\Component\Routing\RouteCollection'))); - - $this->assertInstanceOf('Symfony\\Component\\Routing\\Generator\\UrlGenerator', $this->router->getGenerator()); - - } - - public function provideGeneratorOptionsPreventingCaching() - { - return array( - array('cache_dir'), - array('generator_cache_class') - ); - } - - public function testMatchRequestWithUrlMatcherInterface() - { - $matcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface'); - $matcher->expects($this->once())->method('match'); - - $p = new \ReflectionProperty($this->router, 'matcher'); - $p->setAccessible(true); - $p->setValue($this->router, $matcher); - - $this->router->matchRequest(Request::create('/')); - } - - public function testMatchRequestWithRequestMatcherInterface() - { - $matcher = $this->getMock('Symfony\Component\Routing\Matcher\RequestMatcherInterface'); - $matcher->expects($this->once())->method('matchRequest'); - - $p = new \ReflectionProperty($this->router, 'matcher'); - $p->setAccessible(true); - $p->setValue($this->router, $matcher); - - $this->router->matchRequest(Request::create('/')); - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/composer.json b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/composer.json deleted file mode 100644 index 9a88cc149f..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "symfony/routing", - "type": "library", - "description": "Symfony Routing Component", - "keywords": ["routing", "router", "URL", "URI"], - "homepage": "http://symfony.com", - "license": "MIT", - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "symfony/config": "~2.2", - "symfony/yaml": "~2.0", - "symfony/expression-language": "~2.4", - "doctrine/annotations": "~1.0", - "psr/log": "~1.0" - }, - "suggest": { - "symfony/config": "For using the all-in-one router or any loader", - "symfony/yaml": "For using the YAML loader", - "symfony/expression-language": "For using expression matching", - "doctrine/annotations": "For using the annotation loader" - }, - "autoload": { - "psr-0": { "Symfony\\Component\\Routing\\": "" } - }, - "target-dir": "Symfony/Component/Routing", - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - } -} diff --git a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/phpunit.xml.dist b/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/phpunit.xml.dist deleted file mode 100644 index 830066aab5..0000000000 --- a/app/Vendor/Ratchet/vendor/symfony/routing/Symfony/Component/Routing/phpunit.xml.dist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - ./Tests/ - - - - - - ./ - - ./vendor - ./Tests - - - - diff --git a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitignore b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitignore deleted file mode 100644 index 5cfaa3e1af..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.sconsign.dblite -build diff --git a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitmodules b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitmodules deleted file mode 100644 index d75d95c53e..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "when"] - path = when - url = git://github.com/cujojs/when.git diff --git a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/LICENSE b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/LICENSE deleted file mode 100644 index cb2cd35a74..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2011,2012 Tavendo GmbH. - -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/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/README.md b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/README.md deleted file mode 100644 index e36a501c40..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/README.md +++ /dev/null @@ -1,92 +0,0 @@ -AutobahnJS -========== - - * Asynchronous RPC/PubSub over WebSocket - * WAMP compatible implementation (see http://wamp.ws) - * no dependencies - * tiny size (47kB, 13kB minified, 5kB compressed) - * MIT License - - -What is that? -------------- - -WebSockets is already built into -modern browsers and provides full-duplex, low-latency communication. - -However, as such, it is quite low-level. Web apps often have a need for -higher level messaging patterns: - - * Publish & Subscribe - * Remote Procedure Calls - -This is where **WAMP** enters. WAMP (The WebSocket Application Messaging Protocol) -runs on top of raw WebSocket and provides *PubSub* and *RPC*. - -Technically, **WAMP** is a proper WebSocket *subprotocol* that uses JSON as -message serialization format. **WAMP** was designed to be easy to use and -simple to implement. - -**AutobahnJS** implements **WAMP** in JavaScript to be used in browser -based applications. - -Read more about **WAMP** and other **WAMP** compatible implementations -on http://wamp.ws - - -Show me the code! ------------------ - -This is how you do publish & subscribe with **AutobahnJS**. - -Include **AutobahnJS** - - - -.. connect and subscribe to receive events on a topic - - var sess; - - window.onload = function() { - sess = new ab.Session("ws://localhost:9000", function() { - - sess.subscribe("http://example.com/event#event1", onEvent1); - }); - }; - - function onEvent1(topic, event) { - alert("got event: " + event); - } - - -.. and publish an event to a topic - - - function publishEvent1() { - - sess.publish("http://example.com/event#event1", {a: 23, b: "foobar"}); - }; - - ... - - - - -You can find a complete app template including proper error handling here - - http://localhost:8080/developers/autobahnjs/reference#apptemplate - - -More Information ----------------- - -For more information, including tutorials and reference, please visit: - - http://autobahn.ws/developers/autobahnjs - - -Contact -------- - -Get in touch on IRC #autobahn on chat.freenode.net or join the mailing -list on http://groups.google.com/group/autobahnws. diff --git a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/SConstruct b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/SConstruct deleted file mode 100644 index 6d042b675f..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/SConstruct +++ /dev/null @@ -1,86 +0,0 @@ -############################################################################### -## -## Copyright 2012 Tavendo GmbH -## -## Licensed under the Apache License, Version 2.0 (the "License"); -## you may not use this file except in compliance with the License. -## You may obtain a copy of the License at -## -## http://www.apache.org/licenses/LICENSE-2.0 -## -## Unless required by applicable law or agreed to in writing, software -## distributed under the License is distributed on an "AS IS" BASIS, -## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -## See the License for the specific language governing permissions and -## limitations under the License. -## -############################################################################### - -import os, sys -import subprocess -from SCons.Errors import * - - -def js_builder(target, source, env): - - if env['JS_COMPILATION_LEVEL'] == 'NONE': - outfile = str(target[0]) - of = open(outfile, 'w') - for file in source: - of.write(open(str(file)).read()) - of.write("\n") - of.close() - - else: - cmd = [] - cmd.append(os.path.join(env['JAVA_HOME'], 'bin', 'java')) - - cmd.extend(['-jar', env['JS_COMPILER']]) - - for define in env['JS_DEFINES']: - cmd.append('--define="%s=%s"' % (define, env['JS_DEFINES'][define])) - - for file in source: - cmd.extend(["--js", str(file)]) - - cmd.extend(["--js_output_file", str(target[0])]) - - #cmd.append("--warning_level=VERBOSE") - #cmd.append("--jscomp_warning=missingProperties") - #cmd.append("--jscomp_warning=checkTypes") - - print ' '.join(cmd) - subprocess.call(cmd) - - -env = Environment() -env.Append(BUILDERS = {'JavaScript': Builder(action = js_builder)}) - -if os.environ.has_key('JAVA_HOME'): - env['JAVA_HOME'] = os.environ['JAVA_HOME'] -else: - raise SCons.Errors.UserError, "Need to have a Java Run-time - please set JAVA_HOME ennvironment variable." - -if os.environ.has_key('JS_COMPILER'): - env['JS_COMPILER'] = os.environ['JS_COMPILER'] -else: - raise SCons.Errors.UserError, "Need path to Google Closure Compiler JAR (compiler.jar) in JS_COMPILER environment variable." - -env['JS_DEFINES' ] = { - 'AUTOBAHNJS_VERSION': "'%s'" % open('version.txt').read().strip(), - 'AUTOBAHNJS_DEBUG': "false" -} - -sources = ["autobahn/license.js", "when/when.js", "autobahn/autobahn.js"] - -# NONE | WHITESPACE_ONLY | SIMPLE_OPTIMIZATIONS | ADVANCED_OPTIMIZATIONS - -## FIXME: Closure Compiler has no mode NONE. We simulate that by dumb file -## concatenation. However, that does of course not do any var substitutions. -#env['JS_COMPILATION_LEVEL'] = "NONE" -ab = env.JavaScript("build/autobahn.js", sources, JS_COMPILATION_LEVEL = "NONE") -#Depends(ab, 'version.txt') - -#env['JS_COMPILATION_LEVEL'] = "SIMPLE_OPTIMIZATIONS" -ab_min = env.JavaScript("build/autobahn.min.js", sources, JS_COMPILATION_LEVEL = "SIMPLE_OPTIMIZATIONS") -Depends(ab_min, 'version.txt') diff --git a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/autobahn.js b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/autobahn.js deleted file mode 100644 index d5bd5c06f3..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/autobahn.js +++ /dev/null @@ -1,824 +0,0 @@ -/** @license MIT License (c) 2011,2012 Copyright Tavendo GmbH. */ - -/** - * AutobahnJS - http://autobahn.ws - * - * A lightweight implementation of - * - * WAMP (The WebSocket Application Messaging Protocol) - http://wamp.ws - * - * Provides asynchronous RPC/PubSub over WebSocket. - * - * Copyright 2011, 2012 Tavendo GmbH. Licensed under the MIT License. - * See license text at http://www.opensource.org/licenses/mit-license.php - */ - -"use strict"; - -/** @define {string} */ -var AUTOBAHNJS_VERSION = '?.?.?'; - -/** @define {boolean} */ -var AUTOBAHNJS_DEBUG = true; - - - -var ab = window.ab = {}; - -ab._version = AUTOBAHNJS_VERSION; - -/** - * Fallbacks for browsers lacking - * - * Array.prototype.indexOf - * Array.prototype.forEach - * - * most notably MSIE8. - * - * Source: - * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf - * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach - */ -(function () { - if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { - "use strict"; - if (this === null) { - throw new TypeError(); - } - var t = new Object(this); - var len = t.length >>> 0; - if (len === 0) { - return -1; - } - var n = 0; - if (arguments.length > 0) { - n = Number(arguments[1]); - if (n !== n) { // shortcut for verifying if it's NaN - n = 0; - } else if (n !== 0 && n !== Infinity && n !== -Infinity) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - } - if (n >= len) { - return -1; - } - var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); - for (; k < len; k++) { - if (k in t && t[k] === searchElement) { - return k; - } - } - return -1; - }; - } - - if (!Array.prototype.forEach) { - - Array.prototype.forEach = function (callback, thisArg) { - - var T, k; - - if (this === null) { - throw new TypeError(" this is null or not defined"); - } - - // 1. Let O be the result of calling ToObject passing the |this| value as the argument. - var O = new Object(this); - - // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length". - // 3. Let len be ToUint32(lenValue). - var len = O.length >>> 0; // Hack to convert O.length to a UInt32 - - // 4. If IsCallable(callback) is false, throw a TypeError exception. - // See: http://es5.github.com/#x9.11 - if ({}.toString.call(callback) !== "[object Function]") { - throw new TypeError(callback + " is not a function"); - } - - // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. - if (thisArg) { - T = thisArg; - } - - // 6. Let k be 0 - k = 0; - - // 7. Repeat, while k < len - while (k < len) { - - var kValue; - - // a. Let Pk be ToString(k). - // This is implicit for LHS operands of the in operator - // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. - // This step can be combined with c - // c. If kPresent is true, then - if (k in O) { - - // i. Let kValue be the result of calling the Get internal method of O with argument Pk. - kValue = O[k]; - - // ii. Call the Call internal method of callback with T as the this value and - // argument list containing kValue, k, and O. - callback.call(T, kValue, k, O); - } - // d. Increase k by 1. - k++; - } - // 8. return undefined - }; - } - -})(); - - -// Helper to slice out browser / version from userAgent -ab._sliceUserAgent = function (str, delim, delim2) { - var ver = []; - var ua = navigator.userAgent; - var i = ua.indexOf(str); - var j = ua.indexOf(delim, i); - if (j < 0) { - j = ua.length; - } - var agent = ua.slice(i, j).split(delim2); - var v = agent[1].split('.'); - for (var k = 0; k < v.length; ++k) { - ver.push(parseInt(v[k], 10)); - } - return {name: agent[0], version: ver}; -}; - -/** - * Detect browser and browser version. - */ -ab.getBrowser = function () { - - var ua = navigator.userAgent; - if (ua.indexOf("Chrome") > -1) { - return ab._sliceUserAgent("Chrome", " ", "/"); - } else if (ua.indexOf("Safari") > -1) { - return ab._sliceUserAgent("Safari", " ", "/"); - } else if (ua.indexOf("Firefox") > -1) { - return ab._sliceUserAgent("Firefox", " ", "/"); - } else if (ua.indexOf("MSIE") > -1) { - return ab._sliceUserAgent("MSIE", ";", " "); - } else { - return null; - } -}; - - -// Logging message for unsupported browser. -ab.browserNotSupportedMessage = "Browser does not support WebSockets (RFC6455)"; - - -ab._idchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; -ab._idlen = 16; -ab._subprotocol = "wamp"; - -ab._newid = function () { - var id = ""; - for (var i = 0; i < ab._idlen; i += 1) { - id += ab._idchars.charAt(Math.floor(Math.random() * ab._idchars.length)); - } - return id; -}; - -ab.log = function (o) { - if (window.console && console.log) { - //console.log.apply(console, !!arguments.length ? arguments : [this]); - if (arguments.length > 1) { - console.group("Log Item"); - for (var i = 0; i < arguments.length; i += 1) { - console.log(arguments[i]); - } - console.groupEnd(); - } else { - console.log(arguments[0]); - } - } -}; - -ab._debugrpc = false; -ab._debugpubsub = false; -ab._debugws = false; - -ab.debug = function (debugWamp, debugWs) { - if ("console" in window) { - ab._debugrpc = debugWamp; - ab._debugpubsub = debugWamp; - ab._debugws = debugWs; - } else { - throw "browser does not support console object"; - } -}; - -ab.version = function () { - return ab._version; -}; - -ab.PrefixMap = function () { - - var self = this; - self._index = {}; - self._rindex = {}; -}; - -ab.PrefixMap.prototype.get = function (prefix) { - - var self = this; - return self._index[prefix]; -}; - -ab.PrefixMap.prototype.set = function (prefix, uri) { - - var self = this; - self._index[prefix] = uri; - self._rindex[uri] = prefix; -}; - -ab.PrefixMap.prototype.setDefault = function (uri) { - - var self = this; - self._index[""] = uri; - self._rindex[uri] = ""; -}; - -ab.PrefixMap.prototype.remove = function (prefix) { - - var self = this; - var uri = self._index[prefix]; - if (uri) { - delete self._index[prefix]; - delete self._rindex[uri]; - } -}; - -ab.PrefixMap.prototype.resolve = function (curie, pass) { - - var self = this; - - // skip if not a CURIE - var i = curie.indexOf(":"); - if (i >= 0) { - var prefix = curie.substring(0, i); - if (self._index[prefix]) { - return self._index[prefix] + curie.substring(i + 1); - } - } - - // either pass-through or null - if (pass == true) { - return curie; - } else { - return null; - } -}; - -ab.PrefixMap.prototype.shrink = function (uri, pass) { - - var self = this; - - // skip if already a CURIE - var i = uri.indexOf(":"); - if (i == -1) { - for (var i = uri.length; i > 0; i -= 1) { - var u = uri.substring(0, i); - var p = self._rindex[u]; - if (p) { - return p + ":" + uri.substring(i); - } - } - } - - // either pass-through or null - if (pass == true) { - return uri; - } else { - return null; - } -}; - - -ab._MESSAGE_TYPEID_WELCOME = 0; -ab._MESSAGE_TYPEID_PREFIX = 1; -ab._MESSAGE_TYPEID_CALL = 2; -ab._MESSAGE_TYPEID_CALL_RESULT = 3; -ab._MESSAGE_TYPEID_CALL_ERROR = 4; -ab._MESSAGE_TYPEID_SUBSCRIBE = 5; -ab._MESSAGE_TYPEID_UNSUBSCRIBE = 6; -ab._MESSAGE_TYPEID_PUBLISH = 7; -ab._MESSAGE_TYPEID_EVENT = 8; - - -ab.CONNECTION_CLOSED = 0; -ab.CONNECTION_LOST = 1; -ab.CONNECTION_UNREACHABLE = 2; -ab.CONNECTION_UNSUPPORTED = 3; - -ab.Session = function (wsuri, onopen, onclose, options) { - - var self = this; - - self._wsuri = wsuri; - self._options = options; - self._websocket_onopen = onopen; - self._websocket_onclose = onclose; - self._websocket = null; - self._websocket_connected = false; - self._session_id = null; - self._calls = {}; - self._subscriptions = {}; - self._prefixes = new ab.PrefixMap(); - - self._txcnt = 0; - self._rxcnt = 0; - - if ("WebSocket" in window) { - // Chrome, MSIE, newer Firefox - self._websocket = new WebSocket(self._wsuri, [ab._subprotocol]); - } else if ("MozWebSocket" in window) { - // older versions of Firefox prefix the WebSocket object - self._websocket = new MozWebSocket(self._wsuri, [ab._subprotocol]); - } else { - if (onclose !== undefined) { - onclose(ab.CONNECTION_UNSUPPORTED); - return; - } else { - throw ab.browserNotSupportedMessage; - } - } - - self._websocket.onmessage = function (e) - { - if (ab._debugws) { - self._rxcnt += 1; - console.group("WS Receive"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(self._rxcnt); - console.log(e.data); - console.groupEnd(); - } - - var o = JSON.parse(e.data); - if (o[1] in self._calls) - { - if (o[0] === ab._MESSAGE_TYPEID_CALL_RESULT) { - - var dr = self._calls[o[1]]; - var r = o[2]; - - if (ab._debugrpc && dr._ab_callobj !== undefined) { - console.group("WAMP Call", dr._ab_callobj[2]); - console.timeEnd(dr._ab_tid); - console.group("Arguments"); - for (var i = 3; i < dr._ab_callobj.length; i += 1) { - var arg = dr._ab_callobj[i]; - if (arg !== undefined) { - console.log(arg); - } else { - break; - } - } - console.groupEnd(); - console.group("Result"); - console.log(r); - console.groupEnd(); - console.groupEnd(); - } - - dr.resolve(r); - } - else if (o[0] === ab._MESSAGE_TYPEID_CALL_ERROR) { - - var de = self._calls[o[1]]; - var uri = o[2]; - var desc = o[3]; - var detail = o[4]; - - if (ab._debugrpc && de._ab_callobj !== undefined) { - console.group("WAMP Call", de._ab_callobj[2]); - console.timeEnd(de._ab_tid); - console.group("Arguments"); - for (var j = 3; j < de._ab_callobj.length; j += 1) { - var arg2 = de._ab_callobj[j]; - if (arg2 !== undefined) { - console.log(arg2); - } else { - break; - } - } - console.groupEnd(); - console.group("Error"); - console.log(uri); - console.log(desc); - if (detail !== undefined) { - console.log(detail); - } - console.groupEnd(); - console.groupEnd(); - } - - if (detail !== undefined) { - de.reject(uri, desc, detail); - } else { - de.reject(uri, desc); - } - } - delete self._calls[o[1]]; - } - else if (o[0] === ab._MESSAGE_TYPEID_EVENT) - { - var subid = self._prefixes.resolve(o[1], true); - if (subid in self._subscriptions) { - - var uri2 = o[1]; - var val = o[2]; - - if (ab._debugpubsub) { - console.group("WAMP Event"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(uri2); - console.log(val); - console.groupEnd(); - } - - self._subscriptions[subid].forEach(function (callback) { - - callback(uri2, val); - }); - } - else { - // ignore unsolicited event! - } - } - else if (o[0] === ab._MESSAGE_TYPEID_WELCOME) - { - if (self._session_id === null) { - self._session_id = o[1]; - self._wamp_version = o[2]; - self._server = o[3]; - - if (ab._debugrpc || ab._debugpubsub) { - console.group("WAMP Welcome"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(self._wamp_version); - console.log(self._server); - console.groupEnd(); - } - - // only now that we have received the initial server-to-client - // welcome message, fire application onopen() hook - if (self._websocket_onopen !== null) { - self._websocket_onopen(self._session_id, self._wamp_version, self._server); - } - } else { - throw "protocol error (welcome message received more than once)"; - } - } - }; - - self._websocket.onopen = function (e) - { - // check if we can speak WAMP! - if (self._websocket.protocol !== ab._subprotocol) { - - if (typeof self._websocket.protocol === 'undefined') { - // i.e. Safari does subprotocol negotiation (broken), but then - // does NOT set the protocol attribute of the websocket object (broken) - // - if (ab._debugws) { - console.group("WS Warning"); - console.info(self._wsuri); - console.log("WebSocket object has no protocol attribute: WAMP subprotocol check skipped!"); - console.groupEnd(); - } - } - else if (self._options && self._options.skipSubprotocolCheck) { - // WAMP subprotocol check disabled by session option - // - if (ab._debugws) { - console.group("WS Warning"); - console.info(self._wsuri); - console.log("Server does not speak WAMP, but subprotocol check disabled by option!"); - console.log(self._websocket.protocol); - console.groupEnd(); - } - } else { - // we only speak WAMP .. if the server denied us this, we bail out. - // - self._websocket.close(1000, "server does not speak WAMP"); - throw "server does not speak WAMP (but '" + self._websocket.protocol + "' !)"; - } - } - if (ab._debugws) { - console.group("WAMP Connect"); - console.info(self._wsuri); - console.log(self._websocket.protocol); - console.groupEnd(); - } - self._websocket_connected = true; - }; - - self._websocket.onerror = function (e) - { - // FF fires this upon unclean closes - // Chrome does not fire this - }; - - self._websocket.onclose = function (e) - { - if (ab._debugws) { - if (self._websocket_connected) { - console.log("Autobahn connection to " + self._wsuri + " lost (code " + e.code + ", reason '" + e.reason + "', wasClean " + e.wasClean + ")."); - } else { - console.log("Autobahn could not connect to " + self._wsuri + " (code " + e.code + ", reason '" + e.reason + "', wasClean " + e.wasClean + ")."); - } - } - - // fire app callback - if (self._websocket_onclose !== undefined) { - if (self._websocket_connected) { - if (e.wasClean) { - // connection was closed cleanly (closing HS was performed) - self._websocket_onclose(ab.CONNECTION_CLOSED); - } else { - // connection was closed uncleanly (lost without closing HS) - self._websocket_onclose(ab.CONNECTION_LOST); - } - } else { - // connection could not be established in the first place - self._websocket_onclose(ab.CONNECTION_UNREACHABLE); - } - } - - // cleanup - reconnect requires a new session object! - self._websocket_connected = false; - self._wsuri = null; - self._websocket_onopen = null; - self._websocket_onclose = null; - self._websocket = null; - }; -}; - - -ab.Session.prototype._send = function (msg) { - - var self = this; - - if (!self._websocket_connected) { - throw "Autobahn not connected"; - } - - var rmsg = JSON.stringify(msg); - self._websocket.send(rmsg); - self._txcnt += 1; - - if (ab._debugws) { - console.group("WS Send"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(self._txcnt); - console.log(rmsg); - console.groupEnd(); - } -}; - - -ab.Session.prototype.close = function () { - - var self = this; - - if (!self._websocket_connected) { - throw "Autobahn not connected"; - } - - self._websocket.close(); -}; - - -ab.Session.prototype.sessionid = function () { - - var self = this; - return self._session_id; -}; - - -ab.Session.prototype.shrink = function (uri, pass) { - - var self = this; - return self._prefixes.shrink(uri, pass); -}; - - -ab.Session.prototype.resolve = function (curie, pass) { - - var self = this; - return self._prefixes.resolve(curie, pass); -}; - - -ab.Session.prototype.prefix = function (prefix, uri) { - - var self = this; - - if (self._prefixes.get(prefix) !== undefined) { - throw "prefix '" + prefix + "' already defined"; - } - - self._prefixes.set(prefix, uri); - - if (ab._debugrpc || ab._debugpubsub) { - console.group("WAMP Prefix"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(prefix); - console.log(uri); - console.groupEnd(); - } - - var msg = [ab._MESSAGE_TYPEID_PREFIX, prefix, uri]; - self._send(msg); -}; - - -ab.Session.prototype.call = function () { - - var self = this; - - var d = new when.defer(); - var callid; - while (true) { - callid = ab._newid(); - if (!(callid in self._calls)) { - break; - } - } - self._calls[callid] = d; - - var procuri = self._prefixes.shrink(arguments[0], true); - var obj = [ab._MESSAGE_TYPEID_CALL, callid, procuri]; - for (var i = 1; i < arguments.length; i += 1) { - obj.push(arguments[i]); - } - - self._send(obj); - - if (ab._debugrpc) { - d._ab_callobj = obj; - d._ab_tid = self._wsuri + " [" + self._session_id + "][" + callid + "]"; - console.time(d._ab_tid); - console.info(); - } - - return d; -}; - - -ab.Session.prototype.subscribe = function (topicuri, callback) { - - var self = this; - - // subscribe by sending WAMP message when topic not already subscribed - // - var rtopicuri = self._prefixes.resolve(topicuri, true); - if (!(rtopicuri in self._subscriptions)) { - - if (ab._debugpubsub) { - console.group("WAMP Subscribe"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(topicuri); - console.log(callback); - console.groupEnd(); - } - - var msg = [ab._MESSAGE_TYPEID_SUBSCRIBE, topicuri]; - self._send(msg); - - self._subscriptions[rtopicuri] = []; - } - - // add callback to event listeners list if not already in list - // - var i = self._subscriptions[rtopicuri].indexOf(callback); - if (i === -1) { - self._subscriptions[rtopicuri].push(callback); - } - else { - throw "callback " + callback + " already subscribed for topic " + rtopicuri; - } -}; - - -ab.Session.prototype.unsubscribe = function (topicuri, callback) { - - var self = this; - - var rtopicuri = self._prefixes.resolve(topicuri, true); - if (!(rtopicuri in self._subscriptions)) { - throw "not subscribed to topic " + rtopicuri; - } - else { - var removed; - if (callback !== undefined) { - var idx = self._subscriptions[rtopicuri].indexOf(callback); - if (idx !== -1) { - removed = callback; - self._subscriptions[rtopicuri].splice(idx, 1); - } - else { - throw "no callback " + callback + " subscribed on topic " + rtopicuri; - } - } - else { - removed = self._subscriptions[rtopicuri].slice(); - self._subscriptions[rtopicuri] = []; - } - - if (self._subscriptions[rtopicuri].length === 0) { - - delete self._subscriptions[rtopicuri]; - - if (ab._debugpubsub) { - console.group("WAMP Unsubscribe"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(topicuri); - console.log(removed); - console.groupEnd(); - } - - var msg = [ab._MESSAGE_TYPEID_UNSUBSCRIBE, topicuri]; - self._send(msg); - } - } -}; - - -ab.Session.prototype.publish = function () { - - var self = this; - - var topicuri = arguments[0]; - var event = arguments[1]; - - var excludeMe = null; - var exclude = null; - var eligible = null; - - var msg = null; - - if (arguments.length > 3) { - - if (!(arguments[2] instanceof Array)) { - throw "invalid argument type(s)"; - } - if (!(arguments[3] instanceof Array)) { - throw "invalid argument type(s)"; - } - - exclude = arguments[2]; - eligible = arguments[3]; - msg = [ab._MESSAGE_TYPEID_PUBLISH, topicuri, event, exclude, eligible]; - - } else if (arguments.length > 2) { - - if (typeof(arguments[2]) === 'boolean') { - - excludeMe = arguments[2]; - msg = [ab._MESSAGE_TYPEID_PUBLISH, topicuri, event, excludeMe]; - - } else if (arguments[2] instanceof Array) { - - exclude = arguments[2]; - msg = [ab._MESSAGE_TYPEID_PUBLISH, topicuri, event, exclude]; - - } else { - throw "invalid argument type(s)"; - } - - } else { - - msg = [ab._MESSAGE_TYPEID_PUBLISH, topicuri, event]; - } - - if (ab._debugpubsub) { - console.group("WAMP Publish"); - console.info(self._wsuri + " [" + self._session_id + "]"); - console.log(topicuri); - console.log(event); - - if (excludeMe !== null) { - console.log(excludeMe); - } else { - if (exclude !== null) { - console.log(exclude); - if (eligible !== null) { - console.log(eligible); - } - } - } - console.groupEnd(); - } - - self._send(msg); -}; diff --git a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/license.js b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/license.js deleted file mode 100644 index 32861c1872..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/autobahn/license.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @license AutobahnJS - http://autobahn.ws - * - * Copyright 2011, 2012 Tavendo GmbH. - * Licensed under the MIT License. - * See license text at http://www.opensource.org/licenses/mit-license.php - * - * AutobahnJS includes code from: - * when - http://cujojs.com - * - * (c) copyright B Cavalier & J Hann - * Licensed under the MIT License at: - * http://www.opensource.org/licenses/mit-license.php - */ diff --git a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/version.txt b/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/version.txt deleted file mode 100644 index a918a2aa18..0000000000 --- a/app/Vendor/Ratchet/vendor/tavendo/AutobahnJS/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.6.0 diff --git a/app/Vendor/WideImage/Canvas.php b/app/Vendor/WideImage/Canvas.php deleted file mode 100755 index 1b9ad5b181..0000000000 --- a/app/Vendor/WideImage/Canvas.php +++ /dev/null @@ -1,167 +0,0 @@ -handle = $img->getHandle(); - $this->image = $img; - } - - /** - * Sets the active font. Can be an instance of - * WideImage_Font_TTF, WideImage_Font_PS, or WideImage_Font_GDF. - * - * - * - * - * @param object $font Font object to set for writeText() - */ - function setFont($font) - { - $this->font = $font; - } - - /** - * Creates and sets the current font - * - * The supported font types are: TTF/OTF, PS, and GDF. - * Font type is detected from the extension. If the $file parameter doesn't have an extension, TTF font is presumed. - * - * Note: not all parameters are supported by all fonts. - * - * @param string $file Font file name (string) - * @param int $size Font size (supported for TTF/OTF and PS fonts, ignored for GDF) - * @param int $color Text color - * @param int $bgcolor Background color (supported only for PS font, ignored for TTF and PS) - * @return mixed One of the WideImage_Font_* objects - */ - function useFont($file, $size = 12, $color = 0, $bgcolor = null) - { - $p = strrpos($file, '.'); - if ($p === false || $p < strlen($file) - 4) - $ext = 'ttf'; - else - $ext = strtolower(substr($file, $p + 1)); - - if ($ext == 'ttf' || $ext == 'otf') - $font = new WideImage_Font_TTF($file, $size, $color); - elseif ($ext == 'ps') - $font = new WideImage_Font_PS($file, $size, $color, $bgcolor); - elseif ($ext == 'gdf') - $font = new WideImage_Font_GDF($file, $color); - else - throw new WideImage_InvalidFontFileException("'$file' appears to be an invalid font file."); - - $this->setFont($font); - return $font; - } - - /** - * Write text on the image at specified position - * - * You must set a font with a call to WideImage_Canvas::setFont() prior to writing text to the image. - * - * Smart coordinates are supported for $x and $y arguments, but currently only for TTF/OTF fonts. - * - * Example: - * - * $img = WideImage::load('pic.jpg'); - * $canvas = $img->getCanvas(); - * $canvas->useFont('Verdana.ttf', 16, $img->allocateColor(255, 0, 0)); - * $canvas->writeText('right', 'bottom', 'www.website.com'); - * - * - * @param int $x Left - * @param int $y Top - * @param string $text Text to write - * @param int $angle The angle, defaults to 0 - */ - function writeText($x, $y, $text, $angle = 0) - { - if ($this->font === null) - throw new WideImage_NoFontException("Can't write text without a font."); - - $angle = - floatval($angle); - if ($angle < 0) - $angle = 360 + $angle; - $angle = $angle % 360; - - $this->font->writeText($this->image, $x, $y, $text, $angle); - } - - /** - * A magic method that allows you to call any PHP function that starts with "image". - * - * This is a shortcut to call custom functions on the image handle. - * - * Example: - * - * $img = WideImage::load('pic.jpg'); - * $canvas = $img->getCanvas(); - * $canvas->filledRect(10, 10, 20, 30, $img->allocateColor(0, 0, 0)); - * $canvas->line(60, 80, 30, 100, $img->allocateColor(255, 0, 0)); - * - */ - function __call($method, $params) - { - if (function_exists('image' . $method)) - { - array_unshift($params, $this->handle); - call_user_func_array('image' . $method, $params); - } - else - throw new WideImage_InvalidCanvasMethodException("Function doesn't exist: image{$method}."); - } - } diff --git a/app/Vendor/WideImage/Coordinate.php b/app/Vendor/WideImage/Coordinate.php deleted file mode 100755 index a3f6f63732..0000000000 --- a/app/Vendor/WideImage/Coordinate.php +++ /dev/null @@ -1,208 +0,0 @@ - 'operand', 'value' => trim($current_operand)); - - $current_operand = ''; - $flush_operand = false; - } - - if ($flush_operator) - { - $tokens[] = array('type' => 'operator', 'value' => $char); - $flush_operator = false; - } - } - return $tokens; - } - - /** - * Evaluates the $coord relatively to $dim - * - * @param string $coord A numeric value or percent string - * @param int $dim Dimension - * @param int $sec_dim Secondary dimension (for align) - * @return int Calculated value - */ - static function evaluate($coord, $dim, $sec_dim = null) - { - $comp_regex = implode('|', self::$coord_align) . '|' . implode('|', self::$coord_numeric); - if (preg_match("/^([+-])?({$comp_regex})$/", $coord, $matches)) - { - $sign = intval($matches[1] . "1"); - $val = $matches[2]; - if (in_array($val, self::$coord_align)) - { - if ($sec_dim === null) - { - switch ($val) - { - case 'left': - case 'top': - return 0; - break; - case 'center': - case 'middle': - return $sign * intval($dim / 2); - break; - case 'right': - case 'bottom': - return $sign * $dim; - break; - default: - return null; - } - } - else - { - switch ($val) - { - case 'left': - case 'top': - return 0; - break; - case 'center': - case 'middle': - return $sign * intval($dim / 2 - $sec_dim / 2); - break; - case 'right': - case 'bottom': - return $sign * ($dim - $sec_dim); - break; - default: - return null; - } - } - } - elseif (substr($val, -1) === '%') - return intval(round($sign * $dim * floatval(str_replace('%', '', $val)) / 100)); - else - return $sign * intval(round($val)); - } - } - - /** - * Calculates and fixes a smart coordinate into a numeric value - * - * @param mixed $value Smart coordinate, relative to $dim - * @param int $dim Coordinate to which $value is relative - * @param int $sec_dim Secondary dimension (for align) - * @return int Calculated value - */ - static function fix($value, $dim, $sec_dim = null) - { - $coord_tokens = self::parse($value); - - if (count($coord_tokens) == 0 || $coord_tokens[count($coord_tokens) - 1]['type'] != 'operand') - throw new WideImage_InvalidCoordinateException("Couldn't parse coordinate '$value' properly."); - - $value = 0; - $operation = 1; - foreach ($coord_tokens as $token) - { - if ($token['type'] == 'operand') - { - $operand_value = self::evaluate($token['value'], $dim, $sec_dim); - if ($operation == 1) - $value = $value + $operand_value; - elseif ($operation == -1) - $value = $value - $operand_value; - else - throw new WideImage_InvalidCoordinateException("Invalid coordinate syntax."); - - $operation = 0; - } - elseif ($token['type'] == 'operator') - { - if ($token['value'] == '-') - { - if ($operation == 0) - $operation = -1; - else - $operation = $operation * -1; - } - elseif ($token['value'] == '+') - { - if ($operation == 0) - $operation = '1'; - } - } - } - return $value; - } - } diff --git a/app/Vendor/WideImage/Exception.php b/app/Vendor/WideImage/Exception.php deleted file mode 100755 index fa9b8da0c5..0000000000 --- a/app/Vendor/WideImage/Exception.php +++ /dev/null @@ -1,31 +0,0 @@ -= 1 && $face <= 5) - $this->font = $face; - else - $this->font = imageloadfont($face); - $this->color = $color; - } - - function writeText($image, $x, $y, $text) - { - imagestring($image->getHandle(), $this->font, $x, $y, $text, $this->color); - } - } diff --git a/app/Vendor/WideImage/Font/PS.php b/app/Vendor/WideImage/Font/PS.php deleted file mode 100755 index 1e660e4d67..0000000000 --- a/app/Vendor/WideImage/Font/PS.php +++ /dev/null @@ -1,60 +0,0 @@ -handle = imagepsloadfont($file); - $this->size = $size; - $this->color = $color; - if ($bgcolor === null) - $this->bgcolor = $color; - else - $this->color = $color; - } - - function writeText($image, $x, $y, $text, $angle = 0) - { - if ($image->isTrueColor()) - $image->alphaBlending(true); - - imagepstext($image->getHandle(), $text, $this->handle, $this->size, $this->color, $this->bgcolor, $x, $y, 0, 0, $angle, 4); - } - - function __destruct() - { - imagepsfreefont($this->handle); - $this->handle = null; - } - } diff --git a/app/Vendor/WideImage/Font/TTF.php b/app/Vendor/WideImage/Font/TTF.php deleted file mode 100755 index 4da97cb05f..0000000000 --- a/app/Vendor/WideImage/Font/TTF.php +++ /dev/null @@ -1,75 +0,0 @@ -face = $face; - $this->size = $size; - $this->color = $color; - } - - /** - * Writes text onto an image - * - * @param WideImage_Image $image - * @param mixed $x smart coordinate - * @param mixed $y smart coordinate - * @param string $text - * @param int $angle Angle in degrees clockwise - */ - function writeText($image, $x, $y, $text, $angle = 0) - { - if ($image->isTrueColor()) - $image->alphaBlending(true); - - $box = imageftbbox($this->size, $angle, $this->face, $text); - $obox = array( - 'left' => min($box[0], $box[2], $box[4], $box[6]), - 'top' => min($box[1], $box[3], $box[5], $box[7]), - 'right' => max($box[0], $box[2], $box[4], $box[6]) - 1, - 'bottom' => max($box[1], $box[3], $box[5], $box[7]) - 1 - ); - $obox['width'] = abs($obox['left']) + abs($obox['right']); - $obox['height'] = abs($obox['top']) + abs($obox['bottom']); - - $x = WideImage_Coordinate::fix($x, $image->getWidth(), $obox['width']); - $y = WideImage_Coordinate::fix($y, $image->getHeight(), $obox['height']); - - $fixed_x = $x - $obox['left']; - $fixed_y = $y - $obox['top']; - - imagettftext($image->getHandle(), $this->size, $angle, $fixed_x, $fixed_y, $this->color, $this->face, $text); - } - } diff --git a/app/Vendor/WideImage/Image.php b/app/Vendor/WideImage/Image.php deleted file mode 100755 index 3a99280008..0000000000 --- a/app/Vendor/WideImage/Image.php +++ /dev/null @@ -1,964 +0,0 @@ -handle = $handle; - } - - /** - * Cleanup - * - * Destroys the handle via WideImage_Image::destroy() when called by the GC. - */ - function __destruct() - { - $this->destroy(); - } - - /** - * This method destroy the image handle, and releases the image resource. - * - * After this is called, the object doesn't hold a valid image any more. - * No operation should be called after that. - */ - function destroy() - { - if ($this->isValid() && !$this->handleReleased) - imagedestroy($this->handle); - - $this->handle = null; - } - - /** - * Returns the GD image resource - * - * @return resource GD image resource - */ - function getHandle() - { - return $this->handle; - } - - /** - * @return bool True, if the image object holds a valid GD image, false otherwise - */ - function isValid() - { - return WideImage::isValidImageHandle($this->handle); - } - - /** - * Releases the handle - */ - function releaseHandle() - { - $this->handleReleased = true; - } - - /** - * Saves an image to a file - * - * The file type is recognized from the $uri. If you save to a GIF8, truecolor images - * are automatically converted to palette. - * - * This method supports additional parameters: quality (for jpeg images) and - * compression quality and filters (for png images). See http://www.php.net/imagejpeg and - * http://www.php.net/imagepng for details. - * - * Examples: - * - * // save to a GIF - * $image->saveToFile('image.gif'); - * - * // save to a PNG with compression=7 and no filters - * $image->saveToFile('image.png', 7, PNG_NO_FILTER); - * - * // save to a JPEG with quality=80 - * $image->saveToFile('image.jpg', 80); - * - * // save to a JPEG with default quality=100 - * $image->saveToFile('image.jpg'); - * - * - * @param string $uri File location - */ - function saveToFile($uri) - { - $mapper = WideImage_MapperFactory::selectMapper($uri, null); - $args = func_get_args(); - array_unshift($args, $this->getHandle()); - $res = call_user_func_array(array($mapper, 'save'), $args); - if (!$res) - throw new WideImage_UnknownErrorWhileMappingException(get_class($mapper) . " returned an invalid result while saving to $uri"); - } - - /** - * Returns binary string with image data in format specified by $format - * - * Additional parameters may be passed to the function. See WideImage_Image::saveToFile() for more details. - * - * @param string $format The format of the image - * @return string The binary image data in specified format - */ - function asString($format) - { - ob_start(); - $args = func_get_args(); - $args[0] = null; - array_unshift($args, $this->getHandle()); - - $mapper = WideImage_MapperFactory::selectMapper(null, $format); - $res = call_user_func_array(array($mapper, 'save'), $args); - if (!$res) - throw new WideImage_UnknownErrorWhileMappingException(get_class($mapper) . " returned an invalid result while writing the image data"); - - return ob_get_clean(); - } - - /** - * Output a header to browser. - * - * @param $name Name of the header - * @param $data Data - */ - protected function writeHeader($name, $data) - { - header($name . ": " . $data); - } - - /** - * Outputs the image to browser - * - * Sets headers Content-length and Content-type, and echoes the image in the specified format. - * All other headers (such as Content-disposition) must be added manually. - * - * Example: - * - * WideImage::load('image1.png')->resize(100, 100)->output('gif'); - * - * - * @param string $format Image format - */ - function output($format) - { - $args = func_get_args(); - $data = call_user_func_array(array($this, 'asString'), $args); - - $this->writeHeader('Content-length', strlen($data)); - $this->writeHeader('Content-type', WideImage_MapperFactory::mimeType($format)); - echo $data; - } - - /** - * @return int Image width - */ - function getWidth() - { - return imagesx($this->handle); - } - - /** - * @return int Image height - */ - function getHeight() - { - return imagesy($this->handle); - } - - /** - * Allocate a color by RGB values. - * - * @param mixed $R Red-component value or an RGB array (with red, green, blue keys) - * @param int $G If $R is int, this is the green component - * @param int $B If $R is int, this is the blue component - * @return int Image color index - */ - function allocateColor($R, $G = null, $B = null) - { - if (is_array($R)) - return imageColorAllocate($this->handle, $R['red'], $R['green'], $R['blue']); - else - return imageColorAllocate($this->handle, $R, $G, $B); - } - - /** - * @return bool True if the image is transparent, false otherwise - */ - function isTransparent() - { - return $this->getTransparentColor() >= 0; - } - - /** - * @return int Transparent color index - */ - function getTransparentColor() - { - return imagecolortransparent($this->handle); - } - - /** - * Sets the current transparent color index. Only makes sense for palette images (8-bit). - * - * @param int $color Transparent color index - */ - function setTransparentColor($color) - { - return imagecolortransparent($this->handle, $color); - } - - /** - * Returns a RGB array of the transparent color or null if none. - * - * @return mixed Transparent color RGBA array - */ - function getTransparentColorRGB() - { - $total = imagecolorstotal($this->handle); - $tc = $this->getTransparentColor(); - - if ($tc >= $total && $total > 0) - return null; - else - return $this->getColorRGB($tc); - } - - /** - * Returns a RGBA array for pixel at $x, $y - * - * @param int $x - * @param int $y - * @return array RGB array - */ - function getRGBAt($x, $y) - { - return $this->getColorRGB($this->getColorAt($x, $y)); - } - - /** - * Writes a pixel at the designated coordinates - * - * Takes an associative array of colours and uses getExactColor() to - * retrieve the exact index color to write to the image with. - * - * @param int $x - * @param int $y - * @param array $color - */ - function setRGBAt($x, $y, $color) - { - $this->setColorAt($x, $y, $this->getExactColor($color)); - } - - /** - * Returns a color's RGB - * - * @param int $colorIndex Color index - * @return mixed RGBA array for a color with index $colorIndex - */ - function getColorRGB($colorIndex) - { - return imageColorsForIndex($this->handle, $colorIndex); - } - - /** - * Returns an index of the color at $x, $y - * - * @param int $x - * @param int $y - * @return int Color index for a pixel at $x, $y - */ - function getColorAt($x, $y) - { - return imagecolorat($this->handle, $x, $y); - } - - /** - * Set the color index $color to a pixel at $x, $y - * - * @param int $x - * @param int $y - * @param int $color Color index - */ - function setColorAt($x, $y, $color) - { - return imagesetpixel($this->handle, $x, $y, $color); - } - - /** - * Returns closest color index that matches the given RGB value. Uses - * PHP's imagecolorclosest() - * - * @param mixed $R Red or RGBA array - * @param int $G Green component (or null if $R is an RGB array) - * @param int $B Blue component (or null if $R is an RGB array) - * @return int Color index - */ - function getClosestColor($R, $G = null, $B = null) - { - if (is_array($R)) - return imagecolorclosest($this->handle, $R['red'], $R['green'], $R['blue']); - else - return imagecolorclosest($this->handle, $R, $G, $B); - } - - /** - * Returns the color index that exactly matches the given RGB value. Uses - * PHP's imagecolorexact() - * - * @param mixed $R Red or RGBA array - * @param int $G Green component (or null if $R is an RGB array) - * @param int $B Blue component (or null if $R is an RGB array) - * @return int Color index - */ - function getExactColor($R, $G = null, $B = null) - { - if (is_array($R)) - return imagecolorexact($this->handle, $R['red'], $R['green'], $R['blue']); - else - return imagecolorexact($this->handle, $R, $G, $B); - } - - /** - * Copies transparency information from $sourceImage. Optionally fills - * the image with the transparent color at (0, 0). - * - * @param object $sourceImage - * @param bool $fill True if you want to fill the image with transparent color - */ - function copyTransparencyFrom($sourceImage, $fill = true) - { - if ($sourceImage->isTransparent()) - { - $rgba = $sourceImage->getTransparentColorRGB(); - if ($rgba === null) - return; - - if ($this->isTrueColor()) - { - $rgba['alpha'] = 127; - $color = $this->allocateColorAlpha($rgba); - } - else - $color = $this->allocateColor($rgba); - - $this->setTransparentColor($color); - if ($fill) - $this->fill(0, 0, $color); - } - } - - /** - * Fill the image at ($x, $y) with color index $color - * - * @param int $x - * @param int $y - * @param int $color - */ - function fill($x, $y, $color) - { - return imagefill($this->handle, $x, $y, $color); - } - - /** - * Used internally to create Operation objects - * - * @param string $name - * @return object - */ - protected function getOperation($name) - { - return WideImage_OperationFactory::get($name); - } - - /** - * Returns the image's mask - * - * Mask is a greyscale image where the shade defines the alpha channel (black = transparent, white = opaque). - * - * For opaque images (JPEG), the result will be white. For images with single-color transparency (GIF, 8-bit PNG), - * the areas with the transparent color will be black. For images with alpha channel transparenct, - * the result will be alpha channel. - * - * @return WideImage_Image An image mask - **/ - function getMask() - { - return $this->getOperation('GetMask')->execute($this); - } - - /** - * Resize the image to given dimensions. - * - * $width and $height are both smart coordinates. This means that you can pass any of these values in: - * - positive or negative integer (100, -20, ...) - * - positive or negative percent string (30%, -15%, ...) - * - complex coordinate (50% - 20, 15 + 30%, ...) - * - * If $width is null, it's calculated proportionally from $height, and vice versa. - * - * Example (resize to half-size): - * - * $smaller = $image->resize('50%'); - * - * $smaller = $image->resize('100', '100', 'inside', 'down'); - * is the same as - * $smaller = $image->resizeDown(100, 100, 'inside'); - * - * - * @param mixed $width The new width (smart coordinate), or null. - * @param mixed $height The new height (smart coordinate), or null. - * @param string $fit 'inside', 'outside', 'fill' - * @param string $scale 'down', 'up', 'any' - * @return WideImage_Image The resized image - */ - function resize($width = null, $height = null, $fit = 'inside', $scale = 'any') - { - return $this->getOperation('Resize')->execute($this, $width, $height, $fit, $scale); - } - - /** - * Same as WideImage_Image::resize(), but the image is only applied if it is larger then the given dimensions. - * Otherwise, the resulting image retains the source's dimensions. - * - * @param int $width New width, smart coordinate - * @param int $height New height, smart coordinate - * @param string $fit 'inside', 'outside', 'fill' - * @return WideImage_Image resized image - */ - function resizeDown($width = null, $height = null, $fit = 'inside') - { - return $this->resize($width, $height, $fit, 'down'); - } - - /** - * Same as WideImage_Image::resize(), but the image is only applied if it is smaller then the given dimensions. - * Otherwise, the resulting image retains the source's dimensions. - * - * @param int $width New width, smart coordinate - * @param int $height New height, smart coordinate - * @param string $fit 'inside', 'outside', 'fill' - * @return WideImage_Image resized image - */ - function resizeUp($width = null, $height = null, $fit = 'inside') - { - return $this->resize($width, $height, $fit, 'up'); - } - - /** - * Rotate the image for angle $angle clockwise. - * - * Preserves transparency. Has issues when saving to a BMP. - * - * @param int $angle Angle in degrees, clock-wise - * @param int $bgColor color of the new background - * @param bool $ignoreTransparent - * @return WideImage_Image The rotated image - */ - function rotate($angle, $bgColor = null, $ignoreTransparent = true) - { - return $this->getOperation('Rotate')->execute($this, $angle, $bgColor, $ignoreTransparent); - } - - /** - * This method lays the overlay (watermark) on the image. - * - * Hint: if the overlay is a truecolor image with alpha channel, you should leave $pct at 100. - * - * This operation supports alignment notation in coordinates: - * - * $watermark = WideImage::load('logo.gif'); - * $base = WideImage::load('picture.jpg'); - * $result = $base->merge($watermark, "right - 10", "bottom - 10", 50); - * // applies a logo aligned to bottom-right corner with a 10 pixel margin - * - * - * @param WideImage_Image $overlay The overlay image - * @param mixed $left Left position of the overlay, smart coordinate - * @param mixed $top Top position of the overlay, smart coordinate - * @param int $pct The opacity of the overlay - * @return WideImage_Image The merged image - */ - function merge($overlay, $left = 0, $top = 0, $pct = 100) - { - return $this->getOperation('Merge')->execute($this, $overlay, $left, $top, $pct); - } - - /** - * Resizes the canvas of the image, but doesn't scale the content of the image - * - * This operation creates an empty canvas with dimensions $width x $height, filled with - * background color $bg_color and draws the original image onto it at position [$pos_x, $pos_y]. - * - * Arguments $width, $height, $pos_x and $pos_y are all smart coordinates. $width and $height are - * relative to the current image size, $pos_x and $pos_y are relative to the newly calculated - * canvas size. This can be confusing, but it makes sense. See the example below. - * - * The example below loads a 100x150 image and then resizes its canvas to 200% x 100%+20 - * (which evaluates to 200x170). The image is placed at position [10, center+20], which evaluates to [10, 30]. - * - * $image = WideImage::load('someimage.jpg'); // 100x150 - * $white = $image->allocateColor(255, 255, 255); - * $image->resizeCanvas('200%', '100% + 20', 10, 'center+20', $white); - * - * - * The parameter $merge defines whether the original image should be merged onto the new canvas. - * This means it blends transparent color and alpha colors into the background color. If set to false, - * the original image is just copied over, preserving the transparency/alpha information. - * - * You can set the $scale parameter to limit when to resize the canvas. For example, if you want - * to resize the canvas only if the image is smaller than the new size, but leave the image intact - * if it's larger, set it to 'up'. Likewise, if you want to shrink the canvas, but don't want to - * change images that are already smaller, set it to 'down'. - * - * @param mixed $width Width of the new canvas (smart coordinate, relative to current image width) - * @param mixed $height Height of the new canvas (smart coordinate, relative to current image height) - * @param mixed $pos_x x-position of the image (smart coordinate, relative to the new width) - * @param mixed $pos_y y-position of the image (smart coordinate, relative to the new height) - * @param int $bg_color Background color (created with allocateColor or allocateColorAlpha), defaults to null (tries to use a transparent color) - * @param string $scale Possible values: 'up' (enlarge only), 'down' (downsize only), 'any' (resize precisely to $width x $height). Defaults to 'any'. - * @param bool $merge Merge the original image (flatten alpha channel and transparency) or copy it over (preserve). Defaults to false. - * @return WideImage_Image The resulting image with resized canvas - */ - function resizeCanvas($width, $height, $pos_x, $pos_y, $bg_color = null, $scale = 'any', $merge = false) - { - return $this->getOperation('ResizeCanvas')->execute($this, $width, $height, $pos_x, $pos_y, $bg_color, $scale, $merge); - } - - /** - * Returns an image with round corners - * - * You can either set the corners' color or set them transparent. - * - * Note on $smoothness: 1 means jagged edges, 2 is much better, more than 4 doesn't noticeably improve the quality. - * Rendering becomes increasingly slower if you increase smoothness. - * - * Example: - * - * $nice = $ugly->roundCorners(20, $ugly->allocateColor(255, 0, 0), 2); - * - * - * Use $corners parameter to specify which corners to draw rounded. Possible values are - * WideImage::SIDE_TOP_LEFT, WideImage::SIDE_TOP, - * WideImage::SIDE_TOP_RIGHT, WideImage::SIDE_RIGHT, - * WideImage::SIDE_BOTTOM_RIGHT, WideImage::SIDE_BOTTOM, - * WideImage::SIDE_BOTTOM_LEFT, WideImage::SIDE_LEFT, and WideImage::SIDE_ALL. - * You can specify any combination of corners with a + operation, see example below. - * - * Example: - * - * $white = $image->allocateColor(255, 255, 255); - * $diagonal_corners = $image->roundCorners(15, $white, 2, WideImage::SIDE_TOP_LEFT + WideImage::SIDE_BOTTOM_RIGHT); - * $right_corners = $image->roundCorners(15, $white, 2, WideImage::SIDE_RIGHT); - * - * - * @param int $radius Radius of the corners - * @param int $color The color of corners. If null, corners are rendered transparent (slower than using a solid color). - * @param int $smoothness Specify the level of smoothness. Suggested values from 1 to 4. - * @param int $corners Specify which corners to draw (defaults to WideImage::SIDE_ALL = all corners) - * @return WideImage_Image The resulting image with round corners - */ - function roundCorners($radius, $color = null, $smoothness = 2, $corners = 255) - { - return $this->getOperation('RoundCorners')->execute($this, $radius, $color, $smoothness, $corners); - } - - /** - * Returns an image with applied mask - * - * A mask is a grayscale image, where the shade determines the alpha channel. Black is fully transparent - * and white is fully opaque. - * - * @param WideImage_Image $mask The mask image, greyscale - * @param mixed $left Left coordinate, smart coordinate - * @param mixed $top Top coordinate, smart coordinate - * @return WideImage_Image The resulting image - **/ - function applyMask($mask, $left = 0, $top = 0) - { - return $this->getOperation('ApplyMask')->execute($this, $mask, $left, $top); - } - - /** - * Applies a filter - * - * @param int $filter One of the IMG_FILTER_* constants - * @param int $arg1 - * @param int $arg2 - * @param int $arg3 - * @param int $arg4 - * @return WideImage_Image - */ - function applyFilter($filter, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null) - { - return $this->getOperation('ApplyFilter')->execute($this, $filter, $arg1, $arg2, $arg3, $arg4); - } - - /** - * Applies convolution matrix with imageconvolution() - * - * @param array $matrix - * @param float $div - * @param float $offset - * @return WideImage_Image - */ - function applyConvolution($matrix, $div, $offset) - { - return $this->getOperation('ApplyConvolution')->execute($this, $matrix, $div, $offset); - } - - /** - * Returns a cropped rectangular portion of the image - * - * If the rectangle specifies area that is out of bounds, it's limited to the current image bounds. - * - * Examples: - * - * $cropped = $img->crop(10, 10, 150, 200); // crops a 150x200 rect at (10, 10) - * $cropped = $img->crop(-100, -50, 100, 50); // crops a 100x50 rect at the right-bottom of the image - * $cropped = $img->crop('25%', '25%', '50%', '50%'); // crops a 50%x50% rect from the center of the image - * - * - * This operation supports alignment notation in left/top coordinates. - * Example: - * - * $cropped = $img->crop("right", "bottom", 100, 200); // crops a 100x200 rect from right bottom - * $cropped = $img->crop("center", "middle", 50, 30); // crops a 50x30 from the center of the image - * - * - * @param mixed $left Left-coordinate of the crop rect, smart coordinate - * @param mixed $top Top-coordinate of the crop rect, smart coordinate - * @param mixed $width Width of the crop rect, smart coordinate - * @param mixed $height Height of the crop rect, smart coordinate - * @return WideImage_Image The cropped image - **/ - function crop($left = 0, $top = 0, $width = '100%', $height = '100%') - { - return $this->getOperation('Crop')->execute($this, $left, $top, $width, $height); - } - - /** - * Performs an auto-crop on the image - * - * The image is auto-cropped from each of four sides. All sides are - * scanned for pixels that differ from $base_color for more than - * $rgb_threshold in absolute RGB difference. If more than $pixel_cutoff - * differentiating pixels are found, that line is considered to be the crop line for the side. - * If the line isn't different enough, the algorithm procedes to the next line - * towards the other edge of the image. - * - * When the crop rectangle is found, it's enlarged by the $margin value on each of the four sides. - * - * @param int $margin Margin for the crop rectangle, can be negative. - * @param int $rgb_threshold RGB difference which still counts as "same color". - * @param int $pixel_cutoff How many pixels need to be different to mark a cut line. - * @param int $base_color The base color index. If none specified (or null given), left-top pixel is used. - * @return WideImage_Image The cropped image - */ - function autoCrop($margin = 0, $rgb_threshold = 0, $pixel_cutoff = 1, $base_color = null) - { - return $this->getOperation('AutoCrop')->execute($this, $margin, $rgb_threshold, $pixel_cutoff, $base_color); - } - - /** - * Returns a negative of the image - * - * This operation differs from calling WideImage_Image::applyFilter(IMG_FILTER_NEGATIVE), because it's 8-bit and transparency safe. - * This means it will return an 8-bit image, if the source image is 8-bit. If that 8-bit image has a palette transparency, - * the resulting image will keep transparency. - * - * @return WideImage_Image negative of the image - */ - function asNegative() - { - return $this->getOperation('AsNegative')->execute($this); - } - - /** - * Returns a grayscale copy of the image - * - * @return WideImage_Image grayscale copy - **/ - function asGrayscale() - { - return $this->getOperation('AsGrayscale')->execute($this); - } - - /** - * Returns a mirrored copy of the image - * - * @return WideImage_Image Mirrored copy - **/ - function mirror() - { - return $this->getOperation('Mirror')->execute($this); - } - - /** - * Applies the unsharp filter - * - * @param float $amount - * @param float $radius - * @param float $threshold - * @return WideImage_Image Unsharpened copy of the image - **/ - function unsharp($amount, $radius, $threshold) - { - return $this->getOperation('Unsharp')->execute($this, $amount, $radius, $threshold); - } - - /** - * Returns a flipped (mirrored over horizontal line) copy of the image - * - * @return WideImage_Image Flipped copy - **/ - function flip() - { - return $this->getOperation('Flip')->execute($this); - } - - /** - * Corrects gamma on the image - * - * @param float $inputGamma - * @param float $outputGamma - * @return WideImage_Image Image with corrected gamma - **/ - function correctGamma($inputGamma, $outputGamma) - { - return $this->getOperation('CorrectGamma')->execute($this, $inputGamma, $outputGamma); - } - - /** - * Adds noise to the image - * - * @author Tomasz Kapusta - * - * @param int $amount Number of noise pixels to add - * @param string $type Type of noise 'salt&pepper', 'color' or 'mono' - * @return WideImage_Image Image with noise added - **/ - function addNoise($amount, $type) - { - return $this->getOperation('AddNoise')->execute($this, $amount, $type); - } - - /** - * Used internally to execute operations - * - * @param string $name - * @param array $args - * @return WideImage_Image - */ - function __call($name, $args) - { - $op = $this->getOperation($name); - array_unshift($args, $this); - return call_user_func_array(array($op, 'execute'), $args); - } - - /** - * Returns an image in GIF or PNG format - * - * @return string - */ - function __toString() - { - if ($this->isTransparent()) - return $this->asString('gif'); - else - return $this->asString('png'); - } - - /** - * Returns a copy of the image object - * - * @return WideImage_Image The copy - **/ - function copy() - { - $dest = $this->doCreate($this->getWidth(), $this->getHeight()); - $dest->copyTransparencyFrom($this, true); - $this->copyTo($dest, 0, 0); - return $dest; - } - - /** - * Copies this image onto another image - * - * @param WideImage_Image $dest - * @param int $left - * @param int $top - **/ - function copyTo($dest, $left = 0, $top = 0) - { - if (!imagecopy($dest->getHandle(), $this->handle, $left, $top, 0, 0, $this->getWidth(), $this->getHeight())) - throw new WideImage_GDFunctionResultException("imagecopy() returned false"); - } - - /** - * Returns the canvas object - * - * The Canvas object can be used to draw text and shapes on the image - * - * Examples: - * - * $img = WideImage::load('pic.jpg); - * $canvas = $img->getCanvas(); - * $canvas->useFont('arial.ttf', 15, $img->allocateColor(200, 220, 255)); - * $canvas->writeText(10, 50, "Hello world!"); - * - * $canvas->filledRectangle(10, 10, 80, 40, $img->allocateColor(255, 127, 255)); - * $canvas->line(60, 80, 30, 100, $img->allocateColor(255, 0, 0)); - * $img->saveToFile('new.png'); - * - * - * @return WideImage_Canvas The Canvas object - **/ - function getCanvas() - { - if ($this->canvas == null) - $this->canvas = new WideImage_Canvas($this); - return $this->canvas; - } - - /** - * Returns true if the image is true-color, false otherwise - * - * @return bool - **/ - abstract function isTrueColor(); - - /** - * Returns a true-color copy of the image - * - * @return WideImage_TrueColorImage - **/ - abstract function asTrueColor(); - - /** - * Returns a palette copy (8bit) of the image - * - * @param int $nColors Number of colors in the resulting image, more than 0, less or equal to 255 - * @param bool $dither Use dithering or not - * @param bool $matchPalette Set to true to use imagecolormatch() to match the resulting palette more closely to the original image - * @return WideImage_Image - **/ - abstract function asPalette($nColors = 255, $dither = null, $matchPalette = true); - - /** - * Retrieve an image with selected channels - * - * Examples: - * - * $channels = $img->getChannels('red', 'blue'); - * $channels = $img->getChannels('alpha', 'green'); - * $channels = $img->getChannels(array('green', 'blue')); - * - * - * @return WideImage_Image - **/ - abstract function getChannels(); - - /** - * Returns an image without an alpha channel - * - * @return WideImage_Image - **/ - abstract function copyNoAlpha(); - - /** - * Returns an array of serializable protected variables. Called automatically upon serialize(). - * - * @return array - */ - function __sleep() - { - $this->sdata = $this->asString('png'); - return array('sdata', 'handleReleased'); - } - - /** - * Restores an image from serialization. Called automatically upon unserialize(). - */ - function __wakeup() - { - $temp_image = WideImage::loadFromString($this->sdata); - $temp_image->releaseHandle(); - $this->handle = $temp_image->handle; - $temp_image = null; - $this->sdata = null; - } - } diff --git a/app/Vendor/WideImage/Mapper/BMP.php b/app/Vendor/WideImage/Mapper/BMP.php deleted file mode 100755 index 065f50e5cb..0000000000 --- a/app/Vendor/WideImage/Mapper/BMP.php +++ /dev/null @@ -1,51 +0,0 @@ - 'JPEG', - 'image/jpeg' => 'JPEG', - 'image/pjpeg' => 'JPEG', - 'image/gif' => 'GIF', - 'image/png' => 'PNG' - ); - - /** - * Returns a mapper, based on the $uri and $format - * - * @param string $uri File URI - * @param string $format File format (extension or mime-type) or null - * @return WideImage_Mapper - **/ - static function selectMapper($uri, $format = null) - { - $format = self::determineFormat($uri, $format); - - if (array_key_exists($format, self::$mappers)) - return self::$mappers[$format]; - - $mapperClassName = 'WideImage_Mapper_' . $format; - - if (!class_exists($mapperClassName, false)) - { - $mapperFileName = WideImage::path() . 'Mapper/' . $format . '.php'; - if (file_exists($mapperFileName)) - require_once $mapperFileName; - } - - if (class_exists($mapperClassName)) - { - self::$mappers[$format] = new $mapperClassName(); - return self::$mappers[$format]; - } - - throw new WideImage_UnsupportedFormatException("Format '{$format}' is not supported."); - } - - static function registerMapper($mapper_class_name, $mime_type, $extension) - { - self::$customMappers[$mime_type] = $mapper_class_name; - self::$mimeTable[$mime_type] = $extension; - } - - static function getCustomMappers() - { - return self::$customMappers; - } - - static function determineFormat($uri, $format = null) - { - if ($format == null) - $format = self::extractExtension($uri); - - // mime-type match - if (preg_match('~[a-z]*/[a-z-]*~i', $format)) - if (isset(self::$mimeTable[strtolower($format)])) - { - return self::$mimeTable[strtolower($format)]; - } - - // clean the string - $format = strtoupper(preg_replace('/[^a-z0-9_-]/i', '', $format)); - if ($format == 'JPG') - $format = 'JPEG'; - - return $format; - } - - static function mimeType($format) - { - return array_search(strtoupper($format), self::$mimeTable); - } - - static function extractExtension($uri) - { - $p = strrpos($uri, '.'); - if ($p === false) - return ''; - else - return substr($uri, $p + 1); - } - } diff --git a/app/Vendor/WideImage/Operation/AddNoise.php b/app/Vendor/WideImage/Operation/AddNoise.php deleted file mode 100755 index 8799199399..0000000000 --- a/app/Vendor/WideImage/Operation/AddNoise.php +++ /dev/null @@ -1,153 +0,0 @@ -asTrueColor(), $fun, $amount); - } - - /** - * Returns image with every pixel changed by specififed function - * - * @param WideImage_Image $image - * @param str $function - * @param int $value - * @return WideImage_Image - */ - function filter($image, $function, $value) - { - for ($y = 0; $y < $image->getHeight(); $y++) - { - for ($x = 0; $x< $image->getWidth(); $x++) - { - $rgb = imagecolorat($image->getHandle(), $x, $y); - - $a = ($rgb >> 24) & 0xFF; - $r = ($rgb >> 16) & 0xFF; - $g = ($rgb >> 8) & 0xFF; - $b = $rgb & 0xFF; - - - self::$function($r, $g, $b, $value); - - $color = imagecolorallocatealpha($image->getHandle(), $r, $g, $b, $a); - imagesetpixel($image->getHandle(), $x, $y, $color); - } - } - return $image; - } - /** - * Adds color noise by altering given R,G,B values using specififed amount - * - * @param int $r - * @param int $g - * @param int $b - * @param int $value - * @return void - */ - function colorNoise_fun(&$r, &$g, &$b, $amount) - { - $r = self::byte($r + mt_rand(0, $amount) - ($amount >> 1) ); - $g = self::byte($g + mt_rand(0, $amount) - ($amount >> 1) ); - $b = self::byte($b + mt_rand(0, $amount) - ($amount >> 1) ); - } - /** - * Adds mono noise by altering given R,G,B values using specififed amount - * - * @param int $r - * @param int $g - * @param int $b - * @param int $value - * @return void - */ - function monoNoise_fun(&$r, &$g, &$b, $amount) - { - $rand = mt_rand(0, $amount) - ($amount >> 1); - - $r = self::byte($r + $rand); - $g = self::byte($g + $rand); - $b = self::byte($b + $rand); - } - /** - * Adds salt&pepper noise by altering given R,G,B values using specififed amount - * - * @param int $r - * @param int $g - * @param int $b - * @param int $value - * @return void - */ - function saltPepperNoise_fun(&$r, &$g, &$b, $amount) - { - if (mt_rand(0, 255 - $amount) != 0) return; - - $rand = mt_rand(0, 1); - switch ($rand) - { - case 0 : $r = $g = $b = 0; - break; - case 1 : $r = $g = $b = 255; - break; - } - } - /** - * Returns value within (0,255) - * - * @param int $b - * @return int - */ - function byte($b) - { - if ($b > 255) return 255; - if ($b < 0) return 0; - return (int) $b; - } - - } diff --git a/app/Vendor/WideImage/Operation/ApplyConvolution.php b/app/Vendor/WideImage/Operation/ApplyConvolution.php deleted file mode 100755 index a26d918ae7..0000000000 --- a/app/Vendor/WideImage/Operation/ApplyConvolution.php +++ /dev/null @@ -1,48 +0,0 @@ -asTrueColor(); - if (!imageconvolution($new->getHandle(), $matrix, $div, $offset)) - throw new WideImage_GDFunctionResultException("imageconvolution() returned false"); - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/ApplyFilter.php b/app/Vendor/WideImage/Operation/ApplyFilter.php deleted file mode 100755 index b513d5dbc1..0000000000 --- a/app/Vendor/WideImage/Operation/ApplyFilter.php +++ /dev/null @@ -1,67 +0,0 @@ -asTrueColor(); - - if (in_array($filter, self::$one_arg_filters)) - $res = imagefilter($new->getHandle(), $filter, $arg1); - elseif (defined('IMG_FILTER_PIXELATE') && $filter == IMG_FILTER_PIXELATE) - $res = imagefilter($new->getHandle(), $filter, $arg1, $arg2); - elseif ($filter == IMG_FILTER_COLORIZE) - $res = imagefilter($new->getHandle(), $filter, $arg1, $arg2, $arg3, $arg4); - else - $res = imagefilter($new->getHandle(), $filter); - - if (!$res) - throw new WideImage_GDFunctionResultException("imagefilter() returned false"); - - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/ApplyMask.php b/app/Vendor/WideImage/Operation/ApplyMask.php deleted file mode 100755 index 949213f0c1..0000000000 --- a/app/Vendor/WideImage/Operation/ApplyMask.php +++ /dev/null @@ -1,105 +0,0 @@ -getWidth(), $mask->getWidth()); - $top = WideImage_Coordinate::fix($top, $image->getHeight(), $mask->getHeight()); - - $width = $image->getWidth(); - $mask_width = $mask->getWidth(); - - $height = $image->getHeight(); - $mask_height = $mask->getHeight(); - - $result = $image->asTrueColor(); - - $result->alphaBlending(false); - $result->saveAlpha(true); - - $srcTransparentColor = $result->getTransparentColor(); - if ($srcTransparentColor >= 0) - { - # this was here. works without. - #$trgb = $image->getColorRGB($srcTransparentColor); - #$trgb['alpha'] = 127; - #$destTransparentColor = $result->allocateColorAlpha($trgb); - #$result->setTransparentColor($destTransparentColor); - $destTransparentColor = $srcTransparentColor; - } - else - { - $destTransparentColor = $result->allocateColorAlpha(255, 255, 255, 127); - } - - for ($x = 0; $x < $width; $x++) - for ($y = 0; $y < $height; $y++) - { - $mx = $x - $left; - $my = $y - $top; - if ($mx >= 0 && $mx < $mask_width && $my >= 0 && $my < $mask_height) - { - $srcColor = $image->getColorAt($x, $y); - if ($srcColor == $srcTransparentColor) - $destColor = $destTransparentColor; - else - { - $maskRGB = $mask->getRGBAt($mx, $my); - if ($maskRGB['red'] == 0) - $destColor = $destTransparentColor; - elseif ($srcColor >= 0) - { - $imageRGB = $image->getRGBAt($x, $y); - $level = ($maskRGB['red'] / 255) * (1 - $imageRGB['alpha'] / 127); - $imageRGB['alpha'] = 127 - round($level * 127); - if ($imageRGB['alpha'] == 127) - $destColor = $destTransparentColor; - else - $destColor = $result->allocateColorAlpha($imageRGB); - } - else - $destColor = $destTransparentColor; - } - $result->setColorAt($x, $y, $destColor); - } - } - return $result; - } - } diff --git a/app/Vendor/WideImage/Operation/AsGrayscale.php b/app/Vendor/WideImage/Operation/AsGrayscale.php deleted file mode 100755 index 4e64d089ac..0000000000 --- a/app/Vendor/WideImage/Operation/AsGrayscale.php +++ /dev/null @@ -1,49 +0,0 @@ -asTrueColor(); - if (!imagefilter($new->getHandle(), IMG_FILTER_GRAYSCALE)) - throw new WideImage_GDFunctionResultException("imagefilter() returned false"); - - if (!$image->isTrueColor()) - $new = $new->asPalette(); - - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/AsNegative.php b/app/Vendor/WideImage/Operation/AsNegative.php deleted file mode 100755 index 85f0667b8c..0000000000 --- a/app/Vendor/WideImage/Operation/AsNegative.php +++ /dev/null @@ -1,63 +0,0 @@ -isTrueColor(); - $transparent = $image->isTransparent(); - - if ($palette && $transparent) - $tcrgb = $image->getTransparentColorRGB(); - - $new = $image->asTrueColor(); - if (!imagefilter($new->getHandle(), IMG_FILTER_NEGATE)) - throw new WideImage_GDFunctionResultException("imagefilter() returned false"); - - if ($palette) - { - $new = $new->asPalette(); - if ($transparent) - { - $irgb = array('red' => 255 - $tcrgb['red'], 'green' => 255 - $tcrgb['green'], 'blue' => 255 - $tcrgb['blue'], 'alpha' => 127); - // needs imagecolorexactalpha instead of imagecolorexact, otherwise doesn't work on some transparent GIF images - $new_tci = imagecolorexactalpha($new->getHandle(), $irgb['red'], $irgb['green'], $irgb['blue'], 127); - $new->setTransparentColor($new_tci); - } - } - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/AutoCrop.php b/app/Vendor/WideImage/Operation/AutoCrop.php deleted file mode 100755 index 73e7603b07..0000000000 --- a/app/Vendor/WideImage/Operation/AutoCrop.php +++ /dev/null @@ -1,162 +0,0 @@ -getRGBAt(0, 0); - else - { - if ($base_color < 0) - return $img->copy(); - - $rgb_base = $img->getColorRGB($base_color); - } - - $cut_rect = array('left' => 0, 'top' => 0, 'right' => $img->getWidth() - 1, 'bottom' => $img->getHeight() - 1); - - for ($y = 0; $y <= $cut_rect['bottom']; $y++) - { - $count = 0; - for ($x = 0; $x <= $cut_rect['right']; $x++) - { - $rgb = $img->getRGBAt($x, $y); - $diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']); - if ($diff > $rgb_threshold) - { - $count++; - if ($count >= $pixel_cutoff) - { - $cut_rect['top'] = $y; - break 2; - } - } - } - } - - for ($y = $img->getHeight() - 1; $y >= $cut_rect['top']; $y--) - { - $count = 0; - for ($x = 0; $x <= $cut_rect['right']; $x++) - { - $rgb = $img->getRGBAt($x, $y); - $diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']); - if ($diff > $rgb_threshold) - { - $count++; - if ($count >= $pixel_cutoff) - { - $cut_rect['bottom'] = $y; - break 2; - } - } - } - } - - for ($x = 0; $x <= $cut_rect['right']; $x++) - { - $count = 0; - for ($y = $cut_rect['top']; $y <= $cut_rect['bottom']; $y++) - { - $rgb = $img->getRGBAt($x, $y); - $diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']); - if ($diff > $rgb_threshold) - { - $count++; - if ($count >= $pixel_cutoff) - { - $cut_rect['left'] = $x; - break 2; - } - } - } - } - - for ($x = $cut_rect['right']; $x >= $cut_rect['left']; $x--) - { - $count = 0; - for ($y = $cut_rect['top']; $y <= $cut_rect['bottom']; $y++) - { - $rgb = $img->getRGBAt($x, $y); - $diff = abs($rgb['red'] - $rgb_base['red']) + abs($rgb['green'] - $rgb_base['green']) + abs($rgb['blue'] - $rgb_base['blue']); - if ($diff > $rgb_threshold) - { - $count++; - if ($count >= $pixel_cutoff) - { - $cut_rect['right'] = $x; - break 2; - } - } - } - } - - $cut_rect = array( - 'left' => $cut_rect['left'] - $margin, - 'top' => $cut_rect['top'] - $margin, - 'right' => $cut_rect['right'] + $margin, - 'bottom' => $cut_rect['bottom'] + $margin - ); - - if ($cut_rect['left'] < 0) - $cut_rect['left'] = 0; - - if ($cut_rect['top'] < 0) - $cut_rect['top'] = 0; - - if ($cut_rect['right'] >= $img->getWidth()) - $cut_rect['right'] = $img->getWidth() - 1; - - if ($cut_rect['bottom'] >= $img->getHeight()) - $cut_rect['bottom'] = $img->getHeight() - 1; - - return $img->crop($cut_rect['left'], $cut_rect['top'], $cut_rect['right'] - $cut_rect['left'] + 1, $cut_rect['bottom'] - $cut_rect['top'] + 1); - } - } diff --git a/app/Vendor/WideImage/Operation/CopyChannelsPalette.php b/app/Vendor/WideImage/Operation/CopyChannelsPalette.php deleted file mode 100755 index f2ad6b1f6f..0000000000 --- a/app/Vendor/WideImage/Operation/CopyChannelsPalette.php +++ /dev/null @@ -1,90 +0,0 @@ - 0, 'green' => 0, 'blue' => 0); - if (isset($channels['alpha'])) - unset($channels['alpha']); - - $width = $img->getWidth(); - $height = $img->getHeight(); - $copy = WideImage_PaletteImage::create($width, $height); - - if ($img->isTransparent()) - { - $otci = $img->getTransparentColor(); - $TRGB = $img->getColorRGB($otci); - $tci = $copy->allocateColor($TRGB); - } - else - { - $otci = null; - $tci = null; - } - - for ($x = 0; $x < $width; $x++) - for ($y = 0; $y < $height; $y++) - { - $ci = $img->getColorAt($x, $y); - if ($ci === $otci) - { - $copy->setColorAt($x, $y, $tci); - continue; - } - $RGB = $img->getColorRGB($ci); - - $newRGB = $blank; - foreach ($channels as $channel) - $newRGB[$channel] = $RGB[$channel]; - - $color = $copy->getExactColor($newRGB); - if ($color == -1) - $color = $copy->allocateColor($newRGB); - - $copy->setColorAt($x, $y, $color); - } - - if ($img->isTransparent()) - $copy->setTransparentColor($tci); - - return $copy; - } - } diff --git a/app/Vendor/WideImage/Operation/CopyChannelsTrueColor.php b/app/Vendor/WideImage/Operation/CopyChannelsTrueColor.php deleted file mode 100755 index 286841791b..0000000000 --- a/app/Vendor/WideImage/Operation/CopyChannelsTrueColor.php +++ /dev/null @@ -1,67 +0,0 @@ - 0, 'green' => 0, 'blue' => 0, 'alpha' => 0); - - $width = $img->getWidth(); - $height = $img->getHeight(); - $copy = WideImage_TrueColorImage::create($width, $height); - - if (count($channels) > 0) - for ($x = 0; $x < $width; $x++) - for ($y = 0; $y < $height; $y++) - { - $RGBA = $img->getRGBAt($x, $y); - $newRGBA = $blank; - foreach ($channels as $channel) - $newRGBA[$channel] = $RGBA[$channel]; - - $color = $copy->getExactColorAlpha($newRGBA); - if ($color == -1) - $color = $copy->allocateColorAlpha($newRGBA); - - $copy->setColorAt($x, $y, $color); - } - - return $copy; - } - } diff --git a/app/Vendor/WideImage/Operation/CorrectGamma.php b/app/Vendor/WideImage/Operation/CorrectGamma.php deleted file mode 100755 index 6ab075c1ca..0000000000 --- a/app/Vendor/WideImage/Operation/CorrectGamma.php +++ /dev/null @@ -1,48 +0,0 @@ -copy(); - if (!imagegammacorrect($new->getHandle(), $input_gamma, $output_gamma)) - throw new WideImage_GDFunctionResultException("imagegammacorrect() returned false"); - - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/Crop.php b/app/Vendor/WideImage/Operation/Crop.php deleted file mode 100755 index ef078e0ea3..0000000000 --- a/app/Vendor/WideImage/Operation/Crop.php +++ /dev/null @@ -1,86 +0,0 @@ -getWidth(), $width); - $height = WideImage_Coordinate::fix($height, $img->getHeight(), $height); - $left = WideImage_Coordinate::fix($left, $img->getWidth(), $width); - $top = WideImage_Coordinate::fix($top, $img->getHeight(), $height); - if ($left < 0) - { - $width = $left + $width; - $left = 0; - } - - if ($width > $img->getWidth() - $left) - $width = $img->getWidth() - $left; - - if ($top < 0) - { - $height = $top + $height; - $top = 0; - } - - if ($height > $img->getHeight() - $top) - $height = $img->getHeight() - $top; - - if ($width <= 0 || $height <= 0) - throw new WideImage_Exception("Can't crop outside of an image."); - - $new = $img->doCreate($width, $height); - - if ($img->isTransparent() || $img instanceof WideImage_PaletteImage) - { - $new->copyTransparencyFrom($img); - if (!imagecopyresized($new->getHandle(), $img->getHandle(), 0, 0, $left, $top, $width, $height, $width, $height)) - throw new WideImage_GDFunctionResultException("imagecopyresized() returned false"); - } - else - { - $new->alphaBlending(false); - $new->saveAlpha(true); - if (!imagecopyresampled($new->getHandle(), $img->getHandle(), 0, 0, $left, $top, $width, $height, $width, $height)) - throw new WideImage_GDFunctionResultException("imagecopyresampled() returned false"); - } - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/Flip.php b/app/Vendor/WideImage/Operation/Flip.php deleted file mode 100755 index 1c25b68879..0000000000 --- a/app/Vendor/WideImage/Operation/Flip.php +++ /dev/null @@ -1,54 +0,0 @@ -copy(); - - $width = $image->getWidth(); - $height = $image->getHeight(); - - if ($new->isTransparent()) - imagefilledrectangle($new->getHandle(), 0, 0, $width, $height, $new->getTransparentColor()); - - for ($y = 0; $y < $height; $y++) - if (!imagecopy($new->getHandle(), $image->getHandle(), 0, $y, 0, $height - $y - 1, $width, 1)) - throw new WideImage_GDFunctionResultException("imagecopy() returned false"); - - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/GetMask.php b/app/Vendor/WideImage/Operation/GetMask.php deleted file mode 100755 index bac74628f6..0000000000 --- a/app/Vendor/WideImage/Operation/GetMask.php +++ /dev/null @@ -1,67 +0,0 @@ -getWidth(); - $height = $image->getHeight(); - - $mask = WideImage_TrueColorImage::create($width, $height); - $mask->setTransparentColor(-1); - $mask->alphaBlending(false); - $mask->saveAlpha(false); - - for ($i = 0; $i <= 255; $i++) - $greyscale[$i] = ImageColorAllocate($mask->getHandle(), $i, $i, $i); - - imagefilledrectangle($mask->getHandle(), 0, 0, $width, $height, $greyscale[255]); - - $transparentColor = $image->getTransparentColor(); - $alphaToGreyRatio = 255 / 127; - for ($x = 0; $x < $width; $x++) - for ($y = 0; $y < $height; $y++) - { - $color = $image->getColorAt($x, $y); - if ($color == $transparentColor) - $rgba['alpha'] = 127; - else - $rgba = $image->getColorRGB($color); - imagesetpixel($mask->getHandle(), $x, $y, $greyscale[255 - round($rgba['alpha'] * $alphaToGreyRatio)]); - } - return $mask; - } - } diff --git a/app/Vendor/WideImage/Operation/Merge.php b/app/Vendor/WideImage/Operation/Merge.php deleted file mode 100755 index ee897119b6..0000000000 --- a/app/Vendor/WideImage/Operation/Merge.php +++ /dev/null @@ -1,78 +0,0 @@ -getWidth(), $overlay->getWidth()); - $y = WideImage_Coordinate::fix($top, $base->getHeight(), $overlay->getHeight()); - - $result = $base->asTrueColor(); - $result->alphaBlending(true); - $result->saveAlpha(true); - - if ($pct <= 0) - return $result; - - if ($pct < 100) - { - if (!imagecopymerge( - $result->getHandle(), - $overlay->getHandle(), - $x, $y, 0, 0, - $overlay->getWidth(), - $overlay->getHeight(), - $pct)) - throw new WideImage_GDFunctionResultException("imagecopymerge() returned false"); - } - else - { - if (!imagecopy( - $result->getHandle(), - $overlay->getHandle(), - $x, $y, 0, 0, - $overlay->getWidth(), - $overlay->getHeight())) - throw new WideImage_GDFunctionResultException("imagecopy() returned false"); - } - - return $result; - } - } diff --git a/app/Vendor/WideImage/Operation/Mirror.php b/app/Vendor/WideImage/Operation/Mirror.php deleted file mode 100755 index 88cb658e78..0000000000 --- a/app/Vendor/WideImage/Operation/Mirror.php +++ /dev/null @@ -1,55 +0,0 @@ -copy(); - - $width = $image->getWidth(); - $height = $image->getHeight(); - - if ($new->isTransparent()) - imagefilledrectangle($new->getHandle(), 0, 0, $width, $height, $new->getTransparentColor()); - - for ($x = 0; $x < $width; $x++) - { - if (!imagecopy($new->getHandle(), $image->getHandle(), $x, 0, $width - $x - 1, 0, 1, $height)) - throw new WideImage_GDFunctionResultException("imagecopy() returned false"); - } - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/Resize.php b/app/Vendor/WideImage/Operation/Resize.php deleted file mode 100755 index 7d4182e3e4..0000000000 --- a/app/Vendor/WideImage/Operation/Resize.php +++ /dev/null @@ -1,157 +0,0 @@ -getWidth(); - $height = $img->getHeight(); - } - - if ($width !== null) - $width = WideImage_Coordinate::fix($width, $img->getWidth()); - - if ($height !== null) - $height = WideImage_Coordinate::fix($height, $img->getHeight()); - - if ($width === null) - $width = floor($img->getWidth() * $height / $img->getHeight()); - - if ($height === null) - $height = floor($img->getHeight() * $width / $img->getWidth()); - - if ($width === 0 || $height === 0) - return array('width' => 0, 'height' => 0); - - if ($fit == null) - $fit = 'inside'; - - $dim = array(); - if ($fit == 'fill') - { - $dim['width'] = $width; - $dim['height'] = $height; - } - elseif ($fit == 'inside' || $fit == 'outside') - { - $rx = $img->getWidth() / $width; - $ry = $img->getHeight() / $height; - - if ($fit == 'inside') - $ratio = ($rx > $ry) ? $rx : $ry; - else - $ratio = ($rx < $ry) ? $rx : $ry; - - $dim['width'] = round($img->getWidth() / $ratio); - $dim['height'] = round($img->getHeight() / $ratio); - } - else - throw new WideImage_Operation_InvalidFitMethodException("{$fit} is not a valid resize-fit method."); - - return $dim; - } - - /** - * Returns a resized image - * - * @param WideImage_Image $img - * @param smart_coordinate $width - * @param smart_coordinate $height - * @param string $fit - * @param string $scale - * @return WideImage_Image - */ - function execute($img, $width, $height, $fit, $scale) - { - $dim = $this->prepareDimensions($img, $width, $height, $fit); - if (($scale === 'down' && ($dim['width'] >= $img->getWidth() && $dim['height'] >= $img->getHeight())) || - ($scale === 'up' && ($dim['width'] <= $img->getWidth() && $dim['height'] <= $img->getHeight()))) - $dim = array('width' => $img->getWidth(), 'height' => $img->getHeight()); - - if ($dim['width'] <= 0 || $dim['height'] <= 0) - throw new WideImage_Operation_InvalidResizeDimensionException("Both dimensions must be larger than 0."); - - if ($img->isTransparent() || $img instanceof WideImage_PaletteImage) - { - $new = WideImage_PaletteImage::create($dim['width'], $dim['height']); - $new->copyTransparencyFrom($img); - if (!imagecopyresized( - $new->getHandle(), - $img->getHandle(), - 0, 0, 0, 0, - $new->getWidth(), - $new->getHeight(), - $img->getWidth(), - $img->getHeight())) - throw new WideImage_GDFunctionResultException("imagecopyresized() returned false"); - } - else - { - $new = WideImage_TrueColorImage::create($dim['width'], $dim['height']); - $new->alphaBlending(false); - $new->saveAlpha(true); - if (!imagecopyresampled( - $new->getHandle(), - $img->getHandle(), - 0, 0, 0, 0, - $new->getWidth(), - $new->getHeight(), - $img->getWidth(), - $img->getHeight())) - throw new WideImage_GDFunctionResultException("imagecopyresampled() returned false"); - $new->alphaBlending(true); - } - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/ResizeCanvas.php b/app/Vendor/WideImage/Operation/ResizeCanvas.php deleted file mode 100755 index 66682cd4c3..0000000000 --- a/app/Vendor/WideImage/Operation/ResizeCanvas.php +++ /dev/null @@ -1,107 +0,0 @@ -getWidth()); - $new_height = WideImage_Coordinate::fix($height, $img->getHeight()); - - if ($scale == 'down') - { - $new_width = min($new_width, $img->getWidth()); - $new_height = min($new_height, $img->getHeight()); - } - elseif ($scale == 'up') - { - $new_width = max($new_width, $img->getWidth()); - $new_height = max($new_height, $img->getHeight()); - } - - $new = WideImage::createTrueColorImage($new_width, $new_height); - if ($img->isTrueColor()) - { - if ($color === null) - $color = $new->allocateColorAlpha(0, 0, 0, 127); - } - else - { - imagepalettecopy($new->getHandle(), $img->getHandle()); - - if ($img->isTransparent()) - { - $new->copyTransparencyFrom($img); - $tc_rgb = $img->getTransparentColorRGB(); - $t_color = $new->allocateColorAlpha($tc_rgb); - } - - if ($color === null) - { - if ($img->isTransparent()) - $color = $t_color; - else - $color = $new->allocateColorAlpha(255, 0, 127, 127); - - imagecolortransparent($new->getHandle(), $color); - } - } - $new->fill(0, 0, $color); - - - $x = WideImage_Coordinate::fix($left, $new->getWidth(), $img->getWidth()); - $y = WideImage_Coordinate::fix($top, $new->getHeight(), $img->getHeight()); - - // blending for truecolor images - if ($img->isTrueColor()) - $new->alphaBlending($merge); - - // not-blending for palette images - if (!$merge && !$img->isTrueColor() && isset($t_color)) - $new->getCanvas()->filledRectangle($x, $y, $x + $img->getWidth(), $y + $img->getHeight(), $t_color); - - $img->copyTo($new, $x, $y); - return $new; - } - } diff --git a/app/Vendor/WideImage/Operation/Rotate.php b/app/Vendor/WideImage/Operation/Rotate.php deleted file mode 100755 index 7692fb451a..0000000000 --- a/app/Vendor/WideImage/Operation/Rotate.php +++ /dev/null @@ -1,64 +0,0 @@ -copy(); - - $image = $image->asTrueColor(); - - if ($bgColor === null) - { - $bgColor = $image->getTransparentColor(); - if ($bgColor == -1) - { - $bgColor = $image->allocateColorAlpha(255, 255, 255, 127); - imagecolortransparent($image->getHandle(), $bgColor); - } - } - return new WideImage_TrueColorImage(imagerotate($image->getHandle(), $angle, $bgColor, $ignoreTransparent)); - } - } diff --git a/app/Vendor/WideImage/Operation/RoundCorners.php b/app/Vendor/WideImage/Operation/RoundCorners.php deleted file mode 100755 index 22eb84991b..0000000000 --- a/app/Vendor/WideImage/Operation/RoundCorners.php +++ /dev/null @@ -1,114 +0,0 @@ - 16) - $sample_ratio = 16; - else - $sample_ratio = $smoothness; - - $corner = WideImage::createTrueColorImage($radius * $sample_ratio, $radius * $sample_ratio); - if ($color === null) - { - imagepalettecopy($corner->getHandle(), $image->getHandle()); - $bg_color = $corner->allocateColor(0, 0, 0); - - $corner->fill(0, 0, $bg_color); - $fg_color = $corner->allocateColor(255, 255, 255); - $corner->getCanvas()->filledEllipse($radius * $sample_ratio, $radius * $sample_ratio, $radius * 2 * $sample_ratio, $radius * 2 * $sample_ratio, $fg_color); - $corner = $corner->resize($radius, $radius); - - $result = $image->asTrueColor(); - - $tc = $result->getTransparentColor(); - if ($tc == -1) - { - $tc = $result->allocateColorAlpha(255, 255, 255, 127); - imagecolortransparent($result->getHandle(), $tc); - $result->setTransparentColor($tc); - } - - if ($corners & WideImage::SIDE_TOP_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_TOP) - $result = $result->applyMask($corner, -1, -1); - - $corner = $corner->rotate(90); - if ($corners & WideImage::SIDE_TOP_RIGHT || $corners & WideImage::SIDE_TOP || $corners & WideImage::SIDE_RIGHT) - $result = $result->applyMask($corner, $result->getWidth() - $corner->getWidth() + 1, -1, 100); - - $corner = $corner->rotate(90); - if ($corners & WideImage::SIDE_BOTTOM_RIGHT || $corners & WideImage::SIDE_RIGHT || $corners & WideImage::SIDE_BOTTOM) - $result = $result->applyMask($corner, $result->getWidth() - $corner->getWidth() + 1, $result->getHeight() - $corner->getHeight() + 1, 100); - - $corner = $corner->rotate(90); - if ($corners & WideImage::SIDE_BOTTOM_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_BOTTOM) - $result = $result->applyMask($corner, -1, $result->getHeight() - $corner->getHeight() + 1, 100); - - return $result; - } - else - { - $bg_color = $color; - - $corner->fill(0, 0, $bg_color); - $fg_color = $corner->allocateColorAlpha(127, 127, 127, 127); - $corner->getCanvas()->filledEllipse($radius * $sample_ratio, $radius * $sample_ratio, $radius * 2 * $sample_ratio, $radius * 2 * $sample_ratio, $fg_color); - $corner = $corner->resize($radius, $radius); - - $result = $image->copy(); - if ($corners & WideImage::SIDE_TOP_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_TOP) - $result = $result->merge($corner, -1, -1, 100); - - $corner = $corner->rotate(90); - if ($corners & WideImage::SIDE_TOP_RIGHT || $corners & WideImage::SIDE_TOP || $corners & WideImage::SIDE_RIGHT) - $result = $result->merge($corner, $result->getWidth() - $corner->getWidth() + 1, -1, 100); - - $corner = $corner->rotate(90); - if ($corners & WideImage::SIDE_BOTTOM_RIGHT || $corners & WideImage::SIDE_RIGHT || $corners & WideImage::SIDE_BOTTOM) - $result = $result->merge($corner, $result->getWidth() - $corner->getWidth() + 1, $result->getHeight() - $corner->getHeight() + 1, 100); - - $corner = $corner->rotate(90); - if ($corners & WideImage::SIDE_BOTTOM_LEFT || $corners & WideImage::SIDE_LEFT || $corners & WideImage::SIDE_BOTTOM) - $result = $result->merge($corner, -1, $result->getHeight() - $corner->getHeight() + 1, 100); - - return $result; - } - } - } diff --git a/app/Vendor/WideImage/Operation/Unsharp.php b/app/Vendor/WideImage/Operation/Unsharp.php deleted file mode 100755 index 9ba68825e8..0000000000 --- a/app/Vendor/WideImage/Operation/Unsharp.php +++ /dev/null @@ -1,135 +0,0 @@ - 500) $amount = 500; - $amount = $amount * 0.016; - if ($radius > 50) $radius = 50; - $radius = $radius * 2; - if ($threshold > 255) $threshold = 255; - - $radius = abs(round($radius)); // Only integers make sense. - if ($radius == 0) { - return $image; - } - - // Gaussian blur matrix - - $matrix = array( - array(1, 2, 1), - array(2, 4, 2), - array(1, 2, 1) - ); - - $blurred = $image->applyConvolution($matrix, 16, 0); - - if($threshold > 0) { - // Calculate the difference between the blurred pixels and the original - // and set the pixels - for ($x = 0; $x < $image->getWidth(); $x++) { - for ($y = 0; $y < $image->getHeight(); $y++) { - $rgbOrig = $image->getRGBAt($x, $y); - $rOrig = $rgbOrig["red"]; - $gOrig = $rgbOrig["green"]; - $bOrig = $rgbOrig["blue"]; - - $rgbBlur = $blurred->getRGBAt($x, $y); - $rBlur = $rgbBlur["red"]; - $gBlur = $rgbBlur["green"]; - $bBlur = $rgbBlur["blue"]; - - // When the masked pixels differ less from the original - // than the threshold specifies, they are set to their original value. - $rNew = (abs($rOrig - $rBlur) >= $threshold) - ? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig)) - : $rOrig; - $gNew = (abs($gOrig - $gBlur) >= $threshold) - ? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig)) - : $gOrig; - $bNew = (abs($bOrig - $bBlur) >= $threshold) - ? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig)) - : $bOrig; - $rgbNew = array("red" => $rNew, "green" => $gNew, "blue" => $bNew, "alpha" => 0); - - if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew)) { - $image->setRGBAt($x, $y, $rgbNew); - } - } - } - } - else { - $w = $image->getWidth(); - $h = $image->getHeight(); - for ($x = 0; $x < $w; $x++) { - for ($y = 0; $y < $h; $y++) { - $rgbOrig = $image->getRGBAt($x, $y); - $rOrig = $rgbOrig["red"]; - $gOrig = $rgbOrig["green"]; - $bOrig = $rgbOrig["blue"]; - - $rgbBlur = $blurred->getRGBAt($x, $y); - $rBlur = $rgbBlur["red"]; - $gBlur = $rgbBlur["green"]; - $bBlur = $rgbBlur["blue"]; - - $rNew = ($amount * ($rOrig - $rBlur)) + $rOrig; - if($rNew>255){$rNew=255;} - elseif($rNew<0){$rNew=0;} - $gNew = ($amount * ($gOrig - $gBlur)) + $gOrig; - if($gNew>255){$gNew=255;} - elseif($gNew<0){$gNew=0;} - $bNew = ($amount * ($bOrig - $bBlur)) + $bOrig; - if($bNew>255){$bNew=255;} - elseif($bNew<0){$bNew=0;} - $rgbNew = array("red" => $rNew, "green" => $gNew, "blue" => $bNew, "alpha" => 0); - - $image->setRGBAt($x, $y, $rgbNew); - } - } - } - - return $image; - } - } diff --git a/app/Vendor/WideImage/OperationFactory.php b/app/Vendor/WideImage/OperationFactory.php deleted file mode 100755 index cc1183af08..0000000000 --- a/app/Vendor/WideImage/OperationFactory.php +++ /dev/null @@ -1,57 +0,0 @@ -copy(); - } - - /** - * Returns a copy of the image - * - * @param $trueColor True if the new image should be truecolor - * @return WideImage_Image - */ - protected function copyAsNew($trueColor = false) - { - $width = $this->getWidth(); - $height = $this->getHeight(); - - if ($trueColor) - $new = WideImage_TrueColorImage::create($width, $height); - else - $new = WideImage_PaletteImage::create($width, $height); - - // copy transparency of source to target - if ($this->isTransparent()) - { - $rgb = $this->getTransparentColorRGB(); - if (is_array($rgb)) - { - $tci = $new->allocateColor($rgb['red'], $rgb['green'], $rgb['blue']); - $new->fill(0, 0, $tci); - $new->setTransparentColor($tci); - } - } - - imageCopy($new->getHandle(), $this->handle, 0, 0, 0, 0, $width, $height); - return $new; - } - - /** - * (non-PHPdoc) - * @see WideImage_Image#asTrueColor() - */ - function asTrueColor() - { - $width = $this->getWidth(); - $height = $this->getHeight(); - $new = WideImage::createTrueColorImage($width, $height); - if ($this->isTransparent()) - $new->copyTransparencyFrom($this); - if (!imageCopy($new->getHandle(), $this->handle, 0, 0, 0, 0, $width, $height)) - throw new WideImage_GDFunctionResultException("imagecopy() returned false"); - return $new; - } - - /** - * (non-PHPdoc) - * @see WideImage_Image#getChannels() - */ - function getChannels() - { - $args = func_get_args(); - if (count($args) == 1 && is_array($args[0])) - $args = $args[0]; - return WideImage_OperationFactory::get('CopyChannelsPalette')->execute($this, $args); - } - - /** - * (non-PHPdoc) - * @see WideImage_Image#copyNoAlpha() - */ - function copyNoAlpha() - { - return WideImage_Image::loadFromString($this->asString('png')); - } - } diff --git a/app/Vendor/WideImage/TrueColorImage.php b/app/Vendor/WideImage/TrueColorImage.php deleted file mode 100755 index 28ca5a0014..0000000000 --- a/app/Vendor/WideImage/TrueColorImage.php +++ /dev/null @@ -1,218 +0,0 @@ -alphaBlending(false); - $this->saveAlpha(true); - } - - /** - * Factory method that creates a true-color image object - * - * @param int $width - * @param int $height - * @return WideImage_TrueColorImage - */ - static function create($width, $height) - { - if ($width * $height <= 0 || $width < 0) - throw new WideImage_InvalidImageDimensionException("Can't create an image with dimensions [$width, $height]."); - - return new WideImage_TrueColorImage(imagecreatetruecolor($width, $height)); - } - - function doCreate($width, $height) - { - return self::create($width, $height); - } - - function isTrueColor() - { - return true; - } - - /** - * Sets alpha blending mode via imagealphablending() - * - * @param bool $mode - * @return bool - */ - function alphaBlending($mode) - { - return imagealphablending($this->handle, $mode); - } - - /** - * Toggle if alpha channel should be saved with the image via imagesavealpha() - * - * @param bool $on - * @return bool - */ - function saveAlpha($on) - { - return imagesavealpha($this->handle, $on); - } - - /** - * Allocates a color and returns its index - * - * This method accepts either each component as an integer value, - * or an associative array that holds the color's components in keys - * 'red', 'green', 'blue', 'alpha'. - * - * @param mixed $R - * @param int $G - * @param int $B - * @param int $A - * @return int - */ - function allocateColorAlpha($R, $G = null, $B = null, $A = null) - { - if (is_array($R)) - return imageColorAllocateAlpha($this->handle, $R['red'], $R['green'], $R['blue'], $R['alpha']); - else - return imageColorAllocateAlpha($this->handle, $R, $G, $B, $A); - } - - /** - * @see WideImage_Image#asPalette($nColors, $dither, $matchPalette) - */ - function asPalette($nColors = 255, $dither = null, $matchPalette = true) - { - $nColors = intval($nColors); - if ($nColors < 1) - $nColors = 1; - elseif ($nColors > 255) - $nColors = 255; - - if ($dither === null) - $dither = $this->isTransparent(); - - $temp = $this->copy(); - imagetruecolortopalette($temp->handle, $dither, $nColors); - if ($matchPalette == true && function_exists('imagecolormatch')) - imagecolormatch($this->handle, $temp->handle); - - // The code below isn't working properly; it corrupts transparency on some palette->tc->palette conversions. - // Why is this code here? - /* - if ($this->isTransparent()) - { - $trgb = $this->getTransparentColorRGB(); - $tci = $temp->getClosestColor($trgb); - $temp->setTransparentColor($tci); - } - /**/ - - $temp->releaseHandle(); - return new WideImage_PaletteImage($temp->handle); - } - - /** - * Returns the index of the color that best match the given color components - * - * This method accepts either each component as an integer value, - * or an associative array that holds the color's components in keys - * 'red', 'green', 'blue', 'alpha'. - * - * @param mixed $R Red component value or an associative array - * @param int $G Green component - * @param int $B Blue component - * @param int $A Alpha component - * @return int The color index - */ - function getClosestColorAlpha($R, $G = null, $B = null, $A = null) - { - if (is_array($R)) - return imagecolorclosestalpha($this->handle, $R['red'], $R['green'], $R['blue'], $R['alpha']); - else - return imagecolorclosestalpha($this->handle, $R, $G, $B, $A); - } - - /** - * Returns the index of the color that exactly match the given color components - * - * This method accepts either each component as an integer value, - * or an associative array that holds the color's components in keys - * 'red', 'green', 'blue', 'alpha'. - * - * @param mixed $R Red component value or an associative array - * @param int $G Green component - * @param int $B Blue component - * @param int $A Alpha component - * @return int The color index - */ - function getExactColorAlpha($R, $G = null, $B = null, $A = null) - { - if (is_array($R)) - return imagecolorexactalpha($this->handle, $R['red'], $R['green'], $R['blue'], $R['alpha']); - else - return imagecolorexactalpha($this->handle, $R, $G, $B, $A); - } - - /** - * @see WideImage_Image#getChannels() - */ - function getChannels() - { - $args = func_get_args(); - if (count($args) == 1 && is_array($args[0])) - $args = $args[0]; - return WideImage_OperationFactory::get('CopyChannelsTrueColor')->execute($this, $args); - } - - /** - * (non-PHPdoc) - * @see WideImage_Image#copyNoAlpha() - */ - function copyNoAlpha() - { - $prev = $this->saveAlpha(false); - $result = WideImage_Image::loadFromString($this->asString('png')); - $this->saveAlpha($prev); - //$result->releaseHandle(); - return $result; - } - - /** - * (non-PHPdoc) - * @see WideImage_Image#asTrueColor() - */ - function asTrueColor() - { - return $this->copy(); - } - } diff --git a/app/Vendor/WideImage/WideImage.php b/app/Vendor/WideImage/WideImage.php deleted file mode 100755 index 290468bfb4..0000000000 --- a/app/Vendor/WideImage/WideImage.php +++ /dev/null @@ -1,377 +0,0 @@ - - * WideImage::registerCustomMapper('WideImage_Mapper_TGA', 'image/tga', 'tga'); - * - * - * @param string $mapper_class_name - * @param string $mime_type - * @param string $extension - */ - static function registerCustomMapper($mapper_class_name, $mime_type, $extension) - { - WideImage_MapperFactory::registerMapper($mapper_class_name, $mime_type, strtoupper($extension)); - } - - /** - * Loads an image from a file, URL, HTML input file field, binary string, or a valid image handle. - * The image format is auto-detected. - * - * Currently supported formats: PNG, GIF, JPG, BMP, TGA, GD, GD2. - * - * This function analyzes the input and decides whether to use WideImage::loadFromHandle(), - * WideImage::loadFromFile(), WideImage::loadFromUpload() or WideImage::loadFromString(), - * all of which you can also call directly to spare WideImage some guessing. - * - * Arrays are supported for upload fields; it returns an array of loaded images. - * To load only a single image from an array field, use WideImage::loadFromUpload('img', $i), - * where $i is the index of the image you want to load. - * - * - * $img = WideImage::load('http://url/image.png'); // image URL - * $img = WideImage::load('/path/to/image.png'); // local file path - * $img = WideImage::load('img'); // upload field name - * $img = WideImage::load(imagecreatetruecolor(10, 10)); // a GD resource - * $img = WideImage::load($image_data); // binary string containing image data - * - * - * @param mixed $source File name, url, HTML file input field name, binary string, or a GD image resource - * @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance - */ - static function load($source) - { - $predictedSourceType = ''; - - if ($source == '') - $predictedSourceType = 'String'; - - // Creating image via a valid resource - if (!$predictedSourceType && self::isValidImageHandle($source)) - $predictedSourceType = 'Handle'; - - // Check for binary string - if (!$predictedSourceType) - { - // search first $binLength bytes (at a maximum) for ord<32 characters (binary image data) - $binLength = 64; - $sourceLength = strlen($source); - $maxlen = ($sourceLength > $binLength) ? $binLength : $sourceLength; - for ($i = 0; $i < $maxlen; $i++) - if (ord($source[$i]) < 32) - { - $predictedSourceType = 'String'; - break; - } - } - - // Uploaded image (array uploads not supported) - if (isset($_FILES[$source]) && isset($_FILES[$source]['tmp_name'])) - $predictedSourceType = 'Upload'; - - // Otherwise, must be a file or an URL - if (!$predictedSourceType) - $predictedSourceType = 'File'; - - return call_user_func(array('WideImage', 'loadFrom' . $predictedSourceType), $source); - } - - /** - * Create and load an image from a file or URL. The image format is auto-detected. - * - * @param string $uri File or url - * @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance - */ - static function loadFromFile($uri) - { - $data = file_get_contents($uri); - $handle = @imagecreatefromstring($data); - if (!self::isValidImageHandle($handle)) - { - try - { - // try to find a mapper first - $mapper = WideImage_MapperFactory::selectMapper($uri); - if ($mapper) - $handle = $mapper->load($uri); - } - catch (WideImage_UnsupportedFormatException $e) - { - // mapper not found - } - - // try all custom mappers - if (!self::isValidImageHandle($handle)) - { - $custom_mappers = WideImage_MapperFactory::getCustomMappers(); - foreach ($custom_mappers as $mime_type => $mapper_class) - { - $mapper = WideImage_MapperFactory::selectMapper(null, $mime_type); - $handle = $mapper->loadFromString($data); - if (self::isValidImageHandle($handle)) - break; - } - } - } - - if (!self::isValidImageHandle($handle)) - throw new WideImage_InvalidImageSourceException("File '{$uri}' appears to be an invalid image source."); - - return self::loadFromHandle($handle); - } - - /** - * Create and load an image from a string. Format is auto-detected. - * - * @param string $string Binary data, i.e. from BLOB field in the database - * @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance - */ - static function loadFromString($string) - { - if (strlen($string) < 128) - throw new WideImage_InvalidImageSourceException("String doesn't contain image data."); - - $handle = @imagecreatefromstring($string); - if (!self::isValidImageHandle($handle)) - { - $custom_mappers = WideImage_MapperFactory::getCustomMappers(); - foreach ($custom_mappers as $mime_type => $mapper_class) - { - $mapper = WideImage_MapperFactory::selectMapper(null, $mime_type); - $handle = $mapper->loadFromString($string); - if (self::isValidImageHandle($handle)) - break; - } - } - - if (!self::isValidImageHandle($handle)) - throw new WideImage_InvalidImageSourceException("String doesn't contain valid image data."); - - return self::loadFromHandle($handle); - } - - /** - * Create and load an image from an image handle. - * - * Note: the resulting image object takes ownership of the passed - * handle. When the newly-created image object is destroyed, the handle is - * destroyed too, so it's not a valid image handle anymore. In order to - * preserve the handle for use after object destruction, you have to call - * WideImage_Image::releaseHandle() on the created image instance prior to its - * destruction. - * - * - * $handle = imagecreatefrompng('file.png'); - * $image = WideImage::loadFromHandle($handle); - * - * - * @param resource $handle A valid GD image resource - * @return WideImage_Image WideImage_PaletteImage or WideImage_TrueColorImage instance - */ - static function loadFromHandle($handle) - { - if (!self::isValidImageHandle($handle)) - throw new WideImage_InvalidImageSourceException("Handle is not a valid GD image resource."); - - if (imageistruecolor($handle)) - return new WideImage_TrueColorImage($handle); - else - return new WideImage_PaletteImage($handle); - } - - /** - * This method loads a file from the $_FILES array. The image format is auto-detected. - * - * You only have to pass the field name as the parameter. For array fields, this function will - * return an array of image objects, unless you specify the $index parameter, which will - * load the desired image. - * - * @param $field_name Name of the key in $_FILES array - * @param int $index The index of the file to load (if the input field is an array) - * @return WideImage_Image The loaded image - */ - static function loadFromUpload($field_name, $index = null) - { - if (!array_key_exists($field_name, $_FILES)) - throw new WideImage_InvalidImageSourceException("Upload field '{$field_name}' doesn't exist."); - - if (is_array($_FILES[$field_name]['tmp_name'])) - { - if (isset($_FILES[$field_name]['tmp_name'][$index])) - $filename = $_FILES[$field_name]['tmp_name'][$index]; - else - { - $result = array(); - foreach ($_FILES[$field_name]['tmp_name'] as $idx => $tmp_name) - $result[$idx] = self::loadFromFile($tmp_name); - return $result; - } - } - else - $filename = $_FILES[$field_name]['tmp_name']; - - if (!file_exists($filename)) - throw new WideImage_InvalidImageSourceException("Uploaded file doesn't exist."); - return self::loadFromFile($filename); - } - - /** - * Factory method for creating a palette image - * - * @param int $width - * @param int $height - * @return WideImage_PaletteImage - */ - static function createPaletteImage($width, $height) - { - return WideImage_PaletteImage::create($width, $height); - } - - /** - * Factory method for creating a true-color image - * - * @param int $width - * @param int $height - * @return WideImage_TrueColorImage - */ - static function createTrueColorImage($width, $height) - { - return WideImage_TrueColorImage::create($width, $height); - } - - /** - * Check whether the given handle is a valid GD resource - * - * @param mixed $handle The variable to check - * @return bool - */ - static function isValidImageHandle($handle) - { - return (is_resource($handle) && get_resource_type($handle) == 'gd'); - } - - /** - * Throws exception if the handle isn't a valid GD resource - * - * @param mixed $handle The variable to check - */ - static function assertValidImageHandle($handle) - { - if (!self::isValidImageHandle($handle)) - throw new WideImage_InvalidImageHandleException("{$handle} is not a valid image handle."); - } - } - - WideImage::checkGD(); - - WideImage::registerCustomMapper('WideImage_Mapper_BMP', 'image/bmp', 'bmp'); - WideImage::registerCustomMapper('WideImage_Mapper_TGA', 'image/tga', 'tga'); - \ No newline at end of file diff --git a/app/Vendor/WideImage/vendor/de77/BMP.php b/app/Vendor/WideImage/vendor/de77/BMP.php deleted file mode 100755 index 2f5521144c..0000000000 --- a/app/Vendor/WideImage/vendor/de77/BMP.php +++ /dev/null @@ -1,264 +0,0 @@ -=0; $y--) - { - for ($x=0; $x<$wid; $x++) - { - $rgb = imagecolorat($img, $x, $y); - fwrite($f, self::byte3($rgb)); - } - fwrite($f, $wid_pad); - } - fclose($f); - } - else - { - foreach ($header AS $h) - { - echo $h; - } - - //save pixels - for ($y=$hei-1; $y>=0; $y--) - { - for ($x=0; $x<$wid; $x++) - { - $rgb = imagecolorat($img, $x, $y); - echo self::byte3($rgb); - } - echo $wid_pad; - } - } - return true; - } - - public static function imagecreatefromstring($data) - { - //read header - $pos = 0; - $header = substr($data, 0, 54); - $pos = 54; - - if (strlen($header) < 54) - return false; - - $header = unpack( 'c2identifier/Vfile_size/Vreserved/Vbitmap_data/Vheader_size/' . - 'Vwidth/Vheight/vplanes/vbits_per_pixel/Vcompression/Vdata_size/'. - 'Vh_resolution/Vv_resolution/Vcolors/Vimportant_colors', $header); - - if ($header['identifier1'] != 66 or $header['identifier2'] != 77) - { - return false; - //die('Not a valid bmp file'); - } - - if (!in_array($header['bits_per_pixel'], array(24, 32, 8, 4, 1))) - { - return false; - //die('Only 1, 4, 8, 24 and 32 bit BMP images are supported'); - } - - $bps = $header['bits_per_pixel']; //bits per pixel - $wid2 = ceil(($bps/8 * $header['width']) / 4) * 4; - $colors = pow(2, $bps); - - $wid = $header['width']; - $hei = $header['height']; - - $img = imagecreatetruecolor($header['width'], $header['height']); - - //read palette - if ($bps < 9) - { - for ($i=0; $i<$colors; $i++) - { - $palette[] = self::undword(substr($data, $pos, 4)); - $pos += 4; - } - } - else - { - if ($bps == 32) - { - imagealphablending($img, false); - imagesavealpha($img, true); - } - $palette = array(); - } - - //read pixels - for ($y=$hei-1; $y>=0; $y--) - { - $row = substr($data, $pos, $wid2); - $pos += $wid2; - $pixels = self::str_split2($row, $bps, $palette); - for ($x=0; $x<$wid; $x++) - { - self::makepixel($img, $x, $y, $pixels[$x], $bps); - } - } - - return $img; - } - - public static function imagecreatefrombmp($filename) - { - return self::imagecreatefromstring(file_get_contents($filename)); - } - - private static function str_split2($row, $bps, $palette) - { - switch ($bps) - { - case 32: - case 24: return str_split($row, $bps/8); - case 8: $out = array(); - $count = strlen($row); - for ($i=0; $i<$count; $i++) - { - $out[] = $palette[ ord($row[$i]) ]; - } - return $out; - case 4: $out = array(); - $count = strlen($row); - for ($i=0; $i<$count; $i++) - { - $roww = ord($row[$i]); - $out[] = $palette[ ($roww & 240) >> 4 ]; - $out[] = $palette[ ($roww & 15) ]; - } - return $out; - case 1: $out = array(); - $count = strlen($row); - for ($i=0; $i<$count; $i++) - { - $roww = ord($row[$i]); - $out[] = $palette[ ($roww & 128) >> 7 ]; - $out[] = $palette[ ($roww & 64) >> 6 ]; - $out[] = $palette[ ($roww & 32) >> 5 ]; - $out[] = $palette[ ($roww & 16) >> 4 ]; - $out[] = $palette[ ($roww & 8) >> 3 ]; - $out[] = $palette[ ($roww & 4) >> 2 ]; - $out[] = $palette[ ($roww & 2) >> 1 ]; - $out[] = $palette[ ($roww & 1) ]; - } - return $out; - } - } - - private static function makepixel($img, $x, $y, $str, $bps) - { - switch ($bps) - { - case 32 : $a = ord($str[0]); - $b = ord($str[1]); - $c = ord($str[2]); - $d = 256 - ord($str[3]); //TODO: gives imperfect results - $pixel = $d*256*256*256 + $c*256*256 + $b*256 + $a; - imagesetpixel($img, $x, $y, $pixel); - break; - case 24 : $a = ord($str[0]); - $b = ord($str[1]); - $c = ord($str[2]); - $pixel = $c*256*256 + $b*256 + $a; - imagesetpixel($img, $x, $y, $pixel); - break; - case 8 : - case 4 : - case 1 : imagesetpixel($img, $x, $y, $str); - break; - } - } - - private static function byte3($n) - { - return chr($n & 255) . chr(($n >> 8) & 255) . chr(($n >> 16) & 255); - } - - private static function undword($n) - { - $r = unpack("V", $n); - return $r[1]; - } - - private static function dword($n) - { - return pack("V", $n); - } - - private static function word($n) - { - return pack("v", $n); - } -} diff --git a/app/Vendor/WideImage/vendor/de77/TGA.php b/app/Vendor/WideImage/vendor/de77/TGA.php deleted file mode 100755 index 584f3c97c0..0000000000 --- a/app/Vendor/WideImage/vendor/de77/TGA.php +++ /dev/null @@ -1,206 +0,0 @@ -= $datalen) - { - break; - } - - $i++; - - if ($type == 0) //raw - { - for ($j=0; $j<3*$value; $j++) - { - $out .= $data[$j+$i]; - $k++; - } - $i += $value*3; - } - else //rle - { - for ($j=0; $j<$value; $j++) - { - $out .= $data[$i] . $data[$i+1] . $data[$i+2]; - $k++; - } - $i += 3; - } - } - return $out; - } - - static function dec_bits($byte, &$type, &$value) - { - $type = ($byte & 0x80) >> 7; - $value = 1 + ($byte & 0x7F); - } - - static function imagecreatefromstring($bin_data) - { - $bin_pos = 0; - $header = substr($bin_data, $bin_pos, 18); - $bin_pos += 18; - $header = unpack( "cimage_id_len/ccolor_map_type/cimage_type/vcolor_map_origin/vcolor_map_len/" . - "ccolor_map_entry_size/vx_origin/vy_origin/vwidth/vheight/" . - "cpixel_size/cdescriptor", $header); - - switch ($header['image_type']) - { - case 2: //no palette, uncompressed - case 10: //no palette, rle - break; - default: return false; //die('Unsupported TGA format'); - } - - if ($header['pixel_size'] != 24) - { - return false; - //die('Unsupported TGA color depth'); - } - - $bytes = $header['pixel_size'] / 8; - - if ($header['image_id_len'] > 0) - { - $header['image_id'] = substr($bin_data, $bin_pos, $header['image_id_len']); - $bin_pos += $header['image_id_len']; - } - else - { - $header['image_id'] = ''; - } - - $im = imagecreatetruecolor($header['width'], $header['height']); - - $size = $header['width'] * $header['height'] * 3; - - //-- check whether this is NEW TGA or not - $pos = $bin_pos; - $bin_pos = strlen($bin_data) - 26; - $newtga = substr($bin_data, $bin_pos, 26); - if (substr($newtga, 8, 16) != 'TRUEVISION-XFILE') - { - $newtga = false; - } - - $bin_pos = strlen($bin_data); - $datasize = $bin_pos - $pos; - if ($newtga) - { - $datasize -= 26; - } - - $bin_pos = $pos; - - //-- end of check - $data = substr($bin_data, $bin_pos, $datasize); - $bin_pos += $datasize; - if ($header['image_type'] == 10) - { - $data = self::rle_decode($data, $size); - } - if (self::bit5($header['descriptor']) == 1) - { - $reverse = true; - } - else - { - $reverse = false; - } - - $pixels = str_split($data, 3); - $i = 0; - - //read pixels - if ($reverse) - { - for ($y=0; $y<$header['height']; $y++) - { - for ($x=0; $x<$header['width']; $x++) - { - imagesetpixel($im, $x, $y, self::dwordize($pixels[$i])); - $i++; - } - } - } - else - { - for ($y=$header['height']-1; $y>=0; $y--) - { - for ($x=0; $x<$header['width']; $x++) - { - imagesetpixel($im, $x, $y, self::dwordize($pixels[$i])); - $i++; - } - } - } - - return $im; - } - - static function imagecreatefromtga($filename) - { - return self::imagecreatefromstring(file_get_contents($filename)); - } - - static function dwordize($str) - { - $a = ord($str[0]); - $b = ord($str[1]); - $c = ord($str[2]); - return $c*256*256 + $b*256 + $a; - } - - static function bit5($x) - { - return ($x & 32) >> 5; - } -} \ No newline at end of file diff --git a/app/Vendor/autoload.php b/app/Vendor/autoload.php deleted file mode 100644 index d8ea73ad6b..0000000000 --- a/app/Vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - p, - > ul { - margin-bottom: 0; - } - > p + p { - margin-top: 5px; - } -} - -// Dismissable alerts -// -// Expand the right padding and account for the close button's positioning. - -.alert-dismissable { - padding-right: (@alert-padding + 20); - - // Adjust close link position - .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; - } -} - -// Alternate styles -// -// Generate contextual modifier classes for colorizing the alert. - -.alert-success { - .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); -} -.alert-info { - .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); -} -.alert-warning { - .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); -} -.alert-danger { - .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); -} diff --git a/app/Vendor/bootstrap/less/badges.less b/app/Vendor/bootstrap/less/badges.less deleted file mode 100755 index 56828cab7c..0000000000 --- a/app/Vendor/bootstrap/less/badges.less +++ /dev/null @@ -1,55 +0,0 @@ -// -// Badges -// -------------------------------------------------- - - -// Base classes -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: @font-size-small; - font-weight: @badge-font-weight; - color: @badge-color; - line-height: @badge-line-height; - vertical-align: baseline; - white-space: nowrap; - text-align: center; - background-color: @badge-bg; - border-radius: @badge-border-radius; - - // Empty badges collapse automatically (not available in IE8) - &:empty { - display: none; - } - - // Quick fix for badges in buttons - .btn & { - position: relative; - top: -1px; - } - .btn-xs & { - top: 0; - padding: 1px 5px; - } -} - -// Hover state, but only for links -a.badge { - &:hover, - &:focus { - color: @badge-link-hover-color; - text-decoration: none; - cursor: pointer; - } -} - -// Account for counters in navs -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: @badge-active-color; - background-color: @badge-active-bg; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} diff --git a/app/Vendor/bootstrap/less/bootstrap.less b/app/Vendor/bootstrap/less/bootstrap.less deleted file mode 100755 index b368b87107..0000000000 --- a/app/Vendor/bootstrap/less/bootstrap.less +++ /dev/null @@ -1,49 +0,0 @@ -// Core variables and mixins -@import "variables.less"; -@import "mixins.less"; - -// Reset -@import "normalize.less"; -@import "print.less"; - -// Core CSS -@import "scaffolding.less"; -@import "type.less"; -@import "code.less"; -@import "grid.less"; -@import "tables.less"; -@import "forms.less"; -@import "buttons.less"; - -// Components -@import "component-animations.less"; -@import "glyphicons.less"; -@import "dropdowns.less"; -@import "button-groups.less"; -@import "input-groups.less"; -@import "navs.less"; -@import "navbar.less"; -@import "breadcrumbs.less"; -@import "pagination.less"; -@import "pager.less"; -@import "labels.less"; -@import "badges.less"; -@import "jumbotron.less"; -@import "thumbnails.less"; -@import "alerts.less"; -@import "progress-bars.less"; -@import "media.less"; -@import "list-group.less"; -@import "panels.less"; -@import "wells.less"; -@import "close.less"; - -// Components w/ JavaScript -@import "modals.less"; -@import "tooltip.less"; -@import "popovers.less"; -@import "carousel.less"; - -// Utility classes -@import "utilities.less"; -@import "responsive-utilities.less"; diff --git a/app/Vendor/bootstrap/less/breadcrumbs.less b/app/Vendor/bootstrap/less/breadcrumbs.less deleted file mode 100755 index cb01d503fb..0000000000 --- a/app/Vendor/bootstrap/less/breadcrumbs.less +++ /dev/null @@ -1,26 +0,0 @@ -// -// Breadcrumbs -// -------------------------------------------------- - - -.breadcrumb { - padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; - margin-bottom: @line-height-computed; - list-style: none; - background-color: @breadcrumb-bg; - border-radius: @border-radius-base; - - > li { - display: inline-block; - - + li:before { - content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space - padding: 0 5px; - color: @breadcrumb-color; - } - } - - > .active { - color: @breadcrumb-active-color; - } -} diff --git a/app/Vendor/bootstrap/less/button-groups.less b/app/Vendor/bootstrap/less/button-groups.less deleted file mode 100755 index 58fd906752..0000000000 --- a/app/Vendor/bootstrap/less/button-groups.less +++ /dev/null @@ -1,226 +0,0 @@ -// -// Button groups -// -------------------------------------------------- - -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; // match .btn alignment given font-size hack above - > .btn { - position: relative; - float: left; - // Bring the "active" button to the front - &:hover, - &:focus, - &:active, - &.active { - z-index: 2; - } - &:focus { - // Remove focus outline when dropdown JS adds it after closing the menu - outline: none; - } - } -} - -// Prevent double borders when buttons are next to each other -.btn-group { - .btn + .btn, - .btn + .btn-group, - .btn-group + .btn, - .btn-group + .btn-group { - margin-left: -1px; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - margin-left: -5px; // Offset the first child's margin - &:extend(.clearfix all); - - .btn-group, - .input-group { - float: left; - } - > .btn, - > .btn-group, - > .input-group { - margin-left: 5px; - } -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match -.btn-group > .btn:first-child { - margin-left: 0; - &:not(:last-child):not(.dropdown-toggle) { - .border-right-radius(0); - } -} -// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - .border-left-radius(0); -} - -// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child { - > .btn:last-child, - > .dropdown-toggle { - .border-right-radius(0); - } -} -.btn-group > .btn-group:last-child > .btn:first-child { - .border-left-radius(0); -} - -// On active and open, don't show outline -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - - -// Sizing -// -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-xs > .btn { .btn-xs(); } -.btn-group-sm > .btn { .btn-sm(); } -.btn-group-lg > .btn { .btn-lg(); } - - -// Split button dropdowns -// ---------------------- - -// Give the line between buttons some depth -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} - -// The clickable button for toggling the menu -// Remove the gradient and set the same inset shadow as the :active state -.btn-group.open .dropdown-toggle { - .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - .box-shadow(none); - } -} - - -// Reposition the caret -.btn .caret { - margin-left: 0; -} -// Carets in other button sizes -.btn-lg .caret { - border-width: @caret-width-large @caret-width-large 0; - border-bottom-width: 0; -} -// Upside down carets for .dropup -.dropup .btn-lg .caret { - border-width: 0 @caret-width-large @caret-width-large; -} - - -// Vertical button groups -// ---------------------- - -.btn-group-vertical { - > .btn, - > .btn-group, - > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; - } - - // Clear floats so dropdown menus can be properly placed - > .btn-group { - &:extend(.clearfix all); - > .btn { - float: none; - } - } - - > .btn + .btn, - > .btn + .btn-group, - > .btn-group + .btn, - > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; - } -} - -.btn-group-vertical > .btn { - &:not(:first-child):not(:last-child) { - border-radius: 0; - } - &:first-child:not(:last-child) { - border-top-right-radius: @border-radius-base; - .border-bottom-radius(0); - } - &:last-child:not(:first-child) { - border-bottom-left-radius: @border-radius-base; - .border-top-radius(0); - } -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) { - > .btn:last-child, - > .dropdown-toggle { - .border-bottom-radius(0); - } -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - .border-top-radius(0); -} - - - -// Justified button groups -// ---------------------- - -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; - > .btn, - > .btn-group { - float: none; - display: table-cell; - width: 1%; - } - > .btn-group .btn { - width: 100%; - } -} - - -// Checkbox and radio options -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} diff --git a/app/Vendor/bootstrap/less/buttons.less b/app/Vendor/bootstrap/less/buttons.less deleted file mode 100755 index 4858a8aeaf..0000000000 --- a/app/Vendor/bootstrap/less/buttons.less +++ /dev/null @@ -1,155 +0,0 @@ -// -// Buttons -// -------------------------------------------------- - - -// Base styles -// -------------------------------------------------- - -.btn { - display: inline-block; - margin-bottom: 0; // For input.btn - font-weight: @btn-font-weight; - text-align: center; - vertical-align: middle; - cursor: pointer; - background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 - border: 1px solid transparent; - white-space: nowrap; - .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base); - .user-select(none); - - &:focus { - .tab-focus(); - } - - &:hover, - &:focus { - color: @btn-default-color; - text-decoration: none; - } - - &:active, - &.active { - outline: 0; - background-image: none; - .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); - } - - &.disabled, - &[disabled], - fieldset[disabled] & { - cursor: not-allowed; - pointer-events: none; // Future-proof disabling of clicks - .opacity(.65); - .box-shadow(none); - } -} - - -// Alternate buttons -// -------------------------------------------------- - -.btn-default { - .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); -} -.btn-primary { - .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); -} -// Success appears as green -.btn-success { - .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); -} -// Info appears as blue-green -.btn-info { - .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); -} -// Warning appears as orange -.btn-warning { - .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); -} -// Danger and error appear as red -.btn-danger { - .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); -} - - -// Link buttons -// ------------------------- - -// Make a button look and behave like a link -.btn-link { - color: @link-color; - font-weight: normal; - cursor: pointer; - border-radius: 0; - - &, - &:active, - &[disabled], - fieldset[disabled] & { - background-color: transparent; - .box-shadow(none); - } - &, - &:hover, - &:focus, - &:active { - border-color: transparent; - } - &:hover, - &:focus { - color: @link-hover-color; - text-decoration: underline; - background-color: transparent; - } - &[disabled], - fieldset[disabled] & { - &:hover, - &:focus { - color: @btn-link-disabled-color; - text-decoration: none; - } - } -} - - -// Button Sizes -// -------------------------------------------------- - -.btn-lg { - // line-height: ensure even-numbered height of button next to large input - .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); -} -.btn-sm { - // line-height: ensure proper height of button next to small input - .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); -} -.btn-xs { - .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small); -} - - -// Block button -// -------------------------------------------------- - -.btn-block { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; -} - -// Vertically space out multiple block buttons -.btn-block + .btn-block { - margin-top: 5px; -} - -// Specificity overrides -input[type="submit"], -input[type="reset"], -input[type="button"] { - &.btn-block { - width: 100%; - } -} diff --git a/app/Vendor/bootstrap/less/carousel.less b/app/Vendor/bootstrap/less/carousel.less deleted file mode 100755 index e53365df43..0000000000 --- a/app/Vendor/bootstrap/less/carousel.less +++ /dev/null @@ -1,232 +0,0 @@ -// -// Carousel -// -------------------------------------------------- - - -// Wrapper for the slide container and indicators -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - overflow: hidden; - width: 100%; - - > .item { - display: none; - position: relative; - .transition(.6s ease-in-out left); - - // Account for jankitude on images - > img, - > a > img { - .img-responsive(); - line-height: 1; - } - } - - > .active, - > .next, - > .prev { display: block; } - - > .active { - left: 0; - } - - > .next, - > .prev { - position: absolute; - top: 0; - width: 100%; - } - - > .next { - left: 100%; - } - > .prev { - left: -100%; - } - > .next.left, - > .prev.right { - left: 0; - } - - > .active.left { - left: -100%; - } - > .active.right { - left: 100%; - } - -} - -// Left/right controls for nav -// --------------------------- - -.carousel-control { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: @carousel-control-width; - .opacity(@carousel-control-opacity); - font-size: @carousel-control-font-size; - color: @carousel-control-color; - text-align: center; - text-shadow: @carousel-text-shadow; - // We can't have this transition here because WebKit cancels the carousel - // animation if you trip this while in the middle of another animation. - - // Set gradients for backgrounds - &.left { - #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); - } - &.right { - left: auto; - right: 0; - #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); - } - - // Hover/focus state - &:hover, - &:focus { - outline: none; - color: @carousel-control-color; - text-decoration: none; - .opacity(.9); - } - - // Toggles - .icon-prev, - .icon-next, - .glyphicon-chevron-left, - .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - } - .icon-prev, - .glyphicon-chevron-left { - left: 50%; - } - .icon-next, - .glyphicon-chevron-right { - right: 50%; - } - .icon-prev, - .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; - } - - .icon-prev { - &:before { - content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) - } - } - .icon-next { - &:before { - content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) - } - } -} - -// Optional indicator pips -// -// Add an unordered list with the following class and add a list item for each -// slide your carousel holds. - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - margin-left: -30%; - padding-left: 0; - list-style: none; - text-align: center; - - li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - border: 1px solid @carousel-indicator-border-color; - border-radius: 10px; - cursor: pointer; - - // IE8-9 hack for event handling - // - // Internet Explorer 8-9 does not support clicks on elements without a set - // `background-color`. We cannot use `filter` since that's not viewed as a - // background color by the browser. Thus, a hack is needed. - // - // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we - // set alpha transparency for the best results possible. - background-color: #000 \9; // IE8 - background-color: rgba(0,0,0,0); // IE9 - } - .active { - margin: 0; - width: 12px; - height: 12px; - background-color: @carousel-indicator-active-bg; - } -} - -// Optional captions -// ----------------------------- -// Hidden by default for smaller viewports -.carousel-caption { - position: absolute; - left: 15%; - right: 15%; - bottom: 20px; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: @carousel-caption-color; - text-align: center; - text-shadow: @carousel-text-shadow; - & .btn { - text-shadow: none; // No shadow for button elements in carousel-caption - } -} - - -// Scale up controls for tablets and up -@media screen and (min-width: @screen-sm-min) { - - // Scale up the controls a smidge - .carousel-control { - .glyphicons-chevron-left, - .glyphicons-chevron-right, - .icon-prev, - .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - } - - // Show and left align the captions - .carousel-caption { - left: 20%; - right: 20%; - padding-bottom: 30px; - } - - // Move up the indicators - .carousel-indicators { - bottom: 20px; - } -} diff --git a/app/Vendor/bootstrap/less/close.less b/app/Vendor/bootstrap/less/close.less deleted file mode 100755 index 9b4e74f2b8..0000000000 --- a/app/Vendor/bootstrap/less/close.less +++ /dev/null @@ -1,33 +0,0 @@ -// -// Close icons -// -------------------------------------------------- - - -.close { - float: right; - font-size: (@font-size-base * 1.5); - font-weight: @close-font-weight; - line-height: 1; - color: @close-color; - text-shadow: @close-text-shadow; - .opacity(.2); - - &:hover, - &:focus { - color: @close-color; - text-decoration: none; - cursor: pointer; - .opacity(.5); - } - - // Additional properties for button version - // iOS requires the button element instead of an anchor tag. - // If you want the anchor version, it requires `href="#"`. - button& { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; - } -} diff --git a/app/Vendor/bootstrap/less/code.less b/app/Vendor/bootstrap/less/code.less deleted file mode 100755 index 3eed26c05b..0000000000 --- a/app/Vendor/bootstrap/less/code.less +++ /dev/null @@ -1,63 +0,0 @@ -// -// Code (inline and block) -// -------------------------------------------------- - - -// Inline and block code styles -code, -kbd, -pre, -samp { - font-family: @font-family-monospace; -} - -// Inline code -code { - padding: 2px 4px; - font-size: 90%; - color: @code-color; - background-color: @code-bg; - white-space: nowrap; - border-radius: @border-radius-base; -} - -// User input typically entered via keyboard -kbd { - padding: 2px 4px; - font-size: 90%; - color: @kbd-color; - background-color: @kbd-bg; - border-radius: @border-radius-small; - box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); -} - -// Blocks of code -pre { - display: block; - padding: ((@line-height-computed - 1) / 2); - margin: 0 0 (@line-height-computed / 2); - font-size: (@font-size-base - 1); // 14px to 13px - line-height: @line-height-base; - word-break: break-all; - word-wrap: break-word; - color: @pre-color; - background-color: @pre-bg; - border: 1px solid @pre-border-color; - border-radius: @border-radius-base; - - // Account for some code outputs that place code tags in pre tags - code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; - } -} - -// Enable scrollable blocks of code -.pre-scrollable { - max-height: @pre-scrollable-max-height; - overflow-y: scroll; -} diff --git a/app/Vendor/bootstrap/less/component-animations.less b/app/Vendor/bootstrap/less/component-animations.less deleted file mode 100755 index 1efe45e2c3..0000000000 --- a/app/Vendor/bootstrap/less/component-animations.less +++ /dev/null @@ -1,29 +0,0 @@ -// -// Component animations -// -------------------------------------------------- - -// Heads up! -// -// We don't use the `.opacity()` mixin here since it causes a bug with text -// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552. - -.fade { - opacity: 0; - .transition(opacity .15s linear); - &.in { - opacity: 1; - } -} - -.collapse { - display: none; - &.in { - display: block; - } -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - .transition(height .35s ease); -} diff --git a/app/Vendor/bootstrap/less/dropdowns.less b/app/Vendor/bootstrap/less/dropdowns.less deleted file mode 100755 index f165165e7a..0000000000 --- a/app/Vendor/bootstrap/less/dropdowns.less +++ /dev/null @@ -1,213 +0,0 @@ -// -// Dropdown menus -// -------------------------------------------------- - - -// Dropdown arrow/caret -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: @caret-width-base solid; - border-right: @caret-width-base solid transparent; - border-left: @caret-width-base solid transparent; -} - -// The dropdown wrapper (div) -.dropdown { - position: relative; -} - -// Prevent the focus on the dropdown toggle when closing dropdowns -.dropdown-toggle:focus { - outline: 0; -} - -// The dropdown menu (ul) -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: @zindex-dropdown; - display: none; // none by default, but block on "open" of the menu - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; // override default ul - list-style: none; - font-size: @font-size-base; - background-color: @dropdown-bg; - border: 1px solid @dropdown-fallback-border; // IE8 fallback - border: 1px solid @dropdown-border; - border-radius: @border-radius-base; - .box-shadow(0 6px 12px rgba(0,0,0,.175)); - background-clip: padding-box; - - // Aligns the dropdown menu to right - // - // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` - &.pull-right { - right: 0; - left: auto; - } - - // Dividers (basically an hr) within the dropdown - .divider { - .nav-divider(@dropdown-divider-bg); - } - - // Links within the dropdown menu - > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: @line-height-base; - color: @dropdown-link-color; - white-space: nowrap; // prevent links from randomly breaking onto new lines - } -} - -// Hover/Focus state -.dropdown-menu > li > a { - &:hover, - &:focus { - text-decoration: none; - color: @dropdown-link-hover-color; - background-color: @dropdown-link-hover-bg; - } -} - -// Active state -.dropdown-menu > .active > a { - &, - &:hover, - &:focus { - color: @dropdown-link-active-color; - text-decoration: none; - outline: 0; - background-color: @dropdown-link-active-bg; - } -} - -// Disabled state -// -// Gray out text and ensure the hover/focus state remains gray - -.dropdown-menu > .disabled > a { - &, - &:hover, - &:focus { - color: @dropdown-link-disabled-color; - } -} -// Nuke hover/focus effects -.dropdown-menu > .disabled > a { - &:hover, - &:focus { - text-decoration: none; - background-color: transparent; - background-image: none; // Remove CSS gradient - .reset-filter(); - cursor: not-allowed; - } -} - -// Open state for the dropdown -.open { - // Show the menu - > .dropdown-menu { - display: block; - } - - // Remove the outline when :focus is triggered - > a { - outline: 0; - } -} - -// Menu positioning -// -// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown -// menu with the parent. -.dropdown-menu-right { - left: auto; // Reset the default from `.dropdown-menu` - right: 0; -} -// With v3, we enabled auto-flipping if you have a dropdown within a right -// aligned nav component. To enable the undoing of that, we provide an override -// to restore the default dropdown menu alignment. -// -// This is only for left-aligning a dropdown menu within a `.navbar-right` or -// `.pull-right` nav component. -.dropdown-menu-left { - left: 0; - right: auto; -} - -// Dropdown section headers -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: @font-size-small; - line-height: @line-height-base; - color: @dropdown-header-color; -} - -// Backdrop to catch body clicks on mobile, etc. -.dropdown-backdrop { - position: fixed; - left: 0; - right: 0; - bottom: 0; - top: 0; - z-index: (@zindex-dropdown - 10); -} - -// Right aligned dropdowns -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -// Allow for dropdowns to go bottom up (aka, dropup-menu) -// -// Just add .dropup after the standard .dropdown class and you're set, bro. -// TODO: abstract this so that the navbar fixed styles are not placed here? - -.dropup, -.navbar-fixed-bottom .dropdown { - // Reverse the caret - .caret { - border-top: 0; - border-bottom: @caret-width-base solid; - content: ""; - } - // Different positioning for bottom up menu - .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; - } -} - - -// Component alignment -// -// Reiterate per navbar.less and the modified component alignment there. - -@media (min-width: @grid-float-breakpoint) { - .navbar-right { - .dropdown-menu { - .dropdown-menu-right(); - } - // Necessary for overrides of the default right aligned menu. - // Will remove come v4 in all likelihood. - .dropdown-menu-left { - .dropdown-menu-left(); - } - } -} - diff --git a/app/Vendor/bootstrap/less/forms.less b/app/Vendor/bootstrap/less/forms.less deleted file mode 100755 index d0189d0cc8..0000000000 --- a/app/Vendor/bootstrap/less/forms.less +++ /dev/null @@ -1,419 +0,0 @@ -// -// Forms -// -------------------------------------------------- - - -// Normalize non-controls -// -// Restyle and baseline non-control form elements. - -fieldset { - padding: 0; - margin: 0; - border: 0; - // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets, - // so we reset that to ensure it behaves more like a standard block element. - // See https://github.com/twbs/bootstrap/issues/12359. - min-width: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: @line-height-computed; - font-size: (@font-size-base * 1.5); - line-height: inherit; - color: @legend-color; - border: 0; - border-bottom: 1px solid @legend-border-color; -} - -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} - - -// Normalize form controls -// -// While most of our form styles require extra classes, some basic normalization -// is required to ensure optimum display with or without those classes to better -// address browser inconsistencies. - -// Override content-box in Normalize (* isn't specific enough) -input[type="search"] { - .box-sizing(border-box); -} - -// Position radios and checkboxes better -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; /* IE8-9 */ - line-height: normal; -} - -// Set the height of file controls to match text inputs -input[type="file"] { - display: block; -} - -// Make range inputs behave like textual form controls -input[type="range"] { - display: block; - width: 100%; -} - -// Make multiple select elements height not fixed -select[multiple], -select[size] { - height: auto; -} - -// Focus for file, radio, and checkbox -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - .tab-focus(); -} - -// Adjust output element -output { - display: block; - padding-top: (@padding-base-vertical + 1); - font-size: @font-size-base; - line-height: @line-height-base; - color: @input-color; -} - - -// Common form controls -// -// Shared size and type resets for form controls. Apply `.form-control` to any -// of the following form controls: -// -// select -// textarea -// input[type="text"] -// input[type="password"] -// input[type="datetime"] -// input[type="datetime-local"] -// input[type="date"] -// input[type="month"] -// input[type="time"] -// input[type="week"] -// input[type="number"] -// input[type="email"] -// input[type="url"] -// input[type="search"] -// input[type="tel"] -// input[type="color"] - -.form-control { - display: block; - width: 100%; - height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) - padding: @padding-base-vertical @padding-base-horizontal; - font-size: @font-size-base; - line-height: @line-height-base; - color: @input-color; - background-color: @input-bg; - background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 - border: 1px solid @input-border; - border-radius: @input-border-radius; - .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); - .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); - - // Customize the `:focus` state to imitate native WebKit styles. - .form-control-focus(); - - // Placeholder - .placeholder(); - - // Disabled and read-only inputs - // Note: HTML5 says that controls under a fieldset > legend:first-child won't - // be disabled if the fieldset is disabled. Due to implementation difficulty, - // we don't honor that edge case; we style them as disabled anyway. - &[disabled], - &[readonly], - fieldset[disabled] & { - cursor: not-allowed; - background-color: @input-bg-disabled; - opacity: 1; // iOS fix for unreadable disabled content - } - - // Reset height for `textarea`s - textarea& { - height: auto; - } -} - -// Special styles for iOS date input -// -// In Mobile Safari, date inputs require a pixel line-height that matches the -// given height of the input. -input[type="date"] { - line-height: @input-height-base; -} - - -// Form groups -// -// Designed to help with the organization and spacing of vertical forms. For -// horizontal forms, use the predefined grid classes. - -.form-group { - margin-bottom: 15px; -} - - -// Checkboxes and radios -// -// Indent the labels to position radios/checkboxes as hanging controls. - -.radio, -.checkbox { - display: block; - min-height: @line-height-computed; // clear the floating input if there is no label text - margin-top: 10px; - margin-bottom: 10px; - padding-left: 20px; - label { - display: inline; - font-weight: normal; - cursor: pointer; - } -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing -} - -// Radios and checkboxes on same line -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - vertical-align: middle; - font-weight: normal; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; // space out consecutive inline controls -} - -// Apply same disabled cursor tweak as for inputs -// -// Note: Neither radios nor checkboxes can be readonly. -input[type="radio"], -input[type="checkbox"], -.radio, -.radio-inline, -.checkbox, -.checkbox-inline { - &[disabled], - fieldset[disabled] & { - cursor: not-allowed; - } -} - - -// Form control sizing -// -// Build on `.form-control` with modifier classes to decrease or increase the -// height and font-size of form controls. - -.input-sm { - .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); -} - -.input-lg { - .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); -} - - -// Form control feedback states -// -// Apply contextual and semantic states to individual form controls. - -.has-feedback { - // Enable absolute positioning - position: relative; - - // Ensure icons don't overlap text - .form-control { - padding-right: (@input-height-base * 1.25); - } - - // Feedback icon (requires .glyphicon classes) - .form-control-feedback { - position: absolute; - top: (@line-height-computed + 5); // Height of the `label` and its margin - right: 0; - display: block; - width: @input-height-base; - height: @input-height-base; - line-height: @input-height-base; - text-align: center; - } -} - -// Feedback states -.has-success { - .form-control-validation(@state-success-text; @state-success-text; @state-success-bg); -} -.has-warning { - .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg); -} -.has-error { - .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg); -} - - -// Static form control text -// -// Apply class to a `p` element to make any string of text align with labels in -// a horizontal form layout. - -.form-control-static { - margin-bottom: 0; // Remove default margin from `p` -} - - -// Help text -// -// Apply to any element you wish to create light text for placement immediately -// below a form control. Use for general help, formatting, or instructional text. - -.help-block { - display: block; // account for any element using help-block - margin-top: 5px; - margin-bottom: 10px; - color: lighten(@text-color, 25%); // lighten the text some for contrast -} - - - -// Inline forms -// -// Make forms appear inline(-block) by adding the `.form-inline` class. Inline -// forms begin stacked on extra small (mobile) devices and then go inline when -// viewports reach <768px. -// -// Requires wrapping inputs and labels with `.form-group` for proper display of -// default HTML form controls and our custom form controls (e.g., input groups). -// -// Heads up! This is mixin-ed into `.navbar-form` in navbars.less. - -.form-inline { - - // Kick in the inline - @media (min-width: @screen-sm-min) { - // Inline-block all the things for "inline" - .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - - // In navbar-form, allow folks to *not* use `.form-group` - .form-control { - display: inline-block; - width: auto; // Prevent labels from stacking above inputs in `.form-group` - vertical-align: middle; - } - - .control-label { - margin-bottom: 0; - vertical-align: middle; - } - - // Remove default margin on radios/checkboxes that were used for stacking, and - // then undo the floating of radios and checkboxes to match (which also avoids - // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969). - .radio, - .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - padding-left: 0; - vertical-align: middle; - } - .radio input[type="radio"], - .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } - - // Validation states - // - // Reposition the icon because it's now within a grid column and columns have - // `position: relative;` on them. Also accounts for the grid gutter padding. - .has-feedback .form-control-feedback { - top: 0; - } - } -} - - -// Horizontal forms -// -// Horizontal forms are built on grid classes and allow you to create forms with -// labels on the left and inputs on the right. - -.form-horizontal { - - // Consistent vertical alignment of labels, radios, and checkboxes - .control-label, - .radio, - .checkbox, - .radio-inline, - .checkbox-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: (@padding-base-vertical + 1); // Default padding plus a border - } - // Account for padding we're adding to ensure the alignment and of help text - // and other content below items - .radio, - .checkbox { - min-height: (@line-height-computed + (@padding-base-vertical + 1)); - } - - // Make form groups behave like rows - .form-group { - .make-row(); - } - - .form-control-static { - padding-top: (@padding-base-vertical + 1); - } - - // Only right align form labels here when the columns stop stacking - @media (min-width: @screen-sm-min) { - .control-label { - text-align: right; - } - } - - // Validation states - // - // Reposition the icon because it's now within a grid column and columns have - // `position: relative;` on them. Also accounts for the grid gutter padding. - .has-feedback .form-control-feedback { - top: 0; - right: (@grid-gutter-width / 2); - } -} diff --git a/app/Vendor/bootstrap/less/glyphicons.less b/app/Vendor/bootstrap/less/glyphicons.less deleted file mode 100755 index 789c5e7f4a..0000000000 --- a/app/Vendor/bootstrap/less/glyphicons.less +++ /dev/null @@ -1,233 +0,0 @@ -// -// Glyphicons for Bootstrap -// -// Since icons are fonts, they can be placed anywhere text is placed and are -// thus automatically sized to match the surrounding child. To use, create an -// inline element with the appropriate classes, like so: -// -// Star - -// Import the fonts -@font-face { - font-family: 'Glyphicons Halflings'; - src: ~"url('@{icon-font-path}@{icon-font-name}.eot')"; - src: ~"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')", - ~"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')", - ~"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')", - ~"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')"; -} - -// Catchall baseclass -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -// Individual icons -.glyphicon-asterisk { &:before { content: "\2a"; } } -.glyphicon-plus { &:before { content: "\2b"; } } -.glyphicon-euro { &:before { content: "\20ac"; } } -.glyphicon-minus { &:before { content: "\2212"; } } -.glyphicon-cloud { &:before { content: "\2601"; } } -.glyphicon-envelope { &:before { content: "\2709"; } } -.glyphicon-pencil { &:before { content: "\270f"; } } -.glyphicon-glass { &:before { content: "\e001"; } } -.glyphicon-music { &:before { content: "\e002"; } } -.glyphicon-search { &:before { content: "\e003"; } } -.glyphicon-heart { &:before { content: "\e005"; } } -.glyphicon-star { &:before { content: "\e006"; } } -.glyphicon-star-empty { &:before { content: "\e007"; } } -.glyphicon-user { &:before { content: "\e008"; } } -.glyphicon-film { &:before { content: "\e009"; } } -.glyphicon-th-large { &:before { content: "\e010"; } } -.glyphicon-th { &:before { content: "\e011"; } } -.glyphicon-th-list { &:before { content: "\e012"; } } -.glyphicon-ok { &:before { content: "\e013"; } } -.glyphicon-remove { &:before { content: "\e014"; } } -.glyphicon-zoom-in { &:before { content: "\e015"; } } -.glyphicon-zoom-out { &:before { content: "\e016"; } } -.glyphicon-off { &:before { content: "\e017"; } } -.glyphicon-signal { &:before { content: "\e018"; } } -.glyphicon-cog { &:before { content: "\e019"; } } -.glyphicon-trash { &:before { content: "\e020"; } } -.glyphicon-home { &:before { content: "\e021"; } } -.glyphicon-file { &:before { content: "\e022"; } } -.glyphicon-time { &:before { content: "\e023"; } } -.glyphicon-road { &:before { content: "\e024"; } } -.glyphicon-download-alt { &:before { content: "\e025"; } } -.glyphicon-download { &:before { content: "\e026"; } } -.glyphicon-upload { &:before { content: "\e027"; } } -.glyphicon-inbox { &:before { content: "\e028"; } } -.glyphicon-play-circle { &:before { content: "\e029"; } } -.glyphicon-repeat { &:before { content: "\e030"; } } -.glyphicon-refresh { &:before { content: "\e031"; } } -.glyphicon-list-alt { &:before { content: "\e032"; } } -.glyphicon-lock { &:before { content: "\e033"; } } -.glyphicon-flag { &:before { content: "\e034"; } } -.glyphicon-headphones { &:before { content: "\e035"; } } -.glyphicon-volume-off { &:before { content: "\e036"; } } -.glyphicon-volume-down { &:before { content: "\e037"; } } -.glyphicon-volume-up { &:before { content: "\e038"; } } -.glyphicon-qrcode { &:before { content: "\e039"; } } -.glyphicon-barcode { &:before { content: "\e040"; } } -.glyphicon-tag { &:before { content: "\e041"; } } -.glyphicon-tags { &:before { content: "\e042"; } } -.glyphicon-book { &:before { content: "\e043"; } } -.glyphicon-bookmark { &:before { content: "\e044"; } } -.glyphicon-print { &:before { content: "\e045"; } } -.glyphicon-camera { &:before { content: "\e046"; } } -.glyphicon-font { &:before { content: "\e047"; } } -.glyphicon-bold { &:before { content: "\e048"; } } -.glyphicon-italic { &:before { content: "\e049"; } } -.glyphicon-text-height { &:before { content: "\e050"; } } -.glyphicon-text-width { &:before { content: "\e051"; } } -.glyphicon-align-left { &:before { content: "\e052"; } } -.glyphicon-align-center { &:before { content: "\e053"; } } -.glyphicon-align-right { &:before { content: "\e054"; } } -.glyphicon-align-justify { &:before { content: "\e055"; } } -.glyphicon-list { &:before { content: "\e056"; } } -.glyphicon-indent-left { &:before { content: "\e057"; } } -.glyphicon-indent-right { &:before { content: "\e058"; } } -.glyphicon-facetime-video { &:before { content: "\e059"; } } -.glyphicon-picture { &:before { content: "\e060"; } } -.glyphicon-map-marker { &:before { content: "\e062"; } } -.glyphicon-adjust { &:before { content: "\e063"; } } -.glyphicon-tint { &:before { content: "\e064"; } } -.glyphicon-edit { &:before { content: "\e065"; } } -.glyphicon-share { &:before { content: "\e066"; } } -.glyphicon-check { &:before { content: "\e067"; } } -.glyphicon-move { &:before { content: "\e068"; } } -.glyphicon-step-backward { &:before { content: "\e069"; } } -.glyphicon-fast-backward { &:before { content: "\e070"; } } -.glyphicon-backward { &:before { content: "\e071"; } } -.glyphicon-play { &:before { content: "\e072"; } } -.glyphicon-pause { &:before { content: "\e073"; } } -.glyphicon-stop { &:before { content: "\e074"; } } -.glyphicon-forward { &:before { content: "\e075"; } } -.glyphicon-fast-forward { &:before { content: "\e076"; } } -.glyphicon-step-forward { &:before { content: "\e077"; } } -.glyphicon-eject { &:before { content: "\e078"; } } -.glyphicon-chevron-left { &:before { content: "\e079"; } } -.glyphicon-chevron-right { &:before { content: "\e080"; } } -.glyphicon-plus-sign { &:before { content: "\e081"; } } -.glyphicon-minus-sign { &:before { content: "\e082"; } } -.glyphicon-remove-sign { &:before { content: "\e083"; } } -.glyphicon-ok-sign { &:before { content: "\e084"; } } -.glyphicon-question-sign { &:before { content: "\e085"; } } -.glyphicon-info-sign { &:before { content: "\e086"; } } -.glyphicon-screenshot { &:before { content: "\e087"; } } -.glyphicon-remove-circle { &:before { content: "\e088"; } } -.glyphicon-ok-circle { &:before { content: "\e089"; } } -.glyphicon-ban-circle { &:before { content: "\e090"; } } -.glyphicon-arrow-left { &:before { content: "\e091"; } } -.glyphicon-arrow-right { &:before { content: "\e092"; } } -.glyphicon-arrow-up { &:before { content: "\e093"; } } -.glyphicon-arrow-down { &:before { content: "\e094"; } } -.glyphicon-share-alt { &:before { content: "\e095"; } } -.glyphicon-resize-full { &:before { content: "\e096"; } } -.glyphicon-resize-small { &:before { content: "\e097"; } } -.glyphicon-exclamation-sign { &:before { content: "\e101"; } } -.glyphicon-gift { &:before { content: "\e102"; } } -.glyphicon-leaf { &:before { content: "\e103"; } } -.glyphicon-fire { &:before { content: "\e104"; } } -.glyphicon-eye-open { &:before { content: "\e105"; } } -.glyphicon-eye-close { &:before { content: "\e106"; } } -.glyphicon-warning-sign { &:before { content: "\e107"; } } -.glyphicon-plane { &:before { content: "\e108"; } } -.glyphicon-calendar { &:before { content: "\e109"; } } -.glyphicon-random { &:before { content: "\e110"; } } -.glyphicon-comment { &:before { content: "\e111"; } } -.glyphicon-magnet { &:before { content: "\e112"; } } -.glyphicon-chevron-up { &:before { content: "\e113"; } } -.glyphicon-chevron-down { &:before { content: "\e114"; } } -.glyphicon-retweet { &:before { content: "\e115"; } } -.glyphicon-shopping-cart { &:before { content: "\e116"; } } -.glyphicon-folder-close { &:before { content: "\e117"; } } -.glyphicon-folder-open { &:before { content: "\e118"; } } -.glyphicon-resize-vertical { &:before { content: "\e119"; } } -.glyphicon-resize-horizontal { &:before { content: "\e120"; } } -.glyphicon-hdd { &:before { content: "\e121"; } } -.glyphicon-bullhorn { &:before { content: "\e122"; } } -.glyphicon-bell { &:before { content: "\e123"; } } -.glyphicon-certificate { &:before { content: "\e124"; } } -.glyphicon-thumbs-up { &:before { content: "\e125"; } } -.glyphicon-thumbs-down { &:before { content: "\e126"; } } -.glyphicon-hand-right { &:before { content: "\e127"; } } -.glyphicon-hand-left { &:before { content: "\e128"; } } -.glyphicon-hand-up { &:before { content: "\e129"; } } -.glyphicon-hand-down { &:before { content: "\e130"; } } -.glyphicon-circle-arrow-right { &:before { content: "\e131"; } } -.glyphicon-circle-arrow-left { &:before { content: "\e132"; } } -.glyphicon-circle-arrow-up { &:before { content: "\e133"; } } -.glyphicon-circle-arrow-down { &:before { content: "\e134"; } } -.glyphicon-globe { &:before { content: "\e135"; } } -.glyphicon-wrench { &:before { content: "\e136"; } } -.glyphicon-tasks { &:before { content: "\e137"; } } -.glyphicon-filter { &:before { content: "\e138"; } } -.glyphicon-briefcase { &:before { content: "\e139"; } } -.glyphicon-fullscreen { &:before { content: "\e140"; } } -.glyphicon-dashboard { &:before { content: "\e141"; } } -.glyphicon-paperclip { &:before { content: "\e142"; } } -.glyphicon-heart-empty { &:before { content: "\e143"; } } -.glyphicon-link { &:before { content: "\e144"; } } -.glyphicon-phone { &:before { content: "\e145"; } } -.glyphicon-pushpin { &:before { content: "\e146"; } } -.glyphicon-usd { &:before { content: "\e148"; } } -.glyphicon-gbp { &:before { content: "\e149"; } } -.glyphicon-sort { &:before { content: "\e150"; } } -.glyphicon-sort-by-alphabet { &:before { content: "\e151"; } } -.glyphicon-sort-by-alphabet-alt { &:before { content: "\e152"; } } -.glyphicon-sort-by-order { &:before { content: "\e153"; } } -.glyphicon-sort-by-order-alt { &:before { content: "\e154"; } } -.glyphicon-sort-by-attributes { &:before { content: "\e155"; } } -.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } } -.glyphicon-unchecked { &:before { content: "\e157"; } } -.glyphicon-expand { &:before { content: "\e158"; } } -.glyphicon-collapse-down { &:before { content: "\e159"; } } -.glyphicon-collapse-up { &:before { content: "\e160"; } } -.glyphicon-log-in { &:before { content: "\e161"; } } -.glyphicon-flash { &:before { content: "\e162"; } } -.glyphicon-log-out { &:before { content: "\e163"; } } -.glyphicon-new-window { &:before { content: "\e164"; } } -.glyphicon-record { &:before { content: "\e165"; } } -.glyphicon-save { &:before { content: "\e166"; } } -.glyphicon-open { &:before { content: "\e167"; } } -.glyphicon-saved { &:before { content: "\e168"; } } -.glyphicon-import { &:before { content: "\e169"; } } -.glyphicon-export { &:before { content: "\e170"; } } -.glyphicon-send { &:before { content: "\e171"; } } -.glyphicon-floppy-disk { &:before { content: "\e172"; } } -.glyphicon-floppy-saved { &:before { content: "\e173"; } } -.glyphicon-floppy-remove { &:before { content: "\e174"; } } -.glyphicon-floppy-save { &:before { content: "\e175"; } } -.glyphicon-floppy-open { &:before { content: "\e176"; } } -.glyphicon-credit-card { &:before { content: "\e177"; } } -.glyphicon-transfer { &:before { content: "\e178"; } } -.glyphicon-cutlery { &:before { content: "\e179"; } } -.glyphicon-header { &:before { content: "\e180"; } } -.glyphicon-compressed { &:before { content: "\e181"; } } -.glyphicon-earphone { &:before { content: "\e182"; } } -.glyphicon-phone-alt { &:before { content: "\e183"; } } -.glyphicon-tower { &:before { content: "\e184"; } } -.glyphicon-stats { &:before { content: "\e185"; } } -.glyphicon-sd-video { &:before { content: "\e186"; } } -.glyphicon-hd-video { &:before { content: "\e187"; } } -.glyphicon-subtitles { &:before { content: "\e188"; } } -.glyphicon-sound-stereo { &:before { content: "\e189"; } } -.glyphicon-sound-dolby { &:before { content: "\e190"; } } -.glyphicon-sound-5-1 { &:before { content: "\e191"; } } -.glyphicon-sound-6-1 { &:before { content: "\e192"; } } -.glyphicon-sound-7-1 { &:before { content: "\e193"; } } -.glyphicon-copyright-mark { &:before { content: "\e194"; } } -.glyphicon-registration-mark { &:before { content: "\e195"; } } -.glyphicon-cloud-download { &:before { content: "\e197"; } } -.glyphicon-cloud-upload { &:before { content: "\e198"; } } -.glyphicon-tree-conifer { &:before { content: "\e199"; } } -.glyphicon-tree-deciduous { &:before { content: "\e200"; } } diff --git a/app/Vendor/bootstrap/less/grid.less b/app/Vendor/bootstrap/less/grid.less deleted file mode 100755 index 88957f42a5..0000000000 --- a/app/Vendor/bootstrap/less/grid.less +++ /dev/null @@ -1,100 +0,0 @@ -// -// Grid system -// -------------------------------------------------- - - -// Container widths -// -// Set the container width, and override it for fixed navbars in media queries. - -.container { - .container-fixed(); - - @media (min-width: @screen-sm-min) { - width: @container-sm; - } - @media (min-width: @screen-md-min) { - width: @container-md; - } - @media (min-width: @screen-lg-min) { - width: @container-lg; - } -} - - -// Fluid container -// -// Utilizes the mixin meant for fixed width containers, but without any defined -// width for fluid, full width layouts. - -.container-fluid { - .container-fixed(); -} - - -// Row -// -// Rows contain and clear the floats of your columns. - -.row { - .make-row(); -} - - -// Columns -// -// Common styles for small and large grid columns - -.make-grid-columns(); - - -// Extra small grid -// -// Columns, offsets, pushes, and pulls for extra small devices like -// smartphones. - -.make-grid-columns-float(xs); -.make-grid(@grid-columns, xs, width); -.make-grid(@grid-columns, xs, pull); -.make-grid(@grid-columns, xs, push); -.make-grid(@grid-columns, xs, offset); - - -// Small grid -// -// Columns, offsets, pushes, and pulls for the small device range, from phones -// to tablets. - -@media (min-width: @screen-sm-min) { - .make-grid-columns-float(sm); - .make-grid(@grid-columns, sm, width); - .make-grid(@grid-columns, sm, pull); - .make-grid(@grid-columns, sm, push); - .make-grid(@grid-columns, sm, offset); -} - - -// Medium grid -// -// Columns, offsets, pushes, and pulls for the desktop device range. - -@media (min-width: @screen-md-min) { - .make-grid-columns-float(md); - .make-grid(@grid-columns, md, width); - .make-grid(@grid-columns, md, pull); - .make-grid(@grid-columns, md, push); - .make-grid(@grid-columns, md, offset); -} - - -// Large grid -// -// Columns, offsets, pushes, and pulls for the large desktop device range. - -@media (min-width: @screen-lg-min) { - .make-grid-columns-float(lg); - .make-grid(@grid-columns, lg, width); - .make-grid(@grid-columns, lg, pull); - .make-grid(@grid-columns, lg, push); - .make-grid(@grid-columns, lg, offset); -} diff --git a/app/Vendor/bootstrap/less/input-groups.less b/app/Vendor/bootstrap/less/input-groups.less deleted file mode 100755 index b486cf4d22..0000000000 --- a/app/Vendor/bootstrap/less/input-groups.less +++ /dev/null @@ -1,157 +0,0 @@ -// -// Input groups -// -------------------------------------------------- - -// Base styles -// ------------------------- -.input-group { - position: relative; // For dropdowns - display: table; - border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table - - // Undo padding and float of grid classes - &[class*="col-"] { - float: none; - padding-left: 0; - padding-right: 0; - } - - .form-control { - // IE9 fubars the placeholder attribute in text inputs and the arrows on - // select elements in input groups. To fix it, we float the input. Details: - // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855 - float: left; - - width: 100%; - margin-bottom: 0; - } -} - -// Sizing options -// -// Remix the default form control sizing classes into new ones for easier -// manipulation. - -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { .input-lg(); } -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { .input-sm(); } - - -// Display as table-cell -// ------------------------- -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; - - &:not(:first-child):not(:last-child) { - border-radius: 0; - } -} -// Addon and addon wrapper for buttons -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; // Match the inputs -} - -// Text input groups -// ------------------------- -.input-group-addon { - padding: @padding-base-vertical @padding-base-horizontal; - font-size: @font-size-base; - font-weight: normal; - line-height: 1; - color: @input-color; - text-align: center; - background-color: @input-group-addon-bg; - border: 1px solid @input-group-addon-border-color; - border-radius: @border-radius-base; - - // Sizing - &.input-sm { - padding: @padding-small-vertical @padding-small-horizontal; - font-size: @font-size-small; - border-radius: @border-radius-small; - } - &.input-lg { - padding: @padding-large-vertical @padding-large-horizontal; - font-size: @font-size-large; - border-radius: @border-radius-large; - } - - // Nuke default margins from checkboxes and radios to vertically center within. - input[type="radio"], - input[type="checkbox"] { - margin-top: 0; - } -} - -// Reset rounded corners -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - .border-right-radius(0); -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - .border-left-radius(0); -} -.input-group-addon:last-child { - border-left: 0; -} - -// Button input groups -// ------------------------- -.input-group-btn { - position: relative; - // Jankily prevent input button groups from wrapping with `white-space` and - // `font-size` in combination with `inline-block` on buttons. - font-size: 0; - white-space: nowrap; - - // Negative margin for spacing, position for bringing hovered/focused/actived - // element above the siblings. - > .btn { - position: relative; - + .btn { - margin-left: -1px; - } - // Bring the "active" button to the front - &:hover, - &:focus, - &:active { - z-index: 2; - } - } - - // Negative margin to only have a 1px border between the two - &:first-child { - > .btn, - > .btn-group { - margin-right: -1px; - } - } - &:last-child { - > .btn, - > .btn-group { - margin-left: -1px; - } - } -} diff --git a/app/Vendor/bootstrap/less/jumbotron.less b/app/Vendor/bootstrap/less/jumbotron.less deleted file mode 100755 index a15e169715..0000000000 --- a/app/Vendor/bootstrap/less/jumbotron.less +++ /dev/null @@ -1,44 +0,0 @@ -// -// Jumbotron -// -------------------------------------------------- - - -.jumbotron { - padding: @jumbotron-padding; - margin-bottom: @jumbotron-padding; - color: @jumbotron-color; - background-color: @jumbotron-bg; - - h1, - .h1 { - color: @jumbotron-heading-color; - } - p { - margin-bottom: (@jumbotron-padding / 2); - font-size: @jumbotron-font-size; - font-weight: 200; - } - - .container & { - border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container - } - - .container { - max-width: 100%; - } - - @media screen and (min-width: @screen-sm-min) { - padding-top: (@jumbotron-padding * 1.6); - padding-bottom: (@jumbotron-padding * 1.6); - - .container & { - padding-left: (@jumbotron-padding * 2); - padding-right: (@jumbotron-padding * 2); - } - - h1, - .h1 { - font-size: (@font-size-base * 4.5); - } - } -} diff --git a/app/Vendor/bootstrap/less/labels.less b/app/Vendor/bootstrap/less/labels.less deleted file mode 100755 index 5db1ed12c0..0000000000 --- a/app/Vendor/bootstrap/less/labels.less +++ /dev/null @@ -1,64 +0,0 @@ -// -// Labels -// -------------------------------------------------- - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: @label-color; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; - - // Add hover effects, but only for links - &[href] { - &:hover, - &:focus { - color: @label-link-hover-color; - text-decoration: none; - cursor: pointer; - } - } - - // Empty labels collapse automatically (not available in IE8) - &:empty { - display: none; - } - - // Quick fix for labels in buttons - .btn & { - position: relative; - top: -1px; - } -} - -// Colors -// Contextual variations (linked labels get darker on :hover) - -.label-default { - .label-variant(@label-default-bg); -} - -.label-primary { - .label-variant(@label-primary-bg); -} - -.label-success { - .label-variant(@label-success-bg); -} - -.label-info { - .label-variant(@label-info-bg); -} - -.label-warning { - .label-variant(@label-warning-bg); -} - -.label-danger { - .label-variant(@label-danger-bg); -} diff --git a/app/Vendor/bootstrap/less/list-group.less b/app/Vendor/bootstrap/less/list-group.less deleted file mode 100755 index 3343f8e5e2..0000000000 --- a/app/Vendor/bootstrap/less/list-group.less +++ /dev/null @@ -1,110 +0,0 @@ -// -// List groups -// -------------------------------------------------- - - -// Base class -// -// Easily usable on