From 366e5596bb32a99f91d8bfe59977dcaa49e874f0 Mon Sep 17 00:00:00 2001 From: chenqiang Date: Thu, 28 Aug 2025 01:26:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E8=BF=81=E7=A7=BB=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E5=81=9A=E4=BA=86welcome=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- babel.config.js | 12 +- package-lock.json | 1159 ++++++++++---------- package.json | 7 +- public/favicon.ico | Bin 4286 -> 270398 bytes public/favicon.png | Bin 0 -> 113947 bytes src/App.vue | 17 - src/assets/base.css | 31 + src/assets/bg.jpeg | Bin 0 -> 19019 bytes src/assets/logo.png | Bin 6849 -> 12865 bytes src/assets/logo.svg | 1 + src/assets/main.css | 1 + src/background/db/exam.js | 136 +++ src/background/db/examinee.js | 190 ++++ src/background/db/examing.js | 1175 +++++++++++++++++++++ src/background/main.js | 63 +- src/background/service/examService.js | 262 +++++ src/background/service/examineeService.js | 187 ++++ src/background/service/examingService.js | 499 +++++++++ src/background/service/fileService.js | 849 +++++++++++++++ src/background/service/questionService.js | 2 +- src/components/HelloWorld.vue | 59 -- src/components/common/Footer.vue | 53 + src/components/common/Header.vue | 36 + src/components/common/Loading.vue | 52 + src/preload.js | 35 + src/router/index.js | 14 +- src/store/index.js | 10 + src/views/About.vue | 5 - src/views/Home.vue | 627 ----------- src/views/WelcomeView.vue | 325 ++++++ vue.config.js | 31 +- 31 files changed, 4507 insertions(+), 1331 deletions(-) create mode 100644 public/favicon.png create mode 100644 src/assets/base.css create mode 100644 src/assets/bg.jpeg create mode 100644 src/assets/logo.svg create mode 100644 src/assets/main.css create mode 100644 src/background/db/exam.js create mode 100644 src/background/db/examinee.js create mode 100644 src/background/db/examing.js create mode 100644 src/background/service/examService.js create mode 100644 src/background/service/examineeService.js create mode 100644 src/background/service/examingService.js create mode 100644 src/background/service/fileService.js delete mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/common/Footer.vue create mode 100644 src/components/common/Header.vue create mode 100644 src/components/common/Loading.vue delete mode 100644 src/views/About.vue delete mode 100644 src/views/Home.vue create mode 100644 src/views/WelcomeView.vue diff --git a/babel.config.js b/babel.config.js index e955840..e5fda6f 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,5 +1,15 @@ module.exports = { presets: [ - '@vue/cli-plugin-babel/preset' + '@vue/cli-plugin-babel/preset', + ['@babel/preset-env', { + targets: { + node: 'current', + browsers: ['> 1%', 'last 2 versions', 'not dead'] + } + }] + ], + plugins: [ + '@babel/plugin-proposal-optional-chaining', + '@babel/plugin-proposal-class-properties' ] } diff --git a/package-lock.json b/package-lock.json index 9a5a3dc..fca40ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,6 +71,12 @@ "semver": "^6.3.1" }, "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "debug": { "version": "4.4.1", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", @@ -123,15 +129,6 @@ "semver": "^6.3.1" }, "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", @@ -408,6 +405,17 @@ "@babel/plugin-syntax-decorators": "^7.27.1" } }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -459,6 +467,15 @@ "@babel/helper-plugin-utils": "^7.27.1" } }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", @@ -1578,12 +1595,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -1766,14 +1777,6 @@ "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", "dev": true }, - "@swc/helpers": { - "version": "0.3.17", - "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.3.17.tgz", - "integrity": "sha512-tb7Iu+oZ+zWJZ3HJqwx8oNwSDIU440hmVMDPhpACWQWnrZHK99Bxs70gT1L2dnr5Hg50ZRWEFkQCAnOVVV0z1Q==", - "requires": { - "tslib": "^2.4.0" - } - }, "@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -2026,14 +2029,6 @@ "dev": true, "requires": { "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@types/webpack": { @@ -2048,14 +2043,6 @@ "@types/webpack-sources": "*", "anymatch": "^3.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@types/webpack-dev-server": { @@ -2385,12 +2372,6 @@ "integrity": "sha512-DUmfdkG3pCdkP7Iznd87RfE9Qm42mgp2hcrNcYQYSru1W1gX2dG/JcW8bxmeGSa06lsxi9LEIc/QD1yPajSCZw==", "dev": true }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2591,15 +2572,6 @@ "chalk": "^2.0.1" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -2722,6 +2694,17 @@ "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" + }, + "dependencies": { + "magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + } } }, "@vue/compiler-ssr": { @@ -2767,6 +2750,15 @@ "yallist": "^2.1.2" } }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, "picocolors": { "version": "0.2.1", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz", @@ -2783,12 +2775,6 @@ "source-map": "^0.6.1" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", @@ -3026,16 +3012,24 @@ } }, "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "address": { "version": "1.2.2", @@ -3117,6 +3111,12 @@ "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", "dev": true }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "optional": true + }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/ansi-align/-/ansi-align-3.0.1.tgz", @@ -3351,6 +3351,7 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, "requires": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -3362,6 +3363,11 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz", @@ -3481,6 +3487,58 @@ "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true }, + "ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha512-e/JfLiSoakfmL4wmTGPjv0HpTICVmxwXgYOB8x+mzozHL8v+dSfCbrJ8J8hJ0YBP0XcYu1aLZ6b/3TnxNK3P2A==", + "requires": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + }, + "dependencies": { + "escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha512-yLy3Cc+zAC0WSmoT2fig3J87TpQ8UaZGx8ahCAs9FL8qNbyV7CVyPKS74DG4bsHiL5ew9sxdYx131OkBQMFnvA==", + "requires": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.30" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha512-FpCjJDfmo3vsc/1zKSeqR5k42tcIhxFIlvq+h9j0fO2q/h2uLKyweq7rYJ+0CoVvrGQOxIS5wyBrW/+vF58BUQ==" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha512-x/iYH53X3quDwfHRz4y8rn4XcEwwCJeWsul9pF1zldMbGtgOtMNBEOuYWwB1EQlK2LRa1fev3YAgym/RElp5Cg==" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmmirror.com/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha512-RIOpVnVlltB6PcBJ5BMLx+H+6JJ/zjDGU0t7f0L6c2M1dqcK92VQopLBlPQ9R80AVXelfqYgjcPLtHtDbNFg0Q==" + }, "async": { "version": "3.2.6", "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", @@ -3567,12 +3625,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -3580,6 +3632,7 @@ "version": "1.0.7", "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, "requires": { "possible-typed-array-names": "^1.0.0" } @@ -4011,6 +4064,17 @@ } } }, + "brfs": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brfs/-/brfs-2.0.2.tgz", + "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^3.0.2", + "through2": "^2.0.0" + } + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz", @@ -4025,6 +4089,21 @@ "base64-js": "^1.1.2" } }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmmirror.com/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" + } + } + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -4062,6 +4141,16 @@ "safe-buffer": "^5.1.2" } }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha512-VrhjbZ+Ba5mDiSYEuPelekQMfTbhcA2DhLk2VQWqdcCROWeFqlTcXZ7yfRkXCIl8E+g4gINJYJiRB7WEtfomAQ==", + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + } + }, "browserify-rsa": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz", @@ -4114,6 +4203,14 @@ "dev": true, "requires": { "pako": "~1.0.5" + }, + "dependencies": { + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + } } }, "browserslist": { @@ -4144,11 +4241,15 @@ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof": { "version": "1.1.1", @@ -4309,6 +4410,12 @@ "once": "^1.3.0" } }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, "minimatch": { "version": "5.1.6", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", @@ -4743,14 +4850,6 @@ "dev": true, "requires": { "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "clean-stack": { @@ -4930,8 +5029,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" }, "clone-response": { "version": "1.0.3", @@ -5166,7 +5264,6 @@ "version": "1.6.2", "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5255,10 +5352,9 @@ "dev": true }, "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "cookie": { "version": "0.7.1", @@ -5428,15 +5524,6 @@ "path-exists": "^3.0.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", @@ -5642,9 +5729,9 @@ } }, "crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-3.3.0.tgz", + "integrity": "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q==" }, "crypto-random-string": { "version": "2.0.0", @@ -5683,12 +5770,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -5754,12 +5835,6 @@ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -5789,14 +5864,6 @@ "requires": { "mdn-data": "2.0.4", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "css-what": { @@ -5838,12 +5905,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -5900,12 +5961,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -5945,12 +6000,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -5984,12 +6033,6 @@ "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -5999,6 +6042,20 @@ "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", "dev": true }, + "d": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "requires": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + } + }, + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", @@ -6088,7 +6145,6 @@ "version": "1.1.2", "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz", "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dev": true, "requires": { "is-arguments": "^1.1.1", "is-date-object": "^1.0.5", @@ -6103,6 +6159,11 @@ "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, "deepmerge": { "version": "1.5.2", "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz", @@ -6507,6 +6568,14 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz", @@ -6967,29 +7036,6 @@ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, "es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -7021,6 +7067,17 @@ "is-symbol": "^1.0.4" } }, + "es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz", @@ -7028,6 +7085,51 @@ "dev": true, "optional": true }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + } + }, + "es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "requires": { + "d": "^1.0.2", + "ext": "^1.7.0" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", @@ -7052,6 +7154,18 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -7062,11 +7176,21 @@ "estraverse": "^4.1.1" } }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esrecurse": { "version": "4.3.0", @@ -7088,8 +7212,12 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==" }, "estree-walker": { "version": "2.0.2", @@ -7100,8 +7228,7 @@ "esutils": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -7109,6 +7236,15 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "event-pubsub": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz", @@ -7339,6 +7475,14 @@ } } }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", @@ -7496,6 +7640,11 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, "faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz", @@ -7687,62 +7836,28 @@ "dev": true }, "fontkit": { - "version": "1.9.0", - "resolved": "https://registry.npmmirror.com/fontkit/-/fontkit-1.9.0.tgz", - "integrity": "sha512-HkW/8Lrk8jl18kzQHvAw9aTHe1cqsyx5sDnxncx652+CIfhawokEPkeM3BoIC+z/Xv7a0yMr0f3pRRwhGH455g==", + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/fontkit/-/fontkit-1.8.1.tgz", + "integrity": "sha512-BsNCjDoYRxmNWFdAuK1y9bQt+igIxGtTC9u/jSFjR9MKhmI00rP1fwSvERt+5ddE82544l0XH5mzXozQVUy2Tw==", "requires": { - "@swc/helpers": "^0.3.13", - "brotli": "^1.3.2", - "clone": "^2.1.2", - "deep-equal": "^2.0.5", + "babel-runtime": "^6.26.0", + "brfs": "^2.0.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.1", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", "dfa": "^1.2.0", - "restructure": "^2.0.1", - "tiny-inflate": "^1.0.3", - "unicode-properties": "^1.3.1", - "unicode-trie": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, - "deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } + "restructure": "^0.5.3", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^0.3.0" } }, "for-each": { "version": "0.3.5", "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, "requires": { "is-callable": "^1.2.7" } @@ -7965,6 +8080,11 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -8228,8 +8348,7 @@ "has": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==" }, "has-ansi": { "version": "2.0.0", @@ -8243,7 +8362,8 @@ "has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==" + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -8788,12 +8908,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -8987,6 +9101,7 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, "requires": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -9045,6 +9160,7 @@ "version": "3.0.5", "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -9074,6 +9190,7 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, "requires": { "has-bigints": "^1.0.2" } @@ -9091,6 +9208,7 @@ "version": "1.2.2", "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, "requires": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9105,7 +9223,8 @@ "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true }, "is-ci": { "version": "2.0.0", @@ -9134,7 +9253,6 @@ "version": "2.16.1", "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "requires": { "hasown": "^2.0.2" } @@ -9273,7 +9391,8 @@ "is-map": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true }, "is-negative-zero": { "version": "2.0.3", @@ -9311,6 +9430,7 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, "requires": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9381,12 +9501,14 @@ "is-set": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true }, "is-shared-array-buffer": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, "requires": { "call-bound": "^1.0.3" } @@ -9401,6 +9523,7 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, "requires": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9410,6 +9533,7 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, "requires": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -9440,7 +9564,8 @@ "is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true }, "is-weakref": { "version": "1.1.1", @@ -9455,6 +9580,7 @@ "version": "2.0.4", "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, "requires": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -9535,11 +9661,6 @@ "supports-color": "^7.0.0" } }, - "jpeg-exif": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/jpeg-exif/-/jpeg-exif-1.1.4.tgz", - "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==" - }, "jquery": { "version": "3.5.1", "resolved": "https://registry.npmmirror.com/jquery/-/jquery-3.5.1.tgz", @@ -9653,6 +9774,14 @@ "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" + }, + "dependencies": { + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + } } }, "keyv": { @@ -9710,6 +9839,15 @@ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "lie": { "version": "3.3.0", "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz", @@ -9732,6 +9870,15 @@ "version": "0.0.8", "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-0.0.8.tgz", "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==" + }, + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } } } }, @@ -9850,18 +9997,20 @@ "dev": true }, "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "magic-string": { - "version": "0.30.18", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.18.tgz", - "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "requires": { + "sourcemap-codec": "^1.4.1" } }, "make-dir": { @@ -9905,6 +10054,12 @@ "ssri": "^9.0.0" }, "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, "minipass": { "version": "3.3.6", "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", @@ -10001,19 +10156,17 @@ "dev": true }, "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", "requires": { - "source-map": "^0.6.1" + "source-map": "^0.5.6" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" } } }, @@ -10494,6 +10647,11 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", @@ -11036,6 +11194,7 @@ "version": "4.1.7", "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -11143,6 +11302,19 @@ "is-wsl": "^1.1.0" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", @@ -11420,10 +11592,9 @@ } }, "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "version": "0.2.9", + "resolved": "https://registry.npmmirror.com/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" }, "parallel-transform": { "version": "1.2.0", @@ -11552,8 +11723,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.12", @@ -11632,13 +11802,12 @@ } }, "pdfkit": { - "version": "0.15.0", - "resolved": "https://registry.npmmirror.com/pdfkit/-/pdfkit-0.15.0.tgz", - "integrity": "sha512-Z0dx0sEPKLW2kbThS1SWZ0iSHlRPoFMpP+oSjNrtwRjsfGivwE+r6emyEFwQG/fx1Ri0AGUHmDcGOSMMlLLnSg==", + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/pdfkit/-/pdfkit-0.11.0.tgz", + "integrity": "sha512-1s9gaumXkYxcVF1iRtSmLiISF2r4nHtsTgpwXiK8Swe+xwk/1pm8FJjYqN7L3x13NsWnGyUFntWcO8vfqq+wwA==", "requires": { - "crypto-js": "^4.2.0", - "fontkit": "^1.8.1", - "jpeg-exif": "^1.1.4", + "crypto-js": "^3.1.9-1", + "fontkit": "^1.8.0", "linebreak": "^1.0.2", "png-js": "^1.0.0" } @@ -11746,7 +11915,8 @@ "possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==" + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true }, "postcss": { "version": "8.5.6", @@ -11785,12 +11955,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -11828,12 +11992,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -11868,12 +12026,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -11901,12 +12053,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -11934,12 +12080,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -11967,12 +12107,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12000,12 +12134,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12077,12 +12205,6 @@ "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12119,12 +12241,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12168,12 +12284,6 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12208,12 +12318,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12250,12 +12354,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12294,12 +12392,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12341,12 +12433,6 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12374,12 +12460,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12410,12 +12490,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12444,12 +12518,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12478,12 +12546,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12511,12 +12573,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12552,12 +12608,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12594,12 +12644,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12636,12 +12680,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12677,12 +12715,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12718,12 +12750,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12759,12 +12785,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12807,12 +12827,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12847,12 +12861,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12888,12 +12896,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12924,12 +12926,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -12966,12 +12962,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -13017,12 +13007,6 @@ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -13052,12 +13036,6 @@ "picocolors": "^0.2.1", "source-map": "^0.6.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -13067,6 +13045,11 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/prepend-http/-/prepend-http-1.0.4.tgz", @@ -13271,6 +13254,16 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", @@ -13637,7 +13630,6 @@ "version": "1.22.10", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, "requires": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -13691,9 +13683,12 @@ } }, "restructure": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/restructure/-/restructure-2.0.1.tgz", - "integrity": "sha512-e0dOpjm5DseomnXx2M5lpdZ5zoHqF1+bqdMJUohoYVVQa7cBdnk7fdmeI6byNWP/kiME72EeTiSypTCVnpLiDg==" + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/restructure/-/restructure-0.5.4.tgz", + "integrity": "sha512-wgNbkrlRpj0NarhUyiCfOXlu8DybDIYRV7MOieKGOl16N7NmAkjTtPhn2F4CBOsyRL8m6RWZLSzjJVVPAkJuiw==", + "requires": { + "browserify-optional": "^1.0.0" + } }, "ret": { "version": "0.1.15", @@ -13827,6 +13822,7 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -13863,6 +13859,20 @@ "ajv-keywords": "^3.5.2" } }, + "scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz", @@ -14161,6 +14171,11 @@ } } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", @@ -14192,6 +14207,7 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, "requires": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -14204,6 +14220,7 @@ "version": "1.0.0", "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, "requires": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -14213,6 +14230,7 @@ "version": "1.0.1", "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -14224,6 +14242,7 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -14314,6 +14333,12 @@ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true } } }, @@ -14457,10 +14482,9 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { "version": "1.2.1", @@ -14489,14 +14513,6 @@ "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "source-map-url": { @@ -14505,6 +14521,11 @@ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -14712,6 +14733,32 @@ "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true }, + "static-eval": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/static-eval/-/static-eval-2.1.1.tgz", + "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", + "requires": { + "escodegen": "^2.1.0" + }, + "dependencies": { + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", @@ -14733,6 +14780,27 @@ } } }, + "static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "requires": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", @@ -14743,6 +14811,7 @@ "version": "1.1.0", "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, "requires": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" @@ -14911,12 +14980,6 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -14952,8 +15015,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "svg-tags": { "version": "1.0.0", @@ -15092,14 +15154,6 @@ "commander": "^2.20.0", "source-map": "~0.6.1", "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "terser-webpack-plugin": { @@ -15172,15 +15226,6 @@ "path-exists": "^3.0.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", @@ -15226,12 +15271,6 @@ "ajv-keywords": "^3.1.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "ssri": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/ssri/-/ssri-6.0.2.tgz", @@ -15323,11 +15362,15 @@ "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz", "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==" }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -15501,11 +15544,6 @@ "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", "dev": true }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -15534,6 +15572,19 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "type": { + "version": "2.7.3", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz", @@ -15606,8 +15657,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typedarray-to-buffer": { "version": "3.1.5", @@ -15633,12 +15683,6 @@ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.19.0.tgz", "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -15689,6 +15733,17 @@ "requires": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" + }, + "dependencies": { + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + } } }, "unicode-property-aliases-ecmascript": { @@ -15698,19 +15753,12 @@ "dev": true }, "unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/unicode-trie/-/unicode-trie-0.3.1.tgz", + "integrity": "sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q==", "requires": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" - }, - "dependencies": { - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmmirror.com/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" - } } }, "union-value": { @@ -16366,12 +16414,6 @@ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz", @@ -16815,6 +16857,12 @@ "webpack-sources": "^1.4.1" }, "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, "json5": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", @@ -16869,12 +16917,6 @@ "ws": "^6.0.0" }, "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -17354,14 +17396,6 @@ "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "websocket-driver": { @@ -17394,6 +17428,7 @@ "version": "1.1.1", "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, "requires": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -17435,6 +17470,7 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, "requires": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -17452,6 +17488,7 @@ "version": "1.1.19", "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, "requires": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -17523,6 +17560,11 @@ "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz", @@ -17626,8 +17668,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 1133d88..d510f9d 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,9 @@ "bootstrap": "4.6.0", "core-js": "3.6.5", "element-ui": "2.15.14", + "fontkit": "1.8.1", "jquery": "3.5.1", - "pdfkit": "^0.15.0", + "pdfkit": "0.11.0", "popper.js": "1.16.1", "sqlite3": "4.2.0", "vue": "2.6.11", @@ -34,6 +35,10 @@ "xlsx": "^0.18.5" }, "devDependencies": { + "@babel/core": "^7.28.3", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@babel/preset-env": "^7.28.3", "@electron/rebuild": "3.2.13", "@vue/cli-plugin-babel": "4.5.19", "@vue/cli-plugin-router": "4.5.17", diff --git a/public/favicon.ico b/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..d73bdbc75061aec6af044108ccf4338b897037e5 100644 GIT binary patch literal 270398 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 diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..3441135ae5cbeee2a36335a088c4cfaf672f44c4 GIT binary patch literal 113947 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ƻC;&W&f=rkhMKiZzCXRFG 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
-
@@ -16,17 +12,4 @@ text-align: center; color: #2c3e50; } - -#nav { - padding: 30px; -} - -#nav a { - font-weight: bold; - color: #2c3e50; -} - -#nav a.router-link-exact-active { - color: #42b983; -} diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000..1eb6e04 --- /dev/null +++ b/src/assets/base.css @@ -0,0 +1,31 @@ +/* color palette from */ +:root { + --primary-color: #4096ff; /* 定义主色调,与Element Plus保持一致 */ +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/src/assets/bg.jpeg b/src/assets/bg.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..02281aaf2c2b4ed6dddbbb43727f0868a9dde45d GIT binary patch literal 19019 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 literal 0 HcmV?d00001 diff --git a/src/assets/logo.png b/src/assets/logo.png index f3d2503fc2a44b5053b0837ebea6e87a2d339a43..5938c11343e8edee35ebc6c504fd4913a90f29f9 100644 GIT binary patch literal 12865 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 diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..a152199 --- /dev/null +++ b/src/assets/main.css @@ -0,0 +1 @@ +@import './base.css'; diff --git a/src/background/db/exam.js b/src/background/db/exam.js new file mode 100644 index 0000000..49ce5f5 --- /dev/null +++ b/src/background/db/exam.js @@ -0,0 +1,136 @@ +const { executeWithRetry } = require('./utils.js'); +const { openDatabase } = require('./utils.js'); +const { getSystemDbPath } = require('./path.js'); + +/** + * 查询所有考试 + * @returns {Promise} 考试列表 + */ +async function getAllExams() { + const db = await openDatabase(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'SELECT * FROM exam ORDER BY created_at DESC'; + return await db.allAsync(sql); + }); +} + +/** + * 根据ID查询考试 + * @param {number} id 考试ID + * @returns {Promise} 考试数据或null + */ +async function getExamById(id) { + const db = await openDatabase(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'SELECT * FROM exam WHERE id = ?'; + return await db.getAsync(sql, [id]); + }); +} + +/** + * 查询ID最大的考试记录 + * @returns {Promise} 考试数据或null + */ +async function getLastExam() { + const db = await openDatabase(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'SELECT * FROM exam ORDER BY id DESC LIMIT 1'; + return await db.getAsync(sql); + }); +} + +/** + * 添加考试 + * @param {Object} examData 考试数据 + * @returns {Promise} 添加的考试 + */ +async function createExam(examData) { + const { exam_name, exam_description, exam_examinee_type, exam_notice, exam_minutes, exam_minutes_min } = examData; + const db = await openDatabase(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'INSERT INTO exam (exam_name, exam_description, exam_examinee_type, exam_notice, exam_minutes, exam_minutes_min) VALUES (?, ?, ?, ?, ?, ?)'; + const result = await db.runAsync(sql, [ + exam_name, + exam_description || '', + exam_examinee_type, + exam_notice || '', + exam_minutes, + exam_minutes_min || 0 + ]); + + // 检查result是否存在,如果不存在则获取最后插入的ID + let lastId; + if (result && result.lastID) { + lastId = result.lastID; + } else { + // 使用另一种方式获取最后插入的ID + const idResult = await db.getAsync('SELECT last_insert_rowid() as id'); + lastId = idResult ? idResult.id : null; + } + + if (!lastId) { + throw new Error('无法获取插入的考试ID'); + } + + return { id: lastId, ...examData }; + }); +} + +/** + * 更新考试 + * @param {number} id 考试ID + * @param {Object} examData 更新的数据 + * @returns {Promise} 是否更新成功 + */ +async function updateExam(id, examData) { + const { exam_name, exam_description, exam_examinee_type, exam_notice, exam_minutes, exam_minutes_min } = examData; + const db = await openDatabase(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'UPDATE exam SET exam_name = ?, exam_description = ?, exam_examinee_type = ?, exam_notice = ?, exam_minutes = ?, exam_minutes_min = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?'; + const result = await db.runAsync(sql, [ + exam_name, + exam_description || '', + exam_examinee_type, + exam_notice || '', + exam_minutes, + exam_minutes_min || 0, + id + ]); + + // 检查result是否存在以及是否有changes属性 + if (!result || result.changes === undefined) { + return false; + } + + return result.changes > 0; + }); +} + +/** + * 删除考试 + * @param {number} id 考试ID + * @returns {Promise} 是否删除成功 + */ +async function deleteExam(id) { + const db = await openDatabase(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'DELETE FROM exam WHERE id = ?'; + const result = await db.runAsync(sql, [id]); + + // 检查result是否存在以及是否有changes属性 + if (!result || result.changes === undefined) { + return false; + } + + return result.changes > 0; + }); +} + +module.exports = { + getAllExams, + getExamById, + getLastExam, + createExam, + updateExam, + deleteExam +}; \ No newline at end of file diff --git a/src/background/db/examinee.js b/src/background/db/examinee.js new file mode 100644 index 0000000..760d04f --- /dev/null +++ b/src/background/db/examinee.js @@ -0,0 +1,190 @@ +const { executeWithRetry } = require('./utils.js'); +const { getDbConnection } = require('./index.js'); +const { getSystemDbPath } = require('./index.js'); + +/** + * 查询所有考生列表 + * @returns {Promise} 考生列表 + */ +async function getAllExaminees() { + const db = await getDbConnection(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'SELECT * FROM examinee ORDER BY created_at DESC'; + return await db.allAsync(sql); + }); +} + +/** + * 根据ID查询考生 + * @param {number} id 考生ID + * @returns {Promise} 考生数据或null + */ +async function getExamineeById(id) { + const db = await getDbConnection(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'SELECT * FROM examinee WHERE id = ?'; + return await db.getAsync(sql, [id]); + }); +} + +/** + * 根据身份证号和准考证号查询考生 + * @param {string} idCard 身份证号 + * @param {string} admissionTicket 准考证号 + * @returns {Promise} 考生数据或null + */ +async function getExamineeByIdCardAndAdmissionTicket(idCard, admissionTicket) { + const db = await getDbConnection(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'SELECT * FROM examinee WHERE examinee_id_card = ? AND examinee_admission_ticket = ?'; + return await db.getAsync(sql, [idCard, admissionTicket]); + }); +} + +/** + * 添加考生 + * @param {Object} examineeData 考生数据 + * @returns {Promise} 添加的考生 + */ +async function createExaminee(examineeData) { + const { + examinee_name, + examinee_gender, + examinee_unit, + written_exam_room, + written_exam_seat, + computer_exam_room, + computer_exam_seat, + examinee_id_card, + examinee_admission_ticket + } = examineeData; + + const db = await getDbConnection(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = `INSERT INTO examinee ( + examinee_name, + examinee_gender, + examinee_unit, + written_exam_room, + written_exam_seat, + computer_exam_room, + computer_exam_seat, + examinee_id_card, + examinee_admission_ticket + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`; + + const result = await db.runAsync(sql, [ + examinee_name, + examinee_gender || '', + examinee_unit || '', + written_exam_room || '', + written_exam_seat || '', + computer_exam_room || '', + computer_exam_seat || '', + examinee_id_card || '', + examinee_admission_ticket || '' + ]); + + // 检查result是否存在,如果不存在则获取最后插入的ID + let lastId; + if (result && result.lastID) { + lastId = result.lastID; + } else { + // 使用另一种方式获取最后插入的ID + const idResult = await db.getAsync('SELECT last_insert_rowid() as id'); + lastId = idResult ? idResult.id : null; + } + + if (!lastId) { + throw new Error('无法获取插入的考生ID'); + } + + return { id: lastId, ...examineeData }; + }); +} + +/** + * 更新考生 + * @param {number} id 考生ID + * @param {Object} examineeData 更新的数据 + * @returns {Promise} 是否更新成功 + */ +async function updateExaminee(id, examineeData) { + const { + examinee_name, + examinee_gender, + examinee_unit, + written_exam_room, + written_exam_seat, + computer_exam_room, + computer_exam_seat, + examinee_id_card, + examinee_admission_ticket + } = examineeData; + + const db = await getDbConnection(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = `UPDATE examinee SET + examinee_name = ?, + examinee_gender = ?, + examinee_unit = ?, + written_exam_room = ?, + written_exam_seat = ?, + computer_exam_room = ?, + computer_exam_seat = ?, + examinee_id_card = ?, + examinee_admission_ticket = ?, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`; + + const result = await db.runAsync(sql, [ + examinee_name, + examinee_gender || '', + examinee_unit || '', + written_exam_room || '', + written_exam_seat || '', + computer_exam_room || '', + computer_exam_seat || '', + examinee_id_card || '', + examinee_admission_ticket || '', + id + ]); + + // 检查result是否存在以及是否有changes属性 + if (!result || result.changes === undefined) { + return false; + } + + return result.changes > 0; + }); +} + +/** + * 删除考生 + * @param {number} id 考生ID + * @returns {Promise} 是否删除成功 + */ +async function deleteExaminee(id) { + const db = await getDbConnection(getSystemDbPath()); + return executeWithRetry(db, async () => { + const sql = 'DELETE FROM examinee WHERE id = ?'; + const result = await db.runAsync(sql, [id]); + + // 检查result是否存在以及是否有changes属性 + if (!result || result.changes === undefined) { + return false; + } + + return result.changes > 0; + }); +} + +// 导出使用CommonJS格式 +module.exports = { + getAllExaminees, + getExamineeById, + getExamineeByIdCardAndAdmissionTicket, + createExaminee, + updateExaminee, + deleteExaminee +}; \ No newline at end of file diff --git a/src/background/db/examing.js b/src/background/db/examing.js new file mode 100644 index 0000000..b469314 --- /dev/null +++ b/src/background/db/examing.js @@ -0,0 +1,1175 @@ +const { getDbConnection, closeAllConnections } = require('./index.js'); +const { getSystemDbPath, getUserDbPath } = require('./path.js'); + +// 新增:格式化日期为年-月-日 时:分:秒 +function formatDateTime(date) { + if (!(date instanceof Date)) { + date = new Date(date); + } + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; +} + +/** + * 生成考生试卷 + * @param {Object} examineeData - 考生数据 + * @param {Object} examData - 考试数据 + * @returns {Promise} - 包含试卷ID和状态的对象 + */ +async function generateExamineePaper(examineeData, examData) { + try { + // 1. 获取数据库连接 + const systemDb = await getDbConnection(getSystemDbPath()); + const userDb = await getDbConnection(getUserDbPath()); + + // 2. 处理考生数据,将空值转换为空字符串 + console.log('开始处理考生数据...', examineeData); + const processedExamineeData = { + id: examineeData.id, + examinee_name: examineeData.examinee_name || '', + examinee_gender: examineeData.examinee_gender || '', + examinee_unit: examineeData.examinee_unit || '', + written_exam_room: examineeData.written_exam_room || '', + written_exam_seat: examineeData.written_exam_seat || '', + computer_exam_room: examineeData.computer_exam_room || '', + computer_exam_seat: examineeData.computer_exam_seat || '', + examinee_id_card: examineeData.examinee_id_card || '', + examinee_admission_ticket: examineeData.examinee_admission_ticket || '' + }; + + // 3. 检查考生是否已存在 + console.log('检查考生是否已存在...'); + const existingExaminee = await userDb.getAsync( + `SELECT id FROM examinee WHERE id = ?`, + [processedExamineeData.id] + ); + + let examineeId; + + if (existingExaminee) { + // 考生已存在 + examineeId = existingExaminee.id; + console.log(`考生已存在,ID: ${examineeId}`); + // 更新考生信息 + await userDb.runAsync( + `UPDATE examinee SET + examinee_name = ?, + examinee_gender = ?, + examinee_unit = ?, + written_exam_room = ?, + written_exam_seat = ?, + computer_exam_room = ?, + computer_exam_seat = ?, + examinee_admission_ticket = ?, + created_at = ? + WHERE id = ?`, + [ + processedExamineeData.examinee_name, + processedExamineeData.examinee_gender, + processedExamineeData.examinee_unit, + processedExamineeData.written_exam_room, + processedExamineeData.written_exam_seat, + processedExamineeData.computer_exam_room, + processedExamineeData.computer_exam_seat, + processedExamineeData.examinee_admission_ticket, + new Date().toISOString(), + examineeId + ] + ); + console.log(`考生信息已更新,ID: ${examineeId}`); + // 4. 检查该考生是否有试卷记录 + console.log('检查考生试卷记录...'); + const existingPaper = await userDb.getAsync( + `SELECT id, paper_status FROM examinee_papers WHERE examinee_id = ? ORDER BY created_at DESC LIMIT 1`, + [examineeId] + ); + + if (existingPaper) { + // 试卷已存在 + const paperId = existingPaper.id; + const paperStatus = existingPaper.paper_status; + console.log(`试卷已存在,ID: ${paperId},状态: ${paperStatus}`); + + if (paperStatus === 2) { + // 状态为2:已完成考试,不能重复考试 + console.log('考生已完成考试,不能重复考试'); + return { + success: false, + message: '已完成考试,不能重复考试。' + }; + } else { + // 状态为0:未开始,删除旧试卷及相关数据,重新组卷 + console.log('删除未开始的旧试卷及相关数据...'); + + // 删除question_choices记录 + await userDb.runAsync( + `DELETE FROM question_choices WHERE question_id IN ( + SELECT id FROM paper_questions WHERE paper_id = ? + )`, + [paperId] + ); + + // 删除question_fill_blanks记录 + await userDb.runAsync( + `DELETE FROM question_fill_blanks WHERE question_id IN ( + SELECT id FROM paper_questions WHERE paper_id = ? + )`, + [paperId] + ); + + // 删除question_images记录 + await userDb.runAsync( + `DELETE FROM question_images WHERE question_id IN ( + SELECT id FROM paper_questions WHERE paper_id = ? + )`, + [paperId] + ); + + // 删除question_datasets记录 + await userDb.runAsync( + `DELETE FROM question_datasets WHERE question_id IN ( + SELECT id FROM paper_questions WHERE paper_id = ? + )`, + [paperId] + ); + + // 删除paper_questions记录 + await userDb.runAsync( + `DELETE FROM paper_questions WHERE paper_id = ?`, + [paperId] + ); + + // 删除examinee_papers记录 + await userDb.runAsync( + `DELETE FROM examinee_papers WHERE id = ?`, + [paperId] + ); + + console.log('旧试卷数据删除完成'); + } + } + } else { + // 考生不存在,添加新考生 + console.log('添加新考生...'); + const examineeResult = await userDb.runAsync( + `INSERT INTO examinee ( + id, examinee_name, examinee_gender, examinee_unit, + written_exam_room, written_exam_seat, computer_exam_room, + computer_exam_seat, examinee_id_card, examinee_admission_ticket, created_at + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [ + processedExamineeData.id, + processedExamineeData.examinee_name, + processedExamineeData.examinee_gender, + processedExamineeData.examinee_unit, + processedExamineeData.written_exam_room, + processedExamineeData.written_exam_seat, + processedExamineeData.computer_exam_room, + processedExamineeData.computer_exam_seat, + processedExamineeData.examinee_id_card, + processedExamineeData.examinee_admission_ticket, + new Date().toISOString() + ] + ); + examineeId = examineeResult.lastID; + console.log(`新考生添加成功,ID: ${examineeId}`); + } + + // 5. 生成新的examinee_papers记录 + console.log('生成新试卷记录...'); + const paperResult = await userDb.runAsync( + `INSERT INTO examinee_papers ( + examinee_id, paper_minutes, paper_minutes_min, paper_status + ) VALUES (?, ?, ?, ?)`, + [examineeId, examData.exam_minutes, examData.exam_minutes_min, 0] // 0表示未开始 + ); + const paperId = paperResult.lastID; + console.log(`试卷记录生成成功,ID: ${paperId}`); + + // 6. 从system库获取所有questions记录 + console.log('获取系统题库...'); + const systemQuestions = await systemDb.allAsync('SELECT * FROM questions'); + console.log(`成功获取 ${systemQuestions.length} 道题目`); + + // 打乱题目顺序 + const shuffledQuestions = [...systemQuestions].sort(() => Math.random() - 0.5); + + // 7. 准备paper_questions数据 + console.log('准备试卷题目数据...'); + const paperQuestionsData = shuffledQuestions.map(question => ({ + examinee_id: examineeId, + paper_id: paperId, + question_type: question.question_type, + question_name: question.question_name, + question_description: question.question_description, + created_at: new Date().toISOString() + })); + + // 创建question_id映射关系(system_id -> user_id) + const questionIdMap = new Map(); + + // 8. 插入paper_questions数据并记录映射关系 + console.log('插入试卷题目数据...'); + for (let i = 0; i < paperQuestionsData.length; i++) { + const result = await userDb.runAsync( + `INSERT INTO paper_questions ( + examinee_id, paper_id, question_type, + question_name, question_description, created_at + ) VALUES (?, ?, ?, ?, ?, ?)`, + [ + paperQuestionsData[i].examinee_id, + paperQuestionsData[i].paper_id, + paperQuestionsData[i].question_type, + paperQuestionsData[i].question_name, + paperQuestionsData[i].question_description, + paperQuestionsData[i].created_at + ] + ); + // 使用shuffledQuestions[i].id而不是systemQuestions[i].id + questionIdMap.set(shuffledQuestions[i].id, result.lastID); + } + console.log(`成功插入 ${paperQuestionsData.length} 条试卷题目数据`); + + // 9. 处理question_datasets表 + console.log('处理数据集...'); + const systemDatasets = await systemDb.allAsync('SELECT * FROM question_datasets'); + const userDatasets = systemDatasets + .filter(dataset => questionIdMap.has(dataset.question_id)) + .map(dataset => ({ + question_id: questionIdMap.get(dataset.question_id), + dataset_name: dataset.dataset_name, + dataset_data: dataset.dataset_data, + created_at: new Date().toISOString() + })); + if (userDatasets.length > 0) { + await batchInsert(userDb, 'question_datasets', userDatasets); + } + console.log(`成功处理 ${userDatasets.length} 个数据集`); + + // 10. 处理question_images表 + console.log('处理图片...'); + const systemImages = await systemDb.allAsync('SELECT * FROM question_images'); + const userImages = systemImages + .filter(image => questionIdMap.has(image.question_id)) + .map(image => ({ + question_id: questionIdMap.get(image.question_id), + image_name: image.image_name, + image_base64: image.image_base64, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString() + })); + if (userImages.length > 0) { + await batchInsert(userDb, 'question_images', userImages); + } + console.log(`成功处理 ${userImages.length} 张图片`); + + // 11. 处理question_choices表 + console.log('处理选择题...'); + const systemChoices = await systemDb.allAsync('SELECT * FROM question_choices'); + let userChoices = systemChoices + .filter(choice => questionIdMap.has(choice.question_id)) + .map(choice => { + // 打乱选项顺序 + const options = JSON.parse(choice.choice_options); + + return { + question_id: questionIdMap.get(choice.question_id), + choice_description: choice.choice_description, + choice_type: choice.choice_type, + choice_options: JSON.stringify(options), + correct_answers: choice.correct_answers, + examinee_answers: '', + score: choice.score, + score_real: 0, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString() + }; + }); + + // 打乱选择题顺序 + userChoices = userChoices.sort(() => Math.random() - 0.5); + + if (userChoices.length > 0) { + await batchInsert(userDb, 'question_choices', userChoices); + } + console.log(`成功处理 ${userChoices.length} 道选择题`); + + // 12. 处理question_fill_blanks表 + console.log('处理填空题...'); + const systemFillBlanks = await systemDb.allAsync('SELECT * FROM question_fill_blanks'); + let userFillBlanks = systemFillBlanks + .filter(blank => questionIdMap.has(blank.question_id)) + .map(blank => ({ + question_id: questionIdMap.get(blank.question_id), + blank_description: blank.blank_description, + blank_count: blank.blank_count, + correct_answers: blank.correct_answers, + examinee_answers: '', + score: blank.score, + score_real: 0, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString() + })); + + // 打乱填空题顺序 + userFillBlanks = userFillBlanks.sort(() => Math.random() - 0.5); + + if (userFillBlanks.length > 0) { + await batchInsert(userDb, 'question_fill_blanks', userFillBlanks); + } + console.log(`成功处理 ${userFillBlanks.length} 道填空题`); + + // 计算试卷总分 + console.log('计算试卷总分...'); + // 查询所有选择题分数 + const choicesScoreResult = await userDb.getAsync( + `SELECT SUM(score) as total FROM question_choices WHERE question_id IN ( + SELECT id FROM paper_questions WHERE paper_id = ? + )`, + [paperId] + ); + const choicesScore = choicesScoreResult.total || 0; + + // 查询所有填空题分数 + const fillBlanksScoreResult = await userDb.getAsync( + `SELECT SUM(score) as total FROM question_fill_blanks WHERE question_id IN ( + SELECT id FROM paper_questions WHERE paper_id = ? + )`, + [paperId] + ); + const fillBlanksScore = fillBlanksScoreResult.total || 0; + + // 计算总分 + const paperScore = choicesScore + fillBlanksScore; + console.log(`试卷总分计算完成: ${paperScore}分`); + + // 更新试卷总分 + await userDb.runAsync( + `UPDATE examinee_papers SET paper_score = ? WHERE id = ?`, + [paperScore, paperId] + ); + + // 返回成功结果 + // 先查询完整的试卷数据 + const paperData = await userDb.getAsync( + `SELECT * FROM examinee_papers WHERE id = ?`, + [paperId] + ); + + // 查询试卷题目数量 + const questionCount = await userDb.getAsync( + `SELECT COUNT(*) as count FROM paper_questions WHERE paper_id = ?`, + [paperId] + ); + + // 构建完整的试卷数据对象 + const completePaperData = { + ...paperData, + question_count: questionCount.count, + examinee_id: examineeId, + examinee_name: processedExamineeData.examinee_name, + examinee_id_card: processedExamineeData.examinee_id_card, + examinee_admission_ticket: processedExamineeData.examinee_admission_ticket + }; + + return { + success: true, + message: '试卷生成成功', + data: completePaperData + }; + } catch (error) { + console.error('生成试卷失败:', error); + return { + success: false, + message: `生成试卷失败: ${error.message}`, + data: null + }; + } +} + +/** + * 加载试卷试题序列 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含试题序列的数组 + */ +async function loadPaperSerial(paperId) { + try { + // 1. 获取数据库连接 + const userDb = await getDbConnection(getUserDbPath()); + const systemDb = await getDbConnection(getSystemDbPath()); + + // 2. 查询题型字典,获取题型名称 + console.log('开始查询题型字典...'); + const questionTypeDict = await systemDb.allAsync( + `SELECT item_code, item_name FROM dict_items WHERE type_code = ?`, + ['question_type'] + ); + const questionTypeMap = new Map(); + questionTypeDict.forEach(item => { + questionTypeMap.set(item.item_code, item.item_name); + }); + console.log('成功获取题型字典'); + + // 3. 查询试卷中的所有题目,并按question_type和id升序排序 + console.log(`开始查询试卷 ${paperId} 的所有题目...`); + const paperQuestions = await userDb.allAsync( + `SELECT * FROM paper_questions + WHERE paper_id = ? + ORDER BY question_type ASC, id ASC`, + [paperId] + ); + console.log(`成功获取试卷 ${paperId} 的 ${paperQuestions.length} 道题目`); + + // 4. 构建试题序列 + const paperSerial = []; + let addedCount = 0; + let skippedCount = 0; + let globalSerialNo = 1; // 全局序列号 + + console.log('开始构建试题序列...'); + console.log(`试卷 ${paperId} 的题目列表:`); + paperQuestions.forEach((q, idx) => { + console.log(` ${idx + 1}. ID: ${q.id}, 题型: ${q.question_type}`); + }); + + for (let i = 0; i < paperQuestions.length; i++) { + const question = paperQuestions[i]; + const questionType = question.question_type; + const questionTypeName = questionTypeMap.get(questionType) || '未知题型'; + + console.log(`处理第 ${i + 1} 题题干 (ID: ${question.id}, 题型: ${questionType})`); + + let tableName = ''; + let relatedRecords = []; + + // 根据题型查询相关表的所有记录 + if (questionType === 'choice') { // 选择题 + tableName = 'question_choices'; + relatedRecords = await userDb.allAsync( + `SELECT id, examinee_answers FROM question_choices WHERE question_id = ?`, + [question.id] + ); + console.log(` 找到 ${relatedRecords.length} 条选择题记录`); + } else if (questionType === 'fill_blank') { // 填空题 + tableName = 'question_fill_blanks'; + relatedRecords = await userDb.allAsync( + `SELECT id, examinee_answers FROM question_fill_blanks WHERE question_id = ?`, + [question.id] + ); + console.log(` 找到 ${relatedRecords.length} 条填空题记录`); + } else { + console.log(` 未处理的题型: ${questionType}`); + } + + // 为每条记录添加到试题序列 + if (relatedRecords.length > 0) { + relatedRecords.forEach((record, recordIdx) => { + const answered = record.examinee_answers ? 1 : 0; + const serialNo = globalSerialNo++; + + // 添加到试题序列 + paperSerial.push({ + serial_no: serialNo, + id: record.id, + table_name: tableName, + question_id: question.id, + question_type: questionType, + question_type_name: questionTypeName, + [tableName === 'question_choices' ? 'choice_id' : 'fill_blank_id']: record.id, + answered + }); + + console.log(` 添加第 ${recordIdx + 1} 个具体问题到试题序列,序列号: ${serialNo}`); + addedCount++; + }); + } else { + console.log(` 未找到相关记录,跳过`); + skippedCount++; + } + } + console.log(`试题序列构建完成: 共 ${paperQuestions.length} 道题,添加 ${addedCount} 道,跳过 ${skippedCount} 道`); + return paperSerial; + } catch (error) { + console.error('加载试卷试题序列失败:', error); + return []; + } +} + +/** + * 根据表名和ID获取完整的试题数据 + * @param {string} tableName - 表名 (question_choices 或 question_fill_blanks) + * @param {number} id - 记录ID + * @returns {Promise} - 完整的试题数据 + */ +async function getQuestionByRelatedId(tableName, id) { + try { + // 1. 获取数据库连接 + const userDb = await getDbConnection(getUserDbPath()); + const systemDb = await getDbConnection(getSystemDbPath()); + + // 3. 查询相关表获取question_id + console.log(`查询 ${tableName} 表,ID: ${id}`); + const relatedRecord = await userDb.getAsync( + `SELECT * FROM ${tableName} WHERE id = ?`, + [id] + ); + + if (!relatedRecord) { + throw new Error(`未找到 ${tableName} 表中ID为 ${id} 的记录`); + } + + const questionId = relatedRecord.question_id; + console.log(`找到关联的题干ID: ${questionId}`); + + // 4. 查询题干信息 + const question = await userDb.getAsync( + `SELECT * FROM paper_questions WHERE id = ?`, + [questionId] + ); + + if (!question) { + throw new Error(`未找到题干ID为 ${questionId} 的记录`); + } + + // 5. 查询题型字典信息 + const questionType = question.question_type; + const dictItem = await systemDb.getAsync( + `SELECT * FROM dict_items WHERE item_code = ? AND type_code = 'question_type'`, + [questionType] + ); + + // 6. 查询关联的数据集 + const datasets = await userDb.allAsync( + `SELECT * FROM question_datasets WHERE question_id = ?`, + [questionId] + ); + + // 7. 查询关联的图片 + const images = await userDb.allAsync( + `SELECT * FROM question_images WHERE question_id = ?`, + [questionId] + ); + + // 解析选项、答案等数据 + if (question.question_type === 'choice') { + if (relatedRecord.choice_options) { + try { + relatedRecord.choice_options = JSON.parse(relatedRecord.choice_options); + if (!Array.isArray(relatedRecord.choice_options)) { + relatedRecord.choice_options = [relatedRecord.choice_options]; + } + } catch (e) { + console.error('解析选项失败:', e); + relatedRecord.choice_options = []; + } + } else { + relatedRecord.choice_options = []; + } + } + + if (question.question_type === 'choice') { + if (relatedRecord.correct_answers) { + try { + relatedRecord.correct_answers = JSON.parse(relatedRecord.correct_answers); + if (!Array.isArray(relatedRecord.correct_answers)) { + relatedRecord.correct_answers = [relatedRecord.correct_answers]; + } + } catch (e) { + console.error('解析正确答案失败:', e); + relatedRecord.correct_answers = []; + } + } else { + relatedRecord.correct_answers = []; + } + } + + if (question.question_type === 'choice') { + if (relatedRecord.examinee_answers) { + try { + relatedRecord.examinee_answers = JSON.parse(relatedRecord.examinee_answers); + if (!Array.isArray(relatedRecord.examinee_answers)) { + relatedRecord.examinee_answers = [relatedRecord.examinee_answers]; + } + } catch (e) { + console.error('解析考生答案失败:', e); + relatedRecord.examinee_answers = []; + } + } else { + relatedRecord.examinee_answers = []; + } + } + + if (question.question_type === 'fill_blank') { + if (relatedRecord.correct_answers) { + try { + relatedRecord.correct_answers = JSON.parse(relatedRecord.correct_answers); + if (!Array.isArray(relatedRecord.correct_answers)) { + relatedRecord.correct_answers = [relatedRecord.correct_answers]; + } + } catch (e) { + console.error('解析正确答案失败:', e); + relatedRecord.correct_answers = []; + } + } else { + relatedRecord.correct_answers = []; + } + } + + if (question.question_type === 'fill_blank') { + if (relatedRecord.examinee_answers) { + try { + relatedRecord.examinee_answers = JSON.parse(relatedRecord.examinee_answers); + if (!Array.isArray(relatedRecord.examinee_answers)) { + relatedRecord.examinee_answers = [relatedRecord.examinee_answers]; + } + } catch (e) { + console.error('解析考生答案失败:', e); + relatedRecord.examinee_answers = []; + } + } else { + relatedRecord.examinee_answers = []; + } + } + + // 9. 构建返回结果 + question.datasets = datasets; + question.images = images; + question.type_info = dictItem || null; + + const result = { + question_detail: relatedRecord, + question: question + }; + + console.log('成功获取完整试题数据'); + return result; + } catch (error) { + console.error('获取试题数据失败:', error); + throw error; + } +} + +/** + * 更新考生答案 + * @param {string} tableName - 表名 (question_choices 或 question_fill_blanks) + * @param {number} id - 记录ID + * @param {Array|string} answers - 考生答案 + * @returns {Promise} - 是否更新成功 + */ +async function updateExamineeAnswer(tableName, id, answers) { + try { + // 验证表名 + if (!['question_choices', 'question_fill_blanks'].includes(tableName)) { + throw new Error('无效的表名,只能是 question_choices 或 question_fill_blanks'); + } + + // 获取数据库连接 + const userDb = await getDbConnection(getUserDbPath()); + + // 确保答案是JSON字符串 + const answersJson = Array.isArray(answers) ? JSON.stringify(answers) : answers; + + // 更新考生答案 + const result = await userDb.runAsync( + `UPDATE ${tableName} SET examinee_answers = ?, updated_at = ? WHERE id = ?`, + [answersJson, new Date().toISOString(), id] + ); + + return result.changes > 0; + } catch (error) { + console.error('更新考生答案失败:', error); + throw error; + } +} + +/** + * 开始考试 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果和试卷数据的对象 + */ +async function startPaper(paperId) { + try { + const userDb = await getDbConnection(getUserDbPath()); + const currentTime = formatDateTime(new Date()); + + await userDb.runAsync( + `UPDATE examinee_papers + SET paper_status = 1, + paper_start_time = ? + WHERE id = ?`, + [currentTime, paperId] + ); + + // 查询更新后的试卷数据 + const paper = await userDb.getAsync( + `SELECT * FROM examinee_papers WHERE id = ?`, + [paperId] + ); + + return { + success: true, + message: '考试已成功开始', + data: paper + }; + } catch (error) { + console.error('开始考试失败:', error); + return { + success: false, + message: `开始考试失败: ${error.message}`, + data: null + }; + } +} + +/** + * 提交考试 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果和试卷数据的对象 + */ +async function submitPaper(paperId) { + try { + const userDb = await getDbConnection(getUserDbPath()); + const currentTime = formatDateTime(new Date()); + + await userDb.runAsync( + `UPDATE examinee_papers + SET paper_status = 2, + paper_submit_time = ?, + paper_end_time = ? + WHERE id = ?`, + [currentTime, currentTime, paperId] + ); + + // 查询更新后的试卷数据 + const paper = await userDb.getAsync( + `SELECT * FROM examinee_papers WHERE id = ?`, + [paperId] + ); + + return { + success: true, + message: '考试已成功提交', + data: paper + }; + } catch (error) { + console.error('提交考试失败:', error); + return { + success: false, + message: `提交考试失败: ${error.message}`, + data: null + }; + } +} + +/** + * 结束考试 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果和试卷数据的对象 + */ +async function endPaper(paperId) { + try { + const userDb = await getDbConnection(getUserDbPath()); + const currentTime = formatDateTime(new Date()); + + await userDb.runAsync( + `UPDATE examinee_papers + SET paper_status = 2, + paper_end_time = ? + WHERE id = ?`, + [currentTime, paperId] + ); + + // 查询更新后的试卷数据 + const paper = await userDb.getAsync( + `SELECT * FROM examinee_papers WHERE id = ?`, + [paperId] + ); + + return { + success: true, + message: '考试已成功结束', + data: paper + }; + } catch (error) { + console.error('结束考试失败:', error); + return { + success: false, + message: `结束考试失败: ${error.message}`, + data: null + }; + } +} + +/** + * 更新试卷最后操作时间 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果和试卷数据的对象 + */ +async function processPaper(paperId) { + try { + const userDb = await getDbConnection(getUserDbPath()); + const currentTime = formatDateTime(new Date()); + + await userDb.runAsync( + `UPDATE examinee_papers + SET paper_last_time = ? + WHERE id = ?`, + [currentTime, paperId] + ); + + // 查询更新后的试卷数据 + const paper = await userDb.getAsync( + `SELECT * FROM examinee_papers WHERE id = ?`, + [paperId] + ); + console.log('更新试卷最后操作时间成功:', paper); + return { + success: true, + message: '试卷处理时间已更新', + data: paper + }; + } catch (error) { + console.error('处理试卷失败:', error); + return { + success: false, + message: `处理试卷失败: ${error.message}`, + data: null + }; + } +} + +/** + * 检查试卷答案并计算得分 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果和带关联的试卷数据的对象 + */ +async function checkPaperAnswers(paperId) { + try { + // 获取用户数据库路径 + const userDbPath = getUserDbPath(); + // 连接用户数据库 + const userDb = await getDbConnection(userDbPath); + + // 1. 查询试卷基本信息 + const paper = await userDb.getAsync( + `SELECT * FROM examinee_papers WHERE id = ?`, + [paperId] + ); + + if (!paper) { + await closeAllConnections(); + return { + success: false, + message: `未找到ID为${paperId}的试卷`, + data: null + }; + } + + // 2. 查询试卷关联的所有试题 + const paperQuestions = await userDb.allAsync( + `SELECT * FROM paper_questions WHERE paper_id = ?`, + [paperId] + ); + + let totalScore = 0; + + // 3. 遍历所有试题,查询并比对答案 + for (const question of paperQuestions) { + const questionId = question.id; + const questionType = question.question_type; + + // 根据题型查询对应的答案表 + if (questionType === 'choice') { + // 选择题 + const choices = await userDb.allAsync( + `SELECT * FROM question_choices WHERE question_id = ?`, + [questionId] + ); + + for (const choice of choices) { + // 解析正确答案和考生答案 + const correctAnswers = JSON.parse(choice.correct_answers || '[]'); + const examineeAnswers = JSON.parse(choice.examinee_answers || '[]'); + + // 打印题目信息 + console.log(`\n选择题ID: ${choice.id}`); + console.log(`正确答案:`, correctAnswers); + console.log(`考生答案:`, examineeAnswers); + + // 比对答案 - 不考虑顺序 + let isCorrect = true; + if (correctAnswers.length !== examineeAnswers.length) { + isCorrect = false; + } else { + // 创建正确答案的副本用于比对 + const correctAnswersCopy = [...correctAnswers]; + + // 检查考生答案中的每个元素是否在正确答案中存在 + for (const answer of examineeAnswers) { + const index = correctAnswersCopy.indexOf(answer); + if (index === -1) { + isCorrect = false; + break; + } + // 移除已匹配的答案,避免重复匹配 + correctAnswersCopy.splice(index, 1); + } + } + + // 计算得分 + const scoreReal = isCorrect ? (choice.score || 0) : 0; + totalScore += scoreReal; + + // 打印判断结果和得分 + console.log(`判断结果: ${isCorrect ? '正确' : '错误'}`); + console.log(`本题得分: ${scoreReal}`); + + // 更新本题得分 + await userDb.runAsync( + `UPDATE question_choices SET score_real = ? WHERE id = ?`, + [scoreReal, choice.id] + ); + } + } else if (questionType === 'fill_blank') { + // 填空题 + const blanks = await userDb.allAsync( + `SELECT * FROM question_fill_blanks WHERE question_id = ?`, + [questionId] + ); + + for (const blank of blanks) { + // 解析正确答案和考生答案 + const correctAnswers = JSON.parse(blank.correct_answers || '[]'); + const examineeAnswers = JSON.parse(blank.examinee_answers || '[]'); + + // 打印题目信息 + console.log(`\n填空题ID: ${blank.id}`); + console.log(`正确答案:`, correctAnswers); + console.log(`考生答案:`, examineeAnswers); + + // 比对答案 - 不考虑顺序 + let isCorrect = true; + if (correctAnswers.length !== examineeAnswers.length) { + isCorrect = false; + } else { + // 创建正确答案的副本用于比对 + const correctAnswersCopy = [...correctAnswers]; + + // 检查考生答案中的每个元素是否在正确答案中存在 + for (const answer of examineeAnswers) { + const index = correctAnswersCopy.indexOf(answer); + if (index === -1) { + isCorrect = false; + for (const correct of correctAnswersCopy) { + if (Number(answer) === Number(correct)) { + isCorrect = true; + break; + } + } + break; + } + // 移除已匹配的答案,避免重复匹配 + correctAnswersCopy.splice(index, 1); + } + } + + // 计算得分 + const scoreReal = isCorrect ? (blank.score || 0) : 0; + totalScore += scoreReal; + + // 打印判断结果和得分 + console.log(`判断结果: ${isCorrect ? '正确' : '错误'}`); + console.log(`本题得分: ${scoreReal}`); + + // 更新本题得分 + await userDb.runAsync( + `UPDATE question_fill_blanks SET score_real = ? WHERE id = ?`, + [scoreReal, blank.id] + ); + } + } + // 可以根据需要添加其他题型的处理 + } + + // 4. 更新试卷总分 + await userDb.runAsync( + `UPDATE examinee_papers SET paper_score_real = ? WHERE id = ?`, + [totalScore, paperId] + ); + + // 5. 查询更新后的试卷信息(包含关联数据) + const updatedPaper = await getPaper(paperId); + console.log(updatedPaper); + + return { + success: true, + message: '试卷判卷成功', + data: updatedPaper.data + }; + } catch (error) { + console.error('判卷过程中发生错误:', error); + return { + success: false, + message: `判卷失败: ${error.message}`, + data: null + }; + } +} + +/** + * 获取试卷详细信息 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含试卷详细信息的对象 + */ +async function getPaper(paperId) { + try { + // 获取数据库路径 + const systemDbPath = getSystemDbPath(); + const userDbPath = getUserDbPath(); + + // 连接数据库 + const systemDb = await getDbConnection(systemDbPath); + const userDb = await getDbConnection(userDbPath); + + // 1. 查询试卷基本信息 + const paper = await userDb.getAsync( + `SELECT * FROM examinee_papers WHERE id = ?`, + [paperId] + ); + + if (!paper) { + await closeAllConnections(); + return { + success: false, + message: `未找到ID为${paperId}的试卷`, + data: null + }; + } + + // 补充: 查询关联的examinee + const examinee = await userDb.getAsync( + `SELECT * FROM examinee WHERE id = ?`, + [paper.examinee_id] + ); + + // 2. 查询试卷关联的题目 + const paperQuestions = await userDb.allAsync( + `SELECT * FROM paper_questions WHERE paper_id = ?`, + [paperId] + ); + + // 3. 为每个题目获取详细信息 + const questionsWithDetails = []; + for (const question of paperQuestions) { + const questionId = question.id; + const questionType = question.question_type; + + // 3.1 查询题型名称 + const dictItem = await systemDb.getAsync( + `SELECT item_name FROM dict_items WHERE type_code = 'question_type' AND item_code = ?`, + [questionType] + ); + + const questionWithDetails = { + ...question, + question_type_name: dictItem && dictItem.item_name ? dictItem.item_name : '', + images: [], + datasets: [], + choices: [], + blanks: [] + }; + + // 3.2 查询题目图片 + const images = await userDb.allAsync( + `SELECT * FROM question_images WHERE question_id = ?`, + [questionId] + ); + questionWithDetails.images = images; + + // 3.3 查询题目数据集 + const datasets = await userDb.allAsync( + `SELECT * FROM question_datasets WHERE question_id = ?`, + [questionId] + ); + // 解析dataset_data为数组 + questionWithDetails.datasets = datasets.map(dataset => ({ + ...dataset, + dataset_data: JSON.parse(dataset.dataset_data || '[]') + })); + + // 3.4 根据题型查询对应的答案表 + if (questionType === 'choice') { + // 查询选择题 + const choices = await userDb.allAsync( + `SELECT * FROM question_choices WHERE question_id = ?`, + [questionId] + ); + // 解析数组列 + questionWithDetails.choices = choices.map(choice => ({ + ...choice, + choice_options: JSON.parse(choice.choice_options || '[]'), + correct_answers: JSON.parse(choice.correct_answers || '[]'), + examinee_answers: JSON.parse(choice.examinee_answers || '[]') + })); + } else if (questionType === 'fill_blank') { + // 查询填空题 + const blanks = await userDb.allAsync( + `SELECT * FROM question_fill_blanks WHERE question_id = ?`, + [questionId] + ); + // 解析数组列 + questionWithDetails.blanks = blanks.map(blank => ({ + ...blank, + correct_answers: JSON.parse(blank.correct_answers || '[]'), + examinee_answers: JSON.parse(blank.examinee_answers || '[]') + })); + } + + questionsWithDetails.push(questionWithDetails); + } + + // 4. 构建完整的试卷对象 + const fullPaper = { + ...paper, + examinee: examinee, + questions: questionsWithDetails + }; + + // 关闭数据库连接 + await closeAllConnections(); + + return { + success: true, + message: '获取试卷成功', + data: JSON.stringify(fullPaper) + }; + } catch (error) { + console.error('获取试卷过程中发生错误:', error); + await closeAllConnections(); + return { + success: false, + message: `获取试卷失败: ${error.message}`, + data: null + }; + } +} + +// 在文件末尾添加所有导出 +module.exports = { + formatDateTime, + generateExamineePaper, + loadPaperSerial, + getQuestionByRelatedId, + updateExamineeAnswer, + startPaper, + submitPaper, + endPaper, + processPaper, + checkPaperAnswers, + getPaper +}; \ No newline at end of file diff --git a/src/background/main.js b/src/background/main.js index b22e3ee..6bdd0d6 100644 --- a/src/background/main.js +++ b/src/background/main.js @@ -15,6 +15,14 @@ const { initConfigIpc } = require('./service/configService.js'); const { initDictIpc } = require('./service/dictService.js'); // 导入试题服务 const { initQuestionIpc } = require('./service/questionService.js'); +// 导入考试服务 +const { initExamIpc } = require('./service/examService.js'); +// 导入考生服务 +const { initExamineeIpc } = require('./service/examineeService.js'); +// 导入考生考试服务 +const { initExamingIpc } = require('./service/examingService.js'); +// 导入文件服务 +const { initFileIpc } = require('./service/fileService.js'); // Scheme must be registered before the app is ready protocol.registerSchemesAsPrivileged([ @@ -83,57 +91,20 @@ app.on('ready', async () => { } } - // 测试SQLite连接 - try { - console.log('尝试连接SQLite...'); - const db = new sqlite3.Database(':memory:', (err) => { - if (err) { - console.error('SQLite连接失败:', err.message); - } else { - console.log('SQLite连接成功!'); - - // 执行简单的SQL操作 - db.serialize(() => { - console.log('创建测试表...'); - db.run('CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT)', (err) => { - if (err) { - console.error('创建表失败:', err.message); - } else { - console.log('表创建成功'); - - // 插入测试数据 - db.run('INSERT INTO test (name) VALUES (?)', ['测试数据'], function(err) { - if (err) { - console.error('插入数据失败:', err.message); - } else { - console.log('数据插入成功,ID:', this.lastID); - - // 查询数据 - db.all('SELECT * FROM test', [], (err, rows) => { - if (err) { - console.error('查询失败:', err.message); - } else { - console.log('查询结果:', rows); - } - db.close(); - }); - } - }); - } - }); - }); - } - }); - } catch (error) { - console.error('SQLite测试异常:', error); - } - // 初始化配置相关的IPC处理程序 initConfigIpc(ipcMain); // 初始化字典相关的IPC处理程序 initDictIpc(ipcMain); // 初始化试题相关的IPC处理程序 - await initQuestionIpc(ipcMain); + initQuestionIpc(ipcMain); + // 初始化考试相关的IPC处理程序 + initExamIpc(ipcMain); + // 初始化考生相关的IPC处理程序 + initExamineeIpc(ipcMain); + // 初始化考生考试相关的IPC处理程序 + initExamingIpc(ipcMain); + // 初始化文件相关的IPC处理程序 + initFileIpc(ipcMain); createWindow(); }); diff --git a/src/background/service/examService.js b/src/background/service/examService.js new file mode 100644 index 0000000..5780417 --- /dev/null +++ b/src/background/service/examService.js @@ -0,0 +1,262 @@ +const { + createExam, + getAllExams, + getExamById, + updateExam, + deleteExam, + getLastExam +} = require('../db/exam.js'); + +/** + * 服务层:创建考试 + * @param {Object} examData 考试数据 + * @returns {Promise} 创建的考试 + */ +async function createNewExam(examData) { + try { + // 数据验证 - 修改为exam_minutes和exam_minutes_min必填 + if (!examData.exam_minutes || !examData.exam_minutes_min) { + throw new Error("考试时长和最少考试时间为必填项"); + } + + // 移除默认值设置,因为现在是必填项 + if (typeof examData.exam_minutes_min !== "number") { + throw new Error("最少考试时间必须是数字"); + } + + // 确保最少考试时间不大于考试时长 + if (examData.exam_minutes_min > examData.exam_minutes) { + throw new Error("最少考试时间不能大于考试时长"); + } + + return await createExam(examData); + } catch (error) { + console.error("服务层: 创建考试失败", error); + throw error; + } +} + +/** + * 服务层:查询所有考试 + * @returns {Promise} 考试列表 + */ +async function fetchAllExams() { + try { + return await getAllExams(); + } catch (error) { + console.error("服务层: 查询所有考试失败", error); + throw error; + } +} + +/** + * 服务层:根据ID查询考试 + * @param {number} id 考试ID + * @returns {Promise} 考试数据 + */ +async function fetchExamById(id) { + try { + if (!id) { + throw new Error("考试ID不能为空"); + } + + const exam = await getExamById(id); + if (!exam) { + throw new Error("未找到指定考试"); + } + + return exam; + } catch (error) { + console.error("服务层: 根据ID查询考试失败", error); + throw error; + } +} + +/** + * 服务层:更新考试 + * @param {number} id 考试ID + * @param {Object} examData 更新的数据 + * @returns {Promise} 是否更新成功 + */ +async function modifyExam(id, examData) { + try { + if (!id) { + throw new Error("考试ID不能为空"); + } + + // 验证考试是否存在 + const existingExam = await getExamById(id); + if (!existingExam) { + throw new Error("未找到指定考试"); + } + + // 数据验证 - 修改为exam_minutes和exam_minutes_min必填 + if (!examData.exam_minutes || !examData.exam_minutes_min) { + throw new Error("考试时长和最少考试时间为必填项"); + } + + // 移除默认值设置,因为现在是必填项 + if (typeof examData.exam_minutes_min !== "number") { + throw new Error("最少考试时间必须是数字"); + } + + // 确保最少考试时间不大于考试时长 + if (examData.exam_minutes_min > examData.exam_minutes) { + throw new Error("最少考试时间不能大于考试时长"); + } + + return await updateExam(id, examData); + } catch (error) { + console.error("服务层: 更新考试失败", error); + throw error; + } +} + +/** + * 服务层:删除考试 + * @param {number} id 考试ID + * @returns {Promise} 是否删除成功 + */ +async function removeExam(id) { + try { + if (!id) { + throw new Error("考试ID不能为空"); + } + + // 验证考试是否存在 + const existingExam = await getExamById(id); + if (!existingExam) { + throw new Error("未找到指定考试"); + } + + return await deleteExam(id); + } catch (error) { + console.error("服务层: 删除考试失败", error); + throw error; + } +} + +/** + * 服务层:查询ID最大的考试记录 + * @returns {Promise} 考试数据 + */ +async function fetchLastExam() { + try { + return await getLastExam(); + } catch (error) { + console.error("服务层: 查询ID最大的考试失败", error); + throw error; + } +} + +/** + * 初始化考试相关的IPC处理程序 + * @param {Object} ipcMain Electron的ipcMain实例 + */ +function initExamIpc(ipcMain) { + // 考试管理相关IPC + ipcMain.handle("exam-create", async (event, examData) => { + try { + // 确保exam_notice是序列化的JSON字符串 + if (examData.exam_notice && typeof examData.exam_notice === "object") { + examData.exam_notice = JSON.stringify(examData.exam_notice); + } + return await createNewExam(examData); + } catch (error) { + console.error("Failed to create exam:", error); + throw error; + } + }); + + ipcMain.handle("exam-update", async (event, { id, examData }) => { + try { + // 确保exam_notice是序列化的JSON字符串 + if (examData.exam_notice && typeof examData.exam_notice === "object") { + examData.exam_notice = JSON.stringify(examData.exam_notice); + } + return await modifyExam(id, examData); + } catch (error) { + console.error("Failed to update exam:", error); + throw error; + } + }); + + ipcMain.handle("exam-fetch-last", async () => { + try { + const exam = await fetchLastExam(); + // 将exam_notice字符串解析为数组 + if (exam && exam.exam_notice) { + try { + exam.exam_notice = JSON.parse(exam.exam_notice); + } catch (e) { + console.error("解析考试须知失败:", e); + exam.exam_notice = []; + } + } + return exam; + } catch (error) { + console.error("Failed to fetch last exam:", error); + throw error; + } + }); + + ipcMain.handle("exam-fetch-all", async () => { + try { + const exams = await fetchAllExams(); + // 处理每个考试的exam_notice + return exams.map(exam => { + if (exam.exam_notice) { + try { + exam.exam_notice = JSON.parse(exam.exam_notice); + } catch (e) { + console.error(`解析考试(ID: ${exam.id})须知失败:`, e); + exam.exam_notice = []; + } + } + return exam; + }); + } catch (error) { + console.error("Failed to fetch all exams:", error); + return { success: false, error: error.message }; + } + }); + + ipcMain.handle("exam-fetch-by-id", async (event, id) => { + try { + const exam = await fetchExamById(id); + // 处理exam_notice + if (exam && exam.exam_notice) { + try { + exam.exam_notice = JSON.parse(exam.exam_notice); + } catch (e) { + console.error(`解析考试(ID: ${id})须知失败:`, e); + exam.exam_notice = []; + } + } + return { success: true, data: exam }; + } catch (error) { + console.error(`Failed to fetch exam by id ${id}:`, error); + return { success: false, error: error.message }; + } + }); + + ipcMain.handle("exam-delete", async (event, id) => { + try { + const result = await removeExam(id); + return { success: result, data: { id } }; + } catch (error) { + console.error(`Failed to delete exam ${id}:`, error); + return { success: false, error: error.message }; + } + }); +} + +module.exports = { + createNewExam, + fetchAllExams, + fetchExamById, + modifyExam, + removeExam, + fetchLastExam, + initExamIpc +}; \ No newline at end of file diff --git a/src/background/service/examineeService.js b/src/background/service/examineeService.js new file mode 100644 index 0000000..9575cfa --- /dev/null +++ b/src/background/service/examineeService.js @@ -0,0 +1,187 @@ +const { + getAllExaminees, + getExamineeById, + createExaminee, + updateExaminee, + deleteExaminee, + getExamineeByIdCardAndAdmissionTicket +} = require('../db/examinee.js'); + +/** + * 服务层:获取所有考生列表 + * @returns {Promise} 考生列表 + */ +async function fetchAllExamineesService() { + try { + return await getAllExaminees(); + } catch (error) { + console.error('服务层: 获取所有考生列表失败', error); + throw error; + } +} + +/** + * 服务层:根据ID查询考生 + * @param {number} id 考生ID + * @returns {Promise} 考生数据 + */ +async function fetchExamineeByIdService(id) { + try { + return await getExamineeById(id); + } catch (error) { + console.error('服务层: 根据ID查询考生失败', error); + throw error; + } +} + +/** + * 服务层:添加考生 + * @param {Object} examineeData 考生数据 + * @returns {Promise} 添加的考生 + */ +async function createExamineeService(examineeData) { + try { + // 数据验证 + if (!examineeData.examinee_name || !examineeData.examinee_id_card) { + throw new Error('考生姓名和身份证号为必填项'); + } + + return await createExaminee(examineeData); + } catch (error) { + console.error('服务层: 添加考生失败', error); + throw error; + } +} + +/** + * 服务层:更新考生 + * @param {number} id 考生ID + * @param {Object} examineeData 更新的数据 + * @returns {Promise} 是否更新成功 + */ +async function updateExamineeService(id, examineeData) { + try { + if (!id) { + throw new Error('考生ID不能为空'); + } + + // 验证考生是否存在 + const existingExaminee = await getExamineeById(id); + if (!existingExaminee) { + throw new Error('未找到指定考生'); + } + + // 数据验证 + if (!examineeData.examinee_name || !examineeData.examinee_id_card) { + throw new Error('考生姓名和身份证号为必填项'); + } + + return await updateExaminee(id, examineeData); + } catch (error) { + console.error('服务层: 更新考生失败', error); + throw error; + } +} + +/** + * 服务层:删除考生 + * @param {number} id 考生ID + * @returns {Promise} 是否删除成功 + */ +async function deleteExamineeService(id) { + try { + return await deleteExaminee(id); + } catch (error) { + console.error('服务层: 删除考生失败', error); + throw error; + } +} + +/** + * 服务层:考生登录 + * @param {string} idCard 身份证号 + * @param {string} admissionTicket 准考证号 + * @returns {Promise} 考生数据或null + */ +async function fetchExamineeByIdCardAndAdmissionTicketService(idCard, admissionTicket) { + try { + if (!idCard || !admissionTicket) { + throw new Error('身份证号和准考证号不能为空'); + } + return await getExamineeByIdCardAndAdmissionTicket(idCard, admissionTicket); + } catch (error) { + console.error('服务层: 考生登录失败', error); + throw error; + } +} + +/** + * 初始化考生相关的IPC处理程序 + * @param {Object} ipcMain Electron的ipcMain实例 + */ +function initExamineeIpc(ipcMain) { + ipcMain.handle("examinee-fetch-all", async (event) => { + try { + return await fetchAllExamineesService(); + } catch (error) { + console.error("Failed to fetch all examinees:", error); + return []; + } + }); + + ipcMain.handle("user-login", async (event, {idCard, admissionTicket}) => { + try { + return await fetchExamineeByIdCardAndAdmissionTicketService(idCard, admissionTicket); + } catch (error) { + console.error("Failed to login examinee:", error); + return null; + } + }); + + ipcMain.handle("examinee-fetch-by-id", async (event, id) => { + try { + return await fetchExamineeByIdService(id); + } catch (error) { + console.error("Failed to fetch examinee by id:", error); + return null; + } + }); + + ipcMain.handle("examinee-create", async (event, examineeData) => { + try { + return await createExamineeService(examineeData); + } catch (error) { + console.error("Failed to create examinee:", error); + return null; + } + }); + + ipcMain.handle("examinee-update", async (event, {id, examineeData}) => { + try { + return await updateExamineeService(id, examineeData); + } catch (error) { + console.error("Failed to update examinee:", error); + return null; + } + }); + + ipcMain.handle("examinee-delete", async (event, id) => { + try { + return await deleteExamineeService(id); + } catch (error) { + console.error("Failed to delete examinee:", error); + return null; + } + }); +} + +// 导出使用CommonJS格式 +module.exports = { + fetchAllExamineesService, + fetchExamineeByIdService, + createExamineeService, + updateExamineeService, + deleteExamineeService, + fetchExamineeByIdCardAndAdmissionTicketService, + initExamineeIpc +}; \ No newline at end of file diff --git a/src/background/service/examingService.js b/src/background/service/examingService.js new file mode 100644 index 0000000..2297bce --- /dev/null +++ b/src/background/service/examingService.js @@ -0,0 +1,499 @@ +const { + generateExamineePaper, + loadPaperSerial, + getQuestionByRelatedId, + updateExamineeAnswer, + startPaper, + submitPaper, + endPaper, + processPaper, + checkPaperAnswers, + getPaper +} = require('../db/examing.js'); +const { getDbConnection, closeAllConnections } = require('../db/index.js'); +const { getUserDbPath } = require('../db/path.js'); + +/** + * 服务层:生成考生试卷 + * @param {Object} examineeData - 考生数据 + * @param {number} examDuration - 考试时长(分钟) + * @returns {Promise} - 包含试卷ID和状态的对象 + */ +async function generateExamineePaperService(examineeData, examData) { + try { + // 数据验证 + if (!examineeData || !examineeData.id || !examineeData.examinee_name) { + throw new Error("考生数据不完整,必须包含ID和姓名"); + } + + if (!examData || !examData.exam_minutes || examData.exam_minutes <= 0) { + throw new Error("考试时长必须为正数"); + } + + if ( + examData.exam_minutes_min === undefined || + examData.exam_minutes_min < 0 + ) { + throw new Error("最短考试时长必须为非负数"); + } + + const result = await generateExamineePaper(examineeData, examData); + return result; + } catch (error) { + console.error("服务层: 生成考生试卷失败", error); + return { + success: false, + message: `生成试卷失败: ${error.message}`, + }; + } +} + +/** + * 服务层:获取考生试卷状态 + * @param {number} examineeId - 考生ID + * @returns {Promise} - 试卷状态信息 + */ +async function getExamineePaperStatusService(examineeId) { + try { + if (!examineeId || examineeId <= 0) { + throw new Error("考生ID必须为正数"); + } + + const userDb = await getDbConnection(getUserDbPath()); + const paperStatus = await userDb.getAsync( + "SELECT * FROM examinee_papers WHERE examinee_id = ?", + [examineeId] + ); + + return paperStatus; + } catch (error) { + console.error("服务层: 获取考生试卷状态失败", error); + throw error; + } +} + +/** + * 服务层:更新试卷状态 + * @param {number} paperId - 试卷ID + * @param {Object} statusData - 状态数据 + * @returns {Promise} - 是否更新成功 + */ +async function updatePaperStatusService(paperId, statusData) { + try { + if (!paperId || paperId <= 0) { + throw new Error("试卷ID必须为正数"); + } + + const userDb = await getDbConnection(getUserDbPath()); + + // 构建更新字段 + const fields = []; + const values = []; + + if (statusData.paper_start_time !== undefined) { + fields.push("paper_start_time = ?"); + values.push(statusData.paper_start_time); + } + + if (statusData.paper_last_time !== undefined) { + fields.push("paper_last_time = ?"); + values.push(statusData.paper_last_time); + } + + if (statusData.paper_submit_time !== undefined) { + fields.push("paper_submit_time = ?"); + values.push(statusData.paper_submit_time); + } + + if (statusData.paper_end_time !== undefined) { + fields.push("paper_end_time = ?"); + values.push(statusData.paper_end_time); + } + + if (statusData.paper_status !== undefined) { + fields.push("paper_status = ?"); + values.push(statusData.paper_status); + } + + if (statusData.paper_score_real !== undefined) { + fields.push("paper_score_real = ?"); + values.push(statusData.paper_score_real); + } + + if (fields.length === 0) { + return true; // 没有需要更新的字段 + } + + // 添加WHERE条件的值 + values.push(paperId); + + const sql = `UPDATE examinee_papers SET ${fields.join(", ")} WHERE id = ?`; + await userDb.runAsync(sql, values); + + return true; + } catch (error) { + console.error("服务层: 更新试卷状态失败", error); + throw error; + } +} + +/** + * 服务层:加载试卷试题序列 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含试题序列的数组 + */ +async function loadPaperSerialService(paperId) { + try { + if (!paperId || paperId <= 0) { + throw new Error("试卷ID必须为正数"); + } + + const result = await loadPaperSerial(paperId); + return { + success: true, + data: result, + }; + } catch (error) { + console.error("服务层: 加载试卷试题序列失败", error); + return { + success: false, + message: `加载试卷试题序列失败: ${error.message}`, + }; + } +} + +/** + * 服务层:根据表名和ID获取完整的试题数据 + * @param {string} tableName - 表名 (question_choices 或 question_fill_blanks) + * @param {number} id - 记录ID + * @returns {Promise} - 包含试题数据的对象 + */ +async function getQuestionByRelatedIdService(tableName, id) { + try { + const result = await getQuestionByRelatedId(tableName, id); + return { + success: true, + data: result, + }; + } catch (error) { + console.error("服务层: 获取试题数据失败", error); + return { + success: false, + message: `获取试题数据失败: ${error.message}`, + }; + } +} + +/** + * 服务层:更新考生答案 + * @param {string} tableName - 表名 (question_choices 或 question_fill_blanks) + * @param {number} id - 记录ID + * @param {Array|string} answers - 考生答案 + * @returns {Promise} - 包含更新结果的对象 + */ +async function updateExamineeAnswerService(tableName, id, answers) { + try { + if (!["question_choices", "question_fill_blanks"].includes(tableName)) { + throw new Error( + "无效的表名,只能是 question_choices 或 question_fill_blanks" + ); + } + + if (!id || id <= 0) { + throw new Error("记录ID必须为正数"); + } + + const result = await updateExamineeAnswer(tableName, id, answers); + return { + success: true, + message: "答案更新成功", + }; + } catch (error) { + console.error("服务层: 更新考生答案失败", error); + return { + success: false, + message: `更新答案失败: ${error.message}`, + }; + } +} + +/** + * 服务层:开始考试 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果的对象 + */ +async function startPaperService(paperId) { + try { + if (!paperId || paperId <= 0) { + throw new Error("试卷ID必须为正数"); + } + + const result = await startPaper(paperId); + return result; + } catch (error) { + console.error("服务层: 开始考试失败", error); + return { + success: false, + message: `开始考试失败: ${error.message}`, + }; + } +} + +/** + * 服务层:提交考试 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果的对象 + */ +async function submitPaperService(paperId) { + try { + if (!paperId || paperId <= 0) { + throw new Error("试卷ID必须为正数"); + } + + const result = await submitPaper(paperId); + return result; + } catch (error) { + console.error("服务层: 提交考试失败", error); + return { + success: false, + message: `提交考试失败: ${error.message}`, + }; + } +} + +/** + * 服务层:结束考试 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果的对象 + */ +async function endPaperService(paperId) { + try { + if (!paperId || paperId <= 0) { + throw new Error("试卷ID必须为正数"); + } + + const result = await endPaper(paperId); + return result; + } catch (error) { + console.error("服务层: 结束考试失败", error); + return { + success: false, + message: `结束考试失败: ${error.message}`, + }; + } +} + +/** + * 服务层:处理试卷 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果的对象 + */ +async function processPaperService(paperId) { + try { + if (!paperId || paperId <= 0) { + throw new Error("试卷ID必须为正数"); + } + + const result = await processPaper(paperId); + return result; + } catch (error) { + console.error("服务层: 处理试卷失败", error); + return { + success: false, + message: `处理试卷失败: ${error.message}`, + }; + } +} + +/** + * 服务层:检查试卷答案并计算得分 + * @param {number} paperId - 试卷ID + * @returns {Promise} - 包含操作结果和试卷数据的对象 + */ +async function checkPaperAnswersService(paperId) { + try { + if (!paperId || paperId <= 0) { + throw new Error("试卷ID必须为正数"); + } + + const result = await checkPaperAnswers(paperId); + return result; + } catch (error) { + console.error("服务层: 检查试卷答案失败", error); + return { + success: false, + message: `检查试卷答案失败: ${error.message}`, + }; + } +} + +/** + * 初始化考试相关的IPC处理程序 + * @param {import('electron').IpcMain} ipcMain - IPC主进程实例 + */ +function initExamingIpc(ipcMain) { + // 生成考生试卷 + ipcMain.handle( + "examing-generate-paper", + async (event, { examineeData, examData }) => { + try { + return await generateExamineePaperService(examineeData, examData); + } catch (error) { + console.error("生成考生试卷失败:", error); + return { + success: false, + message: `生成试卷失败: ${error.message}`, + }; + } + } + ); + + // 获取考生试卷状态 + ipcMain.handle("examing-get-paper-status", async (event, examineeId) => { + try { + return await getExamineePaperStatusService(examineeId); + } catch (error) { + console.error("获取考生试卷状态失败:", error); + return null; + } + }); + + // 更新试卷状态 + ipcMain.handle( + "examing-update-paper-status", + async (event, { paperId, statusData }) => { + try { + return await updatePaperStatusService(paperId, statusData); + } catch (error) { + console.error("更新试卷状态失败:", error); + return false; + } + } + ); + + // 加载试卷试题序列 + ipcMain.handle("examing-load-paper-serial", async (event, paperId) => { + try { + return await loadPaperSerialService(paperId); + } catch (error) { + console.error("加载试卷试题序列失败:", error); + return { + success: false, + message: `加载试卷试题序列失败: ${error.message}`, + }; + } + }); + + // 根据表名和ID获取完整的试题数据 + ipcMain.handle( + "examing-get-question-by-related-id", + async (event, { tableName, id }) => { + try { + return await getQuestionByRelatedIdService(tableName, id); + } catch (error) { + console.error("获取试题数据失败:", error); + return { + success: false, + message: `获取试题数据失败: ${error.message}`, + }; + } + } + ); + + // 更新考生答案 + ipcMain.handle( + "examing-update-answer", + async (event, { tableName, id, answers }) => { + try { + return await updateExamineeAnswerService(tableName, id, answers); + } catch (error) { + console.error("更新考生答案失败:", error); + return { + success: false, + message: `更新答案失败: ${error.message}`, + }; + } + } + ); + + // 开始考试 + ipcMain.handle("examing-start-paper", async (event, paperId) => { + try { + return await startPaperService(paperId); + } catch (error) { + console.error("开始考试失败:", error); + return { + success: false, + message: `开始考试失败: ${error.message}`, + }; + } + }); + + // 提交考试 + ipcMain.handle("examing-submit-paper", async (event, paperId) => { + try { + return await submitPaperService(paperId); + } catch (error) { + console.error("提交考试失败:", error); + return { + success: false, + message: `提交考试失败: ${error.message}`, + }; + } + }); + + // 结束考试 + ipcMain.handle("examing-end-paper", async (event, paperId) => { + try { + return await endPaperService(paperId); + } catch (error) { + console.error("结束考试失败:", error); + return { + success: false, + message: `结束考试失败: ${error.message}`, + }; + } + }); + + // 处理试卷 + ipcMain.handle("examing-process-paper", async (event, paperId) => { + try { + return await processPaperService(paperId); + } catch (error) { + console.error("处理试卷失败:", error); + return { + success: false, + message: `处理试卷失败: ${error.message}`, + }; + } + }); + + // 检查试卷答案并计算得分 + ipcMain.handle("examing-check-paper-answers", async (event, paperId) => { + try { + return await checkPaperAnswersService(paperId); + } catch (error) { + console.error("检查试卷答案失败:", error); + return { + success: false, + message: `检查试卷答案失败: ${error.message}`, + }; + } + }); +} + +// 导出使用CommonJS格式 +module.exports = { + generateExamineePaperService, + getExamineePaperStatusService, + updatePaperStatusService, + loadPaperSerialService, + getQuestionByRelatedIdService, + updateExamineeAnswerService, + startPaperService, + submitPaperService, + endPaperService, + processPaperService, + checkPaperAnswersService, + initExamingIpc +}; \ No newline at end of file diff --git a/src/background/service/fileService.js b/src/background/service/fileService.js new file mode 100644 index 0000000..3cd7b53 --- /dev/null +++ b/src/background/service/fileService.js @@ -0,0 +1,849 @@ +const fs = require('fs'); +const path = require('path'); +const PDFDocument = require('pdfkit'); +const { app } = require('electron'); + +// 使用更可靠的方式获取应用路径 +const appPath = app.getAppPath(); + +// 修正字体路径常量 - 从应用根路径开始构建 +const FONT_PATH = path.join(appPath, 'src', 'background', 'font'); +// 优先使用SourceHanSansSC字体 +const primaryFontPath = path.join(FONT_PATH, 'SourceHanSansSC-Regular.otf'); +const boldFontPath = path.join(FONT_PATH, 'SourceHanSansSC-Bold.otf'); +// 保留宋体作为备选 +const simsunPath = path.join(FONT_PATH, 'simsun.ttf'); +const fallbackFontPath = path.join(FONT_PATH, 'simsun.ttc'); // 备选字体路径 + +/** + * 服务层:获取所有考生列表 + * @returns {Promise} 考生列表 + */ +exports.createFileService = async function() { + try { + // TODO 测试用 + return '文件服务测试成功'; + } catch (error) { + console.error('服务层: 创建文件失败', error); + throw error; + } +}; + +/** + * 生成PDF文件并保存到合适的目录 + * @param {Object} pdfData - PDF数据 + * @param {string} fileName - 文件名 + * @returns {Promise} 文件保存路径 + */ +exports.generatePdfService = async function(pdfData, fileName) { + try { + // 获取合适的保存目录 + const appDir = path.join(getAppSaveDir(), '..'); + const filePath = path.join(appDir, `${fileName || 'document'}.pdf`); + + return new Promise((resolve, reject) => { + // 创建PDF文档 + const doc = new PDFDocument(); + + // 加载中文字体的标志 + let chineseFontLoaded = false; + let boldFontLoaded = false; + + // 保存当前字体 + let currentFont = null; + + // 修改字体加载逻辑 + try { + // 1. 尝试加载SourceHanSansSC常规字体 + if (fs.existsSync(primaryFontPath)) { + try { + doc.registerFont('SourceHanSans', primaryFontPath); + doc.font('SourceHanSans'); + currentFont = 'SourceHanSans'; + chineseFontLoaded = true; + console.log('成功加载SourceHanSansSC-Regular.otf字体'); + } catch (error) { + console.error('加载SourceHanSansSC-Regular.otf字体失败:', error); + } + } + + // 2. 尝试加载SourceHanSansSC粗体字体(用于标题) + if (fs.existsSync(boldFontPath)) { + try { + doc.registerFont('SourceHanSansBold', boldFontPath); + boldFontLoaded = true; + console.log('成功加载SourceHanSansSC-Bold.otf字体'); + } catch (error) { + console.error('加载SourceHanSansSC-Bold.otf字体失败:', error); + } + } + + // 3. 如果SourceHanSansSC字体加载失败,尝试加载宋体 + if (!chineseFontLoaded) { + if (fs.existsSync(simsunPath)) { + try { + doc.registerFont('SimSun', simsunPath); + doc.font('SimSun'); + currentFont = 'SimSun'; + chineseFontLoaded = true; + console.log('成功加载simsun.ttf字体'); + } catch (ttfError) { + console.error('加载simsun.ttf字体失败:', ttfError); + // 尝试加载备选TTC字体 + if (fs.existsSync(fallbackFontPath)) { + try { + doc.registerFont('SimSun', fallbackFontPath); + doc.font('SimSun'); + currentFont = 'SimSun'; + chineseFontLoaded = true; + console.log('成功加载simsun.ttc字体'); + } catch (ttcError) { + console.error('加载simsun.ttc字体失败:', ttcError); + } + } + } + } else { + console.warn(`未找到simsun.ttf字体文件: ${simsunPath}`); + // 检查是否有备选TTC字体 + if (fs.existsSync(fallbackFontPath)) { + try { + doc.registerFont('SimSun', fallbackFontPath); + doc.font('SimSun'); + currentFont = 'SimSun'; + chineseFontLoaded = true; + console.log('成功加载simsun.ttc字体'); + } catch (error) { + console.error('加载simsun.ttc字体失败:', error); + } + } + } + } + + if (!chineseFontLoaded) { + console.warn('无法加载中文字体,将使用默认字体,可能导致中文显示异常'); + // 在macOS上尝试使用系统字体 + if (process.platform === 'darwin') { + try { + doc.font('Arial Unicode MS'); // macOS内置支持多语言的字体 + currentFont = 'Arial Unicode MS'; + chineseFontLoaded = true; + console.log('成功加载系统Arial Unicode MS字体'); + } catch (error) { + console.error('加载系统字体失败:', error); + } + } + } + } catch (error) { + console.error('加载字体失败:', error); + console.warn('将使用默认字体,可能导致中文显示异常'); + } + + // 保存到文件 + const writeStream = fs.createWriteStream(filePath); + doc.pipe(writeStream); + + // 设置文档标题 + if (pdfData.title) { + // 保存当前字体 + const tempFont = currentFont; + try { + // 尝试使用粗体字体 + if (boldFontLoaded) { + doc.fontSize(20).font('SourceHanSansBold').text(pdfData.title, { align: 'center' }).moveDown(); + } else if (process.platform === 'darwin') { + doc.fontSize(20).font('Arial Unicode MS Bold').text(pdfData.title, { align: 'center' }).moveDown(); + } else { + doc.fontSize(20).text(pdfData.title, { align: 'center' }).moveDown(); + } + } catch (error) { + console.error('设置标题字体失败:', error); + doc.fontSize(20).text(pdfData.title, { align: 'center' }).moveDown(); + } + // 恢复字体 + if (currentFont) { + doc.font(currentFont); + } + } + + // 添加内容 + if (pdfData.content) { + pdfData.content.forEach(item => { + if (item.type === 'text') { + doc.fontSize(item.fontSize || 12).text(item.text, item.options || {}).moveDown(); + } else if (item.type === 'heading') { + // 保存当前字体 + const tempFont = currentFont; + try { + // 尝试使用SourceHanSansBold粗体字体 + if (boldFontLoaded) { + doc.fontSize(item.fontSize || 16).font('SourceHanSansBold').text(item.text, item.options || {}).moveDown(); + } else if (process.platform === 'darwin') { + doc.fontSize(item.fontSize || 16).font('Arial Unicode MS Bold').text(item.text, item.options || {}).moveDown(); + } else { + // 如果没有粗体字体,使用当前字体加大字号 + doc.fontSize(item.fontSize || 16).text(item.text, item.options || {}).moveDown(); + } + } catch (error) { + console.error('切换到粗体字体失败:', error); + doc.fontSize(item.fontSize || 16).text(item.text, item.options || {}).moveDown(); + } + // 恢复之前的字体 + if (currentFont) { + doc.font(currentFont); + } + } else if (item.type === 'table') { + // 改进表格实现 + const { headers, rows } = item; + const cellWidth = 100; + const baseCellHeight = 25; // 增加基础单元格高度,更好地适应中文 + const marginLeft = 50; + let currentY = doc.y; + const fontSize = 12; + + // 辅助函数:计算文本在指定宽度内的行数 + const calculateLines = (text, width) => { + // 估算每行字符数(假设平均字符宽度为字体大小的一半) + const charsPerLine = Math.floor(width / (fontSize / 2)); + const lines = []; + let currentText = text; + + while (currentText.length > 0) { + // 找到合适的换行位置 + let splitIndex = Math.min(currentText.length, charsPerLine); + // 尝试在空格处换行 + if (currentText.length > splitIndex && currentText[splitIndex] !== ' ') { + const lastSpace = currentText.lastIndexOf(' ', splitIndex); + if (lastSpace > 0) { + splitIndex = lastSpace; + } + } + lines.push(currentText.substring(0, splitIndex).trim()); + currentText = currentText.substring(splitIndex).trim(); + } + return lines; + }; + + // 绘制表头 + headers.forEach((header, i) => { + // 计算单元格实际高度(考虑换行) + const lines = calculateLines(header, cellWidth - 10); + const cellHeight = Math.max(baseCellHeight, lines.length * 15); + + doc.rect(marginLeft + i * cellWidth, currentY, cellWidth, cellHeight).stroke(); + + // 保存当前字体 + const tempFont = currentFont; + try { + if (boldFontLoaded) { + doc.font('SourceHanSansBold'); + } else if (process.platform === 'darwin') { + doc.font('Arial Unicode MS Bold'); + } + // 垂直居中显示文本 + doc.fontSize(fontSize).text(header, marginLeft + i * cellWidth + 5, currentY + (cellHeight - lines.length * 15) / 2, { + width: cellWidth - 10, + height: cellHeight - 10 + }); + } catch (error) { + console.error('设置表头字体失败:', error); + doc.fontSize(fontSize).text(header, marginLeft + i * cellWidth + 5, currentY + (cellHeight - lines.length * 15) / 2, { + width: cellWidth - 10, + height: cellHeight - 10 + }); + } + // 恢复字体 + if (currentFont) { + doc.font(currentFont); + } + }); + // 移动到下一行,考虑最高的表头单元格高度 + const headerLines = headers.map(header => calculateLines(header, cellWidth - 10).length); + const maxHeaderLines = Math.max(...headerLines); + currentY += Math.max(baseCellHeight, maxHeaderLines * 15) + 5; // 添加一些间距 + + // 绘制行 + rows.forEach(row => { + // 计算这一行中最高的单元格 + const rowLines = row.map(cell => calculateLines(cell.toString(), cellWidth - 10).length); + const maxRowLines = Math.max(...rowLines); + const rowHeight = Math.max(baseCellHeight, maxRowLines * 15); + + row.forEach((cell, i) => { + doc.rect(marginLeft + i * cellWidth, currentY, cellWidth, rowHeight).stroke(); + const cellLines = calculateLines(cell.toString(), cellWidth - 10); + doc.fontSize(fontSize).text(cell.toString(), marginLeft + i * cellWidth + 5, currentY + (rowHeight - cellLines.length * 15) / 2, { + width: cellWidth - 10, + height: rowHeight - 10 + }); + }); + + // 移动到下一行 + currentY += rowHeight + 5; // 添加一些间距 + }); + + // 更新文档的当前Y位置 + doc.y = currentY; + } + }); + } + + // 结束文档 + doc.end(); + + // 监听完成事件 + writeStream.on('finish', () => { + resolve(filePath); + }); + + // 监听错误事件 + writeStream.on('error', (error) => { + reject(error); + }); + }); + } catch (error) { + console.error('服务层: 生成PDF失败', error); + throw error; + } +}; + +/** + * 初始化文件相关IPC服务 + * @param {ipcMain} ipcMain - Electron IPC主进程实例 + */ +exports.initFileIpc = function(ipcMain) { + // 测试用接口 + ipcMain.handle('file-test', async () => { + try { + // 测试用 + return '文件服务测试成功'; + } catch (error) { + console.error('服务层: 文件测试失败:', error); + return { success: false, message: error.message }; + } + }); + + // 生成PDF文件接口 + ipcMain.handle('file-generate-pdf', async (event, pdfData, fileName) => { + try { + const filePath = await exports.generatePdfService(pdfData, fileName); + return { success: true, filePath }; + } catch (error) { + console.error('服务层: 生成PDF失败:', error); + return { success: false, message: error.message }; + } + }); + + // 生成试卷PDF文件接口 + ipcMain.handle('file-generate-paper-pdf', async (event, jsonString) => { + try { + const filePath = await exports.generatePaperPdf(jsonString); + return { success: true, filePath }; + } catch (error) { + console.error('服务层: 生成试卷PDF失败:', error); + return { success: false, message: error.message }; + } + }); + + // 复制文件到桌面接口 + ipcMain.handle('file-copy-to-desktop', async (event, filePath) => { + try { + const destPath = await exports.copyToDesk(filePath); + return { success: true, filePath: destPath }; + } catch (error) { + console.error('服务层: 复制文件到桌面失败:', error); + return { success: false, message: error.message }; + } + }); +}; + +/** + * 获取应用保存目录,适配不同操作系统和环境 + * @returns {string} 保存目录路径 + */ +function getAppSaveDir() { + // 判断是否为开发环境 + const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged; + + if (isDev) { + // 开发环境:使用项目根目录 + const outputDir = path.join(process.cwd(), 'output'); + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + return outputDir; + } else { + // 检测是否为便携模式 + const exePath = app.getPath('exe'); + const appDir = path.dirname(exePath); + const portableFlagPath = path.join(appDir, 'portable.txt'); + const isPortable = fs.existsSync(portableFlagPath); + + // 便携模式:使用应用根目录 + if (isPortable) { + return appDir; + } else { + // 非便携模式:使用应用同级的output目录 + const outputDir = path.join(appDir, 'output'); + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + return outputDir; + } + } +} + +/** + * 获取用户桌面目录路径 + * @returns {string} 用户桌面绝对路径 + */ +function getDesktopDir() { + try { + // 使用Electron的app.getPath方法获取桌面路径 + return app.getPath('desktop'); + } catch (error) { + console.error('获取桌面路径失败:', error); + // 发生错误时,返回当前工作目录作为备选 + return process.cwd(); + } +} + +/** + * 将文件复制到用户桌面 + * @param {string} filePath - 要复制的文件的绝对路径 + * @returns {Promise} 复制后的文件路径 + */ +exports.copyToDesk = async function(filePath) { + try { + const desktopDir = getDesktopDir(); + const fileName = path.basename(filePath); + const destPath = path.join(desktopDir, fileName); + + // 使用fs.promises进行文件复制 + await fs.promises.copyFile(filePath, destPath); + console.log(`文件已成功复制到桌面: ${destPath}`); + return destPath; + } catch (error) { + console.error('复制文件到桌面失败:', error); + throw error; + } +}; + +/** + * 生成试卷PDF文件 + * @param {string} jsonString - 包含试卷信息的JSON字符串 + * @returns {Promise} - 生成的PDF文件绝对路径 + */ +exports.generatePaperPdf = async function(jsonString) { + try { + // 解析JSON字符串 + const paperData = JSON.parse(jsonString); + + // 提取考生信息 + const { examinee } = paperData; + const examineeName = examinee.examinee_name; + const idCard = examinee.examinee_id_card; + const admissionTicket = examinee.examinee_admission_ticket; + + // 提取考试时间信息 + const startTime = paperData.paper_start_time; + const endTime = paperData.paper_end_time; + // 截取考试日期 (假设格式为 'YYYY-MM-DD HH:mm:ss') + const examDate = startTime.split(' ')[0]; + // 计算用时(分钟) + const start = new Date(startTime.replace(/-/g, '/')); + const end = new Date(endTime.replace(/-/g, '/')); + const durationMinutes = Math.round((end - start) / (1000 * 60)); + + // 提取试卷信息 + // 计算总题量(每个question下的choice题和fill_blank题的数量之和) + let totalQuestions = 0; + paperData.questions.forEach(question => { + if (question.choices && question.choices.length > 0) { + totalQuestions += question.choices.length; + } + if (question.blanks && question.blanks.length > 0) { + totalQuestions += question.blanks.length; + } + }); + const totalScore = paperData.paper_score; + const realScore = paperData.paper_score_real; + + // 对questions列表按照question_type和id进行排序 + paperData.questions.sort((a, b) => { + // 先按题型排序 + if (a.question_type !== b.question_type) { + return a.question_type.localeCompare(b.question_type); + } + // 再按id排序 + return a.id - b.id; + }); + + // 生成文件名 + // 格式化paper_end_time,移除特殊字符 + const endDate = new Date(endTime.replace(/-/g, '/')); + const formattedEndTime = [ + endDate.getFullYear(), + String(endDate.getMonth() + 1).padStart(2, '0'), + String(endDate.getDate()).padStart(2, '0'), + String(endDate.getHours()).padStart(2, '0'), + String(endDate.getMinutes()).padStart(2, '0'), + String(endDate.getSeconds()).padStart(2, '0') + ].join(''); + const fileName = `${examineeName}_${idCard}_${formattedEndTime}.pdf`; + + // 获取保存路径 + const appDir = getAppSaveDir(); + // 确保目录存在 + if (!fs.existsSync(appDir)) { + fs.mkdirSync(appDir, { recursive: true }); + } + const filePath = path.join(appDir, fileName); + + // 创建PDF文档,保留默认边距 + const doc = new PDFDocument({ + size: 'A4', + margin: 50 + }); + + // 加载中文字体 + const FONT_PATH = path.join(__dirname, '..', 'font'); + const primaryFontPath = path.join(FONT_PATH, 'SourceHanSansSC-Regular.otf'); + const boldFontPath = path.join(FONT_PATH, 'SourceHanSansSC-Bold.otf'); + const simsunPath = path.join(FONT_PATH, 'simsun.ttf'); + const fallbackFontPath = path.join(FONT_PATH, 'simsun.ttc'); + + let chineseFontLoaded = false; + let boldFontLoaded = false; + let currentFont = null; + + // 尝试加载字体 + try { + if (fs.existsSync(primaryFontPath)) { + doc.registerFont('SourceHanSans', primaryFontPath); + doc.font('SourceHanSans'); + currentFont = 'SourceHanSans'; + chineseFontLoaded = true; + } else if (fs.existsSync(simsunPath)) { + doc.registerFont('SimSun', simsunPath); + doc.font('SimSun'); + currentFont = 'SimSun'; + chineseFontLoaded = true; + } else if (fs.existsSync(fallbackFontPath)) { + doc.registerFont('SimSun', fallbackFontPath); + doc.font('SimSun'); + currentFont = 'SimSun'; + chineseFontLoaded = true; + } else if (process.platform === 'darwin') { + doc.font('Arial Unicode MS'); + currentFont = 'Arial Unicode MS'; + chineseFontLoaded = true; + } + + if (fs.existsSync(boldFontPath)) { + doc.registerFont('SourceHanSansBold', boldFontPath); + boldFontLoaded = true; + } + + if (!chineseFontLoaded) { + console.warn('无法加载中文字体,可能导致中文显示异常'); + } + } catch (error) { + console.error('加载字体失败:', error); + } + + // 保存到文件 + const writeStream = fs.createWriteStream(filePath); + doc.pipe(writeStream); + + // 添加标题 + if (boldFontLoaded) { + doc.font('SourceHanSansBold'); + } else if (process.platform === 'darwin' && currentFont === 'Arial Unicode MS') { + doc.font('Arial Unicode MS Bold'); + } + doc.fontSize(24).text('机考试卷', { align: 'center' }).moveDown(2); + + // 恢复常规字体 + if (currentFont) { + doc.font(currentFont); + } + + // 辅助函数:绘制表格 + function drawTable(headers, rows, cellWidth = 120, baseCellHeight = 25) { + // 从左边距开始 + const marginLeft = doc.page.margins.left; + let currentY = doc.y; + const fontSize = 12; + const pageWidth = doc.page.width - doc.page.margins.left - doc.page.margins.right; + + // 计算文本在指定宽度内的行数 + const calculateLines = (text, width) => { + const charsPerLine = Math.floor(width / (fontSize / 2)); + const lines = []; + let currentText = text; + + while (currentText.length > 0) { + let splitIndex = Math.min(currentText.length, charsPerLine); + if (currentText.length > splitIndex && currentText[splitIndex] !== ' ') { + const lastSpace = currentText.lastIndexOf(' ', splitIndex); + if (lastSpace > 0) { + splitIndex = lastSpace; + } + } + lines.push(currentText.substring(0, splitIndex).trim()); + currentText = currentText.substring(splitIndex).trim(); + } + return lines; + }; + + // 确保表格不会超出页面宽度 + const totalTableWidth = headers.length * cellWidth; + const adjustedCellWidth = totalTableWidth > pageWidth ? pageWidth / headers.length : cellWidth; + + // 绘制表头 + headers.forEach((header, i) => { + const lines = calculateLines(header, adjustedCellWidth - 10); + const cellHeight = Math.max(baseCellHeight, lines.length * 15); + + doc.rect(marginLeft + i * adjustedCellWidth, currentY, adjustedCellWidth, cellHeight).stroke(); + + if (boldFontLoaded) { + doc.font('SourceHanSansBold'); + } else if (process.platform === 'darwin' && currentFont === 'Arial Unicode MS') { + doc.font('Arial Unicode MS Bold'); + } + + doc.fontSize(fontSize).text(header, marginLeft + i * adjustedCellWidth + 5, currentY + (cellHeight - lines.length * 15) / 2, { + width: adjustedCellWidth - 10, + height: cellHeight - 10 + }); + + if (currentFont) { + doc.font(currentFont); + } + }); + + // 移动到下一行(无间隙) + const headerLines = headers.map(header => calculateLines(header, adjustedCellWidth - 10).length); + const maxHeaderLines = Math.max(...headerLines); + currentY += Math.max(baseCellHeight, maxHeaderLines * 15); + + // 绘制行 + rows.forEach(row => { + const rowLines = row.map(cell => calculateLines(cell.toString(), adjustedCellWidth - 10).length); + const maxRowLines = Math.max(...rowLines); + const rowHeight = Math.max(baseCellHeight, maxRowLines * 15); + + row.forEach((cell, i) => { + doc.rect(marginLeft + i * adjustedCellWidth, currentY, adjustedCellWidth, rowHeight).stroke(); + const cellLines = calculateLines(cell.toString(), adjustedCellWidth - 10); + doc.fontSize(fontSize).text(cell.toString(), marginLeft + i * adjustedCellWidth + 5, currentY + (rowHeight - cellLines.length * 15) / 2, { + width: adjustedCellWidth - 10, + height: rowHeight - 10 + }); + }); + + currentY += rowHeight; // 无间隙 + }); + + doc.y = currentY; + } + + // 辅助函数:添加base64图片 + function addBase64Image(base64String, maxWidth = 400, maxHeight = 300) { + try { + // 移除base64前缀 + const base64Data = base64String.replace(/^data:image\/\w+;base64,/, ''); + // 将base64转换为缓冲区 + const imageBuffer = Buffer.from(base64Data, 'base64'); + // 获取图片尺寸 + const image = doc.openImage(imageBuffer); + // 计算缩放比例 + const scale = Math.min(maxWidth / image.width, maxHeight / image.height, 1); + // 添加图片,从左边距开始 + doc.image(image, doc.page.margins.left, doc.y, { + width: image.width * scale, + height: image.height * scale + }); + // 移动文档指针 + doc.y += image.height * scale + 10; + } catch (error) { + console.error('添加图片失败:', error); + doc.fontSize(10).text('图片加载失败', doc.page.margins.left, doc.y).moveDown(); + } + } + + // 绘制考生信息表格 + drawTable( + ['姓名', '身份证号', '准考证号'], + [[examineeName, idCard, admissionTicket]] + ); + doc.moveDown(); + + // 绘制考试信息表格 + drawTable( + ['考试日期', '开始时间', '结束时间', '用时(分钟)'], + [[examDate, startTime.split(' ')[1], endTime.split(' ')[1], durationMinutes.toString()]] + ); + doc.moveDown(); + + // 绘制试卷信息表格 + drawTable( + ['总题量', '试卷总分', '考试得分'], + [[totalQuestions.toString(), totalScore.toString(), realScore.toString()]] + ); + doc.moveDown(2); + + // 添加题目信息 + paperData.questions.forEach((question, index) => { + // 题目类型和描述 + if (boldFontLoaded) { + doc.font('SourceHanSansBold'); + } else if (process.platform === 'darwin' && currentFont === 'Arial Unicode MS') { + doc.font('Arial Unicode MS Bold'); + } + doc.fontSize(14).text(`第 ${index + 1} 题 (${question.question_type_name})`, doc.page.margins.left).moveDown(); + + if (currentFont) { + doc.font(currentFont); + } + // 确保题干描述从左边距开始 + doc.fontSize(12).text(question.question_description, { + x: doc.page.margins.left, + width: doc.page.width - doc.page.margins.left - doc.page.margins.right + }).moveDown(); + + // 添加图片 + if (question.images && question.images.length > 0) { + doc.fontSize(12).text('图片:', doc.page.margins.left).moveDown(); + question.images.forEach((image) => { + if (image.image_base64) { + addBase64Image(image.image_base64); + } else { + doc.fontSize(10).text(`图片: ${image.image_name || '无名称'}`, doc.page.margins.left).moveDown(); + } + }); + } + + // 添加数据集 + if (question.datasets && question.datasets.length > 0) { + doc.fontSize(12).text('数据集:', doc.page.margins.left).moveDown(); + question.datasets.forEach((dataset, dataIndex) => { + doc.fontSize(10).text(`数据集 ${dataIndex + 1} (${dataset.dataset_name || '无名称'})`, doc.page.margins.left).moveDown(); + // 尝试解析数据集数据为表格 + try { + const datasetData = JSON.parse(dataset.dataset_data); + if (Array.isArray(datasetData) && datasetData.length > 0) { + // 假设第一行是表头 + const headers = Object.keys(datasetData[0]); + const rows = datasetData.map(item => headers.map(header => item[header])); + // 缩小单元格宽度以适应页面 + drawTable(headers, rows, 80, 20); + } + } catch (error) { + console.error('解析数据集失败:', error); + doc.fontSize(10).text(`数据集内容: ${dataset.dataset_data.substring(0, 100)}...`, doc.page.margins.left).moveDown(); + } + }); + } + + // 添加填空题 + if (question.blanks && question.blanks.length > 0) { + question.blanks.forEach((blank, blankIndex) => { + if (boldFontLoaded) { + doc.font('SourceHanSansBold'); + } else if (process.platform === 'darwin' && currentFont === 'Arial Unicode MS') { + doc.font('Arial Unicode MS Bold'); + } + doc.fontSize(12).text(`填空 ${blankIndex + 1}`, doc.page.margins.left).moveDown(); + + if (currentFont) { + doc.font(currentFont); + } + // 确保问题描述从左边距开始 + doc.fontSize(12).text(blank.blank_description, { + x: doc.page.margins.left, + width: doc.page.width - doc.page.margins.left - doc.page.margins.right + }).moveDown(); + drawTable( + ['正确答案', '考生答案', '分值', '得分'], + [ + [ + Array.isArray(blank.correct_answers) ? blank.correct_answers.join(', ') : blank.correct_answers, + Array.isArray(blank.examinee_answers) ? blank.examinee_answers.join(', ') : blank.examinee_answers, + blank.score.toString(), + blank.score_real.toString() + ] + ], + 100 + ); + }); + } + + // 添加选择题 + if (question.choices && question.choices.length > 0) { + question.choices.forEach((choice, choiceIndex) => { + if (boldFontLoaded) { + doc.font('SourceHanSansBold'); + } else if (process.platform === 'darwin' && currentFont === 'Arial Unicode MS') { + doc.font('Arial Unicode MS Bold'); + } + doc.fontSize(12).text(`选择题 ${choiceIndex + 1}`, doc.page.margins.left).moveDown(); + + if (currentFont) { + doc.font(currentFont); + } + // 确保问题描述从左边距开始 + doc.fontSize(12).text(choice.choice_description, { + x: doc.page.margins.left, + width: doc.page.width - doc.page.margins.left - doc.page.margins.right + }).moveDown(); + // 显示选项 + if (choice.choice_options && choice.choice_options.length > 0) { + const optionsText = choice.choice_options.map((option, i) => { + const optionLabel = String.fromCharCode(65 + i); // A, B, C, D... + return `${optionLabel}. ${option}`; + }).join(' '); + doc.fontSize(10).text(`选项: ${optionsText}`, doc.page.margins.left).moveDown(); + } + drawTable( + ['正确答案', '考生答案', '分值', '得分'], + [ + [ + Array.isArray(choice.correct_answers) ? choice.correct_answers.join(', ') : choice.correct_answers, + Array.isArray(choice.examinee_answers) ? choice.examinee_answers.join(', ') : choice.examinee_answers, + choice.score.toString(), + choice.score_real.toString() + ] + ], + 100 + ); + }); + } + + // 分页处理 + if (doc.y > 700) { + doc.addPage(); + } + }); + + // 结束文档 + doc.end(); + + return new Promise((resolve, reject) => { + writeStream.on('finish', async () => { + try { + // 调用copyToDesk方法将文件复制到桌面,获取新的路径 + const newFilePath = await exports.copyToDesk(filePath); + resolve(newFilePath); + } catch (error) { + reject(error); + } + }); + writeStream.on('error', reject); + }); + } catch (error) { + console.error('生成PDF失败:', error); + throw error; + } +}; \ No newline at end of file diff --git a/src/background/service/questionService.js b/src/background/service/questionService.js index e0bcfc0..e049c75 100644 --- a/src/background/service/questionService.js +++ b/src/background/service/questionService.js @@ -248,7 +248,7 @@ async function fetchQuestionsCountAndScore() { * 初始化试题相关IPC通信 * @param {Electron.IpcMain} ipcMain - IPC主进程实例 */ -async function initQuestionIpc(ipcMain) { +function initQuestionIpc(ipcMain) { // 题干管理相关IPC ipcMain.handle("question-create", async (event, questionData) => { try { diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue deleted file mode 100644 index b9f3c7d..0000000 --- a/src/components/HelloWorld.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - diff --git a/src/components/common/Footer.vue b/src/components/common/Footer.vue new file mode 100644 index 0000000..05ed7c5 --- /dev/null +++ b/src/components/common/Footer.vue @@ -0,0 +1,53 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/Header.vue b/src/components/common/Header.vue new file mode 100644 index 0000000..9dcec78 --- /dev/null +++ b/src/components/common/Header.vue @@ -0,0 +1,36 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/Loading.vue b/src/components/common/Loading.vue new file mode 100644 index 0000000..ac60870 --- /dev/null +++ b/src/components/common/Loading.vue @@ -0,0 +1,52 @@ + + + + + \ No newline at end of file diff --git a/src/preload.js b/src/preload.js index 640d39c..238e968 100644 --- a/src/preload.js +++ b/src/preload.js @@ -47,6 +47,41 @@ contextBridge.exposeInMainWorld('electronAPI', { questionGetStatistics: () => ipcRenderer.invoke('question-get-statistics'), questionGetQuestionById: (questionId) => ipcRenderer.invoke('question-get-question-by-id', questionId), + // 考试服务相关接口 + examCreate: (examData) => ipcRenderer.invoke('exam-create', examData), + examUpdate: (id, examData) => ipcRenderer.invoke('exam-update', { id, examData }), + examFetchLast: () => ipcRenderer.invoke('exam-fetch-last'), + examFetchAll: () => ipcRenderer.invoke('exam-fetch-all'), + examFetchById: (id) => ipcRenderer.invoke('exam-fetch-by-id', id), + examDelete: (id) => ipcRenderer.invoke('exam-delete', id), + + // 考生服务相关接口 + examineeFetchAll: () => ipcRenderer.invoke('examinee-fetch-all'), + userLogin: ({ idCard, admissionTicket }) => ipcRenderer.invoke('user-login', { idCard, admissionTicket }), + examineeFetchById: (id) => ipcRenderer.invoke('examinee-fetch-by-id', id), + examineeCreate: (examineeData) => ipcRenderer.invoke('examinee-create', examineeData), + examineeUpdate: (id, examineeData) => ipcRenderer.invoke('examinee-update', { id, examineeData }), + examineeDelete: (id) => ipcRenderer.invoke('examinee-delete', id), + + // 考生考试服务相关接口 + examingGeneratePaper: ({ examineeId, examId }) => ipcRenderer.invoke('examing-generate-paper', { examineeId, examId }), + examingGetPaperStatus: ({ examineeId, examId }) => ipcRenderer.invoke('examing-get-paper-status', { examineeId, examId }), + examingUpdatePaperStatus: ({ paperId, status }) => ipcRenderer.invoke('examing-update-paper-status', { paperId, status }), + examingLoadPaperSerial: ({ paperId }) => ipcRenderer.invoke('examing-load-paper-serial', { paperId }), + examingGetQuestionByRelatedId: ({ tableName, relatedId }) => ipcRenderer.invoke('examing-get-question-by-related-id', { tableName, relatedId }), + examingUpdateAnswer: ({ paperId, questionId, answer }) => ipcRenderer.invoke('examing-update-answer', { paperId, questionId, answer }), + examingStartPaper: ({ paperId }) => ipcRenderer.invoke('examing-start-paper', { paperId }), + examingSubmitPaper: ({ paperId }) => ipcRenderer.invoke('examing-submit-paper', { paperId }), + examingEndPaper: ({ paperId }) => ipcRenderer.invoke('examing-end-paper', { paperId }), + examingProcessPaper: ({ paperId }) => ipcRenderer.invoke('examing-process-paper', { paperId }), + examingCheckPaperAnswers: ({ paperId }) => ipcRenderer.invoke('examing-check-paper-answers', { paperId }), + + // 文件服务相关接口 + fileTest: () => ipcRenderer.invoke('file-test'), + fileGeneratePdf: (pdfData, fileName) => ipcRenderer.invoke('file-generate-pdf', pdfData, fileName), + fileGeneratePaperPdf: (jsonString) => ipcRenderer.invoke('file-generate-paper-pdf', jsonString), + fileCopyToDesktop: (filePath) => ipcRenderer.invoke('file-copy-to-desktop', filePath), + // 保留原有的ipcRenderer接口,确保兼容性 ipcRenderer: { invoke: (channel, data) => ipcRenderer.invoke(channel, data) diff --git a/src/router/index.js b/src/router/index.js index d36779e..30d5e33 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,22 +1,14 @@ import Vue from 'vue' import VueRouter from 'vue-router' -import Home from '../views/Home.vue' +import WelcomeView from '../views/WelcomeView.vue' Vue.use(VueRouter) const routes = [ { path: '/', - name: 'Home', - component: Home - }, - { - path: '/about', - name: 'About', - // route level code-splitting - // this generates a separate chunk (about.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') + name: 'Welcome', + component: WelcomeView } ] diff --git a/src/store/index.js b/src/store/index.js index 332b916..793e671 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -5,8 +5,18 @@ Vue.use(Vuex) export default new Vuex.Store({ state: { + examinee: null, // 保存考生信息 + isLoggedIn: false // 登录状态 }, mutations: { + setExaminee(state, examineeInfo) { + state.examinee = examineeInfo + state.isLoggedIn = true + }, + clearExaminee(state) { + state.examinee = null + state.isLoggedIn = false + } }, actions: { }, diff --git a/src/views/About.vue b/src/views/About.vue deleted file mode 100644 index 3fa2807..0000000 --- a/src/views/About.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/src/views/Home.vue b/src/views/Home.vue deleted file mode 100644 index b908b7e..0000000 --- a/src/views/Home.vue +++ /dev/null @@ -1,627 +0,0 @@ - - - - - diff --git a/src/views/WelcomeView.vue b/src/views/WelcomeView.vue new file mode 100644 index 0000000..747745d --- /dev/null +++ b/src/views/WelcomeView.vue @@ -0,0 +1,325 @@ + + + + + \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index adb202c..90df805 100644 --- a/vue.config.js +++ b/vue.config.js @@ -4,11 +4,34 @@ module.exports = { nodeIntegration: false, contextIsolation: true, preload: 'src/preload.js', - // 添加这一行,指定主进程文件路径 mainProcessFile: 'src/background/main.js', - // If you want to use ESLint for your preload script, - // set lintPreloadFiles to true - lintPreloadFiles: false + lintPreloadFiles: false, + // 将externals改为数组格式 + externals: ['fontkit', 'pdfkit'], + chainWebpackMainProcess: (config) => { + config.module + .rule('babel') + .test(/\.js$/) + .use('babel-loader') + .loader('babel-loader') + .options({ + presets: ['@babel/preset-env'], + plugins: [ + '@babel/plugin-proposal-optional-chaining', + '@babel/plugin-proposal-class-properties' + ] + }) + .end() + + // 添加对mjs文件的处理 + config.module + .rule('mjs') + .test(/\.mjs$/) + .include + .add(/node_modules/) + .end() + .type('javascript/auto') + } } } } \ No newline at end of file

