Compare commits

..

1 Commits
master ... zpx

@ -13,7 +13,7 @@ set(CMAKE_AUTORCC ON)
# set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}") # set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
# include(QWindowKit) # include(QWindowKit)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets WebEngineWidgets OpenGLWidgets Network SerialPort) find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets WebSockets WebEngineWidgets OpenGLWidgets Network SerialPort)
qt_standard_project_setup() qt_standard_project_setup()

@ -13,14 +13,12 @@ qt_add_executable(VideoClient
videoControl.h videoControl.ui videoControl.cpp videoControl.h videoControl.ui videoControl.cpp
wprogressbar.h wprogressbar.cpp wprogressbar.h wprogressbar.cpp
webmapwidget.h webmapwidget.cpp webmapwidget.h webmapwidget.cpp
joystickcontroller.h joystickcontroller.cpp dataserverformap.h dataserverformap.cpp dataTransfer.ui
directinputjoystick.h directinputjoystick.cpp CMakeLists.txt
dataserverformap.cpp dataserverformap.h dataTransfer.ui
) )
qt6_add_resources(VideoClient "resources" qt6_add_resources(VideoClient "resources"
PREFIX "/" PREFIX "/"
FILES "resources/res.qrc" FILES "resources/res.qrc"
@ -44,11 +42,8 @@ target_link_libraries(VideoClient
Qt6::Network Qt6::Network
Qt6::SerialPort Qt6::SerialPort
Qt6::WebEngineWidgets Qt6::WebEngineWidgets
#Qt6::Gamepad Qt6::WebSockets
video video
winmm
dinput8
dxguid
# QWindowKit::Widgets # QWindowKit::Widgets
# WidgetFrame # WidgetFrame
) )

@ -145,69 +145,3 @@ void CommandWidget::on_pushButton_16_clicked() {
void CommandWidget::on_pushButton_15_clicked() { void CommandWidget::on_pushButton_15_clicked() {
buttonResponse(0xC9); buttonResponse(0xC9);
} }
void CommandWidget::onButtonChanged(int button, bool pressed)
{
qDebug() << "Button" << button << (pressed ? "Pressed" : "Released");
// switch (button)
// {
// case 0:
// on_pushButton_clicked();
// break;
// case 1:
// on_pushButton_2_clicked();
// break;
// case 2:
// on_pushButton_3_clicked();
// break;
// case 3:
// on_pushButton_clicked();
// break;
// case 4:
// on_pushButton_2_clicked();
// break;
// case 5:
// on_pushButton_3_clicked();
// break;
// case 6:
// on_pushButton_clicked();
// break;
// case 7:
// on_pushButton_2_clicked();
// break;
// case 8:
// on_pushButton_3_clicked();
// break;
// case 9:
// on_pushButton_clicked();
// break;
// case 10:
// on_pushButton_2_clicked();
// break;
// case 11:
// on_pushButton_3_clicked();
// break;
// case 12:
// on_pushButton_clicked();
// break;
// case 13:
// on_pushButton_2_clicked();
// break;
// case 14:
// on_pushButton_3_clicked();
// break;
// }
}
void CommandWidget::onDirectionChanged(int direction){
direction!=42949672?qDebug() << "direction" << direction:qDebug() << "center";
}

@ -122,12 +122,6 @@ private slots:
void on_pushButton_15_clicked(); void on_pushButton_15_clicked();
public slots:
void onButtonChanged(int button, bool pressed);
void onDirectionChanged(int dirction);
private: private:
Ui::CommandWidget *ui; Ui::CommandWidget *ui;
QUdpSocket *m_commandUdpSocket = nullptr; QUdpSocket *m_commandUdpSocket = nullptr;

@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>642</width>
<height>639</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QPushButton" name="bt_open">
<property name="geometry">
<rect>
<x>490</x>
<y>200</y>
<width>80</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>开启服务</string>
</property>
</widget>
<widget class="QGroupBox" name="WebSocket">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>451</width>
<height>271</height>
</rect>
</property>
<property name="title">
<string>WebSocket</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTextEdit" name="textEdit_ws">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>10</x>
<y>290</y>
<width>451</width>
<height>351</height>
</rect>
</property>
<property name="title">
<string>UDP</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTextEdit" name="textEdit_udp">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>470</x>
<y>40</y>
<width>53</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>端口号</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>470</x>
<y>360</y>
<width>61</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>组播端口</string>
</property>
</widget>
<widget class="QPushButton" name="bt_close">
<property name="geometry">
<rect>
<x>490</x>
<y>240</y>
<width>80</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>关闭服务</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_udpgp">
<property name="geometry">
<rect>
<x>540</x>
<y>360</y>
<width>101</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string notr="true">9001</string>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_ws">
<property name="geometry">
<rect>
<x>520</x>
<y>40</y>
<width>101</width>
<height>23</height>
</rect>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
<widget class="QLineEdit" name="line_ipg">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>540</x>
<y>321</y>
<width>101</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string notr="true">226.0.1.99</string>
</property>
<property name="maxLength">
<number>20</number>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>470</x>
<y>321</y>
<width>61</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>组播地址</string>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit_lp_2">
<property name="geometry">
<rect>
<x>540</x>
<y>400</y>
<width>101</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string notr="true">8999</string>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>470</x>
<y>400</y>
<width>61</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>本地端口</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,428 @@
#include "dataserverformap.h"
#include "ui_dataTransfer.h"
#include <QNetworkInterface>
DataServerforMap::DataServerforMap(QWidget *parent):
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
this->setWindowTitle("数据转发服务");
ui->lineEdit_ws->setText("9090");
ui->lineEdit_udpgp->setText("9001");
ui->lineEdit_lp_2->setText("8999");
ui->bt_open->setEnabled(true);
ui->bt_close->setEnabled(false);
m_webSocketIP = "127.0.0.1";
m_webSocketPort = 9090; // websocket端口
socketisRunning = false;
m_udpSkt = new QUdpSocket();
m_timer = new QTimer(this);
m_WebSktServer = new QWebSocketServer("webSocket server",QWebSocketServer::NonSecureMode);
connect(m_udpSkt, &QUdpSocket::readyRead, this, &DataServerforMap::on_ReceiveData);
connect(m_timer, &QTimer::timeout, this, &DataServerforMap::handleTimer);
}
DataServerforMap::~DataServerforMap(){
// 关闭websocket所有客户端
qDeleteAll(m_clients.begin(), m_clients.end());
if(m_WebSktServer->isListening())
{
m_WebSktServer->close();
}
delete m_WebSktServer;
// 关闭定时器
m_timer->stop();
delete m_timer;
// 关闭UDP
m_udpSkt->abort();
delete m_udpSkt;
}
/**
* @brief UDPwebsocket
* websocket
*/
void DataServerforMap::startServe(){
openWebSocket();
if(openUdp()){
m_timer->start(50);
}
}
void DataServerforMap::handleTimer(){
if(m_udpYc.uavId == -1){
return;
}
//如果UDP收数超时 5000ms
if(timer.elapsed()>5000){
return;
}
QString jsonData;
//检查是否有航线数据,有则发送航线帧
if(checkRoute()){
jsonData = getJsonRoute();
}
else{ //否则发送遥测数据帧
jsonData = getJsonData();
}
ui->textEdit_ws->append(QString("【发送】").append(jsonData));
webSocket_sendMsg(jsonData);
}
bool DataServerforMap::openUdp(){
QHostAddress ip = QHostAddress(ui->line_ipg->text());
bool ret = m_udpSkt->bind(QHostAddress::AnyIPv4, ui->lineEdit_lp_2->text().toInt(),
QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint);
if(ret){
ui->textEdit_udp->append("【通知】绑定本地地址成功");
ret = m_udpSkt->joinMulticastGroup(ip);
if(ret){
ui->textEdit_udp->append("【通知】加入组播成功");
return true;
}else{
ui->textEdit_udp->append("【通知】UDP加入组播失败");
}
}
ui->textEdit_udp->append("【通知】UDP开启失败");
return false;
}
void DataServerforMap:: closeServe(){
bool ret = m_udpSkt->leaveMulticastGroup(QHostAddress(ui->line_ipg->text()));
if(ret){
ui->textEdit_udp->append(QString("【通知】UDP移除组播"));
m_udpSkt->abort();
}
m_udpSkt->close();
m_WebSktServer->close();
ui->textEdit_ws->append(QString("【通知】WebSocket关闭监听"));
}
/**
* @brief udp
*/
void DataServerforMap::on_ReceiveData()
{
while (m_udpSkt->hasPendingDatagrams()) // 判断是否有可读数据
{
QNetworkDatagram datagram = m_udpSkt->receiveDatagram(); // 读取数据
QByteArray arr = datagram.data();
ui->textEdit_udp->append(QString("【通知】UDP收到数据长度%1字节").arg(arr.length()));
// 收到航点数据
if(arr.length() == sizeof(PtStruct)){
m_route << decodePoint(arr.constData());
}
// 收到遥测数据
else if(arr.length() >= 32){
webMapFreme* aFrame = (webMapFreme*)arr.constData();
m_udpYc.uavSeries = aFrame->uavSeries;
m_udpYc.uavId = aFrame->uavId;
m_udpYc.longitude = aFrame->longitude;
m_udpYc.latitude = aFrame->latitude;
m_udpYc.HBheight = aFrame->HBheight;
m_udpYc.RelHeight = aFrame->RelHeight;
m_udpYc.GroundSpeed = aFrame->GroundSpeed;
m_udpYc.GroundSpeedDirect = aFrame->GroundSpeedDirect;
m_udpYc.VeSpeed = aFrame->VeSpeed;
m_udpYc.AirSpeed = aFrame->AirSpeed;
m_udpYc.RealAirSpeed = aFrame->RealAirSpeed;
m_udpYc.FyAngle = aFrame->FyAngle;
m_udpYc.GzAngle = aFrame->GzAngle;
m_udpYc.HeadAngle = aFrame->HeadAngle;
m_udpYc.currentRouteID = aFrame->currentRouteID;
m_udpYc.nextRouteID = aFrame->nextRouteID;
m_udpYc.nextPoint = aFrame->nextPoint;
m_udpYc.distonext = aFrame->distonext;
timer.start();
}
// 异常数据
else{
return;
}
}
}
void DataServerforMap::openWebSocket(){
connect(m_WebSktServer, &QWebSocketServer::newConnection, this, &DataServerforMap::slot_newWSTConnection);
QHostAddress ipAdd = QHostAddress(m_webSocketIP);
if(m_WebSktServer->listen(ipAdd,ui->lineEdit_ws->text().toInt())){
ui->textEdit_ws->append(QString("【通知】websocket开始监听, 地址:%1端口%2").arg(m_webSocketIP).arg(m_webSocketPort));
socketisRunning = true;
}
else{
ui->textEdit_ws->append(QString("【通知】websocket服务启动失败"));
socketisRunning = false;
}
}
//处理新的WebSocket连接
void DataServerforMap::slot_newWSTConnection()
{
// 获取连接成功的客户端
QWebSocket* client = m_WebSktServer->nextPendingConnection();
connect(client, &QWebSocket::textMessageReceived, this, &DataServerforMap::on_textMessageReceived);
connect(client, &QWebSocket::disconnected, this, &DataServerforMap::on_disconnected);
// 将所有客户端加入列表
m_clients << client;
ui->textEdit_ws->append(QString("【通知】[%1:%2] 连接成功!").arg(client->peerAddress().toString()).arg(client->peerPort()));
}
/**
* @brief
*/
void DataServerforMap::slot_WSTClose()
{
ui->textEdit_ws->append(QString("【通知】websocket服务已关闭"));
socketisRunning = false;
m_timer->stop();
}
/**
* @brief webSocket
*/
void DataServerforMap::webSocket_sendMsg(const QString &message)
{
for(auto client : m_clients)
{
client->sendTextMessage(message);
}
}
/**
* @brief websocket Server
* @param message
*/
void DataServerforMap::on_textMessageReceived(const QString &message)
{
ui->textEdit_ws->append(QString("【接收】").append(message));
// QJsonParseError类用于在JSON解析期间报告错误。
QJsonParseError jsonError;
// 将json解析为UTF-8编码的json文档并从中创建一个QJsonDocument。
// 如果解析成功返回QJsonDocument对象否则返回null
QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8(), &jsonError);
// 判断是否解析失败
if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) {
ui->textEdit_ws->append(QString("【通知】Json格式错误"));
return;
}
// 获取根 { }
QJsonObject rootObj = doc.object();
int code = rootObj.value("code").toVariant().toInt();
QJsonArray pts = rootObj.value("points").toArray();
for(int i = 0; i < pts.size(); i++){
//逐个航点 解析为json对象
QJsonObject ptObject = pts.at(i).toObject();
// 创建航点struct并发送udp
PtStruct pt;
pt.nL = code;
pt.nPt = ptObject.value("nPt").toInt();
pt.ch1 = ptObject.value("ch1").toInt();
pt.ch2 = ptObject.value("ch2").toInt();
pt.nV = ptObject.value("speed").toDouble();
pt.nH = ptObject.value("alt").toDouble();
pt.dX = ptObject.value("lon").toDouble();
pt.dY = ptObject.value("lat").toDouble();
// UDP发送
m_udpSkt->writeDatagram((char*)&pt,sizeof(pt),QHostAddress(ui->line_ipg->text()),
ui->lineEdit_udpgp->text().toInt());
}
}
/**
* @brief
*/
void DataServerforMap::on_disconnected()
{
QWebSocket *socket = qobject_cast<QWebSocket *>(sender());
for(int i = 0; i < m_clients.count(); ++i)
{
if(m_clients.at(i) == socket)
{
disconnect(socket, &QWebSocket::textMessageReceived, this, &DataServerforMap::on_textMessageReceived);
disconnect(socket, &QWebSocket::disconnected, this, &DataServerforMap::on_disconnected);
m_clients.removeAt(i);
break;
}
}
ui->textEdit_ws->append(QString("【通知】[%1:%2] 客户端断开连接!").arg(socket->peerAddress().toString()).arg(socket->peerPort()));
}
/**
* @brief JSON
* @return
*/
QString DataServerforMap::getJsonData(){
// 定义根对象
QJsonObject root;
QJsonObject posObj, navigation;
// 插入位置姿态对象,对应键值对
root.insert("type", 0);
posObj.insert("uavId", m_udpYc.uavId);
posObj.insert("uavType", m_udpYc.uavSeries);
posObj.insert("lon", m_udpYc.longitude);
posObj.insert("lat", m_udpYc.latitude);
posObj.insert("height", m_udpYc.HBheight);
posObj.insert("FyAngle", m_udpYc.FyAngle);
posObj.insert("GzAngle", m_udpYc.GzAngle);
posObj.insert("HeadAngle", m_udpYc.HeadAngle);
posObj.insert("groundSpeed", m_udpYc.GroundSpeed);
root.insert("pos", posObj);
// 插入导航帧对象,对应键值对
navigation.insert("currentRouteID", m_udpYc.currentRouteID);
navigation.insert("nextRouteID", m_udpYc.nextRouteID);
navigation.insert("nextPoint", m_udpYc.nextPoint);
navigation.insert("distonext", m_udpYc.distonext);
root.insert("navi", navigation);
return QString(QJsonDocument(root).toJson());
}
QString DataServerforMap::getJsonRoute(){
// 定义 {} 对象
QJsonObject root,route;
// 插入元素,对应键值对
root.insert("type", 1);
QJsonArray points;
for(PtStruct &pt : m_route){
QJsonObject ptObj;
ptObj.insert("lon",pt.dX);
ptObj.insert("lat",pt.dY);
ptObj.insert("height",pt.nH);
ptObj.insert("ch1",pt.ch1);
ptObj.insert("ch2",pt.ch2);
ptObj.insert("nL",pt.nL);
ptObj.insert("nPt",pt.nPt);
ptObj.insert("nV",pt.nV);
points.append(ptObj);
}
route.insert("points",points);
route.insert("isClose", checkRouteClose());
root.insert("route",route);
//航线转为JSON字符串之后清空以便接收下一条航线
m_route.clear();
return QString(QJsonDocument(root).toJson());
}
// 开启服务
void DataServerforMap::on_bt_open_clicked()
{
startServe();
ui->bt_open->setEnabled(false);
ui->bt_close->setEnabled(true);
}
//关闭服务
void DataServerforMap::on_bt_close_clicked()
{
closeServe();
ui->bt_open->setEnabled(true);
ui->bt_close->setEnabled(false);
}
/**
* @brief 线
* @return truefalse
*/
bool DataServerforMap::checkRoute(){
if(m_route.length()<3)
return false;
else{
PtStruct& pt = m_route.last();
if( m_udpYc.uavSeries == 0){
//TODO: 航线特征字判断
}
else if( m_udpYc.uavSeries == 1){
if(pt.nL == 0x06){ //空投航线可通过4个航点判断当前航线是否完整
return m_route.length() == 4+1; //第一个航点为0
}
else if (pt.nL == 0x0B){ //回收航线以0x0b特征字结尾
return pt.ch2 == 0x0b;
}
else{ //其他航线特征字不以0x03结尾
return pt.ch2 != 0x03;
}
}
//TODO: 航线特征字判断
else if( m_udpYc.uavSeries==2){}
//fixme: 航线的结束判断98机型需核查
else if( m_udpYc.uavSeries==3){
if(pt.nL == 0x06){ //空投航线可通过4个航点判断当前航线是否完整
return m_route.length() == 4+1; //第一个航点为0
}
else if (pt.nL == 0x0B){ //回收航线以0x0b特征字结尾
return pt.ch2 == 0x0b;
}
else{ //其他航线特征字不以0x03结尾
return pt.ch2 != 0x03;
}
}
else if( m_udpYc.uavSeries==4){}
else return false;
}
return false;
}
/**
* @brief 线
* @return true
*/
bool DataServerforMap::checkRouteClose(){
PtStruct& pt = m_route.last(); //最后一个航点
if( m_udpYc.uavSeries == 1){ //981C
if(m_route[0].nL==0x0B) return true; //回收航线为闭合航线
else{
if(pt.ch1==2 && pt.ch2==1){
return true;
}else
return false;
}
}
if( m_udpYc.uavSeries >= 3){ //98
if(m_route[0].nL==13) return true; //回收航线为闭合航线
else{
if(pt.ch1==2 && pt.ch2==1){
return true;
}else
return false;
}
}
return false;
}
PtStruct DataServerforMap::decodePoint(const char* data){
PtStruct point;
PtStruct* pt = (PtStruct*)data;
point.ch1 = pt->ch1;
point.ch2 = pt->ch2;
point.dX = pt->dX;
point.dY = pt->dY;
point.nH = pt->nH;
point.nL = pt->nL;
point.nPt = pt->nPt;
point.nV = pt->nV;
return point;
}

