Compare commits

..

No commits in common. "695f327ccd5363ccd9a5e209f575d45610dc3979" and "647bdfc6ae27ce6b2e5a3dec02067293bfa5359e" have entirely different histories.

251 changed files with 673 additions and 23644 deletions

0
.DS_Store vendored Executable file → Normal file
View File

0
.gitignore vendored Executable file → Normal file
View File

40
CHANGELOG.md Executable file → Normal file
View File

@ -7,46 +7,10 @@ y este proyecto adhiere a [Semantic Versioning](https://semver.org/lang/es/).
---
## [1.7.1] - 2026-05-04
### 🐛 Corregido
- **Falsos Positivos de IPs Disponibles**: Se eliminó el parámetro `suspended=true` en las consultas a la API de UISP (`/devices/ips`). Esto solucionó un error crítico donde los clientes activos eran excluidos de los resultados, lo que causaba que sus IPs asignadas (ej. segmento 54) se mostraran erróneamente como "disponibles". Ahora se muestran correctamente como "en uso".
## [1.7.0] - 2026-03-26
### ✨ Añadido
- **Detección de IPs Flotantes**: Nuevo sistema para identificar dispositivos con `authorized: false` (estado "Pending Adoption") que no eran detectados por `/devices/ips`.
- Método `obtenerIpsFlotantes()` en `IpSearchService.php`
- Campo `floating` en la respuesta JSON del backend
- Badge naranja "IP Flotante" con estado `⚠️ IP Flotante - {nombre} ({modelo})`
- Las IPs flotantes cuentan como "en uso" en las estadísticas
- **Workers Paralelos**: Sistema de pool de workers para validación concurrente de IPs.
- `runProgressiveValidation()` ahora usa 7 workers simultáneos (configurable)
- `runProgressiveVerification()` también usa 7 workers paralelos
- Progreso en tiempo real: `"Validando IP's... 45/100 procesadas, 8 disponibles"`
- Mejora de rendimiento de ~5-7x respecto a la versión secuencial
- **Inserción Ordenada**: Función `insertRowSorted()` que inserta IPs en la tabla manteniendo el orden por último octeto, sin importar qué worker termina primero.
### 🐛 Corregido
- **Numeración Consecutiva**: La columna `#` ahora muestra números consecutivos (1, 2, 3...) solo para filas visibles.
- Función `renumberVisibleRows()` recalcula la numeración al ocultar/mostrar IPs administrativas
- Corregido bug donde la numeración comenzaba en 49+ al ocultar filas admin
### 🔧 Mejorado
- **Rendimiento Frontend**: Búsqueda ~7x más rápida gracias a workers paralelos
- **Mensajes de progreso**: Actualizados para indicar modo paralelo y conteo de IPs procesadas
---
## [1.6.2] - 2025-12-09
### 🐛 Bug Fixes
- **Límite Inteligente (Smart Limit)**: Ahora la opción de límite (5, 10 IPs) busca activamente hasta encontrar esa cantidad de IPs *disponibles*. Antiguamente solo verificaba las primeras de la lista y si estaban ocupadas por ping devolvía 0 resultados.
## [1.6.1] - 2025-12-08
### 🚀 Mejoras de UX/UI
- Reorganización de elementos del formulario: Checkboxes apilados verticalmente (Ping arriba, Ocultar Admin abajo) y dropdown de límite al final.
- Reorganización de elementos del formulario: Checkboxes agrupados y dropdown de límite al final.
- **Mensajes de progreso persistentes**: Los mensajes de estado ("Validando por ping...", "Consultando...") ahora permanecen visibles durante todo el proceso.
- **Badge de IP**: Ahora muestra "No disponible" en rojo cuando una IP está en uso por ping o validación de sitios (antes mostraba "Cliente" en verde).
- **Estadísticas reales**: Los contadores de "IPs Disponibles" y "IPs en Uso" ahora reflejan exactamente lo que se muestra en la tabla después de la validación progresiva.
@ -450,4 +414,4 @@ Este proyecto sigue [Semantic Versioning](https://semver.org/lang/es/):
---
**Última actualización**: 4 de mayo de 2026
**Última actualización**: 26 de noviembre de 2025

23
README.md Executable file → Normal file
View File

@ -1,6 +1,6 @@
# SIIP - Buscador de IP's Disponibles UISP
[![Version](https://img.shields.io/badge/version-1.7.1-blue.svg)](manifest.json)
[![Version](https://img.shields.io/badge/version-1.6.1-blue.svg)](manifest.json)
[![UCRM](https://img.shields.io/badge/UCRM-Compatible-green.svg)](https://uisp.com/)
[![UNMS](https://img.shields.io/badge/UNMS-Compatible-green.svg)](https://uisp.com/)
@ -732,14 +732,17 @@ Los logs se guardan en:
Para ver el historial completo de cambios y versiones, consulta el archivo **[CHANGELOG.md](CHANGELOG.md)**.
### Versión Actual: 1.7.1 (2026-05-04)
### Versión Actual: 1.2.0 (2025-11-26)
**Cambios destacados**:
- 🐛 Corrección de falsos positivos en búsqueda de IPs por parámetro `suspended=true`
- 🔶 Detección de IPs flotantes (dispositivos no autorizados/pendiente de adopción)
- ⚡ Workers paralelos (7x más rápido) con inserción ordenada por octeto
- 🔢 Numeración consecutiva corregida en tabla de resultados
- 📊 Progreso en tiempo real durante la validación paralela
- 🏓 Verificación por ping para detectar dispositivos no registrados
- ⚡ Ping paralelo de hasta 30 IPs simultáneamente
- 🎛️ Control opcional vía configuración
- 📊 Estadísticas detalladas de verificación
- ✨ API REST completa con endpoints `event.ip_request` y `event.ip_check`
- 🔌 Soporte para webhooks y eventos personalizados
- 🎯 Filtrado automático de IPs administrativas
- 📚 Documentación completa con ejemplos en múltiples lenguajes
[Ver changelog completo →](CHANGELOG.md)
@ -768,7 +771,7 @@ Para ver el historial completo de cambios y versiones, consulta el archivo **[CH
---
**Versión 1.7.1** - Mayo 2026
**Versión 1.5.1** - Diciembre 2025
Desarrollado por [SIIP Internet](https://siip.mx)
---
@ -780,5 +783,5 @@ Este plugin es propiedad de **SIIP Internet**. Todos los derechos reservados.
---
**Versión**: 1.7.1
**Última actualización**: 4 de mayo de 2026
**Versión**: 1.5.0
**Última actualización**: 27 de noviembre de 2025

View File

@ -1,169 +0,0 @@
#!/usr/bin/env php
<?php
if (! class_exists(ZipArchive::class)) {
echo 'This script requires zip PHP extension.' . PHP_EOL;
exit(1);
}
function checkRequiredFiles(string $pluginRootDir): void
{
if (! is_file(sprintf('%s/manifest.json', $pluginRootDir))) {
echo sprintf('Manifest file not found in "%s".', $pluginRootDir) . PHP_EOL;
exit(1);
}
if (! is_file(sprintf('%s/main.php', $pluginRootDir))) {
echo sprintf('WARNING: Plugin does not have required main.php file in "%s".', $pluginRootDir) . PHP_EOL;
}
}
function getPluginRootDir(?string $rootDir): string
{
if ($rootDir === null) {
$rootDir = realpath(__DIR__ . '/..'); // Assuming bin/pack-plugin-custom, so root is one level up
echo sprintf('Plugin root dir not given, trying to find automatically: "%s"', $rootDir) . PHP_EOL;
} else {
if (! is_dir($rootDir)) {
echo 'Given directory does not exist.' . PHP_EOL;
exit(1);
}
$rootDir = realpath($rootDir);
}
return $rootDir;
}
function getPluginInfo(string $pluginRootDir): array
{
$manifestContent = file_get_contents($pluginRootDir . '/manifest.json');
if ($manifestContent === false) {
echo 'Could not read manifest.json.' . PHP_EOL;
exit(1);
}
$manifest = json_decode($manifestContent, true, 512, JSON_BIGINT_AS_STRING);
$error = json_last_error();
if ($error !== JSON_ERROR_NONE) {
echo sprintf('Could not decode manifest: "%s"', $error) . PHP_EOL;
exit(1);
}
$name = $manifest['information']['name'] ?? null;
if ($name === null) {
echo 'Could not get plugin\'s name from manifest.' . PHP_EOL;
exit(1);
}
if (! preg_match('~^[a-z0-9_-]+$~', $name)) {
echo 'Plugin\'s name contains invalid characters. Valid characters are: a-z, 0-9, _ (underscore) and - (hyphen).' . PHP_EOL;
exit(1);
}
$version = $manifest['information']['version'] ?? '0.0.0';
return ['name' => $name, 'version' => $version];
}
$pluginRootDir = getPluginRootDir($argv[1] ?? null);
checkRequiredFiles($pluginRootDir);
$pluginInfo = getPluginInfo($pluginRootDir);
$pluginName = $pluginInfo['name'];
$pluginVersion = $pluginInfo['version'];
// Custom: Add version to zip name
$zipName = sprintf('%s-%s.zip', $pluginName, $pluginVersion);
// Create the zip in the plugin root directory logic
// If structure matches UBNT repo (src separate), put it one level up.
// But commonly specific plugins are just the root.
// The original script checks for README.md in parent and src dir to decide if it's in a mono-repo.
// We will simplify and default to current dir, but keep the check just in case.
if (file_exists(sprintf('%s/../README.md', $pluginRootDir)) && is_dir(sprintf('%s/../src', $pluginRootDir))) {
$zipPath = sprintf('%s/../%s', $pluginRootDir, $zipName);
} else {
$zipPath = sprintf('%s/%s', $pluginRootDir, $zipName);
}
// Delete old ZIP archive.
if (file_exists($zipPath)) {
unlink($zipPath);
}
// Install composer dependencies.
echo 'Installing composer dependencies...' . PHP_EOL;
shell_exec('composer install --classmap-authoritative --no-dev --no-interaction --quiet');
// Create the ZIP archive.
$zip = new ZipArchive();
if ($zip->open($zipPath, ZipArchive::CREATE) !== true) {
echo 'Can\'t open zip file.' . PHP_EOL;
exit(1);
}
$files = new CallbackFilterIterator(
new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($pluginRootDir, \RecursiveDirectoryIterator::SKIP_DOTS)
),
function (SplFileInfo $fileInfo) {
return $fileInfo->isFile();
}
);
$ignoredFiles = [
'ucrm.json',
'.ucrm-plugin-running',
'.ucrm-plugin-execution-requested',
$zipName,
'.DS_Store', // Added DS_Store
];
// Add wildcard support for ignored files if needed, but for now simple check
$ignoredDirectories = [
'.git/',
'.idea/',
'vendor/bin/', // Don't include binaries in the zip if not needed, or at least this script
'bin/', // Don't include this script itself if we don't want to distributed it (optional)
];
// We probably want to include vendor/bin/pack-plugin (original) if it was there,
// but we definitely want to exclude .git.
/** @var SplFileInfo $fileInfo */
foreach ($files as $fileInfo) {
// Get relative path
$filename = substr($fileInfo->getPathname(), strlen($pluginRootDir) + 1);
// Fix slashes for zip
$filename = str_replace('\\', '/', $filename);
if (in_array(basename($filename), $ignoredFiles, true)) {
// Simple check for filename
continue;
}
// Check ignored files by full relative path
if (in_array($filename, $ignoredFiles, true)) {
continue;
}
foreach ($ignoredDirectories as $ignoredDirectory) {
if (strpos($filename, $ignoredDirectory) === 0) {
continue 2;
}
}
// Exclude the script itself if it's inside the root
if (realpath($fileInfo->getPathname()) === realpath(__FILE__)) {
continue;
}
if (! $zip->addFile($fileInfo->getPathname(), $filename)) {
echo sprintf('Unable to add file "%s".', $filename) . PHP_EOL;
exit(1);
}
}
$zip->close();
echo sprintf('Created plugin ZIP archive: "%s"', realpath($zipPath)) . PHP_EOL;

0
composer.json Executable file → Normal file
View File

0
composer.lock generated Executable file → Normal file
View File

2
data/config.json Executable file → Normal file
View File

@ -1 +1 @@
{"ipserver":"sistema.siip.mx","apitoken":"72VoFACForJQzveorR1sTLrXXwrnnK/oy6Bp9luwFTGC/dRdeQWNmFZqJeHuUzqK","unmsApiToken":"393eb3d0-9b46-4a47-b9b4-473e4e24a89c","enablePingVerification":true,"adminRangeStart":"1","adminRangeEnd":"50","adminRangeFinalStart":"254","adminRangeFinalEnd":"255","useCustomAdminRanges":true,"customAdminRangesJson":"{\"segmentos\":[{\"segmento\":\"13\",\"administrativas_iniciales\":[{\"inicio\":2,\"hasta\":50}],\"administrativas_finales\":[{\"inicio\":253,\"hasta\":254}]},{\"segmento\":\"100\",\"administrativas_iniciales\":[{\"inicio\":2,\"hasta\":50}],\"administrativas_finales\":[{\"inicio\":254,\"hasta\":254}]}]}","adminPassword":"Siip.2963","debugMode":true,"logging_level":true}
{"ipserver":"sistema.siip.mx","apitoken":"72VoFACForJQzveorR1sTLrXXwrnnK/oy6Bp9luwFTGC/dRdeQWNmFZqJeHuUzqK","unmsApiToken":"393eb3d0-9b46-4a47-b9b4-473e4e24a89c","debugMode":true,"logging_level":true,"enablePingVerification":true,"adminRangeStart":"2","adminRangeEnd":"50","adminRangeFinalStart":"254","adminRangeFinalEnd":"255","useCustomAdminRanges":true,"customAdminRangesJson":"{\"segmentos\":[{\"segmento\":\"13\",\"administrativas_iniciales\":[{\"inicio\":2,\"hasta\":50}],\"administrativas_finales\":[{\"inicio\":253,\"hasta\":254}]},{\"segmento\":\"100\",\"administrativas_iniciales\":[{\"inicio\":2,\"hasta\":50}],\"administrativas_finales\":[{\"inicio\":254,\"hasta\":254}]}]}","adminPassword":"Siip.2963"}

0
data/devices_debug.json Executable file → Normal file
View File

21635
data/plugin.log Executable file → Normal file

File diff suppressed because it is too large Load Diff

0
main.php Executable file → Normal file
View File

2
manifest.json Executable file → Normal file
View File

@ -5,7 +5,7 @@
"displayName": "SIIP - Buscador de IP's Disponibles UISP",
"description": "Este plugin permite buscar IP's disponibles en UISP (UNMS) y asignarlas a los clientes en UCRM. Evitando así la asignación de IP's duplicadas y mejorando la gestión de direcciones IP en la red.",
"url": "https://siip.mx",
"version": "1.7.1",
"version": "1.6.1",
"ucrmVersionCompliancy": {
"min": "1.0.0",
"max": null

1677
public.php Executable file → Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

0
src/AdminRangeHelper.php Executable file → Normal file
View File

4
src/ApiHandlers.php Executable file → Normal file
View File

@ -99,7 +99,7 @@ function handleIpRequest($data, $log) {
}
// Buscar IPs
$apiUrl = "https://{$config['ipserver']}/nms/api/v2.1/devices/ips?management=true&includeObsolete=true";
$apiUrl = "https://{$config['ipserver']}/nms/api/v2.1/devices/ips?suspended=true&management=true&includeObsolete=true";
$apiToken = $config['unmsApiToken'];
$ipService = new \SiipAvailableIps\IpSearchService($apiUrl, $apiToken, $log, $config);
@ -203,7 +203,7 @@ function handleIpCheck($data, $log) {
return;
}
$apiUrl = "https://{$config['ipserver']}/nms/api/v2.1/devices/ips?management=true&includeObsolete=true";
$apiUrl = "https://{$config['ipserver']}/nms/api/v2.1/devices/ips?suspended=true&management=true&includeObsolete=true";
$apiToken = $config['unmsApiToken'];
// Verificar si se solicita ping

0
src/CrmService.php Executable file → Normal file
View File

149
src/IpSearchService.php Executable file → Normal file
View File

@ -199,30 +199,6 @@ class IpSearchService
}
}
// Detectar IPs flotantes (dispositivos no autorizados / Pending Adoption)
$floatingIps = [];
try {
$floatingIps = $this->obtenerIpsFlotantes($segmento);
if (!empty($floatingIps)) {
// Agregar IPs flotantes a la lista de IPs en uso para excluirlas de disponibles
$floatingIpAddresses = array_column($floatingIps, 'ip');
$ipsEnUso = array_unique(array_merge($ipsEnUso, $floatingIpAddresses));
if ($this->logger) {
$this->logger->appendLog(sprintf(
'Detectadas %d IPs flotantes (dispositivos no autorizados) en segmento %s: %s',
count($floatingIps),
$segmento,
implode(', ', $floatingIpAddresses)
));
}
}
} catch (\Exception $e) {
if ($this->logger) {
$this->logger->appendLog('Error al detectar IPs flotantes: ' . $e->getMessage());
}
}
// Filtrar IPs del segmento solicitado
$segmentoPrefix = "172.16.$segmento.";
$segmentIps = [];
@ -388,7 +364,6 @@ class IpSearchService
),
'data' => $ipsDisponibles,
'used' => $segmentIps,
'floating' => $floatingIps,
'segment' => "172.16.$segmento.x",
'ping_verified' => $pingVerified
];
@ -564,128 +539,4 @@ class IpSearchService
return $ipToSite;
}
/**
* Obtiene IPs de dispositivos no autorizados (Pending Adoption) en un segmento
* Estos dispositivos no aparecen en /devices/ips pero en /devices
*
* @param string $segmento Tercer octeto del segmento
* @return array Array de dispositivos flotantes [{ip, name, model, status}]
*/
private function obtenerIpsFlotantes($segmento)
{
$urlParts = parse_url($this->apiUrl);
$baseUrl = $urlParts['scheme'] . '://' . $urlParts['host'];
$devicesUrl = $baseUrl . '/nms/api/v2.1/devices?authorized=false';
if ($this->logger) {
$this->logger->appendLog('Buscando dispositivos no autorizados (Pending Adoption)...');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $devicesUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'accept: application/json',
"x-auth-token: {$this->apiToken}"
]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Si la API de authorized=false no devuelve resultados útiles,
// intentar con /devices completo y filtrar
$devices = [];
if ($httpCode === 200 && $result !== false) {
$parsed = json_decode($result, true);
if (is_array($parsed) && !empty($parsed)) {
$devices = $parsed;
}
}
// Si no encontramos dispositivos no autorizados con el filtro,
// consultar todos los dispositivos y filtrar manualmente
if (empty($devices)) {
$allDevicesUrl = $baseUrl . '/nms/api/v2.1/devices';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $allDevicesUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'accept: application/json',
"x-auth-token: {$this->apiToken}"
]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200 || $result === false) {
if ($this->logger) {
$this->logger->appendLog("Error al obtener dispositivos: HTTP $httpCode");
}
return [];
}
$allDevices = json_decode($result, true);
if (!is_array($allDevices)) {
return [];
}
// Filtrar solo dispositivos no autorizados
$devices = array_filter($allDevices, function($device) {
return isset($device['identification']['authorized'])
&& $device['identification']['authorized'] === false;
});
}
// Filtrar por segmento y construir resultado
$segmentoPrefix = "172.16.$segmento.";
$floating = [];
foreach ($devices as $device) {
$primaryIp = $device['ipAddress'] ?? '';
$cleanIp = explode('/', $primaryIp)[0];
if (strpos($cleanIp, $segmentoPrefix) === 0) {
$floating[] = [
'ip' => $cleanIp,
'name' => $device['identification']['name'] ?? 'Desconocido',
'model' => $device['identification']['model'] ?? 'N/A',
'status' => $device['overview']['status'] ?? 'unknown',
];
continue;
}
// Buscar en ipAddressList
foreach ($device['ipAddressList'] ?? [] as $listIp) {
if (strpos($listIp, $segmentoPrefix) === 0) {
$floating[] = [
'ip' => $listIp,
'name' => $device['identification']['name'] ?? 'Desconocido',
'model' => $device['identification']['model'] ?? 'N/A',
'status' => $device['overview']['status'] ?? 'unknown',
];
}
}
}
if ($this->logger) {
$this->logger->appendLog(sprintf(
'Dispositivos no autorizados en segmento %s: %d encontrados',
$segmento,
count($floating)
));
}
return $floating;
}
}

0
src/IpValidator.php Executable file → Normal file
View File

0
src/PingService.php Executable file → Normal file
View File

0
test_debug.php Executable file → Normal file
View File

View File

@ -1,18 +0,0 @@
<?php
$token = '393eb3d0-9b46-4a47-b9b4-473e4e24a89c';
$baseUrl = 'https://sistema.siip.mx/nms/api/v2.1/devices/ips';
function fetchIps($url, $token) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['x-auth-token: ' . $token]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$res = curl_exec($ch);
curl_close($ch);
$data = json_decode($res, true);
return count($data);
}
echo "With suspended=true: " . fetchIps($baseUrl . '?suspended=true&management=true&includeObsolete=true', $token) . "\n";
echo "Without suspended=true: " . fetchIps($baseUrl . '?management=true&includeObsolete=true', $token) . "\n";
echo "With suspended=false: " . fetchIps($baseUrl . '?suspended=false&management=true&includeObsolete=true', $token) . "\n";

0
ucrm.json Executable file → Normal file
View File

0
unms-swagger.json Executable file → Normal file
View File

0
unms.yaml Executable file → Normal file
View File

0
unmscrm.apib Executable file → Normal file
View File

0
vendor/.DS_Store vendored Executable file → Normal file
View File

18
vendor/autoload.php vendored Executable file → Normal file
View File

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

139
vendor/composer/ClassLoader.php vendored Executable file → Normal file
View File

@ -42,37 +42,35 @@ namespace Composer\Autoload;
*/
class ClassLoader
{
/** @var \Closure(string):void */
private static $includeFile;
/** @var string|null */
/** @var ?string */
private $vendorDir;
// PSR-4
/**
* @var array<string, array<string, int>>
* @var array[]
* @psalm-var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array<string, list<string>>
* @var array[]
* @psalm-var array<string, array<int, string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* List of PSR-0 prefixes
*
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
*
* @var array<string, array<string, list<string>>>
* @var array[]
* @psalm-var array<string, array<string, string[]>>
*/
private $prefixesPsr0 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr0 = array();
@ -80,7 +78,8 @@ class ClassLoader
private $useIncludePath = false;
/**
* @var array<string, string>
* @var string[]
* @psalm-var array<string, string>
*/
private $classMap = array();
@ -88,29 +87,29 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
* @var array<string, bool>
* @var bool[]
* @psalm-var array<string, bool>
*/
private $missingClasses = array();
/** @var string|null */
/** @var ?string */
private $apcuPrefix;
/**
* @var array<string, self>
* @var self[]
*/
private static $registeredLoaders = array();
/**
* @param string|null $vendorDir
* @param ?string $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
self::initializeIncludeClosure();
}
/**
* @return array<string, list<string>>
* @return string[]
*/
public function getPrefixes()
{
@ -122,7 +121,8 @@ class ClassLoader
}
/**
* @return array<string, list<string>>
* @return array[]
* @psalm-return array<string, array<int, string>>
*/
public function getPrefixesPsr4()
{
@ -130,7 +130,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirs()
{
@ -138,7 +139,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirsPsr4()
{
@ -146,7 +148,8 @@ class ClassLoader
}
/**
* @return array<string, string> Array of classname => path
* @return string[] Array of classname => path
* @psalm-return array<string, string>
*/
public function getClassMap()
{
@ -154,7 +157,8 @@ class ClassLoader
}
/**
* @param array<string, string> $classMap Class to filename map
* @param string[] $classMap Class to filename map
* @psalm-param array<string, string> $classMap
*
* @return void
*/
@ -171,25 +175,24 @@ class ClassLoader
* 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 list<string>|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
$paths
(array) $paths
);
}
@ -198,19 +201,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = $paths;
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
$paths
(array) $paths
);
}
}
@ -219,9 +222,9 @@ class ClassLoader
* 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 list<string>|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@ -229,18 +232,17 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
$paths
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@ -250,18 +252,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = $paths;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
$paths
(array) $paths
);
}
}
@ -270,8 +272,8 @@ class ClassLoader
* 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 list<string>|string $paths The PSR-0 base directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 base directories
*
* @return void
*/
@ -288,8 +290,8 @@ class ClassLoader
* 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 list<string>|string $paths The PSR-4 base directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@ -423,8 +425,7 @@ class ClassLoader
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
includeFile($file);
return true;
}
@ -475,9 +476,9 @@ class ClassLoader
}
/**
* Returns the currently registered loaders keyed by their corresponding vendor directories.
* Returns the currently registered loaders indexed by their corresponding vendor directories.
*
* @return array<string, self>
* @return self[]
*/
public static function getRegisteredLoaders()
{
@ -554,26 +555,18 @@ class ClassLoader
return false;
}
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
* @private
*/
function includeFile($file)
{
include $file;
}

