diff --git a/.env b/.env new file mode 100644 index 00000000..6fa31bdf --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ + +REACT_APP_API_URL=https://dev.ocmg.vn/showniq/api/backoffice +REACT_APP_API_ROOT="" + \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index c5b7294e..48082f72 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -11.15.0 +12 diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000..a03d4b7d --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,8 @@ +module.exports = { + semi: true, + bracketSpacing: false, + jsxBracketSameLine: true, + singleQuote: true, + trailingComma: 'none', + tabWidth: 4 +}; diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..c14ab72f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..3ae6ade6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# Create image based on the official Node image from dockerhub +FROM node:14.17.6 as cache-image +WORKDIR /usr/src/app +# RUN npm install + +# Build frontend +FROM cache-image as builder +WORKDIR /usr/src/app +COPY . /usr/src/app + +# RUN yarn build +COPY package.json ./ +RUN npm install +RUN npm rebuild node-sass +RUN export PUBLIC_URL=http://localhost:3000/labeler +# Build frontend +# FROM cache-image as builder +# WORKDIR /usr/src/app +COPY . . +CMD ["npm", "start"] \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..101227b9 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,62 @@ +// pipeline { +// agent { +// docker { +// image 'node:14-alpine' +// args '-p 3005:3005' +// label 'support_ubuntu_docker' +// } +// } +// environment { +// HOME = '.' +// CI = 'true' +// } +// stages { +// stage('Build') { +// steps { +// // sh 'npm cache clean --force' +// sh 'npm install' +// } +// } + +// stage('Deliver') { +// steps { +// sh "chmod +x -R ${env.WORKSPACE}" +// sh './jenkins/scripts/deliver.sh' +// // input message: 'Finished using the web site? (Click "Proceed" to continue)' +// // sh './jenkins/scripts/kill.sh' +// } +// } + +// } +// } + +pipeline { + // options { + // timeout(time: 1, unit: 'HOURS') + // } + agent { + dockerfile { + filename "Dockerfile" + args '-p 3005:3005' + label "java-docker-slave" + additionalBuildArgs "-t my-custom-node:latest" + } + } + environment { + HOME = '.' + CI = 'true' + } + stages { + stage("Test") { + steps { + sh "chmod +x -R ${env.WORKSPACE}" + sh "docker stop mydocker2" + sh "docker rm mydocker2" + sh "docker run -dit -p 3005:3005 --name=mydocker2 --restart=always my-custom-node " + script { + echo "test" + } + } + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index add55457..8089670b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3908,6 +3908,27 @@ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.3.tgz", "integrity": "sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA==" }, + "axios": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.1.tgz", + "integrity": "sha512-ePNMai55xo5GsXajb/k756AqZqpqeDaGwGcdvbZLSSELbbYwsIn2jNmGfUPEwd8j/yu4OoMstLLIVa4t0MneEA==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -4862,9 +4883,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001252", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", - "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==" + "version": "1.0.30001370", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz", + "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==" }, "capture-exit": { "version": "2.0.0", @@ -7099,9 +7120,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz", - "integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz", + "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==" }, "eslint-plugin-testing-library": { "version": "3.10.2", @@ -7843,9 +7864,9 @@ } }, "follow-redirects": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz", - "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==" + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "for-in": { "version": "1.0.2", @@ -11758,6 +11779,11 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -14613,11 +14639,56 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" }, + "react-icons": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz", + "integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==" + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-modal-resizable-draggable": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/react-modal-resizable-draggable/-/react-modal-resizable-draggable-0.1.6.tgz", + "integrity": "sha512-xNpmEE47WtlCQpFOiqcyZ/3e/PzPO7iIMoKHugNLWm53U1y4OCRwlOqSX7IzdjceE8bEnLmf5vJDt/pNJf/+HA==", + "requires": { + "react": "^17.0.0", + "react-dom": "^17.0.1", + "react-icons": "^4.2.0", + "react-motion": "^0.5.2", + "react-transition-group": "^4.4.1" + }, + "dependencies": { + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } + } + }, + "react-motion": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", + "integrity": "sha512-9q3YAvHoUiWlP3cK0v+w1N5Z23HXMj4IF4YuvjvWegWqNPfLXsOBE/V7UvQGpXxHFKRQQcNcVQE31g9SB/6qgQ==", + "requires": { + "performance-now": "^0.2.0", + "prop-types": "^15.5.8", + "raf": "^3.1.0" + }, + "dependencies": { + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==" + } + } + }, "react-redux": { "version": "7.2.4", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz", @@ -14730,6 +14801,20 @@ } } }, + "react-select": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.3.0.tgz", + "integrity": "sha512-GM6Fbv1+X+kb3e5Fc4oNeyOJkCIesY/D4NBiReKlGY4RxoeztFYm3J0KREgwMaIKQqwTiuLqTlpUBY3SYw5goQ==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.1.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0" + } + }, "react-spinners": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.11.0.tgz", @@ -14832,6 +14917,11 @@ "@babel/runtime": "^7.9.2" } }, + "redux-thunk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", + "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", diff --git a/package.json b/package.json index b17923e8..df973688 100644 --- a/package.json +++ b/package.json @@ -1,72 +1,84 @@ { - "name": "make-sense", - "version": "1.0.0", - "private": true, - "dependencies": { - "@material-ui/core": "^4.12.3", - "@tensorflow-models/coco-ssd": "^2.2.2", - "@tensorflow-models/posenet": "^2.2.2", - "@tensorflow/tfjs": "^3.8.0", - "@tensorflow/tfjs-backend-cpu": "^3.9.0", - "@tensorflow/tfjs-backend-webgl": "^3.9.0", - "@tensorflow/tfjs-core": "^3.9.0", - "@tensorflow/tfjs-node": "^3.9.0", - "@types/jest": "27.0.1", - "@types/node": "16.7.6", - "@types/react": "17.0.19", - "@types/react-dom": "17.0.9", - "classnames": "^2.3.1", - "file-saver": "^2.0.5", - "jszip": "^3.7.1", - "lodash": "^4.17.21", - "mobile-detect": "^1.4.5", - "moment": "^2.29.1", - "node-sass": "^6.0.1", - "react": "^16.8.6", - "react-custom-scrollbars": "^4.2.1", - "react-dom": "^17.0.2", - "react-dropzone": "^11.3.4", - "react-redux": "^7.2.4", - "react-scripts": "^4.0.3", - "react-spinners": "^0.11.0", - "redux": "^4.1.1", - "typescript": "4.4.2", - "uuid": "^8.3.2" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "test:coverage": "npm test -- --coverage", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "@types/file-saver": "^2.0.3", - "@types/lodash": "^4.14.172", - "@types/react-custom-scrollbars": "^4.0.8", - "@types/react-redux": "^7.1.18", - "@types/uuid": "^8.3.1", - "prettier": "^2.3.2", - "@redux-devtools/core": "^3.9.0", - "tslint": "^6.1.3", - "tslint-react": "^5.0.0" - } + "name": "make-sense", + "version": "1.0.0", + "private": true, + "dependencies": { + "@material-ui/core": "^4.12.3", + "@tensorflow-models/coco-ssd": "^2.2.2", + "@tensorflow-models/posenet": "^2.2.2", + "@tensorflow/tfjs": "^3.8.0", + "@tensorflow/tfjs-backend-cpu": "^3.9.0", + "@tensorflow/tfjs-backend-webgl": "^3.9.0", + "@tensorflow/tfjs-core": "^3.9.0", + "@tensorflow/tfjs-node": "^3.9.0", + "@types/jest": "27.0.1", + "@types/node": "16.7.6", + "@types/react": "17.0.19", + "@types/react-dom": "17.0.9", + "axios": "^0.27.1", + "classnames": "^2.3.1", + "file-saver": "^2.0.5", + "jszip": "^3.7.1", + "lodash": "^4.17.21", + "mobile-detect": "^1.4.5", + "moment": "^2.29.1", + "node-sass": "^6.0.1", + "react": "^16.8.6", + "react-custom-scrollbars": "^4.2.1", + "react-dom": "^17.0.2", + "react-dropzone": "^11.3.4", + "react-modal-resizable-draggable": "^0.1.6", + "react-redux": "^7.2.4", + "react-scripts": "^4.0.3", + "react-select": "^5.3.0", + "react-spinners": "^0.11.0", + "redux": "^4.1.1", + "redux-thunk": "^2.4.1", + "typescript": "4.4.2", + "uuid": "^8.3.2" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "test:coverage": "npm test -- --coverage", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "plugins": [ + "react-hooks" + ], + "extends": [ + "react-app", + "react-app/jest" + ], + "rules": { + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn" + } + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@redux-devtools/core": "^3.9.0", + "@types/file-saver": "^2.0.3", + "@types/lodash": "^4.14.172", + "@types/react-custom-scrollbars": "^4.0.8", + "@types/react-redux": "^7.1.18", + "@types/uuid": "^8.3.1", + "eslint-plugin-react-hooks": "^4.4.0", + "prettier": "^2.3.2", + "tslint": "^6.1.3", + "tslint-react": "^5.0.0" + } } diff --git a/public/guides/1/1_1/1.jpg b/public/guides/1/1_1/1.jpg new file mode 100644 index 00000000..5e0268d6 Binary files /dev/null and b/public/guides/1/1_1/1.jpg differ diff --git a/public/guides/1/1_1/1_s.png b/public/guides/1/1_1/1_s.png new file mode 100644 index 00000000..84009b33 Binary files /dev/null and b/public/guides/1/1_1/1_s.png differ diff --git a/public/guides/1/1_1/2.jpg b/public/guides/1/1_1/2.jpg new file mode 100644 index 00000000..9bdc9b7d Binary files /dev/null and b/public/guides/1/1_1/2.jpg differ diff --git a/public/guides/1/1_1/3.jpg b/public/guides/1/1_1/3.jpg new file mode 100644 index 00000000..9e5e3e73 Binary files /dev/null and b/public/guides/1/1_1/3.jpg differ diff --git a/public/guides/1/1_1/4.jpg b/public/guides/1/1_1/4.jpg new file mode 100644 index 00000000..3a1655e7 Binary files /dev/null and b/public/guides/1/1_1/4.jpg differ diff --git a/public/guides/1/1_1/5.jpg b/public/guides/1/1_1/5.jpg new file mode 100644 index 00000000..08520427 Binary files /dev/null and b/public/guides/1/1_1/5.jpg differ diff --git a/public/guides/1/1_2/1.jpg b/public/guides/1/1_2/1.jpg new file mode 100644 index 00000000..184a61a0 Binary files /dev/null and b/public/guides/1/1_2/1.jpg differ diff --git a/public/guides/1/1_2/2.jpg b/public/guides/1/1_2/2.jpg new file mode 100644 index 00000000..bfa414b5 Binary files /dev/null and b/public/guides/1/1_2/2.jpg differ diff --git a/public/guides/1/1_2/3.jpg b/public/guides/1/1_2/3.jpg new file mode 100644 index 00000000..66304796 Binary files /dev/null and b/public/guides/1/1_2/3.jpg differ diff --git a/public/guides/1/1_2/4.jpg b/public/guides/1/1_2/4.jpg new file mode 100644 index 00000000..5383340c Binary files /dev/null and b/public/guides/1/1_2/4.jpg differ diff --git a/public/guides/1/1_2/5.jpg b/public/guides/1/1_2/5.jpg new file mode 100644 index 00000000..25ca966e Binary files /dev/null and b/public/guides/1/1_2/5.jpg differ diff --git "a/public/guides/1/1_GENDER_\354\204\261\353\263\204 \354\235\270\354\213\235\352\270\260.jpg" "b/public/guides/1/1_GENDER_\354\204\261\353\263\204 \354\235\270\354\213\235\352\270\260.jpg" new file mode 100644 index 00000000..7478ccf4 Binary files /dev/null and "b/public/guides/1/1_GENDER_\354\204\261\353\263\204 \354\235\270\354\213\235\352\270\260.jpg" differ diff --git a/public/guides/2/2_18/1.jpg b/public/guides/2/2_18/1.jpg new file mode 100644 index 00000000..91ca4317 Binary files /dev/null and b/public/guides/2/2_18/1.jpg differ diff --git a/public/guides/2/2_18/2.jpg b/public/guides/2/2_18/2.jpg new file mode 100644 index 00000000..412103fe Binary files /dev/null and b/public/guides/2/2_18/2.jpg differ diff --git a/public/guides/2/2_18/3.jpg b/public/guides/2/2_18/3.jpg new file mode 100644 index 00000000..ceddd3ae Binary files /dev/null and b/public/guides/2/2_18/3.jpg differ diff --git a/public/guides/2/2_18/4.jpg b/public/guides/2/2_18/4.jpg new file mode 100644 index 00000000..1020dc0d Binary files /dev/null and b/public/guides/2/2_18/4.jpg differ diff --git a/public/guides/2/2_18/5.jpg b/public/guides/2/2_18/5.jpg new file mode 100644 index 00000000..3b4361a5 Binary files /dev/null and b/public/guides/2/2_18/5.jpg differ diff --git a/public/guides/2/2_21/1.jpg b/public/guides/2/2_21/1.jpg new file mode 100644 index 00000000..6edbcbda Binary files /dev/null and b/public/guides/2/2_21/1.jpg differ diff --git a/public/guides/2/2_21/2.jpg b/public/guides/2/2_21/2.jpg new file mode 100644 index 00000000..0fbac44a Binary files /dev/null and b/public/guides/2/2_21/2.jpg differ diff --git a/public/guides/2/2_21/3.jpg b/public/guides/2/2_21/3.jpg new file mode 100644 index 00000000..da6cad07 Binary files /dev/null and b/public/guides/2/2_21/3.jpg differ diff --git a/public/guides/2/2_21/4.jpg b/public/guides/2/2_21/4.jpg new file mode 100644 index 00000000..2072baca Binary files /dev/null and b/public/guides/2/2_21/4.jpg differ diff --git a/public/guides/2/2_21/5.jpg b/public/guides/2/2_21/5.jpg new file mode 100644 index 00000000..191a6c44 Binary files /dev/null and b/public/guides/2/2_21/5.jpg differ diff --git a/public/guides/2/2_22/1.jpg b/public/guides/2/2_22/1.jpg new file mode 100644 index 00000000..88b1795f Binary files /dev/null and b/public/guides/2/2_22/1.jpg differ diff --git a/public/guides/2/2_22/2.jpg b/public/guides/2/2_22/2.jpg new file mode 100644 index 00000000..92008e5b Binary files /dev/null and b/public/guides/2/2_22/2.jpg differ diff --git a/public/guides/2/2_22/3.jpg b/public/guides/2/2_22/3.jpg new file mode 100644 index 00000000..4e21a4e8 Binary files /dev/null and b/public/guides/2/2_22/3.jpg differ diff --git a/public/guides/2/2_22/4.jpg b/public/guides/2/2_22/4.jpg new file mode 100644 index 00000000..062a099b Binary files /dev/null and b/public/guides/2/2_22/4.jpg differ diff --git a/public/guides/2/2_22/5.jpg b/public/guides/2/2_22/5.jpg new file mode 100644 index 00000000..efbb1a87 Binary files /dev/null and b/public/guides/2/2_22/5.jpg differ diff --git a/public/guides/2/2_23/1.jpg b/public/guides/2/2_23/1.jpg new file mode 100644 index 00000000..8d822dff Binary files /dev/null and b/public/guides/2/2_23/1.jpg differ diff --git a/public/guides/2/2_23/2.jpg b/public/guides/2/2_23/2.jpg new file mode 100644 index 00000000..b6a70c44 Binary files /dev/null and b/public/guides/2/2_23/2.jpg differ diff --git a/public/guides/2/2_23/3.jpg b/public/guides/2/2_23/3.jpg new file mode 100644 index 00000000..796d6904 Binary files /dev/null and b/public/guides/2/2_23/3.jpg differ diff --git a/public/guides/2/2_23/4.jpg b/public/guides/2/2_23/4.jpg new file mode 100644 index 00000000..fd3ee4e8 Binary files /dev/null and b/public/guides/2/2_23/4.jpg differ diff --git a/public/guides/2/2_23/5.jpg b/public/guides/2/2_23/5.jpg new file mode 100644 index 00000000..a813666b Binary files /dev/null and b/public/guides/2/2_23/5.jpg differ diff --git a/public/guides/2/2_24/1.jpg b/public/guides/2/2_24/1.jpg new file mode 100644 index 00000000..1e04c60f Binary files /dev/null and b/public/guides/2/2_24/1.jpg differ diff --git a/public/guides/2/2_24/2.jpg b/public/guides/2/2_24/2.jpg new file mode 100644 index 00000000..d27510a8 Binary files /dev/null and b/public/guides/2/2_24/2.jpg differ diff --git a/public/guides/2/2_24/3.jpg b/public/guides/2/2_24/3.jpg new file mode 100644 index 00000000..ddf9e062 Binary files /dev/null and b/public/guides/2/2_24/3.jpg differ diff --git a/public/guides/2/2_24/4.jpg b/public/guides/2/2_24/4.jpg new file mode 100644 index 00000000..edf33951 Binary files /dev/null and b/public/guides/2/2_24/4.jpg differ diff --git a/public/guides/2/2_24/5.jpg b/public/guides/2/2_24/5.jpg new file mode 100644 index 00000000..1fec358f Binary files /dev/null and b/public/guides/2/2_24/5.jpg differ diff --git a/public/guides/2/2_27/1.jpg b/public/guides/2/2_27/1.jpg new file mode 100644 index 00000000..a0402d51 Binary files /dev/null and b/public/guides/2/2_27/1.jpg differ diff --git a/public/guides/2/2_27/2.jpg b/public/guides/2/2_27/2.jpg new file mode 100644 index 00000000..e086cc6d Binary files /dev/null and b/public/guides/2/2_27/2.jpg differ diff --git a/public/guides/2/2_27/3.jpg b/public/guides/2/2_27/3.jpg new file mode 100644 index 00000000..a8873cda Binary files /dev/null and b/public/guides/2/2_27/3.jpg differ diff --git a/public/guides/2/2_27/4.jpg b/public/guides/2/2_27/4.jpg new file mode 100644 index 00000000..a0129e12 Binary files /dev/null and b/public/guides/2/2_27/4.jpg differ diff --git a/public/guides/2/2_27/5.jpg b/public/guides/2/2_27/5.jpg new file mode 100644 index 00000000..ac02ef92 Binary files /dev/null and b/public/guides/2/2_27/5.jpg differ diff --git a/public/guides/2/2_28/1.jpg b/public/guides/2/2_28/1.jpg new file mode 100644 index 00000000..7286c91d Binary files /dev/null and b/public/guides/2/2_28/1.jpg differ diff --git a/public/guides/2/2_28/2.jpg b/public/guides/2/2_28/2.jpg new file mode 100644 index 00000000..979281ba Binary files /dev/null and b/public/guides/2/2_28/2.jpg differ diff --git a/public/guides/2/2_28/3.jpg b/public/guides/2/2_28/3.jpg new file mode 100644 index 00000000..1d66761a Binary files /dev/null and b/public/guides/2/2_28/3.jpg differ diff --git a/public/guides/2/2_28/4.jpg b/public/guides/2/2_28/4.jpg new file mode 100644 index 00000000..1f7cba2b Binary files /dev/null and b/public/guides/2/2_28/4.jpg differ diff --git a/public/guides/2/2_28/5.jpg b/public/guides/2/2_28/5.jpg new file mode 100644 index 00000000..e69c868d Binary files /dev/null and b/public/guides/2/2_28/5.jpg differ diff --git a/public/guides/2/2_29/1.jpg b/public/guides/2/2_29/1.jpg new file mode 100644 index 00000000..e72b20c4 Binary files /dev/null and b/public/guides/2/2_29/1.jpg differ diff --git a/public/guides/2/2_29/2.jpg b/public/guides/2/2_29/2.jpg new file mode 100644 index 00000000..47111614 Binary files /dev/null and b/public/guides/2/2_29/2.jpg differ diff --git a/public/guides/2/2_29/3.jpg b/public/guides/2/2_29/3.jpg new file mode 100644 index 00000000..de7a286b Binary files /dev/null and b/public/guides/2/2_29/3.jpg differ diff --git a/public/guides/2/2_29/4.jpg b/public/guides/2/2_29/4.jpg new file mode 100644 index 00000000..89e9eb05 Binary files /dev/null and b/public/guides/2/2_29/4.jpg differ diff --git a/public/guides/2/2_29/5.jpg b/public/guides/2/2_29/5.jpg new file mode 100644 index 00000000..cb8c9d34 Binary files /dev/null and b/public/guides/2/2_29/5.jpg differ diff --git a/public/guides/2/2_30/1.jpg b/public/guides/2/2_30/1.jpg new file mode 100644 index 00000000..9f949562 Binary files /dev/null and b/public/guides/2/2_30/1.jpg differ diff --git a/public/guides/2/2_30/2.jpg b/public/guides/2/2_30/2.jpg new file mode 100644 index 00000000..4521db80 Binary files /dev/null and b/public/guides/2/2_30/2.jpg differ diff --git a/public/guides/2/2_30/3.jpg b/public/guides/2/2_30/3.jpg new file mode 100644 index 00000000..8b7ba7b2 Binary files /dev/null and b/public/guides/2/2_30/3.jpg differ diff --git a/public/guides/2/2_30/4.jpg b/public/guides/2/2_30/4.jpg new file mode 100644 index 00000000..8fa9c991 Binary files /dev/null and b/public/guides/2/2_30/4.jpg differ diff --git a/public/guides/2/2_30/5.jpg b/public/guides/2/2_30/5.jpg new file mode 100644 index 00000000..5d144049 Binary files /dev/null and b/public/guides/2/2_30/5.jpg differ diff --git a/public/guides/2/2_31/1.jpg b/public/guides/2/2_31/1.jpg new file mode 100644 index 00000000..df026653 Binary files /dev/null and b/public/guides/2/2_31/1.jpg differ diff --git a/public/guides/2/2_31/2.jpg b/public/guides/2/2_31/2.jpg new file mode 100644 index 00000000..9929fb87 Binary files /dev/null and b/public/guides/2/2_31/2.jpg differ diff --git a/public/guides/2/2_31/3.jpg b/public/guides/2/2_31/3.jpg new file mode 100644 index 00000000..0b4f6671 Binary files /dev/null and b/public/guides/2/2_31/3.jpg differ diff --git a/public/guides/2/2_31/4.jpg b/public/guides/2/2_31/4.jpg new file mode 100644 index 00000000..70df646b Binary files /dev/null and b/public/guides/2/2_31/4.jpg differ diff --git a/public/guides/2/2_31/5.jpg b/public/guides/2/2_31/5.jpg new file mode 100644 index 00000000..a7fa8c79 Binary files /dev/null and b/public/guides/2/2_31/5.jpg differ diff --git "a/public/guides/2/2_MAN_style \353\202\250\354\204\261 \354\212\244\355\203\200\354\235\274 \354\235\270\354\213\235\352\270\260.jpg" "b/public/guides/2/2_MAN_style \353\202\250\354\204\261 \354\212\244\355\203\200\354\235\274 \354\235\270\354\213\235\352\270\260.jpg" new file mode 100644 index 00000000..1f53e334 Binary files /dev/null and "b/public/guides/2/2_MAN_style \353\202\250\354\204\261 \354\212\244\355\203\200\354\235\274 \354\235\270\354\213\235\352\270\260.jpg" differ diff --git a/public/guides/3/3_18/1.jpg b/public/guides/3/3_18/1.jpg new file mode 100644 index 00000000..bcd26b3b Binary files /dev/null and b/public/guides/3/3_18/1.jpg differ diff --git a/public/guides/3/3_18/2.jpg b/public/guides/3/3_18/2.jpg new file mode 100644 index 00000000..428bf593 Binary files /dev/null and b/public/guides/3/3_18/2.jpg differ diff --git a/public/guides/3/3_18/3.jpg b/public/guides/3/3_18/3.jpg new file mode 100644 index 00000000..04b4d7ee Binary files /dev/null and b/public/guides/3/3_18/3.jpg differ diff --git a/public/guides/3/3_18/4.jpg b/public/guides/3/3_18/4.jpg new file mode 100644 index 00000000..7ab3aaf4 Binary files /dev/null and b/public/guides/3/3_18/4.jpg differ diff --git a/public/guides/3/3_18/5.jpg b/public/guides/3/3_18/5.jpg new file mode 100644 index 00000000..f01324df Binary files /dev/null and b/public/guides/3/3_18/5.jpg differ diff --git a/public/guides/3/3_19/1.jpg b/public/guides/3/3_19/1.jpg new file mode 100644 index 00000000..45457b35 Binary files /dev/null and b/public/guides/3/3_19/1.jpg differ diff --git a/public/guides/3/3_19/2.jpg b/public/guides/3/3_19/2.jpg new file mode 100644 index 00000000..1d2e2b53 Binary files /dev/null and b/public/guides/3/3_19/2.jpg differ diff --git a/public/guides/3/3_19/3.jpg b/public/guides/3/3_19/3.jpg new file mode 100644 index 00000000..e75ed64f Binary files /dev/null and b/public/guides/3/3_19/3.jpg differ diff --git a/public/guides/3/3_19/4.jpg b/public/guides/3/3_19/4.jpg new file mode 100644 index 00000000..2b8f3373 Binary files /dev/null and b/public/guides/3/3_19/4.jpg differ diff --git a/public/guides/3/3_19/5.jpg b/public/guides/3/3_19/5.jpg new file mode 100644 index 00000000..2e49b4cb Binary files /dev/null and b/public/guides/3/3_19/5.jpg differ diff --git a/public/guides/3/3_20/1.jpg b/public/guides/3/3_20/1.jpg new file mode 100644 index 00000000..1fb22aa1 Binary files /dev/null and b/public/guides/3/3_20/1.jpg differ diff --git a/public/guides/3/3_20/2.jpg b/public/guides/3/3_20/2.jpg new file mode 100644 index 00000000..b4302345 Binary files /dev/null and b/public/guides/3/3_20/2.jpg differ diff --git a/public/guides/3/3_20/3.jpg b/public/guides/3/3_20/3.jpg new file mode 100644 index 00000000..ac98cf18 Binary files /dev/null and b/public/guides/3/3_20/3.jpg differ diff --git a/public/guides/3/3_20/4.jpg b/public/guides/3/3_20/4.jpg new file mode 100644 index 00000000..6e8b3c0a Binary files /dev/null and b/public/guides/3/3_20/4.jpg differ diff --git a/public/guides/3/3_20/5.jpg b/public/guides/3/3_20/5.jpg new file mode 100644 index 00000000..c6a5f86d Binary files /dev/null and b/public/guides/3/3_20/5.jpg differ diff --git a/public/guides/3/3_21/1.jpg b/public/guides/3/3_21/1.jpg new file mode 100644 index 00000000..97b817aa Binary files /dev/null and b/public/guides/3/3_21/1.jpg differ diff --git a/public/guides/3/3_21/2.jpg b/public/guides/3/3_21/2.jpg new file mode 100644 index 00000000..31b1eefe Binary files /dev/null and b/public/guides/3/3_21/2.jpg differ diff --git a/public/guides/3/3_21/3.jpg b/public/guides/3/3_21/3.jpg new file mode 100644 index 00000000..e4b1f106 Binary files /dev/null and b/public/guides/3/3_21/3.jpg differ diff --git a/public/guides/3/3_21/4.jpg b/public/guides/3/3_21/4.jpg new file mode 100644 index 00000000..4a443500 Binary files /dev/null and b/public/guides/3/3_21/4.jpg differ diff --git a/public/guides/3/3_21/5.jpg b/public/guides/3/3_21/5.jpg new file mode 100644 index 00000000..473bb9ac Binary files /dev/null and b/public/guides/3/3_21/5.jpg differ diff --git a/public/guides/3/3_22/1.jpg b/public/guides/3/3_22/1.jpg new file mode 100644 index 00000000..5f5b0795 Binary files /dev/null and b/public/guides/3/3_22/1.jpg differ diff --git a/public/guides/3/3_22/2.jpg b/public/guides/3/3_22/2.jpg new file mode 100644 index 00000000..39139b63 Binary files /dev/null and b/public/guides/3/3_22/2.jpg differ diff --git a/public/guides/3/3_22/3.jpg b/public/guides/3/3_22/3.jpg new file mode 100644 index 00000000..1f0a7068 Binary files /dev/null and b/public/guides/3/3_22/3.jpg differ diff --git a/public/guides/3/3_22/4.jpg b/public/guides/3/3_22/4.jpg new file mode 100644 index 00000000..f71e61ce Binary files /dev/null and b/public/guides/3/3_22/4.jpg differ diff --git a/public/guides/3/3_22/5.jpg b/public/guides/3/3_22/5.jpg new file mode 100644 index 00000000..5f56daf5 Binary files /dev/null and b/public/guides/3/3_22/5.jpg differ diff --git a/public/guides/3/3_23/1.JPG b/public/guides/3/3_23/1.JPG new file mode 100644 index 00000000..22884bc2 Binary files /dev/null and b/public/guides/3/3_23/1.JPG differ diff --git a/public/guides/3/3_23/1.jpg b/public/guides/3/3_23/1.jpg new file mode 100644 index 00000000..22884bc2 Binary files /dev/null and b/public/guides/3/3_23/1.jpg differ diff --git a/public/guides/3/3_23/2.jpg b/public/guides/3/3_23/2.jpg new file mode 100644 index 00000000..eb8e6808 Binary files /dev/null and b/public/guides/3/3_23/2.jpg differ diff --git a/public/guides/3/3_23/3.jpg b/public/guides/3/3_23/3.jpg new file mode 100644 index 00000000..857f4c84 Binary files /dev/null and b/public/guides/3/3_23/3.jpg differ diff --git a/public/guides/3/3_23/4.JPG b/public/guides/3/3_23/4.JPG new file mode 100644 index 00000000..13032baf Binary files /dev/null and b/public/guides/3/3_23/4.JPG differ diff --git a/public/guides/3/3_23/4.jpg b/public/guides/3/3_23/4.jpg new file mode 100644 index 00000000..13032baf Binary files /dev/null and b/public/guides/3/3_23/4.jpg differ diff --git a/public/guides/3/3_23/5.JPG b/public/guides/3/3_23/5.JPG new file mode 100644 index 00000000..8ef19ea9 Binary files /dev/null and b/public/guides/3/3_23/5.JPG differ diff --git a/public/guides/3/3_23/5.jpg b/public/guides/3/3_23/5.jpg new file mode 100644 index 00000000..8ef19ea9 Binary files /dev/null and b/public/guides/3/3_23/5.jpg differ diff --git a/public/guides/3/3_24/1.jpg b/public/guides/3/3_24/1.jpg new file mode 100644 index 00000000..61baaec3 Binary files /dev/null and b/public/guides/3/3_24/1.jpg differ diff --git a/public/guides/3/3_24/2.jpg b/public/guides/3/3_24/2.jpg new file mode 100644 index 00000000..19477b3c Binary files /dev/null and b/public/guides/3/3_24/2.jpg differ diff --git a/public/guides/3/3_24/3.jpg b/public/guides/3/3_24/3.jpg new file mode 100644 index 00000000..43fb8b7b Binary files /dev/null and b/public/guides/3/3_24/3.jpg differ diff --git a/public/guides/3/3_24/4.jpg b/public/guides/3/3_24/4.jpg new file mode 100644 index 00000000..89efa1c6 Binary files /dev/null and b/public/guides/3/3_24/4.jpg differ diff --git a/public/guides/3/3_24/5.jpg b/public/guides/3/3_24/5.jpg new file mode 100644 index 00000000..52bc30d0 Binary files /dev/null and b/public/guides/3/3_24/5.jpg differ diff --git a/public/guides/3/3_25/1.jpg b/public/guides/3/3_25/1.jpg new file mode 100644 index 00000000..05c92aac Binary files /dev/null and b/public/guides/3/3_25/1.jpg differ diff --git a/public/guides/3/3_25/2.jpg b/public/guides/3/3_25/2.jpg new file mode 100644 index 00000000..167ebd00 Binary files /dev/null and b/public/guides/3/3_25/2.jpg differ diff --git a/public/guides/3/3_25/3.jpg b/public/guides/3/3_25/3.jpg new file mode 100644 index 00000000..d45e5df6 Binary files /dev/null and b/public/guides/3/3_25/3.jpg differ diff --git a/public/guides/3/3_25/4.jpg b/public/guides/3/3_25/4.jpg new file mode 100644 index 00000000..8d0c619d Binary files /dev/null and b/public/guides/3/3_25/4.jpg differ diff --git a/public/guides/3/3_25/5.jpg b/public/guides/3/3_25/5.jpg new file mode 100644 index 00000000..4006972a Binary files /dev/null and b/public/guides/3/3_25/5.jpg differ diff --git a/public/guides/3/3_26/1.jpg b/public/guides/3/3_26/1.jpg new file mode 100644 index 00000000..e86ec657 Binary files /dev/null and b/public/guides/3/3_26/1.jpg differ diff --git a/public/guides/3/3_26/2.jpg b/public/guides/3/3_26/2.jpg new file mode 100644 index 00000000..d42aaa76 Binary files /dev/null and b/public/guides/3/3_26/2.jpg differ diff --git a/public/guides/3/3_26/3.jpg b/public/guides/3/3_26/3.jpg new file mode 100644 index 00000000..e6fa52a4 Binary files /dev/null and b/public/guides/3/3_26/3.jpg differ diff --git a/public/guides/3/3_26/4.jpg b/public/guides/3/3_26/4.jpg new file mode 100644 index 00000000..57834725 Binary files /dev/null and b/public/guides/3/3_26/4.jpg differ diff --git a/public/guides/3/3_26/5.jpg b/public/guides/3/3_26/5.jpg new file mode 100644 index 00000000..71190ba4 Binary files /dev/null and b/public/guides/3/3_26/5.jpg differ diff --git a/public/guides/3/3_28/1.jpg b/public/guides/3/3_28/1.jpg new file mode 100644 index 00000000..3c1fcecc Binary files /dev/null and b/public/guides/3/3_28/1.jpg differ diff --git a/public/guides/3/3_28/2.jpg b/public/guides/3/3_28/2.jpg new file mode 100644 index 00000000..e7ac54da Binary files /dev/null and b/public/guides/3/3_28/2.jpg differ diff --git a/public/guides/3/3_28/3.jpg b/public/guides/3/3_28/3.jpg new file mode 100644 index 00000000..2305c812 Binary files /dev/null and b/public/guides/3/3_28/3.jpg differ diff --git a/public/guides/3/3_28/4.jpg b/public/guides/3/3_28/4.jpg new file mode 100644 index 00000000..e94c844f Binary files /dev/null and b/public/guides/3/3_28/4.jpg differ diff --git a/public/guides/3/3_28/5.jpg b/public/guides/3/3_28/5.jpg new file mode 100644 index 00000000..43da7c70 Binary files /dev/null and b/public/guides/3/3_28/5.jpg differ diff --git a/public/guides/3/3_29/1.jpg b/public/guides/3/3_29/1.jpg new file mode 100644 index 00000000..8f1251e8 Binary files /dev/null and b/public/guides/3/3_29/1.jpg differ diff --git a/public/guides/3/3_29/2.jpg b/public/guides/3/3_29/2.jpg new file mode 100644 index 00000000..b80b2cbf Binary files /dev/null and b/public/guides/3/3_29/2.jpg differ diff --git a/public/guides/3/3_29/3.jpg b/public/guides/3/3_29/3.jpg new file mode 100644 index 00000000..aaa4d9e4 Binary files /dev/null and b/public/guides/3/3_29/3.jpg differ diff --git a/public/guides/3/3_29/4.jpg b/public/guides/3/3_29/4.jpg new file mode 100644 index 00000000..e596cffe Binary files /dev/null and b/public/guides/3/3_29/4.jpg differ diff --git a/public/guides/3/3_29/5.jpg b/public/guides/3/3_29/5.jpg new file mode 100644 index 00000000..a5c73d49 Binary files /dev/null and b/public/guides/3/3_29/5.jpg differ diff --git a/public/guides/3/3_30/1.jpg b/public/guides/3/3_30/1.jpg new file mode 100644 index 00000000..910fae96 Binary files /dev/null and b/public/guides/3/3_30/1.jpg differ diff --git a/public/guides/3/3_30/2.jpg b/public/guides/3/3_30/2.jpg new file mode 100644 index 00000000..9063228d Binary files /dev/null and b/public/guides/3/3_30/2.jpg differ diff --git a/public/guides/3/3_30/3.jpg b/public/guides/3/3_30/3.jpg new file mode 100644 index 00000000..0636c518 Binary files /dev/null and b/public/guides/3/3_30/3.jpg differ diff --git a/public/guides/3/3_30/4.jpg b/public/guides/3/3_30/4.jpg new file mode 100644 index 00000000..0a391f44 Binary files /dev/null and b/public/guides/3/3_30/4.jpg differ diff --git a/public/guides/3/3_30/5.jpg b/public/guides/3/3_30/5.jpg new file mode 100644 index 00000000..95306b94 Binary files /dev/null and b/public/guides/3/3_30/5.jpg differ diff --git a/public/guides/3/3_31/1.jpg b/public/guides/3/3_31/1.jpg new file mode 100644 index 00000000..9c3b3ed0 Binary files /dev/null and b/public/guides/3/3_31/1.jpg differ diff --git a/public/guides/3/3_31/2.jpg b/public/guides/3/3_31/2.jpg new file mode 100644 index 00000000..7aadd7dc Binary files /dev/null and b/public/guides/3/3_31/2.jpg differ diff --git a/public/guides/3/3_31/3.jpg b/public/guides/3/3_31/3.jpg new file mode 100644 index 00000000..1b9652f9 Binary files /dev/null and b/public/guides/3/3_31/3.jpg differ diff --git a/public/guides/3/3_31/4.jpg b/public/guides/3/3_31/4.jpg new file mode 100644 index 00000000..617ca9f4 Binary files /dev/null and b/public/guides/3/3_31/4.jpg differ diff --git a/public/guides/3/3_31/5.jpg b/public/guides/3/3_31/5.jpg new file mode 100644 index 00000000..46a62772 Binary files /dev/null and b/public/guides/3/3_31/5.jpg differ diff --git "a/public/guides/3/3_WOMAN style_\354\227\254\354\204\261 \354\212\244\355\203\200\354\235\274 \354\235\270\354\213\235\352\270\260.jpg" "b/public/guides/3/3_WOMAN style_\354\227\254\354\204\261 \354\212\244\355\203\200\354\235\274 \354\235\270\354\213\235\352\270\260.jpg" new file mode 100644 index 00000000..8890e5bd Binary files /dev/null and "b/public/guides/3/3_WOMAN style_\354\227\254\354\204\261 \354\212\244\355\203\200\354\235\274 \354\235\270\354\213\235\352\270\260.jpg" differ diff --git a/public/guides/4/4_1/1.jpg b/public/guides/4/4_1/1.jpg new file mode 100644 index 00000000..fd9483e5 Binary files /dev/null and b/public/guides/4/4_1/1.jpg differ diff --git a/public/guides/4/4_1/2.jpg b/public/guides/4/4_1/2.jpg new file mode 100644 index 00000000..fccece6d Binary files /dev/null and b/public/guides/4/4_1/2.jpg differ diff --git a/public/guides/4/4_1/3.jpg b/public/guides/4/4_1/3.jpg new file mode 100644 index 00000000..4cd6f117 Binary files /dev/null and b/public/guides/4/4_1/3.jpg differ diff --git a/public/guides/4/4_1/4.jpg b/public/guides/4/4_1/4.jpg new file mode 100644 index 00000000..b0ece44a Binary files /dev/null and b/public/guides/4/4_1/4.jpg differ diff --git a/public/guides/4/4_1/5.jpg b/public/guides/4/4_1/5.jpg new file mode 100644 index 00000000..fec9ea6e Binary files /dev/null and b/public/guides/4/4_1/5.jpg differ diff --git a/public/guides/4/4_10/1.jpg b/public/guides/4/4_10/1.jpg new file mode 100644 index 00000000..856a0e69 Binary files /dev/null and b/public/guides/4/4_10/1.jpg differ diff --git a/public/guides/4/4_10/2.jpg b/public/guides/4/4_10/2.jpg new file mode 100644 index 00000000..127f883f Binary files /dev/null and b/public/guides/4/4_10/2.jpg differ diff --git a/public/guides/4/4_10/3.jpg b/public/guides/4/4_10/3.jpg new file mode 100644 index 00000000..1c94f489 Binary files /dev/null and b/public/guides/4/4_10/3.jpg differ diff --git a/public/guides/4/4_10/4.jpg b/public/guides/4/4_10/4.jpg new file mode 100644 index 00000000..bf894981 Binary files /dev/null and b/public/guides/4/4_10/4.jpg differ diff --git a/public/guides/4/4_10/5.jpg b/public/guides/4/4_10/5.jpg new file mode 100644 index 00000000..04b388ab Binary files /dev/null and b/public/guides/4/4_10/5.jpg differ diff --git a/public/guides/4/4_11/1.jpg b/public/guides/4/4_11/1.jpg new file mode 100644 index 00000000..a75d2df8 Binary files /dev/null and b/public/guides/4/4_11/1.jpg differ diff --git a/public/guides/4/4_11/2.jpg b/public/guides/4/4_11/2.jpg new file mode 100644 index 00000000..e3e1cfd0 Binary files /dev/null and b/public/guides/4/4_11/2.jpg differ diff --git a/public/guides/4/4_11/3.jpg b/public/guides/4/4_11/3.jpg new file mode 100644 index 00000000..3b3ddf64 Binary files /dev/null and b/public/guides/4/4_11/3.jpg differ diff --git a/public/guides/4/4_11/4.jpg b/public/guides/4/4_11/4.jpg new file mode 100644 index 00000000..0ddd6c81 Binary files /dev/null and b/public/guides/4/4_11/4.jpg differ diff --git a/public/guides/4/4_11/5.jpg b/public/guides/4/4_11/5.jpg new file mode 100644 index 00000000..e9e8deed Binary files /dev/null and b/public/guides/4/4_11/5.jpg differ diff --git a/public/guides/4/4_12/1.jpg b/public/guides/4/4_12/1.jpg new file mode 100644 index 00000000..1976eb9c Binary files /dev/null and b/public/guides/4/4_12/1.jpg differ diff --git a/public/guides/4/4_12/2.jpg b/public/guides/4/4_12/2.jpg new file mode 100644 index 00000000..4e12396d Binary files /dev/null and b/public/guides/4/4_12/2.jpg differ diff --git a/public/guides/4/4_12/3.jpg b/public/guides/4/4_12/3.jpg new file mode 100644 index 00000000..37be1667 Binary files /dev/null and b/public/guides/4/4_12/3.jpg differ diff --git a/public/guides/4/4_12/4.jpg b/public/guides/4/4_12/4.jpg new file mode 100644 index 00000000..baf0493a Binary files /dev/null and b/public/guides/4/4_12/4.jpg differ diff --git a/public/guides/4/4_12/5.jpg b/public/guides/4/4_12/5.jpg new file mode 100644 index 00000000..c44a9ddb Binary files /dev/null and b/public/guides/4/4_12/5.jpg differ diff --git a/public/guides/4/4_2/1.jpg b/public/guides/4/4_2/1.jpg new file mode 100644 index 00000000..76bd96c0 Binary files /dev/null and b/public/guides/4/4_2/1.jpg differ diff --git a/public/guides/4/4_2/2.jpg b/public/guides/4/4_2/2.jpg new file mode 100644 index 00000000..29276655 Binary files /dev/null and b/public/guides/4/4_2/2.jpg differ diff --git a/public/guides/4/4_2/3.jpg b/public/guides/4/4_2/3.jpg new file mode 100644 index 00000000..beca7869 Binary files /dev/null and b/public/guides/4/4_2/3.jpg differ diff --git a/public/guides/4/4_2/4.jpg b/public/guides/4/4_2/4.jpg new file mode 100644 index 00000000..4eb6d51b Binary files /dev/null and b/public/guides/4/4_2/4.jpg differ diff --git a/public/guides/4/4_2/5.jpg b/public/guides/4/4_2/5.jpg new file mode 100644 index 00000000..d7b8b320 Binary files /dev/null and b/public/guides/4/4_2/5.jpg differ diff --git a/public/guides/4/4_3/1.jpg b/public/guides/4/4_3/1.jpg new file mode 100644 index 00000000..25621724 Binary files /dev/null and b/public/guides/4/4_3/1.jpg differ diff --git a/public/guides/4/4_3/2.jpg b/public/guides/4/4_3/2.jpg new file mode 100644 index 00000000..33587e07 Binary files /dev/null and b/public/guides/4/4_3/2.jpg differ diff --git a/public/guides/4/4_3/3.jpg b/public/guides/4/4_3/3.jpg new file mode 100644 index 00000000..f87f3c0c Binary files /dev/null and b/public/guides/4/4_3/3.jpg differ diff --git a/public/guides/4/4_3/4.jpg b/public/guides/4/4_3/4.jpg new file mode 100644 index 00000000..cdb2d1ce Binary files /dev/null and b/public/guides/4/4_3/4.jpg differ diff --git a/public/guides/4/4_3/5.jpg b/public/guides/4/4_3/5.jpg new file mode 100644 index 00000000..ea06a148 Binary files /dev/null and b/public/guides/4/4_3/5.jpg differ diff --git a/public/guides/4/4_4/1.jpg b/public/guides/4/4_4/1.jpg new file mode 100644 index 00000000..f27b045d Binary files /dev/null and b/public/guides/4/4_4/1.jpg differ diff --git a/public/guides/4/4_4/2.jpg b/public/guides/4/4_4/2.jpg new file mode 100644 index 00000000..f29364a2 Binary files /dev/null and b/public/guides/4/4_4/2.jpg differ diff --git a/public/guides/4/4_4/3.jpg b/public/guides/4/4_4/3.jpg new file mode 100644 index 00000000..db6d4c04 Binary files /dev/null and b/public/guides/4/4_4/3.jpg differ diff --git a/public/guides/4/4_4/4.jpg b/public/guides/4/4_4/4.jpg new file mode 100644 index 00000000..55b6688f Binary files /dev/null and b/public/guides/4/4_4/4.jpg differ diff --git a/public/guides/4/4_4/5.jpg b/public/guides/4/4_4/5.jpg new file mode 100644 index 00000000..4459f3b9 Binary files /dev/null and b/public/guides/4/4_4/5.jpg differ diff --git a/public/guides/4/4_5/1.jpg b/public/guides/4/4_5/1.jpg new file mode 100644 index 00000000..2122e092 Binary files /dev/null and b/public/guides/4/4_5/1.jpg differ diff --git a/public/guides/4/4_5/2.jpg b/public/guides/4/4_5/2.jpg new file mode 100644 index 00000000..c71f2c08 Binary files /dev/null and b/public/guides/4/4_5/2.jpg differ diff --git a/public/guides/4/4_5/3.jpg b/public/guides/4/4_5/3.jpg new file mode 100644 index 00000000..5676f62d Binary files /dev/null and b/public/guides/4/4_5/3.jpg differ diff --git a/public/guides/4/4_5/4.jpg b/public/guides/4/4_5/4.jpg new file mode 100644 index 00000000..f2386b1d Binary files /dev/null and b/public/guides/4/4_5/4.jpg differ diff --git a/public/guides/4/4_5/5.jpg b/public/guides/4/4_5/5.jpg new file mode 100644 index 00000000..0e74ecee Binary files /dev/null and b/public/guides/4/4_5/5.jpg differ diff --git a/public/guides/4/4_6/1.jpg b/public/guides/4/4_6/1.jpg new file mode 100644 index 00000000..5a12a257 Binary files /dev/null and b/public/guides/4/4_6/1.jpg differ diff --git a/public/guides/4/4_6/2.jpg b/public/guides/4/4_6/2.jpg new file mode 100644 index 00000000..775c0888 Binary files /dev/null and b/public/guides/4/4_6/2.jpg differ diff --git a/public/guides/4/4_6/3.jpg b/public/guides/4/4_6/3.jpg new file mode 100644 index 00000000..bf650809 Binary files /dev/null and b/public/guides/4/4_6/3.jpg differ diff --git a/public/guides/4/4_6/4.jpg b/public/guides/4/4_6/4.jpg new file mode 100644 index 00000000..5e34d7f7 Binary files /dev/null and b/public/guides/4/4_6/4.jpg differ diff --git a/public/guides/4/4_6/5.jpg b/public/guides/4/4_6/5.jpg new file mode 100644 index 00000000..1e93112d Binary files /dev/null and b/public/guides/4/4_6/5.jpg differ diff --git a/public/guides/4/4_7/1.jpg b/public/guides/4/4_7/1.jpg new file mode 100644 index 00000000..4878e3ef Binary files /dev/null and b/public/guides/4/4_7/1.jpg differ diff --git a/public/guides/4/4_7/2.jpg b/public/guides/4/4_7/2.jpg new file mode 100644 index 00000000..0bad6811 Binary files /dev/null and b/public/guides/4/4_7/2.jpg differ diff --git a/public/guides/4/4_7/3.jpg b/public/guides/4/4_7/3.jpg new file mode 100644 index 00000000..6253d806 Binary files /dev/null and b/public/guides/4/4_7/3.jpg differ diff --git a/public/guides/4/4_7/4.jpg b/public/guides/4/4_7/4.jpg new file mode 100644 index 00000000..d736fa51 Binary files /dev/null and b/public/guides/4/4_7/4.jpg differ diff --git a/public/guides/4/4_7/5.jpg b/public/guides/4/4_7/5.jpg new file mode 100644 index 00000000..64c91398 Binary files /dev/null and b/public/guides/4/4_7/5.jpg differ diff --git a/public/guides/4/4_8/1.jpg b/public/guides/4/4_8/1.jpg new file mode 100644 index 00000000..71f54b63 Binary files /dev/null and b/public/guides/4/4_8/1.jpg differ diff --git a/public/guides/4/4_8/2.jpg b/public/guides/4/4_8/2.jpg new file mode 100644 index 00000000..6bced008 Binary files /dev/null and b/public/guides/4/4_8/2.jpg differ diff --git a/public/guides/4/4_8/3.jpg b/public/guides/4/4_8/3.jpg new file mode 100644 index 00000000..edba75c4 Binary files /dev/null and b/public/guides/4/4_8/3.jpg differ diff --git a/public/guides/4/4_8/4.jpg b/public/guides/4/4_8/4.jpg new file mode 100644 index 00000000..c416f56c Binary files /dev/null and b/public/guides/4/4_8/4.jpg differ diff --git a/public/guides/4/4_8/5.jpg b/public/guides/4/4_8/5.jpg new file mode 100644 index 00000000..eb5b26d8 Binary files /dev/null and b/public/guides/4/4_8/5.jpg differ diff --git a/public/guides/4/4_9/1.jpg b/public/guides/4/4_9/1.jpg new file mode 100644 index 00000000..9576c458 Binary files /dev/null and b/public/guides/4/4_9/1.jpg differ diff --git a/public/guides/4/4_9/2.jpg b/public/guides/4/4_9/2.jpg new file mode 100644 index 00000000..9e708ee1 Binary files /dev/null and b/public/guides/4/4_9/2.jpg differ diff --git a/public/guides/4/4_9/3.jpg b/public/guides/4/4_9/3.jpg new file mode 100644 index 00000000..68b38b2d Binary files /dev/null and b/public/guides/4/4_9/3.jpg differ diff --git a/public/guides/4/4_9/4.jpg b/public/guides/4/4_9/4.jpg new file mode 100644 index 00000000..75fe547b Binary files /dev/null and b/public/guides/4/4_9/4.jpg differ diff --git a/public/guides/4/4_9/5.jpg b/public/guides/4/4_9/5.jpg new file mode 100644 index 00000000..d2c6095c Binary files /dev/null and b/public/guides/4/4_9/5.jpg differ diff --git "a/public/guides/4/4_ITEM_TOP category_\355\222\210\353\252\251 \354\271\264\355\205\214\352\263\240\353\246\254.jpg" "b/public/guides/4/4_ITEM_TOP category_\355\222\210\353\252\251 \354\271\264\355\205\214\352\263\240\353\246\254.jpg" new file mode 100644 index 00000000..14712d77 Binary files /dev/null and "b/public/guides/4/4_ITEM_TOP category_\355\222\210\353\252\251 \354\271\264\355\205\214\352\263\240\353\246\254.jpg" differ diff --git a/public/guides/5/5_1/1.JPG b/public/guides/5/5_1/1.JPG new file mode 100644 index 00000000..b9523fff Binary files /dev/null and b/public/guides/5/5_1/1.JPG differ diff --git a/public/guides/5/5_1/1.jpg b/public/guides/5/5_1/1.jpg new file mode 100644 index 00000000..b9523fff Binary files /dev/null and b/public/guides/5/5_1/1.jpg differ diff --git a/public/guides/5/5_1/2.jpg b/public/guides/5/5_1/2.jpg new file mode 100644 index 00000000..21e189c7 Binary files /dev/null and b/public/guides/5/5_1/2.jpg differ diff --git a/public/guides/5/5_1/3.jpg b/public/guides/5/5_1/3.jpg new file mode 100644 index 00000000..ea5471e3 Binary files /dev/null and b/public/guides/5/5_1/3.jpg differ diff --git a/public/guides/5/5_1/4.jpg b/public/guides/5/5_1/4.jpg new file mode 100644 index 00000000..e0314f5c Binary files /dev/null and b/public/guides/5/5_1/4.jpg differ diff --git a/public/guides/5/5_1/5.jpg b/public/guides/5/5_1/5.jpg new file mode 100644 index 00000000..29b7e011 Binary files /dev/null and b/public/guides/5/5_1/5.jpg differ diff --git a/public/guides/5/5_10/1.jpg b/public/guides/5/5_10/1.jpg new file mode 100644 index 00000000..7a5c5480 Binary files /dev/null and b/public/guides/5/5_10/1.jpg differ diff --git a/public/guides/5/5_10/2.jpg b/public/guides/5/5_10/2.jpg new file mode 100644 index 00000000..a9f159a8 Binary files /dev/null and b/public/guides/5/5_10/2.jpg differ diff --git a/public/guides/5/5_10/3.jpg b/public/guides/5/5_10/3.jpg new file mode 100644 index 00000000..b73fbb19 Binary files /dev/null and b/public/guides/5/5_10/3.jpg differ diff --git a/public/guides/5/5_10/4.jpg b/public/guides/5/5_10/4.jpg new file mode 100644 index 00000000..fa38d5d5 Binary files /dev/null and b/public/guides/5/5_10/4.jpg differ diff --git a/public/guides/5/5_10/5.jpg b/public/guides/5/5_10/5.jpg new file mode 100644 index 00000000..49b93446 Binary files /dev/null and b/public/guides/5/5_10/5.jpg differ diff --git a/public/guides/5/5_11/1.jpg b/public/guides/5/5_11/1.jpg new file mode 100644 index 00000000..98207538 Binary files /dev/null and b/public/guides/5/5_11/1.jpg differ diff --git a/public/guides/5/5_11/2.jpg b/public/guides/5/5_11/2.jpg new file mode 100644 index 00000000..dcab1d93 Binary files /dev/null and b/public/guides/5/5_11/2.jpg differ diff --git a/public/guides/5/5_11/3.jpg b/public/guides/5/5_11/3.jpg new file mode 100644 index 00000000..8dbf6f94 Binary files /dev/null and b/public/guides/5/5_11/3.jpg differ diff --git a/public/guides/5/5_11/4.jpg b/public/guides/5/5_11/4.jpg new file mode 100644 index 00000000..e46069e6 Binary files /dev/null and b/public/guides/5/5_11/4.jpg differ diff --git a/public/guides/5/5_11/5.jpg b/public/guides/5/5_11/5.jpg new file mode 100644 index 00000000..3cc50ce6 Binary files /dev/null and b/public/guides/5/5_11/5.jpg differ diff --git a/public/guides/5/5_12/1.JPG b/public/guides/5/5_12/1.JPG new file mode 100644 index 00000000..ab4caf20 Binary files /dev/null and b/public/guides/5/5_12/1.JPG differ diff --git a/public/guides/5/5_12/1.jpg b/public/guides/5/5_12/1.jpg new file mode 100644 index 00000000..ab4caf20 Binary files /dev/null and b/public/guides/5/5_12/1.jpg differ diff --git a/public/guides/5/5_12/2.JPG b/public/guides/5/5_12/2.JPG new file mode 100644 index 00000000..45fcd71d Binary files /dev/null and b/public/guides/5/5_12/2.JPG differ diff --git a/public/guides/5/5_12/2.jpg b/public/guides/5/5_12/2.jpg new file mode 100644 index 00000000..45fcd71d Binary files /dev/null and b/public/guides/5/5_12/2.jpg differ diff --git a/public/guides/5/5_12/3.jpg b/public/guides/5/5_12/3.jpg new file mode 100644 index 00000000..cb407f34 Binary files /dev/null and b/public/guides/5/5_12/3.jpg differ diff --git a/public/guides/5/5_12/4.JPG b/public/guides/5/5_12/4.JPG new file mode 100644 index 00000000..7a34a0f7 Binary files /dev/null and b/public/guides/5/5_12/4.JPG differ diff --git a/public/guides/5/5_12/4.jpg b/public/guides/5/5_12/4.jpg new file mode 100644 index 00000000..7a34a0f7 Binary files /dev/null and b/public/guides/5/5_12/4.jpg differ diff --git a/public/guides/5/5_12/5.jpg b/public/guides/5/5_12/5.jpg new file mode 100644 index 00000000..8a435cb1 Binary files /dev/null and b/public/guides/5/5_12/5.jpg differ diff --git a/public/guides/5/5_13/1.jpg b/public/guides/5/5_13/1.jpg new file mode 100644 index 00000000..7a9485c7 Binary files /dev/null and b/public/guides/5/5_13/1.jpg differ diff --git a/public/guides/5/5_13/2.jpg b/public/guides/5/5_13/2.jpg new file mode 100644 index 00000000..544f419a Binary files /dev/null and b/public/guides/5/5_13/2.jpg differ diff --git a/public/guides/5/5_13/3.jpg b/public/guides/5/5_13/3.jpg new file mode 100644 index 00000000..e407a572 Binary files /dev/null and b/public/guides/5/5_13/3.jpg differ diff --git a/public/guides/5/5_13/4.JPG b/public/guides/5/5_13/4.JPG new file mode 100644 index 00000000..037157eb Binary files /dev/null and b/public/guides/5/5_13/4.JPG differ diff --git a/public/guides/5/5_13/4.jpg b/public/guides/5/5_13/4.jpg new file mode 100644 index 00000000..037157eb Binary files /dev/null and b/public/guides/5/5_13/4.jpg differ diff --git a/public/guides/5/5_13/5.jpg b/public/guides/5/5_13/5.jpg new file mode 100644 index 00000000..5cd544fc Binary files /dev/null and b/public/guides/5/5_13/5.jpg differ diff --git a/public/guides/5/5_14/1.JPG b/public/guides/5/5_14/1.JPG new file mode 100644 index 00000000..eb28ad59 Binary files /dev/null and b/public/guides/5/5_14/1.JPG differ diff --git a/public/guides/5/5_14/1.jpg b/public/guides/5/5_14/1.jpg new file mode 100644 index 00000000..eb28ad59 Binary files /dev/null and b/public/guides/5/5_14/1.jpg differ diff --git a/public/guides/5/5_14/2.JPG b/public/guides/5/5_14/2.JPG new file mode 100644 index 00000000..a95c0508 Binary files /dev/null and b/public/guides/5/5_14/2.JPG differ diff --git a/public/guides/5/5_14/2.jpg b/public/guides/5/5_14/2.jpg new file mode 100644 index 00000000..a95c0508 Binary files /dev/null and b/public/guides/5/5_14/2.jpg differ diff --git a/public/guides/5/5_14/3.JPG b/public/guides/5/5_14/3.JPG new file mode 100644 index 00000000..8ce9e868 Binary files /dev/null and b/public/guides/5/5_14/3.JPG differ diff --git a/public/guides/5/5_14/3.jpg b/public/guides/5/5_14/3.jpg new file mode 100644 index 00000000..8ce9e868 Binary files /dev/null and b/public/guides/5/5_14/3.jpg differ diff --git a/public/guides/5/5_14/4.JPG b/public/guides/5/5_14/4.JPG new file mode 100644 index 00000000..ebfb9e6c Binary files /dev/null and b/public/guides/5/5_14/4.JPG differ diff --git a/public/guides/5/5_14/4.jpg b/public/guides/5/5_14/4.jpg new file mode 100644 index 00000000..ebfb9e6c Binary files /dev/null and b/public/guides/5/5_14/4.jpg differ diff --git a/public/guides/5/5_14/5.JPG b/public/guides/5/5_14/5.JPG new file mode 100644 index 00000000..75dfd793 Binary files /dev/null and b/public/guides/5/5_14/5.JPG differ diff --git a/public/guides/5/5_14/5.jpg b/public/guides/5/5_14/5.jpg new file mode 100644 index 00000000..75dfd793 Binary files /dev/null and b/public/guides/5/5_14/5.jpg differ diff --git a/public/guides/5/5_15/1.JPG b/public/guides/5/5_15/1.JPG new file mode 100644 index 00000000..7f53e4e2 Binary files /dev/null and b/public/guides/5/5_15/1.JPG differ diff --git a/public/guides/5/5_15/1.jpg b/public/guides/5/5_15/1.jpg new file mode 100644 index 00000000..7f53e4e2 Binary files /dev/null and b/public/guides/5/5_15/1.jpg differ diff --git a/public/guides/5/5_15/2.JPG b/public/guides/5/5_15/2.JPG new file mode 100644 index 00000000..6c7e276a Binary files /dev/null and b/public/guides/5/5_15/2.JPG differ diff --git a/public/guides/5/5_15/2.jpg b/public/guides/5/5_15/2.jpg new file mode 100644 index 00000000..6c7e276a Binary files /dev/null and b/public/guides/5/5_15/2.jpg differ diff --git a/public/guides/5/5_15/3.JPG b/public/guides/5/5_15/3.JPG new file mode 100644 index 00000000..ac923cef Binary files /dev/null and b/public/guides/5/5_15/3.JPG differ diff --git a/public/guides/5/5_15/3.jpg b/public/guides/5/5_15/3.jpg new file mode 100644 index 00000000..ac923cef Binary files /dev/null and b/public/guides/5/5_15/3.jpg differ diff --git a/public/guides/5/5_15/4.JPG b/public/guides/5/5_15/4.JPG new file mode 100644 index 00000000..1a93ca9b Binary files /dev/null and b/public/guides/5/5_15/4.JPG differ diff --git a/public/guides/5/5_15/4.jpg b/public/guides/5/5_15/4.jpg new file mode 100644 index 00000000..1a93ca9b Binary files /dev/null and b/public/guides/5/5_15/4.jpg differ diff --git a/public/guides/5/5_15/5.JPG b/public/guides/5/5_15/5.JPG new file mode 100644 index 00000000..0c7e0017 Binary files /dev/null and b/public/guides/5/5_15/5.JPG differ diff --git a/public/guides/5/5_15/5.jpg b/public/guides/5/5_15/5.jpg new file mode 100644 index 00000000..0c7e0017 Binary files /dev/null and b/public/guides/5/5_15/5.jpg differ diff --git a/public/guides/5/5_16/1.JPG b/public/guides/5/5_16/1.JPG new file mode 100644 index 00000000..7090711f Binary files /dev/null and b/public/guides/5/5_16/1.JPG differ diff --git a/public/guides/5/5_16/1.jpg b/public/guides/5/5_16/1.jpg new file mode 100644 index 00000000..7090711f Binary files /dev/null and b/public/guides/5/5_16/1.jpg differ diff --git a/public/guides/5/5_16/2.JPG b/public/guides/5/5_16/2.JPG new file mode 100644 index 00000000..4b14447a Binary files /dev/null and b/public/guides/5/5_16/2.JPG differ diff --git a/public/guides/5/5_16/2.jpg b/public/guides/5/5_16/2.jpg new file mode 100644 index 00000000..4b14447a Binary files /dev/null and b/public/guides/5/5_16/2.jpg differ diff --git a/public/guides/5/5_16/3.JPG b/public/guides/5/5_16/3.JPG new file mode 100644 index 00000000..7d36a36b Binary files /dev/null and b/public/guides/5/5_16/3.JPG differ diff --git a/public/guides/5/5_16/3.jpg b/public/guides/5/5_16/3.jpg new file mode 100644 index 00000000..7d36a36b Binary files /dev/null and b/public/guides/5/5_16/3.jpg differ diff --git a/public/guides/5/5_16/4.JPG b/public/guides/5/5_16/4.JPG new file mode 100644 index 00000000..255ad8fb Binary files /dev/null and b/public/guides/5/5_16/4.JPG differ diff --git a/public/guides/5/5_16/4.jpg b/public/guides/5/5_16/4.jpg new file mode 100644 index 00000000..255ad8fb Binary files /dev/null and b/public/guides/5/5_16/4.jpg differ diff --git a/public/guides/5/5_16/5.JPG b/public/guides/5/5_16/5.JPG new file mode 100644 index 00000000..04235a1c Binary files /dev/null and b/public/guides/5/5_16/5.JPG differ diff --git a/public/guides/5/5_16/5.jpg b/public/guides/5/5_16/5.jpg new file mode 100644 index 00000000..04235a1c Binary files /dev/null and b/public/guides/5/5_16/5.jpg differ diff --git a/public/guides/5/5_17/1.JPG b/public/guides/5/5_17/1.JPG new file mode 100644 index 00000000..20f9f6b3 Binary files /dev/null and b/public/guides/5/5_17/1.JPG differ diff --git a/public/guides/5/5_17/1.jpg b/public/guides/5/5_17/1.jpg new file mode 100644 index 00000000..20f9f6b3 Binary files /dev/null and b/public/guides/5/5_17/1.jpg differ diff --git a/public/guides/5/5_17/2.jpg b/public/guides/5/5_17/2.jpg new file mode 100644 index 00000000..98b89b29 Binary files /dev/null and b/public/guides/5/5_17/2.jpg differ diff --git a/public/guides/5/5_17/3.jpg b/public/guides/5/5_17/3.jpg new file mode 100644 index 00000000..1bff48e0 Binary files /dev/null and b/public/guides/5/5_17/3.jpg differ diff --git a/public/guides/5/5_17/4.JPG b/public/guides/5/5_17/4.JPG new file mode 100644 index 00000000..73e3367f Binary files /dev/null and b/public/guides/5/5_17/4.JPG differ diff --git a/public/guides/5/5_17/4.jpg b/public/guides/5/5_17/4.jpg new file mode 100644 index 00000000..73e3367f Binary files /dev/null and b/public/guides/5/5_17/4.jpg differ diff --git a/public/guides/5/5_17/5.JPG b/public/guides/5/5_17/5.JPG new file mode 100644 index 00000000..599cdd38 Binary files /dev/null and b/public/guides/5/5_17/5.JPG differ diff --git a/public/guides/5/5_17/5.jpg b/public/guides/5/5_17/5.jpg new file mode 100644 index 00000000..599cdd38 Binary files /dev/null and b/public/guides/5/5_17/5.jpg differ diff --git a/public/guides/5/5_18/1.JPG b/public/guides/5/5_18/1.JPG new file mode 100644 index 00000000..19b42aaa Binary files /dev/null and b/public/guides/5/5_18/1.JPG differ diff --git a/public/guides/5/5_18/1.jpg b/public/guides/5/5_18/1.jpg new file mode 100644 index 00000000..19b42aaa Binary files /dev/null and b/public/guides/5/5_18/1.jpg differ diff --git a/public/guides/5/5_18/2.JPG b/public/guides/5/5_18/2.JPG new file mode 100644 index 00000000..d3b2c099 Binary files /dev/null and b/public/guides/5/5_18/2.JPG differ diff --git a/public/guides/5/5_18/2.jpg b/public/guides/5/5_18/2.jpg new file mode 100644 index 00000000..d3b2c099 Binary files /dev/null and b/public/guides/5/5_18/2.jpg differ diff --git a/public/guides/5/5_18/3.JPG b/public/guides/5/5_18/3.JPG new file mode 100644 index 00000000..133e39a4 Binary files /dev/null and b/public/guides/5/5_18/3.JPG differ diff --git a/public/guides/5/5_18/3.jpg b/public/guides/5/5_18/3.jpg new file mode 100644 index 00000000..133e39a4 Binary files /dev/null and b/public/guides/5/5_18/3.jpg differ diff --git a/public/guides/5/5_18/4.JPG b/public/guides/5/5_18/4.JPG new file mode 100644 index 00000000..2fef7828 Binary files /dev/null and b/public/guides/5/5_18/4.JPG differ diff --git a/public/guides/5/5_18/4.jpg b/public/guides/5/5_18/4.jpg new file mode 100644 index 00000000..2fef7828 Binary files /dev/null and b/public/guides/5/5_18/4.jpg differ diff --git a/public/guides/5/5_18/5.JPG b/public/guides/5/5_18/5.JPG new file mode 100644 index 00000000..d272176d Binary files /dev/null and b/public/guides/5/5_18/5.JPG differ diff --git a/public/guides/5/5_18/5.jpg b/public/guides/5/5_18/5.jpg new file mode 100644 index 00000000..d272176d Binary files /dev/null and b/public/guides/5/5_18/5.jpg differ diff --git a/public/guides/5/5_19/1.jpg b/public/guides/5/5_19/1.jpg new file mode 100644 index 00000000..02d9a3e0 Binary files /dev/null and b/public/guides/5/5_19/1.jpg differ diff --git a/public/guides/5/5_19/2.jpg b/public/guides/5/5_19/2.jpg new file mode 100644 index 00000000..95994dd8 Binary files /dev/null and b/public/guides/5/5_19/2.jpg differ diff --git a/public/guides/5/5_19/3.JPG b/public/guides/5/5_19/3.JPG new file mode 100644 index 00000000..38a5cb1b Binary files /dev/null and b/public/guides/5/5_19/3.JPG differ diff --git a/public/guides/5/5_19/3.jpg b/public/guides/5/5_19/3.jpg new file mode 100644 index 00000000..38a5cb1b Binary files /dev/null and b/public/guides/5/5_19/3.jpg differ diff --git a/public/guides/5/5_19/4.JPG b/public/guides/5/5_19/4.JPG new file mode 100644 index 00000000..93b24e70 Binary files /dev/null and b/public/guides/5/5_19/4.JPG differ diff --git a/public/guides/5/5_19/4.jpg b/public/guides/5/5_19/4.jpg new file mode 100644 index 00000000..93b24e70 Binary files /dev/null and b/public/guides/5/5_19/4.jpg differ diff --git a/public/guides/5/5_19/5.JPG b/public/guides/5/5_19/5.JPG new file mode 100644 index 00000000..8a66a7f7 Binary files /dev/null and b/public/guides/5/5_19/5.JPG differ diff --git a/public/guides/5/5_19/5.jpg b/public/guides/5/5_19/5.jpg new file mode 100644 index 00000000..8a66a7f7 Binary files /dev/null and b/public/guides/5/5_19/5.jpg differ diff --git a/public/guides/5/5_2/1.jpg b/public/guides/5/5_2/1.jpg new file mode 100644 index 00000000..e2d353d8 Binary files /dev/null and b/public/guides/5/5_2/1.jpg differ diff --git a/public/guides/5/5_2/2.jpg b/public/guides/5/5_2/2.jpg new file mode 100644 index 00000000..707f50ee Binary files /dev/null and b/public/guides/5/5_2/2.jpg differ diff --git a/public/guides/5/5_2/3.jpg b/public/guides/5/5_2/3.jpg new file mode 100644 index 00000000..1c7df70a Binary files /dev/null and b/public/guides/5/5_2/3.jpg differ diff --git a/public/guides/5/5_2/4.jpg b/public/guides/5/5_2/4.jpg new file mode 100644 index 00000000..70c122aa Binary files /dev/null and b/public/guides/5/5_2/4.jpg differ diff --git a/public/guides/5/5_2/5.jpg b/public/guides/5/5_2/5.jpg new file mode 100644 index 00000000..9a5dd9f7 Binary files /dev/null and b/public/guides/5/5_2/5.jpg differ diff --git a/public/guides/5/5_20/1.jpg b/public/guides/5/5_20/1.jpg new file mode 100644 index 00000000..06b01b74 Binary files /dev/null and b/public/guides/5/5_20/1.jpg differ diff --git a/public/guides/5/5_20/2.jpg b/public/guides/5/5_20/2.jpg new file mode 100644 index 00000000..bcf17c79 Binary files /dev/null and b/public/guides/5/5_20/2.jpg differ diff --git a/public/guides/5/5_20/3.JPG b/public/guides/5/5_20/3.JPG new file mode 100644 index 00000000..2e92c470 Binary files /dev/null and b/public/guides/5/5_20/3.JPG differ diff --git a/public/guides/5/5_20/3.jpg b/public/guides/5/5_20/3.jpg new file mode 100644 index 00000000..2e92c470 Binary files /dev/null and b/public/guides/5/5_20/3.jpg differ diff --git a/public/guides/5/5_20/4.JPG b/public/guides/5/5_20/4.JPG new file mode 100644 index 00000000..323c93b1 Binary files /dev/null and b/public/guides/5/5_20/4.JPG differ diff --git a/public/guides/5/5_20/4.jpg b/public/guides/5/5_20/4.jpg new file mode 100644 index 00000000..323c93b1 Binary files /dev/null and b/public/guides/5/5_20/4.jpg differ diff --git a/public/guides/5/5_20/5.JPG b/public/guides/5/5_20/5.JPG new file mode 100644 index 00000000..214bace9 Binary files /dev/null and b/public/guides/5/5_20/5.JPG differ diff --git a/public/guides/5/5_20/5.jpg b/public/guides/5/5_20/5.jpg new file mode 100644 index 00000000..214bace9 Binary files /dev/null and b/public/guides/5/5_20/5.jpg differ diff --git a/public/guides/5/5_21/1.JPG b/public/guides/5/5_21/1.JPG new file mode 100644 index 00000000..01cb58f2 Binary files /dev/null and b/public/guides/5/5_21/1.JPG differ diff --git a/public/guides/5/5_21/1.jpg b/public/guides/5/5_21/1.jpg new file mode 100644 index 00000000..01cb58f2 Binary files /dev/null and b/public/guides/5/5_21/1.jpg differ diff --git a/public/guides/5/5_21/2.JPG b/public/guides/5/5_21/2.JPG new file mode 100644 index 00000000..3d437bb0 Binary files /dev/null and b/public/guides/5/5_21/2.JPG differ diff --git a/public/guides/5/5_21/2.jpg b/public/guides/5/5_21/2.jpg new file mode 100644 index 00000000..3d437bb0 Binary files /dev/null and b/public/guides/5/5_21/2.jpg differ diff --git a/public/guides/5/5_21/3.JPG b/public/guides/5/5_21/3.JPG new file mode 100644 index 00000000..cc792cff Binary files /dev/null and b/public/guides/5/5_21/3.JPG differ diff --git a/public/guides/5/5_21/3.jpg b/public/guides/5/5_21/3.jpg new file mode 100644 index 00000000..cc792cff Binary files /dev/null and b/public/guides/5/5_21/3.jpg differ diff --git a/public/guides/5/5_21/4.JPG b/public/guides/5/5_21/4.JPG new file mode 100644 index 00000000..7768e462 Binary files /dev/null and b/public/guides/5/5_21/4.JPG differ diff --git a/public/guides/5/5_21/4.jpg b/public/guides/5/5_21/4.jpg new file mode 100644 index 00000000..7768e462 Binary files /dev/null and b/public/guides/5/5_21/4.jpg differ diff --git a/public/guides/5/5_21/5.JPG b/public/guides/5/5_21/5.JPG new file mode 100644 index 00000000..1358adde Binary files /dev/null and b/public/guides/5/5_21/5.JPG differ diff --git a/public/guides/5/5_21/5.jpg b/public/guides/5/5_21/5.jpg new file mode 100644 index 00000000..1358adde Binary files /dev/null and b/public/guides/5/5_21/5.jpg differ diff --git a/public/guides/5/5_22/1.JPG b/public/guides/5/5_22/1.JPG new file mode 100644 index 00000000..bd77bf13 Binary files /dev/null and b/public/guides/5/5_22/1.JPG differ diff --git a/public/guides/5/5_22/1.jpg b/public/guides/5/5_22/1.jpg new file mode 100644 index 00000000..bd77bf13 Binary files /dev/null and b/public/guides/5/5_22/1.jpg differ diff --git a/public/guides/5/5_22/2.JPG b/public/guides/5/5_22/2.JPG new file mode 100644 index 00000000..793ad369 Binary files /dev/null and b/public/guides/5/5_22/2.JPG differ diff --git a/public/guides/5/5_22/2.jpg b/public/guides/5/5_22/2.jpg new file mode 100644 index 00000000..793ad369 Binary files /dev/null and b/public/guides/5/5_22/2.jpg differ diff --git a/public/guides/5/5_22/3.JPG b/public/guides/5/5_22/3.JPG new file mode 100644 index 00000000..ae017aa9 Binary files /dev/null and b/public/guides/5/5_22/3.JPG differ diff --git a/public/guides/5/5_22/3.jpg b/public/guides/5/5_22/3.jpg new file mode 100644 index 00000000..ae017aa9 Binary files /dev/null and b/public/guides/5/5_22/3.jpg differ diff --git a/public/guides/5/5_22/4.JPG b/public/guides/5/5_22/4.JPG new file mode 100644 index 00000000..ce7a3084 Binary files /dev/null and b/public/guides/5/5_22/4.JPG differ diff --git a/public/guides/5/5_22/4.jpg b/public/guides/5/5_22/4.jpg new file mode 100644 index 00000000..ce7a3084 Binary files /dev/null and b/public/guides/5/5_22/4.jpg differ diff --git a/public/guides/5/5_22/5.JPG b/public/guides/5/5_22/5.JPG new file mode 100644 index 00000000..5dee3ea5 Binary files /dev/null and b/public/guides/5/5_22/5.JPG differ diff --git a/public/guides/5/5_22/5.jpg b/public/guides/5/5_22/5.jpg new file mode 100644 index 00000000..5dee3ea5 Binary files /dev/null and b/public/guides/5/5_22/5.jpg differ diff --git a/public/guides/5/5_23/1.JPG b/public/guides/5/5_23/1.JPG new file mode 100644 index 00000000..156fd411 Binary files /dev/null and b/public/guides/5/5_23/1.JPG differ diff --git a/public/guides/5/5_23/1.jpg b/public/guides/5/5_23/1.jpg new file mode 100644 index 00000000..156fd411 Binary files /dev/null and b/public/guides/5/5_23/1.jpg differ diff --git a/public/guides/5/5_23/2.JPG b/public/guides/5/5_23/2.JPG new file mode 100644 index 00000000..9822c2ad Binary files /dev/null and b/public/guides/5/5_23/2.JPG differ diff --git a/public/guides/5/5_23/2.jpg b/public/guides/5/5_23/2.jpg new file mode 100644 index 00000000..9822c2ad Binary files /dev/null and b/public/guides/5/5_23/2.jpg differ diff --git a/public/guides/5/5_23/3.JPG b/public/guides/5/5_23/3.JPG new file mode 100644 index 00000000..57bd7ae9 Binary files /dev/null and b/public/guides/5/5_23/3.JPG differ diff --git a/public/guides/5/5_23/3.jpg b/public/guides/5/5_23/3.jpg new file mode 100644 index 00000000..57bd7ae9 Binary files /dev/null and b/public/guides/5/5_23/3.jpg differ diff --git a/public/guides/5/5_23/4.JPG b/public/guides/5/5_23/4.JPG new file mode 100644 index 00000000..2f667f6c Binary files /dev/null and b/public/guides/5/5_23/4.JPG differ diff --git a/public/guides/5/5_23/4.jpg b/public/guides/5/5_23/4.jpg new file mode 100644 index 00000000..2f667f6c Binary files /dev/null and b/public/guides/5/5_23/4.jpg differ diff --git a/public/guides/5/5_23/5.JPG b/public/guides/5/5_23/5.JPG new file mode 100644 index 00000000..dca0b7b4 Binary files /dev/null and b/public/guides/5/5_23/5.JPG differ diff --git a/public/guides/5/5_23/5.jpg b/public/guides/5/5_23/5.jpg new file mode 100644 index 00000000..dca0b7b4 Binary files /dev/null and b/public/guides/5/5_23/5.jpg differ diff --git a/public/guides/5/5_24/1.JPG b/public/guides/5/5_24/1.JPG new file mode 100644 index 00000000..640d70b3 Binary files /dev/null and b/public/guides/5/5_24/1.JPG differ diff --git a/public/guides/5/5_24/1.jpg b/public/guides/5/5_24/1.jpg new file mode 100644 index 00000000..640d70b3 Binary files /dev/null and b/public/guides/5/5_24/1.jpg differ diff --git a/public/guides/5/5_24/2.JPG b/public/guides/5/5_24/2.JPG new file mode 100644 index 00000000..7a95d9ca Binary files /dev/null and b/public/guides/5/5_24/2.JPG differ diff --git a/public/guides/5/5_24/2.jpg b/public/guides/5/5_24/2.jpg new file mode 100644 index 00000000..7a95d9ca Binary files /dev/null and b/public/guides/5/5_24/2.jpg differ diff --git a/public/guides/5/5_24/3.JPG b/public/guides/5/5_24/3.JPG new file mode 100644 index 00000000..b00918bb Binary files /dev/null and b/public/guides/5/5_24/3.JPG differ diff --git a/public/guides/5/5_24/3.jpg b/public/guides/5/5_24/3.jpg new file mode 100644 index 00000000..b00918bb Binary files /dev/null and b/public/guides/5/5_24/3.jpg differ diff --git a/public/guides/5/5_24/4.JPG b/public/guides/5/5_24/4.JPG new file mode 100644 index 00000000..72a89320 Binary files /dev/null and b/public/guides/5/5_24/4.JPG differ diff --git a/public/guides/5/5_24/4.jpg b/public/guides/5/5_24/4.jpg new file mode 100644 index 00000000..72a89320 Binary files /dev/null and b/public/guides/5/5_24/4.jpg differ diff --git a/public/guides/5/5_24/5.JPG b/public/guides/5/5_24/5.JPG new file mode 100644 index 00000000..7b08d640 Binary files /dev/null and b/public/guides/5/5_24/5.JPG differ diff --git a/public/guides/5/5_24/5.jpg b/public/guides/5/5_24/5.jpg new file mode 100644 index 00000000..7b08d640 Binary files /dev/null and b/public/guides/5/5_24/5.jpg differ diff --git a/public/guides/5/5_25/1.JPG b/public/guides/5/5_25/1.JPG new file mode 100644 index 00000000..0447e177 Binary files /dev/null and b/public/guides/5/5_25/1.JPG differ diff --git a/public/guides/5/5_25/1.jpg b/public/guides/5/5_25/1.jpg new file mode 100644 index 00000000..0447e177 Binary files /dev/null and b/public/guides/5/5_25/1.jpg differ diff --git a/public/guides/5/5_25/2.JPG b/public/guides/5/5_25/2.JPG new file mode 100644 index 00000000..b241024c Binary files /dev/null and b/public/guides/5/5_25/2.JPG differ diff --git a/public/guides/5/5_25/2.jpg b/public/guides/5/5_25/2.jpg new file mode 100644 index 00000000..b241024c Binary files /dev/null and b/public/guides/5/5_25/2.jpg differ diff --git a/public/guides/5/5_25/3.JPG b/public/guides/5/5_25/3.JPG new file mode 100644 index 00000000..71051d25 Binary files /dev/null and b/public/guides/5/5_25/3.JPG differ diff --git a/public/guides/5/5_25/3.jpg b/public/guides/5/5_25/3.jpg new file mode 100644 index 00000000..71051d25 Binary files /dev/null and b/public/guides/5/5_25/3.jpg differ diff --git a/public/guides/5/5_25/4.JPG b/public/guides/5/5_25/4.JPG new file mode 100644 index 00000000..d5117ce3 Binary files /dev/null and b/public/guides/5/5_25/4.JPG differ diff --git a/public/guides/5/5_25/4.jpg b/public/guides/5/5_25/4.jpg new file mode 100644 index 00000000..d5117ce3 Binary files /dev/null and b/public/guides/5/5_25/4.jpg differ diff --git a/public/guides/5/5_25/5.JPG b/public/guides/5/5_25/5.JPG new file mode 100644 index 00000000..42436dfd Binary files /dev/null and b/public/guides/5/5_25/5.JPG differ diff --git a/public/guides/5/5_25/5.jpg b/public/guides/5/5_25/5.jpg new file mode 100644 index 00000000..42436dfd Binary files /dev/null and b/public/guides/5/5_25/5.jpg differ diff --git a/public/guides/5/5_26/1.JPG b/public/guides/5/5_26/1.JPG new file mode 100644 index 00000000..c744228f Binary files /dev/null and b/public/guides/5/5_26/1.JPG differ diff --git a/public/guides/5/5_26/1.jpg b/public/guides/5/5_26/1.jpg new file mode 100644 index 00000000..c744228f Binary files /dev/null and b/public/guides/5/5_26/1.jpg differ diff --git a/public/guides/5/5_26/2.JPG b/public/guides/5/5_26/2.JPG new file mode 100644 index 00000000..6836e1b6 Binary files /dev/null and b/public/guides/5/5_26/2.JPG differ diff --git a/public/guides/5/5_26/2.jpg b/public/guides/5/5_26/2.jpg new file mode 100644 index 00000000..6836e1b6 Binary files /dev/null and b/public/guides/5/5_26/2.jpg differ diff --git a/public/guides/5/5_26/3.JPG b/public/guides/5/5_26/3.JPG new file mode 100644 index 00000000..8fb0b275 Binary files /dev/null and b/public/guides/5/5_26/3.JPG differ diff --git a/public/guides/5/5_26/3.jpg b/public/guides/5/5_26/3.jpg new file mode 100644 index 00000000..8fb0b275 Binary files /dev/null and b/public/guides/5/5_26/3.jpg differ diff --git a/public/guides/5/5_26/4.JPG b/public/guides/5/5_26/4.JPG new file mode 100644 index 00000000..cc86e453 Binary files /dev/null and b/public/guides/5/5_26/4.JPG differ diff --git a/public/guides/5/5_26/4.jpg b/public/guides/5/5_26/4.jpg new file mode 100644 index 00000000..cc86e453 Binary files /dev/null and b/public/guides/5/5_26/4.jpg differ diff --git a/public/guides/5/5_26/5.JPG b/public/guides/5/5_26/5.JPG new file mode 100644 index 00000000..9114f029 Binary files /dev/null and b/public/guides/5/5_26/5.JPG differ diff --git a/public/guides/5/5_26/5.jpg b/public/guides/5/5_26/5.jpg new file mode 100644 index 00000000..9114f029 Binary files /dev/null and b/public/guides/5/5_26/5.jpg differ diff --git a/public/guides/5/5_27/1.JPG b/public/guides/5/5_27/1.JPG new file mode 100644 index 00000000..544b252e Binary files /dev/null and b/public/guides/5/5_27/1.JPG differ diff --git a/public/guides/5/5_27/1.jpg b/public/guides/5/5_27/1.jpg new file mode 100644 index 00000000..544b252e Binary files /dev/null and b/public/guides/5/5_27/1.jpg differ diff --git a/public/guides/5/5_27/2.JPG b/public/guides/5/5_27/2.JPG new file mode 100644 index 00000000..97bbc318 Binary files /dev/null and b/public/guides/5/5_27/2.JPG differ diff --git a/public/guides/5/5_27/2.jpg b/public/guides/5/5_27/2.jpg new file mode 100644 index 00000000..97bbc318 Binary files /dev/null and b/public/guides/5/5_27/2.jpg differ diff --git a/public/guides/5/5_27/3.JPG b/public/guides/5/5_27/3.JPG new file mode 100644 index 00000000..d71703d1 Binary files /dev/null and b/public/guides/5/5_27/3.JPG differ diff --git a/public/guides/5/5_27/3.jpg b/public/guides/5/5_27/3.jpg new file mode 100644 index 00000000..d71703d1 Binary files /dev/null and b/public/guides/5/5_27/3.jpg differ diff --git a/public/guides/5/5_27/4.JPG b/public/guides/5/5_27/4.JPG new file mode 100644 index 00000000..7f498190 Binary files /dev/null and b/public/guides/5/5_27/4.JPG differ diff --git a/public/guides/5/5_27/4.jpg b/public/guides/5/5_27/4.jpg new file mode 100644 index 00000000..7f498190 Binary files /dev/null and b/public/guides/5/5_27/4.jpg differ diff --git a/public/guides/5/5_27/5.JPG b/public/guides/5/5_27/5.JPG new file mode 100644 index 00000000..8649f032 Binary files /dev/null and b/public/guides/5/5_27/5.JPG differ diff --git a/public/guides/5/5_27/5.jpg b/public/guides/5/5_27/5.jpg new file mode 100644 index 00000000..8649f032 Binary files /dev/null and b/public/guides/5/5_27/5.jpg differ diff --git a/public/guides/5/5_28/1.JPG b/public/guides/5/5_28/1.JPG new file mode 100644 index 00000000..0ead47b6 Binary files /dev/null and b/public/guides/5/5_28/1.JPG differ diff --git a/public/guides/5/5_28/1.jpg b/public/guides/5/5_28/1.jpg new file mode 100644 index 00000000..0ead47b6 Binary files /dev/null and b/public/guides/5/5_28/1.jpg differ diff --git a/public/guides/5/5_28/2.JPG b/public/guides/5/5_28/2.JPG new file mode 100644 index 00000000..e3967d16 Binary files /dev/null and b/public/guides/5/5_28/2.JPG differ diff --git a/public/guides/5/5_28/2.jpg b/public/guides/5/5_28/2.jpg new file mode 100644 index 00000000..e3967d16 Binary files /dev/null and b/public/guides/5/5_28/2.jpg differ diff --git a/public/guides/5/5_28/3.JPG b/public/guides/5/5_28/3.JPG new file mode 100644 index 00000000..13871614 Binary files /dev/null and b/public/guides/5/5_28/3.JPG differ diff --git a/public/guides/5/5_28/3.jpg b/public/guides/5/5_28/3.jpg new file mode 100644 index 00000000..13871614 Binary files /dev/null and b/public/guides/5/5_28/3.jpg differ diff --git a/public/guides/5/5_28/4.JPG b/public/guides/5/5_28/4.JPG new file mode 100644 index 00000000..5ea21e7c Binary files /dev/null and b/public/guides/5/5_28/4.JPG differ diff --git a/public/guides/5/5_28/4.jpg b/public/guides/5/5_28/4.jpg new file mode 100644 index 00000000..5ea21e7c Binary files /dev/null and b/public/guides/5/5_28/4.jpg differ diff --git a/public/guides/5/5_28/5.JPG b/public/guides/5/5_28/5.JPG new file mode 100644 index 00000000..f7bd75bc Binary files /dev/null and b/public/guides/5/5_28/5.JPG differ diff --git a/public/guides/5/5_28/5.jpg b/public/guides/5/5_28/5.jpg new file mode 100644 index 00000000..f7bd75bc Binary files /dev/null and b/public/guides/5/5_28/5.jpg differ diff --git a/public/guides/5/5_29/1.JPG b/public/guides/5/5_29/1.JPG new file mode 100644 index 00000000..980b0e70 Binary files /dev/null and b/public/guides/5/5_29/1.JPG differ diff --git a/public/guides/5/5_29/1.jpg b/public/guides/5/5_29/1.jpg new file mode 100644 index 00000000..980b0e70 Binary files /dev/null and b/public/guides/5/5_29/1.jpg differ diff --git a/public/guides/5/5_29/2.JPG b/public/guides/5/5_29/2.JPG new file mode 100644 index 00000000..ebdb0a32 Binary files /dev/null and b/public/guides/5/5_29/2.JPG differ diff --git a/public/guides/5/5_29/2.jpg b/public/guides/5/5_29/2.jpg new file mode 100644 index 00000000..ebdb0a32 Binary files /dev/null and b/public/guides/5/5_29/2.jpg differ diff --git a/public/guides/5/5_29/3.JPG b/public/guides/5/5_29/3.JPG new file mode 100644 index 00000000..63ec4ff4 Binary files /dev/null and b/public/guides/5/5_29/3.JPG differ diff --git a/public/guides/5/5_29/3.jpg b/public/guides/5/5_29/3.jpg new file mode 100644 index 00000000..63ec4ff4 Binary files /dev/null and b/public/guides/5/5_29/3.jpg differ diff --git a/public/guides/5/5_29/4.JPG b/public/guides/5/5_29/4.JPG new file mode 100644 index 00000000..0ccc9404 Binary files /dev/null and b/public/guides/5/5_29/4.JPG differ diff --git a/public/guides/5/5_29/4.jpg b/public/guides/5/5_29/4.jpg new file mode 100644 index 00000000..0ccc9404 Binary files /dev/null and b/public/guides/5/5_29/4.jpg differ diff --git a/public/guides/5/5_29/5.JPG b/public/guides/5/5_29/5.JPG new file mode 100644 index 00000000..8d08bfa6 Binary files /dev/null and b/public/guides/5/5_29/5.JPG differ diff --git a/public/guides/5/5_29/5.jpg b/public/guides/5/5_29/5.jpg new file mode 100644 index 00000000..8d08bfa6 Binary files /dev/null and b/public/guides/5/5_29/5.jpg differ diff --git a/public/guides/5/5_3/1.JPG b/public/guides/5/5_3/1.JPG new file mode 100644 index 00000000..bcf9b10e Binary files /dev/null and b/public/guides/5/5_3/1.JPG differ diff --git a/public/guides/5/5_3/1.jpg b/public/guides/5/5_3/1.jpg new file mode 100644 index 00000000..bcf9b10e Binary files /dev/null and b/public/guides/5/5_3/1.jpg differ diff --git a/public/guides/5/5_3/2.JPG b/public/guides/5/5_3/2.JPG new file mode 100644 index 00000000..b4368946 Binary files /dev/null and b/public/guides/5/5_3/2.JPG differ diff --git a/public/guides/5/5_3/2.jpg b/public/guides/5/5_3/2.jpg new file mode 100644 index 00000000..b4368946 Binary files /dev/null and b/public/guides/5/5_3/2.jpg differ diff --git a/public/guides/5/5_3/3.JPG b/public/guides/5/5_3/3.JPG new file mode 100644 index 00000000..ef510670 Binary files /dev/null and b/public/guides/5/5_3/3.JPG differ diff --git a/public/guides/5/5_3/3.jpg b/public/guides/5/5_3/3.jpg new file mode 100644 index 00000000..ef510670 Binary files /dev/null and b/public/guides/5/5_3/3.jpg differ diff --git a/public/guides/5/5_3/4.jpg b/public/guides/5/5_3/4.jpg new file mode 100644 index 00000000..896f3d2c Binary files /dev/null and b/public/guides/5/5_3/4.jpg differ diff --git a/public/guides/5/5_3/5.jpg b/public/guides/5/5_3/5.jpg new file mode 100644 index 00000000..7285d03e Binary files /dev/null and b/public/guides/5/5_3/5.jpg differ diff --git a/public/guides/5/5_30/1.JPG b/public/guides/5/5_30/1.JPG new file mode 100644 index 00000000..ed16d4a0 Binary files /dev/null and b/public/guides/5/5_30/1.JPG differ diff --git a/public/guides/5/5_30/1.jpg b/public/guides/5/5_30/1.jpg new file mode 100644 index 00000000..ed16d4a0 Binary files /dev/null and b/public/guides/5/5_30/1.jpg differ diff --git a/public/guides/5/5_30/2.JPG b/public/guides/5/5_30/2.JPG new file mode 100644 index 00000000..2ddfd6f7 Binary files /dev/null and b/public/guides/5/5_30/2.JPG differ diff --git a/public/guides/5/5_30/2.jpg b/public/guides/5/5_30/2.jpg new file mode 100644 index 00000000..2ddfd6f7 Binary files /dev/null and b/public/guides/5/5_30/2.jpg differ diff --git a/public/guides/5/5_30/3.JPG b/public/guides/5/5_30/3.JPG new file mode 100644 index 00000000..a78fb2d3 Binary files /dev/null and b/public/guides/5/5_30/3.JPG differ diff --git a/public/guides/5/5_30/3.jpg b/public/guides/5/5_30/3.jpg new file mode 100644 index 00000000..a78fb2d3 Binary files /dev/null and b/public/guides/5/5_30/3.jpg differ diff --git a/public/guides/5/5_30/4.JPG b/public/guides/5/5_30/4.JPG new file mode 100644 index 00000000..c2be9407 Binary files /dev/null and b/public/guides/5/5_30/4.JPG differ diff --git a/public/guides/5/5_30/4.jpg b/public/guides/5/5_30/4.jpg new file mode 100644 index 00000000..c2be9407 Binary files /dev/null and b/public/guides/5/5_30/4.jpg differ diff --git a/public/guides/5/5_30/5.JPG b/public/guides/5/5_30/5.JPG new file mode 100644 index 00000000..fd84e5d3 Binary files /dev/null and b/public/guides/5/5_30/5.JPG differ diff --git a/public/guides/5/5_30/5.jpg b/public/guides/5/5_30/5.jpg new file mode 100644 index 00000000..fd84e5d3 Binary files /dev/null and b/public/guides/5/5_30/5.jpg differ diff --git a/public/guides/5/5_31/1.JPG b/public/guides/5/5_31/1.JPG new file mode 100644 index 00000000..dc7f94b4 Binary files /dev/null and b/public/guides/5/5_31/1.JPG differ diff --git a/public/guides/5/5_31/1.jpg b/public/guides/5/5_31/1.jpg new file mode 100644 index 00000000..dc7f94b4 Binary files /dev/null and b/public/guides/5/5_31/1.jpg differ diff --git a/public/guides/5/5_31/2.JPG b/public/guides/5/5_31/2.JPG new file mode 100644 index 00000000..229a6207 Binary files /dev/null and b/public/guides/5/5_31/2.JPG differ diff --git a/public/guides/5/5_31/2.jpg b/public/guides/5/5_31/2.jpg new file mode 100644 index 00000000..229a6207 Binary files /dev/null and b/public/guides/5/5_31/2.jpg differ diff --git a/public/guides/5/5_31/3.JPG b/public/guides/5/5_31/3.JPG new file mode 100644 index 00000000..b027c681 Binary files /dev/null and b/public/guides/5/5_31/3.JPG differ diff --git a/public/guides/5/5_31/3.jpg b/public/guides/5/5_31/3.jpg new file mode 100644 index 00000000..b027c681 Binary files /dev/null and b/public/guides/5/5_31/3.jpg differ diff --git a/public/guides/5/5_31/4.JPG b/public/guides/5/5_31/4.JPG new file mode 100644 index 00000000..fa01a01b Binary files /dev/null and b/public/guides/5/5_31/4.JPG differ diff --git a/public/guides/5/5_31/4.jpg b/public/guides/5/5_31/4.jpg new file mode 100644 index 00000000..fa01a01b Binary files /dev/null and b/public/guides/5/5_31/4.jpg differ diff --git a/public/guides/5/5_31/5.JPG b/public/guides/5/5_31/5.JPG new file mode 100644 index 00000000..19b31fab Binary files /dev/null and b/public/guides/5/5_31/5.JPG differ diff --git a/public/guides/5/5_31/5.jpg b/public/guides/5/5_31/5.jpg new file mode 100644 index 00000000..19b31fab Binary files /dev/null and b/public/guides/5/5_31/5.jpg differ diff --git a/public/guides/5/5_32/1.JPG b/public/guides/5/5_32/1.JPG new file mode 100644 index 00000000..38474f7b Binary files /dev/null and b/public/guides/5/5_32/1.JPG differ diff --git a/public/guides/5/5_32/1.jpg b/public/guides/5/5_32/1.jpg new file mode 100644 index 00000000..38474f7b Binary files /dev/null and b/public/guides/5/5_32/1.jpg differ diff --git a/public/guides/5/5_32/2.JPG b/public/guides/5/5_32/2.JPG new file mode 100644 index 00000000..ba37b57b Binary files /dev/null and b/public/guides/5/5_32/2.JPG differ diff --git a/public/guides/5/5_32/2.jpg b/public/guides/5/5_32/2.jpg new file mode 100644 index 00000000..ba37b57b Binary files /dev/null and b/public/guides/5/5_32/2.jpg differ diff --git a/public/guides/5/5_32/3.JPG b/public/guides/5/5_32/3.JPG new file mode 100644 index 00000000..1b75a6f8 Binary files /dev/null and b/public/guides/5/5_32/3.JPG differ diff --git a/public/guides/5/5_32/3.jpg b/public/guides/5/5_32/3.jpg new file mode 100644 index 00000000..1b75a6f8 Binary files /dev/null and b/public/guides/5/5_32/3.jpg differ diff --git a/public/guides/5/5_32/4.JPG b/public/guides/5/5_32/4.JPG new file mode 100644 index 00000000..a64d2b28 Binary files /dev/null and b/public/guides/5/5_32/4.JPG differ diff --git a/public/guides/5/5_32/4.jpg b/public/guides/5/5_32/4.jpg new file mode 100644 index 00000000..a64d2b28 Binary files /dev/null and b/public/guides/5/5_32/4.jpg differ diff --git a/public/guides/5/5_32/5.JPG b/public/guides/5/5_32/5.JPG new file mode 100644 index 00000000..3066b9e5 Binary files /dev/null and b/public/guides/5/5_32/5.JPG differ diff --git a/public/guides/5/5_32/5.jpg b/public/guides/5/5_32/5.jpg new file mode 100644 index 00000000..3066b9e5 Binary files /dev/null and b/public/guides/5/5_32/5.jpg differ diff --git a/public/guides/5/5_33/1.JPG b/public/guides/5/5_33/1.JPG new file mode 100644 index 00000000..bc4a1537 Binary files /dev/null and b/public/guides/5/5_33/1.JPG differ diff --git a/public/guides/5/5_33/1.jpg b/public/guides/5/5_33/1.jpg new file mode 100644 index 00000000..bc4a1537 Binary files /dev/null and b/public/guides/5/5_33/1.jpg differ diff --git a/public/guides/5/5_33/2.JPG b/public/guides/5/5_33/2.JPG new file mode 100644 index 00000000..c5232792 Binary files /dev/null and b/public/guides/5/5_33/2.JPG differ diff --git a/public/guides/5/5_33/2.jpg b/public/guides/5/5_33/2.jpg new file mode 100644 index 00000000..c5232792 Binary files /dev/null and b/public/guides/5/5_33/2.jpg differ diff --git a/public/guides/5/5_33/3.JPG b/public/guides/5/5_33/3.JPG new file mode 100644 index 00000000..4709e84d Binary files /dev/null and b/public/guides/5/5_33/3.JPG differ diff --git a/public/guides/5/5_33/3.jpg b/public/guides/5/5_33/3.jpg new file mode 100644 index 00000000..4709e84d Binary files /dev/null and b/public/guides/5/5_33/3.jpg differ diff --git a/public/guides/5/5_33/4.JPG b/public/guides/5/5_33/4.JPG new file mode 100644 index 00000000..ffa8c61e Binary files /dev/null and b/public/guides/5/5_33/4.JPG differ diff --git a/public/guides/5/5_33/4.jpg b/public/guides/5/5_33/4.jpg new file mode 100644 index 00000000..ffa8c61e Binary files /dev/null and b/public/guides/5/5_33/4.jpg differ diff --git a/public/guides/5/5_33/5.JPG b/public/guides/5/5_33/5.JPG new file mode 100644 index 00000000..403b8a9e Binary files /dev/null and b/public/guides/5/5_33/5.JPG differ diff --git a/public/guides/5/5_33/5.jpg b/public/guides/5/5_33/5.jpg new file mode 100644 index 00000000..403b8a9e Binary files /dev/null and b/public/guides/5/5_33/5.jpg differ diff --git a/public/guides/5/5_34/1.JPG b/public/guides/5/5_34/1.JPG new file mode 100644 index 00000000..b77f67f3 Binary files /dev/null and b/public/guides/5/5_34/1.JPG differ diff --git a/public/guides/5/5_34/1.jpg b/public/guides/5/5_34/1.jpg new file mode 100644 index 00000000..b77f67f3 Binary files /dev/null and b/public/guides/5/5_34/1.jpg differ diff --git a/public/guides/5/5_34/2.JPG b/public/guides/5/5_34/2.JPG new file mode 100644 index 00000000..edc767ad Binary files /dev/null and b/public/guides/5/5_34/2.JPG differ diff --git a/public/guides/5/5_34/2.jpg b/public/guides/5/5_34/2.jpg new file mode 100644 index 00000000..edc767ad Binary files /dev/null and b/public/guides/5/5_34/2.jpg differ diff --git a/public/guides/5/5_34/3.JPG b/public/guides/5/5_34/3.JPG new file mode 100644 index 00000000..c308de8f Binary files /dev/null and b/public/guides/5/5_34/3.JPG differ diff --git a/public/guides/5/5_34/3.jpg b/public/guides/5/5_34/3.jpg new file mode 100644 index 00000000..c308de8f Binary files /dev/null and b/public/guides/5/5_34/3.jpg differ diff --git a/public/guides/5/5_34/4.JPG b/public/guides/5/5_34/4.JPG new file mode 100644 index 00000000..9218aa8a Binary files /dev/null and b/public/guides/5/5_34/4.JPG differ diff --git a/public/guides/5/5_34/4.jpg b/public/guides/5/5_34/4.jpg new file mode 100644 index 00000000..9218aa8a Binary files /dev/null and b/public/guides/5/5_34/4.jpg differ diff --git a/public/guides/5/5_34/5.JPG b/public/guides/5/5_34/5.JPG new file mode 100644 index 00000000..6f254aa0 Binary files /dev/null and b/public/guides/5/5_34/5.JPG differ diff --git a/public/guides/5/5_34/5.jpg b/public/guides/5/5_34/5.jpg new file mode 100644 index 00000000..6f254aa0 Binary files /dev/null and b/public/guides/5/5_34/5.jpg differ diff --git a/public/guides/5/5_35/1.JPG b/public/guides/5/5_35/1.JPG new file mode 100644 index 00000000..c83f604b Binary files /dev/null and b/public/guides/5/5_35/1.JPG differ diff --git a/public/guides/5/5_35/1.jpg b/public/guides/5/5_35/1.jpg new file mode 100644 index 00000000..c83f604b Binary files /dev/null and b/public/guides/5/5_35/1.jpg differ diff --git a/public/guides/5/5_35/2.JPG b/public/guides/5/5_35/2.JPG new file mode 100644 index 00000000..759e7487 Binary files /dev/null and b/public/guides/5/5_35/2.JPG differ diff --git a/public/guides/5/5_35/2.jpg b/public/guides/5/5_35/2.jpg new file mode 100644 index 00000000..759e7487 Binary files /dev/null and b/public/guides/5/5_35/2.jpg differ diff --git a/public/guides/5/5_35/3.JPG b/public/guides/5/5_35/3.JPG new file mode 100644 index 00000000..b2afa014 Binary files /dev/null and b/public/guides/5/5_35/3.JPG differ diff --git a/public/guides/5/5_35/3.jpg b/public/guides/5/5_35/3.jpg new file mode 100644 index 00000000..b2afa014 Binary files /dev/null and b/public/guides/5/5_35/3.jpg differ diff --git a/public/guides/5/5_35/4.JPG b/public/guides/5/5_35/4.JPG new file mode 100644 index 00000000..477ec523 Binary files /dev/null and b/public/guides/5/5_35/4.JPG differ diff --git a/public/guides/5/5_35/4.jpg b/public/guides/5/5_35/4.jpg new file mode 100644 index 00000000..477ec523 Binary files /dev/null and b/public/guides/5/5_35/4.jpg differ diff --git a/public/guides/5/5_35/5.JPG b/public/guides/5/5_35/5.JPG new file mode 100644 index 00000000..f11c6168 Binary files /dev/null and b/public/guides/5/5_35/5.JPG differ diff --git a/public/guides/5/5_35/5.jpg b/public/guides/5/5_35/5.jpg new file mode 100644 index 00000000..f11c6168 Binary files /dev/null and b/public/guides/5/5_35/5.jpg differ diff --git a/public/guides/5/5_36/1.JPG b/public/guides/5/5_36/1.JPG new file mode 100644 index 00000000..16b76687 Binary files /dev/null and b/public/guides/5/5_36/1.JPG differ diff --git a/public/guides/5/5_36/1.jpg b/public/guides/5/5_36/1.jpg new file mode 100644 index 00000000..16b76687 Binary files /dev/null and b/public/guides/5/5_36/1.jpg differ diff --git a/public/guides/5/5_36/2.JPG b/public/guides/5/5_36/2.JPG new file mode 100644 index 00000000..01ca9459 Binary files /dev/null and b/public/guides/5/5_36/2.JPG differ diff --git a/public/guides/5/5_36/2.jpg b/public/guides/5/5_36/2.jpg new file mode 100644 index 00000000..01ca9459 Binary files /dev/null and b/public/guides/5/5_36/2.jpg differ diff --git a/public/guides/5/5_36/3.JPG b/public/guides/5/5_36/3.JPG new file mode 100644 index 00000000..7dab1c5d Binary files /dev/null and b/public/guides/5/5_36/3.JPG differ diff --git a/public/guides/5/5_36/3.jpg b/public/guides/5/5_36/3.jpg new file mode 100644 index 00000000..7dab1c5d Binary files /dev/null and b/public/guides/5/5_36/3.jpg differ diff --git a/public/guides/5/5_36/4.JPG b/public/guides/5/5_36/4.JPG new file mode 100644 index 00000000..b8fcab3e Binary files /dev/null and b/public/guides/5/5_36/4.JPG differ diff --git a/public/guides/5/5_36/4.jpg b/public/guides/5/5_36/4.jpg new file mode 100644 index 00000000..b8fcab3e Binary files /dev/null and b/public/guides/5/5_36/4.jpg differ diff --git a/public/guides/5/5_36/5.JPG b/public/guides/5/5_36/5.JPG new file mode 100644 index 00000000..08e33470 Binary files /dev/null and b/public/guides/5/5_36/5.JPG differ diff --git a/public/guides/5/5_36/5.jpg b/public/guides/5/5_36/5.jpg new file mode 100644 index 00000000..08e33470 Binary files /dev/null and b/public/guides/5/5_36/5.jpg differ diff --git a/public/guides/5/5_37/1.JPG b/public/guides/5/5_37/1.JPG new file mode 100644 index 00000000..f1de0b4d Binary files /dev/null and b/public/guides/5/5_37/1.JPG differ diff --git a/public/guides/5/5_37/1.jpg b/public/guides/5/5_37/1.jpg new file mode 100644 index 00000000..f1de0b4d Binary files /dev/null and b/public/guides/5/5_37/1.jpg differ diff --git a/public/guides/5/5_37/2.JPG b/public/guides/5/5_37/2.JPG new file mode 100644 index 00000000..920db317 Binary files /dev/null and b/public/guides/5/5_37/2.JPG differ diff --git a/public/guides/5/5_37/2.jpg b/public/guides/5/5_37/2.jpg new file mode 100644 index 00000000..920db317 Binary files /dev/null and b/public/guides/5/5_37/2.jpg differ diff --git a/public/guides/5/5_37/3.JPG b/public/guides/5/5_37/3.JPG new file mode 100644 index 00000000..6886385e Binary files /dev/null and b/public/guides/5/5_37/3.JPG differ diff --git a/public/guides/5/5_37/3.jpg b/public/guides/5/5_37/3.jpg new file mode 100644 index 00000000..6886385e Binary files /dev/null and b/public/guides/5/5_37/3.jpg differ diff --git a/public/guides/5/5_37/4.JPG b/public/guides/5/5_37/4.JPG new file mode 100644 index 00000000..9ddee047 Binary files /dev/null and b/public/guides/5/5_37/4.JPG differ diff --git a/public/guides/5/5_37/4.jpg b/public/guides/5/5_37/4.jpg new file mode 100644 index 00000000..9ddee047 Binary files /dev/null and b/public/guides/5/5_37/4.jpg differ diff --git a/public/guides/5/5_37/5.JPG b/public/guides/5/5_37/5.JPG new file mode 100644 index 00000000..0e2e1891 Binary files /dev/null and b/public/guides/5/5_37/5.JPG differ diff --git a/public/guides/5/5_37/5.jpg b/public/guides/5/5_37/5.jpg new file mode 100644 index 00000000..0e2e1891 Binary files /dev/null and b/public/guides/5/5_37/5.jpg differ diff --git a/public/guides/5/5_38/1.JPG b/public/guides/5/5_38/1.JPG new file mode 100644 index 00000000..0d439c4a Binary files /dev/null and b/public/guides/5/5_38/1.JPG differ diff --git a/public/guides/5/5_38/1.jpg b/public/guides/5/5_38/1.jpg new file mode 100644 index 00000000..0d439c4a Binary files /dev/null and b/public/guides/5/5_38/1.jpg differ diff --git a/public/guides/5/5_38/2.JPG b/public/guides/5/5_38/2.JPG new file mode 100644 index 00000000..686f24a2 Binary files /dev/null and b/public/guides/5/5_38/2.JPG differ diff --git a/public/guides/5/5_38/2.jpg b/public/guides/5/5_38/2.jpg new file mode 100644 index 00000000..686f24a2 Binary files /dev/null and b/public/guides/5/5_38/2.jpg differ diff --git a/public/guides/5/5_38/3.JPG b/public/guides/5/5_38/3.JPG new file mode 100644 index 00000000..3e4ed4ed Binary files /dev/null and b/public/guides/5/5_38/3.JPG differ diff --git a/public/guides/5/5_38/3.jpg b/public/guides/5/5_38/3.jpg new file mode 100644 index 00000000..3e4ed4ed Binary files /dev/null and b/public/guides/5/5_38/3.jpg differ diff --git a/public/guides/5/5_38/4.jpg b/public/guides/5/5_38/4.jpg new file mode 100644 index 00000000..688a0647 Binary files /dev/null and b/public/guides/5/5_38/4.jpg differ diff --git a/public/guides/5/5_38/5.JPG b/public/guides/5/5_38/5.JPG new file mode 100644 index 00000000..ee517f2f Binary files /dev/null and b/public/guides/5/5_38/5.JPG differ diff --git a/public/guides/5/5_38/5.jpg b/public/guides/5/5_38/5.jpg new file mode 100644 index 00000000..ee517f2f Binary files /dev/null and b/public/guides/5/5_38/5.jpg differ diff --git a/public/guides/5/5_39/1.JPG b/public/guides/5/5_39/1.JPG new file mode 100644 index 00000000..c3602532 Binary files /dev/null and b/public/guides/5/5_39/1.JPG differ diff --git a/public/guides/5/5_39/1.jpg b/public/guides/5/5_39/1.jpg new file mode 100644 index 00000000..c3602532 Binary files /dev/null and b/public/guides/5/5_39/1.jpg differ diff --git a/public/guides/5/5_39/2.JPG b/public/guides/5/5_39/2.JPG new file mode 100644 index 00000000..f93801c1 Binary files /dev/null and b/public/guides/5/5_39/2.JPG differ diff --git a/public/guides/5/5_39/2.jpg b/public/guides/5/5_39/2.jpg new file mode 100644 index 00000000..f93801c1 Binary files /dev/null and b/public/guides/5/5_39/2.jpg differ diff --git a/public/guides/5/5_39/3.JPG b/public/guides/5/5_39/3.JPG new file mode 100644 index 00000000..217c1b44 Binary files /dev/null and b/public/guides/5/5_39/3.JPG differ diff --git a/public/guides/5/5_39/3.jpg b/public/guides/5/5_39/3.jpg new file mode 100644 index 00000000..217c1b44 Binary files /dev/null and b/public/guides/5/5_39/3.jpg differ diff --git a/public/guides/5/5_39/4.JPG b/public/guides/5/5_39/4.JPG new file mode 100644 index 00000000..b0a4cc99 Binary files /dev/null and b/public/guides/5/5_39/4.JPG differ diff --git a/public/guides/5/5_39/4.jpg b/public/guides/5/5_39/4.jpg new file mode 100644 index 00000000..b0a4cc99 Binary files /dev/null and b/public/guides/5/5_39/4.jpg differ diff --git a/public/guides/5/5_39/5.JPG b/public/guides/5/5_39/5.JPG new file mode 100644 index 00000000..fcac5ec3 Binary files /dev/null and b/public/guides/5/5_39/5.JPG differ diff --git a/public/guides/5/5_39/5.jpg b/public/guides/5/5_39/5.jpg new file mode 100644 index 00000000..fcac5ec3 Binary files /dev/null and b/public/guides/5/5_39/5.jpg differ diff --git a/public/guides/5/5_4/1.jpg b/public/guides/5/5_4/1.jpg new file mode 100644 index 00000000..fe0f40c5 Binary files /dev/null and b/public/guides/5/5_4/1.jpg differ diff --git a/public/guides/5/5_4/2.jpg b/public/guides/5/5_4/2.jpg new file mode 100644 index 00000000..304e1f45 Binary files /dev/null and b/public/guides/5/5_4/2.jpg differ diff --git a/public/guides/5/5_4/3.JPG b/public/guides/5/5_4/3.JPG new file mode 100644 index 00000000..c6f9a86c Binary files /dev/null and b/public/guides/5/5_4/3.JPG differ diff --git a/public/guides/5/5_4/3.jpg b/public/guides/5/5_4/3.jpg new file mode 100644 index 00000000..c6f9a86c Binary files /dev/null and b/public/guides/5/5_4/3.jpg differ diff --git a/public/guides/5/5_4/4.jpg b/public/guides/5/5_4/4.jpg new file mode 100644 index 00000000..f0ffd12c Binary files /dev/null and b/public/guides/5/5_4/4.jpg differ diff --git a/public/guides/5/5_4/5.jpg b/public/guides/5/5_4/5.jpg new file mode 100644 index 00000000..b2740657 Binary files /dev/null and b/public/guides/5/5_4/5.jpg differ diff --git a/public/guides/5/5_40/1.jpg b/public/guides/5/5_40/1.jpg new file mode 100644 index 00000000..d5683fb3 Binary files /dev/null and b/public/guides/5/5_40/1.jpg differ diff --git a/public/guides/5/5_40/2.jpg b/public/guides/5/5_40/2.jpg new file mode 100644 index 00000000..99a43a23 Binary files /dev/null and b/public/guides/5/5_40/2.jpg differ diff --git a/public/guides/5/5_40/3.jpg b/public/guides/5/5_40/3.jpg new file mode 100644 index 00000000..571e13e6 Binary files /dev/null and b/public/guides/5/5_40/3.jpg differ diff --git a/public/guides/5/5_40/4.jpg b/public/guides/5/5_40/4.jpg new file mode 100644 index 00000000..2a81d0aa Binary files /dev/null and b/public/guides/5/5_40/4.jpg differ diff --git a/public/guides/5/5_40/5.jpg b/public/guides/5/5_40/5.jpg new file mode 100644 index 00000000..067b4776 Binary files /dev/null and b/public/guides/5/5_40/5.jpg differ diff --git a/public/guides/5/5_41/1.jpg b/public/guides/5/5_41/1.jpg new file mode 100644 index 00000000..4e392e73 Binary files /dev/null and b/public/guides/5/5_41/1.jpg differ diff --git a/public/guides/5/5_41/2.jpg b/public/guides/5/5_41/2.jpg new file mode 100644 index 00000000..d28248de Binary files /dev/null and b/public/guides/5/5_41/2.jpg differ diff --git a/public/guides/5/5_41/3.jpg b/public/guides/5/5_41/3.jpg new file mode 100644 index 00000000..f61534d9 Binary files /dev/null and b/public/guides/5/5_41/3.jpg differ diff --git a/public/guides/5/5_41/4.jpg b/public/guides/5/5_41/4.jpg new file mode 100644 index 00000000..1ee68a70 Binary files /dev/null and b/public/guides/5/5_41/4.jpg differ diff --git a/public/guides/5/5_41/5.jpg b/public/guides/5/5_41/5.jpg new file mode 100644 index 00000000..8d5aac20 Binary files /dev/null and b/public/guides/5/5_41/5.jpg differ diff --git a/public/guides/5/5_42/1.jpg b/public/guides/5/5_42/1.jpg new file mode 100644 index 00000000..1937128b Binary files /dev/null and b/public/guides/5/5_42/1.jpg differ diff --git a/public/guides/5/5_42/2.jpg b/public/guides/5/5_42/2.jpg new file mode 100644 index 00000000..ab9a58ee Binary files /dev/null and b/public/guides/5/5_42/2.jpg differ diff --git a/public/guides/5/5_42/3.JPG b/public/guides/5/5_42/3.JPG new file mode 100644 index 00000000..78b2b12f Binary files /dev/null and b/public/guides/5/5_42/3.JPG differ diff --git a/public/guides/5/5_42/3.jpg b/public/guides/5/5_42/3.jpg new file mode 100644 index 00000000..78b2b12f Binary files /dev/null and b/public/guides/5/5_42/3.jpg differ diff --git a/public/guides/5/5_42/4.jpg b/public/guides/5/5_42/4.jpg new file mode 100644 index 00000000..ed50fb3a Binary files /dev/null and b/public/guides/5/5_42/4.jpg differ diff --git a/public/guides/5/5_42/5.jpg b/public/guides/5/5_42/5.jpg new file mode 100644 index 00000000..44d50806 Binary files /dev/null and b/public/guides/5/5_42/5.jpg differ diff --git a/public/guides/5/5_43/1.jpg b/public/guides/5/5_43/1.jpg new file mode 100644 index 00000000..7e552e63 Binary files /dev/null and b/public/guides/5/5_43/1.jpg differ diff --git a/public/guides/5/5_43/2.jpg b/public/guides/5/5_43/2.jpg new file mode 100644 index 00000000..20e9a853 Binary files /dev/null and b/public/guides/5/5_43/2.jpg differ diff --git a/public/guides/5/5_43/3.jpg b/public/guides/5/5_43/3.jpg new file mode 100644 index 00000000..34f2f9b7 Binary files /dev/null and b/public/guides/5/5_43/3.jpg differ diff --git a/public/guides/5/5_43/4.jpg b/public/guides/5/5_43/4.jpg new file mode 100644 index 00000000..c88cf04c Binary files /dev/null and b/public/guides/5/5_43/4.jpg differ diff --git a/public/guides/5/5_43/5.jpg b/public/guides/5/5_43/5.jpg new file mode 100644 index 00000000..ae2ea965 Binary files /dev/null and b/public/guides/5/5_43/5.jpg differ diff --git a/public/guides/5/5_44/1.jpg b/public/guides/5/5_44/1.jpg new file mode 100644 index 00000000..6c593056 Binary files /dev/null and b/public/guides/5/5_44/1.jpg differ diff --git a/public/guides/5/5_44/2.jpg b/public/guides/5/5_44/2.jpg new file mode 100644 index 00000000..41ef4b5f Binary files /dev/null and b/public/guides/5/5_44/2.jpg differ diff --git a/public/guides/5/5_44/3.jpg b/public/guides/5/5_44/3.jpg new file mode 100644 index 00000000..4c9c0f00 Binary files /dev/null and b/public/guides/5/5_44/3.jpg differ diff --git a/public/guides/5/5_44/4.jpg b/public/guides/5/5_44/4.jpg new file mode 100644 index 00000000..89a44e26 Binary files /dev/null and b/public/guides/5/5_44/4.jpg differ diff --git a/public/guides/5/5_44/5.jpg b/public/guides/5/5_44/5.jpg new file mode 100644 index 00000000..0ed8e731 Binary files /dev/null and b/public/guides/5/5_44/5.jpg differ diff --git a/public/guides/5/5_45/1.jpg b/public/guides/5/5_45/1.jpg new file mode 100644 index 00000000..36c5b245 Binary files /dev/null and b/public/guides/5/5_45/1.jpg differ diff --git a/public/guides/5/5_45/2.jpg b/public/guides/5/5_45/2.jpg new file mode 100644 index 00000000..042c4ff3 Binary files /dev/null and b/public/guides/5/5_45/2.jpg differ diff --git a/public/guides/5/5_45/3.jpg b/public/guides/5/5_45/3.jpg new file mode 100644 index 00000000..1f6ee772 Binary files /dev/null and b/public/guides/5/5_45/3.jpg differ diff --git a/public/guides/5/5_45/4.JPG b/public/guides/5/5_45/4.JPG new file mode 100644 index 00000000..a2edaee2 Binary files /dev/null and b/public/guides/5/5_45/4.JPG differ diff --git a/public/guides/5/5_45/4.jpg b/public/guides/5/5_45/4.jpg new file mode 100644 index 00000000..a2edaee2 Binary files /dev/null and b/public/guides/5/5_45/4.jpg differ diff --git a/public/guides/5/5_45/5.jpg b/public/guides/5/5_45/5.jpg new file mode 100644 index 00000000..b83b36cc Binary files /dev/null and b/public/guides/5/5_45/5.jpg differ diff --git a/public/guides/5/5_46/1.jpg b/public/guides/5/5_46/1.jpg new file mode 100644 index 00000000..3f4c09c9 Binary files /dev/null and b/public/guides/5/5_46/1.jpg differ diff --git a/public/guides/5/5_46/2.jpg b/public/guides/5/5_46/2.jpg new file mode 100644 index 00000000..89b7f825 Binary files /dev/null and b/public/guides/5/5_46/2.jpg differ diff --git a/public/guides/5/5_46/3.jpg b/public/guides/5/5_46/3.jpg new file mode 100644 index 00000000..9da356ff Binary files /dev/null and b/public/guides/5/5_46/3.jpg differ diff --git a/public/guides/5/5_46/4.jpg b/public/guides/5/5_46/4.jpg new file mode 100644 index 00000000..86192fc3 Binary files /dev/null and b/public/guides/5/5_46/4.jpg differ diff --git a/public/guides/5/5_46/5.jpg b/public/guides/5/5_46/5.jpg new file mode 100644 index 00000000..c180aebd Binary files /dev/null and b/public/guides/5/5_46/5.jpg differ diff --git a/public/guides/5/5_47/1.jpg b/public/guides/5/5_47/1.jpg new file mode 100644 index 00000000..c3cb021d Binary files /dev/null and b/public/guides/5/5_47/1.jpg differ diff --git a/public/guides/5/5_47/2.jpg b/public/guides/5/5_47/2.jpg new file mode 100644 index 00000000..2914c1a4 Binary files /dev/null and b/public/guides/5/5_47/2.jpg differ diff --git a/public/guides/5/5_47/3.jpg b/public/guides/5/5_47/3.jpg new file mode 100644 index 00000000..b8a2820a Binary files /dev/null and b/public/guides/5/5_47/3.jpg differ diff --git a/public/guides/5/5_47/4.jpg b/public/guides/5/5_47/4.jpg new file mode 100644 index 00000000..6be686ce Binary files /dev/null and b/public/guides/5/5_47/4.jpg differ diff --git a/public/guides/5/5_47/5.jpg b/public/guides/5/5_47/5.jpg new file mode 100644 index 00000000..f44e2cc9 Binary files /dev/null and b/public/guides/5/5_47/5.jpg differ diff --git a/public/guides/5/5_48/1.jpg b/public/guides/5/5_48/1.jpg new file mode 100644 index 00000000..8ad71d84 Binary files /dev/null and b/public/guides/5/5_48/1.jpg differ diff --git a/public/guides/5/5_48/2.jpg b/public/guides/5/5_48/2.jpg new file mode 100644 index 00000000..6991d9e7 Binary files /dev/null and b/public/guides/5/5_48/2.jpg differ diff --git a/public/guides/5/5_48/3.JPG b/public/guides/5/5_48/3.JPG new file mode 100644 index 00000000..208699ac Binary files /dev/null and b/public/guides/5/5_48/3.JPG differ diff --git a/public/guides/5/5_48/3.jpg b/public/guides/5/5_48/3.jpg new file mode 100644 index 00000000..208699ac Binary files /dev/null and b/public/guides/5/5_48/3.jpg differ diff --git a/public/guides/5/5_48/4.jpg b/public/guides/5/5_48/4.jpg new file mode 100644 index 00000000..b6d89e7c Binary files /dev/null and b/public/guides/5/5_48/4.jpg differ diff --git a/public/guides/5/5_48/5.jpg b/public/guides/5/5_48/5.jpg new file mode 100644 index 00000000..49cd0ec2 Binary files /dev/null and b/public/guides/5/5_48/5.jpg differ diff --git a/public/guides/5/5_49/1.JPG b/public/guides/5/5_49/1.JPG new file mode 100644 index 00000000..ffd204f6 Binary files /dev/null and b/public/guides/5/5_49/1.JPG differ diff --git a/public/guides/5/5_49/1.jpg b/public/guides/5/5_49/1.jpg new file mode 100644 index 00000000..ffd204f6 Binary files /dev/null and b/public/guides/5/5_49/1.jpg differ diff --git a/public/guides/5/5_49/2.JPG b/public/guides/5/5_49/2.JPG new file mode 100644 index 00000000..68afe934 Binary files /dev/null and b/public/guides/5/5_49/2.JPG differ diff --git a/public/guides/5/5_49/2.jpg b/public/guides/5/5_49/2.jpg new file mode 100644 index 00000000..68afe934 Binary files /dev/null and b/public/guides/5/5_49/2.jpg differ diff --git a/public/guides/5/5_49/3.JPG b/public/guides/5/5_49/3.JPG new file mode 100644 index 00000000..2d111983 Binary files /dev/null and b/public/guides/5/5_49/3.JPG differ diff --git a/public/guides/5/5_49/3.jpg b/public/guides/5/5_49/3.jpg new file mode 100644 index 00000000..2d111983 Binary files /dev/null and b/public/guides/5/5_49/3.jpg differ diff --git a/public/guides/5/5_49/4.JPG b/public/guides/5/5_49/4.JPG new file mode 100644 index 00000000..1e829c91 Binary files /dev/null and b/public/guides/5/5_49/4.JPG differ diff --git a/public/guides/5/5_49/4.jpg b/public/guides/5/5_49/4.jpg new file mode 100644 index 00000000..1e829c91 Binary files /dev/null and b/public/guides/5/5_49/4.jpg differ diff --git a/public/guides/5/5_49/5.JPG b/public/guides/5/5_49/5.JPG new file mode 100644 index 00000000..f6674a61 Binary files /dev/null and b/public/guides/5/5_49/5.JPG differ diff --git a/public/guides/5/5_49/5.jpg b/public/guides/5/5_49/5.jpg new file mode 100644 index 00000000..f6674a61 Binary files /dev/null and b/public/guides/5/5_49/5.jpg differ diff --git a/public/guides/5/5_5/1.jpg b/public/guides/5/5_5/1.jpg new file mode 100644 index 00000000..73e9e5ab Binary files /dev/null and b/public/guides/5/5_5/1.jpg differ diff --git a/public/guides/5/5_5/2.jpg b/public/guides/5/5_5/2.jpg new file mode 100644 index 00000000..8f5015a5 Binary files /dev/null and b/public/guides/5/5_5/2.jpg differ diff --git a/public/guides/5/5_5/3.jpg b/public/guides/5/5_5/3.jpg new file mode 100644 index 00000000..f328b128 Binary files /dev/null and b/public/guides/5/5_5/3.jpg differ diff --git a/public/guides/5/5_5/4.jpg b/public/guides/5/5_5/4.jpg new file mode 100644 index 00000000..349799ab Binary files /dev/null and b/public/guides/5/5_5/4.jpg differ diff --git a/public/guides/5/5_5/5.jpg b/public/guides/5/5_5/5.jpg new file mode 100644 index 00000000..afde67ae Binary files /dev/null and b/public/guides/5/5_5/5.jpg differ diff --git a/public/guides/5/5_50/1.JPG b/public/guides/5/5_50/1.JPG new file mode 100644 index 00000000..ce5aad96 Binary files /dev/null and b/public/guides/5/5_50/1.JPG differ diff --git a/public/guides/5/5_50/1.jpg b/public/guides/5/5_50/1.jpg new file mode 100644 index 00000000..ce5aad96 Binary files /dev/null and b/public/guides/5/5_50/1.jpg differ diff --git a/public/guides/5/5_50/2.JPG b/public/guides/5/5_50/2.JPG new file mode 100644 index 00000000..8dd42777 Binary files /dev/null and b/public/guides/5/5_50/2.JPG differ diff --git a/public/guides/5/5_50/2.jpg b/public/guides/5/5_50/2.jpg new file mode 100644 index 00000000..8dd42777 Binary files /dev/null and b/public/guides/5/5_50/2.jpg differ diff --git a/public/guides/5/5_50/3.JPG b/public/guides/5/5_50/3.JPG new file mode 100644 index 00000000..7468f36a Binary files /dev/null and b/public/guides/5/5_50/3.JPG differ diff --git a/public/guides/5/5_50/3.jpg b/public/guides/5/5_50/3.jpg new file mode 100644 index 00000000..7468f36a Binary files /dev/null and b/public/guides/5/5_50/3.jpg differ diff --git a/public/guides/5/5_50/4.JPG b/public/guides/5/5_50/4.JPG new file mode 100644 index 00000000..a6b5c0ef Binary files /dev/null and b/public/guides/5/5_50/4.JPG differ diff --git a/public/guides/5/5_50/4.jpg b/public/guides/5/5_50/4.jpg new file mode 100644 index 00000000..a6b5c0ef Binary files /dev/null and b/public/guides/5/5_50/4.jpg differ diff --git a/public/guides/5/5_50/5.JPG b/public/guides/5/5_50/5.JPG new file mode 100644 index 00000000..b84fb8cd Binary files /dev/null and b/public/guides/5/5_50/5.JPG differ diff --git a/public/guides/5/5_50/5.jpg b/public/guides/5/5_50/5.jpg new file mode 100644 index 00000000..b84fb8cd Binary files /dev/null and b/public/guides/5/5_50/5.jpg differ diff --git a/public/guides/5/5_51/1.JPG b/public/guides/5/5_51/1.JPG new file mode 100644 index 00000000..76ad77d0 Binary files /dev/null and b/public/guides/5/5_51/1.JPG differ diff --git a/public/guides/5/5_51/1.jpg b/public/guides/5/5_51/1.jpg new file mode 100644 index 00000000..76ad77d0 Binary files /dev/null and b/public/guides/5/5_51/1.jpg differ diff --git a/public/guides/5/5_51/2.jpg b/public/guides/5/5_51/2.jpg new file mode 100644 index 00000000..712864d2 Binary files /dev/null and b/public/guides/5/5_51/2.jpg differ diff --git a/public/guides/5/5_51/3.JPG b/public/guides/5/5_51/3.JPG new file mode 100644 index 00000000..5b6b7798 Binary files /dev/null and b/public/guides/5/5_51/3.JPG differ diff --git a/public/guides/5/5_51/3.jpg b/public/guides/5/5_51/3.jpg new file mode 100644 index 00000000..5b6b7798 Binary files /dev/null and b/public/guides/5/5_51/3.jpg differ diff --git a/public/guides/5/5_51/4.jpg b/public/guides/5/5_51/4.jpg new file mode 100644 index 00000000..137f7549 Binary files /dev/null and b/public/guides/5/5_51/4.jpg differ diff --git a/public/guides/5/5_51/5.JPG b/public/guides/5/5_51/5.JPG new file mode 100644 index 00000000..c736069b Binary files /dev/null and b/public/guides/5/5_51/5.JPG differ diff --git a/public/guides/5/5_51/5.jpg b/public/guides/5/5_51/5.jpg new file mode 100644 index 00000000..c736069b Binary files /dev/null and b/public/guides/5/5_51/5.jpg differ diff --git a/public/guides/5/5_52/1.jpg b/public/guides/5/5_52/1.jpg new file mode 100644 index 00000000..2cdabffd Binary files /dev/null and b/public/guides/5/5_52/1.jpg differ diff --git a/public/guides/5/5_52/2.jpg b/public/guides/5/5_52/2.jpg new file mode 100644 index 00000000..90cdd52a Binary files /dev/null and b/public/guides/5/5_52/2.jpg differ diff --git a/public/guides/5/5_52/3.JPG b/public/guides/5/5_52/3.JPG new file mode 100644 index 00000000..885671f0 Binary files /dev/null and b/public/guides/5/5_52/3.JPG differ diff --git a/public/guides/5/5_52/3.jpg b/public/guides/5/5_52/3.jpg new file mode 100644 index 00000000..885671f0 Binary files /dev/null and b/public/guides/5/5_52/3.jpg differ diff --git a/public/guides/5/5_52/4.JPG b/public/guides/5/5_52/4.JPG new file mode 100644 index 00000000..4cc7d7d5 Binary files /dev/null and b/public/guides/5/5_52/4.JPG differ diff --git a/public/guides/5/5_52/4.jpg b/public/guides/5/5_52/4.jpg new file mode 100644 index 00000000..4cc7d7d5 Binary files /dev/null and b/public/guides/5/5_52/4.jpg differ diff --git a/public/guides/5/5_52/5.jpg b/public/guides/5/5_52/5.jpg new file mode 100644 index 00000000..afe9068f Binary files /dev/null and b/public/guides/5/5_52/5.jpg differ diff --git a/public/guides/5/5_53/1.jpg b/public/guides/5/5_53/1.jpg new file mode 100644 index 00000000..d138f9d9 Binary files /dev/null and b/public/guides/5/5_53/1.jpg differ diff --git a/public/guides/5/5_53/2.jpg b/public/guides/5/5_53/2.jpg new file mode 100644 index 00000000..e59f5908 Binary files /dev/null and b/public/guides/5/5_53/2.jpg differ diff --git a/public/guides/5/5_53/3.JPG b/public/guides/5/5_53/3.JPG new file mode 100644 index 00000000..76a953cd Binary files /dev/null and b/public/guides/5/5_53/3.JPG differ diff --git a/public/guides/5/5_53/3.jpg b/public/guides/5/5_53/3.jpg new file mode 100644 index 00000000..76a953cd Binary files /dev/null and b/public/guides/5/5_53/3.jpg differ diff --git a/public/guides/5/5_53/4.jpg b/public/guides/5/5_53/4.jpg new file mode 100644 index 00000000..b5908ee3 Binary files /dev/null and b/public/guides/5/5_53/4.jpg differ diff --git a/public/guides/5/5_53/5.jpg b/public/guides/5/5_53/5.jpg new file mode 100644 index 00000000..f115043c Binary files /dev/null and b/public/guides/5/5_53/5.jpg differ diff --git a/public/guides/5/5_54/1.jpg b/public/guides/5/5_54/1.jpg new file mode 100644 index 00000000..b5c403dd Binary files /dev/null and b/public/guides/5/5_54/1.jpg differ diff --git a/public/guides/5/5_54/2.JPG b/public/guides/5/5_54/2.JPG new file mode 100644 index 00000000..23cfabcb Binary files /dev/null and b/public/guides/5/5_54/2.JPG differ diff --git a/public/guides/5/5_54/2.jpg b/public/guides/5/5_54/2.jpg new file mode 100644 index 00000000..23cfabcb Binary files /dev/null and b/public/guides/5/5_54/2.jpg differ diff --git a/public/guides/5/5_54/3.jpg b/public/guides/5/5_54/3.jpg new file mode 100644 index 00000000..7dd4204f Binary files /dev/null and b/public/guides/5/5_54/3.jpg differ diff --git a/public/guides/5/5_54/4.jpg b/public/guides/5/5_54/4.jpg new file mode 100644 index 00000000..21c03c88 Binary files /dev/null and b/public/guides/5/5_54/4.jpg differ diff --git a/public/guides/5/5_54/5.jpg b/public/guides/5/5_54/5.jpg new file mode 100644 index 00000000..966f0782 Binary files /dev/null and b/public/guides/5/5_54/5.jpg differ diff --git a/public/guides/5/5_55/1.jpg b/public/guides/5/5_55/1.jpg new file mode 100644 index 00000000..7e7df6ce Binary files /dev/null and b/public/guides/5/5_55/1.jpg differ diff --git a/public/guides/5/5_55/2.jpg b/public/guides/5/5_55/2.jpg new file mode 100644 index 00000000..c5ccb6e3 Binary files /dev/null and b/public/guides/5/5_55/2.jpg differ diff --git a/public/guides/5/5_55/3.jpg b/public/guides/5/5_55/3.jpg new file mode 100644 index 00000000..08fd0e47 Binary files /dev/null and b/public/guides/5/5_55/3.jpg differ diff --git a/public/guides/5/5_55/4.jpg b/public/guides/5/5_55/4.jpg new file mode 100644 index 00000000..6155e149 Binary files /dev/null and b/public/guides/5/5_55/4.jpg differ diff --git a/public/guides/5/5_55/5.jpg b/public/guides/5/5_55/5.jpg new file mode 100644 index 00000000..44472a02 Binary files /dev/null and b/public/guides/5/5_55/5.jpg differ diff --git a/public/guides/5/5_56/1.jpg b/public/guides/5/5_56/1.jpg new file mode 100644 index 00000000..ce8eafaf Binary files /dev/null and b/public/guides/5/5_56/1.jpg differ diff --git a/public/guides/5/5_56/2.jpg b/public/guides/5/5_56/2.jpg new file mode 100644 index 00000000..57aa96ea Binary files /dev/null and b/public/guides/5/5_56/2.jpg differ diff --git a/public/guides/5/5_56/3.jpg b/public/guides/5/5_56/3.jpg new file mode 100644 index 00000000..3c75fd53 Binary files /dev/null and b/public/guides/5/5_56/3.jpg differ diff --git a/public/guides/5/5_56/4.jpg b/public/guides/5/5_56/4.jpg new file mode 100644 index 00000000..e2a32185 Binary files /dev/null and b/public/guides/5/5_56/4.jpg differ diff --git a/public/guides/5/5_56/5.jpg b/public/guides/5/5_56/5.jpg new file mode 100644 index 00000000..c55871e4 Binary files /dev/null and b/public/guides/5/5_56/5.jpg differ diff --git a/public/guides/5/5_57/1.JPG b/public/guides/5/5_57/1.JPG new file mode 100644 index 00000000..419bb9d0 Binary files /dev/null and b/public/guides/5/5_57/1.JPG differ diff --git a/public/guides/5/5_57/1.jpg b/public/guides/5/5_57/1.jpg new file mode 100644 index 00000000..419bb9d0 Binary files /dev/null and b/public/guides/5/5_57/1.jpg differ diff --git a/public/guides/5/5_57/2.jpg b/public/guides/5/5_57/2.jpg new file mode 100644 index 00000000..5ff3a69b Binary files /dev/null and b/public/guides/5/5_57/2.jpg differ diff --git a/public/guides/5/5_57/3.jpg b/public/guides/5/5_57/3.jpg new file mode 100644 index 00000000..f5b0876c Binary files /dev/null and b/public/guides/5/5_57/3.jpg differ diff --git a/public/guides/5/5_57/4.JPG b/public/guides/5/5_57/4.JPG new file mode 100644 index 00000000..a9a441d5 Binary files /dev/null and b/public/guides/5/5_57/4.JPG differ diff --git a/public/guides/5/5_57/4.jpg b/public/guides/5/5_57/4.jpg new file mode 100644 index 00000000..a9a441d5 Binary files /dev/null and b/public/guides/5/5_57/4.jpg differ diff --git a/public/guides/5/5_57/5.jpg b/public/guides/5/5_57/5.jpg new file mode 100644 index 00000000..e8ff59b7 Binary files /dev/null and b/public/guides/5/5_57/5.jpg differ diff --git a/public/guides/5/5_58/1.jpg b/public/guides/5/5_58/1.jpg new file mode 100644 index 00000000..0b3fef8f Binary files /dev/null and b/public/guides/5/5_58/1.jpg differ diff --git a/public/guides/5/5_58/2.jpg b/public/guides/5/5_58/2.jpg new file mode 100644 index 00000000..a6afe015 Binary files /dev/null and b/public/guides/5/5_58/2.jpg differ diff --git a/public/guides/5/5_58/3.jpg b/public/guides/5/5_58/3.jpg new file mode 100644 index 00000000..ed065cce Binary files /dev/null and b/public/guides/5/5_58/3.jpg differ diff --git a/public/guides/5/5_58/4.jpg b/public/guides/5/5_58/4.jpg new file mode 100644 index 00000000..1ebbd850 Binary files /dev/null and b/public/guides/5/5_58/4.jpg differ diff --git a/public/guides/5/5_58/5.JPG b/public/guides/5/5_58/5.JPG new file mode 100644 index 00000000..2a45109a Binary files /dev/null and b/public/guides/5/5_58/5.JPG differ diff --git a/public/guides/5/5_58/5.jpg b/public/guides/5/5_58/5.jpg new file mode 100644 index 00000000..2a45109a Binary files /dev/null and b/public/guides/5/5_58/5.jpg differ diff --git a/public/guides/5/5_59/1.jpg b/public/guides/5/5_59/1.jpg new file mode 100644 index 00000000..48e1ed42 Binary files /dev/null and b/public/guides/5/5_59/1.jpg differ diff --git a/public/guides/5/5_59/2.jpg b/public/guides/5/5_59/2.jpg new file mode 100644 index 00000000..a910648b Binary files /dev/null and b/public/guides/5/5_59/2.jpg differ diff --git a/public/guides/5/5_59/3.jpg b/public/guides/5/5_59/3.jpg new file mode 100644 index 00000000..f9dab460 Binary files /dev/null and b/public/guides/5/5_59/3.jpg differ diff --git a/public/guides/5/5_59/4.jpg b/public/guides/5/5_59/4.jpg new file mode 100644 index 00000000..b5cff232 Binary files /dev/null and b/public/guides/5/5_59/4.jpg differ diff --git a/public/guides/5/5_59/5.JPG b/public/guides/5/5_59/5.JPG new file mode 100644 index 00000000..6fa128d8 Binary files /dev/null and b/public/guides/5/5_59/5.JPG differ diff --git a/public/guides/5/5_59/5.jpg b/public/guides/5/5_59/5.jpg new file mode 100644 index 00000000..6fa128d8 Binary files /dev/null and b/public/guides/5/5_59/5.jpg differ diff --git a/public/guides/5/5_6/1.jpg b/public/guides/5/5_6/1.jpg new file mode 100644 index 00000000..402048ff Binary files /dev/null and b/public/guides/5/5_6/1.jpg differ diff --git a/public/guides/5/5_6/2.JPG b/public/guides/5/5_6/2.JPG new file mode 100644 index 00000000..7ddd1e4c Binary files /dev/null and b/public/guides/5/5_6/2.JPG differ diff --git a/public/guides/5/5_6/2.jpg b/public/guides/5/5_6/2.jpg new file mode 100644 index 00000000..7ddd1e4c Binary files /dev/null and b/public/guides/5/5_6/2.jpg differ diff --git a/public/guides/5/5_6/3.JPG b/public/guides/5/5_6/3.JPG new file mode 100644 index 00000000..32e30728 Binary files /dev/null and b/public/guides/5/5_6/3.JPG differ diff --git a/public/guides/5/5_6/3.jpg b/public/guides/5/5_6/3.jpg new file mode 100644 index 00000000..32e30728 Binary files /dev/null and b/public/guides/5/5_6/3.jpg differ diff --git a/public/guides/5/5_6/4.JPG b/public/guides/5/5_6/4.JPG new file mode 100644 index 00000000..596ba649 Binary files /dev/null and b/public/guides/5/5_6/4.JPG differ diff --git a/public/guides/5/5_6/4.jpg b/public/guides/5/5_6/4.jpg new file mode 100644 index 00000000..596ba649 Binary files /dev/null and b/public/guides/5/5_6/4.jpg differ diff --git a/public/guides/5/5_6/5.jpg b/public/guides/5/5_6/5.jpg new file mode 100644 index 00000000..533fbfb4 Binary files /dev/null and b/public/guides/5/5_6/5.jpg differ diff --git a/public/guides/5/5_60/1.JPG b/public/guides/5/5_60/1.JPG new file mode 100644 index 00000000..7e176459 Binary files /dev/null and b/public/guides/5/5_60/1.JPG differ diff --git a/public/guides/5/5_60/1.jpg b/public/guides/5/5_60/1.jpg new file mode 100644 index 00000000..7e176459 Binary files /dev/null and b/public/guides/5/5_60/1.jpg differ diff --git a/public/guides/5/5_60/2.JPG b/public/guides/5/5_60/2.JPG new file mode 100644 index 00000000..bbf273d8 Binary files /dev/null and b/public/guides/5/5_60/2.JPG differ diff --git a/public/guides/5/5_60/2.jpg b/public/guides/5/5_60/2.jpg new file mode 100644 index 00000000..bbf273d8 Binary files /dev/null and b/public/guides/5/5_60/2.jpg differ diff --git a/public/guides/5/5_60/3.jpg b/public/guides/5/5_60/3.jpg new file mode 100644 index 00000000..e8c68cab Binary files /dev/null and b/public/guides/5/5_60/3.jpg differ diff --git a/public/guides/5/5_60/4.JPG b/public/guides/5/5_60/4.JPG new file mode 100644 index 00000000..f309daff Binary files /dev/null and b/public/guides/5/5_60/4.JPG differ diff --git a/public/guides/5/5_60/4.jpg b/public/guides/5/5_60/4.jpg new file mode 100644 index 00000000..f309daff Binary files /dev/null and b/public/guides/5/5_60/4.jpg differ diff --git a/public/guides/5/5_60/5.jpg b/public/guides/5/5_60/5.jpg new file mode 100644 index 00000000..e041d406 Binary files /dev/null and b/public/guides/5/5_60/5.jpg differ diff --git a/public/guides/5/5_61/1.jpg b/public/guides/5/5_61/1.jpg new file mode 100644 index 00000000..e33e699b Binary files /dev/null and b/public/guides/5/5_61/1.jpg differ diff --git a/public/guides/5/5_61/2.jpg b/public/guides/5/5_61/2.jpg new file mode 100644 index 00000000..1d9cdaef Binary files /dev/null and b/public/guides/5/5_61/2.jpg differ diff --git a/public/guides/5/5_61/3.jpg b/public/guides/5/5_61/3.jpg new file mode 100644 index 00000000..55f18d9d Binary files /dev/null and b/public/guides/5/5_61/3.jpg differ diff --git a/public/guides/5/5_61/4.jpg b/public/guides/5/5_61/4.jpg new file mode 100644 index 00000000..bcdfe1bf Binary files /dev/null and b/public/guides/5/5_61/4.jpg differ diff --git a/public/guides/5/5_61/5.jpg b/public/guides/5/5_61/5.jpg new file mode 100644 index 00000000..ce574029 Binary files /dev/null and b/public/guides/5/5_61/5.jpg differ diff --git a/public/guides/5/5_62/1.jpg b/public/guides/5/5_62/1.jpg new file mode 100644 index 00000000..bf9be142 Binary files /dev/null and b/public/guides/5/5_62/1.jpg differ diff --git a/public/guides/5/5_62/2.jpg b/public/guides/5/5_62/2.jpg new file mode 100644 index 00000000..da6bd374 Binary files /dev/null and b/public/guides/5/5_62/2.jpg differ diff --git a/public/guides/5/5_62/3.jpg b/public/guides/5/5_62/3.jpg new file mode 100644 index 00000000..e1ed2bce Binary files /dev/null and b/public/guides/5/5_62/3.jpg differ diff --git a/public/guides/5/5_62/4.JPG b/public/guides/5/5_62/4.JPG new file mode 100644 index 00000000..71bccb0e Binary files /dev/null and b/public/guides/5/5_62/4.JPG differ diff --git a/public/guides/5/5_62/4.jpg b/public/guides/5/5_62/4.jpg new file mode 100644 index 00000000..71bccb0e Binary files /dev/null and b/public/guides/5/5_62/4.jpg differ diff --git a/public/guides/5/5_62/5.jpg b/public/guides/5/5_62/5.jpg new file mode 100644 index 00000000..9dbdc4d3 Binary files /dev/null and b/public/guides/5/5_62/5.jpg differ diff --git a/public/guides/5/5_63/1.JPG b/public/guides/5/5_63/1.JPG new file mode 100644 index 00000000..6a2d48e3 Binary files /dev/null and b/public/guides/5/5_63/1.JPG differ diff --git a/public/guides/5/5_63/1.jpg b/public/guides/5/5_63/1.jpg new file mode 100644 index 00000000..6a2d48e3 Binary files /dev/null and b/public/guides/5/5_63/1.jpg differ diff --git a/public/guides/5/5_63/2.jpg b/public/guides/5/5_63/2.jpg new file mode 100644 index 00000000..35953c89 Binary files /dev/null and b/public/guides/5/5_63/2.jpg differ diff --git a/public/guides/5/5_63/3.jpg b/public/guides/5/5_63/3.jpg new file mode 100644 index 00000000..92b2eed2 Binary files /dev/null and b/public/guides/5/5_63/3.jpg differ diff --git a/public/guides/5/5_63/4.JPG b/public/guides/5/5_63/4.JPG new file mode 100644 index 00000000..7ae5f994 Binary files /dev/null and b/public/guides/5/5_63/4.JPG differ diff --git a/public/guides/5/5_63/4.jpg b/public/guides/5/5_63/4.jpg new file mode 100644 index 00000000..7ae5f994 Binary files /dev/null and b/public/guides/5/5_63/4.jpg differ diff --git a/public/guides/5/5_63/5.jpg b/public/guides/5/5_63/5.jpg new file mode 100644 index 00000000..fff8fe9b Binary files /dev/null and b/public/guides/5/5_63/5.jpg differ diff --git a/public/guides/5/5_64/1.jpg b/public/guides/5/5_64/1.jpg new file mode 100644 index 00000000..172b0a79 Binary files /dev/null and b/public/guides/5/5_64/1.jpg differ diff --git a/public/guides/5/5_64/2.jpg b/public/guides/5/5_64/2.jpg new file mode 100644 index 00000000..82f6762a Binary files /dev/null and b/public/guides/5/5_64/2.jpg differ diff --git a/public/guides/5/5_64/3.jpg b/public/guides/5/5_64/3.jpg new file mode 100644 index 00000000..2ae3baad Binary files /dev/null and b/public/guides/5/5_64/3.jpg differ diff --git a/public/guides/5/5_64/4.JPG b/public/guides/5/5_64/4.JPG new file mode 100644 index 00000000..b2a90de5 Binary files /dev/null and b/public/guides/5/5_64/4.JPG differ diff --git a/public/guides/5/5_64/4.jpg b/public/guides/5/5_64/4.jpg new file mode 100644 index 00000000..b2a90de5 Binary files /dev/null and b/public/guides/5/5_64/4.jpg differ diff --git a/public/guides/5/5_64/5.jpg b/public/guides/5/5_64/5.jpg new file mode 100644 index 00000000..0f832097 Binary files /dev/null and b/public/guides/5/5_64/5.jpg differ diff --git a/public/guides/5/5_65/1.jpg b/public/guides/5/5_65/1.jpg new file mode 100644 index 00000000..c5222e63 Binary files /dev/null and b/public/guides/5/5_65/1.jpg differ diff --git a/public/guides/5/5_65/2.jpg b/public/guides/5/5_65/2.jpg new file mode 100644 index 00000000..a3a27cd4 Binary files /dev/null and b/public/guides/5/5_65/2.jpg differ diff --git a/public/guides/5/5_65/3.jpg b/public/guides/5/5_65/3.jpg new file mode 100644 index 00000000..04e2d26b Binary files /dev/null and b/public/guides/5/5_65/3.jpg differ diff --git a/public/guides/5/5_65/4.jpg b/public/guides/5/5_65/4.jpg new file mode 100644 index 00000000..6eb0dd9b Binary files /dev/null and b/public/guides/5/5_65/4.jpg differ diff --git a/public/guides/5/5_65/5.jpg b/public/guides/5/5_65/5.jpg new file mode 100644 index 00000000..d9c51ef9 Binary files /dev/null and b/public/guides/5/5_65/5.jpg differ diff --git a/public/guides/5/5_7/1.jpg b/public/guides/5/5_7/1.jpg new file mode 100644 index 00000000..7bb6ce5e Binary files /dev/null and b/public/guides/5/5_7/1.jpg differ diff --git a/public/guides/5/5_7/2.jpg b/public/guides/5/5_7/2.jpg new file mode 100644 index 00000000..ff5d69fd Binary files /dev/null and b/public/guides/5/5_7/2.jpg differ diff --git a/public/guides/5/5_7/3.jpg b/public/guides/5/5_7/3.jpg new file mode 100644 index 00000000..a8acbc3a Binary files /dev/null and b/public/guides/5/5_7/3.jpg differ diff --git a/public/guides/5/5_7/4.jpg b/public/guides/5/5_7/4.jpg new file mode 100644 index 00000000..ff088d94 Binary files /dev/null and b/public/guides/5/5_7/4.jpg differ diff --git a/public/guides/5/5_7/5.jpg b/public/guides/5/5_7/5.jpg new file mode 100644 index 00000000..71ba2d45 Binary files /dev/null and b/public/guides/5/5_7/5.jpg differ diff --git a/public/guides/5/5_8/1.jpg b/public/guides/5/5_8/1.jpg new file mode 100644 index 00000000..599c94c5 Binary files /dev/null and b/public/guides/5/5_8/1.jpg differ diff --git a/public/guides/5/5_8/2.jpg b/public/guides/5/5_8/2.jpg new file mode 100644 index 00000000..db5b224e Binary files /dev/null and b/public/guides/5/5_8/2.jpg differ diff --git a/public/guides/5/5_8/3.jpg b/public/guides/5/5_8/3.jpg new file mode 100644 index 00000000..de408ff9 Binary files /dev/null and b/public/guides/5/5_8/3.jpg differ diff --git a/public/guides/5/5_8/4.jpg b/public/guides/5/5_8/4.jpg new file mode 100644 index 00000000..f679af4d Binary files /dev/null and b/public/guides/5/5_8/4.jpg differ diff --git a/public/guides/5/5_8/5.jpg b/public/guides/5/5_8/5.jpg new file mode 100644 index 00000000..149ac4b5 Binary files /dev/null and b/public/guides/5/5_8/5.jpg differ diff --git a/public/guides/5/5_9/1.jpg b/public/guides/5/5_9/1.jpg new file mode 100644 index 00000000..a0516dc7 Binary files /dev/null and b/public/guides/5/5_9/1.jpg differ diff --git a/public/guides/5/5_9/2.jpg b/public/guides/5/5_9/2.jpg new file mode 100644 index 00000000..58d163ed Binary files /dev/null and b/public/guides/5/5_9/2.jpg differ diff --git a/public/guides/5/5_9/3.jpg b/public/guides/5/5_9/3.jpg new file mode 100644 index 00000000..795833f2 Binary files /dev/null and b/public/guides/5/5_9/3.jpg differ diff --git a/public/guides/5/5_9/4.jpg b/public/guides/5/5_9/4.jpg new file mode 100644 index 00000000..470790fa Binary files /dev/null and b/public/guides/5/5_9/4.jpg differ diff --git a/public/guides/5/5_9/5.jpg b/public/guides/5/5_9/5.jpg new file mode 100644 index 00000000..0dd66b5e Binary files /dev/null and b/public/guides/5/5_9/5.jpg differ diff --git "a/public/guides/5/5_ITEM_SUB category_\355\222\210\353\252\251 \354\271\264\355\205\214\352\263\240\353\246\254.jpg" "b/public/guides/5/5_ITEM_SUB category_\355\222\210\353\252\251 \354\271\264\355\205\214\352\263\240\353\246\254.jpg" new file mode 100644 index 00000000..45ad0dc0 Binary files /dev/null and "b/public/guides/5/5_ITEM_SUB category_\355\222\210\353\252\251 \354\271\264\355\205\214\352\263\240\353\246\254.jpg" differ diff --git a/public/guides/6/6_1/1.jpg b/public/guides/6/6_1/1.jpg new file mode 100644 index 00000000..0618375c Binary files /dev/null and b/public/guides/6/6_1/1.jpg differ diff --git a/public/guides/6/6_1/2.JPG b/public/guides/6/6_1/2.JPG new file mode 100644 index 00000000..53b4bedd Binary files /dev/null and b/public/guides/6/6_1/2.JPG differ diff --git a/public/guides/6/6_1/2.jpg b/public/guides/6/6_1/2.jpg new file mode 100644 index 00000000..53b4bedd Binary files /dev/null and b/public/guides/6/6_1/2.jpg differ diff --git a/public/guides/6/6_1/3.JPG b/public/guides/6/6_1/3.JPG new file mode 100644 index 00000000..816fb61e Binary files /dev/null and b/public/guides/6/6_1/3.JPG differ diff --git a/public/guides/6/6_1/3.jpg b/public/guides/6/6_1/3.jpg new file mode 100644 index 00000000..816fb61e Binary files /dev/null and b/public/guides/6/6_1/3.jpg differ diff --git a/public/guides/6/6_1/4.JPG b/public/guides/6/6_1/4.JPG new file mode 100644 index 00000000..f5779b77 Binary files /dev/null and b/public/guides/6/6_1/4.JPG differ diff --git a/public/guides/6/6_1/4.jpg b/public/guides/6/6_1/4.jpg new file mode 100644 index 00000000..f5779b77 Binary files /dev/null and b/public/guides/6/6_1/4.jpg differ diff --git a/public/guides/6/6_1/5.JPG b/public/guides/6/6_1/5.JPG new file mode 100644 index 00000000..6e13a6cf Binary files /dev/null and b/public/guides/6/6_1/5.JPG differ diff --git a/public/guides/6/6_1/5.jpg b/public/guides/6/6_1/5.jpg new file mode 100644 index 00000000..6e13a6cf Binary files /dev/null and b/public/guides/6/6_1/5.jpg differ diff --git a/public/guides/6/6_10/1.JPG b/public/guides/6/6_10/1.JPG new file mode 100644 index 00000000..38e2888d Binary files /dev/null and b/public/guides/6/6_10/1.JPG differ diff --git a/public/guides/6/6_10/1.jpg b/public/guides/6/6_10/1.jpg new file mode 100644 index 00000000..38e2888d Binary files /dev/null and b/public/guides/6/6_10/1.jpg differ diff --git a/public/guides/6/6_10/2.JPG b/public/guides/6/6_10/2.JPG new file mode 100644 index 00000000..31b3896d Binary files /dev/null and b/public/guides/6/6_10/2.JPG differ diff --git a/public/guides/6/6_10/2.jpg b/public/guides/6/6_10/2.jpg new file mode 100644 index 00000000..31b3896d Binary files /dev/null and b/public/guides/6/6_10/2.jpg differ diff --git a/public/guides/6/6_10/3.JPG b/public/guides/6/6_10/3.JPG new file mode 100644 index 00000000..209b2424 Binary files /dev/null and b/public/guides/6/6_10/3.JPG differ diff --git a/public/guides/6/6_10/3.jpg b/public/guides/6/6_10/3.jpg new file mode 100644 index 00000000..209b2424 Binary files /dev/null and b/public/guides/6/6_10/3.jpg differ diff --git a/public/guides/6/6_10/4.jpg b/public/guides/6/6_10/4.jpg new file mode 100644 index 00000000..8124c2e8 Binary files /dev/null and b/public/guides/6/6_10/4.jpg differ diff --git a/public/guides/6/6_10/5.JPG b/public/guides/6/6_10/5.JPG new file mode 100644 index 00000000..5d5d7cd4 Binary files /dev/null and b/public/guides/6/6_10/5.JPG differ diff --git a/public/guides/6/6_10/5.jpg b/public/guides/6/6_10/5.jpg new file mode 100644 index 00000000..5d5d7cd4 Binary files /dev/null and b/public/guides/6/6_10/5.jpg differ diff --git a/public/guides/6/6_11/1.jpg b/public/guides/6/6_11/1.jpg new file mode 100644 index 00000000..9d12f4a1 Binary files /dev/null and b/public/guides/6/6_11/1.jpg differ diff --git a/public/guides/6/6_11/2.jpg b/public/guides/6/6_11/2.jpg new file mode 100644 index 00000000..8b552112 Binary files /dev/null and b/public/guides/6/6_11/2.jpg differ diff --git a/public/guides/6/6_11/3.jpg b/public/guides/6/6_11/3.jpg new file mode 100644 index 00000000..fceeae3a Binary files /dev/null and b/public/guides/6/6_11/3.jpg differ diff --git a/public/guides/6/6_11/4.jpg b/public/guides/6/6_11/4.jpg new file mode 100644 index 00000000..71086609 Binary files /dev/null and b/public/guides/6/6_11/4.jpg differ diff --git a/public/guides/6/6_11/5.jpg b/public/guides/6/6_11/5.jpg new file mode 100644 index 00000000..91c784df Binary files /dev/null and b/public/guides/6/6_11/5.jpg differ diff --git a/public/guides/6/6_12/1.jpg b/public/guides/6/6_12/1.jpg new file mode 100644 index 00000000..6322e83c Binary files /dev/null and b/public/guides/6/6_12/1.jpg differ diff --git a/public/guides/6/6_12/2.jpg b/public/guides/6/6_12/2.jpg new file mode 100644 index 00000000..7d265842 Binary files /dev/null and b/public/guides/6/6_12/2.jpg differ diff --git a/public/guides/6/6_12/3.jpg b/public/guides/6/6_12/3.jpg new file mode 100644 index 00000000..e5d379f7 Binary files /dev/null and b/public/guides/6/6_12/3.jpg differ diff --git a/public/guides/6/6_12/4.jpg b/public/guides/6/6_12/4.jpg new file mode 100644 index 00000000..56747529 Binary files /dev/null and b/public/guides/6/6_12/4.jpg differ diff --git a/public/guides/6/6_12/5.jpg b/public/guides/6/6_12/5.jpg new file mode 100644 index 00000000..2e9e39e2 Binary files /dev/null and b/public/guides/6/6_12/5.jpg differ diff --git a/public/guides/6/6_13/1.jpg b/public/guides/6/6_13/1.jpg new file mode 100644 index 00000000..67007cd9 Binary files /dev/null and b/public/guides/6/6_13/1.jpg differ diff --git a/public/guides/6/6_13/2.jpg b/public/guides/6/6_13/2.jpg new file mode 100644 index 00000000..f7ec7af7 Binary files /dev/null and b/public/guides/6/6_13/2.jpg differ diff --git a/public/guides/6/6_13/3.jpg b/public/guides/6/6_13/3.jpg new file mode 100644 index 00000000..8b046d7a Binary files /dev/null and b/public/guides/6/6_13/3.jpg differ diff --git a/public/guides/6/6_13/4.jpg b/public/guides/6/6_13/4.jpg new file mode 100644 index 00000000..aec920d9 Binary files /dev/null and b/public/guides/6/6_13/4.jpg differ diff --git a/public/guides/6/6_13/5.jpg b/public/guides/6/6_13/5.jpg new file mode 100644 index 00000000..be039501 Binary files /dev/null and b/public/guides/6/6_13/5.jpg differ diff --git a/public/guides/6/6_14/1.jpg b/public/guides/6/6_14/1.jpg new file mode 100644 index 00000000..01653678 Binary files /dev/null and b/public/guides/6/6_14/1.jpg differ diff --git a/public/guides/6/6_14/2.jpg b/public/guides/6/6_14/2.jpg new file mode 100644 index 00000000..cd9bbc73 Binary files /dev/null and b/public/guides/6/6_14/2.jpg differ diff --git a/public/guides/6/6_14/3.jpg b/public/guides/6/6_14/3.jpg new file mode 100644 index 00000000..28b02583 Binary files /dev/null and b/public/guides/6/6_14/3.jpg differ diff --git a/public/guides/6/6_14/4.jpg b/public/guides/6/6_14/4.jpg new file mode 100644 index 00000000..be6dd1bd Binary files /dev/null and b/public/guides/6/6_14/4.jpg differ diff --git a/public/guides/6/6_14/5.jpg b/public/guides/6/6_14/5.jpg new file mode 100644 index 00000000..6b9abe11 Binary files /dev/null and b/public/guides/6/6_14/5.jpg differ diff --git a/public/guides/6/6_15/1.jpg b/public/guides/6/6_15/1.jpg new file mode 100644 index 00000000..20784e76 Binary files /dev/null and b/public/guides/6/6_15/1.jpg differ diff --git a/public/guides/6/6_15/2.jpg b/public/guides/6/6_15/2.jpg new file mode 100644 index 00000000..77484970 Binary files /dev/null and b/public/guides/6/6_15/2.jpg differ diff --git a/public/guides/6/6_15/3.jpg b/public/guides/6/6_15/3.jpg new file mode 100644 index 00000000..b65a8304 Binary files /dev/null and b/public/guides/6/6_15/3.jpg differ diff --git a/public/guides/6/6_15/4.jpg b/public/guides/6/6_15/4.jpg new file mode 100644 index 00000000..730f2a5c Binary files /dev/null and b/public/guides/6/6_15/4.jpg differ diff --git a/public/guides/6/6_15/5.jpg b/public/guides/6/6_15/5.jpg new file mode 100644 index 00000000..d932f2ba Binary files /dev/null and b/public/guides/6/6_15/5.jpg differ diff --git a/public/guides/6/6_16/1.jpg b/public/guides/6/6_16/1.jpg new file mode 100644 index 00000000..561d8823 Binary files /dev/null and b/public/guides/6/6_16/1.jpg differ diff --git a/public/guides/6/6_16/2.jpg b/public/guides/6/6_16/2.jpg new file mode 100644 index 00000000..b678b429 Binary files /dev/null and b/public/guides/6/6_16/2.jpg differ diff --git a/public/guides/6/6_16/3.jpg b/public/guides/6/6_16/3.jpg new file mode 100644 index 00000000..d5a86044 Binary files /dev/null and b/public/guides/6/6_16/3.jpg differ diff --git a/public/guides/6/6_16/4.jpg b/public/guides/6/6_16/4.jpg new file mode 100644 index 00000000..96a09456 Binary files /dev/null and b/public/guides/6/6_16/4.jpg differ diff --git a/public/guides/6/6_16/5.jpg b/public/guides/6/6_16/5.jpg new file mode 100644 index 00000000..86a648bb Binary files /dev/null and b/public/guides/6/6_16/5.jpg differ diff --git a/public/guides/6/6_17/1.jpg b/public/guides/6/6_17/1.jpg new file mode 100644 index 00000000..a35569d7 Binary files /dev/null and b/public/guides/6/6_17/1.jpg differ diff --git a/public/guides/6/6_17/2.jpg b/public/guides/6/6_17/2.jpg new file mode 100644 index 00000000..bee15b37 Binary files /dev/null and b/public/guides/6/6_17/2.jpg differ diff --git a/public/guides/6/6_17/3.jpg b/public/guides/6/6_17/3.jpg new file mode 100644 index 00000000..adac470e Binary files /dev/null and b/public/guides/6/6_17/3.jpg differ diff --git a/public/guides/6/6_17/4.jpg b/public/guides/6/6_17/4.jpg new file mode 100644 index 00000000..3dac4e24 Binary files /dev/null and b/public/guides/6/6_17/4.jpg differ diff --git a/public/guides/6/6_17/5.jpg b/public/guides/6/6_17/5.jpg new file mode 100644 index 00000000..68ee0378 Binary files /dev/null and b/public/guides/6/6_17/5.jpg differ diff --git a/public/guides/6/6_18/1.jpg b/public/guides/6/6_18/1.jpg new file mode 100644 index 00000000..230dc619 Binary files /dev/null and b/public/guides/6/6_18/1.jpg differ diff --git a/public/guides/6/6_18/2.jpg b/public/guides/6/6_18/2.jpg new file mode 100644 index 00000000..3852dc23 Binary files /dev/null and b/public/guides/6/6_18/2.jpg differ diff --git a/public/guides/6/6_18/3.jpg b/public/guides/6/6_18/3.jpg new file mode 100644 index 00000000..f93af035 Binary files /dev/null and b/public/guides/6/6_18/3.jpg differ diff --git a/public/guides/6/6_18/4.jpg b/public/guides/6/6_18/4.jpg new file mode 100644 index 00000000..181f7efa Binary files /dev/null and b/public/guides/6/6_18/4.jpg differ diff --git a/public/guides/6/6_18/5.jpg b/public/guides/6/6_18/5.jpg new file mode 100644 index 00000000..3427d3da Binary files /dev/null and b/public/guides/6/6_18/5.jpg differ diff --git a/public/guides/6/6_19/1.jpg b/public/guides/6/6_19/1.jpg new file mode 100644 index 00000000..06824af9 Binary files /dev/null and b/public/guides/6/6_19/1.jpg differ diff --git a/public/guides/6/6_19/2.jpg b/public/guides/6/6_19/2.jpg new file mode 100644 index 00000000..f1a3629f Binary files /dev/null and b/public/guides/6/6_19/2.jpg differ diff --git a/public/guides/6/6_19/3.JPG b/public/guides/6/6_19/3.JPG new file mode 100644 index 00000000..c3725ed6 Binary files /dev/null and b/public/guides/6/6_19/3.JPG differ diff --git a/public/guides/6/6_19/3.jpg b/public/guides/6/6_19/3.jpg new file mode 100644 index 00000000..c3725ed6 Binary files /dev/null and b/public/guides/6/6_19/3.jpg differ diff --git a/public/guides/6/6_19/4.jpg b/public/guides/6/6_19/4.jpg new file mode 100644 index 00000000..9e848bd8 Binary files /dev/null and b/public/guides/6/6_19/4.jpg differ diff --git a/public/guides/6/6_19/5.jpg b/public/guides/6/6_19/5.jpg new file mode 100644 index 00000000..7ea8d1a0 Binary files /dev/null and b/public/guides/6/6_19/5.jpg differ diff --git a/public/guides/6/6_2/1.jpg b/public/guides/6/6_2/1.jpg new file mode 100644 index 00000000..aec4d930 Binary files /dev/null and b/public/guides/6/6_2/1.jpg differ diff --git a/public/guides/6/6_2/2.JPG b/public/guides/6/6_2/2.JPG new file mode 100644 index 00000000..07fd0f2e Binary files /dev/null and b/public/guides/6/6_2/2.JPG differ diff --git a/public/guides/6/6_2/2.jpg b/public/guides/6/6_2/2.jpg new file mode 100644 index 00000000..07fd0f2e Binary files /dev/null and b/public/guides/6/6_2/2.jpg differ diff --git a/public/guides/6/6_2/3.JPG b/public/guides/6/6_2/3.JPG new file mode 100644 index 00000000..f76c669e Binary files /dev/null and b/public/guides/6/6_2/3.JPG differ diff --git a/public/guides/6/6_2/3.jpg b/public/guides/6/6_2/3.jpg new file mode 100644 index 00000000..f76c669e Binary files /dev/null and b/public/guides/6/6_2/3.jpg differ diff --git a/public/guides/6/6_2/4.JPG b/public/guides/6/6_2/4.JPG new file mode 100644 index 00000000..a31aa415 Binary files /dev/null and b/public/guides/6/6_2/4.JPG differ diff --git a/public/guides/6/6_2/4.jpg b/public/guides/6/6_2/4.jpg new file mode 100644 index 00000000..a31aa415 Binary files /dev/null and b/public/guides/6/6_2/4.jpg differ diff --git a/public/guides/6/6_2/5.JPG b/public/guides/6/6_2/5.JPG new file mode 100644 index 00000000..aa4fcbda Binary files /dev/null and b/public/guides/6/6_2/5.JPG differ diff --git a/public/guides/6/6_2/5.jpg b/public/guides/6/6_2/5.jpg new file mode 100644 index 00000000..aa4fcbda Binary files /dev/null and b/public/guides/6/6_2/5.jpg differ diff --git a/public/guides/6/6_20/1.jpg b/public/guides/6/6_20/1.jpg new file mode 100644 index 00000000..f6c0dcf1 Binary files /dev/null and b/public/guides/6/6_20/1.jpg differ diff --git a/public/guides/6/6_20/2.jpg b/public/guides/6/6_20/2.jpg new file mode 100644 index 00000000..85a137f1 Binary files /dev/null and b/public/guides/6/6_20/2.jpg differ diff --git a/public/guides/6/6_20/3.jpg b/public/guides/6/6_20/3.jpg new file mode 100644 index 00000000..65d2130d Binary files /dev/null and b/public/guides/6/6_20/3.jpg differ diff --git a/public/guides/6/6_20/4.jpg b/public/guides/6/6_20/4.jpg new file mode 100644 index 00000000..7928911f Binary files /dev/null and b/public/guides/6/6_20/4.jpg differ diff --git a/public/guides/6/6_20/5.jpg b/public/guides/6/6_20/5.jpg new file mode 100644 index 00000000..f7344551 Binary files /dev/null and b/public/guides/6/6_20/5.jpg differ diff --git a/public/guides/6/6_21/1.jpg b/public/guides/6/6_21/1.jpg new file mode 100644 index 00000000..cf785c1c Binary files /dev/null and b/public/guides/6/6_21/1.jpg differ diff --git a/public/guides/6/6_21/2.jpg b/public/guides/6/6_21/2.jpg new file mode 100644 index 00000000..2572cb61 Binary files /dev/null and b/public/guides/6/6_21/2.jpg differ diff --git a/public/guides/6/6_21/3.jpg b/public/guides/6/6_21/3.jpg new file mode 100644 index 00000000..65052284 Binary files /dev/null and b/public/guides/6/6_21/3.jpg differ diff --git a/public/guides/6/6_21/4.jpg b/public/guides/6/6_21/4.jpg new file mode 100644 index 00000000..f3bf34b7 Binary files /dev/null and b/public/guides/6/6_21/4.jpg differ diff --git a/public/guides/6/6_21/5.jpg b/public/guides/6/6_21/5.jpg new file mode 100644 index 00000000..a32f275b Binary files /dev/null and b/public/guides/6/6_21/5.jpg differ diff --git a/public/guides/6/6_22/1.JPG b/public/guides/6/6_22/1.JPG new file mode 100644 index 00000000..d3d132c0 Binary files /dev/null and b/public/guides/6/6_22/1.JPG differ diff --git a/public/guides/6/6_22/1.jpg b/public/guides/6/6_22/1.jpg new file mode 100644 index 00000000..d3d132c0 Binary files /dev/null and b/public/guides/6/6_22/1.jpg differ diff --git a/public/guides/6/6_22/2.jpg b/public/guides/6/6_22/2.jpg new file mode 100644 index 00000000..ede799ce Binary files /dev/null and b/public/guides/6/6_22/2.jpg differ diff --git a/public/guides/6/6_22/3.JPG b/public/guides/6/6_22/3.JPG new file mode 100644 index 00000000..2edd6e4d Binary files /dev/null and b/public/guides/6/6_22/3.JPG differ diff --git a/public/guides/6/6_22/3.jpg b/public/guides/6/6_22/3.jpg new file mode 100644 index 00000000..2edd6e4d Binary files /dev/null and b/public/guides/6/6_22/3.jpg differ diff --git a/public/guides/6/6_22/4.jpg b/public/guides/6/6_22/4.jpg new file mode 100644 index 00000000..b92a6d9e Binary files /dev/null and b/public/guides/6/6_22/4.jpg differ diff --git a/public/guides/6/6_22/5.jpg b/public/guides/6/6_22/5.jpg new file mode 100644 index 00000000..3932f6a9 Binary files /dev/null and b/public/guides/6/6_22/5.jpg differ diff --git a/public/guides/6/6_3/1.JPG b/public/guides/6/6_3/1.JPG new file mode 100644 index 00000000..19c30caa Binary files /dev/null and b/public/guides/6/6_3/1.JPG differ diff --git a/public/guides/6/6_3/1.jpg b/public/guides/6/6_3/1.jpg new file mode 100644 index 00000000..19c30caa Binary files /dev/null and b/public/guides/6/6_3/1.jpg differ diff --git a/public/guides/6/6_3/2.JPG b/public/guides/6/6_3/2.JPG new file mode 100644 index 00000000..519831e9 Binary files /dev/null and b/public/guides/6/6_3/2.JPG differ diff --git a/public/guides/6/6_3/2.jpg b/public/guides/6/6_3/2.jpg new file mode 100644 index 00000000..519831e9 Binary files /dev/null and b/public/guides/6/6_3/2.jpg differ diff --git a/public/guides/6/6_3/3.jpg b/public/guides/6/6_3/3.jpg new file mode 100644 index 00000000..41be3b44 Binary files /dev/null and b/public/guides/6/6_3/3.jpg differ diff --git a/public/guides/6/6_3/4.JPG b/public/guides/6/6_3/4.JPG new file mode 100644 index 00000000..330bec5f Binary files /dev/null and b/public/guides/6/6_3/4.JPG differ diff --git a/public/guides/6/6_3/4.jpg b/public/guides/6/6_3/4.jpg new file mode 100644 index 00000000..330bec5f Binary files /dev/null and b/public/guides/6/6_3/4.jpg differ diff --git a/public/guides/6/6_3/5.jpg b/public/guides/6/6_3/5.jpg new file mode 100644 index 00000000..84d722cf Binary files /dev/null and b/public/guides/6/6_3/5.jpg differ diff --git a/public/guides/6/6_4/1.JPG b/public/guides/6/6_4/1.JPG new file mode 100644 index 00000000..cb7c00e5 Binary files /dev/null and b/public/guides/6/6_4/1.JPG differ diff --git a/public/guides/6/6_4/1.jpg b/public/guides/6/6_4/1.jpg new file mode 100644 index 00000000..cb7c00e5 Binary files /dev/null and b/public/guides/6/6_4/1.jpg differ diff --git a/public/guides/6/6_4/2.JPG b/public/guides/6/6_4/2.JPG new file mode 100644 index 00000000..c28e77cc Binary files /dev/null and b/public/guides/6/6_4/2.JPG differ diff --git a/public/guides/6/6_4/2.jpg b/public/guides/6/6_4/2.jpg new file mode 100644 index 00000000..c28e77cc Binary files /dev/null and b/public/guides/6/6_4/2.jpg differ diff --git a/public/guides/6/6_4/3.JPG b/public/guides/6/6_4/3.JPG new file mode 100644 index 00000000..6a1feed4 Binary files /dev/null and b/public/guides/6/6_4/3.JPG differ diff --git a/public/guides/6/6_4/3.jpg b/public/guides/6/6_4/3.jpg new file mode 100644 index 00000000..6a1feed4 Binary files /dev/null and b/public/guides/6/6_4/3.jpg differ diff --git a/public/guides/6/6_4/4.JPG b/public/guides/6/6_4/4.JPG new file mode 100644 index 00000000..d944f2dd Binary files /dev/null and b/public/guides/6/6_4/4.JPG differ diff --git a/public/guides/6/6_4/4.jpg b/public/guides/6/6_4/4.jpg new file mode 100644 index 00000000..d944f2dd Binary files /dev/null and b/public/guides/6/6_4/4.jpg differ diff --git a/public/guides/6/6_4/5.jpg b/public/guides/6/6_4/5.jpg new file mode 100644 index 00000000..b6a14e4b Binary files /dev/null and b/public/guides/6/6_4/5.jpg differ diff --git a/public/guides/6/6_5/1.jpg b/public/guides/6/6_5/1.jpg new file mode 100644 index 00000000..41e35066 Binary files /dev/null and b/public/guides/6/6_5/1.jpg differ diff --git a/public/guides/6/6_5/2.JPG b/public/guides/6/6_5/2.JPG new file mode 100644 index 00000000..ed4c9626 Binary files /dev/null and b/public/guides/6/6_5/2.JPG differ diff --git a/public/guides/6/6_5/2.jpg b/public/guides/6/6_5/2.jpg new file mode 100644 index 00000000..ed4c9626 Binary files /dev/null and b/public/guides/6/6_5/2.jpg differ diff --git a/public/guides/6/6_5/3.jpg b/public/guides/6/6_5/3.jpg new file mode 100644 index 00000000..f88850e2 Binary files /dev/null and b/public/guides/6/6_5/3.jpg differ diff --git a/public/guides/6/6_5/4.jpg b/public/guides/6/6_5/4.jpg new file mode 100644 index 00000000..3dc0abce Binary files /dev/null and b/public/guides/6/6_5/4.jpg differ diff --git a/public/guides/6/6_5/5.JPG b/public/guides/6/6_5/5.JPG new file mode 100644 index 00000000..700d96b3 Binary files /dev/null and b/public/guides/6/6_5/5.JPG differ diff --git a/public/guides/6/6_5/5.jpg b/public/guides/6/6_5/5.jpg new file mode 100644 index 00000000..700d96b3 Binary files /dev/null and b/public/guides/6/6_5/5.jpg differ diff --git a/public/guides/6/6_6/1.JPG b/public/guides/6/6_6/1.JPG new file mode 100644 index 00000000..9e4a6647 Binary files /dev/null and b/public/guides/6/6_6/1.JPG differ diff --git a/public/guides/6/6_6/1.jpg b/public/guides/6/6_6/1.jpg new file mode 100644 index 00000000..9e4a6647 Binary files /dev/null and b/public/guides/6/6_6/1.jpg differ diff --git a/public/guides/6/6_6/2.JPG b/public/guides/6/6_6/2.JPG new file mode 100644 index 00000000..712e820e Binary files /dev/null and b/public/guides/6/6_6/2.JPG differ diff --git a/public/guides/6/6_6/2.jpg b/public/guides/6/6_6/2.jpg new file mode 100644 index 00000000..712e820e Binary files /dev/null and b/public/guides/6/6_6/2.jpg differ diff --git a/public/guides/6/6_6/3.JPG b/public/guides/6/6_6/3.JPG new file mode 100644 index 00000000..f5604c07 Binary files /dev/null and b/public/guides/6/6_6/3.JPG differ diff --git a/public/guides/6/6_6/3.jpg b/public/guides/6/6_6/3.jpg new file mode 100644 index 00000000..f5604c07 Binary files /dev/null and b/public/guides/6/6_6/3.jpg differ diff --git a/public/guides/6/6_6/4.JPG b/public/guides/6/6_6/4.JPG new file mode 100644 index 00000000..12862098 Binary files /dev/null and b/public/guides/6/6_6/4.JPG differ diff --git a/public/guides/6/6_6/4.jpg b/public/guides/6/6_6/4.jpg new file mode 100644 index 00000000..12862098 Binary files /dev/null and b/public/guides/6/6_6/4.jpg differ diff --git a/public/guides/6/6_6/5.JPG b/public/guides/6/6_6/5.JPG new file mode 100644 index 00000000..235d08d1 Binary files /dev/null and b/public/guides/6/6_6/5.JPG differ diff --git a/public/guides/6/6_6/5.jpg b/public/guides/6/6_6/5.jpg new file mode 100644 index 00000000..235d08d1 Binary files /dev/null and b/public/guides/6/6_6/5.jpg differ diff --git a/public/guides/6/6_7/1.JPG b/public/guides/6/6_7/1.JPG new file mode 100644 index 00000000..34945cd3 Binary files /dev/null and b/public/guides/6/6_7/1.JPG differ diff --git a/public/guides/6/6_7/1.jpg b/public/guides/6/6_7/1.jpg new file mode 100644 index 00000000..34945cd3 Binary files /dev/null and b/public/guides/6/6_7/1.jpg differ diff --git a/public/guides/6/6_7/2.JPG b/public/guides/6/6_7/2.JPG new file mode 100644 index 00000000..6b19b624 Binary files /dev/null and b/public/guides/6/6_7/2.JPG differ diff --git a/public/guides/6/6_7/2.jpg b/public/guides/6/6_7/2.jpg new file mode 100644 index 00000000..6b19b624 Binary files /dev/null and b/public/guides/6/6_7/2.jpg differ diff --git a/public/guides/6/6_7/3.JPG b/public/guides/6/6_7/3.JPG new file mode 100644 index 00000000..b9e79005 Binary files /dev/null and b/public/guides/6/6_7/3.JPG differ diff --git a/public/guides/6/6_7/3.jpg b/public/guides/6/6_7/3.jpg new file mode 100644 index 00000000..b9e79005 Binary files /dev/null and b/public/guides/6/6_7/3.jpg differ diff --git a/public/guides/6/6_7/4.JPG b/public/guides/6/6_7/4.JPG new file mode 100644 index 00000000..ffce7657 Binary files /dev/null and b/public/guides/6/6_7/4.JPG differ diff --git a/public/guides/6/6_7/4.jpg b/public/guides/6/6_7/4.jpg new file mode 100644 index 00000000..ffce7657 Binary files /dev/null and b/public/guides/6/6_7/4.jpg differ diff --git a/public/guides/6/6_7/5.JPG b/public/guides/6/6_7/5.JPG new file mode 100644 index 00000000..66cc6569 Binary files /dev/null and b/public/guides/6/6_7/5.JPG differ diff --git a/public/guides/6/6_7/5.jpg b/public/guides/6/6_7/5.jpg new file mode 100644 index 00000000..66cc6569 Binary files /dev/null and b/public/guides/6/6_7/5.jpg differ diff --git a/public/guides/6/6_8/1.JPG b/public/guides/6/6_8/1.JPG new file mode 100644 index 00000000..ec3d9317 Binary files /dev/null and b/public/guides/6/6_8/1.JPG differ diff --git a/public/guides/6/6_8/1.jpg b/public/guides/6/6_8/1.jpg new file mode 100644 index 00000000..ec3d9317 Binary files /dev/null and b/public/guides/6/6_8/1.jpg differ diff --git a/public/guides/6/6_8/2.JPG b/public/guides/6/6_8/2.JPG new file mode 100644 index 00000000..abf3109e Binary files /dev/null and b/public/guides/6/6_8/2.JPG differ diff --git a/public/guides/6/6_8/2.jpg b/public/guides/6/6_8/2.jpg new file mode 100644 index 00000000..abf3109e Binary files /dev/null and b/public/guides/6/6_8/2.jpg differ diff --git a/public/guides/6/6_8/3.JPG b/public/guides/6/6_8/3.JPG new file mode 100644 index 00000000..5ce46993 Binary files /dev/null and b/public/guides/6/6_8/3.JPG differ diff --git a/public/guides/6/6_8/3.jpg b/public/guides/6/6_8/3.jpg new file mode 100644 index 00000000..5ce46993 Binary files /dev/null and b/public/guides/6/6_8/3.jpg differ diff --git a/public/guides/6/6_8/4.jpg b/public/guides/6/6_8/4.jpg new file mode 100644 index 00000000..15dddabc Binary files /dev/null and b/public/guides/6/6_8/4.jpg differ diff --git a/public/guides/6/6_8/5.JPG b/public/guides/6/6_8/5.JPG new file mode 100644 index 00000000..0cf0bb6a Binary files /dev/null and b/public/guides/6/6_8/5.JPG differ diff --git a/public/guides/6/6_8/5.jpg b/public/guides/6/6_8/5.jpg new file mode 100644 index 00000000..0cf0bb6a Binary files /dev/null and b/public/guides/6/6_8/5.jpg differ diff --git a/public/guides/6/6_9/1.JPG b/public/guides/6/6_9/1.JPG new file mode 100644 index 00000000..1c6b8b25 Binary files /dev/null and b/public/guides/6/6_9/1.JPG differ diff --git a/public/guides/6/6_9/1.jpg b/public/guides/6/6_9/1.jpg new file mode 100644 index 00000000..1c6b8b25 Binary files /dev/null and b/public/guides/6/6_9/1.jpg differ diff --git a/public/guides/6/6_9/2.JPG b/public/guides/6/6_9/2.JPG new file mode 100644 index 00000000..885c4239 Binary files /dev/null and b/public/guides/6/6_9/2.JPG differ diff --git a/public/guides/6/6_9/2.jpg b/public/guides/6/6_9/2.jpg new file mode 100644 index 00000000..885c4239 Binary files /dev/null and b/public/guides/6/6_9/2.jpg differ diff --git a/public/guides/6/6_9/3.JPG b/public/guides/6/6_9/3.JPG new file mode 100644 index 00000000..649fb25a Binary files /dev/null and b/public/guides/6/6_9/3.JPG differ diff --git a/public/guides/6/6_9/3.jpg b/public/guides/6/6_9/3.jpg new file mode 100644 index 00000000..649fb25a Binary files /dev/null and b/public/guides/6/6_9/3.jpg differ diff --git a/public/guides/6/6_9/4.JPG b/public/guides/6/6_9/4.JPG new file mode 100644 index 00000000..9d14a18f Binary files /dev/null and b/public/guides/6/6_9/4.JPG differ diff --git a/public/guides/6/6_9/4.jpg b/public/guides/6/6_9/4.jpg new file mode 100644 index 00000000..9d14a18f Binary files /dev/null and b/public/guides/6/6_9/4.jpg differ diff --git a/public/guides/6/6_9/5.JPG b/public/guides/6/6_9/5.JPG new file mode 100644 index 00000000..fae73dca Binary files /dev/null and b/public/guides/6/6_9/5.JPG differ diff --git a/public/guides/6/6_9/5.jpg b/public/guides/6/6_9/5.jpg new file mode 100644 index 00000000..fae73dca Binary files /dev/null and b/public/guides/6/6_9/5.jpg differ diff --git "a/public/guides/6/6_COLOR_\354\203\211\354\203\201 \354\235\270\354\213\235\352\270\260.jpg" "b/public/guides/6/6_COLOR_\354\203\211\354\203\201 \354\235\270\354\213\235\352\270\260.jpg" new file mode 100644 index 00000000..8d12618a Binary files /dev/null and "b/public/guides/6/6_COLOR_\354\203\211\354\203\201 \354\235\270\354\213\235\352\270\260.jpg" differ diff --git a/public/guides/7/7_1/1.jpg b/public/guides/7/7_1/1.jpg new file mode 100644 index 00000000..e6340620 Binary files /dev/null and b/public/guides/7/7_1/1.jpg differ diff --git a/public/guides/7/7_1/2.jpg b/public/guides/7/7_1/2.jpg new file mode 100644 index 00000000..b397df9b Binary files /dev/null and b/public/guides/7/7_1/2.jpg differ diff --git a/public/guides/7/7_1/3.jpg b/public/guides/7/7_1/3.jpg new file mode 100644 index 00000000..79fc0dd4 Binary files /dev/null and b/public/guides/7/7_1/3.jpg differ diff --git a/public/guides/7/7_1/4.jpg b/public/guides/7/7_1/4.jpg new file mode 100644 index 00000000..9c92102a Binary files /dev/null and b/public/guides/7/7_1/4.jpg differ diff --git a/public/guides/7/7_1/5.jpg b/public/guides/7/7_1/5.jpg new file mode 100644 index 00000000..effa1cf9 Binary files /dev/null and b/public/guides/7/7_1/5.jpg differ diff --git a/public/guides/7/7_10/1.jpg b/public/guides/7/7_10/1.jpg new file mode 100644 index 00000000..6dbc5a67 Binary files /dev/null and b/public/guides/7/7_10/1.jpg differ diff --git a/public/guides/7/7_10/2.jpg b/public/guides/7/7_10/2.jpg new file mode 100644 index 00000000..65d3423f Binary files /dev/null and b/public/guides/7/7_10/2.jpg differ diff --git a/public/guides/7/7_10/3.jpg b/public/guides/7/7_10/3.jpg new file mode 100644 index 00000000..ea68964e Binary files /dev/null and b/public/guides/7/7_10/3.jpg differ diff --git a/public/guides/7/7_10/4.jpg b/public/guides/7/7_10/4.jpg new file mode 100644 index 00000000..1f533530 Binary files /dev/null and b/public/guides/7/7_10/4.jpg differ diff --git a/public/guides/7/7_10/5.jpg b/public/guides/7/7_10/5.jpg new file mode 100644 index 00000000..03dbb7cc Binary files /dev/null and b/public/guides/7/7_10/5.jpg differ diff --git a/public/guides/7/7_11/1.jpg b/public/guides/7/7_11/1.jpg new file mode 100644 index 00000000..cfd1148d Binary files /dev/null and b/public/guides/7/7_11/1.jpg differ diff --git a/public/guides/7/7_11/2.jpg b/public/guides/7/7_11/2.jpg new file mode 100644 index 00000000..9c87b4e5 Binary files /dev/null and b/public/guides/7/7_11/2.jpg differ diff --git a/public/guides/7/7_11/3.jpg b/public/guides/7/7_11/3.jpg new file mode 100644 index 00000000..71bebc29 Binary files /dev/null and b/public/guides/7/7_11/3.jpg differ diff --git a/public/guides/7/7_11/4.jpg b/public/guides/7/7_11/4.jpg new file mode 100644 index 00000000..bc25da5c Binary files /dev/null and b/public/guides/7/7_11/4.jpg differ diff --git a/public/guides/7/7_11/5.jpg b/public/guides/7/7_11/5.jpg new file mode 100644 index 00000000..315940e3 Binary files /dev/null and b/public/guides/7/7_11/5.jpg differ diff --git a/public/guides/7/7_12/1.JPG b/public/guides/7/7_12/1.JPG new file mode 100644 index 00000000..d3c7f812 Binary files /dev/null and b/public/guides/7/7_12/1.JPG differ diff --git a/public/guides/7/7_12/1.jpg b/public/guides/7/7_12/1.jpg new file mode 100644 index 00000000..d3c7f812 Binary files /dev/null and b/public/guides/7/7_12/1.jpg differ diff --git a/public/guides/7/7_12/2.jpg b/public/guides/7/7_12/2.jpg new file mode 100644 index 00000000..ca7f05c5 Binary files /dev/null and b/public/guides/7/7_12/2.jpg differ diff --git a/public/guides/7/7_12/3.jpg b/public/guides/7/7_12/3.jpg new file mode 100644 index 00000000..34374931 Binary files /dev/null and b/public/guides/7/7_12/3.jpg differ diff --git a/public/guides/7/7_12/4.jpg b/public/guides/7/7_12/4.jpg new file mode 100644 index 00000000..3d9855ff Binary files /dev/null and b/public/guides/7/7_12/4.jpg differ diff --git a/public/guides/7/7_12/5.jpg b/public/guides/7/7_12/5.jpg new file mode 100644 index 00000000..e1155300 Binary files /dev/null and b/public/guides/7/7_12/5.jpg differ diff --git a/public/guides/7/7_13/1.jpg b/public/guides/7/7_13/1.jpg new file mode 100644 index 00000000..4f1355b0 Binary files /dev/null and b/public/guides/7/7_13/1.jpg differ diff --git a/public/guides/7/7_13/2.jpg b/public/guides/7/7_13/2.jpg new file mode 100644 index 00000000..97fa33ca Binary files /dev/null and b/public/guides/7/7_13/2.jpg differ diff --git a/public/guides/7/7_13/3.jpg b/public/guides/7/7_13/3.jpg new file mode 100644 index 00000000..a7158488 Binary files /dev/null and b/public/guides/7/7_13/3.jpg differ diff --git a/public/guides/7/7_13/4.jpg b/public/guides/7/7_13/4.jpg new file mode 100644 index 00000000..5206cfbc Binary files /dev/null and b/public/guides/7/7_13/4.jpg differ diff --git a/public/guides/7/7_13/5.jpg b/public/guides/7/7_13/5.jpg new file mode 100644 index 00000000..a58e9a38 Binary files /dev/null and b/public/guides/7/7_13/5.jpg differ diff --git a/public/guides/7/7_14/1.jpg b/public/guides/7/7_14/1.jpg new file mode 100644 index 00000000..5440cd6b Binary files /dev/null and b/public/guides/7/7_14/1.jpg differ diff --git a/public/guides/7/7_14/2.jpg b/public/guides/7/7_14/2.jpg new file mode 100644 index 00000000..b3940498 Binary files /dev/null and b/public/guides/7/7_14/2.jpg differ diff --git a/public/guides/7/7_14/3.jpg b/public/guides/7/7_14/3.jpg new file mode 100644 index 00000000..652618f3 Binary files /dev/null and b/public/guides/7/7_14/3.jpg differ diff --git a/public/guides/7/7_14/4.jpg b/public/guides/7/7_14/4.jpg new file mode 100644 index 00000000..e11caeed Binary files /dev/null and b/public/guides/7/7_14/4.jpg differ diff --git a/public/guides/7/7_14/5.jpg b/public/guides/7/7_14/5.jpg new file mode 100644 index 00000000..d8eec48d Binary files /dev/null and b/public/guides/7/7_14/5.jpg differ diff --git a/public/guides/7/7_15/1.jpg b/public/guides/7/7_15/1.jpg new file mode 100644 index 00000000..ce32ba40 Binary files /dev/null and b/public/guides/7/7_15/1.jpg differ diff --git a/public/guides/7/7_15/2.jpg b/public/guides/7/7_15/2.jpg new file mode 100644 index 00000000..b5fe6471 Binary files /dev/null and b/public/guides/7/7_15/2.jpg differ diff --git a/public/guides/7/7_15/3.jpg b/public/guides/7/7_15/3.jpg new file mode 100644 index 00000000..8f04bfaa Binary files /dev/null and b/public/guides/7/7_15/3.jpg differ diff --git a/public/guides/7/7_15/4.jpg b/public/guides/7/7_15/4.jpg new file mode 100644 index 00000000..953ecb38 Binary files /dev/null and b/public/guides/7/7_15/4.jpg differ diff --git a/public/guides/7/7_15/5.jpg b/public/guides/7/7_15/5.jpg new file mode 100644 index 00000000..c923ab46 Binary files /dev/null and b/public/guides/7/7_15/5.jpg differ diff --git a/public/guides/7/7_16/1.jpg b/public/guides/7/7_16/1.jpg new file mode 100644 index 00000000..96a1549c Binary files /dev/null and b/public/guides/7/7_16/1.jpg differ diff --git a/public/guides/7/7_16/2.jpg b/public/guides/7/7_16/2.jpg new file mode 100644 index 00000000..e24e9c2f Binary files /dev/null and b/public/guides/7/7_16/2.jpg differ diff --git a/public/guides/7/7_16/3.jpg b/public/guides/7/7_16/3.jpg new file mode 100644 index 00000000..81ba0729 Binary files /dev/null and b/public/guides/7/7_16/3.jpg differ diff --git a/public/guides/7/7_16/4.jpg b/public/guides/7/7_16/4.jpg new file mode 100644 index 00000000..b5918cd2 Binary files /dev/null and b/public/guides/7/7_16/4.jpg differ diff --git a/public/guides/7/7_16/5.jpg b/public/guides/7/7_16/5.jpg new file mode 100644 index 00000000..7e434362 Binary files /dev/null and b/public/guides/7/7_16/5.jpg differ diff --git a/public/guides/7/7_17/1.jpg b/public/guides/7/7_17/1.jpg new file mode 100644 index 00000000..dfe7c812 Binary files /dev/null and b/public/guides/7/7_17/1.jpg differ diff --git a/public/guides/7/7_17/2.jpg b/public/guides/7/7_17/2.jpg new file mode 100644 index 00000000..323ca28c Binary files /dev/null and b/public/guides/7/7_17/2.jpg differ diff --git a/public/guides/7/7_17/3.jpg b/public/guides/7/7_17/3.jpg new file mode 100644 index 00000000..9fa7e7b6 Binary files /dev/null and b/public/guides/7/7_17/3.jpg differ diff --git a/public/guides/7/7_17/4.jpg b/public/guides/7/7_17/4.jpg new file mode 100644 index 00000000..f6fb3be4 Binary files /dev/null and b/public/guides/7/7_17/4.jpg differ diff --git a/public/guides/7/7_17/5.jpg b/public/guides/7/7_17/5.jpg new file mode 100644 index 00000000..15348050 Binary files /dev/null and b/public/guides/7/7_17/5.jpg differ diff --git a/public/guides/7/7_2/1.jpg b/public/guides/7/7_2/1.jpg new file mode 100644 index 00000000..0c004e8a Binary files /dev/null and b/public/guides/7/7_2/1.jpg differ diff --git a/public/guides/7/7_2/2.jpg b/public/guides/7/7_2/2.jpg new file mode 100644 index 00000000..88f76ae9 Binary files /dev/null and b/public/guides/7/7_2/2.jpg differ diff --git a/public/guides/7/7_2/3.jpg b/public/guides/7/7_2/3.jpg new file mode 100644 index 00000000..99afe803 Binary files /dev/null and b/public/guides/7/7_2/3.jpg differ diff --git a/public/guides/7/7_2/4.jpg b/public/guides/7/7_2/4.jpg new file mode 100644 index 00000000..8998307f Binary files /dev/null and b/public/guides/7/7_2/4.jpg differ diff --git a/public/guides/7/7_2/5.jpg b/public/guides/7/7_2/5.jpg new file mode 100644 index 00000000..8095de63 Binary files /dev/null and b/public/guides/7/7_2/5.jpg differ diff --git a/public/guides/7/7_3/1.jpg b/public/guides/7/7_3/1.jpg new file mode 100644 index 00000000..a61d1592 Binary files /dev/null and b/public/guides/7/7_3/1.jpg differ diff --git a/public/guides/7/7_3/2.jpg b/public/guides/7/7_3/2.jpg new file mode 100644 index 00000000..3deca0d3 Binary files /dev/null and b/public/guides/7/7_3/2.jpg differ diff --git a/public/guides/7/7_3/3.jpg b/public/guides/7/7_3/3.jpg new file mode 100644 index 00000000..cfdb254f Binary files /dev/null and b/public/guides/7/7_3/3.jpg differ diff --git a/public/guides/7/7_3/4.jpg b/public/guides/7/7_3/4.jpg new file mode 100644 index 00000000..f4eafb0f Binary files /dev/null and b/public/guides/7/7_3/4.jpg differ diff --git a/public/guides/7/7_3/5.jpg b/public/guides/7/7_3/5.jpg new file mode 100644 index 00000000..f7104058 Binary files /dev/null and b/public/guides/7/7_3/5.jpg differ diff --git a/public/guides/7/7_4/1.jpg b/public/guides/7/7_4/1.jpg new file mode 100644 index 00000000..67d27580 Binary files /dev/null and b/public/guides/7/7_4/1.jpg differ diff --git a/public/guides/7/7_4/2.jpg b/public/guides/7/7_4/2.jpg new file mode 100644 index 00000000..75d5e668 Binary files /dev/null and b/public/guides/7/7_4/2.jpg differ diff --git a/public/guides/7/7_4/3.jpg b/public/guides/7/7_4/3.jpg new file mode 100644 index 00000000..853e9b4a Binary files /dev/null and b/public/guides/7/7_4/3.jpg differ diff --git a/public/guides/7/7_4/4.jpg b/public/guides/7/7_4/4.jpg new file mode 100644 index 00000000..c2b90807 Binary files /dev/null and b/public/guides/7/7_4/4.jpg differ diff --git a/public/guides/7/7_4/5.jpg b/public/guides/7/7_4/5.jpg new file mode 100644 index 00000000..b50e13f3 Binary files /dev/null and b/public/guides/7/7_4/5.jpg differ diff --git a/public/guides/7/7_5/1.jpg b/public/guides/7/7_5/1.jpg new file mode 100644 index 00000000..f099749a Binary files /dev/null and b/public/guides/7/7_5/1.jpg differ diff --git a/public/guides/7/7_5/2.jpg b/public/guides/7/7_5/2.jpg new file mode 100644 index 00000000..c01a2d91 Binary files /dev/null and b/public/guides/7/7_5/2.jpg differ diff --git a/public/guides/7/7_5/3.jpg b/public/guides/7/7_5/3.jpg new file mode 100644 index 00000000..667e03eb Binary files /dev/null and b/public/guides/7/7_5/3.jpg differ diff --git a/public/guides/7/7_5/4.jpg b/public/guides/7/7_5/4.jpg new file mode 100644 index 00000000..9e757c9f Binary files /dev/null and b/public/guides/7/7_5/4.jpg differ diff --git a/public/guides/7/7_5/5.jpg b/public/guides/7/7_5/5.jpg new file mode 100644 index 00000000..154ad15f Binary files /dev/null and b/public/guides/7/7_5/5.jpg differ diff --git a/public/guides/7/7_6/1.jpg b/public/guides/7/7_6/1.jpg new file mode 100644 index 00000000..52ed8bd6 Binary files /dev/null and b/public/guides/7/7_6/1.jpg differ diff --git a/public/guides/7/7_6/2.jpg b/public/guides/7/7_6/2.jpg new file mode 100644 index 00000000..a1c465ee Binary files /dev/null and b/public/guides/7/7_6/2.jpg differ diff --git a/public/guides/7/7_6/3.jpg b/public/guides/7/7_6/3.jpg new file mode 100644 index 00000000..d51385ed Binary files /dev/null and b/public/guides/7/7_6/3.jpg differ diff --git a/public/guides/7/7_6/4.jpg b/public/guides/7/7_6/4.jpg new file mode 100644 index 00000000..b3496002 Binary files /dev/null and b/public/guides/7/7_6/4.jpg differ diff --git a/public/guides/7/7_6/5.jpg b/public/guides/7/7_6/5.jpg new file mode 100644 index 00000000..8633eee6 Binary files /dev/null and b/public/guides/7/7_6/5.jpg differ diff --git a/public/guides/7/7_7/1.jpg b/public/guides/7/7_7/1.jpg new file mode 100644 index 00000000..d9e57b8d Binary files /dev/null and b/public/guides/7/7_7/1.jpg differ diff --git a/public/guides/7/7_7/2.jpg b/public/guides/7/7_7/2.jpg new file mode 100644 index 00000000..97789dbe Binary files /dev/null and b/public/guides/7/7_7/2.jpg differ diff --git a/public/guides/7/7_7/3.jpg b/public/guides/7/7_7/3.jpg new file mode 100644 index 00000000..ccc2f8a4 Binary files /dev/null and b/public/guides/7/7_7/3.jpg differ diff --git a/public/guides/7/7_7/4.jpg b/public/guides/7/7_7/4.jpg new file mode 100644 index 00000000..cd94c8ee Binary files /dev/null and b/public/guides/7/7_7/4.jpg differ diff --git a/public/guides/7/7_7/5.jpg b/public/guides/7/7_7/5.jpg new file mode 100644 index 00000000..4e05ace3 Binary files /dev/null and b/public/guides/7/7_7/5.jpg differ diff --git a/public/guides/7/7_8/1.jpg b/public/guides/7/7_8/1.jpg new file mode 100644 index 00000000..8dcf4053 Binary files /dev/null and b/public/guides/7/7_8/1.jpg differ diff --git a/public/guides/7/7_8/2.jpg b/public/guides/7/7_8/2.jpg new file mode 100644 index 00000000..81246915 Binary files /dev/null and b/public/guides/7/7_8/2.jpg differ diff --git a/public/guides/7/7_8/3.jpg b/public/guides/7/7_8/3.jpg new file mode 100644 index 00000000..91366972 Binary files /dev/null and b/public/guides/7/7_8/3.jpg differ diff --git a/public/guides/7/7_8/4.jpg b/public/guides/7/7_8/4.jpg new file mode 100644 index 00000000..b6790154 Binary files /dev/null and b/public/guides/7/7_8/4.jpg differ diff --git a/public/guides/7/7_8/5.JPG b/public/guides/7/7_8/5.JPG new file mode 100644 index 00000000..ceb94f80 Binary files /dev/null and b/public/guides/7/7_8/5.JPG differ diff --git a/public/guides/7/7_8/5.jpg b/public/guides/7/7_8/5.jpg new file mode 100644 index 00000000..ceb94f80 Binary files /dev/null and b/public/guides/7/7_8/5.jpg differ diff --git a/public/guides/7/7_9/1.jpg b/public/guides/7/7_9/1.jpg new file mode 100644 index 00000000..88b41eb0 Binary files /dev/null and b/public/guides/7/7_9/1.jpg differ diff --git a/public/guides/7/7_9/2.jpg b/public/guides/7/7_9/2.jpg new file mode 100644 index 00000000..4c956a5a Binary files /dev/null and b/public/guides/7/7_9/2.jpg differ diff --git a/public/guides/7/7_9/3.jpg b/public/guides/7/7_9/3.jpg new file mode 100644 index 00000000..eb4a4c0c Binary files /dev/null and b/public/guides/7/7_9/3.jpg differ diff --git a/public/guides/7/7_9/4.jpg b/public/guides/7/7_9/4.jpg new file mode 100644 index 00000000..ee346a9c Binary files /dev/null and b/public/guides/7/7_9/4.jpg differ diff --git a/public/guides/7/7_9/5.jpg b/public/guides/7/7_9/5.jpg new file mode 100644 index 00000000..ff55fdb4 Binary files /dev/null and b/public/guides/7/7_9/5.jpg differ diff --git "a/public/guides/7/7_PATTERN_ \353\254\270\354\226\221 \354\206\215\354\204\261 \354\235\270\354\213\235\352\270\260.jpg" "b/public/guides/7/7_PATTERN_ \353\254\270\354\226\221 \354\206\215\354\204\261 \354\235\270\354\213\235\352\270\260.jpg" new file mode 100644 index 00000000..7b4db7e4 Binary files /dev/null and "b/public/guides/7/7_PATTERN_ \353\254\270\354\226\221 \354\206\215\354\204\261 \354\235\270\354\213\235\352\270\260.jpg" differ diff --git "a/public/guides/SHOWNIQ_\353\266\204\353\245\230\353\217\204\352\265\254_\353\214\200\355\221\234\354\235\264\353\257\270\354\247\200(\355\217\264\353\215\224\353\263\204 5\354\236\245\354\224\251).jpg" "b/public/guides/SHOWNIQ_\353\266\204\353\245\230\353\217\204\352\265\254_\353\214\200\355\221\234\354\235\264\353\257\270\354\247\200(\355\217\264\353\215\224\353\263\204 5\354\236\245\354\224\251).jpg" new file mode 100644 index 00000000..4e64a2c3 Binary files /dev/null and "b/public/guides/SHOWNIQ_\353\266\204\353\245\230\353\217\204\352\265\254_\353\214\200\355\221\234\354\235\264\353\257\270\354\247\200(\355\217\264\353\215\224\353\263\204 5\354\236\245\354\224\251).jpg" differ diff --git a/public/guides/icons/colors/1.png b/public/guides/icons/colors/1.png new file mode 100644 index 00000000..6147ad6b Binary files /dev/null and b/public/guides/icons/colors/1.png differ diff --git a/public/guides/icons/colors/10.png b/public/guides/icons/colors/10.png new file mode 100644 index 00000000..441b6c61 Binary files /dev/null and b/public/guides/icons/colors/10.png differ diff --git a/public/guides/icons/colors/10_s.png b/public/guides/icons/colors/10_s.png new file mode 100644 index 00000000..2a479c4d Binary files /dev/null and b/public/guides/icons/colors/10_s.png differ diff --git a/public/guides/icons/colors/11.png b/public/guides/icons/colors/11.png new file mode 100644 index 00000000..73534991 Binary files /dev/null and b/public/guides/icons/colors/11.png differ diff --git a/public/guides/icons/colors/11_s.png b/public/guides/icons/colors/11_s.png new file mode 100644 index 00000000..2a8a7033 Binary files /dev/null and b/public/guides/icons/colors/11_s.png differ diff --git a/public/guides/icons/colors/12.png b/public/guides/icons/colors/12.png new file mode 100644 index 00000000..59cb47db Binary files /dev/null and b/public/guides/icons/colors/12.png differ diff --git a/public/guides/icons/colors/12_s.png b/public/guides/icons/colors/12_s.png new file mode 100644 index 00000000..88b79fc1 Binary files /dev/null and b/public/guides/icons/colors/12_s.png differ diff --git a/public/guides/icons/colors/13.png b/public/guides/icons/colors/13.png new file mode 100644 index 00000000..bc0bc4cc Binary files /dev/null and b/public/guides/icons/colors/13.png differ diff --git a/public/guides/icons/colors/13_s.png b/public/guides/icons/colors/13_s.png new file mode 100644 index 00000000..5b11b83c Binary files /dev/null and b/public/guides/icons/colors/13_s.png differ diff --git a/public/guides/icons/colors/14.png b/public/guides/icons/colors/14.png new file mode 100644 index 00000000..8cf1b10c Binary files /dev/null and b/public/guides/icons/colors/14.png differ diff --git a/public/guides/icons/colors/14_s.png b/public/guides/icons/colors/14_s.png new file mode 100644 index 00000000..2743d01d Binary files /dev/null and b/public/guides/icons/colors/14_s.png differ diff --git a/public/guides/icons/colors/15.png b/public/guides/icons/colors/15.png new file mode 100644 index 00000000..f07ab0e3 Binary files /dev/null and b/public/guides/icons/colors/15.png differ diff --git a/public/guides/icons/colors/15_s.png b/public/guides/icons/colors/15_s.png new file mode 100644 index 00000000..359d452b Binary files /dev/null and b/public/guides/icons/colors/15_s.png differ diff --git a/public/guides/icons/colors/16.png b/public/guides/icons/colors/16.png new file mode 100644 index 00000000..27977f19 Binary files /dev/null and b/public/guides/icons/colors/16.png differ diff --git a/public/guides/icons/colors/16_s.png b/public/guides/icons/colors/16_s.png new file mode 100644 index 00000000..5866ef5d Binary files /dev/null and b/public/guides/icons/colors/16_s.png differ diff --git a/public/guides/icons/colors/17.png b/public/guides/icons/colors/17.png new file mode 100644 index 00000000..d049b08d Binary files /dev/null and b/public/guides/icons/colors/17.png differ diff --git a/public/guides/icons/colors/17_s.png b/public/guides/icons/colors/17_s.png new file mode 100644 index 00000000..7f8bc429 Binary files /dev/null and b/public/guides/icons/colors/17_s.png differ diff --git a/public/guides/icons/colors/18.png b/public/guides/icons/colors/18.png new file mode 100644 index 00000000..5ebb14a2 Binary files /dev/null and b/public/guides/icons/colors/18.png differ diff --git a/public/guides/icons/colors/18_s.png b/public/guides/icons/colors/18_s.png new file mode 100644 index 00000000..1addfdc1 Binary files /dev/null and b/public/guides/icons/colors/18_s.png differ diff --git a/public/guides/icons/colors/19.png b/public/guides/icons/colors/19.png new file mode 100644 index 00000000..eca44e95 Binary files /dev/null and b/public/guides/icons/colors/19.png differ diff --git a/public/guides/icons/colors/19_s.png b/public/guides/icons/colors/19_s.png new file mode 100644 index 00000000..579bce37 Binary files /dev/null and b/public/guides/icons/colors/19_s.png differ diff --git a/public/guides/icons/colors/1_s.png b/public/guides/icons/colors/1_s.png new file mode 100644 index 00000000..1226eb76 Binary files /dev/null and b/public/guides/icons/colors/1_s.png differ diff --git a/public/guides/icons/colors/2.png b/public/guides/icons/colors/2.png new file mode 100644 index 00000000..be224c1d Binary files /dev/null and b/public/guides/icons/colors/2.png differ diff --git a/public/guides/icons/colors/20.png b/public/guides/icons/colors/20.png new file mode 100644 index 00000000..1724b5ef Binary files /dev/null and b/public/guides/icons/colors/20.png differ diff --git a/public/guides/icons/colors/20_s.png b/public/guides/icons/colors/20_s.png new file mode 100644 index 00000000..68821715 Binary files /dev/null and b/public/guides/icons/colors/20_s.png differ diff --git a/public/guides/icons/colors/21.png b/public/guides/icons/colors/21.png new file mode 100644 index 00000000..c14b474f Binary files /dev/null and b/public/guides/icons/colors/21.png differ diff --git a/public/guides/icons/colors/21_s.png b/public/guides/icons/colors/21_s.png new file mode 100644 index 00000000..928a791d Binary files /dev/null and b/public/guides/icons/colors/21_s.png differ diff --git a/public/guides/icons/colors/22.png b/public/guides/icons/colors/22.png new file mode 100644 index 00000000..3949aab8 Binary files /dev/null and b/public/guides/icons/colors/22.png differ diff --git a/public/guides/icons/colors/22_s.png b/public/guides/icons/colors/22_s.png new file mode 100644 index 00000000..c38986fe Binary files /dev/null and b/public/guides/icons/colors/22_s.png differ diff --git a/public/guides/icons/colors/2_s.png b/public/guides/icons/colors/2_s.png new file mode 100644 index 00000000..06a4dac5 Binary files /dev/null and b/public/guides/icons/colors/2_s.png differ diff --git a/public/guides/icons/colors/3.png b/public/guides/icons/colors/3.png new file mode 100644 index 00000000..1ea0d138 Binary files /dev/null and b/public/guides/icons/colors/3.png differ diff --git a/public/guides/icons/colors/3_s.png b/public/guides/icons/colors/3_s.png new file mode 100644 index 00000000..ccb853cf Binary files /dev/null and b/public/guides/icons/colors/3_s.png differ diff --git a/public/guides/icons/colors/4.png b/public/guides/icons/colors/4.png new file mode 100644 index 00000000..5b375669 Binary files /dev/null and b/public/guides/icons/colors/4.png differ diff --git a/public/guides/icons/colors/4_s.png b/public/guides/icons/colors/4_s.png new file mode 100644 index 00000000..e7939727 Binary files /dev/null and b/public/guides/icons/colors/4_s.png differ diff --git a/public/guides/icons/colors/5.png b/public/guides/icons/colors/5.png new file mode 100644 index 00000000..9dfac0f2 Binary files /dev/null and b/public/guides/icons/colors/5.png differ diff --git a/public/guides/icons/colors/5_s.png b/public/guides/icons/colors/5_s.png new file mode 100644 index 00000000..8e427808 Binary files /dev/null and b/public/guides/icons/colors/5_s.png differ diff --git a/public/guides/icons/colors/6.png b/public/guides/icons/colors/6.png new file mode 100644 index 00000000..cd993464 Binary files /dev/null and b/public/guides/icons/colors/6.png differ diff --git a/public/guides/icons/colors/6_s.png b/public/guides/icons/colors/6_s.png new file mode 100644 index 00000000..a5bc2f0a Binary files /dev/null and b/public/guides/icons/colors/6_s.png differ diff --git a/public/guides/icons/colors/7.png b/public/guides/icons/colors/7.png new file mode 100644 index 00000000..9ea0afe3 Binary files /dev/null and b/public/guides/icons/colors/7.png differ diff --git a/public/guides/icons/colors/7_s.png b/public/guides/icons/colors/7_s.png new file mode 100644 index 00000000..f6bb1293 Binary files /dev/null and b/public/guides/icons/colors/7_s.png differ diff --git a/public/guides/icons/colors/8.png b/public/guides/icons/colors/8.png new file mode 100644 index 00000000..e7f2d545 Binary files /dev/null and b/public/guides/icons/colors/8.png differ diff --git a/public/guides/icons/colors/8_s.png b/public/guides/icons/colors/8_s.png new file mode 100644 index 00000000..a88c6a8d Binary files /dev/null and b/public/guides/icons/colors/8_s.png differ diff --git a/public/guides/icons/colors/9.png b/public/guides/icons/colors/9.png new file mode 100644 index 00000000..84e1f2fd Binary files /dev/null and b/public/guides/icons/colors/9.png differ diff --git a/public/guides/icons/colors/9_s.png b/public/guides/icons/colors/9_s.png new file mode 100644 index 00000000..e89907ea Binary files /dev/null and b/public/guides/icons/colors/9_s.png differ diff --git a/public/guides/icons/genders/1.png b/public/guides/icons/genders/1.png new file mode 100644 index 00000000..c1ab6906 Binary files /dev/null and b/public/guides/icons/genders/1.png differ diff --git a/public/guides/icons/genders/1_s.png b/public/guides/icons/genders/1_s.png new file mode 100644 index 00000000..0e0f6f4b Binary files /dev/null and b/public/guides/icons/genders/1_s.png differ diff --git a/public/guides/icons/genders/2.png b/public/guides/icons/genders/2.png new file mode 100644 index 00000000..1c6e01af Binary files /dev/null and b/public/guides/icons/genders/2.png differ diff --git a/public/guides/icons/genders/2_s.png b/public/guides/icons/genders/2_s.png new file mode 100644 index 00000000..ca5fdba9 Binary files /dev/null and b/public/guides/icons/genders/2_s.png differ diff --git a/public/guides/icons/main_cats/1.png b/public/guides/icons/main_cats/1.png new file mode 100644 index 00000000..0cccaa37 Binary files /dev/null and b/public/guides/icons/main_cats/1.png differ diff --git a/public/guides/icons/main_cats/10.png b/public/guides/icons/main_cats/10.png new file mode 100644 index 00000000..2ec887d8 Binary files /dev/null and b/public/guides/icons/main_cats/10.png differ diff --git a/public/guides/icons/main_cats/10_s.png b/public/guides/icons/main_cats/10_s.png new file mode 100644 index 00000000..46b64350 Binary files /dev/null and b/public/guides/icons/main_cats/10_s.png differ diff --git a/public/guides/icons/main_cats/11.png b/public/guides/icons/main_cats/11.png new file mode 100644 index 00000000..44148a00 Binary files /dev/null and b/public/guides/icons/main_cats/11.png differ diff --git a/public/guides/icons/main_cats/11_s.png b/public/guides/icons/main_cats/11_s.png new file mode 100644 index 00000000..fdd42090 Binary files /dev/null and b/public/guides/icons/main_cats/11_s.png differ diff --git a/public/guides/icons/main_cats/12.png b/public/guides/icons/main_cats/12.png new file mode 100644 index 00000000..07d2a9e8 Binary files /dev/null and b/public/guides/icons/main_cats/12.png differ diff --git a/public/guides/icons/main_cats/12_s.png b/public/guides/icons/main_cats/12_s.png new file mode 100644 index 00000000..5c8d11a3 Binary files /dev/null and b/public/guides/icons/main_cats/12_s.png differ diff --git a/public/guides/icons/main_cats/1_s.png b/public/guides/icons/main_cats/1_s.png new file mode 100644 index 00000000..2642639c Binary files /dev/null and b/public/guides/icons/main_cats/1_s.png differ diff --git a/public/guides/icons/main_cats/2.png b/public/guides/icons/main_cats/2.png new file mode 100644 index 00000000..3e6c46c6 Binary files /dev/null and b/public/guides/icons/main_cats/2.png differ diff --git a/public/guides/icons/main_cats/2_s.png b/public/guides/icons/main_cats/2_s.png new file mode 100644 index 00000000..267d9bcc Binary files /dev/null and b/public/guides/icons/main_cats/2_s.png differ diff --git a/public/guides/icons/main_cats/3.png b/public/guides/icons/main_cats/3.png new file mode 100644 index 00000000..492c8a49 Binary files /dev/null and b/public/guides/icons/main_cats/3.png differ diff --git a/public/guides/icons/main_cats/3_s.png b/public/guides/icons/main_cats/3_s.png new file mode 100644 index 00000000..d66da6c5 Binary files /dev/null and b/public/guides/icons/main_cats/3_s.png differ diff --git a/public/guides/icons/main_cats/4.png b/public/guides/icons/main_cats/4.png new file mode 100644 index 00000000..364ef9c8 Binary files /dev/null and b/public/guides/icons/main_cats/4.png differ diff --git a/public/guides/icons/main_cats/4_s.png b/public/guides/icons/main_cats/4_s.png new file mode 100644 index 00000000..6492444e Binary files /dev/null and b/public/guides/icons/main_cats/4_s.png differ diff --git a/public/guides/icons/main_cats/5.png b/public/guides/icons/main_cats/5.png new file mode 100644 index 00000000..94a82e80 Binary files /dev/null and b/public/guides/icons/main_cats/5.png differ diff --git a/public/guides/icons/main_cats/5_s.png b/public/guides/icons/main_cats/5_s.png new file mode 100644 index 00000000..5f69e6f2 Binary files /dev/null and b/public/guides/icons/main_cats/5_s.png differ diff --git a/public/guides/icons/main_cats/6.png b/public/guides/icons/main_cats/6.png new file mode 100644 index 00000000..d748e9e0 Binary files /dev/null and b/public/guides/icons/main_cats/6.png differ diff --git a/public/guides/icons/main_cats/6_s.png b/public/guides/icons/main_cats/6_s.png new file mode 100644 index 00000000..7db54086 Binary files /dev/null and b/public/guides/icons/main_cats/6_s.png differ diff --git a/public/guides/icons/main_cats/7.png b/public/guides/icons/main_cats/7.png new file mode 100644 index 00000000..f03868e6 Binary files /dev/null and b/public/guides/icons/main_cats/7.png differ diff --git a/public/guides/icons/main_cats/7_s.png b/public/guides/icons/main_cats/7_s.png new file mode 100644 index 00000000..cae9a3e4 Binary files /dev/null and b/public/guides/icons/main_cats/7_s.png differ diff --git a/public/guides/icons/main_cats/8.png b/public/guides/icons/main_cats/8.png new file mode 100644 index 00000000..28e05f61 Binary files /dev/null and b/public/guides/icons/main_cats/8.png differ diff --git a/public/guides/icons/main_cats/8_s.png b/public/guides/icons/main_cats/8_s.png new file mode 100644 index 00000000..b6b9a1bf Binary files /dev/null and b/public/guides/icons/main_cats/8_s.png differ diff --git a/public/guides/icons/main_cats/9.png b/public/guides/icons/main_cats/9.png new file mode 100644 index 00000000..93d6fd26 Binary files /dev/null and b/public/guides/icons/main_cats/9.png differ diff --git a/public/guides/icons/main_cats/9_s.png b/public/guides/icons/main_cats/9_s.png new file mode 100644 index 00000000..029eec7e Binary files /dev/null and b/public/guides/icons/main_cats/9_s.png differ diff --git a/public/guides/icons/man_style/1.png b/public/guides/icons/man_style/1.png new file mode 100644 index 00000000..e69d6f4b Binary files /dev/null and b/public/guides/icons/man_style/1.png differ diff --git a/public/guides/icons/man_style/10.png b/public/guides/icons/man_style/10.png new file mode 100644 index 00000000..b746f093 Binary files /dev/null and b/public/guides/icons/man_style/10.png differ diff --git a/public/guides/icons/man_style/10_s.png b/public/guides/icons/man_style/10_s.png new file mode 100644 index 00000000..e14c9971 Binary files /dev/null and b/public/guides/icons/man_style/10_s.png differ diff --git a/public/guides/icons/man_style/1_s.png b/public/guides/icons/man_style/1_s.png new file mode 100644 index 00000000..14da721d Binary files /dev/null and b/public/guides/icons/man_style/1_s.png differ diff --git a/public/guides/icons/man_style/2.png b/public/guides/icons/man_style/2.png new file mode 100644 index 00000000..0adb720a Binary files /dev/null and b/public/guides/icons/man_style/2.png differ diff --git a/public/guides/icons/man_style/2_s.png b/public/guides/icons/man_style/2_s.png new file mode 100644 index 00000000..306da31d Binary files /dev/null and b/public/guides/icons/man_style/2_s.png differ diff --git a/public/guides/icons/man_style/3.png b/public/guides/icons/man_style/3.png new file mode 100644 index 00000000..51dbedc8 Binary files /dev/null and b/public/guides/icons/man_style/3.png differ diff --git a/public/guides/icons/man_style/3_s.png b/public/guides/icons/man_style/3_s.png new file mode 100644 index 00000000..c1eeabbb Binary files /dev/null and b/public/guides/icons/man_style/3_s.png differ diff --git a/public/guides/icons/man_style/4.png b/public/guides/icons/man_style/4.png new file mode 100644 index 00000000..c910924b Binary files /dev/null and b/public/guides/icons/man_style/4.png differ diff --git a/public/guides/icons/man_style/4_s.png b/public/guides/icons/man_style/4_s.png new file mode 100644 index 00000000..7c0406b9 Binary files /dev/null and b/public/guides/icons/man_style/4_s.png differ diff --git a/public/guides/icons/man_style/5.png b/public/guides/icons/man_style/5.png new file mode 100644 index 00000000..dca4e35c Binary files /dev/null and b/public/guides/icons/man_style/5.png differ diff --git a/public/guides/icons/man_style/5_s.png b/public/guides/icons/man_style/5_s.png new file mode 100644 index 00000000..cd1259cf Binary files /dev/null and b/public/guides/icons/man_style/5_s.png differ diff --git a/public/guides/icons/man_style/6.png b/public/guides/icons/man_style/6.png new file mode 100644 index 00000000..12f66808 Binary files /dev/null and b/public/guides/icons/man_style/6.png differ diff --git a/public/guides/icons/man_style/6_s.png b/public/guides/icons/man_style/6_s.png new file mode 100644 index 00000000..323d00e0 Binary files /dev/null and b/public/guides/icons/man_style/6_s.png differ diff --git a/public/guides/icons/man_style/7.png b/public/guides/icons/man_style/7.png new file mode 100644 index 00000000..aaded088 Binary files /dev/null and b/public/guides/icons/man_style/7.png differ diff --git a/public/guides/icons/man_style/7_s.png b/public/guides/icons/man_style/7_s.png new file mode 100644 index 00000000..d35d8464 Binary files /dev/null and b/public/guides/icons/man_style/7_s.png differ diff --git a/public/guides/icons/man_style/8.png b/public/guides/icons/man_style/8.png new file mode 100644 index 00000000..80d1ea1a Binary files /dev/null and b/public/guides/icons/man_style/8.png differ diff --git a/public/guides/icons/man_style/8_s.png b/public/guides/icons/man_style/8_s.png new file mode 100644 index 00000000..bbdb1315 Binary files /dev/null and b/public/guides/icons/man_style/8_s.png differ diff --git a/public/guides/icons/man_style/9.png b/public/guides/icons/man_style/9.png new file mode 100644 index 00000000..bc284750 Binary files /dev/null and b/public/guides/icons/man_style/9.png differ diff --git a/public/guides/icons/man_style/9_s.png b/public/guides/icons/man_style/9_s.png new file mode 100644 index 00000000..bdcce8e7 Binary files /dev/null and b/public/guides/icons/man_style/9_s.png differ diff --git a/public/guides/icons/patterns/1.png b/public/guides/icons/patterns/1.png new file mode 100644 index 00000000..3cfd6f97 Binary files /dev/null and b/public/guides/icons/patterns/1.png differ diff --git a/public/guides/icons/patterns/10.png b/public/guides/icons/patterns/10.png new file mode 100644 index 00000000..66aff831 Binary files /dev/null and b/public/guides/icons/patterns/10.png differ diff --git a/public/guides/icons/patterns/10_s.png b/public/guides/icons/patterns/10_s.png new file mode 100644 index 00000000..b0d52e98 Binary files /dev/null and b/public/guides/icons/patterns/10_s.png differ diff --git a/public/guides/icons/patterns/11.png b/public/guides/icons/patterns/11.png new file mode 100644 index 00000000..d2ff5b36 Binary files /dev/null and b/public/guides/icons/patterns/11.png differ diff --git a/public/guides/icons/patterns/11_s.png b/public/guides/icons/patterns/11_s.png new file mode 100644 index 00000000..09b1d274 Binary files /dev/null and b/public/guides/icons/patterns/11_s.png differ diff --git a/public/guides/icons/patterns/12.png b/public/guides/icons/patterns/12.png new file mode 100644 index 00000000..666afe8a Binary files /dev/null and b/public/guides/icons/patterns/12.png differ diff --git a/public/guides/icons/patterns/12_s.png b/public/guides/icons/patterns/12_s.png new file mode 100644 index 00000000..88dd8df8 Binary files /dev/null and b/public/guides/icons/patterns/12_s.png differ diff --git a/public/guides/icons/patterns/13.png b/public/guides/icons/patterns/13.png new file mode 100644 index 00000000..f55ff542 Binary files /dev/null and b/public/guides/icons/patterns/13.png differ diff --git a/public/guides/icons/patterns/13_s.png b/public/guides/icons/patterns/13_s.png new file mode 100644 index 00000000..74c34c73 Binary files /dev/null and b/public/guides/icons/patterns/13_s.png differ diff --git a/public/guides/icons/patterns/14.png b/public/guides/icons/patterns/14.png new file mode 100644 index 00000000..d788925c Binary files /dev/null and b/public/guides/icons/patterns/14.png differ diff --git a/public/guides/icons/patterns/14_s.png b/public/guides/icons/patterns/14_s.png new file mode 100644 index 00000000..f0e7d23a Binary files /dev/null and b/public/guides/icons/patterns/14_s.png differ diff --git a/public/guides/icons/patterns/15.png b/public/guides/icons/patterns/15.png new file mode 100644 index 00000000..8c040dd3 Binary files /dev/null and b/public/guides/icons/patterns/15.png differ diff --git a/public/guides/icons/patterns/15_s.png b/public/guides/icons/patterns/15_s.png new file mode 100644 index 00000000..74aec653 Binary files /dev/null and b/public/guides/icons/patterns/15_s.png differ diff --git a/public/guides/icons/patterns/16.png b/public/guides/icons/patterns/16.png new file mode 100644 index 00000000..d47123c9 Binary files /dev/null and b/public/guides/icons/patterns/16.png differ diff --git a/public/guides/icons/patterns/16_s.png b/public/guides/icons/patterns/16_s.png new file mode 100644 index 00000000..67343207 Binary files /dev/null and b/public/guides/icons/patterns/16_s.png differ diff --git a/public/guides/icons/patterns/17.png b/public/guides/icons/patterns/17.png new file mode 100644 index 00000000..76ef7fe5 Binary files /dev/null and b/public/guides/icons/patterns/17.png differ diff --git a/public/guides/icons/patterns/17_s.png b/public/guides/icons/patterns/17_s.png new file mode 100644 index 00000000..60b8a8e3 Binary files /dev/null and b/public/guides/icons/patterns/17_s.png differ diff --git a/public/guides/icons/patterns/18.png b/public/guides/icons/patterns/18.png new file mode 100644 index 00000000..0c7b071d Binary files /dev/null and b/public/guides/icons/patterns/18.png differ diff --git a/public/guides/icons/patterns/18_s.png b/public/guides/icons/patterns/18_s.png new file mode 100644 index 00000000..799ab84b Binary files /dev/null and b/public/guides/icons/patterns/18_s.png differ diff --git a/public/guides/icons/patterns/1_s.png b/public/guides/icons/patterns/1_s.png new file mode 100644 index 00000000..41c20c3d Binary files /dev/null and b/public/guides/icons/patterns/1_s.png differ diff --git a/public/guides/icons/patterns/2.png b/public/guides/icons/patterns/2.png new file mode 100644 index 00000000..498604bd Binary files /dev/null and b/public/guides/icons/patterns/2.png differ diff --git a/public/guides/icons/patterns/2_s.png b/public/guides/icons/patterns/2_s.png new file mode 100644 index 00000000..1703ccbd Binary files /dev/null and b/public/guides/icons/patterns/2_s.png differ diff --git a/public/guides/icons/patterns/3.png b/public/guides/icons/patterns/3.png new file mode 100644 index 00000000..6d1acb41 Binary files /dev/null and b/public/guides/icons/patterns/3.png differ diff --git a/public/guides/icons/patterns/3_s.png b/public/guides/icons/patterns/3_s.png new file mode 100644 index 00000000..6f05ec6a Binary files /dev/null and b/public/guides/icons/patterns/3_s.png differ diff --git a/public/guides/icons/patterns/4.png b/public/guides/icons/patterns/4.png new file mode 100644 index 00000000..9cfb0b17 Binary files /dev/null and b/public/guides/icons/patterns/4.png differ diff --git a/public/guides/icons/patterns/4_s.png b/public/guides/icons/patterns/4_s.png new file mode 100644 index 00000000..0ad0c2b4 Binary files /dev/null and b/public/guides/icons/patterns/4_s.png differ diff --git a/public/guides/icons/patterns/5.png b/public/guides/icons/patterns/5.png new file mode 100644 index 00000000..69bb9084 Binary files /dev/null and b/public/guides/icons/patterns/5.png differ diff --git a/public/guides/icons/patterns/5_s.png b/public/guides/icons/patterns/5_s.png new file mode 100644 index 00000000..4d17ee38 Binary files /dev/null and b/public/guides/icons/patterns/5_s.png differ diff --git a/public/guides/icons/patterns/6.png b/public/guides/icons/patterns/6.png new file mode 100644 index 00000000..e347bb4e Binary files /dev/null and b/public/guides/icons/patterns/6.png differ diff --git a/public/guides/icons/patterns/6_s.png b/public/guides/icons/patterns/6_s.png new file mode 100644 index 00000000..87f964d1 Binary files /dev/null and b/public/guides/icons/patterns/6_s.png differ diff --git a/public/guides/icons/patterns/7.png b/public/guides/icons/patterns/7.png new file mode 100644 index 00000000..486f0475 Binary files /dev/null and b/public/guides/icons/patterns/7.png differ diff --git a/public/guides/icons/patterns/7_s.png b/public/guides/icons/patterns/7_s.png new file mode 100644 index 00000000..701ad727 Binary files /dev/null and b/public/guides/icons/patterns/7_s.png differ diff --git a/public/guides/icons/patterns/8.png b/public/guides/icons/patterns/8.png new file mode 100644 index 00000000..369c6c03 Binary files /dev/null and b/public/guides/icons/patterns/8.png differ diff --git a/public/guides/icons/patterns/8_s.png b/public/guides/icons/patterns/8_s.png new file mode 100644 index 00000000..8d9233d9 Binary files /dev/null and b/public/guides/icons/patterns/8_s.png differ diff --git a/public/guides/icons/patterns/9.png b/public/guides/icons/patterns/9.png new file mode 100644 index 00000000..c0b4de7b Binary files /dev/null and b/public/guides/icons/patterns/9.png differ diff --git a/public/guides/icons/patterns/9_s.png b/public/guides/icons/patterns/9_s.png new file mode 100644 index 00000000..fb7b58ff Binary files /dev/null and b/public/guides/icons/patterns/9_s.png differ diff --git a/public/guides/icons/sources/0.png b/public/guides/icons/sources/0.png new file mode 100644 index 00000000..4f243327 Binary files /dev/null and b/public/guides/icons/sources/0.png differ diff --git a/public/guides/icons/sources/0_s.png b/public/guides/icons/sources/0_s.png new file mode 100644 index 00000000..ad05a5cd Binary files /dev/null and b/public/guides/icons/sources/0_s.png differ diff --git a/public/guides/icons/sources/1.png b/public/guides/icons/sources/1.png new file mode 100644 index 00000000..bfd47b43 Binary files /dev/null and b/public/guides/icons/sources/1.png differ diff --git a/public/guides/icons/sources/1_s.png b/public/guides/icons/sources/1_s.png new file mode 100644 index 00000000..b2662d39 Binary files /dev/null and b/public/guides/icons/sources/1_s.png differ diff --git a/public/guides/icons/sources/2.png b/public/guides/icons/sources/2.png new file mode 100644 index 00000000..2d0af4b3 Binary files /dev/null and b/public/guides/icons/sources/2.png differ diff --git a/public/guides/icons/sources/2_s.png b/public/guides/icons/sources/2_s.png new file mode 100644 index 00000000..73ad3e7d Binary files /dev/null and b/public/guides/icons/sources/2_s.png differ diff --git a/public/guides/icons/sub_cats/1.png b/public/guides/icons/sub_cats/1.png new file mode 100644 index 00000000..5abc3e11 Binary files /dev/null and b/public/guides/icons/sub_cats/1.png differ diff --git a/public/guides/icons/sub_cats/10.png b/public/guides/icons/sub_cats/10.png new file mode 100644 index 00000000..892b58c3 Binary files /dev/null and b/public/guides/icons/sub_cats/10.png differ diff --git a/public/guides/icons/sub_cats/10_s.png b/public/guides/icons/sub_cats/10_s.png new file mode 100644 index 00000000..b5cac375 Binary files /dev/null and b/public/guides/icons/sub_cats/10_s.png differ diff --git a/public/guides/icons/sub_cats/11.png b/public/guides/icons/sub_cats/11.png new file mode 100644 index 00000000..41b74402 Binary files /dev/null and b/public/guides/icons/sub_cats/11.png differ diff --git a/public/guides/icons/sub_cats/11_s.png b/public/guides/icons/sub_cats/11_s.png new file mode 100644 index 00000000..b1914329 Binary files /dev/null and b/public/guides/icons/sub_cats/11_s.png differ diff --git a/public/guides/icons/sub_cats/12.png b/public/guides/icons/sub_cats/12.png new file mode 100644 index 00000000..e52aed93 Binary files /dev/null and b/public/guides/icons/sub_cats/12.png differ diff --git a/public/guides/icons/sub_cats/12_s.png b/public/guides/icons/sub_cats/12_s.png new file mode 100644 index 00000000..d1851ff7 Binary files /dev/null and b/public/guides/icons/sub_cats/12_s.png differ diff --git a/public/guides/icons/sub_cats/13.png b/public/guides/icons/sub_cats/13.png new file mode 100644 index 00000000..af3b9225 Binary files /dev/null and b/public/guides/icons/sub_cats/13.png differ diff --git a/public/guides/icons/sub_cats/13_s.png b/public/guides/icons/sub_cats/13_s.png new file mode 100644 index 00000000..1af031fa Binary files /dev/null and b/public/guides/icons/sub_cats/13_s.png differ diff --git a/public/guides/icons/sub_cats/14.png b/public/guides/icons/sub_cats/14.png new file mode 100644 index 00000000..a73bd95c Binary files /dev/null and b/public/guides/icons/sub_cats/14.png differ diff --git a/public/guides/icons/sub_cats/14_s.png b/public/guides/icons/sub_cats/14_s.png new file mode 100644 index 00000000..8ebdb815 Binary files /dev/null and b/public/guides/icons/sub_cats/14_s.png differ diff --git a/public/guides/icons/sub_cats/15.png b/public/guides/icons/sub_cats/15.png new file mode 100644 index 00000000..15287ea2 Binary files /dev/null and b/public/guides/icons/sub_cats/15.png differ diff --git a/public/guides/icons/sub_cats/15_s.png b/public/guides/icons/sub_cats/15_s.png new file mode 100644 index 00000000..5347d52d Binary files /dev/null and b/public/guides/icons/sub_cats/15_s.png differ diff --git a/public/guides/icons/sub_cats/16.png b/public/guides/icons/sub_cats/16.png new file mode 100644 index 00000000..ac749f36 Binary files /dev/null and b/public/guides/icons/sub_cats/16.png differ diff --git a/public/guides/icons/sub_cats/16_s.png b/public/guides/icons/sub_cats/16_s.png new file mode 100644 index 00000000..816c6511 Binary files /dev/null and b/public/guides/icons/sub_cats/16_s.png differ diff --git a/public/guides/icons/sub_cats/17.png b/public/guides/icons/sub_cats/17.png new file mode 100644 index 00000000..921fa984 Binary files /dev/null and b/public/guides/icons/sub_cats/17.png differ diff --git a/public/guides/icons/sub_cats/17_s.png b/public/guides/icons/sub_cats/17_s.png new file mode 100644 index 00000000..73ac98f2 Binary files /dev/null and b/public/guides/icons/sub_cats/17_s.png differ diff --git a/public/guides/icons/sub_cats/18.png b/public/guides/icons/sub_cats/18.png new file mode 100644 index 00000000..2e6bdc8b Binary files /dev/null and b/public/guides/icons/sub_cats/18.png differ diff --git a/public/guides/icons/sub_cats/18_s.png b/public/guides/icons/sub_cats/18_s.png new file mode 100644 index 00000000..83947dc7 Binary files /dev/null and b/public/guides/icons/sub_cats/18_s.png differ diff --git a/public/guides/icons/sub_cats/19.png b/public/guides/icons/sub_cats/19.png new file mode 100644 index 00000000..86ee0a37 Binary files /dev/null and b/public/guides/icons/sub_cats/19.png differ diff --git a/public/guides/icons/sub_cats/19_s.png b/public/guides/icons/sub_cats/19_s.png new file mode 100644 index 00000000..7c4fa096 Binary files /dev/null and b/public/guides/icons/sub_cats/19_s.png differ diff --git a/public/guides/icons/sub_cats/1_s.png b/public/guides/icons/sub_cats/1_s.png new file mode 100644 index 00000000..669183c2 Binary files /dev/null and b/public/guides/icons/sub_cats/1_s.png differ diff --git a/public/guides/icons/sub_cats/2.png b/public/guides/icons/sub_cats/2.png new file mode 100644 index 00000000..b90b5d28 Binary files /dev/null and b/public/guides/icons/sub_cats/2.png differ diff --git a/public/guides/icons/sub_cats/20.png b/public/guides/icons/sub_cats/20.png new file mode 100644 index 00000000..c5f7bbd1 Binary files /dev/null and b/public/guides/icons/sub_cats/20.png differ diff --git a/public/guides/icons/sub_cats/20_s.png b/public/guides/icons/sub_cats/20_s.png new file mode 100644 index 00000000..e1a1bc0c Binary files /dev/null and b/public/guides/icons/sub_cats/20_s.png differ diff --git a/public/guides/icons/sub_cats/21.png b/public/guides/icons/sub_cats/21.png new file mode 100644 index 00000000..135dfa45 Binary files /dev/null and b/public/guides/icons/sub_cats/21.png differ diff --git a/public/guides/icons/sub_cats/21_s.png b/public/guides/icons/sub_cats/21_s.png new file mode 100644 index 00000000..724bf012 Binary files /dev/null and b/public/guides/icons/sub_cats/21_s.png differ diff --git a/public/guides/icons/sub_cats/22.png b/public/guides/icons/sub_cats/22.png new file mode 100644 index 00000000..65f54253 Binary files /dev/null and b/public/guides/icons/sub_cats/22.png differ diff --git a/public/guides/icons/sub_cats/22_s.png b/public/guides/icons/sub_cats/22_s.png new file mode 100644 index 00000000..087b2dbb Binary files /dev/null and b/public/guides/icons/sub_cats/22_s.png differ diff --git a/public/guides/icons/sub_cats/23.png b/public/guides/icons/sub_cats/23.png new file mode 100644 index 00000000..0575ef51 Binary files /dev/null and b/public/guides/icons/sub_cats/23.png differ diff --git a/public/guides/icons/sub_cats/23_s.png b/public/guides/icons/sub_cats/23_s.png new file mode 100644 index 00000000..39225ebf Binary files /dev/null and b/public/guides/icons/sub_cats/23_s.png differ diff --git a/public/guides/icons/sub_cats/24.png b/public/guides/icons/sub_cats/24.png new file mode 100644 index 00000000..381d7fa4 Binary files /dev/null and b/public/guides/icons/sub_cats/24.png differ diff --git a/public/guides/icons/sub_cats/24_s.png b/public/guides/icons/sub_cats/24_s.png new file mode 100644 index 00000000..4b366757 Binary files /dev/null and b/public/guides/icons/sub_cats/24_s.png differ diff --git a/public/guides/icons/sub_cats/25.png b/public/guides/icons/sub_cats/25.png new file mode 100644 index 00000000..a825e1b5 Binary files /dev/null and b/public/guides/icons/sub_cats/25.png differ diff --git a/public/guides/icons/sub_cats/25_s.png b/public/guides/icons/sub_cats/25_s.png new file mode 100644 index 00000000..96734bf0 Binary files /dev/null and b/public/guides/icons/sub_cats/25_s.png differ diff --git a/public/guides/icons/sub_cats/26.png b/public/guides/icons/sub_cats/26.png new file mode 100644 index 00000000..f642f765 Binary files /dev/null and b/public/guides/icons/sub_cats/26.png differ diff --git a/public/guides/icons/sub_cats/26_s.png b/public/guides/icons/sub_cats/26_s.png new file mode 100644 index 00000000..7db54086 Binary files /dev/null and b/public/guides/icons/sub_cats/26_s.png differ diff --git a/public/guides/icons/sub_cats/27.png b/public/guides/icons/sub_cats/27.png new file mode 100644 index 00000000..44be04a1 Binary files /dev/null and b/public/guides/icons/sub_cats/27.png differ diff --git a/public/guides/icons/sub_cats/27_s.png b/public/guides/icons/sub_cats/27_s.png new file mode 100644 index 00000000..27dee1e0 Binary files /dev/null and b/public/guides/icons/sub_cats/27_s.png differ diff --git a/public/guides/icons/sub_cats/28.png b/public/guides/icons/sub_cats/28.png new file mode 100644 index 00000000..c9b01db0 Binary files /dev/null and b/public/guides/icons/sub_cats/28.png differ diff --git a/public/guides/icons/sub_cats/28_s.png b/public/guides/icons/sub_cats/28_s.png new file mode 100644 index 00000000..acd3d2f1 Binary files /dev/null and b/public/guides/icons/sub_cats/28_s.png differ diff --git a/public/guides/icons/sub_cats/29.png b/public/guides/icons/sub_cats/29.png new file mode 100644 index 00000000..d42fe4c1 Binary files /dev/null and b/public/guides/icons/sub_cats/29.png differ diff --git a/public/guides/icons/sub_cats/29_s.png b/public/guides/icons/sub_cats/29_s.png new file mode 100644 index 00000000..09cb113c Binary files /dev/null and b/public/guides/icons/sub_cats/29_s.png differ diff --git a/public/guides/icons/sub_cats/2_s.png b/public/guides/icons/sub_cats/2_s.png new file mode 100644 index 00000000..5c85a1b9 Binary files /dev/null and b/public/guides/icons/sub_cats/2_s.png differ diff --git a/public/guides/icons/sub_cats/3.png b/public/guides/icons/sub_cats/3.png new file mode 100644 index 00000000..70ae5a9c Binary files /dev/null and b/public/guides/icons/sub_cats/3.png differ diff --git a/public/guides/icons/sub_cats/30.png b/public/guides/icons/sub_cats/30.png new file mode 100644 index 00000000..b94497fa Binary files /dev/null and b/public/guides/icons/sub_cats/30.png differ diff --git a/public/guides/icons/sub_cats/30_s.png b/public/guides/icons/sub_cats/30_s.png new file mode 100644 index 00000000..ea0eac30 Binary files /dev/null and b/public/guides/icons/sub_cats/30_s.png differ diff --git a/public/guides/icons/sub_cats/31.png b/public/guides/icons/sub_cats/31.png new file mode 100644 index 00000000..823bd584 Binary files /dev/null and b/public/guides/icons/sub_cats/31.png differ diff --git a/public/guides/icons/sub_cats/31_s.png b/public/guides/icons/sub_cats/31_s.png new file mode 100644 index 00000000..9fb3ed6c Binary files /dev/null and b/public/guides/icons/sub_cats/31_s.png differ diff --git a/public/guides/icons/sub_cats/32.png b/public/guides/icons/sub_cats/32.png new file mode 100644 index 00000000..4e96affb Binary files /dev/null and b/public/guides/icons/sub_cats/32.png differ diff --git a/public/guides/icons/sub_cats/32_s.png b/public/guides/icons/sub_cats/32_s.png new file mode 100644 index 00000000..dfc713c6 Binary files /dev/null and b/public/guides/icons/sub_cats/32_s.png differ diff --git a/public/guides/icons/sub_cats/33.png b/public/guides/icons/sub_cats/33.png new file mode 100644 index 00000000..10c32fe7 Binary files /dev/null and b/public/guides/icons/sub_cats/33.png differ diff --git a/public/guides/icons/sub_cats/33_s.png b/public/guides/icons/sub_cats/33_s.png new file mode 100644 index 00000000..574ed4bb Binary files /dev/null and b/public/guides/icons/sub_cats/33_s.png differ diff --git a/public/guides/icons/sub_cats/34.png b/public/guides/icons/sub_cats/34.png new file mode 100644 index 00000000..a2ebae82 Binary files /dev/null and b/public/guides/icons/sub_cats/34.png differ diff --git a/public/guides/icons/sub_cats/34_s.png b/public/guides/icons/sub_cats/34_s.png new file mode 100644 index 00000000..d8888206 Binary files /dev/null and b/public/guides/icons/sub_cats/34_s.png differ diff --git a/public/guides/icons/sub_cats/35.png b/public/guides/icons/sub_cats/35.png new file mode 100644 index 00000000..d66318c6 Binary files /dev/null and b/public/guides/icons/sub_cats/35.png differ diff --git a/public/guides/icons/sub_cats/35_s.png b/public/guides/icons/sub_cats/35_s.png new file mode 100644 index 00000000..26b8aca4 Binary files /dev/null and b/public/guides/icons/sub_cats/35_s.png differ diff --git a/public/guides/icons/sub_cats/36.png b/public/guides/icons/sub_cats/36.png new file mode 100644 index 00000000..fb5553a0 Binary files /dev/null and b/public/guides/icons/sub_cats/36.png differ diff --git a/public/guides/icons/sub_cats/36_s.png b/public/guides/icons/sub_cats/36_s.png new file mode 100644 index 00000000..878bf649 Binary files /dev/null and b/public/guides/icons/sub_cats/36_s.png differ diff --git a/public/guides/icons/sub_cats/37.png b/public/guides/icons/sub_cats/37.png new file mode 100644 index 00000000..03487711 Binary files /dev/null and b/public/guides/icons/sub_cats/37.png differ diff --git a/public/guides/icons/sub_cats/37_s.png b/public/guides/icons/sub_cats/37_s.png new file mode 100644 index 00000000..e9871b16 Binary files /dev/null and b/public/guides/icons/sub_cats/37_s.png differ diff --git a/public/guides/icons/sub_cats/38.png b/public/guides/icons/sub_cats/38.png new file mode 100644 index 00000000..3f78c530 Binary files /dev/null and b/public/guides/icons/sub_cats/38.png differ diff --git a/public/guides/icons/sub_cats/38_s.png b/public/guides/icons/sub_cats/38_s.png new file mode 100644 index 00000000..97d4b188 Binary files /dev/null and b/public/guides/icons/sub_cats/38_s.png differ diff --git a/public/guides/icons/sub_cats/39.png b/public/guides/icons/sub_cats/39.png new file mode 100644 index 00000000..cf6d5628 Binary files /dev/null and b/public/guides/icons/sub_cats/39.png differ diff --git a/public/guides/icons/sub_cats/39_s.png b/public/guides/icons/sub_cats/39_s.png new file mode 100644 index 00000000..90da6361 Binary files /dev/null and b/public/guides/icons/sub_cats/39_s.png differ diff --git a/public/guides/icons/sub_cats/3_s.png b/public/guides/icons/sub_cats/3_s.png new file mode 100644 index 00000000..5291411f Binary files /dev/null and b/public/guides/icons/sub_cats/3_s.png differ diff --git a/public/guides/icons/sub_cats/4.png b/public/guides/icons/sub_cats/4.png new file mode 100644 index 00000000..9bb6798e Binary files /dev/null and b/public/guides/icons/sub_cats/4.png differ diff --git a/public/guides/icons/sub_cats/40.png b/public/guides/icons/sub_cats/40.png new file mode 100644 index 00000000..bd200a6d Binary files /dev/null and b/public/guides/icons/sub_cats/40.png differ diff --git a/public/guides/icons/sub_cats/40_s.png b/public/guides/icons/sub_cats/40_s.png new file mode 100644 index 00000000..3ee99fa7 Binary files /dev/null and b/public/guides/icons/sub_cats/40_s.png differ diff --git a/public/guides/icons/sub_cats/41.png b/public/guides/icons/sub_cats/41.png new file mode 100644 index 00000000..3ba95f51 Binary files /dev/null and b/public/guides/icons/sub_cats/41.png differ diff --git a/public/guides/icons/sub_cats/41_s.png b/public/guides/icons/sub_cats/41_s.png new file mode 100644 index 00000000..334406c1 Binary files /dev/null and b/public/guides/icons/sub_cats/41_s.png differ diff --git a/public/guides/icons/sub_cats/42.png b/public/guides/icons/sub_cats/42.png new file mode 100644 index 00000000..636a7ffe Binary files /dev/null and b/public/guides/icons/sub_cats/42.png differ diff --git a/public/guides/icons/sub_cats/42_s.png b/public/guides/icons/sub_cats/42_s.png new file mode 100644 index 00000000..de2850cb Binary files /dev/null and b/public/guides/icons/sub_cats/42_s.png differ diff --git a/public/guides/icons/sub_cats/43.png b/public/guides/icons/sub_cats/43.png new file mode 100644 index 00000000..8612f2dc Binary files /dev/null and b/public/guides/icons/sub_cats/43.png differ diff --git a/public/guides/icons/sub_cats/43_s.png b/public/guides/icons/sub_cats/43_s.png new file mode 100644 index 00000000..41048853 Binary files /dev/null and b/public/guides/icons/sub_cats/43_s.png differ diff --git a/public/guides/icons/sub_cats/44.png b/public/guides/icons/sub_cats/44.png new file mode 100644 index 00000000..1d8a8d97 Binary files /dev/null and b/public/guides/icons/sub_cats/44.png differ diff --git a/public/guides/icons/sub_cats/44_s.png b/public/guides/icons/sub_cats/44_s.png new file mode 100644 index 00000000..3064f408 Binary files /dev/null and b/public/guides/icons/sub_cats/44_s.png differ diff --git a/public/guides/icons/sub_cats/45.png b/public/guides/icons/sub_cats/45.png new file mode 100644 index 00000000..93d6fd26 Binary files /dev/null and b/public/guides/icons/sub_cats/45.png differ diff --git a/public/guides/icons/sub_cats/45_s.png b/public/guides/icons/sub_cats/45_s.png new file mode 100644 index 00000000..2da8023f Binary files /dev/null and b/public/guides/icons/sub_cats/45_s.png differ diff --git a/public/guides/icons/sub_cats/46.png b/public/guides/icons/sub_cats/46.png new file mode 100644 index 00000000..ecad28eb Binary files /dev/null and b/public/guides/icons/sub_cats/46.png differ diff --git a/public/guides/icons/sub_cats/46_s.png b/public/guides/icons/sub_cats/46_s.png new file mode 100644 index 00000000..8746c25b Binary files /dev/null and b/public/guides/icons/sub_cats/46_s.png differ diff --git a/public/guides/icons/sub_cats/47.png b/public/guides/icons/sub_cats/47.png new file mode 100644 index 00000000..bfed04ac Binary files /dev/null and b/public/guides/icons/sub_cats/47.png differ diff --git a/public/guides/icons/sub_cats/47_s.png b/public/guides/icons/sub_cats/47_s.png new file mode 100644 index 00000000..36c0e545 Binary files /dev/null and b/public/guides/icons/sub_cats/47_s.png differ diff --git a/public/guides/icons/sub_cats/48.png b/public/guides/icons/sub_cats/48.png new file mode 100644 index 00000000..1127c622 Binary files /dev/null and b/public/guides/icons/sub_cats/48.png differ diff --git a/public/guides/icons/sub_cats/48_s.png b/public/guides/icons/sub_cats/48_s.png new file mode 100644 index 00000000..460703e5 Binary files /dev/null and b/public/guides/icons/sub_cats/48_s.png differ diff --git a/public/guides/icons/sub_cats/49.png b/public/guides/icons/sub_cats/49.png new file mode 100644 index 00000000..4a4eac13 Binary files /dev/null and b/public/guides/icons/sub_cats/49.png differ diff --git a/public/guides/icons/sub_cats/49_s.png b/public/guides/icons/sub_cats/49_s.png new file mode 100644 index 00000000..8632b92d Binary files /dev/null and b/public/guides/icons/sub_cats/49_s.png differ diff --git a/public/guides/icons/sub_cats/4_s.png b/public/guides/icons/sub_cats/4_s.png new file mode 100644 index 00000000..3932d15f Binary files /dev/null and b/public/guides/icons/sub_cats/4_s.png differ diff --git a/public/guides/icons/sub_cats/5.png b/public/guides/icons/sub_cats/5.png new file mode 100644 index 00000000..855d741a Binary files /dev/null and b/public/guides/icons/sub_cats/5.png differ diff --git a/public/guides/icons/sub_cats/50.png b/public/guides/icons/sub_cats/50.png new file mode 100644 index 00000000..ebccc204 Binary files /dev/null and b/public/guides/icons/sub_cats/50.png differ diff --git a/public/guides/icons/sub_cats/50_s.png b/public/guides/icons/sub_cats/50_s.png new file mode 100644 index 00000000..0b2e1df2 Binary files /dev/null and b/public/guides/icons/sub_cats/50_s.png differ diff --git a/public/guides/icons/sub_cats/51.png b/public/guides/icons/sub_cats/51.png new file mode 100644 index 00000000..602654f3 Binary files /dev/null and b/public/guides/icons/sub_cats/51.png differ diff --git a/public/guides/icons/sub_cats/51_s.png b/public/guides/icons/sub_cats/51_s.png new file mode 100644 index 00000000..7b05275c Binary files /dev/null and b/public/guides/icons/sub_cats/51_s.png differ diff --git a/public/guides/icons/sub_cats/52.png b/public/guides/icons/sub_cats/52.png new file mode 100644 index 00000000..5e211741 Binary files /dev/null and b/public/guides/icons/sub_cats/52.png differ diff --git a/public/guides/icons/sub_cats/52_s.png b/public/guides/icons/sub_cats/52_s.png new file mode 100644 index 00000000..7f6cc0b7 Binary files /dev/null and b/public/guides/icons/sub_cats/52_s.png differ diff --git a/public/guides/icons/sub_cats/53.png b/public/guides/icons/sub_cats/53.png new file mode 100644 index 00000000..c21976d9 Binary files /dev/null and b/public/guides/icons/sub_cats/53.png differ diff --git a/public/guides/icons/sub_cats/53_s.png b/public/guides/icons/sub_cats/53_s.png new file mode 100644 index 00000000..e5994679 Binary files /dev/null and b/public/guides/icons/sub_cats/53_s.png differ diff --git a/public/guides/icons/sub_cats/54.png b/public/guides/icons/sub_cats/54.png new file mode 100644 index 00000000..2f1debed Binary files /dev/null and b/public/guides/icons/sub_cats/54.png differ diff --git a/public/guides/icons/sub_cats/54_s.png b/public/guides/icons/sub_cats/54_s.png new file mode 100644 index 00000000..5f7df01a Binary files /dev/null and b/public/guides/icons/sub_cats/54_s.png differ diff --git a/public/guides/icons/sub_cats/55.png b/public/guides/icons/sub_cats/55.png new file mode 100644 index 00000000..2937009d Binary files /dev/null and b/public/guides/icons/sub_cats/55.png differ diff --git a/public/guides/icons/sub_cats/55_s.png b/public/guides/icons/sub_cats/55_s.png new file mode 100644 index 00000000..edb4873b Binary files /dev/null and b/public/guides/icons/sub_cats/55_s.png differ diff --git a/public/guides/icons/sub_cats/56.png b/public/guides/icons/sub_cats/56.png new file mode 100644 index 00000000..f907d872 Binary files /dev/null and b/public/guides/icons/sub_cats/56.png differ diff --git a/public/guides/icons/sub_cats/56_s.png b/public/guides/icons/sub_cats/56_s.png new file mode 100644 index 00000000..415bba7c Binary files /dev/null and b/public/guides/icons/sub_cats/56_s.png differ diff --git a/public/guides/icons/sub_cats/57.png b/public/guides/icons/sub_cats/57.png new file mode 100644 index 00000000..c815e5b0 Binary files /dev/null and b/public/guides/icons/sub_cats/57.png differ diff --git a/public/guides/icons/sub_cats/57_s.png b/public/guides/icons/sub_cats/57_s.png new file mode 100644 index 00000000..92acc95d Binary files /dev/null and b/public/guides/icons/sub_cats/57_s.png differ diff --git a/public/guides/icons/sub_cats/58.png b/public/guides/icons/sub_cats/58.png new file mode 100644 index 00000000..aa4511b7 Binary files /dev/null and b/public/guides/icons/sub_cats/58.png differ diff --git a/public/guides/icons/sub_cats/58_s.png b/public/guides/icons/sub_cats/58_s.png new file mode 100644 index 00000000..7cf3151e Binary files /dev/null and b/public/guides/icons/sub_cats/58_s.png differ diff --git a/public/guides/icons/sub_cats/59.png b/public/guides/icons/sub_cats/59.png new file mode 100644 index 00000000..82c2dc5d Binary files /dev/null and b/public/guides/icons/sub_cats/59.png differ diff --git a/public/guides/icons/sub_cats/59_s.png b/public/guides/icons/sub_cats/59_s.png new file mode 100644 index 00000000..fd00d8d6 Binary files /dev/null and b/public/guides/icons/sub_cats/59_s.png differ diff --git a/public/guides/icons/sub_cats/5_s.png b/public/guides/icons/sub_cats/5_s.png new file mode 100644 index 00000000..26a78baf Binary files /dev/null and b/public/guides/icons/sub_cats/5_s.png differ diff --git a/public/guides/icons/sub_cats/6.png b/public/guides/icons/sub_cats/6.png new file mode 100644 index 00000000..18b55ba4 Binary files /dev/null and b/public/guides/icons/sub_cats/6.png differ diff --git a/public/guides/icons/sub_cats/60.png b/public/guides/icons/sub_cats/60.png new file mode 100644 index 00000000..a5ef3bc4 Binary files /dev/null and b/public/guides/icons/sub_cats/60.png differ diff --git a/public/guides/icons/sub_cats/60_s.png b/public/guides/icons/sub_cats/60_s.png new file mode 100644 index 00000000..1c6d6c5c Binary files /dev/null and b/public/guides/icons/sub_cats/60_s.png differ diff --git a/public/guides/icons/sub_cats/61.png b/public/guides/icons/sub_cats/61.png new file mode 100644 index 00000000..642e2bfb Binary files /dev/null and b/public/guides/icons/sub_cats/61.png differ diff --git a/public/guides/icons/sub_cats/61_s.png b/public/guides/icons/sub_cats/61_s.png new file mode 100644 index 00000000..eee6a2b6 Binary files /dev/null and b/public/guides/icons/sub_cats/61_s.png differ diff --git a/public/guides/icons/sub_cats/62.png b/public/guides/icons/sub_cats/62.png new file mode 100644 index 00000000..a5ff35b9 Binary files /dev/null and b/public/guides/icons/sub_cats/62.png differ diff --git a/public/guides/icons/sub_cats/62_s.png b/public/guides/icons/sub_cats/62_s.png new file mode 100644 index 00000000..c9b75f1d Binary files /dev/null and b/public/guides/icons/sub_cats/62_s.png differ diff --git a/public/guides/icons/sub_cats/63.png b/public/guides/icons/sub_cats/63.png new file mode 100644 index 00000000..50901419 Binary files /dev/null and b/public/guides/icons/sub_cats/63.png differ diff --git a/public/guides/icons/sub_cats/63_s.png b/public/guides/icons/sub_cats/63_s.png new file mode 100644 index 00000000..607287f0 Binary files /dev/null and b/public/guides/icons/sub_cats/63_s.png differ diff --git a/public/guides/icons/sub_cats/64.png b/public/guides/icons/sub_cats/64.png new file mode 100644 index 00000000..119f4f32 Binary files /dev/null and b/public/guides/icons/sub_cats/64.png differ diff --git a/public/guides/icons/sub_cats/64_s.png b/public/guides/icons/sub_cats/64_s.png new file mode 100644 index 00000000..cc2b81bf Binary files /dev/null and b/public/guides/icons/sub_cats/64_s.png differ diff --git a/public/guides/icons/sub_cats/65.png b/public/guides/icons/sub_cats/65.png new file mode 100644 index 00000000..89826854 Binary files /dev/null and b/public/guides/icons/sub_cats/65.png differ diff --git a/public/guides/icons/sub_cats/65_s.png b/public/guides/icons/sub_cats/65_s.png new file mode 100644 index 00000000..59acafaa Binary files /dev/null and b/public/guides/icons/sub_cats/65_s.png differ diff --git a/public/guides/icons/sub_cats/6_s.png b/public/guides/icons/sub_cats/6_s.png new file mode 100644 index 00000000..82fc6850 Binary files /dev/null and b/public/guides/icons/sub_cats/6_s.png differ diff --git a/public/guides/icons/sub_cats/7.png b/public/guides/icons/sub_cats/7.png new file mode 100644 index 00000000..10b212d7 Binary files /dev/null and b/public/guides/icons/sub_cats/7.png differ diff --git a/public/guides/icons/sub_cats/7_s.png b/public/guides/icons/sub_cats/7_s.png new file mode 100644 index 00000000..159121b2 Binary files /dev/null and b/public/guides/icons/sub_cats/7_s.png differ diff --git a/public/guides/icons/sub_cats/8.png b/public/guides/icons/sub_cats/8.png new file mode 100644 index 00000000..972c291a Binary files /dev/null and b/public/guides/icons/sub_cats/8.png differ diff --git a/public/guides/icons/sub_cats/8_s.png b/public/guides/icons/sub_cats/8_s.png new file mode 100644 index 00000000..c0629825 Binary files /dev/null and b/public/guides/icons/sub_cats/8_s.png differ diff --git a/public/guides/icons/sub_cats/9.png b/public/guides/icons/sub_cats/9.png new file mode 100644 index 00000000..9f5fc25e Binary files /dev/null and b/public/guides/icons/sub_cats/9.png differ diff --git a/public/guides/icons/sub_cats/9_s.png b/public/guides/icons/sub_cats/9_s.png new file mode 100644 index 00000000..1462ba0f Binary files /dev/null and b/public/guides/icons/sub_cats/9_s.png differ diff --git a/public/guides/icons/unknown.png b/public/guides/icons/unknown.png new file mode 100644 index 00000000..e05648a9 Binary files /dev/null and b/public/guides/icons/unknown.png differ diff --git a/public/guides/icons/unknown_s.png b/public/guides/icons/unknown_s.png new file mode 100644 index 00000000..1b5472fb Binary files /dev/null and b/public/guides/icons/unknown_s.png differ diff --git a/public/guides/icons/woman_style/1.png b/public/guides/icons/woman_style/1.png new file mode 100644 index 00000000..907d8a1a Binary files /dev/null and b/public/guides/icons/woman_style/1.png differ diff --git a/public/guides/icons/woman_style/10.png b/public/guides/icons/woman_style/10.png new file mode 100644 index 00000000..00388ae8 Binary files /dev/null and b/public/guides/icons/woman_style/10.png differ diff --git a/public/guides/icons/woman_style/10_s.png b/public/guides/icons/woman_style/10_s.png new file mode 100644 index 00000000..e69a3168 Binary files /dev/null and b/public/guides/icons/woman_style/10_s.png differ diff --git a/public/guides/icons/woman_style/11.png b/public/guides/icons/woman_style/11.png new file mode 100644 index 00000000..c66e74f0 Binary files /dev/null and b/public/guides/icons/woman_style/11.png differ diff --git a/public/guides/icons/woman_style/11_s.png b/public/guides/icons/woman_style/11_s.png new file mode 100644 index 00000000..eeda5b14 Binary files /dev/null and b/public/guides/icons/woman_style/11_s.png differ diff --git a/public/guides/icons/woman_style/12.png b/public/guides/icons/woman_style/12.png new file mode 100644 index 00000000..f94de872 Binary files /dev/null and b/public/guides/icons/woman_style/12.png differ diff --git a/public/guides/icons/woman_style/12_s.png b/public/guides/icons/woman_style/12_s.png new file mode 100644 index 00000000..f6f7f1b4 Binary files /dev/null and b/public/guides/icons/woman_style/12_s.png differ diff --git a/public/guides/icons/woman_style/13.png b/public/guides/icons/woman_style/13.png new file mode 100644 index 00000000..414f387c Binary files /dev/null and b/public/guides/icons/woman_style/13.png differ diff --git a/public/guides/icons/woman_style/13_s.png b/public/guides/icons/woman_style/13_s.png new file mode 100644 index 00000000..50b31e87 Binary files /dev/null and b/public/guides/icons/woman_style/13_s.png differ diff --git a/public/guides/icons/woman_style/1_s.png b/public/guides/icons/woman_style/1_s.png new file mode 100644 index 00000000..0811c5b1 Binary files /dev/null and b/public/guides/icons/woman_style/1_s.png differ diff --git a/public/guides/icons/woman_style/2.png b/public/guides/icons/woman_style/2.png new file mode 100644 index 00000000..f513bbaf Binary files /dev/null and b/public/guides/icons/woman_style/2.png differ diff --git a/public/guides/icons/woman_style/2_s.png b/public/guides/icons/woman_style/2_s.png new file mode 100644 index 00000000..e074c283 Binary files /dev/null and b/public/guides/icons/woman_style/2_s.png differ diff --git a/public/guides/icons/woman_style/3.png b/public/guides/icons/woman_style/3.png new file mode 100644 index 00000000..50097fde Binary files /dev/null and b/public/guides/icons/woman_style/3.png differ diff --git a/public/guides/icons/woman_style/3_s.png b/public/guides/icons/woman_style/3_s.png new file mode 100644 index 00000000..09678fd7 Binary files /dev/null and b/public/guides/icons/woman_style/3_s.png differ diff --git a/public/guides/icons/woman_style/4.png b/public/guides/icons/woman_style/4.png new file mode 100644 index 00000000..aed8dfc1 Binary files /dev/null and b/public/guides/icons/woman_style/4.png differ diff --git a/public/guides/icons/woman_style/4_s.png b/public/guides/icons/woman_style/4_s.png new file mode 100644 index 00000000..bbc606ab Binary files /dev/null and b/public/guides/icons/woman_style/4_s.png differ diff --git a/public/guides/icons/woman_style/5.png b/public/guides/icons/woman_style/5.png new file mode 100644 index 00000000..8f464655 Binary files /dev/null and b/public/guides/icons/woman_style/5.png differ diff --git a/public/guides/icons/woman_style/5_s.png b/public/guides/icons/woman_style/5_s.png new file mode 100644 index 00000000..19dbc68a Binary files /dev/null and b/public/guides/icons/woman_style/5_s.png differ diff --git a/public/guides/icons/woman_style/6.png b/public/guides/icons/woman_style/6.png new file mode 100644 index 00000000..c0a87d70 Binary files /dev/null and b/public/guides/icons/woman_style/6.png differ diff --git a/public/guides/icons/woman_style/6_s.png b/public/guides/icons/woman_style/6_s.png new file mode 100644 index 00000000..18a6e15f Binary files /dev/null and b/public/guides/icons/woman_style/6_s.png differ diff --git a/public/guides/icons/woman_style/7.png b/public/guides/icons/woman_style/7.png new file mode 100644 index 00000000..558b919e Binary files /dev/null and b/public/guides/icons/woman_style/7.png differ diff --git a/public/guides/icons/woman_style/7_s.png b/public/guides/icons/woman_style/7_s.png new file mode 100644 index 00000000..a241aee8 Binary files /dev/null and b/public/guides/icons/woman_style/7_s.png differ diff --git a/public/guides/icons/woman_style/8.png b/public/guides/icons/woman_style/8.png new file mode 100644 index 00000000..772461a5 Binary files /dev/null and b/public/guides/icons/woman_style/8.png differ diff --git a/public/guides/icons/woman_style/8_s.png b/public/guides/icons/woman_style/8_s.png new file mode 100644 index 00000000..17185e62 Binary files /dev/null and b/public/guides/icons/woman_style/8_s.png differ diff --git a/public/guides/icons/woman_style/9.png b/public/guides/icons/woman_style/9.png new file mode 100644 index 00000000..2d020cba Binary files /dev/null and b/public/guides/icons/woman_style/9.png differ diff --git a/public/guides/icons/woman_style/9_s.png b/public/guides/icons/woman_style/9_s.png new file mode 100644 index 00000000..323d00e0 Binary files /dev/null and b/public/guides/icons/woman_style/9_s.png differ diff --git a/public/ico/box.png b/public/ico/box.png new file mode 100644 index 00000000..8b6f9aa8 Binary files /dev/null and b/public/ico/box.png differ diff --git a/public/ico/cloud-upload.png b/public/ico/cloud-upload.png new file mode 100644 index 00000000..abd92766 Binary files /dev/null and b/public/ico/cloud-upload.png differ diff --git a/public/ico/cloud-uploading.png b/public/ico/cloud-uploading.png new file mode 100644 index 00000000..a8541fec Binary files /dev/null and b/public/ico/cloud-uploading.png differ diff --git a/public/ico/info.png b/public/ico/info.png new file mode 100644 index 00000000..80ee11c3 Binary files /dev/null and b/public/ico/info.png differ diff --git a/public/ico/outline-off.png b/public/ico/outline-off.png new file mode 100644 index 00000000..25641aec Binary files /dev/null and b/public/ico/outline-off.png differ diff --git a/public/ico/user.png b/public/ico/user.png new file mode 100644 index 00000000..41b069c1 Binary files /dev/null and b/public/ico/user.png differ diff --git a/public/index.html b/public/index.html index 42d0ee1c..b687c764 100644 --- a/public/index.html +++ b/public/index.html @@ -1,32 +1,52 @@ - + + + - + - gtag('config', 'UA-155837750-1'); - - - - - - - - - - - - Make Sense - - - - -
- - + --> diff --git a/public/showniq-icon.png b/public/showniq-icon.png new file mode 100644 index 00000000..18741adb Binary files /dev/null and b/public/showniq-icon.png differ diff --git a/resizeImage.py b/resizeImage.py new file mode 100644 index 00000000..2275825e --- /dev/null +++ b/resizeImage.py @@ -0,0 +1,29 @@ +from PIL import Image +import os, sys + +dir_path = "./public/guides/icons" + +def resize_im(path, size=(96,96)): + if os.path.isfile(path): + im = Image.open(path).resize(size, Image.ANTIALIAS) + im.save(path) + # parent_dir = os.path.dirname(path) + # img_name = os.path.basename(path).split('.')[0] + # im.save(os.path.join(parent_dir, img_name + 'r.jpg'), 'JPEG', quality=90) + +def resize_all(mydir): + for subdir , _ , fileList in os.walk(mydir): + for f in fileList: + try: + full_path = os.path.join(subdir,f) + if(full_path.endswith("_s.png")): + resize_im(full_path) + elif(full_path.endswith(".png")): + resize_im(full_path, size=(300, 300)) + else: + print("Not a png file: " + full_path) + except Exception as e: + print('Unable to resize %s. Skipping.' % full_path) + +if __name__ == '__main__': + resize_all(dir_path) \ No newline at end of file diff --git a/src/App.scss b/src/App.scss index 82b954c9..0e041fad 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1,13 +1,19 @@ @import './settings/_Settings'; .App { - --leading-color: #{$secondaryColor}; - --button-text-color: #{white}; - --hue-value: 172deg; + --leading-color: #{$secondaryColor}; + --button-text-color: #{white}; + --hue-value: 172deg; + --red-value: -15deg; + --green-value: 35deg; + position: relative; + margin-left: auto; + margin-right: auto; + max-width: 3840px; } .App.AI { - --leading-color: #{$primaryColor}; - --button-text-color: #{$darkThemeSecondColor}; - --hue-value: 120deg; -} \ No newline at end of file + --leading-color: #{$primaryColor}; + --button-text-color: #{$darkThemeSecondColor}; + --hue-value: 120deg; +} diff --git a/src/App.tsx b/src/App.tsx index b7705d05..c03b768f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useEffect, useState} from 'react'; import './App.scss'; import EditorView from './views/EditorView/EditorView'; import MainView from './views/MainView/MainView'; @@ -13,47 +13,91 @@ import {SizeItUpView} from './views/SizeItUpView/SizeItUpView'; import {PlatformModel} from './staticModels/PlatformModel'; import classNames from 'classnames'; import NotificationsView from './views/NotificationsView/NotificationsView'; +import {updateActivePopupType} from './store/general/actionCreators'; +import {PopupWindowType} from './data/enums/PopupWindowType'; +import {updateAuthData} from './store/auth/actionCreators'; +import {AuthData} from './store/auth/types'; interface IProps { projectType: ProjectType; windowSize: ISize; ObjectDetectorLoaded: boolean; PoseDetectionLoaded: boolean; + updateAuthDataAction: (authData: AuthData) => any; + updateActivePopupTypeAction: (type: PopupWindowType) => void; + authData: AuthData; } -const App: React.FC = ({projectType, windowSize, ObjectDetectorLoaded, PoseDetectionLoaded}) => { +const App: React.FC = ({ + projectType, + windowSize, + ObjectDetectorLoaded, + PoseDetectionLoaded, + updateAuthDataAction, + updateActivePopupTypeAction, + authData +}) => { + + useEffect(() => { + const auth: AuthData = JSON.parse( + window.localStorage.getItem('@@auth') + ); + // console.log('auth = ', auth); + if (!auth) { + updateActivePopupTypeAction(PopupWindowType.LOGIN); + } else { + updateAuthDataAction(auth); + } + + return () => { + // second + }; + }, [authData.authToken]); + const selectRoute = () => { - if (!!PlatformModel.mobileDeviceData.manufacturer && !!PlatformModel.mobileDeviceData.os) - return ; - if (!projectType) - return ; + + if ( + !!PlatformModel.mobileDeviceData.manufacturer && + !!PlatformModel.mobileDeviceData.os + ) + return ; + if (!projectType) return ; else { - if (windowSize.height < Settings.EDITOR_MIN_HEIGHT || windowSize.width < Settings.EDITOR_MIN_WIDTH) { - return ; + if ( + windowSize.height < Settings.EDITOR_MIN_HEIGHT || + windowSize.width < Settings.EDITOR_MIN_WIDTH + ) { + return ; } else { - return ; + return ; } } }; - return ( -
+ return ( +
{selectRoute()} - - + +
- ); + ); +}; + +const mapDispatchToProps = { + updateAuthDataAction: updateAuthData, + updateActivePopupTypeAction: updateActivePopupType }; const mapStateToProps = (state: AppState) => ({ projectType: state.general.projectData.type, windowSize: state.general.windowSize, ObjectDetectorLoaded: state.ai.isObjectDetectorLoaded, - PoseDetectionLoaded: state.ai.isPoseDetectorLoaded + PoseDetectionLoaded: state.ai.isPoseDetectorLoaded, + authData: state.auth.authData }); -export default connect( - mapStateToProps -)(App); +export default connect(mapStateToProps, mapDispatchToProps)(App); diff --git a/src/assets/icons/LogoLogin.svg b/src/assets/icons/LogoLogin.svg new file mode 100644 index 00000000..bb751c4b --- /dev/null +++ b/src/assets/icons/LogoLogin.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/MoveIcon.svg b/src/assets/icons/MoveIcon.svg new file mode 100644 index 00000000..d67400f1 --- /dev/null +++ b/src/assets/icons/MoveIcon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/TextLogin.svg b/src/assets/icons/TextLogin.svg new file mode 100644 index 00000000..e227929a --- /dev/null +++ b/src/assets/icons/TextLogin.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/bi_eye.svg b/src/assets/icons/bi_eye.svg new file mode 100644 index 00000000..8bb2f53e --- /dev/null +++ b/src/assets/icons/bi_eye.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/chevron-right-black.svg b/src/assets/icons/chevron-right-black.svg new file mode 100644 index 00000000..5704297c --- /dev/null +++ b/src/assets/icons/chevron-right-black.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/chevron-right-white.svg b/src/assets/icons/chevron-right-white.svg new file mode 100644 index 00000000..b60acb8a --- /dev/null +++ b/src/assets/icons/chevron-right-white.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/codicon_account.svg b/src/assets/icons/codicon_account.svg new file mode 100644 index 00000000..380bae5d --- /dev/null +++ b/src/assets/icons/codicon_account.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js new file mode 100644 index 00000000..0ca70328 --- /dev/null +++ b/src/assets/icons/index.js @@ -0,0 +1,9 @@ +export { ReactComponent as IconLogo } from "./logo.svg"; +export { ReactComponent as LogoLogin } from './LogoLogin.svg' +export { ReactComponent as TextLogin } from './TextLogin.svg' +export { ReactComponent as CodiconAccount } from './codicon_account.svg' +export { ReactComponent as Eye } from './bi_eye.svg' +export { ReactComponent as MoveIcon } from './MoveIcon.svg' +export { ReactComponent as Package } from './package.svg' +export { ReactComponent as ChevronRightBlack } from './chevron-right-black.svg' +export { ReactComponent as ChevronRightWhite } from './chevron-right-white.svg' \ No newline at end of file diff --git a/src/assets/icons/logo.svg b/src/assets/icons/logo.svg new file mode 100644 index 00000000..0a5e0cc5 --- /dev/null +++ b/src/assets/icons/logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/package.svg b/src/assets/icons/package.svg new file mode 100644 index 00000000..ec3985cd --- /dev/null +++ b/src/assets/icons/package.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/img/backgroundImage.png b/src/assets/img/backgroundImage.png new file mode 100644 index 00000000..e1a7f5c8 Binary files /dev/null and b/src/assets/img/backgroundImage.png differ diff --git a/src/assets/img/groupPeople.png b/src/assets/img/groupPeople.png new file mode 100644 index 00000000..95e3c561 Binary files /dev/null and b/src/assets/img/groupPeople.png differ diff --git a/src/components/WrapperLogin/index.scss b/src/components/WrapperLogin/index.scss new file mode 100644 index 00000000..fa222797 --- /dev/null +++ b/src/components/WrapperLogin/index.scss @@ -0,0 +1,27 @@ + +.login { + &__container{ + height: 100vh ; + width: 100%; + } + + &__logoLogin{ + position: absolute; + top: 70px; + left: 147px; + } + &__textImageLogin{ + position: absolute; + left: 147px; + top: 236px; + } + + + + @media screen and (max-width: 768px) { + &__parent { + min-width: 100%; + } + } +} + diff --git a/src/components/WrapperLogin/index.tsx b/src/components/WrapperLogin/index.tsx new file mode 100644 index 00000000..28c73da2 --- /dev/null +++ b/src/components/WrapperLogin/index.tsx @@ -0,0 +1,18 @@ +import React from "react"; +import { TextLogin, LogoLogin } from "../../assets/icons" +import GroupImageSrc from "../../assets/img/groupPeople.png" +import "./index.scss" +function WrapperLogin(props) { + const { children } = props + return ( + <> + + +
+ {children} + img +
+ + ); +} +export default WrapperLogin; diff --git a/src/data/ExportFormatData.ts b/src/data/ExportFormatData.ts index 540536a5..2c618128 100644 --- a/src/data/ExportFormatData.ts +++ b/src/data/ExportFormatData.ts @@ -6,6 +6,10 @@ export type ExportFormatDataMap = Record; export const ExportFormatData: ExportFormatDataMap = { [LabelType.RECT]: [ + { + type: AnnotationFormatType.JSON, + label: 'A .zip package containing files in Custom JSON format.' + }, { type: AnnotationFormatType.YOLO, label: 'A .zip package containing files in YOLO format.' @@ -51,4 +55,4 @@ export const ExportFormatData: ExportFormatDataMap = { label: 'Single JSON file.' } ] -} +}; diff --git a/src/data/ImportFormatData.ts b/src/data/ImportFormatData.ts index 46cc6ca1..9d04417c 100644 --- a/src/data/ImportFormatData.ts +++ b/src/data/ImportFormatData.ts @@ -2,10 +2,14 @@ import {LabelType} from './enums/LabelType'; import {ILabelFormatData} from '../interfaces/ILabelFormatData'; import {AnnotationFormatType} from './enums/AnnotationFormatType'; -export type ImportFormatDataMap = Record +export type ImportFormatDataMap = Record; export const ImportFormatData: ImportFormatDataMap = { [LabelType.RECT]: [ + { + type: AnnotationFormatType.MJ, + label: 'Multiple files in MJ JSON format.' + }, { type: AnnotationFormatType.COCO, label: 'Single file in COCO JSON format.' @@ -24,4 +28,4 @@ export const ImportFormatData: ImportFormatDataMap = { } ], [LabelType.IMAGE_RECOGNITION]: [] -} +}; diff --git a/src/data/ImporterSpecData.ts b/src/data/ImporterSpecData.ts index c2cd3fb2..23f6b8af 100644 --- a/src/data/ImporterSpecData.ts +++ b/src/data/ImporterSpecData.ts @@ -2,9 +2,12 @@ import {AnnotationFormatType} from './enums/AnnotationFormatType'; import {AnnotationImporter} from '../logic/import/AnnotationImporter'; import {COCOImporter} from '../logic/import/coco/COCOImporter'; import {YOLOImporter} from '../logic/import/yolo/YOLOImporter'; +import {MJImporter} from '../logic/import/MJ/MJImporter'; -export type ImporterSpecDataMap = Record; - +export type ImporterSpecDataMap = Record< + AnnotationFormatType, + typeof AnnotationImporter +>; export const ImporterSpecData: ImporterSpecDataMap = { [AnnotationFormatType.COCO]: COCOImporter, @@ -12,5 +15,6 @@ export const ImporterSpecData: ImporterSpecDataMap = { [AnnotationFormatType.JSON]: undefined, [AnnotationFormatType.VGG]: undefined, [AnnotationFormatType.VOC]: undefined, - [AnnotationFormatType.YOLO]: YOLOImporter -} + [AnnotationFormatType.YOLO]: YOLOImporter, + [AnnotationFormatType.MJ]: MJImporter +}; diff --git a/src/data/enums/AnnotationFormatType.ts b/src/data/enums/AnnotationFormatType.ts index 2e98b248..f3199fbc 100644 --- a/src/data/enums/AnnotationFormatType.ts +++ b/src/data/enums/AnnotationFormatType.ts @@ -4,5 +4,6 @@ export enum AnnotationFormatType { CSV = 'CSV', JSON = 'JSON', VOC = 'VOC', - VGG = 'VGG' -} \ No newline at end of file + VGG = 'VGG', + MJ = 'MJ' +} diff --git a/src/data/enums/ContextType.ts b/src/data/enums/ContextType.ts index c806707c..baf22012 100644 --- a/src/data/enums/ContextType.ts +++ b/src/data/enums/ContextType.ts @@ -1,7 +1,8 @@ export enum ContextType { - EDITOR = "EDITOR", - LEFT_NAVBAR = "LEFT_NAVBAR", - RIGHT_NAVBAR = "RIGHT_NAVBAR", - POPUP = "POPUP", - DROPDOWN = "DROPDOWN" -} \ No newline at end of file + EDITOR = 'EDITOR', + LEFT_NAVBAR = 'LEFT_NAVBAR', + GUIDE_NAVBAR = 'GUIDE_NAVBAR', + RIGHT_NAVBAR = 'RIGHT_NAVBAR', + POPUP = 'POPUP', + DROPDOWN = 'DROPDOWN' +} diff --git a/src/data/enums/ItemType.ts b/src/data/enums/ItemType.ts new file mode 100644 index 00000000..71867ff2 --- /dev/null +++ b/src/data/enums/ItemType.ts @@ -0,0 +1,494 @@ +import _ from 'lodash'; + +export enum ATTRIBUTE_TYPE { + GENDER = 'GENDER', + SOURCE = 'SOURCE', + FASHION_STYLE = 'FASHION_STYLE', + MAIN_CATEGORY = 'MAIN_CATEGORY', + SUB_CATEGORY = 'SUB_CATEGORY', + ITEM_COLOR = 'ITEM_COLOR', + ITEM_PATTERN = 'ITEM_PATTERN', + HUMAN_ID = 'HUMAN_ID' +} + +export const GENDER = { + MAN: 1, + WOMAN: 2, + UNKNOWN: -1 +}; + +export const GENDER_CODE = { + '1': 'MAN', + '2': 'WOMAN', + '-1': 'UNKNOWN' +}; + +export const SOURCE = { + HUMAN: 0, + MANNEQUIN: 1, + STYLEBOOK: 2, + UNKNOWN: -1 +}; + +export const SOURCE_CODE = { + 0: 'HUMAN', + 1: 'MANNEQUIN', + 2: 'STYLEBOOK', + '-1': 'UNKNOWN' +}; + +export const FASHION_STYLE = [ + { + seq: 18, + name: 'Basic', + slug: 'basic', + gender: 'A', + status: 'A', + m: 10, + f: 13 + }, + { + seq: 19, + name: 'Elegance', + slug: 'elegance', + gender: 'F', + status: 'A', + f: 2 + }, + { + seq: 20, + name: 'Office', + slug: 'office', + gender: 'F', + status: 'A', + f: 1 + }, + { + seq: 21, + name: 'Minimalist', + slug: 'minimalist', + gender: 'A', + status: 'A', + m: 3, + f: 4 + }, + { + seq: 22, + name: 'Vacation', + slug: 'vacation', + gender: 'A', + status: 'A', + m: 4, + f: 5 + }, + { + seq: 23, + name: 'Street', + slug: 'street', + gender: 'A', + status: 'A', + m: 8, + f: 11 + }, + { + seq: 24, + name: 'Sporty', + slug: 'sporty', + gender: 'A', + status: 'A', + m: 5, + f: 8 + }, + { + seq: 25, + name: 'Girly', + slug: 'girly', + gender: 'F', + status: 'A', + f: 6 + }, + { + seq: 26, + name: 'Sexy', + slug: 'sexy', + gender: 'F', + status: 'A', + f: 7 + }, + { + seq: 27, + name: 'Gentleman', + slug: 'gentleman', + gender: 'M', + status: 'A', + m: 1 + }, + { + seq: 28, + name: 'Punk', + slug: 'punk', + gender: 'A', + status: 'A', + m: 9, + f: 12 + }, + { + seq: 29, + name: 'Tech', + slug: 'techwear', + gender: 'A', + status: 'A', + m: 6, + f: 9 + }, + { + seq: 30, + name: 'Retro', + slug: 'retro', + gender: 'A', + status: 'A', + m: 7, + f: 10 + }, + { + seq: 31, + name: 'Bohemian', + slug: 'bohemian', + gender: 'A', + status: 'A', + m: 2, + f: 3 + }, + { + seq: -1, + name: 'Unknown', + slug: 'unknown', + gender: 'A', + status: 'A', + m: -1, + f: -1 + } +]; + +export const FASHION_STYLE_MAN = FASHION_STYLE.filter( + (item) => item.gender === 'A' || item.gender === 'M' +); + +export const FASHION_STYLE_WOMAN = FASHION_STYLE.filter( + (item) => item.gender === 'A' || item.gender === 'F' +); + +export enum FASHION_STYLE_CODE_FOR_MAN { + GENTLEMAN = 1, + BOHEMIAN = 2, + MINIMALIST = 3, + VACATION = 4, + SPORTY = 5, + TECH = 6, + RETRO = 7, + STREET = 8, + PUNK = 9, + BASIC = 10, + UNKNOWN = -1 +} + +export enum FASHION_STYLE_CODE_FOR_WOMAN { + BASIC = 18, + ELEGANCE = 19, + OFFICE = 20, + MINIMALIST = 21, + VACATION = 22, + STREET = 23, + SPORTY = 24, + GIRLY = 25, + SEXY = 26, + PUNK = 28, + TECH = 29, + RETRO = 30, + BOHEMIAN = 31, + UNKNOWN = -1 +} + +export enum MAIN_CATEGORY_CODE { + OUTER = 1, + TOP, + PANTS, + SKIRT, + DRESSES, + SWIMWEAR, + UNDERWEAR, + SHOES, + BAG, + CAP_HAT, + FASHION_ACC, + EYEWEAR, + UNKNOWN = -1 +} + +export enum SUB_CATEGORY_CODE { + JACKET = 1, + COAT, + JUMPER, + PADDING_COAT, + VEST, + CARDIGAN, + HOOD_ZIPUP, + CASUAL_TOP, + SLEEVELESS, + SWEATSHIRT, + HOODED_TSHIRT, + SHIRTS_BLOUSE, + KNIT_SWEATER, + SHORTS, + SLACKS_COTTON_PANTS_CHINO, + WIDE_PANTS, + JEANS, + CARGO_PANTS, + LEGGINGS, + JOGGER_PANTS, + OVERALLS, + MINI_SKIRT, + SKIRT, + MINI_DRESS, + DRESS, + BIKINI, + RASH_GUARD, + ONE_PIECE_SWIMSUIT, + BEACH_TOPS, + BEACH_PANTS, + BRA, + PANTIES_UNDERWEAR, + PAJAMAS_HOMEWEAR, + SLIP, + BATHROBE, + CORRECTION_UNDERWEAR, + SHOES_LOERFERS, + HEELS, + SPORTS_SHOES_SNEAKERS, + BOOTS, + SANDALS_SLIPPERS, + CROSS_BAG, + SHOULDER_BAG, + TOTE_BAG, + BREIF_CASE, + WAIST_BAG, + CANVAS_BAG, + CLUTCH_BAG, + BACKPACK, + POUCH, + WALLET, + LUGGAGE, + BALLCAP, + BUCKET_HAT, + FEDORA_HAT, + BEANIE_HAT_WATCH_CAP, + PHONE_CASE, + SOCKS, + WATCH, + BELT, + SCARF, + TIGHTS_STOCKINGS, + GLOVES, + GLASSES, + SUNGLASSES, + UNKNOWN = -1 +} + +export const ITEM_CATEGORY = { + OUTER: [ + SUB_CATEGORY_CODE.JACKET, + SUB_CATEGORY_CODE.COAT, + SUB_CATEGORY_CODE.JUMPER, + SUB_CATEGORY_CODE.PADDING_COAT, + SUB_CATEGORY_CODE.VEST, + SUB_CATEGORY_CODE.CARDIGAN, + SUB_CATEGORY_CODE.HOOD_ZIPUP + ], + TOP: [ + SUB_CATEGORY_CODE.CASUAL_TOP, + SUB_CATEGORY_CODE.SLEEVELESS, + SUB_CATEGORY_CODE.SWEATSHIRT, + SUB_CATEGORY_CODE.HOODED_TSHIRT, + SUB_CATEGORY_CODE.SHIRTS_BLOUSE, + SUB_CATEGORY_CODE.KNIT_SWEATER + ], + PANTS: [ + SUB_CATEGORY_CODE.SHORTS, + SUB_CATEGORY_CODE.SLACKS_COTTON_PANTS_CHINO, + SUB_CATEGORY_CODE.WIDE_PANTS, + SUB_CATEGORY_CODE.JEANS, + SUB_CATEGORY_CODE.CARGO_PANTS, + SUB_CATEGORY_CODE.LEGGINGS, + SUB_CATEGORY_CODE.JOGGER_PANTS, + SUB_CATEGORY_CODE.OVERALLS + ], + SKIRT: [SUB_CATEGORY_CODE.MINI_SKIRT, SUB_CATEGORY_CODE.SKIRT], + DRESSES: [SUB_CATEGORY_CODE.MINI_DRESS, SUB_CATEGORY_CODE.DRESS], + SWIMWEAR: [ + SUB_CATEGORY_CODE.BIKINI, + SUB_CATEGORY_CODE.RASH_GUARD, + SUB_CATEGORY_CODE.ONE_PIECE_SWIMSUIT, + SUB_CATEGORY_CODE.BEACH_TOPS, + SUB_CATEGORY_CODE.BEACH_PANTS + ], + UNDERWEAR: [ + SUB_CATEGORY_CODE.BRA, + SUB_CATEGORY_CODE.PANTIES_UNDERWEAR, + SUB_CATEGORY_CODE.PAJAMAS_HOMEWEAR, + SUB_CATEGORY_CODE.SLIP, + SUB_CATEGORY_CODE.BATHROBE, + SUB_CATEGORY_CODE.CORRECTION_UNDERWEAR + ], + SHOES: [ + SUB_CATEGORY_CODE.SHOES_LOERFERS, + SUB_CATEGORY_CODE.HEELS, + SUB_CATEGORY_CODE.SPORTS_SHOES_SNEAKERS, + SUB_CATEGORY_CODE.BOOTS, + SUB_CATEGORY_CODE.SANDALS_SLIPPERS + ], + BAG: [ + SUB_CATEGORY_CODE.CROSS_BAG, + SUB_CATEGORY_CODE.SHOULDER_BAG, + SUB_CATEGORY_CODE.TOTE_BAG, + SUB_CATEGORY_CODE.BREIF_CASE, + SUB_CATEGORY_CODE.WAIST_BAG, + SUB_CATEGORY_CODE.CANVAS_BAG, + SUB_CATEGORY_CODE.CLUTCH_BAG, + SUB_CATEGORY_CODE.BACKPACK, + SUB_CATEGORY_CODE.POUCH, + SUB_CATEGORY_CODE.WALLET, + SUB_CATEGORY_CODE.LUGGAGE + ], + CAP_HAT: [ + SUB_CATEGORY_CODE.BALLCAP, + SUB_CATEGORY_CODE.BUCKET_HAT, + SUB_CATEGORY_CODE.FEDORA_HAT, + SUB_CATEGORY_CODE.BEANIE_HAT_WATCH_CAP + ], + FASHION_ACC: [ + SUB_CATEGORY_CODE.PHONE_CASE, + SUB_CATEGORY_CODE.SOCKS, + SUB_CATEGORY_CODE.WATCH, + SUB_CATEGORY_CODE.BELT, + SUB_CATEGORY_CODE.SCARF, + SUB_CATEGORY_CODE.TIGHTS_STOCKINGS, + SUB_CATEGORY_CODE.GLOVES + ], + EYEWEAR: [SUB_CATEGORY_CODE.GLASSES, SUB_CATEGORY_CODE.SUNGLASSES] +}; + +export const SUB_CATEGORY_TO_MAIN = { + JACKET: MAIN_CATEGORY_CODE.OUTER, + COAT: MAIN_CATEGORY_CODE.OUTER, + JUMPER: MAIN_CATEGORY_CODE.OUTER, + PADDING_COAT: MAIN_CATEGORY_CODE.OUTER, + VEST: MAIN_CATEGORY_CODE.OUTER, + CARDIGAN: MAIN_CATEGORY_CODE.OUTER, + HOOD_ZIPUP: MAIN_CATEGORY_CODE.OUTER, + CASUAL_TOP: MAIN_CATEGORY_CODE.TOP, + SLEEVELESS: MAIN_CATEGORY_CODE.TOP, + SWEATSHIRT: MAIN_CATEGORY_CODE.TOP, + HOODED_TSHIRT: MAIN_CATEGORY_CODE.TOP, + SHIRTS_BLOUSE: MAIN_CATEGORY_CODE.TOP, + KNIT_SWEATER: MAIN_CATEGORY_CODE.TOP, + SHORTS: MAIN_CATEGORY_CODE.PANTS, + SLACKS_COTTON_PANTS_CHINO: MAIN_CATEGORY_CODE.PANTS, + WIDE_PANTS: MAIN_CATEGORY_CODE.PANTS, + JEANS: MAIN_CATEGORY_CODE.PANTS, + CARGO_PANTS: MAIN_CATEGORY_CODE.PANTS, + LEGGINGS: MAIN_CATEGORY_CODE.PANTS, + JOGGER_PANTS: MAIN_CATEGORY_CODE.PANTS, + OVERALLS: MAIN_CATEGORY_CODE.PANTS, + MINI_SKIRT: MAIN_CATEGORY_CODE.SKIRT, + SKIRT: MAIN_CATEGORY_CODE.SKIRT, + MINI_DRESS: MAIN_CATEGORY_CODE.DRESSES, + DRESS: MAIN_CATEGORY_CODE.DRESSES, + BIKINI: MAIN_CATEGORY_CODE.SWIMWEAR, + RASH_GUARD: MAIN_CATEGORY_CODE.SWIMWEAR, + ONE_PIECE_SWIMSUIT: MAIN_CATEGORY_CODE.SWIMWEAR, + BEACH_TOPS: MAIN_CATEGORY_CODE.SWIMWEAR, + BEACH_PANTS: MAIN_CATEGORY_CODE.SWIMWEAR, + BRA: MAIN_CATEGORY_CODE.UNDERWEAR, + PANTIES_UNDERWEAR: MAIN_CATEGORY_CODE.UNDERWEAR, + PAJAMAS_HOMEWEAR: MAIN_CATEGORY_CODE.UNDERWEAR, + SLIP: MAIN_CATEGORY_CODE.UNDERWEAR, + BATHROBE: MAIN_CATEGORY_CODE.UNDERWEAR, + CORRECTION_UNDERWEAR: MAIN_CATEGORY_CODE.UNDERWEAR, + SHOES_LOERFERS: MAIN_CATEGORY_CODE.SHOES, + HEELS: MAIN_CATEGORY_CODE.SHOES, + SPORTS_SHOES_SNEAKERS: MAIN_CATEGORY_CODE.SHOES, + BOOTS: MAIN_CATEGORY_CODE.SHOES, + SANDALS_SLIPPERS: MAIN_CATEGORY_CODE.SHOES, + CROSS_BAG: MAIN_CATEGORY_CODE.BAG, + SHOULDER_BAG: MAIN_CATEGORY_CODE.BAG, + TOTE_BAG: MAIN_CATEGORY_CODE.BAG, + BREIF_CASE: MAIN_CATEGORY_CODE.BAG, + WAIST_BAG: MAIN_CATEGORY_CODE.BAG, + CANVAS_BAG: MAIN_CATEGORY_CODE.BAG, + CLUTCH_BAG: MAIN_CATEGORY_CODE.BAG, + BACKPACK: MAIN_CATEGORY_CODE.BAG, + POUCH: MAIN_CATEGORY_CODE.BAG, + WALLET: MAIN_CATEGORY_CODE.BAG, + LUGGAGE: MAIN_CATEGORY_CODE.BAG, + BALLCAP: MAIN_CATEGORY_CODE.CAP_HAT, + BUCKET_HAT: MAIN_CATEGORY_CODE.CAP_HAT, + FEDORA_HAT: MAIN_CATEGORY_CODE.CAP_HAT, + BEANIE_HAT_WATCH_CAP: MAIN_CATEGORY_CODE.CAP_HAT, + PHONE_CASE: MAIN_CATEGORY_CODE.FASHION_ACC, + SOCKS: MAIN_CATEGORY_CODE.FASHION_ACC, + WATCH: MAIN_CATEGORY_CODE.FASHION_ACC, + BELT: MAIN_CATEGORY_CODE.FASHION_ACC, + SCARF: MAIN_CATEGORY_CODE.FASHION_ACC, + TIGHTS_STOCKINGS: MAIN_CATEGORY_CODE.FASHION_ACC, + GLOVES: MAIN_CATEGORY_CODE.FASHION_ACC, + GLASSES: MAIN_CATEGORY_CODE.EYEWEAR, + SUNGLASSES: MAIN_CATEGORY_CODE.EYEWEAR +}; + +export enum ITEM_COLOR { + BLACK = 1, + WHITE, + GREY, + RED, + PINK, + ORANGE, + BEIGE, + BROWN, + YELLOW, + GREEN, + KHAKI, + MINT, + BLUE, + NAVY, + SKYBLUE, + PURPLE, + LAVENDER, + WINE, + NEON, + GOLD, + SILVER, + CYAN, + UNKNOWN = -1 +} + +export enum ITEM_PATTERN { + CHECK = 1, + STRIPE, + ZIGZAG, + LEOPARD, + ZEBRA, + DOT, + CAMOUFLAGE, + PAISLEY, + ARGYLE, + FLORAL, + LETTERING, + SKULL, + GRADATION, + SOLID, + GRAPHIC, + HOUNDS_TOOTH, + COLOR_BLOCK, + MESH, + UNKNOWN = -1 +} diff --git a/src/data/enums/JSONUploadStatus.ts b/src/data/enums/JSONUploadStatus.ts new file mode 100644 index 00000000..f233f621 --- /dev/null +++ b/src/data/enums/JSONUploadStatus.ts @@ -0,0 +1,6 @@ +export enum JSONUploadStatus { + NEED_UPLOAD = 'NEED_UPLOAD', + UPLOADING = 'UPLOADING', + UPLOADED = 'UPLOADED', + FAILED = 'FAILED' +} diff --git a/src/data/enums/LabelStatus.ts b/src/data/enums/LabelStatus.ts index de06ee29..0e2810f1 100644 --- a/src/data/enums/LabelStatus.ts +++ b/src/data/enums/LabelStatus.ts @@ -1,5 +1,5 @@ export enum LabelStatus { - ACCEPTED = "ACCEPTED", - REJECTED = "REJECTED", - UNDECIDED = "UNDECIDED" -} \ No newline at end of file + ACCEPTED = 'ACCEPTED', + REJECTED = 'REJECTED', + UNDECIDED = 'UNDECIDED' +} diff --git a/src/data/enums/LabelType.ts b/src/data/enums/LabelType.ts index 87be4c62..6fbc7984 100644 --- a/src/data/enums/LabelType.ts +++ b/src/data/enums/LabelType.ts @@ -4,4 +4,9 @@ export enum LabelType { RECT = 'RECT', POLYGON = 'POLYGON', LINE = 'LINE' -} \ No newline at end of file +} + +export enum LabelModeType { + HUMAN = 'HUMAN', + ITEM = 'ITEM' +} diff --git a/src/data/enums/PopupWindowType.ts b/src/data/enums/PopupWindowType.ts index 46be29ea..a8aa1c82 100644 --- a/src/data/enums/PopupWindowType.ts +++ b/src/data/enums/PopupWindowType.ts @@ -8,5 +8,10 @@ export enum PopupWindowType { IMPORT_ANNOTATIONS = 'IMPORT_ANNOTATIONS', INSERT_LABEL_NAMES = 'INSERT_LABEL_NAMES', EXIT_PROJECT = 'EXIT_PROJECT', - LOADER = 'LOADER' + LOADER = 'LOADER', + LABEL_INFO = 'LABEL_INFO', + LOGIN = 'LOGIN', + LOGOUT = 'LOGOUT', + DELETE_CONFIRM = 'DELETE_CONFIRM', + PERFORMANCE = 'PERFORMANCE' } diff --git a/src/data/info/DropDownMenuData.ts b/src/data/info/DropDownMenuData.ts index 1fa011d4..08ec8a32 100644 --- a/src/data/info/DropDownMenuData.ts +++ b/src/data/info/DropDownMenuData.ts @@ -1,89 +1,153 @@ -import {updateActivePopupType} from '../../store/general/actionCreators'; +import { + updateActivePopupType, + updateProjectData +} from '../../store/general/actionCreators'; import {PopupWindowType} from '../enums/PopupWindowType'; import {store} from '../../index'; +import {updateAuthData} from '../../store/auth/actionCreators'; +import { + updateActiveImageIndex, + updateActiveLabelNameId, + updateFirstLabelCreatedFlag, + updateImageData, + updateLabelNames +} from '../../store/labels/actionCreators'; +import {PopupActions} from '../../logic/actions/PopupActions'; export type DropDownMenuNode = { - name: string - description?: string - imageSrc: string - imageAlt: string - disabled: boolean - onClick?: () => void - children?: DropDownMenuNode[] -} + name: string; + description?: string; + imageSrc: string; + imageAlt: string; + disabled: boolean; + onClick?: () => void; + children?: DropDownMenuNode[]; +}; export const DropDownMenuData: DropDownMenuNode[] = [ + // { + // name: 'Hành động(Actions)', + // imageSrc: 'ico/actions.png', + // imageAlt: 'actions', + // disabled: false, + // children: [ + // // { + // // name: 'Sửa Nhãn(Edit Labels)', + // // description: 'Sửa danh sách nhãn(Modify labels list)', + // // imageSrc: 'ico/tags.png', + // // imageAlt: 'labels', + // // disabled: false, + // // onClick: () => + // // store.dispatch( + // // updateActivePopupType(PopupWindowType.UPDATE_LABEL) + // // ) + // // }, + // // { + // // name: 'Nhập hình ảnh(Import Images)', + // // description: 'Tải thêm hình ảnh(Load more images)', + // // imageSrc: 'ico/camera.png', + // // imageAlt: 'images', + // // disabled: false, + // // onClick: () => + // // store.dispatch( + // // updateActivePopupType(PopupWindowType.IMPORT_IMAGES) + // // ) + // // }, + // // { + // // name: 'Nhập chú thích(Import Annotations)', + // // description: + // // 'Nhập chú thích từ tệp(Import annotations from file)', + // // imageSrc: 'ico/import-labels.png', + // // imageAlt: 'import-labels', + // // disabled: false, + // // onClick: () => + // // store.dispatch( + // // updateActivePopupType( + // // PopupWindowType.IMPORT_ANNOTATIONS + // // ) + // // ) + // // }, + // // { + // // name: 'Xuất chú thích(Export Annotations)', + // // description: + // // 'Xuất chú thích sang tệp(Export annotations to file)', + // // imageSrc: 'ico/export-labels.png', + // // imageAlt: 'export-labels', + // // disabled: false, + // // onClick: () => + // // store.dispatch( + // // updateActivePopupType( + // // PopupWindowType.EXPORT_ANNOTATIONS + // // ) + // // ) + // // }, + // // { + // // name: 'Tải mô hình AI(Load AI Model)', + // // description: + // // 'Tải mô hình AI được đào tạo trước(Load our pre-trained annotation models)', + // // imageSrc: 'ico/ai.png', + // // imageAlt: 'load-ai-model', + // // disabled: false, + // // onClick: () => + // // store.dispatch( + // // updateActivePopupType(PopupWindowType.LOAD_AI_MODEL) + // // ) + // // } + // ] + // }, { - name: 'Actions', - imageSrc: 'ico/actions.png', - imageAlt: 'actions', + name: 'Người dùng (User)', + imageSrc: 'ico/user.png', + imageAlt: 'user', disabled: false, children: [ { - name: 'Edit Labels', - description: 'Modify labels list', - imageSrc: 'ico/tags.png', - imageAlt: 'labels', + name: `Đăng xuất (Logout)`, + description: + 'Xóa xác thực hiện tại(Clear current authentication)', + imageSrc: 'ico/user.png', + imageAlt: 'logout', disabled: false, - onClick: () => store.dispatch(updateActivePopupType(PopupWindowType.UPDATE_LABEL)) - }, - { - name: 'Import Images', - description: 'Load more images', - imageSrc: 'ico/camera.png', - imageAlt: 'images', - disabled: false, - onClick: () => store.dispatch(updateActivePopupType(PopupWindowType.IMPORT_IMAGES)) - }, - { - name: 'Import Annotations', - description: 'Import annotations from file', - imageSrc: 'ico/import-labels.png', - imageAlt: 'import-labels', - disabled: false, - onClick: () => store.dispatch(updateActivePopupType(PopupWindowType.IMPORT_ANNOTATIONS)) - }, - { - name: 'Export Annotations', - description: 'Export annotations to file', - imageSrc: 'ico/export-labels.png', - imageAlt: 'export-labels', - disabled: false, - onClick: () => store.dispatch(updateActivePopupType(PopupWindowType.EXPORT_ANNOTATIONS)) - }, - { - name: 'Load AI Model', - description: 'Load our pre-trained annotation models', - imageSrc: 'ico/ai.png', - imageAlt: 'load-ai-model', - disabled: false, - onClick: () => store.dispatch(updateActivePopupType(PopupWindowType.LOAD_AI_MODEL)) - }, - ] - }, - { - name: 'Community', - imageSrc: 'ico/plant.png', - imageAlt: 'community', - disabled: false, - children: [ - { - name: 'Documentation', - description: 'Read more about Make Sense', - imageSrc: 'ico/documentation.png', - imageAlt: 'documentation', - disabled: false, - onClick: () => window.open('https://skalskip.github.io/make-sense', '_blank') - }, - { - name: 'Bugs and Features', - description: 'Report a bug or propose a new feature', - imageSrc: 'ico/bug.png', - imageAlt: 'bug', - disabled: false, - onClick: () => window.open('https://github.com/SkalskiP/make-sense/issues', '_blank') + onClick: () => { + store.dispatch( + updateActivePopupType(PopupWindowType.LOGOUT) + ); + } } ] } -] - + // { + // name: 'Cộng đồng(Community)', + // imageSrc: 'ico/plant.png', + // imageAlt: 'community', + // disabled: false, + // children: [ + // { + // name: 'Tài liệu(Documentation)', + // description: + // 'Đọc thêm về Make Sense(Read more about Make Sense)', + // imageSrc: 'ico/documentation.png', + // imageAlt: 'documentation', + // disabled: false, + // onClick: () => + // window.open( + // 'https://skalskip.github.io/make-sense', + // '_blank' + // ) + // }, + // { + // name: 'Lỗi và Chức năng(Bugs and Features)', + // description: + // 'Báo cáo lỗi hoặc đề xuất một chức năng mới(Report a bug or propose a new feature)', + // imageSrc: 'ico/bug.png', + // imageAlt: 'bug', + // disabled: false, + // onClick: () => + // window.open( + // 'https://github.com/SkalskiP/make-sense/issues', + // '_blank' + // ) + // } + // ] + // } +]; diff --git a/src/index.scss b/src/index.scss index f0545272..38991dc0 100644 --- a/src/index.scss +++ b/src/index.scss @@ -1,25 +1,27 @@ body { - height: 100vh; - width: 100vw; - margin: 0; - padding: 0; + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; - font-family: 'Saira Semi Condensed', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + font-family: 'Saira Semi Condensed', -apple-system, BlinkMacSystemFont, + 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', + 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; - overflow-x: hidden; - overflow-y: hidden; + overflow-x: hidden; + overflow-y: hidden; + + user-select: none; } #root { - width: 100%; - height: 100%; + width: 100%; + height: 100%; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} \ No newline at end of file + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/src/lang.ts b/src/lang.ts new file mode 100644 index 00000000..e7ef877d --- /dev/null +++ b/src/lang.ts @@ -0,0 +1,163 @@ +export const vi = { + GENDER: { + MAN: 'NAM', + WOMAN: 'NỮ', + UNKNOWN: 'KHÔNG XÁC ĐỊNH' + }, + SOURCE: { + HUMAN: 'NHÂN LOẠI', + MANNEQUIN: 'MA NƠ CANH', + STYLEBOOK: 'SÁCH PHONG CÁCH', + UNKNOWN: 'KHÔNG XÁC ĐỊNH' + }, + FASHION_STYLE: { + basic: 'Đơn giản', + elegance: 'Thanh lịch', + office: 'Công sở', + minimalist: 'Tối giản', + vacation: 'Nghỉ dưỡng', + street: 'Đường phố', + sporty: 'Thể thao', + girly: 'Nữ tính', + sexy: 'Gợi cảm', + gentleman: 'Quý ông', + punk: 'Punk', + techwear: 'Techwear', + retro: 'Cổ điển', + bohemian: 'Bohemian', + unknown: 'KHÔNG XÁC ĐỊNH' + }, + MAIN_CATEGORY: { + OUTER: 'Áo khoác', + TOP: 'Áo', + PANTS: 'Quần', + SKIRT: 'Váy', + DRESSES: 'Đầm', + SWIMWEAR: 'Đồ bơi', + UNDERWEAR: 'Đồ lót', + SHOES: 'Giày', + BAG: 'Túi', + CAP_HAT: 'Mũ/Nón', + FASHION_ACC: 'Phụ kiện', + EYEWEAR: 'Mắt kính', + UNKNOWN: 'KHÔNG XÁC ĐỊNH' + }, + SUB_CATEGORY: { + JACKET: 'áo khoác ngắn', + COAT: 'áo khoác ngoài', + JUMPER: 'áo khoác bomber', + PADDING_COAT: 'áo khoác phao', + VEST: 'áo gile (mặc phía trong)', + CARDIGAN: 'áo len đan cài trước', + HOOD_ZIPUP: 'áo khoác dây kéo có nón', + CASUAL_TOP: 'áo thun', + SLEEVELESS: '(áo) không tay', + SWEATSHIRT: 'áo nỉ dài tay (tròng đầu)', + HOODED_TSHIRT: 'áo có nón', + SHIRTS_BLOUSE: 'áo sơ mi / áo kiểu nữ', + KNIT_SWEATER: 'áo len đan', + SHORTS: 'quần ngắn', + SLACKS_COTTON_PANTS_CHINO: 'quần tây / quần kaki', + WIDE_PANTS: 'quần ống rộng', + JEANS: 'quần jeans', + CARGO_PANTS: 'quần túi hộp', + LEGGINGS: 'quần leggings', + JOGGER_PANTS: 'quần jogger', + OVERALLS: 'quần yếm', + MINI_SKIRT: 'váy ngắn', + SKIRT: 'chân váy', + MINI_DRESS: 'đầm ngắn', + DRESS: 'đầm', + BIKINI: 'đồ tắm 2 mảnh', + RASH_GUARD: 'đồ bơi bảo vệ', + ONE_PIECE_SWIMSUIT: 'đồ tắm 1 mảnh', + BEACH_TOPS: 'áo mặc đi biển', + BEACH_PANTS: 'quần mặc đi biển', + BRA: 'áo ngực/ áo lót', + PANTIES_UNDERWEAR: 'quần lót', + PAJAMAS_HOMEWEAR: 'đồ mặc nhà', + SLIP: 'đầm ngủ', + BATHROBE: 'áo choàng tắm', + CORRECTION_UNDERWEAR: 'đồ lót định hình cơ thể', + SHOES_LOERFERS: 'giày lười', + HEELS: 'giày cao gót', + SPORTS_SHOES_SNEAKERS: 'giày thể thao', + BOOTS: 'bốt (giày cao cổ)', + SANDALS_SLIPPERS: 'dép xăng đan/ dép xỏ ngón', + CROSS_BAG: 'túi đeo chéo', + SHOULDER_BAG: 'túi đeo vai', + TOTE_BAG: 'túi vải (kích thước lớn)', + BREIF_CASE: 'cặp (túi xách) đựng tài liệu', + WAIST_BAG: 'túi đeo hông', + CANVAS_BAG: 'túi vải bố', + CLUTCH_BAG: 'ví cầm tay', + BACKPACK: 'ba lô', + POUCH: 'túi nhỏ', + WALLET: 'ví', + LUGGAGE: 'vali', + BALLCAP: 'nón lưỡi trai', + BUCKET_HAT: 'nón vành', + FEDORA_HAT: 'mũ phớt', + BEANIE_HAT_WATCH_CAP: 'mũ len Beanie', + PHONE_CASE: 'ốp lưng điện thoại', + SOCKS: 'vớ / tất', + WATCH: 'đồng hồ đeo tay', + BELT: 'dây thắt lưng', + SCARF: 'khăn choàng cổ', + TIGHTS_STOCKINGS: 'quần tất / vớ da', + GLOVES: 'găng tay', + GLASSES: 'kính cận', + SUNGLASSES: 'kính mát', + UNKNOWN: 'KHÔNG XÁC ĐỊNH' + }, + ITEM_COLOR: { + BLACK: 'màu đen', + WHITE: 'màu trắng', + GREY: 'màu xám', + RED: 'màu đỏ', + PINK: 'màu hồng', + ORANGE: 'màu cam', + BEIGE: 'màu be', + BROWN: 'màu nâu', + YELLOW: 'màu vàng', + GREEN: 'màu xanh lá', + KHAKI: 'màu xanh rêu', + MINT: 'màu xanh bạc hà', + BLUE: 'màu xanh ', + NAVY: 'màu xanh đen', + SKYBLUE: 'màu xanh da trời', + PURPLE: 'màu tím', + LAVENDER: 'màu tím nhạt', + WINE: 'màu đỏ rượu', + NEON: 'màu xanh neon', + GOLD: 'màu vàng đồng', + SILVER: 'màu bạc', + CYAN: 'xanh ngọc', + UNKNOWN: 'KHÔNG XÁC ĐỊNH' + }, + ITEM_PATTERN: { + CHECK: 'họa tiết kẻ caro', + STRIPE: 'họa tiết kẻ sọc', + ZIGZAG: 'họa tiết kẻ zigzag', + LEOPARD: 'họa tiết da báo', + ZEBRA: 'họa tiết ngựa vằn', + DOT: 'họa tiết chấm bi', + CAMOUFLAGE: 'họa tiết ngụy trang, quân đội', + PAISLEY: 'họa tiết giọt lệ xoắn', + ARGYLE: 'họa tiết hình kim cương', + FLORAL: 'họa tiết in hoa', + LETTERING: 'họa tiết chữ cái', + SKULL: 'họa tiết đầu lâu', + GRADATION: 'họa tiết chuyển màu', + SOLID: 'họa tiết trơn (1 màu)', + GRAPHIC: 'họa tiết đồ họa', + HOUNDS_TOOTH: 'họa tiết răng sói', + COLOR_BLOCK: 'hình khối màu sắc ', + MESH: 'vải lưới', + UNKNOWN: 'KHÔNG XÁC ĐỊNH' + }, + ALERT: { + SELECT_ONE_STYLE: + 'Vui lòng chỉ chọn một phong cách!\nPlease choose only one style !\n하나의 스타일만 선택해주세요!' + } +}; diff --git a/src/logic/actions/AIObjectDetectionActions.ts b/src/logic/actions/AIObjectDetectionActions.ts index 093c9dad..f33d42d1 100644 --- a/src/logic/actions/AIObjectDetectionActions.ts +++ b/src/logic/actions/AIObjectDetectionActions.ts @@ -1,7 +1,7 @@ import {DetectedObject} from '@tensorflow-models/coco-ssd'; import {ImageData, LabelName, LabelRect} from '../../store/labels/types'; import {LabelsSelector} from '../../store/selectors/LabelsSelector'; -import { v4 as uuidv4 } from 'uuid'; +import {v4 as uuidv4} from 'uuid'; import {store} from '../../index'; import {updateImageDataById} from '../../store/labels/actionCreators'; import {ObjectDetector} from '../../ai/ObjectDetector'; @@ -17,31 +17,52 @@ import {AIActions} from './AIActions'; export class AIObjectDetectionActions { public static detectRectsForActiveImage(): void { const activeImageData: ImageData = LabelsSelector.getActiveImageData(); - AIObjectDetectionActions.detectRects(activeImageData.id, ImageRepository.getById(activeImageData.id)) + AIObjectDetectionActions.detectRects( + activeImageData.id, + ImageRepository.getById(activeImageData.id) + ); } public static detectRects(imageId: string, image: HTMLImageElement): void { - if (LabelsSelector.getImageDataById(imageId).isVisitedByObjectDetector || !AISelector.isAIObjectDetectorModelLoaded()) + if ( + LabelsSelector.getImageDataById(imageId) + .isVisitedByObjectDetector || + !AISelector.isAIObjectDetectorModelLoaded() + ) return; store.dispatch(updateActivePopupType(PopupWindowType.LOADER)); ObjectDetector.predict(image, (predictions: DetectedObject[]) => { - const suggestedLabelNames = AIObjectDetectionActions.extractNewSuggestedLabelNames(LabelsSelector.getLabelNames(), predictions); - const rejectedLabelNames = AISelector.getRejectedSuggestedLabelList(); - const newlySuggestedNames = AIActions.excludeRejectedLabelNames(suggestedLabelNames, rejectedLabelNames); + const suggestedLabelNames = + AIObjectDetectionActions.extractNewSuggestedLabelNames( + LabelsSelector.getLabelNames(), + predictions + ); + const rejectedLabelNames = + AISelector.getRejectedSuggestedLabelList(); + const newlySuggestedNames = AIActions.excludeRejectedLabelNames( + suggestedLabelNames, + rejectedLabelNames + ); if (newlySuggestedNames.length > 0) { store.dispatch(updateSuggestedLabelList(newlySuggestedNames)); - store.dispatch(updateActivePopupType(PopupWindowType.SUGGEST_LABEL_NAMES)); + store.dispatch( + updateActivePopupType(PopupWindowType.SUGGEST_LABEL_NAMES) + ); } else { store.dispatch(updateActivePopupType(null)); } AIObjectDetectionActions.saveRectPredictions(imageId, predictions); - }) + }); } - public static saveRectPredictions(imageId: string, predictions: DetectedObject[]) { + public static saveRectPredictions( + imageId: string, + predictions: DetectedObject[] + ) { const imageData: ImageData = LabelsSelector.getImageDataById(imageId); - const predictedLabels: LabelRect[] = AIObjectDetectionActions.mapPredictionsToRectLabels(predictions); + const predictedLabels: LabelRect[] = + AIObjectDetectionActions.mapPredictionsToRectLabels(predictions); const nextImageData: ImageData = { ...imageData, labelRects: imageData.labelRects.concat(predictedLabels), @@ -50,7 +71,9 @@ export class AIObjectDetectionActions { store.dispatch(updateImageDataById(imageData.id, nextImageData)); } - private static mapPredictionsToRectLabels(predictions: DetectedObject[]): LabelRect[] { + private static mapPredictionsToRectLabels( + predictions: DetectedObject[] + ): LabelRect[] { return predictions.map((prediction: DetectedObject) => { return { id: uuidv4(), @@ -60,34 +83,46 @@ export class AIObjectDetectionActions { x: prediction.bbox[0], y: prediction.bbox[1], width: prediction.bbox[2], - height: prediction.bbox[3], + height: prediction.bbox[3] }, isCreatedByAI: true, status: LabelStatus.UNDECIDED, suggestedLabel: prediction.class - } - }) + }; + }); } - public static extractNewSuggestedLabelNames(labels: LabelName[], predictions: DetectedObject[]): string[] { - return predictions.reduce((acc: string[], prediction: DetectedObject) => { - if (!acc.includes(prediction.class) && !findLast(labels, {name: prediction.class})) { - acc.push(prediction.class) - } - return acc; - }, []) + public static extractNewSuggestedLabelNames( + labels: LabelName[], + predictions: DetectedObject[] + ): string[] { + return predictions.reduce( + (acc: string[], prediction: DetectedObject) => { + if ( + !acc.includes(prediction.class) && + !findLast(labels, {name: prediction.class}) + ) { + acc.push(prediction.class); + } + return acc; + }, + [] + ); } public static acceptAllSuggestedRectLabels(imageData: ImageData) { const newImageData: ImageData = { ...imageData, labelRects: imageData.labelRects.map((labelRect: LabelRect) => { - const labelName: LabelName = findLast(LabelsSelector.getLabelNames(), {name: labelRect.suggestedLabel}); + const labelName: LabelName = findLast( + LabelsSelector.getLabelNames(), + {name: labelRect.suggestedLabel} + ); return { ...labelRect, status: LabelStatus.ACCEPTED, labelId: !!labelName ? labelName.id : labelRect.labelId - } + }; }) }; store.dispatch(updateImageDataById(newImageData.id, newImageData)); @@ -96,7 +131,10 @@ export class AIObjectDetectionActions { public static rejectAllSuggestedRectLabels(imageData: ImageData) { const newImageData: ImageData = { ...imageData, - labelRects: imageData.labelRects.filter((labelRect: LabelRect) => labelRect.status === LabelStatus.ACCEPTED) + labelRects: imageData.labelRects.filter( + (labelRect: LabelRect) => + labelRect.status === LabelStatus.ACCEPTED + ) }; store.dispatch(updateImageDataById(newImageData.id, newImageData)); } diff --git a/src/logic/actions/LabelActions.ts b/src/logic/actions/LabelActions.ts index c59d1422..e54f6fb5 100644 --- a/src/logic/actions/LabelActions.ts +++ b/src/logic/actions/LabelActions.ts @@ -1,9 +1,23 @@ import {LabelsSelector} from '../../store/selectors/LabelsSelector'; -import {ImageData, LabelLine, LabelName, LabelPoint, LabelPolygon, LabelRect} from '../../store/labels/types'; +import { + HumanInfo, + ImageData, + ItemInfo, + LabelLine, + LabelName, + LabelPoint, + LabelPolygon, + LabelRect +} from '../../store/labels/types'; import {filter} from 'lodash'; import {store} from '../../index'; -import {updateImageData, updateImageDataById} from '../../store/labels/actionCreators'; -import {LabelType} from '../../data/enums/LabelType'; +import { + updateActiveLabelMode, + updateImageData, + updateImageDataById +} from '../../store/labels/actionCreators'; +import {LabelType, LabelModeType} from '../../data/enums/LabelType'; +import {JSONUploadStatus} from '../../data/enums/JSONUploadStatus'; export class LabelActions { public static deleteActiveLabel() { @@ -27,12 +41,25 @@ export class LabelActions { } public static deleteRectLabelById(imageId: string, labelRectId: string) { + // console.log('labelRectId: ', labelRectId); const imageData: ImageData = LabelsSelector.getImageDataById(imageId); - const newImageData = { + const newImageData: ImageData = { ...imageData, - labelRects: filter(imageData.labelRects, (currentLabel: LabelRect) => { - return currentLabel.id !== labelRectId; - }) + labelRects: filter( + imageData.labelRects, + (currentLabel: LabelRect) => { + return currentLabel.id !== labelRectId; + } + ), + humans: filter( + imageData.humans, + (human: HumanInfo) => human.uuid !== labelRectId + ), + items: filter( + imageData.items, + (item: ItemInfo) => item.uuid !== labelRectId + ), + uploadStatus: JSONUploadStatus.NEED_UPLOAD }; store.dispatch(updateImageDataById(imageData.id, newImageData)); } @@ -41,9 +68,12 @@ export class LabelActions { const imageData: ImageData = LabelsSelector.getImageDataById(imageId); const newImageData = { ...imageData, - labelPoints: filter(imageData.labelPoints, (currentLabel: LabelPoint) => { - return currentLabel.id !== labelPointId; - }) + labelPoints: filter( + imageData.labelPoints, + (currentLabel: LabelPoint) => { + return currentLabel.id !== labelPointId; + } + ) }; store.dispatch(updateImageDataById(imageData.id, newImageData)); } @@ -52,33 +82,50 @@ export class LabelActions { const imageData: ImageData = LabelsSelector.getImageDataById(imageId); const newImageData = { ...imageData, - labelLines: filter(imageData.labelLines, (currentLabel: LabelLine) => { - return currentLabel.id !== labelLineId; - }) + labelLines: filter( + imageData.labelLines, + (currentLabel: LabelLine) => { + return currentLabel.id !== labelLineId; + } + ) }; store.dispatch(updateImageDataById(imageData.id, newImageData)); } - public static deletePolygonLabelById(imageId: string, labelPolygonId: string) { + public static deletePolygonLabelById( + imageId: string, + labelPolygonId: string + ) { const imageData: ImageData = LabelsSelector.getImageDataById(imageId); const newImageData = { ...imageData, - labelPolygons: filter(imageData.labelPolygons, (currentLabel: LabelPolygon) => { - return currentLabel.id !== labelPolygonId; - }) + labelPolygons: filter( + imageData.labelPolygons, + (currentLabel: LabelPolygon) => { + return currentLabel.id !== labelPolygonId; + } + ) }; store.dispatch(updateImageDataById(imageData.id, newImageData)); } public static removeLabelNames(labelNamesIds: string[]) { const imagesData: ImageData[] = LabelsSelector.getImagesData(); - const newImagesData: ImageData[] = imagesData.map((imageData: ImageData) => { - return LabelActions.removeLabelNamesFromImageData(imageData, labelNamesIds); - }); - store.dispatch(updateImageData(newImagesData)) + const newImagesData: ImageData[] = imagesData.map( + (imageData: ImageData) => { + return LabelActions.removeLabelNamesFromImageData( + imageData, + labelNamesIds + ); + } + ); + store.dispatch(updateImageData(newImagesData)); } - private static removeLabelNamesFromImageData(imageData: ImageData, labelNamesIds: string[]): ImageData { + private static removeLabelNamesFromImageData( + imageData: ImageData, + labelNamesIds: string[] + ): ImageData { return { ...imageData, labelRects: imageData.labelRects.map((labelRect: LabelRect) => { @@ -86,9 +133,9 @@ export class LabelActions { return { ...labelRect, id: null - } + }; } else { - return labelRect + return labelRect; } }), labelPoints: imageData.labelPoints.map((labelPoint: LabelPoint) => { @@ -96,31 +143,39 @@ export class LabelActions { return { ...labelPoint, id: null - } + }; } else { - return labelPoint + return labelPoint; } }), - labelPolygons: imageData.labelPolygons.map((labelPolygon: LabelPolygon) => { - if (labelNamesIds.includes(labelPolygon.id)) { - return { - ...labelPolygon, - id: null + labelPolygons: imageData.labelPolygons.map( + (labelPolygon: LabelPolygon) => { + if (labelNamesIds.includes(labelPolygon.id)) { + return { + ...labelPolygon, + id: null + }; + } else { + return labelPolygon; } - } else { - return labelPolygon } - }), - labelNameIds: imageData.labelNameIds.filter((labelNameId: string) => { - return !labelNamesIds.includes(labelNameId) - }) - } + ), + labelNameIds: imageData.labelNameIds.filter( + (labelNameId: string) => { + return !labelNamesIds.includes(labelNameId); + } + ) + }; } public static labelExistsInLabelNames(label: string): boolean { const labelNames: LabelName[] = LabelsSelector.getLabelNames(); return labelNames .map((labelName: LabelName) => labelName.name) - .includes(label) + .includes(label); + } + + public static selectLabelMode(mode: LabelModeType) { + store.dispatch(updateActiveLabelMode(mode)); } } diff --git a/src/logic/export/RectLabelsExporter.ts b/src/logic/export/RectLabelsExporter.ts index 2a77786e..68929e9c 100644 --- a/src/logic/export/RectLabelsExporter.ts +++ b/src/logic/export/RectLabelsExporter.ts @@ -1,8 +1,14 @@ import {AnnotationFormatType} from '../../data/enums/AnnotationFormatType'; -import {ImageData, LabelName, LabelRect} from '../../store/labels/types'; +import { + HumanInfo, + ImageData, + LabelName, + LabelRect, + RectJSON +} from '../../store/labels/types'; import {ImageRepository} from '../imageRepository/ImageRepository'; import JSZip from 'jszip'; -import { saveAs } from 'file-saver'; +import {saveAs} from 'file-saver'; import {LabelsSelector} from '../../store/selectors/LabelsSelector'; import {XMLSanitizerUtil} from '../../utils/XMLSanitizerUtil'; import {ExporterUtil} from '../../utils/ExporterUtil'; @@ -11,6 +17,8 @@ import {findIndex, findLast} from 'lodash'; import {ISize} from '../../interfaces/ISize'; import {NumberUtil} from '../../utils/NumberUtil'; import {RectUtil} from '../../utils/RectUtil'; +import {IRect} from '../../interfaces/IRect'; +import {AuthSelector} from '../../store/selectors/AuthSelector'; export class RectLabelsExporter { public static export(exportFormatType: AnnotationFormatType): void { @@ -24,6 +32,9 @@ export class RectLabelsExporter { case AnnotationFormatType.CSV: RectLabelsExporter.exportAsCSV(); break; + case AnnotationFormatType.JSON: + RectLabelsExporter.exportAsJSON(); + break; default: return; } @@ -31,53 +42,74 @@ export class RectLabelsExporter { private static exportAsYOLO(): void { const zip = new JSZip(); - LabelsSelector.getImagesData() - .forEach((imageData: ImageData) => { - const fileContent: string = RectLabelsExporter.wrapRectLabelsIntoYOLO(imageData); - if (fileContent) { - const fileName : string = imageData.fileData.name.replace(/\.[^/.]+$/, '.txt'); - try { - zip.file(fileName, fileContent); - } catch (error) { - // TODO - throw new Error(error as string); - } + LabelsSelector.getImagesData().forEach((imageData: ImageData) => { + const fileContent: string = + RectLabelsExporter.wrapRectLabelsIntoYOLO(imageData); + if (fileContent) { + const fileName: string = imageData.fileData.name.replace( + /\.[^/.]+$/, + '.txt' + ); + try { + zip.file(fileName, fileContent); + } catch (error) { + // TODO + throw new Error(error as string); } - }); + } + }); try { - zip.generateAsync({type:'blob'}) - .then((content: Blob) => { - saveAs(content, `${ExporterUtil.getExportFileName()}.zip`); - }); + zip.generateAsync({type: 'blob'}).then((content: Blob) => { + saveAs(content, `${ExporterUtil.getExportFileName()}.zip`); + }); } catch (error) { // TODO throw new Error(error as string); } } - public static wrapRectLabelIntoYOLO(labelRect: LabelRect, labelNames: LabelName[], imageSize: ISize): string { - const snapAndFix = (value: number) => NumberUtil.snapValueToRange(value,0, 1).toFixed(6) - const classIdx: string = findIndex(labelNames, {id: labelRect.labelId}).toString() - const rectCenter = RectUtil.getCenter(labelRect.rect) - const rectSize = RectUtil.getSize(labelRect.rect) + public static wrapRectLabelIntoYOLO( + labelRect: LabelRect, + labelNames: LabelName[], + imageSize: ISize + ): string { + const snapAndFix = (value: number) => + NumberUtil.snapValueToRange(value, 0, 1).toFixed(6); + const classIdx: string = findIndex(labelNames, { + id: labelRect.labelId + }).toString(); + const rectCenter = RectUtil.getCenter(labelRect.rect); + const rectSize = RectUtil.getSize(labelRect.rect); const rawBBox: number[] = [ rectCenter.x / imageSize.width, rectCenter.y / imageSize.height, rectSize.width / imageSize.width, rectSize.height / imageSize.height - ] + ]; - let [x, y, width, height] = rawBBox.map((value: number) => parseFloat(snapAndFix(value))) + let [x, y, width, height] = rawBBox.map((value: number) => + parseFloat(snapAndFix(value)) + ); - if (x + width / 2 > 1) { width = 2 * (1 - x) } - if (x - width / 2 < 0) { width = 2 * x } - if (y + height / 2 > 1) { height = 2 * (1 - y) } - if (y - height / 2 < 0) { height = 2 * y } + if (x + width / 2 > 1) { + width = 2 * (1 - x); + } + if (x - width / 2 < 0) { + width = 2 * x; + } + if (y + height / 2 > 1) { + height = 2 * (1 - y); + } + if (y - height / 2 < 0) { + height = 2 * y; + } - const processedBBox = [x, y, width, height].map((value: number) => snapAndFix(value)) + const processedBBox = [x, y, width, height].map((value: number) => + snapAndFix(value) + ); - return [classIdx, ...processedBBox].join(' ') + return [classIdx, ...processedBBox].join(' '); } private static wrapRectLabelsIntoYOLO(imageData: ImageData): string { @@ -86,33 +118,42 @@ export class RectLabelsExporter { const labelNames: LabelName[] = LabelsSelector.getLabelNames(); const image: HTMLImageElement = ImageRepository.getById(imageData.id); - const imageSize: ISize = {width: image.width, height: image.height} - const labelRectsString: string[] = imageData.labelRects.map((labelRect: LabelRect) => { - return RectLabelsExporter.wrapRectLabelIntoYOLO(labelRect, labelNames, imageSize) - }); + const imageSize: ISize = {width: image.width, height: image.height}; + const labelRectsString: string[] = imageData.labelRects.map( + (labelRect: LabelRect) => { + return RectLabelsExporter.wrapRectLabelIntoYOLO( + labelRect, + labelNames, + imageSize + ); + } + ); return labelRectsString.join('\n'); } private static exportAsVOC(): void { const zip = new JSZip(); LabelsSelector.getImagesData().forEach((imageData: ImageData) => { - const fileContent: string = RectLabelsExporter.wrapImageIntoVOC(imageData); - if (fileContent) { - const fileName : string = imageData.fileData.name.replace(/\.[^/.]+$/, '.xml'); - try { - zip.file(fileName, fileContent); - } catch (error) { - // TODO - throw new Error(error as string); - } + const fileContent: string = + RectLabelsExporter.wrapImageIntoVOC(imageData); + if (fileContent) { + const fileName: string = imageData.fileData.name.replace( + /\.[^/.]+$/, + '.xml' + ); + try { + zip.file(fileName, fileContent); + } catch (error) { + // TODO + throw new Error(error as string); } - }); + } + }); try { - zip.generateAsync({type:'blob'}) - .then(function(content) { - saveAs(content, `${ExporterUtil.getExportFileName()}.zip`); - }); + zip.generateAsync({type: 'blob'}).then(function (content) { + saveAs(content, `${ExporterUtil.getExportFileName()}.zip`); + }); } catch (error) { // TODO throw new Error(error as string); @@ -124,33 +165,48 @@ export class RectLabelsExporter { return null; const labelNamesList: LabelName[] = LabelsSelector.getLabelNames(); - const labelRectsString: string[] = imageData.labelRects.map((labelRect: LabelRect) => { - const labelName: LabelName = findLast(labelNamesList, {id: labelRect.labelId}); - const labelFields = !!labelName ? [ - `\t`, - `\t\t${labelName.name}`, - `\t\tUnspecified`, - `\t\t0`, - `\t\t0`, - `\t\t`, - `\t\t\t${Math.round(labelRect.rect.x)}`, - `\t\t\t${Math.round(labelRect.rect.y)}`, - `\t\t\t${Math.round(labelRect.rect.x + labelRect.rect.width)}`, - `\t\t\t${Math.round(labelRect.rect.y + labelRect.rect.height)}`, - `\t\t`, - `\t` - ] : []; - return labelFields.join('\n') - }); + const labelRectsString: string[] = imageData.labelRects.map( + (labelRect: LabelRect) => { + const labelName: LabelName = findLast(labelNamesList, { + id: labelRect.labelId + }); + const labelFields = !!labelName + ? [ + `\t`, + `\t\t${labelName.name}`, + `\t\tUnspecified`, + `\t\t0`, + `\t\t0`, + `\t\t`, + `\t\t\t${Math.round(labelRect.rect.x)}`, + `\t\t\t${Math.round(labelRect.rect.y)}`, + `\t\t\t${Math.round( + labelRect.rect.x + labelRect.rect.width + )}`, + `\t\t\t${Math.round( + labelRect.rect.y + labelRect.rect.height + )}`, + `\t\t`, + `\t` + ] + : []; + return labelFields.join('\n'); + } + ); return labelRectsString.join('\n'); } private static wrapImageIntoVOC(imageData: ImageData): string { - const labels: string = RectLabelsExporter.wrapRectLabelsIntoVOC(imageData); - const projectName: string = XMLSanitizerUtil.sanitize(GeneralSelector.getProjectName()); + const labels: string = + RectLabelsExporter.wrapRectLabelsIntoVOC(imageData); + const projectName: string = XMLSanitizerUtil.sanitize( + GeneralSelector.getProjectName() + ); if (labels) { - const image: HTMLImageElement = ImageRepository.getById(imageData.id); + const image: HTMLImageElement = ImageRepository.getById( + imageData.id + ); return [ ``, `\t${projectName}`, @@ -170,14 +226,102 @@ export class RectLabelsExporter { } return null; } + private static exportAsJSON(): void { + const zip = new JSZip(); + LabelsSelector.getImagesData().forEach((imageData: ImageData) => { + const content = + RectLabelsExporter.wrapRectLabelsIntoJSON(imageData); + if (content) { + const fileName: string = imageData.fileData.name.replace( + /\.[^/.]+$/, + '.json' + ); + try { + zip.file(fileName, JSON.stringify(content)); + } catch (error) { + // TODO + throw new Error(error as string); + } + } + }); + try { + zip.generateAsync({type: 'blob'}).then((content: Blob) => { + saveAs(content, `${ExporterUtil.getExportFileName()}.zip`); + }); + } catch (error) { + // TODO + throw new Error(error as string); + } + } + public static wrapRectLabelsIntoJSON(imageData: ImageData): RectJSON { + if (imageData.labelRects.length === 0 || !imageData.loadStatus) + return null; + + const convertRect = (rect: IRect) => ({ + lt_x: Math.round(rect.x), + lt_y: Math.round(rect.y), + rb_x: Math.round(rect.x + rect.width), + rb_y: Math.round(rect.y + rect.height) + }); + + const convertHumanId = (humanId: string) => { + const human = imageData.humans.find( + (human) => human.uuid === humanId + ); + const humanIndex = imageData.humans.findIndex( + (human) => human.uuid === humanId + ); + return `${humanIndex}:${human.gender}:${human.type}`; + }; + + const getHumanIndex = (uuid: string) => + imageData.humans.findIndex((human) => human.uuid === uuid); + + const json: RectJSON = { + //@ts-ignore + img_path: imageData.fileData.path, + writer_id: AuthSelector.getUserID(), + version: 1, + human_info: imageData.humans.map((human) => ({ + human_id: convertHumanId(human.uuid), + bounding_box: convertRect( + imageData.labelRects.find( + (labelRect) => labelRect.id === human.uuid + ).rect + ), + style: human.styles, + qc_status: human.qc_status, + qc_comment: human.qc_comment, + })), + item_info: imageData.items.map((item) => ({ + item_id: `${getHumanIndex(item.humanId)}:${item.gender}:${ + item.mainCategory + }:${item.subCategory}:${item.uuid}:${item.color}:${ + item.pattern + }`, + + bounding_box: convertRect( + imageData.labelRects.find( + (labelRect) => labelRect.id === item.uuid + ).rect + ), + style: item.styles, + qc_status: item.qc_status, + qc_comment: item.qc_comment, + })) + }; + return json; + } private static exportAsCSV(): void { const content: string = LabelsSelector.getImagesData() .map((imageData: ImageData) => { - return RectLabelsExporter.wrapRectLabelsIntoCSV(imageData)}) + return RectLabelsExporter.wrapRectLabelsIntoCSV(imageData); + }) .filter((imageLabelData: string) => { - return !!imageLabelData}) + return !!imageLabelData; + }) .join('\n'); const fileName: string = `${ExporterUtil.getExportFileName()}.csv`; ExporterUtil.saveAs(content, fileName); @@ -189,20 +333,26 @@ export class RectLabelsExporter { const image: HTMLImageElement = ImageRepository.getById(imageData.id); const labelNames: LabelName[] = LabelsSelector.getLabelNames(); - const labelRectsString: string[] = imageData.labelRects.map((labelRect: LabelRect) => { - const labelName: LabelName = findLast(labelNames, {id: labelRect.labelId}); - const labelFields = !!labelName ? [ - labelName.name, - Math.round(labelRect.rect.x).toString(), - Math.round(labelRect.rect.y).toString(), - Math.round(labelRect.rect.width).toString(), - Math.round(labelRect.rect.height).toString(), - imageData.fileData.name, - image.width.toString(), - image.height.toString() - ] : []; - return labelFields.join(',') - }); + const labelRectsString: string[] = imageData.labelRects.map( + (labelRect: LabelRect) => { + const labelName: LabelName = findLast(labelNames, { + id: labelRect.labelId + }); + const labelFields = !!labelName + ? [ + labelName.name, + Math.round(labelRect.rect.x).toString(), + Math.round(labelRect.rect.y).toString(), + Math.round(labelRect.rect.width).toString(), + Math.round(labelRect.rect.height).toString(), + imageData.fileData.name, + image.width.toString(), + image.height.toString() + ] + : []; + return labelFields.join(','); + } + ); return labelRectsString.join('\n'); } } diff --git a/src/logic/imageRepository/ImageRepository.ts b/src/logic/imageRepository/ImageRepository.ts index fa819ef2..666b7840 100644 --- a/src/logic/imageRepository/ImageRepository.ts +++ b/src/logic/imageRepository/ImageRepository.ts @@ -1,6 +1,6 @@ -import {zip} from "lodash"; +import {zip} from 'lodash'; -export type ImageMap = { [s: string]: HTMLImageElement; }; +export type ImageMap = {[s: string]: HTMLImageElement}; export class ImageRepository { private static repository: ImageMap = {}; @@ -12,10 +12,15 @@ export class ImageRepository { public static storeImages(ids: string[], images: HTMLImageElement[]) { zip(ids, images).forEach((pair: [string, HTMLImageElement]) => { ImageRepository.storeImage(...pair); - }) + }); } public static getById(uuid: string): HTMLImageElement { + // console.log( + // 'ImageRepository.repository = ', + // ImageRepository.repository + // ); + return ImageRepository.repository[uuid]; } -} \ No newline at end of file +} diff --git a/src/logic/import/MJ/MJErrors.ts b/src/logic/import/MJ/MJErrors.ts new file mode 100644 index 00000000..6bc1c02b --- /dev/null +++ b/src/logic/import/MJ/MJErrors.ts @@ -0,0 +1,40 @@ +export class MJAnnotationsLoadingError extends Error { + constructor(message) { + super(message); + this.name = 'MJAnnotationsLoadingError'; + } +} + +export class MJLabelsReadingError extends MJAnnotationsLoadingError { + constructor() { + super( + 'Unexpected error occurred during reading label names from labels.txt file' + ); + this.name = 'MJLabelsLoadingError'; + } +} + +export class NoLabelNamesFileProvidedError extends MJAnnotationsLoadingError { + constructor() { + super( + 'For MJ labels to be loaded correctly, labels.txt file is required' + ); + this.name = 'NoLabelNamesFileProvidedError'; + } +} + +export class LabelNamesNotUniqueError extends MJAnnotationsLoadingError { + constructor() { + super('Label names listed in labels.txt file should be unique'); + this.name = 'LabelNamesNotUniqueError'; + } +} + +export class AnnotationsParsingError extends MJAnnotationsLoadingError { + constructor(imageName: string) { + super( + `Unexpected error occurred during parsing of ${imageName} annotations file` + ); + this.name = 'AnnotationsParsingError'; + } +} diff --git a/src/logic/import/MJ/MJImporter.ts b/src/logic/import/MJ/MJImporter.ts new file mode 100644 index 00000000..005662f5 --- /dev/null +++ b/src/logic/import/MJ/MJImporter.ts @@ -0,0 +1,178 @@ +import {AnnotationImporter} from '../AnnotationImporter'; +import {ImageData, LabelName} from '../../../store/labels/types'; +import {FileUtil} from '../../../utils/FileUtil'; +import {ArrayUtil} from '../../../utils/ArrayUtil'; +import {NoLabelNamesFileProvidedError} from './MJErrors'; +import {LabelsSelector} from '../../../store/selectors/LabelsSelector'; +import {MJUtils} from './MJUtils'; +import {ImageDataUtil} from '../../../utils/ImageDataUtil'; +import {zip, find} from 'lodash'; +import {ImageRepository} from '../../imageRepository/ImageRepository'; + +export type MJFilesSpec = { + labelNameFile: File; + annotationFiles: File[]; +}; + +export class MJImporter extends AnnotationImporter { + private static labelsFileName: string = 'labels.txt'; + + public import( + filesData: File[], + onSuccess: (imagesData: ImageData[], labelNames: LabelName[]) => any, + onFailure: (error?: Error) => any + ): void { + try { + const sourceImagesData = LabelsSelector.getImagesData().map( + (i: ImageData) => ImageDataUtil.cleanAnnotations(i) + ); + const {labelNameFile, annotationFiles} = MJImporter.filterFilesData( + filesData, + sourceImagesData + ); + const [relevantImageData, relevantAnnotations] = + MJImporter.matchImagesWithAnnotations( + sourceImagesData, + annotationFiles + ); + const labelNamesPromise: Promise = Promise.resolve([]); + // Cause we do not use label name in mj import + // FileUtil.readFile( + // labelNameFile + // ).then((fileContent: string) => + // MJUtils.parseLabelsNamesFromString(fileContent) + // ); + const missingImagesPromise: Promise = + ImageDataUtil.loadMissingImages(relevantImageData); + const annotationFilesPromise: Promise = + FileUtil.readFiles(relevantAnnotations); + Promise.all([ + labelNamesPromise, + missingImagesPromise, + annotationFilesPromise + ]) + .then((values: [LabelName[], void, string[]]) => { + const [labelNames, , annotationsRaw] = values; + const resultImageData = zip( + relevantImageData, + annotationsRaw + ).map((pair: [ImageData, string]) => + MJImporter.applyAnnotations( + pair[0], + pair[1], + labelNames + ) + ); + onSuccess( + MJImporter.injectImageDataWithAnnotations( + sourceImagesData, + resultImageData + ), + labelNames + ); + }) + .catch((error: Error) => onFailure(error)); + } catch (error) { + onFailure(error as Error); + } + } + + public static filterFilesData( + filesData: File[], + imagesData: ImageData[] + ): MJFilesSpec { + const functionalityPartitionResult = ArrayUtil.partition( + filesData, + (i: File) => i.name === MJImporter.labelsFileName + ); + // if (functionalityPartitionResult.pass.length !== 1) { + // throw new NoLabelNamesFileProvidedError(); + // } + const imageIdentifiers: string[] = imagesData + .map((i: ImageData) => i.fileData.name) + .map((i: string) => FileUtil.extractFileName(i)); + const matchingPartitionResult = ArrayUtil.partition( + filesData, + (i: File) => + imageIdentifiers.includes(FileUtil.extractFileName(i.name)) + ); + return { + labelNameFile: functionalityPartitionResult.pass[0], + annotationFiles: matchingPartitionResult.pass + }; + } + + public static matchImagesWithAnnotations( + images: ImageData[], + annotations: File[] + ): [ImageData[], File[]] { + const predicate = (image: ImageData, annotation: File) => { + return ( + FileUtil.extractFileName(image.fileData.name) === + FileUtil.extractFileName(annotation.name) + ); + }; + return ArrayUtil.unzip( + ArrayUtil.match(images, annotations, predicate) + ); + } + + public static applyAnnotations( + imageData: ImageData, + rawAnnotations: string, + labelNames: LabelName[] + ): ImageData { + // console.log('rawAnnotation = ', rawAnnotations); + + const image: HTMLImageElement = ImageRepository.getById(imageData.id); + + const {labelRects, humans, items} = MJUtils.parseMJAnnotationsFromJSON( + rawAnnotations, + labelNames, + { + //@ts-ignore + width: imageData.fileData.width, + //@ts-ignore + height: imageData.fileData.height + }, + imageData.fileData.name + ); + imageData.labelRects = labelRects; + imageData.humans = humans; + imageData.items = items; + + console.log('imageData = ', imageData); + return imageData; + } + public static applyAnnotationsFromFile( + imageData: ImageData, + rawAnnotations: string, + labelNames: LabelName[] + ): ImageData { + // console.log('rawAnnotation = ', rawAnnotations); + + const image: HTMLImageElement = ImageRepository.getById(imageData.id); + + const {labelRects, humans, items} = MJUtils.parseMJAnnotationsFromJSON( + rawAnnotations, + labelNames, + {width: image.width, height: image.height}, + imageData.fileData.name + ); + imageData.labelRects = labelRects; + imageData.humans = humans; + imageData.items = items; + + console.log('imageData = ', imageData); + return imageData; + } + public static injectImageDataWithAnnotations( + sourceImageData: ImageData[], + annotatedImageData: ImageData[] + ): ImageData[] { + return sourceImageData.map((i: ImageData) => { + const result = find(annotatedImageData, {id: i.id}); + return !!result ? result : i; + }); + } +} diff --git a/src/logic/import/MJ/MJUtils.ts b/src/logic/import/MJ/MJUtils.ts new file mode 100644 index 00000000..9d3b1ae3 --- /dev/null +++ b/src/logic/import/MJ/MJUtils.ts @@ -0,0 +1,182 @@ +import { + HumanInfo, + ItemInfo, + LabelName, + LabelRect, + RectJSON +} from '../../../store/labels/types'; +import {LabelUtil} from '../../../utils/LabelUtil'; +import {AnnotationsParsingError, LabelNamesNotUniqueError} from './MJErrors'; +import {ISize} from '../../../interfaces/ISize'; +import _, {uniq} from 'lodash'; +import {v4 as uuidv4} from 'uuid'; +import {LabelModeType} from '../../../data/enums/LabelType'; +import {LabelStatus} from '../../../data/enums/LabelStatus'; + +export class MJUtils { + public static parseLabelsNamesFromString(content: string): LabelName[] { + return []; + // const labelNames: string[] = content + // .split(/[\r\n]/) + // .filter(Boolean) + // .map((name: string) => name.replace(/\s/g, '')); + + // if (uniq(labelNames).length !== labelNames.length) { + // throw new LabelNamesNotUniqueError(); + // } + + // return labelNames.map((name: string) => + // LabelUtil.createLabelName(name) + // ); + } + + public static loadLabelsList( + fileData: File, + onSuccess: (labels: LabelName[]) => any, + onFailure: () => any + ) { + const reader = new FileReader(); + reader.onloadend = function (evt: any) { + const content: string = evt.target.result; + const labelNames = MJUtils.parseLabelsNamesFromString(content); + onSuccess(labelNames); + }; + reader.onerror = () => onFailure(); + reader.readAsText(fileData); + } + + public static parseMJAnnotationsFromJSON( + rawAnnotation: string | object, + labelNames: LabelName[], + imageSize: ISize, + imageName: string + ): {labelRects: LabelRect[]; humans: HumanInfo[]; items: ItemInfo[]} { + let annotation = rawAnnotation as RectJSON; + if (typeof rawAnnotation === 'string') { + annotation = JSON.parse(rawAnnotation) as RectJSON; + } + // console.log(131231, annotation) + + const humansLabelRects: LabelRect[] = annotation.human_info.map( + (human) => { + const {lt_x, lt_y, rb_x, rb_y} = human.bounding_box; + const rectX: number = lt_x; + const rectY: number = lt_y; + const rectWidth: number = Math.abs(rb_x - lt_x); + const rectHeight: number = Math.abs(rb_y - lt_y); + const qc_status: string = human.qc_status + const qc_comment: string = human.qc_comment + // console.log('rect = ', rectX, rectY, rectWidth, rectHeight); + const rect = { + x: rectX, + y: rectY, + width: rectWidth, + height: rectHeight, + }; + const aLabel = LabelUtil.createLabelRect(human.style[0], rect); + aLabel.mode = LabelModeType.HUMAN; + aLabel.qc_status = qc_status + aLabel.qc_comment = qc_comment + return aLabel; + } + ); + const itemsLabelRects: LabelRect[] = annotation.item_info.map( + (item) => { + const {lt_x, lt_y, rb_x, rb_y} = item.bounding_box; + const rectX: number = lt_x; + const rectY: number = lt_y; + const rectWidth: number = Math.abs(rb_x - lt_x); + const rectHeight: number = Math.abs(rb_y - lt_y); + const qc_status: string = item.qc_status + const qc_comment: string = item.qc_comment + // console.log('rect = ', rectX, rectY, rectWidth, rectHeight); + const rect = { + x: rectX, + y: rectY, + width: rectWidth, + height: rectHeight + }; + + const aLabel = LabelUtil.createLabelRect(item.style[0], rect); + const [, , , , uuid, ,] = item.item_id.split(':'); + aLabel.mode = LabelModeType.ITEM; + aLabel.id = uuid; + aLabel.qc_status = qc_status + aLabel.qc_comment = qc_comment + return aLabel; + } + ); + + const humans = annotation.human_info.map((human, humanIndex) => { + const [id, gender, type] = human.human_id.split(':'); + + return { + uuid: humansLabelRects[humanIndex].id, + id: parseInt(id), + gender: parseInt(gender), + type: parseInt(type), + styles: human.style, + qc_comment: human.qc_comment, + qc_status: human.qc_status + }; + }); + const items = annotation.item_info.map((item, itemIdx) => { + const [ + humanIdx, + gender, + mainCategory, + subCategory, + uuid, + color, + pattern + ] = item.item_id.split(':'); + return { + uuid, + id: itemIdx, + humanId: + humans.find((human) => human.id === parseInt(humanIdx)) + ?.uuid || '-1', + gender: parseInt(gender), + mainCategory: parseInt(mainCategory), + subCategory: parseInt(subCategory), + color: parseInt(color), + pattern: parseInt(pattern), + styles: item.style, + qc_comment: item.qc_comment, + qc_status: item.qc_status + }; + }); + + return { + labelRects: [...humansLabelRects, ...itemsLabelRects], + humans, + items + }; + } + + public static validateMJAnnotationComponents( + components: RectJSON, + labelNamesCount: number + ): boolean { + // const validateCoordinateValue = (rawValue: string): boolean => { + // const floatValue: number = Number(rawValue); + // return !isNaN(floatValue) && 0.0 <= floatValue && floatValue <= 1.0; + // }; + // const validateLabelIdx = (rawValue: string): boolean => { + // const intValue: number = parseInt(rawValue); + // return ( + // !isNaN(intValue) && 0 <= intValue && intValue < labelNamesCount + // ); + // }; + + // return [ + // components.length === 5, + // validateLabelIdx(components[0]), + // validateCoordinateValue(components[1]), + // validateCoordinateValue(components[2]), + // validateCoordinateValue(components[3]), + // validateCoordinateValue(components[4]) + // ].every(Boolean); + return true; + } +} diff --git a/src/logic/render/BaseRenderEngine.ts b/src/logic/render/BaseRenderEngine.ts index 1f07b9ae..c251011a 100644 --- a/src/logic/render/BaseRenderEngine.ts +++ b/src/logic/render/BaseRenderEngine.ts @@ -41,22 +41,40 @@ export abstract class BaseRenderEngine { abstract isInProgress(): boolean; - protected static resolveLabelLineColor(labelId: string, isActive: boolean): string { - const perClassColor: boolean = GeneralSelector.getEnablePerClassColorationStatus(); + protected static resolveLabelLineColor( + labelId: string, + isActive: boolean + ): string { + const perClassColor: boolean = + GeneralSelector.getEnablePerClassColorationStatus(); if (perClassColor) { - const labelName: LabelName | null = LabelsSelector.getLabelNameById(labelId); - return labelName ? labelName.color : RenderEngineSettings.DEFAULT_LINE_COLOR; + const labelName: LabelName | null = + LabelsSelector.getLabelNameById(labelId); + return labelName + ? labelName.color + : RenderEngineSettings.DEFAULT_LINE_COLOR; } else { - return isActive ? RenderEngineSettings.ACTIVE_LINE_COLOR : RenderEngineSettings.INACTIVE_LINE_COLOR; + return isActive + ? RenderEngineSettings.ACTIVE_LINE_COLOR + : RenderEngineSettings.INACTIVE_LINE_COLOR; } } protected static resolveLabelAnchorColor(isActive: boolean): string { - const perClassColor: boolean = GeneralSelector.getEnablePerClassColorationStatus(); + const perClassColor: boolean = + GeneralSelector.getEnablePerClassColorationStatus(); if (perClassColor) { return RenderEngineSettings.DEFAULT_ANCHOR_COLOR; } else { - return isActive ? RenderEngineSettings.ACTIVE_ANCHOR_COLOR : RenderEngineSettings.INACTIVE_ANCHOR_COLOR; + return isActive + ? RenderEngineSettings.ACTIVE_ANCHOR_COLOR + : RenderEngineSettings.INACTIVE_ANCHOR_COLOR; } } + + protected static resolveLineColorByMode(mode: string): string { + return mode === 'HUMAN' + ? RenderEngineSettings.DEFAULT_HUMAN_LINE_COLOR + : RenderEngineSettings.DEFAULT_ITEM_LINE_COLOR; + } } diff --git a/src/logic/render/RectRenderEngine.ts b/src/logic/render/RectRenderEngine.ts index 0a6b8e21..ec8f4b92 100644 --- a/src/logic/render/RectRenderEngine.ts +++ b/src/logic/render/RectRenderEngine.ts @@ -3,8 +3,14 @@ import {IRect} from '../../interfaces/IRect'; import {RectUtil} from '../../utils/RectUtil'; import {DrawUtil} from '../../utils/DrawUtil'; import {store} from '../..'; -import {ImageData, LabelRect} from '../../store/labels/types'; import { + HumanInfo, + ImageData, + ItemInfo, + LabelRect +} from '../../store/labels/types'; +import { + updateActiveHumanID, updateActiveLabelId, updateFirstLabelCreatedFlag, updateHighlightedLabelId, @@ -19,14 +25,14 @@ import {LabelsSelector} from '../../store/selectors/LabelsSelector'; import {EditorData} from '../../data/EditorData'; import {BaseRenderEngine} from './BaseRenderEngine'; import {RenderEngineUtil} from '../../utils/RenderEngineUtil'; -import {LabelType} from '../../data/enums/LabelType'; +import {LabelModeType, LabelType} from '../../data/enums/LabelType'; import {EditorActions} from '../actions/EditorActions'; import {GeneralSelector} from '../../store/selectors/GeneralSelector'; import {LabelStatus} from '../../data/enums/LabelStatus'; import {LabelUtil} from '../../utils/LabelUtil'; +import {JSONUploadStatus} from '../../data/enums/JSONUploadStatus'; export class RectRenderEngine extends BaseRenderEngine { - // ================================================================================================================= // STATE // ================================================================================================================= @@ -44,24 +50,49 @@ export class RectRenderEngine extends BaseRenderEngine { // ================================================================================================================= public mouseDownHandler = (data: EditorData) => { - const isMouseOverImage: boolean = RenderEngineUtil.isMouseOverImage(data); - const isMouseOverCanvas: boolean = RenderEngineUtil.isMouseOverCanvas(data); + const isMouseOverImage: boolean = + RenderEngineUtil.isMouseOverImage(data); + const isMouseOverCanvas: boolean = + RenderEngineUtil.isMouseOverCanvas(data); if (isMouseOverCanvas) { const rectUnderMouse: LabelRect = this.getRectUnderMouse(data); if (!!rectUnderMouse) { - const rect: IRect = this.calculateRectRelativeToActiveImage(rectUnderMouse.rect, data); - const anchorUnderMouse: RectAnchor = this.getAnchorUnderMouseByRect(rect, data.mousePositionOnViewPortContent, data.viewPortContentImageRect); - if (!!anchorUnderMouse && rectUnderMouse.status === LabelStatus.ACCEPTED) { + const rect: IRect = this.calculateRectRelativeToActiveImage( + rectUnderMouse.rect, + data + ); + const anchorUnderMouse: RectAnchor = + this.getAnchorUnderMouseByRect( + rect, + data.mousePositionOnViewPortContent, + data.viewPortContentImageRect + ); + if ( + !!anchorUnderMouse && + rectUnderMouse.status === LabelStatus.ACCEPTED + ) { store.dispatch(updateActiveLabelId(rectUnderMouse.id)); + store.dispatch(updateActiveHumanID(rectUnderMouse.id)); this.startRectResize(anchorUnderMouse); } else { - if (!!LabelsSelector.getHighlightedLabelId()) - store.dispatch(updateActiveLabelId(LabelsSelector.getHighlightedLabelId())); - else - this.startRectCreation(data.mousePositionOnViewPortContent); + if (!!LabelsSelector.getHighlightedLabelId()) { + store.dispatch( + updateActiveLabelId( + LabelsSelector.getHighlightedLabelId() + ) + ); + store.dispatch( + updateActiveHumanID( + LabelsSelector.getHighlightedLabelId() + ) + ); + } else { + this.startRectCreation( + data.mousePositionOnViewPortContent + ); + } } } else if (isMouseOverImage) { - this.startRectCreation(data.mousePositionOnViewPortContent); } } @@ -69,57 +100,110 @@ export class RectRenderEngine extends BaseRenderEngine { public mouseUpHandler = (data: EditorData) => { if (!!data.viewPortContentImageRect) { - const mousePositionSnapped: IPoint = RectUtil.snapPointToRect(data.mousePositionOnViewPortContent, data.viewPortContentImageRect); - const activeLabelRect: LabelRect = LabelsSelector.getActiveRectLabel(); - - if (!!this.startCreateRectPoint && !PointUtil.equals(this.startCreateRectPoint, mousePositionSnapped)) { - - const minX: number = Math.min(this.startCreateRectPoint.x, mousePositionSnapped.x); - const minY: number = Math.min(this.startCreateRectPoint.y, mousePositionSnapped.y); - const maxX: number = Math.max(this.startCreateRectPoint.x, mousePositionSnapped.x); - const maxY: number = Math.max(this.startCreateRectPoint.y, mousePositionSnapped.y); - - const rect = {x: minX, y: minY, width: maxX - minX, height: maxY - minY}; - this.addRectLabel(RenderEngineUtil.transferRectFromImageToViewPortContent(rect, data)); + const mousePositionSnapped: IPoint = RectUtil.snapPointToRect( + data.mousePositionOnViewPortContent, + data.viewPortContentImageRect + ); + const activeLabelRect: LabelRect = + LabelsSelector.getActiveRectLabel(); + + if ( + !!this.startCreateRectPoint && + !PointUtil.equals( + this.startCreateRectPoint, + mousePositionSnapped + ) + ) { + const minX: number = Math.min( + this.startCreateRectPoint.x, + mousePositionSnapped.x + ); + const minY: number = Math.min( + this.startCreateRectPoint.y, + mousePositionSnapped.y + ); + const maxX: number = Math.max( + this.startCreateRectPoint.x, + mousePositionSnapped.x + ); + const maxY: number = Math.max( + this.startCreateRectPoint.y, + mousePositionSnapped.y + ); + + const rect = { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY + }; + this.addRectLabel( + RenderEngineUtil.transferRectFromImageToViewPortContent( + rect, + data + ) + ); } if (!!this.startResizeRectAnchor && !!activeLabelRect) { - const rect: IRect = this.calculateRectRelativeToActiveImage(activeLabelRect.rect, data); - const startAnchorPosition: IPoint = PointUtil.add(this.startResizeRectAnchor.position, - data.viewPortContentImageRect); - const delta: IPoint = PointUtil.subtract(mousePositionSnapped, startAnchorPosition); - const resizeRect: IRect = RectUtil.resizeRect(rect, this.startResizeRectAnchor.type, delta); - const scale: number = RenderEngineUtil.calculateImageScale(data); + const rect: IRect = this.calculateRectRelativeToActiveImage( + activeLabelRect.rect, + data + ); + const startAnchorPosition: IPoint = PointUtil.add( + this.startResizeRectAnchor.position, + data.viewPortContentImageRect + ); + const delta: IPoint = PointUtil.subtract( + mousePositionSnapped, + startAnchorPosition + ); + const resizeRect: IRect = RectUtil.resizeRect( + rect, + this.startResizeRectAnchor.type, + delta + ); + const scale: number = + RenderEngineUtil.calculateImageScale(data); const scaledRect: IRect = RectUtil.scaleRect(resizeRect, scale); const imageData = LabelsSelector.getActiveImageData(); - imageData.labelRects = imageData.labelRects.map((labelRect: LabelRect) => { - if (labelRect.id === activeLabelRect.id) { - return { - ...labelRect, - rect: scaledRect - }; + imageData.labelRects = imageData.labelRects.map( + (labelRect: LabelRect) => { + if (labelRect.id === activeLabelRect.id) { + return { + ...labelRect, + rect: scaledRect + }; + } + return labelRect; } - return labelRect; - }); + ); + imageData.uploadStatus = JSONUploadStatus.NEED_UPLOAD; store.dispatch(updateImageDataById(imageData.id, imageData)); } } - this.endRectTransformation() + this.endRectTransformation(); }; public mouseMoveHandler = (data: EditorData) => { - if (!!data.viewPortContentImageRect && !!data.mousePositionOnViewPortContent) { - const isOverImage: boolean = RenderEngineUtil.isMouseOverImage(data); + if ( + !!data.viewPortContentImageRect && + !!data.mousePositionOnViewPortContent + ) { + const isOverImage: boolean = + RenderEngineUtil.isMouseOverImage(data); if (isOverImage && !this.startResizeRectAnchor) { const labelRect: LabelRect = this.getRectUnderMouse(data); if (!!labelRect && !this.isInProgress()) { - if (LabelsSelector.getHighlightedLabelId() !== labelRect.id) { - store.dispatch(updateHighlightedLabelId(labelRect.id)) + if ( + LabelsSelector.getHighlightedLabelId() !== labelRect.id + ) { + store.dispatch(updateHighlightedLabelId(labelRect.id)); } } else { if (LabelsSelector.getHighlightedLabelId() !== null) { - store.dispatch(updateHighlightedLabelId(null)) + store.dispatch(updateHighlightedLabelId(null)); } } } @@ -133,84 +217,189 @@ export class RectRenderEngine extends BaseRenderEngine { public render(data: EditorData) { const activeLabelId: string = LabelsSelector.getActiveLabelId(); const imageData: ImageData = LabelsSelector.getActiveImageData(); + if (!data.realImageSize) return null; if (imageData) { imageData.labelRects.forEach((labelRect: LabelRect) => { - if (labelRect.status === LabelStatus.ACCEPTED && labelRect.id === activeLabelId) { - this.drawActiveRect(labelRect, data) + if ( + labelRect.status === LabelStatus.ACCEPTED && + labelRect.id === activeLabelId + ) { + this.drawActiveRect(labelRect, data); } else { this.drawInactiveRect(labelRect, data); } }); - this.drawCurrentlyCreatedRect(data.mousePositionOnViewPortContent, data.viewPortContentImageRect); + this.drawCurrentlyCreatedRect( + data.mousePositionOnViewPortContent, + data.viewPortContentImageRect + ); this.updateCursorStyle(data); } } private drawCurrentlyCreatedRect(mousePosition: IPoint, imageRect: IRect) { if (!!this.startCreateRectPoint) { - const mousePositionSnapped: IPoint = RectUtil.snapPointToRect(mousePosition, imageRect); + const mousePositionSnapped: IPoint = RectUtil.snapPointToRect( + mousePosition, + imageRect + ); const activeRect: IRect = { x: this.startCreateRectPoint.x, y: this.startCreateRectPoint.y, width: mousePositionSnapped.x - this.startCreateRectPoint.x, height: mousePositionSnapped.y - this.startCreateRectPoint.y }; - const activeRectBetweenPixels = RenderEngineUtil.setRectBetweenPixels(activeRect); - const lineColor: string = BaseRenderEngine.resolveLabelLineColor(null, true) - DrawUtil.drawRect(this.canvas, activeRectBetweenPixels, lineColor, RenderEngineSettings.LINE_THICKNESS); + const activeRectBetweenPixels = + RenderEngineUtil.setRectBetweenPixels(activeRect); + const lineColor: string = BaseRenderEngine.resolveLabelLineColor( + null, + true + ); + DrawUtil.drawRect( + this.canvas, + activeRectBetweenPixels, + lineColor, + RenderEngineSettings.LINE_THICKNESS + ); } } private drawInactiveRect(labelRect: LabelRect, data: EditorData) { - const rectOnImage: IRect = RenderEngineUtil.transferRectFromViewPortContentToImage(labelRect.rect, data) - const highlightedLabelId: string = LabelsSelector.getHighlightedLabelId() - const displayAsActive: boolean = labelRect.status === LabelStatus.ACCEPTED && labelRect.id === highlightedLabelId; - const lineColor: string = BaseRenderEngine.resolveLabelLineColor(labelRect.labelId, displayAsActive) - const anchorColor: string = BaseRenderEngine.resolveLabelAnchorColor(displayAsActive); - this.renderRect(rectOnImage, displayAsActive, lineColor, anchorColor); + const rectOnImage: IRect = + RenderEngineUtil.transferRectFromViewPortContentToImage( + labelRect.rect, + data + ); + const highlightedLabelId: string = + LabelsSelector.getHighlightedLabelId(); + const displayAsActive: boolean = + labelRect.status === LabelStatus.ACCEPTED && + labelRect.id === highlightedLabelId; + const lineColor: string = BaseRenderEngine.resolveLineColorByMode( + labelRect.mode + ); + const anchorColor: string = + BaseRenderEngine.resolveLabelAnchorColor(displayAsActive); + this.renderRect( + rectOnImage, + displayAsActive, + lineColor, + anchorColor, + GeneralSelector.getFillMode() + ); } private drawActiveRect(labelRect: LabelRect, data: EditorData) { - let rect: IRect = this.calculateRectRelativeToActiveImage(labelRect.rect, data); + let rect: IRect = this.calculateRectRelativeToActiveImage( + labelRect.rect, + data + ); if (!!this.startResizeRectAnchor) { - const startAnchorPosition: IPoint = PointUtil.add(this.startResizeRectAnchor.position, data.viewPortContentImageRect); - const endAnchorPositionSnapped: IPoint = RectUtil.snapPointToRect(data.mousePositionOnViewPortContent, data.viewPortContentImageRect); - const delta = PointUtil.subtract(endAnchorPositionSnapped, startAnchorPosition); - rect = RectUtil.resizeRect(rect, this.startResizeRectAnchor.type, delta); + const startAnchorPosition: IPoint = PointUtil.add( + this.startResizeRectAnchor.position, + data.viewPortContentImageRect + ); + const endAnchorPositionSnapped: IPoint = RectUtil.snapPointToRect( + data.mousePositionOnViewPortContent, + data.viewPortContentImageRect + ); + const delta = PointUtil.subtract( + endAnchorPositionSnapped, + startAnchorPosition + ); + rect = RectUtil.resizeRect( + rect, + this.startResizeRectAnchor.type, + delta + ); } - const rectOnImage: IRect = RectUtil.translate(rect, data.viewPortContentImageRect); - const lineColor: string = BaseRenderEngine.resolveLabelLineColor(labelRect.labelId, true) - const anchorColor: string = BaseRenderEngine.resolveLabelAnchorColor(true); - this.renderRect(rectOnImage, true, lineColor, anchorColor); + const rectOnImage: IRect = RectUtil.translate( + rect, + data.viewPortContentImageRect + ); + const lineColor: string = BaseRenderEngine.resolveLabelLineColor( + labelRect.labelId, + true + ); + const anchorColor: string = + BaseRenderEngine.resolveLabelAnchorColor(true); + this.renderRect( + rectOnImage, + true, + lineColor, + anchorColor, + GeneralSelector.getFillMode() + ); } - private renderRect(rectOnImage: IRect, isActive: boolean, lineColor: string, anchorColor: string) { - const rectBetweenPixels = RenderEngineUtil.setRectBetweenPixels(rectOnImage); - DrawUtil.drawRectWithFill(this.canvas, rectBetweenPixels, DrawUtil.hexToRGB(lineColor, 0.2)); - DrawUtil.drawRect(this.canvas, rectBetweenPixels, lineColor, RenderEngineSettings.LINE_THICKNESS); + private renderRect( + rectOnImage: IRect, + isActive: boolean, + lineColor: string, + anchorColor: string, + fillMode: boolean + ) { + const rectBetweenPixels = + RenderEngineUtil.setRectBetweenPixels(rectOnImage); + if (fillMode) { + DrawUtil.drawRectWithFill( + this.canvas, + rectBetweenPixels, + DrawUtil.hexToRGB(lineColor, 0.2) + ); + } + DrawUtil.drawRect( + this.canvas, + rectBetweenPixels, + lineColor, + RenderEngineSettings.LINE_THICKNESS + ); if (isActive) { - const handleCenters: IPoint[] = RectUtil.mapRectToAnchors(rectOnImage).map((rectAnchor: RectAnchor) => rectAnchor.position); + const handleCenters: IPoint[] = RectUtil.mapRectToAnchors( + rectOnImage + ).map((rectAnchor: RectAnchor) => rectAnchor.position); handleCenters.forEach((center: IPoint) => { - const handleRect: IRect = RectUtil.getRectWithCenterAndSize(center, RenderEngineSettings.anchorSize); - const handleRectBetweenPixels: IRect = RenderEngineUtil.setRectBetweenPixels(handleRect); - DrawUtil.drawRectWithFill(this.canvas, handleRectBetweenPixels, anchorColor); - }) + const handleRect: IRect = RectUtil.getRectWithCenterAndSize( + center, + RenderEngineSettings.anchorSize + ); + const handleRectBetweenPixels: IRect = + RenderEngineUtil.setRectBetweenPixels(handleRect); + DrawUtil.drawRectWithFill( + this.canvas, + handleRectBetweenPixels, + anchorColor + ); + }); } } private updateCursorStyle(data: EditorData) { - if (!!this.canvas && !!data.mousePositionOnViewPortContent && !GeneralSelector.getImageDragModeStatus()) { + if ( + !!this.canvas && + !!data.mousePositionOnViewPortContent && + !GeneralSelector.getImageDragModeStatus() + ) { const rectUnderMouse: LabelRect = this.getRectUnderMouse(data); - const rectAnchorUnderMouse: RectAnchor = this.getAnchorUnderMouse(data); - if ((!!rectAnchorUnderMouse && rectUnderMouse && rectUnderMouse.status === LabelStatus.ACCEPTED) || !!this.startResizeRectAnchor) { + const rectAnchorUnderMouse: RectAnchor = + this.getAnchorUnderMouse(data); + if ( + (!!rectAnchorUnderMouse && + rectUnderMouse && + rectUnderMouse.status === LabelStatus.ACCEPTED) || + !!this.startResizeRectAnchor + ) { store.dispatch(updateCustomCursorStyle(CustomCursorStyle.MOVE)); return; - } - else if (RenderEngineUtil.isMouseOverCanvas(data)) { - if (!RenderEngineUtil.isMouseOverImage(data) && !!this.startCreateRectPoint) - store.dispatch(updateCustomCursorStyle(CustomCursorStyle.MOVE)); - else - RenderEngineUtil.wrapDefaultCursorStyleInCancel(data); + } else if (RenderEngineUtil.isMouseOverCanvas(data)) { + if ( + !RenderEngineUtil.isMouseOverImage(data) && + !!this.startCreateRectPoint + ) + store.dispatch( + updateCustomCursorStyle(CustomCursorStyle.MOVE) + ); + else RenderEngineUtil.wrapDefaultCursorStyleInCancel(data); this.canvas.style.cursor = 'none'; } else { this.canvas.style.cursor = 'default'; @@ -226,16 +415,48 @@ export class RectRenderEngine extends BaseRenderEngine { return !!this.startCreateRectPoint || !!this.startResizeRectAnchor; } - private calculateRectRelativeToActiveImage(rect: IRect, data: EditorData):IRect { + private calculateRectRelativeToActiveImage( + rect: IRect, + data: EditorData + ): IRect { const scale: number = RenderEngineUtil.calculateImageScale(data); - return RectUtil.scaleRect(rect, 1/scale); + return RectUtil.scaleRect(rect, 1 / scale); } private addRectLabel = (rect: IRect) => { const activeLabelId = LabelsSelector.getActiveLabelNameId(); const imageData: ImageData = LabelsSelector.getActiveImageData(); - const labelRect: LabelRect = LabelUtil.createLabelRect(activeLabelId, rect); + const labelRect: LabelRect = LabelUtil.createLabelRect( + activeLabelId, + rect + ); + if (LabelsSelector.getActiveLabelMode() === LabelModeType.HUMAN) { + const humanInfo: HumanInfo = { + uuid: labelRect.id, + id: imageData.humans.length, + gender: LabelsSelector.getActiveGender(), + type: LabelsSelector.getActiveHumanType(), + styles: LabelsSelector.getActiveStyles() + }; + imageData.humans.push(humanInfo); + store.dispatch(updateActiveHumanID(labelRect.id)); + } else { + const itemInfo: ItemInfo = { + uuid: labelRect.id, + id: imageData.items.length, + humanId: LabelsSelector.getActiveHumanID(), + gender: LabelsSelector.getActiveGender(), + mainCategory: LabelsSelector.getActiveMainCategory(), + subCategory: LabelsSelector.getActiveSubCategory(), + color: LabelsSelector.getActiveColor(), + pattern: LabelsSelector.getActivePattern(), + styles: LabelsSelector.getActiveStyles() + }; + imageData.items.push(itemInfo); + } imageData.labelRects.push(labelRect); + imageData.uploadStatus = JSONUploadStatus.NEED_UPLOAD; + store.dispatch(updateImageDataById(imageData.id, imageData)); store.dispatch(updateFirstLabelCreatedFlag(true)); store.dispatch(updateActiveLabelId(labelRect.id)); @@ -243,11 +464,15 @@ export class RectRenderEngine extends BaseRenderEngine { private getRectUnderMouse(data: EditorData): LabelRect { const activeRectLabel: LabelRect = LabelsSelector.getActiveRectLabel(); - if (!!activeRectLabel && this.isMouseOverRectEdges(activeRectLabel.rect, data)) { + if ( + !!activeRectLabel && + this.isMouseOverRectEdges(activeRectLabel.rect, data) + ) { return activeRectLabel; } - const labelRects: LabelRect[] = LabelsSelector.getActiveImageData().labelRects; + const labelRects: LabelRect[] = + LabelsSelector.getActiveImageData().labelRects; for (let i = 0; i < labelRects.length; i++) { if (this.isMouseOverRectEdges(labelRects[i].rect, data)) { return labelRects[i]; @@ -258,7 +483,9 @@ export class RectRenderEngine extends BaseRenderEngine { private isMouseOverRectEdges(rect: IRect, data: EditorData): boolean { const rectOnImage: IRect = RectUtil.translate( - this.calculateRectRelativeToActiveImage(rect, data), data.viewPortContentImageRect); + this.calculateRectRelativeToActiveImage(rect, data), + data.viewPortContentImageRect + ); const outerRectDelta: IPoint = { x: RenderEngineSettings.anchorHoverSize.width / 2, @@ -267,20 +494,41 @@ export class RectRenderEngine extends BaseRenderEngine { const outerRect: IRect = RectUtil.expand(rectOnImage, outerRectDelta); const innerRectDelta: IPoint = { - x: - RenderEngineSettings.anchorHoverSize.width / 2, - y: - RenderEngineSettings.anchorHoverSize.height / 2 + x: -RenderEngineSettings.anchorHoverSize.width / 2, + y: -RenderEngineSettings.anchorHoverSize.height / 2 }; const innerRect: IRect = RectUtil.expand(rectOnImage, innerRectDelta); - return (RectUtil.isPointInside(outerRect, data.mousePositionOnViewPortContent) && - !RectUtil.isPointInside(innerRect, data.mousePositionOnViewPortContent)); + return ( + RectUtil.isPointInside( + outerRect, + data.mousePositionOnViewPortContent + ) && + !RectUtil.isPointInside( + innerRect, + data.mousePositionOnViewPortContent + ) + ); } - private getAnchorUnderMouseByRect(rect: IRect, mousePosition: IPoint, imageRect: IRect): RectAnchor { + private getAnchorUnderMouseByRect( + rect: IRect, + mousePosition: IPoint, + imageRect: IRect + ): RectAnchor { const rectAnchors: RectAnchor[] = RectUtil.mapRectToAnchors(rect); for (let i = 0; i < rectAnchors.length; i++) { - const anchorRect: IRect = RectUtil.translate(RectUtil.getRectWithCenterAndSize(rectAnchors[i].position, RenderEngineSettings.anchorHoverSize), imageRect); - if (!!mousePosition && RectUtil.isPointInside(anchorRect, mousePosition)) { + const anchorRect: IRect = RectUtil.translate( + RectUtil.getRectWithCenterAndSize( + rectAnchors[i].position, + RenderEngineSettings.anchorHoverSize + ), + imageRect + ); + if ( + !!mousePosition && + RectUtil.isPointInside(anchorRect, mousePosition) + ) { return rectAnchors[i]; } } @@ -288,10 +536,18 @@ export class RectRenderEngine extends BaseRenderEngine { } private getAnchorUnderMouse(data: EditorData): RectAnchor { - const labelRects: LabelRect[] = LabelsSelector.getActiveImageData().labelRects; + const labelRects: LabelRect[] = + LabelsSelector.getActiveImageData().labelRects; for (let i = 0; i < labelRects.length; i++) { - const rect: IRect = this.calculateRectRelativeToActiveImage(labelRects[i].rect, data); - const rectAnchor = this.getAnchorUnderMouseByRect(rect, data.mousePositionOnViewPortContent, data.viewPortContentImageRect); + const rect: IRect = this.calculateRectRelativeToActiveImage( + labelRects[i].rect, + data + ); + const rectAnchor = this.getAnchorUnderMouseByRect( + rect, + data.mousePositionOnViewPortContent, + data.viewPortContentImageRect + ); if (!!rectAnchor) return rectAnchor; } return null; diff --git a/src/services/API.ts b/src/services/API.ts new file mode 100644 index 00000000..7a2075e5 --- /dev/null +++ b/src/services/API.ts @@ -0,0 +1,125 @@ +import {string} from '@tensorflow/tfjs-core'; +import axios from 'axios'; +import {Settings} from '../settings/Settings'; +import {AuthSelector} from '../store/selectors/AuthSelector'; + +export class APIService { + private static token = null; + + public static login = async ({ + email, + password + }: { + email: string; + password: string; + }) => { + return await axios({ + method: 'post', + headers: { + 'Content-Type': 'application/json' + }, + url: `${Settings.API_PREFIX}/login`, + data: {id: email, password} + }); + }; + + public static fetchImages = async ({ + offset, + limit + }: { + offset: number; + limit: number; + }) => { + const token = AuthSelector.getToken(); + if (!token) { + throw Error('Token is required'); + } + return await axios({ + method: 'get', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + url: `${Settings.API_PREFIX}/labeler/images`, + params: {limit, offset} + }); + }; + + public static updateImage = async ({ + imageId, + json + }: { + imageId: string; + json: string; + }) => { + const token = AuthSelector.getToken(); + // console.log('token = ', token); + console.log('json = ', json); + console.log('imageId = ', imageId); + if (!token) { + throw Error('Token is required'); + } + if (!imageId) { + throw Error('ImageId is required'); + } + if (!json) { + throw Error('JSON is required'); + } + return await axios({ + method: 'put', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + url: `${Settings.API_PREFIX}/labeler/images/${imageId}`, + data: { + json + } + }); + }; + + public static getTasks = async () => { + const token = AuthSelector.getToken(); + if (!token) { + throw Error('Token is required'); + } + return await axios({ + method: 'get', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + url: `${Settings.API_PREFIX}/labeler/tasks` + }); + }; + + public static getTaskStatus = async () => { + const token = AuthSelector.getToken(); + if (!token) { + throw Error('Token is required'); + } + return await axios({ + method: 'get', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + url: `${Settings.API_PREFIX}/labeler/taskStatus` + }); + }; + + public static getSummary = async () => { + const token = AuthSelector.getToken(); + if (!token) { + throw Error('Token is required'); + } + return await axios({ + method: 'get', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + }, + url: `${Settings.API_PREFIX}/labeler/common_summary` + }); + }; +} diff --git a/src/services/types.ts b/src/services/types.ts new file mode 100644 index 00000000..4a9846ab --- /dev/null +++ b/src/services/types.ts @@ -0,0 +1,12 @@ +export type APIImageData = { + image_id: string; + image_url: string; + style_list: { + seq: string; + name: string; + }[]; + labeling_json?: string; + image_width: string; + image_height: string; + image_status: string; +}; diff --git a/src/settings/RenderEngineSettings.ts b/src/settings/RenderEngineSettings.ts index 91c05c4e..68359931 100644 --- a/src/settings/RenderEngineSettings.ts +++ b/src/settings/RenderEngineSettings.ts @@ -20,13 +20,19 @@ export class RenderEngineSettings { height: 100 }; public static readonly defaultAnchorColor: string = '#ffffff'; - public static readonly inactiveAnchorColor: string = Settings.DARK_THEME_SECOND_COLOR; + public static readonly inactiveAnchorColor: string = + Settings.DARK_THEME_SECOND_COLOR; public static readonly DEFAULT_ANCHOR_COLOR: string = '#ffffff'; - public static readonly ACTIVE_ANCHOR_COLOR: string = Settings.SECONDARY_COLOR; - public static readonly INACTIVE_ANCHOR_COLOR: string = Settings.DARK_THEME_SECOND_COLOR; + public static readonly ACTIVE_ANCHOR_COLOR: string = + Settings.SECONDARY_COLOR; + public static readonly INACTIVE_ANCHOR_COLOR: string = + Settings.DARK_THEME_SECOND_COLOR; - public static readonly DEFAULT_LINE_COLOR: string = '#ffffff'; + public static readonly DEFAULT_LINE_COLOR: string = '#00ff00'; public static readonly ACTIVE_LINE_COLOR: string = Settings.PRIMARY_COLOR; public static readonly INACTIVE_LINE_COLOR: string = '#ffffff'; + + public static readonly DEFAULT_HUMAN_LINE_COLOR: string = '#0000cc'; + public static readonly DEFAULT_ITEM_LINE_COLOR: string = '#cc0000'; } diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 891560aa..e8be4ebe 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -1,19 +1,33 @@ -import {PopupWindowType} from '../data/enums/PopupWindowType'; +import { PopupWindowType } from '../data/enums/PopupWindowType'; export class Settings { public static readonly GITHUB_URL: string = 'https://github.com/SkalskiP'; - public static readonly MEDIUM_URL: string = 'https://medium.com/@piotr.skalski92'; - public static readonly PATREON_URL: string = 'https://www.patreon.com/make_sense'; + public static readonly MEDIUM_URL: string = + 'https://medium.com/@piotr.skalski92'; + public static readonly PATREON_URL: string = + 'https://www.patreon.com/make_sense'; public static readonly TOP_NAVIGATION_BAR_HEIGHT_PX: number = 35; - public static readonly EDITOR_BOTTOM_NAVIGATION_BAR_HEIGHT_PX: number = 40 + 1; + public static readonly EDITOR_BOTTOM_NAVIGATION_BAR_HEIGHT_PX: number = + 40 + 1; public static readonly EDITOR_TOP_NAVIGATION_BAR_HEIGHT_PX: number = 40 + 1; public static readonly SIDE_NAVIGATION_BAR_WIDTH_CLOSED_PX: number = 23 + 1; - public static readonly SIDE_NAVIGATION_BAR_WIDTH_OPEN_PX: number = Settings.SIDE_NAVIGATION_BAR_WIDTH_CLOSED_PX + 300 + 1; + public static readonly SIDE_NAVIGATION_BAR_WIDTH_OPEN_PX: number = + Settings.SIDE_NAVIGATION_BAR_WIDTH_CLOSED_PX + 200 + 1; + public static readonly GUIDE_SIDE_NAVIGATION_BAR_WIDTH_CLOSED_PX: number = + 23 + 1; + public static readonly GUIDE_SIDE_NAVIGATION_BAR_WIDTH_OPEN_PX: number = + Settings.GUIDE_SIDE_NAVIGATION_BAR_WIDTH_CLOSED_PX + 200 + 1; + + public static readonly LABEL_SIDE_NAVIGATION_BAR_WIDTH_CLOSED_PX: number = + 23 + 1; + public static readonly LABEL_SIDE_NAVIGATION_BAR_WIDTH_OPEN_PX: number = + Settings.GUIDE_SIDE_NAVIGATION_BAR_WIDTH_CLOSED_PX + 300 + 1; + public static readonly TOOLKIT_TAB_HEIGHT_PX: number = 40; public static readonly TOOLBOX_PANEL_WIDTH_PX: number = 50 + 1; - public static readonly EDITOR_MIN_WIDTH: number = 900; + public static readonly EDITOR_MIN_WIDTH: number = 400; public static readonly EDITOR_MIN_HEIGHT: number = 500; public static readonly PRIMARY_COLOR: string = '#2af598'; @@ -59,5 +73,12 @@ export class Settings { '#cb38ff', '#ff95c8', '#ff37c7' - ] + ]; + + public static readonly API_PREFIX = + process.env.REACT_APP_API_URL || 'https://dev.ocmg.vn/showniq/api/backoffice' + // 'https://dev.ocmg.vn/fs-app/api/backoffice'; + + public static readonly UNKNOWN_URL = 'guides/icons/unknown.png'; + public static readonly UNKNOWN_S_URL = 'guides/icons/unknown_s.png'; } diff --git a/src/settings/_Settings.scss b/src/settings/_Settings.scss index 73c71b48..0b592f40 100644 --- a/src/settings/_Settings.scss +++ b/src/settings/_Settings.scss @@ -5,11 +5,15 @@ $darkThemeForthColor: #262c2f; $primaryColor: #2af598; $secondaryColor: #009efd; - +$dangerColor: #FF0006; +$lightSuccess: #00ff21; +$successColor: #2DBBA6; $topNavigationBarHeight: 35px; $stateBarHeight: 2px; $sideNavigationBarCompanionWidth: 23px; -$sideNavigationBarContentWidth: 300px; +$sideNavigationBarContentWidth: 200px; +$sideNavigationBarContentWidthForGuide: 200px; +$sideNavigationBarContentWidthForLabel: 300px; $editorBottomNavigationBarHeight: 40px; $editorTopNavigationBarHeight: 40px; -$toolboxWidth: 50px; \ No newline at end of file +$toolboxWidth: 50px; diff --git a/src/store/Actions.ts b/src/store/Actions.ts index c5c10e43..8f36e19f 100644 --- a/src/store/Actions.ts +++ b/src/store/Actions.ts @@ -17,6 +17,7 @@ export enum Action { UPDATE_CROSS_HAIR_VISIBLE_STATUS = '@@UPDATE_CROSS_HAIR_VISIBLE_STATUS', UPDATE_ENABLE_PER_CLASS_COLORATION_STATUS = '@@UPDATE_ENABLE_PER_CLASS_COLORATION_STATUS', UPDATE_ZOOM = '@@UPDATE_ZOOM', + UPDATE_FILL_MODE = '@@UPDATE_FILL_MODE', // LABELS UPDATE_ACTIVE_IMAGE_INDEX = '@@UPDATE_ACTIVE_IMAGE_INDEX', @@ -30,7 +31,26 @@ export enum Action { UPDATE_LABEL_NAMES = '@@UPDATE_LABEL_NAMES', UPDATE_FIRST_LABEL_CREATED_FLAG = '@@UPDATE_FIRST_LABEL_CREATED_FLAG', + // LABEL MODE + UPDATE_ACTIVE_LABEL_MODE = '@@UPDATE_ACTIVE_LABEL_MODE', + UPDATE_ACTIVE_GENDER = '@@UPDATE_ACTIVE_GENDER', + UPDATE_ACTIVE_HUMAN_TYPE = '@@UPDATE_ACTIVE_HUMAN_TYPE', + UPDATE_ACTIVE_STYLES = '@@UPDATE_ACTIVE_STYLES', + UPDATE_ACTIVE_HUMAN_ID = '@@UPDATE_ACTIVE_HUMAN_ID', + UPDATE_ACTIVE_MAIN_CATEGORY = '@@UPDATE_ACTIVE_MAIN_CATEGORY', + UPDATE_ACTIVE_SUB_CATEGORY = '@@UPDATE_ACTIVE_SUB_CATEGORY', + UPDATE_ACTIVE_COLOR = '@@UPDATE_ACTIVE_COLOR', + UPDATE_ACTIVE_PATTERN = '@@UPDATE_ACTIVE_PATTERN', + // NOTIFICATIONS SUBMIT_NEW_NOTIFICATION = '@@SUBMIT_NEW_NOTIFICATION', - DELETE_NOTIFICATION_BY_ID = '@@DELETE_NOTIFICATION_BY_ID' + DELETE_NOTIFICATION_BY_ID = '@@DELETE_NOTIFICATION_BY_ID', + + // AUTH + UPDATE_AUTH_DATA = '@@UPDATE_AUTH_DATA', + + // PERFORMANCE + UPDATE_TASK_STATUS_DATA = '@@UPDATE_TASK_STATUS_DATA', + UPDATE_TASKS_DATA = '@@UPDATE_TASKS_DATA', + UPDATE_COMMON_SUMMARY_DATA = '@@UPDATE_COMMON_SUMMARY_DATA' } diff --git a/src/store/auth/actionCreators.ts b/src/store/auth/actionCreators.ts new file mode 100644 index 00000000..5da429e0 --- /dev/null +++ b/src/store/auth/actionCreators.ts @@ -0,0 +1,11 @@ +import {AuthActionTypes, AuthData} from './types'; +import {Action} from '../Actions'; + +export function updateAuthData(authData: AuthData): AuthActionTypes { + return { + type: Action.UPDATE_AUTH_DATA, + payload: { + authData + } + }; +} diff --git a/src/store/auth/reducer.ts b/src/store/auth/reducer.ts new file mode 100644 index 00000000..eff72c14 --- /dev/null +++ b/src/store/auth/reducer.ts @@ -0,0 +1,27 @@ +import {AuthActionTypes, AuthState} from './types'; +import {Action} from '../Actions'; + +const initialState: AuthState = { + authData: { + displayName: null, + role: null, + email: null, + authToken: null + } +}; + +export function authReducer( + state = initialState, + action: AuthActionTypes +): AuthState { + switch (action.type) { + case Action.UPDATE_AUTH_DATA: { + return { + ...state, + authData: action.payload.authData + }; + } + default: + return state; + } +} diff --git a/src/store/auth/types.ts b/src/store/auth/types.ts new file mode 100644 index 00000000..5efc8190 --- /dev/null +++ b/src/store/auth/types.ts @@ -0,0 +1,21 @@ +import {Action} from '../Actions'; + +export type AuthData = { + displayName: string; + email: string; + role: string; + authToken: string; +}; + +export type AuthState = { + authData: AuthData; +}; + +interface UpdateAuthData { + type: typeof Action.UPDATE_AUTH_DATA; + payload: { + authData: AuthData; + }; +} + +export type AuthActionTypes = UpdateAuthData; diff --git a/src/store/general/actionCreators.ts b/src/store/general/actionCreators.ts index c182e78d..ecdc9284 100644 --- a/src/store/general/actionCreators.ts +++ b/src/store/general/actionCreators.ts @@ -9,71 +9,94 @@ export function updateWindowSize(windowSize: ISize): GeneralActionTypes { return { type: Action.UPDATE_WINDOW_SIZE, payload: { - windowSize, - }, + windowSize + } }; } -export function updateActivePopupType(activePopupType: PopupWindowType): GeneralActionTypes { +export function updateActivePopupType( + activePopupType: PopupWindowType +): GeneralActionTypes { return { type: Action.UPDATE_ACTIVE_POPUP_TYPE, payload: { - activePopupType, + activePopupType } - } + }; } -export function updateCustomCursorStyle(customCursorStyle: CustomCursorStyle): GeneralActionTypes { +export function updateCustomCursorStyle( + customCursorStyle: CustomCursorStyle +): GeneralActionTypes { return { type: Action.UPDATE_CUSTOM_CURSOR_STYLE, payload: { - customCursorStyle, + customCursorStyle } - } + }; } -export function updateActiveContext(activeContext: ContextType): GeneralActionTypes { +export function updateActiveContext( + activeContext: ContextType +): GeneralActionTypes { return { type: Action.UPDATE_CONTEXT, payload: { - activeContext, - }, + activeContext + } }; } -export function updatePreventCustomCursorStatus(preventCustomCursor: boolean): GeneralActionTypes { +export function updatePreventCustomCursorStatus( + preventCustomCursor: boolean +): GeneralActionTypes { return { type: Action.UPDATE_PREVENT_CUSTOM_CURSOR_STATUS, payload: { - preventCustomCursor, - }, + preventCustomCursor + } }; } -export function updateImageDragModeStatus(imageDragMode: boolean): GeneralActionTypes { +export function updateImageDragModeStatus( + imageDragMode: boolean +): GeneralActionTypes { return { type: Action.UPDATE_IMAGE_DRAG_MODE_STATUS, payload: { - imageDragMode, - }, + imageDragMode + } }; } -export function updateCrossHairVisibleStatus(crossHairVisible: boolean): GeneralActionTypes { +export function updateCrossHairVisibleStatus( + crossHairVisible: boolean +): GeneralActionTypes { return { type: Action.UPDATE_CROSS_HAIR_VISIBLE_STATUS, payload: { - crossHairVisible, - }, + crossHairVisible + } + }; +} + +export function updateFillMode(fillMode: boolean): GeneralActionTypes { + return { + type: Action.UPDATE_FILL_MODE, + payload: { + fillMode + } }; } -export function updateProjectData(projectData: ProjectData): GeneralActionTypes { +export function updateProjectData( + projectData: ProjectData +): GeneralActionTypes { return { type: Action.UPDATE_PROJECT_DATA, payload: { - projectData, - }, + projectData + } }; } @@ -81,16 +104,18 @@ export function updateZoom(zoom: number): GeneralActionTypes { return { type: Action.UPDATE_ZOOM, payload: { - zoom, - }, + zoom + } }; } -export function updatePerClassColorationStatus(enablePerClassColoration: boolean): GeneralActionTypes { +export function updatePerClassColorationStatus( + enablePerClassColoration: boolean +): GeneralActionTypes { return { type: Action.UPDATE_ENABLE_PER_CLASS_COLORATION_STATUS, payload: { - enablePerClassColoration, - }, + enablePerClassColoration + } }; } diff --git a/src/store/general/reducer.ts b/src/store/general/reducer.ts index 4efc9fcf..ba111793 100644 --- a/src/store/general/reducer.ts +++ b/src/store/general/reducer.ts @@ -2,6 +2,7 @@ import {GeneralActionTypes, GeneralState} from './types'; import {Action} from '../Actions'; import {CustomCursorStyle} from '../../data/enums/CustomCursorStyle'; import {ViewPointSettings} from '../../settings/ViewPointSettings'; +import {PopupWindowType} from '../../data/enums/PopupWindowType'; const initialState: GeneralState = { windowSize: null, @@ -14,9 +15,10 @@ const initialState: GeneralState = { enablePerClassColoration: true, projectData: { type: null, - name: 'my-project-name', + name: 'my-project-name' }, - zoom: ViewPointSettings.MIN_ZOOM + zoom: ViewPointSettings.MIN_ZOOM, + fillMode: true }; export function generalReducer( @@ -28,61 +30,68 @@ export function generalReducer( return { ...state, windowSize: action.payload.windowSize - } + }; } case Action.UPDATE_ACTIVE_POPUP_TYPE: { return { ...state, activePopupType: action.payload.activePopupType - } + }; } case Action.UPDATE_CUSTOM_CURSOR_STYLE: { return { ...state, customCursorStyle: action.payload.customCursorStyle - } + }; } case Action.UPDATE_CONTEXT: { return { ...state, activeContext: action.payload.activeContext - } + }; } case Action.UPDATE_PREVENT_CUSTOM_CURSOR_STATUS: { return { ...state, preventCustomCursor: action.payload.preventCustomCursor - } + }; } case Action.UPDATE_IMAGE_DRAG_MODE_STATUS: { return { ...state, imageDragMode: action.payload.imageDragMode - } + }; } case Action.UPDATE_CROSS_HAIR_VISIBLE_STATUS: { return { ...state, crossHairVisible: action.payload.crossHairVisible - } + }; } case Action.UPDATE_PROJECT_DATA: { return { ...state, projectData: action.payload.projectData - } + }; } case Action.UPDATE_ZOOM: { return { ...state, zoom: action.payload.zoom - } + }; } case Action.UPDATE_ENABLE_PER_CLASS_COLORATION_STATUS: { return { ...state, - enablePerClassColoration: action.payload.enablePerClassColoration - } + enablePerClassColoration: + action.payload.enablePerClassColoration + }; + } + case Action.UPDATE_FILL_MODE: { + return { + ...state, + fillMode: action.payload.fillMode + }; } default: return state; diff --git a/src/store/general/types.ts b/src/store/general/types.ts index ec97a9b1..bdae1ddd 100644 --- a/src/store/general/types.ts +++ b/src/store/general/types.ts @@ -7,8 +7,8 @@ import {ProjectType} from '../../data/enums/ProjectType'; export type ProjectData = { type: ProjectType; - name: string, -} + name: string; +}; export type GeneralState = { windowSize: ISize; @@ -21,79 +21,88 @@ export type GeneralState = { activeContext: ContextType; projectData: ProjectData; zoom: number; -} + fillMode: boolean; +}; interface UpdateProjectData { type: typeof Action.UPDATE_PROJECT_DATA; payload: { projectData: ProjectData; - } + }; } interface UpdateWindowSize { type: typeof Action.UPDATE_WINDOW_SIZE; payload: { windowSize: ISize; - } + }; } interface UpdateActivePopupType { type: typeof Action.UPDATE_ACTIVE_POPUP_TYPE; payload: { activePopupType: PopupWindowType; - } + }; } interface UpdateCustomCursorStyle { type: typeof Action.UPDATE_CUSTOM_CURSOR_STYLE; payload: { customCursorStyle: CustomCursorStyle; - } + }; } interface UpdateActiveContext { type: typeof Action.UPDATE_CONTEXT; payload: { activeContext: ContextType; - } + }; } interface UpdatePreventCustomCursorStatus { type: typeof Action.UPDATE_PREVENT_CUSTOM_CURSOR_STATUS; payload: { preventCustomCursor: boolean; - } + }; } interface UpdateImageDragModeStatus { type: typeof Action.UPDATE_IMAGE_DRAG_MODE_STATUS; payload: { imageDragMode: boolean; - } + }; } interface UpdateCrossHairVisibleStatus { type: typeof Action.UPDATE_CROSS_HAIR_VISIBLE_STATUS; payload: { crossHairVisible: boolean; - } + }; } interface UpdateZoom { - type: typeof Action.UPDATE_ZOOM, + type: typeof Action.UPDATE_ZOOM; payload: { zoom: number; - } + }; } interface UpdatePerClassColoration { - type: typeof Action.UPDATE_ENABLE_PER_CLASS_COLORATION_STATUS, + type: typeof Action.UPDATE_ENABLE_PER_CLASS_COLORATION_STATUS; payload: { enablePerClassColoration: boolean; - } + }; +} + +interface UpdateFillMode { + type: typeof Action.UPDATE_FILL_MODE; + payload: { + fillMode: boolean; + }; } -export type GeneralActionTypes = UpdateProjectData +export type GeneralActionTypes = + | UpdateProjectData | UpdateWindowSize | UpdateActivePopupType | UpdateCustomCursorStyle @@ -103,3 +112,4 @@ export type GeneralActionTypes = UpdateProjectData | UpdateCrossHairVisibleStatus | UpdateZoom | UpdatePerClassColoration + | UpdateFillMode; diff --git a/src/store/index.ts b/src/store/index.ts index 458650b7..e02b09f5 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,14 +1,18 @@ -import { combineReducers } from 'redux'; +import {combineReducers} from 'redux'; import {labelsReducer} from './labels/reducer'; import {generalReducer} from './general/reducer'; import {aiReducer} from './ai/reducer'; import {notificationsReducer} from './notifications/reducer'; +import {authReducer} from './auth/reducer'; +import {performanceReducer} from './performance/reducer'; export const rootReducer = combineReducers({ general: generalReducer, labels: labelsReducer, ai: aiReducer, - notifications: notificationsReducer + notifications: notificationsReducer, + auth: authReducer, + performance: performanceReducer }); export type AppState = ReturnType; diff --git a/src/store/labels/actionCreators.ts b/src/store/labels/actionCreators.ts index b66f87df..e4db86c3 100644 --- a/src/store/labels/actionCreators.ts +++ b/src/store/labels/actionCreators.ts @@ -1,22 +1,26 @@ import {LabelsActionTypes, ImageData, LabelName} from './types'; import {Action} from '../Actions'; -import {LabelType} from '../../data/enums/LabelType'; +import {LabelType, LabelModeType} from '../../data/enums/LabelType'; -export function updateActiveImageIndex(activeImageIndex: number): LabelsActionTypes { +export function updateActiveImageIndex( + activeImageIndex: number +): LabelsActionTypes { return { type: Action.UPDATE_ACTIVE_IMAGE_INDEX, payload: { - activeImageIndex, - }, + activeImageIndex + } }; } -export function updateActiveLabelNameId(activeLabelNameId: string): LabelsActionTypes { +export function updateActiveLabelNameId( + activeLabelNameId: string +): LabelsActionTypes { return { type: Action.UPDATE_ACTIVE_LABEL_NAME_ID, payload: { - activeLabelNameId, - }, + activeLabelNameId + } }; } @@ -24,36 +28,43 @@ export function updateActiveLabelId(activeLabelId: string): LabelsActionTypes { return { type: Action.UPDATE_ACTIVE_LABEL_ID, payload: { - activeLabelId, - }, + activeLabelId + } }; } -export function updateHighlightedLabelId(highlightedLabelId: string): LabelsActionTypes { +export function updateHighlightedLabelId( + highlightedLabelId: string +): LabelsActionTypes { return { type: Action.UPDATE_HIGHLIGHTED_LABEL_ID, payload: { - highlightedLabelId, - }, + highlightedLabelId + } }; } -export function updateActiveLabelType(activeLabelType: LabelType): LabelsActionTypes { +export function updateActiveLabelType( + activeLabelType: LabelType +): LabelsActionTypes { return { type: Action.UPDATE_ACTIVE_LABEL_TYPE, payload: { - activeLabelType, - }, + activeLabelType + } }; } -export function updateImageDataById(id: string, newImageData: ImageData): LabelsActionTypes { +export function updateImageDataById( + id: string, + newImageData: ImageData +): LabelsActionTypes { return { type: Action.UPDATE_IMAGE_DATA_BY_ID, payload: { id, newImageData - }, + } }; } @@ -61,8 +72,8 @@ export function addImageData(imageData: ImageData[]): LabelsActionTypes { return { type: Action.ADD_IMAGES_DATA, payload: { - imageData, - }, + imageData + } }; } @@ -70,8 +81,8 @@ export function updateImageData(imageData: ImageData[]): LabelsActionTypes { return { type: Action.UPDATE_IMAGES_DATA, payload: { - imageData, - }, + imageData + } }; } @@ -81,14 +92,101 @@ export function updateLabelNames(labels: LabelName[]): LabelsActionTypes { payload: { labels } - } + }; } -export function updateFirstLabelCreatedFlag(firstLabelCreatedFlag: boolean): LabelsActionTypes { +export function updateFirstLabelCreatedFlag( + firstLabelCreatedFlag: boolean +): LabelsActionTypes { return { type: Action.UPDATE_FIRST_LABEL_CREATED_FLAG, payload: { firstLabelCreatedFlag } - } + }; +} + +export function updateActiveLabelMode(mode: LabelModeType): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_LABEL_MODE, + payload: { + mode + } + }; +} + +export function updateActiveGender(gender: number): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_GENDER, + payload: { + gender + } + }; +} + +export function updateActiveHumanType(humanType: number): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_HUMAN_TYPE, + payload: { + humanType + } + }; +} + +export function updateActiveStyles(styles: string[]): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_STYLES, + payload: { + styles + } + }; +} + +export function updateActiveHumanID(humanId: string): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_HUMAN_ID, + payload: { + humanId + } + }; +} + +export function updateActiveMainCategory( + mainCategory: number +): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_MAIN_CATEGORY, + payload: { + mainCategory + } + }; +} + +export function updateActiveSubCategory( + subCategory: number +): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_SUB_CATEGORY, + payload: { + subCategory + } + }; +} + +export function updateActiveColor(color: number): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_COLOR, + payload: { + color + } + }; +} + +export function updateActivePattern(pattern: number): LabelsActionTypes { + return { + type: Action.UPDATE_ACTIVE_PATTERN, + payload: { + pattern + } + }; } diff --git a/src/store/labels/reducer.ts b/src/store/labels/reducer.ts index 3bd08657..93fc19f9 100644 --- a/src/store/labels/reducer.ts +++ b/src/store/labels/reducer.ts @@ -1,5 +1,12 @@ import {LabelsActionTypes, LabelsState, ImageData} from './types'; import {Action} from '../Actions'; +import {LabelModeType} from '../../data/enums/LabelType'; +import { + GENDER, + ITEM_COLOR, + ITEM_PATTERN, + SOURCE +} from '../../data/enums/ItemType'; const initialState: LabelsState = { activeImageIndex: null, @@ -9,7 +16,16 @@ const initialState: LabelsState = { highlightedLabelId: null, imagesData: [], firstLabelCreatedFlag: false, - labels: [] + labels: [], + activeLabelMode: LabelModeType.HUMAN, + activeGender: GENDER.UNKNOWN, + activeHumanType: SOURCE.UNKNOWN, + activeColor: ITEM_COLOR.UNKNOWN, + activePattern: ITEM_PATTERN.UNKNOWN, + activeStyles: [], + activeHumanID: null, + activeMainCategory: -1, + activeSubCategory: -1 }; export function labelsReducer( @@ -21,63 +37,119 @@ export function labelsReducer( return { ...state, activeImageIndex: action.payload.activeImageIndex - } + }; } case Action.UPDATE_ACTIVE_LABEL_NAME_ID: { return { ...state, activeLabelNameId: action.payload.activeLabelNameId - } + }; } case Action.UPDATE_ACTIVE_LABEL_ID: { return { ...state, activeLabelId: action.payload.activeLabelId - } + }; } case Action.UPDATE_HIGHLIGHTED_LABEL_ID: { return { ...state, highlightedLabelId: action.payload.highlightedLabelId - } + }; } case Action.UPDATE_ACTIVE_LABEL_TYPE: { return { ...state, activeLabelType: action.payload.activeLabelType - } + }; } case Action.UPDATE_IMAGE_DATA_BY_ID: { return { ...state, imagesData: state.imagesData.map((imageData: ImageData) => - imageData.id === action.payload.id ? action.payload.newImageData : imageData + imageData.id === action.payload.id + ? action.payload.newImageData + : imageData ) - } + }; } case Action.ADD_IMAGES_DATA: { return { ...state, imagesData: state.imagesData.concat(action.payload.imageData) - } + }; } case Action.UPDATE_IMAGES_DATA: { return { ...state, imagesData: action.payload.imageData - } + }; } case Action.UPDATE_LABEL_NAMES: { return { ...state, labels: action.payload.labels - } + }; } case Action.UPDATE_FIRST_LABEL_CREATED_FLAG: { return { ...state, firstLabelCreatedFlag: action.payload.firstLabelCreatedFlag - } + }; + } + case Action.UPDATE_ACTIVE_LABEL_MODE: { + return { + ...state, + activeLabelMode: action.payload.mode + }; + } + case Action.UPDATE_ACTIVE_GENDER: { + return { + ...state, + activeGender: action.payload.gender + }; + } + case Action.UPDATE_ACTIVE_HUMAN_TYPE: { + return { + ...state, + activeHumanType: action.payload.humanType + }; + } + case Action.UPDATE_ACTIVE_STYLES: { + return { + ...state, + activeStyles: action.payload.styles + }; + } + case Action.UPDATE_ACTIVE_HUMAN_ID: { + return { + ...state, + activeHumanID: action.payload.humanId + }; + } + case Action.UPDATE_ACTIVE_MAIN_CATEGORY: { + return { + ...state, + activeMainCategory: action.payload.mainCategory + }; + } + case Action.UPDATE_ACTIVE_SUB_CATEGORY: { + return { + ...state, + activeSubCategory: action.payload.subCategory + }; + } + case Action.UPDATE_ACTIVE_COLOR: { + return { + ...state, + activeColor: action.payload.color + }; + } + case Action.UPDATE_ACTIVE_PATTERN: { + return { + ...state, + activePattern: action.payload.pattern + }; } default: return state; diff --git a/src/store/labels/types.ts b/src/store/labels/types.ts index d49139df..5ec07e52 100644 --- a/src/store/labels/types.ts +++ b/src/store/labels/types.ts @@ -1,9 +1,11 @@ import {IRect} from '../../interfaces/IRect'; import {Action} from '../Actions'; -import {LabelType} from '../../data/enums/LabelType'; +import {LabelType, LabelModeType} from '../../data/enums/LabelType'; import {IPoint} from '../../interfaces/IPoint'; import {LabelStatus} from '../../data/enums/LabelStatus'; import {ILine} from '../../interfaces/ILine'; +import {GENDER} from '../../data/enums/ItemType'; +import {JSONUploadStatus} from '../../data/enums/JSONUploadStatus'; export type LabelRect = { // GENERAL @@ -11,11 +13,16 @@ export type LabelRect = { labelId: string; rect: IRect; + // Custom by mj + mode?: LabelModeType; + // AI isCreatedByAI: boolean; status: LabelStatus; suggestedLabel: string; -} + qc_status?: string; + qc_comment?: string +}; export type LabelPoint = { // GENERAL @@ -27,27 +34,54 @@ export type LabelPoint = { isCreatedByAI: boolean; status: LabelStatus; suggestedLabel: string; -} +}; export type LabelPolygon = { id: string; labelId: string; vertices: IPoint[]; -} +}; export type LabelLine = { id: string; labelId: string; - line: ILine -} + line: ILine; +}; export type LabelName = { name: string; id: string; color: string; -} +}; + +export type HumanInfo = { + uuid: string; + id: number; + gender: number; + type: number; + styles: string[]; + qc_status?: string; + qc_comment?: string +}; + +export type ItemInfo = { + uuid: string; + id: number; + humanId: string; + gender: number; + mainCategory: number; + subCategory: number; + color: number; + pattern: number; + styles: string[]; + qc_status?: string; + qc_comment?: string; +}; export type ImageData = { + image_status?: any; + qc_status? : string; + qc_comment?: string; id: string; fileData: File; loadStatus: boolean; @@ -56,13 +90,47 @@ export type ImageData = { labelLines: LabelLine[]; labelPolygons: LabelPolygon[]; labelNameIds: string[]; + humans: HumanInfo[]; + items: ItemInfo[]; + guideStyles?: {seq: string; name: string}[]; + uploadStatus?: JSONUploadStatus; // SSD isVisitedByObjectDetector: boolean; // POSE NET isVisitedByPoseDetector: boolean; -} +}; + +export type RectJSON = { + img_path: string; + writer_id: string; + version: number; + human_info: { + human_id: string; + bounding_box: { + lt_x: number; + lt_y: number; + rb_x: number; + rb_y: number; + }; + style: string[]; + qc_status?: string; + qc_comment?: string; + }[]; + item_info: { + item_id: string; + bounding_box: { + lt_x: number; + lt_y: number; + rb_x: number; + rb_y: number; + }; + style: string[]; + qc_status?: string; + qc_comment?: string; + }[]; +}; export type LabelsState = { activeImageIndex: number; @@ -73,41 +141,50 @@ export type LabelsState = { imagesData: ImageData[]; firstLabelCreatedFlag: boolean; labels: LabelName[]; -} + activeLabelMode: LabelModeType; + activeGender: number; + activeHumanType: number; + activeStyles?: string[]; + activeHumanID?: string; + activeMainCategory?: number; + activeSubCategory?: number; + activeColor?: number; + activePattern?: number; +}; interface UpdateActiveImageIndex { type: typeof Action.UPDATE_ACTIVE_IMAGE_INDEX; payload: { activeImageIndex: number; - } + }; } interface UpdateActiveLabelNameId { type: typeof Action.UPDATE_ACTIVE_LABEL_NAME_ID; payload: { activeLabelNameId: string; - } + }; } interface UpdateActiveLabelId { type: typeof Action.UPDATE_ACTIVE_LABEL_ID; payload: { activeLabelId: string; - } + }; } interface UpdateHighlightedLabelId { type: typeof Action.UPDATE_HIGHLIGHTED_LABEL_ID; payload: { highlightedLabelId: string; - } + }; } interface UpdateActiveLabelType { type: typeof Action.UPDATE_ACTIVE_LABEL_TYPE; payload: { activeLabelType: LabelType; - } + }; } interface UpdateImageDataById { @@ -115,38 +192,102 @@ interface UpdateImageDataById { payload: { id: string; newImageData: ImageData; - } + }; } interface AddImageData { type: typeof Action.ADD_IMAGES_DATA; payload: { imageData: ImageData[]; - } + }; } interface UpdateImageData { type: typeof Action.UPDATE_IMAGES_DATA; payload: { imageData: ImageData[]; - } + }; } interface UpdateLabelNames { type: typeof Action.UPDATE_LABEL_NAMES; payload: { labels: LabelName[]; - } + }; } interface UpdateFirstLabelCreatedFlag { type: typeof Action.UPDATE_FIRST_LABEL_CREATED_FLAG; payload: { firstLabelCreatedFlag: boolean; - } + }; +} + +interface UpdateActiveLabelMode { + type: typeof Action.UPDATE_ACTIVE_LABEL_MODE; + payload: { + mode: LabelModeType; + }; +} + +interface UpdateActiveGender { + type: typeof Action.UPDATE_ACTIVE_GENDER; + payload: { + gender: number; + }; +} + +interface UpdateActiveHumanType { + type: typeof Action.UPDATE_ACTIVE_HUMAN_TYPE; + payload: { + humanType: number; + }; } -export type LabelsActionTypes = UpdateActiveImageIndex +interface UpdateActiveStyles { + type: typeof Action.UPDATE_ACTIVE_STYLES; + payload: { + styles: string[]; + }; +} + +interface UpdateActiveHumanID { + type: typeof Action.UPDATE_ACTIVE_HUMAN_ID; + payload: { + humanId: string; + }; +} + +interface UpdateActiveMainCategory { + type: typeof Action.UPDATE_ACTIVE_MAIN_CATEGORY; + payload: { + mainCategory: number; + }; +} + +interface UpdateActiveSubCategory { + type: typeof Action.UPDATE_ACTIVE_SUB_CATEGORY; + payload: { + subCategory: number; + }; +} + +interface UpdateActiveColor { + type: typeof Action.UPDATE_ACTIVE_COLOR; + payload: { + color: number; + }; +} + +interface UpdateActivePattern { + type: typeof Action.UPDATE_ACTIVE_PATTERN; + payload: { + pattern: number; + }; +} + +export type LabelsActionTypes = + | UpdateActiveImageIndex | UpdateActiveLabelNameId | UpdateActiveLabelType | UpdateImageDataById @@ -156,4 +297,12 @@ export type LabelsActionTypes = UpdateActiveImageIndex | UpdateActiveLabelId | UpdateHighlightedLabelId | UpdateFirstLabelCreatedFlag - + | UpdateActiveLabelMode + | UpdateActiveGender + | UpdateActiveHumanType + | UpdateActiveStyles + | UpdateActiveHumanID + | UpdateActiveMainCategory + | UpdateActiveSubCategory + | UpdateActiveColor + | UpdateActivePattern; diff --git a/src/store/performance/actionCreators.ts b/src/store/performance/actionCreators.ts new file mode 100644 index 00000000..5738beca --- /dev/null +++ b/src/store/performance/actionCreators.ts @@ -0,0 +1,29 @@ +import {Action} from '../Actions'; +import {CommonSummary, Task, TaskStatus} from './types'; + +export function updateTaskStatus(taskStatus: TaskStatus) { + return { + type: Action.UPDATE_TASK_STATUS_DATA, + payload: { + taskStatus + } + }; +} + +export function updateTasks(tasks: Task[]) { + return { + type: Action.UPDATE_TASKS_DATA, + payload: { + tasks + } + }; +} + +export function updateCommonSummary(commonSummary: CommonSummary) { + return { + type: Action.UPDATE_COMMON_SUMMARY_DATA, + payload: { + commonSummary + } + }; +} diff --git a/src/store/performance/reducer.ts b/src/store/performance/reducer.ts new file mode 100644 index 00000000..0d4312b3 --- /dev/null +++ b/src/store/performance/reducer.ts @@ -0,0 +1,56 @@ +import {Action} from 'store/Actions'; +import {PerformanceActionTypes, PerformanceState} from './types'; + +const initialState: PerformanceState = { + taskStatus: { + averageTPD: 0, + currentAverageTPD: 0, + highestRanker: { + displayName: '', + tpd: 0 + }, + me: { + displayName: '', + tpd: 0 + } + }, + tasks: [], + commonSummary: { + images: { + total: 0, + labeled: 0, + unchecked: 0, + waitingQC: 0, + passed: 0, + rejected: 0 + } + } +}; + +export function performanceReducer( + state = initialState, + action: PerformanceActionTypes +): PerformanceState { + switch (action.type) { + case Action.UPDATE_TASK_STATUS_DATA: { + return { + ...state, + taskStatus: action.payload.taskStatus + }; + } + case Action.UPDATE_TASKS_DATA: { + return { + ...state, + tasks: action.payload.tasks + }; + } + case Action.UPDATE_COMMON_SUMMARY_DATA: { + return { + ...state, + commonSummary: action.payload.commonSummary + }; + } + default: + return state; + } +} diff --git a/src/store/performance/types.ts b/src/store/performance/types.ts new file mode 100644 index 00000000..fba70ccf --- /dev/null +++ b/src/store/performance/types.ts @@ -0,0 +1,68 @@ +import {Action} from '../Actions'; + +export type PerformanceState = { + taskStatus: TaskStatus; + tasks: Task[]; + commonSummary: CommonSummary; +}; + +export type TaskStatus = { + averageTPD: number; + currentAverageTPD: number; + highestRanker: { + displayName: string; + tpd: number; + }; + me: { + displayName: string; + tpd: number; + }; +}; + +export type Task = { + name: string; + imagesTPD: number; + imagesTPH: number; + averageTimePerImage: number; + labeledTPD: number; + labeledTPH: number; + averageTimePerLabeled: number; + note?: string; +}; + +export type CommonSummary = { + images: { + total: number; + labeled: number; + unchecked: number; + waitingQC: number; + passed: number; + rejected: number; + }; +}; + +interface UpdateTaskStatusData { + type: typeof Action.UPDATE_TASK_STATUS_DATA; + payload: { + taskStatus: TaskStatus; + }; +} + +interface UpdateTasksData { + type: typeof Action.UPDATE_TASKS_DATA; + payload: { + tasks: Task[]; + }; +} + +interface UpdateCommonSummaryData { + type: typeof Action.UPDATE_COMMON_SUMMARY_DATA; + payload: { + commonSummary: CommonSummary; + }; +} + +export type PerformanceActionTypes = + | UpdateTaskStatusData + | UpdateTasksData + | UpdateCommonSummaryData; diff --git a/src/store/selectors/AuthSelector.ts b/src/store/selectors/AuthSelector.ts new file mode 100644 index 00000000..7ecae7a7 --- /dev/null +++ b/src/store/selectors/AuthSelector.ts @@ -0,0 +1,14 @@ +import {store} from '../..'; +import {AuthData} from '../auth/types'; + +export class AuthSelector { + public static getToken(): string { + return store.getState().auth.authData.authToken; + } + public static getAuthData(): AuthData { + return store.getState().auth.authData; + } + public static getUserID(): string { + return store.getState().auth.authData.email; + } +} diff --git a/src/store/selectors/GeneralSelector.ts b/src/store/selectors/GeneralSelector.ts index e7d066ce..58b657b7 100644 --- a/src/store/selectors/GeneralSelector.ts +++ b/src/store/selectors/GeneralSelector.ts @@ -42,6 +42,10 @@ export class GeneralSelector { } public static getEnablePerClassColorationStatus(): boolean { - return store.getState().general.enablePerClassColoration + return store.getState().general.enablePerClassColoration; + } + + public static getFillMode(): boolean { + return store.getState().general.fillMode; } } diff --git a/src/store/selectors/LabelsSelector.ts b/src/store/selectors/LabelsSelector.ts index a1549452..f48e7c3d 100644 --- a/src/store/selectors/LabelsSelector.ts +++ b/src/store/selectors/LabelsSelector.ts @@ -1,7 +1,14 @@ import {store} from '../..'; -import {ImageData, LabelLine, LabelName, LabelPoint, LabelPolygon, LabelRect} from '../labels/types'; +import { + ImageData, + LabelLine, + LabelName, + LabelPoint, + LabelPolygon, + LabelRect +} from '../labels/types'; import {find} from 'lodash'; -import {LabelType} from '../../data/enums/LabelType'; +import {LabelType, LabelModeType} from '../../data/enums/LabelType'; export class LabelsSelector { public static getLabelNames(): LabelName[] { @@ -9,7 +16,7 @@ export class LabelsSelector { } public static getLabelNameById(id: string): LabelName | undefined { - const labelName: LabelName[] = LabelsSelector.getLabelNames() + const labelName: LabelName[] = LabelsSelector.getLabelNames(); return find(labelName, {id}); } @@ -30,10 +37,10 @@ export class LabelsSelector { } public static getActiveImageData(): ImageData | null { - const activeImageIndex: number | null = LabelsSelector.getActiveImageIndex(); + const activeImageIndex: number | null = + LabelsSelector.getActiveImageIndex(); - if (activeImageIndex === null) - return null; + if (activeImageIndex === null) return null; return LabelsSelector.getImageDataByIndex(activeImageIndex); } @@ -59,36 +66,69 @@ export class LabelsSelector { public static getActiveRectLabel(): LabelRect | null { const activeLabelId: string | null = LabelsSelector.getActiveLabelId(); - if (activeLabelId === null) - return null; + if (activeLabelId === null) return null; - return find(LabelsSelector.getActiveImageData().labelRects, {id: activeLabelId}); + return find(LabelsSelector.getActiveImageData().labelRects, { + id: activeLabelId + }); } public static getActivePointLabel(): LabelPoint | null { const activeLabelId: string | null = LabelsSelector.getActiveLabelId(); - if (activeLabelId === null) - return null; + if (activeLabelId === null) return null; - return find(LabelsSelector.getActiveImageData().labelPoints, {id: activeLabelId}); + return find(LabelsSelector.getActiveImageData().labelPoints, { + id: activeLabelId + }); } public static getActivePolygonLabel(): LabelPolygon | null { const activeLabelId: string | null = LabelsSelector.getActiveLabelId(); - if (activeLabelId === null) - return null; + if (activeLabelId === null) return null; - return find(LabelsSelector.getActiveImageData().labelPolygons, {id: activeLabelId}); + return find(LabelsSelector.getActiveImageData().labelPolygons, { + id: activeLabelId + }); } public static getActiveLineLabel(): LabelLine | null { const activeLabelId: string | null = LabelsSelector.getActiveLabelId(); - if (activeLabelId === null) - return null; + if (activeLabelId === null) return null; - return find(LabelsSelector.getActiveImageData().labelLines, {id: activeLabelId}); + return find(LabelsSelector.getActiveImageData().labelLines, { + id: activeLabelId + }); + } + + public static getActiveLabelMode(): LabelModeType | null { + return store.getState().labels.activeLabelMode; + } + + public static getActiveGender(): number | null { + return store.getState().labels.activeGender; + } + public static getActiveHumanType(): number | null { + return store.getState().labels.activeHumanType; + } + public static getActiveStyles(): string[] | null { + return store.getState().labels.activeStyles; + } + public static getActiveHumanID(): string | null { + return store.getState().labels.activeHumanID; + } + public static getActiveMainCategory(): number | null { + return store.getState().labels.activeMainCategory; + } + public static getActiveSubCategory(): number | null { + return store.getState().labels.activeSubCategory; + } + public static getActiveColor(): number | null { + return store.getState().labels.activeColor; + } + public static getActivePattern(): number | null { + return store.getState().labels.activePattern; } } diff --git a/src/utils/FileUtil.ts b/src/utils/FileUtil.ts index 0a4613df..e803fcab 100644 --- a/src/utils/FileUtil.ts +++ b/src/utils/FileUtil.ts @@ -1,19 +1,29 @@ export class FileUtil { + public static loadImageFromURL(url: string): Promise { + return new Promise((resolve, reject) => { + const image = new Image(); + image.src = url; + image.onload = () => resolve(image); + image.onerror = reject; + }); + } + public static loadImage(fileData: File): Promise { - return new Promise((resolve, reject) => { - const url = URL.createObjectURL(fileData); + return new Promise((resolve, reject) => { + const url = URL.createObjectURL(fileData); const image = new Image(); - image.src = url; - image.onload = () => resolve(image); - image.onerror = reject; - }) + image.src = url; + image.onload = () => resolve(image); + image.onerror = reject; + }); } public static loadImages(fileData: File[]): Promise { return new Promise((resolve, reject) => { - const promises: Promise[] = fileData.map((fileData: File) => FileUtil.loadImage(fileData)) - Promise - .all(promises) + const promises: Promise[] = fileData.map( + (fileData: File) => FileUtil.loadImage(fileData) + ); + Promise.all(promises) .then((values: HTMLImageElement[]) => resolve(values)) .catch((error) => reject(error)); }); @@ -27,30 +37,31 @@ export class FileUtil { }; reader.onerror = reject; reader.readAsText(fileData); - }) + }); } public static readFiles(fileData: File[]): Promise { return new Promise((resolve, reject) => { - const promises: Promise[] = fileData.map((fileData: File) => FileUtil.readFile(fileData)) - Promise - .all(promises) + const promises: Promise[] = fileData.map((fileData: File) => + FileUtil.readFile(fileData) + ); + Promise.all(promises) .then((values: string[]) => resolve(values)) .catch((error) => reject(error)); }); } public static extractFileExtension(name: string): string | null { - const parts = name.split("."); + const parts = name.split('.'); return parts.length > 1 ? parts[parts.length - 1] : null; } public static extractFileName(name: string): string | null { - const splitPath = name.split("."); - let fName = ""; - for(const idx of Array(splitPath.length - 1).keys()){ - if(fName === "") fName += splitPath[idx]; - else fName += "." + splitPath[idx]; + const splitPath = name.split('.'); + let fName = ''; + for (const idx of Array(splitPath.length - 1).keys()) { + if (fName === '') fName += splitPath[idx]; + else fName += '.' + splitPath[idx]; } return fName; } diff --git a/src/utils/ImageDataUtil.ts b/src/utils/ImageDataUtil.ts index 0881a692..7a7a0582 100644 --- a/src/utils/ImageDataUtil.ts +++ b/src/utils/ImageDataUtil.ts @@ -1,7 +1,9 @@ import {ImageData} from '../store/labels/types'; -import { v4 as uuidv4 } from 'uuid'; +import {v4 as uuidv4} from 'uuid'; import {FileUtil} from './FileUtil'; import {ImageRepository} from '../logic/imageRepository/ImageRepository'; +import {APIImageData} from '../services/types'; +import {MJImporter} from '../logic/import/MJ/MJImporter'; export class ImageDataUtil { public static createImageDataFromFileData(fileData: File): ImageData { @@ -15,8 +17,40 @@ export class ImageDataUtil { labelPolygons: [], labelNameIds: [], isVisitedByObjectDetector: false, - isVisitedByPoseDetector: false - } + isVisitedByPoseDetector: false, + humans: [], + items: [], + image_status: "" + }; + } + public static createImageDataFromAPIData(apiData: APIImageData): ImageData { + + const data: ImageData = { + id: apiData.image_id, + fileData: { + //@ts-ignore + path: apiData.image_url, + width: parseInt(apiData.image_width), + height: parseInt(apiData.image_height) + }, + loadStatus: false, + labelRects: [], + labelPoints: [], + labelLines: [], + labelPolygons: [], + labelNameIds: [], + isVisitedByObjectDetector: false, + isVisitedByPoseDetector: false, + humans: [], + items: [], + guideStyles: apiData.style_list, + image_status: apiData.image_status || "" + }; + + // if labeling_json data is available, apply annotations + return apiData.labeling_json + ? MJImporter.applyAnnotations(data, apiData.labeling_json, []) + : data; } public static cleanAnnotations(item: ImageData): ImageData { @@ -26,24 +60,36 @@ export class ImageDataUtil { labelPoints: [], labelLines: [], labelPolygons: [], - labelNameIds: [] - } + labelNameIds: [], + humans: [], + items: [] + }; } - public static arrange(items: ImageData[], idArrangement: string[]): ImageData[] { + public static arrange( + items: ImageData[], + idArrangement: string[] + ): ImageData[] { return items.sort((a: ImageData, b: ImageData) => { - return idArrangement.indexOf(a.id) - idArrangement.indexOf(b.id) - }) + return idArrangement.indexOf(a.id) - idArrangement.indexOf(b.id); + }); } public static loadMissingImages(images: ImageData[]): Promise { return new Promise((resolve, reject) => { - const missingImages = images.filter((i: ImageData) => !i.loadStatus); - const missingImagesFiles = missingImages.map((i: ImageData) => i.fileData); + const missingImages = images.filter( + (i: ImageData) => !i.loadStatus + ); + const missingImagesFiles = missingImages.map( + (i: ImageData) => i.fileData + ); FileUtil.loadImages(missingImagesFiles) - .then((htmlImageElements:HTMLImageElement[]) => { - ImageRepository.storeImages(missingImages.map((i: ImageData) => i.id), htmlImageElements); - resolve() + .then((htmlImageElements: HTMLImageElement[]) => { + ImageRepository.storeImages( + missingImages.map((i: ImageData) => i.id), + htmlImageElements + ); + resolve(); }) .catch((error: Error) => reject(error)); }); diff --git a/src/utils/LabelUtil.ts b/src/utils/LabelUtil.ts index ef5c483a..79978f10 100644 --- a/src/utils/LabelUtil.ts +++ b/src/utils/LabelUtil.ts @@ -1,11 +1,17 @@ -import {LabelName, LabelPolygon, LabelRect} from '../store/labels/types'; -import { v4 as uuidv4 } from 'uuid'; +import { + HumanInfo, + LabelName, + LabelPolygon, + LabelRect +} from '../store/labels/types'; +import {v4 as uuidv4} from 'uuid'; import {find} from 'lodash'; import {IRect} from '../interfaces/IRect'; import {LabelStatus} from '../data/enums/LabelStatus'; import {IPoint} from '../interfaces/IPoint'; -import { sample } from 'lodash'; +import {sample} from 'lodash'; import {Settings} from '../settings/Settings'; +import {LabelsSelector} from '../store/selectors/LabelsSelector'; export class LabelUtil { public static createLabelName(name: string): LabelName { @@ -13,7 +19,7 @@ export class LabelUtil { id: uuidv4(), name, color: sample(Settings.LABEL_COLORS_PALETTE) - } + }; } public static createLabelRect(labelId: string, rect: IRect): LabelRect { @@ -23,24 +29,35 @@ export class LabelUtil { rect, isCreatedByAI: false, status: LabelStatus.ACCEPTED, - suggestedLabel: null - } + suggestedLabel: null, + mode: LabelsSelector.getActiveLabelMode(), + + }; } - public static createLabelPolygon(labelId: string, vertices: IPoint[]): LabelPolygon { + public static createLabelPolygon( + labelId: string, + vertices: IPoint[] + ): LabelPolygon { return { id: uuidv4(), labelId, vertices - } + }; } - public static labelNamesIdsDiff(oldLabelNames: LabelName[], newLabelNames: LabelName[]): string[] { - return oldLabelNames.reduce((missingIds: string[], labelName: LabelName) => { - if (!find(newLabelNames, { 'id': labelName.id })) { - missingIds.push(labelName.id); - } - return missingIds - }, []) + public static labelNamesIdsDiff( + oldLabelNames: LabelName[], + newLabelNames: LabelName[] + ): string[] { + return oldLabelNames.reduce( + (missingIds: string[], labelName: LabelName) => { + if (!find(newLabelNames, {id: labelName.id})) { + missingIds.push(labelName.id); + } + return missingIds; + }, + [] + ); } } diff --git a/src/utils/RenderEngineUtil.ts b/src/utils/RenderEngineUtil.ts index dd9d1231..ad87f3bc 100644 --- a/src/utils/RenderEngineUtil.ts +++ b/src/utils/RenderEngineUtil.ts @@ -1,14 +1,14 @@ -import {EditorData} from "../data/EditorData"; -import {RectUtil} from "./RectUtil"; -import {store} from "../index"; -import {CustomCursorStyle} from "../data/enums/CustomCursorStyle"; -import {updateCustomCursorStyle} from "../store/general/actionCreators"; -import {IPoint} from "../interfaces/IPoint"; -import {PointUtil} from "./PointUtil"; -import {IRect} from "../interfaces/IRect"; -import {ILine} from "../interfaces/ILine"; -import {LineUtil} from "./LineUtil"; -import {ISize} from "../interfaces/ISize"; +import {EditorData} from '../data/EditorData'; +import {RectUtil} from './RectUtil'; +import {store} from '../index'; +import {CustomCursorStyle} from '../data/enums/CustomCursorStyle'; +import {updateCustomCursorStyle} from '../store/general/actionCreators'; +import {IPoint} from '../interfaces/IPoint'; +import {PointUtil} from './PointUtil'; +import {IRect} from '../interfaces/IRect'; +import {ILine} from '../interfaces/ILine'; +import {LineUtil} from './LineUtil'; +import {ISize} from '../interfaces/ISize'; export class RenderEngineUtil { public static calculateImageScale(data: EditorData): number { @@ -16,62 +16,128 @@ export class RenderEngineUtil { } public static isMouseOverImage(data: EditorData): boolean { - return RectUtil.isPointInside(data.viewPortContentImageRect, data.mousePositionOnViewPortContent); + return RectUtil.isPointInside( + data.viewPortContentImageRect, + data.mousePositionOnViewPortContent + ); } public static isMouseOverCanvas(data: EditorData): boolean { - return RectUtil.isPointInside({x: 0, y: 0, ...data.viewPortContentSize}, data.mousePositionOnViewPortContent); + return RectUtil.isPointInside( + {x: 0, y: 0, ...data.viewPortContentSize}, + data.mousePositionOnViewPortContent + ); } - public static transferPointFromImageToViewPortContent(point: IPoint, data: EditorData): IPoint { + public static transferPointFromImageToViewPortContent( + point: IPoint, + data: EditorData + ): IPoint { const scale = RenderEngineUtil.calculateImageScale(data); - return PointUtil.add(PointUtil.multiply(point, 1/scale), data.viewPortContentImageRect); - } - - public static transferPolygonFromImageToViewPortContent(polygon: IPoint[], data: EditorData): IPoint[] { - return polygon.map((point: IPoint) => RenderEngineUtil.transferPointFromImageToViewPortContent(point, data)); - } - - public static transferLineFromImageToViewPortContent(line: ILine, data: EditorData): ILine { + return PointUtil.add( + PointUtil.multiply(point, 1 / scale), + data.viewPortContentImageRect + ); + } + + public static transferPolygonFromImageToViewPortContent( + polygon: IPoint[], + data: EditorData + ): IPoint[] { + return polygon.map((point: IPoint) => + RenderEngineUtil.transferPointFromImageToViewPortContent( + point, + data + ) + ); + } + + public static transferLineFromImageToViewPortContent( + line: ILine, + data: EditorData + ): ILine { return { - start: RenderEngineUtil.transferPointFromImageToViewPortContent(line.start, data), - end: RenderEngineUtil.transferPointFromImageToViewPortContent(line.end, data) - } + start: RenderEngineUtil.transferPointFromImageToViewPortContent( + line.start, + data + ), + end: RenderEngineUtil.transferPointFromImageToViewPortContent( + line.end, + data + ) + }; } - public static transferPointFromViewPortContentToImage(point: IPoint, data: EditorData): IPoint { + public static transferPointFromViewPortContentToImage( + point: IPoint, + data: EditorData + ): IPoint { const scale = RenderEngineUtil.calculateImageScale(data); - return PointUtil.multiply(PointUtil.subtract(point, data.viewPortContentImageRect), scale); - } - - public static transferPolygonFromViewPortContentToImage(polygon: IPoint[], data: EditorData): IPoint[] { - return polygon.map((point: IPoint) => RenderEngineUtil.transferPointFromViewPortContentToImage(point, data)); - } - - public static transferLineFromViewPortContentToImage(line: ILine, data: EditorData): ILine { + return PointUtil.multiply( + PointUtil.subtract(point, data.viewPortContentImageRect), + scale + ); + } + + public static transferPolygonFromViewPortContentToImage( + polygon: IPoint[], + data: EditorData + ): IPoint[] { + return polygon.map((point: IPoint) => + RenderEngineUtil.transferPointFromViewPortContentToImage( + point, + data + ) + ); + } + + public static transferLineFromViewPortContentToImage( + line: ILine, + data: EditorData + ): ILine { return { - start: RenderEngineUtil.transferPointFromViewPortContentToImage(line.start, data), - end: RenderEngineUtil.transferPointFromViewPortContentToImage(line.end, data) - } + start: RenderEngineUtil.transferPointFromViewPortContentToImage( + line.start, + data + ), + end: RenderEngineUtil.transferPointFromViewPortContentToImage( + line.end, + data + ) + }; } - public static transferRectFromViewPortContentToImage(rect: IRect, data: EditorData): IRect { + public static transferRectFromViewPortContentToImage( + rect: IRect, + data: EditorData + ): IRect { const scale = RenderEngineUtil.calculateImageScale(data); - return RectUtil.translate(RectUtil.scaleRect(rect, 1/scale), data.viewPortContentImageRect); + return RectUtil.translate( + RectUtil.scaleRect(rect, 1 / scale), + data.viewPortContentImageRect + ); } - public static transferRectFromImageToViewPortContent(rect: IRect, data: EditorData): IRect { + public static transferRectFromImageToViewPortContent( + rect: IRect, + data: EditorData + ): IRect { const scale = RenderEngineUtil.calculateImageScale(data); const translation: IPoint = { - x: - data.viewPortContentImageRect.x, - y: - data.viewPortContentImageRect.y + x: -data.viewPortContentImageRect.x, + y: -data.viewPortContentImageRect.y }; return RectUtil.scaleRect(RectUtil.translate(rect, translation), scale); } public static wrapDefaultCursorStyleInCancel(data: EditorData) { - if (RectUtil.isPointInside(data.viewPortContentImageRect, data.mousePositionOnViewPortContent)) { + if ( + RectUtil.isPointInside( + data.viewPortContentImageRect, + data.mousePositionOnViewPortContent + ) + ) { store.dispatch(updateCustomCursorStyle(CustomCursorStyle.DEFAULT)); } else { store.dispatch(updateCustomCursorStyle(CustomCursorStyle.CANCEL)); @@ -86,7 +152,7 @@ export class RenderEngineUtil { return { x: RenderEngineUtil.setValueBetweenPixels(point.x), y: RenderEngineUtil.setValueBetweenPixels(point.y) - } + }; } public static setRectBetweenPixels(rect: IRect): IRect { @@ -98,29 +164,46 @@ export class RenderEngineUtil { x: rect.x + rect.width, y: rect.y + rect.height }; - const topLeftBetweenPixels = RenderEngineUtil.setPointBetweenPixels(topLeft); - const bottomRightBetweenPixels = RenderEngineUtil.setPointBetweenPixels(bottomRight); + const topLeftBetweenPixels = + RenderEngineUtil.setPointBetweenPixels(topLeft); + const bottomRightBetweenPixels = + RenderEngineUtil.setPointBetweenPixels(bottomRight); return { x: topLeftBetweenPixels.x, y: topLeftBetweenPixels.y, width: bottomRightBetweenPixels.x - topLeftBetweenPixels.x, height: bottomRightBetweenPixels.y - topLeftBetweenPixels.y - } + }; } - public static isMouseOverLine(mouse: IPoint, l: ILine, radius: number): boolean { + public static isMouseOverLine( + mouse: IPoint, + l: ILine, + radius: number + ): boolean { const minX: number = Math.min(l.start.x, l.end.x); const maxX: number = Math.max(l.start.x, l.end.x); const minY: number = Math.min(l.start.y, l.end.y); const maxY: number = Math.max(l.start.y, l.end.y); - return (minX - radius <= mouse.x && maxX + radius >= mouse.x) && - (minY - radius <= mouse.y && maxY + radius >= mouse.y) && - LineUtil.getDistanceFromLine(l, mouse) < radius; + return ( + minX - radius <= mouse.x && + maxX + radius >= mouse.x && + minY - radius <= mouse.y && + maxY + radius >= mouse.y && + LineUtil.getDistanceFromLine(l, mouse) < radius + ); } - public static isMouseOverAnchor(mouse: IPoint, anchor: IPoint, size: ISize): boolean { + public static isMouseOverAnchor( + mouse: IPoint, + anchor: IPoint, + size: ISize + ): boolean { if (!mouse || !anchor) return null; - return RectUtil.isPointInside(RectUtil.getRectWithCenterAndSize(anchor, size), mouse); + return RectUtil.isPointInside( + RectUtil.getRectWithCenterAndSize(anchor, size), + mouse + ); } -} \ No newline at end of file +} diff --git a/src/utils/URIUtil.ts b/src/utils/URIUtil.ts new file mode 100644 index 00000000..67eb72eb --- /dev/null +++ b/src/utils/URIUtil.ts @@ -0,0 +1,58 @@ +export class URIUtil { + public static loadImage(uri: string): Promise { + return new Promise((resolve, reject) => { + const image = new Image(); + image.src = uri; + image.onload = () => resolve(image); + image.onerror = reject; + }); + } + + public static loadImages(fileData: File[]): Promise { + return new Promise((resolve, reject) => { + const promises: Promise[] = fileData.map( + //@ts-ignore + (fileData: File) => URIUtil.loadImage(fileData.path) + ); + Promise.all(promises) + .then((values: HTMLImageElement[]) => resolve(values)) + .catch((error) => reject(error)); + }); + } + + // public static readFile(fileData: File): Promise { + // return new Promise((resolve, reject) => { + // let reader = new FileReader(); + // reader.onloadend = (event: any) => { + // resolve(event.target.result); + // }; + // reader.onerror = reject; + // reader.readAsText(fileData); + // }) + // } + + // public static readFiles(fileData: File[]): Promise { + // return new Promise((resolve, reject) => { + // const promises: Promise[] = fileData.map((fileData: File) => FileUtil.readFile(fileData)) + // Promise + // .all(promises) + // .then((values: string[]) => resolve(values)) + // .catch((error) => reject(error)); + // }); + // } + + // public static extractFileExtension(name: string): string | null { + // const parts = name.split("."); + // return parts.length > 1 ? parts[parts.length - 1] : null; + // } + + // public static extractFileName(name: string): string | null { + // const splitPath = name.split("."); + // let fName = ""; + // for(const idx of Array(splitPath.length - 1).keys()){ + // if(fName === "") fName += splitPath[idx]; + // else fName += "." + splitPath[idx]; + // } + // return fName; + // } +} diff --git a/src/views/Common/AttributeSelect/AttributeSelect.scss b/src/views/Common/AttributeSelect/AttributeSelect.scss new file mode 100644 index 00000000..b9c94da7 --- /dev/null +++ b/src/views/Common/AttributeSelect/AttributeSelect.scss @@ -0,0 +1,14 @@ +.AttributeSelect { + display: flex; +} + +.IconItem { + display: flex; + flex: 1; + // justify-content: center; + align-items: center; + + .ItemTitle { + margin-left: 1em; + } +} diff --git a/src/views/Common/AttributeSelect/AttributeSelect.tsx b/src/views/Common/AttributeSelect/AttributeSelect.tsx new file mode 100644 index 00000000..29fceb89 --- /dev/null +++ b/src/views/Common/AttributeSelect/AttributeSelect.tsx @@ -0,0 +1,333 @@ +import * as React from 'react'; +import './AttributeSelect.scss'; +import classNames from 'classnames'; +import { + ATTRIBUTE_TYPE, + FASHION_STYLE, + FASHION_STYLE_CODE_FOR_MAN, + FASHION_STYLE_MAN, + FASHION_STYLE_WOMAN, + GENDER, + GENDER_CODE, + ITEM_CATEGORY, + ITEM_COLOR, + ITEM_PATTERN, + MAIN_CATEGORY_CODE, + SOURCE, + SOURCE_CODE, + SUB_CATEGORY_CODE +} from '../../../data/enums/ItemType'; +import Select from 'react-select'; +import {LabelsSelector} from '../../../store/selectors/LabelsSelector'; +import {vi as lang} from '../../../lang'; +import {Settings} from '../../../settings/Settings'; +import _ from 'lodash'; + +interface IProps { + key?: string; + type: ATTRIBUTE_TYPE; + value?: any; + onSelect: (selectedItem: any, type: ATTRIBUTE_TYPE) => any; + style?: React.CSSProperties; + isActive?: boolean; + isDisabled?: boolean; + externalClassName?: string; + mainCategory?: number; + gender?: number; + isMulti?: boolean; + setPreview?: (url: string) => any; +} + +export const AttributeSelect = (props: IProps) => { + const { + key, + type, + value, + onSelect, + style, + isActive, + isDisabled, + externalClassName, + mainCategory, + gender, + isMulti, + setPreview + } = props; + + const getClassNamesName = () => { + return classNames('AttributeSelect', externalClassName, { + active: isActive, + disabled: isDisabled + }); + }; + + const renderItem = (item: {url: string; title: string}) => { + const {url, title} = item; + return ( +
setPreview(url.replace('_s.png', '.png'))} + onMouseLeave={() => setPreview(null)}> + + {title} +
+ ); + }; + + const renderGenderItem = (gender: number) => { + const genderCode = GENDER_CODE[gender.toString()]; + const url = + gender === GENDER.UNKNOWN + ? Settings.UNKNOWN_URL + : `guides/icons/genders/${gender}_s.png`; + return { + value: gender, + label: renderItem({ + url, + title: `${lang.GENDER[genderCode]} (${genderCode})` + }) + }; + }; + + const renderSourceItem = (source: number) => { + const sourceCode = SOURCE_CODE[source.toString()]; + const url = + source === SOURCE.UNKNOWN + ? Settings.UNKNOWN_URL + : `guides/icons/sources/${source}_s.png`; + return { + value: source, + label: renderItem({ + url, + title: `${lang.SOURCE[sourceCode]} (${sourceCode})` + }) + }; + }; + + const renderMainCategory = (mainCategory: any) => { + const index = Object.values(MAIN_CATEGORY_CODE).indexOf(mainCategory); + const mainCategoryCode = Object.keys(MAIN_CATEGORY_CODE)[index]; + const url = + mainCategory === MAIN_CATEGORY_CODE.UNKNOWN + ? Settings.UNKNOWN_URL + : `guides/icons/main_cats/${mainCategory}_s.png`; + return { + value: mainCategory, + label: renderItem({ + url, + title: `${lang.MAIN_CATEGORY[mainCategoryCode]} (${mainCategoryCode})` + }) + }; + }; + + const renderSubCategory = (subCategory: any) => { + const index = Object.values(SUB_CATEGORY_CODE).indexOf(subCategory); + const subCategoryCode = Object.keys(SUB_CATEGORY_CODE)[index]; + const url = + subCategory === SUB_CATEGORY_CODE.UNKNOWN + ? Settings.UNKNOWN_URL + : `guides/icons/sub_cats/${subCategory}_s.png`; + + return { + value: subCategory, + label: renderItem({ + url, + title: `${lang.SUB_CATEGORY[subCategoryCode]} (${subCategoryCode})` + }) + }; + }; + + const renderColor = (color: any) => { + const index = Object.values(ITEM_COLOR).indexOf(color); + const colorCode = Object.keys(ITEM_COLOR)[index]; + const url = + color === ITEM_COLOR.UNKNOWN + ? Settings.UNKNOWN_URL + : `guides/icons/colors/${color}_s.png`; + + return { + value: color, + label: renderItem({ + url, + title: `${lang.ITEM_COLOR[colorCode]} (${colorCode})` + }) + }; + }; + + const renderPattern = (pattern: any) => { + const index = Object.values(ITEM_PATTERN).indexOf(pattern); + const patternCode = Object.keys(ITEM_PATTERN)[index]; + const url = + pattern === ITEM_PATTERN.UNKNOWN + ? Settings.UNKNOWN_URL + : `guides/icons/patterns/${pattern}_s.png`; + + return { + value: pattern, + label: renderItem({ + url, + title: `${lang.ITEM_PATTERN[patternCode]} (${patternCode})` + }) + }; + }; + + const renderStyle = (style: any) => { + const url = + style.seq === -1 + ? Settings.UNKNOWN_URL + : gender === GENDER.MAN + ? `guides/icons/man_style/${style.m}_s.png` + : `guides/icons/woman_style/${style.f}_s.png`; + + return { + value: style.name.toUpperCase(), + label: renderItem({ + url, + title: `${lang.FASHION_STYLE[style.slug]} (${style.slug})` + }) + }; + }; + + const renderHumanId = (uuid: any) => { + const imageData = LabelsSelector.getActiveImageData(); + const index = _.findIndex(imageData.humans, {uuid}); + return uuid === '-1' + ? {value: '-1', label:
UNKNOWN
} + : { + value: uuid, + label:
{index.toString()}
+ }; + }; + + const selectOptions = () => { + switch (type) { + case ATTRIBUTE_TYPE.GENDER: + return Object.values(GENDER).map((gender) => + renderGenderItem(gender) + ); + case ATTRIBUTE_TYPE.SOURCE: + return Object.values(SOURCE).map((source) => + renderSourceItem(source) + ); + case ATTRIBUTE_TYPE.MAIN_CATEGORY: + return Object.values(MAIN_CATEGORY_CODE) + .filter((v) => typeof v === 'number' && v !== -1) + .map((value) => renderMainCategory(value)); + case ATTRIBUTE_TYPE.SUB_CATEGORY: { + const subCategoryCodes = + mainCategory > 0 + ? ITEM_CATEGORY[MAIN_CATEGORY_CODE[mainCategory]] + : Object.values(SUB_CATEGORY_CODE).filter( + (value) => + typeof value === 'number' && value !== -1 + ); + + console.log('subCategoryCodes = ', subCategoryCodes); + return subCategoryCodes.map((subcategory) => + renderSubCategory(subcategory) + ); + } + case ATTRIBUTE_TYPE.ITEM_COLOR: + return Object.values(ITEM_COLOR) + .filter((value) => typeof value === 'number') + .map((value) => renderColor(value)); + case ATTRIBUTE_TYPE.ITEM_PATTERN: + return Object.values(ITEM_PATTERN) + .filter((value) => typeof value === 'number') + .map((value) => renderPattern(value)); + + case ATTRIBUTE_TYPE.FASHION_STYLE: { + console.log('gender = ', gender); + const styles = + gender === GENDER.MAN + ? FASHION_STYLE_MAN + : FASHION_STYLE_WOMAN; + return styles.map((style) => renderStyle(style)); + } + case ATTRIBUTE_TYPE.HUMAN_ID: { + const imageData = LabelsSelector.getActiveImageData(); + return [ + ...imageData.humans.map((human) => + renderHumanId(human.uuid) + ), + {value: '-1', label:
UNKNOWN
} + ]; + } + default: + return []; + } + }; + + const options = React.useMemo( + () => selectOptions(), + [type, gender, mainCategory] + ); + + const renderValue = (value, type) => { + switch (type) { + case ATTRIBUTE_TYPE.GENDER: + return renderGenderItem(value); + case ATTRIBUTE_TYPE.SOURCE: + return renderSourceItem(value); + case ATTRIBUTE_TYPE.MAIN_CATEGORY: + return renderMainCategory(value); + case ATTRIBUTE_TYPE.SUB_CATEGORY: + return renderSubCategory(value); + case ATTRIBUTE_TYPE.ITEM_COLOR: + return renderColor(value); + case ATTRIBUTE_TYPE.ITEM_PATTERN: + return renderPattern(value); + case ATTRIBUTE_TYPE.FASHION_STYLE: + return value.map((style) => renderStyle(style)); + case ATTRIBUTE_TYPE.HUMAN_ID: + return renderHumanId(value); + default: + return null; + } + }; + + const handleOnSelect = (selectedItem: any) => { + switch (type) { + case ATTRIBUTE_TYPE.FASHION_STYLE: + onSelect( + FASHION_STYLE.filter((style) => + selectedItem + .map((item) => item.value) + .includes(style.name.toUpperCase()) + ), + type + ); + return; + default: + onSelect(selectedItem.value, type); + } + }; + + return ( +
+ - {'upload'} -

Drop images

-

or

-

Click here to select them

- ; + return ( + <> + + {'upload'} +

Drop images

+

or

+

Click here to select them

+ + ); else if (acceptedFiles.length === 1) - return <> - {'uploaded'} -

1 image loaded

- ; + return ( + <> + {'uploaded'} +

1 image loaded

+ + ); else - return <> - - {'uploaded'} -

{acceptedFiles.length} images loaded

- ; + return ( + <> + + {'uploaded'} +

+ {acceptedFiles.length} images loaded +

+ + ); }; - const startEditorWithObjectDetection = () => startEditor(ProjectType.OBJECT_DETECTION) - const startEditorWithImageRecognition = () => startEditor(ProjectType.IMAGE_RECOGNITION) + const startEditorWithObjectDetection = () => + startEditor(ProjectType.OBJECT_DETECTION); + const startEditorWithImageRecognition = () => + startEditor(ProjectType.IMAGE_RECOGNITION); - return( -
+ return ( +
{getDropZoneContent()}
-
+
= (props: PropsWithChildren) => { />
- ) + ); }; const mapDispatchToProps = { @@ -111,7 +132,4 @@ const mapStateToProps = (state: AppState) => ({ projectData: state.general.projectData }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(ImagesDropZone); +export default connect(mapStateToProps, mapDispatchToProps)(ImagesDropZone); diff --git a/src/views/MainView/ImagesFetcher/ImagesFetcher.scss b/src/views/MainView/ImagesFetcher/ImagesFetcher.scss new file mode 100644 index 00000000..cd82a88d --- /dev/null +++ b/src/views/MainView/ImagesFetcher/ImagesFetcher.scss @@ -0,0 +1,130 @@ +.ImagesDropZone { + opacity: 0; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + + .DropZone { + user-select: none; + // width: 400px; + // height: 250px; + // box-shadow: black 0 0 0 2px inset; + // border-radius: 4px; + // margin-bottom: 6px; + width: 100%; + display: flex; + flex-direction: column; + justify-items: center; + justify-content: center; + align-items: center; + cursor: pointer; + outline: none; + + > img { + max-width: 60px; + max-height: 60px; + margin-bottom: 10px; + user-select: none; + } + + > input { + outline: none; + } + + > p { + margin-top: 2px; + margin-bottom: 0; + + &.extraBold { + font-size: 18px; + font-weight: 600; + } + } + } + + .DropZoneButtons { + align-self: stretch; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-items: center; + margin-top: 5px; + &__active{ + + background: #000000; + border-radius: 6px; + color: #fff; + font-style: normal; + font-weight: 400; + font-size: 18px; + line-height: 22px; + padding: 10px 12px; + width: 100% !important; + border: 1px solid #000000; + max-width: 304px; + margin-right: 5px; + + &:hover{ + + border-radius: 6px; + background-color: #FFFFFF; + color: #000000; + svg{ + path { + stroke: #000000; + } + } + } + + } + &__goback{ + background: transparent; + border-radius: 6px; + border: 1px solid #000000 !important; + color: #000000; + font-style: normal; + font-weight: 400; + font-size: 18px; + line-height: 22px; + padding: 10px 12px; + box-shadow: unset; + margin-right: 5px; + min-width: 123px; + display: flex; + align-items: center; + justify-items: center; + &:hover{ + background: #000000; + color: #fff; + svg{ + path { + stroke: #fff; + } + } + } + } + .TextButton { + + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + + &.disabled { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 2px inset; + color: rgba(0, 0, 0, 0.2); + cursor: default; + + &:hover { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 2px inset; + color: rgba(0, 0, 0, 0.2); + background-color: transparent; + } + } + } + } +} diff --git a/src/views/MainView/ImagesFetcher/ImagesFetcher.tsx b/src/views/MainView/ImagesFetcher/ImagesFetcher.tsx new file mode 100644 index 00000000..397bad2a --- /dev/null +++ b/src/views/MainView/ImagesFetcher/ImagesFetcher.tsx @@ -0,0 +1,175 @@ +import React, {PropsWithChildren, useState} from 'react'; +import './ImagesFetcher.scss'; +import {TextButton} from '../../Common/TextButton/TextButton'; +import {ImageData} from '../../../store/labels/types'; +import {connect} from 'react-redux'; +import { + addImageData, + updateActiveImageIndex +} from '../../../store/labels/actionCreators'; +import {AppState} from '../../../store'; +import {ProjectType} from '../../../data/enums/ProjectType'; +import {PopupWindowType} from '../../../data/enums/PopupWindowType'; +import { + updateActivePopupType, + updateProjectData +} from '../../../store/general/actionCreators'; +import {ProjectData} from '../../../store/general/types'; +import {ImageDataUtil} from '../../../utils/ImageDataUtil'; +import {sortBy} from 'lodash'; +import {APIImageData} from '../../../services/types'; +import {Button, FormControl, Input, InputLabel} from '@material-ui/core'; +import {APIService} from '../../../services/API'; +import {ClipLoader} from 'react-spinners'; +import {CSSHelper} from '../../../logic/helpers/CSSHelper'; +import {Package, ChevronRightBlack, ChevronRightWhite} from "../../../assets/icons" +interface IProps { + updateActiveImageIndexAction: (activeImageIndex: number) => any; + addImageDataAction: (imageData: ImageData[]) => any; + updateProjectDataAction: (projectData: ProjectData) => any; + updateActivePopupTypeAction: (activePopupType: PopupWindowType) => any; + projectData: ProjectData; + goBack: () => any +} + +const ImagesFetcher: React.FC = (props: PropsWithChildren) => { + const [acceptedImages, setAcceptedImages] = useState([]); + const [offset, setOffset] = useState(0); + const [limit, setLimit] = useState(10); + const [isLoading, setIsLoading] = useState(false); + const { goBack } = props + + const loadImages = async () => { + try { + setIsLoading(true); + const {data} = await APIService.fetchImages({offset, limit}); + // console.log('data.data = ', data.data); + setAcceptedImages(data.data.image_list); + } catch (error) { + console.error('Failed to loadImages: ', error); + } finally { + setIsLoading(false); + } + }; + + const startEditor = (projectType: ProjectType) => { + if (acceptedImages.length > 0) { + const files = acceptedImages; + props.updateProjectDataAction({ + ...props.projectData, + type: projectType + }); + props.updateActiveImageIndexAction(0); + props.addImageDataAction( + files.map((file: APIImageData) => + ImageDataUtil.createImageDataFromAPIData(file) + ) + ); + } + }; + + const getImageFetcherContent = () => { + if (acceptedImages.length === 0) + return ( + <> + + + + + setOffset(parseInt(e.target.value)) + } + /> + + + + setLimit(parseInt(e.target.value))} + /> + + + {isLoading ? ( + + ) : null} + {/* */} + + ); + else if (acceptedImages.length === 1) + return ( + <> + +

1 image loaded

+ + ); + else + return ( + <> + +

+ {acceptedImages.length} images loaded +

+ + ); + }; + + const startEditorWithObjectDetection = () => + startEditor(ProjectType.OBJECT_DETECTION); + const startEditorWithImageRecognition = () => + startEditor(ProjectType.IMAGE_RECOGNITION); + + return ( +
+
{getImageFetcherContent()}
+
+ { + acceptedImages.length ? ( + } + />) : ( + } + /> + ) + } + } + /> +
+
+ ); +}; + +const mapDispatchToProps = { + updateActiveImageIndexAction: updateActiveImageIndex, + addImageDataAction: addImageData, + updateProjectDataAction: updateProjectData, + updateActivePopupTypeAction: updateActivePopupType +}; + +const mapStateToProps = (state: AppState) => ({ + projectData: state.general.projectData +}); + +export default connect(mapStateToProps, mapDispatchToProps)(ImagesFetcher); diff --git a/src/views/MainView/MainView.scss b/src/views/MainView/MainView.scss index 12339205..324cffb2 100644 --- a/src/views/MainView/MainView.scss +++ b/src/views/MainView/MainView.scss @@ -2,8 +2,10 @@ .MainView { position: absolute; - height: 100vh; - width: 100vw; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; margin: 0; padding: 0; @@ -35,11 +37,42 @@ } .RightColumn { + label + .MuiInput-formControl{ + margin-top: unset; + } .ImagesDropZone { animation-duration: 1.5s; animation-name: cssAnimationShow; animation-fill-mode: forwards; } + .MuiFormControl-root{ + width: 100%; + margin-bottom: 12px; + } + .MuiInputBase-input { + background: #FFFF; + border-radius: 9.73271px; + height: 65px ; + max-height: 65px; + width: 100%; + padding: 0px 19px; + color: #000000 !important; + &::placeholder{ + color: #BABABA; + font-weight: 400; + font-size: 14.5991px; + line-height: 18px; + } + } + .MuiInput-underline{ + &::after{ + display: none !important; + } + &::before{ + display: none !important; + } + } + } .LeftColumn { @@ -144,18 +177,18 @@ } .RightColumn { - padding: 20px; - align-self: stretch; - flex: 1; - min-width: 200px; - z-index: 100; - - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: space-between; - align-items: center; - align-content: center; + // padding: 20px; + // align-self: stretch; + // flex: 1; + // min-width: 200px; + // z-index: 100; + + // display: flex; + // flex-direction: row; + // flex-wrap: nowrap; + // justify-content: center; + // align-items: center; + // align-content: center; .TextButton { box-shadow: black 0 0 0 2px inset; @@ -280,4 +313,21 @@ 100% { background-position: 0 50%; } +} + +.loginShowniq{ + background-image: url("../../assets/img/backgroundImage.png"); + background-size: cover; + background-repeat: no-repeat; + height: 100vh; + background-color: #00dafe; + background-position: center center; + width: 100%; + &__content{ + margin-top: auto; + @media screen and (max-width: 1500px) { + background: rgba(0, 120, 147, 0.55) !important; + position: fixed; + } + } } \ No newline at end of file diff --git a/src/views/MainView/MainView.tsx b/src/views/MainView/MainView.tsx index 57d10e55..e9ff1e4e 100644 --- a/src/views/MainView/MainView.tsx +++ b/src/views/MainView/MainView.tsx @@ -1,17 +1,52 @@ import React, {useState} from 'react'; import './MainView.scss'; -import {TextButton} from '../Common/TextButton/TextButton'; import classNames from 'classnames'; import {ISize} from '../../interfaces/ISize'; import {ImageButton} from '../Common/ImageButton/ImageButton'; import {ISocialMedia, SocialMediaData} from '../../data/info/SocialMediaData'; -import {EditorFeatureData, IEditorFeature} from '../../data/info/EditorFeatureData'; +import { + EditorFeatureData, + IEditorFeature +} from '../../data/info/EditorFeatureData'; +import { + updateActiveImageIndex, + updateActiveLabelNameId, + updateFirstLabelCreatedFlag, + updateImageData, + updateLabelNames +} from '../../store/labels/actionCreators'; +import {PopupActions} from '../../logic/actions/PopupActions'; import {Tooltip} from '@material-ui/core'; import Fade from '@material-ui/core/Fade'; import withStyles from '@material-ui/core/styles/withStyles'; -import ImagesDropZone from './ImagesDropZone/ImagesDropZone'; +import {updateAuthData} from '../../store/auth/actionCreators'; +import ImagesFetcher from './ImagesFetcher/ImagesFetcher'; +import {connect} from 'react-redux'; +import {updateActivePopupType, updateProjectData} from '../../store/general/actionCreators'; +import {PopupWindowType} from '../../data/enums/PopupWindowType'; +import {AppState} from '../../store'; +import {AuthData} from '../../store/auth/types'; +import WrapperLogin from "../../components/WrapperLogin/index" -const MainView: React.FC = () => { +interface IProps { + authData: AuthData; + updateActivePopupTypeAction: (type: PopupWindowType) => void; + updateActiveImageIndex: (activeImageIndex: number) => any; + updateActiveLabelNameId: (activeLabelId: string) => any; + //updateImageData: (imageData: ImageData[]) => any; + updateFirstLabelCreatedFlag: (firstLabelCreatedFlag: boolean) => any; + updateAuthDataAction: (authData: AuthData) => any; + +} + +const MainView: React.FC = ({ + authData, + updateActivePopupTypeAction, + updateActiveLabelNameId, + updateActiveImageIndex, + updateFirstLabelCreatedFlag, + updateAuthDataAction +}) => { const [projectInProgress, setProjectInProgress] = useState(false); const [projectCanceled, setProjectCanceled] = useState(false); @@ -22,118 +57,102 @@ const MainView: React.FC = () => { const endProject = () => { setProjectInProgress(false); setProjectCanceled(true); + updateActivePopupTypeAction(PopupWindowType.LOGIN); + updateAuthDataAction({ + email: null, + displayName: null, + authToken: null, + role: null + }); + window.localStorage.removeItem('@@auth'); + updateActiveLabelNameId(null); + updateActiveImageIndex(null); + updateFirstLabelCreatedFlag(false); + PopupActions.close(); }; const getClassName = () => { - return classNames( - 'MainView', { - 'InProgress': projectInProgress, - 'Canceled': !projectInProgress && projectCanceled - } - ); + return classNames('MainView', { + InProgress: projectInProgress, + Canceled: !projectInProgress && projectCanceled + }); }; - const DarkTooltip = withStyles(theme => ({ + const DarkTooltip = withStyles((theme) => ({ tooltip: { backgroundColor: '#171717', color: '#ffffff', boxShadow: theme.shadows[1], fontSize: 11, maxWidth: 120 - }, + } }))(Tooltip); - const getSocialMediaButtons = (size:ISize) => { - return SocialMediaData.map((data:ISocialMedia, index: number) => { - return -
- -
-
+ const getSocialMediaButtons = (size: ISize) => { + return SocialMediaData.map((data: ISocialMedia, index: number) => { + return ( + +
+ +
+
+ ); }); }; const getEditorFeatureTiles = () => { - return EditorFeatureData.map((data:IEditorFeature) => { - return
-
- {data.imageAlt} -
- {data.displayText} + return EditorFeatureData.map((data: IEditorFeature) => { + return ( +
+
+ {data.imageAlt} +
+ {data.displayText} +
-
+ ); }); }; return ( -
-
-
-
-
-
- -
-
-
+
+ +
+ {/* */} +
-
- -
-
- {'main-logo'} -
-
- {getEditorFeatureTiles()} -
-
-
-
- {projectInProgress && } -
-
-
- -
- {getSocialMediaButtons({width: 30, height: 30})} -
- {!projectInProgress && } -
+
); }; +const mapDispatchToProps = { + updateActivePopupTypeAction: updateActivePopupType, + updateActiveLabelNameId, + updateLabelNames, + updateProjectData, + updateActiveImageIndex, + updateImageData, + updateFirstLabelCreatedFlag, + updateAuthDataAction: updateAuthData, +}; +const mapStateToProps = (state: AppState) => ({ + authData: state.auth.authData +}); -export default MainView; +export default connect(mapStateToProps, mapDispatchToProps)(MainView); diff --git a/src/views/MobileMainView/MobileMainView.tsx b/src/views/MobileMainView/MobileMainView.tsx index e2484687..a84e1d47 100644 --- a/src/views/MobileMainView/MobileMainView.tsx +++ b/src/views/MobileMainView/MobileMainView.tsx @@ -1,13 +1,16 @@ import React, {useState} from 'react'; import './MobileMainView.scss'; import Scrollbars from 'react-custom-scrollbars'; -import {ISize} from "../../interfaces/ISize"; -import {AppState} from "../../store"; -import {connect} from "react-redux"; -import classNames from 'classnames' -import {EditorFeatureData, IEditorFeature} from "../../data/info/EditorFeatureData"; -import {ISocialMedia, SocialMediaData} from "../../data/info/SocialMediaData"; -import {ImageButton} from "../Common/ImageButton/ImageButton"; +import {ISize} from '../../interfaces/ISize'; +import {AppState} from '../../store'; +import {connect} from 'react-redux'; +import classNames from 'classnames'; +import { + EditorFeatureData, + IEditorFeature +} from '../../data/info/EditorFeatureData'; +import {ISocialMedia, SocialMediaData} from '../../data/info/SocialMediaData'; +import {ImageButton} from '../Common/ImageButton/ImageButton'; interface IProps { size: ISize; @@ -20,8 +23,8 @@ const MobileMainView: React.FC = ({size}) => { const getClassName = () => { return classNames('MobileTopNavigationBar', { Hide: scrollPosition < scrollPositionThreshold, - Show: scrollPosition >= scrollPositionThreshold, - }) + Show: scrollPosition >= scrollPositionThreshold + }); }; const onScroll = (value) => { @@ -29,105 +32,116 @@ const MobileMainView: React.FC = ({size}) => { }; const getEditorFeatureTiles = (features: IEditorFeature[]) => { - return features.map((data:IEditorFeature) => { - return
-
- {data.imageAlt} -
- {data.displayText} + return features.map((data: IEditorFeature) => { + return ( +
+
+ {data.imageAlt} +
+ {data.displayText} +
-
+ ); }); }; - const getSocialMediaButtons = (size:ISize) => { - return SocialMediaData.map((data:ISocialMedia, index: number) => { - return + const getSocialMediaButtons = (size: ISize) => { + return SocialMediaData.map((data: ISocialMedia, index: number) => { + return ( + + ); }); }; - const topNavigationBar =
-
-
- {"make-sense"} - Make Sense + + const topNavigationBar = ( +
+
+
+ {'make-sense'} + SHOWNIQ Platforms +
+
+
+
-
-
-
-
; - - const firstStage =
- {"main-logo"} -
-
-
-
; + ); - const secondStage =
- {getEditorFeatureTiles(EditorFeatureData.slice(0, 3))} -
; + const firstStage = ( +
+ {'main-logo'} +
+
+
+
+ ); - const thirdStage =
- {getEditorFeatureTiles(EditorFeatureData.slice(3, 6))} -
-
+ const secondStage = ( +
+ {getEditorFeatureTiles(EditorFeatureData.slice(0, 3))}
-
-
+ ); + + const thirdStage = ( +
+ {getEditorFeatureTiles(EditorFeatureData.slice(3, 6))} +
+
+
+
+
+
-
; + ); - const fourthStage =
-
- Due to the small size of the screen we do not support our editor on mobile devices. Check what you missed and visit us from a desktop. + const fourthStage = ( +
+
+ Due to the small size of the screen we do not support our editor + on mobile devices. Check what you missed and visit us from a + desktop. +
+
+ {getSocialMediaButtons({width: 40, height: 40})} +
-
- {getSocialMediaButtons({width: 40, height: 40})} + ); + + return ( +
+ {topNavigationBar} + +
+ {firstStage} + {secondStage} + {thirdStage} + {fourthStage} +
+
-
; - - return(
- {topNavigationBar} - -
- {firstStage} - {secondStage} - {thirdStage} - {fourthStage} -
-
-
) + ); }; const mapDispatchToProps = {}; @@ -136,7 +150,4 @@ const mapStateToProps = (state: AppState) => ({ size: state.general.windowSize }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(MobileMainView); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(MobileMainView); diff --git a/src/views/PopupView/DeleteConfirmPopup/DeleteConfirmPopup.scss b/src/views/PopupView/DeleteConfirmPopup/DeleteConfirmPopup.scss new file mode 100644 index 00000000..c4505867 --- /dev/null +++ b/src/views/PopupView/DeleteConfirmPopup/DeleteConfirmPopup.scss @@ -0,0 +1,20 @@ +@import '../../../settings/Settings'; + +.DeleteConfirmPopupContent { + align-self: stretch; + flex: 1; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: center; + align-content: flex-start; + padding-top: 30px; + + .Message { + align-self: stretch; + color: white; + font-size: 15px; + padding: 0 40px 30px 40px; + } +} diff --git a/src/views/PopupView/DeleteConfirmPopup/DeleteConfirmPopup.tsx b/src/views/PopupView/DeleteConfirmPopup/DeleteConfirmPopup.tsx new file mode 100644 index 00000000..6478f2da --- /dev/null +++ b/src/views/PopupView/DeleteConfirmPopup/DeleteConfirmPopup.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import './DeleteConfirmPopup.scss'; +import {GenericYesNoPopup} from '../GenericYesNoPopup/GenericYesNoPopup'; +import {AppState} from '../../../store'; +import {connect} from 'react-redux'; +import {PopupActions} from '../../../logic/actions/PopupActions'; +import {LabelsSelector} from '../../../store/selectors/LabelsSelector'; +import {LabelActions} from '../../../logic/actions/LabelActions'; + +interface IProps {} + +const DeleteConfirmPopup: React.FC = (props) => { + const {} = props; + + const renderContent = () => { + return ( +
+
Are you sure you want to Delete?
+
+ ); + }; + + const onAccept = () => { + PopupActions.close(); + const {id: labelId} = LabelsSelector.getActiveRectLabel(); + const {id: imageId} = LabelsSelector.getActiveImageData(); + console.log('imageId = ', imageId); + console.log('labelId = ', labelId); + LabelActions.deleteRectLabelById(imageId, labelId); + }; + + const onReject = () => { + PopupActions.close(); + }; + + return ( +
+ +
+ ); +}; + +const mapDispatchToProps = {}; + +const mapStateToProps = (state: AppState) => ({}); + +export default connect(mapStateToProps, mapDispatchToProps)(DeleteConfirmPopup); diff --git a/src/views/PopupView/ExitProjectPopup/ExitProjectPopup.tsx b/src/views/PopupView/ExitProjectPopup/ExitProjectPopup.tsx index 70157f8f..f697f74e 100644 --- a/src/views/PopupView/ExitProjectPopup/ExitProjectPopup.tsx +++ b/src/views/PopupView/ExitProjectPopup/ExitProjectPopup.tsx @@ -1,19 +1,23 @@ -import React from 'react' -import './ExitProjectPopup.scss' -import {GenericYesNoPopup} from "../GenericYesNoPopup/GenericYesNoPopup"; +import React from 'react'; +import './ExitProjectPopup.scss'; +import {GenericYesNoPopup} from '../GenericYesNoPopup/GenericYesNoPopup'; import { updateActiveImageIndex, updateActiveLabelNameId, updateFirstLabelCreatedFlag, updateImageData, updateLabelNames -} from "../../../store/labels/actionCreators"; -import {AppState} from "../../../store"; -import {connect} from "react-redux"; -import {ImageData, LabelName} from "../../../store/labels/types"; -import {PopupActions} from "../../../logic/actions/PopupActions"; -import {ProjectData} from "../../../store/general/types"; -import {updateProjectData} from "../../../store/general/actionCreators"; +} from '../../../store/labels/actionCreators'; +import {updateActiveContext} from '../../../store/general/actionCreators'; + +import {AppState} from '../../../store'; +import {connect} from 'react-redux'; +import {ImageData, LabelName} from '../../../store/labels/types'; +import {PopupActions} from '../../../logic/actions/PopupActions'; +import {ProjectData} from '../../../store/general/types'; +import {updateProjectData} from '../../../store/general/actionCreators'; +import {ContextType} from '../../../data/enums/ContextType'; +import {ContextManager} from '../../../logic/context/ContextManager'; interface IProps { updateActiveImageIndex: (activeImageIndex: number) => any; @@ -22,6 +26,7 @@ interface IProps { updateImageData: (imageData: ImageData[]) => any; updateFirstLabelCreatedFlag: (firstLabelCreatedFlag: boolean) => any; updateProjectData: (projectData: ProjectData) => any; + updateActiveContext: (activeContext: ContextType) => any; } const ExitProjectPopup: React.FC = (props) => { @@ -31,26 +36,29 @@ const ExitProjectPopup: React.FC = (props) => { updateActiveImageIndex, updateImageData, updateFirstLabelCreatedFlag, - updateProjectData + updateProjectData, + updateActiveContext } = props; const renderContent = () => { - return( + return (
- Are you sure you want to leave the editor? You will permanently lose all your progress. + Are you sure you want to leave the editor? You will + permanently lose all your progress.
- ) + ); }; const onAccept = () => { updateActiveLabelNameId(null); updateLabelNames([]); - updateProjectData({type: null, name: "my-project-name"}); + updateProjectData({type: null, name: 'my-project-name'}); updateActiveImageIndex(null); updateImageData([]); updateFirstLabelCreatedFlag(false); + ContextManager.switchCtx(null); PopupActions.close(); }; @@ -58,15 +66,18 @@ const ExitProjectPopup: React.FC = (props) => { PopupActions.close(); }; - return( + return ( +
) + /> +
+ ); }; const mapDispatchToProps = { @@ -75,12 +86,10 @@ const mapDispatchToProps = { updateProjectData, updateActiveImageIndex, updateImageData, - updateFirstLabelCreatedFlag + updateFirstLabelCreatedFlag, + updateActiveContext }; const mapStateToProps = (state: AppState) => ({}); -export default connect( - mapStateToProps, - mapDispatchToProps -)(ExitProjectPopup); \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(ExitProjectPopup); diff --git a/src/views/PopupView/GenericLabelTypePopup/GenericLabelTypePopup.tsx b/src/views/PopupView/GenericLabelTypePopup/GenericLabelTypePopup.tsx index 6ec3e99c..8bbe8356 100644 --- a/src/views/PopupView/GenericLabelTypePopup/GenericLabelTypePopup.tsx +++ b/src/views/PopupView/GenericLabelTypePopup/GenericLabelTypePopup.tsx @@ -69,6 +69,7 @@ const GenericLabelTypePopup: React.FC = ( } return( +
= ( rejectLabel={rejectLabel} onReject={() => onReject(labelType)} /> +
); }; diff --git a/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.scss b/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.scss index 7232882c..aad95f3e 100644 --- a/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.scss +++ b/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.scss @@ -1,90 +1,79 @@ @import '../../../settings/Settings'; .GenericYesNoPopup { - max-height: 600px; - max-width: 500px; - width: 50%; - border-radius: 5px; - user-select: none; - box-shadow: 0px 0px 10px 3px rgba(255, 255, 255, 0.02); - - display: flex; - flex-direction: column; - flex-wrap: nowrap; - overflow: hidden; - - .Header { - align-self: stretch; - height: 40px; - box-shadow: 0px 2px 15px 0px rgba(0,0,0,0.4); - color: white; - font-weight: 900; - font-size: 18px; - background-color: $darkThemeFirstColor; - + margin-top: auto; + margin-bottom: -22px; + padding: 41px 70px; display: flex; - flex-direction: column; - flex-wrap: nowrap; justify-content: center; - align-items: center; - align-content: center; - } - - .Content { - align-self: stretch; - font-size: 14px; - background-color: $darkThemeSecondColor; - flex: 1; - + background: rgba(255, 255, 255, 0.58); + border-radius: 11.0791px; + max-width: 575.58px; display: flex; flex-direction: column; flex-wrap: nowrap; - justify-content: center; - align-items: center; - align-content: center; - } + overflow: hidden; - .Footer { - padding: 0 40px; - height: 80px; - align-self: stretch; - background-color: $darkThemeSecondColor; - border-top: solid 1px $darkThemeFirstColor; + .Content { + align-self: stretch; + font-size: 14px; + + flex: 1; - display: flex; - flex-direction: row; - flex-wrap: nowrap; - justify-content: flex-end; - align-items: center; - align-content: flex-end; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + align-content: center; + } + + .Footer { + + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-end; + align-items: center; + align-content: flex-end; - .TextButton { - margin-left: 20px; - box-shadow: $secondaryColor 0 0 0 2px inset; // fallback if new css variables are not supported by browser - box-shadow: var(--leading-color) 0 0 0 2px inset; - background-color: $secondaryColor; // fallback if new css variables are not supported by browser - background-color: var(--leading-color); - color: white; // fallback if new css variables are not supported by browser - color: var(--button-text-color); + .TextButton { + margin-left: 20px; + background: #FF7DA9; + border-radius: 9.23261px; + color: #FFFFFF; + font-style: normal; + font-weight: 400; + font-size: 18.4652px; + line-height: 22px; + min-width: 210px; + text-align: center; + padding: 12px; + box-shadow: unset; + border: 1px solid #FF7DA9; + &:hover { + background: #FFFFFF !important; + color: #000000 !important; + border: 1px solid #000000 !important; + } - &:hover { - background-color: transparent; - color: $secondaryColor; // fallback if new css variables are not supported by browser - color: var(--leading-color); - } + &.disabled { + box-shadow: $darkThemeThirdColor 0 0 0 2px inset; + background-color: $darkThemeThirdColor; + cursor: default; + opacity: 0.6; - &.disabled { - box-shadow: $darkThemeThirdColor 0 0 0 2px inset; - background-color: $darkThemeThirdColor; - cursor: default; - opacity: 0.6; + &:hover { + box-shadow: $darkThemeThirdColor 0 0 0 2px inset; + background-color: $darkThemeThirdColor; + color: white; + } + } + } - &:hover { - box-shadow: $darkThemeThirdColor 0 0 0 2px inset; - background-color: $darkThemeThirdColor; - color: white; + .TextButton.reject{ + background: #26D7FF; + border: 1px solid #26D7FF; } - } } - } -} \ No newline at end of file +} diff --git a/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.tsx b/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.tsx index ffae6d7f..d13aad6b 100644 --- a/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.tsx +++ b/src/views/PopupView/GenericYesNoPopup/GenericYesNoPopup.tsx @@ -40,7 +40,7 @@ export const GenericYesNoPopup: React.FC = ( }, [status]); return ( -
+
{title}
@@ -51,13 +51,13 @@ export const GenericYesNoPopup: React.FC = ( {!skipAcceptButton && } {!skipRejectButton && }
diff --git a/src/views/PopupView/GenericYesNoPopupDraggable/GenericYesNoPopupDraggable.scss b/src/views/PopupView/GenericYesNoPopupDraggable/GenericYesNoPopupDraggable.scss new file mode 100644 index 00000000..2acbd373 --- /dev/null +++ b/src/views/PopupView/GenericYesNoPopupDraggable/GenericYesNoPopupDraggable.scss @@ -0,0 +1,146 @@ +@import '../../../settings/Settings'; + +.GenericYesNoPopupDraggable { + max-height: 800px; + max-width: 700px; + + // width: 50%; + border-radius: 5px; + user-select: none; + box-shadow: 0px 0px 10px 3px rgba(255, 255, 255, 0.02); + + display: flex; + flex-direction: column; + flex-wrap: nowrap; + overflow: hidden; + + .Header { + align-self: stretch; + height: 40px; + box-shadow: 0px 2px 15px 0px rgba(0, 0, 0, 0.4); + color: white; + font-weight: 900; + font-size: 18px; + background-color: $darkThemeFirstColor; + + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + align-content: center; + } + + .Content { + align-self: stretch; + font-size: 14px; + background-color: $darkThemeSecondColor; + flex: 1; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: center; + align-items: center; + align-content: center; + } + + .Footer { + padding: 0 40px; + height: 80px; + align-self: stretch; + background-color: $darkThemeSecondColor; + border-top: solid 1px $darkThemeFirstColor; + + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-end; + align-items: center; + align-content: flex-end; + + .TextButton { + box-shadow: $secondaryColor 0 0 0 2px inset; // fallback if new css variables are not supported by browser + box-shadow: var(--leading-color) 0 0 0 2px inset; + background-color: $secondaryColor; // fallback if new css variables are not supported by browser + background-color: var(--leading-color); + color: white; // fallback if new css variables are not supported by browser + color: var(--button-text-color); + + &:hover { + background-color: transparent; + color: $secondaryColor; // fallback if new css variables are not supported by browser + color: var(--leading-color); + } + + &.disabled { + box-shadow: $darkThemeThirdColor 0 0 0 2px inset; + background-color: $darkThemeThirdColor; + cursor: default; + opacity: 0.6; + + &:hover { + box-shadow: $darkThemeThirdColor 0 0 0 2px inset; + background-color: $darkThemeThirdColor; + color: white; + } + } + } + } +} + +.flexible-modal { + position: absolute; + z-index: 1; + border: 1px solid #ccc; + background: white; +} +.flexible-modal-mask { + position: fixed; + height: 100%; + background: rgba(0, 0, 0, 0) !important; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.flexible-modal-resizer { + position: absolute; + right: 0; + bottom: 0; + cursor: se-resize; + margin: 5px; + border-bottom: solid 2px #333; + border-right: solid 2px #333; +} +.flexible-modal-drag-area { + background: rgba(255, 0, 0, 0) !important; + height: 30px; + position: absolute; + right: 0; + top: 0; + cursor: move; +} +.flexible-modal-drag-area-left { + background: rgba(255, 0, 0, 0); + height: 30px; + position: absolute; + right: 0; + top: 0; + cursor: move; +} +.flexible-modal-drag-area-right { + background: rgba(255, 0, 0, 0); + height: 30px; + position: absolute; + right: 0; + top: 0; + cursor: move; +} + +.text-success{ + color: $lightSuccess; +} + +.text-fail{ + color: $dangerColor; +} \ No newline at end of file diff --git a/src/views/PopupView/GenericYesNoPopupDraggable/GenericYesNoPopupDraggable.tsx b/src/views/PopupView/GenericYesNoPopupDraggable/GenericYesNoPopupDraggable.tsx new file mode 100644 index 00000000..20343f5b --- /dev/null +++ b/src/views/PopupView/GenericYesNoPopupDraggable/GenericYesNoPopupDraggable.tsx @@ -0,0 +1,75 @@ +import React, {useEffect, useState} from 'react'; +import './GenericYesNoPopupDraggable.scss'; +import {TextButton} from '../../Common/TextButton/TextButton'; +import {ContextManager} from '../../../logic/context/ContextManager'; +import {ContextType} from '../../../data/enums/ContextType'; +import ReactModal from 'react-modal-resizable-draggable'; + +interface IProps { + title: string; + renderContent: () => any; + acceptLabel?: string; + onAccept?: () => any; + skipAcceptButton?: boolean; + disableAcceptButton?: boolean; + rejectLabel?: string; + onReject?: () => any; + skipRejectButton?: boolean; + disableRejectButton?: boolean; +} + +export const GenericYesNoPopupDraggable: React.FC = ({ + title, + renderContent, + acceptLabel, + onAccept, + skipAcceptButton, + disableAcceptButton, + rejectLabel, + onReject, + skipRejectButton, + disableRejectButton +}) => { + const [status, setMountStatus] = useState(false); + useEffect(() => { + if (!status) { + ContextManager.switchCtx(ContextType.POPUP); + setMountStatus(true); + } + + // console.log('viewPortSize = ', window.innerWidth); + }, [status]); + + return ( + console.log('on focused')} + isOpen={true} + isMinimised={false} + onRequestClose={() => console.group('on request close')}> +
{title}
+
{renderContent()}
+
+ {!skipAcceptButton && ( + + )} + {!skipRejectButton && ( + + )} +
+
+ ); +}; diff --git a/src/views/PopupView/ImportLabelPopup/ImportLabelPopup.tsx b/src/views/PopupView/ImportLabelPopup/ImportLabelPopup.tsx index c0fae3d5..02b90d5d 100644 --- a/src/views/PopupView/ImportLabelPopup/ImportLabelPopup.tsx +++ b/src/views/PopupView/ImportLabelPopup/ImportLabelPopup.tsx @@ -1,5 +1,5 @@ -import React, {useState} from 'react' -import './ImportLabelPopup.scss' +import React, {useState} from 'react'; +import './ImportLabelPopup.scss'; import {LabelType} from '../../../data/enums/LabelType'; import {PopupActions} from '../../../logic/actions/PopupActions'; import GenericLabelTypePopup from '../GenericLabelTypePopup/GenericLabelTypePopup'; @@ -10,32 +10,39 @@ import {connect} from 'react-redux'; import {useDropzone} from 'react-dropzone'; import {AcceptedFileType} from '../../../data/enums/AcceptedFileType'; import {ImageData, LabelName} from '../../../store/labels/types'; -import {updateActiveLabelType, updateImageData, updateLabelNames} from '../../../store/labels/actionCreators'; +import { + updateActiveLabelType, + updateImageData, + updateLabelNames +} from '../../../store/labels/actionCreators'; import {ImporterSpecData} from '../../../data/ImporterSpecData'; import {AnnotationFormatType} from '../../../data/enums/AnnotationFormatType'; import {ILabelFormatData} from '../../../interfaces/ILabelFormatData'; interface IProps { - activeLabelType: LabelType, - updateImageDataAction: (imageData: ImageData[]) => any, - updateLabelNamesAction: (labels: LabelName[]) => any, - updateActiveLabelTypeAction: (activeLabelType: LabelType) => any + activeLabelType: LabelType; + updateImageDataAction: (imageData: ImageData[]) => any; + updateLabelNamesAction: (labels: LabelName[]) => any; + updateActiveLabelTypeAction: (activeLabelType: LabelType) => any; } -const ImportLabelPopup: React.FC = ( - { - activeLabelType, - updateImageDataAction, - updateLabelNamesAction, - updateActiveLabelTypeAction - }) => { +const ImportLabelPopup: React.FC = ({ + activeLabelType, + updateImageDataAction, + updateLabelNamesAction, + updateActiveLabelTypeAction +}) => { const resolveFormatType = (labelType: LabelType): AnnotationFormatType => { - const possibleImportFormats = ImportFormatData[labelType] - return possibleImportFormats.length === 1 ? possibleImportFormats[0].type : null - } + const possibleImportFormats = ImportFormatData[labelType]; + return possibleImportFormats.length === 1 + ? possibleImportFormats[0].type + : null; + }; const [labelType, setLabelType] = useState(activeLabelType); - const [formatType, setFormatType] = useState(resolveFormatType(activeLabelType)); + const [formatType, setFormatType] = useState( + resolveFormatType(activeLabelType) + ); const [loadedLabelNames, setLoadedLabelNames] = useState([]); const [loadedImageData, setLoadedImageData] = useState([]); const [annotationsLoadedError, setAnnotationsLoadedError] = useState(null); @@ -44,33 +51,40 @@ const ImportLabelPopup: React.FC = ( accept: [AcceptedFileType.JSON, AcceptedFileType.TEXT], multiple: true, onDrop: (acceptedFiles) => { - const importer = new (ImporterSpecData[formatType])([labelType]) - importer.import(acceptedFiles, onAnnotationLoadSuccess, onAnnotationsLoadFailure); + const importer = new ImporterSpecData[formatType]([labelType]); + importer.import( + acceptedFiles, + onAnnotationLoadSuccess, + onAnnotationsLoadFailure + ); } }); const onLabelTypeChange = (labelType: LabelType) => { setLabelType(labelType); - setFormatType(resolveFormatType(labelType)) + setFormatType(resolveFormatType(labelType)); setLoadedLabelNames([]); setLoadedImageData([]); setAnnotationsLoadedError(null); - } + }; - const onAnnotationLoadSuccess = (imagesData: ImageData[], labelNames: LabelName[]) => { + const onAnnotationLoadSuccess = ( + imagesData: ImageData[], + labelNames: LabelName[] + ) => { setLoadedLabelNames(labelNames); setLoadedImageData(imagesData); setAnnotationsLoadedError(null); - } + }; - const onAnnotationsLoadFailure = (error?:Error) => { + const onAnnotationsLoadFailure = (error?: Error) => { setLoadedLabelNames([]); setLoadedImageData([]); setAnnotationsLoadedError(error); }; const onAccept = (labelType: LabelType) => { - if (loadedLabelNames.length !== 0 && loadedImageData.length !== 0) { + if (loadedImageData.length !== 0) { updateImageDataAction(loadedImageData); updateLabelNamesAction(loadedLabelNames); updateActiveLabelTypeAction(labelType); @@ -84,90 +98,102 @@ const ImportLabelPopup: React.FC = ( const onAnnotationFormatChange = (format: AnnotationFormatType) => { setFormatType(format); - } + }; const getDropZoneContent = () => { if (!!annotationsLoadedError) { - return <> - - {'upload'} -

Annotation import was unsuccessful

- {annotationsLoadedError.message} -

Try again

- ; - } else if (loadedImageData.length !== 0 && loadedLabelNames.length !== 0) { - return <> - {'uploaded'} -

Annotation ready for import

- After import you will lose - all your current annotations - ; + return ( + <> + + {'upload'} +

+ Annotation import was unsuccessful +

+ {annotationsLoadedError.message} +

Try again

+ + ); + } else if (loadedImageData.length !== 0) { + return ( + <> + {'uploaded'} +

Annotation ready for import

+ After import you will lose all your current annotations + + ); } else { - return <> - - {'upload'} -

{`Drop ${formatType} annotations`}

-

or

-

Click here to select them

- ; + return ( + <> + + {'upload'} +

{`Drop ${formatType} annotations`}

+

or

+

Click here to select them

+ + ); } }; const getOptions = (exportFormatData: ILabelFormatData[]) => { return exportFormatData.map((entry: ILabelFormatData) => { - return
onAnnotationFormatChange(entry.type)} - key={entry.type} - > - {entry.type === formatType ? - {'checked'} : - {'unchecked'}} - {entry.label} -
- }) + return ( +
onAnnotationFormatChange(entry.type)} + key={entry.type}> + {entry.type === formatType ? ( + {'checked'} + ) : ( + {'unchecked'} + )} + {entry.label} +
+ ); + }); }; const renderInternalContent = (labelType: LabelType) => { if (!formatType && ImportFormatData[labelType].length !== 0) { return [ -
+
Select file format you would like to use to import labels.
, -
+
{getOptions(ImportFormatData[labelType])}
- ] + ]; } const importFormatData = ImportFormatData[labelType]; - return importFormatData.length === 0 ? - : + return importFormatData.length === 0 ? ( + + ) : (
{getDropZoneContent()}
- } + ); + }; - return( + return ( = ( acceptLabel={'Import'} onAccept={onAccept} skipAcceptButton={ImportFormatData[labelType].length === 0} - disableAcceptButton={loadedImageData.length === 0 || loadedLabelNames.length === 0 || !!annotationsLoadedError} + disableAcceptButton={ + loadedImageData.length === 0 || !!annotationsLoadedError + } rejectLabel={'Cancel'} onReject={onReject} renderInternalContent={renderInternalContent} /> - ) + ); }; const mapDispatchToProps = { @@ -190,10 +218,7 @@ const mapDispatchToProps = { }; const mapStateToProps = (state: AppState) => ({ - activeLabelType: state.labels.activeLabelType, + activeLabelType: state.labels.activeLabelType }); -export default connect( - mapStateToProps, - mapDispatchToProps -)(ImportLabelPopup); +export default connect(mapStateToProps, mapDispatchToProps)(ImportLabelPopup); diff --git a/src/views/PopupView/InsertLabelNamesPopup/InsertLabelNamesPopup.tsx b/src/views/PopupView/InsertLabelNamesPopup/InsertLabelNamesPopup.tsx index e9cf0862..d7ee391d 100644 --- a/src/views/PopupView/InsertLabelNamesPopup/InsertLabelNamesPopup.tsx +++ b/src/views/PopupView/InsertLabelNamesPopup/InsertLabelNamesPopup.tsx @@ -256,6 +256,7 @@ const InsertLabelNamesPopup: React.FC = ( }; return ( +
= ( onAccept={isUpdate ? safeOnUpdateAcceptCallback : safeOnCreateAcceptCallback} rejectLabel={isUpdate ? 'Cancel' : 'Load labels from file'} onReject={isUpdate ? onUpdateRejectCallback : onCreateRejectCallback} - />) + + /> +
+ ) + }; const mapDispatchToProps = { diff --git a/src/views/PopupView/LabelInfoPopup/LabelInfoPopup.scss b/src/views/PopupView/LabelInfoPopup/LabelInfoPopup.scss new file mode 100644 index 00000000..f2e0f31c --- /dev/null +++ b/src/views/PopupView/LabelInfoPopup/LabelInfoPopup.scss @@ -0,0 +1,58 @@ +@import '../../../settings/Settings'; + +.LabelInfoPopupContent { + align-self: stretch; + flex: 1; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: center; + align-content: flex-start; + min-height: 300px; +} + +.AttributeContainer { + display: flex; + align-self: stretch; + max-height: 5em; + flex-direction: row; +} + +.AttributeName { + display: flex; + flex: 1; + align-self: stretch; + color: white; + font-size: 15px; + padding: 0 40px 30px 40px; + border-bottom: solid 1px $darkThemeFirstColor; +} + +.AttributeSelector { + display: flex; + flex: 2; + align-self: stretch; + flex-wrap: wrap; + max-height: 28px; + .title { + color: white; + } +} +.SampleImage { + position: absolute; + bottom: 1em; + left: 1em; + max-width: 230px; + max-height: 230px; +} +.IconItem { + display: flex; + flex: 1; + // justify-content: center; + align-items: center; + + .ItemTitle { + margin-left: 1em; + } +} diff --git a/src/views/PopupView/LabelInfoPopup/LabelInfoPopup.tsx b/src/views/PopupView/LabelInfoPopup/LabelInfoPopup.tsx new file mode 100644 index 00000000..467da422 --- /dev/null +++ b/src/views/PopupView/LabelInfoPopup/LabelInfoPopup.tsx @@ -0,0 +1,499 @@ +/* eslint-disable jsx-a11y/alt-text */ +import React, {useEffect, useState} from 'react'; +import './LabelInfoPopup.scss'; +import {AppState} from '../../../store'; +import {connect} from 'react-redux'; +import {HumanInfo, ImageData, ItemInfo} from '../../../store/labels/types'; +import {GenericYesNoPopup} from '../GenericYesNoPopup/GenericYesNoPopup'; +import {updateActivePopupType} from '../../../store/general/actionCreators'; +import {PopupWindowType} from '../../../data/enums/PopupWindowType'; +import {LabelsSelector} from '../../../store/selectors/LabelsSelector'; +import {TagButton} from '../../Common/TagButton/TagButton'; +import { + ATTRIBUTE_TYPE, + FASHION_STYLE, + FASHION_STYLE_MAN, + FASHION_STYLE_WOMAN, + GENDER, + ITEM_COLOR, + ITEM_PATTERN, + MAIN_CATEGORY_CODE, + SOURCE, + SUB_CATEGORY_CODE, + SUB_CATEGORY_TO_MAIN +} from '../../../data/enums/ItemType'; +import {LabelModeType} from '../../../data/enums/LabelType'; +import {AttributeSelect} from '../../Common/AttributeSelect/AttributeSelect'; +import _ from 'lodash'; +import { + updateActiveColor, + updateActiveGender, + updateActiveHumanID, + updateActiveHumanType, + updateActiveMainCategory, + updateActivePattern, + updateActiveStyles, + updateActiveSubCategory, + updateImageDataById +} from '../../../store/labels/actionCreators'; + +import {vi as lang} from '../../../lang'; +import {GenericYesNoPopupDraggable} from '../GenericYesNoPopupDraggable/GenericYesNoPopupDraggable'; +import {JSONUploadStatus} from '../../../data/enums/JSONUploadStatus'; +import {Settings} from '../../../settings/Settings'; + +interface IProps { + labelRectId: string; + imageData: ImageData; + updateActivePopupTypeAction: (popupType: PopupWindowType) => any; + updateImageDataByIdAction: (id: string, newImageData: ImageData) => any; + updateActiveGenderAction: (gender: number) => any; + updateActiveHumanTypeAction: (humanType: number) => any; + updateActiveStylesAction: (styles: string[]) => any; + updateActiveHumanIDAction: (humanId: string) => any; + updateActiveMainCategoryAction: (mainCategory: number) => any; + updateActiveSubCategoryAction: (subCategory: number) => any; + updateActiveColorAction: (color: number) => any; + updateActivePatternAction: (pattern: number) => any; +} + +interface ISelectedItem { + [key: string]: any; +} + +const LabelInfoPopup: React.FC = ({ + labelRectId, + imageData, + updateActivePopupTypeAction, + updateImageDataByIdAction, + updateActiveGenderAction, + updateActiveHumanTypeAction, + updateActiveStylesAction, + updateActiveHumanIDAction, + updateActiveMainCategoryAction, + updateActiveSubCategoryAction, + updateActiveColorAction, + updateActivePatternAction +}) => { + const labelRect = LabelsSelector.getActiveRectLabel(); + const {id, mode} = labelRect; + const [humanInfo, setHumanInfo] = useState(); + const [itemInfo, setItemInfo] = useState(); + const [selectedItems, setSelectedItems] = useState({}); + const [gender, setGender] = useState(); + const [image, setImage] = useState(); + const [isFollowHumanSetting, setFollowHumanSetting] = useState(false); + + useEffect(() => { + if (mode === LabelModeType.HUMAN) { + const found = _.find(imageData.humans, {uuid: id}); + const foundGender = gender ? gender : found?.gender; + const genderStyles = + foundGender === GENDER.MAN + ? FASHION_STYLE_MAN + : FASHION_STYLE_WOMAN; + setHumanInfo(found); + setSelectedItems({ + [ATTRIBUTE_TYPE.SOURCE]: found.type, + [ATTRIBUTE_TYPE.GENDER]: foundGender, + [ATTRIBUTE_TYPE.FASHION_STYLE]: + found.styles.length > 0 + ? genderStyles.filter((style) => + found.styles.includes(style.name.toUpperCase()) + ) + : genderStyles.filter((style) => + imageData.guideStyles + .map((gs) => parseInt(gs.seq)) + .includes(style.seq) + ) + }); + } else { + const found = _.find(imageData.items, {uuid: id}); + setItemInfo(found); + const foundHuman = imageData.humans.find( + (human) => human.uuid === found.humanId + ); + setHumanInfo(foundHuman ? foundHuman : null); + const foundGender = gender + ? gender + : foundHuman?.gender + ? foundHuman.gender + : found?.gender; + + const genderStyles = + foundGender === GENDER.MAN + ? FASHION_STYLE_MAN + : FASHION_STYLE_WOMAN; + + setSelectedItems({ + [ATTRIBUTE_TYPE.HUMAN_ID]: found.humanId, + [ATTRIBUTE_TYPE.GENDER]: foundGender, + [ATTRIBUTE_TYPE.MAIN_CATEGORY]: found.mainCategory, + [ATTRIBUTE_TYPE.SUB_CATEGORY]: found.subCategory, + [ATTRIBUTE_TYPE.ITEM_COLOR]: found.color, + [ATTRIBUTE_TYPE.ITEM_PATTERN]: found.pattern, + [ATTRIBUTE_TYPE.FASHION_STYLE]: + (foundHuman ? foundHuman : found).styles.length > 0 + ? genderStyles.filter((style) => + found.styles.includes(style.name.toUpperCase()) + ) + : genderStyles.filter((style) => + imageData.guideStyles + .map((gs) => parseInt(gs.seq)) + .includes(style.seq) + ) + }); + } + + return () => { + // nothing + }; + }, [mode, gender]); + + useEffect(() => { + console.log('humanInfo = ', humanInfo); + setFollowHumanSetting(Boolean(humanInfo)); + }, [humanInfo]); + + const onSelect = (item: any, type: ATTRIBUTE_TYPE) => { + // const imageURL = item.label?.props?.children[0]?.props?.src; + setImage(null); + + switch (type) { + case ATTRIBUTE_TYPE.HUMAN_ID: { + const human = imageData.humans.find( + (human) => human.uuid === item + ); + + let composedGender; + let selectiveStyles; + + if (item === '-1' || !human) { + setHumanInfo(null); + composedGender = LabelsSelector.getActiveGender(); + selectiveStyles = LabelsSelector.getActiveStyles(); + } else { + setHumanInfo(human); + composedGender = human.gender; + selectiveStyles = human.styles; + } + + const genderStyles = + composedGender === GENDER.MAN + ? FASHION_STYLE_MAN + : FASHION_STYLE_WOMAN; + + const composedStyles = + selectiveStyles.length > 0 + ? genderStyles.filter((style) => + selectiveStyles.includes(style.name.toUpperCase()) + ) + : genderStyles.filter((style) => + imageData.guideStyles + .map((gs) => parseInt(gs.seq)) + .includes(style.seq) + ); + + setSelectedItems({ + ...selectedItems, + [type]: item, + [ATTRIBUTE_TYPE.GENDER]: composedGender, + [ATTRIBUTE_TYPE.FASHION_STYLE]: composedStyles + }); + break; + } + case ATTRIBUTE_TYPE.GENDER: { + setGender(item); + setSelectedItems({...selectedItems, [type]: item}); + break; + } + case ATTRIBUTE_TYPE.MAIN_CATEGORY: { + setSelectedItems({ + ...selectedItems, + [ATTRIBUTE_TYPE.MAIN_CATEGORY]: item, + [ATTRIBUTE_TYPE.SUB_CATEGORY]: SUB_CATEGORY_CODE.UNKNOWN + }); + break; + } + case ATTRIBUTE_TYPE.SUB_CATEGORY: { + setSelectedItems({ + ...selectedItems, + [ATTRIBUTE_TYPE.SUB_CATEGORY]: item + }); + break; + } + default: { + setSelectedItems({...selectedItems, [type]: item}); + } + } + }; + + const save = () => { + if (selectedItems[ATTRIBUTE_TYPE.FASHION_STYLE]?.length !== 1) { + alert(lang.ALERT.SELECT_ONE_STYLE); + return; + } + imageData.uploadStatus = JSONUploadStatus.NEED_UPLOAD; + + if (mode === LabelModeType.HUMAN) { + const updatedHumanInfo = { + ...humanInfo, + gender: selectedItems[ATTRIBUTE_TYPE.GENDER], + type: selectedItems[ATTRIBUTE_TYPE.SOURCE], + styles: selectedItems[ATTRIBUTE_TYPE.FASHION_STYLE].map( + (style) => style.name.toUpperCase() + ) + }; + // update active* + updateActiveGenderAction(updatedHumanInfo.gender); + updateActiveHumanTypeAction(updatedHumanInfo.type); + updateActiveStylesAction(updatedHumanInfo.styles); + + // update imageData + imageData.humans = imageData.humans.map((human) => + human.uuid === humanInfo.uuid ? updatedHumanInfo : human + ); + // console.log('next = ', updatedHumanInfo, imageData); + updateImageDataByIdAction(imageData.id, imageData); + } + if (mode === LabelModeType.ITEM) { + // console.log('selectedItems', selectedItems); + const updateItemInfo: ItemInfo = { + ...itemInfo, + humanId: selectedItems[ATTRIBUTE_TYPE.HUMAN_ID], + gender: selectedItems[ATTRIBUTE_TYPE.GENDER], + mainCategory: selectedItems[ATTRIBUTE_TYPE.MAIN_CATEGORY], + subCategory: selectedItems[ATTRIBUTE_TYPE.SUB_CATEGORY], + color: selectedItems[ATTRIBUTE_TYPE.ITEM_COLOR], + pattern: selectedItems[ATTRIBUTE_TYPE.ITEM_PATTERN], + styles: selectedItems[ATTRIBUTE_TYPE.FASHION_STYLE].map( + (style) => style.name.toUpperCase() + ) + }; + + // update active* + updateActiveGenderAction(updateItemInfo.gender); + updateActiveMainCategoryAction(updateItemInfo.mainCategory); + updateActiveSubCategoryAction(updateItemInfo.subCategory); + updateActiveColorAction(updateItemInfo.color); + updateActivePatternAction(updateItemInfo.pattern); + updateActiveStylesAction(updateItemInfo.styles); + updateActiveHumanIDAction(updateItemInfo.humanId); + + // update imageData + imageData.items = imageData.items.map((item) => + item.uuid === itemInfo.uuid ? updateItemInfo : item + ); + updateImageDataByIdAction(imageData.id, imageData); + } + updateActivePopupTypeAction(null); + }; + + const renderComment = () =>{ + const {qc_comment, qc_status} = itemInfo || humanInfo + + if(qc_comment) { + return ( +
+
{qc_comment}
+
+ ) + } + return null + } + + const renderContent = () => { + // console.log('humanInfo', humanInfo); + // console.log('itemInfo', itemInfo); + // console.log('selectedItems', selectedItems); + if (!humanInfo && !itemInfo) { + return null; + } + console.log('follow? ', isFollowHumanSetting); + return mode === LabelModeType.HUMAN ? ( +
+ {renderComment()} +
+
Gender
+
+ +
+
+
+
Human type
+
+ +
+
+
+
Styles
+
+ +
+
+ {image ? ( +
+ +
+ ) : null} + +
+ ) : ( +
+ {renderComment()} +
+
Item UUID
+
+
{labelRectId}
+
+
+ +
+
Linked Human ID
+
+ +
+
+
+
Gender
+
+ +
+
+
+
Main Category
+
+ +
+
+
+
+
Sub Category
+
+ +
+
+
+
Color
+
+ +
+
+
+
Pattern
+
+ +
+
+ +
+
Styles
+
+ +
+
+ {image ? ( +
+ +
+ ) : null} + +
+ ); + }; + + return ( + updateActivePopupTypeAction(null)} + /> + ); +}; + +const mapDispatchToProps = { + updateActivePopupTypeAction: updateActivePopupType, + updateImageDataByIdAction: updateImageDataById, + updateActiveGenderAction: updateActiveGender, + updateActiveHumanTypeAction: updateActiveHumanType, + updateActiveStylesAction: updateActiveStyles, + updateActiveHumanIDAction: updateActiveHumanID, + updateActiveMainCategoryAction: updateActiveMainCategory, + updateActiveSubCategoryAction: updateActiveSubCategory, + updateActiveColorAction: updateActiveColor, + updateActivePatternAction: updateActivePattern +}; + +const mapStateToProps = (state: AppState) => ({ + imageData: state.labels.imagesData[state.labels.activeImageIndex], + labelRectId: state.labels.activeLabelId +}); + +export default connect(mapStateToProps, mapDispatchToProps)(LabelInfoPopup); diff --git a/src/views/PopupView/LoadLabelNamesPopup/LoadLabelNamesPopup.tsx b/src/views/PopupView/LoadLabelNamesPopup/LoadLabelNamesPopup.tsx index 6810ccaa..3a556707 100644 --- a/src/views/PopupView/LoadLabelNamesPopup/LoadLabelNamesPopup.tsx +++ b/src/views/PopupView/LoadLabelNamesPopup/LoadLabelNamesPopup.tsx @@ -107,6 +107,7 @@ const LoadLabelNamesPopup: React.FC = ({updateActivePopupType, updateLab }; return( +
= ({updateActivePopupType, updateLab rejectLabel={"Create labels list"} onReject={onReject} /> +
); }; diff --git a/src/views/PopupView/LoadModelPopup/LoadModelPopup.tsx b/src/views/PopupView/LoadModelPopup/LoadModelPopup.tsx index 71d62e46..fb2877a7 100644 --- a/src/views/PopupView/LoadModelPopup/LoadModelPopup.tsx +++ b/src/views/PopupView/LoadModelPopup/LoadModelPopup.tsx @@ -124,6 +124,7 @@ export const LoadModelPopup: React.FC = () => { }; return ( +
{ onReject={onReject} disableRejectButton={modelIsLoadingStatus} /> +
); }; \ No newline at end of file diff --git a/src/views/PopupView/LoadMoreImagesPopup/LoadMoreImagesPopup.tsx b/src/views/PopupView/LoadMoreImagesPopup/LoadMoreImagesPopup.tsx index d9273ea2..b1cbfbe9 100644 --- a/src/views/PopupView/LoadMoreImagesPopup/LoadMoreImagesPopup.tsx +++ b/src/views/PopupView/LoadMoreImagesPopup/LoadMoreImagesPopup.tsx @@ -73,6 +73,7 @@ const LoadMoreImagesPopup: React.FC = ({addImageData}) => { }; return( +
= ({addImageData}) => { rejectLabel={"Cancel"} onReject={onReject} /> +
); }; diff --git a/src/views/PopupView/LoginPopup/LoginPopup.scss b/src/views/PopupView/LoginPopup/LoginPopup.scss new file mode 100644 index 00000000..e5d17039 --- /dev/null +++ b/src/views/PopupView/LoginPopup/LoginPopup.scss @@ -0,0 +1,89 @@ +@import '../../../settings//Settings'; +@keyframes mymove { + from { left: 0px; opacity: 0.8; } + to { right: 0px; } + } +.LoginPopupContent { + align-self: stretch; + flex: 1; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: center; + align-content: flex-start; + min-height: 100px; + width: 100%; + &__parent{ + position: relative; + } + &__move{ + position: absolute; + top: 0px; + right: 0px; + animation: mymove 1s ease-in; + z-index: 100; + + } + &__icon{ + position: absolute; + top: 22px; + left: 20px; + z-index: 100; + } + .MuiInputBase-input { + background: #FFFF; + border-radius: 9.73271px; + height: 65px ; + max-height: 65px; + width: 100%; + padding: 0px 50px; + color: #000000 !important; + &::placeholder{ + color: #BABABA; + font-weight: 400; + font-size: 14.5991px; + line-height: 18px; + } + } + .MuiInput-underline{ + &::after{ + display: none !important; + } + &::before{ + display: none !important; + } + } + + &__label{ + font-style: normal; + font-weight: 400; + font-size: 16.2212px; + line-height: 20px; + color: #000000; + margin-bottom: 12px; + } +} + +.LoginPopupInputContainer { + width: 100%; + padding-bottom: 25px; + +} + +.LoginPopupInput { + color: white; +} +.LoginPopupMessage { + color: white; +} + +.LoginPopupInputName { + display: flex; + flex: 1; + align-self: stretch; + color: white; + font-size: 15px; + padding: 0 40px 30px 40px; + border-bottom: solid 1px $darkThemeFirstColor; +} diff --git a/src/views/PopupView/LoginPopup/LoginPopup.tsx b/src/views/PopupView/LoginPopup/LoginPopup.tsx new file mode 100644 index 00000000..93fb3741 --- /dev/null +++ b/src/views/PopupView/LoginPopup/LoginPopup.tsx @@ -0,0 +1,136 @@ +import React, {useEffect, useState} from 'react'; +import './LoginPopup.scss'; +import {Input} from '@material-ui/core'; +import {connect} from 'react-redux'; +import {AppState} from '../../../store'; +import {updateAuthData} from '../../../store/auth/actionCreators'; +import {updateActivePopupType} from '../../../store/general/actionCreators'; +import {GenericYesNoPopup} from '../GenericYesNoPopup/GenericYesNoPopup'; +import {AuthData} from '../../../store/auth/types'; +import {ClipLoader} from 'react-spinners'; +import {CSSHelper} from '../../../logic/helpers/CSSHelper'; +import {APIService} from '../../../services/API'; +import {PopupWindowType} from '../../../data/enums/PopupWindowType'; +import WrapperLogin from "../../../components/WrapperLogin/index" +import {CodiconAccount, Eye, MoveIcon} from "../../../assets/icons" + +interface IProps { + updateAuthDataAction: (authData: AuthData) => any; + updateActivePopupTypeAction: (type: PopupWindowType) => any; +} + +const LoginPopup: React.FC = ({ + updateAuthDataAction, + updateActivePopupTypeAction +}) => { + const [isLoadingStatus, setIsLoadingStatus] = useState(false); + const [email, setEmail] = useState(); + const [password, setPassword] = useState(); + const [message, setMessage] = useState(); + + useEffect(() => { + setMessage(''); + + return () => { + // do nothing + }; + }, [email, password]); + + const renderContent = () => ( +
+
+ +
+ + setEmail(e.target.value)} + inputProps={{style: {color: 'white'}}} + /> +
+
+
+ +
+ + + setPassword(e.target.value)} + /> +
+
+
+ {isLoadingStatus ? ( + + ) : ( + message + )} +
+
+ ); + + const doLogin = async () => { + try { + setIsLoadingStatus(true); + const {data} = await APIService.login({email, password}); + // console.log('result.data', data); + if (data.code === 200) { + const {displayName, role, token: authToken} = data.data; + updateAuthDataAction({ + email, + displayName, + authToken, + role + }); + window.localStorage.setItem( + '@@auth', + JSON.stringify({email, displayName, authToken, role}) + ); + setTimeout(() => { + window.location.href = `${process.env.REACT_APP_API_ROOT || "/labeler"}` + }, 1000) + } else if (data.errors) { + setMessage(data.errors.map((error) => error.error['en']).join('\n')); + } + } catch (error) { + console.error('failed to login: ', error); + } finally { + setIsLoadingStatus(false); + } + }; + + return ( +
+ + alert('Login required!')} + /> + +
+ ); +}; + +const mapDispatchToProps = { + updateAuthDataAction: updateAuthData, + updateActivePopupTypeAction: updateActivePopupType +}; + +const mapStateToProps = (state: AppState) => ({ + authData: state.auth.authData +}); + +export default connect(mapStateToProps, mapDispatchToProps)(LoginPopup); diff --git a/src/views/PopupView/LogoutPopup/LogoutPopup.scss b/src/views/PopupView/LogoutPopup/LogoutPopup.scss new file mode 100644 index 00000000..508544df --- /dev/null +++ b/src/views/PopupView/LogoutPopup/LogoutPopup.scss @@ -0,0 +1,20 @@ +@import '../../../settings/Settings'; + +.LogoutPopupContent { + align-self: stretch; + flex: 1; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: center; + align-content: flex-start; + padding-top: 30px; + + .Message { + align-self: stretch; + color: white; + font-size: 15px; + padding: 0 40px 30px 40px; + } +} diff --git a/src/views/PopupView/LogoutPopup/LogoutPopup.tsx b/src/views/PopupView/LogoutPopup/LogoutPopup.tsx new file mode 100644 index 00000000..f20fc487 --- /dev/null +++ b/src/views/PopupView/LogoutPopup/LogoutPopup.tsx @@ -0,0 +1,105 @@ +import React from 'react'; +import './LogoutPopup.scss'; +import {GenericYesNoPopup} from '../GenericYesNoPopup/GenericYesNoPopup'; +import { + updateActiveImageIndex, + updateActiveLabelNameId, + updateFirstLabelCreatedFlag, + updateImageData, + updateLabelNames +} from '../../../store/labels/actionCreators'; +import {AppState} from '../../../store'; +import {connect} from 'react-redux'; +import {ImageData, LabelName} from '../../../store/labels/types'; +import {PopupActions} from '../../../logic/actions/PopupActions'; +import {ProjectData} from '../../../store/general/types'; +import { + updateActivePopupType, + updateProjectData +} from '../../../store/general/actionCreators'; +import {updateAuthData} from '../../../store/auth/actionCreators'; +import {AuthData} from '../../../store/auth/types'; +import {PopupWindowType} from '../../../data/enums/PopupWindowType'; +import WrapperLogin from "../../../components/WrapperLogin/index" +interface IProps { + updateActiveImageIndex: (activeImageIndex: number) => any; + updateActiveLabelNameId: (activeLabelId: string) => any; + updateLabelNames: (labelNames: LabelName[]) => any; + updateImageData: (imageData: ImageData[]) => any; + updateFirstLabelCreatedFlag: (firstLabelCreatedFlag: boolean) => any; + updateProjectData: (projectData: ProjectData) => any; + updateAuthDataAction: (authData: AuthData) => any; + updateActivePopupType: (type: PopupWindowType) => any; +} + +const LogoutPopup: React.FC = (props) => { + const { + updateActiveLabelNameId, + updateLabelNames, + updateActiveImageIndex, + updateImageData, + updateFirstLabelCreatedFlag, + updateProjectData, + updateAuthDataAction + } = props; + + const renderContent = () => { + return ( +
+
+ Are you sure you want to logout? You will permanently lose + all your progress. +
+
+ ); + }; + + const onAccept = () => { + updateAuthDataAction({ + email: null, + displayName: null, + authToken: null, + role: null + }); + window.localStorage.removeItem('@@auth'); + updateActiveLabelNameId(null); + updateLabelNames([]); + updateProjectData({type: null, name: 'my-project-name'}); + updateActiveImageIndex(null); + updateImageData([]); + updateFirstLabelCreatedFlag(false); + PopupActions.close(); + }; + + const onReject = () => { + PopupActions.close(); + }; + + return ( +
+ +
+ ); +}; + +const mapDispatchToProps = { + updateActiveLabelNameId, + updateLabelNames, + updateProjectData, + updateActiveImageIndex, + updateImageData, + updateFirstLabelCreatedFlag, + updateAuthDataAction: updateAuthData, + updateActivePopupType +}; + +const mapStateToProps = (state: AppState) => ({}); + +export default connect(mapStateToProps, mapDispatchToProps)(LogoutPopup); diff --git a/src/views/PopupView/PerformancePopup/PerformancePopup.scss b/src/views/PopupView/PerformancePopup/PerformancePopup.scss new file mode 100644 index 00000000..de22356b --- /dev/null +++ b/src/views/PopupView/PerformancePopup/PerformancePopup.scss @@ -0,0 +1,33 @@ +@import '../../../settings/Settings'; + +.PerformancePopupContent { + display: flex; + padding: 10px; + color: white; + width: 100%; + justify-content: flex-start; + flex-direction: column; + overflow: auto; +} + +table { + width: 100%; +} + +th { + background-color: rgba($color: yellow, $alpha: 0.7); + color: $darkThemeFirstColor; + border: 1px solid $darkThemeFirstColor; + text-align: center; +} +tr, +td { + border: 1px solid lightgray; + text-align: center; +} + +.Title { + text-align: center; + font-size: 1.5em; + font-weight: bold; +} diff --git a/src/views/PopupView/PerformancePopup/PerformancePopup.tsx b/src/views/PopupView/PerformancePopup/PerformancePopup.tsx new file mode 100644 index 00000000..3c3bcdc8 --- /dev/null +++ b/src/views/PopupView/PerformancePopup/PerformancePopup.tsx @@ -0,0 +1,170 @@ +import {PopupWindowType} from 'data/enums/PopupWindowType'; +import React, {useEffect} from 'react'; +import {connect} from 'react-redux'; +import {APIService} from 'services/API'; +import {AppState} from 'store'; +import {updateActivePopupType} from 'store/general/actionCreators'; +import { + updateCommonSummary, + updateTasks +} from 'store/performance/actionCreators'; +import {CommonSummary, Task} from 'store/performance/types'; +import {GenericYesNoPopupDraggable} from '../GenericYesNoPopupDraggable/GenericYesNoPopupDraggable'; +import './PerformancePopup.scss'; + +interface IProps { + tasks: Task[]; + commonSummary: CommonSummary; + updateTasksDataAction: (data: Task[]) => any; + updateActivePopupTypeAction: (popupType: PopupWindowType) => any; + updateCommonSummaryAction: (data: CommonSummary) => any; +} + +const PerformancePopup: React.FC = ({ + tasks, + commonSummary, + updateTasksDataAction, + updateActivePopupTypeAction, + updateCommonSummaryAction +}) => { + useEffect(() => { + loadTasks(); + loadSummary(); + }, []); + + const loadTasks = async () => { + try { + const {data} = await APIService.getTasks(); + updateTasksDataAction(data.tasks); + } catch (error) { + console.error('failed to loadTasks: ', error); + } + }; + + const loadSummary = async () => { + try { + const {data} = await APIService.getSummary(); + const { + total_images: total, + labeled_images: labeled, + unchecked_images: unchecked, + waiting_qc_images: waitingQC, + passed_images: passed, + rejected_images: rejected + } = data.data; + + const commonSummary: CommonSummary = { + images: { + total, + labeled, + unchecked, + waitingQC, + passed, + rejected + } + }; + updateCommonSummaryAction(commonSummary); + } catch (error) { + console.error('failed to loadSummary: ', error); + } + }; + + const renderContent = () => { + const { + images: {total, labeled, unchecked, waitingQC, passed, rejected} + } = commonSummary; + + return ( +
+
+
Tasks
+ + + + + + + + + + + + + + + + + + {tasks.map((task, index) => ( + + + + + + + + + + ))} + +
Display NameImagesLabels
8H1HMin8H1HMin
{task.name}{task.imagesTPD}{task.imagesTPH}{task.averageTimePerImage}{task.labeledTPD}{task.labeledTPH}{task.averageTimePerLabeled}
+
+ Summary +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Number of Images
totallabeleduncheckedwaitingQCpassedrejected
{total}{labeled}{unchecked}{waitingQC}{passed}{rejected}
+
+
+ ); + }; + + return ( + { + loadTasks(); + loadSummary(); + }} + rejectLabel="Close" + onReject={() => updateActivePopupTypeAction(null)} + /> + ); +}; + +const mapDispatchToProps = { + updateActivePopupTypeAction: updateActivePopupType, + updateTasksDataAction: updateTasks, + updateCommonSummaryAction: updateCommonSummary +}; + +const mapStateToProps = (state: AppState) => ({ + tasks: state.performance.tasks, + commonSummary: state.performance.commonSummary +}); + +export default connect(mapStateToProps, mapDispatchToProps)(PerformancePopup); diff --git a/src/views/PopupView/PopupView.tsx b/src/views/PopupView/PopupView.tsx index 700b47b5..076b78cd 100644 --- a/src/views/PopupView/PopupView.tsx +++ b/src/views/PopupView/PopupView.tsx @@ -1,27 +1,35 @@ import React from 'react'; import './PopupView.scss'; -import { PopupWindowType } from "../../data/enums/PopupWindowType"; -import { AppState } from "../../store"; -import { connect } from "react-redux"; -import LoadLabelsPopup from "./LoadLabelNamesPopup/LoadLabelNamesPopup"; -import InsertLabelNamesPopup from "./InsertLabelNamesPopup/InsertLabelNamesPopup"; -import ExitProjectPopup from "./ExitProjectPopup/ExitProjectPopup"; -import LoadMoreImagesPopup from "./LoadMoreImagesPopup/LoadMoreImagesPopup"; -import { LoadModelPopup } from "./LoadModelPopup/LoadModelPopup"; -import SuggestLabelNamesPopup from "./SuggestLabelNamesPopup/SuggestLabelNamesPopup"; -import { CSSHelper } from "../../logic/helpers/CSSHelper"; -import { ClipLoader } from "react-spinners"; -import ImportLabelPopup from "./ImportLabelPopup/ImportLabelPopup"; -import ExportLabelPopup from "./ExportLabelsPopup/ExportLabelPopup"; +import {PopupWindowType} from '../../data/enums/PopupWindowType'; +import {AppState} from '../../store'; +import {connect} from 'react-redux'; +import LoadLabelsPopup from './LoadLabelNamesPopup/LoadLabelNamesPopup'; +import InsertLabelNamesPopup from './InsertLabelNamesPopup/InsertLabelNamesPopup'; +import ExitProjectPopup from './ExitProjectPopup/ExitProjectPopup'; +import LoadMoreImagesPopup from './LoadMoreImagesPopup/LoadMoreImagesPopup'; +import {LoadModelPopup} from './LoadModelPopup/LoadModelPopup'; +import SuggestLabelNamesPopup from './SuggestLabelNamesPopup/SuggestLabelNamesPopup'; +import {CSSHelper} from '../../logic/helpers/CSSHelper'; +import {ClipLoader} from 'react-spinners'; +import ImportLabelPopup from './ImportLabelPopup/ImportLabelPopup'; +import ExportLabelPopup from './ExportLabelsPopup/ExportLabelPopup'; +import LabelInfoPopup from './LabelInfoPopup/LabelInfoPopup'; +import LoginPopup from './LoginPopup/LoginPopup'; +import LogoutPopup from './LogoutPopup/LogoutPopup'; +import DeleteConfirmPopup from './DeleteConfirmPopup/DeleteConfirmPopup'; +import PerformancePopup from './PerformancePopup/PerformancePopup'; interface IProps { activePopupType: PopupWindowType; } -const PopupView: React.FC = ({ activePopupType }) => { - +const PopupView: React.FC = ({activePopupType}) => { const selectPopup = () => { switch (activePopupType) { + case PopupWindowType.LOGIN: + return ; + case PopupWindowType.LOGOUT: + return ; case PopupWindowType.LOAD_LABEL_NAMES: return ; case PopupWindowType.EXPORT_ANNOTATIONS: @@ -29,13 +37,11 @@ const PopupView: React.FC = ({ activePopupType }) => { case PopupWindowType.IMPORT_ANNOTATIONS: return ; case PopupWindowType.INSERT_LABEL_NAMES: - return ; + return ; case PopupWindowType.UPDATE_LABEL: - return ; + return ; + case PopupWindowType.LABEL_INFO: + return ; case PopupWindowType.EXIT_PROJECT: return ; case PopupWindowType.IMPORT_IMAGES: @@ -44,28 +50,28 @@ const PopupView: React.FC = ({ activePopupType }) => { return ; case PopupWindowType.SUGGEST_LABEL_NAMES: return ; + case PopupWindowType.DELETE_CONFIRM: + return ; case PopupWindowType.LOADER: - return ; + return ( + + ); + case PopupWindowType.PERFORMANCE: + return ; default: - return null; + return ; } }; - return ( - activePopupType &&
- {selectPopup()} -
- ); + return activePopupType &&
{selectPopup()}
; }; const mapStateToProps = (state: AppState) => ({ activePopupType: state.general.activePopupType }); -export default connect( - mapStateToProps -)(PopupView); \ No newline at end of file +export default connect(mapStateToProps)(PopupView); diff --git a/src/views/PopupView/SuggestLabelNamesPopup/SuggestLabelNamesPopup.tsx b/src/views/PopupView/SuggestLabelNamesPopup/SuggestLabelNamesPopup.tsx index faeb566b..46e73a84 100644 --- a/src/views/PopupView/SuggestLabelNamesPopup/SuggestLabelNamesPopup.tsx +++ b/src/views/PopupView/SuggestLabelNamesPopup/SuggestLabelNamesPopup.tsx @@ -185,6 +185,7 @@ const SuggestLabelNamesPopup: React.FC = ( }; return( +
= ( rejectLabel={'Reject'} onReject={onReject} /> +
); }; diff --git a/tsconfig.json b/tsconfig.json index d082ce90..b1b7e087 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { - "target": "es5", + "target": "ES6", + "baseUrl": "src", "downlevelIteration": true, "lib": [ "dom", @@ -28,6 +29,6 @@ "noFallthroughCasesInSwitch": true }, "include": [ - "src" + "src", ] -} +} \ No newline at end of file diff --git a/tslint.json b/tslint.json index a6b9d34e..8937c684 100644 --- a/tslint.json +++ b/tslint.json @@ -14,3 +14,4 @@ ] } } +∏ \ No newline at end of file