@ -0,0 +1,121 @@
#ifndef DATASERVERFORMAP_H
#define DATASERVERFORMAP_H
#include <QObject>
#include <QUdpSocket>
#include <qnetworkdatagram.h>
#include <QWebSocketServer>
#include <QWebSocket>
#include <QTimer>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QWidget>
#include <QElapsedTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Form; }
QT_END_NAMESPACE
#pragma pack(1)
typedef unsigned char UINT8;
struct PtStruct{
PtStruct(){
nL=nPt=dX=dY=nH=ch1=ch2=0;
}
int nL;
int nPt;
double dX;
double dY;
double nH;
double nV;
int ch1;
int ch2;
};
//前端地图所需的数据结构体
struct webMapFreme{
webMapFreme(){ uavId=-1; }
UINT8 uavSeries; //uav型号0->981A; 1->981C; 2->981CS; 3->98; 4->985
int uavId;
double longitude;
double latitude;
float HBheight;
float RelHeight;
float GroundSpeed; //地速
float GroundSpeedDirect; //地速方向
float VeSpeed; //垂速
float AirSpeed; //空速
float RealAirSpeed; //真空速
float FyAngle; //俯仰角 度为单位
float GzAngle; //滚转角
float HeadAngle; //航向角
int currentRouteID; // 当前航线号
int nextRouteID; // 下一航线号
int nextPoint; // 下一航点号
short distonext; // 待飞距离,米
};
#pragma pack()
class DataServerforMap: public QWidget
{
Q_OBJECT
public:
QList<QWebSocket*> m_clients;
webMapFreme m_udpYc;
QString m_udpIPLocal, m_webSocketIP;
int m_udpPortLocal, m_webSocketPort;
public:
explicit DataServerforMap(QWidget *parent = nullptr);
~DataServerforMap();
void startServe();
void closeServe();
private:
Ui::Form * ui;
QUdpSocket* m_udpSkt = nullptr;
QTimer *m_timer = nullptr;
QWebSocketServer* m_WebSktServer;
bool socketisRunning;
QElapsedTimer timer;
QList<PtStruct> m_route;
bool checkRouteClose();
bool openUdp();
void openWebSocket();
QString getJsonData();
QString getJsonRoute();
bool checkRoute();
PtStruct decodePoint(const char* data);
private slots:
void on_ReceiveData();
void slot_newWSTConnection();
void slot_WSTClose();
// 客户端发送信号过来
void on_textMessageReceived(const QString &message);
// 客户端连接断开
void on_disconnected();
void webSocket_sendMsg(const QString &message);
void handleTimer();
void on_bt_open_clicked();
void on_bt_close_clicked();
signals:
void sendMessage(QString text);
};
#endif // DATASERVERFORMAP_H

