From 26cb0f4cf81a9a4c34979908fc68dc31069b4902 Mon Sep 17 00:00:00 2001
From: haishan <710328466@qq.com>
Date: Mon, 15 Jan 2024 22:23:10 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=8A=E4=BC=A0=E6=96=87=E7=AB=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.dumi/layouts/index.tsx | 12 -
.dumi/theme/layout.tsx | 32 -
docs/fea/Q&A/index.md | 1 +
docs/fea/canvas/base.md | 604 +-
docs/fea/canvas/color.md | 517 +-
docs/fea/canvas/font.md | 97 +-
docs/fea/node/intro.md | 49 +-
docs/fea/pattern/about.md | 3 +-
docs/fea/pattern/action.md | 1 +
docs/fea/pattern/createType.md | 1 +
docs/fea/pattern/structure.md | 196 +-
docs/fea/webgl/Q&A.md | 1 +
docs/fea/webgl/intro.md | 1 +
docs/fea/webgl/threeJS.md | 1 +
docs/fea/website/index.md | 2 +-
docs/interview/algorithms.md | 12 +
docs/interview/facetoface.md | 38 +-
docs/interview/img/hooks.png | Bin 0 -> 1470174 bytes
docs/interview/javascript.md | 502 +-
docs/interview/performance.md | 65 +-
docs/interview/react.md | 307 +-
docs/interview/safe.md | 100 +-
docs/interview/typescript.md | 24 +-
docs/interview/vite.md | 21 +
package-lock.json | 20773 ++++++++++++++++++++++++++++
src/css/demos/HeartBeat/index.tsx | 7 +-
yarn.lock | 4450 +++---
27 files changed, 24699 insertions(+), 3118 deletions(-)
delete mode 100644 .dumi/layouts/index.tsx
delete mode 100644 .dumi/theme/layout.tsx
create mode 100644 docs/interview/algorithms.md
create mode 100644 docs/interview/img/hooks.png
create mode 100644 docs/interview/vite.md
create mode 100644 package-lock.json
diff --git a/.dumi/layouts/index.tsx b/.dumi/layouts/index.tsx
deleted file mode 100644
index 25e85be..0000000
--- a/.dumi/layouts/index.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-// .dumi/theme/layout.tsx(本地主题) 或 src/layout.tsx(主题包)
-import React from 'react';
-import Layout from 'dumi-theme-default/es/layout';
-
-export default ({ children, ...props }) => (
-
- <>
-
- {children}
- >
-
-);
diff --git a/.dumi/theme/layout.tsx b/.dumi/theme/layout.tsx
deleted file mode 100644
index 11eec89..0000000
--- a/.dumi/theme/layout.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-// .dumi/theme/layout.tsx(本地主题) 或 src/layout.tsx(主题包)
-import React, { useEffect } from 'react';
-import Layout from 'dumi-theme-default/es/layout';
-
-export default ({ children, ...props }) => {
- const { history } = props;
-
- useEffect(() => {
- const header = document.querySelector('.__dumi-default-navbar')
- const cont = document.querySelector('.__dumi-default-layout-content')
- const lo = document.querySelector('.__dumi-default-layout')
-
- if (location.hash === '#/resume' && lo) {
-
- cont.style.position = 'relative'
- cont.style.top = '-64px'
- header.style.display = 'none'
- } else {
- cont.style.position = 'relative'
- cont.style.top = '0'
- header.style.display = 'flex'
- }
- },[location.hash])
-
- return (
-
- <>
- {children}
- >
-
- )
-};
diff --git a/docs/fea/Q&A/index.md b/docs/fea/Q&A/index.md
index 656c41a..b2b4445 100644
--- a/docs/fea/Q&A/index.md
+++ b/docs/fea/Q&A/index.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 Q&A
order: 100
+ path: /qa
---
# 💊 Q&A
diff --git a/docs/fea/canvas/base.md b/docs/fea/canvas/base.md
index 5b841c5..518b7a0 100644
--- a/docs/fea/canvas/base.md
+++ b/docs/fea/canvas/base.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 canvas
order: 2
+ path: /canvas
---
## 基础入门
@@ -15,41 +16,41 @@ group:
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
+ const canvasRef = useRef();
- /**
- * 绘制矩形
- * fillRect(x, y, w, h) 填充矩形
- * strokeRect(x, y, w, h) 边框矩形
- * clearRect(x, y, w, h) 清除指定区域
- */
- function fillRect() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ /**
+ * 绘制矩形
+ * fillRect(x, y, w, h) 填充矩形
+ * strokeRect(x, y, w, h) 边框矩形
+ * clearRect(x, y, w, h) 清除指定区域
+ */
+ function fillRect() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- // 实心矩形
- ctx.fillStyle = 'red'
- ctx.fillRect(25, 25, 50, 50)
+ // 实心矩形
+ ctx.fillStyle = 'red';
+ ctx.fillRect(25, 25, 50, 50);
- // 空心矩形
- ctx.lineWidth = 1
- ctx.fillStyle = 'black'
- ctx.strokeRect(75, 75, 50, 50)
+ // 空心矩形
+ ctx.lineWidth = 1;
+ ctx.fillStyle = 'black';
+ ctx.strokeRect(75, 75, 50, 50);
- // 清除区域
- ctx.clearRect(50, 50, 50, 50)
- }
+ // 清除区域
+ ctx.clearRect(50, 50, 50, 50);
+ }
- useEffect(() => {
- fillRect()
- }, [])
+ useEffect(() => {
+ fillRect();
+ }, []);
- return (
-
-
-
- )
-}
+ return (
+
+
+
+ );
+};
```
### 三角形
@@ -58,40 +59,40 @@ export default () => {
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
+ const canvasRef = useRef();
- /**
- * 绘制三角形
- */
- function tri() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ /**
+ * 绘制三角形
+ */
+ function tri() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- // 实心三角形
- ctx.beginPath()
- ctx.moveTo(90, 25)
- ctx.lineTo(25, 90)
- ctx.lineTo(155, 90)
- ctx.fill()
+ // 实心三角形
+ ctx.beginPath();
+ ctx.moveTo(90, 25);
+ ctx.lineTo(25, 90);
+ ctx.lineTo(155, 90);
+ ctx.fill();
- ctx.beginPath()
- ctx.moveTo(90, 155)
- ctx.lineTo(25, 90)
- ctx.lineTo(155, 90)
- ctx.closePath()
- ctx.stroke()
- }
+ ctx.beginPath();
+ ctx.moveTo(90, 155);
+ ctx.lineTo(25, 90);
+ ctx.lineTo(155, 90);
+ ctx.closePath();
+ ctx.stroke();
+ }
- useEffect(() => {
- tri()
- }, [])
+ useEffect(() => {
+ tri();
+ }, []);
- return (
-
-
-
- )
-}
+ return (
+
+
+
+ );
+};
```
### 绘制圆弧
@@ -100,38 +101,38 @@ export default () => {
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
+ const canvasRef = useRef();
- // 绘制圆弧
- function drawArc() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ // 绘制圆弧
+ function drawArc() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- let x = 90,
- y = 90,
- r = 30,
- startAngle = 0,
- endAngle = (Math.PI / 180) * 180
+ let x = 90,
+ y = 90,
+ r = 30,
+ startAngle = 0,
+ endAngle = (Math.PI / 180) * 180;
- ctx.beginPath()
- ctx.arc(x, y, r, startAngle, endAngle, false)
- ctx.fill()
+ ctx.beginPath();
+ ctx.arc(x, y, r, startAngle, endAngle, false);
+ ctx.fill();
- ctx.beginPath()
- ctx.arc(x, y, r, startAngle, endAngle, true)
- ctx.stroke()
- }
+ ctx.beginPath();
+ ctx.arc(x, y, r, startAngle, endAngle, true);
+ ctx.stroke();
+ }
- useEffect(() => {
- drawArc()
- }, [])
+ useEffect(() => {
+ drawArc();
+ }, []);
- return (
-
-
-
- )
-}
+ return (
+
+
+
+ );
+};
```
### 绘制贝塞尔曲线
@@ -140,44 +141,43 @@ export default () => {
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
+ const canvasRef = useRef();
- /**
- * quadraticCurveTo(cp1x, cp1y, x, y) cp1 为控制点
- * bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) cp1、cp2 为控制点
- * x、y 为结束点
- */
- function bezier() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ /**
+ * quadraticCurveTo(cp1x, cp1y, x, y) cp1 为控制点
+ * bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) cp1、cp2 为控制点
+ * x、y 为结束点
+ */
+ function bezier() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- // 二次贝塞尔曲线
- ctx.beginPath()
- ctx.moveTo(30, 90)
- ctx.quadraticCurveTo(15, 15, 90, 30)
- ctx.quadraticCurveTo(165, 15, 150, 90)
- ctx.quadraticCurveTo(148, 130, 70, 120)
- ctx.quadraticCurveTo(65, 140, 40, 140)
- ctx.quadraticCurveTo(65, 135, 55, 120)
- ctx.quadraticCurveTo(30, 115, 30, 90)
- ctx.stroke()
+ // 二次贝塞尔曲线
+ ctx.beginPath();
+ ctx.moveTo(30, 90);
+ ctx.quadraticCurveTo(15, 15, 90, 30);
+ ctx.quadraticCurveTo(165, 15, 150, 90);
+ ctx.quadraticCurveTo(148, 130, 70, 120);
+ ctx.quadraticCurveTo(65, 140, 40, 140);
+ ctx.quadraticCurveTo(65, 135, 55, 120);
+ ctx.quadraticCurveTo(30, 115, 30, 90);
+ ctx.stroke();
- ctx.font = '18px bold 黑体'
- ctx.fillStyle = 'black'
- ctx.fillText('聊天框', 120, 160)
+ ctx.font = '18px bold 黑体';
+ ctx.fillStyle = 'black';
+ ctx.fillText('聊天框', 120, 160);
+ }
- }
+ useEffect(() => {
+ bezier();
+ }, []);
- useEffect(() => {
- bezier()
- }, [])
-
- return (
-
-
-
- )
-}
+ return (
+
+
+
+ );
+};
```
### 绘制三次贝塞尔曲线
@@ -186,43 +186,43 @@ export default () => {
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
+ const canvasRef = useRef();
- /**
- * 绘制三次贝塞尔曲线
- *
- */
- function beziers() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ /**
+ * 绘制三次贝塞尔曲线
+ *
+ */
+ function beziers() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- // 三次贝塞尔曲线
- ctx.beginPath()
- ctx.moveTo(90, 40)
- ctx.bezierCurveTo(90, 36, 70, 25, 50, 25)
- ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5)
- ctx.bezierCurveTo(20, 80, 40, 120, 90, 140)
- ctx.bezierCurveTo(110, 135, 155, 110, 160, 62.5)
- ctx.bezierCurveTo(160, 22, 140, 25, 130, 25)
- ctx.bezierCurveTo(120, 25, 110, 30, 90, 40)
- ctx.fillStyle = 'red'
- ctx.fill()
+ // 三次贝塞尔曲线
+ ctx.beginPath();
+ ctx.moveTo(90, 40);
+ ctx.bezierCurveTo(90, 36, 70, 25, 50, 25);
+ ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5);
+ ctx.bezierCurveTo(20, 80, 40, 120, 90, 140);
+ ctx.bezierCurveTo(110, 135, 155, 110, 160, 62.5);
+ ctx.bezierCurveTo(160, 22, 140, 25, 130, 25);
+ ctx.bezierCurveTo(120, 25, 110, 30, 90, 40);
+ ctx.fillStyle = 'red';
+ ctx.fill();
- ctx.font = '18px bold 黑体'
- ctx.fillStyle = 'black'
- ctx.fillText('爱心', 120, 160)
- }
+ ctx.font = '18px bold 黑体';
+ ctx.fillStyle = 'black';
+ ctx.fillText('爱心', 120, 160);
+ }
- useEffect(() => {
- beziers()
- }, [])
+ useEffect(() => {
+ beziers();
+ }, []);
- return (
-
-
-
- )
-}
+ return (
+
+
+
+ );
+};
```
### 绘制笑脸
@@ -231,42 +231,41 @@ export default () => {
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
+ const canvasRef = useRef();
- /**
- * 绘制笑脸
- *
- */
- function fillSmile() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ /**
+ * 绘制笑脸
+ *
+ */
+ function fillSmile() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- ctx.beginPath()
- ctx.arc(75, 75, 50, 0, Math.PI * 2, true)
- ctx.moveTo(110, 75)
- ctx.arc(75, 75, 35, 0, Math.PI, false)
- ctx.moveTo(65, 65)
- ctx.arc(60, 65, 5, 0, Math.PI * 2, true)
- ctx.moveTo(95, 65)
- ctx.arc(90, 65, 5, 0, Math.PI * 2, true)
- ctx.stroke()
+ ctx.beginPath();
+ ctx.arc(75, 75, 50, 0, Math.PI * 2, true);
+ ctx.moveTo(110, 75);
+ ctx.arc(75, 75, 35, 0, Math.PI, false);
+ ctx.moveTo(65, 65);
+ ctx.arc(60, 65, 5, 0, Math.PI * 2, true);
+ ctx.moveTo(95, 65);
+ ctx.arc(90, 65, 5, 0, Math.PI * 2, true);
+ ctx.stroke();
- ctx.font = '18px bold 黑体'
- ctx.fillStyle = 'black'
- ctx.fillText('笑脸', 120, 160)
- }
+ ctx.font = '18px bold 黑体';
+ ctx.fillStyle = 'black';
+ ctx.fillText('笑脸', 120, 160);
+ }
+ useEffect(() => {
+ fillSmile();
+ }, []);
- useEffect(() => {
- fillSmile()
- }, [])
-
- return (
-
-
-
- )
-}
+ return (
+
+
+
+ );
+};
```
### 吃豆人
@@ -275,142 +274,137 @@ export default () => {
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
+ const canvasRef = useRef();
- /**
- * 吃豆人
- *
- */
- function bean() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ /**
+ * 吃豆人
+ *
+ */
+ function bean() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- // 外墙
- _roundedRect(ctx, 12, 12, 160, 160, 15)
- _roundedRect(ctx, 18, 18, 148, 148, 9)
- // 内墙
- _roundedRect(ctx, 45, 50, 45, 30, 6)
- _roundedRect(ctx, 115, 50, 45, 30, 6)
- _roundedRect(ctx, 115, 110, 45, 50, 6)
- _roundedRect(ctx, 45, 110, 45, 25, 6)
+ // 外墙
+ _roundedRect(ctx, 12, 12, 160, 160, 15);
+ _roundedRect(ctx, 18, 18, 148, 148, 9);
+ // 内墙
+ _roundedRect(ctx, 45, 50, 45, 30, 6);
+ _roundedRect(ctx, 115, 50, 45, 30, 6);
+ _roundedRect(ctx, 115, 110, 45, 50, 6);
+ _roundedRect(ctx, 45, 110, 45, 25, 6);
- // 绘制吃豆人
- ctx.beginPath()
- ctx.arc(35, 35, 10, Math.PI / 7, -Math.PI / 7, false)
- ctx.lineTo(31, 37)
- ctx.fill()
+ // 绘制吃豆人
+ ctx.beginPath();
+ ctx.arc(35, 35, 10, Math.PI / 7, -Math.PI / 7, false);
+ ctx.lineTo(31, 37);
+ ctx.fill();
- // 绘制魔鬼
- ctx.beginPath()
- ctx.moveTo(83, 116)
- ctx.lineTo(83, 102)
- ctx.bezierCurveTo(83, 94, 89, 88, 97, 88)
- ctx.bezierCurveTo(105, 88, 111, 94, 111, 102)
- ctx.lineTo(111, 116)
- ctx.lineTo(106.3, 111.3)
- ctx.lineTo(97.3, 111)
- ctx.lineTo(92, 116)
- ctx.lineTo(87, 111)
- ctx.lineTo(83, 116)
- ctx.fill()
+ // 绘制魔鬼
+ ctx.beginPath();
+ ctx.moveTo(83, 116);
+ ctx.lineTo(83, 102);
+ ctx.bezierCurveTo(83, 94, 89, 88, 97, 88);
+ ctx.bezierCurveTo(105, 88, 111, 94, 111, 102);
+ ctx.lineTo(111, 116);
+ ctx.lineTo(106.3, 111.3);
+ ctx.lineTo(97.3, 111);
+ ctx.lineTo(92, 116);
+ ctx.lineTo(87, 111);
+ ctx.lineTo(83, 116);
+ ctx.fill();
- // 绘制小点
- for (let i = 0; i < 7; i++) {
- ctx.fillRect(52 + i * 16, 35, 4, 4)
- }
-
- // 绘制小点
- for (let i = 0; i < 7; i++) {
- ctx.fillRect(28, 52 + i * 16, 4, 4)
- }
-
- // 绘制小点
- for (let i = 0; i < 7; i++) {
- ctx.fillRect(100, 52 + i * 16, 4, 4)
- }
-
- // 绘制小点
- for (let i = 0; i < 8; i++) {
- ctx.fillRect(44 + i * 16, 92, 4, 4)
- }
-
- // 绘制小点
- for (let i = 0; i < 3; i++) {
- ctx.fillRect(44 + i * 16, 148, 4, 4)
- }
-
- ctx.fillStyle = 'white'
- ctx.beginPath()
- ctx.moveTo(91, 96)
- ctx.bezierCurveTo(88, 96, 87, 99, 87, 101)
- ctx.bezierCurveTo(87, 103, 88, 106, 91, 106)
- ctx.bezierCurveTo(94, 106, 95, 103, 95, 101)
- ctx.bezierCurveTo(95, 99, 94, 96, 91, 96)
- ctx.moveTo(103, 96)
- ctx.bezierCurveTo(100, 96, 99, 99, 99, 101)
- ctx.bezierCurveTo(99, 103, 100, 106, 103, 106)
- ctx.bezierCurveTo(106, 106, 107, 103, 107, 101)
- ctx.bezierCurveTo(107, 99, 106, 96, 103, 96)
- ctx.fill()
-
- // 右眼
- ctx.fillStyle = 'blue'
- ctx.beginPath()
- ctx.arc(101, 102, 2, 0, Math.PI * 2, true)
- ctx.fill()
- // 左眼
- ctx.beginPath()
- ctx.arc(89, 102, 2, 0, Math.PI * 2, true)
- ctx.fill()
-
- ctx.font = '18px bold 黑体'
- ctx.fillStyle = 'black'
- ctx.fillText('吃豆人', 180, 180)
-
- ctx.clearRect(150, 0, 100, 200)
-
- /**
- * 绘制圆角矩形的函数
- *
- * @param {*} ctx 画笔
- * @param {*} x x 坐标
- * @param {*} y y 坐标
- * @param {*} w 宽
- * @param {*} h 高
- * @param {*} r 半径
- */
- function _roundedRect(ctx, x, y, w, h, radius) {
- ctx.beginPath();
- ctx.moveTo(x, y + radius);
- ctx.lineTo(x, y + h - radius);
- ctx.quadraticCurveTo(x, y + h, x + radius, y + h);
- ctx.lineTo(x + w - radius, y + h);
- ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - radius);
- ctx.lineTo(x + w, y + radius);
- ctx.quadraticCurveTo(x + w, y, x + w - radius, y);
- ctx.lineTo(x + radius, y);
- ctx.quadraticCurveTo(x, y, x, y + radius);
- ctx.stroke();
- }
+ // 绘制小点
+ for (let i = 0; i < 7; i++) {
+ ctx.fillRect(52 + i * 16, 35, 4, 4);
}
+ // 绘制小点
+ for (let i = 0; i < 7; i++) {
+ ctx.fillRect(28, 52 + i * 16, 4, 4);
+ }
- useEffect(() => {
- bean()
- }, [])
+ // 绘制小点
+ for (let i = 0; i < 7; i++) {
+ ctx.fillRect(100, 52 + i * 16, 4, 4);
+ }
- return (
-
-
-
- )
-}
+ // 绘制小点
+ for (let i = 0; i < 8; i++) {
+ ctx.fillRect(44 + i * 16, 92, 4, 4);
+ }
+
+ // 绘制小点
+ for (let i = 0; i < 3; i++) {
+ ctx.fillRect(44 + i * 16, 148, 4, 4);
+ }
+
+ ctx.fillStyle = 'white';
+ ctx.beginPath();
+ ctx.moveTo(91, 96);
+ ctx.bezierCurveTo(88, 96, 87, 99, 87, 101);
+ ctx.bezierCurveTo(87, 103, 88, 106, 91, 106);
+ ctx.bezierCurveTo(94, 106, 95, 103, 95, 101);
+ ctx.bezierCurveTo(95, 99, 94, 96, 91, 96);
+ ctx.moveTo(103, 96);
+ ctx.bezierCurveTo(100, 96, 99, 99, 99, 101);
+ ctx.bezierCurveTo(99, 103, 100, 106, 103, 106);
+ ctx.bezierCurveTo(106, 106, 107, 103, 107, 101);
+ ctx.bezierCurveTo(107, 99, 106, 96, 103, 96);
+ ctx.fill();
+
+ // 右眼
+ ctx.fillStyle = 'blue';
+ ctx.beginPath();
+ ctx.arc(101, 102, 2, 0, Math.PI * 2, true);
+ ctx.fill();
+ // 左眼
+ ctx.beginPath();
+ ctx.arc(89, 102, 2, 0, Math.PI * 2, true);
+ ctx.fill();
+
+ ctx.font = '18px bold 黑体';
+ ctx.fillStyle = 'black';
+ ctx.fillText('吃豆人', 180, 180);
+
+ ctx.clearRect(150, 0, 100, 200);
+
+ /**
+ * 绘制圆角矩形的函数
+ *
+ * @param {*} ctx 画笔
+ * @param {*} x x 坐标
+ * @param {*} y y 坐标
+ * @param {*} w 宽
+ * @param {*} h 高
+ * @param {*} r 半径
+ */
+ function _roundedRect(ctx, x, y, w, h, radius) {
+ ctx.beginPath();
+ ctx.moveTo(x, y + radius);
+ ctx.lineTo(x, y + h - radius);
+ ctx.quadraticCurveTo(x, y + h, x + radius, y + h);
+ ctx.lineTo(x + w - radius, y + h);
+ ctx.quadraticCurveTo(x + w, y + h, x + w, y + h - radius);
+ ctx.lineTo(x + w, y + radius);
+ ctx.quadraticCurveTo(x + w, y, x + w - radius, y);
+ ctx.lineTo(x + radius, y);
+ ctx.quadraticCurveTo(x, y, x, y + radius);
+ ctx.stroke();
+ }
+ }
+
+ useEffect(() => {
+ bean();
+ }, []);
+
+ return (
+
+
+
+ );
+};
```
```js
-
-
-
```
-
diff --git a/docs/fea/canvas/color.md b/docs/fea/canvas/color.md
index 67a0052..69553a0 100644
--- a/docs/fea/canvas/color.md
+++ b/docs/fea/canvas/color.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 canvas
order: 2
+ path: /canvas
---
## 颜色
@@ -13,286 +14,290 @@ group:
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
- const canvasRef2 = useRef()
- const canvasRef3 = useRef()
- const canvasRef4 = useRef()
- const canvasRef5 = useRef()
- const canvasRef6 = useRef()
- const canvasRef7 = useRef()
- const canvasRef8 = useRef()
- const canvasRef9 = useRef()
- const canvasRef10 = useRef()
- const canvasRef11 = useRef()
- const canvasRef12 = useRef()
+ const canvasRef = useRef();
+ const canvasRef2 = useRef();
+ const canvasRef3 = useRef();
+ const canvasRef4 = useRef();
+ const canvasRef5 = useRef();
+ const canvasRef6 = useRef();
+ const canvasRef7 = useRef();
+ const canvasRef8 = useRef();
+ const canvasRef9 = useRef();
+ const canvasRef10 = useRef();
+ const canvasRef11 = useRef();
+ const canvasRef12 = useRef();
- function demo1() {
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ function demo1() {
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- for (let i = 0; i < 6; i++) {
- for (let j = 0; j < 6; j++) {
- ctx.fillStyle = `rgb(${Math.floor(255 - 42.5 * i)}, ${Math.floor(255 - 42.5 * j)}, 0)`
- ctx.fillRect(j * 25, i * 25, 25, 25)
- }
- }
+ for (let i = 0; i < 6; i++) {
+ for (let j = 0; j < 6; j++) {
+ ctx.fillStyle = `rgb(${Math.floor(255 - 42.5 * i)}, ${Math.floor(
+ 255 - 42.5 * j,
+ )}, 0)`;
+ ctx.fillRect(j * 25, i * 25, 25, 25);
+ }
+ }
+ }
+
+ function demo2() {
+ let canvas = canvasRef2.current;
+ let ctx = canvas.getContext('2d');
+
+ for (let i = 0; i < 6; i++) {
+ for (let j = 0; j < 6; j++) {
+ ctx.strokeStyle = `rgb(${Math.floor(255 - 42.5 * i)}, ${Math.floor(
+ 255 - 42.5 * j,
+ )}, 0)`;
+ ctx.beginPath();
+ ctx.arc(12.5 + j * 25, 12.5 + i * 25, 10, 0, Math.PI * 2, true);
+ ctx.stroke();
+ }
+ }
+ }
+
+ function demo3() {
+ let canvas = canvasRef3.current;
+ let ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = '#fd0';
+ ctx.fillRect(0, 0, 75, 75);
+ ctx.fillStyle = '#6c0';
+ ctx.fillRect(75, 0, 75, 75);
+ ctx.fillStyle = '#09f';
+ ctx.fillRect(0, 75, 75, 75);
+ ctx.fillStyle = '#f30';
+ ctx.fillRect(75, 75, 75, 75);
+
+ ctx.fillStyle = '#fff';
+ ctx.globalAlpha = 0.2;
+
+ for (let i = 0; i < 6; i++) {
+ ctx.beginPath();
+ ctx.arc(75, 75, 10 + 10 * i, 0, Math.PI * 2, true);
+ ctx.fill();
+ }
+ }
+
+ function demo4() {
+ let canvas = canvasRef4.current;
+ let ctx = canvas.getContext('2d');
+
+ ctx.fillStyle = 'rgb(255, 221, 0)';
+ ctx.fillRect(0, 0, 200, 50);
+ ctx.fillStyle = 'rgb(102, 204, 0)';
+ ctx.fillRect(0, 50, 200, 50);
+ ctx.fillStyle = 'rgb(0, 153, 255)';
+ ctx.fillRect(0, 100, 200, 50);
+ ctx.fillStyle = 'rgb(255, 51, 0)';
+ ctx.fillRect(0, 150, 200, 50);
+
+ for (let i = 0; i < 10; i++) {
+ ctx.fillStyle = `rgba(255, 255, 255, ${(i + 1) / 10})`;
+ for (let j = 0; j < 4; j++) {
+ ctx.fillRect(10 + 18 * i, 5 + j * 50, 18, 40);
+ }
+ }
+ }
+
+ function demo5() {
+ let canvas = canvasRef5.current;
+ let ctx = canvas.getContext('2d');
+
+ for (let i = 0; i < 10; i++) {
+ ctx.lineWidth = 1 + i;
+ ctx.beginPath();
+ ctx.moveTo(5.5 + i * 14, 5.5);
+ ctx.lineTo(5.5 + i * 14, 140.5);
+ ctx.stroke();
+ }
+ }
+
+ function demo6() {
+ let canvas = canvasRef6.current;
+ let ctx = canvas.getContext('2d');
+ let lineCap = ['butt', 'round', 'square'];
+
+ ctx.strokeStyle = '#09f';
+ ctx.beginPath();
+ ctx.moveTo(10, 20);
+ ctx.lineTo(140, 20);
+ ctx.moveTo(10, 130);
+ ctx.lineTo(140, 130);
+ ctx.stroke();
+
+ ctx.strokeStyle = 'black';
+ for (let i = 0; i < lineCap.length; i++) {
+ ctx.lineWidth = 15;
+ ctx.lineCap = lineCap[i];
+ ctx.beginPath();
+ ctx.moveTo(25 + i * 50, 20);
+ ctx.lineTo(25 + i * 50, 130);
+ ctx.stroke();
+ }
+ }
+
+ /**
+ * round 圆角线段
+ * bevel 不让线段超过最大
+ */
+ function demo7() {
+ let canvas = canvasRef7.current;
+ let ctx = canvas.getContext('2d');
+ let lineJoin = ['round', 'bevel', 'miter'];
+
+ ctx.lineWidth = 10;
+ for (let i = 0; i < lineJoin.length; i++) {
+ ctx.lineJoin = lineJoin[i];
+ ctx.beginPath();
+ ctx.moveTo(-5, 5 + i * 40);
+ ctx.lineTo(35, 45 + i * 40);
+ ctx.lineTo(75, 5 + i * 40);
+ ctx.lineTo(115, 45 + i * 40);
+ ctx.lineTo(155, 5 + i * 40);
+ ctx.stroke();
+ }
+ }
+
+ /**
+ * setLineDash 虚线交替样式
+ * lineDashOffset 偏移量
+ */
+ function demo8() {
+ let canvas = canvasRef8.current;
+ let ctx = canvas.getContext('2d');
+ let offset = 0;
+
+ function march() {
+ offset++;
+
+ if (offset > 16) {
+ offset = 0;
+ }
+ _draw();
+ setTimeout(march, 50);
}
- function demo2() {
- let canvas = canvasRef2.current
- let ctx = canvas.getContext('2d')
-
- for (let i = 0; i < 6; i++) {
- for (let j = 0; j < 6; j++) {
- ctx.strokeStyle = `rgb(${Math.floor(255 - 42.5 * i)}, ${Math.floor(255 - 42.5 * j)}, 0)`
- ctx.beginPath()
- ctx.arc(12.5 + j * 25, 12.5 + i * 25, 10, 0, Math.PI * 2, true)
- ctx.stroke()
- }
- }
+ function _draw() {
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.lineWidth = 2;
+ ctx.setLineDash([4, 2]);
+ ctx.lineDashOffset = -offset;
+ ctx.strokeRect(10, 10, 100, 100);
}
- function demo3() {
- let canvas = canvasRef3.current
- let ctx = canvas.getContext('2d')
+ march();
+ }
- ctx.fillStyle = '#fd0'
- ctx.fillRect(0, 0, 75,75)
- ctx.fillStyle = '#6c0'
- ctx.fillRect(75, 0, 75, 75)
- ctx.fillStyle = '#09f'
- ctx.fillRect(0, 75, 75, 75)
- ctx.fillStyle = '#f30'
- ctx.fillRect(75, 75, 75, 75)
+ function demo9() {
+ let canvas = canvasRef9.current;
+ let ctx = canvas.getContext('2d');
- ctx.fillStyle = '#fff'
- ctx.globalAlpha = 0.2
+ let lineargradient = ctx.createLinearGradient(0, 0, 0, 150);
+ lineargradient.addColorStop(0, '#00abeb');
+ lineargradient.addColorStop(0.5, '#fff');
+ lineargradient.addColorStop(0.5, '#26c000');
+ lineargradient.addColorStop(1, '#fff');
- for (let i = 0; i < 6; i++) {
- ctx.beginPath()
- ctx.arc(75, 75, 10 + 10 * i, 0, Math.PI * 2, true)
- ctx.fill()
- }
- }
+ let radialgradient = ctx.createLinearGradient(0, 50, 0, 95);
+ radialgradient.addColorStop(0.5, '#000');
+ radialgradient.addColorStop(1, 'rgba(0, 0, 0, 0');
- function demo4() {
- let canvas = canvasRef4.current
- let ctx = canvas.getContext('2d')
+ ctx.fillStyle = lineargradient;
+ ctx.strokeStyle = radialgradient;
- ctx.fillStyle = 'rgb(255, 221, 0)'
- ctx.fillRect(0, 0, 200, 50)
- ctx.fillStyle = 'rgb(102, 204, 0)'
- ctx.fillRect(0, 50, 200, 50)
- ctx.fillStyle = 'rgb(0, 153, 255)'
- ctx.fillRect(0, 100, 200, 50)
- ctx.fillStyle = 'rgb(255, 51, 0)'
- ctx.fillRect(0, 150, 200, 50)
+ ctx.fillRect(10, 10, 130, 130);
+ ctx.strokeRect(50, 50, 50, 50);
+ }
- for (let i = 0; i < 10; i++) {
- ctx.fillStyle = `rgba(255, 255, 255, ${(i + 1) / 10})`
- for (let j = 0; j < 4; j++) {
- ctx.fillRect(10 + 18 * i, 5 + j * 50, 18, 40)
- }
- }
- }
+ function demo10() {
+ let canvas = canvasRef10.current;
+ let ctx = canvas.getContext('2d');
- function demo5() {
- let canvas = canvasRef5.current
- let ctx = canvas.getContext('2d')
+ let radgrad = ctx.createRadialGradient(45, 50, 10, 52, 50, 30);
+ radgrad.addColorStop(0, '#a7d30c');
+ radgrad.addColorStop(0.9, '#019f62');
+ radgrad.addColorStop(1, 'rgba(1, 159, 98, 0');
- for (let i = 0; i < 10; i++) {
- ctx.lineWidth = 1 + i
- ctx.beginPath()
- ctx.moveTo(5.5 + i * 14, 5.5)
- ctx.lineTo(5.5 + i * 14, 140.5)
- ctx.stroke()
- }
- }
+ let radgrad2 = ctx.createRadialGradient(105, 105, 20, 112, 120, 50);
+ radgrad2.addColorStop(0, '#fff');
+ radgrad2.addColorStop(0.75, '#ff0188');
+ radgrad2.addColorStop(1, 'rgba(255, 1, 136, 0)');
- function demo6() {
- let canvas = canvasRef6.current
- let ctx = canvas.getContext('2d')
- let lineCap = ['butt', 'round', 'square']
+ let radgrad3 = ctx.createRadialGradient(0, 150, 50, 0, 140, 90);
+ radgrad3.addColorStop(0, '#f4f201');
+ radgrad3.addColorStop(0.8, '#00B5E2');
+ radgrad3.addColorStop(1, '#00B5E2');
- ctx.strokeStyle = '#09f'
- ctx.beginPath()
- ctx.moveTo(10, 20)
- ctx.lineTo(140, 20)
- ctx.moveTo(10, 130)
- ctx.lineTo(140, 130)
- ctx.stroke()
+ ctx.fillStyle = radgrad3;
+ ctx.fillRect(0, 0, 150, 150);
+ ctx.fillStyle = radgrad2;
+ ctx.fillRect(0, 0, 150, 150);
+ ctx.fillStyle = radgrad;
+ ctx.fillRect(0, 0, 150, 150);
+ }
- ctx.strokeStyle = 'black'
- for (let i = 0; i < lineCap.length; i++) {
- ctx.lineWidth = 15
- ctx.lineCap = lineCap[i]
- ctx.beginPath()
- ctx.moveTo(25 + i * 50, 20)
- ctx.lineTo(25 + i * 50, 130)
- ctx.stroke()
- }
- }
+ function demo11() {
+ let canvas = canvasRef11.current;
+ let ctx = canvas.getContext('2d');
- /**
- * round 圆角线段
- * bevel 不让线段超过最大
- */
- function demo7() {
- let canvas = canvasRef7.current
- let ctx = canvas.getContext('2d')
- let lineJoin = ['round', 'bevel', 'miter']
+ // 创建 img,作为图案
+ let img = new Image();
+ img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png';
- ctx.lineWidth = 10
- for (let i = 0; i < lineJoin.length; i++) {
- ctx.lineJoin = lineJoin[i]
- ctx.beginPath()
- ctx.moveTo(-5, 5 + i * 40)
- ctx.lineTo(35, 45 + i * 40)
- ctx.lineTo(75, 5 + i * 40)
- ctx.lineTo(115, 45 + i * 40)
- ctx.lineTo(155, 5 + i * 40)
- ctx.stroke()
- }
- }
+ img.onload = function () {
+ let ptrn = ctx.createPattern(img, 'repeat');
+ ctx.fillStyle = ptrn;
+ ctx.fillRect(0, 0, 150, 150);
+ };
+ }
- /**
- * setLineDash 虚线交替样式
- * lineDashOffset 偏移量
- */
- function demo8() {
- let canvas = canvasRef8.current
- let ctx = canvas.getContext('2d')
- let offset = 0
+ function demo12() {
+ let canvas = canvasRef12.current;
+ let ctx = canvas.getContext('2d');
- function march() {
- offset++
+ ctx.beginPath();
+ ctx.fillStyle = '#aaa';
+ ctx.arc(50, 50, 30, 0, Math.PI * 2, true);
+ ctx.arc(50, 50, 15, 0, Math.PI * 2, true);
+ ctx.fill('evenodd');
+ }
- if (offset > 16) {
- offset = 0
- }
- _draw()
- setTimeout(march, 50)
- }
+ useEffect(() => {
+ demo1();
+ demo2();
+ demo3();
+ demo4();
+ demo5();
+ demo6();
+ demo7();
+ demo8();
+ demo9();
+ demo10();
+ demo11();
+ demo12();
+ }, []);
- function _draw() {
- ctx.clearRect(0, 0, canvas.width, canvas.height)
- ctx.lineWidth = 2
- ctx.setLineDash([4, 2])
- ctx.lineDashOffset = -offset
- ctx.strokeRect(10, 10, 100, 100)
- }
-
- march()
- }
-
- function demo9() {
- let canvas = canvasRef9.current
- let ctx = canvas.getContext('2d')
-
- let lineargradient = ctx.createLinearGradient(0, 0, 0, 150)
- lineargradient.addColorStop(0, '#00abeb')
- lineargradient.addColorStop(0.5, '#fff')
- lineargradient.addColorStop(0.5, '#26c000')
- lineargradient.addColorStop(1, '#fff')
-
- let radialgradient = ctx.createLinearGradient(0, 50, 0, 95)
- radialgradient.addColorStop(0.5, '#000')
- radialgradient.addColorStop(1, 'rgba(0, 0, 0, 0')
-
- ctx.fillStyle = lineargradient
- ctx.strokeStyle = radialgradient
-
- ctx.fillRect(10, 10, 130, 130)
- ctx.strokeRect(50, 50, 50, 50)
- }
-
- function demo10() {
- let canvas = canvasRef10.current
- let ctx = canvas.getContext('2d')
-
- let radgrad = ctx.createRadialGradient(45, 50, 10, 52, 50, 30)
- radgrad.addColorStop(0, '#a7d30c')
- radgrad.addColorStop(0.9, '#019f62')
- radgrad.addColorStop(1, 'rgba(1, 159, 98, 0')
-
- let radgrad2 = ctx.createRadialGradient(105, 105, 20, 112, 120, 50)
- radgrad2.addColorStop(0, '#fff')
- radgrad2.addColorStop(0.75, '#ff0188')
- radgrad2.addColorStop(1, 'rgba(255, 1, 136, 0)')
-
- let radgrad3 = ctx.createRadialGradient(0, 150, 50, 0, 140, 90)
- radgrad3.addColorStop(0, '#f4f201')
- radgrad3.addColorStop(0.8, '#00B5E2')
- radgrad3.addColorStop(1, '#00B5E2')
-
- ctx.fillStyle = radgrad3
- ctx.fillRect(0, 0, 150, 150)
- ctx.fillStyle = radgrad2
- ctx.fillRect(0, 0, 150, 150)
- ctx.fillStyle = radgrad
- ctx.fillRect(0, 0, 150, 150)
- }
-
- function demo11() {
- let canvas = canvasRef11.current
- let ctx = canvas.getContext('2d')
-
- // 创建 img,作为图案
- let img = new Image()
- img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png'
-
- img.onload = function () {
- let ptrn = ctx.createPattern(img, 'repeat')
- ctx.fillStyle = ptrn
- ctx.fillRect(0, 0, 150, 150)
- }
- }
-
- function demo12() {
- let canvas = canvasRef12.current
- let ctx = canvas.getContext('2d')
-
- ctx.beginPath()
- ctx.fillStyle = '#aaa'
- ctx.arc(50, 50, 30, 0, Math.PI * 2, true)
- ctx.arc(50, 50, 15, 0, Math.PI * 2, true)
- ctx.fill('evenodd')
- }
-
- useEffect(() => {
- demo1()
- demo2()
- demo3()
- demo4()
- demo5()
- demo6()
- demo7()
- demo8()
- demo9()
- demo10()
- demo11()
- demo12()
- }, [])
-
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )
-}
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
```
```js
-```
\ No newline at end of file
+```
diff --git a/docs/fea/canvas/font.md b/docs/fea/canvas/font.md
index 08e339f..c0b8e12 100644
--- a/docs/fea/canvas/font.md
+++ b/docs/fea/canvas/font.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 canvas
order: 4
+ path: /canvas
---
## 文字
@@ -13,65 +14,63 @@ group:
import React, { useRef, useEffect } from 'react';
export default () => {
- const canvasRef = useRef()
- const canvasRef2 = useRef()
- const canvasRef3 = useRef()
+ const canvasRef = useRef();
+ const canvasRef2 = useRef();
+ const canvasRef3 = useRef();
- // 填充文本
- function demo1() {
- // 声明DOM
- let canvas = canvasRef.current
- let ctx = canvas.getContext('2d')
+ // 填充文本
+ function demo1() {
+ // 声明DOM
+ let canvas = canvasRef.current;
+ let ctx = canvas.getContext('2d');
- ctx.shadowOffsetY = 8
- ctx.shadowOffsetX = 8
- ctx.shadowBlur = 3
- ctx.shadowColor = '#ccc'
+ ctx.shadowOffsetY = 8;
+ ctx.shadowOffsetX = 8;
+ ctx.shadowBlur = 3;
+ ctx.shadowColor = '#ccc';
- ctx.font = '40px serif'
- ctx.fillText('1. 你是个智障!', 50, 50)
- }
+ ctx.font = '40px serif';
+ ctx.fillText('1. 你是个智障!', 50, 50);
+ }
- function demo2() {
- let canvas = canvasRef2.current
- let ctx = canvas.getContext('2d')
+ function demo2() {
+ let canvas = canvasRef2.current;
+ let ctx = canvas.getContext('2d');
- ctx.font = '48px serif'
- ctx.strokeText('2. hello world', 10, 50)
- }
+ ctx.font = '48px serif';
+ ctx.strokeText('2. hello world', 10, 50);
+ }
- function demo3() {
- let canvas = canvasRef3.current
- let ctx = canvas.getContext('2d')
+ function demo3() {
+ let canvas = canvasRef3.current;
+ let ctx = canvas.getContext('2d');
- ctx.font = '40px serif'
- ctx.textBaseline = 'top'
- ctx.textAlign = 'start'
- ctx.strokeText('hello world', 0, 100)
- }
+ ctx.font = '40px serif';
+ ctx.textBaseline = 'top';
+ ctx.textAlign = 'start';
+ ctx.strokeText('hello world', 0, 100);
+ }
- useEffect(() => {
- demo1()
- demo2()
- demo3()
- }, [])
+ useEffect(() => {
+ demo1();
+ demo2();
+ demo3();
+ }, []);
- return (
-
-
-
-
-
- )
-}
+ return (
+
+
+
+
+
+ );
+};
```
```ts
window.onload = function () {
- demo1()
- demo2()
- demo3()
-}
-
-
-```
\ No newline at end of file
+ demo1();
+ demo2();
+ demo3();
+};
+```
diff --git a/docs/fea/node/intro.md b/docs/fea/node/intro.md
index 4d4c074..bc68b94 100644
--- a/docs/fea/node/intro.md
+++ b/docs/fea/node/intro.md
@@ -8,73 +8,80 @@ group:
path: /node
---
-
# 💊 node
-基于 chrome 的 V8引擎 封装的一个JavaScript运行环境,事件驱动、非阻塞IO进程模型,它能让js代码运行在服务端。
+基于 chrome 的 V8 引擎 封装的一个 JavaScript 运行环境,事件驱动、非阻塞 IO 进程模型,它能让 js 代码运行在服务端。
对于前端工程师来说具有极大的意义,也让前端工程师离全栈工程师更近了一步。
-对标产品为基于 rust、Tokio 的deno(destroy node),deno 具有更高的效率,并且原生就支持 typescript
+对标产品为基于 rust、Tokio 的 deno(destroy node),deno 具有更高的效率,并且原生就支持 typescript
## 安装
-### 方法1
-#### 拉取nvm
- - wget -qO- [https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh](https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh) | bash
-#### 安装nvm
+### 方法 1
+
+#### 拉取 nvm
+
+
+
+ - curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
+
+ - sudo yum install -y nodejs
+
+#### 安装 nvm
+
```javascript
// 打开bash
source ~/.bash_profile
// 写入 node文件指向
-export NODE_HOME=/usr/local/tool/nodejs/node
+export NODE_HOME=/usr/local/tool/nodejs/node
export PATH=$NODE_HOME/bin:$PATH
```
- nvm install node(版本号)or nvm install stable
- 方案2
- curl --silent --location [https://rpm.nodesource.com/setup_11.x](https://rpm.nodesource.com/setup_11.x)| sudo bash -
-### 方法2
+### 方法 2
1. 第一步
-```
+
+```js
wget https://npm.taobao.org/mirrors/node/v12.16.1/node-v12.16.1-linux-x64.tar.gz
```
-
2. 第二步
+
```
tar -xvf node-v12.16.1-linux-x64.tar.gz
yum install gcc gcc-c++
```
-
3. 第三步
+
```
mv node-v12.16.1-linux-x64.tar.gz node
```
4. 第四步
+
```
ln -s /usr/local/bin/node/bin/node /usr/bin/node
ln -s /usr/local/bin/node/bin/npm /usr/bin/npm
ln -s /usr/local/bin/node/bin/npx /usr/bin/npx
```
-
### 安装 GIT
- - curl [https://setup.ius.io](https://setup.ius.io) | sh
- - yum install -y git2u
- - git --version
-
+- curl [https://setup.ius.io](https://setup.ius.io) | sh
+- yum install -y git2u
+- git --version
## cjs、esm、umd 的区别
-首先运行端的区别,cjs和esm只能运行在node端,而umd可以同时运行在node和浏览器端
+首先运行端的区别,cjs 和 esm 只能运行在 node 端,而 umd 可以同时运行在 node 和浏览器端
-1. cjs 即为 CommonJs, 属于早期的node规范,可以使用require进行引用,module.exports 导出。
-2. esm 即为 Es module,属于es6提出之后版本的新的规范,语法是可以用 import 引用,export default 导出。
-3. umd 即为 Universal Module Definition(通用模块定义),也就是最基本的可在浏览器和node端执行的 js 代码。
+1. cjs 即为 CommonJs, 属于早期的 node 规范,可以使用 require 进行引用,module.exports 导出。
+2. esm 即为 Es module,属于 es6 提出之后版本的新的规范,语法是可以用 import 引用,export default 导出。
+3. umd 即为 Universal Module Definition(通用模块定义),也就是最基本的可在浏览器和 node 端执行的 js 代码。
diff --git a/docs/fea/pattern/about.md b/docs/fea/pattern/about.md
index d1eea1d..325dba7 100644
--- a/docs/fea/pattern/about.md
+++ b/docs/fea/pattern/about.md
@@ -5,11 +5,12 @@ nav:
group:
title: 💊 设计模式
order: 1
+ path: /pattern
---
## 关于
-学习设计模式,是为了让你的代码减少亢余,能用健壮的代码去解决问题,提升可维护性与拓展性。
+学习设计模式,它是一种思维模式,目的是为了让代码减少亢余,能用比较结构化的代码去解决问题,提升可维护性与拓展性。
**想做靠谱开发,先学设计模式**
diff --git a/docs/fea/pattern/action.md b/docs/fea/pattern/action.md
index 5d61c20..0d8f579 100644
--- a/docs/fea/pattern/action.md
+++ b/docs/fea/pattern/action.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 设计模式
order: 6
+ path: /pattern
---
## 行为型
diff --git a/docs/fea/pattern/createType.md b/docs/fea/pattern/createType.md
index 6f3e6af..33003ed 100644
--- a/docs/fea/pattern/createType.md
+++ b/docs/fea/pattern/createType.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 设计模式
order: 2
+ path: /pattern
---
## 创建型
diff --git a/docs/fea/pattern/structure.md b/docs/fea/pattern/structure.md
index 87114de..4eee174 100644
--- a/docs/fea/pattern/structure.md
+++ b/docs/fea/pattern/structure.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 设计模式
order: 4
+ path: /pattern
---
## 结构型
@@ -15,7 +16,7 @@ group:
将一个类的接口转化为另外一个接口,以满足用户需求,使类之间接口不兼容问题通过适配器得以解决。
-案例:新来的大卫封装了个 **fetch** 请求库,但是公司以前的网络请求方法是基于 **XMLHttpRequest** 的,老板想大卫去改这已经写好的9999个接口的请求,大卫使用了适配器模式去兼容,如下:
+案例:新来的大卫封装了个 **fetch** 请求库,但是公司以前的网络请求方法是基于 **XMLHttpRequest** 的,老板想大卫去改这已经写好的 9999 个接口的请求,大卫使用了适配器模式去兼容,如下:
```js
// RequestUtil 请求库
@@ -81,7 +82,7 @@ function Ajax(type, url, data, success, failed){
// 发送post请求
xhr.send(data);
}
-
+
// 处理返回数据
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
@@ -136,20 +137,20 @@ Ajax('get', 'https://nicecoders.github.io', data, function(res){
```jsx
import React, { useRef, useState, useEffect } from 'react';
-import '@nicecode/css'
+import '@nicecode/css';
class Modal {
constructor(opt = {}) {
- const { dom } = opt
+ const { dom } = opt;
- this.dom = dom
+ this.dom = dom;
}
show() {
this.dom.innerHTML = '卧槽';
- this.dom.style.display = 'block'
- this.dom.style.width = '200px'
- this.dom.style.textAlign = 'center'
+ this.dom.style.display = 'block';
+ this.dom.style.width = '200px';
+ this.dom.style.textAlign = 'center';
}
hide() {
@@ -159,65 +160,81 @@ class Modal {
class DecoratorModal {
constructor(_oldModal) {
- this._oldModal = _oldModal
+ this._oldModal = _oldModal;
}
show() {
- this._oldModal.show()
+ this._oldModal.show();
- this._oldModal.dom.innerHTML = '添加背景+文字减淡+圆角'
- this._oldModal.dom.style.color = '#aaa'
- this._oldModal.dom.style.borderRadius = '5px'
+ this._oldModal.dom.innerHTML = '添加背景+文字减淡+圆角';
+ this._oldModal.dom.style.color = '#aaa';
+ this._oldModal.dom.style.borderRadius = '5px';
}
hide() {
- this._oldModal.hide()
+ this._oldModal.hide();
}
}
export default () => {
- const modalRef = useRef(null)
- const [modal, setModal] = useState(null)
+ const modalRef = useRef(null);
+ const [modal, setModal] = useState(null);
// 案例:原本有个按钮,新的需求要将按钮样式置灰,并且文案改为 快去登录
const openModal = () => {
- modal.show()
- }
+ modal.show();
+ };
const hideModal = () => {
- modal.hide()
- }
+ modal.hide();
+ };
const decoratorModal = () => {
- let dom = new DecoratorModal(modal)
+ let dom = new DecoratorModal(modal);
- setModal(dom)
- }
+ setModal(dom);
+ };
const normalModal = () => {
let dom = new Modal({
- dom: modalRef.current
- })
+ dom: modalRef.current,
+ });
- setModal(dom)
- }
+ setModal(dom);
+ };
useEffect(() => {
- normalModal()
- }, [])
+ normalModal();
+ }, []);
let style = {
margin: '0 6px',
- }
+ };
return (
-
-
-
-
-
+
+
+
+
+
- )
+ );
};
```
@@ -230,9 +247,9 @@ function funcDecorator(type) {
return function (target, name, descriptor) {
if (type === 'class') {
target.prototype.show = () => {
- console.log('装饰器处理后的类')
- }
- return target
+ console.log('装饰器处理后的类');
+ };
+ return target;
/**
* or
* return class NButton {
@@ -240,28 +257,29 @@ function funcDecorator(type) {
* console.log('装饰器处理后')
* }
* }
- **/
+ **/
} else if (type === 'function') {
- const old = descriptor.value
- descriptor.value = function(...arg) { // 注意这里需要保留原this作用域,不能使用箭头函数
- console.log('----装饰器装饰函数----')
+ const old = descriptor.value;
+ descriptor.value = function (...arg) {
+ // 注意这里需要保留原this作用域,不能使用箭头函数
+ console.log('----装饰器装饰函数----');
// 原函数
- return old.apply(this, arg)
- }
+ return old.apply(this, arg);
+ };
}
- }
+ };
}
// 通过装饰器改变原有的 show 方法
// @funcDecorator('class')
class Button {
show() {
- console.log('大卫的思想空间')
+ console.log('大卫的思想空间');
}
@funcDecorator('function')
mb() {
- console.log('我是sb')
+ console.log('我是sb');
}
}
@@ -271,15 +289,10 @@ export default () => {
// dom.show()
// dom.mb()
// console.log(dom)
- }, [])
-
- return (
-
- 进阶案例:控制台查看输出结果
-
- )
-}
+ }, []);
+ return 进阶案例:控制台查看输出结果
;
+};
```
### 代理模式
@@ -292,21 +305,21 @@ export default () => {
import React, { useRef, useEffect } from 'react';
// 普通私密信息
-const baseInfo = ['name', 'age', 'career']
+const baseInfo = ['name', 'age', 'career'];
// 最私密信息
-const privateInfo = ['avatar', 'phone']
+const privateInfo = ['avatar', 'phone'];
// 规定礼物的数据结构由type和value组成
const present = {
- type: '巧克力',
- value: 60,
-}
+ type: '巧克力',
+ value: 60,
+};
// 相亲男方
const user = {
- isValidated: true,
- isVIP: false,
-}
+ isValidated: true,
+ isVIP: false,
+};
// 相亲女方
const girl = {
@@ -330,53 +343,48 @@ const girl = {
bottomValue: 50,
// 记录最近一次收到的礼物
lastPresent: present,
-}
+};
// 掘金婚介所推出了小礼物功能
const JuejinLovers = new Proxy(girl, {
- get: function(girl, key) {
-
- if((baseInfo.indexOf(key) !== -1) && !user.isValidated) {
- alert('您还没有完成验证哦')
- return
+ get: function (girl, key) {
+ if (baseInfo.indexOf(key) !== -1 && !user.isValidated) {
+ alert('您还没有完成验证哦');
+ return;
}
// 此处我们认为只有验证过的用户才可以购买VIP
- if(user.isValidated && privateInfo.indexOf(key) !== -1 && !user.isVIP) {
- alert('只有VIP才可以查看该信息哦')
- return
+ if (user.isValidated && privateInfo.indexOf(key) !== -1 && !user.isVIP) {
+ alert('只有VIP才可以查看该信息哦');
+ return;
}
- return girl[key]
+ return girl[key];
},
- set: function(girl, key, val) {
-
+ set: function (girl, key, val) {
// 最近一次送来的礼物会尝试赋值给lastPresent字段
// 需要返回 boolean 判断是否赋值成功
- if(key === 'lastPresent') {
- if(val.value < girl.bottomValue) {
- alert('sorry,您的礼物被拒收了')
- return false
+ if (key === 'lastPresent') {
+ if (val.value < girl.bottomValue) {
+ alert('sorry,您的礼物被拒收了');
+ return false;
}
// 如果没有拒收,则赋值成功,同时并入presents数组
- girl.lastPresent = val
- girl.presents = [...girl.presents, val]
- return true
+ girl.lastPresent = val;
+ girl.presents = [...girl.presents, val];
+ return true;
}
- }
-})
+ },
+});
export default () => {
-
useEffect(() => {
- console.log(JuejinLovers.name)
- JuejinLovers.lastPresent = present
- console.log(JuejinLovers)
- }, [])
+ console.log(JuejinLovers.name);
+ JuejinLovers.lastPresent = present;
+ console.log(JuejinLovers);
+ }, []);
- return (
- hi
- )
-}
+ return hi
;
+};
```
diff --git a/docs/fea/webgl/Q&A.md b/docs/fea/webgl/Q&A.md
index 325fc9e..abe6963 100644
--- a/docs/fea/webgl/Q&A.md
+++ b/docs/fea/webgl/Q&A.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 webGL
order: 100
+ path: /webgl
---
# 常见问题
diff --git a/docs/fea/webgl/intro.md b/docs/fea/webgl/intro.md
index bc08037..634f101 100644
--- a/docs/fea/webgl/intro.md
+++ b/docs/fea/webgl/intro.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 webGL
order: 1
+ path: /webgl
---
# 基础
diff --git a/docs/fea/webgl/threeJS.md b/docs/fea/webgl/threeJS.md
index 4d2ab0b..70d5057 100644
--- a/docs/fea/webgl/threeJS.md
+++ b/docs/fea/webgl/threeJS.md
@@ -5,6 +5,7 @@ nav:
group:
title: 💊 webGL
order: 3
+ path: /webgl
---
# threeJS 入门
diff --git a/docs/fea/website/index.md b/docs/fea/website/index.md
index 755bf3b..9ec234a 100644
--- a/docs/fea/website/index.md
+++ b/docs/fea/website/index.md
@@ -8,7 +8,7 @@ group:
path: /website
---
-## 💊 学习文档
+# 💊 学习文档
### TS 学习
diff --git a/docs/interview/algorithms.md b/docs/interview/algorithms.md
new file mode 100644
index 0000000..0a89299
--- /dev/null
+++ b/docs/interview/algorithms.md
@@ -0,0 +1,12 @@
+---
+nav:
+ title: 面试
+ path: /interview
+group:
+ title: 💊 面试题库
+ order: 2
+---
+
+# 算法题
+
+参考链接:
diff --git a/docs/interview/facetoface.md b/docs/interview/facetoface.md
index 9d2f9c5..5b6c5c6 100644
--- a/docs/interview/facetoface.md
+++ b/docs/interview/facetoface.md
@@ -18,19 +18,14 @@ group:
举个例子:
---------------------------------
-面试官好,我叫dev,18年毕业于东华理工大学软件工程,从大四开始就一直从事前端开发的工作
+> 面试官好,我叫 XX,18 年毕业于 XXX 大学软件工程,从大四开始就一直从事前端开发的工作
+> 我比较擅长的是 react 全家桶,平时开发的话,打包工具的话对 webpack 比较熟悉,自己有从 0-1 大型项目的经验和能力,包括前端项目的自动构建脚本编写,项目服务器发布,基本的 node 接口服务开发。服务器 Nginx 的配置,负载均衡,域名服务器的配置,和使用 pm2 的去做项目的守护进程管理全链路开发。
+> 在上家公司是 XXXX 的项目负责人,主要职责是负责从 0-1 视频编辑器的开发和后期维护,还有及时响应客户需求。在此期间还基于 yapi 搭建了一套接口自动化管理系统,目的是为了高效对接后端接口质量(自动化测试)和解放手动编写接口的工作(通过后端 swagger 文档自动生成包含 ts 注释的接口),其它还负责公司的 UI 组件库的部分开发
+> 除了开发相关的工作,还有一定的作为 Owner 的项目管理经验:比如需求评审,UI\UX 交互评审,负责小组项目排期,成员之间的协作开发,监督成员之间的 codeReview,敏捷开发推动项目进度等。
+> 另外我有自己的博客,主要是用来记录在工作中的一些心得,和碰到的问题和解决方案。同时去记录一些学到的新的知识,并把它分享到 sf、csdn、juejin 这类的技术平台上。
+> 在 github 上....做这件事的原因是,我感觉开源还挺有成就感也挺有趣的
-我比较擅长的是 react 全家桶,平时开发的话,打包工具的话对 webpack 比较熟悉,自己有从0-1大型项目的经验和能力,包括前端项目的自动构建脚本编写,项目服务器发布,基本的node接口服务开发。服务器Nginx 的配置,负载均衡,域名服务器的配置,和使用 pm2 的去做项目的守护进程管理全链路开发。
-
-在上家公司是人工智能创意中心,视频编辑器的项目负责人,主要职责是负责从0-1视频编辑器的开发和后期维护,还有及时响应客户需求。在此期间还基于 yapi 搭建了一套接口自动化管理系统,目的是为了高效对接后端接口质量(自动化测试)和解放手动编写接口的工作(通过后端swagger文档自动生成包含ts注释的接口),其它还负责公司的UI组件库的部分开发
-
-除了开发相关的工作,还有一定的作为Owner的项目管理经验:比如需求评审,UI\UX交互评审,负责小组项目排期,成员之间的协作开发,监督成员之间的codeReview,敏捷开发推动项目进度等。
-
-另外我有自己的博客,主要是用来记录在工作中的一些心得,和碰到的问题和解决方案。同时去记录一些学到的新的知识,早期也发过一些文章再segmentfault和掘金上。
-在 github 上我还成立了一个自己的组织叫nicecode,主要是用来沉淀一些这些年工作中整合的一些能提升工作效率的方案,比如说:脚手架、git提交校验工具、敏感字过滤库,常见函数方法、还有开发过一款基于 vscode 的代码片段插件。前前后后写了10几个npm包了,做这件事的原因是,我感觉开源还挺有成就感也挺有趣的
-
---------------------------------
+> 目前在学习...
## 如何粗略判断公司是否靠谱
@@ -46,11 +41,17 @@ group:
很推荐大家在准备面试的过程中,挖掘出自己擅长的技术内容,然后在面试的过程中,寻找机会引导面试官提问你擅长的技术点。
+## 你最近碰到什么挑战?
+
+**我(最近的一个时间)在做(怎样的一个产品/程序),这个产品/程序的目的是(帮助用户完成什么事),其中有一个(什么模块),为了实现(什么功能),用到了(什么技术),但是(遇到了什么挑战/难点/bug),我通过(怎样的手段)定位问题所在,问题出现的原因是(简要的点到技术点的描述),我在(至少两个资料来源)上找到了参考,最后基于(怎样的决策标准)决定采用(何种解决方法),运用了(哪种技术),最后成功解决了问题/实现了功能,结果是这个产品/程序(对用户,系统,性能,可用性,资源等产生了何种正面的影响)。下一步,我认为我应该研究(何种更先进的方式),进一步(怎样让产品/程序做得更好)。**
+
+之前将视频编辑器从 1.0 迁移到 2.0,目的是引用 vue3 和抛弃之前的遗留问题,比如说依赖包的杂糅和重,当时在考虑做视频编辑器的架构,是想直接写成个大组件,通过 props 参数来控制编辑器的功能,后面从性能和易用性来考虑,觉得还是将整体插件化更好,所以将整体架构改成可插拔式。在开发的过程中又发现关于数据传递板块如果通过传统的 props 或者是 vuex 的形式传递,使用起来会非常不方便,所以将它改成发布订阅模式来调用,将整体的数据放在一个 protocol 空间中,再通过各个控制面板的调用去触发,反馈到视频渲染层的监听器与其它对应插件的监听器上。最后实际应用中确实使用起来非常丝滑。这个编辑器的整体架构也使性能上提升了很多。
+
### 常见问题答复
1. 你什么时候入职?
-在职的时候说:需要交接一下手续,大概1-2礼拜。
+在职的时候说:需要交接一下手续,大概 1-2 礼拜。
离职的时候说:确定录用的话,大概一周左右时间可以入职。
2. 为啥工作换的这么频繁?
@@ -64,9 +65,10 @@ group:
4. 为什么你觉得可以胜任这份工作?
从三个角度去展开:
-* 工作经历、项目背景与当前岗位的匹配度
-* 个人能力模型的匹配度
-* 突出过往的工作中取得的成绩,竞争力优势
+
+- 工作经历、项目背景与当前岗位的匹配度
+- 个人能力模型的匹配度
+- 突出过往的工作中取得的成绩,竞争力优势
5. 你的期望薪资是多少?
@@ -78,7 +80,7 @@ group:
7. 为啥没干多久就离职了?
-两个方面,一个方面是和当初说好的不一样,公司目前使用vue,但是会用 react 重启新项目,我认为做一件事专精很重要。另一方面,加班比较多,项目上线冲进度加班是正常且合理的,但是经常周末需要加班,晚上10-11点走,CTO 倒排压缩开发时长不是很合理,生活和工作太不平衡,我不是很能接受
+两个方面,一个方面是和当初说好的不一样,公司目前使用 vue,但是会用 react 重启新项目,我认为做一件事专精很重要。另一方面,加班比较多,项目上线冲进度加班是正常且合理的,但是经常周末需要加班,晚上 10-11 点走,CTO 倒排压缩开发时长不是很合理,生活和工作太不平衡,我不是很能接受
## 谈钱
@@ -92,3 +94,5 @@ group:
## 话术技巧参考
+
+
diff --git a/docs/interview/img/hooks.png b/docs/interview/img/hooks.png
new file mode 100644
index 0000000000000000000000000000000000000000..9dd3688956c5d1643b9ae5b00ff075d1258a7ea3
GIT binary patch
literal 1470174
zcmaHTWmH^E)^2cu1PM+E5G=SuaCdi?pusITG{N27A!uWbH|}m7oW`Bt?shZx-gn-a
zZ_PJ9&Z$$?XH~7L+VbpY*XeL&MJaR?B9u38-k{4!i>tnQgJkjM4g7Cp#6K-vSb4gC
z3K$nvDbY7o6Cd{fRK(4-Wh@jF-q8JdMt%bmYV`*GAFuqmi2ht}-oWL-yn*{u!u+Ex
z5B9HLku37y{(6T0{f`%~ne;5*yb*pQBQB!u0dv&unfYNpd6iJ3*&$g&hyG0f4wcHm
zNzF5Vqb2`~$BWyGrNu|^Ok+`sxD$-O=y9^#P7Y7!S~N;tHMW@x%#t<_t^
z7Kp&9Cj_cpXI_H<>n}`(i46b07H8}t!l8Sud;&)8UKFFRkGfwBZ{wozPj#o?zj{yK
z3|QiVm+e4bEKJ>FJAvn^G5F7)Zp}993MJ1
z?4P!Eu8A03l6NjBzu@@dFAe=ULs4ZNY-ua2k3Y@+bUzn5h_HK0rKvxOh68p#&g
zf9(ZOjEobJuV*ro+n?`F?BwKHm@jbdsv^JC6x4
zqrYL!@jchth-1F#*E#h~eVo1q9S(3)S{MNUld0$^oU{6}tsTi=h&586j-Hx;)cGPXi%4WO8vk{@=HgC?(yJa-)vxM_Hg
zU;&!dKyd!$K{M>M$?E~`eZ0v_s2o>+`l{W5uJLrE;+y^c>Db-x
zvF`L@*}Zvp>6YxohZNHzl?RY&vl?0>PTC;=d&)L=>O2lU6w$lL3?wDPZ8tjSL6Wu!JCIiLn^}gat-S(=rxBiUuNU?
z5`oNd(D~`*9>35DxJ{@Zx=rSrzcFJ5Aoq*x5ae@wENbe{FS0p8*^AifzwUqTKlg#C
zJ@=5hqmiH5In{9Ea~GO=Iy`6EZ#i___AKqyG26=^oqk{jblRPMz`Zo%+sx!0xSa=k
zgXBZc71vg0YRgYg0IN2F9Wer
zx9h}WHxt}_-e(ia?U%v-*obV0CoJYC;1lutpQNoIk+GLBW@~=l|Ed&sRai}Oh#hiE
z*uM1Av$MQ3n&m~#jWutx>Gs`Q+vOiBPcVZFwd!lM8EVCUjo?p7rZ>tSsV#Oa-B4yn
zJW|<3mK1V*k(v%iGhosJV&p(Db|B}i5QbzjU+9u;%kGY%U@Nn!&!MeLqW7Ig;K8iP
zWgL2wi`=0zGAJ=*AGj3=pB#XKPC_0;6Hmw;oi}Hy`6p7aXjBj()w7j
zd6#XS3mxyPR~2SOAW;
zYd$UQ>5N
z!h~URLx^)u_1`xKNT%$89Qm?(&Wjh?VFB7wH<{!cMc5d^2p^)##a*K!ex?wiHKl8A
z)@Q1l99Q5XTA^eEuh?5gdr_1pjp{V(`o5^2&Wns1)@q14(E^8P;uh_3YQ|oW
z4{{=lj}vpq2j1q!^K0MVNqp&WsUV01d)zxW$Zsj877bs>+x~4Q&N@C}_8mR)vQL8M
z$>K8WK|JSE`FwK+a+Uxdp*383tha3do>Pe^j{mfF>(63&+P!{>*Uh&$q*Ch3dPhb=
zBbze!&;UvKtli7qrq5Vm2{rm@f|#WT(wB4O%qmtX&B&mvqM>C`5Tliw(VE36lG
zuxoJxTzNCi5}`=~g@+t8h9zo4^ZN|()m!HZT$xJbdim@cffqW$T(Vzet0%~}Kpz^DrGD9-howtLz6Fm)ohoQZ9*daZ)dEVyO;y6@LH1WY
z{o7sN)eO_btQ6%nGx?9MAIdCF>9Xwh4D@am7yiYwgo==bK}iw!JVrVRVaCT=caP>d
z35qS(uU${2voQX%g$CHd8{W7tpIf#aA$q!%HPKKlx0Ad{m;mK(MC@MpP9l0QDxg4v
z&8%O58VW*DmM|9%HKO?~8J0HcwKfx(d+zw7jB6J9C`+
z5yj3i7gk4*&W0-E*`s6fn?Fs;NcR?ftyqBc_99
zQD}@eNA6q}ydPJ;m3n{flOf1Wkg`yNj+sD;@tT4rg38CpDZ9O+`{zb(*9(o%kK8u{
zll}i6JdzUmlUewE>)Y~NgM~r=)r0(u2OebnTcH1^oVK|mxAm{7G>Js`PTpGbCl?+i
z#6E83Z5zG_tY|LlW$lhU#rd_zwi{9Ls^lxu#1)!OBQukcW`^slU-RZfk*N>HmA)i;0py!frAF;HywaE_RU7CMlQ{ZG^rFUvcm@(J`hH@tm;a)hy1s_V{PR-!-
z;o<9*G0h*IyPvqTE~>gMd6lAUXm=OwX$BBKk^Qd#^tK=oW>
zz2w}S(V&-IF>AX6jA-_4*u9VX+RX9HN_nYoqSk+mCh8%dixh<(aBq!!M~<9RO?
ze2B*HvT>(-U{+iO<=z)B5R
zh;st*Z)N;9aM#sJ76)2-|237#9X-eIDint_DEChI;>Iy@`vnVG=eGotpW@iT`}_dw
zi|7inyP@xy<0W!W%!O~Ngqc#f6MEQY-TN3f4W9wxF#4FT$5{sLhqrR+k38`
z%oSo=RqtEU3J>vT{0;Irk}>reB8Y0-MqUms^9_a|*kzM3oR;J?<)z9?cEfU0FqgnN
zmGlG@f*g*_nAEs3)S($S%@AA0c$X$w-Hnx%?1~kui+1@nLh9{p4>q}H?}san_(JRg
zJw3*p2AFOyI43@1q45^IrMSWs+sH?`9fgO^O~a(tI1p}_o>OgX!mpS|!~{2<1HmM2Wi
zp!ej05}pj2_s1_)~=Jp&eGt4q(vCXsFTS}8+g87zkjApX
z(It4z1rob#McMJsjT54P7iE29<Nk{|sWkJIV~n?~d8`?vNYU7)8{=V*L%ST1=F@1LEqZqJsLXb`A-2R2Apc2Y+Z!**}dmvs%Ce?9fivY|CFWPECVU3UD?7cm`}sDt{!-~P7vVpCHn*3d1H-h*X0qK(!gEB7C_(b2=(xz{BG7Qp
zk0=bnd?u(i*hIhrJ1r5;Dct7lQkPZLXQqT$6Y`iLL^N35SL=*^o5G@NK-p#|2Pv|P
z?x&>Od-;jqjFq*P9kbGy9fO14UU^Qsv+TW8Ly8dX@$IkS|6NMX0Oac}&*L`kzF4S1
zHSdSS-VW&c!m+8FOsGiDFp}@dPs+7xhRvLN#0&OzbF}hzj^yNIiBc#0)FMT(Plozr
zg+Yg}5Jjhmiv9@4XZG{_ByMua)H%t@MAfEI7f)(VZLQB-HrJ|+b?wQ=N4AzrS!x@)
zp!5TR9r_jJ8r{INB%C8*23a#%ZP^KX2Zxd^&ZKJW(Rc2OMs>58Yva_i5a-4vn+vqX
z&1$pb{(gzM(5L#w3T}=ssozGZGS=znbbR=++kw;!RXIc>i-@xNGLXnfz$fKYdgP^G
zGY(3+-0j1BkU3kE#vdV_Rc+~f7rtoakT+#u8Tj&r*5#Vsu1XHG^Rr>5G3-6Pj6i{q
z%?)i`rfFAbA<^xFS6nu~07Ow~LIyz~fAlWTV*s6CO}-Q)NB7O9$53Ctc(D!mItL0~
zPl-w%<1%$BpZrPMeiZh7!Y-*nVc_=yW%0F@2Ho5wqu5OV9A(pi(Q3%i)fEHQvyOwa=1;7P96~2N%8O!I@g^9~4qm
zai_yjLwHazn5QrqYgE5R$4eop()1xqM5|E1ucT<-FsbTe5;)xzj{{nShhF(RnNCq-
zw<1a3uGN=zW8Ux>?wbIcdJorfD}VnPt>CxJf0hkQR(WDR$)iyf0ZG
zi+FoWjZASh`qL*LN$%e7CkGL{ptuCBRJfVU4-||wx6<}RV^wAK?m=s%(pD{Ec;-rMj_`Fqug$2
zuxAzI-AbZfsj%3p(NShBF>J-CuFtkCbv&<$+ruVj6$k>6TUgz%=Ox=+_}D-)8k^)u
z*#_K2cy}&Q4>~85M^&XX{GxynmGn!t7yiHcsrniotcMy9^;UN7i80GcEQ`&H5$#Du
z@%&T}u;;#yT=UAR<|OhtV`AjR;6gZoLGzf+MY8OA*-3TNCEQR>f>rP8c#;(xGd=<7
zNiQC~vo5Lz=lMe(g}B;u-e#Mjoxtbbqrk^M`tc$6CvT3huvTq*`-(Uh1gPcB*%Ukk*I);%EYFy3%ax>cf98+X&?4$xrNHY$hX+wa|}_iHqF#U
zaL1&QO|bOM?jVVy;)_@1V0m%GWS8aWYcXgIN}B6|w0l}%fbV^Ob2J)h%B(mj`0wWD
z@0y`--kHI&z+HgQ#!2|R53}ZG|Ee72!hk8V1}sFXml!9054r{F7>S9Etz)H=KkO|_
z;WRi2;4MT|&!UIjpdzSi5ZNx}ALaC+C}jg$mO(ZVVck2@@?npKzpRd)tO*5Fi~A0<
zI|m;Ua9W|S$>1X#DwbWhklp#p+iBR;90cyylhK07T{Afk%BskS9^)e6!VITT)YMWk
z%F0AEpd(?c>qspDWF3S|DhrKg4IJm0wq{y!4Q8UdIt>-m!DtFFH_dCZ36p!W4>#nR
z4hwQeRfJjyJua3dFd{nsSsD^38sl+$cmB44K32xHAz2?RX$G~R=UdZB&31l%eBNiq
z_?_OastZ-~%Z8O6m8Y_PhV{&~oo~vv32yfHn4#)VCZOS9)VdjbiO@;=&5%}(89J%L#
zu2q!L2mNdLX}P>nW}$#0r8H;(&4K2Uhf|QyR%=@(Dr_o0s@M0_$!?0
zg1q%t9(&2Mxa2f-@?V$QDqZOG(Wxz}PDG)gwGyrgF|1vhdiM0zA61}7H@d-2Ct6+A
zN;7B9&?IQWEF~(}BFGU#gS@!Dhil6|84cHrGQ3=?MrW1eq~@g4XtA%&Yx4iz-Xol?
zV7Z@|6A7z{qW;N^>1*UUPo_>rlt&CLB@_Sm6-JPvbuA
z_&x>T4gH~@eQ7(WI}$m>u!C^=#!Ud3&k1e(7>AvH9DK$kj^R{QScbrpq7h$J08@Y^yp#gDeR@?9MQi>fAvM9Z
zeP!i)hZVZo6V3x-h37#XI)A6%DYB3hCzdCj%_x=6#~HJR0jt)Pp-1Thv%{Y;gXlRz
zc|vhr>{Az9M~D0flMbp#ni3_zC~h)?N+8`W?T(IEKHXPT*Nky8XJ(ZyqA;VP5F6qI
z@bqM?>L$S=R8RlA!i;iB*$=97mW~|Utr7seRTP-lQ+Evo7_7FUU!{;kxvm%|mUbY-
zs*|x*Au2CtFRQ&K%)+g_s40Wq){W4N!H|pkc8>Pi0tCW@XCWmCGs5k=L@2!e{OdO51ETVQqgzP_k1gK~wj+4rn+Dhe{`^AbT3
zHJRr2ze2AN*l`>ATKQyr^43PdwOs?GzxLj`$KEdq?wwl4l)tdNEA$@I+%vatygUkB
za{%{%w4VSSO76=q47#*85KzS5I>3zZkBEPOJsS-WRocTc)kKGf&|jUn;br5qlcG`E
zoIsuuRk7zhf+GR+r%AUI-+}K{`=m~x+@tbd0nXbBo*W(2G(q%%$oaV&9rXvG?ES^|
z`IeankqoeBrr#gS7rV@U%ciR+LRg9E?)GYNPeljq888A<8wtY`cM+_B-U-koHX=WGql0JZeUi
z%N*W6Q8XWsfZd$FF7bkvnaNMGnxzloYCp%f)$e(4+}D$BJqotRGH&*1H3PVHar#^gELSZV$n60lmrvv79xA3S*^~3G|?(snvk$H%+0LH#Z;
zR^Be`aF?E+;;+Hd-yKBPQwX%0HAg1WAgrP=YBCPOL|W1!N7ua@Xu0v6o>+|EiF9y}
zY?WYjNRtW=3YbaFEot`lpB;U~YKPJvzCcj81M3B33PBz-=O8ef}$Oo5x384xl%`U_)2C-uB)cab%5)4laFYZt>bxp5|z_!RX3z7W@g=|q~?
zI=|<6Au3b7ouhYFhHkev(yuNVpOB(quhJyTD1kv0nP$KRX}t0lSO1@jnyMZ{+8W1Y
ztI0vvA8qQJ2%Nrt-7bT#yJb?~5z|YkMqoW8c=lMf)MGdE_9hndp*JusEGNa+ku+@i
zMsGTni73_Mjqsv8cK_v`o;It5*4h5faje~?pEhcDsUIB)QPMy(%E5kBX{%`eyTRdY!4d2Z6B+x(0H2?UPy!%iqb-oa`W9a2!
ze@(4yQ}94~wkDy5{vb{E;`sQw_Srs`?9lCkMEkYD&|!;Ed7o~$HQp86N;_M5D_uI5
ziR(jhyhL_`kAL$(HnQVYmh0u_mHi}YajUAaBuceprBTa!Z7QQ5a*^C|K;MN_fbrE5
zNi@-$xlYFIX*=L%l(y*HEj4NQvrOUxcCBYkh6qzebd>RJa)j29st;uy&wiZBguN!W
z%pm_Dm~BrmsU{B4Bs|4_<vT$}Hmy?S2Ky+s798-p^P7z3s{+tR@p+|0N$DJFYu=t+Y3p4MV`%Q9Gv}SXDMu7w
zO0n_lAdQ5vz*kONqpoh6)74U=oa>$-E!TV=bGa62
z3@2plQsa|Z`5idnmw(N?O_>c)MXpmS5!ZKEqYK?f{rW)>n?nC1dacXQ6--A%tTfz8
zfPTZrv+HXFyPVBX-h7O`C~&UtOFup`iR7474zx<1kJHCIf=KY?ZtLg|`ZvElSy8gq
z3%5`1dkCUC+G|UksswPS8L7Il8d1KcenOGiE<{|dVCj4~>dNw$Tkfo0N!Vik5J~zM
z+7c!^LxB|;>wq18^dyUw@*ZCIEGj2Z#P%SN(Um5Wre#wQ3&&_&t+R`+$wbz!0xO0E
z{S2u!D-{2UGD_Hq??Xvuc}Y7!PpeBtp;I14)=SaV(v`awsPFrh7tMfrab({Cy+u79<
z!-&reQGSD8*VL>@q71@K9#5`aau{jp2^mFfbj>JK6%GqFY_c&QdD{EGjrf{y1xMvL
zpCVJ85vqU;k#w!T&iXs1RJeY)0lm9%9aue{{~
zIZ}6joCqxyIufFMsrynog+GNZ;OU&@*w_K04VE8GRPXF>RXMWTx$(BXylJ&tZSNa3
zLH&ze`*&{zc#FJj;PTk6%`7C814>Km48BCvhMc|sP19Ulb%1~(JB?@*SEXsv=qC`s
zz#kZtmA@YJn^OC6HIM`uN`eFOhE7fzsumU7>SKD&MJbqlw4NM>$G(s)Vl3P;C*|BG
z5`smMKPYXK##${4p5Hqjq9xp1JVb1bR)8Hy
z79}q#^*8m>H&biIlHn`MR5JW=I1)2-rm5r7rz`5v-yV8&S@v8~x;vECwKio~9BZ&g
zOXUuu)!sfVPU%oMjtpD*Qg8mso3L>(MeWfkI)h(}f^2*Nl$4jlST6#w$!yg+8&@l-w;u-j^@MI}?379HAhZMpT=w2`5yJ0sVo~vdVc^i0`YX^SzyJ>AI{$hCa2Mrnh
zQyh#a|0v=Me6fM*%}N+FOFirTtc3vv1r=w?RKU9V5)vCTR~q4>_st!Z%{Gb~&UXG!XOL|*gH`kdvP4bI9tmfVR=-=A*s3$9hH&TrvUM9#&GPcoL
zzmLTmx%3FSB<)2f76%a!fwboG?As>R@A4US7B>wCnS`uA@1x)zf4I|-Ze%9I3`oK%_lb^hZn7BRJ(A>&;$
z#o5Kf!W#3(Ua+Gcy=Kqp#U||3Q38e;1E(R)9fd{3VKh)nqXq2O_gqR(ey@KkH?rzi
z4Y9;Xm^F5lBNfRY%p1QhW;M)Ds+>W_q>(s9r`$D5cw}2F?B`rC$c-9(N_|WL(Ch_M
z<(#Ge3OQyvZyj^&7{j|uP*y2s@nXv=l8l3tWn>G>Dk|5=uAYdXP2gMH{xqaJSnGF|
zT$5>tQnFCnjCrw;J6KH6^awl9fNh){8Ku`5yt$C=!N{GsMxQqeU$D)et7O$&=F1Aa
z3U*9^+BKAy{-A<8ciOnrc9=n4wp=zd$uv;KvynO0{6Ji{?N0bh2p(xB!A^8Q_DhB?
zVJbSOA<(}SIzBNUD9&W0uW%M#alVvRg|FJCR-nmzu-4L1pOxYkvmRJSZFc-o7JBKz
zmT*lTrLvwOVt1SJt!iU%s*`H7n31cfE)&8{QU@Rmeq)kV`-`(byU~AG=~Le{2@iTs
zRX+x&8m~Mr2m62wEV2F?X%rR>nd5@J@KjmX+^t$+k07MuZd2ugkG5W!An)fKngg7V
zJKXNUaAHZDX=`|v06%};gdIk%3QfCrnaOeaJ0>Uf?93_M=?Uc76U3J~rqj~C+u|+X
zjsDxgY*V0N$`|V4p}OZ|7E}Dc0_dloSjZ+f0@;A%46ytfvG?6kf~8g*FJgG%fxH^L
z4YG}}j_K@7d-10^V?D72nXWQnjeF1TPaE5PS2U@#)=uHgg&FE>Y_AN?$LzY1Xx`qpbtmrz_-L(CFq3i79x;TT(!NO+kR1}#6O<5K6UDFcSvYOhd5iBHpI}>Q
zEsg!5rrtxXTKU=oD*|B*dKXfZxvMn7`x~bGtLk<=h6s10m>Xoip7x*M
zJ|)Tld>CmD@eXYQyT+w05UWa*axG#>g(h;&&L43jCUMLZ-ZXd5BNm@3rvSn3!r2Rt
z^=e-$-^GWl<@G-JzUGM?7$-$xh7y;u(-sCPnJ5a8QEMfOk1=UhwUWP}%@nWD9{L`p
zDk`td9Xv3Rsgt}RZDqjvGMMfXNGcXwMU|mD?)C|dq&LkASZ2?C<+)xy>0W@*&w7yA
z^t0p0Cu9>Zcl^a4kb(lUOW`B?kb)T1nq!CcW|f-C8C_@uePoIlc8Ln^+Wfo5WrEtESb;nB4S6>cB%~JE}~!*q9D`vy3*il8>rGd
z%FfvcNjG<3Lxf);EHEv9)qssTA@@P{Dzl>N0bBK^OlZK;1X!j^$K3#ya^&Bd^DFF(
zriLcTtecCvEE4d}klg
zHMK!pLcH|M+*F)Tu4~9TtZN;95F4`M{Vv^ZY)Fqh@8l*gyTi)qe|uA*WTPx(<^h~o
z#r|r3Hu|hbl2ncENE(d@#n1K2L0$rV6rj3Xkx-Qt^7IKHJw$yH<%_HLhHh*aVslDQ
z(P76egXm+(TC*b@*2?Lpq(S7%VBWH5&yQP*EJdAd#;~c4PwjFb(#})Et@OWBB1XLb
z0JEVEKM*5HqveLxWvW^yUEFl^kTM_Vnr0kFx!*1ba>{VLI8YZBcE?Q-aP~)F`4Xwk
zF-)dSzaepnE}I}$&!)|0)!fZe9)3p~3K5
zQsU95)L@}1)I2`m01xhT+ap83(@T*k$N6T`;a&LhRx$#{;OGSzUsGqGf9u!-!M0Ki
zsLPf{Pb?<}Q5;Qi6xtrTggHnMNl+#irFP^!weQG`n#6cut1id*Q_G=N%1D2bDL$8@
zvwixj{*qzRf$bQXb+q%gzmD$hS^M}WOSWQ7T^P&`AMPahi^R&
z_IXeJaaCoC{nGYv7bTO6!yf@du))87O@0%lJhGQnD%5pnp^S)667|LVVwF=Id6iWz
zIB*$E}S&+mfm}rkx4qr`SxIXl?R3J7Zyt
zn1C?XZB45U?GuK$Gta7=lU%ktD{Q^FOUJ{t`s(x;AhU>X0d_EWA)R+Ah*ajrw+9%4
zcOsXxAUNVD<(8Y$|1*UBe@6YR_fJ}Kwk4M-+Tf5nH|lU}X$?E1OkOR+Bnc!oBo(;w
z%)euLu%PC=ql-B5I8Lnzaxj;=^@bv02#%esb;d&c6Xc7}>@f8^m}+)&i-?L{Y7KQT
zt}jr8FyD6Q8ayH2(Q(<&hMuLu*G@A~u9!s~;J~`T3H5S8>$&8X?%YG*P0Ec8EJF+1
zR)RPD*(O*K@OVwA>R;vLOuR4f58j_T|BA#aW!?Jd;D1Y)$%4TsA&r*Esz4uT|1p{9ZE!5VpfXBPY
z#@fojk6;}deA~3h8RSz{B#G+2dO;cqjN)R!BBn}fow|Wpy_sT!CKPd-z$5$l=klX{
z!t^6N_+znkJ$w(xa0og~x3$j1jT_lZE9N%lI0~}c`Qy_|?n}65+sMns9;DW$4?WzL
z3ZWMM_>Vm)Mn%)lg!-zI2zi{bJgx^~+yTN8(&X)DR!QP(ACC4F+#Z4$ytdGX?$HMd
z9pTQAOmS&~aUfi*+gs<+^)~4aQ#)gYKi4~
zoOcQu^jOqR#R=chzNQj~iHn=~+_H{MkS%{yle(&d2r9YCamnzQW*DOvA)q1_kYzhX
zQ&D`bWHc#DNMh0|ATD5+@DQy9daSIjc54guEF2hb@6x(Ridl#0VzokrCQ1je>=DtT^okEFKKh}wTn9B>dL45faMVjpJU
zt}7uZNZp%Rp(>kA;W}7yYQmxq4`Y0^D`nw
zf@i>!z1B(XkV#(k*xjYk*S(#S=1rno2VTH!#@)xiz~8@z;ZK;zI5})uo&C-Wdo2SE
z74a}9S~C#>6cR_n`#Q21-iqsuW~uNQuRz0!0)BqV(b-8XT2lrLcQwd9IkoPX6jS#%q!Mf!WUgLIfl`Zr%<~09^@VZ2`Mk*&K1su
z%;9I<)%dU>WhQ!8OKdVE>Yx1IN!}1c9&$4KBg3LETKXwZLrhpi}j`a;zZhN}bs~#&`?p)MS<0<$f^M{Y|Hs#pol|
z+V0gey>>HA;QMwOORzjLlH3}qlL5wiVM`x_=|QTiN=L7%Gv}eJO{22?yd<$T*V--;
zl&36gG>*5QaNQd9{vHq*_BB1Jif<|5YV5tXtm@&C8c#)MRcm|l6W@cv2lpz&k7SZ*
zMV79#@2RUE_Nm9jP_Y}pV&3rZ(gEeG3MO#7+N9G6eNX#p>JtfdSEK?QD690=2u7QA
zEsE)v&ba4pUJhVSfYziWi4e4Q565^iCNqZeb8xO>HoiGs7(Q+U_=k`bhHB=ii
zkVl8PzJdbpE|k_Vj61?oHigBv!QQ79PUsYPTEPlM(f)
zdO<`iqA{*m^&}nEy=O?bPa+OuaSA*JqV74K_%tqkS9t}U0wuX3^SN$Ju3#7YtlewD
zhqzieY4z#OZvVZ-x`q@K}A(9tnLp#^Vmmr`{UmoO|cYcCrb?Ut8(Ge+O%SJ1YJxjW5lFP1%PO
zRYK!0H)A;qppn$%C%Yi514b1YO?zj&IGz<9pFC}&BA$+MZ{0$eh+|3IN{7$a&
zHYIh2mw!QwN=}pQiTt;bTIPd?{-BY88V&ALMT187?boh08$dt{Ic8-;OZYT`EEiS?
zA~crlx@tIpOGgp8Q3{GeoB61I_?{>pvY#whXp5oYE
zaajkEsyR%UBuaYEm={L3VXz4?;t^OmFoxie$Zv!|D3bH5-Y6nv#S76i>)uP6Nv;pZ
zl^nL(SAW`cbe~l8Hh&gUG*3;*YThk+Ssxj^L;RL}$*S~Wi=>k>v7j={Y~dC~GBFTv
z#X66FIHQiumklnf?>NmH@!1NSSevOrUt{ud>3A88NKLW$
zVWV|=@2lpQL7hQ&s(k|*W5f9F>xP|*T_|B8=)hd&gp~@E5(cA-xrlhit=z_|#6fEY
zG&)3|(#PPMdUSDP9fE>rH=W
zT$Ow>)+*!?+*kqh+}f<3n)-NKW|idFh2FM!Cmq|8_yetCe7Vf0H4AqnYivl>q7C+T
zZiF5)93Y+TXPY=BMy-B3M%y-3ElVdhii7!orQp{EB>!>X-O3pyu-2oklT(qCp7J#c
zR$n=^M;C{fKy@ydr1s4hfxxH&ri0mFNo=6=1Q6XDfl%hVUif#qWV*?OxTv|@QjNxM
zVaPlOvFh~4M_Q!M8A;8zI-kF@Ua+(b;EQjYi@z6b6QyKgotlF6-y=@v{*4ia+$QPo
zEelVD$Q!bO*>D8ku!ALTk6%EdV!_qf5X`YljGn86LxQqcr}hb-G+WH<=M7a_HCXQZ
zjyO-E0uZ}%?+jv
zrLU_Pu0AZRY!3OoEFyvuRCr+!=pXX=hVG5&p%*4>+ECX9n~f>uDd~~fVBsEN-Xf=O
zEYL|lQ!T%9b?=h0JXDfdls~m}qb8WOqqjtIB|1?}_0<^D?_~#5{&p&$EPN3Rj|UfK
zrO_+s{d)FBwGsYp$4J?>;wqo*WhM~~|K-zi*syHlpf>&}&vWZna!GG-YF&z=*}iJY
z-6g7r^WWVnY#ma8JljW}5v%%%x4RD!IAU8a51ui#H%SP%w8gQIx_f-~ux~8EW~o`n
z@oX)sR_2GaoO)&WSDtACcX1h?#?*)lczb_Yr1zF)Gan3|8HL}nVFAG|OmqO(n&MA-
zaLe@qR+Ifs+^1)kjmO89Yi^cV{|kNp=UXu^0%zvlOD^rrO;ckDH1-nGF39XGr_Jfs
z(X^5fl^oQv0!+o^l5qU7BPEm+ApI~O3g3B(WxLXM8emc@M2Wy6ve!3GjA;;@x7_Ez
zo=VwPV>|i7_z0l`i7iDZ+>0bbDcHnWxJ0hOv|C(3+DknS=A;)8*@4%b1|3vEHL&_GM`bw~%%giHJ?
z-09_?lPQ_jSE{PzuvX9k$j>zs6el`pyS{MkYMB<5+2yPH;sm*>)bQG5|Dbu7-^gaj
z<}^olohRJSx^ZnMFCFf=%Q-u$QT!hs(MHW$1(*>x2b@=^H~Y78b0Ymbi81&N981
z7ihJ;PPqaO`5u+&3F%{wh~u|6=X>iVHTp?ArH)sBK7@hmI@(&Q-L*p!btB%XD_aZ#
zgV_>Do(!mbMCYLG;vTHj-&Ps1N|EW&vK;Dh^c>+{>ABu2+nid&)v4it2V)`MKW%Q2
zdlT*FD!8|qvia2_d7{!+L8K9?3mY?GqhyO@Sh_#LKOjN3O=nx~h?F`vFDbDa
zwC?s4W6%BVa^jv(B5^#7D-CVl#?ma+hx%EegOi4|RHopj|H2-LNytriLnxz98kP0p<
z9jGT)FKQt>Oz&0~oqrf~bBKINpWC6!#4LhtLrHAPO_o)$xdcMxnZ#|J&lwfxJxztU!2A2=f$!gqq1fxCmi7E!XT_zA(qg0k~OsEngm6b490lCRm4f(CC;G*
ze$`)G+aU&Dt{w}mHePzg@DyjHdEk4a$3;H14<=GavZ&t1J(NtZ>pU?RWi~g-x?D_3
zVX$tO$4wjeH$VFpAkHuIjpckaN{}td#Oc2tpyLac2W!fvHZQhPWsZtZ*gI1!JEgc*
z5UWif?jQ{Cp>h{U%vUUv6}povFA=Hu_ULQk;9YH634iEtRvyhW12fS{azjpeBRO|ix`4m
zmb#YT3q@irFLS&V`JooK39v?~voK+F1t~+1oo?
zp2wrnLvPEI&$Fp}g>--m@qhyk?}wy^nnK2t_fHkFm)(IFwcaz40xj;j9Q}{*BJMgE
zi7==}1BexAl48tO6RGmAPH*j3>H?{gUM)hW&S
z3QHS)RnP*coH`4irkpuLn?97RyW=);`rvY^-Sjjnl+bUMle>=7%~d(KWeL0-WL(JX
zWo1$q?L9wUv0_DfzEUEiu40_v&v#Kj7cr=|C!;e<(axUylpUYflVrVr^M=iR9NDDm
zC0J^_nESIYEpu|dbG!TZq@h1qJ{bHL5@|{4J#6j+RM`n>eYE#8rHG~FXURd!p=X&}
zr?qB@qz52#^C{HS->Dr)G7@hc5Kt+6EQ;Tq6yx+D?tsoEI1)fxh(!lkNaIVNeXrZs
zZ_?JIh~h}9-gPerBWty{!F0DIAg_tb=&pVmB?Nq7>(5pbweDz;(f#Jb(Mz1uD!N@A
z=nyXNWIUmKHcWH>~js^s!jt<+lmxV?Q{CL|~ty2K}48PU)%I8KhB
z#)usRZ;dXOvsL|g&R7}7OMcQ4L;{emSDveb1KDqfQpR!&MUeoHcgP>L&kgJMM<;Hi
zpo5*flQsF5WaQvv6m}aO&7Fz;g^$
z+VN2YUpOnGkVLg|#yj4uc+W^PabmDC+>=UDhp^?sM55xe7LCw>*yS=dH{Q573Q&(L
zMwdzyU^J7O;t{hDR$%we6LeqlaIz|w>E60=QNUvMUIeJO6Qy}Sk_IQX=Gk2JejlrRhse2C_8H*r
z4qQ_`t}$LTR$$*O{bf5-k#5prdVqde-xHTJ
zt)(W-r$tw0-r*}1eRbvQjdy3|
zaJ_xqi+MI0xy^xoO1D*FSoxV)a*^PhXVl{UY4kOjD@1k&s+AFOgDLa_DWzzgzc5G
zdxjS$-rP*=TUPS3()Cs%T^6L$C<}kp#c4xf-e(&2F}bP^l|0z@BoI`pB5w-Y2qJ5}
zFa^#A<1Ybu5oeK2?epbnK+;CQPutie8y5PKcm*^s6b%j5>LGZgE#%PH>G4
zSX<>x7;jZwMS2sg`&O=*9d;f>$h=olZ}lW=`Ll}cwVs@vYQ9L}zF>oM@`Fjov-#w7
zv%5~mZ+WIJurJ!9%7B=`Zx0jPE;_J5Ie7uLvEZ6>s!4Uyb7C~C90uH7q|qv%&3oQ7
z3N6Nn)0z-I-#;XrT|aj0K6ch+=J`<@Ib$!JSgO)K+to>3GDnD#dIGpMiMwj0_0D@<
zIYN_)`sqAPIXIJ6*Sj!Qw~6{uoHUQDpcK88HCwU--?=?IGxXj8RcpvYS72AXWyO@F
z?@5%2i#(#I5upbM|Jt#u`=Bd>YrDPO50GommmI2qwTsf#UdF<6d$Qpic`eCUfw
z&ilruBV&T3ldgW(-sR#A|9`1;&!_(xv3}xqZNUhZmWvV_lZD;g1AIptU>nS>Kj3_#fexRqT-LH-++QY!n!WI
zu}VEfa%=_!T0BG#lQQS3fu~FC8yKzfIBN~8o`_I+tB}%B_uu`jZ;ds~
zd?6d`-f_bZAEK7SLIDvW#oqlm19c*An>Mvz4J9KBiR>;>4@yMV>-6Vu^+crTbq8k@
z307h>UudsELvW6(i3=8wZbuXrHp%d&LkmEFlbAN%E91=>UK_@oAAw4X`fZ#1c)D~_
z-`yk_R8y2)L+c6ia2COA{{6PpDlEGU*?Z5LJ3=%a0_-3y^K`<9D(g_f1eSopk)-<+dwl7&B#+H7tR4)G!|
z!Z@-w#Ck*fU;n`WnQNY-kqvKP36nXz3EX!&&om*rsUgH--{(sd8YE-uQp_?)TD3$}
z1bcTc1%foP(<(=W*phQkuKDicfIHdr3L?Q==7k*?5OrtaR5lz;Fk^KtTQwX#2`s&E
z#gmCXn79Y_y$fjc1OcrHSv<$tUrF1ab1dcR9d|`(VwRp&i(_jVer6gRxuXYxn+!Wf
z?O^oB6!Z~QEf5y+LhZX=evg@T*M`NTvYN553i$DU3r
zcki%H9pV_n?U$CwNxp&UF%l*f*-$IAg9S%i0wuh^S$V@E)sn^S&Q9ORu
zeH?a4jKz_Yq3i&@9=|SyOhE+v^`gVDwu>Z$nnwFAb=>3hJ(qFJeB?UNlax;4)R~fugY}VEwh3#;zq9s4(E$6n0fD>v2jzcImBbs4>ds
z>I3jL{fy$1Px~M;Q;HW180>E4Ib6kDl_c~IO~*rj$p(-A-7lV#@r5qt98Fx~$qXC$
z`m(&2VL0@^iW{5E+#QoZl5Isc>c^&?x0sv1Z#;Hg|TI6HPW!2*!1^D?YS%$-zRO(GNwmW{CCjr)05ucl}aM+6%sV9FO
z(@GUEP#K)(^268$mxRU&p!v=2N#HRsuu^t(%$alh7jOnBDK$D}HY;^(3r!*!up7oI
z7l}d)lP8yBIsP<;Z;t^pG2#sPd8W)3IxdtFmfGvA&N3I6&L;Q_jLy3}2@9Qy={R_v
zGjWDvdOXs-AD?C#6uw@m%SzuGeWPc+lRtKIzRa5^-kxJacYZK8UJ162qkrTb!rTIS7R0f`Hmc+0RR
ziUNd>G~Y3;#v0gxMCT3%Wt_-K5#oX`-&LhJ#-bN{pOl1|J4C36xu#
zU8+~8}~EZ%o4MQ4e$^ABAClUYPgl~{*;Z^Ggln$4cSt&>Hj2o=@b-hSx6KGT(0M4a$
zYieb%W98bKEUo#L^$Wd%%+h3KO^%3coIBf-=BQm=dgJ=SOUY!W@V;OltNA}wvqnD>
z5(HZ5l`%LzSWJW9ZGJY(dEp{@u{I@spVqZ~>Fi(LlL@3V*Dsy`qjm$(PwHM-x3m#B
z#xb8V-YLn-t;G|<^rZ8ZYVtH&%lQdb$-4`Z(P=obgm8~!K7j`=WI5Dj2=B;C{h)KO
z?pX%rVc3mXA1gYDLw_Y4)XF{M9cvX;rj6XITwJISCfAjgtKaYnXQkVeg2de;NHls<
zueR{S?_O4sm0d|uR!~b_YHjxdE6SCLJl72UY7ku>I**2$*2khUH{^Jdv5u0gYKRAacJ4L{1@-v40MM`T5$FTiH6RsHb@$a-t(`Qm?@&-qOJ*p2a>{LJ~f`kMN@
zX7rsD__%Kn16pAFJkLt5+6lgpy^Z+3mw*Jn48F`C3BUGz$9>*16qr=QCdJyQz&u40
zGn8EEE$yVFZ-3_htqk#x3j|{TD|TbXUeYz!iym1JQ)*jXwT#uqf~X8beR!oNtD{ks
zGL-5lrw*{ACyDAp3srpUY(RX08e1h^w8a%KhtnUEmkghd6OL
ztxjS}%Z{jqHI9g2JEleNRAus6(#I$Az#Cx5h8V@|b5H4->|YqGQ?^^a*H<2fwJsbZgQ2^AKaL9zioMS>jUyL;a!a9r!1N`&-s_A9%_7z
zZvGWvt6I_z2bxtzx)t@`@^gx>9A<%qXB6(m?7i?_;uX)=?D!0il_vT<+?@Y66yP?b
z|2li|WkM#hHYLlyS?>Usi|zWaE8q7RP|nS)*XPSIBxMXycKRx1&O5`K;OB?$=;x;I
z^AmEzS1f;Fvh|Pc(7x?g%5h}FmvpcA5~!sgU`i!dqQzs!Ct$NPL?~^&Da?4$H@-W8
zc>-1JmU^@b5A5~>IOdT8FrOpdFF31}1}TN#x?BB%2I7o3Dme_Ah(n3ruWbq!
zrm3L+BJM+r!14q+4^kSfQh$eiEuGXZE}y@l#iHWy)`n{4JXIj^B~DlKTCyy)y76Zp
z`)elD6J&5{wKE+Qc(LPi!|rzt#`&QGnpVjf?m0GJby17Ta-p;<+YMA?h)|X
z5^hi~6WihQ592X;KbH7x)TJ{*%l4X*DXQ`<<4;~6hLZfGwK-}FjaL?}w~9tev2QkcJ!_F~@O@)-
zEm=vp9;|9zVk`b#^rWryD*0zEcfUWy!3zguQ|qY=5OQZnmwHYJ7ExG7Se&<5y|&4e
zaT@A*4+f^UrDR*K=-wm2Fc8&A7OD#g?x3Im0vxll!E1DbZ7i5mc*8#1`{hu@O9E(0
z>ek16!he_bpotm+^8J<24wj%_B@ig9flQ>~f75?{UB~pyAR+xA9*krWvydXo
zZ4ybr@+$`K?yip>W_jD$WsuPPu2vzj#>XqrO+-=~g)#^(O!D(h?9C^#e=)JiWbRgz
z)EPQ(!i
zhnUa_+mr=%EZ3F#Q-LWuOblGHFO+qd8(EqRRubAi;Q_ZRBEpyhN3}GjCFgLTp>&Q{
zHMAKiO%HibtT?E8!&`o~IpXG3{tu;%#ZIxADKo|v{7
zwlHK6R4~9LFf5;saktwP-Wimlj_%+sHi+Zz$4^ujYB3Gr>N@n}@`u~&Hl(q!F<8Yq
z^%c(ekOb;L@PkAv?8B_tjno82^YA=qkFONljrUfJH-@84ZFP|^MDcO<^;ItpdGW9E
zdaSVj%M|4^F-ooMJS3qMA^UE^egY_hk-*e|pV$-opK9E}QHo~ORvPj{kVxgH7~Ob3
z2X$wWJC#s_G+>zdr>OjPTr
zp8PPLdT{CtX#t0rpk}fP|5r!%WwDeez*whl6l{NUkPpmt|CaIK8uUL
z(rIl-5SZTbg3$l`o<2}vy?oyr>jP*5yrD)|(Ee`MV}UHjX&8+E$W341y4WVBu^c3Iv&
z#BCaGaQqzJ)+}KY0^K|r5WIg8Ec7e@yfI`Ngzm??(YGeHj_owqp>&cJeRT-*1^CM2
z-ZqUBnN8Xdg3lwkx-9gE6A!K|489JegHkFuE{^hHCVY};;!ln1q*Jv-o4?0d!W}{4
zBWr?BfIOCB@P%@pP}uo++RU~_LCsT6soPLj$52k$XbqDnS1I7%%=}y-j3CnfUQ@AX
zw1|L@f(jWFu6iI@f4%gso2${jmX?~!#QHR}MTtBjh&dTk_zT(Yb#&THxEnfQY|eQd80_2qx9rg%MuZh_$5e&0L-TEu?5UA3d}?0;
zKRsAHf8n07n7TVC(IX(w*UKyOA6N=cbaW}Kc7uHAJcN)xsByhN)J7Ny^(DB--T6vi
z+F%1H9Glp@BGuf{8z8`2Vg^0y`0v!-KA%HEu}L`u-FqeGLupX)jFk_Fd~+cgUt<=l
zE|)qFX=WbwTo^hr1g+YIEp0|!{H){dj};_E41a3TcHfL|_$RM?KN~;=EEjcg2b}~^
z37QCG$W;zTvUR<84}R+kc>XsNAgw)acPWJ0%zO9~Kq&@GaczVj%l^yCL|i+AJmLq!
zL`flqElQp1m4J&Pv6mHc7HXaCT$X!gK_c;meXjJl>3K$J^(N7+sxhlC)VOx&GI^O9
zC?wGu9k$fDfZgtGiHsOeVUD$+CgM*JTay|`Mx%*yab(qui9Yr~{GX`tZP;+tsPnE(
zn^Ha17O?>Rgy3`$%2T~xtOSU^4dA7l;@jP#`!2vu;j}FAqiLWTf*n|?1KEc|MCGjA>P)pyU>zi7!^tf>)|J0NGkWpkrhV}
zYs-71U~b1~^J~;(qn@7Zf!vbOP7q1tqjokdnQ2Jy$=|AajZv|0?l-N33kmRQQ&U-n
z=ThA{=~0xb3-#Jtc_`8!QA~J_O%Msj)~vQ3Sm*HZi?n%B|5_LgYMvn`E*A=Kt$<0c
zHGk}F$9&~`nf-6H#{W9Q{?ktC?STcuNUdhp17e&{9+VhW+5UZ9UBw0)R;Zs*9Lc`*
zmi^|EhM>@uWlMwp@XrQX8u!A~;o6!o%7~uRT%ur{4kH}ctA>fnCokmv{jk#1-}btL
zj)+rDGMPw_{Ni5Ny7n<=Poq}8+_akK*{m5hKRGsY-<1jZ9jD2Zuzrds7uB#Fo3a>v
zSi?lI%>t+v+N{-+5ui!<=YYn2LNi9ESh_#j}6ZDZ|SD(
zeu-uN?ZH}nlM?JdNK`?Hf2LVukpaXPBz7mlAoR~sm2gFRx~D@q-2o#(+oAU~|7iq6
zO!NIj3t7TH-AIA+wXkM^g0d`up)0;S1uJ*91CsP}5#x)-T9;anW7r*Z5d{25kCA*j*^y|#}rA8y&a*JVsnx
zzU-xXN}&FCGvPWx^q<$qHIs!D5>2?gGfuU!m;pd-X?w*v=MWIbQrvv((xWgQEm=tS
zxeT)N{h(zxVq^v`hXwt+90*e2Pxnmte7$X(5^k)^ND%yH9maF_0YwhtFz7hXrdYB`RqmeupN
zS;Is|KES5MmdZ2;kXs+}%XY?GHTb&y>1dy>XYddG^|MYok#G=y)~9&0?@?MJ<)GkH
zubIeR=8*npvI|T*YiK(y!ZL-6eGCzERaJnaDnxcNOyeZZQk!8yZ;;^R(L1(L2*J&c&}$3o~3(sOet!N!5UaNcOgw+mj$BZBFS{4pMyhM)GmYtTuz`j6N9o}E`c`w*+1??LG!In31~ba3uZgtLO5
zSrV@8jC^l7kiowhu$8wi@py+5hKH*EKqeRQRKJhtQj2|vy_SAV;v
z(5kg-7ohjYvO8GDu-^qpJUAeXmYO1WyGXQ9!513WiN-otcqe*4Jd^R3a2zA9j#nnp
zSm^xe)Y%nlYi|c!wE1k4La0Z{YM|znYhGkdLvBo=7&XixhQdBVN`X9p(fFvT{0w+Bj^Y!YZ4RTkkvk
zJ2~>yD*)0S^8vJaieAWKsrD|+3$$_agIE}N{p;nRicn(hywNa*2WYeflwJW>Z%(Oj
z^LDa?2A2TqmA5PD)tgmWV(mJlOHVV`u4D2L^XtgtrgK6$@eb2;Zm1KlVg!7>l;+fo
z6H2rE1X+1uQdb!;2ZzPTL`0p6HvEIjg@Q%vr#n4;U*D_Ssr<=`qUE3NuDKHq-gw2?
zI}3BdiKROuia7}G$M8lDXj-KXhf^D{Kgp9SWY#hwIZJWZL&zA-c^5v>BO)s9tV8Fx
z0wHTS*ILDh%ef7v;}
zLVTw`pGSNFg`oYBn1tE;x9u;1H^#5S9^ltQ&*%24@9WGL@!PWoA%$8QijhTwcO?6{
z)h{YJrtHY#N+CE)yo`2<{s}fhPtVw**t#WOCd4R;aSC|osA1{0nK?b8k4`D=bpjOIzCMVS3a_@<+sqwL=z9dN84x
z=2jo;l(66u2@shC_IH^>8%^L_H5QT
z{-{*^_*nTc@r-|O#W4@l=BDDpOY{)$5ak)0&0E;d%-_@p?#_=v>PD>XZXd-==T=f(
zr6+=qiixn~zv#!l=9(}hq_6YcG3N$w{g#bI?;)ppcyptrd`y7ntmNL(d!GI_T=t=#
zaxf?6TmCA*)td5=J_PF9MWNZ%o4eC|3ifDTXmo$Qr#{V5&;;glbazv{I*Ryed5u2K
z$Eb#Ie?Z(VuXE1$ZnE3i5&zE|+jl%<#j3NfJfR^ZEjPJ9_
z;$0W(U$v!_zh9qWH{rx0gG};mA7hNlTavY4QYqPP=L7d
zFG=z0Pdvi>GsPUSPmM@N-@ojp(ZSw{6|GJjHx7x?$nj!J|BwU<0)($-XmH98GpX_`
zICVa%8s%%&qSm&GDv!6f0iIGQvN;(G*qcFIbfQ~T2{G^wH7mO%@xQjn4Z9;0BpqF0
zhhJgi+aH%^fi%V=CQG%%r-6vo%YuuRqVoH!bRwwSlvc^hTo8qe|B^(T=@xs
z8Az7QOBXhm&jrk@DAB%AuUgo54VJq&jy&&Hf~}t~5@S{Xusct^H%9-u6ZqhFpN!0J
zA9*_8-a~?p$|h4aOXZiA$Y_@OJv9(<8@6{>6^p`2-O$C);Z$D_CyA|MMA7Zdh
zYm1DBp4vd&JFkG+-rz3QgxoGCkeor+rCyD<3a$g+e_cAB8U7Gh-x~ahe({aenJegFpmuFj)TqrgYk{w?=E*`+YR-dB!A^z;
zTeV&zMFUHs6oYu?w`<4P-}$BSmJK|>K)&ACHub4=WH;+WwDbZ`Tu{6>jaA)4ynls5
z3D}_|xRV&4-Kw5C?OpOlu$
zlY5Q!EbXd}%;E#H!*KcP`+t886X)P~uMhie_fv7Q%iyyp7pzE0&o4fEA*wDmrKFHX
z@+Fovb~kkWkxmRxU6hiSC?n#3m^-VgA|6s6JJK!;w1$gA#3A##t
zzITYy1;4!i^7PwFO|SLWOzmIBxci4IN>23B=%2L
z5~;UBb`F@0sav69rs@Rn)FTTW7t%k1Z9I#Rax_wlrBD^;Ge+J95>{d19CZQU`@cJM
zc7IXL3XYk0!zNNbT5vYxq5OPq(Ufqpvo#o5uQrKtY&lOIvmM(&M`
z)8{3>7I>MyrcRV&jLZ=hFJZTPIF^;duJRqzE~oJ$C##U+f6$u*Tg!Fzriq@Qb1DAl
z>SK(1YwE>CIFBEOfkqf+e3ziDlPb=q?fa
z=A`Q@UoMBxXZOPV;n6KB_b#W#dbJCYk*mJ+bbN;%%B6w!5!3A%TN7WuL}x4Pw||+3
zXds~0`uWB(Rkw$<<*hG{-rGR!!vOj1)lYk2f}Kc+FrBRFpaZh;ZkB}B0By(yyQtZz
zQeo72MFaV68Mu45`Z@wi`PA?Zw=GU!*xGg8c~oG|agFIZ?Qq)tUmUL;@Bge`s7VV0
z`fZ{%pvsoBzKQ+z{)6-Q?m$w#D)Jix=*!GG4_;l@&1h}Q*
z-<~3~oAIQFOXR5&<37&OGt=sggbcVKxQ}(io<`0P*GAsY{{_V_6-cTYv15xda52%e
z>SyRf$QDQzSxCE*rbRfYgitj#SF#J~8Wxru#XR1O8P3Y!TsSS%F8*>msEYv*=@k}~Vm`m)~yCE=p`a#IYtaI?&om)Xtqh?JKz9C5h
z*Tm7wIfVDH3}$_>C{>ZqB>>hfvDr$-l7VW(u~Wa;4eMLZ*#an7Uq++F8CD|4pr&`H
ze@85fs7o-RrI75@+rg}szfTfXZHvl#a1|JgyWcO{%m%Vknj%WsCo|d{^Ju|Z_vklZ
z{D_6;SvlWrTp~GdfSavMjQs5wwJA_t11$B{qXGF7`zLq;;?aB(>UNatbEk(Y`HW~G@-pw40agBQotdvU($^-#E5s?#6|
z^ktvd1%V~f>1(OOt?`Qu)2!yGAKKcrG#o*JL9uW`38_`@8eJvLVxa&*T|uH3-=I`~
zcR=glK7i7!cqBow(tyc+KZ=
zGoWHwQg-U
zt9)ik12h=R_C*R?+_Ygz;Ik0uMR!1#qSX;b@5Lp{v1Ua_?KDJGCy?$;kJbO9$yT;?
zH)s}+N{*qw|5S1Bi*AmMN?7sR^y2{Ic8Gnnu1SXPxPs`5WhDma9wu%d$!wEE#x(>p
zD3`c9<$%o$kx(|%hu$kpax_C8@MfrrR!(#wjvMwq_=Xl=Fl5R%GCq1D9^Q6fJ#t^j
zpO2XEp^BfPsS-u<&9kPw(q&k4ntK`OG{&CPGu`_$TFOW8&$B+QF7lO561@Dk?!3-g
z<}b)hB1(id!smYKAPcf^r<_c>DI4>mlB0+qSJdU@-tqhy`sZ+toSRs#tCgG5?$`=X8%r*p>y9{SJ8HSmd-LUn*kmI!nOh^bovSKzG}}5c
zbk0YA>*$ZU$he3lGr
zA|#Ojs9c56Hqf5W`l8wys(!s8jYV9u#>{*DFM`!Yf}c9kTpxDsMjmqYLjPa%wgCMJ
z>6j}53xD7dUVh=4FxEGMLLA;A7#sebq!*x;o)??P&$lac1D_XDE+y33nvds^)vpJ^
zuPe~QvH>N;-Aie573rPjj21p(RxI4AalFO`4*}A*F9AH)1}3G0Ll0EbiOdA^h@{v6
zEo6rX8rcv8U(8iEpNj{+9?2fGLnGTQuV9&sDYLI|SR`F^^P_Wl_)i5c8|gznk7p_x
zN7tIh{yu!-b=CvsGXtopqtRXvkf~@4;o38z-L`b2s=Nro7i4M
zYg0MgE-PQ%h-3b-ei79_^CJh^qF{wQLcD69Vm}n(1T&!NuypFt!e3B%M
zU1mn3=+I8yzYGH|0||M#suJns#su{8e%!)2aL&?i00tWev5#s!6@Z2IC2*>oN!9Cc
zpQ}8|B^U~?l4ZG%{lfJ9PAUacQ(Y%NxfwamjLK~WaV6S}Lq|Q^7(HJVq=aky+bZJb
zb>-JcYvr@|sE>;B*#zTN?UwiDA{nw0&pOS<#u9u7|ECvs*Z_{}|8NIzqRL
zVh5Bl+>rTXg@vGtbpsNu_qWnS@8=V+)^WIUCEnG4Xorl=_6NE`kj!cn?sBN0l`vaa
zn47rBmf~P~rYM|0n@NSdolNE$QCJv{8y%8(vV(ZL9hSRJVvVB7#sR;s;!q#Ri=c
zZ5S{4?)qmAs*~w899m&jI70ln)jUxcuEi!&>xfTdSo&;m8M;FYoQ80$W431C^90Uf
zuvLm$QG6;inO%+?@klTF?;2}A(?;VhRJ-A=;brkqzN8K>0aEuaNjy7vx;GEoIg)ZH
zSW4n5nlxYz?8Y9aF_?_1tGsp0LP>ifhti|y=E^rpLxHv4mx$w^t=&oW<0OO$nu7cg
zxcR8;Yw}>ds|GD1`7L+XnuZAKJx7k+ruw`?P+itnN{rPe2FqDh+UoghtU~ag=*xA*
z%T+rY>HwAy)F1EGp<=aUTNvJ^Rj6ue({P3r{C8aiyIQo_WCO=e@$Zbwqb`myT42_H
z>LDxK65O)P-9y`4ei46>bmrs3M?SCFjzq_doy8LV&&SbXX83@EdRfyKfB+#t03
z-``1iBJQPj_40#eE21_aC~l4+&xcIo`B7(f_|)@l3yjSU%g=v4<5`*Ze~^vpp?=dW
zVII4~;6Ug-SM^g7o;d@;`I}@N7;bi`*R*q1`QYCtIhxf7eT&dy??oan)$??y{pCWA
z9E?uppka~s8_aCAK(PSg@wY=Y8~arh6aWkaadDdIO=!rIeb=ln?H8d&Q)As!^#_r+
zqr)(TGxm8aw99#cUyR@t-O$o>KChp?uwM+Ps8#~3W=i~R|#MiUh@8jt#
zdnyi2&OpD9ml>bzkCd-liq({v`2!y`$pkv)OsFww)=B5<$-kf{2Zon50wlB6)1N2W
z&q-QdkNdrMF!45iq?H|QVWJkl*Z<*Gd=pp=0K+)ThhnH)F3kJs;{#sq$39$JriG%-
zuIX{~Weqg`9`^QwsgwE>VT|(oO+bLi8Y0m!PL+0ZoBzC7F!_g=^C)=;xy#d-HfanJ
zi6c3$2{?bIqGt+MkIjhW;#oRUhEwkVdw~jeF140-eC44deE?aQ**|FXa*O@rQUkel
zVZ-a9vb`;=XH`|QCIp#M>x@zfp;f)VQ)`pIsM&C_8Qi(luaGg44Am0mdblzlc9=5N
za^UMC_K%`$tbUij%-MTdGcX7NREODSd~4h4j`O`Ds4M3fQyXO8`ZtWM0DvqRe6tF%
zr?SyScX}3I+TaSV7PDsUL%QA5Hl7B8HHi@etuxQ3$9)00!bpzM_ewM%mZmIBtUM9-
zF{`zoXodz#gDcVbkEgd4Ak^yisAUwN&ceA4tc}Da_0xPel<%dW=c+RjY;i2b9FqE%
zI&3pupr-`%^4;Cm0Hn5AJ!&QZ)N#bqjf)Fe(fRrw@JU|j;~%+94PStWV1KSV^G&L(
zXh5D4!?Zwd8yQ>^69BHGMbh9!Tj^P)|6@ewl&YeVzw$ZhZ`1P3$J^7Y6*MtgcfY^if%?)TtP0>feLr412;k;Ccjv(W9o2}7CqES4CymEy5$`QQNau#~bZv(N
z0W`m3bIc<_%thL>ts4R*#xn6Haz%C%hq#KmMOC2p(hsn7^ixh}KWe;~SY)==H0gr4)V<^Q}@_
z3hRF^UbN907#4fhM&Pu=BrBLM7S7tC@{ZdB_qpV4Y)$K{YF>8;)fdC3e%YyQ;5DFE
zu8{#_+bSk1>8|}~^eYmwtl%TdVF3n(Yc1a>3Q$*>FET2VyT3uBJUQv$-Mk`ss>;?N
zC6gL~UZtLg^>_JxJ6&EjoO0wK`$w5YH_ANAu09^1iJR74X2mn=Jp9;=_4sPwj;|6@
z&?FWt>-G)&d6orzUZyf_*|ltN_Lkfv#>s@4#}jsj%8`nhQpdRMcll#kBSp96_bQf+
z0yL>@Qkq{e(e-Fdq{{;&kbtWb+9*BU{nS~LeMjqUXRceX`|bPi`#Yfje}&yLxS*yn
z$K+&42jMl(olooe-xC;_zv)_3M)xnr24be$|NQ+yc+=*qTc18$_!_@!fQ;SG#*b@O
zH6qgjk~#7Cqr*I6X&)>O60K(UfA1x{Y7&akoIOq>-*B?vd`lA|J+CJE!vu$Sv-Tiq
z5jSkt1C00N_Lm?B!mcXQ9Lg8~EZw#l99)_MEe`pSYLD`#a$4;_Om%0mtfnpekmeiRK)=YFsIf%0)VjG9eRRa52HUIn
z5#6#8d|HT1SjdXO66_)+?(l{ZQY?QAr?6Zj2jz`q(BMe{^PWI~{hCYSg|CC~QQ>fOg_*
z^rcs8P+eK`UD790KOWxNr>N_;2AL+n5}8lL4yvEEKV2N6MRV4yZ*NCHf_X-yX7LWc
zWZ&p3g|9socxJa)Ru(h=F>@7Y`g0Ru602;uoLtL&QU{h+ML5Klc>`A^H|G9k)dBh
zR*|k1s-fC-RIrrMhLhf47$%1d?ytgbJVz*9svQ)Q2{3jfzF8}qZ(*#1$ecoXfB
zrQbL?(GM~CZ<|B@jB!jFkO9ROwM(rRVrfi=Q&(rH4B_+0N|&-m&db_I$HjKOb=TV2?x8hmROdmZoWmthc
zB_n5C9FgOPjdS-5)d!&RE^we!7YcHoJ=HAR$D5@8r`mgG@I*dv*shm`!)EVk2O7eHCb6cDgWJ$xQ=P*
z{gILyr2x!A=!8cKBgyKdp6l`+E#q~)1QL2(3qN*jcR?_}S={sfJyoiIUaB%5nC)>t
zH~YPRxUcCc4z@VK%$cH2@0IjCM
zHB>A*scyVPliq43I-jMV%d21(i*mM-?X4^Q;>7LWYV`onloGJXW@nU2xWc3*Rm1;G
z4Zu4lpY?LrhT7*&QPLfu6(4U;b|&13^6Of2-;0$msZvjep4B!m6#Iuq1PS$=ZA(Dv
zVqE7vbdRH>BRKsA|K%UDA3-@7A0*aBWraPv)~;MR{;&}wQ2&}ilG+Cs4o<2+3?Fk9Nf>>TVi4S8Y$g%T+VVDtF)W
z;^jEU#EWx92Dk3q>niO}1>0SpKvDz93IZPA_bpY7o%KyQ<0$&+5OPlCzuOB!i0knV
z|HT6MUtj+{^*(KZqk6aD(OjewT$o<@UK>4Lc3eqBP=~c18@MsQG1C`=NIf6cl87=Q
zjiLz2V+Xm4b@#E<>Qt^VJ;QLW!uLaIpW9){v~#wyp$%Dmw*6Yy*F>=4L{0-zmseJq
zr4rpQ40C!h<%t-{NkdfSr2Csn4b|dgPqnU$1ZPpW{H66KN|mPK0*i8!+;Y0B$<`yd
zE1ek8vXU0mXk4Q-4K_j*xf2`Z6&Q%j)i4t@@tii{RVOVY>3d?BT_Zyrw2Um38>hU3VA^C4I&O=jm
z1?-)An1r3tB{_5Xl<}3H9#v0;SS{e0e&LABl(w>tDdKMimWry9NdxSD{nt5`S_hgv
zQ5|K%mkw3D8aL&@(w-3NdbQm>3KT1ihJDSLHh$7@fT7Q0utmo=~*HyBzquw8;pFJW)e^JQbViiNy(h;=tuyUk6Yh?yr@*
z`?@NrMb{wX@&q~8Dq<8eZXN&j_=o+p_bJzLcrPvwW;6>=<@lOP^~sCSIso={OVNL-
z5L`a&t<|84Y5SX1rT>@~)6Uz+buNTJIR?dU)X03!NeYkk0IZm#K$7leh
z^M>mA2S>9g^>tnDQW2?nT;vURpC6||~_lYrZVd*xw&m8b+MYI~s1-khYwjvr_yZ~%<7
z#P{OzcXOa_Y+o>%ww{TA45alICU%zP9~uKQF5uMT(@7q@yYB-Js_4CXok9d4hQYx<
zw<1Wz?kf#Oy7l4&7?xWX;S_`ayvdGpum=4I_
z?-V-ZSZz#-OfbMM4F6G7Poa1{${aGl0dSN^AU}o?#WxOx)_w)*i2slF@3GtN2pK7rpILEYtc
zV0W5RUw8dn@MTAmSuJNi?!V8||FhA5z1iRwc11uDs{>|%o24M|#`cETI_3L*RwY$x
zYuDVcyzNEmc~>GhmEGk6p_@B>o&tE~M?(D#$Nm4X^;ThRM(wsX?nOdzhX94(P$ak%
zcL@@T1}X0D&;o@b!CS0IaW7UJf>S6^oZ=<87nh&C*IsLV2mkdRBv+Dy9ORvubBudD
z<2#xT>wrbsHdWDj7{*R3KM#KkS-uTgK?OzhP_68x`t?9Zf?5(n9Y-6g}T)FBnyTLDnDqD%Z{%t;mBZ<`*r%r`1
zs|V}x0Rxyde3^0?Vhm~`|6D2KQD*e|JtH@)&G22B!o-v^B7xHUjDL_E%{p8?g)du8
z@yjnFO&czkJ5U85KBme7)oEiUY5F!bz#Y=@ae{W5WtMtW`@?3vm7UlPCR=1(P|kdO
zOVp?r7S#e~#a^=0p8|t)vLwJeb_+4K)xhe@4Y^zrQElSNWjmBIZsA#%ImWv)2d$c5
zMFS+t8$NC7lWYk~^RiV`gD>*iMM5rZ8d}D+!o%Bn=(@ck0d!X(ogUO(=oTqEXu
z?cd}x(GgGfJWA;`}*;-KuQ%Uc{23VTdLTvN?2-cGF?t!ax
z#GKH=uZCXGrT6&&N+3dsbs}dY2d*>Q>X(MLexLYFa%h5mdfX5Vw1xe|EI6A|3Jqkn
zkXcpjHeizl&6($wcJg_ZNji=%FI{9DCfm@WNq&BSS)uIL-XFluyMekTW~UMAEdxZt
z_h~B3$-~9(OFtQ}{-DdMw~^ImZN6A=a;n0(;N0ZlueNRIzxzgfJl99~U`KRyL({$N
zCp}L;DhGH$szNq4@j&KtHlRgoF1SkCrMAk35Bz_Z#0&g;##rMZyljyuuT!2eujQqs
z(Urib$b%f;$E4uv^}&Th-lG%C8qemOj{Cieg^7?yPncUs>L0&tZ~`h>9?Whx=qKv~
z4uPioOYfcYl~Upc7*p=XFC)x%1BS$|;MV1daxJ=S1DGW?diE;5;9h#<4mIQ9R|5Ck
z;ONbkc!h*EG&{9n`kZweoM|^rcLdQDk$ZwB4iBWkaZb2_O|w9D^kp2zJ7?KQnuQ)YqEayD&}J*DL_alQ;^3IE)uE{{D{W*+Zf!lA
zBk;iVdWxa{>sz7cs27p{UqS_!72X2He9KkiY?CcDFYr%3E>rLpLIr~zqR+W0_{^5m
zmw*cz%VlvkyVrl?e#zTR-ADx`M!drbyA>S+7Z6v9>z{30a9&lM?_7_KG)x&7e;ph9
z?KZS4k0$2wWK5?jsLoQ6I9#jHWESfU?IENPJsp(4{dHMo@p{So^-_oKR=aMyBD?mm
zbtILbMitsPofD@W6Nfm4w>7PPaSU|1;?0_u=851SM+OQv7n4}jd9L`GX&!&P)=)jd
zcy{s|F?rb*T0)7Zu@ShrIXtXMT+%zImRooHJ#&Z6&i+32-trG~bpj(0*SL2#ebB_y
zpqMlXTX7LXZ*5{Q`(5pr#>GZ-v!UWN@#`&fFIb+c74Q`XLwgl_E
z5X-Dg_rCWIg@hv97#Wfg$WitEBPl(hG<s0;!brPQCHW#DrsQsnpuCbNCcm1PCOW09kk2UuI%I7*4_Z!L3d}UUoW|lPJ4;hFN=}k&P=#<<
zEh!lDbBSrBG5ZY+Q#m(xk4SJ)pO`Jasa;Dg|0!=3qGD7LBC-TY6OaPE%1Sj#P{?nY
za8i^L-8|K`(y+n=WN5&rsw~K!>h@k6YM}Rhok=xH$Ajse2v+DwYTbRTb8^cC7Cors
zbY6PoIwqy6A>S+l`F)(6U5zzI+^IO7MlJLyMxQ%3jS9Qn`7{$^RmM3jgL;D}TIi8=
zO*S~rb?haF^5SYfA2m*2T6?)FdwdiDCk7q%2W4mY(KR7qPkNkwW9>iY17-ew7wCW#
z=Jv(s!Rw@v#=7RFtnB@*v34G=SIuNi8)6!OZ4KtqJDHyM>bnQDfs@;+tPJyC
zGWX1#A$Gysxv$_wyyNu%J$&WeA8WANpxgw(;DcN5`|wpOtV(IA=3n=At=2+
zq7Od~H}vNbEyfEhh@xLr7{6V*Cp)db(E8u~pGOnhOT%>{zbU;)Hn
zsv8XJLa)5We)g8l@(+?kn!XOxrryT6vBHHG2R4@m8K7aBCt({W#%o0*!erSeE3)Wz
ztO?i4BgfRPB|8L5n`XXp$lsI8*?ur5P95{Q$K|{I!%qlb2v@~m;fOeA?Fks~Fm#JD
zq%yqN{o4r%$xTR3-DRpm$1Op8GHAsj00&%_^2tn1wpmz=ob8mVx)9y8ZdHtzpLIVU
zQ)0MCQ7GegP8U7(?IdE{2)^BaBx?d>j!-n?=6-j@z-~7a9|T+aR!9WzbbpC0eHj;?
zo?uThrE6#Ur~{uV*O`bjYZLv3#b#@gD;t)MyHjnNmilveb!eQWG@Q8~ZDi`?HAOwL
zDxsci1WVEpHVmc^1e^z+JdfuWpY^yOBm*Wb5Lr9zn4Oxvgl*c_?_hXkpUftnpk^aN94b=FymO8RhGU@DM!tT+}(Ev!AScPizXiV1b0XD
z)lK^G&Ed_7(6cSj)PI;&!)RL5XzObHVO+p*lX!Ay)IAa2FCVL)65+bq
zne*^S6gu?W;-j|ln{?=T>!~Ci@Vf2a0sg|}xPg`P%K=CXQ*6!QVcA#}%s8puiYtt3
zpo+}}ROfg=&F^>dFFP`r_z526)L)9baS7s1k#Sn?5@p^N!ulIjy&b2#_Td++=A~s@1(S1vrhPKZU=J@-ISb~6JG(;?NHs^julfs%W3;2P
zAXT5V;T7D}JO<&I(yBpx%m2dQH6I=PS7g$6xl~p4yXe_ul_q8b38mhdGUfRyg@60KD@|wh0@IwUTrYQ0
z`>VnljBF|wX{QIt*SNAB16hwW4a$(R-P0yz-Hxn$6lW9pEb(JG-LZ^r8_o$D5=fv)
zKzNx2FGzy5Bu(5$t3@iIN6?y~PLZw55xY2ELm{zAH(r+c?TwXlaWHM36d{PrD06Bd
zCqaP)&+~u*q|*r1w1w)|+fUe#ym4`@@T+pk2~UpY|BH$JYR1_6XGck8@_V8YTButs
z#sG!xaAk$=&qZT{CeAl_5KgGKb8&er{-uLi_WojSQY9msJyZ1Ah|S$Ec=qvqzt{sa
z05|j5x`6L2E=3C)9L*OH5BnkyA1{pCZlv6E`X!ax+0}t3kE&uK)ZE)PZNl)YBu6b$diNXZq_3pLy7CJm6ukjFbi9vbU&e|NW0qvv9$T`^B>TAOt)qY_I;+7&8(V6YHsy9+7&wKR;-8eG(4*B2|BttUePyzq0sq#qZp1VPE=@
zgDQhpMxxOz>G18EcM{%dK?~7Hf)NQcLK!S>%(j#q-+P3iL}iD$u<{}R`hAHt$R(R6
zTU8>4AXGYgZ@K4#*X9rOAy7kyraKRid~O&Fg6mKcirRcx(Ti}Qicp2mL}&Se+p#zy
zt%^_jv_ZpbHra4Sw|_~Zy$kD|g_E?g3@|fB8%KS%qa$G^l;qmtso(L!xUj&ldr6=}
z$26M@J=Vfnr3u}ff&kL8jBSUc5Y>94hf-@t*2DOiUeB>oaj=jZ^}0+A<5e3KS!)F#
zPc#7RF>*=El()36_s95K0p*li5f>h;8ZaQ<1~!9Dt;YyBKL|Q~)FUVB8I51+EWEgD
zG3wjC#Oh%hjLrBBF|%K1r0L!{c^?`3cDsFrzB6a%tpF>iF+8$m;F{oNixPsbnqL-;
z(41t6+)L9PfIK&4HYzIs^cZ_fP8{g%4LS`D1p(L2x?-O>O%vTq(c7<#;R@Q!?;MLS
z1ui)~`d*j&{#5pMRZmi>r--F`PsHGZo9YoAWKCKIJ7N!aIN3GRc3BV$Ai9b~P42KF
z_~AgDd#HidtC;IdGxNQ2k}9F9s71Fw8%|oR&nCURBrn{iV#|LgF@c4nw7g~@#(FpI
z0ba_h^Oz_^kJ-$n`T^s0k#7;?r3;9JmToz{ugm&lY$1KfLh4L*%#RwGH8jHhx@xL=
z#+v@<)Kmbcjd9&M%(5m)_iO6UWUKU`<_XodKWw#*wQT1H`3*{pkGO$VrINr3ng&iFe^+ntVtLwDXm>C%Vc#drVx
z_Prig?RDF6|3iR#<~8@a{mklPPsrt@62p|obF}MuI*c{3tYOXDiIt$uPY0hwLeN6o
z()>E*?ltn%PAE4GNvD*Ov}QPA3Ey-1FG
zvpce{@MN$=9s7ou0clX6Q298-u5Lx^x^c)klZWRtOmG)I4wt`8Ip9{Ub(kujdJX%LZiu&rF>=K`O#p%I7n5^Z{{1+7
z1or_rtx+TXT9Lv7b;L%-fEx%~_0QE60IcVzNxu^&bJo6S6B-qAgA{U4$oSK4S#85p
zbE>Pz2{VWrM~+`87QD@CYSr(Y%wH*>ICte1I^@4dv#b$8rVI6O4Itd^nFk^(ogfbL
z^X6n?v2PBEpABurV!WBJ5=ey>fbQ$V$YxD)6(xI{6zob6#YSB}wU>
zv&u4qX6%SDWqnZ`@}z%ZVfuIwl?1ZCFgG@!T-uNh+ctrcfn2Mc>wD4|HNhdEUd_Rg
zT=#3Yj}nGA=Jm6phRh^giLJ=-`zXfs@f;-`X9rAM(&2R7eh2j!Yc}C1i3=%5{a2jm
zRzCTChbcE@f_uwLL%)7IW=u(o4uboU3as+kO1LX%QJ=GNA)PB-zA@8~u|;m$C$@O@
znk%VmbK~UJ&)z>E-NOpKb0g*z0<1?tKZP;A5`GcJ<-OIi9h|*sMW|*gHL{OagsXJ8
zm>UDVlOK&Q2njvXJx`C_K6=C5m2o2mltrOwpt=r1S)(^UzLm<4Q~IkA7kMfh+Zee$
zxZ|biX2AmQE+$Kbm`C*s%v&9B7ji=h|XnTtX;L_NB
zix}4{YPe#uYb>T}P#&w*zGM;`n8niUv`tZ;z5KS&6d&1P8Tv(Uq(X}_@M4nDq89Ew
z@VMvYc25;VHu#60!{&BgF@N~6Vg{FyK*-oSg@gdi8vI9^9YYV$3aL>IY8!8zJpU&G
zoz3l_%#{h3@y^R9Qb7j%`DnS7N8^9#hLM;N*BDd$;)6rBBjhhm^s?l?1G~G@#+(5$Fa)XFUfyfr$}l4GqT;g|E3TA&!g)S8a{D|`zof)vE7aNt%P|y
z&;KmFLB8Cz*LR)Q1bi;3v<4)@H3p)058_=DE1^#h&-Ja6FPDv`IrMFGf^<`sVS`jk3k6^O&T)|D-FoZtEhN
zpfUSwqJouK;ek_l^l*QIaYU0REYFy9+u(*%>E59NByT!MT3Id<7WO4i9v-e_)Zf;H
zorTD$x^Qw%johM6=oUtCN91zq_if{j0WGbgt;=z)R5H`ENkIz=kd`JwO&LI&$|74-
zoToCuqWMeb6-H)_sEq6;o1`tH($;X2%rU2X^RO{6ofcXji8Vc*16Z9VSI~32+T_l>H^!|LQfG@&b3ql^QtFp
zE=?=&mVckgIg~X&!(54GS@0OtO)~Uf$9CWe>-k77gzCj}xv=BDODpk7vVa(mjc6@B
zPt;skb01!|4mT2?y6
zE!g=UuZ*tTtp&s4La`^C7!o!cCL|N}o~94d49&(}mV>YcTgbMMsh&V~?uFm6Q{u^f
zZH(d|fxc^HY3b)-rW^w3hfH51O?vrts|TJSjB#F^o+X&r*n?^SgL}xC|AT_Mv{(lBPPQ%
zS?;FBC5}wK0w2dT1o4s&`&DLCTwFbBUJUOppL%eCKf2|MI*Vq3ua;E`YS4$vUe=8}
zk_ng=2;#J{x3i5gL{-71!6R4%rs=KLzVv{~(DGhbhu_0X=zczjnwQfIn>0u^i8|9%
zxpK36-xSI*cCiuA4x9}k!=B1Niiy{eoH=yf@-x9=vR&oWiWCA+2*vT%kPnn0bY^iS
z8RrG~>bj~C?qqDbXTMHWBb5Gu&WYe@NLj6S4s>UFN7LVW$g{VeHmlfoXYw;wSg`qkV`<)>IO%0!fQgFZRpjV*BTi=|6IC@LDeY&q^CPuWao_l2hNwu!
zmrJ^C@0O&fI;t$&Vw2cEE6lPH^i7k37~-kP$jRKcHYiCDNRn0O0mZ}TX^n9f5!TB%
ziTJP+_k{@Q_{1}C+sN?E6^{A8SMEnlpateyWK8geyookHNrRS+@svi&|NTU#H~#h2
zO4nToy)vBh?ftV@X=5JbPt$Ar!SpokU{Km$GVtbaMni>RwG3dAUa1l>fp<#1;eczL
zQd?z_wp@SPs7%Xqi5f)`&0nFi(E8)$-do@TO>?@kY4e_@)gbJkv@^x&qa!x(rTZCG
zogagTc7(P^HQwpFf)?HKa*477A>_t}06e$?adJ8S-GpCR^5ybD9H+3JoWR0I?Y~~E
z_?}jug_YqcNk-PdP$Hdz`nj@T=)Ur@$)O6Wi+&1qO&ou$lF_ceR7w=7c)c`7RY|wl
zXA6A54}eD|$VBxfAZ-?C|EX_~_&Yh3(fZCrrG>Lh?Y1Z?!*~RLM&4v~N?jA>M}y`*
zM$Tl(50n%W94y5&MyNHU=a$JuGOdZ5-#r8~aL7HAw$ACvDY;JDX;+b=k)q)(XuN|w
z`ezZ=*>W;aCkwPz(VY4bPfnZX%@?MM4w8$|qxUmmsVzNUCo{$_SY=;TfTH`;_Xd?m
zWQLz+_F%SpNHcqRQ|*u0&Z-TuNkj6Dc}M8vyC(y(PAB$(pVm(o-4o-=-)dN1IGL~D
z`K-NkV*Q35GC(WoJ7Rh;=*a&jgVPygrLnOphgyvXVHe}B{@Sr=I({BB>n{AcR^I)z?w?Q6*nXAbkKAMSI?ag-m5tY&Z3~`n2L>JZ*jKfRTS{>8@pt!=);baDbhXZ{
zU<*qtr~Q4$q&t00N9^tI?W&mfsaJyU@ivsmeov`Kydvj3prY5G$yGViYoFTxhvw+1
z{+v6JbCJEOP?B1_7I;YcA9L}9*E0NAlHbvGPNz8|_-wai;f^7QcuM50RBdyUZ#{*1
z07u|qIS2vW+UwC`5Q;{8}%9p?SO_0;Sb)kA4XkuXh%PO5d
z98W+TEP^~w8~Q;*nyUP3vF7(pH4D-7N|9@YCdoLR9&WT^^vWGr_^(c?+3u9uKbXXa
z7DpK#-JXx<3|qP9NC{1*>C{j^<(aJ0=b##hDw-iWGQMwkK4`px?&*R)cDf}KzzH9)
z6RlBIT)KOsG^(zMY3~)!+7R5Kc~6xU4mnL=8m|%-HiGBR_6#(>h&ILMj|k7CMPCAgHO+9|r9Dsxh^*^7x^g3L?WJvF3lBnsP~ZeS
zbxLW)3Av3JJV%jk+x{J>-G6u2y^d4FMqS;rht+MKIBcAFsj&^Wz*u-#v{nB38UP-NxRE%>au4%sLoQs*4E%4FRah#=6b2u};7pNznw*7X05b<^OTAPlUJ_?MoSiz*Lh{>y|;)NCP_mEZ>dywx
zwI!4h;K>(05x#2LloOE1xu7Ne5Y^(JV0!9uxtAD{-Eltx()T#h#)R?{e=^dw`JVKW
zO}Gh7zg@9c3;ug6U~?F=4t9@wm2Qm*bR$x6k&gAWpNZVafR#m6x5RH%&cROvt6wJw
zg|Bkzr&R+_50-vR3ZdruNC8I!Ght4E8%)IBqDOV=YqqSn1VicCmmGhXZ~hd8*udm_
z@beMnGN+g-%FJ7SQeRoqL=$1KPf?FMahy!Up%h6_Rov)XGW$^{JXuj@oor8AQ~8J*
zT-jF(>{L{^tC|rlf7mx|EBO26Q=1P3O4`lK9%L%k6!hT&p>>54^GKj3f!awSRoDkk
zQ?}eYv8v@7VK;TD?`<<}fNl5~U=Z*T-fe}yK|xOG=j<-R&xk8sA^N&CGfEQ5`V+f!
zEtcjcaAsLpS(Sn}OMX5_XP$9=CkXHU*S=pcNFfboCa1gjuWas}N^tS%2^ORVkF9YPM}%&`w_a-mvtyI}a_dwft^^6$Y
z{nTuLmrTu7R#*J!)|&~Zoej#iv7N2|Oyc~FIwZfoU1ai`3-iuC6*O^@m5S?l7dTjL
z%&QS7ws4X9zbm5`_elqZzW|j
zY%S>QYE(kCa`s6U?1>m85es~3q;|0cqIBefn_hl{FqPTaWG7kjV!T#+EK{;rI@3}&
zV%8%dDeE6#-hIH+q$M##xU)Gx+cyV_xhvAg&oxb|UotwTk#j>b{*xb=K{$~Hg6en3
z!BlHEK4ov-d#DYJzwXuPSr=o8Ymkz%X3OgC)nb%Bae#f8DV_*4geov!ks`HE%)C9w5h{&6e?sK
zNVa-KJ6MBe(x*wq5sY_^=)C54e{--!e>O0BG&d(P56olXfNNi5J0H3hf7h&-se=S6
zj}S8T)f^lsU{=)kA_%E?<8Ek_E1B+08QUhqiqKWS3MPY$-Sn+<)l7fmdrV0|@!r)r
z(ZK5QmVJ>ooc^ItNx{GShfTlMsNxr7;X!dM{szSGTDf~Ubuwb>d15U14W
z8EoeK*4m;r(pi?}=pldiTriTYhkS9L$RgBn18Yc&DzE;=JThjNET4mo
z8@OS%d$3(_mNlH@K%-riC|_dj$MQ>p(z(J7>Rkrs(8E206(VKQ^;DV`MGH)lDz5rA
zOFO$b)uXr79m9`h3Nk+3f&bR~ut~fs%~WZ=XuPYf&4eB-P}X`I`>Uj=yShoY$9HaP7zjV?2Lawz{VFrLxjwbtESk$fWihp#`
zZ6Z^k<}*c6V^?#((|9mr7>c1d$#&TU7c(jxEM}>E>WtW3w#>M<#<5u`-?IIv>Xl?B3P8S&Z#+t-F-sWN
zq5j5BQmmV%Try({jeG{P2zA7Gy5Fmkii=9zbGD#kr|E5+GtIMQ2c-&|{y&ImBWAZ3
zr{uSj5l^&JYTt1Zm~lHN3!WS>oiMVy{r7ldFx|n|3f0-g&%G;NR&St78gA(2W=!E#
z&9AfxETo|+`)L{UwZf|COS;1jTEoG^$|?)gcXDG+mgpMmpG``cLT1J5`_ubhvOZ;Eb^-?IPpKvvN?HatyT@6!LOgY8
zJcN|T@oR~T;Re4_UiFW!%*uKwJLGAL=3~@*biZC9g$(cMW&Y-=wh6522J>pcE7K)b
zVDqT>J!igYF;KEHi&L0_g>X
zn;dPXI#eBwVx@HF|42CwJ~m@}d_v#^3i2*wP||!Xb~tV?|I+c|()R0z!(Wx1D~l^*
zi{Cpr^_-Y*?oUwti0AVaIz*EL6@#?ZUlELmE<^t#*>G)G+wJ=$vtMtrXL8d2etL#e
z`b+oI`k$+Yr>l%7)b8{BgUJ=t4)f-Qr_0sHz{}&Oi7vY~!{6&ksB{6l-63KTkPlW|E
zb9dHF6i3hTR=I^!bN|RC)|2Vikd*$nK}S_9!{m3{^_CQWRc<@Q;iENv%2SMy@h1IRl-VtmreN3J1X;kyO&03-Pax;?0^fZWztm@AQTv@JQ%j+62wr&p7dXJCdPm5kl!TTv@Z3QQ
zr2KGR35?Hzj|ix}q7mh&BAr1Do$erb!$dZI<9uu1h>^5}ly6-W)Re*T!@cX8Gpjsv13fGsk;5A!I5-|b=ED1#8SW)K9^g_Tizv+?)_}|Ex?z%YJ|GRG7pR+Q@*<0xd
z%-El7j*iXjamuImfkhm|w=n3%OSb!6M&Gz@%w7nv87@w}ir
zr>JkZURk4Gx#l7kJFu^M+#ZuUM&-GzJ0PPgeh>c+W*a8pT&r6Wn~)d*H+0g(hd81^
za*Xn{Qmn##V9XNsv=UvfT96`F_xuc=e4rL}Ce+eVoVLONv+
zA?}%hmpek26rftA18O71JU_8xB`^z9)=JeHM)J#_K~?FmAIU4~9cEvNaEjs{4g$NO
zsGw6PgB?5>Egs)7O8;U%0^9gCLx2xscgrRc7^Z(;q9{zMSE{vtdScofZ;)3OHyA`!I>kT
z8$1w>w((n1a>bTt2_^OM8%_$kV<=8S2H9J>32XbzCYQ&
z*iK~tqU0aNjAlTc&3H$zB^#K1$M4Vx2!}oXwnLS}zXUO=IDtf*gHUC~qb>f`a?X-l
z>DZ`mgkP5*%TBxt7jusAKhibeO$YH@+q>os(j!&i`+~`1>!I_)S9Kfp|9PL3ID{Vy
z@mDnDH&iyTtd|PfP9*TUtbQ`9S6yB12uvipVt%l8J!yH5F+Ov!*GMBfztg?9bC_(*
z;col)8(A9DZg?a`Jw35X9GuYC%62v@m=|P9gtVMd7X|vbV|^4Ac|)5?
z;Q!*Uvv>QmeMLqWn$zKZ%dNm0KiDKADj}*5FhatN=#`EEbO^CEebAOnYVOR}UvDPs
zw$*5*=?G}S2Va+KG>f;&x3YCv!9}*_W+%)+nWA2wE4?n3ND`8bv%ykeN84*EF7*<>
ztM={?N-!Tj`>ZE{GFWLSflm=c`bD%x1IGb9%KAuppf&A8aC5Rp3_{mEKB=OwxVY-=
z*w*uq+CG{5`_2Rxuq@RGP8-SGVI-u2BAwKT$hhiGdE8rsFC+HWNr1}>zCxELKTItJ;
zCpY!O@cNO=#x5Ve6g@jFw7QvI%YSV5x`QUVvyP(a*GyeF@947qa+DfyGKTT8NwVL_
z$zbq-XDcJ^+;S6+!@4!!(V;%)#WGv%$=@k+3f7|R#cPV0nj>G+GIC6d;|{hB??Wq-
zw>mf74uSqJI0^8Ai2PqY6__SbeIhBf@@(K6Z6CObz7pA-p%=OxaTFbSgL99nf)RXV
zb27Q2KR_k6o{4Y0E>ZlgN|F6W0LRP5fj8BIcVPA{Y~wtXX~t=pWf`v9agR?)(FqHK`kM^g>Ci(h
zX*F}!|9}SWoyo610{{NKeMwYmbiGrUSRj(WCrHnhqEf#dHa{orEg35F?}Nfo$KBP2
z_gq<0z;>41$;3bIG=;GWTMFb|yLSJ{et+F{$Ex(>`Cw?*^{x581^;(Su~E+vT;_vP
zjVigOkMlk+LqF|28s->M8~$IMuzQpIUL-I`at_ob$280{+eAPgf>bo
zc26Xwr%E@Q^jz)UpSBPnjA5M|qwmp##{?TK0bI-V8>P-q2hI;pV>nIdc|c5U7vY
zjJjl5zfM&QTw%Sp5*oOH2=bf;w19Cyb!ahM1KQi?W4ZNg+|W;)Y^;im;k&Gr3jgi}
zmF1o>RDV`eg9?Y___rK)Sy)ot(vXc?r>T3)(7R9T{W%|!)R6Z-6IUwM#5M%+H+}}j
z?u!~tjLu9|D!#-B*JrD4x}6$XZNM#J(rHw%8rm`&*v`c8t~2&=v!4OYyic+Q{3IJv
zjzc;46QI~wpC@ibyTLZ_kDSX$D8Jn;obyfK87I}3(FxUnxWQ|%m49j{hWt3=27+Jz
z4;