33
vendor/composer/InstalledVersions.php vendored Executable file → Normal file
View File

@ -21,14 +21,12 @@ use Composer\Semver\VersionParser;
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0`
*
* @final
*/
class InstalledVersions
{
/**
* @var mixed[]|null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
* @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
*/
private static $installed;
@ -39,7 +37,7 @@ class InstalledVersions
/**
* @var array[]
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
* @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
*/
private static $installedByVendor = array();
@ -98,7 +96,7 @@ class InstalledVersions
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
}
}
@ -119,7 +117,7 @@ class InstalledVersions
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints((string) $constraint);
$constraint = $parser->parseConstraints($constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
@ -243,7 +241,7 @@ class InstalledVersions
/**
* @return array
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
*/
public static function getRootPackage()
{
@ -257,7 +255,7 @@ class InstalledVersions
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
* @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
*/
public static function getRawData()
{
@ -280,7 +278,7 @@ class InstalledVersions
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
*/
public static function getAllRawData()
{
@ -303,7 +301,7 @@ class InstalledVersions
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
* @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
*/
public static function reload($data)
{
@ -313,7 +311,7 @@ class InstalledVersions
/**
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
*/
private static function getInstalled()
{
@ -328,9 +326,7 @@ class InstalledVersions
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require $vendorDir.'/composer/installed.php';
$installed[] = self::$installedByVendor[$vendorDir] = $required;
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
@ -342,17 +338,12 @@ class InstalledVersions
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require __DIR__ . '/installed.php';
self::$installed = $required;
self::$installed = require __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
if (self::$installed !== array()) {
$installed[] = self::$installed;
}
$installed[] = self::$installed;
return $installed;
}

0
vendor/composer/LICENSE vendored Executable file → Normal file
View File

4
vendor/composer/autoload_classmap.php vendored Executable file → Normal file
View File

@ -2,7 +2,7 @@
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
@ -111,9 +111,7 @@ return array(
'Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php',
'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php',
'SiipAvailableIps\\AdminRangeHelper' => $baseDir . '/src/AdminRangeHelper.php',
'SiipAvailableIps\\CrmService' => $baseDir . '/src/CrmService.php',
'SiipAvailableIps\\IpSearchService' => $baseDir . '/src/IpSearchService.php',
'SiipAvailableIps\\IpValidator' => $baseDir . '/src/IpValidator.php',
'SiipAvailableIps\\PingService' => $baseDir . '/src/PingService.php',
'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php',
'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php',

2
vendor/composer/autoload_files.php vendored Executable file → Normal file
View File

@ -2,7 +2,7 @@
// autoload_files.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(

2
vendor/composer/autoload_namespaces.php vendored Executable file → Normal file
View File

@ -2,7 +2,7 @@
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(

2
vendor/composer/autoload_psr4.php vendored Executable file → Normal file
View File

@ -2,7 +2,7 @@
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(

46
vendor/composer/autoload_real.php vendored Executable file → Normal file
View File

@ -25,27 +25,47 @@ class ComposerAutoloaderInita8750288fc198a75aec345f4f4b7fd12
require __DIR__ . '/platform_check.php';
spl_autoload_register(array('ComposerAutoloaderInita8750288fc198a75aec345f4f4b7fd12', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInita8750288fc198a75aec345f4f4b7fd12', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInita8750288fc198a75aec345f4f4b7fd12::getInitializer($loader));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInita8750288fc198a75aec345f4f4b7fd12::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInita8750288fc198a75aec345f4f4b7fd12::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
require $file;
}
}, null, null);
foreach ($filesToLoad as $fileIdentifier => $file) {
$requireFile($fileIdentifier, $file);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInita8750288fc198a75aec345f4f4b7fd12::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequirea8750288fc198a75aec345f4f4b7fd12($fileIdentifier, $file);
}
return $loader;
}
}
/**
* @param string $fileIdentifier
* @param string $file
* @return void
*/
function composerRequirea8750288fc198a75aec345f4f4b7fd12($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
require $file;
}
}

2
vendor/composer/autoload_static.php vendored Executable file → Normal file
View File

@ -189,9 +189,7 @@ class ComposerStaticInita8750288fc198a75aec345f4f4b7fd12
'Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php',
'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php',
'SiipAvailableIps\\AdminRangeHelper' => __DIR__ . '/../..' . '/src/AdminRangeHelper.php',
'SiipAvailableIps\\CrmService' => __DIR__ . '/../..' . '/src/CrmService.php',
'SiipAvailableIps\\IpSearchService' => __DIR__ . '/../..' . '/src/IpSearchService.php',
'SiipAvailableIps\\IpValidator' => __DIR__ . '/../..' . '/src/IpValidator.php',
'SiipAvailableIps\\PingService' => __DIR__ . '/../..' . '/src/PingService.php',
'Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php',
'Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php',

0
vendor/composer/installed.json vendored Executable file → Normal file
View File

30
vendor/composer/installed.php vendored Executable file → Normal file
View File

@ -1,58 +1,58 @@
<?php return array(
'root' => array(
'name' => '__root__',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'reference' => 'a8dd6a8f38f63db29b864b5e3efb3a6a73048c90',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => 'ab8a60f55685ad4c70661113dab21b4e372aae0e',
'name' => '__root__',
'dev' => false,
),
'versions' => array(
'__root__' => array(
'pretty_version' => 'dev-main',
'version' => 'dev-main',
'reference' => 'a8dd6a8f38f63db29b864b5e3efb3a6a73048c90',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => 'ab8a60f55685ad4c70661113dab21b4e372aae0e',
'dev_requirement' => false,
),
'guzzlehttp/guzzle' => array(
'pretty_version' => '7.9.3',
'version' => '7.9.3.0',
'reference' => '7b2f29fe81dc4da0ca0ea7d42107a0845946ea77',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
'aliases' => array(),
'reference' => '7b2f29fe81dc4da0ca0ea7d42107a0845946ea77',
'dev_requirement' => false,
),
'guzzlehttp/promises' => array(
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'reference' => '7c69f28996b0a6920945dd20b3857e499d9ca96c',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/promises',
'aliases' => array(),
'reference' => '7c69f28996b0a6920945dd20b3857e499d9ca96c',
'dev_requirement' => false,
),
'guzzlehttp/psr7' => array(
'pretty_version' => '2.7.1',
'version' => '2.7.1.0',
'reference' => 'c2270caaabe631b3b44c85f99e5a04bbb8060d16',
'type' => 'library',
'install_path' => __DIR__ . '/../guzzlehttp/psr7',
'aliases' => array(),
'reference' => 'c2270caaabe631b3b44c85f99e5a04bbb8060d16',
'dev_requirement' => false,
),
'psr/http-client' => array(
'pretty_version' => '1.0.3',
'version' => '1.0.3.0',
'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-client',
'aliases' => array(),
'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90',
'dev_requirement' => false,
),
'psr/http-client-implementation' => array(
@ -64,10 +64,10 @@
'psr/http-factory' => array(
'pretty_version' => '1.1.0',
'version' => '1.1.0.0',
'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-factory',
'aliases' => array(),
'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a',
'dev_requirement' => false,
),
'psr/http-factory-implementation' => array(
@ -79,10 +79,10 @@
'psr/http-message' => array(
'pretty_version' => '2.0',
'version' => '2.0.0.0',
'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71',
'type' => 'library',
'install_path' => __DIR__ . '/../psr/http-message',
'aliases' => array(),
'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71',
'dev_requirement' => false,
),
'psr/http-message-implementation' => array(
@ -94,55 +94,55 @@
'ralouphie/getallheaders' => array(
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
'type' => 'library',
'install_path' => __DIR__ . '/../ralouphie/getallheaders',
'aliases' => array(),
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
'dev_requirement' => false,
),
'symfony/deprecation-contracts' => array(
'pretty_version' => 'v3.5.1',
'version' => '3.5.1.0',
'reference' => '74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
'aliases' => array(),
'reference' => '74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6',
'dev_requirement' => false,
),
'symfony/filesystem' => array(
'pretty_version' => 'v6.4.13',
'version' => '6.4.13.0',
'reference' => '4856c9cf585d5a0313d8d35afd681a526f038dd3',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/filesystem',
'aliases' => array(),
'reference' => '4856c9cf585d5a0313d8d35afd681a526f038dd3',
'dev_requirement' => false,
),
'symfony/polyfill-ctype' => array(
'pretty_version' => 'v1.32.0',
'version' => '1.32.0.0',
'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
'aliases' => array(),
'reference' => 'a3cc8b044a6ea513310cbd48ef7333b384945638',
'dev_requirement' => false,
),
'symfony/polyfill-mbstring' => array(
'pretty_version' => 'v1.32.0',
'version' => '1.32.0.0',
'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(),
'reference' => '6d857f4d76bd4b343eac26d6b539585d2bc56493',
'dev_requirement' => false,
),
'ubnt/ucrm-plugin-sdk' => array(
'pretty_version' => '0.9.0',
'version' => '0.9.0.0',
'reference' => '02ca1d4ce7fca1bc7f49ef0259a03d0bfedec19f',
'type' => 'library',
'install_path' => __DIR__ . '/../ubnt/ucrm-plugin-sdk',
'aliases' => array(),
'reference' => '02ca1d4ce7fca1bc7f49ef0259a03d0bfedec19f',
'dev_requirement' => false,
),
),

0
vendor/composer/platform_check.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/CHANGELOG.md vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/LICENSE vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/README.md vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/UPGRADING.md vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/composer.json vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/BodySummarizer.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Client.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/ClientInterface.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/ClientTrait.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Exception/ClientException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Exception/RequestException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Exception/ServerException.php vendored Executable file → Normal file
View File

View File

0
vendor/guzzlehttp/guzzle/src/Exception/TransferException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/Proxy.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/HandlerStack.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/MessageFormatter.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Middleware.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Pool.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/RequestOptions.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/RetryMiddleware.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/TransferStats.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/Utils.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/functions.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/guzzle/src/functions_include.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/CHANGELOG.md vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/LICENSE vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/README.md vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/composer.json vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/AggregateException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/CancellationException.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/Coroutine.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/Create.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/Each.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/EachPromise.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/FulfilledPromise.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/Is.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/Promise.php vendored Executable file → Normal file
View File

0
vendor/guzzlehttp/promises/src/PromiseInterface.php vendored Executable file → Normal file
View File

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