@ -1,164 +0,0 @@
#include "DirectInputJoystick.h"
#include <QDebug>
DirectInputJoystick::DirectInputJoystick(QObject *parent) : QObject(parent) {
// 确保 COM 库在主线程初始化
CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
}
DirectInputJoystick::~DirectInputJoystick() {
cleanup();
CoUninitialize();
}
bool DirectInputJoystick::initialize() {
HRESULT hr = DirectInput8Create(
GetModuleHandle(nullptr),
DIRECTINPUT_VERSION,
IID_IDirectInput8,
(VOID**)&m_pDirectInput,
nullptr
);
if (FAILED(hr)) {
emit errorOccurred("无法创建 DirectInput 对象");
return false;
}
// 枚举所有摇杆设备
hr = m_pDirectInput->EnumDevices(
DI8DEVCLASS_GAMECTRL,
enumJoysticksCallback,
this,
DIEDFL_ATTACHEDONLY
);
return SUCCEEDED(hr);
}
BOOL CALLBACK DirectInputJoystick::enumJoysticksCallback(const DIDEVICEINSTANCE* instance, VOID* context) {
DirectInputJoystick* joystick = static_cast<DirectInputJoystick*>(context);
return joystick->setupDevice();
}
bool DirectInputJoystick::setupDevice() {
if (!m_pDirectInput) return false;
// 创建设备
HRESULT hr = m_pDirectInput->CreateDevice(
GUID_Joystick,
&m_pJoystick,
nullptr
);
if (FAILED(hr)) {
emit errorOccurred("无法创建摇杆设备");
return false;
}
// 设置数据格式
hr = m_pJoystick->SetDataFormat(&c_dfDIJoystick);
if (FAILED(hr)) {
emit errorOccurred("设置数据格式失败");
return false;
}
// 设置协作级别
hr = m_pJoystick->SetCooperativeLevel(
nullptr, // 无窗口句柄
DISCL_BACKGROUND | DISCL_NONEXCLUSIVE
);
// 枚举轴并设置范围
hr = m_pJoystick->EnumObjects(enumAxesCallback, this, DIDFT_AXIS);
if (FAILED(hr)) {
emit errorOccurred("枚举摇杆轴失败");
return false;
}
// 创建事件对象
m_hEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
hr = m_pJoystick->SetEventNotification(m_hEvent);
if (FAILED(hr)) {
emit errorOccurred("设置事件通知失败");
return false;
}
return true;
}
BOOL CALLBACK DirectInputJoystick::enumAxesCallback(const DIDEVICEOBJECTINSTANCE* doi, VOID* context) {
DirectInputJoystick* joystick = static_cast<DirectInputJoystick*>(context);
DIPROPRANGE diprg;
diprg.diph.dwSize = sizeof(DIPROPRANGE);
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
diprg.diph.dwHow = DIPH_BYID;
diprg.diph.dwObj = doi->dwType;
diprg.lMin = -1000;
diprg.lMax = 1000;
HRESULT hr = joystick->m_pJoystick->SetProperty(DIPROP_RANGE, &diprg.diph);
return SUCCEEDED(hr);
}
void DirectInputJoystick::startListening() {
if (!m_pJoystick || m_isRunning) return;
m_isRunning = true;
m_workerThread = QThread::create([this]() {
m_pJoystick->Acquire();
while (m_isRunning) {
WaitForSingleObject(m_hEvent, INFINITE);
DIJOYSTATE state;
HRESULT hr = m_pJoystick->GetDeviceState(sizeof(DIJOYSTATE), &state);
if (SUCCEEDED(hr)) {
// 处理轴数据
double x = state.lX / 1000.0;
double y = state.lY / 1000.0;
double z = state.lZ / 1000.0;
emit axisChanged(0, x);
emit axisChanged(1, y);
emit axisChanged(2, z);
// 处理按钮
for (int i = 0; i < 32; ++i) {
if(lastState.rgbButtons[i]!=state.rgbButtons[i])
{
bool pressed = (state.rgbButtons[i] & 0x80) != 0;
emit buttonChanged(i, pressed);
}
}
if(lastState.rgdwPOV[0]!=state.rgdwPOV[0])
{
emit directionChanged(state.rgdwPOV[0]/100);
}
}
lastState = state;
}
});
connect(m_workerThread, &QThread::finished, m_workerThread, &QThread::deleteLater);
m_workerThread->start();
}
void DirectInputJoystick::cleanup() {
m_isRunning = false;
if (m_hEvent) {
CloseHandle(m_hEvent);
m_hEvent = nullptr;
}
if (m_pJoystick) {
m_pJoystick->Unacquire();
m_pJoystick->Release();
m_pJoystick = nullptr;
}
if (m_pDirectInput) {
m_pDirectInput->Release();
m_pDirectInput = nullptr;
}
}

@ -1,47 +0,0 @@
#ifndef DIRECTINPUTJOYSTICK_H
#define DIRECTINPUTJOYSTICK_H
#include <QObject>
#include <windows.h>
#include <dinput.h>
#include <QThread>
class DirectInputJoystick : public QObject
{
Q_OBJECT
public:
explicit DirectInputJoystick(QObject *parent = nullptr);
~DirectInputJoystick();
bool initialize();
void startListening();
signals:
// 轴变化信号axis: 0-X, 1-Y, 2-Z; value: -1.0 ~ 1.0
void axisChanged(int axis, double value);
// 按钮状态变化button: 按钮编号从0开始pressed: 是否按下)
void buttonChanged(int button, bool pressed);
// 方向按钮状态变化direction: 按钮编号上下左右pressed: 是否按下)
void directionChanged(int direction);
// 错误信号
void errorOccurred(const QString &message);
private:
bool setupDevice();
void cleanup();
static BOOL CALLBACK enumAxesCallback(const DIDEVICEOBJECTINSTANCE* doi, VOID* context);
static BOOL CALLBACK enumJoysticksCallback(const DIDEVICEINSTANCE* instance, VOID* context);
DIJOYSTATE lastState;
LPDIRECTINPUT8 m_pDirectInput = nullptr;
LPDIRECTINPUTDEVICE8 m_pJoystick = nullptr;
HANDLE m_hEvent = nullptr;
QThread *m_workerThread;
bool m_isRunning = false;
};
#endif // DIRECTINPUTJOYSTICK_H