~|s3R_WM|LY6>;)Y2!xk2w!2XSWiz^~du<#w*LbC$oZ> zjJJO3V^Z6mPG&BDXsqk*ezEsd@Yml*u@HXM9jXIM(27}7G(CVR@6~AU*8fZhg?(qF zO-g8KT;|TcE5Cf`MSOqbm`c_>k$v<1y+x%L{fLlIKEmN?o~su4v!AWpZg@ZPbDa<> z!OZDNhDYT`rbJkO2r(<$!B~Ot(1dF*nCAF zk#$d(VEHm&-t?)T6pNL*u8S1GXIZc^F(PQ)(m`tpzHbM6(Uq{a;`m*X{S!{RKs8U_to@mIyR($S|-&Z~$wnQh9QkWBBhY+D)J!05J1%_5aLh&cKEEEI~C3*|8WdrQD z=W}j|qWCxgnjmMi_yy4fI-2_xgX1>}YMJ`8-0wV>ti68>joO35?kp+7(mZpZei;vJ+|MF zG3}3Ub!z%@jnJRGzis=a+xF9L`>1~iyc?DvX?^MglEWCR+RC_;Vi+`2q z-kVBNrXc1MN-#K=8@APtXSXiLAaDzBvA8Sy38G}+_W35u^$Fh62M#*MK8`06_F?$z z1HVJem-p!wHU@JQYHF-Ty<7VS3C@OYSSU=zv_8AgFsxt&DMhVTlFGe*sE9LT@4@_$ z(GQ9IFK+Gmk?sUO`%t!E6y5g&ba58Vh}nxa!kk?hh5EImqiV*eNJ7YuKKdlo|5WUd zgJ`4;G8389ijQcfQ7UZl2_9Y^g zy*FBqrHO&dz*d&n_yG*Ll)0#nGxK~FX0~4@Q?2dzJ$^u?2>W3QY5NETlhDW8m#K(8 z7ZEWC?k^4Z@ss1Bi!1AXJ%GT z5o^rm_?4Q{(Q!j3Y2##O#Etn^*+ftJ7$LD}p{|Ospq!ifv z4Gs^EvL0rBL?Gm}VSgQiIo|yTzCVX724+ngN$48QUfP{Y5HVSza2xF8SnFa;bEXVG zg)Nm2=$~ZmO|GumsQBrev2Ss2$ZDa&7D12353VvtOy=|)9p8vNFvysC8Cp9jZ7&s8 zdH5~1gncw$Dv!_b&rbbBOtGFz#` zi)E_TF{)SOVIg7;(|_O_R2NI0@vDdq#bj7$a9RG0Zxs|Bsx~rWdc)75?N?89E_{gz zZpoe6DGNwvkhJo+BMB#~_Ly~BMN?c~aA_>W+*YvE=Hh|L!P}US_0`~g03b2eO#XVt ztbwhCef$c6pAZ6x0DRsHoqtHrZAF@s^;sSD|EBq^V}eDqjxSBOwdxnsYKeqOxrEs% z?8ssl)?$I6G=&|!uzXhz?a8WkV%1`1(H>LrNGSbl z{iyW8KhmkImL}TiSi9+3RLKo> zX$9W2BLSxAi`<=sfQ{nd9Cs0?ZYV#{9yV&Pdc}Nbdr0x`f1TlP4Asu(@2iL~ITOr& zjvf=Em*0GPZOV7!gt<{7Ev;IBGO3}+aq4z33pqCp@}}|Rjy4rkr?%3#Qy*rY;v`6H zeTlW?HvQCUX~L&PD_dilI>ucZV1-g3a06l}mw(jjH=l9tgw zVTpKdoh$0Mhz+U_uK#kxt6xKKol5#$1d+_q>Li4&K6ECo)4EwRf0kWbG+M1nS8IO-(^(Y zT6}=`)KdvHLk9_Y8E^Mb%}HS{O-!Uf^NU27lXdv}R3ceY6ZFPcJz(h2UmVY2V-CK3 zP+fui183GI4J5)BT*bn!l<0;W#l)qsGlQ`68OUw`c;Kr}K}8v*akwxt9>RQW7WfOv z6$0A27^jF_COPtowzhW=OR&HE?4XUCW419cZT*x4dSbGh&)w6y0l320CL?&Fs6 zfslo<1qs~y1fL>0LWxTBpHB~b)_x~RXy|b~@c#F6Js>D8D9a;h)?e#ZV+2Xe!n&F7 z_F@oyE}z!?`0?U{2GJ6-@aT8ZX1=9i+Lp(0DWOA~r3FHX6)5sr@M1QnYkB3_#@|}7 zVo2*QIlg0x)Qb`&Pp)FkBy{8Tph1C17${9{fQ0_Ue+&g@Ii-I!)>NW=i9Na*8s?Jf z)R=ys7bTu0Cx45?p9!xl1(+kDpTrm((cnbBg8;Lqx&C28gN}?X2xMb*ZBHC0VagE& zGAM=I8t{vv|9<|azOwc_G+lJ`eVW38xy3rB@13pQ6>5-M1-M;T=vZ;mE(sGXY zflvAsn@vYPiu-t#1a4RLi37CKU{@TXwVvfauGDzqd-w}_xKo3^vEm=qA+cFfAmn9g z2Kb>wWwcM8m8yzLpKp#Fb2j_>N2V{p-=N&U&ZOwjNMjwo-VzcybZr&5s)hXO?ydRr zcH$Arr_4@bIPvorYh=wYP0_v-zS<_cj@*B{AunTa?Vvy0@P@L&#&C~3`Kn{>+g$oR z0y1mln81Dww=n1vt(0Yig&-dSXF_trP(LgMRwm>4mAwTV@j}GVt*TR%QD|x#&KGy- zf19tM{qw)z2T2)z3;b#OOg0GXMqHYl5w`iV`2%EbVNNYyrHy9K@>Bmo90`&(#C!nO zMJy5@nQ>c(zam|%1IJFpDvI!IL9CI33-{gkOalPO!M4`odtW^&VAkU-Rs?yo?!n=K ze|+qn$i(Ct*{u6q{j8tz?i+YkCC#u*@ox-lGoJj?V62l&ahMtvp4Yx=nfpkZw^GRj z^ggt2i@VZpPwxZQ!mvcJKB(>WYG-X zqzai9LWg$Ex?H#&_^D}CHF6Ke+aR8H^q(K+q#vK8%#ADBidH`p-@)JaD|?1q}@ej8kft)Ph=b+1GNrB>b5Bx{Es~U?javixEo%kW{_A zv9}(PKraJwNPs$}f(zYd61WTUgEBSNj_&!};pBG07x=juwGMmWzgJ)LZnx2@I+;a7 zY1j;_a%?0$mql@%Wskt)w*)ksayftGl!U@tOxfp`BltWKwk$(kO*TtQ8VO6}Ave#t z#c%H9>Es+-O6*E3(z_Il`sn`mkL_(hCQkKgrrN()thw??ORcM(kio*5G+@H(o6%`f z**O(VP08=lMLBF(m8Vz@f5wSqkZ}CE8lmM87%5bfOWw_Ur``4Hsmq7;f+pd6@V$@_ zq?0stEYtw75{FO%D-nUJhOb>wc?sv50QXL$QU{$eAaZ?#R3`HBypv;t1$Swe5*Apc z*|E6vHG0V3*{5wq-EjUZhwHeTCPHj~k5gZ=Z@W_FU*{6Ys@Q5d*+hCudxj$bcO5%4 z;QM>?rK@BnLcZV9x3RK?-og9nyp7PAA~$H-B8ylLSjhw~Q~T8Fomd8q5-> zA45y0)tU2Mt~EbQSQ73GF>JB2?%HQkZ-_{wur`ZDl5lIYIQj_xrGDN~bXs!IO&PYf zsr|noOLP%?{?XR6^54Kezim3iO5m}_x@UM-AMWSa>8;R~i9?9(FbJF*ZA@rrk2PF%R!jio9ufwcy zNF)Rm50ywp&dCw4>l@;Az2XA|4iV4Et^;-8gZ&Rfbw^MwmAPMnyEjS|V4?Nei20>d zZ_h~6W3>oUF>MXgE#t_49H?724dO2)&aiWumTU~~$m=B8#u?R8H#c)TJ^r3Se!(6n z!5KYt-go{i$|=+kCu>~sG^}v{ElL-9Scpjc@1G*FnW}Dwkp#aOWyrXFAoJB~zyB;? zs+f)HO3wIt(-#V^&|An#kJOFsHd+-p~2mJ1jhmOJQY$ZWiU~(68QK zNF6xw>K0lJqZ!%PPk2Q-%Jj$#5VBh^tDe)qaOInNdcmNzY_)%h1^=~;(=f1xK^;#p z-7qZ(bu|^8b+X-ckLwX2eXKT%G8esO4tcm8bw4+WENm%3!_&tOgc6`AUvd3B)aIF+ zbr~muG$&0M$;jw&4pT_EK?Yu>Hz7{dp21lS-h_Lo8@}!*-e3QAYMCtEVQlJAH1TLV zhs*tutfbEExDxf>#1DXn60(^#HdEY#jsl{yl@^(YZEZ8+7DZei?(_&Mat4*akg!Ly zmTWxKdSoFj`F%KSQwb-T~AhwHS2Uz@@{Pc(emgk5>&@#txO(WI?&1Yo8T6uU|F zX_~6H{m1TQ^|@UF6U&Jk?YHqQlII8mUc#cK|z3h2<}9(qB{t$e!xEPko?@M z@PK32e{&?8P>GSmBHZS#>W-dgnPxxR8D3r|4LW_6VbeC9Zzk&RLSK*>?h#AY9N?I> zWXJ5~xHy%R6Jsjjl_ci?`^`{;7PWNxdHkp%gV~YH1+=F4p@_^S>}4YJo%_EJdn#ax z|NVMyYmhZ)Zs{Brskal^0oiN%42w|o!zs9d(bpjgPWlAFq*t2kgS;gHsRx2kO)TqJ>4*gKv);L`b=Cv z?Eg06y$^WBM?SP+&gpBr(0P8xkON|BTjL;u8Mq|S5(r+R8n+FF0E)Be)1FopIr(Q_ z3KH?52QM?YTIchlMg2dno^Bk{DF)T(CUAL$ianx=w1k@?sSt5ahyV~P=QpW23*h!|wv!H`W&S^!zNvA@X6x;D?+Hyd^X-J?)3GI$-2yMPtG% zyB-4RHRW@t#1n8#vMa;M*Y9Y%yMC?GGC`mv+YB?<7pr-(o8D-6IV@ zGE=J}7rc?nkV?2$yrQy?aU(1^@VIxV`~;iQPCI05Ni+)Pv%mL>Eowq#3@jo_N!DV8@ zMHxLCV?y>PeQDx)fVsduA^Y40?SgP$GDhGgz*$UDC5V2S3R;qTL<|rNjLN%XdHo0g z^z66n=FO<&&-JD4<|Rh$24~BMuHhaFi@B?F+po6&$hFN18@AP|sGE^XeTr(6#j-w) zfoUK3Lm6xnWj_ToZC~t9eT`dw9>TLuJ=Ly#{GeGfXEo5{Ru`Glw>4r^XClXNlD=On zvsT^2eEqM_kS_;<%ekv0VxhNjjvL!%+t?NWmuXyjcY&TMGRo`3`(}$(E>@AE3c>_v z0{2570nM_YL_kCnFb0`{F1x1%swEHlak@{M8ajQ#$k*U@0W-0l?@s&V+x)LIltOab zw)W~j^wcW8Ivp*Jd&gTwLqWzg4cweIW^H_sy+(Qs_fI%N9Ks0P1I)=i)eK3>Q0xf} zbmPRv1l=w!kqCrrb@S^n9lRF}NTwf-yH@&!=3quWDce1DVW3<5IMDxDN0D^I%%UQXEA^c^N++gwsaoP`dJ7pDq7!{r$L%M zgndbRGyQ<-Y**Z+oXEpMJi-pfb|~QZ@huv^NjfpZ*eII#3oM z{n>PN=u|K++jS}5*>H##b$~tP&+XKYMej3|Y^daQk#G`hiq;ceD*55;?QxQ1A~2oc zJ7msbw|H9!R+U#je2;~1H~jxz2GPT0N0DT>IQFt52e)Sf4&B%v_ybJ?J!RdF3$EP5 zX1!#eB;mf!R?SCpA62@}4445V90Ca$)wbn~NaW4!H}@5v+#9a+m)@9?-#(f9OnVld zCo;8X!ozLC6tXRVVa`zqd4Ax*o%iP(@)pf&8^Vu}_%(6nmsX%g$&`Y39&vQvk>B#j zy?SUVz|qW2vf@mm-g(Yz$%pX_XUd{fCrTuU)US!Y`BU_Du7W#0>7uVs=0}-i7nu^<+sXV=4fi7*E9K;GQ>&EKC(9bM-3;$gsVOG_v>tK zPo>{x&#D40!0r7y|8Ru*CT0GpT|j|=vMLutV@FkA&2R$_lCX z(bc&)cHQw%2id_N2^?a_O13p8o@2y3i&ixQ z&Mk+=Dyf`u(u_-e>DmR3g&J&wv9ikUV?Tas6odpu?Zl2*F6Vsi(~s$4cD*ycg6HA` z9+Inqfow%DFd&}4h1x@2NoDhpVwZRS100H=W=ACc@J-RiPMG$@-^S~}d~nt$;skqM zqlX-8{%LU3_7DA-ZMvAcvumT8nSMbyh^%fDRZKM>X6b_N;sX*d-V8vs@We8-n4Nn~ z;x_KxJ35C@P65ok`Jb`(mVwRHt?H$iV_gdr&AkFzk+Y#>lbl%`XG%QN(oO{k|fe&JVAhhSfX4XSSO+gNvHMkKyCl z?O9DJ01jP|T93lxfCKWTl_poMvR58pEK5w!3mrS3p1hso%7{;y$ zy@%-)jzJ85JYD=hE`S?3Cj1bOE7}C8b#77~wb_g|OeQA7E*%#>OAaq6=g-(=X8s;N z`3dOiM=a&!%}}1;9LQ*gA)Z#YyT3!GH{bp*+E$kXOX{hm`?KGazfEnPOc{FnYK78G zcoqa-!zv2Q)$<0Lc?yTjnE;LR`+^|lVq?4>BS50gM^AzMLL%U^I!u#$8E+t zA8_HC&~Eu>!2DXUU8{!iqbymoRyethd?#2w)}-6Vp4TzeGzmq6+>@DBfy{87kzH&Z z34{i^#I-josQcLC@~CcYlcjcO;95w~PF+-hHWD(ueLZ~Y4shpUIna@F3Hk{^V+;T^ zKYQiEbMwu!c?0Q?ihFV>sAH~D&O=<^pdBg2)|fZ0X+5D#bmTbDp3axAC|FYenKu5Y ze3hD(rS1gF4pu6WDqbqVgm=I)xBqexu&Dx9PvLV2**Wbl214JNfvqPCi{=gEgxYZ2uRxR$@q-~niD`6`Lw!!#JNrA@7F2f_qje+hb;XzbK)Q=F# zSRpdhF4jcLiV;wPX#yzKAAg{lfa58-0kY;FgI7hu4A;#`RA6>a>ukPyx$^0gNVY1) z9`^k>fmnBngo8-b7Zf{kzmN9m{S$vfdP(EU7H99EM0}XoyBoJ1e6H(kaU-(M&o3JgKf6Jfo#!*frq4j%h zVp$IH9a}H_{i!Fq9a5b1SN>9TWNaG!*TEypkYtG88+j1T4%?FIOu@aJY2D?ex_KzL zjE@HY;FA~q9*=c)`&8^o!tTL?3w!-ZD)5QTt-;>U`DpTpIRTyUpHM&oh-eJ8a0FjR zB1G05=KCeo%WO&piYJ?%F{qkVPc7WN%)3K$gNy9 z4zv@L%zJiyV{^W>R!_!bJuqs{)}`TL!GhqB3CW}M(4GIs)0>Aw-M;_-uNh%7kA`FNfu#}X&Q1>~v1-KV++Z3P%3Ky%G>?QsEIx6VBy>~O!{Ry3&I z*5j{=p~;x7UH<96v_jE;cgoJPBV=TPJFKJhTw&i~ad6t*`ijzL`K_>6c52AG@Nr#k zvWpdFb-JW*h;(*rnN$28>t4`WjA+{Ud5C{CUFFz9dl?j^+u90|5VA-E$SHkg7Ho?% zqRXbxy8Lnjh0sdt8p}q961$ecO`ze45bybdF9uO(E7XB^^%XxgU!RlZ@Vs7_H!uvZ zF*oGFE`fcL-o*9YFkmDSZ=V)42QE01peukD)`Zc(Qc~fihGPyO*+?7NZ`wj4XbVc3 zso{?}n&xESkR8TM4;Rc0bH~k5%$CovUzqxe6ZndVO_SwgG=@mVUi}WmSNz*6Vn~y?ESuVI23B&W;*1mJo|r3iIkVI!Ps{{J(???D&x})ww;$Ti^eK0-shmH8gA$@)lKJAvSPncWwpST#bRUXm+-?XILnhzXSlI7`0 z4MRf{UhL$(dNT6OT|O-A>ht{~c4tw!9leOjx01ZC0f59Pg@Dkph;y->cT>iz(Skd^ zb{xs@xJFc(J!>}9{kT{5iAJ71sTVda6WdR~j0Ad_2O-KjnNu~W_|3%HoT+B>+ zn5*+%U~=b=QfX`<-%3}4X{0|gS#$=gQ(v?Pn82d!ExAYbkuv_|3XZojTd31DdDh!b)U5z$9oP1Zl1fsKHa|u8_8UYsZL9``RT?i>Zvm z9jas2qvTwE4&!E7I?;oqwX%unHoDkYw-jn*NQy2-Vhd%#I>1gCwwOTMJ~@8p3dryR z%s@0G{LEi)rC@*-a`+^3EeVDl1@u_88?W(H;H5S#X$Wd9zXk*~w7*|YA9;A+pfr}T z^}^|urB`sPPC;GCT#T*nKXrH{m~L0Yx-fPg51a_o=vB_?n-c^_ZS}vspMxL2eSFfg zkrv0I_g@ZG=s~}cY9rY7C-ys2jK@Gi%dKi&wy|8f?PIc6;h+>!dc0~YI^5UydC(QH zdLPj{(TqA?_4VUe1xdL|7N$vAD~MG+T-W>MpHh_RS48L=JNoob(Dh73B7BdfEJo)Z z-+N|MY^x#AiK#b(i!(RZn{nE(TFq473TXOF_ucFw#KNVyq+R=`2-nb4H9*iVwenHa zKGH#`4C5fW5C?O4^G`1f1~1zNW-z9! z2rdTA#xL8O;VWGHN9Ug z*vQ~SI2Zkau*3EmH$Nc$Chxm)Z|0?Fy# z9w3uCvOFFK1C+5jvj{i*Pmb(kw^v3jo{+thgDtR^j$guZxdPF%=}uY4z2}F|Zod=1 zBfIR>NQHO95SPPtW6yM?g;6{qPag5xT(*#ZUD!8FE@k5<2#Mk6XdB^=FH>%-3kP{E z1$pHJ9)DhCIdjA!PO9H4@FLW!`kiSR>WEGH`|tI2*?=>D8dejC)$%RJmUmFltn&oD ze1Ef#4clTv`N;C-_1J8@p9Zzo2>O!_rH6VA%QcRdVK$cfEDg*;^T9dv1%80avjF~u=ft; zy@hG|y)tQMsTjZ^JdVvOZ{SE?Bd6N|pO({D8KjUMo;x?#K-6pFoF zUp5GL%so^3=O*X#<`>!Iv_Ca@x^Asd=>{l2-LF1eSYHf7Bd4NM0A}eWAicEUIkNa{ zeK&~l!}r!Bjk*%|zJk23too6gh~4SESTy;;(>aFF)!)-Fgmx&;(C%v(q7e59C>1=N z3k$5lo`-Qc)4X|5!eLS**WWA%7p)h7c&PtZQh55jXxw8MR;b?PF=hK}nM-SUY_7b# z5fr$LJ=%rX2@d%`QV+nMVL~88umD;LsKRF@48%FwKrHq_Nc|U?F&wxIXx`ozGdzNR zgJ|~FALtC?w{$0pwK$u=0p{s+m_W*9Qh%1r!TWkq^7H}uwnp(>X~i7++p7~Sy?1a$ z&W*<>;g4f!N0Vo&PF!wkqQ#625@Kc@BuxHS;UFp6h}+I5edh?>o;WC}tv#iywxH)! zc$=K~C2i7vKhnRDo9<=v+D32)$M4q93pSWDmvGV-BXx>#w^;^K;V9^vjaoOzL;-T% z;{gPQM~|`#(VJ!_v8(lR2TU955UFJ9h5hn!D}*AJ**d0g=AjMtbA#mEn@w?VrbovzQ{B z-@&o%>Y#yG6T`c@<c70Jfy6bvaCwGtVx4;nl$oyxn zArrK}Imbuw;Ru<=Pv-$I4p@RXsN11o)c7mUBv25}EC994IS5Zdf_3`3R$!P}qmhmS z37?%t=MmMyZ$RtnTg<2Pq^2e(mJ9exs4rl5equ-lv4RF4mz`>ihA<8#6(gqxFC7!# zh^SuqZ9cA$GHf7oiR~3`l(K$%z75p#IV$P?=nQAQ(s$f_d_SK_c(ucJZy} zkCkT|6yf@;tXJ$%q5Tf2@@AZ)k5=_sHQp>nMa`q6fkY(gu=o8ELXqKE>6ru*eTOat zOpaPF>tkqsW=EWBNJGGikE;)L$@Iwr`L*n3nq~C?gU%0u$^N6>>2(4q5G4R-@mMdj zsM`!cF_h~d#8?WYfI_{54+iOEFNeyEFv*MrzQHt8D0hF3<9^V2#fmuz{@ERQ#GU<8 zzY!(@_oT+s&l|_2jxL8Uyg#DnQr$l+D^vh5;8B~(!3QZKTnG|W z2|b*hxS%zsOFXdsX0TMpJFeTou<*MSMc2}F&?pFmoUm@j|At9?hiX)?INzo#;}d_E z@aJ+Vi@0opC~QRzsAdLr|JN`@raC+VML!PJ$bzA7SiNIO_SQ8B3cB*Tus;y$|KR+3 zkN9+xG>0Ljm<0`@0FrUHMFnqlUFtz}a%{xIt&JFGXlP39G0hp0|N2BM(k?RY+P0V- z4Kp)|b^AX?#dYPRF%)o{VeP#&FgLuv?XQE(q@88FqB~{I zTSC#k_S@!!0#?UU4jG~RQgzg=-)y86KigH6xBnIgEUOVbUlpFjX6}{|(pWs02cyk8 z6bPg;a@vV_=yAm<#dkQ|zCMotGm7!x6${FmnbR0(Z}+>osK87flSOe;l~9;NBNU!v z?i+xgjZI>vzJ+2nfXe%X;HNruYs*blK=^6&14so2st!oCWyCsO2%>zD0zZDZ zJqYDDLS!oeIT3%uMZHY{XL89PDz^)2;e_%N5#jpFp~iG8**Omo->Le*X~p1t2u_J< z1Re{EQ{S*JIu!d`jh_e?GET}LQ?*0;FB0~9XW9RyjFxSLrQU_;TlJ#$GmbTS$@xR! zN0_@qxQH8Js-?@dl8?bM5%E#F(EL2GjEoFMg;13qGw4qVyu0&l@7EylIqMtU|6x96 zG4xywlY!&JJ^Jo)-{{y-ye^9JGgSbY9A6~*gyL0HC7~&*>Jfi_`>#mHwkb1$X`T@U zTv{0lI;d8ya|04Vq8}n+0a(qTs-C!kjF3Qvwm)8g2(N~94ngQ zzFO2$$tDdHI-V{vS4dUfBjd?54Xqm7C@Fjzo%rG z-p+oyq|xSjA7-jV=lAjUTc#&8&g<(mYysvDNp?s~MV?8VBHhanj{b{ukv9-n`WPG_ zZ?bSL#wTua`atXCU4538H%6dgTD42Tqd__TY&@Y;G%@?Vy8I{KhcHi75c5jHvvNeF+o2pgnVP(etJ;j4!vjMnBAvYVWftN!}dg6@?Js|CJPfr^J zf272%A=oYCH?~IFBl;Z=eV85osfcW_r8m0pSLyQl_2We_iHbI7u%OYS)mZro zT%C0ne`1s%igr{bc4P*S8{`!LyZHnn6~I8&ZKnC%p}VoF07FVb<-;S8&?1N|FYt?# zoeIY6F0pl*q|;w4?MGliryg|YUQS<`>}})A?>5FK4C2ZbEFpEHyMDX2n6Yb9l0Zg= z&}#&b;!~Kof!G`2;xvB6z>CY&#|vd+016zg#shqV>{~=RCqsa*ego`G6mbZODLs|9 zk;X1_hr2GE3<~_1#v3@wha0%r$m`~gTOa26EI#B4?T`NI!5rO`2Da9|{@O66nxYVW zA!`WeFkb*pj82CJ=KWyq&y#E@3ADuSCiSr4)^n?V=gFrLXyyNgxu?}AYt>2TUZGcd z@7d_wsPS^d{)-(*>#eG9TVh>K94&6F&zwR@4s*+MO&f_Fe>ldDJ`bY?>LE+?DD=;< z=|&u-dH4XE&Ee2T4H}8eC>XGagdy3S z&$j2Cy}bI}?gh0azZ@xFyPE<-w>p)3wcPkcIo;$TE-G-AR2U4ksIh$8lzcuNXpUn6 zcu;8qk5?9gu7MdG;%J+*gy9Ly*)(a2ZW@MuLs5`K{eqJ8H<3cHlF$5$r;!L8?ZXW? zdG}c?$@O`ZM&}V7fvMrbS>n1ol|O%x1uz>L<&GJ0YM`{8E2iF5KPXw=&ZlsZXrTO2 zW*JIcUk`MXC*3XYilh9`K+$LYP;qpAPM=K7=~Q$F{)`S!1p| zos7FwKGL#hJT?Eh00PU<%?se5JF*D@yM?)b(ruub&-6SYhFNs$#a&`5vUCo&Zyc0P zmiBr_y#!`hm=PjRt;_UscLh_WEz%b^)^e4$KY>feT{?S(WPaas=Jvl2Bz9txJ*koL zu`~c8cl7rTv1$-h9|(JZuuk(lTbyEvrvE)gi<+Z1%GG>*nYc-h${yVI`>}s@=k2iZ z)n7}oiYI!H-*(~3F&-A{;7vgc=fg%I7dcvG%)vcSGyB`+%z}uUZY!hFsq%VU_Z*E8 z%@BNl;V9W`vyzG8SXZhDWTt;Rel!U+$lw0?kB3DeGf8%V^;nErGw12w zhyY^W^^~^~TTlF)AfBcG6bkoT>pdXz(Q#Rjc4K2%Q3}~GjmSHn@zPcz4$vSpE4t*Q zMHZz%tRKXnX^pRomd|=icqbt1eIG^pZDh0GQjq;3Vqqy@3d3IlNs6HUMgXKYcl&kT zmAqtQ7y7n0|3K^9v&`k!q7`Hqs&OA$_vd}wb}LA$b)&Ex;is>Um{mvzRJA{) zf_>ZYG}jwY|E`o58RRWLfhzJ@ox$yql12%g$j)m-v4>+61A7AgkJ`hn?3QJ*1}Yqw za{36C!#D+m8z{o;*~_Q+Z)Ri_40;bC9V4mr3wqN|k<>0Uom2XMxWSk$B-!>Q9_Re7 zfX#AaVUl>*IK;_^5uf>DT+YsnIL`V#edB$iALeAs19q*A=91aYnt!WU-3T?UC;fuD z%Yv|=ux558CKN_FrY#X2y>}DO85u2|`~rs;+dV+;vY=|x;zbi0l%gO2+wAkRmw+=x z#iMA0+Rzpnty&l?HdxlnZ@xNj#e1b{_}RzZ7guWftM1ZcH>odxi-UhxGQM8B4gBN; z;+z<}<4DUg&vt08;s_XNUmg!G3rZiLdkq+JnQedv{n2Eq7-!+;a59Lr9YyDOWPY!} zBukJaT!Hs-3)j|;Y}Sf5odTw)@4n6oDPciy%Y1~0(e9a|e!-Je#xY3{dB-J$skYh1 zn9;u*D42eOMe$u>*75x$W`8l`lUqx*&5jtkeU&sP3kpDV>E#?23MTOl_i9pRZ~`5% zN_Zuy0AgDvrrNW%@1EVMhj zVmeM=G!PY`mw>y{?}em+yKi)v5j5O8Dc$H66Wpa`N_eYv<}l>#<4^9p5&lk#!JsYx zX@H`Qu=Wi=-4~)(tN>}7o7)EVFX$?s4Hf{xCfQ&yB*@A)k!71XFQ=0EgTQ)yjP6Xa zlbG+QA7|6VhKF~Dq5Toh!=+@hi^L8H*)_rMM|j*>hqvf4R+KxGzx6sX(2p5D++KHo zjx;=>GDcFhZyXUdhTyZiV#^1)x?!!*PQDpq{`UCm$UBAb%&to!Lv+a7`)pW^!c&4==%R&3 zj@0!B$WQm2dD-Q5T*Ii5@@n|?7CUigxnGL%kTZ;2J#omx0}a%L%@HHvs;(FKbBR39 zWdU8eubD-%`&_vnv$QF7?PeeeK519LDc7@v$Ta)05{}_|Cf=xUd+kfHn6YvMGTpw z21#GKx*GIZYw(eI^}`r?>{HSmF0`+4Mwitv#klvf&;PLiX2v%Cv`%)kSv3DDl4~2& z;pK$pT$9&E(~k0^y}LdESF=8A0_W|4Lmi{f=q{XczQgFeYopINJ!N}_{VqM&jOI-~ zlXFMW`6@8-{P>^Sq+D1o!fsYZh=m@3Oy&M#zLtwQeTf+X64AWoz+5~7lL0~z5{xEr zT4OH_Se}aG=BfgKMcN0U3ILA_MoIbmFnT))&w3N?$98s@!FRun)!SSje82nXi*pl( zzwE8b+XKHS>KOw4MsJ)LA0SQ>0sJ+luPrYJ&Jf}7oU))X+t*c|FucJ%=8UM7-2HiL{NaFxzV7H{KA z)G|$=_oO!kw4^{a(Y)ZAwNZqAcpIwBwP%&*HT@2M%w<7mm72<-Mt-2Y{iR4%>Oeax z>5}w^B#(sG78lzHjTNbH_OezsJK5*5P!~gIJ)A@83pG=Pq}mwJa#t=Iyl93 zN*qMpsr>0bKJJl{2D6&58J`Gj1N5t zz0uWc8Z@t`iaMHi1AFEN&jko8iEw;;7)}b{Lo`Ks^t~945m?&4X8lAdx|k{g$_(^TEGYjh z!X*J~p`GX5Ux>D1(I0lYfLV-Xh5rz3JgYs$jR?_OOal+A_~V?7gZJkF-=_hoOeBDE z`~H@XT4i~8MypWelwN&?(D6o}AcZk4z%F+{kxy}K`n!tq)PKQn!8R_}B5i#;VNg0I zc4Wy$AMT#{@(N_4YKIN$q_|xfkj0~_n^|C~gGj&c{CaG;cW9z|?IJU<<@T}Upu?9J zRn1njxFpA^dmcYljFyhW-8!->LoO_7^LGn`F|%F0`tEz-O}jfkYo9ZsVw?h2o$`FT zA!$C)%saeuKxOLb%Xg2Q##Qf)sXE%@Wi+*#PuG9yFi+1!Hr{o=aD;o4u^|>V{@|hT zd*yMnCDME}1L1n=@<-O8Nc5??Z;&8*L>X%N1<;TSks7M=DMN}d?Yzxk>|ygkT!a8L z8moF|FdsmmD51H5T9m66kPYFYTUd>J!Ha6+{Is%_VA{IxoSZ?oM!#uZfgCu2CwDnD zEzRY9+1#@{HrO#3!rUsSZgHFzS}S?+$FZPj6B!baTT>uhEVul4a-f+#FG!P(aQo=G8cg` zxBb&}B0vvk+!+Hktt0K;ITnEa5{iq!=>^f~LAd}sIFclyK#uU|nk}`ukJd@=pFZv6 za8OIHg`cHC-Or{53>zmwg|2NEUO3VvX(ijer5e={yKt3~#mcDChavTnt|i^OZj03O z)icwj(?oUKpq^g-Zovwmz-p(L-g6e{4>`TDexFxdjqY_e41XM*3OXN!xCUZT;K*x0 z#SVby?rOgRfK8gZiUkC9g^Qt&R>!RSi4H>jmtNNf>2=PPNtG0l0@knZa>)b;X;~Kd z5a#bwet2jejT+{h4pPPsNddn!7nOAy6jcma>up~b3YCJS#LWZy{Ff1`(+got&2?i1 zv}q*U>bWsKjSUubH#k`4(Oc=mwxU{2NzA*0xFzWZdzMc+Eb^QALFUCzjRl5AM zH+I;l^+(Z=G$r9*7fN^)A7}$|i}}5%@Kn1tlL$Ez6dhYKorYHE3;ay$jnlsydNj2l zFkAzphJO6CD-u(sXl4l52?3`)?d=)P<|f^0rA6JI|MH`7ea%SL*@0Z16*wWvCKyS5 ztAob{DR=qn&HNEjwY>Eeo@`qeo`B_f5(bXr_ShA(*Cl}4cSWq-Yx{JWZambkmyqXV)Cq5ne>f1GA&)bBx z0qD&1g|WHNSI@NE-T{|!(?U%rI{giBdP>V1q(O<^EbvahTa(6hd_?LKj0tp0@vs8! ztazZ4JTfW&6?VY5kyy()`kZhOgDgazFaN=*SQtp8p8@F=oVZ3=pA;qza zNnC?@*`axPbUKaoi0O`*$$qN)Tgb%2-j}!OaKtdfXyI>*ABw3SQR|`0`D|n_Xld=2 zKF}O4$oZ4;9Em+hFC@^x`|NqOQzd5^((jpwduZfro>VRAY3n_65g~8g9;9ameml0% z?nIUSGf(>y)J_ClhSsdX+h65%B0pU-FW4H+kXHVbY<6cWMG}~#%D;Z|<2a5VyV!E( z?yDc8eBgKL_ki>)31%$fGX4WAl~$N{mU(~~I6l!x2PRm6Qvmm)ba7|hQ5fpMW!Zd7 z@8PjVowwxKe<3lyT3%0-+m1(sp*g$wb0#KJm;uArE8ow1zY9_&CKHkTTSp~01vlDU z>XVPJeEVG3f>lcDT>t9mXdJg#8|54 zLfIX6Scvte>w)ftgQ!2Ep-a5SVlbqBxs$J^-4>&vS%NN+bXN)$Mtj4-8EtjoTqvARoA1#hH{Ce4LGt&+sgBv}Jqo}&vmN;b)2r_8@B!yEPQ82y zGb?giuC0dZ*5}T^=ztZH5=xu>T@;PphNwvSI3?{D+7Qqw>^hbGyG$N{o z!XAW#piX z_Mg%fW>U-8#RUPiZ5KB<@6J*1495h_8@I6h67$bNPz;j!sxgKY-##I)U6kziYv(;k z1=D*1H?4uX63$d)tbuO@5|UniPu*zEMee{{(J(;R+2n#x5-E+2mbfHX>z{adt^Mm+ zz;C*bDorJj#MO7r?(}W;S zNURhSGLgq znpxVkDw$2)X-8p3=mwQM5!JTvQ*X))Xd0gxBR|4}wM3dBsbYI0A-fXL#bC zvc1VWRV3E&bVXoU(hMH+90b?i%Q;hUBlY8folKvt9(Xrh%_BwF7}MrnHc6`L`U=$9 zdZ2eN46}8_W=o9Vx0Z&7dbY+;#CBFkWr$%s(Wg>7HL+=hY{8)}2ndiay9~cU0uxfl zluLZ5CQDj|aDl0QJl>qV{c!#>U!qz&lAg2g6o?(Rg8+*axAl54d zF93&J(bD~Yl&=XdUE;u83PFSUVQ1J)00L3VGyO*Mf&%dZ6@a6>ZCE?1V!l@8jy(e!3td#~o{)0`vkBv{rj zV6Za!mD?`=`zXN>ZpujUxE|ad(Xv z8hXK<)nIvIrZA9%Hn+Zri^9uB{eyGyH_7a7?HNr2$cWxS;R7EfAlT%sOX#S{LxoRLV z8I-IDfY~KTIt!qdIH9=b&b{xGosDKxykcnb&qo*SzmO>$yTtLxkE?V(YI%6-Lave~ zKvD-ij?;fOV_lBg&Q}aDf}+G0QFoeRZO4PEKShji*wI3SgFR>fr~ zcdx*&<_vL;Eta{wE<9cOBBg@tvekP%=f6kYT8@i%%SBo@AWE((UxNgSRRc2n$x3Ot z`_4_ZqaC?_zDb+K#;^5`Pd=LwhgjI!ZXP5HR&Ed$+(Jye>u&>XC7cxE?~l#&7~4bC zrMR}vE2aL`-8Es%nVp#I)oZu7W!YS8L=~E(U(l$29cp?O=Lofb9wb)Z29U8LyZi|4 zm0mtpr|}bW>#ONdNjbo9z@o)6{XD@f7K|hCnY-m;+dji30&O5Nw*JdwZ1zK?)nf8A5JIIHm&vWO`h;5v(TuRn6igW**qKBG>H zXF}38Q5Q>4$}Auz#bxmrP#MnHZ$}O*n`xel$_w+2pf#iV@BzOgw$?Y$MGgw=p!@1^ z9xm%T_fZ^vh;Rqau2BXbs2s&jUkpFa4W_?Oul-s~D@K6)bw!G>`>MV+CYHE8vydb# zRvJ0kDR7#0Yb&RtIJWX3v)E~hUXRU+oAs)hUhwX$Hlu7pYSYJd>oBKPPe((2?1+!guGlcxJa@XW1+PRQY9@=)JN z7+!yx*5s9R>FJ9i#h#ad2eg}w&FTS)Z=I{@Mm3YpcY)QmEbTNuo4u4PRU6~?GuNSO z-MFIB_l|%x!Od0t!aO4nP)-Mka% z<+FFJ-YKncY7X+64IRz+WJlzW^FLmZEj^QTl5##=mJsA4V0YY&?Bm1!5SiEM`@&eq zY3OIgaaO7`Zd5mi*x0LZO!oP`5PZBT$_ZA5$u(v+a~>X@b$NW1j!nYj_#wyz$j#)Z zvl^1E%&(2<8<-K=hO!c(ahh|yHY0_@bWP%#3Vp!GDLik!;4$WQ3AVP@Nx{CFY5Q6Rr;{GA!lT?jN3}sDUi^~cT{?1~ zN>gvzBMjMl6NccwS9Ys(yu^3ExaQj=5VIlQ^7Ybskuu4W*+Ay{e+-(z%G$pSnoA;> z1C@Z*&QWuf5=!PH{=q*SxioU}li0BOT*&3TAGF^(oD+aQ9l85QABVWSClxEcw%l?whRhQk>kZR zl=wxS@d6y^D>$C+07>scU87d0*c40M%TKO9J%wzJk4G0gzB`68(BHxgY9ZC4CNGRd z>P1re7Lu&t7BrdtgG`S6Vd7CT<_)A$;rwbn9f%N^!@W?~v7T@CNp& zibJ8tbcJp727$`+;j|C>7oL*Rq=9_wN~^{nsb2s#<=Tv^n|5>yI1B=;n9bOg`1w_j zj5QXQ`$tL$4J@9zA3MqnAW##8VyH!B{V47r`P@Yw(58<4=?^z$C+?Cta+M}%ANlI? zzH&5A`cMVJf>4{=Ari;mevl~NIDSpJ%Rj8vGyi?K(z6*N6t+kBTed^(KM9e|@$T6g zZ&4{437u-EmHt$Cd8*=xIBDVWsLw5d8ws916*=|ElpoEIGR%Lf z$DthRrMB@&yZ|Kk;+&F;mlNW0NyA(_2&>ar0@0)9-!YGsU!p>UivzG?V4Wf4|5=HBamr{WybL zEQ)rdLc&tjzS&b~h|5+#;^^{e_c~~JX)Zsyi6GAHw2ai;;q(}GKJtU>RB3zBQC%hP z+V6QLFbjx<6habsqJDKVGkfTZ06pj;GgHq7+sM#weU!Qo7p&=Fn{zt=Dh{RVMTV=~ zfuvTMv$@NBj*WisGp%e=@AbEXk?@+d=cr*d-M=rSi}@t%LRDgyVR%fCx#|slXP85X zD>+?ZXDaEOYj4hrn2-G-k>tP}-OEKB5Yro^89^Sp`G13LKLw zI1FF4H$ufbC~BzoJ6ec-S~V7v&_@gK&x6p8L|T4P$M-OmK!eNaJ1l6}0$2W*btweu z8Mh)I5K~Zh-krje`lx!_+%xmzNfY$i+j~VrFJx#ZlGowtW2yMH=f;;#_)`U;UDyZp z7KabdqN&J^jxCUD2o1S47Ejf-|07w9`RC)fDC#_5b|uuSG>sYHumgQtJ|?~I+31ah7lGV;Wq)3T`HO;2UpQS_VZ8#4!?+@-zK)ipU4lfN#s zBiRH9S6tl&2ZS_KRk~B!SohVgx3&CN7ESBCscv#YJ@~h)QUnOwyQM7ks?1eD1!Uys z{{KBo)s1i7IObmQu4z}0iX|LbF4@S#UqWX$>F`O|w7c!2gziY2GYb=s(z51X-cxzW z)*be%nkiy+p*Id0a1o*XZE_F!zNz5i^S1k63Uj`SkP2c{T%OCB&qq<+%g-Q@aSWbv z9Q?br+d7WBOdm07g6p_RS(JCA~*9ZTSxG&9WDa zKTkVcqLTXr?Ymta^M&rOiTR1E=xj^yVf6HgPgZL3cD1AdT0#`&oPO}rC-SXIk(ui# z&cvu-Uw}ZIHZJJJSpPms*b{pkcB19lj+}-X=Bg7y!iIM|#n{sb`)og#JirSmTs~zK zd_STy{U5}d&S!Wp9{t1b3VCJvqj3e@X3_gJYHX*4`}*%6@k~$RzN9(A<%m}v1o)`= z*PTb&cmPRCh8O2?+!x7azczvwmNeeJ-~8$~pNT zh7Dp*n%bk;Gp*IJ@w?%eKdbR}9Z#h7ba&*oicDAG{JEx&^b2sZ^rr!_G1^oICY)Ye z(s7Ht@j9qM`TG;^X>o}2f>;jB^A^f$ID;$-p>Q&S2LVykXS9RSUK`+X8xs@tl21Z~ zU&UEKS`-H#X-!Mq*L#r%A)L&w3C09~7P@BT8zy53suQ>$csQG)C`W`3&j_7F>vm7} zd4N`81Pt&yO#l1Yi>C+uie{tld%w}OY=wHn(BI2Nx1#pNKYwYX8sEJi zMHDF;3Lt%bV;fxH|twhwQBS68wp}51Eb*T|T`*#O^XM zqj+C0*i($o1MI;3q~)`u^I{rlEg)~U1}tC_h;*YINDFJtA2$|O3Yw#7iXjz+p#boUhLz4?stf7oZxvT2*%1aPLywbS0!)1 z;-=qoF;I9CRe+e1zB?5bS-E$72&Pv6A0eY$qhNa>Vr=H`KRJJ(B>Q{7>E0Y=WO ziUc?0kcP&SLxDQB>{;gztdJmX+0XZA!YHKO$ViYu*~;(#>(>%DIKa^XhWJ{ryH~$J zTfTGT8zFCM&^>02pHc}ZKh8Mj01xCXX%tbHVU*g90un6cH9W4xAmP42`|}EasPGO z_y|p5o(hxMyp?rwB(vE+kt2$!pZ}Wjvc{tI^v&fjZ@*7(7Gt(6oSBZX6Du6JplMfp zeW`yM;nhQCtqnu_5718Ohp>>BI=k2hVaT+*??>jEVs>}-A??TnKBkVqKa}1o2EC&p zFV^-;+c?J9wC9RaVcpW4DGm5NgW?` zKA}1@$Od_o=ufXpP0h*d3gku5-b$WZ6kIfJAFphm7W0OpFz%H&&C5kXcOP09WK^`- z*AH{p<@OEdfPZ2Y*cfi{AV5?7%1TGqKVg_Kdn%z;cZLre=445_xvH`lF}!QBw0xIZ zuyK5LJ^|0^&o2%544>QU0D$5dP8R_o_N@!ahi%Os#Z5!n{$UwxITE#Qe$Ruj z@5-NMUj(K5%2_NJ&p8TN7>~RIWNOdq?Hy=GCkxa$U)elLvW}y_U<~D2rZlxXviS&l zK>X)ldL~VXgau0biisf}*D9Pe={WsUR;T(E``P3k12lmS$C6EbBu(e7Zuoh5vFK^; zQrH3roi?|bsc-q#4GwIXy*ivh^fT2Uxg{rxR7#BNrLzG4%R<7&lXsL?*+m(AoqM-= zQQiv|A@5PvroNmJVKN%m#KQqB6B8x~x`Szz?$b0t{P!8Ne^wo(I84MugeCMo2ir~v zx(RwJ3CL>K@0h0rx$e2Ml{-N2e1SBVN+%0y_q;%0#{U}I>92*kc%|!hD1KhZU@dXr z-l5_LF6i<;c^pR79s@O0ydqfieb{)!z0=Y=WaaF+e~y$4#(3cON*KnE@9fOEV{-dK zEn?T4aAbR`;;hzJ`QB+8s(L7miLLdTmoS<~6`Rh~4e_bY)c(TY`Q?Q8E;w6r1s1M4 zV!<*O*N$9B6mZ0?E%&w@D*eU0I}w_8DjaU$rapM^P@MUR3uET0^J=;^b>h=ypLo{@ z+NKP0)ANPzGA{lD(+qN26#MD{J>n~J$FWGL$Y{QvEJ_I%Zl$ejCxmu7y*q;RT?q;6 zZlsyZl1|vms$^`|&&)&}w^g*&<}H6+)jK{0PuQ4{{NB$blvPxU;xCuZH2nrvb4it* ze?xtq5#Y>J>bjGzz!lZ}F63<8_#INYA^iQ{2y(N8nBncu0;2!N0+c~V3N?oikc6D? z?rZ~;Fvz|nJafFm<$j7GkngCHnfta}SykuqHAa{Hy~UTzMFq^kUDE;7hUU8rpg$$h;Lv39z+i z*AIALJNsr@G=gzuE9ApR3Vc))P?2hn2>5s zNgLk#mc_ORi`b&5UYTr$br+VOp9VE(;HW4Fv9WzcK48rRL$ z7Ag8m(}Y58&Mz0s=Jo^gonHmSSm%0a2ZJ{@ra!-TnBt3A=T z6w2nFAZ3%KN8?A@0pssyuGh}&S;wO|DM%48YT;&i-M}+L8&I5+1NqRx2Uk|6f1M_* zEXv0adtZwgGR5Q6EHi|)M(O_Gk=fAmFS!oAYmA{5??%2ktKZdtUtRw5J2*DilE%6q zq^Yip0Q?aI=_jeBU9@xo@8ccLX!^Q-9EvOX7V>U{*db2lU;#(>4)a;h=?zJ7;RI{} z)7L(;91;`5zBjY?JfP>&w}EfnJ^Efe%&6DPxqv`V|R|}$K_%U zFZ69ZL&BCeu#kxHuaL26D0W!(*3MWjyZI@HA*drCh>nOz>1d5`HC*m|#PGEraMh>8XEp-0(iA@r=9gWz^d9Hrw(rHVGXvj26Z)Xr!1ZSt@rLP;SZr=R1sVhJz;kP3XddvYn?PS3IiyBuJ|6d z*^W2^XhRNW#>b3eX79=~r;F%@nlLF+-78q4J8=d0rjs`{M!>x@#Lz`rLgetS*VQwo zV&+$)@#;^FnFcn)ccH?&>+|nZdC$X* zjM1i_+ne+l2Pa1<@qcT7U1q`?glPIO-eX&@mh$HiQu$WO;^VEN*7!%qZBgeL~Rc|o~$F2K%_hUun1dZ-yDKfqbIJ*tp?&*A$%IgnS3NjC+L zd9V8NpWD>20u0>)nICC-$QN3(GR3PSvBxCkhS$9-B_<`ozAVP3=|`J?gw$*QJsXBT zLXCn%B}r4`NqdeY+eos^NxfWQ6%^IxcOiD-4BDY;US|a-!RFbU7F9euK@kHpb&EHf zy>gLvc_EnEy0&i`xn}Xfz?$uK&DkTn4}}^m@E4wvrQwaQolTKGS8z?Nr|ybXU2K4^ zPi?--B5w0aoFh(~RUzUlstat2?YjE!Tp>J;X{DNUZ<_6 zFYY0zHoZ|&0Di4=;^IjE51tOxsfB&$CERT3Vw7-0v|mOTBiRM@tjHHxeiYa2-Q@&k zL&|vbK2;`a4Csf#C5;#bf#eBcUWT$bDmb*yOZO9Z?kYP;(enSJ>8rzANbijE2Q`)woD?Z20>RJbNm zI~Q9yi8Ig9O3%qTb6v2ji_j5T8Nao6NWs{DMV)pB`N;X$Fj041!ttV^3j?;hYz5Lu zHm|q`@ay(g6@M+G1KZ%j^BsS zw-q#vGkL7mX6`cGJxFho%E;&%7&#JRz5-Mvpm*DK%5Y(xR}Fw1*lTbj+y=}Owg1Z# zREQqz10SGb?FSwqqy2Wjxm6PMBZbpxB#9Tx=q?bV&I{DfhAD{~0#p_kU5SlZJbs_gb!WVv}Y=7#i*M&*UF48o#}{p)p9V z?LtbbQg~NnijpkE>>d&Kj`VPW!?Cp=QCEzAa@gev8HPP61v>d}krvlj_F99eLbXtl zhBvvB1r$!VrXutj4t^md`u&|(&X_trje9P zQGio5BH-d#qh(G^zyJE=y*OyU*Wt6pY=|+SI=kkr7fAkooOn1>zTcN+bRCrW{G{_n zxFbK^lrvu^stF0svG;PzP)E32V?p2ZHq}Sx_?$-;0UDHk$&YQ^KL)N|vDN<*nnYuZ zv!VP6=gtZ9I_2woV?uLWm~?#NoNa@$^4IT}@x7Nd{?I+C-aYU4JoLWNF6nWU*}!nE zg9qbFMbY%J2(6Y5f8rbeNJ(Nx^DEk<&*xJN8WeV4n$yR=H{E2IxFUQ- z49Ya}M=W_I>Scwe@s%plV>T4!fQ*IM4@qF!av#xYPL&r1#WdcJId{6qpL*?*7K6SH zO9p;tkdwGI$l1?AvapdDYM&BxFX2#u9IMKUUk|WUm9GN@thmk2_P{xznvzbehY&$z6Gvh@G-Bj^{@CPd)C%xLKBRxbA5wt{BNe+ zHPnemBCvQ!0TO)X)XGuwi{n%iF}BRN1kdredk<08X965e#yMw`X$3u3A0|JoofUn! zN%d*>s>S zV<(aF(v62HNYXvaMXDLB&a_O6I!7&W$L{ml_yDwx2 z+-PR@qcX3hfHX>J@u>w29M#423#+F+{c~B~2Up)?v%*tIWPDT385=Ee8enZfc*eHp| zTF9vvw6w9hq{sZ)KW`2}YnCa64*r?eefxUzYFCo!q3$Yv9(CG(D@zbPlSh0J--XG_ zfxa>ppeHMD%?}TyFG6ci!IjMqc96I=78||w&9*ylq$~ej&0C`RXVgZ8yaIsXECFcN zVMU)afO%uz8WheApP#iZ!0wiSf+*wZDR;#07gjx9os=L$-uB)r(mtBe3!k|iMyy`|!b~*gj9fj3bu+Nmk-ZB*t%I&O5 zz71&x#{3(Cfk#@>8b=x0b(e)}= zZv}o0$KEP-MS>>+2{(FqTWoH(>w_d^zRYIXjEJ-3FJwOP6{Qg8Y42L9l_&l)CwEbf znG3|%tN6QRamYTLlHf@W)SV|vS;~WBm%5vnT5q?_xh>`E?FPj!n` z!GGc&%b>p53s6Wsf{5J~ig&_0UmG_vU|Il9vp~}0A0&p{0Y-23Z78r07l?VTYL4{W z7G7v2?0~CW&E^(M?{E8|^+xZ;ucaNp*?`akk+6wW`^xNZX~Yq}kwNFT9oHpdSwG1m z*2tc4c-$${(qGr;Q~O10~21FixZTueHF}N?A@rhdD z%gfpCeOx5t4BJ!OurOr6j}fc?SiICd5(7Bz{H4x9UfS5BMW{{L82o8j z#H z>kx8hbG~SR^Bh01pT~%r18Ww4v)%IRg%HCBp{ZM!rn@g$n^<$)l-wL^ca*#~XXg!+ zhHVWX#{r&T@{d`^l6+fsAWBNBB1o+TVP5}6w#1VMhwDh zlsrwmOJ&!h=lvNvFU2ku(X@<}3}e@taVCmr1vRk8_|{W#3U359RX<&i6YRijvA+iz zcMXN3!{U<`uF7ymug3h5G6OFAAF|&OV@-jsV{vMHM|f~l@vb5`p64Xx-7&qz8tpuf zRVt(ac2UCz;~lt!a~m2cj+hS0fMV!wLi0@Jn9p4wL>>gnTM?5nc# zc{Hv0za^$po@pwu6%hB^K7tgF&x4@U1YF73YhM=2*%p~fpG z^A5MdZtqe29s#=Ee|iC6i(D#Dk=C9 zZn`O$e{D}O9~t{^Ts+Ff)z>`apRzJ*Au{}iUBqWf;$*)_c-8^O!f8*)OM|1k?kD#M~4pJfrq!O9H6Yv5!(n zPu9}&k$2t>HuJ<=nPWFSyuJn)ci^d&*jpGDo=8bD4i60_^;Cjtft>?GI?-#3J-Mn^ z^n<@|d;tAeCOG!yO+|VeYpP9)T|dvgJwC_k#EJ2o59YOv2s4&D9^?>WKH7 zT$a=jH*Ta9WWKGNRAX9-mDo;VtdL1B{KE~JJFFS4T61Aw6Jvt)DOFeR(4NvwA0{4? z?flXE9U>p12c9_}p7E5D2U=4xaBJy>3;&c~2R?48fo{WQA0^FHbBLFGc@VL6T&w@- zXu1`HpYP;y@d3%(XYcn&7S2qxsG%O+t(MoOf+wy=yNOP5>7l7Ic9{)$)uP7oSkTbL z*+o^G9P}Tc4~{Jkr<61K`jtN$7|_iV+s>px5um*&QVb7T9=4Dh@{BT+5}8Amg^NQ_ zaueN>2ISqt9?PC2;_t@4@JKi+?`@%PX;CM3UI9^NZ}NywVLMn=QJz!;p3h-K z(;0bBTTW;;4NN1Uq7r~^6G&wbZm_m@sv0E-u8hB}s(JV|G(7Rci9in7m2s*_u`n+4 z?Ut$DrD4-M1rqsR3b1?9UEQm6h}&<+kH+kNZz`*1Q$#Z-@!GQ^`Lu~5(AU#XJ6JbL z8Gy#6L<$;Xo+-2m;rKzaC=iNoCG(6E}d&ncVCC{wTjB32RAYJVcK7;lC{E!OMNLDCpl=wnw7Ub<`{4|Jnk?*TOmj*@Qr*k|)V&j5Dqf02Cur*`&)8-yP zhT9wyBVb{_>s-+7;h+1%)*%=t7`hrj;zdm-k3JR$423=eNAG`!%o-Z0s2b|VQWpjG z&%nGGZ7=@#VOz@?9YM8UwB8p{g$~4O+`m=j_iWCI-lrLKY~AMSV7ek9C~IreqAPPn zpypYg8rc?G>?#mE?(UrA-bGfNsC|s}cc>beY;O{&+Ap(`SzqRI=Gy{9ZAD^E{ zXK2Vhi5PwYq46Oyn$Kggf#*@Qkr15}fYf%)-MxSQAM?L8 z-uG_@*ufsMq{L(3)cfeyFzxHBkcZ16O@|-RjF9Rl0}Sr4LqWEOXz$!SGmR6q@K$vi z4n{@-=k-G3Y0mA=M5PSI7YPEAbJP(}ZJo2!dG2po>|ah)At?&E?s0*x&BE9BuNYKBM!cOoC%H{uwyhlbBs32o$o1^>zdz5IfmH^%Z1$uxRycT;1TbFH-Y_#@BycwiPcQCWhG3NM zLxH&!w4nPiHnDcyW`Klzm_sPOp_v2U?d2XxxDz6$PcUH)RSjW9b=-$xZAQ|BHb2_asD}?z5zZ%Mj!>sG_1!7O9LBSONdojobuNl>NC8z@$~iroI^o~Sw)o9NwcyoI5D z!O8K{w%VQwb7^`>6o6oT044X$ESJG!|vC;5Q-;cHzoqJz_KyhJ_CSFw1uo=%7)*4n{V2h%$9)PAgMzy5Ur=3?jcLE=-lU* zC#Un|9GE*Lc|7&W_E)^6PH}y7a^5(TVpb04OCoRoR!O$fXOrX{#WyLT^eE!PuBx<# zMK5)xNZc#Coqn+V7e9xy|NG&pegePB3*Urj?H8SkOxI7U$G`8Em4%JhzvD@NcV-KDUI)}D6%7xd`7?1rVx+00b4nf zrYjNtXy!+BN49Ny=1Gvi-RVN z@w(4A_l`2E{bm!Tz=6;;eMC2WW#;8+M{H44#q$*jh2ze5(r$ZpQI)--ue-BXm0o_1 zV2T1NawyDJcR#EXcD8}2yH^TBL{Xx^HM)uV<16m`4(ECm)eV=u+3Fd;t^5E*d0_G} zjE)}}%R&Pzrmgz?0&X;TmiY3oX2}f^3Z}lue~9wMtzP>bU>7}Shb4PwWOIKx`>QqQ zwi|^*h7SIhwP}Hhd^v!IBsZ4^!Mti7GgEK3SrI=Pjk=~pI(x3teI@>R(IV_CpYyq$ zdAj}tK|ke{A&=f+{|?j$ z${x=+OppUl8ab@?w~+j6?y1P|Kf~7S-w=esh3o!xUBo^y$`-j-{oLkj>a+y^Rb1s) zHRha4E}3$?w?qY@ThA^ow_RoFcae#JV|gfmGXd?>!$u^%2_#fR_x{``+Vsh?prqK1Z*DpR_McvPJ%Is;40-<5;SnKDANdl=JeNNM&xo20 zva-C5PtACI$wJTexaU(nZpQ>w&*C=A5EW1W&@_0nyHP^{sGW&ZK)gWFJrqHS1`y%_ z`X8E(ocZnDftXT%$ytTx`#mwEUk=v`?y2WpBc^lc3#V z-Q&c<^~aXcpn-686lz$RZElexC;dYDzM;Voi2(?fE5T7uqbbLbzyHdi;exB{F)@#i zmh$+2&xv|dckyQ2`LWHc_rTxh4L1egmE3^bC)K|2>Ffy+l3&yE4fjvGL6+61nIns8 zx8mS}^7sWJnhOAUWB@=-3_Mtjk|W@I2(NN@DJ`Et3iX?}2kOpDD~%80u^=Fv~|Yb=}5S_ zX2MF))Q+_KT6wd!kdd!gkRMZocr)AbT@{#ET)^n+_UVNfqY_<}OS>j%)|uSPV66Ge?&TTz zSt$bjWw1X_^89#_bJ|>~xim`4EZUspqPL&$wUv<&~v}xCUf4tc>3|VvE^*hz?A<-rzDb~`qYcdspWT^DpFOW!bVaYHB$<_ z?HQ3*PJM_sEy#+N?dMzz!G)>kFuZb8s5f;D`cPflQA)^Q%qu%v5eiUJ%3P0R@OlIR zXi4C;udrKazoam1OUazCb-TPR_|$ zrYg`gp|$t4@wb@KLtOdRlbE1}|E@VEybMg9p~J{fCZNK&e>^sMx@hoWlip)BL4bh? z3{fvY=tuF)C!GQchcpf5#@2eFcMlH(zAB@md{^bAD$a7;&fkb;X?-zv_ifUuc$@$H z``8X|vR>ngGT<}to;Tb%lsyt`97GxqW#s=wd7B@aLUhkFILOWGL}E~}{Vh-9V-ktbw+j1z$6WaiZm9B4LQ|Zv1^ul&iGobCRe#L*nu9zy$CZu(9UOL(hH& zKNK;?tkh_>{r=u%KH>V7={} z%e3)gH79l#G|X}KeTHgpr=E;G`><7cv~kRHzTAE-GiKMOc0m2>@J^F)02R|SDsDi1 z-n;i+mI`2Yb^BWqXl4iJ-_C1>*pc$?ZD!5F3yQ*67q23s@mX7Gt`-41Lp)kHHzg(B(yB=9wX*}k7apUMUrAq)&)u3Ae zKZ_=6(uPNf+{~~<-YU8*q#8W1SkFyTz3qS5_k8$;F@@W&qkae83zPDD&aVli4=A(U zC|QH|4QLsXR$8kDqrB=pjlgs#yL#&KgQL)D1mBj!)P(5Zx!#+4NY-)r6j4yO%ciN~ zM?VAabBisTs-w)$vNh;5EjjYuCPSF7Lxx6!s`1*lK_nKDNTdQjT7FoN?z5|H|M?|b z&|~u5l83QdC(w?5My!0(_w*yVde`PxS}BuHU{30{H9coX|Fmyw(H1yz^NP!P_lg+! zaq%Er-Vp!%;(sNSH3UFqLx5{Efi>1&tmZ()H~S+1hz0HXfw=#08qcd`vO zyBMw=0;gs(?xQDfPm=CBjbU2He_cMa8WQ&hht=2)Pl9*xMb&B43^~ zgqH&o3&cx?nNlIna0)c%#r-?3gnZvT_Y6C)Rcsy%__<`dNo)-P6UXx0=3V12^k0RU zGBoYhr2UYgwHcDb>(ug79ps}xFeUwJTUxPv_ldC0Xpwv;K!`2j4e0K@T{i$3c>x%7E@~iE* z+1N7_))TkVC{cl0CZdB)A;PwJ*|M}x0o_tMgH=($9c=d2!c7i`flsrPTA4{ZoC zr^WzkIEG=b)BxpWeKQjdL!>?J+1vYD!(&=2_Nef&lkhMkDLtL{ion>gr3W2LIyd<~ zZ%MV4WkybZzM){<#YcS!gAdfcF_WVC$LM_L3mT#JB@GbZK-~xi+)%$l0q*Ytz)w3S zKvbU7M#xAykU|@1zF#otY~x zs{^%_qgrw$A&mzw?dn6k7CsSln&*YJpU80bB9|))1Lm_nTsRk0t^n={goWL@mCgi& z3e0C0l>c>QN@gaUkVPM9)z*A>dwR;#bfINU^!uAaN;6NtiC$BfT-W?u_fPgNF%&F3n1VUD+9Ia;qp#>;LGS4-UU-PyeE1W5J854F{^W(_)= zpb~EwqAaOU3(`Uh@p6a}(%=c#fo2sX8b|)H_U#z^!70dNN@xd31@K!4&+^JvaQPU= zA%Af!`OPGi?e{~Fqy}kZvV_oYRTctL3uc>VVDSk8&|u2wBar5DfHR(twK6i>j?I$g z{zoMwVupVB;3A|?Zohi>#@JcGQB{D#mL@mBflD$!Dy?n}8Zz+4j2ii1E0M@x6|F5# z9yWM0x2m)%2YT>W4BLx8`3Vo1B8bc9+S7{s9W^M%hrD>&=_6y2OvBLjn`c6iS9ZFD zqMwdt0efo{)?CUK&QVbc1I)u4w7X4fT+TKWkq_&W<7^WLU8B&K(=IpgdxNW*j&)gs z-FzaSAUC7f;hK-Iv?c%_Tj;@^Z3&PS?U*2^35i{u1uevwn!Vtl(yT zzkyRR#{8Dc>7K3R~6;G){XvM zLL2MdGS^14JbmZAO3NI5iAH`?>vGQZ(Od7VOD{Nc?JQH@Hca1H){+^2d5||kT#6NL zM!U~=PoAgV0D2hS!$Tc4ekpXz-v>Ti_9AX+imsun*Z>9;n;rt$Ny{S4nCM;kkY4>V z#op$q)bG&h?n9~PJK8iP7^MO2f*HK~h5W?FzjF-9&xw)r}=JAK$YX<@m&- z$`$Dzq;2QGjRpxX%ZC84@Mw3;Mb%$JyP$8D7hA#&RE5H9|D*sqKl6v{w02Z%!;EfO z)=!G1XPdIRJ`9zMFPomuSjfFM8;tw>Ph#PU*WU%~Fj*rW8+J0R!u0K1X30Dr0k1wW zPUie$qO6X!y^+ahtyALT!2Ej&N1|0l#aKmD+-8MR=TNCQ;X`PZS}Nk~$`mY3|JLY; zQ;{3}Z(N?t{&7Y{v%cuow zM^Frp!DXQyPxZ?cs}t6ka_HGcfcb|IYw9x;3pg&Nyz!}T}`o+rI}DL zK@rXZ_yPEZS(o{LY~=N1s~EHP-!? zAa*vqgewr#G_A;I(#eU|z;RHjq?hC?ZHpZGo(Ru~6IO#V&mQC+4{g6BO}BW{@;{JT z)`9p;ZC8{H0KJT6fKUpL-fy1B5OxQ5N_M={N=QiZ!Wlcze2STWV=}i2KFSoc<$g&L^ z-7@vGq8Iv*+0D`WDL9&7^4Kxh_{p$$8P$Izu z2vmT&tAe+hO-66@d}#10VpdB)EE|YuHB&#>VdBDiEzQcU1?@;(?-5*2ZnVQ=U7qk~ zDfQ_FO!-`8Xj6L~!uoY5T0mcDpnJOE)RPLivV)bskRg&A$W5CNRsOr+z1TfI7P0!L zNhhYYXN-o(kcpf6M4>A?*gmo5b0vOMaAm8-Gq(%x=3@K^(uuV*=DjJCOx$^M&OcVl z56|^!5zucaRNnc4Yj(O`tm<)%0_pF-o`EJ~{L%29v!-OGK%S{*-%x>)V^H*d;)Ec* z(m#~+(|&)&hb?@*bT|N=`wc!9EF-X;#@kUBtr?zKOeZpWk!X0=7|_j`qNHV1WSz z18R7ZOg`X)8)vURPe2LdH!^Lmu+zJRQM}SBbj3A4A%-nqU7+!4pent@3ez|>Q7oW& z`|jba1W&RE0^xP2fW*yxPuT@b>|Oa?*Ykz@#?#*GnT}wW7O-RYqfj*bDjpHOrO^f7?IoV{BSxji`SJ~dNx zm)$r*ZtuLGyBsM@wy;wP*MQ4znBJu9Ydh=VCTia5WFOYPuA$k~p%u|jOyXcxpWDQT9dE8CSjRfz{tfoD3 z1@@mV;tW_itEqJz=C^qVd%C=zLo5H4Pb0^;U8g?CrX)9bz^a}})A)hn&^+LImZ6nD zC^7&OlVx|q8*iTNh%3=ST|Z=I_##(Z8@z38$1F!8w#&z!h1?VR@rEa=Q>gWH9c*ht z!M3JJ)tH{zvn|m4(Og*eF5Q)fz;U?Pq%1I@1H*^{wy-~Ph&vEvI3Sy`U*v4FmS8Z! zcFm9O2_|wjSIrbTnR!cQOi$}3;odAZw1RPZ<$NgW68k0t5YRfT;9l8Fw-T4Ju)5;% zG)QY}($C$h8{bleH0Pxmg$h&HZk<>j=NP>FLDyoqV=wt&VH~(zr|8XP|1aBuzIRbZ zNb37p<8fuqP zF%)>s zfES!OrryA>X)7T+BSUgyP7y!hDB%wEC?-R30536yyl><0vW9W%D9HSv5Ype0ilZlj zgn`U`_Pu5qAx@Y_%+!SNT^gOD^Sxm0g{NJNf;3ld3DRaGZK6OaXtOBn>sPl9xY&fX zG5@BS^}FJd$GR887>u9^nz_LRUND3u;l#dhbR%u|M?9ze`CwnbSsRlix^p;cP3`FU z??3KEgXu3q3iKXO-Zvm6Y3ach>VA+`8oM(zi}CuC)4{zUU6OYg9@pJ|O6`YKB&7?e zFf3)CZa@LEN&t`#UuDC{gBw`}aS)b@0(q?%)vEW!14_(3j_RF*hohH1zV#F5c&?uJ zjb;f31HN-%a@7w}Jri$=4Bbfg+=nK-;F8zkhFgN{$n=1ht9MI$y|>l>TI3BYi2hXA z$AXY@e-#RhBBmyl`tt+>Aajd*iGpQ3-~r1$HEk>x%ZFoMwZ*gBe%&tb{daGA(E6@T5R*N@;Hk zbAJ#G>(XQ(og&9hl%ZT2DEziw;g>yx7^R-7{FmjJsl6DZ6P}cGxyACKuQ#i;%9U>U zlK(2sA{%-SHyzWvjyZigWRzGQO>T~R2niUGxE+9N5LU%@eovtXIvb4_HRLOg=HhuG z$K&?Xd6psN>6iD?BaWCOY@#WE#GT8`$6zvWHcqAkSP0%263(Vu|16A>8&l>`(N1SRx^d5yOEm%rqtXn9cy8&=NrLX!^hwBA{S_BFDD+2cf#!pmrqp z_#1Mze<-!vA}hO`qv)Z_-QQDRE%UV`uNl~syNn50_r?UZ)$u@q@5UZA80(%?V@nvY z0L9C|Gq?_)T8H6&H%PFQfN&yI)1QocI`L7`d!eH>(6zQN*zG#SdpY3x^rej#%aVpW z)LNs|V!xN-?vbSiuKc94PT*=dKf@GII9okV4X02|`jlD5*di82^YRs(1m`O}_L!wY zKGuH382Bs`tyx|%mpH3wB7CL))%fZtgCGM>c+~cH?M!l(0y6b{e2ve7c;KqX*5A1; z()a7-B;d(#0np(%9b6D`thU1?{@mZJ*??0F!Oz>(Z(`FrrmG$l@>HiW@X0H?UM}Je z{gTKCtXDL;#R!n&IvD6LxaqC8@YoSrt>pvOEc{>&7+a(?vnY6w2u!&-h~NW)00?E% z0dXwv;sAg<@3Qs+Cho$&R9xjz`O39^0EoAY<*gR(KNUD}<-~$dj_t*_&eE%vAMQ!l zmiG>nx(@qJ2a{W~?!X2t{=>UmoORSU^1ixdr+`2oK_`mG z;OW08UF@qtA+n)&#WraNa}o<%s$q3}N*lNd8U1%tY|WaEt9W4Rb@a{8K9jFrUnz`x zsa_;yEa*(``@3)dNWiAx202ZWg^H|9pTl#!+ds7|BBy@9rn@4!a3$^*Rj$0^kKsJ% zgT4T*cT%r*q`xWl`o}0m%A7Yl?QA@c$SUImEyz6`N_8Y$bp@#^*7B>RK^vx=?^jp$ zX-I6fx{iHf$j+X>RYPEFn|txHJb8KbT4JJS-{7k=*40s=%4i-}zfO?(2%s3Kf$*Oq zP|JUXybu6^@T}fubg$iLb4+jgg*LPSQ4CG2lf}c4@3n=a&ig$kuMIB0^*EG~G9Qww z6B4Q{6h4e7?FjX3J|LC;%=R3ByTy2C&3R>q9!@r%>e90S3vmlkRT=8vH<>LZ^N4!5> z%8?W8k`<1toV;|DZ#+zlI(_8&Gh$}qk5IfR)6nT3p(mEyPQS@EV9>-oa&ms^pBB}` zP%?iJKaz{r*+43O6T4i&Kq z@G;8>X0tCD$fSBhMUz`euj~xq9Y1mKKit&tBjcG1-2N^Dm+z4tvt?WTeBN=7aN2 ztW9J~55x8BVf#sKX0q^#&D~ZA3Mm1|nCQqs0n~k_s+MEN*v)uFwKo@!`-K3&w(?J- z$93(61{$W&NhW%L@+-qViJMP^qwZ7wB0I%w3{U$UZR`Zq03c4bZVRt{`X_GW_W!%l zBj;C7DQJFmr5K;1&5gk4%jC=5Htz;aT|U7>%Ap~AZp{sQve7Mz@!ETSq&s}i@(ytd z?#wbRmcOPKg;fbx<6l9uA|#wnG4L$A&X-&)3-i*Mr>R!-d1+oV(E7g44g}wSyojHG z>Sb0ozR~lq_O4ZTKA^t7ja-A?&CF1#%7rne2gOVYn|$ zXtVw6WTP_Gh^@wdlkCQL7{bSQBW|PpWv1rc?7#)T|JuJXj@O?8es|?k+6wj+_CHgK z#zOqbt%R_ooXyFjj9lz2Y>E7MLpT*2|tTiL=Xh?6DFk7o#w4212l?xZ3 z8jo|0kv+Tjws2vG!i-JNTHsmp!j)fEq7{uIFy)bGmOrxC6yDDc!PPD>bF!(;&d_kG zBf#yoXaxfb+&K5IwSS^p#MS|TyUxpNwF>Flw6?*Z`(~tVc+guX5ZmiXz4n*iV)e2H z%O3r6Wnhmy#U4fJb(fK_&BUT&i>0@Z;o(fM0UzM;hcFrd#n%qXhH^Ur7ut@50;1Vo z{(mmOBLL3X)@ASRk-gdO>j-**@@1y2u48N0oHu&7*)!A9yp?Cum<~1@%V(cND3zfg z09A0s&+dHiKOIRgbO3AjKg6)PXhqvh{jmxyOZlHrrrz*>4anrpTFPc+_67eTDbysQ zB%F!nbs4P*Kg|-r4b$f0w<{0*2pPD_Y{71G_{f1xzde@0-^xil#N&?RD~CXDqUI*& zx*s`-i4g_e_FCub7i=HE{b29r07H+4T!yLXVQJMlUk2Zkv2ev03d!{l;3p zQ>^5e>iOs*|0tL3`P#%r>oum8NA`f#rfyhrqV`^D4Ta*TnPyUoieofjU|ftxYiMI< zWu}mwq*amVgu6I6sE$vbul`?g&43}>A=wYmVrt(?MNlEEBjm}ixno~%mFo77#qtx- z)_sHH%s*%P2A@;*y45axh9r3&YiWE{!P}lvJ9l?lT&+6Rb*hZ8Zt(Swdn`*@>fk33gYP`-qyo^GYih5 zFz&5zl;*x$Ns${T**iT?-3PE3cvV$0MQgZYRj3{HGxa_X-&G{yt%KM6`#m>yutRH} z?1U(xY(2UAu55J|zoZ6zRW>7gl;QeE2*!%ma(w?XxVyNCW!bbytFnHUfQ+XJX^U@u z_ob|Bg0=51WD4)N0nVMoSA;|U*j5ZCDic+T137jQwHMZCT+o$2o2x85+!SfkJ%9-R z7(em=0qIyx1^`h>?ZZU5L)LZDFo4KahlZ2}p-~5%YZ#02rk2kpgWoh+ z^bIM2zokS06w==h5IzJ2VSv&l^+Kl{g=g#LIxxvipn=SY8^m~NJ^?4K(jNVTT(zr# zdco~8^B$Yz91laBUt&KvyH|gCq6z?hkMi20_==FJkcz9oho56Q8V?@VHad_5i&TG@ zdd8^PmV)N7FAX3psk_jB*3m?k=33rIQ4<6CCk!GU-urrhbF8-dm+2W)X9d!zzhCV=dQHS2R=+DIC%oM6 z(36!wWwtSHTFEw7xmu2iaV=Z^$uCGrc-V_9Uw~VGQWT~OASE2R)IZ689yL}Y{!-XG zZIS+PFDOf}X<|_&wcI-eMcsv$p=WE!R(#9OvX_#*ML|@M#J8Hj_wzkgNm&f>;Ha(> zL=#&bPG&^ILhVvC8f3cq_U(MO>-*no-$iwn|GnLrzL4!YwV5JrnBI9E})mZssi2Hy#N zz$SAA{i^K6(*ee)I?Af5Ds*{o2WSDaE|Pru$|6=sNTlRNo}8|I%74Hh=TGC#<4S_pox#KAHdE!(X#JJwQyhml#g?AlDwPP+>P{$ z85umQ5Sw&nDbrzmYQcJx#IUbNaOdAk@2<+QOFS?!e6oFZU0MjI{zT18?Io27U1-}$+Tm-*XS2blEPxrd6 zhxu|S719Fv9ZIVbPsO_mdE8+9pUe5xzDPoJt zNl%M%<_%3fC$9GT>G>UccHa>1NDrGd`-5z$Oo7eR8^qqEFa1*xA&gjvJwOV;<7rNv zMo~OTYC=SIz)V!Bj&g7IMM4z0micE@!-IF8k(r4!fVq<}ONQhBWiU9d-p1Q-%Mn%% zu7`OAz3nrhx)fvQg={DocoGry7{Uk$mUC_#KTP+(LSYt32gqRr^`Z7~ps2doH{|~i z^_Edlc5m4Co&jb6Da9a!85IzN?wmo8E=52@N;)K@bA}M`1_1?05fB6fDJkhel#p)e zl9KM8c`yIZ^Q`w1i%+bz+1K9ZK9ApVoDP2&D~D-0&2LF9{Gqi@^X*JR=qU7}KxSi}5+5@U+4Sbq4xGB~%ES_1?E2Ix zm)k|y>Gq>SrMhYM9w5-z(G&K{WKv3fKt;`6VbYSIl*Fi30))BteY*95k4LlToe(sK zhIXMVvTxVMG}G1DWVI4!nFyYbmSn&PBr6j#1a>jprZLJ5Xe+9u)`00XjMT)G^zt3N z56Qd>T=Z5%;9=O$U8Qj#QY`dMb8=_8)O^0BzG2acf)w(@kv<2=2*rA z>ApH23l+?~-tEq^aBxkV`+g|aM(=BkzVle6MmI6gFuvrf(CVhs$fRIpp=ST5ow+i8 z5%tCFQ1Kc+8sByRzU0G%(9oq(L=E2G{CNNRcN%QEAmHimmHc z-{8TqoY!Jpxaz`B*KC$z=#5HHjP88taBPem6CYe}bCuAl4Lk|N+xvODIiOY(Ke6Pzpya$x!n06 z4y^g_@f_tM{fJ$=0)lJ(K)MJ0lM}1l!7+KZry;v9&u5|vSfuDo6!fzzxfIaEz@sU< z(#*S3?b~QcF(GwaorD@{^8GyXBuU5N4u&uS^9zd_3B)(3D%g8?fa!)&#+T=&DMU71 z0pNhdrgj}c03dC=2M_}6GzvBu9s!t2rpjECf05SVBlN{xN;?&C#(*fAC%KDt~>w_p8A3&5|7 z$sEaiiWm-5@i_f#CH1P%T~=p?GgL*;@clMD+xl*l6b78qi?4i28>5b>oSj*6FG$OP+qv=OZ=7>oo!uaxeUA?qOsnv(r8}^lL?H zbmDw#RH4Z|W0&%V#s--Ge(Ews(d+MEUhs~y*3ZY22nHbLSIWoR_9=v^lni!{yB$6E znc63kavG*m7b_YzlNt|@e_T71Ao#qJ-NYI8v}CSagnX8UfGZ&}^5WGL+ zKso7ns}=gN1Y89m22e-X&hl4Op z!xS2P%z}gJc**veL=G#>r&~1Srnw!;7dOkhOjedGO|sfTlgD%0FJ@S1EuZpG=_DAG zRbogO%fS^j$`7lHbBW_hf^zQW&p{y5)Y|L8BLOp7ssg@(g?Dc|~d4`!FA9Lz1 z6HcN$XwZksH3T3<_=|l5#@9c#do*{$!0%FWhFBouAhI1M{|mU~WfSQ?Hvd@yMo*Hn z)F8&H?|zJMGp$@x)G{v+52rUc5Q$!f>RR;X&SNo7eCop{3xI_?c-ZjYhLMM0QrGFR z_)(FYPypMsfBG&=>x4$ZF=*7Lg<`jEWtXZsz;uzdzH;i#ogm}eHeM&Y4P?x6Y_hu| z&W&Qd;w_Avsmb@;ncYH^6Sg)v94n8OKXH{E+A3aSTcp>mfa@a13%v2XVL^w|X#u^{p8__|f@kh4j%=ByY-%33=N4~c{ zu=<_VgLu9LJ-OC04)10Rf8{KokA7LoU{A_4MX9093+l*jNzTQfk6toUpibqJvJ%+1 z{LeI+)YoZ1@cg`$%ZA??`lsVI*0-@AUFr{HR3p zYxk$4Q`yS8)KXmaE-~l+E(cVv3c|-BIEwi?35CD>3?%mgdmg ztyQ_acyla!p+PsJ;OWbXiraUQ!g~RR2Uk)_W)?X5S+xi+_yk7v*F2Ytbd}_N{UXgB z{Cb*s+bVZAn)Isshur%v*;=lrAZ>K(#}l{^I7F>Q+?bxyCaWN<<1cMGvA`%aQHm?B zJ&M@RAbkjmIhCspu>3#1oZI-HRc6)vQuiWCZ*-hrf{Y$s`g&LZf=K=4*9!uRU(#Ti znZY^WK!vry*UEhebUvN%# zN7^}50?eqI5Dqm6Nh6dMxNaHv#XhftkM3B-gbev;p!^%2-I*mavYVCr zr9azu^+0dbwKKUz`i+Dq{bhKQw)o{7B}4VYlday%bx-a*{QOufQ~Rd)pT6RPBl@xA z2FEnt3-va$YM>ccs*&UqAz033X~zSNwfHC{X1%oEX;AHI9xnu}xx#D$p2b)T6D1aq z5KWUGn8plF>Gyw}-*oy6lbQy=83pW-4nD9%MXUowq$B>&Vmn`wCuRmvK9a#-dfUz9 zX?gE>iUrmgMen@X;NqU_Xq;qq39RC}g#c5wi=T3hk|)LFn@gr6mxD+?udKZ){!#e4 zAoS)MECBNMl~iyrLYl5$%3wxu%{=(91SP3Gvm4LhRq@f>?&OUJ0#S`F_HOz*Mz z;*_0^R!VNPWJqz8i=#*4WP^a(#?o*TnoBe1kaa)7m&o(kx4wGO6oD+_5 zzrk~W03F%fW19Fr8cGd(y|<|(yxI!;m9sK%s*+4L@n*rbxMWR@M^`}4$B|dCYIns%RmYM=W5StNj=0C_h$!l??C>~SVL^`+7Fb`{1HD1O0jflgNk8$+0UoSaZfQvbW znLc%*#Pe2FV@F8x@5Pgaub^;4p1_Wcq0CfYY7?w5QEpULj#B;C$pyUp-?Q~vb5d~G zw0$jYkQY07qt8Xt?flcc?FSlAI?()4u>7X>QL_#YCi$-4%}Z{0)mSY&s|J6#v$&%- zNqoMt)=*+J^Mu6bQTzCQ=hVvSgB_<95uE*RH^>Grr#N)P*Hjab_i@2V`OjG$GYc~+ z>&+_|^uu%rQ+?|H!ar2D-m&_O${H>-w3CP`hSlf%pH&-WR6^nD!FgGmDt-;;`;}+L*C74rONG%5;S?rUMtQfBQQ-*~ zrF%XJCi*9!<%c@v?#5M+`q!=wZCdQJ)}QOTYIAKQwmbDUs;Bm)&}{D6>34wx2LJw5(D_7U0GnRPQM ztbqso50Txf`+1icZ)5=gh=CRJT5*#lT48S+eK;%?Z4juLR4`9h_=_2*O=0m*e0vZg z$9cQ2DARtXL={~k75$58)C6n0=FWv~vs4bE?M^?~JDT2D_5M*Ept5%|;rHmklbQDU z$O_dfu6BkOaGE+*%LiF*nd1m|6$LkA92&*q zwLYwUV4aG4w4+3Qnni(o`pu%i@cG}zL?+cX^eaBzsQ#Bfsj8g=-oprc6d0>!t@rPw zkHKl~|2EiXe{}+hWPbhl2c0m*3*_SrZTLV6PoCK5DZ|lrK>R;7lvJJeDItaPF94g^ z>#w9#i=SUl!CqDPj{^Zj4{wm+t)PKW9h;G?loeb-7%WJp_$Q{+-noMYV9F2yj`G?e zbaGl5549K}(V8`K-+5){^NZ9=P|jgTK(yVm+-2#RPK>0*EAEZv^eqoXVGA> zFU7?B`%D5^y&p$ZbnYPn-%D7a-(-f+(2eZA;&_vZB;dlAeE+wtJl6{DF{XF_JHu=$ zHS}*TuZM)SVm6%m5)QuZcApsdlsw4NER|ogN|9uG3p2eDE{_1OFL#d75GGcjzUfmq zKQL`=6|Dx)Uze}RshGM0`i6Ei7*9yqf&WB z?y=u0%JG+YOHhg4ul7n1lKmQG?|Z~VO=Ib4L7CPQ_Ax;qcjIX`Z!MnV+^;fNjyCr%Au&Cx_Q8ZSAa zXAYS^%~OmW;^jfHah6`DMuB3)6B}|^$ly(8;1V>t$T@b04C-M^D0mhnO<=74Z8T39 zL3S!^y`Amk5OB4s$08#$e{@1jjdoJKtqX|8tXip6b^9@uFYK^CA@)0BSY@0F)4 zkBMoMNjX~U9lbf8i?++FOloI6ykl|$iU}4GH_}{D@-v< za}kkz?V4_gIv@ac4&^f(6&>O1u8axa!_3i-iUleV@_~znf%bcJ%pmsy2*$5W&=5+Z zwI>**doF?gwBQCd)(Y}sLjev#ygNM3(Ml1K_?D=jC8hOIFK|fKVt(p^&+%_@?rGR+ zYM)2ZobrqF;wly_!poX!lyhwLQxnLc#s{%zKD7Z^GJ!V_!f|G)#x+O;8p4(y$M=xL z?l0sx1jJ&MVo&Zxn5?#7cjw}8HS#}IV?{k~msRP^2PTtBhbeq29;RCtdETnjDdn6J zP4F`W+^cI-@*xv^NCKncVLu?eZLV53aq7i7g*GdmtTClWEGjPZ4O?}5lWigjkongQ zL|-s4>2_J&zkOXmMB{Rwwh?xLVC#t;7c^&_at7h)v+O9l*G_w z(rrVlZB!f}J?SbjF4MEsF6hf*Vdp;l836FcA86HV(xNM8fb(V3P~J3DW@&8GdkXO} z9@y&6>!tc}7ZVt{H#yGPo!|anWA^iiW4~$I7K{)~2hbL=zS;HOQFcK_OozhW{Jd=9 zinyTP2@aGOOV>ZGPIt9a^td(qe^b-SFFDuyK$S(c1qHjrS9J~skTdv^qG2xE`Fzi_ z(K$2+qWK4gXFlTSlHxBbRmO_Uw0Cg3Lb&ISxjts|+i2WaL0_qE{*DQcGs0BJFyr;p zBx^uEaBR4Fpw#xh>S@LMc8|cDHp4{?@4w%V7;TBB+3g!2=kM%{?l~Q&9%ehSC`tQ3O7=>c>;K!P8xb@#xX6w_AZ4}VMN zXI4Sjc=mjHyh)8fQA*A%(7_VYd`~n+^0^-+{A$d3^tF+f-!h`Oj&FUv#(J`P=~RN- zbrPFI_H(G!YT~Vx(z2rbE4GF@*q3jLrr+K76DK~?6BlHhaqaGNb3x344JObzSC=ET zyVB35c~sgFz2?vQ2>FIp5?6RK#?~PHoqqa3fXx(|Y8-vixY96gdNlO|QWqa5|JmQV z60d%8n7^og;?-e;LVeR^AEhGAh`l95Pe%u8;z_9UXZ>_Y@W%s!Z3SUA=V+Wk9hoA* z=kZA1Ki+cJNea&u@sj18hkY|E3#EPfFaWm5qp%{&XcChJ_`;Ze2-NAeyQZLYO)`E* zPP`HGbih>T`U)EfYKh^eNrHw}z;x7C%v+R$V9W(xAkv4A7xPoAi)TfoCKF&~xO(cc zyyoX$VaZ8+vUiuO1Naze`u7E5O$2L*u;*m?u5}SQ+Yc%lVc^8KV!z0L&0%Jc6JE?zn=os0XeHaM(qrKehc#G*{)a$CLGF>1x>r~^ zpBK6hemto7YTW>$42nPS=#)-=L_~|0yJUtsbfVmGDn}7+>xZ~MvDUekxZIPb#Rlpk z5|`YN=h~>Skxpm8Worm=i!6ykV#UpnJJN&Ln^-DhBI7?FQui8QW?;sj*T$?;>VY){ z(vDX|y>G3?l+5Hu>wF5U$aP13??Pzy+2$4Us;N6m)oQozn9h?^lA%4w$^@~Apphab z71Z3upVhNY3`;fN!Kc=fWOx!}bk7 zC@^W?xE>|# zxw*l(nElES%#oDlk!$so@DB7XA(ff$a8ndqTAsIiW4cqL!|%~^Z#T5OXrxx9bION2 zEhN5vTgEMk`p$`YHYWC3;_mR+vNkH$E|o4diG4xb<>Z*giD_mJBPOd{Iu|S*jSfxy zLZ(M6ay@U9`8oapN$D6RBo3o#Jz8>;+=St80z@rTmon+dt5TevtVrn|&n#E4qN5!a zZ;xMpA*H{dc%Jf<*-eGzLSHMfD1GMxq0_w%Bs);hoN)mH&k8v=i{_GeizfTWG1AYK z`dO*c|Jg{GS^;5|qR~XsZ+51e8MMRrWo8DuhStYB9S#4IoG7dJ51M@ZPkqe18%3IW zzt&&uCh>cn3`g=n4?^7UOmqi4#OGu;)$6+NwG{@hBejag{7bb@u5%nRmkz|aHLNtn zAes|BHE{q(F_L!3}Ij3?iPdrZ1S77G7Q$bV#c3$SW(?$y`gloq%B26_E6B z9ubXksbL##JDhB#Z5j!R{GI*dWue<*ZWgk+{%4*U4x62# zk}5voV|>uo)e1Ot0W}~TF5VCUfGeDmLoSkVOo_@(Gg2o$iMtOR zOFK~9NS zHZqY62mh?3K>2akcNnF`bFSksy1?Xj>|O_Ibz?cFWSi4hSEV0l!ar6p4l%#9$TR9& zyv0!!7v;b1PBsNh5{7wwS)^O1azu8hO3604u*WhS+CCKWkBOA8Ub>82?|>|KND-3k zz==Wika_aPR#eyO^7K%p(U82`b~Zb}}>- zC`4jlJ+dI*1py{WOJtk+Qe;4#u{SdH0kw0>g5&G;x{k3DwQfBRTWIk5iaqBO6F$LX z8aw4M1nB9=xGywL=k?zh%)H(&Ajn=K0{Sg$jP6kDW$Zdm))u-RHdz2#f95WL#CJG6 zeG!^OwzsW`#G+fl@0&0CcUm4|Dd4r`MVbdIUjhpgeA#M;YLP<~zS*Zug7=;fqC6+B z5jOV%sAe-d9shhTayv#)W_|iA1HuCX+q1uQg!`X`JGYYfegVpo2iD^1byKB%E)n7{ zojONjM&y!^7ckti#)VgGk07|9wzYpdg6-Gy;Vr`W%^u<&gU1i+s|N2_z0zX!Sq z^!h)#DxTo#fj|-1s_wmJujTD&dS?WQk9vC4W!u#RAz8fefEIJ2BKn*&7J!>S(zMnW zEF>k&0C-v>J>P73DB1l#vuw4v*sns(f2`!jFKQ;B?SclJAS-N3#n;TZ^SEa^hys$i)rNFhzn)hY+L{E%#(t6NR93Z0|aZJeM6BdJ#B>qA-f1> za7Ed25xUN$AMm#^E04WI)>uDZy-~9ow;mWst|s!6O4-GC_s(Vj+)f`QOxO42RLt-= zTjU(I9QF%-(-yb(Du!Fkru_cEjmD)D4J&}#7sRB!%pFRBO1P?$dR?m*Q~7(>>+V@y zF7Q)x=cQW37EajcDE>Y1a#)KhuvKZYcZDI_h`Z%~zTG(eVvS$6+u!Pz@vg_omH4UCNXKSiM>bWdT4NfxjB= z{S*`M`^kXlWjT9OfY0gnTv{%b?v6?E0zFP0_;HW3XiV$=Y1(*KiLD$qI9n09)Yr#h z6c3B@w2I_SWBb%@-Euhfzy9vKOPe75-W|h-aDH-uI9S#df-y6ohtC?hKk=C&m$`Z6 z5ht1T)E(nvm!6@|``lyG&tLWT?Fb0;9#A`fCVfjW2C{F_=)$8DEZ+v7!G$|X>bpp1 zqh7|f2zLa!aHG9ig%CCjR{bQ_qJ4zzi1G5*nB(tN$=!*c3uJCYMFn&lud!G+_`Q}P zt&I17YU&F39k*3TO80w0chYW&alJZ-J%(tExwY<9T$fcMtcV1?vHDv)7nWkjcHF$p zBHOt4k6HNt5te3n8r*3qxdVl=G#-P*m^#*T4bEzwDw0rnI=u%s!w!0n%*5^^3}?TK%{ zFqH@HhTSFD<{g<2M}H6=zgD49H;^H#_Tql_%It{1@kLou<>GRwlxxSa7&Vi52t~2` z_h_R#d%@%M6%7DHTUZD($58}92104L%q}Sr270(D(}55OlG3&gx?n0}B5)!09ee_c zlW35g{OB89Ve49{Dr|ZYtX?ZPKPdO*xy72e?6^{dDUmN~hvvfcYlut^JUSI$k@~;; z3|pKq%?GeSm;?|)2KA6GgU1XpreDX5>h=+oLG|l8sPd6PsTXe+ILmi!=gH^CicB!q z)E=e6jbhW3gK|7qT(Ym(bj-m552%WV8sXHlqCfNEW?(JGp8}VX- zo7#GgPjw1@BJ^WpgM}poT7}$*8zxEF2aq-u840jXIH%BK16>yexxd>&>cJBQVCwKKx+|46vvjf93qiHH|5Bye-z>=bko=#C^?!{wQ(ZyuQj)Qm zoIKq-VGcN#GEx9xM$9yf+aP7#?j}qinGD&0S7L~roYf;_WN4>vXzg(-!@$rF?q%9^ zU8)RqzV#3$E7+r396&{{Ycc%gGC^LAt&Y0!ErT2IWDDQ+Ci*qDP-_;zCB-)&48w!Its~iUAZY=qi~t;Ze;Iw z388rGaVhJ)j#9?p>>tn6c>0Ep$uX$nCfpYU9P<^5{qjp{vxvDy2?)8ICxM$`Fz9$s zr->n-2&8-P?0OKh9$|{tdU@=`YFds_IJ&sHkBkiVZAN4Ul-XG1CM zWZ%VZn=9l02U!92na&$O)=^WP1@}^eF_pmuK6LmMj|CrC*6I(Qs70hQp{H^|434;7 z%#hQXsudwr^2+V3#Mq?n3Ov&rH`t>jdAK$+?{tw`HZiooH**?QhKx!%4w;}}ywISm zi(iRai&$H(5sVm_H$>s~cPk6R-W6dAE6v5Sxo4z(%I%dtu$>J-4apMYS!T{rt^rt` zjC7^ta5Nikykn6AM+F~hD3P%u2VYHo=6%1dksNw^_4b#5oTbrsw$)|ga#yUBmcEZu zc5^e=oP8dDA6v_-2t$jIkRFTlya1{-$fEI31+@@nR1ck72d|dMq|l6RNQ;~AoDtS`1-o+-p|vDM#NneG~fM5MorE$BEK?UjU* z5~GYTzMb98`yZ_N&s?jh=Ls9X^B4rnnt$hXcU18BDvqBW(tatOlFKWlJ3f~U1AW9+ zw=$_XTaVnz-j9<|o{RV6v&qDaF){1q{nrLhBr%#hjKRVf+14HIj=!42u=s{zqCh4M z5COyhq1ZMoCv-e3D7c)Ze0>VU$pUO9VAqgtNZFXpL`5#}oXf-^ZfWJj;Mht+&4kZ- z#5-?fRXcxVfjN~*+x~@n&KYkB0SUD+{z}U&B_^_bY=fA_MD}N?i%R;|OLO-9((-?M z|L@Y35#eB{0tU3^y=SP+hwBI$)RtbSuU2+o62kyqds-Q z=Jj2JznoY^73yVFviHt)_&?ZZyHEqznrULI-($vWCUccF{<@1wH&D{%X6wOvo%43F z^S(@DFD0L27g}VAp-Yujx-&*3$Ip$fwB7P?#!0KzUw%s*uFxhrZTJW_AS6R6R~mY` z?3nVWX6o5lzAtTLyc{_{x92q0#P@;iQ`=0yzCBZ=xr6N5ZN4Vm+&bu7S@Z^eXNmuF*70c zx9~u~b*)xu7IuJsCm|_-&BS`nk)oo0IfcYfnjq_!n~DNN(?*zsk% zrz^NRTRWn?%~BS^Vq{P+EN_jj+hOh83luV-{Z#BTl{NSy2yX7>XS$PWVG2~g2hNbb zzBbSN2(N#Zn!7D-U!15C?A)muInTnr~lZ~@vJKz#Oy1rHN>=8^l);FHPx3_k?VC~UwhEN!`(*l-AZo`Q; zy(jOqUVuC3AtG!1sEmD2;2a*?)Y@K)by>b9Ut$x6RWuH6G96Vf(4U)1{FW$%=pB+U$+XMV zSR=CA?HxSKZwQn8eRLz!S(|fsZu4hvHBS1V9ZFDQeR_goUdk8|$`lsEeBb%BWA0{c z`zuOCQb@!?83+HNsWf3SbxE02Uy(}UhcqT53=6rgU=mF-1ti2tFdWYP!e8Aycl|gl zb%u(7H>5oXRptvg@rnp5L-IQ4s~~#r9w1DMY%OVP(*SV94;{iNYjDL0$6?1_^=^)l z_1|QaNZ(|-clyS22iJX6plQnLp4}NWaAXP8^H>?Xq_+r>%TKBv*)xNlWhSaP3JCc7 zE!2sM-FQTe@z{z@zx;+Gxa^yM8ow?(>q+jq|M3CO6n5iR?Ea683X|GXMp>k0P|ic* zlZkYXJ&#$<*CpiDgkNvP6-N1D0ll=VGqZCKN--FXx^3(=?&3`mq-^Y^U zIx`-ewPqU4coNExg@cJ?GP>Vj1EZk>9%nWe9<^Ht7BB(yH!^Z4!z2(-56}j{i>$T5 zjP3=Ojri6MG>e462>waR)G@Qe2(IBtkhP@YAo-^~QNKJZ@yS47D%t2Wln%4!P_7$v65Fo=P7}e{c4yoGEvfgFj;c{If^^TVm`P<+CKS z_uIo!AtgD12m!g^>-qDG4W(TH4-x#vM7G(=P@Mwq|W=PyyX zwmojl97}Txmca=5v7|HxT7{)Y1yVEo34pSyO$-3Op{1(t<^e^y|@ zEmFg0NM_&0N8&{S7qIj*h;Mc*BBZOyFLkv=@JabWa8%O{&0|eS&q#QO@OaG zu8%mIm0RCBf)q1|x$qD0jp9vxxue79`4X-|&c*P5y^jn~9=3L#>wnN&CkgmH2O+eS z{HY74bOx4WZfBDe`t&q?MyGFIH1d-b>yJ(~I3_wq;{!`C(M{d7IIy4nP|rTHwz8n~ z*Hc&V2IcxKd<%u&DT?awzlkDyQXjqC0LAQlG?#48X7GGB3r=`bt^fyRQ%p#%U9^J? zq2}|tLQrtP^V)BshrNoT$#*^RR$q|B376^z_Iu~PSI+zIef;iFs-M{1N!LGNFSI*Z zZd>i^9tu@*tZb&|4%>QlRF37Rm7H7XP(mK3l&AlCh~(%pL1qPI3a}YW0ed?ec8h@$ zpEefw79_fIe=w&TU3PK8cV39TlER4qT4^7}@XWaq7s}!(iAz6_S=DK`Zpo|i3o@KT z;Hd=wWe+t|MRYUKC5ktVHM2J(ARZU_QQdjFE{*>5WY|AAwgyfEwsl8;3v{I}o$qc$ zUBy3XcZD+iuzb7ZNW$Q0tb4!)W#ad3Pfh;^buz6WYw6g?TCTfzc-dbAsILuKr#Zj9 zr0jK6vs=Htt>wjF0({56c>y!&)CC9ZJr>%@n-(;w|9qm!OSdXIX3ec$>g zf4uE;6kq#9{N1}O^7nbbTTks3)RIW)zQLOmm$$+Gqxu>`swF3jlYF$I$II;&Ha1z& zp@gL{+S4k5<39^m{rz0y7tih7_;2o+;M1H{!a6$-{>?(mUC5jaRN)V~KqHj)zZ>Kx znMwhP^-tvOIt3B^Oq}?6B||q7G=Odi<7oG&k8KlpjK{~dCcL7jJOrCT zjuljAshC<3HPl4%9CIEBrabYMeJL2DvwyS>G4KYkighc1CvIMH9GVvdzHmr!R3gWe z?`YAU@@^iF`W8!RCL%d${X-6K7QBo#KAxpZB){6&g@H56J^7#!;vAK+R^qb2=$)3x zcyyrhG~%zw^wYEVNzsYNhj)?2tnbflZ7Z#z?&6elOq?$Nk7d8I!YTEi!%=&;2!~@y zqa5MNJrOTm(creiJCd7eTny>v748AhEBVS}3zwS)`!XGU8)}O!%bC!Q>)kW>(487E zc*TR*v)>NDp`s#JtbxkUN4_$TBva|e0qI$bNdX^$=Db-tA2vPH+t4_v#htqZqdl$KG$Bxc0~-OF8&7UM_# z8ckHMT_R5DRKVdt6b9eU7P;#s!F8_ZD+kv3nY#Q%UKlwC7L{d$FDJ2+-Zz&;i=1S% zX+L^aydEICv@*@Q#Q?7|;@%lkdzdQ(d;gzS>lG0YE<$oSlH&-`8?`R*eeGX#z({DJ zk~4XvGw2hc5>WF~(*B?nZT;+^!Qf+gry!%K*pA5P?}GE|%wL5UiXSj^YmN1Uxf8t_ z61DwVf*LljIOq-EO)o!wIffGTdMyeCl=aS5xjc~;Q;dKhYpRfj`~3$LJGVH_erj>A z9`7iSN8>t7&v04_q{jD9J#vZPWi<)8>?XN0ggE4d7LFWf10^ht7sWR+I$cFQi}1VM z!~Z!@ojN@x6>!ybz;56N$~36wDl25UqbUOBMhV+n=d!$hz~9 zemy{1E&8}7-7?@?z}V0g)gl_f+KO7WHPKED+TPA~9k+Hm021qXI%syJJ&w~hVh%EX z7C~>Sv;x-Y?j&^tFTUX%AY6DXMg|>nd{~4kY#krPgmO5F!I<#%CNwxgAp*}gBi-~^ z^)$AFBYRLIjZX*ey zq385|119_HC#WTA^h7ipXAnja@;1Dvvs|k+%w|n5AdyjeF{j^rqee(bZ$9ZorxwX< zSmwNk!=HI)P=AyAPgZqG3dO31aD88#?rT!(tK?&%vIEy|$n~4{dvT9{I`FmU+1#TB zceOuUz8_awM$N=aaju4j{L3ZTvWX>gxUUb>Zx(qjFRKPZa6{Qk0)5KD(ZGtH{4WsXUzEj3 z%J|(}V<-}&Z#pRz_LHgAy^r0RJ_0dC^P-PY0M%tH>NGnD@+tpb66wc9!f?mhTNEVNpTxetsw@^pY zmmG`|B#PIV7~gJLlbZb#5#O(?RFrTz!Q+}7E7RXk5LU^;^fxoYT1jFP=hGfj%lDr7 zQ{bdA-6^QZiP^m}#glbb)t|-&fL0c(DOYSD#pVVaFnUzdOP~>0g1ZQTf|AY!p&+lA zRZiToNNG9Hsz_ukt}&W_GxhmvCnxPbiwR&NGZ2dOCxi8|CyvQg*mxBuSS_lXqiyMS z8$aDTCWs<~ga)MWpQFe0Ykg(I%Am6k+uXUH{4W>Hfo;lKT0k8#`HZ{#CufAIp!Bdk zcs!RTyg_A08m$%^q*0C~8|gl` z5WvO=6Yj6rKb8LQlgiPH)W{!2iZSXVo=@1G4!JAG3RgPN7~G%>)WwbcTe4gh_^r-l23TJI|t*s0GSu}t{BTXZ4K^X9`v zhyE*bMAlywrZGUr!JHA~*`;D9-BvJX!FY0R6brg>>y;c!3R8MXn;aJ`;2*+SCEG64 zaV<+~`IWAHM zo4`WTEggUP<^;xkQ%Ef{Ra#bK`(-le_k@j$%E9dHH#SB$TeHYd6A9hP0y46#mP`oC*>JCm!){(1M|x|x zxqfd(Du%l_vopv^jC};NIZt!X^sj{On$rJc0Rp>ktlmj;ytq8#^X5Zg(-qT%516Tp z#qMosbL97WkU4v3DE6iUUJy@F@l&=nRRS0ZcjKQ%j=jVhsNrpZL_IG29zZmMya z@Pu-~1B;-yu}2zY1@~-c2R4@gO-T&Zblhhg_4rDdP*8Ni^4)gtb07?#{B+5H3Om z=jqtdle!}0w%B~Po!C{JXCK~mZ;)cxKvz%_q3_v~1Ky%WiO=w-VHfZW@Lu8-j>f5X zFnkxv63{RZp-u@q(+7|^!w7YPVH{9EWTAN%B&SI$zrWALITlW$L8TYWd92RhloA z)w96Acj16-+x?9eSt~B)EQ5j{vJG-TS+Pkp7Enq)Fs++8zDf22Gr`Ve2e=lfTZfCH z!l-iy|GBd-(H*u!9r11Fh=70?^Za%_C;Gt};WvQ&Zd^#kx@B!AHGZ`PLhwNsz`t{B2ijZ8n_+jd zrv^h`yM>e`P!`|z&Boo#t;`uX{V8tEr*chfoyudogdYEOyBsDoVfB~-r|~3`Dzc)G zZ_mGQFaNmyREC{Tebb(0k8$Wq4e?%8*T}m9zt^AqS4J*Cv01vA%Tom<7a8+ttpAdo zbFJm4#N{4D6q@AxIO5tcf3^EuRyb@+$|sF8ql2Z&U3}ijgBUEs%z|3Z+3F3LRm4Dq z%s$ljh3o^?x#0JpdvU^|&hJUFHOKH$loiui`WaM_fJC?)n|6nVAV2l75x~ESA38w^ z`M{PYfz9QRsW+3b#&~94{lZksg8O_!5xZ$fgW~{+7NO%O!Q40Qj)*?Q-K8osfycmk za;E7AzeV0{w7Fj(pq)MPF>)~GLn_P11E-EYUomU1P)9cp2fS4a(i?Bl2X!=|;9D#i zNOWJ*W8sD9dqP&Iiq2