@ -1,106 +0,0 @@
#include "joystickcontroller.h"
#include <QDebug>
JoystickController::JoystickController(int joystickId, QObject *parent)
: QObject{parent}, m_joystickId(joystickId), m_isConnected(false)
{
// 初始化定时器
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &JoystickController::pollJoystick);
// 检测设备是否存在
UINT numDevs = joyGetNumDevs();
if (numDevs == 0) {
emit errorOccurred("系统未检测到任何摇杆设备");
return;
}
// 获取设备能力
MMRESULT capsResult = joyGetDevCaps(m_joystickId, &m_joyCaps, sizeof(JOYCAPS));
if (capsResult != JOYERR_NOERROR) {
emit errorOccurred(QString("无法获取摇杆设备能力,错误代码: %1").arg(capsResult));
return;
}
m_isConnected = true;
qDebug() << "摇杆设备初始化成功,名称:" << QString::fromWCharArray(m_joyCaps.szPname);
}
JoystickController::~JoystickController()
{
stopPolling();
}
bool JoystickController::isConnected() const
{
return m_isConnected;
}
void JoystickController::startPolling(int intervalMs)
{
if (m_isConnected) {
m_timer->start(intervalMs);
}
}
void JoystickController::stopPolling()
{
m_timer->stop();
}
void JoystickController::pollJoystick()
{
JOYINFOEX joyInfo;
joyInfo.dwSize = sizeof(JOYINFOEX);
joyInfo.dwFlags = JOY_RETURNALL;
MMRESULT result = joyGetPosEx(m_joystickId, &joyInfo);
if (result != JOYERR_NOERROR) {
emit errorOccurred(QString("读取摇杆数据失败,错误代码: %1").arg(result));
m_isConnected = false;
stopPolling();
return;
}
// 处理轴数据
normalizeAxisValues(joyInfo);
// 处理按钮状态
for (int i = 0; i < m_joyCaps.wNumButtons; ++i) {
bool isPressed = (joyInfo.dwButtons & (1 << i)) != 0;
emit buttonChanged(i + 1, isPressed); // 按钮ID从1开始
}
}
void JoystickController::normalizeAxisValues(const JOYINFOEX &joyInfo)
{
// X/Y轴归一化处理
double x = (joyInfo.dwXpos - 32768) / 32768.0;
double y = (joyInfo.dwYpos - 32768) / 32768.0;
emit axisChanged(1, x); // 假设轴1为X轴
emit axisChanged(2, y); // 轴2为Y轴
// 其他轴如Z轴、Rudder等
if (m_joyCaps.wCaps & JOYCAPS_HASZ) {
double z = (joyInfo.dwZpos - 32768) / 32768.0;
emit axisChanged(3, z);
}
}

@ -1,41 +0,0 @@
#ifndef JOYSTICKCONTROLLER_H
#define JOYSTICKCONTROLLER_H
#include <QObject>
#include <QTimer>
#include <windows.h>
#include <mmsystem.h>
class JoystickController : public QObject
{
Q_OBJECT
public:
explicit JoystickController(int joystickId = JOYSTICKID1, QObject *parent = nullptr);
~JoystickController();
bool isConnected() const;
void startPolling(int intervalMs = 50);
void stopPolling();
signals:
// 摇杆轴变化信号(范围:-1.0 ~ 1.0
void axisChanged(int axis, double value);
// 按钮状态变化信号按钮ID, 是否按下)
void buttonChanged(int button, bool pressed);
// 错误信号
void errorOccurred(const QString &message);
private slots:
void pollJoystick();
private:
void normalizeAxisValues(const JOYINFOEX &joyInfo);
QTimer *m_timer;
int m_joystickId;
bool m_isConnected;
JOYCAPS m_joyCaps;
};
#endif // JOYSTICKCONTROLLER_H

@ -6,6 +6,7 @@
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
QGuiApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); QGuiApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
QApplication::setAttribute(Qt::AA_UseDesktopOpenGL); QApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
// QApplication::setAttribute(Qt::AA_UseOpenGLES); // QApplication::setAttribute(Qt::AA_UseOpenGLES);
// QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); // QApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
@ -13,5 +14,10 @@ int main(int argc, char *argv[]) {
MainWindow w; MainWindow w;
w.show(); w.show();
QString str = QCoreApplication::applicationDirPath();
QProcess m_process;
m_process.setWorkingDirectory(str+"/nginx");
m_process.start("cmd.exe",QStringList()<<"/c"<<"nginx");
return a.exec(); return a.exec();
} }

@ -32,7 +32,6 @@ MainWindow::MainWindow(QWidget *parent)
qDebug() << "Open file fail " << Qt::endl; qDebug() << "Open file fail " << Qt::endl;
} }
// QList<QString> list; // QList<QString> list;
// list.append("rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid"); // list.append("rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid");
// list.append("rtsp://182.92.130.23/nmyj/video"); // list.append("rtsp://182.92.130.23/nmyj/video");
@ -61,9 +60,10 @@ MainWindow::MainWindow(QWidget *parent)
initHideButton(); initHideButton();
//initJoyStick();
initDtJoyStick();
setSavedVideoDir(); setSavedVideoDir();
QApplication::instance()->installEventFilter(this);
// setFocusPolicy( Qt::StrongFocus ); // 窗口将通过鼠标点击、按tab键等方式获取焦点
// ui->stackedWidget->setCurrentIndex(1); // ui->stackedWidget->setCurrentIndex(1);
// ui->videoWidget1->play(list.at(0)); // ui->videoWidget1->play(list.at(0));
// ui->videoWidget2->play(list.at(0)); // ui->videoWidget2->play(list.at(0));
@ -72,6 +72,11 @@ MainWindow::MainWindow(QWidget *parent)
} }
MainWindow::~MainWindow() { MainWindow::~MainWindow() {
QProcess m_process;
m_process.setWorkingDirectory(QCoreApplication::applicationDirPath()+"/nginx");
m_process.start("cmd.exe",QStringList()<<"/c"<<"nginx -s stop");
m_process.waitForFinished();
delete ui; delete ui;
} }
@ -106,6 +111,10 @@ void MainWindow::closeEvent(QCloseEvent *event) {
m_mapWidget->close(); m_mapWidget->close();
delete m_mapWidget; delete m_mapWidget;
} }
if(m_dataServer){
m_dataServer->close();
delete m_dataServer;
}
// QMainWindow::close(); // QMainWindow::close();
} }
@ -126,8 +135,6 @@ void MainWindow::initSignalConnection() {
connect(ui->videoControlWidget, &VideoControl::stopVideoSignal, this, connect(ui->videoControlWidget, &VideoControl::stopVideoSignal, this,
&MainWindow::closeVideoSlot); &MainWindow::closeVideoSlot);
} }
void MainWindow::initNotifyMessageConnection() { void MainWindow::initNotifyMessageConnection() {
@ -146,38 +153,6 @@ void MainWindow::initChangeVideoLayoutConnection() {
}); });
} }
void MainWindow::onAxisChanged(int axis, double value)
{
qDebug() << "Axis" << axis << "Value:" << value;
}
// void MainWindow::initJoyStick()
// {
// m_joystick = new JoystickController(JOYSTICKID1,this);
// connect(m_joystick, &JoystickController::axisChanged, this, &MainWindow::onAxisChanged);
// connect(m_joystick, &JoystickController::buttonChanged, this, &MainWindow::onButtonChanged);
// if (m_joystick->isConnected()) {
// m_joystick->startPolling();
// }
// }
void MainWindow::initDtJoyStick()
{
m_dtjoystick = new DirectInputJoystick(this);
if (m_dtjoystick->initialize()) {
connect(m_dtjoystick, &DirectInputJoystick::buttonChanged, ui->commandWidget, &CommandWidget::onButtonChanged);
connect(m_dtjoystick, &DirectInputJoystick::directionChanged, ui->commandWidget, &CommandWidget::onDirectionChanged);
// connect(m_dtjoystick, &DirectInputJoystick::buttonChanged, this, &MainWindow::onButtonChanged);
m_dtjoystick->startListening();
}
}
void MainWindow::initNotifyManager() { void MainWindow::initNotifyManager() {
m_notifyManager = new NotifyManager(this, this); m_notifyManager = new NotifyManager(this, this);
m_notifyManager->setMaxCount(5); m_notifyManager->setMaxCount(5);
@ -505,10 +480,7 @@ void MainWindow::pushStreamSlot(bool bPush) {
} else { } else {
pushStreamIP = g_pushStreamInfoStruct.pushStreamIP; pushStreamIP = g_pushStreamInfoStruct.pushStreamIP;
} }
QStringList pushStreamIPs; ui->videoWidget->pushStream(pushStreamIP);
pushStreamIPs.append(pushStreamIP);
// pushStreamIPs.append("rtmp://182.92.130.23/videoclient/fp98C_1_gcs");
ui->videoWidget->pushStream(pushStreamIPs);
} else { } else {
ui->videoWidget->stopPushStream(); ui->videoWidget->stopPushStream();
// ui->videoWidget1->stopPushStream(); // ui->videoWidget1->stopPushStream();
@ -531,18 +503,34 @@ void MainWindow::closeVideoSlot() {
} }
void MainWindow::showMap3DSlot() { void MainWindow::showMap3DSlot() {
if(m_dataServer == nullptr){
m_dataServer = new DataServerforMap();
m_dataServer->startServe();
}
if (m_mapWidget == nullptr) { if (m_mapWidget == nullptr) {
m_mapWidget = new WebMapWidget(); m_mapWidget = new WebMapWidget();
// m_mapWidget->setRenderHint(QPainter::Antialiasing, true);
// m_mapWidget->setRenderHint(QPainter::SmoothPixmapTransform, true);
// m_mapWidget->setRenderHint(QPainter::TextAntialiasing, true);
m_mapWidget->load(QUrl("http://127.0.0.1:80")); m_mapWidget->load(QUrl("http://127.0.0.1:80"));
m_mapWidget->resize(1024, 750); m_mapWidget->resize(1920,1080);
} }
if (!m_mapWidget->isVisible()) { if (!m_mapWidget->isVisible()) {
m_mapWidget->show(); m_mapWidget->show();
} }
}
bool MainWindow::eventFilter(QObject* watched, QEvent* event){
if (event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
// 判断是否同时按下ctrl和c键
if( (keyEvent->modifiers()&Qt::ControlModifier) != 0 && keyEvent->key()==Qt::Key_S)
{
//显示网络配置窗口
if(m_dataServer!=nullptr && !m_dataServer->isVisible()){
m_dataServer->show();
}
}
}
return QWidget::eventFilter(watched, event);
} }

@ -16,9 +16,8 @@
#include "videoControl.h" #include "videoControl.h"
#include "videowidget.h" #include "videowidget.h"
#include "webmapwidget.h" #include "webmapwidget.h"
//#include "joystickapi.h" #include "dataserverformap.h"
#include "joystickcontroller.h"
#include "DirectInputJoystick.h"
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#include "windows.h" #include "windows.h"
#include "windowsx.h" #include "windowsx.h"
@ -53,6 +52,8 @@ protected:
qintptr *result) override; qintptr *result) override;
void paintEvent(QPaintEvent *ev) override; void paintEvent(QPaintEvent *ev) override;
void closeEvent(QCloseEvent *event) override; void closeEvent(QCloseEvent *event) override;
bool eventFilter(QObject* watched, QEvent* event) override;
signals: signals:
void themeChanged(); void themeChanged();
void sendErrorMessage(QString message, int type); void sendErrorMessage(QString message, int type);
@ -70,14 +71,6 @@ private:
void setSavedVideoDir(); void setSavedVideoDir();
void initHideButton(); void initHideButton();
// void initJoyStick();
void initDtJoyStick();
private slots:
void onAxisChanged(int axis, double value);
private slots: private slots:
void showSettingDlgSlot(); void showSettingDlgSlot();
@ -102,8 +95,6 @@ private:
QToolButton *hideCommandWidgetBtn = nullptr; QToolButton *hideCommandWidgetBtn = nullptr;
WebMapWidget *m_mapWidget = nullptr; WebMapWidget *m_mapWidget = nullptr;
// JoystickController *m_joystick = nullptr; DataServerforMap *m_dataServer = nullptr;
DirectInputJoystick *m_dtjoystick;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

@ -1,26 +0,0 @@
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

@ -1,25 +0,0 @@
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

@ -1,109 +0,0 @@
# This map is not a full koi8-r <> utf8 map: it does not contain
# box-drawing and some other characters. Besides this map contains
# several koi8-u and Byelorussian letters which are not in koi8-r.
# If you need a full and standard map, use contrib/unicode2nginx/koi-utf
# map instead.
charset_map koi8-r utf-8 {
80 E282AC ; # euro
95 E280A2 ; # bullet
9A C2A0 ; # &nbsp;
9E C2B7 ; # &middot;
A3 D191 ; # small yo
A4 D194 ; # small Ukrainian ye
A6 D196 ; # small Ukrainian i
A7 D197 ; # small Ukrainian yi
AD D291 ; # small Ukrainian soft g
AE D19E ; # small Byelorussian short u
B0 C2B0 ; # &deg;
B3 D081 ; # capital YO
B4 D084 ; # capital Ukrainian YE
B6 D086 ; # capital Ukrainian I
B7 D087 ; # capital Ukrainian YI
B9 E28496 ; # numero sign
BD D290 ; # capital Ukrainian soft G
BE D18E ; # capital Byelorussian short U
BF C2A9 ; # (C)
C0 D18E ; # small yu
C1 D0B0 ; # small a
C2 D0B1 ; # small b
C3 D186 ; # small ts
C4 D0B4 ; # small d
C5 D0B5 ; # small ye
C6 D184 ; # small f
C7 D0B3 ; # small g
C8 D185 ; # small kh
C9 D0B8 ; # small i
CA D0B9 ; # small j
CB D0BA ; # small k
CC D0BB ; # small l
CD D0BC ; # small m
CE D0BD ; # small n
CF D0BE ; # small o
D0 D0BF ; # small p
D1 D18F ; # small ya
D2 D180 ; # small r
D3 D181 ; # small s
D4 D182 ; # small t
D5 D183 ; # small u
D6 D0B6 ; # small zh
D7 D0B2 ; # small v
D8 D18C ; # small soft sign
D9 D18B ; # small y
DA D0B7 ; # small z
DB D188 ; # small sh
DC D18D ; # small e
DD D189 ; # small shch
DE D187 ; # small ch
DF D18A ; # small hard sign
E0 D0AE ; # capital YU
E1 D090 ; # capital A
E2 D091 ; # capital B
E3 D0A6 ; # capital TS
E4 D094 ; # capital D
E5 D095 ; # capital YE
E6 D0A4 ; # capital F
E7 D093 ; # capital G
E8 D0A5 ; # capital KH
E9 D098 ; # capital I
EA D099 ; # capital J
EB D09A ; # capital K
EC D09B ; # capital L
ED D09C ; # capital M
EE D09D ; # capital N
EF D09E ; # capital O
F0 D09F ; # capital P
F1 D0AF ; # capital YA
F2 D0A0 ; # capital R
F3 D0A1 ; # capital S
F4 D0A2 ; # capital T
F5 D0A3 ; # capital U
F6 D096 ; # capital ZH
F7 D092 ; # capital V
F8 D0AC ; # capital soft sign
F9 D0AB ; # capital Y
FA D097 ; # capital Z
FB D0A8 ; # capital SH
FC D0AD ; # capital E
FD D0A9 ; # capital SHCH
FE D0A7 ; # capital CH
FF D0AA ; # capital hard sign
}

@ -1,103 +0,0 @@
charset_map koi8-r windows-1251 {
80 88 ; # euro
95 95 ; # bullet
9A A0 ; # &nbsp;
9E B7 ; # &middot;
A3 B8 ; # small yo
A4 BA ; # small Ukrainian ye
A6 B3 ; # small Ukrainian i
A7 BF ; # small Ukrainian yi
AD B4 ; # small Ukrainian soft g
AE A2 ; # small Byelorussian short u
B0 B0 ; # &deg;
B3 A8 ; # capital YO
B4 AA ; # capital Ukrainian YE
B6 B2 ; # capital Ukrainian I
B7 AF ; # capital Ukrainian YI
B9 B9 ; # numero sign
BD A5 ; # capital Ukrainian soft G
BE A1 ; # capital Byelorussian short U
BF A9 ; # (C)
C0 FE ; # small yu
C1 E0 ; # small a
C2 E1 ; # small b
C3 F6 ; # small ts
C4 E4 ; # small d
C5 E5 ; # small ye
C6 F4 ; # small f
C7 E3 ; # small g
C8 F5 ; # small kh
C9 E8 ; # small i
CA E9 ; # small j
CB EA ; # small k
CC EB ; # small l
CD EC ; # small m
CE ED ; # small n
CF EE ; # small o
D0 EF ; # small p
D1 FF ; # small ya
D2 F0 ; # small r
D3 F1 ; # small s
D4 F2 ; # small t
D5 F3 ; # small u
D6 E6 ; # small zh
D7 E2 ; # small v
D8 FC ; # small soft sign
D9 FB ; # small y
DA E7 ; # small z
DB F8 ; # small sh
DC FD ; # small e
DD F9 ; # small shch
DE F7 ; # small ch
DF FA ; # small hard sign
E0 DE ; # capital YU
E1 C0 ; # capital A
E2 C1 ; # capital B
E3 D6 ; # capital TS
E4 C4 ; # capital D
E5 C5 ; # capital YE
E6 D4 ; # capital F
E7 C3 ; # capital G
E8 D5 ; # capital KH
E9 C8 ; # capital I
EA C9 ; # capital J
EB CA ; # capital K
EC CB ; # capital L
ED CC ; # capital M
EE CD ; # capital N
EF CE ; # capital O
F0 CF ; # capital P
F1 DF ; # capital YA
F2 D0 ; # capital R
F3 D1 ; # capital S
F4 D2 ; # capital T
F5 D3 ; # capital U
F6 C6 ; # capital ZH
F7 C2 ; # capital V
F8 DC ; # capital soft sign
F9 DB ; # capital Y
FA C7 ; # capital Z
FB D8 ; # capital SH
FC DD ; # capital E
FD D9 ; # capital SHCH
FE D7 ; # capital CH
FF DA ; # capital hard sign
}

@ -1,99 +0,0 @@
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/avif avif;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
font/woff woff;
font/woff2 woff2;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/wasm wasm;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}

@ -1,61 +0,0 @@
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html/dist;
index index.html index.htm;
}
location /onlinetest/ {
rewrite ^/onlinetest/(.*)$ /$1 break;
proxy_pass http://123.57.54.1:8048;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

@ -1,17 +0,0 @@
scgi_param REQUEST_METHOD $request_method;
scgi_param REQUEST_URI $request_uri;
scgi_param QUERY_STRING $query_string;
scgi_param CONTENT_TYPE $content_type;
scgi_param DOCUMENT_URI $document_uri;
scgi_param DOCUMENT_ROOT $document_root;
scgi_param SCGI 1;
scgi_param SERVER_PROTOCOL $server_protocol;
scgi_param REQUEST_SCHEME $scheme;
scgi_param HTTPS $https if_not_empty;
scgi_param REMOTE_ADDR $remote_addr;
scgi_param REMOTE_PORT $remote_port;
scgi_param SERVER_PORT $server_port;
scgi_param SERVER_NAME $server_name;

@ -1,17 +0,0 @@
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;

@ -1,126 +0,0 @@
# This map is not a full windows-1251 <> utf8 map: it does not
# contain Serbian and Macedonian letters. If you need a full map,
# use contrib/unicode2nginx/win-utf map instead.
charset_map windows-1251 utf-8 {
82 E2809A ; # single low-9 quotation mark
84 E2809E ; # double low-9 quotation mark
85 E280A6 ; # ellipsis
86 E280A0 ; # dagger
87 E280A1 ; # double dagger
88 E282AC ; # euro
89 E280B0 ; # per mille
91 E28098 ; # left single quotation mark
92 E28099 ; # right single quotation mark
93 E2809C ; # left double quotation mark
94 E2809D ; # right double quotation mark
95 E280A2 ; # bullet
96 E28093 ; # en dash
97 E28094 ; # em dash
99 E284A2 ; # trade mark sign
A0 C2A0 ; # &nbsp;
A1 D18E ; # capital Byelorussian short U
A2 D19E ; # small Byelorussian short u
A4 C2A4 ; # currency sign
A5 D290 ; # capital Ukrainian soft G
A6 C2A6 ; # borken bar
A7 C2A7 ; # section sign
A8 D081 ; # capital YO
A9 C2A9 ; # (C)
AA D084 ; # capital Ukrainian YE
AB C2AB ; # left-pointing double angle quotation mark
AC C2AC ; # not sign
AD C2AD ; # soft hypen
AE C2AE ; # (R)
AF D087 ; # capital Ukrainian YI
B0 C2B0 ; # &deg;
B1 C2B1 ; # plus-minus sign
B2 D086 ; # capital Ukrainian I
B3 D196 ; # small Ukrainian i
B4 D291 ; # small Ukrainian soft g
B5 C2B5 ; # micro sign
B6 C2B6 ; # pilcrow sign
B7 C2B7 ; # &middot;
B8 D191 ; # small yo
B9 E28496 ; # numero sign
BA D194 ; # small Ukrainian ye
BB C2BB ; # right-pointing double angle quotation mark
BF D197 ; # small Ukrainian yi
C0 D090 ; # capital A
C1 D091 ; # capital B
C2 D092 ; # capital V
C3 D093 ; # capital G
C4 D094 ; # capital D
C5 D095 ; # capital YE
C6 D096 ; # capital ZH
C7 D097 ; # capital Z
C8 D098 ; # capital I
C9 D099 ; # capital J
CA D09A ; # capital K
CB D09B ; # capital L
CC D09C ; # capital M
CD D09D ; # capital N
CE D09E ; # capital O
CF D09F ; # capital P
D0 D0A0 ; # capital R
D1 D0A1 ; # capital S
D2 D0A2 ; # capital T
D3 D0A3 ; # capital U
D4 D0A4 ; # capital F
D5 D0A5 ; # capital KH
D6 D0A6 ; # capital TS
D7 D0A7 ; # capital CH
D8 D0A8 ; # capital SH
D9 D0A9 ; # capital SHCH
DA D0AA ; # capital hard sign
DB D0AB ; # capital Y
DC D0AC ; # capital soft sign
DD D0AD ; # capital E
DE D0AE ; # capital YU
DF D0AF ; # capital YA
E0 D0B0 ; # small a
E1 D0B1 ; # small b
E2 D0B2 ; # small v
E3 D0B3 ; # small g
E4 D0B4 ; # small d
E5 D0B5 ; # small ye
E6 D0B6 ; # small zh
E7 D0B7 ; # small z
E8 D0B8 ; # small i
E9 D0B9 ; # small j
EA D0BA ; # small k
EB D0BB ; # small l
EC D0BC ; # small m
ED D0BD ; # small n
EE D0BE ; # small o
EF D0BF ; # small p
F0 D180 ; # small r
F1 D181 ; # small s
F2 D182 ; # small t
F3 D183 ; # small u
F4 D184 ; # small f
F5 D185 ; # small kh
F6 D186 ; # small ts
F7 D187 ; # small ch
F8 D188 ; # small sh
F9 D189 ; # small shch
FA D18A ; # small hard sign
FB D18B ; # small y
FC D18C ; # small soft sign
FD D18D ; # small e
FE D18E ; # small yu
FF D18F ; # small ya
}

@ -1,21 +0,0 @@
geo2nginx.pl by Andrei Nigmatulin
The perl script to convert CSV geoip database ( free download
at http://www.maxmind.com/app/geoip_country ) to format, suitable
for use by the ngx_http_geo_module.
unicode2nginx by Maxim Dounin
The perl script to convert unicode mappings ( available
at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx
configuration file format.
Two generated full maps for windows-1251 and koi8-r.
vim by Evan Miller
Syntax highlighting of nginx configuration for vim, to be
placed into ~/.vim/.

@ -1,58 +0,0 @@
#!/usr/bin/perl -w
# (c) Andrei Nigmatulin, 2005
#
# this script provided "as is", without any warranties. use it at your own risk.
#
# special thanx to Andrew Sitnikov for perl port
#
# this script converts CSV geoip database (free download at http://www.maxmind.com/app/geoip_country)
# to format, suitable for use with nginx_http_geo module (http://sysoev.ru/nginx)
#
# for example, line with ip range
#
# "62.16.68.0","62.16.127.255","1041253376","1041268735","RU","Russian Federation"
#
# will be converted to four subnetworks:
#
# 62.16.68.0/22 RU;
# 62.16.72.0/21 RU;
# 62.16.80.0/20 RU;
# 62.16.96.0/19 RU;
use warnings;
use strict;
while( <STDIN> ){
if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){
print_subnets($1, $2, $3);
}
}
sub print_subnets {
my ($a1, $a2, $c) = @_;
my $l;
while ($a1 <= $a2) {
for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){};
print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";\n";
$a1 += (1 << $l);
}
}
sub long2ip {
my $ip = shift;
my $str = 0;
$str = ($ip & 255);
$ip >>= 8;
$str = ($ip & 255).".$str";
$ip >>= 8;
$str = ($ip & 255).".$str";
$ip >>= 8;
$str = ($ip & 255).".$str";
}

@ -1,131 +0,0 @@
charset_map koi8-r utf-8 {
80 E29480 ; # BOX DRAWINGS LIGHT HORIZONTAL
81 E29482 ; # BOX DRAWINGS LIGHT VERTICAL
82 E2948C ; # BOX DRAWINGS LIGHT DOWN AND RIGHT
83 E29490 ; # BOX DRAWINGS LIGHT DOWN AND LEFT
84 E29494 ; # BOX DRAWINGS LIGHT UP AND RIGHT
85 E29498 ; # BOX DRAWINGS LIGHT UP AND LEFT
86 E2949C ; # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
87 E294A4 ; # BOX DRAWINGS LIGHT VERTICAL AND LEFT
88 E294AC ; # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
89 E294B4 ; # BOX DRAWINGS LIGHT UP AND HORIZONTAL
8A E294BC ; # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
8B E29680 ; # UPPER HALF BLOCK
8C E29684 ; # LOWER HALF BLOCK
8D E29688 ; # FULL BLOCK
8E E2968C ; # LEFT HALF BLOCK
8F E29690 ; # RIGHT HALF BLOCK
90 E29691 ; # LIGHT SHADE
91 E29692 ; # MEDIUM SHADE
92 E29693 ; # DARK SHADE
93 E28CA0 ; # TOP HALF INTEGRAL
94 E296A0 ; # BLACK SQUARE
95 E28899 ; # BULLET OPERATOR
96 E2889A ; # SQUARE ROOT
97 E28988 ; # ALMOST EQUAL TO
98 E289A4 ; # LESS-THAN OR EQUAL TO
99 E289A5 ; # GREATER-THAN OR EQUAL TO
9A C2A0 ; # NO-BREAK SPACE
9B E28CA1 ; # BOTTOM HALF INTEGRAL
9C C2B0 ; # DEGREE SIGN
9D C2B2 ; # SUPERSCRIPT TWO
9E C2B7 ; # MIDDLE DOT
9F C3B7 ; # DIVISION SIGN
A0 E29590 ; # BOX DRAWINGS DOUBLE HORIZONTAL
A1 E29591 ; # BOX DRAWINGS DOUBLE VERTICAL
A2 E29592 ; # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
A3 D191 ; # CYRILLIC SMALL LETTER IO
A4 E29593 ; # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
A5 E29594 ; # BOX DRAWINGS DOUBLE DOWN AND RIGHT
A6 E29595 ; # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
A7 E29596 ; # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
A8 E29597 ; # BOX DRAWINGS DOUBLE DOWN AND LEFT
A9 E29598 ; # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
AA E29599 ; # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
AB E2959A ; # BOX DRAWINGS DOUBLE UP AND RIGHT
AC E2959B ; # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
AD E2959C ; # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
AE E2959D ; # BOX DRAWINGS DOUBLE UP AND LEFT
AF E2959E ; # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
B0 E2959F ; # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
B1 E295A0 ; # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
B2 E295A1 ; # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
B3 D081 ; # CYRILLIC CAPITAL LETTER IO
B4 E295A2 ; # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
B5 E295A3 ; # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
B6 E295A4 ; # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
B7 E295A5 ; # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
B8 E295A6 ; # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
B9 E295A7 ; # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
BA E295A8 ; # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
BB E295A9 ; # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
BC E295AA ; # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
BD E295AB ; # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
BE E295AC ; # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
BF C2A9 ; # COPYRIGHT SIGN
C0 D18E ; # CYRILLIC SMALL LETTER YU
C1 D0B0 ; # CYRILLIC SMALL LETTER A
C2 D0B1 ; # CYRILLIC SMALL LETTER BE
C3 D186 ; # CYRILLIC SMALL LETTER TSE
C4 D0B4 ; # CYRILLIC SMALL LETTER DE
C5 D0B5 ; # CYRILLIC SMALL LETTER IE
C6 D184 ; # CYRILLIC SMALL LETTER EF
C7 D0B3 ; # CYRILLIC SMALL LETTER GHE
C8 D185 ; # CYRILLIC SMALL LETTER HA
C9 D0B8 ; # CYRILLIC SMALL LETTER I
CA D0B9 ; # CYRILLIC SMALL LETTER SHORT I
CB D0BA ; # CYRILLIC SMALL LETTER KA
CC D0BB ; # CYRILLIC SMALL LETTER EL
CD D0BC ; # CYRILLIC SMALL LETTER EM
CE D0BD ; # CYRILLIC SMALL LETTER EN
CF D0BE ; # CYRILLIC SMALL LETTER O
D0 D0BF ; # CYRILLIC SMALL LETTER PE
D1 D18F ; # CYRILLIC SMALL LETTER YA
D2 D180 ; # CYRILLIC SMALL LETTER ER
D3 D181 ; # CYRILLIC SMALL LETTER ES
D4 D182 ; # CYRILLIC SMALL LETTER TE
D5 D183 ; # CYRILLIC SMALL LETTER U
D6 D0B6 ; # CYRILLIC SMALL LETTER ZHE
D7 D0B2 ; # CYRILLIC SMALL LETTER VE
D8 D18C ; # CYRILLIC SMALL LETTER SOFT SIGN
D9 D18B ; # CYRILLIC SMALL LETTER YERU
DA D0B7 ; # CYRILLIC SMALL LETTER ZE
DB D188 ; # CYRILLIC SMALL LETTER SHA
DC D18D ; # CYRILLIC SMALL LETTER E
DD D189 ; # CYRILLIC SMALL LETTER SHCHA
DE D187 ; # CYRILLIC SMALL LETTER CHE
DF D18A ; # CYRILLIC SMALL LETTER HARD SIGN
E0 D0AE ; # CYRILLIC CAPITAL LETTER YU
E1 D090 ; # CYRILLIC CAPITAL LETTER A
E2 D091 ; # CYRILLIC CAPITAL LETTER BE
E3 D0A6 ; # CYRILLIC CAPITAL LETTER TSE
E4 D094 ; # CYRILLIC CAPITAL LETTER DE
E5 D095 ; # CYRILLIC CAPITAL LETTER IE
E6 D0A4 ; # CYRILLIC CAPITAL LETTER EF
E7 D093 ; # CYRILLIC CAPITAL LETTER GHE
E8 D0A5 ; # CYRILLIC CAPITAL LETTER HA
E9 D098 ; # CYRILLIC CAPITAL LETTER I
EA D099 ; # CYRILLIC CAPITAL LETTER SHORT I
EB D09A ; # CYRILLIC CAPITAL LETTER KA
EC D09B ; # CYRILLIC CAPITAL LETTER EL
ED D09C ; # CYRILLIC CAPITAL LETTER EM
EE D09D ; # CYRILLIC CAPITAL LETTER EN
EF D09E ; # CYRILLIC CAPITAL LETTER O
F0 D09F ; # CYRILLIC CAPITAL LETTER PE
F1 D0AF ; # CYRILLIC CAPITAL LETTER YA
F2 D0A0 ; # CYRILLIC CAPITAL LETTER ER
F3 D0A1 ; # CYRILLIC CAPITAL LETTER ES
F4 D0A2 ; # CYRILLIC CAPITAL LETTER TE
F5 D0A3 ; # CYRILLIC CAPITAL LETTER U
F6 D096 ; # CYRILLIC CAPITAL LETTER ZHE
F7 D092 ; # CYRILLIC CAPITAL LETTER VE
F8 D0AC ; # CYRILLIC CAPITAL LETTER SOFT SIGN
F9 D0AB ; # CYRILLIC CAPITAL LETTER YERU
FA D097 ; # CYRILLIC CAPITAL LETTER ZE
FB D0A8 ; # CYRILLIC CAPITAL LETTER SHA
FC D0AD ; # CYRILLIC CAPITAL LETTER E
FD D0A9 ; # CYRILLIC CAPITAL LETTER SHCHA
FE D0A7 ; # CYRILLIC CAPITAL LETTER CHE
FF D0AA ; # CYRILLIC CAPITAL LETTER HARD SIGN
}

@ -1,48 +0,0 @@
#!/usr/bin/perl -w
# Convert unicode mappings to nginx configuration file format.
# You may find useful mappings in various places, including
# unicode.org official site:
#
# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT
# http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT
# Needs perl 5.6 or later.
# Written by Maxim Dounin, mdounin@mdounin.ru
###############################################################################
require 5.006;
while (<>) {
# Skip comments and empty lines
next if /^#/;
next if /^\s*$/;
chomp;
# Convert mappings
if (/^\s*0x(..)\s*0x(....)\s*(#.*)/) {
# Mapping <from-code> <unicode-code> "#" <unicode-name>
my $cs_code = $1;
my $un_code = $2;
my $un_name = $3;
# Produce UTF-8 sequence from character code;
my $un_utf8 = join('',
map { sprintf("%02X", $_) }
unpack("U0C*", pack("U", hex($un_code)))
);
print " $cs_code $un_utf8 ; $un_name\n";
} else {
warn "Unrecognized line: '$_'";
}
}
###############################################################################

@ -1,130 +0,0 @@
charset_map windows-1251 utf-8 {
80 D082 ; #CYRILLIC CAPITAL LETTER DJE
81 D083 ; #CYRILLIC CAPITAL LETTER GJE
82 E2809A ; #SINGLE LOW-9 QUOTATION MARK
83 D193 ; #CYRILLIC SMALL LETTER GJE
84 E2809E ; #DOUBLE LOW-9 QUOTATION MARK
85 E280A6 ; #HORIZONTAL ELLIPSIS
86 E280A0 ; #DAGGER
87 E280A1 ; #DOUBLE DAGGER
88 E282AC ; #EURO SIGN
89 E280B0 ; #PER MILLE SIGN
8A D089 ; #CYRILLIC CAPITAL LETTER LJE
8B E280B9 ; #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
8C D08A ; #CYRILLIC CAPITAL LETTER NJE
8D D08C ; #CYRILLIC CAPITAL LETTER KJE
8E D08B ; #CYRILLIC CAPITAL LETTER TSHE
8F D08F ; #CYRILLIC CAPITAL LETTER DZHE
90 D192 ; #CYRILLIC SMALL LETTER DJE
91 E28098 ; #LEFT SINGLE QUOTATION MARK
92 E28099 ; #RIGHT SINGLE QUOTATION MARK
93 E2809C ; #LEFT DOUBLE QUOTATION MARK
94 E2809D ; #RIGHT DOUBLE QUOTATION MARK
95 E280A2 ; #BULLET
96 E28093 ; #EN DASH
97 E28094 ; #EM DASH
99 E284A2 ; #TRADE MARK SIGN
9A D199 ; #CYRILLIC SMALL LETTER LJE
9B E280BA ; #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
9C D19A ; #CYRILLIC SMALL LETTER NJE
9D D19C ; #CYRILLIC SMALL LETTER KJE
9E D19B ; #CYRILLIC SMALL LETTER TSHE
9F D19F ; #CYRILLIC SMALL LETTER DZHE
A0 C2A0 ; #NO-BREAK SPACE
A1 D08E ; #CYRILLIC CAPITAL LETTER SHORT U
A2 D19E ; #CYRILLIC SMALL LETTER SHORT U
A3 D088 ; #CYRILLIC CAPITAL LETTER JE
A4 C2A4 ; #CURRENCY SIGN
A5 D290 ; #CYRILLIC CAPITAL LETTER GHE WITH UPTURN
A6 C2A6 ; #BROKEN BAR
A7 C2A7 ; #SECTION SIGN
A8 D081 ; #CYRILLIC CAPITAL LETTER IO
A9 C2A9 ; #COPYRIGHT SIGN
AA D084 ; #CYRILLIC CAPITAL LETTER UKRAINIAN IE
AB C2AB ; #LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
AC C2AC ; #NOT SIGN
AD C2AD ; #SOFT HYPHEN
AE C2AE ; #REGISTERED SIGN
AF D087 ; #CYRILLIC CAPITAL LETTER YI
B0 C2B0 ; #DEGREE SIGN
B1 C2B1 ; #PLUS-MINUS SIGN
B2 D086 ; #CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
B3 D196 ; #CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
B4 D291 ; #CYRILLIC SMALL LETTER GHE WITH UPTURN
B5 C2B5 ; #MICRO SIGN
B6 C2B6 ; #PILCROW SIGN
B7 C2B7 ; #MIDDLE DOT
B8 D191 ; #CYRILLIC SMALL LETTER IO
B9 E28496 ; #NUMERO SIGN
BA D194 ; #CYRILLIC SMALL LETTER UKRAINIAN IE
BB C2BB ; #RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
BC D198 ; #CYRILLIC SMALL LETTER JE
BD D085 ; #CYRILLIC CAPITAL LETTER DZE
BE D195 ; #CYRILLIC SMALL LETTER DZE
BF D197 ; #CYRILLIC SMALL LETTER YI
C0 D090 ; #CYRILLIC CAPITAL LETTER A
C1 D091 ; #CYRILLIC CAPITAL LETTER BE
C2 D092 ; #CYRILLIC CAPITAL LETTER VE
C3 D093 ; #CYRILLIC CAPITAL LETTER GHE
C4 D094 ; #CYRILLIC CAPITAL LETTER DE
C5 D095 ; #CYRILLIC CAPITAL LETTER IE
C6 D096 ; #CYRILLIC CAPITAL LETTER ZHE
C7 D097 ; #CYRILLIC CAPITAL LETTER ZE
C8 D098 ; #CYRILLIC CAPITAL LETTER I
C9 D099 ; #CYRILLIC CAPITAL LETTER SHORT I
CA D09A ; #CYRILLIC CAPITAL LETTER KA
CB D09B ; #CYRILLIC CAPITAL LETTER EL
CC D09C ; #CYRILLIC CAPITAL LETTER EM
CD D09D ; #CYRILLIC CAPITAL LETTER EN
CE D09E ; #CYRILLIC CAPITAL LETTER O
CF D09F ; #CYRILLIC CAPITAL LETTER PE
D0 D0A0 ; #CYRILLIC CAPITAL LETTER ER
D1 D0A1 ; #CYRILLIC CAPITAL LETTER ES
D2 D0A2 ; #CYRILLIC CAPITAL LETTER TE
D3 D0A3 ; #CYRILLIC CAPITAL LETTER U
D4 D0A4 ; #CYRILLIC CAPITAL LETTER EF
D5 D0A5 ; #CYRILLIC CAPITAL LETTER HA
D6 D0A6 ; #CYRILLIC CAPITAL LETTER TSE
D7 D0A7 ; #CYRILLIC CAPITAL LETTER CHE
D8 D0A8 ; #CYRILLIC CAPITAL LETTER SHA
D9 D0A9 ; #CYRILLIC CAPITAL LETTER SHCHA
DA D0AA ; #CYRILLIC CAPITAL LETTER HARD SIGN
DB D0AB ; #CYRILLIC CAPITAL LETTER YERU
DC D0AC ; #CYRILLIC CAPITAL LETTER SOFT SIGN
DD D0AD ; #CYRILLIC CAPITAL LETTER E
DE D0AE ; #CYRILLIC CAPITAL LETTER YU
DF D0AF ; #CYRILLIC CAPITAL LETTER YA
E0 D0B0 ; #CYRILLIC SMALL LETTER A
E1 D0B1 ; #CYRILLIC SMALL LETTER BE
E2 D0B2 ; #CYRILLIC SMALL LETTER VE
E3 D0B3 ; #CYRILLIC SMALL LETTER GHE
E4 D0B4 ; #CYRILLIC SMALL LETTER DE
E5 D0B5 ; #CYRILLIC SMALL LETTER IE
E6 D0B6 ; #CYRILLIC SMALL LETTER ZHE
E7 D0B7 ; #CYRILLIC SMALL LETTER ZE
E8 D0B8 ; #CYRILLIC SMALL LETTER I
E9 D0B9 ; #CYRILLIC SMALL LETTER SHORT I
EA D0BA ; #CYRILLIC SMALL LETTER KA
EB D0BB ; #CYRILLIC SMALL LETTER EL
EC D0BC ; #CYRILLIC SMALL LETTER EM
ED D0BD ; #CYRILLIC SMALL LETTER EN
EE D0BE ; #CYRILLIC SMALL LETTER O
EF D0BF ; #CYRILLIC SMALL LETTER PE
F0 D180 ; #CYRILLIC SMALL LETTER ER
F1 D181 ; #CYRILLIC SMALL LETTER ES
F2 D182 ; #CYRILLIC SMALL LETTER TE
F3 D183 ; #CYRILLIC SMALL LETTER U
F4 D184 ; #CYRILLIC SMALL LETTER EF
F5 D185 ; #CYRILLIC SMALL LETTER HA
F6 D186 ; #CYRILLIC SMALL LETTER TSE
F7 D187 ; #CYRILLIC SMALL LETTER CHE
F8 D188 ; #CYRILLIC SMALL LETTER SHA
F9 D189 ; #CYRILLIC SMALL LETTER SHCHA
FA D18A ; #CYRILLIC SMALL LETTER HARD SIGN
FB D18B ; #CYRILLIC SMALL LETTER YERU
FC D18C ; #CYRILLIC SMALL LETTER SOFT SIGN
FD D18D ; #CYRILLIC SMALL LETTER E
FE D18E ; #CYRILLIC SMALL LETTER YU
FF D18F ; #CYRILLIC SMALL LETTER YA
}

@ -1,4 +0,0 @@
au BufRead,BufNewFile *.nginx set ft=nginx
au BufRead,BufNewFile */etc/nginx/* set ft=nginx
au BufRead,BufNewFile */usr/local/nginx/conf/* set ft=nginx
au BufRead,BufNewFile nginx.conf set ft=nginx

@ -1,11 +0,0 @@
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal indentexpr=
" cindent actually works for nginx' simple file structure
setlocal cindent
" Just make sure that the comments are not reset as defs would be.
setlocal cinkeys-=0#

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,26 +0,0 @@
/*
* Copyright (C) 2002-2021 Igor Sysoev
* Copyright (C) 2011-2022 Nginx, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*/

@ -1,125 +0,0 @@
LICENSE ISSUES
==============
The OpenSSL toolkit stays under a double license, i.e. both the conditions of
the OpenSSL License and the original SSLeay license apply to the toolkit.
See below for the actual license texts.
OpenSSL License
---------------
/* ====================================================================
* Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. 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.
*
* 3. All advertising materials mentioning features or use of this
* software must display the following acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
*
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
* endorse or promote products derived from this software without
* prior written permission. For written permission, please contact
* openssl-core@openssl.org.
*
* 5. Products derived from this software may not be called "OpenSSL"
* nor may "OpenSSL" appear in their names without prior written
* permission of the OpenSSL Project.
*
* 6. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the OpenSSL Project
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
*
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
* EXPRESSED 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 OpenSSL PROJECT OR
* ITS 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.
* ====================================================================
*
* This product includes cryptographic software written by Eric Young
* (eay@cryptsoft.com). This product includes software written by Tim
* Hudson (tjh@cryptsoft.com).
*
*/
Original SSLeay License
-----------------------
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
* All rights reserved.
*
* This package is an SSL implementation written
* by Eric Young (eay@cryptsoft.com).
* The implementation was written so as to conform with Netscapes SSL.
*
* This library is free for commercial and non-commercial use as long as
* the following conditions are aheared to. The following conditions
* apply to all code found in this distribution, be it the RC4, RSA,
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
* included with this distribution is covered by the same copyright terms
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
*
* Copyright remains Eric Young's, and as such any Copyright notices in
* the code are not to be removed.
* If this package is used in a product, Eric Young should be given attribution
* as the author of the parts of the library used.
* This can be in the form of a textual message at program startup or
* in documentation (online or textual) provided with the package.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* "This product includes cryptographic software written by
* Eric Young (eay@cryptsoft.com)"
* The word 'cryptographic' can be left out if the rouines from the library
* being used are not cryptographic related :-).
* 4. If you include any Windows specific code (or a derivative thereof) from
* the apps directory (application code) you must include an acknowledgement:
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
*
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 AUTHOR 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.
*
* The licence and distribution terms for any publically available version or
* derivative of this code cannot be changed. i.e. this code cannot simply be
* copied and put under another distribution licence
* [including the GNU Public Licence.]
*/

@ -1,94 +0,0 @@
PCRE2 LICENCE
-------------
PCRE2 is a library of functions to support regular expressions whose syntax
and semantics are as close as possible to those of the Perl 5 language.
Releases 10.00 and above of PCRE2 are distributed under the terms of the "BSD"
licence, as specified below, with one exemption for certain binary
redistributions. The documentation for PCRE2, supplied in the "doc" directory,
is distributed under the same terms as the software itself. The data in the
testdata directory is not copyrighted and is in the public domain.
The basic library functions are written in C and are freestanding. Also
included in the distribution is a just-in-time compiler that can be used to
optimize pattern matching. This is an optional feature that can be omitted when
the library is built.
THE BASIC LIBRARY FUNCTIONS
---------------------------
Written by: Philip Hazel
Email local part: Philip.Hazel
Email domain: gmail.com
Retired from University of Cambridge Computing Service,
Cambridge, England.
Copyright (c) 1997-2021 University of Cambridge
All rights reserved.
PCRE2 JUST-IN-TIME COMPILATION SUPPORT
--------------------------------------
Written by: Zoltan Herczeg
Email local part: hzmester
Email domain: freemail.hu
Copyright(c) 2010-2021 Zoltan Herczeg
All rights reserved.
STACK-LESS JUST-IN-TIME COMPILER
--------------------------------
Written by: Zoltan Herczeg
Email local part: hzmester
Email domain: freemail.hu
Copyright(c) 2009-2021 Zoltan Herczeg
All rights reserved.
THE "BSD" LICENCE
-----------------
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 notices,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notices, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of any
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 OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
EXEMPTION FOR BINARY LIBRARY-LIKE PACKAGES
------------------------------------------
The second condition in the BSD licence (covering binary redistributions) does
not apply all the way down a chain of software. If binary package A includes
PCRE2, it must respect the condition, but if package B is software that
includes package A, the condition is not imposed on package B unless it uses
PCRE2 independently.
End

@ -1,3 +0,0 @@
Documentation is available at http://nginx.org

@ -1,20 +0,0 @@
(C) 1995-2022 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Jean-loup Gailly Mark Adler
jloup@gzip.org madler@alumni.caltech.edu

@ -1,19 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the error log for details.</p>
<p><em>Faithfully yours, nginx.</em></p>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

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

Loading…
Cancel
Save