From c2c1823d2bd9bca260ea42f884e32554b82af48a Mon Sep 17 00:00:00 2001 From: WillemJiang Date: Wed, 4 Oct 2023 08:49:06 +0000 Subject: [PATCH] deploy: b67f6230965e94077f7d4bfaad2dc496d8f13ccf --- 404.html | 1 + categories/apache-skywalking/index.html | 2 + categories/apache-skywalking/index.xml | 1 + categories/apache-way/index.html | 28 + categories/apache-way/index.xml | 27 + categories/event/index.html | 9 + categories/event/index.xml | 7 + categories/index.html | 11 + categories/index.xml | 1 + categories/release/index.html | 2 + categories/release/index.xml | 2 + .../\344\274\240\346\222\255/index.html" | 23 + .../\344\274\240\346\222\255/index.xml" | 21 + .../\345\206\205\346\272\220/index.html" | 2 + .../\345\206\205\346\272\220/index.xml" | 2 + .../\345\215\232\345\256\242/index.html" | 3 + .../\345\215\232\345\256\242/index.xml" | 3 + .../\345\274\200\346\272\220/index.html" | 28 + .../\345\274\200\346\272\220/index.xml" | 26 + .../\346\222\255\345\256\242/index.html" | 17 + .../\346\222\255\345\256\242/index.xml" | 17 + .../\346\225\231\350\202\262/index.html" | 6 + .../\346\225\231\350\202\262/index.xml" | 6 + .../\346\234\254\345\234\237/index.html" | 9 + .../\346\234\254\345\234\237/index.xml" | 8 + css/all.css | 4616 ++++ css/fonts.css | 51 - css/katex.css | 1091 + css/main.css | 684 + css/normalize.css | 349 + css/style.css | 1 - fonts/libre-baskerville-v7-latin-700.eot | Bin 31987 -> 0 bytes fonts/libre-baskerville-v7-latin-700.svg | 443 - fonts/libre-baskerville-v7-latin-700.ttf | Bin 80204 -> 0 bytes fonts/libre-baskerville-v7-latin-700.woff | Bin 33816 -> 0 bytes fonts/libre-baskerville-v7-latin-700.woff2 | Bin 27932 -> 0 bytes fonts/libre-baskerville-v7-latin-italic.eot | Bin 35981 -> 0 bytes fonts/libre-baskerville-v7-latin-italic.svg | 482 - fonts/libre-baskerville-v7-latin-italic.ttf | Bin 81712 -> 0 bytes fonts/libre-baskerville-v7-latin-italic.woff | Bin 37348 -> 0 bytes fonts/libre-baskerville-v7-latin-italic.woff2 | Bin 30684 -> 0 bytes fonts/libre-baskerville-v7-latin-regular.eot | Bin 31161 -> 0 bytes fonts/libre-baskerville-v7-latin-regular.svg | 450 - fonts/libre-baskerville-v7-latin-regular.ttf | Bin 78732 -> 0 bytes fonts/libre-baskerville-v7-latin-regular.woff | Bin 33008 -> 0 bytes .../libre-baskerville-v7-latin-regular.woff2 | Bin 27108 -> 0 bytes images/ALCBejing-Avatar.png | Bin 0 -> 157986 bytes images/apple-touch-icon.png | Bin 1077 -> 0 bytes images/favicon-16x16.png | Bin 578 -> 0 bytes images/favicon-32x32.png | Bin 753 -> 0 bytes index.html | 40 +- index.xml | 576 +- js/auto-render.js | 327 + js/dark-mode.js | 32 + js/katex.js | 18050 ++++++++++++++++ page/10/index.html | 6 + page/11/index.html | 10 + page/12/index.html | 10 + page/13/index.html | 3 + page/2/index.html | 41 +- page/3/index.html | 30 +- page/4/index.html | 32 +- page/5/index.html | 38 +- page/6/index.html | 31 +- page/7/index.html | 10 +- page/8/index.html | 10 + page/9/index.html | 7 + post/alc-beijing-creation/index.html | 9 +- .../index.html | 8 +- .../apache-security-report/index.html | 8 +- .../index.html | 8 +- .../apache-downstream-mark-policy/index.html | 8 +- .../apache-mark-policy/index.html | 10 +- .../apache-website-mark-policy/index.html | 8 +- post/apache-policy/asf-mark-policy/index.html | 8 +- .../asf-release-notes/index.html | 10 +- .../apache-board-meeting/index.html | 10 +- .../incubator-cook-book-table/index.html | 8 +- .../apache-way/incubator-cook-book/index.html | 10 +- .../new-proposal-template-guide/index.html | 10 +- .../talk-to-apache-experts/index.html | 8 +- post/apache_corporate_organization/index.html | 8 +- post/apache_incubator_ip_policy/index.html | 11 +- .../index.html | 8 +- .../apachecon/apachecon-2020-guide/index.html | 14 +- .../apachecon-2020-mandarin-track/index.html | 14 +- .../index.html | 9 +- .../index.html | 12 +- .../index.html | 37 +- post/asf_incubator_process/index.html | 10 +- post/call_for_volunteer/index.html | 12 +- post/chaoss_meetup_sharing/index.html | 9 +- .../index.html | 9 +- .../index.html | 9 +- .../index.html | 9 +- .../index.html | 9 +- .../apachehome-shengwu-keynote/index.html | 9 +- .../index.html | 9 +- .../index.html | 9 +- .../index.html | 19 +- post/heros_journey_trista/index.html | 12 +- .../index.html | 20 +- post/how_to_be_a_successful_mentor/index.html | 11 +- post/index.html | 123 +- post/index.xml | 576 +- .../alc-beijing-member-ligang/index.html | 8 +- .../interview_with_rich_bown/index.html | 8 +- .../index.html | 10 +- .../index.html | 5 +- post/page/1/index.html | 1 - post/page/2/index.html | 34 - post/page/3/index.html | 19 - post/page/4/index.html | 23 - post/page/5/index.html | 30 - post/page/6/index.html | 23 - post/page/7/index.html | 4 - .../index.html | 8 +- .../index.html | 8 +- .../episode-1-talk-to-skywalking/index.html | 10 +- .../episode-10-inner-source-2/index.html | 9 +- .../index.html | 8 +- .../index.html | 8 +- .../index.html | 10 +- .../index.html | 8 +- .../index.html | 10 +- .../podcast/episode-5-inner-source/index.html | 8 +- .../episode-6-1-apache-iotdb/index.html | 10 +- .../episode-6-2-apache-iotdb/index.html | 8 +- post/podcast/episode-7-summer2020/index.html | 8 +- post/podcast/episode-8-echarts/index.html | 8 +- .../index.html | 8 +- .../index.html | 16 +- post/summer2020_activity_sharing/index.html | 8 +- post/summer2020_activity_sharing2/index.html | 8 +- .../index.html | 8 +- post/what_i_do_with_open_source/index.html | 8 +- post/what_is_the_apache_way/index.html | 10 +- robots.txt | 2 + series/index.html | 1 + series/index.xml | 1 + sitemap.xml | 2 +- .../index.html" | 17 + .../index.xml" | 17 + tags/alc-beijing/index.html | 3 + tags/alc-beijing/index.xml | 2 + tags/apache-blog/index.html | 3 + tags/apache-blog/index.xml | 3 + tags/apache-local-community/index.html | 8 + tags/apache-local-community/index.xml | 6 + tags/apache-local-communtiy/index.html | 3 + tags/apache-local-communtiy/index.xml | 3 + tags/apache-policy/index.html | 5 + tags/apache-policy/index.xml | 3 + tags/apache-way/index.html | 17 + tags/apache-way/index.xml | 9 + tags/apachecon/index.html | 15 + tags/apachecon/index.xml | 7 + tags/asf-ss/index.html | 3 + tags/asf-ss/index.xml | 2 + .../index.html" | 3 + .../index.xml" | 2 + .../index.html" | 3 + .../index.xml" | 2 + .../index.html" | 5 + .../index.xml" | 3 + tags/communityovercode/index.html | 9 + tags/communityovercode/index.xml | 4 + tags/index.html | 24 + tags/index.xml | 1 + tags/index/index.html | 3 + tags/index/index.xml | 1 + tags/member-story/index.html | 3 + tags/member-story/index.xml | 2 + tags/opensource/index.html | 5 + tags/opensource/index.xml | 2 + tags/release/index.html | 2 + tags/release/index.xml | 2 + .../index.html | 3 + .../index.xml | 2 + .../index.html" | 3 + .../index.xml" | 2 + "tags/\345\274\200\346\272\220/index.html" | 11 + "tags/\345\274\200\346\272\220/index.xml" | 6 + .../index.html" | 3 + .../index.xml" | 2 + .../index.html" | 3 + .../index.xml" | 2 + .../index.html" | 3 + .../index.xml" | 2 + .../index.html" | 3 + .../index.xml" | 2 + webfonts/KaTeX_AMS-Regular.woff | Bin 0 -> 36920 bytes webfonts/KaTeX_Caligraphic-Bold.woff | Bin 0 -> 9384 bytes webfonts/KaTeX_Caligraphic-Regular.woff | Bin 0 -> 9160 bytes webfonts/KaTeX_Fraktur-Bold.woff | Bin 0 -> 16216 bytes webfonts/KaTeX_Fraktur-Regular.woff | Bin 0 -> 15884 bytes webfonts/KaTeX_Main-Bold.woff | Bin 0 -> 35060 bytes webfonts/KaTeX_Main-BoldItalic.woff | Bin 0 -> 24504 bytes webfonts/KaTeX_Main-Italic.woff | Bin 0 -> 25360 bytes webfonts/KaTeX_Main-Regular.woff | Bin 0 -> 37864 bytes webfonts/KaTeX_Math-BoldItalic.woff | Bin 0 -> 23988 bytes webfonts/KaTeX_Math-Italic.woff | Bin 0 -> 24672 bytes webfonts/KaTeX_SansSerif-Bold.woff | Bin 0 -> 17988 bytes webfonts/KaTeX_SansSerif-Italic.woff | Bin 0 -> 17052 bytes webfonts/KaTeX_SansSerif-Regular.woff | Bin 0 -> 15724 bytes webfonts/KaTeX_Script-Regular.woff | Bin 0 -> 13000 bytes webfonts/KaTeX_Size1-Regular.woff | Bin 0 -> 6304 bytes webfonts/KaTeX_Size2-Regular.woff | Bin 0 -> 6016 bytes webfonts/KaTeX_Size3-Regular.woff | Bin 0 -> 4156 bytes webfonts/KaTeX_Size4-Regular.woff | Bin 0 -> 5828 bytes webfonts/KaTeX_Typewriter-Regular.woff | Bin 0 -> 19708 bytes webfonts/Roboto-Bold.woff | Bin 0 -> 69144 bytes webfonts/Roboto-Medium.woff | Bin 0 -> 70620 bytes webfonts/Roboto-Regular.woff | Bin 0 -> 74388 bytes webfonts/RobotoMono-Regular.woff | Bin 0 -> 26464 bytes webfonts/RobotoSlab-Regular.woff | Bin 0 -> 88232 bytes webfonts/fa-brands-400.woff | Bin 0 -> 90060 bytes webfonts/fa-regular-400.woff | Bin 0 -> 16276 bytes webfonts/fa-solid-900.woff | Bin 0 -> 101652 bytes 219 files changed, 26307 insertions(+), 3073 deletions(-) create mode 100644 404.html create mode 100644 categories/apache-skywalking/index.html create mode 100644 categories/apache-skywalking/index.xml create mode 100644 categories/apache-way/index.html create mode 100644 categories/apache-way/index.xml create mode 100644 categories/event/index.html create mode 100644 categories/event/index.xml create mode 100644 categories/index.html create mode 100644 categories/index.xml create mode 100644 categories/release/index.html create mode 100644 categories/release/index.xml create mode 100644 "categories/\344\274\240\346\222\255/index.html" create mode 100644 "categories/\344\274\240\346\222\255/index.xml" create mode 100644 "categories/\345\206\205\346\272\220/index.html" create mode 100644 "categories/\345\206\205\346\272\220/index.xml" create mode 100644 "categories/\345\215\232\345\256\242/index.html" create mode 100644 "categories/\345\215\232\345\256\242/index.xml" create mode 100644 "categories/\345\274\200\346\272\220/index.html" create mode 100644 "categories/\345\274\200\346\272\220/index.xml" create mode 100644 "categories/\346\222\255\345\256\242/index.html" create mode 100644 "categories/\346\222\255\345\256\242/index.xml" create mode 100644 "categories/\346\225\231\350\202\262/index.html" create mode 100644 "categories/\346\225\231\350\202\262/index.xml" create mode 100644 "categories/\346\234\254\345\234\237/index.html" create mode 100644 "categories/\346\234\254\345\234\237/index.xml" create mode 100644 css/all.css delete mode 100644 css/fonts.css create mode 100644 css/katex.css create mode 100644 css/main.css create mode 100644 css/normalize.css delete mode 100644 css/style.css delete mode 100644 fonts/libre-baskerville-v7-latin-700.eot delete mode 100644 fonts/libre-baskerville-v7-latin-700.svg delete mode 100644 fonts/libre-baskerville-v7-latin-700.ttf delete mode 100644 fonts/libre-baskerville-v7-latin-700.woff delete mode 100644 fonts/libre-baskerville-v7-latin-700.woff2 delete mode 100644 fonts/libre-baskerville-v7-latin-italic.eot delete mode 100644 fonts/libre-baskerville-v7-latin-italic.svg delete mode 100644 fonts/libre-baskerville-v7-latin-italic.ttf delete mode 100644 fonts/libre-baskerville-v7-latin-italic.woff delete mode 100644 fonts/libre-baskerville-v7-latin-italic.woff2 delete mode 100644 fonts/libre-baskerville-v7-latin-regular.eot delete mode 100644 fonts/libre-baskerville-v7-latin-regular.svg delete mode 100644 fonts/libre-baskerville-v7-latin-regular.ttf delete mode 100644 fonts/libre-baskerville-v7-latin-regular.woff delete mode 100644 fonts/libre-baskerville-v7-latin-regular.woff2 create mode 100644 images/ALCBejing-Avatar.png delete mode 100644 images/apple-touch-icon.png delete mode 100644 images/favicon-16x16.png delete mode 100644 images/favicon-32x32.png create mode 100644 js/auto-render.js create mode 100644 js/dark-mode.js create mode 100644 js/katex.js create mode 100644 page/10/index.html create mode 100644 page/11/index.html create mode 100644 page/12/index.html create mode 100644 page/13/index.html create mode 100644 page/8/index.html create mode 100644 page/9/index.html delete mode 100644 post/page/1/index.html delete mode 100644 post/page/2/index.html delete mode 100644 post/page/3/index.html delete mode 100644 post/page/4/index.html delete mode 100644 post/page/5/index.html delete mode 100644 post/page/6/index.html delete mode 100644 post/page/7/index.html create mode 100644 robots.txt create mode 100644 series/index.html create mode 100644 series/index.xml create mode 100644 "tags/alc-beijing-\346\222\255\345\256\242/index.html" create mode 100644 "tags/alc-beijing-\346\222\255\345\256\242/index.xml" create mode 100644 tags/alc-beijing/index.html create mode 100644 tags/alc-beijing/index.xml create mode 100644 tags/apache-blog/index.html create mode 100644 tags/apache-blog/index.xml create mode 100644 tags/apache-local-community/index.html create mode 100644 tags/apache-local-community/index.xml create mode 100644 tags/apache-local-communtiy/index.html create mode 100644 tags/apache-local-communtiy/index.xml create mode 100644 tags/apache-policy/index.html create mode 100644 tags/apache-policy/index.xml create mode 100644 tags/apache-way/index.html create mode 100644 tags/apache-way/index.xml create mode 100644 tags/apachecon/index.html create mode 100644 tags/apachecon/index.xml create mode 100644 tags/asf-ss/index.html create mode 100644 tags/asf-ss/index.xml create mode 100644 "tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.html" create mode 100644 "tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.xml" create mode 100644 "tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.html" create mode 100644 "tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.xml" create mode 100644 "tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.html" create mode 100644 "tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.xml" create mode 100644 tags/communityovercode/index.html create mode 100644 tags/communityovercode/index.xml create mode 100644 tags/index.html create mode 100644 tags/index.xml create mode 100644 tags/index/index.html create mode 100644 tags/index/index.xml create mode 100644 tags/member-story/index.html create mode 100644 tags/member-story/index.xml create mode 100644 tags/opensource/index.html create mode 100644 tags/opensource/index.xml create mode 100644 tags/release/index.html create mode 100644 tags/release/index.xml create mode 100644 tags/the-introduction-about-dolphinscheduler/index.html create mode 100644 tags/the-introduction-about-dolphinscheduler/index.xml create mode 100644 "tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.html" create mode 100644 "tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.xml" create mode 100644 "tags/\345\274\200\346\272\220/index.html" create mode 100644 "tags/\345\274\200\346\272\220/index.xml" create mode 100644 "tags/\345\277\227\346\204\277\350\200\205volunteer/index.html" create mode 100644 "tags/\345\277\227\346\204\277\350\200\205volunteer/index.xml" create mode 100644 "tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.html" create mode 100644 "tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.xml" create mode 100644 "tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.html" create mode 100644 "tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.xml" create mode 100644 "tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.html" create mode 100644 "tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.xml" create mode 100644 webfonts/KaTeX_AMS-Regular.woff create mode 100644 webfonts/KaTeX_Caligraphic-Bold.woff create mode 100644 webfonts/KaTeX_Caligraphic-Regular.woff create mode 100644 webfonts/KaTeX_Fraktur-Bold.woff create mode 100644 webfonts/KaTeX_Fraktur-Regular.woff create mode 100644 webfonts/KaTeX_Main-Bold.woff create mode 100644 webfonts/KaTeX_Main-BoldItalic.woff create mode 100644 webfonts/KaTeX_Main-Italic.woff create mode 100644 webfonts/KaTeX_Main-Regular.woff create mode 100644 webfonts/KaTeX_Math-BoldItalic.woff create mode 100644 webfonts/KaTeX_Math-Italic.woff create mode 100644 webfonts/KaTeX_SansSerif-Bold.woff create mode 100644 webfonts/KaTeX_SansSerif-Italic.woff create mode 100644 webfonts/KaTeX_SansSerif-Regular.woff create mode 100644 webfonts/KaTeX_Script-Regular.woff create mode 100644 webfonts/KaTeX_Size1-Regular.woff create mode 100644 webfonts/KaTeX_Size2-Regular.woff create mode 100644 webfonts/KaTeX_Size3-Regular.woff create mode 100644 webfonts/KaTeX_Size4-Regular.woff create mode 100644 webfonts/KaTeX_Typewriter-Regular.woff create mode 100644 webfonts/Roboto-Bold.woff create mode 100644 webfonts/Roboto-Medium.woff create mode 100644 webfonts/Roboto-Regular.woff create mode 100644 webfonts/RobotoMono-Regular.woff create mode 100644 webfonts/RobotoSlab-Regular.woff create mode 100644 webfonts/fa-brands-400.woff create mode 100644 webfonts/fa-regular-400.woff create mode 100644 webfonts/fa-solid-900.woff diff --git a/404.html b/404.html new file mode 100644 index 00000000..fc401e27 --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +404 Page not found | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

HTTP-404 Error

There is not content here.

\ No newline at end of file diff --git a/categories/apache-skywalking/index.html b/categories/apache-skywalking/index.html new file mode 100644 index 00000000..b628c86b --- /dev/null +++ b/categories/apache-skywalking/index.html @@ -0,0 +1,2 @@ +Apache SkyWalking | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

Apache sky walking

\ No newline at end of file diff --git a/categories/apache-skywalking/index.xml b/categories/apache-skywalking/index.xml new file mode 100644 index 00000000..d39095c6 --- /dev/null +++ b/categories/apache-skywalking/index.xml @@ -0,0 +1 @@ +Apache SkyWalking on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/apache-skywalking/Recent content in Apache SkyWalking on alc-beijing.github.ioHugo -- gohugo.ioen-usMon, 16 Nov 2020 18:45:20 +0800亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/ \ No newline at end of file diff --git a/categories/apache-way/index.html b/categories/apache-way/index.html new file mode 100644 index 00000000..c646a4f8 --- /dev/null +++ b/categories/apache-way/index.html @@ -0,0 +1,28 @@ +Apache way | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

Apache way

\ No newline at end of file diff --git a/categories/apache-way/index.xml b/categories/apache-way/index.xml new file mode 100644 index 00000000..71aca1cc --- /dev/null +++ b/categories/apache-way/index.xml @@ -0,0 +1,27 @@ +Apache way on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/apache-way/Recent content in Apache way on alc-beijing.github.ioHugo -- gohugo.ioen-usFri, 07 Apr 2023 17:07:07 +0800【Release】ASF 孵化项目发版常见问题https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/ +对于每个初入 ASF 的项目来说,第一次发版都会多少遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/ +在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/ +本期节目中, ALC Beijing 邀请到了两位在校大学生同学来她们在开源社区中所做的非代码贡献,以及它们在社区中的成长故事。ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/ +这次 ALC Beijing 特别邀请到了在Apache ECharts PMC同学来分析Apache孵化的心路历程。ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/ +这次 ALC Beijing 特别邀请到了在“点亮计划暑期2020”新晋成为Apache Committer的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程。ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/ +随着开源的发展,越来越多企业开始把开源的最佳实践应用到企业内部开发。今天我们就跟大家聊一下这一有趣的现象 InnerSource。增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/ +在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/ +Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/ +这个系列会为大家带来不一样的体验,针对ALC Beijing 成员的采访,让你了解ALC Beijing 的初心以及蓝图。 Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/ +Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/ +Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/ +Apache 本土共同体部分成员的自我介绍,以及他们对这个组织的期望,当然了现在做的事情也非常值得说明。Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/ +ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。 \ No newline at end of file diff --git a/categories/event/index.html b/categories/event/index.html new file mode 100644 index 00000000..2b86655b --- /dev/null +++ b/categories/event/index.html @@ -0,0 +1,9 @@ +Event | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

Event

\ No newline at end of file diff --git a/categories/event/index.xml b/categories/event/index.xml new file mode 100644 index 00000000..f81c8f44 --- /dev/null +++ b/categories/event/index.xml @@ -0,0 +1,7 @@ +Event on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/event/Recent content in Event on alc-beijing.github.ioHugo -- gohugo.ioen-usTue, 08 Dec 2020 11:22:56 +0800ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 00000000..4d3f5919 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,11 @@ +Categories | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

Categories

\ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml new file mode 100644 index 00000000..bd59cf75 --- /dev/null +++ b/categories/index.xml @@ -0,0 +1 @@ +Categories on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/Recent content in Categories on alc-beijing.github.ioHugo -- gohugo.ioen-usFri, 07 Apr 2023 17:07:07 +0800Apache wayhttps://alc-beijing.github.io/alc-site/categories/apache-way/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/categories/apache-way/Releasehttps://alc-beijing.github.io/alc-site/categories/release/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/categories/release/传播https://alc-beijing.github.io/alc-site/categories/%E4%BC%A0%E6%92%AD/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/categories/%E4%BC%A0%E6%92%AD/博客https://alc-beijing.github.io/alc-site/categories/%E5%8D%9A%E5%AE%A2/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/categories/%E5%8D%9A%E5%AE%A2/开源https://alc-beijing.github.io/alc-site/categories/%E5%BC%80%E6%BA%90/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/categories/%E5%BC%80%E6%BA%90/播客https://alc-beijing.github.io/alc-site/categories/%E6%92%AD%E5%AE%A2/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/categories/%E6%92%AD%E5%AE%A2/教育https://alc-beijing.github.io/alc-site/categories/%E6%95%99%E8%82%B2/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/categories/%E6%95%99%E8%82%B2/内源https://alc-beijing.github.io/alc-site/categories/%E5%86%85%E6%BA%90/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/categories/%E5%86%85%E6%BA%90/Eventhttps://alc-beijing.github.io/alc-site/categories/event/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/categories/event/本土https://alc-beijing.github.io/alc-site/categories/%E6%9C%AC%E5%9C%9F/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/categories/%E6%9C%AC%E5%9C%9F/Apache SkyWalkinghttps://alc-beijing.github.io/alc-site/categories/apache-skywalking/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/categories/apache-skywalking/ \ No newline at end of file diff --git a/categories/release/index.html b/categories/release/index.html new file mode 100644 index 00000000..e4f31a70 --- /dev/null +++ b/categories/release/index.html @@ -0,0 +1,2 @@ +Release | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

Release

\ No newline at end of file diff --git a/categories/release/index.xml b/categories/release/index.xml new file mode 100644 index 00000000..f725baad --- /dev/null +++ b/categories/release/index.xml @@ -0,0 +1,2 @@ +Release on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/release/Recent content in Release on alc-beijing.github.ioHugo -- gohugo.ioen-usFri, 07 Apr 2023 17:07:07 +0800【Release】ASF 孵化项目发版常见问题https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/ +对于每个初入 ASF 的项目来说,第一次发版都会多少遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表 \ No newline at end of file diff --git "a/categories/\344\274\240\346\222\255/index.html" "b/categories/\344\274\240\346\222\255/index.html" new file mode 100644 index 00000000..dac7f912 --- /dev/null +++ "b/categories/\344\274\240\346\222\255/index.html" @@ -0,0 +1,23 @@ +传播 | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

传播

\ No newline at end of file diff --git "a/categories/\344\274\240\346\222\255/index.xml" "b/categories/\344\274\240\346\222\255/index.xml" new file mode 100644 index 00000000..90aadb16 --- /dev/null +++ "b/categories/\344\274\240\346\222\255/index.xml" @@ -0,0 +1,21 @@ +传播 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/%E4%BC%A0%E6%92%AD/Recent content in 传播 on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 12 Jan 2022 16:06:05 +0800【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/ +随着开源的发展,越来越多企业开始把开源的最佳实践应用到企业内部开发。今天我们就跟大家聊一下这一有趣的现象 InnerSource。增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/ +在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/ +Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/ +这个系列会为大家带来不一样的体验,针对ALC Beijing 成员的采访,让你了解ALC Beijing 的初心以及蓝图。 Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/ +Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/ +Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/ +Apache 本土共同体部分成员的自我介绍,以及他们对这个组织的期望,当然了现在做的事情也非常值得说明。Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/ +ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。 \ No newline at end of file diff --git "a/categories/\345\206\205\346\272\220/index.html" "b/categories/\345\206\205\346\272\220/index.html" new file mode 100644 index 00000000..0a93027a --- /dev/null +++ "b/categories/\345\206\205\346\272\220/index.html" @@ -0,0 +1,2 @@ +内源 | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

内源

\ No newline at end of file diff --git "a/categories/\345\206\205\346\272\220/index.xml" "b/categories/\345\206\205\346\272\220/index.xml" new file mode 100644 index 00000000..5954d3f5 --- /dev/null +++ "b/categories/\345\206\205\346\272\220/index.xml" @@ -0,0 +1,2 @@ +内源 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/%E5%86%85%E6%BA%90/Recent content in 内源 on alc-beijing.github.ioHugo -- gohugo.ioen-usMon, 03 May 2021 20:00:00 +0800ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。 \ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242/index.html" "b/categories/\345\215\232\345\256\242/index.html" new file mode 100644 index 00000000..9af240c1 --- /dev/null +++ "b/categories/\345\215\232\345\256\242/index.html" @@ -0,0 +1,3 @@ +博客 | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

博客

\ No newline at end of file diff --git "a/categories/\345\215\232\345\256\242/index.xml" "b/categories/\345\215\232\345\256\242/index.xml" new file mode 100644 index 00000000..0d141cc4 --- /dev/null +++ "b/categories/\345\215\232\345\256\242/index.xml" @@ -0,0 +1,3 @@ +博客 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/%E5%8D%9A%E5%AE%A2/Recent content in 博客 on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 12 Jan 2022 16:06:05 +0800【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。 \ No newline at end of file diff --git "a/categories/\345\274\200\346\272\220/index.html" "b/categories/\345\274\200\346\272\220/index.html" new file mode 100644 index 00000000..909e36b5 --- /dev/null +++ "b/categories/\345\274\200\346\272\220/index.html" @@ -0,0 +1,28 @@ +开源 | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

开源

\ No newline at end of file diff --git "a/categories/\345\274\200\346\272\220/index.xml" "b/categories/\345\274\200\346\272\220/index.xml" new file mode 100644 index 00000000..901c98da --- /dev/null +++ "b/categories/\345\274\200\346\272\220/index.xml" @@ -0,0 +1,26 @@ +开源 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/%E5%BC%80%E6%BA%90/Recent content in 开源 on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 12 Jan 2022 16:06:05 +0800【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/ +在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/ +本期节目中, ALC Beijing 邀请到了两位在校大学生同学来她们在开源社区中所做的非代码贡献,以及它们在社区中的成长故事。ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/ +这次 ALC Beijing 特别邀请到了在Apache ECharts PMC同学来分析Apache孵化的心路历程。ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/ +这次 ALC Beijing 特别邀请到了在“点亮计划暑期2020”新晋成为Apache Committer的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程。ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/ +随着开源的发展,越来越多企业开始把开源的最佳实践应用到企业内部开发。今天我们就跟大家聊一下这一有趣的现象 InnerSource。增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/ +在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/ +Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/ +这个系列会为大家带来不一样的体验,针对ALC Beijing 成员的采访,让你了解ALC Beijing 的初心以及蓝图。 Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/ +Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/ +Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/ +Apache 本土共同体部分成员的自我介绍,以及他们对这个组织的期望,当然了现在做的事情也非常值得说明。Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/ +ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。 \ No newline at end of file diff --git "a/categories/\346\222\255\345\256\242/index.html" "b/categories/\346\222\255\345\256\242/index.html" new file mode 100644 index 00000000..c132eb6c --- /dev/null +++ "b/categories/\346\222\255\345\256\242/index.html" @@ -0,0 +1,17 @@ +播客 | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

播客

\ No newline at end of file diff --git "a/categories/\346\222\255\345\256\242/index.xml" "b/categories/\346\222\255\345\256\242/index.xml" new file mode 100644 index 00000000..abf6a469 --- /dev/null +++ "b/categories/\346\222\255\345\256\242/index.xml" @@ -0,0 +1,17 @@ +播客 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/%E6%92%AD%E5%AE%A2/Recent content in 播客 on alc-beijing.github.ioHugo -- gohugo.ioen-usSun, 29 Aug 2021 20:00:00 +0800ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/ +在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/ +本期节目中, ALC Beijing 邀请到了两位在校大学生同学来她们在开源社区中所做的非代码贡献,以及它们在社区中的成长故事。ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/ +这次 ALC Beijing 特别邀请到了在Apache ECharts PMC同学来分析Apache孵化的心路历程。ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/ +这次 ALC Beijing 特别邀请到了在“点亮计划暑期2020”新晋成为Apache Committer的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程。ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/ +随着开源的发展,越来越多企业开始把开源的最佳实践应用到企业内部开发。今天我们就跟大家聊一下这一有趣的现象 InnerSource。ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/ +在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/ +Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/ +这个系列会为大家带来不一样的体验,针对ALC Beijing 成员的采访,让你了解ALC Beijing 的初心以及蓝图。 Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/ +Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/ +Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/ +ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。 \ No newline at end of file diff --git "a/categories/\346\225\231\350\202\262/index.html" "b/categories/\346\225\231\350\202\262/index.html" new file mode 100644 index 00000000..44529a32 --- /dev/null +++ "b/categories/\346\225\231\350\202\262/index.html" @@ -0,0 +1,6 @@ +教育 | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

教育

\ No newline at end of file diff --git "a/categories/\346\225\231\350\202\262/index.xml" "b/categories/\346\225\231\350\202\262/index.xml" new file mode 100644 index 00000000..db986d89 --- /dev/null +++ "b/categories/\346\225\231\350\202\262/index.xml" @@ -0,0 +1,6 @@ +教育 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/%E6%95%99%E8%82%B2/Recent content in 教育 on alc-beijing.github.ioHugo -- gohugo.ioen-usSun, 29 Aug 2021 20:00:00 +0800ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/ +在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/ +本期节目中, ALC Beijing 邀请到了两位在校大学生同学来她们在开源社区中所做的非代码贡献,以及它们在社区中的成长故事。ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/ +这次 ALC Beijing 特别邀请到了在Apache ECharts PMC同学来分析Apache孵化的心路历程。ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/ +这次 ALC Beijing 特别邀请到了在“点亮计划暑期2020”新晋成为Apache Committer的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程。 \ No newline at end of file diff --git "a/categories/\346\234\254\345\234\237/index.html" "b/categories/\346\234\254\345\234\237/index.html" new file mode 100644 index 00000000..503f3cf6 --- /dev/null +++ "b/categories/\346\234\254\345\234\237/index.html" @@ -0,0 +1,9 @@ +本土 | ALC Beijing 博客
ALC Beijing 博客

介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

本土

\ No newline at end of file diff --git "a/categories/\346\234\254\345\234\237/index.xml" "b/categories/\346\234\254\345\234\237/index.xml" new file mode 100644 index 00000000..4389bed6 --- /dev/null +++ "b/categories/\346\234\254\345\234\237/index.xml" @@ -0,0 +1,8 @@ +本土 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/categories/%E6%9C%AC%E5%9C%9F/Recent content in 本土 on alc-beijing.github.ioHugo -- gohugo.ioen-usTue, 08 Dec 2020 11:22:56 +0800ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/ +Apache 本土共同体部分成员的自我介绍,以及他们对这个组织的期望,当然了现在做的事情也非常值得说明。 \ No newline at end of file diff --git a/css/all.css b/css/all.css new file mode 100644 index 00000000..73cbacce --- /dev/null +++ b/css/all.css @@ -0,0 +1,4616 @@ +/*! + * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa, +.fas, +.far, +.fal, +.fad, +.fab { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-style: normal; + font-variant: normal; + text-rendering: auto; + line-height: 1; } + +.fa-lg { + font-size: 1.33333em; + line-height: 0.75em; + vertical-align: -.0667em; } + +.fa-xs { + font-size: .75em; } + +.fa-sm { + font-size: .875em; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: 2.5em; + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: -2em; + position: absolute; + text-align: center; + width: 2em; + line-height: inherit; } + +.fa-border { + border: solid 0.08em #eee; + border-radius: .1em; + padding: .2em .25em .15em; } + +.fa-pull-left { + float: left; } + +.fa-pull-right { + float: right; } + +.fa.fa-pull-left, +.fas.fa-pull-left, +.far.fa-pull-left, +.fal.fa-pull-left, +.fab.fa-pull-left { + margin-right: .3em; } + +.fa.fa-pull-right, +.fas.fa-pull-right, +.far.fa-pull-right, +.fal.fa-pull-right, +.fab.fa-pull-right { + margin-left: .3em; } + +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; } + +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical, +:root .fa-flip-both { + -webkit-filter: none; + filter: none; } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: #fff; } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-500px:before { + content: "\f26e"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-acquisitions-incorporated:before { + content: "\f6af"; } + +.fa-ad:before { + content: "\f641"; } + +.fa-address-book:before { + content: "\f2b9"; } + +.fa-address-card:before { + content: "\f2bb"; } + +.fa-adjust:before { + content: "\f042"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-air-freshener:before { + content: "\f5d0"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-align-center:before { + content: "\f037"; } + +.fa-align-justify:before { + content: "\f039"; } + +.fa-align-left:before { + content: "\f036"; } + +.fa-align-right:before { + content: "\f038"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-allergies:before { + content: "\f461"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-ambulance:before { + content: "\f0f9"; } + +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-anchor:before { + content: "\f13d"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-angle-double-down:before { + content: "\f103"; } + +.fa-angle-double-left:before { + content: "\f100"; } + +.fa-angle-double-right:before { + content: "\f101"; } + +.fa-angle-double-up:before { + content: "\f102"; } + +.fa-angle-down:before { + content: "\f107"; } + +.fa-angle-left:before { + content: "\f104"; } + +.fa-angle-right:before { + content: "\f105"; } + +.fa-angle-up:before { + content: "\f106"; } + +.fa-angry:before { + content: "\f556"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-ankh:before { + content: "\f644"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-apple-alt:before { + content: "\f5d1"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-archive:before { + content: "\f187"; } + +.fa-archway:before { + content: "\f557"; } + +.fa-arrow-alt-circle-down:before { + content: "\f358"; } + +.fa-arrow-alt-circle-left:before { + content: "\f359"; } + +.fa-arrow-alt-circle-right:before { + content: "\f35a"; } + +.fa-arrow-alt-circle-up:before { + content: "\f35b"; } + +.fa-arrow-circle-down:before { + content: "\f0ab"; } + +.fa-arrow-circle-left:before { + content: "\f0a8"; } + +.fa-arrow-circle-right:before { + content: "\f0a9"; } + +.fa-arrow-circle-up:before { + content: "\f0aa"; } + +.fa-arrow-down:before { + content: "\f063"; } + +.fa-arrow-left:before { + content: "\f060"; } + +.fa-arrow-right:before { + content: "\f061"; } + +.fa-arrow-up:before { + content: "\f062"; } + +.fa-arrows-alt:before { + content: "\f0b2"; } + +.fa-arrows-alt-h:before { + content: "\f337"; } + +.fa-arrows-alt-v:before { + content: "\f338"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-assistive-listening-systems:before { + content: "\f2a2"; } + +.fa-asterisk:before { + content: "\f069"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-at:before { + content: "\f1fa"; } + +.fa-atlas:before { + content: "\f558"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-atom:before { + content: "\f5d2"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-audio-description:before { + content: "\f29e"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-award:before { + content: "\f559"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-baby:before { + content: "\f77c"; } + +.fa-baby-carriage:before { + content: "\f77d"; } + +.fa-backspace:before { + content: "\f55a"; } + +.fa-backward:before { + content: "\f04a"; } + +.fa-bacon:before { + content: "\f7e5"; } + +.fa-bacteria:before { + content: "\e059"; } + +.fa-bacterium:before { + content: "\e05a"; } + +.fa-bahai:before { + content: "\f666"; } + +.fa-balance-scale:before { + content: "\f24e"; } + +.fa-balance-scale-left:before { + content: "\f515"; } + +.fa-balance-scale-right:before { + content: "\f516"; } + +.fa-ban:before { + content: "\f05e"; } + +.fa-band-aid:before { + content: "\f462"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-barcode:before { + content: "\f02a"; } + +.fa-bars:before { + content: "\f0c9"; } + +.fa-baseball-ball:before { + content: "\f433"; } + +.fa-basketball-ball:before { + content: "\f434"; } + +.fa-bath:before { + content: "\f2cd"; } + +.fa-battery-empty:before { + content: "\f244"; } + +.fa-battery-full:before { + content: "\f240"; } + +.fa-battery-half:before { + content: "\f242"; } + +.fa-battery-quarter:before { + content: "\f243"; } + +.fa-battery-three-quarters:before { + content: "\f241"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-bed:before { + content: "\f236"; } + +.fa-beer:before { + content: "\f0fc"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-bell:before { + content: "\f0f3"; } + +.fa-bell-slash:before { + content: "\f1f6"; } + +.fa-bezier-curve:before { + content: "\f55b"; } + +.fa-bible:before { + content: "\f647"; } + +.fa-bicycle:before { + content: "\f206"; } + +.fa-biking:before { + content: "\f84a"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-binoculars:before { + content: "\f1e5"; } + +.fa-biohazard:before { + content: "\f780"; } + +.fa-birthday-cake:before { + content: "\f1fd"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-blender:before { + content: "\f517"; } + +.fa-blender-phone:before { + content: "\f6b6"; } + +.fa-blind:before { + content: "\f29d"; } + +.fa-blog:before { + content: "\f781"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-bold:before { + content: "\f032"; } + +.fa-bolt:before { + content: "\f0e7"; } + +.fa-bomb:before { + content: "\f1e2"; } + +.fa-bone:before { + content: "\f5d7"; } + +.fa-bong:before { + content: "\f55c"; } + +.fa-book:before { + content: "\f02d"; } + +.fa-book-dead:before { + content: "\f6b7"; } + +.fa-book-medical:before { + content: "\f7e6"; } + +.fa-book-open:before { + content: "\f518"; } + +.fa-book-reader:before { + content: "\f5da"; } + +.fa-bookmark:before { + content: "\f02e"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-border-all:before { + content: "\f84c"; } + +.fa-border-none:before { + content: "\f850"; } + +.fa-border-style:before { + content: "\f853"; } + +.fa-bowling-ball:before { + content: "\f436"; } + +.fa-box:before { + content: "\f466"; } + +.fa-box-open:before { + content: "\f49e"; } + +.fa-box-tissue:before { + content: "\e05b"; } + +.fa-boxes:before { + content: "\f468"; } + +.fa-braille:before { + content: "\f2a1"; } + +.fa-brain:before { + content: "\f5dc"; } + +.fa-bread-slice:before { + content: "\f7ec"; } + +.fa-briefcase:before { + content: "\f0b1"; } + +.fa-briefcase-medical:before { + content: "\f469"; } + +.fa-broadcast-tower:before { + content: "\f519"; } + +.fa-broom:before { + content: "\f51a"; } + +.fa-brush:before { + content: "\f55d"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-bug:before { + content: "\f188"; } + +.fa-building:before { + content: "\f1ad"; } + +.fa-bullhorn:before { + content: "\f0a1"; } + +.fa-bullseye:before { + content: "\f140"; } + +.fa-burn:before { + content: "\f46a"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-bus:before { + content: "\f207"; } + +.fa-bus-alt:before { + content: "\f55e"; } + +.fa-business-time:before { + content: "\f64a"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-calculator:before { + content: "\f1ec"; } + +.fa-calendar:before { + content: "\f133"; } + +.fa-calendar-alt:before { + content: "\f073"; } + +.fa-calendar-check:before { + content: "\f274"; } + +.fa-calendar-day:before { + content: "\f783"; } + +.fa-calendar-minus:before { + content: "\f272"; } + +.fa-calendar-plus:before { + content: "\f271"; } + +.fa-calendar-times:before { + content: "\f273"; } + +.fa-calendar-week:before { + content: "\f784"; } + +.fa-camera:before { + content: "\f030"; } + +.fa-camera-retro:before { + content: "\f083"; } + +.fa-campground:before { + content: "\f6bb"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-candy-cane:before { + content: "\f786"; } + +.fa-cannabis:before { + content: "\f55f"; } + +.fa-capsules:before { + content: "\f46b"; } + +.fa-car:before { + content: "\f1b9"; } + +.fa-car-alt:before { + content: "\f5de"; } + +.fa-car-battery:before { + content: "\f5df"; } + +.fa-car-crash:before { + content: "\f5e1"; } + +.fa-car-side:before { + content: "\f5e4"; } + +.fa-caravan:before { + content: "\f8ff"; } + +.fa-caret-down:before { + content: "\f0d7"; } + +.fa-caret-left:before { + content: "\f0d9"; } + +.fa-caret-right:before { + content: "\f0da"; } + +.fa-caret-square-down:before { + content: "\f150"; } + +.fa-caret-square-left:before { + content: "\f191"; } + +.fa-caret-square-right:before { + content: "\f152"; } + +.fa-caret-square-up:before { + content: "\f151"; } + +.fa-caret-up:before { + content: "\f0d8"; } + +.fa-carrot:before { + content: "\f787"; } + +.fa-cart-arrow-down:before { + content: "\f218"; } + +.fa-cart-plus:before { + content: "\f217"; } + +.fa-cash-register:before { + content: "\f788"; } + +.fa-cat:before { + content: "\f6be"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-certificate:before { + content: "\f0a3"; } + +.fa-chair:before { + content: "\f6c0"; } + +.fa-chalkboard:before { + content: "\f51b"; } + +.fa-chalkboard-teacher:before { + content: "\f51c"; } + +.fa-charging-station:before { + content: "\f5e7"; } + +.fa-chart-area:before { + content: "\f1fe"; } + +.fa-chart-bar:before { + content: "\f080"; } + +.fa-chart-line:before { + content: "\f201"; } + +.fa-chart-pie:before { + content: "\f200"; } + +.fa-check:before { + content: "\f00c"; } + +.fa-check-circle:before { + content: "\f058"; } + +.fa-check-double:before { + content: "\f560"; } + +.fa-check-square:before { + content: "\f14a"; } + +.fa-cheese:before { + content: "\f7ef"; } + +.fa-chess:before { + content: "\f439"; } + +.fa-chess-bishop:before { + content: "\f43a"; } + +.fa-chess-board:before { + content: "\f43c"; } + +.fa-chess-king:before { + content: "\f43f"; } + +.fa-chess-knight:before { + content: "\f441"; } + +.fa-chess-pawn:before { + content: "\f443"; } + +.fa-chess-queen:before { + content: "\f445"; } + +.fa-chess-rook:before { + content: "\f447"; } + +.fa-chevron-circle-down:before { + content: "\f13a"; } + +.fa-chevron-circle-left:before { + content: "\f137"; } + +.fa-chevron-circle-right:before { + content: "\f138"; } + +.fa-chevron-circle-up:before { + content: "\f139"; } + +.fa-chevron-down:before { + content: "\f078"; } + +.fa-chevron-left:before { + content: "\f053"; } + +.fa-chevron-right:before { + content: "\f054"; } + +.fa-chevron-up:before { + content: "\f077"; } + +.fa-child:before { + content: "\f1ae"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-church:before { + content: "\f51d"; } + +.fa-circle:before { + content: "\f111"; } + +.fa-circle-notch:before { + content: "\f1ce"; } + +.fa-city:before { + content: "\f64f"; } + +.fa-clinic-medical:before { + content: "\f7f2"; } + +.fa-clipboard:before { + content: "\f328"; } + +.fa-clipboard-check:before { + content: "\f46c"; } + +.fa-clipboard-list:before { + content: "\f46d"; } + +.fa-clock:before { + content: "\f017"; } + +.fa-clone:before { + content: "\f24d"; } + +.fa-closed-captioning:before { + content: "\f20a"; } + +.fa-cloud:before { + content: "\f0c2"; } + +.fa-cloud-download-alt:before { + content: "\f381"; } + +.fa-cloud-meatball:before { + content: "\f73b"; } + +.fa-cloud-moon:before { + content: "\f6c3"; } + +.fa-cloud-moon-rain:before { + content: "\f73c"; } + +.fa-cloud-rain:before { + content: "\f73d"; } + +.fa-cloud-showers-heavy:before { + content: "\f740"; } + +.fa-cloud-sun:before { + content: "\f6c4"; } + +.fa-cloud-sun-rain:before { + content: "\f743"; } + +.fa-cloud-upload-alt:before { + content: "\f382"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-cocktail:before { + content: "\f561"; } + +.fa-code:before { + content: "\f121"; } + +.fa-code-branch:before { + content: "\f126"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-coffee:before { + content: "\f0f4"; } + +.fa-cog:before { + content: "\f013"; } + +.fa-cogs:before { + content: "\f085"; } + +.fa-coins:before { + content: "\f51e"; } + +.fa-columns:before { + content: "\f0db"; } + +.fa-comment:before { + content: "\f075"; } + +.fa-comment-alt:before { + content: "\f27a"; } + +.fa-comment-dollar:before { + content: "\f651"; } + +.fa-comment-dots:before { + content: "\f4ad"; } + +.fa-comment-medical:before { + content: "\f7f5"; } + +.fa-comment-slash:before { + content: "\f4b3"; } + +.fa-comments:before { + content: "\f086"; } + +.fa-comments-dollar:before { + content: "\f653"; } + +.fa-compact-disc:before { + content: "\f51f"; } + +.fa-compass:before { + content: "\f14e"; } + +.fa-compress:before { + content: "\f066"; } + +.fa-compress-alt:before { + content: "\f422"; } + +.fa-compress-arrows-alt:before { + content: "\f78c"; } + +.fa-concierge-bell:before { + content: "\f562"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-cookie:before { + content: "\f563"; } + +.fa-cookie-bite:before { + content: "\f564"; } + +.fa-copy:before { + content: "\f0c5"; } + +.fa-copyright:before { + content: "\f1f9"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-couch:before { + content: "\f4b8"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-credit-card:before { + content: "\f09d"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-crop:before { + content: "\f125"; } + +.fa-crop-alt:before { + content: "\f565"; } + +.fa-cross:before { + content: "\f654"; } + +.fa-crosshairs:before { + content: "\f05b"; } + +.fa-crow:before { + content: "\f520"; } + +.fa-crown:before { + content: "\f521"; } + +.fa-crutch:before { + content: "\f7f7"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-cube:before { + content: "\f1b2"; } + +.fa-cubes:before { + content: "\f1b3"; } + +.fa-cut:before { + content: "\f0c4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-database:before { + content: "\f1c0"; } + +.fa-deaf:before { + content: "\f2a4"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-democrat:before { + content: "\f747"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-desktop:before { + content: "\f108"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-dharmachakra:before { + content: "\f655"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-diagnoses:before { + content: "\f470"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-dice:before { + content: "\f522"; } + +.fa-dice-d20:before { + content: "\f6cf"; } + +.fa-dice-d6:before { + content: "\f6d1"; } + +.fa-dice-five:before { + content: "\f523"; } + +.fa-dice-four:before { + content: "\f524"; } + +.fa-dice-one:before { + content: "\f525"; } + +.fa-dice-six:before { + content: "\f526"; } + +.fa-dice-three:before { + content: "\f527"; } + +.fa-dice-two:before { + content: "\f528"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-digital-tachograph:before { + content: "\f566"; } + +.fa-directions:before { + content: "\f5eb"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-disease:before { + content: "\f7fa"; } + +.fa-divide:before { + content: "\f529"; } + +.fa-dizzy:before { + content: "\f567"; } + +.fa-dna:before { + content: "\f471"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-dog:before { + content: "\f6d3"; } + +.fa-dollar-sign:before { + content: "\f155"; } + +.fa-dolly:before { + content: "\f472"; } + +.fa-dolly-flatbed:before { + content: "\f474"; } + +.fa-donate:before { + content: "\f4b9"; } + +.fa-door-closed:before { + content: "\f52a"; } + +.fa-door-open:before { + content: "\f52b"; } + +.fa-dot-circle:before { + content: "\f192"; } + +.fa-dove:before { + content: "\f4ba"; } + +.fa-download:before { + content: "\f019"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-drafting-compass:before { + content: "\f568"; } + +.fa-dragon:before { + content: "\f6d5"; } + +.fa-draw-polygon:before { + content: "\f5ee"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-drum:before { + content: "\f569"; } + +.fa-drum-steelpan:before { + content: "\f56a"; } + +.fa-drumstick-bite:before { + content: "\f6d7"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-dumbbell:before { + content: "\f44b"; } + +.fa-dumpster:before { + content: "\f793"; } + +.fa-dumpster-fire:before { + content: "\f794"; } + +.fa-dungeon:before { + content: "\f6d9"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-edit:before { + content: "\f044"; } + +.fa-egg:before { + content: "\f7fb"; } + +.fa-eject:before { + content: "\f052"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-ellipsis-h:before { + content: "\f141"; } + +.fa-ellipsis-v:before { + content: "\f142"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envelope:before { + content: "\f0e0"; } + +.fa-envelope-open:before { + content: "\f2b6"; } + +.fa-envelope-open-text:before { + content: "\f658"; } + +.fa-envelope-square:before { + content: "\f199"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-equals:before { + content: "\f52c"; } + +.fa-eraser:before { + content: "\f12d"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-ethernet:before { + content: "\f796"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-euro-sign:before { + content: "\f153"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-exchange-alt:before { + content: "\f362"; } + +.fa-exclamation:before { + content: "\f12a"; } + +.fa-exclamation-circle:before { + content: "\f06a"; } + +.fa-exclamation-triangle:before { + content: "\f071"; } + +.fa-expand:before { + content: "\f065"; } + +.fa-expand-alt:before { + content: "\f424"; } + +.fa-expand-arrows-alt:before { + content: "\f31e"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-external-link-alt:before { + content: "\f35d"; } + +.fa-external-link-square-alt:before { + content: "\f360"; } + +.fa-eye:before { + content: "\f06e"; } + +.fa-eye-dropper:before { + content: "\f1fb"; } + +.fa-eye-slash:before { + content: "\f070"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-fan:before { + content: "\f863"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-fast-backward:before { + content: "\f049"; } + +.fa-fast-forward:before { + content: "\f050"; } + +.fa-faucet:before { + content: "\e005"; } + +.fa-fax:before { + content: "\f1ac"; } + +.fa-feather:before { + content: "\f52d"; } + +.fa-feather-alt:before { + content: "\f56b"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-female:before { + content: "\f182"; } + +.fa-fighter-jet:before { + content: "\f0fb"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-file:before { + content: "\f15b"; } + +.fa-file-alt:before { + content: "\f15c"; } + +.fa-file-archive:before { + content: "\f1c6"; } + +.fa-file-audio:before { + content: "\f1c7"; } + +.fa-file-code:before { + content: "\f1c9"; } + +.fa-file-contract:before { + content: "\f56c"; } + +.fa-file-csv:before { + content: "\f6dd"; } + +.fa-file-download:before { + content: "\f56d"; } + +.fa-file-excel:before { + content: "\f1c3"; } + +.fa-file-export:before { + content: "\f56e"; } + +.fa-file-image:before { + content: "\f1c5"; } + +.fa-file-import:before { + content: "\f56f"; } + +.fa-file-invoice:before { + content: "\f570"; } + +.fa-file-invoice-dollar:before { + content: "\f571"; } + +.fa-file-medical:before { + content: "\f477"; } + +.fa-file-medical-alt:before { + content: "\f478"; } + +.fa-file-pdf:before { + content: "\f1c1"; } + +.fa-file-powerpoint:before { + content: "\f1c4"; } + +.fa-file-prescription:before { + content: "\f572"; } + +.fa-file-signature:before { + content: "\f573"; } + +.fa-file-upload:before { + content: "\f574"; } + +.fa-file-video:before { + content: "\f1c8"; } + +.fa-file-word:before { + content: "\f1c2"; } + +.fa-fill:before { + content: "\f575"; } + +.fa-fill-drip:before { + content: "\f576"; } + +.fa-film:before { + content: "\f008"; } + +.fa-filter:before { + content: "\f0b0"; } + +.fa-fingerprint:before { + content: "\f577"; } + +.fa-fire:before { + content: "\f06d"; } + +.fa-fire-alt:before { + content: "\f7e4"; } + +.fa-fire-extinguisher:before { + content: "\f134"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-first-aid:before { + content: "\f479"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-fish:before { + content: "\f578"; } + +.fa-fist-raised:before { + content: "\f6de"; } + +.fa-flag:before { + content: "\f024"; } + +.fa-flag-checkered:before { + content: "\f11e"; } + +.fa-flag-usa:before { + content: "\f74d"; } + +.fa-flask:before { + content: "\f0c3"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-flushed:before { + content: "\f579"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-folder:before { + content: "\f07b"; } + +.fa-folder-minus:before { + content: "\f65d"; } + +.fa-folder-open:before { + content: "\f07c"; } + +.fa-folder-plus:before { + content: "\f65e"; } + +.fa-font:before { + content: "\f031"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-font-awesome-flag:before { + content: "\f425"; } + +.fa-font-awesome-logo-full:before { + content: "\f4e6"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-football-ball:before { + content: "\f44e"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-forward:before { + content: "\f04e"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-frog:before { + content: "\f52e"; } + +.fa-frown:before { + content: "\f119"; } + +.fa-frown-open:before { + content: "\f57a"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-funnel-dollar:before { + content: "\f662"; } + +.fa-futbol:before { + content: "\f1e3"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-gamepad:before { + content: "\f11b"; } + +.fa-gas-pump:before { + content: "\f52f"; } + +.fa-gavel:before { + content: "\f0e3"; } + +.fa-gem:before { + content: "\f3a5"; } + +.fa-genderless:before { + content: "\f22d"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-ghost:before { + content: "\f6e2"; } + +.fa-gift:before { + content: "\f06b"; } + +.fa-gifts:before { + content: "\f79c"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-glass-cheers:before { + content: "\f79f"; } + +.fa-glass-martini:before { + content: "\f000"; } + +.fa-glass-martini-alt:before { + content: "\f57b"; } + +.fa-glass-whiskey:before { + content: "\f7a0"; } + +.fa-glasses:before { + content: "\f530"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-globe:before { + content: "\f0ac"; } + +.fa-globe-africa:before { + content: "\f57c"; } + +.fa-globe-americas:before { + content: "\f57d"; } + +.fa-globe-asia:before { + content: "\f57e"; } + +.fa-globe-europe:before { + content: "\f7a2"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-golf-ball:before { + content: "\f450"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-gopuram:before { + content: "\f664"; } + +.fa-graduation-cap:before { + content: "\f19d"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-greater-than:before { + content: "\f531"; } + +.fa-greater-than-equal:before { + content: "\f532"; } + +.fa-grimace:before { + content: "\f57f"; } + +.fa-grin:before { + content: "\f580"; } + +.fa-grin-alt:before { + content: "\f581"; } + +.fa-grin-beam:before { + content: "\f582"; } + +.fa-grin-beam-sweat:before { + content: "\f583"; } + +.fa-grin-hearts:before { + content: "\f584"; } + +.fa-grin-squint:before { + content: "\f585"; } + +.fa-grin-squint-tears:before { + content: "\f586"; } + +.fa-grin-stars:before { + content: "\f587"; } + +.fa-grin-tears:before { + content: "\f588"; } + +.fa-grin-tongue:before { + content: "\f589"; } + +.fa-grin-tongue-squint:before { + content: "\f58a"; } + +.fa-grin-tongue-wink:before { + content: "\f58b"; } + +.fa-grin-wink:before { + content: "\f58c"; } + +.fa-grip-horizontal:before { + content: "\f58d"; } + +.fa-grip-lines:before { + content: "\f7a4"; } + +.fa-grip-lines-vertical:before { + content: "\f7a5"; } + +.fa-grip-vertical:before { + content: "\f58e"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-guitar:before { + content: "\f7a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-h-square:before { + content: "\f0fd"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-hamburger:before { + content: "\f805"; } + +.fa-hammer:before { + content: "\f6e3"; } + +.fa-hamsa:before { + content: "\f665"; } + +.fa-hand-holding:before { + content: "\f4bd"; } + +.fa-hand-holding-heart:before { + content: "\f4be"; } + +.fa-hand-holding-medical:before { + content: "\e05c"; } + +.fa-hand-holding-usd:before { + content: "\f4c0"; } + +.fa-hand-holding-water:before { + content: "\f4c1"; } + +.fa-hand-lizard:before { + content: "\f258"; } + +.fa-hand-middle-finger:before { + content: "\f806"; } + +.fa-hand-paper:before { + content: "\f256"; } + +.fa-hand-peace:before { + content: "\f25b"; } + +.fa-hand-point-down:before { + content: "\f0a7"; } + +.fa-hand-point-left:before { + content: "\f0a5"; } + +.fa-hand-point-right:before { + content: "\f0a4"; } + +.fa-hand-point-up:before { + content: "\f0a6"; } + +.fa-hand-pointer:before { + content: "\f25a"; } + +.fa-hand-rock:before { + content: "\f255"; } + +.fa-hand-scissors:before { + content: "\f257"; } + +.fa-hand-sparkles:before { + content: "\e05d"; } + +.fa-hand-spock:before { + content: "\f259"; } + +.fa-hands:before { + content: "\f4c2"; } + +.fa-hands-helping:before { + content: "\f4c4"; } + +.fa-hands-wash:before { + content: "\e05e"; } + +.fa-handshake:before { + content: "\f2b5"; } + +.fa-handshake-alt-slash:before { + content: "\e05f"; } + +.fa-handshake-slash:before { + content: "\e060"; } + +.fa-hanukiah:before { + content: "\f6e6"; } + +.fa-hard-hat:before { + content: "\f807"; } + +.fa-hashtag:before { + content: "\f292"; } + +.fa-hat-cowboy:before { + content: "\f8c0"; } + +.fa-hat-cowboy-side:before { + content: "\f8c1"; } + +.fa-hat-wizard:before { + content: "\f6e8"; } + +.fa-hdd:before { + content: "\f0a0"; } + +.fa-head-side-cough:before { + content: "\e061"; } + +.fa-head-side-cough-slash:before { + content: "\e062"; } + +.fa-head-side-mask:before { + content: "\e063"; } + +.fa-head-side-virus:before { + content: "\e064"; } + +.fa-heading:before { + content: "\f1dc"; } + +.fa-headphones:before { + content: "\f025"; } + +.fa-headphones-alt:before { + content: "\f58f"; } + +.fa-headset:before { + content: "\f590"; } + +.fa-heart:before { + content: "\f004"; } + +.fa-heart-broken:before { + content: "\f7a9"; } + +.fa-heartbeat:before { + content: "\f21e"; } + +.fa-helicopter:before { + content: "\f533"; } + +.fa-highlighter:before { + content: "\f591"; } + +.fa-hiking:before { + content: "\f6ec"; } + +.fa-hippo:before { + content: "\f6ed"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-history:before { + content: "\f1da"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-hockey-puck:before { + content: "\f453"; } + +.fa-holly-berry:before { + content: "\f7aa"; } + +.fa-home:before { + content: "\f015"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-horse:before { + content: "\f6f0"; } + +.fa-horse-head:before { + content: "\f7ab"; } + +.fa-hospital:before { + content: "\f0f8"; } + +.fa-hospital-alt:before { + content: "\f47d"; } + +.fa-hospital-symbol:before { + content: "\f47e"; } + +.fa-hospital-user:before { + content: "\f80d"; } + +.fa-hot-tub:before { + content: "\f593"; } + +.fa-hotdog:before { + content: "\f80f"; } + +.fa-hotel:before { + content: "\f594"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-hourglass:before { + content: "\f254"; } + +.fa-hourglass-end:before { + content: "\f253"; } + +.fa-hourglass-half:before { + content: "\f252"; } + +.fa-hourglass-start:before { + content: "\f251"; } + +.fa-house-damage:before { + content: "\f6f1"; } + +.fa-house-user:before { + content: "\e065"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-hryvnia:before { + content: "\f6f2"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-i-cursor:before { + content: "\f246"; } + +.fa-ice-cream:before { + content: "\f810"; } + +.fa-icicles:before { + content: "\f7ad"; } + +.fa-icons:before { + content: "\f86d"; } + +.fa-id-badge:before { + content: "\f2c1"; } + +.fa-id-card:before { + content: "\f2c2"; } + +.fa-id-card-alt:before { + content: "\f47f"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-igloo:before { + content: "\f7ae"; } + +.fa-image:before { + content: "\f03e"; } + +.fa-images:before { + content: "\f302"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-inbox:before { + content: "\f01c"; } + +.fa-indent:before { + content: "\f03c"; } + +.fa-industry:before { + content: "\f275"; } + +.fa-infinity:before { + content: "\f534"; } + +.fa-info:before { + content: "\f129"; } + +.fa-info-circle:before { + content: "\f05a"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-italic:before { + content: "\f033"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-jedi:before { + content: "\f669"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-joint:before { + content: "\f595"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-journal-whills:before { + content: "\f66a"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-kaaba:before { + content: "\f66b"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-key:before { + content: "\f084"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-keyboard:before { + content: "\f11c"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-khanda:before { + content: "\f66d"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-kiss:before { + content: "\f596"; } + +.fa-kiss-beam:before { + content: "\f597"; } + +.fa-kiss-wink-heart:before { + content: "\f598"; } + +.fa-kiwi-bird:before { + content: "\f535"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-landmark:before { + content: "\f66f"; } + +.fa-language:before { + content: "\f1ab"; } + +.fa-laptop:before { + content: "\f109"; } + +.fa-laptop-code:before { + content: "\f5fc"; } + +.fa-laptop-house:before { + content: "\e066"; } + +.fa-laptop-medical:before { + content: "\f812"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-laugh:before { + content: "\f599"; } + +.fa-laugh-beam:before { + content: "\f59a"; } + +.fa-laugh-squint:before { + content: "\f59b"; } + +.fa-laugh-wink:before { + content: "\f59c"; } + +.fa-layer-group:before { + content: "\f5fd"; } + +.fa-leaf:before { + content: "\f06c"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-lemon:before { + content: "\f094"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-less-than:before { + content: "\f536"; } + +.fa-less-than-equal:before { + content: "\f537"; } + +.fa-level-down-alt:before { + content: "\f3be"; } + +.fa-level-up-alt:before { + content: "\f3bf"; } + +.fa-life-ring:before { + content: "\f1cd"; } + +.fa-lightbulb:before { + content: "\f0eb"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-link:before { + content: "\f0c1"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-lira-sign:before { + content: "\f195"; } + +.fa-list:before { + content: "\f03a"; } + +.fa-list-alt:before { + content: "\f022"; } + +.fa-list-ol:before { + content: "\f0cb"; } + +.fa-list-ul:before { + content: "\f0ca"; } + +.fa-location-arrow:before { + content: "\f124"; } + +.fa-lock:before { + content: "\f023"; } + +.fa-lock-open:before { + content: "\f3c1"; } + +.fa-long-arrow-alt-down:before { + content: "\f309"; } + +.fa-long-arrow-alt-left:before { + content: "\f30a"; } + +.fa-long-arrow-alt-right:before { + content: "\f30b"; } + +.fa-long-arrow-alt-up:before { + content: "\f30c"; } + +.fa-low-vision:before { + content: "\f2a8"; } + +.fa-luggage-cart:before { + content: "\f59d"; } + +.fa-lungs:before { + content: "\f604"; } + +.fa-lungs-virus:before { + content: "\e067"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-magic:before { + content: "\f0d0"; } + +.fa-magnet:before { + content: "\f076"; } + +.fa-mail-bulk:before { + content: "\f674"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-male:before { + content: "\f183"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-map:before { + content: "\f279"; } + +.fa-map-marked:before { + content: "\f59f"; } + +.fa-map-marked-alt:before { + content: "\f5a0"; } + +.fa-map-marker:before { + content: "\f041"; } + +.fa-map-marker-alt:before { + content: "\f3c5"; } + +.fa-map-pin:before { + content: "\f276"; } + +.fa-map-signs:before { + content: "\f277"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-marker:before { + content: "\f5a1"; } + +.fa-mars:before { + content: "\f222"; } + +.fa-mars-double:before { + content: "\f227"; } + +.fa-mars-stroke:before { + content: "\f229"; } + +.fa-mars-stroke-h:before { + content: "\f22b"; } + +.fa-mars-stroke-v:before { + content: "\f22a"; } + +.fa-mask:before { + content: "\f6fa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-medal:before { + content: "\f5a2"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f3c7"; } + +.fa-medkit:before { + content: "\f0fa"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-meh:before { + content: "\f11a"; } + +.fa-meh-blank:before { + content: "\f5a4"; } + +.fa-meh-rolling-eyes:before { + content: "\f5a5"; } + +.fa-memory:before { + content: "\f538"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-menorah:before { + content: "\f676"; } + +.fa-mercury:before { + content: "\f223"; } + +.fa-meteor:before { + content: "\f753"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-microchip:before { + content: "\f2db"; } + +.fa-microphone:before { + content: "\f130"; } + +.fa-microphone-alt:before { + content: "\f3c9"; } + +.fa-microphone-alt-slash:before { + content: "\f539"; } + +.fa-microphone-slash:before { + content: "\f131"; } + +.fa-microscope:before { + content: "\f610"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-minus:before { + content: "\f068"; } + +.fa-minus-circle:before { + content: "\f056"; } + +.fa-minus-square:before { + content: "\f146"; } + +.fa-mitten:before { + content: "\f7b5"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-mobile:before { + content: "\f10b"; } + +.fa-mobile-alt:before { + content: "\f3cd"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-money-bill:before { + content: "\f0d6"; } + +.fa-money-bill-alt:before { + content: "\f3d1"; } + +.fa-money-bill-wave:before { + content: "\f53a"; } + +.fa-money-bill-wave-alt:before { + content: "\f53b"; } + +.fa-money-check:before { + content: "\f53c"; } + +.fa-money-check-alt:before { + content: "\f53d"; } + +.fa-monument:before { + content: "\f5a6"; } + +.fa-moon:before { + content: "\f186"; } + +.fa-mortar-pestle:before { + content: "\f5a7"; } + +.fa-mosque:before { + content: "\f678"; } + +.fa-motorcycle:before { + content: "\f21c"; } + +.fa-mountain:before { + content: "\f6fc"; } + +.fa-mouse:before { + content: "\f8cc"; } + +.fa-mouse-pointer:before { + content: "\f245"; } + +.fa-mug-hot:before { + content: "\f7b6"; } + +.fa-music:before { + content: "\f001"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-network-wired:before { + content: "\f6ff"; } + +.fa-neuter:before { + content: "\f22c"; } + +.fa-newspaper:before { + content: "\f1ea"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-node:before { + content: "\f419"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-not-equal:before { + content: "\f53e"; } + +.fa-notes-medical:before { + content: "\f481"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-object-group:before { + content: "\f247"; } + +.fa-object-ungroup:before { + content: "\f248"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-oil-can:before { + content: "\f613"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-om:before { + content: "\f679"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-otter:before { + content: "\f700"; } + +.fa-outdent:before { + content: "\f03b"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-pager:before { + content: "\f815"; } + +.fa-paint-brush:before { + content: "\f1fc"; } + +.fa-paint-roller:before { + content: "\f5aa"; } + +.fa-palette:before { + content: "\f53f"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-pallet:before { + content: "\f482"; } + +.fa-paper-plane:before { + content: "\f1d8"; } + +.fa-paperclip:before { + content: "\f0c6"; } + +.fa-parachute-box:before { + content: "\f4cd"; } + +.fa-paragraph:before { + content: "\f1dd"; } + +.fa-parking:before { + content: "\f540"; } + +.fa-passport:before { + content: "\f5ab"; } + +.fa-pastafarianism:before { + content: "\f67b"; } + +.fa-paste:before { + content: "\f0ea"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-pause:before { + content: "\f04c"; } + +.fa-pause-circle:before { + content: "\f28b"; } + +.fa-paw:before { + content: "\f1b0"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-peace:before { + content: "\f67c"; } + +.fa-pen:before { + content: "\f304"; } + +.fa-pen-alt:before { + content: "\f305"; } + +.fa-pen-fancy:before { + content: "\f5ac"; } + +.fa-pen-nib:before { + content: "\f5ad"; } + +.fa-pen-square:before { + content: "\f14b"; } + +.fa-pencil-alt:before { + content: "\f303"; } + +.fa-pencil-ruler:before { + content: "\f5ae"; } + +.fa-penny-arcade:before { + content: "\f704"; } + +.fa-people-arrows:before { + content: "\e068"; } + +.fa-people-carry:before { + content: "\f4ce"; } + +.fa-pepper-hot:before { + content: "\f816"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-percent:before { + content: "\f295"; } + +.fa-percentage:before { + content: "\f541"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-person-booth:before { + content: "\f756"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-phone:before { + content: "\f095"; } + +.fa-phone-alt:before { + content: "\f879"; } + +.fa-phone-slash:before { + content: "\f3dd"; } + +.fa-phone-square:before { + content: "\f098"; } + +.fa-phone-square-alt:before { + content: "\f87b"; } + +.fa-phone-volume:before { + content: "\f2a0"; } + +.fa-photo-video:before { + content: "\f87c"; } + +.fa-php:before { + content: "\f457"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-piggy-bank:before { + content: "\f4d3"; } + +.fa-pills:before { + content: "\f484"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-pizza-slice:before { + content: "\f818"; } + +.fa-place-of-worship:before { + content: "\f67f"; } + +.fa-plane:before { + content: "\f072"; } + +.fa-plane-arrival:before { + content: "\f5af"; } + +.fa-plane-departure:before { + content: "\f5b0"; } + +.fa-plane-slash:before { + content: "\e069"; } + +.fa-play:before { + content: "\f04b"; } + +.fa-play-circle:before { + content: "\f144"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-plug:before { + content: "\f1e6"; } + +.fa-plus:before { + content: "\f067"; } + +.fa-plus-circle:before { + content: "\f055"; } + +.fa-plus-square:before { + content: "\f0fe"; } + +.fa-podcast:before { + content: "\f2ce"; } + +.fa-poll:before { + content: "\f681"; } + +.fa-poll-h:before { + content: "\f682"; } + +.fa-poo:before { + content: "\f2fe"; } + +.fa-poo-storm:before { + content: "\f75a"; } + +.fa-poop:before { + content: "\f619"; } + +.fa-portrait:before { + content: "\f3e0"; } + +.fa-pound-sign:before { + content: "\f154"; } + +.fa-power-off:before { + content: "\f011"; } + +.fa-pray:before { + content: "\f683"; } + +.fa-praying-hands:before { + content: "\f684"; } + +.fa-prescription:before { + content: "\f5b1"; } + +.fa-prescription-bottle:before { + content: "\f485"; } + +.fa-prescription-bottle-alt:before { + content: "\f486"; } + +.fa-print:before { + content: "\f02f"; } + +.fa-procedures:before { + content: "\f487"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-project-diagram:before { + content: "\f542"; } + +.fa-pump-medical:before { + content: "\e06a"; } + +.fa-pump-soap:before { + content: "\e06b"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-puzzle-piece:before { + content: "\f12e"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-qrcode:before { + content: "\f029"; } + +.fa-question:before { + content: "\f128"; } + +.fa-question-circle:before { + content: "\f059"; } + +.fa-quidditch:before { + content: "\f458"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-quote-left:before { + content: "\f10d"; } + +.fa-quote-right:before { + content: "\f10e"; } + +.fa-quran:before { + content: "\f687"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-radiation:before { + content: "\f7b9"; } + +.fa-radiation-alt:before { + content: "\f7ba"; } + +.fa-rainbow:before { + content: "\f75b"; } + +.fa-random:before { + content: "\f074"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-receipt:before { + content: "\f543"; } + +.fa-record-vinyl:before { + content: "\f8d9"; } + +.fa-recycle:before { + content: "\f1b8"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-redo:before { + content: "\f01e"; } + +.fa-redo-alt:before { + content: "\f2f9"; } + +.fa-registered:before { + content: "\f25d"; } + +.fa-remove-format:before { + content: "\f87d"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-reply:before { + content: "\f3e5"; } + +.fa-reply-all:before { + content: "\f122"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-republican:before { + content: "\f75e"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-restroom:before { + content: "\f7bd"; } + +.fa-retweet:before { + content: "\f079"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-ribbon:before { + content: "\f4d6"; } + +.fa-ring:before { + content: "\f70b"; } + +.fa-road:before { + content: "\f018"; } + +.fa-robot:before { + content: "\f544"; } + +.fa-rocket:before { + content: "\f135"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-route:before { + content: "\f4d7"; } + +.fa-rss:before { + content: "\f09e"; } + +.fa-rss-square:before { + content: "\f143"; } + +.fa-ruble-sign:before { + content: "\f158"; } + +.fa-ruler:before { + content: "\f545"; } + +.fa-ruler-combined:before { + content: "\f546"; } + +.fa-ruler-horizontal:before { + content: "\f547"; } + +.fa-ruler-vertical:before { + content: "\f548"; } + +.fa-running:before { + content: "\f70c"; } + +.fa-rupee-sign:before { + content: "\f156"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-sad-cry:before { + content: "\f5b3"; } + +.fa-sad-tear:before { + content: "\f5b4"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-satellite:before { + content: "\f7bf"; } + +.fa-satellite-dish:before { + content: "\f7c0"; } + +.fa-save:before { + content: "\f0c7"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-school:before { + content: "\f549"; } + +.fa-screwdriver:before { + content: "\f54a"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-scroll:before { + content: "\f70e"; } + +.fa-sd-card:before { + content: "\f7c2"; } + +.fa-search:before { + content: "\f002"; } + +.fa-search-dollar:before { + content: "\f688"; } + +.fa-search-location:before { + content: "\f689"; } + +.fa-search-minus:before { + content: "\f010"; } + +.fa-search-plus:before { + content: "\f00e"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-seedling:before { + content: "\f4d8"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-server:before { + content: "\f233"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-shapes:before { + content: "\f61f"; } + +.fa-share:before { + content: "\f064"; } + +.fa-share-alt:before { + content: "\f1e0"; } + +.fa-share-alt-square:before { + content: "\f1e1"; } + +.fa-share-square:before { + content: "\f14d"; } + +.fa-shekel-sign:before { + content: "\f20b"; } + +.fa-shield-alt:before { + content: "\f3ed"; } + +.fa-shield-virus:before { + content: "\e06c"; } + +.fa-ship:before { + content: "\f21a"; } + +.fa-shipping-fast:before { + content: "\f48b"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-shoe-prints:before { + content: "\f54b"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-shopping-bag:before { + content: "\f290"; } + +.fa-shopping-basket:before { + content: "\f291"; } + +.fa-shopping-cart:before { + content: "\f07a"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-shower:before { + content: "\f2cc"; } + +.fa-shuttle-van:before { + content: "\f5b6"; } + +.fa-sign:before { + content: "\f4d9"; } + +.fa-sign-in-alt:before { + content: "\f2f6"; } + +.fa-sign-language:before { + content: "\f2a7"; } + +.fa-sign-out-alt:before { + content: "\f2f5"; } + +.fa-signal:before { + content: "\f012"; } + +.fa-signature:before { + content: "\f5b7"; } + +.fa-sim-card:before { + content: "\f7c4"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-sink:before { + content: "\e06d"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-sitemap:before { + content: "\f0e8"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-skating:before { + content: "\f7c5"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-skiing:before { + content: "\f7c9"; } + +.fa-skiing-nordic:before { + content: "\f7ca"; } + +.fa-skull:before { + content: "\f54c"; } + +.fa-skull-crossbones:before { + content: "\f714"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f3ef"; } + +.fa-slash:before { + content: "\f715"; } + +.fa-sleigh:before { + content: "\f7cc"; } + +.fa-sliders-h:before { + content: "\f1de"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-smile:before { + content: "\f118"; } + +.fa-smile-beam:before { + content: "\f5b8"; } + +.fa-smile-wink:before { + content: "\f4da"; } + +.fa-smog:before { + content: "\f75f"; } + +.fa-smoking:before { + content: "\f48d"; } + +.fa-smoking-ban:before { + content: "\f54d"; } + +.fa-sms:before { + content: "\f7cd"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ac"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-snowboarding:before { + content: "\f7ce"; } + +.fa-snowflake:before { + content: "\f2dc"; } + +.fa-snowman:before { + content: "\f7d0"; } + +.fa-snowplow:before { + content: "\f7d2"; } + +.fa-soap:before { + content: "\e06e"; } + +.fa-socks:before { + content: "\f696"; } + +.fa-solar-panel:before { + content: "\f5ba"; } + +.fa-sort:before { + content: "\f0dc"; } + +.fa-sort-alpha-down:before { + content: "\f15d"; } + +.fa-sort-alpha-down-alt:before { + content: "\f881"; } + +.fa-sort-alpha-up:before { + content: "\f15e"; } + +.fa-sort-alpha-up-alt:before { + content: "\f882"; } + +.fa-sort-amount-down:before { + content: "\f160"; } + +.fa-sort-amount-down-alt:before { + content: "\f884"; } + +.fa-sort-amount-up:before { + content: "\f161"; } + +.fa-sort-amount-up-alt:before { + content: "\f885"; } + +.fa-sort-down:before { + content: "\f0dd"; } + +.fa-sort-numeric-down:before { + content: "\f162"; } + +.fa-sort-numeric-down-alt:before { + content: "\f886"; } + +.fa-sort-numeric-up:before { + content: "\f163"; } + +.fa-sort-numeric-up-alt:before { + content: "\f887"; } + +.fa-sort-up:before { + content: "\f0de"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-spa:before { + content: "\f5bb"; } + +.fa-space-shuttle:before { + content: "\f197"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-spell-check:before { + content: "\f891"; } + +.fa-spider:before { + content: "\f717"; } + +.fa-spinner:before { + content: "\f110"; } + +.fa-splotch:before { + content: "\f5bc"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-spray-can:before { + content: "\f5bd"; } + +.fa-square:before { + content: "\f0c8"; } + +.fa-square-full:before { + content: "\f45c"; } + +.fa-square-root-alt:before { + content: "\f698"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-stamp:before { + content: "\f5bf"; } + +.fa-star:before { + content: "\f005"; } + +.fa-star-and-crescent:before { + content: "\f699"; } + +.fa-star-half:before { + content: "\f089"; } + +.fa-star-half-alt:before { + content: "\f5c0"; } + +.fa-star-of-david:before { + content: "\f69a"; } + +.fa-star-of-life:before { + content: "\f621"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +.fa-step-backward:before { + content: "\f048"; } + +.fa-step-forward:before { + content: "\f051"; } + +.fa-stethoscope:before { + content: "\f0f1"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-sticky-note:before { + content: "\f249"; } + +.fa-stop:before { + content: "\f04d"; } + +.fa-stop-circle:before { + content: "\f28d"; } + +.fa-stopwatch:before { + content: "\f2f2"; } + +.fa-stopwatch-20:before { + content: "\e06f"; } + +.fa-store:before { + content: "\f54e"; } + +.fa-store-alt:before { + content: "\f54f"; } + +.fa-store-alt-slash:before { + content: "\e070"; } + +.fa-store-slash:before { + content: "\e071"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-stream:before { + content: "\f550"; } + +.fa-street-view:before { + content: "\f21d"; } + +.fa-strikethrough:before { + content: "\f0cc"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-stroopwafel:before { + content: "\f551"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-subscript:before { + content: "\f12c"; } + +.fa-subway:before { + content: "\f239"; } + +.fa-suitcase:before { + content: "\f0f2"; } + +.fa-suitcase-rolling:before { + content: "\f5c1"; } + +.fa-sun:before { + content: "\f185"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-superscript:before { + content: "\f12b"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-surprise:before { + content: "\f5c2"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-swatchbook:before { + content: "\f5c3"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-swimmer:before { + content: "\f5c4"; } + +.fa-swimming-pool:before { + content: "\f5c5"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-synagogue:before { + content: "\f69b"; } + +.fa-sync:before { + content: "\f021"; } + +.fa-sync-alt:before { + content: "\f2f1"; } + +.fa-syringe:before { + content: "\f48e"; } + +.fa-table:before { + content: "\f0ce"; } + +.fa-table-tennis:before { + content: "\f45d"; } + +.fa-tablet:before { + content: "\f10a"; } + +.fa-tablet-alt:before { + content: "\f3fa"; } + +.fa-tablets:before { + content: "\f490"; } + +.fa-tachometer-alt:before { + content: "\f3fd"; } + +.fa-tag:before { + content: "\f02b"; } + +.fa-tags:before { + content: "\f02c"; } + +.fa-tape:before { + content: "\f4db"; } + +.fa-tasks:before { + content: "\f0ae"; } + +.fa-taxi:before { + content: "\f1ba"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-teeth:before { + content: "\f62e"; } + +.fa-teeth-open:before { + content: "\f62f"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f3fe"; } + +.fa-temperature-high:before { + content: "\f769"; } + +.fa-temperature-low:before { + content: "\f76b"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-tenge:before { + content: "\f7d7"; } + +.fa-terminal:before { + content: "\f120"; } + +.fa-text-height:before { + content: "\f034"; } + +.fa-text-width:before { + content: "\f035"; } + +.fa-th:before { + content: "\f00a"; } + +.fa-th-large:before { + content: "\f009"; } + +.fa-th-list:before { + content: "\f00b"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-theater-masks:before { + content: "\f630"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-thermometer:before { + content: "\f491"; } + +.fa-thermometer-empty:before { + content: "\f2cb"; } + +.fa-thermometer-full:before { + content: "\f2c7"; } + +.fa-thermometer-half:before { + content: "\f2c9"; } + +.fa-thermometer-quarter:before { + content: "\f2ca"; } + +.fa-thermometer-three-quarters:before { + content: "\f2c8"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-thumbs-down:before { + content: "\f165"; } + +.fa-thumbs-up:before { + content: "\f164"; } + +.fa-thumbtack:before { + content: "\f08d"; } + +.fa-ticket-alt:before { + content: "\f3ff"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-times:before { + content: "\f00d"; } + +.fa-times-circle:before { + content: "\f057"; } + +.fa-tint:before { + content: "\f043"; } + +.fa-tint-slash:before { + content: "\f5c7"; } + +.fa-tired:before { + content: "\f5c8"; } + +.fa-toggle-off:before { + content: "\f204"; } + +.fa-toggle-on:before { + content: "\f205"; } + +.fa-toilet:before { + content: "\f7d8"; } + +.fa-toilet-paper:before { + content: "\f71e"; } + +.fa-toilet-paper-slash:before { + content: "\e072"; } + +.fa-toolbox:before { + content: "\f552"; } + +.fa-tools:before { + content: "\f7d9"; } + +.fa-tooth:before { + content: "\f5c9"; } + +.fa-torah:before { + content: "\f6a0"; } + +.fa-torii-gate:before { + content: "\f6a1"; } + +.fa-tractor:before { + content: "\f722"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-trademark:before { + content: "\f25c"; } + +.fa-traffic-light:before { + content: "\f637"; } + +.fa-trailer:before { + content: "\e041"; } + +.fa-train:before { + content: "\f238"; } + +.fa-tram:before { + content: "\f7da"; } + +.fa-transgender:before { + content: "\f224"; } + +.fa-transgender-alt:before { + content: "\f225"; } + +.fa-trash:before { + content: "\f1f8"; } + +.fa-trash-alt:before { + content: "\f2ed"; } + +.fa-trash-restore:before { + content: "\f829"; } + +.fa-trash-restore-alt:before { + content: "\f82a"; } + +.fa-tree:before { + content: "\f1bb"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-tripadvisor:before { + content: "\f262"; } + +.fa-trophy:before { + content: "\f091"; } + +.fa-truck:before { + content: "\f0d1"; } + +.fa-truck-loading:before { + content: "\f4de"; } + +.fa-truck-monster:before { + content: "\f63b"; } + +.fa-truck-moving:before { + content: "\f4df"; } + +.fa-truck-pickup:before { + content: "\f63c"; } + +.fa-tshirt:before { + content: "\f553"; } + +.fa-tty:before { + content: "\f1e4"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-tv:before { + content: "\f26c"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-umbrella:before { + content: "\f0e9"; } + +.fa-umbrella-beach:before { + content: "\f5ca"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-underline:before { + content: "\f0cd"; } + +.fa-undo:before { + content: "\f0e2"; } + +.fa-undo-alt:before { + content: "\f2ea"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-universal-access:before { + content: "\f29a"; } + +.fa-university:before { + content: "\f19c"; } + +.fa-unlink:before { + content: "\f127"; } + +.fa-unlock:before { + content: "\f09c"; } + +.fa-unlock-alt:before { + content: "\f13e"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-upload:before { + content: "\f093"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-user:before { + content: "\f007"; } + +.fa-user-alt:before { + content: "\f406"; } + +.fa-user-alt-slash:before { + content: "\f4fa"; } + +.fa-user-astronaut:before { + content: "\f4fb"; } + +.fa-user-check:before { + content: "\f4fc"; } + +.fa-user-circle:before { + content: "\f2bd"; } + +.fa-user-clock:before { + content: "\f4fd"; } + +.fa-user-cog:before { + content: "\f4fe"; } + +.fa-user-edit:before { + content: "\f4ff"; } + +.fa-user-friends:before { + content: "\f500"; } + +.fa-user-graduate:before { + content: "\f501"; } + +.fa-user-injured:before { + content: "\f728"; } + +.fa-user-lock:before { + content: "\f502"; } + +.fa-user-md:before { + content: "\f0f0"; } + +.fa-user-minus:before { + content: "\f503"; } + +.fa-user-ninja:before { + content: "\f504"; } + +.fa-user-nurse:before { + content: "\f82f"; } + +.fa-user-plus:before { + content: "\f234"; } + +.fa-user-secret:before { + content: "\f21b"; } + +.fa-user-shield:before { + content: "\f505"; } + +.fa-user-slash:before { + content: "\f506"; } + +.fa-user-tag:before { + content: "\f507"; } + +.fa-user-tie:before { + content: "\f508"; } + +.fa-user-times:before { + content: "\f235"; } + +.fa-users:before { + content: "\f0c0"; } + +.fa-users-cog:before { + content: "\f509"; } + +.fa-users-slash:before { + content: "\e073"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-utensil-spoon:before { + content: "\f2e5"; } + +.fa-utensils:before { + content: "\f2e7"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-vector-square:before { + content: "\f5cb"; } + +.fa-venus:before { + content: "\f221"; } + +.fa-venus-double:before { + content: "\f226"; } + +.fa-venus-mars:before { + content: "\f228"; } + +.fa-vest:before { + content: "\e085"; } + +.fa-vest-patches:before { + content: "\e086"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-vial:before { + content: "\f492"; } + +.fa-vials:before { + content: "\f493"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-video:before { + content: "\f03d"; } + +.fa-video-slash:before { + content: "\f4e2"; } + +.fa-vihara:before { + content: "\f6a7"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-virus:before { + content: "\e074"; } + +.fa-virus-slash:before { + content: "\e075"; } + +.fa-viruses:before { + content: "\e076"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-voicemail:before { + content: "\f897"; } + +.fa-volleyball-ball:before { + content: "\f45f"; } + +.fa-volume-down:before { + content: "\f027"; } + +.fa-volume-mute:before { + content: "\f6a9"; } + +.fa-volume-off:before { + content: "\f026"; } + +.fa-volume-up:before { + content: "\f028"; } + +.fa-vote-yea:before { + content: "\f772"; } + +.fa-vr-cardboard:before { + content: "\f729"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-walking:before { + content: "\f554"; } + +.fa-wallet:before { + content: "\f555"; } + +.fa-warehouse:before { + content: "\f494"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-water:before { + content: "\f773"; } + +.fa-wave-square:before { + content: "\f83e"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-weight:before { + content: "\f496"; } + +.fa-weight-hanging:before { + content: "\f5cd"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-wheelchair:before { + content: "\f193"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-wifi:before { + content: "\f1eb"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wind:before { + content: "\f72e"; } + +.fa-window-close:before { + content: "\f410"; } + +.fa-window-maximize:before { + content: "\f2d0"; } + +.fa-window-minimize:before { + content: "\f2d1"; } + +.fa-window-restore:before { + content: "\f2d2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wine-bottle:before { + content: "\f72f"; } + +.fa-wine-glass:before { + content: "\f4e3"; } + +.fa-wine-glass-alt:before { + content: "\f5ce"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-won-sign:before { + content: "\f159"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-wrench:before { + content: "\f0ad"; } + +.fa-x-ray:before { + content: "\f497"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-yen-sign:before { + content: "\f157"; } + +.fa-yin-yang:before { + content: "\f6ad"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.sr-only { + border: 0; + clip: rect(0, 0, 0, 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + clip: auto; + height: auto; + margin: 0; + overflow: visible; + position: static; + width: auto; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.woff") format("woff"); } + +.fab { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-regular-400.woff") format("woff"); } + +.far { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } +@font-face { + font-family: 'Font Awesome 5 Free'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.woff") format("woff"); } + +.fa, +.fas { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; } diff --git a/css/fonts.css b/css/fonts.css deleted file mode 100644 index e264eedf..00000000 --- a/css/fonts.css +++ /dev/null @@ -1,51 +0,0 @@ -/* libre-baskerville-regular - latin */ -@font-face { - font-family: 'Libre Baskerville'; - font-style: normal; - font-weight: 400; - src: url('/fonts/libre-baskerville-v7-latin-regular.eot'); /* IE9 Compat Modes */ - src: local('Libre Baskerville'), local('LibreBaskerville-Regular'), - url('/fonts/libre-baskerville-v7-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('/fonts/libre-baskerville-v7-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('/fonts/libre-baskerville-v7-latin-regular.woff') format('woff'), /* Modern Browsers */ - url('/fonts/libre-baskerville-v7-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('/fonts/libre-baskerville-v7-latin-regular.svg#LibreBaskerville') format('svg'); /* Legacy iOS */ -} - -/* libre-baskerville-700 - latin */ -@font-face { - font-family: 'Libre Baskerville'; - font-style: normal; - font-weight: 700; - src: url('/fonts/libre-baskerville-v7-latin-700.eot'); /* IE9 Compat Modes */ - src: local('Libre Baskerville Bold'), local('LibreBaskerville-Bold'), - url('/fonts/libre-baskerville-v7-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('/fonts/libre-baskerville-v7-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ - url('/fonts/libre-baskerville-v7-latin-700.woff') format('woff'), /* Modern Browsers */ - url('/fonts/libre-baskerville-v7-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ - url('/fonts/libre-baskerville-v7-latin-700.svg#LibreBaskerville') format('svg'); /* Legacy iOS */ -} - -/* libre-baskerville-italic - latin */ -@font-face { - font-family: 'Libre Baskerville'; - font-style: italic; - font-weight: 400; - src: url('/fonts/libre-baskerville-v7-latin-italic.eot'); /* IE9 Compat Modes */ - src: local('Libre Baskerville Italic'), local('LibreBaskerville-Italic'), - url('/fonts/libre-baskerville-v7-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('/fonts/libre-baskerville-v7-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ - url('/fonts/libre-baskerville-v7-latin-italic.woff') format('woff'), /* Modern Browsers */ - url('/fonts/libre-baskerville-v7-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ - url('/fonts/libre-baskerville-v7-latin-italic.svg#LibreBaskerville') format('svg'); /* Legacy iOS */ -} -@font-face { - font-family: 'webfont'; - font-display: swap; - src: url('//at.alicdn.com/t/webfont_86oq155nxz.eot'); /* IE9*/ - src: url('//at.alicdn.com/t/webfont_86oq155nxz.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('//at.alicdn.com/t/webfont_86oq155nxz.woff2') format('woff2'), - url('//at.alicdn.com/t/webfont_86oq155nxz.woff') format('woff'), /* chrome、firefox */ - url('//at.alicdn.com/t/webfont_86oq155nxz.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ - url('//at.alicdn.com/t/webfont_86oq155nxz.svg#AlibabaPuHuiTiL') format('svg'); /* iOS 4.1- */ - } \ No newline at end of file diff --git a/css/katex.css b/css/katex.css new file mode 100644 index 00000000..f5d22a5a --- /dev/null +++ b/css/katex.css @@ -0,0 +1,1091 @@ +/* stylelint-disable font-family-no-missing-generic-family-keyword */ +@font-face { + font-family: 'KaTeX_AMS'; + src: url(../webfonts/KaTeX_AMS-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Caligraphic'; + src: url(../webfonts/KaTeX_Caligraphic-Bold.woff) format('woff'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Caligraphic'; + src: url(../webfonts/KaTeX_Caligraphic-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Fraktur'; + src: url(../webfonts/KaTeX_Fraktur-Bold.woff) format('woff'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Fraktur'; + src: url(../webfonts/KaTeX_Fraktur-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(../webfonts/KaTeX_Main-Bold.woff) format('woff'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(../webfonts/KaTeX_Main-BoldItalic.woff) format('woff'); + font-weight: bold; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(../webfonts/KaTeX_Main-Italic.woff) format('woff'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_Main'; + src: url(../webfonts/KaTeX_Main-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Math'; + src: url(../webfonts/KaTeX_Math-BoldItalic.woff) format('woff'); + font-weight: bold; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_Math'; + src: url(../webfonts/KaTeX_Math-Italic.woff) format('woff'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_SansSerif'; + src: url(../webfonts/KaTeX_SansSerif-Bold.woff) format('woff'); + font-weight: bold; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_SansSerif'; + src: url(../webfonts/KaTeX_SansSerif-Italic.woff) format('woff'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'KaTeX_SansSerif'; + src: url(../webfonts/KaTeX_SansSerif-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Script'; + src: url(../webfonts/KaTeX_Script-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size1'; + src: url(../webfonts/KaTeX_Size1-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size2'; + src: url(../webfonts/KaTeX_Size2-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size3'; + src: url(../webfonts/KaTeX_Size3-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Size4'; + src: url(../webfonts/KaTeX_Size4-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'KaTeX_Typewriter'; + src: url(../webfonts/KaTeX_Typewriter-Regular.woff) format('woff'); + font-weight: normal; + font-style: normal; +} +.katex { + font: normal 1.21em KaTeX_Main, Times New Roman, serif; + line-height: 1.2; + text-indent: 0; + text-rendering: auto; +} +.katex * { + -ms-high-contrast-adjust: none !important; + border-color: currentColor; +} +.katex .katex-version::after { + content: "0.13.2"; +} +.katex .katex-mathml { + /* Accessibility hack to only show to screen readers + Found at: http://a11yproject.com/posts/how-to-hide-content/ */ + position: absolute; + clip: rect(1px, 1px, 1px, 1px); + padding: 0; + border: 0; + height: 1px; + width: 1px; + overflow: hidden; +} +.katex .katex-html { + /* \newline is an empty block at top level, between .base elements */ +} +.katex .katex-html > .newline { + display: block; +} +.katex .base { + position: relative; + display: inline-block; + white-space: nowrap; + width: -webkit-min-content; + width: -moz-min-content; + width: min-content; +} +.katex .strut { + display: inline-block; +} +.katex .textbf { + font-weight: bold; +} +.katex .textit { + font-style: italic; +} +.katex .textrm { + font-family: KaTeX_Main; +} +.katex .textsf { + font-family: KaTeX_SansSerif; +} +.katex .texttt { + font-family: KaTeX_Typewriter; +} +.katex .mathnormal { + font-family: KaTeX_Math; + font-style: italic; +} +.katex .mathit { + font-family: KaTeX_Main; + font-style: italic; +} +.katex .mathrm { + font-style: normal; +} +.katex .mathbf { + font-family: KaTeX_Main; + font-weight: bold; +} +.katex .boldsymbol { + font-family: KaTeX_Math; + font-weight: bold; + font-style: italic; +} +.katex .amsrm { + font-family: KaTeX_AMS; +} +.katex .mathbb, +.katex .textbb { + font-family: KaTeX_AMS; +} +.katex .mathcal { + font-family: KaTeX_Caligraphic; +} +.katex .mathfrak, +.katex .textfrak { + font-family: KaTeX_Fraktur; +} +.katex .mathtt { + font-family: KaTeX_Typewriter; +} +.katex .mathscr, +.katex .textscr { + font-family: KaTeX_Script; +} +.katex .mathsf, +.katex .textsf { + font-family: KaTeX_SansSerif; +} +.katex .mathboldsf, +.katex .textboldsf { + font-family: KaTeX_SansSerif; + font-weight: bold; +} +.katex .mathitsf, +.katex .textitsf { + font-family: KaTeX_SansSerif; + font-style: italic; +} +.katex .mainrm { + font-family: KaTeX_Main; + font-style: normal; +} +.katex .vlist-t { + display: inline-table; + table-layout: fixed; + border-collapse: collapse; +} +.katex .vlist-r { + display: table-row; +} +.katex .vlist { + display: table-cell; + vertical-align: bottom; + position: relative; +} +.katex .vlist > span { + display: block; + height: 0; + position: relative; +} +.katex .vlist > span > span { + display: inline-block; +} +.katex .vlist > span > .pstrut { + overflow: hidden; + width: 0; +} +.katex .vlist-t2 { + margin-right: -2px; +} +.katex .vlist-s { + display: table-cell; + vertical-align: bottom; + font-size: 1px; + width: 2px; + min-width: 2px; +} +.katex .vbox { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-align: baseline; + align-items: baseline; +} +.katex .hbox { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + width: 100%; +} +.katex .thinbox { + display: -webkit-inline-box; + display: inline-flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + width: 0; + max-width: 0; +} +.katex .msupsub { + text-align: left; +} +.katex .mfrac > span > span { + text-align: center; +} +.katex .mfrac .frac-line { + display: inline-block; + width: 100%; + border-bottom-style: solid; +} +.katex .mfrac .frac-line, +.katex .overline .overline-line, +.katex .underline .underline-line, +.katex .hline, +.katex .hdashline, +.katex .rule { + min-height: 1px; +} +.katex .mspace { + display: inline-block; +} +.katex .llap, +.katex .rlap, +.katex .clap { + width: 0; + position: relative; +} +.katex .llap > .inner, +.katex .rlap > .inner, +.katex .clap > .inner { + position: absolute; +} +.katex .llap > .fix, +.katex .rlap > .fix, +.katex .clap > .fix { + display: inline-block; +} +.katex .llap > .inner { + right: 0; +} +.katex .rlap > .inner, +.katex .clap > .inner { + left: 0; +} +.katex .clap > .inner > span { + margin-left: -50%; + margin-right: 50%; +} +.katex .rule { + display: inline-block; + border: solid 0; + position: relative; +} +.katex .overline .overline-line, +.katex .underline .underline-line, +.katex .hline { + display: inline-block; + width: 100%; + border-bottom-style: solid; +} +.katex .hdashline { + display: inline-block; + width: 100%; + border-bottom-style: dashed; +} +.katex .sqrt > .root { + /* These values are taken from the definition of `\r@@t`, + `\mkern 5mu` and `\mkern -10mu`. */ + margin-left: 0.27777778em; + margin-right: -0.55555556em; +} +.katex .sizing.reset-size1.size1, +.katex .fontsize-ensurer.reset-size1.size1 { + font-size: 1em; +} +.katex .sizing.reset-size1.size2, +.katex .fontsize-ensurer.reset-size1.size2 { + font-size: 1.2em; +} +.katex .sizing.reset-size1.size3, +.katex .fontsize-ensurer.reset-size1.size3 { + font-size: 1.4em; +} +.katex .sizing.reset-size1.size4, +.katex .fontsize-ensurer.reset-size1.size4 { + font-size: 1.6em; +} +.katex .sizing.reset-size1.size5, +.katex .fontsize-ensurer.reset-size1.size5 { + font-size: 1.8em; +} +.katex .sizing.reset-size1.size6, +.katex .fontsize-ensurer.reset-size1.size6 { + font-size: 2em; +} +.katex .sizing.reset-size1.size7, +.katex .fontsize-ensurer.reset-size1.size7 { + font-size: 2.4em; +} +.katex .sizing.reset-size1.size8, +.katex .fontsize-ensurer.reset-size1.size8 { + font-size: 2.88em; +} +.katex .sizing.reset-size1.size9, +.katex .fontsize-ensurer.reset-size1.size9 { + font-size: 3.456em; +} +.katex .sizing.reset-size1.size10, +.katex .fontsize-ensurer.reset-size1.size10 { + font-size: 4.148em; +} +.katex .sizing.reset-size1.size11, +.katex .fontsize-ensurer.reset-size1.size11 { + font-size: 4.976em; +} +.katex .sizing.reset-size2.size1, +.katex .fontsize-ensurer.reset-size2.size1 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size2.size2, +.katex .fontsize-ensurer.reset-size2.size2 { + font-size: 1em; +} +.katex .sizing.reset-size2.size3, +.katex .fontsize-ensurer.reset-size2.size3 { + font-size: 1.16666667em; +} +.katex .sizing.reset-size2.size4, +.katex .fontsize-ensurer.reset-size2.size4 { + font-size: 1.33333333em; +} +.katex .sizing.reset-size2.size5, +.katex .fontsize-ensurer.reset-size2.size5 { + font-size: 1.5em; +} +.katex .sizing.reset-size2.size6, +.katex .fontsize-ensurer.reset-size2.size6 { + font-size: 1.66666667em; +} +.katex .sizing.reset-size2.size7, +.katex .fontsize-ensurer.reset-size2.size7 { + font-size: 2em; +} +.katex .sizing.reset-size2.size8, +.katex .fontsize-ensurer.reset-size2.size8 { + font-size: 2.4em; +} +.katex .sizing.reset-size2.size9, +.katex .fontsize-ensurer.reset-size2.size9 { + font-size: 2.88em; +} +.katex .sizing.reset-size2.size10, +.katex .fontsize-ensurer.reset-size2.size10 { + font-size: 3.45666667em; +} +.katex .sizing.reset-size2.size11, +.katex .fontsize-ensurer.reset-size2.size11 { + font-size: 4.14666667em; +} +.katex .sizing.reset-size3.size1, +.katex .fontsize-ensurer.reset-size3.size1 { + font-size: 0.71428571em; +} +.katex .sizing.reset-size3.size2, +.katex .fontsize-ensurer.reset-size3.size2 { + font-size: 0.85714286em; +} +.katex .sizing.reset-size3.size3, +.katex .fontsize-ensurer.reset-size3.size3 { + font-size: 1em; +} +.katex .sizing.reset-size3.size4, +.katex .fontsize-ensurer.reset-size3.size4 { + font-size: 1.14285714em; +} +.katex .sizing.reset-size3.size5, +.katex .fontsize-ensurer.reset-size3.size5 { + font-size: 1.28571429em; +} +.katex .sizing.reset-size3.size6, +.katex .fontsize-ensurer.reset-size3.size6 { + font-size: 1.42857143em; +} +.katex .sizing.reset-size3.size7, +.katex .fontsize-ensurer.reset-size3.size7 { + font-size: 1.71428571em; +} +.katex .sizing.reset-size3.size8, +.katex .fontsize-ensurer.reset-size3.size8 { + font-size: 2.05714286em; +} +.katex .sizing.reset-size3.size9, +.katex .fontsize-ensurer.reset-size3.size9 { + font-size: 2.46857143em; +} +.katex .sizing.reset-size3.size10, +.katex .fontsize-ensurer.reset-size3.size10 { + font-size: 2.96285714em; +} +.katex .sizing.reset-size3.size11, +.katex .fontsize-ensurer.reset-size3.size11 { + font-size: 3.55428571em; +} +.katex .sizing.reset-size4.size1, +.katex .fontsize-ensurer.reset-size4.size1 { + font-size: 0.625em; +} +.katex .sizing.reset-size4.size2, +.katex .fontsize-ensurer.reset-size4.size2 { + font-size: 0.75em; +} +.katex .sizing.reset-size4.size3, +.katex .fontsize-ensurer.reset-size4.size3 { + font-size: 0.875em; +} +.katex .sizing.reset-size4.size4, +.katex .fontsize-ensurer.reset-size4.size4 { + font-size: 1em; +} +.katex .sizing.reset-size4.size5, +.katex .fontsize-ensurer.reset-size4.size5 { + font-size: 1.125em; +} +.katex .sizing.reset-size4.size6, +.katex .fontsize-ensurer.reset-size4.size6 { + font-size: 1.25em; +} +.katex .sizing.reset-size4.size7, +.katex .fontsize-ensurer.reset-size4.size7 { + font-size: 1.5em; +} +.katex .sizing.reset-size4.size8, +.katex .fontsize-ensurer.reset-size4.size8 { + font-size: 1.8em; +} +.katex .sizing.reset-size4.size9, +.katex .fontsize-ensurer.reset-size4.size9 { + font-size: 2.16em; +} +.katex .sizing.reset-size4.size10, +.katex .fontsize-ensurer.reset-size4.size10 { + font-size: 2.5925em; +} +.katex .sizing.reset-size4.size11, +.katex .fontsize-ensurer.reset-size4.size11 { + font-size: 3.11em; +} +.katex .sizing.reset-size5.size1, +.katex .fontsize-ensurer.reset-size5.size1 { + font-size: 0.55555556em; +} +.katex .sizing.reset-size5.size2, +.katex .fontsize-ensurer.reset-size5.size2 { + font-size: 0.66666667em; +} +.katex .sizing.reset-size5.size3, +.katex .fontsize-ensurer.reset-size5.size3 { + font-size: 0.77777778em; +} +.katex .sizing.reset-size5.size4, +.katex .fontsize-ensurer.reset-size5.size4 { + font-size: 0.88888889em; +} +.katex .sizing.reset-size5.size5, +.katex .fontsize-ensurer.reset-size5.size5 { + font-size: 1em; +} +.katex .sizing.reset-size5.size6, +.katex .fontsize-ensurer.reset-size5.size6 { + font-size: 1.11111111em; +} +.katex .sizing.reset-size5.size7, +.katex .fontsize-ensurer.reset-size5.size7 { + font-size: 1.33333333em; +} +.katex .sizing.reset-size5.size8, +.katex .fontsize-ensurer.reset-size5.size8 { + font-size: 1.6em; +} +.katex .sizing.reset-size5.size9, +.katex .fontsize-ensurer.reset-size5.size9 { + font-size: 1.92em; +} +.katex .sizing.reset-size5.size10, +.katex .fontsize-ensurer.reset-size5.size10 { + font-size: 2.30444444em; +} +.katex .sizing.reset-size5.size11, +.katex .fontsize-ensurer.reset-size5.size11 { + font-size: 2.76444444em; +} +.katex .sizing.reset-size6.size1, +.katex .fontsize-ensurer.reset-size6.size1 { + font-size: 0.5em; +} +.katex .sizing.reset-size6.size2, +.katex .fontsize-ensurer.reset-size6.size2 { + font-size: 0.6em; +} +.katex .sizing.reset-size6.size3, +.katex .fontsize-ensurer.reset-size6.size3 { + font-size: 0.7em; +} +.katex .sizing.reset-size6.size4, +.katex .fontsize-ensurer.reset-size6.size4 { + font-size: 0.8em; +} +.katex .sizing.reset-size6.size5, +.katex .fontsize-ensurer.reset-size6.size5 { + font-size: 0.9em; +} +.katex .sizing.reset-size6.size6, +.katex .fontsize-ensurer.reset-size6.size6 { + font-size: 1em; +} +.katex .sizing.reset-size6.size7, +.katex .fontsize-ensurer.reset-size6.size7 { + font-size: 1.2em; +} +.katex .sizing.reset-size6.size8, +.katex .fontsize-ensurer.reset-size6.size8 { + font-size: 1.44em; +} +.katex .sizing.reset-size6.size9, +.katex .fontsize-ensurer.reset-size6.size9 { + font-size: 1.728em; +} +.katex .sizing.reset-size6.size10, +.katex .fontsize-ensurer.reset-size6.size10 { + font-size: 2.074em; +} +.katex .sizing.reset-size6.size11, +.katex .fontsize-ensurer.reset-size6.size11 { + font-size: 2.488em; +} +.katex .sizing.reset-size7.size1, +.katex .fontsize-ensurer.reset-size7.size1 { + font-size: 0.41666667em; +} +.katex .sizing.reset-size7.size2, +.katex .fontsize-ensurer.reset-size7.size2 { + font-size: 0.5em; +} +.katex .sizing.reset-size7.size3, +.katex .fontsize-ensurer.reset-size7.size3 { + font-size: 0.58333333em; +} +.katex .sizing.reset-size7.size4, +.katex .fontsize-ensurer.reset-size7.size4 { + font-size: 0.66666667em; +} +.katex .sizing.reset-size7.size5, +.katex .fontsize-ensurer.reset-size7.size5 { + font-size: 0.75em; +} +.katex .sizing.reset-size7.size6, +.katex .fontsize-ensurer.reset-size7.size6 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size7.size7, +.katex .fontsize-ensurer.reset-size7.size7 { + font-size: 1em; +} +.katex .sizing.reset-size7.size8, +.katex .fontsize-ensurer.reset-size7.size8 { + font-size: 1.2em; +} +.katex .sizing.reset-size7.size9, +.katex .fontsize-ensurer.reset-size7.size9 { + font-size: 1.44em; +} +.katex .sizing.reset-size7.size10, +.katex .fontsize-ensurer.reset-size7.size10 { + font-size: 1.72833333em; +} +.katex .sizing.reset-size7.size11, +.katex .fontsize-ensurer.reset-size7.size11 { + font-size: 2.07333333em; +} +.katex .sizing.reset-size8.size1, +.katex .fontsize-ensurer.reset-size8.size1 { + font-size: 0.34722222em; +} +.katex .sizing.reset-size8.size2, +.katex .fontsize-ensurer.reset-size8.size2 { + font-size: 0.41666667em; +} +.katex .sizing.reset-size8.size3, +.katex .fontsize-ensurer.reset-size8.size3 { + font-size: 0.48611111em; +} +.katex .sizing.reset-size8.size4, +.katex .fontsize-ensurer.reset-size8.size4 { + font-size: 0.55555556em; +} +.katex .sizing.reset-size8.size5, +.katex .fontsize-ensurer.reset-size8.size5 { + font-size: 0.625em; +} +.katex .sizing.reset-size8.size6, +.katex .fontsize-ensurer.reset-size8.size6 { + font-size: 0.69444444em; +} +.katex .sizing.reset-size8.size7, +.katex .fontsize-ensurer.reset-size8.size7 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size8.size8, +.katex .fontsize-ensurer.reset-size8.size8 { + font-size: 1em; +} +.katex .sizing.reset-size8.size9, +.katex .fontsize-ensurer.reset-size8.size9 { + font-size: 1.2em; +} +.katex .sizing.reset-size8.size10, +.katex .fontsize-ensurer.reset-size8.size10 { + font-size: 1.44027778em; +} +.katex .sizing.reset-size8.size11, +.katex .fontsize-ensurer.reset-size8.size11 { + font-size: 1.72777778em; +} +.katex .sizing.reset-size9.size1, +.katex .fontsize-ensurer.reset-size9.size1 { + font-size: 0.28935185em; +} +.katex .sizing.reset-size9.size2, +.katex .fontsize-ensurer.reset-size9.size2 { + font-size: 0.34722222em; +} +.katex .sizing.reset-size9.size3, +.katex .fontsize-ensurer.reset-size9.size3 { + font-size: 0.40509259em; +} +.katex .sizing.reset-size9.size4, +.katex .fontsize-ensurer.reset-size9.size4 { + font-size: 0.46296296em; +} +.katex .sizing.reset-size9.size5, +.katex .fontsize-ensurer.reset-size9.size5 { + font-size: 0.52083333em; +} +.katex .sizing.reset-size9.size6, +.katex .fontsize-ensurer.reset-size9.size6 { + font-size: 0.5787037em; +} +.katex .sizing.reset-size9.size7, +.katex .fontsize-ensurer.reset-size9.size7 { + font-size: 0.69444444em; +} +.katex .sizing.reset-size9.size8, +.katex .fontsize-ensurer.reset-size9.size8 { + font-size: 0.83333333em; +} +.katex .sizing.reset-size9.size9, +.katex .fontsize-ensurer.reset-size9.size9 { + font-size: 1em; +} +.katex .sizing.reset-size9.size10, +.katex .fontsize-ensurer.reset-size9.size10 { + font-size: 1.20023148em; +} +.katex .sizing.reset-size9.size11, +.katex .fontsize-ensurer.reset-size9.size11 { + font-size: 1.43981481em; +} +.katex .sizing.reset-size10.size1, +.katex .fontsize-ensurer.reset-size10.size1 { + font-size: 0.24108004em; +} +.katex .sizing.reset-size10.size2, +.katex .fontsize-ensurer.reset-size10.size2 { + font-size: 0.28929605em; +} +.katex .sizing.reset-size10.size3, +.katex .fontsize-ensurer.reset-size10.size3 { + font-size: 0.33751205em; +} +.katex .sizing.reset-size10.size4, +.katex .fontsize-ensurer.reset-size10.size4 { + font-size: 0.38572806em; +} +.katex .sizing.reset-size10.size5, +.katex .fontsize-ensurer.reset-size10.size5 { + font-size: 0.43394407em; +} +.katex .sizing.reset-size10.size6, +.katex .fontsize-ensurer.reset-size10.size6 { + font-size: 0.48216008em; +} +.katex .sizing.reset-size10.size7, +.katex .fontsize-ensurer.reset-size10.size7 { + font-size: 0.57859209em; +} +.katex .sizing.reset-size10.size8, +.katex .fontsize-ensurer.reset-size10.size8 { + font-size: 0.69431051em; +} +.katex .sizing.reset-size10.size9, +.katex .fontsize-ensurer.reset-size10.size9 { + font-size: 0.83317261em; +} +.katex .sizing.reset-size10.size10, +.katex .fontsize-ensurer.reset-size10.size10 { + font-size: 1em; +} +.katex .sizing.reset-size10.size11, +.katex .fontsize-ensurer.reset-size10.size11 { + font-size: 1.19961427em; +} +.katex .sizing.reset-size11.size1, +.katex .fontsize-ensurer.reset-size11.size1 { + font-size: 0.20096463em; +} +.katex .sizing.reset-size11.size2, +.katex .fontsize-ensurer.reset-size11.size2 { + font-size: 0.24115756em; +} +.katex .sizing.reset-size11.size3, +.katex .fontsize-ensurer.reset-size11.size3 { + font-size: 0.28135048em; +} +.katex .sizing.reset-size11.size4, +.katex .fontsize-ensurer.reset-size11.size4 { + font-size: 0.32154341em; +} +.katex .sizing.reset-size11.size5, +.katex .fontsize-ensurer.reset-size11.size5 { + font-size: 0.36173633em; +} +.katex .sizing.reset-size11.size6, +.katex .fontsize-ensurer.reset-size11.size6 { + font-size: 0.40192926em; +} +.katex .sizing.reset-size11.size7, +.katex .fontsize-ensurer.reset-size11.size7 { + font-size: 0.48231511em; +} +.katex .sizing.reset-size11.size8, +.katex .fontsize-ensurer.reset-size11.size8 { + font-size: 0.57877814em; +} +.katex .sizing.reset-size11.size9, +.katex .fontsize-ensurer.reset-size11.size9 { + font-size: 0.69453376em; +} +.katex .sizing.reset-size11.size10, +.katex .fontsize-ensurer.reset-size11.size10 { + font-size: 0.83360129em; +} +.katex .sizing.reset-size11.size11, +.katex .fontsize-ensurer.reset-size11.size11 { + font-size: 1em; +} +.katex .delimsizing.size1 { + font-family: KaTeX_Size1; +} +.katex .delimsizing.size2 { + font-family: KaTeX_Size2; +} +.katex .delimsizing.size3 { + font-family: KaTeX_Size3; +} +.katex .delimsizing.size4 { + font-family: KaTeX_Size4; +} +.katex .delimsizing.mult .delim-size1 > span { + font-family: KaTeX_Size1; +} +.katex .delimsizing.mult .delim-size4 > span { + font-family: KaTeX_Size4; +} +.katex .nulldelimiter { + display: inline-block; + width: 0.12em; +} +.katex .delimcenter { + position: relative; +} +.katex .op-symbol { + position: relative; +} +.katex .op-symbol.small-op { + font-family: KaTeX_Size1; +} +.katex .op-symbol.large-op { + font-family: KaTeX_Size2; +} +.katex .op-limits > .vlist-t { + text-align: center; +} +.katex .accent > .vlist-t { + text-align: center; +} +.katex .accent .accent-body { + position: relative; +} +.katex .accent .accent-body:not(.accent-full) { + width: 0; +} +.katex .overlay { + display: block; +} +.katex .mtable .vertical-separator { + display: inline-block; + min-width: 1px; +} +.katex .mtable .arraycolsep { + display: inline-block; +} +.katex .mtable .col-align-c > .vlist-t { + text-align: center; +} +.katex .mtable .col-align-l > .vlist-t { + text-align: left; +} +.katex .mtable .col-align-r > .vlist-t { + text-align: right; +} +.katex .svg-align { + text-align: left; +} +.katex svg { + display: block; + position: absolute; + width: 100%; + height: inherit; + fill: currentColor; + stroke: currentColor; + fill-rule: nonzero; + fill-opacity: 1; + stroke-width: 1; + stroke-linecap: butt; + stroke-linejoin: miter; + stroke-miterlimit: 4; + stroke-dasharray: none; + stroke-dashoffset: 0; + stroke-opacity: 1; +} +.katex svg path { + stroke: none; +} +.katex img { + border-style: none; + min-width: 0; + min-height: 0; + max-width: none; + max-height: none; +} +.katex .stretchy { + width: 100%; + display: block; + position: relative; + overflow: hidden; +} +.katex .stretchy::before, +.katex .stretchy::after { + content: ""; +} +.katex .hide-tail { + width: 100%; + position: relative; + overflow: hidden; +} +.katex .halfarrow-left { + position: absolute; + left: 0; + width: 50.2%; + overflow: hidden; +} +.katex .halfarrow-right { + position: absolute; + right: 0; + width: 50.2%; + overflow: hidden; +} +.katex .brace-left { + position: absolute; + left: 0; + width: 25.1%; + overflow: hidden; +} +.katex .brace-center { + position: absolute; + left: 25%; + width: 50%; + overflow: hidden; +} +.katex .brace-right { + position: absolute; + right: 0; + width: 25.1%; + overflow: hidden; +} +.katex .x-arrow-pad { + padding: 0 0.5em; +} +.katex .cd-arrow-pad { + padding: 0 0.55556em 0 0.27778em; +} +.katex .x-arrow, +.katex .mover, +.katex .munder { + text-align: center; +} +.katex .boxpad { + padding: 0 0.3em 0 0.3em; +} +.katex .fbox, +.katex .fcolorbox { + box-sizing: border-box; + border: 0.04em solid; +} +.katex .cancel-pad { + padding: 0 0.2em 0 0.2em; +} +.katex .cancel-lap { + margin-left: -0.2em; + margin-right: -0.2em; +} +.katex .sout { + border-bottom-style: solid; + border-bottom-width: 0.08em; +} +.katex .angl { + box-sizing: border-content; + border-top: 0.049em solid; + border-right: 0.049em solid; + margin-right: 0.03889em; +} +.katex .anglpad { + padding: 0 0.03889em 0 0.03889em; +} +.katex .eqn-num::before { + counter-increment: katexEqnNo; + content: "(" counter(katexEqnNo) ")"; +} +.katex .mml-eqn-num::before { + counter-increment: mmlEqnNo; + content: "(" counter(mmlEqnNo) ")"; +} +.katex .mtr-glue { + width: 50%; +} +.katex .cd-vert-arrow { + display: inline-block; + position: relative; +} +.katex .cd-label-left { + display: inline-block; + position: absolute; + right: -webkit-calc(50% + 0.3em); + right: calc(50% + 0.3em); + text-align: left; +} +.katex .cd-label-right { + display: inline-block; + position: absolute; + left: -webkit-calc(50% + 0.3em); + left: calc(50% + 0.3em); + text-align: right; +} +.katex-display { + display: block; + margin: 1em 0; + text-align: center; +} +.katex-display > .katex { + display: block; + text-align: center; + white-space: nowrap; +} +.katex-display > .katex > .katex-html { + display: block; + position: relative; +} +.katex-display > .katex > .katex-html > .tag { + position: absolute; + right: 0; +} +.katex-display.leqno > .katex > .katex-html > .tag { + left: 0; + right: auto; +} +.katex-display.fleqn > .katex { + text-align: left; + padding-left: 2em; +} +body { + counter-reset: katexEqnNo mmlEqnNo; +} + diff --git a/css/main.css b/css/main.css new file mode 100644 index 00000000..3ce386fd --- /dev/null +++ b/css/main.css @@ -0,0 +1,684 @@ +@font-face { + font-family: 'Roboto Regular'; + font-display: auto; + font-style: normal; + font-weight: 400; + src: local('Roboto Regular'), url('../webfonts/Roboto-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Roboto Medium'; + font-display: auto; + font-style: normal; + font-weight: 500; + src: local('Roboto Medium'), url('../webfonts/Roboto-Medium.woff') format('woff'); +} + +@font-face { + font-family: 'Roboto Bold'; + font-display: auto; + font-style: normal; + font-weight: 600; + src: local('Roboto Bold'), url('../webfonts/Roboto-Bold.woff') format('woff'); +} + +@font-face { + font-family: 'Roboto Slab Regular'; + font-display: auto; + font-style: normal; + font-weight: 400; + src: local('Roboto Slab Regular'), url('../webfonts/RobotoSlab-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Roboto Mono'; + font-display: auto; + font-style: normal; + font-weight: 400; + src: local('Roboto Mono'), url('../webfonts/RobotoMono-Regular.woff') format('woff'); +} + +:root { + --bg-color: #FDFDFD; + --txt-color: #333; + --line-color: #EEE; + --fn-color: #CCC; + --ft-txt-color: #777; + --lk-color: #00E; + --hover-color: #808080; + --bq-color: #E00; + --tb1-color: #DEE2E6; + --inline-cd-color: #DDD; +} + +[data-theme="dark"] { + --bg-color: #181714; + --txt-color: #FFEECA; + --line-color: #433F37; + --fn-color: #534F47; + --ft-txt-color: #FFEECA; + --lk-color: #8192AE; + --hover-color: #B1A184; + --bq-color: #75271E; + --tb1-color: #47443B; + --inline-cd-color: #37342E; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg-color: #181714; + --txt-color: #FFEECA; + --line-color: #433F37; + --fn-color: #534F47; + --ft-txt-color: #FFEECA; + --lk-color: #8192AE; + --hover-color: #B1A184; + --bq-color: #75271E; + --tb1-color: #47443B; + --inline-cd-color: #37342E; + } +} + +html { + background-color: var(--bg-color); +} + +body { + font-family: "Roboto Regular", serif; + font-weight: 400; + font-size: 18px; + color: var(--txt-color); + line-height: 1.6rem; + max-width: 800px; + margin: 20px auto 0 auto; +} + +header { + margin-bottom: 20px; +} + +header nav { + text-align: center; +} + +header nav ul, +header nav li { + margin: 0; + padding: 0; +} + +footer { + font-family: "Roboto Slab Regular", serif; + text-align: right; + font-size: 0.75em; + border-top: 1px solid var(--line-color); + margin-top: 10px; + padding: 5px 0; +} + +footer a { + color: var(--ft-txt-color); +} + +footer a:hover { + color: var(--lk-color); +} + +html,button,input,select,textarea { + color: var(--txt-color); +} + +b, strong { + font-family: "Roboto Bold"; +} + +a { + color: var(--lk-color); + text-decoration: none; + word-break: break-word; +} +a:hover { + color: var(--hover-color); +} + +hr { + display: block; + height: 1px; + border: 0; + border-top: 1px solid var(--fn-color); + margin: 1rem 0; + padding: 0; +} + +img { + margin: 10px auto 10px auto; + max-width: 100%; + display: block; +} + +a img { + border:none; +} + +figure { + margin: 0; + text-align: center; +} + +fieldset { + border: 0; + margin: 0; + padding: 0; +} + +textarea { + resize: vertical; +} + +blockquote { + margin-left: 1rem; + border-left: 2px solid var(--bq-color); + padding-left: 20px; +} + +blockquote cite { + font-size: 70%; + opacity: .8; +} + +blockquote em { + font-weight: 600; +} + +h1, h2, h3, h4, h5, h6 { + color: var(--txt-color); + font-weight: 500; + line-height: 1.3em; + margin: 30px 0 20px 0; +} + +h1 { + font-size: 2.75rem; +} + +h2 { + font-size: 2rem; +} + +h3 { + font-size: 1.6rem; +} + +h4 { + font-size: 1.2rem; +} + +h5 { + font-size: 1rem; +} + +h6 { + font-size: .9rem; +} + +ul { + padding-left: 15px; + list-style: disc inside; +} + +table { + -ms-overflow-style: -ms-autohiding-scrollbar; + -webkit-overflow-scrolling: touch; + background-color: transparent; + margin-bottom: 1rem; + overflow-x: auto; + width: 100%; +} + +table th, +table td { + border-bottom: 1px solid var(--tb1-color); + padding: 0.75rem; + vertical-align: top; +} + +table thead th { + border-bottom: 2px solid var(--tb1-color); + vertical-align: bottom; +} + +table tbody + tbody { + border-top: 2px solid var(--tb1-color); +} + +table tbody tr:nth-of-type(even) { + background-color: var(--hover-color); + color: var(--bg-color); +} + +table th { + background-color: var(--txt-color); + border-color: var(--txt-color); + color: var(--bg-color); +} + +#avatar { + float: left; + margin-right: 20px; +} + +#avatar img { + width: 80px; + height: 80px; + border-radius: 100%; +} + +#title { + margin: 0 0 -15px 0; + font-size: 2.75rem; +} + +#title a { + color: var(--txt-color); +} + +#title a:hover { + color: var(--hover-color); +} + +#titleonly { + font-size: 4.75rem; + margin: 0; +} + +#titleonly a { + color: var(--txt-color); +} + +#titleonly a:hover { + color: var(--hover-color); +} + +#title-description { + display: flex; + justify-content: space-between; +} + +#title-social { + float: right; + margin-top: -54px; +} + +#social nav { + margin: auto 0; + max-width: 128px; +} + +#social nav ul { + justify-content: center; + display: flex; + flex-wrap: wrap; +} + +#social nav li { + list-style: none; + margin: 0 10px 0 0; +} + +#mainmenu nav { + border-top: 1px solid var(--line-color); + border-bottom: 1px solid var(--line-color); + padding: 5px 0 5px 0; +} + +#mainmenu nav li { + display: inline-block; + list-style: none; + margin: 0 30px 0 0; +} + +#mainmenu li:last-child { + margin: 0; +} + +.icons { + color: var(--txt-color); + font-size: 1.4rem; +} + +.icons:hover { + color: var(--hover-color); +} + +.recent-posts .posts .post { + margin-bottom: 45px; +} + +.flat .post { + margin-bottom: 45px; +} + +.post-header { + display: flex; +} + +.post-header .meta .date { + margin-right: 19px; + width: 75px; + text-align: center; +} + +.post-header .meta .date .day { + font-family: "Roboto Slab Regular", serif; + font-weight: 700; + line-height: 0.45em; + font-size: 3em; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} + +.post-header .meta .date .rest { + display: block; + font-size: 0.80em; + font-family: "Roboto Slab Regular", serif; +} + +.post-header h1.title { + margin: -10px 0 0 0; + font-family: "Roboto Slab Regular", serif; + font-weight: bold; +} + +.markdown { + overflow: hidden; +} + +.post .title.small { + margin: 0; + font-family: "Roboto Slab Regular", serif; +} + +.post .draft-label { + color: var(--bq-color); + text-decoration: underline; + padding: 2px 4px; + margin-left: 6px; + font-size: 1.4rem; +} + +.post .tags a { + display: inline-block; + border: 1px solid; + border-radius: 3px; + padding: 0px 6px; + line-height: 20px; + font-size: 0.85em; + text-decoration: none; + margin: 0 10px 0 0; +} + +.tags p { + margin: 10px 0 10px 0; +} + +.post .tags a:hover { + border: 1px solid var(--bg-color); +} + +.post ul li { + margin-bottom: 10px; +} + +.post ul li p { + display: inline; +} + +.list .posts .post-header .meta { + margin-bottom: 0; +} + +.post-meta { + color: var(--hover-color); + font-size: 14px; + font-style: italic; + margin: 0 0 10px; +} + +.pagination { + margin: 0; + padding: 0; + text-align: left; + display: flex; + justify-content: space-between; +} + +.pagination li { + list-style: none; + display: inline-block; + margin: 0; + padding: 0; +} + +.pagination .page-prev { + margin-right: 20px; + padding-right: 20px; +} + +.pagination .page-item.page-prev { + text-align: left; +} + +.pagination .page-item.page-next { + text-align: right; +} + +.page-title { + font-weight: bold; + font-family: "Roboto Slab Regular", serif; + margin: -10px 0 30px 0; +} + +.tag-cloud { + margin-top: 20px; + line-height: normal; + text-align: center; +} + +.tag-cloud a { + margin-right: 15px; +} + +.author { + font-size: 1.2rem; + margin-bottom: 10px; +} + +.tags { + text-align: center; + padding: 5px 0 5px 0; +} + +.clearit { + clear: both; +} + +.termsfloating_right { + float: right; + width: 80%; +} + +.taxosfloating_left { + float: left; + width: 20%; +} + +ul.flat { + margin: 0; + padding: 0; +} + +ul.flat li { + list-style: none; + margin-left: 0; +} + +code, kbd, pre, samp { + font-family: "Roboto Mono", monospace; + font-size: 0.95em; +} + +.highlight pre { + margin-bottom: 0; + margin-top: 0; + padding: 20px; +} + +.highlight { + background: 0 0; + background-color: var(--bg-color); +} + +pre, textarea { + overflow: auto; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +legend, td, th { + padding: 0; +} + +.gist table tbody tr:nth-of-type(even) { + background-color: unset; +} + +.gist table th, table td { + border-bottom: unset; +} + +p code { + border-radius: 5px; + background: var(--inline-cd-color); + padding: 0px 4px; +} + +.left, .alignleft { + float: left; +} + +.right, .alignright { + float: right; +} + +@media screen and (max-width: 800px) { + body { + margin: 0 auto; + padding: 15px; + } + + header { + text-align: center; + } + + h1 { + font-size: 1.8rem; + } + + h2 { + font-size: 1.6rem; + } + + h3 { + font-size: 1.4rem; + } + + h4 { + font-size: 1rem; + } + + blockquote { + margin-left: 1rem; + border-left: 2px solid var(--bq-color); + padding-left: 20px; + } + + table { + -ms-overflow-style: -ms-autohiding-scrollbar; + -webkit-overflow-scrolling: touch; + display: block; + overflow-x: auto; + width: 100%; + } + + #avatar { + display: none; + } + + #title { + line-height: 1em; + } + + #titleonly { + line-height: 1em; + font-size: 4rem; + margin: 0px; + text-align: center; + } + + #titletext { + margin: 0 0 10px 0; + } + + #title-description { + flex-direction: column; + } + + #title-social { + float: none; + margin: 0; + } + + #subtitle { + margin: 5px 0 5px 0; + } + + #social nav { + max-width: none; + } + + #social nav ul { + justify-content: center; + } + + #social nav li { + list-style: none; + margin: 0 10px 0 0; + padding: 2px; + } + + #social li:last-child { + margin: 0; + } + + #mainmenu nav li { + display: inline-block; + list-style: none; + margin: 0 10px 0 0; + } + + .icons { + font-size: 1.8rem; + } + + .left, .alignleft { + float: none; + } + + .right, .alignright { + float: none; + } +} diff --git a/css/normalize.css b/css/normalize.css new file mode 100644 index 00000000..192eb9ce --- /dev/null +++ b/css/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} diff --git a/css/style.css b/css/style.css deleted file mode 100644 index cf4abcae..00000000 --- a/css/style.css +++ /dev/null @@ -1 +0,0 @@ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;line-height:1.5}html,body{color:#555;background-color:#fff;margin:0;padding:0}html{font-family:"Libre Baskerville","Times New Roman",Times,serif;font-size:14px;overflow-y:scroll}@media (min-width: 600px){html{font-size:16px}}body{-webkit-text-size-adjust:100%}h1,h2,h3,h4,h5,h6{color:#353535;font-family:"Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;line-height:normal}a{color:#4a9ae1;text-decoration:none}blockquote{border-left:0.25rem solid #e5e5e5;color:#979797;margin:.8rem 0;padding:.5rem 1rem}blockquote p:last-child{margin-bottom:0}@media (min-width: 600px){blockquote{padding:0 5rem 0 1.25rem}}img{display:block;margin:0 0 1rem;max-width:100%}td{vertical-align:top}pre,code{font-family:Menlo,Monaco,monospace}code{background-color:#f9f9f9;border-radius:3px;color:#bf616a;font-size:85%;padding:.25em .5em;white-space:pre-wrap}pre{margin:0 0 1rem}pre code{background-color:transparent;color:inherit;font-size:100%;padding:0}.highlight{background-color:#f9f9f9;border-radius:3px;line-height:1.4;margin:0 0 1rem;padding:1rem}.highlight pre{margin-bottom:0;overflow-x:auto}.highlight .lineno{color:#aaa;display:inline-block;padding:0 .75rem 0 .25rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.post{padding:3rem 0}.post-info{color:#aaa;font-family:Palatino,"Palatino LT STD","Palatino Linotype","Book Antiqua","Georgia",serif;letter-spacing:0.5px;text-align:center}.post-info span{font-style:italic}.post-title{color:#353535;font-family:"Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-size:4rem;margin:1rem 0;text-align:center}.post-line{border-top:0.4rem solid #353535;display:block;margin:0 auto 3rem;width:4rem}.post p{margin:0 0 1rem;text-align:justify}.post a:hover{text-decoration:underline}.post img{margin:0 auto 0.5rem}.post img+em{color:#aaa;display:block;font-family:"Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-size:0.9rem;font-style:normal;text-align:center}.post img.emoji{display:inline-block;left:0;transform:none;width:1rem;height:1rem;vertical-align:text-top;padding:0;margin:0}.highlight .hll{background-color:#ffc}.highlight .c{color:#999}.highlight .err{color:#a00;background-color:#faa}.highlight .k{color:#069}.highlight .o{color:#555}.highlight .cm{color:#09f;font-style:italic}.highlight .cp{color:#099}.highlight .c1{color:#999}.highlight .cs{color:#999}.highlight .gd{background-color:#fcc;border:1px solid #c00}.highlight .ge{font-style:italic}.highlight .gr{color:#f00}.highlight .gh{color:#030}.highlight .gi{background-color:#cfc;border:1px solid #0c0}.highlight .go{color:#aaa}.highlight .gp{color:#009}.highlight .gu{color:#030}.highlight .gt{color:#9c6}.highlight .kc{color:#069}.highlight .kd{color:#069}.highlight .kn{color:#069}.highlight .kp{color:#069}.highlight .kr{color:#069}.highlight .kt{color:#078}.highlight .m{color:#f60}.highlight .s{color:#d44950}.highlight .na{color:#4f9fcf}.highlight .nb{color:#366}.highlight .nc{color:#0a8}.highlight .no{color:#360}.highlight .nd{color:#99f}.highlight .ni{color:#999}.highlight .ne{color:#c00}.highlight .nf{color:#c0f}.highlight .nl{color:#99f}.highlight .nn{color:#0cf}.highlight .nt{color:#2f6f9f}.highlight .nv{color:#033}.highlight .ow{color:#000}.highlight .w{color:#bbb}.highlight .mf{color:#f60}.highlight .mh{color:#f60}.highlight .mi{color:#f60}.highlight .mo{color:#f60}.highlight .sb{color:#c30}.highlight .sc{color:#c30}.highlight .sd{color:#c30;font-style:italic}.highlight .s2{color:#c30}.highlight .se{color:#c30}.highlight .sh{color:#c30}.highlight .si{color:#a00}.highlight .sx{color:#c30}.highlight .sr{color:#3aa}.highlight .s1{color:#c30}.highlight .ss{color:#fc3}.highlight .bp{color:#366}.highlight .vc{color:#033}.highlight .vg{color:#033}.highlight .vi{color:#033}.highlight .il{color:#f60}.css .o,.css .o+.nt,.css .nt+.nt{color:#999}.container{margin:0 auto;max-width:800px;width:80%}main,footer,.nav-container{display:block;margin:0 auto;max-width:800px;width:80%}.nav{box-shadow:0 2px 2px -2px rgba(0,0,0,0.2);overflow:auto}.nav-container{margin:1rem auto;position:relative;text-align:center}.nav-title{-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;transition:all 0.2s ease-out;color:#555;display:inline-block;margin:0;padding-right:.2rem}.nav-title:hover,.nav-title:focus{opacity:.6}.nav ul{list-style-type:none;margin:1rem 0 0;padding:0;text-align:center}.nav li{-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;transition:all 0.2s ease-out;color:#555;display:inline-block;opacity:.6;padding:0 2rem 0 0}.nav li:last-child{padding-right:0}.nav li:hover,.nav li:focus{opacity:1}.nav a{color:#555;font-family:"Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif}@media (min-width: 600px){.nav-container{text-align:left}.nav ul{bottom:0;position:absolute;right:0}}footer{font-family:Palatino,"Palatino LT STD","Palatino Linotype","Book Antiqua","Georgia",serif;padding:2rem 0;text-align:center}footer span{color:#555;font-size:.8rem}.pagination{border-top:0.5px solid #e5e5e5;font-family:Palatino,"Palatino LT STD","Palatino Linotype","Book Antiqua","Georgia",serif;padding-top:2rem;position:relative;text-align:center}.pagination span{color:#353535;font-size:1.1rem}.pagination .top{-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;transition:all 0.3s ease-out;color:#555;font-family:"Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-size:1.1rem;opacity:.6}.pagination .top:hover{opacity:1}.pagination .arrow{-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;transition:all 0.3s ease-out;color:#555;position:absolute}.pagination .arrow:hover,.pagination .arrow:focus{opacity:.6;text-decoration:none}.pagination .left{left:0}.pagination .right{right:0}.catalogue-item{border-bottom:1px solid #e5e5e5;color:#555;display:block;padding:2rem 0}.catalogue-item:hover .catalogue-line,.catalogue-item:focus .catalogue-line{width:5rem}.catalogue-item:last-child{border:0}.catalogue-time{color:#aaa;font-family:Palatino,"Palatino LT STD","Palatino Linotype","Book Antiqua","Georgia",serif;letter-spacing:.5px}.catalogue-title{color:#353535;display:block;font-family:"Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-size:2rem;font-weight:700;margin:.5rem 0}.catalogue-line{-webkit-transition:all 0.3s ease-out;-moz-transition:all 0.3s ease-out;transition:all 0.3s ease-out;border-top:0.2rem solid #353535;display:block;width:2rem} diff --git a/fonts/libre-baskerville-v7-latin-700.eot b/fonts/libre-baskerville-v7-latin-700.eot deleted file mode 100644 index b99bedcbb4b57d8e84f0a49707a3d367e07444c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31987 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fonts/libre-baskerville-v7-latin-700.ttf b/fonts/libre-baskerville-v7-latin-700.ttf deleted file mode 100644 index 20c689718e2d977dd0c3691b94739a7d4c57d946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80204 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

9xy}JDCgylBHxRmsu4d3_BAcx+&ClVncWZ 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

    Hy3flMwe>CCw9eMscJYm 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 diff --git a/fonts/libre-baskerville-v7-latin-700.woff b/fonts/libre-baskerville-v7-latin-700.woff deleted file mode 100644 index 11e39d5780336254e380a6ba0d6ce309d5ce13ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33816 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 IV=HX{00}F1V*mgE diff --git a/fonts/libre-baskerville-v7-latin-700.woff2 b/fonts/libre-baskerville-v7-latin-700.woff2 deleted file mode 100644 index bcaee8bfd820c6fcd2337cc14c78a447d7626b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27932 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 diff --git a/fonts/libre-baskerville-v7-latin-italic.eot b/fonts/libre-baskerville-v7-latin-italic.eot deleted file mode 100644 index 36fb1b062dcc79126372c195e8c73beea7b07045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35981 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%0A2(>e(;-NuZDUJ5^~lF3oDc*EME^1)J`{@z3(L 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 diff --git a/fonts/libre-baskerville-v7-latin-italic.svg b/fonts/libre-baskerville-v7-latin-italic.svg deleted file mode 100644 index 638670c5..00000000 --- a/fonts/libre-baskerville-v7-latin-italic.svg +++ /dev/null @@ -1,482 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fonts/libre-baskerville-v7-latin-italic.ttf b/fonts/libre-baskerville-v7-latin-italic.ttf deleted file mode 100644 index 64778f33b8de43822ed742c8afd454144ca95484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81712 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 diff --git a/fonts/libre-baskerville-v7-latin-italic.woff2 b/fonts/libre-baskerville-v7-latin-italic.woff2 deleted file mode 100644 index 98818948d7d272df70f7a0373a84813e18031872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30684 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 Tr@dsge(V1qM*ixk^Z)<=D@EhO diff --git a/fonts/libre-baskerville-v7-latin-regular.eot b/fonts/libre-baskerville-v7-latin-regular.eot deleted file mode 100644 index 9cf3f9a1445310bb4b773c6be8335047e2d84c6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31161 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 z 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fonts/libre-baskerville-v7-latin-regular.ttf b/fonts/libre-baskerville-v7-latin-regular.ttf deleted file mode 100644 index 71223c61992991fc83581a34cf7d31c2a87bf932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78732 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

    =6w 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 P%pbZgmXIz7>gxXiAHx_| diff --git a/fonts/libre-baskerville-v7-latin-regular.woff b/fonts/libre-baskerville-v7-latin-regular.woff deleted file mode 100644 index e31c31ad42efdd4ba13bd9df950820eeb1fcfbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33008 zcmYg$W02@f*X{6(ZQHhOd*+O7+qP}nwr!oUZQJ_hdGDXQE33MDWv#AMI;mvuYF9Z? zQ2;=I-|)Kyfd6d(nWBEj|6~4R|Njt^ms9!`SOEaQ<^TY&7$g96N{T6|2m%1WL;v!> z9>4)Z4Q&HCB|1g`0EGW$lmCTYXbzs7p|!r^LZWqlKB4tNCA@3M&H^P0KgmMS7ZL`4N^ul6ST8+ zbOHeI`PBlR|IRtCcdk=!=V1Ih_S5?HCHx}sGZlZ;ZQUvnxQ;{$UbwN;b9toIdZXp{ zh#s}w=yK&-Zn5Uu5Pi%!&0hUCBFw^6$yjM{96&<-`ALqQokv+HRw5YZK<0;3dd&();k+?x$11CW0!w zbLe9@bck$RexV}vkC~Kpb#`;)^I{MCsxH{69!`Ofa~kYQdWUlAg~?Vvmvb-f;(>=O z-KlYRN$X?F_FU(Ld`d%dp_X?I-D7djvaKXVH34QdLq-)wM!C91adU-Y6^(aK%k$Iv zEZvfRk0M2{G(u;+Vupf)I~!0Xne^fmfMaGRO44h<9CbOVa!2psGy?~VbcVCR1NBh3B3~~L(rSG z1-8Q0sD+NhriiX1f*ZCv-vi!RwmF{2$ZH?Ss5i_ZAE{@}kM=V4(!$SK&TUu4VtBDY z=V-Yz8fBAz{?cAXZ;;-_KBpRjD}OAQJx1lNsZWr?)b;M$#HcW4pvjCS_+THPkaStz zDIW_!Xu*@70Qs~|3cmz@3TdCLmA{3A zwe1&?+s7?aFK^As$E@hTYDJe?bTOZ@QI;&CeHEY5!FzGm%7|l>o0|>gc@v@le(8S$lMq?b9D3& zE<0EbPy+R1c!Gg(SM(O#8_Bi>f=bektMu1UAD$O~IaR?f063uj`;hd2OLUdWXNyjV z&r=J~8uqL@in6L2i(aQWTVLM13UByYRI!a`33Mh6qh4NHoHG96FmsC{AJUZD0dEDc zf!IWB3*1XN$C=p)Msmm_iR8dirM=^j28*;H_lo3*r00x6m|cfd1+CIZ+M$GMusF~y zzm8!0z!Q~lbq7?nTr<7BPItQuY4|gvYX3pi5&2IW@tp;N&AkV-mK;z8)`F+ZIj`ao zL#u7<6F>2eSDN4lyOcl1r19FQ#L(ePca0*zvbcbC^$&?U- zG@fR5VZoa&G4a`Y!*}?P&2+%H{SkN{lF4xqJv6Aki3v3%(@!uxljHqsTKWzH6Lq8O z6$?{s?YWeirO~WX)x&$;y+_3sFlOZvcgl3=(HgY7fw0l&;Iy@1Wl>mS9%098`*Xs* z790Z`M4D*~M*M8yG+wZYF)|4)jYSVtE`&M8gRq5QQzJ=7WXoHXV)K`}6jYIj4~qIY_;T46evQV}HmG4zCn%Q= zWt)m!VcwMeDes3#dnjLI%+G-K{B=I*=k^SF>-b6bihr#j8wBUqCCq}7wq2V3)g)Qr zdZzvWh@U5DDpbyjLc*AVRmN7)$1bUa#+9fayZSLj9R5I4ROMp1C#y_Ah6SBO6o^VR zjK~7gnBvtaQW>LZyTn>La0)ErP~KIoql=Y(9EHi48OSLifl*8d(~Ls=YY%vybdKPt z&fndr`9BJbVcm5Ljan{iIHTh6L{foSP5Lc$ICJzbl8Kh&4j~G#^*gPu6C>i$Yiw>l z!b%#=JZz@kra=h#)4RCGWeW9Qf9&^XG?eMrmIZ?wniztf^$us3X9wHD83uv|qk$Jc zE6qVvwPwy2$%(w=uY`D6lH&@Un-3cBpeVpT@x`_?S4!z1sxM+7otwWj{;`@pA_1H4 zPLS@8XAz8aT3Cco)|4CrKWANv%d@Z`)=+5lV0XtiLBrs1We|#_n`gw(V(0OTxPm`7 zNTCj>aZG_!s$1$1f3Xbx9i{kVd`ycW7KT_@go$U;_>T)z?X)Kn`zY%SqUxw%C$-{% zf`=-C9pTt&Qv%8)%~;Y|arv?>j}^YSfO&*kVPbJC?joB-rR1%KiXbJ*t5*zEO7#N; z2_OcN7D>4hfAZ1bo=sCamp?jWzT{%gW3)lih~G}qZhl5isp(lgfpr=bv54hdMY$HG zA&L8q!@(^FVgRY=7zPm2nrenC#iE^9DjrnZ8pNSZl16_|x^EGt6#y1zdbB)#sw6iUnXK}3$v*rCA1}sKm<3!zzKG&iOlXPzc(jbaK zA6GCCf>GKc26w5eusK`9K0Rp}>m-apLbA~_CF%?!D)Hf3jKXXfx1&$OWOdBs>2`W( zZNOc0Z47dn&)(dCXyObuUkby32Wbj|XIx}DgNPJ7R?T)97YoD44^dqd2d))EngqeI zRZ%~xJZ8$gndydDNqX(Ogue+_|MEQ-e|6gad;045ZN4{JeYr05q3Q&-yU@X8>E{Q@#3c#VA!L?{cQ@?wcJ(kM`c9&Hm_BoPR-_4o$H$XdGA&6&Z~)6oigt6uoP zO;qE2B&%wSf(^#Ds%^KHDprMTvUIDo*uh&aSI2lim!*9&)3BS4i_*rpzqc(DgDR6* zop2E(QX@DRV3^l^Lb0&C-nKJ)?eZ8hbIU2`XedavX&%|;QT_K3)^5z!jE>8V?U(pyuZ&~sxGito|XkZuecy;_1*-27a6Bib_$Ydnw&B z#=YC!ga1Mo*6bnB`X^gnK0Q%>IQwTiw*F-n)BLH@Q(a^u=5$AzD7)**+eXR0i&$c)7!TxMno;zfB}T{k4j zY;F;|=Sp&(NM=1Xx{~6j8cc{*twlE5IHCgSC*hbA(7XZnN;zyX&GO?%q&Spgn)V0s zUU>X(4{bwySt8oj`?1*vmLqdH6OA>CL`9AF^PhqypmhD-Ow%mPFZhixc9gzPnDY5Z zoslD2s@CRjPL$DsiqAx@^ha6P0CxlBaCv+zMWrVdV1*Nh(t*P9DAOhB&^I7pVN_Q& z#q;+19BwTa=GwdEkEgK-;~a;!;soOQQ%TyDo$)j?J#GWv6+B~lBe9_s`ZG)KT8yab z<zwsNbw<s3gcXd&-?5-D2Y|xu4t&^@Pm+BF!A!lQ(7c=8^Am$gP{-<1CD}BO5wXfVotZp^D)3&geNrrD$-Fi7 z-bjv70ixq5yH8bhjmjLOB6_cZPF5wCdr)|heL_kEgp8T6aJ9|Z)jRbr_5&*6WEBZT zQ?iT7zieUp6_&}_G&_1R^ylAB1Vz_H9J;^hmY~>)+73uhDP<6S?*a5=56|@9pDsK z(jdMy+j;sTT!agL>8ne{J5G%TJ^|T^~!*}_znG`9T zhip5z0~up5NQG$Gy49%Eo0V%#>KL2`Rdv=TNJK3-$U*v~5;%&*$d-A22U$?E6qDZXyTp?E5BK&P(-8*C`mE=Ng^QLkHjI znGk5ir;SMLc9~qS4R8pw=%8p6CX>y;;T%R7#{()gCFHPV5~UKZER_bVm=YxKCfsB{5uQKF#3<#91>#-oSNp_Lg5Kx#p46m( zg@2p-M+!em`b;$ImRL8g>K14_0qev7kn`X@`*A-m(e{25VNN5hR$c@E_DgUJWgv0} zKZ5KO>drWpA~7Rk>5w!2)a##jt~3p^X%CA=LY(<_@@}Xj&gyZth2n_>)U$jTvGQnE z3zbsM4ocGytE37Aop933rnM-{;D{viIjepH_Pa|n&biU(ktG2y0k2A!{FyMA{b6$? zGW7&dET!13LQ)8FC0l{*>p5@2x+v>a{Z5oi(9Sw69-y=#Q)eN2E#lO#M) zfR^?0oj=Zh4r>KE36oaiI*vbAy6%+(Jl@dqOw6}_Gvalb8Ir#=^6(;i&R@L!*#XE! z_@ETx0*LVeot=r|ZI409TAriX5uS2(J<%y&c-a`#eYyh@!-~4|+hJH-eH&P+eF4o4 z%|+0&?-><{pUwsf0VrgStIdvv`idS1vdnkHiL$Kjhf3lc&CClDe88J}gJ@(}^TW-L zyRsg4_+Rb`{#BD|HH)^>MUhg8xSJV|2E#>kFQi}Y%ot-8<7(4qAC?_B*ltRaY)n>r zBdPL);Uw|OjN?ZDSWwW850SMz^$fZvyF zOSIW~BPt@TnZy2A1HY>*!M7jv73$)PW;@%P?R#tAH4rb_UknL1*>~|xVN@&{PsG#h zv_BmTDmZ=)YM=@Pe`g!@4-M9+IrTx;60ae|qurnm1wCrjmQ?EdRG}EBs%p|QO zZ67!Nte)dpiYW0>H={H~K$0TplPvkiI9^rt%qUSCmcuwj%EtY$c?ebtrb*s?d>CHS z$$kh$PS|z`QJ1*3ml{JxI-Vp>9weMNMObm1x^ch(ri*by$MdprLo)No@t?v)Rl_<0 zFt+OsC|a`J1gbN%!#2Z(w&SpjWAnT)+?DhE4unwCva%db)1ovT4$iy`*7Vb|wkaI; zvMQ9f)7%WkiL$&R3(V1qoOPgzs;Eq`vVts)NY;`#N%7LZzXEXC$_f-qDDunZ!AnXj zc7sv$6XJz@KxOEGjsIJBe$Zg(5d5jBp}sz=G2)@V+uZ2%lOHyG&Eua|Uta(W3C9%#1pfO_S!p7>5i8e`kA}FH5Qo>T{`%+70LxnN-?*e&kj+}aGq}qM*#+1O?yh^r4o(l8M^Iz=q49_k(VykxO z-e(i38S%V!FZ-5vSdzAFXcD@o*%~buJD<(!m_P1ve}Nx;4*u*K{D%#lnzWprv=hh+UfpdA#+6<&F(0i56`@teKP0{?lP zv7M)8IQQiWxy9$xE2tM3iG!`D0w!t>?oE>8;lc`Fiua;1rArc#Ka7F-JqUb;dFxVv z%txCkSc0gRjIFYrS!D5y%DUt32*x7lf+;v7zFqG&z_uH2&B@dY)wjr6Z-h|k{y~uK zej;oz`U^%0co9oP)WTu}Dv)vr%p$k#HbdTk8L*dkGFdlnJ%Ny@MsAzdCF#C!$TFcx zj&@|7_#(f};7)g>o%o`#&E(E^?ydV+wEAKaL5(@}I@>xDr9o{o$z&+;6b07^c@AZ^_0zwv>nK%w zX!y({%wn_nhp-JCz%Z`nl~KP0*Xot=jjYq`n}C{oakgVeUa5j8<#@9z)fi`M?#zF+ zEkCiv`-T=99k?}(%PT_r%-nr+ElJga2sqle9;RY|UqS|~NipHpvz@fMli*#%ULee6jtQ&@YiUlZ`VMnx}*c-s?KR>ojmyt$3JkFqwr>M( zqzCJrZX%>UO;PSJ5u%Zgg|=;`(v)WKTV6kzTYrw`$YeOch-4C?o>T%pS-F;bGH$bz zq^N;MlCu;5o%ontmNRg|c?4?RD3WzIhSs(%3(49feQ)6$W53vOp<4)d@Qy=*zx|f} zY%ji3ZYRCbEQv>f4f%I|S{Mv$w1r#7O;iAYg(Tn@Gy+I@f7ckY7HX#Plqr|}Raj07P6}d~d6$fmD08l>TgHcL!*j+3Lu|LH|AJi#=_Q+Lt$btr zl1)?G>P+YD^W+oknnM(%+xnK<9plSbI6kcC28lgDJRfs{q8<0s7wdagV3z?K^Aqdq zh)$Z;jtpTyTrA8hj#vSYMm-XN+JPioPxu}4_!t49T>O;P6I(|h`gD5Uy= zdt^1Rx*=gIR8jITq?+d*^W36VsT@}}MWeuztemB5=hb)^YIxcC>(-yShk(<*uJ zNWbt)9Kj!wM*UD~YV7@HTf^LPZ15!m7v}*Dm7#9$$vpiKe*OqOdnX}sq|Nt?Ph+TcCP&xpx6-wi%E{d7;eRs1|1EjnT`_?L?e=jy za+mQX%?zu0;p6Rkz>C#!Zzsc+shrY5Frix)i!__bh_MKoA(~jY2uqBg%C{z-{QLus ztCIvGn4T;=D!HI75{@P)Ap+64XfH&e6kmdSmJaD z#^LL2K|1$WDcR5afoZ&JK#qoag;0#x6wQ8FDu&FDf~zj8#^+7HOo5#YiXu7?swJ4|NcL zx|byAadB670aT?ZiLS-xl1P;3df-;z+Dv71XMyK(3FwV*pv({cTWHre`%DQ2312{W zC<)Dt(uzoyA84ThAG%r6>X<9H77a2#?Ot%74g8?HP=*Ei(XNda{5&_dT%N+HcXZT! zdc=rZQ<@AIVVI7r!$-ozVqXw7Rs31e- zn1R47&|TaOK_P+-enh~kTtAAjyskXM1|!%`{8stSD5FdtPapDB`YAl+1!1J>*(jHu zX74Ed!t&{T{VDy-Qp}>6Xr&|)N=2q}21~RTHG27-Se@6&*=Fxuvbf8^P~YZ5zC1bG z)6U_1NQ;%rw}8jpix%u2^alJ;1z#7!Yd@}8i!nS1g_>|)EFg#&a4J+7B3vzwcx^sl zvp}2`o}gdE&V8bqCvNd5i3L^YiX8TFP9tNDJS`7PKoR1)LM zrThqf38fb8w$h60FgkRwd);F|T2xE@3x%ze745z~-?#_St0?Svu9BuTAl~oe4xL{A zseEKkNfl55C?61l-!LYA^$(5?GQ;Q|4DLpV)Zb{jhA3U&bKMOx6;g=v!q~#dWsO zEx@ZhA2Sx^OOyZ+o~wIz*`~^)!IhJf8XQ{Frwb-AuXw%n)wl4Y1p+yMf(Wcx8Rx;X zsmfYcS=vKlkq5DNZQ<)p|1@7fCuGq?vypR5bcD^^EHec=v;YKBez>SBc08S?dcvSf zX0*d9d5YQ;Ncd+@!=`3$b(R~Vurey@gY@j}Sdl3m)m#e8xrr>DmL%}K2Ft7KH{-@8 zuY5K~mW?R4a%6E)-^bRdVGnHdEt^0AneLY7@d$PGc2+J|>taQUOR|$15)pM|v#P__ zd_B{1`tt&B)g6F2d%PMZ;SKzDTQvs&#vo*^q&obt3;tI>Gm40Fe4qfs5Tg}>&TbpA z&e??S7KhZwS2m(zn-Y4Z7~zS=;QIu`{H&h!bl%q9znpgY8(T9=23;Do&^|<(F&%X( zP4U@gOu8%pYh)H7?ziWgn=p2d`}Z>+l+|rUp$Eb|aH<|pyY7#vO<{;*!fL&I2(5#+ z=SnD{L)^y{{6j&bhmiQq0v>1xP{Mv30e(YoAF1|XV6hvRnojRvki%yAabTVn)YMqn z<@)A8kZl*sCEhB{YM=! z+YRBZ2*&b!-m9HNfFqD%-1!@sD~oDZX8$SYX9aYW=57Ghz=aSy6K}IBF*2H1YfvXY z8scwemqjDhmxUK~Vzf2|v=`Z5_gdI2HZF8}UH?4NyuRH90}p3;Nu~^qat$uTwW;|M z|NMl(AN?ED`7ox9G>t+>Zf7zu*F&Cd3C=%fP5c2SHjp80R<6B%G2iY zKr^0tDBPbu{=&T7CejFBDurHEz`XK9sZ-|vJigxcT+tl49%T3&aJsloxeG3p)7+NC z*pyU&0_E8?a33UCO6wO+AziQFJ(h{Ub-!fb?w!hY_W z74v@zVP`I*QpEAy$X7J%f6ZAdm!6ZzG#F*B{w;IuFnjxypGF=Bya^NbIzMuC44Zit z>}Tg>SBpdm<1cY2S67ogC~4$ZQ1s;S?S_vOwA#=#LHgPmz4q+vc$m#1A!Jp1Y`>#ejK@<$5_$LsMAAr2o3oa;JnumZwQgi1y^U z8I2Dougw^AwCMv*R98xSA1tR5beHBcG{{vG-qI1%biUq$%LP@#MGXCgi?yV1xm8W? z3PHkhh;0Szo%$UN`H>(ICB=6jNF`bhJNl3WFW1*b2XI{%%YhJ8H+!P#HTfCVusb0T z00`VHy8bFB)s-m=W!to_;Bs(B250DzVHGc?!xe2m(K5ipjXIGWYueD!9PCh-yf3k_ zfc2KQD&n%BQf5RtzEXa0<5H#;5{E%M{i8TB=#!s_@Wh29>B6cbe8$k`c9}&SvS=KFF;LTNhI1oa!n+S542Mq{wC}}#Xl-k>px1a0=HDcth>&x8 zq4v?$fV+DkbH20B&ap z-P&ZGq`SR|pjM1vP)|%7@s6a0{?u3Ra{Cc@b5O>C==#haH{>^DJ)%|__JYA2oH@T?@4vusmD=mm`_x3N? z(Y}Ql@lc(4(CtYEe*ATLUo+&6&eQ9#@6I}~ZPNo=_sIaup$HrhckLk zx=zL*XtiV$`RUm)^PpSOPoSmsOQH^l4Hj;Y*_efx>$gKE;wx{R5;uBU)2TY+Kt?{@w8C^9e2cpfryet0FrjC? z6Do)T6u67dsXfdv^I!St6gTRRi3v#&`Kj4e?u}odwa6`c+pnF} zKWZe$=4R?}7omS~(uzEHo0Z8NJj z3c-+5*YibWPv>{1GR!?xmvo?uY2`-_ZZ_)^AHD)R?&8B11#Pgx`&O&4kMXgdl6hv-6Em@&aQb=0n{+qBF zd0>xTbn4I5N_N4rptoN}8Fr{NDgtEwoCHU^=`A#_tq%rwL&ENJv$cZ9mcf7(M5VFt zbJ{w(v$wPC9}(0Y$rhFS8GPpo%X`1zM;E%?@}2}uEJft6N1b&*PtZcvhK5n69joq5 z30BEyg@SPV97)p{Q5Qf4#Exq6H2?YlKYQb`Y%T?xn!X2QP?piDOEOUw{f~6^y6al! zQ}WHfJpD;_q?_ztf4wBx(ev?fhFRGC27ocvmw#YGs1{<17CaVsTR#Wl85RG^h)4c}Wx-Y=xeW>S%tiEtvtv^j4ASH~(4dV%f zhMo*nLF$r2m+;G~PA-dTuFa$|RLTnk=I8FWf!BMKM!>}$Zkzz6<1-UR>&CCH+dT7h z>Iu#SbKHwQjRC#GnN`JLKk+ripT60Zq?_LZT3096Dz8e#F6)KR&7ZK6yDw^-8rOsq z5I~?bPzeAUsPR&$+M0fWnyuYv@{*R~30^O+_5-_-<*-?{S;)VZDKL4 zskq3RB9NY;92{GfaJ(*Rz&6@pY;evyRZS@u3V&zBD&U&*ssy=5(8wgoGZ-H7r8Y)Vra#_C5Xnu6&3n2zZyw0LD$MjihVzn zU9Gt091OJR{yd&5@#<+w4RJpkd}qOVLVR}an+QMvu?Sv^qz);d1{q10o7%7Bt1odf zY@TfSjAOm527*v-y3Iu=wc9`w#I;N_Tk#L5polalUxMKrurht|bOS^CCVyaT!Xf}W z`i`gBu`#s$@x{dWOitYYHXl0par;(p*duQ2x4f2c>TQ1jd3zVItvzggU?z0sjfGd? zZv-_eXjx*c2QRtV+A2Ms%pqDc}VT}!2J1!o9|ZI-&j%YN@e zTJ9m^t!sYrCwo?x^V(gUpI%ZlKU$ujuSR*!^mvcm+~$66W-iUp4b%;)^ z<#TwfHYFpS>3KShU&*zihcE@3U9bg$_&8;M4>-Elm;S1{z2xe;BBEqOX|#f93YZ~7 z$TvX&7XyirdH)wOIWpJ~=y-3k)_)x%%099W!fk9{TN+12_rdi2SI78L`egC)vVRnRtWZ3;+eM8pkOURMV zpv%=(=k?Y}U(i_$7<)uRl1gR_!L`LuwBpKw9W^GLwsv1T{{#0c1Wc|6Y>G-I$M@qd z-aWSW>yvoE47cLl7v$o6tO3<2N&;Oe=21)=(YVzS$lurX9}qPPYaBiZXl0TbGEwbn z%)+wMpq*dC8KYaAyIgG!cXm=_JX^L-TT@Z*#Wdd%)y4Ysi;d6l(ad9W?OImvQt9E1 zoOSC=*VQXo@5Kslt9^&(lV$5n&rN)L*WQ?fn!pS#r#{X@KvY|-kw2Odu3}XXs5)}X zKfBLDdcbi^y}HI^!)yEodJC3pB0bXLa>>3MVB7Qknhm9+8w`rDD)cqb{l_pd^Fa>f z-J8wNd#S7Z&5CPll#>-n*qY^d*@CtHaWhup5XLtLMZSv;sN$a&Brq%lup*O|#75&W zR14m35a&>!J#xY^{;(POfPyi-1)U&>z5vX~Qf^MNef<^3v`|no?omVVeW9r^G<_@( zl3?e?5y()5syuh_`9g*~eddFP>`GM8;DOKT z4YF9@;bh!58sigNo#(Syp4S#88sYS!!<9>MuJDw9J6^q*q+NcY_W42dla(i0fBCr) zUupCfw9{OpAsj6%WV3{1DTf(b{`tS-A7?nrpnETB^fhZJBrxY|5j{RCavvO?(N zPMe|$1(yXq%NrM~P{^Vs0Mfv+J8l-rx4=~wlpA$l%eFI}dgKa#txxTO*o{{~Gxb>w zV`?gOpL@V&jWC0wejc^ND4I|!A3tWm=8JX8Z6wkqH6DzREJs(8Jf)hYG^NN8v6D9e zSN4Zz*4i#n&7TJ4mPOFyz76sNcVOMcAmvurQj+_78z`@R`*i*~`+frK(-T4>crfBuR?VCoRkRV`?4rYgrADn5-i%BPf3HKCSD+@m&iff6^ z*6Xck0vu+Q6?w zqpgYlEdVC~5ln%4uLDp-Szg_!T<^cSLn3(l7KleuVd8qtRY-n#c>TDfTD3$IJTwlR z=DEng8_?xoVC&%BT77d7zGRxTmb_eBRpaDU6UL^Cz&3-fzlJE}@I~H&(?7LKpQH2) z=(!s(rn|GxLs&t6fD@sqqwd>}s)4P%ws-Bn8jt6T+jtwS<+c}RA(@sC^RHZ|@eKO&<})JBVIYhTH! zPcE(Qn{q0xK4GLc2{#Y+JFI+OH}6=966v%ZVSFDLuu@FB`57w8$mHWy z;4&Ctab@sW)?h~_pHfw;nG%%>Z8}QNl`dA{&!aWl1WOP$ArUZN&7|Zw|n{N~U z4!x|MIrfSJIL!8)U{&-%h5RfRO)+cGED*Hlc|h_b24z@mkV_6Jj_hKJgXgDyd40t# zsvwv2TG3R$V!}K*Qa+K=8?2Wvb=+~j-$*|iT~@=@qzH>B%^J;oix?#&cA7|t_5xUAf+Q;u(@q#e$|)vEZ+=ZH33Uk@pc1y->;KNd7Tr2G;%Od;jvd16|^f%*^|bR%#wh z=SE7LS0?i9)~Es=ajWL#z;r4E5e_3nAsCvi@d2u6XWbM;nhE{oxVayM*YH}dC@Rb< zBMaNlfe;LlNVVPx@Qu5&@5E9aFBF6|JDwbCuan*oRW6$rjBUHjIM_-+Zpcu9rhq(R zRF_6{M7E-YoqO~+s~s9ABR<;r8fz^9FHHl-ON>WsOaI82j43&dYX|$&agka2%G8%+ zxptrEBOz8tLT~{qw7_Fo-0O2LFeLv~#FrTB=UHs(Oi}B(vp+2({heF&DM~-B{=RfO zZ)Jc%J`}zDwD%9|H;~|AEr5BT_h@-M!KI#!FGO0z#zD22YI1l%Qw;Gqk@`^rA{cPR zjH{rKD~-#I9lV{qbJfa%dpci^c%_?7LzQ=$Cu62K%D3z^N<}(cxJEPm>ztrU;#lW? zJAK?gJjLmLQ=hI4xZux_J&M0dfhW2!5NP=AObgK~1W`cvAGU#)1dnk?4zbggf4lzO z%vg?)FYQ=))xo+vx716d_2=}%Xo23>zmX0|6*h3q=D5+LT#aF zp@?hqsZw06c(%Oa!Q1(qi)Fol__N;qW3(79IRp(B69nU6z%;+W4)PDN{!|n~Ux*Y{)(AFcT*twMn}-3R%=Z`TcknIM;ZKY&An^tFX;Kc@)d0`yoS&&+a!nyF zuz7|@)j}Y|>_a|`ZZ!97geZ+SI3FV<$saC8L>?`)OY*at$vJ=6)PHboq9RR;2c_}> zFsq@!jw?a}vZ`rbRfK}t9+l%SE)MPPq!cSi{=`SPGk0VxzMpJ1wIK4jg?MK!5k}^L za^^ABkTQs-D8e8fj4}k4%2ZX)^N_YSTDsLqDX3ZPY~8&kZZng>Urj@NhYeey9j|no zs7za%6kAwT{7|sdJW^bxj#pWZKyIg}Q`1iu&64_O(sHJ+OAGEa@O+$HhYo^xM>rm$ ztzg1ZIChYrnAtfdxR3JSr_9M^3PD%-sH+kY$7CQp=sMFE!lLgBnBAUvo+c7T8% zU0Q#4kNZM-8bLG4`(>!(O34FK!KT0=FWl2u-Fv`<`u^I-@xL ziMeJItMh*Ey{)`8p~ts?1qRT~Z;ygkck(%YzBICMVP)aaH2o<|25hyv*b(Csi>Ei1 z^#dRTH`rK%8x%5?D~zeNz0>LR6q`N4BkJ2e(|$F5r%=VV8ukzLUgLIJOiYY4It@U4es@~2SugMp0>H(%<)Twjc|k=u+15L(3XEp~&qo|% zS;l%lPMF4MZB)@-VKkXkA9Mbk*(I}!RfZn4B+|?#W)z0jQ6PL2eAk`T5XcC~ZCG+1 z;0;S?ryBrPDhUb&;}~StYO-+y_A@?6;xV_6^7Srjo)ay#2+>BZL;EH<8}*<3;Q)H@ z(jBk(5Z{w;NMV$1i%uycY=J4o7(;2 zw=IkCIsH5iwugN(z3Vd4@=*f~Mo*890AQ(5Xp>Z&+iSY3zVyz@PcO`5vkVniQB4=kB zzh+B+f15_hk&2c&-XQQ+8cRn-i7wcFk{6z43n)Cw+97v4B1E9lMi#)f{t=o}dk_E* zEASf1(LnA-0uZ@z%0Ip5CqKWwKm%PBSbJ9+u zWF=EMab$t@=bP+ZdS3+gthH01P!P5_v253Pw2W+u*97h%$S(zTD=#`=s_!T!QFDSQ2p2VTi)0 z7M-+`)nXN~Z0A5X=t_f;r0;t5Wevcl5|j_%^eVxqBv5a@6D)G;-|VWw*LkotHB?!; z1&IRvv{b*^RmFc1i9(1%e{$gAv?;bZ@W&72n8wqxGX({Vgk#jTFVgE61?oByLyaeX zXlCXLs-mJ{&d5=wKqtTURzv;KN#J_5kK@FZ<6%}pHA23B<+s!4)uT@K02NuH{Loba}(CCXe zD;@@P=t?pD1Q?N{KY0v{wB4mL2La#-=VAJz^x8Gu7C@X15Hj?YK)@uNMADHRcjqEV zfK+VB$54E`Mj+YEii{A2p)_7@mSw_L*ewwFyHe2c7>h`>-&+WC!|DW}D62t2ugnji z=EUcN;>#5%*rO`yn;;4+PVuPRfmId`nUad3@ZC59D_3+XC@~O8!V-W@Pb6t3j=rt# zX1FtZASSGAxl%~&T-xiZ=vvh)>U)hi^w~#K=ILk5rbg)(*ru<$6A@|d_cEciZ5bX- zTb$fIKW|I#&B{aKLlv<(jgDL?K5g$=sX>LYzEU3VbJbs?vu2$0O0zCfz=+9>wcc(lhe_88gL>blx%gK{efv)}uQKd>XQJ#1B+zy(;JfOuHVA zP+_Z&aJw&azzMZ12LRyx@yV5-O)^S7^*ZC~$VcOUQMHG5hH`X4kYdKp#DL20_u<2Y z+#nGs>X?fpt!2>0SO`HH4`c!aT1;CtCZ$3@stcR`9=ZL6gfdK1DL)P`R`Ng?l31pb8!sUw0@zqst>JHu{NS8HTo$x8{ zCE{?W{#a7yfY{1VAyFFpML*rk8iQ>pODE0~DvAe2uEc3G9w-jRv*zUH#*P|9+zv09 zfTSLiR&ET=?adJb1c2S*oyyHg5kTA++veJL`4blq-LE0SdRs?A654Mx=+EEzjp5;| z#*2ME9<-EhFXVt}7!oLyFW0S$$yBbKAijoV*;~zisM_c`793E~n82PKFdiMe{F?+m zvJYEQJ-7k6X>I^kn zGpO;cwZECUDh%x2%G7)|pS;a0rQreNUj4I+g1f-88ndgtWhtb`h91FaHGl-3PIPiZ zFU+QuIO1MT;8?$Sw7>m=eJ^ov?kA0ztIdsaBQVmsX2m<_wcp=;peYvm(FyelIkGpz zuSWljyWNMzG~*d{>xaf#pynFOva>PfWV;ZwV_>K`j9)@oQIgdMPflM1e?`w{%XYdg z;(BGbsz=)|FOKxtf^nEQW@lVwt;n>~HP_aoQJE5XGFv{tJ5%lvqp;Jxkn0&09y`6* z>e{Z`bpGR$v-ne=sh@@77ZcRdiGJIn0-ZK{Qu%fcT?@gC_+<%nHy-HyxLe74d&*PZ z{%U5x`#{Q<9Ps02=>(E1N4$jWr?(XJ!#&4Hp!aDFCAcRKMyE-$*{e!QnUW z@tmlzl@_JZHal|d4WFU&x^75qYP%8U0j1Fzn6KFIdE~v=pv5sRVCd4eew31b$|Y)* z-;NY$8-uhVyUM<;2K+P>Db z?y(i|6X(CsV>{v}>i=!`e#9C1;Rrs&Vt?y=z>lENFb=z+a64$|-|i07gLGvcc!Yar zXZ{2K;r`7nQaRBT_(uW-elJ~l5D>^sCB~+v#u8IMO8!H>@ec;S&KmHBQy`vWR8=UO z1#<5M!k$vv9+aw5qE{qMu-Y{bLgi^_FLLz@E|V@ISqI%lfYimcnsC!>IpTwkRC4>S zsYwkPwNAW0g1T8_LoDDS_5^&kg7X~kLxXI5JS_LU33{2!1Ho9p z=ekB;B$Xt>8)zj-60&f`OiF@4&K8G6fmedCtJmuuZ{M@p3*Z%z<3B zhk0nB?`DT*dr^chqZuBFoSeV%B8&_e#)ZOd2ti~h6lr_iW--d|z@X^9-_@ObGI)Ok z@LRpQiO_DMBZAM4%1`Nwd3QBR@9*&2A)y%F9g$$K$F8;|Opgi1?(7c{pQT6MltFj+w+@2%QH{8C+V*q>w-SmYy=mObwEFx7WC@V0Ob*SX}BsHjL zDHa52xnRi;u-!QRqkNC=@|f8T|Gzii9GaFbZj*OJ+27 z99>-|rE%o!=khs?NxTzYudT1)7;!0bTW4bwgv)*}8!G<<_Wjm)EdZd`P}Z7(4RdXp zD9Sc%MWH0S(t)?_bYLcxiH=$HHSR%Q`E={aRuOyYizw<_>1%dHs{;8ml9(jWDeMd4mp`sB3L74E5MYz3OUrdld{_HQKx%uhypNyWxjx`woCMu59gl?{v**q>*OS z`=|pFAV5?hV=%VqwlOX^1(Tj^oVput%VvA8ua_;a_ub8(?Cbq)|M$=9y>H*w>$c$k zo*4}YL@-V^*npV1^_+Xpx#fK49DrPX5gc5!v*5<8Df}G_yD>Y8KiJFNj@>KR_O@gW9>0~(#;5%{&X9jY3>vV#rz!+H zUOHj%rCC;!ClH)NSje>_HcXA7qyv~5xN*lS`St#OC~Y2n5x)8MPq|ZP}J^wB4w1fIsl`d_4=D7y4i2oo0816~0AAr2w#0wOHK5(d;ZOAvd` zF*^uATT=+m(+@~;{$u`H)-=H(PO#r-IhWq?Ej<9syF$J8@>fic)|yG#ElGYY5L*)c zBDEelezte0oXNWVhBq1Kz!}Egh+>Na;2S&_F-##AP zr#Icz`Fi5H!f2JM?Bw3Q-p+R&yJ>je&{`OcZ++YH``SRi-c%bczpqs+$xOrclRt|j z*(FOZ@L(=Wf()j~?j_`Q?{x{gr0}HW6n5vc%Vo*R09bcUAGV}6=dudsd0%@m=bHw- zN$RUmL-kCGQrY%8s~Y=zojsWP2l%7ieB-{PUwGxY>b_2DPjek)zl|Hc{HD{kw^uv5 z+6wv{dJOqcycuCI!ngr?aSZytWIKJzW{KJr?C=25x6ARvJNLMIz^F;8=yObimORpw z+e)_enCy7CurRA$gb~7Xtx7REdj3hPR)0sW%}T+lH94z9D;aXqoXm^KP&9K>q+IF> zL*8Lp@5iBDh-krJjO=>HJB+oh3V7bw7MqrC`S`917<0RVa2Hg7(bTnz=oxhPb5hLr zoD`edRrFi-G@Ss&@H?!Q=g`rn8ej+%p7Z+<>yXV&Fm!;yEyDR3Y*B98gBC`xQt8TO zS?@m7t6ztnKXo8=qkCHnw8n2}wYc0Y&=zClw0N9gi{eg;f#$7-;SQ<`9Z&EZ_O$FE zwnX=Ei2#@IyDTo{P_~)gP0MX+0kc|d3Lb)3QwKEZEeF#IQ+f=b@29l#f?mu!deL5a z?&!t24!!6_-U8^w3e#E@K}#;NvMfY(Ju0|lmJGzE8hwfpiv^Va@hPw;f!c7tRa+Vz zwd?b649hqjx2iPSS+oGJ?P@hmLr6<&=}5?`p5I%2?YSHC@`GBox1AXElgsE`-zln` z-c|QyW1z1fL2Xi@cfbIuOwiT$+g}ua_P0&kyIid<-#g*_E`SkXxlt%I%J6%iomnKc z_{7HTZ#r$7r{8q@#uJMvpvMeC_!YE;A&_1n%#QDeDAfQH1YVCj1Ktf$9jyz2QfBLO z=~57)F!%TO-PiXaD|B5xZ$W|Z{iE|rz?COK4LE=hDKTzTg-ARuJ0dE}(7^z%0BL@_ zVHxP74acv#1}l8Bi0nh4j9%3Al;H2Gx1T5sIBSMIF*t!szx#<$HWrX``K{`M?>&<` zF*!arR^!UaSk?6Br!Ec-o@<)*TOL2LAw_!3KThBNeOK=oT)eQ@7;1*%fnq(~Gha`o zMwfaUFMa6#A)r~Ug-u;S|NC@*9|8Xt&OIi_@`PJQJfXigkc3?rG`&m4t_z5I%)9Aep)Q+a1E<=e)OOhG{`$8WxXlA1>kDn#BmOewI5@+~i(JTW^nF-A#m`m!0H zqIcyez4^AtCa|7(ZUz{(2ita(kh8$UKX-J(lk@12knT=*n&k$H!)l|HPcx-^=OR*&SP71JN~*Sl)XiwF@b_LxSwnL=6g(x(u{ z+bHHPB+>U0*>qtn0@Q*9VlfCDPbrYCe2RGMV%9rpfzrNnT5ax4x7v1;nj?#BuJ6U;6?n zJo~3u@SE|!jb{7;HUNm1&$}WOGlai;>jx1=0UAs3Sq4r4jy9VZvj{haFh35!B9qYJRCF(#pO4XAhN3U@}S1M!~ni0FkHA)MktmkWqQv%e3VqX@<%VmzkbgHn|F>MwIisIV>SiAo{5rx=Wt_tN690I|FP!u zLu=>nPIvs!jSlwOcI_>=Uv6M$lQ!}ky~&L2^aj6cyEoVD-aJ0Pr#BBx@97OjDLQJu z#WYY6tv={7s6|6Tw=c}d!NO>Xyr0uj zu>uZpenC_8xrc5(b9Q5*XE?1yRned9UwmL0AqI_6&ZH@4RMdq=!7Cm;vqmiR$?=6} zDLRK6mF`NewRF|D!?4x^J1nVNkXFhVJA$t;WF@h=62$J2(UqB*6?eSX9R5IV>cT+n z+>zW*zCE3sIKSA)6&m+0&%|rTimzOm zf3$QmK3tB>6l-Ud_{mbdKW8)tibqUD&}sB-62^aK*^8x{34{@7?NtPUl1{Wjjxgki zrfFX2N1C3q&~Fmn8pR)nZ~Wu^f7MURIZr(j{uQN*jPkH@X7PU1P!uJv=h=N5 z4OH1#lj*z#j@fn=SYiYh&+!a46A6>ydEUjd&TaIQ%U8}!nXz0n=!q5zQ8gGVB+^Gt zUs>*K6T-MPUA9~2BfHwven=a%oVF9)(6$)<=cWxu{H!3nVj zz9r?H5Wmr8Wlws3^S}(}VLhBPlW~Za8!*$kv_zqVgSCEpsM-B<1fC(Z5#g2bC)8ld z=PPQ#M58o6YMxoR#i77If8lbdobt(u&~RzyV&D9k*FW865im-7d9u|@urtNrGRE?B zf(VPwIjw_B4=aE^A;&Zc6+%(S5TR?8e=Hdt?q%Z7aiw3Qgo-B>uS`8s|A&mji( z<{jsZJBN&QI`|jx;MY%|Ms_ap#>3_!qdU1+`LMZ|UvK4_zxDum!?mZbn=43j&6Cl0 zPESLw>a_-LGLuL{{F9oDv(~XW3~M1z>F2BC;l5_h<1bHDk}tdZDD?(6b^qO0rcb}^ z<@eQMk6`YtZ^GzdC`X~?#9QU?h?e6I_zay0g$85Ev)aRtUVT}zGFA3_a?L(w^5JXf zO>f=$)+4dneJ_98>FFzX-wzo0d#>G$*O`HqoPl!j3X5AojoiR@`by9=4JM*iGfevZ zd*Ac#|ITpVeqWXObQN+0X&ItZ2F(nzX$7^mIBvA7jG$%?*68=o(=zU0?yY`%sERO( z(-QJb1EhCT&gWuY55vPA|8VC^|0f#JiMy*tWwQZ;(CR+yTx`5G&l}rI;5^Zt6)#99%Oq0zuPlz(q4@ZA&l<2#-m@Nd}2@tjtelh)Vmio+fM8?Q~RZ5X5d?Yz*Z1J z_g$MuzefJW(nE`L9}d&5>0CR5S+HORu0&bfQc@hYv=oQ8)fAOI87@Xt@p&1Kt@lj)wXHkx zr~C0p|Fh3qYV@Hy(ZAv!LmZt;9EQ164+=q{@2B<48-C2c-+0SgbcBGVcVc%d9Sd`= zUZDSim;D=;^`E{|f6H5p_ag$O;qSLn$w+)k7C20t66@{dwwM0HtvZNR$1iT@rb-pj z+&QZr&iaW}tGcb9X{+^zow^~^-$Pam;3V8^t8T)9FYDQPi6wJEyU9VZ+HNpB8Ore&eAIaidb7SWB&-29%*c;*e_8-s7&`jyc41h2tY|4;Y-H~s4WY5E1!oWz&#?=cEGhpNr)xkgXi zi+I=}vY2ofBZAkQC8ma&XHHE|4GokET?Jn4!gQ9jEdf-<`Bd4q{-@Ju!1)|#Mbm3A z&goKu*}f3LUP+cBJ|is2E?mkR9-luN=^4u;x>G?(QQ|&#D4vgMoEX;ih{(AFoXrO{ z%^%ZC6GecR#(hf2BXyH#l5PnlUo@@@fpj$$%*Q-Yf6(Vr{hG=XUN96rY$S7@Mo|ol zdL*KYL6^~&GV*b6#2@mAo?yT&YGFO3hSaR><>1fon}~$`DBKJX+!BH+YGPy`W-(NP z>^TtlTB2SGhsz_WWW5}szyB;$8cwC^rBJ9uPg;gcAvjOGb_##py0^Xw-QSeP0|H{% zZE2fEn6L!H7L6k;gf~PC$DBrl*bYc-H;qH-W#pe>Z!pwJ-*blctOwh$5Z)a*zI%6lz07=+(_CSy1mgeoteB) zp6QE)yT-Hmo@~S$@@tZ;d!*69+=#`+?6r&Jm=p8I-e7SA5e{v#u+?Q?PnP;ZcnIHiar5rH$M6mg zA-wfv%dZ|mjO862pey#JlIA69muceK-;R({FGCo#DzwlgTLE5!Zd~4r+X{|dv5L$Lxe+`@QK78vaL%zL*Z0~=}7}G#aw1^8$R|tE= zDa;Ds&?#xTj}bhqM_@OddseChJsvA6nKr4q2v{g-UWtLD3%6|JbQH(qfo-+`e458?LUY{Hoo=saKg(y z@Bn$~m2y*y-!{`&4EvR6ARP0LMIX%`Whn46j}Qj#lY1%mkD!k}bp(u{T5Rt@E?Jaa z;wF-1X$eUZxCdnzJ3hU-CqBKy=`JS|O+-^8ky+c$-jStQ+O9%EvWr5Fc5>}W3+@Lg zD~7?$A6Q_N0q3W5KO!)Q*m487|xZO2MCs zY}t%>-D9)oDF+fkPr&bYCo2ih2R`_rLSNLC%fUJ3t1Ne7l(Ky>#Wcl81?YPGq1Tu( zJ*s+LZh?5qCr1|}K;HmDj4t;{#@IG+K(fKlnk($i}w*1ql1V1CQNr*8OLHFkg*Irs)cI zo21{LG%WH|I|-=BK}RC}Jf+zh+Qf8!)4(3z`8A?=9Fa7EJU+$eQ8tm+t1cl`r830l zYZ)%cAgh%H-LElmHOEIG?ifT>Go0CB956c^ zPCgf3hxVN@++cotOfa|EvnQJIw`PxI4^<-)fobUXsg_PtC=YBF$il7x zRI^e*YM5aAmDHKli42dth|#>v+U_C_%Gj(rd5{NbtVi3Ow=;(Yo>*F1T3=dUTLsI* z=44}H*oseA>48}vf?2Qc#=cn$hGWZ4y`??3$_v)W+r{!F(m+0^KEtx@^gjOt_4ADb}gi_WljSBo^$cP?56ryL)tA znVx>Xj#1Dgy4<{_3(JZJV?r8kEUH-GMPb#0c@87OqgA9Rmin?TB3%o}a<=Qll7wZI zbB;gR0NU32U=kK`l)QRI)3cWGxw&m|?u6YgPy*%$=&?Ed-C(S}7reBIPd~t7Uk}#s zm%joY2kF&CobAdeNADfkm>-bOu3+ZO1^3Y6=14G?F%2!&rJWo(c}e}!S24z4!`-8| z&g9{~^4l{@T`LdGj*6;i7^BDTJ6Yh=puhHKYZtFx9hD7PR0Y`H=dYb5Q_SnoIGRE8 z=v;FZV~#)RC5SsQ)u*uxItp$&8&Qa=V8^-!r&C~p2fjTK=JATP{6ekx*FMrjh?X`! zHriV)uum#P&gcYcoZk?A~p+$ol`~@dGemIfRhK8^n2oCZ*UMtU! zq+_9gp}6#1X6pQKDAQOQsP|u(DJA^=peoXdovfPqlcU-A(0uim4La(kj%@wO;Ml-8 z^SY~StUM5l!~*G}8D+QrDLy#T$W@odvh0UGNMe=Ad?pr5XBBTezS*k zna7^Z#e2-Cvh^?GQT$)!>G-$AQ5Zi7gy2#Rjf0gUl0`w3g-s6@yqM<%epSO9i>(s` zRdF$ZTySGavawB$>A?6HEG+x`U}0Iv1C0!gPDlFR>x1)yHo**&jeaw2@h>|-?J#JJ z8hP+%#Zb9r>i?0CeB>QJ)j@W>9R&+~y zA?=?Xp8=U#pk9=(G755`v*_mLdMzH)StR5T!4Q{TR)`{#O$iebGXmU83vh;oz$KY$ ziOw9&HcI4e>u8KyAGzkr()`JpqvKYY1xdMuCRA3Fa5N0_MX=E;2G5INu)A6 zm;M$ttZ9|s+1*2`)~5Jt;VxYdMT7nK|M_P{UekPCJw3j@*_dm2$|zRHi>_3m+vu*1 z^@N9_3={Od^<|2jZk!z|&DP@G(O{s|Gjc@WPb;eC(LDHxi9}ble<8(*Jd@6{YYV(L zVt67xxjSDT@Ob5%lGx~-C>@FSE!PuTvK+3MUFLXAs|FE4gV*lETjXa@4s`>6{+&L{6$ZLYOGqXSh!>oZjZkSun zY+@(@G@i$&a*dv_WuNMaYWW#6kvKotKd{!wq#J94k4=n^PmrH^Cw2!@mPxASXSXIv z+Kgwb!rN%LBkCV`^p@Ek{ykfFZ9c5xUlT2CK@$Z?7Jm~ZQ4LKsC%vl3vkVGo9HL!G z#=}7t(=K@gg2odeg2$cc?xp&JjAsO<@{MvQ%f|c$3-079M^YiCtXEIu`m@O9b zUN>0T3ih?^9;+-cb?CHzp+q!y`^XIztPFPcJbCJtqp~NYr;pT9gO?tkzwkp3O^x02 z-4}oA-Nv~ezv-TjK7M@Zt-o^bh4y=c!7_7|Q++Q75*$2{-{fVQg zsliN<`2M*#>+u`4({~L`KXj(|=p!FkKl_f`hBuQF!_9|2aPw^+e$B~&n_jm(^U9lt z9~zj9^i1aJcb)35*6>Jm{?^)EeT%nJ@429%vJ|T`XUQEMoq`yV2ovViRJ~fs8@eok z?nVrY31$eKfLiuKVATfUt_5txyRPI51x<^TauD*{7M&29$06NNeRqT&Az;zdq2RV# z;h}oFeBlLrk?u&%sYq(_*z9ommagNWQo8LoGfFZQ@~%_D~8`H65(WgyxA z+Ud%|aO&QdrsCmBvyd4n2Tz>ApUy4xRO`2Oue>IE>p*?BoS#pO)XHwJYMPv)d!HE@ zbI9m<>%oG+I5?(|uxq8ifs|hc`xAD6Pqsecvp4?^DBA5S=s1K^eOQ zNpMM8&}7yq}^-z&`v(i%DIMknvuUwM!H?60Lj@Rbsn10 z{KY)|qa7vXP*B)4TpL7i$lMWm91M4u$%(t)zOwwbyT-@weB1KMJMNz79lG?2+1aZX z2L{%!&K`T^`p}Q7XXg5sN0RBWQ~l{t(`9fGO>zNr+no=f~C(NCqeZvt-8`Ps9-_)# z81;0;^6|W%?rk|1MR8OFgHm8Font$(XF*L)2}~r(t!bH&8>S+{>%h^&+OfR24s|E{3UO%zyB66HqE5o{F6i9eQpN{xcG{m zEi#Sg-n@#RZBR%cLhPvg$Da<0K@f`6+V8FDj zzjW)PZ34$NGg>xlnz<{=jUJnoV4Rr-P zk|1RK-K@Jinl9ve$vga6zh+cY4S!wMLvcM}mamMu6~)sVh@>Ntyk#vtNc(fr8W%~h zmIf1P$6VTJy=q%aN5eYZmu_22`#T)5ZW~SIe?3;q2ZQ-qEY_b31akecRH>NGluC>O z_a%v1)&Rr8cz;%pO!U^q$7{V4R$E96=UQz6l;&>erp7e0`C^v!c9_bwBjE=9>8^0N zEA4lFCkAu5fq`6Zki4(`G5pRATJI3K_TLCG|H2Sj&naB7S3b%L<`~>Cd<5Z%sP!lB z{CR%c^q3JDZXGESLdrT4kV_R@YaXm3EU9>v--b1VoD>%joG8l}46EHX1kiDzWEUiE zLP?T>HlI&XP0A~l=b3fH@gi>*CQFLEiI7ZW)Y&{R#a!G|B$8#PL^wQ6(@XeM%cqtW z7v_&2J7VqT1_x~1c_AM&yk1XN4kWoLv}{#u_q=TbM@89GHLb1NRFur^@-=e(}vpyI*{K0>5eNWv~t_Ui%&L09kJ7j)mq) z2D7MK%9=XQbF795$24}-0_cM6Kw%u`sD&HW3BlHuH=hp<6c}q=hNrt0GYd0!03&@j{D;H{~9B22>(y10X~dLEEu@;iR^~ut62A6xSGG~$hN!UGsAc!6#ctn z^{r2psM})8+K8g>K16(I82z>Fl|x0C5qh!6_hBS54RE>9_LONo-J9%u%h`N45-@`W zuy&;*nHM)%>>yoL&=|IDyAy-bE<5MsX-~`Jy@_wAY#6k1#vjyTrWPznbbsya87=(+ zHb(Y37)Gu0pgky2;WMH~77~$gn)jumPt``ck3>0v#nxXuk+cLvBTAjAo-VBv&diOe zseCp-`{HtOysk_SECj?B=Ztr`9!cCNVVMGq^ky^XKRa zGr#SjBP7S5~&XIehZ>rq_HIASaS z4Q$IC0Z_=rquC6rcD1V~f56)8cY-sh5P)qz{rL;Clg+u4&E_myy=XoWex!S*8ZORm zj1JvAQ>2#KLqm%Oqc^&r2t5{@to_&KeOGS1<-U9I$JDejmzqwVzI@-vu}98S^V65= zgX=TJ?lM_^xICAd)sjA#_aWMs4W@x+(bt|5G3Fhl^cccmsm58bW0oor9&rrMty$52 zK+(7-T_RywX%R`10-v{!L7j_&@%ADBxqL%qG)MPlha3Wrgf*v}=gJI|K86t-{Ev@O zk3Cd9rIV46?sG|K7SAdUw2K#vompZB;!7~wvt!T!=<>X=>vDBq2%oAf4kxD;yXWf3 z^vFWjz^LwtxfwxHTvQ&o1C^QH=J;K?K~)ksPe}hSIQf4Wm6m-o)O=Ora!1Y&_MMr? z^q9eLM$}X(+Dnl!D`T13?A&{k34OS>wUX(1b|{bSQP1jpuLbD92jt5V(;}tACGzn(RHI@kVw*pb)9(QZw@9| zk<+mxAdE7!o^R563YcrU3K(G#u=g!=RRLgPh+Vf(Vi(%bVc?m@G5t}AgP|%qsIo(( z4?x`FJt(vTGen_1ov<~8FTkurDhqqlo5^~AXI{krM7Z^-1 zMiN2iz#>o<&upW~*k;t8)%A|t2*7BE$qwup-ixiff&6K(sp&w&wG|+5T&DzB8BbmZ zPlqr;^9*+2be+XCn>U8Y>nsAs2ZR!am2YoXHsd$7OxmXyRQ={nYnN8*Z-MdljuenM zu+rOkoW9ek55H5J!Y>*3TUe&fp%XQ#}hjtFA z1Kfdc*TFJwYd+MK^7~U=A?J5IC3*uMPrxgtaQ6W(8R80ejb_p#IFB(mZm={8mnuweC80mtn~i|41D!(#urwm{g1VHMr-15ykDN%MYcO z&ROH>a=Y69Qfzs zx7<-I@9}QFuyR3guC$jcZoKe8_&0B;Kq7K(Sld7ix&1N8u5b2 z&(jK!;1Pv$dj@Yu9nDKOSiD3lfcT<^E8o_-@iV6u7r>|oJY`jS%Eeq3K-|_`@f|Q% z@C#7Q`%EF+duVmN|8$x@v<_!?$>TmWh<>B#3uD2aRoz%7ErAS!r-^t*Wq5THsUo9_ z7R`A|a}O5W*d+-rptdB7(rWu?k!7@~IHGL&@I~xlSX(jF<2sPKuNMvmfki$|x0&QU zfJq0c{C&9ahR#*M{?uOGe`$cYT~aHDj-k`&%}w9zP(IAI$tZ`qT|f(w(gG;Ji_%)h zlxs(MRy$I64)EPDPxs<{rKf1q$#oE&_??sWLft+&Y`>7XL{ zWByb@ap&Uckm3?0DXK*hteEr!k|B>jtRe=LDBYj1=st<=U^iR-5bwaM=Q#GNr6M6L z(}?bV!ZD53Ir|;Rr};@`P4kwU zE}T2Ny0SETY-XAoV@*(R$OF9%kamu`aWdJ_Ra(e?L?0tt`9BjSvdTa4# z7Z15o!2f*k3Y|q@9{y@e=EhJ8tux-%8vWP|QB)Q~DElB5@I=&pMnM}gH<Qjus=8IHe00d!sh3dwOTw@xf64dC`e4G1K8Ql1e z*9jbdprcNAz-`y*?yQr}RaKd%H6yp7x}Rso%?EF+P7kfsqpYD9QmHK)O6wQSuAW|5 zm}@p5j)DdLDHU>AGX=)SQ8;jdf8LNSA@D(K&=(>;ZnoB5U+G-3e&q(X63^be?@AVb z>ag1h4i)Ii>v2m8cu^l}psVBwdsL{KmkBTSr!|%(9BD-D2h#R~mJB%k-23#ly{Lv% zR#VRbmk7(XmcA~R<6{*erOjuEGu_YZyH|hVWy8!~-G9IS!V8BdPK}=z;t1x$CC&b7#+-rUBMZX40XaN>6@!-_AVWUCj%b zmAAmG{OQB*fxdntll3h(zBR&E4nLE#bSA&DZ6?12{Z7-@oFp!Od(LiR_qcs-KLcLK zU9t#wur8Umj$Z^;64tia=yp>!sw!Sm>iZ0q8RW+9+pkyH^~yQl48G*vyYIT= zwp(txc>e4eGheiag69Pe1srr%V*5E-w!Pui15P9s^U@7+f9q*Rjg#l++U8plrBZLzPLdUlut2hXsxV!-xZ4 zY~(Q}vd!~b&>uA2E11XIEVs9;gGk_Ayx`j0<_OQjRZeTJTE<=SzOwR=nce%0joNlT z5xH2=wYFdW4)M_RTsXJ9s2O>C2*@u~8nnF00f(W4nxQfR?>HDfe}f$VP{pnOBzt!%eI(z@5R4OG$hm3$Q*da0o04-?WQ11 z|G@W~-~R(S>*p`FeMStLLbs9tnX+PeM1eM~tHd?L!7yW2_xeuKeES4W)7n0Bw3Yw7 zHy#=;L4!ZkdWauuefU``E z&sZK=j*~ zRLvlR?Ivm?ms8b%gS~eUw(*RQYhmxtlXkPUnK}HK9ZR)x_9*$p!EpR%-`j4zcI$@i z(ZDk4zKQa*m&e%~cN-woHGsX^a?99-Qg`6Tq|SNMv913Bi=p=3<@R_MV0hNkGcXdZ zEEt-X)l%`T|BYodZeXIi5CHSU_m}!2BJESSk|))JyUMa#uhr8bH5CocH9xSE?^RcB z?k&syP%?-RgZ$V2n+wq1ub@rzAaZ@|p4)CYJMU%=#ogecfcKpo&kg3=p!W}Tu;19j z{tkfkV>|fjb9=_a)(XI_Z5;mIvGGY?8^Hiw?NDqF{T!%u=WzKmKwj@g<#UsidM`z< zr}N@fFFV1L>bg>yG~ch2~%t!~6K(QKih8Em^|TzTb~tNk_+{S5`FA+5b+hbof!SA58)Qni%gI zEZ1@ds|0{RdbUNN{WO*{XgUP)rKIWO@?Dtq#UenjSS7Xfjb}fxGj>d#V_d%I9?ErU zvx8+bP%@DXxHwU9D47bHgtQMR+c!J;cS_Z1I-({G@a))0p|%<1P{GEnIOJ`MT&8_N z3KmmapKmQmu2`dr zuc~f6WA?@sBka!=Cdcq)OJZF6A2vi=e*xV|$Hc7{SG!={bvQNB;kxU9PVH7EB-`eo z>ktmTzGvTFZ~e-S)&L4zUpaJm``VW-dp&-c2(fVzLmOzdc`AryZV6*V8X?S$!*!F) zuvTPPnME5amSsDJoen-}2n#VN-IDEK=HhvZewv${00W0e#+UKOG)?#H@{I|2xbcHxdf8VEny`!rcmJxmN;E%Yup3CEtXEio=_jq+d_j%}YF>WmvIVIMU z>b4azt7WW*8mC0Nsjq(>9)6(QrjZ{XnOEH&i81q=wLXem7)VkLdxR?OmWB;?=U+9l z)EDS0x%|OY=+*GT$@{9&r9Pwe0uhw5y#3`+0AsC>x1n z;rsno5ERq2f}lKZ=^r!y8T(!K{{x5Q{N?}vc-muNWMBYcf$N3K3bXA{(JH751SkFDIk}Vfe9oE0HHMx-~a#sc-muNWME)E_3sk{16$d@7yq8K zxdBB`!3O}khX_Lec-noELjYVs5Janc{>EO$wr$(CZQHhUiOo}N+qUgv?4O#Ad3d9) zL3NM5z%T%iiX<_hYmi*$!LO?kkdpAp4Wy8oNTQRFMVBLvE@nT;b#)@LNEWxZhLBYY zBCE_nKxV~+dItVLe49{Ef%6fmtw52R8TsZ1>Qxf#VhtEls_A4yGe_)SA3bY{3OO*W|B zaNiq6EGZ73y)W#?zMt>3@34L(GKxz=RFvE(E#Cj={u1N5SGxRlJr@0@x96I-$l?q^ zJ{d?|TGX)GaBiu!{;cnC9_Z7)-HyMle_OLYe$jILJ+=kKnTN3UCr!Ft%B)v5^&@SSLXqdMqY8Io`wZITXVs#yg_`_9B}eMM1_&vaZ=kb}h>q z=0QM*qaevEuUPX&$gdqxU2>pqn8_$f^2sSw)bpt5)M0-X6{G?(lW5W%?MYB7BOysE z$nx;J2ZiN2^Oy?-v^P>9&8Nqj&3!7zc?Qud@alN7 z3;}ZjUh{zC6G*3>kcxg2=?b2a9yzroiZ~wRFrARX^kJ^Lv1iWgSo-mf!N@7~kkg6p zzT|mn^b9idzkk$i?1wN1(-6Wd zNXMtMX|-w5Y7=TGYCdYD zYZ7abY%px*ZAWd`ZdPvrZ(wioZ}M=SaQy%P009610Pp~i00#g70000205AYP0BQgL z0KW-h00000c-mrMVBla#V_;@rWZ`6BV4MczL)eTANPps8#v3#=Eaw?Qw5n|H><$5=vvgDGA4mm*9qJoU*NLyy5IN_0mKe zV{*3&6Z2vvy0|s#IIpsQaDg@|jsL8of=a1oeWK*N{rW(L#vpncBjnJBcRL;1)>$T6 zfQ1r}c}`9x?tp1Y!!2Na%L^lj^$FgmoZ0t8^NP1QQPCHBdkze}6h@oPvG+S;{$_J% zLgVIhK9{cZzR9~SmnWB|)*`WOGAv!-6<8s8=~N&eQM5gURjTcRJkx>wdC$E)2Mno-15Wpu6`R$hK$QTzh-HU}PWnrN8(4|Do# z0ypZBfB*mhc-m~i1FR5G006*y*~VwK``NZ_+qReO8nSKM<}&9kyXMu*?!*KB9u?<* zz7gVyC%$IdYM_Z$o@uUyI%;XDk=p92r@qEoYond^I_RjAnhGhXsC@D(tcYTAiBnP@ z1>}`mImMMwN@-=3RbB-ZRkFxH(@ZqNDPyD+D~pBtnQWY)J{hTo{-zjjm{Fb^V5$j* z8*PKj4m#k4ZUz}^lAC(DRkpYzYaR zbKXw7B$Co>v&?ZOB$Q5-kSHV$NkY<)EF_oMDl^S+R!&LH_uf+TthLT`OKh~-7oUAF z*LOes3@Ie>E2Q*0qzbA1328#wkWMOJE%(g{S!K5%qz@TF#*isw4iOP&-0y<_qu0Q*K22A-J|WY_J?~j#OaW^J<6P<0>UjD4&1Svt zi@PAzq;5#@U9)wAYYw;&m_y7p1dU;W6(ps@XG#HRsgjzeFLEg^k_ymN<6P*{#)}9A zswSZ)FH*%XUThWRh9g6f<;YT$I7$uN)ejkvrpW*Rc-j?6H3Gsw5RBvQ?%vX4mnsd; zg$AeQ5xBi&59bHG3P^UxCHOQkq3N^y)>2w(5(PSeqQE8=;1r`#3Cs-%gjOFzF#uV4 zIFIf-7?{)uXmOGl1Cu~ky`JX^SA$hmn_E%&!ezB$6Dga(6^KA1lBBl{4CO5*0*gpm bZ7+^eD~)93Ui5DT+==iM`U7-hD{TM(Ein%9 diff --git a/fonts/libre-baskerville-v7-latin-regular.woff2 b/fonts/libre-baskerville-v7-latin-regular.woff2 deleted file mode 100644 index 4606355981141b9db2b6189723aa081ba33d97b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27108 zcmV)3K+C^(Pew8T0RR910BPg^5C8xG0W_Qd0BMB)0RR9100000000000000000000 z0000R>S7#&LIz*}gjxtL36f$F2nvJ741&!apF&Xmqx_8ee5AI`ZjW{ z|6ej$DL=dXRU+t20!DgbAOwRH!ok`|I_;i-W8kO`Je5(2xjO%a&-NApZWBKuA;%XF zXq)!|JRu+z^8PEdLu8aO?CI97I*nSCqOKAa5zbYn1N=7oLIndwG9Eli5Ge_Rlt{(I zN{pTro2&k-^0vPy7g3k4A}?mnNlEGK+@=TNBHA1Zhrh3#d;gmy4WvLv zx#1STKvoPaUp<=ll4n_6d?k(aZ z5nm^pPx+eJcDIEr$sq$yA^+H1{||_w1|cUTG(jN+0@gZjc%_tG`+u?6-S&SsN$+KC zKRSvMxiwo802BBm`JKP-&78|}$(cN>Me=y?59L<9Uz$`Ufud5AVdVn1IttH7FBKCDW4 zrB!=Hk7}F*OK|yOk^B3ySzZ6j0#s-mjCy0#YtdM=R$6x!s9U|p`qRXoGGG3z%>2Ky zOctOj3Zzoejw&QUA+`ZAbY*3dBne0YBxJk&7~@gVt+sBg^{4gbaM_;IuGijXZ+*J1 z_18TdPjlQ@|NpP1!$VXcuwghO*0S5S{`>AZw`~JT!#ImD(IE*m!Iaj=nEfB9*w8LB zGg9RJHFx{^M1`@v-EHL|gIJLuA%q|yh0|I~}f)%p<9x(`@Z~(9tTK9g2 zmD2!-TY^KuQ;Rbj!{0a%03PpyBYeb|>~zVb3U>Aw2@X z*y)^aY49)E#_O?R8?$MfzrccfJiQ&N6LmVBA!pQ?a~7VBXXn{}PL7u|Cd2wT9zTB` z7(Nj>rAQP53oDx#u^i$!)s@L3L$L~#>NFUmN1s76%%S(0D_5R;g^Cm_u}qnA71j$1 z+3J9UPN;TPjk_LrkC9wVNwcbQqJn*BRttq%%-A6%)<7ntM*7R4u3A$>n26Orr{9$Y z0wa~RVCGi#i+k&ppFm$Psd?O;Ll__1I<6xU4&={oN(T%A9^XpzUuLKgY3){;Q_5de5GYIp z2n#+JBJRM*!LdV$qlucpV?ww9@uz_>X?HrAO&5T8K!#NhU4b9lRE;W4eko^9yT9Ao zwM0h&L++1#{IEJ=D4M!%&48RgWme4#mO7{WyeFqp> z391&Lo>(m#fvi6ea3rMB%F1~G&)Nbi#hnOv&#gD`en0}~((tktpEFS{1No_f=KT^E zjD-l=r_k?+JMY#W@Ys>-{!4R{ODOkmkh8{WP9(oxQcx>gQq(BXmnpE7bC4Q8##s*l zGRQ!h%H_87JRR)=6msCeaXu~|s4GRSRhUF_BF-I8p#;)X3cdgnhnX->J9Z2y8Ysd@ zLakM2fB9PqVnj+vSv3Wl|EO#tFvD!{@!I1h78pqg7(xhu0qd)=;~F3Y5$QLh_#4u9 zI!JR1z*0=EGFM#TLYGwFj8}ajN-681d}!cU>3Hffu9t8qcrf-**H|XN!y%-I%FAVK zG@UgGv!j;#zYG|q{Yu7zAzmd$r%Vb=QyQ2ENQ6#8#Fa^kM}Lr|hl79p-FNvYOsK?3f9XbR;mv-e%L+l8q?S%0e=^ z>QNIU$IJoNWypJ6=E}t!8gr)wok~LBaEln1HNgt(XKd6-C(zzGDc8CG}EjC(DxRmxJn^-IbMT z(KO+ok#G~Evx-Z$y7`wsnF7DTf9*VDm;Mk41FlH#Sv?YX@8SDBH^#2fr^e8SeG zrb0`pdAxd174u}YO$*lw$$LD|fR}R}3Utuaoph2+Ib~eO;m#qOaRkj#yA=lbo66ie z@O1`d%}%3Ohbb(G@igMT8CoPS>}A)?Hht>{;V-!0dtZ$_70!vG3s=Tgtug=y*Pq@B`LHTB~rPEq1H354k zGkJL(tpW#nt44*7P%4~N*6i5A*VzJ+0C;ky}+vMq@05q#M@L#(lNE`f9BfMmhQoFKo?M zj_MX+Z_gf<&9A&oA9y4B+pNR?ybJh%6r;s=@#*|-%BMQzpQqHuJo(oGOySwb?FZPu z%lV9;a1WhtD1GWJbLz%x0*{vDZMKO zv84zUgRXTn1yF=PmbZ`B#6Pccouq>aNeWjv1H{Ub@+Z=(kzsnR(vQVk&Jk~{`%{Z- z-)!=s+~Oa8B3jHvA1{3r;G<(fD(o_oM$Fk5LApj+N4LBFjESOmL@!i@!@I0+ATDS& z5fIKJThFbmxQ-y?X${StaJQ@i;634cZRz%?XhnxyPpASkFR=}%vgQYV!{Lo<4wsQ? zlJwoM7J!l$cJiq+DlSaBF2|ysl;sYhQ9OcsWm7y1jsp_y8rHKpxu+Y>FCE+7~U7g3&UH=f+f zTFe?1laPFW229;3jP)Gm?ZXdWg@BvZq&dH<+hXUHiP5zdcPUfx42fx~>77vxM_c-f ztujp$0%CD}Wh>&T3Yz>VPw}$mdX@g<#+J_QKFQOah)b@A-DTxKxa7V=sB)voY3@^4~6+kAir=?u14gO4x9n z=B_hlze?dQqOzyP`DrG)EL&!G52xf9&5=G0ZOablCgIw)n(V-rr3${GPPwh?r@4b# zg21p%UGSruDAh*+i_55N{XRc8!Xj>&K1@Ro1Bsd4nScPKbUhLKwJ&O+S|#ITFN~Af zIj&E*WsV*m4E0b@4%m%@Zd*A6hxyGr=fzL$rzhDvPmjMk{k1JDhMG1TNKPLHSG zwAJRKiTP=^asT196|mmSOHy||IouGV6FL|l?WoDFboCfcZONKlVE@<~n z4{a`%p>bwed`@R5x)L`i;3+FUKBgV?4g zbne#-sWPyXi)6XY>(JC8lp=AKvJOjT1Al$l?Faz5t>e@I_G;W@i=%p&29ML*u6dr7 zM&~~AWI4~Main$mfEZHwTX8zo!9Q#g{=7Olr0{C()LqZ14tjC@)gZV&ZuCzU&JT81 z|A5A3mdEcn`UAy>Z+oE0p{e#f+LtXMpu@iQ@lwh&DjAY+zC*RM^XIL`c=}{z*POuO z(P=v2F0Sq8kxkp!{fHj!V`6XAz0!aokK2nI_%ue=9~?tp8J^(E9*xQ;hY3atRy}S; zohpS>OHuq9-{vYzPr;P}wC+v(Hy{{YndfP}djSu*_`2T+HiePmNcKLlO_mDa2s3X1 z?-;SN**F>|E-=RjaW2{aC~=^FfMJAkviCrQ6)6XyMwpJXICoYUuW1s#>t!^dd4k;8 zyD^B~nUEU%M+31&sbLHNOkARQ_(`NNNsz@s$0du2R~@$oW0Yyvp+=7$b^1&&$Ru-( zHdTqS7Fc46WtN$)T)7!4RG6tsm04C=Yqs^)%NMj$fddYj@312lI_Z?f&Zx1}6K@5) z_rY2S%sX{yMbOeAX+)w?Xi=i+85o(EKL?Sn!~R)_H5lwOUcag#VAwdg0C>Xi2?&J~ z5tERTkyB6taEK7ez)r)(&0SUtrLL5L2Z4bRwDYksU^t{OkC&iO;DB^jAxjAiU`7%9zeGdU7NCc3i9zQJ|Jp<3vUBEB&$u=Y7Hf>`5xvL*!H4V;Y!=a&brH;|y zSQ~~@tYwIN5TmKYaY|{LHt5j=X0WaYP}5L+-V_AN%>yBUQIf~;h%v3=j=I{X<49xF z`^5Pu88X1Td21&nTCwObSgipxi$b8W@BI^QjQYgx<9)D zSi?pa8{)@`kWZ3=298GxXMO+$3;=@{#(h`9H)cmLpi}vj)i+G?32j^G|FFFoz}LUM zy8@~hMfjU%S_%J|Cm@RR-U1{e`@(wo%-pgSC{wLbn;v65hY?}g=@zj(TNLKyB7xV7 zB;GEP*^&O>=}3KhsAYLl8|Fo=z}8xkSG5vvYGtvZuDq))3{YJ z_SQ}1?aJHj2*&5cE?Dtz|%}Ol+Fh-zXpzq^5E2lO6s)f`1SH*Z;DA0?Y&eczFEK3Gr22>ECh#_7|MOuC0^r|Ue}v>2~yoMHX6-#NLI3keu!vHD1%U5Izh$Mk`K1j~Cg z^IUv{<{6CmNewD$6{=Kf>$Umz*=xT&mfOhfkYm%HW`>_oNJQ%&{FJ(wD1oZLwuE{s1g z9z_1{p@r&SgA=cMVR>jK3W7wWSjl_F0hujnfYIjb<2*o78-m6#6H4tRd_+P-=Y2*i zprCp4nl=B6n(Q$qZ^OSYu~b9wJ}}A7relI!c|a%Z&X%8cAe1>0y)8G7bsm~5ydP^U<>TvfR_4C+nrb4@7Cp}(U?|eu@nWw z=3v-B-#bpN4TI2*)H5%r-5^rQwA65doI$riR)M_)BCfT*kkxh7@TL!mhO;4MS=K$1 zv_*!K6`oJHcphqi)z*=qJrZ}77+~2zIXFsZ=p(A2{ii$KbkL3U_m=wP@e_9^2Xt(} zW&(OP@|G9`iWmh2F$pv=3rb=URKzN%iA~TDyP&;OIEZ@s2PZhdg*9;t6!8cO;uUD( z6O_a+s7OFilc1m>AwgR{OclDNHG{19Nw#x8nfkk&Vfk(pusFpc6l-(VMs*jWl(rPl zqzy}oJ=R0|fH~D@EUtCDiH^keoCuGTw*R;zLB09HbR~HPwV8&DdFB0k4jjJ$0HFWD zmRiEu;{ZqX+6p2GJ^y+Nq}W~Q18KlIq^YQXhK(}EJ#{31ow^(B)E8Tp<{l;};&|rf zb@A~6*>w(RtTJG3LOq$+Ya#Wu>Q=}l)QveoM+CNtTWjR9<9_;Op7VwKMdkT4$7n(; z)u_fm+blTod=i=<^9?iyr7|-V8fIR)i4V@QvLdBkaVRKhIXY-qa)wr$$rI1Az2>5h zS*_a*E6gR87&7WhT13d+Y4sFD?wh8D1x#oNf zh{B*48p=L(>dm{NQdsdSW2l4SJ8N~lYHE|xQKHHsgP3rYBc+_gARhW+4Mjdzq^TpH z+&oBZ_uRFJ(ce!K{ToE8#;v*6K6 zZjw|>H)HDMjiu0p1yqD3RA41b$vQypwX1B}j#%bfa4WZQ!T7Cmo4qYLpJ&ZJBNjSP z6}nJ`o-8H(05S1tk;d6XR!d0eQxFDF6NXTOkt`+S0AcmI*;_x2E%7dFpe}5o4m-Ie z`v75bJ$%E|X|paj)7qsG%?HD-+=)}10#~8LuBl=JWpX`Q&>%M|3gl)*f!}JOOm0W{ z3%OIlle-l>xmUrH`wIl}ph6%ID+KbWLWn(n8VWTZlrHLP46vO0+5mxU?9o@^BLF}? z0dfy)p8&3R5D@Y+x_kiYMV?kfqe!$m`yx8}5W#%ux;zepXHo12$C`Yxg7q>m=ZCbY znfegHhS=5OoiFlaKkXP4pz2qSjE~}AttswUg{UCCcv0=6wnrI9Hk#oRAWBCoR4?*} zL42;;jAp;?I_El~w27*S%^1(z_#9>2W9>Mtm)A|`<+3L~uFLyT^=$N&%1h$KJ(FnX zh(mRKyu56vtMgW_Zs+P~%4=|r$R-iFw^)FllSn|MA$yzb204*TBBHKw1cx~5)R9vf ziY*x>Ssb@&;@7w^Rz2O(^%=+4D4_!sh)d$J$65lsgi!U@rDjqLa%N{gIih@rGXOhsLcuN8M^duv&Pbowj1ekL|eF(hrfcH}8xJvIqX z=%;wCZrbuIflozTIwAV!1ZTE>27hn6_sKB2ZZ}@p;Huqqx?lAg_fNgn)zuq`(V`PF zxVy?GAX-Z+Ob`f-<_j9;l>>Vf0DTQY{Z+n!oP4+u+%GnWZJd!@$bl&4rZ1PnK!tQs z-tK~WaG*jQj>WvE9YF?tF32TQR&@dYaRTmlm#3ozNKkF8n9)Yc(340tt>Wa;LNfhf zciF$K>Od&u2*Qt?ysIM{5)c~6x>xoZAaV_IY7Mm798cV=Cj(LX^O#y5YVsd%u=b7* zXqb5wj8>hgN~Lut$zUd=-@7_Q4TvGJ@{J|M3tEd_3B!}-GFPx^%V6<{fUM3}ZL-FG z1{x{0@u((G_3#LUsJb6jG-fTW{WT<9XkuIHEYM=^HtpB}sOfAVyBkiQOf9oS(pXwY zo4fRA5xLh*XuFti18E`G`DUzbT+he6?ckt6KvGY0?H7lIK)fi^2x5}w^b0*12td0P zYw#jt6EZ{ycAU#oVW1!b5>(}tI!fX@#hp7@KyPGFlVGdq13OwME;F=SXLn5|lHvM3 zwA<%!SBFnSTVBs}^UU&sWS=p=-@b3}-v>m-uU3GF-#iIh{K0T7l%CM)kv12)&{pNL z;IdiDp>&r{;Mr%Gke^|`3vHNbTs*yIB#Y(PZ|?kzfevrkWDCeZue$TpYC9iz-=`7Y z+1|;EjfHa1(LD6YTpG?H74>+AaA6j9WW8SPL!_TzbEFI{fsnyvbq$V->he^kLNDG8 zDDEigG;5AH93yphWYCk)G6zG|0YY0sL#oa0ArlT7 z;41^I9A2$`c>zAsM%2aZqcLt_xnvtTj zp~59WlEuP_-7o_(X^X_+ca@3)$YL|&(j~xbAjNu-=GMzQImX`~azK`EsK~d+>f=ct zrQf+!(?Y2)Lk?7DlOCgR0tpA4goC?di~h%?S7Bf;t1b$#1s+hqMWdubcF_-e>!b?d zwqNSZlTX0m-AS{wi2`2Fg{R`os1OYTsbfIdKZLc`dFqgoN1-)A3-7njQsF|<&M42= z2cL0*GWE>lv$%)KmU(_wzQ1GUfHtYPP*w)+kL)#fj$V$cCP^mdi%9uzL^|SA^18Kp0drB6? zmqHwNiegUx??>?dj!I>O-ty48TZA-01hVnQF8-vEnqt(J!P-v$Uzl zV?^fm&3b{v>_3fEqt4YESq^HBR;Wb!A2Lk>?gOk8fj9}3rX}$k96qs6IRjMaF@#iY zh0nbV&nuhCy|R2qeRx~lDnYAlQ@7>9SL4wgNUXhj;aPXIxJYjPH6^rA>P%3dqG`#1 zY3G>r6Vm8$XN6saOaI^{oN3{pJP_-39T@~G#5Hb*Yh#X$$w zR-Ve#idO5KvVlvrjN13A-8AM3(ao?G`25~sz884D^u?Q)fKJWIqQ;_N@^~=qFZpTv zHe4#PE@Gaw@)j96sUaapnapQ57|+MopDZS$rg)sxH<}&{4y zCwlF)((t|J+40uITPW*_x$ONH&ULeBi_DOh4v#mK$B7~y&_m}naIR+-9PZc;#m{aJ ziM6k8ns44|db&aiRO~+ zG?D+A=1#9iQz0n}ocmLXR(C8CN(1gpI9kPhX`|JXMZ5i;V-v^*a$DDgt{1b=GFy#W ziJYKyN34rQ!+Quv*C)(EOn5?jcU*D}T7l^^`{6iCOa; zD2{f_bKk{y+Nv-w3_o7L^lqI`&h|iilCTz4Z%;z#UeYD)Do@_vo2;tCKI>ELsp&M7 z;8RZ~Wz&b_a4FG7;@Q4Lqshrwu}sz~R;HPM^ZcQSNG91E+9P8?^$>Ql%HX)_KhA7o zof@ubbV|b=-fSq2SGy98N@oa}74=?Y4qFjmgjyppaW}HQ3dbw-Rvd6_wck!y8!8A* z%-7AX#|a&tI;XXvGy}=9yxRd-zz@&Fl;lW?CTV<&YsUL9Ycc_D`Y&Fg$zqm%R!ed$ElwL&0;~DASfu*%mg2R+=xNvvVV18(|u7<(U9so&l zH3#gh=VQRwgwWiFyBd62lpLHzAZ={zpt=)w)VL_{rk<0G@Wv1(i|M6eK&h$B;^AaO z@R>&D6Qw^kpPKM9{a^VXyn2_HvivWk$h=(ZJ-!yJ;M=5EuKBveVj=!QR&SC>SWmX7 zX@5p+b$V$a5rm-?e%(N~o%ZMl^8pF!I!V)+E=z(T*~;krsj)~a%>qlS<8h10NCPH` zcF{9@3BC;lXw{41Ne)Q=g1)T|M6KGT(>I)eyf|uFgJF?v7Fp;U(!`VR*~%{eEwUj? zl)<!B#v1p}@23w4w(9yq0Dl{LcwymtgNDV?tP1ZfKb*>gc_}U65Pc^@U z2#y~6^mOC*3~;G=adtY!PLnjP;sY|8!eJo=I}8UL5R@+AU;tR{qiFJ0)V{mBW@-e3 z(eT~`0{RA(12WlTYlCOTBy;lS(6ciLpu3fwt^c64mf{ECc~eoWANY=8Dc11|DzBlx z^_;*lWwkHRz2b4caW?Q^qv+&s1L5^OMLG-5r*G1|{qsINa+k$Qkh`c|%i95F}mv1IXi;E4a zR?!>K+D|&$iBO;(CFF%yVY_3V2cr0?OTMqU4#&oIS}2G27*}vYyY|VbgLJ{z-#yHW zawm0F_6$P)R=7bA2R&=nsY`@p^xE)lSo2h^4@0+i%W!wOuvPer)tnqSw9zP0-|>F3 zGFev}?$+|6i}m-&)!n&pF;}p)4t`zuM;y7e1;1-fZ8XDSIkBrLI#Z`K(k_yWSU=Fe zo7N7>z3c~K`~MLc&M8S5PeN&ud~vd+h2uA6w53l_aN#Z1v`~_2aV(k!C3lEI0my9R zKrpUFyG2^kd9n+Jl^Jtt4;2|reABD7XK!UGCdL&~%eiIaw(inSpfK#8M<5}e+URzI zg((|m;|2^Gp4s|dS1)p)c(cVWqpO9BgeS5bXq(2I;bTJ5ba0_teJPoZqiBX^2h1AM z*M^uIe6m8<)WO~C1lQ82GW;Rgr0}*kE&PoxWocEXP>2HY<#Kv`9mq^yC~G_O%-y$7 zLbw!mM{PDkM@Ff9ouUiQ!NIZT{Y9Ifhz5%#doq7cISlg5D@qCo*R9l;P5(zK{>y}R z3PkaK)b8+vgR9-eXbRsT*23pt^vAeSdPb!F>SSk*oNWa+3O5&r+K@EGK>Jefjwu(+ zC+d_{Bw|O_&@Eh5pPIqqVPZ5kHs?vhA)2FKiDJLFeDdMTtgsQ$p6+>gcCd_7|UJ%`}I3 zy%%aq1Mw9lOrSZe<$#@SAR8@g%IWd-_MZ&H?tpQu`$;7PbrE^l%~pIpFNloeGR9}e z3e7jZ9FyrV;qSTGU=m32OF6_hZmFlMV#*nkt+kN`4heHSG!7xn9h_B+Ti{ma;8*pw za#Y1`LCb8=zFi$?54EdpU`<2LJl(d3X`h)B@79{^&6fH}%L&hRaBCK5x|Jq};p$p{ zdM4L)b(maDjHzn?Wtb1Mu*vSz&8=BAZbi2y)ybxvFx|YmRb=>#9nCO|3cC_C5yk29 zF=NKa(Mb$8W!~yN&~H%2gd4P3r}WxT?T@lAut}(3j+J6h$_K(a^}>DvIWI^z%CQiw z-)$zYsjN10A_!J9xd4eUid`zYYmx!Qt%qqQ{YMI%D+aLd)H9d0ahG-J=~k^tVB?e0#SVV4a=3i>4tIOjWe1j4>iIU;PV;m=Y1n?OXix_MO# zqq}xHwy2{MeTVbQ7DMe~=jcm_Pw6CIE{h((ADq$ zd{>u%%tS)3mYI^EAxEfSMkqwy036?*6ElF@j-jn!g_S@$l}i$YHnK7}qP}J=*ZD1^ ziV9=|p{$0iA!V3j>rS1(Dl}V)<0&}ZpG~GDDD)`3OQH-g(MdCK$FacbFwSU5#}b8{ z=cKBF;Ej@2lzZwT>cqv0Y*Dk#6Hi7f{#tHIhJHN;gaSvfSUdQOI=~o5oPoQDVeDb` zLY^FUPbUiPRBNyxTeFgz1QXZ6fFLg9$=TN^DM*a9$L3f|;^El%(IxtPF83&a0!CG) zYGA88z#Nm}5-|=kskiH?K8*Xjaf~6LL7DaNzmh#tIqK<<%@3-pDp}2WdX-%0m~8+*=0sk zAzLA|QUc}}`#aBRXelsi$?9RY)%jA*IKm=VpEzxG62aVgoeduVV|t5Eib-F(DvEj3 z{KSJhn)2e61ssDJEKg8_Wd?I0M&z-(=+kVR+Miu(Z z#DR{oXDD(K0fGG|VadL&Y`XUd8w zu9g*$>j+|e(_Y^mt`xDfo;+26H8Djb22QXVeGw2slSn7a29r}5rHLAL zh1pyICb9o{K1+<6hmG#z%5`Luxvr+g-R9(3Xz4;&UV25Jx)3y^uu2jV*_CEX88@NW zS5*REC9z;JaH%5wrH172Ow63|?@>*=R50OcNiBXrj`nXdw{#3NCOKFX)D&d+mS#f- z#R*Ht^_4hR#jX;wX4ZDS14zIK4wnb2nwBE2@Psy_L1^Xk#WtNz;tCtl)KXerVhU}Q ztxq4y>Qm$)wM;z~eX&a*qE@eopu}Xxx;Oeb>4s)7Xzr1b6+B?xZoG|q{W}8qmot;V zk8u$85fxbGN)ntva`9hA@N`*;davAjTL9AO7`u6M8?0TMM6d(bk zmaJ~(FZO^&)2Gj;8An;HJn!%Ox!f`X00G21rf%2G>_2t)Vvqi-kw8dNE6gT5IIWWN zgcCV5>s*EeiGq=+s`gA8aaO(*Ig5}d0U6_Hh;{Ae6&ud9QIkx$Zkw~m$iBdG9{NG< zn-Due1T_4!1chfp$6ig-OLT@Lb!kE6yhBv#Y8n6o?6aSA;Dr}BeRPQTidK!q_H%$U zK-7vQ;~=c-?Mu^CCNzvSbw%DM&lL;+0}StFpQFNzzG~#}3<(TV&IQf_ zk!DNbm&JXo&PGVTiAyG;X=>mm5PfFbd0EBSq0KM-5kM#qwLdB()SI4@UUNSh-b?@< z1K9XLpj~;-(80l(WZ(-;>7S`>KlE_4V!D z!1Z~T@8vH5)#i>WcfGHr4m>*VRJPZ|9TSTFjNi(GOiK-QdL7~Z7hCjW16RAu;TtRz z00B_KHr0oF9@BsH`w=U%z{R(h=;0>^;(1@uLATIZ!>=>Bagz~l8CrG&b ztW<8`a(#d2LI5;?z`Bke-~u?UGLxcv0#mYleVnhq4lCd!FZezhb?L8vrUTdLf@!;> zK?%qv!J+@q$KR$kQL(lMHoiy8v6JXLbTkww!cb;H&U`W!Oa14Rw|_g2Kb3_+C%rD@ zXq-IoqrL<-)jAZIYk454r0d>W2<#NLtOXkyl{%@2y6n*)y@WhByv>5dhMMHr8L67- z4OI&gva+&RigheCgBM$3`{HEX(e)8nGuT~rH+#V1^@()4ES6#&bKCj8mJFXDhWrbj z=a)Gd1@^^X=T?e_HW*xxrW&ZN5ynEYV7RegAL4Q7Fxtu|-&l$QUb@)90|_4&mm_KaeFIKM}yGhaWiFx#k41eOh&RM!N zPYwa{;D+z*^EOF^GL_c?^?iTL=j~cDG%x1Mt=6s_!QI49tZBO0m-_7bxK`k@8`2yI z1nS}1#alv8_kp_*}ksU#TNN#NPZ{OSP!pt4B{W7}8tZb#GdylbZoa<5W}T_naPX^y?Al(-lhv3@Bw^mH^f)$7tEn$!~97ss68ELyQ*VINz}_L$VA zv;?J>`gla%701wXc{u~OEv)11{a|u(`lgs!U>7(mY14EP3#&Gz(b&2m-W{BE=wsG- znTyhHaMf{~);f|!2h_Nr*}+W$_Rpcf43M$l$R(E38YMwFzu1Y2veNq6_c;;m8Mo%^ zKn6&gJo1#C?E$5<1xrHL4}=o}B<>dB;~zh~z!AkI1@KoQm81!(h?w8GWRMWi)VAQy zac!>T zLWm14i55OrW}d>YLY~C?;eXlx<37M*mJX?D5I<->3Uv*tX{QP%Tq6?A2um)vBWAd$un9%^=@os(8fk1p zlTrY3D|a`al^{dQ_<-^ zvF$f63Wq>TExqLcWHerIvJTDFsn_up-HHzhA5Fwghzd{*BU*=2W^l@V3_Z(u^;C58 z{uxMNFQgH1uQR@u`sP}(Nnn7^B8PUmOS5lJB-CXFr!4<_8nmZy zM}5IJLVo#Un^|ro=PQCblge~hp6=4L36SPqi!wW8f-j>BB^*Fq8ZgZdUni?_Mi^0s3 zs6(}zi^8QFP^gWV@Zu%RjB4p`#_4_;qE9Q4{<5+c3|xFz#fo2?Qj8}&v45hgMmReo zRXE*MRg;joX$f#C*0IzKBeul$|8bGaMLgoD@rhfT*uuQ z(cqirt&!pb2_ONGN(Bw zIl<~kl5drmmQqQN*&toOvT5aBs!Wze{Z2VWN%FSB=KgxKEOFE2oD^^3Q;R@S8p)rC ziU@k@(iFO63GM0UVh$FX&nKH|;0xi(V|(#@HBj)bzN7mZY>f$|RvtP1DsV z{U4z)WSH(%^O)jc&URbLzwwAijJ>`lMKuuS6ZXPiA+!d9gJF=6C03 z^0DxCf04oF9D6D(B{(PG_0zED)no10Qrz{1Ptnm`2<&Z~B8h9`C=Cp6oZaJbj4#}U z;l%1fpiVuL?O#1I54i}a$l=GFZH7T*AS1^CB5iU#(+3}H@I+7Lc4=!byc|8E6OuP) zsDEdwD@1ibP?|V^D}HQ7Nh~B$$^IG+;sO`|9_x^vxB*OWUZN zFTjZP5!1M~Dx;{Z~w;dN!h<^#Nze_-_&Gzl3A1{H7V$^)rXgVth(?EnYW#2l&8O&^}k z7A=iNPeX-_uM7xgwY0s7Ms7f2XP?_78a?!_c>M0|Jjv8{c z{3}!0cH-%D8BM79b*QoD0iN0+CC>>>6Ayzlnb`U<25<_Tz%ad;tvYyS_+Ckuym^s+|w=XJ`T$K%g{nj6iyDk$1U=e<(5tM4WYoezM(>cJnOEK zF*m?2;wDdXxtLih3^E{2E#+e!J=@00pL8`)LPNO|eZh|K_%VM&1v> z;U2NZl*tg*ibEegj9GeS{<;}|NwJsKxpJj)d)yMRK!qa%p@15O zYY&LigrC&Jnd^Byl$8DhHZ=)|21r;`P#&;jpaH1iWnfmx-NP;Ux@tW45^Cv_EfyjG z1?1OY`7G5VF{{z0CUYICtKSnb0qp_S$i2SrS7n@yyvwy5zjV0!(BDX$dvQd4CHOPZ z9knz~X_HW(GF0BK#rKi5{10z>0**wxaC8(2*6w8Zd+Uhuf7%NSeVJy1dU*dvCtvWN ztMEkvgNDUsY}uo6CiDNH!VEfRt+JSBb4!{-Gcr}FA$&p_m9FxJr^{*`mQqlOHIPAF zfaWGYD%0XsTJt(1#y(ZO2!(J7KJ!g?Y0FU8TpMw6phk57hcS*Ua9EKjEh$^t(aVaZ zJ8xvtlHvGOh#aCpFau=VL?SCjTP(@pPv4U)THT;%i~&SHdx8rzUJN zZpwU-mbY1gYK#ouj1|`pUQhhJw;fR&Wsj7sIdxPNmqObyx3$ZzLyvj8Z^ZKN#rx4Q ze318x0AH|`#|)>)im6i*JNAb9$#FE-l?<(%n-V2FhZn{WOT1$RN{w2AsLw1+-7wRC z>vWMO`t-jyj2&r~Mq}K%*d``rns~A(lbx7CFG*0*3KLT@V~le;=9eY396Gcsq1G_5 zzXq#kJD-~}879+iJ(kVZVNZXM{NZ3XGc_qGj3cw$>6%&mzfBO9KY%5-_t1>%e{7%` zn}5Ge0sC*2r|d)&>0YhnXGDrepy(R0IE`8*H%OcFJpHkD?^0cJt9C_RrfPb1*}VAN z^|QJ=vl7r>>ZOVR1W^AVSJ}JY?3|2C78-uh+eAkYkkw zp`Fl2)qsYY<~HSjnp8my&V2D7He>vPo^*w|*rU)$-cR!+%=A@HOH6f7O{}U>&rD5K z&#bJOn&?iQp6K%>%#2Mn%lh*2x@9I)r`%g0={1=py}9|Fa#Ko=JU3s~w+0%P>`AqW zU6e@_msm>6*qlli)90|}pdn*b2aS?AgQe7)ZOKb1Ayv<{^~v13Qw_osV-a2lPdl3- z5aFxquD+Faa3yTyx#3BJDgU&pGuBTt$X&~eY|OW@u9Y5JGs!Tt)-SWn%eFMHfD`DB znftFrzri{=A$|5gDT&oK=hhxG0RLbeK5FAn>Yg`xvAe8x@`gSePa)w$P|7za6`0c) zQ9KxkbT5;>Q*KSoRNR?vlt5!`Edn77*5>+jYAzDNjKT_NNyvCHhM>m?{xX zi;>R7^ZbVK_+h_+|4+ATECY)rJ&2@3Pi$h@{7>Yer=C~Oru~VEypvHfqW_>T`95gh zIgql0V^cSIRw(L0RS-N|2=^LfqQ}LS{0~F?mXBpAwaFT5LvfL%R-;L&3EcUv9myQD&TQ2mHlztl zaJ9-5c58~KSg4X0unc;3Uc8Kzt221na=C+Vp(9<1E&B$u`#VyK-q6KpAW7&TG*S#) zqt@$)3W~{Q$~Ba1SscwX%}(b_mjYNtB4G`0WN>G8l_?-!MdqBpP*!ZLW{y zygjbBWGl<{qDumP(vz^*JaAic`{2t`CH4MF$pC8ATkT{l6^WIiP?~EgQAIy8P;uQT zc>1}BYh}W-X!0=v`XC0?h9U?fF-Hi@KE9wI#24hLPyHn7CfYFWN<_2}j^Le?{*Nk& zO>RLoLTgdHC#7DTT`D}L@1OQ&6tT^raZ zM;0J42L=dTNEF!}S@l61+T64l(qb@YbDkdc3+8Pw#o8ZS2A%VL4Gy>VJBQBT{#c7; zkUuwIxBkqF6m#x?=G3}W}}_4>?s9i=jx-=gs0=$S#=H!&36Ac0sW55+%Rkt zK7!%t{JGycgd>KLfQayR5VYrwYt&C1wURPOi}(xVXUh-_u2chDm3(4RRnJ02;e*B)%S)=H?dQ^odVguSg1SM8Tx}cqp=nzMbWQEIRK~DIwahJbU zo*#9Lo_GG^K3hP=CGn+T#;g1B3%RymynfH(rAwAjhj@;reczS&wrczC?YzY~8wb1d z-%XUCd+I;Bd6xdgeCP7qbLY9h72LK99hH95Bf@+mPHXj4)G8EJPd*F%h6Tq{QFh^z z``sRuNpN4I=b*spNH}UXiu5^ZCuBqrF(e2NN!Zi)55OZ)aAY2cTnKzoplZGMq0;JT zecv0+CWD61S+%V|Pcy-aMmx}j1xZl?^5@3P_%m8~Cp znJvI`yk+W^2b;X@f-;Us)C5`u)QKx1JRkHh1sI^1x6%SRvOpSuLMU&HJxq}nzGB&YA+dqO#P@5<%JcpfjrIod*fGZ% z7LORe8gXX9^*+)pV-V&Id7HYPO6i=B)!sVhCnR9G*8tiQM6~B0BHFPedFVPx(Z!*{f`^k8h@k?W>}%PwVu#Jd7t}M2LCAl* z-KsE4MB#ukz?K-(7aR4^4zt2bgN}ByCnRTxBO#4_l7v`0MTLP|wJW%;?;&F-C70F) z_9?@hBd5q1yC~aIB9FvP<|f0iCCm_(`!yAO&Xqe!fm5WIujRw#hI*B96rchrOP+ya zKnw3ou zieaG?KjFUJ3_}#qF*e!%fdr7sAcHwLeoXrutU3WRZA%5HDAy{f6&>A5?nNcC`y z1q(zI*NKp;RvZhKF&QM#p^;%POeraXQ_sk}#wtY#*}N?8+D!cN9IaW63Lf+jy65eH zOIn$0CCEg`$bkjKjC3Pso*=gyBPKZ^vf1>hYDdggZhw?d0V2)u=yB-SA_S*JV(H7r zKl#%cV_-$^AXvaIM1mrlIW*(Rt6lrrW4>q~Kj7X$aZcq%WR8v?jWx%Eahaur3E^~W zx9#Z*hM-`99L>abBVZy86i8;{_B*4kOv}`2?HClaVqipHx)%&B+s*O(H=7|N(vg%_ zabL`=={0&B-h0yowtf8bqq~2nD;FqExq)nr^q7oJz#hgoGWRYUT+QcU(D>i2VktS! zf=tXXCVicniZ!c#DiX*_WG2dwtu*hieXtY&Z4I<$gUq-O*R^^HF9vlrZ;Gatx^z~< zw?D6+&X|T{paL&_`dv-;)j@fH1L?G01*?inIide#0l(;5by_gd5X86(b?z;*`;QmY zpPd4*l$BE8RrK_IGa?md#r!W1t%Bc^sZCT&%xOtNDhXxDDw>MkP)lkzNIwO+7q0sL zx!swZ5qUEErXjljZ~pjhzgf*DgI=2BMI1Vg#@2Pu+Xi0@lRBK!g_&h9xUhSadmM-u zc9l{AbEqZK$^Jnl1xPZ_!XDi9kg&g%@C)UMLe%U7f@TsfjRTI9VMeLH4-oFbi)4vs!?-rtnX}V9dWx9vd~&5+uIE3Z9(umZF^0+4bxex=N*;PE5fm7ovnTcvpq1 zsvT5B`OfyYgzaX%0+<2@7C@h)s3(-ujw$?z6+n6kj*_(RblMF&OX<2&dG^1#n=GAv zl`sWVA&dpk&LIMZPPyV{{_d*vP(AG0aipK&Si!h2?zHH3131O&?Hnk_3Nzj|#tstl zM?(Cu96I%PiSe;8PNg~qCGJ9if!j=1U=#2sF};Uv{Juy2Icl7+U7>2o+~qFMloVB6 zC%T}bhr^V%TVlkDYY-}@_jDZ+6jd*6E}Bw4G|IW{xCUX$+?P(r!+y1_tIBc4KH#!> zkHfb=%lQWkKoBynP9l^N4}?@HDoz4~;OUa!0^%4K5zqPp<<^2zBa{oyFV))l`UJ4^ zK*W=y0x2`sD=ub!1z3U3Svi*jrL-LqheB2uM90BseKizxv8L1ySAAlNH{f0~OcS20UG}|;z2|My2U7s+MO&Rma(GPN58PhDu4eS86 zut=jxBz=2kbj3K3vJYDTWrE*)Aa8LiiR)!kOFm8GFu=w$P0RR!T2Yg-m6}XTZFIf- zlB{Z%8LUQ~H)0d^ClP>(!)tt_*ArfF9UjFOQf8DCGrA~SzvbnC2yatDH=VH+e|3F5 zd1B1-hynJ8R`3t{hul4Hs~|Ds6?k=Aql^+oI>Lc(^aY9QS1hSgWgM`7DS_em{J))A z9%SSd;y{uTuSo$%_)JR3j;&3A7O0SAFrtydxKY^-Iptf9*qbq*Zvvbepc=8YG&^ad zo}lOz50x_5J}rGBb_-dxulB}@%a;;B=@r)(z`+nYDIRDTMPCXCoF+x{~y` zFH*l&Wg@sktpKN-u7nzp3RRVzTO6FHWLE-EfR@Bd;!#F55-cfilEyjZE}+DAnamv) zh@DB!uVXElSTvVt+gM^b;CUTcOi8StbDW7V9W7_DEe%MEgo@$-%oL~G4Wvk1C2O+S zzAR*Vng6340QAz40`L6H))F0B^P9koMR^a&c59Ex&q$1SfwPnzKBB31Jsm{(zxv!K zi6kBl%j)2uil7iz{X?#Ywi@x!DPe?4ZHFuXjVxBQkkn`!VTF!ezt*(bnPenLAsp0dE(^~P zCiRl65eZu@o^;_I<8(Mv*Na#EX_~}Q2tjwuO8L13aI2t!1`AI9E09t?l5>~$ryQgJ zA#;js%Vgae%7Um>Yu*AaZ@dLaYiCs~%nMH@$^A+vDz{e#cVorgS*7GtGIgC9-;--r zbZ&?nW~(%$kq6z!i41*LNb78zDor26)}(-Bj9d&=$wGt^cf)2%4#zSY|wF47?UaJ1gzJzT1;qx65H? ztpU=6o9v2VSnX>SOGmBti_8hlD)pcpZ3Of>vx->5p$Ks$fBY|&_1$5S}b8h#6eSzN#=0@~z zT54i{e9I-Sq&EIPDV+r^VLO*<0kwGAkG&hpZgXm*wQNS78kGua&#Afp70OtxxjD=Abk74V@;xdLIheGI zn@F4w8*hhq8PkHD?Fl7=f4nxQcr^jWi3^h+m82~0BYTD2OX4)S4*IlfKGoH-ZFIRj zdsUI;1w`#Xp%_&)OSyfH&s7ZJWa>QN(zZU8&3d`e1#|2|7SkqT#IVR<5S14S2o|YQ zDsS520Y%cSiFwr_P%HQ7V!*b|^t)*)Cs23uan0-tMuid}Zss4M} zD&r&pv+Kk(C)=$&9?DakCS%G8*~pT=`q}^yuO?(0_*uKW^dmdT@$8{)GG%6%XPfIJ zq0S~Nu-YB}#d)if%YHNN%(}CRxa@Ms#pKmqx*Kb>vj#{l`ivpYQ{W~(w@JuyYIIgM zxMK9mjL2te3@0a4Zyib8QgAD8!Ulrb)&-zH^xTR&gC~!6pBD%4S6sj3yhhJ)#B+ss zd`gk95A}P@EV+nz8n`{sRl2|k;KO4e?2GKPzvM)4FmI$HG4@(zy>r;CX4-KsJ zRVlUxZzINK(+;=v60o0q*Py;@UEkh73YwNS({(m#)tUCkzk%dL8hSbZL12q!6X!Sk zdB5r`IdE&g_;~B(Y%&`5yPFX3eN0g#)AQrNT9ZoTtTD5XG*L4v5+!rxHtM7x6*O7e z9}M4bSBu$nJWQv+MEps%Y)QwGQ!eQMjs#CLId7SHUR4@RN+0hrsLzIe$px+a7vgfNEN~;O$eYe=?Va?k#)7wxz@nY78 z*hpE313qQ7U>(#Eam0u?bAr-#M;c$~7DMf=TDT@A4G(`D)8D@0=iN<~e{F5o4VICK zkNJ%-wR&&V*zWFT?Ygu(+aC9BXP87;QBc(W^-#dNW- zHX02gYo>5|CX7hYtnz(29Qh`+Q#Z0NT|ZxZdl%QyZ4XW^mYYkQnVpXNU1xNu3^2fsyPycsqR1nwV3@_BEGzHlSW`bY%0)RM|1}6ft<7mpp&=am8Q{w)SQ1Ej4Wg|8OBw&?0RNeHT-!)%HvFj!MkA& zXjT?FHT=dXcTy|>#<(3+f#Jm1Os(@D9JS8jjh7IvD@ajFCEq=oZVk@fwD=`=a++?v z+~utbqJmD82{MfBmS@w5ic}!2h?IfkX&6Yd3FiFfRzt4pUAaky{(t~eaQo7t{(Gdhhc5u2H+;vDLbH@eZNU}D(- z3cvRN@isIaq839inqFzwomlvJ{AXttmTz^tSg)dJEy31C8WQuBaMa6aH8%y9qw6dn zR(9-|v=8x)8JVh9ylyU2G(l^P&M?*ql|sr4+`*S2Iv5fBv@>$3g|5XZ>Q^pyAQ!*p zUb{>&X$8NsVeo)|M@&t00XTuZS#a#BK{Eu}qSIo%$N&043b9ZB_}a-}O8SL}pGjRO zVlFwA1$A?^1;Uk{CITn6jX|Ufrkv1Samqby$ZCn$1hU>Y8=fV9W&Tp7B~2t9G=kD< zD>bf>G}7)?k^V&AM}{4BYJ!}L{+mcuxY&~yY!ZEJ_AzGhM$Urjd`Gl5@B7_)p(|bp zAgO0T@3GFKAc*qB{uL*jSd-+B?nEzJfJ#J!-LaO#Uwus=K(DY}!sqc1Ai--B{x6ZDG0n9F5@friqxZ3bCjDYah??O|DeV)k zQALSuQZCpEh1;pJDasmuT|8xatiW{{y_zCb-pAP6!wyAgbfXi!4dZG^OF)TwU}6$lmxOQy|X42;65V zcTij$!=KsJl9%bdH54eIIwUfj%RMt*@FwQ6AgWQg5y!|p8YyS-g2h$|pNXop7;cC6 zVwv~}hi~#25LqWexB}&XQ_&7hG+z3+hH#4+%5uGmBWhRcT2xv(4?`!4r4`OeeM77X zn=6eiWU8>*y9dfwum<}NxeYew}T6ZfxYel5otvR z=mCS{#=pf!n5IXep6t;&!@j;}fzz_rG!w55l6neNBtu;PIcg0&I29 z>q3GQ;`S-q?#astoKtMdb`xi^wWi%mQy>#wpv4Q|iZTyvfJ>IbG4e2w7|kqTe9<2s zD8i>=#=Viw3zZb;9`D%Xl=4s}4Cm7g46V3{fR4+KL3-+Uah}Os3r7z-ON&CA+nnX8 zouU838s$fM3~bS5XYE{$jWB;6z)_rpaGt!EW6k!PZNDp(n|e_XhUcwgIVW@t*o$=y z>~XbE_8gdvVPO~~CR9-8=VE@tp|0N}@(kjeESCd@2r?g~>aUSrN!QQyLJi~h^J%}! z=atB(gYH=wovRm!V{w9#;I}tA-(nLN6#4Uo=CHk>)on13yo9_AZfhdA1pY|(B>pO}oP+`09}tFi&i7Sl+T zdsEvyp3!Ev309*aiUpa*x*su62(napOee{rT)(>Zkl<$4I+ry=IYVs&O=Y@kwwLy^_}ZqQ zHu?x{)(%Omyml20qaN+x#jhB>R4rZnHNY@rs5PCxmntVe5SHAomQ6lD8`g)U4%D&F zG;YQd)r|bNObaHPW;5w(R#UHf7@B7@8zzntEYlt4R_JxzQ7MNdlY=jMk2Da;r4cfY z&e&nKM+2&=-B$*zX5Q+1bk48SVg)`4J#w0UgU1FMc`+70OS?zeo7azr^>RGyVzZv+ zjw$jHHom~-GA+nt^~K0wZQVZQGcpB{tb(g)c}nq5jN^JUDZ=XPj>Xe+ys2LBsX5Y) zmr5Z7GSL>BeRa@%7hsBAPkS>O=hqf2z}+p3Si5okZgZ7gn%YX*HO$k&QISKr{c;^3 zazNe^VxW(QTN%>2krbI)=7A}4x=a*KNZ>-(NuI2sr|W@~uh63qI6H=nK6BHq!#wO5 z5Uw4-)?I4NXNschyC+*2Q8=E(lSw6DLloc5I3%v*{-ST&@)>B+231nG@mpS*TVhI ztSgM-AvtN*u}gN>NT#4vmQFxG~kBzQR=Tl`mF-MSNQ-BSL2aAxU-1X!jFv9cyE z*)}4Ph&RiX*W|#S8G>DkB zmRG966F9dPNc6k6Dus2$C@O+EFV-kjnE@6eZol!UPa+Cj__ah`1Eh@_Jr3`xX384M zxr!`nDyf!*oIJk{?R=?vx=>(R^moOYvZlm&Bv|g})J)jJ6PXdMoU|{=4EquDU9Y^n z^RvG(P$GE6ivB{cQOH%iz%N-5j|~Rv!a4nPIqx?(UJG6p`Fgf84mm8kWZ;Ja(~a_L?fc7SDTPpKxc!n8QWWU$ko_1xeS^-~+|T9QCZ%na(B3G4 z^M5I?oOX!?e(XQ0ist7xVG3qc)pP$2|`*#MgTc zWB++ORmkwCr&7>CxUD6w6Stv&scGLW-k+Sj(w(*QGeAv$r5t}PWSzoh>L-<2vZyg8 z)fHwTQkh&H!!&E;#mURgh8uM+DTf^t{E;}ErTnykz{O{L>VA zWw)2RD??3ym#N&t zgEmHTJ`Z@Optf=)f{V5i5=HPvLvHy8z+4Z&{VNz4T*V{KAsSR?Pi_DZsr#z!atTI~ z11BSUyZb_dZ>&yssAdb%Uv7^E#|$4D!Z~`L?LzWE058d=F$*b&#=sRGt5-pgMR9#+ za0KhW1LQB}B6Wh>K7u02O43s}dCl#rQza?&!+pkl2PB$aakHm9er;OyhkZ%~BOxAl@TH>^XcU77jwW~`~| zwK!If$wOrgEVqVI+X5gPHfJ^60AMApTS-ZA1G9l095S@}MFkc-GAFiLYZn_Z(`q1* zO(6iio=VGIGPPf<$Yese|9HissFnIFXtm32ahGdXH^!>?u~ix6ff4%NJ!as-vFY)<{-#701$SkSzEV&ol^b-z{al~l2&nL zPLfF7{HFd>E@T}0#tU}M%qCv1LoXf=?znKFN-yW%Z-aM@`A%uO3_|FjF)SXk4oDD0*F>r3mn7Y_jM8$s4CRL0aBO5|3-!@h->s;` z!rWiUVD7eNHFltl06h!%wntJTv1Np2EK?(7tcQf}%y4Vy%C`VvJG|Dtt4;KueUi`V z){wCh(^LLGb>n|&+WpCiCHBpFmwN`K{6pB3z}x%`50mwdN@O|0s!X=X?=g&uN6m0Gr852LTk2jsF{p|;)o0nq)PBp>zP_NNd>bPo7HGI=yy?W-LB{3 zb}dR>^_T!KGZMt9LaG^zYKOW=3iltcI4aNeAHjM`y!GNux0=;GHc$KP(5HR(DZ5Qu zqeDN;woP`MXz1BJcHJ8vn41stzgTHuxJG|&=*j$ooJxZD!wyV|Nyh^Bf869Xv3cD4 zKY(cPpT0#k0s9SjIOVJ7V%B9`siff6lOdV9c4aTvZ5A_Zr=9X0B9e0B!{Y2sY@%KjaDC371?_fBOeh!$#$#@=> zn=1yi)nInBnUOxJPwqFNJY9@0pWeNF{qpJK8`sXq{cgRSO}CrGtM#hdh%!|}+){s& z7C_4kpw(Pk&If7>4SsR5l0t2$?)$E8;Hfc7_g3X?NAF1k=-J;9jtJM~7}5FS*^|c) z@87y{^>W-t6S^DVZ`6OOz!NnYmk}XGjZ{Om1S5o6j_QTO_>FJfK(La2HI`uOWmL=6 z=G}%-L(%x-59_7bUiAvlCFQ`-<%<=KaN>f99|AwvKLIk@`bUeiPH7oaE}qHswDXIL zfqhAjA&29q_yi_H-ywj}Le>q=fkS3&^|W?LvT81t2bdCX=p?3vO8L~%Jo7rIDCwn9 z%?}2AczXZVajv)iQ-6G#sCWS)d-wW)y0fqapZej|#=KBwhu*$=$Xw2D>m7Sm4c4Vj4BJ`8=pr0~iJTdtU6Qm;e{4_DqE5C8~3|DLvV_7naH^;Uu%-2iEWWJ!n0JyB_i)n4yWA&O)Z4CtI$pcsg0;+mQ=8&@uR3rsdAZ$QimYwbn70eT%fEN7BNGbT*rvhW#b~rLk&H{Od0Ze z2@)>WfBqogiC9Vw)^LPeIY(C|WUvHBIa)2zq|)05&Z!ScvqaZJ*69-Sd3*C6*-q3Q zz!RsoFSSL|>-%y+qh1Y;Hp}(0hG{5vNqB~)r}tj01$c!gbX$S zastGgAgC<735uWHH^B_cNiPn&3B$B{Zo*{m-X{g0v#+H-iNWYHvovFcaPG>56dx!| z!sXW}CKx&=qLG8ZsW$5Ik57AUJO*?&?iz5s_mmoaw8i-LOog zI3Hp@ucnmBRL(QxRRP|lMf?aODAEx=r3K|0KI##PC&TPy@T+;^23h9_E2Q*WoR!pQ zt@S3;BGg|t-cPmGN~h=A0ssI&?Q0IVPd@tykOB(ROg0;r3|BShVPcfdA%&TRl~blH zIlOY^$!8G5q7EYyn;3Rc9Gvvb45E3(ic^=1n}<)l1c?d_Fld4n`;CU66`??1eL6LI zWdyxy{kk+6o*-O^Q^4!zFl>30`hb-^ZQU2)wTn^ilnn@UwS>Se1_ zPCMt4Ywj7O)D6k*7_3aBU3NNdhwV<_U<7+?#(%zOsHl-}D^Qjb+G?8=VR(}G6(~~Z znU%rephMPKk15P-v&^wS3=pXoCc;7pgpF_zF0d>#(+mgD*z&wmB3HS9>55fZEAMK_SDL>*!B8@EaD58ui>S&_X)REZj#u;{d zXxGMume%Hm#;Wp=k@Y^2NNadIKrD`v1y&SRWbg%RgQO^*&05G7>D7eyY6xwYOb2vu zefdVV=&)JdikEy9Y(#s*{X|Rn#<$S@hL*5izBZAEZ}^MSuM6x|Sdw{_8(wk_Rt55E z0jdKvPy?+JC?Wqc5!pu0HgB`dA1Q3R4+>ByEk^w5G}=fYJ!AxBq|t06@MgA=;2dxE zh?F?O$tkL!P07gq|6Juq0_e0Ip&SNo*%l^jsu7q0ZMQ>=gfY#)6K4NVFp{>7=|8EN fHmRAE%@9lgTlYesPa$bJd%3;-wc~?$L5Kkc)}mHU diff --git a/images/ALCBejing-Avatar.png b/images/ALCBejing-Avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..23515f9294ff27dc008239ba6cda10158028e127 GIT binary patch literal 157986 zcmaHzRZv`A7p7?%cMtB+xCfWUy^-MV8Z<})!QEYhySsfzaMy-Fg1bY|BsjxgHFG-` z=W3riwX61C_PlGIXmyA@CK@Rk92^{`qJoSj92_w0e-8>092_7)ajx!t0l`*MRT2)a zDG~kI91#u<45ug~sRad`Qy_K{%6gB>3uqP>rlFz1XY)@^LQyTn_72jL z8{!2WmpkmH5)Jc~Vcf6ZT(sn^r!u@$#@OM%^X^`(b!hx_7Tc(9uvXSf)n$vg<#JboKT_IL*P^o;ygdDp42{GX z+OD)u^$vA|jdwPcX!Jm@OG!5-(`#^_o2-ZqSkaH7aq9@28Tph+K2`Wn$^uM+QaOwb zC{%*sA3W__WMYZlq#tg+;~)(1jQ;?d6#>A~t|FbU!s%6=`qsf%uWKDHeOLsn`k7S> z&<8&9JVwm>nK=Cc3w_^zzc*5EcB$zmq8#ONg}$_FAwJ&ywl_Sn%9AC)biwC6uk=_SnP21LJY;?gX4}FUq5O zim=%4!_5t2l6*$)#W0RA-&R}@@qff1B@~Nbvl&fgRE?3tpc-WRl2WxEWkXnj$UrEW z>3RGMaX`2EdT+F_(`|(lV_SA1X$SL}MY}pEgVR*81#5wv|0}()_is*TA!F*vg0$>% zb5PxnsN(egklo27s35kPt9W*#n;QwF=4;M1o!Fn<5oNpi?IOvNP>f>tCg`ua&}LXw z<&_tLXDYuk<+g66y5!w&5f|jxPo)aM^~T*qUzel+#5nN%Q=}tUkRX!10z5ilZ62ne za<|hTR2Xi(Q>*{of)E0ok+dVMy!r7`7AG^ovR5PU$XxU*Ir53uNB?>f^13XNL)A2Y zo0Ss+Tm(-y3(Y5JWD-3 zU2;7BQT54gvj_3`aVyZ!%;3YGFf6Hb9omjOlw>WK`1Qsvg{!C2iOv8uoFrv1de_V- z8Kh{6kdMf#`;F~Q@*7_!CcR6uGqJ8DN%QB(pi~2 ztF@4{c*QJ)k?0{2X}B}QUyje3n_Ou35s>MP3J~7$Ts57`mL99PG1Biln$O|@-zoK-exj(TA@|tsD@)Gx@ zMK7n;rZQpG(?!SL>Z#Gt8E}tH!zIME5Z~NzQ8uh6K9C7G$!+-yWU`X#gA5|=7fL08 z$ak3A3)WfGV$EX@cZ=?$qYizTL>{Z40+NWa&Nv&T3fUdI9`y?44Cu#ScKXd`d)uIh z;71Ffl*zjjaZCP<>R+SKcqd~3mtyygzi$4Ek9(?qu;8}YkkR+AB$&kGZxInY7%~J_ z>yQ7i989038Osnfu3@E4m)uk5RyilAi+f8;Xql0bCpn~U7hQks20~73i}9Zh0;b?&nf-*7+<8LQs%l8E4$aCypXg$^;N-aEA0QhqqXHQ2#RrZ#!jjHyNZy zxfBt$bh5u|v$=^oO(jvIQx(Ue!b$@WE3V6KMpbT#jD4Ar~;fyFQ)Ra`x*6^=-FpPh6 z15$1G4c25i{`azDF9jhFmY`lSYY2Fm(t<&)VS_xRf- z6;mV(@Mx8E|2Ps(jV@vQc%sfw$Z0k?@Z>(-DjQG)7 zO(dhh8q5@nFMx&A^tIYSg|Fo8^+_!gG2)2iZ7c9?X#lOEDVVCs`}aEPc_KA)7Rlyp zF;xnGg1o>3k$k$Sgk3jWTY-@@D!T^loWwu!5PN=;ZIU>|trlI=ykO7#ajAZvMw_s| zY$T&u33*2_G28RP6ITV!Qq21`$bUao#5zBc zhbv{M4fRxYZsd{IYarRyGwM?KG)gxW?+M z1o^f%O_+GE-!|KpxFY8{@8W%%tj^UNWxg`AY#))DLQcsa7PSTF%XJd?0vklXdb zQ+mzv`|A=eueWxWku2tyrsA|Jr*#IWk2~5mR42wzGhj-yNwSF7IiFT>J^yVXORo6W z0bJ$wdeHv9$2q1M*Y*D4ay-TyPElWRThX^vQOmULkG&4 zZa=O+rC&EvUt%ytmIVJ~yogqZ?%XX=$ElRs%)0SxOEs1P0Kt$U!1o?%E14W>Mz5XX zmSno}lGUIrj(}#2s40t~#f7L=K!-!>mTX(ykJ^7-6ycwbrzI*d7g>ET;8s~+oDn6k z+~ZHxYGHE>yp?n6dN8j7`4694Vp+n*$U3iX>Y^Za0xM|4x9-YnqF?t>CbQ|}!Cc*b zlRj-ZujGLb@YwSFeXg>5E}iY+pve?BitpgpO!dX`c+an|%UIFBdVJ7VTOZ^vu22Hr zoKB+gK@c0r=t6@&h4;YlhM_kC4X*EhU;~<8nI=CuAt4$}6pWY9f>}JJM4wAX8bJ|o zEozF@M2daQ8cQKf=uBp)0ckP;%H|qmbAz6J1v*Go3px(AS-V~eE&VzB3qLM3ndBTT8Bz0we2jjiwLeB>FAB85*=7rE5d5RB11sLSBzzms}Eo`des&o zT7yyZo$L3fvO0yV3=vpW8YsjslBaYoS1RV^7nOnXz->?+#`uus!R5osreTmQ`Vp!R z?Z(@{3C@19Nmka{oGrGK>=8qN1HEeYIQ2qr_hTCy5*&;4a1f6vxA@aJdQ7Mfo(FcQ zGV!;okTj45?L8Db_wN+1XT-jw1~fKqjp&gY#gY)0yO0nQ=FUa*Ovq`%78Q~=HXQ^< z&Sx=4xe+p6i*kNX=fAW3FJpy(X#>VBIqx14{eZ zpbIin`3%O*EyU%uowY(M5cYI17IGHqQo+XK%-duiE|c{j1R8nZzxe6{`-kGxNs>U= ztOe`0oIl<-SG%0dVJz&i6Vfa6qg=kCaIU~9e1g@VsQSuIb~XO2LwziT3KizP7-ZwZ zq(h>-)rsf&h=lcSiX_Ez@niysCJmy%&99wFlWFRZW^f>FjxW39>%@fq?>s3Y)a+?IB zNRx&)P3q`)+mE^|4q$51zG3R=$+n}noR6sU5ve`3A+z`*o}XP18(1TG#b%65kf#;- zU?x>8AuDIieh>ELY*rX{-qdtwCyKIT9v8Yl3$B?->WNugh!6pdmQ66HsCz4@Sd zrAB10-|N9hnC09mT%q^?mo!v3)1-S6Nz(YZMZST46VjwZwQ@;;yJ+L2$TtPOmd=4F zn|{}7F)aJGkCmkZ6M_+LXVI9ODc7N!ai9&|oB^rqPuK{gI`PB_CUoYtcjGLXJiAx8 zC14I`Gj2FDO$Cl-o%ws+GphYxL2SY{a9KY!t71MKrw%Tl66Uj#H=poro}7i;T)5FoyZbE13Fu5IYcK z)Gf@mzfyRLE9!T4p`MG=TZfP30*x!4t9SF~U*G+0;jGu8e=~_T>ne@t+CQ%t=^!aX zaXC4DOx^R+m`=qoIZGWXOOM??*{^xn=K}ytkZN1c#^4?VMfIK@Rg4EO9=!^qsCir% zu4<&?a1ZDBMPQIFSA$wo^wJEsD|n< zM|Te}JSwZSnenwrA{&uSmwzcc665!zFpbhFT9PC;ius{1ZA3ur^-f}FrIl!wqAZV1 zAYX|D)ZCKKL-7+@NS=zivt}cB1dJ5LZqm%BkV;7NXUI>i`D*$`C0D~hnsi0LSv4jYUO{{=gntvFMsKv6~^P) zZRmTA5YK(CET9c{BmIE8z>M8-ZH>u9mlzemW?IqD<^5Y;nZgPIC)o27fc80WaQf9N z;S-+GS6m=`a}q8E2fgq_v+|BYbU2o#!=KJ53G&kkg0X+jf7w>eH27Q8al`eatMkttN=fO2yC)x z!hkK!oPR2K@<`TCpI5M0faASr-Ls>k={&q528Z##f&=s zlz7c#y%q%?jNvxgB}QE)ZCofJM3k39*tLPDkBMpCefyQUSRu5g5oJjS|0$ma-%j2@ z7Ty#Xiu^}l{dF?(Fq4U!Hp!MG#bkf-!`?M(@IgV9W|^j@o3$K*y`A(ZEZ}$%a9O{ z%eAQelB5Dr@6}@oA*&9;4K}$TPANKWP>pF{05!G*joaVz73w^2(O+ycZmRJidmikg zA$%;991-t&EZez!F}t0?aP?`7(ts>DFP=6h>-w;NYu;UNOLs09t=N>JP*ahmx7Qw@ zTMTO(lK0?)LC|2*D~u9x+wQVOIla~w7|4Z%i%~K~j|YO}Qfp!tgVgddWE70Z$JF5T zTJ2y!gy6SA?2Zt3wP8$D1M;(c^I!V!IK)P)#YWW_eH7}IFP}(xP^@2vuav`Q50`nz z|JY7Uc^&v_e%Wp@(7hXsO`_ibv{KxsR=X{w<`3w#XD67+7b8n&HzX=kD-hS?AO#4& zrvBMo!ojN1u>mXKShzqE{LYZcCJ1ZK=xrOW@kHk4~&z^ z8{M6Ek`Y@|*zJ93Lc?jhR^-~U*zS7v>pN1qdq+Lqd;V?p3lPZ z&F$B*83Upc$aew*ig)zwf1NDVJ2~oT=r955bWB#L`GR^lt@9gpUsEQE`D; z=hRNr$$03I!cy;dsJ+vJwdkk5)lKG2N-cORDI;y&7T~fSOro&Cqf4MeK|cM=RL%%S zoDG;K*#I}h3#LRJG}RhShL;sbn+oU^hVoRpiea(f*L$417B4^2Tqq|gnE%%Sp_oG_ zQw*J;nvI2B_>_VQSz@?hnR^+Sf5O(|4uz;vo$?A{PZD}k_5sMcgp73z3PT4AxNH(^ z9&)Ip0gtPZQ_v2s1ZEiHK}t2=mjQqS`IU7>`5T0ttEzwRgaGSYVPTmnXHtbIWO^R% zYJ|=zySmenlBwFY5+yeS5W{NN-s;i2tsMzG5lWIL10G2ROcUQ))&Yo4;gBZ+L=OgJ zK|G_tuP9e&8L$x`+x1&Lv@ou}G-c~+iExNST;Sn!cK?EZv+zg^p)BU$X`Ef4TIe>fo;XBPtg?ma(%y-JR_)RbZ|h zti&?Rn!5%^2Mrr(D=KD+yNBuagXwf+z=L%IfP66&o=BCLYezg&W|{x7Py@E?2|7u= z_u8Ap5Okf#@iTG~Iw64ZdZN=37=xn1 zGko3m_DTlp_u;|nM4RBJYMvM zTkv9RQkTk?pTv-3T%-{3l-&=IVQO(eq5qyYxx!D~BV1dLJT^FRk=--(fg6KpvwDzt z_B`821X!A1H`q|2P}?$5 zM-U!!4IxE#7rL5_h&39JD65a4i0%_WliPVr_TY4*A`nb)uPFI56VhTu6g&WxqO_C6 z(Z!fkv)FA`Q;{d)B)HNM9^gs##2Wz^9SawtH=zwuj?)oHuU{g3Pz&jw$>Bc?=Dj`p z;WO1bXGR+?n97HtMt~Q=Pnni{z!(3{zZdkUTgw3UqkQQI*HqJ^0CJ-LVM3XuY8}*a zdvYF3K?da>C7W(5%^T=e72{$PeS7>{K_VTJ@q_ zW)6Y{!3>lXxR@ zI6n=`*a4=q%*k^_LA!2@iF#jUjgyD<5eaOj<@XM(LXr=)GcrzMkpZ#jzR)Q=< zSgq_@X=xTTUGUFvAqLE6>m#vDBDM_ovMWL4RBPL;a!;5e{3p~8Pk}BaOmDa-7g=rB zmtw48xZ^2dgj`S668j4pmW;ZGgw}@=g)}@(7Ao&Vae?h~uCvELSYjUmq3t zC8$J*LcX(n`4F(sF6#9trMEbQRwyxlrstIYw;(WIHk;=J^s~iwDk7mka6k(45K(M? znz-}hHppx!gG;m#Rg;dk&ai`8^ELXf-yZrKinM|h8FmbZNtXh+u|yKs9Q)_L(&Qb@ z9Z4V+8^yeIm1-5#KV?(EN&|lkels^iIR|OwUeQXkA_+T{CJ8z4XMK}yMXF#%!+fp& zfvG@4uTD%FOyHW~Q+ts^UCi-*wt#sm2YU`29iv0hVL!qGb@4NIZW;2f8V#}J{zFE4 z?FMJ?o%kx0dM{?qdzEM@0W`_OdsZHlQHGqd7UR;^0rJzZ}diq_3_h4}Ri@I}fmiUW?e3})%^e5BVhX^eG zc5ETuup@KR^G^g#>*5}f)O)Pf*lmoYCFuS5eEH^C(ds;Lcly!szds#(W@kF=^S5)| zBJ88QlnVZPo$bY};kkf`pGWd}L?!%t)no)_-f*e3p0vO^bsIg>BwNw*T}Ze9Z~mv% zpg!BYYjuzAQJ}9hX+n79jhSvixdh$uV%#~;&eF2e9>8>gtcko<)QHGg?GtwCzsA%{ zYfe^!yH!A|wkw|!De`QYr9VpJSuouiNnlvb0#LaF8H-Zpn}E|!{tciq0Id!^PL~B@;Q?V5W3{+ate1^_%ML-rU}|>2AamaMel|Bd%e^qR0?Le z;;*W5B@?d_W7#(A(^<7N}Y82S`c&nZa_iXu3u_nA=J z2uBSdoV?D~wyC_@#jv*U=@G$>=FZ|JsNnvMZgt2gB5c>jfn-(ih|luMF5jgFyWx9LjGj(KJ}%B9E{NlDM)} zC|IC+MOmG#P~5flAWp_3kg6{TA+Hvcfu4m%oFMe&*Lt4WTx~A(IJhpmpgotqUMz z+Up@MKzrDizurJUdAUxq*JXEt()xqa5Htu>? z>`&M7wLX<_1%8A=KWe;Au(c>qYfDGA?CH!4A%1P-?~VdMlQ6gJ#v<^ zFU*}_Jg(lD&$OT3QZ$KEQr5OlcV^SBP}-oPSs3OhITXR#DGSdvIvOg-j1tXxLkb5a z;bar81WeEpOEk?r`%(1RSj#2zG)mIY)0GB5h56|0xe7Pv3Z}Cv+2}A;|M}68&R8{1 z=5wb0wnf5^n$$8ET@WPjF-{5N<)szB&XQTiv>1oi$+a40IXVF3XPXf>OrHNfe)5G0 z+Cx)Dc?sNkigi0=m=_sf>5L8mI2+GleG8EAYn^(dvOW8B92jn|9I73uC=QQo8m23c z`GC~le?lp85rabGr5w)IqRSk5SL&-!K(X8IiCrox;k$oP&fuV%KpVLbL|F`yTBi?Q zt~UmSB@64?0CTgiuN(;iF5fRc zug~knh?_p8qien?6-Dlq}B9S~Mv3-&Z;eN@z7tegYF6Kp-PHzt&>}Y;EI) z`KxK@Nd-aY(6G$`sih8K@1+tGkDAsdUp@%2cuIVQ5*kB{y*H|uB95bNFIppq_H%Z} ztc(>`uu2kxQ9(QsgHnN!eUGcoilH-ZCy0g^Gtje~C*!B-8lr6JV2lFM3&ZJg9j1yuS%6p-mb@Am~i0_QO65lSyelfmRZC z=P=rtw86W9a?pW*pISX^ugz+ZY-!|4;A$8V{myjJ8tQ|}>e%CKETSBp$!&>b4z1b> zcJ0qoVbZO~2$3);Y!ET-b`}ef5a`VV#VUxaNHu22_YZPxu2SQ6(Z_w>2$w6O2S&xV zgZ0hr#G9Dei+M#JQ@&J1lC}*o@skY2cM&ja{vy&hL_&bz(#4z^TD|_eh&b0q(lPo> zhJ*676Jk+=_E_{hj{8?ffbAQ;t*aHdllE@pt4|YoGDsc>4MeT^6@49)PX~k#KAibx z@7-G-Zb$FR=XyVmYZLux51=uIgg^^?{3p56EQSeFFtgkK)wCC3^nUk>l`v4kguPFL z3=GJlxgD3;;4l$*5^mR_vjq}Vc|u?0#uiyOdmbx!DCc$GMdJ*COZ0ZRib8eGD#3&T zFj=Jk(_cih37#lU{bqzZy(aij#Db5G%RihA{2FJ=17762GvFf2o1E78jW^#h(0rHY zS%?p@?P9qq;4#Uh2ijC0oWvI@g@cP!ADDvfS`l&*#;CtZn{q+-0 zWKe+>`O%Io+|^Fs<@cuql}!ncV|A{X5NskmT)c!h;CKikI*LNT-MiR6AT=`ubju+^ zf-|;T3=^!nWB!;f$45WK)KF&bGM>TyEg0#9CSov>#OG!oMtCrrXZY?)w{dAbxbw$N zkb?YAt17tAsx^k5lf3geLJ-Jh(!NW{?)Nto)vV4kpcESAfah9Doyhr{rFbhUKa*j*b5-a&GP224>#LqA5pg5hL?>hKkzuOcjDSN7}8t<4vuEN zeF(;_(K2@t{3CU!esxs`kS>aI-9LF?T*ADGKoNnF6pvi$tKFQXomo%N@`Tk!c^30@nL$__DPg zSuo7yi$n&j{)hh3?Cr9hoE# zzNd=x&5`tM*MGHmQqIddU_3BB*%7@hE(EHUX<~SC7|0M2J1Tp$_o>l96;-KelZ;NM-iJWIAi* zThKsa_`r*nqCh72sVZNmSu_Iz{k?8#_sg|uDz%p2*hYw)5WZrj??#D+&yDuUf|V#x zXOBq8Cs=lBN;G5L_{(0Hh)DBvISmd}{(lzy~4(yb2xH5aS&b6Z3L$z5V(}RttihOWbYi~<<{$L7` ze?QITgK)z^CC(ikD$Py3gD}?*RV%?%RwLS@vSd-|K$yq2O^ky!E1As466r-aD_$tj zEj8}$WU(Z`-!B_X{i9dj#pCu+^%HSLIBb>TYjkmOZpt-gz%P-V>Lth4RFsSel_J`B zN-Pu#af`I7xH)^jskK)7s?dR1xx{xrX|Ho71 zhb6rEN!Y3e&N%j%Pzx!X7rDMjvzD8e8ol^@F^_@>(Gx0K93B32C34vlkLKve>a(-i>xY6xQx2Ru7W4fpDd4n6&ICzPY|$^wxU<(>q-p5~_}FsQ zOPg>!@e-Ozvj}L@(wJxH6&H%^W#q>SC0d8{^nxSAd~Uo6c)h;D z@wx5FR7yYn3(rh>kKIto%_+_gU{%t-64nTOugAY+l~XNB&kg$ccMHm#2Ej#&Q~_ZD zPZy00xlC|%oEoB>J73Sj8j0|it-1*HMvKT8(2@3W!!0N3yONurm9wGU%rf-?+p3dS zcXo_No!3-_dt+)@!3yas$&xX_K(j3&n&*h1Ej(wW3`x7O!DnkT05V5dn4#Fje2urn z-JHZ*lD;{K?MX;IN}W8>?BgG@`JM-KkIHxSFG(kV401no{4iE)*kOWv#5a&K#;jU# z|NTKvjcm?-#Om6d$$Ky2w#swaMP6V38LeSbt`#Wd|Mv3FRJzS^87loB{;qKUXU^%z zN1Cu6P#9U9O#PyI9b1dQF877qmrehQcgf=*y6#TT*XAS%5n0%Lz`}TdE87!D#PPxB z=00Y-Is`Qve>5&Hs1;a4@zZiU=sS~Y4j(|+2Fa2;g}Xlto3W@weq{``#ZLZ)(jF`~ zm)LlZHBNdnwVJ;VbnE6>@Hj6O^On-yN`NXEws=t(R9-x#VqUbCnf%wrU@F+3zF*v7 zU`b9mhlF`rWFZ?{Nj*|_y|?UScR0PW?%shW=g4YYjG)tXMLy|(GBK1|h23C0F`pFv z=Lf1bQ*=GGn!TtAalS5OQ8ycs#YIEPyZY8GP&jMc{YR$5WlKljf2|d4TPV^}xRB4F zoB{T9_{n2g(K?L}3Oi74jGL%a-w@=ZvEgZwaJUGXB)q|7FbgV=KykCI!HK~DZNyE!ddb~N)19N zcN~FvR#Gf$!c8ROUiz`obIps-a+J+pln8#>Dp2rY&n$Uu_Jh?O*WjM~P;_~^&`#ws z_bO%*c6|YnHDnM*7@B_X|0w>e49nU?h^{s{EU`a%J0D4leZFuFBSWvW4g&@OD^%r$ zxo#JF*_@Bv*pA*nElI5MmEH}0L9|G-0uqjddEUS}diTFpRlzQbOv3RuypYs7?QqmR zOZ8kqH?8E@dEEJ+MO2L*OHeDFC{dg?s!AdUoy6dx zH8JvHy3azZl`CE2Dc|;RgebF_*wy6)Wsnd55)UM{5vU}OSrv_3m$P?qz)@o@=`ew zntStk>pR8d^?6HH_}yYVzA#~K+K)+^Z4vc@NkT<}JDB_@*no7ThYu|(s|hV%Pmq23 z+kl)gC$tHwvbjPz5=+%pgMHD?nc@F*chPY1_ic^K&mj|8*;MsgPb?b2_#8{~bjv{) zOLzr?6?1Y#(~xNx$IRH&-4ADFm|D$`3npFmr!=u=?44?#IU7~7lIK;U@XtwJQX)!#qAPCH;`?a6 z1DV8y#G`+g5<%rEFEZ5$4LzE~AAP%n2@-VsyLG4}KXq|j$K>IOPiQj8ai1A77cnU9 zpSjo+U#xjYg`92Ye*Y@F#%d$1v-X3cVD(4*6jY5Fltzfc`%#2PZGT+qm%f?pQr{<_ z*@L!(wAc?VZK?)8`RAQ#u@Hn<`3vnCNv);Bj{aM1@91#d}xb`v*fFcIFfUA3<9BmbJy><|lCqg;+B zq{2W}qXC7nvp2TMYBOodej$~SQMn+q zR-A-iO_V}}b-d`KuA%>(jkFl;3pz*p-vCj6AE6qSHSrvW5<0#8Chx5PKBv`+9v0%8 z8r_y3Uyq0~{7Ei`=oWGdm1(HcRANAe>e8VGk%T5?!`_!M zCmGhh=LyI5@@GAfhfVEF%-(nW2C+C={G@khpCBSbRPih3~o}KIAEyc5o_d{Kbhf=1?yYD@pAUn!Mm~dUDlYK| zw>$;)kzFnA&}y8wy^B9cF5{m3y&b|Pn_u@q50eQmb7@3?@Xhxqi2gpQa2BNIipbV6 z(7);AlfcO5(dBdkS2=8d@ja34y|(!B zUf-q-ptjif<9VK~3ZY2LSwR78bGX?Zasl~D12rhh;kIq8M+NTG2cFff-I zo$qM9tl0F#K@LJ))f8I$HWXHV)`o=8DEh_Ux$O*uJy{SYX<}CNatm{%3@kqOt_2UF zc(n?$zBLp=wtJpDiiNvNr*hNMrZ#oZTQZ3&n(m^x64paM5f_kxB_-)Z0G0b(5q$qw|kmjoZfl~v75315_ z5=@BUr+tocyBqtU*BXAqqPyUt!6RMlr@{MctcuOoQ@I>C2=A7>?Zr8s0?55y2K}cm zt8_D1RmXIK8u%_CO1c#y9Phk03;Pzvc?aw@?(DeHwiShlPaN}}Ii>L!W=J{Fwrh-Ukym;I}n_%i^6a0p9&ZlAj!}u@M3oFIIRNQ|$7?cNX}y%EfvEmD?t1!`nY9IQ`FF*!P0UMj$Q zLp^!A-U{v`ZSa21bdn{YI2}D%PlXR3wi#|R#UZ)$`{vTxA4#PVN$BU5R-npBX(=kLIzm*%FCo*amI^R{4!`KFrJ zTXYd6Ov9e&a5Qvhu15b~oa#{+vBIBJ?d-&gajMR00}e_t{jt~rYRWFZBg(|wg|GRk z{;PifB>^qWd%XHlFDhX`qA=f0lRqZoAP2pRbb?e}j#b{*zu#WjXbvFb_(`=0!<=HG z7D2Pv)&|QDjkVz%zhw=@h*L&uUE=jg^Zk}%{1f1Ye;>R&!SiWN?_t3H)@ZVgL6}%u zkJqHE8S3m-JjGKuYU9H`rZ`7fRsBi@7Z0f?&74uF%X*A$~V&8oqaZ-W&+JIxrg97=kXg zb=HX8cxklaRY36H4O1-I{XrM$O)dg{oLgUo=6cupANQ)ys%7-GlTbk{>33zHl*O<; zj{V~=r^WY=rQQ8B4dnewMNWnvzdfzd7w&Vg57Eg;?mKP+DuL{$b5-t8;-i2uhBy%T zJKZdZ6LHG6lz90_}F>LZP5Ec1)o*g%P zLMmCClKcDq*=bcc%65BP1Y3;86;C`0*IDT0Fw*($PPz0JemWY8P*E2~l1~>C@i;Gz zBT_~Ao!jZB_S!<=f7y!%+83fCBE^=x_#1N7jyjfP^i=QtGO2n{yf{R{i{y+Ytt~_~ ze!0v=(5@UEag;w5ibW|(kMPcac<(H}_ekowdXbn&%CK9w4xX>H6unnscCvq^-(ExK z(`$5b{Ru|KaiulpO#Gd2#RGN`@Org=5CK0VncVwlUMS|+46$%Cq?{mbxP#MYKWKm9 zh)Lz3YN?0tT3^=MEgF2zyLunb^29=MU-bm{e>|_f`~iEo_Sg=>Ii^E0I}pqrATF87 zk-D^B3Pp+%eSWWUk*yXqdTucOMKHCRaj~`G$7s!1BC|*BMF2x?t31HRFYE4Lbp*CF zBFu?Y5I&+TAxqlgz@U>_F^%8f&q(UhYIZ@5$>xVf`=@UD3v2C8^0F~Kw6Qipb9z5| zEeSEETjOL_wSNe_eV<`TnZ!Rq)D|%$;;RaQLmm&)#sQ z@;5DF69lf)I$0(NsjXNK3RRGPi%lIs`%J{2;W4f$26AX~}W(;}k zxjGMqiB_j0^QrsDz00BlCFhEwoV%TMi#?qXlpvl2Nqm0g3YBa;OcK$4ING5^T^gW9 zGKLfB)2*#xG*~zScf(sjm{xF`>>{S5nteJDd+kAt*f1BHOs*W$oSZYiu{q*j-5Qt3 zX*t+coLLZi3II}j)r)Dm<+u6P7v7LZ_`qyZAgTga-p%4YDP|LgM~5++6y}2 z0bx$NckKkt-}-DknafVJquRw@fo?ZGt}UvSbdW7)zA6rX0Vi#=f)LaaQW%8|{JL`9vlG)UwmX<#!ZzG6=nGK zMs1|*`Zv7*4f>M6K5-`Fu2vQGN`yL;?3iR3dts~W&(AfYPO#oJZ);fCP7UXA{6cTm z%={Nw21t80q{%I%;Z5nPq^T;Clt+B%-DIirDk!NLWwT2q4JnC~X#{6=8jLW25t>;~$UHDA6OjhZ|q%6_ZAdKKIIf!$cy2R8iOUD!Rv! zheGl99C#W3vrHuBiAT}_^D0qz9u7hZVMu+Lu03orcHD9dS2j0sf5u%#12ilRNy*n= zPoR@qGEUen{W=;~TVZX|CapJV zVbHCR8#qbLN)MGQz`g&y$1}1PnB)e&XX4xoGQ&Q}$4R2D44`|rIh-<;Dv9h10LZon z&u-7}mv9+vqpu7ra{5keWZAZrAlAJrBIy|tBgrb8o=zguZXuh2^P!NvW6zR4wTpz) z*4a|z+Hb81mx|Qpi!ka|{DY+Qh^N7wP1ly~v`mVF#{GeW%7q6ms(VPM$0>j7?k)1x zM($r|R{aXTNHJ9&_P*EJZ^%h%SKHbsxlj=r10a4no3|uiY+6FTQe7vW)TNN8%oI5z zdHV}y{}J=O$^oCAP(+LuB9Fl}cTJ=v2w~S*=YQ(dYNL6fK1JzNE|W@*K7ynHuzD5W zX1b+=MO^eTt8eL3G(J4OHeoZKp0-a~dyIK&dkziWb4jqPqjaHA1r`clnh*^Rx;z8c z@s_TkcqYNN8aYNs1WK_3UJK{}WSPs9_XYA}j&C@V&w|wH}@u=#@0wgAV zW7TSC$$u&fdWG)WX+w6_Sqt?3VFm$?u5C+V`|Jx|R)YhKn$cy4#UCI^Q z{4FL?GRFXs!ml_NFD1JeA_NUrqm1n^XY`tyI!$OkA}eROn(Uvb0EZ$HWsYWF4&oG0 znl@a)l?gQv6bvK`;y4b||KK&sXv_!0?52;CjdCg=FTq6YCL!DHOdvqJ&cGEN-nk=q zWQth4OSeI1q-|!$rtQm<7x&LR99>8_4HrAK%V!9GF4*tiX)uq?G&lw~`U@Y9m@v}I z^_aaeGdY=Qoq@KlXJuF3e@jovG1t?m!6%J7C9ON-LMeS0&G3`D_!OlP{w2WOH%OxNp7|1`o+6 ztZK?u=3=9hX@U@Fl+xL7@5u-$LLmjqZ%JcP&G}p+q^P)Tpnjzju9w;;vA~S_8|L~OH#cxUbGthu4&-um9VIF|5=)k-OECQ| zmg#UM(78sbU97gbY2N!h-@CQGt7Te!0WZ{8^9|ZHM6`a^<8rF~Rj~T{$M)fMyY0~KA zv2s3dv*8MU3d34yIo(yH{(t`hu$8}(N6Khvx=|qiMTd+I2OX%+9bIcQm)<^P-8O94 zEa5c*U}azrj?{V$y|+T)obxxK*|=7dQ>_MXs38S-ir4A}IQHYv1cdBLMz_+sY<*{- zUny7pHeW0o3m^Ed<4Mjlz0by!ed%}Udm(aK@8kw!i)Knr=X~H%q_QbYr+sVYq#1q@j#I`lb#I}uzZQHhOY`^>MUb}yDrMmm{ zsXF!4tp^|>)RQH5Dn zyq`p+)XPK%M#RKq+dlo)U4T?>fCareJe;oXOF#u5J_6VSeeU1y2KzF9gp%!K_MdE` zNWcQ1l|(^QPAFxTn}`-~xKsFq ztCpK42cvDmF}C~VaE9n!O>l0(-zUl>Ga%4S)RTZSqO7O%^jsr|0w|lr*ZW;;mAqO* z4xZ0buS}k7D%2}Pv0pNHd&%)PubW8tQ6hwxA5a?PNyMTd-w@nt(daaou2F*9XA5PZ zdO)(ByY>C`$?))z$_`KJ*oAdM5U@6&RpBlVvhN1fj_1Um24zEf3G(9j&_w^h zoAJwlB$1~ou7-9N0~=*Wau7M7iAIVt7m^1wWL=ekR{3lHcPKpyZC)5vfaF6aEV=nX$l7#RqshmxODG!AEKjMnqar>4LS<>Aj{#u1}~Bm_n3tMIey1 z571#g=Y{q;4Z_arlz2~XcyT59TZwG}q`d(jd0?FgKbJZOxGXHy2=y?a@0nq~$SJXh z1(;(Ao3#d5%J@FDMc}3!8!vZ9GjX}KS2(uIwSr#D`iX27KL>Ck<083o12~xek1!h| zu{Tr<@KY!j$6WMD>J!S~IEdg5{&T$|IGz8OjxfF)iBfgc_S{1PyqKDRKXBG$%R%f^ zc>8GoR8%K}kSQCcm;MiPr6D99p@~DKRn*|(q5WG;i7a*+ct0>E+sBPoOG;ZlVD>Dx zDmnhc_DR+KVW=prz?u+vHRucc(-MCELnRk-wb?Gzk?*ZSBw|N_W;ZAe!Snt+@IQw7 za}hot2aQ1+x?`@y088pTt0cA&Rf6Kzx|K#=;*R+TLnd!nz>svy&@2paFhpq=8J|+~ zW|6_TAEgbRX*^qMcq3Va4PPz#Epxx_Gq&rHq2x{1#6qu8L#40Z#Y?n8b>g zjL&9z|6^leB`9mgtCCaK?1lx4(}gYEFwFIA6+4=Mbuo@GowYmWq|vJD?cogHsvP?) z11Tg+_sL5<5(b@ zj+dFAnk+NB?1`so<*^7++kKhI&|SkVDja(i?|lF!Gf>xOqT-} z)6H8GJw*Oyfv>-RTd0wM{Ep=pc+E2^t_snCxn5IprbS<8zhbL7wU9vF-e`imkFc04 z5(eZV?5N~)qrFX(?{d7~Mr=gaYKboVgp3X=>|eCTc&^Yx#)Ls#O{O9php66DEE*5Si??0!i1;ffj0_0Nnvr?to)?=NRP+!uwtf1v|MLGS!4aJ&***EFO#Z!jQd02>Xg=PnxLmrxN z)AP~M>^&A2v2+Hg6`^p^%a4L{k?{3DNEyGynvALEn2f1i3l-d*Y$CZdMh2PHnKfVd zncgp1mg`{9X3BwTlWpUtw`zxnYJ=O&PkiomDjM~&ux-Sm8v`Cf5&nyD1s*R}BaGEf?@$9sq`BOk zkAx;iAubW*n4iWFKPf95Q~8cdKdNZ!1PrU?QTq0{?nP|5^xK*$gYl5mmrjlNLTL4> ztaCuxl{#>6*h&QJnN=!(VF%``V~1Y$UU4m=y#pBp`2B&<6~V!Qo(}rl3=D7&s2KrA zeneX1DN3?BD@nL`H-NavWrly??m>-W(GF2{wf3#3z@$zzw4kS#a!hprb580H1p-Zx z+;+Ed#1B8EZ&oQXV<}t?BsNBDZ8Px1*)i>K4P^ z*P$Q<5zSYek0g$8UIhH3iGw}Rd{F0``L05Qe3{*c#;QBF2V>BW39szWlQ8ZQN`>8G z;V9TYyqRu9MG1^+jNK~}9n8Uw=DwZ3zrZ0l#}M#iPz6e0R)P3f$$xo-6h1r0j-=B= z>cn>~X?Uo0aAW%j)<0{gje>pCn~3qqC0mpaI=bB#mW;te|M@f^gZa^gKFybMhxjtVb z2Yv#qRU`)EjIY|a9OI}lg(CTndA~0%lQ@?Ee1r;3?FvK>e!Bg;?>{>|9%v+-K2A6# z?+5G?*(%O3wwbWF4NG#3pRb8S_!w~`{r^p|jN>7RZB#vEgJR@7Z%{2ul13;s1wHA!ZdRIkxlDgIX)y zdB+t$O1B$16I^gSE##axHqjb!xc<>MI_*vm)wj8byVe6vN~j?$%-4N70!nLi~3~GOPz-U5+W|Vxs)Yb4HlFo~fK4*ST579^57~ zxIv2*??U=$z+1fEI07JUDl`qz?`nkw(?VDA(2^JFC(1lBokEaAd*rJVuZOO zy9`Hd%_XawRXqm?8K zzopKf7A`G@%A2y-ta-W}?V9%&t*EzXVzjdszvlH*rixdwX$8OD;pA!Dn|$@!f;lA5 zyMi$mS8g#nXq5^ig3J`m6^vK5iTh?CE`n_FwkN;e-e&j*hU5Un^qyhqk-m*G2Up!% zk1FN;Ee%UOw(_s=GCla(2RD~rcFs6|D|=qD%fL>I$!u0Za^crztxcV-w+)Va#XoyJ z6QJ;qMnw9!rP>aIma6qQ=@cAEN}z2U%TyJEVGm@5YiDHr!QtH7CLv~w5K>OJ-tVtm z715e-Ptd+TJw>&c|7iS(6%C0II-1JH3@G&fk>#8k(O@MXmQ*D20~^QGPE3^r0dE?y zQ0mVwiHadmj1X_8cV%R0bIi&41%@ntzl+0uY=KvE8XmXfIQkh!D@wXf8`t6a#Jvc{wOcfy72s^%1_?(;La2}$ z0vxr>K}>Y5lbg90pbAGb?LPy8SJCw!Ih#0^a9++=wurGNd0;dwSR1bXXyIpxAUNuK z$QygC+pBg)-C3HoHtnxlAU^qa3oBPdsuat;sb~#0>xG|gSb~jaPM7XFh^u<}HLg0- z7^V)H3@VFZy6CG+7IZ!v3e3Oz$^{xmg=2^Me0`u<7I;S%Hp_yMKTrM?nlU`Vxj}Aqb5?a}*ZsmDI=!zI^4cug;Lhe`97>W{-%S!HIrl4%lOWoGREdCh{q2964*1QtB`60)WFtO zV(1t#hhx*&+?T?id9=y-bLSA7?(eUr4M;&ndND|sPrfTuuw~vypz2;L(m84*IF*^T zfJQeW5y)HDI|^;f-G<72t20R6HK;w`UR#hI^C7|tqVc$)y?u7dXtXL<~wOJ z{B`M#>F+s5+gvD!7$4ML4?c}#Gs^y0OvLEI5YR0jPE4EC25fe#Rjh-luY?#n7Z*h; z>zSo#`T0zK@cLOxffS7Rq8!pb! zB?mf}=Gf$Y!$xaa_gd3E(rd+(BYJ@|TZF1F0Xz0j;bhFRpat{;62}>ve%PUKFvHb4 zK4t=+)la$Oeh`0d6@riiHUA?&`^bb$Z$sd-!{b7=d*3lwCi!}8Pa!~oZ+x{p3&jmR zUimh%gq9y%8-l+rBbZJyIW0Cr)&YnC`~J#^eJjI)nnH`$fb{*xljY_p$&qibt?hE9 zJS4AO%`f&wIMT*G(+>iU@s-F<>{bdua50_*iI7%($(v#=zF58GcQ~O(6p7(y#!b?Y zDp~1_=SC(By!@X z|EGS45n>-}V}99F=-(QMZlXS8F~}DG5>!wyX&q&2V1_&g%#Wua8c*S0BlKGD zhzApIpqZ62eQ@85<6xc>*|G7e4Gfk~mXPW@*`@!Ex>e_|-LCSJpk|m;Gylx@q~_Yd zRa;NN?>1Rrt~r&zGw7+gEy$dXv8Nj}bvI3_?c0jVO2yMnl=HG9UTr>U!K}c$OQ|c) zH^Qj{KVMGY-|2s>Yu`z9;Ih%?_<8_VvVrb8RQF zanawx7lKso!-)qrB}f(E?F+PzeU51aK_Tq*$1GK?Y~g)}a&t#62+4QxASnq-MG-d# z5LzgN1ntzmG=w{mTs6Kby;scN^moSxh7eavw*d!Ed4KcEJt#I~G6i!_=DKPJ5SzPz z0|9U-PzSfze%FUYN47{ulP0ndPaZ^e5orSj5k=0;*enxOmkpwf-g9|<3iQo2Krn5Y z7-W4_IB*AjNL`p_^^spCqApNf!^+thb9kxisF(JSMfd)R5hjBmX<;0H56EJXK;X2W zp?k}pV<^kPi9zr|b-29g)wqdD_MSw2b8G1@s?!owOO@Nys?`?eg||J~xLQ%6f_O$^ zR)aix3uTgX(P`C3PGzB{e$`Zh<)9ojSdD~OEd3b?sReQ&ect1?Ky8tDwSB>GXnKd; z+Uzt{%3K5_!e8k$s2Bc4zTe!deXl4>9$;_U4c*zMo=4^REu`=KwAsL>z#{@}FH`tXy^ zWK-a05dOEJLxMOJnKco@I4Si#mvdR(0RVCYopin3zp5IhaZ*h$M18#A?EV|KQg4Df zX!OwF=GsAp{2B(Y#K*a_ijj3p;l4HVcpFS=Wj9N$&$d|U$!PH5Key)Kr3Cp`FzejM z>}0;wTL^L)1YwDFPe>gSQDMiG5|2LCb#2edlqqWgb@Ba$dj0)~qt*2&D_ab9_-Bsw zcW1{hZs(JVk1I3Nq%>|re9P(b2JEl|7T(9pg*L+1qikQgmp)04MNW}rGP=7CkK#wo zLZn9XjDhu87|kDQ?k`~v*)_de|GL+B{s6v>;L zQPJErwYcAflw@ePDAL4I&Iiw_yNeT#m~j(f823Bw!J#Gx_sx}lnB2fwK#7ildvT>= z$CRR`5#NsLFLSH51&NY%UkNILuG3;^1#EfvORa4-tJo|loN4q9gFee4(!FSQy=mCn zKO(?;?${kEv}q8nw@)?T=2n6}aT3cWE+f1(XxR(t&v<*;*HXUsKyGz@K*H81c}K#a z#*q8np!SQxsr&H1_7GA(2QH ztqw~f-DR5V`hN90$ww>YW9PdO82Hgc^e@|ZZMZ0&*V`Wrtg)mUxHV7(^mW?=7_f3L@&_^ zg_yPqfH5pS6tfwKJ;mq=_=V@=zwZA5xn=n-Q@xmbVDuP7DF2xfqMW7MXepOt)}JlBEh0HH-Kq+wq&T(x&W2`! z0D|e;u)wMl7q#7%tKJjsGE=R0)xA%A->?jlDOV?FA;%8+x>8~@CdZ17tN9&dpf6+rrObxtx< z!h6qQQsY2Vmq9=pl!u_k7Qv@`3HBGeEY&l)l!i-^CJ>HuH-EqvhrTh_{LSf!Dop}g zEsb3HNE^+lu}N3sS*bId3PB)bpOJY67}UT*T|Bc9a01zUBv+%nhgk z^g+mb2C|V*C?7xRWPWBXV^q&K#N|qZS-QRpE&?ce;Evms<1sH+j6?W1CLw_)$}Zc3A|__M`;KvLK+cy0jjn zkVl+ph{eXt6gq&?kg#fZyFF7os*r?uuV-mG6?3Y%OD7kWsE+4P2|@aWVuM+^FKKOd zIlydW>7kNWaA#A-?0K0}PA?kwmY6?rqMk3;{&7ET&ZSI5&VYIwBHYZ98Tr!}`MxqE z=+-lsI8>5!uD~G|s>(KSS9d-A04wbBrL!D+`PE37;-gK{j&4xJwX>I}QgXD4-6pEL zp`t*>K5TFPMxDqMZ;)f;cSmEi2l8N&l(0;Xhuqhls-o*vXHfN0rC8E$Cj8<)gm*t{xRdvEr;u2_Q|_yX^^l zC2i4LxAnt+jn|(Sdaa<2PW>f+mSQ>X)n&4&IfFu8!ln98gJu=Z>zz?^SJhZN()!4S zCeNvtJTiGT7ulXe?P_S06q^e@tKfla@QbsZrG7Q94fC&eYhd`5$zjLV66xcTF=L@y z4ZNHSdK3-J@4lHWh0LGgoFYSD2<<-yo^3Fedu!2240`$}Nc5}vTDa-Z(S7c{Xhhw&y`UStHv(0nJB+LTlb&pHoYO^zfZnINu}D7<;A zQ_X?EXf|37dYSCaXZNts8v7YT(Rdb0@X@>&a@f#9?_wqMWE}(U_j_yBDjwyGmw*nf zrCH^a=iJeD_Kq;eMSIp{^OjP4NNY+u-8!^PL0?_02Y@nw)Yz~S5iN~|Ki9Y4#c{tU zwmuy2gt3W>&OyQn!;SsA%xJja2Tj2LusASq@sIq6U5E3;nQ(r&)!++FV+SA_hsj$SpaNT_9R*zqKj~0SKL><`oEYDT?86cDkcxrNVaG z%g7y-Qsfqs^f2HDeh@yHEo2|gePxgXaC9;Itazn12dM?E{(o#my+WPfWTX!+TA2zRXuzY< z?{|J3offBn-(l?K6NlsRU`aHppd)xwB6m(3Fp+5P5FHye0u$<72uJZA*pG5r;Vw}r zd*m_(x~8Zsy<%+LYn+W+x;_Za4KQgX^P>fUkF36*A_g9&aI)j0LD)>+beu#~LI1E; zz`rD!PSDJvZ*bXZ@0BD1$B1^AR9xRJiI1apQrVY}ygxw(s^5yn=mgUKb)51i)~s^U zEJKP%(|w%l&Rm@G^qxpRYq( zT~L}LZ)AuP5$PN@61a_Bk(dhvP$_}YL=l?l1ck|3Ds{D{RWOQo! z3&I&Zk-5~dRdujMZ$7$KWE}&*l$9!yynb7OL~C{?e=GfnU1zo4|Sq+9#NL6)0mH2%H}8r^N(9_p0NjKK4;}L$&8km zv;sCk9AW1=1D*-Hm z@a{H{ySsjJ+c@!H#tUV6*ZqjY81vqs@fX1=Sh-CuLos4R>$Z?lWSK$F8BOnj7Ov3I z1aejywFc<2avP`9)xtmdlf&_-39A0O$Qce#1ZU+n(p{f8;iv9iOD*DAcPbOth!g*C z?rDsqFer@mJE+&8c1(WYAE|4d?_yqB!!c&WCq8{-`+kzYYR^HpQv>-{IFqe6jpw4L z-lPj{?(VF!K`y747T1l)XfVYUlm!R=%&Y`uvnDJSuL5w`>x$hNZBDY-YwsqGRQU(! zxzDRthJp}_5;~mwdmARiy)y0!!-lYv&<69v2J4Y1nr?B;7Izr;_j3w25rucn_gM_l zq=EKdAspDb<{P5vwF|}?Z=f7S3uJo3{=t6e3@jkcs!AEo7IS$O3MS}Ts0K3+{V>dX z1pIH{c}cX9Tk$mj%_OOn%VhWd{`>ETawAi;qF@*P2N=$$H>&|NhTNwT)*?*KoPl|s zYZH&bRR70GvCg=cYAR+!{h#eADd>@9gOxgTdE-ZZ+wjEIEH2ExG&`64hE!!}Ck>v3 zcjs>gA{2h~IN9vf=ycMF5=cxg{{MD^+HpOMl24x-|9MKkzu{*~KPMJQCu1GRaZJT` z+si%d;W+or09jGXy2P8$8xke@J;|vaiTGx$;e4j4;$??Bi(IzaH;`=>pFRxu=nzV) z6AFQ+wO9Fxxr7Vro0JIH1T+Sb=(G_&?@ANbnoFo^C5oGWGwh-Gr$GF3j%mQP#=Rp{ zSjy}9odI0MXwllR4Pw<_zB1LMV*Dgft+p;{AK>w!#J{e<$Qyd2e*jz|*agmN)7)dF zlZXb0K4q9TVv^vOjLQ!wd!YQaz~xj4bA9CHZH;wp-tL^BR7^lq$}LlivztYOnOR;W zgq)KnvBh`dGQ0GmH2fEku9hxW7--8SjTuqk`H1vJv{hlT*X=5boW?f(H1;Z;VWz?CASra+RFp*|634JJ+7(X`^jY zg1sP*hUGhh(|Hg;08+Sv?>=)9=}?2|L$lDxUxoc$BshRMLYW#APmd|nnZ5|$rjXSw zkHcCREgb~$m+MV~lWlQVzduYLY~#{WPjb|a{gnvZMqD#XT|hgaGXEA9i8Eon*+S>IrE`f!2sx`Tq-!>MW_i-|PF9QmT&&_o-0lYupJ2V8#5nl{eX>lPb zUFwh9pbx7ya?MFQLb` zgB1AU3C57zUw?p=cWnmKaM1TBg}ozaw0_E%Z_u52XKEWF!evxJn9Rgl?w-3zVaPS# zZtqUV=iieuJAyvvnVT!m4z~oovW}3erFNn!L5p<+_{ES~Ibb`W94UYVKJZl>M{bI`q1J^@@ zA~8=E%gOitM#XtIsDtp?T&m9BJPLXPn2)X#Xz|HX3KvccV7 zLJO{X$x~|0LJ#Moee=afg408&8V||Y;jZX?g~N{$WwxNUYdFKT4{Hu)Zzz`W!QU~E zLtINb{e`S=wef5^AUJY_Zfii9?*qKm<(5%z7~(s0$8tcp)^wdhv(_khhh9jrGOo*# z!ez@a$`U-$I{tKptq*-nL$Rxl;>&sKY6|n+ zqp?7a%m#wL0i?a>rgih-fiy3s$2gTkYq1np)`a6m;==~iqbO5Hl@USu3c$u?mc!7&Pv;#>cM@UBMckF3&Yc8C!mrm;A=u zWDu#8oy|xcf+upB&$x%@;(>=<LH6fQEMN_ig(Bcr#MR-I0`bbD#4Ye0c5@CCp;0RW0lx&&<)0@jrnQFg-@O3Q z`0poS7TDwI!UnnziP)LV4C5?%Pc4|!6Q>KKjdL_ zTkLfIm%gZ|mDwCN?C7omNy{g>ZaOMP_;Nw82j4pxU1rv;Xl%uCs`r5m z-XIvTbO)`b=WM25K-U_i3g3|L(xzbT3l5Cq;n)VHWZx$6rYEl*0SC9g(J;9f6U4+; zC(r7g|68_-G+CP;$4BNQ(bx)VGN}6n<&qd9nlF!rkKvXkn{B=W2i7HyHj{-6l04gP z5ts)*s`TQ^wy@2v3`rFBhd!^G?uESPI>!#LbCY$fvzQ=21{wHkmuxDw`eQ zf3RC?`39XeXTKU$!4l)zLTm}x=q%?OKXgM&pAyyi($vc>AuSZRfc;i;rhYLL``#Zq znP2sWOJn*AvU|b@VD*{%oLy(Du6=a>X2tR1jQo$y|MAE0w?_IVo7SpqT*_v~k^9LK zOo13+$Q z?Usio*2fjf#R~{%iE5S23}eRZ2u&fF7B>$dQ|l`wm?<3@All>~fk`v$eEBQG(4e zR0`$%FdC%(lB!ebeeZ!U!|X{~{0`Tu34-S_KfF`Y#zFC=S5E;MMQ+6b@g2JBYg_~`9L&dphiTng=?r267N*=MSI6VeJpFC2v+An%vi;tUs#<-T zS^!`)or5J)yo^AFb$Db(8nZZ$c)RRDOf8Ymh?2TCps2|5A6Pb4P1u+56540OFqHYIeD2C+F zXgr7EjBYzqYhAvQD~0qP_93$t`)8uE^h9AyJFMdNHdmEEo|%X_B0NqBPPIz3DVsey z$}PI*nu;XSsLobssGGjlW(9dYu9!{F+!x}Sb!!v2{H7H; zD%5<8yhsL=iDkmj{*+!!QrJ)05BHKTVMstibnPnr)L!b#O2hHq#vyA3q&Du`+xxzs zVzzSeCzHxpCH#5VGxaE?N8_TL~9$70l|fnF%N z34t!5mhIcvYZ*G^{VkN{kl$%Cv$T3*=^U5pm+Nri{7%9@v!N%DUk`R7Cg;L@Cz^V4 zzZ|jC2bm9atAHr~)=`$7@vD_GDDC*0J-`#HD+jr^3Ni#q76TcL$GsnrGg(9o583J}Sc-&D+yv_anZF@@E#wMf8+-%wA#2?!TW+djXG=2o!C)B0F87XFHFex!`i60(hB7Z1pL#)W03S z?y$}b)=#)-#dTTn6qX>CIVnbsMrm^8nQ|2lMow`x4f8P=|E^?S{9ivZzTHhC32!;1|0Z?uZgLpF&d@{kTkrPA!iwz`jmGR^K5f}C6f;gopwn)bv1FH3=|k&QV;w#LzuPyllfW~Q}=DD2X8f2WKACFe@{X4rDo_jAsnrX7s1p>WJ zFu%~m*f%0~`=et~7Bvk(PP}j8NhLeXa7bdBGLiNl$~Y7Gr6LPuitSWo>u+VvBuVvo zD$M@$pie)@eB~jJrPW60j6}X}fv6wzkiYhbJzk;~J8yKm&cX%o#bhX|+CkUnnC<{t zKGT6-lQKM|lw5@FeUvSDn>a)`G*y?nJR{Z1q&hrqV(3!CA~XR}?GBGM7aqZ>0ZO=kIF zc=+2Wf?O;(lV@-jL+QdXKmAJVea-8$v@|Eh1vO92Q~+PrrZ9quQWu&=&QYvM*xm&ISMkyX=p&WZ=sHslE3(ZD(wFjN|0kXirT(%1a(7+!I%YgAeyhNMJEpb0U z$|f@;!U`41jkj1GspQn+vt_wlK0lvwcQF_~wx9e}EX$L{e#>W*X*K`&eH)zDSgCf) zi>;o9Xllu6aAzu4@@Q9`#ZM#|b3T7+e+wasfR-7+Y|Jmm=YV_mp9^+gz60w*XntN- zvao0dRPSP>!C}u-qrGa4pG0zgG_kVz;0 z_`6YMC8tK*3xCQeCvCbIa zy!RI#dscLVrxBrJW4Z+NeohCeT@Fd{$rJKtveRcC~TfBOrb=JYeZtzQ}Py)NBrHU zqp7YDu6`k_*9WcmV zQRJiHq}?>2YFmC`fd`xhfQE^PtY3ppNsTw|?7$jaA_%d*5ajPx(DEqqj;M_VU3DTU zQRuhH)sP^vxUr%%+cCK?`ntYzW$^?!S2|D_REi)9Ih>WEE*nnbrj)I)rU%~YWeET4 z9Z~Jc3c-d4ivGh}+?iMTBlb>7zu>c}$8@9}eUPxHjow%<2oSX@UJ6^0b7!@0H%V~Q zOKT&u4};@!!**hNUGx=Jf-;;$O=+d+Na%(LMDyW)o`|}4AH==UgR?G0bH?olbsEf- zqE3MjT6pT81!3`3fBouk*e$_@g@sAZE;rhC0Pn+p&Xkh8pWam#N~wv6ikR~-FvaUu z3lRioN6$BVy-lD?IUWzEiR=dIe36_)c?0`$VG*gnNn1CO>^9r|frO%*XLHWjl$_fs z)$escy1w+g6aC@jUYg_`mYt8F!IFOIr_oRhND;tQ-%}|U!B3Q_n&cBC=$4HqVqN!e z8@yvl&qha@T>hSKlrk0k#{?gci3vUes*XaS9(7Fu+~eOfWg!p}r*2(5i}3vVU=_Zx zsOQBrTk!sJ%i;}YxR%-&^mAxCdb#?G2+${%CK|t9^@SoD01hG~EG(){TSJ|LvE)!T zi&?RSgOl*ftR{;&3TOlbbhXfk*J&~{@9ilgo&I*4R8cKR0 zzcT=x8RP^;2XP69Y=5}vR%kE}Cy?I;P%GsH)p#%QEZ_k8r6sM>X+Y>^cx|*%#c9yt z!OZz|6BMkSb|x3r>b|Sh?#5gomyQ8=a45^P>WrnhexIUM{A!dABUR=sgK-11w9r!# z-swJXrcz%qC1m~JIbB@_W=-!rHLA{^u$V{;df3@)XaD!dwYP3jw?MbmW40!wm>xRE zt{R65m+fwU^W8#RMd=F7`XcAy{pz=VM4Iq&BS0oxR>t^C?gTP11u#XyC}i=)%Ma*v ztkv?KK=z05^rA@f2UhDq*ZfUYUQ(Cl8&s$8;*oKFd$hSp8e^9mb!t@mnTFlvHrM6x zFj_;^Q1C2du^eX|Z3?JzRn8LahqL(Go;?`Uh3a;zUY=jW+!EqcVo~e>A$3xn(f*E{ z)gs0vbC9yE{k$C2j{e}EOTejr5z3beL3^|^?5W_gX&8vA!?9h{9f4_%2oGEhM= z#J}}{jwEQ;G6&RP3}QJ}Nc7ka@7sZhd4(gHElb2h#pD~|z;c{ouFn6(BO31d_IP2~ z^hOb@)g-oMkuo?yUyP|62goha2Rqut{sMT6nB0%yr1;sJJV_nEyre)a)liob!Wp5I z&_@h(Y1noBDJ5_kC3cIm1>m4qh=_QIuQc4VD3&L5Pm$1in(NuUZZW9DRqdC2zfR}- zA|H0>h$r2Euv9IyowC>r+4kewb71bt&JddXTRih&I8kb{*5q>B|AAJ$enjZCEOo1h zfpWWRhE9z?SEf=LASfX9H<<69!};a`xiZ<=Aaz3^gPza%7>WHw;(j1KRIM%g_+Y+H z*A8alGUefHNfc;y0@7vlFE;#sF}S+-zy1@H(LnAM0ze%ib#>gp=`iL^(hSk(#(b`} z{w{xB>62K~H# zUUKEaZpU2?eVrb+khSCS0uTC5ai3ash+u*a;)7bZ%BsznE$p`yBrvzoo?Afzj8*dt zIXhql227i^rg0{!f9&WLL0mrO56S$)^z`cwc&02H?0)YYEMdj|In&QB{DjwmN#>|kmIdi9++3l$Q z|A*si5B}eOlk_9)M&5>Y6Y=Yc_7Dj!b^zxB#RG})18#`$KcoKNe++d$1;HxZNr40J zgV+}Hed-0S*XID!=v?E}SP{??5S{mBDJ{eDuJ?80TDs_6Ztkn#**v_v}bqF_M*pk$$od=-0qK= zE53}t&e#9JZFYK}wL`k44*L81D+1m1O4KT0!J(i$HP76fyg)!~p}ljH@fQaHMQ>kP zZULK_XR9DlXrw{Hyl2} z`4*^yB#$FAVfzF791ytSP2|(=Mj>;!+l~x;_>Nk2ga()nHcEw5NK8gu7NTIx1L&I2 zZ#)Mo6&hLm11%Cwq`>7abo8r1kAkUal#Aq>)nRmbCA%TP?P(eTMFGeBc)2kGa4F3* zgeNCmO53fBEg7O_VVd}yf4axagEme6Mj8)j7@My*12+!ND z&P(Yx36n4fERybhuoG~(L0>E6O=j|nG*xI8Du14d|2KIcGTl$-EmFA8tQgHlp#a62veC{9Byx&?w`pRKb8hZ*dGbsCR|)L1e<3i`oO=CGHDoTc*>;0P zfv7Km>0K@Qbb-jha4NE7tKA(;EBJS`Rq%5G5M9VtNlu@}xj;WgXM`0y{o(s`$=~|> z0HTr9Z_7$Y^0OoOYJ5?LK@Z1gm8GTNd%FD|np2KGBfgMFvU{Z+CUm^G^ zA~@(OG9x1pn4|Dd3xE$J2MA<^w=&PNto&R;i9n;aj_6M3wCe$ERq!Ld$eAb|F=2ku zxE#Wjzt|I(``ZZ&I*3KKmqY>MO&~yUlwrRV|5 z6ZRyd_IATlCk*#kD^6N+}i$MSDEq{Plz?zH5;sMyFz`umP=D#4g90!$Bkb9%e z1z&6a<%Iz`iV;~Ym0I4QK$-G$e_&j|`>pTph*9Nb9eWI+iK!!dR`AkOc@T>D-0O+113uom~+8J;P-e=3+e}SeiyT=!rR0W3LWfXXY0^ z9=9W#wA4GrT+@ZwOea1LdjOU81azKJL<8}4z!iqbXd<-=zsyh!Hbfv4VjvWn1ov}v zA_TAk(AeyXzS_#PaYvJB;hvw~Uz~P=4gK(N?@oa5Sjcx#5^sOQP9@zuB0}WV<#_K` z==>neRY@3*GV5OpKy$<(*n_ds(Kh=V64@+1xuhw&5TL#$CLUxVq)9oy&O}-ia3Rev_g`6HSqw7Za2sNg{fP5x@$jnc!NhZw2C_Wi z2|2K)4Wy$lH#?w!00BiKClvu*Wo3%H5(O7$oNS!NZ@;~M>cX>uJ?wH9EoK_7DNGJ^I9d(wE_x0AeD02tGWp)O zcX|IFH2!s{EA6WX4Fr;t(3E;l4TXZS*_nvM@)?|IGrp0`{1`Y2rXbj6|uP zQl=#&^(t$isklGjz-grzA@KAd`olM_kiiE76pcwqXIcJR|BB>OkF(Biyzc%A8ob=1 zGvEHWk5CFD>OqABAK1k0vG83~@z_)4puXdQYg6=*?3nr8_p%R;V1ce9opxVMRjzF> z=_Q|0S=hxB2SN$W7D$CBYLL+BZ!*vsyO7_X;_?_1ZL5$_mv(4s?ND#^=7CG74ScLJdeBB76ZNSr$-bHz-qo6R$PW;0>x6&fHBn6xyb zGq=0QSXj`glu_hWdW@u(Vzv4`PacuV^vRrd1kZUFM=EF6raS9Mmd6`FYf@OmQ7atj zn!Z&DEQmu)i9pMs%}TPWXFz}z|8cmhI|TSowt*yt%aNH$r~TpYdM?(4^b^N0v0WBu z!ne1zMnfSEMiWlv#J}U1-*7plA{((RP~1&#`;lJ_D#AbXi)`t}c0=NFTr-Y8PB!Th zPRbXo7JGrv zy-f6Cm3;(`%HDRX78S_wDC$Q3_mxi)D05h+=NkxMDQyM)d}RL=YS6|8ksj&|iy+Q! zFm^)}b14hm5@6|KhDkD8XN|;u5a5~ie~IP%A(JBU0)s=dyFFX7;{x^6Q$^`g-DMyl zi`+|Mdi9v(7XWMmcH)*iq728c3+qTizwr$&L z8aB3_##S5Kwyj3}&g*&a?+0W{POPkB&N0S5yx)@;Gz>RzWN;GK3(;z8KW?EP?D=aS zN}OmX_fJenGX>%DVM*eC;%}W#kTjpDv7TS>=FQl%sUhgmL zaJ1-rt+~`_3}?(d$`%E}lr(*%63|RHaj25Pn{wRH7C++gvXv<1GvTor^`aqSQsX3@ zyx`)IxtyTJB|a_n?Rsmn&)&xMRGnrls8A*RbTev-TEo2j~U1;0?J!8V8s0mpR!Boew z7*RANbyhB09lPjW`Nze&TM_R+m@7n$nQ@q-iS~LPmNY#QGCemBPNi$^d`Y${TA>d0{ zUx(&wiTvl41~bf$hNzx;-0MLfQcs;60PFnBOZ&0gycZ+32d&tzbT)QU6t(BdeFqd6 zz_dSo+rn0vjTye`1#o--R*+4Mm3r6KdWHBNV1gwpu%9QIoxcktdKjT>T{!A&hz`B^Ca>mil zzHAP!15RTlusj@%E-?332-GUpK6|r1A%?#x5W9+6Ix{YQ$zs(Q*pS(}Ry=hi>Upne zG5SjmOu=yx9wUX$l{VWffK4)GCTVIeyl-})w|{BMD6rSOU5?;fVWg?zkYZiUBqoA! zPzC0t8q*oi+`_N>hhmt#ZrKilfO@)@VR5_~I)K2*FzF6bXa(mj9_~_gk3s(*rQtoR_(|Hr0KJ6Dw2~w8}DI=We?7c|s1EZnCn9YEi4v zz!kyTDv|Q$v`MAQB-i?VaV61?IZ^bdAFnTlc?tCWcnlIn!GxpCAPrir6`29_)@_`^ zwQ>4=zd6EO!dm#N0D)hlg7)KzX%~IXi&q%wed^Czhg|(cN_p$04<&wyz1pMQbw;js z-z%^rc3bw5THg+$97&zg0HtP|H9LBHdVZ+-=g7_Z)=g%kesIFVo_@+RwPf5hb)`>2 zO(Kt41=S*{=)lg$`>WECI-&2iuwR*Od4bx3Qtil1_;h)pP;t%zk6y)>F@A^bJksk( zrpGcLE!xSwp%_?zlmK!6vA3TM+72Q1AUCq2XM~%bZE;7_--kO}k<8+;e-g+4o&2@M zmbuMBQ^zQv&$nM7f`Nja%ExQlPTw)HrmjKKvWKawzIIO{$+j)yVNo zS0!}?pYOBOa*A&mb;CH;cVOX25~pSDzM)IR3yQ_#$NG4GqU42dvr_&gXJxrq6{S;g zq_R{OY`vx|Edg9V%s1)f^ku3Y7G_-rbBcvZ4cH2`YGbpMlBEMFQ7S#YlES{cUi~g_ zq4w!-dYOJt?2PF1C266*Zs_HsR@67@V^c1mY`!so4_T|1k1PO5(_xHgJ0 z|5l+Yy~ex`&xIZYz*%~yVz5|?JI_G%Ep?TjVb~mtq2P80exn{r*gK~%dc^YjF1M`@ zmFE=4Gl%l|Vhgpq0^^niO2X48Sw^_lbk9!k<>;I?eZuISSo|kaNML~(rr#e=Sp_?` zbh~@H>3V^ z2jRkst#&tjx>q-^`8GmWqu?V=AU8Q!aq$8$8tv~R5r_rm`7?m|zl0aZ&j{5>_URS-p7pqXQ1!e=+u78`T52*J}?7>NW?-w1R|$S1$7C`ys8vL z^ur7t0cz>D_vb>Ce6gtCgq8(nzq5RK|M7CU9@oh+@c#MVV%12J6jwf-J=DGZ z@1A$I)1Jhb(4#;`vxCzWd!a|@TsDqex}wkQK)NhP_@_y-ol=Z9v+O2+L4)fJ5iZAV zlCz2E5`!1llRS&5%b8hCUZYv?s+FO4xLX9!a6$bzcY8o<2%P!~Z~mJvIqcU7=qG*x zWXcQZaupk$^DFs_BReNbNPw^zIAb!*TI$LIYY&;%{8l0) zDU;Ef&nGOEQ^btZnL`8Kn~AYLuF;cb%~_kl>#wqvtxv?@U_?gEYrm$71;o;gc!8N8 z3yv&gzBr+wU#7nWH#$QB!?J{WzapbM_+&G;2AR$Kfq<=!_{JXKop2AQ+4%l3k4k3> zy@UQ7GIM@G!fq1I<92}sbG6wOqgBkgJkAKcqHqfL9MNR4Pp2p05WEqgyvxZ)&gojC9#@sFS~z@kF;?h2e18 z>*BC_i?MOf{>crn4>1U6bl{e#Hx}PXP9>H;y*7vsR3r;*RN|sFW0#(>NPU07x7}#h zb9n%AgP}l>+=}6=M(^muZ}ae^A2ujf?bYGa?>_kDvl4%SL4fLVS%?gFBO4ZOi{1%c zZ(U9!N*{iP!W&MBQnwt~5B0~RS?MMl6Z~XGLK7{Mf!yTtM0Ya&92DV^(>G-DuYYKd zb7)H^jkx#yXTpwrXv2}oxu0 zkCl8FRCCdIBF?F=5~R%hAL-tUpL9nbe_>1HU!$Xj_rm8)Mq)!hks6~TwY#1Dx-OUS zYr~0ar^xs+B@>l4TuUE5eHzij>)6_hj_sW(etFTSHyeYkp-<4^Go}Ch_sC#eSy)X$ zGr?YjE%Uy@H%pipGUC_U=ew7huq8(FdpN@))j#cRc?)%?;IXX))VOoCJpiW7XbOv_sJ%-kbm#B6d3f%n$mtbrKmwFuQk2tU{w=!&J`Ss{x#lq2G{`#0d@(qyNgj0FaO!;31v~s zVu^~FMe=F1^54a_GNKH3R@Cc_y)5UiKaVjGR7(6%7nmx;7vW|2;oQ$K zyXM9qqt>2jy;z0}Ac0hkqf$A|&!GUPv3C<2-q-)l*t6h^1r~Dst{}!3oyNfB%Ag-s zy6^GDVppmewzbmT|8Gq+k@~15zIb{AvouN9<8Z;0Jx>k3{J2~kWGGX)YH}$+b zjI%MolZe5)|e-Y$MckJ-h~gitd|iIl|(6z8yOSMUCHO{WFspsxy<@M#Qs1;s6r zZNR_^t?MExvgP0L37Jqpq`zV`WDQN)#@GM(=Ie4xf`4eVlZm7-ka1IU+e1tOb^5#_ zuVUwn?$qH1mGF;=E~IXr0l7}jl2V93AC0~5(F6UI-2oS`vg;E9g>`KnC`QQ+gZ*T_sc!KgptNtEZY86tc zyS|=^;%IsZ4B@p}@`FsN(_y?BnHbs9i3lxIad~V*x2K&G%rTiw3te(;NSynY!0q3tXA)9w}CHWbq?|R z8erLmFvk0x`u2KU3aTc%>+`@*?T*VBlUl+cHm&6T#Nu2_#^XRVk4w;!;WO15I})(~ z6dI*mnNGsP*}p(wxISTUQ14SBj}Qgw&L+^X<>ODnr;(3v%Egb(*Co>#M-r;oEPLvh z51;yBGStz#PmFw36;45Xe$SBJs)hlkwVP;LySEvM0n%!boT^5%AkKxDd{q-eS0}uswJ(mAQokr|L@Vt zL^5ot#>E{WfSPD6{ix`WJKI2r?+*cqJT7Q1VJswo)m7GTsb)i!{bV|yaDOyIRD)14 zS0D_S2Ty2h+(_|;r`bfg{9fd^d@i#V(k&|-?#mn_u^DrK4cvGW(!a>-{C=1=QW=_S zK8T>&0ri0(c?)hV{m|Z}h;}a}8?v9b$1~&rfihopErnCj{&_csL(FZt4VNb=m_@Gj z4(77gh%&<%#Hb5ioRO=yAVi|ZF?Y}tSp&^_o{m$AXv5g~@Y`s{8+-$v=7-wuEv60<<{%NJrf>rbf z)c}U5RENoi4lOR+y_`6T8oTv!9mIdVJ*gMd`2*J%Z&wAk|666Tovy!sDiw9o{sFVY zf~XtcCyg5f9r7=5gI0lx^+tDu988-^JkDb{K9nmC_6FHhk&}^?RfJDTSAAZ3neo(T ze-rYoQU4xL14!i`Clke9tA zk{(x^VMYUzqh>KDI6iE2RXtGPREdo>)=xF`B{`H;qu(_gE0BY6gDsIZ zk;xvUOd;zzsxDv1EhVzSMA?LE`Wu|X=LK&*kz*20B*yY1mL%yDCuJ<#Tvx;gSAqR5 zVzzp%KIZ9Sxt&xvBgP>z^J!Pr!RzX@1j5en-;Pre+-*zV8V-!=oNNgBaTTM5Q}*i- zV*CkoOChxG>q3Lz3|S0IK@&mS8AKo$VwJa$1dtv?G8Z?y%-G1vHOqT^d~~N~Xfe7( zx&M$~Z!e-BtN7*ceVz(pEM*UTJ77H#>8EDIDLy?4UmU1BvnH<$bH7|i>Y>v&{^@b29zp^pPUBY39OQEKY!T>cMJx1+}&c@?6Rj~gdY(5EoWiHGXcwKM==n;DeO(0 z%Yssm_X|fTXN&)PNxS*Eqa`l%sMSXPZ#K`@!)jd)))VgN;t(PieAdDQ-00={8;9>- zqQa=u4jD55sRr|{(~|j3e&)H&I6j}!DbF<26<4G(SZ0i!PN_i5m}HUbhp}A_pBtX} z#EW)~_Z$F{eZ;JZPAl1Tk3nBPb`X6kqBRbFAdAt z@?LsbEgXp-SZ~{s(i48*Oafb(w}PF9K|8AhVS;Z^Ulp?0$cBG3v>K4ZsLsf?Bjzt8 zp-JH_=|1P_l*n13smt>1I8&|v(jHr{jH;}@K5LV|`hW)O=NJc{C z9#}=N6q`Mk0EFQam^l&nCIA1?anP&|9Awl1(z2n*MYV zntDXYQm@ZS(brWXbeKi-fUr?Mq7WtG0w0AKl3Nz3qR=ZNPHtApDmvz z*O?OifX_I9Zaet#mn6XiaVJ$gV(8ZaLrPyY<|O~n5v2F`*?1ArU~u&jvGj(wCx^o( zWD4z>5A!S^nJXSwO`!jWmJQW6k{+Ay=gigaC5pK~15E?w9U>}3soad#hMrXeNVp;` z3A%jq;T4W*gQUeAGdrCBL^jBr#Fmc9s9-z9DI*6ZeD%28h%ohWS?5>3&gE2zE^6@MP9GB1?=y0k-h(Pz!sZhwTM5Tt~YtLwDJ@g1MMDTNS0^) zK*d?Iu4f5JIOI6ff~aVs6Pth8>tHxx2^Q zX6!o01%~-V;C^j#%92 zUZ~#6W#gRDpy%qhkvc&=DU9CE2K@ zhCTs6R;Y;hGE+g&NrTNRI7To_MB2i+{;TltRycI1xc$WbZ@7;auVe7xx1Enw*sa&h=!%7QSpV1zO?=w2^myiv&P|iH!ITo z3%1O-dXH%`$oc|acTUi5BurAgopmVs&uW8ZJ{CKqFF(EA-dOY3Ij86SHR^n&h9p)8;1Gl4`8}#!GfpYnK2e`mDd;F?H1!)3!pYF2w_~u9-l%?ZV)QzxE2= zA+efyIO8nv8rP`$Mg$Nku}$bX1Q55#@_?XgL;=t+8$DT07Pq3P6nb#Z6u-RAX(g+KinhoZEyhHJpJ8EaScAF3 zq}%Iqiu4q6(cJ9zh_SUhawK@;x!82rBCi?9wA)n_o?XH^ODD7VWyh5)P5-YSjeln)5--vIcg8n{WJr2-xUM`}%&Yz*78(~7O2x#t@H;XFhyDrQHboeK>k zIzuEOtoM+=i>a<{pI-)2`TW^X)OF+A_zYQV z(0!A5$}6oMyB(d;u@jT&;n^GdK8g&m<&7P%Un^H*$pNJvB$7yY&^X z=KdsX>ppO^sHq&N2vS8PwdzzKDxaa(smf+qp`r`r^M8Y~8yEk}MG-wFGF}4ccj@%A zl?QtNj%qYo6w95oOE|CIUvVbSd*GpIEtJs8siy$!_@z)+y1}Q-4Ufs+iH9yF=5eRf zomwirNHf(;!IyqUBW(qwO``d=&_`J_CgZp_e@=)6jM>JYty6V>UAn#zMXBgz{YH&E zxccd7#T*=I-jlhN-i~^aHdK=A@jbz@TUQ%09GGX9!kT-7FYSi>U}iC$K#C-t6>$*IuW+nLQYDJW<}yz3=)y zFRgSsn(MC(<@0!%tWf?|L7zV$V}`V&A0twc^vic|cp@;MN;w+ikCs{-br*vJ7gVYL zGCZeyZg30gzc?9@<0?|Kik)B#F z-ipEE!FncBD&`PajyqaC$h^x%UX+`WhXVRgUsw!w)Js1+rIx7Y?w~a7=~E_;cFRld zQqz#7XpJ2&GX9!Bw1WY!%S^+}qYsV2VMu3UhpM-tR)f_XFFmK3jH~s?*7jhHEQ#HD zj4YFV)|39%Vw$!IFQa%M-wZjL@cn`qi$wsFqo0t|zre2I{t^==Ki?|qjF``qi_h~q zFnx<|81Sily5##J*$|$n{wB{Yo|RK`VC?9vv+-asXG^fY9x%zD@ysWCX?i^s#XI<> zU=o{4h5Y7VsU~l|cU-*zb&(6HOWSrc#V?gj0q2^%GR?kH8Armw#`aumd9mPw=HyL% z7d~BcG#Pnq1V$4PxJ5o&fpwHwVCZ*?2F`hU@N;D?;&&zA+FhxY?i2d6?)67qX4zJI zzsnKayw7-7SkajII^upnJXn&Hs9DzMMFsqtQ{8L$lcetxR%yPVI+=|dm&bdd zD!TS7SNKx5&9vG3gU_2uUrPcBSNm|7J<=@tVJ1wcu4+_>hKHZu4YgOc2i^MN(HH#& z>*M*-A>A*KZ#6bm;cv;7HvM`0-o?uwdlff-AA^5#5#`ZTpn)S4yCVtunTBcZVx6a) zL_RMTD(#{=93{#wuo@+hGh}veaCBJw&lf$tZFKo3e2SRgyNYU{KAZ`t9iJ|~OH1T& zqZxu}x0q!L1;jXy+F_eX4NjuZEyy{gn>ohCv%Ll#wJNnEqww8029hprgfR*sRbjKi z#9?L>cd!+;rL$E`CeX7`=~qF|hrju*r?$fDQ@b@_a|PKDNo!QHSiJgQqd^IESy%%n zG#o&AMonodp$}W=m&=k=D=JkW`VD_PTa5lCl6cFpnGMnCa{ZS4+W`F9m+jKvjqQU% zi`0e79{)m(IQY2(sT!{lPgiTb9 z9Z%CexF!(a4ou{61bpt5@6X>%rP$>Uq|$Tw{oyvoCdiE3*c4ApT{)`#o)$SnP;9q; zeLh`S5U4b|C+iQIn)ulg8$F}CSxD-8vl~W9>YX7A5`9S!w9aqga%xL1RTu~c<^j&& z+r*uhZutxIQC7{wWXmOvS{zLO2Mvn}OE*ShtFlp!@xrz$<)Ao0f*_8clzImz#BaQg2Vl9K#7Ca*0+3#gz)RQ>-stPhJH}PZnG(Lj`vx5?q7s1ad}3K z1|gAUm*@Nw=V~;~d@TqN_z`q*nqL^#YwSurdiT?8juO2B#2>-CK)-0IJe2U%fo(5LE zUJYj#A9s!4fT~O3*ZxC#x0&hW)Oza`pJ|rj<1cT&ZPqkhF)D=j}e6FS`qeZpWb> zQJDMI*QH;%fr8rd^*Tri4{6Aq$Q}BnH|ZnJ1&hUK%c=HeIO>FntKPlxFLy9uPs5JLmxbws1*nrnymBT8pYgI(8!I~k|hgl%t7R{3DH^GKKgt_a7 zUZa8nO(J~&Xg{`NRGP*`4_CamkhDoeqj0WP{wEvc+g=e;&}(TevmI3NqN!j9$|IL$ zbkqA_`}fnqo&h{Y46h0I#GA0~)fV0P*@#AJ7uJx1sa4aqfpz-hK;?-vSt@+g_*XG;+{O(KmYON0BYeljwo{O~> z>@NyGq-16vVzMJ4j42xM49oSg{Izb8Df&%H!4!iKg(CdS!W!f2NcDR#!u_Vh##NVk ze(*B$QR}cSivdO}z#&8isun#1GUUxjM8_u1S4h~d-Z(q5GHdc=wlsO{w!+mMF`u`h z_0S=*&Mbm9g;4`5^ZMkQhE!w%V-?F+GC`*>O6F8=Uo`ixhMdk*c|-K$2#jeb@ z=vgMfrNs)&u~zW{<-OW64F}kwvqrxBsV7qmE?Vk}>YTcTKT3sIxct*6B3biSlK-4C zq&Xd4RVGsB{=xxn(fS;8>vnaWY5!W8aAC_g?q(zjCNtr~{Mg9Iyb|)sGA;R50E=0Nx2bw4jCi6~W+ z#=+qQG=C`^vbT2+0<;vYjEKz-?~{f)sV(d8?4jbJ7p$6`p*g)gfaav*VU6Rl!%3qa$ zBM|073VSGb7-~KzSfN@z7xgceLM1=o9xkC+#b`sFxDVnxI_lOQBY3<+bA>+$?Mq5R>a+xjV86FUTfD}d~^28O@59` zxW-jcQH4!DFN~p4Jdq(~zGQO4&yXj`7oj$>o=J;mc@y9dpPigY&7ni+G7=B#T8}|r zI$a)!CK|R>cnR&$VS5)5gbusTD!U8|d@v2>(ZrFVsAh|TU72=sLjn1y!?K+cPkcMUEAT93yI)O$^_P5f?Zw<;S9y)>A;KAY>F~ zihaptLK^)9z3>jvJB4c!>Tnb=^2zwTGLc;tOPm7Jr^EBcI1r+yx(L8y2z>+p4Jp}y zeSr9vIINidMNG8Ey0~4*jTG<{OY{j}knE0&OZ_OO;%j}6)h4tK7R1$7i=)u~7&1vx z@l_LGz@Xo#Lf4hLQoTiqgicc4_&6d_6v-#0wUapu!>61s$LnoU(N`4z z8*zN`R!baVU5I>%=W4`B4Uz;(oRMEI;`{$Bh0Np+=F@vldXOKhxr>K~<@~#iNvBJ= zehN33wD1ogDrjTmHz#h+DTfgB1K|`Eox(Vx`;Mn`)DoU2>zu<*?}yCPL-f1FS`En* zjRo*xr4FomjdnFnBxT6@vHf{^5=l$8%AN!gJ!fcSAAp(3_j~=twlhuFasNA2-vWdh z`nH6uEg=3P{Pp(awX)O!C>AKv=9us+QOz@`cG%gBla!$w-)FaffgdeRABh#HiGD7n zM+$1jZl&ZtT;@-V%!u~5S`=^LVkO*yZ6iz;! zFGp8B_Wt@%Fxtu>RwIBsPDzszqD9j=81;P3UT}NzrV3A(0Gek3v|H@-?!Et`W8BP` zYK1{C0yrVz&aO!rEuiM3?i87|*sj2*(0I9jk;>-5EKkSr1!V2$q{GZ>&1K26?fiin z=@Npe%m;SY56d;2({LvoNnbL`I4HFxD`I|ALJ z`b)v&?`z-wW0I1~^6YsRNBwuxki6kX|6Q-zxQ{|0v?T=4eeMyawOEqCvQ4JtXx{+C z1WAVVyms8ilu-ey5fE+wgj;wFd?}Vawhk8WR)A{BYbf*TiupV?)doq$F)i zGT|s7`2L3AdvD}2c2lO79G^5Y`Tle$FO@QzRnFWPSk7`J`^?}2>xthNKEqV0hZ;Z} z#ubcx;u6y(#ecF@c}u|TwO^sgZ#GtPq2-2lh!V?vr(7-$VL8)+w*4fGRVJ6>IZapk z8PSl|h+q2~Bo+y)IPB5{lpLy*FlZIDUe)I|5PrH)DZIgRd&c@zF~2eAJ_P0=Qb)=b z)Zuo4m`phrV^}Y#S!kR>3czO2-X50xopug^in7SQ+0n=|c&#ilJ2&%G4Sz;D!(eQy zH!-K}KOslj9Xxpd<|LDrRHc+3zBwuqbq3Z&Hx{O(DNx#5!QP;cpekxH1!oHiqG*}a zCeNEZa+d9CMy6DgHolyw+4gxLJYY39XMIN%8?v<1{?_J9vFnbG-~V4;0AXP)vSW6P zKH^)l*WtO=^1r36I)G~?WaAf?iJWuWlf#O#T24pypc?PKT6%QkS9qPv77#p#6dLybuFARz9u7K}fdoS4YHik7}ze z-jD!ZJp+VqV!Yf=Aqn{cXLGfmUM zeDp*TKO;}N*rt0lh1!CfzC_E$kNCl(%LmEnp2wC7vf>%j8*Oe=FXqnW^N_1r7w+Nz z$u+;tROGR{Lwom;S<4rVQXP9VA;52c;Ti{-za9-nC0`$-cI33m1iD?-_-6mR9YZVL zZNKw=IIk(EOIj+c6w}`1uW{4#I_GhdZnUd;&|DE{Zm+rGf;+>FdZ{g`O!Z~$l9J{Z zT*J>_L?=!)cjtX3O!$=Oba@-Fdx7jA;eZZ>XTOwGT1%OY3QVx_!*n0 zMi|mfNdawA8ODY$f^j)N*%!%TB9ZWI(4wubXXlVUfadmi!gjN&9IV^;d`NA{ z5KY}QQZZQY+v5R7zaAS5(z#@nJz!R0hmEDc6maU-1R=6H6p3gv!fh!+cl3=(PDyDJ z4wxKbP;+<>Z%%@72w1CrnzmAYtPt&fy(L&pfNDaJ{1?WYOGjqJKFHcO*8)Dv{+a8&&oQY)ejAd;hXnjAp@7}rhW3kN>*NNeq;+sn}>iyl_XI=1>tOPj3Z-yiI*^0_wlW*4SjJ?M@mV`rpDH4pp zpxuPy4%Y$SDD}+zC`uS}2a7^PDeb0z(WiQ+rZLM$6;cd zkoAJ|tYw|klk>MOHB>eKsGTb$3nK-_mo0M_EIAP2Xl!bQ+qlCyM}JjvF6D^(NRzy@ z(rRwb|ICj=-yrz!dOo~~viRI+BywyZyR(2qxx|ko0X-h6ufJt}QpO#>?T&u+kgN3b zmJBH?wHJ*HvtkFCosq8Zv^p0@dq+o`RoS9Qcv{dy{iJo=G)J6BCzH=0Wk%FqXIY&; zUgNyV6HWRpgf64NvX({|k}K%|gV;MqOyXuI%ivAtdG&ker}&z8hl~# z4IuC40gJw0!Yqc{hMsTBomY=FNX#s)Or{{MjFAr@LXx;tWF&BbFw?vT6kH+Lt@$2i z4$jwe;)?#;k1{+OW6QiDY(ED)9x=YXPxb#^p(lykAmEbW6j<=r`fv2o47EqL*p^Jp zgOUgXBA)%1#xbm-sse)zgoNsIQs;+^Dfs)nRghqUW7bCE8Xe3H|6bAl7ok7=Vwqo@@sHs z-S1=MJ!~(@CE^q%yUi~BM}^k?{X6(ZBejcOZ#%9FKjICft+`G))eGpr^RCr}t{gfm z!XXj;0}-yAIvgyROAUXcIPMdUVMU}Hq2Kl@FNQ25yOIvY%GyaQ!YNU`!zvy%ej5kn# zF|S$9;f-#tOUFVgi7c$#ZI^QxNX|yuwK+fF>0++B9-OLG6zbXr&NgN>1(o24WZGQm z;upA`^r0FdP4XGh#}iOPaG9TbR&)q;oXxAJZ<;N{ob{i+Ut1h;U(&Gp$87;|W*mV{af-q3#gg^WlSG6lI;&SoICpxU>63;H>1vi?Lv z0h3|6UamjxD!zSO;Rv4*1OBDUhVY$)Rq_qp!llq`_qzuq*@R zy~{WGb^J=?^!Q=y{(JxGnU&U-WXn4Ok5NCl6jq=?_Z8tB*5`#&m=$ zVxvq{A0CGVJew=bVqF)}f`2-E>PbYbDmRM}n6nrU1!8F{$}PIZ5D*YdR%Bk0{FOPc z&M%o}C~~Z!Wo4LoiDD5+pC@APy|%_9$R*=5NkX%coHN8omkN)P`Jv6EV z)khT`)>xH7Ry}VG)?5= zaZ5OuvMe6V5GmeY{Zn7Co|8}GsO5AI=EVM(R{w2k-_zR)UVlmaqnyo%EUCc8`MESKF_l`1HY=d% zSTs25BpggzZ1+V9&pZ^?qZEXUjFzei6*EQ`99E1ayvtnz4Uw~_`*O+e6Q^3J&7m?J z3jjX${XHwju~_MT&&HpYY1VL4$C!q#$`<&18oT*kWP`hMK$VK@J#L4%C#VN`gq+!< zP&@S`^5y5-X_Bqf>ci>M%k^W8b0`>%+uM`r3tnkDi0i#A9dL)@a0&TY;a<3B+CkNq zmf`dR6P56kzMqLc9G^HVBu*ZFmzmZVTI_Y$LF8aXh4DPd&*jWnzg}fQ@#vN>O~>Q! zdcA@|8p{UaeEJM@a98@8oY2@E3;uz5VDW5U_T*nqb!bcK|7_rZz2c)L#jvvf`%Ci( zA1j*RzbbYNs>Cfsr5V%ofG4(1cj!gYF;Ia*^?(hy zJY3>>Snv=hl?yHyqEzc9AslrO20EYt_RV-^>*Pz>BB!yTtv!^9z62N2=;=GYicZ6i ztL}fowkn}@0&6MV2G8Vb0KZ}Pq|Ps>-(X^9vTU6 zhay|?o0ZBJ;GzX%rwK4hXHGEB;i#vt!?18tDX8crG^CVBm0qBgi0_@|VqNf5lI}B@ zZM|@_#^oCXH-XoUVEMe|2>}LHX0HirO%PkfRW)Y~lG@`#c=)X5TICdXos^k74FBP&{h* zV^fb#zDPZ%a_Ko%871B04J_M1p{NSBqmX0W%od>2Dg*j#VQ&n@~tWWJ;AHlAO14|bb~dN(n;u_U6JnF46%3SEWFuZ z;jwuCNxUtFGzqK`mos>HM|=TY0?Z&h*$Fa-{M zZPCvpzV*6w8S=<>ZEH|{{}<`+LR$hkEx-GGJIeez7!fr#^1GaHy;FL-daseLW(p;} z#nZJJ9DbfAHku7lWpE2tkl^*IQlvh*z?>|!#*wSFiKDZ=;%H=g zrEkP!|0XtuPp3i3)3-01F3IqdDm#ol`76!!C* z-LS=fk_`L=@dgu#%uJ^YP;p6ppTQFqNO*jRL;|V?@I_j6@sMrK2T;6%wE3gI@I_Q1 zdmQTb&x3f9JQG(>sH1tT^K*V?X`lfMQs5tWJ6Y2yUo&0&e)b?wxp1 z=jZgKj~hw)JTbU4QEKnmY--U+cxRL2@}J}KV*sxo$j<-K&DX_~?3D#?Pm#P3u9SKx z3LW97M{p^u}zP8~+N7>Ws0>L3%(DhL~`}?3a8=WnCayS^%WI`0d z?N&XL$v?I=qNwFpLQ4#JUg#(Llu#W?r-Fn}mAU3XLTs5rGR&~v<%l5iQ2qaB0r-pd zcz7a_L00J(b^35YvVoUdtylp-M0B_%!yHmjZ?8}~mr<1t4R5I&z6czpfCVF|@IUO9 z)eN4nY$4ctopGCMcBoeJ*k*ovxAkxQ)h?l=gFx)OtkmZrt?#|Zks%j|^Xh=F!wC1Z z&MNaoVc?9|$@d-_N`6)f09n7X`~RcmJiZ@P2nzoC1R-E%4e`4Z-Wv4Q=7#_Fa^`G( z+h#Zg;yP*Dp%RUB?D71I=KXYegzJ?fg9(wfH`3;>KmhTT@Z<;3wHfxJ$)wE}$-K1df;VMPqeD}E$j`9%VHniPng;cKc!V~f zdLXBG9tL3Ahe)6nu~0yuKxy=mKk6?4?t{zi1u^U6>I#52G<3RK05CO3AggQBg4gLE z{|Rsz!-hvB7!$$iiUF}=j^8=-`1`+;2(P_JBo%IB9NUw#3z70&A-GS10cIa^EFr71 z^2WRYTY;qzg{XBg>JU`>`9ki(FTvqV9?XD{gG$FykBsPn5NyBnXmibn5%9U%> zQ_Yld_#yx-p=`%6%&?Xz6f}=!l=gVB=AjvskuYF#O#BN8ShpxBpq~tY$DYSb-^2!8uat z6s?vyRGD0>$MZXdEPMzoQsVqWw1Eb>_scl0Q6`Nu4|ZuFkKalk?dorQBSuJ+Q2G!U z1m3SCJ8Zfoa=4_DkLQW>KI*@}b2p}kdu@u*3623vMSzE)euLNAH3>GJs?zHqTCCBT zGW}YtkOKema5hn7uS@;kN0<;wlRb2k1>W_->Mvt+jV>~8jantlw!xCU(SMAllBT0E zl=M^N8bp9JB@`)?Hfa#OB?-4eICPj2{_PY35z}4rx}88EE8ZnqH6e8?P^dOs7Xc$H z4FFd;eu9KU`x2N$PF7k>m{-Gq+4WJLCHKq}FZy?-@u)v4`Kw!ysX3_t85_DhLk#c( zc~OC!3L)P8V?gSA{usE;(Gl*7X*AXN-(3%S{^MRbkY590kPd|9Rt^3BWcHXkVO7<- z1!6uFjY8UPNlz#nb2taCh{Y8~UZ6a|Dqy*{R*0jo}a7Cc-v4?gO z{{gxMli#qM>k(Qtd@cfB=807LN=tBnKClS6+9an? zc}D_Wm(t`S9Dy96vVbxX1f=|0Us%<48sAm0Ot0^90q*uz(}_V}o6A3`KdS!k@7(*U zfd?YokU#>XtK(iW6z48|>YKPe+gtg$^W8QNZqd#Td0|0etLabYV@6xgF@P2c@V=-> zgCfchH&a2==|zgrANA4pD)b8`a(v0SlUx!M_}!hTYK zQzZ~ZZdKSu`bDS$NPUwnac(gL4n!n?ezMg;kch@sTu zEGh-1@@4KQw;2oN7u*^@J?1aJS#gnlUslVR0`bhDCd(NS7hHbm>FJ$#4Cnjv6;|dm zfL!EEXZ!+0tB3wWT0Mu7iWMeE#D+eP34f6RL})O|Xezxd{Q|0P0QNrkL0bK;ak`GAapg8UQf0Uh7SXN!suIZBQ?vRjf z=`QJ(2I&^0yIZ=u5$Td{q(Qp71ZkvkPyYS=2m5fJd3ou2SIsp?JmY=_HFkM2%FP{j z5N9~81-g%9OGj#aKZhTx|+M*2Ymryt%{YHbuKrCmJw2qcLy5)QyIC zi|esww@TXk0Zah{0JcN0zECZmu1Kh*+FEL`!dmV0Awt4ofZ=oAb<~m;NOiy5AAfTf z#zL32Z?zCF6+;-&gDrsMEDKl(w6;ri12i<3=qrY$iX&5DaJDd;T3bDJwD6NwfmTM02YNyxwatT zsd}$(c#h12eV7LUhxs+H$$PKAOq++W>! zx!gd1*XGUAi}7|lfJ&a4Pl43|pnx0!JmmuN?1%;dC5W);tu$ql+tDu?Fz`u?&7`d? z7yB@<6a^rkQ3p4_=dcU~3fTX>|9YLgOqbnu^&=cfYqWv+a19l}^9(Z?h!h3Dt4|)&9TS{du4}^e_A{9ME+HVOuf9m^wda=ma~_-=&)HetjB%Yb>MULs9e1i{ z^+<=!`hSPRQ{En@2VzC!jL39i6zCm^h7^i1?Z^SNPdI<_T>&OGDi~LSvNY2nPdJh# z-pcRk$H;D@5OAjcMbrX&6b-rX73CC=Y8ZnafM>J!IFQLdOLid_o=NyjdK7-LWChC zRl5(z5fVW2VDWnVUwj61PdEG^KJWXQipH>g>*mqobiPADDRt2+9WE+H?CI&*=IKr= zUQ+4_>%;(#O;No1VQ6DOd|w{P-iN>qaIWV<1`Pb{TeVADRgToQNdPtgn+lvLJH8}K z2?NzUk+^Kj2R)H?4%C3P98ybk~8lu|JI{5hFwT#hP7vR0$Lv@9eNkt1d!Bt73SO z2EE;oZyMmqiV~begTkGierv`|Il+2dgoJYEV@RkH#^(!J!o=@7VsZR?4BLRXX#0+t zZyI}Dmp{NJqgXOizbRr25)b<~?bHFRwOiPQJie3eM>E@p49oG2Q`f@LWjxe zZJv0&nGo&2bZIr3cwPGET{x98C${y*gJrW;LYzFCBXz|=##h#>*@L%ug%|`B#L2%S zie--pd4Ay<%aH5H zM7Fth@Ur8z*#Z|yIW;*S#>+4y)~@kInWPH^-=-#hM&DE`oH$|}vSuJaU4YxfHU&|j zeqtK$;9^#brm9sz5!ki9f{Fp{^`4v~z;X^^fd4Sawu|{cgiZ+Q?jD5maus+tQmyR& z+0z|iqF*78PRKuCUc;`}@Q4-Qu=rc9T7HAj=Jl_Phymd-2AGDt9`7~W3Bmxx#-8jU zjn{bN^{;kbDTu`4%mM!$k~kUw22oE1s`&rsh?@xb(tw@0gYS&^-yt`R0MgRM@xW>B zb=wEO(#;EglyK;){N{g$gnvD&p!ad#CP3iv--U!u@rLR_{dY)Sd~jAIs~&o;|D88$ zEcns?_eufQadTp);`4v!?F4?5GnOLtHI{ijB&rlRtN-6y(d7n3fY#bx!u84#%6xy22+40Pb>;~TCo1lm1xId-?$as``KRoBu@4p~jU0nqM zpygNk&$Iw2Otd=|PXYxE{YO1wVI0E<3EbiI*BILlW+F!r9v+P(P&_QQ8;rwQY8@cl zQ&3PSml;96RWBnq!;Pk)i}kO5z4GdtmbivnpfRm+I}=*0cViLoyk3;nwX^2{NG~WF zd0e~~Igx^3#BrR7Vka1UG4KpR`GdX{pap~lcD_7QWZr-T9XXV5qd zNkM>|C8wZABwRt5ib_nWgw$r;vYlEWPit z)gy!$lH-*xij4gOxdP#2xseDMtV7(A3FPUb;n|}?SBYl1UHbN#GAbb}-c6x{0 z#Z2CR-+HGkMy^?@{fhJh@n<9^(c}(-b|iSbDZS&2iRdjZN9+I?h^W^#DD8tu+j*DC z;y?E(WZSD(U zWKeWBaJ=_MG}7LmeFS6w0zS8tthIZfA`(0)WCsiOBwD$>0$!*yu*S~?ai4xdK)piH zs}IJoc3cV3`=Xp-urbPX>iK7@G}Pk5ESzB)K!};I+0X083G)}hc+B^~N~Hl%2{7_v zL;~+F@@*C-zJenAvWC;WkUzK&LQ})$JQ&SX8Qea!aVI9+HF`PBFt0RC@O}TKk%G64 zKo0J}<*`400KhEwjA(p|xaXsi?v{f&Co(Bzc`p)*eDu9CWnm8%Tn(VM%G4viGJp`V z=&s(faEk8NeUQ!rfxj{^`Iy;r4p@I(TI);Ip&wljPW6GL8_Mvn5xy*Qw<3&Vk1v>2 zSSg39UV(f)mcL@1>VS9{YG3nJSACtF0iLu!KNQd>h5Gt8yjSxR}8;O5ricz^7=|6B9c94U(7M_e%`N)Ys%qSNyV_d zx-b0-(8Y$K{>{(A;1h5?EpPmH;WK1kuG2Qc9X}KxIPPR3J>E%z8ycq%an+fQCLK$B zQ>*#D?Z-@sVqja~6=rBv+y6!Cet7cf4NA>iu3Za;eE?2)>>9Lq`^c|f8Yy9dd1s)O z+3F4m3f*&rj7JC#4i4W)7n>=;@tZ;FqLPluhe9J1#D9BA;s0!UwD! zn$2CN^*|B-X3pT|J`O11r*o{6N1Lt#g&etHhzJTX(VOGB5a1_|G0d5XC>@nGCTg^L z7qJPTv;amJkVLPRMwKLQO!)fcI3;}^`L6eaklS{($Pj{so>Cd$GEAr|G{4)n0#k5S z3YBNA5PCJmeTvtN-YJ+29UY=j3N>u8)-;nYOWp)EKzq!pABR1-8>HoV@(ZM^2!vu6 zK3iynvwnVJj@MgZk6BQ?lGICv5VH|f$b zxx#*sYhKrZM;zv!V+Ror=;1i>EALc+5X=W>I0@+k9z!CQV0s)v;g0d&B_MF<$5Y6% z+S>I&uxuOcsD3t>E&wtN(cI2w$Xl3QGg7D!B-|;QO1sQSm*gw;xB73>Dcar6I!m_& z#?4^PKSNKnWC{EAm<{V?Wh0zB1b-=Ts5vbj^$h|B6GTb9QKJ;Vl7Qm})4;X&{UyV` z%`i0yhIRa~M+_C~r{69J$jHHFbk*5-N&T z2F08h>@X%Bb|Qw!H}ByC0O37qra1e(YcR<8_@$kytgxY;h>WqZZOLrcFH7C)J=!oT z)ypY2TLo3A4%clEu|m7S6y;hXS8nsuo%r~t)i>A23oC*Vxn68ghh^N3Q|K)A`M2CL zaR>xwE1;7Sak|nXTGc!gd||3^zwUg!=+vi7qm-kkG6*nFrX?W33^3=Xn!pV|b*~$YDDkqLsnkW4t&e8cFFHd=m;vfb^F} z`_J%bMnAu9Rd_oiQ>)m$+#j^lZ&2;IOl8I@Qul?Sgtj>CSYy`OuaVW5|Ka}tG+cuN zcdxwW)rSbImDkt{?(qPWkhc3)@uJCl9ZE1>hiJA)pEu~pzKwK;%&#<^Des9};B^>; zfRAy-WqiN@SMZ@gAeHxb(6v*mH+OaNBo?3NOFt*d~HQ9Pv^4F1|S0Svh*NX7MhKG(S zi1kHID3z;~a;sIot8*-ejr(Ww=DH#oq<2UdKA|+dKMVZ)_8e5N8*7^2yu0@%vZGpl zVbLjxX-^7mk3#uEpDe#aenpRce*!eJg6w0y`>#eA&nd#qQV}oK`zK|l#X-is&FtT? z~z;UxAR!BS4k4b>7lE&cs(aX_V5Be>0i%JXZ5 zO5P@KJd>3wSCi#^ky_z2(vl0iJNk2&*JRCUYbW0_OoVMC@WjEZUbzxb$Yhezv;d(p z*Y>};+teCq@>pwcE+I=W^&kF~uIF%7_+L00E@c2*x+Aon8zD`n=cAb{%ykmu#-b_0!}Xwv*>)HZyu%g4<;K%YwIpMWG*U=282$jVtwBc=`QAKSCUn zuC-ZL#mzw-V)@q-0{FS9hGgzk6iZoiO{Pv3 z6tkC&%qDvb1iiGmJvHp25s?qc3qNHOGov`)My90XdsCn6X(t#FeFJSMZOpQ68250= z>pwi`zh|ppxvbTxnEMFE#r@+D#`{!NFqtv;rC2cwdP9&HOlUs+0%+K|!aW{p>Hyp? zaqS@EK2NKno3@Y6Kx8wPJpxfJTXdeyQm*d{EUtI+6qoGZmMrw*!4=D!j7Bh0G_sPh z7ykDtx1$iEdfQS_01^`cm?@p=M$V|_TmEapc5`zpRn|pnP_~qx7MtE4Sc^*9WbUC{ z?E1V_%))Ye`uFsUl7W3Ei-%itJxBfLv$fUJ*u_xguoX`4{IlX~Pd8UnT}@2029 zb&J_i2(hwI|E#d(2T8D6J|@Oxib^Kr2>=A9zmDfM%(7U&WsSvTIwRvU@VPSH=zO-n zum=X*V`Xk9i+i|3BPh408+d~j*KcBzUCX4tcv-2(%)foy6h~5X(!pRiAAye35XZ&(aC^88i%F+=k^*@OpG@5dd4UGG^T^sDir7xgf`G3`4i7?+ zP>^hlHo)gQMM_CSz+ zu-g5m##dN_-;e9S5v_Jh_nHi)&|~t% z4G;O&nya0w^`!kC6BVH^tM^=7Y%ARe4`oxt=AO=DRE;)-1S!Nrku#PSe5z5^Y2?c} zg>}cq#Oim0Mt$@1hc`j^pnmxQ|6gt)|RjGhwe24Eh$A~TqZ1+8N%K$GaXHor*^aQ411@C&D%V%pp}d3?&RT_f7q`! z5OCWq_jc%M68B(dNqm*K#5W0GOR`Q#V>C)OQu)KK5N$6ggus@XrvZ`5>rvF-`@wg0 z<0~}HaMJ|^IXrJ+vhKP>Tsz=RL?z_M!^ZG<3T_Ln%#M?_r;{lY4h9Jq$X99}>S4M0bisRzJD-UI`J7WAME1Hkw1 zNRJDlcPfFxNE=o-(*|`#VtHzcQn3f zLRT5oKrMF|k3o;V&(7O{om?8#`NJ!p${;JCCEo{<<++5-`Lm~xD957>zkHV?)m3+D z&fdSj%0k}@-L`o+K3o%^U|*lf)h7+eF^pj`a9z!);YJ(x6@Spmi-#oPnTk@OPohMd zAu?-(=u;@V&P!t6-a#fHv93{1JeQ5Ny7c+Q#K9PEvFY#o3ea6*ZgGfxJZSe{P!%3o z38MD#ll+T04wtqHY0<@Px!`Yypz+)B{OcAvDQQ(*Guzs7qR6Q?a(%|nm~9|5W3|54 zZnkV;0)qB-$e8In#KfIiL==<|V1YQ)cIpYK7HDkE${5Iks20JNL=Zkbh9EB+O)4*9 zQL@!{D5tP>2J6Qo;J+Ut^=3oJ=Rw>|JqZ_6?_oOy;xuk0?*nubg?hfQ3tX-4KD;-% zV!DDB4J2a?U|}(>qx~y1Clecpyq1qI1F92{4lMid<21|3gvPic59D!0Oo~lP_pBu1 z%X6lInmV3%W3{ZMNI8bsP%+?-579CVg?WJRFVCqkRO~VoP)d8U-(SO~SXmTfisxA; zJTj|cYy}5ziM4Rr2JxeSk9@#-U{0-5?Ro{$2t^^02&y0m zo2Sy{ph|{$g*<}-gv!!;W4HPaDf+X2K+njuNAR1U$%Q>0S^<&n6HKizGa9`tk@Sv2 z08Sg5W+csKbg$eN6Vp%?&vzhPWz*-EvcS`gn*{yz-`sjxKkCBy_Gr$5YvGn*+hR4t z&2s2hF}oJMP!H7aNDWn+YHy>03wrwZ-lg~l+?h-;S-S&Ut26&m8}7qW$c0~Wx_r(5 z9vF2n4^`xCSV{UpC4+`(VTZkR2Q9nRvQN%3G5Y=8(R0LrFP1YcY2!l^N`CY{>%t!J z3o)x1Thr?@&}V>TBTc|vg)N==i`OSUIq?Dw_w8>D@Zc&@eLn5F4UccGcAAG6739oN z)sU-jH#&qHY4(wRazwa3%;t4M0xb6wIdQo=RSdJ};BWkZ=4h%gS3kTIs=WPTV%c9b ze64duBSWwpOyA|+z1DV(iqh}|k~`G9(DmjGh!zQxlU)dl(owBSY*J?qb6=`3`{vK{ z5QIdUPLW_4rX+F8r;H{1nTT1FMF=Lgy|-Z$@VJyfMX`)-V8WO{koUVEx1*(*sC*~8 zKEd^Szv&MR*R*z9Mw{`crO~0-Z2#p(8|QdoN=i)Ds8DD}KU$57B>54jhcmdX#;EgrPI&nptdc%~uv{!wm;Of$3f9~V{s%sOffc7ms86<1 zb$g5C-yyxE-WHHuJ2%ASg`4Oxug$SFp$h(;g500~{;>(eZSJj$dpEu4hId8a$b;951slC6O31VXUhDzD| zTyJ$w6~xc&YPiUYA;V@=KdCO{}K$(Y5P-o|%Y!lX?MMCr$e_g8Z2FKhqxTH|6sVNEK zj5DEk?>f#W3|ov?5?fW8><}VMraqpqTppDBa~)bj%H!;frHkWcbL+3Lt8R?LeT0^> z60t%o1IBKu5fA6atJW0i*$V!_qeWc_ydR0St;u_c#Ij(24WbQbWV=oPnCIcIA5;yG zzu!zlnuORcuO^t^R$!6j`Aipb0>ZheWc8WuQkE{B16W0%!BP92Qwm(;9}yZn=P8JX)9Uk1wJ;bi?Q= zmY6yPcBEl z2B>0kzEMddLnEK%!RktrXn77q;s$Vk|2SyC9mJ-0w?o-2D=HQSqZKM!rCqshh+tUf z!trTDBH$g|RqMCxA-O7UJ6+KW6G@%;C~0X~#BBHMKX01gu&p6F#7dQ-3|(|072NNz z&TnFL*pqudFO-zLb(^LP*}9rs2~Tj*;?>1YpBWG``;rkqri#TtT}D7bNLU_uD`G52w+uI;(Ieau=xflf5u~A`19$XB?x?TJ6*>@+B8|$AlkMu0>#2W zIwsDk5G`9?iZ=X0t53MKK*qq#$^Q!;Q+riy+d_M)4_yeGW15%r6%Dy03pPk+54#NYErgBa#i84k{`qWzJ47jO2>$u7lQZ;?o|c&`fFEnZI%W zU5y-YjmI0_fZgJtOkjph$Eds9U8*Cr?D`ugtnA&imc5D7o;xa` zz}VCXE&(uLdSNUsGWoTHVamVOk%^1l;ji=W=um5IlaD z>;0%ZKcXXJGp)6rBV25?d(YMJbbr;e@TaqA&`omoisx)(#VM9cf$i2&3^I;87;Hv? zB$PPiG3`IpBErfN1VXgko1`a&q#{o)+MPlHiC?44;5$R!dmk|fJ*)1pN6-TqPN=k) zAeD~AN0LpXopX6F9ZSf_Bt3&UoXWz|0Cs5IYj=0K7<&OIWES;ry096XR{dWKJY+p8 zDFmFhsmC6T1L(P`UBn5G%jxNvfAa%Ndcvw_fg9rN;8!B?0B>l#wu+l{94Xf2sX^P9 zwaD$L5n^IuN5Z28j`XpmD@ z<$c4;B39?tU^^|)b8>Z*uf|5&($!*lfyrA%o+J_-OQ)xHC3bATYVI2_)NuuBh(EB_ zE*Atx&=oU0|C{trguuJj&pEy$0`1-~&u$15^+D2(e6z zOptZEcQ?ybTmN85ST%Rp^tBjul+E5;=-$%c(2h`ULzT=1^;{ zRYJJI>;iG`4-wCEFAQiLu?R2=z#xo?{=?h69=I{Gj zOSS#+7!|@H_k{-qex5=kI^?pYa0hQBlFiG$`B&55 zDS>~c35vS4wBrjvmVlI4sxYGvMhEG2pIG{3Ty!OJv_waCq?Qy(71)XUL7Mw;NGrF@ zo**Xr8eO7k{Y>RyX|TD4HG*>EbH6*sU<-Y~Ui*>~BKgbL!c&U$<2?F$y9d@_O!GV` z-k+G$l~O#9AO)o;#Sj3smD27qroyShkTHC!erL4CO@tW>Hab09@g&E81=-J zq_{sc4ExhW?m}Q07;V3Sml=m+OB}zw+JAG=sm(>DQa~=vqmira=oJn*sB9fw0cRpY zCr{WL038OQDSqo>bOCz|`Wy6WW?T+0h)M6%mS-ID1%+S<7n}bQ2M-y5P02qetN_4R|hjAN3$MP^jF6O9lk9RGR_OcD; zDW7ZR-gPsvYOIDP6sWa_)`Dro6{IFOIS$HY&plaRr(&O zpTM>~Gk!MPNa`J@0!1f^Cd?>)@6zXeD7aEu^+QSPicb?svd(vErQ;CZ@44O}69_=4 z$`vKEM`bk;?=L{4ND;EB>Kw7J7xqe^r7?Bm)SN8r%I@g1d=})9hdhhK8SMj=m|cEN z(*Ad~oRLS}(VT&IC8nGT8Jswd<+CJ4CXn^`Jr6eiyF&B$ghoPxEE_Lxh=CXE&In&_f1owaha+X5P+Va)=eCN?gDn{=^h5RL|jk8^w`! zB#n-ZErEnelz2I;L-)7#z$VY3D**HXjYk3)J`}_Sb*Ji$J$wCof$sjKrR$jLpW7tN zBCv3P%_3BJn6Zw&oeFIcECtEzw5b{fZFvR7f3D-lU){IS>O(Xb%Qcko^iRkES{rQ& zBoLlf5XTfRtbX|hC)gMHT%m5Kt2oHyom1OFt#tUJ>exbW&eM%>SQ{zYfkLCahIO7* ze_NNQ%A>9Km!WSEXk7g;nExX{HT+QB)40uU91#8ZW~c7(-|3I^u) zT~D4JXp%z{vJyB}>G7d#+SWI4p=&`;SdDKt;d_M|Buxmx*}Q1K`PgI|LzP4aSR#49 zoCZ`PC+JGJf~DwYOLTTl=R5F#h*Rp|qq)F)E}FvV)a4X%3d`>3IZM_gs9cLv;up&t zu2`?INh0r4ZCLBM3P^xK;pk{7;S2_NQ-8pMCn#wLbqF!wBT9Y$?{3C~*ZVGVuAuw<;YkPJZmYNKf$+a z2xJsK$IU#_O7$z&WQzWqv+pZS-$8z&m5{S+GyJC-WQngF_#5#+flt)d-vi&|Au|lGR-=! zM(fNsVM(pUDgfR7b`Fo+;%AfH3M8Y}_gJdX<5WUZQntU-SVo}X2;hd!O8Ak2p)gee zVQ6Ft45x+23xUU1VshkT^^vljjZlN4rUh>-&NSdZ2zG3!#h-`-$u3KB1X`H~8*5eJ zo5O(mEsG6IVL`z*0k9d^S$OUpxxD){#KfoxOGZX!jNF9L@SCJz@5>y7Z|a3x#D-m= zzxlv01rZ}vILlocw!|0$W%bmQvP>dvW6-;WNiS-{lbO=}N-CQSg8X>4AWjFXs!I)E z0|WviruzY%26sea0e2b9A={X=MItQk6(gH&H7J4ge;M#eB#`{U3g z%gtC+ES}>x_q37yo0Jd63YpfOI2>wY2-9mzZ}E9Fg?LJA(sA^xzXHfEsTS28B)y!C zIY4zaVQ^lN)O|9|hkT0Naa%(;oUTVR;^%V9n?oqbPY0tZlvLq$Qv#E#!{rN zr=-@i9i<5lGZ5~)Eq23$3L=JL9u*tBvzY0o5=P&OKgF+a>V{UQyZ7VLmpl5K(Y2?Fp zQ+#^2vUoV^+l4B99tkphX)5@t`qq=BddL^q9w5sy0w%Fe%Asgvm1+6kZ?Qv4*U z!QrIWa1QFObJQk{g~z`U7_6NVp!0}cN-v@4LN1J4 zuHb@jmO2N1^I+2-LN$DUtaI)D92x^QF^c8E9m;*f1~GOMQd6GD{hYZ{(T`l_rX%frK$)hou3h71r zb6c^k^x|QT=q~@CCvW?GpcnO<1{m7EVb!$rK~Q@!KJR%FE21+9OzIrpC3Cz6Um-|1 z*s5heX6QUy&_MRDUthK01p7`YXSMax#k{1AVs-|C7j5>Y#U$kNd|H~U)j-q5_h5nq zUy#<`@!4G!{+&#T-gIz8;ubJEjdU-UY`TS+vsUaRWA=LCb*UF9fMs*W9feryvO((f z9o*aJj9QLf+OaYMAxP+IZ(HqcTKMJCv*qqfrky6TCD`4PZZ^AcrheNKIlr&Gb`1>UnEOC zDlz&Y4Fx=*`BO3w4e>Hj@nR3Je&H%j)Bf=9qTrH}jkZY60)eO=R>Cpf zeFe$W4DQthhJ7_?xIG;h%()Fg@b{EzM*`j6k0t^r(a*N!=$`1+J)Pv1c^d^v!JVn`5H9GB9<}Vf_J_Q`D zmP7B3By*5fUBMPl8Y6#U(XJuCX9R-%F<07wKiVUAS0)uv6nc#hXp6uiu$qmvbfpH^ zL<03AN2{mi(BL`xd$+QtkIgS(K{eL<8_VI;U)M!tp^Qdit9w?47z3j5MJ6{m7;tXi zP9LGXI)R=)-wGoPP5c8967dk2#~ODM$ShKRPnRGFcPo6A82u48BGsw~3YMIjdU2X& z;-D*)rLVz?V@GetDR8NUm8&=>FN#9_0k@zOYW1R*+*84F6zZB#I3>CEn@m}ksS;VI zzrkFWni4tWEt5VE%acQ;Hy56g3I_idqr)Up|0B|&7$TJCpX_Be8brHiXJ;&#P?x{w zZ2Z5e^42p-yf`w-pd2P6%Ae^_xQVye+-?BJM`td69?4wD=SMN1&{rR22UQ=6+#GAD zB$C>xGJU15sydXGGo1#I7PtC1R<$hj)7|}Doq=DmBa&QdnNH6}wV(!%2~a!;BJ@xT;NjQC&O5=Mse`4E1ueELfAb!FDhj z3{%A)&j>eqngthH^=`)0yf6AUa^iteEUW&~4!iaJD)EE zG|V_PFnVx3oYoWTI?mU%P&X`H%!%SNtFfde9iFZW3Um~hcb}fVc+n^I#RxwvNLm`2 zz{$S<8PGB;v+bZXBA-~=0%*3hj~)~PI^n-wc1@4!oC~tC4f-wq0LU5kU)8t?S1a}E z4z`1>_bG@|AKbT#${m5X-+}q~klk`a;Pyb|$ggRelh}(9Br~f1X_1A?dWuU)mn@sV zh+Zfzk4^NujNj~qBRe>s-u}Mvaw8S}QTJ(c2IQrkMJpGL#|y^W{q%bG`7;w`@qIro z9nlY(I3LFR%^HFD#W7m`yzci#b+htzA!roWE;N#YJOL}3m`gJOxt04EQUEjjn4&pe zAV)9~Jw?ops%%ofyJLY2&UPv+JwPw|?%gTPmbRQ`xpoB|0BfKVk2QOOVv3SZB$I4Z zCIzvuaRRj|X$%N1;NA&6sv1r zi%nWT^oz-c$8Tn!K6y;++{9AI-(}7cJ=|#JM8+gX7fQz%NsheB)~Vlbu`^xj9!C!i z6E>zVW%^D{z1lM>&!2)Q$mm30>vhXq*HVX!*qhfQZoD@#=cG&*zo)(KuX6-C{{xvZ z($hnp-k-f_km*o4)_JocOxIPF;GRBMm*eM4@n~~gY!Aq*>x0Yz9zX`+ug!+=JoMIQ zq0*LPc(S_k;&KsF1;r|7V{uk)U@9BKxNeiWqwp|TzpTO_pe>{bjbaRepxG~++A7XH zsDq_Up|4O#2WnwrO=Es|aK9wL0rkt@!wOuf6Fh!lEY{Ksz?+9aN!F%3cHSH5EzR{V zdUz?g7)UQO7_H-~&*GFt_l922 zMMJay-Nv7p+iyghVYXCS_Go#CDv?XC%St zU!R{!Sh&o+FJG7jCF5|os^jgT96|i2>qSnR`@8;1yL_x`xUIlt9>a8EvZI$~whfVJ z;(ARLj(OkJxlE#5=?A8#m~96QC9rE~51Tx-uvNs6Pp~=#ng(M?2m+gm=BIC(2V)k& zX|5vG^!27w0_(VnUx|br*1h51^a(>lK^bksSUG6)g>c402v&F>*P`iSmFv{MO)KSe zQvEA?%JpW@U&NtKBM^r&I(T~^N;Gr+oko=Z#nh>4TRCk-0o57Qj)Fz7B?O4+(vBdm z4r@busUhDHYP&>9QJHZrN_~Anz5d2A$sKt8n;jd=P}`ux+pY|`J&ou-bKt2+J47l9 zBdcpu`cO79HENG%ub9Klg^f9jjx`&@Bt5qN;AM-xn);9VxRAdb4x`L=nO*-Sqc-FN z*yOEc%TA@$3?#Xn(2jYFrsEtBMySw;k`K@OUhYgD!=SM>LX2Yq29Z-bd+}ENer`Ay+mEK})D5Gvbsq)G zVGLQ2)FTrv8lsNd(-GcPP3Ahf&v<;q!=3XlCG1lv9D)jEK8NG+UjzY$1@CjShhEy+XM<|&N?ZsDTxa)Zu?t^Lo0rQkn%(J zH^KSTi)=8k@ZAmie*~SMJQXk-1Q=5iFh8V~51vdF%S-=E-|0d&soee4Bz>1HQ!Aq> zR#6<}A?5Xz>lAqWK$!;_qX_(^&HmK?5Xha6(xm&pEP$Ujo2PR_O&Cd9iAQXdIZ{2r z^Ihp6%z^rS@o^n&_9oM;Wu!3;IML*&_NS{JkwY>w0qGRcvD^+&rmH6;JUMnF%^-`O zIn?4p9fVzy{BktQ)3PPTFF`bVP1xe{M0;Xr@#1b!9NE9Y{!-%6+bYcSmQonVfKMap zaS$Z}#zxt57O4|j=e%i=^oUK5)j9pMW+%n$nNrV0+;kiKc zJv5KV?&qsc?Qe4}q+LhAB5gP_Y?3((7U)Y9a2KKxj%6}<=ezsSUw#-YWg;AlPECoI zVre=a{pzZeiTGuu+?8|a`e>quqVR0ZhqxdMA$hiq`d&24xVwW6>TKgLa1~hN-_Pqq zB^1f|rt>;90%ig}e@|?2nlaxuL>Ui7zgkWwsR_-)K3V+n1`d@F2_z1wVo`QG`hq{e zG(v6r3A7W69-j~V1c?!uFvG-nr*$x#R3dS04xHyx)3p2?j$_H&FKakT;~qe4Z46or zVyic=eF2{bm#J3QH(W(!k4C&i^5=7MCkq?C3vyyAeoPV(u=KU-TWPge!Ag8k&LJ*f zHjw`7p|DYnax&Bm#;3`g4@pdf@;QTkKQ|!@y#GWwak1{#7dx>mT9B3oe4|!*7%1eS zu&BKzYGI%{iZnHTZc zJt%DH&d|o>ThEO+El=NF25xQ|$)vN>uw0Ug<8cfvij)TI9*O0N+%ugYPH^xxKCn0oi#`;BwQy>l&>e%nn__Es{J4wP==lfvdG z2Pq&q4J-VnZq@h-&zU9cLPG18f5s4uGnc~WV2yt#f8}0a8s6Le@P;WlklAMfoAui5 z=AM0rz6S>HJcKA$&^!z%`H?0&`}@o2Lq1cFF4`v8MdJa$1Lo{c8rrxLg01b`8~vOF z_CQ`#7JUTz-;Vt zWk?REGKSpx$ET>YcQgis7N5*Ch-1(hrDF3o^6@N??12v~CJTxD2^SEL^mUOESwJ@$Zq-#LNQ)wyuvj1cv)S$s~Ph zp+Wkm1QZgbwpjw#YX|rIY{QSG@0y^#EX!Pb)c?B1ED7ZoA^!X>omDW*`m&Q0)%oS$ zUqvDDHp|`qw+A)_`O*h7UcJ{wg^Xz4a8K>Kc={fc^%pz${p_Ha0W}q$pk<(}C28!~ zF;DQlVxb!v9`(ma?~OO`%oVfF13@g?K~TUIev^MyOTz_QW$@kVm#^^}dtE~g1b-7K z8M6@4e;vp`hA>*pFv&(&A(q>jm&<}RaBg^EI9o=aoAcFKG>V$Y#trpwKm^` zgjvSP-iIvQ7U5Pu~8S(|JB5$;q!8J(J(J&(AgO_3JCu`qKLe9njA za|d2Gr|^QF*8rp8z_H_xbLt_oc6(^r;eOr>HNH^2F5d_xlhQOa&H2r^LXNXkMh_bDcM5cf9CFK!C zwmA=OgkB!>=*3xxM`B-YM1WT*5C^I1{b|5_vfKce1YSJJjlyNYK;FK@`Au5ZE@0{b zpO*35IW=-S*<;gCh6pypu|uzKAuq7;-lJom%Vg9dp)E?ihs~BB+u8Li@_OD zaWg?RE|$uRq538gc?(Dh<}TSPH)2WJV1jsEmyuP+pHPyC-^=D37`)0(c3z)Bg@?b_ z*yblVb~`OEg6OpU^GB9E1;I~VqKh2zFSF{`w6`nQA9vMKzsPf@g;&i_I?(Of&!d#-exj&a`$Be^}4 zX?zRa^oSd*MnrV$!}doQ$EUmbvi~nN^dSmdr7(a0JRe&05L>7(GAX-48cn1}NGtB| zPxR1n{aZ|X9B;n!R3Dk2n#XIg@L6J6pXvAz%FPddm#gfTh1R&?sGCXe(26#j4B?ry z7*J941=@p%P_%!9v(tgYh;KSUfW(9*rTJiHgELaT~MOWGl0GDH# zgz^+@Lq%6v{F!d?r}qYQL_0#_ug`n+?mDkoIPtXcfx+@n?Rp&jSAc-e?EbnmA6W8W zp=hbY(%+^|{9E_?dqcU|rSO5*qQhOBGOYmHqU}HG(4sOzLhya59}SiZ;8&N&b!Jy5 z3v{ru$ud|>OLD3b%iMa`M{O>jm1R|=_mQXxWhY30oimCfV3=3GvptqGrnLj5!_@U) z$T6)iEoLFcwVKQHo`g9?Q2K-2k4+da_3oKJ2lt&bP*Q-+F`^H9f0j02jIt$1S06RIe~r* z+)BQ&+O!>_C~d>S&_5@(4#BL`Dekt4^ji|E1^u0Kt)OnK80X6-1R~Y3`%?(Hiuus( z5`AMSqbZN2h`Gr>#5nR9fQg&Q)In!GB1ldhAvHn8RwSJkOIJ>!!T2W8hbjL&(Q@*! z7KCukk7q_ObbW<_Ez~G%L0DWS7-QX5&{{o1n4j|7lNOI51^WYdCZKV;K$>3E2^@^) z=Jm_i4#ZXARYL4GH@u~eEqiT&5#RF1`^!V}fW3H$Vt)GHo(vKZXdqQo?})Lq3l4ST zSa?a(KSkJlKqF%KJsQ+Ot2`qtKZW9Ho{dCWXBIC$ZtuG9C4kqKF0l?o&nX~%%rT5!Z@UKAn|G=3jStMryL23EK|&9mX-+@v8ZfspV|C6*oQY2wkk>C`4n`89G}%hqMjN|8 z&|KZ#CRl=I4`5#ngvTl44cMnWw|~wX6N*1ThXPQTD5l_M2g*%OXPOPZ719)y5Wk}G zZaS!SX($w2jhTM45ql-an6Gz7%P=7*_%dpv!m4#)(a|BPO54(iR z*~p~308LH@Y*~2*hig3UQu}?>$0}~JP@|WJBhK)hVVs6MmUi!7x-j2{4DQ^L5edJe z1F4yzp7;|sQdacNY)*ZRhkmm<+{kb6omPi7w9kYRwE&H_`xMM#b{M9Q@y#A>OB)91 zY>lEi%;WxKHdZMrf2cya!H)98yjb=15`?HPCfJtovfyAoAFh8f_*qapITHsHwF8IW z5cxK#FH!w%;MAlR!Gm9VGP~;=P6Ha*kYC%{ta`O>ATC=c+SSVg;TJ0TbfypWj}}DkS9mhqLK~3|4o)bP9p6^_9MR6=e!kPF1`E ze449?Gh2#%7DqBruOfIYo3N`blvL{U7B&;*AH0((LC)#e@W9*RkQWtu*ix?Ntw2gz z4~lU{MYK@}1Aay2{H2CMqQ$&z?VQ_+r#fOwaK^A(7}`(omRRP2<749sLLbtvm@L7O zmcf6sX)HOYHsu#lM-vPJ{Yj9N>~zG46gncCQ`cye3sBpB>DO_5D+3c`ZBtf4xVlP4 z$a9+4^K#Q}8Eetf<9qG!dDe>entuz3KL^>=XVZ*cOzsZdxjV`l!|sP1ot^?8b-GK( z;;k&3fi^0jH)X|Nt9wDb)4mG_Wg&wvO>Mdoc)T61F3q5Jw5FL3SqN$$*{*-Q-_?x7 zhg=;i-?mdE)96O%L0mEqI3&?h=H-b18Aa7QsZ?DX9d^deTut_iuUiO`$`nP|heNp; z->lVMIz+j9Z(k}?M6OF7I9+4^dY})IV>aRsC1crZl!G^*(vtW=Ub+GR$M-Y-QQ1L0Rh4Ry+U19@g|B>&8Sj zb1FzxR-=bz^tvp38x`Ht;(Yp@qqcx#eoO?eun_L|Qw6s-rH`+#uf!iM0rEgClcxKxdLUWeHD3RwD(ELA&Spq6gY4^Q0zI4G?tn3qe96^f6K; zX6ps&lcn(V5_rP=FfRH+aS|0&|3c@n=HWxR$b%RtF;GfXLGq`cN73#CwRelwOWd+p zHGDTqQ0AOzx)UAQA=Zlho3z8*iY6B9a2@rEg6ctjQ!aC^%s3d?EbWLSMNfU*-iK)f zQ~hMfs?ac0{>Ady+;VB&Sv=10w5ny)(((>53XPn`L2NvX14ilJ@P8rUl={EzvntmK zwm*ZnKejkbS;LY6@~eq@Xymlw@MSqHhr@yQX~-t26gCeD|OH*>h9fw0$%rA8=g^v_aY)kREJS{j6~zyvmFckFO$@7%cfc>Ueeg(IkbTw-`t`Z*GH2(6Xl}oSpiDB0W6C(rVR~{x z57JljW1E-Go^buL?)%Y4dNZUDEgU!-q}&;MS{(IW2T)i>xA;&Qj(fiK z#=-QDsvTTRIEUvw>mu>1fduNX=y@i3sTl)Y5~^#(%O~`XJQ6aR3h9GM!X3T>wkxmi zyLI}=Yd~kML6sX?YsDVq_VxtFKpxZy0RR1~*6TyHCE((@SiGwwXn0&Q%&c;j-arx1 zT<51)(}s9$p^jZVx0u&Wqz>rSPuBzWyKb)s9NqZ$Y*JbR^jB{DjsOH>RG7~ak1y&Q zybv2vBk$F`Nb%1%!w=!^$kRZW`~QO7Gp^*R%@zXY(+X}6nV(q_K+O?z1VlDu-Yq!2 zv};Bk?MWD~<4$rkd^m%e7&H<8dOn6iLNf0ob6jlg&h|3ZxTWt~v)h>VfRW7&M7d2E zH-TeXu2X5e&GAOp=a(vU<8U`~ldIc%s~d13gTXr*o7a}_TemIRk9t)pY1yH{y8acc zlUzldK_yr^q=c+aK{+{6HVILr+!5r9?pYi z$S5LiC-W9=4`*oxTYy?pf}emw9JMa_{%koky%AfKecr(UPUMI$OtigRIX6Ke zti7cbshv%o?cUCv-;s#l1M=x7f`EVkv-7B^mQz?*m|y2Rw9>AX7$O2f0)-*B2sJM$ zeh)jI8zC-|XDDMZ!q{3@GdZ}`*^s%aWu0CUR-8dgko)Oo=wDAU8SJ!b%6SNRnfgkJ z7R+I$rpFLJwNPqijPLLs)w7sfcIGsEZ*aiTaooOa>@X1KrcO&yL}J%8e+>2)<>K6z z>*#x$+Ny{D){-Lr)_w z?OJdkzQ*qbx9H1?w$ZMZywLY}g4N3yh?ksvoKUHtHBbvk^`KhEEi0O{9bqcyXBv8c z;k0f0)^MO)ZeE?icJD@n&x&U8mx+Y&$?fRNG^!G-kPpFvAugIu7%OQW4P)3C*FLcRx zNVfK6LAH2b=-|dzHffNdfW@KnEb8{ZlRqwwr-MS!q&^E3zBOjz6Y-*2z#>5(~U zLqk&E*~L3Q1R{nfPTKKqQkJqj6*Zupx7)3cSyJe-oVBPC+KhH=FS1!W9PWG`On?D> z92%d5)Oy-F?2atZ=1YXH&{UVZ;{NB zuE>}7jKnEzUBg~59XaMwAYZ7CUM{YnoPn+lujk(D0YFCnpq>$>I|Ov&h6`mJ^+zE) z;ds5p@|C*uSev~7suga)nKnK{z?(`wFt`q$`k*eU7UN~OfgAEWplAjZnGkMwDIFeBSb|4yu?59zMy(uHR%JZdvdMV-#aDgWQ8k#mWqDb40gi7%( zNfL$-gEfHr4!PEBtmtoXlw7%gFn3o-6Rlx`4ecMB?{bW?i=Oo>sQhb8sK0Ak0oMUp3>xj}`(h+3R~$qa%JZ^{t=C3CN? z>^O8OUio|~fYyWuVV#JogJXJph6#iqk^yC^zSQH+&=%poy1YK>l;XuNC$m`khFa0H zP)=P`6Z(5SBF5Uz$eXh=j0Ndh$HZ+12zv2)=W=X?JW+ey!ojrN|K`WHiDQXmJY-%E zk-qVk9ApCptLv>U0sjrDj%^+lbNq)6ZF@%_Luif+^LeatR*J>`$d^WcMO={xE`~lH z*Na@b`$e5bd_wXpLddY0&Qq_f8hRc194 zyMI2JKIM;S=yGWNb;ILw?sw!<6g<{et@+Rs?+T!ufTz3oIcI27?aXfeJvtS7BYqTK zZ&cWzfB333Wa?YR-WFVUxsvx2#__(IqKG+kaGo%a%M%{B zi?q)z>vMIxOdPKBV6KWql}pt9eZcMK`sjstRV9%lbho!vs*FU#P4=c z>l0$D;}Dx3sXK0O80_&G?^`E7t*tFSq9?VUjH&H=TcPARcL?*z44cNBdHshJIYItZ zXqZXw zNg{1^@e6c(G?N~xAS4`fFv&dK8JMx8hR6wfsb&Iu5D}%Bo>E>YNjra(#qnbjZ<~SM zG=bPGoBBXthWyq5#&MJ3feg~OC%uE^wdPKD52SxxS${Fq-Jok8nMelj84Ips5Alwfi7x@_vRs30?rk3=p6~Z_( z)@Fk9)2$iBw<>IZlqnp4;2Ai> z>ltW?{A&VIlS#AQeq;#2ncSY(o$n8x*ad5|K<>a{6_f;xn9K=5&SQt#E!c)Ds>sl% zj`29v9Iq>>?T_wdY`Y=QRwzoaZtuhbJr;?!;Mv`EWw)Rb72-y7NUd!Wy`>qt9XegcUNI=L^&pw+_GHpe zaH-!y9D53-tFQAfM7@{%p`~prfiW>nL-@T4m#KxOmQXZeci(T3NxoE@p-vvPI^837 z`EwQ+G-Kj`U<=W6q~Icz*MLSBqS<7>NgVZmWzxG8k8xOt3f|!7j+-w{t!!l^w%y8q zPu>dq>Y*bR8qJ@ubLDIBxUn9c&;7dYktxi6?8@!u%B`kSRQlgzH|M#}yTAMz)fd2| z>t6jkM4nUvhV28bh!hJJuajA5=&BJ;5=pM?AhYLjGk@$x8<%%`l62?9MZ|*j6&!q= z@bJh+0!2hXV1?D=KjB{LTjP(=-F;ugy*jwF;+f9?2Edn@uuA#QKBT zqx6vckJseXGgySW1ao9*AqjX>cQJcA99DmYy5I+|Xd_&U5Ds1P>Bl|a@Qx?mTDNB^ zmInCB7sOfRQriXkC?kHsmS_*8JYa|H=X+%H+V>W0H)^VOba?2aR6aFZa*w#Z?;Lv9 z>RtAfNFR@gOpq{%R1(2FBv%=-pd$1BIKr~8CvMY!>cp#GyA zCzG=V-ara;dC$Y-flK-0M$3@HSbi`qjjx7{u7}Li$SvY>CfcZ=_tpREFar~a8di{Bi6o~tZkPP^1#ixr1HsQ#;sKP`us~oboBQIFAyr@ zk0=tEc*v#x%D8?G<)TQN`--0ghE7h2g^1hw=TC)s4xVHx?0Za^=#!bu*=#ZY6w;ka zzqx4Mtb8~h20a`=lu7Q;Sg*AmAd&~gO9u*k2$fo@?0Oatm$z0E5$1E@^#c79Ff|)k z6kl+8iSchfM%!ywRF?uHEm(kRsgyIw%a&xY7?W1xOQ%=U+DKpq5t}ewN0b=9&!otN zjyWZ-_ybEvokQ+Ky7~Dc1!lsV^(=C({6p_C=A-k{_R-?+zjnivt`kI#{LI5Kd%Dw8 z_=|MTXv(LI=@nAf0R@sGUp~JjxFA3AVMmtqrS2T^lASh34}Omq!TkYzaQ!AR3Mk!n zu_}|221zOQ zcUS*0ldq_pvl{{bE>N_g3(jkvnA+@MfC8yK_BOxFW~T) z!`11@Rzo33rw||8ciu0Nn!@7F>I4jjF~p%FgNV5GvD1~8eRUU)%FY3u(8S3!kZlDS<=FdH%UP4q zA+hBJO#`_X&G=pM)9dGqHS=52%yUH?ozQ~zVYb}YxCr6av5jC^_A>>!1VnjB#u;D` zZ}=}F+5QOl(rBWHANC-9jNYdB{27vVeB1Kp$P!{V79!9gGDQMoz23+RK`pKphmec8 zW&&70(+yTsR}X5JX@@unG5md@*w5%Tr|e6)&|_Ymh-8}T!sFJkb(j+Q8rhy|Lnacl zc;C@7`OvoXh5e^hgiuesg_gEGpeUD;vhhG_?zqK-_&j@mLt;^Dr)a?P7AZ`nc9C*L z4#o`s-)iq@p^bR0t(XCUFXqcDj9MC+-d?tUpZ%1E52fsO8p;diaiMRjr85rUh+sy% z)^hy={>L?DB{}Bfm&cEbct}KP8%jXi5wec@D7IqO)?@sFPgxaqNcrmIA8Yx@eeYNgI_P4%H=WeL|dfsJE0>^v(0b?eWPkT^7NAV!Vyl)~dodova zE>(z4NWu=BIS4s;H__uJ@wnFlkbviS+*?LdZYP8;nG--izFTNK_pmeYB9b5(VZ~U-KvPybs9OH{<&92awwb$3?Meerl`<)+QVjxBuBcJ2YCjEo^K?9Zj(uAOkT3I4A^+IJSxL-=he+@IsmtAForX2Q7sg{4*#%~d zxU5Afm)6FxcwCP$?q<477anpOBT8Z-ve!{#>fh^(xF0_3#g7u$O-Tp5EqDml%r{iw z@SX{|=6EMv2=E?`vCN|{aihQ|vzIvc38G}w`t7Y?C%DLDviLCfzVk;l!+{tB(d}cr zlcC9+BKf>sKCCfMxxDDUD>k){oVLBvzBm&+S9q{iyn{q)hni2ux^inp39H`k`3}*% zs*2x0+xsp*xqwYg$Y?46O*LOHg9?Xp`h4&{UvW<5apr0FILAc+CxVY@p5pY&2ptC% zYv#Gwh>_}XW9(Y$?baDZyv&gLZrbuQlv!NAH1L*q3R}C5UP+}d=q7lt2jJygy8aAEYGF|({)waYH!l;eQYeVf@4-4v)q(H<~|l89B} zP4A-Sm^2=*^#dN0+f5K&T)X3U<|ulH00JOKggoGM4$KciRvIh^M}wu?06Ilr2e~R` z_50*_+IlrD52StD&!ZpHr)<{g>}8QTA_C(I%x((4L!}qlpm(JgD463a1bI-2%VKq7 zb|&KxyFP8G(aJ+31M!c}ek&QWZ2f1UqPSr3Sdq{QGuW}Ds5aUF3l`}_YUDpWjiI=6 z#nXt|EOH0*H*CUlIK5yHFSJBCR-u4CL@0}I^ubogqJ&@2=PhWZO6QegA}g8Bn=I@r zO?oeEBluK%;l8iRWUsD(yEa$l2H<{=zj~eev#fd0ynAS#8^)%Arkg;d;zZXTmRFbZA3>O-;u_CL1i z==%9`8!^xk`0A;9EM&9;O9S<)imj89C%H;#0gDhDwBUgwtYv6%ZKw7RXiaH3f!uz^ z5QZ9w{btS|3Q$Oo=hlp6A&e3hQ|=itKJiVogh^y<<8~Nj#5E>@!O+r;KK_f2?s-i^ zDoq!NqxWNV*C<8S+j=SsN8W@;xbH>+xoRj_U{F5+GRGI#F%S{9ENj zSWl3xp}j~Q`#tFS);@*KY?5HyeYnG&+3YELt4g;`)(los2Bvx&Pl|Jd2wf+8IQ89N z#b2KX`*xaXv*e5QSIc(7F3r2kY{Po;j~K*n>E-jJ9;j;@uy^i@nREx}lM8%!j! zHDcqLn0arKV54NRCB9;qNrGN*;?js*`{g&KgXrHUXvQVtz;a18Rt8{p9Xcz<>}lgu zgP{>0@np&CY$E4u&B($6Bf`Rh1iWD+qN_Dn1oS-OWn@=U=~K)Oq8KzpKZ%p$wY@A| zW!?}9_XDQ{ZOJ74 z)ytaK5)~ms@P+9|siA)RV#g#zL?$AmGpW`FVQSh~i_2ZEBbA9>QeLFfd-L!4b#CP6 zTHHMrICco>j^Sq~uBcMhI12g_r!H>e*H9|!AegsD(ud=HJSi9c#vpfxVFJ#|s7$l* zPB8@Bw98eEEGUwV!VtBaK|og-kEhI@Q6E`(om03M2f%G@GU(ogFzB`>uDUQF0T9dC z*+0^o;~W$F-F=p^z|^yrR7{LY8tf%?+;gc9D*buPG&fH+upUUe75&lW9wUzDgQfK5 zo_mfjjrMln1glnAe3z}*?7qY$JDl!46*mIm68*qeXKeWy7GSvY7fASB#VY1J14bpu z6+pln!s}`jkKIN}#N&iRt6H(;!TmsRo18~yH=;!G4XEAJEM0#wRi5=n)V-k zPlt%#Stt8FUZ&;v0pITK^l-qdY2!6>0%0kicgmp8>tR!U(UsP_(ctLy!)?(dZRQqU z3d~1!oQ`yP`YLQZ|Ck^4TQBmsyZWzEbM|jmux!dE7e$5z*h34bMiE&+*I#H; zpd;t!W0mEI!@1d@aL2wl`yme~KkT%H4=+7r1GRP*2CoMgWBer@ijr%11m7;NHEx+P z6XM!JIQ`1B(U1{@WFJ(u?$MhkCaBHooq^pj%ot@!BDeauc)l9TSo!oJO--}Rl9Z@* zb8Sd`ih+Xz>mbKjZ)`WH-Qs`+%Mwm@G{G#%Q~IrEasp`$X6u+Gk}e>t6XI`+}-I6@|VS%rKX ze{I$yBq5 z<)F~io+eykC?EX}MwL!}>kU9u$K$l!2-*a2Pa6PfG^L6^NU#c#BFs2STPue(Xn$no zFVZOcU*~e}1kxq_8TsWO^Z|qpe)KU8(CLMWwWv9GJSl&mhFst9t3TI_*A12~-vUZ@ zSrS{AJLX(bk4%a3=_#vR&E>AjziU>E)GkeC)pgdzXeP;6mJp81_j zj(}!v%UXv!Dpo9_IK>zJ>hnsT26L>T!^c|Zm?dkpw@{VsOA^Vvh(ZT#`!0wrnK=z` zYCKxJX7Rt?Df}@a%EFV%<#;Sv%ep8xe-52#ZDGM>wPa@!ch=-;;-rq~0x5niwUOe}Hr^E*BO(zBbZ+y2&ZsE;LH%e%OY*Om2x;i3a`xlaiHNFTbjezzt^~MwLA_n zif%?o@xvOHPK6q!>;0h(eI>$9SJyGgX%K!CCj9WYMS&c4R2P?N-XAKcFS z(4sD)Sc(z5FwKWjI<`-}5j~k4xa2_tO)DZg>G|L0IZ+gm=j0AoW6joo&r?2+NTuv< zM47h^a-;&nZg+o&{%`z@c`ULvyK${O9*7f_j??aj2enQ& zftGG}pk896RcI>rG@yC?%Waih@(3+*NRpy2(HA%NUXX-8!rhlzYijgepp@mYSU%2h_S;TvrKZI@CkF+8ix-3 z_#bZ1^zq@y6T;*pn{8m|hYR$`ASa=pSWX%})4^yH*nRnJQ{=}y@kUF(XtJ_7743dh z-2Nudb&V1SB|Y!WeN~v;TQ(x#xvPGKaDy^)$n;n{%<6dMvytJ-0n(9aAf5RT1(a}> z3sKt=ofdSjCm{@*Xf{w*!*?Av*kpC$f~L`yo4z!BIvfpKut>cnwQrn2;Ge7RF@pR! zv?&|@ygr&$soz88S*4w7B*4#OM>6(^s7x!EzygUVsMkmQHZzhk#iXyN9iK$=rOMhze>iQ443||Y zXhv*SUC)BbRB5GmaAt7gRlOu9VKp^w=#}Ux2n5Tl-7)uDe8~uaQ!Dl;$1qhGm8v## z0KF$qH`9-m+(G}ti#oH0mMcC!bgy@>pnXMGH@+$qt1evO4yLPb6PZQwi&|UC_56;l zAkwGZm}~xs3G(bjdf*l^7-+f;*mva#1TyGD4skyaplb}Q} zz5l#F{fK}kCYVKS(1{Hsm9y3_Trz6N@ui4MXS!T1>F@4J-pY4to4_q_WHz&;hW~C7 zrz)d~$l33lVN|0y9eKY-Yb`L39v+BGeg(Y^#YtlY$IRE=2+P*A)~Qv_v*e%lIo_5& zOuQR}T?20Z2Mm=q)$oM&%q1Tj_OU&CE9;%sv||Yry^(T`-IwPW$>c3FH#aB`&3^7I zrq_t-7`rL4)ikU@Sve)qgq<$<)&Gi|rENssu8RlO%&jOg^X+jf$z_(haIT3=p|&5h z`~J|ykdGKbxd#D}k)(bMt2gT%fb|7Go1jC2!Mo zgUuwDg4E9d79NuS(^$z?G6!c-#eMV>ad+akefQ)a8A%lDHw>(fyah*vZIaosk|pNj zThoFvQReZrCCMx5%H=$+H^(cUcK3V|3z|Yml3ai0!gYG7UyeCYUiOm&0Y~2k>da>K zMtQ;vxUm^T5Vq~~Q3`}lmqLrn+ zpndEI(H&}09me#vHDe|1*ew@T4u|soq2AEz_McWE5eq=hDkSfjZ~E)UavyMV(6MWA z_E+SUCYOt{G*T1~Het&DNbI3rdTOj?wQMFcHlR4DXyi@t0ko@! z!YNRS@|CK?!kox>8vGkr1i^0QB^44ecg#`vgA6x8$l3b-mKK%!e%tbv@E(Q3Q_2iQ z`TXvqPF1Xh^4Z9pA1~7JI#TZ2=2Za}%eC_dK+3T0!)2%+h7mfrA#q97@ewQtOdEJa`N4Y8HtyY_~uCIZIiy zr?*%nnMN>LUCt4O{Qa4|S4?&i@1cQcG_hPZ=yM$wNftVd)ihu{jcvdSG)gTa<7SFl zt|`6#@$Ez_i9{x@cWn$45K@8L+L|V;1Ao%J&DRNTKA%Pw`p5_nbr%iE#OvS>h&lvx zhAF1dfmng|8{wlOYAgdYvQ7b81iBnA|(K>Dt?!^(@;W7yMZsBjBq zR1dn}Wbrm#elTK7yQn&gUbe@o1$l&X8kXlvc0#lXDV1Di5b*(1v+{t0Wxq{GeYlsPlakfz%;bcWI@W@q6B;BG>`f1qXYd2P@39%4f5 zSE>yT@mgSCmGfrD2+PPh!$=MdV+edSr)l44w8EN&rxHH{K9XJ;Mt1gjhR$?o_Ikb_ zr`V~r7725(Kwjn02^1~TAdXsix!90k6WGm^o|bTY@Z4V)kCQ@^sdC@JUvsP9^UY{6 zWu0z!$#$)d2P9eQ7Nuk3&PSR)jxbBNk!r+CznkkG7s>&2BOU*IRL9=kP8|snO_ez)nuiwVf za^rgZ!)J(vio?0Dg}wGsxU?6%>&9VW|gOIzb_zhRG0u~xceY|pJ!Qlmk757 z{SA4v&a^l-H5%A#B&7qzkkUy4al3)~^_sE#X3+>=*d|8)NWzB|Tgh%tuyKr&L)-CJ z)3i}ZdMikXE-w7?u^=~Q55&)ulrJ~!?C{9M2b^K)zVNyQyr5)Qkuq8_CI_}Q`arMZg%j0!atLY72-%s4_;Dy4rsj&8z>+wS&? z*uNBwCdzPacATi3-3x}1h(d%vi0e{ur(2YDl7R9{jDcGb9 z_0h8ZzcM{hu0B;fQ_+j5$^15(@h_5XkT+n*?KOdCZKPhz6b=0^SvP)!hK_Tc@o=_` zfI%q-9f_3~FsaK!s+;!ue=Gng4mR7@(`xH+i(1luCbxEK1&F!3Db!yC{(YxS=A4kJ z?5hu9Zd%gH#S3baVco|+_-YOe5IS#Vidk9iAy1p=@W)afg;G9s{iI3{uR(pmKHZ^K zVBki2^v%qFzs%GaKX-Lk=rllIthHE$eb;k{W;8&XEOtkt0+6_NuMdRln3;^aT1T7J zF{C~Sl1YbTKcfd9p1q%?n#OX{SZPrrqA4nN4E}4ai$__~dfZ&1C(@Q~bsKOzdWM3u zGSiQ_Fa@+@N}z!JevIS9Gvpr*kgN8tm*icuSAHr3*kRe-WSEAb&qFTbUl*Hkhf+uU z)7|ZLWZ~Kr7|n!*;4I(s5!CeLv&p2Cas&oP{wZ8H2UM zc9(Y^oh}!Vr*=TH1L!$7AN)0lE0^LaRWH#l##evy?Mawddo=s(LTl#DAJj;W@mnp@ zPXo1REhjMB`6GL~N1HcJl2V1=|BLpe+sTJ|{{7hi6$xzO);1ndDr~E!-c7kb8b2dE zOSm5%>#x#1D>9~aqty(Ie8aqmDua_u^y%04F7F9QeP<6?s78X6^Yuq;wv;O%s7@A1 zcpVpi0p`y<5^&=)-A9{0|KUy}o=|X@akBV*t4dIq_5f{>5P*wiPgtsFk62>^p}Nv7 z(WfE!Z*7rBL>Wx!d5cATi%-^~H2*jrVqAO9x^c-^B=ugYUFkB>dMZC&Jz4wJv_8#M z<5wKB_vqw?C&WJZ;cp^Dwh)c0M(ah@O zoAi7lvpMP}dt#yytT}z;H}u(GuyGQz1td>BSb&OCT$cFuaC>4P#~HC278#k+G*t<~ zV&dj-3I=Eb#?-0Mio4AZZ!^2kx^<_KeMAurxOSakhU)kl?J7A|p8b_yaAGT%8uFy{ ziwRmf__}*y886K&5Y$T)_bwzGM8iwwI}|xTGtf06HI#cS*r9v?(}l+-!&FQJJ~_*h zk+kOa-&Q|^^OGW!vYtu`6B1x~=Jf7|7qF+)C(_I4QD`?lA^u0^jX+6g1lqCSvRmW_ zQwdrx1!#jDu0(jsSy$_>x9nr%(w$zFWj&pS((Z9);*an8uRrqYXQRIc)0)opSO0qV z688Nmjw{=b=^_^=06F;f?B1@YH&V%B^$0J8{2{A0kRX_=$K~6jWAE%+p$o(9xQ|MS z=XO(Q@-XC^)JJznuYH36t1Z5-C|&?Q?hBCQ~3dM7)|8)vEdQ($bnKi~Obt;KC= z+yTrnHXU~~#uCgzYQF%Th0C3kmXC!zG=Kb@xl`^-Rr_t?B)KIdq1#6Th#Oh<`FMX9 z1&rZ|7bVT%id1-eBL~;;WFB`umtcQ1IX6A^3eRi+em^Y^WCW|2j!C1$jB)aL_6I6c zW#Q`(%HJOFw!eR!7?I*WHt&-6uiqce^>P4}A^%6k68@8jDqHDyw1=Y^S=pAgMGoUZDx1q=dkB`s zdYQ=~zWQH7*{y6Tb3boW$h3=!Z_&K+MgCmpwpF&>YXl69t1mRAKjNbrsup0S^SUZ{CC3eF%9R0eo_-bHuSvJ30BH9p+ighrRJ*8M( zg_tHlY!(hU#JRQ7H&oIU@=qlWD|b)5;P<^Er-NJ-F-rGo^I? z$Ba6&){~5?GiiU19sg{FrvB+n!P}|OZZML+nQLrFXEp=oBvK*?2geeqnx>%q z(f2cY+ICF+NoQX)?IYW}>K~19Xvzw=x6)x{83uq5`Ow}SIgd^jBI+2K{cGrLtBJXZ zQXdTX(;-7c6>khw<<^_6dQY8Q^^DuGWfFy|230$Ix-fEu&1Aw0+-_J}?3|+60!BoK zsVQjO7jL8@=os;pjL|8^G?eW5)ylUfnl?C0QKpozzA|03LA>{y zu6wJ!<5$W7%@*slhX@%m)X2v|_t*k{jGfKla)BgEi*Q@MZ zdIlfLbPJGw+>PAtqC)h!^lzR7tP@=X?`8`S@<+-&-F|H@WspR56}Dw#-*L2+JqJj2 z%8cA{sy4{cse~Ne+T9s0vRkjbvI9RY$^3{rI@c-rc96qTQw<4;S&HkjV~+;{g) z?Vvwwu31ZbQml8!>(Y|;O{S{Zuru)+MfEnGW;gf%)-=DlnM>p$Z*i!@IjMXmlO&PH zs^G*Ln>J;xmJWOU^2eJq>mnEi-`!a)a=@(w_*GDhl;=CEBH<&Q`NQmmC?> z`WlG~fte<(NOaYF3b3ZPvaA8>Nf;Nx{23p|h{QyCjkZFa!x^b$)_7s9Q{HQyCfmKo zfASlR)@^ZOi43c!Hqojw8C8`i%VnzN!^sOv;OR0!uqpkL{NTXyNvWC@%Zm0@OB&0{ zQCBrC#ZsZ?`&4UZX|Jk&C0lmYZ8e*JU1)X5H0@0Hlokfxpm~~bwsw)}z0&$fJdE;@ zbOwj*Pz6%^{R4Ad#D$uTMpx&fo>IAW zHi-RwX2Ddos^*k^3g>4O(J6P}$R(rh3qB#ghs?>q8x#V^xolTwwYgRo2!o{H0c2Tj zF-5QT3@mmLEqvb3o}$YVkmdfwYkihxk5TGVwJ5WsVBTYyK?VvdQJ0C>Y@4LjYxx_uvv7{l;jEsotgu=A%Zx~u2}#6>QH4`|6E9E|GaY_g11@%zUSnZFt>^p^8d zK@kQCp7o+ir=ziJ?~QZbB?J!I3WhJoOycm|eU6dd>`F|3-096VqXIN3uVONiB`LT5QAOLi5 z^^=it*WV9KwpP0eXIseVvPo}^B`F?GKf_!> zo1%bw=OE+r)c_Tw!27ssinqMfHLokA9&uSrG3kPLRO^Yt@ob^F*%uM2miUn+D}Z=g zXf%+O_e-;Gw&nH^PMi)Hw>&m9Q$7PKOQBF?!lD4E1-4^#T62Xm1$Zf3VU&xF6kXNd zrhU}xx|YlP^NiDFzF1lxs_#2P*ASL=6MVI{FH^YIj>X8Y_wa!`@p) zRkeQMqktROfOI2BDcvD04HDAbNT+m4hae^04bt76(j`bphk$e=&3*Cw{$t#6@7MeB zemldnSo>XX%{iYrpZO#!iOuGd;c`ePkESr)9%JUhF|p@-=d%3i>#%t@YcyFjRe&T{ zGm7<$m9_I{(Z#jiJ1TzCJJ8#U@vW!BXs)=Y^sa0)1$+eY2~)mQY@ZG1vG~m;Uk~k9 zMV9j~kDGWRIWHQq0Her zKSS9z*(65#daKuJbj%h9*>SSJCd{YwwZu$W&qii)3o94we*C?;3OKO1mebWi8@a_NGvnhlB=Sz{U&{ws*v(yXzAp3x{q516g15bhNq^n z>P7F0Xup&yHKrAzsa-XlN43x>hgp090x5l2=*NCimQdpkoa4WTUD+!~48 z-qL>zd46X8{>bAqFRdf7$Ic(RaCXTPW*4@_D2_Y)etPBTkWstyklGbFT)VojW2~Jy zEyS4?9c{x1i$hsD<4uFQy=cq+MapM(4Bcj@&?mKG3>*!#cy=V-KrzBNP6x}0&Kzv= ztd9GH)_Y0;#Nz1g!ZXwt=6kMF*kMw!-#nVjZrjZIn*`Y~5?K9H7(A3+lYeu}9hOm> zAn{s_K}DF#z!%zKN+`!B_xO7=G3#`cM?#eL=H5%xxh5~{z5|Vwlt@}azMK1& zw9T7m4R+^7cSx~=FoW@&f7&L{GuuY(6(*$#BBq>_Y)o1!_FTIc;`crTCUcjbVANKW zo!5wwngoovlY`P6_8rcdP$1=1=x(0Wn_fF?M%m=zp`{VXTQJsd%Im{%cUx|h@kwf5 z%j>+VRiJ?58=jZ0RcjP`^4j~M^Eig<*y-en8JQ3fU8@e$Kam-1>%G6!^?gdrVx{IC z(y(P6MEl@5cfbBflh?crp~Uuk*DN3SCr@X1M97!bDAn$ucE4dW7*pV5>}d=G3Hm2v zg5*!Qc`Boya5CP;$9ert@kvboJbomU?-io^$LfXO*fuvQfszl^>oAT;$6z7HlNs+v z*nl>ZwOelt=x-$(A*yb`F|1bm(;u)d6Rq!~Yf7O1dHS1cZoM{@;wgqMF~POJq*?~u z;{opBid)RLilg_MIa9-QAJ0byDNvN`zLUrCn>pu(SrS~Ej$HL(tW6l;XK@rMepVt( z8%8`0(G{W+aeBCzb+4GXCRaFXi%xjglk-V%BaiAC=dR_Yv`JA4;li!b&`)wp6^lk* zC7dHm?&NSfjOUXd(1*m0ad$O-0l57(9FN|CN(CbdW%Zt6!55_rY zajY?C2kLq|@r_o^K4^c$LY5;59?B2XU1nE-iLd~q&qLdm*2p^=v!CaOm7OFvoOIX; zVMtff1_#X-PFo|I`ZaqQM+dIKgDKBhk#fQnl>o2#Ik|Kvb$4ZDoN?X&4z+v+MUo`t zNK8TC?ZD?d3HfJ;)rK)Y`a?F^U-|(6doqpZbc1Vm30u~>oxzzRDw;~zZg)OEcDYff zzCfE_B(aQ7m&3AEgc4!PxqItu0q8SK`99o#8XG4}_FY0ExZoR{YV5oqY8~T78{P=% zt>|FN2U?!)ba-DqK?AhBW@k&pyo25dB2$XAi)m1%(m&RFdSV8;E?7*40152;4-q=J z*p*a%-W6!C(my0PKR_dcQ9n1ZI4^2@Tm_&N`+x= zclnVl`4ZYZFDB|?lj~lXQUoqacYhh!Z?LI}BH@aD$^XfG;lZ&#*_Rq_<)%zzSgt+hWHgdvT^UTZnfVdUTlbdKrVMGs%AS$R0CTknbQhS8k85Uc^EW? zvaqqmwr15|d(X+dfHCe8Z}I=)C6K``DJM1xXos*TONl7K0$tNW&xQ&cXH%qZ^cbuhte z)F5v6(^p=X*NH^+ovQ4x8(6E1aQA)RyxW>@IH_u0_s9iuTMtT+!nL>_WnZ7+?@kdk zbVHs4T0G(ws=r)4!N-n^;C(g^JeGYiC{&`BY0}Z|+}dh-m-Bpk-r3{LpbabVgbdy* z2%c-!7-QOU@5otP5BcXo%OOGWrsvo!sIXVizGX6M zFK7}uv?ZHbky}Q;-;>*258)DVxE21J=!qa9*%4TxH=p8|Z0sqKkUFJn zUCL6Bm{Wc$vsHONL`fOHC)>)CQr`KwGlf*148+0gb9XwsM4gU1W`StwD47cuVS#)q zpw4+q@pj`gh^{8;Cro@XocTA!oSw&XRU`S3J8Q*1rG3(?T#HrNa*Yq58DAT zSuv9sP%R9UNYs~gf&We~C@v09WeFV2&pQF=W`)awb@apnmfS&~KbPp19bRaDpn!1J z?BgR?Qk-8JOU>uaCH5K@8Go#nKgv*fcc-+~3#p|z-by{17}W-$`&&@?HW_0=&iVrv z16wy^vFW~8a!;h?VICyDSY`H1ai&)Q*{N8+qdbQqAqxfWl?ihp~3M1T@9?y2=Qi)mDb)^&Elr^k>%0zN|eY_?~ zDpP_xkfg@19BG6wS0R(gls9DKd``38BoGWq(Q58ji%Xq64Idd z^#ziDZQtB{?9nxWlkJp-91_S<2G$*{3O_3iki3O6gKbxGMq#T)bQTs!gwbXBfv}?g}OvA zZc&iRz!gryzUp!v#m3qmGIWYf{vb+jj6qG+2}$zRgc1l-_Rc7M|AIT>FB_d!p9BTP z09P!I-!GLoigl8}FDqk1Yma^p47{_j8vKc20{s{kios7oIrYoZz=Z!BDe&m*aJ#JpGW;^S{!lmx%@liHVt%|)g@1#N3L?HtF7u5H|%=lm#)6H0*mvV!2woDF(Fz z?d1xx$YidG)i>N%dBOBol7p_%`qBF|)^pB9!}aOVAGfrz)N{^@O)LL?Ayg=JJ2TcF zcY*M88L$_v)9aSMt_`=^*@5R3)mbyH_RTD#=vBp6c*g~Air%F8AJRkq<7}>>U~q&G z>3BM+alu(F38X#K%}|AK#<9`4X|18=s5gJZ!2_-kWIP5TU0zow*9DhZcZ$1@1BQ&8 z-izi70x*k);M@1bVeH}ccczB*(k~~qGoa}(K|w)CR+ENu>Q{`|2H^8}A#A22<~xo4 z50N;YIYo31Mrsf{ z8}WE;ZH>e99E#3!h4*h5jSwK=C-JfMZEqtSkr-PBwC(xRMZ!JQhA;6c6@2Oil;7k0 zUHnka+3#!+uNEmKPSdZ2PJG6ci>JeVpUn2-b6T3oO1szjMwH+rFab;58Xewkv-~vt zAX3t5w98)bxC*v{TaCh}cEnPkX^6B~ z&sOLc05g2^6AWFm5Zvc)H&rR8G6X#HEP;Buu+2ifv*zZ`R6*MokM|w-{n@x+Aaf9C zC8GT9UC3~AsSD>VlEzIiYCgJzBa=M z1uBCps`p@qMwI-9z1OI;rvSaC;Q>YwjA=+X*-zkwC-Jg!cK#iR=BLJdm$&$2t#qX%*-# zl={|&4V8#rWm4sirrZ+KRSTcUPp!&fQ(CIVKRBMx)z&|_(4<(sB4c(}yUucx6P?X% zH&q@t>D3gV2mKireEh_~_?);{r6^_!1Dp=DO@2 zOD)_qk#>3}_6H(*sO@G!qqumFm9=P`)=SJVL;`O{Ntv&K* zZs{!oVq)j#Q}Wd9X{%?XK6m7dg9%K!Kxm6DZZ%`02TZ4|&*MFpYPn7_5S!R+O#5BY zbNXWn%VM3Mg`>+sb3INnDMr0igZ0EDF>`4;8W=B&L98IGhP`SEX8bDa2*^P>(4)|E zxb^V_2%8gt7hd6ZT8IT8pvLI9IvWCNWv$Pnw|c`s;x^n&@7$D3=39a3GVMgrG>JwN z(vkvmvbcI}pJ*Vp&#$?^)RK4%x^QF==8wCrS3QCQO~b?_XSuB0GIr|jakR)Ke{E3W zYeOVAgj6X}m_|NbtQv6hP!Wa9X`vjnfikiX2t6=9n6I16pm;S%=51m+nsQO40MNc1 zAa26{U|q{~JwSE4@Wjk#* zO#&K@uAIL)`b>W$v$N|#0QD(%206ilNh6?^Xx z(O<@e2NP#b-<4dlqrHigQefoSIC9e`dY{hADerFyi+=&ejx_>wou5Rk|J0H9oo*wB zH3L4hOq=!3!svzNZY<1O)pw(*Tm^Bo%2Wd=sP+$c*OQ5};C3qXzP~{_M7-%??zk(7 zPNY|l1gASuh?sb@vq|C{R=@g?Lsi3?Vhv@v3V&M%GvQfRXI0wHC;3Cq?G4N;r6~&F z?x(-xcOyH2!QZa6S$G3n%Md3dtxsiIb!i_3y`xBB-@TTO%gPatCHi2%2IAL@pJ-HK z=AW0bGB{-m%fr9fF1Jd_BruTQ(R2;@mGF2}5wdK1$EP@PlUWiF4aXTJJJEh-Rce0sR)pqD7- zOrX_uU)6m+(LS!L{pDmN2_JFd^Ar4zA>H@>Xlt#6IR>Ptg9~~jwc^{GA0+P`9(fbQ zF>!@T0;PtgU;Qz!0J80o4PPEWR#l(wsKh>oOO%wQ&yAuBC7K9~i1>EFQr`bh2_K*a z2cNzw?3?;piJ-H2UQ+4<69 zLb<&+hu;%JHdf-UwRLLBy~a>YZzZ^W>(Sv#VEg9>Q^LD=D%nN?e06;f={=V?bx}ug zT@9DM_ClgqrS&$m&!ryss%M0=>xeMi+=AGkAyW?53PCac%Z2(L?Cd_#Oz}@^hAYR@ z4*{>9!9=7wY6@@&B#rk-+kue)w3{>W`YPumgm^ypW0UT-!$Y<|62fhxCG|(GO6G%f ze)pI+wu>|--<9b3v74&j_MJfGb}{T4HLT|ISf|T%mD8o0@S-4Y6z3t5ZKCq!^rhX6Cqh>72M4BoV#lgdgMTKWRQ`voC{G&ud`(b7+3DVZ& zc;-xT?o9ea-@PrKy@wqw!tSclm4k0D??cMgnX)W1JUe=QMj# zBXOiFSN;;>pTB%g?Y-JOlIOTH7b|{gV zHTPUIk{HeCg{<^(&N|aI(Zi6g`}W?Ig9|ZN=kMLCQ`fPLU4gNlHS4^Y!7A!MHi8<5 zP0}AfADuks9pm<>wgwXrX!Lv;OK@Wu`s?|gFPnx>pW$?PC4~G5#CMG5pQrb$l zUQP+5MEPf(^PZY|!+W1HmxFmF(&GRaV&dU}Bn&$$^k6)LjnO-OG-zX~V`YD$;8g~X zW1k7`73(uXyDe-qI2H@5iBPJMippVB>`Ue*@6aQUZg&`{2`1Rcpp^W_mtAwu~ zA=2Y?Yg8ukEVB>=l(7<(m*!p*x_;g02t_&;OG*lX7u-;TOF)j~}{*Ks883J9;k zCzQoOD;xAr%3}hqvy`N)oiPk30A)_Q?nx{+%9I*R=5t+KJ%?d7n>7nP`vBL6Me3dQ zC;sUbM<9WPf6+4n9uSzYwAH zI3~5$qi=Jl>-w3D&_gV?hI^AU3Z|Vi3*XnJfEw8Tj95M%P+c!T=+H<%KAQ|;(wDF^ z&aOAc0UiPGL(mv{HR zFYnJnUJBeuwjTdonH6NJxEBSPm|T!<;A@KswHnJj(ff@#>+c^x1InI6{6%TFxs&`w z{U2}dRy^$m#B_RqUlS3mjt zh{Kqc0rA!XAP=o9cfutZNeluNiMEt&m;cUsr##pOH%O6TAhXvAxqEG=&n?R1 zzKfI2Z~sLuja!&nE+gj!*PP0feumDN&J+0a&fQ@<2c*8j)L&)`nHov*Z4rqiB!GPv zhG`Hq@!{Ff61V`#jv*h6jCKa1jhxQ^DDpa-CpoDxA1hTsWIKr=t3kMY5!Ywi1$Wn{ zO3ST3taB_QvyEt<>;Ns;%I|sY7~X(o@T0WbyR_kTI>sQusd%;yFQ1wQ#ys&EhWNLT zA%jjK1}>e-*Hh&DXo1q*o(yg9tDPwj4f5KpMu!UUpu#&CIjzfssOY$Mqy9)4)?*yC z!SCQVCj4NC*FZ%wPbcd@c+;U;xNSWC_dO+2;pK z4Vh>pybN#|E9x4Q_+VRf4nQz!s^*l%cW6)OG%8`>;o%82brK?;PG1%Zc!hJ8`G9|nsdK|+d6L@{!D__U3A3xj+RR&{Js*UZX0r1NTZ&LJc zVTdpcf)t(=>bwRI-e6zd9(B-CZNc2Xj%x>H$C&;Vjvt;jC(UbL79s_#YzB&#l>ecm z)6hy0^E%8;faQi^+wEV0ATrkF;3mu#1(Eq_`V8PautOrpL`{bI-vhvkqSxT}zq7?c z|McO!4h&q_m9TzubKLW-CMd$!ElxWzs2(G_z!G$hK>Py&iZrSU3O_YftEh0-`bh$_ z__Qf=vBAp!q3k_ng-yk1v^$}&S!@gi_>NqI?NYT=MN=wxN+TU6uDhFpUm|}fzEJGs zL*Ut$|HcFCCi4I6<{NUm-Ji7cmG?Z`a9E-y5CS586Y&gK!#2i|on!lg5y}9jrmU^DjGWfKnU**YM4|PwG!0nqvMF^vxB$sDAO)vx-mJ8#KvoFTZ-ZKH;)#*jfxPMsF=`NQ#==;*=* z!oU3?E2IwxkAjz_#c8Dguz(AjByA(G`p4jFIqop3d}W2a;J~erm*2sZoAeBEx+2Z$ ze||y__CPWvBB!}V<`)6gpU2hJzF^(WWx#-Kt{o0!J24<*X*@C=Ou7=Feu+Jhp8#rI9ydJU#>r4Vsi3&A7*ZqS|uuzTm_)1khn?1U+Ow|aMtQtR~V z<9TAp{a=8HX;g(RQd1caz#ZsW%K)J4ujb1nla*HYSWr491(;J9KHv9lPo0*XO_0uSRmR$ zegaq1yK|n*UW!2#+@1MM1V$1$Eebb|LDQe;O`)V_jVWpf{~`@ok$KEj5|M*BhtdDi zZB-($I>OrZ)+X=@>_a+L%n-l^w79Bl@EW9}AHTo-8>GZ7y`Q%fqbhea0_1uNK%yKHhnk??&p4leHN5(cxU#Dp8f?em12Q8yN=-z$j0 zWs_8(pGGUlo>?ZmdZupx2TL)rmhX~MOAHdqJ;80FfMAmiEUU$2Fj4&0K(sEW3C3v} z-nJJHD>&|MAdzpg)coE<|1H@Fy?J~n>xOMJnbp2 zR;67u4s@AAq$aDLLZRpbyvJJ5o0Ln!?SrSp=+&b^uS%1HxaGo@`?Odpn=@}Zx4lx` zO(O*r1{98k*=D(v)@0!8TZ~c1r;B9ZRVQB{o1eW4RTeI6X`}62WpqM_9R?5=m?na&H0fgY*WqECsg=o0k8cH|G=~CUzV)HVYptH%AW&Ed@my z5tpqP=-acgBwB;cF#J&yu2t0hSN3LPvR~)-utf6*|DakQpK!un6T;+9BRCSi+Qcyo zf%dGPRDdo_g8n+r=7WE!5YXIIIhn(^nRT+j2D)12-ZqA#dZp0pL~A)yiZwIs{vCyohltN8gfq7s)4`H z`|w+vR@)VFZbTpli>2E}WJR|v1X7zbx`e&H=tOgw-#Y%nf|A)0mW@mS&o|S?YfHk@ z3J&53RF#g~Ox-B7HuF%+$wthquU%lQ?Wu2vPIhP zt5p-bShJ>YW8BZ<>^pvq`K*sw9NgE^tR*lMjE!bxrjX>jLc+K4<1Rp!A$n~?jN#ETsEB5{SkNl5{) z@qo-z8mxc-n=O+lcRt#%BIx2t3T3h6i(5NFbC$&9lOz28xS>*{tXN#hf{a};5l6f8 zaPNsj>XQhp7X3q?%uDN|rIrHQ4V}~vaL~Fye5I-n@;}bHLsh{V;>-@?0{ind4mjsh z$;Y@t&H6DJ9%Y7b$D?e-wI7?Dsn~+QphSe( zAZy`KbRPz4KZq-Jr-=alXZs z^kBK|Ga51XJE%`LtsR5~&y8GMayuJ;zCIgp#W()B4=Q9}lIVnf)9s5J#B!rF3Z)?# z7qH9_y55ECPuK9_GH7&uO-})}`*xr{CaYStLN8vc-n{%>u;^#>DMZo{vV9jc(#v{< zEfJjQZ5n=`2NA70kBE(2TOVpU0-5Y}{vskIxi{@;7j;Ccn$3|<1xVAy<6p#6=apET z1o%+$pO}6W91}`k!dkwWO)Vz8fKx!uCYF%gwvP>92BvKl1$LSIJP2#MiWAli;r>1< z{(PZ&6Jkc1Rw|z5e)jFjTK2dA8KYSQ9YR@39BxRmT1oZWNa%yR$U<18OdK*^*3=#rlzU2%@KW#H z6D{GW{V^KtCI9bc82#zAPM{NQv0M8$&&5FQ=I*Sl2>64X9}{1IT~7(j?6gGOZ7z`? zDE#`tUv<`Ls#8qPsUi+kgY&uceBSe_8`E^91^N}uFJ^A@=^~9RxU4heD}6_;dJ~n& zebV^Mt~IdHzXJ8;)m2IiSHug>uOpK9%nzzkoNp6HlVhJv-aa254|m%#z|)aP3Ls(? zhTWNJDR?zM7+YYzRgj6DCTNfR9G2z}dyo__s5wc7Rw+$C_z)#!*q6u(dBRz<6$=>I zc8Nibb1!a5z4KmhxhZk|s2s$rv;M{Q6BvT(;Xzv8bdyp&{TA$-kp zP~~=>3%$)T=^n#KODc?BUtj;TWJoz(ICSnT2F^(P<6drxW0DYTlOuJ;vge~{%&iv& zjr+l*ZIgq^4$oQ{PL(k*i%(u4eW1L?G2aW!kcbFu!R3xzfZ_fsoLy9<(f7K&RK)Ey zT{DJmhx~k}&}kV;;N$uC09)|Yc!^?u4lgJgi_E~R!jJ#PYScFs6oxOLrd(%Jhn}wGTxEMcZ}?dd z>FCv~RlfTK|6&m{gUILoVyL^bs@7-~{@gn7*idfRx1t2cF}fy!I(ThXX$<*)$PA z*z}H;yg*B-75U`z2wbimcf=;OpP{T$caUh^j;1MnF>V&)uA)V{Et4^{j z|C8zSz*?EdkTL@)Rxc^GR50THs-R5xv-#0s?;|tuU|}>K^L2d8YZ9PaofK{+_bFpU`YF6y=1)o`h*>x``bmVyQwut5X zJqQHvi%GXf=iBDgRAWWdknf4U_~Ov1?b8ktzSqzg@~s_@V1pGvI!4RRsBL0=k3^=x zAJ=)$%9>K&6Q3Fd!~dx`|9Q^e&r!szq!7~A!901>WAVUsd2Y~bMLMqvzZ$HU0lZH-+g2lRQq&eugq>#|FNS(kjN z_WPt8y}Gf{3KCl;M3wX^l88r^6LTiy%vSIP+1o5j5{F{wO8_-!vUVwsUm?Zfq(*_k z%O)ihSuO8|a&;>%Vtm<%*y9p=M|^T~bnkrf@C_Or(9!6v9>~w4T&$VP%lUCxMK!ts z3V*opu|vI1P9*`fYo)cN{eXTG!(uAqtt$a~VJh6UUQfQ<{_$C8`H%VTWPUCn^2moR zB0m8R^no{aTWTs)zN$0hf|=qjf}Xi-YKhZbFSJ2`ls~PQG;xI`I&LB^hY#3N3}s26 z->x!#!+w!cevZA7B#%_qKI4Z7RFa!-OoHc1D3bIZ-wR4Ks^HqLL|&NKJ=ePdiD3>c zH-QV+Xt?c{l2Jsq$9hya>!y9&U;SCRyac<@L>t~ijisQEuBW&Plb9Q2a~o)S%IM`gp$zi%NW@)j97v zYp0;_^|#m5l9x|82#m6Abz2nr z!WAzeoo)3H07@{jhR+;A_<6dW`7_%lOw$b4HQ)F8_B633i4&3=ZsW85X3{w(Zjp;D zWz^FzVYU;gAR*Q|<(ar0M2^;Rx8V z*W$=wx)pl!2OevP+n~T_XX|~MGq%}U9{yPO{Vn14YTn=V@I~DlFC74YxII-7WAA(w{> z^7>vEsB8U%)E7vrp9sbTlHX&>%EF-u15=mthv$0b(L>qq?iyRYY~IXGZK>KMwYJ4; zEypu<7QmlUTjJcY-(0%KcK`e^di{Mud&w@`*I?1|RT`{rQ8ZGS=-d4-{M2z~oY?&9 zXr!!KK)0hvub1+Lplx^oLvRaXMKO@4Vo%e-D2$jx@{yq7w#;8isQ8M5U$@IHA`s%P zS)oTV&G;hj+@?muz!yI1SL;08P7RR>J+veZU+fCG4cCLyc$>FW9)L7^QB{VXG|558 zv-fkFYk4G~RS1#t!8~W3mC$xd)h$Hczd$bivcyET?_=vj3b$G8V8y8fGvqTnOL|z; z-jR=Y8KCNIEpOqhIq=`!OXKS@~xwSFh&|^N8X{ z=`})Ps^XKAlQD7Jj()VG4nuVc8XGZg@sO`LbN27)^{&Fk-J%>F2TIi8VjrF%ytr(A zkrYA1qoYbpuXZQg!JwC8neL$;4Bx7LbN&QL?=97qUb1|CeCU_H5lw&l}ZO6;ZoCh9Imt% zzivL2unUeR@6}javL)S55$`NUk4HF4L_rKFt~847ap!v;m!aORmfJgY-`+bz| zCLOtUOy6~MGd)m_b5;hk{Q-^$+zSe#jXKUEZ~!XHt!RHxi*C~ICc2L0gG(~dJDmBx zWFtOnh=oMW96}Cd&YB~Xj;7!-Y@n4tT%0VvRF=n`e*LM7!O*l-bYShHTBEquc7CE zmLrbSvt2}572II;>MSGn-Kq1rKkCYHTNj<~vrj&jM45idsdq!#9ge4`zVNB5DCZkM zf++0tWcPfw=nGFK4i=>vFYcalr9bg1t)F5~{$S_w;t4J83#gEsHB@3#PYNnGsZkKH zld-wF5!H_r;tn|9EUkdTZf?HfUimXq#}4YPb>&z!-TNalY5W&56IJ_o*cWTiiLdB_ zP#oXZyiW7F-LGM$1s+#T=-4Tn9|SCqW~G52WVZGShJ79dp9%W0l?#d{s07K+`nrlS zl*SX=FJ4-=H#3#SBWOjA#fiV|W>xGIsg4bMUwF=i$?P^*F?>g3aYO-1(Xw7H>Ek89 ztX(2>waumjPoSByK{9~5UivzE zlIU4V9%B``@VXunN4yY}vabUugNz}nL7&mN)3zM{=-oLxugiYp4{?+0B;Rq!PZzcg z$DX&QXLzf0$Jp4e<9 z!>I-hjwenwsG%7t6(L#Ypky$yyP#8q!n5A`3BjXHY9qRr*69Z<&Ohfn?4itOW~9*7 zM`14eyJul-X-U2b0LuLtQy#JV*5`rW>*`1Uq$cGH=LH2_o5?)P=^|Yj++-GaBdl2p za=i5c%pDIK}Az1%LM*UcGb%feu7XZ`Ww3m=3kF#8zFBK|(tGQ@iVV zlD*SOPPO>B+4o<)+W-J0oK5F*{qa|DB%zHDk-5=kfnOeA#LBAm7E>!`VF>VItV{s< z={$Lk%kn!X1B911!}oZ+<|$y#&& zJ!80U6bhhk2`yPmbYNfP!otz>zn%qeLAU#-&J6FH^M3wFs8Kjr=%Ddh;n6?)D==o; zes&10sCs)}wj#F)kQO-*dDkf?HdXLGWrq+4)U4q$NII@BJuhFGe(h3a&meB*kcMz3 z?g>dSA##z5CZ9pLYZy3m^1vpP3J9+nn}8mM4U4f1X1saP^=<( zcQqWjJ;E!|k9>|Xg-?{&;~BLjcpu9o(hJ6+!?B_B8X1M;nZI@mRZFNit>)*fKh(4$ zyv8tAXwqN^z|yGmKpoBOn8=#^rCvHP;8g7L_TzGE3Vk5UnTiZ~EB)dyBE=FeA3We| zMeF&QXD%4SxsX5g^71dDQUVEC@Yby-zxbR7n679VK+LM z6942(??c+KmA~~!GSN!;(n?6UA2!Jktxf@8zWwrD@by9&#dR1tmHptZzaxJ_xzX(X`jZY<>4(+49DLVK-7e|uFi1JS zg@Ej(tQ!xtn{FgX{T*wiFj}ek4_dgnLGq<>FRw~Dx44t6He|`h$a~^$cc(S{dHx`+ zMW2;IEduy0zj4s@^DR}{=ccSTmF``pFECZyI!5=u02r4driF)16`S-NAUJBpYIR?5N=f99f68gRW>U(l zq?_)J;MFPqFQdr~75d?rPs4kNxXUcUUX&d9lINSLGt-_&vAJU6?0pk7h#(v1aHZo& z-kxdWnV(UA)KpfN=uT0=m&suY;~=$`t+yfFnzCYKO`*mniq2$}PCFleHmty?Avhb9 zxnTR;RY@PvhUnFj9H!@-Y+{^O_hg0I4fQxEM*yhu7A~R~yK0?3!W|4Bu0Yno zxv{?_?#}CfB63g};K9)#q6s}Sh>HG??;E>TFDt=vo zyX&`eHfho!_3Z~hBdbLc8_|g{Rx7cIggBMskI60%Tm=gci|1vZms0J0okdUt9o{&O zW`M%3#qf-c6VS!=|Ml%m^TplQ&R*qg5qCPK)+ym46+W-W`>0xrGrYQz&6|Ho!4#~{ z@`b|ao_A$uff@wL+JpYq0GlMkBb;{heOCBiYXZm?H!^?PO97WO(8Miw=ZdK9^cz6^ zY%r_+v9ax*TxNFE7i}x_E~;-I?_?q=&AV7#OLtAjN;8rRqFIDb(jJx(mG0hB4u1cy z(CE|auUsE%E0eA=D}J?YEmS$;gBtO=*-!1p=8KKw(`CvFiKW%2t2*0OqRSKauKiQ; zi3uNQdB-Nx1w7SytwU_Os5Pgz!r-Yf0arXo>^Lv6LMqZvPGsxXTq7i# zQ^-X<2B*?KGkj~D&h_NlQD~wKyigqI`5ZNYNILee^2Lsk;@H1R4i+3gXpK?{%>s_vkif=*3=Zh1<;$)Cod7S_!S6*up-nWhKD>0fwV%#UV@km-ZPXqEE5 zil~wqqfmQ3`9D+}J`$xNUdLUMAH-#s+?>_A)l1Y+L7L{r#^AFtX_qAaG+~f4E)qZc z_KlRvP4WIXH)`kipz^mP6xV-sAgg2wmYFzAlc@Vzb*3WOY9!=E-G-=?JxFjkvE6p zr#g_~G?177ynXns?Basc$-4UOsm>xnNJRw))!l{+q}(kR6nri9tJcwPOir*ywV5@m zAy0hf+PzJAqf!E_d_Vz0K>Jg0^GngEFJSo3Q_k4SeQ$ny$ne+j+f zC;8sHwgV4L3Io(mz*D%u?6PDx9ZC9~@q;N1IO1<__hppn*CmXGPM?mG zH5_xtV*Kh=ue8ObyrcQOhfUj;1RBLOUf12#28yI4F8bhCJVATEHa7e5ltT$m%=VsY zSv-uSOVrBn%%FIhm1aZDkhAD|n+#>AkQ?9$OpSbRs9wI-Ba&uOQ^c&Dc}L5{6uI@l zpNY>J&O!69Os^RWiY_mDuYVw^s7UB!qkhn5yVCyNsQ>*djbG;RS^Ta$lTw`GELCY> z0yu4d`htKrmH^eKp6m(q;3({m%KS=f+Zl^rKnQiHXme<)#xmn+c>@*Ktz$nbsp zv~;2fma~WOpenfHP}d#gWDn*q@Im=~8k0_Iq37*l7Ati1PU+@6di~K1VTjD7ijt!H zd-6Aq_4qGJ1yb*el=JZpua%WGG?G{$m!e;;uH2fP_ueeEQ|euL-bT7DVF@ODoK(dW zJO^zla9+HiE?>ILbz%A-4hQOQYg`p~(13PbWc}OVX-76ok?j}z2b$dLM8gku-g8Uj!gIhBSX3V!o znQDY0A_F8Ag=&0KN|KW*EqCZ#AQwsy5|Xa&O?-Xt%`5YTj;qN2YmvHjvw6HcVZJfs zY+=Mc{3<&+jP3bzr;YtE9f`pJ+!@$=eO$qJbxWF8mo22`!wF>)JN3H`oj>0=ZjHq0 z-pxsNdP3;XkdUJFy2!iEkGn*>%W3tvY?pJmt2XSFASE53!e+PHF6ai+Hzx7544%be z4PdtYszx!9r}41k?HnYAloJ$J1~!CnTbf z%GG1)MLEjXM~YemHrZ`(=h22i#RYe4#ou`z(<$Nn31W2ksj)3n?}NTAFqbXPASyTW zv?Nmf4i`jg-R>E0nbO{W`BOEgn&B0k;aNVtF|O6>$EEH@8G$e zp`qQa(1`w708cO0%v%Zp9*hbnRxkKy3UJ6<;8pOZk2PPeTQ?DL36R=QUt*Z)`uaWd zhcs{oq$aEYdybC-&{aOqz)uqLoq28xN*9a69AKwq`)&38<+@#%`NT{4gTnI)=oXN! zR4y!LU2T&(toq35r>P0cpk4;X2DVZGOBPwrkMvqAHyG>T$zJ~r-d7OoszyH`$ZvRH(^)W81go^m)blx4%EEbvOzLp~#bcq6Eh?&70cJ2+7(}cqUFMAdl^m}0h8TCr zyeS0;#wOk8Ai(G#cWqui(_?PSJ5kKE>#&-b-wj^IT(JePDh6gS#fsq>c(;2RY? zRe;nbz8KcR#FhFBZZ*(JSdp3wgJUmYhAsPUNk(&t3E4?i$Y;x8*xz7CL|O>lY(tZ^ zGBDLr#a6q(F$##-q(Ooj*RhOKh5}wEbn9}{#zE&9d8oFlG7b9tkbH`COj801h@+_2 z?RUbsWj$~PP?%Q<1Auc5Y?R}LAaxzgCNcVvS^0qy;x}JbSV9Td3|bjJ$_8LY+P6%q zR?Nen2n20{4>NQbVyCp=0p^n6jy;Rhi=^JLd%9@;qXJXbEE3UEO|)Nz-a;ZE+@sVR z_p50Ws_Fqb$l}St^Tz&X4ch%Zpr5KEQ@CqBR!pL!(c_Bx1Hd?J&2jefd2PKF&hDVYl z0AFT`J8yj*=>uYv3~#s;_MuzQd{*L(?aH*L zvGc1NX!>0&bEWLxe>*vKwgs#Mf$8^}K+VRCwvTiRtn1XN%jWIo3+bAjDUJ;JzpEY| zdkc{bxLu(HA#4JFHuN7MqF|c@Cwo(X%-WENRtkp}%6#0^!o1ugY}rEByfBQ@R4Llz zpCH@!e_FQrKO@xVG#U1Obvr1_;jYmD#wefPGoGb0#5@F$ObwZdTO_ zjs$(GbQ&+x)Xy+%lbf3UOiayCu~q~5zjB~t^sY8rQL`hX>_|H6pxjJqiSnmLl*2I{uk+z#y47n_vRtAQl~sbO3N~X}rS<3q zsTsdrI@&vWEV(Dj`R6W=3%ZXh02a48qGSyJkc2@)H4-Thv=chb?CvfPFDYG7D#k{M zjH;uTPIG|1ciMd!Sd>5H5SuCp0#u38NaT}T`Qyx=64O5b{LBb)(Y-yLxAb^8bsF=RVv68y`QK%ZxOHB`*w~U;$w~A=cRl| z6MPE^P>9x9%0Rn_G)Li}9WCt^*aWT#@b%4)G>)R;ZIx{s06#I19hue}ZvHlJ`P~O@ zZYIR%A$#&J&n3QM?D1r-be!t9z3!P}o{1Bm!-@bF`py=JIj?Kb0Bf_*^#awZ((YTH zt}=BYJ8*$t-B{W)M!Ixx76pkQq=6bN;_Easu*LJG-6NaSqG*|biD9-~ftKN8i{!wE zyIdEvR*Q-G;CAPVNXmusQebwBz9qq4fsD_FO|-NGK~e=9mI0taVY;))et5zQB#$Mb z5?dq@`ZKCe8c_ON{oC%gPASr0^Ja8^Z9xlqd~tl~DIcHzmTw-Rx;MuUu%=1{f(gKc zAi9^)`9~B@7HG}DGN+}W5YIex1`M8n@c|~E&qqD;VQLLL73c!nL96P6V3-@^l?b zD3k>})$>K34fB8n-5VQHcS$x2De(20cCG7EF2T~rhQy*GGJs-1Si-c1)QF7KYY5sP z2mEhS5)hM9&bwzjIU+yhU9YDozxJhkV2lJvtg&^a2eH`tg4jrj1*`hE zXi$Go=i>sa%v+V3^!T9?IVk~Awh~CjPSTJ0{Ac9u!Vs+!4A1xwR3H@F4N4+A;43}0 zuQ9+kQiSsBL%Ig-jKIbv>rv5#76!4$J;1|-=M|v+X)-^m{mtQ`-)X}>xIhfxD4;7` zhBZ3u@Cs@2e>@8h=wGaZG`xKrXkGq6(?z}y#P7iOXV)zaEutSIti7kc|HEN|ag;<6 zILAA~Q7IIiUYEkmHD4t2`8Z=+OY_?P{Wu5?D)}FjG%A!c+tRjm7o$@v;S*vlpzqDQ7qrd(pJlv_(go;9 z_+vXg)8_X`a!$}}@}oRl<}z_NPgoqwCK(8I(=*#N8g>@|Xp)&bWOO5QtzQ<*T`m<$ z@idxgjBaM?cB4$j#1y~jZ(g-kEZy_PcNXgEVVv0W+2cF-q!ZWstZLwVssfhvx19~Q= z@}=(Ye*sf?Fubb&tKmN()^VdPn_0r&pQK3_{GG5IIE3wWVkw0iJP+7N+npalKn2dS zO!dBH7{wEy?)a#Ql5~uJ?f!JG=#9cx{SWQK2v+t#hB$h8#v=M%WJVZ%*=V!>X`FJb z=dF14%@x(ES*3dq5q~xr{B#u41q` z&W8on-$IPxfi69Pe?KJPa~AAgZr+!+eT~~jyiFJGtr87+jr{<6c?Co-aiFR|TN4$R zhZHie-eLWaf9R{m|H2S7pFa-(y2H`nyeNla z95U~C{fMK;lZrq%=(W5*6%M=}NAO zZ`xG+7o+)?ogotNG*D+VGxuTFBA2&g6x10$Q;ma`y2^F##}!BuXsaqX^$-h&TI~*| zxW!-$7lx3KjbS&ZjV7+I72faA#yLAe`o|qHAiW~DB72(&1^kI`hj4YqKm)_W7xN4e zwdF}0tzvMEk^Vfg>(G1$kzuTWroj#*`nfv5ZLHNAi7US8 zJPsfZ&JiCm75I)9zNv(8_XxJuU_U42Lox_j3Dy|H{WSVji7I~S`0{@_83gEySW3LD z=w~<7@upk8Ja9q;+Q)w7{DgdPzN^Xn4or{qYu?dOUpy4+s4C{=PRH}O+F&6QqyOX0Q2Fb87!#gQxjl|dM%lNw>Cg96gv+zCpq#`8 z-?{;tP#UAPa;DGn>(>k%7F|hHe?Gj67EoUmK4jkN(Mq!rHobvvD^I7{zk~<`0Ek4V zLZF6xCcXsbm*3XI+#cBd>Y@f>E_F1a66mjQQLAm1-?f!a9xK)P^n4mVF%CIpvmUq3 z^tV|&#gY8#p3@lGL8IOJcO67xYj2pOn11>Hb+x-rg~INUfa~;PZdk|kIs%ZbQ0Zaw zzrdQ}a5}$%)|yOHzts5~n}ZId9B8tBLBqk>Z(!)m{4Xu%2EUz!I3@Q5&tY8NNhEFG zd8r0Qt5#1+4%_LwS@R2AG1!SCS|!G8NW8NBh;{n>B~|;Cg-0Z?dGk^WGR5tGU}Y577=6fcm3{{gYDkR^+2nEx zDVA&~#9;$(CE}RO^rMyr-G}>=Wo<{(huNLsyFob4yl(rL$8-j5GVhdw{eKd&a(oja zH$cX$2e<-lL7`o-tjgu^rc`5bE*N|Z+bo0JSAZLjA(0U3ao&cJ*w!Jd2Q~Fnmryjh3a#_vc1nY2jxHw6};@am0cS4(7QAvKwnBHkjSvLHz|m-Ed!QU ziKm$oE@q(bFN4*1r#S~VJomReL#NMJCWrR1U^$0n0gmhCn!-mOr!_^9cfgv}>;pRV zVD-7#U+np)QDf9wv!E3Ss89bQXWC> zv?aS&@|6k5&y`_gzCP)s{3BNZ<5r11$&?z<`4uyZ9Y(KJ!$z%y-eabOPGUS$@abJD z;_dGAF;-zgx>NVf^189jZplu{O}E{}+newHXfqus*0Ee-aqIu@sTH?HK!D?=M8zsl z8Q34%hKxxUX&7OKM})QCJfjNzvqAroJ!y@%Sr%2LDuIBvtO>&Jtix=>(c3UWJ(`j& zF9oBiSG-g1jAT$DEngj2MpWf-tRCAP&#K^W>no2;u!!lDbm}v?y8zq>4{_U?<(JV#iX?lUfEUT%ub%nqZgyLuS>b?*M@`Cg85zjf&3AnwJgVe(PoPRM`#9h& z`W~1jz{~1S8)<7F;WEb>cl@}eLt|yOI^!bqy0#q>I}TiI^iA zz=gjKuMc1qdC-QhfCfd9);%PuY4Ja)(*;5bts|?kak#9{8XIkvc0U{FX-dW_(hFh! z%h9qyeu7^)_d@T<_c~pUz(G7MUb27F#I49(0|+#+8AOd)puwkm0{!WGG?b9jhGZ9Y z-9TN|hv?1;%kLS@Wzp&yOP72$dZDKpp7241hSjXcK3C_W!+rYaBE}_o}QxaE*NXW6vA# zHp*0J$!RW~HP_+%PLYm1?FsNA0+_)!p4a=_UEUNKEJR6|L3>9-a@RUN7jb^lis<<2 z8Wje%^ybqZY4D8($8`E{NNLn6zVZb_x>i=w`{NwXDkkd>#CJet)A}T2!h2gm+K3M~ zQMMS9B)5dIpsmnyjN{UVpD*|pwwMAaR{~Q7TTKv_7q*>x!&<(piDe^M6N1*GJw{MP5 zJzP$0KlJP|<*#_DsXsVyjmiz@3i@yqGfAt3aI97jEUZ=+JrM#$%}Y@QFO}>eK+N#y zcE-B-ixX;|E7R|<%k@>C*(A92*Lr;7EUqnizAk;nO^ie%T)&v$K>&ty)Cdl~NVLTb z6!>N@BMehq(0R2yiaqd{9qQkx{AaZpAgj`7T zcplkW?qa}#{#Vf`jsg-v_59L)Z-UA?(`$??o)koZK~o>;D6t!JGGlcnB!C?=2-Y}( zI-@X-(%XPO$F;YYo%U1}{ew;Lg2n8<17lepY;Q6KeR&F?gGx^8=^QoxC5uRmtx7MI zr4vqbsSZ`}^*|CHe`JGUt1+5;7Q&D;0g9ymbsv6o)JoCev<5Pjf{hr~ z)0=1DGUobSS$JHhI^y?uQv8hx+v<)K{_-5I*W3ALxjC#o)dv-llP$p4S~f33q`(;d z6iOiMkM*nPlLBcDjU8a`oLa2jQ-J&>H}o`>+y9xzVdW@=$dl_AOt#m@f#K2Tl6E#d(=3zB!92&m- zF80vA7my`l5>b|i1)GY&q7oF9A!uZ@*NJ-rceWgUI6npL4D=QC!o_GuI7D@bJOGC7 zmVR!{H=B=Bqwhm!KT>gmW|Ig-0D#!GSt7d5GlQ6#99z&e^Oz+%03I-0P256Va5i=- zO?_d7RYY;p6#@AuSd{zbe^;+2aHuXK{bb(WW;#p**br34Fyt+5(ZqMDciQ#Ou}Dc( zuF8QG=6|5ykWF$vxQL33B0d?%ZRuVSe4h}2BPKj*&7zV-D0=glc+)=XZ3^R2(JOKU%VU|0CR;a~Qu`@d4I^jO-bFHLu&Iq#p2 zFiu2~h$vGXbHsg&&_x#WAP;D;RxBL)PFcH?qDS1o7ly`Y{Da)IWJM(c-3uC6@|yp1 z3rHrfb?i(_DsbM$c;V$v?IjhZ$ktV+$PYyyQ!s-v6E`Cbze|w4H8{21B;yz!)JHBU z!THb1Y5mglSz}LNkT5|$Hub*Pc%EcY3qo;!?9bvyc5rm$o`;EBGwo9J^5gPpyAAw{&oyD+T5-)yIPZ!1(7anCcO-2A6A1*O4HwY=6>OZ{J z-WzVtfI<6OJjzfaPvI|rPcP@j!^x?UqNj+9fG+EohrFH%JGdI4h9y5EnSlwyOWsv+ zLxT(2h`E=z!5eUsmArI06$1c@j0j=qYiTh>9G| z_3A4P*YqZ)%d#8NCU0w!FuX;nJ0;eDrEje0-T6H z9ZKS5_E4ESK40CW^pmrg<7L|jqIZh>zB#^KP*Dlj{juelp|yWLPeSI(k(c3`>FWoKvy??z~Gf2#m~iMgH9ST=BT z`v{R4Qj1;5{M#xFvMuL>jwhVr0&7iEl1J z=j&r9@?;W1e*Ov*yPQfdgA2mpsbKSvCu<98XEzMxw5^qbcywaa`3s+%tW!%|c^CKT z)OR?Fw1>6ROIf+ov^I`3gGp;d!tZQP$mwj|EmVi?V-+vBpVD;_l|&c|32iKz6qIEk zWVa6<=s-8aIHWL%|KJ;yF3Q8hQ`5)0ysRy+8g(oR4?-7v+$mg*BBP{^!idSv>WUBU zt;LQvTp>Jp={n^=ik&BR|J4LG_ynVkRelvTX@Y9X1$_!E*^s<9nuXUN2)Mr&R~2XM zWXTs8JZ9_7e8yi3)KbvpfpO{w!$o+V_Gu}YI+P&1>(>2o%d0C>hXnIJ=!AqM4#Xr?D71~z z2~DwU1OFODIE5H;%lnSG{pj{QPtN_2w=dRs84kZ!Bxjz1ISen#Bj*TR(nvGFT6ht$ z2>mRBRaK8g_zkTJ1lc$?&E_g6(&S}c{HP@=IeL7mrgpXNTnkYf#h8C3=A)xtr1F!F z>5Qn(@Jonq`&RB13$Xqy+*e2y@&suJ@PiL+z1L|$KP}N;AI|mJ}uy4q)@X6BtK7tzU%7**S~~wdsuS!C+##4+|ZRgj(k?&6gw} z;LYTm2Re0cVuPSR_4XEj%GK7Z#R>uxOsxp-=6jsn_cZ##kjkj2mG9Bhg$!Y6dx=3$ zrqxG9Hhv+SjXg-ce*H{2c)H2=eDp6w1im=?^QhqWEFi;NeUhY6)0q+}J&>PDsJP;S<>}~xr+kPtqMzVM-P8Xw}AiF`6IJGd5 zHpkblu7O4RRPF|zSVtNl3`@?#lY!@V{f_T zxV@>E?h`Km87PV6!sLb}KTI;+doC%V$hmG%^SnbS@lur+S7bHlDZ8QAC9UnK#y%cR z%}J?=9x)$jQOaFr^IgzU!#hgt%n5p2Ig`&g(rRGf>4~& zo#qMRD*qjvZ2I(Bcf!KK0m*nO57wr0bi6bf_wnw&P=_@sOf9}0A+nDh8bF}++(#@% zT}bO+E~!S*INNB#RuFTubA|-f>A<9K3-X$H;kw!2gu%8pEsSqzn>}Ftag6L~LmhR0akF1KObTW1EHLze2 zluoW%`IXWC^*b5cmlCf%?QEki7nEN4?}2&^m|r9OFRZ&g9Zk1`15GT;^9}Uk1qFb+ z(&QYjT)>rKllJarI!m~Hm%b*knhhNE*OA(w+cTfRgd4jjVkqh!jYT^;HWKL@jY%%DG!i5^y0?c2Hco$Q1a~qnhUS>UZ* zi#}D4&ow_kAJPwx*I`AJuY$m>D^MsFFJwJCb(??V&*Lc~P-h%;QTHk`xklFGMh(*b z+pPCShd^iA>-(wL?~ABbH@qYDUpFmUUS8Z#32`l@y>yaIeSGOGRYAuS3$526%b%mLkaTs+o3dkGJc`|18a7de+qKdgZ6(VwEe2y7IQ)L0cM*bC!LHcose<@V80kv!bq zwAfm93l|vZO+YpMJ*^N2JzD!wUmqRS4EJbpf|QAgscIHFA>arDB!(J<9&@D-Y+5wdEEf%J}pZ}cc&_T zrBU>c48B1-`V)zYR5+*P6HBjID)RPRsG7S>DWYw{zix6Eemc)_~r zu_hMuIatw_o{Nq#jE$N)B0RRGN33sacsl>X5Mdd5H4%Jj${c4_j=ZzV1aDLyB;W-5 zOxdGIgMiL=^_&0S-5im^nT!wW3JYepwGqkpM*MZkf0Q_nWlumvgz#_mgl<@6N&m}* zuFYIeHkt3pxJW24N(=$)Da_7zR#nmf@R|mfmX`j(Y-3Z`h9xIJkdr%u=P$g3d~?}G zjW#%b8C4*oIServt<`4nH;dAe%+JfKAs%PpfL;_MJ9p)o3NmN5C_kv-%u6r@vq4(~ zi=L7on+)yhSdzhG7SjOUE=(;gSwsW`I|7E&(_Y_R=m6vMA97;~Wy~vy=K|!+`ELwM zo}Qi~*`n5t=xG7dXRM;rzo0D4(aa>iYgC5v1?;SrRf4^JmO>{A|0Zz~JwHF!6odjC zJZzm4HCMgCGn}NP5q3^J)$7KFf$2%wMBQ8ul?`K1GF0u%aAJ97dL!M!XYwLZU@Z=^ z>0#u~_6f5xUm=KmAxB=f(q!(-7L@O}4Gj~;)7uCBBu>Kq z#RW>ezkX}f~{WKXXd z@cD=Z>rjP{8uyzeQtsYf8v>dWQ{m~fAmCNDDPnLcdtqQ?WFNoTWvj#S1tq%dETlU#Qzv`p_jZvH z9nXbUe;zj+2WM-+U~mR%XXc1dIg#8cEcxa}w((S?156uP)fue*$B!vSRILp4I9jT@ zRU9Zuq#}^;@JWoh4a@u*8X8%=UO3wVI)6+j)H{Pjy2g&5;5JJA$V}9*&ss}Rhy^|H z9+LMh31aSX%dQ(HG_2~#{@g}&@6!{d#*z=9ZHEVkb#qUx-QZ;D;koC`(8xsvWBkG1 z?Xzc)Gn7+NfV;~mE)|;&Cr<%@L2XY!pT(99rKquRPQL8e*x1#NpSKWO2hw`H;PeeM zkdT8-mF+yj?#{68u9P4op!%!VQbWA~Dz@u{XGcd~zrH_%TQPd(y*h1VT*{DA zh7$Q>gR$7CqoPc~{*g|yh^!xci1HCC230qjF5-)dC&kOX6O#GiBgi4If!?zGa7e^G zN%Sd3AV=A9Z%MM~y)5zSq&v_q(Q3FYV&GiB%Vf3XU`?;!t_JXxPyiXZzKE}Ezipu}*0yy4F5)KCTUBs3U zWFSeinpGyg1*;Hr&hJpln9dXg7*sO4k@$WB$Ozbn2hZ5WBzkIM(6yJk$=htZs-`Z} zuM!7pDT?5N0n>$u(=c4jblIUyFL7V94vOpf3U%al-y!STNE;34jt&CwHq=97|3^A+ zAvo@g3ae=P2`!`}0*E)_S6LCsd$-pz&5O16)2mZwj}OGNrGJ)Q`Az6sXth#bin+sF z_9~dsh=@vJ>K5aPIep6c=*VCLVNbZg zXAe~55)ORJcv16yy{l{1FtIIB6)bvA4Y%zVua2S8mxIv}$&a$*S!PB%J^7`Bvn!(G zT$Kujb>H}%-*`VKCyQlnQ^?1Cq5w9hiIuG9Ng7D;E!%$+#zEwsmsQH)ij28T$V@oW zV+R9OQK$-m1~i0d;aC>i18+4ha^yY;KTZJ}w#k3AQM|Q0hxE`SP_CxUj1QVJ5`q-^ z%@7~9I|J_4bnx(m4|KR(QA2YyZM5M&%pJn^ppC&q^cB5eAKQ*2A)y`?5_A4r;M)be z$)1JU4?0h|b+Czj{ery|K~+a`Bg*j_cpV zJ?inoZ~OJgUM6J?E|hswczL7o!rdx>;TYIf;e5bUvfuLmnVN39ntf0UOtskd#+H|3}hQ%{5Z+d?9L$u@hG{)qzj!y`n@|LOx0zs!jMWmdiuGXAv2bE7`fNiHF1-l4coioTbP3*WmJ5w zuT8=KGX{ipZlAg^t!`gJevnqx1{)H_GPr z_sAcO!2^|yQKF@u8;qekCZi});t-D&h&X|WNhH+KZJ~lICD$R+(RuKUXXbNwT(1o& zUQ>^n906>$6kNdkT+1MDhxT^=NT3xYRBy+0z1wc*Q{#rvEZGQY`D`1pFE<5*#bR); zser9w3h{ZJ-+jD0hXKSlY8dYN6COG+uZg&!aLJIhTY1AGIc?+tePKD}^U&B0K`h+8+qqRedbE+fD z(7IVwQ%+#1-9@{zItHTQ^2#DCJK>&W*|mzgR5SW~J@d6S z-ofs#waUker7c^mMj&=}R2!^b`E0+tBUq?EkF_^lS-1dYw=FM8Wzgq=@3h&4j92pg z=p!^NG6BRdP`9w3`jAQre)v|vJCvaJK*|zh_m>rjUj0W=8|8wvS*$)h0BSEguV`k= zw+Kb?hpkwDrpdEJtVl%cc+1^$adYoXEFD<<9V+_%_;+XN`uwY6y_>RFAUa+)SfASG z9v6<>S6Lpsd52Nj*1m0l?24FOtVU{x*GyBGt+ji^I=?~v9E7e zjqvEfcb)C&U)`}v=$KHl@e~G4+l->)$vmK8j(;vZBA|tfq;NuvV7+AIX|D- zntdsyUZ*j$=(4tViJZux04|#9x%VQY&@K&8^8eb+gJJ@p^Pv6^h48E zF#OR5dQZ>zZ>w3`9yi0iARm*(XO|rXwim0($aUFC(#hB?C#|=Schn}ZT~+X>$f*u7 z07GQx6{F6GfjF%%GcYb_W`jbMm{R6*tpoir6n!(BpqMh$QmwArF1iPL61Le zGlSF9%CvoqigMRzveC*Bqvl^?zd-EO$wK>sPOEQVkQ2fYkK_9uvalEypfW$~zBO2u z?GGimqhk3Ow^eH@TM3W+l8@|Q4A_1<#n-<{G}yLAu}%zkQUn04G<;RbtFqo-`}9jSc+SF*p>Yr3wmpCLxZLNA(?dC zW@Td6nk-X%6Q&78efDfr5r5LW{9}8ll2&7zy2QdEeojz3&m-k*p{B8m84jT#&kuHao1k*)5G+ z>Ga*bOlk#di5)0*baYs-ZiM1p_mu^Fqg?5laZ z{NF5hKzbQ@=JDV+hAU&3Bl4W|vsjGKR3eBi2pe%;Rx5vTY27H(DSN-`;`KQGL|};E zrvgf^G~%wX+0;>T@cDvG8P~4l0FR9U{9~5a2o=2k1pk?m}BK+X5!k8k~_{A;^JBl2ygZY3kUx#<`HB_US8hxkm$&gV$*{exVP6^)+OB3b%eF- zCBQI&$9qA1&NQv9g$2?bbd@d?!7j(tkQRjAIQcM8$LtK>^))C(2mC(8kFrvoe11L{l^U~hpyzojT3rn* zp;vtvH9?e|p6-atfqWW$P4>jXN*=0m&vu%mpcQ!@c=WR_V~ zb!sW)tgg~z;>hP2a%`!OjbdwoZ~OF@ue{5H!?`gxSc!7fjL>?IHV~LN{R~x#wn?p~ z3niGLw^};iN`}n5`_DN(MYXyLqItiMzX2RjCLA1(76PjwG5MVQh4hRTHm#?m_z5*03x{@GdrAP2}p^!aIEuH*=QfhNu)LS0} zz$8!Tiqim#ERF<@5H8fm7oq6{$Go)X$!TT~+wZ}x_) z6ha^_t`DbQ2%7pp%;7Jkjr}=@E2nzku7DR5Xt<~WEsR9H<`tw5I48-ky;f9`OO=+0 z1LCY}6JgBsEhzx!_qdHEVD1RHmBdwWIz!+2la)pgkn^p{OC z@LX6>A%o1f@Jnkt7=G9}U{h0m&Q5{S@NJ-azdD{2QoRvMu5~g$>_>Y08-9GPRkK$g z*X&~PLn^CN(r=7x((QgKK$pkXx?1(_zfO|niAW?6!}Dx|8rO9(!~FHhbr$fIwU4_KKP~2ue)6QgWl4?|mgj|K$01~X zXgr*$U&fR4o^^i$pyR;uSOrGg3Ozac(Q2yzCu{_?=D5#ap%*qz*iWwlMTvh38v`X= z%&+WRxQGk_j84bMPLlqj;LAk~Y#K|DQ)V~VZO#`{Hl{Z%;a&*Xlw@VWm0=HCi5mP$mG(a+L%ibdDcq$x^7B56|}+Nqy|b3>+cc?kjaz6#rhEpvKpO^?xD zq1^_ENfih6_o*|FFRSr^a8Z7RMw30Kt!VRYXx2n29rkZNqAWU>`y6ziVD)+2@esZJ z2Kiqt1fN98d7j%{1xzfPA%@hLj8Bt(gKZ+q9TbBEbzTnqg;T-;I3Pf8ER(Ysv;c5T znn_QYna6uz8&y3g11sZ%ngWx|3y|naY&{VAF+Gh_p^^)#sHn(;K}JFfMj?LP?!L?v zH7n_qVwi;>;wvHrwv1IMZsvDC3;?cz@4}1+5bL(_gfAWHi>AId_>fE`%~o&d%nE}U znVg^%w71h<=dcLm$9K5&<0$0cDvk-kGdlf7tCkZpmgNV7=L)VVjkTwU1*=}DM%M%o zJcsxui+eJ&UYAv;pTFq^Z3Ina@gv5{c5~|;ovpG($Hj%s2>&gsdw^kXaZks*6=Khv zUGGNO==LgPB&?qj@VQAlN;rY}L2l4*iWweRu!Nv%#3?Z9;R)L|pWu$SfO$vhtwlxJNz>qx_YMW%&ComLVqTE{@UT!W7iVYozWu z*feKvvf@J$+^4q6?@2}qJ)PeV0W@HxCW+d~o5_+?1wE|NmW>-PwX-c+Q0JQ3JpBU9 zzikSLQCC;sZ~I+4I0(x?PZRx!3Pg4oSR^wX zExsD#8OZF@aAylVK!wn_=7}VdT0XYzM1}7sQZ@_{-#}&gIO!5C5aj|&DKA)$sl zDIy}`4uDc?gjdnglRu}Ho^7nB(uSD;7`EgWDe#RdW%tJGv3LUOP(C7EV{u%fe!nr> zcmNoYC1(9|Zfk36yqh&LQD-tzpvFF~#(<5KWUU}h`YP1sLZ$trfg)ZA zP`USY|K^h8|Fn{)g@2m)AhNjBna(7iGiG zMwx1){%_xEKNl9V-eG87Ntpj#m)eTP*=5X%x|%vRVSoT`kFK()Sk*By?N5KsAGJPb zXIEd`XeCPg^s3h@&@$3_9Lkk2j>_GikXLtW>C&*^y{P{Z$!V_Y=>=$>D0SLKX;8ns zBuVCZFVB!k-5Keg+qWH94xZ)$-@p?nM$mQUg`nN|hkV6a6pF!;96N1B)Y)2MH%DbH*Hov$GOm zmmIdgT@&tj%2u0jpt!i=CB&!2E0uRQFvXC>xx9Btg)jhv+clBY&HR(Pkx{`mjKwUq z@NL{GoB1D27f;V!>RkwRkH`*^59J77oDLA{{R8AhTD&45oT1qqScQ_c9`=yShVa^s zm(a$7)@5Ak8=}SrPFPWfLjPU{$7K7GzlS2K!ARVtRnpK=UREGrSM%jxks)4KdO|(e=1dbQ{ObS>g3Q>m2 z9jxMKwH0oT#Gli_G&vq2X0slrYii+bG;M3kY@WPmC``w`reqEsYQVYvhT3zg<%pKi zpq-Kr@l5C!+~+8iZu-p)Ng+A;jrfr^S*H=w*CS0FuO+52whW+|AIiSPl$JvI@Mp+4 zBvYM=WANnWrGO^nCThG6&ugQJ9{1o-NmEXmuD35P#`5K`Ibq~)C6@Yoi3lCW=zQ5In?M&%Fs}7vRfpIuI({Je|^(EROh%ZlO%Jg zN}?Mx5%*yDM+^xAu-)MFTO-@I2T~OYqeM5J7WF{u5naZcoNQ@_xP=SR&722Smwl*& z!{)&u^5B)S)N!@^GV8u@R8=@DuMyY4_3N5`wZ-{q|{VRvno4%dJM|e z!$Z)APie%?fM}h-$?^1iET)7QuHp#4&Tu_$c(!BLa5Y z{ZLWe6(2Rp9Y-`HzQ(#B5)?rRscRM?e>}#?AHD_jJS+R_#-oEF#x`fS95H|KUzj-l zNxcx9;0Wn7qrhKL&qKKj;k>Yjh_NP{_Vz{JKjYM75~1sH=WAi7?*)8KpA<^@J#jtp zxjzG|_*-ITsaXMHri=n)T;FMrQ1rbx3is{hHD}g z%&DoVf%*BA?~5(`QX>Z{h}@3zlIbgoaXpI4AJFLh)uDe%lpdpH$k8)^enou=E!KdN z`e;5Fov^LF1sSP)%zzNor|8uP4jF;7^73*%VwfMMInYm~Xn2h+cv% z-Hr(MzHa{si|{R>*$gZwwLMwwr)pp@v_0zz&8DcyWPbiT$y3bA4#oc_j_aL}t2Z6h znP#wWYsT(FLP91uBnxgxvzQsl_<2!3E0-#H-vPhF*>nq%9W9#doL^o({MVN&pj+Cg znd^LMINgZvwvs+hVl7AF0Z!QPv@&cau}%iaWA*spH>nG{Hp|a z;_4k z>9aeK8oGLD7)G?_Lck5`2cwXDKzezA&&|BXp|?Hz{WCGszdRMNIB5FPt$Q&!)*)hd zTlhg?vEXS3Sd?{xpYCmuD6Jo{V1h9Thj&IQT%K&6MVmf#pjjgKDF)^Cpti_16H4Dm zK~UnU$JvMV4iXQBGlBJyq~^v4I^U&-Gy+i>pfxmM<6Yj}A~knLYVzXCBp@CWm$kJ` z%t~55A#8+qThU zfB!jq-{xxNVy$;#JYy~{;>gL#sey=v9f1mZnL68F;CtWWPi8I7qtRk-e)Ax-H4?gN zd>?uy^S~ev!rGabf3N{$!0-ea7NiD)`|rycup!^ONV$v$fr4Q^k%!Eo%x@k5R z24IT=N|h7-{dbDUe1yu6!LC+IB?!CMjOf=X{us{OaP{5cD)6#xKQ9Qtngs-*RqMH5 z3MK)9BAQeKZjdGy)p(DLiwj#tMMZjWT26&(2;uzV0!%RaK}r*_v@rKf$KBa7XkWbq zLG0RXcKICLm72b^nonIeBt^j&BSEEwDd9gUt1@S}TnEBO=`XlsXzkV49?V9p<$IXh z1MOL-mU9samd^#d&C5s9{CL9yFGbu(aFJY^QsJYv|93^FgF(L_Xj>VdOjPVU)(`q_(W!$($bE~>IJ&woq% zz>(3F*%ptp-((OY$)mvW=up1KZY+5L7uB~nH?$bwHb^S-8$Q5KS`m~yoB?OXmH$m! z=%Ug1Q=s?6yd`#k#7~EkDhL9!VzRaq^#|#%1Nl7uo0p~hHe<82{HzF>-c7D*5_rD6 znAA%0XRfA)SW&d$$}X6BrX3c7?!WgkSbi1z?;SWL_YXzCH2<614HU`g(S3E}q&R+v z&owSz$Tp=F6;VgEhT#Kf`BQ?w!0~MvRfPQT}Mfs@}MFJF{G)U99Y`WSUb>}TW zIiD9(1p{gpvyu8o7&8Sa)cHo0;n3?&0empF_*`Pc&fS9jNJF@sqcXfVmkTr2ej_Y- zfe-vQ1153u{XRrtQNw9D^dfU6bZ~+vjk!8Xg`#Pf>Box)I#cyRlJxa#Gf%W>b`a zHa%xPh?V3bY&|=;zKV5dLrR~K|NH4rqXRQ9fy9&#e3sS9JXNeljo;^A94Yyc*|Aj{ zJNa))B(Uu;4j=mzX^QRF%J#V0{7_!&DNW!t&>ZJ7y13A~HA_UKm+MJG{h$ zrZMZgck$BewDG;%Qn{KI{p$?jk`hrUC%ViI@PrYw}cB-M?05Dpb_ZLQ*;Eg(=y>z&zc)w=)H9(*fNEIoDPB*m zD!IKl`Py$w)f>vMW^my_V0UPdL6s9N3NL5K4&}DA8ER3(w%|-OcPka-1=YP_H;=`o zJIDMlPgw_rg|kOm=_XP&M#}ffbiC|8Ze5eR$ZX#Tdt zV=AL}Qz_`_f8ciEs-FTEj~sh&Q_6^W9&Oc)#~EN{y}=p7YINI4DCq4GXKRQ#;HW=N zkN2IJ!jxYA_?!xh<=e^Lcve-XyFu;R(Iy@~vIcZ!CZB_CbW%W})CjSD1)SI!4bVY5*iRn`teB@GeudP=U4UHJODURGA| zd-L-)Wy=tZA=63b@G<>=n~wj6@)fA^ncM+OVMs8ru&|>$qm$!7Vqqx#5tyZ5{o0nL zFvzDt&COgFR%|cyB0Zz3IU&My{;>$?!z{>x7S&Wyfmm5t ziBmwzY-+kMz1nXPk2(x|gaT~7HLWrCdqS=ZWxJLPzpl1^!RY6vbeJqHlg$_3HfE4{ zU97sMeZ8_?z&c;rJv)O8C~Eb|=5OXQEL>c^zenQr;zk0XE@`nhtmeaMPB^azHUNY{^^T0dMI()lkHigF3J2UrBaJBiV>cDi@fKL879_p-C5sCe zbMo6(>nyNBPLi2S2_*AiI$SJbCTFxVK9h|ftkr^Dz;XhRYB1i@%1vB#sav~_YijSp z&z4|#cuq3IxZ+*w6W(cD*Q6s-W`f+};F^eXf~Q&*h6}i<-VI)OY0R4ANR9Tw3$p8fb>L0b-JF++d9Gai`1UE`{#Bc~mXDPk2I%ZijfF z6l3`VTtAvY609F`TEuJsZ5j?7<2Bxent(*V4KgD2GJZ*S#5=7B2XUNaW1e6bW+uSD zF_pRF(^yzJWbhH$!XY1bwmqb>%-XW=eQdP7ZZ}cTKVPZ1NKxiwm0$Y{t2;dzR+m@X z!3gLyp+k)h?iC`sjU^#OfD^X?jxfNh9QXz0j20J$q?Q4VIhC>tJF(vaMEn zeqGs`!x-X!xhHo2x{(?)EzaZSFWUKCbc;iT`^yZ26yYxQylK$%#01u+m%V`dQaR-q z^FUI?e;|EALb5&_Cb0rQ*}wpEkH4B$CTK=PY&dL&KsAL3PW`2@O3Fk zFJ@!qY*ZR~wPN`QM;1>>)6>&I zO@>w$kv)aegbpvIK4_#E#V2Zdd$~H@kiQ>RMYSl#TX&(0QfRyXEsSq31i#HGyAJ4o z+}Hu5DVR@R`Fv4pRM(R5FEE0EnK;=>9`yRTL}13aYP#O!xA#7DBdl2BC_`%AP*yy@ z!8v?xNWvXwz{DgG`@3kX=}MdcWb-`??9$C)3zM*NU1=ziXKi#8Ug+6?VtHj%Lx6et z=07^|&(`-7xv7DpfT&-7P=F56{iA6$m+KadhPvKCxjEhxl1n0woW6fT$_-75*NyNm z^D;z4YO_B4%-R|P3wu!9D(lv`@hT{+Yj;04DX;<9l{&EQqT^vGuGgKcPJR_PGIfT&%06MfxaebUOSqN&JMey{U%8k4Xdp0Bb%a;VF1$(|wp?5-)KQFosrI47ttAI^gI%w9FS$ zq=Wz=UeCg`t?yFEunEdFhsmD~x60Kw{3#UtcTLI(e9A&U&5DYy1rL5G1$jr> zSDCADnYxwSz{(Jygawpb>NVn&l&PLxQP7@CejT5|H}`x9_XQgbK3jkXcurRJ&S-YQ z`0Ok+8!TH<_@^i0Oe+s1$gDp#*=-<5ba4^YEo9&|`F)Bm`)%jpRh1t`h?_qD_enKy z#_M+=xtCgjzI%Fe3YFi*0u?}z2-32BuTM zfEp6~4IV*$S;qV>rP|?eVooaN^m*?!B_+kc`oDIL+dx*2dtdWGZ>Oas1AAtMz3w@T zv{G9}V+mo@msHy(?@~vq@Uv)Tf^0vqUcy;NdhZpO==V(35+7x1If}jqPK(HR%Sb?8 zg2tY&zfonqyHg8{7B$8M8FLHiCMpIwl3&GOcp$%)VY2UTd{bwpIQC6fK3FPcpMP@2 zbrmE}xBpN`H?#m5QJL#W48cq<{;bRrR~yxEaVF$|^Vp~TKvNz$2?s^um1ZE7g<)QpUwm7miiWZ%XU;~n6Davl0( z;4G}uV&FD*2II@=AZHAY<#eide>bnkzFsioV7xy|>ycMwyw*n6b_EC_WiHBJa}5}|pB&q^IGxsLp5yDo zqrrJgliokvQfo$RVNn10mB-71cfaxV*0`v@5kTnk^6!Bph`Ob$(H6g4JVqs%ylcbR z*_jyg{pQes8jqaDl8UNo#6(V($?OCfl?FfMBzli9(Rppy5NS#<7w0_O&q>@WwxEXfduxMCL82J(WCV0U-_!QO7 z3?Mz7t@%N#QBg7mlk1cPd;K_QxB)%b481!rPDQW;sBhj0qU(G4bB2j%HGhdrFT5YSGM6WMg(XCW<) zu^XE&iibr7MQiC^6c?vlQv?)-nrcvkgM&It%KIH-s{$kPGku_!@A%CW@O50&Ph-g6 zbrWH|U`R;Xkq{b^x@T_IDvXGr?=VDtk_C7 z>6!z+=9cKnRtW+0`QrY!7~_4;JSs*KnJ=V)ImxA20|gQ|>z~^~bcqQ~RTdbal@J1# z7kI6;@hDQr2=hC~^>TYO6_u=SOy`q8qDA-X>|wqbtb^iKnFw#xpqJA zA07e!cGs>u74to5DA%-0iv2kN~q*opPJ{z#FlsdEMBYS z;lYm*;v4?5sjU6UjPY@)w4Z3gxaN*xJr>=iD&u~anapUdr*-q=V^*CB+iVUt>m&)g znk>MDrio>H&!C9(__6{6^_d5KQf6)A?XYYBu+BgSL(C~FmaD1;PKIo-K5ju)M?R(Y;z2b;Fm=6?#@v!*M#De+0(pjF(PG% z>O3Zre{OKS&BPY!GFHTbn~EQNpy|L@U`y&EoZ%Nl!=x4gqvZ+1zWu?msTP_wmgjYv zEyhYrN*OlZndhOPmjgv!sPgz1^UVy8V0Q1L8U<0y6G@{KQm;Q)7l@OR33DO-e#(OO z*w3Dcf@>Mv3jAvDvtoG)@n zCjXu;`m{efM^dA6V{q3({@r**&0$>dRCu_QdMxST>kekZ z{|3J*GE@#cithtwk_Yw~?2A%Z24Hl9#0vf9XHQ+2w4cdHw4gc3{Awp;=^lu^EY%3h zwq)L?Kl(p)f`gCMl08GIZ0wht>{KeXEjmXW+PtLDk1Ac?%ZYu@ujyIe83hudk zRXNa(xOz14D7xAWD-)L&EZObe{27>Rf`(9zs6i1K-GP8RbKOn?t<&*S=RjFzq%0!h zixa=)3w!TRjGKHO3-s@2PALNP{@j}qXx_>A!73Zk^@w`$CgsgVadM6`b2&kpQWB9u zVGHy)KzYlJa%ga51fN??pt7OV;&jXM{_)afHCz{UE0LGn%>~uMl=LU=RHoEE?^24p z1_NqYs0>4CnLY-cj>V9?&??BxzyQqC)6?o#ttDC8%UY9VwWncxYNMec5cCs|sqiJh zudq!OrbNNryTgb1^3szNE$v46c>hU|Kv7t%twhd<9hL=KtC3B9s1OO_OsFNuhUE!s zV;-E^iQ<0)1Hj`SFay{48{@IfuGWU08@orxV8@jNzBn9K5dOjN$Lu)w7AfQ}9Yo+jiD@WC*+}yx0 zeMgnddayYi!M0=AH+myuuuD7-nO|BuVk(rVp_iR)5u^^eq}|u)=V+y{F*SwWXos%Q zD;Ah;#1-w6o612}4M}(6Qc2z=9|%J_AFjJ!Bk%hPPrkhP4{^l12chs<^w0Grg8>VSngkHB5lvTzf!%{d2zg+b1uqbo~MKM_8ikfkN69uiFTLl-C3U#P~nG1*)wP z^zv;3H1#>Qikh=EPgUyL_2A--6$%~!S9KC0FH2-(5aKH`C>B~L_}wXAd39__@?p3C zPo5G!pFB`1-!YeYTn3;Evl-W!rOgu<{-lAL(9sfMIe{LQ(u5*tdIYn1A>;lpJaKu@ zYdU`K@kel(_eYXX%3g2EVCnWqMwAm)%xDogL{KOeh%obk;BUgGgJ5RcEw0KC#+M+a zA)YXbnIaB2W+wW;Vkc$xVCS>n#M4}P9K3wxskO>{v=_O|bV?E}qnIj9LGiqBS?M3B zjAWE#P1FPJTVsV#fyoaJ`Xa$CjRZof8AM(3TiH|>zBx2@KbF%#09M?J$b1VJDKC4j zR6j!s0xK%jqL?6zS;-)LV2;J|#;+ipl293aaP?o{#PX>)34-MbctRsEhY&zW{*=Y-DI3Lp04}tIm(6bc{`mzDND)9{r5i{{KHZw zey{)6U#==z@%_Xd71a&yd^H&>)Dl`HEGcEI=U`)fJ$jsTWitOJOz9_?28Gi873|Jo z$y~CIVd*oO646im(`HovuS-ARSV)N&|6T}`@wF^Dm$}O%?Y+grqdnTUa(%v`;P>KtZpXsEaCfl!UL zBUZw2?YC`s{4(_V#-M$)PP*J_*4f+}b`LIw5OVKtT=IN#bz3$IPyU3&#KPD%n`js~ zlek^>BOJRq0~o>zc!-*(nm%2@?{quLyFU^ik_0riMD!DKg2H#qc8QsaflUh)yfU+H zZHe2tbL;DPkOR<&OfM}3rRbhPJcx#RKrrIJ8Au`TxK>~ zF1{x;0*Ed6{hK;eG;oMp*M^4H-;S-)#H9R2%J{eFnHDi*kQlv_6B-*6$D)ppmNZhJ zm99@@04=9_tx7tpE=t%!K)_C6u2NRjR*e*YiT@=II?s&mhGMS}y`*DVc(_THP#=bGBEinj=cPmyRX=#OCh zC^j(mQ-1isyZr?1=+v0gGf4SIpLa@Ogf!q$m)TIN(Efmx4i)}EH%)W|QfOg*-{cj6 zdsP$hhW2mcYitoLFC;ueCYD@s%>2M{E2ka{RXQjj)HYIms4@f(53z z-7z3+vfLjm2K(K0R4gq=PcONx&o*&`{AbX%41ot6G4a6E&2~lj{2d$B-R__)@C{f6 zW(h@_^0?Pew2B>*O}Sg&MFg@r(PD&yod&sh=pk7?h7ziZ2gF|$ zELf#cwgMK8$OY-!k^0DUf6{*~+1Z|mt>g?JHL3FNIsT)P*E~6dV4mb*vAq&;fQsN? zov3l2J3&@;NeFb)Fkjs+lsg@WxN~h4`gkEB z+d%+kSeeN%#-$|?jQ3?s3J;3qvqch5B05S74ojz7KGFxOCwW}jD#ko$485+2D~N)bKgpT!Xl*5*$tz)r(iB++P8rszB%!p}VBj3J}jt&lsz5nwqaab2ZanB&K=#ZsC zw124u2rZ1GNl7a(e=Ru>DFsQ;-=Jw}J5HU=1MU6yqKJry3MeLKeNEf32x!_ma6tg= z9vi~|q})i^{BBT;BsCiI@+hqL#5UxNQq=8B%hN-V~z3(7eP-ii-oPFXpT~y&o1AUQ$yp z7StD-E8Psyn|?Bea-^?f2bC;TUrdr;%ahKC$95+|0Pp_TVz0NjGd#j_67$F%84%0* zmeVzyh?vO&4RN`tas5&$E80z^7|(qusmNw4VE7D7L-0$f0x}97_RO z=S=!!8Xk#q7_URY`dpIJ`M|K21c^~X9t%x;zaO;Mj}2lhy-cZ|^GguM!#hp&NqG~M z@dj!o2eC_|(x)W4KRQZDpJhCo8&}*&q@+8c1Mr~)wkv&?dtKG8Hc)m!%kN;$hW5% z(UWUG`rCaGUFB_)yF70JZ=GbO}0j-%t}E$$#OGeljR%&5;Af?3K1yjbFq4@LP%Q%j+L&H zRHgHX+8m@}(xf(C?^+?6N5zYD+H?W&WZzH`r`~%%OLv3Z2n6&U-c&ql-g;1_ExjX; z?c4>jzK(PRIdz)uNeBnxq%iI?x4%Ym7;^|qO^*H#{y;PZK|g1c6$Yw z4RJy6H%t)7J~rF`{zggTC(};pP3J4ZG(+^{jj|EXYU-#L)<}Y{DMm%r*EqQS-1&1g z&6^J)$a{Hd*A~b+rwW3qk*ufP)!8Rlp%dRGX&LS~ z7Xjuws~MKY06yW&8`NU;fAtjc_?Yt*5Xtb@zmh1ZqJ)|IPwjKNA31}gp=+b|FJEam`KD>$9iOW#Z zn>Pn5XOhAE$MFOV4EJZK8jMUIs?4EtJ31hu?=^#zJ4Qn%Hz9m#MFuzRZRsALZ;YiB zSbmvJha%a?ACUDdiH(esRjH4w^1byQTooUb<%*62jg36~d2;{Me) zfyobj>LR1n@5i@kQG>(FMuG?n^^JQkTeqfOSas4WRdD|PAL39U6}F@kygqT;9pa05 za)VN^?kBg!${-Z&@c@_h1Fs*pzrSa$gP)8dU{2GGEaIuOY1(`S8CX{K5b zAEdfRxqRysh|kwBHkZD|4w*ekReVa|7Hxa*SEoCFzGbHnWZxq6z&y<)*&mm2ynA5M z?RC#LOq|ZB^}`?>-P6;+^9EDV{u54nF7KfJ*Mv z6ZB>4PL^(+_en%5B|4P=?)dDi_bcU|v~cf*RrF#fxo62wgD=7E)epS(n69Xt$ed=I zqR2hF?DJdQVkgIi?#=lWHONFeHj`g(TukrJyx zysGfh^m2N+k8{84*SKD6#j^oNfWqU?FIAGsSZ(a11{u=hkj~|i)j3X2o_hae(b$&0 zeHkd&Eja23GGX4bdl=ACQ0h8DS@-Yk2F@=evR9ITi;4NTySWfCrMG0^2dRq`+h0J_ z*k^;YHIx}aeVxP&073*pVXUEClfw`pKtR35QnPr8oq>&(r*ziZN#Ms?C60YPFJbTl zmIYAlY4`R)>&HV2$yffL3t&JFce4j!Fi$r1FPr%zZijJDNP;ASkfv+Y!=W;%B`v9A zC+n$fpM*vT7*2|nVSc7zr%_lG$?Fls{(;&(N{TRg&8hFmj<=i|MODVoElhD6Zpop< z^=Lbf!A)>(e(Qlkc}lSzv5z?^8;NJI2aI@!^O4l0fr3I!I3wF)xIbVZ>+pwz&)+l5 zj?X7=X>Glk#in(Rg=V9I0NM(|g2F-%L~>Xd8X6jaZs!!~+?RMR+WpUdQ#|gQl4(&e z>dbJ=c|`lQ0G?WPNTF+jEa{}$L!zp0gm7C7B-!uEv2g0SLVitj1CaNz?0 z>B+ZUCK7EoH@7ry*9NNq0C7nOdQwV`3iEJJ`vsKt44b<|d~a{gJa7OjL-P^}PxL+I zXGSX6OAsA9>scuP21c^O!J?ciYKf;wd*O0vA`3Q9hIUKurt?^_MQ!E-{-&U$BsG-@ z$@Q_|dkQs{R#isRQ2SKtvMkCdj?&(~4cvw~*TN+t95U-u)*Mmy<156tTy3RC=##q| z{grwhR234_zH`w}5l7{E9dWf_otozA?SDdg>#?blJl-K=QsaYS6fF%RticEj00n78Z{T1x6Vpd>F3om`j+$(|TfGjWIlB^yl zcLQemg!$PIk#ptH&swcz=p~bh~d*ZU;UjVQLY*gw*gJj8W4(git)<79x@g!5& zFy$m5V(g&t*_|J*j)i^k$Z25+c?I(>bNV_qWlWwiD}Z-)LKtw9XPaj}#k>?bJj>6Q zEOA99w0tJ=n45tiv6)}5lGq!#AdHED5k4G`7gMh&_)GI2CbCS8T76n{iGWg$GuA?b z$liCjT~jopbk+0PR3IQ7%%rt96X#!EJH?lMi{E+^<#M)Y8y*{>+#K8E^gAU5r-GYU zsOX*fBj7q;$VV?gz4BwfKQNo^P(pG}u(<+z#QP*9Y6}FQoNm%|Fhof^s0mtADgg*z@D#R= z!C!f>2QNi^wFOMEuaC$P>@AS~cp=dPl4OjGh-`jw+*S)?sZX2D{Mq%dw4p`2m4Z!` zc4Z7s=Y~w|fI0>a>H8oK20lLi)I_h(Pe%P*^S_q2;4!_RhSbskwD#ABVClqdQ#1QiT4{H+A8z-{j?0~1_Q{{;K|x}M7j30{l=i>yp`T%gLjF5x9l6PS z_AM90S@H|8?*WppBZy>$$#UUkQjocQ+3j1Ys)15o)xipf!R0!H69cD8sfbOCxXt-d z@ePqHO`g1~fvZQd5TPXEF>l`MHMQ$=B-dfzj`sE2(c6Gg?VPvQ6Nmrz4&PZzq!v2+ zWls#e-!Ez7YTRLz5U?oI_{y}UaQt$VeYlq)g9UMMw>iI!s>!jo08$Rp(;@DPyZwKb8EE6zWVZ^x3Z_Ujt1lZZ z$50$F3j;D6hA=RmY`4{%n*5f~z+a#*x*a`J>=XjkFxu7eSz zi$vX!bUWQXg^&v>Ol;X^iuS75RIJ{f(sXkh9Hm_}A2k(B<`jlzDF0+)O>zfw3=bg@j=|!{7zb8}Q4GaG| z_nItAgU!0+#5cha@w%stg{={LsGTO^7#eC6j(!a%_|Nr*HwcfrNnR)+A;Az}x86dZ zrli8rciW)(5H3rS4=51F$QC(Ssi>);FE=}30auW96^l@PFV)6ZH$5hbKz`n@d;#rY zU){@$8aC910U40#SswWNzg=q6+yh^S<7xC`oMrV(BP(4YN=6Qgn@vWvu6O^%g<6gIRmjxtn1hEJ!KFG6}<9CZ*F_x4WJLUNnrv0@c-})P#+*De@ znN&d%uqbvoY?j+X4%6KLfc&N)r20g3BU};fKNP$^vKmJ46w#FBukmQNuDgE#+2aHLX#3 zBfg`cc0*Wn%z-q^RHQJdx~k;QG_pFZK@5GVxVdABzC=#1(}}pGxKlrDYK9C>0xwoa z%`w#(R9&y0gS0d?H8;?H#*q1wdv2sE8fYp7i|mBJSuCn}NH`N8YFG1u`C7- z7W7^lit*w9Ue3bQ{i7%~h4uaW5^f(?H50QbEaD+~LA*HP&ac_c&dK&I=H-?yzm9cyJg>(h+z90N));6e&yT|+{#C30hjqiP;26-mRVs!V`gp8 z3ZCHmg_KcQnjCt+>y%j9#&&jgGU#C6;aTPbxh;`DcDmAVLA?1EP1|{~Sr_KWAz{Om zWRzNWfs&`!=ElL|BG~+=3Lwc7`9WWBG)xXduS{L!*wD1H+ba(4{6DUXfBU(s93n#v z)Ru#A@6BjA#d=0Yz$8$Ah2W&Dab=E32nYG+v|^?qEkhWbd`x&eih98rFsPX9t6#vA z?T#J43@jat?<~{=c8*!+_ew=eDjEsw)&q*V^GM~;(AfiG8|jW9P;(|-XFwo+@NwHW zMMF{W&fso0X7 z3zB))-cX!ZAcDm(MoRs$Wi`#9>z>@B9Pq{^i4KyX8CCl@Yuww(DU)Nb`#4xP$3yj8;KVvZvt0j%;dZ8Z*a!sDAaDqev{ z+RY9;NK3Rj6hsZV1!ZG!!QdxK%SIyy5eD-S#V??Nh*{R9+gCA6IIW@rTl z#H)WwSINE+|BWBZ)oq8_&fgs!7=W6-@IH`%Qg5r#?ndu=H{w_SVlAsVWyhTNU=F#n zYvg%{*A$Y?y{H}%+mRCm+TPLnGDtK-G+-nTBPpu zFsPah%N6#=>>)Vt9h5ffd=Lfc@*b@SYmK+@6CW>0?MipSF>PK&e`^vo`mKs4yC~$L zudm8|S=eLkH!)YNF(fC@uXh+;*?Z>)fx$bU&~)+WIh%b>=9Mo%MMh^Mw=|7b z!jp+2gU(})PER3#Fw}fgjZLlba#;;tusdd53z992p^*^AmkMLy+z3ff5=ge zTBPR(_w*siN?V`Cq)w*fu8f~w2*M8rqHv;sh0WArrTs^c{U1-$+z%N{s!gUL!hV= z1Gb#!2V7KAi?iMdq2w&%p=hThm`%`_lo*LX=9O!NH;UYKCYoTQ|0*(_Y}(QS6iE%1Pa>ieA1&ws*DuXdRz zg#U!Y0;>cBY41AnCiQKPvS<4 z&qB=nE0>E5o4&n^T#jRtu}FO&qg9fOl24m?rA|q%`{^IKLm6uM<>PJ=_1>S}Nkmlr zjyy5*s&hHRT|)A0L%aept*AWPh zSG>-qzs=45JYiD6Td`S-N~rt0R(7(dv{odP`ca0Sc^sVWEM0TG8FwDg~s z>k(E#XqCtttrE zdyhX$J6`^prT@7*>|`f4mrhwfDVkcUF7g~t_>J1;>;6Rl((%a(0m~FImmIZ3t((Fb zp?LP;<8p<+(s6$U^yuBbJzMJ=XBgZw~fX!e0gnG(8S2WWuf&cWIk&RC$QJl&{sER;ns z%)(jz2tJfMDx1`~)9h$H1TGWDpoO_oiGqzi9Oe4aXY;#CQNSwF(tu4B9=r-uo`qQ@ zqRug~N#7Jt!8UcmM4mT@@EMVxJ1{YJl4m)5~s6&s_SQ}Dy2=V@v+Hs4+TRFGBA zL(uQmse#d&K0yE3vacnGx>ArV-MLu4JniCjQgc%Etcuv_U&e2l@{n$e<@~IoSOw~p zTeG+-kJ&X1L09!8xsof1>Nx%G&a(rSbQ@ofa^F3)a!ig7yRE9`e>y8Sa0s%LJILKB zc@wA%jFiyM3ScQZxt4cmG*=isI9zU+hp}f%wC}=08*Lrxe^u|6llD2q$-fl>x9Q^) zOMP=x-p2H{S{xfWZEuSvjTtm4#r1S6}eJHgTj9N-8Wpi>^7Oq zXjZ8=g7zcCnR``zAIxw%xu#!v8LTa7?v0EgcW^$lqc2a7wR^}vDKl1FoZO%$^j)Fs z6!y}(6-;9OP?>RJ|Kcew+3I-{8g0j;`ZwF*(-aS)=d;Ve&3l8_ff`M4LZ;G^G2M(R zEj#vvQ`-)Dxxygrx791?tWbr*Dg|E?vh8nO1tnFHL!-Z$!NFhSEi#BY4v$}8ze~we zez#lBl}tLRdhJ*xC(+0g&>P=AmXS^Jg;`!bg`)UqE4<{3VOFk-c1rb@|$HCNRdX~Ha?#W~o;u1lpM z%#O3Y+`m$|$=w>>$6KlAVJ(-x!}N?h-D+nL)ejHRoj^SAb-fk6?Bmicg(*ETW`XDD zdf4x3LyZ&R_l)_Pf5GLu85L-KUQ?XRB#4QgP<5|AIz81(18r9t)JuFHL*}d*at9#u zpUwo;ag?Q3e5<~O@6aU?r3ZsTlIfT#QPR!ks9&nS3teGp-@NJ&pOp#A z(3i>}v*y#CUK7?oMEv_vhNJo693Q9Fg%xD$CAHn~n_;>8lWd6SKCbXjWLRjhRBRSs zlTX+WXvSa-Y0YaqcB7VWMPHsg3@boz%RXD@0NEmb$v;47GuKuuP~s6FPybKAyoTwA zk)U%Q!9t~UB2A3yDM{^Dv=&!N1v7z7$(r2GeTS4V28h@ zWBHfW+p|t3%<@8&(X@qZf$GKLTQ|F{cv4{H)PH<#Weh+J#gWaIr6Ah4S|6PUGysyY6= zt;qRp=ro$SzPuc@UdoOnkYM&`$EWI9F`^0<`89g(NgzYBcNoW@uVmhTxY`r*WvLmz(zzAGL~a7Mqc``|11Mc~a)hZsF)n zBw7W5!JQJ!W`x$)Q3+x|tGQ?r_@_gQ;~X(6F(o zYk>pkz@>VZ@~p;*@KoOS3-rG%^gb+pUEZ^uZQ7qn$`1g5|PQwjWX zY0SG|8G(QxP(xSHz$=QET6&s6EeS~8g=9`j-w@N89A_{5sAPOcmsZ|p&`aI?Z@L7( zFrVTV=&O6ZLhwZuseBp?4O=z;ht<#aC?z9z<=8rCIVuAnld5;I`&bZL*${#>n@|~| zGpU~^;``&bH}t2!4)l@HM>Iai2%rv^DU?8_veh!~u$2%mMt8SfZL@8UntkSed$~J0 zh{PcYE-9>u5o?23p{5W^dT;a&vxZJztAqlf5T~5IAdD=G*X!ASw>KVs%&t$@O)1OL zw?|*8yJr0%%xYK`Vea`ov5Nh~b;(d-Xrb}52|BmiK}(QB_xqdneZ0%9#NAY}M13&^ zzRTFc?nG^nh(iiS!fCoVhDy%^E(L#uISwf%9{a8C_z(FPJp4?zM3Eg(NRi#fs$I&@ z&a@LRIC2bueap|};-;_mM5@;3M0 z?~QQ=|Jb(HN@iwe5-@l6-RX&)8#CriH>eGp2hU_+4$k&0j~n0-qf3>_2mm4^R$|GH zGoBt&7k#nDfV1i(5ol-?da~Lo^H!50LJb)a89GGGZtwPs$6~ZtEiZ||nkl}FbbP1- z7v*ffHt5C|-)N>k@1w!a1iK#CnJ@8?UlSX-?!(r#4~ws&#D!@|c`x5N{(sq}Rndw|`# zZ1xD%j_D`KhX#{swK&*q_5}Vddeq>D2!utuNh>LCf7Vuj`KQ|(bc>ZdDZS=@uHP3n zJo4@?*VEI(RV<_GTMVK+i3=Gi2G5J$cU1b-+OGdyGI;HZLlL0 zkovHD9eEXxZobv%WVwr)i7&v>s7l)0JFnXOJt>B}+yfUxei=t>SP*lD;)9a<_@&&6 z{(44XtiY~dU>l#0UNf%`79a)Mb;Bch3uVW;bpei$STmgxm)EvOUhC%W2yersuOwod z3=W4uay&!sKC&^dy!1!1YkfT+-W)aS0Jp!Xt3o00%7{WpB3-1O z@5;Hd3@=J&1TkY5A7uT|AZnVgb044CDgkz#1D+=G?|8oAxhauTh30UzwP;x|3@U@! zVt%;Av2&zABKfQgTKm)rHlwgukNK>U!C57?j?zK)D(B>p!1LykwAQ_;p*+Lw?tld7 z)qcrAQ$-nYuo)0dGOXi$dg*3TF{k_L=GcCuH#lx`7tK4uK;6~KTS%H!Odk1-R zb*bpsgl6bI@o8}EyKP}(@9-+=#ROsW2=DVmvyN{tG2^ZzrI9&CQg9i1%nNa?glKUG zsEcz#I@zD|tb(sMb@alO){SUvHk{RPq}H?6b!ffTVpXphYhQ(cIG$e6Xj?M{Yk z>u=8!%%olfkMvu@7xc!q1O%aDBZ(S_3{ zFey@O86)f3sjd+S;DRUDdW+PVlJ$DmYua)@H;zI_z zlU&pZyOGA?bQxSvYD69bjA>#TPYMAinM(-hkN0xt(*7Up$&Lw}&i7NtFf=u)PoIX| zoxA)5dYFUhz0y4$fQ9Kn>J@Aw>QjgJ3M_Ob+5~&%3}~H{~+ruhTsPhrXLA z@p3Ruz`WPP>85O;(f3j8wDonDg6Xrv{~8TJ3|u zz2xb%Z}WG<$Fg`SEC0k+ksR6Uu-Z+5`jfZU5O=f#sz9IXQ{lN}#n^jy4j#uHKXieu zV(gde0PJOV;c+wD7n;m=3jS{Xsox@r4`_TYcODH}kfH5f6RB`VrwngHkn%6B=j9QH zOe3^g;3NkrQMi2)Me!Jv9z>hJ3o+DwXjN+_#q^93l^?;33`zM$;?p^wd8p+Fiq_ec z=DVVJs$Wxl3jwu2-Fa$v*!9V;$|O=GM!1-ysALF}K=qrz;zK^2HZ@$WMx4jTja5wm z^PttMVNLG(BfjJfh>XNld!O>s2I$j>$-wk zuVU{t3^50_!|7CsompjTce4%}`Ju!w^Sifc@sMkrk&<+utY({n(BZevVAmooY-{g| zGHag(cy|ZS;>lS8J*^FtosnHAh17Yin(`u#*CI0l#Ej(ko84@sHpB)(-hRu1S7Rpi=@|+YgB=IDy_Bl z;lFKWiTiGp&4I{l-Jw}6vJ2TA&s2|6#NXTJ9jxk6*dT1y#fzSq1_{!kBp8OSiwQ}P|MFvAvTn0Rz(mFG|) zFtyq44xhQ^?OJ%Um~vIeTWG3$$Z#emmdzX~wdh&*rr7M&_f91tz#RDeI7eDwcmvli znmPdn!EaV8R!YjeXJ&^f`@O81!k5`%&Wt{}; zUZLU4Zie@;*P0}Ec)CCTK7_P-(!>Y!lKFeO{qJLpwT44fTH1$1SPUr`v~b!rx@R#7 zDg_;$ZW2-0izq8#Zr%@dTkxzys^our6NZ=}%GMtQ-rn9==V9ra1|a-|xoaK>ZUlwW79Xu2J+yn;e3Hdhg8CRg=?iaLI;1?EyxHs{@fCxwlx#vgm%fUo75kU z(qQnS<$v}^U9HbDsUNyNT|I20?QF&&e4+aNLa){CHim9svwU~j_*jMZyijJsIut+f ztVe=echxKaby z8^Fe8!?0cD&QoVRX1=U&5UCnnS*ybR9`_!ZOgM7p4F9`jMLF^OUzXI)rpi$f8IL4~ zyV5&RH%>e1m(&D&3PE#MZ?)iurT+y@xbMq}{^DaewSi5T)3!;JeF-B#q7u9DH4f>y zNPMNAet2kq0wPcehXP+n0eE-eo8$cPw; ze~Z?<298$ykEy~I(3yn{qaLBd_U!DESfj0XxhZn>D(C1yd2aM)w!C3y5i%_PXY-2~ zy|nQ4y3(lB5j!;Ca!XC`*}8efYKN1#y;p#JwtKuXT9x9u-~&&m)L(_dX29Wa5M9IN zp4*J@{vqIc{^}<4ew2{x#<)MUY3KHgPuqZ=GPYBup!y8q za;34$S?}^4piy#^{uX4ApzxVi)NJ!GHKW~@4S38p#y!}86cT>2x$*lvw7ai1smf*l zK1S9bnOe5Cpe;hJkya4K=d!uT@wn(_n-8T>|2^@&od_U;3Ppo$e$*Mi9yIp)0_zOY z|Jo9-T&YgYXhPz_h!CCWG97@RjBCB#QP95muPVQVFj&nb1bM<$6pzS+9aP4uM6}>|jERtLY%2tk#gcT>rAVM9 ztx(76^z*tqVaIyy#pI^)PaoEX>2%x>huy`;t-C zs=ncff%Ta0`xU!qi$#-hW?V{3qUi)F9Wf^3G#geox8LG-hWn0(>W$Y5KEP6Tm3lub zUBLtd5Oh{OtiO50kZ1*r;Y<6*J@wQ5+8nVv9u)T$-kR-zDvFG~=uczanMrM5qWP|n z4wlI8xqZDAPAgg>a^~tbr$Vs{O#eG=RBM6?Q!8d9=nF%Sl~&IOPmGg?#s3xcrv4Hm zkrr9Qn-2kXCDAnB@+7FDdG-l=1&9nZ$Fmv=v23)*9PKB-oK{b+eBMC>QJPUa2 zu7xvNl^{Ku@vQpV`$c{b%bbe98Pos>?s7J(l_ky9FcF>D(vyF*d%k|bzo`Mu$XmMk zi%F~sDO0S2n&vtu&hxZ_-E%&(PGJc{A-|p(QQPJ`a>66O($C-6VTcQ@*4Yu?S^1I7 zW-tgTD27=uh7-u+H+z7lakA)d`Vp*_y@8B10;;oLXWN#6ih%Tmuwy040z`oqe`o|V ziD3h+^U&YKAED@28jGAFhkaj<@Fw`DVAFVBi(l~L*|gaX=WnIWF)!73;n32<<)ohn ze}qT1(gyFuR(>r|yzegzp*zhqs(s-+r});bPWMz}p^fB1C8U1a3;*a=+~Chc%F1SR zgqoBbG>`Vz(t&q1b^*(A=PuCyOa&>2SdSV-*`OX0!xS+Ga^Z9b2H0;=(pU4a7&Jtg z9F43Vo!_y?Bwq|`UkcdoK?yUZyVLTy0Q_ci${iLqOg6VFa71tz4W{N zrh-$*{_j@%Ydeg_zsuJkCnQ6~Wvp83ks4q>*?TWQ;Ic2P*C`+Aba_=I9 zv`qz1%4ZVQ!%4liLoEA6o;=tWNls;4(7Ouf==nd%w>nWzP}s^p^#p!lDGJ=5$ac1y z^_E7X)t2ONGA%L;PEds5H{U6~-#z%3CoW(wQtV}Yixj{D^S9n+lOVNIH`k~&i&z3( zLllg-#_*6uZ7K?9C5|xZ%@=!0w{VY+B-0rJgu7s?Da^&m%^nNaKDXH(B;TUU zuaSB77l%m^)1NXN2s1Nt~1>cdq&b{=ifj6_CS^kD z!sE#vBeq&yVzpc$(($~FbmYuQ*}2gA*C1gsl+ByH8F#vP-Q>Y#8>hQFxsI&Q4?o`) zCY*xl*@a>}OcCHBL1!~5+r(|=2GJK$E2oa#gP%4=_Z9;|zd44zHmSx8L|M|GZ@i}~ zFr$=D>yYdSO}YK%8HtI&g6VHN+_e}`hY~ORFucZa?$fCr3Pb?$d?Z5eEx366OXr)#jxDgRZ)b@`l)`m91zi&Zy z#T`=FTzk>vjqZ63go7mv7LLu`(n%5d`JpVp32x2J9Vm*GdiV45XZBqrMeA*?d?^b!Gv zoz!Iuif@J-PIQ-Cs_)nrTPmKTv(8|8R9I}bPnJ`9D$f$ZrKYCkdM}??nxD2A#G^hO zItb^Yr>D0&S@+)k8;a6lx^}@bk-<)B%etK}8ru^zU*Q(GV4_fKD8>&bR7Mi;%7@*5 zwbV$QqIOKVFlVLBO;Gw5{7Fu|4W@#%x{R2PtPTtW<3O$IBUi1*lQLs^%-$-6 zL{f@FBg>ujs|vbj^U%!QXla{X@YU4yH2RflI{^+yxUGx;86Q4<;_lq9cUSf!_)t9R zAYGT$A!KFOVjmC+h)4wNGA^0wmARR!%@`5f@?5?80>er}5uN(2(e}MlZw==CJ3vRG zq`ay#>(PTFK`X91<=+6<0eADuXEd7}--!)#sI0 z_y$jl`K_w;F^q4>1l>ym$}|g?Ee7lrI2C7z!N+76TMzv0OO7)JWwdh7cUSj2U&L0R zn!K%-8?_2Oo>G^0mB>PZQ3d38hT=t_Y^ex)kLG!kJH1s6uv{aNnPe(Nn1bmux1>lT zOXsKE(7hVvjH9(q&6uS}L<(f6&uKd`42Cdpq%&a)uZh}zH-1;s!Ko}ArZ}b+Jg3Ab*1oBdu3;@ida&sk@M|}fTq6bBEi#Gz6~|sjuSZd-)k*XEj1ae= zdYm@axmFeo3?jUH)BUsX`wABS$^K}@42$E$3Zu3Egh-dhm+ubem`05))weE{PxSE1 zZo=pF`?*Fo*8#l?G|7+q(or~xf zc~?b*FVOJd0o0f*9sw(Va^J#>y0Fk{#-izD>_|Od$C{Q_yz@AP63MP71rfx72wOn_ zom)Uv82_h9p-eWu#hm)OL}r$+9?mhM&peq+wEmPBALA#Hji)cquLjoD?epDfi>#7@ z2Ifii*|mS~OM$&}tS9j`p4lE~*y^#yecd7ROp~yVal%sWMMx=d(gkE&zN;0e9JK(^ zd+0LT9Ho_OU2IMnsZCtGImxQ<%6)8uShnV?qIAIRyINh|Lbt}?^VgSHbHZ#$+|P*hsh~szw#pM z0ULah0!)==Gr_0NaC2>rYd}AqXtAz+NT7tE0GQ(eCy{GUq))3Aj}_gCZ<}0oOqHwM z=y8jic(lE2!CzDHO0e;isCua68TZ#LtflC1%vwWYZA;B+)>5-xgydeCFiA1UQf|so zKw(H}64L}a%Z}l<$4VHFoy7zdVd<6F4;No_t{)5H>o6RAi$c2NZoc^nR^+j!j~c6AkW-$}u& zE3NNNsa;U|fzJ)_^&_LD*2C1FP-7D`7->ZM_37ok-DpAK(pH)UJe6kCzdMcO&s}lE zViz=Tw$JPhM;O+FzLTp`B)2hC*8CKH-uJ5iBb2!_hrcc9#oYp~NrwF->JFk_9tlJq z6^FQok<4IIb2_W_@@R4AhHWD>iF&L?xB+ZdQlK1wm&|6b0H|jz7KoTXU-7Qh@#@q< zoU35^PCD7F08Or5AM)-zTpRDJXx;*%@kdrr$%h zx#;;7`+lcSyOX?1DMR;9@3(f<(k7}BSB{Ebw|yE~tC5+@!oS{I`Bk)aOkjsJ1bebl zawT zC!(LAIj=uW|A^rm5&|O;ZDD9=j>TaZ6A&1v=A=tif#}CE_L<8494cS~pcUh2svKZL zI^33qyuDUw!gX-Y&6tCdY3I+)$lv6tdykbGdbEz=M^d6H&m~4u2rJs^HVPhoMV?>9 zpQw7`y)~smn=uyryMtzlfD!hd+hV@;nTw6F(7=`HWy*5)mO_>sd=U)aj7SA#XecsEJ zys6*&tBCNdm3?M=zj0H4ea`6o34h4&CKf7=yBSyRmHs&A*nDZl+-$#k|Bm|^Dp*W) zRSY@fxN<dLI0EXB27I;L&Pc}eTS}Zynx=(TH zufJ~WAK&lgHOSSj^mxw;_E(qL9Yf1;3;PJJ<%X|B!AtI~5I~_Y_py-XOv_DYMRs=& z#H&4Rm%EJe9}LEeh4&hHHiBw?Yk3(KB`Yny)mkY&Kxgz6m-ic&$J=o1=kFefPGJM;g3~ppbsLm-mNoe9DdD#JH07Wbf`^OT2qxGy)JGVCfa-{CdW!4I2A zCDUZqyFU{9YG~z6ZT5;7UL};Iu@6G!mDWpgcXxMBK3v4 zewv6@Q1UXa%5036SlMk4px^7z9Z1?Nai#TQQokr1jeedTG>1s-lA_N4TP$}zbh%9m z0sm=Vbq?zaNIx%YA8Cl_d&WIw3WWTs(tb@JeRzZRgiN7Sg8*_zu_~<{`bXx(GUvML zz9|2u9P--5chImRl@WM~KcoX9o7+uF+x;7~ADh2#0^30CoT-S2(9lNrCn6@M8Fjzo zm^oTBU;)6nS3{q4S;(2^?gYV@ioFgqb9nI@syOL@GeoHa-<4Vle!5-c<-sy6F_gXm5J*#6nf&mw9aTsEhZjuD;H zRMk4TbU?T^wHDyQsny}376gYybLGM4D!g~=fZf0JLHSb?qc zUEA{daK5U_a6Dnit>-vlp$bia?%`Lz)H3_KFUPrEV(->T~ZQ6OJ003R+bxS&Yv^4c?VJ8h%`0kum5HLgL4J{r~@4QG$`uIbEsjRIODo!SyoMDKoO_$48W4Tatu3{h{Vpiu!mDru{)8fLzU`1iZ$+o$^E0}mSK} zw`-n8KqX<}jP@?p{X2eSUnZu~{+aaSS^?Gge+L|}8a!tRWxN zC`~G!MSvsPf(iieu-+lNMKfiw$RoY`I9n3v?ef{8wb1Hs6wJTtmurAL` zbi@D+t~pv!FZOlUwL7)7vh7mRXe#H#rD7MZeN@34^`x{07FF)x9l7-s ztY{#jPv_f{#-nGiuyt*tq{fX;!I><+lN>-le~yr9Z6V|z67_)uei=xA>~_N+9TJZn5`OkD@G#q)!V}|NTCKHT`V}UWVvLE-25|S%*nDz>bkPoCp z`f&;1r-)x|dWoFM>D)oFMMe(2uPP27-sLNacZwy+1q)t*2+@Cn>m6q_q6`e}z38k# zo^4+ST!Ku*yec-2$4?$iMrptiVC;`tL~2yyLyDg+)U=~g+f5wjLACP7iv8ynRMKFV z{_CFSpSq9m6ow($2Eix;GdP28sa#kqP){*sS2f zjMuD~m?#cubGN!XUiOkTM^*;IZhHR&B4=XW(KIV2oz4nhG~AT$}M4E|UZEuc`%}b=KBH zam3+eLaz+GXad1{tBqEzl8-lx!HirE!eDpj%;t*812~j~Sd7LFNqvXxDG4uc&%%$l z^G0^B{a=e*U8Wczu%?QVwcA@H0QrpxS`E{GZU_cq!?#gbo}>3#fn*2rNAYD`yX4@& zeTh@-9)aKk>%*hz_Dv##fst8>{p42^k0;q31&{NG)%)!mw7B)0H$cQOl1-#b4Pi9G zMKQrW->)v9ppJ|O4*Uv0bO`}dy@Hz#h@w^PZ0GA$RV5m^4k5Xk=oA6cL6DScy}{8j zf6`eqHFwF8t3Ue!7T#6u`scThONVlLfrPk^{Zh`qaq!Q8!T7|bng1Ba0uHmlK^zar zY<)2Aeve2B0uYKYC|4oxjvt_&!GVq2xDRF1R|(Wrj$xe76j^-)Bme8;aW1}srv*O+ zacVGU@%{TPly6@I->-5)$}EpBX^aOXz^Kn7TvVhp*kUDVv8O8P>`<`S?#h2oj`+>xoPjgbf$+@t+XNq#rX+OVk@`XIu4JUKC**3Ep;-`xva> zATpa%BOzx<5OHuS`;t$}`__i?8gmk&{&RS`C?UrIYBi4+lQNk`>q^|+G5~UvWD=my z$rX!p7RMfhUKL@qF#CUSz9opo^E&22*2VcOLDm|NQ2@j=MQm)W`4{oS{~kk0d_)Wk zQUKhmBC5oMLcaKdX}fja8siSd;J5QS3{ZOJ2pkaXDHKUtJj03%Nx9)U#$wl%N#+2O z->Dh{chD?E14Hb84#ESkFQ@a_V6u)UVLFS|-TQcLFt{L|LSY1p5gii~lkSt{PmvPD z7Jhmb7UiH$Zu#*{&V6AsbbN3}Py(fj@>2b;f=Zu+i2uH!0fhbDXndbUlA9*bKM_0; zW-`9`IgdYZ($h)6gb}C9K&}8ZQ>CMFG*?nlAA$P6@4^fL=ou3afg`VuzefW81<`b& zx?{%ccM=qllEP1l0Gz0iqxHE#K+M2h9@rw=BErUEhldfqLE-yZzNc#YE1vr&jpc|y0 zzkh*anaK_i{*;np6BB&wePq$NuDerC!y^+N8?QJbeC=umUmyf-c=hunc07WibQT0H zmLPs(g0o>@)Zb~fyV@c5H#cM^%0UMw3z}#&BQ_f5DoxT&2>Q==!2<_(5gKSjuY@7# z>cRE;nd5S)KUE{h$$J!Q-6{|`sr$Ar{VY9Kp3XA(N zEnpxRzhOb7d{T!sxHrk1q4>yr;mD)66``v8NZ4G^AXe2RWO2DXJ4E%e^;~_ZVuiXI z`yv_Q$3H?MgSUkQ)uk*qSwqV=EzW}x`p6@nu+k6-V(U1bn;(gilvbV7TF%Um*CTf)o8DXlDq8@FQhXEw9gz z1%@WDok~({n`SJ~l0=dZO1TJrM^+deO$eN0YH-MecWI5UnsrW@ z)=+xKL>t5qk>8kONX=(&Tr3Dz>PA4q(hqV5FNW0`=Wz1PC^Rfg zUJy^5|Km)elL8a%l~O;_8=dbyeeMF6Vtly1bSWWsXXJ}@M$;-j%_}5)fs zkqxOaS?u<64Su6i5a=Xefrw%Fs6R>mYw6}e*z8x)9t>u+nr$vaw>?z+5a`4)v^v^{ zYo|)Soe(6~AX$8-Y+FBcuPjEDB&tW|ZuU1kaBosDl&KGfuV8@k$z5fU_v31G0bq^k zqbc<9xrA`JL*nH>Hx7%^Bnrf%HN*@@M#KXrp#@!zX2`K_&rF+bw}TMW5z0w&Ln0nG z+KD*7Mq8RpWX3ZVO$>ej%KE$Rno|uF!zR^v@jcOt73${ykb#ZWvI>@KNbB8H#A zB1}^_oxoWocclCWVD#1Gi&*vpw;#V?7In#q_^|`e_rpj)K)_+gj`oW(?sGEth64QL6u%Zsb3JIrtDBfFDz%(n9678U2OL^h_LY)DKQ< ziO}DBUq6FCW>){&98NQ2Cwt~j->4hs(dOt&8L&o>Dak1dFYHaH43Enb2Y42{U_L{` z{0|`-kOiQQmrV_DEo&4wBsH!~!2`s;>f&5CIkhk3m>5Tn{)TLs2*I&Nqhsj)2Z*Om6-28mcO9}aPwq)9t z1wGX|k2Ze#5IQy6_Mbj+Fq%L4s@y+ot}088%~sbmYvyx+mUQwJ>S(lL z{rB*8&$4b>pZBp<4y$i{#lAw6DOV(&n~ci~ zVup+PCbw#}IwV2kkm=G7eG=592!M@dB>A`9FBS6&4Npc@u=Lw#C{F0<{Xic|4XgKA(hWH+&SiI-HW4q<)2>CBH>2n69%<9 zmHj^Tg|va!jQHi&l6E)z3T5$C%+yG6Po94hIWUqM?L~yqcFVBYem|;bs+9a2CWBf! zSpUUY`gO#LweD$d{teMa6Xb<{7;Vvulgl=z)9upjg8@#yBv_Wdj(bD+&PX!r?&#>I z0z?M&Giql?|7G^*0{!{)^=}?ckX^|^BZsfg%YW?XhxgP4LCjZb)dgfwz^FA^Vm<2K zv?_j9!UT%XYyxGWiIi&VE$(^Qfl=RW?{Cm{ryT3@hgivom54{(f4TnaeSyE^hya{| zz&o{bP)tBqsSX~?l^bqO6+{CNo)Q))(+()q6B3T{&@dgSL{PPX!RWq?)u;Kd0Y=92 z1%w^=l2K8j;pk)e;=AHQCR<9xfYnvBQBbv*oQ7s90R0i|F7zr~(|J~`dhST|*1fauT zoM97D?)w=ySxP9<{NI>El#d!h6JL@I2N>@ziwp(3Bje)RNhRWQ=aBTh_8E!>NPwV^ zzHyg~8a+L4036zia}?=+k=TEBnG%G`p&|*6T7^2ZrL;jYTt8vW4Y&#nHMa*S&|AE2 z_18+VuLqrR8#bpC)n*^qYae$2ILF1wf1?I45T>LLWdH#kf)H6~bv2#;VJ(LaG63Kt zo=EC5DU>JL=>yPuq#+*GHI&g1@p92V;@ zKg~|BRkutVIsHn+7MO^||2>2ch6(wN8?fmgE!ieU6e26&67 zY15X4WcdOdB#*uEOxkdCTHBg>=340Kv(;~(gvkGI74#t9N)hMEG(>=Gb{?H;*xpy* z=I#7ymn`2{%4xrTn~A6Gd=h4{S}OljUl}SAFE{T({~wbLSnZguSI8GBe2;QVEZ4im zxqIgX6Nor4v>qSqyJya?2=X7Y4X)+FM9H+5l9Q!|=Ql}oF2Q)YFYw=l{_hC%!DzPc z;d)_gu-C7S(1P|w!d7*8(1T%fqoMg4_5=k4@)ZW|?6&*Are6H}$?kFyV@}XQgdioX z)zdfn|4*?rjH+iKo%fr^mH2)XG7ipJzB3ov0q_kzKmCaL`3`s!;t$N1T&4MsE6$5- zAUa!=plGSc-w%sZu{Nc_J;jVv4OGmF|InaZ$;+6{*_RR$f8 zOfKRBn`pYLo=bhV}8Pdz&6>|jwAJ(}(fNe6^9!rz;I!hB$ zW&;Mf`~td2%qF1&gaL~dBv(4pp}AiwL?{@JY=}Lus6QT^mK@YNz5HcbtKz!J^f@`C zk5<4x5q~zu2jbYqCO;U2tqF1(8fmYWOA#PmQ}$rZMV+hC;eBh$@^5#)AMTI*j$-Io zgrlgNAPEZCM36x23b+VE4;y%EcDpS-g%bSvGhid0!_nNg*0|o?xy{2zkk(zF&x{k~ z74PE=Q>;s)Ub$j0)iTQ{FhY7B;hNJR5J)#Eydv@1_o)n^aT_Q87t3gytF0Q-l`Pj7 z1e-zh)GhcU@Q?xNJJyP?)+!O9O?eCO#(8pxM&nM`$~o1F5nwHB)gJvgpcQ|C>@Vy?&!f;&d(wJ z>Oud0c%KtJ7k&2q`klqRENFd|wVPF;C5_o)Fh25o+G4<2i(cg)-EKd~M|w4fzLQTV z3SL2sRoAxOYlY8In_OtTOvMG`Didt@HU`JRX2PlyEuo{r>;DeT0txH52)zjfpRcr}jQ z-Z+|$@1I(ShpS&GnKFy6{@q^`85hMS*g*Qte%SCLpyQ1?pjF*AV{W_>9x@D}EB|W% zArg&~I9sN&tQ_%!(jP)4Ula+TPhzA%4sC_|m}TLzI~T~%Ad(_LfYjKYQmjxEB|+CP&5sD*S=$ZE(PFb3-g3v;ZN!hUTohNnfL% zCh$VhXpJwA*I#%<0U9!H-TQs@PQJ%$yhaKKpdX7Rx-0|fI*n_lI$q!5*1gMVlK5`+s*i4`3(ZVKe#ZXEs}+P_$KMH?RXAXflyyWe;Oe1*829=na0ttM$YpUikM` z7lDi?6h#v0{(Rkf8|(~IrJO|%>Wgu>jUfanJ6%cNK)J)^mXNPM&NDZdg4i>UB%6{i zIdOjnpDzRpG-c?nYQ3o(#6FqoBao0)-Llkvj7%n0MFVPCK?;(L8O+@?i(2+3B3SX9 zL4IHQP$;t&EW+J)_r}s232a>a-63&bGJ6ca-A7}A+%4Z;r!ORBe-fei7D$QvlV3axyEdlc^@YalU`C+1rRvPSrKs!HRjcsU76ulAA;-gA?8M zJx|AU!ZtW+o4#_Jb!njK)qvM}BK-2|ra8>Z?U}vuo;}zdYL0qA+t>ZG^h}n=m6+~@ zE5p^h{J^+kiKbW@tM$=Tmdn5u7YTSC0799mU3!7}{0W`C!i*12BeUfr@zZ;{gf zQhCzp=3Mgb@r}d2&s%to7;0_>p$q{hc!4B^d=|V95m&ODZm5=2vb<($D^&2SWd21B z>GRIuo5p#Q+-(kb-jR4Ej${Pj{}Xb~L!ZO0bfXZENqR*$-VXAjmq=4xz_>JAgE2Z6W7(0MS+&P=!V;Pp;co>%$>!eeH08!Lb z;Uv*~l&8nZ1gKnjYcc#a0)h9XS_BpW6>EjG)%iS1r8F)cY8byC443HHGyECKJ$uzt z&c7wDbs)!ZgV-l;KsiAy0}nR=*&|1@N~d!z35u2*$NR!#}q)SuSqfJZ_np<~-}V*z^EdiC4EqDN1s!mIP?z8Zr>3 z1mLu5xYW{vAuoLX?%y0v17#aBD3&eGMMuj^kW7fk%A8)$r%jMreSiCY+~2$Szl_j! zuI&H$Y(2Jl0|p4KmtxrTw!n?R-kX<6-E6$-^!s3!#eY_)H$aZlrNoiiygb;dRi1(z zB~`&k0eL$Rr>-@A3kfAp;45FyvkSj;R;=&x1bU!0hO*q1HgCnwuF>4JoG#jXbIF~! zQmaA>~-}IB}zFfhpBOH*3(y;CeI{7Aj+B?F|~7W8QX`X(@SN3CY35tJxrpa8!*kS z;32>;p4r`hF>Evkl!=+8zLt$jRK(?mUlD(@Dq<5#Pku+7j z7LQ~cP*3{n{V?$yC`tgTa*vVgXUo+Xqopp96-_Uq|7r`@#05P=deDdVm!?s=2Lf$N zjWv`csf>4r6QPD{fTbYh;uKG!I!wC$k{%)W& zIcyAdCecj}=YBMnPy`wE`loFmR)J>&dg8Z3BgKY&m#uy5Go5D%u(q8Zdw5zpMd|6n ziAgR*QjcE;iB0CS6jSAg@j>kylgl*Mu|AZLe*_L-srPO^Ye|V&Nzv_u_4@if-ect&aE8g{YIQ9us{=Uhqm5G=e^}ui^%DiFuy95Z zeyGG&+xd#sbAmj5C0%lTlJRAAJu<5qHdE-3`XFb;hj>!^VUszt?CA?-{r1Pwle>_? z_SVkG0v4>Hr*)lCvY2JxE+B@o=%ig9p#taQ4c~deNM;sHPNn_iLE&H8Jp6A1JPQzL zORJHiElP7Fp0s`BslT+-$HL$m|G$;$SC>;-QRna3x92)PqSsDo zE`#G}gklta@#G*W|JEZG4m%`1Vf*r~j|Nl{m#N_YU4gVm9aSoZE4@(R$GSn@fX&sG zA1#9Og*lD19e_WzyaFOwrH)4@H@~KpD8Hrk9gZx8!-XI5aw3m4O;GVJCyw23+(ajb zK&O^$D@v)0l;QzY(#yYJ3S}3vgQAgu>2XdX@GfP){-%2q?#Nfbrwn1$xP`gt{d4g#!iSY-QGYj6L^ye7i<)K=Awx`e`5b}3M+p~yIGGBZ%jeS95BxkI zz(^7?xcjf{ddTTA_Le>f$ZecUq%L$5{;u&j`_K!~2PrxA>}SjNZN`7;C4;z_p%?|= zXOHLvuzqIKft*N*vtmfKYix_82N*EzRaB~ejC{AvV55S5lfH2Ff3*fW_1HT0b%!jz z`Xx{P;B-2Wf6|QYgF!K8-YmOm&)B=PcUnGzwqCP@;U-TyP2z#kD?muyZf!DD%i zKKwos(H5?jTm`uK8#LEO3o>x77`>|KdXtIut49o-#Wm??w<|N0!SMI42sm*%{k}yM z5_6~j*WQ^1HI-#?oFyzF0TMR5F$RSg5Jn-|$Rc18SppL5r}{VYD}%jVK~(pxK;@s6B1fe38M?yJ-}=hl1o zp5OVuo8;!WP2(0=OIDwLd7AI_c88HNng?5^yX)bOVq5y)n?$AbPWjVReeET5!CGM} z$gne{VK1eUIuv4D^VT^pTvResUrN|kI#KchOpeLOR6yOgsHc0JATk#*xo zi{yyO;-Tsj*CMEsFU~Sn;g*FOu=f7$IIl^}foGWB<=i=M+%HH0+DllJj;%{tJYBmG z+2ov`9%ywTxEVlo1IO3FLTtCnPMsSj{Wc`iGOX-%X;cvJeL zdYm~3ZRy2T2iU*&TFx^*E9=BW z>KWv`_aCU^Gj4P%4doDUd&mnQ>X9?tk)v@;+#7# zIUVT@xSjoeMsW^lTIU_k>O8uXL?DQjrs*E+_Z{+YLpH2jBI&c+DL=P&kg?!$u7`Z8}Ff(Yt}7ww#-G{$coT2;L2bZ zm3!p2?1@bZ+$-K$X=vF=$hGVGBvr4oNKm(<c|)nwhl&!XESz zYf8);ZXV3_vlh|4jRXB!tLGc1_s?DRRhsyWWjB6ug=zdP{vZGnl@#fXxt7@JWPEi(Jr^g1E7nQ)< zR#06x{!iGvRKtdmK|RVLfo`fgwht8F(`sivT*VJZ9l7hb{mO3^ON!+w8*5J8-_Taj zf7HhBUw1-+D&!JsHfs2&(DjV%Vl+l&jm&6_Rqo7>NZX@@T%}Nus5V@uiF{>E+J5k} z)QLQ@iR)oo4fc}fl6Gq5e(WuRX?e}}sCTTNiLZNE6&xDRK4(xQ9*TBhL|+EAlJoed zJGJY(Kpvzqwn6s313Nvv^3;fl)@%k9zp!<45!ii#fC%8n2>+oSep_J8d?MI~6TVxA z-N$3}s&3_altOf^bRU$#N_6t7&(@z+=(1orQ-5~wwvB}2S#3M`sH^JURU#!*^2p5g zIYzDP!ZV>3;;E|laCY^!iSl=X*GTm|=-4iJi@VWY=5A+^d>SGTIa@fD9x)IMS#4uL zFG_%P=8K8D_^AHwN|S)-yuO;Wg&&-vub96XRG4F53{PEDR?x*3o_i!w-Q1h4qVUuH z2PeaB8Bbb;i7!92CJ8@5AwlY0+m?D0#nqz5d5 zD?j}{vj{1#)h@ANKC}DSl)dm{bbxqiq`V9k_I?^`*(FNZ5G1E;Dyx7H zyvlzrYECg>5p&zpfALn{Ll`1T-j0FmKf}&h7O3d=2m*fvzo>{v7;>zxNl_v@RoK_x z6vQYWA9aMBJH~I{&;D><2#1#NDQbd9u~!!n=Y;R~u@T3kdI5X1db2zRYZ`eYgJgEa*D~ zDkjChS5u6?1@}wC>@skq1zGVGDFc+ba!@#+!@NG(V?_w_g{=bH5{3cp&SCLX|2(x~ zaYD{=MZ;c+MN*jql7Q p36FrtyZ${Se;Jj(hvfgfOP16fgJ=Z*T4R~zkF$fDeJPQa^dGKm-YozC literal 0 HcmV?d00001 diff --git a/images/apple-touch-icon.png b/images/apple-touch-icon.png deleted file mode 100644 index f4a8c65df16dead8947e57cf1a924c702861f705..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmeAS@N?(olHy`uVBq!ia0vp^TR@ltNH9n&i+l&9SkfJR9T^xl_H+M9WCijSl0AZa z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+ueoXe|!I#{Xiaj ziKnkC`$HaKemPdl=f7tGbb;~)P9du}_!mAkZg5o@At$*aUE zeC@g`9ym&_w$4q>soLZx;FVC{P&`#mMCSHFcmJ|tj;PbCO8IhgmqpJ${#iGf3tM)?(cuO*j6{= z;hQ^Q52HiZ*6Hs1=Oa>kt9sqV&(jZ0JQ;9cvSODWTgx`VYSrc6YbQBxF*~j}%XX@T z%lqEqjx^1Q&R-m_cy4*aGi&e64brv#^AA52n3WqZn(LZfSj#s*IAhy?4TW1BVamT` z9FJdE^G{FoqgUC&`@g?hE;_f+e^s7+wL$gUQxym5FST|bJRQ7UtbDg~I*)z*$-pn~ zx6FU4f7Hn?{)V>f6#neH6C-nv6@1L7-;h!3GE@5U^)K7)BbHqF+LCy7#wm8I*QRS$ zZjpEA{A-vKacTQu)?G8X+Ogd`T`jTJr6P!<=adyX>@EoJ;J)k_+pk zBfIm3RxEJ6|JL`a)J%@3Z^x(1RbHJE{KbQRQtZBj63xBU8L>Hi%cLQxsF7`!11NqQ z8-U4$iIMlqf`#>r(t_JtRrG5&0TaGziEBhjN@7W>RdP`(kYX@0Ff`XSG}1M+3^6pd zGB&U>Fx56Nv@$SQ{^BV!iiX_$l+3hB+#0TJjRj?`@T!oAlAy$Lg@U5|w9K4Tg_6pG zRE5lfl4J&kiaC!z@o*G|X=t4CKYhmYX%GXmGPhnbx3IFX_hb=fVFi~4lfx;@%9}$J qPT#n4;>ejJGDp}?H+U@Y(qnifE?Dx($#g2v3Io zx3Si~nUZWWW#7@wYkOT(1y8MY*}L#krYhIc7e~bf<~wY;67^B2wP}UO5o0dvle6wV zoc8@s@jFZN?xp*eohf|gG($=4^tIv`t6lRJxkuSEBwY`9cq3SL?HX${-n0I{Sf+4E zbLD1N1^!`u;vx1nO5n|l9kWU@b{ZDEzdP;lug;o~7YEy)T+9wWag6i-!>d|9uWZd- zdT$Zay*br}8?3&$r>&Y$bF)0_+UFTI=_hmh_60cvac!D-=i2qn(~qiTYZN>`aMJwv z1-+0d>uY#{zEdr6jVMV;EJ?LWE=mPb3`Pcq=DLPPx`vh^hNf1=237`U+6IPJ1_sj@ z{?9|vkei>9nO2Eg!}C~oC7_1zs*s41pu}>8f};Gi%$!t(lFEWqh0KDIWCn(cIgdZ_ za1@4VXq@stea7=?5CgL^w_Y;0u(GiCWD#az1(ybs!zs+ln?n>%-?(z($eANDN7zp{ dcr5VJV|XPlSn|oqbSlsa22WQ%mvv4FO#q>c)sz4L diff --git a/images/favicon-32x32.png b/images/favicon-32x32.png deleted file mode 100644 index 21634ddee2ae89d33249a79f068ba4174cfbd720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 753 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKptm- zM`SSrgPt-7Ggd6MF9Qm)mw5WRvOnYz=9gnz@NSg?0|R5Dr;B5V$MLsU4YNfYC60Z( z|1Q_hCZE}CTKG~9FM%nl)1q!InHo~Z#Le3@H6pqzLz&UO!Pg^M)Ms~Z>x`I*N()>B z9QRC3Isazu(O41vxEo)CeuWwHysw{Enf9!xY1M|}-R=!m}uuaw0 zQTM*-AwN@Xe{**CnOe4^4=qju`) zr=~U=9=2@@o&ND~m+!)UQ-)0amz}Z=m)NaCcWZ}+7ZpSn+} zecBdZYE5?KU(ODHC6{=A_Qe--y7e-zGA;RV$GEzv)#-mrQoS4Z&q98?-LE_QBA1@I zz5l7&h6T-c4IQ{@WAC0^B)sFnyok(Nj*Jd>(Uo2%x)FuK(P8ZkmDz{Q0yU$ol4?Gl z`29eBck#;C3&Yta{%Y74`#SE1(pO;?)^uN=M6r*+_)#r!jVMV;EJ?LWE=mPb3`Pcq z=DLPPx`vh^hNf1=237`U+6IPJ1_sj@{?9|vkei>9nO2Eg!}C~oC7_1zs*s41pu}>8 zf};Gi%$!t(lFEWqh0KDIWCn(cIgdZ_a1@4VXq@stea7=?5CgL^w_Y;0u(GiCWD#az z1(ybs!zs+ln?n>%-?(z($eANDN7zp{cr5VJV|XPlSn|oqbSlsa22WQ%mvv4FO#r-k BAPoQj diff --git a/index.html b/index.html index b00fd223..730728eb 100644 --- a/index.html +++ b/index.html @@ -1,29 +1,11 @@ -ALC Beijing

    Rich Bowen: 无论你在创造什么,最终交付的是信任。

    早在开源被我们称之为开源,Rich Bowen 就已经参与其中。作为 Apache 软件基金会的成员,Rich 目前担任董事会成员、会议副总裁。此外,他还是 AWS 的开源策略师。这些多重角色赋予了他对开源的更广泛和深刻的理解。 -在他于 2023 年 CommunityOverCode Asia 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。 -思否:近年来,中国的公司相继设立开源计划办公室。作为

    开源贡献难吗?

    在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这一主题演讲。 主题演讲视频 我目前就职于字节跳动流式计算团队,负责 SQL 引擎的研发工作;我的社区贡献经历主要包括 Apache Flink 和 Calcite 两个项目,我是从19 年开始参与 Flink 社区,有幸在20年6月受邀成为committer;然后是在22年3月开始参与 Calcite 社区,并且在23年1月受邀成为 PMC 成员。 [图片] -为了准备这个talk,我还专门问了很多同事、和朋友,参与开源贡献有哪些难点,很多人的反应都是工

    从参会到办会的入’坑’指南

    在CommunityOverCode Asia 2023的闪电演讲中, 姜宁花5分钟总结了他与ApacheCon之间的故事以及收获, 也解释了为什么能够坚持三年办会的原因。 -是什么原因支撑着我办Apache大会,这需要从我参加的Apache活动讲起。 -2007年我第一次参加ApacheCon, 见到了很多只在email里面沟通的大牛,体验了会前的hackthon,在两天时间里和大牛思想碰撞,当时给Apache Camel提交了负载均衡的代码。尝试了边喝啤酒边写代码简单而纯粹的快乐! -2009年在北京中关村,融科,Intel 研发中心,参加 Apache 北京路演,第一次听到Hadoop, 天使投资, 见到的

    CommunityOverCode Asia 2023 会议资料汇总

    本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频以及会议演讲材料的下载信息。 -详细的会议日程,大家可以查看: https://apachecon.com/acasia2023/zh/tracks.html 主题演讲Keynote 会议演讲材料: https://pan.baidu.com/s/19zDD7-w0wHT254pxDESBGQ?pwd=fyif  B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1727612 API 微服务 会议演讲材料: htt

    新孵化项目提案指导

    原文链接: https://cwiki.apache.org/confluence/display/INCUBATOR/New+Podling+Proposal?desktop=true&amp;macroName=markdown -译者: 刘天栋 Ted Liu -校对: 姜宁 Willem Jiang -摘要 Abstract 评注: 对项目的简短描述性概述。一段简短的文字,长度最好为一句话。摘要应适合在毕业时用于创建正式项目的董事会决议中重复使用,并作为新孵化项目网站和项目描述 (DOAP: Description of a Project)文件的第一段。 -Commentary: A short d

    【Release】ASF 孵化项目发版常见问题

    这篇文档基于 ASF 官方的发版指南做提取和精简, 关注我们在发版过程中最容易忽视/犯错的部分, 初次参与发版的同学, 尤其是每个仓库/模块的负责人都需要完整, 仔细的通读一遍, 不确定的地方请及时沟通询问 -注: 本文主要以已加入 incubator , 也就是正在孵化中的项目为背景进行描述, 不再对已毕业项目和其他类型做额外解释说明 -0. 前言 相信对于每个初入 ASF 的孵化项目来说,第一次发版都会遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表,思考了下主要原因可能有: -ASF 官方的文档颇为零散,社区的普通开发者和未参与发版的同学经常没有耐心通读所

    【Apache 博客】之 ASF 软件安全报告

    ALC Beijing 引言 2021年末的log4jshell问题让开源软件的安全问题再次成为大家关注的热点问题。 ASF最近的这篇2021年的软件安全报告让我们可以更加深入了解Apache软件基金会是的安全响应流程, 安全响应团队的日常的工作任务, 以及2021年度Apache软件基金会旗下项目关键安全事件。希望这篇报告能够帮助大家对Apache软件基金会基于志愿者的软件安全处理有更加全面的了解。 -Apache软件基金会博客 Apache 软件基金会安全报告:2021年 -概要:本报告探讨了2021年 Apache 软件基金会所有项目的安全状况。我们回顾了关键指标、特定漏洞以及 ASF 项目用户受安全问题影响的

    ALC Beijing Episode #11 DolphinScheduler社区构建之旅

    音频编辑: 周禹任 -文案: 周禹任 -内容梗概 今年4月 Apache DolphinScheduler 正式毕业成为Apache顶级项目,在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。 -在这一期节目中,两位嘉宾和主持人就DolphinScheduler如何克服构建开源社区的挑战,OpenSource Community 对开源项目项目的影响,以及Community 构建之路给出了十分宝贵的经验和建议。对开源社区构建感兴趣的小伙伴们赶紧来听听吧! -时间线 时间区间 精彩话语提炼 03:17~~06:18 Apache

    ALC Beijing Episode #10 谈谈内源2

    音频编辑: 周禹任 -文案: 周禹任 -内容梗概 目前,越来越多的软件开发者把开源的优秀实践带到企业内部,在组织内部建立起了一种类似开源的文化氛围。在上期关于内源的节目中,姜宁老师和谭中意老师让我们了解了内源和开源的关系,以及内源究竟是什么。 -在这一期节目中,姜宁老师,谭中意老师则对内源的话题进一步聚焦,就内源的具体适用性、责任方以及动力问题进行了详细的讨论。让我们一起听一下他们在这一期中为我们带来的精彩呈现吧。 -时间线 时间区间 精彩话语提炼 03:10~~08:50 什么样的项目适合以内源的方式在公司内部开源 09:02~~13:29 内源项目应该由谁来兜底? 13:30~~17:56 内源

    如何成为一名成功的学生导师

    引言 在去年结束的编程之夏的活动中,本文的作者柯振旭带了两名同学不但顺利完成了暑期实习的任务获得优秀学生最具有潜力奖,还成功将这两名同学发展成为了Apache Skywalking的Committer,在活动结束之后同学们也都留在了社区并结合自己的课题方向不断做出自己的贡献。 -本文适用的读者范围是那些想为自己的社区吸引更多长期学生贡献者的导师,不适合单纯为了奖金和只为了吸引一次性劳力的社区项目。 -本文将按照暑期活动的三个主要阶段,介绍每个阶段中为了达到项目的最终成功,导师可以作出的努力。 -出题阶段 一个导师在出项目题目的时候,很可能就已经确定了这个项目的生命周期,以及参与这个项目的学生的贡献周期。 以下是我从 2

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    04 +Oct 2023

    Rich Bowen: 无论你在创造什么,最终交付的是信任。

    2023 年 CommunityOverCode Asia Rich 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。
    04 +Oct 2023

    开源贡献难吗?

    在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这个题目。
    25 +Sep 2023
    23 +Sep 2023
    18 +Sep 2023
    \ No newline at end of file diff --git a/index.xml b/index.xml index 8e1e896e..20f56512 100644 --- a/index.xml +++ b/index.xml @@ -1,517 +1,59 @@ -ALC Beijinghttps://alc-beijing.github.io/alc-site/Recent content on ALC BeijingHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000Rich Bowen: 无论你在创造什么,最终交付的是信任。https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/早在开源被我们称之为开源,Rich Bowen 就已经参与其中。作为 Apache 软件基金会的成员,Rich 目前担任董事会成员、会议副总裁。此外,他还是 AWS 的开源策略师。这些多重角色赋予了他对开源的更广泛和深刻的理解。 -在他于 2023 年 CommunityOverCode Asia 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。 -思否:近年来,中国的公司相继设立开源计划办公室。作为一家知名的开源公司,AWS 是如何管理、运营和推广开源的呢? -Rich Bowen: 总的来说,AWS 和亚马逊从一开始就一直在基于开源进行构建,我们所做的一切都依赖于开源。在亚马逊,我们遵循领导力准则,这些准则影响着我们的思考方式。 -第一个准则是顾客至尚。我们始终关注客户并优先满足他们的需求,所以我们构建了所有这些基础设施,而这些产品都建立在开源技术之上。最重要的是,开源项目必须具备可持续性。我们在开源上所做的一切,首先需要确保这些开源项目保持健康的运行。我们还有一项工作是项目选择,如果有多个项目可供选择,我们会尽量选择一个拥有健康生态系统和强大社区的项目。这意味着很多事情,包括众多公司的参与以及透明的项目沟通。接下来,我们会密切关注这些社区,确保它们的生态是健康的,同时我们也会积极参与社区维护,这是最重要也是我们关注的焦点。 -我们推广开源的方式不是独立进行的,而是是与社区一起。例如,我们非常依赖 Apache 项目,如 Kafka 和 Airflow 等。我们通过参与他们的会议,比如 Kafka Summit 和 Airflow Summit 去进行推广。通过和社区一起推广,我们可以确保这是社区的看法,而不是亚马逊的看法。此外,我们还会参与社区活动,如 KubeCon 或开源峰会。 -思否:这更像是让公司退居幕后,但对于一些在项目中投入了大量资源的开源公司来说,做出清晰的决策可能会很困难。他们可能会因为投资而模糊界限,或者将项目视为自己的品牌。 -Rich Bowen:的确如此。有时你会对一个开源项目的推广产生疑惑,他们是在谈论项目还是在谈论公司?这很难区分出来。 -像任何大公司一样,不同部门之间会存在差异。但作为一名开源策略师,我的工作是参与部门其中,并为他们提供建议,告诉他们我们认为正确的参与方式,即把社区放在第一位,而不是我们自己。 -思否:你能分享一些优秀的 AWS 开源项目吗? -Rich Bowen:从我的角度来看,Amazon 参与的开源社区主要分为两种类型。一种是主要由亚马逊主导的,另一种是主要由社区主导的。 -我们参与的一类开源项目是围绕我们某项服务的,因此除非他们是客户,否则其他人没有真正的动力参与其中。还有一类项目是很多公司参与进来的,比如 Apache Kafka。我主要关注的是第二类项目,也就是真正的社区项目。在亚马逊,我参与的大多数项目实际上都是 Apache 项目。 -我最为兴奋的项目之一是 Apache Airflow,因为这是一个亚马逊积极参与的项目。虽然这个项目并不属于亚马逊,但我们有很多全职工程师也参与其中。作为一个社区项目,也有许多其他公司参与其中。我个人认为,这是我们最佳参与项目方式的模型之一。 -思否:在你看来,该如何建立一个开源生态系统呢? -Rich Bowen:保持沟通透明是最重要的事情。所有关于 Apache Airflow 的讨论都通过邮件进行。我们并不会进行内部会议,然后通知项目:“这是我们做的决定”。相反,我们向社区递交提案,接着在社区中进行讨论和决策。所以,一切的前提是保持公开透明。开源贡献难吗?https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这一主题演讲。 主题演讲视频 我目前就职于字节跳动流式计算团队,负责 SQL 引擎的研发工作;我的社区贡献经历主要包括 Apache Flink 和 Calcite 两个项目,我是从19 年开始参与 Flink 社区,有幸在20年6月受邀成为committer;然后是在22年3月开始参与 Calcite 社区,并且在23年1月受邀成为 PMC 成员。 [图片] -为了准备这个talk,我还专门问了很多同事、和朋友,参与开源贡献有哪些难点,很多人的反应都是工作那么忙,哪有时间参与开源;参与社区门槛太高,不知道怎么开始。我总结下来主要是这三个问题,一般没有开始参与的同学会感觉没有时间参与、开始尝试参与贡献的又会觉得社区的门槛很高、贡献了一段时间之后发现社区对自己响应太慢,坚持不下来;而我自己在参与开源的过程中对这几个难点也是深有体会,接下来我就结合自己的开源经历给大家分享一下我是怎么克服这些困难,最终参与到社区里的。 -“没有时间”是很多人面临的第一个问题,我自己也是一样的。 -我最开始参与开源是在19年的下半年,当时正是我们在字节内部在推广使用 Flink SQL 的时候,本来内部业务就很忙,白天根本就没有时间,我就利用午休、晚上下班后还有周末的时间了解一些社区的进展,做一些力所能及的事情。我印象很深刻的是,那时候 Flink 社区里的邮件特别多(当然现在也很多),每天有 50-100 封邮件,根本就看不完,我那时候还在手机装上了 google 邮箱客户端,每天在坐地铁的时候也会看一下邮件,了解一下社区的最新进展。 -参与了一段时间后我意外的发现,我经常会在晚上十一二点的时候还会收到 review 评论,原来社区里很多人也都是在业余时间参与。有好几次,晚上临睡觉之前收到了review回复之后,兴奋的睡不着,就爬进来继续改代码,直到把代码push上去才睡得着。当最终看到自己的工作被社区认可,被合并到主分支的时候,是特别开心的,非常有成就感。 -其实参与进去之后,时间问题其实就不是问题了,因为我在社区里的工作,很多时候都可以反哺到我的工作。 -比如好几次,都是因为我在社区里帮别人解答了一些问题之后,在内部用户也遇到了相同的问题,我就可以很快的帮用户解决掉了;而且很多时候我们在内部解决一些问题的时候,由于对系统还不够了解,所以也拿不准解决方案合不合理,这时候我们也会把问题抛到社区里,可以有更资深的同学帮我们把关;甚至于有几次,我们自己碰到了自己完全解决不了的问题,抛到社区里之后也是很快就有人帮我们解决了。就感觉自己好像又多了一个强大的虚拟团队。内部工作变的更轻松之后,就可以跟参与社区形成互补,也可以把一些工作节省出来的时间投入到参与社区工作中。 -另外,根据我们团队多年的经验来讲,能够做大upstream first才是成本最低的方式。什么叫upstream first呢,就是我们在对开源软件进行修改的时候,优先把这些改动贡献到上游项目中,而不是只在自己fork的版本中进行修改。这样我们内部开发和开源社区的开发就可以形成合力,不需要在每个版本进行适配,从长期来看才是成本最低的方式。 所以不管是对个人还是对团队,能够参与到开源社区,都是非常有价值的。 -其实参与社区久了之后,就会感觉参与社区反而是一件很轻松愉快的事,就跟我们大学的时候刷论坛一样,没事就去刷一下看看有没有什么有意思的事情。我跟很多有长期参与开源社区经历的朋友聊,很多人都有类似的感受。尤其是在工作遇到了困难搞不定了,或者工作累了想休息一下的时候,就到社区里去放松放松。如果工作的过程是一个放电的过程,那么参与开源的过程反而就是一个充电的过程。对,不光二舅可以治疗精神内耗,开源也可以治疗精神内耗。 -门槛高也是很多同学在参与开源的时候遇到的经常遇到的问题。 -一方面社区的工作模式跟我们平时的工作模式很不一样,需要一个适应的过程,比如需要怎么用邮件列表交流、还需要用英语、很多时候刚进入到社区看到很多问题也看不懂,也不知道那些issue适合新手做;另一方面,有很多项目,有比较深的背景知识,入门曲线比较陡峭,代码量也非常高,动不动就上百万行。 -刚刚也提到了,我一开始参与 Flink 社区的时候,也是先订阅了社区的邮件列表。那时候每天盯着上百封邮件,大部分也看不懂;也看到很多人在创建新的issue,但是感觉也不会做。感觉社区离自己很遥远。而且 google 邮箱底下有一个空间提示,它有 15G 的免费空间,我天天看着这个数字,我就经常在想,每天这么多邮件,我有没有可能在我的邮箱空间用满之前拿到社区的committer呢? -后来有一个周日,我早上起来之后习惯性的打开电脑,查看一下社区的邮件。我就看到有个人外国的小哥提了一个关于 streaming join 原理的问题,而且是提了好几天了还没有人回复,他又重新提了一下。这个问题相对来讲还是比较底层,对当时的我来说还是很具有挑战性的,而且正好我对这个问题也很感兴趣。然后我就想我是不是可以去看看这部分代码,帮解答一下这个问题。然后我就马上开始研究这部分代码,花了两个多小时的时间,终于赶在午饭之前搞懂了这个问题,然后赶紧去社区里回答了一下。(当时在看的过程中内心里还一直在想,社区的大佬们你们千万不要在这个时候回复了,要不然我的功夫就白费了。)后面我的回答也得到了 Flink PMC 云邪老师的认可,这让我开心了好几天,所以那个周末过的特别的愉快。从参会到办会的入’坑’指南https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/Mon, 25 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/在CommunityOverCode Asia 2023的闪电演讲中, 姜宁花5分钟总结了他与ApacheCon之间的故事以及收获, 也解释了为什么能够坚持三年办会的原因。 -是什么原因支撑着我办Apache大会,这需要从我参加的Apache活动讲起。 -2007年我第一次参加ApacheCon, 见到了很多只在email里面沟通的大牛,体验了会前的hackthon,在两天时间里和大牛思想碰撞,当时给Apache Camel提交了负载均衡的代码。尝试了边喝啤酒边写代码简单而纯粹的快乐! -2009年在北京中关村,融科,Intel 研发中心,参加 Apache 北京路演,第一次听到Hadoop, 天使投资, 见到的著名的陈绪同学,近距离在家门口感受到了开源的氛围。 另外2006年 ApacheCon Asia 第一次大会是在斯里兰卡召开的。 -2010年在上海,复旦大学,张江校区,两天的 Apache 路演大会, 当时公司支持开发同学外出演讲对外发声,于是我报名参加大会做了有关Camel的演讲,同时顺道参观的上海世博,还赢了一台iPad。 照片是 Freeman, Niclas Hedhman 和当时去健身房减了十斤的我, 满满的胶原蛋白吧! -2015年 北京,中关村,科学院大学,开源社主办的 Apache China 路演会议 这是其中一个圆桌论坛,微软C#/TypeScript 之父 Anders Hejlsberg , Niclas Hedhman 会后大家一起合影, 这是韩卿,我,梁辰晔(之后成为华为的同事), 赵生宇(19年再次见面,开启了更多的合作), 通过大会结识了很多小伙伴,在后续的开源道路上相互协作。 -2017年, 这是时隔10年之后, 终于能够再次参加Apache北美大会,这次的会议的目的地是Miami,当时参会的主要目的是帮助ServiceComb寻找孵化导师。 可以看到 Rich, Justin, 阿里的同学,张乎兴,王晓瑞, 冯嘉。 当然也少不了啤酒, 当时正好和Mark Tomas 聊天。 -借 18年,19年的 HuaweiConnect 大会,邀请到了 ASF的 Craig, Roman, Justin访华,组织和国内的 Apache 开发者见面。 取得成果是 2018年 推动了 ShardingSphere 进入ASF孵化,2019年 推动 APISIX 进入ASF孵化。 当时和Craig就有聊过在中国办大会的想法,但是因为没有办过大会,心里还是没有底,还没有真正付诸行动。CommunityOverCode Asia 2023 会议资料汇总https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/Sat, 23 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频以及会议演讲材料的下载信息。 -详细的会议日程,大家可以查看: https://apachecon.com/acasia2023/zh/tracks.html 主题演讲Keynote 会议演讲材料: https://pan.baidu.com/s/19zDD7-w0wHT254pxDESBGQ?pwd=fyif  B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1727612 API 微服务 会议演讲材料: https://pan.baidu.com/s/1cmCNIMpv3hVN_mFanuZJ5w?pwd=f41x B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1730769 DataOps 会议演讲材料:https://pan.baidu.com/s/1lMIaaZxMWXiAlSz6JBoGqA?pwd=rjh9 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729751 孵化器 会议演讲材料:https://pan.baidu.com/s/1APRp2is7EVoOR2fuJygeYw?pwd=9c27 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1733871 OLAP 会议演讲材料:https://pan.baidu.com/s/1JI-fOnQ5qzjBFTFps3GNUw?pwd=dtv4 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1728036 RPC 会议演讲材料:https://pan.baidu.com/s/1ecTLQgD9LCdwHUvbFJBUuw?pwd=kgxs B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729739 Web Server/Tomcat 会议演讲材料:https://pan.baidu.com/s/1Is8lK02wQb8sjQEvo9irmg?pwd=c3hs B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1731492 云原生 会议演讲材料:https://pan.baidu.com/s/1qq98HahndKRo4WKHR3KKbQ?pwd=1f37 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729754 人工智能/机器学习 会议演讲材料:https://pan.baidu.com/s/1udTYbJ5OXuKjBo_pRsmqAw?pwd=h954 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1727740 开源社区 会议演讲材料:https://pan.baidu.com/s/1GAglK6ARVBMxkxxCtO7kJw?pwd=gupa B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1728179 性能工程 会议演讲材料:https://pan.baidu.com/s/1q44Q476GM4svy548C428mQ?pwd=mpj5 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729743 数据存储与计算 会议演讲材料:https://pan.baidu.com/s/13uC72OkjKfn752_OxJMmuA?pwd=hnf2 B站视频:https://space.新孵化项目提案指导https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/Mon, 18 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/原文链接: https://cwiki.apache.org/confluence/display/INCUBATOR/New+Podling+Proposal?desktop=true&amp;macroName=markdown -译者: 刘天栋 Ted Liu -校对: 姜宁 Willem Jiang -摘要 Abstract 评注: 对项目的简短描述性概述。一段简短的文字,长度最好为一句话。摘要应适合在毕业时用于创建正式项目的董事会决议中重复使用,并作为新孵化项目网站和项目描述 (DOAP: Description of a Project)文件的第一段。 -Commentary: A short descriptive summary of the project. A short paragraph, ideally one sentence in length. The abstract should be suitable for reuse in the board resolution used to create the official project upon graduation, as the first paragraph on the podling web site and in the DOAP document.【Release】ASF 孵化项目发版常见问题https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/这篇文档基于 ASF 官方的发版指南做提取和精简, 关注我们在发版过程中最容易忽视/犯错的部分, 初次参与发版的同学, 尤其是每个仓库/模块的负责人都需要完整, 仔细的通读一遍, 不确定的地方请及时沟通询问 -注: 本文主要以已加入 incubator , 也就是正在孵化中的项目为背景进行描述, 不再对已毕业项目和其他类型做额外解释说明 -0. 前言 相信对于每个初入 ASF 的孵化项目来说,第一次发版都会遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表,思考了下主要原因可能有: -ASF 官方的文档颇为零散,社区的普通开发者和未参与发版的同学经常没有耐心通读所有文档以及注意到关键事项 (或理解有偏差) ASF 官方文档对于有些描述仍较为模糊, 或者它直接建议 PMC/Mentor/Mail 来讨论决策,但这部分结论通常没有更新记录到文档中 ASF 官方没有给大家推荐类似 skywalking-eye (header/dependency) 的自动化检查工具,这些工具对初次发版的同学可能会有许多帮助 ASF 文档中对有些规范/规则并未严格要求, 但发版投票时不同的 Reviewer 可能有不同的习惯/偏好, 从而会提出一些改进&rdquo;建议&rdquo; &ldquo;中/英&quot;语言/语义上的理解偏差,从而导致了某些内容的误解 借着 Apache HugeGraph 首次发版的机会,我也顺便总结了一些 PR / 邮件中遇到的事项和经验,由于是个人理解,可能存在不严谨的地方,欢迎大家一起来 review 和补充完善,避免相似的问题反复出现在 incubator 项目的发版过程中:) -名词 一些文中出现的常见名词缩写: -ASF: Apache Software Foundation ASL2.0: Apache Software License 2.0 ASF &amp; Apache 新同学可能会比较困惑为何常看到 ASF 的邮件/文档中不直接使用 Apache 项目 这样的描述, 而建议/习惯使用 ASF 项目.【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ALC Beijing 引言 2021年末的log4jshell问题让开源软件的安全问题再次成为大家关注的热点问题。 ASF最近的这篇2021年的软件安全报告让我们可以更加深入了解Apache软件基金会是的安全响应流程, 安全响应团队的日常的工作任务, 以及2021年度Apache软件基金会旗下项目关键安全事件。希望这篇报告能够帮助大家对Apache软件基金会基于志愿者的软件安全处理有更加全面的了解。 -Apache软件基金会博客 Apache 软件基金会安全报告:2021年 -概要:本报告探讨了2021年 Apache 软件基金会所有项目的安全状况。我们回顾了关键指标、特定漏洞以及 ASF 项目用户受安全问题影响的最常见方式。 -发布时间:2022 年 1 月 -作者:Mark Cox,Apache软件基金会安全副总裁 -背景 Apache 软件基金会 (ASF) 的安全委员会负责监督和协调所有 350 多个 Apache 项目中漏洞的处理。我们成立于 2002 年,由所有志愿者组成,我们对如何处理问题有一个标准流程,这个流程包括我们的项目必须如何披露安全问题。 -在 Apache 项目中发现安全问题的任何人都可以将它们报告给 security@apache.org,在那里它们会被记录下来并传递给相关的专门安全团队或项目管理委员会 (PMC) 来处理。安全委员会监控所有项目报告的所有问题,并在整个漏洞生命周期中跟踪问题。 -安全委员会负责确保问题得到妥善处理,并积极提醒项目突出的问题和责任。作为董事会委员会,我们有能力采取行动,包括阻止其未来的发布,或者在最坏的情况下,如果项目对处理其安全问题没有响应,则将项目退休归档。这与 Apache 许可证 v2.0一起,是 ASF 围绕官方发布的一般治理功能的关键部分,使 ASF 能够保护个人开发人员,并让用户有信心部署和依赖 ASF 软件。 -对所有安全报告的监督以及我们开发的工具使我们能够轻松创建有关问题的指标。我们的上一份报告涵盖了2020年的指标。 -2021年统计数据 2021 年,我们的安全电子邮件地址总共收到了约 18,500 封电子邮件。在垃圾邮件过滤和讨论主题分组之后,有 1272 个(2020年:946个,2019年:620个)非垃圾邮件主题。不幸的是,安全报告有时确实看起来像垃圾邮件,尤其是当它们包含大量附件或大型视频时,因此安全团队会仔细审查所有邮件,以确保真实安全报告不会错过太长时间。 -图1:2021 年 ASF 安全电子邮件主题的细分 -图1给出了这 1272 个电子邮件主题的细分。359 个电子邮件主题 (28%) 与 Apache 许可证使用困惑相关的问题。由于许多项目都使用 Apache 许可证,而不仅仅是那些在 ASF 保护伞下的项目,当人们看到 Apache 许可证并且他们不明白它是什么时,他们可能会感到困惑。这在手机上最常见,例如在设置菜单中显示许可证的手机上,通常是由于包含 Google 根据 Apache 许可证发布的软件。我们不再回复这些电子邮件。这比 2020 年收到的 257 个有所增加。ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/音频编辑: 周禹任 -文案: 周禹任 -内容梗概 今年4月 Apache DolphinScheduler 正式毕业成为Apache顶级项目,在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。 -在这一期节目中,两位嘉宾和主持人就DolphinScheduler如何克服构建开源社区的挑战,OpenSource Community 对开源项目项目的影响,以及Community 构建之路给出了十分宝贵的经验和建议。对开源社区构建感兴趣的小伙伴们赶紧来听听吧! -时间线 时间区间 精彩话语提炼 03:17~~06:18 Apache DolphinScheduler 是出于什么原因加入到Apache 软件基金会的? 06:42~~13:56 DolphinScheduler 在进入孵化器后遇到了哪些困难?又是如何克服的? 14:00~~19:18 社区对开源项目有什么影响,对开源项目的价值 19:22~~34:18 怎么吸引并留住社区的贡献者们 32:30~~34:20 社区构建的意义:可持续发展的项目的基石 请收听 ALC Beijing Podcast Episode #11:DophinScheduler社区构建之旅 -本期嘉宾 郭炜:Apache Member,Apache DolphinScheduler PMC,前易观CTO -代立冬:Apache DolphinScheduler PMC Chair,Apache 孵化器导师,前易观大数据平台负责人 -潘娟:SphereEx 联合创始人兼CTO, Apache member, Apache ShardingSphere PMC, 中国木兰开源社区导师。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/音频编辑: 周禹任 -文案: 周禹任 -内容梗概 目前,越来越多的软件开发者把开源的优秀实践带到企业内部,在组织内部建立起了一种类似开源的文化氛围。在上期关于内源的节目中,姜宁老师和谭中意老师让我们了解了内源和开源的关系,以及内源究竟是什么。 -在这一期节目中,姜宁老师,谭中意老师则对内源的话题进一步聚焦,就内源的具体适用性、责任方以及动力问题进行了详细的讨论。让我们一起听一下他们在这一期中为我们带来的精彩呈现吧。 -时间线 时间区间 精彩话语提炼 03:10~~08:50 什么样的项目适合以内源的方式在公司内部开源 09:02~~13:29 内源项目应该由谁来兜底? 13:30~~17:56 内源项目的商业交付模式 18:00~~24:03 内源参与的源动力,姜宁:知识共享 24:52~~28:03 内源参与的源动力,谭中意:解决需求&amp;技术影响力 32:20~~37:23 Apache way在内源中的应用 请收听 ALC Beijing Podcast Episode #10:又谈内源 InnerSource -本期嘉宾 谭中意: 开源社区资深爱好者, 开放原子基金会TOC副主席,Mozilla/Gnome/Apache committer。 国际内源基金会成员和布道者, 曾在多个开源大会上分享内部开源相关议题。 -潘娟:京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。 -姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。如何成为一名成功的学生导师https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/引言 在去年结束的编程之夏的活动中,本文的作者柯振旭带了两名同学不但顺利完成了暑期实习的任务获得优秀学生最具有潜力奖,还成功将这两名同学发展成为了Apache Skywalking的Committer,在活动结束之后同学们也都留在了社区并结合自己的课题方向不断做出自己的贡献。 -本文适用的读者范围是那些想为自己的社区吸引更多长期学生贡献者的导师,不适合单纯为了奖金和只为了吸引一次性劳力的社区项目。 -本文将按照暑期活动的三个主要阶段,介绍每个阶段中为了达到项目的最终成功,导师可以作出的努力。 -出题阶段 一个导师在出项目题目的时候,很可能就已经确定了这个项目的生命周期,以及参与这个项目的学生的贡献周期。 以下是我从 2020 届暑期活动中,总结出来的我自己出题阶段遵循的几个参考指南。 -不要出纯体力活的题目。 -虽然活动组委会没有限制,但我个人强烈建议导师不要出一些“纯体力活”的题目,类似翻译文档,整理文档,整理 license,添加测试用例等。 这类题目几乎不存在与之对应的兴趣,缺乏兴趣的学生在完成暑期活动之后很难有持续为社区继续贡献的动力,甚至在项目中期就已经弃坑了。 社区参与暑期活动的目的是为了吸引更多学生开发者,而不是为了把枯燥无味的体力活承包给学生。 -不要出难度过高的题目。 -我们的目的是为了吸引更多学生关注和持续贡献开源项目,而不是在举办竞赛。 初次接触开源项目的学生,除了需要一些时间熟悉该项目本身的技术,还需要很多时间去熟悉开源社区的协作模式、工作流、搭建开发环境、测试方法等等。 同时学生也有一些学校的任务需要完成,难度过高的题目可能无法在活动时间内顺利完成。 -导师要自己先评估题目。 -目前(2021 年)组委会对于导师所提交的题目没有审核的阶段,但在我自己出题的时候,列出多个候选的题目后,在做最终投递的选择时,有几个自我评估的标准: -假如这个题目让我自己来做,我自己会不会感到有趣?指导学生完成项目有时候会很无聊,当你所指导的项目本身也很无聊的时候,项目长达四个月的指导过程可能会让学生和老师都无法坚持下来,导致项目草草结束甚至中途终止。 这个题目是否具有延续性?当暑期活动结束后,具有延续性的项目,能够扩展出相似的或进一步的工作,学生能够从自己已经熟悉的原项目的基础上,继续为社区做贡献,这时候即使没有活动奖金的激励,学生也能够比较轻松地完成后续的贡献。比如活动的题目是适配某一个配置中心,那么活动结束后可以引导学生继续适配另一些配置中心,或者增加/优化一些配置项。 指导阶段 要适当增大包容度。 -项目开始初期,学生搭建开发环境,初次接触开源社区的工作方式,可能会有很多基本的问题,这些问题对于导师来说是小菜一碟,但是学生可能需要花费好几个小时甚至好几天去解决。对刚开始接触开源项目的学生来讲会产生非常大的挫败感。 对于初次接触开源项目的学生,适当增大包容度,及时给予一些帮助,以帮助学生快速进入到项目和社区。但也要注意应该只提供解决问题的方向,不应该直接帮助学生编写代码或调试代码。 比如说给学生提供完整的背景知识,递进式的解题思路,逐步引导学生自己一步一步找到解决方案,让学生在自己探索解决方案的过程中,也能有所成长。 -要定期沟通项目进度。 -导师们有自己的日常工作,学生们也有学校的任务和活动,缺乏沟通会导致项目进度停滞不前。 导师和学生之间应该建立定时沟通的机制,双方每周(或每两周)约定腾出一定的时间,建立音频会议或视频会议,同步项目的进度,学生提出遇到的问题,导师帮助解答。 对于社区有要求的(如 Apache),项目的讨论和进度还必须公开同步到邮件列表等公开渠道。 -要当导师也要当朋友。 -从学生角度,导师-学生关系容易产生距离感,特别是当导师是社区里面比较资深的&quot;大佬&quot;时。在学生遇到问题时,会顾虑这个问题对于导师来讲是否太简单了而不好意思提出,耽误了项目的进度。 我平时偶尔也会和学生聊一些他们学校和我自己生活中的趣事,在学生消除了距离感时,他们也会咨询一些活动项目之外的问题,比如职业规划,行业看法,邀请我参与他们的学术报告调研等等。 与学生建立长期稳定的联系之后,学生更愿意留在熟悉的社区持续贡献。 -不要吝惜鼓励和赞美,要指出可以改进的地方。 -当学生获得阶段性成果时,适当给予语言上的鼓励和赞赏,&ldquo;后浪&quot;们的能力有时确实超出我们的预期,应当鼓励学生除了完成项目范围内的工作,还可以自己提出对于社区项目的思考和意见,为社区注入新鲜的活力。 对于学生做得不好的地方,也要敢于提出可以改进的地方。&ldquo;放养式&quot;的指导会让学生没有任何成就感,也得不到成长。 -完成阶段 关注学生成长,提供继续贡献的方向。 -当学生顺利完成项目后,为了学生能够继续持续贡献,导师最好应当关注学生的专业和兴趣方向(这来自于指导阶段与学生建立的朋友关系,基于此来了解学生的专业方向和兴趣)。 作为比较熟悉项目和社区的先行者,导师可以继续帮助学生发现和挖掘项目中,与其兴趣匹配的任务,让学生能够继续持续贡献的同时,也对学生身的成长有所帮助,学生自然愿意继续留在社区。 -适当后退,给学生独立负责的机会。Apache孵化器指南表格版https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/Sat, 20 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/作者:狄晓晓 -项目孵化成为ASF顶级项目的步骤 详见Apache Incubator cookbook -步骤 内容 详情 1 与孵化器沟通 孵化器PMC管理孵化器,帮助项目孵化。 2 寻找领路人(champion)和孵化导师,讨论并准备孵化提案 项目要进入孵化器,需要一个领路人(Apache officer或member)和至少2-3个导师(IPMC member)(孵化过程涉及的各角色及其职责请参见Roles and Responsibilities)。 3 创建孵化提案 领路人会帮助项目准备孵化提案,该提案将用于下一步与孵化器PMC的讨论。提案可以根据模板编写,需要包含几个标准部分。 4 与孵化器PMC讨论孵化提案 提案准备好后,项目代表要将其发送至general@incubator.a.o邮件列表,孵化器PMC会对该方案进行讨论。 5 如有需要,完善提案中初始提交者和导师列表 - 6 如有需要,基于孵化器PMC的反馈完善提案 - 7 孵化器PMC对提案进行投票 讨论阶段结束后,领路人或项目代表会在general@incubator.a.o邮件列表中创建【投票】帖,投票按照ASF的投票规则进行。 8 配置该项目的基础设施(JIRA等) 如果孵化器PMC同意接受该项目,就可建立该项目的基础设施了,该过程通常由领路人或导师进行推动,如果社区成员熟悉该操作,也可由社区成员来推动。 9 导入初始代码 企业捐赠的项目,在导入初始代码前,需要提交软件授权协议(SGA)或企业贡献者许可协议(CCLA);个人捐赠的项目,在导入初始代码前,需要主要贡献者提交个人贡献者许可协议(ICLA)或SGA。导入过程中,需要检查和报告代码中受美国出口管制法管制的密码技术。除此以外,代码以及二进制发行版还需要按照Apache License合规要求,进行清理。 10 围绕该项目代码构建社区 包括投票产生新的提交者和PPMC成员(Podling Project Management Committee)。 11 发布项目,记录并完善发布过程 在孵化期间,预计将发布多个版本,这些版本将逐渐符合ASF发布政策。 完全合规的发布是项目毕业的条件之一。 孵化中的项目进行发布还必须在任何发布文件名中包含“incubating”一词,并根据孵化器发布指南包含免责声明或免责声明-WIP,以防止对项目状态产生任何混淆。由于孵化中的项目还不是“真正的”ASF项目,所以设定正确的期望值是很重要的。 孵化中的项目版本发布需要两次投票,一次是在开发者邮件列表上进行的投票,如果PPMC成员中至少有3个赞成票(+1),并且赞成票比反对票(-1)多就算通过了。第二次是在孵化器常规邮件列表上进行的投票,这次投票由孵化器PMC进行投票。 Apache发布仅包含源代码,但是项目通常也会分发一些编译过的软件包。软件源代码发布是发布重点,所有分发的编译过的软件包均基于这些发布的“正式”的源代码。 12 准备毕业,与导师一起评估项目的就绪情况 准备毕业的项目需要根据ASF提供的成熟度模型进行自我评估,这可以帮助发现在孵化过程中被忽略的事务。 13 将商标转让给ASF 将代码捐赠给ASF的企业或个人,如果持有该项目需要的商标,则需在项目毕业前,将商标转让给ASF。 14 与孵化器PMC讨论毕业 项目毕业需要PPMC先进行投票以达成共识,如果社区和导师根据自我评估认为项目已经做好准备,可以毕业,会在孵化器常规邮件列表上创建一个【讨论】帖,提议毕业并请求孵化器PMC审查该项目。 15 孵化器PMC进行毕业投票 毕业提议的【讨论】进程结束后,导师或PPMC成员会在孵化器常规邮件列表上创建一个【投票】贴,孵化器PMC对该项目进行投票,投票依据ASF投票规则进行。 16 ASF董事会决议 孵化器投票通过后,将会创建董事会决议的帖子并发送给ASF董事会,供董事会投票。董事会每月第三个周三会召开会议,会上会对此类决议进行投票,投票结果即刻生效。 17 毕业后的任务 毕业后,项目需要在孵化器状态页面上更新状态,并对其资源和流程进行一些更改。项目毕业后,将由新组建的PMC定期向董事会进行报告,最初三个月每月一次,之后是每季度一次。毕业后的项目如果发展停滞,将进入Attic,即归档退休。关于项目毕业后资源转移的步骤及Attic的详细内容,之后会一一奉上,敬请期待。Apache ServiceComb带您对话Apache大咖https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/Sat, 13 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/Apache ServiceComb带您对话Apache大咖 前言: 这是一篇两年半前的活动记录,应该最早的一批Apache项目Committer参加的Meetup,在这次会上跟大家分享了很多Apache项目孵化的相关的经验,以及开源软件商业的故事。特别值得说明的是在最近结束的ASF成员大会中,文中的有四位专家当选成为ASF董事会成员,这些经验今天看来对大家也是很有启发的。 -PMC沉睡了怎么办?首次发版项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决!有人给项目提交Patch,我们从来不说“No“!我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱&hellip;&hellip;开源微服务项目ServiceComb带您对话Apache大咖,领略Apache专家风采。 -2018年10月13日下午,开源微服务项目ServiceComb的团队邀请Apache基金会三位专家成员:Apache孵化器主席Justin Mclean,Apache董事会董事Roman Shaposhnik, 以及Apache基金会秘书长兼形象大使Craig Rossell,与国内Apache项目开发者相聚于上海。针对开发者所关心的Apache精英管理模式、从孵化器毕业成为顶级项目以及开源软件的商业化等主题进行了深入的交流。本文对活动当日的交流进行了纪实和总结。 -(现场为英文分享,本文对其进行翻译整理和校正归纳) -开场介绍 [姜宁]今天咱们聚集了国内大部分的Apache相关项目的committer,这些项目包括Beam、ServiceComb、Dubbo、Gearpump、Griffin、Kerlin、Skywalking和Weex。这些Apache项目大部分都还在孵化器中孵化,同时还有一些准备进入Apache孵化的项目。 -我在2006年9月作为Apache CXF 项目 初始 committer与Apache软件基金会结缘,2011年1月正式成为 Apache基金会成员。我作为基金会项目导师(Mentor)参与了多个来自中国的Apache孵化器项目。2017年,我作为项目负责人推动ServiceComb进入Apache 孵化器进行孵化,现在 ServiceComb已经很快就要从Apache孵化器毕业了。 -虽然参与了许多Apache开源项目,坦白地说我对Apache的项目孵化流程并未有系统化全面的理解。直到ServiceComb这个项目,我经历了寻找Mentor,捐赠协议签署,迁移项目,孵化器发版,以及毕业准备这些流程之后,才对Apache孵化器孵化流程有了更加深刻的认识。 -就在刚刚的交流中,我发现大家最关心的问题就是如何从Apache孵化器毕业。 我们今天邀请到远道而来的Apache Member,Roman,Justin,Craig,和国内Apache项目开发者一起分享他们有关Apache孵化器孵化经验,以及开源相关的感悟。 -如何从Apache软件基金会孵化器毕业成为顶级项目 [Justin] -从Apache孵化器毕业,首要为孵化项目构建一个社区,项目毕业意味着很多事情,比如要保持开发者的多样性,项目贡献者不能仅仅来自一个公司。此外,还应该尝试小版本发布(make micro releases)。 -[Roman] -发布版本时,除了项目本身,还有许多合规性工作(mechanical stuff)要做,例如开源协议,发版签名,发版投票等等。项目进入孵化器后,要尽快尝试发布第一个版本。许多孵化项目(podling)都想在发布版本时中搞定这样或那样的功能,我总是跟他们说,没关系,项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决,然后再专注于功能开发。 -[Justin] -没错,要尽早发版、多做发版。 -[姜宁] -发布版本尽管痛苦,但是要尽早去做。ServiceComb在发布第一个版本时,团队也非常痛苦,但是经历过这个阶段,后面会变得越来越顺利。 -总结:孵化器毕业要点解读 -构建社区 ASF一直坚信好的软件是由强大的社区构建出来的。诚然,代码是一个软件社区的重中之重,但Apache之道**”Community over code”**同样强调社区的重要性。它意味着我们的行事方式,如何看待彼此,如何进行决策,甚至如何编写代码。健康、互相尊重的社区非常重要,这不仅让社区的开发者有被尊重的感觉,也会带来切实的好处。一个健康、多样、包容的社区,可以促进项目不断成长,可持续发展。甚至,有助于用开源技术提供服务的公司获得商业上的成功。 保持贡献者多样性 ASF非常强调多样性原则。 大部分开源软件项目都是创新型项目,多样性保证了开源项目的持续创新, 也保证了社区的健康发展。 开源项目鼓励所有个体或公司参与, 让他们感觉能对项目有所掌控,或者会对项目产生一定影响。这样可以保证意见的多样性、用户的多样性、系统的的多样性。Apache项目通常是要求有三个以上不同公司的人参与开发,以保证项目不会因为其中某个公司的退出而终止。 ** 尽早、尽量多的进行版本发布** 对于构建持续增长的社区,有何建议? [郑士汉,Weex]:社区建设、多样性对于毕业非常重要,您能给出一些相关建议吗? -[Justin] -要让大家觉得自己是受欢迎的。当有人在邮件列表中提问时,我通常会分配PMC成员关注问题,并咨询提问者是否还需要其他帮助,或者有其他问题,我把这个作为日常工作。这样也有利于开发者从用户变成提交者甚至PMC成员。良好的文档可以让大家更容易使用你的项目。而文档的缺失则可能造成用户的流失,人们编译编译代码,就再也不使用这个项目了,因为项目上手太难了。 -[Roman] -良好的文档确实非常重要。此外,我也有其他方面的建议。Apache软件基金会参与了一些项目,吸引了不少开贡献者。我们一直指导Google代码夏令营活动,夏令营由Google赞助,帮开发者更好的发展他们自己的项目。如果你可以让自己的社区参加类似的活动,对于社区建设无疑是有很大帮助的。因为大家来自中国的社区,我也建议一些中国的大公司,例如华为,也可以举办类似的学生项目,学生是一个项目最好的新鲜血液。 -[Justin] -在会议中分享项目、建立技术博客也是不错的方式。 -[吴晟,Skywalking] -Skywalking是中国开发者发起的一个Apache孵化项目,刚加入孵化时只有15个committer,而现在,代码层面的提交者已经达到了70人。我们提倡大家提交小的改动,这样很容易提交代码来做贡献,所以我们每次发布版本都会吸引一些开发者。当我们没有太多精力投入到测试时,我们会吸引开发者来提供测试,他们可以提交集成测试结果,可以提交测试模型,只要保持正确的编程风格,PMC的成员就可以进行审查,并合并代码。 -[Justin] -这里我想多提一点,很多项目过于注重质量。有些Apache项目收到一些代码不太完美的提交,就直接丢弃了这些提交,然后自己从头搞起。其实这并没有关系,如果你收到了不太完美的PR,可以请社区成员帮忙改进质量。另外,在JIRA或Github上浏览issue时,如果发现一些比较简单的issue,你可以加个”easy to fix”标签,告诉大家这个issue比较容易解决,这样也可以吸引人来贡献。Apache 软件基金会品牌使用指南https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/Wed, 03 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/Apache 软件基金会品牌使用指南 翻译: 王堉琛 -原文出处:http://www.apache.org/foundation/marks/ -Apache® 品牌被 200 多个 Apache 软件基金会(ASF)项目社区共享,它也是我们使命——为公众利益提供软件——的重要组成部分。本品牌使用指南为引用 Apache® 软件项目和产品提供了示例。 -重要提示: 如果您请求在域名、活动或服务中使用 Apache 品牌,则必须遵循本指南。 -术语: 项目( Projects) 是 ASF 中开发并管理软件的组织委员会(PMC)。产品( Products) 是提供给公众的软件代码和下载。在大多数情况下,Apache 项目的名称与 Apache 软件的名称相同,且遵循 “Apache Projectname” 命名格式。 -另请参阅:品牌资源网站地图。 -关于 Apache 品牌 Apache 品牌和我们的 羽毛 logo 代表我们构建软件的 Apache Way 过程。Apache Way 的一些元素包括有一个协作的、共识驱动的志愿者社区,这些志愿者共同治理该项目。这也意味着要有一个厂商中立(vendor-neutral)且独立的治理方式,这种治理方式欢迎所有有益的贡献,而不考虑贡献者的雇主是谁。Apache 品牌的项目托管在 ASF,并且必须被 独立管理。 -作为一个非盈利的公共慈善机构,ASF 的董事会和成员是真正的 独立管理机构,监督许多 Apache 项目社区的运作。有了这一层的监督,可以确保 Apache 项目以符合整个用户社区最佳利益的方式运作,并且可以通过提供一个可以让不同的供应商一同协作的,中立的合作空间来充当创新加速器。 -为了确保 Apache 志愿者社区因提供 Apache 软件而获得应有的荣誉,并维持 ASF 和 Apache 项目独立治理的形象,您应该使用一些特定的方法来引用 Apache 项目和产品。 -如何引用 Apache 项目和产品 Apache 项目总是以 “Apache Hadoop” 的形式命名。虽然我们在这里以 Hadoop® 项目为例,但这些准则适用于所有 Apache 项目。确保始终引用 “Apache Hadoop” 可以确保所有 Apache 项目都与主导它们的非盈利组织共享关系。Apache 下游项目的品牌使用原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/Apache Apache 下游项目的品牌使用原则 翻译: 王福政 -原文地址: http://www.apache.org/foundation/marks/downstream.html -初稿 ~ 初稿 ~ 初稿 本下游发行品牌政策定义了希望以原始 Apache® 产品名称分发 Apache® 软件产品的下游软件发行商的要求。希望使用其他名称的发行商应遵循我们正式商标政策。 -下游发行品牌政策 Apache 软件产品由一些为其平台提供软件包的下游实体分发。例如,Docker 镜像、Linux 发行商和云平台供应商。 -Apache 软件基金会认识到这些下游发行商的重要性,并乐于看到他们在遵循这一政策的前提下,以 Apache 的原始名称发布 Apache 产品。 -命名 该名称必须与 Apache 软件基金会使用的名称相同。所有 Apache 软件产品的全称都具有 &ldquo;Apache ProjectName&rdquo; 的形式。请注意,&ldquo;Apache&rdquo;、&quot;ProjectName&rdquo; 和 &ldquo;Apache ProjectName&rdquo; 是 Apache 软件基金会的商标。 -源代码 软件所基于的源代码必须与 Apache 软件基金会的源代码版本相同,或者以下所有条件都必须符合: -所有源代码更改必须至少满足以下列出的可接受更改标准之一。 必须使用一个版本号,该版本号既要明确区别于 Apache 软件基金会发布的版本,又要明确标识软件所基于的 Apache 软件基金会版本。 文档必须明确标识软件所基于的 Apache 软件基金会版本。 最终用户希望发行渠道能够移植修复。并非所有的修复程序都必须进行反向移植。选择要反向移植的修复程序必须符合该分发渠道的更新政策。 可接受的变更必须至少满足以下标准之一: -该变更已被相关的 Apache 项目社区接受,并被纳入未来的版本中。请注意,接受变更的过程以及接受变更的方式因项目而异。 更改是针对未公开的安全问题的修复程序;该修复程序未公开披露为安全修复程序;Apache 项目已 收到有关该问题和建议的修复程序的通知;PMC 既未拒绝漏洞报告也未拒绝建议的修复程序。 变更是对 bug 的修复;并且 Apache 项目已经被通知了 bug 和建议的修复;并且 PMC 既没有拒绝 bug 报告也没有拒绝建议的修复。 为与目标平台整合而做的小改动(例如,对启动和关闭脚本、配置文件、文件布局等的改动),Apache 项目不反对这些改动。 其他依赖关系 在发行版中包含的任何额外的依赖关系必须按照第三方许可政策的条款进行许可,允许 Apache 项目将该依赖关系包含在 Apache 发行版中。Apache 商标使用管理原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/Apache 商标使用管理原则 翻译: 聂帅 原文出处:http://www.apache.org/foundation/marks/ -本文档概述了允许使用 Apache® 商标的其他方的政策。 -Apache 软件基金会(ASF)拥有所有与 Apache 相关的商标,服务标志,代表我们 Apache 社区的标志,所有 Apache 项目的名称都是 Apache 的商标。 -以下信息有助于确保其他方以经许可的方式使用我们的商标和徽记,确保我们能够合法的保护我们的项目品牌,并且鼓励第三方以所批准的方式使用 Apache 软件和我们的品牌。如果您对此政策或者 Apache 商标有任何疑问,可以联系我们,并请阅读我们的商标资源列表。 -基本原则 Apache® 商标,服务标记和图形标记是质量以及与 ASF 项目相关联的社区支持的象征。为确保 Apache 商标的使用不会导致我们软件的混乱,我们必须控制这些商标和其他组织的软件以及相关服务的联合使用。另外,作为一家美国公司,我们有法律责任和法律权力来指定使用我们商标的政策。 -Apache 软件基金会和我们的许多软件产品必须与其他任何和 ASF 竞争的软件以及任何与 ASF 无关的企业和个人的软件与服务区分开来。 -不得使用 Apache 商标贬损 Apache 软件基金会、我们的项目、会员、赞助者以及社区。也不得使用 Apache 商标以任何方式暗示对任何与 ASF 相关的项目或任意类型的倡议的所有权,支持和赞助。作为一个中立性组织,我们品牌的重要组成部分是Apache 的项目是独立管理的。 -关键商标原则的描述 本部分并不是为了总结商标的复杂法律,而是为了帮助读者了解一些关键的商标原则。更多信息,请参见我们的商标资源列表。 -商标是什么? -商标是用于区分一方与另一方商品来源的一个单词、短语、符号、设计或是单词、短语、符号、设计所组成的整体。服务标志与商标相同,只不过服务标志是用于区分服务的来源的。在整个文档中术语“商标”( trademark )和“标记”( mark )均指商标和服务商标。 -这些规则可以归纳为,使用商标“ Apache ProjectName ”来描述与 ASF 相关的软件,或者当使用商标来描述我们特定的 Apache ProjectName 软件产品时,使用商标“ ProjectName ”来描述。与大多数 ASF 软件一样,“ ProjectName ”的软件是由“ Apache ProjectName ”项目或者另一个“ ProjectName ”的项目(例如“ Apache Incubator ”(本身就是 ASF 的商标))进行维护的。Apache 项目网站商标原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/Mon, 01 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/Apache 项目网站商标原则 翻译: 王皓月 -原文地址: http://www.apache.org/foundation/marks/pmcs -本文定义了商标原则,定义了 Apache®projects 网站显示的元素,以及如何正确地对待 Apache 和其他组织的商标。PMC 商标责任还解释了 PMC 成员应该以何种方式管理项目商标。 -项目网站和 URL 原则:使用 * .APACHE.ORG Apache 项目必须在 apache.org 域上托管官方网站,包括由项目 PMC 监督的内容(包括顶级网站,下载和 Wiki),并确保 ASF 基础架构团队可以维护服务,同时告知用户该内容是官方的并且来自 ASF 和项目 PMC,而不是来自第三方。 任何 ProjectName 的主页都必须由 http[s]://ProjectName.apache.org 提供服务,以确保商标一致,且允许自动生成链接(例如 https://projects.apache.org)。项目的所有主链接都必须直接指向主页,而不是其他站点或域。 项目可以自由地使用基础架构支持的技术来管理和部署网站,并且可以自由使用设计中的外观。未来,我们可能会要求项目添加特定的样式或者图形元素(从多种变体中选择),以使其返回链接 www.apache.org,这将有助于用户更好地了解 Apache 项目之间的联系。 拥有悠久的开源开发历史和庞大的用户群新社区进入 Apache 孵化器前,应该阅读使用 non-apache.org 域的限制。 项目命名和描述原则 存在新项目名称的选择准则,但尚未进行审查并合并到此原则文档中。 -任何项目或产品名称的主要商标必须采用“Apache Projectname ”的形式,这样可以确保在用户心中,项目或产品与 ASF 相关联,并确保第三方不能轻易滥用项目名称。项目或产品的每个页面中第一个最重要的引用,以及页面标题中的引用,都必须使用其名称的“Apache Projectname ”形式。其他引用可以根据主题使用“ Apache Projectname ”或“ Projectname ”。 该产品的每个产品主页和任何概述下载页面都必须包含对该产品的突出引用,称为“ Apache Foo 软件”,并且必须包含对该软件产品本身的用途和功能的简短描述。例如: Apache Xerces XML 解析库软件提供了 XML 1.Apache孵化器指南https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/Sun, 28 Feb 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/Apache孵化器指南 翻译:狄晓晓 -Apache孵化器是项目捐赠到ASF的入口。目前国内越来越多的开源项目通过Apache孵化器进入Apache软件基金会孵化。 -本文翻译至 https://incubator.apache.org/cookbook/,为大家介绍了项目进入Apache孵化器需要做的准备,以及孵化过程中做的工作。 -该指南与孵化器主页为大家提供了在ASF孵化项目所需的必要信息。该指南汇集了所有孵化器的相关问题,给出了孵化器目标和过程的概述,并提供了更多详细信息的链接。 -该指南内容按照项目从被接收孵化到毕业成为顶级项目(Top-Level Project,TLP)的时间顺序进行组织。 -欢迎大家通过general@incubator.a.o邮件列表或INCUBATOR-234任务单对该指南提出反馈意见,也可以向该指南所在的项目仓库提交补丁。 -一、我们的项目适合Apache孵化器吗? 正如ASF在2018年的愿景声明中所讲的那样,ASF为公共利益提供软件。 -ASF的项目会遵循Apache之道进行运转,Apache之道是一套指导原则和最佳实践。 -ASF非常重视“社区重于代码”(Community Over Code)这一理念,ASF严格独立于公司和组织,并强调在工作各方面保持开放。 -捐赠项目到ASF,意味着您将放弃对该项目以及项目商标(如果有)的控制。非常欢迎您参与该项目,但是除了成为PMC(Project Management Committee,项目管理委员会)成员之外,您没有其他特殊的地位。好消息是,由于ASF的独立性和对项目可持续性的重视,您的项目可以自己成长,并可能具有更广泛的影响力。 -假设您的项目符合这种观念模式,我们不会根据项目功能来判断项目的接收情况,这是由ASF特意不设置技术策略所决定的。如果您的项目与ASF已有项目非常相似,我们可能会要求你考虑加入该项目。尽管如此,我们仍然有一些项目具有相似的目标,但这并不一定是一个问题。 -为了给“podlings”(incubating projects,孵化项目)带来最大的成功机会,我们通常要求他们进入孵化器,并至少有一个围绕现有代码库构建的社区的开端。 -二、成为ASF顶级项目的步骤是什么? 孵化的目标是成为ASF的顶级项目。您可以通过How the ASF works页面,了解孵化以及不同角色(提交者committers、PMC成员等)的内涵。 -为此,孵化项目(incoming project,podling)需要执行以下步骤: -寻找领路人(champion)和孵化导师(mentor),讨论并准备孵化提案; 决定在ASF孵化; 与孵化器PMC讨论提案; 如果需要,完善提案中的初始提交者和导师列表; 如果需要,基于孵化器PMC的反馈,完善提案; 孵化器PMC对提案进行投票; 配置项目的基础设施; 围绕项目代码开始构建社区; 邀请新的提交者和PPMC成员; 发布项目并记录,完善代码和发布过程; 当准备毕业时,与导师一起评估项目的就绪情况; 准备将现有商标转让给ASF(如果情况符合); 与孵化器PMC讨论毕业; 孵化器PMC开始毕业投票,这会使ASF董事会决议建立TLP。 以上描述的是乐观的情况,概述了典型的孵化流程,项目真正孵化的顺序可能会与该流程略有不同。以下是该流程的详细内容: -三、与孵化器沟通 孵化器PMC负责管理孵化器,帮助孵化项目完成孵化过程。 -可以通过公开链接:general@incubator.a.o访问邮件列表,与孵化器PMC进行沟通。 -四、寻找接口人和导师 为了进入孵化器,您的项目需要一名接口人和至少2-3名导师。这些人需要是孵化器PMC中的成员,ASF成员只需提出即可加入孵化器PMC。 -接口人负责在创建提案过程中帮助孵化项目,他们在前面的步骤中(至少直到项目提案被接收)充当孵化项目与孵化器PMC之间的联络员,之后可能会继续担任导师。 -导师则会在项目成长为顶级项目的道路上全程陪伴。 -起点通常是寻找接口人,您可以在general@incubator.a.o邮件列表中提交项目的简短介绍,附上相关链接,并说明您正在寻找接口人,努力引起大家的兴趣。如果您认识任何ASF成员或孵化导师,可以直接询问他们是否愿意提供帮助。 -五、创建孵化提案 接口人会帮助项目准备孵化提案,提案会对新项目进行描述,以便后续与孵化器PMC进行初步讨论。 提案需要包含若干标准段落,详情请参考podling proposal template. -ASF项目的孵化提案都保存在Incubator wiki页面上,可以将它们作为示例进行参考,上一自然段中的链接给出的是方案的最新模板。 -六、讨论孵化提案 提案准备好后,项目代表需将其发送至general@incubator.a.o进行讨论,主题行应如下,以引起孵化器PMC的注意。 -[DISCUSS] Foo Proposal -该讨论通常会要求提案进行一些改动。 -该讨论阶段没有规定讨论时长,通常会持续几天,直到所有关注问题都被妥善讨论并形成解决方案。 -以下是最近的讨论,请参考: -Nuttx proposal (in progress) StreamPipes proposal (accepted) Sparkr proposal (withdrawn) TubeMQ proposal (accpeted) MetaObjects proposal (on hold) 七、孵化提案投票 讨论阶段一结束,接口人或项目代表就会在general@incubator.ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/音频编辑: 周禹任 -文案: 周禹任 -内容梗概 在开源社区中,除了代码贡献之外,非代码贡献同样也有着十分重要的作用。两者相辅相成,才能一起构建起更加蓬勃的社区。本期节目中,ALC Beijing 邀请到了两位在校的大学生嘉宾,她们都是以非代码贡献者身份分别加入到 CHAOSS 和 Apache 的社区当中。她们在融入社区的同时,也丰富了自身的经历并获得了成长。 -那么在本期节目中,就让我们一起来聊一聊大学生究竟该如何参与到开源社区中,以及她们在开源社区中都能得到哪些收获。通过与他们的对谈,我们也可以对开源社区中的非代码贡献的方式及其对社区的意义有一个更深的了解。 -时间线 时间区间 精彩话语提炼 03:16~~07:57 CHAOSS 社区是什么 09:02~~11:15 夏小雅是如何以非代码贡献者身份参与到 CHAOSS 社区当中,以及她在 CHAOSS 社区中做的贡献 13:22~~16:34 周禹任是如何以非代码贡献者身份参与到 Apache 社区当中,以及他在 Apache 社区中做的贡献 16:37~~20:03 两位嘉宾作为非代码背景的开源新人,在开源社区中得到的收获和成长 20:58~~22:16 大学生为何难以加入到开源社区中 24:25~~28:15 姜宁老师对于大学生参加开源的看法 29:23~~35:16 开源社区中各种非代码贡献的方式和途径 请收听 ALC Beijing Podcast Episode #9: 开源社区中的非代码贡献 -本期嘉宾 夏小雅: 华东师范大学在读研究生, X-lab 实验室成员,CHAOSS 社区成员ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/音频编辑: 余梓寒 -文案: 姜宁,余梓寒 -内容梗概 作为一个前端开发人员,你在制作各种报表的时候,一定离不开一个非常棒的project,那就是Apache ECharts。Apache ECharts 用 JavaScript 编写,基于支持 Canvas 和 SVG 的 ZRender 渲染引擎,提供了一系列动态的、高度可定制的图表类型,包括线图、柱图、散点图、饼图、雷达图、K 线图、仪表图、漏斗图、热力图等。最新发布的Apache ECharts 5 通过在动画叙事、优化的可视化设计、交互体验、性能提升、开发体验、国际化、可访问性等方面的 15 项新功能和改进,让开发者更容易讲述数据背后的故事。 -最近 Apache ECharts 从Apache软件基金会孵化器毕业成为顶级项目, ALC Beijing 非常有幸邀请到了Apache ECharts PMC成员,请他们来给大家去分享在从孵化器项目到Apache顶级项目背后的故事。看看他们是怎样吸引全世界的开发者,如何维护社区的日常运营,以及在构建社区过程中遇到了什么的问题,这些问题又是如何解决的。 -时间线 时间区间 精彩话语提炼 02:27~~03:32 Apache ECharts项目进入Apache的孵化器的初衷 03:33~~09:43 如何吸引国内外开发者,如何激励贡献者 09:45~~13:41 如何降低开发者参与的门槛,Apache ECharts有妙招 16:21~~17:59 Aapche ECharts PMC是如何进行项目维护的 18:59~~21:26 姜老师点评Apache Way和发展新用户的关系 21:55~~28:16 Apache项目邮件列表相关问题 27:28~~30:40 Github issue 讨论的问题 32:51~~34:20 Apache Mentor 对邮件列表的建议 34:45~~36:55 Apache发版的问题 39:27~~44:08 用户量多了的烦恼&ndash;如何面对用户反馈的问题 45:44~~48:13 Apache ECharts 5.从初识社区到融入社区https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/Tue, 05 Jan 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/推荐语:夏小雅是华东师范大学数据学院的在读研究生,也是X-lab成员之一。我认识小雅还是在去年年初的时候,我和她聊了一下她选的ServiceComb的实践项目,当时能感觉得到她参与开源的经验还很少;后续在CHOASS 项目例会中发现她逐渐活跃起来,逐步在社区中找到自己的位置了;在刚刚结束的 CHOASS Shanghai Meetup,小雅忙前忙后俨然成为一个在 CHOASS 社区很相当活跃的活动组织者。 -&ndash; ALC Beijing 发起人 姜宁 -CHAOSS CHAOSS(Community Health Analytics Open Source Software)是Linux基金会下专注于开源社区度量标准与软件开发的开源项目。从风险、演化、多样性、价值等角度持续制定与发布指标。 -今年参与CHAOSS项目的经历毫无疑问是我的2020最浓墨重彩的一笔,最初只是在每周的开放会议中旁观,偶尔提出一些小的讨论,到六月份开始申请Season of Docs,成为一名技术文档撰写的实习生,到12月开始筹划CHAOSS在中国的第一次Meetup,最终以12月27日Meetup的圆满成功作为落幕。 -从OS Revolution掀起开源革命到现在,“开源”两个字所代表的绝不仅仅是代码开放。依托项目构筑起的社区是一种基于技术的新型数字化组织架构,如何定义一个好的开源社区?依据什么进行开源治理?到现在也很难有体系将这件事完整的讲清楚,这也是CHAOSS这个项目的价值所在,即便我们也很难说CHAOSS的指标体系是合理的、完善的,但是一个为开源度量而存在项目,本身就具有着无穷价值。 -我最感兴趣的是其中“多样性与包容性(D&amp;I)”这个小组的内容,一个致力于定义社区健康度的社区本身应该是相对健康的,一个讨论开源社区D&amp;I指标的小组本身是多样和包容的,这也的确是CHAOSS给我的实际感受。D&amp;I小组用耐心与包容度鼓励着我这个社区新人,并让我意识到任何形式的贡献都是有意义的。 -Google Season of Docs 也是在一次D&amp;I组会上,我得知了Season of Docs这个项目,并产生了申请试试的想法。申请期间我的选题同时有另外两位竞争者,一位来自印度一位来自非洲,我能清晰感受到他们显然是比我更加熟练的英文使用者,因此在这个过程中也感受到了巨大压力。在回答Micro Task和编写proposal时,我格外注意语法和文档的结构性;那段时间几乎每次D&amp;I组会和项目的小会我都会参加,或许也是因此赢得了选拔。 -我的两位导师都非常年轻,实习过程几乎是交朋友的过程,十分快乐。虽然有时候会因为口语交流和时差问题感到压力,但是每次线上见面,听到对方的“How you doing today?”,听到对方对于每周我并不认为自己做的十分好的工作不吝赞美,还是感到十分温馨。 -CHAOSS Shanghai Meetup 12月份,我的Season of Docs之旅正式结束,我向社区提出在中国举办一次local meetup,得到的反馈与支持是我完全没有意料到的,社区给予了能够给的所有支持,提供过往经验、材料和日程建议。很多人表达了无法现场参加的遗憾,并希望通过录制video或线上接入来Backup。 -这把火瞬间烧的旺盛,我也备受鼓舞。得益于X-lab、华为、微软Reactor的老师们的支撑,从建立官网注册链接、制作海报、收集来自社区的video和材料,在邮件列表上协调与沟通,我从备受鼓励的角色变成了鼓励与赞扬他人的角色,这种角色转换的过程奇妙而充满了成就感,仿佛是传承,又像是传染 - - 好的社区氛围也是具有传染性的,好的氛围往往会有奇妙的化学反应。 -这是我第一次办一场Meetup,过程中避免不了手忙脚乱,最大的考验是它的琐碎性与细节性,以及在这个过程中如何协调与沟通。现在回想那段时间,几乎很难完全沉下心来,因为常常会被Meetup的琐碎细节打断,我的一个总结是,负责一场活动是避免不了与零碎事情打交道的,但是可以给自己设一段时间来集中处理,而不是被各种状况牵着走。另外一个心得是,社区中的志愿者是需要激励机制的,在给大家分发任务前,将回馈机制亮出来(礼品、餐食等)会更有说服力。 -社区通关攻略 新人对于一个社区是格外珍贵的,这点我深有体会,在我最初在邮件列表、在会议中开始发声,我收到的回应和鼓励格外多,我的一些小建议会被记录在会议文档里,标注上我的名字。所以千万别觉得你作为一个新来者,就是这个社区的“场外观众”。 -多去提问,最基础的问题有时候最有意义,它会给项目维护者带来不同的视角。我最初参与项目时,对于其中“Event”指的是什么就产生了错误理解,但是这也让大家意识到需要对项目的术语在文档中做好定义。 -刷脸熟非常重要,不要总徘徊在场外,也不需要抱着做了一定的贡献才能融入进去的想法。哪怕还没想好做什么,在邮件列表或者GitHub上做一个自我介绍,表达想要贡献的心情。在社区中,你总能得到帮助的。 -不要因为你的英语不够纯正,或者有语法错误就不开口。有时候只需要几个单词对方就可以听懂,而get到双方的意思才是交流的核心。在沟通的过程中你大概率会受到鼓励,从而越来越应付自如。 -参与开源社区不需要你一定是个技术大牛,社区中的非代码贡献种类繁多,并且意义同等重要。CHAOSS项目有一个指标定义出了开源社区中可能有的贡献类型: -作为新手区的我们,除代码外可以做的贡献类型也十分丰富,这些贡献类型也是多交叉学科的。例如翻译和本地化、文档撰写、设计工作、社交媒体的运营管理、用户支持和答疑、法律咨询、社区沟通和管理、组织活动或在活动上作为一个speaker。像我从写项目文档到组织CHAOSS上海Meetup,就是典型的非代码贡献。ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/内容梗概 在校大学生作为开源贡献者参与到顶级开源项目中,这对很多同学来说是一件很遥远而又陌生的事情。“不知道如何参与开源项目”、“不知道如何玩转社区”、“不知道如何和社区成员交流沟通”等问题,将跃跃欲试的同学们拦在开源项目的大门之外。 -2020年暑假,中科院软件所发起来了一个非常好的学生暑期实习计划&ndash;“点亮计划暑期2020”。这个计划鼓励研究人员、开源爱好者、在校师生参与开源软件的开发与维护,促进开源软件在国内的发展和优秀开源软件社区建设,增加开源项目在国内的活跃度,在开源领域与世界接轨。 这次“点亮计划暑期2020”通过开源社区导师出题,在校学生根据导师出的题目题目进行方案设计并提向导师提起项目申请,导师在选定实习学生之后,学生会在导师的指导下进行为期三个月时间远程实习,实际参与的开源软件项目的开发与维护。 -今年的“点亮计划暑期2020”涌现出来了很多优秀的学生和导师,值得一提的是有三名学生成为Apache项目的Committer,并获得了“点亮计划暑期2020”优秀学生&ndash;最有潜力奖。 这次 ALC Beijing 特别邀请到了这三位新晋成为 Apache Committer 的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程,介绍一下大家是如何进行项目申请以及如何与导师沟通协作的。 -收听本次播客,你还将会收获:开源项目中如何给我的科研带来了灵感;参与开源我接触了很多学校中学习不到的新知识;开源社区提升了我的自信心,拓宽了我的视野…… -时间线 时间区间 精彩话语提炼 00:10 ~~ 04:30 点亮计划暑期2020背景介绍。 04:35 ~~ 08:39 嘉宾个人介绍。 08:50 ~~ 12:18 吴舒旸同学介绍自己申请暑期2020计划的经历。 12:51 ~~ 15:34 作为导师大家是如何看待暑期2020计划。 15:51 ~~ 19:30 姜宁分享了他在GSoC当导师和在暑期2020计划当导师的不同体验。 19:45 ~~ 24:00 导师如何对学生的提案进行筛选的(导师特别喜欢主动性强的学生)。 25:01 ~~ 32:00 张可同学,江华禧,吴舒旸分享他的选题和项目申请经验。 35:01 ~~ 42:05 陈军旭,吴舒旸分享了导师和学生是如何进行沟通。 42:20 ~~ 47:36 柯振旭分享了如何拉近与学生之间距离的小贴士。 47:40 ~~ 52:36 张可,江华禧同学结合他的任务分享了他和导师交流的心得。 52:53 ~~ 56:51 柯振旭分享了如何平衡日常工作与辅导学生时间,以及当“学生鼓励师”的经验。 57:30 ~~ 67:55 成为Committer之后,大家对开源社区,对导师又有什么新的认识? 请收听 ALC Beijing Podcast Episode #7:“点亮计划暑期2020” 优秀学生导师经验分享ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 03:16 本次嘉宾的自我介绍 03:20~~ 05:36 创立IoTDB的原因 05:50~~ 09:00 为什么IoTDB会开源 09:12~~ 15:00 高校做开源与高校考核体制冲突的问题, 如何在论文和软件系统之间找到平衡点。 15:11 只有真的做出来一个被市场认可的东西,它才是一个能有长久生命力的东西,而不是一篇引用很高的论文。 15:20~~ 24:36 黄向东读博士期间很难拿奖学金到乔嘉林申请国家奖学金的故事 25:20~~ 28:36 在清华博士开题毕业的相关要求 30:53~~ 45:36 高校如何更好的去开展开源项目 46:53~~ 54:55 如何让老师和同学们公开的交流起来 请收听 ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事 (上) )ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 02:16 信息分享的同时要有很多的检索机制来查找 03:00~~ 05:11 高校是开源事业发展的沃土 05:12~~ 10:00 IoTDB 进入Apache软件基金会孵化的故事, 10:12~~ 15:00 为什么IoTDB选择Apache软件基金会 15:10 ~~ 20:30 Apache IoTDB孵化前后Community的变化,德国老外也到微信群里聊天 21:07~~ 23:00 Apache IoTDB是如何保持Open的 23:13~~ 35:36 Apache IoTDB在孵化过程中遇到的转折点,如何处理人员流动的问题? 30:53~~ 39:36 开源是一个长跑,如何坚持下来? 39:53~~ 43:55 王伟老师访谈总结 请收听 ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事(下)暑期 2020 活动学生(张可)心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/Sun, 20 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/引言 如果能结合自己的科研学习述求参与到实际的开源项目中,既能为自己的后续的科研工作助力,又能在开源社区结识到一群志同道合的小伙伴,并且还能得到项目导师的指导,同时还能有一定的经济收益。 -暑期2020涌现出来了很多优秀的学生和导师, 这次 ALC Beijing 特别邀请张可给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期 2020 的导师同学的访谈播客,敬请关注。 -今年暑假期间我参加了开源软件供应链点亮计划—暑期 2020 的活动,在这个活动中,我主要参加了 Apache SkyWalking 的 Python Agent 的开发,最终项目顺利结项并获得了”最具潜力奖“,今天我想分享一下我参与这个活动以及开源社区的感受与收获。 -缘起 其实我在参加暑期 2020 活动之前就听说过 SkyWalking 了。我研究生的主要研究方向是微服务和云原生,组里的学长们之前就在使用 SkyWalking 进行一些研究工作,也是通过他们,我了解到了 OpenTracing, SkyWalking 等与微服务相关的 Tracing 工具以及 APM 等,当时我就在想如果有机会可以深度参加这些开源项目就好了。 巧的是,也正是在差不多的时候,本科的一个学长发给了我暑期 2020 活动的链接,我在其中惊喜的发现了 SkyWalking 项目。 -虽然说想要参与 SkyWalking 的开发,但是真的有了机会我却有一些不自信——这可是 Star 上万的 Apache 顶级项目。万幸的是在暑期 2020 活动中,每一个社区都提供了很多题目以供选择,想参与的同学可以提前对要做的事情有所了解,并可以提前做一些准备。我当时也仔细地浏览了项目列表,最终决定申请为 Python Agent 支持 Flask 或 Django 埋点的功能。当时主要考虑的是,我对 Python 语言比较熟悉,同时也有使用 Flask 等 web 框架进行开发的经验,我认为应该可以完成项目要求。为了能让心里更有底一些,我阅读了 Python Agent 的源码,写下了对项目需要做的工作的理解,并向项目的导师柯振旭发送了自荐邮件,最终被选中去完成这个项目。 -过程 被选中后我很激动,也把这份激动化作了参与开源的动力。我在进一步阅读源码,搭建本地环境后,用了三周左右的时间完成了 Django 项目的埋点插件的开发,毕竟我选择的项目是一个低难度的项目,而我在 Python web 方面也有一些经验。在这之后,我的导师和我进行了沟通,在我表达了想要继续做贡献的意愿之后,他给我建议了一些可以进一步进行贡献的方向,我也就继续参与 Python Agent 的开发。接下来,我陆续完成了 PyMongo 埋点插件, 插件版本检查机制, 支持使用 kafka 协议进行数据上报等功能。在提交了暑期 2020 活动的结项申请书后,我又继续参与了在端到端测试中增加对百分位数的验证等功能。暑期2020活动心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/Sat, 19 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/引言 暑期2020涌现出来了很多优秀的学生和导师, 这次ALC Beijing 特别邀请江华禧给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期2020的导师同学的访谈播客,敬请关注。 -背景 我是一个热爱编程、热爱技术的人,⼀直以来都向往着能参与到开源项⽬中锻炼⾃⼰,但当我面对庞大而复杂的项目代码时,却感到手足无措,不知该从何开始。⽽此次的“开源软件供应链点亮计划-暑期2020”活动则正好提供了这样⼀个机会:清晰的任务要求、开源社区成员作为导师提供指导以及一笔丰厚的奖金,让我顺利地踏上了开源这条道路。 -回顾 在“暑期2020”活动的这两个多月里,我为 SkyWalking 的命令行工具实现了一个 dashboard,此外在阅读项目源码的过程中,还发现并修复了几个 bug。到活动结束时,我共提交了 11 个 PR,贡献了两千多行改动,对 SkyWalking CLI 项目的贡献数量排名第二,还获得了“最具潜力奖”。 -我觉得之所以能够如此顺利地完成这个项⽬主要有两个原因。一方面,我选择的 SkyWalking CLI 项⽬当时最新的版本号为 0.3.0,还处于起步阶段,代码量相对较少,⽽且项⽬结构非常清晰,文档也较为详细,这对于我理解整个项⽬⾮常有帮助,从⽽能够更快地上⼿。另一方面,我的项目导师非常认真负责,每次我遇到问题,导师都会及时地为我解答,然后我提交的 PR 也能够很快地被 review。⽽且导师不时会给予我肯定的评论与⿎励,这极⼤地提⾼了我的成就感,让我更加积极地投⼊到下⼀阶段的⼯作,形成⼀个正向的循环。 -收获 回顾整个参与过程,觉得自己收获颇多: -首先,我学习到了很多可能在学校里接触不到的新技术,了解了开源项目是如何进行协作,开源社区是如何运转治理的,以及开源文化、Apache Way 等知识,仿佛进入了一个崭新而精彩的世界。 -其次,我的编程能力得到了锻炼。因为开源项目对于代码的质量有较高的要求,因此我会在编程时有意识地遵守相关的规范,培养良好的编码习惯。然后在导师的 code review 中也学习到了一些编程技巧。 -此外,参与开源为我的科研带来了不少灵感。因为我的研究方向是智能软件工程,旨在将人工智能技术应用在软件工程的各个环节中,这需要我在实践中发现实际问题。而开源则提供了这样一个窗口,让我足不出户即可参与到软件项目的设计、开发、测试和发布等环节。 -最后也是本次活动最大的一个收获,我的贡献得到了社区的认可,被提名成为了 SkyWalking 社区的第一位学生 committer。 -建议 最后,对于将来想要参加此类活动的同学,附上我的一些建议: -第一,选择活跃、知名的社区。社区对你的影响将是极其深远的,好的社区意味着成熟的协作流程、良好的氛围、严谨的代码规范,以及有更大几率遇到优秀的导师,这些对于你今后在开源方面的发展都是非常有帮助的。 -第二,以兴趣为导向来选择项目,同时要敢于走出舒适区。我最初在选择项目时,初步确定了两个,一个是低难度的 Python 项目,另一个是中等难度的 Go 项目。当时我很纠结:因为我对 Python 语言比较熟悉,选择一个低难度的项目是比较稳妥的,但是项目的代码我看的并不是很懂,具体要怎么做我完全没有头绪;而 Go 项目是一个命令行工具,我对这个比较感兴趣,且有一个大致的思路,但是我对go语言并不是很熟悉,实践经验为零。最后凭借清晰具体的 proposal 我成功申请到了 Go 项目并顺利地完成了,还在实践中快速掌握了一门新的编程语言。 -这次的“暑期2020”活动虽已圆满结束,但我的开源之路才刚刚开始。ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/目的 在诺大一个中国,开源的相关运转机理、成功方法等还是一片荒芜,ALC Beijing 不仅要怯魅,还得防止复魅。在接下来的2021年,我们特别每月推出一次在线的指导和交流,内容涵盖进入Apache的方方面面,包括但不限于: -进入apache 软件基金会的开源项目有何附加值? 开源或闭源项目如何加入Apache软件基金会孵化? 成为Apache Member 是一种什么体验? 如何让我的patch 被Apache 项目接受? 如何选择一个Apache开源项目进行贡献? &hellip;&hellip; 准备条件 一台安装有Zoom软件的接入互联网的终端设备,以及安静的角落。 -即将播出,在线交流 主题 主讲及简介 日期/时间 报名链接地址 备注 进入Apache的开源项目有何益处? 姜宁,ALC Beijing 发起人,Apache 软件基金会成员 在Apache如何孵化一款开源软件项目? 吴晟,Apache SkyWalking VP,Apache 软件基金会成员 2021.1.17周日,北京时间21:00~21:40 https://calendly.com/opensourceway/apache-mentor 已经结束,观看录像亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/作者:赵禹光 -简介: 2020年11月14日Apache SkyWalking 2020 DevCon由贝壳找房和tetrate赞助,Apache SkyWalking、云原生、Apache APISIX、Apache Pulsar 和 ALC Beijing 五大社区合作,在贝壳找房一年级会议室盛大举行,本次活动主要面对Apache SkyWalking的使用者、开发者和潜在用户。线上线下共有230多人报名。经统计,实际参加活动人数超过130人,近60%的人愿意抽出自己的休息时间,来交流学习Apache SkyWalking和开源文化。不难看见,在可预见的未来,中国的开源项目很快将进入下一个维度,那必定是更广的社区人员参与,更高技术知识体现,更强的线上稳定性和及时修复能力。 -活动线下盛况: SkyWalking&rsquo;s 2019-2020 and beyond 吴晟老师本次分享:回顾2020SkyWalking发布的重要的新特性,出版的《Apache SkyWalking实战》图书,社区的进展,开源爱好者如何参与SkyWalking建设,和已知社区在主导的SkyWalking2021年孵化中的新特性。 贝壳全链路跟踪实践 赵禹光老师(作者)本次分享:回顾了贝壳找房2018年至今,贝壳找房的全链路跟踪项目与SkyWalking的渊源,分享了SkyWalking在实践中遇到的问题,和解决方案。以及SkyWalking近10%的Committer都曾经或正在贝壳人店平台签中研发部工作过的趣事。 SkyWalking在百度爱番番部门实践 刘嘉鹏老师本次分享:回顾了百度爱番番部门在使用SkyWalking的发展历程&amp;现状,CRM SAAS产品在近1年使用SkyWalking实践经验,以及如何参与SkyWalking的贡献,并成为的Apache Committer。 非计算机背景的同学如何贡献开源 适兕是国内很有名的开源布道师,本次分享从生产、分发、消费的软件供应的角度,根据涉及到的角色,然后再反观现代大学教育体系的专业,进一步对一个开源项目和community需要的专业背景多样性进行一个阐述和探究。并以ALC Beijing为例进行一个事例性的说明,非计算机背景的同学如何贡献开源。 如何从 Apache SkyWalking 社区学习 Apache Way 温铭老师本次分享了Apache APISIX如何从9个月,就快速完成了孵化,成为了Apache顶级项目,以及Apache APISIX与Apache SkyWalking两个项目的故事。并从中阐述了“社区大于代码”和“最快的成长就是对其标杆”的道理,其他Apache孵化中,或是准备加入Apache的项目非常有借鉴意义。 Apache SkyWalking 在小米公司的应用 宋振东老师是小米信息技术部分布式链路追踪系统研发负责人,分别以小米公司,业务开发、架构师、SRE、Leader和QA等多个视角,回顾了SkyWalking在小米公司的应用实践。从APM的产品选型到实际落地,对其他公司准备使用SkyWalking落地,非常有借鉴意义。 Istio全生命周期监控 高洪涛老师本次分享了SkyWalking和可观测云原生等非常前沿的知识布道,其中有,云原生在Logging、Metrics和Tracing的相关知识,Istio,K8S等方面的实践。对一些公司在前沿技术的落地,非常有借鉴意义。 针对HikariCP数据库连接池的监控 张鑫老师本次分享了,以一个SkyWalking无法Tracing的实际线上故障的故事出发,讲述如何定位,和补充SkyWalking插件的不足,并将最后的实践贡献到社区。对大家参与开源很有帮助。 SkyWalking 与 Nginx 的优化实践 王院生老师本次分享SkyWalking社区和APISIX社区合作,在Nginx插件的实践过程,对社区之间的如何开展合作,非常有借鉴意义,院生老师的工作&amp;开源态度,很好的诠释Geek精神,也是我们互联网从业者需要学习恪守的。 讲师PPT下载 Apache SkyWalking 2020 DevCon 讲师 PPT -SkyWalking 后续发展计划 正如吴晟老师所说:No plan, open to the community,Apache SkyWalking是没有RoadMap。社区的后续发展,依赖于每个人在社区的贡献。与其期待,不如大胆设想,将自己的设计按照Apache Way贡献到SkyWalking,你就是下一个Apache SkyWalking Commiter,加入Member of SkyWalking大家庭,让社区因为你,而更加有活力。ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/内容梗概 开源越来越重要,而且在不断的吞噬着企业的软件技术栈,有的研究机构甚至得出的结论是超过95%都是开源,越来越多的软件开发者把开源的优秀实践带到企业内部。Tim OrReilly在2000年的时候发明了内源 (InnerSource)这个词,用来解释这一现象。 根据维基百科的定义,内源就是使用了开源软件开发的最佳实践,在组织内部建立起了一种类似开源的文化氛围。组织内部使用了开放的方式开发专有软件。 -为了让帮助大家进一步了解与内源相关的信息,ALC Beijing 播客邀请到有着多年开源以及内源经验的专家谭中意和我们聊一下内源这个话题。 -时间线 时间区间 精彩话语提炼 00:00:10 - 00:03:00 本次嘉宾的自我介绍 00:03:26 - 00:06:53 内源是什么?InnerSource Commons背后的故事。 00:06:53 - 00:09:05 内源兴起的原因 00:12:12 - 00:23:12 内源带来的好处有哪些? 00:23:12 - 00:26:45 企业中哪些项目适合内源? 00:26:45 - 00:31:33 员工参与企业内源项目能收获到什么? 00:31:33 - 00:38:57 内源地盘之争的解法? 00:38:57 - 00:46:47 大家真的是没有时间参与内源项目吗? 00:46:47 - 00:50:19 异步式沟通对程序员提高效率的重要性 00:50:19 - 00:57:20 内源和开源有什么区别? 00:57:20 - 01:03:00 Apache Way 能直接照搬到内源中吗? 请收听 ALC Beijing Podcast Episode #5:内源 InnerSource我与开源的那些事儿https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/Thu, 29 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/我与开源的那些事儿。 很幸运!!!是的,很幸运,除了幸运,我不知道该怎么形容我和 开源 的缘分。感觉就好像在冥冥之中,肯定会走上这条道路一样。 -缘起 2020注定是特别的一年,年初,谁也没想到,一场疫情把我们牢牢的困在家里,哪也去不了。。说实话,或多或少有点抱怨吧。但伴随而来的,是一场灾难。那个时候每天一早醒来,看见手机屏幕刷新的数据,冰冷的可怕,红线一直在升。。。当时就在想,为什么我不是学医的,待在家里什么都做不了,似乎捐钱变成了最可悲的方式。 -偶然一次,在知乎上看见关于开发者抗疫的活动——“Wuhan2020”。学计算机专业的我,本身就对技术方面的文章也比较感兴趣,就随手点了进去。( 其实当时内心所想的是,可能有是一个营销号在做文章 )。在大致了解了Wuhan2020整个项目之后,便开始搜集更多的与之相关的信息。最后偶然在一个公众号中,看见了“黑客松活动”。就水群,进去了,,哈哈哈哈。但当时还是个技术小白,啥都不懂,可以理解成比会写“hello world“强那么一点点。在那之后,也找到了Wuhan2020的官方公众号。那时,想着尽自己的一份力,但是无论是对于开源文化上还是技术上都感到了很大的局限性,说俗点,大概就是心有余而力不足吧。随后大约在四月份( 精确点是4月4号,因为那一天整个世界都是灰色的 ),看见了Wuhan2020公众号招人,我想了想自己对于做图剪视频之类的,还算是比较擅长的,就去试试水。进入了设计组。这也算是我第一次真正接触到开源吧。 -幸运 说实话,除了幸运我不知道该怎么来形容这段经历。当时在设计组群里,几乎什么都没做,就发了一份作品+自我介绍,然后有一位华师大的学姐,就加我为好友,说是带我一起和一位大佬做Apache相关的推广。哈??Apache是什么??当时的我是一脸问号。。。。然后就抱着试一试的心态跟着去了。。。( 现在想想当时真的是有趣,如果我说我什么都不了解,甚至拒绝的话还会有现在的我么。。而且群里那么多人咋就单单选中了我呢,哈哈哈哈)然后和Apache的姜宁老师简单聊了一下,说到hugo啥的。我心里想hugo??雨果还搞开源??随后查了一下,是一款搭建静态博客的框架,这也是我正式使用github的起点吧,更新博客。学了点东西总要找点事情做的,要不然时间一长,不就那也记不住了,哈哈哈。 -慢慢的跟着学姐运营ALC-Beijing和Wuhan2020的公众号,也一起了解到更多有关开源的文化。习惯也由之前的天天逛CSDN、知乎变成Github、掘金之类的。成功搭建博客,给我学习新的知识也树立了信心。似乎一切都好了起来,那个时候武汉已经宣布解封。 -当时接触开源之前,总感觉自己怀才不遇,明明会的不少,懂得知识也挺多的,为什么就还只是一个普普通通的大学生呢??还是做不到出圈,每天混学分,做着毫无疑义的事情。但当皓月姐姐加我好友的那一刻开始,就感觉那份属于我的运气该来了,还撞的特别准。 -随后也加入了开源社,慢慢认识了更多的小伙伴,一群人不认识也不了解,分布在各个地方,做着一件共同的事情,可能这就是我当时所理解的开源吧。 -受阻 当时想着为一些顶级的开源项目做贡献,就开始学会主动去吸取知识,那种学习给我的感觉是由心而发的,主动的。如果问我那时为什么想参与开源,大概是开源本身就具有向善的属性,也认为那是一种体现自己价值的方式。 -当五月份学校宣布返校的时候,回头学校之后,就开始感觉自己有出圈的能力了,也有出圈的想法,可能是技术层面,学校没有需要学习的,也可能是真正意识到现在的自己可以做一些更有意义的事情了。就逐渐向周围的同学唠叨着自己接触开源的事情,很多人的情况和我一样,一开始都是一脸懵圈,但遗憾的是懵圈之后,就什么都没了。这就好比一个主动跳入坑里的人,很难再拉下一个人主动入坑。其实准确点来说,都感觉开源离自身太远。从学生角度来思考,学好文化课,在课余时间参加活动、比赛之类的,赚学分,才是本职工作。至于开源,第一是不了解(不直接和自己的利益挂钩),第二是技术层面达不到。可以发现github上面的顶级项目几乎大多数都不适合学生来做,而且更多的是面向求职者或者说是已经工作了的,这样一来,即使有一腔热血,但是也被挡在门外。(回头想想自己,能想到把blog部署到github上,这样一来,几乎就和github捆绑在一起了,也就是这样能有更多的机会接触更多的项目。)带着这样的问题,我就在思考如何才能让身边的人参与开源,其实参与开源也不一定是技术层面,是不是?? -是的,参与开源的方式有很多,并非一定是要通过技术层面。想想当时的Wuhan2020项目,并非所有的人都是程序员,但是每个人都可以凭借着自己的一腔热血贡献出属于自己的那一份力,这是开源的力量。再想到之前在ALC-Beijing学习到的理念:community大于代码。加上之前给APISIX项目提交修改文档的pr,自己提交的第一份pr被合并的喜悦感是无可替代的。于是结合自己周围的环境以及所经历的事情,就一边学习一边探索。还好不算太差,前不久在学校的实验室里遇见了一位小伙伴,也成功拉入坑。用他的话说:“以后我是要开货车的,然后再搞搞开源多舒服啊!” 这样一想,是啊,国内真正能为开源项目提交代码的人确实有限,但是每个人都能了解到开源文化,开源协作是未来每个人都会接触到的,只不过这次疫情的爆发,把这个远程办公的缺口给暴露出来,而开源协作的方式不是刚好可以封上它吗??就像姜宁老师所说的:“让更多的人了解,参与开源 ,应该是我们布道的目的吧!” -COSCon‘20 期盼已久的开源年会终于来了,尤其是今年年会的主题——“开源向善“ 。这可能也是我接触到开源的初衷。当时去之前,就在脑子里构想了很多有关开源的问题,在自身深入了解开源之后,总感觉没有自己想的那么简单,说大点可以是一种哲学,甚至是一种信仰。这是开源带给我最直观的感受。 -年会现场,也可谓是大型的网友见面会,虽然每个人都不一样,学着不同的专业、不同的城市、不同的年龄段,但是却都可以在彼此身上找到各自的影子,有时候有些事确实挺奇妙的。在第二天,无论是和庄表伟老师的聊天学习,还是和王伟老师的沟通交流,都刷新了我对于开源的认识,就好像是打破之前的定义,更深入的思考,对,这次是思考,不再是了解。如果说皓月姐姐是我接触开源的引路人,这大概就是遇见了自己的伯乐。 -可能是因为王伟老师就是做开源教育的,和他交流能够更深入探讨或者说思考自己在布道开源时所遇见的问题,记得我当时提到作为大学生,但是不能被学生的身份所限制,应该想到“出圈”,只有在一定程度上做到出圈,才能够从更高的维度来审视自身所处的状态和环境,这样才能更好的找到适合自己的路,从而才能走的更远。而王伟老师所说的作为学生不能被“分”给限制住,更多应该是培养自身的能力。这些思想上擦出的火花,都不约而同的交叉在一起了。由此可想,我们在布道开源的时候,是不是也应该要有跳出圈内人的思维,这样才能更好地推广下去。还记得,当时和王老师提到,从学生角度来说,参与开源的门槛是不是有点高,那么我们反过来想,如果我们做一个贴合学生的项目,尽量做到人人都可以参与的项目,这样一来,不就是可以让想参与开源的同学参加进来了嘛??带着这样的思考,我在年会上又找到另外的一位小伙伴,愿意一起来尝试。通过这次年会,给我最大的感受,这不仅仅是一次技术上的交流,更是一场思想碰撞的盛宴,也可以说在这里的我们都是同一类人!!! -我想把这次参会体验比喻成读一本好书,这里的每个人都是书中的一份子,可能过了一段时间已经记不清书中的内容,但是对于精神上的沉淀是无法抹去的,是由内而外的提升。天下没有不散的宴席,虽然很不舍,但是离别是必然的,愿下次再遇见,那个时候的自己更优秀。ASF如何准备董事会会议https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/Wed, 21 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/ASF旗下有三百多个项目,董事会只有9个成员,每个项目一个季度就会向董事会发送一次报告,而每个月召开一次董事会会议。 ASF每次董事会,需要处理70+个项目的报告,以及其他与基金会相关的事务。 ASF是如何保证在一个半小时的董事会中能够高效的处理这些报告的? -简单的说ASF为了提高效率,提前让各个项目PMC准备报告,并且开发了一套专门的IT系统whimsy来处理和追踪与董事会议相关的内容。 -本文翻译至 https://www.apache.org/foundation/board/meeting -董事会使用各种工具,并依靠Apache项目的志愿者来确保每月的会议顺利进行。这是一份关于每个月度董事会会议的经典时间表和流程的详细指南。 -我们的“PMC汇报指南”列出了一个项目的季度董事会上进行汇报的内容以及如何提交报告。请注意,执行干事和非项目公司干事(如副总裁、Infra;副总裁、法律等)每月向总裁或董事会提交报告。 -董事会会议采用电话会议(辅以IRC)的形式,通常持续1个半小时左右。会议按照提前公示出来的议程举行,由主席或相关主席团成员主持讨论。董事会会议欢迎每一位Apache的成员和PMC主席随时参加。 -谁应该做什么 董事会负责监督包括所有Apache项目在内的整个ASF的运作。我们通过让负责公司运营的人员提交月度报告,以及每个Apache项目提交关于各自社区和技术状态的季度报告来进行督察。 -运营人员每月向总裁提供一份关于其业务领域(如品牌、媒体、法律、基础设施等)的报告,然后由总裁向董事会提交关于ASF日常运营的汇总报告。 一些董事会成员和其他公司副总裁直接向董事会提供月度报告。 每个Apache项目的PMC成员协作提供项目的季度报告。PMC主席同时也是ASF的副总裁,负责确保报告真正提交到董事会议程。 在董事会会议期间,主席主持会议,秘书作记录并点名,要求出席或投票。董事会可对各种报告发表意见或提出问题;正式问题由秘书在会议结束后通过私人电子邮件向相关官员或PMC提出。 秘书还负责发布经批准的董事会会议记录(通常是下个月)。 常务董事会会议时间表 前一个月的会议中 在每月例会后不久,秘书将会议记录草稿提交董事会,供董事会审查和批准。然后,主席将会议期间采纳的正式行动的“ASF董事会会议摘要”概述发送给所有Apache项目提交人。秘书长对报告发表评论,并欢迎新的运营人员——详情见下文“休会”章节。 -前一个月的会议后 在上个月的会议之后几天,下一个月(当前)会议的议程将被整理好并放入代码库。董事会议程和会议记录都保存在格式化文本文件中。这允许高级用户通过命令行进行编辑,但也允许使用“Whimsy Agenda Tool”议程工具(需要Apache账号登录)更方便地查看议程。 -然后向所有PMC发出下次会议报告的截止日期的提醒。考虑到Apache PMC的分布在全球且和完全自愿参与的性质,提前提醒(和后续跟进)是很有帮助的。项目通常提前三周到几小时(如果董事们没有时间审查,报告可能不会被接受)之间的任何地方通过邮件列表和检查 Whimsy)向董事会提交报告。 -Apache孵化器有一个特殊的提醒过程。因为孵化器中的每个被孵化的项目(Podling)都会提供自己的季度报告,所以他们会得到自己的提醒。孵化器PMC随后审查并汇总相关的Podling季度报告,允许Podling导师签字或添加其他评论,然后每月向董事会提交一份总体报告。 -会议前的一周 每个月,董事会被随机指派为当月报告的一组PMC报告的牧羊人(负责审查报告),他将特别关注PMC的报告内容,检查并确保它们按时出现在议程中,并帮助将董事会的任何意见反馈给PMC。这有助于大家分工协作,以确保所有70多个项目的报告都被提交,并有一个总监确保反馈在之后得到处理。 -许多PMC报告都在会议前一周列入议程,因此一些总监将开始审查议程和预先批准报告,或对报告提出意见/问题。如果一位总监对一份具体的报告有顾虑,他们会在会议议程中“标记”该报告,以便在会议期间进行讨论。这时,总监通常会再次检查PMC是否确实提交了完整的报告。如果项目报告提交的晚了,会直接给PMC发电子邮件提醒。 -董事会希望不晚于会议前48小时敲定议程,尽管有时我们确实有迟交报告的情况。在会议召开前2-3天,大多数董事会审查整个议程,预先批准或在议程中对所有提交的报告发表评论。 PMC主席可以通过议程工具对任何主管的问题提供任何简短的答案或附加信息来加快会议进程。 -由于所有活动(报告提交、批准、评论)都是通过使用SVN存储库来完成的,所以Apache成员和PMC主席可以在提交消息中查看会议准备进度。 -董事会当天 会议当天,主席按顺序把议程安排了一遍。在点名之后,执行官通常会口头回顾他们报告的要点。 -然后,我们使用预批准系统来加快每月审查70多份PMC报告的过程。任何PMC报告,如果大多数董事预先批准,且没有董事标记该报告的问题,则将获得普遍同意。这使得会议能够花时间讨论那些在会议之前没有经过董事的全面审查或有重要问题或任何董事已经标记的报告。负责人主导关于他们特别标记的报告的讨论,帮助主席专注于整个会议。 -然后,我们逐步讨论议程的其余部分,就特别指示和决议进行表决,然后有时就新问题举行讨论会,或审查先前报告中提出的更深层次的问题。 -休会/董事会结束后 会议休会后不久,我们将通知社区: -主席将会议要点的简要概述发送给我们的提交者。 -这份概述会记录任何未被接受的PMC报告,以及已批准的任何特殊指示的状态(通常是负责人任命或新项目),这些指示立即生效。 -秘书直接将总监对每个PMC报告的意见和评论通过私人邮箱发送给相应的PMC,并抄送董事会。这确保PMC在委员会有任何问题时得到直接和立即的反馈。在大多数情况下,这些都是关于项目的简单问题,因此董事会希望PMC可以直接回复确认或回复反馈邮件至board@邮件列表。 -如果存在需要跟进的严重问题,董事会将指派一名总监直接与PMC合作,以确保PMC理解这些问题,并且PMC开始采取行动解决问题(无论是总监还是其他自愿的牧羊人)。董事会希望在下个月的会议上或在PMC下一次正常的季度报告中听取这些行动的结果。 -董事会工具 随着Apache Whimsy 项目的创建,我们现在有了许多帮助创建和管理议程的工具,以及用于提交、评论和批准报告的工作流功能,以及对当前议程和过去几分钟前的议程有方便的分类视图。 -虽然大多数Whimsy的特性仅限于Apache提交者(而且大部分功能还限于Apache 会员、官员,甚至特别官员),但过去董事会会议纪要分类列表是公开的。这使得任何人都可以方便地按日期、PMC或重大特别决议回顾所有过去的董事会会议。请注意,这只是为了方便起见,此数据的官方/规范版本包含在我们所有过去董事会会议正式纪要中。 -如何发布一个项目或官员报告 参见PMC主席的详细董事会报告指南。 -如何参加会议 欢迎Apache成员和PMC主席参加。请将您自己列入议程,告知董事会您将出席: -导航到whimsy(需要Apache登录) -点击 Roll Call(点名)按钮增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/引言 最近的一次数据统计: -序号 项目名称 进入孵化器时间 毕业时间 ppmc/pmc人数 commiter人数(包含ppmc/pmc) 1 Kylin 2014年11月 2015年11月 23 39 2 Eagle 2015年10月 2016年12月 16 18 3 HAWQ 2015年9月 2018年8月 45 68 4 CarbonData 2016年6月 2017年4月 13 25 5 RocketMQ 2016年11月 2017年9月 13 26 6 Griffin 2016年12月 2018年11月 18 20 7 Weex 2016年11月 14 26 8 ServiceComb 2017年11月 2018年10月 20 23 9 SkyWalking 2017年12月 2019年4月 27 37 10 Dubbo 2018年2月 2019年5月 17 55 11 ECharts 2018年1月 13 19 12 Doris 2018年7月 13 17 13 brpc 2018年11月 9 9 14 IoTDB 2018年11月 2020.文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/引言 开源发展至今,来自community 的力量是无法忽视的,甚至有的观点认为,开源的核心就是开源community。我们在上篇: -增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇) 介绍 在Apache孵化项目的过程,需要做什么,以及如何避免走弯路,并给出了完美的实践。Apache SkyWalking的 VP 吴晟先生在 ApacheCon 2020 的Keynote分享上,明确的指出了摆在本土面前重要的障碍之一就是:共同体建设,如何吸引来自全球的开发者,不仅在语言上,更多在文化上有非常大的挑战。 -在COSCon‘2020 + Apache 中国路演的论坛上,我们看看有哪些关于开源共同体方面的建设的分享: -Apache Way 正确把握Apache 之道,从来不是一件容易的事,因为它从来也不是事无巨细的规则,而是一种哲学思想、一种向导指南,除了日常的融入已有的Apache项目进行感受之外,还要听听哪些前辈们对此如何解读: -Apache recently celebrated our 20-year anniversary as a software foundation. Our mission is to provide software for the public good, available at 100% no charge.#The Foundation now oversees over 300 projects with over 7,900 committers from more than 100 countries, and more than half a million contributors over the years, with nearly 40,000 this year alone.追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/引言 没有什么好说的,从分布式系统到调度器,再到可观察性,以及数据可视化,当然还有消息队列,大数据处理、IoT。 -让更多的人知道项目,才可能从这些人中转化为用户,用户中可能筛选出贡献者,进而形成良性循环,这大概是所有开源项目的期望。 -以下技术内容,因为缺少对比,仅仅在此给大家罗列出来目前在本土所分享的关于技术议题,没有逻辑、没有分类、没有主线,唯一的相似之处就是这些项目是捐赠给了Apache软件基金会,以Apache之道的方式在运作,技术水平如何,解决了用户什么问题,请详细阅读。或者来COSCon的现场聆听。 -项目在生产环境中的落地 本次分享首先会介绍DolphinScheduler社区的发展情况,然后会介绍我们当时为何要重复造轮子再造大数据任务调度,DolphinScheduler整体的设计思想、考量以及DolphinScheduler的特性和能力,接下来会介绍DolphinScheduler架构的变迁过程。#在此次分享中我也会讲述我们在做大数据任务调度时遇到的挑战和积累下来的经验,也会分享一些用户案例和使用场景,最后会分享一下开源的历程 -此次分享主要介绍Apache Skywalking 在小米信息技术部的应用,包括并且不限于Apache Skywalking 在小米新零售、商城、门店等10多个业务的应用以及整体部署架构(中国大陆、俄罗斯、新加坡等机房部署)、在小米如何处理每日新增数亿trace segment以及相关优化配置、Apache Skywalking 告警模块如何跟小米内部告警平台打通等二次开发内容、小米对Apache Skywalking 开源社区的一点贡献。 -作为Apache顶级项目的ShardingSphere,将会在最新发布版本中迈向从分布式数据库中间件生态圈到分布式数据库的转型。#已在GitHub上收获12k+ Star的开源人气项目将进一步根据用户需求和应用场景,在这个数据库化的过程中全力打造更为简单、丰富、一体化、可插拔的分布式数据库产品体系,从而为用户提供最简单易用、功能强大、性能稳定的分布式数据库化产品。本次分享将为详细阐述数据库化的产品特性、架构体系、极简落地方案实践等核心内容。 -自从2017年成为国内首个中间件Apache开源顶级项目以来,Apache RocketMQ 以高性能、低延迟和高可靠的消息发布与订阅服务成为各厂商业务消息的首选。进入云原生时代,Apache RocketMQ也在悄然成为云原生时代的通信基础设施。本次演讲将结合Apache RocketMQ开源历程,介绍在云原生时代 RocketMQ核心竞争力、最新的技术进展、开源社区生态以及未来展望。 -Apache Kylin 4.0 Alpha版本日前已经发布,它是Apache Kylin 4的第一个早期预览版本,是继Kylin 3之后的一个重大架构升级版本,采用Parquet这种真正的列式存储来代替HBase存储,提升文件扫描性能;同时重新实现了基于Spark的构建引擎和查询引擎,使得计算和存储分离变为可能,更加适应云原生的技术趋势。本次演讲嘉宾张智超将从架构升级,原理讲解,重大特性等几个方面来介绍Apache Kylin 4.0。 -Apache Doris(Incubating)是一款支持对海量数据进行快速分析的 MPP 数据库。Doris 自设计之初,就秉承着极简运维、高效可靠、易学易用的原则,为用户提供全面而高效的海量数据分析能力。自 2018 年底进入 Apache 孵化器后,Doris 已经发布了 5 个大版本,接收了来自社区 100 多位开发者的贡献,并在多家互联网头部企业和垂直领域企业落地和应用。本次演讲主要包含 Doris 的发展历程、系统架构、主要特性和应用案例四个部分,帮助听众对 Doris 有一个全面而具象的认识。最后,陈明雨会介绍 Doris 社区目前的发展情况,希望能够帮助开发者更方便快捷的加入开源社区。 -定制化Operator模式在面向Kubernetes的云化平台建构中变得越来越流行。Apache SkyWalking社区已经开始尝试使用Operator模式去构建基于Kubernetes平台的PaaS云组件。本次分享给将会给听众带来该项目的初衷,实现与未来演进等相关内容。分享的内容包含:#1. 项目动机与设计理念#2. 核心功能展示,包含SkyWalking核心组件的发布,更新与维护。#3. 观测ServiceMesh,包含于Istio的自动集成。#4. 目前的工作进展和对未来的规划。 -ElasticJob 在 2015 年首次面世,经历多年的开源历程,于 2020年5月28日 正式成为 Apache ShardingSphere 旗下子项目。#ElasticJob 是一款服务于任务分片的分布式调度中间件,在加入 Apache 软件基金会之后,它的设计理念,整体架构和功能都进一步的完善和升级,并且已经发布了第一个 Apache 版本 - 3.正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/引言 视频地址:https://www.youtube.com/watch?v=26aFGdbZvac&amp;t=1172s ,需要稳定的网络环境。 -正文 (以下内容根据吴晟的演讲视频进行的人工文字录入,若有出入,请以原视频为准。) -Rich Bowen 介绍了吴晟的出场:Apache SkyWalking VP -大家好!欢迎来到今年的ApacheCon@Home,我加入ASF也有四年的时间了,在过去的四年中我参与和见证了很多的Apache 项目,也为很多项目做了应有的贡献,今天非常荣幸的能够在ApacheCon上和大家分享我的经验,我的分享主题是:成长中的中国本土 Apache,在正式开始之前,我还是介绍一下我本人吧: -Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member. Speak at multiple conferences, including LC3 China twice, QCon Beijing (star speaker) three times.ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/内容梗概 软件以其飞速的发展,经过60年的发展,再也没有一个人能够写出来可以使用的软件了,尤其是以自由/开源软件项目的壮大为证,更是让人的协作提上了前所未有的高度。 这也就是说,作为软件的设计者,或者说开源的软件设计者,开始的时候应不应该考虑人与人之间的协作?甚至是以全球视野的想象力来介入,即跨时区的异步沟通为切入点? 那么我们不妨以Apache 软件基金会下众多的项目为例,甚至是以更广泛的开源项目为例,如Linux、Kubernetes等,探讨下关于康威定律是否适用? 架构和开源共同体(Community)究竟有没有关系?如果有的话,二者该如何理解?关系又该如何处理? -ALC Beijing 这次邀请到了Apache ShardingSphere 的核心团队成员来谈谈、聊聊。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 02:00 本次嘉宾的自我介绍 02:10 ~~ 10:50 (Apache ShardingSphere )模块化为什么重要?如何做模块化? 给项目带来了哪些变化。 11:00 ~~ 16:00 架构的演进,所带来的组织上的一些变化。 16:30 ~~ 20:40 高内聚,低耦合的实现。 21:00 ~~ 23:00 CHAOSS 项目介绍,对项目和community之间的关系量化 23:30 ~~ 27:50 (Apache ShardingSphere )community 的成员变化,以及对新版本发布后的期望 28:00 ~~ 31:00 community 的自主性如何?是否具备提交新特性的能力? 31:10 ~~ 34:00 关于项目的工程:持续集成、持续交付等 34:30 ~~ 38:00 Apache ShardingSphere community 的构成。 38:10 ~~ 41:00 一个初入community如何成长为核心成员 41:20 ~~ 44:00 技术架构的选择对于community建设是非常关键的选择 45:00 ~~ 52:00 参与community成员得到的益处~ 52:10 ~~ 54:00 引入下一期如何在Apache发版 请收听 ALC Beijing Podcast Episode #4: 康威定律在开源项目中的应用Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/Fri, 25 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/Apache 官方全球大会在线会议目前共有 170+ 场演讲议题,并有来自 DataStax, IBM, Imply, Instaclustr, NASA 喷气推进实验室, 橡树岭国家实验室, Red Hat, Tetrate, Two Sigma 与 VMWare 等公司或组织的众多大咖做主题分享。 -2020 年 9 月 21日, Apache® 软件基金会(ASF),携超过 350 个开源项目的全体志愿开发者、管理员和孵化器,与主题演讲嘉宾、大会赞助商和 ApacheCon@Home 大会组委,郑重宣布:ApacheCon@Home 在线会议将于 2020 年 9月 29 日 - 10 月 1 日召开。本次大会全员免费注册。 -Apache 软件基金会大会副总裁 Rich Bowen 表示“我们很高兴推出 ApacheCon@Home,我们聚焦于我们社区的健康福祉,所以将今年 ApacheCon 和其他 Apache 线下面对面活动转移到线上进行是个很简单的决定,改为线上活动后人人都可以在家参与。本次大会话题多样精彩纷呈,共有 10 个主题分享、24 个论坛、170+ 场演讲,也期待全球各地的观众都能观看。” -ApacheCon 是 Apache 软件基金会官方的全球系列大会,1998 年成功举办第一届。ApacheCon 吸引了 130 多个国家和地区的观众一起畅享「明日技术」,且不掺杂商业利益、公司偏见或销售推销。 -ApacheCon 集中展示众多 Apache 项目的最新进展,相关内容皆由 Apache 项目及所在社区精心呈现。各水平的参与者都能全方位、多层次地了解 Apache 项目创新与进展,比如:年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/Wed, 16 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/简介 ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯1998年,也是在这一届上,开发HTTPD服务的开发者们欢聚一堂,并决定成立 Apache 软件基金会。 -1998年首次ApacheCon大会照片 -[photo attribution (CC BY) Mark Cox. Tagged image at https://www.flickr.com/photos/iamamoose/63963722/in/album-1381277/ ; gallery at https://www.flickr.com/photos/iamamoose/albums/1381277] -ApacheCon由Apache软件基金会举办,现在是每年举办一次,一般在欧洲或北美举行,是Apache开发者们线下交流、讨论、见面的绝佳机会,也是分享想法、思想激荡的难得的场合。随着计算机技术的发展,ApacheCon每年的议题也在不断的增多,尤其是火热的大数据,干脆分离出来独立开启会议。 -ApacheCon 大会官网:https://apachecon.com/acah2020/index.html。 -2020是特殊的一年,尽管对于Apache的整体开发来说没有什么影响,但是线下交流是无法实现了,毕竟病毒仍在肆虐,只好像其它的大型会议一样,今年选择了在线上举办,线上举办的好处就是加大了更多可能性,比如支持多语言的分论坛,要知道讲中文的议题还是在ApacheCon上头一次出现。如此的机会怎能错过? -从9月29日到10月1日,会议共持续3天。官方议程已公布,可前往官网查看议题详情。同时,大会免费开放注册,可在Hopin平台报名。 -《ApacheCon @Home 2020: Keynote 》 《Apache Growth in China》 《Apache 在中国的成长》 分享时间:2020 年 9 月 29 日,星期二,下午 5:00(北京时间) -议题简介:在 Apache 基金会 2020 财年报告中,中国是 Apache 软件下载量最大的国家。越来越多的中国创建的开源项目加入 Apache 孵化器,和毕业成顶级项目。吴晟从 2017 年加入 Apache 社区,在这 3 年时间里,他见证了开源文化和 Apache Way 在中国的接受程度逐年提高。越来越多的开发者加入 Apache 社区,成为贡献者、Committer,甚至基金会正式成员。中国企业不再仅仅使用开源项目,也越来越关注对开源项目的贡献和参与。在这个 KeyNote 中,他将分享中国拥抱 Apache 文化和共建 Apache 社区的进展。ApacheCon 2020 参会指南https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/Tue, 15 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/每年一度的 Apache北美大会因为疫情的原因转到线上来举行了, 这次会议的主题是ApacheCon@Home, 也就是说借助网络我们可以足不出户就可以参加Apache大会了。 今年的会议为了针对不同的地域特点,特地安排了不同时间段的演讲,同时还专门增加了中文的演讲,欢迎大家关注。 -下面今年ApacheCon的参会指南译自 https://apachecon.com/acah2020/guide.html,祝大家参会愉快! -前期准备 为了您在ApacheCon@Home可以得到最好的体验,我们为你准备了以下清单,这样参会者就可以提前准备。 请提前浏览以下的技术要求和参会前可以准备的事项,这样就不需要在会议的过程中进行任何准备了。 -注册 请确认你已经在 ApacheConf @Home at Hopin 完成注册,如果你在右上角看到一条消息写着“You‘re in” 说明注册成功,借此机会可以点击“Add to calendar”将会议时间加入到日历。 -点击注册链接 ApacheConf @Home at Hopin -选择一个ticket,点击下方蓝色按钮checkout。(官网标注:General Admission即注册为免费,但如果你愿意帮助和支持活动可以选择Donation Ticket进行捐款) 此时页面会跳转到注册页,请填写您的名(First name),姓(Last name),邮箱地址(Email address)和设定一个密码(Password)。勾选下方的条款与隐私协议,点击蓝色按钮sign up即可。 检查是否注册成功 看到页面上有“You‘re in!”的提示则注册成功 或在右上角的个人信息中找到Events,点击进入看到如下页面,同样意味着注册成功 网络速度 请尝试接入到至少 5Mbit/s 下载速度和2Mbit/s 上传速度的网络。下载速度和上传速度越高越能够提供一个更好的体验,30Mbit/s 的下载速度和10Mbit/s 上传速度是最理想的。尝试限制其他可能占用网速的访问客户,比如:提前一天将软件更新完成,避免软件在会议中运行,暂停或停止所有大型下载项目,如果需要可以断开其他设备的网络连接。推荐用网线进行网络连接。可以用一个在线网站进行网络速度检查,搜索 Internet speed test。 -浏览器 Hopin 支持 Google Chrome (推荐) 和 Mozilla Firefox (备选),其他浏览器均不支持。请确认您的浏览器是最新版本,按照浏览器说明 Chrome 或 Firefox 进行操作。到底什么是The Apache Way?https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/Sun, 30 Aug 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/到底什么是The Apache Way? 作者:谭中意 审核:姜宁 李健盛 我们有可能听到过很多次“The Apache Way”。可能会在某个Apache基金会项目的分享会上,它宣称它的日常工作遵循“The Apache Way”;也有可能在某个InnerSource的分享会上,宣称内部开源就是在企业内部推行“The Apache Way”;也有可能在Apache基金会的报告上或者文档上,看到apache基金会的治理遵循“The Apache Way”。那么“The Apache Way”究竟是什么?我们如何来应用它? -我们先看一看Apache开源基金会对此的解释。从它的官网 https://www.apache.org/theapacheway 能看到“The Apache Way”内涵很丰富,即使是Apache基金会的成员们,对什么是“The Apache Way”有很多种解释。 -刷新这个页面,随机摘抄几种解释如下: -“THE APACHE WAY TO ME…” &ldquo;open, sharing, global team work&rdquo;** -—Jason Zhong, 10 year user of Apache Kylin, Hadoop, contributor to Apache Kylin Apache kylin的一个贡献者说它是一种开放/共享/国际团队合作的精神。 -&ldquo;Guide lines or Bible&rdquo; -—Koji, 18 year user of Apache Lucene, Solr, OpeNLP, Mahout, Spark, Commons, contributor to Apache Solr 一位18年Apache的用户说它是指南甚至是圣经。Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/内容梗概 你是如何去发现一件事情的价值的?又如何挖掘其意义的?知识该如何传播?文化该如何习得?Apache 之道作为哲学思想,甚至都找不到一条具体如何去做的规定,又怎么能指导他人了呢? -本期ALC Beijing Podcast ,三位常驻主持人,和大家聊一聊这款播客节目的基调、准则、做事方式,以及一个不那么正式的一个承诺:我们希望以这样的方式,生产高质量的知识,供有缘人学以致用!重要的是听众你的反馈和参与,才是赋予我们节目的真正活力!我们不期望是说我们想说的,而是希望能提供听众想听的。 -时间线 00:10 ~~ 01:10 本期播客的由来 -01:15 ~~ 02:40 三位主持人的自我介绍。(此处有猛料!) -02:50 ~~ 07:40 ALC Beijing 为什么要做Podcast? 和开发者、工程师等聊天能聊出啥? -08:00 ~~ 14:40 Podcast的受众是谁?谁会关注ALC Beijing 这样的关注开源隐性知识的内容? -15:00 ~~ 17:30 ALC Beijing Podcast 会呈现什么样的内容给大家了呢? 反馈就是礼物,听众的反馈至关重要。 -18:30 ~~ 24:00 和听众互动起来,才是最好的内容生产!再次呼吁大家,参与到我们的节目中来。 -24:40 ~~ 32:00 如何做才能吸引到更多的听众? 打造短视频类的及时娱乐的?还是走精心制作的深度内容? 这是个问题。 -33:00 ~~ 33:50 欢迎来“踢馆”! 我们在这里等你! -请收听 ALC Beijing Podcast Episode #0:Say Hello World! -本期嘉宾: ALC BeiJing Podcast 三位常驻主持 潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/主持人 潘娟: -江湖人尊称为“娟神”,京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Membe。才艺俱佳! -Hold 全场! -暖场嘉宾 姜宁 华为开源软件中心技术专家,前红帽软件首席软件工程师,Apache软件基金会成员,Apache软件基金孵化器导师,参与了绝大多个中国发起的Apache基金会项目的孵化。本人06年开始加入到Apache社区项目开发,就被社区开放协作的氛围深深吸引,成为开源深度信徒。现在致力于开源社区建设,以及开源文化推广,尽其所能帮助国内开源项目成功。 -主题分享嘉宾1 李钰 Apache Flink 社区 PMC 成员, Apache HBase 社区 PMC 成员, ALC-beijing 成员, 阿里巴巴高级技术专家 -李钰将为我们带来的分享是:&laquo;Flink中文社区的发展与挑战&raquo;,会从如下几个视角切入: -Apache Flink 简介 Apache Flink 中文社区从零开始面临的挑战、困难和经验 Apache Flink中文社区取得的成果和发展计划 主题分享嘉宾2 郭炜 中国软件行业协会智能应用服务分会副主任委员,全球中小企业创业联合会副会长,TGO鲲鹏会 北京分会会长,虎啸十年 杰出数字技术人物,Apache Dolphin Scheduler PPMC,ClickHouse 华人社区发起人 -分享的主题是: 会从多个视角来看待开源: -开源的初心 几个失败开源项目的案例 优秀开源项目的特性 如何申请进入Apache基金会 开源不是一时兴起,而是一辈子的事情 开源不是天才的甜点,而是勤奋者的盛宴 圆桌嘉宾 1 上面介绍过的暖场大神,ALC Beijing的发起者:姜宁ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/内容梗概 来自Apache DolphinScheduler (孵化中)项目的李岗,年轻、对开源充满激情和憧憬,这次参与到ALC Beijing来,也是灌注了满满的热爱和斗志!本次采访将为大家展现一下这位用青春赌上开源梦想之路的大男孩。 -时间线 01:00 ~~ 01:20 李岗自我介绍 -01:20 ~~ 03:10 是如何接触到开源的,然后工作后自然而然的选择开源。感到非常幸运的是参与Apache的项目。 -03:30 ~~ 04:10 从上学到工作,中间所经历的开源共同体的经历。 -04:15 ~~ 09:00 Apache 文化中的个人与公司的见解,自己在经历成长的过程中遇到了那些坑。 -09:10 ~~ 11:10 参与开源对于自己个人的改变 -11:20 ~~ 13: 20 从开源Community中如何获得“荣誉” -13:30 ~~ 16:10 Apache 带给个人的社会认可 -17:00 ~~ 21:00 是什么样的动力?或者是在没有明确的直接的报酬的情况下,是如何在周末和工作之外的时间做开源? -21:10 ~~ 25:10 Apache local Community Beijing 是如何理解的。 -25:20 ~~ 26:00 DS项目中的Peer Review是如何实现的。 -26:40 ~~ 28:00 DS为什么选择Apache 软件基金会。 -28:00 ~~ 33:00 DS 在发展过程中克服了那些困难。如何进入Apache 孵化器、许可协议、沟通模式。 -33:00 ~~ 35 :30 微信在开发中遇到的障碍。Apache基金会项目孵化过程中知识产权转移的讨论https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Apache软件基金会项目孵化过程中知识产权转移的讨论 作者:张伟玲 谭中意 审核:姜宁 张亮 作者简介: 张伟玲,多年大型互联网知识产权法律经验,擅长商标、开源、著作权等知识产权法律领域的合规制度建设、 培训和诉讼支持,在互联网信息网络传播/合规/品牌等领域有丰富实战经验。 -讨论背景: 自2002年Apache Software Foundation(ASF)开始孵化项目以来,ASF至今已经毕业了200多个顶级项目。在这些项目中,无论是个人捐赠还是企业捐赠的,都必须严格遵守其孵化流程和政策要求。尤其是近几年来,越来越多的国人发起的开源项目进入Apache基金会孵化,并有不断的项目毕业,Apache开源基金会在国内的影响力越来越大。而它作为一个国际范围内host项目最多的开源基金会,它的各种政策和流程也越来越为更多人熟悉。 -而其中最重要的一个流程&mdash;项目孵化,在知识产权方面也有很独特的政策。那么,作为项目所有者的您,在面对这些政策和可能会遇到各种文件时,是否有过困惑“我签署了什么?项目的知识产权还是我的吗?或者说我还剩些什么权利呢?…”,为了解决这些困惑,本文会对您可能遇到的问题进行初步讨论分析,当然本人是从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结,也有些认识不到位的地方,请多多讨论,有问题可跟本人微信号weiweizhang0410讨论,thanks -先说结论: 总的来说,捐献项目给Apache基金会,Apache基金会需要您的“版权授权 + 专利授权 + 商标转让”。 -知识产权即人们常说的IP(Intellectual Property),跟开源软件相关的主要有如下三项:版权(即Copyright),专利(即Patent),商标(即Trademark )。根据Apache基金会的IP政策,个人或者公司捐献项目给它,该项目的专利和版权必须授权给它,商标必须要转让给它。 -即它既要商标的所有权(owner),又要专利的使用授权,还要版权的使用授权。 -具体解释: 开源项目要进入Apache基金会进行孵化,原有版权所有人必须要签署如下两个文件,一个是SGA(Software Grant Agreement),另外一个是CCLA/ICLA(公司或者个人贡献协议ICLA: Individual Contributor License Agreement,CCLA: Corporate Contributor License Agreement)。我们一起来看看这两个文件的内容。 -先看看SGA(Software Grant Agreement),以下是协议原文信息: 下面我们来仔细看下这篇文档的重点部分。 -“WHEREAS, Licensor owns or has sufficient rights to contribute the software source code and other related intellectual property as itemized on Exhibit A (&ldquo;Software&rdquo;) under the terms of this agreement to the Foundation for use within Foundation software development projects (&ldquo;Projects&rdquo;). Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/引言 本周我们推出了 Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版),为了能够让更多的习惯于文字阅读的成员们熟悉我们的故事,特别推出了全文实录的文字版,请笑纳! -Apache APISIX 或 APISIX 在下文中均指称:Apache APISIX。 -正文 适兕主持人: -Hello,大家好,欢迎来到ALC 北京 PodCast。这次我们请到的是 APISIX 的核心成员,请各位嘉宾跟我们听众打个招呼。 -温铭: -大家好,我是温铭,Apache APISIX的PPMC成员。我之前是在互联网公司工作了有10年,主要是在做安全方向,然后最近三年都是在做开源软件的商业化,也就是说我最近三年是全职做开源项目,非常庆幸今天有机会和大家一起聊聊 Apache APISIX,以及APISIX背后的一些故事。 -王院生: -大家好,我是王院生,我算是年纪比较大的一位了,05年毕业之后做了近10年的传统金融行业,在(20)14年之后进入互联网。在那一年认识了温铭,也开始做一些非常有意思的事情,从(20)15年开始做比较多的开源方面的事情,确实在做的过程中,开源、(过程很)开心让我是比较享受的。最近两三年也在尝试做一些开源方向的创业,正好跟大家一起来聊一聊我们在创业过程中的一些收获。 -姜宁: -我叫姜宁,熟悉ALC Beijing Podcast 应该比较了解,我好像每次活动我都会在场,今天很高兴能跟同学们一起来聊聊,有关孵化以及后面创业商业化相关的一些事情。 -适兕主持人: -我们先从项目开始,目前来说, APISIX,它是什么样的状态?花简单几分钟时间介绍一下这个项目是干什么的。 -温铭: -Ok,我先来大概说一下APISIX是干什么的。简单的来说 Apache APISIX它是一个API网关,它可以帮你来处理南北向以及东西向的流量。如果不太熟悉网关的同学,就可以把APISIX简单的认为和Nginx做的是同样的事儿,只不过 Nginx是靠静态的配置文件来驱动的,你修改了任何配置的话,都是要reload服务才能生效的。 但是在APISIX里面,我们一直在强调的,它是一个动态的实时的这样的一个网关。你所有的修改包括路由、证书、以及这种限流限速以及插件的各种配置,它全都是动态的。 你可以非常容易的去修改它的内容,而不用去重载它的服务。简单来说它就可以帮你动态的管理流量。 APISIX 现在的状态, 它是在去年10月份的时候进入了Apache孵化器,到现在我们有7个多月的时间,我们发布了6个Apache release,差不多是每个月会发布1个 apache 的 release,在进入Apache之前我们只有20多个contributor,到现在我们82 个contributor, 20多个 committer, 所以我们的发展速度还是比较快的。不管是从社区的发布版本,以及我们吸收更多的贡献者,和我们对贡献者一些快速的认可,我觉得我们这方面速度都是比较快的。 -王院生: -我简单补充一点,在APISIX 之前其实也有一些API 网关,因为 API 网关实际上是一个非常成熟,并且是被大家了解了很久的一个概念的存在。是在2000年之前就在普及的一个概念,我们当时之所以要开发网关类产品并捐赠给 Apache, 是因为我们发现已有的网关并不适合云原生,结构也比较臃肿复杂、弹性伸缩支持不好,性能上也不能满足现在 IoT、5G微服务等低延迟、高并发的要求。基于以上考虑我们希望能做一个真正是社区化的,如Apache这样的组织,能够持久的做大家都需要的产品,所以我们发起了 APISIX 这个项目,我们当时发起这个项目的目标,要把它的性能、扩展性等方面做到一个极致。这是我们一开始的目标,现在来看我们距离这个目标越来越近。而且对 Apache 的文化也有了进一步的认识,尤其是多样性、多元化,是非常契合我们当时的愿景的。我们 PPMC 里面除了少数几位我们公司的,其余都是来自各个不同公司的,将近有20多家公司都在参与,这还只是committer部分,如果算上contributor的话,还有更多的人参与。Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/内容梗概 Apache APISIX 在2019年10月份进入了 Apache 软件基金会孵化器,到现在(采访期2020年六月)有7个多月的时间,就做了多达 6 次的 release 发布,也就是说差不多是每个月就会发布1个release,在进入Apache之前,APISIX 只有20多位contributor,截止到现在,已经拥有了80多位committer,在如此之短的时间内,Apache APISIX 是如何做到的?是什么样的魔力,让Apache APISIX 项目、团队、Community 有这么快的加速发展了呢? -请仔细聆听,两位创始人和一位导师的精彩分享。 -时间线 时间区间 妙语连珠 00:30 ~~ 02:23 嘉宾自我介绍 02:24 ~~ 05:45 Apache APISIX 是什么? 05:48 ~~ 10:40 过去的开源相关经验(基金会、项目、Community)等对Apache 的孵化作用。 12:10 ~~ 15:00 开源共同体的身份,是否能够让开发者在所在公司加权? 15:10 ~~ 19:20 开源Community 最佳实践:抱怨也是爱! 19:30 ~~ 24:05 中文汉字与国际化的考量 24:20 ~~ 33:30 进入Apache 软件基金会孵化的一点提示 :创始人退一步,引进更多的committer 33:39 ~~ 42:37 线下活动对于项目的帮助非常之大,和上下游合作伙伴合作效果更佳 42:50 ~~ 48:15 还是有一些用户愿意付费的,就看你能否识别出来 48:20 ~~ 52:40 关于国内建立基金会与参与Apache 软件基金会之间的差别 52:50 ~~ 57:45 APISIX 将如何看待开源的 Supply Chain?未来怎么做 57:50 ~~ 60:00 总结:开源是提升开发者自我的最佳方式 请收听 ALC Beijing Podcast Episode #3: Apache APISIX的孵化故事越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/引言 2020年过去了一半了,这半年过的猝不及防,过的胆战心惊,让所有人都明白自身的脆弱。开源亦无幸免,尽管在远程协作上,开源有着由来已久的擅长,但是疫情仍然阻止了开源人最为重要的活动—— 线下见面会。 -我们所有人,依然要坚强的抵抗这次疫情,作为开源的一份子,能做到就是继续倡导合作的重要性,即使无法见面,我们可以通过互联网来实现沟通、协作,正如开源世界一直以来都在做的这样。而且要充分的利用互联网的全球性、世界性、跨地域的特性。当然,众所周知,全球性的沟通面临更多的问题:时区、即时、语言、文化等等。 -就Apache 软件基金会而言,作为一家慈善的非营利组织,20多年来一如既往的推动着基于来自全球各地的开发者共同协作,当然有可能会在地域色彩特别的地方会遇到一些障碍,比如在中国本土遇到的异步沟通问题。即使是这样,在中国本土仍然有勇敢而坚定的先行者们,他们不仅以身作则,突破了很多障碍,而且还顺利的晋升为 Apache 软件基金会的成员,更加重要的是他们在自身已经全球化之后,要将本土的后来者也带上,但是首先要做的是本土化。 -嗯,这就是 Apache local Community Beijing 成员们,以下是他们的个人介绍和承诺! -视频 时间线 时间 出场人物 00:00 ~~ 00:10 不容错过的Apache logo 片头 00:11 ~~ 01:23 开源重度爱好者姜宁 01:24 ~~ 02:50 开源玩家吴晟 02:51 ~~ 03:37 陈亮 03:38 ~~ 05:11 至凡至简 的 孙金城 05:12 ~~ 05:52 张亮 05:53 ~~ 06:52 潘娟,娟神 06:53 ~~ 07:41 李钰 07:42 ~~ 08:40 黄向东,清华大学 08:41 ~~ 10:00 李岗 10:01 ~~ 11:24 温铭 11:25 ~~ 12:26 布道师适兕 精彩语录 在 ALC Beijing ,你可以结识到Apache的开源大牛、了解 Apache 项目的最新进展,更有机会参与到实际的开发当中,全方位的提高自身的水平与能力。Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 01:00 ~~ 06:30 本次参与嘉宾的个人自述,各有精彩! -07:00 ~~ 10:00 灵魂拷问:在座的 ShardingSphere 成员是如何凝聚(bonding)在一起的,发起人张亮不正经回答。 -10:00 ~~ 13:00 Zhyee 的结识、加入分享,强调开源协作的重要 -13:21 ~~ 17:20 董宗磊和 ShardingSphere 的缘分,由于Apache 而更加紧密 -17:30 ~~ 17:50 姜宁表达新的感悟: 开源community 更是一个知识共享的平台 -21:30 ~~ 29:30 ShardingSphere 成长的几个阶段 -30:00 ~~ 36:15 娟神:女性既是优势,也是压力! 从“自我”到“心中有Ta”的转变! -37:10 ~~ 40: 00 另一位女性开发者颜志一 既是 ShardingSphere 的成长之旅,也是开源的晋级之旅。 -卖个关子,下期讲:ShardingSphere 的开源初心是什么?是什么样的力量驱动着Ta们走到今天? -请收听 ALC Beijing Podcast Episode #2:Apache ShardingSphere开发者们的欢乐与刺激(上)Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 00:00 ~~ 02:00 张亮谈开源初心, 开源让技术更为优雅、极致,开源的组织让我们走的更远! -02:10 ~~ 08:30 金卫个人的开源历程,全职做开源梦想成真! -12:00 ~~ 14:30 ShardingSphere 从个人项目到 Apache TLP 中间发生了哪些关键的跃迁?从技术模块扩展到共同体(Community)多样性 -15:00 ~~ 18:00 模块化架构的重构来龙去脉 -18:40 ~~ 19:00 好的软件是用出来的,不是设计出来的 -19:10 ~~ 23:30 共同体的变化, 从个人主义到 Apache 之道 -24:00 ~~ 25:00 Apache 孵化器的导师绝对“奥利给” -28: 00 ~~ 29:30 姜宁在参与导师当中的经历,对Apache 的重新认知,尤其是共同体的强调! -29:40 ~~ 31:00 张亮对开发者参与开源的职业生涯影响: 中国有很多优秀的开发者! -32:30 ~~ 33:00 吴晟分享在共同体中处理冲突, 开源项目在世界这个更大的舞台【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ALC Beijing 引言 2020年,对于世界上所有的人都是一场灾难,在刚刚开完的两会,国家希望通过地摊经济来复苏中华大地的经济繁荣,当然这在日常的小商品、食物等方面还可以,那么信息经济下,过去一直都在一个屋檐下工作的人,突然变成了在线会议的方式,一定会出现一定不适应,甚至会出现效率低下。这个时候,最应该考虑的就是开源的协作模式!当然,ASF 以其独特的完全虚拟享誉全球!值得学习的地方实在是太多了。 -前序 我(Marvin Humphrey)是在2005年”抵达“ ASF (Apache 软件基金会的简称,下同) 的,起因是我对 Apache Lucene 的一个Bug有了严重的不满情绪,之所以使用“抵达”这个词汇,就像是我找到了某种归属,因为自从那时发起了第一封邮件之后,在接下来的15年里,我发送了数以万计的邮件,可想而知我在ASF花了多长时间,这几乎是我的第二个家。由于 ASF 一直以来都没有实际的“物理”办公室,所以也就免去了很多现实中的麻烦,比如是否穿戴得体、肢体语言是否合规等等,其实就那个Bug 来讲,我当时不满的原因是:Doug Cutting (Hadoop创始人 ——译者注),当时还是Lucene 项目的贡献者,认为他非常没有耐心。 -让我们回到本文的主题上了,因为Apache 这20多年来没有实际的办公室,大家均是基于互联网这个虚拟的线上共同体而工作在一起,所以新冠病毒发生以来,其实对于 Apache 的成员和贡献者们的影响是微乎其微的,尽管对于每位贡献者的个人生活上是确确实实受到了影响,但是就ASF的整体而言,并没有出现什么不适应之类的。 -但是 ASF 之外仍然有很多的人,他们未必有这样的一套机制和习惯,世界各地的人们都在为抗争疫情而努力,尤其是“社交距离”的约定,原有的公司章程等均可为此而进行修订,另外让人痛心不已的是,有些人根本都没有机会来进行改变,直接破产倒闭,人已经失业了。 -然而,决定改变的人们遭遇到了一些窘境,是将大量的工作采用了远程的方式来做,但是进展缓慢;突然而至的远程工作,人们措手不及。那么我们是不是可以如此的积极思考了呢?加快并简化向远程协作的过渡,那么可以节省不少的精力,并可以提高效率。这里可能需要加上一点创造力,面对疫情之下的“新常态”,是可以做到比原来更加高效的,而且也不需要花多久就可以适应。 -请问你是开源贡献者吗?如果是的话,那么贡献你,你已经具备了当前全球复杂经济面前的急需的远程工作的能力和知识,接下来就让我们来聊聊我们所知道的以及或许可以帮助到你的一些内容。 -互联网将人们变成了“怪物” 在互联网,人们彼此的交流大多是通过对着电脑屏幕敲打键盘完成的,这区别于我们现实中面对面的语言交流。作为社会性的人类,我们可以通过他人的面部表情、语气、肢体语言等反馈来对自己进行相应的校准,并作出适当的反应。当时,当所有的沟通和交流都通过击打键盘来完成的时候,就没有了面对面那种反馈机制,这对于人来说是及其难以适应的事情,往往会产生一些不好的效果,尤其是带有情绪的词汇。 -那么,过往一直以来都是在办公室交流的人们,突然转移到了Slack、电子邮件、以及其它以文本的方式交流的方式和渠道,有一定的不适应是较为正常的,但是通过文本来进行沟通是有难度的,需要训练自身的同理心来获得提升,个人建议去观看“Jimmy Kimmel Show” 当中的“名人阅读Tweets”节目, 可以有效提升自己对于一些词语的敏感度。 -世界是动态演变的,只要开源共同体仍然有存在的意义,那么它就必须在每一天都要和这些不便进行斗争。随着时间的流逝,“阴谋”的人身攻击由于其潜在的腐蚀作用而逐渐成为禁忌。这就成就了我们在文化上的共识:应该去评判那些想法,而不是人本身。 -随着越来越多的共同体采用“行为准则”,辩护变得越来越正式和复杂。这些明文的文档,主要目的是防止骚扰,以及其它严重的不当行为,这些文档通常包含有关共同体成员应如何彼此相待的颇为理想的建议,因为在鱼龙混杂的环境下特别容易产生一些严重的不当行为。 -无论如何,各位看官,你自身所在的组织是否采用了行为准则,自觉的提高职员们对来自网络的攻击性的警觉意识,是上佳选择。基于此之上,职员们才能有效的识别言辞,设身处地的为他人着想,从而使每个人都能够采用更具建设性的沟通方式。 -知会大家 不过话说回来了,即使是在同一个办公室内,人与人之间的协调依然是件充满挑战的事情。当然,在远程这样的形势中,协调的难度更是加大了不少,需要付出更多的精力,这个时候最需要建立的就是公开透明的“知会大家”文化,否则,团队将变得碎片化,每个人也将变得孤立。 -在ASF,这样的情形可谓是极端化了,因为 Apache 的在线共同体遍布全球各个角落。由于牵扯到的时区实在过多,一般情况下是无法召集到全部的利益相关者在一起开会的,即使是在线视频会议也难以成行,另外,还有一个因素,那就是不是所有的贡献者都是专门针对 apache 项目进行的,大多时候是业余时间进行的。 -面对面,视频聊天,电话,文本聊天等“同步”通信渠道非常适合快速启动迭代和提炼想法,但实际上却将任何不实时关注的人排除在外。即使捕获了对话(例如通过AV录制的实时会议或记录的文本聊天),它的效率也很低,并且常常使事后回顾事情的发展变得混乱。 -面对如此的情形,ASF 采用的策略就是所有有实际意义的项目都需要在 单个、异步沟通渠道中进行。 -这个频道必须要严肃对待起来,从而能够让所有的参与者都信任该频道,即使是人们没有来得及观看和参与所有的消息,但是重要的内容不会被错过。 沟通渠道必须是异步的,从而确保一些资源受限的参与者的权益。 另外,关于同步的活动是可以在此频道之外进行的,再强调一点,同步有其自身的优点,同步的沟通对于迭代想法非常的有效,但是,身处共同体的人还是希望此类的会议能够被记录摘要,并将之发布到刚才提到的沟通渠道,从而使得所有的利益相关者有机会发表各自的看法。 -在 ASF,这个严肃而正式的异步通信渠道就是邮件列表,但这不代表什么,其它也有非常好的工具:对于某些非技术性的任务,可以是 Asana ,也可以是 Wiki,甚至是一个电子表格,都是可以的。过度追求技术上是没有太多意义的,最为关键的仍然是亮点:1)正式 2)异步。 -做出决策 在办公室,决策者可以通过获得各种各样的信息:如通过不经意的偷听、一起吃工作午餐、即兴的协作等等,然而在不期而至的远程工作中,这些渠道统统不复存在,只有经过人们深思熟虑的信息,是唯一的决策依据。 -但是,一个正式的异步通信渠道在某种程度上可以对这样的情形进行一定的补偿,这样的方式有效的提高了透明度,所有的工作及其进度、成员的合作状态,都是一目了然的,即使哪怕是工作是独立完成的,也是众人皆知的。而恰恰是通过正确的使用异步沟通渠道获得信息,而不是混乱而冗长的实时的信息交换,这样就可以有一个从高处观看的视角来洞察整个全局的情况,另外,正式的沟通渠道还有一个至为重要的能力,那就是可以衡量大家达成的共识,还保持所有的记录。 -懒人共识法(Lazy consensus)是一种蛮有效率的确认方式,例如某位成员将提案发布出来,如果在某个时间范围内(ASF为72小时)没有异议,则该提案被认为是隐式同意的。通过对沟通渠道进行积极的监督,将那些有缺陷的提案标记出来,懒人共识法 是鼓励积极主动者颇为强大的工具,这也是远程参与者非常宝贵的个人品质。英雄之旅-行走在开源领域的一个自叙故事https://alc-beijing.github.io/alc-site/post/heros_journey_trista/Sun, 24 May 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/heros_journey_trista/作者介绍 潘娟,京东数科高级DBA&amp;Apache ShardingSphere PMC,主要负责京东数科分布式数据库开发、数据库运维自动化平台开发等工作。曾负责京东数科数据库自动化平台设计与开发,现专注于Apache ShardingSphere分布式数据库中间件平台的开发。主要在分布式数据库、开源、分布式架构等相关领域进行探索。多次受邀参加数据库&amp;架构领域的相关会议并进行分享交流。 -前序 《英雄之旅》是由美国神话学家约瑟夫·坎贝尔提出的。好莱坞很多经典IP巨作即是把《英雄之旅》的套路搬上了巨幕。 -最近在读一些心理学书籍,随即发现我们每个人的一生都是一场英雄之旅。从被使命召唤、踏上艰辛的考验之旅、接收他人恩赐、发现自我、到达胜利顶点、回归自我。然而,很多人可能一生都行走在发现自我的路上,若是有幸,则能到达顶点,回归自我。 -这篇分享以”英雄之旅“为开始,是希望把自上篇文章-程序媛成长纪:从DBA到研发工程师以来到现在的经历,提取出经验点,与所有行走在英雄之旅的朋友交流,碰撞火花。毕竟我们每个人面对工作、生活、家庭、自我都有着太多冲撞和思考,需要被他人理解和照亮。:-) -由点及面 上篇的自叙文谈到我从运维DBA转成了Java开发工程师。准确的说,应该是开源分布式数据库开发工程师。因为在过去一年半多的时间里,我更多地是在分布式数据库中间件平台、分布式事务框架、分布式治理等领域做相关的研发工作。主要从事的项目是Apache分布式数据库中间件平台Apache ShardingSphere, 和京东数科主导的分布式事务平台JDTX(未开源)。 之所以说”由点及面”,是因为工作的内容开始从最初新手关注的一个点,开始渗透到整个项目的各个领域。从最初做的metaData初始化加载模块到现在Apache ShardingSphere的11个一级模块中,有8个模块都是深耕接触过,此外还有公司内部的分布式事务平台JDTX。从这里可以看出一个新手开始逐渐变成了”老司机“。这让我突然想到之前很多人问过的一个问题— 类似像ShardingSphere这样的大型项目,参与的正确姿势是什么?有人选择通读文档,有人选择把模块间架构关系梳理清楚……不过在我看来,从一个点入手,由浅入深,由点及面是参与大型开源项目相对容易的方式。因为一上来就啃一本厚书,很容易厌倦和恐惧,停留在表面,最后兴趣被各种事情冲淡,最后不了了之。而从社区一个很小的任务入手,不仅可以渐渐熟悉项目、获得成就感,更能够积累社区的信赖感,树立自我品牌,最终一览众山小。而在这个过程中,你也会发现自己的知识、技能、人际关系都在崎岖的路上不断上升! -由深入广 这个小节用来讨论大家争执已久的一个问题:究竟是先进行深度学习,还是先进行广度学习。标准答案似乎是:同时进行。但是从实践的角度讲,我们的精力、学习阶段、难易程度等因素都会让这个做法变得不太容易进展、很耗时、短期内没有产出。每个人从事的工作阶段、内容都有所不同,自然看法各异。从我个人角度来看,我更倾向于先深度后广度,同时尽可能兼顾彼此。 -先深度,是为了帮助我们打下坚实的基础。试想一座空中楼阁,每次风吹雨打都会引发你的惊慌,又如何风轻云淡地向四周望去?正是由于有了扎实的地基,才让你觉得能够更容易理解别的高楼的建筑风格和特色,即在同一个交流层次能帮助我们快速了解他人的核心要点和提出自己的见解。在我刚入行的时候,我很不理解为什么要去听其他人的分享?我自己的一亩三分地还没有耕作完,日日新增的工作还不够我操心,我真的有时间再关注他人吗?当时,我的思想和视野都是狭窄的,我的更多精力是聚焦在了基石的打造,从GitHub提交记录可以看到我疯狂地学习和贡献,此时我没有多余的精力,也没有欲望去关注别人,于是我的视野也很有限。而当我不断熟悉了这个项目的架构与细节,这个领域的知识体系之后,突然发现我可以抽出一部分时间和精力去了解整个行业,而不仅仅是整个项目。而且此刻,我特别有欲望想看看别的楼阁是怎么搭建的、别人的项目是什么情况,我们和别人的异同在哪里。这增大我的视野,也意味着我开始转向对广度的寻求。 -其实最好的做法,还是在深耕的同时,关注广度,了解别人在做什么。这样可以有效帮助我们在世界的大地图里,知道自己在哪个位置、自己的水准如何。不过,建议是建议,实践是实践。最好的方式还是问问自己,想不想,要做不做。因为,我选择,我自由,我存在。 -由内向外 作为开源分布式数据库开发工程师,开源是赋予这个工作岗位的神奇力量。因为在开源的世界里,有开放、自由、平等、自我提升、品牌打造,也有竞争和资本的力量。这让我发现,我不是固步自封,我能感受到来自其他城市、不同国家的新鲜气息。在与同行朋友交流的过程中,你会发现这个行业的立体面,每个人不同的想法都非常有意思。当然,冲撞必不可少,成长的代价和痛苦也一定会非常给力地到位。迷茫和挣扎也一定会伴其左右,因为这就是一场典型的英雄之旅。但我在这个领域除了收获技能和知识,还收获了良师新友和分享的机会和能力。我并不想带来太多负面情绪给大家,我希望阅读文章的朋友能获得新的想法和力量。 -过去一年半走过了深圳、上海、北京、南京,参加过中国系统架构师大会、COSCON中国开源年会、OSCHINA中国开源峰会、PstgreSQL中国技术大会、全国互联网架构峰会、ITPUB在线分享等各种会议。在机场写代码,在会场交流,在深夜写PPT。而这一系列的锻炼也磨练出了我的耐心、清晰的逻辑能力、良好的口语表达、自我的认识。我记得最开始,我编写PPT和准备分享都要提前2~3周准备,每天都抽空看看,现在已经变成提前1周准备,随后临场发挥。最近几期的音频和视频分享可以在公众号ALC Beijing 和B站收听和收看,欢迎关注。 ^_^ 后序 篇幅所限,未能展开叙述。在文章最后,还是有些”鸡汤”想和大家分享。例如:与其病态地熬时间地做事情,不如多费心在身体锻炼和思考如何高效集中工作。作为过来人,觉得非常重要。此外,在你的英雄之旅中,找寻本我,释放压抑的情绪,活出自己。每一字一句,是我斟酌良久,给出的建议。因为在高节奏的生活和工作中,我逐渐发现自己人云亦云,被快餐手机消费,压抑自己的情绪,活着像个机器人,追寻所谓的“你好,我好,大家好”。 -而现在,愿我,与你都能拥有力量,在不伤害他人的前提下,释放自己的能量,成为我自己,勇敢而执着地踏上英雄之旅!Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/内容梗概 个人项目、Apache TLP、潇洒的创始人、众多的客户、多个云厂竞相支持、中国本土、APM骨灰级玩家&hellip;&hellip;.拥有众多光环的 SkyWalking ,究竟有何神奇的魔力?在短短的几年内迅猛发展,在竞争如此激烈的APM 市场,获得无数的拥泵! ALC Beijing Podcast 首秀,诚挚邀请到 Apache SkyWalking的创始人、主要的贡献者来聊聊 SkyWalking的酝酿、命名、开发、开源、建设Community、收获用户、发展壮大、进入Apache、孵化、成为TLP、下一代版本、如何维护的。我们就是来不正经地“八卦” Apache 开源项目背后故事! -SkyWalking社区拥有来自全球的,200位以上的贡献者包括30多位以上的 Committer。SkyWalking的项目用户和贡献者来自亚洲、欧洲、北美。那么,SkyWalking的社区到底是什么样子?推进社区发展和合作的原则和背后的逻辑是什么? ​—— 吴晟,潇洒的程序员 -本期亮点 ALC Beijing 介绍 SkyWalking 这么酷炫的名字是从何而来的?是星球大战迷?还是信手拈来? 一位”007“全职之余的贡献者,是如何在为SkyWalking贡献中获得个人娱乐和满足的 SkyWalking 获“友商”青睐,受邀在竞品项目的会议上分享 .Net 探针的相爱相亲记 SkyWalking 受到各大云厂商的支持和追捧 SkyWalking 是如何获得一位同类项目开发者的赏识,放弃原有代码,转而全力加入SkyWalking的 创始人兼VP兜底自己的Merge “摸鱼”行为 主要的维护者打算什么时候离开项目,彻底交出控制权? 下一个版本,竟然还不知道开发什么功能?(ÒωÓױ)! 请收听 ALC Beijing Podcast Episode #1: Apache SkyWalking 精彩开源故事 -出场嘉宾 潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。 -姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,有十五年以上企业级开源中间件开发经验,有丰富的 Java 开发和使用经验,函数式编程爱好者。从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,先后参与 Apache CXF, Apache Camel,Apache ServiceMix,以及Apache ServiceComb的开发。2015年开始担任Apache 孵化器导师,参与孵化了 Apache Rocket, Apache Skywalking, Apache ShardingSphere, Apache iotDB, Apache Doris, Apache APISIX, Apache Weex。ALC Beijing 志愿者招募https://alc-beijing.github.io/alc-site/post/call_for_volunteer/Tue, 21 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/call_for_volunteer/Open source is changing the world. And if you want to be a part -of that change, all you have to do is participate. Jason Hibbets《 the foundation of an open source city》 -什么是 ALC? ALC是Apache Local Community的缩写,是全世界范围的 Apache 开源爱好者本地群组。 因为是本地组织,ALC 是按照城市或地区的方式进行划分的,类似的机构还有 GDG (Google Developer Group), Facebook Developer Circles, Mozilla Reps 等。 任何 Apache 开源爱好者都可以代表自己所在的城市向 ALC 提出申请创建本地的组织。 -为什么创建 ACL-Beijing? 根据 ASF 2019 年年度报告,中国已然成为Apache软件基金会项目下载量最大的地区。 然而,这个看起来脱颖而出的数据背后,却暴露出我国这片土地上几个可能让大家颇为惊讶的现状:Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/Mon, 20 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/作者介绍 -潘娟,京东数科高级DBA,Apache ShardingSphere PMC 张亮,京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目Elastic-Job作者 -前序 从Sharding-JDBC到Apache ShardingSphere; 从轻量级的分库分表中间件到完整闭环的分布式数据库中间件平台; 从2016年1月的第一行代码到现今的300K+行代码; 从寥寥无几的关注到GitHub 10K+的star; 从无人问津的社区到100+位贡献者; 从公司内部的应用类库到100+的采用公司列表; 从寻找mentor到顺利成为Apache顶级项目。 …… ShardingSphere在经历了500多天的ASF孵化器孵化,毕业成为Apache顶级项目。ASF孵化器作为进入ASF的通道,为进入ASF的项目提供Apache Way的辅导,协调孵化项目与ASF基础实施融合,帮助孵化项目发展社区,确保孵化器项目发布的软件符合ASF的软件发布规范。本文是Apache ShardingSphere核心开发团队分享的Apache孵化历程,很值得想加入ASF大家庭的新项目参考。 -项目介绍 Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景,核心功能如1-1所示。 -1-1 ShardingSphere核心功能架构图 -Apache ShardingSphere由三个子项目组成,形成一个完整的数据库解决方案,合称 J.P.S. 生态系统。 -ShardingSphere-JDBC:定位为轻量级Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。 ShardingSphere-Proxy:定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL协议的访问客户端操作数据,对DBA更加友好。 ShardingSphere-Sidecar(TODO):定位为Kubernetes的云原生数据库代理,以Sidecar的形式代理所有对数据库的访问。 通过无中心、零侵入的方案提供与数据库交互的的啮合层,即Database Mesh,又可称数据网格。 -Apache ShardingSphere的亮点主要包括: -完整的分布式数据库解决方案:提供数据分片、分布式事务、数据弹性迁移、数据库和数据治理等核心能力。 独立的SQL解析引擎:支持多SQL方言的完全独立化SQL解析引擎,能够脱离ShardingSphere独立使用。 可插拔微内核:所有的SQL方言、数据库协议和功能都能够通过SPI的可插拔方式加载或卸载,微内核甚至在未来可以运行于无任何功能的空白环境中。 Apache基金会 The most popular open source software is Apache. 这是对Apache开源软件基金最好的描述和肯定。它旨在为全世界提供优质的开源软件,同时欢迎全世界的朋友加入Apache社区贡献力量,并在这个过程中不断成长、得到肯定、共建开源社区。无论是否从事软件开发工作, 大家多少都知道它的存在和它提供的优质开源项目,可见其影响之大、之深远。此外,参与Apache开源社区,并在自己的努力下成为Apache committer,更是大多数软件开发工程师心之所向。 ShardingSphere在开源之初,就有进入Apache开源组织基金会的计划。其原因有以下几点 -Apache基金会独特的Apache way和社区建设思想会让一个开源项目更规范、更有生命力。 Apache基金会的导师制度会为一个开源社区带来优秀的指导和帮助。 Apache基金会会为其下的开源项目带来版权和商标上的法律保护。 Apache基金会在全世界范围内的影响不言而喻,若是能进入Apache基金会,则会扩大项目的影响力,使其进入世界范围的开源领域。 Apache基金会内的项目会更有机会登上世界舞台,并与其他开源项目建立友好交流,也能吸引更多贡献者加入社区。 但同样,进入Apache开源基金会的门槛可并不简单,特别对于国内的项目来说,语言和地域的障碍无疑雪上加霜。 为Apache做准备 找寻mentor是进入Apache基金的最初且最重要的一步。在了解了Apache基金会的运作方式后,我们便踏上了找寻mentor之旅。参加各种与开源相关的分享会或meetup,借此来认识Apache的member。但是,事情却并不顺利。多次的尝试,多次的接触换来的只是口头的认可。这段时间我们确实倍感压力和焦虑,甚至打算以后再说,一切随缘。 后来一个契机,我们认识了吴晟和姜宁。吴晟是Apache SkyWalking项目的VP,在开源领域有丰富的经验。他和ShardingSphere的前身Sharding-JDBC很有渊源,Sharding-JDBC项目原型也有他参与设计,因此,他最终作为ShardingSphere的PPMC一同建设社区。在参与ShardingSphere社区建设的这一年多的时间里,他又陆续担任了多个Apache孵化项目的Mentor,并在今年被选举为Apache Member;而姜宁同样是一位热心又有经验的老手,国内最资深的Apache Member之一,他是多个国内发起的Apache孵化项目的导师,有着丰富的项目孵化经验。 在与他交流的过程中,我们了解到项目孵化还需要再寻找到两位导师的支持,他也乐意帮助我们介绍导师。这终于让我们看到一些希望,他也最终成为了我们的mentor。再后来,团队VP张亮又前去上海参加HDC大会,认识了我们的另一位mentor—Craig L Russell,Craig当时是Apache的秘书长,所有的SGA、ICLA等法务文件均由他负责接收签署。在ShardingSphere孵化的过程中,Craig当选了Apache软件基金会的主席。他友善而和气,给予了我们很多有关社区规范的实用建议,也愿意助我们一臂之力;第三位mentor则是由Apache RocketMQ的核心成员冯嘉担任;最后由Roman Shaposhnik担任项目的Champion,为项目寻找导师之旅画上完美句号。 至今还记得我们当时的欣喜和激动。每个进入Apache基金会的项目,一定都有自己的故事。进入ASF孵化难这一问题是由于大家对ASF的孵化流程不了解, 同时缺少有经验的接口人(Champion)的介入引起的。 随着ALC Beijing的建立和越来越多本地开发者成为孵化器导师,我们相信这一问题能够很快得到解决。如果大家对加入ASF孵化器进行孵化感兴趣的话,欢迎大家与ALC Beijing的成员联系,在这里你可以结识到很多Apache的项目的开发者,ASF成员以及孵化器导师。为何Apache软件基金会能孵化出如此多成功的开源项目https://alc-beijing.github.io/alc-site/post/asf_incubator_process/Thu, 16 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/asf_incubator_process/ASF基金会的项目来源分为个人捐献项目和公司捐献项目。这两者在进入Apache基金会之后,并不做过多的区分。总体而言,虽然很多传奇的开源项目有个人英雄主义色彩,但也不乏有很多公司捐献的项目获得了巨大的成功(Hadoop, Spark, Kafka等)。那么问题来了,为什么ASF需要设置孵化器项目呢? -孵化器项目的必要性 ASF基金会有统一的开源治理原则与规则(被称为Apache Way, 具体请参考:https://www.apache.org/theapacheway) 来保障开源软件的质量以及开源社区的健康发展。而企业和个人捐献的项目可能五花八门,从而产生巨大的Gap。这个差距可能会包括:开发流程,基础设施支撑,社区文化,代码质量,文档质量等方面,因此需要经历孵化期来加以改进或者调整来达到基金会的基本要求。 除此之外,项目的贡献者从单一公司/个人贡献过渡到多元化的社区贡献需要一个过程。罗马不是一天建成的,让外部开发者了解开源项目的使用以及有兴趣和意愿参与进来,需要不断通过各种形式(技术会议,邮件组讨论,技术媒体文章等等)做社区推广。 最重要的是,由于捐献的项目可能会涉及到第三方的代码及知识产权,在孵化器阶段,知识产权(IP)和软件许可(License)需要进行统一的规范化,从而确保最终用户可以放心使用,不必有后顾之忧。 -了解为项目设定孵化器阶段的必要性之后,我们就很容易理解每个项目在孵化阶段需要达成的目标。 -项目在孵化阶段的目标 确保孵化器项目的组织架构以及日常运营能符合基金会统一的原则以及流程 确保捐献的项目的IP以及法律相关问题能在一个合适的时间和平台上得到关注、帮助以及充分解决 确保项目以及项目背后的社区的成长与推广符合基金会的目标 确保项目的成熟、毕业以及被基金会统一背书有统一的标准 在正式介绍孵化流程之前,笔者还想先介绍一下ASF孵化项目最重要的角色之一,就是导师(Mentor)。 -孵化器项目导师的角色与职能 Apache软件基金会所定义的导师职能如下: &ldquo;Mentors are chosen by the Sponsor to actively monitor the podling, guide the podling in the Apache Way, and report its status to the Sponsor and the Incubator PMC. All Mentors must be members of the Incubator PMC. A Mentor has the following responsibilities toward the Incubator PMC, the Sponsor, and the community of the assigned Podling.ASF公司架构和治理https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/Sat, 04 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/公司治理 总的来看,Apache软件基金会(ASF)的治理相当简单:由成员(Member)来选举董事会;董事会任命各种管理人员并创建PMCs;PMCs定期向董事会报告,大多数其他管理人员向总裁汇报,然后总裁向董事会报告。 -组织架构和职责 为了更好的管理公司,ASF建立了如下组织架构: -现有成员(Member)会定期提名和选举新成员,每年提名并选举9名董事加入董事会。 -董事会任命业务官员,并将特定政策或业务领域的责任分配给每位官员。例如,法律事务委员会副总裁负责为ASF和所有Apache项目设置法律政策,并与公司顾问进行合作。 -董事会任命执行官,包括总裁,秘书,财务总监等,他们负责ASF的特定领域运营。 -大多数官员每月直接向总裁报告,而总裁则每月向董事会报告ASF的整体运营状况。 -基础设施副总裁向总裁汇报,并对基础设施团队的运营进行宏观监督。在团队中,带薪的基础设施管理者角色有助于管理日常操作,为带薪人员确定工作优先级,并维护所有Apache项目中使用的基础服务。 -选举和任命 董事会创建并更新项目管理委员会(PMCs)。董事会只是批准孵化器的合理构建请求(毕业成为TLPs)或来自PMCs自身(添加或删除PMC成员)的请求。在每种情况下,向董事会建议进行的变更都已经由相关的PMC完成了投票。如下图所示: -项目治理 每个Apache PMC都独立管理他们的项目,以Apache的方式,遵循由所有官员为所有项目设置的一些核心原则。如下图所示: -PMC每季度直接向董事会报告一次。董事会对PMC进行监督,以确保PMC健康发展,顺利的管理社区,确保PMC遵守Apache的原则。项目的技术方向由PMC指定,董事会不对项目提供技术治理。 -每个PMC的主席都是该项目的副总裁,因此也是ASF的官员。主席的主要职责是确保项目报告全面,并提交到董事会。 -PMC对软件版本发布进行投票。PMC进行适当的发布治理,进而确保了所有的源代码版本发布都是ASF官方行为。 -PMCs为项目提名并选举新提交者(Committer)。PMCs还负责提名并投票新的PMC成员,然后PMCs向董事会汇报建议的变化。 -Apache孵化器(Incubator)是一种特殊的(I)PMC:它的工作是指导新建立的Podling社区,以帮助他们学习Apache Way。在每个Podling对他们的软件发布进行投票后,IPMC成员也对该Podling的发布过程进行监督和投票,以确保Podling逐渐成长为一个合格的Apache项目。 -根据政策,只有个人可以充当会员,提交者(Committer)或PMC成员(Member)或管理人员。这是ASF和Apache项目保持其独立性的一种方式。 -参考链接 [1] http://www.apache.org/foundation/governance/orgchartApache 软件基金会2020年度董事会成员介绍https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/Fri, 03 Apr 2020 09:59:50 +0800https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/在上周 Apache 软件基金会(下称 ASF )举行了成员会议,嗯,没错,就是一年一度的董事会选举会议,会议上以下个人成员组成了新的董事会: -Shane Curcuru (连任董事) Bertrand Delacretaz(原董事) Roy Fielding(原董事) Niclas Hedhman(新任董事) Justin Mclean(新任董事) Craig Russell (连任董事) Sam Ruby(原董事) Patricia Shanahan (新任董事) Sander Striker (原董事) 同时,ASF 要非常感谢去年的董事成员:Danny Angus、Rich Bowen、Ted Dunning、Dave Fisher、Myrle Krantz、Daniel Ruggeri、以及 Roman Shaposhnik,感谢他们卓越的服务。 -让我们再次欢迎新任的董事,以及回归的董事们! -有关 ASF 治理的概述以及ASF董事会、执行官和项目/委员会副主席的完整列表,请访问:http://apache.org/foundation/。 -更多关于 Apache 基金会的组织结构和运转方式,请移步:Apache 是如何运作的?。 -原文链接 Announcing New ASF Board of DirectorsASF年度大会程序https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/ASF年度大会程序 ASF至少每13个月举行一次年度成员大会,选举新的董事会,并对新的候选人进行投票。ASF年度会议由成员志愿者按照以下基本程序进行。 -[说明] 本篇参考[1]内容进行编写,部分措辞和语言组织略有调整,但保证内容含义的严格一致性。ASF虽然是一个非盈利组织,但是ASF是以公司化的方式进行运作的,有股东,董事会,还有执行机构,也有一些其他的雇员。本文中所提到的ASF年度大会算的是股东大会。 -目录 听众 会议机制-IRC沟通 成员候选人投票 如何计算成员投票 怎样决定如何对成员候选人进行投票 董事会投票 如何计算董事会投票 怎样决定如何对候选进行上投票 听众 本文档是ASF召开正式成员会议的概述。如果您是ASF的成员,请参阅本年度会议的 Private README.txt 以获取有相关方面的最新详细信息: /repos/private/foundation/Meetings/20200331/README.txt -会议机制-利用IRC沟通 由于我们的成员来自全球,因此成员会议在三天的时间内通过freenode的IRC举行。会议的前半部分(通常是星期二)在IRC实时聊天中举行,邀请所有成员参加。就像任何大型会议一样,轮值主席会负责根据预定的会议日程(agenda)和与会人员轮流在线交互。在会议的上半场中,我们审查来自各执行官的关于过去一年的基金会状况的报告。在上场年会无法出席的成员可以提交代理申请,以便可以将他们标记为出席。 -在会议上半场结束时,议程列出了下一届董事会的候选人,以及基金会的任何新候选人。候选人宣布后,会议将进行约46小时的休会。 -在休会期间,我们的Apache STeVe投票软件会向所有合格成员发送安全的私人电子邮件投票。投票通过电子邮件开放40多个小时,使世界各地的成员都可以方便地进行投票。所有选举计数和跟踪工作均由Apache STeVe和几位Member志愿者选举监督员执行。使用您的Apache ID登录后,在Web界面进行投票。 -在会议恢复之前(通常在星期四),投票将关闭几个小时,以使选举监督人员可以相互核对他们的票数是否一致。当会议在IRC上恢复时,主席宣布候选人名单的结果,并在会议上宣布董事会选举。会议的下半场通常要短得多,如果成员已经参加了上半场,则无需参加下半场。 -请不要等到最后一分钟进行投票:由于在会议召开前10天列出了所有董事会成员和新成员候选人,因此您有足够的时间事先研究您的选择。同时,投票过程是有监督的,监督人员来自组织的志愿者。 -会议结束后,将立即成立并宣布新董事会的任期,并由提名他们的现有成员向幸运的新成员候选人发出私人邀请。请注意,我们不会公开新当选成员(Member)的姓名,因为可能(很少)有些人不接受成为新成员的邀请。 -成员候选人投票 如何计算成员投票 要选出新成员,根据我们的章程4.1的规定,他/她必须获得在提名中进行投票的赞成票多于否决票。所有投票跟踪和记录都由Apache STeVe处理,由我们的票监督人员进行监控。投票的运行和审核过程均由ASF成员私下完成。 -对新成员候选人的投票是保密的;由于投票是针对个人的,因此投票监控器确投票结果后,便不会共享投票结果。 -怎样决定如何对成员候选人进行投票 这完全由每个ASF成员来决定。新成员候选人由现有成员提名,候选人发布说明为什么他们认为候选人会成为好的成员。提名通常需要几秒钟的时间,其中许多还包括有关候选人当选原因的个人事迹。 -由于新候选人是参与Apache项目的人员,因此许多人通过搜索邮件列表来查看候选人过去如是何参与我们的社区贡献的。使用PonyMail的存档非常容易-ASF成员可以在其中查看所有邮件列表,甚至是私人邮件列表。 -许多成员都希望从现有成员那里获得强有力的提名理由,解释说明提名人为什么会成为好的候选人。在投票之前花几秒钟仔细阅读一下成员提名文件十分重要。 -董事会投票 如何计算董事会投票额 ASF使用一次可转让投票(STV)来选举每年董事会的所有9个席位。每个候选人都单独参加;没有候选人名单。只有ASF成员才能提名人选参加董事会选举;所有候选人都已经是ASF成员。 -STV旨在帮助小规模的相关选区选举董事会成员。这种计票设计有助于使选民展示自己的实际愿望,避免过于灵活。请继续阅读有关如何使用STV的讨论,包括有关志愿者投票监控员实际上如何收集选票的详细信息。 -要记住的最重要的事情是:请按照您的偏好顺序进行投票!尽一切努力使您的#1偏好进入董事会;#1选票比其余选票更重要。如果您按字母顺序投票(某些人似乎对过去的选票进行了投票),那么您会发出强烈的信号,表示您希望董事会以Awful先生和Beastly女士之类的名字出现-可能不是您想要的。我们的Apache STeVe工具将分配给候选人的字母随机化,以尝试解决这个问题。 -选举结果使用Seek的Meek方法计算。技术细节可以查阅Apache STeVe项目代码,当然这是Apache项目。 -STV计票循环进行。每当董事会候选人获得足够的选票以当选时,该循环就会列出名字。投票首先要分配给该选票上指示的第一候选人。随着投票的进行,投票将重新分配。当确定某候选人不会当选时候,他们的选票将重新分配。当候选人当选时,他或她只带了足够的选票就足以使他当选;他们的其他选票是根据该选票上排名较低的排序发送的。 -该YouTube视频提供一个轻松活泼的介绍:Politics in the Animal Kingdom: Single Transferable Vote: or a shorter description of how second, third, etc.如何成为合格的ASF贡献者https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/阿里土话 ASF是一个开源组织,他有自身的文化,阿里是一个要活好102年的公司,其文化底蕴非凡!分享ASF之前总想或多或少的和大家分享一些阿里的味道! -给世界带来微小而美好的改变 把幸运种子种到别人身上去,你才会有幸运 Never, Never, Never Give Up(永不放弃) 没错,阿里人看到上面的三句话会倍感亲切,因为上面三句都是 “阿里土话”。虽然是阿里土话,但我认为其有放诸四海而皆准的魅力!这些话,同样适用于激发和指导你成为合格的开源贡献者!不经意间看了一眼窗外,心里开心默笑,其实阿里每个角落都充满着阿里气息: -缘 其实每个人参与社区贡献的机缘不一样,但无外乎两种: -偶发事件 - 由于参与某项工作,无选择的就参与了某个开源项目。(我就是这种,很自然的就跟着 蒋晓伟 老师踏入了Apache Flink之旅) -因爱而求 - 每个码农都有一颗想让自己的的代码被应用全球的梦想追求!这梦想的实现要依托有开源的力量,ASF可以为你提供一个逐梦的舞台~ -给个理由 也许目前的你既没有工作的需要,也没有对开源产生任何爱意❤️。但了解一件事情总没有坏处,了解参与开源的利好,也许明天你就踏上了开源之旅! -顺势而为 - 如果你是一个码农,那么参与开源是一种must to have的事情,目前开源领域形式大好,各大公司纷纷拥抱开源,比如:Google,Alibaba,Hortonworks, Tencent, Facebook等等。参与开源无疑是扩大了生存的空间。 -业界身份证 - 参与开源就是在一点一滴的描绘你的业界身份证,你的开源贡献可以公示全球,由一行代码,一句文档的贡献,到参与项目管理成为项目管理委员会(PMC)一员,到成为 ASF Member 甚至 成为董事会成员,这些就像你曾经为之努力的学士学位,硕士学位,博士学位一样为世人所认可!不夸张的说,某些情况甚至比学位证书还实用! -无国界导师 - 参与开源还有一个特别特别特别重大的利好,就是你可以在你所关注的领域在全球领域寻找到最好的导师,所谓最好,不是牛,最好是最适合!所谓“三人行,必有我师”,社区交流最初你会感觉和业界大牛无法沟通,因为他的一句话,需要分解成十句才能懵懵懂,甚至不懂!这个不是大牛原因,也不是你的原因,是大牛对你水平的了解不足导致,即使大牛了解你的水平,也很难让大牛将一句话分解成十句甚至百句话讨论你关注的问题,不是大牛不愿意,更多是我们不好意思:)。所以说,要“门当户对”找到 社区比你水平略高,同时你也能给人家一些反哺的贡献者长时间交流。开源社区有着“帮传带“”的传统, 社区导师对新人都非常友好,很多时候社区导师会通过帮助社区新人展示自己的技术能力,积累社区影响力。因此对于新人有价值的问题,导师基本上是知无不言,言无不尽。 目前ASF有7600+的Committer,就算是某一个项目,也应该有几十个Committer和数以百计的贡献者,总会遇到可以和你一起进步的小伙伴!虽不曾谋面,却已熟若亲朋! -全球性分享 - 目前ASF项目有140多个领域,参与者覆盖230个国家。如果你小有成就,想将你的知识分享给更多的人,想利用的开源知识帮助更多的人,那么无疑ASF为你提供了这样的平台!你又何尝不能成为上面“无国界导师”中的一员的导师呢! -最佳实践 - 不知 - 了解 - 有方案 - 最佳方案,开源是一个智慧的集结地,一个功能可能有几十种实现方式,这并不是一两个人或者某一个小团队能考虑到(ALL)的,然而在开源一个问题,你在考虑的同时,可能在世界的某个角落,某些角落还有其他人或团队在考虑解决方案,当大家共享方案的时候,智慧的火花将会产生!DolphinScheduler介绍https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/DolphinScheduler介绍 DolphinScheduler,简称”DS”, 中文名 “小海豚调度”(海豚聪明、人性化,又左右脑可互相换班,终生不用睡觉)。希望 DolphinScheduler 就像它的名字一样,成为一个“开箱即用”的灵活易用的调度系统。 -1概述 DAG 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。 -Apache DolphinScheduler(目前处在孵化阶段)是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 -DolphinScheduler是2019年开源的一个调度系统,在去年美国时间2019年8月29号,分布式任务调度引擎DolphinScheduler(原EasyScheduler)正式通过顶级开源组织Apache基金会的投票决议,以全票通过的优秀表现正式成为了Apache孵化器项目! -2背景 在2017年,易观在运营自己6.8Pb大小、6.02亿月活、每天近万个调度任务的大数据平台时,受到ETL复杂的依赖关系、平台易用性、可维护性及二次开发等方面掣肘,易观的技术团队渴望找到一个具有以下功能的数据调度工具: -易于使用,开发人员可以通过非常简单的拖拽操作构建ETL过程。不仅对于ETL开发人员,无法编写代码的人也可以使用此工具进行ETL操作,例如系统管理员和分析师; 解决“复杂任务依赖”问题,并且可以实时监视ETL运行状态; 支持多租户; 支持许多任务类型:Shell,MR,Spark,Flink,SQL(mysql,postgresql,hive,sparksql,clickhouse等),DataX,Sqoop,Python,Sub_Process,Procedure等; 支持HA和线性可扩展性。 易观技术团队意识到现有开源项目没有能够达到他们要求的,因此决定自行开发这个工具。他们在2017年底设计了DolphinScheduler的主要架构;2018年5月完成第一个内部使用版本,后来又迭代了几个内部版本后,系统逐渐稳定下来。 -3特点 DolphinScheduler提供了许多易于使用的功能,可加快数据ETL工作开发流程的效率。其主要特点如下: -通过拖拽以DAG 图的方式将 Task 按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态; 支持丰富的任务类型; 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill 任务等操作; 支持工作流全局参数及节点自定义参数设置; 支持集群HA,通过 Zookeeper实现 Master 集群和 Worker 集群去中心化; 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计; 支持补数,并行或串行回填数据。 4系统架构 DolphinScheduler 是从数据处理的痛点出发,其解决的问题以及优化的方向主要有以下 5 点: -可视化流程设计减轻了开发者配置工作流的复杂度,从繁琐的基础配置中解放出来,不用再靠编程来配置流程,提升开发效率; -扩展性强,在当下这样一个业务变化快、技术迭代频繁的现在,丰富的任务类型、跨语言和自定义插件机制良好的可扩展性,无疑使这款框架具备了更长的寿命和更广泛的落地场景; -支持工作流定时调度、依赖调度、手动调度、手动暂停 / 停止 / 恢复,同时支持失败重试 / 告警、从指定节点恢复失败、Kill 任务等操作 -支持集群 HA,通过 Zookeeper 实现 Master 集群和 Worker 集群的天然去中心化架构设计,使得系统的高可用性得到保证;为什么要成立 ALC (Apache Local Community) Beijing?https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/背景 当提起Apache软件基金会(Apache Software Foundation,ASF)项目时,国内大多数程序员都不会陌生。下图展示了在ASF 2019年年度报告中披露的ASF软件在全球各国家的下载量排名。 -可以看到,中国已然成为Apache软件基金会项目下载量最大的地区。然而,这个看起来脱颖而出的数据背后,却暴露出我国这片土地上几个可能让大家颇为惊讶的现状: -ASF 拥有7000+代码贡献者,然而为 ASF 项目提交贡献的本土工程师仅千人规模,不足七分之一。 ASF 项目约350个,然而由本土发起的 ASF 项目仅19个,已成为顶级项目的比例更是不足5%。 ASF 孵化器拥有导师200多个,然而活跃的中国导师不超过5位。 ASF 每年在美国、欧洲等地举办 ApacheCon ,然而迄今为止,ASF 尚未在中国举办过一次 ApacheCon。 作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者甚至成为开源项目的发起者、维护者是一个值得深思的问题。 缘起 作为发起人的姜宁,颇为忧伤的语气回忆道: -06年的时候国内参与 Apache 软基金会开发的人员很少,当时只有少数几个在外企工作的人员有机会直接参与ASF项目的开发。当时有个问题一直困扰着我,本土的软件开发人员这么多,但有多少人能够以开源项目维护人员的身份深度参与到开源项目开发中来呢? -以我的个人经历来看,加入到开源项目的开发贡献并不困难,因为开源社区会有很多热心的开发者提供指导和帮助,参与者只要保证有足够时间的投入就可以,但是在我维护 Apache Camel 的7,8年间,很少看到有国人会到项目的邮件列表里面用英文提问题,提补丁。 -我的私人邮箱接到国人最多的邮件是直接提需求找我要项目示例的邮件。期间也有国内公司的开发人员与我交流,很多人在使用ASF 项目的过程中发现开源版本不满足自己的需求,就在自己的公司的私有版本上进行了修改,大家没有意识到把问题反馈到ASF上游项目中是最优的解决方法。这里可能有缺乏直接和项目开发者交流的途径原因,也可能是大家已经习惯了拿来主义,缺乏深度参与开源项目开发的热情。 大部分的开发者只停留在使用开源项目这个层面上,没有真正参与到开源项目的全生命周期的开发过程中来。 -要改变这样的状况,需要有更多深度参与ASF项目人向大家介绍深度参与开源项目的经验,帮助更多的 ASF 项目用户从单纯的使用者转变成为开源项目的开发者。 -机会只会迟到,但永远不会缺席,过了大约十几年,终于迎来了一次真正的机会。 -自 2015年至今,ASF 已经接收19个源自中国本土的开源项目的捐赠(如下表所示),这也意味这我们有越来越多的 ASF 项目 Committer,ASF 项目 PMC 成员,或者是 ASF Member 在 Community 里是非常活跃的。这说明本土的人气已经足够, 我们可以一起做更多的事情了。 -序号 项目名称 进入孵化器时间 毕业时间 ppmc/pmc人数 commiter人数(包含ppmc/pmc) 1 Kylin 2014年11月 2015年11月 23 39 2 Eagle 2015年10月 2016年12月 16 18 3 HAWQ 2015年9月 2018年8月 45 68 4 CarbonData 2016年6月 2017年4月 13 25 5 RocketMQ 2016年11月 2017年9月 13 26 6 Griffin 2016年12月 2018年11月 18 20 7 Weex 2016年11月 14 26 8 ServiceComb 2017年11月 2018年10月 20 23 9 SkyWalking 2017年12月 2019年4月 24 34 10 Dubbo 2018年2月 2019年5月 17 55 11 ECharts 2018年1月 13 19 12 Doris 2018年7月 13 17 13 brpc 2018年11月 9 9 14 IoTDB 2018年11月 23 32 15 ShardingSphere 2018年11月 2020年5月 14 24 16 DolphinScheduler 2019年8月 13 22 17 Teaclave 2019年8月 15 15 18 APISIX 2019年10月 2020年7月 18 20 19 TubeMQ 2019年11月 20 21 在参与了几个Apache项目孵化之后 ,姜宁已然是一名国内比较有影响力的 ASF 成员 了。他于2018年和2019年在上海发起并组织过两次 ASF Committer 的 Meetup[1][2][3],希望能够帮助本土的开发者更好的理解开源、参与开源。由于时间仓促和场地有限,只邀请到华东地区的 ASF 项目开发者,并没有惠及到更多的的 ASF 项目的用户。通过这几次 Meetup, 大家发现本土开发者对于 Apache 理念和倡导的哲学并不了解。 \ No newline at end of file +ALC Beijing 博客https://alc-beijing.github.io/alc-site/Recent content on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000Rich Bowen: 无论你在创造什么,最终交付的是信任。https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/ +2023 年 CommunityOverCode Asia Rich 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。开源贡献难吗?https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/ +在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这个题目。从参会到办会的入’坑’指南https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/Mon, 25 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/CommunityOverCode Asia 2023 会议资料汇总https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/Sat, 23 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/ +本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频和会议演讲材料的访问信息。新孵化项目提案指导https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/Mon, 18 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/ +描述了进入ASF孵化器提案需要做的工作【Release】ASF 孵化项目发版常见问题https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/ +对于每个初入 ASF 的项目来说,第一次发版都会多少遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/ +在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。如何成为一名成功的学生导师https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/ +编程之夏 2020 优秀学生导师总结Apache孵化器指南表格版https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/Sat, 20 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/ +描述了进入ASF孵化过程中各个阶段需要注意的问题。Apache ServiceComb带您对话Apache大咖https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/Sat, 13 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/ +Apache专家现场解读Apache基金会及孵化器运作模式Apache 软件基金会品牌使用指南https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/Wed, 03 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/ +介绍了Apache 软件基金会品牌在使用过程中需要注意的原则问题Apache 下游项目的品牌使用原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/ +介绍了Apache下游项目的品牌使用过程中需要注意的原则问题Apache 商标使用管理原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/ +介绍了Apache商标在使用过程中需要注意的原则问题Apache 项目网站商标原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/Mon, 01 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/ +介绍了Apache项目网站商标在使用过程中需要注意的原则问题Apache孵化器指南https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/Sun, 28 Feb 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/ +描述了进入ASF孵化过程中各个阶段需要注意的问题。ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/ +本期节目中, ALC Beijing 邀请到了两位在校大学生同学来她们在开源社区中所做的非代码贡献,以及它们在社区中的成长故事。ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/ +这次 ALC Beijing 特别邀请到了在Apache ECharts PMC同学来分析Apache孵化的心路历程。从初识社区到融入社区https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/Tue, 05 Jan 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/ +Get yourself involved in the communityALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/ +这次 ALC Beijing 特别邀请到了在“点亮计划暑期2020”新晋成为Apache Committer的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程。ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。暑期 2020 活动学生(张可)心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/Sun, 20 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/ +学生(张可)参与暑期 2020 活动中 Apache SkyWalking 项目的感受与收获暑期2020活动心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/Sat, 19 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/ +参与开源项目有感ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/ +随着开源的发展,越来越多企业开始把开源的最佳实践应用到企业内部开发。今天我们就跟大家聊一下这一有趣的现象 InnerSource。我与开源的那些事儿https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/Thu, 29 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/ +一段有缘的开源经历ASF如何准备董事会会议https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/Wed, 21 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/ +ASF如何准备一个月一次的董事会增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/ +在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/Fri, 25 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/ +The Apache® Software Foundation Welcomes its Global Community Online at ApacheCon@Home年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/Wed, 16 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/ +ApacheCon 2020 Mandarin Track IntroductionApacheCon 2020 参会指南https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/Tue, 15 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/ +The creation story about ALC-Beijing到底什么是The Apache Way?https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/Sun, 30 Aug 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/ +What is the Apache Way?Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/ +Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/ +这个系列会为大家带来不一样的体验,针对ALC Beijing 成员的采访,让你了解ALC Beijing 的初心以及蓝图。Apache基金会项目孵化过程中知识产权转移的讨论https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/ +ASF项目孵化流程对知识产权授权与转移有完备的定义,本文从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结 Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/ +Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/ +Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/ +Apache 本土共同体部分成员的自我介绍,以及他们对这个组织的期望,当然了现在做的事情也非常值得说明。Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。英雄之旅-行走在开源领域的一个自叙故事https://alc-beijing.github.io/alc-site/post/heros_journey_trista/Sun, 24 May 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/heros_journey_trista/ +英雄之旅-行走在开源领域的一个自叙故事Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/ +ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。ALC Beijing 志愿者招募https://alc-beijing.github.io/alc-site/post/call_for_volunteer/Tue, 21 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/call_for_volunteer/ +ALC Beijing Call for VolunteerApache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/Mon, 20 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/ +Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路为何Apache软件基金会能孵化出如此多成功的开源项目https://alc-beijing.github.io/alc-site/post/asf_incubator_process/Thu, 16 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/asf_incubator_process/ +ASF项目孵化流程ASF公司架构和治理https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/Sat, 04 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/ +ASF公司架构和治理Apache 软件基金会2020年度董事会成员介绍https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/Fri, 03 Apr 2020 09:59:50 +0800https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/ +一年一度的基金会董事会成员选举在上周落下了帷幕,新旧成员的更替就这样更新着,在我们进一步理解 Apache 之前,我们暂时将之视为新闻即可。顺道看下有没有你认识的成员。ASF年度大会程序https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/ +ASF年度大会程序如何成为合格的ASF贡献者https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/ +如何成为合格的ASF贡献者DolphinScheduler介绍https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/ +The introduction about DolphinScheduler为什么要成立 ALC (Apache Local Community) Beijing?https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/ +The creation story about ALC-Beijing \ No newline at end of file diff --git a/js/auto-render.js b/js/auto-render.js new file mode 100644 index 00000000..052e0ebe --- /dev/null +++ b/js/auto-render.js @@ -0,0 +1,327 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("katex")); + else if(typeof define === 'function' && define.amd) + define(["katex"], factory); + else if(typeof exports === 'object') + exports["renderMathInElement"] = factory(require("katex")); + else + root["renderMathInElement"] = factory(root["katex"]); +})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__974__) { +return /******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 974: +/***/ (function(module) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__974__; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": function() { return /* binding */ auto_render; } +}); + +// EXTERNAL MODULE: external "katex" +var external_katex_ = __webpack_require__(974); +var external_katex_default = /*#__PURE__*/__webpack_require__.n(external_katex_); +;// CONCATENATED MODULE: ./contrib/auto-render/splitAtDelimiters.js +/* eslint no-constant-condition:0 */ +var findEndOfMath = function findEndOfMath(delimiter, text, startIndex) { + // Adapted from + // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx + var index = startIndex; + var braceLevel = 0; + var delimLength = delimiter.length; + + while (index < text.length) { + var character = text[index]; + + if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) { + return index; + } else if (character === "\\") { + index++; + } else if (character === "{") { + braceLevel++; + } else if (character === "}") { + braceLevel--; + } + + index++; + } + + return -1; +}; + +var escapeRegex = function escapeRegex(string) { + return string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); +}; + +var amsRegex = /^\\begin{/; + +var splitAtDelimiters = function splitAtDelimiters(text, delimiters) { + var index; + var data = []; + var regexLeft = new RegExp("(" + delimiters.map(function (x) { + return escapeRegex(x.left); + }).join("|") + ")"); + + while (true) { + index = text.search(regexLeft); + + if (index === -1) { + break; + } + + if (index > 0) { + data.push({ + type: "text", + data: text.slice(0, index) + }); + text = text.slice(index); // now text starts with delimiter + } // ... so this always succeeds: + + + var i = delimiters.findIndex(function (delim) { + return text.startsWith(delim.left); + }); + index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length); + + if (index === -1) { + break; + } + + var rawData = text.slice(0, index + delimiters[i].right.length); + var math = amsRegex.test(rawData) ? rawData : text.slice(delimiters[i].left.length, index); + data.push({ + type: "math", + data: math, + rawData: rawData, + display: delimiters[i].display + }); + text = text.slice(index + delimiters[i].right.length); + } + + if (text !== "") { + data.push({ + type: "text", + data: text + }); + } + + return data; +}; + +/* harmony default export */ var auto_render_splitAtDelimiters = (splitAtDelimiters); +;// CONCATENATED MODULE: ./contrib/auto-render/auto-render.js +/* eslint no-console:0 */ + + +/* Note: optionsCopy is mutated by this method. If it is ever exposed in the + * API, we should copy it before mutating. + */ + +var renderMathInText = function renderMathInText(text, optionsCopy) { + var data = auto_render_splitAtDelimiters(text, optionsCopy.delimiters); + + if (data.length === 1 && data[0].type === 'text') { + // There is no formula in the text. + // Let's return null which means there is no need to replace + // the current text node with a new one. + return null; + } + + var fragment = document.createDocumentFragment(); + + for (var i = 0; i < data.length; i++) { + if (data[i].type === "text") { + fragment.appendChild(document.createTextNode(data[i].data)); + } else { + var span = document.createElement("span"); + var math = data[i].data; // Override any display mode defined in the settings with that + // defined by the text itself + + optionsCopy.displayMode = data[i].display; + + try { + if (optionsCopy.preProcess) { + math = optionsCopy.preProcess(math); + } + + external_katex_default().render(math, span, optionsCopy); + } catch (e) { + if (!(e instanceof (external_katex_default()).ParseError)) { + throw e; + } + + optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e); + fragment.appendChild(document.createTextNode(data[i].rawData)); + continue; + } + + fragment.appendChild(span); + } + } + + return fragment; +}; + +var renderElem = function renderElem(elem, optionsCopy) { + for (var i = 0; i < elem.childNodes.length; i++) { + var childNode = elem.childNodes[i]; + + if (childNode.nodeType === 3) { + // Text node + var frag = renderMathInText(childNode.textContent, optionsCopy); + + if (frag) { + i += frag.childNodes.length - 1; + elem.replaceChild(frag, childNode); + } + } else if (childNode.nodeType === 1) { + (function () { + // Element node + var className = ' ' + childNode.className + ' '; + var shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(function (x) { + return className.indexOf(' ' + x + ' ') === -1; + }); + + if (shouldRender) { + renderElem(childNode, optionsCopy); + } + })(); + } // Otherwise, it's something else, and ignore it. + + } +}; + +var renderMathInElement = function renderMathInElement(elem, options) { + if (!elem) { + throw new Error("No element provided to render"); + } + + var optionsCopy = {}; // Object.assign(optionsCopy, option) + + for (var option in options) { + if (options.hasOwnProperty(option)) { + optionsCopy[option] = options[option]; + } + } // default options + + + optionsCopy.delimiters = optionsCopy.delimiters || [{ + left: "$$", + right: "$$", + display: true + }, { + left: "\\(", + right: "\\)", + display: false + }, // LaTeX uses $…$, but it ruins the display of normal `$` in text: + // {left: "$", right: "$", display: false}, + // $ must come after $$ + // Render AMS environments even if outside $$…$$ delimiters. + { + left: "\\begin{equation}", + right: "\\end{equation}", + display: true + }, { + left: "\\begin{align}", + right: "\\end{align}", + display: true + }, { + left: "\\begin{alignat}", + right: "\\end{alignat}", + display: true + }, { + left: "\\begin{gather}", + right: "\\end{gather}", + display: true + }, { + left: "\\begin{CD}", + right: "\\end{CD}", + display: true + }, { + left: "\\[", + right: "\\]", + display: true + }]; + optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code", "option"]; + optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || []; + optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different + // math elements within a single call to `renderMathInElement`. + + optionsCopy.macros = optionsCopy.macros || {}; + renderElem(elem, optionsCopy); +}; + +/* harmony default export */ var auto_render = (renderMathInElement); +}(); +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/js/dark-mode.js b/js/dark-mode.js new file mode 100644 index 00000000..acea8f80 --- /dev/null +++ b/js/dark-mode.js @@ -0,0 +1,32 @@ +const toggleSwitch = document.querySelector('i.dark-mode.icons.fas'); +var currentTheme = localStorage.getItem('theme'); + +if (currentTheme) { + document.documentElement.setAttribute('data-theme', currentTheme); + + if (currentTheme === 'dark') { + document.querySelector('i.dark-mode.icons.fas').classList.remove('fa-moon'); + document.querySelector('i.dark-mode.icons.fas').classList.add('fa-sun'); + } +} else { + currentTheme = localStorage.setItem('theme', 'light') +} + +function switchTheme() { + currentTheme = localStorage.getItem('theme'); + if (currentTheme === 'light') { + document.documentElement.setAttribute('data-theme', 'dark'); + localStorage.setItem('theme', 'dark'); + currentTheme = localStorage.getItem('theme'); + document.querySelector('i.dark-mode.icons.fas').classList.remove('fa-moon'); + document.querySelector('i.dark-mode.icons.fas').classList.add('fa-sun'); + } else { + document.documentElement.setAttribute('data-theme', 'light'); + localStorage.setItem('theme', 'light'); + currentTheme = localStorage.getItem('theme'); + document.querySelector('i.dark-mode.icons.fas').classList.remove('fa-sun'); + document.querySelector('i.dark-mode.icons.fas').classList.add('fa-moon'); + } +} + +toggleSwitch.addEventListener('click', switchTheme, false); diff --git a/js/katex.js b/js/katex.js new file mode 100644 index 00000000..5835574c --- /dev/null +++ b/js/katex.js @@ -0,0 +1,18050 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["katex"] = factory(); + else + root["katex"] = factory(); +})((typeof self !== 'undefined' ? self : this), function() { +return /******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": function() { return /* binding */ katex_webpack; } +}); + +;// CONCATENATED MODULE: ./src/ParseError.js + + +/** + * This is the ParseError class, which is the main error thrown by KaTeX + * functions when something has gone wrong. This is used to distinguish internal + * errors from errors in the expression that the user provided. + * + * If possible, a caller should provide a Token or ParseNode with information + * about where in the source string the problem occurred. + */ +var ParseError = // Error position based on passed-in Token or ParseNode. +function ParseError(message, // The error message +token) { + this.position = void 0; + var error = "KaTeX parse error: " + message; + var start; + var loc = token && token.loc; + + if (loc && loc.start <= loc.end) { + // If we have the input and a position, make the error a bit fancier + // Get the input + var input = loc.lexer.input; // Prepend some information + + start = loc.start; + var end = loc.end; + + if (start === input.length) { + error += " at end of input: "; + } else { + error += " at position " + (start + 1) + ": "; + } // Underline token in question using combining underscores + + + var underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); // Extract some context from the input and add it to the error + + var left; + + if (start > 15) { + left = "…" + input.slice(start - 15, start); + } else { + left = input.slice(0, start); + } + + var right; + + if (end + 15 < input.length) { + right = input.slice(end, end + 15) + "…"; + } else { + right = input.slice(end); + } + + error += left + underlined + right; + } // Some hackery to make ParseError a prototype of Error + // See http://stackoverflow.com/a/8460753 + + + var self = new Error(error); + self.name = "ParseError"; // $FlowFixMe + + self.__proto__ = ParseError.prototype; // $FlowFixMe + + self.position = start; + return self; +}; // $FlowFixMe More hackery + + +ParseError.prototype.__proto__ = Error.prototype; +/* harmony default export */ var src_ParseError = (ParseError); +;// CONCATENATED MODULE: ./src/utils.js +/** + * This file contains a list of utility functions which are useful in other + * files. + */ + +/** + * Return whether an element is contained in a list + */ +var contains = function contains(list, elem) { + return list.indexOf(elem) !== -1; +}; +/** + * Provide a default value if a setting is undefined + * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022. + */ + + +var deflt = function deflt(setting, defaultIfUndefined) { + return setting === undefined ? defaultIfUndefined : setting; +}; // hyphenate and escape adapted from Facebook's React under Apache 2 license + + +var uppercase = /([A-Z])/g; + +var hyphenate = function hyphenate(str) { + return str.replace(uppercase, "-$1").toLowerCase(); +}; + +var ESCAPE_LOOKUP = { + "&": "&", + ">": ">", + "<": "<", + "\"": """, + "'": "'" +}; +var ESCAPE_REGEX = /[&><"']/g; +/** + * Escapes text to prevent scripting attacks. + */ + +function utils_escape(text) { + return String(text).replace(ESCAPE_REGEX, function (match) { + return ESCAPE_LOOKUP[match]; + }); +} +/** + * Sometimes we want to pull out the innermost element of a group. In most + * cases, this will just be the group itself, but when ordgroups and colors have + * a single element, we want to pull that out. + */ + + +var getBaseElem = function getBaseElem(group) { + if (group.type === "ordgroup") { + if (group.body.length === 1) { + return getBaseElem(group.body[0]); + } else { + return group; + } + } else if (group.type === "color") { + if (group.body.length === 1) { + return getBaseElem(group.body[0]); + } else { + return group; + } + } else if (group.type === "font") { + return getBaseElem(group.body); + } else { + return group; + } +}; +/** + * TeXbook algorithms often reference "character boxes", which are simply groups + * with a single character in them. To decide if something is a character box, + * we find its innermost group, and see if it is a single character. + */ + + +var isCharacterBox = function isCharacterBox(group) { + var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters + + return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom"; +}; + +var assert = function assert(value) { + if (!value) { + throw new Error('Expected non-null, but got ' + String(value)); + } + + return value; +}; +/** + * Return the protocol of a URL, or "_relative" if the URL does not specify a + * protocol (and thus is relative). + */ + +var protocolFromUrl = function protocolFromUrl(url) { + var protocol = /^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(url); + return protocol != null ? protocol[1] : "_relative"; +}; +/* harmony default export */ var utils = ({ + contains: contains, + deflt: deflt, + escape: utils_escape, + hyphenate: hyphenate, + getBaseElem: getBaseElem, + isCharacterBox: isCharacterBox, + protocolFromUrl: protocolFromUrl +}); +;// CONCATENATED MODULE: ./src/Settings.js +/* eslint no-console:0 */ + +/** + * This is a module for storing settings passed into KaTeX. It correctly handles + * default settings. + */ + + + + +/** + * The main Settings object + * + * The current options stored are: + * - displayMode: Whether the expression should be typeset as inline math + * (false, the default), meaning that the math starts in + * \textstyle and is placed in an inline-block); or as display + * math (true), meaning that the math starts in \displaystyle + * and is placed in a block with vertical margin. + */ +var Settings = /*#__PURE__*/function () { + function Settings(options) { + this.displayMode = void 0; + this.output = void 0; + this.leqno = void 0; + this.fleqn = void 0; + this.throwOnError = void 0; + this.errorColor = void 0; + this.macros = void 0; + this.minRuleThickness = void 0; + this.colorIsTextColor = void 0; + this.strict = void 0; + this.trust = void 0; + this.maxSize = void 0; + this.maxExpand = void 0; + this.globalGroup = void 0; + // allow null options + options = options || {}; + this.displayMode = utils.deflt(options.displayMode, false); + this.output = utils.deflt(options.output, "htmlAndMathml"); + this.leqno = utils.deflt(options.leqno, false); + this.fleqn = utils.deflt(options.fleqn, false); + this.throwOnError = utils.deflt(options.throwOnError, true); + this.errorColor = utils.deflt(options.errorColor, "#cc0000"); + this.macros = options.macros || {}; + this.minRuleThickness = Math.max(0, utils.deflt(options.minRuleThickness, 0)); + this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); + this.strict = utils.deflt(options.strict, "warn"); + this.trust = utils.deflt(options.trust, false); + this.maxSize = Math.max(0, utils.deflt(options.maxSize, Infinity)); + this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); + this.globalGroup = utils.deflt(options.globalGroup, false); + } + /** + * Report nonstrict (non-LaTeX-compatible) input. + * Can safely not be called if `this.strict` is false in JavaScript. + */ + + + var _proto = Settings.prototype; + + _proto.reportNonstrict = function reportNonstrict(errorCode, errorMsg, token) { + var strict = this.strict; + + if (typeof strict === "function") { + // Allow return value of strict function to be boolean or string + // (or null/undefined, meaning no further processing). + strict = strict(errorCode, errorMsg, token); + } + + if (!strict || strict === "ignore") { + return; + } else if (strict === true || strict === "error") { + throw new src_ParseError("LaTeX-incompatible input and strict mode is set to 'error': " + (errorMsg + " [" + errorCode + "]"), token); + } else if (strict === "warn") { + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); + } else { + // won't happen in type-safe code + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); + } + } + /** + * Check whether to apply strict (LaTeX-adhering) behavior for unusual + * input (like `\\`). Unlike `nonstrict`, will not throw an error; + * instead, "error" translates to a return value of `true`, while "ignore" + * translates to a return value of `false`. May still print a warning: + * "warn" prints a warning and returns `false`. + * This is for the second category of `errorCode`s listed in the README. + */ + ; + + _proto.useStrictBehavior = function useStrictBehavior(errorCode, errorMsg, token) { + var strict = this.strict; + + if (typeof strict === "function") { + // Allow return value of strict function to be boolean or string + // (or null/undefined, meaning no further processing). + // But catch any exceptions thrown by function, treating them + // like "error". + try { + strict = strict(errorCode, errorMsg, token); + } catch (error) { + strict = "error"; + } + } + + if (!strict || strict === "ignore") { + return false; + } else if (strict === true || strict === "error") { + return true; + } else if (strict === "warn") { + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to 'warn': " + (errorMsg + " [" + errorCode + "]")); + return false; + } else { + // won't happen in type-safe code + typeof console !== "undefined" && console.warn("LaTeX-incompatible input and strict mode is set to " + ("unrecognized '" + strict + "': " + errorMsg + " [" + errorCode + "]")); + return false; + } + } + /** + * Check whether to test potentially dangerous input, and return + * `true` (trusted) or `false` (untrusted). The sole argument `context` + * should be an object with `command` field specifying the relevant LaTeX + * command (as a string starting with `\`), and any other arguments, etc. + * If `context` has a `url` field, a `protocol` field will automatically + * get added by this function (changing the specified object). + */ + ; + + _proto.isTrusted = function isTrusted(context) { + if (context.url && !context.protocol) { + context.protocol = utils.protocolFromUrl(context.url); + } + + var trust = typeof this.trust === "function" ? this.trust(context) : this.trust; + return Boolean(trust); + }; + + return Settings; +}(); + + +;// CONCATENATED MODULE: ./src/Style.js +/** + * This file contains information and classes for the various kinds of styles + * used in TeX. It provides a generic `Style` class, which holds information + * about a specific style. It then provides instances of all the different kinds + * of styles possible, and provides functions to move between them and get + * information about them. + */ + +/** + * The main style class. Contains a unique id for the style, a size (which is + * the same for cramped and uncramped version of a style), and a cramped flag. + */ +var Style = /*#__PURE__*/function () { + function Style(id, size, cramped) { + this.id = void 0; + this.size = void 0; + this.cramped = void 0; + this.id = id; + this.size = size; + this.cramped = cramped; + } + /** + * Get the style of a superscript given a base in the current style. + */ + + + var _proto = Style.prototype; + + _proto.sup = function sup() { + return styles[_sup[this.id]]; + } + /** + * Get the style of a subscript given a base in the current style. + */ + ; + + _proto.sub = function sub() { + return styles[_sub[this.id]]; + } + /** + * Get the style of a fraction numerator given the fraction in the current + * style. + */ + ; + + _proto.fracNum = function fracNum() { + return styles[_fracNum[this.id]]; + } + /** + * Get the style of a fraction denominator given the fraction in the current + * style. + */ + ; + + _proto.fracDen = function fracDen() { + return styles[_fracDen[this.id]]; + } + /** + * Get the cramped version of a style (in particular, cramping a cramped style + * doesn't change the style). + */ + ; + + _proto.cramp = function cramp() { + return styles[_cramp[this.id]]; + } + /** + * Get a text or display version of this style. + */ + ; + + _proto.text = function text() { + return styles[_text[this.id]]; + } + /** + * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle) + */ + ; + + _proto.isTight = function isTight() { + return this.size >= 2; + }; + + return Style; +}(); // Export an interface for type checking, but don't expose the implementation. +// This way, no more styles can be generated. + + +// IDs of the different styles +var D = 0; +var Dc = 1; +var T = 2; +var Tc = 3; +var S = 4; +var Sc = 5; +var SS = 6; +var SSc = 7; // Instances of the different styles + +var styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another + +var _sup = [S, Sc, S, Sc, SS, SSc, SS, SSc]; +var _sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc]; +var _fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc]; +var _fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc]; +var _cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc]; +var _text = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles. + +/* harmony default export */ var src_Style = ({ + DISPLAY: styles[D], + TEXT: styles[T], + SCRIPT: styles[S], + SCRIPTSCRIPT: styles[SS] +}); +;// CONCATENATED MODULE: ./src/unicodeScripts.js +/* + * This file defines the Unicode scripts and script families that we + * support. To add new scripts or families, just add a new entry to the + * scriptData array below. Adding scripts to the scriptData array allows + * characters from that script to appear in \text{} environments. + */ + +/** + * Each script or script family has a name and an array of blocks. + * Each block is an array of two numbers which specify the start and + * end points (inclusive) of a block of Unicode codepoints. + */ + +/** + * Unicode block data for the families of scripts we support in \text{}. + * Scripts only need to appear here if they do not have font metrics. + */ +var scriptData = [{ + // Latin characters beyond the Latin-1 characters we have metrics for. + // Needed for Czech, Hungarian and Turkish text, for example. + name: 'latin', + blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B + [0x0300, 0x036f] // Combining Diacritical marks + ] +}, { + // The Cyrillic script used by Russian and related languages. + // A Cyrillic subset used to be supported as explicitly defined + // symbols in symbols.js + name: 'cyrillic', + blocks: [[0x0400, 0x04ff]] +}, { + // Armenian + name: 'armenian', + blocks: [[0x0530, 0x058F]] +}, { + // The Brahmic scripts of South and Southeast Asia + // Devanagari (0900–097F) + // Bengali (0980–09FF) + // Gurmukhi (0A00–0A7F) + // Gujarati (0A80–0AFF) + // Oriya (0B00–0B7F) + // Tamil (0B80–0BFF) + // Telugu (0C00–0C7F) + // Kannada (0C80–0CFF) + // Malayalam (0D00–0D7F) + // Sinhala (0D80–0DFF) + // Thai (0E00–0E7F) + // Lao (0E80–0EFF) + // Tibetan (0F00–0FFF) + // Myanmar (1000–109F) + name: 'brahmic', + blocks: [[0x0900, 0x109F]] +}, { + name: 'georgian', + blocks: [[0x10A0, 0x10ff]] +}, { + // Chinese and Japanese. + // The "k" in cjk is for Korean, but we've separated Korean out + name: "cjk", + blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana + [0x4E00, 0x9FAF], // CJK ideograms + [0xFF00, 0xFF60] // Fullwidth punctuation + // TODO: add halfwidth Katakana and Romanji glyphs + ] +}, { + // Korean + name: 'hangul', + blocks: [[0xAC00, 0xD7AF]] +}]; +/** + * Given a codepoint, return the name of the script or script family + * it is from, or null if it is not part of a known block + */ + +function scriptFromCodepoint(codepoint) { + for (var i = 0; i < scriptData.length; i++) { + var script = scriptData[i]; + + for (var _i = 0; _i < script.blocks.length; _i++) { + var block = script.blocks[_i]; + + if (codepoint >= block[0] && codepoint <= block[1]) { + return script.name; + } + } + } + + return null; +} +/** + * A flattened version of all the supported blocks in a single array. + * This is an optimization to make supportedCodepoint() fast. + */ + +var allBlocks = []; +scriptData.forEach(function (s) { + return s.blocks.forEach(function (b) { + return allBlocks.push.apply(allBlocks, b); + }); +}); +/** + * Given a codepoint, return true if it falls within one of the + * scripts or script families defined above and false otherwise. + * + * Micro benchmarks shows that this is faster than + * /[\u3000-\u30FF\u4E00-\u9FAF\uFF00-\uFF60\uAC00-\uD7AF\u0900-\u109F]/.test() + * in Firefox, Chrome and Node. + */ + +function supportedCodepoint(codepoint) { + for (var i = 0; i < allBlocks.length; i += 2) { + if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) { + return true; + } + } + + return false; +} +;// CONCATENATED MODULE: ./src/svgGeometry.js +/** + * This file provides support to domTree.js and delimiter.js. + * It's a storehouse of path geometry for SVG images. + */ +// In all paths below, the viewBox-to-em scale is 1000:1. +var hLinePad = 80; // padding above a sqrt viniculum. Prevents image cropping. +// The viniculum of a \sqrt can be made thicker by a KaTeX rendering option. +// Think of variable extraViniculum as two detours in the SVG path. +// The detour begins at the lower left of the area labeled extraViniculum below. +// The detour proceeds one extraViniculum distance up and slightly to the right, +// displacing the radiused corner between surd and viniculum. The radius is +// traversed as usual, then the detour resumes. It goes right, to the end of +// the very long viniculumn, then down one extraViniculum distance, +// after which it resumes regular path geometry for the radical. + +/* viniculum + / + /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraViniculum + / █████████████████████←0.04em (40 unit) std viniculum thickness + / / + / / + / /\ + / / surd +*/ + +var sqrtMain = function sqrtMain(extraViniculum, hLinePad) { + // sqrtMain path geometry is from glyph U221A in the font KaTeX Main + return "M95," + (622 + extraViniculum + hLinePad) + "\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl" + extraViniculum / 2.075 + " -" + extraViniculum + "\nc5.3,-9.3,12,-14,20,-14\nH400000v" + (40 + extraViniculum) + "H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM" + (834 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize1 = function sqrtSize1(extraViniculum, hLinePad) { + // size1 is from glyph U221A in the font KaTeX_Size1-Regular + return "M263," + (601 + extraViniculum + hLinePad) + "c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl" + extraViniculum / 2.084 + " -" + extraViniculum + "\nc4.7,-7.3,11,-11,19,-11\nH40000v" + (40 + extraViniculum) + "H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize2 = function sqrtSize2(extraViniculum, hLinePad) { + // size2 is from glyph U221A in the font KaTeX_Size2-Regular + return "M983 " + (10 + extraViniculum + hLinePad) + "\nl" + extraViniculum / 3.13 + " -" + extraViniculum + "\nc4,-6.7,10,-10,18,-10 H400000v" + (40 + extraViniculum) + "\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize3 = function sqrtSize3(extraViniculum, hLinePad) { + // size3 is from glyph U221A in the font KaTeX_Size3-Regular + return "M424," + (2398 + extraViniculum + hLinePad) + "\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl" + extraViniculum / 4.223 + " -" + extraViniculum + "c4,-6.7,10,-10,18,-10 H400000\nv" + (40 + extraViniculum) + "H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M" + (1001 + extraViniculum) + " " + hLinePad + "\nh400000v" + (40 + extraViniculum) + "h-400000z"; +}; + +var sqrtSize4 = function sqrtSize4(extraViniculum, hLinePad) { + // size4 is from glyph U221A in the font KaTeX_Size4-Regular + return "M473," + (2713 + extraViniculum + hLinePad) + "\nc339.3,-1799.3,509.3,-2700,510,-2702 l" + extraViniculum / 5.298 + " -" + extraViniculum + "\nc3.3,-7.3,9.3,-11,18,-11 H400000v" + (40 + extraViniculum) + "H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM" + (1001 + extraViniculum) + " " + hLinePad + "h400000v" + (40 + extraViniculum) + "H1017.7z"; +}; + +var phasePath = function phasePath(y) { + var x = y / 2; // x coordinate at top of angle + + return "M400000 " + y + " H0 L" + x + " 0 l65 45 L145 " + (y - 80) + " H400000z"; +}; + +var sqrtTall = function sqrtTall(extraViniculum, hLinePad, viewBoxHeight) { + // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular + // One path edge has a variable length. It runs vertically from the viniculumn + // to a point near (14 units) the bottom of the surd. The viniculum + // is normally 40 units thick. So the length of the line in question is: + var vertSegment = viewBoxHeight - 54 - hLinePad - extraViniculum; + return "M702 " + (extraViniculum + hLinePad) + "H400000" + (40 + extraViniculum) + "\nH742v" + vertSegment + "l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 " + hLinePad + "H400000v" + (40 + extraViniculum) + "H742z"; +}; + +var sqrtPath = function sqrtPath(size, extraViniculum, viewBoxHeight) { + extraViniculum = 1000 * extraViniculum; // Convert from document ems to viewBox. + + var path = ""; + + switch (size) { + case "sqrtMain": + path = sqrtMain(extraViniculum, hLinePad); + break; + + case "sqrtSize1": + path = sqrtSize1(extraViniculum, hLinePad); + break; + + case "sqrtSize2": + path = sqrtSize2(extraViniculum, hLinePad); + break; + + case "sqrtSize3": + path = sqrtSize3(extraViniculum, hLinePad); + break; + + case "sqrtSize4": + path = sqrtSize4(extraViniculum, hLinePad); + break; + + case "sqrtTall": + path = sqrtTall(extraViniculum, hLinePad, viewBoxHeight); + } + + return path; +}; +var innerPath = function innerPath(name, height) { + // The inner part of stretchy tall delimiters + switch (name) { + case "\u239C": + return "M291 0 H417 V" + height + " H291z M291 0 H417 V" + height + " H291z"; + + case "\u2223": + return "M145 0 H188 V" + height + " H145z M145 0 H188 V" + height + " H145z"; + + case "\u2225": + return "M145 0 H188 V" + height + " H145z M145 0 H188 V" + height + " H145z" + ("M367 0 H410 V" + height + " H367z M367 0 H410 V" + height + " H367z"); + + case "\u239F": + return "M457 0 H583 V" + height + " H457z M457 0 H583 V" + height + " H457z"; + + case "\u23A2": + return "M319 0 H403 V" + height + " H319z M319 0 H403 V" + height + " H319z"; + + case "\u23A5": + return "M263 0 H347 V" + height + " H263z M263 0 H347 V" + height + " H263z"; + + case "\u23AA": + return "M384 0 H504 V" + height + " H384z M384 0 H504 V" + height + " H384z"; + + case "\u23D0": + return "M312 0 H355 V" + height + " H312z M312 0 H355 V" + height + " H312z"; + + case "\u2016": + return "M257 0 H300 V" + height + " H257z M257 0 H300 V" + height + " H257z" + ("M478 0 H521 V" + height + " H478z M478 0 H521 V" + height + " H478z"); + + default: + return ""; + } +}; +var path = { + // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main + doubleleftarrow: "M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z", + // doublerightarrow is from glyph U+21D2 in font KaTeX Main + doublerightarrow: "M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z", + // leftarrow is from glyph U+2190 in font KaTeX Main + leftarrow: "M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z", + // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular + leftbrace: "M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z", + leftbraceunder: "M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z", + // overgroup is from the MnSymbol package (public domain) + leftgroup: "M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z", + leftgroupunder: "M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z", + // Harpoons are from glyph U+21BD in font KaTeX Main + leftharpoon: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z", + leftharpoonplus: "M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z", + leftharpoondown: "M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z", + leftharpoondownplus: "M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z", + // hook is from glyph U+21A9 in font KaTeX Main + lefthook: "M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z", + leftlinesegment: "M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z", + leftmapsto: "M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z", + // tofrom is from glyph U+21C4 in font KaTeX AMS Regular + leftToFrom: "M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z", + longequal: "M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z", + midbrace: "M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z", + midbraceunder: "M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z", + oiintSize1: "M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z", + oiintSize2: "M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z", + oiiintSize1: "M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z", + oiiintSize2: "M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z", + rightarrow: "M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z", + rightbrace: "M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z", + rightbraceunder: "M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z", + rightgroup: "M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z", + rightgroupunder: "M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z", + rightharpoon: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z", + rightharpoonplus: "M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z", + rightharpoondown: "M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z", + rightharpoondownplus: "M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z", + righthook: "M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z", + rightlinesegment: "M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z", + rightToFrom: "M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z", + // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular + twoheadleftarrow: "M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z", + twoheadrightarrow: "M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z", + // tilde1 is a modified version of a glyph from the MnSymbol package + tilde1: "M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z", + // ditto tilde2, tilde3, & tilde4 + tilde2: "M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z", + tilde3: "M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z", + tilde4: "M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z", + // vec is from glyph U+20D7 in font KaTeX Main + vec: "M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z", + // widehat1 is a modified version of a glyph from the MnSymbol package + widehat1: "M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z", + // ditto widehat2, widehat3, & widehat4 + widehat2: "M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", + widehat3: "M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", + widehat4: "M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z", + // widecheck paths are all inverted versions of widehat + widecheck1: "M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z", + widecheck2: "M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", + widecheck3: "M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", + widecheck4: "M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z", + // The next ten paths support reaction arrows from the mhchem package. + // Arrows for \ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX + // baraboveleftarrow is mostly from from glyph U+2190 in font KaTeX Main + baraboveleftarrow: "M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z", + // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main + rightarrowabovebar: "M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z", + // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end. + // Ref from mhchem.sty: \rlap{\raisebox{-.22ex}{$\kern0.5em + baraboveshortleftharpoon: "M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z", + rightharpoonaboveshortbar: "M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z", + shortbaraboveleftharpoon: "M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z", + shortrightharpoonabovebar: "M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z" +}; +;// CONCATENATED MODULE: ./src/tree.js + + +/** + * This node represents a document fragment, which contains elements, but when + * placed into the DOM doesn't have any representation itself. It only contains + * children and doesn't have any DOM node properties. + */ +var DocumentFragment = /*#__PURE__*/function () { + // HtmlDomNode + // Never used; needed for satisfying interface. + function DocumentFragment(children) { + this.children = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.maxFontSize = void 0; + this.style = void 0; + this.children = children; + this.classes = []; + this.height = 0; + this.depth = 0; + this.maxFontSize = 0; + this.style = {}; + } + + var _proto = DocumentFragment.prototype; + + _proto.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + } + /** Convert the fragment into a node. */ + ; + + _proto.toNode = function toNode() { + var frag = document.createDocumentFragment(); + + for (var i = 0; i < this.children.length; i++) { + frag.appendChild(this.children[i].toNode()); + } + + return frag; + } + /** Convert the fragment into HTML markup. */ + ; + + _proto.toMarkup = function toMarkup() { + var markup = ""; // Simply concatenate the markup for the children together. + + for (var i = 0; i < this.children.length; i++) { + markup += this.children[i].toMarkup(); + } + + return markup; + } + /** + * Converts the math node into a string, similar to innerText. Applies to + * MathDomNode's only. + */ + ; + + _proto.toText = function toText() { + // To avoid this, we would subclass documentFragment separately for + // MathML, but polyfills for subclassing is expensive per PR 1469. + // $FlowFixMe: Only works for ChildType = MathDomNode. + var toText = function toText(child) { + return child.toText(); + }; + + return this.children.map(toText).join(""); + }; + + return DocumentFragment; +}(); +;// CONCATENATED MODULE: ./src/domTree.js +/** + * These objects store the data about the DOM nodes we create, as well as some + * extra data. They can then be transformed into real DOM nodes with the + * `toNode` function or HTML markup using `toMarkup`. They are useful for both + * storing extra properties on the nodes, as well as providing a way to easily + * work with the DOM. + * + * Similar functions for working with MathML nodes exist in mathMLTree.js. + * + * TODO: refactor `span` and `anchor` into common superclass when + * target environments support class inheritance + */ + + + + + +/** + * Create an HTML className based on a list of classes. In addition to joining + * with spaces, we also remove empty classes. + */ +var createClass = function createClass(classes) { + return classes.filter(function (cls) { + return cls; + }).join(" "); +}; + +var initNode = function initNode(classes, options, style) { + this.classes = classes || []; + this.attributes = {}; + this.height = 0; + this.depth = 0; + this.maxFontSize = 0; + this.style = style || {}; + + if (options) { + if (options.style.isTight()) { + this.classes.push("mtight"); + } + + var color = options.getColor(); + + if (color) { + this.style.color = color; + } + } +}; +/** + * Convert into an HTML node + */ + + +var _toNode = function toNode(tagName) { + var node = document.createElement(tagName); // Apply the class + + node.className = createClass(this.classes); // Apply inline styles + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + // $FlowFixMe Flow doesn't seem to understand span.style's type. + node.style[style] = this.style[style]; + } + } // Apply attributes + + + for (var attr in this.attributes) { + if (this.attributes.hasOwnProperty(attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } // Append the children, also as HTML nodes + + + for (var i = 0; i < this.children.length; i++) { + node.appendChild(this.children[i].toNode()); + } + + return node; +}; +/** + * Convert into an HTML markup string + */ + + +var _toMarkup = function toMarkup(tagName) { + var markup = "<" + tagName; // Add the class + + if (this.classes.length) { + markup += " class=\"" + utils.escape(createClass(this.classes)) + "\""; + } + + var styles = ""; // Add the styles, after hyphenation + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; + } + } + + if (styles) { + markup += " style=\"" + utils.escape(styles) + "\""; + } // Add the attributes + + + for (var attr in this.attributes) { + if (this.attributes.hasOwnProperty(attr)) { + markup += " " + attr + "=\"" + utils.escape(this.attributes[attr]) + "\""; + } + } + + markup += ">"; // Add the markup of the children, also as markup + + for (var i = 0; i < this.children.length; i++) { + markup += this.children[i].toMarkup(); + } + + markup += ""; + return markup; +}; // Making the type below exact with all optional fields doesn't work due to +// - https://github.com/facebook/flow/issues/4582 +// - https://github.com/facebook/flow/issues/5688 +// However, since *all* fields are optional, $Shape<> works as suggested in 5688 +// above. +// This type does not include all CSS properties. Additional properties should +// be added as needed. + + +/** + * This node represents a span node, with a className, a list of children, and + * an inline style. It also contains information about its height, depth, and + * maxFontSize. + * + * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan + * otherwise. This typesafety is important when HTML builders access a span's + * children. + */ +var Span = /*#__PURE__*/function () { + function Span(classes, children, options, style) { + this.children = void 0; + this.attributes = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.width = void 0; + this.maxFontSize = void 0; + this.style = void 0; + initNode.call(this, classes, options, style); + this.children = children || []; + } + /** + * Sets an arbitrary attribute on the span. Warning: use this wisely. Not + * all browsers support attributes the same, and having too many custom + * attributes is probably bad. + */ + + + var _proto = Span.prototype; + + _proto.setAttribute = function setAttribute(attribute, value) { + this.attributes[attribute] = value; + }; + + _proto.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + }; + + _proto.toNode = function toNode() { + return _toNode.call(this, "span"); + }; + + _proto.toMarkup = function toMarkup() { + return _toMarkup.call(this, "span"); + }; + + return Span; +}(); +/** + * This node represents an anchor () element with a hyperlink. See `span` + * for further details. + */ + +var Anchor = /*#__PURE__*/function () { + function Anchor(href, classes, children, options) { + this.children = void 0; + this.attributes = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.maxFontSize = void 0; + this.style = void 0; + initNode.call(this, classes, options); + this.children = children || []; + this.setAttribute('href', href); + } + + var _proto2 = Anchor.prototype; + + _proto2.setAttribute = function setAttribute(attribute, value) { + this.attributes[attribute] = value; + }; + + _proto2.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + }; + + _proto2.toNode = function toNode() { + return _toNode.call(this, "a"); + }; + + _proto2.toMarkup = function toMarkup() { + return _toMarkup.call(this, "a"); + }; + + return Anchor; +}(); +/** + * This node represents an image embed () element. + */ + +var Img = /*#__PURE__*/function () { + function Img(src, alt, style) { + this.src = void 0; + this.alt = void 0; + this.classes = void 0; + this.height = void 0; + this.depth = void 0; + this.maxFontSize = void 0; + this.style = void 0; + this.alt = alt; + this.src = src; + this.classes = ["mord"]; + this.style = style; + } + + var _proto3 = Img.prototype; + + _proto3.hasClass = function hasClass(className) { + return utils.contains(this.classes, className); + }; + + _proto3.toNode = function toNode() { + var node = document.createElement("img"); + node.src = this.src; + node.alt = this.alt; + node.className = "mord"; // Apply inline styles + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + // $FlowFixMe + node.style[style] = this.style[style]; + } + } + + return node; + }; + + _proto3.toMarkup = function toMarkup() { + var markup = "" + this.alt + " 0) { + span = document.createElement("span"); + span.style.marginRight = this.italic + "em"; + } + + if (this.classes.length > 0) { + span = span || document.createElement("span"); + span.className = createClass(this.classes); + } + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + span = span || document.createElement("span"); // $FlowFixMe Flow doesn't seem to understand span.style's type. + + span.style[style] = this.style[style]; + } + } + + if (span) { + span.appendChild(node); + return span; + } else { + return node; + } + } + /** + * Creates markup for a symbol node. + */ + ; + + _proto4.toMarkup = function toMarkup() { + // TODO(alpert): More duplication than I'd like from + // span.prototype.toMarkup and symbolNode.prototype.toNode... + var needsSpan = false; + var markup = " 0) { + styles += "margin-right:" + this.italic + "em;"; + } + + for (var style in this.style) { + if (this.style.hasOwnProperty(style)) { + styles += utils.hyphenate(style) + ":" + this.style[style] + ";"; + } + } + + if (styles) { + needsSpan = true; + markup += " style=\"" + utils.escape(styles) + "\""; + } + + var escaped = utils.escape(this.text); + + if (needsSpan) { + markup += ">"; + markup += escaped; + markup += ""; + return markup; + } else { + return escaped; + } + }; + + return SymbolNode; +}(); +/** + * SVG nodes are used to render stretchy wide elements. + */ + +var SvgNode = /*#__PURE__*/function () { + function SvgNode(children, attributes) { + this.children = void 0; + this.attributes = void 0; + this.children = children || []; + this.attributes = attributes || {}; + } + + var _proto5 = SvgNode.prototype; + + _proto5.toNode = function toNode() { + var svgNS = "http://www.w3.org/2000/svg"; + var node = document.createElementNS(svgNS, "svg"); // Apply attributes + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } + + for (var i = 0; i < this.children.length; i++) { + node.appendChild(this.children[i].toNode()); + } + + return node; + }; + + _proto5.toMarkup = function toMarkup() { + var markup = ""; + } else { + return ""; + } + }; + + return PathNode; +}(); +var LineNode = /*#__PURE__*/function () { + function LineNode(attributes) { + this.attributes = void 0; + this.attributes = attributes || {}; + } + + var _proto7 = LineNode.prototype; + + _proto7.toNode = function toNode() { + var svgNS = "http://www.w3.org/2000/svg"; + var node = document.createElementNS(svgNS, "line"); // Apply attributes + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } + + return node; + }; + + _proto7.toMarkup = function toMarkup() { + var markup = " but got " + String(group) + "."); + } +} +;// CONCATENATED MODULE: ./src/fontMetricsData.js +// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY. +/* harmony default export */ var fontMetricsData = ({ + "AMS-Regular": { + "32": [0, 0, 0, 0, 0.25], + "65": [0, 0.68889, 0, 0, 0.72222], + "66": [0, 0.68889, 0, 0, 0.66667], + "67": [0, 0.68889, 0, 0, 0.72222], + "68": [0, 0.68889, 0, 0, 0.72222], + "69": [0, 0.68889, 0, 0, 0.66667], + "70": [0, 0.68889, 0, 0, 0.61111], + "71": [0, 0.68889, 0, 0, 0.77778], + "72": [0, 0.68889, 0, 0, 0.77778], + "73": [0, 0.68889, 0, 0, 0.38889], + "74": [0.16667, 0.68889, 0, 0, 0.5], + "75": [0, 0.68889, 0, 0, 0.77778], + "76": [0, 0.68889, 0, 0, 0.66667], + "77": [0, 0.68889, 0, 0, 0.94445], + "78": [0, 0.68889, 0, 0, 0.72222], + "79": [0.16667, 0.68889, 0, 0, 0.77778], + "80": [0, 0.68889, 0, 0, 0.61111], + "81": [0.16667, 0.68889, 0, 0, 0.77778], + "82": [0, 0.68889, 0, 0, 0.72222], + "83": [0, 0.68889, 0, 0, 0.55556], + "84": [0, 0.68889, 0, 0, 0.66667], + "85": [0, 0.68889, 0, 0, 0.72222], + "86": [0, 0.68889, 0, 0, 0.72222], + "87": [0, 0.68889, 0, 0, 1.0], + "88": [0, 0.68889, 0, 0, 0.72222], + "89": [0, 0.68889, 0, 0, 0.72222], + "90": [0, 0.68889, 0, 0, 0.66667], + "107": [0, 0.68889, 0, 0, 0.55556], + "160": [0, 0, 0, 0, 0.25], + "165": [0, 0.675, 0.025, 0, 0.75], + "174": [0.15559, 0.69224, 0, 0, 0.94666], + "240": [0, 0.68889, 0, 0, 0.55556], + "295": [0, 0.68889, 0, 0, 0.54028], + "710": [0, 0.825, 0, 0, 2.33334], + "732": [0, 0.9, 0, 0, 2.33334], + "770": [0, 0.825, 0, 0, 2.33334], + "771": [0, 0.9, 0, 0, 2.33334], + "989": [0.08167, 0.58167, 0, 0, 0.77778], + "1008": [0, 0.43056, 0.04028, 0, 0.66667], + "8245": [0, 0.54986, 0, 0, 0.275], + "8463": [0, 0.68889, 0, 0, 0.54028], + "8487": [0, 0.68889, 0, 0, 0.72222], + "8498": [0, 0.68889, 0, 0, 0.55556], + "8502": [0, 0.68889, 0, 0, 0.66667], + "8503": [0, 0.68889, 0, 0, 0.44445], + "8504": [0, 0.68889, 0, 0, 0.66667], + "8513": [0, 0.68889, 0, 0, 0.63889], + "8592": [-0.03598, 0.46402, 0, 0, 0.5], + "8594": [-0.03598, 0.46402, 0, 0, 0.5], + "8602": [-0.13313, 0.36687, 0, 0, 1.0], + "8603": [-0.13313, 0.36687, 0, 0, 1.0], + "8606": [0.01354, 0.52239, 0, 0, 1.0], + "8608": [0.01354, 0.52239, 0, 0, 1.0], + "8610": [0.01354, 0.52239, 0, 0, 1.11111], + "8611": [0.01354, 0.52239, 0, 0, 1.11111], + "8619": [0, 0.54986, 0, 0, 1.0], + "8620": [0, 0.54986, 0, 0, 1.0], + "8621": [-0.13313, 0.37788, 0, 0, 1.38889], + "8622": [-0.13313, 0.36687, 0, 0, 1.0], + "8624": [0, 0.69224, 0, 0, 0.5], + "8625": [0, 0.69224, 0, 0, 0.5], + "8630": [0, 0.43056, 0, 0, 1.0], + "8631": [0, 0.43056, 0, 0, 1.0], + "8634": [0.08198, 0.58198, 0, 0, 0.77778], + "8635": [0.08198, 0.58198, 0, 0, 0.77778], + "8638": [0.19444, 0.69224, 0, 0, 0.41667], + "8639": [0.19444, 0.69224, 0, 0, 0.41667], + "8642": [0.19444, 0.69224, 0, 0, 0.41667], + "8643": [0.19444, 0.69224, 0, 0, 0.41667], + "8644": [0.1808, 0.675, 0, 0, 1.0], + "8646": [0.1808, 0.675, 0, 0, 1.0], + "8647": [0.1808, 0.675, 0, 0, 1.0], + "8648": [0.19444, 0.69224, 0, 0, 0.83334], + "8649": [0.1808, 0.675, 0, 0, 1.0], + "8650": [0.19444, 0.69224, 0, 0, 0.83334], + "8651": [0.01354, 0.52239, 0, 0, 1.0], + "8652": [0.01354, 0.52239, 0, 0, 1.0], + "8653": [-0.13313, 0.36687, 0, 0, 1.0], + "8654": [-0.13313, 0.36687, 0, 0, 1.0], + "8655": [-0.13313, 0.36687, 0, 0, 1.0], + "8666": [0.13667, 0.63667, 0, 0, 1.0], + "8667": [0.13667, 0.63667, 0, 0, 1.0], + "8669": [-0.13313, 0.37788, 0, 0, 1.0], + "8672": [-0.064, 0.437, 0, 0, 1.334], + "8674": [-0.064, 0.437, 0, 0, 1.334], + "8705": [0, 0.825, 0, 0, 0.5], + "8708": [0, 0.68889, 0, 0, 0.55556], + "8709": [0.08167, 0.58167, 0, 0, 0.77778], + "8717": [0, 0.43056, 0, 0, 0.42917], + "8722": [-0.03598, 0.46402, 0, 0, 0.5], + "8724": [0.08198, 0.69224, 0, 0, 0.77778], + "8726": [0.08167, 0.58167, 0, 0, 0.77778], + "8733": [0, 0.69224, 0, 0, 0.77778], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8737": [0, 0.69224, 0, 0, 0.72222], + "8738": [0.03517, 0.52239, 0, 0, 0.72222], + "8739": [0.08167, 0.58167, 0, 0, 0.22222], + "8740": [0.25142, 0.74111, 0, 0, 0.27778], + "8741": [0.08167, 0.58167, 0, 0, 0.38889], + "8742": [0.25142, 0.74111, 0, 0, 0.5], + "8756": [0, 0.69224, 0, 0, 0.66667], + "8757": [0, 0.69224, 0, 0, 0.66667], + "8764": [-0.13313, 0.36687, 0, 0, 0.77778], + "8765": [-0.13313, 0.37788, 0, 0, 0.77778], + "8769": [-0.13313, 0.36687, 0, 0, 0.77778], + "8770": [-0.03625, 0.46375, 0, 0, 0.77778], + "8774": [0.30274, 0.79383, 0, 0, 0.77778], + "8776": [-0.01688, 0.48312, 0, 0, 0.77778], + "8778": [0.08167, 0.58167, 0, 0, 0.77778], + "8782": [0.06062, 0.54986, 0, 0, 0.77778], + "8783": [0.06062, 0.54986, 0, 0, 0.77778], + "8785": [0.08198, 0.58198, 0, 0, 0.77778], + "8786": [0.08198, 0.58198, 0, 0, 0.77778], + "8787": [0.08198, 0.58198, 0, 0, 0.77778], + "8790": [0, 0.69224, 0, 0, 0.77778], + "8791": [0.22958, 0.72958, 0, 0, 0.77778], + "8796": [0.08198, 0.91667, 0, 0, 0.77778], + "8806": [0.25583, 0.75583, 0, 0, 0.77778], + "8807": [0.25583, 0.75583, 0, 0, 0.77778], + "8808": [0.25142, 0.75726, 0, 0, 0.77778], + "8809": [0.25142, 0.75726, 0, 0, 0.77778], + "8812": [0.25583, 0.75583, 0, 0, 0.5], + "8814": [0.20576, 0.70576, 0, 0, 0.77778], + "8815": [0.20576, 0.70576, 0, 0, 0.77778], + "8816": [0.30274, 0.79383, 0, 0, 0.77778], + "8817": [0.30274, 0.79383, 0, 0, 0.77778], + "8818": [0.22958, 0.72958, 0, 0, 0.77778], + "8819": [0.22958, 0.72958, 0, 0, 0.77778], + "8822": [0.1808, 0.675, 0, 0, 0.77778], + "8823": [0.1808, 0.675, 0, 0, 0.77778], + "8828": [0.13667, 0.63667, 0, 0, 0.77778], + "8829": [0.13667, 0.63667, 0, 0, 0.77778], + "8830": [0.22958, 0.72958, 0, 0, 0.77778], + "8831": [0.22958, 0.72958, 0, 0, 0.77778], + "8832": [0.20576, 0.70576, 0, 0, 0.77778], + "8833": [0.20576, 0.70576, 0, 0, 0.77778], + "8840": [0.30274, 0.79383, 0, 0, 0.77778], + "8841": [0.30274, 0.79383, 0, 0, 0.77778], + "8842": [0.13597, 0.63597, 0, 0, 0.77778], + "8843": [0.13597, 0.63597, 0, 0, 0.77778], + "8847": [0.03517, 0.54986, 0, 0, 0.77778], + "8848": [0.03517, 0.54986, 0, 0, 0.77778], + "8858": [0.08198, 0.58198, 0, 0, 0.77778], + "8859": [0.08198, 0.58198, 0, 0, 0.77778], + "8861": [0.08198, 0.58198, 0, 0, 0.77778], + "8862": [0, 0.675, 0, 0, 0.77778], + "8863": [0, 0.675, 0, 0, 0.77778], + "8864": [0, 0.675, 0, 0, 0.77778], + "8865": [0, 0.675, 0, 0, 0.77778], + "8872": [0, 0.69224, 0, 0, 0.61111], + "8873": [0, 0.69224, 0, 0, 0.72222], + "8874": [0, 0.69224, 0, 0, 0.88889], + "8876": [0, 0.68889, 0, 0, 0.61111], + "8877": [0, 0.68889, 0, 0, 0.61111], + "8878": [0, 0.68889, 0, 0, 0.72222], + "8879": [0, 0.68889, 0, 0, 0.72222], + "8882": [0.03517, 0.54986, 0, 0, 0.77778], + "8883": [0.03517, 0.54986, 0, 0, 0.77778], + "8884": [0.13667, 0.63667, 0, 0, 0.77778], + "8885": [0.13667, 0.63667, 0, 0, 0.77778], + "8888": [0, 0.54986, 0, 0, 1.11111], + "8890": [0.19444, 0.43056, 0, 0, 0.55556], + "8891": [0.19444, 0.69224, 0, 0, 0.61111], + "8892": [0.19444, 0.69224, 0, 0, 0.61111], + "8901": [0, 0.54986, 0, 0, 0.27778], + "8903": [0.08167, 0.58167, 0, 0, 0.77778], + "8905": [0.08167, 0.58167, 0, 0, 0.77778], + "8906": [0.08167, 0.58167, 0, 0, 0.77778], + "8907": [0, 0.69224, 0, 0, 0.77778], + "8908": [0, 0.69224, 0, 0, 0.77778], + "8909": [-0.03598, 0.46402, 0, 0, 0.77778], + "8910": [0, 0.54986, 0, 0, 0.76042], + "8911": [0, 0.54986, 0, 0, 0.76042], + "8912": [0.03517, 0.54986, 0, 0, 0.77778], + "8913": [0.03517, 0.54986, 0, 0, 0.77778], + "8914": [0, 0.54986, 0, 0, 0.66667], + "8915": [0, 0.54986, 0, 0, 0.66667], + "8916": [0, 0.69224, 0, 0, 0.66667], + "8918": [0.0391, 0.5391, 0, 0, 0.77778], + "8919": [0.0391, 0.5391, 0, 0, 0.77778], + "8920": [0.03517, 0.54986, 0, 0, 1.33334], + "8921": [0.03517, 0.54986, 0, 0, 1.33334], + "8922": [0.38569, 0.88569, 0, 0, 0.77778], + "8923": [0.38569, 0.88569, 0, 0, 0.77778], + "8926": [0.13667, 0.63667, 0, 0, 0.77778], + "8927": [0.13667, 0.63667, 0, 0, 0.77778], + "8928": [0.30274, 0.79383, 0, 0, 0.77778], + "8929": [0.30274, 0.79383, 0, 0, 0.77778], + "8934": [0.23222, 0.74111, 0, 0, 0.77778], + "8935": [0.23222, 0.74111, 0, 0, 0.77778], + "8936": [0.23222, 0.74111, 0, 0, 0.77778], + "8937": [0.23222, 0.74111, 0, 0, 0.77778], + "8938": [0.20576, 0.70576, 0, 0, 0.77778], + "8939": [0.20576, 0.70576, 0, 0, 0.77778], + "8940": [0.30274, 0.79383, 0, 0, 0.77778], + "8941": [0.30274, 0.79383, 0, 0, 0.77778], + "8994": [0.19444, 0.69224, 0, 0, 0.77778], + "8995": [0.19444, 0.69224, 0, 0, 0.77778], + "9416": [0.15559, 0.69224, 0, 0, 0.90222], + "9484": [0, 0.69224, 0, 0, 0.5], + "9488": [0, 0.69224, 0, 0, 0.5], + "9492": [0, 0.37788, 0, 0, 0.5], + "9496": [0, 0.37788, 0, 0, 0.5], + "9585": [0.19444, 0.68889, 0, 0, 0.88889], + "9586": [0.19444, 0.74111, 0, 0, 0.88889], + "9632": [0, 0.675, 0, 0, 0.77778], + "9633": [0, 0.675, 0, 0, 0.77778], + "9650": [0, 0.54986, 0, 0, 0.72222], + "9651": [0, 0.54986, 0, 0, 0.72222], + "9654": [0.03517, 0.54986, 0, 0, 0.77778], + "9660": [0, 0.54986, 0, 0, 0.72222], + "9661": [0, 0.54986, 0, 0, 0.72222], + "9664": [0.03517, 0.54986, 0, 0, 0.77778], + "9674": [0.11111, 0.69224, 0, 0, 0.66667], + "9733": [0.19444, 0.69224, 0, 0, 0.94445], + "10003": [0, 0.69224, 0, 0, 0.83334], + "10016": [0, 0.69224, 0, 0, 0.83334], + "10731": [0.11111, 0.69224, 0, 0, 0.66667], + "10846": [0.19444, 0.75583, 0, 0, 0.61111], + "10877": [0.13667, 0.63667, 0, 0, 0.77778], + "10878": [0.13667, 0.63667, 0, 0, 0.77778], + "10885": [0.25583, 0.75583, 0, 0, 0.77778], + "10886": [0.25583, 0.75583, 0, 0, 0.77778], + "10887": [0.13597, 0.63597, 0, 0, 0.77778], + "10888": [0.13597, 0.63597, 0, 0, 0.77778], + "10889": [0.26167, 0.75726, 0, 0, 0.77778], + "10890": [0.26167, 0.75726, 0, 0, 0.77778], + "10891": [0.48256, 0.98256, 0, 0, 0.77778], + "10892": [0.48256, 0.98256, 0, 0, 0.77778], + "10901": [0.13667, 0.63667, 0, 0, 0.77778], + "10902": [0.13667, 0.63667, 0, 0, 0.77778], + "10933": [0.25142, 0.75726, 0, 0, 0.77778], + "10934": [0.25142, 0.75726, 0, 0, 0.77778], + "10935": [0.26167, 0.75726, 0, 0, 0.77778], + "10936": [0.26167, 0.75726, 0, 0, 0.77778], + "10937": [0.26167, 0.75726, 0, 0, 0.77778], + "10938": [0.26167, 0.75726, 0, 0, 0.77778], + "10949": [0.25583, 0.75583, 0, 0, 0.77778], + "10950": [0.25583, 0.75583, 0, 0, 0.77778], + "10955": [0.28481, 0.79383, 0, 0, 0.77778], + "10956": [0.28481, 0.79383, 0, 0, 0.77778], + "57350": [0.08167, 0.58167, 0, 0, 0.22222], + "57351": [0.08167, 0.58167, 0, 0, 0.38889], + "57352": [0.08167, 0.58167, 0, 0, 0.77778], + "57353": [0, 0.43056, 0.04028, 0, 0.66667], + "57356": [0.25142, 0.75726, 0, 0, 0.77778], + "57357": [0.25142, 0.75726, 0, 0, 0.77778], + "57358": [0.41951, 0.91951, 0, 0, 0.77778], + "57359": [0.30274, 0.79383, 0, 0, 0.77778], + "57360": [0.30274, 0.79383, 0, 0, 0.77778], + "57361": [0.41951, 0.91951, 0, 0, 0.77778], + "57366": [0.25142, 0.75726, 0, 0, 0.77778], + "57367": [0.25142, 0.75726, 0, 0, 0.77778], + "57368": [0.25142, 0.75726, 0, 0, 0.77778], + "57369": [0.25142, 0.75726, 0, 0, 0.77778], + "57370": [0.13597, 0.63597, 0, 0, 0.77778], + "57371": [0.13597, 0.63597, 0, 0, 0.77778] + }, + "Caligraphic-Regular": { + "32": [0, 0, 0, 0, 0.25], + "65": [0, 0.68333, 0, 0.19445, 0.79847], + "66": [0, 0.68333, 0.03041, 0.13889, 0.65681], + "67": [0, 0.68333, 0.05834, 0.13889, 0.52653], + "68": [0, 0.68333, 0.02778, 0.08334, 0.77139], + "69": [0, 0.68333, 0.08944, 0.11111, 0.52778], + "70": [0, 0.68333, 0.09931, 0.11111, 0.71875], + "71": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487], + "72": [0, 0.68333, 0.00965, 0.11111, 0.84452], + "73": [0, 0.68333, 0.07382, 0, 0.54452], + "74": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778], + "75": [0, 0.68333, 0.01445, 0.05556, 0.76195], + "76": [0, 0.68333, 0, 0.13889, 0.68972], + "77": [0, 0.68333, 0, 0.13889, 1.2009], + "78": [0, 0.68333, 0.14736, 0.08334, 0.82049], + "79": [0, 0.68333, 0.02778, 0.11111, 0.79611], + "80": [0, 0.68333, 0.08222, 0.08334, 0.69556], + "81": [0.09722, 0.68333, 0, 0.11111, 0.81667], + "82": [0, 0.68333, 0, 0.08334, 0.8475], + "83": [0, 0.68333, 0.075, 0.13889, 0.60556], + "84": [0, 0.68333, 0.25417, 0, 0.54464], + "85": [0, 0.68333, 0.09931, 0.08334, 0.62583], + "86": [0, 0.68333, 0.08222, 0, 0.61278], + "87": [0, 0.68333, 0.08222, 0.08334, 0.98778], + "88": [0, 0.68333, 0.14643, 0.13889, 0.7133], + "89": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834], + "90": [0, 0.68333, 0.07944, 0.13889, 0.72473], + "160": [0, 0, 0, 0, 0.25] + }, + "Fraktur-Regular": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69141, 0, 0, 0.29574], + "34": [0, 0.69141, 0, 0, 0.21471], + "38": [0, 0.69141, 0, 0, 0.73786], + "39": [0, 0.69141, 0, 0, 0.21201], + "40": [0.24982, 0.74947, 0, 0, 0.38865], + "41": [0.24982, 0.74947, 0, 0, 0.38865], + "42": [0, 0.62119, 0, 0, 0.27764], + "43": [0.08319, 0.58283, 0, 0, 0.75623], + "44": [0, 0.10803, 0, 0, 0.27764], + "45": [0.08319, 0.58283, 0, 0, 0.75623], + "46": [0, 0.10803, 0, 0, 0.27764], + "47": [0.24982, 0.74947, 0, 0, 0.50181], + "48": [0, 0.47534, 0, 0, 0.50181], + "49": [0, 0.47534, 0, 0, 0.50181], + "50": [0, 0.47534, 0, 0, 0.50181], + "51": [0.18906, 0.47534, 0, 0, 0.50181], + "52": [0.18906, 0.47534, 0, 0, 0.50181], + "53": [0.18906, 0.47534, 0, 0, 0.50181], + "54": [0, 0.69141, 0, 0, 0.50181], + "55": [0.18906, 0.47534, 0, 0, 0.50181], + "56": [0, 0.69141, 0, 0, 0.50181], + "57": [0.18906, 0.47534, 0, 0, 0.50181], + "58": [0, 0.47534, 0, 0, 0.21606], + "59": [0.12604, 0.47534, 0, 0, 0.21606], + "61": [-0.13099, 0.36866, 0, 0, 0.75623], + "63": [0, 0.69141, 0, 0, 0.36245], + "65": [0, 0.69141, 0, 0, 0.7176], + "66": [0, 0.69141, 0, 0, 0.88397], + "67": [0, 0.69141, 0, 0, 0.61254], + "68": [0, 0.69141, 0, 0, 0.83158], + "69": [0, 0.69141, 0, 0, 0.66278], + "70": [0.12604, 0.69141, 0, 0, 0.61119], + "71": [0, 0.69141, 0, 0, 0.78539], + "72": [0.06302, 0.69141, 0, 0, 0.7203], + "73": [0, 0.69141, 0, 0, 0.55448], + "74": [0.12604, 0.69141, 0, 0, 0.55231], + "75": [0, 0.69141, 0, 0, 0.66845], + "76": [0, 0.69141, 0, 0, 0.66602], + "77": [0, 0.69141, 0, 0, 1.04953], + "78": [0, 0.69141, 0, 0, 0.83212], + "79": [0, 0.69141, 0, 0, 0.82699], + "80": [0.18906, 0.69141, 0, 0, 0.82753], + "81": [0.03781, 0.69141, 0, 0, 0.82699], + "82": [0, 0.69141, 0, 0, 0.82807], + "83": [0, 0.69141, 0, 0, 0.82861], + "84": [0, 0.69141, 0, 0, 0.66899], + "85": [0, 0.69141, 0, 0, 0.64576], + "86": [0, 0.69141, 0, 0, 0.83131], + "87": [0, 0.69141, 0, 0, 1.04602], + "88": [0, 0.69141, 0, 0, 0.71922], + "89": [0.18906, 0.69141, 0, 0, 0.83293], + "90": [0.12604, 0.69141, 0, 0, 0.60201], + "91": [0.24982, 0.74947, 0, 0, 0.27764], + "93": [0.24982, 0.74947, 0, 0, 0.27764], + "94": [0, 0.69141, 0, 0, 0.49965], + "97": [0, 0.47534, 0, 0, 0.50046], + "98": [0, 0.69141, 0, 0, 0.51315], + "99": [0, 0.47534, 0, 0, 0.38946], + "100": [0, 0.62119, 0, 0, 0.49857], + "101": [0, 0.47534, 0, 0, 0.40053], + "102": [0.18906, 0.69141, 0, 0, 0.32626], + "103": [0.18906, 0.47534, 0, 0, 0.5037], + "104": [0.18906, 0.69141, 0, 0, 0.52126], + "105": [0, 0.69141, 0, 0, 0.27899], + "106": [0, 0.69141, 0, 0, 0.28088], + "107": [0, 0.69141, 0, 0, 0.38946], + "108": [0, 0.69141, 0, 0, 0.27953], + "109": [0, 0.47534, 0, 0, 0.76676], + "110": [0, 0.47534, 0, 0, 0.52666], + "111": [0, 0.47534, 0, 0, 0.48885], + "112": [0.18906, 0.52396, 0, 0, 0.50046], + "113": [0.18906, 0.47534, 0, 0, 0.48912], + "114": [0, 0.47534, 0, 0, 0.38919], + "115": [0, 0.47534, 0, 0, 0.44266], + "116": [0, 0.62119, 0, 0, 0.33301], + "117": [0, 0.47534, 0, 0, 0.5172], + "118": [0, 0.52396, 0, 0, 0.5118], + "119": [0, 0.52396, 0, 0, 0.77351], + "120": [0.18906, 0.47534, 0, 0, 0.38865], + "121": [0.18906, 0.47534, 0, 0, 0.49884], + "122": [0.18906, 0.47534, 0, 0, 0.39054], + "160": [0, 0, 0, 0, 0.25], + "8216": [0, 0.69141, 0, 0, 0.21471], + "8217": [0, 0.69141, 0, 0, 0.21471], + "58112": [0, 0.62119, 0, 0, 0.49749], + "58113": [0, 0.62119, 0, 0, 0.4983], + "58114": [0.18906, 0.69141, 0, 0, 0.33328], + "58115": [0.18906, 0.69141, 0, 0, 0.32923], + "58116": [0.18906, 0.47534, 0, 0, 0.50343], + "58117": [0, 0.69141, 0, 0, 0.33301], + "58118": [0, 0.62119, 0, 0, 0.33409], + "58119": [0, 0.47534, 0, 0, 0.50073] + }, + "Main-Bold": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.35], + "34": [0, 0.69444, 0, 0, 0.60278], + "35": [0.19444, 0.69444, 0, 0, 0.95833], + "36": [0.05556, 0.75, 0, 0, 0.575], + "37": [0.05556, 0.75, 0, 0, 0.95833], + "38": [0, 0.69444, 0, 0, 0.89444], + "39": [0, 0.69444, 0, 0, 0.31944], + "40": [0.25, 0.75, 0, 0, 0.44722], + "41": [0.25, 0.75, 0, 0, 0.44722], + "42": [0, 0.75, 0, 0, 0.575], + "43": [0.13333, 0.63333, 0, 0, 0.89444], + "44": [0.19444, 0.15556, 0, 0, 0.31944], + "45": [0, 0.44444, 0, 0, 0.38333], + "46": [0, 0.15556, 0, 0, 0.31944], + "47": [0.25, 0.75, 0, 0, 0.575], + "48": [0, 0.64444, 0, 0, 0.575], + "49": [0, 0.64444, 0, 0, 0.575], + "50": [0, 0.64444, 0, 0, 0.575], + "51": [0, 0.64444, 0, 0, 0.575], + "52": [0, 0.64444, 0, 0, 0.575], + "53": [0, 0.64444, 0, 0, 0.575], + "54": [0, 0.64444, 0, 0, 0.575], + "55": [0, 0.64444, 0, 0, 0.575], + "56": [0, 0.64444, 0, 0, 0.575], + "57": [0, 0.64444, 0, 0, 0.575], + "58": [0, 0.44444, 0, 0, 0.31944], + "59": [0.19444, 0.44444, 0, 0, 0.31944], + "60": [0.08556, 0.58556, 0, 0, 0.89444], + "61": [-0.10889, 0.39111, 0, 0, 0.89444], + "62": [0.08556, 0.58556, 0, 0, 0.89444], + "63": [0, 0.69444, 0, 0, 0.54305], + "64": [0, 0.69444, 0, 0, 0.89444], + "65": [0, 0.68611, 0, 0, 0.86944], + "66": [0, 0.68611, 0, 0, 0.81805], + "67": [0, 0.68611, 0, 0, 0.83055], + "68": [0, 0.68611, 0, 0, 0.88194], + "69": [0, 0.68611, 0, 0, 0.75555], + "70": [0, 0.68611, 0, 0, 0.72361], + "71": [0, 0.68611, 0, 0, 0.90416], + "72": [0, 0.68611, 0, 0, 0.9], + "73": [0, 0.68611, 0, 0, 0.43611], + "74": [0, 0.68611, 0, 0, 0.59444], + "75": [0, 0.68611, 0, 0, 0.90138], + "76": [0, 0.68611, 0, 0, 0.69166], + "77": [0, 0.68611, 0, 0, 1.09166], + "78": [0, 0.68611, 0, 0, 0.9], + "79": [0, 0.68611, 0, 0, 0.86388], + "80": [0, 0.68611, 0, 0, 0.78611], + "81": [0.19444, 0.68611, 0, 0, 0.86388], + "82": [0, 0.68611, 0, 0, 0.8625], + "83": [0, 0.68611, 0, 0, 0.63889], + "84": [0, 0.68611, 0, 0, 0.8], + "85": [0, 0.68611, 0, 0, 0.88472], + "86": [0, 0.68611, 0.01597, 0, 0.86944], + "87": [0, 0.68611, 0.01597, 0, 1.18888], + "88": [0, 0.68611, 0, 0, 0.86944], + "89": [0, 0.68611, 0.02875, 0, 0.86944], + "90": [0, 0.68611, 0, 0, 0.70277], + "91": [0.25, 0.75, 0, 0, 0.31944], + "92": [0.25, 0.75, 0, 0, 0.575], + "93": [0.25, 0.75, 0, 0, 0.31944], + "94": [0, 0.69444, 0, 0, 0.575], + "95": [0.31, 0.13444, 0.03194, 0, 0.575], + "97": [0, 0.44444, 0, 0, 0.55902], + "98": [0, 0.69444, 0, 0, 0.63889], + "99": [0, 0.44444, 0, 0, 0.51111], + "100": [0, 0.69444, 0, 0, 0.63889], + "101": [0, 0.44444, 0, 0, 0.52708], + "102": [0, 0.69444, 0.10903, 0, 0.35139], + "103": [0.19444, 0.44444, 0.01597, 0, 0.575], + "104": [0, 0.69444, 0, 0, 0.63889], + "105": [0, 0.69444, 0, 0, 0.31944], + "106": [0.19444, 0.69444, 0, 0, 0.35139], + "107": [0, 0.69444, 0, 0, 0.60694], + "108": [0, 0.69444, 0, 0, 0.31944], + "109": [0, 0.44444, 0, 0, 0.95833], + "110": [0, 0.44444, 0, 0, 0.63889], + "111": [0, 0.44444, 0, 0, 0.575], + "112": [0.19444, 0.44444, 0, 0, 0.63889], + "113": [0.19444, 0.44444, 0, 0, 0.60694], + "114": [0, 0.44444, 0, 0, 0.47361], + "115": [0, 0.44444, 0, 0, 0.45361], + "116": [0, 0.63492, 0, 0, 0.44722], + "117": [0, 0.44444, 0, 0, 0.63889], + "118": [0, 0.44444, 0.01597, 0, 0.60694], + "119": [0, 0.44444, 0.01597, 0, 0.83055], + "120": [0, 0.44444, 0, 0, 0.60694], + "121": [0.19444, 0.44444, 0.01597, 0, 0.60694], + "122": [0, 0.44444, 0, 0, 0.51111], + "123": [0.25, 0.75, 0, 0, 0.575], + "124": [0.25, 0.75, 0, 0, 0.31944], + "125": [0.25, 0.75, 0, 0, 0.575], + "126": [0.35, 0.34444, 0, 0, 0.575], + "160": [0, 0, 0, 0, 0.25], + "163": [0, 0.69444, 0, 0, 0.86853], + "168": [0, 0.69444, 0, 0, 0.575], + "172": [0, 0.44444, 0, 0, 0.76666], + "176": [0, 0.69444, 0, 0, 0.86944], + "177": [0.13333, 0.63333, 0, 0, 0.89444], + "184": [0.17014, 0, 0, 0, 0.51111], + "198": [0, 0.68611, 0, 0, 1.04166], + "215": [0.13333, 0.63333, 0, 0, 0.89444], + "216": [0.04861, 0.73472, 0, 0, 0.89444], + "223": [0, 0.69444, 0, 0, 0.59722], + "230": [0, 0.44444, 0, 0, 0.83055], + "247": [0.13333, 0.63333, 0, 0, 0.89444], + "248": [0.09722, 0.54167, 0, 0, 0.575], + "305": [0, 0.44444, 0, 0, 0.31944], + "338": [0, 0.68611, 0, 0, 1.16944], + "339": [0, 0.44444, 0, 0, 0.89444], + "567": [0.19444, 0.44444, 0, 0, 0.35139], + "710": [0, 0.69444, 0, 0, 0.575], + "711": [0, 0.63194, 0, 0, 0.575], + "713": [0, 0.59611, 0, 0, 0.575], + "714": [0, 0.69444, 0, 0, 0.575], + "715": [0, 0.69444, 0, 0, 0.575], + "728": [0, 0.69444, 0, 0, 0.575], + "729": [0, 0.69444, 0, 0, 0.31944], + "730": [0, 0.69444, 0, 0, 0.86944], + "732": [0, 0.69444, 0, 0, 0.575], + "733": [0, 0.69444, 0, 0, 0.575], + "915": [0, 0.68611, 0, 0, 0.69166], + "916": [0, 0.68611, 0, 0, 0.95833], + "920": [0, 0.68611, 0, 0, 0.89444], + "923": [0, 0.68611, 0, 0, 0.80555], + "926": [0, 0.68611, 0, 0, 0.76666], + "928": [0, 0.68611, 0, 0, 0.9], + "931": [0, 0.68611, 0, 0, 0.83055], + "933": [0, 0.68611, 0, 0, 0.89444], + "934": [0, 0.68611, 0, 0, 0.83055], + "936": [0, 0.68611, 0, 0, 0.89444], + "937": [0, 0.68611, 0, 0, 0.83055], + "8211": [0, 0.44444, 0.03194, 0, 0.575], + "8212": [0, 0.44444, 0.03194, 0, 1.14999], + "8216": [0, 0.69444, 0, 0, 0.31944], + "8217": [0, 0.69444, 0, 0, 0.31944], + "8220": [0, 0.69444, 0, 0, 0.60278], + "8221": [0, 0.69444, 0, 0, 0.60278], + "8224": [0.19444, 0.69444, 0, 0, 0.51111], + "8225": [0.19444, 0.69444, 0, 0, 0.51111], + "8242": [0, 0.55556, 0, 0, 0.34444], + "8407": [0, 0.72444, 0.15486, 0, 0.575], + "8463": [0, 0.69444, 0, 0, 0.66759], + "8465": [0, 0.69444, 0, 0, 0.83055], + "8467": [0, 0.69444, 0, 0, 0.47361], + "8472": [0.19444, 0.44444, 0, 0, 0.74027], + "8476": [0, 0.69444, 0, 0, 0.83055], + "8501": [0, 0.69444, 0, 0, 0.70277], + "8592": [-0.10889, 0.39111, 0, 0, 1.14999], + "8593": [0.19444, 0.69444, 0, 0, 0.575], + "8594": [-0.10889, 0.39111, 0, 0, 1.14999], + "8595": [0.19444, 0.69444, 0, 0, 0.575], + "8596": [-0.10889, 0.39111, 0, 0, 1.14999], + "8597": [0.25, 0.75, 0, 0, 0.575], + "8598": [0.19444, 0.69444, 0, 0, 1.14999], + "8599": [0.19444, 0.69444, 0, 0, 1.14999], + "8600": [0.19444, 0.69444, 0, 0, 1.14999], + "8601": [0.19444, 0.69444, 0, 0, 1.14999], + "8636": [-0.10889, 0.39111, 0, 0, 1.14999], + "8637": [-0.10889, 0.39111, 0, 0, 1.14999], + "8640": [-0.10889, 0.39111, 0, 0, 1.14999], + "8641": [-0.10889, 0.39111, 0, 0, 1.14999], + "8656": [-0.10889, 0.39111, 0, 0, 1.14999], + "8657": [0.19444, 0.69444, 0, 0, 0.70277], + "8658": [-0.10889, 0.39111, 0, 0, 1.14999], + "8659": [0.19444, 0.69444, 0, 0, 0.70277], + "8660": [-0.10889, 0.39111, 0, 0, 1.14999], + "8661": [0.25, 0.75, 0, 0, 0.70277], + "8704": [0, 0.69444, 0, 0, 0.63889], + "8706": [0, 0.69444, 0.06389, 0, 0.62847], + "8707": [0, 0.69444, 0, 0, 0.63889], + "8709": [0.05556, 0.75, 0, 0, 0.575], + "8711": [0, 0.68611, 0, 0, 0.95833], + "8712": [0.08556, 0.58556, 0, 0, 0.76666], + "8715": [0.08556, 0.58556, 0, 0, 0.76666], + "8722": [0.13333, 0.63333, 0, 0, 0.89444], + "8723": [0.13333, 0.63333, 0, 0, 0.89444], + "8725": [0.25, 0.75, 0, 0, 0.575], + "8726": [0.25, 0.75, 0, 0, 0.575], + "8727": [-0.02778, 0.47222, 0, 0, 0.575], + "8728": [-0.02639, 0.47361, 0, 0, 0.575], + "8729": [-0.02639, 0.47361, 0, 0, 0.575], + "8730": [0.18, 0.82, 0, 0, 0.95833], + "8733": [0, 0.44444, 0, 0, 0.89444], + "8734": [0, 0.44444, 0, 0, 1.14999], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8739": [0.25, 0.75, 0, 0, 0.31944], + "8741": [0.25, 0.75, 0, 0, 0.575], + "8743": [0, 0.55556, 0, 0, 0.76666], + "8744": [0, 0.55556, 0, 0, 0.76666], + "8745": [0, 0.55556, 0, 0, 0.76666], + "8746": [0, 0.55556, 0, 0, 0.76666], + "8747": [0.19444, 0.69444, 0.12778, 0, 0.56875], + "8764": [-0.10889, 0.39111, 0, 0, 0.89444], + "8768": [0.19444, 0.69444, 0, 0, 0.31944], + "8771": [0.00222, 0.50222, 0, 0, 0.89444], + "8776": [0.02444, 0.52444, 0, 0, 0.89444], + "8781": [0.00222, 0.50222, 0, 0, 0.89444], + "8801": [0.00222, 0.50222, 0, 0, 0.89444], + "8804": [0.19667, 0.69667, 0, 0, 0.89444], + "8805": [0.19667, 0.69667, 0, 0, 0.89444], + "8810": [0.08556, 0.58556, 0, 0, 1.14999], + "8811": [0.08556, 0.58556, 0, 0, 1.14999], + "8826": [0.08556, 0.58556, 0, 0, 0.89444], + "8827": [0.08556, 0.58556, 0, 0, 0.89444], + "8834": [0.08556, 0.58556, 0, 0, 0.89444], + "8835": [0.08556, 0.58556, 0, 0, 0.89444], + "8838": [0.19667, 0.69667, 0, 0, 0.89444], + "8839": [0.19667, 0.69667, 0, 0, 0.89444], + "8846": [0, 0.55556, 0, 0, 0.76666], + "8849": [0.19667, 0.69667, 0, 0, 0.89444], + "8850": [0.19667, 0.69667, 0, 0, 0.89444], + "8851": [0, 0.55556, 0, 0, 0.76666], + "8852": [0, 0.55556, 0, 0, 0.76666], + "8853": [0.13333, 0.63333, 0, 0, 0.89444], + "8854": [0.13333, 0.63333, 0, 0, 0.89444], + "8855": [0.13333, 0.63333, 0, 0, 0.89444], + "8856": [0.13333, 0.63333, 0, 0, 0.89444], + "8857": [0.13333, 0.63333, 0, 0, 0.89444], + "8866": [0, 0.69444, 0, 0, 0.70277], + "8867": [0, 0.69444, 0, 0, 0.70277], + "8868": [0, 0.69444, 0, 0, 0.89444], + "8869": [0, 0.69444, 0, 0, 0.89444], + "8900": [-0.02639, 0.47361, 0, 0, 0.575], + "8901": [-0.02639, 0.47361, 0, 0, 0.31944], + "8902": [-0.02778, 0.47222, 0, 0, 0.575], + "8968": [0.25, 0.75, 0, 0, 0.51111], + "8969": [0.25, 0.75, 0, 0, 0.51111], + "8970": [0.25, 0.75, 0, 0, 0.51111], + "8971": [0.25, 0.75, 0, 0, 0.51111], + "8994": [-0.13889, 0.36111, 0, 0, 1.14999], + "8995": [-0.13889, 0.36111, 0, 0, 1.14999], + "9651": [0.19444, 0.69444, 0, 0, 1.02222], + "9657": [-0.02778, 0.47222, 0, 0, 0.575], + "9661": [0.19444, 0.69444, 0, 0, 1.02222], + "9667": [-0.02778, 0.47222, 0, 0, 0.575], + "9711": [0.19444, 0.69444, 0, 0, 1.14999], + "9824": [0.12963, 0.69444, 0, 0, 0.89444], + "9825": [0.12963, 0.69444, 0, 0, 0.89444], + "9826": [0.12963, 0.69444, 0, 0, 0.89444], + "9827": [0.12963, 0.69444, 0, 0, 0.89444], + "9837": [0, 0.75, 0, 0, 0.44722], + "9838": [0.19444, 0.69444, 0, 0, 0.44722], + "9839": [0.19444, 0.69444, 0, 0, 0.44722], + "10216": [0.25, 0.75, 0, 0, 0.44722], + "10217": [0.25, 0.75, 0, 0, 0.44722], + "10815": [0, 0.68611, 0, 0, 0.9], + "10927": [0.19667, 0.69667, 0, 0, 0.89444], + "10928": [0.19667, 0.69667, 0, 0, 0.89444], + "57376": [0.19444, 0.69444, 0, 0, 0] + }, + "Main-BoldItalic": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0.11417, 0, 0.38611], + "34": [0, 0.69444, 0.07939, 0, 0.62055], + "35": [0.19444, 0.69444, 0.06833, 0, 0.94444], + "37": [0.05556, 0.75, 0.12861, 0, 0.94444], + "38": [0, 0.69444, 0.08528, 0, 0.88555], + "39": [0, 0.69444, 0.12945, 0, 0.35555], + "40": [0.25, 0.75, 0.15806, 0, 0.47333], + "41": [0.25, 0.75, 0.03306, 0, 0.47333], + "42": [0, 0.75, 0.14333, 0, 0.59111], + "43": [0.10333, 0.60333, 0.03306, 0, 0.88555], + "44": [0.19444, 0.14722, 0, 0, 0.35555], + "45": [0, 0.44444, 0.02611, 0, 0.41444], + "46": [0, 0.14722, 0, 0, 0.35555], + "47": [0.25, 0.75, 0.15806, 0, 0.59111], + "48": [0, 0.64444, 0.13167, 0, 0.59111], + "49": [0, 0.64444, 0.13167, 0, 0.59111], + "50": [0, 0.64444, 0.13167, 0, 0.59111], + "51": [0, 0.64444, 0.13167, 0, 0.59111], + "52": [0.19444, 0.64444, 0.13167, 0, 0.59111], + "53": [0, 0.64444, 0.13167, 0, 0.59111], + "54": [0, 0.64444, 0.13167, 0, 0.59111], + "55": [0.19444, 0.64444, 0.13167, 0, 0.59111], + "56": [0, 0.64444, 0.13167, 0, 0.59111], + "57": [0, 0.64444, 0.13167, 0, 0.59111], + "58": [0, 0.44444, 0.06695, 0, 0.35555], + "59": [0.19444, 0.44444, 0.06695, 0, 0.35555], + "61": [-0.10889, 0.39111, 0.06833, 0, 0.88555], + "63": [0, 0.69444, 0.11472, 0, 0.59111], + "64": [0, 0.69444, 0.09208, 0, 0.88555], + "65": [0, 0.68611, 0, 0, 0.86555], + "66": [0, 0.68611, 0.0992, 0, 0.81666], + "67": [0, 0.68611, 0.14208, 0, 0.82666], + "68": [0, 0.68611, 0.09062, 0, 0.87555], + "69": [0, 0.68611, 0.11431, 0, 0.75666], + "70": [0, 0.68611, 0.12903, 0, 0.72722], + "71": [0, 0.68611, 0.07347, 0, 0.89527], + "72": [0, 0.68611, 0.17208, 0, 0.8961], + "73": [0, 0.68611, 0.15681, 0, 0.47166], + "74": [0, 0.68611, 0.145, 0, 0.61055], + "75": [0, 0.68611, 0.14208, 0, 0.89499], + "76": [0, 0.68611, 0, 0, 0.69777], + "77": [0, 0.68611, 0.17208, 0, 1.07277], + "78": [0, 0.68611, 0.17208, 0, 0.8961], + "79": [0, 0.68611, 0.09062, 0, 0.85499], + "80": [0, 0.68611, 0.0992, 0, 0.78721], + "81": [0.19444, 0.68611, 0.09062, 0, 0.85499], + "82": [0, 0.68611, 0.02559, 0, 0.85944], + "83": [0, 0.68611, 0.11264, 0, 0.64999], + "84": [0, 0.68611, 0.12903, 0, 0.7961], + "85": [0, 0.68611, 0.17208, 0, 0.88083], + "86": [0, 0.68611, 0.18625, 0, 0.86555], + "87": [0, 0.68611, 0.18625, 0, 1.15999], + "88": [0, 0.68611, 0.15681, 0, 0.86555], + "89": [0, 0.68611, 0.19803, 0, 0.86555], + "90": [0, 0.68611, 0.14208, 0, 0.70888], + "91": [0.25, 0.75, 0.1875, 0, 0.35611], + "93": [0.25, 0.75, 0.09972, 0, 0.35611], + "94": [0, 0.69444, 0.06709, 0, 0.59111], + "95": [0.31, 0.13444, 0.09811, 0, 0.59111], + "97": [0, 0.44444, 0.09426, 0, 0.59111], + "98": [0, 0.69444, 0.07861, 0, 0.53222], + "99": [0, 0.44444, 0.05222, 0, 0.53222], + "100": [0, 0.69444, 0.10861, 0, 0.59111], + "101": [0, 0.44444, 0.085, 0, 0.53222], + "102": [0.19444, 0.69444, 0.21778, 0, 0.4], + "103": [0.19444, 0.44444, 0.105, 0, 0.53222], + "104": [0, 0.69444, 0.09426, 0, 0.59111], + "105": [0, 0.69326, 0.11387, 0, 0.35555], + "106": [0.19444, 0.69326, 0.1672, 0, 0.35555], + "107": [0, 0.69444, 0.11111, 0, 0.53222], + "108": [0, 0.69444, 0.10861, 0, 0.29666], + "109": [0, 0.44444, 0.09426, 0, 0.94444], + "110": [0, 0.44444, 0.09426, 0, 0.64999], + "111": [0, 0.44444, 0.07861, 0, 0.59111], + "112": [0.19444, 0.44444, 0.07861, 0, 0.59111], + "113": [0.19444, 0.44444, 0.105, 0, 0.53222], + "114": [0, 0.44444, 0.11111, 0, 0.50167], + "115": [0, 0.44444, 0.08167, 0, 0.48694], + "116": [0, 0.63492, 0.09639, 0, 0.385], + "117": [0, 0.44444, 0.09426, 0, 0.62055], + "118": [0, 0.44444, 0.11111, 0, 0.53222], + "119": [0, 0.44444, 0.11111, 0, 0.76777], + "120": [0, 0.44444, 0.12583, 0, 0.56055], + "121": [0.19444, 0.44444, 0.105, 0, 0.56166], + "122": [0, 0.44444, 0.13889, 0, 0.49055], + "126": [0.35, 0.34444, 0.11472, 0, 0.59111], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.69444, 0.11473, 0, 0.59111], + "176": [0, 0.69444, 0, 0, 0.94888], + "184": [0.17014, 0, 0, 0, 0.53222], + "198": [0, 0.68611, 0.11431, 0, 1.02277], + "216": [0.04861, 0.73472, 0.09062, 0, 0.88555], + "223": [0.19444, 0.69444, 0.09736, 0, 0.665], + "230": [0, 0.44444, 0.085, 0, 0.82666], + "248": [0.09722, 0.54167, 0.09458, 0, 0.59111], + "305": [0, 0.44444, 0.09426, 0, 0.35555], + "338": [0, 0.68611, 0.11431, 0, 1.14054], + "339": [0, 0.44444, 0.085, 0, 0.82666], + "567": [0.19444, 0.44444, 0.04611, 0, 0.385], + "710": [0, 0.69444, 0.06709, 0, 0.59111], + "711": [0, 0.63194, 0.08271, 0, 0.59111], + "713": [0, 0.59444, 0.10444, 0, 0.59111], + "714": [0, 0.69444, 0.08528, 0, 0.59111], + "715": [0, 0.69444, 0, 0, 0.59111], + "728": [0, 0.69444, 0.10333, 0, 0.59111], + "729": [0, 0.69444, 0.12945, 0, 0.35555], + "730": [0, 0.69444, 0, 0, 0.94888], + "732": [0, 0.69444, 0.11472, 0, 0.59111], + "733": [0, 0.69444, 0.11472, 0, 0.59111], + "915": [0, 0.68611, 0.12903, 0, 0.69777], + "916": [0, 0.68611, 0, 0, 0.94444], + "920": [0, 0.68611, 0.09062, 0, 0.88555], + "923": [0, 0.68611, 0, 0, 0.80666], + "926": [0, 0.68611, 0.15092, 0, 0.76777], + "928": [0, 0.68611, 0.17208, 0, 0.8961], + "931": [0, 0.68611, 0.11431, 0, 0.82666], + "933": [0, 0.68611, 0.10778, 0, 0.88555], + "934": [0, 0.68611, 0.05632, 0, 0.82666], + "936": [0, 0.68611, 0.10778, 0, 0.88555], + "937": [0, 0.68611, 0.0992, 0, 0.82666], + "8211": [0, 0.44444, 0.09811, 0, 0.59111], + "8212": [0, 0.44444, 0.09811, 0, 1.18221], + "8216": [0, 0.69444, 0.12945, 0, 0.35555], + "8217": [0, 0.69444, 0.12945, 0, 0.35555], + "8220": [0, 0.69444, 0.16772, 0, 0.62055], + "8221": [0, 0.69444, 0.07939, 0, 0.62055] + }, + "Main-Italic": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0.12417, 0, 0.30667], + "34": [0, 0.69444, 0.06961, 0, 0.51444], + "35": [0.19444, 0.69444, 0.06616, 0, 0.81777], + "37": [0.05556, 0.75, 0.13639, 0, 0.81777], + "38": [0, 0.69444, 0.09694, 0, 0.76666], + "39": [0, 0.69444, 0.12417, 0, 0.30667], + "40": [0.25, 0.75, 0.16194, 0, 0.40889], + "41": [0.25, 0.75, 0.03694, 0, 0.40889], + "42": [0, 0.75, 0.14917, 0, 0.51111], + "43": [0.05667, 0.56167, 0.03694, 0, 0.76666], + "44": [0.19444, 0.10556, 0, 0, 0.30667], + "45": [0, 0.43056, 0.02826, 0, 0.35778], + "46": [0, 0.10556, 0, 0, 0.30667], + "47": [0.25, 0.75, 0.16194, 0, 0.51111], + "48": [0, 0.64444, 0.13556, 0, 0.51111], + "49": [0, 0.64444, 0.13556, 0, 0.51111], + "50": [0, 0.64444, 0.13556, 0, 0.51111], + "51": [0, 0.64444, 0.13556, 0, 0.51111], + "52": [0.19444, 0.64444, 0.13556, 0, 0.51111], + "53": [0, 0.64444, 0.13556, 0, 0.51111], + "54": [0, 0.64444, 0.13556, 0, 0.51111], + "55": [0.19444, 0.64444, 0.13556, 0, 0.51111], + "56": [0, 0.64444, 0.13556, 0, 0.51111], + "57": [0, 0.64444, 0.13556, 0, 0.51111], + "58": [0, 0.43056, 0.0582, 0, 0.30667], + "59": [0.19444, 0.43056, 0.0582, 0, 0.30667], + "61": [-0.13313, 0.36687, 0.06616, 0, 0.76666], + "63": [0, 0.69444, 0.1225, 0, 0.51111], + "64": [0, 0.69444, 0.09597, 0, 0.76666], + "65": [0, 0.68333, 0, 0, 0.74333], + "66": [0, 0.68333, 0.10257, 0, 0.70389], + "67": [0, 0.68333, 0.14528, 0, 0.71555], + "68": [0, 0.68333, 0.09403, 0, 0.755], + "69": [0, 0.68333, 0.12028, 0, 0.67833], + "70": [0, 0.68333, 0.13305, 0, 0.65277], + "71": [0, 0.68333, 0.08722, 0, 0.77361], + "72": [0, 0.68333, 0.16389, 0, 0.74333], + "73": [0, 0.68333, 0.15806, 0, 0.38555], + "74": [0, 0.68333, 0.14028, 0, 0.525], + "75": [0, 0.68333, 0.14528, 0, 0.76888], + "76": [0, 0.68333, 0, 0, 0.62722], + "77": [0, 0.68333, 0.16389, 0, 0.89666], + "78": [0, 0.68333, 0.16389, 0, 0.74333], + "79": [0, 0.68333, 0.09403, 0, 0.76666], + "80": [0, 0.68333, 0.10257, 0, 0.67833], + "81": [0.19444, 0.68333, 0.09403, 0, 0.76666], + "82": [0, 0.68333, 0.03868, 0, 0.72944], + "83": [0, 0.68333, 0.11972, 0, 0.56222], + "84": [0, 0.68333, 0.13305, 0, 0.71555], + "85": [0, 0.68333, 0.16389, 0, 0.74333], + "86": [0, 0.68333, 0.18361, 0, 0.74333], + "87": [0, 0.68333, 0.18361, 0, 0.99888], + "88": [0, 0.68333, 0.15806, 0, 0.74333], + "89": [0, 0.68333, 0.19383, 0, 0.74333], + "90": [0, 0.68333, 0.14528, 0, 0.61333], + "91": [0.25, 0.75, 0.1875, 0, 0.30667], + "93": [0.25, 0.75, 0.10528, 0, 0.30667], + "94": [0, 0.69444, 0.06646, 0, 0.51111], + "95": [0.31, 0.12056, 0.09208, 0, 0.51111], + "97": [0, 0.43056, 0.07671, 0, 0.51111], + "98": [0, 0.69444, 0.06312, 0, 0.46], + "99": [0, 0.43056, 0.05653, 0, 0.46], + "100": [0, 0.69444, 0.10333, 0, 0.51111], + "101": [0, 0.43056, 0.07514, 0, 0.46], + "102": [0.19444, 0.69444, 0.21194, 0, 0.30667], + "103": [0.19444, 0.43056, 0.08847, 0, 0.46], + "104": [0, 0.69444, 0.07671, 0, 0.51111], + "105": [0, 0.65536, 0.1019, 0, 0.30667], + "106": [0.19444, 0.65536, 0.14467, 0, 0.30667], + "107": [0, 0.69444, 0.10764, 0, 0.46], + "108": [0, 0.69444, 0.10333, 0, 0.25555], + "109": [0, 0.43056, 0.07671, 0, 0.81777], + "110": [0, 0.43056, 0.07671, 0, 0.56222], + "111": [0, 0.43056, 0.06312, 0, 0.51111], + "112": [0.19444, 0.43056, 0.06312, 0, 0.51111], + "113": [0.19444, 0.43056, 0.08847, 0, 0.46], + "114": [0, 0.43056, 0.10764, 0, 0.42166], + "115": [0, 0.43056, 0.08208, 0, 0.40889], + "116": [0, 0.61508, 0.09486, 0, 0.33222], + "117": [0, 0.43056, 0.07671, 0, 0.53666], + "118": [0, 0.43056, 0.10764, 0, 0.46], + "119": [0, 0.43056, 0.10764, 0, 0.66444], + "120": [0, 0.43056, 0.12042, 0, 0.46389], + "121": [0.19444, 0.43056, 0.08847, 0, 0.48555], + "122": [0, 0.43056, 0.12292, 0, 0.40889], + "126": [0.35, 0.31786, 0.11585, 0, 0.51111], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.66786, 0.10474, 0, 0.51111], + "176": [0, 0.69444, 0, 0, 0.83129], + "184": [0.17014, 0, 0, 0, 0.46], + "198": [0, 0.68333, 0.12028, 0, 0.88277], + "216": [0.04861, 0.73194, 0.09403, 0, 0.76666], + "223": [0.19444, 0.69444, 0.10514, 0, 0.53666], + "230": [0, 0.43056, 0.07514, 0, 0.71555], + "248": [0.09722, 0.52778, 0.09194, 0, 0.51111], + "338": [0, 0.68333, 0.12028, 0, 0.98499], + "339": [0, 0.43056, 0.07514, 0, 0.71555], + "710": [0, 0.69444, 0.06646, 0, 0.51111], + "711": [0, 0.62847, 0.08295, 0, 0.51111], + "713": [0, 0.56167, 0.10333, 0, 0.51111], + "714": [0, 0.69444, 0.09694, 0, 0.51111], + "715": [0, 0.69444, 0, 0, 0.51111], + "728": [0, 0.69444, 0.10806, 0, 0.51111], + "729": [0, 0.66786, 0.11752, 0, 0.30667], + "730": [0, 0.69444, 0, 0, 0.83129], + "732": [0, 0.66786, 0.11585, 0, 0.51111], + "733": [0, 0.69444, 0.1225, 0, 0.51111], + "915": [0, 0.68333, 0.13305, 0, 0.62722], + "916": [0, 0.68333, 0, 0, 0.81777], + "920": [0, 0.68333, 0.09403, 0, 0.76666], + "923": [0, 0.68333, 0, 0, 0.69222], + "926": [0, 0.68333, 0.15294, 0, 0.66444], + "928": [0, 0.68333, 0.16389, 0, 0.74333], + "931": [0, 0.68333, 0.12028, 0, 0.71555], + "933": [0, 0.68333, 0.11111, 0, 0.76666], + "934": [0, 0.68333, 0.05986, 0, 0.71555], + "936": [0, 0.68333, 0.11111, 0, 0.76666], + "937": [0, 0.68333, 0.10257, 0, 0.71555], + "8211": [0, 0.43056, 0.09208, 0, 0.51111], + "8212": [0, 0.43056, 0.09208, 0, 1.02222], + "8216": [0, 0.69444, 0.12417, 0, 0.30667], + "8217": [0, 0.69444, 0.12417, 0, 0.30667], + "8220": [0, 0.69444, 0.1685, 0, 0.51444], + "8221": [0, 0.69444, 0.06961, 0, 0.51444], + "8463": [0, 0.68889, 0, 0, 0.54028] + }, + "Main-Regular": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.27778], + "34": [0, 0.69444, 0, 0, 0.5], + "35": [0.19444, 0.69444, 0, 0, 0.83334], + "36": [0.05556, 0.75, 0, 0, 0.5], + "37": [0.05556, 0.75, 0, 0, 0.83334], + "38": [0, 0.69444, 0, 0, 0.77778], + "39": [0, 0.69444, 0, 0, 0.27778], + "40": [0.25, 0.75, 0, 0, 0.38889], + "41": [0.25, 0.75, 0, 0, 0.38889], + "42": [0, 0.75, 0, 0, 0.5], + "43": [0.08333, 0.58333, 0, 0, 0.77778], + "44": [0.19444, 0.10556, 0, 0, 0.27778], + "45": [0, 0.43056, 0, 0, 0.33333], + "46": [0, 0.10556, 0, 0, 0.27778], + "47": [0.25, 0.75, 0, 0, 0.5], + "48": [0, 0.64444, 0, 0, 0.5], + "49": [0, 0.64444, 0, 0, 0.5], + "50": [0, 0.64444, 0, 0, 0.5], + "51": [0, 0.64444, 0, 0, 0.5], + "52": [0, 0.64444, 0, 0, 0.5], + "53": [0, 0.64444, 0, 0, 0.5], + "54": [0, 0.64444, 0, 0, 0.5], + "55": [0, 0.64444, 0, 0, 0.5], + "56": [0, 0.64444, 0, 0, 0.5], + "57": [0, 0.64444, 0, 0, 0.5], + "58": [0, 0.43056, 0, 0, 0.27778], + "59": [0.19444, 0.43056, 0, 0, 0.27778], + "60": [0.0391, 0.5391, 0, 0, 0.77778], + "61": [-0.13313, 0.36687, 0, 0, 0.77778], + "62": [0.0391, 0.5391, 0, 0, 0.77778], + "63": [0, 0.69444, 0, 0, 0.47222], + "64": [0, 0.69444, 0, 0, 0.77778], + "65": [0, 0.68333, 0, 0, 0.75], + "66": [0, 0.68333, 0, 0, 0.70834], + "67": [0, 0.68333, 0, 0, 0.72222], + "68": [0, 0.68333, 0, 0, 0.76389], + "69": [0, 0.68333, 0, 0, 0.68056], + "70": [0, 0.68333, 0, 0, 0.65278], + "71": [0, 0.68333, 0, 0, 0.78472], + "72": [0, 0.68333, 0, 0, 0.75], + "73": [0, 0.68333, 0, 0, 0.36111], + "74": [0, 0.68333, 0, 0, 0.51389], + "75": [0, 0.68333, 0, 0, 0.77778], + "76": [0, 0.68333, 0, 0, 0.625], + "77": [0, 0.68333, 0, 0, 0.91667], + "78": [0, 0.68333, 0, 0, 0.75], + "79": [0, 0.68333, 0, 0, 0.77778], + "80": [0, 0.68333, 0, 0, 0.68056], + "81": [0.19444, 0.68333, 0, 0, 0.77778], + "82": [0, 0.68333, 0, 0, 0.73611], + "83": [0, 0.68333, 0, 0, 0.55556], + "84": [0, 0.68333, 0, 0, 0.72222], + "85": [0, 0.68333, 0, 0, 0.75], + "86": [0, 0.68333, 0.01389, 0, 0.75], + "87": [0, 0.68333, 0.01389, 0, 1.02778], + "88": [0, 0.68333, 0, 0, 0.75], + "89": [0, 0.68333, 0.025, 0, 0.75], + "90": [0, 0.68333, 0, 0, 0.61111], + "91": [0.25, 0.75, 0, 0, 0.27778], + "92": [0.25, 0.75, 0, 0, 0.5], + "93": [0.25, 0.75, 0, 0, 0.27778], + "94": [0, 0.69444, 0, 0, 0.5], + "95": [0.31, 0.12056, 0.02778, 0, 0.5], + "97": [0, 0.43056, 0, 0, 0.5], + "98": [0, 0.69444, 0, 0, 0.55556], + "99": [0, 0.43056, 0, 0, 0.44445], + "100": [0, 0.69444, 0, 0, 0.55556], + "101": [0, 0.43056, 0, 0, 0.44445], + "102": [0, 0.69444, 0.07778, 0, 0.30556], + "103": [0.19444, 0.43056, 0.01389, 0, 0.5], + "104": [0, 0.69444, 0, 0, 0.55556], + "105": [0, 0.66786, 0, 0, 0.27778], + "106": [0.19444, 0.66786, 0, 0, 0.30556], + "107": [0, 0.69444, 0, 0, 0.52778], + "108": [0, 0.69444, 0, 0, 0.27778], + "109": [0, 0.43056, 0, 0, 0.83334], + "110": [0, 0.43056, 0, 0, 0.55556], + "111": [0, 0.43056, 0, 0, 0.5], + "112": [0.19444, 0.43056, 0, 0, 0.55556], + "113": [0.19444, 0.43056, 0, 0, 0.52778], + "114": [0, 0.43056, 0, 0, 0.39167], + "115": [0, 0.43056, 0, 0, 0.39445], + "116": [0, 0.61508, 0, 0, 0.38889], + "117": [0, 0.43056, 0, 0, 0.55556], + "118": [0, 0.43056, 0.01389, 0, 0.52778], + "119": [0, 0.43056, 0.01389, 0, 0.72222], + "120": [0, 0.43056, 0, 0, 0.52778], + "121": [0.19444, 0.43056, 0.01389, 0, 0.52778], + "122": [0, 0.43056, 0, 0, 0.44445], + "123": [0.25, 0.75, 0, 0, 0.5], + "124": [0.25, 0.75, 0, 0, 0.27778], + "125": [0.25, 0.75, 0, 0, 0.5], + "126": [0.35, 0.31786, 0, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], + "163": [0, 0.69444, 0, 0, 0.76909], + "167": [0.19444, 0.69444, 0, 0, 0.44445], + "168": [0, 0.66786, 0, 0, 0.5], + "172": [0, 0.43056, 0, 0, 0.66667], + "176": [0, 0.69444, 0, 0, 0.75], + "177": [0.08333, 0.58333, 0, 0, 0.77778], + "182": [0.19444, 0.69444, 0, 0, 0.61111], + "184": [0.17014, 0, 0, 0, 0.44445], + "198": [0, 0.68333, 0, 0, 0.90278], + "215": [0.08333, 0.58333, 0, 0, 0.77778], + "216": [0.04861, 0.73194, 0, 0, 0.77778], + "223": [0, 0.69444, 0, 0, 0.5], + "230": [0, 0.43056, 0, 0, 0.72222], + "247": [0.08333, 0.58333, 0, 0, 0.77778], + "248": [0.09722, 0.52778, 0, 0, 0.5], + "305": [0, 0.43056, 0, 0, 0.27778], + "338": [0, 0.68333, 0, 0, 1.01389], + "339": [0, 0.43056, 0, 0, 0.77778], + "567": [0.19444, 0.43056, 0, 0, 0.30556], + "710": [0, 0.69444, 0, 0, 0.5], + "711": [0, 0.62847, 0, 0, 0.5], + "713": [0, 0.56778, 0, 0, 0.5], + "714": [0, 0.69444, 0, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0, 0, 0.5], + "729": [0, 0.66786, 0, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.75], + "732": [0, 0.66786, 0, 0, 0.5], + "733": [0, 0.69444, 0, 0, 0.5], + "915": [0, 0.68333, 0, 0, 0.625], + "916": [0, 0.68333, 0, 0, 0.83334], + "920": [0, 0.68333, 0, 0, 0.77778], + "923": [0, 0.68333, 0, 0, 0.69445], + "926": [0, 0.68333, 0, 0, 0.66667], + "928": [0, 0.68333, 0, 0, 0.75], + "931": [0, 0.68333, 0, 0, 0.72222], + "933": [0, 0.68333, 0, 0, 0.77778], + "934": [0, 0.68333, 0, 0, 0.72222], + "936": [0, 0.68333, 0, 0, 0.77778], + "937": [0, 0.68333, 0, 0, 0.72222], + "8211": [0, 0.43056, 0.02778, 0, 0.5], + "8212": [0, 0.43056, 0.02778, 0, 1.0], + "8216": [0, 0.69444, 0, 0, 0.27778], + "8217": [0, 0.69444, 0, 0, 0.27778], + "8220": [0, 0.69444, 0, 0, 0.5], + "8221": [0, 0.69444, 0, 0, 0.5], + "8224": [0.19444, 0.69444, 0, 0, 0.44445], + "8225": [0.19444, 0.69444, 0, 0, 0.44445], + "8230": [0, 0.12, 0, 0, 1.172], + "8242": [0, 0.55556, 0, 0, 0.275], + "8407": [0, 0.71444, 0.15382, 0, 0.5], + "8463": [0, 0.68889, 0, 0, 0.54028], + "8465": [0, 0.69444, 0, 0, 0.72222], + "8467": [0, 0.69444, 0, 0.11111, 0.41667], + "8472": [0.19444, 0.43056, 0, 0.11111, 0.63646], + "8476": [0, 0.69444, 0, 0, 0.72222], + "8501": [0, 0.69444, 0, 0, 0.61111], + "8592": [-0.13313, 0.36687, 0, 0, 1.0], + "8593": [0.19444, 0.69444, 0, 0, 0.5], + "8594": [-0.13313, 0.36687, 0, 0, 1.0], + "8595": [0.19444, 0.69444, 0, 0, 0.5], + "8596": [-0.13313, 0.36687, 0, 0, 1.0], + "8597": [0.25, 0.75, 0, 0, 0.5], + "8598": [0.19444, 0.69444, 0, 0, 1.0], + "8599": [0.19444, 0.69444, 0, 0, 1.0], + "8600": [0.19444, 0.69444, 0, 0, 1.0], + "8601": [0.19444, 0.69444, 0, 0, 1.0], + "8614": [0.011, 0.511, 0, 0, 1.0], + "8617": [0.011, 0.511, 0, 0, 1.126], + "8618": [0.011, 0.511, 0, 0, 1.126], + "8636": [-0.13313, 0.36687, 0, 0, 1.0], + "8637": [-0.13313, 0.36687, 0, 0, 1.0], + "8640": [-0.13313, 0.36687, 0, 0, 1.0], + "8641": [-0.13313, 0.36687, 0, 0, 1.0], + "8652": [0.011, 0.671, 0, 0, 1.0], + "8656": [-0.13313, 0.36687, 0, 0, 1.0], + "8657": [0.19444, 0.69444, 0, 0, 0.61111], + "8658": [-0.13313, 0.36687, 0, 0, 1.0], + "8659": [0.19444, 0.69444, 0, 0, 0.61111], + "8660": [-0.13313, 0.36687, 0, 0, 1.0], + "8661": [0.25, 0.75, 0, 0, 0.61111], + "8704": [0, 0.69444, 0, 0, 0.55556], + "8706": [0, 0.69444, 0.05556, 0.08334, 0.5309], + "8707": [0, 0.69444, 0, 0, 0.55556], + "8709": [0.05556, 0.75, 0, 0, 0.5], + "8711": [0, 0.68333, 0, 0, 0.83334], + "8712": [0.0391, 0.5391, 0, 0, 0.66667], + "8715": [0.0391, 0.5391, 0, 0, 0.66667], + "8722": [0.08333, 0.58333, 0, 0, 0.77778], + "8723": [0.08333, 0.58333, 0, 0, 0.77778], + "8725": [0.25, 0.75, 0, 0, 0.5], + "8726": [0.25, 0.75, 0, 0, 0.5], + "8727": [-0.03472, 0.46528, 0, 0, 0.5], + "8728": [-0.05555, 0.44445, 0, 0, 0.5], + "8729": [-0.05555, 0.44445, 0, 0, 0.5], + "8730": [0.2, 0.8, 0, 0, 0.83334], + "8733": [0, 0.43056, 0, 0, 0.77778], + "8734": [0, 0.43056, 0, 0, 1.0], + "8736": [0, 0.69224, 0, 0, 0.72222], + "8739": [0.25, 0.75, 0, 0, 0.27778], + "8741": [0.25, 0.75, 0, 0, 0.5], + "8743": [0, 0.55556, 0, 0, 0.66667], + "8744": [0, 0.55556, 0, 0, 0.66667], + "8745": [0, 0.55556, 0, 0, 0.66667], + "8746": [0, 0.55556, 0, 0, 0.66667], + "8747": [0.19444, 0.69444, 0.11111, 0, 0.41667], + "8764": [-0.13313, 0.36687, 0, 0, 0.77778], + "8768": [0.19444, 0.69444, 0, 0, 0.27778], + "8771": [-0.03625, 0.46375, 0, 0, 0.77778], + "8773": [-0.022, 0.589, 0, 0, 1.0], + "8776": [-0.01688, 0.48312, 0, 0, 0.77778], + "8781": [-0.03625, 0.46375, 0, 0, 0.77778], + "8784": [-0.133, 0.67, 0, 0, 0.778], + "8801": [-0.03625, 0.46375, 0, 0, 0.77778], + "8804": [0.13597, 0.63597, 0, 0, 0.77778], + "8805": [0.13597, 0.63597, 0, 0, 0.77778], + "8810": [0.0391, 0.5391, 0, 0, 1.0], + "8811": [0.0391, 0.5391, 0, 0, 1.0], + "8826": [0.0391, 0.5391, 0, 0, 0.77778], + "8827": [0.0391, 0.5391, 0, 0, 0.77778], + "8834": [0.0391, 0.5391, 0, 0, 0.77778], + "8835": [0.0391, 0.5391, 0, 0, 0.77778], + "8838": [0.13597, 0.63597, 0, 0, 0.77778], + "8839": [0.13597, 0.63597, 0, 0, 0.77778], + "8846": [0, 0.55556, 0, 0, 0.66667], + "8849": [0.13597, 0.63597, 0, 0, 0.77778], + "8850": [0.13597, 0.63597, 0, 0, 0.77778], + "8851": [0, 0.55556, 0, 0, 0.66667], + "8852": [0, 0.55556, 0, 0, 0.66667], + "8853": [0.08333, 0.58333, 0, 0, 0.77778], + "8854": [0.08333, 0.58333, 0, 0, 0.77778], + "8855": [0.08333, 0.58333, 0, 0, 0.77778], + "8856": [0.08333, 0.58333, 0, 0, 0.77778], + "8857": [0.08333, 0.58333, 0, 0, 0.77778], + "8866": [0, 0.69444, 0, 0, 0.61111], + "8867": [0, 0.69444, 0, 0, 0.61111], + "8868": [0, 0.69444, 0, 0, 0.77778], + "8869": [0, 0.69444, 0, 0, 0.77778], + "8872": [0.249, 0.75, 0, 0, 0.867], + "8900": [-0.05555, 0.44445, 0, 0, 0.5], + "8901": [-0.05555, 0.44445, 0, 0, 0.27778], + "8902": [-0.03472, 0.46528, 0, 0, 0.5], + "8904": [0.005, 0.505, 0, 0, 0.9], + "8942": [0.03, 0.9, 0, 0, 0.278], + "8943": [-0.19, 0.31, 0, 0, 1.172], + "8945": [-0.1, 0.82, 0, 0, 1.282], + "8968": [0.25, 0.75, 0, 0, 0.44445], + "8969": [0.25, 0.75, 0, 0, 0.44445], + "8970": [0.25, 0.75, 0, 0, 0.44445], + "8971": [0.25, 0.75, 0, 0, 0.44445], + "8994": [-0.14236, 0.35764, 0, 0, 1.0], + "8995": [-0.14236, 0.35764, 0, 0, 1.0], + "9136": [0.244, 0.744, 0, 0, 0.412], + "9137": [0.244, 0.744, 0, 0, 0.412], + "9651": [0.19444, 0.69444, 0, 0, 0.88889], + "9657": [-0.03472, 0.46528, 0, 0, 0.5], + "9661": [0.19444, 0.69444, 0, 0, 0.88889], + "9667": [-0.03472, 0.46528, 0, 0, 0.5], + "9711": [0.19444, 0.69444, 0, 0, 1.0], + "9824": [0.12963, 0.69444, 0, 0, 0.77778], + "9825": [0.12963, 0.69444, 0, 0, 0.77778], + "9826": [0.12963, 0.69444, 0, 0, 0.77778], + "9827": [0.12963, 0.69444, 0, 0, 0.77778], + "9837": [0, 0.75, 0, 0, 0.38889], + "9838": [0.19444, 0.69444, 0, 0, 0.38889], + "9839": [0.19444, 0.69444, 0, 0, 0.38889], + "10216": [0.25, 0.75, 0, 0, 0.38889], + "10217": [0.25, 0.75, 0, 0, 0.38889], + "10222": [0.244, 0.744, 0, 0, 0.412], + "10223": [0.244, 0.744, 0, 0, 0.412], + "10229": [0.011, 0.511, 0, 0, 1.609], + "10230": [0.011, 0.511, 0, 0, 1.638], + "10231": [0.011, 0.511, 0, 0, 1.859], + "10232": [0.024, 0.525, 0, 0, 1.609], + "10233": [0.024, 0.525, 0, 0, 1.638], + "10234": [0.024, 0.525, 0, 0, 1.858], + "10236": [0.011, 0.511, 0, 0, 1.638], + "10815": [0, 0.68333, 0, 0, 0.75], + "10927": [0.13597, 0.63597, 0, 0, 0.77778], + "10928": [0.13597, 0.63597, 0, 0, 0.77778], + "57376": [0.19444, 0.69444, 0, 0, 0] + }, + "Math-BoldItalic": { + "32": [0, 0, 0, 0, 0.25], + "48": [0, 0.44444, 0, 0, 0.575], + "49": [0, 0.44444, 0, 0, 0.575], + "50": [0, 0.44444, 0, 0, 0.575], + "51": [0.19444, 0.44444, 0, 0, 0.575], + "52": [0.19444, 0.44444, 0, 0, 0.575], + "53": [0.19444, 0.44444, 0, 0, 0.575], + "54": [0, 0.64444, 0, 0, 0.575], + "55": [0.19444, 0.44444, 0, 0, 0.575], + "56": [0, 0.64444, 0, 0, 0.575], + "57": [0.19444, 0.44444, 0, 0, 0.575], + "65": [0, 0.68611, 0, 0, 0.86944], + "66": [0, 0.68611, 0.04835, 0, 0.8664], + "67": [0, 0.68611, 0.06979, 0, 0.81694], + "68": [0, 0.68611, 0.03194, 0, 0.93812], + "69": [0, 0.68611, 0.05451, 0, 0.81007], + "70": [0, 0.68611, 0.15972, 0, 0.68889], + "71": [0, 0.68611, 0, 0, 0.88673], + "72": [0, 0.68611, 0.08229, 0, 0.98229], + "73": [0, 0.68611, 0.07778, 0, 0.51111], + "74": [0, 0.68611, 0.10069, 0, 0.63125], + "75": [0, 0.68611, 0.06979, 0, 0.97118], + "76": [0, 0.68611, 0, 0, 0.75555], + "77": [0, 0.68611, 0.11424, 0, 1.14201], + "78": [0, 0.68611, 0.11424, 0, 0.95034], + "79": [0, 0.68611, 0.03194, 0, 0.83666], + "80": [0, 0.68611, 0.15972, 0, 0.72309], + "81": [0.19444, 0.68611, 0, 0, 0.86861], + "82": [0, 0.68611, 0.00421, 0, 0.87235], + "83": [0, 0.68611, 0.05382, 0, 0.69271], + "84": [0, 0.68611, 0.15972, 0, 0.63663], + "85": [0, 0.68611, 0.11424, 0, 0.80027], + "86": [0, 0.68611, 0.25555, 0, 0.67778], + "87": [0, 0.68611, 0.15972, 0, 1.09305], + "88": [0, 0.68611, 0.07778, 0, 0.94722], + "89": [0, 0.68611, 0.25555, 0, 0.67458], + "90": [0, 0.68611, 0.06979, 0, 0.77257], + "97": [0, 0.44444, 0, 0, 0.63287], + "98": [0, 0.69444, 0, 0, 0.52083], + "99": [0, 0.44444, 0, 0, 0.51342], + "100": [0, 0.69444, 0, 0, 0.60972], + "101": [0, 0.44444, 0, 0, 0.55361], + "102": [0.19444, 0.69444, 0.11042, 0, 0.56806], + "103": [0.19444, 0.44444, 0.03704, 0, 0.5449], + "104": [0, 0.69444, 0, 0, 0.66759], + "105": [0, 0.69326, 0, 0, 0.4048], + "106": [0.19444, 0.69326, 0.0622, 0, 0.47083], + "107": [0, 0.69444, 0.01852, 0, 0.6037], + "108": [0, 0.69444, 0.0088, 0, 0.34815], + "109": [0, 0.44444, 0, 0, 1.0324], + "110": [0, 0.44444, 0, 0, 0.71296], + "111": [0, 0.44444, 0, 0, 0.58472], + "112": [0.19444, 0.44444, 0, 0, 0.60092], + "113": [0.19444, 0.44444, 0.03704, 0, 0.54213], + "114": [0, 0.44444, 0.03194, 0, 0.5287], + "115": [0, 0.44444, 0, 0, 0.53125], + "116": [0, 0.63492, 0, 0, 0.41528], + "117": [0, 0.44444, 0, 0, 0.68102], + "118": [0, 0.44444, 0.03704, 0, 0.56666], + "119": [0, 0.44444, 0.02778, 0, 0.83148], + "120": [0, 0.44444, 0, 0, 0.65903], + "121": [0.19444, 0.44444, 0.03704, 0, 0.59028], + "122": [0, 0.44444, 0.04213, 0, 0.55509], + "160": [0, 0, 0, 0, 0.25], + "915": [0, 0.68611, 0.15972, 0, 0.65694], + "916": [0, 0.68611, 0, 0, 0.95833], + "920": [0, 0.68611, 0.03194, 0, 0.86722], + "923": [0, 0.68611, 0, 0, 0.80555], + "926": [0, 0.68611, 0.07458, 0, 0.84125], + "928": [0, 0.68611, 0.08229, 0, 0.98229], + "931": [0, 0.68611, 0.05451, 0, 0.88507], + "933": [0, 0.68611, 0.15972, 0, 0.67083], + "934": [0, 0.68611, 0, 0, 0.76666], + "936": [0, 0.68611, 0.11653, 0, 0.71402], + "937": [0, 0.68611, 0.04835, 0, 0.8789], + "945": [0, 0.44444, 0, 0, 0.76064], + "946": [0.19444, 0.69444, 0.03403, 0, 0.65972], + "947": [0.19444, 0.44444, 0.06389, 0, 0.59003], + "948": [0, 0.69444, 0.03819, 0, 0.52222], + "949": [0, 0.44444, 0, 0, 0.52882], + "950": [0.19444, 0.69444, 0.06215, 0, 0.50833], + "951": [0.19444, 0.44444, 0.03704, 0, 0.6], + "952": [0, 0.69444, 0.03194, 0, 0.5618], + "953": [0, 0.44444, 0, 0, 0.41204], + "954": [0, 0.44444, 0, 0, 0.66759], + "955": [0, 0.69444, 0, 0, 0.67083], + "956": [0.19444, 0.44444, 0, 0, 0.70787], + "957": [0, 0.44444, 0.06898, 0, 0.57685], + "958": [0.19444, 0.69444, 0.03021, 0, 0.50833], + "959": [0, 0.44444, 0, 0, 0.58472], + "960": [0, 0.44444, 0.03704, 0, 0.68241], + "961": [0.19444, 0.44444, 0, 0, 0.6118], + "962": [0.09722, 0.44444, 0.07917, 0, 0.42361], + "963": [0, 0.44444, 0.03704, 0, 0.68588], + "964": [0, 0.44444, 0.13472, 0, 0.52083], + "965": [0, 0.44444, 0.03704, 0, 0.63055], + "966": [0.19444, 0.44444, 0, 0, 0.74722], + "967": [0.19444, 0.44444, 0, 0, 0.71805], + "968": [0.19444, 0.69444, 0.03704, 0, 0.75833], + "969": [0, 0.44444, 0.03704, 0, 0.71782], + "977": [0, 0.69444, 0, 0, 0.69155], + "981": [0.19444, 0.69444, 0, 0, 0.7125], + "982": [0, 0.44444, 0.03194, 0, 0.975], + "1009": [0.19444, 0.44444, 0, 0, 0.6118], + "1013": [0, 0.44444, 0, 0, 0.48333], + "57649": [0, 0.44444, 0, 0, 0.39352], + "57911": [0.19444, 0.44444, 0, 0, 0.43889] + }, + "Math-Italic": { + "32": [0, 0, 0, 0, 0.25], + "48": [0, 0.43056, 0, 0, 0.5], + "49": [0, 0.43056, 0, 0, 0.5], + "50": [0, 0.43056, 0, 0, 0.5], + "51": [0.19444, 0.43056, 0, 0, 0.5], + "52": [0.19444, 0.43056, 0, 0, 0.5], + "53": [0.19444, 0.43056, 0, 0, 0.5], + "54": [0, 0.64444, 0, 0, 0.5], + "55": [0.19444, 0.43056, 0, 0, 0.5], + "56": [0, 0.64444, 0, 0, 0.5], + "57": [0.19444, 0.43056, 0, 0, 0.5], + "65": [0, 0.68333, 0, 0.13889, 0.75], + "66": [0, 0.68333, 0.05017, 0.08334, 0.75851], + "67": [0, 0.68333, 0.07153, 0.08334, 0.71472], + "68": [0, 0.68333, 0.02778, 0.05556, 0.82792], + "69": [0, 0.68333, 0.05764, 0.08334, 0.7382], + "70": [0, 0.68333, 0.13889, 0.08334, 0.64306], + "71": [0, 0.68333, 0, 0.08334, 0.78625], + "72": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "73": [0, 0.68333, 0.07847, 0.11111, 0.43958], + "74": [0, 0.68333, 0.09618, 0.16667, 0.55451], + "75": [0, 0.68333, 0.07153, 0.05556, 0.84931], + "76": [0, 0.68333, 0, 0.02778, 0.68056], + "77": [0, 0.68333, 0.10903, 0.08334, 0.97014], + "78": [0, 0.68333, 0.10903, 0.08334, 0.80347], + "79": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "80": [0, 0.68333, 0.13889, 0.08334, 0.64201], + "81": [0.19444, 0.68333, 0, 0.08334, 0.79056], + "82": [0, 0.68333, 0.00773, 0.08334, 0.75929], + "83": [0, 0.68333, 0.05764, 0.08334, 0.6132], + "84": [0, 0.68333, 0.13889, 0.08334, 0.58438], + "85": [0, 0.68333, 0.10903, 0.02778, 0.68278], + "86": [0, 0.68333, 0.22222, 0, 0.58333], + "87": [0, 0.68333, 0.13889, 0, 0.94445], + "88": [0, 0.68333, 0.07847, 0.08334, 0.82847], + "89": [0, 0.68333, 0.22222, 0, 0.58056], + "90": [0, 0.68333, 0.07153, 0.08334, 0.68264], + "97": [0, 0.43056, 0, 0, 0.52859], + "98": [0, 0.69444, 0, 0, 0.42917], + "99": [0, 0.43056, 0, 0.05556, 0.43276], + "100": [0, 0.69444, 0, 0.16667, 0.52049], + "101": [0, 0.43056, 0, 0.05556, 0.46563], + "102": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959], + "103": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697], + "104": [0, 0.69444, 0, 0, 0.57616], + "105": [0, 0.65952, 0, 0, 0.34451], + "106": [0.19444, 0.65952, 0.05724, 0, 0.41181], + "107": [0, 0.69444, 0.03148, 0, 0.5206], + "108": [0, 0.69444, 0.01968, 0.08334, 0.29838], + "109": [0, 0.43056, 0, 0, 0.87801], + "110": [0, 0.43056, 0, 0, 0.60023], + "111": [0, 0.43056, 0, 0.05556, 0.48472], + "112": [0.19444, 0.43056, 0, 0.08334, 0.50313], + "113": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641], + "114": [0, 0.43056, 0.02778, 0.05556, 0.45116], + "115": [0, 0.43056, 0, 0.05556, 0.46875], + "116": [0, 0.61508, 0, 0.08334, 0.36111], + "117": [0, 0.43056, 0, 0.02778, 0.57246], + "118": [0, 0.43056, 0.03588, 0.02778, 0.48472], + "119": [0, 0.43056, 0.02691, 0.08334, 0.71592], + "120": [0, 0.43056, 0, 0.02778, 0.57153], + "121": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028], + "122": [0, 0.43056, 0.04398, 0.05556, 0.46505], + "160": [0, 0, 0, 0, 0.25], + "915": [0, 0.68333, 0.13889, 0.08334, 0.61528], + "916": [0, 0.68333, 0, 0.16667, 0.83334], + "920": [0, 0.68333, 0.02778, 0.08334, 0.76278], + "923": [0, 0.68333, 0, 0.16667, 0.69445], + "926": [0, 0.68333, 0.07569, 0.08334, 0.74236], + "928": [0, 0.68333, 0.08125, 0.05556, 0.83125], + "931": [0, 0.68333, 0.05764, 0.08334, 0.77986], + "933": [0, 0.68333, 0.13889, 0.05556, 0.58333], + "934": [0, 0.68333, 0, 0.08334, 0.66667], + "936": [0, 0.68333, 0.11, 0.05556, 0.61222], + "937": [0, 0.68333, 0.05017, 0.08334, 0.7724], + "945": [0, 0.43056, 0.0037, 0.02778, 0.6397], + "946": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563], + "947": [0.19444, 0.43056, 0.05556, 0, 0.51773], + "948": [0, 0.69444, 0.03785, 0.05556, 0.44444], + "949": [0, 0.43056, 0, 0.08334, 0.46632], + "950": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375], + "951": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653], + "952": [0, 0.69444, 0.02778, 0.08334, 0.46944], + "953": [0, 0.43056, 0, 0.05556, 0.35394], + "954": [0, 0.43056, 0, 0, 0.57616], + "955": [0, 0.69444, 0, 0, 0.58334], + "956": [0.19444, 0.43056, 0, 0.02778, 0.60255], + "957": [0, 0.43056, 0.06366, 0.02778, 0.49398], + "958": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375], + "959": [0, 0.43056, 0, 0.05556, 0.48472], + "960": [0, 0.43056, 0.03588, 0, 0.57003], + "961": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "962": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285], + "963": [0, 0.43056, 0.03588, 0, 0.57141], + "964": [0, 0.43056, 0.1132, 0.02778, 0.43715], + "965": [0, 0.43056, 0.03588, 0.02778, 0.54028], + "966": [0.19444, 0.43056, 0, 0.08334, 0.65417], + "967": [0.19444, 0.43056, 0, 0.05556, 0.62569], + "968": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139], + "969": [0, 0.43056, 0.03588, 0, 0.62245], + "977": [0, 0.69444, 0, 0.08334, 0.59144], + "981": [0.19444, 0.69444, 0, 0.08334, 0.59583], + "982": [0, 0.43056, 0.02778, 0, 0.82813], + "1009": [0.19444, 0.43056, 0, 0.08334, 0.51702], + "1013": [0, 0.43056, 0, 0.05556, 0.4059], + "57649": [0, 0.43056, 0, 0.02778, 0.32246], + "57911": [0.19444, 0.43056, 0, 0.08334, 0.38403] + }, + "SansSerif-Bold": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.36667], + "34": [0, 0.69444, 0, 0, 0.55834], + "35": [0.19444, 0.69444, 0, 0, 0.91667], + "36": [0.05556, 0.75, 0, 0, 0.55], + "37": [0.05556, 0.75, 0, 0, 1.02912], + "38": [0, 0.69444, 0, 0, 0.83056], + "39": [0, 0.69444, 0, 0, 0.30556], + "40": [0.25, 0.75, 0, 0, 0.42778], + "41": [0.25, 0.75, 0, 0, 0.42778], + "42": [0, 0.75, 0, 0, 0.55], + "43": [0.11667, 0.61667, 0, 0, 0.85556], + "44": [0.10556, 0.13056, 0, 0, 0.30556], + "45": [0, 0.45833, 0, 0, 0.36667], + "46": [0, 0.13056, 0, 0, 0.30556], + "47": [0.25, 0.75, 0, 0, 0.55], + "48": [0, 0.69444, 0, 0, 0.55], + "49": [0, 0.69444, 0, 0, 0.55], + "50": [0, 0.69444, 0, 0, 0.55], + "51": [0, 0.69444, 0, 0, 0.55], + "52": [0, 0.69444, 0, 0, 0.55], + "53": [0, 0.69444, 0, 0, 0.55], + "54": [0, 0.69444, 0, 0, 0.55], + "55": [0, 0.69444, 0, 0, 0.55], + "56": [0, 0.69444, 0, 0, 0.55], + "57": [0, 0.69444, 0, 0, 0.55], + "58": [0, 0.45833, 0, 0, 0.30556], + "59": [0.10556, 0.45833, 0, 0, 0.30556], + "61": [-0.09375, 0.40625, 0, 0, 0.85556], + "63": [0, 0.69444, 0, 0, 0.51945], + "64": [0, 0.69444, 0, 0, 0.73334], + "65": [0, 0.69444, 0, 0, 0.73334], + "66": [0, 0.69444, 0, 0, 0.73334], + "67": [0, 0.69444, 0, 0, 0.70278], + "68": [0, 0.69444, 0, 0, 0.79445], + "69": [0, 0.69444, 0, 0, 0.64167], + "70": [0, 0.69444, 0, 0, 0.61111], + "71": [0, 0.69444, 0, 0, 0.73334], + "72": [0, 0.69444, 0, 0, 0.79445], + "73": [0, 0.69444, 0, 0, 0.33056], + "74": [0, 0.69444, 0, 0, 0.51945], + "75": [0, 0.69444, 0, 0, 0.76389], + "76": [0, 0.69444, 0, 0, 0.58056], + "77": [0, 0.69444, 0, 0, 0.97778], + "78": [0, 0.69444, 0, 0, 0.79445], + "79": [0, 0.69444, 0, 0, 0.79445], + "80": [0, 0.69444, 0, 0, 0.70278], + "81": [0.10556, 0.69444, 0, 0, 0.79445], + "82": [0, 0.69444, 0, 0, 0.70278], + "83": [0, 0.69444, 0, 0, 0.61111], + "84": [0, 0.69444, 0, 0, 0.73334], + "85": [0, 0.69444, 0, 0, 0.76389], + "86": [0, 0.69444, 0.01528, 0, 0.73334], + "87": [0, 0.69444, 0.01528, 0, 1.03889], + "88": [0, 0.69444, 0, 0, 0.73334], + "89": [0, 0.69444, 0.0275, 0, 0.73334], + "90": [0, 0.69444, 0, 0, 0.67223], + "91": [0.25, 0.75, 0, 0, 0.34306], + "93": [0.25, 0.75, 0, 0, 0.34306], + "94": [0, 0.69444, 0, 0, 0.55], + "95": [0.35, 0.10833, 0.03056, 0, 0.55], + "97": [0, 0.45833, 0, 0, 0.525], + "98": [0, 0.69444, 0, 0, 0.56111], + "99": [0, 0.45833, 0, 0, 0.48889], + "100": [0, 0.69444, 0, 0, 0.56111], + "101": [0, 0.45833, 0, 0, 0.51111], + "102": [0, 0.69444, 0.07639, 0, 0.33611], + "103": [0.19444, 0.45833, 0.01528, 0, 0.55], + "104": [0, 0.69444, 0, 0, 0.56111], + "105": [0, 0.69444, 0, 0, 0.25556], + "106": [0.19444, 0.69444, 0, 0, 0.28611], + "107": [0, 0.69444, 0, 0, 0.53056], + "108": [0, 0.69444, 0, 0, 0.25556], + "109": [0, 0.45833, 0, 0, 0.86667], + "110": [0, 0.45833, 0, 0, 0.56111], + "111": [0, 0.45833, 0, 0, 0.55], + "112": [0.19444, 0.45833, 0, 0, 0.56111], + "113": [0.19444, 0.45833, 0, 0, 0.56111], + "114": [0, 0.45833, 0.01528, 0, 0.37222], + "115": [0, 0.45833, 0, 0, 0.42167], + "116": [0, 0.58929, 0, 0, 0.40417], + "117": [0, 0.45833, 0, 0, 0.56111], + "118": [0, 0.45833, 0.01528, 0, 0.5], + "119": [0, 0.45833, 0.01528, 0, 0.74445], + "120": [0, 0.45833, 0, 0, 0.5], + "121": [0.19444, 0.45833, 0.01528, 0, 0.5], + "122": [0, 0.45833, 0, 0, 0.47639], + "126": [0.35, 0.34444, 0, 0, 0.55], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.69444, 0, 0, 0.55], + "176": [0, 0.69444, 0, 0, 0.73334], + "180": [0, 0.69444, 0, 0, 0.55], + "184": [0.17014, 0, 0, 0, 0.48889], + "305": [0, 0.45833, 0, 0, 0.25556], + "567": [0.19444, 0.45833, 0, 0, 0.28611], + "710": [0, 0.69444, 0, 0, 0.55], + "711": [0, 0.63542, 0, 0, 0.55], + "713": [0, 0.63778, 0, 0, 0.55], + "728": [0, 0.69444, 0, 0, 0.55], + "729": [0, 0.69444, 0, 0, 0.30556], + "730": [0, 0.69444, 0, 0, 0.73334], + "732": [0, 0.69444, 0, 0, 0.55], + "733": [0, 0.69444, 0, 0, 0.55], + "915": [0, 0.69444, 0, 0, 0.58056], + "916": [0, 0.69444, 0, 0, 0.91667], + "920": [0, 0.69444, 0, 0, 0.85556], + "923": [0, 0.69444, 0, 0, 0.67223], + "926": [0, 0.69444, 0, 0, 0.73334], + "928": [0, 0.69444, 0, 0, 0.79445], + "931": [0, 0.69444, 0, 0, 0.79445], + "933": [0, 0.69444, 0, 0, 0.85556], + "934": [0, 0.69444, 0, 0, 0.79445], + "936": [0, 0.69444, 0, 0, 0.85556], + "937": [0, 0.69444, 0, 0, 0.79445], + "8211": [0, 0.45833, 0.03056, 0, 0.55], + "8212": [0, 0.45833, 0.03056, 0, 1.10001], + "8216": [0, 0.69444, 0, 0, 0.30556], + "8217": [0, 0.69444, 0, 0, 0.30556], + "8220": [0, 0.69444, 0, 0, 0.55834], + "8221": [0, 0.69444, 0, 0, 0.55834] + }, + "SansSerif-Italic": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0.05733, 0, 0.31945], + "34": [0, 0.69444, 0.00316, 0, 0.5], + "35": [0.19444, 0.69444, 0.05087, 0, 0.83334], + "36": [0.05556, 0.75, 0.11156, 0, 0.5], + "37": [0.05556, 0.75, 0.03126, 0, 0.83334], + "38": [0, 0.69444, 0.03058, 0, 0.75834], + "39": [0, 0.69444, 0.07816, 0, 0.27778], + "40": [0.25, 0.75, 0.13164, 0, 0.38889], + "41": [0.25, 0.75, 0.02536, 0, 0.38889], + "42": [0, 0.75, 0.11775, 0, 0.5], + "43": [0.08333, 0.58333, 0.02536, 0, 0.77778], + "44": [0.125, 0.08333, 0, 0, 0.27778], + "45": [0, 0.44444, 0.01946, 0, 0.33333], + "46": [0, 0.08333, 0, 0, 0.27778], + "47": [0.25, 0.75, 0.13164, 0, 0.5], + "48": [0, 0.65556, 0.11156, 0, 0.5], + "49": [0, 0.65556, 0.11156, 0, 0.5], + "50": [0, 0.65556, 0.11156, 0, 0.5], + "51": [0, 0.65556, 0.11156, 0, 0.5], + "52": [0, 0.65556, 0.11156, 0, 0.5], + "53": [0, 0.65556, 0.11156, 0, 0.5], + "54": [0, 0.65556, 0.11156, 0, 0.5], + "55": [0, 0.65556, 0.11156, 0, 0.5], + "56": [0, 0.65556, 0.11156, 0, 0.5], + "57": [0, 0.65556, 0.11156, 0, 0.5], + "58": [0, 0.44444, 0.02502, 0, 0.27778], + "59": [0.125, 0.44444, 0.02502, 0, 0.27778], + "61": [-0.13, 0.37, 0.05087, 0, 0.77778], + "63": [0, 0.69444, 0.11809, 0, 0.47222], + "64": [0, 0.69444, 0.07555, 0, 0.66667], + "65": [0, 0.69444, 0, 0, 0.66667], + "66": [0, 0.69444, 0.08293, 0, 0.66667], + "67": [0, 0.69444, 0.11983, 0, 0.63889], + "68": [0, 0.69444, 0.07555, 0, 0.72223], + "69": [0, 0.69444, 0.11983, 0, 0.59722], + "70": [0, 0.69444, 0.13372, 0, 0.56945], + "71": [0, 0.69444, 0.11983, 0, 0.66667], + "72": [0, 0.69444, 0.08094, 0, 0.70834], + "73": [0, 0.69444, 0.13372, 0, 0.27778], + "74": [0, 0.69444, 0.08094, 0, 0.47222], + "75": [0, 0.69444, 0.11983, 0, 0.69445], + "76": [0, 0.69444, 0, 0, 0.54167], + "77": [0, 0.69444, 0.08094, 0, 0.875], + "78": [0, 0.69444, 0.08094, 0, 0.70834], + "79": [0, 0.69444, 0.07555, 0, 0.73611], + "80": [0, 0.69444, 0.08293, 0, 0.63889], + "81": [0.125, 0.69444, 0.07555, 0, 0.73611], + "82": [0, 0.69444, 0.08293, 0, 0.64584], + "83": [0, 0.69444, 0.09205, 0, 0.55556], + "84": [0, 0.69444, 0.13372, 0, 0.68056], + "85": [0, 0.69444, 0.08094, 0, 0.6875], + "86": [0, 0.69444, 0.1615, 0, 0.66667], + "87": [0, 0.69444, 0.1615, 0, 0.94445], + "88": [0, 0.69444, 0.13372, 0, 0.66667], + "89": [0, 0.69444, 0.17261, 0, 0.66667], + "90": [0, 0.69444, 0.11983, 0, 0.61111], + "91": [0.25, 0.75, 0.15942, 0, 0.28889], + "93": [0.25, 0.75, 0.08719, 0, 0.28889], + "94": [0, 0.69444, 0.0799, 0, 0.5], + "95": [0.35, 0.09444, 0.08616, 0, 0.5], + "97": [0, 0.44444, 0.00981, 0, 0.48056], + "98": [0, 0.69444, 0.03057, 0, 0.51667], + "99": [0, 0.44444, 0.08336, 0, 0.44445], + "100": [0, 0.69444, 0.09483, 0, 0.51667], + "101": [0, 0.44444, 0.06778, 0, 0.44445], + "102": [0, 0.69444, 0.21705, 0, 0.30556], + "103": [0.19444, 0.44444, 0.10836, 0, 0.5], + "104": [0, 0.69444, 0.01778, 0, 0.51667], + "105": [0, 0.67937, 0.09718, 0, 0.23889], + "106": [0.19444, 0.67937, 0.09162, 0, 0.26667], + "107": [0, 0.69444, 0.08336, 0, 0.48889], + "108": [0, 0.69444, 0.09483, 0, 0.23889], + "109": [0, 0.44444, 0.01778, 0, 0.79445], + "110": [0, 0.44444, 0.01778, 0, 0.51667], + "111": [0, 0.44444, 0.06613, 0, 0.5], + "112": [0.19444, 0.44444, 0.0389, 0, 0.51667], + "113": [0.19444, 0.44444, 0.04169, 0, 0.51667], + "114": [0, 0.44444, 0.10836, 0, 0.34167], + "115": [0, 0.44444, 0.0778, 0, 0.38333], + "116": [0, 0.57143, 0.07225, 0, 0.36111], + "117": [0, 0.44444, 0.04169, 0, 0.51667], + "118": [0, 0.44444, 0.10836, 0, 0.46111], + "119": [0, 0.44444, 0.10836, 0, 0.68334], + "120": [0, 0.44444, 0.09169, 0, 0.46111], + "121": [0.19444, 0.44444, 0.10836, 0, 0.46111], + "122": [0, 0.44444, 0.08752, 0, 0.43472], + "126": [0.35, 0.32659, 0.08826, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.67937, 0.06385, 0, 0.5], + "176": [0, 0.69444, 0, 0, 0.73752], + "184": [0.17014, 0, 0, 0, 0.44445], + "305": [0, 0.44444, 0.04169, 0, 0.23889], + "567": [0.19444, 0.44444, 0.04169, 0, 0.26667], + "710": [0, 0.69444, 0.0799, 0, 0.5], + "711": [0, 0.63194, 0.08432, 0, 0.5], + "713": [0, 0.60889, 0.08776, 0, 0.5], + "714": [0, 0.69444, 0.09205, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0.09483, 0, 0.5], + "729": [0, 0.67937, 0.07774, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.73752], + "732": [0, 0.67659, 0.08826, 0, 0.5], + "733": [0, 0.69444, 0.09205, 0, 0.5], + "915": [0, 0.69444, 0.13372, 0, 0.54167], + "916": [0, 0.69444, 0, 0, 0.83334], + "920": [0, 0.69444, 0.07555, 0, 0.77778], + "923": [0, 0.69444, 0, 0, 0.61111], + "926": [0, 0.69444, 0.12816, 0, 0.66667], + "928": [0, 0.69444, 0.08094, 0, 0.70834], + "931": [0, 0.69444, 0.11983, 0, 0.72222], + "933": [0, 0.69444, 0.09031, 0, 0.77778], + "934": [0, 0.69444, 0.04603, 0, 0.72222], + "936": [0, 0.69444, 0.09031, 0, 0.77778], + "937": [0, 0.69444, 0.08293, 0, 0.72222], + "8211": [0, 0.44444, 0.08616, 0, 0.5], + "8212": [0, 0.44444, 0.08616, 0, 1.0], + "8216": [0, 0.69444, 0.07816, 0, 0.27778], + "8217": [0, 0.69444, 0.07816, 0, 0.27778], + "8220": [0, 0.69444, 0.14205, 0, 0.5], + "8221": [0, 0.69444, 0.00316, 0, 0.5] + }, + "SansSerif-Regular": { + "32": [0, 0, 0, 0, 0.25], + "33": [0, 0.69444, 0, 0, 0.31945], + "34": [0, 0.69444, 0, 0, 0.5], + "35": [0.19444, 0.69444, 0, 0, 0.83334], + "36": [0.05556, 0.75, 0, 0, 0.5], + "37": [0.05556, 0.75, 0, 0, 0.83334], + "38": [0, 0.69444, 0, 0, 0.75834], + "39": [0, 0.69444, 0, 0, 0.27778], + "40": [0.25, 0.75, 0, 0, 0.38889], + "41": [0.25, 0.75, 0, 0, 0.38889], + "42": [0, 0.75, 0, 0, 0.5], + "43": [0.08333, 0.58333, 0, 0, 0.77778], + "44": [0.125, 0.08333, 0, 0, 0.27778], + "45": [0, 0.44444, 0, 0, 0.33333], + "46": [0, 0.08333, 0, 0, 0.27778], + "47": [0.25, 0.75, 0, 0, 0.5], + "48": [0, 0.65556, 0, 0, 0.5], + "49": [0, 0.65556, 0, 0, 0.5], + "50": [0, 0.65556, 0, 0, 0.5], + "51": [0, 0.65556, 0, 0, 0.5], + "52": [0, 0.65556, 0, 0, 0.5], + "53": [0, 0.65556, 0, 0, 0.5], + "54": [0, 0.65556, 0, 0, 0.5], + "55": [0, 0.65556, 0, 0, 0.5], + "56": [0, 0.65556, 0, 0, 0.5], + "57": [0, 0.65556, 0, 0, 0.5], + "58": [0, 0.44444, 0, 0, 0.27778], + "59": [0.125, 0.44444, 0, 0, 0.27778], + "61": [-0.13, 0.37, 0, 0, 0.77778], + "63": [0, 0.69444, 0, 0, 0.47222], + "64": [0, 0.69444, 0, 0, 0.66667], + "65": [0, 0.69444, 0, 0, 0.66667], + "66": [0, 0.69444, 0, 0, 0.66667], + "67": [0, 0.69444, 0, 0, 0.63889], + "68": [0, 0.69444, 0, 0, 0.72223], + "69": [0, 0.69444, 0, 0, 0.59722], + "70": [0, 0.69444, 0, 0, 0.56945], + "71": [0, 0.69444, 0, 0, 0.66667], + "72": [0, 0.69444, 0, 0, 0.70834], + "73": [0, 0.69444, 0, 0, 0.27778], + "74": [0, 0.69444, 0, 0, 0.47222], + "75": [0, 0.69444, 0, 0, 0.69445], + "76": [0, 0.69444, 0, 0, 0.54167], + "77": [0, 0.69444, 0, 0, 0.875], + "78": [0, 0.69444, 0, 0, 0.70834], + "79": [0, 0.69444, 0, 0, 0.73611], + "80": [0, 0.69444, 0, 0, 0.63889], + "81": [0.125, 0.69444, 0, 0, 0.73611], + "82": [0, 0.69444, 0, 0, 0.64584], + "83": [0, 0.69444, 0, 0, 0.55556], + "84": [0, 0.69444, 0, 0, 0.68056], + "85": [0, 0.69444, 0, 0, 0.6875], + "86": [0, 0.69444, 0.01389, 0, 0.66667], + "87": [0, 0.69444, 0.01389, 0, 0.94445], + "88": [0, 0.69444, 0, 0, 0.66667], + "89": [0, 0.69444, 0.025, 0, 0.66667], + "90": [0, 0.69444, 0, 0, 0.61111], + "91": [0.25, 0.75, 0, 0, 0.28889], + "93": [0.25, 0.75, 0, 0, 0.28889], + "94": [0, 0.69444, 0, 0, 0.5], + "95": [0.35, 0.09444, 0.02778, 0, 0.5], + "97": [0, 0.44444, 0, 0, 0.48056], + "98": [0, 0.69444, 0, 0, 0.51667], + "99": [0, 0.44444, 0, 0, 0.44445], + "100": [0, 0.69444, 0, 0, 0.51667], + "101": [0, 0.44444, 0, 0, 0.44445], + "102": [0, 0.69444, 0.06944, 0, 0.30556], + "103": [0.19444, 0.44444, 0.01389, 0, 0.5], + "104": [0, 0.69444, 0, 0, 0.51667], + "105": [0, 0.67937, 0, 0, 0.23889], + "106": [0.19444, 0.67937, 0, 0, 0.26667], + "107": [0, 0.69444, 0, 0, 0.48889], + "108": [0, 0.69444, 0, 0, 0.23889], + "109": [0, 0.44444, 0, 0, 0.79445], + "110": [0, 0.44444, 0, 0, 0.51667], + "111": [0, 0.44444, 0, 0, 0.5], + "112": [0.19444, 0.44444, 0, 0, 0.51667], + "113": [0.19444, 0.44444, 0, 0, 0.51667], + "114": [0, 0.44444, 0.01389, 0, 0.34167], + "115": [0, 0.44444, 0, 0, 0.38333], + "116": [0, 0.57143, 0, 0, 0.36111], + "117": [0, 0.44444, 0, 0, 0.51667], + "118": [0, 0.44444, 0.01389, 0, 0.46111], + "119": [0, 0.44444, 0.01389, 0, 0.68334], + "120": [0, 0.44444, 0, 0, 0.46111], + "121": [0.19444, 0.44444, 0.01389, 0, 0.46111], + "122": [0, 0.44444, 0, 0, 0.43472], + "126": [0.35, 0.32659, 0, 0, 0.5], + "160": [0, 0, 0, 0, 0.25], + "168": [0, 0.67937, 0, 0, 0.5], + "176": [0, 0.69444, 0, 0, 0.66667], + "184": [0.17014, 0, 0, 0, 0.44445], + "305": [0, 0.44444, 0, 0, 0.23889], + "567": [0.19444, 0.44444, 0, 0, 0.26667], + "710": [0, 0.69444, 0, 0, 0.5], + "711": [0, 0.63194, 0, 0, 0.5], + "713": [0, 0.60889, 0, 0, 0.5], + "714": [0, 0.69444, 0, 0, 0.5], + "715": [0, 0.69444, 0, 0, 0.5], + "728": [0, 0.69444, 0, 0, 0.5], + "729": [0, 0.67937, 0, 0, 0.27778], + "730": [0, 0.69444, 0, 0, 0.66667], + "732": [0, 0.67659, 0, 0, 0.5], + "733": [0, 0.69444, 0, 0, 0.5], + "915": [0, 0.69444, 0, 0, 0.54167], + "916": [0, 0.69444, 0, 0, 0.83334], + "920": [0, 0.69444, 0, 0, 0.77778], + "923": [0, 0.69444, 0, 0, 0.61111], + "926": [0, 0.69444, 0, 0, 0.66667], + "928": [0, 0.69444, 0, 0, 0.70834], + "931": [0, 0.69444, 0, 0, 0.72222], + "933": [0, 0.69444, 0, 0, 0.77778], + "934": [0, 0.69444, 0, 0, 0.72222], + "936": [0, 0.69444, 0, 0, 0.77778], + "937": [0, 0.69444, 0, 0, 0.72222], + "8211": [0, 0.44444, 0.02778, 0, 0.5], + "8212": [0, 0.44444, 0.02778, 0, 1.0], + "8216": [0, 0.69444, 0, 0, 0.27778], + "8217": [0, 0.69444, 0, 0, 0.27778], + "8220": [0, 0.69444, 0, 0, 0.5], + "8221": [0, 0.69444, 0, 0, 0.5] + }, + "Script-Regular": { + "32": [0, 0, 0, 0, 0.25], + "65": [0, 0.7, 0.22925, 0, 0.80253], + "66": [0, 0.7, 0.04087, 0, 0.90757], + "67": [0, 0.7, 0.1689, 0, 0.66619], + "68": [0, 0.7, 0.09371, 0, 0.77443], + "69": [0, 0.7, 0.18583, 0, 0.56162], + "70": [0, 0.7, 0.13634, 0, 0.89544], + "71": [0, 0.7, 0.17322, 0, 0.60961], + "72": [0, 0.7, 0.29694, 0, 0.96919], + "73": [0, 0.7, 0.19189, 0, 0.80907], + "74": [0.27778, 0.7, 0.19189, 0, 1.05159], + "75": [0, 0.7, 0.31259, 0, 0.91364], + "76": [0, 0.7, 0.19189, 0, 0.87373], + "77": [0, 0.7, 0.15981, 0, 1.08031], + "78": [0, 0.7, 0.3525, 0, 0.9015], + "79": [0, 0.7, 0.08078, 0, 0.73787], + "80": [0, 0.7, 0.08078, 0, 1.01262], + "81": [0, 0.7, 0.03305, 0, 0.88282], + "82": [0, 0.7, 0.06259, 0, 0.85], + "83": [0, 0.7, 0.19189, 0, 0.86767], + "84": [0, 0.7, 0.29087, 0, 0.74697], + "85": [0, 0.7, 0.25815, 0, 0.79996], + "86": [0, 0.7, 0.27523, 0, 0.62204], + "87": [0, 0.7, 0.27523, 0, 0.80532], + "88": [0, 0.7, 0.26006, 0, 0.94445], + "89": [0, 0.7, 0.2939, 0, 0.70961], + "90": [0, 0.7, 0.24037, 0, 0.8212], + "160": [0, 0, 0, 0, 0.25] + }, + "Size1-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [0.35001, 0.85, 0, 0, 0.45834], + "41": [0.35001, 0.85, 0, 0, 0.45834], + "47": [0.35001, 0.85, 0, 0, 0.57778], + "91": [0.35001, 0.85, 0, 0, 0.41667], + "92": [0.35001, 0.85, 0, 0, 0.57778], + "93": [0.35001, 0.85, 0, 0, 0.41667], + "123": [0.35001, 0.85, 0, 0, 0.58334], + "125": [0.35001, 0.85, 0, 0, 0.58334], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.72222, 0, 0, 0.55556], + "732": [0, 0.72222, 0, 0, 0.55556], + "770": [0, 0.72222, 0, 0, 0.55556], + "771": [0, 0.72222, 0, 0, 0.55556], + "8214": [-0.00099, 0.601, 0, 0, 0.77778], + "8593": [1e-05, 0.6, 0, 0, 0.66667], + "8595": [1e-05, 0.6, 0, 0, 0.66667], + "8657": [1e-05, 0.6, 0, 0, 0.77778], + "8659": [1e-05, 0.6, 0, 0, 0.77778], + "8719": [0.25001, 0.75, 0, 0, 0.94445], + "8720": [0.25001, 0.75, 0, 0, 0.94445], + "8721": [0.25001, 0.75, 0, 0, 1.05556], + "8730": [0.35001, 0.85, 0, 0, 1.0], + "8739": [-0.00599, 0.606, 0, 0, 0.33333], + "8741": [-0.00599, 0.606, 0, 0, 0.55556], + "8747": [0.30612, 0.805, 0.19445, 0, 0.47222], + "8748": [0.306, 0.805, 0.19445, 0, 0.47222], + "8749": [0.306, 0.805, 0.19445, 0, 0.47222], + "8750": [0.30612, 0.805, 0.19445, 0, 0.47222], + "8896": [0.25001, 0.75, 0, 0, 0.83334], + "8897": [0.25001, 0.75, 0, 0, 0.83334], + "8898": [0.25001, 0.75, 0, 0, 0.83334], + "8899": [0.25001, 0.75, 0, 0, 0.83334], + "8968": [0.35001, 0.85, 0, 0, 0.47222], + "8969": [0.35001, 0.85, 0, 0, 0.47222], + "8970": [0.35001, 0.85, 0, 0, 0.47222], + "8971": [0.35001, 0.85, 0, 0, 0.47222], + "9168": [-0.00099, 0.601, 0, 0, 0.66667], + "10216": [0.35001, 0.85, 0, 0, 0.47222], + "10217": [0.35001, 0.85, 0, 0, 0.47222], + "10752": [0.25001, 0.75, 0, 0, 1.11111], + "10753": [0.25001, 0.75, 0, 0, 1.11111], + "10754": [0.25001, 0.75, 0, 0, 1.11111], + "10756": [0.25001, 0.75, 0, 0, 0.83334], + "10758": [0.25001, 0.75, 0, 0, 0.83334] + }, + "Size2-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [0.65002, 1.15, 0, 0, 0.59722], + "41": [0.65002, 1.15, 0, 0, 0.59722], + "47": [0.65002, 1.15, 0, 0, 0.81111], + "91": [0.65002, 1.15, 0, 0, 0.47222], + "92": [0.65002, 1.15, 0, 0, 0.81111], + "93": [0.65002, 1.15, 0, 0, 0.47222], + "123": [0.65002, 1.15, 0, 0, 0.66667], + "125": [0.65002, 1.15, 0, 0, 0.66667], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.75, 0, 0, 1.0], + "732": [0, 0.75, 0, 0, 1.0], + "770": [0, 0.75, 0, 0, 1.0], + "771": [0, 0.75, 0, 0, 1.0], + "8719": [0.55001, 1.05, 0, 0, 1.27778], + "8720": [0.55001, 1.05, 0, 0, 1.27778], + "8721": [0.55001, 1.05, 0, 0, 1.44445], + "8730": [0.65002, 1.15, 0, 0, 1.0], + "8747": [0.86225, 1.36, 0.44445, 0, 0.55556], + "8748": [0.862, 1.36, 0.44445, 0, 0.55556], + "8749": [0.862, 1.36, 0.44445, 0, 0.55556], + "8750": [0.86225, 1.36, 0.44445, 0, 0.55556], + "8896": [0.55001, 1.05, 0, 0, 1.11111], + "8897": [0.55001, 1.05, 0, 0, 1.11111], + "8898": [0.55001, 1.05, 0, 0, 1.11111], + "8899": [0.55001, 1.05, 0, 0, 1.11111], + "8968": [0.65002, 1.15, 0, 0, 0.52778], + "8969": [0.65002, 1.15, 0, 0, 0.52778], + "8970": [0.65002, 1.15, 0, 0, 0.52778], + "8971": [0.65002, 1.15, 0, 0, 0.52778], + "10216": [0.65002, 1.15, 0, 0, 0.61111], + "10217": [0.65002, 1.15, 0, 0, 0.61111], + "10752": [0.55001, 1.05, 0, 0, 1.51112], + "10753": [0.55001, 1.05, 0, 0, 1.51112], + "10754": [0.55001, 1.05, 0, 0, 1.51112], + "10756": [0.55001, 1.05, 0, 0, 1.11111], + "10758": [0.55001, 1.05, 0, 0, 1.11111] + }, + "Size3-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [0.95003, 1.45, 0, 0, 0.73611], + "41": [0.95003, 1.45, 0, 0, 0.73611], + "47": [0.95003, 1.45, 0, 0, 1.04445], + "91": [0.95003, 1.45, 0, 0, 0.52778], + "92": [0.95003, 1.45, 0, 0, 1.04445], + "93": [0.95003, 1.45, 0, 0, 0.52778], + "123": [0.95003, 1.45, 0, 0, 0.75], + "125": [0.95003, 1.45, 0, 0, 0.75], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.75, 0, 0, 1.44445], + "732": [0, 0.75, 0, 0, 1.44445], + "770": [0, 0.75, 0, 0, 1.44445], + "771": [0, 0.75, 0, 0, 1.44445], + "8730": [0.95003, 1.45, 0, 0, 1.0], + "8968": [0.95003, 1.45, 0, 0, 0.58334], + "8969": [0.95003, 1.45, 0, 0, 0.58334], + "8970": [0.95003, 1.45, 0, 0, 0.58334], + "8971": [0.95003, 1.45, 0, 0, 0.58334], + "10216": [0.95003, 1.45, 0, 0, 0.75], + "10217": [0.95003, 1.45, 0, 0, 0.75] + }, + "Size4-Regular": { + "32": [0, 0, 0, 0, 0.25], + "40": [1.25003, 1.75, 0, 0, 0.79167], + "41": [1.25003, 1.75, 0, 0, 0.79167], + "47": [1.25003, 1.75, 0, 0, 1.27778], + "91": [1.25003, 1.75, 0, 0, 0.58334], + "92": [1.25003, 1.75, 0, 0, 1.27778], + "93": [1.25003, 1.75, 0, 0, 0.58334], + "123": [1.25003, 1.75, 0, 0, 0.80556], + "125": [1.25003, 1.75, 0, 0, 0.80556], + "160": [0, 0, 0, 0, 0.25], + "710": [0, 0.825, 0, 0, 1.8889], + "732": [0, 0.825, 0, 0, 1.8889], + "770": [0, 0.825, 0, 0, 1.8889], + "771": [0, 0.825, 0, 0, 1.8889], + "8730": [1.25003, 1.75, 0, 0, 1.0], + "8968": [1.25003, 1.75, 0, 0, 0.63889], + "8969": [1.25003, 1.75, 0, 0, 0.63889], + "8970": [1.25003, 1.75, 0, 0, 0.63889], + "8971": [1.25003, 1.75, 0, 0, 0.63889], + "9115": [0.64502, 1.155, 0, 0, 0.875], + "9116": [1e-05, 0.6, 0, 0, 0.875], + "9117": [0.64502, 1.155, 0, 0, 0.875], + "9118": [0.64502, 1.155, 0, 0, 0.875], + "9119": [1e-05, 0.6, 0, 0, 0.875], + "9120": [0.64502, 1.155, 0, 0, 0.875], + "9121": [0.64502, 1.155, 0, 0, 0.66667], + "9122": [-0.00099, 0.601, 0, 0, 0.66667], + "9123": [0.64502, 1.155, 0, 0, 0.66667], + "9124": [0.64502, 1.155, 0, 0, 0.66667], + "9125": [-0.00099, 0.601, 0, 0, 0.66667], + "9126": [0.64502, 1.155, 0, 0, 0.66667], + "9127": [1e-05, 0.9, 0, 0, 0.88889], + "9128": [0.65002, 1.15, 0, 0, 0.88889], + "9129": [0.90001, 0, 0, 0, 0.88889], + "9130": [0, 0.3, 0, 0, 0.88889], + "9131": [1e-05, 0.9, 0, 0, 0.88889], + "9132": [0.65002, 1.15, 0, 0, 0.88889], + "9133": [0.90001, 0, 0, 0, 0.88889], + "9143": [0.88502, 0.915, 0, 0, 1.05556], + "10216": [1.25003, 1.75, 0, 0, 0.80556], + "10217": [1.25003, 1.75, 0, 0, 0.80556], + "57344": [-0.00499, 0.605, 0, 0, 1.05556], + "57345": [-0.00499, 0.605, 0, 0, 1.05556], + "57680": [0, 0.12, 0, 0, 0.45], + "57681": [0, 0.12, 0, 0, 0.45], + "57682": [0, 0.12, 0, 0, 0.45], + "57683": [0, 0.12, 0, 0, 0.45] + }, + "Typewriter-Regular": { + "32": [0, 0, 0, 0, 0.525], + "33": [0, 0.61111, 0, 0, 0.525], + "34": [0, 0.61111, 0, 0, 0.525], + "35": [0, 0.61111, 0, 0, 0.525], + "36": [0.08333, 0.69444, 0, 0, 0.525], + "37": [0.08333, 0.69444, 0, 0, 0.525], + "38": [0, 0.61111, 0, 0, 0.525], + "39": [0, 0.61111, 0, 0, 0.525], + "40": [0.08333, 0.69444, 0, 0, 0.525], + "41": [0.08333, 0.69444, 0, 0, 0.525], + "42": [0, 0.52083, 0, 0, 0.525], + "43": [-0.08056, 0.53055, 0, 0, 0.525], + "44": [0.13889, 0.125, 0, 0, 0.525], + "45": [-0.08056, 0.53055, 0, 0, 0.525], + "46": [0, 0.125, 0, 0, 0.525], + "47": [0.08333, 0.69444, 0, 0, 0.525], + "48": [0, 0.61111, 0, 0, 0.525], + "49": [0, 0.61111, 0, 0, 0.525], + "50": [0, 0.61111, 0, 0, 0.525], + "51": [0, 0.61111, 0, 0, 0.525], + "52": [0, 0.61111, 0, 0, 0.525], + "53": [0, 0.61111, 0, 0, 0.525], + "54": [0, 0.61111, 0, 0, 0.525], + "55": [0, 0.61111, 0, 0, 0.525], + "56": [0, 0.61111, 0, 0, 0.525], + "57": [0, 0.61111, 0, 0, 0.525], + "58": [0, 0.43056, 0, 0, 0.525], + "59": [0.13889, 0.43056, 0, 0, 0.525], + "60": [-0.05556, 0.55556, 0, 0, 0.525], + "61": [-0.19549, 0.41562, 0, 0, 0.525], + "62": [-0.05556, 0.55556, 0, 0, 0.525], + "63": [0, 0.61111, 0, 0, 0.525], + "64": [0, 0.61111, 0, 0, 0.525], + "65": [0, 0.61111, 0, 0, 0.525], + "66": [0, 0.61111, 0, 0, 0.525], + "67": [0, 0.61111, 0, 0, 0.525], + "68": [0, 0.61111, 0, 0, 0.525], + "69": [0, 0.61111, 0, 0, 0.525], + "70": [0, 0.61111, 0, 0, 0.525], + "71": [0, 0.61111, 0, 0, 0.525], + "72": [0, 0.61111, 0, 0, 0.525], + "73": [0, 0.61111, 0, 0, 0.525], + "74": [0, 0.61111, 0, 0, 0.525], + "75": [0, 0.61111, 0, 0, 0.525], + "76": [0, 0.61111, 0, 0, 0.525], + "77": [0, 0.61111, 0, 0, 0.525], + "78": [0, 0.61111, 0, 0, 0.525], + "79": [0, 0.61111, 0, 0, 0.525], + "80": [0, 0.61111, 0, 0, 0.525], + "81": [0.13889, 0.61111, 0, 0, 0.525], + "82": [0, 0.61111, 0, 0, 0.525], + "83": [0, 0.61111, 0, 0, 0.525], + "84": [0, 0.61111, 0, 0, 0.525], + "85": [0, 0.61111, 0, 0, 0.525], + "86": [0, 0.61111, 0, 0, 0.525], + "87": [0, 0.61111, 0, 0, 0.525], + "88": [0, 0.61111, 0, 0, 0.525], + "89": [0, 0.61111, 0, 0, 0.525], + "90": [0, 0.61111, 0, 0, 0.525], + "91": [0.08333, 0.69444, 0, 0, 0.525], + "92": [0.08333, 0.69444, 0, 0, 0.525], + "93": [0.08333, 0.69444, 0, 0, 0.525], + "94": [0, 0.61111, 0, 0, 0.525], + "95": [0.09514, 0, 0, 0, 0.525], + "96": [0, 0.61111, 0, 0, 0.525], + "97": [0, 0.43056, 0, 0, 0.525], + "98": [0, 0.61111, 0, 0, 0.525], + "99": [0, 0.43056, 0, 0, 0.525], + "100": [0, 0.61111, 0, 0, 0.525], + "101": [0, 0.43056, 0, 0, 0.525], + "102": [0, 0.61111, 0, 0, 0.525], + "103": [0.22222, 0.43056, 0, 0, 0.525], + "104": [0, 0.61111, 0, 0, 0.525], + "105": [0, 0.61111, 0, 0, 0.525], + "106": [0.22222, 0.61111, 0, 0, 0.525], + "107": [0, 0.61111, 0, 0, 0.525], + "108": [0, 0.61111, 0, 0, 0.525], + "109": [0, 0.43056, 0, 0, 0.525], + "110": [0, 0.43056, 0, 0, 0.525], + "111": [0, 0.43056, 0, 0, 0.525], + "112": [0.22222, 0.43056, 0, 0, 0.525], + "113": [0.22222, 0.43056, 0, 0, 0.525], + "114": [0, 0.43056, 0, 0, 0.525], + "115": [0, 0.43056, 0, 0, 0.525], + "116": [0, 0.55358, 0, 0, 0.525], + "117": [0, 0.43056, 0, 0, 0.525], + "118": [0, 0.43056, 0, 0, 0.525], + "119": [0, 0.43056, 0, 0, 0.525], + "120": [0, 0.43056, 0, 0, 0.525], + "121": [0.22222, 0.43056, 0, 0, 0.525], + "122": [0, 0.43056, 0, 0, 0.525], + "123": [0.08333, 0.69444, 0, 0, 0.525], + "124": [0.08333, 0.69444, 0, 0, 0.525], + "125": [0.08333, 0.69444, 0, 0, 0.525], + "126": [0, 0.61111, 0, 0, 0.525], + "127": [0, 0.61111, 0, 0, 0.525], + "160": [0, 0, 0, 0, 0.525], + "176": [0, 0.61111, 0, 0, 0.525], + "184": [0.19445, 0, 0, 0, 0.525], + "305": [0, 0.43056, 0, 0, 0.525], + "567": [0.22222, 0.43056, 0, 0, 0.525], + "711": [0, 0.56597, 0, 0, 0.525], + "713": [0, 0.56555, 0, 0, 0.525], + "714": [0, 0.61111, 0, 0, 0.525], + "715": [0, 0.61111, 0, 0, 0.525], + "728": [0, 0.61111, 0, 0, 0.525], + "730": [0, 0.61111, 0, 0, 0.525], + "770": [0, 0.61111, 0, 0, 0.525], + "771": [0, 0.61111, 0, 0, 0.525], + "776": [0, 0.61111, 0, 0, 0.525], + "915": [0, 0.61111, 0, 0, 0.525], + "916": [0, 0.61111, 0, 0, 0.525], + "920": [0, 0.61111, 0, 0, 0.525], + "923": [0, 0.61111, 0, 0, 0.525], + "926": [0, 0.61111, 0, 0, 0.525], + "928": [0, 0.61111, 0, 0, 0.525], + "931": [0, 0.61111, 0, 0, 0.525], + "933": [0, 0.61111, 0, 0, 0.525], + "934": [0, 0.61111, 0, 0, 0.525], + "936": [0, 0.61111, 0, 0, 0.525], + "937": [0, 0.61111, 0, 0, 0.525], + "8216": [0, 0.61111, 0, 0, 0.525], + "8217": [0, 0.61111, 0, 0, 0.525], + "8242": [0, 0.61111, 0, 0, 0.525], + "9251": [0.11111, 0.21944, 0, 0, 0.525] + } +}); +;// CONCATENATED MODULE: ./src/fontMetrics.js + + +/** + * This file contains metrics regarding fonts and individual symbols. The sigma + * and xi variables, as well as the metricMap map contain data extracted from + * TeX, TeX font metrics, and the TTF files. These data are then exposed via the + * `metrics` variable and the getCharacterMetrics function. + */ +// In TeX, there are actually three sets of dimensions, one for each of +// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4: +// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are +// provided in the the arrays below, in that order. +// +// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respsectively. +// This was determined by running the following script: +// +// latex -interaction=nonstopmode \ +// '\documentclass{article}\usepackage{amsmath}\begin{document}' \ +// '$a$ \expandafter\show\the\textfont2' \ +// '\expandafter\show\the\scriptfont2' \ +// '\expandafter\show\the\scriptscriptfont2' \ +// '\stop' +// +// The metrics themselves were retreived using the following commands: +// +// tftopl cmsy10 +// tftopl cmsy7 +// tftopl cmsy5 +// +// The output of each of these commands is quite lengthy. The only part we +// care about is the FONTDIMEN section. Each value is measured in EMs. +var sigmasAndXis = { + slant: [0.250, 0.250, 0.250], + // sigma1 + space: [0.000, 0.000, 0.000], + // sigma2 + stretch: [0.000, 0.000, 0.000], + // sigma3 + shrink: [0.000, 0.000, 0.000], + // sigma4 + xHeight: [0.431, 0.431, 0.431], + // sigma5 + quad: [1.000, 1.171, 1.472], + // sigma6 + extraSpace: [0.000, 0.000, 0.000], + // sigma7 + num1: [0.677, 0.732, 0.925], + // sigma8 + num2: [0.394, 0.384, 0.387], + // sigma9 + num3: [0.444, 0.471, 0.504], + // sigma10 + denom1: [0.686, 0.752, 1.025], + // sigma11 + denom2: [0.345, 0.344, 0.532], + // sigma12 + sup1: [0.413, 0.503, 0.504], + // sigma13 + sup2: [0.363, 0.431, 0.404], + // sigma14 + sup3: [0.289, 0.286, 0.294], + // sigma15 + sub1: [0.150, 0.143, 0.200], + // sigma16 + sub2: [0.247, 0.286, 0.400], + // sigma17 + supDrop: [0.386, 0.353, 0.494], + // sigma18 + subDrop: [0.050, 0.071, 0.100], + // sigma19 + delim1: [2.390, 1.700, 1.980], + // sigma20 + delim2: [1.010, 1.157, 1.420], + // sigma21 + axisHeight: [0.250, 0.250, 0.250], + // sigma22 + // These font metrics are extracted from TeX by using tftopl on cmex10.tfm; + // they correspond to the font parameters of the extension fonts (family 3). + // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to + // match cmex7, we'd use cmex7.tfm values for script and scriptscript + // values. + defaultRuleThickness: [0.04, 0.049, 0.049], + // xi8; cmex7: 0.049 + bigOpSpacing1: [0.111, 0.111, 0.111], + // xi9 + bigOpSpacing2: [0.166, 0.166, 0.166], + // xi10 + bigOpSpacing3: [0.2, 0.2, 0.2], + // xi11 + bigOpSpacing4: [0.6, 0.611, 0.611], + // xi12; cmex7: 0.611 + bigOpSpacing5: [0.1, 0.143, 0.143], + // xi13; cmex7: 0.143 + // The \sqrt rule width is taken from the height of the surd character. + // Since we use the same font at all sizes, this thickness doesn't scale. + sqrtRuleThickness: [0.04, 0.04, 0.04], + // This value determines how large a pt is, for metrics which are defined + // in terms of pts. + // This value is also used in katex.less; if you change it make sure the + // values match. + ptPerEm: [10.0, 10.0, 10.0], + // The space between adjacent `|` columns in an array definition. From + // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. + doubleRuleSep: [0.2, 0.2, 0.2], + // The width of separator lines in {array} environments. From + // `\showthe\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm. + arrayRuleWidth: [0.04, 0.04, 0.04], + // Two values from LaTeX source2e: + fboxsep: [0.3, 0.3, 0.3], + // 3 pt / ptPerEm + fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm + +}; // This map contains a mapping from font name and character code to character +// metrics, including height, depth, italic correction, and skew (kern from the +// character to the corresponding \skewchar) +// This map is generated via `make metrics`. It should not be changed manually. + + // These are very rough approximations. We default to Times New Roman which +// should have Latin-1 and Cyrillic characters, but may not depending on the +// operating system. The metrics do not account for extra height from the +// accents. In the case of Cyrillic characters which have both ascenders and +// descenders we prefer approximations with ascenders, primarily to prevent +// the fraction bar or root line from intersecting the glyph. +// TODO(kevinb) allow union of multiple glyph metrics for better accuracy. + +var extraCharacterMap = { + // Latin-1 + 'Å': 'A', + 'Ç': 'C', + 'Ð': 'D', + 'Þ': 'o', + 'å': 'a', + 'ç': 'c', + 'ð': 'd', + 'þ': 'o', + // Cyrillic + 'А': 'A', + 'Б': 'B', + 'В': 'B', + 'Г': 'F', + 'Д': 'A', + 'Е': 'E', + 'Ж': 'K', + 'З': '3', + 'И': 'N', + 'Й': 'N', + 'К': 'K', + 'Л': 'N', + 'М': 'M', + 'Н': 'H', + 'О': 'O', + 'П': 'N', + 'Р': 'P', + 'С': 'C', + 'Т': 'T', + 'У': 'y', + 'Ф': 'O', + 'Х': 'X', + 'Ц': 'U', + 'Ч': 'h', + 'Ш': 'W', + 'Щ': 'W', + 'Ъ': 'B', + 'Ы': 'X', + 'Ь': 'B', + 'Э': '3', + 'Ю': 'X', + 'Я': 'R', + 'а': 'a', + 'б': 'b', + 'в': 'a', + 'г': 'r', + 'д': 'y', + 'е': 'e', + 'ж': 'm', + 'з': 'e', + 'и': 'n', + 'й': 'n', + 'к': 'n', + 'л': 'n', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'n', + 'р': 'p', + 'с': 'c', + 'т': 'o', + 'у': 'y', + 'ф': 'b', + 'х': 'x', + 'ц': 'n', + 'ч': 'n', + 'ш': 'w', + 'щ': 'w', + 'ъ': 'a', + 'ы': 'm', + 'ь': 'a', + 'э': 'e', + 'ю': 'm', + 'я': 'r' +}; + +/** + * This function adds new font metrics to default metricMap + * It can also override existing metrics + */ +function setFontMetrics(fontName, metrics) { + fontMetricsData[fontName] = metrics; +} +/** + * This function is a convenience function for looking up information in the + * metricMap table. It takes a character as a string, and a font. + * + * Note: the `width` property may be undefined if fontMetricsData.js wasn't + * built using `Make extended_metrics`. + */ + +function getCharacterMetrics(character, font, mode) { + if (!fontMetricsData[font]) { + throw new Error("Font metrics not found for font: " + font + "."); + } + + var ch = character.charCodeAt(0); + var metrics = fontMetricsData[font][ch]; + + if (!metrics && character[0] in extraCharacterMap) { + ch = extraCharacterMap[character[0]].charCodeAt(0); + metrics = fontMetricsData[font][ch]; + } + + if (!metrics && mode === 'text') { + // We don't typically have font metrics for Asian scripts. + // But since we support them in text mode, we need to return + // some sort of metrics. + // So if the character is in a script we support but we + // don't have metrics for it, just use the metrics for + // the Latin capital letter M. This is close enough because + // we (currently) only care about the height of the glpyh + // not its width. + if (supportedCodepoint(ch)) { + metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M' + } + } + + if (metrics) { + return { + depth: metrics[0], + height: metrics[1], + italic: metrics[2], + skew: metrics[3], + width: metrics[4] + }; + } +} +var fontMetricsBySizeIndex = {}; +/** + * Get the font metrics for a given size. + */ + +function getGlobalMetrics(size) { + var sizeIndex; + + if (size >= 5) { + sizeIndex = 0; + } else if (size >= 3) { + sizeIndex = 1; + } else { + sizeIndex = 2; + } + + if (!fontMetricsBySizeIndex[sizeIndex]) { + var metrics = fontMetricsBySizeIndex[sizeIndex] = { + cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18 + }; + + for (var key in sigmasAndXis) { + if (sigmasAndXis.hasOwnProperty(key)) { + metrics[key] = sigmasAndXis[key][sizeIndex]; + } + } + } + + return fontMetricsBySizeIndex[sizeIndex]; +} +;// CONCATENATED MODULE: ./src/symbols.js +/** + * This file holds a list of all no-argument functions and single-character + * symbols (like 'a' or ';'). + * + * For each of the symbols, there are three properties they can have: + * - font (required): the font to be used for this symbol. Either "main" (the + normal font), or "ams" (the ams fonts). + * - group (required): the ParseNode group type the symbol should have (i.e. + "textord", "mathord", etc). + See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types + * - replace: the character that this symbol or function should be + * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi + * character in the main font). + * + * The outermost map in the table indicates what mode the symbols should be + * accepted in (e.g. "math" or "text"). + */ +// Some of these have a "-token" suffix since these are also used as `ParseNode` +// types for raw text tokens, and we want to avoid conflicts with higher-level +// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by +// looking up the `symbols` map. +var ATOMS = { + "bin": 1, + "close": 1, + "inner": 1, + "open": 1, + "punct": 1, + "rel": 1 +}; +var NON_ATOMS = { + "accent-token": 1, + "mathord": 1, + "op-token": 1, + "spacing": 1, + "textord": 1 +}; +var symbols = { + "math": {}, + "text": {} +}; +/* harmony default export */ var src_symbols = (symbols); +/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ + +function defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) { + symbols[mode][name] = { + font: font, + group: group, + replace: replace + }; + + if (acceptUnicodeChar && replace) { + symbols[mode][replace] = symbols[mode][name]; + } +} // Some abbreviations for commonly used strings. +// This helps minify the code, and also spotting typos using jshint. +// modes: + +var math = "math"; +var symbols_text = "text"; // fonts: + +var main = "main"; +var ams = "ams"; // groups: + +var accent = "accent-token"; +var bin = "bin"; +var symbols_close = "close"; +var inner = "inner"; +var mathord = "mathord"; +var op = "op-token"; +var symbols_open = "open"; +var punct = "punct"; +var rel = "rel"; +var spacing = "spacing"; +var textord = "textord"; // Now comes the symbol table +// Relation Symbols + +defineSymbol(math, main, rel, "\u2261", "\\equiv", true); +defineSymbol(math, main, rel, "\u227A", "\\prec", true); +defineSymbol(math, main, rel, "\u227B", "\\succ", true); +defineSymbol(math, main, rel, "\u223C", "\\sim", true); +defineSymbol(math, main, rel, "\u22A5", "\\perp"); +defineSymbol(math, main, rel, "\u2AAF", "\\preceq", true); +defineSymbol(math, main, rel, "\u2AB0", "\\succeq", true); +defineSymbol(math, main, rel, "\u2243", "\\simeq", true); +defineSymbol(math, main, rel, "\u2223", "\\mid", true); +defineSymbol(math, main, rel, "\u226A", "\\ll", true); +defineSymbol(math, main, rel, "\u226B", "\\gg", true); +defineSymbol(math, main, rel, "\u224D", "\\asymp", true); +defineSymbol(math, main, rel, "\u2225", "\\parallel"); +defineSymbol(math, main, rel, "\u22C8", "\\bowtie", true); +defineSymbol(math, main, rel, "\u2323", "\\smile", true); +defineSymbol(math, main, rel, "\u2291", "\\sqsubseteq", true); +defineSymbol(math, main, rel, "\u2292", "\\sqsupseteq", true); +defineSymbol(math, main, rel, "\u2250", "\\doteq", true); +defineSymbol(math, main, rel, "\u2322", "\\frown", true); +defineSymbol(math, main, rel, "\u220B", "\\ni", true); +defineSymbol(math, main, rel, "\u221D", "\\propto", true); +defineSymbol(math, main, rel, "\u22A2", "\\vdash", true); +defineSymbol(math, main, rel, "\u22A3", "\\dashv", true); +defineSymbol(math, main, rel, "\u220B", "\\owns"); // Punctuation + +defineSymbol(math, main, punct, ".", "\\ldotp"); +defineSymbol(math, main, punct, "\u22C5", "\\cdotp"); // Misc Symbols + +defineSymbol(math, main, textord, "#", "\\#"); +defineSymbol(symbols_text, main, textord, "#", "\\#"); +defineSymbol(math, main, textord, "&", "\\&"); +defineSymbol(symbols_text, main, textord, "&", "\\&"); +defineSymbol(math, main, textord, "\u2135", "\\aleph", true); +defineSymbol(math, main, textord, "\u2200", "\\forall", true); +defineSymbol(math, main, textord, "\u210F", "\\hbar", true); +defineSymbol(math, main, textord, "\u2203", "\\exists", true); +defineSymbol(math, main, textord, "\u2207", "\\nabla", true); +defineSymbol(math, main, textord, "\u266D", "\\flat", true); +defineSymbol(math, main, textord, "\u2113", "\\ell", true); +defineSymbol(math, main, textord, "\u266E", "\\natural", true); +defineSymbol(math, main, textord, "\u2663", "\\clubsuit", true); +defineSymbol(math, main, textord, "\u2118", "\\wp", true); +defineSymbol(math, main, textord, "\u266F", "\\sharp", true); +defineSymbol(math, main, textord, "\u2662", "\\diamondsuit", true); +defineSymbol(math, main, textord, "\u211C", "\\Re", true); +defineSymbol(math, main, textord, "\u2661", "\\heartsuit", true); +defineSymbol(math, main, textord, "\u2111", "\\Im", true); +defineSymbol(math, main, textord, "\u2660", "\\spadesuit", true); +defineSymbol(symbols_text, main, textord, "\xA7", "\\S", true); +defineSymbol(symbols_text, main, textord, "\xB6", "\\P", true); // Math and Text + +defineSymbol(math, main, textord, "\u2020", "\\dag"); +defineSymbol(symbols_text, main, textord, "\u2020", "\\dag"); +defineSymbol(symbols_text, main, textord, "\u2020", "\\textdagger"); +defineSymbol(math, main, textord, "\u2021", "\\ddag"); +defineSymbol(symbols_text, main, textord, "\u2021", "\\ddag"); +defineSymbol(symbols_text, main, textord, "\u2021", "\\textdaggerdbl"); // Large Delimiters + +defineSymbol(math, main, symbols_close, "\u23B1", "\\rmoustache", true); +defineSymbol(math, main, symbols_open, "\u23B0", "\\lmoustache", true); +defineSymbol(math, main, symbols_close, "\u27EF", "\\rgroup", true); +defineSymbol(math, main, symbols_open, "\u27EE", "\\lgroup", true); // Binary Operators + +defineSymbol(math, main, bin, "\u2213", "\\mp", true); +defineSymbol(math, main, bin, "\u2296", "\\ominus", true); +defineSymbol(math, main, bin, "\u228E", "\\uplus", true); +defineSymbol(math, main, bin, "\u2293", "\\sqcap", true); +defineSymbol(math, main, bin, "\u2217", "\\ast"); +defineSymbol(math, main, bin, "\u2294", "\\sqcup", true); +defineSymbol(math, main, bin, "\u25EF", "\\bigcirc", true); +defineSymbol(math, main, bin, "\u2219", "\\bullet"); +defineSymbol(math, main, bin, "\u2021", "\\ddagger"); +defineSymbol(math, main, bin, "\u2240", "\\wr", true); +defineSymbol(math, main, bin, "\u2A3F", "\\amalg"); +defineSymbol(math, main, bin, "&", "\\And"); // from amsmath +// Arrow Symbols + +defineSymbol(math, main, rel, "\u27F5", "\\longleftarrow", true); +defineSymbol(math, main, rel, "\u21D0", "\\Leftarrow", true); +defineSymbol(math, main, rel, "\u27F8", "\\Longleftarrow", true); +defineSymbol(math, main, rel, "\u27F6", "\\longrightarrow", true); +defineSymbol(math, main, rel, "\u21D2", "\\Rightarrow", true); +defineSymbol(math, main, rel, "\u27F9", "\\Longrightarrow", true); +defineSymbol(math, main, rel, "\u2194", "\\leftrightarrow", true); +defineSymbol(math, main, rel, "\u27F7", "\\longleftrightarrow", true); +defineSymbol(math, main, rel, "\u21D4", "\\Leftrightarrow", true); +defineSymbol(math, main, rel, "\u27FA", "\\Longleftrightarrow", true); +defineSymbol(math, main, rel, "\u21A6", "\\mapsto", true); +defineSymbol(math, main, rel, "\u27FC", "\\longmapsto", true); +defineSymbol(math, main, rel, "\u2197", "\\nearrow", true); +defineSymbol(math, main, rel, "\u21A9", "\\hookleftarrow", true); +defineSymbol(math, main, rel, "\u21AA", "\\hookrightarrow", true); +defineSymbol(math, main, rel, "\u2198", "\\searrow", true); +defineSymbol(math, main, rel, "\u21BC", "\\leftharpoonup", true); +defineSymbol(math, main, rel, "\u21C0", "\\rightharpoonup", true); +defineSymbol(math, main, rel, "\u2199", "\\swarrow", true); +defineSymbol(math, main, rel, "\u21BD", "\\leftharpoondown", true); +defineSymbol(math, main, rel, "\u21C1", "\\rightharpoondown", true); +defineSymbol(math, main, rel, "\u2196", "\\nwarrow", true); +defineSymbol(math, main, rel, "\u21CC", "\\rightleftharpoons", true); // AMS Negated Binary Relations + +defineSymbol(math, ams, rel, "\u226E", "\\nless", true); // Symbol names preceeded by "@" each have a corresponding macro. + +defineSymbol(math, ams, rel, "\uE010", "\\@nleqslant"); +defineSymbol(math, ams, rel, "\uE011", "\\@nleqq"); +defineSymbol(math, ams, rel, "\u2A87", "\\lneq", true); +defineSymbol(math, ams, rel, "\u2268", "\\lneqq", true); +defineSymbol(math, ams, rel, "\uE00C", "\\@lvertneqq"); +defineSymbol(math, ams, rel, "\u22E6", "\\lnsim", true); +defineSymbol(math, ams, rel, "\u2A89", "\\lnapprox", true); +defineSymbol(math, ams, rel, "\u2280", "\\nprec", true); // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. + +defineSymbol(math, ams, rel, "\u22E0", "\\npreceq", true); +defineSymbol(math, ams, rel, "\u22E8", "\\precnsim", true); +defineSymbol(math, ams, rel, "\u2AB9", "\\precnapprox", true); +defineSymbol(math, ams, rel, "\u2241", "\\nsim", true); +defineSymbol(math, ams, rel, "\uE006", "\\@nshortmid"); +defineSymbol(math, ams, rel, "\u2224", "\\nmid", true); +defineSymbol(math, ams, rel, "\u22AC", "\\nvdash", true); +defineSymbol(math, ams, rel, "\u22AD", "\\nvDash", true); +defineSymbol(math, ams, rel, "\u22EA", "\\ntriangleleft"); +defineSymbol(math, ams, rel, "\u22EC", "\\ntrianglelefteq", true); +defineSymbol(math, ams, rel, "\u228A", "\\subsetneq", true); +defineSymbol(math, ams, rel, "\uE01A", "\\@varsubsetneq"); +defineSymbol(math, ams, rel, "\u2ACB", "\\subsetneqq", true); +defineSymbol(math, ams, rel, "\uE017", "\\@varsubsetneqq"); +defineSymbol(math, ams, rel, "\u226F", "\\ngtr", true); +defineSymbol(math, ams, rel, "\uE00F", "\\@ngeqslant"); +defineSymbol(math, ams, rel, "\uE00E", "\\@ngeqq"); +defineSymbol(math, ams, rel, "\u2A88", "\\gneq", true); +defineSymbol(math, ams, rel, "\u2269", "\\gneqq", true); +defineSymbol(math, ams, rel, "\uE00D", "\\@gvertneqq"); +defineSymbol(math, ams, rel, "\u22E7", "\\gnsim", true); +defineSymbol(math, ams, rel, "\u2A8A", "\\gnapprox", true); +defineSymbol(math, ams, rel, "\u2281", "\\nsucc", true); // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. + +defineSymbol(math, ams, rel, "\u22E1", "\\nsucceq", true); +defineSymbol(math, ams, rel, "\u22E9", "\\succnsim", true); +defineSymbol(math, ams, rel, "\u2ABA", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. + +defineSymbol(math, ams, rel, "\u2246", "\\ncong", true); +defineSymbol(math, ams, rel, "\uE007", "\\@nshortparallel"); +defineSymbol(math, ams, rel, "\u2226", "\\nparallel", true); +defineSymbol(math, ams, rel, "\u22AF", "\\nVDash", true); +defineSymbol(math, ams, rel, "\u22EB", "\\ntriangleright"); +defineSymbol(math, ams, rel, "\u22ED", "\\ntrianglerighteq", true); +defineSymbol(math, ams, rel, "\uE018", "\\@nsupseteqq"); +defineSymbol(math, ams, rel, "\u228B", "\\supsetneq", true); +defineSymbol(math, ams, rel, "\uE01B", "\\@varsupsetneq"); +defineSymbol(math, ams, rel, "\u2ACC", "\\supsetneqq", true); +defineSymbol(math, ams, rel, "\uE019", "\\@varsupsetneqq"); +defineSymbol(math, ams, rel, "\u22AE", "\\nVdash", true); +defineSymbol(math, ams, rel, "\u2AB5", "\\precneqq", true); +defineSymbol(math, ams, rel, "\u2AB6", "\\succneqq", true); +defineSymbol(math, ams, rel, "\uE016", "\\@nsubseteqq"); +defineSymbol(math, ams, bin, "\u22B4", "\\unlhd"); +defineSymbol(math, ams, bin, "\u22B5", "\\unrhd"); // AMS Negated Arrows + +defineSymbol(math, ams, rel, "\u219A", "\\nleftarrow", true); +defineSymbol(math, ams, rel, "\u219B", "\\nrightarrow", true); +defineSymbol(math, ams, rel, "\u21CD", "\\nLeftarrow", true); +defineSymbol(math, ams, rel, "\u21CF", "\\nRightarrow", true); +defineSymbol(math, ams, rel, "\u21AE", "\\nleftrightarrow", true); +defineSymbol(math, ams, rel, "\u21CE", "\\nLeftrightarrow", true); // AMS Misc + +defineSymbol(math, ams, rel, "\u25B3", "\\vartriangle"); +defineSymbol(math, ams, textord, "\u210F", "\\hslash"); +defineSymbol(math, ams, textord, "\u25BD", "\\triangledown"); +defineSymbol(math, ams, textord, "\u25CA", "\\lozenge"); +defineSymbol(math, ams, textord, "\u24C8", "\\circledS"); +defineSymbol(math, ams, textord, "\xAE", "\\circledR"); +defineSymbol(symbols_text, ams, textord, "\xAE", "\\circledR"); +defineSymbol(math, ams, textord, "\u2221", "\\measuredangle", true); +defineSymbol(math, ams, textord, "\u2204", "\\nexists"); +defineSymbol(math, ams, textord, "\u2127", "\\mho"); +defineSymbol(math, ams, textord, "\u2132", "\\Finv", true); +defineSymbol(math, ams, textord, "\u2141", "\\Game", true); +defineSymbol(math, ams, textord, "\u2035", "\\backprime"); +defineSymbol(math, ams, textord, "\u25B2", "\\blacktriangle"); +defineSymbol(math, ams, textord, "\u25BC", "\\blacktriangledown"); +defineSymbol(math, ams, textord, "\u25A0", "\\blacksquare"); +defineSymbol(math, ams, textord, "\u29EB", "\\blacklozenge"); +defineSymbol(math, ams, textord, "\u2605", "\\bigstar"); +defineSymbol(math, ams, textord, "\u2222", "\\sphericalangle", true); +defineSymbol(math, ams, textord, "\u2201", "\\complement", true); // unicode-math maps U+F0 to \matheth. We map to AMS function \eth + +defineSymbol(math, ams, textord, "\xF0", "\\eth", true); +defineSymbol(symbols_text, main, textord, "\xF0", "\xF0"); +defineSymbol(math, ams, textord, "\u2571", "\\diagup"); +defineSymbol(math, ams, textord, "\u2572", "\\diagdown"); +defineSymbol(math, ams, textord, "\u25A1", "\\square"); +defineSymbol(math, ams, textord, "\u25A1", "\\Box"); +defineSymbol(math, ams, textord, "\u25CA", "\\Diamond"); // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen + +defineSymbol(math, ams, textord, "\xA5", "\\yen", true); +defineSymbol(symbols_text, ams, textord, "\xA5", "\\yen", true); +defineSymbol(math, ams, textord, "\u2713", "\\checkmark", true); +defineSymbol(symbols_text, ams, textord, "\u2713", "\\checkmark"); // AMS Hebrew + +defineSymbol(math, ams, textord, "\u2136", "\\beth", true); +defineSymbol(math, ams, textord, "\u2138", "\\daleth", true); +defineSymbol(math, ams, textord, "\u2137", "\\gimel", true); // AMS Greek + +defineSymbol(math, ams, textord, "\u03DD", "\\digamma", true); +defineSymbol(math, ams, textord, "\u03F0", "\\varkappa"); // AMS Delimiters + +defineSymbol(math, ams, symbols_open, "\u250C", "\\@ulcorner", true); +defineSymbol(math, ams, symbols_close, "\u2510", "\\@urcorner", true); +defineSymbol(math, ams, symbols_open, "\u2514", "\\@llcorner", true); +defineSymbol(math, ams, symbols_close, "\u2518", "\\@lrcorner", true); // AMS Binary Relations + +defineSymbol(math, ams, rel, "\u2266", "\\leqq", true); +defineSymbol(math, ams, rel, "\u2A7D", "\\leqslant", true); +defineSymbol(math, ams, rel, "\u2A95", "\\eqslantless", true); +defineSymbol(math, ams, rel, "\u2272", "\\lesssim", true); +defineSymbol(math, ams, rel, "\u2A85", "\\lessapprox", true); +defineSymbol(math, ams, rel, "\u224A", "\\approxeq", true); +defineSymbol(math, ams, bin, "\u22D6", "\\lessdot"); +defineSymbol(math, ams, rel, "\u22D8", "\\lll", true); +defineSymbol(math, ams, rel, "\u2276", "\\lessgtr", true); +defineSymbol(math, ams, rel, "\u22DA", "\\lesseqgtr", true); +defineSymbol(math, ams, rel, "\u2A8B", "\\lesseqqgtr", true); +defineSymbol(math, ams, rel, "\u2251", "\\doteqdot"); +defineSymbol(math, ams, rel, "\u2253", "\\risingdotseq", true); +defineSymbol(math, ams, rel, "\u2252", "\\fallingdotseq", true); +defineSymbol(math, ams, rel, "\u223D", "\\backsim", true); +defineSymbol(math, ams, rel, "\u22CD", "\\backsimeq", true); +defineSymbol(math, ams, rel, "\u2AC5", "\\subseteqq", true); +defineSymbol(math, ams, rel, "\u22D0", "\\Subset", true); +defineSymbol(math, ams, rel, "\u228F", "\\sqsubset", true); +defineSymbol(math, ams, rel, "\u227C", "\\preccurlyeq", true); +defineSymbol(math, ams, rel, "\u22DE", "\\curlyeqprec", true); +defineSymbol(math, ams, rel, "\u227E", "\\precsim", true); +defineSymbol(math, ams, rel, "\u2AB7", "\\precapprox", true); +defineSymbol(math, ams, rel, "\u22B2", "\\vartriangleleft"); +defineSymbol(math, ams, rel, "\u22B4", "\\trianglelefteq"); +defineSymbol(math, ams, rel, "\u22A8", "\\vDash", true); +defineSymbol(math, ams, rel, "\u22AA", "\\Vvdash", true); +defineSymbol(math, ams, rel, "\u2323", "\\smallsmile"); +defineSymbol(math, ams, rel, "\u2322", "\\smallfrown"); +defineSymbol(math, ams, rel, "\u224F", "\\bumpeq", true); +defineSymbol(math, ams, rel, "\u224E", "\\Bumpeq", true); +defineSymbol(math, ams, rel, "\u2267", "\\geqq", true); +defineSymbol(math, ams, rel, "\u2A7E", "\\geqslant", true); +defineSymbol(math, ams, rel, "\u2A96", "\\eqslantgtr", true); +defineSymbol(math, ams, rel, "\u2273", "\\gtrsim", true); +defineSymbol(math, ams, rel, "\u2A86", "\\gtrapprox", true); +defineSymbol(math, ams, bin, "\u22D7", "\\gtrdot"); +defineSymbol(math, ams, rel, "\u22D9", "\\ggg", true); +defineSymbol(math, ams, rel, "\u2277", "\\gtrless", true); +defineSymbol(math, ams, rel, "\u22DB", "\\gtreqless", true); +defineSymbol(math, ams, rel, "\u2A8C", "\\gtreqqless", true); +defineSymbol(math, ams, rel, "\u2256", "\\eqcirc", true); +defineSymbol(math, ams, rel, "\u2257", "\\circeq", true); +defineSymbol(math, ams, rel, "\u225C", "\\triangleq", true); +defineSymbol(math, ams, rel, "\u223C", "\\thicksim"); +defineSymbol(math, ams, rel, "\u2248", "\\thickapprox"); +defineSymbol(math, ams, rel, "\u2AC6", "\\supseteqq", true); +defineSymbol(math, ams, rel, "\u22D1", "\\Supset", true); +defineSymbol(math, ams, rel, "\u2290", "\\sqsupset", true); +defineSymbol(math, ams, rel, "\u227D", "\\succcurlyeq", true); +defineSymbol(math, ams, rel, "\u22DF", "\\curlyeqsucc", true); +defineSymbol(math, ams, rel, "\u227F", "\\succsim", true); +defineSymbol(math, ams, rel, "\u2AB8", "\\succapprox", true); +defineSymbol(math, ams, rel, "\u22B3", "\\vartriangleright"); +defineSymbol(math, ams, rel, "\u22B5", "\\trianglerighteq"); +defineSymbol(math, ams, rel, "\u22A9", "\\Vdash", true); +defineSymbol(math, ams, rel, "\u2223", "\\shortmid"); +defineSymbol(math, ams, rel, "\u2225", "\\shortparallel"); +defineSymbol(math, ams, rel, "\u226C", "\\between", true); +defineSymbol(math, ams, rel, "\u22D4", "\\pitchfork", true); +defineSymbol(math, ams, rel, "\u221D", "\\varpropto"); +defineSymbol(math, ams, rel, "\u25C0", "\\blacktriangleleft"); // unicode-math says that \therefore is a mathord atom. +// We kept the amssymb atom type, which is rel. + +defineSymbol(math, ams, rel, "\u2234", "\\therefore", true); +defineSymbol(math, ams, rel, "\u220D", "\\backepsilon"); +defineSymbol(math, ams, rel, "\u25B6", "\\blacktriangleright"); // unicode-math says that \because is a mathord atom. +// We kept the amssymb atom type, which is rel. + +defineSymbol(math, ams, rel, "\u2235", "\\because", true); +defineSymbol(math, ams, rel, "\u22D8", "\\llless"); +defineSymbol(math, ams, rel, "\u22D9", "\\gggtr"); +defineSymbol(math, ams, bin, "\u22B2", "\\lhd"); +defineSymbol(math, ams, bin, "\u22B3", "\\rhd"); +defineSymbol(math, ams, rel, "\u2242", "\\eqsim", true); +defineSymbol(math, main, rel, "\u22C8", "\\Join"); +defineSymbol(math, ams, rel, "\u2251", "\\Doteq", true); // AMS Binary Operators + +defineSymbol(math, ams, bin, "\u2214", "\\dotplus", true); +defineSymbol(math, ams, bin, "\u2216", "\\smallsetminus"); +defineSymbol(math, ams, bin, "\u22D2", "\\Cap", true); +defineSymbol(math, ams, bin, "\u22D3", "\\Cup", true); +defineSymbol(math, ams, bin, "\u2A5E", "\\doublebarwedge", true); +defineSymbol(math, ams, bin, "\u229F", "\\boxminus", true); +defineSymbol(math, ams, bin, "\u229E", "\\boxplus", true); +defineSymbol(math, ams, bin, "\u22C7", "\\divideontimes", true); +defineSymbol(math, ams, bin, "\u22C9", "\\ltimes", true); +defineSymbol(math, ams, bin, "\u22CA", "\\rtimes", true); +defineSymbol(math, ams, bin, "\u22CB", "\\leftthreetimes", true); +defineSymbol(math, ams, bin, "\u22CC", "\\rightthreetimes", true); +defineSymbol(math, ams, bin, "\u22CF", "\\curlywedge", true); +defineSymbol(math, ams, bin, "\u22CE", "\\curlyvee", true); +defineSymbol(math, ams, bin, "\u229D", "\\circleddash", true); +defineSymbol(math, ams, bin, "\u229B", "\\circledast", true); +defineSymbol(math, ams, bin, "\u22C5", "\\centerdot"); +defineSymbol(math, ams, bin, "\u22BA", "\\intercal", true); +defineSymbol(math, ams, bin, "\u22D2", "\\doublecap"); +defineSymbol(math, ams, bin, "\u22D3", "\\doublecup"); +defineSymbol(math, ams, bin, "\u22A0", "\\boxtimes", true); // AMS Arrows +// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. +// We'll map it to AMS function \dashrightarrow. It produces the same atom. + +defineSymbol(math, ams, rel, "\u21E2", "\\dashrightarrow", true); // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. + +defineSymbol(math, ams, rel, "\u21E0", "\\dashleftarrow", true); +defineSymbol(math, ams, rel, "\u21C7", "\\leftleftarrows", true); +defineSymbol(math, ams, rel, "\u21C6", "\\leftrightarrows", true); +defineSymbol(math, ams, rel, "\u21DA", "\\Lleftarrow", true); +defineSymbol(math, ams, rel, "\u219E", "\\twoheadleftarrow", true); +defineSymbol(math, ams, rel, "\u21A2", "\\leftarrowtail", true); +defineSymbol(math, ams, rel, "\u21AB", "\\looparrowleft", true); +defineSymbol(math, ams, rel, "\u21CB", "\\leftrightharpoons", true); +defineSymbol(math, ams, rel, "\u21B6", "\\curvearrowleft", true); // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. + +defineSymbol(math, ams, rel, "\u21BA", "\\circlearrowleft", true); +defineSymbol(math, ams, rel, "\u21B0", "\\Lsh", true); +defineSymbol(math, ams, rel, "\u21C8", "\\upuparrows", true); +defineSymbol(math, ams, rel, "\u21BF", "\\upharpoonleft", true); +defineSymbol(math, ams, rel, "\u21C3", "\\downharpoonleft", true); +defineSymbol(math, main, rel, "\u22B6", "\\origof", true); // not in font + +defineSymbol(math, main, rel, "\u22B7", "\\imageof", true); // not in font + +defineSymbol(math, ams, rel, "\u22B8", "\\multimap", true); +defineSymbol(math, ams, rel, "\u21AD", "\\leftrightsquigarrow", true); +defineSymbol(math, ams, rel, "\u21C9", "\\rightrightarrows", true); +defineSymbol(math, ams, rel, "\u21C4", "\\rightleftarrows", true); +defineSymbol(math, ams, rel, "\u21A0", "\\twoheadrightarrow", true); +defineSymbol(math, ams, rel, "\u21A3", "\\rightarrowtail", true); +defineSymbol(math, ams, rel, "\u21AC", "\\looparrowright", true); +defineSymbol(math, ams, rel, "\u21B7", "\\curvearrowright", true); // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. + +defineSymbol(math, ams, rel, "\u21BB", "\\circlearrowright", true); +defineSymbol(math, ams, rel, "\u21B1", "\\Rsh", true); +defineSymbol(math, ams, rel, "\u21CA", "\\downdownarrows", true); +defineSymbol(math, ams, rel, "\u21BE", "\\upharpoonright", true); +defineSymbol(math, ams, rel, "\u21C2", "\\downharpoonright", true); +defineSymbol(math, ams, rel, "\u21DD", "\\rightsquigarrow", true); +defineSymbol(math, ams, rel, "\u21DD", "\\leadsto"); +defineSymbol(math, ams, rel, "\u21DB", "\\Rrightarrow", true); +defineSymbol(math, ams, rel, "\u21BE", "\\restriction"); +defineSymbol(math, main, textord, "\u2018", "`"); +defineSymbol(math, main, textord, "$", "\\$"); +defineSymbol(symbols_text, main, textord, "$", "\\$"); +defineSymbol(symbols_text, main, textord, "$", "\\textdollar"); +defineSymbol(math, main, textord, "%", "\\%"); +defineSymbol(symbols_text, main, textord, "%", "\\%"); +defineSymbol(math, main, textord, "_", "\\_"); +defineSymbol(symbols_text, main, textord, "_", "\\_"); +defineSymbol(symbols_text, main, textord, "_", "\\textunderscore"); +defineSymbol(math, main, textord, "\u2220", "\\angle", true); +defineSymbol(math, main, textord, "\u221E", "\\infty", true); +defineSymbol(math, main, textord, "\u2032", "\\prime"); +defineSymbol(math, main, textord, "\u25B3", "\\triangle"); +defineSymbol(math, main, textord, "\u0393", "\\Gamma", true); +defineSymbol(math, main, textord, "\u0394", "\\Delta", true); +defineSymbol(math, main, textord, "\u0398", "\\Theta", true); +defineSymbol(math, main, textord, "\u039B", "\\Lambda", true); +defineSymbol(math, main, textord, "\u039E", "\\Xi", true); +defineSymbol(math, main, textord, "\u03A0", "\\Pi", true); +defineSymbol(math, main, textord, "\u03A3", "\\Sigma", true); +defineSymbol(math, main, textord, "\u03A5", "\\Upsilon", true); +defineSymbol(math, main, textord, "\u03A6", "\\Phi", true); +defineSymbol(math, main, textord, "\u03A8", "\\Psi", true); +defineSymbol(math, main, textord, "\u03A9", "\\Omega", true); +defineSymbol(math, main, textord, "A", "\u0391"); +defineSymbol(math, main, textord, "B", "\u0392"); +defineSymbol(math, main, textord, "E", "\u0395"); +defineSymbol(math, main, textord, "Z", "\u0396"); +defineSymbol(math, main, textord, "H", "\u0397"); +defineSymbol(math, main, textord, "I", "\u0399"); +defineSymbol(math, main, textord, "K", "\u039A"); +defineSymbol(math, main, textord, "M", "\u039C"); +defineSymbol(math, main, textord, "N", "\u039D"); +defineSymbol(math, main, textord, "O", "\u039F"); +defineSymbol(math, main, textord, "P", "\u03A1"); +defineSymbol(math, main, textord, "T", "\u03A4"); +defineSymbol(math, main, textord, "X", "\u03A7"); +defineSymbol(math, main, textord, "\xAC", "\\neg", true); +defineSymbol(math, main, textord, "\xAC", "\\lnot"); +defineSymbol(math, main, textord, "\u22A4", "\\top"); +defineSymbol(math, main, textord, "\u22A5", "\\bot"); +defineSymbol(math, main, textord, "\u2205", "\\emptyset"); +defineSymbol(math, ams, textord, "\u2205", "\\varnothing"); +defineSymbol(math, main, mathord, "\u03B1", "\\alpha", true); +defineSymbol(math, main, mathord, "\u03B2", "\\beta", true); +defineSymbol(math, main, mathord, "\u03B3", "\\gamma", true); +defineSymbol(math, main, mathord, "\u03B4", "\\delta", true); +defineSymbol(math, main, mathord, "\u03F5", "\\epsilon", true); +defineSymbol(math, main, mathord, "\u03B6", "\\zeta", true); +defineSymbol(math, main, mathord, "\u03B7", "\\eta", true); +defineSymbol(math, main, mathord, "\u03B8", "\\theta", true); +defineSymbol(math, main, mathord, "\u03B9", "\\iota", true); +defineSymbol(math, main, mathord, "\u03BA", "\\kappa", true); +defineSymbol(math, main, mathord, "\u03BB", "\\lambda", true); +defineSymbol(math, main, mathord, "\u03BC", "\\mu", true); +defineSymbol(math, main, mathord, "\u03BD", "\\nu", true); +defineSymbol(math, main, mathord, "\u03BE", "\\xi", true); +defineSymbol(math, main, mathord, "\u03BF", "\\omicron", true); +defineSymbol(math, main, mathord, "\u03C0", "\\pi", true); +defineSymbol(math, main, mathord, "\u03C1", "\\rho", true); +defineSymbol(math, main, mathord, "\u03C3", "\\sigma", true); +defineSymbol(math, main, mathord, "\u03C4", "\\tau", true); +defineSymbol(math, main, mathord, "\u03C5", "\\upsilon", true); +defineSymbol(math, main, mathord, "\u03D5", "\\phi", true); +defineSymbol(math, main, mathord, "\u03C7", "\\chi", true); +defineSymbol(math, main, mathord, "\u03C8", "\\psi", true); +defineSymbol(math, main, mathord, "\u03C9", "\\omega", true); +defineSymbol(math, main, mathord, "\u03B5", "\\varepsilon", true); +defineSymbol(math, main, mathord, "\u03D1", "\\vartheta", true); +defineSymbol(math, main, mathord, "\u03D6", "\\varpi", true); +defineSymbol(math, main, mathord, "\u03F1", "\\varrho", true); +defineSymbol(math, main, mathord, "\u03C2", "\\varsigma", true); +defineSymbol(math, main, mathord, "\u03C6", "\\varphi", true); +defineSymbol(math, main, bin, "\u2217", "*"); +defineSymbol(math, main, bin, "+", "+"); +defineSymbol(math, main, bin, "\u2212", "-"); +defineSymbol(math, main, bin, "\u22C5", "\\cdot", true); +defineSymbol(math, main, bin, "\u2218", "\\circ"); +defineSymbol(math, main, bin, "\xF7", "\\div", true); +defineSymbol(math, main, bin, "\xB1", "\\pm", true); +defineSymbol(math, main, bin, "\xD7", "\\times", true); +defineSymbol(math, main, bin, "\u2229", "\\cap", true); +defineSymbol(math, main, bin, "\u222A", "\\cup", true); +defineSymbol(math, main, bin, "\u2216", "\\setminus"); +defineSymbol(math, main, bin, "\u2227", "\\land"); +defineSymbol(math, main, bin, "\u2228", "\\lor"); +defineSymbol(math, main, bin, "\u2227", "\\wedge", true); +defineSymbol(math, main, bin, "\u2228", "\\vee", true); +defineSymbol(math, main, textord, "\u221A", "\\surd"); +defineSymbol(math, main, symbols_open, "\u27E8", "\\langle", true); +defineSymbol(math, main, symbols_open, "\u2223", "\\lvert"); +defineSymbol(math, main, symbols_open, "\u2225", "\\lVert"); +defineSymbol(math, main, symbols_close, "?", "?"); +defineSymbol(math, main, symbols_close, "!", "!"); +defineSymbol(math, main, symbols_close, "\u27E9", "\\rangle", true); +defineSymbol(math, main, symbols_close, "\u2223", "\\rvert"); +defineSymbol(math, main, symbols_close, "\u2225", "\\rVert"); +defineSymbol(math, main, rel, "=", "="); +defineSymbol(math, main, rel, ":", ":"); +defineSymbol(math, main, rel, "\u2248", "\\approx", true); +defineSymbol(math, main, rel, "\u2245", "\\cong", true); +defineSymbol(math, main, rel, "\u2265", "\\ge"); +defineSymbol(math, main, rel, "\u2265", "\\geq", true); +defineSymbol(math, main, rel, "\u2190", "\\gets"); +defineSymbol(math, main, rel, ">", "\\gt", true); +defineSymbol(math, main, rel, "\u2208", "\\in", true); +defineSymbol(math, main, rel, "\uE020", "\\@not"); +defineSymbol(math, main, rel, "\u2282", "\\subset", true); +defineSymbol(math, main, rel, "\u2283", "\\supset", true); +defineSymbol(math, main, rel, "\u2286", "\\subseteq", true); +defineSymbol(math, main, rel, "\u2287", "\\supseteq", true); +defineSymbol(math, ams, rel, "\u2288", "\\nsubseteq", true); +defineSymbol(math, ams, rel, "\u2289", "\\nsupseteq", true); +defineSymbol(math, main, rel, "\u22A8", "\\models"); +defineSymbol(math, main, rel, "\u2190", "\\leftarrow", true); +defineSymbol(math, main, rel, "\u2264", "\\le"); +defineSymbol(math, main, rel, "\u2264", "\\leq", true); +defineSymbol(math, main, rel, "<", "\\lt", true); +defineSymbol(math, main, rel, "\u2192", "\\rightarrow", true); +defineSymbol(math, main, rel, "\u2192", "\\to"); +defineSymbol(math, ams, rel, "\u2271", "\\ngeq", true); +defineSymbol(math, ams, rel, "\u2270", "\\nleq", true); +defineSymbol(math, main, spacing, "\xA0", "\\ "); +defineSymbol(math, main, spacing, "\xA0", "~"); +defineSymbol(math, main, spacing, "\xA0", "\\space"); // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% + +defineSymbol(math, main, spacing, "\xA0", "\\nobreakspace"); +defineSymbol(symbols_text, main, spacing, "\xA0", "\\ "); +defineSymbol(symbols_text, main, spacing, "\xA0", " "); +defineSymbol(symbols_text, main, spacing, "\xA0", "~"); +defineSymbol(symbols_text, main, spacing, "\xA0", "\\space"); +defineSymbol(symbols_text, main, spacing, "\xA0", "\\nobreakspace"); +defineSymbol(math, main, spacing, null, "\\nobreak"); +defineSymbol(math, main, spacing, null, "\\allowbreak"); +defineSymbol(math, main, punct, ",", ","); +defineSymbol(math, main, punct, ";", ";"); +defineSymbol(math, ams, bin, "\u22BC", "\\barwedge", true); +defineSymbol(math, ams, bin, "\u22BB", "\\veebar", true); +defineSymbol(math, main, bin, "\u2299", "\\odot", true); +defineSymbol(math, main, bin, "\u2295", "\\oplus", true); +defineSymbol(math, main, bin, "\u2297", "\\otimes", true); +defineSymbol(math, main, textord, "\u2202", "\\partial", true); +defineSymbol(math, main, bin, "\u2298", "\\oslash", true); +defineSymbol(math, ams, bin, "\u229A", "\\circledcirc", true); +defineSymbol(math, ams, bin, "\u22A1", "\\boxdot", true); +defineSymbol(math, main, bin, "\u25B3", "\\bigtriangleup"); +defineSymbol(math, main, bin, "\u25BD", "\\bigtriangledown"); +defineSymbol(math, main, bin, "\u2020", "\\dagger"); +defineSymbol(math, main, bin, "\u22C4", "\\diamond"); +defineSymbol(math, main, bin, "\u22C6", "\\star"); +defineSymbol(math, main, bin, "\u25C3", "\\triangleleft"); +defineSymbol(math, main, bin, "\u25B9", "\\triangleright"); +defineSymbol(math, main, symbols_open, "{", "\\{"); +defineSymbol(symbols_text, main, textord, "{", "\\{"); +defineSymbol(symbols_text, main, textord, "{", "\\textbraceleft"); +defineSymbol(math, main, symbols_close, "}", "\\}"); +defineSymbol(symbols_text, main, textord, "}", "\\}"); +defineSymbol(symbols_text, main, textord, "}", "\\textbraceright"); +defineSymbol(math, main, symbols_open, "{", "\\lbrace"); +defineSymbol(math, main, symbols_close, "}", "\\rbrace"); +defineSymbol(math, main, symbols_open, "[", "\\lbrack", true); +defineSymbol(symbols_text, main, textord, "[", "\\lbrack", true); +defineSymbol(math, main, symbols_close, "]", "\\rbrack", true); +defineSymbol(symbols_text, main, textord, "]", "\\rbrack", true); +defineSymbol(math, main, symbols_open, "(", "\\lparen", true); +defineSymbol(math, main, symbols_close, ")", "\\rparen", true); +defineSymbol(symbols_text, main, textord, "<", "\\textless", true); // in T1 fontenc + +defineSymbol(symbols_text, main, textord, ">", "\\textgreater", true); // in T1 fontenc + +defineSymbol(math, main, symbols_open, "\u230A", "\\lfloor", true); +defineSymbol(math, main, symbols_close, "\u230B", "\\rfloor", true); +defineSymbol(math, main, symbols_open, "\u2308", "\\lceil", true); +defineSymbol(math, main, symbols_close, "\u2309", "\\rceil", true); +defineSymbol(math, main, textord, "\\", "\\backslash"); +defineSymbol(math, main, textord, "\u2223", "|"); +defineSymbol(math, main, textord, "\u2223", "\\vert"); +defineSymbol(symbols_text, main, textord, "|", "\\textbar", true); // in T1 fontenc + +defineSymbol(math, main, textord, "\u2225", "\\|"); +defineSymbol(math, main, textord, "\u2225", "\\Vert"); +defineSymbol(symbols_text, main, textord, "\u2225", "\\textbardbl"); +defineSymbol(symbols_text, main, textord, "~", "\\textasciitilde"); +defineSymbol(symbols_text, main, textord, "\\", "\\textbackslash"); +defineSymbol(symbols_text, main, textord, "^", "\\textasciicircum"); +defineSymbol(math, main, rel, "\u2191", "\\uparrow", true); +defineSymbol(math, main, rel, "\u21D1", "\\Uparrow", true); +defineSymbol(math, main, rel, "\u2193", "\\downarrow", true); +defineSymbol(math, main, rel, "\u21D3", "\\Downarrow", true); +defineSymbol(math, main, rel, "\u2195", "\\updownarrow", true); +defineSymbol(math, main, rel, "\u21D5", "\\Updownarrow", true); +defineSymbol(math, main, op, "\u2210", "\\coprod"); +defineSymbol(math, main, op, "\u22C1", "\\bigvee"); +defineSymbol(math, main, op, "\u22C0", "\\bigwedge"); +defineSymbol(math, main, op, "\u2A04", "\\biguplus"); +defineSymbol(math, main, op, "\u22C2", "\\bigcap"); +defineSymbol(math, main, op, "\u22C3", "\\bigcup"); +defineSymbol(math, main, op, "\u222B", "\\int"); +defineSymbol(math, main, op, "\u222B", "\\intop"); +defineSymbol(math, main, op, "\u222C", "\\iint"); +defineSymbol(math, main, op, "\u222D", "\\iiint"); +defineSymbol(math, main, op, "\u220F", "\\prod"); +defineSymbol(math, main, op, "\u2211", "\\sum"); +defineSymbol(math, main, op, "\u2A02", "\\bigotimes"); +defineSymbol(math, main, op, "\u2A01", "\\bigoplus"); +defineSymbol(math, main, op, "\u2A00", "\\bigodot"); +defineSymbol(math, main, op, "\u222E", "\\oint"); +defineSymbol(math, main, op, "\u222F", "\\oiint"); +defineSymbol(math, main, op, "\u2230", "\\oiiint"); +defineSymbol(math, main, op, "\u2A06", "\\bigsqcup"); +defineSymbol(math, main, op, "\u222B", "\\smallint"); +defineSymbol(symbols_text, main, inner, "\u2026", "\\textellipsis"); +defineSymbol(math, main, inner, "\u2026", "\\mathellipsis"); +defineSymbol(symbols_text, main, inner, "\u2026", "\\ldots", true); +defineSymbol(math, main, inner, "\u2026", "\\ldots", true); +defineSymbol(math, main, inner, "\u22EF", "\\@cdots", true); +defineSymbol(math, main, inner, "\u22F1", "\\ddots", true); +defineSymbol(math, main, textord, "\u22EE", "\\varvdots"); // \vdots is a macro + +defineSymbol(math, main, accent, "\u02CA", "\\acute"); +defineSymbol(math, main, accent, "\u02CB", "\\grave"); +defineSymbol(math, main, accent, "\xA8", "\\ddot"); +defineSymbol(math, main, accent, "~", "\\tilde"); +defineSymbol(math, main, accent, "\u02C9", "\\bar"); +defineSymbol(math, main, accent, "\u02D8", "\\breve"); +defineSymbol(math, main, accent, "\u02C7", "\\check"); +defineSymbol(math, main, accent, "^", "\\hat"); +defineSymbol(math, main, accent, "\u20D7", "\\vec"); +defineSymbol(math, main, accent, "\u02D9", "\\dot"); +defineSymbol(math, main, accent, "\u02DA", "\\mathring"); // \imath and \jmath should be invariant to \mathrm, \mathbf, etc., so use PUA + +defineSymbol(math, main, mathord, "\uE131", "\\@imath"); +defineSymbol(math, main, mathord, "\uE237", "\\@jmath"); +defineSymbol(math, main, textord, "\u0131", "\u0131"); +defineSymbol(math, main, textord, "\u0237", "\u0237"); +defineSymbol(symbols_text, main, textord, "\u0131", "\\i", true); +defineSymbol(symbols_text, main, textord, "\u0237", "\\j", true); +defineSymbol(symbols_text, main, textord, "\xDF", "\\ss", true); +defineSymbol(symbols_text, main, textord, "\xE6", "\\ae", true); +defineSymbol(symbols_text, main, textord, "\u0153", "\\oe", true); +defineSymbol(symbols_text, main, textord, "\xF8", "\\o", true); +defineSymbol(symbols_text, main, textord, "\xC6", "\\AE", true); +defineSymbol(symbols_text, main, textord, "\u0152", "\\OE", true); +defineSymbol(symbols_text, main, textord, "\xD8", "\\O", true); +defineSymbol(symbols_text, main, accent, "\u02CA", "\\'"); // acute + +defineSymbol(symbols_text, main, accent, "\u02CB", "\\`"); // grave + +defineSymbol(symbols_text, main, accent, "\u02C6", "\\^"); // circumflex + +defineSymbol(symbols_text, main, accent, "\u02DC", "\\~"); // tilde + +defineSymbol(symbols_text, main, accent, "\u02C9", "\\="); // macron + +defineSymbol(symbols_text, main, accent, "\u02D8", "\\u"); // breve + +defineSymbol(symbols_text, main, accent, "\u02D9", "\\."); // dot above + +defineSymbol(symbols_text, main, accent, "\u02DA", "\\r"); // ring above + +defineSymbol(symbols_text, main, accent, "\u02C7", "\\v"); // caron + +defineSymbol(symbols_text, main, accent, "\xA8", '\\"'); // diaresis + +defineSymbol(symbols_text, main, accent, "\u02DD", "\\H"); // double acute + +defineSymbol(symbols_text, main, accent, "\u25EF", "\\textcircled"); // \bigcirc glyph +// These ligatures are detected and created in Parser.js's `formLigatures`. + +var ligatures = { + "--": true, + "---": true, + "``": true, + "''": true +}; +defineSymbol(symbols_text, main, textord, "\u2013", "--", true); +defineSymbol(symbols_text, main, textord, "\u2013", "\\textendash"); +defineSymbol(symbols_text, main, textord, "\u2014", "---", true); +defineSymbol(symbols_text, main, textord, "\u2014", "\\textemdash"); +defineSymbol(symbols_text, main, textord, "\u2018", "`", true); +defineSymbol(symbols_text, main, textord, "\u2018", "\\textquoteleft"); +defineSymbol(symbols_text, main, textord, "\u2019", "'", true); +defineSymbol(symbols_text, main, textord, "\u2019", "\\textquoteright"); +defineSymbol(symbols_text, main, textord, "\u201C", "``", true); +defineSymbol(symbols_text, main, textord, "\u201C", "\\textquotedblleft"); +defineSymbol(symbols_text, main, textord, "\u201D", "''", true); +defineSymbol(symbols_text, main, textord, "\u201D", "\\textquotedblright"); // \degree from gensymb package + +defineSymbol(math, main, textord, "\xB0", "\\degree", true); +defineSymbol(symbols_text, main, textord, "\xB0", "\\degree"); // \textdegree from inputenc package + +defineSymbol(symbols_text, main, textord, "\xB0", "\\textdegree", true); // TODO: In LaTeX, \pounds can generate a different character in text and math +// mode, but among our fonts, only Main-Regular defines this character "163". + +defineSymbol(math, main, textord, "\xA3", "\\pounds"); +defineSymbol(math, main, textord, "\xA3", "\\mathsterling", true); +defineSymbol(symbols_text, main, textord, "\xA3", "\\pounds"); +defineSymbol(symbols_text, main, textord, "\xA3", "\\textsterling", true); +defineSymbol(math, ams, textord, "\u2720", "\\maltese"); +defineSymbol(symbols_text, ams, textord, "\u2720", "\\maltese"); // There are lots of symbols which are the same, so we add them in afterwards. +// All of these are textords in math mode + +var mathTextSymbols = "0123456789/@.\""; + +for (var i = 0; i < mathTextSymbols.length; i++) { + var ch = mathTextSymbols.charAt(i); + defineSymbol(math, main, textord, ch, ch); +} // All of these are textords in text mode + + +var textSymbols = "0123456789!@*()-=+\";:?/.,"; + +for (var _i = 0; _i < textSymbols.length; _i++) { + var _ch = textSymbols.charAt(_i); + + defineSymbol(symbols_text, main, textord, _ch, _ch); +} // All of these are textords in text mode, and mathords in math mode + + +var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +for (var _i2 = 0; _i2 < letters.length; _i2++) { + var _ch2 = letters.charAt(_i2); + + defineSymbol(math, main, mathord, _ch2, _ch2); + defineSymbol(symbols_text, main, textord, _ch2, _ch2); +} // Blackboard bold and script letters in Unicode range + + +defineSymbol(math, ams, textord, "C", "\u2102"); // blackboard bold + +defineSymbol(symbols_text, ams, textord, "C", "\u2102"); +defineSymbol(math, ams, textord, "H", "\u210D"); +defineSymbol(symbols_text, ams, textord, "H", "\u210D"); +defineSymbol(math, ams, textord, "N", "\u2115"); +defineSymbol(symbols_text, ams, textord, "N", "\u2115"); +defineSymbol(math, ams, textord, "P", "\u2119"); +defineSymbol(symbols_text, ams, textord, "P", "\u2119"); +defineSymbol(math, ams, textord, "Q", "\u211A"); +defineSymbol(symbols_text, ams, textord, "Q", "\u211A"); +defineSymbol(math, ams, textord, "R", "\u211D"); +defineSymbol(symbols_text, ams, textord, "R", "\u211D"); +defineSymbol(math, ams, textord, "Z", "\u2124"); +defineSymbol(symbols_text, ams, textord, "Z", "\u2124"); +defineSymbol(math, main, mathord, "h", "\u210E"); // italic h, Planck constant + +defineSymbol(symbols_text, main, mathord, "h", "\u210E"); // The next loop loads wide (surrogate pair) characters. +// We support some letters in the Unicode range U+1D400 to U+1D7FF, +// Mathematical Alphanumeric Symbols. +// Some editors do not deal well with wide characters. So don't write the +// string into this file. Instead, create the string from the surrogate pair. + +var wideChar = ""; + +for (var _i3 = 0; _i3 < letters.length; _i3++) { + var _ch3 = letters.charAt(_i3); // The hex numbers in the next line are a surrogate pair. + // 0xD835 is the high surrogate for all letters in the range we support. + // 0xDC00 is the low surrogate for bold A. + + + wideChar = String.fromCharCode(0xD835, 0xDC00 + _i3); // A-Z a-z bold + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDC34 + _i3); // A-Z a-z italic + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDC68 + _i3); // A-Z a-z bold italic + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDD04 + _i3); // A-Z a-z Fractur + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDDA0 + _i3); // A-Z a-z sans-serif + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDDD4 + _i3); // A-Z a-z sans bold + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDE08 + _i3); // A-Z a-z sans italic + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDE70 + _i3); // A-Z a-z monospace + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + + if (_i3 < 26) { + // KaTeX fonts have only capital letters for blackboard bold and script. + // See exception for k below. + wideChar = String.fromCharCode(0xD835, 0xDD38 + _i3); // A-Z double struck + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDC9C + _i3); // A-Z script + + defineSymbol(math, main, mathord, _ch3, wideChar); + defineSymbol(symbols_text, main, textord, _ch3, wideChar); + } // TODO: Add bold script when it is supported by a KaTeX font. + +} // "k" is the only double struck lower case letter in the KaTeX fonts. + + +wideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck + +defineSymbol(math, main, mathord, "k", wideChar); +defineSymbol(symbols_text, main, textord, "k", wideChar); // Next, some wide character numerals + +for (var _i4 = 0; _i4 < 10; _i4++) { + var _ch4 = _i4.toString(); + + wideChar = String.fromCharCode(0xD835, 0xDFCE + _i4); // 0-9 bold + + defineSymbol(math, main, mathord, _ch4, wideChar); + defineSymbol(symbols_text, main, textord, _ch4, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDFE2 + _i4); // 0-9 sans serif + + defineSymbol(math, main, mathord, _ch4, wideChar); + defineSymbol(symbols_text, main, textord, _ch4, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDFEC + _i4); // 0-9 bold sans + + defineSymbol(math, main, mathord, _ch4, wideChar); + defineSymbol(symbols_text, main, textord, _ch4, wideChar); + wideChar = String.fromCharCode(0xD835, 0xDFF6 + _i4); // 0-9 monospace + + defineSymbol(math, main, mathord, _ch4, wideChar); + defineSymbol(symbols_text, main, textord, _ch4, wideChar); +} // We add these Latin-1 letters as symbols for backwards-compatibility, +// but they are not actually in the font, nor are they supported by the +// Unicode accent mechanism, so they fall back to Times font and look ugly. +// TODO(edemaine): Fix this. + + +var extraLatin = "\xC7\xD0\xDE\xE7\xFE"; + +for (var _i5 = 0; _i5 < extraLatin.length; _i5++) { + var _ch5 = extraLatin.charAt(_i5); + + defineSymbol(math, main, mathord, _ch5, _ch5); + defineSymbol(symbols_text, main, textord, _ch5, _ch5); +} +;// CONCATENATED MODULE: ./src/wide-character.js +/** + * This file provides support for Unicode range U+1D400 to U+1D7FF, + * Mathematical Alphanumeric Symbols. + * + * Function wideCharacterFont takes a wide character as input and returns + * the font information necessary to render it properly. + */ + +/** + * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf + * That document sorts characters into groups by font type, say bold or italic. + * + * In the arrays below, each subarray consists three elements: + * * The CSS class of that group when in math mode. + * * The CSS class of that group when in text mode. + * * The font name, so that KaTeX can get font metrics. + */ + +var wideLatinLetterData = [["mathbf", "textbf", "Main-Bold"], // A-Z bold upright +["mathbf", "textbf", "Main-Bold"], // a-z bold upright +["mathnormal", "textit", "Math-Italic"], // A-Z italic +["mathnormal", "textit", "Math-Italic"], // a-z italic +["boldsymbol", "boldsymbol", "Main-BoldItalic"], // A-Z bold italic +["boldsymbol", "boldsymbol", "Main-BoldItalic"], // a-z bold italic +// Map fancy A-Z letters to script, not calligraphic. +// This aligns with unicode-math and math fonts (except Cambria Math). +["mathscr", "textscr", "Script-Regular"], // A-Z script +["", "", ""], // a-z script. No font +["", "", ""], // A-Z bold script. No font +["", "", ""], // a-z bold script. No font +["mathfrak", "textfrak", "Fraktur-Regular"], // A-Z Fraktur +["mathfrak", "textfrak", "Fraktur-Regular"], // a-z Fraktur +["mathbb", "textbb", "AMS-Regular"], // A-Z double-struck +["mathbb", "textbb", "AMS-Regular"], // k double-struck +["", "", ""], // A-Z bold Fraktur No font metrics +["", "", ""], // a-z bold Fraktur. No font. +["mathsf", "textsf", "SansSerif-Regular"], // A-Z sans-serif +["mathsf", "textsf", "SansSerif-Regular"], // a-z sans-serif +["mathboldsf", "textboldsf", "SansSerif-Bold"], // A-Z bold sans-serif +["mathboldsf", "textboldsf", "SansSerif-Bold"], // a-z bold sans-serif +["mathitsf", "textitsf", "SansSerif-Italic"], // A-Z italic sans-serif +["mathitsf", "textitsf", "SansSerif-Italic"], // a-z italic sans-serif +["", "", ""], // A-Z bold italic sans. No font +["", "", ""], // a-z bold italic sans. No font +["mathtt", "texttt", "Typewriter-Regular"], // A-Z monospace +["mathtt", "texttt", "Typewriter-Regular"] // a-z monospace +]; +var wideNumeralData = [["mathbf", "textbf", "Main-Bold"], // 0-9 bold +["", "", ""], // 0-9 double-struck. No KaTeX font. +["mathsf", "textsf", "SansSerif-Regular"], // 0-9 sans-serif +["mathboldsf", "textboldsf", "SansSerif-Bold"], // 0-9 bold sans-serif +["mathtt", "texttt", "Typewriter-Regular"] // 0-9 monospace +]; +var wideCharacterFont = function wideCharacterFont(wideChar, mode) { + // IE doesn't support codePointAt(). So work with the surrogate pair. + var H = wideChar.charCodeAt(0); // high surrogate + + var L = wideChar.charCodeAt(1); // low surrogate + + var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000; + var j = mode === "math" ? 0 : 1; // column index for CSS class. + + if (0x1D400 <= codePoint && codePoint < 0x1D6A4) { + // wideLatinLetterData contains exactly 26 chars on each row. + // So we can calculate the relevant row. No traverse necessary. + var i = Math.floor((codePoint - 0x1D400) / 26); + return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]]; + } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) { + // Numerals, ten per row. + var _i = Math.floor((codePoint - 0x1D7CE) / 10); + + return [wideNumeralData[_i][2], wideNumeralData[_i][j]]; + } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) { + // dotless i or j + return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]]; + } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) { + // Greek letters. Not supported, yet. + return ["", ""]; + } else { + // We don't support any wide characters outside 1D400–1D7FF. + throw new src_ParseError("Unsupported character: " + wideChar); + } +}; +;// CONCATENATED MODULE: ./src/Options.js +/** + * This file contains information about the options that the Parser carries + * around with it while parsing. Data is held in an `Options` object, and when + * recursing, a new `Options` object can be created with the `.with*` and + * `.reset` functions. + */ + +var sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize]. +// The size mappings are taken from TeX with \normalsize=10pt. +[1, 1, 1], // size1: [5, 5, 5] \tiny +[2, 1, 1], // size2: [6, 5, 5] +[3, 1, 1], // size3: [7, 5, 5] \scriptsize +[4, 2, 1], // size4: [8, 6, 5] \footnotesize +[5, 2, 1], // size5: [9, 6, 5] \small +[6, 3, 1], // size6: [10, 7, 5] \normalsize +[7, 4, 2], // size7: [12, 8, 6] \large +[8, 6, 3], // size8: [14.4, 10, 7] \Large +[9, 7, 6], // size9: [17.28, 12, 10] \LARGE +[10, 8, 7], // size10: [20.74, 14.4, 12] \huge +[11, 10, 9] // size11: [24.88, 20.74, 17.28] \HUGE +]; +var sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if +// you change size indexes, change that function. +0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488]; + +var sizeAtStyle = function sizeAtStyle(size, style) { + return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1]; +}; // In these types, "" (empty string) means "no change". + + +/** + * This is the main options class. It contains the current style, size, color, + * and font. + * + * Options objects should not be modified. To create a new Options with + * different properties, call a `.having*` method. + */ +var Options = /*#__PURE__*/function () { + // A font family applies to a group of fonts (i.e. SansSerif), while a font + // represents a specific font (i.e. SansSerif Bold). + // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm + + /** + * The base size index. + */ + function Options(data) { + this.style = void 0; + this.color = void 0; + this.size = void 0; + this.textSize = void 0; + this.phantom = void 0; + this.font = void 0; + this.fontFamily = void 0; + this.fontWeight = void 0; + this.fontShape = void 0; + this.sizeMultiplier = void 0; + this.maxSize = void 0; + this.minRuleThickness = void 0; + this._fontMetrics = void 0; + this.style = data.style; + this.color = data.color; + this.size = data.size || Options.BASESIZE; + this.textSize = data.textSize || this.size; + this.phantom = !!data.phantom; + this.font = data.font || ""; + this.fontFamily = data.fontFamily || ""; + this.fontWeight = data.fontWeight || ''; + this.fontShape = data.fontShape || ''; + this.sizeMultiplier = sizeMultipliers[this.size - 1]; + this.maxSize = data.maxSize; + this.minRuleThickness = data.minRuleThickness; + this._fontMetrics = undefined; + } + /** + * Returns a new options object with the same properties as "this". Properties + * from "extension" will be copied to the new options object. + */ + + + var _proto = Options.prototype; + + _proto.extend = function extend(extension) { + var data = { + style: this.style, + size: this.size, + textSize: this.textSize, + color: this.color, + phantom: this.phantom, + font: this.font, + fontFamily: this.fontFamily, + fontWeight: this.fontWeight, + fontShape: this.fontShape, + maxSize: this.maxSize, + minRuleThickness: this.minRuleThickness + }; + + for (var key in extension) { + if (extension.hasOwnProperty(key)) { + data[key] = extension[key]; + } + } + + return new Options(data); + } + /** + * Return an options object with the given style. If `this.style === style`, + * returns `this`. + */ + ; + + _proto.havingStyle = function havingStyle(style) { + if (this.style === style) { + return this; + } else { + return this.extend({ + style: style, + size: sizeAtStyle(this.textSize, style) + }); + } + } + /** + * Return an options object with a cramped version of the current style. If + * the current style is cramped, returns `this`. + */ + ; + + _proto.havingCrampedStyle = function havingCrampedStyle() { + return this.havingStyle(this.style.cramp()); + } + /** + * Return an options object with the given size and in at least `\textstyle`. + * Returns `this` if appropriate. + */ + ; + + _proto.havingSize = function havingSize(size) { + if (this.size === size && this.textSize === size) { + return this; + } else { + return this.extend({ + style: this.style.text(), + size: size, + textSize: size, + sizeMultiplier: sizeMultipliers[size - 1] + }); + } + } + /** + * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted, + * changes to at least `\textstyle`. + */ + ; + + _proto.havingBaseStyle = function havingBaseStyle(style) { + style = style || this.style.text(); + var wantSize = sizeAtStyle(Options.BASESIZE, style); + + if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) { + return this; + } else { + return this.extend({ + style: style, + size: wantSize + }); + } + } + /** + * Remove the effect of sizing changes such as \Huge. + * Keep the effect of the current style, such as \scriptstyle. + */ + ; + + _proto.havingBaseSizing = function havingBaseSizing() { + var size; + + switch (this.style.id) { + case 4: + case 5: + size = 3; // normalsize in scriptstyle + + break; + + case 6: + case 7: + size = 1; // normalsize in scriptscriptstyle + + break; + + default: + size = 6; + // normalsize in textstyle or displaystyle + } + + return this.extend({ + style: this.style.text(), + size: size + }); + } + /** + * Create a new options object with the given color. + */ + ; + + _proto.withColor = function withColor(color) { + return this.extend({ + color: color + }); + } + /** + * Create a new options object with "phantom" set to true. + */ + ; + + _proto.withPhantom = function withPhantom() { + return this.extend({ + phantom: true + }); + } + /** + * Creates a new options object with the given math font or old text font. + * @type {[type]} + */ + ; + + _proto.withFont = function withFont(font) { + return this.extend({ + font: font + }); + } + /** + * Create a new options objects with the given fontFamily. + */ + ; + + _proto.withTextFontFamily = function withTextFontFamily(fontFamily) { + return this.extend({ + fontFamily: fontFamily, + font: "" + }); + } + /** + * Creates a new options object with the given font weight + */ + ; + + _proto.withTextFontWeight = function withTextFontWeight(fontWeight) { + return this.extend({ + fontWeight: fontWeight, + font: "" + }); + } + /** + * Creates a new options object with the given font weight + */ + ; + + _proto.withTextFontShape = function withTextFontShape(fontShape) { + return this.extend({ + fontShape: fontShape, + font: "" + }); + } + /** + * Return the CSS sizing classes required to switch from enclosing options + * `oldOptions` to `this`. Returns an array of classes. + */ + ; + + _proto.sizingClasses = function sizingClasses(oldOptions) { + if (oldOptions.size !== this.size) { + return ["sizing", "reset-size" + oldOptions.size, "size" + this.size]; + } else { + return []; + } + } + /** + * Return the CSS sizing classes required to switch to the base size. Like + * `this.havingSize(BASESIZE).sizingClasses(this)`. + */ + ; + + _proto.baseSizingClasses = function baseSizingClasses() { + if (this.size !== Options.BASESIZE) { + return ["sizing", "reset-size" + this.size, "size" + Options.BASESIZE]; + } else { + return []; + } + } + /** + * Return the font metrics for this size. + */ + ; + + _proto.fontMetrics = function fontMetrics() { + if (!this._fontMetrics) { + this._fontMetrics = getGlobalMetrics(this.size); + } + + return this._fontMetrics; + } + /** + * Gets the CSS color of the current options object + */ + ; + + _proto.getColor = function getColor() { + if (this.phantom) { + return "transparent"; + } else { + return this.color; + } + }; + + return Options; +}(); + +Options.BASESIZE = 6; +/* harmony default export */ var src_Options = (Options); +;// CONCATENATED MODULE: ./src/units.js +/** + * This file does conversion between units. In particular, it provides + * calculateSize to convert other units into ems. + */ + + // This table gives the number of TeX pts in one of each *absolute* TeX unit. +// Thus, multiplying a length by this number converts the length from units +// into pts. Dividing the result by ptPerEm gives the number of ems +// *assuming* a font size of ptPerEm (normal size, normal style). + +var ptPerUnit = { + // https://en.wikibooks.org/wiki/LaTeX/Lengths and + // https://tex.stackexchange.com/a/8263 + "pt": 1, + // TeX point + "mm": 7227 / 2540, + // millimeter + "cm": 7227 / 254, + // centimeter + "in": 72.27, + // inch + "bp": 803 / 800, + // big (PostScript) points + "pc": 12, + // pica + "dd": 1238 / 1157, + // didot + "cc": 14856 / 1157, + // cicero (12 didot) + "nd": 685 / 642, + // new didot + "nc": 1370 / 107, + // new cicero (12 new didot) + "sp": 1 / 65536, + // scaled point (TeX's internal smallest unit) + // https://tex.stackexchange.com/a/41371 + "px": 803 / 800 // \pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX + +}; // Dictionary of relative units, for fast validity testing. + +var relativeUnit = { + "ex": true, + "em": true, + "mu": true +}; + +/** + * Determine whether the specified unit (either a string defining the unit + * or a "size" parse node containing a unit field) is valid. + */ +var validUnit = function validUnit(unit) { + if (typeof unit !== "string") { + unit = unit.unit; + } + + return unit in ptPerUnit || unit in relativeUnit || unit === "ex"; +}; +/* + * Convert a "size" parse node (with numeric "number" and string "unit" fields, + * as parsed by functions.js argType "size") into a CSS em value for the + * current style/scale. `options` gives the current options. + */ + +var calculateSize = function calculateSize(sizeValue, options) { + var scale; + + if (sizeValue.unit in ptPerUnit) { + // Absolute units + scale = ptPerUnit[sizeValue.unit] // Convert unit to pt + / options.fontMetrics().ptPerEm // Convert pt to CSS em + / options.sizeMultiplier; // Unscale to make absolute units + } else if (sizeValue.unit === "mu") { + // `mu` units scale with scriptstyle/scriptscriptstyle. + scale = options.fontMetrics().cssEmPerMu; + } else { + // Other relative units always refer to the *textstyle* font + // in the current size. + var unitOptions; + + if (options.style.isTight()) { + // isTight() means current style is script/scriptscript. + unitOptions = options.havingStyle(options.style.text()); + } else { + unitOptions = options; + } // TODO: In TeX these units are relative to the quad of the current + // *text* font, e.g. cmr10. KaTeX instead uses values from the + // comparably-sized *Computer Modern symbol* font. At 10pt, these + // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641; + // cmr5=1.361133, cmsy5=1.472241. Consider $\scriptsize a\kern1emb$. + // TeX \showlists shows a kern of 1.13889 * fontsize; + // KaTeX shows a kern of 1.171 * fontsize. + + + if (sizeValue.unit === "ex") { + scale = unitOptions.fontMetrics().xHeight; + } else if (sizeValue.unit === "em") { + scale = unitOptions.fontMetrics().quad; + } else { + throw new src_ParseError("Invalid unit: '" + sizeValue.unit + "'"); + } + + if (unitOptions !== options) { + scale *= unitOptions.sizeMultiplier / options.sizeMultiplier; + } + } + + return Math.min(sizeValue.number * scale, options.maxSize); +}; +;// CONCATENATED MODULE: ./src/buildCommon.js +/* eslint no-console:0 */ + +/** + * This module contains general functions that can be used for building + * different kinds of domTree nodes in a consistent manner. + */ + + + + + + + +/** + * Looks up the given symbol in fontMetrics, after applying any symbol + * replacements defined in symbol.js + */ +var lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this. +fontName, mode) { + // Replace the value with its replaced value from symbol.js + if (src_symbols[mode][value] && src_symbols[mode][value].replace) { + value = src_symbols[mode][value].replace; + } + + return { + value: value, + metrics: getCharacterMetrics(value, fontName, mode) + }; +}; +/** + * Makes a symbolNode after translation via the list of symbols in symbols.js. + * Correctly pulls out metrics for the character, and optionally takes a list of + * classes to be attached to the node. + * + * TODO: make argument order closer to makeSpan + * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which + * should if present come first in `classes`. + * TODO(#953): Make `options` mandatory and always pass it in. + */ + + +var makeSymbol = function makeSymbol(value, fontName, mode, options, classes) { + var lookup = lookupSymbol(value, fontName, mode); + var metrics = lookup.metrics; + value = lookup.value; + var symbolNode; + + if (metrics) { + var italic = metrics.italic; + + if (mode === "text" || options && options.font === "mathit") { + italic = 0; + } + + symbolNode = new SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes); + } else { + // TODO(emily): Figure out a good way to only print this in development + typeof console !== "undefined" && console.warn("No character metrics " + ("for '" + value + "' in style '" + fontName + "' and mode '" + mode + "'")); + symbolNode = new SymbolNode(value, 0, 0, 0, 0, 0, classes); + } + + if (options) { + symbolNode.maxFontSize = options.sizeMultiplier; + + if (options.style.isTight()) { + symbolNode.classes.push("mtight"); + } + + var color = options.getColor(); + + if (color) { + symbolNode.style.color = color; + } + } + + return symbolNode; +}; +/** + * Makes a symbol in Main-Regular or AMS-Regular. + * Used for rel, bin, open, close, inner, and punct. + */ + + +var mathsym = function mathsym(value, mode, options, classes) { + if (classes === void 0) { + classes = []; + } + + // Decide what font to render the symbol in by its entry in the symbols + // table. + // Have a special case for when the value = \ because the \ is used as a + // textord in unsupported command errors but cannot be parsed as a regular + // text ordinal and is therefore not present as a symbol in the symbols + // table for text, as well as a special case for boldsymbol because it + // can be used for bold + and - + if (options.font === "boldsymbol" && lookupSymbol(value, "Main-Bold", mode).metrics) { + return makeSymbol(value, "Main-Bold", mode, options, classes.concat(["mathbf"])); + } else if (value === "\\" || src_symbols[mode][value].font === "main") { + return makeSymbol(value, "Main-Regular", mode, options, classes); + } else { + return makeSymbol(value, "AMS-Regular", mode, options, classes.concat(["amsrm"])); + } +}; +/** + * Determines which of the two font names (Main-Bold and Math-BoldItalic) and + * corresponding style tags (mathbf or boldsymbol) to use for font "boldsymbol", + * depending on the symbol. Use this function instead of fontMap for font + * "boldsymbol". + */ + + +var boldsymbol = function boldsymbol(value, mode, options, classes, type) { + if (type !== "textord" && lookupSymbol(value, "Math-BoldItalic", mode).metrics) { + return { + fontName: "Math-BoldItalic", + fontClass: "boldsymbol" + }; + } else { + // Some glyphs do not exist in Math-BoldItalic so we need to use + // Main-Bold instead. + return { + fontName: "Main-Bold", + fontClass: "mathbf" + }; + } +}; +/** + * Makes either a mathord or textord in the correct font and color. + */ + + +var makeOrd = function makeOrd(group, options, type) { + var mode = group.mode; + var text = group.text; + var classes = ["mord"]; // Math mode or Old font (i.e. \rm) + + var isFont = mode === "math" || mode === "text" && options.font; + var fontOrFamily = isFont ? options.font : options.fontFamily; + + if (text.charCodeAt(0) === 0xD835) { + // surrogate pairs get special treatment + var _wideCharacterFont = wideCharacterFont(text, mode), + wideFontName = _wideCharacterFont[0], + wideFontClass = _wideCharacterFont[1]; + + return makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass)); + } else if (fontOrFamily) { + var fontName; + var fontClasses; + + if (fontOrFamily === "boldsymbol") { + var fontData = boldsymbol(text, mode, options, classes, type); + fontName = fontData.fontName; + fontClasses = [fontData.fontClass]; + } else if (isFont) { + fontName = fontMap[fontOrFamily].fontName; + fontClasses = [fontOrFamily]; + } else { + fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape); + fontClasses = [fontOrFamily, options.fontWeight, options.fontShape]; + } + + if (lookupSymbol(text, fontName, mode).metrics) { + return makeSymbol(text, fontName, mode, options, classes.concat(fontClasses)); + } else if (ligatures.hasOwnProperty(text) && fontName.substr(0, 10) === "Typewriter") { + // Deconstruct ligatures in monospace fonts (\texttt, \tt). + var parts = []; + + for (var i = 0; i < text.length; i++) { + parts.push(makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses))); + } + + return makeFragment(parts); + } + } // Makes a symbol in the default font for mathords and textords. + + + if (type === "mathord") { + return makeSymbol(text, "Math-Italic", mode, options, classes.concat(["mathnormal"])); + } else if (type === "textord") { + var font = src_symbols[mode][text] && src_symbols[mode][text].font; + + if (font === "ams") { + var _fontName = retrieveTextFontName("amsrm", options.fontWeight, options.fontShape); + + return makeSymbol(text, _fontName, mode, options, classes.concat("amsrm", options.fontWeight, options.fontShape)); + } else if (font === "main" || !font) { + var _fontName2 = retrieveTextFontName("textrm", options.fontWeight, options.fontShape); + + return makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape)); + } else { + // fonts added by plugins + var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class + + + return makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape)); + } + } else { + throw new Error("unexpected type: " + type + " in makeOrd"); + } +}; +/** + * Returns true if subsequent symbolNodes have the same classes, skew, maxFont, + * and styles. + */ + + +var canCombine = function canCombine(prev, next) { + if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) { + return false; + } // If prev and next both are just "mbin"s or "mord"s we don't combine them + // so that the proper spacing can be preserved. + + + if (prev.classes.length === 1) { + var cls = prev.classes[0]; + + if (cls === "mbin" || cls === "mord") { + return false; + } + } + + for (var style in prev.style) { + if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) { + return false; + } + } + + for (var _style in next.style) { + if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) { + return false; + } + } + + return true; +}; +/** + * Combine consecutive domTree.symbolNodes into a single symbolNode. + * Note: this function mutates the argument. + */ + + +var tryCombineChars = function tryCombineChars(chars) { + for (var i = 0; i < chars.length - 1; i++) { + var prev = chars[i]; + var next = chars[i + 1]; + + if (prev instanceof SymbolNode && next instanceof SymbolNode && canCombine(prev, next)) { + prev.text += next.text; + prev.height = Math.max(prev.height, next.height); + prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use + // it to add padding to the right of the span created from + // the combined characters. + + prev.italic = next.italic; + chars.splice(i + 1, 1); + i--; + } + } + + return chars; +}; +/** + * Calculate the height, depth, and maxFontSize of an element based on its + * children. + */ + + +var sizeElementFromChildren = function sizeElementFromChildren(elem) { + var height = 0; + var depth = 0; + var maxFontSize = 0; + + for (var i = 0; i < elem.children.length; i++) { + var child = elem.children[i]; + + if (child.height > height) { + height = child.height; + } + + if (child.depth > depth) { + depth = child.depth; + } + + if (child.maxFontSize > maxFontSize) { + maxFontSize = child.maxFontSize; + } + } + + elem.height = height; + elem.depth = depth; + elem.maxFontSize = maxFontSize; +}; +/** + * Makes a span with the given list of classes, list of children, and options. + * + * TODO(#953): Ensure that `options` is always provided (currently some call + * sites don't pass it) and make the type below mandatory. + * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which + * should if present come first in `classes`. + */ + + +var makeSpan = function makeSpan(classes, children, options, style) { + var span = new Span(classes, children, options, style); + sizeElementFromChildren(span); + return span; +}; // SVG one is simpler -- doesn't require height, depth, max-font setting. +// This is also a separate method for typesafety. + + +var makeSvgSpan = function makeSvgSpan(classes, children, options, style) { + return new Span(classes, children, options, style); +}; + +var makeLineSpan = function makeLineSpan(className, options, thickness) { + var line = makeSpan([className], [], options); + line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness); + line.style.borderBottomWidth = line.height + "em"; + line.maxFontSize = 1.0; + return line; +}; +/** + * Makes an anchor with the given href, list of classes, list of children, + * and options. + */ + + +var makeAnchor = function makeAnchor(href, classes, children, options) { + var anchor = new Anchor(href, classes, children, options); + sizeElementFromChildren(anchor); + return anchor; +}; +/** + * Makes a document fragment with the given list of children. + */ + + +var makeFragment = function makeFragment(children) { + var fragment = new DocumentFragment(children); + sizeElementFromChildren(fragment); + return fragment; +}; +/** + * Wraps group in a span if it's a document fragment, allowing to apply classes + * and styles + */ + + +var wrapFragment = function wrapFragment(group, options) { + if (group instanceof DocumentFragment) { + return makeSpan([], [group], options); + } + + return group; +}; // These are exact object types to catch typos in the names of the optional fields. + + +// Computes the updated `children` list and the overall depth. +// +// This helper function for makeVList makes it easier to enforce type safety by +// allowing early exits (returns) in the logic. +var getVListChildrenAndDepth = function getVListChildrenAndDepth(params) { + if (params.positionType === "individualShift") { + var oldChildren = params.children; + var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be + // shifted to the correct specified shift + + var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth; + + var currPos = _depth; + + for (var i = 1; i < oldChildren.length; i++) { + var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth; + var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth); + currPos = currPos + diff; + children.push({ + type: "kern", + size: size + }); + children.push(oldChildren[i]); + } + + return { + children: children, + depth: _depth + }; + } + + var depth; + + if (params.positionType === "top") { + // We always start at the bottom, so calculate the bottom by adding up + // all the sizes + var bottom = params.positionData; + + for (var _i = 0; _i < params.children.length; _i++) { + var child = params.children[_i]; + bottom -= child.type === "kern" ? child.size : child.elem.height + child.elem.depth; + } + + depth = bottom; + } else if (params.positionType === "bottom") { + depth = -params.positionData; + } else { + var firstChild = params.children[0]; + + if (firstChild.type !== "elem") { + throw new Error('First child must have type "elem".'); + } + + if (params.positionType === "shift") { + depth = -firstChild.elem.depth - params.positionData; + } else if (params.positionType === "firstBaseline") { + depth = -firstChild.elem.depth; + } else { + throw new Error("Invalid positionType " + params.positionType + "."); + } + } + + return { + children: params.children, + depth: depth + }; +}; +/** + * Makes a vertical list by stacking elements and kerns on top of each other. + * Allows for many different ways of specifying the positioning method. + * + * See VListParam documentation above. + */ + + +var makeVList = function makeVList(params, options) { + var _getVListChildrenAndD = getVListChildrenAndDepth(params), + children = _getVListChildrenAndD.children, + depth = _getVListChildrenAndD.depth; // Create a strut that is taller than any list item. The strut is added to + // each item, where it will determine the item's baseline. Since it has + // `overflow:hidden`, the strut's top edge will sit on the item's line box's + // top edge and the strut's bottom edge will sit on the item's baseline, + // with no additional line-height spacing. This allows the item baseline to + // be positioned precisely without worrying about font ascent and + // line-height. + + + var pstrutSize = 0; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + if (child.type === "elem") { + var elem = child.elem; + pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height); + } + } + + pstrutSize += 2; + var pstrut = makeSpan(["pstrut"], []); + pstrut.style.height = pstrutSize + "em"; // Create a new list of actual children at the correct offsets + + var realChildren = []; + var minPos = depth; + var maxPos = depth; + var currPos = depth; + + for (var _i2 = 0; _i2 < children.length; _i2++) { + var _child = children[_i2]; + + if (_child.type === "kern") { + currPos += _child.size; + } else { + var _elem = _child.elem; + var classes = _child.wrapperClasses || []; + var style = _child.wrapperStyle || {}; + var childWrap = makeSpan(classes, [pstrut, _elem], undefined, style); + childWrap.style.top = -pstrutSize - currPos - _elem.depth + "em"; + + if (_child.marginLeft) { + childWrap.style.marginLeft = _child.marginLeft; + } + + if (_child.marginRight) { + childWrap.style.marginRight = _child.marginRight; + } + + realChildren.push(childWrap); + currPos += _elem.height + _elem.depth; + } + + minPos = Math.min(minPos, currPos); + maxPos = Math.max(maxPos, currPos); + } // The vlist contents go in a table-cell with `vertical-align:bottom`. + // This cell's bottom edge will determine the containing table's baseline + // without overly expanding the containing line-box. + + + var vlist = makeSpan(["vlist"], realChildren); + vlist.style.height = maxPos + "em"; // A second row is used if necessary to represent the vlist's depth. + + var rows; + + if (minPos < 0) { + // We will define depth in an empty span with display: table-cell. + // It should render with the height that we define. But Chrome, in + // contenteditable mode only, treats that span as if it contains some + // text content. And that min-height over-rides our desired height. + // So we put another empty span inside the depth strut span. + var emptySpan = makeSpan([], []); + var depthStrut = makeSpan(["vlist"], [emptySpan]); + depthStrut.style.height = -minPos + "em"; // Safari wants the first row to have inline content; otherwise it + // puts the bottom of the *second* row on the baseline. + + var topStrut = makeSpan(["vlist-s"], [new SymbolNode("\u200B")]); + rows = [makeSpan(["vlist-r"], [vlist, topStrut]), makeSpan(["vlist-r"], [depthStrut])]; + } else { + rows = [makeSpan(["vlist-r"], [vlist])]; + } + + var vtable = makeSpan(["vlist-t"], rows); + + if (rows.length === 2) { + vtable.classes.push("vlist-t2"); + } + + vtable.height = maxPos; + vtable.depth = -minPos; + return vtable; +}; // Glue is a concept from TeX which is a flexible space between elements in +// either a vertical or horizontal list. In KaTeX, at least for now, it's +// static space between elements in a horizontal layout. + + +var makeGlue = function makeGlue(measurement, options) { + // Make an empty span for the space + var rule = makeSpan(["mspace"], [], options); + var size = calculateSize(measurement, options); + rule.style.marginRight = size + "em"; + return rule; +}; // Takes font options, and returns the appropriate fontLookup name + + +var retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) { + var baseFontName = ""; + + switch (fontFamily) { + case "amsrm": + baseFontName = "AMS"; + break; + + case "textrm": + baseFontName = "Main"; + break; + + case "textsf": + baseFontName = "SansSerif"; + break; + + case "texttt": + baseFontName = "Typewriter"; + break; + + default: + baseFontName = fontFamily; + // use fonts added by a plugin + } + + var fontStylesName; + + if (fontWeight === "textbf" && fontShape === "textit") { + fontStylesName = "BoldItalic"; + } else if (fontWeight === "textbf") { + fontStylesName = "Bold"; + } else if (fontWeight === "textit") { + fontStylesName = "Italic"; + } else { + fontStylesName = "Regular"; + } + + return baseFontName + "-" + fontStylesName; +}; +/** + * Maps TeX font commands to objects containing: + * - variant: string used for "mathvariant" attribute in buildMathML.js + * - fontName: the "style" parameter to fontMetrics.getCharacterMetrics + */ +// A map between tex font commands an MathML mathvariant attribute values + + +var fontMap = { + // styles + "mathbf": { + variant: "bold", + fontName: "Main-Bold" + }, + "mathrm": { + variant: "normal", + fontName: "Main-Regular" + }, + "textit": { + variant: "italic", + fontName: "Main-Italic" + }, + "mathit": { + variant: "italic", + fontName: "Main-Italic" + }, + "mathnormal": { + variant: "italic", + fontName: "Math-Italic" + }, + // "boldsymbol" is missing because they require the use of multiple fonts: + // Math-BoldItalic and Main-Bold. This is handled by a special case in + // makeOrd which ends up calling boldsymbol. + // families + "mathbb": { + variant: "double-struck", + fontName: "AMS-Regular" + }, + "mathcal": { + variant: "script", + fontName: "Caligraphic-Regular" + }, + "mathfrak": { + variant: "fraktur", + fontName: "Fraktur-Regular" + }, + "mathscr": { + variant: "script", + fontName: "Script-Regular" + }, + "mathsf": { + variant: "sans-serif", + fontName: "SansSerif-Regular" + }, + "mathtt": { + variant: "monospace", + fontName: "Typewriter-Regular" + } +}; +var svgData = { + // path, width, height + vec: ["vec", 0.471, 0.714], + // values from the font glyph + oiintSize1: ["oiintSize1", 0.957, 0.499], + // oval to overlay the integrand + oiintSize2: ["oiintSize2", 1.472, 0.659], + oiiintSize1: ["oiiintSize1", 1.304, 0.499], + oiiintSize2: ["oiiintSize2", 1.98, 0.659] +}; + +var staticSvg = function staticSvg(value, options) { + // Create a span with inline SVG for the element. + var _svgData$value = svgData[value], + pathName = _svgData$value[0], + width = _svgData$value[1], + height = _svgData$value[2]; + var path = new PathNode(pathName); + var svgNode = new SvgNode([path], { + "width": width + "em", + "height": height + "em", + // Override CSS rule `.katex svg { width: 100% }` + "style": "width:" + width + "em", + "viewBox": "0 0 " + 1000 * width + " " + 1000 * height, + "preserveAspectRatio": "xMinYMin" + }); + var span = makeSvgSpan(["overlay"], [svgNode], options); + span.height = height; + span.style.height = height + "em"; + span.style.width = width + "em"; + return span; +}; + +/* harmony default export */ var buildCommon = ({ + fontMap: fontMap, + makeSymbol: makeSymbol, + mathsym: mathsym, + makeSpan: makeSpan, + makeSvgSpan: makeSvgSpan, + makeLineSpan: makeLineSpan, + makeAnchor: makeAnchor, + makeFragment: makeFragment, + wrapFragment: wrapFragment, + makeVList: makeVList, + makeOrd: makeOrd, + makeGlue: makeGlue, + staticSvg: staticSvg, + svgData: svgData, + tryCombineChars: tryCombineChars +}); +;// CONCATENATED MODULE: ./src/spacingData.js +/** + * Describes spaces between different classes of atoms. + */ +var thinspace = { + number: 3, + unit: "mu" +}; +var mediumspace = { + number: 4, + unit: "mu" +}; +var thickspace = { + number: 5, + unit: "mu" +}; // Making the type below exact with all optional fields doesn't work due to +// - https://github.com/facebook/flow/issues/4582 +// - https://github.com/facebook/flow/issues/5688 +// However, since *all* fields are optional, $Shape<> works as suggested in 5688 +// above. + +// Spacing relationships for display and text styles +var spacings = { + mord: { + mop: thinspace, + mbin: mediumspace, + mrel: thickspace, + minner: thinspace + }, + mop: { + mord: thinspace, + mop: thinspace, + mrel: thickspace, + minner: thinspace + }, + mbin: { + mord: mediumspace, + mop: mediumspace, + mopen: mediumspace, + minner: mediumspace + }, + mrel: { + mord: thickspace, + mop: thickspace, + mopen: thickspace, + minner: thickspace + }, + mopen: {}, + mclose: { + mop: thinspace, + mbin: mediumspace, + mrel: thickspace, + minner: thinspace + }, + mpunct: { + mord: thinspace, + mop: thinspace, + mrel: thickspace, + mopen: thinspace, + mclose: thinspace, + mpunct: thinspace, + minner: thinspace + }, + minner: { + mord: thinspace, + mop: thinspace, + mbin: mediumspace, + mrel: thickspace, + mopen: thinspace, + mpunct: thinspace, + minner: thinspace + } +}; // Spacing relationships for script and scriptscript styles + +var tightSpacings = { + mord: { + mop: thinspace + }, + mop: { + mord: thinspace, + mop: thinspace + }, + mbin: {}, + mrel: {}, + mopen: {}, + mclose: { + mop: thinspace + }, + mpunct: {}, + minner: { + mop: thinspace + } +}; +;// CONCATENATED MODULE: ./src/defineFunction.js +/** Context provided to function handlers for error messages. */ +// Note: reverse the order of the return type union will cause a flow error. +// See https://github.com/facebook/flow/issues/3663. +// More general version of `HtmlBuilder` for nodes (e.g. \sum, accent types) +// whose presence impacts super/subscripting. In this case, ParseNode<"supsub"> +// delegates its HTML building to the HtmlBuilder corresponding to these nodes. + +/** + * Final function spec for use at parse time. + * This is almost identical to `FunctionPropSpec`, except it + * 1. includes the function handler, and + * 2. requires all arguments except argTypes. + * It is generated by `defineFunction()` below. + */ + +/** + * All registered functions. + * `functions.js` just exports this same dictionary again and makes it public. + * `Parser.js` requires this dictionary. + */ +var _functions = {}; +/** + * All HTML builders. Should be only used in the `define*` and the `build*ML` + * functions. + */ + +var _htmlGroupBuilders = {}; +/** + * All MathML builders. Should be only used in the `define*` and the `build*ML` + * functions. + */ + +var _mathmlGroupBuilders = {}; +function defineFunction(_ref) { + var type = _ref.type, + names = _ref.names, + props = _ref.props, + handler = _ref.handler, + htmlBuilder = _ref.htmlBuilder, + mathmlBuilder = _ref.mathmlBuilder; + // Set default values of functions + var data = { + type: type, + numArgs: props.numArgs, + argTypes: props.argTypes, + allowedInArgument: !!props.allowedInArgument, + allowedInText: !!props.allowedInText, + allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, + numOptionalArgs: props.numOptionalArgs || 0, + infix: !!props.infix, + primitive: !!props.primitive, + handler: handler + }; + + for (var i = 0; i < names.length; ++i) { + _functions[names[i]] = data; + } + + if (type) { + if (htmlBuilder) { + _htmlGroupBuilders[type] = htmlBuilder; + } + + if (mathmlBuilder) { + _mathmlGroupBuilders[type] = mathmlBuilder; + } + } +} +/** + * Use this to register only the HTML and MathML builders for a function (e.g. + * if the function's ParseNode is generated in Parser.js rather than via a + * stand-alone handler provided to `defineFunction`). + */ + +function defineFunctionBuilders(_ref2) { + var type = _ref2.type, + htmlBuilder = _ref2.htmlBuilder, + mathmlBuilder = _ref2.mathmlBuilder; + defineFunction({ + type: type, + names: [], + props: { + numArgs: 0 + }, + handler: function handler() { + throw new Error('Should never be called.'); + }, + htmlBuilder: htmlBuilder, + mathmlBuilder: mathmlBuilder + }); +} +var normalizeArgument = function normalizeArgument(arg) { + return arg.type === "ordgroup" && arg.body.length === 1 ? arg.body[0] : arg; +}; // Since the corresponding buildHTML/buildMathML function expects a +// list of elements, we normalize for different kinds of arguments + +var ordargument = function ordargument(arg) { + return arg.type === "ordgroup" ? arg.body : [arg]; +}; +;// CONCATENATED MODULE: ./src/buildHTML.js +/** + * This file does the main work of building a domTree structure from a parse + * tree. The entry point is the `buildHTML` function, which takes a parse tree. + * Then, the buildExpression, buildGroup, and various groupBuilders functions + * are called, to produce a final HTML tree. + */ + + + + + + + + +var buildHTML_makeSpan = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`) +// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6, +// and the text before Rule 19. + +var binLeftCanceller = ["leftmost", "mbin", "mopen", "mrel", "mop", "mpunct"]; +var binRightCanceller = ["rightmost", "mrel", "mclose", "mpunct"]; +var styleMap = { + "display": src_Style.DISPLAY, + "text": src_Style.TEXT, + "script": src_Style.SCRIPT, + "scriptscript": src_Style.SCRIPTSCRIPT +}; +var DomEnum = { + mord: "mord", + mop: "mop", + mbin: "mbin", + mrel: "mrel", + mopen: "mopen", + mclose: "mclose", + mpunct: "mpunct", + minner: "minner" +}; + +/** + * Take a list of nodes, build them in order, and return a list of the built + * nodes. documentFragments are flattened into their contents, so the + * returned list contains no fragments. `isRealGroup` is true if `expression` + * is a real group (no atoms will be added on either side), as opposed to + * a partial group (e.g. one created by \color). `surrounding` is an array + * consisting type of nodes that will be added to the left and right. + */ +var buildExpression = function buildExpression(expression, options, isRealGroup, surrounding) { + if (surrounding === void 0) { + surrounding = [null, null]; + } + + // Parse expressions into `groups`. + var groups = []; + + for (var i = 0; i < expression.length; i++) { + var output = buildGroup(expression[i], options); + + if (output instanceof DocumentFragment) { + var children = output.children; + groups.push.apply(groups, children); + } else { + groups.push(output); + } + } // Combine consecutive domTree.symbolNodes into a single symbolNode. + + + buildCommon.tryCombineChars(groups); // If `expression` is a partial group, let the parent handle spacings + // to avoid processing groups multiple times. + + if (!isRealGroup) { + return groups; + } + + var glueOptions = options; + + if (expression.length === 1) { + var node = expression[0]; + + if (node.type === "sizing") { + glueOptions = options.havingSize(node.size); + } else if (node.type === "styling") { + glueOptions = options.havingStyle(styleMap[node.style]); + } + } // Dummy spans for determining spacings between surrounding atoms. + // If `expression` has no atoms on the left or right, class "leftmost" + // or "rightmost", respectively, is used to indicate it. + + + var dummyPrev = buildHTML_makeSpan([surrounding[0] || "leftmost"], [], options); + var dummyNext = buildHTML_makeSpan([surrounding[1] || "rightmost"], [], options); // TODO: These code assumes that a node's math class is the first element + // of its `classes` array. A later cleanup should ensure this, for + // instance by changing the signature of `makeSpan`. + // Before determining what spaces to insert, perform bin cancellation. + // Binary operators change to ordinary symbols in some contexts. + + var isRoot = isRealGroup === "root"; + traverseNonSpaceNodes(groups, function (node, prev) { + var prevType = prev.classes[0]; + var type = node.classes[0]; + + if (prevType === "mbin" && utils.contains(binRightCanceller, type)) { + prev.classes[0] = "mord"; + } else if (type === "mbin" && utils.contains(binLeftCanceller, prevType)) { + node.classes[0] = "mord"; + } + }, { + node: dummyPrev + }, dummyNext, isRoot); + traverseNonSpaceNodes(groups, function (node, prev) { + var prevType = getTypeOfDomTree(prev); + var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style. + + var space = prevType && type ? node.hasClass("mtight") ? tightSpacings[prevType][type] : spacings[prevType][type] : null; + + if (space) { + // Insert glue (spacing) after the `prev`. + return buildCommon.makeGlue(space, glueOptions); + } + }, { + node: dummyPrev + }, dummyNext, isRoot); + return groups; +}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and +// previous node as arguments, optionally returning a node to insert after the +// previous node. `prev` is an object with the previous node and `insertAfter` +// function to insert after it. `next` is a node that will be added to the right. +// Used for bin cancellation and inserting spacings. + +var traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) { + if (next) { + // temporarily append the right node, if exists + nodes.push(next); + } + + var i = 0; + + for (; i < nodes.length; i++) { + var node = nodes[i]; + var partialGroup = checkPartialGroup(node); + + if (partialGroup) { + // Recursive DFS + // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array + traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot); + continue; + } // Ignore explicit spaces (e.g., \;, \,) when determining what implicit + // spacing should go between atoms of different classes + + + var nonspace = !node.hasClass("mspace"); + + if (nonspace) { + var result = callback(node, prev.node); + + if (result) { + if (prev.insertAfter) { + prev.insertAfter(result); + } else { + // insert at front + nodes.unshift(result); + i++; + } + } + } + + if (nonspace) { + prev.node = node; + } else if (isRoot && node.hasClass("newline")) { + prev.node = buildHTML_makeSpan(["leftmost"]); // treat like beginning of line + } + + prev.insertAfter = function (index) { + return function (n) { + nodes.splice(index + 1, 0, n); + i++; + }; + }(i); + } + + if (next) { + nodes.pop(); + } +}; // Check if given node is a partial group, i.e., does not affect spacing around. + + +var checkPartialGroup = function checkPartialGroup(node) { + if (node instanceof DocumentFragment || node instanceof Anchor || node instanceof Span && node.hasClass("enclosing")) { + return node; + } + + return null; +}; // Return the outermost node of a domTree. + + +var getOutermostNode = function getOutermostNode(node, side) { + var partialGroup = checkPartialGroup(node); + + if (partialGroup) { + var children = partialGroup.children; + + if (children.length) { + if (side === "right") { + return getOutermostNode(children[children.length - 1], "right"); + } else if (side === "left") { + return getOutermostNode(children[0], "left"); + } + } + } + + return node; +}; // Return math atom class (mclass) of a domTree. +// If `side` is given, it will get the type of the outermost node at given side. + + +var getTypeOfDomTree = function getTypeOfDomTree(node, side) { + if (!node) { + return null; + } + + if (side) { + node = getOutermostNode(node, side); + } // This makes a lot of assumptions as to where the type of atom + // appears. We should do a better job of enforcing this. + + + return DomEnum[node.classes[0]] || null; +}; +var makeNullDelimiter = function makeNullDelimiter(options, classes) { + var moreClasses = ["nulldelimiter"].concat(options.baseSizingClasses()); + return buildHTML_makeSpan(classes.concat(moreClasses)); +}; +/** + * buildGroup is the function that takes a group and calls the correct groupType + * function for it. It also handles the interaction of size and style changes + * between parents and children. + */ + +var buildGroup = function buildGroup(group, options, baseOptions) { + if (!group) { + return buildHTML_makeSpan(); + } + + if (_htmlGroupBuilders[group.type]) { + // Call the groupBuilders function + // $FlowFixMe + var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account + // for that size difference. + + if (baseOptions && options.size !== baseOptions.size) { + groupNode = buildHTML_makeSpan(options.sizingClasses(baseOptions), [groupNode], options); + var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; + groupNode.height *= multiplier; + groupNode.depth *= multiplier; + } + + return groupNode; + } else { + throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); + } +}; +/** + * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`) + * into an unbreakable HTML node of class .base, with proper struts to + * guarantee correct vertical extent. `buildHTML` calls this repeatedly to + * make up the entire expression as a sequence of unbreakable units. + */ + +function buildHTMLUnbreakable(children, options) { + // Compute height and depth of this chunk. + var body = buildHTML_makeSpan(["base"], children, options); // Add strut, which ensures that the top of the HTML element falls at + // the height of the expression, and the bottom of the HTML element + // falls at the depth of the expression. + + var strut = buildHTML_makeSpan(["strut"]); + strut.style.height = body.height + body.depth + "em"; + strut.style.verticalAlign = -body.depth + "em"; + body.children.unshift(strut); + return body; +} +/** + * Take an entire parse tree, and build it into an appropriate set of HTML + * nodes. + */ + + +function buildHTML(tree, options) { + // Strip off outer tag wrapper for processing below. + var tag = null; + + if (tree.length === 1 && tree[0].type === "tag") { + tag = tree[0].tag; + tree = tree[0].body; + } // Build the expression contained in the tree + + + var expression = buildExpression(tree, options, "root"); + var eqnNum; + + if (expression.length === 2 && expression[1].hasClass("tag")) { + // An environment with automatic equation numbers, e.g. {gather}. + eqnNum = expression.pop(); + } + + var children = []; // Create one base node for each chunk between potential line breaks. + // The TeXBook [p.173] says "A formula will be broken only after a + // relation symbol like $=$ or $<$ or $\rightarrow$, or after a binary + // operation symbol like $+$ or $-$ or $\times$, where the relation or + // binary operation is on the ``outer level'' of the formula (i.e., not + // enclosed in {...} and not part of an \over construction)." + + var parts = []; + + for (var i = 0; i < expression.length; i++) { + parts.push(expression[i]); + + if (expression[i].hasClass("mbin") || expression[i].hasClass("mrel") || expression[i].hasClass("allowbreak")) { + // Put any post-operator glue on same line as operator. + // Watch for \nobreak along the way, and stop at \newline. + var nobreak = false; + + while (i < expression.length - 1 && expression[i + 1].hasClass("mspace") && !expression[i + 1].hasClass("newline")) { + i++; + parts.push(expression[i]); + + if (expression[i].hasClass("nobreak")) { + nobreak = true; + } + } // Don't allow break if \nobreak among the post-operator glue. + + + if (!nobreak) { + children.push(buildHTMLUnbreakable(parts, options)); + parts = []; + } + } else if (expression[i].hasClass("newline")) { + // Write the line except the newline + parts.pop(); + + if (parts.length > 0) { + children.push(buildHTMLUnbreakable(parts, options)); + parts = []; + } // Put the newline at the top level + + + children.push(expression[i]); + } + } + + if (parts.length > 0) { + children.push(buildHTMLUnbreakable(parts, options)); + } // Now, if there was a tag, build it too and append it as a final child. + + + var tagChild; + + if (tag) { + tagChild = buildHTMLUnbreakable(buildExpression(tag, options, true)); + tagChild.classes = ["tag"]; + children.push(tagChild); + } else if (eqnNum) { + children.push(eqnNum); + } + + var htmlNode = buildHTML_makeSpan(["katex-html"], children); + htmlNode.setAttribute("aria-hidden", "true"); // Adjust the strut of the tag to be the maximum height of all children + // (the height of the enclosing htmlNode) for proper vertical alignment. + + if (tagChild) { + var strut = tagChild.children[0]; + strut.style.height = htmlNode.height + htmlNode.depth + "em"; + strut.style.verticalAlign = -htmlNode.depth + "em"; + } + + return htmlNode; +} +;// CONCATENATED MODULE: ./src/mathMLTree.js +/** + * These objects store data about MathML nodes. This is the MathML equivalent + * of the types in domTree.js. Since MathML handles its own rendering, and + * since we're mainly using MathML to improve accessibility, we don't manage + * any of the styling state that the plain DOM nodes do. + * + * The `toNode` and `toMarkup` functions work simlarly to how they do in + * domTree.js, creating namespaced DOM nodes and HTML text markup respectively. + */ + + + +function newDocumentFragment(children) { + return new DocumentFragment(children); +} +/** + * This node represents a general purpose MathML node of any type. The + * constructor requires the type of node to create (for example, `"mo"` or + * `"mspace"`, corresponding to `` and `` tags). + */ + +var MathNode = /*#__PURE__*/function () { + function MathNode(type, children, classes) { + this.type = void 0; + this.attributes = void 0; + this.children = void 0; + this.classes = void 0; + this.type = type; + this.attributes = {}; + this.children = children || []; + this.classes = classes || []; + } + /** + * Sets an attribute on a MathML node. MathML depends on attributes to convey a + * semantic content, so this is used heavily. + */ + + + var _proto = MathNode.prototype; + + _proto.setAttribute = function setAttribute(name, value) { + this.attributes[name] = value; + } + /** + * Gets an attribute on a MathML node. + */ + ; + + _proto.getAttribute = function getAttribute(name) { + return this.attributes[name]; + } + /** + * Converts the math node into a MathML-namespaced DOM element. + */ + ; + + _proto.toNode = function toNode() { + var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + node.setAttribute(attr, this.attributes[attr]); + } + } + + if (this.classes.length > 0) { + node.className = createClass(this.classes); + } + + for (var i = 0; i < this.children.length; i++) { + node.appendChild(this.children[i].toNode()); + } + + return node; + } + /** + * Converts the math node into an HTML markup string. + */ + ; + + _proto.toMarkup = function toMarkup() { + var markup = "<" + this.type; // Add the attributes + + for (var attr in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { + markup += " " + attr + "=\""; + markup += utils.escape(this.attributes[attr]); + markup += "\""; + } + } + + if (this.classes.length > 0) { + markup += " class =\"" + utils.escape(createClass(this.classes)) + "\""; + } + + markup += ">"; + + for (var i = 0; i < this.children.length; i++) { + markup += this.children[i].toMarkup(); + } + + markup += ""; + return markup; + } + /** + * Converts the math node into a string, similar to innerText, but escaped. + */ + ; + + _proto.toText = function toText() { + return this.children.map(function (child) { + return child.toText(); + }).join(""); + }; + + return MathNode; +}(); +/** + * This node represents a piece of text. + */ + +var TextNode = /*#__PURE__*/function () { + function TextNode(text) { + this.text = void 0; + this.text = text; + } + /** + * Converts the text node into a DOM text node. + */ + + + var _proto2 = TextNode.prototype; + + _proto2.toNode = function toNode() { + return document.createTextNode(this.text); + } + /** + * Converts the text node into escaped HTML markup + * (representing the text itself). + */ + ; + + _proto2.toMarkup = function toMarkup() { + return utils.escape(this.toText()); + } + /** + * Converts the text node into a string + * (representing the text iteself). + */ + ; + + _proto2.toText = function toText() { + return this.text; + }; + + return TextNode; +}(); +/** + * This node represents a space, but may render as or as text, + * depending on the width. + */ + +var SpaceNode = /*#__PURE__*/function () { + /** + * Create a Space node with width given in CSS ems. + */ + function SpaceNode(width) { + this.width = void 0; + this.character = void 0; + this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html + // for a table of space-like characters. We use Unicode + // representations instead of &LongNames; as it's not clear how to + // make the latter via document.createTextNode. + + if (width >= 0.05555 && width <= 0.05556) { + this.character = "\u200A"; //   + } else if (width >= 0.1666 && width <= 0.1667) { + this.character = "\u2009"; //   + } else if (width >= 0.2222 && width <= 0.2223) { + this.character = "\u2005"; //   + } else if (width >= 0.2777 && width <= 0.2778) { + this.character = "\u2005\u200A"; //    + } else if (width >= -0.05556 && width <= -0.05555) { + this.character = "\u200A\u2063"; // ​ + } else if (width >= -0.1667 && width <= -0.1666) { + this.character = "\u2009\u2063"; // ​ + } else if (width >= -0.2223 && width <= -0.2222) { + this.character = "\u205F\u2063"; // ​ + } else if (width >= -0.2778 && width <= -0.2777) { + this.character = "\u2005\u2063"; // ​ + } else { + this.character = null; + } + } + /** + * Converts the math node into a MathML-namespaced DOM element. + */ + + + var _proto3 = SpaceNode.prototype; + + _proto3.toNode = function toNode() { + if (this.character) { + return document.createTextNode(this.character); + } else { + var node = document.createElementNS("http://www.w3.org/1998/Math/MathML", "mspace"); + node.setAttribute("width", this.width + "em"); + return node; + } + } + /** + * Converts the math node into an HTML markup string. + */ + ; + + _proto3.toMarkup = function toMarkup() { + if (this.character) { + return "" + this.character + ""; + } else { + return ""; + } + } + /** + * Converts the math node into a string, similar to innerText. + */ + ; + + _proto3.toText = function toText() { + if (this.character) { + return this.character; + } else { + return " "; + } + }; + + return SpaceNode; +}(); + +/* harmony default export */ var mathMLTree = ({ + MathNode: MathNode, + TextNode: TextNode, + SpaceNode: SpaceNode, + newDocumentFragment: newDocumentFragment +}); +;// CONCATENATED MODULE: ./src/buildMathML.js +/** + * This file converts a parse tree into a cooresponding MathML tree. The main + * entry point is the `buildMathML` function, which takes a parse tree from the + * parser. + */ + + + + + + + + + +/** + * Takes a symbol and converts it into a MathML text node after performing + * optional replacement from symbols.js. + */ +var makeText = function makeText(text, mode, options) { + if (src_symbols[mode][text] && src_symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.substr(4, 2) === "tt" || options.font && options.font.substr(4, 2) === "tt"))) { + text = src_symbols[mode][text].replace; + } + + return new mathMLTree.TextNode(text); +}; +/** + * Wrap the given array of nodes in an node if needed, i.e., + * unless the array has length 1. Always returns a single node. + */ + +var makeRow = function makeRow(body) { + if (body.length === 1) { + return body[0]; + } else { + return new mathMLTree.MathNode("mrow", body); + } +}; +/** + * Returns the math variant as a string or null if none is required. + */ + +var getVariant = function getVariant(group, options) { + // Handle \text... font specifiers as best we can. + // MathML has a limited list of allowable mathvariant specifiers; see + // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt + if (options.fontFamily === "texttt") { + return "monospace"; + } else if (options.fontFamily === "textsf") { + if (options.fontShape === "textit" && options.fontWeight === "textbf") { + return "sans-serif-bold-italic"; + } else if (options.fontShape === "textit") { + return "sans-serif-italic"; + } else if (options.fontWeight === "textbf") { + return "bold-sans-serif"; + } else { + return "sans-serif"; + } + } else if (options.fontShape === "textit" && options.fontWeight === "textbf") { + return "bold-italic"; + } else if (options.fontShape === "textit") { + return "italic"; + } else if (options.fontWeight === "textbf") { + return "bold"; + } + + var font = options.font; + + if (!font || font === "mathnormal") { + return null; + } + + var mode = group.mode; + + if (font === "mathit") { + return "italic"; + } else if (font === "boldsymbol") { + return group.type === "textord" ? "bold" : "bold-italic"; + } else if (font === "mathbf") { + return "bold"; + } else if (font === "mathbb") { + return "double-struck"; + } else if (font === "mathfrak") { + return "fraktur"; + } else if (font === "mathscr" || font === "mathcal") { + // MathML makes no distinction between script and caligrahpic + return "script"; + } else if (font === "mathsf") { + return "sans-serif"; + } else if (font === "mathtt") { + return "monospace"; + } + + var text = group.text; + + if (utils.contains(["\\imath", "\\jmath"], text)) { + return null; + } + + if (src_symbols[mode][text] && src_symbols[mode][text].replace) { + text = src_symbols[mode][text].replace; + } + + var fontName = buildCommon.fontMap[font].fontName; + + if (getCharacterMetrics(text, fontName, mode)) { + return buildCommon.fontMap[font].variant; + } + + return null; +}; +/** + * Takes a list of nodes, builds them, and returns a list of the generated + * MathML nodes. Also combine consecutive outputs into a single + * tag. + */ + +var buildMathML_buildExpression = function buildExpression(expression, options, isOrdgroup) { + if (expression.length === 1) { + var group = buildMathML_buildGroup(expression[0], options); + + if (isOrdgroup && group instanceof MathNode && group.type === "mo") { + // When TeX writers want to suppress spacing on an operator, + // they often put the operator by itself inside braces. + group.setAttribute("lspace", "0em"); + group.setAttribute("rspace", "0em"); + } + + return [group]; + } + + var groups = []; + var lastGroup; + + for (var i = 0; i < expression.length; i++) { + var _group = buildMathML_buildGroup(expression[i], options); + + if (_group instanceof MathNode && lastGroup instanceof MathNode) { + // Concatenate adjacent s + if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) { + var _lastGroup$children; + + (_lastGroup$children = lastGroup.children).push.apply(_lastGroup$children, _group.children); + + continue; // Concatenate adjacent s + } else if (_group.type === 'mn' && lastGroup.type === 'mn') { + var _lastGroup$children2; + + (_lastGroup$children2 = lastGroup.children).push.apply(_lastGroup$children2, _group.children); + + continue; // Concatenate ... followed by . + } else if (_group.type === 'mi' && _group.children.length === 1 && lastGroup.type === 'mn') { + var child = _group.children[0]; + + if (child instanceof TextNode && child.text === '.') { + var _lastGroup$children3; + + (_lastGroup$children3 = lastGroup.children).push.apply(_lastGroup$children3, _group.children); + + continue; + } + } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) { + var lastChild = lastGroup.children[0]; + + if (lastChild instanceof TextNode && lastChild.text === "\u0338" && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) { + var _child = _group.children[0]; + + if (_child instanceof TextNode && _child.text.length > 0) { + // Overlay with combining character long solidus + _child.text = _child.text.slice(0, 1) + "\u0338" + _child.text.slice(1); + groups.pop(); + } + } + } + } + + groups.push(_group); + lastGroup = _group; + } + + return groups; +}; +/** + * Equivalent to buildExpression, but wraps the elements in an + * if there's more than one. Returns a single node instead of an array. + */ + +var buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) { + return makeRow(buildMathML_buildExpression(expression, options, isOrdgroup)); +}; +/** + * Takes a group from the parser and calls the appropriate groupBuilders function + * on it to produce a MathML node. + */ + +var buildMathML_buildGroup = function buildGroup(group, options) { + if (!group) { + return new mathMLTree.MathNode("mrow"); + } + + if (_mathmlGroupBuilders[group.type]) { + // Call the groupBuilders function + // $FlowFixMe + var result = _mathmlGroupBuilders[group.type](group, options); // $FlowFixMe + + return result; + } else { + throw new src_ParseError("Got group of unknown type: '" + group.type + "'"); + } +}; +/** + * Takes a full parse tree and settings and builds a MathML representation of + * it. In particular, we put the elements from building the parse tree into a + * tag so we can also include that TeX source as an annotation. + * + * Note that we actually return a domTree element with a `` inside it so + * we can do appropriate styling. + */ + +function buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) { + var expression = buildMathML_buildExpression(tree, options); // TODO: Make a pass thru the MathML similar to buildHTML.traverseNonSpaceNodes + // and add spacing nodes. This is necessary only adjacent to math operators + // like \sin or \lim or to subsup elements that contain math operators. + // MathML takes care of the other spacing issues. + // Wrap up the expression in an mrow so it is presented in the semantics + // tag correctly, unless it's a single or . + + var wrapper; + + if (expression.length === 1 && expression[0] instanceof MathNode && utils.contains(["mrow", "mtable"], expression[0].type)) { + wrapper = expression[0]; + } else { + wrapper = new mathMLTree.MathNode("mrow", expression); + } // Build a TeX annotation of the source + + + var annotation = new mathMLTree.MathNode("annotation", [new mathMLTree.TextNode(texExpression)]); + annotation.setAttribute("encoding", "application/x-tex"); + var semantics = new mathMLTree.MathNode("semantics", [wrapper, annotation]); + var math = new mathMLTree.MathNode("math", [semantics]); + math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); + + if (isDisplayMode) { + math.setAttribute("display", "block"); + } // You can't style nodes, so we wrap the node in a span. + // NOTE: The span class is not typed to have nodes as children, and + // we don't want to make the children type more generic since the children + // of span are expected to have more fields in `buildHtml` contexts. + + + var wrapperClass = forMathmlOnly ? "katex" : "katex-mathml"; // $FlowFixMe + + return buildCommon.makeSpan([wrapperClass], [math]); +} +;// CONCATENATED MODULE: ./src/buildTree.js + + + + + + + +var optionsFromSettings = function optionsFromSettings(settings) { + return new src_Options({ + style: settings.displayMode ? src_Style.DISPLAY : src_Style.TEXT, + maxSize: settings.maxSize, + minRuleThickness: settings.minRuleThickness + }); +}; + +var displayWrap = function displayWrap(node, settings) { + if (settings.displayMode) { + var classes = ["katex-display"]; + + if (settings.leqno) { + classes.push("leqno"); + } + + if (settings.fleqn) { + classes.push("fleqn"); + } + + node = buildCommon.makeSpan(classes, [node]); + } + + return node; +}; + +var buildTree = function buildTree(tree, expression, settings) { + var options = optionsFromSettings(settings); + var katexNode; + + if (settings.output === "mathml") { + return buildMathML(tree, expression, options, settings.displayMode, true); + } else if (settings.output === "html") { + var htmlNode = buildHTML(tree, options); + katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); + } else { + var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false); + + var _htmlNode = buildHTML(tree, options); + + katexNode = buildCommon.makeSpan(["katex"], [mathMLNode, _htmlNode]); + } + + return displayWrap(katexNode, settings); +}; +var buildHTMLTree = function buildHTMLTree(tree, expression, settings) { + var options = optionsFromSettings(settings); + var htmlNode = buildHTML(tree, options); + var katexNode = buildCommon.makeSpan(["katex"], [htmlNode]); + return displayWrap(katexNode, settings); +}; +/* harmony default export */ var src_buildTree = ((/* unused pure expression or super */ null && (buildTree))); +;// CONCATENATED MODULE: ./src/stretchy.js +/** + * This file provides support to buildMathML.js and buildHTML.js + * for stretchy wide elements rendered from SVG files + * and other CSS trickery. + */ + + + + +var stretchyCodePoint = { + widehat: "^", + widecheck: "ˇ", + widetilde: "~", + utilde: "~", + overleftarrow: "\u2190", + underleftarrow: "\u2190", + xleftarrow: "\u2190", + overrightarrow: "\u2192", + underrightarrow: "\u2192", + xrightarrow: "\u2192", + underbrace: "\u23DF", + overbrace: "\u23DE", + overgroup: "\u23E0", + undergroup: "\u23E1", + overleftrightarrow: "\u2194", + underleftrightarrow: "\u2194", + xleftrightarrow: "\u2194", + Overrightarrow: "\u21D2", + xRightarrow: "\u21D2", + overleftharpoon: "\u21BC", + xleftharpoonup: "\u21BC", + overrightharpoon: "\u21C0", + xrightharpoonup: "\u21C0", + xLeftarrow: "\u21D0", + xLeftrightarrow: "\u21D4", + xhookleftarrow: "\u21A9", + xhookrightarrow: "\u21AA", + xmapsto: "\u21A6", + xrightharpoondown: "\u21C1", + xleftharpoondown: "\u21BD", + xrightleftharpoons: "\u21CC", + xleftrightharpoons: "\u21CB", + xtwoheadleftarrow: "\u219E", + xtwoheadrightarrow: "\u21A0", + xlongequal: "=", + xtofrom: "\u21C4", + xrightleftarrows: "\u21C4", + xrightequilibrium: "\u21CC", + // Not a perfect match. + xleftequilibrium: "\u21CB", + // None better available. + "\\\\cdrightarrow": "\u2192", + "\\\\cdleftarrow": "\u2190", + "\\\\cdlongequal": "=" +}; + +var mathMLnode = function mathMLnode(label) { + var node = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(stretchyCodePoint[label])]); + node.setAttribute("stretchy", "true"); + return node; +}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts. +// Copyright (c) 2009-2010, Design Science, Inc. () +// Copyright (c) 2014-2017 Khan Academy () +// Licensed under the SIL Open Font License, Version 1.1. +// See \nhttp://scripts.sil.org/OFL +// Very Long SVGs +// Many of the KaTeX stretchy wide elements use a long SVG image and an +// overflow: hidden tactic to achieve a stretchy image while avoiding +// distortion of arrowheads or brace corners. +// The SVG typically contains a very long (400 em) arrow. +// The SVG is in a container span that has overflow: hidden, so the span +// acts like a window that exposes only part of the SVG. +// The SVG always has a longer, thinner aspect ratio than the container span. +// After the SVG fills 100% of the height of the container span, +// there is a long arrow shaft left over. That left-over shaft is not shown. +// Instead, it is sliced off because the span's CSS has overflow: hidden. +// Thus, the reader sees an arrow that matches the subject matter width +// without distortion. +// Some functions, such as \cancel, need to vary their aspect ratio. These +// functions do not get the overflow SVG treatment. +// Second Brush Stroke +// Low resolution monitors struggle to display images in fine detail. +// So browsers apply anti-aliasing. A long straight arrow shaft therefore +// will sometimes appear as if it has a blurred edge. +// To mitigate this, these SVG files contain a second "brush-stroke" on the +// arrow shafts. That is, a second long thin rectangular SVG path has been +// written directly on top of each arrow shaft. This reinforcement causes +// some of the screen pixels to display as black instead of the anti-aliased +// gray pixel that a single path would generate. So we get arrow shafts +// whose edges appear to be sharper. +// In the katexImagesData object just below, the dimensions all +// correspond to path geometry inside the relevant SVG. +// For example, \overrightarrow uses the same arrowhead as glyph U+2192 +// from the KaTeX Main font. The scaling factor is 1000. +// That is, inside the font, that arrowhead is 522 units tall, which +// corresponds to 0.522 em inside the document. + + +var katexImagesData = { + // path(s), minWidth, height, align + overrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], + overleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], + underrightarrow: [["rightarrow"], 0.888, 522, "xMaxYMin"], + underleftarrow: [["leftarrow"], 0.888, 522, "xMinYMin"], + xrightarrow: [["rightarrow"], 1.469, 522, "xMaxYMin"], + "\\cdrightarrow": [["rightarrow"], 3.0, 522, "xMaxYMin"], + // CD minwwidth2.5pc + xleftarrow: [["leftarrow"], 1.469, 522, "xMinYMin"], + "\\cdleftarrow": [["leftarrow"], 3.0, 522, "xMinYMin"], + Overrightarrow: [["doublerightarrow"], 0.888, 560, "xMaxYMin"], + xRightarrow: [["doublerightarrow"], 1.526, 560, "xMaxYMin"], + xLeftarrow: [["doubleleftarrow"], 1.526, 560, "xMinYMin"], + overleftharpoon: [["leftharpoon"], 0.888, 522, "xMinYMin"], + xleftharpoonup: [["leftharpoon"], 0.888, 522, "xMinYMin"], + xleftharpoondown: [["leftharpoondown"], 0.888, 522, "xMinYMin"], + overrightharpoon: [["rightharpoon"], 0.888, 522, "xMaxYMin"], + xrightharpoonup: [["rightharpoon"], 0.888, 522, "xMaxYMin"], + xrightharpoondown: [["rightharpoondown"], 0.888, 522, "xMaxYMin"], + xlongequal: [["longequal"], 0.888, 334, "xMinYMin"], + "\\cdlongequal": [["longequal"], 3.0, 334, "xMinYMin"], + xtwoheadleftarrow: [["twoheadleftarrow"], 0.888, 334, "xMinYMin"], + xtwoheadrightarrow: [["twoheadrightarrow"], 0.888, 334, "xMaxYMin"], + overleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], + overbrace: [["leftbrace", "midbrace", "rightbrace"], 1.6, 548], + underbrace: [["leftbraceunder", "midbraceunder", "rightbraceunder"], 1.6, 548], + underleftrightarrow: [["leftarrow", "rightarrow"], 0.888, 522], + xleftrightarrow: [["leftarrow", "rightarrow"], 1.75, 522], + xLeftrightarrow: [["doubleleftarrow", "doublerightarrow"], 1.75, 560], + xrightleftharpoons: [["leftharpoondownplus", "rightharpoonplus"], 1.75, 716], + xleftrightharpoons: [["leftharpoonplus", "rightharpoondownplus"], 1.75, 716], + xhookleftarrow: [["leftarrow", "righthook"], 1.08, 522], + xhookrightarrow: [["lefthook", "rightarrow"], 1.08, 522], + overlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], + underlinesegment: [["leftlinesegment", "rightlinesegment"], 0.888, 522], + overgroup: [["leftgroup", "rightgroup"], 0.888, 342], + undergroup: [["leftgroupunder", "rightgroupunder"], 0.888, 342], + xmapsto: [["leftmapsto", "rightarrow"], 1.5, 522], + xtofrom: [["leftToFrom", "rightToFrom"], 1.75, 528], + // The next three arrows are from the mhchem package. + // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the + // document as \xrightarrow or \xrightleftharpoons. Those have + // min-length = 1.75em, so we set min-length on these next three to match. + xrightleftarrows: [["baraboveleftarrow", "rightarrowabovebar"], 1.75, 901], + xrightequilibrium: [["baraboveshortleftharpoon", "rightharpoonaboveshortbar"], 1.75, 716], + xleftequilibrium: [["shortbaraboveleftharpoon", "shortrightharpoonabovebar"], 1.75, 716] +}; + +var groupLength = function groupLength(arg) { + if (arg.type === "ordgroup") { + return arg.body.length; + } else { + return 1; + } +}; + +var svgSpan = function svgSpan(group, options) { + // Create a span with inline SVG for the element. + function buildSvgSpan_() { + var viewBoxWidth = 400000; // default + + var label = group.label.substr(1); + + if (utils.contains(["widehat", "widecheck", "widetilde", "utilde"], label)) { + // Each type in the `if` statement corresponds to one of the ParseNode + // types below. This narrowing is required to access `grp.base`. + // $FlowFixMe + var grp = group; // There are four SVG images available for each function. + // Choose a taller image when there are more characters. + + var numChars = groupLength(grp.base); + var viewBoxHeight; + var pathName; + + var _height; + + if (numChars > 5) { + if (label === "widehat" || label === "widecheck") { + viewBoxHeight = 420; + viewBoxWidth = 2364; + _height = 0.42; + pathName = label + "4"; + } else { + viewBoxHeight = 312; + viewBoxWidth = 2340; + _height = 0.34; + pathName = "tilde4"; + } + } else { + var imgIndex = [1, 1, 2, 2, 3, 3][numChars]; + + if (label === "widehat" || label === "widecheck") { + viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex]; + viewBoxHeight = [0, 239, 300, 360, 420][imgIndex]; + _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex]; + pathName = label + imgIndex; + } else { + viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex]; + viewBoxHeight = [0, 260, 286, 306, 312][imgIndex]; + _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex]; + pathName = "tilde" + imgIndex; + } + } + + var path = new PathNode(pathName); + var svgNode = new SvgNode([path], { + "width": "100%", + "height": _height + "em", + "viewBox": "0 0 " + viewBoxWidth + " " + viewBoxHeight, + "preserveAspectRatio": "none" + }); + return { + span: buildCommon.makeSvgSpan([], [svgNode], options), + minWidth: 0, + height: _height + }; + } else { + var spans = []; + var data = katexImagesData[label]; + var paths = data[0], + _minWidth = data[1], + _viewBoxHeight = data[2]; + + var _height2 = _viewBoxHeight / 1000; + + var numSvgChildren = paths.length; + var widthClasses; + var aligns; + + if (numSvgChildren === 1) { + // $FlowFixMe: All these cases must be of the 4-tuple type. + var align1 = data[3]; + widthClasses = ["hide-tail"]; + aligns = [align1]; + } else if (numSvgChildren === 2) { + widthClasses = ["halfarrow-left", "halfarrow-right"]; + aligns = ["xMinYMin", "xMaxYMin"]; + } else if (numSvgChildren === 3) { + widthClasses = ["brace-left", "brace-center", "brace-right"]; + aligns = ["xMinYMin", "xMidYMin", "xMaxYMin"]; + } else { + throw new Error("Correct katexImagesData or update code here to support\n " + numSvgChildren + " children."); + } + + for (var i = 0; i < numSvgChildren; i++) { + var _path = new PathNode(paths[i]); + + var _svgNode = new SvgNode([_path], { + "width": "400em", + "height": _height2 + "em", + "viewBox": "0 0 " + viewBoxWidth + " " + _viewBoxHeight, + "preserveAspectRatio": aligns[i] + " slice" + }); + + var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options); + + if (numSvgChildren === 1) { + return { + span: _span, + minWidth: _minWidth, + height: _height2 + }; + } else { + _span.style.height = _height2 + "em"; + spans.push(_span); + } + } + + return { + span: buildCommon.makeSpan(["stretchy"], spans, options), + minWidth: _minWidth, + height: _height2 + }; + } + } // buildSvgSpan_() + + + var _buildSvgSpan_ = buildSvgSpan_(), + span = _buildSvgSpan_.span, + minWidth = _buildSvgSpan_.minWidth, + height = _buildSvgSpan_.height; // Note that we are returning span.depth = 0. + // Any adjustments relative to the baseline must be done in buildHTML. + + + span.height = height; + span.style.height = height + "em"; + + if (minWidth > 0) { + span.style.minWidth = minWidth + "em"; + } + + return span; +}; + +var encloseSpan = function encloseSpan(inner, label, topPad, bottomPad, options) { + // Return an image span for \cancel, \bcancel, \xcancel, \fbox, or \angl + var img; + var totalHeight = inner.height + inner.depth + topPad + bottomPad; + + if (/fbox|color|angl/.test(label)) { + img = buildCommon.makeSpan(["stretchy", label], [], options); + + if (label === "fbox") { + var color = options.color && options.getColor(); + + if (color) { + img.style.borderColor = color; + } + } + } else { + // \cancel, \bcancel, or \xcancel + // Since \cancel's SVG is inline and it omits the viewBox attribute, + // its stroke-width will not vary with span area. + var lines = []; + + if (/^[bx]cancel$/.test(label)) { + lines.push(new LineNode({ + "x1": "0", + "y1": "0", + "x2": "100%", + "y2": "100%", + "stroke-width": "0.046em" + })); + } + + if (/^x?cancel$/.test(label)) { + lines.push(new LineNode({ + "x1": "0", + "y1": "100%", + "x2": "100%", + "y2": "0", + "stroke-width": "0.046em" + })); + } + + var svgNode = new SvgNode(lines, { + "width": "100%", + "height": totalHeight + "em" + }); + img = buildCommon.makeSvgSpan([], [svgNode], options); + } + + img.height = totalHeight; + img.style.height = totalHeight + "em"; + return img; +}; + +/* harmony default export */ var stretchy = ({ + encloseSpan: encloseSpan, + mathMLnode: mathMLnode, + svgSpan: svgSpan +}); +;// CONCATENATED MODULE: ./src/parseNode.js + + +/** + * Asserts that the node is of the given type and returns it with stricter + * typing. Throws if the node's type does not match. + */ +function assertNodeType(node, type) { + if (!node || node.type !== type) { + throw new Error("Expected node of type " + type + ", but got " + (node ? "node of type " + node.type : String(node))); + } // $FlowFixMe, >=0.125 + + + return node; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function assertSymbolNodeType(node) { + var typedNode = checkSymbolNodeType(node); + + if (!typedNode) { + throw new Error("Expected node of symbol group type, but got " + (node ? "node of type " + node.type : String(node))); + } + + return typedNode; +} +/** + * Returns the node more strictly typed iff it is of the given type. Otherwise, + * returns null. + */ + +function checkSymbolNodeType(node) { + if (node && (node.type === "atom" || NON_ATOMS.hasOwnProperty(node.type))) { + // $FlowFixMe + return node; + } + + return null; +} +;// CONCATENATED MODULE: ./src/functions/accent.js + + + + + + + + + +// NOTE: Unlike most `htmlBuilder`s, this one handles not only "accent", but +// also "supsub" since an accent can affect super/subscripting. +var htmlBuilder = function htmlBuilder(grp, options) { + // Accents are handled in the TeXbook pg. 443, rule 12. + var base; + var group; + var supSubGroup; + + if (grp && grp.type === "supsub") { + // If our base is a character box, and we have superscripts and + // subscripts, the supsub will defer to us. In particular, we want + // to attach the superscripts and subscripts to the inner body (so + // that the position of the superscripts and subscripts won't be + // affected by the height of the accent). We accomplish this by + // sticking the base of the accent into the base of the supsub, and + // rendering that, while keeping track of where the accent is. + // The real accent group is the base of the supsub group + group = assertNodeType(grp.base, "accent"); // The character box is the base of the accent group + + base = group.base; // Stick the character box into the base of the supsub group + + grp.base = base; // Rerender the supsub group with its new base, and store that + // result. + + supSubGroup = assertSpan(buildGroup(grp, options)); // reset original base + + grp.base = group; + } else { + group = assertNodeType(grp, "accent"); + base = group.base; + } // Build the base group + + + var body = buildGroup(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character? + + var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line "If the + // nucleus is not a single character, let s = 0; otherwise set s to the + // kern amount for the nucleus followed by the \skewchar of its font." + // Note that our skew metrics are just the kern between each character + // and the skewchar. + + var skew = 0; + + if (mustShift) { + // If the base is a character box, then we want the skew of the + // innermost character. To do that, we find the innermost character: + var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it + + var baseGroup = buildGroup(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol. + + skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we + // removed with getBaseElem might contain things like \color which + // we can't get rid of. + // TODO(emily): Find a better way to get the skew + } // calculate the amount of space between the body and the accent + + + var clearance = Math.min(body.height, options.fontMetrics().xHeight); // Build the accent + + var accentBody; + + if (!group.isStretchy) { + var accent; + var width; + + if (group.label === "\\vec") { + // Before version 0.9, \vec used the combining font glyph U+20D7. + // But browsers, especially Safari, are not consistent in how they + // render combining characters when not preceded by a character. + // So now we use an SVG. + // If Safari reforms, we should consider reverting to the glyph. + accent = buildCommon.staticSvg("vec", options); + width = buildCommon.svgData.vec[1]; + } else { + accent = buildCommon.makeOrd({ + mode: group.mode, + text: group.label + }, options, "textord"); + accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to + // shift the accent over to a place we don't want. + + accent.italic = 0; + width = accent.width; + } + + accentBody = buildCommon.makeSpan(["accent-body"], [accent]); // "Full" accents expand the width of the resulting symbol to be + // at least the width of the accent, and overlap directly onto the + // character without any vertical offset. + + var accentFull = group.label === "\\textcircled"; + + if (accentFull) { + accentBody.classes.push('accent-full'); + clearance = body.height; + } // Shift the accent over by the skew. + + + var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }` + // so that the accent doesn't contribute to the bounding box. + // We need to shift the character by its width (effectively half + // its width) to compensate. + + if (!accentFull) { + left -= width / 2; + } + + accentBody.style.left = left + "em"; // \textcircled uses the \bigcirc glyph, so it needs some + // vertical adjustment to match LaTeX. + + if (group.label === "\\textcircled") { + accentBody.style.top = ".2em"; + } + + accentBody = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: body + }, { + type: "kern", + size: -clearance + }, { + type: "elem", + elem: accentBody + }] + }, options); + } else { + accentBody = stretchy.svgSpan(group, options); + accentBody = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: body + }, { + type: "elem", + elem: accentBody, + wrapperClasses: ["svg-align"], + wrapperStyle: skew > 0 ? { + width: "calc(100% - " + 2 * skew + "em)", + marginLeft: 2 * skew + "em" + } : undefined + }] + }, options); + } + + var accentWrap = buildCommon.makeSpan(["mord", "accent"], [accentBody], options); + + if (supSubGroup) { + // Here, we replace the "base" child of the supsub with our newly + // generated accent. + supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the + // accent, we manually recalculate height. + + supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not. + + supSubGroup.classes[0] = "mord"; + return supSubGroup; + } else { + return accentWrap; + } +}; + +var mathmlBuilder = function mathmlBuilder(group, options) { + var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]); + var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.base, options), accentNode]); + node.setAttribute("accent", "true"); + return node; +}; + +var NON_STRETCHY_ACCENT_REGEX = new RegExp(["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring"].map(function (accent) { + return "\\" + accent; +}).join("|")); // Accents + +defineFunction({ + type: "accent", + names: ["\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring", "\\widecheck", "\\widehat", "\\widetilde", "\\overrightarrow", "\\overleftarrow", "\\Overrightarrow", "\\overleftrightarrow", "\\overgroup", "\\overlinesegment", "\\overleftharpoon", "\\overrightharpoon"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + var base = normalizeArgument(args[0]); + var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName); + var isShifty = !isStretchy || context.funcName === "\\widehat" || context.funcName === "\\widetilde" || context.funcName === "\\widecheck"; + return { + type: "accent", + mode: context.parser.mode, + label: context.funcName, + isStretchy: isStretchy, + isShifty: isShifty, + base: base + }; + }, + htmlBuilder: htmlBuilder, + mathmlBuilder: mathmlBuilder +}); // Text-mode accents + +defineFunction({ + type: "accent", + names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v", "\\textcircled"], + props: { + numArgs: 1, + allowedInText: true, + allowedInMath: false, + argTypes: ["primitive"] + }, + handler: function handler(context, args) { + var base = args[0]; + return { + type: "accent", + mode: context.parser.mode, + label: context.funcName, + isStretchy: false, + isShifty: true, + base: base + }; + }, + htmlBuilder: htmlBuilder, + mathmlBuilder: mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/accentunder.js +// Horizontal overlap functions + + + + + + +defineFunction({ + type: "accentUnder", + names: ["\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", "\\undergroup", "\\underlinesegment", "\\utilde"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var base = args[0]; + return { + type: "accentUnder", + mode: parser.mode, + label: funcName, + base: base + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Treat under accents much like underlines. + var innerGroup = buildGroup(group.base, options); + var accentBody = stretchy.svgSpan(group, options); + var kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns + + var vlist = buildCommon.makeVList({ + positionType: "top", + positionData: innerGroup.height, + children: [{ + type: "elem", + elem: accentBody, + wrapperClasses: ["svg-align"] + }, { + type: "kern", + size: kern + }, { + type: "elem", + elem: innerGroup + }] + }, options); + return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var accentNode = stretchy.mathMLnode(group.label); + var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.base, options), accentNode]); + node.setAttribute("accentunder", "true"); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/arrow.js + + + + + + + +// Helper function +var paddedNode = function paddedNode(group) { + var node = new mathMLTree.MathNode("mpadded", group ? [group] : []); + node.setAttribute("width", "+0.6em"); + node.setAttribute("lspace", "0.3em"); + return node; +}; // Stretchy arrows with an optional argument + + +defineFunction({ + type: "xArrow", + names: ["\\xleftarrow", "\\xrightarrow", "\\xLeftarrow", "\\xRightarrow", "\\xleftrightarrow", "\\xLeftrightarrow", "\\xhookleftarrow", "\\xhookrightarrow", "\\xmapsto", "\\xrightharpoondown", "\\xrightharpoonup", "\\xleftharpoondown", "\\xleftharpoonup", "\\xrightleftharpoons", "\\xleftrightharpoons", "\\xlongequal", "\\xtwoheadrightarrow", "\\xtwoheadleftarrow", "\\xtofrom", // The next 3 functions are here to support the mhchem extension. + // Direct use of these functions is discouraged and may break someday. + "\\xrightleftarrows", "\\xrightequilibrium", "\\xleftequilibrium", // The next 3 functions are here only to support the {CD} environment. + "\\\\cdrightarrow", "\\\\cdleftarrow", "\\\\cdlongequal"], + props: { + numArgs: 1, + numOptionalArgs: 1 + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser, + funcName = _ref.funcName; + return { + type: "xArrow", + mode: parser.mode, + label: funcName, + body: args[0], + below: optArgs[0] + }; + }, + // Flow is unable to correctly infer the type of `group`, even though it's + // unamibiguously determined from the passed-in `type` above. + htmlBuilder: function htmlBuilder(group, options) { + var style = options.style; // Build the argument groups in the appropriate style. + // Ref: amsmath.dtx: \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}% + // Some groups can return document fragments. Handle those by wrapping + // them in a span. + + var newOptions = options.havingStyle(style.sup()); + var upperGroup = buildCommon.wrapFragment(buildGroup(group.body, newOptions, options), options); + var arrowPrefix = group.label.slice(0, 2) === "\\x" ? "x" : "cd"; + upperGroup.classes.push(arrowPrefix + "-arrow-pad"); + var lowerGroup; + + if (group.below) { + // Build the lower group + newOptions = options.havingStyle(style.sub()); + lowerGroup = buildCommon.wrapFragment(buildGroup(group.below, newOptions, options), options); + lowerGroup.classes.push(arrowPrefix + "-arrow-pad"); + } + + var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0. + // The point we want on the math axis is at 0.5 * arrowBody.height. + + var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\if0#2\else\mkern#2mu\fi + + var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu + + if (upperGroup.depth > 0.25 || group.label === "\\xleftequilibrium") { + upperShift -= upperGroup.depth; // shift up if depth encroaches + } // Generate the vlist + + + var vlist; + + if (lowerGroup) { + var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111; + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: upperGroup, + shift: upperShift + }, { + type: "elem", + elem: arrowBody, + shift: arrowShift + }, { + type: "elem", + elem: lowerGroup, + shift: lowerShift + }] + }, options); + } else { + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: upperGroup, + shift: upperShift + }, { + type: "elem", + elem: arrowBody, + shift: arrowShift + }] + }, options); + } // $FlowFixMe: Replace this with passing "svg-align" into makeVList. + + + vlist.children[0].children[0].children[1].classes.push("svg-align"); + return buildCommon.makeSpan(["mrel", "x-arrow"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var arrowNode = stretchy.mathMLnode(group.label); + arrowNode.setAttribute("minsize", group.label.charAt(0) === "x" ? "1.75em" : "3.0em"); + var node; + + if (group.body) { + var upperNode = paddedNode(buildMathML_buildGroup(group.body, options)); + + if (group.below) { + var lowerNode = paddedNode(buildMathML_buildGroup(group.below, options)); + node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); + } else { + node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); + } + } else if (group.below) { + var _lowerNode = paddedNode(buildMathML_buildGroup(group.below, options)); + + node = new mathMLTree.MathNode("munder", [arrowNode, _lowerNode]); + } else { + // This should never happen. + // Parser.js throws an error if there is no argument. + node = paddedNode(); + node = new mathMLTree.MathNode("mover", [arrowNode, node]); + } + + return node; + } +}); +;// CONCATENATED MODULE: ./src/environments/cd.js + + + + + + + +var cdArrowFunctionName = { + ">": "\\\\cdrightarrow", + "<": "\\\\cdleftarrow", + "=": "\\\\cdlongequal", + "A": "\\uparrow", + "V": "\\downarrow", + "|": "\\Vert", + ".": "no arrow" +}; + +var newCell = function newCell() { + // Create an empty cell, to be filled below with parse nodes. + // The parseTree from this module must be constructed like the + // one created by parseArray(), so an empty CD cell must + // be a ParseNode<"styling">. And CD is always displaystyle. + // So these values are fixed and flow can do implicit typing. + return { + type: "styling", + body: [], + mode: "math", + style: "display" + }; +}; + +var isStartOfArrow = function isStartOfArrow(node) { + return node.type === "textord" && node.text === "@"; +}; + +var isLabelEnd = function isLabelEnd(node, endChar) { + return (node.type === "mathord" || node.type === "atom") && node.text === endChar; +}; + +function cdArrow(arrowChar, labels, parser) { + // Return a parse tree of an arrow and its labels. + // This acts in a way similar to a macro expansion. + var funcName = cdArrowFunctionName[arrowChar]; + + switch (funcName) { + case "\\\\cdrightarrow": + case "\\\\cdleftarrow": + return parser.callFunction(funcName, [labels[0]], [labels[1]]); + + case "\\uparrow": + case "\\downarrow": + { + var leftLabel = parser.callFunction("\\\\cdleft", [labels[0]], []); + var bareArrow = { + type: "atom", + text: funcName, + mode: "math", + family: "rel" + }; + var sizedArrow = parser.callFunction("\\Big", [bareArrow], []); + var rightLabel = parser.callFunction("\\\\cdright", [labels[1]], []); + var arrowGroup = { + type: "ordgroup", + mode: "math", + body: [leftLabel, sizedArrow, rightLabel] + }; + return parser.callFunction("\\\\cdparent", [arrowGroup], []); + } + + case "\\\\cdlongequal": + return parser.callFunction("\\\\cdlongequal", [], []); + + case "\\Vert": + { + var arrow = { + type: "textord", + text: "\\Vert", + mode: "math" + }; + return parser.callFunction("\\Big", [arrow], []); + } + + default: + return { + type: "textord", + text: " ", + mode: "math" + }; + } +} + +function parseCD(parser) { + // Get the array's parse nodes with \\ temporarily mapped to \cr. + var parsedRows = []; + parser.gullet.beginGroup(); + parser.gullet.macros.set("\\cr", "\\\\\\relax"); + parser.gullet.beginGroup(); + + while (true) { + // eslint-disable-line no-constant-condition + // Get the parse nodes for the next row. + parsedRows.push(parser.parseExpression(false, "\\\\")); + parser.gullet.endGroup(); + parser.gullet.beginGroup(); + var next = parser.fetch().text; + + if (next === "&" || next === "\\\\") { + parser.consume(); + } else if (next === "\\end") { + if (parsedRows[parsedRows.length - 1].length === 0) { + parsedRows.pop(); // final row ended in \\ + } + + break; + } else { + throw new src_ParseError("Expected \\\\ or \\cr or \\end", parser.nextToken); + } + } + + var row = []; + var body = [row]; // Loop thru the parse nodes. Collect them into cells and arrows. + + for (var i = 0; i < parsedRows.length; i++) { + // Start a new row. + var rowNodes = parsedRows[i]; // Create the first cell. + + var cell = newCell(); + + for (var j = 0; j < rowNodes.length; j++) { + if (!isStartOfArrow(rowNodes[j])) { + // If a parseNode is not an arrow, it goes into a cell. + cell.body.push(rowNodes[j]); + } else { + // Parse node j is an "@", the start of an arrow. + // Before starting on the arrow, push the cell into `row`. + row.push(cell); // Now collect parseNodes into an arrow. + // The character after "@" defines the arrow type. + + j += 1; + var arrowChar = assertSymbolNodeType(rowNodes[j]).text; // Create two empty label nodes. We may or may not use them. + + var labels = new Array(2); + labels[0] = { + type: "ordgroup", + mode: "math", + body: [] + }; + labels[1] = { + type: "ordgroup", + mode: "math", + body: [] + }; // Process the arrow. + + if ("=|.".indexOf(arrowChar) > -1) {// Three "arrows", ``@=`, `@|`, and `@.`, do not take labels. + // Do nothing here. + } else if ("<>AV".indexOf(arrowChar) > -1) { + // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take + // two optional labels. E.g. the right-point arrow syntax is + // really: @>{optional label}>{optional label}> + // Collect parseNodes into labels. + for (var labelNum = 0; labelNum < 2; labelNum++) { + var inLabel = true; + + for (var k = j + 1; k < rowNodes.length; k++) { + if (isLabelEnd(rowNodes[k], arrowChar)) { + inLabel = false; + j = k; + break; + } + + if (isStartOfArrow(rowNodes[k])) { + throw new src_ParseError("Missing a " + arrowChar + " character to complete a CD arrow.", rowNodes[k]); + } + + labels[labelNum].body.push(rowNodes[k]); + } + + if (inLabel) { + // isLabelEnd never returned a true. + throw new src_ParseError("Missing a " + arrowChar + " character to complete a CD arrow.", rowNodes[j]); + } + } + } else { + throw new src_ParseError("Expected one of \"<>AV=|.\" after @", rowNodes[j]); + } // Now join the arrow to its labels. + + + var arrow = cdArrow(arrowChar, labels, parser); // Wrap the arrow in ParseNode<"styling">. + // This is done to match parseArray() behavior. + + var wrappedArrow = { + type: "styling", + body: [arrow], + mode: "math", + style: "display" // CD is always displaystyle. + + }; + row.push(wrappedArrow); // In CD's syntax, cells are implicit. That is, everything that + // is not an arrow gets collected into a cell. So create an empty + // cell now. It will collect upcoming parseNodes. + + cell = newCell(); + } + } + + if (i % 2 === 0) { + // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell + // The last cell is not yet pushed into `row`, so: + row.push(cell); + } else { + // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow + // Remove the empty cell that was placed at the beginning of `row`. + row.shift(); + } + + row = []; + body.push(row); + } // End row group + + + parser.gullet.endGroup(); // End array group defining \\ + + parser.gullet.endGroup(); // define column separation. + + var cols = new Array(body[0].length).fill({ + type: "align", + align: "c", + pregap: 0.25, + // CD package sets \enskip between columns. + postgap: 0.25 // So pre and post each get half an \enskip, i.e. 0.25em. + + }); + return { + type: "array", + mode: "math", + body: body, + arraystretch: 1, + addJot: true, + rowGaps: [null], + cols: cols, + colSeparationType: "CD", + hLinesBeforeRow: new Array(body.length + 1).fill([]) + }; +} // The functions below are not available for general use. +// They are here only for internal use by the {CD} environment in placing labels +// next to vertical arrows. +// We don't need any such functions for horizontal arrows because we can reuse +// the functionality that already exists for extensible arrows. + +defineFunction({ + type: "cdlabel", + names: ["\\\\cdleft", "\\\\cdright"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + return { + type: "cdlabel", + mode: parser.mode, + side: funcName.slice(4), + label: args[0] + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var newOptions = options.havingStyle(options.style.sup()); + var label = buildCommon.wrapFragment(buildGroup(group.label, newOptions, options), options); + label.classes.push("cd-label-" + group.side); + label.style.bottom = 0.8 - label.depth + "em"; // Zero out label height & depth, so vertical align of arrow is set + // by the arrow height, not by the label. + + label.height = 0; + label.depth = 0; + return label; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var label = new mathMLTree.MathNode("mrow", [buildMathML_buildGroup(group.label, options)]); + label = new mathMLTree.MathNode("mpadded", [label]); + label.setAttribute("width", "0"); + + if (group.side === "left") { + label.setAttribute("lspace", "-1width"); + } // We have to guess at vertical alignment. We know the arrow is 1.8em tall, + // But we don't know the height or depth of the label. + + + label.setAttribute("voffset", "0.7em"); + label = new mathMLTree.MathNode("mstyle", [label]); + label.setAttribute("displaystyle", "false"); + label.setAttribute("scriptlevel", "1"); + return label; + } +}); +defineFunction({ + type: "cdlabelparent", + names: ["\\\\cdparent"], + props: { + numArgs: 1 + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + return { + type: "cdlabelparent", + mode: parser.mode, + fragment: args[0] + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Wrap the vertical arrow and its labels. + // The parent gets position: relative. The child gets position: absolute. + // So CSS can locate the label correctly. + var parent = buildCommon.wrapFragment(buildGroup(group.fragment, options), options); + parent.classes.push("cd-vert-arrow"); + return parent; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return new mathMLTree.MathNode("mrow", [buildMathML_buildGroup(group.fragment, options)]); + } +}); +;// CONCATENATED MODULE: ./src/functions/char.js + + + // \@char is an internal function that takes a grouped decimal argument like +// {123} and converts into symbol with code 123. It is used by the *macro* +// \char defined in macros.js. + +defineFunction({ + type: "textord", + names: ["\\@char"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var arg = assertNodeType(args[0], "ordgroup"); + var group = arg.body; + var number = ""; + + for (var i = 0; i < group.length; i++) { + var node = assertNodeType(group[i], "textord"); + number += node.text; + } + + var code = parseInt(number); + + if (isNaN(code)) { + throw new src_ParseError("\\@char has non-numeric argument " + number); + } + + return { + type: "textord", + mode: parser.mode, + text: String.fromCharCode(code) + }; + } +}); +;// CONCATENATED MODULE: ./src/functions/color.js + + + + + + + +var color_htmlBuilder = function htmlBuilder(group, options) { + var elements = buildExpression(group.body, options.withColor(group.color), false); // \color isn't supposed to affect the type of the elements it contains. + // To accomplish this, we wrap the results in a fragment, so the inner + // elements will be able to directly interact with their neighbors. For + // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3` + + return buildCommon.makeFragment(elements); +}; + +var color_mathmlBuilder = function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(group.body, options.withColor(group.color)); + var node = new mathMLTree.MathNode("mstyle", inner); + node.setAttribute("mathcolor", group.color); + return node; +}; + +defineFunction({ + type: "color", + names: ["\\textcolor"], + props: { + numArgs: 2, + allowedInText: true, + argTypes: ["color", "original"] + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var color = assertNodeType(args[0], "color-token").color; + var body = args[1]; + return { + type: "color", + mode: parser.mode, + color: color, + body: ordargument(body) + }; + }, + htmlBuilder: color_htmlBuilder, + mathmlBuilder: color_mathmlBuilder +}); +defineFunction({ + type: "color", + names: ["\\color"], + props: { + numArgs: 1, + allowedInText: true, + argTypes: ["color"] + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser, + breakOnTokenText = _ref2.breakOnTokenText; + var color = assertNodeType(args[0], "color-token").color; // Set macro \current@color in current namespace to store the current + // color, mimicking the behavior of color.sty. + // This is currently used just to correctly color a \right + // that follows a \color command. + + parser.gullet.macros.set("\\current@color", color); // Parse out the implicit body that should be colored. + + var body = parser.parseExpression(true, breakOnTokenText); + return { + type: "color", + mode: parser.mode, + color: color, + body: body + }; + }, + htmlBuilder: color_htmlBuilder, + mathmlBuilder: color_mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/cr.js +// Row breaks within tabular environments, and line breaks at top level + + + + + // \DeclareRobustCommand\\{...\@xnewline} + +defineFunction({ + type: "cr", + names: ["\\\\"], + props: { + numArgs: 0, + numOptionalArgs: 1, + argTypes: ["size"], + allowedInText: true + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var size = optArgs[0]; + var newLine = !parser.settings.displayMode || !parser.settings.useStrictBehavior("newLineInDisplayMode", "In LaTeX, \\\\ or \\newline " + "does nothing in display mode"); + return { + type: "cr", + mode: parser.mode, + newLine: newLine, + size: size && assertNodeType(size, "size").value + }; + }, + // The following builders are called only at the top level, + // not within tabular/array environments. + htmlBuilder: function htmlBuilder(group, options) { + var span = buildCommon.makeSpan(["mspace"], [], options); + + if (group.newLine) { + span.classes.push("newline"); + + if (group.size) { + span.style.marginTop = calculateSize(group.size, options) + "em"; + } + } + + return span; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mspace"); + + if (group.newLine) { + node.setAttribute("linebreak", "newline"); + + if (group.size) { + node.setAttribute("height", calculateSize(group.size, options) + "em"); + } + } + + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/def.js + + + +var globalMap = { + "\\global": "\\global", + "\\long": "\\\\globallong", + "\\\\globallong": "\\\\globallong", + "\\def": "\\gdef", + "\\gdef": "\\gdef", + "\\edef": "\\xdef", + "\\xdef": "\\xdef", + "\\let": "\\\\globallet", + "\\futurelet": "\\\\globalfuture" +}; + +var checkControlSequence = function checkControlSequence(tok) { + var name = tok.text; + + if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { + throw new src_ParseError("Expected a control sequence", tok); + } + + return name; +}; + +var getRHS = function getRHS(parser) { + var tok = parser.gullet.popToken(); + + if (tok.text === "=") { + // consume optional equals + tok = parser.gullet.popToken(); + + if (tok.text === " ") { + // consume one optional space + tok = parser.gullet.popToken(); + } + } + + return tok; +}; + +var letCommand = function letCommand(parser, name, tok, global) { + var macro = parser.gullet.macros.get(tok.text); + + if (macro == null) { + // don't expand it later even if a macro with the same name is defined + // e.g., \let\foo=\frac \def\frac{\relax} \frac12 + tok.noexpand = true; + macro = { + tokens: [tok], + numArgs: 0, + // reproduce the same behavior in expansion + unexpandable: !parser.gullet.isExpandable(tok.text) + }; + } + + parser.gullet.macros.set(name, macro, global); +}; // -> | +// -> |\global +// -> | +// -> \global|\long|\outer + + +defineFunction({ + type: "internal", + names: ["\\global", "\\long", "\\\\globallong" // can’t be entered directly + ], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref) { + var parser = _ref.parser, + funcName = _ref.funcName; + parser.consumeSpaces(); + var token = parser.fetch(); + + if (globalMap[token.text]) { + // KaTeX doesn't have \par, so ignore \long + if (funcName === "\\global" || funcName === "\\\\globallong") { + token.text = globalMap[token.text]; + } + + return assertNodeType(parser.parseFunction(), "internal"); + } + + throw new src_ParseError("Invalid token after macro prefix", token); + } +}); // Basic support for macro definitions: \def, \gdef, \edef, \xdef +// -> +// -> \def|\gdef|\edef|\xdef +// -> + +defineFunction({ + type: "internal", + names: ["\\def", "\\gdef", "\\edef", "\\xdef"], + props: { + numArgs: 0, + allowedInText: true, + primitive: true + }, + handler: function handler(_ref2) { + var parser = _ref2.parser, + funcName = _ref2.funcName; + var tok = parser.gullet.popToken(); + var name = tok.text; + + if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { + throw new src_ParseError("Expected a control sequence", tok); + } + + var numArgs = 0; + var insert; + var delimiters = [[]]; // contains no braces + + while (parser.gullet.future().text !== "{") { + tok = parser.gullet.popToken(); + + if (tok.text === "#") { + // If the very last character of the is #, so that + // this # is immediately followed by {, TeX will behave as if the { + // had been inserted at the right end of both the parameter text + // and the replacement text. + if (parser.gullet.future().text === "{") { + insert = parser.gullet.future(); + delimiters[numArgs].push("{"); + break; + } // A parameter, the first appearance of # must be followed by 1, + // the next by 2, and so on; up to nine #’s are allowed + + + tok = parser.gullet.popToken(); + + if (!/^[1-9]$/.test(tok.text)) { + throw new src_ParseError("Invalid argument number \"" + tok.text + "\""); + } + + if (parseInt(tok.text) !== numArgs + 1) { + throw new src_ParseError("Argument number \"" + tok.text + "\" out of order"); + } + + numArgs++; + delimiters.push([]); + } else if (tok.text === "EOF") { + throw new src_ParseError("Expected a macro definition"); + } else { + delimiters[numArgs].push(tok.text); + } + } // replacement text, enclosed in '{' and '}' and properly nested + + + var _parser$gullet$consum = parser.gullet.consumeArg(), + tokens = _parser$gullet$consum.tokens; + + if (insert) { + tokens.unshift(insert); + } + + if (funcName === "\\edef" || funcName === "\\xdef") { + tokens = parser.gullet.expandTokens(tokens); + tokens.reverse(); // to fit in with stack order + } // Final arg is the expansion of the macro + + + parser.gullet.macros.set(name, { + tokens: tokens, + numArgs: numArgs, + delimiters: delimiters + }, funcName === globalMap[funcName]); + return { + type: "internal", + mode: parser.mode + }; + } +}); // -> +// -> \futurelet +// | \let +// -> |= + +defineFunction({ + type: "internal", + names: ["\\let", "\\\\globallet" // can’t be entered directly + ], + props: { + numArgs: 0, + allowedInText: true, + primitive: true + }, + handler: function handler(_ref3) { + var parser = _ref3.parser, + funcName = _ref3.funcName; + var name = checkControlSequence(parser.gullet.popToken()); + parser.gullet.consumeSpaces(); + var tok = getRHS(parser); + letCommand(parser, name, tok, funcName === "\\\\globallet"); + return { + type: "internal", + mode: parser.mode + }; + } +}); // ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf + +defineFunction({ + type: "internal", + names: ["\\futurelet", "\\\\globalfuture" // can’t be entered directly + ], + props: { + numArgs: 0, + allowedInText: true, + primitive: true + }, + handler: function handler(_ref4) { + var parser = _ref4.parser, + funcName = _ref4.funcName; + var name = checkControlSequence(parser.gullet.popToken()); + var middle = parser.gullet.popToken(); + var tok = parser.gullet.popToken(); + letCommand(parser, name, tok, funcName === "\\\\globalfuture"); + parser.gullet.pushToken(tok); + parser.gullet.pushToken(middle); + return { + type: "internal", + mode: parser.mode + }; + } +}); +;// CONCATENATED MODULE: ./src/delimiter.js +/** + * This file deals with creating delimiters of various sizes. The TeXbook + * discusses these routines on page 441-442, in the "Another subroutine sets box + * x to a specified variable delimiter" paragraph. + * + * There are three main routines here. `makeSmallDelim` makes a delimiter in the + * normal font, but in either text, script, or scriptscript style. + * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1, + * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of + * smaller pieces that are stacked on top of one another. + * + * The functions take a parameter `center`, which determines if the delimiter + * should be centered around the axis. + * + * Then, there are three exposed functions. `sizedDelim` makes a delimiter in + * one of the given sizes. This is used for things like `\bigl`. + * `customSizedDelim` makes a delimiter with a given total height+depth. It is + * called in places like `\sqrt`. `leftRightDelim` makes an appropriate + * delimiter which surrounds an expression of a given height an depth. It is + * used in `\left` and `\right`. + */ + + + + + + + + + + +/** + * Get the metrics for a given symbol and font, after transformation (i.e. + * after following replacement from symbols.js) + */ +var getMetrics = function getMetrics(symbol, font, mode) { + var replace = src_symbols.math[symbol] && src_symbols.math[symbol].replace; + var metrics = getCharacterMetrics(replace || symbol, font, mode); + + if (!metrics) { + throw new Error("Unsupported symbol " + symbol + " and font size " + font + "."); + } + + return metrics; +}; +/** + * Puts a delimiter span in a given style, and adds appropriate height, depth, + * and maxFontSizes. + */ + + +var styleWrap = function styleWrap(delim, toStyle, options, classes) { + var newOptions = options.havingBaseStyle(toStyle); + var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options); + var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier; + span.height *= delimSizeMultiplier; + span.depth *= delimSizeMultiplier; + span.maxFontSize = newOptions.sizeMultiplier; + return span; +}; + +var centerSpan = function centerSpan(span, options, style) { + var newOptions = options.havingBaseStyle(style); + var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight; + span.classes.push("delimcenter"); + span.style.top = shift + "em"; + span.height -= shift; + span.depth += shift; +}; +/** + * Makes a small delimiter. This is a delimiter that comes in the Main-Regular + * font, but is restyled to either be in textstyle, scriptstyle, or + * scriptscriptstyle. + */ + + +var makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) { + var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options); + var span = styleWrap(text, style, options, classes); + + if (center) { + centerSpan(span, options, style); + } + + return span; +}; +/** + * Builds a symbol in the given font size (note size is an integer) + */ + + +var mathrmSize = function mathrmSize(value, size, mode, options) { + return buildCommon.makeSymbol(value, "Size" + size + "-Regular", mode, options); +}; +/** + * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2, + * Size3, or Size4 fonts. It is always rendered in textstyle. + */ + + +var makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) { + var inner = mathrmSize(delim, size, mode, options); + var span = styleWrap(buildCommon.makeSpan(["delimsizing", "size" + size], [inner], options), src_Style.TEXT, options, classes); + + if (center) { + centerSpan(span, options, src_Style.TEXT); + } + + return span; +}; +/** + * Make a span from a font glyph with the given offset and in the given font. + * This is used in makeStackedDelim to make the stacking pieces for the delimiter. + */ + + +var makeGlyphSpan = function makeGlyphSpan(symbol, font, mode) { + var sizeClass; // Apply the correct CSS class to choose the right font. + + if (font === "Size1-Regular") { + sizeClass = "delim-size1"; + } else + /* if (font === "Size4-Regular") */ + { + sizeClass = "delim-size4"; + } + + var corner = buildCommon.makeSpan(["delimsizinginner", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element + // in the appropriate tag that VList uses. + + return { + type: "elem", + elem: corner + }; +}; + +var makeInner = function makeInner(ch, height, options) { + // Create a span with inline SVG for the inner part of a tall stacked delimiter. + var width = fontMetricsData["Size4-Regular"][ch.charCodeAt(0)] ? fontMetricsData["Size4-Regular"][ch.charCodeAt(0)][4].toFixed(3) : fontMetricsData["Size1-Regular"][ch.charCodeAt(0)][4].toFixed(3); + var path = new PathNode("inner", innerPath(ch, Math.round(1000 * height))); + var svgNode = new SvgNode([path], { + "width": width + "em", + "height": height + "em", + // Override CSS rule `.katex svg { width: 100% }` + "style": "width:" + width + "em", + "viewBox": "0 0 " + 1000 * width + " " + Math.round(1000 * height), + "preserveAspectRatio": "xMinYMin" + }); + var span = buildCommon.makeSvgSpan([], [svgNode], options); + span.height = height; + span.style.height = height + "em"; + span.style.width = width + "em"; + return { + type: "elem", + elem: span + }; +}; // Helpers for makeStackedDelim + + +var lapInEms = 0.008; +var lap = { + type: "kern", + size: -1 * lapInEms +}; +var verts = ["|", "\\lvert", "\\rvert", "\\vert"]; +var doubleVerts = ["\\|", "\\lVert", "\\rVert", "\\Vert"]; +/** + * Make a stacked delimiter out of a given delimiter, with the total height at + * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook. + */ + +var makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) { + // There are four parts, the top, an optional middle, a repeated part, and a + // bottom. + var top; + var middle; + var repeat; + var bottom; + top = repeat = bottom = delim; + middle = null; // Also keep track of what font the delimiters are in + + var font = "Size1-Regular"; // We set the parts and font based on the symbol. Note that we use + // '\u23d0' instead of '|' and '\u2016' instead of '\\|' for the + // repeats of the arrows + + if (delim === "\\uparrow") { + repeat = bottom = "\u23D0"; + } else if (delim === "\\Uparrow") { + repeat = bottom = "\u2016"; + } else if (delim === "\\downarrow") { + top = repeat = "\u23D0"; + } else if (delim === "\\Downarrow") { + top = repeat = "\u2016"; + } else if (delim === "\\updownarrow") { + top = "\\uparrow"; + repeat = "\u23D0"; + bottom = "\\downarrow"; + } else if (delim === "\\Updownarrow") { + top = "\\Uparrow"; + repeat = "\u2016"; + bottom = "\\Downarrow"; + } else if (utils.contains(verts, delim)) { + repeat = "\u2223"; + } else if (utils.contains(doubleVerts, delim)) { + repeat = "\u2225"; + } else if (delim === "[" || delim === "\\lbrack") { + top = "\u23A1"; + repeat = "\u23A2"; + bottom = "\u23A3"; + font = "Size4-Regular"; + } else if (delim === "]" || delim === "\\rbrack") { + top = "\u23A4"; + repeat = "\u23A5"; + bottom = "\u23A6"; + font = "Size4-Regular"; + } else if (delim === "\\lfloor" || delim === "\u230A") { + repeat = top = "\u23A2"; + bottom = "\u23A3"; + font = "Size4-Regular"; + } else if (delim === "\\lceil" || delim === "\u2308") { + top = "\u23A1"; + repeat = bottom = "\u23A2"; + font = "Size4-Regular"; + } else if (delim === "\\rfloor" || delim === "\u230B") { + repeat = top = "\u23A5"; + bottom = "\u23A6"; + font = "Size4-Regular"; + } else if (delim === "\\rceil" || delim === "\u2309") { + top = "\u23A4"; + repeat = bottom = "\u23A5"; + font = "Size4-Regular"; + } else if (delim === "(" || delim === "\\lparen") { + top = "\u239B"; + repeat = "\u239C"; + bottom = "\u239D"; + font = "Size4-Regular"; + } else if (delim === ")" || delim === "\\rparen") { + top = "\u239E"; + repeat = "\u239F"; + bottom = "\u23A0"; + font = "Size4-Regular"; + } else if (delim === "\\{" || delim === "\\lbrace") { + top = "\u23A7"; + middle = "\u23A8"; + bottom = "\u23A9"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\}" || delim === "\\rbrace") { + top = "\u23AB"; + middle = "\u23AC"; + bottom = "\u23AD"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\lgroup" || delim === "\u27EE") { + top = "\u23A7"; + bottom = "\u23A9"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\rgroup" || delim === "\u27EF") { + top = "\u23AB"; + bottom = "\u23AD"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\lmoustache" || delim === "\u23B0") { + top = "\u23A7"; + bottom = "\u23AD"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } else if (delim === "\\rmoustache" || delim === "\u23B1") { + top = "\u23AB"; + bottom = "\u23A9"; + repeat = "\u23AA"; + font = "Size4-Regular"; + } // Get the metrics of the four sections + + + var topMetrics = getMetrics(top, font, mode); + var topHeightTotal = topMetrics.height + topMetrics.depth; + var repeatMetrics = getMetrics(repeat, font, mode); + var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth; + var bottomMetrics = getMetrics(bottom, font, mode); + var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth; + var middleHeightTotal = 0; + var middleFactor = 1; + + if (middle !== null) { + var middleMetrics = getMetrics(middle, font, mode); + middleHeightTotal = middleMetrics.height + middleMetrics.depth; + middleFactor = 2; // repeat symmetrically above and below middle + } // Calcuate the minimal height that the delimiter can have. + // It is at least the size of the top, bottom, and optional middle combined. + + + var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need + + var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols + + var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note + // that in this context, "center" means that the delimiter should be + // centered around the axis in the current style, while normally it is + // centered around the axis in textstyle. + + var axisHeight = options.fontMetrics().axisHeight; + + if (center) { + axisHeight *= options.sizeMultiplier; + } // Calculate the depth + + + var depth = realHeightTotal / 2 - axisHeight; // Now, we start building the pieces that will go into the vlist + // Keep a list of the pieces of the stacked delimiter + + var stack = []; // Add the bottom symbol + + stack.push(makeGlyphSpan(bottom, font, mode)); + stack.push(lap); // overlap + + if (middle === null) { + // The middle section will be an SVG. Make it an extra 0.016em tall. + // We'll overlap by 0.008em at top and bottom. + var innerHeight = realHeightTotal - topHeightTotal - bottomHeightTotal + 2 * lapInEms; + stack.push(makeInner(repeat, innerHeight, options)); + } else { + // When there is a middle bit, we need the middle part and two repeated + // sections + var _innerHeight = (realHeightTotal - topHeightTotal - bottomHeightTotal - middleHeightTotal) / 2 + 2 * lapInEms; + + stack.push(makeInner(repeat, _innerHeight, options)); // Now insert the middle of the brace. + + stack.push(lap); + stack.push(makeGlyphSpan(middle, font, mode)); + stack.push(lap); + stack.push(makeInner(repeat, _innerHeight, options)); + } // Add the top symbol + + + stack.push(lap); + stack.push(makeGlyphSpan(top, font, mode)); // Finally, build the vlist + + var newOptions = options.havingBaseStyle(src_Style.TEXT); + var inner = buildCommon.makeVList({ + positionType: "bottom", + positionData: depth, + children: stack + }, newOptions); + return styleWrap(buildCommon.makeSpan(["delimsizing", "mult"], [inner], newOptions), src_Style.TEXT, options, classes); +}; // All surds have 0.08em padding above the viniculum inside the SVG. +// That keeps browser span height rounding error from pinching the line. + + +var vbPad = 80; // padding above the surd, measured inside the viewBox. + +var emPad = 0.08; // padding, in ems, measured in the document. + +var sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraViniculum, options) { + var path = sqrtPath(sqrtName, extraViniculum, viewBoxHeight); + var pathNode = new PathNode(sqrtName, path); + var svg = new SvgNode([pathNode], { + // Note: 1000:1 ratio of viewBox to document em width. + "width": "400em", + "height": height + "em", + "viewBox": "0 0 400000 " + viewBoxHeight, + "preserveAspectRatio": "xMinYMin slice" + }); + return buildCommon.makeSvgSpan(["hide-tail"], [svg], options); +}; +/** + * Make a sqrt image of the given height, + */ + + +var makeSqrtImage = function makeSqrtImage(height, options) { + // Define a newOptions that removes the effect of size changes such as \Huge. + // We don't pick different a height surd for \Huge. For it, we scale up. + var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds. + + var delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions); + var sizeMultiplier = newOptions.sizeMultiplier; // default + // The standard sqrt SVGs each have a 0.04em thick viniculum. + // If Settings.minRuleThickness is larger than that, we add extraViniculum. + + var extraViniculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol. + + var span; + var spanHeight = 0; + var texHeight = 0; + var viewBoxHeight = 0; + var advanceWidth; // We create viewBoxes with 80 units of "padding" above each surd. + // Then browser rounding error on the parent span height will not + // encroach on the ink of the viniculum. But that padding is not + // included in the TeX-like `height` used for calculation of + // vertical alignment. So texHeight = span.height < span.style.height. + + if (delim.type === "small") { + // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. + // 1000 unit normal glyph height. + viewBoxHeight = 1000 + 1000 * extraViniculum + vbPad; + + if (height < 1.0) { + sizeMultiplier = 1.0; // mimic a \textfont radical + } else if (height < 1.4) { + sizeMultiplier = 0.7; // mimic a \scriptfont radical + } + + spanHeight = (1.0 + extraViniculum + emPad) / sizeMultiplier; + texHeight = (1.00 + extraViniculum) / sizeMultiplier; + span = sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, extraViniculum, options); + span.style.minWidth = "0.853em"; + advanceWidth = 0.833 / sizeMultiplier; // from the font. + } else if (delim.type === "large") { + // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. + viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size]; + texHeight = (sizeToMaxHeight[delim.size] + extraViniculum) / sizeMultiplier; + spanHeight = (sizeToMaxHeight[delim.size] + extraViniculum + emPad) / sizeMultiplier; + span = sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, extraViniculum, options); + span.style.minWidth = "1.02em"; + advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font. + } else { + // Tall sqrt. In TeX, this would be stacked using multiple glyphs. + // We'll use a single SVG to accomplish the same thing. + spanHeight = height + extraViniculum + emPad; + texHeight = height + extraViniculum; + viewBoxHeight = Math.floor(1000 * height + extraViniculum) + vbPad; + span = sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, extraViniculum, options); + span.style.minWidth = "0.742em"; + advanceWidth = 1.056; + } + + span.height = texHeight; + span.style.height = spanHeight + "em"; + return { + span: span, + advanceWidth: advanceWidth, + // Calculate the actual line width. + // This actually should depend on the chosen font -- e.g. \boldmath + // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and + // have thicker rules. + ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraViniculum) * sizeMultiplier + }; +}; // There are three kinds of delimiters, delimiters that stack when they become +// too large + + +var stackLargeDelimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "\\surd"]; // delimiters that always stack + +var stackAlwaysDelimiters = ["\\uparrow", "\\downarrow", "\\updownarrow", "\\Uparrow", "\\Downarrow", "\\Updownarrow", "|", "\\|", "\\vert", "\\Vert", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1"]; // and delimiters that never stack + +var stackNeverDelimiters = ["<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt"]; // Metrics of the different sizes. Found by looking at TeX's output of +// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ +// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. + +var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; +/** + * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4. + */ + +var makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) { + // < and > turn into \langle and \rangle in delimiters + if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { + delim = "\\langle"; + } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { + delim = "\\rangle"; + } // Sized delimiters are never centered. + + + if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) { + return makeLargeDelim(delim, size, false, options, mode, classes); + } else if (utils.contains(stackAlwaysDelimiters, delim)) { + return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes); + } else { + throw new src_ParseError("Illegal delimiter: '" + delim + "'"); + } +}; +/** + * There are three different sequences of delimiter sizes that the delimiters + * follow depending on the kind of delimiter. This is used when creating custom + * sized delimiters to decide whether to create a small, large, or stacked + * delimiter. + * + * In real TeX, these sequences aren't explicitly defined, but are instead + * defined inside the font metrics. Since there are only three sequences that + * are possible for the delimiters that TeX defines, it is easier to just encode + * them explicitly here. + */ + + +// Delimiters that never stack try small delimiters and large delimiters only +var stackNeverDelimiterSequence = [{ + type: "small", + style: src_Style.SCRIPTSCRIPT +}, { + type: "small", + style: src_Style.SCRIPT +}, { + type: "small", + style: src_Style.TEXT +}, { + type: "large", + size: 1 +}, { + type: "large", + size: 2 +}, { + type: "large", + size: 3 +}, { + type: "large", + size: 4 +}]; // Delimiters that always stack try the small delimiters first, then stack + +var stackAlwaysDelimiterSequence = [{ + type: "small", + style: src_Style.SCRIPTSCRIPT +}, { + type: "small", + style: src_Style.SCRIPT +}, { + type: "small", + style: src_Style.TEXT +}, { + type: "stack" +}]; // Delimiters that stack when large try the small and then large delimiters, and +// stack afterwards + +var stackLargeDelimiterSequence = [{ + type: "small", + style: src_Style.SCRIPTSCRIPT +}, { + type: "small", + style: src_Style.SCRIPT +}, { + type: "small", + style: src_Style.TEXT +}, { + type: "large", + size: 1 +}, { + type: "large", + size: 2 +}, { + type: "large", + size: 3 +}, { + type: "large", + size: 4 +}, { + type: "stack" +}]; +/** + * Get the font used in a delimiter based on what kind of delimiter it is. + * TODO(#963) Use more specific font family return type once that is introduced. + */ + +var delimTypeToFont = function delimTypeToFont(type) { + if (type.type === "small") { + return "Main-Regular"; + } else if (type.type === "large") { + return "Size" + type.size + "-Regular"; + } else if (type.type === "stack") { + return "Size4-Regular"; + } else { + throw new Error("Add support for delim type '" + type.type + "' here."); + } +}; +/** + * Traverse a sequence of types of delimiters to decide what kind of delimiter + * should be used to create a delimiter of the given height+depth. + */ + + +var traverseSequence = function traverseSequence(delim, height, sequence, options) { + // Here, we choose the index we should start at in the sequences. In smaller + // sizes (which correspond to larger numbers in style.size) we start earlier + // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts + // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2 + var start = Math.min(2, 3 - options.style.size); + + for (var i = start; i < sequence.length; i++) { + if (sequence[i].type === "stack") { + // This is always the last delimiter, so we just break the loop now. + break; + } + + var metrics = getMetrics(delim, delimTypeToFont(sequence[i]), "math"); + var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we + // account for the style change size. + + if (sequence[i].type === "small") { + var newOptions = options.havingBaseStyle(sequence[i].style); + heightDepth *= newOptions.sizeMultiplier; + } // Check if the delimiter at this size works for the given height. + + + if (heightDepth > height) { + return sequence[i]; + } + } // If we reached the end of the sequence, return the last sequence element. + + + return sequence[sequence.length - 1]; +}; +/** + * Make a delimiter of a given height+depth, with optional centering. Here, we + * traverse the sequences, and create a delimiter that the sequence tells us to. + */ + + +var makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) { + if (delim === "<" || delim === "\\lt" || delim === "\u27E8") { + delim = "\\langle"; + } else if (delim === ">" || delim === "\\gt" || delim === "\u27E9") { + delim = "\\rangle"; + } // Decide what sequence to use + + + var sequence; + + if (utils.contains(stackNeverDelimiters, delim)) { + sequence = stackNeverDelimiterSequence; + } else if (utils.contains(stackLargeDelimiters, delim)) { + sequence = stackLargeDelimiterSequence; + } else { + sequence = stackAlwaysDelimiterSequence; + } // Look through the sequence + + + var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs. + // Depending on the sequence element we decided on, call the + // appropriate function. + + if (delimType.type === "small") { + return makeSmallDelim(delim, delimType.style, center, options, mode, classes); + } else if (delimType.type === "large") { + return makeLargeDelim(delim, delimType.size, center, options, mode, classes); + } else + /* if (delimType.type === "stack") */ + { + return makeStackedDelim(delim, height, center, options, mode, classes); + } +}; +/** + * Make a delimiter for use with `\left` and `\right`, given a height and depth + * of an expression that the delimiters surround. + */ + + +var makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) { + // We always center \left/\right delimiters, so the axis is always shifted + var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right + + var delimiterFactor = 901; + var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm; + var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight); + var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are + // 65536 per pt, or 655360 per em. So, the division here truncates in + // TeX but doesn't here, producing different results. If we wanted to + // exactly match TeX's calculation, we could do + // Math.floor(655360 * maxDistFromAxis / 500) * + // delimiterFactor / 655360 + // (To see the difference, compare + // x^{x^{\left(\rule{0.1em}{0.68em}\right)}} + // in TeX and KaTeX) + maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total + // height + + return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes); +}; + +/* harmony default export */ var delimiter = ({ + sqrtImage: makeSqrtImage, + sizedDelim: makeSizedDelim, + sizeToMaxHeight: sizeToMaxHeight, + customSizedDelim: makeCustomSizedDelim, + leftRightDelim: makeLeftRightDelim +}); +;// CONCATENATED MODULE: ./src/functions/delimsizing.js + + + + + + + + + +// Extra data needed for the delimiter handler down below +var delimiterSizes = { + "\\bigl": { + mclass: "mopen", + size: 1 + }, + "\\Bigl": { + mclass: "mopen", + size: 2 + }, + "\\biggl": { + mclass: "mopen", + size: 3 + }, + "\\Biggl": { + mclass: "mopen", + size: 4 + }, + "\\bigr": { + mclass: "mclose", + size: 1 + }, + "\\Bigr": { + mclass: "mclose", + size: 2 + }, + "\\biggr": { + mclass: "mclose", + size: 3 + }, + "\\Biggr": { + mclass: "mclose", + size: 4 + }, + "\\bigm": { + mclass: "mrel", + size: 1 + }, + "\\Bigm": { + mclass: "mrel", + size: 2 + }, + "\\biggm": { + mclass: "mrel", + size: 3 + }, + "\\Biggm": { + mclass: "mrel", + size: 4 + }, + "\\big": { + mclass: "mord", + size: 1 + }, + "\\Big": { + mclass: "mord", + size: 2 + }, + "\\bigg": { + mclass: "mord", + size: 3 + }, + "\\Bigg": { + mclass: "mord", + size: 4 + } +}; +var delimiters = ["(", "\\lparen", ")", "\\rparen", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\u230A", "\u230B", "\\lceil", "\\rceil", "\u2308", "\u2309", "<", ">", "\\langle", "\u27E8", "\\rangle", "\u27E9", "\\lt", "\\gt", "\\lvert", "\\rvert", "\\lVert", "\\rVert", "\\lgroup", "\\rgroup", "\u27EE", "\u27EF", "\\lmoustache", "\\rmoustache", "\u23B0", "\u23B1", "/", "\\backslash", "|", "\\vert", "\\|", "\\Vert", "\\uparrow", "\\Uparrow", "\\downarrow", "\\Downarrow", "\\updownarrow", "\\Updownarrow", "."]; + +// Delimiter functions +function checkDelimiter(delim, context) { + var symDelim = checkSymbolNodeType(delim); + + if (symDelim && utils.contains(delimiters, symDelim.text)) { + return symDelim; + } else if (symDelim) { + throw new src_ParseError("Invalid delimiter '" + symDelim.text + "' after '" + context.funcName + "'", delim); + } else { + throw new src_ParseError("Invalid delimiter type '" + delim.type + "'", delim); + } +} + +defineFunction({ + type: "delimsizing", + names: ["\\bigl", "\\Bigl", "\\biggl", "\\Biggl", "\\bigr", "\\Bigr", "\\biggr", "\\Biggr", "\\bigm", "\\Bigm", "\\biggm", "\\Biggm", "\\big", "\\Big", "\\bigg", "\\Bigg"], + props: { + numArgs: 1, + argTypes: ["primitive"] + }, + handler: function handler(context, args) { + var delim = checkDelimiter(args[0], context); + return { + type: "delimsizing", + mode: context.parser.mode, + size: delimiterSizes[context.funcName].size, + mclass: delimiterSizes[context.funcName].mclass, + delim: delim.text + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + if (group.delim === ".") { + // Empty delimiters still count as elements, even though they don't + // show anything. + return buildCommon.makeSpan([group.mclass]); + } // Use delimiter.sizedDelim to generate the delimiter. + + + return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]); + }, + mathmlBuilder: function mathmlBuilder(group) { + var children = []; + + if (group.delim !== ".") { + children.push(makeText(group.delim, group.mode)); + } + + var node = new mathMLTree.MathNode("mo", children); + + if (group.mclass === "mopen" || group.mclass === "mclose") { + // Only some of the delimsizing functions act as fences, and they + // return "mopen" or "mclose" mclass. + node.setAttribute("fence", "true"); + } else { + // Explicitly disable fencing if it's not a fence, to override the + // defaults. + node.setAttribute("fence", "false"); + } + + node.setAttribute("stretchy", "true"); + node.setAttribute("minsize", delimiter.sizeToMaxHeight[group.size] + "em"); + node.setAttribute("maxsize", delimiter.sizeToMaxHeight[group.size] + "em"); + return node; + } +}); + +function assertParsed(group) { + if (!group.body) { + throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); + } +} + +defineFunction({ + type: "leftright-right", + names: ["\\right"], + props: { + numArgs: 1, + primitive: true + }, + handler: function handler(context, args) { + // \left case below triggers parsing of \right in + // `const right = parser.parseFunction();` + // uses this return value. + var color = context.parser.gullet.macros.get("\\current@color"); + + if (color && typeof color !== "string") { + throw new src_ParseError("\\current@color set to non-string in \\right"); + } + + return { + type: "leftright-right", + mode: context.parser.mode, + delim: checkDelimiter(args[0], context).text, + color: color // undefined if not set via \color + + }; + } +}); +defineFunction({ + type: "leftright", + names: ["\\left"], + props: { + numArgs: 1, + primitive: true + }, + handler: function handler(context, args) { + var delim = checkDelimiter(args[0], context); + var parser = context.parser; // Parse out the implicit body + + ++parser.leftrightDepth; // parseExpression stops before '\\right' + + var body = parser.parseExpression(false); + --parser.leftrightDepth; // Check the next token + + parser.expect("\\right", false); + var right = assertNodeType(parser.parseFunction(), "leftright-right"); + return { + type: "leftright", + mode: parser.mode, + body: body, + left: delim.text, + right: right.delim, + rightColor: right.color + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + assertParsed(group); // Build the inner expression + + var inner = buildExpression(group.body, options, true, ["mopen", "mclose"]); + var innerHeight = 0; + var innerDepth = 0; + var hadMiddle = false; // Calculate its height and depth + + for (var i = 0; i < inner.length; i++) { + // Property `isMiddle` not defined on `span`. See comment in + // "middle"'s htmlBuilder. + // $FlowFixMe + if (inner[i].isMiddle) { + hadMiddle = true; + } else { + innerHeight = Math.max(inner[i].height, innerHeight); + innerDepth = Math.max(inner[i].depth, innerDepth); + } + } // The size of delimiters is the same, regardless of what style we are + // in. Thus, to correctly calculate the size of delimiter we need around + // a group, we scale down the inner size based on the size. + + + innerHeight *= options.sizeMultiplier; + innerDepth *= options.sizeMultiplier; + var leftDelim; + + if (group.left === ".") { + // Empty delimiters in \left and \right make null delimiter spaces. + leftDelim = makeNullDelimiter(options, ["mopen"]); + } else { + // Otherwise, use leftRightDelim to generate the correct sized + // delimiter. + leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, ["mopen"]); + } // Add it to the beginning of the expression + + + inner.unshift(leftDelim); // Handle middle delimiters + + if (hadMiddle) { + for (var _i = 1; _i < inner.length; _i++) { + var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in + // "middle"'s htmlBuilder. + // $FlowFixMe + + var isMiddle = middleDelim.isMiddle; + + if (isMiddle) { + // Apply the options that were active when \middle was called + inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []); + } + } + } + + var rightDelim; // Same for the right delimiter, but using color specified by \color + + if (group.right === ".") { + rightDelim = makeNullDelimiter(options, ["mclose"]); + } else { + var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options; + rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, ["mclose"]); + } // Add it to the end of the expression. + + + inner.push(rightDelim); + return buildCommon.makeSpan(["minner"], inner, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + assertParsed(group); + var inner = buildMathML_buildExpression(group.body, options); + + if (group.left !== ".") { + var leftNode = new mathMLTree.MathNode("mo", [makeText(group.left, group.mode)]); + leftNode.setAttribute("fence", "true"); + inner.unshift(leftNode); + } + + if (group.right !== ".") { + var rightNode = new mathMLTree.MathNode("mo", [makeText(group.right, group.mode)]); + rightNode.setAttribute("fence", "true"); + + if (group.rightColor) { + rightNode.setAttribute("mathcolor", group.rightColor); + } + + inner.push(rightNode); + } + + return makeRow(inner); + } +}); +defineFunction({ + type: "middle", + names: ["\\middle"], + props: { + numArgs: 1, + primitive: true + }, + handler: function handler(context, args) { + var delim = checkDelimiter(args[0], context); + + if (!context.parser.leftrightDepth) { + throw new src_ParseError("\\middle without preceding \\left", delim); + } + + return { + type: "middle", + mode: context.parser.mode, + delim: delim.text + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var middleDelim; + + if (group.delim === ".") { + middleDelim = makeNullDelimiter(options, []); + } else { + middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []); + var isMiddle = { + delim: group.delim, + options: options + }; // Property `isMiddle` not defined on `span`. It is only used in + // this file above. + // TODO: Fix this violation of the `span` type and possibly rename + // things since `isMiddle` sounds like a boolean, but is a struct. + // $FlowFixMe + + middleDelim.isMiddle = isMiddle; + } + + return middleDelim; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // A Firefox \middle will strech a character vertically only if it + // is in the fence part of the operator dictionary at: + // https://www.w3.org/TR/MathML3/appendixc.html. + // So we need to avoid U+2223 and use plain "|" instead. + var textNode = group.delim === "\\vert" || group.delim === "|" ? makeText("|", "text") : makeText(group.delim, group.mode); + var middleNode = new mathMLTree.MathNode("mo", [textNode]); + middleNode.setAttribute("fence", "true"); // MathML gives 5/18em spacing to each element. + // \middle should get delimiter spacing instead. + + middleNode.setAttribute("lspace", "0.05em"); + middleNode.setAttribute("rspace", "0.05em"); + return middleNode; + } +}); +;// CONCATENATED MODULE: ./src/functions/enclose.js + + + + + + + + + + + + +var enclose_htmlBuilder = function htmlBuilder(group, options) { + // \cancel, \bcancel, \xcancel, \sout, \fbox, \colorbox, \fcolorbox, \phase + // Some groups can return document fragments. Handle those by wrapping + // them in a span. + var inner = buildCommon.wrapFragment(buildGroup(group.body, options), options); + var label = group.label.substr(1); + var scale = options.sizeMultiplier; + var img; + var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different + // depending on whether the subject is wider than it is tall, or vice versa. + // We don't know the width of a group, so as a proxy, we test if + // the subject is a single character. This captures most of the + // subjects that should get the "tall" treatment. + + var isSingleChar = utils.isCharacterBox(group.body); + + if (label === "sout") { + img = buildCommon.makeSpan(["stretchy", "sout"]); + img.height = options.fontMetrics().defaultRuleThickness / scale; + imgShift = -0.5 * options.fontMetrics().xHeight; + } else if (label === "phase") { + // Set a couple of dimensions from the steinmetz package. + var lineWeight = calculateSize({ + number: 0.6, + unit: "pt" + }, options); + var clearance = calculateSize({ + number: 0.35, + unit: "ex" + }, options); // Prevent size changes like \Huge from affecting line thickness + + var newOptions = options.havingBaseSizing(); + scale = scale / newOptions.sizeMultiplier; + var angleHeight = inner.height + inner.depth + lineWeight + clearance; // Reserve a left pad for the angle. + + inner.style.paddingLeft = angleHeight / 2 + lineWeight + "em"; // Create an SVG + + var viewBoxHeight = Math.floor(1000 * angleHeight * scale); + var path = phasePath(viewBoxHeight); + var svgNode = new SvgNode([new PathNode("phase", path)], { + "width": "400em", + "height": viewBoxHeight / 1000 + "em", + "viewBox": "0 0 400000 " + viewBoxHeight, + "preserveAspectRatio": "xMinYMin slice" + }); // Wrap it in a span with overflow: hidden. + + img = buildCommon.makeSvgSpan(["hide-tail"], [svgNode], options); + img.style.height = angleHeight + "em"; + imgShift = inner.depth + lineWeight + clearance; + } else { + // Add horizontal padding + if (/cancel/.test(label)) { + if (!isSingleChar) { + inner.classes.push("cancel-pad"); + } + } else if (label === "angl") { + inner.classes.push("anglpad"); + } else { + inner.classes.push("boxpad"); + } // Add vertical padding + + + var topPad = 0; + var bottomPad = 0; + var ruleThickness = 0; // ref: cancel package: \advance\totalheight2\p@ % "+2" + + if (/box/.test(label)) { + ruleThickness = Math.max(options.fontMetrics().fboxrule, // default + options.minRuleThickness // User override. + ); + topPad = options.fontMetrics().fboxsep + (label === "colorbox" ? 0 : ruleThickness); + bottomPad = topPad; + } else if (label === "angl") { + ruleThickness = Math.max(options.fontMetrics().defaultRuleThickness, options.minRuleThickness); + topPad = 4 * ruleThickness; // gap = 3 × line, plus the line itself. + + bottomPad = Math.max(0, 0.25 - inner.depth); + } else { + topPad = isSingleChar ? 0.2 : 0; + bottomPad = topPad; + } + + img = stretchy.encloseSpan(inner, label, topPad, bottomPad, options); + + if (/fbox|boxed|fcolorbox/.test(label)) { + img.style.borderStyle = "solid"; + img.style.borderWidth = ruleThickness + "em"; + } else if (label === "angl" && ruleThickness !== 0.049) { + img.style.borderTopWidth = ruleThickness + "em"; + img.style.borderRightWidth = ruleThickness + "em"; + } + + imgShift = inner.depth + bottomPad; + + if (group.backgroundColor) { + img.style.backgroundColor = group.backgroundColor; + + if (group.borderColor) { + img.style.borderColor = group.borderColor; + } + } + } + + var vlist; + + if (group.backgroundColor) { + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [// Put the color background behind inner; + { + type: "elem", + elem: img, + shift: imgShift + }, { + type: "elem", + elem: inner, + shift: 0 + }] + }, options); + } else { + var classes = /cancel|phase/.test(label) ? ["svg-align"] : []; + vlist = buildCommon.makeVList({ + positionType: "individualShift", + children: [// Write the \cancel stroke on top of inner. + { + type: "elem", + elem: inner, + shift: 0 + }, { + type: "elem", + elem: img, + shift: imgShift, + wrapperClasses: classes + }] + }, options); + } + + if (/cancel/.test(label)) { + // The cancel package documentation says that cancel lines add their height + // to the expression, but tests show that isn't how it actually works. + vlist.height = inner.height; + vlist.depth = inner.depth; + } + + if (/cancel/.test(label) && !isSingleChar) { + // cancel does not create horiz space for its line extension. + return buildCommon.makeSpan(["mord", "cancel-lap"], [vlist], options); + } else { + return buildCommon.makeSpan(["mord"], [vlist], options); + } +}; + +var enclose_mathmlBuilder = function mathmlBuilder(group, options) { + var fboxsep = 0; + var node = new mathMLTree.MathNode(group.label.indexOf("colorbox") > -1 ? "mpadded" : "menclose", [buildMathML_buildGroup(group.body, options)]); + + switch (group.label) { + case "\\cancel": + node.setAttribute("notation", "updiagonalstrike"); + break; + + case "\\bcancel": + node.setAttribute("notation", "downdiagonalstrike"); + break; + + case "\\phase": + node.setAttribute("notation", "phasorangle"); + break; + + case "\\sout": + node.setAttribute("notation", "horizontalstrike"); + break; + + case "\\fbox": + node.setAttribute("notation", "box"); + break; + + case "\\angl": + node.setAttribute("notation", "actuarial"); + break; + + case "\\fcolorbox": + case "\\colorbox": + // doesn't have a good notation option. So use + // instead. Set some attributes that come included with . + fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm; + node.setAttribute("width", "+" + 2 * fboxsep + "pt"); + node.setAttribute("height", "+" + 2 * fboxsep + "pt"); + node.setAttribute("lspace", fboxsep + "pt"); // + + node.setAttribute("voffset", fboxsep + "pt"); + + if (group.label === "\\fcolorbox") { + var thk = Math.max(options.fontMetrics().fboxrule, // default + options.minRuleThickness // user override + ); + node.setAttribute("style", "border: " + thk + "em solid " + String(group.borderColor)); + } + + break; + + case "\\xcancel": + node.setAttribute("notation", "updiagonalstrike downdiagonalstrike"); + break; + } + + if (group.backgroundColor) { + node.setAttribute("mathbackground", group.backgroundColor); + } + + return node; +}; + +defineFunction({ + type: "enclose", + names: ["\\colorbox"], + props: { + numArgs: 2, + allowedInText: true, + argTypes: ["color", "text"] + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser, + funcName = _ref.funcName; + var color = assertNodeType(args[0], "color-token").color; + var body = args[1]; + return { + type: "enclose", + mode: parser.mode, + label: funcName, + backgroundColor: color, + body: body + }; + }, + htmlBuilder: enclose_htmlBuilder, + mathmlBuilder: enclose_mathmlBuilder +}); +defineFunction({ + type: "enclose", + names: ["\\fcolorbox"], + props: { + numArgs: 3, + allowedInText: true, + argTypes: ["color", "color", "text"] + }, + handler: function handler(_ref2, args, optArgs) { + var parser = _ref2.parser, + funcName = _ref2.funcName; + var borderColor = assertNodeType(args[0], "color-token").color; + var backgroundColor = assertNodeType(args[1], "color-token").color; + var body = args[2]; + return { + type: "enclose", + mode: parser.mode, + label: funcName, + backgroundColor: backgroundColor, + borderColor: borderColor, + body: body + }; + }, + htmlBuilder: enclose_htmlBuilder, + mathmlBuilder: enclose_mathmlBuilder +}); +defineFunction({ + type: "enclose", + names: ["\\fbox"], + props: { + numArgs: 1, + argTypes: ["hbox"], + allowedInText: true + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser; + return { + type: "enclose", + mode: parser.mode, + label: "\\fbox", + body: args[0] + }; + } +}); +defineFunction({ + type: "enclose", + names: ["\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\phase"], + props: { + numArgs: 1 + }, + handler: function handler(_ref4, args) { + var parser = _ref4.parser, + funcName = _ref4.funcName; + var body = args[0]; + return { + type: "enclose", + mode: parser.mode, + label: funcName, + body: body + }; + }, + htmlBuilder: enclose_htmlBuilder, + mathmlBuilder: enclose_mathmlBuilder +}); +defineFunction({ + type: "enclose", + names: ["\\angl"], + props: { + numArgs: 1, + argTypes: ["hbox"], + allowedInText: false + }, + handler: function handler(_ref5, args) { + var parser = _ref5.parser; + return { + type: "enclose", + mode: parser.mode, + label: "\\angl", + body: args[0] + }; + } +}); +;// CONCATENATED MODULE: ./src/defineEnvironment.js + + +/** + * All registered environments. + * `environments.js` exports this same dictionary again and makes it public. + * `Parser.js` requires this dictionary via `environments.js`. + */ +var _environments = {}; +function defineEnvironment(_ref) { + var type = _ref.type, + names = _ref.names, + props = _ref.props, + handler = _ref.handler, + htmlBuilder = _ref.htmlBuilder, + mathmlBuilder = _ref.mathmlBuilder; + // Set default values of environments. + var data = { + type: type, + numArgs: props.numArgs || 0, + allowedInText: false, + numOptionalArgs: 0, + handler: handler + }; + + for (var i = 0; i < names.length; ++i) { + // TODO: The value type of _environments should be a type union of all + // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is + // an existential type. + _environments[names[i]] = data; + } + + if (htmlBuilder) { + _htmlGroupBuilders[type] = htmlBuilder; + } + + if (mathmlBuilder) { + _mathmlGroupBuilders[type] = mathmlBuilder; + } +} +;// CONCATENATED MODULE: ./src/environments/array.js + + + + + + + + + + + + + + +// Helper functions +function getHLines(parser) { + // Return an array. The array length = number of hlines. + // Each element in the array tells if the line is dashed. + var hlineInfo = []; + parser.consumeSpaces(); + var nxt = parser.fetch().text; + + while (nxt === "\\hline" || nxt === "\\hdashline") { + parser.consume(); + hlineInfo.push(nxt === "\\hdashline"); + parser.consumeSpaces(); + nxt = parser.fetch().text; + } + + return hlineInfo; +} + +var validateAmsEnvironmentContext = function validateAmsEnvironmentContext(context) { + var settings = context.parser.settings; + + if (!settings.displayMode) { + throw new src_ParseError("{" + context.envName + "} can be used only in" + " display mode."); + } +}; +/** + * Parse the body of the environment, with rows delimited by \\ and + * columns delimited by &, and create a nested list in row-major order + * with one group per cell. If given an optional argument style + * ("text", "display", etc.), then each cell is cast into that style. + */ + + +function parseArray(parser, _ref, style) { + var hskipBeforeAndAfter = _ref.hskipBeforeAndAfter, + addJot = _ref.addJot, + cols = _ref.cols, + arraystretch = _ref.arraystretch, + colSeparationType = _ref.colSeparationType, + addEqnNum = _ref.addEqnNum, + singleRow = _ref.singleRow, + maxNumCols = _ref.maxNumCols, + leqno = _ref.leqno; + parser.gullet.beginGroup(); + + if (!singleRow) { + // \cr is equivalent to \\ without the optional size argument (see below) + // TODO: provide helpful error when \cr is used outside array environment + parser.gullet.macros.set("\\cr", "\\\\\\relax"); + } // Get current arraystretch if it's not set by the environment + + + if (!arraystretch) { + var stretch = parser.gullet.expandMacroAsText("\\arraystretch"); + + if (stretch == null) { + // Default \arraystretch from lttab.dtx + arraystretch = 1; + } else { + arraystretch = parseFloat(stretch); + + if (!arraystretch || arraystretch < 0) { + throw new src_ParseError("Invalid \\arraystretch: " + stretch); + } + } + } // Start group for first cell + + + parser.gullet.beginGroup(); + var row = []; + var body = [row]; + var rowGaps = []; + var hLinesBeforeRow = []; // Test for \hline at the top of the array. + + hLinesBeforeRow.push(getHLines(parser)); + + while (true) { + // eslint-disable-line no-constant-condition + // Parse each cell in its own group (namespace) + var cell = parser.parseExpression(false, singleRow ? "\\end" : "\\\\"); + parser.gullet.endGroup(); + parser.gullet.beginGroup(); + cell = { + type: "ordgroup", + mode: parser.mode, + body: cell + }; + + if (style) { + cell = { + type: "styling", + mode: parser.mode, + style: style, + body: [cell] + }; + } + + row.push(cell); + var next = parser.fetch().text; + + if (next === "&") { + if (maxNumCols && row.length === maxNumCols) { + if (singleRow || colSeparationType) { + // {equation} or {split} + throw new src_ParseError("Too many tab characters: &", parser.nextToken); + } else { + // {array} environment + parser.settings.reportNonstrict("textEnv", "Too few columns " + "specified in the {array} column argument."); + } + } + + parser.consume(); + } else if (next === "\\end") { + // Arrays terminate newlines with `\crcr` which consumes a `\cr` if + // the last line is empty. + // NOTE: Currently, `cell` is the last item added into `row`. + if (row.length === 1 && cell.type === "styling" && cell.body[0].body.length === 0) { + body.pop(); + } + + if (hLinesBeforeRow.length < body.length + 1) { + hLinesBeforeRow.push([]); + } + + break; + } else if (next === "\\\\") { + parser.consume(); + var size = void 0; // \def\Let@{\let\\\math@cr} + // \def\math@cr{...\math@cr@} + // \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} + // \def\math@cr@@[#1]{...\math@cr@@@...} + // \def\math@cr@@@{\cr} + + if (parser.gullet.future().text !== " ") { + size = parser.parseSizeGroup(true); + } + + rowGaps.push(size ? size.value : null); // check for \hline(s) following the row separator + + hLinesBeforeRow.push(getHLines(parser)); + row = []; + body.push(row); + } else { + throw new src_ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); + } + } // End cell group + + + parser.gullet.endGroup(); // End array group defining \cr + + parser.gullet.endGroup(); + return { + type: "array", + mode: parser.mode, + addJot: addJot, + arraystretch: arraystretch, + body: body, + cols: cols, + rowGaps: rowGaps, + hskipBeforeAndAfter: hskipBeforeAndAfter, + hLinesBeforeRow: hLinesBeforeRow, + colSeparationType: colSeparationType, + addEqnNum: addEqnNum, + leqno: leqno + }; +} // Decides on a style for cells in an array according to whether the given +// environment name starts with the letter 'd'. + + +function dCellStyle(envName) { + if (envName.substr(0, 1) === "d") { + return "display"; + } else { + return "text"; + } +} + +var array_htmlBuilder = function htmlBuilder(group, options) { + var r; + var c; + var nr = group.body.length; + var hLinesBeforeRow = group.hLinesBeforeRow; + var nc = 0; + var body = new Array(nr); + var hlines = []; + var ruleThickness = Math.max( // From LaTeX \showthe\arrayrulewidth. Equals 0.04 em. + options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override. + ); // Horizontal spacing + + var pt = 1 / options.fontMetrics().ptPerEm; + var arraycolsep = 5 * pt; // default value, i.e. \arraycolsep in article.cls + + if (group.colSeparationType && group.colSeparationType === "small") { + // We're in a {smallmatrix}. Default column space is \thickspace, + // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}. + // But that needs adjustment because LaTeX applies \scriptstyle to the + // entire array, including the colspace, but this function applies + // \scriptstyle only inside each element. + var localMultiplier = options.havingStyle(src_Style.SCRIPT).sizeMultiplier; + arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier); + } // Vertical spacing + + + var baselineskip = group.colSeparationType === "CD" ? calculateSize({ + number: 3, + unit: "ex" + }, options) : 12 * pt; // see size10.clo + // Default \jot from ltmath.dtx + // TODO(edemaine): allow overriding \jot via \setlength (#687) + + var jot = 3 * pt; + var arrayskip = group.arraystretch * baselineskip; + var arstrutHeight = 0.7 * arrayskip; // \strutbox in ltfsstrc.dtx and + + var arstrutDepth = 0.3 * arrayskip; // \@arstrutbox in lttab.dtx + + var totalHeight = 0; // Set a position for \hline(s) at the top of the array, if any. + + function setHLinePos(hlinesInGap) { + for (var i = 0; i < hlinesInGap.length; ++i) { + if (i > 0) { + totalHeight += 0.25; + } + + hlines.push({ + pos: totalHeight, + isDashed: hlinesInGap[i] + }); + } + } + + setHLinePos(hLinesBeforeRow[0]); + + for (r = 0; r < group.body.length; ++r) { + var inrow = group.body[r]; + var height = arstrutHeight; // \@array adds an \@arstrut + + var depth = arstrutDepth; // to each tow (via the template) + + if (nc < inrow.length) { + nc = inrow.length; + } + + var outrow = new Array(inrow.length); + + for (c = 0; c < inrow.length; ++c) { + var elt = buildGroup(inrow[c], options); + + if (depth < elt.depth) { + depth = elt.depth; + } + + if (height < elt.height) { + height = elt.height; + } + + outrow[c] = elt; + } + + var rowGap = group.rowGaps[r]; + var gap = 0; + + if (rowGap) { + gap = calculateSize(rowGap, options); + + if (gap > 0) { + // \@argarraycr + gap += arstrutDepth; + + if (depth < gap) { + depth = gap; // \@xargarraycr + } + + gap = 0; + } + } // In AMS multiline environments such as aligned and gathered, rows + // correspond to lines that have additional \jot added to the + // \baselineskip via \openup. + + + if (group.addJot) { + depth += jot; + } + + outrow.height = height; + outrow.depth = depth; + totalHeight += height; + outrow.pos = totalHeight; + totalHeight += depth + gap; // \@yargarraycr + + body[r] = outrow; // Set a position for \hline(s), if any. + + setHLinePos(hLinesBeforeRow[r + 1]); + } + + var offset = totalHeight / 2 + options.fontMetrics().axisHeight; + var colDescriptions = group.cols || []; + var cols = []; + var colSep; + var colDescrNum; + var eqnNumSpans = []; + + if (group.addEqnNum) { + // An environment with automatic equation numbers. + // Create node(s) that will trigger CSS counter increment. + for (r = 0; r < nr; ++r) { + var rw = body[r]; + var shift = rw.pos - offset; + var eqnTag = buildCommon.makeSpan(["eqn-num"], [], options); + eqnTag.depth = rw.depth; + eqnTag.height = rw.height; + eqnNumSpans.push({ + type: "elem", + elem: eqnTag, + shift: shift + }); + } + } + + for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column + // descriptions, so trailing separators don't get lost. + c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) { + var colDescr = colDescriptions[colDescrNum] || {}; + var firstSeparator = true; + + while (colDescr.type === "separator") { + // If there is more than one separator in a row, add a space + // between them. + if (!firstSeparator) { + colSep = buildCommon.makeSpan(["arraycolsep"], []); + colSep.style.width = options.fontMetrics().doubleRuleSep + "em"; + cols.push(colSep); + } + + if (colDescr.separator === "|" || colDescr.separator === ":") { + var lineType = colDescr.separator === "|" ? "solid" : "dashed"; + var separator = buildCommon.makeSpan(["vertical-separator"], [], options); + separator.style.height = totalHeight + "em"; + separator.style.borderRightWidth = ruleThickness + "em"; + separator.style.borderRightStyle = lineType; + separator.style.margin = "0 -" + ruleThickness / 2 + "em"; + separator.style.verticalAlign = -(totalHeight - offset) + "em"; + cols.push(separator); + } else { + throw new src_ParseError("Invalid separator type: " + colDescr.separator); + } + + colDescrNum++; + colDescr = colDescriptions[colDescrNum] || {}; + firstSeparator = false; + } + + if (c >= nc) { + continue; + } + + var sepwidth = void 0; + + if (c > 0 || group.hskipBeforeAndAfter) { + sepwidth = utils.deflt(colDescr.pregap, arraycolsep); + + if (sepwidth !== 0) { + colSep = buildCommon.makeSpan(["arraycolsep"], []); + colSep.style.width = sepwidth + "em"; + cols.push(colSep); + } + } + + var col = []; + + for (r = 0; r < nr; ++r) { + var row = body[r]; + var elem = row[c]; + + if (!elem) { + continue; + } + + var _shift = row.pos - offset; + + elem.depth = row.depth; + elem.height = row.height; + col.push({ + type: "elem", + elem: elem, + shift: _shift + }); + } + + col = buildCommon.makeVList({ + positionType: "individualShift", + children: col + }, options); + col = buildCommon.makeSpan(["col-align-" + (colDescr.align || "c")], [col]); + cols.push(col); + + if (c < nc - 1 || group.hskipBeforeAndAfter) { + sepwidth = utils.deflt(colDescr.postgap, arraycolsep); + + if (sepwidth !== 0) { + colSep = buildCommon.makeSpan(["arraycolsep"], []); + colSep.style.width = sepwidth + "em"; + cols.push(colSep); + } + } + } + + body = buildCommon.makeSpan(["mtable"], cols); // Add \hline(s), if any. + + if (hlines.length > 0) { + var line = buildCommon.makeLineSpan("hline", options, ruleThickness); + var dashes = buildCommon.makeLineSpan("hdashline", options, ruleThickness); + var vListElems = [{ + type: "elem", + elem: body, + shift: 0 + }]; + + while (hlines.length > 0) { + var hline = hlines.pop(); + var lineShift = hline.pos - offset; + + if (hline.isDashed) { + vListElems.push({ + type: "elem", + elem: dashes, + shift: lineShift + }); + } else { + vListElems.push({ + type: "elem", + elem: line, + shift: lineShift + }); + } + } + + body = buildCommon.makeVList({ + positionType: "individualShift", + children: vListElems + }, options); + } + + if (!group.addEqnNum) { + return buildCommon.makeSpan(["mord"], [body], options); + } else { + var eqnNumCol = buildCommon.makeVList({ + positionType: "individualShift", + children: eqnNumSpans + }, options); + eqnNumCol = buildCommon.makeSpan(["tag"], [eqnNumCol], options); + return buildCommon.makeFragment([body, eqnNumCol]); + } +}; + +var alignMap = { + c: "center ", + l: "left ", + r: "right " +}; + +var array_mathmlBuilder = function mathmlBuilder(group, options) { + var tbl = []; + var glue = new mathMLTree.MathNode("mtd", [], ["mtr-glue"]); + var tag = new mathMLTree.MathNode("mtd", [], ["mml-eqn-num"]); + + for (var i = 0; i < group.body.length; i++) { + var rw = group.body[i]; + var row = []; + + for (var j = 0; j < rw.length; j++) { + row.push(new mathMLTree.MathNode("mtd", [buildMathML_buildGroup(rw[j], options)])); + } + + if (group.addEqnNum) { + row.unshift(glue); + row.push(glue); + + if (group.leqno) { + row.unshift(tag); + } else { + row.push(tag); + } + } + + tbl.push(new mathMLTree.MathNode("mtr", row)); + } + + var table = new mathMLTree.MathNode("mtable", tbl); // Set column alignment, row spacing, column spacing, and + // array lines by setting attributes on the table element. + // Set the row spacing. In MathML, we specify a gap distance. + // We do not use rowGap[] because MathML automatically increases + // cell height with the height/depth of the element content. + // LaTeX \arraystretch multiplies the row baseline-to-baseline distance. + // We simulate this by adding (arraystretch - 1)em to the gap. This + // does a reasonable job of adjusting arrays containing 1 em tall content. + // The 0.16 and 0.09 values are found emprically. They produce an array + // similar to LaTeX and in which content does not interfere with \hines. + + var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray} + : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0); + table.setAttribute("rowspacing", gap.toFixed(4) + "em"); // MathML table lines go only between cells. + // To place a line on an edge we'll use , if necessary. + + var menclose = ""; + var align = ""; + + if (group.cols && group.cols.length > 0) { + // Find column alignment, column spacing, and vertical lines. + var cols = group.cols; + var columnLines = ""; + var prevTypeWasAlign = false; + var iStart = 0; + var iEnd = cols.length; + + if (cols[0].type === "separator") { + menclose += "top "; + iStart = 1; + } + + if (cols[cols.length - 1].type === "separator") { + menclose += "bottom "; + iEnd -= 1; + } + + for (var _i = iStart; _i < iEnd; _i++) { + if (cols[_i].type === "align") { + align += alignMap[cols[_i].align]; + + if (prevTypeWasAlign) { + columnLines += "none "; + } + + prevTypeWasAlign = true; + } else if (cols[_i].type === "separator") { + // MathML accepts only single lines between cells. + // So we read only the first of consecutive separators. + if (prevTypeWasAlign) { + columnLines += cols[_i].separator === "|" ? "solid " : "dashed "; + prevTypeWasAlign = false; + } + } + } + + table.setAttribute("columnalign", align.trim()); + + if (/[sd]/.test(columnLines)) { + table.setAttribute("columnlines", columnLines.trim()); + } + } // Set column spacing. + + + if (group.colSeparationType === "align") { + var _cols = group.cols || []; + + var spacing = ""; + + for (var _i2 = 1; _i2 < _cols.length; _i2++) { + spacing += _i2 % 2 ? "0em " : "1em "; + } + + table.setAttribute("columnspacing", spacing.trim()); + } else if (group.colSeparationType === "alignat" || group.colSeparationType === "gather") { + table.setAttribute("columnspacing", "0em"); + } else if (group.colSeparationType === "small") { + table.setAttribute("columnspacing", "0.2778em"); + } else if (group.colSeparationType === "CD") { + table.setAttribute("columnspacing", "0.5em"); + } else { + table.setAttribute("columnspacing", "1em"); + } // Address \hline and \hdashline + + + var rowLines = ""; + var hlines = group.hLinesBeforeRow; + menclose += hlines[0].length > 0 ? "left " : ""; + menclose += hlines[hlines.length - 1].length > 0 ? "right " : ""; + + for (var _i3 = 1; _i3 < hlines.length - 1; _i3++) { + rowLines += hlines[_i3].length === 0 ? "none " // MathML accepts only a single line between rows. Read one element. + : hlines[_i3][0] ? "dashed " : "solid "; + } + + if (/[sd]/.test(rowLines)) { + table.setAttribute("rowlines", rowLines.trim()); + } + + if (menclose !== "") { + table = new mathMLTree.MathNode("menclose", [table]); + table.setAttribute("notation", menclose.trim()); + } + + if (group.arraystretch && group.arraystretch < 1) { + // A small array. Wrap in scriptstyle so row gap is not too large. + table = new mathMLTree.MathNode("mstyle", [table]); + table.setAttribute("scriptlevel", "1"); + } + + return table; +}; // Convenience function for align, align*, aligned, alignat, alignat*, alignedat. + + +var alignedHandler = function alignedHandler(context, args) { + if (context.envName.indexOf("ed") === -1) { + validateAmsEnvironmentContext(context); + } + + var cols = []; + var separationType = context.envName.indexOf("at") > -1 ? "alignat" : "align"; + var res = parseArray(context.parser, { + cols: cols, + addJot: true, + addEqnNum: context.envName === "align" || context.envName === "alignat", + colSeparationType: separationType, + maxNumCols: context.envName === "split" ? 2 : undefined, + leqno: context.parser.settings.leqno + }, "display"); // Determining number of columns. + // 1. If the first argument is given, we use it as a number of columns, + // and makes sure that each row doesn't exceed that number. + // 2. Otherwise, just count number of columns = maximum number + // of cells in each row ("aligned" mode -- isAligned will be true). + // + // At the same time, prepend empty group {} at beginning of every second + // cell in each row (starting with second cell) so that operators become + // binary. This behavior is implemented in amsmath's \start@aligned. + + var numMaths; + var numCols = 0; + var emptyGroup = { + type: "ordgroup", + mode: context.mode, + body: [] + }; + + if (args[0] && args[0].type === "ordgroup") { + var arg0 = ""; + + for (var i = 0; i < args[0].body.length; i++) { + var textord = assertNodeType(args[0].body[i], "textord"); + arg0 += textord.text; + } + + numMaths = Number(arg0); + numCols = numMaths * 2; + } + + var isAligned = !numCols; + res.body.forEach(function (row) { + for (var _i4 = 1; _i4 < row.length; _i4 += 2) { + // Modify ordgroup node within styling node + var styling = assertNodeType(row[_i4], "styling"); + var ordgroup = assertNodeType(styling.body[0], "ordgroup"); + ordgroup.body.unshift(emptyGroup); + } + + if (!isAligned) { + // Case 1 + var curMaths = row.length / 2; + + if (numMaths < curMaths) { + throw new src_ParseError("Too many math in a row: " + ("expected " + numMaths + ", but got " + curMaths), row[0]); + } + } else if (numCols < row.length) { + // Case 2 + numCols = row.length; + } + }); // Adjusting alignment. + // In aligned mode, we add one \qquad between columns; + // otherwise we add nothing. + + for (var _i5 = 0; _i5 < numCols; ++_i5) { + var align = "r"; + var pregap = 0; + + if (_i5 % 2 === 1) { + align = "l"; + } else if (_i5 > 0 && isAligned) { + // "aligned" mode. + pregap = 1; // add one \quad + } + + cols[_i5] = { + type: "align", + align: align, + pregap: pregap, + postgap: 0 + }; + } + + res.colSeparationType = isAligned ? "align" : "alignat"; + return res; +}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation +// is part of the source2e.pdf file of LaTeX2e source documentation. +// {darray} is an {array} environment where cells are set in \displaystyle, +// as defined in nccmath.sty. + + +defineEnvironment({ + type: "array", + names: ["array", "darray"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + // Since no types are specified above, the two possibilities are + // - The argument is wrapped in {} or [], in which case Parser's + // parseGroup() returns an "ordgroup" wrapping some symbol node. + // - The argument is a bare symbol node. + var symNode = checkSymbolNodeType(args[0]); + var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; + var cols = colalign.map(function (nde) { + var node = assertSymbolNodeType(nde); + var ca = node.text; + + if ("lcr".indexOf(ca) !== -1) { + return { + type: "align", + align: ca + }; + } else if (ca === "|") { + return { + type: "separator", + separator: "|" + }; + } else if (ca === ":") { + return { + type: "separator", + separator: ":" + }; + } + + throw new src_ParseError("Unknown column alignment: " + ca, nde); + }); + var res = { + cols: cols, + hskipBeforeAndAfter: true, + // \@preamble in lttab.dtx + maxNumCols: cols.length + }; + return parseArray(context.parser, res, dCellStyle(context.envName)); + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // The matrix environments of amsmath builds on the array environment +// of LaTeX, which is discussed above. +// The mathtools package adds starred versions of the same environments. +// These have an optional argument to choose left|center|right justification. + +defineEnvironment({ + type: "array", + names: ["matrix", "pmatrix", "bmatrix", "Bmatrix", "vmatrix", "Vmatrix", "matrix*", "pmatrix*", "bmatrix*", "Bmatrix*", "vmatrix*", "Vmatrix*"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + var delimiters = { + "matrix": null, + "pmatrix": ["(", ")"], + "bmatrix": ["[", "]"], + "Bmatrix": ["\\{", "\\}"], + "vmatrix": ["|", "|"], + "Vmatrix": ["\\Vert", "\\Vert"] + }[context.envName.replace("*", "")]; // \hskip -\arraycolsep in amsmath + + var colAlign = "c"; + var payload = { + hskipBeforeAndAfter: false, + cols: [{ + type: "align", + align: colAlign + }] + }; + + if (context.envName.charAt(context.envName.length - 1) === "*") { + // It's one of the mathtools starred functions. + // Parse the optional alignment argument. + var parser = context.parser; + parser.consumeSpaces(); + + if (parser.fetch().text === "[") { + parser.consume(); + parser.consumeSpaces(); + colAlign = parser.fetch().text; + + if ("lcr".indexOf(colAlign) === -1) { + throw new src_ParseError("Expected l or c or r", parser.nextToken); + } + + parser.consume(); + parser.consumeSpaces(); + parser.expect("]"); + parser.consume(); + payload.cols = [{ + type: "align", + align: colAlign + }]; + } + } + + var res = parseArray(context.parser, payload, dCellStyle(context.envName)); // Populate cols with the correct number of column alignment specs. + + res.cols = new Array(res.body[0].length).fill({ + type: "align", + align: colAlign + }); + return delimiters ? { + type: "leftright", + mode: context.mode, + body: [res], + left: delimiters[0], + right: delimiters[1], + rightColor: undefined // \right uninfluenced by \color in array + + } : res; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); +defineEnvironment({ + type: "array", + names: ["smallmatrix"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + var payload = { + arraystretch: 0.5 + }; + var res = parseArray(context.parser, payload, "script"); + res.colSeparationType = "small"; + return res; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); +defineEnvironment({ + type: "array", + names: ["subarray"], + props: { + numArgs: 1 + }, + handler: function handler(context, args) { + // Parsing of {subarray} is similar to {array} + var symNode = checkSymbolNodeType(args[0]); + var colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; + var cols = colalign.map(function (nde) { + var node = assertSymbolNodeType(nde); + var ca = node.text; // {subarray} only recognizes "l" & "c" + + if ("lc".indexOf(ca) !== -1) { + return { + type: "align", + align: ca + }; + } + + throw new src_ParseError("Unknown column alignment: " + ca, nde); + }); + + if (cols.length > 1) { + throw new src_ParseError("{subarray} can contain only one column"); + } + + var res = { + cols: cols, + hskipBeforeAndAfter: false, + arraystretch: 0.5 + }; + res = parseArray(context.parser, res, "script"); + + if (res.body.length > 0 && res.body[0].length > 1) { + throw new src_ParseError("{subarray} can contain only one column"); + } + + return res; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // A cases environment (in amsmath.sty) is almost equivalent to +// \def\arraystretch{1.2}% +// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. +// {dcases} is a {cases} environment where cells are set in \displaystyle, +// as defined in mathtools.sty. +// {rcases} is another mathtools environment. It's brace is on the right side. + +defineEnvironment({ + type: "array", + names: ["cases", "dcases", "rcases", "drcases"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + var payload = { + arraystretch: 1.2, + cols: [{ + type: "align", + align: "l", + pregap: 0, + // TODO(kevinb) get the current style. + // For now we use the metrics for TEXT style which is what we were + // doing before. Before attempting to get the current style we + // should look at TeX's behavior especially for \over and matrices. + postgap: 1.0 + /* 1em quad */ + + }, { + type: "align", + align: "l", + pregap: 0, + postgap: 0 + }] + }; + var res = parseArray(context.parser, payload, dCellStyle(context.envName)); + return { + type: "leftright", + mode: context.mode, + body: [res], + left: context.envName.indexOf("r") > -1 ? "." : "\\{", + right: context.envName.indexOf("r") > -1 ? "\\}" : ".", + rightColor: undefined + }; + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // In the align environment, one uses ampersands, &, to specify number of +// columns in each row, and to locate spacing between each column. +// align gets automatic numbering. align* and aligned do not. +// The alignedat environment can be used in math mode. +// Note that we assume \nomallineskiplimit to be zero, +// so that \strut@ is the same as \strut. + +defineEnvironment({ + type: "array", + names: ["align", "align*", "aligned", "split"], + props: { + numArgs: 0 + }, + handler: alignedHandler, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // A gathered environment is like an array environment with one centered +// column, but where rows are considered lines so get \jot line spacing +// and contents are set in \displaystyle. + +defineEnvironment({ + type: "array", + names: ["gathered", "gather", "gather*"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + if (utils.contains(["gather", "gather*"], context.envName)) { + validateAmsEnvironmentContext(context); + } + + var res = { + cols: [{ + type: "align", + align: "c" + }], + addJot: true, + colSeparationType: "gather", + addEqnNum: context.envName === "gather", + leqno: context.parser.settings.leqno + }; + return parseArray(context.parser, res, "display"); + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // alignat environment is like an align environment, but one must explicitly +// specify maximum number of columns in each row, and can adjust spacing between +// each columns. + +defineEnvironment({ + type: "array", + names: ["alignat", "alignat*", "alignedat"], + props: { + numArgs: 1 + }, + handler: alignedHandler, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); +defineEnvironment({ + type: "array", + names: ["equation", "equation*"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + validateAmsEnvironmentContext(context); + var res = { + addEqnNum: context.envName === "equation", + singleRow: true, + maxNumCols: 1, + leqno: context.parser.settings.leqno + }; + return parseArray(context.parser, res, "display"); + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); +defineEnvironment({ + type: "array", + names: ["CD"], + props: { + numArgs: 0 + }, + handler: function handler(context) { + validateAmsEnvironmentContext(context); + return parseCD(context.parser); + }, + htmlBuilder: array_htmlBuilder, + mathmlBuilder: array_mathmlBuilder +}); // Catch \hline outside array environment + +defineFunction({ + type: "text", + // Doesn't matter what this is. + names: ["\\hline", "\\hdashline"], + props: { + numArgs: 0, + allowedInText: true, + allowedInMath: true + }, + handler: function handler(context, args) { + throw new src_ParseError(context.funcName + " valid only within array environment"); + } +}); +;// CONCATENATED MODULE: ./src/environments.js + +var environments = _environments; +/* harmony default export */ var src_environments = (environments); // All environment definitions should be imported below + + +;// CONCATENATED MODULE: ./src/functions/environment.js + + + + // Environment delimiters. HTML/MathML rendering is defined in the corresponding +// defineEnvironment definitions. + +defineFunction({ + type: "environment", + names: ["\\begin", "\\end"], + props: { + numArgs: 1, + argTypes: ["text"] + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var nameGroup = args[0]; + + if (nameGroup.type !== "ordgroup") { + throw new src_ParseError("Invalid environment name", nameGroup); + } + + var envName = ""; + + for (var i = 0; i < nameGroup.body.length; ++i) { + envName += assertNodeType(nameGroup.body[i], "textord").text; + } + + if (funcName === "\\begin") { + // begin...end is similar to left...right + if (!src_environments.hasOwnProperty(envName)) { + throw new src_ParseError("No such environment: " + envName, nameGroup); + } // Build the environment object. Arguments and other information will + // be made available to the begin and end methods using properties. + + + var env = src_environments[envName]; + + var _parser$parseArgument = parser.parseArguments("\\begin{" + envName + "}", env), + _args = _parser$parseArgument.args, + optArgs = _parser$parseArgument.optArgs; + + var context = { + mode: parser.mode, + envName: envName, + parser: parser + }; + var result = env.handler(context, _args, optArgs); + parser.expect("\\end", false); + var endNameToken = parser.nextToken; + var end = assertNodeType(parser.parseFunction(), "environment"); + + if (end.name !== envName) { + throw new src_ParseError("Mismatch: \\begin{" + envName + "} matched by \\end{" + end.name + "}", endNameToken); + } // $FlowFixMe, "environment" handler returns an environment ParseNode + + + return result; + } + + return { + type: "environment", + mode: parser.mode, + name: envName, + nameGroup: nameGroup + }; + } +}); +;// CONCATENATED MODULE: ./src/functions/mclass.js + + + + + + +var mclass_makeSpan = buildCommon.makeSpan; + +function mclass_htmlBuilder(group, options) { + var elements = buildExpression(group.body, options, true); + return mclass_makeSpan([group.mclass], elements, options); +} + +function mclass_mathmlBuilder(group, options) { + var node; + var inner = buildMathML_buildExpression(group.body, options); + + if (group.mclass === "minner") { + return mathMLTree.newDocumentFragment(inner); + } else if (group.mclass === "mord") { + if (group.isCharacterBox) { + node = inner[0]; + node.type = "mi"; + } else { + node = new mathMLTree.MathNode("mi", inner); + } + } else { + if (group.isCharacterBox) { + node = inner[0]; + node.type = "mo"; + } else { + node = new mathMLTree.MathNode("mo", inner); + } // Set spacing based on what is the most likely adjacent atom type. + // See TeXbook p170. + + + if (group.mclass === "mbin") { + node.attributes.lspace = "0.22em"; // medium space + + node.attributes.rspace = "0.22em"; + } else if (group.mclass === "mpunct") { + node.attributes.lspace = "0em"; + node.attributes.rspace = "0.17em"; // thinspace + } else if (group.mclass === "mopen" || group.mclass === "mclose") { + node.attributes.lspace = "0em"; + node.attributes.rspace = "0em"; + } // MathML default space is 5/18 em, so needs no action. + // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo + + } + + return node; +} // Math class commands except \mathop + + +defineFunction({ + type: "mclass", + names: ["\\mathord", "\\mathbin", "\\mathrel", "\\mathopen", "\\mathclose", "\\mathpunct", "\\mathinner"], + props: { + numArgs: 1, + primitive: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + return { + type: "mclass", + mode: parser.mode, + mclass: "m" + funcName.substr(5), + // TODO(kevinb): don't prefix with 'm' + body: ordargument(body), + isCharacterBox: utils.isCharacterBox(body) + }; + }, + htmlBuilder: mclass_htmlBuilder, + mathmlBuilder: mclass_mathmlBuilder +}); +var binrelClass = function binrelClass(arg) { + // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. + // (by rendering separately and with {}s before and after, and measuring + // the change in spacing). We'll do roughly the same by detecting the + // atom type directly. + var atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; + + if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { + return "m" + atom.family; + } else { + return "mord"; + } +}; // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. +// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. + +defineFunction({ + type: "mclass", + names: ["\\@binrel"], + props: { + numArgs: 2 + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + return { + type: "mclass", + mode: parser.mode, + mclass: binrelClass(args[0]), + body: ordargument(args[1]), + isCharacterBox: utils.isCharacterBox(args[1]) + }; + } +}); // Build a relation or stacked op by placing one symbol on top of another + +defineFunction({ + type: "mclass", + names: ["\\stackrel", "\\overset", "\\underset"], + props: { + numArgs: 2 + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser, + funcName = _ref3.funcName; + var baseArg = args[1]; + var shiftedArg = args[0]; + var mclass; + + if (funcName !== "\\stackrel") { + // LaTeX applies \binrel spacing to \overset and \underset. + mclass = binrelClass(baseArg); + } else { + mclass = "mrel"; // for \stackrel + } + + var baseOp = { + type: "op", + mode: baseArg.mode, + limits: true, + alwaysHandleSupSub: true, + parentIsSupSub: false, + symbol: false, + suppressBaseShift: funcName !== "\\stackrel", + body: ordargument(baseArg) + }; + var supsub = { + type: "supsub", + mode: shiftedArg.mode, + base: baseOp, + sup: funcName === "\\underset" ? null : shiftedArg, + sub: funcName === "\\underset" ? shiftedArg : null + }; + return { + type: "mclass", + mode: parser.mode, + mclass: mclass, + body: [supsub], + isCharacterBox: utils.isCharacterBox(supsub) + }; + }, + htmlBuilder: mclass_htmlBuilder, + mathmlBuilder: mclass_mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/font.js +// TODO(kevinb): implement \\sl and \\sc + + + + + + +var font_htmlBuilder = function htmlBuilder(group, options) { + var font = group.font; + var newOptions = options.withFont(font); + return buildGroup(group.body, newOptions); +}; + +var font_mathmlBuilder = function mathmlBuilder(group, options) { + var font = group.font; + var newOptions = options.withFont(font); + return buildMathML_buildGroup(group.body, newOptions); +}; + +var fontAliases = { + "\\Bbb": "\\mathbb", + "\\bold": "\\mathbf", + "\\frak": "\\mathfrak", + "\\bm": "\\boldsymbol" +}; +defineFunction({ + type: "font", + names: [// styles, except \boldsymbol defined below + "\\mathrm", "\\mathit", "\\mathbf", "\\mathnormal", // families + "\\mathbb", "\\mathcal", "\\mathfrak", "\\mathscr", "\\mathsf", "\\mathtt", // aliases, except \bm defined below + "\\Bbb", "\\bold", "\\frak"], + props: { + numArgs: 1, + allowedInArgument: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = normalizeArgument(args[0]); + var func = funcName; + + if (func in fontAliases) { + func = fontAliases[func]; + } + + return { + type: "font", + mode: parser.mode, + font: func.slice(1), + body: body + }; + }, + htmlBuilder: font_htmlBuilder, + mathmlBuilder: font_mathmlBuilder +}); +defineFunction({ + type: "mclass", + names: ["\\boldsymbol", "\\bm"], + props: { + numArgs: 1 + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var body = args[0]; + var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the + // argument's bin|rel|ord status + + return { + type: "mclass", + mode: parser.mode, + mclass: binrelClass(body), + body: [{ + type: "font", + mode: parser.mode, + font: "boldsymbol", + body: body + }], + isCharacterBox: isCharacterBox + }; + } +}); // Old font changing functions + +defineFunction({ + type: "font", + names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser, + funcName = _ref3.funcName, + breakOnTokenText = _ref3.breakOnTokenText; + var mode = parser.mode; + var body = parser.parseExpression(true, breakOnTokenText); + var style = "math" + funcName.slice(1); + return { + type: "font", + mode: mode, + font: style, + body: { + type: "ordgroup", + mode: parser.mode, + body: body + } + }; + }, + htmlBuilder: font_htmlBuilder, + mathmlBuilder: font_mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/genfrac.js + + + + + + + + + + + +var adjustStyle = function adjustStyle(size, originalStyle) { + // Figure out what style this fraction should be in based on the + // function used + var style = originalStyle; + + if (size === "display") { + // Get display style as a default. + // If incoming style is sub/sup, use style.text() to get correct size. + style = style.id >= src_Style.SCRIPT.id ? style.text() : src_Style.DISPLAY; + } else if (size === "text" && style.size === src_Style.DISPLAY.size) { + // We're in a \tfrac but incoming style is displaystyle, so: + style = src_Style.TEXT; + } else if (size === "script") { + style = src_Style.SCRIPT; + } else if (size === "scriptscript") { + style = src_Style.SCRIPTSCRIPT; + } + + return style; +}; + +var genfrac_htmlBuilder = function htmlBuilder(group, options) { + // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e). + var style = adjustStyle(group.size, options.style); + var nstyle = style.fracNum(); + var dstyle = style.fracDen(); + var newOptions; + newOptions = options.havingStyle(nstyle); + var numerm = buildGroup(group.numer, newOptions, options); + + if (group.continued) { + // \cfrac inserts a \strut into the numerator. + // Get \strut dimensions from TeXbook page 353. + var hStrut = 8.5 / options.fontMetrics().ptPerEm; + var dStrut = 3.5 / options.fontMetrics().ptPerEm; + numerm.height = numerm.height < hStrut ? hStrut : numerm.height; + numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth; + } + + newOptions = options.havingStyle(dstyle); + var denomm = buildGroup(group.denom, newOptions, options); + var rule; + var ruleWidth; + var ruleSpacing; + + if (group.hasBarLine) { + if (group.barSize) { + ruleWidth = calculateSize(group.barSize, options); + rule = buildCommon.makeLineSpan("frac-line", options, ruleWidth); + } else { + rule = buildCommon.makeLineSpan("frac-line", options); + } + + ruleWidth = rule.height; + ruleSpacing = rule.height; + } else { + rule = null; + ruleWidth = 0; + ruleSpacing = options.fontMetrics().defaultRuleThickness; + } // Rule 15b + + + var numShift; + var clearance; + var denomShift; + + if (style.size === src_Style.DISPLAY.size || group.size === "display") { + numShift = options.fontMetrics().num1; + + if (ruleWidth > 0) { + clearance = 3 * ruleSpacing; + } else { + clearance = 7 * ruleSpacing; + } + + denomShift = options.fontMetrics().denom1; + } else { + if (ruleWidth > 0) { + numShift = options.fontMetrics().num2; + clearance = ruleSpacing; + } else { + numShift = options.fontMetrics().num3; + clearance = 3 * ruleSpacing; + } + + denomShift = options.fontMetrics().denom2; + } + + var frac; + + if (!rule) { + // Rule 15c + var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift); + + if (candidateClearance < clearance) { + numShift += 0.5 * (clearance - candidateClearance); + denomShift += 0.5 * (clearance - candidateClearance); + } + + frac = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: denomm, + shift: denomShift + }, { + type: "elem", + elem: numerm, + shift: -numShift + }] + }, options); + } else { + // Rule 15d + var axisHeight = options.fontMetrics().axisHeight; + + if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) { + numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth)); + } + + if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) { + denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift)); + } + + var midShift = -(axisHeight - 0.5 * ruleWidth); + frac = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: denomm, + shift: denomShift + }, { + type: "elem", + elem: rule, + shift: midShift + }, { + type: "elem", + elem: numerm, + shift: -numShift + }] + }, options); + } // Since we manually change the style sometimes (with \dfrac or \tfrac), + // account for the possible size change here. + + + newOptions = options.havingStyle(style); + frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier; + frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e + + var delimSize; + + if (style.size === src_Style.DISPLAY.size) { + delimSize = options.fontMetrics().delim1; + } else { + delimSize = options.fontMetrics().delim2; + } + + var leftDelim; + var rightDelim; + + if (group.leftDelim == null) { + leftDelim = makeNullDelimiter(options, ["mopen"]); + } else { + leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, ["mopen"]); + } + + if (group.continued) { + rightDelim = buildCommon.makeSpan([]); // zero width for \cfrac + } else if (group.rightDelim == null) { + rightDelim = makeNullDelimiter(options, ["mclose"]); + } else { + rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, ["mclose"]); + } + + return buildCommon.makeSpan(["mord"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan(["mfrac"], [frac]), rightDelim], options); +}; + +var genfrac_mathmlBuilder = function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mfrac", [buildMathML_buildGroup(group.numer, options), buildMathML_buildGroup(group.denom, options)]); + + if (!group.hasBarLine) { + node.setAttribute("linethickness", "0px"); + } else if (group.barSize) { + var ruleWidth = calculateSize(group.barSize, options); + node.setAttribute("linethickness", ruleWidth + "em"); + } + + var style = adjustStyle(group.size, options.style); + + if (style.size !== options.style.size) { + node = new mathMLTree.MathNode("mstyle", [node]); + var isDisplay = style.size === src_Style.DISPLAY.size ? "true" : "false"; + node.setAttribute("displaystyle", isDisplay); + node.setAttribute("scriptlevel", "0"); + } + + if (group.leftDelim != null || group.rightDelim != null) { + var withDelims = []; + + if (group.leftDelim != null) { + var leftOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.leftDelim.replace("\\", ""))]); + leftOp.setAttribute("fence", "true"); + withDelims.push(leftOp); + } + + withDelims.push(node); + + if (group.rightDelim != null) { + var rightOp = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode(group.rightDelim.replace("\\", ""))]); + rightOp.setAttribute("fence", "true"); + withDelims.push(rightOp); + } + + return makeRow(withDelims); + } + + return node; +}; + +defineFunction({ + type: "genfrac", + names: ["\\dfrac", "\\frac", "\\tfrac", "\\dbinom", "\\binom", "\\tbinom", "\\\\atopfrac", // can’t be entered directly + "\\\\bracefrac", "\\\\brackfrac" // ditto + ], + props: { + numArgs: 2, + allowedInArgument: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var numer = args[0]; + var denom = args[1]; + var hasBarLine; + var leftDelim = null; + var rightDelim = null; + var size = "auto"; + + switch (funcName) { + case "\\dfrac": + case "\\frac": + case "\\tfrac": + hasBarLine = true; + break; + + case "\\\\atopfrac": + hasBarLine = false; + break; + + case "\\dbinom": + case "\\binom": + case "\\tbinom": + hasBarLine = false; + leftDelim = "("; + rightDelim = ")"; + break; + + case "\\\\bracefrac": + hasBarLine = false; + leftDelim = "\\{"; + rightDelim = "\\}"; + break; + + case "\\\\brackfrac": + hasBarLine = false; + leftDelim = "["; + rightDelim = "]"; + break; + + default: + throw new Error("Unrecognized genfrac command"); + } + + switch (funcName) { + case "\\dfrac": + case "\\dbinom": + size = "display"; + break; + + case "\\tfrac": + case "\\tbinom": + size = "text"; + break; + } + + return { + type: "genfrac", + mode: parser.mode, + continued: false, + numer: numer, + denom: denom, + hasBarLine: hasBarLine, + leftDelim: leftDelim, + rightDelim: rightDelim, + size: size, + barSize: null + }; + }, + htmlBuilder: genfrac_htmlBuilder, + mathmlBuilder: genfrac_mathmlBuilder +}); +defineFunction({ + type: "genfrac", + names: ["\\cfrac"], + props: { + numArgs: 2 + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser, + funcName = _ref2.funcName; + var numer = args[0]; + var denom = args[1]; + return { + type: "genfrac", + mode: parser.mode, + continued: true, + numer: numer, + denom: denom, + hasBarLine: true, + leftDelim: null, + rightDelim: null, + size: "display", + barSize: null + }; + } +}); // Infix generalized fractions -- these are not rendered directly, but replaced +// immediately by one of the variants above. + +defineFunction({ + type: "infix", + names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], + props: { + numArgs: 0, + infix: true + }, + handler: function handler(_ref3) { + var parser = _ref3.parser, + funcName = _ref3.funcName, + token = _ref3.token; + var replaceWith; + + switch (funcName) { + case "\\over": + replaceWith = "\\frac"; + break; + + case "\\choose": + replaceWith = "\\binom"; + break; + + case "\\atop": + replaceWith = "\\\\atopfrac"; + break; + + case "\\brace": + replaceWith = "\\\\bracefrac"; + break; + + case "\\brack": + replaceWith = "\\\\brackfrac"; + break; + + default: + throw new Error("Unrecognized infix genfrac command"); + } + + return { + type: "infix", + mode: parser.mode, + replaceWith: replaceWith, + token: token + }; + } +}); +var stylArray = ["display", "text", "script", "scriptscript"]; + +var delimFromValue = function delimFromValue(delimString) { + var delim = null; + + if (delimString.length > 0) { + delim = delimString; + delim = delim === "." ? null : delim; + } + + return delim; +}; + +defineFunction({ + type: "genfrac", + names: ["\\genfrac"], + props: { + numArgs: 6, + allowedInArgument: true, + argTypes: ["math", "math", "size", "text", "math", "math"] + }, + handler: function handler(_ref4, args) { + var parser = _ref4.parser; + var numer = args[4]; + var denom = args[5]; // Look into the parse nodes to get the desired delimiters. + + var leftNode = normalizeArgument(args[0]); + var leftDelim = leftNode.type === "atom" && leftNode.family === "open" ? delimFromValue(leftNode.text) : null; + var rightNode = normalizeArgument(args[1]); + var rightDelim = rightNode.type === "atom" && rightNode.family === "close" ? delimFromValue(rightNode.text) : null; + var barNode = assertNodeType(args[2], "size"); + var hasBarLine; + var barSize = null; + + if (barNode.isBlank) { + // \genfrac acts differently than \above. + // \genfrac treats an empty size group as a signal to use a + // standard bar size. \above would see size = 0 and omit the bar. + hasBarLine = true; + } else { + barSize = barNode.value; + hasBarLine = barSize.number > 0; + } // Find out if we want displaystyle, textstyle, etc. + + + var size = "auto"; + var styl = args[3]; + + if (styl.type === "ordgroup") { + if (styl.body.length > 0) { + var textOrd = assertNodeType(styl.body[0], "textord"); + size = stylArray[Number(textOrd.text)]; + } + } else { + styl = assertNodeType(styl, "textord"); + size = stylArray[Number(styl.text)]; + } + + return { + type: "genfrac", + mode: parser.mode, + numer: numer, + denom: denom, + continued: false, + hasBarLine: hasBarLine, + barSize: barSize, + leftDelim: leftDelim, + rightDelim: rightDelim, + size: size + }; + }, + htmlBuilder: genfrac_htmlBuilder, + mathmlBuilder: genfrac_mathmlBuilder +}); // \above is an infix fraction that also defines a fraction bar size. + +defineFunction({ + type: "infix", + names: ["\\above"], + props: { + numArgs: 1, + argTypes: ["size"], + infix: true + }, + handler: function handler(_ref5, args) { + var parser = _ref5.parser, + funcName = _ref5.funcName, + token = _ref5.token; + return { + type: "infix", + mode: parser.mode, + replaceWith: "\\\\abovefrac", + size: assertNodeType(args[0], "size").value, + token: token + }; + } +}); +defineFunction({ + type: "genfrac", + names: ["\\\\abovefrac"], + props: { + numArgs: 3, + argTypes: ["math", "size", "math"] + }, + handler: function handler(_ref6, args) { + var parser = _ref6.parser, + funcName = _ref6.funcName; + var numer = args[0]; + var barSize = assert(assertNodeType(args[1], "infix").size); + var denom = args[2]; + var hasBarLine = barSize.number > 0; + return { + type: "genfrac", + mode: parser.mode, + numer: numer, + denom: denom, + continued: false, + hasBarLine: hasBarLine, + barSize: barSize, + leftDelim: null, + rightDelim: null, + size: "auto" + }; + }, + htmlBuilder: genfrac_htmlBuilder, + mathmlBuilder: genfrac_mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/horizBrace.js + + + + + + + + +// NOTE: Unlike most `htmlBuilder`s, this one handles not only "horizBrace", but +// also "supsub" since an over/underbrace can affect super/subscripting. +var horizBrace_htmlBuilder = function htmlBuilder(grp, options) { + var style = options.style; // Pull out the `ParseNode<"horizBrace">` if `grp` is a "supsub" node. + + var supSubGroup; + var group; + + if (grp.type === "supsub") { + // Ref: LaTeX source2e: }}}}\limits} + // i.e. LaTeX treats the brace similar to an op and passes it + // with \limits, so we need to assign supsub style. + supSubGroup = grp.sup ? buildGroup(grp.sup, options.havingStyle(style.sup()), options) : buildGroup(grp.sub, options.havingStyle(style.sub()), options); + group = assertNodeType(grp.base, "horizBrace"); + } else { + group = assertNodeType(grp, "horizBrace"); + } // Build the base group + + + var body = buildGroup(group.base, options.havingBaseStyle(src_Style.DISPLAY)); // Create the stretchy element + + var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓ + // This first vlist contains the content and the brace: equation + + var vlist; + + if (group.isOver) { + vlist = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: body + }, { + type: "kern", + size: 0.1 + }, { + type: "elem", + elem: braceBody + }] + }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. + + vlist.children[0].children[0].children[1].classes.push("svg-align"); + } else { + vlist = buildCommon.makeVList({ + positionType: "bottom", + positionData: body.depth + 0.1 + braceBody.height, + children: [{ + type: "elem", + elem: braceBody + }, { + type: "kern", + size: 0.1 + }, { + type: "elem", + elem: body + }] + }, options); // $FlowFixMe: Replace this with passing "svg-align" into makeVList. + + vlist.children[0].children[0].children[0].classes.push("svg-align"); + } + + if (supSubGroup) { + // To write the supsub, wrap the first vlist in another vlist: + // They can't all go in the same vlist, because the note might be + // wider than the equation. We want the equation to control the + // brace width. + // note long note long note + // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓ + // equation eqn eqn + var vSpan = buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); + + if (group.isOver) { + vlist = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: vSpan + }, { + type: "kern", + size: 0.2 + }, { + type: "elem", + elem: supSubGroup + }] + }, options); + } else { + vlist = buildCommon.makeVList({ + positionType: "bottom", + positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth, + children: [{ + type: "elem", + elem: supSubGroup + }, { + type: "kern", + size: 0.2 + }, { + type: "elem", + elem: vSpan + }] + }, options); + } + } + + return buildCommon.makeSpan(["mord", group.isOver ? "mover" : "munder"], [vlist], options); +}; + +var horizBrace_mathmlBuilder = function mathmlBuilder(group, options) { + var accentNode = stretchy.mathMLnode(group.label); + return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [buildMathML_buildGroup(group.base, options), accentNode]); +}; // Horizontal stretchy braces + + +defineFunction({ + type: "horizBrace", + names: ["\\overbrace", "\\underbrace"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + return { + type: "horizBrace", + mode: parser.mode, + label: funcName, + isOver: /^\\over/.test(funcName), + base: args[0] + }; + }, + htmlBuilder: horizBrace_htmlBuilder, + mathmlBuilder: horizBrace_mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/href.js + + + + + + +defineFunction({ + type: "href", + names: ["\\href"], + props: { + numArgs: 2, + argTypes: ["url", "original"], + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var body = args[1]; + var href = assertNodeType(args[0], "url").url; + + if (!parser.settings.isTrusted({ + command: "\\href", + url: href + })) { + return parser.formatUnsupportedCmd("\\href"); + } + + return { + type: "href", + mode: parser.mode, + href: href, + body: ordargument(body) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildExpression(group.body, options, false); + return buildCommon.makeAnchor(group.href, [], elements, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var math = buildExpressionRow(group.body, options); + + if (!(math instanceof MathNode)) { + math = new MathNode("mrow", [math]); + } + + math.setAttribute("href", group.href); + return math; + } +}); +defineFunction({ + type: "href", + names: ["\\url"], + props: { + numArgs: 1, + argTypes: ["url"], + allowedInText: true + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var href = assertNodeType(args[0], "url").url; + + if (!parser.settings.isTrusted({ + command: "\\url", + url: href + })) { + return parser.formatUnsupportedCmd("\\url"); + } + + var chars = []; + + for (var i = 0; i < href.length; i++) { + var c = href[i]; + + if (c === "~") { + c = "\\textasciitilde"; + } + + chars.push({ + type: "textord", + mode: "text", + text: c + }); + } + + var body = { + type: "text", + mode: parser.mode, + font: "\\texttt", + body: chars + }; + return { + type: "href", + mode: parser.mode, + href: href, + body: ordargument(body) + }; + } +}); +;// CONCATENATED MODULE: ./src/functions/hbox.js + + + + + // \hbox is provided for compatibility with LaTeX \vcenter. +// In LaTeX, \vcenter can act only on a box, as in +// \vcenter{\hbox{$\frac{a+b}{\dfrac{c}{d}}$}} +// This function by itself doesn't do anything but prevent a soft line break. + +defineFunction({ + type: "hbox", + names: ["\\hbox"], + props: { + numArgs: 1, + argTypes: ["text"], + allowedInText: true, + primitive: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "hbox", + mode: parser.mode, + body: ordargument(args[0]) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildExpression(group.body, options, false); + return buildCommon.makeFragment(elements); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return new mathMLTree.MathNode("mrow", buildMathML_buildExpression(group.body, options)); + } +}); +;// CONCATENATED MODULE: ./src/functions/html.js + + + + + + +defineFunction({ + type: "html", + names: ["\\htmlClass", "\\htmlId", "\\htmlStyle", "\\htmlData"], + props: { + numArgs: 2, + argTypes: ["raw", "original"], + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName, + token = _ref.token; + var value = assertNodeType(args[0], "raw").string; + var body = args[1]; + + if (parser.settings.strict) { + parser.settings.reportNonstrict("htmlExtension", "HTML extension is disabled on strict mode"); + } + + var trustContext; + var attributes = {}; + + switch (funcName) { + case "\\htmlClass": + attributes.class = value; + trustContext = { + command: "\\htmlClass", + class: value + }; + break; + + case "\\htmlId": + attributes.id = value; + trustContext = { + command: "\\htmlId", + id: value + }; + break; + + case "\\htmlStyle": + attributes.style = value; + trustContext = { + command: "\\htmlStyle", + style: value + }; + break; + + case "\\htmlData": + { + var data = value.split(","); + + for (var i = 0; i < data.length; i++) { + var keyVal = data[i].split("="); + + if (keyVal.length !== 2) { + throw new src_ParseError("Error parsing key-value for \\htmlData"); + } + + attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); + } + + trustContext = { + command: "\\htmlData", + attributes: attributes + }; + break; + } + + default: + throw new Error("Unrecognized html command"); + } + + if (!parser.settings.isTrusted(trustContext)) { + return parser.formatUnsupportedCmd(funcName); + } + + return { + type: "html", + mode: parser.mode, + attributes: attributes, + body: ordargument(body) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildExpression(group.body, options, false); + var classes = ["enclosing"]; + + if (group.attributes.class) { + classes.push.apply(classes, group.attributes.class.trim().split(/\s+/)); + } + + var span = buildCommon.makeSpan(classes, elements, options); + + for (var attr in group.attributes) { + if (attr !== "class" && group.attributes.hasOwnProperty(attr)) { + span.setAttribute(attr, group.attributes[attr]); + } + } + + return span; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return buildExpressionRow(group.body, options); + } +}); +;// CONCATENATED MODULE: ./src/functions/htmlmathml.js + + + + +defineFunction({ + type: "htmlmathml", + names: ["\\html@mathml"], + props: { + numArgs: 2, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "htmlmathml", + mode: parser.mode, + html: ordargument(args[0]), + mathml: ordargument(args[1]) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildExpression(group.html, options, false); + return buildCommon.makeFragment(elements); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return buildExpressionRow(group.mathml, options); + } +}); +;// CONCATENATED MODULE: ./src/functions/includegraphics.js + + + + + + + +var sizeData = function sizeData(str) { + if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { + // str is a number with no unit specified. + // default unit is bp, per graphix package. + return { + number: +str, + unit: "bp" + }; + } else { + var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); + + if (!match) { + throw new src_ParseError("Invalid size: '" + str + "' in \\includegraphics"); + } + + var data = { + number: +(match[1] + match[2]), + // sign + magnitude, cast to number + unit: match[3] + }; + + if (!validUnit(data)) { + throw new src_ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); + } + + return data; + } +}; + +defineFunction({ + type: "includegraphics", + names: ["\\includegraphics"], + props: { + numArgs: 1, + numOptionalArgs: 1, + argTypes: ["raw", "url"], + allowedInText: false + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var width = { + number: 0, + unit: "em" + }; + var height = { + number: 0.9, + unit: "em" + }; // sorta character sized. + + var totalheight = { + number: 0, + unit: "em" + }; + var alt = ""; + + if (optArgs[0]) { + var attributeStr = assertNodeType(optArgs[0], "raw").string; // Parser.js does not parse key/value pairs. We get a string. + + var attributes = attributeStr.split(","); + + for (var i = 0; i < attributes.length; i++) { + var keyVal = attributes[i].split("="); + + if (keyVal.length === 2) { + var str = keyVal[1].trim(); + + switch (keyVal[0].trim()) { + case "alt": + alt = str; + break; + + case "width": + width = sizeData(str); + break; + + case "height": + height = sizeData(str); + break; + + case "totalheight": + totalheight = sizeData(str); + break; + + default: + throw new src_ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics."); + } + } + } + } + + var src = assertNodeType(args[0], "url").url; + + if (alt === "") { + // No alt given. Use the file name. Strip away the path. + alt = src; + alt = alt.replace(/^.*[\\/]/, ''); + alt = alt.substring(0, alt.lastIndexOf('.')); + } + + if (!parser.settings.isTrusted({ + command: "\\includegraphics", + url: src + })) { + return parser.formatUnsupportedCmd("\\includegraphics"); + } + + return { + type: "includegraphics", + mode: parser.mode, + alt: alt, + width: width, + height: height, + totalheight: totalheight, + src: src + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var height = calculateSize(group.height, options); + var depth = 0; + + if (group.totalheight.number > 0) { + depth = calculateSize(group.totalheight, options) - height; + depth = Number(depth.toFixed(2)); + } + + var width = 0; + + if (group.width.number > 0) { + width = calculateSize(group.width, options); + } + + var style = { + height: height + depth + "em" + }; + + if (width > 0) { + style.width = width + "em"; + } + + if (depth > 0) { + style.verticalAlign = -depth + "em"; + } + + var node = new Img(group.src, group.alt, style); + node.height = height; + node.depth = depth; + return node; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mglyph", []); + node.setAttribute("alt", group.alt); + var height = calculateSize(group.height, options); + var depth = 0; + + if (group.totalheight.number > 0) { + depth = calculateSize(group.totalheight, options) - height; + depth = depth.toFixed(2); + node.setAttribute("valign", "-" + depth + "em"); + } + + node.setAttribute("height", height + depth + "em"); + + if (group.width.number > 0) { + var width = calculateSize(group.width, options); + node.setAttribute("width", width + "em"); + } + + node.setAttribute("src", group.src); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/kern.js +// Horizontal spacing commands + + + + + // TODO: \hskip and \mskip should support plus and minus in lengths + +defineFunction({ + type: "kern", + names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], + props: { + numArgs: 1, + argTypes: ["size"], + primitive: true, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var size = assertNodeType(args[0], "size"); + + if (parser.settings.strict) { + var mathFunction = funcName[1] === 'm'; // \mkern, \mskip + + var muUnit = size.value.unit === 'mu'; + + if (mathFunction) { + if (!muUnit) { + parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " supports only mu units, " + ("not " + size.value.unit + " units")); + } + + if (parser.mode !== "math") { + parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " works only in math mode"); + } + } else { + // !mathFunction + if (muUnit) { + parser.settings.reportNonstrict("mathVsTextUnits", "LaTeX's " + funcName + " doesn't support mu units"); + } + } + } + + return { + type: "kern", + mode: parser.mode, + dimension: size.value + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.makeGlue(group.dimension, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var dimension = calculateSize(group.dimension, options); + return new mathMLTree.SpaceNode(dimension); + } +}); +;// CONCATENATED MODULE: ./src/functions/lap.js +// Horizontal overlap functions + + + + + +defineFunction({ + type: "lap", + names: ["\\mathllap", "\\mathrlap", "\\mathclap"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + return { + type: "lap", + mode: parser.mode, + alignment: funcName.slice(5), + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // mathllap, mathrlap, mathclap + var inner; + + if (group.alignment === "clap") { + // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/ + inner = buildCommon.makeSpan([], [buildGroup(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span + + inner = buildCommon.makeSpan(["inner"], [inner], options); + } else { + inner = buildCommon.makeSpan(["inner"], [buildGroup(group.body, options)]); + } + + var fix = buildCommon.makeSpan(["fix"], []); + var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the + // two items involved in the lap. + // Next, use a strut to set the height of the HTML bounding box. + // Otherwise, a tall argument may be misplaced. + // This code resolved issue #1153 + + var strut = buildCommon.makeSpan(["strut"]); + strut.style.height = node.height + node.depth + "em"; + strut.style.verticalAlign = -node.depth + "em"; + node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall. + // This code resolves issue #1234 + + node = buildCommon.makeSpan(["thinbox"], [node], options); + return buildCommon.makeSpan(["mord", "vbox"], [node], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // mathllap, mathrlap, mathclap + var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); + + if (group.alignment !== "rlap") { + var offset = group.alignment === "llap" ? "-1" : "-0.5"; + node.setAttribute("lspace", offset + "width"); + } + + node.setAttribute("width", "0px"); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/math.js + + // Switching from text mode back to math mode + +defineFunction({ + type: "styling", + names: ["\\(", "$"], + props: { + numArgs: 0, + allowedInText: true, + allowedInMath: false + }, + handler: function handler(_ref, args) { + var funcName = _ref.funcName, + parser = _ref.parser; + var outerMode = parser.mode; + parser.switchMode("math"); + var close = funcName === "\\(" ? "\\)" : "$"; + var body = parser.parseExpression(false, close); + parser.expect(close); + parser.switchMode(outerMode); + return { + type: "styling", + mode: parser.mode, + style: "text", + body: body + }; + } +}); // Check for extra closing math delimiters + +defineFunction({ + type: "text", + // Doesn't matter what this is. + names: ["\\)", "\\]"], + props: { + numArgs: 0, + allowedInText: true, + allowedInMath: false + }, + handler: function handler(context, args) { + throw new src_ParseError("Mismatched " + context.funcName); + } +}); +;// CONCATENATED MODULE: ./src/functions/mathchoice.js + + + + + + +var chooseMathStyle = function chooseMathStyle(group, options) { + switch (options.style.size) { + case src_Style.DISPLAY.size: + return group.display; + + case src_Style.TEXT.size: + return group.text; + + case src_Style.SCRIPT.size: + return group.script; + + case src_Style.SCRIPTSCRIPT.size: + return group.scriptscript; + + default: + return group.text; + } +}; + +defineFunction({ + type: "mathchoice", + names: ["\\mathchoice"], + props: { + numArgs: 4, + primitive: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "mathchoice", + mode: parser.mode, + display: ordargument(args[0]), + text: ordargument(args[1]), + script: ordargument(args[2]), + scriptscript: ordargument(args[3]) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var body = chooseMathStyle(group, options); + var elements = buildExpression(body, options, false); + return buildCommon.makeFragment(elements); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var body = chooseMathStyle(group, options); + return buildExpressionRow(body, options); + } +}); +;// CONCATENATED MODULE: ./src/functions/utils/assembleSupSub.js + + +// For an operator with limits, assemble the base, sup, and sub into a span. +var assembleSupSub = function assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift) { + base = buildCommon.makeSpan([], [base]); + var sub; + var sup; // We manually have to handle the superscripts and subscripts. This, + // aside from the kern calculations, is copied from supsub. + + if (supGroup) { + var elem = buildGroup(supGroup, options.havingStyle(style.sup()), options); + sup = { + elem: elem, + kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth) + }; + } + + if (subGroup) { + var _elem = buildGroup(subGroup, options.havingStyle(style.sub()), options); + + sub = { + elem: _elem, + kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height) + }; + } // Build the final group as a vlist of the possible subscript, base, + // and possible superscript. + + + var finalGroup; + + if (sup && sub) { + var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift; + finalGroup = buildCommon.makeVList({ + positionType: "bottom", + positionData: bottom, + children: [{ + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }, { + type: "elem", + elem: sub.elem, + marginLeft: -slant + "em" + }, { + type: "kern", + size: sub.kern + }, { + type: "elem", + elem: base + }, { + type: "kern", + size: sup.kern + }, { + type: "elem", + elem: sup.elem, + marginLeft: slant + "em" + }, { + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }] + }, options); + } else if (sub) { + var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note + // that we are supposed to shift the limits by 1/2 of the slant, + // but since we are centering the limits adding a full slant of + // margin will shift by 1/2 that. + + finalGroup = buildCommon.makeVList({ + positionType: "top", + positionData: top, + children: [{ + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }, { + type: "elem", + elem: sub.elem, + marginLeft: -slant + "em" + }, { + type: "kern", + size: sub.kern + }, { + type: "elem", + elem: base + }] + }, options); + } else if (sup) { + var _bottom = base.depth + baseShift; + + finalGroup = buildCommon.makeVList({ + positionType: "bottom", + positionData: _bottom, + children: [{ + type: "elem", + elem: base + }, { + type: "kern", + size: sup.kern + }, { + type: "elem", + elem: sup.elem, + marginLeft: slant + "em" + }, { + type: "kern", + size: options.fontMetrics().bigOpSpacing5 + }] + }, options); + } else { + // This case probably shouldn't occur (this would mean the + // supsub was sending us a group with no superscript or + // subscript) but be safe. + return base; + } + + return buildCommon.makeSpan(["mop", "op-limits"], [finalGroup], options); +}; +;// CONCATENATED MODULE: ./src/functions/op.js +// Limits, symbols + + + + + + + + + + +// Most operators have a large successor symbol, but these don't. +var noSuccessor = ["\\smallint"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only "op", but also +// "supsub" since some of them (like \int) can affect super/subscripting. + +var op_htmlBuilder = function htmlBuilder(grp, options) { + // Operators are handled in the TeXbook pg. 443-444, rule 13(a). + var supGroup; + var subGroup; + var hasLimits = false; + var group; + + if (grp.type === "supsub") { + // If we have limits, supsub will pass us its group to handle. Pull + // out the superscript and subscript and set the group to the op in + // its base. + supGroup = grp.sup; + subGroup = grp.sub; + group = assertNodeType(grp.base, "op"); + hasLimits = true; + } else { + group = assertNodeType(grp, "op"); + } + + var style = options.style; + var large = false; + + if (style.size === src_Style.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) { + // Most symbol operators get larger in displaystyle (rule 13) + large = true; + } + + var base; + + if (group.symbol) { + // If this is a symbol, create the symbol. + var fontName = large ? "Size2-Regular" : "Size1-Regular"; + var stash = ""; + + if (group.name === "\\oiint" || group.name === "\\oiiint") { + // No font glyphs yet, so use a glyph w/o the oval. + // TODO: When font glyphs are available, delete this code. + stash = group.name.substr(1); + group.name = stash === "oiint" ? "\\iint" : "\\iiint"; + } + + base = buildCommon.makeSymbol(group.name, fontName, "math", options, ["mop", "op-symbol", large ? "large-op" : "small-op"]); + + if (stash.length > 0) { + // We're in \oiint or \oiiint. Overlay the oval. + // TODO: When font glyphs are available, delete this code. + var italic = base.italic; + var oval = buildCommon.staticSvg(stash + "Size" + (large ? "2" : "1"), options); + base = buildCommon.makeVList({ + positionType: "individualShift", + children: [{ + type: "elem", + elem: base, + shift: 0 + }, { + type: "elem", + elem: oval, + shift: large ? 0.08 : 0 + }] + }, options); + group.name = "\\" + stash; + base.classes.unshift("mop"); // $FlowFixMe + + base.italic = italic; + } + } else if (group.body) { + // If this is a list, compose that list. + var inner = buildExpression(group.body, options, true); + + if (inner.length === 1 && inner[0] instanceof SymbolNode) { + base = inner[0]; + base.classes[0] = "mop"; // replace old mclass + } else { + base = buildCommon.makeSpan(["mop"], inner, options); + } + } else { + // Otherwise, this is a text operator. Build the text from the + // operator's name. + var output = []; + + for (var i = 1; i < group.name.length; i++) { + output.push(buildCommon.mathsym(group.name[i], group.mode, options)); + } + + base = buildCommon.makeSpan(["mop"], output, options); + } // If content of op is a single symbol, shift it vertically. + + + var baseShift = 0; + var slant = 0; + + if ((base instanceof SymbolNode || group.name === "\\oiint" || group.name === "\\oiiint") && !group.suppressBaseShift) { + // We suppress the shift of the base of \overset and \underset. Otherwise, + // shift the symbol so its center lies on the axis (rule 13). It + // appears that our fonts have the centers of the symbols already + // almost on the axis, so these numbers are very small. Note we + // don't actually apply this here, but instead it is used either in + // the vlist creation or separately when there are no limits. + baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction. + // $FlowFixMe + + slant = base.italic; + } + + if (hasLimits) { + return assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift); + } else { + if (baseShift) { + base.style.position = "relative"; + base.style.top = baseShift + "em"; + } + + return base; + } +}; + +var op_mathmlBuilder = function mathmlBuilder(group, options) { + var node; + + if (group.symbol) { + // This is a symbol. Just add the symbol. + node = new MathNode("mo", [makeText(group.name, group.mode)]); + + if (utils.contains(noSuccessor, group.name)) { + node.setAttribute("largeop", "false"); + } + } else if (group.body) { + // This is an operator with children. Add them. + node = new MathNode("mo", buildMathML_buildExpression(group.body, options)); + } else { + // This is a text operator. Add all of the characters from the + // operator's name. + node = new MathNode("mi", [new TextNode(group.name.slice(1))]); // Append an . + // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 + + var operator = new MathNode("mo", [makeText("\u2061", "text")]); + + if (group.parentIsSupSub) { + node = new MathNode("mrow", [node, operator]); + } else { + node = newDocumentFragment([node, operator]); + } + } + + return node; +}; + +var singleCharBigOps = { + "\u220F": "\\prod", + "\u2210": "\\coprod", + "\u2211": "\\sum", + "\u22C0": "\\bigwedge", + "\u22C1": "\\bigvee", + "\u22C2": "\\bigcap", + "\u22C3": "\\bigcup", + "\u2A00": "\\bigodot", + "\u2A01": "\\bigoplus", + "\u2A02": "\\bigotimes", + "\u2A04": "\\biguplus", + "\u2A06": "\\bigsqcup" +}; +defineFunction({ + type: "op", + names: ["\\coprod", "\\bigvee", "\\bigwedge", "\\biguplus", "\\bigcap", "\\bigcup", "\\intop", "\\prod", "\\sum", "\\bigotimes", "\\bigoplus", "\\bigodot", "\\bigsqcup", "\\smallint", "\u220F", "\u2210", "\u2211", "\u22C0", "\u22C1", "\u22C2", "\u22C3", "\u2A00", "\u2A01", "\u2A02", "\u2A04", "\u2A06"], + props: { + numArgs: 0 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var fName = funcName; + + if (fName.length === 1) { + fName = singleCharBigOps[fName]; + } + + return { + type: "op", + mode: parser.mode, + limits: true, + parentIsSupSub: false, + symbol: true, + name: fName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // Note: calling defineFunction with a type that's already been defined only +// works because the same htmlBuilder and mathmlBuilder are being used. + +defineFunction({ + type: "op", + names: ["\\mathop"], + props: { + numArgs: 1, + primitive: true + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var body = args[0]; + return { + type: "op", + mode: parser.mode, + limits: false, + parentIsSupSub: false, + symbol: false, + body: ordargument(body) + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // There are 2 flags for operators; whether they produce limits in +// displaystyle, and whether they are symbols and should grow in +// displaystyle. These four groups cover the four possible choices. + +var singleCharIntegrals = { + "\u222B": "\\int", + "\u222C": "\\iint", + "\u222D": "\\iiint", + "\u222E": "\\oint", + "\u222F": "\\oiint", + "\u2230": "\\oiiint" +}; // No limits, not symbols + +defineFunction({ + type: "op", + names: ["\\arcsin", "\\arccos", "\\arctan", "\\arctg", "\\arcctg", "\\arg", "\\ch", "\\cos", "\\cosec", "\\cosh", "\\cot", "\\cotg", "\\coth", "\\csc", "\\ctg", "\\cth", "\\deg", "\\dim", "\\exp", "\\hom", "\\ker", "\\lg", "\\ln", "\\log", "\\sec", "\\sin", "\\sinh", "\\sh", "\\tan", "\\tanh", "\\tg", "\\th"], + props: { + numArgs: 0 + }, + handler: function handler(_ref3) { + var parser = _ref3.parser, + funcName = _ref3.funcName; + return { + type: "op", + mode: parser.mode, + limits: false, + parentIsSupSub: false, + symbol: false, + name: funcName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // Limits, not symbols + +defineFunction({ + type: "op", + names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], + props: { + numArgs: 0 + }, + handler: function handler(_ref4) { + var parser = _ref4.parser, + funcName = _ref4.funcName; + return { + type: "op", + mode: parser.mode, + limits: true, + parentIsSupSub: false, + symbol: false, + name: funcName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); // No limits, symbols + +defineFunction({ + type: "op", + names: ["\\int", "\\iint", "\\iiint", "\\oint", "\\oiint", "\\oiiint", "\u222B", "\u222C", "\u222D", "\u222E", "\u222F", "\u2230"], + props: { + numArgs: 0 + }, + handler: function handler(_ref5) { + var parser = _ref5.parser, + funcName = _ref5.funcName; + var fName = funcName; + + if (fName.length === 1) { + fName = singleCharIntegrals[fName]; + } + + return { + type: "op", + mode: parser.mode, + limits: false, + parentIsSupSub: false, + symbol: true, + name: fName + }; + }, + htmlBuilder: op_htmlBuilder, + mathmlBuilder: op_mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/operatorname.js + + + + + + + + +// NOTE: Unlike most `htmlBuilder`s, this one handles not only +// "operatorname", but also "supsub" since \operatorname* can +// affect super/subscripting. +var operatorname_htmlBuilder = function htmlBuilder(grp, options) { + // Operators are handled in the TeXbook pg. 443-444, rule 13(a). + var supGroup; + var subGroup; + var hasLimits = false; + var group; + + if (grp.type === "supsub") { + // If we have limits, supsub will pass us its group to handle. Pull + // out the superscript and subscript and set the group to the op in + // its base. + supGroup = grp.sup; + subGroup = grp.sub; + group = assertNodeType(grp.base, "operatorname"); + hasLimits = true; + } else { + group = assertNodeType(grp, "operatorname"); + } + + var base; + + if (group.body.length > 0) { + var body = group.body.map(function (child) { + // $FlowFixMe: Check if the node has a string `text` property. + var childText = child.text; + + if (typeof childText === "string") { + return { + type: "textord", + mode: child.mode, + text: childText + }; + } else { + return child; + } + }); // Consolidate function names into symbol characters. + + var expression = buildExpression(body, options.withFont("mathrm"), true); + + for (var i = 0; i < expression.length; i++) { + var child = expression[i]; + + if (child instanceof SymbolNode) { + // Per amsopn package, + // change minus to hyphen and \ast to asterisk + child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); + } + } + + base = buildCommon.makeSpan(["mop"], expression, options); + } else { + base = buildCommon.makeSpan(["mop"], [], options); + } + + if (hasLimits) { + return assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0); + } else { + return base; + } +}; + +var operatorname_mathmlBuilder = function mathmlBuilder(group, options) { + // The steps taken here are similar to the html version. + var expression = buildMathML_buildExpression(group.body, options.withFont("mathrm")); // Is expression a string or has it something like a fraction? + + var isAllString = true; // default + + for (var i = 0; i < expression.length; i++) { + var node = expression[i]; + + if (node instanceof mathMLTree.SpaceNode) {// Do nothing + } else if (node instanceof mathMLTree.MathNode) { + switch (node.type) { + case "mi": + case "mn": + case "ms": + case "mspace": + case "mtext": + break; + // Do nothing yet. + + case "mo": + { + var child = node.children[0]; + + if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { + child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); + } else { + isAllString = false; + } + + break; + } + + default: + isAllString = false; + } + } else { + isAllString = false; + } + } + + if (isAllString) { + // Write a single TextNode instead of multiple nested tags. + var word = expression.map(function (node) { + return node.toText(); + }).join(""); + expression = [new mathMLTree.TextNode(word)]; + } + + var identifier = new mathMLTree.MathNode("mi", expression); + identifier.setAttribute("mathvariant", "normal"); // \u2061 is the same as ⁡ + // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp + + var operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); + + if (group.parentIsSupSub) { + return new mathMLTree.MathNode("mrow", [identifier, operator]); + } else { + return mathMLTree.newDocumentFragment([identifier, operator]); + } +}; // \operatorname +// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ + + +defineFunction({ + type: "operatorname", + names: ["\\operatorname", "\\operatorname*"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + return { + type: "operatorname", + mode: parser.mode, + body: ordargument(body), + alwaysHandleSupSub: funcName === "\\operatorname*", + limits: false, + parentIsSupSub: false + }; + }, + htmlBuilder: operatorname_htmlBuilder, + mathmlBuilder: operatorname_mathmlBuilder +}); +;// CONCATENATED MODULE: ./src/functions/ordgroup.js + + + + +defineFunctionBuilders({ + type: "ordgroup", + htmlBuilder: function htmlBuilder(group, options) { + if (group.semisimple) { + return buildCommon.makeFragment(buildExpression(group.body, options, false)); + } + + return buildCommon.makeSpan(["mord"], buildExpression(group.body, options, true), options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + return buildExpressionRow(group.body, options, true); + } +}); +;// CONCATENATED MODULE: ./src/functions/overline.js + + + + + +defineFunction({ + type: "overline", + names: ["\\overline"], + props: { + numArgs: 1 + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var body = args[0]; + return { + type: "overline", + mode: parser.mode, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Overlines are handled in the TeXbook pg 443, Rule 9. + // Build the inner group in the cramped style. + var innerGroup = buildGroup(group.body, options.havingCrampedStyle()); // Create the line above the body + + var line = buildCommon.makeLineSpan("overline-line", options); // Generate the vlist, with the appropriate kerns + + var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; + var vlist = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: innerGroup + }, { + type: "kern", + size: 3 * defaultRuleThickness + }, { + type: "elem", + elem: line + }, { + type: "kern", + size: defaultRuleThickness + }] + }, options); + return buildCommon.makeSpan(["mord", "overline"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); + operator.setAttribute("stretchy", "true"); + var node = new mathMLTree.MathNode("mover", [buildMathML_buildGroup(group.body, options), operator]); + node.setAttribute("accent", "true"); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/phantom.js + + + + + +defineFunction({ + type: "phantom", + names: ["\\phantom"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var body = args[0]; + return { + type: "phantom", + mode: parser.mode, + body: ordargument(body) + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var elements = buildExpression(group.body, options.withPhantom(), false); // \phantom isn't supposed to affect the elements it contains. + // See "color" for more details. + + return buildCommon.makeFragment(elements); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(group.body, options); + return new mathMLTree.MathNode("mphantom", inner); + } +}); +defineFunction({ + type: "hphantom", + names: ["\\hphantom"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref2, args) { + var parser = _ref2.parser; + var body = args[0]; + return { + type: "hphantom", + mode: parser.mode, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var node = buildCommon.makeSpan([], [buildGroup(group.body, options.withPhantom())]); + node.height = 0; + node.depth = 0; + + if (node.children) { + for (var i = 0; i < node.children.length; i++) { + node.children[i].height = 0; + node.children[i].depth = 0; + } + } // See smash for comment re: use of makeVList + + + node = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: node + }] + }, options); // For spacing, TeX treats \smash as a math group (same spacing as ord). + + return buildCommon.makeSpan(["mord"], [node], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(ordargument(group.body), options); + var phantom = new mathMLTree.MathNode("mphantom", inner); + var node = new mathMLTree.MathNode("mpadded", [phantom]); + node.setAttribute("height", "0px"); + node.setAttribute("depth", "0px"); + return node; + } +}); +defineFunction({ + type: "vphantom", + names: ["\\vphantom"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref3, args) { + var parser = _ref3.parser; + var body = args[0]; + return { + type: "vphantom", + mode: parser.mode, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var inner = buildCommon.makeSpan(["inner"], [buildGroup(group.body, options.withPhantom())]); + var fix = buildCommon.makeSpan(["fix"], []); + return buildCommon.makeSpan(["mord", "rlap"], [inner, fix], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var inner = buildMathML_buildExpression(ordargument(group.body), options); + var phantom = new mathMLTree.MathNode("mphantom", inner); + var node = new mathMLTree.MathNode("mpadded", [phantom]); + node.setAttribute("width", "0px"); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/raisebox.js + + + + + + + // Box manipulation + +defineFunction({ + type: "raisebox", + names: ["\\raisebox"], + props: { + numArgs: 2, + argTypes: ["size", "hbox"], + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + var amount = assertNodeType(args[0], "size").value; + var body = args[1]; + return { + type: "raisebox", + mode: parser.mode, + dy: amount, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var body = buildGroup(group.body, options); + var dy = calculateSize(group.dy, options); + return buildCommon.makeVList({ + positionType: "shift", + positionData: -dy, + children: [{ + type: "elem", + elem: body + }] + }, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); + var dy = group.dy.number + group.dy.unit; + node.setAttribute("voffset", dy); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/rule.js + + + + + +defineFunction({ + type: "rule", + names: ["\\rule"], + props: { + numArgs: 2, + numOptionalArgs: 1, + argTypes: ["size", "size", "size"] + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var shift = optArgs[0]; + var width = assertNodeType(args[0], "size"); + var height = assertNodeType(args[1], "size"); + return { + type: "rule", + mode: parser.mode, + shift: shift && assertNodeType(shift, "size").value, + width: width.value, + height: height.value + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Make an empty span for the rule + var rule = buildCommon.makeSpan(["mord", "rule"], [], options); // Calculate the shift, width, and height of the rule, and account for units + + var width = calculateSize(group.width, options); + var height = calculateSize(group.height, options); + var shift = group.shift ? calculateSize(group.shift, options) : 0; // Style the rule to the right size + + rule.style.borderRightWidth = width + "em"; + rule.style.borderTopWidth = height + "em"; + rule.style.bottom = shift + "em"; // Record the height and width + + rule.width = width; + rule.height = height + shift; + rule.depth = -shift; // Font size is the number large enough that the browser will + // reserve at least `absHeight` space above the baseline. + // The 1.125 factor was empirically determined + + rule.maxFontSize = height * 1.125 * options.sizeMultiplier; + return rule; + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var width = calculateSize(group.width, options); + var height = calculateSize(group.height, options); + var shift = group.shift ? calculateSize(group.shift, options) : 0; + var color = options.color && options.getColor() || "black"; + var rule = new mathMLTree.MathNode("mspace"); + rule.setAttribute("mathbackground", color); + rule.setAttribute("width", width + "em"); + rule.setAttribute("height", height + "em"); + var wrapper = new mathMLTree.MathNode("mpadded", [rule]); + + if (shift >= 0) { + wrapper.setAttribute("height", "+" + shift + "em"); + } else { + wrapper.setAttribute("height", shift + "em"); + wrapper.setAttribute("depth", "+" + -shift + "em"); + } + + wrapper.setAttribute("voffset", shift + "em"); + return wrapper; + } +}); +;// CONCATENATED MODULE: ./src/functions/sizing.js + + + + + +function sizingGroup(value, options, baseOptions) { + var inner = buildExpression(value, options, false); + var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize + // manually. Handle nested size changes. + + for (var i = 0; i < inner.length; i++) { + var pos = inner[i].classes.indexOf("sizing"); + + if (pos < 0) { + Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions)); + } else if (inner[i].classes[pos + 1] === "reset-size" + options.size) { + // This is a nested size change: e.g., inner[i] is the "b" in + // `\Huge a \small b`. Override the old size (the `reset-` class) + // but not the new size. + inner[i].classes[pos + 1] = "reset-size" + baseOptions.size; + } + + inner[i].height *= multiplier; + inner[i].depth *= multiplier; + } + + return buildCommon.makeFragment(inner); +} +var sizeFuncs = ["\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize", "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge"]; +var sizing_htmlBuilder = function htmlBuilder(group, options) { + // Handle sizing operators like \Huge. Real TeX doesn't actually allow + // these functions inside of math expressions, so we do some special + // handling. + var newOptions = options.havingSize(group.size); + return sizingGroup(group.body, newOptions, options); +}; +defineFunction({ + type: "sizing", + names: sizeFuncs, + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(_ref, args) { + var breakOnTokenText = _ref.breakOnTokenText, + funcName = _ref.funcName, + parser = _ref.parser; + var body = parser.parseExpression(false, breakOnTokenText); + return { + type: "sizing", + mode: parser.mode, + // Figure out what size to use based on the list of functions above + size: sizeFuncs.indexOf(funcName) + 1, + body: body + }; + }, + htmlBuilder: sizing_htmlBuilder, + mathmlBuilder: function mathmlBuilder(group, options) { + var newOptions = options.havingSize(group.size); + var inner = buildMathML_buildExpression(group.body, newOptions); + var node = new mathMLTree.MathNode("mstyle", inner); // TODO(emily): This doesn't produce the correct size for nested size + // changes, because we don't keep state of what style we're currently + // in, so we can't reset the size to normal before changing it. Now + // that we're passing an options parameter we should be able to fix + // this. + + node.setAttribute("mathsize", newOptions.sizeMultiplier + "em"); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/smash.js +// smash, with optional [tb], as in AMS + + + + + + +defineFunction({ + type: "smash", + names: ["\\smash"], + props: { + numArgs: 1, + numOptionalArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var smashHeight = false; + var smashDepth = false; + var tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); + + if (tbArg) { + // Optional [tb] argument is engaged. + // ref: amsmath: \renewcommand{\smash}[1][tb]{% + // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% + var letter = ""; + + for (var i = 0; i < tbArg.body.length; ++i) { + var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property. + + letter = node.text; + + if (letter === "t") { + smashHeight = true; + } else if (letter === "b") { + smashDepth = true; + } else { + smashHeight = false; + smashDepth = false; + break; + } + } + } else { + smashHeight = true; + smashDepth = true; + } + + var body = args[0]; + return { + type: "smash", + mode: parser.mode, + body: body, + smashHeight: smashHeight, + smashDepth: smashDepth + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var node = buildCommon.makeSpan([], [buildGroup(group.body, options)]); + + if (!group.smashHeight && !group.smashDepth) { + return node; + } + + if (group.smashHeight) { + node.height = 0; // In order to influence makeVList, we have to reset the children. + + if (node.children) { + for (var i = 0; i < node.children.length; i++) { + node.children[i].height = 0; + } + } + } + + if (group.smashDepth) { + node.depth = 0; + + if (node.children) { + for (var _i = 0; _i < node.children.length; _i++) { + node.children[_i].depth = 0; + } + } + } // At this point, we've reset the TeX-like height and depth values. + // But the span still has an HTML line height. + // makeVList applies "display: table-cell", which prevents the browser + // from acting on that line height. So we'll call makeVList now. + + + var smashedNode = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: node + }] + }, options); // For spacing, TeX treats \hphantom as a math group (same spacing as ord). + + return buildCommon.makeSpan(["mord"], [smashedNode], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)]); + + if (group.smashHeight) { + node.setAttribute("height", "0px"); + } + + if (group.smashDepth) { + node.setAttribute("depth", "0px"); + } + + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/sqrt.js + + + + + + + +defineFunction({ + type: "sqrt", + names: ["\\sqrt"], + props: { + numArgs: 1, + numOptionalArgs: 1 + }, + handler: function handler(_ref, args, optArgs) { + var parser = _ref.parser; + var index = optArgs[0]; + var body = args[0]; + return { + type: "sqrt", + mode: parser.mode, + body: body, + index: index + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Square roots are handled in the TeXbook pg. 443, Rule 11. + // First, we do the same steps as in overline to build the inner group + // and line + var inner = buildGroup(group.body, options.havingCrampedStyle()); + + if (inner.height === 0) { + // Render a small surd. + inner.height = options.fontMetrics().xHeight; + } // Some groups can return document fragments. Handle those by wrapping + // them in a span. + + + inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \surd delimiter + + var metrics = options.fontMetrics(); + var theta = metrics.defaultRuleThickness; + var phi = theta; + + if (options.style.id < src_Style.TEXT.id) { + phi = options.fontMetrics().xHeight; + } // Calculate the clearance between the body and line + + + var lineClearance = theta + phi / 4; + var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size + + var _delimiter$sqrtImage = delimiter.sqrtImage(minDelimiterHeight, options), + img = _delimiter$sqrtImage.span, + ruleWidth = _delimiter$sqrtImage.ruleWidth, + advanceWidth = _delimiter$sqrtImage.advanceWidth; + + var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size + + if (delimDepth > inner.height + inner.depth + lineClearance) { + lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2; + } // Shift the sqrt image + + + var imgShift = img.height - inner.height - lineClearance - ruleWidth; + inner.style.paddingLeft = advanceWidth + "em"; // Overlay the image and the argument. + + var body = buildCommon.makeVList({ + positionType: "firstBaseline", + children: [{ + type: "elem", + elem: inner, + wrapperClasses: ["svg-align"] + }, { + type: "kern", + size: -(inner.height + imgShift) + }, { + type: "elem", + elem: img + }, { + type: "kern", + size: ruleWidth + }] + }, options); + + if (!group.index) { + return buildCommon.makeSpan(["mord", "sqrt"], [body], options); + } else { + // Handle the optional root index + // The index is always in scriptscript style + var newOptions = options.havingStyle(src_Style.SCRIPTSCRIPT); + var rootm = buildGroup(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX + // source, in the definition of `\r@@t`. + + var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly + + var rootVList = buildCommon.makeVList({ + positionType: "shift", + positionData: -toShift, + children: [{ + type: "elem", + elem: rootm + }] + }, options); // Add a class surrounding it so we can add on the appropriate + // kerning + + var rootVListWrap = buildCommon.makeSpan(["root"], [rootVList]); + return buildCommon.makeSpan(["mord", "sqrt"], [rootVListWrap, body], options); + } + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var body = group.body, + index = group.index; + return index ? new mathMLTree.MathNode("mroot", [buildMathML_buildGroup(body, options), buildMathML_buildGroup(index, options)]) : new mathMLTree.MathNode("msqrt", [buildMathML_buildGroup(body, options)]); + } +}); +;// CONCATENATED MODULE: ./src/functions/styling.js + + + + + +var styling_styleMap = { + "display": src_Style.DISPLAY, + "text": src_Style.TEXT, + "script": src_Style.SCRIPT, + "scriptscript": src_Style.SCRIPTSCRIPT +}; +defineFunction({ + type: "styling", + names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], + props: { + numArgs: 0, + allowedInText: true, + primitive: true + }, + handler: function handler(_ref, args) { + var breakOnTokenText = _ref.breakOnTokenText, + funcName = _ref.funcName, + parser = _ref.parser; + // parse out the implicit body + var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g. + // here and in buildHTML and de-dupe the enumeration of all the styles). + // $FlowFixMe: The names above exactly match the styles. + + var style = funcName.slice(1, funcName.length - 5); + return { + type: "styling", + mode: parser.mode, + // Figure out what style to use by pulling out the style from + // the function name + style: style, + body: body + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Style changes are handled in the TeXbook on pg. 442, Rule 3. + var newStyle = styling_styleMap[group.style]; + var newOptions = options.havingStyle(newStyle).withFont(''); + return sizingGroup(group.body, newOptions, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // Figure out what style we're changing to. + var newStyle = styling_styleMap[group.style]; + var newOptions = options.havingStyle(newStyle); + var inner = buildMathML_buildExpression(group.body, newOptions); + var node = new mathMLTree.MathNode("mstyle", inner); + var styleAttributes = { + "display": ["0", "true"], + "text": ["0", "false"], + "script": ["1", "false"], + "scriptscript": ["2", "false"] + }; + var attr = styleAttributes[group.style]; + node.setAttribute("scriptlevel", attr[0]); + node.setAttribute("displaystyle", attr[1]); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/supsub.js + + + + + + + + + + + + + +/** + * Sometimes, groups perform special rules when they have superscripts or + * subscripts attached to them. This function lets the `supsub` group know that + * Sometimes, groups perform special rules when they have superscripts or + * its inner element should handle the superscripts and subscripts instead of + * handling them itself. + */ +var htmlBuilderDelegate = function htmlBuilderDelegate(group, options) { + var base = group.base; + + if (!base) { + return null; + } else if (base.type === "op") { + // Operators handle supsubs differently when they have limits + // (e.g. `\displaystyle\sum_2^3`) + var delegate = base.limits && (options.style.size === src_Style.DISPLAY.size || base.alwaysHandleSupSub); + return delegate ? op_htmlBuilder : null; + } else if (base.type === "operatorname") { + var _delegate = base.alwaysHandleSupSub && (options.style.size === src_Style.DISPLAY.size || base.limits); + + return _delegate ? operatorname_htmlBuilder : null; + } else if (base.type === "accent") { + return utils.isCharacterBox(base.base) ? htmlBuilder : null; + } else if (base.type === "horizBrace") { + var isSup = !group.sub; + return isSup === base.isOver ? horizBrace_htmlBuilder : null; + } else { + return null; + } +}; // Super scripts and subscripts, whose precise placement can depend on other +// functions that precede them. + + +defineFunctionBuilders({ + type: "supsub", + htmlBuilder: function htmlBuilder(group, options) { + // Superscript and subscripts are handled in the TeXbook on page + // 445-446, rules 18(a-f). + // Here is where we defer to the inner group if it should handle + // superscripts and subscripts itself. + var builderDelegate = htmlBuilderDelegate(group, options); + + if (builderDelegate) { + return builderDelegate(group, options); + } + + var valueBase = group.base, + valueSup = group.sup, + valueSub = group.sub; + var base = buildGroup(valueBase, options); + var supm; + var subm; + var metrics = options.fontMetrics(); // Rule 18a + + var supShift = 0; + var subShift = 0; + var isCharacterBox = valueBase && utils.isCharacterBox(valueBase); + + if (valueSup) { + var newOptions = options.havingStyle(options.style.sup()); + supm = buildGroup(valueSup, newOptions, options); + + if (!isCharacterBox) { + supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier; + } + } + + if (valueSub) { + var _newOptions = options.havingStyle(options.style.sub()); + + subm = buildGroup(valueSub, _newOptions, options); + + if (!isCharacterBox) { + subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier; + } + } // Rule 18c + + + var minSupShift; + + if (options.style === src_Style.DISPLAY) { + minSupShift = metrics.sup1; + } else if (options.style.cramped) { + minSupShift = metrics.sup3; + } else { + minSupShift = metrics.sup2; + } // scriptspace is a font-size-independent size, so scale it + // appropriately for use as the marginRight. + + + var multiplier = options.sizeMultiplier; + var marginRight = 0.5 / metrics.ptPerEm / multiplier + "em"; + var marginLeft = null; + + if (subm) { + // Subscripts shouldn't be shifted by the base's italic correction. + // Account for that by shifting the subscript back the appropriate + // amount. Note we only do this when the base is a single symbol. + var isOiint = group.base && group.base.type === "op" && group.base.name && (group.base.name === "\\oiint" || group.base.name === "\\oiiint"); + + if (base instanceof SymbolNode || isOiint) { + // $FlowFixMe + marginLeft = -base.italic + "em"; + } + } + + var supsub; + + if (supm && subm) { + supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); + subShift = Math.max(subShift, metrics.sub2); + var ruleWidth = metrics.defaultRuleThickness; // Rule 18e + + var maxWidth = 4 * ruleWidth; + + if (supShift - supm.depth - (subm.height - subShift) < maxWidth) { + subShift = maxWidth - (supShift - supm.depth) + subm.height; + var psi = 0.8 * metrics.xHeight - (supShift - supm.depth); + + if (psi > 0) { + supShift += psi; + subShift -= psi; + } + } + + var vlistElem = [{ + type: "elem", + elem: subm, + shift: subShift, + marginRight: marginRight, + marginLeft: marginLeft + }, { + type: "elem", + elem: supm, + shift: -supShift, + marginRight: marginRight + }]; + supsub = buildCommon.makeVList({ + positionType: "individualShift", + children: vlistElem + }, options); + } else if (subm) { + // Rule 18b + subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight); + var _vlistElem = [{ + type: "elem", + elem: subm, + marginLeft: marginLeft, + marginRight: marginRight + }]; + supsub = buildCommon.makeVList({ + positionType: "shift", + positionData: subShift, + children: _vlistElem + }, options); + } else if (supm) { + // Rule 18c, d + supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight); + supsub = buildCommon.makeVList({ + positionType: "shift", + positionData: -supShift, + children: [{ + type: "elem", + elem: supm, + marginRight: marginRight + }] + }, options); + } else { + throw new Error("supsub must have either sup or sub."); + } // Wrap the supsub vlist in a span.msupsub to reset text-align. + + + var mclass = getTypeOfDomTree(base, "right") || "mord"; + return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan(["msupsub"], [supsub])], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // Is the inner group a relevant horizonal brace? + var isBrace = false; + var isOver; + var isSup; + + if (group.base && group.base.type === "horizBrace") { + isSup = !!group.sup; + + if (isSup === group.base.isOver) { + isBrace = true; + isOver = group.base.isOver; + } + } + + if (group.base && (group.base.type === "op" || group.base.type === "operatorname")) { + group.base.parentIsSupSub = true; + } + + var children = [buildMathML_buildGroup(group.base, options)]; + + if (group.sub) { + children.push(buildMathML_buildGroup(group.sub, options)); + } + + if (group.sup) { + children.push(buildMathML_buildGroup(group.sup, options)); + } + + var nodeType; + + if (isBrace) { + nodeType = isOver ? "mover" : "munder"; + } else if (!group.sub) { + var base = group.base; + + if (base && base.type === "op" && base.limits && (options.style === src_Style.DISPLAY || base.alwaysHandleSupSub)) { + nodeType = "mover"; + } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub && (base.limits || options.style === src_Style.DISPLAY)) { + nodeType = "mover"; + } else { + nodeType = "msup"; + } + } else if (!group.sup) { + var _base = group.base; + + if (_base && _base.type === "op" && _base.limits && (options.style === src_Style.DISPLAY || _base.alwaysHandleSupSub)) { + nodeType = "munder"; + } else if (_base && _base.type === "operatorname" && _base.alwaysHandleSupSub && (_base.limits || options.style === src_Style.DISPLAY)) { + nodeType = "munder"; + } else { + nodeType = "msub"; + } + } else { + var _base2 = group.base; + + if (_base2 && _base2.type === "op" && _base2.limits && options.style === src_Style.DISPLAY) { + nodeType = "munderover"; + } else if (_base2 && _base2.type === "operatorname" && _base2.alwaysHandleSupSub && (options.style === src_Style.DISPLAY || _base2.limits)) { + nodeType = "munderover"; + } else { + nodeType = "msubsup"; + } + } + + return new mathMLTree.MathNode(nodeType, children); + } +}); +;// CONCATENATED MODULE: ./src/functions/symbolsOp.js + + + + // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. + +defineFunctionBuilders({ + type: "atom", + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.mathsym(group.text, group.mode, options, ["m" + group.family]); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mo", [makeText(group.text, group.mode)]); + + if (group.family === "bin") { + var variant = getVariant(group, options); + + if (variant === "bold-italic") { + node.setAttribute("mathvariant", variant); + } + } else if (group.family === "punct") { + node.setAttribute("separator", "true"); + } else if (group.family === "open" || group.family === "close") { + // Delims built here should not stretch vertically. + // See delimsizing.js for stretchy delims. + node.setAttribute("stretchy", "false"); + } + + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/symbolsOrd.js + + + + +// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in +// src/symbols.js. +var defaultVariant = { + "mi": "italic", + "mn": "normal", + "mtext": "normal" +}; +defineFunctionBuilders({ + type: "mathord", + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.makeOrd(group, options, "mathord"); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node = new mathMLTree.MathNode("mi", [makeText(group.text, group.mode, options)]); + var variant = getVariant(group, options) || "italic"; + + if (variant !== defaultVariant[node.type]) { + node.setAttribute("mathvariant", variant); + } + + return node; + } +}); +defineFunctionBuilders({ + type: "textord", + htmlBuilder: function htmlBuilder(group, options) { + return buildCommon.makeOrd(group, options, "textord"); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var text = makeText(group.text, group.mode, options); + var variant = getVariant(group, options) || "normal"; + var node; + + if (group.mode === 'text') { + node = new mathMLTree.MathNode("mtext", [text]); + } else if (/[0-9]/.test(group.text)) { + node = new mathMLTree.MathNode("mn", [text]); + } else if (group.text === "\\prime") { + node = new mathMLTree.MathNode("mo", [text]); + } else { + node = new mathMLTree.MathNode("mi", [text]); + } + + if (variant !== defaultVariant[node.type]) { + node.setAttribute("mathvariant", variant); + } + + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/symbolsSpacing.js + + + + // A map of CSS-based spacing functions to their CSS class. + +var cssSpace = { + "\\nobreak": "nobreak", + "\\allowbreak": "allowbreak" +}; // A lookup table to determine whether a spacing function/symbol should be +// treated like a regular space character. If a symbol or command is a key +// in this table, then it should be a regular space character. Furthermore, +// the associated value may have a `className` specifying an extra CSS class +// to add to the created `span`. + +var regularSpace = { + " ": {}, + "\\ ": {}, + "~": { + className: "nobreak" + }, + "\\space": {}, + "\\nobreakspace": { + className: "nobreak" + } +}; // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in +// src/symbols.js. + +defineFunctionBuilders({ + type: "spacing", + htmlBuilder: function htmlBuilder(group, options) { + if (regularSpace.hasOwnProperty(group.text)) { + var className = regularSpace[group.text].className || ""; // Spaces are generated by adding an actual space. Each of these + // things has an entry in the symbols table, so these will be turned + // into appropriate outputs. + + if (group.mode === "text") { + var ord = buildCommon.makeOrd(group, options, "textord"); + ord.classes.push(className); + return ord; + } else { + return buildCommon.makeSpan(["mspace", className], [buildCommon.mathsym(group.text, group.mode, options)], options); + } + } else if (cssSpace.hasOwnProperty(group.text)) { + // Spaces based on just a CSS class. + return buildCommon.makeSpan(["mspace", cssSpace[group.text]], [], options); + } else { + throw new src_ParseError("Unknown type of space \"" + group.text + "\""); + } + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var node; + + if (regularSpace.hasOwnProperty(group.text)) { + node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\xA0")]); + } else if (cssSpace.hasOwnProperty(group.text)) { + // CSS-based MathML spaces (\nobreak, \allowbreak) are ignored + return new mathMLTree.MathNode("mspace"); + } else { + throw new src_ParseError("Unknown type of space \"" + group.text + "\""); + } + + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/tag.js + + + + +var pad = function pad() { + var padNode = new mathMLTree.MathNode("mtd", []); + padNode.setAttribute("width", "50%"); + return padNode; +}; + +defineFunctionBuilders({ + type: "tag", + mathmlBuilder: function mathmlBuilder(group, options) { + var table = new mathMLTree.MathNode("mtable", [new mathMLTree.MathNode("mtr", [pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.body, options)]), pad(), new mathMLTree.MathNode("mtd", [buildExpressionRow(group.tag, options)])])]); + table.setAttribute("width", "100%"); + return table; // TODO: Left-aligned tags. + // Currently, the group and options passed here do not contain + // enough info to set tag alignment. `leqno` is in Settings but it is + // not passed to Options. On the HTML side, leqno is + // set by a CSS class applied in buildTree.js. That would have worked + // in MathML if browsers supported . Since they don't, we + // need to rewrite the way this function is called. + } +}); +;// CONCATENATED MODULE: ./src/functions/text.js + + + + // Non-mathy text, possibly in a font + +var textFontFamilies = { + "\\text": undefined, + "\\textrm": "textrm", + "\\textsf": "textsf", + "\\texttt": "texttt", + "\\textnormal": "textrm" +}; +var textFontWeights = { + "\\textbf": "textbf", + "\\textmd": "textmd" +}; +var textFontShapes = { + "\\textit": "textit", + "\\textup": "textup" +}; + +var optionsWithFont = function optionsWithFont(group, options) { + var font = group.font; // Checks if the argument is a font family or a font style. + + if (!font) { + return options; + } else if (textFontFamilies[font]) { + return options.withTextFontFamily(textFontFamilies[font]); + } else if (textFontWeights[font]) { + return options.withTextFontWeight(textFontWeights[font]); + } else { + return options.withTextFontShape(textFontShapes[font]); + } +}; + +defineFunction({ + type: "text", + names: [// Font families + "\\text", "\\textrm", "\\textsf", "\\texttt", "\\textnormal", // Font weights + "\\textbf", "\\textmd", // Font Shapes + "\\textit", "\\textup"], + props: { + numArgs: 1, + argTypes: ["text"], + allowedInArgument: true, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser, + funcName = _ref.funcName; + var body = args[0]; + return { + type: "text", + mode: parser.mode, + body: ordargument(body), + font: funcName + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var newOptions = optionsWithFont(group, options); + var inner = buildExpression(group.body, newOptions, true); + return buildCommon.makeSpan(["mord", "text"], inner, newOptions); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var newOptions = optionsWithFont(group, options); + return buildExpressionRow(group.body, newOptions); + } +}); +;// CONCATENATED MODULE: ./src/functions/underline.js + + + + + +defineFunction({ + type: "underline", + names: ["\\underline"], + props: { + numArgs: 1, + allowedInText: true + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "underline", + mode: parser.mode, + body: args[0] + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + // Underlines are handled in the TeXbook pg 443, Rule 10. + // Build the inner group. + var innerGroup = buildGroup(group.body, options); // Create the line to go below the body + + var line = buildCommon.makeLineSpan("underline-line", options); // Generate the vlist, with the appropriate kerns + + var defaultRuleThickness = options.fontMetrics().defaultRuleThickness; + var vlist = buildCommon.makeVList({ + positionType: "top", + positionData: innerGroup.height, + children: [{ + type: "kern", + size: defaultRuleThickness + }, { + type: "elem", + elem: line + }, { + type: "kern", + size: 3 * defaultRuleThickness + }, { + type: "elem", + elem: innerGroup + }] + }, options); + return buildCommon.makeSpan(["mord", "underline"], [vlist], options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var operator = new mathMLTree.MathNode("mo", [new mathMLTree.TextNode("\u203E")]); + operator.setAttribute("stretchy", "true"); + var node = new mathMLTree.MathNode("munder", [buildMathML_buildGroup(group.body, options), operator]); + node.setAttribute("accentunder", "true"); + return node; + } +}); +;// CONCATENATED MODULE: ./src/functions/vcenter.js + + + + + // \vcenter: Vertically center the argument group on the math axis. + +defineFunction({ + type: "vcenter", + names: ["\\vcenter"], + props: { + numArgs: 1, + argTypes: ["original"], + // In LaTeX, \vcenter can act only on a box. + allowedInText: false + }, + handler: function handler(_ref, args) { + var parser = _ref.parser; + return { + type: "vcenter", + mode: parser.mode, + body: args[0] + }; + }, + htmlBuilder: function htmlBuilder(group, options) { + var body = buildGroup(group.body, options); + var axisHeight = options.fontMetrics().axisHeight; + var dy = 0.5 * (body.height - axisHeight - (body.depth + axisHeight)); + return buildCommon.makeVList({ + positionType: "shift", + positionData: dy, + children: [{ + type: "elem", + elem: body + }] + }, options); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + // There is no way to do this in MathML. + // Write a class as a breadcrumb in case some post-processor wants + // to perform a vcenter adjustment. + return new mathMLTree.MathNode("mpadded", [buildMathML_buildGroup(group.body, options)], ["vcenter"]); + } +}); +;// CONCATENATED MODULE: ./src/functions/verb.js + + + + +defineFunction({ + type: "verb", + names: ["\\verb"], + props: { + numArgs: 0, + allowedInText: true + }, + handler: function handler(context, args, optArgs) { + // \verb and \verb* are dealt with directly in Parser.js. + // If we end up here, it's because of a failure to match the two delimiters + // in the regex in Lexer.js. LaTeX raises the following error when \verb is + // terminated by end of line (or file). + throw new src_ParseError("\\verb ended by end of line instead of matching delimiter"); + }, + htmlBuilder: function htmlBuilder(group, options) { + var text = makeVerb(group); + var body = []; // \verb enters text mode and therefore is sized like \textstyle + + var newOptions = options.havingStyle(options.style.text()); + + for (var i = 0; i < text.length; i++) { + var c = text[i]; + + if (c === '~') { + c = '\\textasciitilde'; + } + + body.push(buildCommon.makeSymbol(c, "Typewriter-Regular", group.mode, newOptions, ["mord", "texttt"])); + } + + return buildCommon.makeSpan(["mord", "text"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions); + }, + mathmlBuilder: function mathmlBuilder(group, options) { + var text = new mathMLTree.TextNode(makeVerb(group)); + var node = new mathMLTree.MathNode("mtext", [text]); + node.setAttribute("mathvariant", "monospace"); + return node; + } +}); +/** + * Converts verb group into body string. + * + * \verb* replaces each space with an open box \u2423 + * \verb replaces each space with a no-break space \xA0 + */ + +var makeVerb = function makeVerb(group) { + return group.body.replace(/ /g, group.star ? "\u2423" : '\xA0'); +}; +;// CONCATENATED MODULE: ./src/functions.js +/** Include this to ensure that all functions are defined. */ + +var functions = _functions; +/* harmony default export */ var src_functions = (functions); // TODO(kevinb): have functions return an object and call defineFunction with +// that object in this file instead of relying on side-effects. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +;// CONCATENATED MODULE: ./src/SourceLocation.js +/** + * Lexing or parsing positional information for error reporting. + * This object is immutable. + */ +var SourceLocation = /*#__PURE__*/function () { + // The + prefix indicates that these fields aren't writeable + // Lexer holding the input string. + // Start offset, zero-based inclusive. + // End offset, zero-based exclusive. + function SourceLocation(lexer, start, end) { + this.lexer = void 0; + this.start = void 0; + this.end = void 0; + this.lexer = lexer; + this.start = start; + this.end = end; + } + /** + * Merges two `SourceLocation`s from location providers, given they are + * provided in order of appearance. + * - Returns the first one's location if only the first is provided. + * - Returns a merged range of the first and the last if both are provided + * and their lexers match. + * - Otherwise, returns null. + */ + + + SourceLocation.range = function range(first, second) { + if (!second) { + return first && first.loc; + } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { + return null; + } else { + return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); + } + }; + + return SourceLocation; +}(); + + +;// CONCATENATED MODULE: ./src/Token.js + +/** + * Interface required to break circular dependency between Token, Lexer, and + * ParseError. + */ + +/** + * The resulting token returned from `lex`. + * + * It consists of the token text plus some position information. + * The position information is essentially a range in an input string, + * but instead of referencing the bare input string, we refer to the lexer. + * That way it is possible to attach extra metadata to the input string, + * like for example a file name or similar. + * + * The position information is optional, so it is OK to construct synthetic + * tokens if appropriate. Not providing available position information may + * lead to degraded error reporting, though. + */ +var Token = /*#__PURE__*/function () { + // don't expand the token + // used in \noexpand + function Token(text, // the text of this token + loc) { + this.text = void 0; + this.loc = void 0; + this.noexpand = void 0; + this.treatAsRelax = void 0; + this.text = text; + this.loc = loc; + } + /** + * Given a pair of tokens (this and endToken), compute a `Token` encompassing + * the whole input range enclosed by these two. + */ + + + var _proto = Token.prototype; + + _proto.range = function range(endToken, // last token of the range, inclusive + text) { + return new Token(text, SourceLocation.range(this, endToken)); + }; + + return Token; +}(); +;// CONCATENATED MODULE: ./src/Lexer.js +/** + * The Lexer class handles tokenizing the input in various ways. Since our + * parser expects us to be able to backtrack, the lexer allows lexing from any + * given starting point. + * + * Its main exposed function is the `lex` function, which takes a position to + * lex from and a type of token to lex. It defers to the appropriate `_innerLex` + * function. + * + * The various `_innerLex` functions perform the actual lexing of different + * kinds. + */ + + + + +/* The following tokenRegex + * - matches typical whitespace (but not NBSP etc.) using its first group + * - does not match any control character \x00-\x1f except whitespace + * - does not match a bare backslash + * - matches any ASCII character except those just mentioned + * - does not match the BMP private use area \uE000-\uF8FF + * - does not match bare surrogate code units + * - matches any BMP character except for those just described + * - matches any valid Unicode surrogate pair + * - matches a backslash followed by one or more letters + * - matches a backslash followed by any BMP character, including newline + * Just because the Lexer matches something doesn't mean it's valid input: + * If there is no matching function or symbol definition, the Parser will + * still reject the input. + */ +var spaceRegexString = "[ \r\n\t]"; +var controlWordRegexString = "\\\\[a-zA-Z@]+"; +var controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; +var controlWordWhitespaceRegexString = "" + controlWordRegexString + spaceRegexString + "*"; +var controlWordWhitespaceRegex = new RegExp("^(" + controlWordRegexString + ")" + spaceRegexString + "*$"); +var combiningDiacriticalMarkString = "[\u0300-\u036F]"; +var combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + "+$"); +var tokenRegexString = "(" + spaceRegexString + "+)|" + // whitespace +"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + ( // single codepoint +combiningDiacriticalMarkString + "*") + // ...plus accents +"|[\uD800-\uDBFF][\uDC00-\uDFFF]" + ( // surrogate pair +combiningDiacriticalMarkString + "*") + // ...plus accents +"|\\\\verb\\*([^]).*?\\3" + // \verb* +"|\\\\verb([^*a-zA-Z]).*?\\4" + // \verb unstarred +"|\\\\operatorname\\*" + ( // \operatorname* +"|" + controlWordWhitespaceRegexString) + ( // \macroName + spaces +"|" + controlSymbolRegexString + ")"); // \\, \', etc. + +/** Main Lexer class */ + +var Lexer = /*#__PURE__*/function () { + // category codes, only supports comment characters (14) for now + function Lexer(input, settings) { + this.input = void 0; + this.settings = void 0; + this.tokenRegex = void 0; + this.catcodes = void 0; + // Separate accents from characters + this.input = input; + this.settings = settings; + this.tokenRegex = new RegExp(tokenRegexString, 'g'); + this.catcodes = { + "%": 14 // comment character + + }; + } + + var _proto = Lexer.prototype; + + _proto.setCatcode = function setCatcode(char, code) { + this.catcodes[char] = code; + } + /** + * This function lexes a single token. + */ + ; + + _proto.lex = function lex() { + var input = this.input; + var pos = this.tokenRegex.lastIndex; + + if (pos === input.length) { + return new Token("EOF", new SourceLocation(this, pos, pos)); + } + + var match = this.tokenRegex.exec(input); + + if (match === null || match.index !== pos) { + throw new src_ParseError("Unexpected character: '" + input[pos] + "'", new Token(input[pos], new SourceLocation(this, pos, pos + 1))); + } + + var text = match[2] || " "; + + if (this.catcodes[text] === 14) { + // comment character + var nlIndex = input.indexOf('\n', this.tokenRegex.lastIndex); + + if (nlIndex === -1) { + this.tokenRegex.lastIndex = input.length; // EOF + + this.settings.reportNonstrict("commentAtEnd", "% comment has no terminating newline; LaTeX would " + "fail because of commenting the end of math mode (e.g. $)"); + } else { + this.tokenRegex.lastIndex = nlIndex + 1; + } + + return this.lex(); + } // Trim any trailing whitespace from control word match + + + var controlMatch = text.match(controlWordWhitespaceRegex); + + if (controlMatch) { + text = controlMatch[1]; + } + + return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); + }; + + return Lexer; +}(); + + +;// CONCATENATED MODULE: ./src/Namespace.js +/** + * A `Namespace` refers to a space of nameable things like macros or lengths, + * which can be `set` either globally or local to a nested group, using an + * undo stack similar to how TeX implements this functionality. + * Performance-wise, `get` and local `set` take constant time, while global + * `set` takes time proportional to the depth of group nesting. + */ + + +var Namespace = /*#__PURE__*/function () { + /** + * Both arguments are optional. The first argument is an object of + * built-in mappings which never change. The second argument is an object + * of initial (global-level) mappings, which will constantly change + * according to any global/top-level `set`s done. + */ + function Namespace(builtins, globalMacros) { + if (builtins === void 0) { + builtins = {}; + } + + if (globalMacros === void 0) { + globalMacros = {}; + } + + this.current = void 0; + this.builtins = void 0; + this.undefStack = void 0; + this.current = globalMacros; + this.builtins = builtins; + this.undefStack = []; + } + /** + * Start a new nested group, affecting future local `set`s. + */ + + + var _proto = Namespace.prototype; + + _proto.beginGroup = function beginGroup() { + this.undefStack.push({}); + } + /** + * End current nested group, restoring values before the group began. + */ + ; + + _proto.endGroup = function endGroup() { + if (this.undefStack.length === 0) { + throw new src_ParseError("Unbalanced namespace destruction: attempt " + "to pop global namespace; please report this as a bug"); + } + + var undefs = this.undefStack.pop(); + + for (var undef in undefs) { + if (undefs.hasOwnProperty(undef)) { + if (undefs[undef] === undefined) { + delete this.current[undef]; + } else { + this.current[undef] = undefs[undef]; + } + } + } + } + /** + * Detect whether `name` has a definition. Equivalent to + * `get(name) != null`. + */ + ; + + _proto.has = function has(name) { + return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name); + } + /** + * Get the current value of a name, or `undefined` if there is no value. + * + * Note: Do not use `if (namespace.get(...))` to detect whether a macro + * is defined, as the definition may be the empty string which evaluates + * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or + * `if (namespace.has(...))`. + */ + ; + + _proto.get = function get(name) { + if (this.current.hasOwnProperty(name)) { + return this.current[name]; + } else { + return this.builtins[name]; + } + } + /** + * Set the current value of a name, and optionally set it globally too. + * Local set() sets the current value and (when appropriate) adds an undo + * operation to the undo stack. Global set() may change the undo + * operation at every level, so takes time linear in their number. + */ + ; + + _proto.set = function set(name, value, global) { + if (global === void 0) { + global = false; + } + + if (global) { + // Global set is equivalent to setting in all groups. Simulate this + // by destroying any undos currently scheduled for this name, + // and adding an undo with the *new* value (in case it later gets + // locally reset within this environment). + for (var i = 0; i < this.undefStack.length; i++) { + delete this.undefStack[i][name]; + } + + if (this.undefStack.length > 0) { + this.undefStack[this.undefStack.length - 1][name] = value; + } + } else { + // Undo this set at end of this group (possibly to `undefined`), + // unless an undo is already in place, in which case that older + // value is the correct one. + var top = this.undefStack[this.undefStack.length - 1]; + + if (top && !top.hasOwnProperty(name)) { + top[name] = this.current[name]; + } + } + + this.current[name] = value; + }; + + return Namespace; +}(); + + +;// CONCATENATED MODULE: ./src/macros.js +/** + * Predefined macros for KaTeX. + * This can be used to define some commands in terms of others. + */ + + + + + + +var builtinMacros = {}; +/* harmony default export */ var macros = (builtinMacros); // This function might one day accept an additional argument and do more things. + +function defineMacro(name, body) { + builtinMacros[name] = body; +} ////////////////////////////////////////////////////////////////////// +// macro tools + +defineMacro("\\noexpand", function (context) { + // The expansion is the token itself; but that token is interpreted + // as if its meaning were ‘\relax’ if it is a control sequence that + // would ordinarily be expanded by TeX’s expansion rules. + var t = context.popToken(); + + if (context.isExpandable(t.text)) { + t.noexpand = true; + t.treatAsRelax = true; + } + + return { + tokens: [t], + numArgs: 0 + }; +}); +defineMacro("\\expandafter", function (context) { + // TeX first reads the token that comes immediately after \expandafter, + // without expanding it; let’s call this token t. Then TeX reads the + // token that comes after t (and possibly more tokens, if that token + // has an argument), replacing it by its expansion. Finally TeX puts + // t back in front of that expansion. + var t = context.popToken(); + context.expandOnce(true); // expand only an expandable token + + return { + tokens: [t], + numArgs: 0 + }; +}); // LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 +// TeX source: \long\def\@firstoftwo#1#2{#1} + +defineMacro("\\@firstoftwo", function (context) { + var args = context.consumeArgs(2); + return { + tokens: args[0], + numArgs: 0 + }; +}); // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 +// TeX source: \long\def\@secondoftwo#1#2{#2} + +defineMacro("\\@secondoftwo", function (context) { + var args = context.consumeArgs(2); + return { + tokens: args[1], + numArgs: 0 + }; +}); // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) +// symbol that isn't a space, consuming any spaces but not consuming the +// first nonspace character. If that nonspace character matches #1, then +// the macro expands to #2; otherwise, it expands to #3. + +defineMacro("\\@ifnextchar", function (context) { + var args = context.consumeArgs(3); // symbol, if, else + + context.consumeSpaces(); + var nextToken = context.future(); + + if (args[0].length === 1 && args[0][0].text === nextToken.text) { + return { + tokens: args[1], + numArgs: 0 + }; + } else { + return { + tokens: args[2], + numArgs: 0 + }; + } +}); // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. +// If it is `*`, then it consumes the symbol, and the macro expands to #1; +// otherwise, the macro expands to #2 (without consuming the symbol). +// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} + +defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode + +defineMacro("\\TextOrMath", function (context) { + var args = context.consumeArgs(2); + + if (context.mode === 'text') { + return { + tokens: args[0], + numArgs: 0 + }; + } else { + return { + tokens: args[1], + numArgs: 0 + }; + } +}); // Lookup table for parsing numbers in base 8 through 16 + +var digitToNumber = { + "0": 0, + "1": 1, + "2": 2, + "3": 3, + "4": 4, + "5": 5, + "6": 6, + "7": 7, + "8": 8, + "9": 9, + "a": 10, + "A": 10, + "b": 11, + "B": 11, + "c": 12, + "C": 12, + "d": 13, + "D": 13, + "e": 14, + "E": 14, + "f": 15, + "F": 15 +}; // TeX \char makes a literal character (catcode 12) using the following forms: +// (see The TeXBook, p. 43) +// \char123 -- decimal +// \char'123 -- octal +// \char"123 -- hex +// \char`x -- character that can be written (i.e. isn't active) +// \char`\x -- character that cannot be written (e.g. %) +// These all refer to characters from the font, so we turn them into special +// calls to a function \@char dealt with in the Parser. + +defineMacro("\\char", function (context) { + var token = context.popToken(); + var base; + var number = ''; + + if (token.text === "'") { + base = 8; + token = context.popToken(); + } else if (token.text === '"') { + base = 16; + token = context.popToken(); + } else if (token.text === "`") { + token = context.popToken(); + + if (token.text[0] === "\\") { + number = token.text.charCodeAt(1); + } else if (token.text === "EOF") { + throw new src_ParseError("\\char` missing argument"); + } else { + number = token.text.charCodeAt(0); + } + } else { + base = 10; + } + + if (base) { + // Parse a number in the given base, starting with first `token`. + number = digitToNumber[token.text]; + + if (number == null || number >= base) { + throw new src_ParseError("Invalid base-" + base + " digit " + token.text); + } + + var digit; + + while ((digit = digitToNumber[context.future().text]) != null && digit < base) { + number *= base; + number += digit; + context.popToken(); + } + } + + return "\\@char{" + number + "}"; +}); // \newcommand{\macro}[args]{definition} +// \renewcommand{\macro}[args]{definition} +// TODO: Optional arguments: \newcommand{\macro}[args][default]{definition} + +var newcommand = function newcommand(context, existsOK, nonexistsOK) { + var arg = context.consumeArg().tokens; + + if (arg.length !== 1) { + throw new src_ParseError("\\newcommand's first argument must be a macro name"); + } + + var name = arg[0].text; + var exists = context.isDefined(name); + + if (exists && !existsOK) { + throw new src_ParseError("\\newcommand{" + name + "} attempting to redefine " + (name + "; use \\renewcommand")); + } + + if (!exists && !nonexistsOK) { + throw new src_ParseError("\\renewcommand{" + name + "} when command " + name + " " + "does not yet exist; use \\newcommand"); + } + + var numArgs = 0; + arg = context.consumeArg().tokens; + + if (arg.length === 1 && arg[0].text === "[") { + var argText = ''; + var token = context.expandNextToken(); + + while (token.text !== "]" && token.text !== "EOF") { + // TODO: Should properly expand arg, e.g., ignore {}s + argText += token.text; + token = context.expandNextToken(); + } + + if (!argText.match(/^\s*[0-9]+\s*$/)) { + throw new src_ParseError("Invalid number of arguments: " + argText); + } + + numArgs = parseInt(argText); + arg = context.consumeArg().tokens; + } // Final arg is the expansion of the macro + + + context.macros.set(name, { + tokens: arg, + numArgs: numArgs + }); + return ''; +}; + +defineMacro("\\newcommand", function (context) { + return newcommand(context, false, true); +}); +defineMacro("\\renewcommand", function (context) { + return newcommand(context, true, false); +}); +defineMacro("\\providecommand", function (context) { + return newcommand(context, true, true); +}); // terminal (console) tools + +defineMacro("\\message", function (context) { + var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console + + console.log(arg.reverse().map(function (token) { + return token.text; + }).join("")); + return ''; +}); +defineMacro("\\errmessage", function (context) { + var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console + + console.error(arg.reverse().map(function (token) { + return token.text; + }).join("")); + return ''; +}); +defineMacro("\\show", function (context) { + var tok = context.popToken(); + var name = tok.text; // eslint-disable-next-line no-console + + console.log(tok, context.macros.get(name), src_functions[name], src_symbols.math[name], src_symbols.text[name]); + return ''; +}); ////////////////////////////////////////////////////////////////////// +// Grouping +// \let\bgroup={ \let\egroup=} + +defineMacro("\\bgroup", "{"); +defineMacro("\\egroup", "}"); // Symbols from latex.ltx: +// \def\lq{`} +// \def\rq{'} +// \def \aa {\r a} +// \def \AA {\r A} + +defineMacro("\\lq", "`"); +defineMacro("\\rq", "'"); +defineMacro("\\aa", "\\r a"); +defineMacro("\\AA", "\\r A"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML. +// \DeclareTextCommandDefault{\textcopyright}{\textcircled{c}} +// \DeclareTextCommandDefault{\textregistered}{\textcircled{% +// \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}} +// \DeclareRobustCommand{\copyright}{% +// \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi} + +defineMacro("\\textcopyright", "\\html@mathml{\\textcircled{c}}{\\char`©}"); +defineMacro("\\copyright", "\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"); +defineMacro("\\textregistered", "\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`®}"); // Characters omitted from Unicode range 1D400–1D7FF + +defineMacro("\u212C", "\\mathscr{B}"); // script + +defineMacro("\u2130", "\\mathscr{E}"); +defineMacro("\u2131", "\\mathscr{F}"); +defineMacro("\u210B", "\\mathscr{H}"); +defineMacro("\u2110", "\\mathscr{I}"); +defineMacro("\u2112", "\\mathscr{L}"); +defineMacro("\u2133", "\\mathscr{M}"); +defineMacro("\u211B", "\\mathscr{R}"); +defineMacro("\u212D", "\\mathfrak{C}"); // Fraktur + +defineMacro("\u210C", "\\mathfrak{H}"); +defineMacro("\u2128", "\\mathfrak{Z}"); // Define \Bbbk with a macro that works in both HTML and MathML. + +defineMacro("\\Bbbk", "\\Bbb{k}"); // Unicode middle dot +// The KaTeX fonts do not contain U+00B7. Instead, \cdotp displays +// the dot at U+22C5 and gives it punct spacing. + +defineMacro("\xB7", "\\cdotp"); // \llap and \rlap render their contents in text mode + +defineMacro("\\llap", "\\mathllap{\\textrm{#1}}"); +defineMacro("\\rlap", "\\mathrlap{\\textrm{#1}}"); +defineMacro("\\clap", "\\mathclap{\\textrm{#1}}"); // \mathstrut from the TeXbook, p 360 + +defineMacro("\\mathstrut", "\\vphantom{(}"); // \underbar from TeXbook p 353 + +defineMacro("\\underbar", "\\underline{\\text{#1}}"); // \not is defined by base/fontmath.ltx via +// \DeclareMathSymbol{\not}{\mathrel}{symbols}{"36} +// It's thus treated like a \mathrel, but defined by a symbol that has zero +// width but extends to the right. We use \rlap to get that spacing. +// For MathML we write U+0338 here. buildMathML.js will then do the overlay. + +defineMacro("\\not", '\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'); // Negated symbols from base/fontmath.ltx: +// \def\neq{\not=} \let\ne=\neq +// \DeclareRobustCommand +// \notin{\mathrel{\m@th\mathpalette\c@ncel\in}} +// \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} + +defineMacro("\\neq", "\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}"); +defineMacro("\\ne", "\\neq"); +defineMacro("\u2260", "\\neq"); +defineMacro("\\notin", "\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}" + "{\\mathrel{\\char`∉}}"); +defineMacro("\u2209", "\\notin"); // Unicode stacked relations + +defineMacro("\u2258", "\\html@mathml{" + "\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}" + "}{\\mathrel{\\char`\u2258}}"); +defineMacro("\u2259", "\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"); +defineMacro("\u225A", "\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}"); +defineMacro("\u225B", "\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}" + "{\\mathrel{\\char`\u225B}}"); +defineMacro("\u225D", "\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}" + "{\\mathrel{\\char`\u225D}}"); +defineMacro("\u225E", "\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}" + "{\\mathrel{\\char`\u225E}}"); +defineMacro("\u225F", "\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}"); // Misc Unicode + +defineMacro("\u27C2", "\\perp"); +defineMacro("\u203C", "\\mathclose{!\\mkern-0.8mu!}"); +defineMacro("\u220C", "\\notni"); +defineMacro("\u231C", "\\ulcorner"); +defineMacro("\u231D", "\\urcorner"); +defineMacro("\u231E", "\\llcorner"); +defineMacro("\u231F", "\\lrcorner"); +defineMacro("\xA9", "\\copyright"); +defineMacro("\xAE", "\\textregistered"); +defineMacro("\uFE0F", "\\textregistered"); // The KaTeX fonts have corners at codepoints that don't match Unicode. +// For MathML purposes, use the Unicode code point. + +defineMacro("\\ulcorner", "\\html@mathml{\\@ulcorner}{\\mathop{\\char\"231c}}"); +defineMacro("\\urcorner", "\\html@mathml{\\@urcorner}{\\mathop{\\char\"231d}}"); +defineMacro("\\llcorner", "\\html@mathml{\\@llcorner}{\\mathop{\\char\"231e}}"); +defineMacro("\\lrcorner", "\\html@mathml{\\@lrcorner}{\\mathop{\\char\"231f}}"); ////////////////////////////////////////////////////////////////////// +// LaTeX_2ε +// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ +// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} +// We'll call \varvdots, which gets a glyph from symbols.js. +// The zero-width rule gets us an equivalent to the vertical 6pt kern. + +defineMacro("\\vdots", "\\mathord{\\varvdots\\rule{0pt}{15pt}}"); +defineMacro("\u22EE", "\\vdots"); ////////////////////////////////////////////////////////////////////// +// amsmath.sty +// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf +// Italic Greek capital letters. AMS defines these with \DeclareMathSymbol, +// but they are equivalent to \mathit{\Letter}. + +defineMacro("\\varGamma", "\\mathit{\\Gamma}"); +defineMacro("\\varDelta", "\\mathit{\\Delta}"); +defineMacro("\\varTheta", "\\mathit{\\Theta}"); +defineMacro("\\varLambda", "\\mathit{\\Lambda}"); +defineMacro("\\varXi", "\\mathit{\\Xi}"); +defineMacro("\\varPi", "\\mathit{\\Pi}"); +defineMacro("\\varSigma", "\\mathit{\\Sigma}"); +defineMacro("\\varUpsilon", "\\mathit{\\Upsilon}"); +defineMacro("\\varPhi", "\\mathit{\\Phi}"); +defineMacro("\\varPsi", "\\mathit{\\Psi}"); +defineMacro("\\varOmega", "\\mathit{\\Omega}"); //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} + +defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); // \renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript +// \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} + +defineMacro("\\colon", "\\nobreak\\mskip2mu\\mathpunct{}" + "\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu"); // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} + +defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}"); // \def\iff{\DOTSB\;\Longleftrightarrow\;} +// \def\implies{\DOTSB\;\Longrightarrow\;} +// \def\impliedby{\DOTSB\;\Longleftarrow\;} + +defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); +defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); +defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); // AMSMath's automatic \dots, based on \mdots@@ macro. + +var dotsByToken = { + ',': '\\dotsc', + '\\not': '\\dotsb', + // \keybin@ checks for the following: + '+': '\\dotsb', + '=': '\\dotsb', + '<': '\\dotsb', + '>': '\\dotsb', + '-': '\\dotsb', + '*': '\\dotsb', + ':': '\\dotsb', + // Symbols whose definition starts with \DOTSB: + '\\DOTSB': '\\dotsb', + '\\coprod': '\\dotsb', + '\\bigvee': '\\dotsb', + '\\bigwedge': '\\dotsb', + '\\biguplus': '\\dotsb', + '\\bigcap': '\\dotsb', + '\\bigcup': '\\dotsb', + '\\prod': '\\dotsb', + '\\sum': '\\dotsb', + '\\bigotimes': '\\dotsb', + '\\bigoplus': '\\dotsb', + '\\bigodot': '\\dotsb', + '\\bigsqcup': '\\dotsb', + '\\And': '\\dotsb', + '\\longrightarrow': '\\dotsb', + '\\Longrightarrow': '\\dotsb', + '\\longleftarrow': '\\dotsb', + '\\Longleftarrow': '\\dotsb', + '\\longleftrightarrow': '\\dotsb', + '\\Longleftrightarrow': '\\dotsb', + '\\mapsto': '\\dotsb', + '\\longmapsto': '\\dotsb', + '\\hookrightarrow': '\\dotsb', + '\\doteq': '\\dotsb', + // Symbols whose definition starts with \mathbin: + '\\mathbin': '\\dotsb', + // Symbols whose definition starts with \mathrel: + '\\mathrel': '\\dotsb', + '\\relbar': '\\dotsb', + '\\Relbar': '\\dotsb', + '\\xrightarrow': '\\dotsb', + '\\xleftarrow': '\\dotsb', + // Symbols whose definition starts with \DOTSI: + '\\DOTSI': '\\dotsi', + '\\int': '\\dotsi', + '\\oint': '\\dotsi', + '\\iint': '\\dotsi', + '\\iiint': '\\dotsi', + '\\iiiint': '\\dotsi', + '\\idotsint': '\\dotsi', + // Symbols whose definition starts with \DOTSX: + '\\DOTSX': '\\dotsx' +}; +defineMacro("\\dots", function (context) { + // TODO: If used in text mode, should expand to \textellipsis. + // However, in KaTeX, \textellipsis and \ldots behave the same + // (in text mode), and it's unlikely we'd see any of the math commands + // that affect the behavior of \dots when in text mode. So fine for now + // (until we support \ifmmode ... \else ... \fi). + var thedots = '\\dotso'; + var next = context.expandAfterFuture().text; + + if (next in dotsByToken) { + thedots = dotsByToken[next]; + } else if (next.substr(0, 4) === '\\not') { + thedots = '\\dotsb'; + } else if (next in src_symbols.math) { + if (utils.contains(['bin', 'rel'], src_symbols.math[next].group)) { + thedots = '\\dotsb'; + } + } + + return thedots; +}); +var spaceAfterDots = { + // \rightdelim@ checks for the following: + ')': true, + ']': true, + '\\rbrack': true, + '\\}': true, + '\\rbrace': true, + '\\rangle': true, + '\\rceil': true, + '\\rfloor': true, + '\\rgroup': true, + '\\rmoustache': true, + '\\right': true, + '\\bigr': true, + '\\biggr': true, + '\\Bigr': true, + '\\Biggr': true, + // \extra@ also tests for the following: + '$': true, + // \extrap@ checks for the following: + ';': true, + '.': true, + ',': true +}; +defineMacro("\\dotso", function (context) { + var next = context.future().text; + + if (next in spaceAfterDots) { + return "\\ldots\\,"; + } else { + return "\\ldots"; + } +}); +defineMacro("\\dotsc", function (context) { + var next = context.future().text; // \dotsc uses \extra@ but not \extrap@, instead specially checking for + // ';' and '.', but doesn't check for ','. + + if (next in spaceAfterDots && next !== ',') { + return "\\ldots\\,"; + } else { + return "\\ldots"; + } +}); +defineMacro("\\cdots", function (context) { + var next = context.future().text; + + if (next in spaceAfterDots) { + return "\\@cdots\\,"; + } else { + return "\\@cdots"; + } +}); +defineMacro("\\dotsb", "\\cdots"); +defineMacro("\\dotsm", "\\cdots"); +defineMacro("\\dotsi", "\\!\\cdots"); // amsmath doesn't actually define \dotsx, but \dots followed by a macro +// starting with \DOTSX implies \dotso, and then \extra@ detects this case +// and forces the added `\,`. + +defineMacro("\\dotsx", "\\ldots\\,"); // \let\DOTSI\relax +// \let\DOTSB\relax +// \let\DOTSX\relax + +defineMacro("\\DOTSI", "\\relax"); +defineMacro("\\DOTSB", "\\relax"); +defineMacro("\\DOTSX", "\\relax"); // Spacing, based on amsmath.sty's override of LaTeX defaults +// \DeclareRobustCommand{\tmspace}[3]{% +// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} + +defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} +// TODO: math mode should use \thinmuskip + +defineMacro("\\,", "\\tmspace+{3mu}{.1667em}"); // \let\thinspace\, + +defineMacro("\\thinspace", "\\,"); // \def\>{\mskip\medmuskip} +// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} +// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu + +defineMacro("\\>", "\\mskip{4mu}"); +defineMacro("\\:", "\\tmspace+{4mu}{.2222em}"); // \let\medspace\: + +defineMacro("\\medspace", "\\:"); // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} +// TODO: math mode should use \thickmuskip = 5mu plus 5mu + +defineMacro("\\;", "\\tmspace+{5mu}{.2777em}"); // \let\thickspace\; + +defineMacro("\\thickspace", "\\;"); // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} +// TODO: math mode should use \thinmuskip + +defineMacro("\\!", "\\tmspace-{3mu}{.1667em}"); // \let\negthinspace\! + +defineMacro("\\negthinspace", "\\!"); // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} +// TODO: math mode should use \medmuskip + +defineMacro("\\negmedspace", "\\tmspace-{4mu}{.2222em}"); // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} +// TODO: math mode should use \thickmuskip + +defineMacro("\\negthickspace", "\\tmspace-{5mu}{.277em}"); // \def\enspace{\kern.5em } + +defineMacro("\\enspace", "\\kern.5em "); // \def\enskip{\hskip.5em\relax} + +defineMacro("\\enskip", "\\hskip.5em\\relax"); // \def\quad{\hskip1em\relax} + +defineMacro("\\quad", "\\hskip1em\\relax"); // \def\qquad{\hskip2em\relax} + +defineMacro("\\qquad", "\\hskip2em\\relax"); // \tag@in@display form of \tag + +defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); +defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); +defineMacro("\\tag@literal", function (context) { + if (context.macros.get("\\df@tag")) { + throw new src_ParseError("Multiple \\tag"); + } + + return "\\gdef\\df@tag{\\text{#1}}"; +}); // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin +// {\operator@font mod}\penalty900 +// \mkern5mu\nonscript\mskip-\medmuskip} +// \newcommand{\pod}[1]{\allowbreak +// \if@display\mkern18mu\else\mkern8mu\fi(#1)} +// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} +// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu +// \else\mkern12mu\fi{\operator@font mod}\,\,#1} +// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu + +defineMacro("\\bmod", "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}" + "\\mathbin{\\rm mod}" + "\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"); +defineMacro("\\pod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"); +defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); +defineMacro("\\mod", "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + "{\\rm mod}\\,\\,#1"); // \pmb -- A simulation of bold. +// The version in ambsy.sty works by typesetting three copies of the argument +// with small offsets. We use two copies. We omit the vertical offset because +// of rendering problems that makeVList encounters in Safari. + +defineMacro("\\pmb", "\\html@mathml{" + "\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}" + "{\\mathbf{#1}}"); ////////////////////////////////////////////////////////////////////// +// LaTeX source2e +// \expandafter\let\expandafter\@normalcr +// \csname\expandafter\@gobble\string\\ \endcsname +// \DeclareRobustCommand\newline{\@normalcr\relax} + +defineMacro("\\newline", "\\\\\\relax"); // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} +// TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't +// support \@ yet, so that's omitted, and we add \text so that the result +// doesn't look funny in math mode. + +defineMacro("\\TeX", "\\textrm{\\html@mathml{" + "T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX" + "}{TeX}}"); // \DeclareRobustCommand{\LaTeX}{L\kern-.36em% +// {\sbox\z@ T% +// \vbox to\ht\z@{\hbox{\check@mathfonts +// \fontsize\sf@size\z@ +// \math@fontsfalse\selectfont +// A}% +// \vss}% +// }% +// \kern-.15em% +// \TeX} +// This code aligns the top of the A with the T (from the perspective of TeX's +// boxes, though visually the A appears to extend above slightly). +// We compute the corresponding \raisebox when A is rendered in \normalsize +// \scriptstyle, which has a scale factor of 0.7 (see Options.js). + +var latexRaiseA = fontMetricsData["Main-Regular"]["T".charCodeAt(0)][1] - 0.7 * fontMetricsData["Main-Regular"]["A".charCodeAt(0)][1] + "em"; +defineMacro("\\LaTeX", "\\textrm{\\html@mathml{" + ("L\\kern-.36em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{LaTeX}}"); // New KaTeX logo based on tweaking LaTeX logo + +defineMacro("\\KaTeX", "\\textrm{\\html@mathml{" + ("K\\kern-.17em\\raisebox{" + latexRaiseA + "}{\\scriptstyle A}") + "\\kern-.15em\\TeX}{KaTeX}}"); // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} +// \def\@hspace#1{\hskip #1\relax} +// \def\@hspacer#1{\vrule \@width\z@\nobreak +// \hskip #1\hskip \z@skip} + +defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); +defineMacro("\\@hspace", "\\hskip #1\\relax"); +defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); ////////////////////////////////////////////////////////////////////// +// mathtools.sty +//\providecommand\ordinarycolon{:} + +defineMacro("\\ordinarycolon", ":"); //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} +//TODO(edemaine): Not yet centered. Fix via \raisebox or #726 + +defineMacro("\\vcentcolon", "\\mathrel{\\mathop\\ordinarycolon}"); // \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon} + +defineMacro("\\dblcolon", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}" + "{\\mathop{\\char\"2237}}"); // \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=} + +defineMacro("\\coloneqq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2254}}"); // ≔ +// \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=} + +defineMacro("\\Coloneqq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}" + "{\\mathop{\\char\"2237\\char\"3d}}"); // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} + +defineMacro("\\coloneq", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"3a\\char\"2212}}"); // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} + +defineMacro("\\Coloneq", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}" + "{\\mathop{\\char\"2237\\char\"2212}}"); // \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon} + +defineMacro("\\eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2255}}"); // ≕ +// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} + +defineMacro("\\Eqqcolon", "\\html@mathml{" + "\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"3d\\char\"2237}}"); // \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon} + +defineMacro("\\eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}" + "{\\mathop{\\char\"2239}}"); // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} + +defineMacro("\\Eqcolon", "\\html@mathml{" + "\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}" + "{\\mathop{\\char\"2212\\char\"2237}}"); // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} + +defineMacro("\\colonapprox", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"3a\\char\"2248}}"); // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} + +defineMacro("\\Colonapprox", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}" + "{\\mathop{\\char\"2237\\char\"2248}}"); // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} + +defineMacro("\\colonsim", "\\html@mathml{" + "\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"3a\\char\"223c}}"); // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} + +defineMacro("\\Colonsim", "\\html@mathml{" + "\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}" + "{\\mathop{\\char\"2237\\char\"223c}}"); // Some Unicode characters are implemented with macros to mathtools functions. + +defineMacro("\u2237", "\\dblcolon"); // :: + +defineMacro("\u2239", "\\eqcolon"); // -: + +defineMacro("\u2254", "\\coloneqq"); // := + +defineMacro("\u2255", "\\eqqcolon"); // =: + +defineMacro("\u2A74", "\\Coloneqq"); // ::= +////////////////////////////////////////////////////////////////////// +// colonequals.sty +// Alternate names for mathtools's macros: + +defineMacro("\\ratio", "\\vcentcolon"); +defineMacro("\\coloncolon", "\\dblcolon"); +defineMacro("\\colonequals", "\\coloneqq"); +defineMacro("\\coloncolonequals", "\\Coloneqq"); +defineMacro("\\equalscolon", "\\eqqcolon"); +defineMacro("\\equalscoloncolon", "\\Eqqcolon"); +defineMacro("\\colonminus", "\\coloneq"); +defineMacro("\\coloncolonminus", "\\Coloneq"); +defineMacro("\\minuscolon", "\\eqcolon"); +defineMacro("\\minuscoloncolon", "\\Eqcolon"); // \colonapprox name is same in mathtools and colonequals. + +defineMacro("\\coloncolonapprox", "\\Colonapprox"); // \colonsim name is same in mathtools and colonequals. + +defineMacro("\\coloncolonsim", "\\Colonsim"); // Additional macros, implemented by analogy with mathtools definitions: + +defineMacro("\\simcolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); +defineMacro("\\simcoloncolon", "\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"); +defineMacro("\\approxcolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"); +defineMacro("\\approxcoloncolon", "\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"); // Present in newtxmath, pxfonts and txfonts + +defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}"); +defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); +defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); ////////////////////////////////////////////////////////////////////// +// From amsopn.sty + +defineMacro("\\injlim", "\\DOTSB\\operatorname*{inj\\,lim}"); +defineMacro("\\projlim", "\\DOTSB\\operatorname*{proj\\,lim}"); +defineMacro("\\varlimsup", "\\DOTSB\\operatorname*{\\overline{lim}}"); +defineMacro("\\varliminf", "\\DOTSB\\operatorname*{\\underline{lim}}"); +defineMacro("\\varinjlim", "\\DOTSB\\operatorname*{\\underrightarrow{lim}}"); +defineMacro("\\varprojlim", "\\DOTSB\\operatorname*{\\underleftarrow{lim}}"); ////////////////////////////////////////////////////////////////////// +// MathML alternates for KaTeX glyphs in the Unicode private area + +defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}"); +defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}"); +defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}"); +defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}"); +defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}"); +defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}"); +defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}"); +defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}"); +defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}"); +defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}"); +defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}"); +defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}"); +defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}"); +defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); +defineMacro("\\imath", "\\html@mathml{\\@imath}{\u0131}"); +defineMacro("\\jmath", "\\html@mathml{\\@jmath}{\u0237}"); ////////////////////////////////////////////////////////////////////// +// stmaryrd and semantic +// The stmaryrd and semantic packages render the next four items by calling a +// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros. + +defineMacro("\\llbracket", "\\html@mathml{" + "\\mathopen{[\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u27E6}}"); +defineMacro("\\rrbracket", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu]}}" + "{\\mathclose{\\char`\u27E7}}"); +defineMacro("\u27E6", "\\llbracket"); // blackboard bold [ + +defineMacro("\u27E7", "\\rrbracket"); // blackboard bold ] + +defineMacro("\\lBrace", "\\html@mathml{" + "\\mathopen{\\{\\mkern-3.2mu[}}" + "{\\mathopen{\\char`\u2983}}"); +defineMacro("\\rBrace", "\\html@mathml{" + "\\mathclose{]\\mkern-3.2mu\\}}}" + "{\\mathclose{\\char`\u2984}}"); +defineMacro("\u2983", "\\lBrace"); // blackboard bold { + +defineMacro("\u2984", "\\rBrace"); // blackboard bold } +// TODO: Create variable sized versions of the last two items. I believe that +// will require new font glyphs. +// The stmaryrd function `\minuso` provides a "Plimsoll" symbol that +// superimposes the characters \circ and \mathminus. Used in chemistry. + +defineMacro("\\minuso", "\\mathbin{\\html@mathml{" + "{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}" + "{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}" + "{\\char`⦵}}"); +defineMacro("⦵", "\\minuso"); ////////////////////////////////////////////////////////////////////// +// texvc.sty +// The texvc package contains macros available in mediawiki pages. +// We omit the functions deprecated at +// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax +// We also omit texvc's \O, which conflicts with \text{\O} + +defineMacro("\\darr", "\\downarrow"); +defineMacro("\\dArr", "\\Downarrow"); +defineMacro("\\Darr", "\\Downarrow"); +defineMacro("\\lang", "\\langle"); +defineMacro("\\rang", "\\rangle"); +defineMacro("\\uarr", "\\uparrow"); +defineMacro("\\uArr", "\\Uparrow"); +defineMacro("\\Uarr", "\\Uparrow"); +defineMacro("\\N", "\\mathbb{N}"); +defineMacro("\\R", "\\mathbb{R}"); +defineMacro("\\Z", "\\mathbb{Z}"); +defineMacro("\\alef", "\\aleph"); +defineMacro("\\alefsym", "\\aleph"); +defineMacro("\\Alpha", "\\mathrm{A}"); +defineMacro("\\Beta", "\\mathrm{B}"); +defineMacro("\\bull", "\\bullet"); +defineMacro("\\Chi", "\\mathrm{X}"); +defineMacro("\\clubs", "\\clubsuit"); +defineMacro("\\cnums", "\\mathbb{C}"); +defineMacro("\\Complex", "\\mathbb{C}"); +defineMacro("\\Dagger", "\\ddagger"); +defineMacro("\\diamonds", "\\diamondsuit"); +defineMacro("\\empty", "\\emptyset"); +defineMacro("\\Epsilon", "\\mathrm{E}"); +defineMacro("\\Eta", "\\mathrm{H}"); +defineMacro("\\exist", "\\exists"); +defineMacro("\\harr", "\\leftrightarrow"); +defineMacro("\\hArr", "\\Leftrightarrow"); +defineMacro("\\Harr", "\\Leftrightarrow"); +defineMacro("\\hearts", "\\heartsuit"); +defineMacro("\\image", "\\Im"); +defineMacro("\\infin", "\\infty"); +defineMacro("\\Iota", "\\mathrm{I}"); +defineMacro("\\isin", "\\in"); +defineMacro("\\Kappa", "\\mathrm{K}"); +defineMacro("\\larr", "\\leftarrow"); +defineMacro("\\lArr", "\\Leftarrow"); +defineMacro("\\Larr", "\\Leftarrow"); +defineMacro("\\lrarr", "\\leftrightarrow"); +defineMacro("\\lrArr", "\\Leftrightarrow"); +defineMacro("\\Lrarr", "\\Leftrightarrow"); +defineMacro("\\Mu", "\\mathrm{M}"); +defineMacro("\\natnums", "\\mathbb{N}"); +defineMacro("\\Nu", "\\mathrm{N}"); +defineMacro("\\Omicron", "\\mathrm{O}"); +defineMacro("\\plusmn", "\\pm"); +defineMacro("\\rarr", "\\rightarrow"); +defineMacro("\\rArr", "\\Rightarrow"); +defineMacro("\\Rarr", "\\Rightarrow"); +defineMacro("\\real", "\\Re"); +defineMacro("\\reals", "\\mathbb{R}"); +defineMacro("\\Reals", "\\mathbb{R}"); +defineMacro("\\Rho", "\\mathrm{P}"); +defineMacro("\\sdot", "\\cdot"); +defineMacro("\\sect", "\\S"); +defineMacro("\\spades", "\\spadesuit"); +defineMacro("\\sub", "\\subset"); +defineMacro("\\sube", "\\subseteq"); +defineMacro("\\supe", "\\supseteq"); +defineMacro("\\Tau", "\\mathrm{T}"); +defineMacro("\\thetasym", "\\vartheta"); // TODO: defineMacro("\\varcoppa", "\\\mbox{\\coppa}"); + +defineMacro("\\weierp", "\\wp"); +defineMacro("\\Zeta", "\\mathrm{Z}"); ////////////////////////////////////////////////////////////////////// +// statmath.sty +// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf + +defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); +defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); +defineMacro("\\plim", "\\DOTSB\\mathop{\\operatorname{plim}}\\limits"); ////////////////////////////////////////////////////////////////////// +// braket.sty +// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf + +defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); +defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); +defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); +defineMacro("\\Bra", "\\left\\langle#1\\right|"); +defineMacro("\\Ket", "\\left|#1\\right\\rangle"); ////////////////////////////////////////////////////////////////////// +// actuarialangle.dtx + +defineMacro("\\angln", "{\\angl n}"); // Custom Khan Academy colors, should be moved to an optional package + +defineMacro("\\blue", "\\textcolor{##6495ed}{#1}"); +defineMacro("\\orange", "\\textcolor{##ffa500}{#1}"); +defineMacro("\\pink", "\\textcolor{##ff00af}{#1}"); +defineMacro("\\red", "\\textcolor{##df0030}{#1}"); +defineMacro("\\green", "\\textcolor{##28ae7b}{#1}"); +defineMacro("\\gray", "\\textcolor{gray}{#1}"); +defineMacro("\\purple", "\\textcolor{##9d38bd}{#1}"); +defineMacro("\\blueA", "\\textcolor{##ccfaff}{#1}"); +defineMacro("\\blueB", "\\textcolor{##80f6ff}{#1}"); +defineMacro("\\blueC", "\\textcolor{##63d9ea}{#1}"); +defineMacro("\\blueD", "\\textcolor{##11accd}{#1}"); +defineMacro("\\blueE", "\\textcolor{##0c7f99}{#1}"); +defineMacro("\\tealA", "\\textcolor{##94fff5}{#1}"); +defineMacro("\\tealB", "\\textcolor{##26edd5}{#1}"); +defineMacro("\\tealC", "\\textcolor{##01d1c1}{#1}"); +defineMacro("\\tealD", "\\textcolor{##01a995}{#1}"); +defineMacro("\\tealE", "\\textcolor{##208170}{#1}"); +defineMacro("\\greenA", "\\textcolor{##b6ffb0}{#1}"); +defineMacro("\\greenB", "\\textcolor{##8af281}{#1}"); +defineMacro("\\greenC", "\\textcolor{##74cf70}{#1}"); +defineMacro("\\greenD", "\\textcolor{##1fab54}{#1}"); +defineMacro("\\greenE", "\\textcolor{##0d923f}{#1}"); +defineMacro("\\goldA", "\\textcolor{##ffd0a9}{#1}"); +defineMacro("\\goldB", "\\textcolor{##ffbb71}{#1}"); +defineMacro("\\goldC", "\\textcolor{##ff9c39}{#1}"); +defineMacro("\\goldD", "\\textcolor{##e07d10}{#1}"); +defineMacro("\\goldE", "\\textcolor{##a75a05}{#1}"); +defineMacro("\\redA", "\\textcolor{##fca9a9}{#1}"); +defineMacro("\\redB", "\\textcolor{##ff8482}{#1}"); +defineMacro("\\redC", "\\textcolor{##f9685d}{#1}"); +defineMacro("\\redD", "\\textcolor{##e84d39}{#1}"); +defineMacro("\\redE", "\\textcolor{##bc2612}{#1}"); +defineMacro("\\maroonA", "\\textcolor{##ffbde0}{#1}"); +defineMacro("\\maroonB", "\\textcolor{##ff92c6}{#1}"); +defineMacro("\\maroonC", "\\textcolor{##ed5fa6}{#1}"); +defineMacro("\\maroonD", "\\textcolor{##ca337c}{#1}"); +defineMacro("\\maroonE", "\\textcolor{##9e034e}{#1}"); +defineMacro("\\purpleA", "\\textcolor{##ddd7ff}{#1}"); +defineMacro("\\purpleB", "\\textcolor{##c6b9fc}{#1}"); +defineMacro("\\purpleC", "\\textcolor{##aa87ff}{#1}"); +defineMacro("\\purpleD", "\\textcolor{##7854ab}{#1}"); +defineMacro("\\purpleE", "\\textcolor{##543b78}{#1}"); +defineMacro("\\mintA", "\\textcolor{##f5f9e8}{#1}"); +defineMacro("\\mintB", "\\textcolor{##edf2df}{#1}"); +defineMacro("\\mintC", "\\textcolor{##e0e5cc}{#1}"); +defineMacro("\\grayA", "\\textcolor{##f6f7f7}{#1}"); +defineMacro("\\grayB", "\\textcolor{##f0f1f2}{#1}"); +defineMacro("\\grayC", "\\textcolor{##e3e5e6}{#1}"); +defineMacro("\\grayD", "\\textcolor{##d6d8da}{#1}"); +defineMacro("\\grayE", "\\textcolor{##babec2}{#1}"); +defineMacro("\\grayF", "\\textcolor{##888d93}{#1}"); +defineMacro("\\grayG", "\\textcolor{##626569}{#1}"); +defineMacro("\\grayH", "\\textcolor{##3b3e40}{#1}"); +defineMacro("\\grayI", "\\textcolor{##21242c}{#1}"); +defineMacro("\\kaBlue", "\\textcolor{##314453}{#1}"); +defineMacro("\\kaGreen", "\\textcolor{##71B307}{#1}"); +;// CONCATENATED MODULE: ./src/MacroExpander.js +/** + * This file contains the “gullet” where macros are expanded + * until only non-macro tokens remain. + */ + + + + + + + +// List of commands that act like macros but aren't defined as a macro, +// function, or symbol. Used in `isDefined`. +var implicitCommands = { + "\\relax": true, + // MacroExpander.js + "^": true, + // Parser.js + "_": true, + // Parser.js + "\\limits": true, + // Parser.js + "\\nolimits": true // Parser.js + +}; + +var MacroExpander = /*#__PURE__*/function () { + function MacroExpander(input, settings, mode) { + this.settings = void 0; + this.expansionCount = void 0; + this.lexer = void 0; + this.macros = void 0; + this.stack = void 0; + this.mode = void 0; + this.settings = settings; + this.expansionCount = 0; + this.feed(input); // Make new global namespace + + this.macros = new Namespace(macros, settings.macros); + this.mode = mode; + this.stack = []; // contains tokens in REVERSE order + } + /** + * Feed a new input string to the same MacroExpander + * (with existing macros etc.). + */ + + + var _proto = MacroExpander.prototype; + + _proto.feed = function feed(input) { + this.lexer = new Lexer(input, this.settings); + } + /** + * Switches between "text" and "math" modes. + */ + ; + + _proto.switchMode = function switchMode(newMode) { + this.mode = newMode; + } + /** + * Start a new group nesting within all namespaces. + */ + ; + + _proto.beginGroup = function beginGroup() { + this.macros.beginGroup(); + } + /** + * End current group nesting within all namespaces. + */ + ; + + _proto.endGroup = function endGroup() { + this.macros.endGroup(); + } + /** + * Returns the topmost token on the stack, without expanding it. + * Similar in behavior to TeX's `\futurelet`. + */ + ; + + _proto.future = function future() { + if (this.stack.length === 0) { + this.pushToken(this.lexer.lex()); + } + + return this.stack[this.stack.length - 1]; + } + /** + * Remove and return the next unexpanded token. + */ + ; + + _proto.popToken = function popToken() { + this.future(); // ensure non-empty stack + + return this.stack.pop(); + } + /** + * Add a given token to the token stack. In particular, this get be used + * to put back a token returned from one of the other methods. + */ + ; + + _proto.pushToken = function pushToken(token) { + this.stack.push(token); + } + /** + * Append an array of tokens to the token stack. + */ + ; + + _proto.pushTokens = function pushTokens(tokens) { + var _this$stack; + + (_this$stack = this.stack).push.apply(_this$stack, tokens); + } + /** + * Find an macro argument without expanding tokens and append the array of + * tokens to the token stack. Uses Token as a container for the result. + */ + ; + + _proto.scanArgument = function scanArgument(isOptional) { + var start; + var end; + var tokens; + + if (isOptional) { + this.consumeSpaces(); // \@ifnextchar gobbles any space following it + + if (this.future().text !== "[") { + return null; + } + + start = this.popToken(); // don't include [ in tokens + + var _this$consumeArg = this.consumeArg(["]"]); + + tokens = _this$consumeArg.tokens; + end = _this$consumeArg.end; + } else { + var _this$consumeArg2 = this.consumeArg(); + + tokens = _this$consumeArg2.tokens; + start = _this$consumeArg2.start; + end = _this$consumeArg2.end; + } // indicate the end of an argument + + + this.pushToken(new Token("EOF", end.loc)); + this.pushTokens(tokens); + return start.range(end, ""); + } + /** + * Consume all following space tokens, without expansion. + */ + ; + + _proto.consumeSpaces = function consumeSpaces() { + for (;;) { + var token = this.future(); + + if (token.text === " ") { + this.stack.pop(); + } else { + break; + } + } + } + /** + * Consume an argument from the token stream, and return the resulting array + * of tokens and start/end token. + */ + ; + + _proto.consumeArg = function consumeArg(delims) { + // The argument for a delimited parameter is the shortest (possibly + // empty) sequence of tokens with properly nested {...} groups that is + // followed ... by this particular list of non-parameter tokens. + // The argument for an undelimited parameter is the next nonblank + // token, unless that token is ‘{’, when the argument will be the + // entire {...} group that follows. + var tokens = []; + var isDelimited = delims && delims.length > 0; + + if (!isDelimited) { + // Ignore spaces between arguments. As the TeXbook says: + // "After you have said ‘\def\row#1#2{...}’, you are allowed to + // put spaces between the arguments (e.g., ‘\row x n’), because + // TeX doesn’t use single spaces as undelimited arguments." + this.consumeSpaces(); + } + + var start = this.future(); + var tok; + var depth = 0; + var match = 0; + + do { + tok = this.popToken(); + tokens.push(tok); + + if (tok.text === "{") { + ++depth; + } else if (tok.text === "}") { + --depth; + + if (depth === -1) { + throw new src_ParseError("Extra }", tok); + } + } else if (tok.text === "EOF") { + throw new src_ParseError("Unexpected end of input in a macro argument" + ", expected '" + (delims && isDelimited ? delims[match] : "}") + "'", tok); + } + + if (delims && isDelimited) { + if ((depth === 0 || depth === 1 && delims[match] === "{") && tok.text === delims[match]) { + ++match; + + if (match === delims.length) { + // don't include delims in tokens + tokens.splice(-match, match); + break; + } + } else { + match = 0; + } + } + } while (depth !== 0 || isDelimited); // If the argument found ... has the form ‘{}’, + // ... the outermost braces enclosing the argument are removed + + + if (start.text === "{" && tokens[tokens.length - 1].text === "}") { + tokens.pop(); + tokens.shift(); + } + + tokens.reverse(); // to fit in with stack order + + return { + tokens: tokens, + start: start, + end: tok + }; + } + /** + * Consume the specified number of (delimited) arguments from the token + * stream and return the resulting array of arguments. + */ + ; + + _proto.consumeArgs = function consumeArgs(numArgs, delimiters) { + if (delimiters) { + if (delimiters.length !== numArgs + 1) { + throw new src_ParseError("The length of delimiters doesn't match the number of args!"); + } + + var delims = delimiters[0]; + + for (var i = 0; i < delims.length; i++) { + var tok = this.popToken(); + + if (delims[i] !== tok.text) { + throw new src_ParseError("Use of the macro doesn't match its definition", tok); + } + } + } + + var args = []; + + for (var _i = 0; _i < numArgs; _i++) { + args.push(this.consumeArg(delimiters && delimiters[_i + 1]).tokens); + } + + return args; + } + /** + * Expand the next token only once if possible. + * + * If the token is expanded, the resulting tokens will be pushed onto + * the stack in reverse order and will be returned as an array, + * also in reverse order. + * + * If not, the next token will be returned without removing it + * from the stack. This case can be detected by a `Token` return value + * instead of an `Array` return value. + * + * In either case, the next token will be on the top of the stack, + * or the stack will be empty. + * + * Used to implement `expandAfterFuture` and `expandNextToken`. + * + * If expandableOnly, only expandable tokens are expanded and + * an undefined control sequence results in an error. + */ + ; + + _proto.expandOnce = function expandOnce(expandableOnly) { + var topToken = this.popToken(); + var name = topToken.text; + var expansion = !topToken.noexpand ? this._getExpansion(name) : null; + + if (expansion == null || expandableOnly && expansion.unexpandable) { + if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { + throw new src_ParseError("Undefined control sequence: " + name); + } + + this.pushToken(topToken); + return topToken; + } + + this.expansionCount++; + + if (this.expansionCount > this.settings.maxExpand) { + throw new src_ParseError("Too many expansions: infinite loop or " + "need to increase maxExpand setting"); + } + + var tokens = expansion.tokens; + var args = this.consumeArgs(expansion.numArgs, expansion.delimiters); + + if (expansion.numArgs) { + // paste arguments in place of the placeholders + tokens = tokens.slice(); // make a shallow copy + + for (var i = tokens.length - 1; i >= 0; --i) { + var tok = tokens[i]; + + if (tok.text === "#") { + if (i === 0) { + throw new src_ParseError("Incomplete placeholder at end of macro body", tok); + } + + tok = tokens[--i]; // next token on stack + + if (tok.text === "#") { + // ## → # + tokens.splice(i + 1, 1); // drop first # + } else if (/^[1-9]$/.test(tok.text)) { + var _tokens; + + // replace the placeholder with the indicated argument + (_tokens = tokens).splice.apply(_tokens, [i, 2].concat(args[+tok.text - 1])); + } else { + throw new src_ParseError("Not a valid argument number", tok); + } + } + } + } // Concatenate expansion onto top of stack. + + + this.pushTokens(tokens); + return tokens; + } + /** + * Expand the next token only once (if possible), and return the resulting + * top token on the stack (without removing anything from the stack). + * Similar in behavior to TeX's `\expandafter\futurelet`. + * Equivalent to expandOnce() followed by future(). + */ + ; + + _proto.expandAfterFuture = function expandAfterFuture() { + this.expandOnce(); + return this.future(); + } + /** + * Recursively expand first token, then return first non-expandable token. + */ + ; + + _proto.expandNextToken = function expandNextToken() { + for (;;) { + var expanded = this.expandOnce(); // expandOnce returns Token if and only if it's fully expanded. + + if (expanded instanceof Token) { + // \relax stops the expansion, but shouldn't get returned (a + // null return value couldn't get implemented as a function). + // the token after \noexpand is interpreted as if its meaning + // were ‘\relax’ + if (expanded.text === "\\relax" || expanded.treatAsRelax) { + this.stack.pop(); + } else { + return this.stack.pop(); // === expanded + } + } + } // Flow unable to figure out that this pathway is impossible. + // https://github.com/facebook/flow/issues/4808 + + + throw new Error(); // eslint-disable-line no-unreachable + } + /** + * Fully expand the given macro name and return the resulting list of + * tokens, or return `undefined` if no such macro is defined. + */ + ; + + _proto.expandMacro = function expandMacro(name) { + return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined; + } + /** + * Fully expand the given token stream and return the resulting list of tokens + */ + ; + + _proto.expandTokens = function expandTokens(tokens) { + var output = []; + var oldStackLength = this.stack.length; + this.pushTokens(tokens); + + while (this.stack.length > oldStackLength) { + var expanded = this.expandOnce(true); // expand only expandable tokens + // expandOnce returns Token if and only if it's fully expanded. + + if (expanded instanceof Token) { + if (expanded.treatAsRelax) { + // the expansion of \noexpand is the token itself + expanded.noexpand = false; + expanded.treatAsRelax = false; + } + + output.push(this.stack.pop()); + } + } + + return output; + } + /** + * Fully expand the given macro name and return the result as a string, + * or return `undefined` if no such macro is defined. + */ + ; + + _proto.expandMacroAsText = function expandMacroAsText(name) { + var tokens = this.expandMacro(name); + + if (tokens) { + return tokens.map(function (token) { + return token.text; + }).join(""); + } else { + return tokens; + } + } + /** + * Returns the expanded macro as a reversed array of tokens and a macro + * argument count. Or returns `null` if no such macro. + */ + ; + + _proto._getExpansion = function _getExpansion(name) { + var definition = this.macros.get(name); + + if (definition == null) { + // mainly checking for undefined here + return definition; + } + + var expansion = typeof definition === "function" ? definition(this) : definition; + + if (typeof expansion === "string") { + var numArgs = 0; + + if (expansion.indexOf("#") !== -1) { + var stripped = expansion.replace(/##/g, ""); + + while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { + ++numArgs; + } + } + + var bodyLexer = new Lexer(expansion, this.settings); + var tokens = []; + var tok = bodyLexer.lex(); + + while (tok.text !== "EOF") { + tokens.push(tok); + tok = bodyLexer.lex(); + } + + tokens.reverse(); // to fit in with stack using push and pop + + var expanded = { + tokens: tokens, + numArgs: numArgs + }; + return expanded; + } + + return expansion; + } + /** + * Determine whether a command is currently "defined" (has some + * functionality), meaning that it's a macro (in the current group), + * a function, a symbol, or one of the special commands listed in + * `implicitCommands`. + */ + ; + + _proto.isDefined = function isDefined(name) { + return this.macros.has(name) || src_functions.hasOwnProperty(name) || src_symbols.math.hasOwnProperty(name) || src_symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name); + } + /** + * Determine whether a command is expandable. + */ + ; + + _proto.isExpandable = function isExpandable(name) { + var macro = this.macros.get(name); + return macro != null ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable : src_functions.hasOwnProperty(name) && !src_functions[name].primitive; + }; + + return MacroExpander; +}(); + + +;// CONCATENATED MODULE: ./src/Parser.js +/* eslint no-constant-condition:0 */ + + + + + + + + + + // Pre-evaluate both modules as unicodeSymbols require String.normalize() + +var unicodeAccents = { + "́": { + "text": "\\'", + "math": "\\acute" + }, + "̀": { + "text": "\\`", + "math": "\\grave" + }, + "̈": { + "text": "\\\"", + "math": "\\ddot" + }, + "̃": { + "text": "\\~", + "math": "\\tilde" + }, + "̄": { + "text": "\\=", + "math": "\\bar" + }, + "̆": { + "text": "\\u", + "math": "\\breve" + }, + "̌": { + "text": "\\v", + "math": "\\check" + }, + "̂": { + "text": "\\^", + "math": "\\hat" + }, + "̇": { + "text": "\\.", + "math": "\\dot" + }, + "̊": { + "text": "\\r", + "math": "\\mathring" + }, + "̋": { + "text": "\\H" + } +}; +var unicodeSymbols = { + "á": "á", + "à": "à", + "ä": "ä", + "ǟ": "ǟ", + "ã": "ã", + "ā": "ā", + "ă": "ă", + "ắ": "ắ", + "ằ": "ằ", + "ẵ": "ẵ", + "ǎ": "ǎ", + "â": "â", + "ấ": "ấ", + "ầ": "ầ", + "ẫ": "ẫ", + "ȧ": "ȧ", + "ǡ": "ǡ", + "å": "å", + "ǻ": "ǻ", + "ḃ": "ḃ", + "ć": "ć", + "č": "č", + "ĉ": "ĉ", + "ċ": "ċ", + "ď": "ď", + "ḋ": "ḋ", + "é": "é", + "è": "è", + "ë": "ë", + "ẽ": "ẽ", + "ē": "ē", + "ḗ": "ḗ", + "ḕ": "ḕ", + "ĕ": "ĕ", + "ě": "ě", + "ê": "ê", + "ế": "ế", + "ề": "ề", + "ễ": "ễ", + "ė": "ė", + "ḟ": "ḟ", + "ǵ": "ǵ", + "ḡ": "ḡ", + "ğ": "ğ", + "ǧ": "ǧ", + "ĝ": "ĝ", + "ġ": "ġ", + "ḧ": "ḧ", + "ȟ": "ȟ", + "ĥ": "ĥ", + "ḣ": "ḣ", + "í": "í", + "ì": "ì", + "ï": "ï", + "ḯ": "ḯ", + "ĩ": "ĩ", + "ī": "ī", + "ĭ": "ĭ", + "ǐ": "ǐ", + "î": "î", + "ǰ": "ǰ", + "ĵ": "ĵ", + "ḱ": "ḱ", + "ǩ": "ǩ", + "ĺ": "ĺ", + "ľ": "ľ", + "ḿ": "ḿ", + "ṁ": "ṁ", + "ń": "ń", + "ǹ": "ǹ", + "ñ": "ñ", + "ň": "ň", + "ṅ": "ṅ", + "ó": "ó", + "ò": "ò", + "ö": "ö", + "ȫ": "ȫ", + "õ": "õ", + "ṍ": "ṍ", + "ṏ": "ṏ", + "ȭ": "ȭ", + "ō": "ō", + "ṓ": "ṓ", + "ṑ": "ṑ", + "ŏ": "ŏ", + "ǒ": "ǒ", + "ô": "ô", + "ố": "ố", + "ồ": "ồ", + "ỗ": "ỗ", + "ȯ": "ȯ", + "ȱ": "ȱ", + "ő": "ő", + "ṕ": "ṕ", + "ṗ": "ṗ", + "ŕ": "ŕ", + "ř": "ř", + "ṙ": "ṙ", + "ś": "ś", + "ṥ": "ṥ", + "š": "š", + "ṧ": "ṧ", + "ŝ": "ŝ", + "ṡ": "ṡ", + "ẗ": "ẗ", + "ť": "ť", + "ṫ": "ṫ", + "ú": "ú", + "ù": "ù", + "ü": "ü", + "ǘ": "ǘ", + "ǜ": "ǜ", + "ǖ": "ǖ", + "ǚ": "ǚ", + "ũ": "ũ", + "ṹ": "ṹ", + "ū": "ū", + "ṻ": "ṻ", + "ŭ": "ŭ", + "ǔ": "ǔ", + "û": "û", + "ů": "ů", + "ű": "ű", + "ṽ": "ṽ", + "ẃ": "ẃ", + "ẁ": "ẁ", + "ẅ": "ẅ", + "ŵ": "ŵ", + "ẇ": "ẇ", + "ẘ": "ẘ", + "ẍ": "ẍ", + "ẋ": "ẋ", + "ý": "ý", + "ỳ": "ỳ", + "ÿ": "ÿ", + "ỹ": "ỹ", + "ȳ": "ȳ", + "ŷ": "ŷ", + "ẏ": "ẏ", + "ẙ": "ẙ", + "ź": "ź", + "ž": "ž", + "ẑ": "ẑ", + "ż": "ż", + "Á": "Á", + "À": "À", + "Ä": "Ä", + "Ǟ": "Ǟ", + "Ã": "Ã", + "Ā": "Ā", + "Ă": "Ă", + "Ắ": "Ắ", + "Ằ": "Ằ", + "Ẵ": "Ẵ", + "Ǎ": "Ǎ", + "Â": "Â", + "Ấ": "Ấ", + "Ầ": "Ầ", + "Ẫ": "Ẫ", + "Ȧ": "Ȧ", + "Ǡ": "Ǡ", + "Å": "Å", + "Ǻ": "Ǻ", + "Ḃ": "Ḃ", + "Ć": "Ć", + "Č": "Č", + "Ĉ": "Ĉ", + "Ċ": "Ċ", + "Ď": "Ď", + "Ḋ": "Ḋ", + "É": "É", + "È": "È", + "Ë": "Ë", + "Ẽ": "Ẽ", + "Ē": "Ē", + "Ḗ": "Ḗ", + "Ḕ": "Ḕ", + "Ĕ": "Ĕ", + "Ě": "Ě", + "Ê": "Ê", + "Ế": "Ế", + "Ề": "Ề", + "Ễ": "Ễ", + "Ė": "Ė", + "Ḟ": "Ḟ", + "Ǵ": "Ǵ", + "Ḡ": "Ḡ", + "Ğ": "Ğ", + "Ǧ": "Ǧ", + "Ĝ": "Ĝ", + "Ġ": "Ġ", + "Ḧ": "Ḧ", + "Ȟ": "Ȟ", + "Ĥ": "Ĥ", + "Ḣ": "Ḣ", + "Í": "Í", + "Ì": "Ì", + "Ï": "Ï", + "Ḯ": "Ḯ", + "Ĩ": "Ĩ", + "Ī": "Ī", + "Ĭ": "Ĭ", + "Ǐ": "Ǐ", + "Î": "Î", + "İ": "İ", + "Ĵ": "Ĵ", + "Ḱ": "Ḱ", + "Ǩ": "Ǩ", + "Ĺ": "Ĺ", + "Ľ": "Ľ", + "Ḿ": "Ḿ", + "Ṁ": "Ṁ", + "Ń": "Ń", + "Ǹ": "Ǹ", + "Ñ": "Ñ", + "Ň": "Ň", + "Ṅ": "Ṅ", + "Ó": "Ó", + "Ò": "Ò", + "Ö": "Ö", + "Ȫ": "Ȫ", + "Õ": "Õ", + "Ṍ": "Ṍ", + "Ṏ": "Ṏ", + "Ȭ": "Ȭ", + "Ō": "Ō", + "Ṓ": "Ṓ", + "Ṑ": "Ṑ", + "Ŏ": "Ŏ", + "Ǒ": "Ǒ", + "Ô": "Ô", + "Ố": "Ố", + "Ồ": "Ồ", + "Ỗ": "Ỗ", + "Ȯ": "Ȯ", + "Ȱ": "Ȱ", + "Ő": "Ő", + "Ṕ": "Ṕ", + "Ṗ": "Ṗ", + "Ŕ": "Ŕ", + "Ř": "Ř", + "Ṙ": "Ṙ", + "Ś": "Ś", + "Ṥ": "Ṥ", + "Š": "Š", + "Ṧ": "Ṧ", + "Ŝ": "Ŝ", + "Ṡ": "Ṡ", + "Ť": "Ť", + "Ṫ": "Ṫ", + "Ú": "Ú", + "Ù": "Ù", + "Ü": "Ü", + "Ǘ": "Ǘ", + "Ǜ": "Ǜ", + "Ǖ": "Ǖ", + "Ǚ": "Ǚ", + "Ũ": "Ũ", + "Ṹ": "Ṹ", + "Ū": "Ū", + "Ṻ": "Ṻ", + "Ŭ": "Ŭ", + "Ǔ": "Ǔ", + "Û": "Û", + "Ů": "Ů", + "Ű": "Ű", + "Ṽ": "Ṽ", + "Ẃ": "Ẃ", + "Ẁ": "Ẁ", + "Ẅ": "Ẅ", + "Ŵ": "Ŵ", + "Ẇ": "Ẇ", + "Ẍ": "Ẍ", + "Ẋ": "Ẋ", + "Ý": "Ý", + "Ỳ": "Ỳ", + "Ÿ": "Ÿ", + "Ỹ": "Ỹ", + "Ȳ": "Ȳ", + "Ŷ": "Ŷ", + "Ẏ": "Ẏ", + "Ź": "Ź", + "Ž": "Ž", + "Ẑ": "Ẑ", + "Ż": "Ż", + "ά": "ά", + "ὰ": "ὰ", + "ᾱ": "ᾱ", + "ᾰ": "ᾰ", + "έ": "έ", + "ὲ": "ὲ", + "ή": "ή", + "ὴ": "ὴ", + "ί": "ί", + "ὶ": "ὶ", + "ϊ": "ϊ", + "ΐ": "ΐ", + "ῒ": "ῒ", + "ῑ": "ῑ", + "ῐ": "ῐ", + "ό": "ό", + "ὸ": "ὸ", + "ύ": "ύ", + "ὺ": "ὺ", + "ϋ": "ϋ", + "ΰ": "ΰ", + "ῢ": "ῢ", + "ῡ": "ῡ", + "ῠ": "ῠ", + "ώ": "ώ", + "ὼ": "ὼ", + "Ύ": "Ύ", + "Ὺ": "Ὺ", + "Ϋ": "Ϋ", + "Ῡ": "Ῡ", + "Ῠ": "Ῠ", + "Ώ": "Ώ", + "Ὼ": "Ὼ" +}; + +/** + * This file contains the parser used to parse out a TeX expression from the + * input. Since TeX isn't context-free, standard parsers don't work particularly + * well. + * + * The strategy of this parser is as such: + * + * The main functions (the `.parse...` ones) take a position in the current + * parse string to parse tokens from. The lexer (found in Lexer.js, stored at + * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When + * individual tokens are needed at a position, the lexer is called to pull out a + * token, which is then used. + * + * The parser has a property called "mode" indicating the mode that + * the parser is currently in. Currently it has to be one of "math" or + * "text", which denotes whether the current environment is a math-y + * one or a text-y one (e.g. inside \text). Currently, this serves to + * limit the functions which can be used in text mode. + * + * The main functions then return an object which contains the useful data that + * was parsed at its given point, and a new position at the end of the parsed + * data. The main functions can call each other and continue the parsing by + * using the returned position as a new starting point. + * + * There are also extra `.handle...` functions, which pull out some reused + * functionality into self-contained functions. + * + * The functions return ParseNodes. + */ +var Parser = /*#__PURE__*/function () { + function Parser(input, settings) { + this.mode = void 0; + this.gullet = void 0; + this.settings = void 0; + this.leftrightDepth = void 0; + this.nextToken = void 0; + // Start in math mode + this.mode = "math"; // Create a new macro expander (gullet) and (indirectly via that) also a + // new lexer (mouth) for this parser (stomach, in the language of TeX) + + this.gullet = new MacroExpander(input, settings, this.mode); // Store the settings for use in parsing + + this.settings = settings; // Count leftright depth (for \middle errors) + + this.leftrightDepth = 0; + } + /** + * Checks a result to make sure it has the right type, and throws an + * appropriate error otherwise. + */ + + + var _proto = Parser.prototype; + + _proto.expect = function expect(text, consume) { + if (consume === void 0) { + consume = true; + } + + if (this.fetch().text !== text) { + throw new src_ParseError("Expected '" + text + "', got '" + this.fetch().text + "'", this.fetch()); + } + + if (consume) { + this.consume(); + } + } + /** + * Discards the current lookahead token, considering it consumed. + */ + ; + + _proto.consume = function consume() { + this.nextToken = null; + } + /** + * Return the current lookahead token, or if there isn't one (at the + * beginning, or if the previous lookahead token was consume()d), + * fetch the next token as the new lookahead token and return it. + */ + ; + + _proto.fetch = function fetch() { + if (this.nextToken == null) { + this.nextToken = this.gullet.expandNextToken(); + } + + return this.nextToken; + } + /** + * Switches between "text" and "math" modes. + */ + ; + + _proto.switchMode = function switchMode(newMode) { + this.mode = newMode; + this.gullet.switchMode(newMode); + } + /** + * Main parsing function, which parses an entire input. + */ + ; + + _proto.parse = function parse() { + if (!this.settings.globalGroup) { + // Create a group namespace for the math expression. + // (LaTeX creates a new group for every $...$, $$...$$, \[...\].) + this.gullet.beginGroup(); + } // Use old \color behavior (same as LaTeX's \textcolor) if requested. + // We do this within the group for the math expression, so it doesn't + // pollute settings.macros. + + + if (this.settings.colorIsTextColor) { + this.gullet.macros.set("\\color", "\\textcolor"); + } // Try to parse the input + + + var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end + + this.expect("EOF"); // End the group namespace for the expression + + if (!this.settings.globalGroup) { + this.gullet.endGroup(); + } + + return parse; + }; + + /** + * Parses an "expression", which is a list of atoms. + * + * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This + * happens when functions have higher precendence han infix + * nodes in implicit parses. + * + * `breakOnTokenText`: The text of the token that the expression should end + * with, or `null` if something else should end the + * expression. + */ + _proto.parseExpression = function parseExpression(breakOnInfix, breakOnTokenText) { + var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either + // we reached the end, a }, or a \right) + + while (true) { + // Ignore spaces in math mode + if (this.mode === "math") { + this.consumeSpaces(); + } + + var lex = this.fetch(); + + if (Parser.endOfExpression.indexOf(lex.text) !== -1) { + break; + } + + if (breakOnTokenText && lex.text === breakOnTokenText) { + break; + } + + if (breakOnInfix && src_functions[lex.text] && src_functions[lex.text].infix) { + break; + } + + var atom = this.parseAtom(breakOnTokenText); + + if (!atom) { + break; + } else if (atom.type === "internal") { + continue; + } + + body.push(atom); + } + + if (this.mode === "text") { + this.formLigatures(body); + } + + return this.handleInfixNodes(body); + } + /** + * Rewrites infix operators such as \over with corresponding commands such + * as \frac. + * + * There can only be one infix operator per group. If there's more than one + * then the expression is ambiguous. This can be resolved by adding {}. + */ + ; + + _proto.handleInfixNodes = function handleInfixNodes(body) { + var overIndex = -1; + var funcName; + + for (var i = 0; i < body.length; i++) { + if (body[i].type === "infix") { + if (overIndex !== -1) { + throw new src_ParseError("only one infix operator per group", body[i].token); + } + + overIndex = i; + funcName = body[i].replaceWith; + } + } + + if (overIndex !== -1 && funcName) { + var numerNode; + var denomNode; + var numerBody = body.slice(0, overIndex); + var denomBody = body.slice(overIndex + 1); + + if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { + numerNode = numerBody[0]; + } else { + numerNode = { + type: "ordgroup", + mode: this.mode, + body: numerBody + }; + } + + if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { + denomNode = denomBody[0]; + } else { + denomNode = { + type: "ordgroup", + mode: this.mode, + body: denomBody + }; + } + + var node; + + if (funcName === "\\\\abovefrac") { + node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); + } else { + node = this.callFunction(funcName, [numerNode, denomNode], []); + } + + return [node]; + } else { + return body; + } + } + /** + * Handle a subscript or superscript with nice errors. + */ + ; + + _proto.handleSupSubscript = function handleSupSubscript(name) { + var symbolToken = this.fetch(); + var symbol = symbolToken.text; + this.consume(); + this.consumeSpaces(); // ignore spaces before sup/subscript argument + + var group = this.parseGroup(name); + + if (!group) { + throw new src_ParseError("Expected group after '" + symbol + "'", symbolToken); + } + + return group; + } + /** + * Converts the textual input of an unsupported command into a text node + * contained within a color node whose color is determined by errorColor + */ + ; + + _proto.formatUnsupportedCmd = function formatUnsupportedCmd(text) { + var textordArray = []; + + for (var i = 0; i < text.length; i++) { + textordArray.push({ + type: "textord", + mode: "text", + text: text[i] + }); + } + + var textNode = { + type: "text", + mode: this.mode, + body: textordArray + }; + var colorNode = { + type: "color", + mode: this.mode, + color: this.settings.errorColor, + body: [textNode] + }; + return colorNode; + } + /** + * Parses a group with optional super/subscripts. + */ + ; + + _proto.parseAtom = function parseAtom(breakOnTokenText) { + // The body of an atom is an implicit group, so that things like + // \left(x\right)^2 work correctly. + var base = this.parseGroup("atom", breakOnTokenText); // In text mode, we don't have superscripts or subscripts + + if (this.mode === "text") { + return base; + } // Note that base may be empty (i.e. null) at this point. + + + var superscript; + var subscript; + + while (true) { + // Guaranteed in math mode, so eat any spaces first. + this.consumeSpaces(); // Lex the first token + + var lex = this.fetch(); + + if (lex.text === "\\limits" || lex.text === "\\nolimits") { + // We got a limit control + if (base && base.type === "op") { + var limits = lex.text === "\\limits"; + base.limits = limits; + base.alwaysHandleSupSub = true; + } else if (base && base.type === "operatorname" && base.alwaysHandleSupSub) { + var _limits = lex.text === "\\limits"; + + base.limits = _limits; + } else { + throw new src_ParseError("Limit controls must follow a math operator", lex); + } + + this.consume(); + } else if (lex.text === "^") { + // We got a superscript start + if (superscript) { + throw new src_ParseError("Double superscript", lex); + } + + superscript = this.handleSupSubscript("superscript"); + } else if (lex.text === "_") { + // We got a subscript start + if (subscript) { + throw new src_ParseError("Double subscript", lex); + } + + subscript = this.handleSupSubscript("subscript"); + } else if (lex.text === "'") { + // We got a prime + if (superscript) { + throw new src_ParseError("Double superscript", lex); + } + + var prime = { + type: "textord", + mode: this.mode, + text: "\\prime" + }; // Many primes can be grouped together, so we handle this here + + var primes = [prime]; + this.consume(); // Keep lexing tokens until we get something that's not a prime + + while (this.fetch().text === "'") { + // For each one, add another prime to the list + primes.push(prime); + this.consume(); + } // If there's a superscript following the primes, combine that + // superscript in with the primes. + + + if (this.fetch().text === "^") { + primes.push(this.handleSupSubscript("superscript")); + } // Put everything into an ordgroup as the superscript + + + superscript = { + type: "ordgroup", + mode: this.mode, + body: primes + }; + } else { + // If it wasn't ^, _, or ', stop parsing super/subscripts + break; + } + } // Base must be set if superscript or subscript are set per logic above, + // but need to check here for type check to pass. + + + if (superscript || subscript) { + // If we got either a superscript or subscript, create a supsub + return { + type: "supsub", + mode: this.mode, + base: base, + sup: superscript, + sub: subscript + }; + } else { + // Otherwise return the original body + return base; + } + } + /** + * Parses an entire function, including its base and all of its arguments. + */ + ; + + _proto.parseFunction = function parseFunction(breakOnTokenText, name) { + var token = this.fetch(); + var func = token.text; + var funcData = src_functions[func]; + + if (!funcData) { + return null; + } + + this.consume(); // consume command token + + if (name && name !== "atom" && !funcData.allowedInArgument) { + throw new src_ParseError("Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), token); + } else if (this.mode === "text" && !funcData.allowedInText) { + throw new src_ParseError("Can't use function '" + func + "' in text mode", token); + } else if (this.mode === "math" && funcData.allowedInMath === false) { + throw new src_ParseError("Can't use function '" + func + "' in math mode", token); + } + + var _this$parseArguments = this.parseArguments(func, funcData), + args = _this$parseArguments.args, + optArgs = _this$parseArguments.optArgs; + + return this.callFunction(func, args, optArgs, token, breakOnTokenText); + } + /** + * Call a function handler with a suitable context and arguments. + */ + ; + + _proto.callFunction = function callFunction(name, args, optArgs, token, breakOnTokenText) { + var context = { + funcName: name, + parser: this, + token: token, + breakOnTokenText: breakOnTokenText + }; + var func = src_functions[name]; + + if (func && func.handler) { + return func.handler(context, args, optArgs); + } else { + throw new src_ParseError("No function handler for " + name); + } + } + /** + * Parses the arguments of a function or environment + */ + ; + + _proto.parseArguments = function parseArguments(func, // Should look like "\name" or "\begin{name}". + funcData) { + var totalArgs = funcData.numArgs + funcData.numOptionalArgs; + + if (totalArgs === 0) { + return { + args: [], + optArgs: [] + }; + } + + var args = []; + var optArgs = []; + + for (var i = 0; i < totalArgs; i++) { + var argType = funcData.argTypes && funcData.argTypes[i]; + var isOptional = i < funcData.numOptionalArgs; + + if (funcData.primitive && argType == null || // \sqrt expands into primitive if optional argument doesn't exist + funcData.type === "sqrt" && i === 1 && optArgs[0] == null) { + argType = "primitive"; + } + + var arg = this.parseGroupOfType("argument to '" + func + "'", argType, isOptional); + + if (isOptional) { + optArgs.push(arg); + } else if (arg != null) { + args.push(arg); + } else { + // should be unreachable + throw new src_ParseError("Null argument, please report this as a bug"); + } + } + + return { + args: args, + optArgs: optArgs + }; + } + /** + * Parses a group when the mode is changing. + */ + ; + + _proto.parseGroupOfType = function parseGroupOfType(name, type, optional) { + switch (type) { + case "color": + return this.parseColorGroup(optional); + + case "size": + return this.parseSizeGroup(optional); + + case "url": + return this.parseUrlGroup(optional); + + case "math": + case "text": + return this.parseArgumentGroup(optional, type); + + case "hbox": + { + // hbox argument type wraps the argument in the equivalent of + // \hbox, which is like \text but switching to \textstyle size. + var group = this.parseArgumentGroup(optional, "text"); + return group != null ? { + type: "styling", + mode: group.mode, + body: [group], + style: "text" // simulate \textstyle + + } : null; + } + + case "raw": + { + var token = this.parseStringGroup("raw", optional); + return token != null ? { + type: "raw", + mode: "text", + string: token.text + } : null; + } + + case "primitive": + { + if (optional) { + throw new src_ParseError("A primitive argument cannot be optional"); + } + + var _group = this.parseGroup(name); + + if (_group == null) { + throw new src_ParseError("Expected group as " + name, this.fetch()); + } + + return _group; + } + + case "original": + case null: + case undefined: + return this.parseArgumentGroup(optional); + + default: + throw new src_ParseError("Unknown group type as " + name, this.fetch()); + } + } + /** + * Discard any space tokens, fetching the next non-space token. + */ + ; + + _proto.consumeSpaces = function consumeSpaces() { + while (this.fetch().text === " ") { + this.consume(); + } + } + /** + * Parses a group, essentially returning the string formed by the + * brace-enclosed tokens plus some position information. + */ + ; + + _proto.parseStringGroup = function parseStringGroup(modeName, // Used to describe the mode in error messages. + optional) { + var argToken = this.gullet.scanArgument(optional); + + if (argToken == null) { + return null; + } + + var str = ""; + var nextToken; + + while ((nextToken = this.fetch()).text !== "EOF") { + str += nextToken.text; + this.consume(); + } + + this.consume(); // consume the end of the argument + + argToken.text = str; + return argToken; + } + /** + * Parses a regex-delimited group: the largest sequence of tokens + * whose concatenated strings match `regex`. Returns the string + * formed by the tokens plus some position information. + */ + ; + + _proto.parseRegexGroup = function parseRegexGroup(regex, modeName) { + var firstToken = this.fetch(); + var lastToken = firstToken; + var str = ""; + var nextToken; + + while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { + lastToken = nextToken; + str += lastToken.text; + this.consume(); + } + + if (str === "") { + throw new src_ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); + } + + return firstToken.range(lastToken, str); + } + /** + * Parses a color description. + */ + ; + + _proto.parseColorGroup = function parseColorGroup(optional) { + var res = this.parseStringGroup("color", optional); + + if (res == null) { + return null; + } + + var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text); + + if (!match) { + throw new src_ParseError("Invalid color: '" + res.text + "'", res); + } + + var color = match[0]; + + if (/^[0-9a-f]{6}$/i.test(color)) { + // We allow a 6-digit HTML color spec without a leading "#". + // This follows the xcolor package's HTML color model. + // Predefined color names are all missed by this RegEx pattern. + color = "#" + color; + } + + return { + type: "color-token", + mode: this.mode, + color: color + }; + } + /** + * Parses a size specification, consisting of magnitude and unit. + */ + ; + + _proto.parseSizeGroup = function parseSizeGroup(optional) { + var res; + var isBlank = false; // don't expand before parseStringGroup + + this.gullet.consumeSpaces(); + + if (!optional && this.gullet.future().text !== "{") { + res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); + } else { + res = this.parseStringGroup("size", optional); + } + + if (!res) { + return null; + } + + if (!optional && res.text.length === 0) { + // Because we've tested for what is !optional, this block won't + // affect \kern, \hspace, etc. It will capture the mandatory arguments + // to \genfrac and \above. + res.text = "0pt"; // Enable \above{} + + isBlank = true; // This is here specifically for \genfrac + } + + var match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); + + if (!match) { + throw new src_ParseError("Invalid size: '" + res.text + "'", res); + } + + var data = { + number: +(match[1] + match[2]), + // sign + magnitude, cast to number + unit: match[3] + }; + + if (!validUnit(data)) { + throw new src_ParseError("Invalid unit: '" + data.unit + "'", res); + } + + return { + type: "size", + mode: this.mode, + value: data, + isBlank: isBlank + }; + } + /** + * Parses an URL, checking escaped letters and allowed protocols, + * and setting the catcode of % as an active character (as in \hyperref). + */ + ; + + _proto.parseUrlGroup = function parseUrlGroup(optional) { + this.gullet.lexer.setCatcode("%", 13); // active character + + var res = this.parseStringGroup("url", optional); + this.gullet.lexer.setCatcode("%", 14); // comment character + + if (res == null) { + return null; + } // hyperref package allows backslashes alone in href, but doesn't + // generate valid links in such cases; we interpret this as + // "undefined" behaviour, and keep them as-is. Some browser will + // replace backslashes with forward slashes. + + + var url = res.text.replace(/\\([#$%&~_^{}])/g, '$1'); + return { + type: "url", + mode: this.mode, + url: url + }; + } + /** + * Parses an argument with the mode specified. + */ + ; + + _proto.parseArgumentGroup = function parseArgumentGroup(optional, mode) { + var argToken = this.gullet.scanArgument(optional); + + if (argToken == null) { + return null; + } + + var outerMode = this.mode; + + if (mode) { + // Switch to specified mode + this.switchMode(mode); + } + + this.gullet.beginGroup(); + var expression = this.parseExpression(false, "EOF"); // TODO: find an alternative way to denote the end + + this.expect("EOF"); // expect the end of the argument + + this.gullet.endGroup(); + var result = { + type: "ordgroup", + mode: this.mode, + loc: argToken.loc, + body: expression + }; + + if (mode) { + // Switch mode back + this.switchMode(outerMode); + } + + return result; + } + /** + * Parses an ordinary group, which is either a single nucleus (like "x") + * or an expression in braces (like "{x+y}") or an implicit group, a group + * that starts at the current position, and ends right before a higher explicit + * group ends, or at EOF. + */ + ; + + _proto.parseGroup = function parseGroup(name, // For error reporting. + breakOnTokenText) { + var firstToken = this.fetch(); + var text = firstToken.text; + var result; // Try to parse an open brace or \begingroup + + if (text === "{" || text === "\\begingroup") { + this.consume(); + var groupEnd = text === "{" ? "}" : "\\endgroup"; + this.gullet.beginGroup(); // If we get a brace, parse an expression + + var expression = this.parseExpression(false, groupEnd); + var lastToken = this.fetch(); + this.expect(groupEnd); // Check that we got a matching closing brace + + this.gullet.endGroup(); + result = { + type: "ordgroup", + mode: this.mode, + loc: SourceLocation.range(firstToken, lastToken), + body: expression, + // A group formed by \begingroup...\endgroup is a semi-simple group + // which doesn't affect spacing in math mode, i.e., is transparent. + // https://tex.stackexchange.com/questions/1930/when-should-one- + // use-begingroup-instead-of-bgroup + semisimple: text === "\\begingroup" || undefined + }; + } else { + // If there exists a function with this name, parse the function. + // Otherwise, just return a nucleus + result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol(); + + if (result == null && text[0] === "\\" && !implicitCommands.hasOwnProperty(text)) { + if (this.settings.throwOnError) { + throw new src_ParseError("Undefined control sequence: " + text, firstToken); + } + + result = this.formatUnsupportedCmd(text); + this.consume(); + } + } + + return result; + } + /** + * Form ligature-like combinations of characters for text mode. + * This includes inputs like "--", "---", "``" and "''". + * The result will simply replace multiple textord nodes with a single + * character in each value by a single textord node having multiple + * characters in its value. The representation is still ASCII source. + * The group will be modified in place. + */ + ; + + _proto.formLigatures = function formLigatures(group) { + var n = group.length - 1; + + for (var i = 0; i < n; ++i) { + var a = group[i]; // $FlowFixMe: Not every node type has a `text` property. + + var v = a.text; + + if (v === "-" && group[i + 1].text === "-") { + if (i + 1 < n && group[i + 2].text === "-") { + group.splice(i, 3, { + type: "textord", + mode: "text", + loc: SourceLocation.range(a, group[i + 2]), + text: "---" + }); + n -= 2; + } else { + group.splice(i, 2, { + type: "textord", + mode: "text", + loc: SourceLocation.range(a, group[i + 1]), + text: "--" + }); + n -= 1; + } + } + + if ((v === "'" || v === "`") && group[i + 1].text === v) { + group.splice(i, 2, { + type: "textord", + mode: "text", + loc: SourceLocation.range(a, group[i + 1]), + text: v + v + }); + n -= 1; + } + } + } + /** + * Parse a single symbol out of the string. Here, we handle single character + * symbols and special functions like \verb. + */ + ; + + _proto.parseSymbol = function parseSymbol() { + var nucleus = this.fetch(); + var text = nucleus.text; + + if (/^\\verb[^a-zA-Z]/.test(text)) { + this.consume(); + var arg = text.slice(5); + var star = arg.charAt(0) === "*"; + + if (star) { + arg = arg.slice(1); + } // Lexer's tokenRegex is constructed to always have matching + // first/last characters. + + + if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { + throw new src_ParseError("\\verb assertion failed --\n please report what input caused this bug"); + } + + arg = arg.slice(1, -1); // remove first and last char + + return { + type: "verb", + mode: "text", + body: arg, + star: star + }; + } // At this point, we should have a symbol, possibly with accents. + // First expand any accented base symbol according to unicodeSymbols. + + + if (unicodeSymbols.hasOwnProperty(text[0]) && !src_symbols[this.mode][text[0]]) { + // This behavior is not strict (XeTeX-compatible) in math mode. + if (this.settings.strict && this.mode === "math") { + this.settings.reportNonstrict("unicodeTextInMathMode", "Accented Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); + } + + text = unicodeSymbols[text[0]] + text.substr(1); + } // Strip off any combining characters + + + var match = combiningDiacriticalMarksEndRegex.exec(text); + + if (match) { + text = text.substring(0, match.index); + + if (text === 'i') { + text = "\u0131"; // dotless i, in math and text mode + } else if (text === 'j') { + text = "\u0237"; // dotless j, in math and text mode + } + } // Recognize base symbol + + + var symbol; + + if (src_symbols[this.mode][text]) { + if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) { + this.settings.reportNonstrict("unicodeTextInMathMode", "Latin-1/Unicode text character \"" + text[0] + "\" used in " + "math mode", nucleus); + } + + var group = src_symbols[this.mode][text].group; + var loc = SourceLocation.range(nucleus); + var s; + + if (ATOMS.hasOwnProperty(group)) { + // $FlowFixMe + var family = group; + s = { + type: "atom", + mode: this.mode, + family: family, + loc: loc, + text: text + }; + } else { + // $FlowFixMe + s = { + type: group, + mode: this.mode, + loc: loc, + text: text + }; + } // $FlowFixMe + + + symbol = s; + } else if (text.charCodeAt(0) >= 0x80) { + // no symbol for e.g. ^ + if (this.settings.strict) { + if (!supportedCodepoint(text.charCodeAt(0))) { + this.settings.reportNonstrict("unknownSymbol", "Unrecognized Unicode character \"" + text[0] + "\"" + (" (" + text.charCodeAt(0) + ")"), nucleus); + } else if (this.mode === "math") { + this.settings.reportNonstrict("unicodeTextInMathMode", "Unicode text character \"" + text[0] + "\" used in math mode", nucleus); + } + } // All nonmathematical Unicode characters are rendered as if they + // are in text mode (wrapped in \text) because that's what it + // takes to render them in LaTeX. Setting `mode: this.mode` is + // another natural choice (the user requested math mode), but + // this makes it more difficult for getCharacterMetrics() to + // distinguish Unicode characters without metrics and those for + // which we want to simulate the letter M. + + + symbol = { + type: "textord", + mode: "text", + loc: SourceLocation.range(nucleus), + text: text + }; + } else { + return null; // EOF, ^, _, {, }, etc. + } + + this.consume(); // Transform combining characters into accents + + if (match) { + for (var i = 0; i < match[0].length; i++) { + var accent = match[0][i]; + + if (!unicodeAccents[accent]) { + throw new src_ParseError("Unknown accent ' " + accent + "'", nucleus); + } + + var command = unicodeAccents[accent][this.mode]; + + if (!command) { + throw new src_ParseError("Accent " + accent + " unsupported in " + this.mode + " mode", nucleus); + } + + symbol = { + type: "accent", + mode: this.mode, + loc: SourceLocation.range(nucleus), + label: command, + isStretchy: false, + isShifty: true, + // $FlowFixMe + base: symbol + }; + } + } // $FlowFixMe + + + return symbol; + }; + + return Parser; +}(); + +Parser.endOfExpression = ["}", "\\endgroup", "\\end", "\\right", "&"]; + +;// CONCATENATED MODULE: ./src/parseTree.js +/** + * Provides a single function for parsing an expression using a Parser + * TODO(emily): Remove this + */ + + + +/** + * Parses an expression using a Parser, then returns the parsed result. + */ +var parseTree = function parseTree(toParse, settings) { + if (!(typeof toParse === 'string' || toParse instanceof String)) { + throw new TypeError('KaTeX can only parse string typed expression'); + } + + var parser = new Parser(toParse, settings); // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors + + delete parser.gullet.macros.current["\\df@tag"]; + var tree = parser.parse(); // Prevent a color definition from persisting between calls to katex.render(). + + delete parser.gullet.macros.current["\\current@color"]; + delete parser.gullet.macros.current["\\color"]; // If the input used \tag, it will set the \df@tag macro to the tag. + // In this case, we separately parse the tag and wrap the tree. + + if (parser.gullet.macros.get("\\df@tag")) { + if (!settings.displayMode) { + throw new src_ParseError("\\tag works only in display equations"); + } + + parser.gullet.feed("\\df@tag"); + tree = [{ + type: "tag", + mode: "text", + body: tree, + tag: parser.parse() + }]; + } + + return tree; +}; + +/* harmony default export */ var src_parseTree = (parseTree); +;// CONCATENATED MODULE: ./katex.js +/* eslint no-console:0 */ + +/** + * This is the main entry point for KaTeX. Here, we expose functions for + * rendering expressions either to DOM nodes or to markup strings. + * + * We also expose the ParseError class to check if errors thrown from KaTeX are + * errors in the expression, or errors in javascript handling. + */ + + + + + + + + + + +/** + * Parse and build an expression, and place that expression in the DOM node + * given. + */ +var render = function render(expression, baseNode, options) { + baseNode.textContent = ""; + var node = renderToDomTree(expression, options).toNode(); + baseNode.appendChild(node); +}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and +// disable rendering. + + +if (typeof document !== "undefined") { + if (document.compatMode !== "CSS1Compat") { + typeof console !== "undefined" && console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your " + "website has a suitable doctype."); + + render = function render() { + throw new src_ParseError("KaTeX doesn't work in quirks mode."); + }; + } +} +/** + * Parse and build an expression, and return the markup for that. + */ + + +var renderToString = function renderToString(expression, options) { + var markup = renderToDomTree(expression, options).toMarkup(); + return markup; +}; +/** + * Parse an expression and return the parse tree. + */ + + +var generateParseTree = function generateParseTree(expression, options) { + var settings = new Settings(options); + return src_parseTree(expression, settings); +}; +/** + * If the given error is a KaTeX ParseError and options.throwOnError is false, + * renders the invalid LaTeX as a span with hover title giving the KaTeX + * error message. Otherwise, simply throws the error. + */ + + +var renderError = function renderError(error, expression, options) { + if (options.throwOnError || !(error instanceof src_ParseError)) { + throw error; + } + + var node = buildCommon.makeSpan(["katex-error"], [new SymbolNode(expression)]); + node.setAttribute("title", error.toString()); + node.setAttribute("style", "color:" + options.errorColor); + return node; +}; +/** + * Generates and returns the katex build tree. This is used for advanced + * use cases (like rendering to custom output). + */ + + +var renderToDomTree = function renderToDomTree(expression, options) { + var settings = new Settings(options); + + try { + var tree = src_parseTree(expression, settings); + return buildTree(tree, expression, settings); + } catch (error) { + return renderError(error, expression, settings); + } +}; +/** + * Generates and returns the katex build tree, with just HTML (no MathML). + * This is used for advanced use cases (like rendering to custom output). + */ + + +var renderToHTMLTree = function renderToHTMLTree(expression, options) { + var settings = new Settings(options); + + try { + var tree = src_parseTree(expression, settings); + return buildHTMLTree(tree, expression, settings); + } catch (error) { + return renderError(error, expression, settings); + } +}; + +/* harmony default export */ var katex = ({ + /** + * Current KaTeX version + */ + version: "0.13.2", + + /** + * Renders the given LaTeX into an HTML+MathML combination, and adds + * it as a child to the specified DOM node. + */ + render: render, + + /** + * Renders the given LaTeX into an HTML+MathML combination string, + * for sending to the client. + */ + renderToString: renderToString, + + /** + * KaTeX error, usually during parsing. + */ + ParseError: src_ParseError, + + /** + * Parses the given LaTeX into KaTeX's internal parse tree structure, + * without rendering to HTML or MathML. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __parse: generateParseTree, + + /** + * Renders the given LaTeX into an HTML+MathML internal DOM tree + * representation, without flattening that representation to a string. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __renderToDomTree: renderToDomTree, + + /** + * Renders the given LaTeX into an HTML internal DOM tree representation, + * without MathML and without flattening that representation to a string. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __renderToHTMLTree: renderToHTMLTree, + + /** + * extends internal font metrics object with a new object + * each key in the new object represents a font name + */ + __setFontMetrics: setFontMetrics, + + /** + * adds a new symbol to builtin symbols table + */ + __defineSymbol: defineSymbol, + + /** + * adds a new macro to builtin macro list + */ + __defineMacro: defineMacro, + + /** + * Expose the dom tree node types, which can be useful for type checking nodes. + * + * NOTE: This method is not currently recommended for public use. + * The internal tree representation is unstable and is very likely + * to change. Use at your own risk. + */ + __domTree: { + Span: Span, + Anchor: Anchor, + SymbolNode: SymbolNode, + SvgNode: SvgNode, + PathNode: PathNode, + LineNode: LineNode + } +}); +;// CONCATENATED MODULE: ./katex.webpack.js +/** + * This is the webpack entry point for KaTeX. As ECMAScript, flow[1] and jest[2] + * doesn't support CSS modules natively, a separate entry point is used and + * it is not flowtyped. + * + * [1] https://gist.github.com/lambdahands/d19e0da96285b749f0ef + * [2] https://facebook.github.io/jest/docs/en/webpack.html + */ + + +/* harmony default export */ var katex_webpack = (katex); +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/page/10/index.html b/page/10/index.html new file mode 100644 index 00000000..23505256 --- /dev/null +++ b/page/10/index.html @@ -0,0 +1,6 @@ +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    06 +Jul 2020

    Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)

    Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!
    05 +Jul 2020
    31 +May 2020
    31 +May 2020

    Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apache

    在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。
    25 +May 2020
    \ No newline at end of file diff --git a/page/11/index.html b/page/11/index.html new file mode 100644 index 00000000..79b3894a --- /dev/null +++ b/page/11/index.html @@ -0,0 +1,10 @@ +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    24 +May 2020
    27 +Apr 2020

    Podcast Episode #1:Apache SkyWalking 那些事

    ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。
    21 +Apr 2020
    20 +Apr 2020
    16 +Apr 2020
    \ No newline at end of file diff --git a/page/12/index.html b/page/12/index.html new file mode 100644 index 00000000..98f055b8 --- /dev/null +++ b/page/12/index.html @@ -0,0 +1,10 @@ +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    04 +Apr 2020
    03 +Apr 2020

    Apache 软件基金会2020年度董事会成员介绍

    一年一度的基金会董事会成员选举在上周落下了帷幕,新旧成员的更替就这样更新着,在我们进一步理解 Apache 之前,我们暂时将之视为新闻即可。顺道看下有没有你认识的成员。
    02 +Apr 2020
    02 +Apr 2020
    15 +Mar 2020
    \ No newline at end of file diff --git a/page/13/index.html b/page/13/index.html new file mode 100644 index 00000000..745a6dba --- /dev/null +++ b/page/13/index.html @@ -0,0 +1,3 @@ +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    15 +Mar 2020
    \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html index 56c00090..faece3bf 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -1,34 +1,7 @@ -ALC Beijing

    Apache孵化器指南表格版

    作者:狄晓晓 -项目孵化成为ASF顶级项目的步骤 详见Apache Incubator cookbook -步骤 内容 详情 1 与孵化器沟通 孵化器PMC管理孵化器,帮助项目孵化。 2 寻找领路人(champion)和孵化导师,讨论并准备孵化提案 项目要进入孵化器,需要一个领路人(Apache officer或member)和至少2-3个导师(IPMC member)(孵化过程涉及的各角色及其职责请参见Roles and Responsibilities)。 3 创建孵化提案 领路人会帮助项目准备孵化提案,该提案将用于下一步与孵化器PMC的讨论。提案可以根据模板编写,需要包含几个标准部分。

    Apache ServiceComb带您对话Apache大咖

    Apache ServiceComb带您对话Apache大咖 前言: 这是一篇两年半前的活动记录,应该最早的一批Apache项目Committer参加的Meetup,在这次会上跟大家分享了很多Apache项目孵化的相关的经验,以及开源软件商业的故事。特别值得说明的是在最近结束的ASF成员大会中,文中的有四位专家当选成为ASF董事会成员,这些经验今天看来对大家也是很有启发的。 -PMC沉睡了怎么办?首次发版项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决!有人给项目提交Patch,我们从来不说“No“!我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱&hel

    Apache 软件基金会品牌使用指南

    Apache 软件基金会品牌使用指南 翻译: 王堉琛 -原文出处:http://www.apache.org/foundation/marks/ -Apache® 品牌被 200 多个 Apache 软件基金会(ASF)项目社区共享,它也是我们使命——为公众利益提供软件——的重要组成部分。本品牌使用指南为引用 Apache® 软件项目和产品提供了示例。 -重要提示: 如果您请求在域名、活动或服务中使用 Apache 品牌,则必须遵循本指南。 -术语: 项目( Projects) 是 ASF 中开发并管理软件的组织委员会(PMC)。产品( Products) 是提供给公众的软件代码和下载。在大多数情况下,Apache 项目

    Apache 下游项目的品牌使用原则

    Apache Apache 下游项目的品牌使用原则 翻译: 王福政 -原文地址: http://www.apache.org/foundation/marks/downstream.html -初稿 ~ 初稿 ~ 初稿 本下游发行品牌政策定义了希望以原始 Apache® 产品名称分发 Apache® 软件产品的下游软件发行商的要求。希望使用其他名称的发行商应遵循我们正式商标政策。 -下游发行品牌政策 Apache 软件产品由一些为其平台提供软件包的下游实体分发。例如,Docker 镜像、Linux 发行商和云平台供应商。 -Apache 软件基金会认识到这些下游发行商的重要性,并乐于看到他们在遵循这一政策的前提下,以 A

    Apache 商标使用管理原则

    Apache 商标使用管理原则 翻译: 聂帅 原文出处:http://www.apache.org/foundation/marks/ -本文档概述了允许使用 Apache® 商标的其他方的政策。 -Apache 软件基金会(ASF)拥有所有与 Apache 相关的商标,服务标志,代表我们 Apache 社区的标志,所有 Apache 项目的名称都是 Apache 的商标。 -以下信息有助于确保其他方以经许可的方式使用我们的商标和徽记,确保我们能够合法的保护我们的项目品牌,并且鼓励第三方以所批准的方式使用 Apache 软件和我们的品牌。如果您对此政策或者 Apache 商标有任何疑问,可以联系我们,并请阅读我们的商标

    Apache 项目网站商标原则

    Apache 项目网站商标原则 翻译: 王皓月 -原文地址: http://www.apache.org/foundation/marks/pmcs -本文定义了商标原则,定义了 Apache®projects 网站显示的元素,以及如何正确地对待 Apache 和其他组织的商标。PMC 商标责任还解释了 PMC 成员应该以何种方式管理项目商标。 -项目网站和 URL 原则:使用 * .APACHE.ORG Apache 项目必须在 apache.org 域上托管官方网站,包括由项目 PMC 监督的内容(包括顶级网站,下载和 Wiki),并确保 ASF 基础架构团队可以维护服务,同时告知用户该内容是官方的并且来自 AS

    Apache孵化器指南

    Apache孵化器指南 翻译:狄晓晓 -Apache孵化器是项目捐赠到ASF的入口。目前国内越来越多的开源项目通过Apache孵化器进入Apache软件基金会孵化。 -本文翻译至 https://incubator.apache.org/cookbook/,为大家介绍了项目进入Apache孵化器需要做的准备,以及孵化过程中做的工作。 -该指南与孵化器主页为大家提供了在ASF孵化项目所需的必要信息。该指南汇集了所有孵化器的相关问题,给出了孵化器目标和过程的概述,并提供了更多详细信息的链接。 -该指南内容按照项目从被接收孵化到毕业成为顶级项目(Top-Level Project,TLP)的时间顺序进行组织。 -欢迎大家通过ge

    ALC Beijing Episode #9 开源社区中的非代码贡献

    音频编辑: 周禹任 -文案: 周禹任 -内容梗概 在开源社区中,除了代码贡献之外,非代码贡献同样也有着十分重要的作用。两者相辅相成,才能一起构建起更加蓬勃的社区。本期节目中,ALC Beijing 邀请到了两位在校的大学生嘉宾,她们都是以非代码贡献者身份分别加入到 CHAOSS 和 Apache 的社区当中。她们在融入社区的同时,也丰富了自身的经历并获得了成长。 -那么在本期节目中,就让我们一起来聊一聊大学生究竟该如何参与到开源社区中,以及她们在开源社区中都能得到哪些收获。通过与他们的对谈,我们也可以对开源社区中的非代码贡献的方式及其对社区的意义有一个更深的了解。 -时间线 时间区间 精彩话语提炼 03:1

    ALC Beijing Episode #8 Apache ECharts 孵化之路

    音频编辑: 余梓寒 -文案: 姜宁,余梓寒 -内容梗概 作为一个前端开发人员,你在制作各种报表的时候,一定离不开一个非常棒的project,那就是Apache ECharts。Apache ECharts 用 JavaScript 编写,基于支持 Canvas 和 SVG 的 ZRender 渲染引擎,提供了一系列动态的、高度可定制的图表类型,包括线图、柱图、散点图、饼图、雷达图、K 线图、仪表图、漏斗图、热力图等。最新发布的Apache ECharts 5 通过在动画叙事、优化的可视化设计、交互体验、性能提升、开发体验、国际化、可访问性等方面的 15 项新功能和改进,让开发者更容易讲述数据背后的故事。 -最近 Apa

    从初识社区到融入社区

    推荐语:夏小雅是华东师范大学数据学院的在读研究生,也是X-lab成员之一。我认识小雅还是在去年年初的时候,我和她聊了一下她选的ServiceComb的实践项目,当时能感觉得到她参与开源的经验还很少;后续在CHOASS 项目例会中发现她逐渐活跃起来,逐步在社区中找到自己的位置了;在刚刚结束的 CHOASS Shanghai Meetup,小雅忙前忙后俨然成为一个在 CHOASS 社区很相当活跃的活动组织者。 -&ndash; ALC Beijing 发起人 姜宁 -CHAOSS CHAOSS(Community Health Analytics Open Source Software)是Linux基金会下专注于开源社

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    07 +Apr 2023
    12 +Jan 2022

    【Apache 博客】之 ASF 软件安全报告

    Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。
    29 +Aug 2021
    03 +May 2021

    ALC Beijing Episode #10 谈谈内源2

    本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。
    29 +Apr 2021
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html index 60b41861..68eb89f8 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -1,19 +1,11 @@ -ALC Beijing

    ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享

    内容梗概 在校大学生作为开源贡献者参与到顶级开源项目中,这对很多同学来说是一件很遥远而又陌生的事情。“不知道如何参与开源项目”、“不知道如何玩转社区”、“不知道如何和社区成员交流沟通”等问题,将跃跃欲试的同学们拦在开源项目的大门之外。 -2020年暑假,中科院软件所发起来了一个非常好的学生暑期实习计划&ndash;“点亮计划暑期2020”。这个计划鼓励研究人员、开源爱好者、在校师生参与开源软件的开发与维护,促进开源软件在国内的发展和优秀开源软件社区建设,增加开源项目在国内的活跃度,在开源领域与世界接轨。 这次“点亮计划暑期2020”通过开源社区导师出题,在校学生根据导师出的题目题目进行方案设计并提向导师提起项目申请

    ALC Beijing Episode #6 IoTDB 背后的科研故事(上)

    内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 03:16 本次嘉宾的自我介绍 03:20~~ 05:36 创立IoTDB的原因 05:50~~ 09:00 为什么IoTDB会开源 09:12~~

    ALC Beijing Episode #6 IoTDB 背后的科研故事(下)

    内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 02:16 信息分享的同时要有很多的检索机制来查找 03:00~~ 05:11 高校是开源事业发展的沃土 05:12~~ 10:00 IoTDB 进入Ap

    暑期 2020 活动学生(张可)心得分享

    引言 如果能结合自己的科研学习述求参与到实际的开源项目中,既能为自己的后续的科研工作助力,又能在开源社区结识到一群志同道合的小伙伴,并且还能得到项目导师的指导,同时还能有一定的经济收益。 -暑期2020涌现出来了很多优秀的学生和导师, 这次 ALC Beijing 特别邀请张可给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期 2020 的导师同学的访谈播客,敬请关注。 -今年暑假期间我参加了开源软件供应链点亮计划—暑期 2020 的活动,在这个活动中,我主要参加了 Apache SkyWalk

    暑期2020活动心得分享

    引言 暑期2020涌现出来了很多优秀的学生和导师, 这次ALC Beijing 特别邀请江华禧给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期2020的导师同学的访谈播客,敬请关注。 -背景 我是一个热爱编程、热爱技术的人,⼀直以来都向往着能参与到开源项⽬中锻炼⾃⼰,但当我面对庞大而复杂的项目代码时,却感到手足无措,不知该从何开始。⽽此次的“开源软件供应链点亮计划-暑期2020”活动则正好提供了这样⼀个机会:清晰的任务要求、开源社区成员作为导师提供指导以及一笔丰厚的奖金,让我顺利地踏上了开源

    ALC Beijing 活动: Apache PMC 亲自教你系列

    目的 在诺大一个中国,开源的相关运转机理、成功方法等还是一片荒芜,ALC Beijing 不仅要怯魅,还得防止复魅。在接下来的2021年,我们特别每月推出一次在线的指导和交流,内容涵盖进入Apache的方方面面,包括但不限于: -进入apache 软件基金会的开源项目有何附加值? 开源或闭源项目如何加入Apache软件基金会孵化? 成为Apache Member 是一种什么体验? 如何让我的patch 被Apache 项目接受? 如何选择一个Apache开源项目进行贡献? &hellip;&hellip; 准备条件 一台安装有Zoom软件的接入互联网的终端设备,以及安静的角落。 -即将播出,在线交流 主题

    亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?

    作者:赵禹光 -简介: 2020年11月14日Apache SkyWalking 2020 DevCon由贝壳找房和tetrate赞助,Apache SkyWalking、云原生、Apache APISIX、Apache Pulsar 和 ALC Beijing 五大社区合作,在贝壳找房一年级会议室盛大举行,本次活动主要面对Apache SkyWalking的使用者、开发者和潜在用户。线上线下共有230多人报名。经统计,实际参加活动人数超过130人,近60%的人愿意抽出自己的休息时间,来交流学习Apache SkyWalking和开源文化。不难看见,在可预见的未来,中国的开源项目很快将进入下一个维度,那必定是更广的

    ALC Beijing Episode #5 : 内源 InnerSource

    内容梗概 开源越来越重要,而且在不断的吞噬着企业的软件技术栈,有的研究机构甚至得出的结论是超过95%都是开源,越来越多的软件开发者把开源的优秀实践带到企业内部。Tim OrReilly在2000年的时候发明了内源 (InnerSource)这个词,用来解释这一现象。 根据维基百科的定义,内源就是使用了开源软件开发的最佳实践,在组织内部建立起了一种类似开源的文化氛围。组织内部使用了开放的方式开发专有软件。 -为了让帮助大家进一步了解与内源相关的信息,ALC Beijing 播客邀请到有着多年开源以及内源经验的专家谭中意和我们聊一下内源这个话题。 -时间线 时间区间 精彩话语提炼 00:00:10 - 00

    我与开源的那些事儿

    我与开源的那些事儿。 很幸运!!!是的,很幸运,除了幸运,我不知道该怎么形容我和 开源 的缘分。感觉就好像在冥冥之中,肯定会走上这条道路一样。 -缘起 2020注定是特别的一年,年初,谁也没想到,一场疫情把我们牢牢的困在家里,哪也去不了。。说实话,或多或少有点抱怨吧。但伴随而来的,是一场灾难。那个时候每天一早醒来,看见手机屏幕刷新的数据,冰冷的可怕,红线一直在升。。。当时就在想,为什么我不是学医的,待在家里什么都做不了,似乎捐钱变成了最可悲的方式。 -偶然一次,在知乎上看见关于开发者抗疫的活动——“Wuhan2020”。学计算机专业的我,本身就对技术方面的文章也比较感兴趣,就随手点了进去。( 其实当时内心所想的是

    ASF如何准备董事会会议

    ASF旗下有三百多个项目,董事会只有9个成员,每个项目一个季度就会向董事会发送一次报告,而每个月召开一次董事会会议。 ASF每次董事会,需要处理70+个项目的报告,以及其他与基金会相关的事务。 ASF是如何保证在一个半小时的董事会中能够高效的处理这些报告的? -简单的说ASF为了提高效率,提前让各个项目PMC准备报告,并且开发了一套专门的IT系统whimsy来处理和追踪与董事会议相关的内容。 -本文翻译至 https://www.apache.org/foundation/board/meeting -董事会使用各种工具,并依靠Apache项目的志愿者来确保每月的会议顺利进行。这是一份关于每个月度董事会会议的经典时间表

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    20 +Mar 2021
    13 +Mar 2021
    03 +Mar 2021
    02 +Mar 2021
    02 +Mar 2021
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html index beb72664..9d8ebd97 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -1,23 +1,9 @@ -ALC Beijing

    增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)

    引言 最近的一次数据统计: -序号 项目名称 进入孵化器时间 毕业时间 ppmc/pmc人数 commiter人数(包含ppmc/pmc) 1 Kylin 2014年11月 2015年11月 23 39 2 Eagle 2015年10月 2016年12月 16 18 3 HAWQ 2015年9月 2018年8月 45 68 4 CarbonData 2016年6月 2017年4月 13 25 5 RocketMQ 2016年11月 2017年9月 13 26 6 Griffin 2016年12月 2018年11月 18 20 7 Weex 2016年11月 14 26 8

    文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)

    引言 开源发展至今,来自community 的力量是无法忽视的,甚至有的观点认为,开源的核心就是开源community。我们在上篇: -增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇) 介绍 在Apache孵化项目的过程,需要做什么,以及如何避免走弯路,并给出了完美的实践。Apache SkyWalking的 VP 吴晟先生在 ApacheCon 2020 的Keynote分享上,明确的指出了摆在本土面前重要的障碍之一就是:共同体建设,如何吸引来自全球的开发者,不仅在语言上,更多在文化上有非常大的挑战。 -在COSCon‘2020 + Apache 中国路演的论坛上,我们看

    追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)

    引言 没有什么好说的,从分布式系统到调度器,再到可观察性,以及数据可视化,当然还有消息队列,大数据处理、IoT。 -让更多的人知道项目,才可能从这些人中转化为用户,用户中可能筛选出贡献者,进而形成良性循环,这大概是所有开源项目的期望。 -以下技术内容,因为缺少对比,仅仅在此给大家罗列出来目前在本土所分享的关于技术议题,没有逻辑、没有分类、没有主线,唯一的相似之处就是这些项目是捐赠给了Apache软件基金会,以Apache之道的方式在运作,技术水平如何,解决了用户什么问题,请详细阅读。或者来COSCon的现场聆听。 -项目在生产环境中的落地 本次分享首先会介绍DolphinScheduler社区的发展情况,然后会介绍我们

    正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲

    引言 视频地址:https://www.youtube.com/watch?v=26aFGdbZvac&amp;t=1172s ,需要稳定的网络环境。 -正文 (以下内容根据吴晟的演讲视频进行的人工文字录入,若有出入,请以原视频为准。) -Rich Bowen 介绍了吴晟的出场:Apache SkyWalking VP -大家好!欢迎来到今年的ApacheCon@Home,我加入ASF也有四年的时间了,在过去的四年中我参与和见证了很多的Apache 项目,也为很多项目做了应有的贡献,今天非常荣幸的能够在ApacheCon上和大家分享我的经验,我的分享主题是:成长中的中国本土 Apache,在正式开始之前,我还是介绍一

    ALC Beijing Episode #4 : 技术架构、Community 和康威定律

    内容梗概 软件以其飞速的发展,经过60年的发展,再也没有一个人能够写出来可以使用的软件了,尤其是以自由/开源软件项目的壮大为证,更是让人的协作提上了前所未有的高度。 这也就是说,作为软件的设计者,或者说开源的软件设计者,开始的时候应不应该考虑人与人之间的协作?甚至是以全球视野的想象力来介入,即跨时区的异步沟通为切入点? 那么我们不妨以Apache 软件基金会下众多的项目为例,甚至是以更广泛的开源项目为例,如Linux、Kubernetes等,探讨下关于康威定律是否适用? 架构和开源共同体(Community)究竟有没有关系?如果有的话,二者该如何理解?关系又该如何处理? -ALC Beijing 这次邀请到了Apa

    Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开

    Apache 官方全球大会在线会议目前共有 170+ 场演讲议题,并有来自 DataStax, IBM, Imply, Instaclustr, NASA 喷气推进实验室, 橡树岭国家实验室, Red Hat, Tetrate, Two Sigma 与 VMWare 等公司或组织的众多大咖做主题分享。 -2020 年 9 月 21日, Apache® 软件基金会(ASF),携超过 350 个开源项目的全体志愿开发者、管理员和孵化器,与主题演讲嘉宾、大会赞助商和 ApacheCon@Home 大会组委,郑重宣布:ApacheCon@Home 在线会议将于 2020 年 9月 29 日 - 10 月 1 日召开。本次

    年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!

    简介 ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯1998年,也是在这一届上,开发HTTPD服务的开发者们欢聚一堂,并决定成立 Apache 软件基金会。 -1998年首次ApacheCon大会照片 -[photo attribution (CC BY) Mark Cox. Tagged image at https://www.flickr.com/photos/iamamoose/63963722/in/album-1381277/ ; gallery at https://www.flickr.com/photos/iamamoose

    ApacheCon 2020 参会指南

    每年一度的 Apache北美大会因为疫情的原因转到线上来举行了, 这次会议的主题是ApacheCon@Home, 也就是说借助网络我们可以足不出户就可以参加Apache大会了。 今年的会议为了针对不同的地域特点,特地安排了不同时间段的演讲,同时还专门增加了中文的演讲,欢迎大家关注。 -下面今年ApacheCon的参会指南译自 https://apachecon.com/acah2020/guide.html,祝大家参会愉快! -前期准备 为了您在ApacheCon@Home可以得到最好的体验,我们为你准备了以下清单,这样参会者就可以提前准备。 请提前浏览以下的技术要求和参会前可以准备的事项,这样就不需要在会议的过程中

    到底什么是The Apache Way?

    到底什么是The Apache Way? 作者:谭中意 审核:姜宁 李健盛 我们有可能听到过很多次“The Apache Way”。可能会在某个Apache基金会项目的分享会上,它宣称它的日常工作遵循“The Apache Way”;也有可能在某个InnerSource的分享会上,宣称内部开源就是在企业内部推行“The Apache Way”;也有可能在Apache基金会的报告上或者文档上,看到apache基金会的治理遵循“The Apache Way”。那么“The Apache Way”究竟是什么?我们如何来应用它? -我们先看一看Apache开源基金会对此的解释。从它的官网 https://www.apa

    Podcast Episode #0 : ALC Beijing Podcast 的承诺

    内容梗概 你是如何去发现一件事情的价值的?又如何挖掘其意义的?知识该如何传播?文化该如何习得?Apache 之道作为哲学思想,甚至都找不到一条具体如何去做的规定,又怎么能指导他人了呢? -本期ALC Beijing Podcast ,三位常驻主持人,和大家聊一聊这款播客节目的基调、准则、做事方式,以及一个不那么正式的一个承诺:我们希望以这样的方式,生产高质量的知识,供有缘人学以致用!重要的是听众你的反馈和参与,才是赋予我们节目的真正活力!我们不期望是说我们想说的,而是希望能提供听众想听的。 -时间线 00:10 ~~ 01:10 本期播客的由来 -01:15 ~~ 02:40 三位主持人的自我介绍。(此处有猛料!) -0

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    01 +Mar 2021
    28 +Feb 2021
    31 +Jan 2021
    26 +Jan 2021
    05 +Jan 2021
    \ No newline at end of file diff --git a/page/5/index.html b/page/5/index.html index 25f52f02..00cd7dd9 100644 --- a/page/5/index.html +++ b/page/5/index.html @@ -1,30 +1,8 @@ -ALC Beijing

    ALC Beijing Meetup #1 嘉宾和主题介绍

    主持人 潘娟: -江湖人尊称为“娟神”,京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Membe。才艺俱佳! -Hold 全场! -暖场嘉宾 姜宁 华为开源软件中心技术专家,前红帽软件首席软件工程师,Apache软件基金会成员,Apache软件基金孵化器导师,参与了绝大多个中国发起的Apache基金会项目的孵化。本人06年开始加入到Apache社区项目开发,就被社区开放协作的氛围深深吸引,成为开源深度信徒。现在致力于开源社区建设,以及开源文化推广,尽其所能帮助国内开源项目成功。 -主题分享嘉宾1 李钰 Apache Flink 社区 PMC 成员, Apa

    ALC Beijing 活动

    ALC Beijing 成员采访之李岗: 用青春谱写开源

    内容梗概 来自Apache DolphinScheduler (孵化中)项目的李岗,年轻、对开源充满激情和憧憬,这次参与到ALC Beijing来,也是灌注了满满的热爱和斗志!本次采访将为大家展现一下这位用青春赌上开源梦想之路的大男孩。 -时间线 01:00 ~~ 01:20 李岗自我介绍 -01:20 ~~ 03:10 是如何接触到开源的,然后工作后自然而然的选择开源。感到非常幸运的是参与Apache的项目。 -03:30 ~~ 04:10 从上学到工作,中间所经历的开源共同体的经历。 -04:15 ~~ 09:00 Apache 文化中的个人与公司的见解,自己在经历成长的过程中遇到了那些坑。 -09:10 ~~ 11:

    Apache基金会项目孵化过程中知识产权转移的讨论

    Apache软件基金会项目孵化过程中知识产权转移的讨论 作者:张伟玲 谭中意 审核:姜宁 张亮 作者简介: 张伟玲,多年大型互联网知识产权法律经验,擅长商标、开源、著作权等知识产权法律领域的合规制度建设、 培训和诉讼支持,在互联网信息网络传播/合规/品牌等领域有丰富实战经验。 -讨论背景: 自2002年Apache Software Foundation(ASF)开始孵化项目以来,ASF至今已经毕业了200多个顶级项目。在这些项目中,无论是个人捐赠还是企业捐赠的,都必须严格遵守其孵化流程和政策要求。尤其是近几年来,越来越多的国人发起的开源项目进入Apache基金会孵化,并有不断的项目毕业,Apache开源基金会

    Apache APISIX 的快速之旅(全文版)

    引言 本周我们推出了 Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版),为了能够让更多的习惯于文字阅读的成员们熟悉我们的故事,特别推出了全文实录的文字版,请笑纳! -Apache APISIX 或 APISIX 在下文中均指称:Apache APISIX。 -正文 适兕主持人: -Hello,大家好,欢迎来到ALC 北京 PodCast。这次我们请到的是 APISIX 的核心成员,请各位嘉宾跟我们听众打个招呼。 -温铭: -大家好,我是温铭,Apache APISIX的PPMC成员。我之前是在互联网公司工作了有10年,主要是在做安全方向,然后最近三年都是在做开源软件的商业化

    Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)

    内容梗概 Apache APISIX 在2019年10月份进入了 Apache 软件基金会孵化器,到现在(采访期2020年六月)有7个多月的时间,就做了多达 6 次的 release 发布,也就是说差不多是每个月就会发布1个release,在进入Apache之前,APISIX 只有20多位contributor,截止到现在,已经拥有了80多位committer,在如此之短的时间内,Apache APISIX 是如何做到的?是什么样的魔力,让Apache APISIX 项目、团队、Community 有这么快的加速发展了呢? -请仔细聆听,两位创始人和一位导师的精彩分享。 -时间线 时间区间 妙语连珠 0

    越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺

    引言 2020年过去了一半了,这半年过的猝不及防,过的胆战心惊,让所有人都明白自身的脆弱。开源亦无幸免,尽管在远程协作上,开源有着由来已久的擅长,但是疫情仍然阻止了开源人最为重要的活动—— 线下见面会。 -我们所有人,依然要坚强的抵抗这次疫情,作为开源的一份子,能做到就是继续倡导合作的重要性,即使无法见面,我们可以通过互联网来实现沟通、协作,正如开源世界一直以来都在做的这样。而且要充分的利用互联网的全球性、世界性、跨地域的特性。当然,众所周知,全球性的沟通面临更多的问题:时区、即时、语言、文化等等。 -就Apache 软件基金会而言,作为一家慈善的非营利组织,20多年来一如既往的推动着基于来自全球各地的开发者共同协作

    Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激

    内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 01:00 ~~ 06:30 本次参与嘉宾的个人自述,各有精彩! -07:00 ~~ 10:00 灵魂拷问:在座的 ShardingSphere 成员是如何凝聚(bonding)在一起的,发起人张亮不正经回答。 -10:00 ~~ 13:00 Zhyee 的结识、加入分享,强调开源协作的重要 -1

    Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apache

    内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 00:00 ~~ 02:00 张亮谈开源初心, 开源让技术更为优雅、极致,开源的组织让我们走的更远! -02:10 ~~ 08:30 金卫个人的开源历程,全职做开源梦想成真! -12:00 ~~ 14:30 ShardingSphere 从个人项目到 Apache TLP 中间发生了哪些关键的跃

    【Apache 博客】之 冠状病毒肆虐之下的远程协作

    ALC Beijing 引言 2020年,对于世界上所有的人都是一场灾难,在刚刚开完的两会,国家希望通过地摊经济来复苏中华大地的经济繁荣,当然这在日常的小商品、食物等方面还可以,那么信息经济下,过去一直都在一个屋檐下工作的人,突然变成了在线会议的方式,一定会出现一定不适应,甚至会出现效率低下。这个时候,最应该考虑的就是开源的协作模式!当然,ASF 以其独特的完全虚拟享誉全球!值得学习的地方实在是太多了。 -前序 我(Marvin Humphrey)是在2005年”抵达“ ASF (Apache 软件基金会的简称,下同) 的,起因是我对 Apache Lucene 的一个Bug有了严重的不满情绪,之所以使用“抵达”

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    01 +Jan 2021
    30 +Dec 2020
    30 +Dec 2020
    20 +Dec 2020
    19 +Dec 2020
    \ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html index 6bb340b0..7296a83a 100644 --- a/page/6/index.html +++ b/page/6/index.html @@ -1,23 +1,8 @@ -ALC Beijing

    英雄之旅-行走在开源领域的一个自叙故事

    作者介绍 潘娟,京东数科高级DBA&amp;Apache ShardingSphere PMC,主要负责京东数科分布式数据库开发、数据库运维自动化平台开发等工作。曾负责京东数科数据库自动化平台设计与开发,现专注于Apache ShardingSphere分布式数据库中间件平台的开发。主要在分布式数据库、开源、分布式架构等相关领域进行探索。多次受邀参加数据库&amp;架构领域的相关会议并进行分享交流。 -前序 《英雄之旅》是由美国神话学家约瑟夫·坎贝尔提出的。好莱坞很多经典IP巨作即是把《英雄之旅》的套路搬上了巨幕。 -最近在读一些心理学书籍,随即发现我们每个人的一生都是一场英雄之旅。从被使命召唤、踏上艰辛的考验

    Podcast Episode #1:Apache SkyWalking 那些事

    内容梗概 个人项目、Apache TLP、潇洒的创始人、众多的客户、多个云厂竞相支持、中国本土、APM骨灰级玩家&hellip;&hellip;.拥有众多光环的 SkyWalking ,究竟有何神奇的魔力?在短短的几年内迅猛发展,在竞争如此激烈的APM 市场,获得无数的拥泵! ALC Beijing Podcast 首秀,诚挚邀请到 Apache SkyWalking的创始人、主要的贡献者来聊聊 SkyWalking的酝酿、命名、开发、开源、建设Community、收获用户、发展壮大、进入Apache、孵化、成为TLP、下一代版本、如何维护的。我们就是来不正经地“八卦” Apache 开源项目背后故事! -Sky

    ALC Beijing 志愿者招募

    Open source is changing the world. And if you want to be a part -of that change, all you have to do is participate. Jason Hibbets《 the foundation of an open source city》 -什么是 ALC? ALC是Apache Local Community的缩写,是全世界范围的 Apache 开源爱好者本地群组。 因为是本地组织,ALC 是按照城市或地区的方式进行划分的,类似的机构还有 GDG (Google Developer Group), Faceb

    Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路

    作者介绍 -潘娟,京东数科高级DBA,Apache ShardingSphere PMC 张亮,京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目Elastic-Job作者 -前序 从Sharding-JDBC到Apache ShardingSphere; 从轻量级的分库分表中间件到完整闭环的分布式数据库中间件平台; 从2016年1月的第一行代码到现今的300K+行代码; 从寥寥无几的关注到GitHub 10K+的star; 从无人问津的社区到100+位贡献者; 从公司内部的应用类库到100+的采用公司列表; 从寻找mentor到顺利成为Apa

    为何Apache软件基金会能孵化出如此多成功的开源项目

    ASF基金会的项目来源分为个人捐献项目和公司捐献项目。这两者在进入Apache基金会之后,并不做过多的区分。总体而言,虽然很多传奇的开源项目有个人英雄主义色彩,但也不乏有很多公司捐献的项目获得了巨大的成功(Hadoop, Spark, Kafka等)。那么问题来了,为什么ASF需要设置孵化器项目呢? -孵化器项目的必要性 ASF基金会有统一的开源治理原则与规则(被称为Apache Way, 具体请参考:https://www.apache.org/theapacheway) 来保障开源软件的质量以及开源社区的健康发展。而企业和个人捐献的项目可能五花八门,从而产生巨大的Gap。这个差距可能会包括:开发流程,基础设施支

    ASF公司架构和治理

    公司治理 总的来看,Apache软件基金会(ASF)的治理相当简单:由成员(Member)来选举董事会;董事会任命各种管理人员并创建PMCs;PMCs定期向董事会报告,大多数其他管理人员向总裁汇报,然后总裁向董事会报告。 -组织架构和职责 为了更好的管理公司,ASF建立了如下组织架构: -现有成员(Member)会定期提名和选举新成员,每年提名并选举9名董事加入董事会。 -董事会任命业务官员,并将特定政策或业务领域的责任分配给每位官员。例如,法律事务委员会副总裁负责为ASF和所有Apache项目设置法律政策,并与公司顾问进行合作。 -董事会任命执行官,包括总裁,秘书,财务总监等,他们负责ASF的特定领域运营

    Apache 软件基金会2020年度董事会成员介绍

    在上周 Apache 软件基金会(下称 ASF )举行了成员会议,嗯,没错,就是一年一度的董事会选举会议,会议上以下个人成员组成了新的董事会: -Shane Curcuru (连任董事) Bertrand Delacretaz(原董事) Roy Fielding(原董事) Niclas Hedhman(新任董事) Justin Mclean(新任董事) Craig Russell (连任董事) Sam Ruby(原董事) Patricia Shanahan (新任董事) Sander Striker (原董事) 同时,ASF 要非常感谢去年的董事成员:Danny Angus、Rich Bowen、Ted Dun

    ASF年度大会程序

    ASF年度大会程序 ASF至少每13个月举行一次年度成员大会,选举新的董事会,并对新的候选人进行投票。ASF年度会议由成员志愿者按照以下基本程序进行。 -[说明] 本篇参考[1]内容进行编写,部分措辞和语言组织略有调整,但保证内容含义的严格一致性。ASF虽然是一个非盈利组织,但是ASF是以公司化的方式进行运作的,有股东,董事会,还有执行机构,也有一些其他的雇员。本文中所提到的ASF年度大会算的是股东大会。 -目录 听众 会议机制-IRC沟通 成员候选人投票 如何计算成员投票 怎样决定如何对成员候选人进行投票 董事会投票 如何计算董事会投票 怎样决定如何对候选进行上投票 听众 本文档是ASF召开正式成员

    如何成为合格的ASF贡献者

    阿里土话 ASF是一个开源组织,他有自身的文化,阿里是一个要活好102年的公司,其文化底蕴非凡!分享ASF之前总想或多或少的和大家分享一些阿里的味道! -给世界带来微小而美好的改变 把幸运种子种到别人身上去,你才会有幸运 Never, Never, Never Give Up(永不放弃) 没错,阿里人看到上面的三句话会倍感亲切,因为上面三句都是 “阿里土话”。虽然是阿里土话,但我认为其有放诸四海而皆准的魅力!这些话,同样适用于激发和指导你成为合格的开源贡献者!不经意间看了一眼窗外,心里开心默笑,其实阿里每个角落都充满着阿里气息: -缘 其实每个人参与社区贡献的机缘不一样,但无外乎两种: -偶发事件 - 由于参

    DolphinScheduler介绍

    DolphinScheduler介绍 DolphinScheduler,简称”DS”, 中文名 “小海豚调度”(海豚聪明、人性化,又左右脑可互相换班,终生不用睡觉)。希望 DolphinScheduler 就像它的名字一样,成为一个“开箱即用”的灵活易用的调度系统。 -1概述 DAG 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。 -Apache DolphinScheduler(目前处在孵化阶段)是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    08 +Dec 2020
    16 +Nov 2020
    15 +Nov 2020
    29 +Oct 2020
    21 +Oct 2020
    \ No newline at end of file diff --git a/page/7/index.html b/page/7/index.html index 7d6c8338..384441fb 100644 --- a/page/7/index.html +++ b/page/7/index.html @@ -1,4 +1,6 @@ -ALC Beijing
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    12 +Oct 2020
    12 +Oct 2020

    文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)

    在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?
    12 +Oct 2020

    追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)

    放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。
    12 +Oct 2020
    30 +Sep 2020

    ALC Beijing Episode #4 : 技术架构、Community 和康威定律

    在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?
    \ No newline at end of file diff --git a/page/8/index.html b/page/8/index.html new file mode 100644 index 00000000..03f6a2c4 --- /dev/null +++ b/page/8/index.html @@ -0,0 +1,10 @@ +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    25 +Sep 2020
    16 +Sep 2020
    15 +Sep 2020
    30 +Aug 2020
    13 +Aug 2020

    Podcast Episode #0 : ALC Beijing Podcast 的承诺

    Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?
    \ No newline at end of file diff --git a/page/9/index.html b/page/9/index.html new file mode 100644 index 00000000..b6c015bf --- /dev/null +++ b/page/9/index.html @@ -0,0 +1,7 @@ +ALC Beijing 博客 - All about static site generation
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    11 +Aug 2020
    11 +Aug 2020
    30 +Jul 2020
    24 +Jul 2020
    09 +Jul 2020

    Apache APISIX 的快速之旅(全文版)

    Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!
    \ No newline at end of file diff --git a/post/alc-beijing-creation/index.html b/post/alc-beijing-creation/index.html index 4f21a63f..e664799e 100644 --- a/post/alc-beijing-creation/index.html +++ b/post/alc-beijing-creation/index.html @@ -1,9 +1,8 @@ -为什么要成立 ALC (Apache Local Community) Beijing? · ALC Beijing

    为什么要成立 ALC (Apache Local Community) Beijing?

    背景

    当提起Apache软件基金会(Apache Software Foundation,ASF)项目时,国内大多数程序员都不会陌生。下图展示了在ASF 2019年年度报告中披露的ASF软件在全球各国家的下载量排名。

    可以看到,中国已然成为Apache软件基金会项目下载量最大的地区。然而,这个看起来脱颖而出的数据背后,却暴露出我国这片土地上几个可能让大家颇为惊讶的现状:

    • ASF 拥有7000+代码贡献者,然而为 ASF 项目提交贡献的本土工程师仅千人规模,不足七分之一。
    • ASF 项目约350个,然而由本土发起的 ASF 项目仅19个,已成为顶级项目的比例更是不足5%。
    • ASF 孵化器拥有导师200多个,然而活跃的中国导师不超过5位。
    • ASF 每年在美国、欧洲等地举办 ApacheCon ,然而迄今为止,ASF 尚未在中国举办过一次 ApacheCon。 +为什么要成立 ALC (Apache Local Community) Beijing? | ALC Beijing 博客
      ALC Beijing 博客

      介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

      15 +Mar 2020

      为什么要成立 ALC (Apache Local Community) Beijing?

      背景

      当提起Apache软件基金会(Apache Software Foundation,ASF)项目时,国内大多数程序员都不会陌生。下图展示了在ASF 2019年年度报告中披露的ASF软件在全球各国家的下载量排名。

      可以看到,中国已然成为Apache软件基金会项目下载量最大的地区。然而,这个看起来脱颖而出的数据背后,却暴露出我国这片土地上几个可能让大家颇为惊讶的现状:

      • ASF 拥有7000+代码贡献者,然而为 ASF 项目提交贡献的本土工程师仅千人规模,不足七分之一。
      • ASF 项目约350个,然而由本土发起的 ASF 项目仅19个,已成为顶级项目的比例更是不足5%。
      • ASF 孵化器拥有导师200多个,然而活跃的中国导师不超过5位。
      • ASF 每年在美国、欧洲等地举办 ApacheCon ,然而迄今为止,ASF 尚未在中国举办过一次 ApacheCon。 作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者甚至成为开源项目的发起者、维护者是一个值得深思的问题。

      缘起

      作为发起人的姜宁,颇为忧伤的语气回忆道:

      06年的时候国内参与 Apache 软基金会开发的人员很少,当时只有少数几个在外企工作的人员有机会直接参与ASF项目的开发。当时有个问题一直困扰着我,本土的软件开发人员这么多,但有多少人能够以开源项目维护人员的身份深度参与到开源项目开发中来呢?

      以我的个人经历来看,加入到开源项目的开发贡献并不困难,因为开源社区会有很多热心的开发者提供指导和帮助,参与者只要保证有足够时间的投入就可以,但是在我维护 Apache Camel 的7,8年间,很少看到有国人会到项目的邮件列表里面用英文提问题,提补丁。

      我的私人邮箱接到国人最多的邮件是直接提需求找我要项目示例的邮件。期间也有国内公司的开发人员与我交流,很多人在使用ASF 项目的过程中发现开源版本不满足自己的需求,就在自己的公司的私有版本上进行了修改,大家没有意识到把问题反馈到ASF上游项目中是最优的解决方法。这里可能有缺乏直接和项目开发者交流的途径原因,也可能是大家已经习惯了拿来主义,缺乏深度参与开源项目开发的热情。 大部分的开发者只停留在使用开源项目这个层面上,没有真正参与到开源项目的全生命周期的开发过程中来。

      要改变这样的状况,需要有更多深度参与ASF项目人向大家介绍深度参与开源项目的经验,帮助更多的 ASF 项目用户从单纯的使用者转变成为开源项目的开发者。

      机会只会迟到,但永远不会缺席,过了大约十几年,终于迎来了一次真正的机会。

      自 2015年至今,ASF 已经接收19个源自中国本土的开源项目的捐赠(如下表所示),这也意味这我们有越来越多的 ASF 项目 Committer,ASF 项目 PMC 成员,或者是 ASF Member 在 Community 里是非常活跃的。这说明本土的人气已经足够, 我们可以一起做更多的事情了。

      序号项目名称进入孵化器时间毕业时间ppmc/pmc人数commiter人数(包含ppmc/pmc)
      1Kylin2014年11月2015年11月2339
      2Eagle2015年10月2016年12月1618
      3HAWQ2015年9月2018年8月4568
      4CarbonData2016年6月2017年4月1325
      5RocketMQ2016年11月2017年9月1326
      6Griffin2016年12月2018年11月1820
      7Weex2016年11月1426
      8ServiceComb2017年11月2018年10月2023
      9SkyWalking2017年12月2019年4月2434
      10Dubbo2018年2月2019年5月1755
      11ECharts2018年1月1319
      12Doris2018年7月1317
      13brpc2018年11月99
      14IoTDB2018年11月2332
      15ShardingSphere2018年11月2020年5月1424
      16DolphinScheduler2019年8月1322
      17Teaclave2019年8月1515
      18APISIX2019年10月2020年7月1820
      19TubeMQ2019年11月2021

      在参与了几个Apache项目孵化之后 ,姜宁已然是一名国内比较有影响力的 ASF 成员 了。他于2018年和2019年在上海发起并组织过两次 ASF Committer 的 Meetup[1][2][3],希望能够帮助本土的开发者更好的理解开源、参与开源。由于时间仓促和场地有限,只邀请到华东地区的 ASF 项目开发者,并没有惠及到更多的的 ASF 项目的用户。通过这几次 Meetup, 大家发现本土开发者对于 Apache 理念和倡导的哲学并不了解。

      Apache 的成功之道认为开源项目的健康发展是需要有 Community 支撑的。开源项目通过发展用户,孕育社区可以为开源项目源源不断输送新鲜的血液,对于新人来说依托于 Community 帮助可以不断成长,为开源项目不断做出贡献。这进一步引发了大家对于 Apache 之道的呼唤。

      天时、地利、人和都具备了,那么我们为什么不去做了呢? 介绍 Apache 之道,传播 Apache 精神,让更多的年轻人认识 Apache 和开源之道, 让本土的项目被更多的人知道…… 于是,一个距离大家更近的、本地的 Apache Community 的建立就呼之欲出了。

      什么是 Apache Local Community?

      顾名思义,它是由一群分布在各地开源爱好者,尤其是 Apache(开源)爱好者(Group)所组成的[4]。因为是本地组织,ALC是按照城市或地区的方式进行划分的,类似的机构如 GDG (Google Developer Group), Facebook Developer Circles, Mozilla Reps 等,你可以代表自己所在城市向 ALC 提出申请创建本地的组织。

      筹划

      在经过了多年以来的困惑、近期的思考、以及与各类人员的交流后,就像是串起海边拾起的珍珠一样,姜宁如获至宝般的发现并了解了 ALC 。自那以后,他就开始盘算起来:

      • 在北京的Apache项目开发者(BRPC, Doris, Dubbo, IoTDB, BookKeeper, Plusar, ServiceComb, Sharding-Sphere, Skywalking, RocketMQ)已经超过十个了。
      • 这些项目几乎每个月都会举办 Meet up 或者其他方式的活动。

      于是他做了一个大胆的决定:咱们终于有机会可以以 Apache 成员的身份约小伙伴们一起聚一下,共商发展本地 Apache 用户,同时推动项目间的合作。然后姜宁就在邮件列表里面发了这么一封信[5], 没有想到的是,这个提议得到了很多人的响应,大家纷纷回复邮件对成立 ALC Beijing 这件事表示支持! (这就是 Apache 的精髓,公开透明,所有的历史讨论和决策都有据可查。)

      成立

      经过在 ASF Community dev 邮件列表[6]申请,ALC 投票通过之后,ALC 正式宣布成立 ALC Beijing[7]。

      • 第一次在线会议 2020年2月27日,举办了第一次线上会议[7],成员之间相互介绍,商议提名新成员的步骤,商议举办线上活动问题。
      • 第二次在线会议 2020年3月5日,依然是 Zoom 线上会议[7], 这次主要是讨论如何撰写宣传文章等内容。
      • 第三次在线会议 -2020年3月12日, 通过 Zoom 线举办线上会议[7],讨论了微信公众号以及线上活动准备需要的注意内容。

      ALC Beijing 做什么?

      当然作为 ALC Beijing Chapter 的 一份子,我们可以做的事情还有很多:

      • 通过举办活动,将本地的开发与用户聚焦在一起。
      • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来;
      • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
      • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。

      成员寄语

      目前的ALC Beijing 成员列表[8]。

      希望 ALC Beijing 能够为连接开源用户与开发者的一条纽带,让更多的中国开发者能够开启一次精彩的开源之旅。

      —— ALC Beijing 成员 姜宁

      ALC Beijing 致力于成为一个更具 Beijing 特色的ASF组织,是 ASF 全球推广的 Beijing 中继器。

      —— ALC Beijing 成员 孙金城

      对于推广 Apache 之道 在本土的发展至关重要。

      —— ALC Beijing 成员 、开源之道发起人 适兕

      期待ALC Beijing能成为培育我国本土开源力量的沃土。期待未来某一天,中国之于Apache不仅仅是下载量第一,贡献度也无与伦比。

      —— ALC Beijing 成员 黄向东

      期待每个人的加入,在这里你会看到另一种开源与开发者的风景;你会感受到中国与世界在开源领域的奇妙融合。Beyond the country, head into this world.

      —— ALC Beijing 成员 潘娟

      ALC Beijing把大家印象中高高在上的Apache基金会,和Apache顶级项目,带到了大家身边。希望大家从ALC起步,走进Apache顶级开源社区

      —— ALC Beijing 成员 吴晟

      期待 ALC Beijing 作为开源爱好者的家园,吸引、带动更多的志同道合的伙伴加入到 Apache 项目的使用、贡献和推广中。

      —— ALC Beijing 翟佳

      相信ALC Beijing一定会帮助越来越多的开发者、企业拥抱开源、也一定会吸引更多的优秀项目进入apache。

      —— ALC Beijing 李岗

      如何成为 ALC Beijing的一员

      ALC Beijing 欢迎任何人的参与!不设置任何门槛,只有有意愿传播 Apache 以及开源之道的小伙伴都可以参与进来!具体的方式如下:

      • 加入我们的活动。大家可以通过关注ALC Beijing公众号获取最新的活动信息,并参加我们的线上或者线下的活动。
      • 成为ALC Beijing会员。ALC Beijing作为一个公益组织,需要大量的志愿者的来帮助协调和组织活动。志愿者加入的原则和Apache软件基金的其他项目发展Committer以及PMC成员的方式一样, 基于大家在社区中的贡献,采用投票邀请方式[10]进行。

      特别感谢

      • Swapnil M Mane (ALC 印度创始成员,ALC Beijing 指导者)
      • Aditya Sharma (ALC 印度创始成员,ALC Beijing 指导者)

      参考链接

      © . Made with Hugo using the Tale theme.
      \ No newline at end of file +2020年3月12日, 通过 Zoom 线举办线上会议[7],讨论了微信公众号以及线上活动准备需要的注意内容。

    ALC Beijing 做什么?

    当然作为 ALC Beijing Chapter 的 一份子,我们可以做的事情还有很多:

    • 通过举办活动,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来;
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。

    成员寄语

    目前的ALC Beijing 成员列表[8]。

    希望 ALC Beijing 能够为连接开源用户与开发者的一条纽带,让更多的中国开发者能够开启一次精彩的开源之旅。

    —— ALC Beijing 成员 姜宁

    ALC Beijing 致力于成为一个更具 Beijing 特色的ASF组织,是 ASF 全球推广的 Beijing 中继器。

    —— ALC Beijing 成员 孙金城

    对于推广 Apache 之道 在本土的发展至关重要。

    —— ALC Beijing 成员 、开源之道发起人 适兕

    期待ALC Beijing能成为培育我国本土开源力量的沃土。期待未来某一天,中国之于Apache不仅仅是下载量第一,贡献度也无与伦比。

    —— ALC Beijing 成员 黄向东

    期待每个人的加入,在这里你会看到另一种开源与开发者的风景;你会感受到中国与世界在开源领域的奇妙融合。Beyond the country, head into this world.

    —— ALC Beijing 成员 潘娟

    ALC Beijing把大家印象中高高在上的Apache基金会,和Apache顶级项目,带到了大家身边。希望大家从ALC起步,走进Apache顶级开源社区

    —— ALC Beijing 成员 吴晟

    期待 ALC Beijing 作为开源爱好者的家园,吸引、带动更多的志同道合的伙伴加入到 Apache 项目的使用、贡献和推广中。

    —— ALC Beijing 翟佳

    相信ALC Beijing一定会帮助越来越多的开发者、企业拥抱开源、也一定会吸引更多的优秀项目进入apache。

    —— ALC Beijing 李岗

    如何成为 ALC Beijing的一员

    ALC Beijing 欢迎任何人的参与!不设置任何门槛,只有有意愿传播 Apache 以及开源之道的小伙伴都可以参与进来!具体的方式如下:

    • 加入我们的活动。大家可以通过关注ALC Beijing公众号获取最新的活动信息,并参加我们的线上或者线下的活动。
    • 成为ALC Beijing会员。ALC Beijing作为一个公益组织,需要大量的志愿者的来帮助协调和组织活动。志愿者加入的原则和Apache软件基金的其他项目发展Committer以及PMC成员的方式一样, 基于大家在社区中的贡献,采用投票邀请方式[10]进行。

    特别感谢

    • Swapnil M Mane (ALC 印度创始成员,ALC Beijing 指导者)
    • Aditya Sharma (ALC 印度创始成员,ALC Beijing 指导者)

    参考链接

    \ No newline at end of file diff --git a/post/alc-beijing-member-self-introduce/index.html b/post/alc-beijing-member-self-introduce/index.html index f74104b0..d5d38bb4 100644 --- a/post/alc-beijing-member-self-introduce/index.html +++ b/post/alc-beijing-member-self-introduce/index.html @@ -1,3 +1,5 @@ -越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺 · ALC Beijing

    越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺

    引言

    2020年过去了一半了,这半年过的猝不及防,过的胆战心惊,让所有人都明白自身的脆弱。开源亦无幸免,尽管在远程协作上,开源有着由来已久的擅长,但是疫情仍然阻止了开源人最为重要的活动—— 线下见面会。

    我们所有人,依然要坚强的抵抗这次疫情,作为开源的一份子,能做到就是继续倡导合作的重要性,即使无法见面,我们可以通过互联网来实现沟通、协作,正如开源世界一直以来都在做的这样。而且要充分的利用互联网的全球性、世界性、跨地域的特性。当然,众所周知,全球性的沟通面临更多的问题:时区、即时、语言、文化等等。

    就Apache 软件基金会而言,作为一家慈善的非营利组织,20多年来一如既往的推动着基于来自全球各地的开发者共同协作,当然有可能会在地域色彩特别的地方会遇到一些障碍,比如在中国本土遇到的异步沟通问题。即使是这样,在中国本土仍然有勇敢而坚定的先行者们,他们不仅以身作则,突破了很多障碍,而且还顺利的晋升为 Apache 软件基金会的成员,更加重要的是他们在自身已经全球化之后,要将本土的后来者也带上,但是首先要做的是本土化。

    嗯,这就是 Apache local Community Beijing 成员们,以下是他们的个人介绍和承诺!

    视频

    时间线

    时间出场人物
    00:00 ~~ 00:10不容错过的Apache logo 片头
    00:11 ~~ 01:23开源重度爱好者姜宁
    01:24 ~~ 02:50开源玩家吴晟
    02:51 ~~ 03:37陈亮
    03:38 ~~ 05:11至凡至简 的 孙金城
    05:12 ~~ 05:52张亮
    05:53 ~~ 06:52潘娟,娟神
    06:53 ~~ 07:41李钰
    07:42 ~~ 08:40黄向东,清华大学
    08:41 ~~ 10:00李岗
    10:01 ~~ 11:24温铭
    11:25 ~~ 12:26布道师适兕

    精彩语录

    在 ALC Beijing ,你可以结识到Apache的开源大牛、了解 Apache 项目的最新进展,更有机会参与到实际的开发当中,全方位的提高自身的水平与能力。

    Apache 成员,ALC Beijing 创始人, 姜宁

    ALC Beijing 可以从文化上很好的引导本土的开发者走向国际。

    Apache 成员,SkyWalking VP,吴晟

    ALC Beijing 的成立意味着中国的声音将在国际的舞台上响起。

    Apache 成员,孙金诚

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    05 +Jul 2020

    越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺

    引言

    2020年过去了一半了,这半年过的猝不及防,过的胆战心惊,让所有人都明白自身的脆弱。开源亦无幸免,尽管在远程协作上,开源有着由来已久的擅长,但是疫情仍然阻止了开源人最为重要的活动—— 线下见面会。

    我们所有人,依然要坚强的抵抗这次疫情,作为开源的一份子,能做到就是继续倡导合作的重要性,即使无法见面,我们可以通过互联网来实现沟通、协作,正如开源世界一直以来都在做的这样。而且要充分的利用互联网的全球性、世界性、跨地域的特性。当然,众所周知,全球性的沟通面临更多的问题:时区、即时、语言、文化等等。

    就Apache 软件基金会而言,作为一家慈善的非营利组织,20多年来一如既往的推动着基于来自全球各地的开发者共同协作,当然有可能会在地域色彩特别的地方会遇到一些障碍,比如在中国本土遇到的异步沟通问题。即使是这样,在中国本土仍然有勇敢而坚定的先行者们,他们不仅以身作则,突破了很多障碍,而且还顺利的晋升为 Apache 软件基金会的成员,更加重要的是他们在自身已经全球化之后,要将本土的后来者也带上,但是首先要做的是本土化。

    嗯,这就是 Apache local Community Beijing 成员们,以下是他们的个人介绍和承诺!

    视频

    时间线

    时间出场人物
    00:00 ~~ 00:10不容错过的Apache logo 片头
    00:11 ~~ 01:23开源重度爱好者姜宁
    01:24 ~~ 02:50开源玩家吴晟
    02:51 ~~ 03:37陈亮
    03:38 ~~ 05:11至凡至简 的 孙金城
    05:12 ~~ 05:52张亮
    05:53 ~~ 06:52潘娟,娟神
    06:53 ~~ 07:41李钰
    07:42 ~~ 08:40黄向东,清华大学
    08:41 ~~ 10:00李岗
    10:01 ~~ 11:24温铭
    11:25 ~~ 12:26布道师适兕

    精彩语录

    在 ALC Beijing ,你可以结识到Apache的开源大牛、了解 Apache 项目的最新进展,更有机会参与到实际的开发当中,全方位的提高自身的水平与能力。

    Apache 成员,ALC Beijing 创始人, 姜宁

    ALC Beijing 可以从文化上很好的引导本土的开发者走向国际。

    Apache 成员,SkyWalking VP,吴晟

    ALC Beijing 的成立意味着中国的声音将在国际的舞台上响起。

    Apache 成员,孙金诚

    \ No newline at end of file diff --git a/post/apache-blog/apache-security-report/index.html b/post/apache-blog/apache-security-report/index.html index 4b5be554..6b26c70a 100644 --- a/post/apache-blog/apache-security-report/index.html +++ b/post/apache-blog/apache-security-report/index.html @@ -1,3 +1,5 @@ -【Apache 博客】之 ASF 软件安全报告 · ALC Beijing

    【Apache 博客】之 ASF 软件安全报告

    ALC Beijing 引言

    2021年末的log4jshell问题让开源软件的安全问题再次成为大家关注的热点问题。 ASF最近的这篇2021年的软件安全报告让我们可以更加深入了解Apache软件基金会是的安全响应流程, 安全响应团队的日常的工作任务, 以及2021年度Apache软件基金会旗下项目关键安全事件。希望这篇报告能够帮助大家对Apache软件基金会基于志愿者的软件安全处理有更加全面的了解。

    Apache软件基金会博客

    Apache 软件基金会安全报告:2021年

    概要:本报告探讨了2021年 Apache 软件基金会所有项目的安全状况。我们回顾了关键指标、特定漏洞以及 ASF 项目用户受安全问题影响的最常见方式。

    发布时间:2022 年 1 月

    作者:Mark Cox,Apache软件基金会安全副总裁

    背景

    Apache 软件基金会 (ASF) 的安全委员会负责监督和协调所有 350 多个 Apache 项目中漏洞的处理。我们成立于 2002 年,由所有志愿者组成,我们对如何处理问题有一个标准流程,这个流程包括我们的项目必须如何披露安全问题。

    在 Apache 项目中发现安全问题的任何人都可以将它们报告给 security@apache.org,在那里它们会被记录下来并传递给相关的专门安全团队或项目管理委员会 (PMC) 来处理。安全委员会监控所有项目报告的所有问题,并在整个漏洞生命周期中跟踪问题。

    安全委员会负责确保问题得到妥善处理,并积极提醒项目突出的问题和责任。作为董事会委员会,我们有能力采取行动,包括阻止其未来的发布,或者在最坏的情况下,如果项目对处理其安全问题没有响应,则将项目退休归档。这与 Apache 许可证 v2.0一起,是 ASF 围绕官方发布的一般治理功能的关键部分,使 ASF 能够保护个人开发人员,并让用户有信心部署和依赖 ASF 软件。

    对所有安全报告的监督以及我们开发的工具使我们能够轻松创建有关问题的指标。我们的上一份报告涵盖了2020年的指标

    2021年统计数据

    2021 年,我们的安全电子邮件地址总共收到了约 18,500 封电子邮件。在垃圾邮件过滤和讨论主题分组之后,有 1272 个(2020年:946个,2019年:620个)非垃圾邮件主题。不幸的是,安全报告有时确实看起来像垃圾邮件,尤其是当它们包含大量附件或大型视频时,因此安全团队会仔细审查所有邮件,以确保真实安全报告不会错过太长时间。

    图1:2021 年 ASF 安全电子邮件主题的细分

    图1给出了这 1272 个电子邮件主题的细分。359 个电子邮件主题 (28%) 与 Apache 许可证使用困惑相关的问题。由于许多项目都使用 Apache 许可证,而不仅仅是那些在 ASF 保护伞下的项目,当人们看到 Apache 许可证并且他们不明白它是什么时,他们可能会感到困惑。这在手机上最常见,例如在设置菜单中显示许可证的手机上,通常是由于包含 Google 根据 Apache 许可证发布的软件。我们不再回复这些电子邮件。这比 2020 年收到的 257 个有所增加。

    接下来的 1272 个(26%)中,337 个电子邮件主题是大家询问非安全(通常是支持类型)问题。

    接下来的 135 份报告是研究人员在 Apache 网站上报告的问题。这些几乎总是误报;研究人员报告我们启用了目录列表、源代码可见、公共“.git”目录等等。这些报告通常是一些公开可用的扫描工具的未经过滤的输出,并且通常是报告者要求我们为他们的报告提供某种金钱奖励(赏金)的地方。

    剩下的 441 份(2020年:376份,2019年:320份)报告,涉及2021年的新漏洞,涵盖99个顶级项目。这 441 份报告是外部报告者和内部报告者的混合体。例如,如果一个项目自己发现了一个问题,并按照ASF流程为其分配了一个 CVE(通用漏洞和暴露)名称并解决了它,我们仍然会在这里计算它。我们不会保留能够提供内部报告与外部报告细分的指标。

    下一步是相应的项目对报告进行分类,以查看它是否真的是一个问题。无效的报告和实际上不是漏洞的报告将被拒绝返回给报告者。在接受的其余问题中,它们被分配了适当的CVE名称,并最终发布了修复程序。

    截至 2022 年 1 月 1 日,这 441 份报告中有 50 份仍在分类和调查中。这是指一个项目正在处理一个问题,但截至 2022 年 1 月 1 日的快照,还没有拒绝该问题或为其分配一个 CVE。这个数字高于我们通常的预期,这是由于 2021 年 12 底有大量的报告涌入造成的。

    剩下的 391 个(2020:341 份、2019:301 份)报告导致我们分配了 183 个(2020:151、2019:122)个 CVE 名称。有些漏洞报告可能包含多个问题,有些报告跨多个项目,有些报告是重复的,即不同的报告者发现了相同的问题,因此所接受的报告与 CVE 名称之间并没有一个精确的一对一的映射。Apache 安全委员会负责处理 CVE 名称分配,并且是 MITRE 候选命名机构 (CNA),因此任何 ASF 项目中所有关于 CVE 名称的请求都要通过我们来处理,即使报告者不知道,直接联系 MITRE 或者在联系我们之前公开一个问题。

    值得注意的事件

    2021 年有几件事值得讨论;要么是因为它们是严重的、高风险的,它们有现成的漏洞利用情况,要么是受到媒体的关注。这些事件包括:

    时间表

    我们的安全团队和项目管理团队都是志愿者,因此我们不会就问题的处理给出任何正式的 SLA。但是,我们可以分解流程每个部分的目的和目标:

    分类:我们的目标是在三个工作日内处理发送到security@apache.org的邮件。我们不会对此流程进行度量或报告,因为我们会评估每个接受到问题的严重性,并适当地应用我们拥有的有限资源。该团队由来自不同项目 PMC 的极少数志愿者组成。安全团队将报告转发给 PMC 后,PMC 将回复报告者。有时,由于收到电子邮件的大小限制,报告者发送的报告附有大型 PDF 文件甚至是开发视频,但由于收到的电子邮件的大小限制,这些文件无法发送给我们,所以请确保任何后续行动是一个简单的纯文本电子邮件。

    调查:一旦将报告发送到项目管理委员会的私有邮件列表中,分类和调查的过程会根据项目、资源的可用性和要评估的问题数量而有所不同。由于安全问题是私下处理的,我们会将报告发送到仅由 PMC 组成的私有邮件列表中。因此,这些报告不会传达给每个项目提交者,因此每个项目中只有一小部分人能够进行调查并作出响应。作为一般准则,我们尽量确保项目在报告后 90 天内对问题进行分类。ASF 安全团队会跟进任何超过 90 天的未处理问题。

    修复:一旦安全问题被分类和接受,修复问题的时间表取决于项目本身的时间表。严重程度较低的问题最常被保留到预先计划的版本。

    公告:我们的流程允许项目在发布修复版本和发布漏洞之间最多有几天的时间。所有漏洞和缓解软件版本都通过announce@apache.org列表公布。我们现在的目标是让它们在发布后的一天内出现在公共 CVE 项目列表中,对于关键问题甚至更快。

    结论

    Apache 软件基金会的项目是高度多样化和独立的。他们有不同的语言、社区、管理和安全模式。然而,每个项目都有一个共同点,那就是在处理报告的安全问题时有一个一致的流程。

    ASF 安全委员会与项目团队、社区和报告者密切合作,以确保问题得到快速、正确的处理。这种负责任的监督是 The Apache Way 的一项原则,有助于确保Apache软件的稳定性和可信赖性。

    该报告提供了 2021 年的指标,显示从收到的18500封电子邮件中,我们筛选出超过 390 份与 ASF 项目相关的漏洞报告,从而修复了 183 (CVE) 问题。与 2020 年相比,处理的非垃圾邮件主题数量增加了 34%,实际漏洞报告数量增加了 17%,分配的 CVE 增加了 21%。

    虽然 ASF 经常会快速推出关键问题的更新,但报告显示,用户正被 ASF 软件中多年未能更新的旧问题所利用,而供应商(以及他们的用户)仍然在使用有已知未修复漏洞的生命周期结束的版本。这将继续是一个大问题,我们致力于解决这个全行业的问题,以找出我们可以做些什么来提供帮助。

    如果您有想要分享的漏洞信息,请与我们联系或对此报告发表评论,请参阅公共安全讨论邮件列表

    Apache Software Foundation Security Report: 2021

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +【Apache 博客】之 ASF 软件安全报告 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    12 +Jan 2022

    【Apache 博客】之 ASF 软件安全报告

    ALC Beijing 引言

    2021年末的log4jshell问题让开源软件的安全问题再次成为大家关注的热点问题。 ASF最近的这篇2021年的软件安全报告让我们可以更加深入了解Apache软件基金会是的安全响应流程, 安全响应团队的日常的工作任务, 以及2021年度Apache软件基金会旗下项目关键安全事件。希望这篇报告能够帮助大家对Apache软件基金会基于志愿者的软件安全处理有更加全面的了解。

    Apache软件基金会博客

    Apache 软件基金会安全报告:2021年

    概要:本报告探讨了2021年 Apache 软件基金会所有项目的安全状况。我们回顾了关键指标、特定漏洞以及 ASF 项目用户受安全问题影响的最常见方式。

    发布时间:2022 年 1 月

    作者:Mark Cox,Apache软件基金会安全副总裁

    背景

    Apache 软件基金会 (ASF) 的安全委员会负责监督和协调所有 350 多个 Apache 项目中漏洞的处理。我们成立于 2002 年,由所有志愿者组成,我们对如何处理问题有一个标准流程,这个流程包括我们的项目必须如何披露安全问题。

    在 Apache 项目中发现安全问题的任何人都可以将它们报告给 security@apache.org,在那里它们会被记录下来并传递给相关的专门安全团队或项目管理委员会 (PMC) 来处理。安全委员会监控所有项目报告的所有问题,并在整个漏洞生命周期中跟踪问题。

    安全委员会负责确保问题得到妥善处理,并积极提醒项目突出的问题和责任。作为董事会委员会,我们有能力采取行动,包括阻止其未来的发布,或者在最坏的情况下,如果项目对处理其安全问题没有响应,则将项目退休归档。这与 Apache 许可证 v2.0一起,是 ASF 围绕官方发布的一般治理功能的关键部分,使 ASF 能够保护个人开发人员,并让用户有信心部署和依赖 ASF 软件。

    对所有安全报告的监督以及我们开发的工具使我们能够轻松创建有关问题的指标。我们的上一份报告涵盖了2020年的指标

    2021年统计数据

    2021 年,我们的安全电子邮件地址总共收到了约 18,500 封电子邮件。在垃圾邮件过滤和讨论主题分组之后,有 1272 个(2020年:946个,2019年:620个)非垃圾邮件主题。不幸的是,安全报告有时确实看起来像垃圾邮件,尤其是当它们包含大量附件或大型视频时,因此安全团队会仔细审查所有邮件,以确保真实安全报告不会错过太长时间。

    图1:2021 年 ASF 安全电子邮件主题的细分

    图1给出了这 1272 个电子邮件主题的细分。359 个电子邮件主题 (28%) 与 Apache 许可证使用困惑相关的问题。由于许多项目都使用 Apache 许可证,而不仅仅是那些在 ASF 保护伞下的项目,当人们看到 Apache 许可证并且他们不明白它是什么时,他们可能会感到困惑。这在手机上最常见,例如在设置菜单中显示许可证的手机上,通常是由于包含 Google 根据 Apache 许可证发布的软件。我们不再回复这些电子邮件。这比 2020 年收到的 257 个有所增加。

    接下来的 1272 个(26%)中,337 个电子邮件主题是大家询问非安全(通常是支持类型)问题。

    接下来的 135 份报告是研究人员在 Apache 网站上报告的问题。这些几乎总是误报;研究人员报告我们启用了目录列表、源代码可见、公共“.git”目录等等。这些报告通常是一些公开可用的扫描工具的未经过滤的输出,并且通常是报告者要求我们为他们的报告提供某种金钱奖励(赏金)的地方。

    剩下的 441 份(2020年:376份,2019年:320份)报告,涉及2021年的新漏洞,涵盖99个顶级项目。这 441 份报告是外部报告者和内部报告者的混合体。例如,如果一个项目自己发现了一个问题,并按照ASF流程为其分配了一个 CVE(通用漏洞和暴露)名称并解决了它,我们仍然会在这里计算它。我们不会保留能够提供内部报告与外部报告细分的指标。

    下一步是相应的项目对报告进行分类,以查看它是否真的是一个问题。无效的报告和实际上不是漏洞的报告将被拒绝返回给报告者。在接受的其余问题中,它们被分配了适当的CVE名称,并最终发布了修复程序。

    截至 2022 年 1 月 1 日,这 441 份报告中有 50 份仍在分类和调查中。这是指一个项目正在处理一个问题,但截至 2022 年 1 月 1 日的快照,还没有拒绝该问题或为其分配一个 CVE。这个数字高于我们通常的预期,这是由于 2021 年 12 底有大量的报告涌入造成的。

    剩下的 391 个(2020:341 份、2019:301 份)报告导致我们分配了 183 个(2020:151、2019:122)个 CVE 名称。有些漏洞报告可能包含多个问题,有些报告跨多个项目,有些报告是重复的,即不同的报告者发现了相同的问题,因此所接受的报告与 CVE 名称之间并没有一个精确的一对一的映射。Apache 安全委员会负责处理 CVE 名称分配,并且是 MITRE 候选命名机构 (CNA),因此任何 ASF 项目中所有关于 CVE 名称的请求都要通过我们来处理,即使报告者不知道,直接联系 MITRE 或者在联系我们之前公开一个问题。

    值得注意的事件

    2021 年有几件事值得讨论;要么是因为它们是严重的、高风险的,它们有现成的漏洞利用情况,要么是受到媒体的关注。这些事件包括:

    时间表

    我们的安全团队和项目管理团队都是志愿者,因此我们不会就问题的处理给出任何正式的 SLA。但是,我们可以分解流程每个部分的目的和目标:

    分类:我们的目标是在三个工作日内处理发送到security@apache.org的邮件。我们不会对此流程进行度量或报告,因为我们会评估每个接受到问题的严重性,并适当地应用我们拥有的有限资源。该团队由来自不同项目 PMC 的极少数志愿者组成。安全团队将报告转发给 PMC 后,PMC 将回复报告者。有时,由于收到电子邮件的大小限制,报告者发送的报告附有大型 PDF 文件甚至是开发视频,但由于收到的电子邮件的大小限制,这些文件无法发送给我们,所以请确保任何后续行动是一个简单的纯文本电子邮件。

    调查:一旦将报告发送到项目管理委员会的私有邮件列表中,分类和调查的过程会根据项目、资源的可用性和要评估的问题数量而有所不同。由于安全问题是私下处理的,我们会将报告发送到仅由 PMC 组成的私有邮件列表中。因此,这些报告不会传达给每个项目提交者,因此每个项目中只有一小部分人能够进行调查并作出响应。作为一般准则,我们尽量确保项目在报告后 90 天内对问题进行分类。ASF 安全团队会跟进任何超过 90 天的未处理问题。

    修复:一旦安全问题被分类和接受,修复问题的时间表取决于项目本身的时间表。严重程度较低的问题最常被保留到预先计划的版本。

    公告:我们的流程允许项目在发布修复版本和发布漏洞之间最多有几天的时间。所有漏洞和缓解软件版本都通过announce@apache.org列表公布。我们现在的目标是让它们在发布后的一天内出现在公共 CVE 项目列表中,对于关键问题甚至更快。

    结论

    Apache 软件基金会的项目是高度多样化和独立的。他们有不同的语言、社区、管理和安全模式。然而,每个项目都有一个共同点,那就是在处理报告的安全问题时有一个一致的流程。

    ASF 安全委员会与项目团队、社区和报告者密切合作,以确保问题得到快速、正确的处理。这种负责任的监督是 The Apache Way 的一项原则,有助于确保Apache软件的稳定性和可信赖性。

    该报告提供了 2021 年的指标,显示从收到的18500封电子邮件中,我们筛选出超过 390 份与 ASF 项目相关的漏洞报告,从而修复了 183 (CVE) 问题。与 2020 年相比,处理的非垃圾邮件主题数量增加了 34%,实际漏洞报告数量增加了 17%,分配的 CVE 增加了 21%。

    虽然 ASF 经常会快速推出关键问题的更新,但报告显示,用户正被 ASF 软件中多年未能更新的旧问题所利用,而供应商(以及他们的用户)仍然在使用有已知未修复漏洞的生命周期结束的版本。这将继续是一个大问题,我们致力于解决这个全行业的问题,以找出我们可以做些什么来提供帮助。

    如果您有想要分享的漏洞信息,请与我们联系或对此报告发表评论,请参阅公共安全讨论邮件列表

    Apache Software Foundation Security Report: 2021

    \ No newline at end of file diff --git a/post/apache-blog/success-at-apache-remote-collaboration/index.html b/post/apache-blog/success-at-apache-remote-collaboration/index.html index c3de0cd2..2444fb42 100644 --- a/post/apache-blog/success-at-apache-remote-collaboration/index.html +++ b/post/apache-blog/success-at-apache-remote-collaboration/index.html @@ -1,3 +1,5 @@ -【Apache 博客】之 冠状病毒肆虐之下的远程协作 · ALC Beijing

    【Apache 博客】之 冠状病毒肆虐之下的远程协作

    ALC Beijing 引言

    2020年,对于世界上所有的人都是一场灾难,在刚刚开完的两会,国家希望通过地摊经济来复苏中华大地的经济繁荣,当然这在日常的小商品、食物等方面还可以,那么信息经济下,过去一直都在一个屋檐下工作的人,突然变成了在线会议的方式,一定会出现一定不适应,甚至会出现效率低下。这个时候,最应该考虑的就是开源的协作模式!当然,ASF 以其独特的完全虚拟享誉全球!值得学习的地方实在是太多了。

    前序

    我(Marvin Humphrey)是在2005年”抵达“ ASF (Apache 软件基金会的简称,下同) 的,起因是我对 Apache Lucene 的一个Bug有了严重的不满情绪,之所以使用“抵达”这个词汇,就像是我找到了某种归属,因为自从那时发起了第一封邮件之后,在接下来的15年里,我发送了数以万计的邮件,可想而知我在ASF花了多长时间,这几乎是我的第二个家。由于 ASF 一直以来都没有实际的“物理”办公室,所以也就免去了很多现实中的麻烦,比如是否穿戴得体、肢体语言是否合规等等,其实就那个Bug 来讲,我当时不满的原因是:Doug Cutting (Hadoop创始人 ——译者注),当时还是Lucene 项目的贡献者,认为他非常没有耐心。

    让我们回到本文的主题上了,因为Apache 这20多年来没有实际的办公室,大家均是基于互联网这个虚拟的线上共同体而工作在一起,所以新冠病毒发生以来,其实对于 Apache 的成员和贡献者们的影响是微乎其微的,尽管对于每位贡献者的个人生活上是确确实实受到了影响,但是就ASF的整体而言,并没有出现什么不适应之类的。

    但是 ASF 之外仍然有很多的人,他们未必有这样的一套机制和习惯,世界各地的人们都在为抗争疫情而努力,尤其是“社交距离”的约定,原有的公司章程等均可为此而进行修订,另外让人痛心不已的是,有些人根本都没有机会来进行改变,直接破产倒闭,人已经失业了。

    然而,决定改变的人们遭遇到了一些窘境,是将大量的工作采用了远程的方式来做,但是进展缓慢;突然而至的远程工作,人们措手不及。那么我们是不是可以如此的积极思考了呢?加快并简化向远程协作的过渡,那么可以节省不少的精力,并可以提高效率。这里可能需要加上一点创造力,面对疫情之下的“新常态”,是可以做到比原来更加高效的,而且也不需要花多久就可以适应。

    请问你是开源贡献者吗?如果是的话,那么贡献你,你已经具备了当前全球复杂经济面前的急需的远程工作的能力和知识,接下来就让我们来聊聊我们所知道的以及或许可以帮助到你的一些内容。

    互联网将人们变成了“怪物”

    在互联网,人们彼此的交流大多是通过对着电脑屏幕敲打键盘完成的,这区别于我们现实中面对面的语言交流。作为社会性的人类,我们可以通过他人的面部表情、语气、肢体语言等反馈来对自己进行相应的校准,并作出适当的反应。当时,当所有的沟通和交流都通过击打键盘来完成的时候,就没有了面对面那种反馈机制,这对于人来说是及其难以适应的事情,往往会产生一些不好的效果,尤其是带有情绪的词汇。

    那么,过往一直以来都是在办公室交流的人们,突然转移到了Slack、电子邮件、以及其它以文本的方式交流的方式和渠道,有一定的不适应是较为正常的,但是通过文本来进行沟通是有难度的,需要训练自身的同理心来获得提升,个人建议去观看“Jimmy Kimmel Show” 当中的“名人阅读Tweets”节目, 可以有效提升自己对于一些词语的敏感度。

    世界是动态演变的,只要开源共同体仍然有存在的意义,那么它就必须在每一天都要和这些不便进行斗争。随着时间的流逝,“阴谋”的人身攻击由于其潜在的腐蚀作用而逐渐成为禁忌。这就成就了我们在文化上的共识:应该去评判那些想法,而不是人本身。

    随着越来越多的共同体采用“行为准则”,辩护变得越来越正式和复杂。这些明文的文档,主要目的是防止骚扰,以及其它严重的不当行为,这些文档通常包含有关共同体成员应如何彼此相待的颇为理想的建议,因为在鱼龙混杂的环境下特别容易产生一些严重的不当行为。

    无论如何,各位看官,你自身所在的组织是否采用了行为准则,自觉的提高职员们对来自网络的攻击性的警觉意识,是上佳选择。基于此之上,职员们才能有效的识别言辞,设身处地的为他人着想,从而使每个人都能够采用更具建设性的沟通方式。

    知会大家

    不过话说回来了,即使是在同一个办公室内,人与人之间的协调依然是件充满挑战的事情。当然,在远程这样的形势中,协调的难度更是加大了不少,需要付出更多的精力,这个时候最需要建立的就是公开透明的“知会大家”文化,否则,团队将变得碎片化,每个人也将变得孤立。

    在ASF,这样的情形可谓是极端化了,因为 Apache 的在线共同体遍布全球各个角落。由于牵扯到的时区实在过多,一般情况下是无法召集到全部的利益相关者在一起开会的,即使是在线视频会议也难以成行,另外,还有一个因素,那就是不是所有的贡献者都是专门针对 apache 项目进行的,大多时候是业余时间进行的。

    面对面,视频聊天,电话,文本聊天等“同步”通信渠道非常适合快速启动迭代和提炼想法,但实际上却将任何不实时关注的人排除在外。即使捕获了对话(例如通过AV录制的实时会议或记录的文本聊天),它的效率也很低,并且常常使事后回顾事情的发展变得混乱。

    面对如此的情形,ASF 采用的策略就是所有有实际意义的项目都需要在 单个、异步沟通渠道中进行。

    • 这个频道必须要严肃对待起来,从而能够让所有的参与者都信任该频道,即使是人们没有来得及观看和参与所有的消息,但是重要的内容不会被错过。
    • 沟通渠道必须是异步的,从而确保一些资源受限的参与者的权益。

    另外,关于同步的活动是可以在此频道之外进行的,再强调一点,同步有其自身的优点,同步的沟通对于迭代想法非常的有效,但是,身处共同体的人还是希望此类的会议能够被记录摘要,并将之发布到刚才提到的沟通渠道,从而使得所有的利益相关者有机会发表各自的看法。

    在 ASF,这个严肃而正式的异步通信渠道就是邮件列表,但这不代表什么,其它也有非常好的工具:对于某些非技术性的任务,可以是 Asana ,也可以是 Wiki,甚至是一个电子表格,都是可以的。过度追求技术上是没有太多意义的,最为关键的仍然是亮点:1)正式 2)异步。

    做出决策

    在办公室,决策者可以通过获得各种各样的信息:如通过不经意的偷听、一起吃工作午餐、即兴的协作等等,然而在不期而至的远程工作中,这些渠道统统不复存在,只有经过人们深思熟虑的信息,是唯一的决策依据。

    但是,一个正式的异步通信渠道在某种程度上可以对这样的情形进行一定的补偿,这样的方式有效的提高了透明度,所有的工作及其进度、成员的合作状态,都是一目了然的,即使哪怕是工作是独立完成的,也是众人皆知的。而恰恰是通过正确的使用异步沟通渠道获得信息,而不是混乱而冗长的实时的信息交换,这样就可以有一个从高处观看的视角来洞察整个全局的情况,另外,正式的沟通渠道还有一个至为重要的能力,那就是可以衡量大家达成的共识,还保持所有的记录。

    懒人共识法(Lazy consensus)是一种蛮有效率的确认方式,例如某位成员将提案发布出来,如果在某个时间范围内(ASF为72小时)没有异议,则该提案被认为是隐式同意的。通过对沟通渠道进行积极的监督,将那些有缺陷的提案标记出来,懒人共识法 是鼓励积极主动者颇为强大的工具,这也是远程参与者非常宝贵的个人品质。

    总结

    冠状病毒疫情肆虐之下,人类的组织正在以各式各样的方式抵抗和对付这场灾难。

    在开放源代码的世界,二十多年来,已经有不计其数的优秀的项目在基于互联网的方式下运作,可以说是在远程协作方面积累了非常丰厚的经验,当然也走过很多的弯路。或许我们这些开源界的人,可以帮助到面对突如其来面临远程协作的团队,帮助其在艰难的时刻找到自己的方式。就让我们帮助他们做到最好吧,这也是我们的初衷之一。

    关于作者

    Marvin Humphrey 目前是Apache 软件基金会的名誉会员,在过去他担当过ASF 的很多主要角色:孵化器的VP、法律事务的VP 、以及董事会成员。目前则将主要精力放在了家庭上,偶尔出来做做咨询。

    原文链接

    Success at Apache: Remote Collaboration in the Time of Coronavirus

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +【Apache 博客】之 冠状病毒肆虐之下的远程协作 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    25 +May 2020

    【Apache 博客】之 冠状病毒肆虐之下的远程协作

    ALC Beijing 引言

    2020年,对于世界上所有的人都是一场灾难,在刚刚开完的两会,国家希望通过地摊经济来复苏中华大地的经济繁荣,当然这在日常的小商品、食物等方面还可以,那么信息经济下,过去一直都在一个屋檐下工作的人,突然变成了在线会议的方式,一定会出现一定不适应,甚至会出现效率低下。这个时候,最应该考虑的就是开源的协作模式!当然,ASF 以其独特的完全虚拟享誉全球!值得学习的地方实在是太多了。

    前序

    我(Marvin Humphrey)是在2005年”抵达“ ASF (Apache 软件基金会的简称,下同) 的,起因是我对 Apache Lucene 的一个Bug有了严重的不满情绪,之所以使用“抵达”这个词汇,就像是我找到了某种归属,因为自从那时发起了第一封邮件之后,在接下来的15年里,我发送了数以万计的邮件,可想而知我在ASF花了多长时间,这几乎是我的第二个家。由于 ASF 一直以来都没有实际的“物理”办公室,所以也就免去了很多现实中的麻烦,比如是否穿戴得体、肢体语言是否合规等等,其实就那个Bug 来讲,我当时不满的原因是:Doug Cutting (Hadoop创始人 ——译者注),当时还是Lucene 项目的贡献者,认为他非常没有耐心。

    让我们回到本文的主题上了,因为Apache 这20多年来没有实际的办公室,大家均是基于互联网这个虚拟的线上共同体而工作在一起,所以新冠病毒发生以来,其实对于 Apache 的成员和贡献者们的影响是微乎其微的,尽管对于每位贡献者的个人生活上是确确实实受到了影响,但是就ASF的整体而言,并没有出现什么不适应之类的。

    但是 ASF 之外仍然有很多的人,他们未必有这样的一套机制和习惯,世界各地的人们都在为抗争疫情而努力,尤其是“社交距离”的约定,原有的公司章程等均可为此而进行修订,另外让人痛心不已的是,有些人根本都没有机会来进行改变,直接破产倒闭,人已经失业了。

    然而,决定改变的人们遭遇到了一些窘境,是将大量的工作采用了远程的方式来做,但是进展缓慢;突然而至的远程工作,人们措手不及。那么我们是不是可以如此的积极思考了呢?加快并简化向远程协作的过渡,那么可以节省不少的精力,并可以提高效率。这里可能需要加上一点创造力,面对疫情之下的“新常态”,是可以做到比原来更加高效的,而且也不需要花多久就可以适应。

    请问你是开源贡献者吗?如果是的话,那么贡献你,你已经具备了当前全球复杂经济面前的急需的远程工作的能力和知识,接下来就让我们来聊聊我们所知道的以及或许可以帮助到你的一些内容。

    互联网将人们变成了“怪物”

    在互联网,人们彼此的交流大多是通过对着电脑屏幕敲打键盘完成的,这区别于我们现实中面对面的语言交流。作为社会性的人类,我们可以通过他人的面部表情、语气、肢体语言等反馈来对自己进行相应的校准,并作出适当的反应。当时,当所有的沟通和交流都通过击打键盘来完成的时候,就没有了面对面那种反馈机制,这对于人来说是及其难以适应的事情,往往会产生一些不好的效果,尤其是带有情绪的词汇。

    那么,过往一直以来都是在办公室交流的人们,突然转移到了Slack、电子邮件、以及其它以文本的方式交流的方式和渠道,有一定的不适应是较为正常的,但是通过文本来进行沟通是有难度的,需要训练自身的同理心来获得提升,个人建议去观看“Jimmy Kimmel Show” 当中的“名人阅读Tweets”节目, 可以有效提升自己对于一些词语的敏感度。

    世界是动态演变的,只要开源共同体仍然有存在的意义,那么它就必须在每一天都要和这些不便进行斗争。随着时间的流逝,“阴谋”的人身攻击由于其潜在的腐蚀作用而逐渐成为禁忌。这就成就了我们在文化上的共识:应该去评判那些想法,而不是人本身。

    随着越来越多的共同体采用“行为准则”,辩护变得越来越正式和复杂。这些明文的文档,主要目的是防止骚扰,以及其它严重的不当行为,这些文档通常包含有关共同体成员应如何彼此相待的颇为理想的建议,因为在鱼龙混杂的环境下特别容易产生一些严重的不当行为。

    无论如何,各位看官,你自身所在的组织是否采用了行为准则,自觉的提高职员们对来自网络的攻击性的警觉意识,是上佳选择。基于此之上,职员们才能有效的识别言辞,设身处地的为他人着想,从而使每个人都能够采用更具建设性的沟通方式。

    知会大家

    不过话说回来了,即使是在同一个办公室内,人与人之间的协调依然是件充满挑战的事情。当然,在远程这样的形势中,协调的难度更是加大了不少,需要付出更多的精力,这个时候最需要建立的就是公开透明的“知会大家”文化,否则,团队将变得碎片化,每个人也将变得孤立。

    在ASF,这样的情形可谓是极端化了,因为 Apache 的在线共同体遍布全球各个角落。由于牵扯到的时区实在过多,一般情况下是无法召集到全部的利益相关者在一起开会的,即使是在线视频会议也难以成行,另外,还有一个因素,那就是不是所有的贡献者都是专门针对 apache 项目进行的,大多时候是业余时间进行的。

    面对面,视频聊天,电话,文本聊天等“同步”通信渠道非常适合快速启动迭代和提炼想法,但实际上却将任何不实时关注的人排除在外。即使捕获了对话(例如通过AV录制的实时会议或记录的文本聊天),它的效率也很低,并且常常使事后回顾事情的发展变得混乱。

    面对如此的情形,ASF 采用的策略就是所有有实际意义的项目都需要在 单个、异步沟通渠道中进行。

    • 这个频道必须要严肃对待起来,从而能够让所有的参与者都信任该频道,即使是人们没有来得及观看和参与所有的消息,但是重要的内容不会被错过。
    • 沟通渠道必须是异步的,从而确保一些资源受限的参与者的权益。

    另外,关于同步的活动是可以在此频道之外进行的,再强调一点,同步有其自身的优点,同步的沟通对于迭代想法非常的有效,但是,身处共同体的人还是希望此类的会议能够被记录摘要,并将之发布到刚才提到的沟通渠道,从而使得所有的利益相关者有机会发表各自的看法。

    在 ASF,这个严肃而正式的异步通信渠道就是邮件列表,但这不代表什么,其它也有非常好的工具:对于某些非技术性的任务,可以是 Asana ,也可以是 Wiki,甚至是一个电子表格,都是可以的。过度追求技术上是没有太多意义的,最为关键的仍然是亮点:1)正式 2)异步。

    做出决策

    在办公室,决策者可以通过获得各种各样的信息:如通过不经意的偷听、一起吃工作午餐、即兴的协作等等,然而在不期而至的远程工作中,这些渠道统统不复存在,只有经过人们深思熟虑的信息,是唯一的决策依据。

    但是,一个正式的异步通信渠道在某种程度上可以对这样的情形进行一定的补偿,这样的方式有效的提高了透明度,所有的工作及其进度、成员的合作状态,都是一目了然的,即使哪怕是工作是独立完成的,也是众人皆知的。而恰恰是通过正确的使用异步沟通渠道获得信息,而不是混乱而冗长的实时的信息交换,这样就可以有一个从高处观看的视角来洞察整个全局的情况,另外,正式的沟通渠道还有一个至为重要的能力,那就是可以衡量大家达成的共识,还保持所有的记录。

    懒人共识法(Lazy consensus)是一种蛮有效率的确认方式,例如某位成员将提案发布出来,如果在某个时间范围内(ASF为72小时)没有异议,则该提案被认为是隐式同意的。通过对沟通渠道进行积极的监督,将那些有缺陷的提案标记出来,懒人共识法 是鼓励积极主动者颇为强大的工具,这也是远程参与者非常宝贵的个人品质。

    总结

    冠状病毒疫情肆虐之下,人类的组织正在以各式各样的方式抵抗和对付这场灾难。

    在开放源代码的世界,二十多年来,已经有不计其数的优秀的项目在基于互联网的方式下运作,可以说是在远程协作方面积累了非常丰厚的经验,当然也走过很多的弯路。或许我们这些开源界的人,可以帮助到面对突如其来面临远程协作的团队,帮助其在艰难的时刻找到自己的方式。就让我们帮助他们做到最好吧,这也是我们的初衷之一。

    关于作者

    Marvin Humphrey 目前是Apache 软件基金会的名誉会员,在过去他担当过ASF 的很多主要角色:孵化器的VP、法律事务的VP 、以及董事会成员。目前则将主要精力放在了家庭上,偶尔出来做做咨询。

    原文链接

    Success at Apache: Remote Collaboration in the Time of Coronavirus

    \ No newline at end of file diff --git a/post/apache-policy/apache-downstream-mark-policy/index.html b/post/apache-policy/apache-downstream-mark-policy/index.html index 96fc5fcb..d57f924e 100644 --- a/post/apache-policy/apache-downstream-mark-policy/index.html +++ b/post/apache-policy/apache-downstream-mark-policy/index.html @@ -1,5 +1,3 @@ -Apache 下游项目的品牌使用原则 · ALC Beijing

    Apache 下游项目的品牌使用原则

    Apache Apache 下游项目的品牌使用原则

    翻译: 王福政

    原文地址: http://www.apache.org/foundation/marks/downstream.html

    初稿 ~ 初稿 ~ 初稿

    下游发行品牌政策定义了希望以原始 Apache® 产品名称分发 Apache® 软件产品的下游软件发行商的要求。希望使用其他名称的发行商应遵循我们正式商标政策

    下游发行品牌政策

    Apache 软件产品由一些为其平台提供软件包的下游实体分发。例如,Docker 镜像、Linux 发行商和云平台供应商。

    Apache 软件基金会认识到这些下游发行商的重要性,并乐于看到他们在遵循这一政策的前提下,以 Apache 的原始名称发布 Apache 产品。

    命名

    该名称必须与 Apache 软件基金会使用的名称相同。所有 Apache 软件产品的全称都具有 “Apache ProjectName” 的形式。请注意,“Apache”、"ProjectName” 和 “Apache ProjectName” 是 Apache 软件基金会的商标。

    源代码

    软件所基于的源代码必须与 Apache 软件基金会的源代码版本相同,或者以下所有条件都必须符合:

    • 所有源代码更改必须至少满足以下列出的可接受更改标准之一。
    • 必须使用一个版本号,该版本号既要明确区别于 Apache 软件基金会发布的版本,又要明确标识软件所基于的 Apache 软件基金会版本。
    • 文档必须明确标识软件所基于的 Apache 软件基金会版本。
    • 最终用户希望发行渠道能够移植修复。并非所有的修复程序都必须进行反向移植。选择要反向移植的修复程序必须符合该分发渠道的更新政策。

    可接受的变更必须至少满足以下标准之一:

    • 该变更已被相关的 Apache 项目社区接受,并被纳入未来的版本中。请注意,接受变更的过程以及接受变更的方式因项目而异。
    • 更改是针对未公开的安全问题的修复程序;该修复程序未公开披露为安全修复程序;Apache 项目已 收到有关该问题和建议的修复程序的通知;PMC 既未拒绝漏洞报告也未拒绝建议的修复程序。
    • 变更是对 bug 的修复;并且 Apache 项目已经被通知了 bug 和建议的修复;并且 PMC 既没有拒绝 bug 报告也没有拒绝建议的修复。
    • 为与目标平台整合而做的小改动(例如,对启动和关闭脚本、配置文件、文件布局等的改动),Apache 项目不反对这些改动。

    其他依赖关系

    在发行版中包含的任何额外的依赖关系必须按照第三方许可政策的条款进行许可,允许 Apache 项目将该依赖关系包含在 Apache 发行版中。

    Apache 软件基金会提供的可选依赖项、模块、附加组件等可以包含在发行版中。

    第三方提供的可选依赖项、模块、附加组件等扩展了 Apache 项目的功能,应该通过单独的包来提供,但如果项目不反对,可以包含在发行版中。

    第三方提供的可选依赖项、模块、附加组件等,如果取代了 Apache 项目中的默认功能,则必须通过单独的包来提供,除非 Apache 项目已经批准将其包含在发行版中。

    使用示例

    基于上述政策,以下用法是可以接受的,除非项目的具体要求不允许:

    • 从开发分支发布任何特定的版本。
    • 包含从开发分支移植的修复或功能。
    • 修改默认配置。
    • 应用那些需要做一些琐碎的改动才能应用的后端移植。
    • 包括一系列第三方 JDBC 驱动程序或类似库,以方便与其他系统的通信。

    基于上述政策,除非项目的具体要求允许,否则以下用法将不被接受:

    • 包含从个人提交者的特性分支或其他分支移植过来的修正或特性,但这些修正或特性还没有被项目接受并包含在未来的版本中。
    • 应用当前不在 ASF 源代码管理中的修补程序。
    • 添加目前不在 ASF 源码控制中的功能。
    • 应用需要进行非频繁改动才能应用的后端口。
    • 默默地修复已发现的安全问题,而不通知 PMC 该问题。
    • 用第三方持久化库替换数据库的默认持久化层。

    项目具体要求

    个别项目可以修改上述修改后的软件发行版的默认要求。

    以下项目使用了上述政策的修改版本。

    • Apache Subversion

    在以 Apache 产品名称分发 Apache 软件项目的修改版之前,发行商必须向相关项目检查任何项目特定的策略。

    其他商标政策和资源。

    请参阅我们的正式商标政策商标资源网站地图

    重要说明

    本 ASF 政策声明中的任何内容都不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品、服务或活动的任何批准或支持。

    政策版本

    这是此 2020 年 6 月发布的 Apache 政策文件草案的 0.4 版。

    重大更改将用新的版本号标记。

    从 1.0 版开始将跟踪更改。

    初稿 ~ 初稿 ~ 初稿

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache 下游项目的品牌使用原则 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    02 +Mar 2021

    Apache 下游项目的品牌使用原则

    Apache Apache 下游项目的品牌使用原则

    翻译: 王福政

    原文地址: http://www.apache.org/foundation/marks/downstream.html

    初稿 ~ 初稿 ~ 初稿

    下游发行品牌政策定义了希望以原始 Apache® 产品名称分发 Apache® 软件产品的下游软件发行商的要求。希望使用其他名称的发行商应遵循我们正式商标政策

    下游发行品牌政策

    Apache 软件产品由一些为其平台提供软件包的下游实体分发。例如,Docker 镜像、Linux 发行商和云平台供应商。

    Apache 软件基金会认识到这些下游发行商的重要性,并乐于看到他们在遵循这一政策的前提下,以 Apache 的原始名称发布 Apache 产品。

    命名

    该名称必须与 Apache 软件基金会使用的名称相同。所有 Apache 软件产品的全称都具有 “Apache ProjectName” 的形式。请注意,“Apache”、"ProjectName” 和 “Apache ProjectName” 是 Apache 软件基金会的商标。

    源代码

    软件所基于的源代码必须与 Apache 软件基金会的源代码版本相同,或者以下所有条件都必须符合:

    • 所有源代码更改必须至少满足以下列出的可接受更改标准之一。
    • 必须使用一个版本号,该版本号既要明确区别于 Apache 软件基金会发布的版本,又要明确标识软件所基于的 Apache 软件基金会版本。
    • 文档必须明确标识软件所基于的 Apache 软件基金会版本。
    • 最终用户希望发行渠道能够移植修复。并非所有的修复程序都必须进行反向移植。选择要反向移植的修复程序必须符合该分发渠道的更新政策。

    可接受的变更必须至少满足以下标准之一:

    • 该变更已被相关的 Apache 项目社区接受,并被纳入未来的版本中。请注意,接受变更的过程以及接受变更的方式因项目而异。
    • 更改是针对未公开的安全问题的修复程序;该修复程序未公开披露为安全修复程序;Apache 项目已 收到有关该问题和建议的修复程序的通知;PMC 既未拒绝漏洞报告也未拒绝建议的修复程序。
    • 变更是对 bug 的修复;并且 Apache 项目已经被通知了 bug 和建议的修复;并且 PMC 既没有拒绝 bug 报告也没有拒绝建议的修复。
    • 为与目标平台整合而做的小改动(例如,对启动和关闭脚本、配置文件、文件布局等的改动),Apache 项目不反对这些改动。

    其他依赖关系

    在发行版中包含的任何额外的依赖关系必须按照第三方许可政策的条款进行许可,允许 Apache 项目将该依赖关系包含在 Apache 发行版中。

    Apache 软件基金会提供的可选依赖项、模块、附加组件等可以包含在发行版中。

    第三方提供的可选依赖项、模块、附加组件等扩展了 Apache 项目的功能,应该通过单独的包来提供,但如果项目不反对,可以包含在发行版中。

    第三方提供的可选依赖项、模块、附加组件等,如果取代了 Apache 项目中的默认功能,则必须通过单独的包来提供,除非 Apache 项目已经批准将其包含在发行版中。

    使用示例

    基于上述政策,以下用法是可以接受的,除非项目的具体要求不允许:

    • 从开发分支发布任何特定的版本。
    • 包含从开发分支移植的修复或功能。
    • 修改默认配置。
    • 应用那些需要做一些琐碎的改动才能应用的后端移植。
    • 包括一系列第三方 JDBC 驱动程序或类似库,以方便与其他系统的通信。

    基于上述政策,除非项目的具体要求允许,否则以下用法将不被接受:

    • 包含从个人提交者的特性分支或其他分支移植过来的修正或特性,但这些修正或特性还没有被项目接受并包含在未来的版本中。
    • 应用当前不在 ASF 源代码管理中的修补程序。
    • 添加目前不在 ASF 源码控制中的功能。
    • 应用需要进行非频繁改动才能应用的后端口。
    • 默默地修复已发现的安全问题,而不通知 PMC 该问题。
    • 用第三方持久化库替换数据库的默认持久化层。

    项目具体要求

    个别项目可以修改上述修改后的软件发行版的默认要求。

    以下项目使用了上述政策的修改版本。

    • Apache Subversion

    在以 Apache 产品名称分发 Apache 软件项目的修改版之前,发行商必须向相关项目检查任何项目特定的策略。

    其他商标政策和资源。

    请参阅我们的正式商标政策商标资源网站地图

    重要说明

    本 ASF 政策声明中的任何内容都不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品、服务或活动的任何批准或支持。

    政策版本

    这是此 2020 年 6 月发布的 Apache 政策文件草案的 0.4 版。

    重大更改将用新的版本号标记。

    从 1.0 版开始将跟踪更改。

    初稿 ~ 初稿 ~ 初稿

    \ No newline at end of file diff --git a/post/apache-policy/apache-mark-policy/index.html b/post/apache-policy/apache-mark-policy/index.html index 3424a065..5916b722 100644 --- a/post/apache-policy/apache-mark-policy/index.html +++ b/post/apache-policy/apache-mark-policy/index.html @@ -1,6 +1,4 @@ -Apache 商标使用管理原则 · ALC Beijing

    Apache 商标使用管理原则

    Apache 商标使用管理原则

    翻译: 聂帅 -原文出处:http://www.apache.org/foundation/marks/

    本文档概述了允许使用 Apache® 商标的其他方的政策。

    Apache 软件基金会(ASF)拥有所有与 Apache 相关的商标,服务标志,代表我们 Apache 社区的标志,所有 Apache 项目的名称都是 Apache 的商标。

    以下信息有助于确保其他方以经许可的方式使用我们的商标和徽记,确保我们能够合法的保护我们的项目品牌,并且鼓励第三方以所批准的方式使用 Apache 软件和我们的品牌。如果您对此政策或者 Apache 商标有任何疑问,可以联系我们,并请阅读我们的商标资源列表

    基本原则

    Apache® 商标,服务标记和图形标记是质量以及与 ASF 项目相关联的社区支持的象征。为确保 Apache 商标的使用不会导致我们软件的混乱,我们必须控制这些商标和其他组织的软件以及相关服务的联合使用。另外,作为一家美国公司,我们有法律责任和法律权力来指定使用我们商标的政策。

    Apache 软件基金会和我们的许多软件产品必须与其他任何和 ASF 竞争的软件以及任何与 ASF 无关的企业和个人的软件与服务区分开来。

    不得使用 Apache 商标贬损 Apache 软件基金会、我们的项目、会员、赞助者以及社区。也不得使用 Apache 商标以任何方式暗示对任何与 ASF 相关的项目或任意类型的倡议的所有权,支持和赞助。作为一个中立性组织,我们品牌的重要组成部分是 Apache 的项目是独立管理的

    关键商标原则的描述

    本部分并不是为了总结商标的复杂法律,而是为了帮助读者了解一些关键的商标原则。更多信息,请参见我们的商标资源列表

    商标是什么?

    商标是用于区分一方与另一方商品来源的一个单词、短语、符号、设计或是单词、短语、符号、设计所组成的整体。服务标志与商标相同,只不过服务标志是用于区分服务的来源的。在整个文档中术语“商标”( trademark )和“标记”( mark )均指商标和服务商标。

    这些规则可以归纳为,使用商标“ Apache ProjectName ”来描述与 ASF 相关的软件,或者当使用商标来描述我们特定的 Apache ProjectName 软件产品时,使用商标“ ProjectName ”来描述。与大多数 ASF 软件一样,“ ProjectName ”的软件是由“ Apache ProjectName ”项目或者另一个“ ProjectName ”的项目(例如“ Apache Incubator ”(本身就是 ASF 的商标))进行维护的。

    ASF 的商标是文字(例如,“ Apache ”和“ Apache ProjectName ”)或者是旨在用于充当 Apache 软件的商标的图形徽记。 Apache 羽毛也是 Apache 软件的 ASF 商标,但其对 ASF 有特殊含义,所以也拥有与其使用相关的特殊规则。

    在 ASF 中,在我们的产品发布活动期间和 ASF 网站上,我们会确保我们的商标标有( TM )或( R )标记或者在适当的时候显示商标声明,我们提供了 ASF 商标列表,以便所有人都可以认出这是 ASF 的商标。这里提供了有关如何引用 Apache 品牌的详细指南

    什么是商标的合理指示性使用?

    只要对商标的使用是指示性的,则任何人都可以使用 ASF 商标。对商标侵权的“指示性使用”(或“名义合理使用”)抗辩是一项法律原则,只要遵守以下三个条件,那么所有人(甚至商业公司)都可以使用他人的商标:

    1. 所涉及的产品或服务必须是一种不使用商标就无法轻易识别的产品或服务; (例如,不使用商标“ Hadoop ”就很难识别出 ApacheHadoop® 软件)
    2. 只有当使用的数量有限,并且该数量对于识别产品和服务来说是必要的;
    3. 使用该商标的组织不得采取任何与该商标相关的,建议商标持有人赞助或背书的行为。

    商标指示性合理使用抗辩旨在鼓励人们通过使用商标本身来引用商标商品和服务。这种商标抗辩与版权的合理使用无关,不应该与这些规则混淆。

    什么是“混淆相似性”或“混淆可能性”测试?

    有些对他人商标的使用是名义上的合理使用,但有些使用就只是侵权。事实上,如果商标用可能会使相关消费者对使用该商标销售或提供的产品和服务的来源产生混淆或者误解的方式来使用,那么就存在混淆的可能性,那么该商标就被侵权了。

    请注意,即使不存在混淆的可能性,如果您根据州和/或联邦稀释法对另一家公司的商标进行模糊或玷污,您仍可能对使用该公司的商标承担责任。

    为了避免侵犯 ASF 的商标,您应该确认您使用我们的商标是指示性的,并且您的使用不会使消费者产生您的软件与 ASF 的软件相同,或是您的软件受到了 ASF 认可的错觉。此策略已经在 Apache 许可证的第六节中概述,因此,这是您使用 Apache 软件的条件:

    本许可证不允许使用许可方的商标名称、商标、服务标志或产品名称,除非是在描述作品来源和复制通知文件内容时的合理的惯常使用。

    特定的 Apache 商标政策

    以下具体政策适用于“ Apache ”一词的商标和“ Apache 羽毛”图形商标,以及所有 ASF 项目生产的所有“ Apache ProjectName ”和“ ProjectName ”软件的商标和图形徽记。您可以参考我们的 Apache 标记列表。

    被允许的指示性使用的示例:

    • “ Apache 许可证下的 Apache ProjectName 软件的免费副本以及 Apache ProjectName 的支持服务可在我公司的网站上获得。”
    • “ Apache ProjectName 软件的衍生产品和这些衍生产品的支持服务以我们的商标在我们的网站上提供。”请注意,根据商标法,您不得将与“ ProjectName ”或“ Apache ProjectName ”或 ProjectName 图形徽标商标可能发生混淆的相似的商标应用于 ProjectName 软件的衍生产品。
    • ProjectName 软件比Myco软件更快(或更慢)”。
    • ”对于您的业务我向您推荐(或不推荐) ProjectName 软件“。
    • “这是 Apache ProjectName 软件的图形徽标。”
    • ASF 希望您对我们所有的项目使用 Apache ProjectName 的全称

    在软件产品品牌中使用 Apache 商标

    一般来说,您不能在任何软件产品品牌中使用 Apache 商标。但是,在非常特定的情况下,您可能会对软件产品使用 Powered By 命名表单

    在出版的书籍和文章中使用 Apache 商标

    您可以撰写有关 Apache Foo 软件的文章,并在书籍或文章标题中使用我们的商标。 您无需征求我们的许可就可以引用 Foo( ProjecName ),例如《 Foo for Dummies 》,《 Expooning Foo 》,《 Foo Simplified 》,《 O’Reilly Foo指南 》甚至《 避开 Foo 》。

    我们希望您在标题中引用“ Apache Foo ”而不是简单的“ Foo ”,并且我们希望凡是您通常在书或文章中认为重要的地方都能够明确标识“ Apache ”,“ Apache Foo ”和“ Foo ”都是 Apache 软件的商标。

    有关更多详细信息,请参见我们发布中的有关 Apache 商标的常见问题解答

    使用 Apache 羽毛徽标表示 ASF 并且链接到www.apache.org:

    Apache 羽毛徽标是 Apache 软件基金会成员的特殊商标,我们希望防止将其与其他公司的软件或相关服务结合使用。

    您无需向我们请求许可,就可以在您自己的网站上使用 Apache 羽毛徽标(用我们在这里发布的版本)作为 www.apache.org 或者是一个合适的 Apache 项目的超链接,又或是在其他的材料,比如演示和幻灯片中,仅仅是为了指代 ASF 本身。

    Apache 羽毛徽标的所有其他用途必须得到 VP,Apache 品牌管理或品牌管理委员会成员的书面批准

    使用 Apache Foo 或类似的项目图形徽标:

    图形徽标由艺术家贡献给 ASF ,作为一种可以识别 Apache 项目软件的符号而被创造。徽标的示例包括 Hadoop 大象, SpamAssassin 箭头,甚至是将“ Maven ”一词拼写为橙色字母“ a ”的图形方式。 这些图形徽标是 Apache 项目专用的,这些项目使用这些徽标来代表其软件和项目网站。

    您无需向我们请求许可,就可以在您自己的网站上使用 Apache 的图形徽标(使用发布在各个网站上的版本)作为 指向一个特定的项目或者 www.apache.org 的超链接。所有其他使用 Apache Foo (以及类似的)图形徽标的行为必须得到 VP,Apache 品牌管理或品牌管理委员会成员或者相关的 Apache 项目的 VP 的书面批准

    与 ASF 的文字商标(例如“ Apache ”和“ Foo ”)不同,我们的图形徽标也根据 Apache 许可向公众许可。 该许可证允许您与其他任何 Apache 受版权保护的作品一样创建这些徽标的衍生作品。 但是,如果相关消费者可能会因使用该衍生徽标而被误导,那么商标法不允许您将任何“易混淆的相似”衍生徽标应用于软件。

    如果您对任何 ASF 图形商标的使用或更改有任何疑问或疑虑,请联系我们

    在商品上使用 Apache 商标:

    您必须事先获得 VP、Apache 品牌管理或指定人员的书面批准,才能将“ Apache ”、“ Apache Foo ”或“ Foo ”商标或其图形徽标应用于任何与 Apache Foo 软件和 Apache 软件或任何在人们的普遍认识中与两者相关联的商品。

    对于推广 Apache 软件基金会、Apache Foo 项目和 Foo 软件的商品,可以申请并获取 ASF 商标(包括图形徽标)的许可。

    对于贬低 Apache 软件或项目的商品,或有损 Apache 软件及其品牌价值的商品,通常会拒绝其申请 ASF 商标使用的许可。

    ASF 商标的以下使用可能是侵权的:

    • 令人产生困惑的相似软件产品名称。
    • 除 ASF 官方发布的软件以外的任何其他软件服务。
    • 在用户心中可能与 ASF 或其商标项目软件相关联的公司名称。

    在域名中使用 Apache 商标

    如果未经 VP、Apache 品牌管理或指定人员的书面批准,您不得在您自己的域名中使用 ASF 商标,比如“ Apache ”或“ Apache Foo ”或“ Foo ”或是其他可能会使相关消费者对您的网站提供的软件或是服务的来源产生困惑的表达。您应该使用上述“混淆可能性”测试,并请注意在您的域名中使用 ASF 商标通常不是“指示性使用”

    有关更多详细信息并请求批准,请参阅我们的域名品牌政策。 特别是,不允许将 Apache 产品名称用作第二级域名(example.com)。

    在会议和活动中使用 Apache 商标

    某些 ASF 商标专用于 Apache 软件基金会的正式活动。 例如,“ ApacheCon ”是我们在常规 ASF 会议上的专有商标,而 Apache 羽毛旨在在我们所参加的活动中给 ASF 使用。

    单独的 ASF 项目(例如“ Apache Foo ”)经常创建自己的会议和活动,或者与其他组织或公司联合举办联合会议或活动。与会议或活动相关的 ASF 商标(包括与我们的项目或产品相关的商标)的任何冲突使用,必须获得 VP,Apache 品牌管理或指定人员的书面批准。

    更多详情或请求批准,请参阅我们的活动品牌政策。 请提前申请批准,以避免遇到 ApacheCon 暂时停业的日期。

    关于我们

    VP , Apache 品牌管理及相关品牌管理委员会是 ASF 中的正式组成部分,负责制定政策并回答有关徽标和商标使用的问题以及其他责任。委员会由已经在品牌和商标方面展现特长的 ASF 的当选成员组成。 现任 Apache 品牌管理副总裁是马克·托马斯( Mark Thomas ),是由总裁任命担任该职位的。 查看委员会成员名单以及联系我们

    关注 @ASFBrands

    重要说明

    本 ASF 政策声明中的任何内容不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品或服务的任何批准或支持。

    政策版本

    这是2014年发布的 Apache 策略文档的1.1版。

    重大更改将使用新版本号。

    v1.1更新以获得 VP、品牌指定人员的许可

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache 商标使用管理原则 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    02 +Mar 2021

    Apache 商标使用管理原则

    Apache 商标使用管理原则

    翻译: 聂帅 +原文出处:http://www.apache.org/foundation/marks/

    本文档概述了允许使用 Apache® 商标的其他方的政策。

    Apache 软件基金会(ASF)拥有所有与 Apache 相关的商标,服务标志,代表我们 Apache 社区的标志,所有 Apache 项目的名称都是 Apache 的商标。

    以下信息有助于确保其他方以经许可的方式使用我们的商标和徽记,确保我们能够合法的保护我们的项目品牌,并且鼓励第三方以所批准的方式使用 Apache 软件和我们的品牌。如果您对此政策或者 Apache 商标有任何疑问,可以联系我们,并请阅读我们的商标资源列表

    基本原则

    Apache® 商标,服务标记和图形标记是质量以及与 ASF 项目相关联的社区支持的象征。为确保 Apache 商标的使用不会导致我们软件的混乱,我们必须控制这些商标和其他组织的软件以及相关服务的联合使用。另外,作为一家美国公司,我们有法律责任和法律权力来指定使用我们商标的政策。

    Apache 软件基金会和我们的许多软件产品必须与其他任何和 ASF 竞争的软件以及任何与 ASF 无关的企业和个人的软件与服务区分开来。

    不得使用 Apache 商标贬损 Apache 软件基金会、我们的项目、会员、赞助者以及社区。也不得使用 Apache 商标以任何方式暗示对任何与 ASF 相关的项目或任意类型的倡议的所有权,支持和赞助。作为一个中立性组织,我们品牌的重要组成部分是 Apache 的项目是独立管理的

    关键商标原则的描述

    本部分并不是为了总结商标的复杂法律,而是为了帮助读者了解一些关键的商标原则。更多信息,请参见我们的商标资源列表

    商标是什么?

    商标是用于区分一方与另一方商品来源的一个单词、短语、符号、设计或是单词、短语、符号、设计所组成的整体。服务标志与商标相同,只不过服务标志是用于区分服务的来源的。在整个文档中术语“商标”( trademark )和“标记”( mark )均指商标和服务商标。

    这些规则可以归纳为,使用商标“ Apache ProjectName ”来描述与 ASF 相关的软件,或者当使用商标来描述我们特定的 Apache ProjectName 软件产品时,使用商标“ ProjectName ”来描述。与大多数 ASF 软件一样,“ ProjectName ”的软件是由“ Apache ProjectName ”项目或者另一个“ ProjectName ”的项目(例如“ Apache Incubator ”(本身就是 ASF 的商标))进行维护的。

    ASF 的商标是文字(例如,“ Apache ”和“ Apache ProjectName ”)或者是旨在用于充当 Apache 软件的商标的图形徽记。 Apache 羽毛也是 Apache 软件的 ASF 商标,但其对 ASF 有特殊含义,所以也拥有与其使用相关的特殊规则。

    在 ASF 中,在我们的产品发布活动期间和 ASF 网站上,我们会确保我们的商标标有( TM )或( R )标记或者在适当的时候显示商标声明,我们提供了 ASF 商标列表,以便所有人都可以认出这是 ASF 的商标。这里提供了有关如何引用 Apache 品牌的详细指南

    什么是商标的合理指示性使用?

    只要对商标的使用是指示性的,则任何人都可以使用 ASF 商标。对商标侵权的“指示性使用”(或“名义合理使用”)抗辩是一项法律原则,只要遵守以下三个条件,那么所有人(甚至商业公司)都可以使用他人的商标:

    1. 所涉及的产品或服务必须是一种不使用商标就无法轻易识别的产品或服务; (例如,不使用商标“ Hadoop ”就很难识别出 ApacheHadoop® 软件)
    2. 只有当使用的数量有限,并且该数量对于识别产品和服务来说是必要的;
    3. 使用该商标的组织不得采取任何与该商标相关的,建议商标持有人赞助或背书的行为。

    商标指示性合理使用抗辩旨在鼓励人们通过使用商标本身来引用商标商品和服务。这种商标抗辩与版权的合理使用无关,不应该与这些规则混淆。

    什么是“混淆相似性”或“混淆可能性”测试?

    有些对他人商标的使用是名义上的合理使用,但有些使用就只是侵权。事实上,如果商标用可能会使相关消费者对使用该商标销售或提供的产品和服务的来源产生混淆或者误解的方式来使用,那么就存在混淆的可能性,那么该商标就被侵权了。

    请注意,即使不存在混淆的可能性,如果您根据州和/或联邦稀释法对另一家公司的商标进行模糊或玷污,您仍可能对使用该公司的商标承担责任。

    为了避免侵犯 ASF 的商标,您应该确认您使用我们的商标是指示性的,并且您的使用不会使消费者产生您的软件与 ASF 的软件相同,或是您的软件受到了 ASF 认可的错觉。此策略已经在 Apache 许可证的第六节中概述,因此,这是您使用 Apache 软件的条件:

    本许可证不允许使用许可方的商标名称、商标、服务标志或产品名称,除非是在描述作品来源和复制通知文件内容时的合理的惯常使用。

    特定的 Apache 商标政策

    以下具体政策适用于“ Apache ”一词的商标和“ Apache 羽毛”图形商标,以及所有 ASF 项目生产的所有“ Apache ProjectName ”和“ ProjectName ”软件的商标和图形徽记。您可以参考我们的 Apache 标记列表。

    被允许的指示性使用的示例:

    • “ Apache 许可证下的 Apache ProjectName 软件的免费副本以及 Apache ProjectName 的支持服务可在我公司的网站上获得。”
    • “ Apache ProjectName 软件的衍生产品和这些衍生产品的支持服务以我们的商标在我们的网站上提供。”请注意,根据商标法,您不得将与“ ProjectName ”或“ Apache ProjectName ”或 ProjectName 图形徽标商标可能发生混淆的相似的商标应用于 ProjectName 软件的衍生产品。
    • ProjectName 软件比Myco软件更快(或更慢)”。
    • ”对于您的业务我向您推荐(或不推荐) ProjectName 软件“。
    • “这是 Apache ProjectName 软件的图形徽标。”
    • ASF 希望您对我们所有的项目使用 Apache ProjectName 的全称

    在软件产品品牌中使用 Apache 商标

    一般来说,您不能在任何软件产品品牌中使用 Apache 商标。但是,在非常特定的情况下,您可能会对软件产品使用 Powered By 命名表单

    在出版的书籍和文章中使用 Apache 商标

    您可以撰写有关 Apache Foo 软件的文章,并在书籍或文章标题中使用我们的商标。 您无需征求我们的许可就可以引用 Foo( ProjecName ),例如《 Foo for Dummies 》,《 Expooning Foo 》,《 Foo Simplified 》,《 O’Reilly Foo指南 》甚至《 避开 Foo 》。

    我们希望您在标题中引用“ Apache Foo ”而不是简单的“ Foo ”,并且我们希望凡是您通常在书或文章中认为重要的地方都能够明确标识“ Apache ”,“ Apache Foo ”和“ Foo ”都是 Apache 软件的商标。

    有关更多详细信息,请参见我们发布中的有关 Apache 商标的常见问题解答

    使用 Apache 羽毛徽标表示 ASF 并且链接到www.apache.org:

    Apache 羽毛徽标是 Apache 软件基金会成员的特殊商标,我们希望防止将其与其他公司的软件或相关服务结合使用。

    您无需向我们请求许可,就可以在您自己的网站上使用 Apache 羽毛徽标(用我们在这里发布的版本)作为 www.apache.org 或者是一个合适的 Apache 项目的超链接,又或是在其他的材料,比如演示和幻灯片中,仅仅是为了指代 ASF 本身。

    Apache 羽毛徽标的所有其他用途必须得到 VP,Apache 品牌管理或品牌管理委员会成员的书面批准

    使用 Apache Foo 或类似的项目图形徽标:

    图形徽标由艺术家贡献给 ASF ,作为一种可以识别 Apache 项目软件的符号而被创造。徽标的示例包括 Hadoop 大象, SpamAssassin 箭头,甚至是将“ Maven ”一词拼写为橙色字母“ a ”的图形方式。 这些图形徽标是 Apache 项目专用的,这些项目使用这些徽标来代表其软件和项目网站。

    您无需向我们请求许可,就可以在您自己的网站上使用 Apache 的图形徽标(使用发布在各个网站上的版本)作为 指向一个特定的项目或者 www.apache.org 的超链接。所有其他使用 Apache Foo (以及类似的)图形徽标的行为必须得到 VP,Apache 品牌管理或品牌管理委员会成员或者相关的 Apache 项目的 VP 的书面批准

    与 ASF 的文字商标(例如“ Apache ”和“ Foo ”)不同,我们的图形徽标也根据 Apache 许可向公众许可。 该许可证允许您与其他任何 Apache 受版权保护的作品一样创建这些徽标的衍生作品。 但是,如果相关消费者可能会因使用该衍生徽标而被误导,那么商标法不允许您将任何“易混淆的相似”衍生徽标应用于软件。

    如果您对任何 ASF 图形商标的使用或更改有任何疑问或疑虑,请联系我们

    在商品上使用 Apache 商标:

    您必须事先获得 VP、Apache 品牌管理或指定人员的书面批准,才能将“ Apache ”、“ Apache Foo ”或“ Foo ”商标或其图形徽标应用于任何与 Apache Foo 软件和 Apache 软件或任何在人们的普遍认识中与两者相关联的商品。

    对于推广 Apache 软件基金会、Apache Foo 项目和 Foo 软件的商品,可以申请并获取 ASF 商标(包括图形徽标)的许可。

    对于贬低 Apache 软件或项目的商品,或有损 Apache 软件及其品牌价值的商品,通常会拒绝其申请 ASF 商标使用的许可。

    ASF 商标的以下使用可能是侵权的:

    • 令人产生困惑的相似软件产品名称。
    • 除 ASF 官方发布的软件以外的任何其他软件服务。
    • 在用户心中可能与 ASF 或其商标项目软件相关联的公司名称。

    在域名中使用 Apache 商标

    如果未经 VP、Apache 品牌管理或指定人员的书面批准,您不得在您自己的域名中使用 ASF 商标,比如“ Apache ”或“ Apache Foo ”或“ Foo ”或是其他可能会使相关消费者对您的网站提供的软件或是服务的来源产生困惑的表达。您应该使用上述“混淆可能性”测试,并请注意在您的域名中使用 ASF 商标通常不是“指示性使用”

    有关更多详细信息并请求批准,请参阅我们的域名品牌政策。 特别是,不允许将 Apache 产品名称用作第二级域名(example.com)。

    在会议和活动中使用 Apache 商标

    某些 ASF 商标专用于 Apache 软件基金会的正式活动。 例如,“ ApacheCon ”是我们在常规 ASF 会议上的专有商标,而 Apache 羽毛旨在在我们所参加的活动中给 ASF 使用。

    单独的 ASF 项目(例如“ Apache Foo ”)经常创建自己的会议和活动,或者与其他组织或公司联合举办联合会议或活动。与会议或活动相关的 ASF 商标(包括与我们的项目或产品相关的商标)的任何冲突使用,必须获得 VP,Apache 品牌管理或指定人员的书面批准。

    更多详情或请求批准,请参阅我们的活动品牌政策。 请提前申请批准,以避免遇到 ApacheCon 暂时停业的日期。

    关于我们

    VP , Apache 品牌管理及相关品牌管理委员会是 ASF 中的正式组成部分,负责制定政策并回答有关徽标和商标使用的问题以及其他责任。委员会由已经在品牌和商标方面展现特长的 ASF 的当选成员组成。 现任 Apache 品牌管理副总裁是马克·托马斯( Mark Thomas ),是由总裁任命担任该职位的。 查看委员会成员名单以及联系我们

    关注 @ASFBrands

    重要说明

    本 ASF 政策声明中的任何内容不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品或服务的任何批准或支持。

    政策版本

    这是2014年发布的 Apache 策略文档的1.1版。

    重大更改将使用新版本号。

    v1.1更新以获得 VP、品牌指定人员的许可

    \ No newline at end of file diff --git a/post/apache-policy/apache-website-mark-policy/index.html b/post/apache-policy/apache-website-mark-policy/index.html index 76bfba94..a084857a 100644 --- a/post/apache-policy/apache-website-mark-policy/index.html +++ b/post/apache-policy/apache-website-mark-policy/index.html @@ -1,5 +1,3 @@ -Apache 项目网站商标原则 · ALC Beijing

    Apache 项目网站商标原则

    Apache 项目网站商标原则

    翻译: 王皓月

    原文地址: http://www.apache.org/foundation/marks/pmcs

    本文定义了商标原则,定义了 Apache®projects 网站显示的元素,以及如何正确地对待 Apache 和其他组织的商标。PMC 商标责任还解释了 PMC 成员应该以何种方式管理项目商标。

    项目网站和 URL 原则:使用 * .APACHE.ORG

    • Apache 项目必须在 apache.org 域上托管官方网站,包括由项目 PMC 监督的内容(包括顶级网站,下载和 Wiki),并确保 ASF 基础架构团队可以维护服务,同时告知用户该内容是官方的并且来自 ASF 和项目 PMC,而不是来自第三方。
    • 任何 ProjectName 的主页都必须由 http[s]://ProjectName.apache.org 提供服务,以确保商标一致,且允许自动生成链接(例如 https://projects.apache.org)。项目的所有主链接都必须直接指向主页,而不是其他站点或域。
    • 项目可以自由地使用基础架构支持的技术来管理和部署网站,并且可以自由使用设计中的外观。未来,我们可能会要求项目添加特定的样式或者图形元素(从多种变体中选择),以使其返回链接 www.apache.org,这将有助于用户更好地了解 Apache 项目之间的联系。
    • 拥有悠久的开源开发历史和庞大的用户群新社区进入 Apache 孵化器前,应该阅读使用 non-apache.org 域的限制

    项目命名和描述原则

    存在新项目名称的选择准则,但尚未进行审查并合并到此原则文档中。

    • 任何项目或产品名称的主要商标必须采用“Apache Projectname ”的形式,这样可以确保在用户心中,项目或产品与 ASF 相关联,并确保第三方不能轻易滥用项目名称。项目或产品的每个页面中第一个最重要的引用,以及页面标题中的引用,都必须使用其名称的“Apache Projectname ”形式。其他引用可以根据主题使用“ Apache Projectname ”或“ Projectname ”。
    • 该产品的每个产品主页和任何概述下载页面都必须包含对该产品的突出引用,称为“ Apache Foo 软件”,并且必须包含对该软件产品本身的用途和功能的简短描述。例如:

    Apache Xerces XML 解析库软件提供了 XML 1.0解析规范的完整实现,并且易于配置,符合当前标准。

    该描述对于页面的新读者非常有用,并有助于 ASF 维护软件产品商标的完整列表。仅在与特定种类的商品关联时,商标才重要:在案例中,这是 ASF 和 PMC 提供的可实际下载的软件产品。

    请注意,共享关于商标 @ 的示例描述是有帮助的,可以确保它是正确的商标商品描述。 例如,在过去 Apache Tomcat 的网站上,它是“实现”和“协作”,而不是具有功能的产品。 Apache Spam Assassin 的网站将自己描述为一个“项目”和“版本”,并将其称为“it”。 两者都没有包含正确的商标商品描述(即执行功能的计算机软件)。 虽然这种商标描述风格有时在技术文档中显得笨拙,但这是我们强制实施商标原则的一种重要方法。对于每个项目,只需要在网站上的显眼位置进行即可。

    • 项目和产品名称应该使用一致的大写字母和形容词,而不是名词或动词,这是所有商标应该使用的。 在项目主页和下载页面上进行此操作很重要;在网站或技术产品文档的其他地方,它是不需要的。
    • 我们认为所有项目、子项目和产品的名称都是 ASF 的商标。尽管并非所有暴露出的产品名称(即“ Foo”)都可能是 ASF 的专有商标,但所有“Apache Foo”形式的名称都应该是 ASF 的专有商标。

    术语项目子项目是由 PMC 管理的社区和任何相关产品;同一商标指南适用于两者。产品是一种特定的、可下载的软件产品,我们的用户可能希望以某种方式进行使用。产品商标有一些具体的要求。注意,大多数项目和子项目发布的产品名称相同(例如 Apache Foo 项目发布了一个名为 Apache Foo 的软件产品)。

    网站导航链接原则

    无论您的项目网站使用哪种主导航系统,它都必须具有指向主网站 www.apache.org 关键页面的文本链接。这些链接可以出现在项目或子项目的所有顶级页面使用的主导航系统中。

    • “许可证”应链接到: www.apache.org/licenses/
    • “赞助”或“捐赠”应链接到: www.apache.org/foundation/sponsorship.html
    • “赞助商”、“感谢”或“感谢我们的赞助商”应链接到: www.apache.org/foundation/thanks.html
    • “安全性”应该链接到项目的特定页面,该页面详细描述用户如何安全地报告潜在漏洞,或者链接到主页面 www.apache.org/security/
    • 所有项目都必须有指向 ASF 主页 www.apache.org 的链接。这可能是主导航系统中的精选链接,也可能是主页文本中的文本链接。最佳做法是在首页上包含简短的句子或段落,以表明该项目是 Apache 项目,是更大的开发人员和用户社区的一部分。

    如果您对指向 ASF 主页的链接有更适合项目 Web 展示的建议,请告知商标@。

    包括指向第三方的“感谢”链接-如果您的项目通常有公司捐赠软件许可证或支持项目提交人,请遵循公司认可准则。重要的是要确保与正式赞助计划相关的材料以截然不同的方式公开展示此类页面。

    HTTPS 还是 HTTP?

    项目可以免费使用 http,https 或协议的相关链接作为网站导航链接所需的强制链接。

    建议(但不是要求)项目:

    • 使用 https 链接,使用 http 时目标自动切换到 https
    • 对所有其他目标使用协议相关链接

    商标归属原则

    • 所有项目或产品主页必须具有所有可用的 Apache 商标的显著商标归属。其他项目页面应显示其上任何标记的归属。例如:

    Apache Foo、Foo、Apache、Apache 羽毛 logo 和 Apache Foo 项目 logo 是 Apache 软件基金会在美国和其他国家的注册商标。

    它可能出现在页面页脚或任何其他合适的位置。

    • 在每个项目或产品主页的顶部,以及项目名称出现的每个页面的顶部横幅上,无论是标题文本还是在运行文本中第一次出现的名称,都应该在“Apache Foo”项目名称的首要位置旁边添加合适的™或®符号。这突出了我们的商标主张,并强调了它对我们的重要性。
    • 必须对网站上引用的任何其他组织的商标给予正确的归属。当在 ASF 项目网站上显示时,所有非 ASF 商标都必须归所有人所有。可以针对每个引用的标记专门执行此操作,或者一般地,在网页的页脚中执行此操作。具体举例:

    FooBar 和 FooBar logo 是 Yoyodyne,Inc. 的商标。

    要提供通用的商标归属(以涵盖使用大量商标的情况,或者在我们不确定哪些词是哪个组织的商标的情况下),您可以添加:

    提及的所有其他标记可能是其各自所有者的商标。

    LOGO和图形原则

    • Logo 也是识别商标的重要方式。对于项目的官方 logo(如果有,特别是使用 ASF 羽毛 logo),请确保在图形有一个小的“TM”符号与它相邻。对于包含项目 logo 的页面,请确保在属性中“… 和项目 logo 是商标…”。
    • 项目可以选择在 logo 中使用 Apache 羽毛。有关正确的 Apache 视觉标识和羽毛图形的详细信息,请使用press @。

    技术支持…Logo

    鼓励项目将主 logo 改为“Powered By …”或“Project Inside” logo。第三方可以使用此 logo 来表示他们使用了相关产品构建产品或服务。虽然我们必须确保主要产品 logo 与 Apache 项目提供的产品相关联,但我们允许第三方与自己的产品一起更广泛地使用“Powered by …” logo

    由 Apache 支持的 logo 可供所有项目使用(或请求更新)。

    项目元数据

    所有项目都必须为项目本身或它们所制作的所有产品版本提供 DOAP(项目描述)文件或条目,或者提供结构化的数据,以便 projects.apache.org 网站可以找到它。按照指南制作 DOAP 文件并注册,可以使 ASF 更好地以各种方式展示其所有项目和产品。

    更新 Apache 商标列表,简要描述每个软件产品。未来,我们希望从所有产品的 DOAP 文件中生成此列表。

    其他商标要求

    如果您的项目有特定软件语言的子项目,请确保恰当地命名项目。例如,“Apache Xerces Perl”不合适,因为它没有正确地使用商标“Perl”。更好的项目名称是“Apache Xerces for Perl”。例如,ASF 可以允许名为 FooBar 的第三方发布名为“Foo Bar Software for Apache Xerces”或“Bar Foo Services for Apache Xerces”的软件产品。由于 Xerces 是我们的商标,因此 ASF 不允许 FooBar 使用名称“Foo Bar Xerces”或“BarFoo Xerces”。“ Perl”(Perl Foundation 商标)一词的使用也是如此。

    注册商标 如果PMC想要请求对其项目商标进行合法注册,请注册其商标,请遵循 REGREQUEST 指南

    与项目相关的 NON-APACHE.ORG 域名

    为了确保商标一致,以及用户知道 ASF 和 PMC 提供的官方内容,所有的项目都必须托管在 ProjectName.apache.org 域中,并由 PMC 管理所有内容。

    **重要说明:**项目不得使用第三方拥有的域名托管官方项目内容。必须迁移内容,或者将域注册转移到 ASF。

    如果进入 Apache 孵化器的新社区使用了很长时间的现有域名,并且拥有庞大的用户群,那么一旦该被孵化项目毕业进入 TLP,可能会请求保留这些名称以供有限使用。

    非 apache.org 域的孵化步骤

    • 在孵化期间,PPMC 必须与 Apache Infrastructure 合作,将所有需要的域名注册正式转移到 ASF。作为一个非营利组织,ASF 期望这些域名是会被捐赠给 ASF 的。

      创建 INFRA JIRA 来向 ASF 申请接管捐赠的域名所有权。

    • PPMC 应该将其打算如何使用非 apache.org 域名的计划发送给 Brand Management / trademarks @ 进行批准。

    • 在孵化期间,PPMC 必须将所有面向开发的信息以及主要项目主页转换为官方 ProjectName.apache.org 主页。在项目毕业之前,需要完成这些转换。

    使用 non-apache.org 域要考虑的因素

    • 主要的开发主页必须托管在 ProjectName.apache.org,该主页包含潜在贡献者在决定是否加入该项目前需要了解的所有常见事项。
    • 向潜在贡献者推广该项目的主要链接应该始终直接指向 ProjectName.apache.org 资源,而不是非 apache.org 域。
    • 在大多数情况下,non-apache.org 域应该简单地重定向到 ProjectName.apache.org/path 域内的某个地方,除非被孵化项目有使用非 apache.org 域的充分理由:

    – 在项目进入 ASF 之前,用户和贡献者社区就已经非常熟悉该域。

    – 域仅用于提供终端用户级别的信息。

    – 该域在外观上与 Apache 网站一样都是 Apache 商标,并为所有可能的贡献者话题(例如下载,API文档,邮件列表等)提供直接指向 project.ao/path 的清晰链接。

    non-apache.org 域批准示例

    这些是例外,大多数新项目并非如此:

    • openoffice.org 是一个面向用户的门户网站,具有悠久的历史和数百万的用户。继续作为用户门户为现有的非技术用户提供服务很重要。
    • groovy-lang.org 是长期运行的面向用户的门户。该域仍被用作终端用户门户,包括 Groovy 语言本身的信息。开发人员信息(供 Groovy 代码库的贡献者使用),讨论和下载都在 groovy.apache.org 网站上。

    项目商标清单

    所有 Apache 顶级项目都应该完全符合这些指南。任何不符合要求的项目都必须使用商标 @,以确保它们符合要求。所有孵化器项目要么在毕业前符合所有要求,要么制定具体的短期行动计划,以在毕业后短期内完成要求(如果网站更新存在技术问题等)。

    如有品牌问题,请直接与商标 @ 联系 - 不再需要在董事会报告中包括此内容。

    项目品牌报告清单 - 项目网站基础:主页为 project.apache.org

    理由

    该原则有助于提升和改善 ASF 中所有项目的形象,并表明所有 Apache® 项目都是“开发人员和用户社区”的一部分,我们认为这是我们成功的重要因素。虽然每个项目都按照 Apache Way 的准则来管理自己的事务,但一个一致的公共品牌和网络的存在,能够将所有的项目与知名的 www.apache.org 主页联系在一起,通过确保终端用户和未来贡献者了解如何找到官方项目资源,这将使我们都受益。

    同样,在我们的项目页面上正确显示 Apache 名称和 logo 有助于维护我们对其所包含商标的合法权利。使用合适的 ™ 和 ® 符号,并正确使用商标来指代真实软件产品,是我们告诉世界(和律师)这些商标对我们有价值的关键方式。

    有问题吗 有疑问的 Apache Committer 可以联系商标委员会官方的商标原则解释了其他组织应该如何引用 Apache 项目商标和 logo。还提供了 ASF 商标列表潜在商标滥用准则

    Apache 孵化器中的孵化项目有详细的孵化项目商标指南。有关这些指南的问题直接发送至 general@incubator 列表。毕业进入顶级项目之前,孵化项目必须遵守所有项目商标要求。

    重要说明

    本 ASF 政策声明中的任何内容不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品、服务或事件的任何批准或支持。

    本文档针对 ASF 的内部社区和管理我们项目的 PMC,并且不覆盖或替代我们的正式商标政策。如果您有一个未解决的问题或者想进一步了解,请与我们联系。可获取更多有关商标法律和政策的更多资源

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache 项目网站商标原则 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    01 +Mar 2021

    Apache 项目网站商标原则

    Apache 项目网站商标原则

    翻译: 王皓月

    原文地址: http://www.apache.org/foundation/marks/pmcs

    本文定义了商标原则,定义了 Apache®projects 网站显示的元素,以及如何正确地对待 Apache 和其他组织的商标。PMC 商标责任还解释了 PMC 成员应该以何种方式管理项目商标。

    项目网站和 URL 原则:使用 * .APACHE.ORG

    • Apache 项目必须在 apache.org 域上托管官方网站,包括由项目 PMC 监督的内容(包括顶级网站,下载和 Wiki),并确保 ASF 基础架构团队可以维护服务,同时告知用户该内容是官方的并且来自 ASF 和项目 PMC,而不是来自第三方。
    • 任何 ProjectName 的主页都必须由 http[s]://ProjectName.apache.org 提供服务,以确保商标一致,且允许自动生成链接(例如 https://projects.apache.org)。项目的所有主链接都必须直接指向主页,而不是其他站点或域。
    • 项目可以自由地使用基础架构支持的技术来管理和部署网站,并且可以自由使用设计中的外观。未来,我们可能会要求项目添加特定的样式或者图形元素(从多种变体中选择),以使其返回链接 www.apache.org,这将有助于用户更好地了解 Apache 项目之间的联系。
    • 拥有悠久的开源开发历史和庞大的用户群新社区进入 Apache 孵化器前,应该阅读使用 non-apache.org 域的限制

    项目命名和描述原则

    存在新项目名称的选择准则,但尚未进行审查并合并到此原则文档中。

    • 任何项目或产品名称的主要商标必须采用“Apache Projectname ”的形式,这样可以确保在用户心中,项目或产品与 ASF 相关联,并确保第三方不能轻易滥用项目名称。项目或产品的每个页面中第一个最重要的引用,以及页面标题中的引用,都必须使用其名称的“Apache Projectname ”形式。其他引用可以根据主题使用“ Apache Projectname ”或“ Projectname ”。
    • 该产品的每个产品主页和任何概述下载页面都必须包含对该产品的突出引用,称为“ Apache Foo 软件”,并且必须包含对该软件产品本身的用途和功能的简短描述。例如:

    Apache Xerces XML 解析库软件提供了 XML 1.0解析规范的完整实现,并且易于配置,符合当前标准。

    该描述对于页面的新读者非常有用,并有助于 ASF 维护软件产品商标的完整列表。仅在与特定种类的商品关联时,商标才重要:在案例中,这是 ASF 和 PMC 提供的可实际下载的软件产品。

    请注意,共享关于商标 @ 的示例描述是有帮助的,可以确保它是正确的商标商品描述。 例如,在过去 Apache Tomcat 的网站上,它是“实现”和“协作”,而不是具有功能的产品。 Apache Spam Assassin 的网站将自己描述为一个“项目”和“版本”,并将其称为“it”。 两者都没有包含正确的商标商品描述(即执行功能的计算机软件)。 虽然这种商标描述风格有时在技术文档中显得笨拙,但这是我们强制实施商标原则的一种重要方法。对于每个项目,只需要在网站上的显眼位置进行即可。

    • 项目和产品名称应该使用一致的大写字母和形容词,而不是名词或动词,这是所有商标应该使用的。 在项目主页和下载页面上进行此操作很重要;在网站或技术产品文档的其他地方,它是不需要的。
    • 我们认为所有项目、子项目和产品的名称都是 ASF 的商标。尽管并非所有暴露出的产品名称(即“ Foo”)都可能是 ASF 的专有商标,但所有“Apache Foo”形式的名称都应该是 ASF 的专有商标。

    术语项目子项目是由 PMC 管理的社区和任何相关产品;同一商标指南适用于两者。产品是一种特定的、可下载的软件产品,我们的用户可能希望以某种方式进行使用。产品商标有一些具体的要求。注意,大多数项目和子项目发布的产品名称相同(例如 Apache Foo 项目发布了一个名为 Apache Foo 的软件产品)。

    网站导航链接原则

    无论您的项目网站使用哪种主导航系统,它都必须具有指向主网站 www.apache.org 关键页面的文本链接。这些链接可以出现在项目或子项目的所有顶级页面使用的主导航系统中。

    • “许可证”应链接到: www.apache.org/licenses/
    • “赞助”或“捐赠”应链接到: www.apache.org/foundation/sponsorship.html
    • “赞助商”、“感谢”或“感谢我们的赞助商”应链接到: www.apache.org/foundation/thanks.html
    • “安全性”应该链接到项目的特定页面,该页面详细描述用户如何安全地报告潜在漏洞,或者链接到主页面 www.apache.org/security/
    • 所有项目都必须有指向 ASF 主页 www.apache.org 的链接。这可能是主导航系统中的精选链接,也可能是主页文本中的文本链接。最佳做法是在首页上包含简短的句子或段落,以表明该项目是 Apache 项目,是更大的开发人员和用户社区的一部分。

    如果您对指向 ASF 主页的链接有更适合项目 Web 展示的建议,请告知商标@。

    包括指向第三方的“感谢”链接-如果您的项目通常有公司捐赠软件许可证或支持项目提交人,请遵循公司认可准则。重要的是要确保与正式赞助计划相关的材料以截然不同的方式公开展示此类页面。

    HTTPS 还是 HTTP?

    项目可以免费使用 http,https 或协议的相关链接作为网站导航链接所需的强制链接。

    建议(但不是要求)项目:

    • 使用 https 链接,使用 http 时目标自动切换到 https
    • 对所有其他目标使用协议相关链接

    商标归属原则

    • 所有项目或产品主页必须具有所有可用的 Apache 商标的显著商标归属。其他项目页面应显示其上任何标记的归属。例如:

    Apache Foo、Foo、Apache、Apache 羽毛 logo 和 Apache Foo 项目 logo 是 Apache 软件基金会在美国和其他国家的注册商标。

    它可能出现在页面页脚或任何其他合适的位置。

    • 在每个项目或产品主页的顶部,以及项目名称出现的每个页面的顶部横幅上,无论是标题文本还是在运行文本中第一次出现的名称,都应该在“Apache Foo”项目名称的首要位置旁边添加合适的™或®符号。这突出了我们的商标主张,并强调了它对我们的重要性。
    • 必须对网站上引用的任何其他组织的商标给予正确的归属。当在 ASF 项目网站上显示时,所有非 ASF 商标都必须归所有人所有。可以针对每个引用的标记专门执行此操作,或者一般地,在网页的页脚中执行此操作。具体举例:

    FooBar 和 FooBar logo 是 Yoyodyne,Inc. 的商标。

    要提供通用的商标归属(以涵盖使用大量商标的情况,或者在我们不确定哪些词是哪个组织的商标的情况下),您可以添加:

    提及的所有其他标记可能是其各自所有者的商标。

    LOGO和图形原则

    • Logo 也是识别商标的重要方式。对于项目的官方 logo(如果有,特别是使用 ASF 羽毛 logo),请确保在图形有一个小的“TM”符号与它相邻。对于包含项目 logo 的页面,请确保在属性中“… 和项目 logo 是商标…”。
    • 项目可以选择在 logo 中使用 Apache 羽毛。有关正确的 Apache 视觉标识和羽毛图形的详细信息,请使用press @。

    技术支持…Logo

    鼓励项目将主 logo 改为“Powered By …”或“Project Inside” logo。第三方可以使用此 logo 来表示他们使用了相关产品构建产品或服务。虽然我们必须确保主要产品 logo 与 Apache 项目提供的产品相关联,但我们允许第三方与自己的产品一起更广泛地使用“Powered by …” logo

    由 Apache 支持的 logo 可供所有项目使用(或请求更新)。

    项目元数据

    所有项目都必须为项目本身或它们所制作的所有产品版本提供 DOAP(项目描述)文件或条目,或者提供结构化的数据,以便 projects.apache.org 网站可以找到它。按照指南制作 DOAP 文件并注册,可以使 ASF 更好地以各种方式展示其所有项目和产品。

    更新 Apache 商标列表,简要描述每个软件产品。未来,我们希望从所有产品的 DOAP 文件中生成此列表。

    其他商标要求

    如果您的项目有特定软件语言的子项目,请确保恰当地命名项目。例如,“Apache Xerces Perl”不合适,因为它没有正确地使用商标“Perl”。更好的项目名称是“Apache Xerces for Perl”。例如,ASF 可以允许名为 FooBar 的第三方发布名为“Foo Bar Software for Apache Xerces”或“Bar Foo Services for Apache Xerces”的软件产品。由于 Xerces 是我们的商标,因此 ASF 不允许 FooBar 使用名称“Foo Bar Xerces”或“BarFoo Xerces”。“ Perl”(Perl Foundation 商标)一词的使用也是如此。

    注册商标 如果PMC想要请求对其项目商标进行合法注册,请注册其商标,请遵循 REGREQUEST 指南

    与项目相关的 NON-APACHE.ORG 域名

    为了确保商标一致,以及用户知道 ASF 和 PMC 提供的官方内容,所有的项目都必须托管在 ProjectName.apache.org 域中,并由 PMC 管理所有内容。

    **重要说明:**项目不得使用第三方拥有的域名托管官方项目内容。必须迁移内容,或者将域注册转移到 ASF。

    如果进入 Apache 孵化器的新社区使用了很长时间的现有域名,并且拥有庞大的用户群,那么一旦该被孵化项目毕业进入 TLP,可能会请求保留这些名称以供有限使用。

    非 apache.org 域的孵化步骤

    • 在孵化期间,PPMC 必须与 Apache Infrastructure 合作,将所有需要的域名注册正式转移到 ASF。作为一个非营利组织,ASF 期望这些域名是会被捐赠给 ASF 的。

      创建 INFRA JIRA 来向 ASF 申请接管捐赠的域名所有权。

    • PPMC 应该将其打算如何使用非 apache.org 域名的计划发送给 Brand Management / trademarks @ 进行批准。

    • 在孵化期间,PPMC 必须将所有面向开发的信息以及主要项目主页转换为官方 ProjectName.apache.org 主页。在项目毕业之前,需要完成这些转换。

    使用 non-apache.org 域要考虑的因素

    • 主要的开发主页必须托管在 ProjectName.apache.org,该主页包含潜在贡献者在决定是否加入该项目前需要了解的所有常见事项。
    • 向潜在贡献者推广该项目的主要链接应该始终直接指向 ProjectName.apache.org 资源,而不是非 apache.org 域。
    • 在大多数情况下,non-apache.org 域应该简单地重定向到 ProjectName.apache.org/path 域内的某个地方,除非被孵化项目有使用非 apache.org 域的充分理由:

    – 在项目进入 ASF 之前,用户和贡献者社区就已经非常熟悉该域。

    – 域仅用于提供终端用户级别的信息。

    – 该域在外观上与 Apache 网站一样都是 Apache 商标,并为所有可能的贡献者话题(例如下载,API文档,邮件列表等)提供直接指向 project.ao/path 的清晰链接。

    non-apache.org 域批准示例

    这些是例外,大多数新项目并非如此:

    • openoffice.org 是一个面向用户的门户网站,具有悠久的历史和数百万的用户。继续作为用户门户为现有的非技术用户提供服务很重要。
    • groovy-lang.org 是长期运行的面向用户的门户。该域仍被用作终端用户门户,包括 Groovy 语言本身的信息。开发人员信息(供 Groovy 代码库的贡献者使用),讨论和下载都在 groovy.apache.org 网站上。

    项目商标清单

    所有 Apache 顶级项目都应该完全符合这些指南。任何不符合要求的项目都必须使用商标 @,以确保它们符合要求。所有孵化器项目要么在毕业前符合所有要求,要么制定具体的短期行动计划,以在毕业后短期内完成要求(如果网站更新存在技术问题等)。

    如有品牌问题,请直接与商标 @ 联系 - 不再需要在董事会报告中包括此内容。

    项目品牌报告清单 - 项目网站基础:主页为 project.apache.org

    理由

    该原则有助于提升和改善 ASF 中所有项目的形象,并表明所有 Apache® 项目都是“开发人员和用户社区”的一部分,我们认为这是我们成功的重要因素。虽然每个项目都按照 Apache Way 的准则来管理自己的事务,但一个一致的公共品牌和网络的存在,能够将所有的项目与知名的 www.apache.org 主页联系在一起,通过确保终端用户和未来贡献者了解如何找到官方项目资源,这将使我们都受益。

    同样,在我们的项目页面上正确显示 Apache 名称和 logo 有助于维护我们对其所包含商标的合法权利。使用合适的 ™ 和 ® 符号,并正确使用商标来指代真实软件产品,是我们告诉世界(和律师)这些商标对我们有价值的关键方式。

    有问题吗 有疑问的 Apache Committer 可以联系商标委员会官方的商标原则解释了其他组织应该如何引用 Apache 项目商标和 logo。还提供了 ASF 商标列表潜在商标滥用准则

    Apache 孵化器中的孵化项目有详细的孵化项目商标指南。有关这些指南的问题直接发送至 general@incubator 列表。毕业进入顶级项目之前,孵化项目必须遵守所有项目商标要求。

    重要说明

    本 ASF 政策声明中的任何内容不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品、服务或事件的任何批准或支持。

    本文档针对 ASF 的内部社区和管理我们项目的 PMC,并且不覆盖或替代我们的正式商标政策。如果您有一个未解决的问题或者想进一步了解,请与我们联系。可获取更多有关商标法律和政策的更多资源

    \ No newline at end of file diff --git a/post/apache-policy/asf-mark-policy/index.html b/post/apache-policy/asf-mark-policy/index.html index c05d5eff..d74f91ef 100644 --- a/post/apache-policy/asf-mark-policy/index.html +++ b/post/apache-policy/asf-mark-policy/index.html @@ -1,5 +1,3 @@ -Apache 软件基金会品牌使用指南 · ALC Beijing

    Apache 软件基金会品牌使用指南

    Apache 软件基金会品牌使用指南

    翻译: 王堉琛

    原文出处:http://www.apache.org/foundation/marks/

    Apache® 品牌被 200 多个 Apache 软件基金会(ASF)项目社区共享,它也是我们使命——为公众利益提供软件——的重要组成部分。本品牌使用指南为引用 Apache® 软件项目和产品提供了示例。

    重要提示: 如果您请求在域名、活动或服务中使用 Apache 品牌,则必须遵循本指南。

    术语: 项目( Projects) 是 ASF 中开发并管理软件的组织委员会(PMC)。产品( Products) 是提供给公众的软件代码和下载。在大多数情况下,Apache 项目的名称与 Apache 软件的名称相同,且遵循 “Apache Projectname” 命名格式。

    另请参阅:品牌资源网站地图。

    关于 Apache 品牌

    Apache 品牌和我们的 羽毛 logo 代表我们构建软件的 Apache Way 过程。Apache Way 的一些元素包括有一个协作的、共识驱动的志愿者社区,这些志愿者共同治理该项目。这也意味着要有一个厂商中立(vendor-neutral)且独立的治理方式,这种治理方式欢迎所有有益的贡献,而不考虑贡献者的雇主是谁。Apache 品牌的项目托管在 ASF,并且必须被 独立管理

    作为一个非盈利的公共慈善机构,ASF 的董事会和成员是真正的 独立管理机构,监督许多 Apache 项目社区的运作。有了这一层的监督,可以确保 Apache 项目以符合整个用户社区最佳利益的方式运作,并且可以通过提供一个可以让不同的供应商一同协作的,中立的合作空间来充当创新加速器。

    为了确保 Apache 志愿者社区因提供 Apache 软件而获得应有的荣誉,并维持 ASF 和 Apache 项目独立治理的形象,您应该使用一些特定的方法来引用 Apache 项目和产品。

    如何引用 Apache 项目和产品

    Apache 项目总是以 “Apache Hadoop” 的形式命名。虽然我们在这里以 Hadoop® 项目为例,但这些准则适用于所有 Apache 项目。确保始终引用 “Apache Hadoop” 可以确保所有 Apache 项目都与主导它们的非盈利组织共享关系。

    使用 Apache Hadoop 与 Hadoop

    当以任何个人用途(如网页、讲义、幻灯片等)引用品牌时,第一个引用和最突出的引用 必须 使用全称:“Apache Hadoop®”。您应该尽可能多(具体取决于上下文和您的写作风格)的使用名称的完整形式,以确保读者清楚地理解 Hadoop 项目、 Hadoop 软件产品和作为父组织的 ASF 之间的关联。

    在这之后的每个特定文档中,您可以使用名称的裸形式,即 Hadoop,因为它最适合您的写作风格。

    更具体地说:

    对于 软件供应商或软件相关服务提供商 的使用,或当组织(或者带有组织品牌的页面)正在讨论与 Hadoop(或任何其他 Apache 品牌)相关的,但却不是 Apache 提供的软件产品或服务时,需要格外小心,以维护 Apache 品牌独立与厂商中立的声誉。

    至少 在以下情况下必须使用全称形式:

    • 标题或副标题,包括网页标题或描述元数据。

    • 任何主要文档部分中第一个且最突出的标题元素。

    • 第一个且最突出的标注、侧边栏,以及其他突出显示给用户的内容块。

    • 第一个且最突出的,在移动文字中的文档或文档正文文本中的使用。

    • 对于图形标题或图表,如果可以,名称的完整形式必须在图形中清晰可见;如果不清晰,则名称的完整形式必须用在突出的标题标题中,或附在对图形的说明中。

    • 对于视频内容,在标题、第一次使用、最后一次使用或在任何详细使用名单中,必须使用名字的完整形式。

    • 适当的品牌属性 也必须提供,要么在页脚,或在一个网站内明确标记的,说明条款,法律,品牌,或其他一般性命名的次要网页。

    其他类型的用户 使用(即不是 与所讨论的 Apache 软件产品相关的软件产品或服务的主要提供者,包括组织或个人):

    • 对于学术性或学术性的工作:在标题、副标题中,页眉、标注中的第一个且最突出的引用,或高亮部分,以及在移动文字或正文中使用第一个且最突出的引用,需要使用完整格式。之后允许使用裸模板。

    • 对于定期出版的媒体(书籍、杂志、通讯刊物):确保在标题、子标题,页眉、标注中的第一个且最突出的引用,高亮部分,以及在移动文字或正文中使用第一个且最突出的引用中,使用完整格式。除此之外,请遵循你们通常在引用软件产品名称时的规则。

    • 对于个人博客作者或个人:我们感激在标题中,移动文字或正文中第一个且最突出的地方引用全称形式。

    • Apache 品牌在 域名事件名与品牌 中的使用和品牌包含在他们自己的政策中。

    如何使用 Apache 项目 logo

    最重要的一点是使用 Apache 项目本身未经修改的 logo,并确保 logo 不会与其他公司 logo 一起使用。查看 Apache 项目 logo 的人应该始终清楚地知道,该 logo 指的是实际的 Apache 项目(社区)或软件产品(实际下载),而不是某个第三方组织或产品。

    如何使用Apache “Powered By”项目 logo

    为了使许多基于 Apache 软件构建解决方案的组织能够正确地展示它们之间的关系,ASF 为所有 Apache 项目提供了一行 下载“Powered By” 图形logo。Powered By logos 可以比官方项目 logo 更自由、更广泛地使用,包括用来直接表明 Apache 软件产品与各种第三方产品和服务之间的关系。

    如何使用 Apache 羽毛 logo

    Apache 羽毛 logo 对 ASF 和每个 Apache 项目都是一个重要的品牌。作为一个厂商中立的公共慈善机构,“羽毛” 只应被用来指代作为一个独立的组织的 ASF ,绝不能用在似乎认可任何其他组织或与任何其他组织有关联的情况下。除非是在制作物理内容时为了有限的物理印刷技术做出妥协,否则羽毛标志不得修改。羽毛 logo 决不能与其他组织 logo 或图像直接结合使用。

    ASF 新闻团队维护着官方的 Apache 羽毛标识

    其他品牌指南

    请参阅我们的 正式品牌政策 和我们的 品牌资源网站地图

    重要提示

    本 ASF 政策声明中的任何内容不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品、服务或事件的任何批准或支持。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache 软件基金会品牌使用指南 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    03 +Mar 2021

    Apache 软件基金会品牌使用指南

    Apache 软件基金会品牌使用指南

    翻译: 王堉琛

    原文出处:http://www.apache.org/foundation/marks/

    Apache® 品牌被 200 多个 Apache 软件基金会(ASF)项目社区共享,它也是我们使命——为公众利益提供软件——的重要组成部分。本品牌使用指南为引用 Apache® 软件项目和产品提供了示例。

    重要提示: 如果您请求在域名、活动或服务中使用 Apache 品牌,则必须遵循本指南。

    术语: 项目( Projects) 是 ASF 中开发并管理软件的组织委员会(PMC)。产品( Products) 是提供给公众的软件代码和下载。在大多数情况下,Apache 项目的名称与 Apache 软件的名称相同,且遵循 “Apache Projectname” 命名格式。

    另请参阅:品牌资源网站地图。

    关于 Apache 品牌

    Apache 品牌和我们的 羽毛 logo 代表我们构建软件的 Apache Way 过程。Apache Way 的一些元素包括有一个协作的、共识驱动的志愿者社区,这些志愿者共同治理该项目。这也意味着要有一个厂商中立(vendor-neutral)且独立的治理方式,这种治理方式欢迎所有有益的贡献,而不考虑贡献者的雇主是谁。Apache 品牌的项目托管在 ASF,并且必须被 独立管理

    作为一个非盈利的公共慈善机构,ASF 的董事会和成员是真正的 独立管理机构,监督许多 Apache 项目社区的运作。有了这一层的监督,可以确保 Apache 项目以符合整个用户社区最佳利益的方式运作,并且可以通过提供一个可以让不同的供应商一同协作的,中立的合作空间来充当创新加速器。

    为了确保 Apache 志愿者社区因提供 Apache 软件而获得应有的荣誉,并维持 ASF 和 Apache 项目独立治理的形象,您应该使用一些特定的方法来引用 Apache 项目和产品。

    如何引用 Apache 项目和产品

    Apache 项目总是以 “Apache Hadoop” 的形式命名。虽然我们在这里以 Hadoop® 项目为例,但这些准则适用于所有 Apache 项目。确保始终引用 “Apache Hadoop” 可以确保所有 Apache 项目都与主导它们的非盈利组织共享关系。

    使用 Apache Hadoop 与 Hadoop

    当以任何个人用途(如网页、讲义、幻灯片等)引用品牌时,第一个引用和最突出的引用 必须 使用全称:“Apache Hadoop®”。您应该尽可能多(具体取决于上下文和您的写作风格)的使用名称的完整形式,以确保读者清楚地理解 Hadoop 项目、 Hadoop 软件产品和作为父组织的 ASF 之间的关联。

    在这之后的每个特定文档中,您可以使用名称的裸形式,即 Hadoop,因为它最适合您的写作风格。

    更具体地说:

    对于 软件供应商或软件相关服务提供商 的使用,或当组织(或者带有组织品牌的页面)正在讨论与 Hadoop(或任何其他 Apache 品牌)相关的,但却不是 Apache 提供的软件产品或服务时,需要格外小心,以维护 Apache 品牌独立与厂商中立的声誉。

    至少 在以下情况下必须使用全称形式:

    • 标题或副标题,包括网页标题或描述元数据。

    • 任何主要文档部分中第一个且最突出的标题元素。

    • 第一个且最突出的标注、侧边栏,以及其他突出显示给用户的内容块。

    • 第一个且最突出的,在移动文字中的文档或文档正文文本中的使用。

    • 对于图形标题或图表,如果可以,名称的完整形式必须在图形中清晰可见;如果不清晰,则名称的完整形式必须用在突出的标题标题中,或附在对图形的说明中。

    • 对于视频内容,在标题、第一次使用、最后一次使用或在任何详细使用名单中,必须使用名字的完整形式。

    • 适当的品牌属性 也必须提供,要么在页脚,或在一个网站内明确标记的,说明条款,法律,品牌,或其他一般性命名的次要网页。

    其他类型的用户 使用(即不是 与所讨论的 Apache 软件产品相关的软件产品或服务的主要提供者,包括组织或个人):

    • 对于学术性或学术性的工作:在标题、副标题中,页眉、标注中的第一个且最突出的引用,或高亮部分,以及在移动文字或正文中使用第一个且最突出的引用,需要使用完整格式。之后允许使用裸模板。

    • 对于定期出版的媒体(书籍、杂志、通讯刊物):确保在标题、子标题,页眉、标注中的第一个且最突出的引用,高亮部分,以及在移动文字或正文中使用第一个且最突出的引用中,使用完整格式。除此之外,请遵循你们通常在引用软件产品名称时的规则。

    • 对于个人博客作者或个人:我们感激在标题中,移动文字或正文中第一个且最突出的地方引用全称形式。

    • Apache 品牌在 域名事件名与品牌 中的使用和品牌包含在他们自己的政策中。

    如何使用 Apache 项目 logo

    最重要的一点是使用 Apache 项目本身未经修改的 logo,并确保 logo 不会与其他公司 logo 一起使用。查看 Apache 项目 logo 的人应该始终清楚地知道,该 logo 指的是实际的 Apache 项目(社区)或软件产品(实际下载),而不是某个第三方组织或产品。

    如何使用Apache “Powered By”项目 logo

    为了使许多基于 Apache 软件构建解决方案的组织能够正确地展示它们之间的关系,ASF 为所有 Apache 项目提供了一行 下载“Powered By” 图形logo。Powered By logos 可以比官方项目 logo 更自由、更广泛地使用,包括用来直接表明 Apache 软件产品与各种第三方产品和服务之间的关系。

    如何使用 Apache 羽毛 logo

    Apache 羽毛 logo 对 ASF 和每个 Apache 项目都是一个重要的品牌。作为一个厂商中立的公共慈善机构,“羽毛” 只应被用来指代作为一个独立的组织的 ASF ,绝不能用在似乎认可任何其他组织或与任何其他组织有关联的情况下。除非是在制作物理内容时为了有限的物理印刷技术做出妥协,否则羽毛标志不得修改。羽毛 logo 决不能与其他组织 logo 或图像直接结合使用。

    ASF 新闻团队维护着官方的 Apache 羽毛标识

    其他品牌指南

    请参阅我们的 正式品牌政策 和我们的 品牌资源网站地图

    重要提示

    本 ASF 政策声明中的任何内容不得解释为允许任何第三方声称与 Apache 软件基金会或其任何项目有任何关联,或暗示 ASF 对任何第三方产品、服务或事件的任何批准或支持。

    \ No newline at end of file diff --git a/post/apache-policy/asf-release-notes/index.html b/post/apache-policy/asf-release-notes/index.html index dd00ef28..555bff78 100644 --- a/post/apache-policy/asf-release-notes/index.html +++ b/post/apache-policy/asf-release-notes/index.html @@ -1,5 +1,5 @@ -【Release】ASF 孵化项目发版常见问题 · ALC Beijing

    【Release】ASF 孵化项目发版常见问题

    这篇文档基于 ASF 官方的发版指南做提取和精简, 关注我们在发版过程中最容易忽视/犯错的部分, 初次参与发版的同学, -尤其是每个仓库/模块的负责人都需要完整, 仔细的通读一遍, 不确定的地方请及时沟通询问

    注: 本文主要以已加入 incubator , 也就是正在孵化中的项目为背景进行描述, 不再对已毕业项目和其他类型做额外解释说明

    0. 前言

    相信对于每个初入 ASF 的孵化项目来说,第一次发版都会遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表,思考了下主要原因可能有:

    • ASF 官方的文档颇为零散,社区的普通开发者和未参与发版的同学经常没有耐心通读所有文档以及注意到关键事项 (或理解有偏差)
    • ASF 官方文档对于有些描述仍较为模糊, 或者它直接建议 PMC/Mentor/Mail 来讨论决策,但这部分结论通常没有更新记录到文档中
    • ASF 官方没有给大家推荐类似 skywalking-eye (header/dependency) 的自动化检查工具,这些工具对初次发版的同学可能会有许多帮助
    • ASF 文档中对有些规范/规则并未严格要求, 但发版投票时不同的 Reviewer 可能有不同的习惯/偏好, 从而会提出一些改进”建议
    • “中/英"语言/语义上的理解偏差,从而导致了某些内容的误解

    借着 Apache HugeGraph 首次发版的机会,我也顺便总结了一些 PR / 邮件中遇到的事项和经验,由于是个人理解,可能存在不严谨的地方,欢迎大家一起来 review 和补充完善,避免相似的问题反复出现在 incubator 项目的发版过程中:)

    名词

    一些文中出现的常见名词缩写:

    • ASF: Apache Software Foundation
    • ASL2.0: Apache Software License 2.0

    ASF & Apache

    新同学可能会比较困惑为何常看到 ASF 的邮件/文档中不直接使用 Apache 项目 这样的描述, 而建议/习惯使用 ASF 项目. 这是因为 Apache 项目 容易产生歧义:因为 Apache 还有很多其他含义,可能会指使用了 Apache 软件许可证的项目, 但是 ASF (基金会) 的项目有一些单独的要求/限定的, 描述上加以区分可避免大家误解对应的含义, -也就能更好理解引入非 ASF 名下的 Apache 项目和引入 ASF名下项目依赖的区别了

    1. LICENSE

    LICENSE 这块是最容易产生小问题的地方, 请务必逐条确认检查: (不确定的一律以官方说明/邮件/导师沟通为准)

    1. 每个源码 & 二进制包(包括发行的 jar 包)都必须提供 LICENSE + NOTICE + DISCLAIMER 文件
      • 源码(source)包必须位于项目根目录
      • 二进制包一般也在根目录下 (注: 此项参考其他 ASF 项目, 目前没发现 ASF 有硬性要求)
    2. LICENSE 文件原始版本必须格式/内容完整正确, 请直接下载官方提供版本然后放在项目目录中 (避免手动复制粘贴文本)
    3. 建议 LICENSE/NOTICE 文件不要包含不必要的信息, 比如不要包含你没有使用到的依赖的 LICENSE, 如果移除/更新了依赖则需要及时更新/移除对应的 LICENSE/NOTICE 信息
    4. 引用的第三方license, 必须将详细信息附加到我们的 LICENSE 文件后, 如果引用的 LICENSE 很长, 则需要单独存储一个文件并指向它们, 如 LICENSE-<dependency-name>.txt
    5. 如果是引用代码方是标准的(未经修改)的 APL2.0 协议, 则可以说明对方是标准版本, 直接参考根目录下的 APL2.0 LICENSE, 无需重复拷贝
    6. 二进制包还需要特别注意, 通常它携带的 LICENSE + NOTICE 文件内容和源码包有许多区别, 请勿直接复用同一文件
      • 源码包通常不携带二进制/jar 包/图片等依赖, 所以它的 LICENSE NOTICE 会简单干净得多, 它主要是对源码引用做声明
      • 二进制包一般是在源码包的两个文件引用基础上, 还需补充所有引用的第三方依赖/图片/二进制等文件及其对应指向的 LICENSE 文件
    7. 一个第三方依赖如果有多个 LICENSE许可(例如 ASL2.0 & GPL), 建议仅选择一个 LICENSE引用 , 而不是列出所有 (不方便他人 review)
      • 一般多选一的基本依据是选择 ASF 文档中提到的 A 类宽松许可, 如没有再考虑 B 类等
      • 如果这个依赖的 LICENSE 文件是独立存在的, 也应该只选取其中所选的内容 (例如去掉其中 GPL 或其他多余的声明引用)
      • 的确可见有 ASF 项目在 LICENSE 文件中引入了依赖所有 LICENSE 条目, 但可能并非提倡的写法 (应避免参考照搬)

    除了阅读文档外, 最好的办法之一就是参考官方示例/其他 incubator 项目, 然后仍不确定的地方及时询问导师/社区 (不要自己猜测)

    注: linkis 现已毕业, 请谨慎参考其最新的文档, 可跳转到毕业前的快照

    2. License Header

    上面说完了项目整体的 LICENSE 引用, 再来说一下许多同学可能比较困惑的License Header(例如为何全局声明过, 每个文件还需单独声明)

    • 首先, 大部分开源组织都要求项目的每个源文件都有一个明显的 License 声明, 这样当他人单独引用某个文件时才最容易保留声明/也最直观清晰
    • 其次, 考虑到原始的 LICENSE 文件一般很长, 为了简洁起见它就规定在文件头部引用一个简略版本, 简称 license header, 然后完整版本放在根下(LICESEN文件), 形成一个引用关系
    • 所以可以看到哪怕同为 ASL2.0协议, 不同项目的 license header可能并不完全相同, 有增/减部分内容都是正常的 (请勿自行"统一”)

    核心

    1. ASF 规定名下项目 license header (文件头)中不能包含 Copyright 声明, 这部分应该考虑:
      • 若不必要, 例如捐赠之前的 Copyright 自愿舍弃, 那直接移除即可
      • 若需要, 则在 NOTICE 文件头部单独声明
    2. 特别注意, 如果是引用了第三方的代码, 切删除/修改对方 header 及其包含的 Copyright 声明, 更不要添加额外的 ASL2.0
      • 大家一般习惯通过插件/脚本进行批量格式化, 此时要单独检查第三方代码没有添加额外的 ASL2.0 声明
      • 另一个常见的问题就是只引用了部分代码, 此时应如何处理呢?
        1. 小修改/增加(对第三方代码), 一般应使用原文件的 license, 不修改原本的 license/author 内容
        2. 大修改, ASF 建议是 PMC 具体讨论处理 (这里没有严格定义"大/小"修改的区分方式, 所以如无必要就视作小修改处理吧:)
        3. 如果是在一个(上千行)大文件中引用了一个内部结构体/类 (几十行), 此时该如何保留它的 license 头引用呢? (应尽量避免, 详见文尾单独讨论)
    3. 哪怕第三方代码的 header 格式/语法/标点等有问题, 或者不完整(精简版), 也请勿修改原始的 License Header
    4. 同前文, 如果一个软件/代码整体包含多个可选许可, 请考虑以下二选一:
      • 优先选择 Apache 最适配的 A 类宽松许可作为 license header, 避免不必要麻烦
      • 如果原代码 license header 中已经同时提到了多种可选许可, 则不用修改 (因通常原代码作者才有权修改)

    特殊例子

    ASF 规定了部分文件不需要添加 license header, 原则是基于"内容/结构上没有任何创造性”, 如果不能确定, 则默认需要添加, 以下是参考各大社区项目/邮件和官方说明的几个典型不需要添加的例子:

    1. 简短的文本信息 (典型 READEME, CONTRIBUTING, *.txt, *.md, *.log 以及各种 lint 文件)
    2. 增加了头注释可能会报错的文件 (典型 json文件)
    3. 源码打包时可排除的文件, 例如 .github下的专用 action 文件, .git 或类似文件

    以下是比较典型的建议添加(但非强制)的例子:

    1. 包管理/依赖配置文件, 例如 Makefile/pom.xml 等, ASF 建议如无必要, 都加一下免得引入纠纷 (参考邮件讨论)
    2. 程序生成的模板/用户使用的 *.conf, *.properties 文件可视具体情况 PMC 讨论, 不确定的或单元测试中使用的配置文件建议建议默认都带上 (或向上咨询)
    3. 如果存在压缩的 css/js 等文件, 如果是自己项目开发产生的, 则建议使用简短版本的声明, 而不建议使用原始的 header 版本

    简而言之, ASF 建议除开明确不用/很难添加的例子外, 应考虑一律加上 license header 以减少麻烦

    3. NOTICE

    LICENSE/Header存放自己 + 第三方的许可证比较容易理解, NOTICE 文件又是做啥的呢? 简单说它可以存放 Copyright + (法律)强制性许可要求

    1. NOTICE 文件必须遵循 ASF 的标准规范, 不可随意修改格式 (建议参考已发版过的 incubating 项目, 已毕业项目可能有历史原因请勿直接照搬)
    2. NOTICE 文件的 Copyright 年份尽量保持统一(例如有多个repo), 并且最终年份应该随发版时进行更新 (例如 2017-20xx, 发版应检查 xx 年份)
    3. 如果我们引用了其他 ASF 的项目, 参考此处 (注意这和引用了普通 Apache2.0 协议的项目不是等同的)
    4. 尽可能保持 NOTICE 简洁, 不确定的引用请咨询社群/导师, 这里不应先假定需要, 因为它会给使用方(下游)带来额外负担 (传递性)
    5. BSD/MIT 许可证内嵌的 Copyright 通知不需要重新引用 (LEGAL-59)
    6. 如果第三方依赖的 NOTICE 文件错误的引用了 LICENSE 或者其他信息, 我们该如何选择?
      • 一般情况不用照搬错误部分, 只需要选取需要/合规的部分即可 (refer issue)
      • 不能确定的可以咨询导师/邮件 incubator 社区

    官方 + incubator示例:

    4. Disclaimer

    孵化中的项目的任何发行包(包括网站)都需要携带 DISCLAIMER (免责声明)文件, 这个听起来挺法务化的文件有两个选择: (详见官方说明)

    1. 标准版: 可以遵循 ASF 的所有发布政策的孵化项目, 命名为 DISCLAIMER 文件 (条件允许应优先考虑)
    2. WIP ** (Work In Progress) 版本: 意味着发版过程中会有部分**不能满足 ASF 要求的发布政策, 命名为 DISCLAIMER-WIP, 这里”不满足“的条件较为宽松, 例如 *GPL/CC-BY 等 X 类不兼容的许可都可以容忍 (若更特殊的情况最好是咨询导师/邮件)

    两种说明的模板内容是不一样的, 尤其是 WIP 版本需要具体列出”已知问题列表", 也就是提醒使用方这些地方可能需要留意检查, 另外要注意的是, 孵化项目在毕业前需要转为标准的 DISCLAIMER 声明 (也就意味着 WIP 版提到相关发布问题都被解决了)

    Copyright notices are only relocated if they are donated to the ASF as part of a software grant.

    关于版权的单独说明:

    ASF 的项目要求 Copyright 需放在 NOTICE 文件中而不能是 license header 里, 这个是 ASF 单独要求的, 和其他自由使用并添加 Copyright 的项目无关, 并非 Apache License(ASL2.0) 原本的要求. 特别说明一下以免误会, 这也是开头提到的 ASF 项目和 Apache 项目的显著区别之一

    6. GPL

    *GPL 许可为代表的代码/二进制引用基本都不能被包含在 ASF 的项目中, 或简单说: 严格限制分发/商业化/的许可证基本都不能被引入 (详细列表参考官方禁止引用列表)

    这里的不能被包含不止是说源码中不包含, 编译产生的二进制包理论上也不能包含, 所以使用了类似依赖/插件的部分代码需要移除/重构, 否则会非常棘手, 有以下可供参考的常见做法:

    1. 将这种 ASF 不允许携带的引用变为可选项, 例如 oracle 的 ojdbc.jar 包, 可以写文档告诉需要的用户去自行下载然后关联/启用上
    2. 若一个项目协议允许 多种许可, 只要包含和 ASL2.0 兼容的许可即可使用,并且在项目 LICENSE 文件中指定我们选择的许可
    3. 另外要注意 CC (Creative Commons) 许可, 若单独出现 ASF 也是不允许的 (这个可能大家容易忽视, 建议使用插件扫描)

    7. Binary/Archive

    二进制文件 + 单独的 jar 包(视作 Archive 文件) 同样需要特别关注, 可规避大量不必要的发版时麻烦:

    1. 二进制文件在源码包中尽量不要出现, 如果 已存在的考虑通过编译/测试时通过下载 or 临时生成代替 (新 PR 应避免重新引入)
    2. 比较巨大/难以 review 的压缩文件 (例如 swagger-ui 虽是 Apache 许可的前端包), 也尽量不要直接引入到源码, 而应在编译时下载解压代替
    3. 大部分图片也会被视为二进制文件, 这部分如非源码必要, 可考虑打包时排除
    4. 如果是必要的图片/二进制, 则需要在 LICENSE 文件中有单独的引用说明 (待补充好的示例)

    8. Git/GitHub/官网相关

    这里主要是一些容易误解的杂项细节点, 但是出错也可能会导致发版重回:

    1. 发版分支可以进行单独更新, 但是一旦发版 VOTE 邮件发出, 则必须固化下来/停止后续任何更新提交 (否则会被视为不合规)
    2. 发版的时候, 因为很可能有多轮, 所以建议 tag 使用 rc 后缀, 例如 1.0.0-rc1 代表第一次投票, 打回则递增 rc 数字 (非强制但建议)
    3. 分支 (branch) 按 ASF 邮件中提到并不需要, 所以保留 release-1.0.0 复用即可
    4. 可以在发版邮件里携带 tag 最近一次的 Commit-ID (缩略位即可), 方便确认
    5. 发版未完成之前, 官网的下载页面不可携带临时下载地址 (同理 Github 的 Release 页面务必使用 pre-release 而不可使用 latest release
    6. 官网下载页面或项目的 README 中最好有基本的 “完整性校验” + “如何编译源码” 的文档说明 (非必要但建议)

    自动化检查 (强烈建议)

    为了避免大量不必要的小问题以及人工/手工操作疏忽带来的隐患, 强烈建议增加一些自动化的CI/Action 来辅助我们进行检查:

    1. maven RAT check 二进制/header/archives (maven 插件, 仅适用 Java 系 - 必要)
    2. skywalking-license-header check (还可提供 PR 内 comment 提醒, 很棒 - 必要)
    3. skywalking-dependencies generation & check (建议至少开启 check 部分, 文档同上 - 可选)
    4. validate release package (可参考 HugeGraph 编写的自动验证 action, 提前检查GPG/SHA/二进制文件/空文件(夹)等 - 推荐)
    5. dependency-review-action (GitHub 官方提供可检查/排除 license 的 Action - 可选)

    然后人工的主要检查聚焦在一些脚本无法覆盖到的地方, 重点关注 “LICENSE + NOTICE + 第三方依赖的头声明” 等问题上, 可以减少大量精力

    9. 疑难问题

    这里是一些 ASF 官方没有直接说明/缺少清晰的定义, 但是可能会实际遇到的比较麻烦的问题/建议, 有一些结论可以参考, 复杂的建议和导师/社区一起讨论:

    1. 如果引用第三方的代码(源码)后, 需要同时在 source & binary release 的不同 LICENSE 文件中都添加引用么

      A: 是的, 都需要 (refer issue)

    2. 关于 license header 的几个点:

      • (原则)不建议大家片段化使用第三方代码, 应优先考虑分离开 or 自己重写, 不得已引用的时候需要保留原有代码的 license header

      • (原则)将第三方代码从一种编程语言转换成另一种编程语言, 不属于重大修改, 需保留原 license header (在一些算法相关的代码中较常见)

      • (特殊情况) 如果引入的第三方代码只是某个代码文件中的一小部分, 是否应该用它的 license header 作为整个文件的头?

        1. 如果引入的是一个接口定义/子类/结构体, 可否直接在这部分代码片段上引入它的 license header
        2. 如果不能在代码中间位置引入 license header, 那么头部是否允许保留两个license header (一个是 ASF 的, 一个是引入的)
        3. 如仅保留一个license header, 是否需要在 LICENSE 文件中说明引入的代码行范围, 不引入的话似乎他人不知道哪部分代码是 refer 的

        A: 上述情况尽可能还是应通过头文件/独立类等方式单独引入, 少量代码/函数如需引用, 建议优先考虑重写 (否则也应单独抽出, 避免陷入上述问题中)

    持续更新 ing


    参考资料:

    1. https://incubator.apache.org/guides/releasemanagement.html (incubator 项目发版指南①)
    2. https://www.apache.org/foundation/preFAQ.html (常见 ASL2.0 协议使用问题)
    3. https://www.apache.org/legal/src-headers.html (常见 License 头引用问题, 包括第三方引用)
    4. https://infra.apache.org/licensing-howto.html (如何编写你的 LICENSE/NOTICE 文件)
    5. https://www.apache.org/legal/resolved.html#category-x (官方禁止引用列表, 包括 CC-BY)
    6. https://lists.apache.org/list.html?general@incubator.apache.org (ASF-incubator 邮件列表)
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +【Release】ASF 孵化项目发版常见问题 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    07 +Apr 2023

    【Release】ASF 孵化项目发版常见问题

    这篇文档基于 ASF 官方的发版指南做提取和精简, 关注我们在发版过程中最容易忽视/犯错的部分, 初次参与发版的同学, +尤其是每个仓库/模块的负责人都需要完整, 仔细的通读一遍, 不确定的地方请及时沟通询问

    注: 本文主要以已加入 incubator , 也就是正在孵化中的项目为背景进行描述, 不再对已毕业项目和其他类型做额外解释说明

    0. 前言

    相信对于每个初入 ASF 的孵化项目来说,第一次发版都会遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表,思考了下主要原因可能有:

    • ASF 官方的文档颇为零散,社区的普通开发者和未参与发版的同学经常没有耐心通读所有文档以及注意到关键事项 (或理解有偏差)
    • ASF 官方文档对于有些描述仍较为模糊, 或者它直接建议 PMC/Mentor/Mail 来讨论决策,但这部分结论通常没有更新记录到文档中
    • ASF 官方没有给大家推荐类似 skywalking-eye (header/dependency) 的自动化检查工具,这些工具对初次发版的同学可能会有许多帮助
    • ASF 文档中对有些规范/规则并未严格要求, 但发版投票时不同的 Reviewer 可能有不同的习惯/偏好, 从而会提出一些改进”建议
    • “中/英"语言/语义上的理解偏差,从而导致了某些内容的误解

    借着 Apache HugeGraph 首次发版的机会,我也顺便总结了一些 PR / 邮件中遇到的事项和经验,由于是个人理解,可能存在不严谨的地方,欢迎大家一起来 review 和补充完善,避免相似的问题反复出现在 incubator 项目的发版过程中:)

    名词

    一些文中出现的常见名词缩写:

    • ASF: Apache Software Foundation
    • ASL2.0: Apache Software License 2.0

    ASF & Apache

    新同学可能会比较困惑为何常看到 ASF 的邮件/文档中不直接使用 Apache 项目 这样的描述, 而建议/习惯使用 ASF 项目. 这是因为 Apache 项目 容易产生歧义:因为 Apache 还有很多其他含义,可能会指使用了 Apache 软件许可证的项目, 但是 ASF (基金会) 的项目有一些单独的要求/限定的, 描述上加以区分可避免大家误解对应的含义, +也就能更好理解引入非 ASF 名下的 Apache 项目和引入 ASF名下项目依赖的区别了

    1. LICENSE

    LICENSE 这块是最容易产生小问题的地方, 请务必逐条确认检查: (不确定的一律以官方说明/邮件/导师沟通为准)

    1. 每个源码 & 二进制包(包括发行的 jar 包)都必须提供 LICENSE + NOTICE + DISCLAIMER 文件
      • 源码(source)包必须位于项目根目录
      • 二进制包一般也在根目录下 (注: 此项参考其他 ASF 项目, 目前没发现 ASF 有硬性要求)
    2. LICENSE 文件原始版本必须格式/内容完整正确, 请直接下载官方提供版本然后放在项目目录中 (避免手动复制粘贴文本)
    3. 建议 LICENSE/NOTICE 文件不要包含不必要的信息, 比如不要包含你没有使用到的依赖的 LICENSE, 如果移除/更新了依赖则需要及时更新/移除对应的 LICENSE/NOTICE 信息
    4. 引用的第三方license, 必须将详细信息附加到我们的 LICENSE 文件后, 如果引用的 LICENSE 很长, 则需要单独存储一个文件并指向它们, 如 LICENSE-<dependency-name>.txt
    5. 如果是引用代码方是标准的(未经修改)的 APL2.0 协议, 则可以说明对方是标准版本, 直接参考根目录下的 APL2.0 LICENSE, 无需重复拷贝
    6. 二进制包还需要特别注意, 通常它携带的 LICENSE + NOTICE 文件内容和源码包有许多区别, 请勿直接复用同一文件
      • 源码包通常不携带二进制/jar 包/图片等依赖, 所以它的 LICENSE NOTICE 会简单干净得多, 它主要是对源码引用做声明
      • 二进制包一般是在源码包的两个文件引用基础上, 还需补充所有引用的第三方依赖/图片/二进制等文件及其对应指向的 LICENSE 文件
    7. 一个第三方依赖如果有多个 LICENSE许可(例如 ASL2.0 & GPL), 建议仅选择一个 LICENSE引用 , 而不是列出所有 (不方便他人 review)
      • 一般多选一的基本依据是选择 ASF 文档中提到的 A 类宽松许可, 如没有再考虑 B 类等
      • 如果这个依赖的 LICENSE 文件是独立存在的, 也应该只选取其中所选的内容 (例如去掉其中 GPL 或其他多余的声明引用)
      • 的确可见有 ASF 项目在 LICENSE 文件中引入了依赖所有 LICENSE 条目, 但可能并非提倡的写法 (应避免参考照搬)

    除了阅读文档外, 最好的办法之一就是参考官方示例/其他 incubator 项目, 然后仍不确定的地方及时询问导师/社区 (不要自己猜测)

    注: linkis 现已毕业, 请谨慎参考其最新的文档, 可跳转到毕业前的快照

    2. License Header

    上面说完了项目整体的 LICENSE 引用, 再来说一下许多同学可能比较困惑的License Header(例如为何全局声明过, 每个文件还需单独声明)

    • 首先, 大部分开源组织都要求项目的每个源文件都有一个明显的 License 声明, 这样当他人单独引用某个文件时才最容易保留声明/也最直观清晰
    • 其次, 考虑到原始的 LICENSE 文件一般很长, 为了简洁起见它就规定在文件头部引用一个简略版本, 简称 license header, 然后完整版本放在根下(LICESEN文件), 形成一个引用关系
    • 所以可以看到哪怕同为 ASL2.0协议, 不同项目的 license header可能并不完全相同, 有增/减部分内容都是正常的 (请勿自行"统一”)

    核心

    1. ASF 规定名下项目 license header (文件头)中不能包含 Copyright 声明, 这部分应该考虑:
      • 若不必要, 例如捐赠之前的 Copyright 自愿舍弃, 那直接移除即可
      • 若需要, 则在 NOTICE 文件头部单独声明
    2. 特别注意, 如果是引用了第三方的代码, 切删除/修改对方 header 及其包含的 Copyright 声明, 更不要添加额外的 ASL2.0
      • 大家一般习惯通过插件/脚本进行批量格式化, 此时要单独检查第三方代码没有添加额外的 ASL2.0 声明
      • 另一个常见的问题就是只引用了部分代码, 此时应如何处理呢?
        1. 小修改/增加(对第三方代码), 一般应使用原文件的 license, 不修改原本的 license/author 内容
        2. 大修改, ASF 建议是 PMC 具体讨论处理 (这里没有严格定义"大/小"修改的区分方式, 所以如无必要就视作小修改处理吧:)
        3. 如果是在一个(上千行)大文件中引用了一个内部结构体/类 (几十行), 此时该如何保留它的 license 头引用呢? (应尽量避免, 详见文尾单独讨论)
    3. 哪怕第三方代码的 header 格式/语法/标点等有问题, 或者不完整(精简版), 也请勿修改原始的 License Header
    4. 同前文, 如果一个软件/代码整体包含多个可选许可, 请考虑以下二选一:
      • 优先选择 Apache 最适配的 A 类宽松许可作为 license header, 避免不必要麻烦
      • 如果原代码 license header 中已经同时提到了多种可选许可, 则不用修改 (因通常原代码作者才有权修改)

    特殊例子

    ASF 规定了部分文件不需要添加 license header, 原则是基于"内容/结构上没有任何创造性”, 如果不能确定, 则默认需要添加, 以下是参考各大社区项目/邮件和官方说明的几个典型不需要添加的例子:

    1. 简短的文本信息 (典型 READEME, CONTRIBUTING, *.txt, *.md, *.log 以及各种 lint 文件)
    2. 增加了头注释可能会报错的文件 (典型 json文件)
    3. 源码打包时可排除的文件, 例如 .github下的专用 action 文件, .git 或类似文件

    以下是比较典型的建议添加(但非强制)的例子:

    1. 包管理/依赖配置文件, 例如 Makefile/pom.xml 等, ASF 建议如无必要, 都加一下免得引入纠纷 (参考邮件讨论)
    2. 程序生成的模板/用户使用的 *.conf, *.properties 文件可视具体情况 PMC 讨论, 不确定的或单元测试中使用的配置文件建议建议默认都带上 (或向上咨询)
    3. 如果存在压缩的 css/js 等文件, 如果是自己项目开发产生的, 则建议使用简短版本的声明, 而不建议使用原始的 header 版本

    简而言之, ASF 建议除开明确不用/很难添加的例子外, 应考虑一律加上 license header 以减少麻烦

    3. NOTICE

    LICENSE/Header存放自己 + 第三方的许可证比较容易理解, NOTICE 文件又是做啥的呢? 简单说它可以存放 Copyright + (法律)强制性许可要求

    1. NOTICE 文件必须遵循 ASF 的标准规范, 不可随意修改格式 (建议参考已发版过的 incubating 项目, 已毕业项目可能有历史原因请勿直接照搬)
    2. NOTICE 文件的 Copyright 年份尽量保持统一(例如有多个repo), 并且最终年份应该随发版时进行更新 (例如 2017-20xx, 发版应检查 xx 年份)
    3. 如果我们引用了其他 ASF 的项目, 参考此处 (注意这和引用了普通 Apache2.0 协议的项目不是等同的)
    4. 尽可能保持 NOTICE 简洁, 不确定的引用请咨询社群/导师, 这里不应先假定需要, 因为它会给使用方(下游)带来额外负担 (传递性)
    5. BSD/MIT 许可证内嵌的 Copyright 通知不需要重新引用 (LEGAL-59)
    6. 如果第三方依赖的 NOTICE 文件错误的引用了 LICENSE 或者其他信息, 我们该如何选择?
      • 一般情况不用照搬错误部分, 只需要选取需要/合规的部分即可 (refer issue)
      • 不能确定的可以咨询导师/邮件 incubator 社区

    官方 + incubator示例:

    4. Disclaimer

    孵化中的项目的任何发行包(包括网站)都需要携带 DISCLAIMER (免责声明)文件, 这个听起来挺法务化的文件有两个选择: (详见官方说明)

    1. 标准版: 可以遵循 ASF 的所有发布政策的孵化项目, 命名为 DISCLAIMER 文件 (条件允许应优先考虑)
    2. WIP ** (Work In Progress) 版本: 意味着发版过程中会有部分**不能满足 ASF 要求的发布政策, 命名为 DISCLAIMER-WIP, 这里”不满足“的条件较为宽松, 例如 *GPL/CC-BY 等 X 类不兼容的许可都可以容忍 (若更特殊的情况最好是咨询导师/邮件)

    两种说明的模板内容是不一样的, 尤其是 WIP 版本需要具体列出”已知问题列表", 也就是提醒使用方这些地方可能需要留意检查, 另外要注意的是, 孵化项目在毕业前需要转为标准的 DISCLAIMER 声明 (也就意味着 WIP 版提到相关发布问题都被解决了)

    Copyright notices are only relocated if they are donated to the ASF as part of a software grant.

    关于版权的单独说明:

    ASF 的项目要求 Copyright 需放在 NOTICE 文件中而不能是 license header 里, 这个是 ASF 单独要求的, 和其他自由使用并添加 Copyright 的项目无关, 并非 Apache License(ASL2.0) 原本的要求. 特别说明一下以免误会, 这也是开头提到的 ASF 项目和 Apache 项目的显著区别之一

    6. GPL

    *GPL 许可为代表的代码/二进制引用基本都不能被包含在 ASF 的项目中, 或简单说: 严格限制分发/商业化/的许可证基本都不能被引入 (详细列表参考官方禁止引用列表)

    这里的不能被包含不止是说源码中不包含, 编译产生的二进制包理论上也不能包含, 所以使用了类似依赖/插件的部分代码需要移除/重构, 否则会非常棘手, 有以下可供参考的常见做法:

    1. 将这种 ASF 不允许携带的引用变为可选项, 例如 oracle 的 ojdbc.jar 包, 可以写文档告诉需要的用户去自行下载然后关联/启用上
    2. 若一个项目协议允许 多种许可, 只要包含和 ASL2.0 兼容的许可即可使用,并且在项目 LICENSE 文件中指定我们选择的许可
    3. 另外要注意 CC (Creative Commons) 许可, 若单独出现 ASF 也是不允许的 (这个可能大家容易忽视, 建议使用插件扫描)

    7. Binary/Archive

    二进制文件 + 单独的 jar 包(视作 Archive 文件) 同样需要特别关注, 可规避大量不必要的发版时麻烦:

    1. 二进制文件在源码包中尽量不要出现, 如果 已存在的考虑通过编译/测试时通过下载 or 临时生成代替 (新 PR 应避免重新引入)
    2. 比较巨大/难以 review 的压缩文件 (例如 swagger-ui 虽是 Apache 许可的前端包), 也尽量不要直接引入到源码, 而应在编译时下载解压代替
    3. 大部分图片也会被视为二进制文件, 这部分如非源码必要, 可考虑打包时排除
    4. 如果是必要的图片/二进制, 则需要在 LICENSE 文件中有单独的引用说明 (待补充好的示例)

    8. Git/GitHub/官网相关

    这里主要是一些容易误解的杂项细节点, 但是出错也可能会导致发版重回:

    1. 发版分支可以进行单独更新, 但是一旦发版 VOTE 邮件发出, 则必须固化下来/停止后续任何更新提交 (否则会被视为不合规)
    2. 发版的时候, 因为很可能有多轮, 所以建议 tag 使用 rc 后缀, 例如 1.0.0-rc1 代表第一次投票, 打回则递增 rc 数字 (非强制但建议)
    3. 分支 (branch) 按 ASF 邮件中提到并不需要, 所以保留 release-1.0.0 复用即可
    4. 可以在发版邮件里携带 tag 最近一次的 Commit-ID (缩略位即可), 方便确认
    5. 发版未完成之前, 官网的下载页面不可携带临时下载地址 (同理 Github 的 Release 页面务必使用 pre-release 而不可使用 latest release
    6. 官网下载页面或项目的 README 中最好有基本的 “完整性校验” + “如何编译源码” 的文档说明 (非必要但建议)

    自动化检查 (强烈建议)

    为了避免大量不必要的小问题以及人工/手工操作疏忽带来的隐患, 强烈建议增加一些自动化的CI/Action 来辅助我们进行检查:

    1. maven RAT check 二进制/header/archives (maven 插件, 仅适用 Java 系 - 必要)
    2. skywalking-license-header check (还可提供 PR 内 comment 提醒, 很棒 - 必要)
    3. skywalking-dependencies generation & check (建议至少开启 check 部分, 文档同上 - 可选)
    4. validate release package (可参考 HugeGraph 编写的自动验证 action, 提前检查GPG/SHA/二进制文件/空文件(夹)等 - 推荐)
    5. dependency-review-action (GitHub 官方提供可检查/排除 license 的 Action - 可选)

    然后人工的主要检查聚焦在一些脚本无法覆盖到的地方, 重点关注 “LICENSE + NOTICE + 第三方依赖的头声明” 等问题上, 可以减少大量精力

    9. 疑难问题

    这里是一些 ASF 官方没有直接说明/缺少清晰的定义, 但是可能会实际遇到的比较麻烦的问题/建议, 有一些结论可以参考, 复杂的建议和导师/社区一起讨论:

    1. 如果引用第三方的代码(源码)后, 需要同时在 source & binary release 的不同 LICENSE 文件中都添加引用么

      A: 是的, 都需要 (refer issue)

    2. 关于 license header 的几个点:

      • (原则)不建议大家片段化使用第三方代码, 应优先考虑分离开 or 自己重写, 不得已引用的时候需要保留原有代码的 license header

      • (原则)将第三方代码从一种编程语言转换成另一种编程语言, 不属于重大修改, 需保留原 license header (在一些算法相关的代码中较常见)

      • (特殊情况) 如果引入的第三方代码只是某个代码文件中的一小部分, 是否应该用它的 license header 作为整个文件的头?

        1. 如果引入的是一个接口定义/子类/结构体, 可否直接在这部分代码片段上引入它的 license header
        2. 如果不能在代码中间位置引入 license header, 那么头部是否允许保留两个license header (一个是 ASF 的, 一个是引入的)
        3. 如仅保留一个license header, 是否需要在 LICENSE 文件中说明引入的代码行范围, 不引入的话似乎他人不知道哪部分代码是 refer 的

        A: 上述情况尽可能还是应通过头文件/独立类等方式单独引入, 少量代码/函数如需引用, 建议优先考虑重写 (否则也应单独抽出, 避免陷入上述问题中)

    持续更新 ing


    参考资料:

    1. https://incubator.apache.org/guides/releasemanagement.html (incubator 项目发版指南①)
    2. https://www.apache.org/foundation/preFAQ.html (常见 ASL2.0 协议使用问题)
    3. https://www.apache.org/legal/src-headers.html (常见 License 头引用问题, 包括第三方引用)
    4. https://infra.apache.org/licensing-howto.html (如何编写你的 LICENSE/NOTICE 文件)
    5. https://www.apache.org/legal/resolved.html#category-x (官方禁止引用列表, 包括 CC-BY)
    6. https://lists.apache.org/list.html?general@incubator.apache.org (ASF-incubator 邮件列表)

    Categories

    \ No newline at end of file diff --git a/post/apache-way/apache-board-meeting/index.html b/post/apache-way/apache-board-meeting/index.html index 5f141716..82b5e711 100644 --- a/post/apache-way/apache-board-meeting/index.html +++ b/post/apache-way/apache-board-meeting/index.html @@ -1,6 +1,4 @@ -ASF如何准备董事会会议 · ALC Beijing

    ASF如何准备董事会会议

    ASF旗下有三百多个项目,董事会只有9个成员,每个项目一个季度就会向董事会发送一次报告,而每个月召开一次董事会会议。 -ASF每次董事会,需要处理70+个项目的报告,以及其他与基金会相关的事务。 ASF是如何保证在一个半小时的董事会中能够高效的处理这些报告的?

    简单的说ASF为了提高效率,提前让各个项目PMC准备报告,并且开发了一套专门的IT系统whimsy来处理和追踪与董事会议相关的内容。

    本文翻译至 https://www.apache.org/foundation/board/meeting

    董事会使用各种工具,并依靠Apache项目的志愿者来确保每月的会议顺利进行。这是一份关于每个月度董事会会议的经典时间表和流程的详细指南。

    我们的“PMC汇报指南”列出了一个项目的季度董事会上进行汇报的内容以及如何提交报告。请注意,执行干事和非项目公司干事(如副总裁、Infra;副总裁、法律等)每月向总裁或董事会提交报告。

    董事会会议采用电话会议(辅以IRC)的形式,通常持续1个半小时左右。会议按照提前公示出来的议程举行,由主席或相关主席团成员主持讨论。董事会会议欢迎每一位Apache的成员和PMC主席随时参加。

    谁应该做什么

    董事会负责监督包括所有Apache项目在内的整个ASF的运作。我们通过让负责公司运营的人员提交月度报告,以及每个Apache项目提交关于各自社区和技术状态的季度报告来进行督察。

    • 运营人员每月向总裁提供一份关于其业务领域(如品牌、媒体、法律、基础设施等)的报告,然后由总裁向董事会提交关于ASF日常运营的汇总报告。
    • 一些董事会成员和其他公司副总裁直接向董事会提供月度报告。
    • 每个Apache项目的PMC成员协作提供项目的季度报告。PMC主席同时也是ASF的副总裁,负责确保报告真正提交到董事会议程。
    • 在董事会会议期间,主席主持会议,秘书作记录并点名,要求出席或投票。董事会可对各种报告发表意见或提出问题;正式问题由秘书在会议结束后通过私人电子邮件向相关官员或PMC提出。
    • 秘书还负责发布经批准的董事会会议记录(通常是下个月)。

    常务董事会会议时间表

    前一个月的会议中

    在每月例会后不久,秘书将会议记录草稿提交董事会,供董事会审查和批准。然后,主席将会议期间采纳的正式行动的“ASF董事会会议摘要”概述发送给所有Apache项目提交人。秘书长对报告发表评论,并欢迎新的运营人员——详情见下文“休会”章节。

    前一个月的会议后

    在上个月的会议之后几天,下一个月(当前)会议的议程将被整理好并放入代码库。董事会议程和会议记录都保存在格式化文本文件中。这允许高级用户通过命令行进行编辑,但也允许使用“Whimsy Agenda Tool”议程工具(需要Apache账号登录)更方便地查看议程。

    然后向所有PMC发出下次会议报告的截止日期的提醒。考虑到Apache PMC的分布在全球且和完全自愿参与的性质,提前提醒(和后续跟进)是很有帮助的。项目通常提前三周到几小时(如果董事们没有时间审查,报告可能不会被接受)之间的任何地方通过邮件列表和检查 Whimsy)向董事会提交报告。

    Apache孵化器有一个特殊的提醒过程。因为孵化器中的每个被孵化的项目(Podling)都会提供自己的季度报告,所以他们会得到自己的提醒。孵化器PMC随后审查并汇总相关的Podling季度报告,允许Podling导师签字或添加其他评论,然后每月向董事会提交一份总体报告。

    会议前的一周

    每个月,董事会被随机指派为当月报告的一组PMC报告的牧羊人(负责审查报告),他将特别关注PMC的报告内容,检查并确保它们按时出现在议程中,并帮助将董事会的任何意见反馈给PMC。这有助于大家分工协作,以确保所有70多个项目的报告都被提交,并有一个总监确保反馈在之后得到处理。

    许多PMC报告都在会议前一周列入议程,因此一些总监将开始审查议程和预先批准报告,或对报告提出意见/问题。如果一位总监对一份具体的报告有顾虑,他们会在会议议程中“标记”该报告,以便在会议期间进行讨论。这时,总监通常会再次检查PMC是否确实提交了完整的报告。如果项目报告提交的晚了,会直接给PMC发电子邮件提醒。

    董事会希望不晚于会议前48小时敲定议程,尽管有时我们确实有迟交报告的情况。在会议召开前2-3天,大多数董事会审查整个议程,预先批准或在议程中对所有提交的报告发表评论。 PMC主席可以通过议程工具对任何主管的问题提供任何简短的答案或附加信息来加快会议进程。

    由于所有活动(报告提交、批准、评论)都是通过使用SVN存储库来完成的,所以Apache成员和PMC主席可以在提交消息中查看会议准备进度。

    董事会当天

    会议当天,主席按顺序把议程安排了一遍。在点名之后,执行官通常会口头回顾他们报告的要点。

    然后,我们使用预批准系统来加快每月审查70多份PMC报告的过程。任何PMC报告,如果大多数董事预先批准,且没有董事标记该报告的问题,则将获得普遍同意。这使得会议能够花时间讨论那些在会议之前没有经过董事的全面审查或有重要问题或任何董事已经标记的报告。负责人主导关于他们特别标记的报告的讨论,帮助主席专注于整个会议。

    然后,我们逐步讨论议程的其余部分,就特别指示和决议进行表决,然后有时就新问题举行讨论会,或审查先前报告中提出的更深层次的问题。

    休会/董事会结束后

    会议休会后不久,我们将通知社区:

    • 主席将会议要点的简要概述发送给我们的提交者。

      这份概述会记录任何未被接受的PMC报告,以及已批准的任何特殊指示的状态(通常是负责人任命或新项目),这些指示立即生效。

    • 秘书直接将总监对每个PMC报告的意见和评论通过私人邮箱发送给相应的PMC,并抄送董事会。这确保PMC在委员会有任何问题时得到直接和立即的反馈。在大多数情况下,这些都是关于项目的简单问题,因此董事会希望PMC可以直接回复确认或回复反馈邮件至board@邮件列表。

    • 如果存在需要跟进的严重问题,董事会将指派一名总监直接与PMC合作,以确保PMC理解这些问题,并且PMC开始采取行动解决问题(无论是总监还是其他自愿的牧羊人)。董事会希望在下个月的会议上或在PMC下一次正常的季度报告中听取这些行动的结果。

    董事会工具

    随着Apache Whimsy 项目的创建,我们现在有了许多帮助创建和管理议程的工具,以及用于提交、评论和批准报告的工作流功能,以及对当前议程和过去几分钟前的议程有方便的分类视图。

    虽然大多数Whimsy的特性仅限于Apache提交者(而且大部分功能还限于Apache 会员、官员,甚至特别官员),但过去董事会会议纪要分类列表是公开的。这使得任何人都可以方便地按日期、PMC或重大特别决议回顾所有过去的董事会会议。请注意,这只是为了方便起见,此数据的官方/规范版本包含在我们所有过去董事会会议正式纪要中。

    如何发布一个项目或官员报告

    参见PMC主席的详细董事会报告指南

    如何参加会议

    欢迎Apache成员和PMC主席参加。请将您自己列入议程,告知董事会您将出席:

    • 导航到whimsy(需要Apache登录)

    • 点击 Roll Call(点名)按钮

    • 点击底部的蓝色 Attend (参加)按钮

      提前标记你的出勤率有助于秘书更快地完成点名。如果你以后做不到,用 Regrets (取消)按钮。

    Call To Order部分有电话会议拨入和时区信息,以及我们用于非正式讨论的聊天频道信息(严格来说不是会议的一部分,但对问题讨论有用)。

    关于董事会议程网站的帮助和提示

    whimsy(需要登录)中的 Whimsy的董事会议程工具提供了许多可视化和评论委员会报告的方法,大大简化了整理和审查议程的过程。

    选择导航 Navigation - Help, or press ? 以获取有关该工具的帮助。欢迎给Whimsy JIRA提交任何错误或提出增强请求。

    您也可以在本地运行Board Agenda工具,体系结构概述和代码走读位于www/board/agenda/README.md

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ASF如何准备董事会会议 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    21 +Oct 2020

    ASF如何准备董事会会议

    ASF旗下有三百多个项目,董事会只有9个成员,每个项目一个季度就会向董事会发送一次报告,而每个月召开一次董事会会议。 +ASF每次董事会,需要处理70+个项目的报告,以及其他与基金会相关的事务。 ASF是如何保证在一个半小时的董事会中能够高效的处理这些报告的?

    简单的说ASF为了提高效率,提前让各个项目PMC准备报告,并且开发了一套专门的IT系统whimsy来处理和追踪与董事会议相关的内容。

    本文翻译至 https://www.apache.org/foundation/board/meeting

    董事会使用各种工具,并依靠Apache项目的志愿者来确保每月的会议顺利进行。这是一份关于每个月度董事会会议的经典时间表和流程的详细指南。

    我们的“PMC汇报指南”列出了一个项目的季度董事会上进行汇报的内容以及如何提交报告。请注意,执行干事和非项目公司干事(如副总裁、Infra;副总裁、法律等)每月向总裁或董事会提交报告。

    董事会会议采用电话会议(辅以IRC)的形式,通常持续1个半小时左右。会议按照提前公示出来的议程举行,由主席或相关主席团成员主持讨论。董事会会议欢迎每一位Apache的成员和PMC主席随时参加。

    谁应该做什么

    董事会负责监督包括所有Apache项目在内的整个ASF的运作。我们通过让负责公司运营的人员提交月度报告,以及每个Apache项目提交关于各自社区和技术状态的季度报告来进行督察。

    • 运营人员每月向总裁提供一份关于其业务领域(如品牌、媒体、法律、基础设施等)的报告,然后由总裁向董事会提交关于ASF日常运营的汇总报告。
    • 一些董事会成员和其他公司副总裁直接向董事会提供月度报告。
    • 每个Apache项目的PMC成员协作提供项目的季度报告。PMC主席同时也是ASF的副总裁,负责确保报告真正提交到董事会议程。
    • 在董事会会议期间,主席主持会议,秘书作记录并点名,要求出席或投票。董事会可对各种报告发表意见或提出问题;正式问题由秘书在会议结束后通过私人电子邮件向相关官员或PMC提出。
    • 秘书还负责发布经批准的董事会会议记录(通常是下个月)。

    常务董事会会议时间表

    前一个月的会议中

    在每月例会后不久,秘书将会议记录草稿提交董事会,供董事会审查和批准。然后,主席将会议期间采纳的正式行动的“ASF董事会会议摘要”概述发送给所有Apache项目提交人。秘书长对报告发表评论,并欢迎新的运营人员——详情见下文“休会”章节。

    前一个月的会议后

    在上个月的会议之后几天,下一个月(当前)会议的议程将被整理好并放入代码库。董事会议程和会议记录都保存在格式化文本文件中。这允许高级用户通过命令行进行编辑,但也允许使用“Whimsy Agenda Tool”议程工具(需要Apache账号登录)更方便地查看议程。

    然后向所有PMC发出下次会议报告的截止日期的提醒。考虑到Apache PMC的分布在全球且和完全自愿参与的性质,提前提醒(和后续跟进)是很有帮助的。项目通常提前三周到几小时(如果董事们没有时间审查,报告可能不会被接受)之间的任何地方通过邮件列表和检查 Whimsy)向董事会提交报告。

    Apache孵化器有一个特殊的提醒过程。因为孵化器中的每个被孵化的项目(Podling)都会提供自己的季度报告,所以他们会得到自己的提醒。孵化器PMC随后审查并汇总相关的Podling季度报告,允许Podling导师签字或添加其他评论,然后每月向董事会提交一份总体报告。

    会议前的一周

    每个月,董事会被随机指派为当月报告的一组PMC报告的牧羊人(负责审查报告),他将特别关注PMC的报告内容,检查并确保它们按时出现在议程中,并帮助将董事会的任何意见反馈给PMC。这有助于大家分工协作,以确保所有70多个项目的报告都被提交,并有一个总监确保反馈在之后得到处理。

    许多PMC报告都在会议前一周列入议程,因此一些总监将开始审查议程和预先批准报告,或对报告提出意见/问题。如果一位总监对一份具体的报告有顾虑,他们会在会议议程中“标记”该报告,以便在会议期间进行讨论。这时,总监通常会再次检查PMC是否确实提交了完整的报告。如果项目报告提交的晚了,会直接给PMC发电子邮件提醒。

    董事会希望不晚于会议前48小时敲定议程,尽管有时我们确实有迟交报告的情况。在会议召开前2-3天,大多数董事会审查整个议程,预先批准或在议程中对所有提交的报告发表评论。 PMC主席可以通过议程工具对任何主管的问题提供任何简短的答案或附加信息来加快会议进程。

    由于所有活动(报告提交、批准、评论)都是通过使用SVN存储库来完成的,所以Apache成员和PMC主席可以在提交消息中查看会议准备进度。

    董事会当天

    会议当天,主席按顺序把议程安排了一遍。在点名之后,执行官通常会口头回顾他们报告的要点。

    然后,我们使用预批准系统来加快每月审查70多份PMC报告的过程。任何PMC报告,如果大多数董事预先批准,且没有董事标记该报告的问题,则将获得普遍同意。这使得会议能够花时间讨论那些在会议之前没有经过董事的全面审查或有重要问题或任何董事已经标记的报告。负责人主导关于他们特别标记的报告的讨论,帮助主席专注于整个会议。

    然后,我们逐步讨论议程的其余部分,就特别指示和决议进行表决,然后有时就新问题举行讨论会,或审查先前报告中提出的更深层次的问题。

    休会/董事会结束后

    会议休会后不久,我们将通知社区:

    • 主席将会议要点的简要概述发送给我们的提交者。

      这份概述会记录任何未被接受的PMC报告,以及已批准的任何特殊指示的状态(通常是负责人任命或新项目),这些指示立即生效。

    • 秘书直接将总监对每个PMC报告的意见和评论通过私人邮箱发送给相应的PMC,并抄送董事会。这确保PMC在委员会有任何问题时得到直接和立即的反馈。在大多数情况下,这些都是关于项目的简单问题,因此董事会希望PMC可以直接回复确认或回复反馈邮件至board@邮件列表。

    • 如果存在需要跟进的严重问题,董事会将指派一名总监直接与PMC合作,以确保PMC理解这些问题,并且PMC开始采取行动解决问题(无论是总监还是其他自愿的牧羊人)。董事会希望在下个月的会议上或在PMC下一次正常的季度报告中听取这些行动的结果。

    董事会工具

    随着Apache Whimsy 项目的创建,我们现在有了许多帮助创建和管理议程的工具,以及用于提交、评论和批准报告的工作流功能,以及对当前议程和过去几分钟前的议程有方便的分类视图。

    虽然大多数Whimsy的特性仅限于Apache提交者(而且大部分功能还限于Apache 会员、官员,甚至特别官员),但过去董事会会议纪要分类列表是公开的。这使得任何人都可以方便地按日期、PMC或重大特别决议回顾所有过去的董事会会议。请注意,这只是为了方便起见,此数据的官方/规范版本包含在我们所有过去董事会会议正式纪要中。

    如何发布一个项目或官员报告

    参见PMC主席的详细董事会报告指南

    如何参加会议

    欢迎Apache成员和PMC主席参加。请将您自己列入议程,告知董事会您将出席:

    • 导航到whimsy(需要Apache登录)

    • 点击 Roll Call(点名)按钮

    • 点击底部的蓝色 Attend (参加)按钮

      提前标记你的出勤率有助于秘书更快地完成点名。如果你以后做不到,用 Regrets (取消)按钮。

    Call To Order部分有电话会议拨入和时区信息,以及我们用于非正式讨论的聊天频道信息(严格来说不是会议的一部分,但对问题讨论有用)。

    关于董事会议程网站的帮助和提示

    whimsy(需要登录)中的 Whimsy的董事会议程工具提供了许多可视化和评论委员会报告的方法,大大简化了整理和审查议程的过程。

    选择导航 Navigation - Help, or press ? 以获取有关该工具的帮助。欢迎给Whimsy JIRA提交任何错误或提出增强请求。

    您也可以在本地运行Board Agenda工具,体系结构概述和代码走读位于www/board/agenda/README.md

    \ No newline at end of file diff --git a/post/apache-way/incubator-cook-book-table/index.html b/post/apache-way/incubator-cook-book-table/index.html index b477167d..ca108ca6 100644 --- a/post/apache-way/incubator-cook-book-table/index.html +++ b/post/apache-way/incubator-cook-book-table/index.html @@ -1,5 +1,3 @@ -Apache孵化器指南表格版 · ALC Beijing

    Apache孵化器指南表格版

    作者:狄晓晓

    项目孵化成为ASF顶级项目的步骤 详见Apache Incubator cookbook

    步骤内容详情
    1与孵化器沟通孵化器PMC管理孵化器,帮助项目孵化。
    2寻找领路人(champion)和孵化导师,讨论并准备孵化提案项目要进入孵化器,需要一个领路人(Apache officer或member)和至少2-3个导师(IPMC member)(孵化过程涉及的各角色及其职责请参见Roles and Responsibilities)。
    3创建孵化提案领路人会帮助项目准备孵化提案,该提案将用于下一步与孵化器PMC的讨论。提案可以根据模板编写,需要包含几个标准部分。
    4与孵化器PMC讨论孵化提案提案准备好后,项目代表要将其发送至general@incubator.a.o邮件列表,孵化器PMC会对该方案进行讨论。
    5如有需要,完善提案中初始提交者和导师列表-
    6如有需要,基于孵化器PMC的反馈完善提案-
    7孵化器PMC对提案进行投票讨论阶段结束后,领路人或项目代表会在general@incubator.a.o邮件列表中创建【投票】帖,投票按照ASF的投票规则进行。
    8配置该项目的基础设施(JIRA等)如果孵化器PMC同意接受该项目,就可建立该项目的基础设施了,该过程通常由领路人或导师进行推动,如果社区成员熟悉该操作,也可由社区成员来推动。
    9导入初始代码企业捐赠的项目,在导入初始代码前,需要提交软件授权协议(SGA)或企业贡献者许可协议(CCLA);个人捐赠的项目,在导入初始代码前,需要主要贡献者提交个人贡献者许可协议(ICLA)或SGA。导入过程中,需要检查和报告代码中受美国出口管制法管制的密码技术。除此以外,代码以及二进制发行版还需要按照Apache License合规要求,进行清理。
    10围绕该项目代码构建社区包括投票产生新的提交者和PPMC成员(Podling Project Management Committee)。
    11发布项目,记录并完善发布过程在孵化期间,预计将发布多个版本,这些版本将逐渐符合ASF发布政策。 完全合规的发布是项目毕业的条件之一。 孵化中的项目进行发布还必须在任何发布文件名中包含“incubating”一词,并根据孵化器发布指南包含免责声明或免责声明-WIP,以防止对项目状态产生任何混淆。由于孵化中的项目还不是“真正的”ASF项目,所以设定正确的期望值是很重要的。 孵化中的项目版本发布需要两次投票,一次是在开发者邮件列表上进行的投票,如果PPMC成员中至少有3个赞成票(+1),并且赞成票比反对票(-1)多就算通过了。第二次是在孵化器常规邮件列表上进行的投票,这次投票由孵化器PMC进行投票。 Apache发布仅包含源代码,但是项目通常也会分发一些编译过的软件包。软件源代码发布是发布重点,所有分发的编译过的软件包均基于这些发布的“正式”的源代码。
    12准备毕业,与导师一起评估项目的就绪情况准备毕业的项目需要根据ASF提供的成熟度模型进行自我评估,这可以帮助发现在孵化过程中被忽略的事务。
    13将商标转让给ASF将代码捐赠给ASF的企业或个人,如果持有该项目需要的商标,则需在项目毕业前,将商标转让给ASF。
    14与孵化器PMC讨论毕业项目毕业需要PPMC先进行投票以达成共识,如果社区和导师根据自我评估认为项目已经做好准备,可以毕业,会在孵化器常规邮件列表上创建一个【讨论】帖,提议毕业并请求孵化器PMC审查该项目。
    15孵化器PMC进行毕业投票毕业提议的【讨论】进程结束后,导师或PPMC成员会在孵化器常规邮件列表上创建一个【投票】贴,孵化器PMC对该项目进行投票,投票依据ASF投票规则进行。
    16ASF董事会决议孵化器投票通过后,将会创建董事会决议的帖子并发送给ASF董事会,供董事会投票。董事会每月第三个周三会召开会议,会上会对此类决议进行投票,投票结果即刻生效。
    17毕业后的任务毕业后,项目需要在孵化器状态页面上更新状态,并对其资源和流程进行一些更改。项目毕业后,将由新组建的PMC定期向董事会进行报告,最初三个月每月一次,之后是每季度一次。毕业后的项目如果发展停滞,将进入Attic,即归档退休。关于项目毕业后资源转移的步骤及Attic的详细内容,之后会一一奉上,敬请期待。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache孵化器指南表格版 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    20 +Mar 2021

    Apache孵化器指南表格版

    作者:狄晓晓

    项目孵化成为ASF顶级项目的步骤 详见Apache Incubator cookbook

    步骤内容详情
    1与孵化器沟通孵化器PMC管理孵化器,帮助项目孵化。
    2寻找领路人(champion)和孵化导师,讨论并准备孵化提案项目要进入孵化器,需要一个领路人(Apache officer或member)和至少2-3个导师(IPMC member)(孵化过程涉及的各角色及其职责请参见Roles and Responsibilities)。
    3创建孵化提案领路人会帮助项目准备孵化提案,该提案将用于下一步与孵化器PMC的讨论。提案可以根据模板编写,需要包含几个标准部分。
    4与孵化器PMC讨论孵化提案提案准备好后,项目代表要将其发送至general@incubator.a.o邮件列表,孵化器PMC会对该方案进行讨论。
    5如有需要,完善提案中初始提交者和导师列表-
    6如有需要,基于孵化器PMC的反馈完善提案-
    7孵化器PMC对提案进行投票讨论阶段结束后,领路人或项目代表会在general@incubator.a.o邮件列表中创建【投票】帖,投票按照ASF的投票规则进行。
    8配置该项目的基础设施(JIRA等)如果孵化器PMC同意接受该项目,就可建立该项目的基础设施了,该过程通常由领路人或导师进行推动,如果社区成员熟悉该操作,也可由社区成员来推动。
    9导入初始代码企业捐赠的项目,在导入初始代码前,需要提交软件授权协议(SGA)或企业贡献者许可协议(CCLA);个人捐赠的项目,在导入初始代码前,需要主要贡献者提交个人贡献者许可协议(ICLA)或SGA。导入过程中,需要检查和报告代码中受美国出口管制法管制的密码技术。除此以外,代码以及二进制发行版还需要按照Apache License合规要求,进行清理。
    10围绕该项目代码构建社区包括投票产生新的提交者和PPMC成员(Podling Project Management Committee)。
    11发布项目,记录并完善发布过程在孵化期间,预计将发布多个版本,这些版本将逐渐符合ASF发布政策。 完全合规的发布是项目毕业的条件之一。 孵化中的项目进行发布还必须在任何发布文件名中包含“incubating”一词,并根据孵化器发布指南包含免责声明或免责声明-WIP,以防止对项目状态产生任何混淆。由于孵化中的项目还不是“真正的”ASF项目,所以设定正确的期望值是很重要的。 孵化中的项目版本发布需要两次投票,一次是在开发者邮件列表上进行的投票,如果PPMC成员中至少有3个赞成票(+1),并且赞成票比反对票(-1)多就算通过了。第二次是在孵化器常规邮件列表上进行的投票,这次投票由孵化器PMC进行投票。 Apache发布仅包含源代码,但是项目通常也会分发一些编译过的软件包。软件源代码发布是发布重点,所有分发的编译过的软件包均基于这些发布的“正式”的源代码。
    12准备毕业,与导师一起评估项目的就绪情况准备毕业的项目需要根据ASF提供的成熟度模型进行自我评估,这可以帮助发现在孵化过程中被忽略的事务。
    13将商标转让给ASF将代码捐赠给ASF的企业或个人,如果持有该项目需要的商标,则需在项目毕业前,将商标转让给ASF。
    14与孵化器PMC讨论毕业项目毕业需要PPMC先进行投票以达成共识,如果社区和导师根据自我评估认为项目已经做好准备,可以毕业,会在孵化器常规邮件列表上创建一个【讨论】帖,提议毕业并请求孵化器PMC审查该项目。
    15孵化器PMC进行毕业投票毕业提议的【讨论】进程结束后,导师或PPMC成员会在孵化器常规邮件列表上创建一个【投票】贴,孵化器PMC对该项目进行投票,投票依据ASF投票规则进行。
    16ASF董事会决议孵化器投票通过后,将会创建董事会决议的帖子并发送给ASF董事会,供董事会投票。董事会每月第三个周三会召开会议,会上会对此类决议进行投票,投票结果即刻生效。
    17毕业后的任务毕业后,项目需要在孵化器状态页面上更新状态,并对其资源和流程进行一些更改。项目毕业后,将由新组建的PMC定期向董事会进行报告,最初三个月每月一次,之后是每季度一次。毕业后的项目如果发展停滞,将进入Attic,即归档退休。关于项目毕业后资源转移的步骤及Attic的详细内容,之后会一一奉上,敬请期待。
    \ No newline at end of file diff --git a/post/apache-way/incubator-cook-book/index.html b/post/apache-way/incubator-cook-book/index.html index 0e4ffc0c..60e417f8 100644 --- a/post/apache-way/incubator-cook-book/index.html +++ b/post/apache-way/incubator-cook-book/index.html @@ -1,6 +1,4 @@ -Apache孵化器指南 · ALC Beijing

    Apache孵化器指南

    Apache孵化器指南

    翻译:狄晓晓

    Apache孵化器是项目捐赠到ASF的入口。目前国内越来越多的开源项目通过Apache孵化器进入Apache软件基金会孵化。

    本文翻译至 https://incubator.apache.org/cookbook/,为大家介绍了项目进入Apache孵化器需要做的准备,以及孵化过程中做的工作。

    该指南与孵化器主页为大家提供了在ASF孵化项目所需的必要信息。该指南汇集了所有孵化器的相关问题,给出了孵化器目标和过程的概述,并提供了更多详细信息的链接。

    该指南内容按照项目从被接收孵化到毕业成为顶级项目(Top-Level Project,TLP)的时间顺序进行组织。

    欢迎大家通过general@incubator.a.o邮件列表或INCUBATOR-234任务单对该指南提出反馈意见,也可以向该指南所在的项目仓库提交补丁。

    一、我们的项目适合Apache孵化器吗?

    正如ASF在2018年的愿景声明中所讲的那样,ASF为公共利益提供软件。

    ASF的项目会遵循Apache之道进行运转,Apache之道是一套指导原则和最佳实践。

    ASF非常重视“社区重于代码”(Community Over Code)这一理念,ASF严格独立于公司和组织,并强调在工作各方面保持开放。

    捐赠项目到ASF,意味着您将放弃对该项目以及项目商标(如果有)的控制。非常欢迎您参与该项目,但是除了成为PMC(Project Management Committee,项目管理委员会)成员之外,您没有其他特殊的地位。好消息是,由于ASF的独立性和对项目可持续性的重视,您的项目可以自己成长,并可能具有更广泛的影响力。

    假设您的项目符合这种观念模式,我们不会根据项目功能来判断项目的接收情况,这是由ASF特意不设置技术策略所决定的。如果您的项目与ASF已有项目非常相似,我们可能会要求你考虑加入该项目。尽管如此,我们仍然有一些项目具有相似的目标,但这并不一定是一个问题。

    为了给“podlings”(incubating projects,孵化项目)带来最大的成功机会,我们通常要求他们进入孵化器,并至少有一个围绕现有代码库构建的社区的开端。

    二、成为ASF顶级项目的步骤是什么?

    孵化的目标是成为ASF的顶级项目。您可以通过How the ASF works页面,了解孵化以及不同角色(提交者committers、PMC成员等)的内涵。

    为此,孵化项目(incoming project,podling)需要执行以下步骤:

    • 寻找领路人(champion)和孵化导师(mentor),讨论并准备孵化提案;
    • 决定在ASF孵化;
    • 与孵化器PMC讨论提案;
    • 如果需要,完善提案中的初始提交者和导师列表;
    • 如果需要,基于孵化器PMC的反馈,完善提案;
    • 孵化器PMC对提案进行投票;
    • 配置项目的基础设施;
    • 围绕项目代码开始构建社区;
    • 邀请新的提交者和PPMC成员;
    • 发布项目并记录,完善代码和发布过程;
    • 当准备毕业时,与导师一起评估项目的就绪情况;
    • 准备将现有商标转让给ASF(如果情况符合);
    • 与孵化器PMC讨论毕业;
    • 孵化器PMC开始毕业投票,这会使ASF董事会决议建立TLP。

    以上描述的是乐观的情况,概述了典型的孵化流程,项目真正孵化的顺序可能会与该流程略有不同。以下是该流程的详细内容:

    三、与孵化器沟通

    孵化器PMC负责管理孵化器,帮助孵化项目完成孵化过程。

    可以通过公开链接:general@incubator.a.o访问邮件列表,与孵化器PMC进行沟通。

    四、寻找接口人和导师

    为了进入孵化器,您的项目需要一名接口人和至少2-3名导师。这些人需要是孵化器PMC中的成员,ASF成员只需提出即可加入孵化器PMC。

    接口人负责在创建提案过程中帮助孵化项目,他们在前面的步骤中(至少直到项目提案被接收)充当孵化项目与孵化器PMC之间的联络员,之后可能会继续担任导师。

    导师则会在项目成长为顶级项目的道路上全程陪伴。

    起点通常是寻找接口人,您可以在general@incubator.a.o邮件列表中提交项目的简短介绍,附上相关链接,并说明您正在寻找接口人,努力引起大家的兴趣。如果您认识任何ASF成员或孵化导师,可以直接询问他们是否愿意提供帮助。

    五、创建孵化提案

    接口人会帮助项目准备孵化提案,提案会对新项目进行描述,以便后续与孵化器PMC进行初步讨论。 -提案需要包含若干标准段落,详情请参考podling proposal template.

    ASF项目的孵化提案都保存在Incubator wiki页面上,可以将它们作为示例进行参考,上一自然段中的链接给出的是方案的最新模板。

    六、讨论孵化提案

    提案准备好后,项目代表需将其发送至general@incubator.a.o进行讨论,主题行应如下,以引起孵化器PMC的注意。

    [DISCUSS] Foo Proposal

    该讨论通常会要求提案进行一些改动。

    该讨论阶段没有规定讨论时长,通常会持续几天,直到所有关注问题都被妥善讨论并形成解决方案。

    以下是最近的讨论,请参考:

    七、孵化提案投票

    讨论阶段一结束,接口人或项目代表就会在general@incubator.a.o邮件列表中创建[VOTE]帖子。

    投票过程依据ASF投票规则进行。简言之,投票发生在孵化器邮件列表中,持续至少72小时,由孵化器PMC成员进行投票,遵循多数投票法,也欢迎其他人进行投票。

    八、配置基础设施

    孵化器PMC投票决定创建该项目后,就可以为其配置基础设施。

    通常,接口人或孵化导师会推动这一过程。但是,如果项目社区成员知道如何进行操作的话,也可以由社区成员推动这一过程。

    详情请参考Infra and the Incubator

    九、宣传和公告

    在孵化器PMC接收该项目之前,项目不能发布有关加入ASF的新闻稿或其他公开声明。

    关于项目如何为自己做广告方面也有一些限制,特别是在孵化项目的新闻稿方面。Incubator Branding GuideApache Podling Publicity/Media Guidelines页面对项目宣传规则有更详细的解读。

    十、导入初始代码

    项目需遵循特定流程将代码捐赠给ASF,该流程基于软件授权协议和/或CCLA

    关于初始代码导入的更多信息,请参考Initial Code Import

    十一、社区构建

    在孵化过程中,项目有望构建并扩大其社区,包括投票选拔新的提交者和PPMC成员。

    候选者的讨论和投票过程都发生在项目的私有PPMC邮件列表中,这是该邮件列表为数不多的功能之一,因为通常所有的讨论都是公开的。

    扩大社区,特别是重建项目社区是ASF治理的重要组成部分,因为社区可以提升项目的持续性。

    十二、项目发布

    在项目孵化过程中,我们期待项目可以发布多个软件版本,这些版本会朝着完全符合ASF发布政策的方向逐渐发展。版本发布完全符合ASF发布政策是项目毕业的条件之一。

    按照孵化器发布指南要求,项目发布版本时,任何发布文件名中必须包含“incubating”一词,并且必须要包含DISCLAIMER或DISCLAIMER-WIP免责声明,以避免混淆项目状态。由于孵化项目还不是真正的ASF项目,设置适当的期望值很重要。

    请注意Apache版本发布仅包含源代码。为了给用户提供方便,项目通常也会一同分发编译过的软件包。但重点仍是实际发布的源码,所有分发的编译过的软件包都是基于这些正式发布的源码。

    十三、关于项目版本发布的两轮投票

    项目版本发布的投票分为两个阶段:

    • 首先,在开发人员邮件列表(dev list)上对版本发布进行投票,该轮投票主要是为了让项目社区练习和学习版本发布的投票过程。只要PPMC成员给出至少三张赞成票(+1),并且赞成票多于反对票(-1),就算投票通过。

    • 如果第一次投票通过,则孵化器PMC在孵化器常规邮件列表上进行第二轮投票,与所有ASF版本发布一样,这是使投票成为基金会行为的规定动作。

    在孵化器PMC的[VOTE]消息中,需明确将第一轮开发人员邮件列表中的投票情况报告给孵化器PMC,包括投票结果,以及指向项目投票记录的lists.apache.org链接。这样,导师和其他孵化器PMC成员的投票将与孵化器PMC投票绑定,而不用投两次票。

    项目和孵化器的投票都要遵循ASF投票规则:多数投票法;投票过程持续至少72小时;如果有人多次投票,以最后一次投票为准。

    十四、孵化项目与顶级项目的区别是什么?

    顶级项目是成熟的ASF项目,由自己的PMC进行管理,并且向ASF董事会进行报告。

    孵化项目是正在训练中的顶级项目。它们所做的大部分工作与顶级项目相同,特别是它们在孵化过程中的工作。

    主要的区别如下:

    • 和PMC相反,孵化项目不能代表ASF做出正式决定,因为他们不是ASF架构的正式组成部分(比如,孵化项目没有在ASF章程中被提及)。这意味着孵化器PMC需要扮演孵化项目代理人的角色,使项目的操作(比如ASF发布)正式化,并使其成为基金会的行为
    • 孵化项目会有一个PPMC(Podling Project Management Committee),像顶级项目PMC一样进行运转,但需要将一些事情委托给孵化器PMC执行,比如ASF版本发布的最终投票权。
    • 提交者、PPMC成员的选拔与顶级项目中的做法类似。孵化项目可以直接选拔候选人进入PPMC,也可以先将候选人选为提交者,之后再将他们提为PPMC成员。提交者没有正式的决策权,所以通常采用“两步走”的流程,但这不是必需的。详情请参阅How the ASF works
    • 顶级项目向ASF董事会进行报告,而孵化项目向孵化器PMC进行报告。两种汇报最初都是每月一次,之后是每季度一次。
    • 每个顶级项目都有一个PMC主席,PMC主席是顶级项目与董事会间的联络人。PMC主席不是项目的领导者,而是一个管理角色,即使他们在ASF组织架构中拥有VP(Vice President)的头衔。孵化项目中没有孵化导师的角色,导师是社区成员中的志愿者,在项目和孵化器PMC间充当联络员。
    • 孵化项目的版本发布需要两轮投票。

    ASF强烈鼓励项目有规律地成长,并更新社区的名单(提交者、PMC、PPMC),以促进项目可持续发展。孵化项目和顶级项目都应该留意社区中活跃的成员,积极选拔新的提交者和PMC成员。

    十五、毕业就绪评估

    当项目社区准备毕业时,应该先对就绪情况进行自评估。

    ASF社区发展PMC(Community Development PMC)维护的成熟度模型为此提供了一个很好的模板,可以帮助发现项目在孵化中忽略的事情。成熟度模型页面给出了项目毕业的案例。

    十六、毕业讨论

    基于就绪情况的自评估,当社区和导师认为项目已经准备好毕业了,导师或PPMC成员要在孵化器常规邮件列表中创建一个[DISCUSS]帖子,提议毕业并请求孵化器PMC审查项目。

    讨论中最好包含毕业提案,为接下来的投票做好准备。

    十七、将商标转让给ASF

    捐赠项目给ASF的个人或组织如果持有项目必需的商标,则需在项目毕业前将其转让给ASF。

    十八、毕业投票

    毕业提案讨论结束后,导师或PPMC成员在孵化器常规邮件列表中创建一个[VOTE]帖子,孵化器PMC在该进程上对是否向董事会推荐项目进行投票。

    该投票遵循标准的ASF投票规则,即多数投票法,持续至少72小时,如果重复投票,以最后一次投票为准。

    十九、ASF董事会决议

    一旦孵化器PMC投票通过项目毕业,孵化器PMC(IPMC)将会创建并向ASF董事会发送董事会决议的帖子,以供董事会进行投票。

    董事会会在每月的第三个周三召开会议,并在例行会议上对此类决议进行投票。

    董事会表决会立即生效,不过董事会会议的公开会议记录相对较晚,但通常会在一个月之内。

    二十、毕业后任务

    项目毕业后,需要在孵化器状态页面上更新项目状态,并对其资源和流程进行一些更改。

    Life after Graduation指南列出了相应的任务。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache孵化器指南 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    28 +Feb 2021

    Apache孵化器指南

    Apache孵化器指南

    翻译:狄晓晓

    Apache孵化器是项目捐赠到ASF的入口。目前国内越来越多的开源项目通过Apache孵化器进入Apache软件基金会孵化。

    本文翻译至 https://incubator.apache.org/cookbook/,为大家介绍了项目进入Apache孵化器需要做的准备,以及孵化过程中做的工作。

    该指南与孵化器主页为大家提供了在ASF孵化项目所需的必要信息。该指南汇集了所有孵化器的相关问题,给出了孵化器目标和过程的概述,并提供了更多详细信息的链接。

    该指南内容按照项目从被接收孵化到毕业成为顶级项目(Top-Level Project,TLP)的时间顺序进行组织。

    欢迎大家通过general@incubator.a.o邮件列表或INCUBATOR-234任务单对该指南提出反馈意见,也可以向该指南所在的项目仓库提交补丁。

    一、我们的项目适合Apache孵化器吗?

    正如ASF在2018年的愿景声明中所讲的那样,ASF为公共利益提供软件。

    ASF的项目会遵循Apache之道进行运转,Apache之道是一套指导原则和最佳实践。

    ASF非常重视“社区重于代码”(Community Over Code)这一理念,ASF严格独立于公司和组织,并强调在工作各方面保持开放。

    捐赠项目到ASF,意味着您将放弃对该项目以及项目商标(如果有)的控制。非常欢迎您参与该项目,但是除了成为PMC(Project Management Committee,项目管理委员会)成员之外,您没有其他特殊的地位。好消息是,由于ASF的独立性和对项目可持续性的重视,您的项目可以自己成长,并可能具有更广泛的影响力。

    假设您的项目符合这种观念模式,我们不会根据项目功能来判断项目的接收情况,这是由ASF特意不设置技术策略所决定的。如果您的项目与ASF已有项目非常相似,我们可能会要求你考虑加入该项目。尽管如此,我们仍然有一些项目具有相似的目标,但这并不一定是一个问题。

    为了给“podlings”(incubating projects,孵化项目)带来最大的成功机会,我们通常要求他们进入孵化器,并至少有一个围绕现有代码库构建的社区的开端。

    二、成为ASF顶级项目的步骤是什么?

    孵化的目标是成为ASF的顶级项目。您可以通过How the ASF works页面,了解孵化以及不同角色(提交者committers、PMC成员等)的内涵。

    为此,孵化项目(incoming project,podling)需要执行以下步骤:

    • 寻找领路人(champion)和孵化导师(mentor),讨论并准备孵化提案;
    • 决定在ASF孵化;
    • 与孵化器PMC讨论提案;
    • 如果需要,完善提案中的初始提交者和导师列表;
    • 如果需要,基于孵化器PMC的反馈,完善提案;
    • 孵化器PMC对提案进行投票;
    • 配置项目的基础设施;
    • 围绕项目代码开始构建社区;
    • 邀请新的提交者和PPMC成员;
    • 发布项目并记录,完善代码和发布过程;
    • 当准备毕业时,与导师一起评估项目的就绪情况;
    • 准备将现有商标转让给ASF(如果情况符合);
    • 与孵化器PMC讨论毕业;
    • 孵化器PMC开始毕业投票,这会使ASF董事会决议建立TLP。

    以上描述的是乐观的情况,概述了典型的孵化流程,项目真正孵化的顺序可能会与该流程略有不同。以下是该流程的详细内容:

    三、与孵化器沟通

    孵化器PMC负责管理孵化器,帮助孵化项目完成孵化过程。

    可以通过公开链接:general@incubator.a.o访问邮件列表,与孵化器PMC进行沟通。

    四、寻找接口人和导师

    为了进入孵化器,您的项目需要一名接口人和至少2-3名导师。这些人需要是孵化器PMC中的成员,ASF成员只需提出即可加入孵化器PMC。

    接口人负责在创建提案过程中帮助孵化项目,他们在前面的步骤中(至少直到项目提案被接收)充当孵化项目与孵化器PMC之间的联络员,之后可能会继续担任导师。

    导师则会在项目成长为顶级项目的道路上全程陪伴。

    起点通常是寻找接口人,您可以在general@incubator.a.o邮件列表中提交项目的简短介绍,附上相关链接,并说明您正在寻找接口人,努力引起大家的兴趣。如果您认识任何ASF成员或孵化导师,可以直接询问他们是否愿意提供帮助。

    五、创建孵化提案

    接口人会帮助项目准备孵化提案,提案会对新项目进行描述,以便后续与孵化器PMC进行初步讨论。 +提案需要包含若干标准段落,详情请参考podling proposal template.

    ASF项目的孵化提案都保存在Incubator wiki页面上,可以将它们作为示例进行参考,上一自然段中的链接给出的是方案的最新模板。

    六、讨论孵化提案

    提案准备好后,项目代表需将其发送至general@incubator.a.o进行讨论,主题行应如下,以引起孵化器PMC的注意。

    [DISCUSS] Foo Proposal

    该讨论通常会要求提案进行一些改动。

    该讨论阶段没有规定讨论时长,通常会持续几天,直到所有关注问题都被妥善讨论并形成解决方案。

    以下是最近的讨论,请参考:

    七、孵化提案投票

    讨论阶段一结束,接口人或项目代表就会在general@incubator.a.o邮件列表中创建[VOTE]帖子。

    投票过程依据ASF投票规则进行。简言之,投票发生在孵化器邮件列表中,持续至少72小时,由孵化器PMC成员进行投票,遵循多数投票法,也欢迎其他人进行投票。

    八、配置基础设施

    孵化器PMC投票决定创建该项目后,就可以为其配置基础设施。

    通常,接口人或孵化导师会推动这一过程。但是,如果项目社区成员知道如何进行操作的话,也可以由社区成员推动这一过程。

    详情请参考Infra and the Incubator

    九、宣传和公告

    在孵化器PMC接收该项目之前,项目不能发布有关加入ASF的新闻稿或其他公开声明。

    关于项目如何为自己做广告方面也有一些限制,特别是在孵化项目的新闻稿方面。Incubator Branding GuideApache Podling Publicity/Media Guidelines页面对项目宣传规则有更详细的解读。

    十、导入初始代码

    项目需遵循特定流程将代码捐赠给ASF,该流程基于软件授权协议和/或CCLA

    关于初始代码导入的更多信息,请参考Initial Code Import

    十一、社区构建

    在孵化过程中,项目有望构建并扩大其社区,包括投票选拔新的提交者和PPMC成员。

    候选者的讨论和投票过程都发生在项目的私有PPMC邮件列表中,这是该邮件列表为数不多的功能之一,因为通常所有的讨论都是公开的。

    扩大社区,特别是重建项目社区是ASF治理的重要组成部分,因为社区可以提升项目的持续性。

    十二、项目发布

    在项目孵化过程中,我们期待项目可以发布多个软件版本,这些版本会朝着完全符合ASF发布政策的方向逐渐发展。版本发布完全符合ASF发布政策是项目毕业的条件之一。

    按照孵化器发布指南要求,项目发布版本时,任何发布文件名中必须包含“incubating”一词,并且必须要包含DISCLAIMER或DISCLAIMER-WIP免责声明,以避免混淆项目状态。由于孵化项目还不是真正的ASF项目,设置适当的期望值很重要。

    请注意Apache版本发布仅包含源代码。为了给用户提供方便,项目通常也会一同分发编译过的软件包。但重点仍是实际发布的源码,所有分发的编译过的软件包都是基于这些正式发布的源码。

    十三、关于项目版本发布的两轮投票

    项目版本发布的投票分为两个阶段:

    • 首先,在开发人员邮件列表(dev list)上对版本发布进行投票,该轮投票主要是为了让项目社区练习和学习版本发布的投票过程。只要PPMC成员给出至少三张赞成票(+1),并且赞成票多于反对票(-1),就算投票通过。

    • 如果第一次投票通过,则孵化器PMC在孵化器常规邮件列表上进行第二轮投票,与所有ASF版本发布一样,这是使投票成为基金会行为的规定动作。

    在孵化器PMC的[VOTE]消息中,需明确将第一轮开发人员邮件列表中的投票情况报告给孵化器PMC,包括投票结果,以及指向项目投票记录的lists.apache.org链接。这样,导师和其他孵化器PMC成员的投票将与孵化器PMC投票绑定,而不用投两次票。

    项目和孵化器的投票都要遵循ASF投票规则:多数投票法;投票过程持续至少72小时;如果有人多次投票,以最后一次投票为准。

    十四、孵化项目与顶级项目的区别是什么?

    顶级项目是成熟的ASF项目,由自己的PMC进行管理,并且向ASF董事会进行报告。

    孵化项目是正在训练中的顶级项目。它们所做的大部分工作与顶级项目相同,特别是它们在孵化过程中的工作。

    主要的区别如下:

    • 和PMC相反,孵化项目不能代表ASF做出正式决定,因为他们不是ASF架构的正式组成部分(比如,孵化项目没有在ASF章程中被提及)。这意味着孵化器PMC需要扮演孵化项目代理人的角色,使项目的操作(比如ASF发布)正式化,并使其成为基金会的行为
    • 孵化项目会有一个PPMC(Podling Project Management Committee),像顶级项目PMC一样进行运转,但需要将一些事情委托给孵化器PMC执行,比如ASF版本发布的最终投票权。
    • 提交者、PPMC成员的选拔与顶级项目中的做法类似。孵化项目可以直接选拔候选人进入PPMC,也可以先将候选人选为提交者,之后再将他们提为PPMC成员。提交者没有正式的决策权,所以通常采用“两步走”的流程,但这不是必需的。详情请参阅How the ASF works
    • 顶级项目向ASF董事会进行报告,而孵化项目向孵化器PMC进行报告。两种汇报最初都是每月一次,之后是每季度一次。
    • 每个顶级项目都有一个PMC主席,PMC主席是顶级项目与董事会间的联络人。PMC主席不是项目的领导者,而是一个管理角色,即使他们在ASF组织架构中拥有VP(Vice President)的头衔。孵化项目中没有孵化导师的角色,导师是社区成员中的志愿者,在项目和孵化器PMC间充当联络员。
    • 孵化项目的版本发布需要两轮投票。

    ASF强烈鼓励项目有规律地成长,并更新社区的名单(提交者、PMC、PPMC),以促进项目可持续发展。孵化项目和顶级项目都应该留意社区中活跃的成员,积极选拔新的提交者和PMC成员。

    十五、毕业就绪评估

    当项目社区准备毕业时,应该先对就绪情况进行自评估。

    ASF社区发展PMC(Community Development PMC)维护的成熟度模型为此提供了一个很好的模板,可以帮助发现项目在孵化中忽略的事情。成熟度模型页面给出了项目毕业的案例。

    十六、毕业讨论

    基于就绪情况的自评估,当社区和导师认为项目已经准备好毕业了,导师或PPMC成员要在孵化器常规邮件列表中创建一个[DISCUSS]帖子,提议毕业并请求孵化器PMC审查项目。

    讨论中最好包含毕业提案,为接下来的投票做好准备。

    十七、将商标转让给ASF

    捐赠项目给ASF的个人或组织如果持有项目必需的商标,则需在项目毕业前将其转让给ASF。

    十八、毕业投票

    毕业提案讨论结束后,导师或PPMC成员在孵化器常规邮件列表中创建一个[VOTE]帖子,孵化器PMC在该进程上对是否向董事会推荐项目进行投票。

    该投票遵循标准的ASF投票规则,即多数投票法,持续至少72小时,如果重复投票,以最后一次投票为准。

    十九、ASF董事会决议

    一旦孵化器PMC投票通过项目毕业,孵化器PMC(IPMC)将会创建并向ASF董事会发送董事会决议的帖子,以供董事会进行投票。

    董事会会在每月的第三个周三召开会议,并在例行会议上对此类决议进行投票。

    董事会表决会立即生效,不过董事会会议的公开会议记录相对较晚,但通常会在一个月之内。

    二十、毕业后任务

    项目毕业后,需要在孵化器状态页面上更新项目状态,并对其资源和流程进行一些更改。

    Life after Graduation指南列出了相应的任务。

    \ No newline at end of file diff --git a/post/apache-way/new-proposal-template-guide/index.html b/post/apache-way/new-proposal-template-guide/index.html index ea66833b..9a7785af 100644 --- a/post/apache-way/new-proposal-template-guide/index.html +++ b/post/apache-way/new-proposal-template-guide/index.html @@ -1,6 +1,6 @@ -新孵化项目提案指导 · ALC Beijing

    新孵化项目提案指导

    摘要 Abstract

    评注: 对项目的简短描述性概述。一段简短的文字,长度最好为一句话。摘要应适合在毕业时用于创建正式项目的董事会决议中重复使用,并作为新孵化项目网站和项目描述 (DOAP: Description of a Project)文件的第一段。

    Commentary: A short descriptive summary of the project. A short paragraph, ideally one sentence in length. The abstract should be suitable for reuse in the board resolution used to create the official project upon graduation, as the first paragraph on the podling web site and in the DOAP document.

    示例 Examples:

    Geronimo 将是一个符合 J2EE 规范的容器。

    Geronimo will be a J2EE compliant container.

    Heraldry 将围绕以用户为中心的新兴身份空间开发技术。

    Heraldry will develop technologies around the emerging user-centric identity space.

    Yoko 将成为 CORBA 服务器。

    Yoko will be a CORBA server.

    提案 Proposal

    评注: 较长的建议说明。应具有合理的陈述性。更多的论述性材料应放在理由部分(或后面的其他部分)。

    Commentary: A lengthier description of the proposal. Should be reasonably declarative. More discursive material should be included in the rationale (or other later sections).

    示例 Example:

    XAP 提供了一个基于 XML 的声明式框架,用于构建、部署和维护丰富的交互式 Ajax 网络应用程序。XAP 的一个基本原则是利用现有的 Ajax 应用程序…

    XAP is to provide an XML-based declarative framework for building, deploying and maintaining rich, interactive, Ajax-powered web applications. A basic principle of XAP is to leverage existing Ajax…

    背景介绍 Background

    评论: 为不熟悉问题范畴和项目历史的人提供背景资料。解释含义可能被误解的术语(例如,没有一个被广泛采用的定义)。这些内容应该能够被领域专家安全地忽略。这些内容最终可能会出现在新孵化项目的网站上。

    Commentary: Provides context for those unfamiliar with the problem space and the history of the project. Explain terms whose meanings may be misunderstood (for example, where there is not a single widely adopted definition). This content should be capable of being safely ignored by domain experts. It should probably find an eventual home on the Podling website.

    示例 Example(Heraldry):

    Higgins 项目是 Eclipse 正在积极开发的一个框架,它将使用户和企业能够跨多个系统集成身份、个人资料和关系信息。通过使用上下文提供者,现有的和新的系统,如目录、协作空间等,都可以使用 Higgins 项目。

    To provide some background, the Higgins Project is being actively developed within Eclipse and is a framework that will enable users and enterprises to integrate identity, profile, and relationship information across multiple systems. Using context providers, existing and new systems such as directories, collaboration spaces

    合理性(提案理由)Rationale

    评论:解释为什么这个项目需要存在,为什么它应该被 ASF 采用。这里适合讨论性材料。

    Commentary: Explains why this project needs to exist and why should it be adopted by Apache. This is the right place for discursive material.

    示例 Example (Beehive):

    在构建 J2EE 应用程序时,我们亟需一个连贯、易用的编程模型。刚刚接触 Java 的开发人员不得不学习大量的 API 来构建简单的应用程序;高级 J2EE 开发人员不得不编写乏味的系统架构描述代码;由于底层的复杂性,工具作者在简化体验方面受到限制。

    There is a strong need for a cohesive, easy-to-use programming model for building J2EE applications. Developers new to Java are forced to learn a myriad of APIs just to build simple applications; advanced J2EE developers are forced to write tedious plumbing code; and tools authors are limited in what they can do to simplify the experience due to the underlying complexity.

    初始的目标 Initial Goals

    评注: 复杂的建议(例如,涉及多个现有代码库)可能会让人担心其实用性。解决这些问题的一个好办法是制定一个计划,证明该建议是可行的,并且经过了深思熟虑。

    Commentary: A complex proposal (involving multiple existing code bases, for example) may cause concerns about its practicality. A good way to address these concerns is to create a plan that demonstrates the proposal is feasible and has been carefully thought through.

    许多项目不需要本节。

    Many projects will not need this section.

    示例 Example(Heraldry):

    将 Yadis 和 OpenID 库扩展到现有 Python、Ruby、Perl 和 PHP 库之外的其他语言,以修订 OpenID 身份验证规范,解决已知的安全问题,研究与 DIX IETF 提案的兼容性,描述 Yadis 集成,并允许使用 URL 或 XRI 作为最终用户标识符

    Expansion of Yadis and OpenID libraries into additional languages beyond the existing Python, Ruby, Perl, and PHP libraries’ OpenID authentication specification revision to fix known security considerations, investigate compatibility with the DIX IETF proposal, describe Yadis integration, and allow either an URL or XRI be used as the End User’s Identifier

    目前状态 Current Status

    评注: 本部分(以及包含的主题)描述了候选项目的现状和开发实践。这应该是一个诚实的评估,并将其与 Apache 的原则和开发理想相平衡。

    Commentary: This section (and the contained topics) describes the candidate’s current status and development practices. This should be an honest assessment balancing these against Apache’s principles and development ideals.

    对于某些提案来说,这是一个展示对毕业前需要解决的问题的理解的机会。而对于其他提案,这则是一个强调与已有 Apache 之道密切匹配的机会。没有初始代码库的提案应简单说明这一点。

    For some proposals, this is a chance to demonstrate an understanding of the issues that will need to addressed before graduation. For others, this is a chance to highlight the close match with Apache Way that already exists. Proposals without an initial code base should just simply state that.

    有些提案将这一部分命名为准则(虽然这个词有点误导)。

    Some proposals name this section criteria (though the term is a little misleading).

    任人唯贤 Meritocracy:

    评注: ASF 是一个任人唯贤的地方。

    Commentary: Apache is a meritocracy.

    一旦开发人员提交了足够多的优秀补丁,他们就会很自然地当选为提交者。活跃的提交者被选入项目管理委员会(PMC)也是理所当然的。

    Once a developer has submitted enough good patches, then it should be natural that they are elected to committer. It should be natural that active committers are elected to the project management committee (PMC).

    这一更新过程对于 Apache 项目的长期健康发展至关重要。这份提案正是证明提案者理解这一过程的合适场所。

    This process of renewal is vital to the long term health of Apache projects. This is the right place to demonstrate that this process is understood by the proposers.

    示例 Example (OFBiz):

    OFBiz 最初由 David E. Jones 和 Andy Zeneski 于 2001 年 5 月创建。该项目现在拥有来自世界各地的提交者和用户。项目中较新的提交者是在随后几年加入的,他们最初提交补丁,然后拥有部分应用程序的提交权限,再后来拥有更多应用程序的提交权限。

    OFBiz was originally created by David E. Jones and Andy Zeneski in May 2001. The project now has committers and users from around the world. The newer committers of the project joined in subsequent years by initially submitting patches, then having commit privileges for some of the applications, and then privileges over a larger range of applications.

    示例 Example(Beehive):

    我们计划尽一切可能营造一个支持任人唯贤的环境。XMLBeans 的提交者们学到的经验之一是,优秀的社区不只是从良好的愿望中发展出来的;它们需要积极地向社区寻求帮助,列出/说明需要完成的工作,并跟踪和鼓励做出贡献的社区成员…

    We plan to do everything possible to encourage an environment that supports a meritocracy. One of the lessons that the XMLBeans committers have learned is that meritocracies don’t just evolve from good intentions; they require actively asking the community for help, listing/specifying the work that needs to be done, and keeping track of and encouraging members of the community who make any contributions…

    社区 Community

    评注: 阿帕奇只对社区感兴趣。

    Commentary: Apache is interested only in communities.

    候选项目应从一个社区开始,并有可能通过吸引新用户和开发者来发展和更新这个社区。请说明您的提案如何符合这一愿景。

    Candidates should start with a community and have the potential to grow and renew this community by attracting new users and developers. Explain how the proposal fits this vision.

    示例 Example(Beehive):

    过去两年中,BEA 一直在围绕该框架的前身建立一个社区。目前有一个活跃的新闻组,可以帮助我们在 Apache 建立一个新的社区。

    BEA has been building a community around predecessors to this framework for the last two years. There is currently an active newsgroup that should help us build a new community at Apache.

    示例 Example(WebWork2):

    WebWork 2 社区拥有活跃的邮件列表和论坛,追随者众多。

    The WebWork 2 community has a strong following with active mailing lists and forums.

    示例 Example(WADI):

    开源中对全服务集群和缓存组件的需求是巨大的,因为它可以应用于许多领域,从而为一个巨大的社区提供了潜力。

    The need for a full service clustering and caching component in the open source is tremendous as its use can be applied in many areas, thus providing the potential for an incredibly large community.

    核心开发者 Core Developers

    ASF 是由个人组成的。

    Apache is composed of individuals.

    对初始提交者列表中的开发人员进行简要介绍是非常有用的。最好在这里进行(而不是在初始提交至列表部分才介绍)。本节可用于讨论核心开发团队的多样性。

    It is useful to provide a brief introduction to the developers on the initial committers list. This is best done here (and not in that section). This section may be used to discuss the diversity of the core development team.

    示例 Example(ServiceMix)

    核心开发人员是一个多元化的开发团队,其中许多人已经是经验丰富的开源开发人员。他们中至少有一名 Apache 成员,还有其他一些现有的 Apache 提交者(Committer),以及来自不同公司的人员。http://servicemix.org/Team。

    The core developers are a diverse group of developers, many of which are already very experienced open source developers. There is at least one Apache Member together with a number of other existing Apache Committers along with folks from various companies. http://servicemix.org/Team

    示例 Example(WADI)

    WADI 由 Jules Gosnell 于 2004 年创立,目前拥有来自 Geronimo、Castor、OpenEJB、Mojo、Jetty、ActiveCluster、ActiveMQ 和 ServiceMix 的强大开发人员基础。

    WADI was founded by Jules Gosnell in 2004, it now has a strong base of developers from Geronimo, Castor, OpenEJB, Mojo, Jetty, ActiveCluster, ActiveMQ, and ServiceMix.

    相关性 Alignment

    说明为什么您的提案和 Apache 非常匹配。强调您的提案与 Apache 项目和开发理念的联系。

    Describe why Apache is a good match for the proposal. An opportunity to highlight links with Apache projects and development philosophy.

    示例 Example (Beehive):

    初始代码库的目标是在 Tomcat 中运行,但我们的目标是让该框架在任何兼容的 Servlet 或 J2EE 容器上运行。基于 JSR-181 的 Web 服务组件将利用 Axis。NetUI 组件基于 Struts。底层控制组件框架使用 Velocity。我们还需要开发其他项目,如 Portals 和 Maven 项目。

    The initial code base is targeted to run within Tomcat, but the goal is to allow the framework to run on any compliant Servlet or J2EE container. The Web services component, based on JSR-181, will leverage Axis. The NetUI component builds on top of Struts. The underlying Controls component framework uses Velocity. There are other projects that we will need to work on, such as the Portals and Maven projects.

    已知风险 Known Risks

    自我认识的练习。风险并不意味着项目不可接受。如果认识到并注意到这些风险,就可以在孵化期间加以解决。

    An exercise in self-knowledge. Risks don’t mean that a project is unacceptable. If they are recognized and noted, then they can be addressed during incubation.

    项目名称 Project Name

    说明已采取哪些措施检查项目名称是否合适,以及项目是否获得继续使用其现有名称的法律许可。还请说明广泛使用该名称是否会在将来造成项目所有权人的混淆或品牌问题。

    Describe what has been done to check that the name of the project is suitable and if the project has legal permission to continuing using its current name. Also indicate if the wide use of the name is likely to cause confusion about who owns the project or branding issues in the future.

    被遗弃的产品 Orphaned Products

    对未来发展做出公开承诺。

    A public commitment to future development.

    招募多样化的开发社区和强大的用户群需要时间。ASF 需要确信提议者是有决心的。

    Recruiting a diverse development community and a strong user base takes time. Apache needs to be confident that the proposers are committed.

    示例 Example (Yoko):

    贡献者都是这一领域的领先者。不存在出现孤儿代码或废弃代码的任何常见警告信号的风险。

    The contributors are leading vendors in this space. There is no risk of any of the usual warning signs of orphaned or abandoned code.

    示例 Example (Ivy):

    由于提交者人数较少,因此项目存在成为 “孤儿 “的风险。代码库的主要知识仍由 Xavier Hanin 掌握。即使 Xavier 没有离开 Ivy 开发团队的打算,我们也意识到了这个问题,并且知道需要努力减少项目对个人的依赖。

    Due to its small number of committers, there is a risk of being orphaned. The main knowledge of the codebase is still mainly owned by Xavier Hanin. Even if Xavier has no plan to leave Ivy development, this is a problem we are aware of and know that need to be worked on so that the project become less dependent on an individual.

    示例 Example (Tika):

    有许多处于不同成熟阶段的项目都实现了 Tika 中建议功能的一部分。对于许多潜在用户来说,现有的工具已经足够,这就减少了对更通用工具包的需求。这一点也可以从过去一年中该提案的缓慢进展中看出。不过,一旦项目启动,我们就可以根据下面提到的种子代码,迅速达到现有工具的功能水平。在此之后,我们相信,基于通用工具包优于定制工具包的优势,开发者和用户社区将迅速发展壮大。

    There are a number of projects at various stages of maturity that implement a subset of the proposed features in Tika. For many potential users the existing tools are already enough, which reduces the demand for a more generic toolkit. This can also be seen in the slow progress of this proposal over the past year. However, once the project gets started we can quickly reach the feature level of existing tools based on seed code from sources mentioned below. After that we believe to be able to quickly grow the developer and user communities based on the benefits of a generic toolkit over custom alternatives.

    缺乏开源经验 Inexperience with Open Source

    如果提案是基于现有的开源项目,并具备开放开发的历史,则应在此处重点说明。

    If the proposal is based on an existing open source project with a history of open development, then highlight this here.

    如果初始提交者名单中包含具有深厚开源背景的开发人员,则应在此处强调这一点。

    If the list of initial committers contains developers with strong open source backgrounds, then highlight this here.

    缺乏开源经验是封闭项目选择申请孵化的原因之一。多年来,Apache 在这方面积累了丰富的经验。成功开放一个封闭项目意味着所有参与者都要投入精力。这需要学习和回馈社区的意愿。如果提案是围绕一个封闭项目提出的,并且对开源领域知之甚少,那么请承认这一点,并表现出学习的意愿。

    Inexperience with open source is one reason why closed projects choose to apply for incubation. Apache has developed over the years a store of experience in this area. Successfully opening up a closed project means an investment of energy by all involved. It requires a willingness to learn and to give back to the community. If the proposal is based around a closed project and comes with very little understanding of the open source space, then acknowledge this and demonstrate a willingness to learn.

    示例 Example (Cayenne):

    Cayenne 于 2001 年作为开源项目启动,至今已有 5 年时间。

    Cayenne started as an open source project in 2001 and has remained so for 5 years.

    示例 Example (Beehive):

    许多提交者都有开源项目的工作经验。其中五人有在其他 Apache 项目中担任提交者的经验。

    Many of the committers have experience working on open source projects. Five of them have experience as committers on other Apache projects.

    示例 Example (Ivy):

    虽然 Ivy 是在开源许可证下发布的,但最初对它的访问是有限的,公众无法访问问题跟踪系统或 SVN 资源库。虽然后来情况有所改变 - SVN 仓库可以公开访问,JIRA 实例自 2005 年 6 月起就已建立,许多新功能都是先在论坛或 JIRA 上讨论的 - 但真正开源开发模式的经验目前还很有限。不过,Maarten 在真正的开放源代码开发流程方面已经有了很好的经验,他将把自己的经验带到项目中来。

    While distributed under an open source license, access to Ivy was initially limited with no public access to the issue tracking system or svn repository. While things have changed since then - the svn repository is publicly accessible, a JIRA instance has been setup since june 2005, many new features are first discussed on the forum or JIRA - experience with a true open source development model is currently limited. However, Maarten already has good experience with true open development process, and brings his experience to the project.

    示例 Example (River):

    最初的提交者在开源项目方面拥有不同程度的经验。他们都参与过以开源许可证发布的源代码,但使用开源开发流程开发代码的经验有限。不过,我们预计在正常的任人唯贤规则下执行不会有任何困难。

    The initial committers have varying degrees of experience with open source projects. All have been involved with source code that has been released under an open source license, but there is limited experience developing code with an open source development process. We do not, however, expect any difficulty in executing under normal meritocracy rules.

    孵化期 Length of Incubation

    说明:本节说明了项目在升级为顶级项目之前预计需要多长时间的孵化,以及孵化的原因。

    Commentary: This section describes how long the project is expected to be in incubation before it’s graduation as a top level project and the reasons for that.

    这表明项目已经考虑了毕业所需的步骤,没有任何不切实际的期望。

    This shows the project has thought about the steps required to graduate and that there are not any unrealistic expectations.

    同质化的开发人员 Homogenous Developers:

    健康的项目需要开发商的组合。开放式开发需要致力于鼓励多样化的混合。这包括在分布式环境中作为地理位置分散的小组的一部分开展工作的艺术。

    Healthy projects need a mix of developers. Open development requires a commitment to encouraging a diverse mixture. This includes the art of working as part of a geographically scattered group in a distributed environment.

    从一个单一的社区开始并不妨碍项目进入孵化阶段。但对于这些项目来说,致力于创建一个多样化的开发人员组合是有益的。那些已经拥有混合社区的项目应该借此机会突出自己的工作。

    Starting with a homogenous community does not prevent a project from entering incubation. But for those projects, a commitment to creating a diverse mix of developers is useful. Those projects who already have a mix should take this chance to highlight what they do.

    示例 Example (Beehive):

    目前的提交者名单包括来自几家不同公司的开发人员和许多独立志愿者。提交者分布在美国、欧洲和亚洲。他们在分布式环境中工作经验丰富。

    The current list of committers includes developers from several different companies plus many independent volunteers. The committers are geographically distributed across the U.S., Europe, and Asia. They are experienced with working in a distributed environment.

    示例 Example (River)

    由于 Jini 技术入门套件迄今为止主要由 Sun Microsystems 开发,因此该项目的绝大多数初始提交者都来自 Sun。多年来,Sun 收到了其他开发人员提供的错误修复和增强功能,并将其纳入代码。我们的计划是与这些其他开发人员合作,并在取得进展时将他们添加为提交者。最初的提交者还有三位(非 Sun 开发人员): Bill Venners、Dan Creswell 和 Mark Brouwer。Bill 是服务 UI API 工作的领导者,Dan 参与了许多基于 Jini 的开发,包括名为 Blitz http://www.dancres.org/blitz/ 的 JavaSpaces 服务的实现,而 Mark 则是许多基于 Jini 开发的资深人士,包括 Virgil http://www.virgil.nl 的商业工作以及开源 Cheiron http://www.cheiron.org 项目的领导者。

    Since the Jini Technology Starter Kit has been mainly developed to date by Sun Microsystems, the vast majority of initial committers to the project are from Sun. Over the years, Sun has received bug fixes and enhancements from other developers which have been incorporated into the code. Our plan is to work with these other developers and add them as committers as we progress. There are three other initial committers (non-Sun): Bill Venners, Dan Creswell, and Mark Brouwer. Bill is the lead of the Service UI API work, Dan has been involved with much Jini-based development, including an implementation of the JavaSpaces service called Blitz http://www.dancres.org/blitz/, and Mark is veteran of much Jini-based development, including commercial work at Virgil http://www.virgil.nl as well as leading the open source Cheiron http://www.cheiron.org project.

    示例 Example (Ivy):

    只有两名核心开发人员,至少他们不是同质化的!Xavier 和 Maarten 之所以认识,完全是因为他们对 Ivy 的共同兴趣。 +新孵化项目提案指导 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    18 +Sep 2023

    新孵化项目提案指导

    摘要 Abstract

    评注: 对项目的简短描述性概述。一段简短的文字,长度最好为一句话。摘要应适合在毕业时用于创建正式项目的董事会决议中重复使用,并作为新孵化项目网站和项目描述 (DOAP: Description of a Project)文件的第一段。

    Commentary: A short descriptive summary of the project. A short paragraph, ideally one sentence in length. The abstract should be suitable for reuse in the board resolution used to create the official project upon graduation, as the first paragraph on the podling web site and in the DOAP document.

    示例 Examples:

    Geronimo 将是一个符合 J2EE 规范的容器。

    Geronimo will be a J2EE compliant container.

    Heraldry 将围绕以用户为中心的新兴身份空间开发技术。

    Heraldry will develop technologies around the emerging user-centric identity space.

    Yoko 将成为 CORBA 服务器。

    Yoko will be a CORBA server.

    提案 Proposal

    评注: 较长的建议说明。应具有合理的陈述性。更多的论述性材料应放在理由部分(或后面的其他部分)。

    Commentary: A lengthier description of the proposal. Should be reasonably declarative. More discursive material should be included in the rationale (or other later sections).

    示例 Example:

    XAP 提供了一个基于 XML 的声明式框架,用于构建、部署和维护丰富的交互式 Ajax 网络应用程序。XAP 的一个基本原则是利用现有的 Ajax 应用程序…

    XAP is to provide an XML-based declarative framework for building, deploying and maintaining rich, interactive, Ajax-powered web applications. A basic principle of XAP is to leverage existing Ajax…

    背景介绍 Background

    评论: 为不熟悉问题范畴和项目历史的人提供背景资料。解释含义可能被误解的术语(例如,没有一个被广泛采用的定义)。这些内容应该能够被领域专家安全地忽略。这些内容最终可能会出现在新孵化项目的网站上。

    Commentary: Provides context for those unfamiliar with the problem space and the history of the project. Explain terms whose meanings may be misunderstood (for example, where there is not a single widely adopted definition). This content should be capable of being safely ignored by domain experts. It should probably find an eventual home on the Podling website.

    示例 Example(Heraldry):

    Higgins 项目是 Eclipse 正在积极开发的一个框架,它将使用户和企业能够跨多个系统集成身份、个人资料和关系信息。通过使用上下文提供者,现有的和新的系统,如目录、协作空间等,都可以使用 Higgins 项目。

    To provide some background, the Higgins Project is being actively developed within Eclipse and is a framework that will enable users and enterprises to integrate identity, profile, and relationship information across multiple systems. Using context providers, existing and new systems such as directories, collaboration spaces

    合理性(提案理由)Rationale

    评论:解释为什么这个项目需要存在,为什么它应该被 ASF 采用。这里适合讨论性材料。

    Commentary: Explains why this project needs to exist and why should it be adopted by Apache. This is the right place for discursive material.

    示例 Example (Beehive):

    在构建 J2EE 应用程序时,我们亟需一个连贯、易用的编程模型。刚刚接触 Java 的开发人员不得不学习大量的 API 来构建简单的应用程序;高级 J2EE 开发人员不得不编写乏味的系统架构描述代码;由于底层的复杂性,工具作者在简化体验方面受到限制。

    There is a strong need for a cohesive, easy-to-use programming model for building J2EE applications. Developers new to Java are forced to learn a myriad of APIs just to build simple applications; advanced J2EE developers are forced to write tedious plumbing code; and tools authors are limited in what they can do to simplify the experience due to the underlying complexity.

    初始的目标 Initial Goals

    评注: 复杂的建议(例如,涉及多个现有代码库)可能会让人担心其实用性。解决这些问题的一个好办法是制定一个计划,证明该建议是可行的,并且经过了深思熟虑。

    Commentary: A complex proposal (involving multiple existing code bases, for example) may cause concerns about its practicality. A good way to address these concerns is to create a plan that demonstrates the proposal is feasible and has been carefully thought through.

    许多项目不需要本节。

    Many projects will not need this section.

    示例 Example(Heraldry):

    将 Yadis 和 OpenID 库扩展到现有 Python、Ruby、Perl 和 PHP 库之外的其他语言,以修订 OpenID 身份验证规范,解决已知的安全问题,研究与 DIX IETF 提案的兼容性,描述 Yadis 集成,并允许使用 URL 或 XRI 作为最终用户标识符

    Expansion of Yadis and OpenID libraries into additional languages beyond the existing Python, Ruby, Perl, and PHP libraries’ OpenID authentication specification revision to fix known security considerations, investigate compatibility with the DIX IETF proposal, describe Yadis integration, and allow either an URL or XRI be used as the End User’s Identifier

    目前状态 Current Status

    评注: 本部分(以及包含的主题)描述了候选项目的现状和开发实践。这应该是一个诚实的评估,并将其与 Apache 的原则和开发理想相平衡。

    Commentary: This section (and the contained topics) describes the candidate’s current status and development practices. This should be an honest assessment balancing these against Apache’s principles and development ideals.

    对于某些提案来说,这是一个展示对毕业前需要解决的问题的理解的机会。而对于其他提案,这则是一个强调与已有 Apache 之道密切匹配的机会。没有初始代码库的提案应简单说明这一点。

    For some proposals, this is a chance to demonstrate an understanding of the issues that will need to addressed before graduation. For others, this is a chance to highlight the close match with Apache Way that already exists. Proposals without an initial code base should just simply state that.

    有些提案将这一部分命名为准则(虽然这个词有点误导)。

    Some proposals name this section criteria (though the term is a little misleading).

    任人唯贤 Meritocracy:

    评注: ASF 是一个任人唯贤的地方。

    Commentary: Apache is a meritocracy.

    一旦开发人员提交了足够多的优秀补丁,他们就会很自然地当选为提交者。活跃的提交者被选入项目管理委员会(PMC)也是理所当然的。

    Once a developer has submitted enough good patches, then it should be natural that they are elected to committer. It should be natural that active committers are elected to the project management committee (PMC).

    这一更新过程对于 Apache 项目的长期健康发展至关重要。这份提案正是证明提案者理解这一过程的合适场所。

    This process of renewal is vital to the long term health of Apache projects. This is the right place to demonstrate that this process is understood by the proposers.

    示例 Example (OFBiz):

    OFBiz 最初由 David E. Jones 和 Andy Zeneski 于 2001 年 5 月创建。该项目现在拥有来自世界各地的提交者和用户。项目中较新的提交者是在随后几年加入的,他们最初提交补丁,然后拥有部分应用程序的提交权限,再后来拥有更多应用程序的提交权限。

    OFBiz was originally created by David E. Jones and Andy Zeneski in May 2001. The project now has committers and users from around the world. The newer committers of the project joined in subsequent years by initially submitting patches, then having commit privileges for some of the applications, and then privileges over a larger range of applications.

    示例 Example(Beehive):

    我们计划尽一切可能营造一个支持任人唯贤的环境。XMLBeans 的提交者们学到的经验之一是,优秀的社区不只是从良好的愿望中发展出来的;它们需要积极地向社区寻求帮助,列出/说明需要完成的工作,并跟踪和鼓励做出贡献的社区成员…

    We plan to do everything possible to encourage an environment that supports a meritocracy. One of the lessons that the XMLBeans committers have learned is that meritocracies don’t just evolve from good intentions; they require actively asking the community for help, listing/specifying the work that needs to be done, and keeping track of and encouraging members of the community who make any contributions…

    社区 Community

    评注: 阿帕奇只对社区感兴趣。

    Commentary: Apache is interested only in communities.

    候选项目应从一个社区开始,并有可能通过吸引新用户和开发者来发展和更新这个社区。请说明您的提案如何符合这一愿景。

    Candidates should start with a community and have the potential to grow and renew this community by attracting new users and developers. Explain how the proposal fits this vision.

    示例 Example(Beehive):

    过去两年中,BEA 一直在围绕该框架的前身建立一个社区。目前有一个活跃的新闻组,可以帮助我们在 Apache 建立一个新的社区。

    BEA has been building a community around predecessors to this framework for the last two years. There is currently an active newsgroup that should help us build a new community at Apache.

    示例 Example(WebWork2):

    WebWork 2 社区拥有活跃的邮件列表和论坛,追随者众多。

    The WebWork 2 community has a strong following with active mailing lists and forums.

    示例 Example(WADI):

    开源中对全服务集群和缓存组件的需求是巨大的,因为它可以应用于许多领域,从而为一个巨大的社区提供了潜力。

    The need for a full service clustering and caching component in the open source is tremendous as its use can be applied in many areas, thus providing the potential for an incredibly large community.

    核心开发者 Core Developers

    ASF 是由个人组成的。

    Apache is composed of individuals.

    对初始提交者列表中的开发人员进行简要介绍是非常有用的。最好在这里进行(而不是在初始提交至列表部分才介绍)。本节可用于讨论核心开发团队的多样性。

    It is useful to provide a brief introduction to the developers on the initial committers list. This is best done here (and not in that section). This section may be used to discuss the diversity of the core development team.

    示例 Example(ServiceMix)

    核心开发人员是一个多元化的开发团队,其中许多人已经是经验丰富的开源开发人员。他们中至少有一名 Apache 成员,还有其他一些现有的 Apache 提交者(Committer),以及来自不同公司的人员。http://servicemix.org/Team。

    The core developers are a diverse group of developers, many of which are already very experienced open source developers. There is at least one Apache Member together with a number of other existing Apache Committers along with folks from various companies. http://servicemix.org/Team

    示例 Example(WADI)

    WADI 由 Jules Gosnell 于 2004 年创立,目前拥有来自 Geronimo、Castor、OpenEJB、Mojo、Jetty、ActiveCluster、ActiveMQ 和 ServiceMix 的强大开发人员基础。

    WADI was founded by Jules Gosnell in 2004, it now has a strong base of developers from Geronimo, Castor, OpenEJB, Mojo, Jetty, ActiveCluster, ActiveMQ, and ServiceMix.

    相关性 Alignment

    说明为什么您的提案和 Apache 非常匹配。强调您的提案与 Apache 项目和开发理念的联系。

    Describe why Apache is a good match for the proposal. An opportunity to highlight links with Apache projects and development philosophy.

    示例 Example (Beehive):

    初始代码库的目标是在 Tomcat 中运行,但我们的目标是让该框架在任何兼容的 Servlet 或 J2EE 容器上运行。基于 JSR-181 的 Web 服务组件将利用 Axis。NetUI 组件基于 Struts。底层控制组件框架使用 Velocity。我们还需要开发其他项目,如 Portals 和 Maven 项目。

    The initial code base is targeted to run within Tomcat, but the goal is to allow the framework to run on any compliant Servlet or J2EE container. The Web services component, based on JSR-181, will leverage Axis. The NetUI component builds on top of Struts. The underlying Controls component framework uses Velocity. There are other projects that we will need to work on, such as the Portals and Maven projects.

    已知风险 Known Risks

    自我认识的练习。风险并不意味着项目不可接受。如果认识到并注意到这些风险,就可以在孵化期间加以解决。

    An exercise in self-knowledge. Risks don’t mean that a project is unacceptable. If they are recognized and noted, then they can be addressed during incubation.

    项目名称 Project Name

    说明已采取哪些措施检查项目名称是否合适,以及项目是否获得继续使用其现有名称的法律许可。还请说明广泛使用该名称是否会在将来造成项目所有权人的混淆或品牌问题。

    Describe what has been done to check that the name of the project is suitable and if the project has legal permission to continuing using its current name. Also indicate if the wide use of the name is likely to cause confusion about who owns the project or branding issues in the future.

    被遗弃的产品 Orphaned Products

    对未来发展做出公开承诺。

    A public commitment to future development.

    招募多样化的开发社区和强大的用户群需要时间。ASF 需要确信提议者是有决心的。

    Recruiting a diverse development community and a strong user base takes time. Apache needs to be confident that the proposers are committed.

    示例 Example (Yoko):

    贡献者都是这一领域的领先者。不存在出现孤儿代码或废弃代码的任何常见警告信号的风险。

    The contributors are leading vendors in this space. There is no risk of any of the usual warning signs of orphaned or abandoned code.

    示例 Example (Ivy):

    由于提交者人数较少,因此项目存在成为 “孤儿 “的风险。代码库的主要知识仍由 Xavier Hanin 掌握。即使 Xavier 没有离开 Ivy 开发团队的打算,我们也意识到了这个问题,并且知道需要努力减少项目对个人的依赖。

    Due to its small number of committers, there is a risk of being orphaned. The main knowledge of the codebase is still mainly owned by Xavier Hanin. Even if Xavier has no plan to leave Ivy development, this is a problem we are aware of and know that need to be worked on so that the project become less dependent on an individual.

    示例 Example (Tika):

    有许多处于不同成熟阶段的项目都实现了 Tika 中建议功能的一部分。对于许多潜在用户来说,现有的工具已经足够,这就减少了对更通用工具包的需求。这一点也可以从过去一年中该提案的缓慢进展中看出。不过,一旦项目启动,我们就可以根据下面提到的种子代码,迅速达到现有工具的功能水平。在此之后,我们相信,基于通用工具包优于定制工具包的优势,开发者和用户社区将迅速发展壮大。

    There are a number of projects at various stages of maturity that implement a subset of the proposed features in Tika. For many potential users the existing tools are already enough, which reduces the demand for a more generic toolkit. This can also be seen in the slow progress of this proposal over the past year. However, once the project gets started we can quickly reach the feature level of existing tools based on seed code from sources mentioned below. After that we believe to be able to quickly grow the developer and user communities based on the benefits of a generic toolkit over custom alternatives.

    缺乏开源经验 Inexperience with Open Source

    如果提案是基于现有的开源项目,并具备开放开发的历史,则应在此处重点说明。

    If the proposal is based on an existing open source project with a history of open development, then highlight this here.

    如果初始提交者名单中包含具有深厚开源背景的开发人员,则应在此处强调这一点。

    If the list of initial committers contains developers with strong open source backgrounds, then highlight this here.

    缺乏开源经验是封闭项目选择申请孵化的原因之一。多年来,Apache 在这方面积累了丰富的经验。成功开放一个封闭项目意味着所有参与者都要投入精力。这需要学习和回馈社区的意愿。如果提案是围绕一个封闭项目提出的,并且对开源领域知之甚少,那么请承认这一点,并表现出学习的意愿。

    Inexperience with open source is one reason why closed projects choose to apply for incubation. Apache has developed over the years a store of experience in this area. Successfully opening up a closed project means an investment of energy by all involved. It requires a willingness to learn and to give back to the community. If the proposal is based around a closed project and comes with very little understanding of the open source space, then acknowledge this and demonstrate a willingness to learn.

    示例 Example (Cayenne):

    Cayenne 于 2001 年作为开源项目启动,至今已有 5 年时间。

    Cayenne started as an open source project in 2001 and has remained so for 5 years.

    示例 Example (Beehive):

    许多提交者都有开源项目的工作经验。其中五人有在其他 Apache 项目中担任提交者的经验。

    Many of the committers have experience working on open source projects. Five of them have experience as committers on other Apache projects.

    示例 Example (Ivy):

    虽然 Ivy 是在开源许可证下发布的,但最初对它的访问是有限的,公众无法访问问题跟踪系统或 SVN 资源库。虽然后来情况有所改变 - SVN 仓库可以公开访问,JIRA 实例自 2005 年 6 月起就已建立,许多新功能都是先在论坛或 JIRA 上讨论的 - 但真正开源开发模式的经验目前还很有限。不过,Maarten 在真正的开放源代码开发流程方面已经有了很好的经验,他将把自己的经验带到项目中来。

    While distributed under an open source license, access to Ivy was initially limited with no public access to the issue tracking system or svn repository. While things have changed since then - the svn repository is publicly accessible, a JIRA instance has been setup since june 2005, many new features are first discussed on the forum or JIRA - experience with a true open source development model is currently limited. However, Maarten already has good experience with true open development process, and brings his experience to the project.

    示例 Example (River):

    最初的提交者在开源项目方面拥有不同程度的经验。他们都参与过以开源许可证发布的源代码,但使用开源开发流程开发代码的经验有限。不过,我们预计在正常的任人唯贤规则下执行不会有任何困难。

    The initial committers have varying degrees of experience with open source projects. All have been involved with source code that has been released under an open source license, but there is limited experience developing code with an open source development process. We do not, however, expect any difficulty in executing under normal meritocracy rules.

    孵化期 Length of Incubation

    说明:本节说明了项目在升级为顶级项目之前预计需要多长时间的孵化,以及孵化的原因。

    Commentary: This section describes how long the project is expected to be in incubation before it’s graduation as a top level project and the reasons for that.

    这表明项目已经考虑了毕业所需的步骤,没有任何不切实际的期望。

    This shows the project has thought about the steps required to graduate and that there are not any unrealistic expectations.

    同质化的开发人员 Homogenous Developers:

    健康的项目需要开发商的组合。开放式开发需要致力于鼓励多样化的混合。这包括在分布式环境中作为地理位置分散的小组的一部分开展工作的艺术。

    Healthy projects need a mix of developers. Open development requires a commitment to encouraging a diverse mixture. This includes the art of working as part of a geographically scattered group in a distributed environment.

    从一个单一的社区开始并不妨碍项目进入孵化阶段。但对于这些项目来说,致力于创建一个多样化的开发人员组合是有益的。那些已经拥有混合社区的项目应该借此机会突出自己的工作。

    Starting with a homogenous community does not prevent a project from entering incubation. But for those projects, a commitment to creating a diverse mix of developers is useful. Those projects who already have a mix should take this chance to highlight what they do.

    示例 Example (Beehive):

    目前的提交者名单包括来自几家不同公司的开发人员和许多独立志愿者。提交者分布在美国、欧洲和亚洲。他们在分布式环境中工作经验丰富。

    The current list of committers includes developers from several different companies plus many independent volunteers. The committers are geographically distributed across the U.S., Europe, and Asia. They are experienced with working in a distributed environment.

    示例 Example (River)

    由于 Jini 技术入门套件迄今为止主要由 Sun Microsystems 开发,因此该项目的绝大多数初始提交者都来自 Sun。多年来,Sun 收到了其他开发人员提供的错误修复和增强功能,并将其纳入代码。我们的计划是与这些其他开发人员合作,并在取得进展时将他们添加为提交者。最初的提交者还有三位(非 Sun 开发人员): Bill Venners、Dan Creswell 和 Mark Brouwer。Bill 是服务 UI API 工作的领导者,Dan 参与了许多基于 Jini 的开发,包括名为 Blitz http://www.dancres.org/blitz/ 的 JavaSpaces 服务的实现,而 Mark 则是许多基于 Jini 开发的资深人士,包括 Virgil http://www.virgil.nl 的商业工作以及开源 Cheiron http://www.cheiron.org 项目的领导者。

    Since the Jini Technology Starter Kit has been mainly developed to date by Sun Microsystems, the vast majority of initial committers to the project are from Sun. Over the years, Sun has received bug fixes and enhancements from other developers which have been incorporated into the code. Our plan is to work with these other developers and add them as committers as we progress. There are three other initial committers (non-Sun): Bill Venners, Dan Creswell, and Mark Brouwer. Bill is the lead of the Service UI API work, Dan has been involved with much Jini-based development, including an implementation of the JavaSpaces service called Blitz http://www.dancres.org/blitz/, and Mark is veteran of much Jini-based development, including commercial work at Virgil http://www.virgil.nl as well as leading the open source Cheiron http://www.cheiron.org project.

    示例 Example (Ivy):

    只有两名核心开发人员,至少他们不是同质化的!Xavier 和 Maarten 之所以认识,完全是因为他们对 Ivy 的共同兴趣。 With only two core developers, at least they are not homogenous! Xavier and Maarten knew each other only due to their common interest in Ivy.

    对受雇开发人员的依赖 Reliance on Salaried Developers

    一个由受雇开发人员主导的项目,如果他们只对自己受雇的代码感兴趣,那么这个项目的长期健康发展就会受到威胁。

    A project dominated by salaried developers who are interested in the code only whilst they are employed to do so risks its long term health.

    Apache 以人为本,而不是以公司为本。我们希望,无论开发人员目前的雇主是谁,他们都能继续参与 Apache 的工作。

    Apache is about people, not corporations. We hope that developers continue to be involved with Apache no matter who their current employer happens to be.

    这正是表明受雇开发人员和志愿者之间初步平衡的好时机。此外,还可以谈谈开发人员的投入程度。

    This is the right place to indicate the initial balance between salaried developers and volunteers. It’s also good to talk about the level of commitment of the developers.

    示例 Example (OpenJPA):

    大多数开发人员都是由他们的雇主支付工资来为这个项目做出贡献的,但是考虑到 Java 社区对 JPA 实现的期待以及提交者对代码的主人翁意识,如果没有受雇开发人员为这个项目做出贡献,这个项目的继续也不会有问题。

    Most of the developers are paid by their employer to contribute to this project, but given the anticipation from the Java community for the a JPA implementation and the committers’ sense of ownership for the code, the project would continue without issue if no salaried developers contributed to the project.

    示例Example (River):

    预计 Jini 的开发工作将利用受雇时间和下班后的志愿者时间进行。虽然依赖于受薪开发人员(目前来自 Sun,但预计其他公司的受薪开发人员也会参与进来),但 Jini 社区非常活跃,事情应该很快就会平衡。与此同时,Sun 将在未来支持该项目,为 Jini 提供 “工作时间”,以便顺利过渡。

    It is expected that Jini development will occur on both salaried time and on volunteer time, after hours. While there is reliance on salaried developers (currently from Sun, but it’s expected that other company’s salaried developers will also be involved), the Jini Community is very active and things should balance out fairly quickly. In the meantime, Sun will support the project in the future by dedicating ‘work time’ to Jini, so that there is a smooth transition.

    示例 Example (Wicket):

    虽然有两位开发者 - Martijn和Eelco - 在业余时间编写了Wicket In Action(出版商Manning),但他们都不依赖Wicket做咨询工作。大多数开发者都在日常工作中使用Wicket,有些人还在多个项目中使用,而且随着他们的公司(特别是Topicus、Cemron和Teachscape)选择Wicket作为开发框架,他们还将在相当长的一段时间内使用Wicket。

    None of the developers rely on Wicket for consulting work, though two - Martijn and Eelco - are writing Wicket In Action (publisher Manning) in their spare time. Most of the developers use Wicket for their day jobs, some for multiple projects, and will do so for a considerable while as their companies (specifically Topicus, Cemron and Teachscape) choose Wicket as their development framework of choice.

    与其他 Apache 产品的关系 Relationships with Other Apache Products

    Apache 项目应愿意与 Apache 内部和外部的其他开源项目合作。候选项目应愿意走出自己的小圈子。

    Apache projects should be open to collaboration with other open source projects both within Apache and without. Candidates should be willing to reach outside their own little bubbles.

    您的提案是一个讨论现有联系的机会。这也是讨论未来潜在联系和计划的合适场所。

    This is an opportunity to talk about existing links. It is also the right place to talk about potential future links and plans.

    Apache 允许不同的项目有相互竞争或重叠的目标。不过,这应该意味着代码库之间的友好竞争和社区之间的真诚合作。

    Apache allows different projects to have competing or overlapping goals. However, this should mean friendly competition between codebases and cordial cooperation between communities.

    候选项目是现有项目的直接竞争者,还是间接竞争者(问题领域相同,生态利基不同),抑或只是有一些重叠的同行,并不总是很明显。在间接竞争的情况下,摘要必须准确描述生态利基。直接竞争者很有可能会被要求总结与现有项目在结构上的异同。

    It is not always obvious whether a candidate is a direct competitor to an existing project, an indirect competitor (same problem space, different ecological niche) or are just peers with some overlap. In the case of indirect competition, it is important that the abstract describes the niche accurately. Direct competitors should expect to be asked to summarize architectural differences and similarities to existing projects.

    示例 Example (OpenJPA):

    Geronimo 可能会使用 Open JPA,它需要一些 Apache 产品(regexp、commons collections、commons lang、commons pool),并支持 Apache commons 日志。

    Open JPA will likely be used by Geronimo, requires some Apache products (regexp, commons collections, commons lang, commons pool), and supports Apache commons logging.

    示例 Example (River):

    目前,与 Apache 项目的唯一联系是入门套件使用 Ant 构建工具。未来可能会有一些联系(http 服务器、数据库后台等),我们将对此进行探索。

    Currently, the only tie to Apache projects is the starter kit’s use of the Ant build tool. There are potential future ties (http server, database backend, etc) that will be explored.

    对 Apache 品牌的过度迷恋 An Excessive Fascination with the Apache Brand

    过去曾有人担心,有些项目的提出似乎只是为了给提案者带来正面的宣传效果。本节正是让大家相信事实并非如此的好地方。

    Concerns have been raised in the past that some projects appear to have been proposed just to generate positive publicity for the proposers. This is the right place to convince everyone that is not the case.

    本节也是在过去曾施行过不端行为之后(例如,如果任何与提案有关的人在过去以与事实不符的方式将自己与 ASF 品牌联系在一起),重新与社区建立联系,并承诺未来良好行为的合适处所。

    This is also the right place to build bridges with the community after past misdemeanors (for example, if any of those associated with the proposal have - in the past - sort to associate themselves with the Apache brand in factually incorrect ways) and promise good conduct for the future.

    示例(CeltiXfire)Example (CeltiXfire):

    虽然我们希望 Apache 品牌有助于吸引更多的贡献者,但我们对启动本项目的兴趣是基于前述 “合理性(提案理由)” 部分中提到的因素。不过,我们也会对无意中滥用 Apache 品牌的行为保持警惕,并将与孵化器项目管理委员会和项目管理委员会合作,确保品牌政策得到尊重。

    While we expect the Apache brand may help attract more contributors, our interests in starting this project is based on the factors mentioned in the Rationale section. However, we will be sensitive to inadvertent abuse of the Apache brand and will work with the Incubator PMC and the PRC to ensure the brand policies are respected.

    示例 Example (Wicket):

    ASF 拥有强大的品牌,这个品牌本身就很有吸引力。不过,Wicket 的开发者已经在自己的道路上取得了相当大的成功,继续走下去完全没有问题。我们有兴趣加入 ASF,以增加我们在开源领域的人脉和知名度。此外,我们从一开始就是 Apache 的热心用户(还记得 JServ 吗?

    The ASF has a strong brand, and that brand is in itself attractive. However, the developers of Wicket have been quite successful on their own and could continue on that path with no problems at all. We are interested in joining the ASF in order to increase our contacts and visibility in the open source world. Furthermore, we have been enthusiastic users of Apache from the earliest hour (remember JServ anyone?), and feel honored at getting the opportunity to join the club.

    示例 Example (OpenJPA):

    我们认为,Open JPA 将受益于广泛的合作,能够建立一个开发者和提交者社区,其影响力将超过创始人,并将被其他 Apache 项目(如 Geronimo 项目)所接受。

    We think that Open JPA is something that will benefit from wide collaboration, being able to build a community of developers and committers that outlive the founders, and that will be embraced by other Apache efforts, such as the Geronimo project.

    文档 Documentation

    更多阅读材料参考。

    References to further reading material.

    示例 Examples (Heraldry):

    初始代码 Initial Source

    描述本提案之代码库的来源。如果初始代码的来源不止一个,则应在此概述不同的历史。

    Describes the origin of the proposed code base. If the initial code arrives from more than one source, this is the right place to outline the different histories.

    如果没有初始代码,请在此处注明。

    If there is no initial source, note that here.

    示例 Example (Heraldry):

    OpenID 自 2005 年夏季开始开发。它目前拥有一个活跃的社区(超过 1,500 万个启用账户)和多种语言的库。此外,它还得到了 LiveJournal.com 的支持,并继续在开源社区中获得关注。Yadis 自 2005 年底开始开发,其规范自 2006 年初以来一直未变。与 OpenID 一样,它也有各种语言的库,两个社区之间有很大的重叠。

    OpenID has been in development since the summer of 2005. It currently has an active community (over 15 million enabled accounts) and libraries in a variety of languages. Additionally, it is supported by LiveJournal.com and is continuing to gain traction in the Open Source Community. Yadis has been in development since late 2005, and the specification has not changed since early 2006. Like OpenID, it has libraries in various languages, and there is a large overlap between the two communities.

    代码和知识产权提交计划 Source and Intellectual Property Submission Plan

    复杂的提案(通常涉及多个代码库)可能需要在此为提交代码制定一个初步计划,并证明本提案切实可行。

    Complex proposals (typically involving multiple code bases) may find it useful to draw up an initial plan for the submission of the code here. Demonstrate that the proposal is practical.

    示例 Example (Heraldry):

    • OpenID 规范和 openid.net 上的内容来自 Six Apart 公司的 Brad Fitzpatrick 和 VeriSign 公司的 David Recordon。
    • The OpenID specification and content on openid.net from Brad Fitzpatrick of Six Apart, Ltd. and David Recordon of VeriSign, Inc.
    • 域名 openid.net 和 yadis.org 来自 Six Apart, Ltd. 的 Brad Fitzpatrick 和 NetMesh, Inc.
    • The domains openid.net and yadis.org from Brad Fitzpatrick of Six Apart, Ltd. and Johannes Ernst of NetMesh, Inc.
    • JanRain 公司提供了 Python、Ruby、Perl、PHP 和 C# OpenID 库。
    • OpenID libraries in Python, Ruby, Perl, PHP, and C# from JanRain, Inc.
    • 来自 NetMesh 和 VeriSign 公司的 Yadis 一致性测试套件
    • Yadis conformance test suite from NetMesh and VeriSign, Inc. 我们还将为各种开源软件征集更多插件和补丁。 We will also be soliciting contributions of further plugins and patches to various pieces of Open Source software.

    外部依赖 External Dependencies

    初始源的外部依赖性很重要。根据 Apache 政策,只有部分外部依赖是允许的。对于孵化中的项目,这些限制最初(在一定程度上)会比较宽松。

    External dependencies for the initial source is important. Only some external dependencies are allowed by Apache policy. These restrictions are (to some extent) initially relaxed for projects under incubation.

    如果初始源存在依赖关系,导致无法毕业,则应在此处说明如何解决这些问题。

    If the initial source has dependencies which would prevent graduation, then this is the right place to indicate how these issues will be resolved.

    示例 Example (CeltiXfire):

    所有依赖项都有与 Apache 兼容的许可证。其中包括 BSD、CDDL、CPL、MPL 和 MIT 许可的依赖项。 @@ -9,6 +9,4 @@ Patrick Linskey (plinskey at bea dot com) … Geir Magnusson Jr (geirm at apache dot org)

    • Craig Russell (clr at apache dot org) *

    保荐者 Sponsors

    这是一个有点争议的话题。Apache 的提交者都是个人,他们以自己的名义在这里工作。评判他们的标准是他们的优点,而不是他们的从属关系。不过,本着全面公开的精神,我们还是希望能在一开始就公开列出任何可能会影响最初提交者独立性的当前附属关系。

    A little bit of a controversial subject. Committers at Apache are individuals and work here on their own behalf. They are judged on their merits, not their affiliations. However, in the spirit of full disclosure, it is useful for any current affiliations which may affect the perceived independence of the initial committers to be listed openly at the start.

    例如,那些从事项目工作的受薪职位人员应列出其所属单位。有了这份名单,就可以判断初步名单的多样性程度,从而判断还有多少工作要做。

    For example, those in salaried positions whose job is to work on the project should list their affiliation. Having this list helps to judge how much diversity exists in the initial list and so how much work there is to do.

    这最好在提交者列表之外的单独部分进行。

    This is best done in a separate section away from the committers list.

    只有初始引导列表中的提交者的隶属关系是相关的。这些提交者并不是按照通常的任人唯贤的程序加入的。我们强烈建议,项目启动后,开发人员应根据其贡献而非背景来评判。引导完成后,不应再保留此列表。

    Only the affiliations of committers on the initial bootstrap list are relevant. These committers have not been added by the usual meritocratic process. It is strongly recommended that once a project is bootstrapped, developers are judged by their contributions and not by their background. This list should not be maintained after the bootstrap has been completed.

    引路者(倡导者)Champion:

    引路者是已经与 ASF 有联系的人,他领导提案过程。通常情况下(但并非必须),“引领者” 也会被提名为 “导师”。

    The Champion is a person already associated with Apache who leads the proposal process. It is common - but not necessary - for the Champion to also be proposed as a Mentor.

    应在提案制定过程中找到一位 “引路者(倡导者)"。他的作用是帮助制定提案,并与您一起解决孵化项目管理委员会(IPMC)在审查提案时提出的意见和问题。

    A Champion should be found while the proposal is still being formulated. Their role is to help formulate the proposal and work with you to resolve comments and questions put forth by the IPMC while reviewing the proposal.

    被提名的导师 Nominated Mentors:

    列出被提名为候选项目的导师[定义]的符合条件(且愿意)的个人的名单。

    Lists eligible (and willing) individuals nominated as Mentors [definition] for the candidate.

    三位导师提供了一个法定人数,并允许 Podling 从孵化器项目管理委员会获得更多自主权,因此目前的共识是三位导师是一个很好的数字。无论如何,任何有经验的 ASF 社区成员都可以提供非正式指导,重要的是确保 Podling 有足够的固定导师,以便顺利进行。对于 Podling 可以拥有的正式或非正式导师的数量没有限制。

    Three Mentors gives a quorum and allows a Podling more autonomy from the Incubator PMC, so the current consensus is that three Mentors is a good number. Any experienced Apache community member can provide informal mentorship anyway, what’s important is to make sure the podling has enough regularly available mentors to progress smoothly. There is no restriction on the number of mentors, formal or informal, that a Podling may have.

    保荐者的实体 Sponsoring Entity

    保荐者是 ASF 内负责此提案的组织单位。发起单位可以是 -The Sponsor is the organizational unit within Apache taking responsibility for this proposal. The sponsoring entity can be:

    • ASF 董事会 The Apache Board
    • 孵化器 The Incubator
    • 另一个 Apache 项目。相应项目的项目管理委员会将决定是否保荐/支持(通过投票)。除非与现有的 Apache 项目有紧密联系,否则建议提案请求孵化器赞助。
    • Another Apache project. The PMC for the appropriate project will decide whether to sponsor (by a vote). Unless there are strong links to an existing Apache project, it is recommended that the proposal asks that the Incubator for sponsorship.

    请注意,孵化项目最终在 ASF 组织结构中的去向将在孵化毕业时决定。

    Note that the final destination within the Apache organizational structure will be decided upon graduation.

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +The Sponsor is the organizational unit within Apache taking responsibility for this proposal. The sponsoring entity can be:

    • ASF 董事会 The Apache Board
    • 孵化器 The Incubator
    • 另一个 Apache 项目。相应项目的项目管理委员会将决定是否保荐/支持(通过投票)。除非与现有的 Apache 项目有紧密联系,否则建议提案请求孵化器赞助。
    • Another Apache project. The PMC for the appropriate project will decide whether to sponsor (by a vote). Unless there are strong links to an existing Apache project, it is recommended that the proposal asks that the Incubator for sponsorship.

    请注意,孵化项目最终在 ASF 组织结构中的去向将在孵化毕业时决定。

    Note that the final destination within the Apache organizational structure will be decided upon graduation.

    \ No newline at end of file diff --git a/post/apache-way/talk-to-apache-experts/index.html b/post/apache-way/talk-to-apache-experts/index.html index f4b22b16..134cee59 100644 --- a/post/apache-way/talk-to-apache-experts/index.html +++ b/post/apache-way/talk-to-apache-experts/index.html @@ -1,5 +1,3 @@ -Apache ServiceComb带您对话Apache大咖 · ALC Beijing

    Apache ServiceComb带您对话Apache大咖

    Apache ServiceComb带您对话Apache大咖

    前言:

    这是一篇两年半前的活动记录,应该最早的一批Apache项目Committer参加的Meetup,在这次会上跟大家分享了很多Apache项目孵化的相关的经验,以及开源软件商业的故事。特别值得说明的是在最近结束的ASF成员大会中,文中的有四位专家当选成为ASF董事会成员,这些经验今天看来对大家也是很有启发的。

    PMC沉睡了怎么办?首次发版项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决!有人给项目提交Patch,我们从来不说“No“!我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱……开源微服务项目ServiceComb带您对话Apache大咖,领略Apache专家风采。

    2018年10月13日下午,开源微服务项目ServiceComb的团队邀请Apache基金会三位专家成员:Apache孵化器主席Justin Mclean,Apache董事会董事Roman Shaposhnik, 以及Apache基金会秘书长兼形象大使Craig Rossell,与国内Apache项目开发者相聚于上海。针对开发者所关心的Apache精英管理模式、从孵化器毕业成为顶级项目以及开源软件的商业化等主题进行了深入的交流。本文对活动当日的交流进行了纪实和总结。

    (现场为英文分享,本文对其进行翻译整理和校正归纳)


    开场介绍

    [姜宁]今天咱们聚集了国内大部分的Apache相关项目的committer,这些项目包括Beam、ServiceComb、Dubbo、Gearpump、Griffin、Kerlin、Skywalking和Weex。这些Apache项目大部分都还在孵化器中孵化,同时还有一些准备进入Apache孵化的项目。

    我在2006年9月作为Apache CXF 项目 初始 committer与Apache软件基金会结缘,2011年1月正式成为 Apache基金会成员。我作为基金会项目导师(Mentor)参与了多个来自中国的Apache孵化器项目。2017年,我作为项目负责人推动ServiceComb进入Apache 孵化器进行孵化,现在 ServiceComb已经很快就要从Apache孵化器毕业了。

    虽然参与了许多Apache开源项目,坦白地说我对Apache的项目孵化流程并未有系统化全面的理解。直到ServiceComb这个项目,我经历了寻找Mentor,捐赠协议签署,迁移项目,孵化器发版,以及毕业准备这些流程之后,才对Apache孵化器孵化流程有了更加深刻的认识。

    就在刚刚的交流中,我发现大家最关心的问题就是如何从Apache孵化器毕业。 我们今天邀请到远道而来的Apache Member,Roman,Justin,Craig,和国内Apache项目开发者一起分享他们有关Apache孵化器孵化经验,以及开源相关的感悟。


    如何从Apache软件基金会孵化器毕业成为顶级项目

    [Justin]

    从Apache孵化器毕业,首要为孵化项目构建一个社区,项目毕业意味着很多事情,比如要保持开发者的多样性,项目贡献者不能仅仅来自一个公司。此外,还应该尝试小版本发布(make micro releases)。

    [Roman]

    发布版本时,除了项目本身,还有许多合规性工作(mechanical stuff)要做,例如开源协议,发版签名,发版投票等等。项目进入孵化器后,要尽快尝试发布第一个版本。许多孵化项目(podling)都想在发布版本时中搞定这样或那样的功能,我总是跟他们说,没关系,项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决,然后再专注于功能开发。

    [Justin]

    没错,要尽早发版、多做发版。

    [姜宁]

    发布版本尽管痛苦,但是要尽早去做。ServiceComb在发布第一个版本时,团队也非常痛苦,但是经历过这个阶段,后面会变得越来越顺利。

    总结:孵化器毕业要点解读

    • 构建社区

    ASF一直坚信好的软件是由强大的社区构建出来的。诚然,代码是一个软件社区的重中之重,但Apache之道**”Community over code”**同样强调社区的重要性。它意味着我们的行事方式,如何看待彼此,如何进行决策,甚至如何编写代码。健康、互相尊重的社区非常重要,这不仅让社区的开发者有被尊重的感觉,也会带来切实的好处。一个健康、多样、包容的社区,可以促进项目不断成长,可持续发展。甚至,有助于用开源技术提供服务的公司获得商业上的成功。

    • 保持贡献者多样性

    ASF非常强调多样性原则。 大部分开源软件项目都是创新型项目,多样性保证了开源项目的持续创新, 也保证了社区的健康发展。 开源项目鼓励所有个体或公司参与, 让他们感觉能对项目有所掌控,或者会对项目产生一定影响。这样可以保证意见的多样性、用户的多样性、系统的的多样性。Apache项目通常是要求有三个以上不同公司的人参与开发,以保证项目不会因为其中某个公司的退出而终止。

    • ** 尽早、尽量多的进行版本发布**

    对于构建持续增长的社区,有何建议?

    [郑士汉,Weex]:社区建设、多样性对于毕业非常重要,您能给出一些相关建议吗?

    [Justin]

    要让大家觉得自己是受欢迎的。当有人在邮件列表中提问时,我通常会分配PMC成员关注问题,并咨询提问者是否还需要其他帮助,或者有其他问题,我把这个作为日常工作。这样也有利于开发者从用户变成提交者甚至PMC成员。良好的文档可以让大家更容易使用你的项目。而文档的缺失则可能造成用户的流失,人们编译编译代码,就再也不使用这个项目了,因为项目上手太难了。

    [Roman]

    良好的文档确实非常重要。此外,我也有其他方面的建议。Apache软件基金会参与了一些项目,吸引了不少开贡献者。我们一直指导Google代码夏令营活动,夏令营由Google赞助,帮开发者更好的发展他们自己的项目。如果你可以让自己的社区参加类似的活动,对于社区建设无疑是有很大帮助的。因为大家来自中国的社区,我也建议一些中国的大公司,例如华为,也可以举办类似的学生项目,学生是一个项目最好的新鲜血液。

    [Justin]

    在会议中分享项目、建立技术博客也是不错的方式。

    [吴晟,Skywalking]

    Skywalking是中国开发者发起的一个Apache孵化项目,刚加入孵化时只有15个committer,而现在,代码层面的提交者已经达到了70人。我们提倡大家提交小的改动,这样很容易提交代码来做贡献,所以我们每次发布版本都会吸引一些开发者。当我们没有太多精力投入到测试时,我们会吸引开发者来提供测试,他们可以提交集成测试结果,可以提交测试模型,只要保持正确的编程风格,PMC的成员就可以进行审查,并合并代码

    [Justin]

    这里我想多提一点,很多项目过于注重质量。有些Apache项目收到一些代码不太完美的提交,就直接丢弃了这些提交,然后自己从头搞起。其实这并没有关系,如果你收到了不太完美的PR,可以请社区成员帮忙改进质量。另外,在JIRA或Github上浏览issue时,如果发现一些比较简单的issue,你可以加个”easy to fix”标签,告诉大家这个issue比较容易解决,这样也可以吸引人来贡献。

    [吴晟]

    没错,我们也会跟踪一些讨论,有些时候我们可能会考虑过于理想的方案。但是好的项目有时候并不完全是完美的代码决定的,还要考虑不同的场景。这样项目才能不断壮大。

    [姜宁]

    我也谈谈自己的感受,我非常赞同Justin所说的“Low the bar”。我在参与Apache Camel项目开发时,它已经非常成熟了,但是我们还采用先提交后Review的方式进开发。 有很多人为Camel提交Patch,我们从来不说“No”。有些人提交的代码质量可能并不太好,我们还是会接受这些补丁,让贡献者觉得自己得到认可。这样,开发者就不会想“啊,我还不够优秀,还无法成为committer,我提交的补丁也不够好,那我还是不提交补丁了。” 在我们合入代码时候,也会顺道帮助修复一下补丁上面的问题。 顺便说一句,Apache Camel现在有200多个组件,目前项目只有大概4,5个人在维护,很大程度上是得益与这种降低社区门槛的方式。

    总结:构建社区的建议

    • 让大家觉得自己是受欢迎的。
    • 编写良好的文档,降低初学者入门难度。
    • 参与或组织类似Google代码夏令营的学生项目。
    • 在技术会议中分享项目经验,建立技术博客传播技术。
    • 提倡小的改动,乐于接受他人的贡献,乐于帮助改进质量,让开发者更容易参与社区贡献。

    项目的提交者和PMC成员不够活跃,我应该怎么办?

    [史少锋,Kerlin]:有些开发者成为提交者后就消失了,有时候PMC成员也不能非常及时的审查提交,有没有什么规则推动大家活跃起来?

    [Justin]

    我觉得提交者或者PMC成员不活跃并不是问题,不是所有人都必须活跃。但是如果项目的导师不活跃就是问题了,因为导师要指导项目,告诉项目成员正确的做事方法。我们没办法为提交者和PMC成员制定“(及时反馈的)规则”,这样对他们要求太高了。我们应该降低门槛,让更多人参与进来

    [Roman]

    通常,每个项目的PMC都有VP(Vice President),VP主要负责合规性相关的工作,向Apache董事会汇报,但是VP也要担当起项目的领导者角色。即便所有其他PMC成员都在沉睡,VP也是唯一要保持清醒的人。VP是默认的那个要回答问题的人,当然不是技术相关的问题,而是回答管理流程相关的问题。如果邮件列表无人响应,你要写信给VP,告诉他,“嘿,大家似乎都睡着了,我们应该怎么办呢?”。VP有权利做出改变,他可以组织大家开始审查提交,让大家醒过来。

    总结:PMC沉睡了怎么办

    • Apache基金会是个公益组织,不能通过强制要求来约束成员。
    • 可以通过降低门槛,让更多人可以参与进来,解决社区响应不及时的问题。
    • VP承担项目领导责任,要时刻保持活跃。遇到问题可以向VP寻求帮助

    在Apache软件基金会的组织结构中,Apache董事会根据基金会的管理原则,负责管理和监督对外合作的商业和事务,包括基金、知识资产、注册商标等。每个Apache项目都有一个PMC(项目管理委员会),负责项目的管理和监督,并定期向Apache董事会汇报项目情况。PMC有一位主席(Chairperson),也被称为该项目的Vice President,简称VP。VP由董事会指定,是董事会和项目之间的接口人,负责项目汇报、同时与PMC一同保证项目和代码遵从法规、管理商标事务、管理邮件列表等合规性问题,发展新的Committer和PMC成员。

    发版投票过程漫长,如何保持正确的发版“姿势”?

    [张天伦,Gearpump]:发版投票需要经过至少72+72个小时,过程非常漫长,又担心犯错误导致投票过少进而导致发版失败。并且,有时候发起投票,响应的人比较少。

    [Justin]

    犯一次错误没关系,可以向导师寻求帮助以避免重复多次犯错误。在开始的一两次发版中,有一些错误很正常,但是后续的版本发布就会越来越顺利。如果发版时响应人数比较少,可以直接在邮件列表中提醒孵化器项目管理委员会(IPMC)成员,特别是导师,进行投票。

    [Roman]

    我想大家对敏捷开发都比较熟悉,敏捷开发提倡小幅度的改动,多进行更新。如果你的项目遵循敏捷开发方式,将对版本发布大有裨益。我指导项目孵化时,除了首次发版需要在合规性方面花费很多时间,后面的版本尽量在每个月或每两个月发布一次,新版本不一定要加入很多功能,每月发一次版本,更容易让IPMC的成员审查新版本的变动。因此,首次发版,解决合规性问题,然后尽快发版,多做发版

    [Justin]

    另外,可以将新版本改动写入版本说明中,可以让审查工作变得轻松很多。

    [Roman]

    没错,小幅度迭代也可以帮你构建社区。社区贡献者提交的补丁越小,越容易进行审查。

    总结:在Apache孵化器发布版本的要点

    • 不要担心在发版时犯错误,大胆的向导师和IPMC成员寻求帮助,但要避免犯重复的错误
    • 借鉴敏捷开发模式,小版本迭代,频繁更新
    • 首次发版扫除一切合规性问题,后续版本专注功能和质量
    • 让版本更新更容易审查

    如何使用开源软件进行商业化?

    [Roman]

    开源商业化的模式是多种多样的。红帽(RedHat)就是一个很成功的例子,他们用开源收益颇丰。也有一些新的公司,例如我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱(众人笑)。

    我大致可以列出3种开源商业化的模式。首先,几乎所有云服务厂商都使用开源产品,将其变成服务来进行营利,这就是一个很常见的商业化模式。例如,我很惊喜地看到华为云的流服务使用了Apache Flink,这就是华为使用开源盈利的方式。

    另外一种比较传统但应用广泛的商模式,以开源软件为核心构建产品,并提供额外的组件和技术。这些额外的部分不一定是开源的。例如你的产品可以用Apache项目作为核心,然后加入GPL协议的组件,再加上一些私有的组件,然后就可以像微软出售Windows系统,或者Adobe出售Adobe Creative Suite那样盈利了。

    第三种商业化模式,就是基于开源软件提供差异化的集成服务或者解决方案。将开源软件集成为一个更大的系统,提供给客户以进行营利。你可以运营一个专业的服务公司,用开源软件帮助用户简化业务。例如,你的公司服务于酒店或工厂,帮他们实现自动化运维。客户并不在乎你用什么软件或技术,他们只关心端到端的方案能够顺利实施。你的公司使用开源软件,可以按照自己的需求进行优化,也避免了收费的商业软件侵占你的利润。

    [Craig]

    在培训行业,经常有公司需要培训自己的员工来学习、使用Apache软件。我们曾短暂的考虑过和商业公司合作提供培训服务,然后与商业公司分享利润。但是这个念头只是一闪而过就被我们否决了,这样会与提供Apache软件培训服务的人形成竞争,这样有悖于Apache厂商中立的原则。所以,如果你想通过开源软件培训来盈利,大胆去做,这也是一个不错的开源商业化模式

    总结:开源商业化的几种方式

    • 用开源软件提供服务,例如那些云服务厂商
    • 基于开源软件提供额外的收费功能
    • 利用开源软件提供集成服务,并提供商业支持
    • 开展开源软件的培训服务

    活动尾声

    经过一番深入的沟通和交流,现场的开发者对Apache基金会、基金会的精英管理模式、Apache孵化器的运作模式都有了进一步的了解。在meetup活动的最后,三位Apache专家带领现场所有开发者进行了“Apache问答”小游戏。问答题目由Justin编写,公布在网站https://rawgit.com/justinmclean/ApacheQuiz/master/compiled/index.html 上,问题有不同的难度等级,涉及Apache基金会的管理模式、Apache开源协议、版本发布注意事项、三方软件集成等。三位专家与开发者一起答题,并对题目进行了风趣幽默的解读。最终,活动在一片欢笑声中结束,三位专家与开发者进行合影留念。


    关于Apache ServiceComb

    Apache ServiceComb是一个开源微服务框架,旨在使开发人员能够高效、方便的构建和管理微服务应用。该项目源于华为云微服务引擎CSE,借鉴和继承了华为诸多微服务实践经验,于2017年5月开源并在同年11月捐赠给Apache软件基金会。历经近一年的孵化,ServiceComb从微服务软件开发套件发展成为完整的微服务解决方案,用户数迅速增长,并获得了来自企业和社区开发者的广泛支持。2018年10月24日,ServiceComb从Apache孵化器顺利毕业成为顶级项目。

    关于Apache基金会

    Apache软件基金会是一个成立于1999年的非盈利慈善组织,英文名称 Apache Software Foundation,简称 ASF,最早源于开发Apache HTTP服务器的一个爱好者组织“Apache组织”。经过近20年的发展,Apache软件基金会已成为世界上最大的开源基金会,负责监管350多个免费的企业级项目和1.9亿多行的代码,它们作为主干支撑着全球广泛使用的应用程序。

    加入Apache开发者社区

    Apache软件基金会作为全球最大的开源软件基金会,其独特的精英治理模式和社区文化得到了全球无数开发者的青睐。如果读者有意加入Apache社区,参与Apache开源项目贡献,可以参考《如何成为committer》,了解Apache基金会的管理模式,以及《从开源小白到Apache Committer》,体会开发者成长为committer的心路历程。期待在Apache社区见到更多中国开发者的身影,我们,社区见!

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache ServiceComb带您对话Apache大咖 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    13 +Mar 2021

    Apache ServiceComb带您对话Apache大咖

    Apache ServiceComb带您对话Apache大咖

    前言:

    这是一篇两年半前的活动记录,应该最早的一批Apache项目Committer参加的Meetup,在这次会上跟大家分享了很多Apache项目孵化的相关的经验,以及开源软件商业的故事。特别值得说明的是在最近结束的ASF成员大会中,文中的有四位专家当选成为ASF董事会成员,这些经验今天看来对大家也是很有启发的。

    PMC沉睡了怎么办?首次发版项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决!有人给项目提交Patch,我们从来不说“No“!我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱……开源微服务项目ServiceComb带您对话Apache大咖,领略Apache专家风采。

    2018年10月13日下午,开源微服务项目ServiceComb的团队邀请Apache基金会三位专家成员:Apache孵化器主席Justin Mclean,Apache董事会董事Roman Shaposhnik, 以及Apache基金会秘书长兼形象大使Craig Rossell,与国内Apache项目开发者相聚于上海。针对开发者所关心的Apache精英管理模式、从孵化器毕业成为顶级项目以及开源软件的商业化等主题进行了深入的交流。本文对活动当日的交流进行了纪实和总结。

    (现场为英文分享,本文对其进行翻译整理和校正归纳)


    开场介绍

    [姜宁]今天咱们聚集了国内大部分的Apache相关项目的committer,这些项目包括Beam、ServiceComb、Dubbo、Gearpump、Griffin、Kerlin、Skywalking和Weex。这些Apache项目大部分都还在孵化器中孵化,同时还有一些准备进入Apache孵化的项目。

    我在2006年9月作为Apache CXF 项目 初始 committer与Apache软件基金会结缘,2011年1月正式成为 Apache基金会成员。我作为基金会项目导师(Mentor)参与了多个来自中国的Apache孵化器项目。2017年,我作为项目负责人推动ServiceComb进入Apache 孵化器进行孵化,现在 ServiceComb已经很快就要从Apache孵化器毕业了。

    虽然参与了许多Apache开源项目,坦白地说我对Apache的项目孵化流程并未有系统化全面的理解。直到ServiceComb这个项目,我经历了寻找Mentor,捐赠协议签署,迁移项目,孵化器发版,以及毕业准备这些流程之后,才对Apache孵化器孵化流程有了更加深刻的认识。

    就在刚刚的交流中,我发现大家最关心的问题就是如何从Apache孵化器毕业。 我们今天邀请到远道而来的Apache Member,Roman,Justin,Craig,和国内Apache项目开发者一起分享他们有关Apache孵化器孵化经验,以及开源相关的感悟。


    如何从Apache软件基金会孵化器毕业成为顶级项目

    [Justin]

    从Apache孵化器毕业,首要为孵化项目构建一个社区,项目毕业意味着很多事情,比如要保持开发者的多样性,项目贡献者不能仅仅来自一个公司。此外,还应该尝试小版本发布(make micro releases)。

    [Roman]

    发布版本时,除了项目本身,还有许多合规性工作(mechanical stuff)要做,例如开源协议,发版签名,发版投票等等。项目进入孵化器后,要尽快尝试发布第一个版本。许多孵化项目(podling)都想在发布版本时中搞定这样或那样的功能,我总是跟他们说,没关系,项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决,然后再专注于功能开发。

    [Justin]

    没错,要尽早发版、多做发版。

    [姜宁]

    发布版本尽管痛苦,但是要尽早去做。ServiceComb在发布第一个版本时,团队也非常痛苦,但是经历过这个阶段,后面会变得越来越顺利。

    总结:孵化器毕业要点解读

    • 构建社区

    ASF一直坚信好的软件是由强大的社区构建出来的。诚然,代码是一个软件社区的重中之重,但Apache之道**”Community over code”**同样强调社区的重要性。它意味着我们的行事方式,如何看待彼此,如何进行决策,甚至如何编写代码。健康、互相尊重的社区非常重要,这不仅让社区的开发者有被尊重的感觉,也会带来切实的好处。一个健康、多样、包容的社区,可以促进项目不断成长,可持续发展。甚至,有助于用开源技术提供服务的公司获得商业上的成功。

    • 保持贡献者多样性

    ASF非常强调多样性原则。 大部分开源软件项目都是创新型项目,多样性保证了开源项目的持续创新, 也保证了社区的健康发展。 开源项目鼓励所有个体或公司参与, 让他们感觉能对项目有所掌控,或者会对项目产生一定影响。这样可以保证意见的多样性、用户的多样性、系统的的多样性。Apache项目通常是要求有三个以上不同公司的人参与开发,以保证项目不会因为其中某个公司的退出而终止。

    • ** 尽早、尽量多的进行版本发布**

    对于构建持续增长的社区,有何建议?

    [郑士汉,Weex]:社区建设、多样性对于毕业非常重要,您能给出一些相关建议吗?

    [Justin]

    要让大家觉得自己是受欢迎的。当有人在邮件列表中提问时,我通常会分配PMC成员关注问题,并咨询提问者是否还需要其他帮助,或者有其他问题,我把这个作为日常工作。这样也有利于开发者从用户变成提交者甚至PMC成员。良好的文档可以让大家更容易使用你的项目。而文档的缺失则可能造成用户的流失,人们编译编译代码,就再也不使用这个项目了,因为项目上手太难了。

    [Roman]

    良好的文档确实非常重要。此外,我也有其他方面的建议。Apache软件基金会参与了一些项目,吸引了不少开贡献者。我们一直指导Google代码夏令营活动,夏令营由Google赞助,帮开发者更好的发展他们自己的项目。如果你可以让自己的社区参加类似的活动,对于社区建设无疑是有很大帮助的。因为大家来自中国的社区,我也建议一些中国的大公司,例如华为,也可以举办类似的学生项目,学生是一个项目最好的新鲜血液。

    [Justin]

    在会议中分享项目、建立技术博客也是不错的方式。

    [吴晟,Skywalking]

    Skywalking是中国开发者发起的一个Apache孵化项目,刚加入孵化时只有15个committer,而现在,代码层面的提交者已经达到了70人。我们提倡大家提交小的改动,这样很容易提交代码来做贡献,所以我们每次发布版本都会吸引一些开发者。当我们没有太多精力投入到测试时,我们会吸引开发者来提供测试,他们可以提交集成测试结果,可以提交测试模型,只要保持正确的编程风格,PMC的成员就可以进行审查,并合并代码

    [Justin]

    这里我想多提一点,很多项目过于注重质量。有些Apache项目收到一些代码不太完美的提交,就直接丢弃了这些提交,然后自己从头搞起。其实这并没有关系,如果你收到了不太完美的PR,可以请社区成员帮忙改进质量。另外,在JIRA或Github上浏览issue时,如果发现一些比较简单的issue,你可以加个”easy to fix”标签,告诉大家这个issue比较容易解决,这样也可以吸引人来贡献。

    [吴晟]

    没错,我们也会跟踪一些讨论,有些时候我们可能会考虑过于理想的方案。但是好的项目有时候并不完全是完美的代码决定的,还要考虑不同的场景。这样项目才能不断壮大。

    [姜宁]

    我也谈谈自己的感受,我非常赞同Justin所说的“Low the bar”。我在参与Apache Camel项目开发时,它已经非常成熟了,但是我们还采用先提交后Review的方式进开发。 有很多人为Camel提交Patch,我们从来不说“No”。有些人提交的代码质量可能并不太好,我们还是会接受这些补丁,让贡献者觉得自己得到认可。这样,开发者就不会想“啊,我还不够优秀,还无法成为committer,我提交的补丁也不够好,那我还是不提交补丁了。” 在我们合入代码时候,也会顺道帮助修复一下补丁上面的问题。 顺便说一句,Apache Camel现在有200多个组件,目前项目只有大概4,5个人在维护,很大程度上是得益与这种降低社区门槛的方式。

    总结:构建社区的建议

    • 让大家觉得自己是受欢迎的。
    • 编写良好的文档,降低初学者入门难度。
    • 参与或组织类似Google代码夏令营的学生项目。
    • 在技术会议中分享项目经验,建立技术博客传播技术。
    • 提倡小的改动,乐于接受他人的贡献,乐于帮助改进质量,让开发者更容易参与社区贡献。

    项目的提交者和PMC成员不够活跃,我应该怎么办?

    [史少锋,Kerlin]:有些开发者成为提交者后就消失了,有时候PMC成员也不能非常及时的审查提交,有没有什么规则推动大家活跃起来?

    [Justin]

    我觉得提交者或者PMC成员不活跃并不是问题,不是所有人都必须活跃。但是如果项目的导师不活跃就是问题了,因为导师要指导项目,告诉项目成员正确的做事方法。我们没办法为提交者和PMC成员制定“(及时反馈的)规则”,这样对他们要求太高了。我们应该降低门槛,让更多人参与进来

    [Roman]

    通常,每个项目的PMC都有VP(Vice President),VP主要负责合规性相关的工作,向Apache董事会汇报,但是VP也要担当起项目的领导者角色。即便所有其他PMC成员都在沉睡,VP也是唯一要保持清醒的人。VP是默认的那个要回答问题的人,当然不是技术相关的问题,而是回答管理流程相关的问题。如果邮件列表无人响应,你要写信给VP,告诉他,“嘿,大家似乎都睡着了,我们应该怎么办呢?”。VP有权利做出改变,他可以组织大家开始审查提交,让大家醒过来。

    总结:PMC沉睡了怎么办

    • Apache基金会是个公益组织,不能通过强制要求来约束成员。
    • 可以通过降低门槛,让更多人可以参与进来,解决社区响应不及时的问题。
    • VP承担项目领导责任,要时刻保持活跃。遇到问题可以向VP寻求帮助

    在Apache软件基金会的组织结构中,Apache董事会根据基金会的管理原则,负责管理和监督对外合作的商业和事务,包括基金、知识资产、注册商标等。每个Apache项目都有一个PMC(项目管理委员会),负责项目的管理和监督,并定期向Apache董事会汇报项目情况。PMC有一位主席(Chairperson),也被称为该项目的Vice President,简称VP。VP由董事会指定,是董事会和项目之间的接口人,负责项目汇报、同时与PMC一同保证项目和代码遵从法规、管理商标事务、管理邮件列表等合规性问题,发展新的Committer和PMC成员。

    发版投票过程漫长,如何保持正确的发版“姿势”?

    [张天伦,Gearpump]:发版投票需要经过至少72+72个小时,过程非常漫长,又担心犯错误导致投票过少进而导致发版失败。并且,有时候发起投票,响应的人比较少。

    [Justin]

    犯一次错误没关系,可以向导师寻求帮助以避免重复多次犯错误。在开始的一两次发版中,有一些错误很正常,但是后续的版本发布就会越来越顺利。如果发版时响应人数比较少,可以直接在邮件列表中提醒孵化器项目管理委员会(IPMC)成员,特别是导师,进行投票。

    [Roman]

    我想大家对敏捷开发都比较熟悉,敏捷开发提倡小幅度的改动,多进行更新。如果你的项目遵循敏捷开发方式,将对版本发布大有裨益。我指导项目孵化时,除了首次发版需要在合规性方面花费很多时间,后面的版本尽量在每个月或每两个月发布一次,新版本不一定要加入很多功能,每月发一次版本,更容易让IPMC的成员审查新版本的变动。因此,首次发版,解决合规性问题,然后尽快发版,多做发版

    [Justin]

    另外,可以将新版本改动写入版本说明中,可以让审查工作变得轻松很多。

    [Roman]

    没错,小幅度迭代也可以帮你构建社区。社区贡献者提交的补丁越小,越容易进行审查。

    总结:在Apache孵化器发布版本的要点

    • 不要担心在发版时犯错误,大胆的向导师和IPMC成员寻求帮助,但要避免犯重复的错误
    • 借鉴敏捷开发模式,小版本迭代,频繁更新
    • 首次发版扫除一切合规性问题,后续版本专注功能和质量
    • 让版本更新更容易审查

    如何使用开源软件进行商业化?

    [Roman]

    开源商业化的模式是多种多样的。红帽(RedHat)就是一个很成功的例子,他们用开源收益颇丰。也有一些新的公司,例如我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱(众人笑)。

    我大致可以列出3种开源商业化的模式。首先,几乎所有云服务厂商都使用开源产品,将其变成服务来进行营利,这就是一个很常见的商业化模式。例如,我很惊喜地看到华为云的流服务使用了Apache Flink,这就是华为使用开源盈利的方式。

    另外一种比较传统但应用广泛的商模式,以开源软件为核心构建产品,并提供额外的组件和技术。这些额外的部分不一定是开源的。例如你的产品可以用Apache项目作为核心,然后加入GPL协议的组件,再加上一些私有的组件,然后就可以像微软出售Windows系统,或者Adobe出售Adobe Creative Suite那样盈利了。

    第三种商业化模式,就是基于开源软件提供差异化的集成服务或者解决方案。将开源软件集成为一个更大的系统,提供给客户以进行营利。你可以运营一个专业的服务公司,用开源软件帮助用户简化业务。例如,你的公司服务于酒店或工厂,帮他们实现自动化运维。客户并不在乎你用什么软件或技术,他们只关心端到端的方案能够顺利实施。你的公司使用开源软件,可以按照自己的需求进行优化,也避免了收费的商业软件侵占你的利润。

    [Craig]

    在培训行业,经常有公司需要培训自己的员工来学习、使用Apache软件。我们曾短暂的考虑过和商业公司合作提供培训服务,然后与商业公司分享利润。但是这个念头只是一闪而过就被我们否决了,这样会与提供Apache软件培训服务的人形成竞争,这样有悖于Apache厂商中立的原则。所以,如果你想通过开源软件培训来盈利,大胆去做,这也是一个不错的开源商业化模式

    总结:开源商业化的几种方式

    • 用开源软件提供服务,例如那些云服务厂商
    • 基于开源软件提供额外的收费功能
    • 利用开源软件提供集成服务,并提供商业支持
    • 开展开源软件的培训服务

    活动尾声

    经过一番深入的沟通和交流,现场的开发者对Apache基金会、基金会的精英管理模式、Apache孵化器的运作模式都有了进一步的了解。在meetup活动的最后,三位Apache专家带领现场所有开发者进行了“Apache问答”小游戏。问答题目由Justin编写,公布在网站https://rawgit.com/justinmclean/ApacheQuiz/master/compiled/index.html 上,问题有不同的难度等级,涉及Apache基金会的管理模式、Apache开源协议、版本发布注意事项、三方软件集成等。三位专家与开发者一起答题,并对题目进行了风趣幽默的解读。最终,活动在一片欢笑声中结束,三位专家与开发者进行合影留念。


    关于Apache ServiceComb

    Apache ServiceComb是一个开源微服务框架,旨在使开发人员能够高效、方便的构建和管理微服务应用。该项目源于华为云微服务引擎CSE,借鉴和继承了华为诸多微服务实践经验,于2017年5月开源并在同年11月捐赠给Apache软件基金会。历经近一年的孵化,ServiceComb从微服务软件开发套件发展成为完整的微服务解决方案,用户数迅速增长,并获得了来自企业和社区开发者的广泛支持。2018年10月24日,ServiceComb从Apache孵化器顺利毕业成为顶级项目。

    关于Apache基金会

    Apache软件基金会是一个成立于1999年的非盈利慈善组织,英文名称 Apache Software Foundation,简称 ASF,最早源于开发Apache HTTP服务器的一个爱好者组织“Apache组织”。经过近20年的发展,Apache软件基金会已成为世界上最大的开源基金会,负责监管350多个免费的企业级项目和1.9亿多行的代码,它们作为主干支撑着全球广泛使用的应用程序。

    加入Apache开发者社区

    Apache软件基金会作为全球最大的开源软件基金会,其独特的精英治理模式和社区文化得到了全球无数开发者的青睐。如果读者有意加入Apache社区,参与Apache开源项目贡献,可以参考《如何成为committer》,了解Apache基金会的管理模式,以及《从开源小白到Apache Committer》,体会开发者成长为committer的心路历程。期待在Apache社区见到更多中国开发者的身影,我们,社区见!

    \ No newline at end of file diff --git a/post/apache_corporate_organization/index.html b/post/apache_corporate_organization/index.html index 03a5ca84..6dea95c7 100644 --- a/post/apache_corporate_organization/index.html +++ b/post/apache_corporate_organization/index.html @@ -1,5 +1,3 @@ -ASF公司架构和治理 · ALC Beijing

    ASF公司架构和治理

    公司治理

    总的来看,Apache软件基金会(ASF)的治理相当简单:由成员(Member)来选举董事会;董事会任命各种管理人员并创建PMCs;PMCs定期向董事会报告,大多数其他管理人员向总裁汇报,然后总裁向董事会报告。

    组织架构和职责

    为了更好的管理公司,ASF建立了如下组织架构:

    • 现有成员(Member)会定期提名和选举新成员,每年提名并选举9名董事加入董事会。

    • 董事会任命业务官员,并将特定政策或业务领域的责任分配给每位官员。例如,法律事务委员会副总裁负责为ASF和所有Apache项目设置法律政策,并与公司顾问进行合作。

    • 董事会任命执行官,包括总裁,秘书,财务总监等,他们负责ASF的特定领域运营。

    • 大多数官员每月直接向总裁报告,而总裁则每月向董事会报告ASF的整体运营状况。

    • 基础设施副总裁向总裁汇报,并对基础设施团队的运营进行宏观监督。在团队中,带薪的基础设施管理者角色有助于管理日常操作,为带薪人员确定工作优先级,并维护所有Apache项目中使用的基础服务。

    选举和任命

    董事会创建并更新项目管理委员会(PMCs)。董事会只是批准孵化器的合理构建请求(毕业成为TLPs)或来自PMCs自身(添加或删除PMC成员)的请求。在每种情况下,向董事会建议进行的变更都已经由相关的PMC完成了投票。如下图所示:

    项目治理

    每个Apache PMC都独立管理他们的项目,以Apache的方式,遵循由所有官员为所有项目设置的一些核心原则。如下图所示:

    • PMC每季度直接向董事会报告一次。董事会对PMC进行监督,以确保PMC健康发展,顺利的管理社区,确保PMC遵守Apache的原则。项目的技术方向由PMC指定,董事会不对项目提供技术治理。

    • 每个PMC的主席都是该项目的副总裁,因此也是ASF的官员。主席的主要职责是确保项目报告全面,并提交到董事会。

    • PMC对软件版本发布进行投票。PMC进行适当的发布治理,进而确保了所有的源代码版本发布都是ASF官方行为。

    • PMCs为项目提名并选举新提交者(Committer)。PMCs还负责提名并投票新的PMC成员,然后PMCs向董事会汇报建议的变化。

    • Apache孵化器(Incubator)是一种特殊的(I)PMC:它的工作是指导新建立的Podling社区,以帮助他们学习Apache Way。在每个Podling对他们的软件发布进行投票后,IPMC成员也对该Podling的发布过程进行监督和投票,以确保Podling逐渐成长为一个合格的Apache项目。

    • 根据政策,只有个人可以充当会员,提交者(Committer)或PMC成员(Member)或管理人员。这是ASF和Apache项目保持其独立性的一种方式

    参考链接

    [1] http://www.apache.org/foundation/governance/orgchart

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ASF公司架构和治理 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    04 +Apr 2020

    ASF公司架构和治理

    公司治理

    总的来看,Apache软件基金会(ASF)的治理相当简单:由成员(Member)来选举董事会;董事会任命各种管理人员并创建PMCs;PMCs定期向董事会报告,大多数其他管理人员向总裁汇报,然后总裁向董事会报告。

    组织架构和职责

    为了更好的管理公司,ASF建立了如下组织架构:

    • 现有成员(Member)会定期提名和选举新成员,每年提名并选举9名董事加入董事会。

    • 董事会任命业务官员,并将特定政策或业务领域的责任分配给每位官员。例如,法律事务委员会副总裁负责为ASF和所有Apache项目设置法律政策,并与公司顾问进行合作。

    • 董事会任命执行官,包括总裁,秘书,财务总监等,他们负责ASF的特定领域运营。

    • 大多数官员每月直接向总裁报告,而总裁则每月向董事会报告ASF的整体运营状况。

    • 基础设施副总裁向总裁汇报,并对基础设施团队的运营进行宏观监督。在团队中,带薪的基础设施管理者角色有助于管理日常操作,为带薪人员确定工作优先级,并维护所有Apache项目中使用的基础服务。

    选举和任命

    董事会创建并更新项目管理委员会(PMCs)。董事会只是批准孵化器的合理构建请求(毕业成为TLPs)或来自PMCs自身(添加或删除PMC成员)的请求。在每种情况下,向董事会建议进行的变更都已经由相关的PMC完成了投票。如下图所示:

    项目治理

    每个Apache PMC都独立管理他们的项目,以Apache的方式,遵循由所有官员为所有项目设置的一些核心原则。如下图所示:

    • PMC每季度直接向董事会报告一次。董事会对PMC进行监督,以确保PMC健康发展,顺利的管理社区,确保PMC遵守Apache的原则。项目的技术方向由PMC指定,董事会不对项目提供技术治理。

    • 每个PMC的主席都是该项目的副总裁,因此也是ASF的官员。主席的主要职责是确保项目报告全面,并提交到董事会。

    • PMC对软件版本发布进行投票。PMC进行适当的发布治理,进而确保了所有的源代码版本发布都是ASF官方行为。

    • PMCs为项目提名并选举新提交者(Committer)。PMCs还负责提名并投票新的PMC成员,然后PMCs向董事会汇报建议的变化。

    • Apache孵化器(Incubator)是一种特殊的(I)PMC:它的工作是指导新建立的Podling社区,以帮助他们学习Apache Way。在每个Podling对他们的软件发布进行投票后,IPMC成员也对该Podling的发布过程进行监督和投票,以确保Podling逐渐成长为一个合格的Apache项目。

    • 根据政策,只有个人可以充当会员,提交者(Committer)或PMC成员(Member)或管理人员。这是ASF和Apache项目保持其独立性的一种方式

    参考链接

    [1] http://www.apache.org/foundation/governance/orgchart

    \ No newline at end of file diff --git a/post/apache_incubator_ip_policy/index.html b/post/apache_incubator_ip_policy/index.html index 7f51ae85..2b362f26 100644 --- a/post/apache_incubator_ip_policy/index.html +++ b/post/apache_incubator_ip_policy/index.html @@ -1,6 +1,6 @@ -Apache基金会项目孵化过程中知识产权转移的讨论 · ALC Beijing

    Apache基金会项目孵化过程中知识产权转移的讨论

    Apache软件基金会项目孵化过程中知识产权转移的讨论

    • 作者:张伟玲 谭中意
    • 审核:姜宁 张亮

    作者简介:

    张伟玲,多年大型互联网知识产权法律经验,擅长商标、开源、著作权等知识产权法律领域的合规制度建设、 培训和诉讼支持,在互联网信息网络传播/合规/品牌等领域有丰富实战经验。

    讨论背景:

    自2002年Apache Software Foundation(ASF)开始孵化项目以来,ASF至今已经毕业了200多个顶级项目。在这些项目中,无论是个人捐赠还是企业捐赠的,都必须严格遵守其孵化流程和政策要求。尤其是近几年来,越来越多的国人发起的开源项目进入Apache基金会孵化,并有不断的项目毕业,Apache开源基金会在国内的影响力越来越大。而它作为一个国际范围内host项目最多的开源基金会,它的各种政策和流程也越来越为更多人熟悉。

    而其中最重要的一个流程—项目孵化,在知识产权方面也有很独特的政策。那么,作为项目所有者的您,在面对这些政策和可能会遇到各种文件时,是否有过困惑“我签署了什么?项目的知识产权还是我的吗?或者说我还剩些什么权利呢?…”,为了解决这些困惑,本文会对您可能遇到的问题进行初步讨论分析,当然本人是从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结,也有些认识不到位的地方,请多多讨论,有问题可跟本人微信号weiweizhang0410讨论,thanks

    先说结论:

    总的来说,捐献项目给Apache基金会,Apache基金会需要您的“版权授权 + 专利授权 + 商标转让”。

    知识产权即人们常说的IP(Intellectual Property),跟开源软件相关的主要有如下三项:版权(即Copyright),专利(即Patent),商标(即Trademark )。根据Apache基金会的IP政策,个人或者公司捐献项目给它,该项目的专利和版权必须授权给它,商标必须要转让给它。

    即它既要商标的所有权(owner),又要专利的使用授权,还要版权的使用授权。

    具体解释:

    开源项目要进入Apache基金会进行孵化,原有版权所有人必须要签署如下两个文件,一个是SGA(Software Grant Agreement),另外一个是CCLA/ICLA(公司或者个人贡献协议ICLA: Individual Contributor License Agreement,CCLA: Corporate Contributor License Agreement)。我们一起来看看这两个文件的内容。

    先看看SGA(Software Grant Agreement),以下是协议原文信息: +Apache基金会项目孵化过程中知识产权转移的讨论 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    24 +Jul 2020

    Apache基金会项目孵化过程中知识产权转移的讨论

    Apache软件基金会项目孵化过程中知识产权转移的讨论

    • 作者:张伟玲 谭中意
    • 审核:姜宁 张亮

    作者简介:

    张伟玲,多年大型互联网知识产权法律经验,擅长商标、开源、著作权等知识产权法律领域的合规制度建设、 培训和诉讼支持,在互联网信息网络传播/合规/品牌等领域有丰富实战经验。

    讨论背景:

    自2002年Apache Software Foundation(ASF)开始孵化项目以来,ASF至今已经毕业了200多个顶级项目。在这些项目中,无论是个人捐赠还是企业捐赠的,都必须严格遵守其孵化流程和政策要求。尤其是近几年来,越来越多的国人发起的开源项目进入Apache基金会孵化,并有不断的项目毕业,Apache开源基金会在国内的影响力越来越大。而它作为一个国际范围内host项目最多的开源基金会,它的各种政策和流程也越来越为更多人熟悉。

    而其中最重要的一个流程—项目孵化,在知识产权方面也有很独特的政策。那么,作为项目所有者的您,在面对这些政策和可能会遇到各种文件时,是否有过困惑“我签署了什么?项目的知识产权还是我的吗?或者说我还剩些什么权利呢?…”,为了解决这些困惑,本文会对您可能遇到的问题进行初步讨论分析,当然本人是从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结,也有些认识不到位的地方,请多多讨论,有问题可跟本人微信号weiweizhang0410讨论,thanks

    先说结论:

    总的来说,捐献项目给Apache基金会,Apache基金会需要您的“版权授权 + 专利授权 + 商标转让”。

    知识产权即人们常说的IP(Intellectual Property),跟开源软件相关的主要有如下三项:版权(即Copyright),专利(即Patent),商标(即Trademark )。根据Apache基金会的IP政策,个人或者公司捐献项目给它,该项目的专利和版权必须授权给它,商标必须要转让给它。

    即它既要商标的所有权(owner),又要专利的使用授权,还要版权的使用授权。

    具体解释:

    开源项目要进入Apache基金会进行孵化,原有版权所有人必须要签署如下两个文件,一个是SGA(Software Grant Agreement),另外一个是CCLA/ICLA(公司或者个人贡献协议ICLA: Individual Contributor License Agreement,CCLA: Corporate Contributor License Agreement)。我们一起来看看这两个文件的内容。

    先看看SGA(Software Grant Agreement),以下是协议原文信息:

    下面我们来仔细看下这篇文档的重点部分。

    “WHEREAS, Licensor owns or has sufficient rights to contribute the software source code and other related intellectual property as itemized on Exhibit A (“Software”) under the terms of this agreement to the Foundation for use within Foundation software development projects (“Projects”).

    首先,实务操作中需要签署人必须有足够的授权来贡献代码和相关的IP。默认规则下该签署人至少是该公司高级总监以上的职位。

    然后看关键的部分: “Subject to the terms and conditions of this License, Licensor hereby grants to the Foundation:

    a) a non-exclusive, worldwide, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, @@ -59,6 +59,5 @@ Copyright 1997-2006 Sun Microsystems, Inc.

    从上面的文件中能看出,该文件的Copyright 按照时间列出了前后几个,1997-2006 为Sun Microsystems,1997-2016 为Oracle,2017-2020为Apache foundation。

    我们追溯ASF在2004年的董事会记录 发现,上述操作是基金会为了解决“用户在向ASF提供授权时,ASF文件中版权声明却归他人持有人时的不一致情况”,根据董事会方案: “版权者的首选处理方式是删除此类声明,或将其放在单独的位置归档,以包含在每个项目的COPYRIGHT文件中,或在贡献中包含基金会的书面许可,以进行通知的删除或重新安置;被许可给ASF的文件应有版权声明,并进行适当修改,以反映贡献年份和原始发行的任何后续年份。”

    因此,作为项目所有人的版权信息,有的会在NOTICE部分予以体现。但是Apache的发版和毕业政策都会约定最新版本的Copyright Owner声明是Apache基金会,虽然可以保留之前版本的Copyright说明。只有统一被授权方均为Apache基金会,该软件的用户基于对Apache基金会的品牌和信心,才会持续在该项目上进行投入,不担心出现该软件的主导公司未来的某一天把该软件闭源的情况。因为即使出现该软件主导方不再继续投入,或者另起炉灶的情况,Apache的知识产权制度保证了还有社区的其他人在继续维护。而该软件最新版本的Copyright Owner是Apache基金会,则在法律上减少了该社区在继续维护上的知识产权纠纷。

    这是Apache开源基金会精心的知识产权政策的设计,为了保证它旗下的项目是一个可信赖的产品,因为知识产权问题已经理清,持续维护的问题也已经解决,所以Apache的项目才会如此受到欢迎,所以才会有更多的公司或者个人把项目捐献给Apache基金会。

    总结:

    综合上面的说明来看,当有新的项目需要经ASF孵化毕业,作为项目所有人需要承担的义务主要在于版权授权、专利授权和商标转让,版权原始权利并未转让,因此,在项目的实际操作中请记得根据ASF的官方格式保留自己的权利声明。 -本文主要是基于实践操作和ASF官方规定作出的一些讨论,在您具体项目确定孵化或捐赠之前,请一定与您的律师进行个案的综合评估以保障您的权益哦。当然也欢迎微信联系跟本人共同沟通讨论。

    参考资料:

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +本文主要是基于实践操作和ASF官方规定作出的一些讨论,在您具体项目确定孵化或捐赠之前,请一定与您的律师进行个案的综合评估以保障您的权益哦。当然也欢迎微信联系跟本人共同沟通讨论。

    参考资料:

    \ No newline at end of file diff --git a/post/apachecon/apache-software-foundation-welcomes/index.html b/post/apachecon/apache-software-foundation-welcomes/index.html index 5c9534a2..3beafed8 100644 --- a/post/apachecon/apache-software-foundation-welcomes/index.html +++ b/post/apachecon/apache-software-foundation-welcomes/index.html @@ -1,5 +1,3 @@ -Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开 · ALC Beijing

    Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开

    Apache 官方全球大会在线会议目前共有 170+ 场演讲议题,并有来自 DataStax, IBM, Imply, Instaclustr, NASA 喷气推进实验室, 橡树岭国家实验室, Red Hat, Tetrate, Two Sigma 与 VMWare 等公司或组织的众多大咖做主题分享。

    2020 年 9 月 21日, Apache® 软件基金会(ASF),携超过 350 个开源项目的全体志愿开发者、管理员和孵化器,与主题演讲嘉宾、大会赞助商和 ApacheCon@Home 大会组委,郑重宣布:ApacheCon@Home 在线会议将于 2020 年 9月 29 日 - 10 月 1 日召开。本次大会全员免费注册。

    Apache 软件基金会大会副总裁 Rich Bowen 表示“我们很高兴推出 ApacheCon@Home,我们聚焦于我们社区的健康福祉,所以将今年 ApacheCon 和其他 Apache 线下面对面活动转移到线上进行是个很简单的决定,改为线上活动后人人都可以在家参与。本次大会话题多样精彩纷呈,共有 10 个主题分享、24 个论坛、170+ 场演讲,也期待全球各地的观众都能观看。”

    ApacheCon 是 Apache 软件基金会官方的全球系列大会,1998 年成功举办第一届。ApacheCon 吸引了 130 多个国家和地区的观众一起畅享「明日技术」,且不掺杂商业利益、公司偏见或销售推销。

    ApacheCon 集中展示众多 Apache 项目的最新进展,相关内容皆由 Apache 项目及所在社区精心呈现。各水平的参与者都能全方位、多层次地了解 Apache 项目创新与进展,比如:

    • 大数据 (Accumulo, Airflow, Beam, BookKeeper, DataSketches {incubating}, DLab {incubating}, Druid, Flink, Geode, Hadoop, HDFS, Hive, Hudi, Iceberg, Ignite, Kudu, NiFi, Ozone, Parquet, Pulsar, Ranger, Spark, YARN, Yunicorn {incubating}, Zeppelin);
    • 内容分发 (服务器/流量控制);
    • 数据库 (Cassandra);
    • 金融科技 (Fineract);
    • 地理空间 (GeoSpark {incubating}, SIS);
    • 创新 (正于 Apache 孵化器中开发中的项目);
    • 集成 (ActiveMQ, Camel, CXF, Kafka);
    • 物联网IoT (Edgent {incubating}, IoTDB, PLC4X, StreamPipes {incubating});
    • 机器学习 (Mahout, MXNet);
    • 监控追踪 (SkyWalking);
    • 办公套件 (OpenOffice);
    • 编程语言 (Groovy);
    • 搜索 (Lucene, Solr);
    • 语义网络 (Jena);
    • 服务器 (Apache HTTP Server, Sling, 流量控制, 服务器, Tomcat);
    • 软件开发 (Royale);
    • 流计算 (Kafka)

    主题分享由如下嘉宾呈现,他们是来自:DataStax 的 Jonathan Ellis,IBM 的 Sam Lightstone,Imply 的 Gian Merlino、Instaclustr 的 Anil Inamdar,NASA 喷气推进实验室的 Thomas Huang,橡树岭国家实验室的 Edmon Begoli ,Red Hat 的 Kim Huang,Tetrate 的吴晟,Two Sigma 的 Camille Fournier 以及来自 VMWare 的 Catherine McGarvey。

    本次大会也将举办由社区自发组织、按“Apache 之道”予以特设的中文论坛,其他也有诸如德语、印地语还有西班牙语论坛,可点击 https://www.apachecon.com/acah2020/tracks/ 查看全部论坛议程。

    ApacheCon@Home 大会赞助商有 Apple, Amazon Web Services, DataStax, IBM, Imply, Instaclustr, OpenLogic, Red Hat, RX-M 及 VMWare 等。想要赞助 ApacheCon@Home,可点击 https://www.apachecon.com/acah2020/sponsors.html 查看详情。

    请点击 https://www.apachecon.com/acah2020/ 报名本次大会。你选中的演讲会被记下,活动进行时可观看参与。

    关于 ApacheCon

    ApacheCon 是 Apache 软件基金会官方的全球系列大会。自 1998 年以来,ApacheCon 吸引了各水平参与者一起畅享「明日技术」,覆盖 350+ Apache 项目和及其多元化社区。ApacheCon 大会通过上手实操、主题演讲、真实案例研究、培训、黑客马拉松、社区活动等形式,展示 Apache 项目的最新发展和创新之处。更多信息,可访问 http://apachecon.com/https://twitter.com/ApacheCon

    关于 Apache 软件基金会(ASF)

    Apache 软件基金会成立于 1999 年,是目前世界上最大的开源基金会,管理着 2 亿 2 千 7 百万+行代码,面向公众提供 100% 纯免费、价值超过 200 亿的软件应用。Apache 软件基金会已由当初 21 名维护 Apache HTTP 服务器的初创成员,成长为拥有 813 名个人会员、206 个项目管理委员会的全志愿者社区。项目管理委员会成功领导着 350+ 个 Apache 项目,并按 Apache 精英化方式即为人所知的「Apache 之道」统筹 7800+ 名 Committer 进行创新协同。Apache 软件几乎深入到每个用户的计算设备之中,从笔记本电脑到平板、到移动设备,覆盖企业和关键应用程序。Apache 项目驱动着互联网世界广大领域,比如管理海量数据、执行不计其数的浮点计算并存储各行业的众多在线数据。对商业友好和宽松的 Apache License v2 业已成为开源行业标准,帮助建立价值巨大的企业并使全球无数用户受益。Apache 软件基金会是美国 501(c)(3) 非营利性组织,由个人捐赠和类似 Aetna, 阿里云,Amazon Web Services, Anonymous, 百度, Bloomberg, Budget Direct, Capital One, Cerner, Cloudera, Comcast, Facebook, Google, Handshake, 华为, IBM, 浪潮, Pineapple Fund, Red Hat, Target, 腾讯, Union Investment, Verizon Media 和 Workday 等商业公司赞助支持。详细信息,可访问 http://apache.org/https://twitter.com/TheASF

    © The Apache Software Foundation. “Apache”, “Accumulo”, “Apache Accumulo”, “ActiveMQ”, “Apache ActiveMQ”, “Airflow”, “Apache Airflow”, “Beam”, “Apache Beam”, “BookKeeper”, “Apache BookKeeper”, “Camel”, “Apache Camel”, “Cassandra”, “Apache Cassandra”, “CXF”, “Apache CXF”, “DataSketches”, “DLab”, “Druid”, “Apache Druid”, “Edgent”, “Fineract”, “Apache Fineract”, “Flink”, “Apache Flink”, “Geode”, “Apache Geode”, “GeoSpark”, “Groovy”, “Apache Groovy”, “Hadoop”, “Apache Hadoop”, “HDFS”, “Apache HDFS”, “Hive”, “Apache Hive”, “Hudi”, “Apache Hudi”, “Apache HTTP Server”, “Iceberg”, “Apache Iceberg”, “Ignite”, “Apache Ignite”, “IoTDB”, “Apache IoTDB”, “Jena”, “Apache Jena”, “Kafka”, “Apache Kafka”, “Kudu”, “Apache Kudu”, “Lucene”, “Apache Lucene”, “Mahout”, “Apache Mahout”, “MXNet”, “NiFi”, “Apache NiFi”, “OpenOffice”, “Apache OpenOffice”, “Ozone”, “Apache Ozone”, “Parquet”, “Apache Parquet”, “PLC4X”, “Apache PLC4X”, “Pulsar”, “Apache Pulsar”, “Ranger”, “Apache Ranger”, “Royale”, “Apache Royale”, “SIS”, “Apache SIS”, “SkyWalking”, “Apache SkyWalking”, “Sling”, “Apache Sling”, “Solr”, “Apache Solr”, “Spark”, “Apache Spark”, “StreamPipes”, “Apache StreamPipes”, “Tomcat”, “Apache Tomcat”, “Traffic Control”, “Apache Traffic Control”, “Traffic Server”, “Apache Traffic Server”, “YARN”, “Apache YARN”, “Yunicorn”, “Zeppelin”, “Apache Zeppelin” 与 “ApacheCon” 皆为 Apache 软件基金会在美国或/和其他国家地区的注册商标或商标。所有其他品牌和商标均为其各自所有者资产。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    25 +Sep 2020

    Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开

    Apache 官方全球大会在线会议目前共有 170+ 场演讲议题,并有来自 DataStax, IBM, Imply, Instaclustr, NASA 喷气推进实验室, 橡树岭国家实验室, Red Hat, Tetrate, Two Sigma 与 VMWare 等公司或组织的众多大咖做主题分享。

    2020 年 9 月 21日, Apache® 软件基金会(ASF),携超过 350 个开源项目的全体志愿开发者、管理员和孵化器,与主题演讲嘉宾、大会赞助商和 ApacheCon@Home 大会组委,郑重宣布:ApacheCon@Home 在线会议将于 2020 年 9月 29 日 - 10 月 1 日召开。本次大会全员免费注册。

    Apache 软件基金会大会副总裁 Rich Bowen 表示“我们很高兴推出 ApacheCon@Home,我们聚焦于我们社区的健康福祉,所以将今年 ApacheCon 和其他 Apache 线下面对面活动转移到线上进行是个很简单的决定,改为线上活动后人人都可以在家参与。本次大会话题多样精彩纷呈,共有 10 个主题分享、24 个论坛、170+ 场演讲,也期待全球各地的观众都能观看。”

    ApacheCon 是 Apache 软件基金会官方的全球系列大会,1998 年成功举办第一届。ApacheCon 吸引了 130 多个国家和地区的观众一起畅享「明日技术」,且不掺杂商业利益、公司偏见或销售推销。

    ApacheCon 集中展示众多 Apache 项目的最新进展,相关内容皆由 Apache 项目及所在社区精心呈现。各水平的参与者都能全方位、多层次地了解 Apache 项目创新与进展,比如:

    • 大数据 (Accumulo, Airflow, Beam, BookKeeper, DataSketches {incubating}, DLab {incubating}, Druid, Flink, Geode, Hadoop, HDFS, Hive, Hudi, Iceberg, Ignite, Kudu, NiFi, Ozone, Parquet, Pulsar, Ranger, Spark, YARN, Yunicorn {incubating}, Zeppelin);
    • 内容分发 (服务器/流量控制);
    • 数据库 (Cassandra);
    • 金融科技 (Fineract);
    • 地理空间 (GeoSpark {incubating}, SIS);
    • 创新 (正于 Apache 孵化器中开发中的项目);
    • 集成 (ActiveMQ, Camel, CXF, Kafka);
    • 物联网IoT (Edgent {incubating}, IoTDB, PLC4X, StreamPipes {incubating});
    • 机器学习 (Mahout, MXNet);
    • 监控追踪 (SkyWalking);
    • 办公套件 (OpenOffice);
    • 编程语言 (Groovy);
    • 搜索 (Lucene, Solr);
    • 语义网络 (Jena);
    • 服务器 (Apache HTTP Server, Sling, 流量控制, 服务器, Tomcat);
    • 软件开发 (Royale);
    • 流计算 (Kafka)

    主题分享由如下嘉宾呈现,他们是来自:DataStax 的 Jonathan Ellis,IBM 的 Sam Lightstone,Imply 的 Gian Merlino、Instaclustr 的 Anil Inamdar,NASA 喷气推进实验室的 Thomas Huang,橡树岭国家实验室的 Edmon Begoli ,Red Hat 的 Kim Huang,Tetrate 的吴晟,Two Sigma 的 Camille Fournier 以及来自 VMWare 的 Catherine McGarvey。

    本次大会也将举办由社区自发组织、按“Apache 之道”予以特设的中文论坛,其他也有诸如德语、印地语还有西班牙语论坛,可点击 https://www.apachecon.com/acah2020/tracks/ 查看全部论坛议程。

    ApacheCon@Home 大会赞助商有 Apple, Amazon Web Services, DataStax, IBM, Imply, Instaclustr, OpenLogic, Red Hat, RX-M 及 VMWare 等。想要赞助 ApacheCon@Home,可点击 https://www.apachecon.com/acah2020/sponsors.html 查看详情。

    请点击 https://www.apachecon.com/acah2020/ 报名本次大会。你选中的演讲会被记下,活动进行时可观看参与。

    关于 ApacheCon

    ApacheCon 是 Apache 软件基金会官方的全球系列大会。自 1998 年以来,ApacheCon 吸引了各水平参与者一起畅享「明日技术」,覆盖 350+ Apache 项目和及其多元化社区。ApacheCon 大会通过上手实操、主题演讲、真实案例研究、培训、黑客马拉松、社区活动等形式,展示 Apache 项目的最新发展和创新之处。更多信息,可访问 http://apachecon.com/https://twitter.com/ApacheCon

    关于 Apache 软件基金会(ASF)

    Apache 软件基金会成立于 1999 年,是目前世界上最大的开源基金会,管理着 2 亿 2 千 7 百万+行代码,面向公众提供 100% 纯免费、价值超过 200 亿的软件应用。Apache 软件基金会已由当初 21 名维护 Apache HTTP 服务器的初创成员,成长为拥有 813 名个人会员、206 个项目管理委员会的全志愿者社区。项目管理委员会成功领导着 350+ 个 Apache 项目,并按 Apache 精英化方式即为人所知的「Apache 之道」统筹 7800+ 名 Committer 进行创新协同。Apache 软件几乎深入到每个用户的计算设备之中,从笔记本电脑到平板、到移动设备,覆盖企业和关键应用程序。Apache 项目驱动着互联网世界广大领域,比如管理海量数据、执行不计其数的浮点计算并存储各行业的众多在线数据。对商业友好和宽松的 Apache License v2 业已成为开源行业标准,帮助建立价值巨大的企业并使全球无数用户受益。Apache 软件基金会是美国 501(c)(3) 非营利性组织,由个人捐赠和类似 Aetna, 阿里云,Amazon Web Services, Anonymous, 百度, Bloomberg, Budget Direct, Capital One, Cerner, Cloudera, Comcast, Facebook, Google, Handshake, 华为, IBM, 浪潮, Pineapple Fund, Red Hat, Target, 腾讯, Union Investment, Verizon Media 和 Workday 等商业公司赞助支持。详细信息,可访问 http://apache.org/https://twitter.com/TheASF

    © The Apache Software Foundation. “Apache”, “Accumulo”, “Apache Accumulo”, “ActiveMQ”, “Apache ActiveMQ”, “Airflow”, “Apache Airflow”, “Beam”, “Apache Beam”, “BookKeeper”, “Apache BookKeeper”, “Camel”, “Apache Camel”, “Cassandra”, “Apache Cassandra”, “CXF”, “Apache CXF”, “DataSketches”, “DLab”, “Druid”, “Apache Druid”, “Edgent”, “Fineract”, “Apache Fineract”, “Flink”, “Apache Flink”, “Geode”, “Apache Geode”, “GeoSpark”, “Groovy”, “Apache Groovy”, “Hadoop”, “Apache Hadoop”, “HDFS”, “Apache HDFS”, “Hive”, “Apache Hive”, “Hudi”, “Apache Hudi”, “Apache HTTP Server”, “Iceberg”, “Apache Iceberg”, “Ignite”, “Apache Ignite”, “IoTDB”, “Apache IoTDB”, “Jena”, “Apache Jena”, “Kafka”, “Apache Kafka”, “Kudu”, “Apache Kudu”, “Lucene”, “Apache Lucene”, “Mahout”, “Apache Mahout”, “MXNet”, “NiFi”, “Apache NiFi”, “OpenOffice”, “Apache OpenOffice”, “Ozone”, “Apache Ozone”, “Parquet”, “Apache Parquet”, “PLC4X”, “Apache PLC4X”, “Pulsar”, “Apache Pulsar”, “Ranger”, “Apache Ranger”, “Royale”, “Apache Royale”, “SIS”, “Apache SIS”, “SkyWalking”, “Apache SkyWalking”, “Sling”, “Apache Sling”, “Solr”, “Apache Solr”, “Spark”, “Apache Spark”, “StreamPipes”, “Apache StreamPipes”, “Tomcat”, “Apache Tomcat”, “Traffic Control”, “Apache Traffic Control”, “Traffic Server”, “Apache Traffic Server”, “YARN”, “Apache YARN”, “Yunicorn”, “Zeppelin”, “Apache Zeppelin” 与 “ApacheCon” 皆为 Apache 软件基金会在美国或/和其他国家地区的注册商标或商标。所有其他品牌和商标均为其各自所有者资产。

    \ No newline at end of file diff --git a/post/apachecon/apachecon-2020-guide/index.html b/post/apachecon/apachecon-2020-guide/index.html index fec33f97..2e093208 100644 --- a/post/apachecon/apachecon-2020-guide/index.html +++ b/post/apachecon/apachecon-2020-guide/index.html @@ -1,14 +1,12 @@ -ApacheCon 2020 参会指南 · ALC Beijing

    ApacheCon 2020 参会指南

    每年一度的 Apache北美大会因为疫情的原因转到线上来举行了, 这次会议的主题是ApacheCon@Home, 也就是说借助网络我们可以足不出户就可以参加Apache大会了。 -今年的会议为了针对不同的地域特点,特地安排了不同时间段的演讲,同时还专门增加了中文的演讲,欢迎大家关注。

    下面今年ApacheCon的参会指南译自 https://apachecon.com/acah2020/guide.html,祝大家参会愉快!

    前期准备

    为了您在ApacheCon@Home可以得到最好的体验,我们为你准备了以下清单,这样参会者就可以提前准备。 请提前浏览以下的技术要求和参会前可以准备的事项,这样就不需要在会议的过程中进行任何准备了。

    注册

    请确认你已经在 ApacheConf @Home at Hopin 完成注册,如果你在右上角看到一条消息写着“You‘re in” 说明注册成功,借此机会可以点击“Add to calendar”将会议时间加入到日历。

    1. 点击注册链接 ApacheConf @Home at Hopin

    2. 选择一个ticket,点击下方蓝色按钮checkout。(官网标注:General Admission即注册为免费,但如果你愿意帮助和支持活动可以选择Donation Ticket进行捐款) +ApacheCon 2020 参会指南 | ALC Beijing 博客

      ALC Beijing 博客

      介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

      15 +Sep 2020

      ApacheCon 2020 参会指南

      每年一度的 Apache北美大会因为疫情的原因转到线上来举行了, 这次会议的主题是ApacheCon@Home, 也就是说借助网络我们可以足不出户就可以参加Apache大会了。 +今年的会议为了针对不同的地域特点,特地安排了不同时间段的演讲,同时还专门增加了中文的演讲,欢迎大家关注。

      下面今年ApacheCon的参会指南译自 https://apachecon.com/acah2020/guide.html,祝大家参会愉快!

      前期准备

      为了您在ApacheCon@Home可以得到最好的体验,我们为你准备了以下清单,这样参会者就可以提前准备。 请提前浏览以下的技术要求和参会前可以准备的事项,这样就不需要在会议的过程中进行任何准备了。

      注册

      请确认你已经在 ApacheConf @Home at Hopin 完成注册,如果你在右上角看到一条消息写着“You‘re in” 说明注册成功,借此机会可以点击“Add to calendar”将会议时间加入到日历。

      1. 点击注册链接 ApacheConf @Home at Hopin

      2. 选择一个ticket,点击下方蓝色按钮checkout。(官网标注:General Admission即注册为免费,但如果你愿意帮助和支持活动可以选择Donation Ticket进行捐款)

      3. 此时页面会跳转到注册页,请填写您的名(First name),姓(Last name),邮箱地址(Email address)和设定一个密码(Password)。勾选下方的条款与隐私协议,点击蓝色按钮sign up即可。

      4. 检查是否注册成功 看到页面上有“You‘re in!”的提示则注册成功 或在右上角的个人信息中找到Events,点击进入看到如下页面,同样意味着注册成功 -

      网络速度

      请尝试接入到至少 5Mbit/s 下载速度和2Mbit/s 上传速度的网络。下载速度和上传速度越高越能够提供一个更好的体验,30Mbit/s 的下载速度和10Mbit/s 上传速度是最理想的。尝试限制其他可能占用网速的访问客户,比如:提前一天将软件更新完成,避免软件在会议中运行,暂停或停止所有大型下载项目,如果需要可以断开其他设备的网络连接。推荐用网线进行网络连接。可以用一个在线网站进行网络速度检查,搜索 Internet speed test

      浏览器

      Hopin 支持 Google Chrome (推荐) 和 Mozilla Firefox (备选),其他浏览器均不支持。请确认您的浏览器是最新版本,按照浏览器说明 ChromeFirefox 进行操作。

      注意,Safari 与 Chrome 用的是同一引擎,用Safari打开网页也显示成功。但是,我们还是推荐使用Chrome。

      请减少打开的网页数量和关闭不必要的浏览器扩展工具。不要打开多个Hopin的网页,如果有这样的需求请只保留一个网页的声音,其余静音。

      设备

      请优先考虑使用台式电脑或者笔记本,如果你使用的是平板电脑和手机设备确保你使用的是Google Chrome 或 Mozilla Firefox。

      文献资料

      在Hopin 上浏览为 参会者演讲者 编写的文档。

      填写个人资料

      填写你的 Hopin个人资料,以帮助建立会议成员之间的交流并找到志趣相投的人。你的个人资料会被保护仅会共享你同意的信息。

      选择会议

      浏览 track 页面,然后选择您感兴趣的会议。在每个会议旁边,您会找到日历(📅)图标,单击该图标将为您提供iCalendar(.ical)文件,您可以将其导入日历软件中。单击会话的日期和时间将带您到一个在线服务,可用于将会话时间转换为不同的时区。会话时间轴上方显示的时间反映了您当地时区的时间,因此请确保您的计算机为您所在的地区配置了正确的时区。

      会议中

      在会议中你可能遇到一些问题,我们整理了一些常见的问题和一些通用的建议去避免问题的出现。

      声音和视频

      为了在会议中有更好的声音和图像的体验这里列举了一些建议:

      要最大化演讲者视频或演示视频,请双击该视频流,这将放大视频流的该部分。 +

    网络速度

    请尝试接入到至少 5Mbit/s 下载速度和2Mbit/s 上传速度的网络。下载速度和上传速度越高越能够提供一个更好的体验,30Mbit/s 的下载速度和10Mbit/s 上传速度是最理想的。尝试限制其他可能占用网速的访问客户,比如:提前一天将软件更新完成,避免软件在会议中运行,暂停或停止所有大型下载项目,如果需要可以断开其他设备的网络连接。推荐用网线进行网络连接。可以用一个在线网站进行网络速度检查,搜索 Internet speed test

    浏览器

    Hopin 支持 Google Chrome (推荐) 和 Mozilla Firefox (备选),其他浏览器均不支持。请确认您的浏览器是最新版本,按照浏览器说明 ChromeFirefox 进行操作。

    注意,Safari 与 Chrome 用的是同一引擎,用Safari打开网页也显示成功。但是,我们还是推荐使用Chrome。

    请减少打开的网页数量和关闭不必要的浏览器扩展工具。不要打开多个Hopin的网页,如果有这样的需求请只保留一个网页的声音,其余静音。

    设备

    请优先考虑使用台式电脑或者笔记本,如果你使用的是平板电脑和手机设备确保你使用的是Google Chrome 或 Mozilla Firefox。

    文献资料

    在Hopin 上浏览为 参会者演讲者 编写的文档。

    填写个人资料

    填写你的 Hopin个人资料,以帮助建立会议成员之间的交流并找到志趣相投的人。你的个人资料会被保护仅会共享你同意的信息。

    选择会议

    浏览 track 页面,然后选择您感兴趣的会议。在每个会议旁边,您会找到日历(📅)图标,单击该图标将为您提供iCalendar(.ical)文件,您可以将其导入日历软件中。单击会话的日期和时间将带您到一个在线服务,可用于将会话时间转换为不同的时区。会话时间轴上方显示的时间反映了您当地时区的时间,因此请确保您的计算机为您所在的地区配置了正确的时区。

    会议中

    在会议中你可能遇到一些问题,我们整理了一些常见的问题和一些通用的建议去避免问题的出现。

    声音和视频

    为了在会议中有更好的声音和图像的体验这里列举了一些建议:

    要最大化演讲者视频或演示视频,请双击该视频流,这将放大视频流的该部分。 使用耳机播放音频,这将有助于理解演讲者的发言,并防止在网络连接过程中出现任何音频反馈。 -请注意提示您允许访问麦克风或摄像头的提示,一旦被拒绝,则需要明确允许访问。请查阅有关在 FirefoxChrome 中允许访问的文档。

    欢迎大家关注 ALC Beijing 公众号

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +请注意提示您允许访问麦克风或摄像头的提示,一旦被拒绝,则需要明确允许访问。请查阅有关在 FirefoxChrome 中允许访问的文档。

    欢迎大家关注 ALC Beijing 公众号

    \ No newline at end of file diff --git a/post/apachecon/apachecon-2020-mandarin-track/index.html b/post/apachecon/apachecon-2020-mandarin-track/index.html index 71cbb0e0..2d3c21f6 100644 --- a/post/apachecon/apachecon-2020-mandarin-track/index.html +++ b/post/apachecon/apachecon-2020-mandarin-track/index.html @@ -1,7 +1,7 @@ -年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名! · ALC Beijing

    年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!

    简介

    ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯1998年,也是在这一届上,开发HTTPD服务的开发者们欢聚一堂,并决定成立 Apache 软件基金会。

    1998年首次ApacheCon大会照片

    [photo attribution (CC BY) Mark Cox. Tagged image at https://www.flickr.com/photos/iamamoose/63963722/in/album-1381277/ ; gallery at https://www.flickr.com/photos/iamamoose/albums/1381277]

    ApacheCon由Apache软件基金会举办,现在是每年举办一次,一般在欧洲或北美举行,是Apache开发者们线下交流、讨论、见面的绝佳机会,也是分享想法、思想激荡的难得的场合。随着计算机技术的发展,ApacheCon每年的议题也在不断的增多,尤其是火热的大数据,干脆分离出来独立开启会议。

    ApacheCon 大会官网:https://apachecon.com/acah2020/index.html。

    2020是特殊的一年,尽管对于Apache的整体开发来说没有什么影响,但是线下交流是无法实现了,毕竟病毒仍在肆虐,只好像其它的大型会议一样,今年选择了在线上举办,线上举办的好处就是加大了更多可能性,比如支持多语言的分论坛,要知道讲中文的议题还是在ApacheCon上头一次出现。如此的机会怎能错过?

    从9月29日到10月1日,会议共持续3天。官方议程已公布,可前往官网查看议题详情。同时,大会免费开放注册,可在Hopin平台报名

    《ApacheCon @Home 2020: Keynote 》

    《Apache Growth in China》

    《Apache 在中国的成长》

    分享时间:2020 年 9 月 29 日,星期二,下午 5:00(北京时间)

    议题简介:在 Apache 基金会 2020 财年报告中,中国是 Apache 软件下载量最大的国家。越来越多的中国创建的开源项目加入 Apache 孵化器,和毕业成顶级项目。吴晟从 2017 年加入 Apache 社区,在这 3 年时间里,他见证了开源文化和 Apache Way 在中国的接受程度逐年提高。越来越多的开发者加入 Apache 社区,成为贡献者、Committer,甚至基金会正式成员。中国企业不再仅仅使用开源项目,也越来越关注对开源项目的贡献和参与。在这个 KeyNote 中,他将分享中国拥抱 Apache 文化和共建 Apache 社区的进展。

    分享嘉宾:吴晟

    吴晟是 tetrate.io 的创始工程师,领导团队建立针对 Service Mesh 和混合云的监控和可观察性分析平台。他是客观性领域、分布式追踪和APM领域的研究员、布道师以及开发者。他是 Apache 软件基金会会员。热爱开源软件和开源文化。 -他创建了 Apache SkyWalking,并任项目 VP 和 PMC 成员,也是 Apache ShardingSphere 的联合创始人以及 PMC 成员。同时,他还是 Apache 孵化器和 Apache APISIX 项目的 PMC 成员。他连续多年被微软、阿里云和腾讯云授予 Microsoft MVP, Alibaba Cloud MVP, Tencent Cloud TVP。

    ApachCon普通话论坛

    本次ApacheCon大会专门设置了普通话演讲论坛(APACHE MANDARIN TRACK),方便国内观众参与。该论坛共邀请12位Apache Member/Contributor、开源人士和工程师,围绕Apache项目、开源等话题展开分享各自的实践与经验。

    目前国内开源项目与社区不断发展壮大,相信本论坛嘉宾的分享会给大家带来更多思考。下面对本论坛议题做下简单介绍,以供诸位参考。如果你想参加本论坛,记得提前注册哟。同时,也附上ApacheCon 2020 参会指南,为了获得更好的参会体验,请确保事先阅读哦。

    议题详情

    《New Apache Members from China, responsibilities and obligations》

    (来自中国的新Apache软件基金会会员,责任与义务)

    分享时间:2020年9月29日,星期二,下午5:30(北京时间)

    议题简介:在新晋的35位ASF Member中有11位来自于中国, 随着越来越多起源自中国的项目从孵化器毕业成为顶级项目, 越来越多的中国人深度参与到Apache基金会的工作中来。 在这个圆桌论坛上, 我们邀请了中国的Apache Member来谈一下他们的开源历程,以及他们对Apache软件基金会和开源世界的责任与义务。

    分享嘉宾:吴晟,潘娟,姜宁,张铎

    吴晟,ASF Member,Apache SkyWalking VP和PMC成员,同时也是Apache ShardingSphere, Apache APISIX和 Apache Incubator的PMC成员。他做为多个来自中国的Apache项目导师,多次在公开会议中发表关于开源的演讲。 +年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名! | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    16 +Sep 2020

    年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!

    简介

    ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯1998年,也是在这一届上,开发HTTPD服务的开发者们欢聚一堂,并决定成立 Apache 软件基金会。

    1998年首次ApacheCon大会照片

    [photo attribution (CC BY) Mark Cox. Tagged image at https://www.flickr.com/photos/iamamoose/63963722/in/album-1381277/ ; gallery at https://www.flickr.com/photos/iamamoose/albums/1381277]

    ApacheCon由Apache软件基金会举办,现在是每年举办一次,一般在欧洲或北美举行,是Apache开发者们线下交流、讨论、见面的绝佳机会,也是分享想法、思想激荡的难得的场合。随着计算机技术的发展,ApacheCon每年的议题也在不断的增多,尤其是火热的大数据,干脆分离出来独立开启会议。

    ApacheCon 大会官网:https://apachecon.com/acah2020/index.html。

    2020是特殊的一年,尽管对于Apache的整体开发来说没有什么影响,但是线下交流是无法实现了,毕竟病毒仍在肆虐,只好像其它的大型会议一样,今年选择了在线上举办,线上举办的好处就是加大了更多可能性,比如支持多语言的分论坛,要知道讲中文的议题还是在ApacheCon上头一次出现。如此的机会怎能错过?

    从9月29日到10月1日,会议共持续3天。官方议程已公布,可前往官网查看议题详情。同时,大会免费开放注册,可在Hopin平台报名

    《ApacheCon @Home 2020: Keynote 》

    《Apache Growth in China》

    《Apache 在中国的成长》

    分享时间:2020 年 9 月 29 日,星期二,下午 5:00(北京时间)

    议题简介:在 Apache 基金会 2020 财年报告中,中国是 Apache 软件下载量最大的国家。越来越多的中国创建的开源项目加入 Apache 孵化器,和毕业成顶级项目。吴晟从 2017 年加入 Apache 社区,在这 3 年时间里,他见证了开源文化和 Apache Way 在中国的接受程度逐年提高。越来越多的开发者加入 Apache 社区,成为贡献者、Committer,甚至基金会正式成员。中国企业不再仅仅使用开源项目,也越来越关注对开源项目的贡献和参与。在这个 KeyNote 中,他将分享中国拥抱 Apache 文化和共建 Apache 社区的进展。

    分享嘉宾:吴晟

    吴晟是 tetrate.io 的创始工程师,领导团队建立针对 Service Mesh 和混合云的监控和可观察性分析平台。他是客观性领域、分布式追踪和APM领域的研究员、布道师以及开发者。他是 Apache 软件基金会会员。热爱开源软件和开源文化。 +他创建了 Apache SkyWalking,并任项目 VP 和 PMC 成员,也是 Apache ShardingSphere 的联合创始人以及 PMC 成员。同时,他还是 Apache 孵化器和 Apache APISIX 项目的 PMC 成员。他连续多年被微软、阿里云和腾讯云授予 Microsoft MVP, Alibaba Cloud MVP, Tencent Cloud TVP。

    ApachCon普通话论坛

    本次ApacheCon大会专门设置了普通话演讲论坛(APACHE MANDARIN TRACK),方便国内观众参与。该论坛共邀请12位Apache Member/Contributor、开源人士和工程师,围绕Apache项目、开源等话题展开分享各自的实践与经验。

    目前国内开源项目与社区不断发展壮大,相信本论坛嘉宾的分享会给大家带来更多思考。下面对本论坛议题做下简单介绍,以供诸位参考。如果你想参加本论坛,记得提前注册哟。同时,也附上ApacheCon 2020 参会指南,为了获得更好的参会体验,请确保事先阅读哦。

    议题详情

    《New Apache Members from China, responsibilities and obligations》

    (来自中国的新Apache软件基金会会员,责任与义务)

    分享时间:2020年9月29日,星期二,下午5:30(北京时间)

    议题简介:在新晋的35位ASF Member中有11位来自于中国, 随着越来越多起源自中国的项目从孵化器毕业成为顶级项目, 越来越多的中国人深度参与到Apache基金会的工作中来。 在这个圆桌论坛上, 我们邀请了中国的Apache Member来谈一下他们的开源历程,以及他们对Apache软件基金会和开源世界的责任与义务。

    分享嘉宾:吴晟,潘娟,姜宁,张铎

    吴晟,ASF Member,Apache SkyWalking VP和PMC成员,同时也是Apache ShardingSphere, Apache APISIX和 Apache Incubator的PMC成员。他做为多个来自中国的Apache项目导师,多次在公开会议中发表关于开源的演讲。 姜宁,ASF Member,华为技术专家。他参与过Apache Camel, Apache CXF, Apache ServiceMix以及 Apache ServiceComb等多个项目。在加入华为之前,他是红帽软件的首席软件工程师,同时他也在FuseSource, IONA以及中航信工作过。 他在QCon北京、架构师峰会上做过有关微服务和分布式系统,以及开源相关演讲。 张铎,ASF Member,小米云平台部专家软件工程师。他是Apache HBase项目的主席,也参与过一些其他的Apache项目,例如Hadoop,Yetus等等。他还是数个Apache孵化器项目的导师,例如Nuttx和Pegasus。 潘娟,京东数科高级 DBA & Apache ShardingSphere PMC,主要负责京东数科分布式数据库开发、数据库运维自动化平台开发等工作。曾负责京东数科数据库自动化平台设计与开发,现专注于Apache ShardingSphere分布式数据库中间件平台的研发。

    《From Web Engineer to Apache APISIX PMC》

    (从Web工程师到Apache APISIX PMC成员)

    分享时间:2020年9月29日,星期二, 下午6:10(北京时间)

    议题简介:在接近6年的 Web 学习过程中,我从开源社区受益颇多,众多的社区资源在帮助自己不断成长!在本次会议中,我将分享自己从一名 Web 工程师到持续参与开源项目的经历,以及加入 Apache APISIX 项目后,感受到的社区风格与文化,以便让更多开发者了解、参与并拥抱开源项目,一起更好地维护社区生态。

    分享嘉宾:琚致远

    琚致远,支流科技工程师,开源网关项目 Apache APISIX PMC,freeCodeCamp中国核心组织者。致力于人人皆可编程,并鼓励更多人参与到开源项目中来。

    《New Features of Apache CarbonData 2.0》

    (Apache CarbonData 2.0 新功能)

    分享时间:2020年9月29日,星期二,下午6:50(北京时间)

    议题简介:今年6月Apache CarbonData发布了2.0版本,相较之前的1.x版本,显著提升了数据接入和数据分析能力,增强了PB级大表索引及多维查询能力,完善了CDC特性支持update,delete和merge功能,重构MV支持多种数据格式等。

    分享嘉宾:蔡强

    蔡强,华为工程师,Apache CarbonData Contributor,10年以上大数据系统研发经验,对Hadoop, Spark和Hive等大数据系统有深刻的理解。作为Apache CarbonData项目初始成员及PMC, 负责入库及索引等特性的核心架构设计。

    《ECharts: could the customization be both easy and highly personalized?》

    (ECharts: 能否同时“使用简单”和“强个性化定制”?)

    分享时间:2020年9月29日,星期二,下午7:30(北京时间)

    议题简介:数据可视化图表库的主要职责是,找到合适的抽象方式,来简化数据可视化的编程。这往往须基于通用案例、易用性、灵活性、可维护性等因素,抽象形成概念和 API,提供给用户来学习和表达。这其中,“开箱即用”式的简便,和个性化强定制能力,如何去共存?本主题分享了 echarts 多年演进中对这些抽象的认知,以及通过“自定义系列”、“系列坐标系组合”等概念设计,来实现个性化图表的案例。

    分享嘉宾:宿爽

    宿爽,百度工程师,Apache ECharts 项目 PPMC。

    《New Feature of Apache ShardingSphere 5.x

    (Apache ShardingSphere 5.x新功能)

    分享时间:2020年9月29日,星期二,下午8:10(北京时间)

    议题简介: @@ -13,7 +13,5 @@ Apache TubeMQ(incubating)是支撑万亿级数据规模的分布式消息队列(MQ)系统,专注于海量数据下的数据传输和存储。与许多开源MQ项目相比,TubeMQ在稳定性,性能和低成本方面具有独特的优势。 本次交流主要介绍大数据场景下数据传输从百亿到万亿量级变化时消息中间件(MQ)所面临的挑战,分析TubeMQ是如何解决这类问题来满足业务需要;同时针对后面TubeMQ发展进行探讨。

    分享嘉宾:张国成

    张国成,腾讯资深研发工程师,可以在 https://github.com/apache/incubator-tubemq了解到他的最新活动。

    《Apache Doris - A fast MPP database for all modern analytics on big data

    (Apache Doris- 一款支持对海量数据进行快速分析的MPP数据库)

    分享时间:2020年9月30日,星期三,下午7:00(北京时间)

    议题简介: Apache Doris(Incubating) 是一款支持对海量数据进行快速分析的MPP数据库。Doris自设计之初,就秉承着极简运维、高效可靠、易学易用的原则,为用户提供全面而高效的海量数据分析能力。自2018年底进入Apache孵化器后,Doris已经发布了5个大版本,接收了来自社区100多位开发者的贡献,并在多加互联网头部企业和垂直领域企业落地和应用。 -本次分享主要包含Doris的发展历程、系统架构、主要特性和应用案例四个部分,帮助听众对Doris有一个全面而具象的认识。同时,本次分享也会介绍刚刚发布的0.13版本以及即将发布的0.14的新特性。在新版本中,我们能看到Doris正在向着批量和实时统一的数仓领域探索,帮助简化企业大数据平台架构。最后我们会介绍Doris社区目前的发展情况,希望能够帮助开发者更方便快捷的加入开源社区。

    分享嘉宾:陈明雨

    陈明雨,百度资深研发工程师,6年分布式系统研发经验,一直专注于分布式可扩展分析型数据库领域,主导参与了 ApacheDoris 从百度开源到进入 Apache 孵化器的全过程,同时也是 ApacheDoris 的 PPMC 成员。

    大会报名

    各位感兴趣的小伙伴,如果你想了解更多Apache项目、了解开源社区动态与大咖交流,赶紧报名啦!这里再同步下ApacheCon大会重要信息,大会举办日期为9月29日-10月1日,共持续3天。官方议程已公布,可前往官网查看议题详情

    免费报名:https://hopin.to/events/apachecon-home -或扫码报名:

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +本次分享主要包含Doris的发展历程、系统架构、主要特性和应用案例四个部分,帮助听众对Doris有一个全面而具象的认识。同时,本次分享也会介绍刚刚发布的0.13版本以及即将发布的0.14的新特性。在新版本中,我们能看到Doris正在向着批量和实时统一的数仓领域探索,帮助简化企业大数据平台架构。最后我们会介绍Doris社区目前的发展情况,希望能够帮助开发者更方便快捷的加入开源社区。

    分享嘉宾:陈明雨

    陈明雨,百度资深研发工程师,6年分布式系统研发经验,一直专注于分布式可扩展分析型数据库领域,主导参与了 ApacheDoris 从百度开源到进入 Apache 孵化器的全过程,同时也是 ApacheDoris 的 PPMC 成员。

    大会报名

    各位感兴趣的小伙伴,如果你想了解更多Apache项目、了解开源社区动态与大咖交流,赶紧报名啦!这里再同步下ApacheCon大会重要信息,大会举办日期为9月29日-10月1日,共持续3天。官方议程已公布,可前往官网查看议题详情

    免费报名:https://hopin.to/events/apachecon-home +或扫码报名:

    \ No newline at end of file diff --git a/post/apachecon/cocasia-2023-conference-meterials/index.html b/post/apachecon/cocasia-2023-conference-meterials/index.html index d8a69611..5c07c2d9 100644 --- a/post/apachecon/cocasia-2023-conference-meterials/index.html +++ b/post/apachecon/cocasia-2023-conference-meterials/index.html @@ -1,5 +1,4 @@ -CommunityOverCode Asia 2023 会议资料汇总 · ALC Beijing

    CommunityOverCode Asia 2023 会议资料汇总

    本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频以及会议演讲材料的下载信息。

    详细的会议日程,大家可以查看: https://apachecon.com/acasia2023/zh/tracks.html 

    主题演讲Keynote

    API 微服务

    DataOps

    孵化器

    OLAP

    RPC

    Web Server/Tomcat

    云原生

    人工智能/机器学习

    开源社区

    性能工程

    数据存储与计算

    数据湖/数据仓库

    流处理

    消息系统

    工业物联网

    通用

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +CommunityOverCode Asia 2023 会议资料汇总 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    23 +Sep 2023

    CommunityOverCode Asia 2023 会议资料汇总

    本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频以及会议演讲材料的下载信息。

    详细的会议日程,大家可以查看: https://apachecon.com/acasia2023/zh/tracks.html 

    主题演讲Keynote

    API 微服务

    DataOps

    孵化器

    OLAP

    RPC

    Web Server/Tomcat

    云原生

    人工智能/机器学习

    开源社区

    性能工程

    数据存储与计算

    数据湖/数据仓库

    流处理

    消息系统

    工业物联网

    通用

    \ No newline at end of file diff --git a/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/index.html b/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/index.html index e5d8bf60..5fb20c20 100644 --- a/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/index.html +++ b/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/index.html @@ -1,8 +1,8 @@ -开源贡献难吗? · ALC Beijing

    开源贡献难吗?

    在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这一主题演讲。 +开源贡献难吗? | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    04 +Oct 2023

    开源贡献难吗?

    在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这一主题演讲。

    主题演讲视频

    我目前就职于字节跳动流式计算团队,负责 SQL 引擎的研发工作;我的社区贡献经历主要包括 Apache Flink 和 Calcite 两个项目,我是从19 年开始参与 Flink 社区,有幸在20年6月受邀成为committer;然后是在22年3月开始参与 Calcite 社区,并且在23年1月受邀成为 PMC 成员。 [图片]

    为了准备这个talk,我还专门问了很多同事、和朋友,参与开源贡献有哪些难点,很多人的反应都是工作那么忙,哪有时间参与开源;参与社区门槛太高,不知道怎么开始。我总结下来主要是这三个问题,一般没有开始参与的同学会感觉没有时间参与、开始尝试参与贡献的又会觉得社区的门槛很高、贡献了一段时间之后发现社区对自己响应太慢,坚持不下来;而我自己在参与开源的过程中对这几个难点也是深有体会,接下来我就结合自己的开源经历给大家分享一下我是怎么克服这些困难,最终参与到社区里的。

    “没有时间”是很多人面临的第一个问题,我自己也是一样的。

    我最开始参与开源是在19年的下半年,当时正是我们在字节内部在推广使用 Flink SQL 的时候,本来内部业务就很忙,白天根本就没有时间,我就利用午休、晚上下班后还有周末的时间了解一些社区的进展,做一些力所能及的事情。我印象很深刻的是,那时候 Flink 社区里的邮件特别多(当然现在也很多),每天有 50-100 封邮件,根本就看不完,我那时候还在手机装上了 google 邮箱客户端,每天在坐地铁的时候也会看一下邮件,了解一下社区的最新进展。

    参与了一段时间后我意外的发现,我经常会在晚上十一二点的时候还会收到 review 评论,原来社区里很多人也都是在业余时间参与。有好几次,晚上临睡觉之前收到了review回复之后,兴奋的睡不着,就爬进来继续改代码,直到把代码push上去才睡得着。当最终看到自己的工作被社区认可,被合并到主分支的时候,是特别开心的,非常有成就感。

    其实参与进去之后,时间问题其实就不是问题了,因为我在社区里的工作,很多时候都可以反哺到我的工作。

    比如好几次,都是因为我在社区里帮别人解答了一些问题之后,在内部用户也遇到了相同的问题,我就可以很快的帮用户解决掉了;而且很多时候我们在内部解决一些问题的时候,由于对系统还不够了解,所以也拿不准解决方案合不合理,这时候我们也会把问题抛到社区里,可以有更资深的同学帮我们把关;甚至于有几次,我们自己碰到了自己完全解决不了的问题,抛到社区里之后也是很快就有人帮我们解决了。就感觉自己好像又多了一个强大的虚拟团队。内部工作变的更轻松之后,就可以跟参与社区形成互补,也可以把一些工作节省出来的时间投入到参与社区工作中。

    另外,根据我们团队多年的经验来讲,能够做大upstream first才是成本最低的方式。什么叫upstream first呢,就是我们在对开源软件进行修改的时候,优先把这些改动贡献到上游项目中,而不是只在自己fork的版本中进行修改。这样我们内部开发和开源社区的开发就可以形成合力,不需要在每个版本进行适配,从长期来看才是成本最低的方式。 -所以不管是对个人还是对团队,能够参与到开源社区,都是非常有价值的。

    其实参与社区久了之后,就会感觉参与社区反而是一件很轻松愉快的事,就跟我们大学的时候刷论坛一样,没事就去刷一下看看有没有什么有意思的事情。我跟很多有长期参与开源社区经历的朋友聊,很多人都有类似的感受。尤其是在工作遇到了困难搞不定了,或者工作累了想休息一下的时候,就到社区里去放松放松。如果工作的过程是一个放电的过程,那么参与开源的过程反而就是一个充电的过程。对,不光二舅可以治疗精神内耗,开源也可以治疗精神内耗。

    门槛高也是很多同学在参与开源的时候遇到的经常遇到的问题。

    一方面社区的工作模式跟我们平时的工作模式很不一样,需要一个适应的过程,比如需要怎么用邮件列表交流、还需要用英语、很多时候刚进入到社区看到很多问题也看不懂,也不知道那些issue适合新手做;另一方面,有很多项目,有比较深的背景知识,入门曲线比较陡峭,代码量也非常高,动不动就上百万行。

    刚刚也提到了,我一开始参与 Flink 社区的时候,也是先订阅了社区的邮件列表。那时候每天盯着上百封邮件,大部分也看不懂;也看到很多人在创建新的issue,但是感觉也不会做。感觉社区离自己很遥远。而且 google 邮箱底下有一个空间提示,它有 15G 的免费空间,我天天看着这个数字,我就经常在想,每天这么多邮件,我有没有可能在我的邮箱空间用满之前拿到社区的committer呢?

    后来有一个周日,我早上起来之后习惯性的打开电脑,查看一下社区的邮件。我就看到有个人外国的小哥提了一个关于 streaming join 原理的问题,而且是提了好几天了还没有人回复,他又重新提了一下。这个问题相对来讲还是比较底层,对当时的我来说还是很具有挑战性的,而且正好我对这个问题也很感兴趣。然后我就想我是不是可以去看看这部分代码,帮解答一下这个问题。然后我就马上开始研究这部分代码,花了两个多小时的时间,终于赶在午饭之前搞懂了这个问题,然后赶紧去社区里回答了一下。(当时在看的过程中内心里还一直在想,社区的大佬们你们千万不要在这个时候回复了,要不然我的功夫就白费了。)后面我的回答也得到了 Flink PMC 云邪老师的认可,这让我开心了好几天,所以那个周末过的特别的愉快。

    通过这件事之后,我发现,虽然进入社区是有一些门槛,但是只要用对了方法,通过具体问题参与进去,也就没有很难了。后面我就按照这种方式,积极的参与到更多的问题里面,很快就收到了云邪老师发来的鼓励邮件,同时也给了我一些指导意见,比如让我多多参与到更多的事情中,比如可以帮其它人review代码、参与一些更大的功能的开发贡献中。当时这封邮件给了我很大的鼓舞,让我有了持续参与下去的动力。

    后面我也参与了一些代码review的工作,尤其是对着当时社区的pmc成员鲁尼、云邪的代码一通review,有一点初生牛肚不怕虎的感觉。其实我发现,只要是你提的建议是合理的,其实大家就会接受,在这个层面上,大家都是contributor,都是平等的。所以大家在参与社区的时候可以大胆一些,自信一些。

    后面在我在搞清楚了 Flink SQL 的原理之后,也了解到其实它背后还有一个项目是 Calcite,SQL 的很多核心工作都是用 Calcite 去完成的,包括像 SQL 的解析、优化等等。然后我就自己开始有针对性的学习 Calcite 的原理,但是学了一段时间之后,我发现 Calcite 的很多核心原理还是挺难搞懂的,一个人学习缺乏交流反馈,很多时候理解的不够深刻,也很容易忘记。

    后来机缘巧合,参与到了 Calcite 社区,在社区里跟大家交流切磋,也快速提升了我对整个项目的理解。这个机缘巧合的故事是这样的:

    在22年春天的时候,因为特殊原因我开启了一段一个人在酒店里“封闭开发”的经历。 到了周末的时候,非常的无聊,我就在浏览 Calcite 社区邮件的时候,就发现了有一个人报了一个关于json 嵌套函数的bug,但是没有人修,然后我就想着反正我也没事,就尝试着帮忙解决一下,正好可以找点事做。没有想到,这个 PR 竟然在不到一个小时内就被 merge 了。受到这种热情的感染,我就开启了我的 Calcite 贡献之路。

    参与进去之后,我就发现其实到社区里跟各种大牛直接讨论和学习,才是学习技术最快的方式。

    比如像calcite项目的发起人 Julian,他有30多年的数据库领域的经验,他也是很多项目的 PMC 成员以及 Apache 的正式成员,在 SQL 领域有非常深厚的造诣,而且还参与过一些 SQL 标准的制定。而且最关键的是他现在仍然非常的活跃,我几乎每天包括周末都能看到他在社区里活跃,指导新同学,也会自己写代码。

    像这种大牛,在我们平时工作中是很难接触到的,但是在开源社区,只要你参与进来,就可以马上跟这些大牛直接交流和学习。

    有些同学在参与开源贡献的时候,有时候也会遇到“响应慢”的问题,比如为什么我提了代码没有人给我review;为什么我问了一个问题没有人回答;为什么我创建了一个Jira没有人响应。

    通常响应慢有两方面原因,一方面是社区打开的姿势不对,比如问题说的很不清楚,或者问的问题太大了别人不知道怎么回复,例如为什么报错了,为什么结果不对,比较好的方式是把问题说的越具体越好,最好是能让别人复现你说的问题。

    另一方面呢,因为社区也是由志愿者在维护,人力也是有限的,有时候也很难对每个问题都响应的很及时。像calcite这样的社区,背后没有直接对应的商业化公司,其实是很缺人的,大家也都是在用业余时间维护开源项目,精力有限; 但是我们也很重视吸收新的contributor,所以我们会在每个季度给基金会的报告里面,把帮别人review 合并代码比较多的人给列出来,作为一项单独的奖励。

    我在社区拿到 committer 之后,也是把更多的精力放到了辅导社区其他contributor上,而不是自己开发代码。可以看到我在成为接下来的连续4个季度中,都出现在了top reviewer列表中。其中还有一个季度竟然超过了Julian,我也是后来才知道原来那个季度 Julian 去过圣诞节了,看来想超越大牛并不是一件容易的事。

    有时候慢反而也是一种优势,可以让我们把工作打磨的更好,思考的更清楚。 比如我在 CALCITE-5127 这个issue上,前后花了5个多月的时间才最终把代码合入,中间代码方案换了好几次,Jira comment 数量多大 50 多个。这个过程其实也是一个很好的跟社区展示我们的能力的时候,包括沟通、耐心、技术深度、对项目的关心等等,其实这个issue对我后面提名成为 PMC 成员也是有很大帮助的。

    另外就是,社区的工作都是基于相互之间的信任,参与的越多,大家越了解你,对你的信任越多,响应也会更快。所以还是要多多参与,来赢得大家的信任。

    参与社区的确是存在很多的困难,我这一路走来,我总结我能够长期坚持参与社区的动力:可以近距离接触到大牛,跟该领域里最权威的一批人直接对话,获得最快的学习速度,少走弯路;还有很重要的一点就是,我会感觉自己的工作在开源里面的影响范围更广、价值更大。像我们平时在工作中写的代码作用范围就是公司内部;而贡献到开源社区的代码可以影响到所有使用这个项目的地方,分布在全球各地;而我们在公司内的代码生命周期一般也就几年;但是在开源社区的代码生命周期可以到几十年甚至更久,比如 calcite 项目的代码其实就有二十多年的历史了,而且还会存在更久,被越来越多的项目使用到。

    这张图展示的是 apache committer 的数量,可以看到,apache committer的数量每年都在保持比较稳定的增长,越来越多的人加入到开源大家庭里来了。

    万事开头难,而最好的克服困难的方法最好的方法就是行动;所以如果你也有兴趣参与到开源贡献的队伍中,不要犹豫,马上开始行动起来吧

    最后希望我的开源小故事可以在大家心里种下一颗小小的开源种子!

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +所以不管是对个人还是对团队,能够参与到开源社区,都是非常有价值的。

    其实参与社区久了之后,就会感觉参与社区反而是一件很轻松愉快的事,就跟我们大学的时候刷论坛一样,没事就去刷一下看看有没有什么有意思的事情。我跟很多有长期参与开源社区经历的朋友聊,很多人都有类似的感受。尤其是在工作遇到了困难搞不定了,或者工作累了想休息一下的时候,就到社区里去放松放松。如果工作的过程是一个放电的过程,那么参与开源的过程反而就是一个充电的过程。对,不光二舅可以治疗精神内耗,开源也可以治疗精神内耗。

    门槛高也是很多同学在参与开源的时候遇到的经常遇到的问题。

    一方面社区的工作模式跟我们平时的工作模式很不一样,需要一个适应的过程,比如需要怎么用邮件列表交流、还需要用英语、很多时候刚进入到社区看到很多问题也看不懂,也不知道那些issue适合新手做;另一方面,有很多项目,有比较深的背景知识,入门曲线比较陡峭,代码量也非常高,动不动就上百万行。

    刚刚也提到了,我一开始参与 Flink 社区的时候,也是先订阅了社区的邮件列表。那时候每天盯着上百封邮件,大部分也看不懂;也看到很多人在创建新的issue,但是感觉也不会做。感觉社区离自己很遥远。而且 google 邮箱底下有一个空间提示,它有 15G 的免费空间,我天天看着这个数字,我就经常在想,每天这么多邮件,我有没有可能在我的邮箱空间用满之前拿到社区的committer呢?

    后来有一个周日,我早上起来之后习惯性的打开电脑,查看一下社区的邮件。我就看到有个人外国的小哥提了一个关于 streaming join 原理的问题,而且是提了好几天了还没有人回复,他又重新提了一下。这个问题相对来讲还是比较底层,对当时的我来说还是很具有挑战性的,而且正好我对这个问题也很感兴趣。然后我就想我是不是可以去看看这部分代码,帮解答一下这个问题。然后我就马上开始研究这部分代码,花了两个多小时的时间,终于赶在午饭之前搞懂了这个问题,然后赶紧去社区里回答了一下。(当时在看的过程中内心里还一直在想,社区的大佬们你们千万不要在这个时候回复了,要不然我的功夫就白费了。)后面我的回答也得到了 Flink PMC 云邪老师的认可,这让我开心了好几天,所以那个周末过的特别的愉快。

    通过这件事之后,我发现,虽然进入社区是有一些门槛,但是只要用对了方法,通过具体问题参与进去,也就没有很难了。后面我就按照这种方式,积极的参与到更多的问题里面,很快就收到了云邪老师发来的鼓励邮件,同时也给了我一些指导意见,比如让我多多参与到更多的事情中,比如可以帮其它人review代码、参与一些更大的功能的开发贡献中。当时这封邮件给了我很大的鼓舞,让我有了持续参与下去的动力。

    后面我也参与了一些代码review的工作,尤其是对着当时社区的pmc成员鲁尼、云邪的代码一通review,有一点初生牛肚不怕虎的感觉。其实我发现,只要是你提的建议是合理的,其实大家就会接受,在这个层面上,大家都是contributor,都是平等的。所以大家在参与社区的时候可以大胆一些,自信一些。

    后面在我在搞清楚了 Flink SQL 的原理之后,也了解到其实它背后还有一个项目是 Calcite,SQL 的很多核心工作都是用 Calcite 去完成的,包括像 SQL 的解析、优化等等。然后我就自己开始有针对性的学习 Calcite 的原理,但是学了一段时间之后,我发现 Calcite 的很多核心原理还是挺难搞懂的,一个人学习缺乏交流反馈,很多时候理解的不够深刻,也很容易忘记。

    后来机缘巧合,参与到了 Calcite 社区,在社区里跟大家交流切磋,也快速提升了我对整个项目的理解。这个机缘巧合的故事是这样的:

    在22年春天的时候,因为特殊原因我开启了一段一个人在酒店里“封闭开发”的经历。 到了周末的时候,非常的无聊,我就在浏览 Calcite 社区邮件的时候,就发现了有一个人报了一个关于json 嵌套函数的bug,但是没有人修,然后我就想着反正我也没事,就尝试着帮忙解决一下,正好可以找点事做。没有想到,这个 PR 竟然在不到一个小时内就被 merge 了。受到这种热情的感染,我就开启了我的 Calcite 贡献之路。

    参与进去之后,我就发现其实到社区里跟各种大牛直接讨论和学习,才是学习技术最快的方式。

    比如像calcite项目的发起人 Julian,他有30多年的数据库领域的经验,他也是很多项目的 PMC 成员以及 Apache 的正式成员,在 SQL 领域有非常深厚的造诣,而且还参与过一些 SQL 标准的制定。而且最关键的是他现在仍然非常的活跃,我几乎每天包括周末都能看到他在社区里活跃,指导新同学,也会自己写代码。

    像这种大牛,在我们平时工作中是很难接触到的,但是在开源社区,只要你参与进来,就可以马上跟这些大牛直接交流和学习。

    有些同学在参与开源贡献的时候,有时候也会遇到“响应慢”的问题,比如为什么我提了代码没有人给我review;为什么我问了一个问题没有人回答;为什么我创建了一个Jira没有人响应。

    通常响应慢有两方面原因,一方面是社区打开的姿势不对,比如问题说的很不清楚,或者问的问题太大了别人不知道怎么回复,例如为什么报错了,为什么结果不对,比较好的方式是把问题说的越具体越好,最好是能让别人复现你说的问题。

    另一方面呢,因为社区也是由志愿者在维护,人力也是有限的,有时候也很难对每个问题都响应的很及时。像calcite这样的社区,背后没有直接对应的商业化公司,其实是很缺人的,大家也都是在用业余时间维护开源项目,精力有限; 但是我们也很重视吸收新的contributor,所以我们会在每个季度给基金会的报告里面,把帮别人review 合并代码比较多的人给列出来,作为一项单独的奖励。

    我在社区拿到 committer 之后,也是把更多的精力放到了辅导社区其他contributor上,而不是自己开发代码。可以看到我在成为接下来的连续4个季度中,都出现在了top reviewer列表中。其中还有一个季度竟然超过了Julian,我也是后来才知道原来那个季度 Julian 去过圣诞节了,看来想超越大牛并不是一件容易的事。

    有时候慢反而也是一种优势,可以让我们把工作打磨的更好,思考的更清楚。 比如我在 CALCITE-5127 这个issue上,前后花了5个多月的时间才最终把代码合入,中间代码方案换了好几次,Jira comment 数量多大 50 多个。这个过程其实也是一个很好的跟社区展示我们的能力的时候,包括沟通、耐心、技术深度、对项目的关心等等,其实这个issue对我后面提名成为 PMC 成员也是有很大帮助的。

    另外就是,社区的工作都是基于相互之间的信任,参与的越多,大家越了解你,对你的信任越多,响应也会更快。所以还是要多多参与,来赢得大家的信任。

    参与社区的确是存在很多的困难,我这一路走来,我总结我能够长期坚持参与社区的动力:可以近距离接触到大牛,跟该领域里最权威的一批人直接对话,获得最快的学习速度,少走弯路;还有很重要的一点就是,我会感觉自己的工作在开源里面的影响范围更广、价值更大。像我们平时在工作中写的代码作用范围就是公司内部;而贡献到开源社区的代码可以影响到所有使用这个项目的地方,分布在全球各地;而我们在公司内的代码生命周期一般也就几年;但是在开源社区的代码生命周期可以到几十年甚至更久,比如 calcite 项目的代码其实就有二十多年的历史了,而且还会存在更久,被越来越多的项目使用到。

    这张图展示的是 apache committer 的数量,可以看到,apache committer的数量每年都在保持比较稳定的增长,越来越多的人加入到开源大家庭里来了。

    万事开头难,而最好的克服困难的方法最好的方法就是行动;所以如果你也有兴趣参与到开源贡献的队伍中,不要犹豫,马上开始行动起来吧

    最后希望我的开源小故事可以在大家心里种下一颗小小的开源种子!

    \ No newline at end of file diff --git a/post/apachecon/cocasia-2023-why-do-we-host-cocasia/index.html b/post/apachecon/cocasia-2023-why-do-we-host-cocasia/index.html index 5271a5b5..11c6cf3d 100644 --- a/post/apachecon/cocasia-2023-why-do-we-host-cocasia/index.html +++ b/post/apachecon/cocasia-2023-why-do-we-host-cocasia/index.html @@ -1,12 +1,33 @@ -从参会到办会的入’坑’指南 · ALC Beijing

    从参会到办会的入’坑’指南

    在CommunityOverCode Asia 2023的闪电演讲中, 姜宁花5分钟总结了他与ApacheCon之间的故事以及收获, 也解释了为什么能够坚持三年办会的原因。

    是什么原因支撑着我办Apache大会,这需要从我参加的Apache活动讲起。

    2007年我第一次参加ApacheCon, 见到了很多只在email里面沟通的大牛,体验了会前的hackthon,在两天时间里和大牛思想碰撞,当时给Apache Camel提交了负载均衡的代码。尝试了边喝啤酒边写代码简单而纯粹的快乐!

    2009年在北京中关村,融科,Intel 研发中心,参加 Apache 北京路演,第一次听到Hadoop, 天使投资, 见到的著名的陈绪同学,近距离在家门口感受到了开源的氛围。 -另外2006年 ApacheCon Asia 第一次大会是在斯里兰卡召开的。

    2010年在上海,复旦大学,张江校区,两天的 Apache 路演大会, +从参会到办会的入’坑’指南 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    25 +Sep 2023

    从参会到办会的入’坑’指南

    在CommunityOverCode Asia 2023的闪电演讲中, 姜宁花5分钟总结了他与ApacheCon之间的故事以及收获, 也解释了为什么能够坚持三年办会的原因。

    是什么原因支撑着我办Apache大会,这需要从我参加的Apache活动讲起。

    2007年我第一次参加ApacheCon, 见到了很多只在email里面沟通的大牛,体验了会前的hackthon,在两天时间里和大牛思想碰撞,当时给Apache Camel提交了负载均衡的代码。尝试了边喝啤酒边写代码简单而纯粹的快乐!

    2009年在北京中关村,融科,Intel 研发中心,参加 Apache 北京路演,第一次听到Hadoop, 天使投资, 见到的著名的陈绪同学,近距离在家门口感受到了开源的氛围。 +另外2006年 ApacheCon Asia 第一次大会是在斯里兰卡召开的。

    2010年在上海,复旦大学,张江校区,两天的 Apache 路演大会, 当时公司支持开发同学外出演讲对外发声,于是我报名参加大会做了有关Camel的演讲,同时顺道参观的上海世博,还赢了一台iPad。 -照片是 Freeman, Niclas Hedhman 和当时去健身房减了十斤的我, 满满的胶原蛋白吧!

    2015年 北京,中关村,科学院大学,开源社主办的 Apache China 路演会议 +照片是 Freeman, Niclas Hedhman 和当时去健身房减了十斤的我, 满满的胶原蛋白吧!

    2015年 北京,中关村,科学院大学,开源社主办的 Apache China 路演会议 这是其中一个圆桌论坛,微软C#/TypeScript 之父 Anders Hejlsberg , Niclas Hedhman 会后大家一起合影, 这是韩卿,我,梁辰晔(之后成为华为的同事), 赵生宇(19年再次见面,开启了更多的合作), 通过大会结识了很多小伙伴,在后续的开源道路上相互协作。

    2017年, 这是时隔10年之后, 终于能够再次参加Apache北美大会,这次的会议的目的地是Miami,当时参会的主要目的是帮助ServiceComb寻找孵化导师。 可以看到 Rich, Justin, 阿里的同学,张乎兴,王晓瑞, 冯嘉。 当然也少不了啤酒, 当时正好和Mark Tomas 聊天。

    借 18年,19年的 HuaweiConnect 大会,邀请到了 ASF的 Craig, Roman, Justin访华,组织和国内的 Apache 开发者见面。 取得成果是 2018年 推动了 ShardingSphere 进入ASF孵化,2019年 推动 APISIX 进入ASF孵化。 -当时和Craig就有聊过在中国办大会的想法,但是因为没有办过大会,心里还是没有底,还没有真正付诸行动。

    时间一下子跳到2019年,在清华举行的开源之道大讲堂,后来我现在字节的同事罗广明写了一篇文章专门提起了这件事, 冥冥之中开源和Apache把我们连接在了一起。

    中间两年因为签证的原因没能参加 ApacheCon 北美大会,于是开始也在思考能不能在家门口办这样的大会。

    2020年的时候发起了 ALC Beijing,8月份这是我们的第一次线下聚会,聚会的题目是 做开源到底有多难? 在我看来在这么多ASF 项目的开发者,有ALC Beijing成员的帮助下, 在国内推广开源不再那么困难了。 有趣的点是那时和思否的小伙伴结识,一起共谋大事, 大家看到波波了吗?

    于是从2021开始,我们连续举办了三界 ASF 亚洲大会,这也就有了我们今天这次演讲!

    在此我们要感谢我们大会的组织者和志愿者团队, 没有大家的支持和帮助我是不可能坚持下来。

    最后终结一下:

    • 这是非常奇妙的经历, 通过参加 Apache Event 可以结识很多开源志同道合小伙伴!
    • 从参会到办会体会到了 Community 的力量,
    • 和一群志同道合的小伙伴一同达成之前想都没有想过的目标。
    • 虽然有些时候会辛苦一些,但是所有这些付出都是值得的!

    祝愿各位在今天的大会上能结识到更多志同道合,共同成长的小伙伴!

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +当时和Craig就有聊过在中国办大会的想法,但是因为没有办过大会,心里还是没有底,还没有真正付诸行动。

    时间一下子跳到2019年,在清华举行的开源之道大讲堂,后来我现在字节的同事罗广明写了一篇文章专门提起了这件事, 冥冥之中开源和Apache把我们连接在了一起。

    中间两年因为签证的原因没能参加 ApacheCon 北美大会,于是开始也在思考能不能在家门口办这样的大会。

    2020年的时候发起了 ALC Beijing,8月份这是我们的第一次线下聚会,聚会的题目是 做开源到底有多难? 在我看来在这么多ASF 项目的开发者,有ALC Beijing成员的帮助下, 在国内推广开源不再那么困难了。 有趣的点是那时和思否的小伙伴结识,一起共谋大事, 大家看到波波了吗?

    于是从2021开始,我们连续举办了三界 ASF 亚洲大会,这也就有了我们今天这次演讲!

    在此我们要感谢我们大会的组织者和志愿者团队, 没有大家的支持和帮助我是不可能坚持下来。

    最后终结一下:

    • 这是非常奇妙的经历, 通过参加 Apache Event 可以结识很多开源志同道合小伙伴!
    • 从参会到办会体会到了 Community 的力量,
    • 和一群志同道合的小伙伴一同达成之前想都没有想过的目标。
    • 虽然有些时候会辛苦一些,但是所有这些付出都是值得的!

    祝愿各位在今天的大会上能结识到更多志同道合,共同成长的小伙伴!

    \ No newline at end of file diff --git a/post/asf_incubator_process/index.html b/post/asf_incubator_process/index.html index db3600b8..f461c211 100644 --- a/post/asf_incubator_process/index.html +++ b/post/asf_incubator_process/index.html @@ -1,6 +1,6 @@ -为何Apache软件基金会能孵化出如此多成功的开源项目 · ALC Beijing

    为何Apache软件基金会能孵化出如此多成功的开源项目

    ASF基金会的项目来源分为个人捐献项目和公司捐献项目。这两者在进入Apache基金会之后,并不做过多的区分。总体而言,虽然很多传奇的开源项目有个人英雄主义色彩,但也不乏有很多公司捐献的项目获得了巨大的成功(Hadoop, Spark, Kafka等)。那么问题来了,为什么ASF需要设置孵化器项目呢?

    孵化器项目的必要性

    ASF基金会有统一的开源治理原则与规则(被称为Apache Way, 具体请参考:https://www.apache.org/theapacheway) +为何Apache软件基金会能孵化出如此多成功的开源项目 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    16 +Apr 2020

    为何Apache软件基金会能孵化出如此多成功的开源项目

    ASF基金会的项目来源分为个人捐献项目和公司捐献项目。这两者在进入Apache基金会之后,并不做过多的区分。总体而言,虽然很多传奇的开源项目有个人英雄主义色彩,但也不乏有很多公司捐献的项目获得了巨大的成功(Hadoop, Spark, Kafka等)。那么问题来了,为什么ASF需要设置孵化器项目呢?

    孵化器项目的必要性

    ASF基金会有统一的开源治理原则与规则(被称为Apache Way, 具体请参考:https://www.apache.org/theapacheway) 来保障开源软件的质量以及开源社区的健康发展。而企业和个人捐献的项目可能五花八门,从而产生巨大的Gap。这个差距可能会包括:开发流程,基础设施支撑,社区文化,代码质量,文档质量等方面,因此需要经历孵化期来加以改进或者调整来达到基金会的基本要求。 除此之外,项目的贡献者从单一公司/个人贡献过渡到多元化的社区贡献需要一个过程。罗马不是一天建成的,让外部开发者了解开源项目的使用以及有兴趣和意愿参与进来,需要不断通过各种形式(技术会议,邮件组讨论,技术媒体文章等等)做社区推广。 最重要的是,由于捐献的项目可能会涉及到第三方的代码及知识产权,在孵化器阶段,知识产权(IP)和软件许可(License)需要进行统一的规范化,从而确保最终用户可以放心使用,不必有后顾之忧。

    了解为项目设定孵化器阶段的必要性之后,我们就很容易理解每个项目在孵化阶段需要达成的目标。

    项目在孵化阶段的目标

    1. 确保孵化器项目的组织架构以及日常运营能符合基金会统一的原则以及流程
    2. 确保捐献的项目的IP以及法律相关问题能在一个合适的时间和平台上得到关注、帮助以及充分解决
    3. 确保项目以及项目背后的社区的成长与推广符合基金会的目标
    4. 确保项目的成熟、毕业以及被基金会统一背书有统一的标准

    在正式介绍孵化流程之前,笔者还想先介绍一下ASF孵化项目最重要的角色之一,就是导师(Mentor)。

    孵化器项目导师的角色与职能

    Apache软件基金会所定义的导师职能如下: @@ -17,6 +17,4 @@ 接口人(Champion)使命完成 导师接手项目相关的准备工作,包括创建邮件列表,代码托管账号,项目进度跟踪系统,项目主页等 推动项目的初始核心贡献者 - Committer,来签署个人贡献者协议,创建相应的账号以及权限 -通过软件授权将代码捐献给基金会,并置放于代码托管平台的指定位置

    在孵化阶段的后期,Incubator社区需要按照项目的实际情况投票决定项目从孵化器毕业或退出,评价标准主要在于两条:

    1. 项目是否增加其贡献者的多样性
    2. 项目是否能很好的按照基金会制定的精英规则(https://www.apache.org/foundation/how-it-works.html#meritocracy)运转

    而并不是看项目当前有多成功或是多有影响力(因为成功与影响力一方面比较主观,另一方面很容易随时间变化)。

    这里需要理解ASF设置Incubator阶段是为了保障项目的长远发展以及最终用户的利益,因为多样性可以:

    1. 为项目的长期发展提供了稳定性:来自同一家公司或组织的开发者同时一起离开项目的几率,要远大于各个分散在不同公司或组织的开发者个体
    2. 多样性为项目提供了更丰富的技术愿景:从实际情况来看,多样化的社区能更好地满足来自不同用户的需求,进而发挥软件的全部潜力,促进软件的实际使用

    理解了孵化阶段的整体流程,自然就好理解ASF项目在经历孵化阶段所需要的具体工作内容,大致如下:

    • 为项目创建相应的社区网站(在apache.org域名之下)与入口
    • 在基金会的框架和规范下,按照社区规范来协同开发代码与文档,以及发布软件与优化编译流程
    • 通过加入更多新的核心贡献者(committer)来让社区成长
    • 建立开放透明的讨论与沟通机制(邮件组,JIRA等开放的平台),确保一切决策都在阳光下
    • 代码持续优化以及确保知识产权符合要求
    • 对第三方代码进行相应的授权许可

    最后,成功的开源项目最重要的因素就是:社区,社区,社区!(重要的事情说三遍)。有优秀的人,才能构建优秀的项目。为了保障项目能尽可能的构建好开发者社区,在孵化阶段,有经验的导师会重点辅导和监督以下几件事来保障社区的健康发展:

    • 通过社区邮件组进行公开、透明的沟通以及决策
    • 项目对各个厂商的中立性需要得到保证(即没有收到少数公司的商业利益影响)
    • 欢迎所有新加入社区的贡献者,包括引入更多的核心贡献者,确保用户的问题得到回答与解决

    关于Apache基金会项目孵化的更多问题,可以参考ASF Incubator项目文档官网(http://incubator.apache.org/),也欢迎发信联系本文作者 (<junping_du AT apache.org> 堵俊平)。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +通过软件授权将代码捐献给基金会,并置放于代码托管平台的指定位置

    在孵化阶段的后期,Incubator社区需要按照项目的实际情况投票决定项目从孵化器毕业或退出,评价标准主要在于两条:

    1. 项目是否增加其贡献者的多样性
    2. 项目是否能很好的按照基金会制定的精英规则(https://www.apache.org/foundation/how-it-works.html#meritocracy)运转

    而并不是看项目当前有多成功或是多有影响力(因为成功与影响力一方面比较主观,另一方面很容易随时间变化)。

    这里需要理解ASF设置Incubator阶段是为了保障项目的长远发展以及最终用户的利益,因为多样性可以:

    1. 为项目的长期发展提供了稳定性:来自同一家公司或组织的开发者同时一起离开项目的几率,要远大于各个分散在不同公司或组织的开发者个体
    2. 多样性为项目提供了更丰富的技术愿景:从实际情况来看,多样化的社区能更好地满足来自不同用户的需求,进而发挥软件的全部潜力,促进软件的实际使用

    理解了孵化阶段的整体流程,自然就好理解ASF项目在经历孵化阶段所需要的具体工作内容,大致如下:

    • 为项目创建相应的社区网站(在apache.org域名之下)与入口
    • 在基金会的框架和规范下,按照社区规范来协同开发代码与文档,以及发布软件与优化编译流程
    • 通过加入更多新的核心贡献者(committer)来让社区成长
    • 建立开放透明的讨论与沟通机制(邮件组,JIRA等开放的平台),确保一切决策都在阳光下
    • 代码持续优化以及确保知识产权符合要求
    • 对第三方代码进行相应的授权许可

    最后,成功的开源项目最重要的因素就是:社区,社区,社区!(重要的事情说三遍)。有优秀的人,才能构建优秀的项目。为了保障项目能尽可能的构建好开发者社区,在孵化阶段,有经验的导师会重点辅导和监督以下几件事来保障社区的健康发展:

    • 通过社区邮件组进行公开、透明的沟通以及决策
    • 项目对各个厂商的中立性需要得到保证(即没有收到少数公司的商业利益影响)
    • 欢迎所有新加入社区的贡献者,包括引入更多的核心贡献者,确保用户的问题得到回答与解决

    关于Apache基金会项目孵化的更多问题,可以参考ASF Incubator项目文档官网(http://incubator.apache.org/),也欢迎发信联系本文作者 (<junping_du AT apache.org> 堵俊平)。

    \ No newline at end of file diff --git a/post/call_for_volunteer/index.html b/post/call_for_volunteer/index.html index e3178757..b3618f79 100644 --- a/post/call_for_volunteer/index.html +++ b/post/call_for_volunteer/index.html @@ -1,9 +1,7 @@ -ALC Beijing 志愿者招募 · ALC Beijing

    ALC Beijing 志愿者招募

    Open source is changing the world. And if you want to be a part

    of that change, all you have to do is participate.

    Jason Hibbets《 the foundation of an open source city》

    什么是 ALC?

    ALC是Apache Local Community的缩写,是全世界范围的 Apache 开源爱好者本地群组。 +ALC Beijing 志愿者招募 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    21 +Apr 2020

    ALC Beijing 志愿者招募

    Open source is changing the world. And if you want to be a part

    of that change, all you have to do is participate.

    Jason Hibbets《 the foundation of an open source city》

    什么是 ALC?

    ALC是Apache Local Community的缩写,是全世界范围的 Apache 开源爱好者本地群组。 因为是本地组织,ALC 是按照城市或地区的方式进行划分的,类似的机构还有 GDG (Google Developer Group), Facebook Developer Circles, Mozilla Reps 等。 -任何 Apache 开源爱好者都可以代表自己所在的城市向 ALC 提出申请创建本地的组织。

    为什么创建 ACL-Beijing?

    根据 ASF 2019 年年度报告,中国已然成为Apache软件基金会项目下载量最大的地区。 +任何 Apache 开源爱好者都可以代表自己所在的城市向 ALC 提出申请创建本地的组织。

    为什么创建 ACL-Beijing?

    根据 ASF 2019 年年度报告,中国已然成为Apache软件基金会项目下载量最大的地区。 然而,这个看起来脱颖而出的数据背后,却暴露出我国这片土地上几个可能让大家颇为惊讶的现状:

    • ASF 拥有7000+代码贡献者,然而为 ASF 项目提交贡献的中国本土工程师仅千人规模,不足七分之一。
    • ASF 项目约350个,然而由中国本土发起的 ASF 项目仅19个,已成为顶级项目的比例更是不足5%。
    • ASF 孵化器拥有导师200多个,然而活跃的中国导师不超过5位。
    • ASF 每年在美国、欧洲等地举办 ApacheCon ,然而迄今为止尚未在中国举办过一次。

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, -甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。

    志愿者招募

    为了更好的推广开源,我们诚挚的邀请您加入志愿者行列,只要您:

    • 热情,大方,细心,有责任心
    • 热爱开源,愿意为中国本土的开源发展贡献自己的一份力量
    • 具有良好的团队合作意识
    • 具备下述能力中的任何一条,或者您认为我们需要的能力
      • 网站开发和维护
      • 文案撰写
      • 文章编辑
      • 主持、采访
      • 线上或线下的活动组织、策划、执行

    由于受疫情影响,近期 ALC-Beijing 主要以线上活动为主,您可以帮助我们:

    志愿者福利

    首先,我们希望您是真的喜爱、热爱开源,愿意投身到改变世界的开源事业当中。

    其次,通过参与 ALC-Beijing 的志愿活动,您可以:

    • 学习开源知识,扩展视野
    • 获得训练技能机会:演讲、主持、写作、沟通
    • 得到与 ASF Member、项目 VP/PMC 大牛们深度沟通的机会
    • 随时、深度参与 ALC-Beijing 组织的线上/线下活动
    • 深入理解 Apache 之道,倡导开源哲学

    加入方式

    如果您有意成为 ALC-Beijing 志愿者,请将个人简历发送至ningjiang@apache.org,期待您的加入!

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。

    志愿者招募

    为了更好的推广开源,我们诚挚的邀请您加入志愿者行列,只要您:

    • 热情,大方,细心,有责任心
    • 热爱开源,愿意为中国本土的开源发展贡献自己的一份力量
    • 具有良好的团队合作意识
    • 具备下述能力中的任何一条,或者您认为我们需要的能力
      • 网站开发和维护
      • 文案撰写
      • 文章编辑
      • 主持、采访
      • 线上或线下的活动组织、策划、执行

    由于受疫情影响,近期 ALC-Beijing 主要以线上活动为主,您可以帮助我们:

    志愿者福利

    首先,我们希望您是真的喜爱、热爱开源,愿意投身到改变世界的开源事业当中。

    其次,通过参与 ALC-Beijing 的志愿活动,您可以:

    • 学习开源知识,扩展视野
    • 获得训练技能机会:演讲、主持、写作、沟通
    • 得到与 ASF Member、项目 VP/PMC 大牛们深度沟通的机会
    • 随时、深度参与 ALC-Beijing 组织的线上/线下活动
    • 深入理解 Apache 之道,倡导开源哲学

    加入方式

    如果您有意成为 ALC-Beijing 志愿者,请将个人简历发送至ningjiang@apache.org,期待您的加入!

    \ No newline at end of file diff --git a/post/chaoss_meetup_sharing/index.html b/post/chaoss_meetup_sharing/index.html index ef790da2..59e2ae3b 100644 --- a/post/chaoss_meetup_sharing/index.html +++ b/post/chaoss_meetup_sharing/index.html @@ -1,5 +1,4 @@ -从初识社区到融入社区 · ALC Beijing

    从初识社区到融入社区

    推荐语:夏小雅是华东师范大学数据学院的在读研究生,也是X-lab成员之一。我认识小雅还是在去年年初的时候,我和她聊了一下她选的ServiceComb的实践项目,当时能感觉得到她参与开源的经验还很少;后续在CHOASS 项目例会中发现她逐渐活跃起来,逐步在社区中找到自己的位置了;在刚刚结束的 CHOASS Shanghai Meetup,小雅忙前忙后俨然成为一个在 CHOASS 社区很相当活跃的活动组织者。

    – ALC Beijing 发起人 姜宁

    CHAOSS

    CHAOSS(Community Health Analytics Open Source Software)是Linux基金会下专注于开源社区度量标准与软件开发的开源项目。从风险、演化、多样性、价值等角度持续制定与发布指标。

    今年参与CHAOSS项目的经历毫无疑问是我的2020最浓墨重彩的一笔,最初只是在每周的开放会议中旁观,偶尔提出一些小的讨论,到六月份开始申请Season of Docs,成为一名技术文档撰写的实习生,到12月开始筹划CHAOSS在中国的第一次Meetup,最终以12月27日Meetup的圆满成功作为落幕。

    从OS Revolution掀起开源革命到现在,“开源”两个字所代表的绝不仅仅是代码开放。依托项目构筑起的社区是一种基于技术的新型数字化组织架构,如何定义一个好的开源社区?依据什么进行开源治理?到现在也很难有体系将这件事完整的讲清楚,这也是CHAOSS这个项目的价值所在,即便我们也很难说CHAOSS的指标体系是合理的、完善的,但是一个为开源度量而存在项目,本身就具有着无穷价值。

    我最感兴趣的是其中“多样性与包容性(D&I)”这个小组的内容,一个致力于定义社区健康度的社区本身应该是相对健康的,一个讨论开源社区D&I指标的小组本身是多样和包容的,这也的确是CHAOSS给我的实际感受。D&I小组用耐心与包容度鼓励着我这个社区新人,并让我意识到任何形式的贡献都是有意义的。

    Google Season of Docs

    也是在一次D&I组会上,我得知了Season of Docs这个项目,并产生了申请试试的想法。申请期间我的选题同时有另外两位竞争者,一位来自印度一位来自非洲,我能清晰感受到他们显然是比我更加熟练的英文使用者,因此在这个过程中也感受到了巨大压力。在回答Micro Task和编写proposal时,我格外注意语法和文档的结构性;那段时间几乎每次D&I组会和项目的小会我都会参加,或许也是因此赢得了选拔。

    我的两位导师都非常年轻,实习过程几乎是交朋友的过程,十分快乐。虽然有时候会因为口语交流和时差问题感到压力,但是每次线上见面,听到对方的“How you doing today?”,听到对方对于每周我并不认为自己做的十分好的工作不吝赞美,还是感到十分温馨。

    CHAOSS Shanghai Meetup

    12月份,我的Season of Docs之旅正式结束,我向社区提出在中国举办一次local meetup,得到的反馈与支持是我完全没有意料到的,社区给予了能够给的所有支持,提供过往经验、材料和日程建议。很多人表达了无法现场参加的遗憾,并希望通过录制video或线上接入来Backup。

    这把火瞬间烧的旺盛,我也备受鼓舞。得益于X-lab、华为、微软Reactor的老师们的支撑,从建立官网注册链接、制作海报、收集来自社区的video和材料,在邮件列表上协调与沟通,我从备受鼓励的角色变成了鼓励与赞扬他人的角色,这种角色转换的过程奇妙而充满了成就感,仿佛是传承,又像是传染 - - 好的社区氛围也是具有传染性的,好的氛围往往会有奇妙的化学反应。

    这是我第一次办一场Meetup,过程中避免不了手忙脚乱,最大的考验是它的琐碎性与细节性,以及在这个过程中如何协调与沟通。现在回想那段时间,几乎很难完全沉下心来,因为常常会被Meetup的琐碎细节打断,我的一个总结是,负责一场活动是避免不了与零碎事情打交道的,但是可以给自己设一段时间来集中处理,而不是被各种状况牵着走。另外一个心得是,社区中的志愿者是需要激励机制的,在给大家分发任务前,将回馈机制亮出来(礼品、餐食等)会更有说服力。

    社区通关攻略

    • 新人对于一个社区是格外珍贵的,这点我深有体会,在我最初在邮件列表、在会议中开始发声,我收到的回应和鼓励格外多,我的一些小建议会被记录在会议文档里,标注上我的名字。所以千万别觉得你作为一个新来者,就是这个社区的“场外观众”。

    • 多去提问,最基础的问题有时候最有意义,它会给项目维护者带来不同的视角。我最初参与项目时,对于其中“Event”指的是什么就产生了错误理解,但是这也让大家意识到需要对项目的术语在文档中做好定义。

    • 刷脸熟非常重要,不要总徘徊在场外,也不需要抱着做了一定的贡献才能融入进去的想法。哪怕还没想好做什么,在邮件列表或者GitHub上做一个自我介绍,表达想要贡献的心情。在社区中,你总能得到帮助的。

    • 不要因为你的英语不够纯正,或者有语法错误就不开口。有时候只需要几个单词对方就可以听懂,而get到双方的意思才是交流的核心。在沟通的过程中你大概率会受到鼓励,从而越来越应付自如。

    • 参与开源社区不需要你一定是个技术大牛,社区中的非代码贡献种类繁多,并且意义同等重要。CHAOSS项目有一个指标定义出了开源社区中可能有的贡献类型:

    作为新手区的我们,除代码外可以做的贡献类型也十分丰富,这些贡献类型也是多交叉学科的。例如翻译和本地化、文档撰写、设计工作、社交媒体的运营管理、用户支持和答疑、法律咨询、社区沟通和管理、组织活动或在活动上作为一个speaker。像我从写项目文档到组织CHAOSS上海Meetup,就是典型的非代码贡献。

    写在最后

    有时候,成就感、认同感、归属感就是一件事情的最大支撑,如果你在这件事情中找到了自己的意义,就不是在被push着往前走,那么做它的过程也是快乐的。

    2021年,我的开源社区之旅依旧在路上。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +从初识社区到融入社区 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    05 +Jan 2021

    从初识社区到融入社区

    推荐语:夏小雅是华东师范大学数据学院的在读研究生,也是X-lab成员之一。我认识小雅还是在去年年初的时候,我和她聊了一下她选的ServiceComb的实践项目,当时能感觉得到她参与开源的经验还很少;后续在CHOASS 项目例会中发现她逐渐活跃起来,逐步在社区中找到自己的位置了;在刚刚结束的 CHOASS Shanghai Meetup,小雅忙前忙后俨然成为一个在 CHOASS 社区很相当活跃的活动组织者。

    – ALC Beijing 发起人 姜宁

    CHAOSS

    CHAOSS(Community Health Analytics Open Source Software)是Linux基金会下专注于开源社区度量标准与软件开发的开源项目。从风险、演化、多样性、价值等角度持续制定与发布指标。

    今年参与CHAOSS项目的经历毫无疑问是我的2020最浓墨重彩的一笔,最初只是在每周的开放会议中旁观,偶尔提出一些小的讨论,到六月份开始申请Season of Docs,成为一名技术文档撰写的实习生,到12月开始筹划CHAOSS在中国的第一次Meetup,最终以12月27日Meetup的圆满成功作为落幕。

    从OS Revolution掀起开源革命到现在,“开源”两个字所代表的绝不仅仅是代码开放。依托项目构筑起的社区是一种基于技术的新型数字化组织架构,如何定义一个好的开源社区?依据什么进行开源治理?到现在也很难有体系将这件事完整的讲清楚,这也是CHAOSS这个项目的价值所在,即便我们也很难说CHAOSS的指标体系是合理的、完善的,但是一个为开源度量而存在项目,本身就具有着无穷价值。

    我最感兴趣的是其中“多样性与包容性(D&I)”这个小组的内容,一个致力于定义社区健康度的社区本身应该是相对健康的,一个讨论开源社区D&I指标的小组本身是多样和包容的,这也的确是CHAOSS给我的实际感受。D&I小组用耐心与包容度鼓励着我这个社区新人,并让我意识到任何形式的贡献都是有意义的。

    Google Season of Docs

    也是在一次D&I组会上,我得知了Season of Docs这个项目,并产生了申请试试的想法。申请期间我的选题同时有另外两位竞争者,一位来自印度一位来自非洲,我能清晰感受到他们显然是比我更加熟练的英文使用者,因此在这个过程中也感受到了巨大压力。在回答Micro Task和编写proposal时,我格外注意语法和文档的结构性;那段时间几乎每次D&I组会和项目的小会我都会参加,或许也是因此赢得了选拔。

    我的两位导师都非常年轻,实习过程几乎是交朋友的过程,十分快乐。虽然有时候会因为口语交流和时差问题感到压力,但是每次线上见面,听到对方的“How you doing today?”,听到对方对于每周我并不认为自己做的十分好的工作不吝赞美,还是感到十分温馨。

    CHAOSS Shanghai Meetup

    12月份,我的Season of Docs之旅正式结束,我向社区提出在中国举办一次local meetup,得到的反馈与支持是我完全没有意料到的,社区给予了能够给的所有支持,提供过往经验、材料和日程建议。很多人表达了无法现场参加的遗憾,并希望通过录制video或线上接入来Backup。

    这把火瞬间烧的旺盛,我也备受鼓舞。得益于X-lab、华为、微软Reactor的老师们的支撑,从建立官网注册链接、制作海报、收集来自社区的video和材料,在邮件列表上协调与沟通,我从备受鼓励的角色变成了鼓励与赞扬他人的角色,这种角色转换的过程奇妙而充满了成就感,仿佛是传承,又像是传染 - - 好的社区氛围也是具有传染性的,好的氛围往往会有奇妙的化学反应。

    这是我第一次办一场Meetup,过程中避免不了手忙脚乱,最大的考验是它的琐碎性与细节性,以及在这个过程中如何协调与沟通。现在回想那段时间,几乎很难完全沉下心来,因为常常会被Meetup的琐碎细节打断,我的一个总结是,负责一场活动是避免不了与零碎事情打交道的,但是可以给自己设一段时间来集中处理,而不是被各种状况牵着走。另外一个心得是,社区中的志愿者是需要激励机制的,在给大家分发任务前,将回馈机制亮出来(礼品、餐食等)会更有说服力。

    社区通关攻略

    • 新人对于一个社区是格外珍贵的,这点我深有体会,在我最初在邮件列表、在会议中开始发声,我收到的回应和鼓励格外多,我的一些小建议会被记录在会议文档里,标注上我的名字。所以千万别觉得你作为一个新来者,就是这个社区的“场外观众”。

    • 多去提问,最基础的问题有时候最有意义,它会给项目维护者带来不同的视角。我最初参与项目时,对于其中“Event”指的是什么就产生了错误理解,但是这也让大家意识到需要对项目的术语在文档中做好定义。

    • 刷脸熟非常重要,不要总徘徊在场外,也不需要抱着做了一定的贡献才能融入进去的想法。哪怕还没想好做什么,在邮件列表或者GitHub上做一个自我介绍,表达想要贡献的心情。在社区中,你总能得到帮助的。

    • 不要因为你的英语不够纯正,或者有语法错误就不开口。有时候只需要几个单词对方就可以听懂,而get到双方的意思才是交流的核心。在沟通的过程中你大概率会受到鼓励,从而越来越应付自如。

    • 参与开源社区不需要你一定是个技术大牛,社区中的非代码贡献种类繁多,并且意义同等重要。CHAOSS项目有一个指标定义出了开源社区中可能有的贡献类型:

    作为新手区的我们,除代码外可以做的贡献类型也十分丰富,这些贡献类型也是多交叉学科的。例如翻译和本地化、文档撰写、设计工作、社交媒体的运营管理、用户支持和答疑、法律咨询、社区沟通和管理、组织活动或在活动上作为一个speaker。像我从写项目文档到组织CHAOSS上海Meetup,就是典型的非代码贡献。

    写在最后

    有时候,成就感、认同感、归属感就是一件事情的最大支撑,如果你在这件事情中找到了自己的意义,就不是在被push着往前走,那么做它的过程也是快乐的。

    2021年,我的开源社区之旅依旧在路上。

    \ No newline at end of file diff --git a/post/event/alc-beijing-apache-mentor-series/index.html b/post/event/alc-beijing-apache-mentor-series/index.html index e4bcb18a..36452a4c 100644 --- a/post/event/alc-beijing-apache-mentor-series/index.html +++ b/post/event/alc-beijing-apache-mentor-series/index.html @@ -1,3 +1,6 @@ -ALC Beijing 活动: Apache PMC 亲自教你系列 · ALC Beijing

    ALC Beijing 活动: Apache PMC 亲自教你系列

    目的

    在诺大一个中国,开源的相关运转机理、成功方法等还是一片荒芜,ALC Beijing 不仅要怯魅,还得防止复魅。在接下来的2021年,我们特别每月推出一次在线的指导和交流,内容涵盖进入Apache的方方面面,包括但不限于:

    • 进入apache 软件基金会的开源项目有何附加值?
    • 开源或闭源项目如何加入Apache软件基金会孵化?
    • 成为Apache Member 是一种什么体验?
    • 如何让我的patch 被Apache 项目接受?
    • 如何选择一个Apache开源项目进行贡献?
    • ……

    准备条件

    一台安装有Zoom软件的接入互联网的终端设备,以及安静的角落。

    即将播出,在线交流

    主题主讲及简介日期/时间报名链接地址备注
    进入Apache的开源项目有何益处?姜宁,ALC Beijing 发起人,Apache 软件基金会成员
    在Apache如何孵化一款开源软件项目?吴晟,Apache SkyWalking VP,Apache 软件基金会成员2021.1.17周日,北京时间21:00~21:40https://calendly.com/opensourceway/apache-mentor

    已经结束,观看录像

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 活动: Apache PMC 亲自教你系列 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    08 +Dec 2020

    ALC Beijing 活动: Apache PMC 亲自教你系列

    目的

    在诺大一个中国,开源的相关运转机理、成功方法等还是一片荒芜,ALC Beijing 不仅要怯魅,还得防止复魅。在接下来的2021年,我们特别每月推出一次在线的指导和交流,内容涵盖进入Apache的方方面面,包括但不限于:

    • 进入apache 软件基金会的开源项目有何附加值?
    • 开源或闭源项目如何加入Apache软件基金会孵化?
    • 成为Apache Member 是一种什么体验?
    • 如何让我的patch 被Apache 项目接受?
    • 如何选择一个Apache开源项目进行贡献?
    • ……

    准备条件

    一台安装有Zoom软件的接入互联网的终端设备,以及安静的角落。

    即将播出,在线交流

    主题主讲及简介日期/时间报名链接地址备注
    进入Apache的开源项目有何益处?姜宁,ALC Beijing 发起人,Apache 软件基金会成员
    在Apache如何孵化一款开源软件项目?吴晟,Apache SkyWalking VP,Apache 软件基金会成员2021.1.17周日,北京时间21:00~21:40https://calendly.com/opensourceway/apache-mentor

    已经结束,观看录像

    \ No newline at end of file diff --git a/post/event/apache-roadshow-china-2020-virtual-1/index.html b/post/event/apache-roadshow-china-2020-virtual-1/index.html index 39c340e5..8405e12e 100644 --- a/post/event/apache-roadshow-china-2020-virtual-1/index.html +++ b/post/event/apache-roadshow-china-2020-virtual-1/index.html @@ -1,3 +1,6 @@ -文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇) · ALC Beijing

    文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)

    引言

    开源发展至今,来自community 的力量是无法忽视的,甚至有的观点认为,开源的核心就是开源community。我们在上篇:

    介绍 在Apache孵化项目的过程,需要做什么,以及如何避免走弯路,并给出了完美的实践。Apache SkyWalking的 VP 吴晟先生在 ApacheCon 2020 的Keynote分享上,明确的指出了摆在本土面前重要的障碍之一就是:共同体建设,如何吸引来自全球的开发者,不仅在语言上,更多在文化上有非常大的挑战。

    在COSCon‘2020 + Apache 中国路演的论坛上,我们看看有哪些关于开源共同体方面的建设的分享:

    Apache Way

    正确把握Apache 之道,从来不是一件容易的事,因为它从来也不是事无巨细的规则,而是一种哲学思想、一种向导指南,除了日常的融入已有的Apache项目进行感受之外,还要听听哪些前辈们对此如何解读:

    Apache recently celebrated our 20-year anniversary as a software foundation. Our mission is to provide software for the public good, available at 100% no charge.#The Foundation now oversees over 300 projects with over 7,900 committers from more than 100 countries, and more than half a million contributors over the years, with nearly 40,000 this year alone.#Apache has many contributors and projects from China, including some that were originally developed in China and later became Apache projects through the Incubator.#The permissive Apache License ensures all Apache software is safe by allowing anyone to use, extend, and provide services. The only requirement is to acknowledge the source of the code.#Apache communities are safe for users and developers, with shared goals, a strict Code of Conduct, and the guidance and protection from the Foundation. #The Apache community welcomes participation from all people willing to help make world-class software for the common good.

    Apache Community建设

    高校向来是被认为是本土发展开源的可能之地,几代人一次次从希望中放弃,不是没有道理的,开源至今,在多个领域内高校都是空白,这和美国本土的开源不仅是难以动摇的基石,还是引领前沿,甚至是商业的青睐有加,差别甚远。但是,即使在这片荒芜之地,还是出现了一种可能性。那就是 Apache IoTDB:

    物联网数据库 Apache IoTDB 是目前唯一一个由中国高校发起,并从 Apache 孵化成功的顶级项目。本次分享将介绍 IoTDB 社区的发展历程。包括如何帮助学生参与系统开发和了解开源文化;从社区寻找志同道合的项目贡献者和维护者;打造好用、管用的产品并吸引用户使用。同时,作为项目的初始成员,作者也会分享从零开始构建社区做出的尝试和心路历程。

    企业实践

    Upsteam first 是企业走开源之路的不二法门,小米作为新一代IT公司,在开源方面做的可圈可点,但是在数据分析方面算是一个突破口,以崔宝秋为首的拥抱开源,公共做的不错,那么有什么底气没有?那就是屡屡斩获各种开源奖项的张铎,小米如何做Upstream,进而满足自身的业务需求,且成就一干开发者的故事。

    张铎将介绍小米存储团队在HBase,Kudu等几个Apache旗下开源项目上的实践经验,以及捐赠Pegasus项目到Apache基金会的始末,同时对公司和个人如何参与开源项目提出一些指导和建议。

    在从来没有接触过开源,然后突然将自己的项目开源,这应该是一个当今很多公司常犯的错误,嗯,进入Apache 孵化是不是可以让人更加省劲了呢?或许未必,但是共同体的教训和收获绝对是一堂重要的课:

    做开源项目要经历哪些槛?郭炜将以自己的实际经历来分享前几次失败后的反思,终于将大数据任务调度 DolphinScheduler 贡献给Apache,并在1年时间社区用户达到了3000多人

    Apache Pulsar是Apache软件基金会顶级项目,是下一代云原生分布式消息流平台。除了在功能特性发面不断发展演进,Apache Pulsar社区也在最近一年取得不断成长和发展,全球贡献者人数突破300位,周边生态快速发展,国内社区发展也是一大特色。在本演讲中,将为大家详细介绍Apache Pulsar社区最新进展与动态、所取得的成绩与后续发展计划,并分享我们在Apache Pulsar社区运营方面的经验与心得。

    不走寻常路

    对于沟通的工具上,本土有着巨大的阻力,异步、公开这两项是严重不符合中国本土的现有文化的,那么在邮件列表很难推行,微信群、QQ群大行其道的当下,是否有可能通过技术手段,将这个文化差异打通了呢?我们来看看国人的尝试:

    OSS.Chat 项目的使命是为开源项目开发社群搭建一道打通 WeChat 及其它社交平台 (未来) 和 GitHub Issues 与邮件列表的三向沟通和翻译壁垒的桥梁,让 ASF 的文化、技术和协作流程能尽快地容易地被接受,而不是一开始就磕磕绊绊。通过 Chatbot 这种自动化流程机制,让开发者能够更加便捷的分享和沟通开源项目的开发信息。尤其是对社区开放资料的存档和二次归纳处理,是我们认为很有意义的一件事情。透过 OSS.Chat 项目,我们希望能进一步推广、传播乃至于优化 Apache 项目社区的文化、技术、与协作。

    该演讲的题目叫做:OSS.Chat - 通往 Apache Way 的一道虹桥

    主讲嘉宾介绍

    Craig Russell (clr@apache.org) is a Member and Director of The Apache Software Foundation, Assistant Secretary, and former Board Chair. He is a member of the Incubator Project Management Committee responsible for bringing new projects into Apache.

    张铎,毕业于清华大学计算机科学与技术系,长年从事开源软件的开发与维护。2015年成为Apache HBase项目的Committer,2016年成为Apache HBase项目在大陆的第一位PMC成员,2019年7月成为Apache HBase项目的主席,2020年4月成为Apache软件基金会member。2018年,在Apache软件基金会全球近7000名Committer中,贡献数量排名第三。在开发和维护HBase项目的同时,也是数个Apache孵化项目的mentor,例如NuttX,Pegasus等。目前在小米公司云平台部负责存储相关工作,兼任小米开源委员会主席。

    李卓桓,Tencent TVP of Chatbot。清华大学本科,中欧国际工商学院EMBA,北京邮电大学计算机系博士在读。现任PreAngel合伙人,Plug and Play Venture Partner,关注钟子期AI创业项目。zixia BBS、叽歪网创始人,曾任优酷网首席科学家、水木清华BBS站长,ChinaRen系统工程师。拥有丰富的互联网创业投资和编程经验,著有《Linux网络编程》《反垃圾邮件完全手册》《智能对话与深度学习》《Chatbot从0到1》《简明的 TensorFlow 2》等技术图书。2016 年在 GitHub 发布基于 Apache-2.0 许可证的 Conversational SDK Wechaty 开源项目,现有数十位 Committers,百余位 Contributors ,并被近万名 GitHub 开发者 Star 。

    郭炜,2015年加入易观,担任易观CTO,负责构建易观技术团队、完成易观大数据采集、平台、数据挖掘等技术架构与体系;从无到有完成易观混合云的搭建、以及易观SDK的升级,并发布易观秒算实时计算平台。目前易观大数据平台日处理数据量达30T,日处理数据200亿条。# 郭炜先生毕业于北京大学,加入易观之前,曾任联想研究院大数据总监,万达电商数据部总经理,并曾在中金、IBM、Teradata公司担任大数据方向重要岗位,对大数据前沿领域颇有研究。#并在 infoq、TGO、CSDN、51CTO、ArchSummit等会议上多次做过分享.

    乔嘉林(笔名铁头乔),物联网数据库 Apache IoTDB 项目初始成员及 PMC,清华大学软件学院博士生,负责 IoTDB 核心模块研发和实施运维,同时致力于社区运营与宣传,帮助开源小白加入社区。#曾参加过IoTDB与Pulsar见面会的演讲《时序数据全生命周期的开源解决方案》#即将在Apache con2020介绍IoTDB用户案例及优化。

    王殿进: 目前就职于由 Apache Pulsar 、Apache BookKeeper 原生核心开发者组建的开源团队 StreamNative,负责 Apache Pulsar 社区运营及市场工作。个人始终保持对开源的关注,拥有数年的开源行业经验,贡献过多个开源项目,曾服务于技术媒体、云计算、SaaS等行业公司,在社区运营方面经验丰富。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇) | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    12 +Oct 2020

    文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)

    引言

    开源发展至今,来自community 的力量是无法忽视的,甚至有的观点认为,开源的核心就是开源community。我们在上篇:

    介绍 在Apache孵化项目的过程,需要做什么,以及如何避免走弯路,并给出了完美的实践。Apache SkyWalking的 VP 吴晟先生在 ApacheCon 2020 的Keynote分享上,明确的指出了摆在本土面前重要的障碍之一就是:共同体建设,如何吸引来自全球的开发者,不仅在语言上,更多在文化上有非常大的挑战。

    在COSCon‘2020 + Apache 中国路演的论坛上,我们看看有哪些关于开源共同体方面的建设的分享:

    Apache Way

    正确把握Apache 之道,从来不是一件容易的事,因为它从来也不是事无巨细的规则,而是一种哲学思想、一种向导指南,除了日常的融入已有的Apache项目进行感受之外,还要听听哪些前辈们对此如何解读:

    Apache recently celebrated our 20-year anniversary as a software foundation. Our mission is to provide software for the public good, available at 100% no charge.#The Foundation now oversees over 300 projects with over 7,900 committers from more than 100 countries, and more than half a million contributors over the years, with nearly 40,000 this year alone.#Apache has many contributors and projects from China, including some that were originally developed in China and later became Apache projects through the Incubator.#The permissive Apache License ensures all Apache software is safe by allowing anyone to use, extend, and provide services. The only requirement is to acknowledge the source of the code.#Apache communities are safe for users and developers, with shared goals, a strict Code of Conduct, and the guidance and protection from the Foundation. #The Apache community welcomes participation from all people willing to help make world-class software for the common good.

    Apache Community建设

    高校向来是被认为是本土发展开源的可能之地,几代人一次次从希望中放弃,不是没有道理的,开源至今,在多个领域内高校都是空白,这和美国本土的开源不仅是难以动摇的基石,还是引领前沿,甚至是商业的青睐有加,差别甚远。但是,即使在这片荒芜之地,还是出现了一种可能性。那就是 Apache IoTDB:

    物联网数据库 Apache IoTDB 是目前唯一一个由中国高校发起,并从 Apache 孵化成功的顶级项目。本次分享将介绍 IoTDB 社区的发展历程。包括如何帮助学生参与系统开发和了解开源文化;从社区寻找志同道合的项目贡献者和维护者;打造好用、管用的产品并吸引用户使用。同时,作为项目的初始成员,作者也会分享从零开始构建社区做出的尝试和心路历程。

    企业实践

    Upsteam first 是企业走开源之路的不二法门,小米作为新一代IT公司,在开源方面做的可圈可点,但是在数据分析方面算是一个突破口,以崔宝秋为首的拥抱开源,公共做的不错,那么有什么底气没有?那就是屡屡斩获各种开源奖项的张铎,小米如何做Upstream,进而满足自身的业务需求,且成就一干开发者的故事。

    张铎将介绍小米存储团队在HBase,Kudu等几个Apache旗下开源项目上的实践经验,以及捐赠Pegasus项目到Apache基金会的始末,同时对公司和个人如何参与开源项目提出一些指导和建议。

    在从来没有接触过开源,然后突然将自己的项目开源,这应该是一个当今很多公司常犯的错误,嗯,进入Apache 孵化是不是可以让人更加省劲了呢?或许未必,但是共同体的教训和收获绝对是一堂重要的课:

    做开源项目要经历哪些槛?郭炜将以自己的实际经历来分享前几次失败后的反思,终于将大数据任务调度 DolphinScheduler 贡献给Apache,并在1年时间社区用户达到了3000多人

    Apache Pulsar是Apache软件基金会顶级项目,是下一代云原生分布式消息流平台。除了在功能特性发面不断发展演进,Apache Pulsar社区也在最近一年取得不断成长和发展,全球贡献者人数突破300位,周边生态快速发展,国内社区发展也是一大特色。在本演讲中,将为大家详细介绍Apache Pulsar社区最新进展与动态、所取得的成绩与后续发展计划,并分享我们在Apache Pulsar社区运营方面的经验与心得。

    不走寻常路

    对于沟通的工具上,本土有着巨大的阻力,异步、公开这两项是严重不符合中国本土的现有文化的,那么在邮件列表很难推行,微信群、QQ群大行其道的当下,是否有可能通过技术手段,将这个文化差异打通了呢?我们来看看国人的尝试:

    OSS.Chat 项目的使命是为开源项目开发社群搭建一道打通 WeChat 及其它社交平台 (未来) 和 GitHub Issues 与邮件列表的三向沟通和翻译壁垒的桥梁,让 ASF 的文化、技术和协作流程能尽快地容易地被接受,而不是一开始就磕磕绊绊。通过 Chatbot 这种自动化流程机制,让开发者能够更加便捷的分享和沟通开源项目的开发信息。尤其是对社区开放资料的存档和二次归纳处理,是我们认为很有意义的一件事情。透过 OSS.Chat 项目,我们希望能进一步推广、传播乃至于优化 Apache 项目社区的文化、技术、与协作。

    该演讲的题目叫做:OSS.Chat - 通往 Apache Way 的一道虹桥

    主讲嘉宾介绍

    Craig Russell (clr@apache.org) is a Member and Director of The Apache Software Foundation, Assistant Secretary, and former Board Chair. He is a member of the Incubator Project Management Committee responsible for bringing new projects into Apache.

    张铎,毕业于清华大学计算机科学与技术系,长年从事开源软件的开发与维护。2015年成为Apache HBase项目的Committer,2016年成为Apache HBase项目在大陆的第一位PMC成员,2019年7月成为Apache HBase项目的主席,2020年4月成为Apache软件基金会member。2018年,在Apache软件基金会全球近7000名Committer中,贡献数量排名第三。在开发和维护HBase项目的同时,也是数个Apache孵化项目的mentor,例如NuttX,Pegasus等。目前在小米公司云平台部负责存储相关工作,兼任小米开源委员会主席。

    李卓桓,Tencent TVP of Chatbot。清华大学本科,中欧国际工商学院EMBA,北京邮电大学计算机系博士在读。现任PreAngel合伙人,Plug and Play Venture Partner,关注钟子期AI创业项目。zixia BBS、叽歪网创始人,曾任优酷网首席科学家、水木清华BBS站长,ChinaRen系统工程师。拥有丰富的互联网创业投资和编程经验,著有《Linux网络编程》《反垃圾邮件完全手册》《智能对话与深度学习》《Chatbot从0到1》《简明的 TensorFlow 2》等技术图书。2016 年在 GitHub 发布基于 Apache-2.0 许可证的 Conversational SDK Wechaty 开源项目,现有数十位 Committers,百余位 Contributors ,并被近万名 GitHub 开发者 Star 。

    郭炜,2015年加入易观,担任易观CTO,负责构建易观技术团队、完成易观大数据采集、平台、数据挖掘等技术架构与体系;从无到有完成易观混合云的搭建、以及易观SDK的升级,并发布易观秒算实时计算平台。目前易观大数据平台日处理数据量达30T,日处理数据200亿条。# 郭炜先生毕业于北京大学,加入易观之前,曾任联想研究院大数据总监,万达电商数据部总经理,并曾在中金、IBM、Teradata公司担任大数据方向重要岗位,对大数据前沿领域颇有研究。#并在 infoq、TGO、CSDN、51CTO、ArchSummit等会议上多次做过分享.

    乔嘉林(笔名铁头乔),物联网数据库 Apache IoTDB 项目初始成员及 PMC,清华大学软件学院博士生,负责 IoTDB 核心模块研发和实施运维,同时致力于社区运营与宣传,帮助开源小白加入社区。#曾参加过IoTDB与Pulsar见面会的演讲《时序数据全生命周期的开源解决方案》#即将在Apache con2020介绍IoTDB用户案例及优化。

    王殿进: 目前就职于由 Apache Pulsar 、Apache BookKeeper 原生核心开发者组建的开源团队 StreamNative,负责 Apache Pulsar 社区运营及市场工作。个人始终保持对开源的关注,拥有数年的开源行业经验,贡献过多个开源项目,曾服务于技术媒体、云计算、SaaS等行业公司,在社区运营方面经验丰富。

    \ No newline at end of file diff --git a/post/event/apache-roadshow-china-2020-virtual-2/index.html b/post/event/apache-roadshow-china-2020-virtual-2/index.html index ca613571..0286b234 100644 --- a/post/event/apache-roadshow-china-2020-virtual-2/index.html +++ b/post/event/apache-roadshow-china-2020-virtual-2/index.html @@ -1,3 +1,6 @@ -追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇) · ALC Beijing

    追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)

    引言

    没有什么好说的,从分布式系统到调度器,再到可观察性,以及数据可视化,当然还有消息队列,大数据处理、IoT。

    让更多的人知道项目,才可能从这些人中转化为用户,用户中可能筛选出贡献者,进而形成良性循环,这大概是所有开源项目的期望。

    以下技术内容,因为缺少对比,仅仅在此给大家罗列出来目前在本土所分享的关于技术议题,没有逻辑、没有分类、没有主线,唯一的相似之处就是这些项目是捐赠给了Apache软件基金会,以Apache之道的方式在运作,技术水平如何,解决了用户什么问题,请详细阅读。或者来COSCon的现场聆听。

    项目在生产环境中的落地

    本次分享首先会介绍DolphinScheduler社区的发展情况,然后会介绍我们当时为何要重复造轮子再造大数据任务调度,DolphinScheduler整体的设计思想、考量以及DolphinScheduler的特性和能力,接下来会介绍DolphinScheduler架构的变迁过程。#在此次分享中我也会讲述我们在做大数据任务调度时遇到的挑战和积累下来的经验,也会分享一些用户案例和使用场景,最后会分享一下开源的历程

    此次分享主要介绍Apache Skywalking 在小米信息技术部的应用,包括并且不限于Apache Skywalking 在小米新零售、商城、门店等10多个业务的应用以及整体部署架构(中国大陆、俄罗斯、新加坡等机房部署)、在小米如何处理每日新增数亿trace segment以及相关优化配置、Apache Skywalking 告警模块如何跟小米内部告警平台打通等二次开发内容、小米对Apache Skywalking 开源社区的一点贡献。

    作为Apache顶级项目的ShardingSphere,将会在最新发布版本中迈向从分布式数据库中间件生态圈到分布式数据库的转型。#已在GitHub上收获12k+ Star的开源人气项目将进一步根据用户需求和应用场景,在这个数据库化的过程中全力打造更为简单、丰富、一体化、可插拔的分布式数据库产品体系,从而为用户提供最简单易用、功能强大、性能稳定的分布式数据库化产品。本次分享将为详细阐述数据库化的产品特性、架构体系、极简落地方案实践等核心内容。

    自从2017年成为国内首个中间件Apache开源顶级项目以来,Apache RocketMQ 以高性能、低延迟和高可靠的消息发布与订阅服务成为各厂商业务消息的首选。进入云原生时代,Apache RocketMQ也在悄然成为云原生时代的通信基础设施。本次演讲将结合Apache RocketMQ开源历程,介绍在云原生时代 RocketMQ核心竞争力、最新的技术进展、开源社区生态以及未来展望。

    Apache Kylin 4.0 Alpha版本日前已经发布,它是Apache Kylin 4的第一个早期预览版本,是继Kylin 3之后的一个重大架构升级版本,采用Parquet这种真正的列式存储来代替HBase存储,提升文件扫描性能;同时重新实现了基于Spark的构建引擎和查询引擎,使得计算和存储分离变为可能,更加适应云原生的技术趋势。本次演讲嘉宾张智超将从架构升级,原理讲解,重大特性等几个方面来介绍Apache Kylin 4.0。

    Apache Doris(Incubating)是一款支持对海量数据进行快速分析的 MPP 数据库。Doris 自设计之初,就秉承着极简运维、高效可靠、易学易用的原则,为用户提供全面而高效的海量数据分析能力。自 2018 年底进入 Apache 孵化器后,Doris 已经发布了 5 个大版本,接收了来自社区 100 多位开发者的贡献,并在多家互联网头部企业和垂直领域企业落地和应用。本次演讲主要包含 Doris 的发展历程、系统架构、主要特性和应用案例四个部分,帮助听众对 Doris 有一个全面而具象的认识。最后,陈明雨会介绍 Doris 社区目前的发展情况,希望能够帮助开发者更方便快捷的加入开源社区。

    定制化Operator模式在面向Kubernetes的云化平台建构中变得越来越流行。Apache SkyWalking社区已经开始尝试使用Operator模式去构建基于Kubernetes平台的PaaS云组件。本次分享给将会给听众带来该项目的初衷,实现与未来演进等相关内容。分享的内容包含:#1. 项目动机与设计理念#2. 核心功能展示,包含SkyWalking核心组件的发布,更新与维护。#3. 观测ServiceMesh,包含于Istio的自动集成。#4. 目前的工作进展和对未来的规划。

    ElasticJob 在 2015 年首次面世,经历多年的开源历程,于 2020年5月28日 正式成为 Apache ShardingSphere 旗下子项目。#ElasticJob 是一款服务于任务分片的分布式调度中间件,在加入 Apache 软件基金会之后,它的设计理念,整体架构和功能都进一步的完善和升级,并且已经发布了第一个 Apache 版本 - 3.0.0-alpha。#本次分享在简短回顾 ElasticJob 的发展历史后,将着重介绍其 3.x 版本的功能和设计理念的转变,以及和 Apache ShardingSphere 的结合点。

    RocketMQ作为有状态的分布式消息服务,如何在云原生时代下做到极简运维管控,是一个极具挑战和价值的问题。本次演讲主要介绍RocketMQ Operator相关的背景知识、技术原理以及如何使用它在Kubernetes上进行RocketMQ集群的部署和管理。

    Apache Pulsar是下一代云原生消息平台,Apache Pulsar 从雅虎开源,在2018年9月毕业成为Apache基金会的顶级项目。#Apace Pulsar从2012年诞生时就前瞻性地采用了存储计算分离、分层分片的云原生架构,极大减轻了了用户在消息系统中遇到的扩展和运维的困难。#本次演讲将深入介绍 Pulsar 的云原生的特性和架构优势,以及在全面云原生时代 Pulsar 的最新技术进展。

    T3 出行是一家基于车联网驱动的网约车平台,拥有海量且丰富的数据源。为此在很早就基于Apache Hudi构建了企业级的数据湖。但数据湖从外界摄取的数据源绝大部分都是原始数据,而为了使原始数据变得更有业务价值和分析价值,T3出行 需要对数据进行ETL等进行脱敏。这时为了解决低延迟、高效的数据加工,最初引入了Easy Scheduler(DolphinScheduler前身),在使用过程中发现了不少问题。随着DolphinScheduler加入Apache孵化器进行孵化并快速迭代,T3出行也随之升级到了DolphinScheduler并围绕它打造了一个企业级的大数据调度管理平台。这次分享T3出行将会对基于Apache DolphinScheduler支撑数据湖上低延迟数据加工的实践进行介绍。

    工业物联网数据的主体是机器产生的时序数据,是工业互联网的原矿。与其他大数据不同,其具有高通量、低质量、弱模式、查询分析复杂等特点。Apache IoTDB是从中国高校发起的,经过多年迭代,在多个工业生产系统中经过验证的新一代工业物联网数据库管理系统,目前已成为Apache顶级项目。本报告将详细介绍工业物联网中的挑战,Apache IoTDB的基本概念和特性,并简单介绍基于Apache IoTDB的相关实际案例,帮助听众了解如何基于Apache IoT生态,解决工业物联网数据应用需求。

    随着数据可视化需求的不断增长以及对可视化理论理解的逐渐加深,数据可视化工具在近年来发生了很大的转变。最初,可视化的需求主要集中在使用静态的图表展现数据,以帮助用户更直观地理解数据。后来,交互性的可视化工具被用作加强用户对数据关系理解的手段。现在,可视化工具另一个很重要的功能是帮助讲好一个故事。我们期望可视化工具能够帮助用户探索并思考数据背后的故事,并且由此受到启发甚至在之后影响自己的行为。在这个分享中,我们会介绍 Apache ECharts (incubating) 一路的研发改进,并且探讨现代的可视化工具的探索方向。

    主讲嘉宾介绍

    羡辙

    是著名开源可视化产品 Apache ECharts (incubating) 的 PPMC 成员和核心贡献者之一。除此之外,也是活跃的开源社区贡献者。在 GitHub(id:Ovilia)上,她开源了多款有趣的可视化作品,比如老派像素风的个人主页、每天收获不同字体故事的「2019 字体日历」App、解答「为什么你的女神总缺一支口红」的口红可视化作品、将声音用手绘效果表现的音频可视化作品等等。

    黄向东

    博士,清华大学软件学院助理研究员。研究方向为大数据系统架构与时间序列数据管理技术。他是Apache IoTDB项目的初始源码提交者之一,同时也是Apache IoTDB 项目 VP。

    杨华/赵玉威

    T3 出行大数据平台负责人。Apache Hudi committer & PMC member。Apache Kylin committer 及 Flink Cube 引擎作者。Apache Flink 国内早期布道者及活跃贡献者。前腾讯高级工程师,曾主导 Flink 框架在腾讯从落地到支撑日均近 20 万亿消息的处理规模。曾连续两年受邀在QCon全球开发者大会上进行技术分享。

    翟佳

    StreamNative的联合创始人兼CTO。是开源项目Apache Pulsar和Apache BookKeeper的PMC成员和Committer。主要从事分布式、消息系统、流存储、文件系统等相关的设计和开发。曾就职于EMC,先后是统一存储平台和实时处理平台的技术负责人。

    刘睿

    Apache开源社区贡献者,Apache RocketMQ committer, Apache IoTDB PMC,阿里巴巴研发工程师,硕士毕业于清华大学,主要工作和研究方向涉及云原生时代下的消息中间件,时序数据库,分布式系统。曾作为讲师多次在RocketMQ、IoTDB社区及其他开源活动中进行分享。

    金融通

    Apache RocketMQ PMC Member,阿里巴巴研发工程师,对分布式消息系统等有深刻理解。作为讲师曾在Apache RocketMQ社区和其他开源活动中进行过多次分享。

    张智超

    目前就职于上海跬智信息技术有限公司(Kyligence)开源组,参与了Apache Kylin和Apache CarbonData等开源项目。

    陈明雨

    百度资深研发工程师,负责Apache Doris(Incubating) 设计研发工作。同时维护Doris在百度内部超过千台的部署规模,为超过200个业务线提供稳定可靠的数据分析服务。#6年分布式系统研发经验,一直专注于分布式可扩展分析型数据库领域,主导参与了ApacheDoris从百度开源到进入Apache孵化器的全过程,同时也是ApacheDoris的PPMC成员。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇) | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    12 +Oct 2020

    追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)

    引言

    没有什么好说的,从分布式系统到调度器,再到可观察性,以及数据可视化,当然还有消息队列,大数据处理、IoT。

    让更多的人知道项目,才可能从这些人中转化为用户,用户中可能筛选出贡献者,进而形成良性循环,这大概是所有开源项目的期望。

    以下技术内容,因为缺少对比,仅仅在此给大家罗列出来目前在本土所分享的关于技术议题,没有逻辑、没有分类、没有主线,唯一的相似之处就是这些项目是捐赠给了Apache软件基金会,以Apache之道的方式在运作,技术水平如何,解决了用户什么问题,请详细阅读。或者来COSCon的现场聆听。

    项目在生产环境中的落地

    本次分享首先会介绍DolphinScheduler社区的发展情况,然后会介绍我们当时为何要重复造轮子再造大数据任务调度,DolphinScheduler整体的设计思想、考量以及DolphinScheduler的特性和能力,接下来会介绍DolphinScheduler架构的变迁过程。#在此次分享中我也会讲述我们在做大数据任务调度时遇到的挑战和积累下来的经验,也会分享一些用户案例和使用场景,最后会分享一下开源的历程

    此次分享主要介绍Apache Skywalking 在小米信息技术部的应用,包括并且不限于Apache Skywalking 在小米新零售、商城、门店等10多个业务的应用以及整体部署架构(中国大陆、俄罗斯、新加坡等机房部署)、在小米如何处理每日新增数亿trace segment以及相关优化配置、Apache Skywalking 告警模块如何跟小米内部告警平台打通等二次开发内容、小米对Apache Skywalking 开源社区的一点贡献。

    作为Apache顶级项目的ShardingSphere,将会在最新发布版本中迈向从分布式数据库中间件生态圈到分布式数据库的转型。#已在GitHub上收获12k+ Star的开源人气项目将进一步根据用户需求和应用场景,在这个数据库化的过程中全力打造更为简单、丰富、一体化、可插拔的分布式数据库产品体系,从而为用户提供最简单易用、功能强大、性能稳定的分布式数据库化产品。本次分享将为详细阐述数据库化的产品特性、架构体系、极简落地方案实践等核心内容。

    自从2017年成为国内首个中间件Apache开源顶级项目以来,Apache RocketMQ 以高性能、低延迟和高可靠的消息发布与订阅服务成为各厂商业务消息的首选。进入云原生时代,Apache RocketMQ也在悄然成为云原生时代的通信基础设施。本次演讲将结合Apache RocketMQ开源历程,介绍在云原生时代 RocketMQ核心竞争力、最新的技术进展、开源社区生态以及未来展望。

    Apache Kylin 4.0 Alpha版本日前已经发布,它是Apache Kylin 4的第一个早期预览版本,是继Kylin 3之后的一个重大架构升级版本,采用Parquet这种真正的列式存储来代替HBase存储,提升文件扫描性能;同时重新实现了基于Spark的构建引擎和查询引擎,使得计算和存储分离变为可能,更加适应云原生的技术趋势。本次演讲嘉宾张智超将从架构升级,原理讲解,重大特性等几个方面来介绍Apache Kylin 4.0。

    Apache Doris(Incubating)是一款支持对海量数据进行快速分析的 MPP 数据库。Doris 自设计之初,就秉承着极简运维、高效可靠、易学易用的原则,为用户提供全面而高效的海量数据分析能力。自 2018 年底进入 Apache 孵化器后,Doris 已经发布了 5 个大版本,接收了来自社区 100 多位开发者的贡献,并在多家互联网头部企业和垂直领域企业落地和应用。本次演讲主要包含 Doris 的发展历程、系统架构、主要特性和应用案例四个部分,帮助听众对 Doris 有一个全面而具象的认识。最后,陈明雨会介绍 Doris 社区目前的发展情况,希望能够帮助开发者更方便快捷的加入开源社区。

    定制化Operator模式在面向Kubernetes的云化平台建构中变得越来越流行。Apache SkyWalking社区已经开始尝试使用Operator模式去构建基于Kubernetes平台的PaaS云组件。本次分享给将会给听众带来该项目的初衷,实现与未来演进等相关内容。分享的内容包含:#1. 项目动机与设计理念#2. 核心功能展示,包含SkyWalking核心组件的发布,更新与维护。#3. 观测ServiceMesh,包含于Istio的自动集成。#4. 目前的工作进展和对未来的规划。

    ElasticJob 在 2015 年首次面世,经历多年的开源历程,于 2020年5月28日 正式成为 Apache ShardingSphere 旗下子项目。#ElasticJob 是一款服务于任务分片的分布式调度中间件,在加入 Apache 软件基金会之后,它的设计理念,整体架构和功能都进一步的完善和升级,并且已经发布了第一个 Apache 版本 - 3.0.0-alpha。#本次分享在简短回顾 ElasticJob 的发展历史后,将着重介绍其 3.x 版本的功能和设计理念的转变,以及和 Apache ShardingSphere 的结合点。

    RocketMQ作为有状态的分布式消息服务,如何在云原生时代下做到极简运维管控,是一个极具挑战和价值的问题。本次演讲主要介绍RocketMQ Operator相关的背景知识、技术原理以及如何使用它在Kubernetes上进行RocketMQ集群的部署和管理。

    Apache Pulsar是下一代云原生消息平台,Apache Pulsar 从雅虎开源,在2018年9月毕业成为Apache基金会的顶级项目。#Apace Pulsar从2012年诞生时就前瞻性地采用了存储计算分离、分层分片的云原生架构,极大减轻了了用户在消息系统中遇到的扩展和运维的困难。#本次演讲将深入介绍 Pulsar 的云原生的特性和架构优势,以及在全面云原生时代 Pulsar 的最新技术进展。

    T3 出行是一家基于车联网驱动的网约车平台,拥有海量且丰富的数据源。为此在很早就基于Apache Hudi构建了企业级的数据湖。但数据湖从外界摄取的数据源绝大部分都是原始数据,而为了使原始数据变得更有业务价值和分析价值,T3出行 需要对数据进行ETL等进行脱敏。这时为了解决低延迟、高效的数据加工,最初引入了Easy Scheduler(DolphinScheduler前身),在使用过程中发现了不少问题。随着DolphinScheduler加入Apache孵化器进行孵化并快速迭代,T3出行也随之升级到了DolphinScheduler并围绕它打造了一个企业级的大数据调度管理平台。这次分享T3出行将会对基于Apache DolphinScheduler支撑数据湖上低延迟数据加工的实践进行介绍。

    工业物联网数据的主体是机器产生的时序数据,是工业互联网的原矿。与其他大数据不同,其具有高通量、低质量、弱模式、查询分析复杂等特点。Apache IoTDB是从中国高校发起的,经过多年迭代,在多个工业生产系统中经过验证的新一代工业物联网数据库管理系统,目前已成为Apache顶级项目。本报告将详细介绍工业物联网中的挑战,Apache IoTDB的基本概念和特性,并简单介绍基于Apache IoTDB的相关实际案例,帮助听众了解如何基于Apache IoT生态,解决工业物联网数据应用需求。

    随着数据可视化需求的不断增长以及对可视化理论理解的逐渐加深,数据可视化工具在近年来发生了很大的转变。最初,可视化的需求主要集中在使用静态的图表展现数据,以帮助用户更直观地理解数据。后来,交互性的可视化工具被用作加强用户对数据关系理解的手段。现在,可视化工具另一个很重要的功能是帮助讲好一个故事。我们期望可视化工具能够帮助用户探索并思考数据背后的故事,并且由此受到启发甚至在之后影响自己的行为。在这个分享中,我们会介绍 Apache ECharts (incubating) 一路的研发改进,并且探讨现代的可视化工具的探索方向。

    主讲嘉宾介绍

    羡辙

    是著名开源可视化产品 Apache ECharts (incubating) 的 PPMC 成员和核心贡献者之一。除此之外,也是活跃的开源社区贡献者。在 GitHub(id:Ovilia)上,她开源了多款有趣的可视化作品,比如老派像素风的个人主页、每天收获不同字体故事的「2019 字体日历」App、解答「为什么你的女神总缺一支口红」的口红可视化作品、将声音用手绘效果表现的音频可视化作品等等。

    黄向东

    博士,清华大学软件学院助理研究员。研究方向为大数据系统架构与时间序列数据管理技术。他是Apache IoTDB项目的初始源码提交者之一,同时也是Apache IoTDB 项目 VP。

    杨华/赵玉威

    T3 出行大数据平台负责人。Apache Hudi committer & PMC member。Apache Kylin committer 及 Flink Cube 引擎作者。Apache Flink 国内早期布道者及活跃贡献者。前腾讯高级工程师,曾主导 Flink 框架在腾讯从落地到支撑日均近 20 万亿消息的处理规模。曾连续两年受邀在QCon全球开发者大会上进行技术分享。

    翟佳

    StreamNative的联合创始人兼CTO。是开源项目Apache Pulsar和Apache BookKeeper的PMC成员和Committer。主要从事分布式、消息系统、流存储、文件系统等相关的设计和开发。曾就职于EMC,先后是统一存储平台和实时处理平台的技术负责人。

    刘睿

    Apache开源社区贡献者,Apache RocketMQ committer, Apache IoTDB PMC,阿里巴巴研发工程师,硕士毕业于清华大学,主要工作和研究方向涉及云原生时代下的消息中间件,时序数据库,分布式系统。曾作为讲师多次在RocketMQ、IoTDB社区及其他开源活动中进行分享。

    金融通

    Apache RocketMQ PMC Member,阿里巴巴研发工程师,对分布式消息系统等有深刻理解。作为讲师曾在Apache RocketMQ社区和其他开源活动中进行过多次分享。

    张智超

    目前就职于上海跬智信息技术有限公司(Kyligence)开源组,参与了Apache Kylin和Apache CarbonData等开源项目。

    陈明雨

    百度资深研发工程师,负责Apache Doris(Incubating) 设计研发工作。同时维护Doris在百度内部超过千台的部署规模,为超过200个业务线提供稳定可靠的数据分析服务。#6年分布式系统研发经验,一直专注于分布式可扩展分析型数据库领域,主导参与了ApacheDoris从百度开源到进入Apache孵化器的全过程,同时也是ApacheDoris的PPMC成员。

    \ No newline at end of file diff --git a/post/event/apache-roadshow-china-2020-virtual/index.html b/post/event/apache-roadshow-china-2020-virtual/index.html index 420168d0..02af6d28 100644 --- a/post/event/apache-roadshow-china-2020-virtual/index.html +++ b/post/event/apache-roadshow-china-2020-virtual/index.html @@ -1,3 +1,6 @@ -增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇) · ALC Beijing

    增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)

    引言

    最近的一次数据统计:

    序号项目名称进入孵化器时间毕业时间ppmc/pmc人数commiter人数(包含ppmc/pmc)
    1Kylin2014年11月2015年11月2339
    2Eagle2015年10月2016年12月1618
    3HAWQ2015年9月2018年8月4568
    4CarbonData2016年6月2017年4月1325
    5RocketMQ2016年11月2017年9月1326
    6Griffin2016年12月2018年11月1820
    7Weex2016年11月1426
    8ServiceComb2017年11月2018年10月2023
    9SkyWalking2017年12月2019年4月2737
    10Dubbo2018年2月2019年5月1755
    11ECharts2018年1月1319
    12Doris2018年7月1317
    13brpc2018年11月99
    14IoTDB2018年11月2020.102332
    15ShardingSphere2018年11月1424
    16DolphinScheduler2019年8月2020.51322
    17Teaclave2019年8月1515
    18APISIX2019年10月2020.71820
    19TubeMQ2019年11月2021

    为什们国内有这么多的项目要加入 Apache 软件基金会?

    让我们听听项目导师和项目创始人现身说法。

    Apache 项目孵化该如何做?

    来自十多年辅导项目孵化的“身经百战”的导师,指导和参与孵化上面列表中的Apache项目过半,那么这些所有的历程有哪些通用的法则?来自本土的项目有哪些常犯的错误?姜宁老师现身说法:

    ASF孵化器作为进入Apache软件基金会(ASF)的通道,为进入ASF的项目提供Apache way的辅导,协调孵化项目与ASF基础设施融合,帮助孵化项目发展社区,保证孵化项目软件发布符合ASF的软件发布规范。本次演讲我将结合实际案例讲解ASF的孵化器的运行机制,孵化辅导的基本原则,以及孵化过程需要注意的问题。

    姜宁老师是Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,有十五年以上企业级开源中间件开发经验,有丰富的 Java 开发和使用经验,函数式编程爱好者。从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,先后参与 Apache CXF, Apache Camel,Apache ServiceMix,以及Apache ServiceComb的开发。2015年开始担任Apache 孵化器导师,参与孵化了 Apache Rocket, Apache Skywalking, Apache ShardingSphere, Apache IoTDB, Apache Doris(Incubating), Apache APISIX, Apache Weex(Incubating)。

    如何才能更加快速的从孵化中毕业

    ALC Beijing Podcast 在今年年中和 Apache APISIX 团队核心成员聊:Apache APISIX 的快速之旅 ,深度的谈及了整个过程,如果你没有读过此文或者听过播客的话,建议在听温铭老师的演讲之前最好是完整的过一遍,温铭老师如此描述他这次的分享:

    Apache APISIX 只用了 9 个月就从 Apache 孵化器顺利毕业,成为顶级项目。在其他人看来是顺风顺水,但其实不然,Apache APISIX 社区和贡献者们从最初对 Apache 文化的疑虑,到尝试,最终认同,背后也有不少波折。#在这次分享中,我将为大家带来 Apache APISIX 在 Apache 孵化器中的一些实践,来印证 Apache Way 在中国依然是行得通的。

    温铭:深圳支流科技创始人,云原生 API 网关 Apache APISIX PMC 成员,360 开源委员会发起人,《OpenResty 从入门到实战》专栏作者。在互联网安全公司和黑产对抗多年,有 40 多项中美安全专利。

    (音频版:Apache APISIX 的快速之旅

    Apache 对孵化项目的要求

    Craig Russell 先生对于国内的朋友来说不是很陌生,他在2019年接受过InfoQ 二叉树的专访,在进一步聆听他在COSCon‘20的KeyNote之前,大家可以再温习一下他的主张~,对于这次分享,他如此描述:

    Apache recently celebrated our 20-year anniversary as a software foundation. Our mission is to provide software for the public good, available at 100% no charge.#The Foundation now oversees over 300 projects with over 7,900 committers from more than 100 countries, and more than half a million contributors over the years, with nearly 40,000 this year alone.#Apache has many contributors and projects from China, including some that were originally developed in China and later became Apache projects through the Incubator.#The permissive Apache License ensures all Apache software is safe by allowing anyone to use, extend, and provide services. The only requirement is to acknowledge the source of the code.

    Apache communities are safe for users and developers, with shared goals, a strict Code of Conduct, and the guidance and protection from the Foundation.

    The Apache community welcomes participation from all people willing to help make world-class software for the common good.

    来,用心感受一下,还需要更多理由吗?

    Craig Russell (clr@apache.org) is a Member and Director of The Apache Software Foundation, Assistant Secretary, and former Board Chair. He is a member of the Incubator Project Management Committee responsible for bringing new projects into Apache.

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇) | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    12 +Oct 2020

    增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)

    引言

    最近的一次数据统计:

    序号项目名称进入孵化器时间毕业时间ppmc/pmc人数commiter人数(包含ppmc/pmc)
    1Kylin2014年11月2015年11月2339
    2Eagle2015年10月2016年12月1618
    3HAWQ2015年9月2018年8月4568
    4CarbonData2016年6月2017年4月1325
    5RocketMQ2016年11月2017年9月1326
    6Griffin2016年12月2018年11月1820
    7Weex2016年11月1426
    8ServiceComb2017年11月2018年10月2023
    9SkyWalking2017年12月2019年4月2737
    10Dubbo2018年2月2019年5月1755
    11ECharts2018年1月1319
    12Doris2018年7月1317
    13brpc2018年11月99
    14IoTDB2018年11月2020.102332
    15ShardingSphere2018年11月1424
    16DolphinScheduler2019年8月2020.51322
    17Teaclave2019年8月1515
    18APISIX2019年10月2020.71820
    19TubeMQ2019年11月2021

    为什们国内有这么多的项目要加入 Apache 软件基金会?

    让我们听听项目导师和项目创始人现身说法。

    Apache 项目孵化该如何做?

    来自十多年辅导项目孵化的“身经百战”的导师,指导和参与孵化上面列表中的Apache项目过半,那么这些所有的历程有哪些通用的法则?来自本土的项目有哪些常犯的错误?姜宁老师现身说法:

    ASF孵化器作为进入Apache软件基金会(ASF)的通道,为进入ASF的项目提供Apache way的辅导,协调孵化项目与ASF基础设施融合,帮助孵化项目发展社区,保证孵化项目软件发布符合ASF的软件发布规范。本次演讲我将结合实际案例讲解ASF的孵化器的运行机制,孵化辅导的基本原则,以及孵化过程需要注意的问题。

    姜宁老师是Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,有十五年以上企业级开源中间件开发经验,有丰富的 Java 开发和使用经验,函数式编程爱好者。从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,先后参与 Apache CXF, Apache Camel,Apache ServiceMix,以及Apache ServiceComb的开发。2015年开始担任Apache 孵化器导师,参与孵化了 Apache Rocket, Apache Skywalking, Apache ShardingSphere, Apache IoTDB, Apache Doris(Incubating), Apache APISIX, Apache Weex(Incubating)。

    如何才能更加快速的从孵化中毕业

    ALC Beijing Podcast 在今年年中和 Apache APISIX 团队核心成员聊:Apache APISIX 的快速之旅 ,深度的谈及了整个过程,如果你没有读过此文或者听过播客的话,建议在听温铭老师的演讲之前最好是完整的过一遍,温铭老师如此描述他这次的分享:

    Apache APISIX 只用了 9 个月就从 Apache 孵化器顺利毕业,成为顶级项目。在其他人看来是顺风顺水,但其实不然,Apache APISIX 社区和贡献者们从最初对 Apache 文化的疑虑,到尝试,最终认同,背后也有不少波折。#在这次分享中,我将为大家带来 Apache APISIX 在 Apache 孵化器中的一些实践,来印证 Apache Way 在中国依然是行得通的。

    温铭:深圳支流科技创始人,云原生 API 网关 Apache APISIX PMC 成员,360 开源委员会发起人,《OpenResty 从入门到实战》专栏作者。在互联网安全公司和黑产对抗多年,有 40 多项中美安全专利。

    (音频版:Apache APISIX 的快速之旅

    Apache 对孵化项目的要求

    Craig Russell 先生对于国内的朋友来说不是很陌生,他在2019年接受过InfoQ 二叉树的专访,在进一步聆听他在COSCon‘20的KeyNote之前,大家可以再温习一下他的主张~,对于这次分享,他如此描述:

    Apache recently celebrated our 20-year anniversary as a software foundation. Our mission is to provide software for the public good, available at 100% no charge.#The Foundation now oversees over 300 projects with over 7,900 committers from more than 100 countries, and more than half a million contributors over the years, with nearly 40,000 this year alone.#Apache has many contributors and projects from China, including some that were originally developed in China and later became Apache projects through the Incubator.#The permissive Apache License ensures all Apache software is safe by allowing anyone to use, extend, and provide services. The only requirement is to acknowledge the source of the code.

    Apache communities are safe for users and developers, with shared goals, a strict Code of Conduct, and the guidance and protection from the Foundation.

    The Apache community welcomes participation from all people willing to help make world-class software for the common good.

    来,用心感受一下,还需要更多理由吗?

    Craig Russell (clr@apache.org) is a Member and Director of The Apache Software Foundation, Assistant Secretary, and former Board Chair. He is a member of the Incubator Project Management Committee responsible for bringing new projects into Apache.

    \ No newline at end of file diff --git a/post/event/apachehome-shengwu-keynote/index.html b/post/event/apachehome-shengwu-keynote/index.html index 304ab556..90884237 100644 --- a/post/event/apachehome-shengwu-keynote/index.html +++ b/post/event/apachehome-shengwu-keynote/index.html @@ -1,3 +1,6 @@ -正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲 · ALC Beijing

    正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲

    引言

    视频地址:https://www.youtube.com/watch?v=26aFGdbZvac&t=1172s ,需要稳定的网络环境。

    正文

    (以下内容根据吴晟的演讲视频进行的人工文字录入,若有出入,请以原视频为准。)

    Rich Bowen 介绍了吴晟的出场:Apache SkyWalking VP

    大家好!欢迎来到今年的ApacheCon@Home,我加入ASF也有四年的时间了,在过去的四年中我参与和见证了很多的Apache 项目,也为很多项目做了应有的贡献,今天非常荣幸的能够在ApacheCon上和大家分享我的经验,我的分享主题是:成长中的中国本土 Apache,在正式开始之前,我还是介绍一下我本人吧:

    • Founding Engineer at Tetrate.
    • Apache Member.
    • He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member. Speak at multiple conferences, including LC3 China twice, QCon Beijing (star speaker) three times. Also be the member of Cloud Native Computing Foundation (CNCF) OpenTracing Specification Council, contribute to the OpenTracing project.

    看起来,我都是在开源圈内活动的,呵呵。

    在去年的 Apache 软件基金会年度报告里,中国是下载量最大的地域,如下图所示,来自中国的用户下载Apache项目的量是很大的,这

    说明中国本土拥有共同体最基础的部分——用户,来自中国的用户使用apache软件,认可Apache软件的质量,认同Apache 文化,这是一切行之有效的开始:只有先成为用户,在未来的某一天才会可能进一步的成为apache 贡献者,或许还会游说别人加入我们,我们再来看看来自中国的商业公司对于Apache软件基金会的赞助情况,首先我们非常感谢这些赞助我们的厂商,他们分别是:

    • 白金赞助:华为、腾讯云
    • 黄金赞助:百度
    • 银牌赞助:阿里云、浪潮

    所有这些厂商不仅仅是捐赠现金,而且他们还支持其员工参与到Apache的项目中来,有的甚至拥有相当规模的团队作战。

    还有,在去年的ApacheCon大会上,2019.9月,来自中国的参会成员有非常多,我以为相比其它地区来的人,应该是最多的地区了,而且也是最多的分享嘉宾,在会上和来自世界各地的Apache粉丝们结交朋友、沟通有无。我们都有直接的联系,有的人使用邮件列表交谈过多次了,但是在这次会上才见了真人,我再和大家分享一个事情,说起孵化的项目,最近刚刚从孵化器毕业成为Apache顶级项目的是 IoTDB,来自中国本土发起的项目目前成为顶级项目的有12个,我这里特别说明,仅仅是一个发起,因为在孵化的过程中,项目的共同体也变得多样化、国际化,对于我个人来讲,这是迈出非常大的一步,就我所知,Apache的上次路演活动,要追溯到10年前,要知道以前开源项目都是由诸如IBM之类的大公司的,今非昔比,现在来自本土发起的项目也在逐步成长,它们涵盖大数据、可观察性、分布式系统、IoT等等,我们还在寻找更多来自中国原创的项目加入到Apache当中来,我们也在发掘更多的人参与进来,另外,来自中国发起的正在孵化的项目,还有8个之多,有一些项目已经是经历了蛮长时间的了,有的是刚刚才加入的,也就几个月之前吧,我们见证这些项目的成长,他们在践行Apache之道、Apache 文化,我们看到更多的贡献者加入到Apache软件基金会。

    我们看到诸如Kylin、SkyWalking等项目有着大量的贡献者,100、200、300等都是普遍可见的,他们非常的活跃,不仅为项目贡献代码,还会积极的倡导Apache之道,传播Apache文化,还邀请更多的人加入。

    我们再来看一个名单,来自中国的Apache 成员,在今天共有22位华人Apache成员,在刚刚过去的选举中,我们有11位新晋成员,其中就包括我自己,另外记忆犹新的,是几年前,在SkyWalking要找导师的时候,来自中国的成员实在是很少,很难找到指导,比如基金会是如何运作的?如何迈出第一步?现在的情况完全不一样了,我们有了较多的选择,我还会找更多的人才加入我们!

    对于本地的共同体(Apache local community)来讲,这真是一个令人振奋的消息,Apache软件基金会同意在北京建立当地的开源共同体,这是一个较为正式的组织,ALC Beijing的成员均来自本地,而且我们并没有将这个共同体限制在北京本地,我们还试图在中国的其它城市进行宣传和活动,有那么点 China local community的意思,旨在传播和倡导Apache之道。

    对于活动来说,我们在去年在清华大学举办了一场线下活动,有多个顶级项目和孵化中的项目参与到了这次活动当中来,有很多学生非常热情的想了解:什么是开源?什么是Apache之道?That is pretty cool~

    在今年年初,疫情爆发,在中国恰是过春节,我们哪里也去不了,于是想法做点什么,然后我们就尝试以Podcast的形式继续传播Apache之道,而且连续的做了多期,来自多位apache相关成员进行了一些话题讨论,诸如好的开发者、开源的商业价值、apache之道、等等,很多嘉宾包括我自己,都是来自开源共同体的人员,我们要试图讲清楚很多事,比如在中国,绝大多数人认为开源就是免费,或者是没有任何报酬的去做一些工作,这些都是需要我们花费时间和精力和大家说清楚的。

    在今年夏天的时候,中科院软件所和Open Euler 合办了“ Open Source Summer 2020”,一个类似GSoC的针对大学生暑期的项目,来自本土发起的几个Apache项目均报名参加了这个项目,我们为学生提供指导,让学生能够做点什么。诸如为开源做第一次贡献,无论是写代码、文档、博客等都可以,我们认为,如果这些学生能够在开源的世界迈出第一步,那么以后就又可能会走的更远。

    接下来再和大家分享一个故事,我们知道去年是ASF成立20周年,特别录制了纪录片,如《Trillions and Trillions Served》,ALC Beijing 联合开源社翻译并制作了字幕,并发布在哔哩哔哩视频网站,一家类似YouTube的视频分享站点。我们还按照中国特色,创建了微信公众号,发表翻译自Apache博客的文章、关键成员采访、Apache之道介绍、Apache项目技术介绍等,这样可以和本地的人们保持密切的联系和互动,邮件列表对于中国很多年轻人都充满了挑战。当然这也不止于中国,在西方的世界,Slack就是对邮件列表最大的挑战,因为即时通信更加符合人的本性。但是邮件列表的价值是无法替代的,所以我们仍然在积极的倡导,Jira track 、GitHub issue 都是对QQ群、微信群的生疏之地,这也是我们撰写文章的重要原因,

    特别隆重介绍,ACL Beijing 的播客,在鼠年话开源之后,我们从其它的开源相关介绍独立出来了专门介绍Apache相关的频道,由我们ALC Beijing的成员来主持日常,在播客中会对Apache的成员、PMC、贡献者等等相关人物进行采访、项目等孵化历程、技术讲解、community建设等。

    当然,回到我们的ApacheCon@home,令我非常振奋的是今年为普通话专门开设了一个专题,这是非常有意义的。另外,特别给大家打一个预告,在10.24这天举办的COSCon‘2020+Apache 路演,将再度有非常多的Apache项目的分享,参与这次会议的有非常多的Apache成员,这次我们在北京为演讲者准备了场地,也算是线下的聚会。

    说了这么多好的方面,尽管大家取得了不错的成绩,但是未来还是有很多事情去做的,接下来和大家聊聊充满挑战的一面,开放文化就是一方面,你不仅是为公益而生,参与开源的有很多情况,有个人追求、工作等等,因为缺少多样性,人们没有太多的动力去参与开源,当然也就是不会参与到Apache了,我们会尽力去接受这个挑战,当然,这也意味着有很多的工作要去做。还是有很多人认为英语仍然是参与开源的重大障碍,扫清这个障碍可就没有那么的容易了,今年的ApacheCon普通话分论坛其实从另外一面反应了语言的障碍,翻译仍然很重要,这体现在GitHub issue、邮件列表,但是参与到开源,英语技能是个必须项,退无可退~ 先不用说使用英语,建立个人的全球联系,阅读英文文档,就是很多人需要越过的第一道坎,学好英语是参与开源充分条件。即使在现在仍然有很多人认为开源仅仅是项目,而忽略背后的共同体因素,这一点任重道远。

    最后要说的一点是,中国的开发者并没有足够的时间,他们通常会每周工作6到7天,他们整天都在为公司加班,所以他们根本没有时间停下来参与,当然,还要分出时间来陪家人、孩子、父母,以上所有的障碍,造成的状态就是中国的开发者根本不可能参与到开源当中来,就我个人观察而言,即使有些开发者对开源有极大的兴趣,对共同体有归属感,他们也没有勇气去迈出那艰难的一步,所以我在这里呼吁,哪些来自中国的、基于开源构建的商业公司、使用了开源项目的商业公司,请尽一切可能帮助到开发者。

    无论是来自ALC Beijing、还是来自其它Apache项目的中国公司,我们都在努力,努力的去清除掉这些障碍,就我个人而言,我可以分享我过去4年开源经历所学习到的,开源可以帮助到人们的职业生涯,也许在2、3年甚至5年之后,再返回头来看我今天的演讲,在2025年 的时候,有更多的Apache项目孵化、更多的参与者、很多的情形都得到了改进。

    嗯,以上就是我和大家分享的,谢谢大家,谢谢参与ApacheCon,请选择哪些你感兴趣的议题,享受吧!

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    12 +Oct 2020

    正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲

    引言

    视频地址:https://www.youtube.com/watch?v=26aFGdbZvac&t=1172s ,需要稳定的网络环境。

    正文

    (以下内容根据吴晟的演讲视频进行的人工文字录入,若有出入,请以原视频为准。)

    Rich Bowen 介绍了吴晟的出场:Apache SkyWalking VP

    大家好!欢迎来到今年的ApacheCon@Home,我加入ASF也有四年的时间了,在过去的四年中我参与和见证了很多的Apache 项目,也为很多项目做了应有的贡献,今天非常荣幸的能够在ApacheCon上和大家分享我的经验,我的分享主题是:成长中的中国本土 Apache,在正式开始之前,我还是介绍一下我本人吧:

    • Founding Engineer at Tetrate.
    • Apache Member.
    • He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member. Speak at multiple conferences, including LC3 China twice, QCon Beijing (star speaker) three times. Also be the member of Cloud Native Computing Foundation (CNCF) OpenTracing Specification Council, contribute to the OpenTracing project.

    看起来,我都是在开源圈内活动的,呵呵。

    在去年的 Apache 软件基金会年度报告里,中国是下载量最大的地域,如下图所示,来自中国的用户下载Apache项目的量是很大的,这

    说明中国本土拥有共同体最基础的部分——用户,来自中国的用户使用apache软件,认可Apache软件的质量,认同Apache 文化,这是一切行之有效的开始:只有先成为用户,在未来的某一天才会可能进一步的成为apache 贡献者,或许还会游说别人加入我们,我们再来看看来自中国的商业公司对于Apache软件基金会的赞助情况,首先我们非常感谢这些赞助我们的厂商,他们分别是:

    • 白金赞助:华为、腾讯云
    • 黄金赞助:百度
    • 银牌赞助:阿里云、浪潮

    所有这些厂商不仅仅是捐赠现金,而且他们还支持其员工参与到Apache的项目中来,有的甚至拥有相当规模的团队作战。

    还有,在去年的ApacheCon大会上,2019.9月,来自中国的参会成员有非常多,我以为相比其它地区来的人,应该是最多的地区了,而且也是最多的分享嘉宾,在会上和来自世界各地的Apache粉丝们结交朋友、沟通有无。我们都有直接的联系,有的人使用邮件列表交谈过多次了,但是在这次会上才见了真人,我再和大家分享一个事情,说起孵化的项目,最近刚刚从孵化器毕业成为Apache顶级项目的是 IoTDB,来自中国本土发起的项目目前成为顶级项目的有12个,我这里特别说明,仅仅是一个发起,因为在孵化的过程中,项目的共同体也变得多样化、国际化,对于我个人来讲,这是迈出非常大的一步,就我所知,Apache的上次路演活动,要追溯到10年前,要知道以前开源项目都是由诸如IBM之类的大公司的,今非昔比,现在来自本土发起的项目也在逐步成长,它们涵盖大数据、可观察性、分布式系统、IoT等等,我们还在寻找更多来自中国原创的项目加入到Apache当中来,我们也在发掘更多的人参与进来,另外,来自中国发起的正在孵化的项目,还有8个之多,有一些项目已经是经历了蛮长时间的了,有的是刚刚才加入的,也就几个月之前吧,我们见证这些项目的成长,他们在践行Apache之道、Apache 文化,我们看到更多的贡献者加入到Apache软件基金会。

    我们看到诸如Kylin、SkyWalking等项目有着大量的贡献者,100、200、300等都是普遍可见的,他们非常的活跃,不仅为项目贡献代码,还会积极的倡导Apache之道,传播Apache文化,还邀请更多的人加入。

    我们再来看一个名单,来自中国的Apache 成员,在今天共有22位华人Apache成员,在刚刚过去的选举中,我们有11位新晋成员,其中就包括我自己,另外记忆犹新的,是几年前,在SkyWalking要找导师的时候,来自中国的成员实在是很少,很难找到指导,比如基金会是如何运作的?如何迈出第一步?现在的情况完全不一样了,我们有了较多的选择,我还会找更多的人才加入我们!

    对于本地的共同体(Apache local community)来讲,这真是一个令人振奋的消息,Apache软件基金会同意在北京建立当地的开源共同体,这是一个较为正式的组织,ALC Beijing的成员均来自本地,而且我们并没有将这个共同体限制在北京本地,我们还试图在中国的其它城市进行宣传和活动,有那么点 China local community的意思,旨在传播和倡导Apache之道。

    对于活动来说,我们在去年在清华大学举办了一场线下活动,有多个顶级项目和孵化中的项目参与到了这次活动当中来,有很多学生非常热情的想了解:什么是开源?什么是Apache之道?That is pretty cool~

    在今年年初,疫情爆发,在中国恰是过春节,我们哪里也去不了,于是想法做点什么,然后我们就尝试以Podcast的形式继续传播Apache之道,而且连续的做了多期,来自多位apache相关成员进行了一些话题讨论,诸如好的开发者、开源的商业价值、apache之道、等等,很多嘉宾包括我自己,都是来自开源共同体的人员,我们要试图讲清楚很多事,比如在中国,绝大多数人认为开源就是免费,或者是没有任何报酬的去做一些工作,这些都是需要我们花费时间和精力和大家说清楚的。

    在今年夏天的时候,中科院软件所和Open Euler 合办了“ Open Source Summer 2020”,一个类似GSoC的针对大学生暑期的项目,来自本土发起的几个Apache项目均报名参加了这个项目,我们为学生提供指导,让学生能够做点什么。诸如为开源做第一次贡献,无论是写代码、文档、博客等都可以,我们认为,如果这些学生能够在开源的世界迈出第一步,那么以后就又可能会走的更远。

    接下来再和大家分享一个故事,我们知道去年是ASF成立20周年,特别录制了纪录片,如《Trillions and Trillions Served》,ALC Beijing 联合开源社翻译并制作了字幕,并发布在哔哩哔哩视频网站,一家类似YouTube的视频分享站点。我们还按照中国特色,创建了微信公众号,发表翻译自Apache博客的文章、关键成员采访、Apache之道介绍、Apache项目技术介绍等,这样可以和本地的人们保持密切的联系和互动,邮件列表对于中国很多年轻人都充满了挑战。当然这也不止于中国,在西方的世界,Slack就是对邮件列表最大的挑战,因为即时通信更加符合人的本性。但是邮件列表的价值是无法替代的,所以我们仍然在积极的倡导,Jira track 、GitHub issue 都是对QQ群、微信群的生疏之地,这也是我们撰写文章的重要原因,

    特别隆重介绍,ACL Beijing 的播客,在鼠年话开源之后,我们从其它的开源相关介绍独立出来了专门介绍Apache相关的频道,由我们ALC Beijing的成员来主持日常,在播客中会对Apache的成员、PMC、贡献者等等相关人物进行采访、项目等孵化历程、技术讲解、community建设等。

    当然,回到我们的ApacheCon@home,令我非常振奋的是今年为普通话专门开设了一个专题,这是非常有意义的。另外,特别给大家打一个预告,在10.24这天举办的COSCon‘2020+Apache 路演,将再度有非常多的Apache项目的分享,参与这次会议的有非常多的Apache成员,这次我们在北京为演讲者准备了场地,也算是线下的聚会。

    说了这么多好的方面,尽管大家取得了不错的成绩,但是未来还是有很多事情去做的,接下来和大家聊聊充满挑战的一面,开放文化就是一方面,你不仅是为公益而生,参与开源的有很多情况,有个人追求、工作等等,因为缺少多样性,人们没有太多的动力去参与开源,当然也就是不会参与到Apache了,我们会尽力去接受这个挑战,当然,这也意味着有很多的工作要去做。还是有很多人认为英语仍然是参与开源的重大障碍,扫清这个障碍可就没有那么的容易了,今年的ApacheCon普通话分论坛其实从另外一面反应了语言的障碍,翻译仍然很重要,这体现在GitHub issue、邮件列表,但是参与到开源,英语技能是个必须项,退无可退~ 先不用说使用英语,建立个人的全球联系,阅读英文文档,就是很多人需要越过的第一道坎,学好英语是参与开源充分条件。即使在现在仍然有很多人认为开源仅仅是项目,而忽略背后的共同体因素,这一点任重道远。

    最后要说的一点是,中国的开发者并没有足够的时间,他们通常会每周工作6到7天,他们整天都在为公司加班,所以他们根本没有时间停下来参与,当然,还要分出时间来陪家人、孩子、父母,以上所有的障碍,造成的状态就是中国的开发者根本不可能参与到开源当中来,就我个人观察而言,即使有些开发者对开源有极大的兴趣,对共同体有归属感,他们也没有勇气去迈出那艰难的一步,所以我在这里呼吁,哪些来自中国的、基于开源构建的商业公司、使用了开源项目的商业公司,请尽一切可能帮助到开发者。

    无论是来自ALC Beijing、还是来自其它Apache项目的中国公司,我们都在努力,努力的去清除掉这些障碍,就我个人而言,我可以分享我过去4年开源经历所学习到的,开源可以帮助到人们的职业生涯,也许在2、3年甚至5年之后,再返回头来看我今天的演讲,在2025年 的时候,有更多的Apache项目孵化、更多的参与者、很多的情形都得到了改进。

    嗯,以上就是我和大家分享的,谢谢大家,谢谢参与ApacheCon,请选择哪些你感兴趣的议题,享受吧!

    \ No newline at end of file diff --git a/post/event/first-meetup-guest-introducation/index.html b/post/event/first-meetup-guest-introducation/index.html index 9a252ec8..d6901c9a 100644 --- a/post/event/first-meetup-guest-introducation/index.html +++ b/post/event/first-meetup-guest-introducation/index.html @@ -1,3 +1,6 @@ -ALC Beijing Meetup #1 嘉宾和主题介绍 · ALC Beijing

    ALC Beijing Meetup #1 嘉宾和主题介绍

    主持人

    潘娟

    江湖人尊称为“娟神”,京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Membe。才艺俱佳!

    Hold 全场!

    暖场嘉宾

    姜宁

    华为开源软件中心技术专家,前红帽软件首席软件工程师,Apache软件基金会成员,Apache软件基金孵化器导师,参与了绝大多个中国发起的Apache基金会项目的孵化。本人06年开始加入到Apache社区项目开发,就被社区开放协作的氛围深深吸引,成为开源深度信徒。现在致力于开源社区建设,以及开源文化推广,尽其所能帮助国内开源项目成功。

    主题分享嘉宾1

    李钰

    Apache Flink 社区 PMC 成员, Apache HBase 社区 PMC 成员, ALC-beijing 成员, 阿里巴巴高级技术专家

    李钰将为我们带来的分享是:«Flink中文社区的发展与挑战»,会从如下几个视角切入:

    1. Apache Flink 简介
    2. Apache Flink 中文社区从零开始面临的挑战、困难和经验
    3. Apache Flink中文社区取得的成果和发展计划

    主题分享嘉宾2

    郭炜

    中国软件行业协会智能应用服务分会副主任委员,全球中小企业创业联合会副会长,TGO鲲鹏会 北京分会会长,虎啸十年 杰出数字技术人物,Apache Dolphin Scheduler PPMC,ClickHouse 华人社区发起人

    分享的主题是: 会从多个视角来看待开源:

    1. 开源的初心
    2. 几个失败开源项目的案例
    3. 优秀开源项目的特性
    4. 如何申请进入Apache基金会
    5. 开源不是一时兴起,而是一辈子的事情
    6. 开源不是天才的甜点,而是勤奋者的盛宴

    圆桌嘉宾

    1

    上面介绍过的暖场大神,ALC Beijing的发起者:姜宁

    2

    孙金城:

    (金竹),2011年加入阿里,9年的阿里工作中,主导过很多内部核心系统,如,阿里集团行为日志,阿里郎,云转码,文档转换等云服务!在2016年初开始了解 Apache Flink 社区,由初期的参与社区开发到后来逐渐主导具体模块的开发,到负责 Apache Flink Python API(PyFlink) 的建设。目前是阿里巴巴 Tech Lead,ASF Member,PMC Member of Apache Flink and Apache IoTDB 以及 Committer for Apache Flink, Apache Beam and Apache IoTDB

    3

    温铭

    深圳支流科技创始人,云原生 API 网关 Apache APISIX(Incubating) PPMC 成员,360 开源委员会发起人,《OpenResty 从入门到实战》专栏作者。在互联网安全公司和黑产对抗多年,有 40 多项中美安全专利。

    4

    适兕

    开源布道师

    圆桌探讨的问题:

    1. 什么契机参与到开源项目当中?
    2. 刚开始参与开源Community,遇到过什么困难?是如何解决的?
    3. Apache社区/项目和非Apache开源Community/项目 有何异同?
    4. 作为开源Community里的老司机,觉得参与或推动开源Community的最大难点在哪里,为什么?可否有解决之道?
    5. 为何你的项目选择加入 ASF? Apache社区/项目和非Apache开源Community/项目 有何异同?
    6. 加入 ASF 之后,在项目和个人成长有什么不一样的地方吗?
    7. 如何打造自身的开源Community影响力?

    现场的你有什么问题,请提问!

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Meetup #1 嘉宾和主题介绍 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    11 +Aug 2020

    ALC Beijing Meetup #1 嘉宾和主题介绍

    主持人

    潘娟

    江湖人尊称为“娟神”,京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Membe。才艺俱佳!

    Hold 全场!

    暖场嘉宾

    姜宁

    华为开源软件中心技术专家,前红帽软件首席软件工程师,Apache软件基金会成员,Apache软件基金孵化器导师,参与了绝大多个中国发起的Apache基金会项目的孵化。本人06年开始加入到Apache社区项目开发,就被社区开放协作的氛围深深吸引,成为开源深度信徒。现在致力于开源社区建设,以及开源文化推广,尽其所能帮助国内开源项目成功。

    主题分享嘉宾1

    李钰

    Apache Flink 社区 PMC 成员, Apache HBase 社区 PMC 成员, ALC-beijing 成员, 阿里巴巴高级技术专家

    李钰将为我们带来的分享是:«Flink中文社区的发展与挑战»,会从如下几个视角切入:

    1. Apache Flink 简介
    2. Apache Flink 中文社区从零开始面临的挑战、困难和经验
    3. Apache Flink中文社区取得的成果和发展计划

    主题分享嘉宾2

    郭炜

    中国软件行业协会智能应用服务分会副主任委员,全球中小企业创业联合会副会长,TGO鲲鹏会 北京分会会长,虎啸十年 杰出数字技术人物,Apache Dolphin Scheduler PPMC,ClickHouse 华人社区发起人

    分享的主题是: 会从多个视角来看待开源:

    1. 开源的初心
    2. 几个失败开源项目的案例
    3. 优秀开源项目的特性
    4. 如何申请进入Apache基金会
    5. 开源不是一时兴起,而是一辈子的事情
    6. 开源不是天才的甜点,而是勤奋者的盛宴

    圆桌嘉宾

    1

    上面介绍过的暖场大神,ALC Beijing的发起者:姜宁

    2

    孙金城:

    (金竹),2011年加入阿里,9年的阿里工作中,主导过很多内部核心系统,如,阿里集团行为日志,阿里郎,云转码,文档转换等云服务!在2016年初开始了解 Apache Flink 社区,由初期的参与社区开发到后来逐渐主导具体模块的开发,到负责 Apache Flink Python API(PyFlink) 的建设。目前是阿里巴巴 Tech Lead,ASF Member,PMC Member of Apache Flink and Apache IoTDB 以及 Committer for Apache Flink, Apache Beam and Apache IoTDB

    3

    温铭

    深圳支流科技创始人,云原生 API 网关 Apache APISIX(Incubating) PPMC 成员,360 开源委员会发起人,《OpenResty 从入门到实战》专栏作者。在互联网安全公司和黑产对抗多年,有 40 多项中美安全专利。

    4

    适兕

    开源布道师

    圆桌探讨的问题:

    1. 什么契机参与到开源项目当中?
    2. 刚开始参与开源Community,遇到过什么困难?是如何解决的?
    3. Apache社区/项目和非Apache开源Community/项目 有何异同?
    4. 作为开源Community里的老司机,觉得参与或推动开源Community的最大难点在哪里,为什么?可否有解决之道?
    5. 为何你的项目选择加入 ASF? Apache社区/项目和非Apache开源Community/项目 有何异同?
    6. 加入 ASF 之后,在项目和个人成长有什么不一样的地方吗?
    7. 如何打造自身的开源Community影响力?

    现场的你有什么问题,请提问!

    \ No newline at end of file diff --git a/post/event/first-meetup-open-source-roadblock/index.html b/post/event/first-meetup-open-source-roadblock/index.html index f1e16351..75c1287b 100644 --- a/post/event/first-meetup-open-source-roadblock/index.html +++ b/post/event/first-meetup-open-source-roadblock/index.html @@ -1,3 +1,6 @@ -ALC Beijing 活动 · ALC Beijing

    ALC Beijing 活动

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 活动 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    \ No newline at end of file diff --git a/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/index.html b/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/index.html index eba57d51..be4cab6f 100644 --- a/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/index.html +++ b/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/index.html @@ -1,4 +1,14 @@ -亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么? · ALC Beijing

    亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?

    作者:赵禹光

    简介:

    2020年11月14日Apache SkyWalking 2020 DevCon由贝壳找房和tetrate赞助,Apache SkyWalking、云原生、Apache APISIX、Apache Pulsar 和 ALC Beijing 五大社区合作,在贝壳找房一年级会议室盛大举行,本次活动主要面对Apache SkyWalking的使用者、开发者和潜在用户。线上线下共有230多人报名。经统计,实际参加活动人数超过130人,近60%的人愿意抽出自己的休息时间,来交流学习Apache SkyWalking和开源文化。不难看见,在可预见的未来,中国的开源项目很快将进入下一个维度,那必定是更广的社区人员参与,更高技术知识体现,更强的线上稳定性和及时修复能力。

    活动线下盛况:

    SkyWalking’s 2019-2020 and beyond

    吴晟老师本次分享:回顾2020SkyWalking发布的重要的新特性,出版的《Apache SkyWalking实战》图书,社区的进展,开源爱好者如何参与SkyWalking建设,和已知社区在主导的SkyWalking2021年孵化中的新特性。 +亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么? | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    16 +Nov 2020

    亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?

    作者:赵禹光

    简介:

    2020年11月14日Apache SkyWalking 2020 DevCon由贝壳找房和tetrate赞助,Apache SkyWalking、云原生、Apache APISIX、Apache Pulsar 和 ALC Beijing 五大社区合作,在贝壳找房一年级会议室盛大举行,本次活动主要面对Apache SkyWalking的使用者、开发者和潜在用户。线上线下共有230多人报名。经统计,实际参加活动人数超过130人,近60%的人愿意抽出自己的休息时间,来交流学习Apache SkyWalking和开源文化。不难看见,在可预见的未来,中国的开源项目很快将进入下一个维度,那必定是更广的社区人员参与,更高技术知识体现,更强的线上稳定性和及时修复能力。

    活动线下盛况:

    SkyWalking’s 2019-2020 and beyond

    吴晟老师本次分享:回顾2020SkyWalking发布的重要的新特性,出版的《Apache SkyWalking实战》图书,社区的进展,开源爱好者如何参与SkyWalking建设,和已知社区在主导的SkyWalking2021年孵化中的新特性。

    贝壳全链路跟踪实践

    赵禹光老师(作者)本次分享:回顾了贝壳找房2018年至今,贝壳找房的全链路跟踪项目与SkyWalking的渊源,分享了SkyWalking在实践中遇到的问题,和解决方案。以及SkyWalking近10%的Committer都曾经或正在贝壳人店平台签中研发部工作过的趣事。

    SkyWalking在百度爱番番部门实践

    刘嘉鹏老师本次分享:回顾了百度爱番番部门在使用SkyWalking的发展历程&现状,CRM SAAS产品在近1年使用SkyWalking实践经验,以及如何参与SkyWalking的贡献,并成为的Apache Committer。

    非计算机背景的同学如何贡献开源

    适兕是国内很有名的开源布道师,本次分享从生产、分发、消费的软件供应的角度,根据涉及到的角色,然后再反观现代大学教育体系的专业,进一步对一个开源项目和community需要的专业背景多样性进行一个阐述和探究。并以ALC Beijing为例进行一个事例性的说明,非计算机背景的同学如何贡献开源。 @@ -7,6 +17,7 @@

    Istio全生命周期监控

    高洪涛老师本次分享了SkyWalking和可观测云原生等非常前沿的知识布道,其中有,云原生在Logging、Metrics和Tracing的相关知识,Istio,K8S等方面的实践。对一些公司在前沿技术的落地,非常有借鉴意义。

    针对HikariCP数据库连接池的监控

    张鑫老师本次分享了,以一个SkyWalking无法Tracing的实际线上故障的故事出发,讲述如何定位,和补充SkyWalking插件的不足,并将最后的实践贡献到社区。对大家参与开源很有帮助。

    SkyWalking 与 Nginx 的优化实践

    王院生老师本次分享SkyWalking社区和APISIX社区合作,在Nginx插件的实践过程,对社区之间的如何开展合作,非常有借鉴意义,院生老师的工作&开源态度,很好的诠释Geek精神,也是我们互联网从业者需要学习恪守的。 -

    讲师PPT下载

    Apache SkyWalking 2020 DevCon 讲师 PPT

    SkyWalking 后续发展计划

    正如吴晟老师所说:No plan, open to the community,Apache SkyWalking是没有RoadMap。社区的后续发展,依赖于每个人在社区的贡献。与其期待,不如大胆设想,将自己的设计按照Apache Way贡献到SkyWalking,你就是下一个Apache SkyWalking Commiter,加入Member of SkyWalking大家庭,让社区因为你,而更加有活力。

    SkyWalking 社区八卦趣事

    在本次分享活动中,无论是讲师还是听众,大家都很好奇,吴晟老师如何做到的社区咨询秒回?到底有几个助理呢?发挥你的想象,写下回复。ALC BEIJING会挑选优秀的回复,送出神秘礼品。

    彩蛋:

    贝壳找房,人店平台中心招聘Java、PHP、前端、Android、IOS工程师

    • 基本要求:3年以上相关工作经验,对技术有热情、有追求,愿意加入贝壳一起成长。
    • 内推邮箱:zhaoyuguang@ke.com,微信:zhaoyuguang777。

    详细信息扫二维码:

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +

    讲师PPT下载

    Apache SkyWalking 2020 DevCon 讲师 PPT

    SkyWalking 后续发展计划

    正如吴晟老师所说:No plan, open to the community,Apache SkyWalking是没有RoadMap。社区的后续发展,依赖于每个人在社区的贡献。与其期待,不如大胆设想,将自己的设计按照Apache Way贡献到SkyWalking,你就是下一个Apache SkyWalking Commiter,加入Member of SkyWalking大家庭,让社区因为你,而更加有活力。

    SkyWalking 社区八卦趣事

    在本次分享活动中,无论是讲师还是听众,大家都很好奇,吴晟老师如何做到的社区咨询秒回?到底有几个助理呢?发挥你的想象,写下回复。ALC BEIJING会挑选优秀的回复,送出神秘礼品。

    彩蛋:

    贝壳找房,人店平台中心招聘Java、PHP、前端、Android、IOS工程师

    • 基本要求:3年以上相关工作经验,对技术有热情、有追求,愿意加入贝壳一起成长。
    • 内推邮箱:zhaoyuguang@ke.com,微信:zhaoyuguang777。

    详细信息扫二维码:

    \ No newline at end of file diff --git a/post/heros_journey_trista/index.html b/post/heros_journey_trista/index.html index 323e70f6..87788fb1 100644 --- a/post/heros_journey_trista/index.html +++ b/post/heros_journey_trista/index.html @@ -1,8 +1,6 @@ -英雄之旅-行走在开源领域的一个自叙故事 · ALC Beijing

    英雄之旅-行走在开源领域的一个自叙故事

    作者介绍

    潘娟,京东数科高级DBA&Apache ShardingSphere PMC,主要负责京东数科分布式数据库开发、数据库运维自动化平台开发等工作。曾负责京东数科数据库自动化平台设计与开发,现专注于Apache ShardingSphere分布式数据库中间件平台的开发。主要在分布式数据库、开源、分布式架构等相关领域进行探索。多次受邀参加数据库&架构领域的相关会议并进行分享交流。

    前序

    《英雄之旅》是由美国神话学家约瑟夫·坎贝尔提出的。好莱坞很多经典IP巨作即是把《英雄之旅》的套路搬上了巨幕。

    最近在读一些心理学书籍,随即发现我们每个人的一生都是一场英雄之旅。从被使命召唤、踏上艰辛的考验之旅、接收他人恩赐、发现自我、到达胜利顶点、回归自我。然而,很多人可能一生都行走在发现自我的路上,若是有幸,则能到达顶点,回归自我。

    这篇分享以”英雄之旅“为开始,是希望把自上篇文章-程序媛成长纪:从DBA到研发工程师以来到现在的经历,提取出经验点,与所有行走在英雄之旅的朋友交流,碰撞火花。毕竟我们每个人面对工作、生活、家庭、自我都有着太多冲撞和思考,需要被他人理解和照亮。:-)

    由点及面

    上篇的自叙文谈到我从运维DBA转成了Java开发工程师。准确的说,应该是开源分布式数据库开发工程师。因为在过去一年半多的时间里,我更多地是在分布式数据库中间件平台、分布式事务框架、分布式治理等领域做相关的研发工作。主要从事的项目是Apache分布式数据库中间件平台Apache ShardingSphere, 和京东数科主导的分布式事务平台JDTX(未开源)。 -之所以说”由点及面”,是因为工作的内容开始从最初新手关注的一个点,开始渗透到整个项目的各个领域。从最初做的metaData初始化加载模块到现在Apache ShardingSphere的11个一级模块中,有8个模块都是深耕接触过,此外还有公司内部的分布式事务平台JDTX。从这里可以看出一个新手开始逐渐变成了”老司机“。这让我突然想到之前很多人问过的一个问题— 类似像ShardingSphere这样的大型项目,参与的正确姿势是什么?有人选择通读文档,有人选择把模块间架构关系梳理清楚……不过在我看来,从一个点入手,由浅入深,由点及面是参与大型开源项目相对容易的方式。因为一上来就啃一本厚书,很容易厌倦和恐惧,停留在表面,最后兴趣被各种事情冲淡,最后不了了之。而从社区一个很小的任务入手,不仅可以渐渐熟悉项目、获得成就感,更能够积累社区的信赖感,树立自我品牌,最终一览众山小。而在这个过程中,你也会发现自己的知识、技能、人际关系都在崎岖的路上不断上升!

    由深入广

    这个小节用来讨论大家争执已久的一个问题:究竟是先进行深度学习,还是先进行广度学习。标准答案似乎是:同时进行。但是从实践的角度讲,我们的精力、学习阶段、难易程度等因素都会让这个做法变得不太容易进展、很耗时、短期内没有产出。每个人从事的工作阶段、内容都有所不同,自然看法各异。从我个人角度来看,我更倾向于先深度后广度,同时尽可能兼顾彼此。

    先深度,是为了帮助我们打下坚实的基础。试想一座空中楼阁,每次风吹雨打都会引发你的惊慌,又如何风轻云淡地向四周望去?正是由于有了扎实的地基,才让你觉得能够更容易理解别的高楼的建筑风格和特色,即在同一个交流层次能帮助我们快速了解他人的核心要点和提出自己的见解。在我刚入行的时候,我很不理解为什么要去听其他人的分享?我自己的一亩三分地还没有耕作完,日日新增的工作还不够我操心,我真的有时间再关注他人吗?当时,我的思想和视野都是狭窄的,我的更多精力是聚焦在了基石的打造,从GitHub提交记录可以看到我疯狂地学习和贡献,此时我没有多余的精力,也没有欲望去关注别人,于是我的视野也很有限。而当我不断熟悉了这个项目的架构与细节,这个领域的知识体系之后,突然发现我可以抽出一部分时间和精力去了解整个行业,而不仅仅是整个项目。而且此刻,我特别有欲望想看看别的楼阁是怎么搭建的、别人的项目是什么情况,我们和别人的异同在哪里。这增大我的视野,也意味着我开始转向对广度的寻求。

    其实最好的做法,还是在深耕的同时,关注广度,了解别人在做什么。这样可以有效帮助我们在世界的大地图里,知道自己在哪个位置、自己的水准如何。不过,建议是建议,实践是实践。最好的方式还是问问自己,想不想,要做不做。因为,我选择,我自由,我存在。

    由内向外

    作为开源分布式数据库开发工程师,开源是赋予这个工作岗位的神奇力量。因为在开源的世界里,有开放、自由、平等、自我提升、品牌打造,也有竞争和资本的力量。这让我发现,我不是固步自封,我能感受到来自其他城市、不同国家的新鲜气息。在与同行朋友交流的过程中,你会发现这个行业的立体面,每个人不同的想法都非常有意思。当然,冲撞必不可少,成长的代价和痛苦也一定会非常给力地到位。迷茫和挣扎也一定会伴其左右,因为这就是一场典型的英雄之旅。但我在这个领域除了收获技能和知识,还收获了良师新友和分享的机会和能力。我并不想带来太多负面情绪给大家,我希望阅读文章的朋友能获得新的想法和力量。

    过去一年半走过了深圳、上海、北京、南京,参加过中国系统架构师大会、COSCON中国开源年会、OSCHINA中国开源峰会、PstgreSQL中国技术大会、全国互联网架构峰会、ITPUB在线分享等各种会议。在机场写代码,在会场交流,在深夜写PPT。而这一系列的锻炼也磨练出了我的耐心、清晰的逻辑能力、良好的口语表达、自我的认识。我记得最开始,我编写PPT和准备分享都要提前2~3周准备,每天都抽空看看,现在已经变成提前1周准备,随后临场发挥。最近几期的音频和视频分享可以在公众号ALC Beijing 和B站收听和收看,欢迎关注。 ^_^ +英雄之旅-行走在开源领域的一个自叙故事 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    24 +May 2020

    英雄之旅-行走在开源领域的一个自叙故事

    作者介绍

    潘娟,京东数科高级DBA&Apache ShardingSphere PMC,主要负责京东数科分布式数据库开发、数据库运维自动化平台开发等工作。曾负责京东数科数据库自动化平台设计与开发,现专注于Apache ShardingSphere分布式数据库中间件平台的开发。主要在分布式数据库、开源、分布式架构等相关领域进行探索。多次受邀参加数据库&架构领域的相关会议并进行分享交流。

    前序

    《英雄之旅》是由美国神话学家约瑟夫·坎贝尔提出的。好莱坞很多经典IP巨作即是把《英雄之旅》的套路搬上了巨幕。

    最近在读一些心理学书籍,随即发现我们每个人的一生都是一场英雄之旅。从被使命召唤、踏上艰辛的考验之旅、接收他人恩赐、发现自我、到达胜利顶点、回归自我。然而,很多人可能一生都行走在发现自我的路上,若是有幸,则能到达顶点,回归自我。

    这篇分享以”英雄之旅“为开始,是希望把自上篇文章-程序媛成长纪:从DBA到研发工程师以来到现在的经历,提取出经验点,与所有行走在英雄之旅的朋友交流,碰撞火花。毕竟我们每个人面对工作、生活、家庭、自我都有着太多冲撞和思考,需要被他人理解和照亮。:-)

    由点及面

    上篇的自叙文谈到我从运维DBA转成了Java开发工程师。准确的说,应该是开源分布式数据库开发工程师。因为在过去一年半多的时间里,我更多地是在分布式数据库中间件平台、分布式事务框架、分布式治理等领域做相关的研发工作。主要从事的项目是Apache分布式数据库中间件平台Apache ShardingSphere, 和京东数科主导的分布式事务平台JDTX(未开源)。 +之所以说”由点及面”,是因为工作的内容开始从最初新手关注的一个点,开始渗透到整个项目的各个领域。从最初做的metaData初始化加载模块到现在Apache ShardingSphere的11个一级模块中,有8个模块都是深耕接触过,此外还有公司内部的分布式事务平台JDTX。从这里可以看出一个新手开始逐渐变成了”老司机“。这让我突然想到之前很多人问过的一个问题— 类似像ShardingSphere这样的大型项目,参与的正确姿势是什么?有人选择通读文档,有人选择把模块间架构关系梳理清楚……不过在我看来,从一个点入手,由浅入深,由点及面是参与大型开源项目相对容易的方式。因为一上来就啃一本厚书,很容易厌倦和恐惧,停留在表面,最后兴趣被各种事情冲淡,最后不了了之。而从社区一个很小的任务入手,不仅可以渐渐熟悉项目、获得成就感,更能够积累社区的信赖感,树立自我品牌,最终一览众山小。而在这个过程中,你也会发现自己的知识、技能、人际关系都在崎岖的路上不断上升!

    由深入广

    这个小节用来讨论大家争执已久的一个问题:究竟是先进行深度学习,还是先进行广度学习。标准答案似乎是:同时进行。但是从实践的角度讲,我们的精力、学习阶段、难易程度等因素都会让这个做法变得不太容易进展、很耗时、短期内没有产出。每个人从事的工作阶段、内容都有所不同,自然看法各异。从我个人角度来看,我更倾向于先深度后广度,同时尽可能兼顾彼此。

    先深度,是为了帮助我们打下坚实的基础。试想一座空中楼阁,每次风吹雨打都会引发你的惊慌,又如何风轻云淡地向四周望去?正是由于有了扎实的地基,才让你觉得能够更容易理解别的高楼的建筑风格和特色,即在同一个交流层次能帮助我们快速了解他人的核心要点和提出自己的见解。在我刚入行的时候,我很不理解为什么要去听其他人的分享?我自己的一亩三分地还没有耕作完,日日新增的工作还不够我操心,我真的有时间再关注他人吗?当时,我的思想和视野都是狭窄的,我的更多精力是聚焦在了基石的打造,从GitHub提交记录可以看到我疯狂地学习和贡献,此时我没有多余的精力,也没有欲望去关注别人,于是我的视野也很有限。而当我不断熟悉了这个项目的架构与细节,这个领域的知识体系之后,突然发现我可以抽出一部分时间和精力去了解整个行业,而不仅仅是整个项目。而且此刻,我特别有欲望想看看别的楼阁是怎么搭建的、别人的项目是什么情况,我们和别人的异同在哪里。这增大我的视野,也意味着我开始转向对广度的寻求。

    其实最好的做法,还是在深耕的同时,关注广度,了解别人在做什么。这样可以有效帮助我们在世界的大地图里,知道自己在哪个位置、自己的水准如何。不过,建议是建议,实践是实践。最好的方式还是问问自己,想不想,要做不做。因为,我选择,我自由,我存在。

    由内向外

    作为开源分布式数据库开发工程师,开源是赋予这个工作岗位的神奇力量。因为在开源的世界里,有开放、自由、平等、自我提升、品牌打造,也有竞争和资本的力量。这让我发现,我不是固步自封,我能感受到来自其他城市、不同国家的新鲜气息。在与同行朋友交流的过程中,你会发现这个行业的立体面,每个人不同的想法都非常有意思。当然,冲撞必不可少,成长的代价和痛苦也一定会非常给力地到位。迷茫和挣扎也一定会伴其左右,因为这就是一场典型的英雄之旅。但我在这个领域除了收获技能和知识,还收获了良师新友和分享的机会和能力。我并不想带来太多负面情绪给大家,我希望阅读文章的朋友能获得新的想法和力量。

    过去一年半走过了深圳、上海、北京、南京,参加过中国系统架构师大会、COSCON中国开源年会、OSCHINA中国开源峰会、PstgreSQL中国技术大会、全国互联网架构峰会、ITPUB在线分享等各种会议。在机场写代码,在会场交流,在深夜写PPT。而这一系列的锻炼也磨练出了我的耐心、清晰的逻辑能力、良好的口语表达、自我的认识。我记得最开始,我编写PPT和准备分享都要提前2~3周准备,每天都抽空看看,现在已经变成提前1周准备,随后临场发挥。最近几期的音频和视频分享可以在公众号ALC Beijing 和B站收听和收看,欢迎关注。 ^_^ -

    后序

    篇幅所限,未能展开叙述。在文章最后,还是有些”鸡汤”想和大家分享。例如:与其病态地熬时间地做事情,不如多费心在身体锻炼和思考如何高效集中工作。作为过来人,觉得非常重要。此外,在你的英雄之旅中,找寻本我,释放压抑的情绪,活出自己。每一字一句,是我斟酌良久,给出的建议。因为在高节奏的生活和工作中,我逐渐发现自己人云亦云,被快餐手机消费,压抑自己的情绪,活着像个机器人,追寻所谓的“你好,我好,大家好”。

    而现在,愿我,与你都能拥有力量,在不伤害他人的前提下,释放自己的能量,成为我自己,勇敢而执着地踏上英雄之旅!

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +

    后序

    篇幅所限,未能展开叙述。在文章最后,还是有些”鸡汤”想和大家分享。例如:与其病态地熬时间地做事情,不如多费心在身体锻炼和思考如何高效集中工作。作为过来人,觉得非常重要。此外,在你的英雄之旅中,找寻本我,释放压抑的情绪,活出自己。每一字一句,是我斟酌良久,给出的建议。因为在高节奏的生活和工作中,我逐渐发现自己人云亦云,被快餐手机消费,压抑自己的情绪,活着像个机器人,追寻所谓的“你好,我好,大家好”。

    而现在,愿我,与你都能拥有力量,在不伤害他人的前提下,释放自己的能量,成为我自己,勇敢而执着地踏上英雄之旅!

    \ No newline at end of file diff --git a/post/how_to_be_a_qualified_asf_contributor/index.html b/post/how_to_be_a_qualified_asf_contributor/index.html index 4fae90ca..ed946254 100644 --- a/post/how_to_be_a_qualified_asf_contributor/index.html +++ b/post/how_to_be_a_qualified_asf_contributor/index.html @@ -1,21 +1,19 @@ -如何成为合格的ASF贡献者 · ALC Beijing

    如何成为合格的ASF贡献者

    阿里土话

    ASF是一个开源组织,他有自身的文化,阿里是一个要活好102年的公司,其文化底蕴非凡!分享ASF之前总想或多或少的和大家分享一些阿里的味道!

    • 给世界带来微小而美好的改变
    • 把幸运种子种到别人身上去,你才会有幸运
    • Never, Never, Never Give Up(永不放弃)

    没错,阿里人看到上面的三句话会倍感亲切,因为上面三句都是 “阿里土话”。虽然是阿里土话,但我认为其有放诸四海而皆准的魅力!这些话,同样适用于激发和指导你成为合格的开源贡献者!不经意间看了一眼窗外,心里开心默笑,其实阿里每个角落都充满着阿里气息:

    其实每个人参与社区贡献的机缘不一样,但无外乎两种:

    • 偶发事件 - 由于参与某项工作,无选择的就参与了某个开源项目。(我就是这种,很自然的就跟着 蒋晓伟 老师踏入了Apache Flink之旅)

    • 因爱而求 - 每个码农都有一颗想让自己的的代码被应用全球的梦想追求!这梦想的实现要依托有开源的力量,ASF可以为你提供一个逐梦的舞台~

    给个理由

    也许目前的你既没有工作的需要,也没有对开源产生任何爱意❤️。但了解一件事情总没有坏处,了解参与开源的利好,也许明天你就踏上了开源之旅!

    • 顺势而为 - 如果你是一个码农,那么参与开源是一种must to have的事情,目前开源领域形式大好,各大公司纷纷拥抱开源,比如:Google,Alibaba,Hortonworks, Tencent, Facebook等等。参与开源无疑是扩大了生存的空间。

    • 业界身份证 - 参与开源就是在一点一滴的描绘你的业界身份证,你的开源贡献可以公示全球,由一行代码,一句文档的贡献,到参与项目管理成为项目管理委员会(PMC)一员,到成为 ASF Member 甚至 成为董事会成员,这些就像你曾经为之努力的学士学位,硕士学位,博士学位一样为世人所认可!不夸张的说,某些情况甚至比学位证书还实用!

    • 无国界导师 - 参与开源还有一个特别特别特别重大的利好,就是你可以在你所关注的领域在全球领域寻找到最好的导师,所谓最好,不是牛,最好是最适合!所谓“三人行,必有我师”,社区交流最初你会感觉和业界大牛无法沟通,因为他的一句话,需要分解成十句才能懵懵懂,甚至不懂!这个不是大牛原因,也不是你的原因,是大牛对你水平的了解不足导致,即使大牛了解你的水平,也很难让大牛将一句话分解成十句甚至百句话讨论你关注的问题,不是大牛不愿意,更多是我们不好意思:)。所以说,要“门当户对”找到 社区比你水平略高,同时你也能给人家一些反哺的贡献者长时间交流。开源社区有着“帮传带“”的传统, 社区导师对新人都非常友好,很多时候社区导师会通过帮助社区新人展示自己的技术能力,积累社区影响力。因此对于新人有价值的问题,导师基本上是知无不言,言无不尽。 目前ASF有7600+的Committer,就算是某一个项目,也应该有几十个Committer和数以百计的贡献者,总会遇到可以和你一起进步的小伙伴!虽不曾谋面,却已熟若亲朋!

    • 全球性分享 - 目前ASF项目有140多个领域,参与者覆盖230个国家。如果你小有成就,想将你的知识分享给更多的人,想利用的开源知识帮助更多的人,那么无疑ASF为你提供了这样的平台!你又何尝不能成为上面“无国界导师”中的一员的导师呢!

    • 最佳实践 - 不知 - 了解 - 有方案 - 最佳方案,开源是一个智慧的集结地,一个功能可能有几十种实现方式,这并不是一两个人或者某一个小团队能考虑到(ALL)的,然而在开源一个问题,你在考虑的同时,可能在世界的某个角落,某些角落还有其他人或团队在考虑解决方案,当大家共享方案的时候,智慧的火花将会产生!

    • 领导力塑造 - ASF有公司和项目的治理方式,不论你目前是否一个(技术)管理者,参与开源贡献你都有机会挖掘你自身的领导力。 TL,可以是 Team Lead,也可以是 Tech lead,作为一个码农,往往对 Tech lead 更加情有独钟!在开源贡献一向遵循 “正确的就是拥护的,正确的就是坚持的”!如果你一贯的在社区发出自己独到的见解(管理&技术),那么势必会塑造你独特的领导力,社区领导力是内心驱动的影响力,所有的拥护者都是无外界压力,无情感偏见,发自内心的崇拜赞许!如果你能达到这样的成就,将胜过你职业的晋升,当然这个也会促进你的职业晋升!

    • 给世界带来微小而美好的改变 -毋以善小而不为,小善举大美好!有的时候一个文档优化,甚至一个typo的贡献都会让成千上万的人获益。更有意思的是很多开源贡献者都是从文档贡献开始的 :)一个很有意思的统计,28%的开源贡献来自偶然的文档改进

    Casual contributions are far from being trivial. After a manual inspection of a sample of casual contributions, we found that although 28.64% of them are related to grammar and typo fixes.

    • 认真生活,快乐工作 - 参与开源不仅仅是工作或业余爱好的演练台,也是生活的一部分,他会让你在快乐工作的同时寻找到“臭味相投”的挚友!通过参与Apache Flink项目我也交到了几位德国好朋友,甚至有些好朋友还成为了我的儿子的好朋友!:)看看下图有没有你和我共同的朋友?世界很小~?

    给个原则

    没有规矩,不成方圆,如果上面的理由足够打动你,那么我再给你一些参与开源的原则:

    • 给世界带来微小而美好的改变 +如何成为合格的ASF贡献者 | ALC Beijing 博客

      ALC Beijing 博客

      介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

      02 +Apr 2020

      如何成为合格的ASF贡献者

      阿里土话

      ASF是一个开源组织,他有自身的文化,阿里是一个要活好102年的公司,其文化底蕴非凡!分享ASF之前总想或多或少的和大家分享一些阿里的味道!

      • 给世界带来微小而美好的改变
      • 把幸运种子种到别人身上去,你才会有幸运
      • Never, Never, Never Give Up(永不放弃)

      没错,阿里人看到上面的三句话会倍感亲切,因为上面三句都是 “阿里土话”。虽然是阿里土话,但我认为其有放诸四海而皆准的魅力!这些话,同样适用于激发和指导你成为合格的开源贡献者!不经意间看了一眼窗外,心里开心默笑,其实阿里每个角落都充满着阿里气息:

      其实每个人参与社区贡献的机缘不一样,但无外乎两种:

      • 偶发事件 - 由于参与某项工作,无选择的就参与了某个开源项目。(我就是这种,很自然的就跟着 蒋晓伟 老师踏入了Apache Flink之旅)

      • 因爱而求 - 每个码农都有一颗想让自己的的代码被应用全球的梦想追求!这梦想的实现要依托有开源的力量,ASF可以为你提供一个逐梦的舞台~

      给个理由

      也许目前的你既没有工作的需要,也没有对开源产生任何爱意❤️。但了解一件事情总没有坏处,了解参与开源的利好,也许明天你就踏上了开源之旅!

      • 顺势而为 - 如果你是一个码农,那么参与开源是一种must to have的事情,目前开源领域形式大好,各大公司纷纷拥抱开源,比如:Google,Alibaba,Hortonworks, Tencent, Facebook等等。参与开源无疑是扩大了生存的空间。

      • 业界身份证 - 参与开源就是在一点一滴的描绘你的业界身份证,你的开源贡献可以公示全球,由一行代码,一句文档的贡献,到参与项目管理成为项目管理委员会(PMC)一员,到成为 ASF Member 甚至 成为董事会成员,这些就像你曾经为之努力的学士学位,硕士学位,博士学位一样为世人所认可!不夸张的说,某些情况甚至比学位证书还实用!

      • 无国界导师 - 参与开源还有一个特别特别特别重大的利好,就是你可以在你所关注的领域在全球领域寻找到最好的导师,所谓最好,不是牛,最好是最适合!所谓“三人行,必有我师”,社区交流最初你会感觉和业界大牛无法沟通,因为他的一句话,需要分解成十句才能懵懵懂,甚至不懂!这个不是大牛原因,也不是你的原因,是大牛对你水平的了解不足导致,即使大牛了解你的水平,也很难让大牛将一句话分解成十句甚至百句话讨论你关注的问题,不是大牛不愿意,更多是我们不好意思:)。所以说,要“门当户对”找到 社区比你水平略高,同时你也能给人家一些反哺的贡献者长时间交流。开源社区有着“帮传带“”的传统, 社区导师对新人都非常友好,很多时候社区导师会通过帮助社区新人展示自己的技术能力,积累社区影响力。因此对于新人有价值的问题,导师基本上是知无不言,言无不尽。 目前ASF有7600+的Committer,就算是某一个项目,也应该有几十个Committer和数以百计的贡献者,总会遇到可以和你一起进步的小伙伴!虽不曾谋面,却已熟若亲朋!

      • 全球性分享 - 目前ASF项目有140多个领域,参与者覆盖230个国家。如果你小有成就,想将你的知识分享给更多的人,想利用的开源知识帮助更多的人,那么无疑ASF为你提供了这样的平台!你又何尝不能成为上面“无国界导师”中的一员的导师呢!

      • 最佳实践 - 不知 - 了解 - 有方案 - 最佳方案,开源是一个智慧的集结地,一个功能可能有几十种实现方式,这并不是一两个人或者某一个小团队能考虑到(ALL)的,然而在开源一个问题,你在考虑的同时,可能在世界的某个角落,某些角落还有其他人或团队在考虑解决方案,当大家共享方案的时候,智慧的火花将会产生!

      • 领导力塑造 - ASF有公司和项目的治理方式,不论你目前是否一个(技术)管理者,参与开源贡献你都有机会挖掘你自身的领导力。 TL,可以是 Team Lead,也可以是 Tech lead,作为一个码农,往往对 Tech lead 更加情有独钟!在开源贡献一向遵循 “正确的就是拥护的,正确的就是坚持的”!如果你一贯的在社区发出自己独到的见解(管理&技术),那么势必会塑造你独特的领导力,社区领导力是内心驱动的影响力,所有的拥护者都是无外界压力,无情感偏见,发自内心的崇拜赞许!如果你能达到这样的成就,将胜过你职业的晋升,当然这个也会促进你的职业晋升!

      • 给世界带来微小而美好的改变 +毋以善小而不为,小善举大美好!有的时候一个文档优化,甚至一个typo的贡献都会让成千上万的人获益。更有意思的是很多开源贡献者都是从文档贡献开始的 :)一个很有意思的统计,28%的开源贡献来自偶然的文档改进

      Casual contributions are far from being trivial. After a manual inspection of a sample of casual contributions, we found that although 28.64% of them are related to grammar and typo fixes.

      • 认真生活,快乐工作 - 参与开源不仅仅是工作或业余爱好的演练台,也是生活的一部分,他会让你在快乐工作的同时寻找到“臭味相投”的挚友!通过参与Apache Flink项目我也交到了几位德国好朋友,甚至有些好朋友还成为了我的儿子的好朋友!:)看看下图有没有你和我共同的朋友?世界很小~?

      给个原则

      没有规矩,不成方圆,如果上面的理由足够打动你,那么我再给你一些参与开源的原则:

      • 给世界带来微小而美好的改变 始终坚信滴水成河的道理,社区贡献在于积累,贵在坚持,不因善小而不为,任何贡献都会使得社区变得更加美好!

      • 公开沟通 - 参与开源的一个重要的原则就是公开沟通,任何问题不论大小,都要在可以被追溯,可以被任何感兴趣的人查阅的方式进行讨论。比如:邮件列表,JIRA上,PR中等。切记不要单独私信讨论,公开讨论有助于更多的人参与,而且还确保了在讨论过程中一些无意识的错误可以很容易被发现和纠正。

      • 保持尊重 - 社区的任何贡献都是以自愿为原则的,不能强迫任何人做事情,也不要无礼貌的敦促任何人做事情的进度(除非特殊情况)。更不能因为意见不通就进行人身攻击,不要以为这好笑,其实是真是发生过的!尊重是相互的,你给予我春风,我自送你一缕芳香!大家努力营造开心和谐的社区氛围。

      • 简明扼要 - 我们可以大胆的在社区提问,追问!但切记在提问之前将自己的问题反复思考,这是对自己负责也是对其他社区贡献者的尊重!因为你的一次问题描述可能将被数百人阅读。写一封简明扼要的邮件意味着人们可以尽可能有效地理解你的意图。如果需要详细说明,请考虑添加摘要。也就是,你的问题描述要简明扼要(这个和能力有关,尽自己最好就行),尽量写清楚上下文,你在什么情况下,遇到了怎样的问题,如何问题再现等等,你的描述越简明扼要,越清晰完整,越容易被人取得别人帮助!

      • 前进一小步,文明一大步 :) 这可不是 WC 用语,而是确确实实的利他原则。阿里巴巴国际化战役中有一个要求,就是参与国际化建设的阿里人员,到哪个国家,就必须用当地的语言与当地客户沟通。这体现了足够的尊重,体现了足够的服务前的准备和付出!我们在开源社区问问题也是一样的,不能遇到问题,不加思索的就向社区提问,在提问之前要先进行各种尝试,各种资料的查阅,社区已有问题的查阅,同时带上自己的观点去提问,让想帮助你的社区人员看到你在这个问题上的努力。

      • 把幸运种子种到别人身上去,你才会有幸运 我们不仅仅是问题的提出者,慢慢我们自己也变成问题的解决者,由社区求助者变成社区救助员!努力寻求自己反哺开源社区的机会,为他人付出也是为自己积累!所谓 “为自己,照亮他人!”。假如你相信来世今生的话,这里有个故事分享给给你:

      从前有两个要投胎转世的人,在投胎之前有机会选择投胎之后是做“一生向别人索取的人”还是做“一生施惠于他人的人”,选择了“一生向别人索取的人”的那个,投胎做了 乞丐,而选择了“一生施惠于他人的人”的那个做了富翁!

      所以做社区也一样,努力做施惠于别人的人,就是在社区德高望重,具有领导力的人!:)

      • Never, Never, Never Give Up(永不放弃) 理想总是美好的,现实总是骨感的,参与社区的人都具备热情,耐心的品质,但社区的问题太多,需要得到帮助的人也太多,相同问题千人千面,意见不一致也是司空见惯的,切记不要以为提的问题都会很快有人帮忙,你提交的PR很快有人Review。每个的社区贡献都需要如下图所示的投票决定,也许你的贡献被接受,也许你的贡献被拒绝,但请不要太在意一次的贡献成功与否,无轮遇到什么困难,挫折,都要 Never, Never, Never Give Up(永不放弃),因为马总说过 “今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,看不到后天的太阳”。 只有坚持到最后的人,才能享受到和煦的阳光!

      如何开始

      最常见的参与Apache贡献的方式是选择一个你感兴趣的项目,因为爱好才是最好的原动力!我曾经用一句话描述过ASF:“ASF是一个与阿里巴巴同龄(成立于1999年),有完整的组织(董事会)架构管理,以软件(140个领域)技术全球(覆盖230个国家)共享为使命的公益组织”,里面提及 ASF有140个技术领域总有一个你感兴趣的!

      -

      ASF 项目目前分为两大类:

      • 孵化器项目 - 是正在孵化的项目,也就是,在成为ASF 顶级项目之前,需要在ASF进行孵化,当从孵化器毕业之后就会成为Apache顶级项目。参与孵化器项目的好处是你能对项目有更早的参与,有多细节变化的了解,也很容易得到该项目的重视:),目前ASF所有孵化器项目列表请这里查阅

      • Apache 顶级项目 - 这是已经从孵化器毕业的Apache 顶级项目,顶级项目的运作一般已经完全符合Apache Way。直接参与顶级项目的好处是能开始就接触很规范的社区贡献方式和更高的质量代码,有更多的学习资料和更多的参与者。目前Apache 顶级项目列表,可以查阅这里

      一旦选择参与某个项目,不论在什么情况下,你都要听从自己的直觉,做你认为更好或者不同的事情。永远都不忘初心,坚持自己所坚持的~~,也永远牢记上面的原则,其中你会发现“给世界带来微小而美好的改变”非常受用。假如,你在查看文档时候,发现了某个链接的错误或者typo错误。假如,你在使用产品的过程中发现了问题,请不要坐视不理,径直绕开,或者向社区提出问题,等待其他人来修复,因为这正是你贡献社区的好机会,解决这些你能看到的问题,因为,在解决这个问题的同时,也许会有新的问题被你发现~~ 进而你就入道啦:)

      准备工作

      目前ASF开源项目都是在github上面托管的。所以正式参与ASF开源贡献之前你要做一些准备工作:

      创建一个github账号

      点击创建,为了演示,我创建了一个“pyflink”账号 :)

      Fork 你要参与的项目

      Apache Flink为例,如下: +

      ASF 项目目前分为两大类:

      • 孵化器项目 - 是正在孵化的项目,也就是,在成为ASF 顶级项目之前,需要在ASF进行孵化,当从孵化器毕业之后就会成为Apache顶级项目。参与孵化器项目的好处是你能对项目有更早的参与,有多细节变化的了解,也很容易得到该项目的重视:),目前ASF所有孵化器项目列表请这里查阅

      • Apache 顶级项目 - 这是已经从孵化器毕业的Apache 顶级项目,顶级项目的运作一般已经完全符合Apache Way。直接参与顶级项目的好处是能开始就接触很规范的社区贡献方式和更高的质量代码,有更多的学习资料和更多的参与者。目前Apache 顶级项目列表,可以查阅这里

      一旦选择参与某个项目,不论在什么情况下,你都要听从自己的直觉,做你认为更好或者不同的事情。永远都不忘初心,坚持自己所坚持的~~,也永远牢记上面的原则,其中你会发现“给世界带来微小而美好的改变”非常受用。假如,你在查看文档时候,发现了某个链接的错误或者typo错误。假如,你在使用产品的过程中发现了问题,请不要坐视不理,径直绕开,或者向社区提出问题,等待其他人来修复,因为这正是你贡献社区的好机会,解决这些你能看到的问题,因为,在解决这个问题的同时,也许会有新的问题被你发现~~ 进而你就入道啦:)

      准备工作

      目前ASF开源项目都是在github上面托管的。所以正式参与ASF开源贡献之前你要做一些准备工作:

      创建一个github账号

      点击创建,为了演示,我创建了一个“pyflink”账号 :)

      Fork 你要参与的项目

      Apache Flink为例,如下:

      点击 “Fork” 之后,会在你的github账号下出现一个flink项目,如下:

      Clone 代码到本地

      做代码贡献之前需要Clone你刚才fork的Flink代码到你本地,以备提交第一个社区贡献PR! -

      阅读项目贡献说明

      一般具体项目会有介绍如何参与该项目的贡献,以Apache Flink为例 就有关于如果参与Flink社区贡献的说明, 比如:

      Apache Flink is developed by an open and friendly community. Everybody is cordially welcome to join the community and contribute to Apache Flink. There are several ways to interact with the community and to contribute to Flink including asking questions, filing bug reports, proposing new features, joining discussions on the mailing lists, contributing code or documentation, improving the website, or testing release candidates.

      详情查阅这里

      订阅邮件列表

      社区问题大多会在具体项目的社区邮件列表里面进行讨论,所以邮件列表是了解社区动态最重要的输入,以Apache Flink 为例,需要订阅 开发邮件列表和用户邮件列表,如下:

      首先,点击上面的link,会引导你给 xxx-subscribe@flink.apache.org 发送邮件。然后你会收到官方确认邮件。最后你回复确认邮件之后还会收到一封欢迎邮件,也就意味这你订阅成功了!注意上面每个邮件列表都需要单独发起订阅。 -OK, 到这一步你已经完成了为Apache Flink做贡献的准备工作了:),接下来就要寻找做贡献的机会了!

      创建issue或者解决issue

      目前大多数ASF项目的问题采用JIRA管理(当然也有例外),我们以Apache Flink为例,当用户发现的问题可以在这里查阅。 如果你发现有你感兴趣的issue,不要犹豫,直接在JIRA下放留言,你想帮忙解决这个问题,并share你解决问题的方法,这样社区会有Committer来与你沟通了!以一个之前我向Flink提交的issue为例 FLINK-13471: -

      当发现有人创建了issue,但还没有分配给任何人,你就可以尝试帮助解决这个问题,在完成开发后提交PR。

      当然,如果你发现了问题,如果是你确认的小问题,可以直接创建新的issue, 如果你对这个问题并不确定,可以在开发邮件列表里面就像邮件讨论。当确认问题之后,再创建issue.

      提交PR

      不论你是修复文档还是贡献代码,都建议在你刚才fork的项目中创建一个用于提交PR的分支,以我上面的为例,我会本地创建一个名为LINK-13473-PR的分支,当完成开发之后,将分支push到自己的仓库,就可以创建PR了,如下: +

      阅读项目贡献说明

      一般具体项目会有介绍如何参与该项目的贡献,以Apache Flink为例 就有关于如果参与Flink社区贡献的说明, 比如:

      Apache Flink is developed by an open and friendly community. Everybody is cordially welcome to join the community and contribute to Apache Flink. There are several ways to interact with the community and to contribute to Flink including asking questions, filing bug reports, proposing new features, joining discussions on the mailing lists, contributing code or documentation, improving the website, or testing release candidates.

      详情查阅这里

      订阅邮件列表

      社区问题大多会在具体项目的社区邮件列表里面进行讨论,所以邮件列表是了解社区动态最重要的输入,以Apache Flink 为例,需要订阅 开发邮件列表和用户邮件列表,如下:

      首先,点击上面的link,会引导你给 xxx-subscribe@flink.apache.org 发送邮件。然后你会收到官方确认邮件。最后你回复确认邮件之后还会收到一封欢迎邮件,也就意味这你订阅成功了!注意上面每个邮件列表都需要单独发起订阅。 +OK, 到这一步你已经完成了为Apache Flink做贡献的准备工作了:),接下来就要寻找做贡献的机会了!

      创建issue或者解决issue

      目前大多数ASF项目的问题采用JIRA管理(当然也有例外),我们以Apache Flink为例,当用户发现的问题可以在这里查阅。 如果你发现有你感兴趣的issue,不要犹豫,直接在JIRA下放留言,你想帮忙解决这个问题,并share你解决问题的方法,这样社区会有Committer来与你沟通了!以一个之前我向Flink提交的issue为例 FLINK-13471: +

      当发现有人创建了issue,但还没有分配给任何人,你就可以尝试帮助解决这个问题,在完成开发后提交PR。

      当然,如果你发现了问题,如果是你确认的小问题,可以直接创建新的issue, 如果你对这个问题并不确定,可以在开发邮件列表里面就像邮件讨论。当确认问题之后,再创建issue.

      提交PR

      不论你是修复文档还是贡献代码,都建议在你刚才fork的项目中创建一个用于提交PR的分支,以我上面的为例,我会本地创建一个名为LINK-13473-PR的分支,当完成开发之后,将分支push到自己的仓库,就可以创建PR了,如下:

      点击“Compare & pull request”,进行PR创建,如下:

      创建PR,有几个值得注意的点:

      • 确保你的分支和官方git的master分支没有冲突,也就是如图显示“ Able to merge.”。
      • 要对PR所要解决的问题,在Title里面简明的体现出来,比如“ [FLINK-13471][table] Add FlatAggregate support to stream Table API(blink planner) ” 明确了 JIRA号FLINK-13471, 模块table 和PR的内容是Add FlatAggregate support to stream Table API(blink planner)
      • 同时在详情里面要清楚的描述你改动的点,不同项目有不同的要求,但总体上保持上面提到的 前进一小步,文明一大步的原则,你写的越清楚,Review的人越容易理解你的改动,你的PR越容易得到有效的反馈。

      最后,点击“create pull request”完成PR的创建!不过,这还没有完成社区贡献,还需要等待社区其他贡献者的Review。

      正常情况下,除非是typo的贡献,一般有代码逻辑的PR都会或多或少的得到reviewer的改进反馈,这时候就是学习交流的好机会啦:) 你可以尽可能的发表你的看法,解释你的设计,当然也要充分理解反馈的内容,最后根据沟通达成的内容进行PR的更新!

      最后。。。最后。。。最后 达到了社区代码质量的要求,Committer会帮助你进行代码的Merge,这样你就完成了社区第一份贡献喽!!

      开始1-100之旅

      常识性观念是0-1很难,因为那是创新,那是新领域的探索,那是酝酿了很久之后的第一步!但是参与ASF开源贡献,恰恰是0-1很容易,1-100才是一个持久战。需要上面提到的 “Never, Never, Never Give Up(永不放弃)”, 因为我真的看到了很多社区贡献者在一个社区贡献了一段时间之后,如果没有拿到自己想要的结果,比如成为Committer,就会永远的在这个项目贡献里面消失了,Give Up 了!这不是危言耸听,这是真是的现实!所以在ASF开源贡献的道理上,的确有很多人被 马老师的话所命中:“今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,看不到后天的太阳”。所以,你…准备好了吗?:)

      但行善事,莫问前程

      不论做人,做事还是社区贡献,很多道理都是相通的,在下面的ASF金字塔中,我们从 贡献者 到 董事会成员的路是漫长的,如果你天天想着什么时候成Committer,什么时候成为PMC成员,什么时候成为ASF Member,什么时候能够当选董事会成员,我确信,在ASF开源贡献中,你将无法做到 “快乐工作,认真生活”!过急的目标驱动会增加你的烦恼,相反,登山而不思山顶 攀登,将会迎来一路的惊喜!所以在参与开源的开始,我最后的建议就是:“但行善事,莫问前程”!加油⛽️

      为你打气

      我相信在ASF开源贡献之旅,你会有很多次要放弃的念头,你会遇到很多怀疑自己的时刻,你会时不时的怀疑社区管理者是否有问题?总之,如果你想把他当作一生的乐趣,在你没有找到乐趣之前,你一定需要下面的在文章开头已经提及的三句话:

      • 给世界带来微小而美好的改变
      • 把幸运种子种到别人身上去,你才会有幸运
      • Never, Never, Never Give Up(永不放弃)

      你参与社区的目的是为了尽自己微薄之力,来让ASF开源社区更美好! 你参与社区的信念是为其他人播撒幸福幸运的种子,你并没有在乎得到什么回报,你相信“因果”! -你参与社区的坚守是永不放弃,因为只要我在前行,必将抵达彼岸!永不放弃要深刻你脑海!

      我很喜欢上面这三句阿里土话,我们共勉把!

      诚挚邀请

      我目前在负责Apache Flink的PyFlink建设,诚挚邀请想参与ASF社区贡献的你,以PyFlink作为你的开源之旅的首站!期待在Apache Flink社区PyFlink的建设中,遇见你~~

      小结

      本篇为大家介绍了参与开源的利好,原则,以及介绍为自己的第一个社区贡献需要做怎样的准备。最后诚挚邀请想参与开源建设的朋友首站加入Apache Flink 的PyFlink建设

      关于作者

      查阅更多内容

      © . Made with Hugo using the Tale theme.
      \ No newline at end of file +你参与社区的坚守是永不放弃,因为只要我在前行,必将抵达彼岸!永不放弃要深刻你脑海!

      我很喜欢上面这三句阿里土话,我们共勉把!

      诚挚邀请

      我目前在负责Apache Flink的PyFlink建设,诚挚邀请想参与ASF社区贡献的你,以PyFlink作为你的开源之旅的首站!期待在Apache Flink社区PyFlink的建设中,遇见你~~

      小结

      本篇为大家介绍了参与开源的利好,原则,以及介绍为自己的第一个社区贡献需要做怎样的准备。最后诚挚邀请想参与开源建设的朋友首站加入Apache Flink 的PyFlink建设

      关于作者

      查阅更多内容

    \ No newline at end of file diff --git a/post/how_to_be_a_successful_mentor/index.html b/post/how_to_be_a_successful_mentor/index.html index b242717f..8441c00c 100644 --- a/post/how_to_be_a_successful_mentor/index.html +++ b/post/how_to_be_a_successful_mentor/index.html @@ -1,6 +1,6 @@ -如何成为一名成功的学生导师 · ALC Beijing

    如何成为一名成功的学生导师

    引言

    在去年结束的编程之夏的活动中,本文的作者柯振旭带了两名同学不但顺利完成了暑期实习的任务获得优秀学生最具有潜力奖,还成功将这两名同学发展成为了Apache Skywalking的Committer,在活动结束之后同学们也都留在了社区并结合自己的课题方向不断做出自己的贡献。

    本文适用的读者范围是那些想为自己的社区吸引更多长期学生贡献者的导师,不适合单纯为了奖金和只为了吸引一次性劳力的社区项目。

    本文将按照暑期活动的三个主要阶段,介绍每个阶段中为了达到项目的最终成功,导师可以作出的努力。

    出题阶段

    一个导师在出项目题目的时候,很可能就已经确定了这个项目的生命周期,以及参与这个项目的学生的贡献周期。 +如何成为一名成功的学生导师 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    29 +Apr 2021

    如何成为一名成功的学生导师

    引言

    在去年结束的编程之夏的活动中,本文的作者柯振旭带了两名同学不但顺利完成了暑期实习的任务获得优秀学生最具有潜力奖,还成功将这两名同学发展成为了Apache Skywalking的Committer,在活动结束之后同学们也都留在了社区并结合自己的课题方向不断做出自己的贡献。

    本文适用的读者范围是那些想为自己的社区吸引更多长期学生贡献者的导师,不适合单纯为了奖金和只为了吸引一次性劳力的社区项目。

    本文将按照暑期活动的三个主要阶段,介绍每个阶段中为了达到项目的最终成功,导师可以作出的努力。

    出题阶段

    一个导师在出项目题目的时候,很可能就已经确定了这个项目的生命周期,以及参与这个项目的学生的贡献周期。 以下是我从 2020 届暑期活动中,总结出来的我自己出题阶段遵循的几个参考指南。

    • 不要出纯体力活的题目。

      虽然活动组委会没有限制,但我个人强烈建议导师不要出一些“纯体力活”的题目,类似翻译文档,整理文档,整理 license,添加测试用例等。 这类题目几乎不存在与之对应的兴趣,缺乏兴趣的学生在完成暑期活动之后很难有持续为社区继续贡献的动力,甚至在项目中期就已经弃坑了。 社区参与暑期活动的目的是为了吸引更多学生开发者,而不是为了把枯燥无味的体力活承包给学生。

    • 不要出难度过高的题目。

      我们的目的是为了吸引更多学生关注和持续贡献开源项目,而不是在举办竞赛。 @@ -14,6 +14,5 @@ 与学生建立长期稳定的联系之后,学生更愿意留在熟悉的社区持续贡献。

    • 不要吝惜鼓励和赞美,要指出可以改进的地方。

      当学生获得阶段性成果时,适当给予语言上的鼓励和赞赏,“后浪"们的能力有时确实超出我们的预期,应当鼓励学生除了完成项目范围内的工作,还可以自己提出对于社区项目的思考和意见,为社区注入新鲜的活力。 对于学生做得不好的地方,也要敢于提出可以改进的地方。“放养式"的指导会让学生没有任何成就感,也得不到成长。

    完成阶段

    • 关注学生成长,提供继续贡献的方向。

      当学生顺利完成项目后,为了学生能够继续持续贡献,导师最好应当关注学生的专业和兴趣方向(这来自于指导阶段与学生建立的朋友关系,基于此来了解学生的专业方向和兴趣)。 作为比较熟悉项目和社区的先行者,导师可以继续帮助学生发现和挖掘项目中,与其兴趣匹配的任务,让学生能够继续持续贡献的同时,也对学生身的成长有所帮助,学生自然愿意继续留在社区。

    • 适当后退,给学生独立负责的机会。

      当学生开始熟悉社区项目和自己负责的领域之后,导师应当适当后退,给予学生独立负责这个领域的项目(或子项目)的机会。 -当学生成长为某些项目 / 领域的 maintainer 时,出于责任心和被需要感,学生们当然愿意持续付出,甚至成为下一期暑期活动的导师,带领更多新的同学进入开源世界的大门。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +当学生成长为某些项目 / 领域的 maintainer 时,出于责任心和被需要感,学生们当然愿意持续付出,甚至成为下一期暑期活动的导师,带领更多新的同学进入开源世界的大门。

    \ No newline at end of file diff --git a/post/index.html b/post/index.html index 3d9b45ec..326d89f5 100644 --- a/post/index.html +++ b/post/index.html @@ -1,29 +1,94 @@ -Posts · ALC Beijing

    Rich Bowen: 无论你在创造什么,最终交付的是信任。

    早在开源被我们称之为开源,Rich Bowen 就已经参与其中。作为 Apache 软件基金会的成员,Rich 目前担任董事会成员、会议副总裁。此外,他还是 AWS 的开源策略师。这些多重角色赋予了他对开源的更广泛和深刻的理解。 -在他于 2023 年 CommunityOverCode Asia 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。 -思否:近年来,中国的公司相继设立开源计划办公室。作为

    开源贡献难吗?

    在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这一主题演讲。 主题演讲视频 我目前就职于字节跳动流式计算团队,负责 SQL 引擎的研发工作;我的社区贡献经历主要包括 Apache Flink 和 Calcite 两个项目,我是从19 年开始参与 Flink 社区,有幸在20年6月受邀成为committer;然后是在22年3月开始参与 Calcite 社区,并且在23年1月受邀成为 PMC 成员。 [图片] -为了准备这个talk,我还专门问了很多同事、和朋友,参与开源贡献有哪些难点,很多人的反应都是工

    从参会到办会的入’坑’指南

    在CommunityOverCode Asia 2023的闪电演讲中, 姜宁花5分钟总结了他与ApacheCon之间的故事以及收获, 也解释了为什么能够坚持三年办会的原因。 -是什么原因支撑着我办Apache大会,这需要从我参加的Apache活动讲起。 -2007年我第一次参加ApacheCon, 见到了很多只在email里面沟通的大牛,体验了会前的hackthon,在两天时间里和大牛思想碰撞,当时给Apache Camel提交了负载均衡的代码。尝试了边喝啤酒边写代码简单而纯粹的快乐! -2009年在北京中关村,融科,Intel 研发中心,参加 Apache 北京路演,第一次听到Hadoop, 天使投资, 见到的

    CommunityOverCode Asia 2023 会议资料汇总

    本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频以及会议演讲材料的下载信息。 -详细的会议日程,大家可以查看: https://apachecon.com/acasia2023/zh/tracks.html 主题演讲Keynote 会议演讲材料: https://pan.baidu.com/s/19zDD7-w0wHT254pxDESBGQ?pwd=fyif  B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1727612 API 微服务 会议演讲材料: htt

    新孵化项目提案指导

    原文链接: https://cwiki.apache.org/confluence/display/INCUBATOR/New+Podling+Proposal?desktop=true&amp;macroName=markdown -译者: 刘天栋 Ted Liu -校对: 姜宁 Willem Jiang -摘要 Abstract 评注: 对项目的简短描述性概述。一段简短的文字,长度最好为一句话。摘要应适合在毕业时用于创建正式项目的董事会决议中重复使用,并作为新孵化项目网站和项目描述 (DOAP: Description of a Project)文件的第一段。 -Commentary: A short d

    【Release】ASF 孵化项目发版常见问题

    这篇文档基于 ASF 官方的发版指南做提取和精简, 关注我们在发版过程中最容易忽视/犯错的部分, 初次参与发版的同学, 尤其是每个仓库/模块的负责人都需要完整, 仔细的通读一遍, 不确定的地方请及时沟通询问 -注: 本文主要以已加入 incubator , 也就是正在孵化中的项目为背景进行描述, 不再对已毕业项目和其他类型做额外解释说明 -0. 前言 相信对于每个初入 ASF 的孵化项目来说,第一次发版都会遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表,思考了下主要原因可能有: -ASF 官方的文档颇为零散,社区的普通开发者和未参与发版的同学经常没有耐心通读所

    【Apache 博客】之 ASF 软件安全报告

    ALC Beijing 引言 2021年末的log4jshell问题让开源软件的安全问题再次成为大家关注的热点问题。 ASF最近的这篇2021年的软件安全报告让我们可以更加深入了解Apache软件基金会是的安全响应流程, 安全响应团队的日常的工作任务, 以及2021年度Apache软件基金会旗下项目关键安全事件。希望这篇报告能够帮助大家对Apache软件基金会基于志愿者的软件安全处理有更加全面的了解。 -Apache软件基金会博客 Apache 软件基金会安全报告:2021年 -概要:本报告探讨了2021年 Apache 软件基金会所有项目的安全状况。我们回顾了关键指标、特定漏洞以及 ASF 项目用户受安全问题影响的

    ALC Beijing Episode #11 DolphinScheduler社区构建之旅

    音频编辑: 周禹任 -文案: 周禹任 -内容梗概 今年4月 Apache DolphinScheduler 正式毕业成为Apache顶级项目,在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。 -在这一期节目中,两位嘉宾和主持人就DolphinScheduler如何克服构建开源社区的挑战,OpenSource Community 对开源项目项目的影响,以及Community 构建之路给出了十分宝贵的经验和建议。对开源社区构建感兴趣的小伙伴们赶紧来听听吧! -时间线 时间区间 精彩话语提炼 03:17~~06:18 Apache

    ALC Beijing Episode #10 谈谈内源2

    音频编辑: 周禹任 -文案: 周禹任 -内容梗概 目前,越来越多的软件开发者把开源的优秀实践带到企业内部,在组织内部建立起了一种类似开源的文化氛围。在上期关于内源的节目中,姜宁老师和谭中意老师让我们了解了内源和开源的关系,以及内源究竟是什么。 -在这一期节目中,姜宁老师,谭中意老师则对内源的话题进一步聚焦,就内源的具体适用性、责任方以及动力问题进行了详细的讨论。让我们一起听一下他们在这一期中为我们带来的精彩呈现吧。 -时间线 时间区间 精彩话语提炼 03:10~~08:50 什么样的项目适合以内源的方式在公司内部开源 09:02~~13:29 内源项目应该由谁来兜底? 13:30~~17:56 内源

    如何成为一名成功的学生导师

    引言 在去年结束的编程之夏的活动中,本文的作者柯振旭带了两名同学不但顺利完成了暑期实习的任务获得优秀学生最具有潜力奖,还成功将这两名同学发展成为了Apache Skywalking的Committer,在活动结束之后同学们也都留在了社区并结合自己的课题方向不断做出自己的贡献。 -本文适用的读者范围是那些想为自己的社区吸引更多长期学生贡献者的导师,不适合单纯为了奖金和只为了吸引一次性劳力的社区项目。 -本文将按照暑期活动的三个主要阶段,介绍每个阶段中为了达到项目的最终成功,导师可以作出的努力。 -出题阶段 一个导师在出项目题目的时候,很可能就已经确定了这个项目的生命周期,以及参与这个项目的学生的贡献周期。 以下是我从 2

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Posts | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Posts

    \ No newline at end of file diff --git a/post/index.xml b/post/index.xml index 17874286..7b41b029 100644 --- a/post/index.xml +++ b/post/index.xml @@ -1,517 +1,59 @@ -Posts on ALC Beijinghttps://alc-beijing.github.io/alc-site/post/Recent content in Posts on ALC BeijingHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000Rich Bowen: 无论你在创造什么,最终交付的是信任。https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/早在开源被我们称之为开源,Rich Bowen 就已经参与其中。作为 Apache 软件基金会的成员,Rich 目前担任董事会成员、会议副总裁。此外,他还是 AWS 的开源策略师。这些多重角色赋予了他对开源的更广泛和深刻的理解。 -在他于 2023 年 CommunityOverCode Asia 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。 -思否:近年来,中国的公司相继设立开源计划办公室。作为一家知名的开源公司,AWS 是如何管理、运营和推广开源的呢? -Rich Bowen: 总的来说,AWS 和亚马逊从一开始就一直在基于开源进行构建,我们所做的一切都依赖于开源。在亚马逊,我们遵循领导力准则,这些准则影响着我们的思考方式。 -第一个准则是顾客至尚。我们始终关注客户并优先满足他们的需求,所以我们构建了所有这些基础设施,而这些产品都建立在开源技术之上。最重要的是,开源项目必须具备可持续性。我们在开源上所做的一切,首先需要确保这些开源项目保持健康的运行。我们还有一项工作是项目选择,如果有多个项目可供选择,我们会尽量选择一个拥有健康生态系统和强大社区的项目。这意味着很多事情,包括众多公司的参与以及透明的项目沟通。接下来,我们会密切关注这些社区,确保它们的生态是健康的,同时我们也会积极参与社区维护,这是最重要也是我们关注的焦点。 -我们推广开源的方式不是独立进行的,而是是与社区一起。例如,我们非常依赖 Apache 项目,如 Kafka 和 Airflow 等。我们通过参与他们的会议,比如 Kafka Summit 和 Airflow Summit 去进行推广。通过和社区一起推广,我们可以确保这是社区的看法,而不是亚马逊的看法。此外,我们还会参与社区活动,如 KubeCon 或开源峰会。 -思否:这更像是让公司退居幕后,但对于一些在项目中投入了大量资源的开源公司来说,做出清晰的决策可能会很困难。他们可能会因为投资而模糊界限,或者将项目视为自己的品牌。 -Rich Bowen:的确如此。有时你会对一个开源项目的推广产生疑惑,他们是在谈论项目还是在谈论公司?这很难区分出来。 -像任何大公司一样,不同部门之间会存在差异。但作为一名开源策略师,我的工作是参与部门其中,并为他们提供建议,告诉他们我们认为正确的参与方式,即把社区放在第一位,而不是我们自己。 -思否:你能分享一些优秀的 AWS 开源项目吗? -Rich Bowen:从我的角度来看,Amazon 参与的开源社区主要分为两种类型。一种是主要由亚马逊主导的,另一种是主要由社区主导的。 -我们参与的一类开源项目是围绕我们某项服务的,因此除非他们是客户,否则其他人没有真正的动力参与其中。还有一类项目是很多公司参与进来的,比如 Apache Kafka。我主要关注的是第二类项目,也就是真正的社区项目。在亚马逊,我参与的大多数项目实际上都是 Apache 项目。 -我最为兴奋的项目之一是 Apache Airflow,因为这是一个亚马逊积极参与的项目。虽然这个项目并不属于亚马逊,但我们有很多全职工程师也参与其中。作为一个社区项目,也有许多其他公司参与其中。我个人认为,这是我们最佳参与项目方式的模型之一。 -思否:在你看来,该如何建立一个开源生态系统呢? -Rich Bowen:保持沟通透明是最重要的事情。所有关于 Apache Airflow 的讨论都通过邮件进行。我们并不会进行内部会议,然后通知项目:“这是我们做的决定”。相反,我们向社区递交提案,接着在社区中进行讨论和决策。所以,一切的前提是保持公开透明。开源贡献难吗?https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这一主题演讲。 主题演讲视频 我目前就职于字节跳动流式计算团队,负责 SQL 引擎的研发工作;我的社区贡献经历主要包括 Apache Flink 和 Calcite 两个项目,我是从19 年开始参与 Flink 社区,有幸在20年6月受邀成为committer;然后是在22年3月开始参与 Calcite 社区,并且在23年1月受邀成为 PMC 成员。 [图片] -为了准备这个talk,我还专门问了很多同事、和朋友,参与开源贡献有哪些难点,很多人的反应都是工作那么忙,哪有时间参与开源;参与社区门槛太高,不知道怎么开始。我总结下来主要是这三个问题,一般没有开始参与的同学会感觉没有时间参与、开始尝试参与贡献的又会觉得社区的门槛很高、贡献了一段时间之后发现社区对自己响应太慢,坚持不下来;而我自己在参与开源的过程中对这几个难点也是深有体会,接下来我就结合自己的开源经历给大家分享一下我是怎么克服这些困难,最终参与到社区里的。 -“没有时间”是很多人面临的第一个问题,我自己也是一样的。 -我最开始参与开源是在19年的下半年,当时正是我们在字节内部在推广使用 Flink SQL 的时候,本来内部业务就很忙,白天根本就没有时间,我就利用午休、晚上下班后还有周末的时间了解一些社区的进展,做一些力所能及的事情。我印象很深刻的是,那时候 Flink 社区里的邮件特别多(当然现在也很多),每天有 50-100 封邮件,根本就看不完,我那时候还在手机装上了 google 邮箱客户端,每天在坐地铁的时候也会看一下邮件,了解一下社区的最新进展。 -参与了一段时间后我意外的发现,我经常会在晚上十一二点的时候还会收到 review 评论,原来社区里很多人也都是在业余时间参与。有好几次,晚上临睡觉之前收到了review回复之后,兴奋的睡不着,就爬进来继续改代码,直到把代码push上去才睡得着。当最终看到自己的工作被社区认可,被合并到主分支的时候,是特别开心的,非常有成就感。 -其实参与进去之后,时间问题其实就不是问题了,因为我在社区里的工作,很多时候都可以反哺到我的工作。 -比如好几次,都是因为我在社区里帮别人解答了一些问题之后,在内部用户也遇到了相同的问题,我就可以很快的帮用户解决掉了;而且很多时候我们在内部解决一些问题的时候,由于对系统还不够了解,所以也拿不准解决方案合不合理,这时候我们也会把问题抛到社区里,可以有更资深的同学帮我们把关;甚至于有几次,我们自己碰到了自己完全解决不了的问题,抛到社区里之后也是很快就有人帮我们解决了。就感觉自己好像又多了一个强大的虚拟团队。内部工作变的更轻松之后,就可以跟参与社区形成互补,也可以把一些工作节省出来的时间投入到参与社区工作中。 -另外,根据我们团队多年的经验来讲,能够做大upstream first才是成本最低的方式。什么叫upstream first呢,就是我们在对开源软件进行修改的时候,优先把这些改动贡献到上游项目中,而不是只在自己fork的版本中进行修改。这样我们内部开发和开源社区的开发就可以形成合力,不需要在每个版本进行适配,从长期来看才是成本最低的方式。 所以不管是对个人还是对团队,能够参与到开源社区,都是非常有价值的。 -其实参与社区久了之后,就会感觉参与社区反而是一件很轻松愉快的事,就跟我们大学的时候刷论坛一样,没事就去刷一下看看有没有什么有意思的事情。我跟很多有长期参与开源社区经历的朋友聊,很多人都有类似的感受。尤其是在工作遇到了困难搞不定了,或者工作累了想休息一下的时候,就到社区里去放松放松。如果工作的过程是一个放电的过程,那么参与开源的过程反而就是一个充电的过程。对,不光二舅可以治疗精神内耗,开源也可以治疗精神内耗。 -门槛高也是很多同学在参与开源的时候遇到的经常遇到的问题。 -一方面社区的工作模式跟我们平时的工作模式很不一样,需要一个适应的过程,比如需要怎么用邮件列表交流、还需要用英语、很多时候刚进入到社区看到很多问题也看不懂,也不知道那些issue适合新手做;另一方面,有很多项目,有比较深的背景知识,入门曲线比较陡峭,代码量也非常高,动不动就上百万行。 -刚刚也提到了,我一开始参与 Flink 社区的时候,也是先订阅了社区的邮件列表。那时候每天盯着上百封邮件,大部分也看不懂;也看到很多人在创建新的issue,但是感觉也不会做。感觉社区离自己很遥远。而且 google 邮箱底下有一个空间提示,它有 15G 的免费空间,我天天看着这个数字,我就经常在想,每天这么多邮件,我有没有可能在我的邮箱空间用满之前拿到社区的committer呢? -后来有一个周日,我早上起来之后习惯性的打开电脑,查看一下社区的邮件。我就看到有个人外国的小哥提了一个关于 streaming join 原理的问题,而且是提了好几天了还没有人回复,他又重新提了一下。这个问题相对来讲还是比较底层,对当时的我来说还是很具有挑战性的,而且正好我对这个问题也很感兴趣。然后我就想我是不是可以去看看这部分代码,帮解答一下这个问题。然后我就马上开始研究这部分代码,花了两个多小时的时间,终于赶在午饭之前搞懂了这个问题,然后赶紧去社区里回答了一下。(当时在看的过程中内心里还一直在想,社区的大佬们你们千万不要在这个时候回复了,要不然我的功夫就白费了。)后面我的回答也得到了 Flink PMC 云邪老师的认可,这让我开心了好几天,所以那个周末过的特别的愉快。从参会到办会的入’坑’指南https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/Mon, 25 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/在CommunityOverCode Asia 2023的闪电演讲中, 姜宁花5分钟总结了他与ApacheCon之间的故事以及收获, 也解释了为什么能够坚持三年办会的原因。 -是什么原因支撑着我办Apache大会,这需要从我参加的Apache活动讲起。 -2007年我第一次参加ApacheCon, 见到了很多只在email里面沟通的大牛,体验了会前的hackthon,在两天时间里和大牛思想碰撞,当时给Apache Camel提交了负载均衡的代码。尝试了边喝啤酒边写代码简单而纯粹的快乐! -2009年在北京中关村,融科,Intel 研发中心,参加 Apache 北京路演,第一次听到Hadoop, 天使投资, 见到的著名的陈绪同学,近距离在家门口感受到了开源的氛围。 另外2006年 ApacheCon Asia 第一次大会是在斯里兰卡召开的。 -2010年在上海,复旦大学,张江校区,两天的 Apache 路演大会, 当时公司支持开发同学外出演讲对外发声,于是我报名参加大会做了有关Camel的演讲,同时顺道参观的上海世博,还赢了一台iPad。 照片是 Freeman, Niclas Hedhman 和当时去健身房减了十斤的我, 满满的胶原蛋白吧! -2015年 北京,中关村,科学院大学,开源社主办的 Apache China 路演会议 这是其中一个圆桌论坛,微软C#/TypeScript 之父 Anders Hejlsberg , Niclas Hedhman 会后大家一起合影, 这是韩卿,我,梁辰晔(之后成为华为的同事), 赵生宇(19年再次见面,开启了更多的合作), 通过大会结识了很多小伙伴,在后续的开源道路上相互协作。 -2017年, 这是时隔10年之后, 终于能够再次参加Apache北美大会,这次的会议的目的地是Miami,当时参会的主要目的是帮助ServiceComb寻找孵化导师。 可以看到 Rich, Justin, 阿里的同学,张乎兴,王晓瑞, 冯嘉。 当然也少不了啤酒, 当时正好和Mark Tomas 聊天。 -借 18年,19年的 HuaweiConnect 大会,邀请到了 ASF的 Craig, Roman, Justin访华,组织和国内的 Apache 开发者见面。 取得成果是 2018年 推动了 ShardingSphere 进入ASF孵化,2019年 推动 APISIX 进入ASF孵化。 当时和Craig就有聊过在中国办大会的想法,但是因为没有办过大会,心里还是没有底,还没有真正付诸行动。CommunityOverCode Asia 2023 会议资料汇总https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/Sat, 23 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频以及会议演讲材料的下载信息。 -详细的会议日程,大家可以查看: https://apachecon.com/acasia2023/zh/tracks.html 主题演讲Keynote 会议演讲材料: https://pan.baidu.com/s/19zDD7-w0wHT254pxDESBGQ?pwd=fyif  B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1727612 API 微服务 会议演讲材料: https://pan.baidu.com/s/1cmCNIMpv3hVN_mFanuZJ5w?pwd=f41x B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1730769 DataOps 会议演讲材料:https://pan.baidu.com/s/1lMIaaZxMWXiAlSz6JBoGqA?pwd=rjh9 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729751 孵化器 会议演讲材料:https://pan.baidu.com/s/1APRp2is7EVoOR2fuJygeYw?pwd=9c27 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1733871 OLAP 会议演讲材料:https://pan.baidu.com/s/1JI-fOnQ5qzjBFTFps3GNUw?pwd=dtv4 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1728036 RPC 会议演讲材料:https://pan.baidu.com/s/1ecTLQgD9LCdwHUvbFJBUuw?pwd=kgxs B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729739 Web Server/Tomcat 会议演讲材料:https://pan.baidu.com/s/1Is8lK02wQb8sjQEvo9irmg?pwd=c3hs B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1731492 云原生 会议演讲材料:https://pan.baidu.com/s/1qq98HahndKRo4WKHR3KKbQ?pwd=1f37 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729754 人工智能/机器学习 会议演讲材料:https://pan.baidu.com/s/1udTYbJ5OXuKjBo_pRsmqAw?pwd=h954 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1727740 开源社区 会议演讲材料:https://pan.baidu.com/s/1GAglK6ARVBMxkxxCtO7kJw?pwd=gupa B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1728179 性能工程 会议演讲材料:https://pan.baidu.com/s/1q44Q476GM4svy548C428mQ?pwd=mpj5 B站视频:https://space.bilibili.com/609014805/channel/collectiondetail?sid=1729743 数据存储与计算 会议演讲材料:https://pan.baidu.com/s/13uC72OkjKfn752_OxJMmuA?pwd=hnf2 B站视频:https://space.新孵化项目提案指导https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/Mon, 18 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/原文链接: https://cwiki.apache.org/confluence/display/INCUBATOR/New+Podling+Proposal?desktop=true&amp;macroName=markdown -译者: 刘天栋 Ted Liu -校对: 姜宁 Willem Jiang -摘要 Abstract 评注: 对项目的简短描述性概述。一段简短的文字,长度最好为一句话。摘要应适合在毕业时用于创建正式项目的董事会决议中重复使用,并作为新孵化项目网站和项目描述 (DOAP: Description of a Project)文件的第一段。 -Commentary: A short descriptive summary of the project. A short paragraph, ideally one sentence in length. The abstract should be suitable for reuse in the board resolution used to create the official project upon graduation, as the first paragraph on the podling web site and in the DOAP document.【Release】ASF 孵化项目发版常见问题https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/这篇文档基于 ASF 官方的发版指南做提取和精简, 关注我们在发版过程中最容易忽视/犯错的部分, 初次参与发版的同学, 尤其是每个仓库/模块的负责人都需要完整, 仔细的通读一遍, 不确定的地方请及时沟通询问 -注: 本文主要以已加入 incubator , 也就是正在孵化中的项目为背景进行描述, 不再对已毕业项目和其他类型做额外解释说明 -0. 前言 相信对于每个初入 ASF 的孵化项目来说,第一次发版都会遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表,思考了下主要原因可能有: -ASF 官方的文档颇为零散,社区的普通开发者和未参与发版的同学经常没有耐心通读所有文档以及注意到关键事项 (或理解有偏差) ASF 官方文档对于有些描述仍较为模糊, 或者它直接建议 PMC/Mentor/Mail 来讨论决策,但这部分结论通常没有更新记录到文档中 ASF 官方没有给大家推荐类似 skywalking-eye (header/dependency) 的自动化检查工具,这些工具对初次发版的同学可能会有许多帮助 ASF 文档中对有些规范/规则并未严格要求, 但发版投票时不同的 Reviewer 可能有不同的习惯/偏好, 从而会提出一些改进&rdquo;建议&rdquo; &ldquo;中/英&quot;语言/语义上的理解偏差,从而导致了某些内容的误解 借着 Apache HugeGraph 首次发版的机会,我也顺便总结了一些 PR / 邮件中遇到的事项和经验,由于是个人理解,可能存在不严谨的地方,欢迎大家一起来 review 和补充完善,避免相似的问题反复出现在 incubator 项目的发版过程中:) -名词 一些文中出现的常见名词缩写: -ASF: Apache Software Foundation ASL2.0: Apache Software License 2.0 ASF &amp; Apache 新同学可能会比较困惑为何常看到 ASF 的邮件/文档中不直接使用 Apache 项目 这样的描述, 而建议/习惯使用 ASF 项目.【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ALC Beijing 引言 2021年末的log4jshell问题让开源软件的安全问题再次成为大家关注的热点问题。 ASF最近的这篇2021年的软件安全报告让我们可以更加深入了解Apache软件基金会是的安全响应流程, 安全响应团队的日常的工作任务, 以及2021年度Apache软件基金会旗下项目关键安全事件。希望这篇报告能够帮助大家对Apache软件基金会基于志愿者的软件安全处理有更加全面的了解。 -Apache软件基金会博客 Apache 软件基金会安全报告:2021年 -概要:本报告探讨了2021年 Apache 软件基金会所有项目的安全状况。我们回顾了关键指标、特定漏洞以及 ASF 项目用户受安全问题影响的最常见方式。 -发布时间:2022 年 1 月 -作者:Mark Cox,Apache软件基金会安全副总裁 -背景 Apache 软件基金会 (ASF) 的安全委员会负责监督和协调所有 350 多个 Apache 项目中漏洞的处理。我们成立于 2002 年,由所有志愿者组成,我们对如何处理问题有一个标准流程,这个流程包括我们的项目必须如何披露安全问题。 -在 Apache 项目中发现安全问题的任何人都可以将它们报告给 security@apache.org,在那里它们会被记录下来并传递给相关的专门安全团队或项目管理委员会 (PMC) 来处理。安全委员会监控所有项目报告的所有问题,并在整个漏洞生命周期中跟踪问题。 -安全委员会负责确保问题得到妥善处理,并积极提醒项目突出的问题和责任。作为董事会委员会,我们有能力采取行动,包括阻止其未来的发布,或者在最坏的情况下,如果项目对处理其安全问题没有响应,则将项目退休归档。这与 Apache 许可证 v2.0一起,是 ASF 围绕官方发布的一般治理功能的关键部分,使 ASF 能够保护个人开发人员,并让用户有信心部署和依赖 ASF 软件。 -对所有安全报告的监督以及我们开发的工具使我们能够轻松创建有关问题的指标。我们的上一份报告涵盖了2020年的指标。 -2021年统计数据 2021 年,我们的安全电子邮件地址总共收到了约 18,500 封电子邮件。在垃圾邮件过滤和讨论主题分组之后,有 1272 个(2020年:946个,2019年:620个)非垃圾邮件主题。不幸的是,安全报告有时确实看起来像垃圾邮件,尤其是当它们包含大量附件或大型视频时,因此安全团队会仔细审查所有邮件,以确保真实安全报告不会错过太长时间。 -图1:2021 年 ASF 安全电子邮件主题的细分 -图1给出了这 1272 个电子邮件主题的细分。359 个电子邮件主题 (28%) 与 Apache 许可证使用困惑相关的问题。由于许多项目都使用 Apache 许可证,而不仅仅是那些在 ASF 保护伞下的项目,当人们看到 Apache 许可证并且他们不明白它是什么时,他们可能会感到困惑。这在手机上最常见,例如在设置菜单中显示许可证的手机上,通常是由于包含 Google 根据 Apache 许可证发布的软件。我们不再回复这些电子邮件。这比 2020 年收到的 257 个有所增加。ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/音频编辑: 周禹任 -文案: 周禹任 -内容梗概 今年4月 Apache DolphinScheduler 正式毕业成为Apache顶级项目,在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。 -在这一期节目中,两位嘉宾和主持人就DolphinScheduler如何克服构建开源社区的挑战,OpenSource Community 对开源项目项目的影响,以及Community 构建之路给出了十分宝贵的经验和建议。对开源社区构建感兴趣的小伙伴们赶紧来听听吧! -时间线 时间区间 精彩话语提炼 03:17~~06:18 Apache DolphinScheduler 是出于什么原因加入到Apache 软件基金会的? 06:42~~13:56 DolphinScheduler 在进入孵化器后遇到了哪些困难?又是如何克服的? 14:00~~19:18 社区对开源项目有什么影响,对开源项目的价值 19:22~~34:18 怎么吸引并留住社区的贡献者们 32:30~~34:20 社区构建的意义:可持续发展的项目的基石 请收听 ALC Beijing Podcast Episode #11:DophinScheduler社区构建之旅 -本期嘉宾 郭炜:Apache Member,Apache DolphinScheduler PMC,前易观CTO -代立冬:Apache DolphinScheduler PMC Chair,Apache 孵化器导师,前易观大数据平台负责人 -潘娟:SphereEx 联合创始人兼CTO, Apache member, Apache ShardingSphere PMC, 中国木兰开源社区导师。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/音频编辑: 周禹任 -文案: 周禹任 -内容梗概 目前,越来越多的软件开发者把开源的优秀实践带到企业内部,在组织内部建立起了一种类似开源的文化氛围。在上期关于内源的节目中,姜宁老师和谭中意老师让我们了解了内源和开源的关系,以及内源究竟是什么。 -在这一期节目中,姜宁老师,谭中意老师则对内源的话题进一步聚焦,就内源的具体适用性、责任方以及动力问题进行了详细的讨论。让我们一起听一下他们在这一期中为我们带来的精彩呈现吧。 -时间线 时间区间 精彩话语提炼 03:10~~08:50 什么样的项目适合以内源的方式在公司内部开源 09:02~~13:29 内源项目应该由谁来兜底? 13:30~~17:56 内源项目的商业交付模式 18:00~~24:03 内源参与的源动力,姜宁:知识共享 24:52~~28:03 内源参与的源动力,谭中意:解决需求&amp;技术影响力 32:20~~37:23 Apache way在内源中的应用 请收听 ALC Beijing Podcast Episode #10:又谈内源 InnerSource -本期嘉宾 谭中意: 开源社区资深爱好者, 开放原子基金会TOC副主席,Mozilla/Gnome/Apache committer。 国际内源基金会成员和布道者, 曾在多个开源大会上分享内部开源相关议题。 -潘娟:京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。 -姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。如何成为一名成功的学生导师https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/引言 在去年结束的编程之夏的活动中,本文的作者柯振旭带了两名同学不但顺利完成了暑期实习的任务获得优秀学生最具有潜力奖,还成功将这两名同学发展成为了Apache Skywalking的Committer,在活动结束之后同学们也都留在了社区并结合自己的课题方向不断做出自己的贡献。 -本文适用的读者范围是那些想为自己的社区吸引更多长期学生贡献者的导师,不适合单纯为了奖金和只为了吸引一次性劳力的社区项目。 -本文将按照暑期活动的三个主要阶段,介绍每个阶段中为了达到项目的最终成功,导师可以作出的努力。 -出题阶段 一个导师在出项目题目的时候,很可能就已经确定了这个项目的生命周期,以及参与这个项目的学生的贡献周期。 以下是我从 2020 届暑期活动中,总结出来的我自己出题阶段遵循的几个参考指南。 -不要出纯体力活的题目。 -虽然活动组委会没有限制,但我个人强烈建议导师不要出一些“纯体力活”的题目,类似翻译文档,整理文档,整理 license,添加测试用例等。 这类题目几乎不存在与之对应的兴趣,缺乏兴趣的学生在完成暑期活动之后很难有持续为社区继续贡献的动力,甚至在项目中期就已经弃坑了。 社区参与暑期活动的目的是为了吸引更多学生开发者,而不是为了把枯燥无味的体力活承包给学生。 -不要出难度过高的题目。 -我们的目的是为了吸引更多学生关注和持续贡献开源项目,而不是在举办竞赛。 初次接触开源项目的学生,除了需要一些时间熟悉该项目本身的技术,还需要很多时间去熟悉开源社区的协作模式、工作流、搭建开发环境、测试方法等等。 同时学生也有一些学校的任务需要完成,难度过高的题目可能无法在活动时间内顺利完成。 -导师要自己先评估题目。 -目前(2021 年)组委会对于导师所提交的题目没有审核的阶段,但在我自己出题的时候,列出多个候选的题目后,在做最终投递的选择时,有几个自我评估的标准: -假如这个题目让我自己来做,我自己会不会感到有趣?指导学生完成项目有时候会很无聊,当你所指导的项目本身也很无聊的时候,项目长达四个月的指导过程可能会让学生和老师都无法坚持下来,导致项目草草结束甚至中途终止。 这个题目是否具有延续性?当暑期活动结束后,具有延续性的项目,能够扩展出相似的或进一步的工作,学生能够从自己已经熟悉的原项目的基础上,继续为社区做贡献,这时候即使没有活动奖金的激励,学生也能够比较轻松地完成后续的贡献。比如活动的题目是适配某一个配置中心,那么活动结束后可以引导学生继续适配另一些配置中心,或者增加/优化一些配置项。 指导阶段 要适当增大包容度。 -项目开始初期,学生搭建开发环境,初次接触开源社区的工作方式,可能会有很多基本的问题,这些问题对于导师来说是小菜一碟,但是学生可能需要花费好几个小时甚至好几天去解决。对刚开始接触开源项目的学生来讲会产生非常大的挫败感。 对于初次接触开源项目的学生,适当增大包容度,及时给予一些帮助,以帮助学生快速进入到项目和社区。但也要注意应该只提供解决问题的方向,不应该直接帮助学生编写代码或调试代码。 比如说给学生提供完整的背景知识,递进式的解题思路,逐步引导学生自己一步一步找到解决方案,让学生在自己探索解决方案的过程中,也能有所成长。 -要定期沟通项目进度。 -导师们有自己的日常工作,学生们也有学校的任务和活动,缺乏沟通会导致项目进度停滞不前。 导师和学生之间应该建立定时沟通的机制,双方每周(或每两周)约定腾出一定的时间,建立音频会议或视频会议,同步项目的进度,学生提出遇到的问题,导师帮助解答。 对于社区有要求的(如 Apache),项目的讨论和进度还必须公开同步到邮件列表等公开渠道。 -要当导师也要当朋友。 -从学生角度,导师-学生关系容易产生距离感,特别是当导师是社区里面比较资深的&quot;大佬&quot;时。在学生遇到问题时,会顾虑这个问题对于导师来讲是否太简单了而不好意思提出,耽误了项目的进度。 我平时偶尔也会和学生聊一些他们学校和我自己生活中的趣事,在学生消除了距离感时,他们也会咨询一些活动项目之外的问题,比如职业规划,行业看法,邀请我参与他们的学术报告调研等等。 与学生建立长期稳定的联系之后,学生更愿意留在熟悉的社区持续贡献。 -不要吝惜鼓励和赞美,要指出可以改进的地方。 -当学生获得阶段性成果时,适当给予语言上的鼓励和赞赏,&ldquo;后浪&quot;们的能力有时确实超出我们的预期,应当鼓励学生除了完成项目范围内的工作,还可以自己提出对于社区项目的思考和意见,为社区注入新鲜的活力。 对于学生做得不好的地方,也要敢于提出可以改进的地方。&ldquo;放养式&quot;的指导会让学生没有任何成就感,也得不到成长。 -完成阶段 关注学生成长,提供继续贡献的方向。 -当学生顺利完成项目后,为了学生能够继续持续贡献,导师最好应当关注学生的专业和兴趣方向(这来自于指导阶段与学生建立的朋友关系,基于此来了解学生的专业方向和兴趣)。 作为比较熟悉项目和社区的先行者,导师可以继续帮助学生发现和挖掘项目中,与其兴趣匹配的任务,让学生能够继续持续贡献的同时,也对学生身的成长有所帮助,学生自然愿意继续留在社区。 -适当后退,给学生独立负责的机会。Apache孵化器指南表格版https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/Sat, 20 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/作者:狄晓晓 -项目孵化成为ASF顶级项目的步骤 详见Apache Incubator cookbook -步骤 内容 详情 1 与孵化器沟通 孵化器PMC管理孵化器,帮助项目孵化。 2 寻找领路人(champion)和孵化导师,讨论并准备孵化提案 项目要进入孵化器,需要一个领路人(Apache officer或member)和至少2-3个导师(IPMC member)(孵化过程涉及的各角色及其职责请参见Roles and Responsibilities)。 3 创建孵化提案 领路人会帮助项目准备孵化提案,该提案将用于下一步与孵化器PMC的讨论。提案可以根据模板编写,需要包含几个标准部分。 4 与孵化器PMC讨论孵化提案 提案准备好后,项目代表要将其发送至general@incubator.a.o邮件列表,孵化器PMC会对该方案进行讨论。 5 如有需要,完善提案中初始提交者和导师列表 - 6 如有需要,基于孵化器PMC的反馈完善提案 - 7 孵化器PMC对提案进行投票 讨论阶段结束后,领路人或项目代表会在general@incubator.a.o邮件列表中创建【投票】帖,投票按照ASF的投票规则进行。 8 配置该项目的基础设施(JIRA等) 如果孵化器PMC同意接受该项目,就可建立该项目的基础设施了,该过程通常由领路人或导师进行推动,如果社区成员熟悉该操作,也可由社区成员来推动。 9 导入初始代码 企业捐赠的项目,在导入初始代码前,需要提交软件授权协议(SGA)或企业贡献者许可协议(CCLA);个人捐赠的项目,在导入初始代码前,需要主要贡献者提交个人贡献者许可协议(ICLA)或SGA。导入过程中,需要检查和报告代码中受美国出口管制法管制的密码技术。除此以外,代码以及二进制发行版还需要按照Apache License合规要求,进行清理。 10 围绕该项目代码构建社区 包括投票产生新的提交者和PPMC成员(Podling Project Management Committee)。 11 发布项目,记录并完善发布过程 在孵化期间,预计将发布多个版本,这些版本将逐渐符合ASF发布政策。 完全合规的发布是项目毕业的条件之一。 孵化中的项目进行发布还必须在任何发布文件名中包含“incubating”一词,并根据孵化器发布指南包含免责声明或免责声明-WIP,以防止对项目状态产生任何混淆。由于孵化中的项目还不是“真正的”ASF项目,所以设定正确的期望值是很重要的。 孵化中的项目版本发布需要两次投票,一次是在开发者邮件列表上进行的投票,如果PPMC成员中至少有3个赞成票(+1),并且赞成票比反对票(-1)多就算通过了。第二次是在孵化器常规邮件列表上进行的投票,这次投票由孵化器PMC进行投票。 Apache发布仅包含源代码,但是项目通常也会分发一些编译过的软件包。软件源代码发布是发布重点,所有分发的编译过的软件包均基于这些发布的“正式”的源代码。 12 准备毕业,与导师一起评估项目的就绪情况 准备毕业的项目需要根据ASF提供的成熟度模型进行自我评估,这可以帮助发现在孵化过程中被忽略的事务。 13 将商标转让给ASF 将代码捐赠给ASF的企业或个人,如果持有该项目需要的商标,则需在项目毕业前,将商标转让给ASF。 14 与孵化器PMC讨论毕业 项目毕业需要PPMC先进行投票以达成共识,如果社区和导师根据自我评估认为项目已经做好准备,可以毕业,会在孵化器常规邮件列表上创建一个【讨论】帖,提议毕业并请求孵化器PMC审查该项目。 15 孵化器PMC进行毕业投票 毕业提议的【讨论】进程结束后,导师或PPMC成员会在孵化器常规邮件列表上创建一个【投票】贴,孵化器PMC对该项目进行投票,投票依据ASF投票规则进行。 16 ASF董事会决议 孵化器投票通过后,将会创建董事会决议的帖子并发送给ASF董事会,供董事会投票。董事会每月第三个周三会召开会议,会上会对此类决议进行投票,投票结果即刻生效。 17 毕业后的任务 毕业后,项目需要在孵化器状态页面上更新状态,并对其资源和流程进行一些更改。项目毕业后,将由新组建的PMC定期向董事会进行报告,最初三个月每月一次,之后是每季度一次。毕业后的项目如果发展停滞,将进入Attic,即归档退休。关于项目毕业后资源转移的步骤及Attic的详细内容,之后会一一奉上,敬请期待。Apache ServiceComb带您对话Apache大咖https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/Sat, 13 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/Apache ServiceComb带您对话Apache大咖 前言: 这是一篇两年半前的活动记录,应该最早的一批Apache项目Committer参加的Meetup,在这次会上跟大家分享了很多Apache项目孵化的相关的经验,以及开源软件商业的故事。特别值得说明的是在最近结束的ASF成员大会中,文中的有四位专家当选成为ASF董事会成员,这些经验今天看来对大家也是很有启发的。 -PMC沉睡了怎么办?首次发版项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决!有人给项目提交Patch,我们从来不说“No“!我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱&hellip;&hellip;开源微服务项目ServiceComb带您对话Apache大咖,领略Apache专家风采。 -2018年10月13日下午,开源微服务项目ServiceComb的团队邀请Apache基金会三位专家成员:Apache孵化器主席Justin Mclean,Apache董事会董事Roman Shaposhnik, 以及Apache基金会秘书长兼形象大使Craig Rossell,与国内Apache项目开发者相聚于上海。针对开发者所关心的Apache精英管理模式、从孵化器毕业成为顶级项目以及开源软件的商业化等主题进行了深入的交流。本文对活动当日的交流进行了纪实和总结。 -(现场为英文分享,本文对其进行翻译整理和校正归纳) -开场介绍 [姜宁]今天咱们聚集了国内大部分的Apache相关项目的committer,这些项目包括Beam、ServiceComb、Dubbo、Gearpump、Griffin、Kerlin、Skywalking和Weex。这些Apache项目大部分都还在孵化器中孵化,同时还有一些准备进入Apache孵化的项目。 -我在2006年9月作为Apache CXF 项目 初始 committer与Apache软件基金会结缘,2011年1月正式成为 Apache基金会成员。我作为基金会项目导师(Mentor)参与了多个来自中国的Apache孵化器项目。2017年,我作为项目负责人推动ServiceComb进入Apache 孵化器进行孵化,现在 ServiceComb已经很快就要从Apache孵化器毕业了。 -虽然参与了许多Apache开源项目,坦白地说我对Apache的项目孵化流程并未有系统化全面的理解。直到ServiceComb这个项目,我经历了寻找Mentor,捐赠协议签署,迁移项目,孵化器发版,以及毕业准备这些流程之后,才对Apache孵化器孵化流程有了更加深刻的认识。 -就在刚刚的交流中,我发现大家最关心的问题就是如何从Apache孵化器毕业。 我们今天邀请到远道而来的Apache Member,Roman,Justin,Craig,和国内Apache项目开发者一起分享他们有关Apache孵化器孵化经验,以及开源相关的感悟。 -如何从Apache软件基金会孵化器毕业成为顶级项目 [Justin] -从Apache孵化器毕业,首要为孵化项目构建一个社区,项目毕业意味着很多事情,比如要保持开发者的多样性,项目贡献者不能仅仅来自一个公司。此外,还应该尝试小版本发布(make micro releases)。 -[Roman] -发布版本时,除了项目本身,还有许多合规性工作(mechanical stuff)要做,例如开源协议,发版签名,发版投票等等。项目进入孵化器后,要尽快尝试发布第一个版本。许多孵化项目(podling)都想在发布版本时中搞定这样或那样的功能,我总是跟他们说,没关系,项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决,然后再专注于功能开发。 -[Justin] -没错,要尽早发版、多做发版。 -[姜宁] -发布版本尽管痛苦,但是要尽早去做。ServiceComb在发布第一个版本时,团队也非常痛苦,但是经历过这个阶段,后面会变得越来越顺利。 -总结:孵化器毕业要点解读 -构建社区 ASF一直坚信好的软件是由强大的社区构建出来的。诚然,代码是一个软件社区的重中之重,但Apache之道**”Community over code”**同样强调社区的重要性。它意味着我们的行事方式,如何看待彼此,如何进行决策,甚至如何编写代码。健康、互相尊重的社区非常重要,这不仅让社区的开发者有被尊重的感觉,也会带来切实的好处。一个健康、多样、包容的社区,可以促进项目不断成长,可持续发展。甚至,有助于用开源技术提供服务的公司获得商业上的成功。 保持贡献者多样性 ASF非常强调多样性原则。 大部分开源软件项目都是创新型项目,多样性保证了开源项目的持续创新, 也保证了社区的健康发展。 开源项目鼓励所有个体或公司参与, 让他们感觉能对项目有所掌控,或者会对项目产生一定影响。这样可以保证意见的多样性、用户的多样性、系统的的多样性。Apache项目通常是要求有三个以上不同公司的人参与开发,以保证项目不会因为其中某个公司的退出而终止。 ** 尽早、尽量多的进行版本发布** 对于构建持续增长的社区,有何建议? [郑士汉,Weex]:社区建设、多样性对于毕业非常重要,您能给出一些相关建议吗? -[Justin] -要让大家觉得自己是受欢迎的。当有人在邮件列表中提问时,我通常会分配PMC成员关注问题,并咨询提问者是否还需要其他帮助,或者有其他问题,我把这个作为日常工作。这样也有利于开发者从用户变成提交者甚至PMC成员。良好的文档可以让大家更容易使用你的项目。而文档的缺失则可能造成用户的流失,人们编译编译代码,就再也不使用这个项目了,因为项目上手太难了。 -[Roman] -良好的文档确实非常重要。此外,我也有其他方面的建议。Apache软件基金会参与了一些项目,吸引了不少开贡献者。我们一直指导Google代码夏令营活动,夏令营由Google赞助,帮开发者更好的发展他们自己的项目。如果你可以让自己的社区参加类似的活动,对于社区建设无疑是有很大帮助的。因为大家来自中国的社区,我也建议一些中国的大公司,例如华为,也可以举办类似的学生项目,学生是一个项目最好的新鲜血液。 -[Justin] -在会议中分享项目、建立技术博客也是不错的方式。 -[吴晟,Skywalking] -Skywalking是中国开发者发起的一个Apache孵化项目,刚加入孵化时只有15个committer,而现在,代码层面的提交者已经达到了70人。我们提倡大家提交小的改动,这样很容易提交代码来做贡献,所以我们每次发布版本都会吸引一些开发者。当我们没有太多精力投入到测试时,我们会吸引开发者来提供测试,他们可以提交集成测试结果,可以提交测试模型,只要保持正确的编程风格,PMC的成员就可以进行审查,并合并代码。 -[Justin] -这里我想多提一点,很多项目过于注重质量。有些Apache项目收到一些代码不太完美的提交,就直接丢弃了这些提交,然后自己从头搞起。其实这并没有关系,如果你收到了不太完美的PR,可以请社区成员帮忙改进质量。另外,在JIRA或Github上浏览issue时,如果发现一些比较简单的issue,你可以加个”easy to fix”标签,告诉大家这个issue比较容易解决,这样也可以吸引人来贡献。Apache 软件基金会品牌使用指南https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/Wed, 03 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/Apache 软件基金会品牌使用指南 翻译: 王堉琛 -原文出处:http://www.apache.org/foundation/marks/ -Apache® 品牌被 200 多个 Apache 软件基金会(ASF)项目社区共享,它也是我们使命——为公众利益提供软件——的重要组成部分。本品牌使用指南为引用 Apache® 软件项目和产品提供了示例。 -重要提示: 如果您请求在域名、活动或服务中使用 Apache 品牌,则必须遵循本指南。 -术语: 项目( Projects) 是 ASF 中开发并管理软件的组织委员会(PMC)。产品( Products) 是提供给公众的软件代码和下载。在大多数情况下,Apache 项目的名称与 Apache 软件的名称相同,且遵循 “Apache Projectname” 命名格式。 -另请参阅:品牌资源网站地图。 -关于 Apache 品牌 Apache 品牌和我们的 羽毛 logo 代表我们构建软件的 Apache Way 过程。Apache Way 的一些元素包括有一个协作的、共识驱动的志愿者社区,这些志愿者共同治理该项目。这也意味着要有一个厂商中立(vendor-neutral)且独立的治理方式,这种治理方式欢迎所有有益的贡献,而不考虑贡献者的雇主是谁。Apache 品牌的项目托管在 ASF,并且必须被 独立管理。 -作为一个非盈利的公共慈善机构,ASF 的董事会和成员是真正的 独立管理机构,监督许多 Apache 项目社区的运作。有了这一层的监督,可以确保 Apache 项目以符合整个用户社区最佳利益的方式运作,并且可以通过提供一个可以让不同的供应商一同协作的,中立的合作空间来充当创新加速器。 -为了确保 Apache 志愿者社区因提供 Apache 软件而获得应有的荣誉,并维持 ASF 和 Apache 项目独立治理的形象,您应该使用一些特定的方法来引用 Apache 项目和产品。 -如何引用 Apache 项目和产品 Apache 项目总是以 “Apache Hadoop” 的形式命名。虽然我们在这里以 Hadoop® 项目为例,但这些准则适用于所有 Apache 项目。确保始终引用 “Apache Hadoop” 可以确保所有 Apache 项目都与主导它们的非盈利组织共享关系。Apache 下游项目的品牌使用原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/Apache Apache 下游项目的品牌使用原则 翻译: 王福政 -原文地址: http://www.apache.org/foundation/marks/downstream.html -初稿 ~ 初稿 ~ 初稿 本下游发行品牌政策定义了希望以原始 Apache® 产品名称分发 Apache® 软件产品的下游软件发行商的要求。希望使用其他名称的发行商应遵循我们正式商标政策。 -下游发行品牌政策 Apache 软件产品由一些为其平台提供软件包的下游实体分发。例如,Docker 镜像、Linux 发行商和云平台供应商。 -Apache 软件基金会认识到这些下游发行商的重要性,并乐于看到他们在遵循这一政策的前提下,以 Apache 的原始名称发布 Apache 产品。 -命名 该名称必须与 Apache 软件基金会使用的名称相同。所有 Apache 软件产品的全称都具有 &ldquo;Apache ProjectName&rdquo; 的形式。请注意,&ldquo;Apache&rdquo;、&quot;ProjectName&rdquo; 和 &ldquo;Apache ProjectName&rdquo; 是 Apache 软件基金会的商标。 -源代码 软件所基于的源代码必须与 Apache 软件基金会的源代码版本相同,或者以下所有条件都必须符合: -所有源代码更改必须至少满足以下列出的可接受更改标准之一。 必须使用一个版本号,该版本号既要明确区别于 Apache 软件基金会发布的版本,又要明确标识软件所基于的 Apache 软件基金会版本。 文档必须明确标识软件所基于的 Apache 软件基金会版本。 最终用户希望发行渠道能够移植修复。并非所有的修复程序都必须进行反向移植。选择要反向移植的修复程序必须符合该分发渠道的更新政策。 可接受的变更必须至少满足以下标准之一: -该变更已被相关的 Apache 项目社区接受,并被纳入未来的版本中。请注意,接受变更的过程以及接受变更的方式因项目而异。 更改是针对未公开的安全问题的修复程序;该修复程序未公开披露为安全修复程序;Apache 项目已 收到有关该问题和建议的修复程序的通知;PMC 既未拒绝漏洞报告也未拒绝建议的修复程序。 变更是对 bug 的修复;并且 Apache 项目已经被通知了 bug 和建议的修复;并且 PMC 既没有拒绝 bug 报告也没有拒绝建议的修复。 为与目标平台整合而做的小改动(例如,对启动和关闭脚本、配置文件、文件布局等的改动),Apache 项目不反对这些改动。 其他依赖关系 在发行版中包含的任何额外的依赖关系必须按照第三方许可政策的条款进行许可,允许 Apache 项目将该依赖关系包含在 Apache 发行版中。Apache 商标使用管理原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/Apache 商标使用管理原则 翻译: 聂帅 原文出处:http://www.apache.org/foundation/marks/ -本文档概述了允许使用 Apache® 商标的其他方的政策。 -Apache 软件基金会(ASF)拥有所有与 Apache 相关的商标,服务标志,代表我们 Apache 社区的标志,所有 Apache 项目的名称都是 Apache 的商标。 -以下信息有助于确保其他方以经许可的方式使用我们的商标和徽记,确保我们能够合法的保护我们的项目品牌,并且鼓励第三方以所批准的方式使用 Apache 软件和我们的品牌。如果您对此政策或者 Apache 商标有任何疑问,可以联系我们,并请阅读我们的商标资源列表。 -基本原则 Apache® 商标,服务标记和图形标记是质量以及与 ASF 项目相关联的社区支持的象征。为确保 Apache 商标的使用不会导致我们软件的混乱,我们必须控制这些商标和其他组织的软件以及相关服务的联合使用。另外,作为一家美国公司,我们有法律责任和法律权力来指定使用我们商标的政策。 -Apache 软件基金会和我们的许多软件产品必须与其他任何和 ASF 竞争的软件以及任何与 ASF 无关的企业和个人的软件与服务区分开来。 -不得使用 Apache 商标贬损 Apache 软件基金会、我们的项目、会员、赞助者以及社区。也不得使用 Apache 商标以任何方式暗示对任何与 ASF 相关的项目或任意类型的倡议的所有权,支持和赞助。作为一个中立性组织,我们品牌的重要组成部分是Apache 的项目是独立管理的。 -关键商标原则的描述 本部分并不是为了总结商标的复杂法律,而是为了帮助读者了解一些关键的商标原则。更多信息,请参见我们的商标资源列表。 -商标是什么? -商标是用于区分一方与另一方商品来源的一个单词、短语、符号、设计或是单词、短语、符号、设计所组成的整体。服务标志与商标相同,只不过服务标志是用于区分服务的来源的。在整个文档中术语“商标”( trademark )和“标记”( mark )均指商标和服务商标。 -这些规则可以归纳为,使用商标“ Apache ProjectName ”来描述与 ASF 相关的软件,或者当使用商标来描述我们特定的 Apache ProjectName 软件产品时,使用商标“ ProjectName ”来描述。与大多数 ASF 软件一样,“ ProjectName ”的软件是由“ Apache ProjectName ”项目或者另一个“ ProjectName ”的项目(例如“ Apache Incubator ”(本身就是 ASF 的商标))进行维护的。Apache 项目网站商标原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/Mon, 01 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/Apache 项目网站商标原则 翻译: 王皓月 -原文地址: http://www.apache.org/foundation/marks/pmcs -本文定义了商标原则,定义了 Apache®projects 网站显示的元素,以及如何正确地对待 Apache 和其他组织的商标。PMC 商标责任还解释了 PMC 成员应该以何种方式管理项目商标。 -项目网站和 URL 原则:使用 * .APACHE.ORG Apache 项目必须在 apache.org 域上托管官方网站,包括由项目 PMC 监督的内容(包括顶级网站,下载和 Wiki),并确保 ASF 基础架构团队可以维护服务,同时告知用户该内容是官方的并且来自 ASF 和项目 PMC,而不是来自第三方。 任何 ProjectName 的主页都必须由 http[s]://ProjectName.apache.org 提供服务,以确保商标一致,且允许自动生成链接(例如 https://projects.apache.org)。项目的所有主链接都必须直接指向主页,而不是其他站点或域。 项目可以自由地使用基础架构支持的技术来管理和部署网站,并且可以自由使用设计中的外观。未来,我们可能会要求项目添加特定的样式或者图形元素(从多种变体中选择),以使其返回链接 www.apache.org,这将有助于用户更好地了解 Apache 项目之间的联系。 拥有悠久的开源开发历史和庞大的用户群新社区进入 Apache 孵化器前,应该阅读使用 non-apache.org 域的限制。 项目命名和描述原则 存在新项目名称的选择准则,但尚未进行审查并合并到此原则文档中。 -任何项目或产品名称的主要商标必须采用“Apache Projectname ”的形式,这样可以确保在用户心中,项目或产品与 ASF 相关联,并确保第三方不能轻易滥用项目名称。项目或产品的每个页面中第一个最重要的引用,以及页面标题中的引用,都必须使用其名称的“Apache Projectname ”形式。其他引用可以根据主题使用“ Apache Projectname ”或“ Projectname ”。 该产品的每个产品主页和任何概述下载页面都必须包含对该产品的突出引用,称为“ Apache Foo 软件”,并且必须包含对该软件产品本身的用途和功能的简短描述。例如: Apache Xerces XML 解析库软件提供了 XML 1.Apache孵化器指南https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/Sun, 28 Feb 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/Apache孵化器指南 翻译:狄晓晓 -Apache孵化器是项目捐赠到ASF的入口。目前国内越来越多的开源项目通过Apache孵化器进入Apache软件基金会孵化。 -本文翻译至 https://incubator.apache.org/cookbook/,为大家介绍了项目进入Apache孵化器需要做的准备,以及孵化过程中做的工作。 -该指南与孵化器主页为大家提供了在ASF孵化项目所需的必要信息。该指南汇集了所有孵化器的相关问题,给出了孵化器目标和过程的概述,并提供了更多详细信息的链接。 -该指南内容按照项目从被接收孵化到毕业成为顶级项目(Top-Level Project,TLP)的时间顺序进行组织。 -欢迎大家通过general@incubator.a.o邮件列表或INCUBATOR-234任务单对该指南提出反馈意见,也可以向该指南所在的项目仓库提交补丁。 -一、我们的项目适合Apache孵化器吗? 正如ASF在2018年的愿景声明中所讲的那样,ASF为公共利益提供软件。 -ASF的项目会遵循Apache之道进行运转,Apache之道是一套指导原则和最佳实践。 -ASF非常重视“社区重于代码”(Community Over Code)这一理念,ASF严格独立于公司和组织,并强调在工作各方面保持开放。 -捐赠项目到ASF,意味着您将放弃对该项目以及项目商标(如果有)的控制。非常欢迎您参与该项目,但是除了成为PMC(Project Management Committee,项目管理委员会)成员之外,您没有其他特殊的地位。好消息是,由于ASF的独立性和对项目可持续性的重视,您的项目可以自己成长,并可能具有更广泛的影响力。 -假设您的项目符合这种观念模式,我们不会根据项目功能来判断项目的接收情况,这是由ASF特意不设置技术策略所决定的。如果您的项目与ASF已有项目非常相似,我们可能会要求你考虑加入该项目。尽管如此,我们仍然有一些项目具有相似的目标,但这并不一定是一个问题。 -为了给“podlings”(incubating projects,孵化项目)带来最大的成功机会,我们通常要求他们进入孵化器,并至少有一个围绕现有代码库构建的社区的开端。 -二、成为ASF顶级项目的步骤是什么? 孵化的目标是成为ASF的顶级项目。您可以通过How the ASF works页面,了解孵化以及不同角色(提交者committers、PMC成员等)的内涵。 -为此,孵化项目(incoming project,podling)需要执行以下步骤: -寻找领路人(champion)和孵化导师(mentor),讨论并准备孵化提案; 决定在ASF孵化; 与孵化器PMC讨论提案; 如果需要,完善提案中的初始提交者和导师列表; 如果需要,基于孵化器PMC的反馈,完善提案; 孵化器PMC对提案进行投票; 配置项目的基础设施; 围绕项目代码开始构建社区; 邀请新的提交者和PPMC成员; 发布项目并记录,完善代码和发布过程; 当准备毕业时,与导师一起评估项目的就绪情况; 准备将现有商标转让给ASF(如果情况符合); 与孵化器PMC讨论毕业; 孵化器PMC开始毕业投票,这会使ASF董事会决议建立TLP。 以上描述的是乐观的情况,概述了典型的孵化流程,项目真正孵化的顺序可能会与该流程略有不同。以下是该流程的详细内容: -三、与孵化器沟通 孵化器PMC负责管理孵化器,帮助孵化项目完成孵化过程。 -可以通过公开链接:general@incubator.a.o访问邮件列表,与孵化器PMC进行沟通。 -四、寻找接口人和导师 为了进入孵化器,您的项目需要一名接口人和至少2-3名导师。这些人需要是孵化器PMC中的成员,ASF成员只需提出即可加入孵化器PMC。 -接口人负责在创建提案过程中帮助孵化项目,他们在前面的步骤中(至少直到项目提案被接收)充当孵化项目与孵化器PMC之间的联络员,之后可能会继续担任导师。 -导师则会在项目成长为顶级项目的道路上全程陪伴。 -起点通常是寻找接口人,您可以在general@incubator.a.o邮件列表中提交项目的简短介绍,附上相关链接,并说明您正在寻找接口人,努力引起大家的兴趣。如果您认识任何ASF成员或孵化导师,可以直接询问他们是否愿意提供帮助。 -五、创建孵化提案 接口人会帮助项目准备孵化提案,提案会对新项目进行描述,以便后续与孵化器PMC进行初步讨论。 提案需要包含若干标准段落,详情请参考podling proposal template. -ASF项目的孵化提案都保存在Incubator wiki页面上,可以将它们作为示例进行参考,上一自然段中的链接给出的是方案的最新模板。 -六、讨论孵化提案 提案准备好后,项目代表需将其发送至general@incubator.a.o进行讨论,主题行应如下,以引起孵化器PMC的注意。 -[DISCUSS] Foo Proposal -该讨论通常会要求提案进行一些改动。 -该讨论阶段没有规定讨论时长,通常会持续几天,直到所有关注问题都被妥善讨论并形成解决方案。 -以下是最近的讨论,请参考: -Nuttx proposal (in progress) StreamPipes proposal (accepted) Sparkr proposal (withdrawn) TubeMQ proposal (accpeted) MetaObjects proposal (on hold) 七、孵化提案投票 讨论阶段一结束,接口人或项目代表就会在general@incubator.ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/音频编辑: 周禹任 -文案: 周禹任 -内容梗概 在开源社区中,除了代码贡献之外,非代码贡献同样也有着十分重要的作用。两者相辅相成,才能一起构建起更加蓬勃的社区。本期节目中,ALC Beijing 邀请到了两位在校的大学生嘉宾,她们都是以非代码贡献者身份分别加入到 CHAOSS 和 Apache 的社区当中。她们在融入社区的同时,也丰富了自身的经历并获得了成长。 -那么在本期节目中,就让我们一起来聊一聊大学生究竟该如何参与到开源社区中,以及她们在开源社区中都能得到哪些收获。通过与他们的对谈,我们也可以对开源社区中的非代码贡献的方式及其对社区的意义有一个更深的了解。 -时间线 时间区间 精彩话语提炼 03:16~~07:57 CHAOSS 社区是什么 09:02~~11:15 夏小雅是如何以非代码贡献者身份参与到 CHAOSS 社区当中,以及她在 CHAOSS 社区中做的贡献 13:22~~16:34 周禹任是如何以非代码贡献者身份参与到 Apache 社区当中,以及他在 Apache 社区中做的贡献 16:37~~20:03 两位嘉宾作为非代码背景的开源新人,在开源社区中得到的收获和成长 20:58~~22:16 大学生为何难以加入到开源社区中 24:25~~28:15 姜宁老师对于大学生参加开源的看法 29:23~~35:16 开源社区中各种非代码贡献的方式和途径 请收听 ALC Beijing Podcast Episode #9: 开源社区中的非代码贡献 -本期嘉宾 夏小雅: 华东师范大学在读研究生, X-lab 实验室成员,CHAOSS 社区成员ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/音频编辑: 余梓寒 -文案: 姜宁,余梓寒 -内容梗概 作为一个前端开发人员,你在制作各种报表的时候,一定离不开一个非常棒的project,那就是Apache ECharts。Apache ECharts 用 JavaScript 编写,基于支持 Canvas 和 SVG 的 ZRender 渲染引擎,提供了一系列动态的、高度可定制的图表类型,包括线图、柱图、散点图、饼图、雷达图、K 线图、仪表图、漏斗图、热力图等。最新发布的Apache ECharts 5 通过在动画叙事、优化的可视化设计、交互体验、性能提升、开发体验、国际化、可访问性等方面的 15 项新功能和改进,让开发者更容易讲述数据背后的故事。 -最近 Apache ECharts 从Apache软件基金会孵化器毕业成为顶级项目, ALC Beijing 非常有幸邀请到了Apache ECharts PMC成员,请他们来给大家去分享在从孵化器项目到Apache顶级项目背后的故事。看看他们是怎样吸引全世界的开发者,如何维护社区的日常运营,以及在构建社区过程中遇到了什么的问题,这些问题又是如何解决的。 -时间线 时间区间 精彩话语提炼 02:27~~03:32 Apache ECharts项目进入Apache的孵化器的初衷 03:33~~09:43 如何吸引国内外开发者,如何激励贡献者 09:45~~13:41 如何降低开发者参与的门槛,Apache ECharts有妙招 16:21~~17:59 Aapche ECharts PMC是如何进行项目维护的 18:59~~21:26 姜老师点评Apache Way和发展新用户的关系 21:55~~28:16 Apache项目邮件列表相关问题 27:28~~30:40 Github issue 讨论的问题 32:51~~34:20 Apache Mentor 对邮件列表的建议 34:45~~36:55 Apache发版的问题 39:27~~44:08 用户量多了的烦恼&ndash;如何面对用户反馈的问题 45:44~~48:13 Apache ECharts 5.从初识社区到融入社区https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/Tue, 05 Jan 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/推荐语:夏小雅是华东师范大学数据学院的在读研究生,也是X-lab成员之一。我认识小雅还是在去年年初的时候,我和她聊了一下她选的ServiceComb的实践项目,当时能感觉得到她参与开源的经验还很少;后续在CHOASS 项目例会中发现她逐渐活跃起来,逐步在社区中找到自己的位置了;在刚刚结束的 CHOASS Shanghai Meetup,小雅忙前忙后俨然成为一个在 CHOASS 社区很相当活跃的活动组织者。 -&ndash; ALC Beijing 发起人 姜宁 -CHAOSS CHAOSS(Community Health Analytics Open Source Software)是Linux基金会下专注于开源社区度量标准与软件开发的开源项目。从风险、演化、多样性、价值等角度持续制定与发布指标。 -今年参与CHAOSS项目的经历毫无疑问是我的2020最浓墨重彩的一笔,最初只是在每周的开放会议中旁观,偶尔提出一些小的讨论,到六月份开始申请Season of Docs,成为一名技术文档撰写的实习生,到12月开始筹划CHAOSS在中国的第一次Meetup,最终以12月27日Meetup的圆满成功作为落幕。 -从OS Revolution掀起开源革命到现在,“开源”两个字所代表的绝不仅仅是代码开放。依托项目构筑起的社区是一种基于技术的新型数字化组织架构,如何定义一个好的开源社区?依据什么进行开源治理?到现在也很难有体系将这件事完整的讲清楚,这也是CHAOSS这个项目的价值所在,即便我们也很难说CHAOSS的指标体系是合理的、完善的,但是一个为开源度量而存在项目,本身就具有着无穷价值。 -我最感兴趣的是其中“多样性与包容性(D&amp;I)”这个小组的内容,一个致力于定义社区健康度的社区本身应该是相对健康的,一个讨论开源社区D&amp;I指标的小组本身是多样和包容的,这也的确是CHAOSS给我的实际感受。D&amp;I小组用耐心与包容度鼓励着我这个社区新人,并让我意识到任何形式的贡献都是有意义的。 -Google Season of Docs 也是在一次D&amp;I组会上,我得知了Season of Docs这个项目,并产生了申请试试的想法。申请期间我的选题同时有另外两位竞争者,一位来自印度一位来自非洲,我能清晰感受到他们显然是比我更加熟练的英文使用者,因此在这个过程中也感受到了巨大压力。在回答Micro Task和编写proposal时,我格外注意语法和文档的结构性;那段时间几乎每次D&amp;I组会和项目的小会我都会参加,或许也是因此赢得了选拔。 -我的两位导师都非常年轻,实习过程几乎是交朋友的过程,十分快乐。虽然有时候会因为口语交流和时差问题感到压力,但是每次线上见面,听到对方的“How you doing today?”,听到对方对于每周我并不认为自己做的十分好的工作不吝赞美,还是感到十分温馨。 -CHAOSS Shanghai Meetup 12月份,我的Season of Docs之旅正式结束,我向社区提出在中国举办一次local meetup,得到的反馈与支持是我完全没有意料到的,社区给予了能够给的所有支持,提供过往经验、材料和日程建议。很多人表达了无法现场参加的遗憾,并希望通过录制video或线上接入来Backup。 -这把火瞬间烧的旺盛,我也备受鼓舞。得益于X-lab、华为、微软Reactor的老师们的支撑,从建立官网注册链接、制作海报、收集来自社区的video和材料,在邮件列表上协调与沟通,我从备受鼓励的角色变成了鼓励与赞扬他人的角色,这种角色转换的过程奇妙而充满了成就感,仿佛是传承,又像是传染 - - 好的社区氛围也是具有传染性的,好的氛围往往会有奇妙的化学反应。 -这是我第一次办一场Meetup,过程中避免不了手忙脚乱,最大的考验是它的琐碎性与细节性,以及在这个过程中如何协调与沟通。现在回想那段时间,几乎很难完全沉下心来,因为常常会被Meetup的琐碎细节打断,我的一个总结是,负责一场活动是避免不了与零碎事情打交道的,但是可以给自己设一段时间来集中处理,而不是被各种状况牵着走。另外一个心得是,社区中的志愿者是需要激励机制的,在给大家分发任务前,将回馈机制亮出来(礼品、餐食等)会更有说服力。 -社区通关攻略 新人对于一个社区是格外珍贵的,这点我深有体会,在我最初在邮件列表、在会议中开始发声,我收到的回应和鼓励格外多,我的一些小建议会被记录在会议文档里,标注上我的名字。所以千万别觉得你作为一个新来者,就是这个社区的“场外观众”。 -多去提问,最基础的问题有时候最有意义,它会给项目维护者带来不同的视角。我最初参与项目时,对于其中“Event”指的是什么就产生了错误理解,但是这也让大家意识到需要对项目的术语在文档中做好定义。 -刷脸熟非常重要,不要总徘徊在场外,也不需要抱着做了一定的贡献才能融入进去的想法。哪怕还没想好做什么,在邮件列表或者GitHub上做一个自我介绍,表达想要贡献的心情。在社区中,你总能得到帮助的。 -不要因为你的英语不够纯正,或者有语法错误就不开口。有时候只需要几个单词对方就可以听懂,而get到双方的意思才是交流的核心。在沟通的过程中你大概率会受到鼓励,从而越来越应付自如。 -参与开源社区不需要你一定是个技术大牛,社区中的非代码贡献种类繁多,并且意义同等重要。CHAOSS项目有一个指标定义出了开源社区中可能有的贡献类型: -作为新手区的我们,除代码外可以做的贡献类型也十分丰富,这些贡献类型也是多交叉学科的。例如翻译和本地化、文档撰写、设计工作、社交媒体的运营管理、用户支持和答疑、法律咨询、社区沟通和管理、组织活动或在活动上作为一个speaker。像我从写项目文档到组织CHAOSS上海Meetup,就是典型的非代码贡献。ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/内容梗概 在校大学生作为开源贡献者参与到顶级开源项目中,这对很多同学来说是一件很遥远而又陌生的事情。“不知道如何参与开源项目”、“不知道如何玩转社区”、“不知道如何和社区成员交流沟通”等问题,将跃跃欲试的同学们拦在开源项目的大门之外。 -2020年暑假,中科院软件所发起来了一个非常好的学生暑期实习计划&ndash;“点亮计划暑期2020”。这个计划鼓励研究人员、开源爱好者、在校师生参与开源软件的开发与维护,促进开源软件在国内的发展和优秀开源软件社区建设,增加开源项目在国内的活跃度,在开源领域与世界接轨。 这次“点亮计划暑期2020”通过开源社区导师出题,在校学生根据导师出的题目题目进行方案设计并提向导师提起项目申请,导师在选定实习学生之后,学生会在导师的指导下进行为期三个月时间远程实习,实际参与的开源软件项目的开发与维护。 -今年的“点亮计划暑期2020”涌现出来了很多优秀的学生和导师,值得一提的是有三名学生成为Apache项目的Committer,并获得了“点亮计划暑期2020”优秀学生&ndash;最有潜力奖。 这次 ALC Beijing 特别邀请到了这三位新晋成为 Apache Committer 的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程,介绍一下大家是如何进行项目申请以及如何与导师沟通协作的。 -收听本次播客,你还将会收获:开源项目中如何给我的科研带来了灵感;参与开源我接触了很多学校中学习不到的新知识;开源社区提升了我的自信心,拓宽了我的视野…… -时间线 时间区间 精彩话语提炼 00:10 ~~ 04:30 点亮计划暑期2020背景介绍。 04:35 ~~ 08:39 嘉宾个人介绍。 08:50 ~~ 12:18 吴舒旸同学介绍自己申请暑期2020计划的经历。 12:51 ~~ 15:34 作为导师大家是如何看待暑期2020计划。 15:51 ~~ 19:30 姜宁分享了他在GSoC当导师和在暑期2020计划当导师的不同体验。 19:45 ~~ 24:00 导师如何对学生的提案进行筛选的(导师特别喜欢主动性强的学生)。 25:01 ~~ 32:00 张可同学,江华禧,吴舒旸分享他的选题和项目申请经验。 35:01 ~~ 42:05 陈军旭,吴舒旸分享了导师和学生是如何进行沟通。 42:20 ~~ 47:36 柯振旭分享了如何拉近与学生之间距离的小贴士。 47:40 ~~ 52:36 张可,江华禧同学结合他的任务分享了他和导师交流的心得。 52:53 ~~ 56:51 柯振旭分享了如何平衡日常工作与辅导学生时间,以及当“学生鼓励师”的经验。 57:30 ~~ 67:55 成为Committer之后,大家对开源社区,对导师又有什么新的认识? 请收听 ALC Beijing Podcast Episode #7:“点亮计划暑期2020” 优秀学生导师经验分享ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 03:16 本次嘉宾的自我介绍 03:20~~ 05:36 创立IoTDB的原因 05:50~~ 09:00 为什么IoTDB会开源 09:12~~ 15:00 高校做开源与高校考核体制冲突的问题, 如何在论文和软件系统之间找到平衡点。 15:11 只有真的做出来一个被市场认可的东西,它才是一个能有长久生命力的东西,而不是一篇引用很高的论文。 15:20~~ 24:36 黄向东读博士期间很难拿奖学金到乔嘉林申请国家奖学金的故事 25:20~~ 28:36 在清华博士开题毕业的相关要求 30:53~~ 45:36 高校如何更好的去开展开源项目 46:53~~ 54:55 如何让老师和同学们公开的交流起来 请收听 ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事 (上) )ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 02:16 信息分享的同时要有很多的检索机制来查找 03:00~~ 05:11 高校是开源事业发展的沃土 05:12~~ 10:00 IoTDB 进入Apache软件基金会孵化的故事, 10:12~~ 15:00 为什么IoTDB选择Apache软件基金会 15:10 ~~ 20:30 Apache IoTDB孵化前后Community的变化,德国老外也到微信群里聊天 21:07~~ 23:00 Apache IoTDB是如何保持Open的 23:13~~ 35:36 Apache IoTDB在孵化过程中遇到的转折点,如何处理人员流动的问题? 30:53~~ 39:36 开源是一个长跑,如何坚持下来? 39:53~~ 43:55 王伟老师访谈总结 请收听 ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事(下)暑期 2020 活动学生(张可)心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/Sun, 20 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/引言 如果能结合自己的科研学习述求参与到实际的开源项目中,既能为自己的后续的科研工作助力,又能在开源社区结识到一群志同道合的小伙伴,并且还能得到项目导师的指导,同时还能有一定的经济收益。 -暑期2020涌现出来了很多优秀的学生和导师, 这次 ALC Beijing 特别邀请张可给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期 2020 的导师同学的访谈播客,敬请关注。 -今年暑假期间我参加了开源软件供应链点亮计划—暑期 2020 的活动,在这个活动中,我主要参加了 Apache SkyWalking 的 Python Agent 的开发,最终项目顺利结项并获得了”最具潜力奖“,今天我想分享一下我参与这个活动以及开源社区的感受与收获。 -缘起 其实我在参加暑期 2020 活动之前就听说过 SkyWalking 了。我研究生的主要研究方向是微服务和云原生,组里的学长们之前就在使用 SkyWalking 进行一些研究工作,也是通过他们,我了解到了 OpenTracing, SkyWalking 等与微服务相关的 Tracing 工具以及 APM 等,当时我就在想如果有机会可以深度参加这些开源项目就好了。 巧的是,也正是在差不多的时候,本科的一个学长发给了我暑期 2020 活动的链接,我在其中惊喜的发现了 SkyWalking 项目。 -虽然说想要参与 SkyWalking 的开发,但是真的有了机会我却有一些不自信——这可是 Star 上万的 Apache 顶级项目。万幸的是在暑期 2020 活动中,每一个社区都提供了很多题目以供选择,想参与的同学可以提前对要做的事情有所了解,并可以提前做一些准备。我当时也仔细地浏览了项目列表,最终决定申请为 Python Agent 支持 Flask 或 Django 埋点的功能。当时主要考虑的是,我对 Python 语言比较熟悉,同时也有使用 Flask 等 web 框架进行开发的经验,我认为应该可以完成项目要求。为了能让心里更有底一些,我阅读了 Python Agent 的源码,写下了对项目需要做的工作的理解,并向项目的导师柯振旭发送了自荐邮件,最终被选中去完成这个项目。 -过程 被选中后我很激动,也把这份激动化作了参与开源的动力。我在进一步阅读源码,搭建本地环境后,用了三周左右的时间完成了 Django 项目的埋点插件的开发,毕竟我选择的项目是一个低难度的项目,而我在 Python web 方面也有一些经验。在这之后,我的导师和我进行了沟通,在我表达了想要继续做贡献的意愿之后,他给我建议了一些可以进一步进行贡献的方向,我也就继续参与 Python Agent 的开发。接下来,我陆续完成了 PyMongo 埋点插件, 插件版本检查机制, 支持使用 kafka 协议进行数据上报等功能。在提交了暑期 2020 活动的结项申请书后,我又继续参与了在端到端测试中增加对百分位数的验证等功能。暑期2020活动心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/Sat, 19 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/引言 暑期2020涌现出来了很多优秀的学生和导师, 这次ALC Beijing 特别邀请江华禧给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期2020的导师同学的访谈播客,敬请关注。 -背景 我是一个热爱编程、热爱技术的人,⼀直以来都向往着能参与到开源项⽬中锻炼⾃⼰,但当我面对庞大而复杂的项目代码时,却感到手足无措,不知该从何开始。⽽此次的“开源软件供应链点亮计划-暑期2020”活动则正好提供了这样⼀个机会:清晰的任务要求、开源社区成员作为导师提供指导以及一笔丰厚的奖金,让我顺利地踏上了开源这条道路。 -回顾 在“暑期2020”活动的这两个多月里,我为 SkyWalking 的命令行工具实现了一个 dashboard,此外在阅读项目源码的过程中,还发现并修复了几个 bug。到活动结束时,我共提交了 11 个 PR,贡献了两千多行改动,对 SkyWalking CLI 项目的贡献数量排名第二,还获得了“最具潜力奖”。 -我觉得之所以能够如此顺利地完成这个项⽬主要有两个原因。一方面,我选择的 SkyWalking CLI 项⽬当时最新的版本号为 0.3.0,还处于起步阶段,代码量相对较少,⽽且项⽬结构非常清晰,文档也较为详细,这对于我理解整个项⽬⾮常有帮助,从⽽能够更快地上⼿。另一方面,我的项目导师非常认真负责,每次我遇到问题,导师都会及时地为我解答,然后我提交的 PR 也能够很快地被 review。⽽且导师不时会给予我肯定的评论与⿎励,这极⼤地提⾼了我的成就感,让我更加积极地投⼊到下⼀阶段的⼯作,形成⼀个正向的循环。 -收获 回顾整个参与过程,觉得自己收获颇多: -首先,我学习到了很多可能在学校里接触不到的新技术,了解了开源项目是如何进行协作,开源社区是如何运转治理的,以及开源文化、Apache Way 等知识,仿佛进入了一个崭新而精彩的世界。 -其次,我的编程能力得到了锻炼。因为开源项目对于代码的质量有较高的要求,因此我会在编程时有意识地遵守相关的规范,培养良好的编码习惯。然后在导师的 code review 中也学习到了一些编程技巧。 -此外,参与开源为我的科研带来了不少灵感。因为我的研究方向是智能软件工程,旨在将人工智能技术应用在软件工程的各个环节中,这需要我在实践中发现实际问题。而开源则提供了这样一个窗口,让我足不出户即可参与到软件项目的设计、开发、测试和发布等环节。 -最后也是本次活动最大的一个收获,我的贡献得到了社区的认可,被提名成为了 SkyWalking 社区的第一位学生 committer。 -建议 最后,对于将来想要参加此类活动的同学,附上我的一些建议: -第一,选择活跃、知名的社区。社区对你的影响将是极其深远的,好的社区意味着成熟的协作流程、良好的氛围、严谨的代码规范,以及有更大几率遇到优秀的导师,这些对于你今后在开源方面的发展都是非常有帮助的。 -第二,以兴趣为导向来选择项目,同时要敢于走出舒适区。我最初在选择项目时,初步确定了两个,一个是低难度的 Python 项目,另一个是中等难度的 Go 项目。当时我很纠结:因为我对 Python 语言比较熟悉,选择一个低难度的项目是比较稳妥的,但是项目的代码我看的并不是很懂,具体要怎么做我完全没有头绪;而 Go 项目是一个命令行工具,我对这个比较感兴趣,且有一个大致的思路,但是我对go语言并不是很熟悉,实践经验为零。最后凭借清晰具体的 proposal 我成功申请到了 Go 项目并顺利地完成了,还在实践中快速掌握了一门新的编程语言。 -这次的“暑期2020”活动虽已圆满结束,但我的开源之路才刚刚开始。ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/目的 在诺大一个中国,开源的相关运转机理、成功方法等还是一片荒芜,ALC Beijing 不仅要怯魅,还得防止复魅。在接下来的2021年,我们特别每月推出一次在线的指导和交流,内容涵盖进入Apache的方方面面,包括但不限于: -进入apache 软件基金会的开源项目有何附加值? 开源或闭源项目如何加入Apache软件基金会孵化? 成为Apache Member 是一种什么体验? 如何让我的patch 被Apache 项目接受? 如何选择一个Apache开源项目进行贡献? &hellip;&hellip; 准备条件 一台安装有Zoom软件的接入互联网的终端设备,以及安静的角落。 -即将播出,在线交流 主题 主讲及简介 日期/时间 报名链接地址 备注 进入Apache的开源项目有何益处? 姜宁,ALC Beijing 发起人,Apache 软件基金会成员 在Apache如何孵化一款开源软件项目? 吴晟,Apache SkyWalking VP,Apache 软件基金会成员 2021.1.17周日,北京时间21:00~21:40 https://calendly.com/opensourceway/apache-mentor 已经结束,观看录像亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/作者:赵禹光 -简介: 2020年11月14日Apache SkyWalking 2020 DevCon由贝壳找房和tetrate赞助,Apache SkyWalking、云原生、Apache APISIX、Apache Pulsar 和 ALC Beijing 五大社区合作,在贝壳找房一年级会议室盛大举行,本次活动主要面对Apache SkyWalking的使用者、开发者和潜在用户。线上线下共有230多人报名。经统计,实际参加活动人数超过130人,近60%的人愿意抽出自己的休息时间,来交流学习Apache SkyWalking和开源文化。不难看见,在可预见的未来,中国的开源项目很快将进入下一个维度,那必定是更广的社区人员参与,更高技术知识体现,更强的线上稳定性和及时修复能力。 -活动线下盛况: SkyWalking&rsquo;s 2019-2020 and beyond 吴晟老师本次分享:回顾2020SkyWalking发布的重要的新特性,出版的《Apache SkyWalking实战》图书,社区的进展,开源爱好者如何参与SkyWalking建设,和已知社区在主导的SkyWalking2021年孵化中的新特性。 贝壳全链路跟踪实践 赵禹光老师(作者)本次分享:回顾了贝壳找房2018年至今,贝壳找房的全链路跟踪项目与SkyWalking的渊源,分享了SkyWalking在实践中遇到的问题,和解决方案。以及SkyWalking近10%的Committer都曾经或正在贝壳人店平台签中研发部工作过的趣事。 SkyWalking在百度爱番番部门实践 刘嘉鹏老师本次分享:回顾了百度爱番番部门在使用SkyWalking的发展历程&amp;现状,CRM SAAS产品在近1年使用SkyWalking实践经验,以及如何参与SkyWalking的贡献,并成为的Apache Committer。 非计算机背景的同学如何贡献开源 适兕是国内很有名的开源布道师,本次分享从生产、分发、消费的软件供应的角度,根据涉及到的角色,然后再反观现代大学教育体系的专业,进一步对一个开源项目和community需要的专业背景多样性进行一个阐述和探究。并以ALC Beijing为例进行一个事例性的说明,非计算机背景的同学如何贡献开源。 如何从 Apache SkyWalking 社区学习 Apache Way 温铭老师本次分享了Apache APISIX如何从9个月,就快速完成了孵化,成为了Apache顶级项目,以及Apache APISIX与Apache SkyWalking两个项目的故事。并从中阐述了“社区大于代码”和“最快的成长就是对其标杆”的道理,其他Apache孵化中,或是准备加入Apache的项目非常有借鉴意义。 Apache SkyWalking 在小米公司的应用 宋振东老师是小米信息技术部分布式链路追踪系统研发负责人,分别以小米公司,业务开发、架构师、SRE、Leader和QA等多个视角,回顾了SkyWalking在小米公司的应用实践。从APM的产品选型到实际落地,对其他公司准备使用SkyWalking落地,非常有借鉴意义。 Istio全生命周期监控 高洪涛老师本次分享了SkyWalking和可观测云原生等非常前沿的知识布道,其中有,云原生在Logging、Metrics和Tracing的相关知识,Istio,K8S等方面的实践。对一些公司在前沿技术的落地,非常有借鉴意义。 针对HikariCP数据库连接池的监控 张鑫老师本次分享了,以一个SkyWalking无法Tracing的实际线上故障的故事出发,讲述如何定位,和补充SkyWalking插件的不足,并将最后的实践贡献到社区。对大家参与开源很有帮助。 SkyWalking 与 Nginx 的优化实践 王院生老师本次分享SkyWalking社区和APISIX社区合作,在Nginx插件的实践过程,对社区之间的如何开展合作,非常有借鉴意义,院生老师的工作&amp;开源态度,很好的诠释Geek精神,也是我们互联网从业者需要学习恪守的。 讲师PPT下载 Apache SkyWalking 2020 DevCon 讲师 PPT -SkyWalking 后续发展计划 正如吴晟老师所说:No plan, open to the community,Apache SkyWalking是没有RoadMap。社区的后续发展,依赖于每个人在社区的贡献。与其期待,不如大胆设想,将自己的设计按照Apache Way贡献到SkyWalking,你就是下一个Apache SkyWalking Commiter,加入Member of SkyWalking大家庭,让社区因为你,而更加有活力。ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/内容梗概 开源越来越重要,而且在不断的吞噬着企业的软件技术栈,有的研究机构甚至得出的结论是超过95%都是开源,越来越多的软件开发者把开源的优秀实践带到企业内部。Tim OrReilly在2000年的时候发明了内源 (InnerSource)这个词,用来解释这一现象。 根据维基百科的定义,内源就是使用了开源软件开发的最佳实践,在组织内部建立起了一种类似开源的文化氛围。组织内部使用了开放的方式开发专有软件。 -为了让帮助大家进一步了解与内源相关的信息,ALC Beijing 播客邀请到有着多年开源以及内源经验的专家谭中意和我们聊一下内源这个话题。 -时间线 时间区间 精彩话语提炼 00:00:10 - 00:03:00 本次嘉宾的自我介绍 00:03:26 - 00:06:53 内源是什么?InnerSource Commons背后的故事。 00:06:53 - 00:09:05 内源兴起的原因 00:12:12 - 00:23:12 内源带来的好处有哪些? 00:23:12 - 00:26:45 企业中哪些项目适合内源? 00:26:45 - 00:31:33 员工参与企业内源项目能收获到什么? 00:31:33 - 00:38:57 内源地盘之争的解法? 00:38:57 - 00:46:47 大家真的是没有时间参与内源项目吗? 00:46:47 - 00:50:19 异步式沟通对程序员提高效率的重要性 00:50:19 - 00:57:20 内源和开源有什么区别? 00:57:20 - 01:03:00 Apache Way 能直接照搬到内源中吗? 请收听 ALC Beijing Podcast Episode #5:内源 InnerSource我与开源的那些事儿https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/Thu, 29 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/我与开源的那些事儿。 很幸运!!!是的,很幸运,除了幸运,我不知道该怎么形容我和 开源 的缘分。感觉就好像在冥冥之中,肯定会走上这条道路一样。 -缘起 2020注定是特别的一年,年初,谁也没想到,一场疫情把我们牢牢的困在家里,哪也去不了。。说实话,或多或少有点抱怨吧。但伴随而来的,是一场灾难。那个时候每天一早醒来,看见手机屏幕刷新的数据,冰冷的可怕,红线一直在升。。。当时就在想,为什么我不是学医的,待在家里什么都做不了,似乎捐钱变成了最可悲的方式。 -偶然一次,在知乎上看见关于开发者抗疫的活动——“Wuhan2020”。学计算机专业的我,本身就对技术方面的文章也比较感兴趣,就随手点了进去。( 其实当时内心所想的是,可能有是一个营销号在做文章 )。在大致了解了Wuhan2020整个项目之后,便开始搜集更多的与之相关的信息。最后偶然在一个公众号中,看见了“黑客松活动”。就水群,进去了,,哈哈哈哈。但当时还是个技术小白,啥都不懂,可以理解成比会写“hello world“强那么一点点。在那之后,也找到了Wuhan2020的官方公众号。那时,想着尽自己的一份力,但是无论是对于开源文化上还是技术上都感到了很大的局限性,说俗点,大概就是心有余而力不足吧。随后大约在四月份( 精确点是4月4号,因为那一天整个世界都是灰色的 ),看见了Wuhan2020公众号招人,我想了想自己对于做图剪视频之类的,还算是比较擅长的,就去试试水。进入了设计组。这也算是我第一次真正接触到开源吧。 -幸运 说实话,除了幸运我不知道该怎么来形容这段经历。当时在设计组群里,几乎什么都没做,就发了一份作品+自我介绍,然后有一位华师大的学姐,就加我为好友,说是带我一起和一位大佬做Apache相关的推广。哈??Apache是什么??当时的我是一脸问号。。。。然后就抱着试一试的心态跟着去了。。。( 现在想想当时真的是有趣,如果我说我什么都不了解,甚至拒绝的话还会有现在的我么。。而且群里那么多人咋就单单选中了我呢,哈哈哈哈)然后和Apache的姜宁老师简单聊了一下,说到hugo啥的。我心里想hugo??雨果还搞开源??随后查了一下,是一款搭建静态博客的框架,这也是我正式使用github的起点吧,更新博客。学了点东西总要找点事情做的,要不然时间一长,不就那也记不住了,哈哈哈。 -慢慢的跟着学姐运营ALC-Beijing和Wuhan2020的公众号,也一起了解到更多有关开源的文化。习惯也由之前的天天逛CSDN、知乎变成Github、掘金之类的。成功搭建博客,给我学习新的知识也树立了信心。似乎一切都好了起来,那个时候武汉已经宣布解封。 -当时接触开源之前,总感觉自己怀才不遇,明明会的不少,懂得知识也挺多的,为什么就还只是一个普普通通的大学生呢??还是做不到出圈,每天混学分,做着毫无疑义的事情。但当皓月姐姐加我好友的那一刻开始,就感觉那份属于我的运气该来了,还撞的特别准。 -随后也加入了开源社,慢慢认识了更多的小伙伴,一群人不认识也不了解,分布在各个地方,做着一件共同的事情,可能这就是我当时所理解的开源吧。 -受阻 当时想着为一些顶级的开源项目做贡献,就开始学会主动去吸取知识,那种学习给我的感觉是由心而发的,主动的。如果问我那时为什么想参与开源,大概是开源本身就具有向善的属性,也认为那是一种体现自己价值的方式。 -当五月份学校宣布返校的时候,回头学校之后,就开始感觉自己有出圈的能力了,也有出圈的想法,可能是技术层面,学校没有需要学习的,也可能是真正意识到现在的自己可以做一些更有意义的事情了。就逐渐向周围的同学唠叨着自己接触开源的事情,很多人的情况和我一样,一开始都是一脸懵圈,但遗憾的是懵圈之后,就什么都没了。这就好比一个主动跳入坑里的人,很难再拉下一个人主动入坑。其实准确点来说,都感觉开源离自身太远。从学生角度来思考,学好文化课,在课余时间参加活动、比赛之类的,赚学分,才是本职工作。至于开源,第一是不了解(不直接和自己的利益挂钩),第二是技术层面达不到。可以发现github上面的顶级项目几乎大多数都不适合学生来做,而且更多的是面向求职者或者说是已经工作了的,这样一来,即使有一腔热血,但是也被挡在门外。(回头想想自己,能想到把blog部署到github上,这样一来,几乎就和github捆绑在一起了,也就是这样能有更多的机会接触更多的项目。)带着这样的问题,我就在思考如何才能让身边的人参与开源,其实参与开源也不一定是技术层面,是不是?? -是的,参与开源的方式有很多,并非一定是要通过技术层面。想想当时的Wuhan2020项目,并非所有的人都是程序员,但是每个人都可以凭借着自己的一腔热血贡献出属于自己的那一份力,这是开源的力量。再想到之前在ALC-Beijing学习到的理念:community大于代码。加上之前给APISIX项目提交修改文档的pr,自己提交的第一份pr被合并的喜悦感是无可替代的。于是结合自己周围的环境以及所经历的事情,就一边学习一边探索。还好不算太差,前不久在学校的实验室里遇见了一位小伙伴,也成功拉入坑。用他的话说:“以后我是要开货车的,然后再搞搞开源多舒服啊!” 这样一想,是啊,国内真正能为开源项目提交代码的人确实有限,但是每个人都能了解到开源文化,开源协作是未来每个人都会接触到的,只不过这次疫情的爆发,把这个远程办公的缺口给暴露出来,而开源协作的方式不是刚好可以封上它吗??就像姜宁老师所说的:“让更多的人了解,参与开源 ,应该是我们布道的目的吧!” -COSCon‘20 期盼已久的开源年会终于来了,尤其是今年年会的主题——“开源向善“ 。这可能也是我接触到开源的初衷。当时去之前,就在脑子里构想了很多有关开源的问题,在自身深入了解开源之后,总感觉没有自己想的那么简单,说大点可以是一种哲学,甚至是一种信仰。这是开源带给我最直观的感受。 -年会现场,也可谓是大型的网友见面会,虽然每个人都不一样,学着不同的专业、不同的城市、不同的年龄段,但是却都可以在彼此身上找到各自的影子,有时候有些事确实挺奇妙的。在第二天,无论是和庄表伟老师的聊天学习,还是和王伟老师的沟通交流,都刷新了我对于开源的认识,就好像是打破之前的定义,更深入的思考,对,这次是思考,不再是了解。如果说皓月姐姐是我接触开源的引路人,这大概就是遇见了自己的伯乐。 -可能是因为王伟老师就是做开源教育的,和他交流能够更深入探讨或者说思考自己在布道开源时所遇见的问题,记得我当时提到作为大学生,但是不能被学生的身份所限制,应该想到“出圈”,只有在一定程度上做到出圈,才能够从更高的维度来审视自身所处的状态和环境,这样才能更好的找到适合自己的路,从而才能走的更远。而王伟老师所说的作为学生不能被“分”给限制住,更多应该是培养自身的能力。这些思想上擦出的火花,都不约而同的交叉在一起了。由此可想,我们在布道开源的时候,是不是也应该要有跳出圈内人的思维,这样才能更好地推广下去。还记得,当时和王老师提到,从学生角度来说,参与开源的门槛是不是有点高,那么我们反过来想,如果我们做一个贴合学生的项目,尽量做到人人都可以参与的项目,这样一来,不就是可以让想参与开源的同学参加进来了嘛??带着这样的思考,我在年会上又找到另外的一位小伙伴,愿意一起来尝试。通过这次年会,给我最大的感受,这不仅仅是一次技术上的交流,更是一场思想碰撞的盛宴,也可以说在这里的我们都是同一类人!!! -我想把这次参会体验比喻成读一本好书,这里的每个人都是书中的一份子,可能过了一段时间已经记不清书中的内容,但是对于精神上的沉淀是无法抹去的,是由内而外的提升。天下没有不散的宴席,虽然很不舍,但是离别是必然的,愿下次再遇见,那个时候的自己更优秀。ASF如何准备董事会会议https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/Wed, 21 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/ASF旗下有三百多个项目,董事会只有9个成员,每个项目一个季度就会向董事会发送一次报告,而每个月召开一次董事会会议。 ASF每次董事会,需要处理70+个项目的报告,以及其他与基金会相关的事务。 ASF是如何保证在一个半小时的董事会中能够高效的处理这些报告的? -简单的说ASF为了提高效率,提前让各个项目PMC准备报告,并且开发了一套专门的IT系统whimsy来处理和追踪与董事会议相关的内容。 -本文翻译至 https://www.apache.org/foundation/board/meeting -董事会使用各种工具,并依靠Apache项目的志愿者来确保每月的会议顺利进行。这是一份关于每个月度董事会会议的经典时间表和流程的详细指南。 -我们的“PMC汇报指南”列出了一个项目的季度董事会上进行汇报的内容以及如何提交报告。请注意,执行干事和非项目公司干事(如副总裁、Infra;副总裁、法律等)每月向总裁或董事会提交报告。 -董事会会议采用电话会议(辅以IRC)的形式,通常持续1个半小时左右。会议按照提前公示出来的议程举行,由主席或相关主席团成员主持讨论。董事会会议欢迎每一位Apache的成员和PMC主席随时参加。 -谁应该做什么 董事会负责监督包括所有Apache项目在内的整个ASF的运作。我们通过让负责公司运营的人员提交月度报告,以及每个Apache项目提交关于各自社区和技术状态的季度报告来进行督察。 -运营人员每月向总裁提供一份关于其业务领域(如品牌、媒体、法律、基础设施等)的报告,然后由总裁向董事会提交关于ASF日常运营的汇总报告。 一些董事会成员和其他公司副总裁直接向董事会提供月度报告。 每个Apache项目的PMC成员协作提供项目的季度报告。PMC主席同时也是ASF的副总裁,负责确保报告真正提交到董事会议程。 在董事会会议期间,主席主持会议,秘书作记录并点名,要求出席或投票。董事会可对各种报告发表意见或提出问题;正式问题由秘书在会议结束后通过私人电子邮件向相关官员或PMC提出。 秘书还负责发布经批准的董事会会议记录(通常是下个月)。 常务董事会会议时间表 前一个月的会议中 在每月例会后不久,秘书将会议记录草稿提交董事会,供董事会审查和批准。然后,主席将会议期间采纳的正式行动的“ASF董事会会议摘要”概述发送给所有Apache项目提交人。秘书长对报告发表评论,并欢迎新的运营人员——详情见下文“休会”章节。 -前一个月的会议后 在上个月的会议之后几天,下一个月(当前)会议的议程将被整理好并放入代码库。董事会议程和会议记录都保存在格式化文本文件中。这允许高级用户通过命令行进行编辑,但也允许使用“Whimsy Agenda Tool”议程工具(需要Apache账号登录)更方便地查看议程。 -然后向所有PMC发出下次会议报告的截止日期的提醒。考虑到Apache PMC的分布在全球且和完全自愿参与的性质,提前提醒(和后续跟进)是很有帮助的。项目通常提前三周到几小时(如果董事们没有时间审查,报告可能不会被接受)之间的任何地方通过邮件列表和检查 Whimsy)向董事会提交报告。 -Apache孵化器有一个特殊的提醒过程。因为孵化器中的每个被孵化的项目(Podling)都会提供自己的季度报告,所以他们会得到自己的提醒。孵化器PMC随后审查并汇总相关的Podling季度报告,允许Podling导师签字或添加其他评论,然后每月向董事会提交一份总体报告。 -会议前的一周 每个月,董事会被随机指派为当月报告的一组PMC报告的牧羊人(负责审查报告),他将特别关注PMC的报告内容,检查并确保它们按时出现在议程中,并帮助将董事会的任何意见反馈给PMC。这有助于大家分工协作,以确保所有70多个项目的报告都被提交,并有一个总监确保反馈在之后得到处理。 -许多PMC报告都在会议前一周列入议程,因此一些总监将开始审查议程和预先批准报告,或对报告提出意见/问题。如果一位总监对一份具体的报告有顾虑,他们会在会议议程中“标记”该报告,以便在会议期间进行讨论。这时,总监通常会再次检查PMC是否确实提交了完整的报告。如果项目报告提交的晚了,会直接给PMC发电子邮件提醒。 -董事会希望不晚于会议前48小时敲定议程,尽管有时我们确实有迟交报告的情况。在会议召开前2-3天,大多数董事会审查整个议程,预先批准或在议程中对所有提交的报告发表评论。 PMC主席可以通过议程工具对任何主管的问题提供任何简短的答案或附加信息来加快会议进程。 -由于所有活动(报告提交、批准、评论)都是通过使用SVN存储库来完成的,所以Apache成员和PMC主席可以在提交消息中查看会议准备进度。 -董事会当天 会议当天,主席按顺序把议程安排了一遍。在点名之后,执行官通常会口头回顾他们报告的要点。 -然后,我们使用预批准系统来加快每月审查70多份PMC报告的过程。任何PMC报告,如果大多数董事预先批准,且没有董事标记该报告的问题,则将获得普遍同意。这使得会议能够花时间讨论那些在会议之前没有经过董事的全面审查或有重要问题或任何董事已经标记的报告。负责人主导关于他们特别标记的报告的讨论,帮助主席专注于整个会议。 -然后,我们逐步讨论议程的其余部分,就特别指示和决议进行表决,然后有时就新问题举行讨论会,或审查先前报告中提出的更深层次的问题。 -休会/董事会结束后 会议休会后不久,我们将通知社区: -主席将会议要点的简要概述发送给我们的提交者。 -这份概述会记录任何未被接受的PMC报告,以及已批准的任何特殊指示的状态(通常是负责人任命或新项目),这些指示立即生效。 -秘书直接将总监对每个PMC报告的意见和评论通过私人邮箱发送给相应的PMC,并抄送董事会。这确保PMC在委员会有任何问题时得到直接和立即的反馈。在大多数情况下,这些都是关于项目的简单问题,因此董事会希望PMC可以直接回复确认或回复反馈邮件至board@邮件列表。 -如果存在需要跟进的严重问题,董事会将指派一名总监直接与PMC合作,以确保PMC理解这些问题,并且PMC开始采取行动解决问题(无论是总监还是其他自愿的牧羊人)。董事会希望在下个月的会议上或在PMC下一次正常的季度报告中听取这些行动的结果。 -董事会工具 随着Apache Whimsy 项目的创建,我们现在有了许多帮助创建和管理议程的工具,以及用于提交、评论和批准报告的工作流功能,以及对当前议程和过去几分钟前的议程有方便的分类视图。 -虽然大多数Whimsy的特性仅限于Apache提交者(而且大部分功能还限于Apache 会员、官员,甚至特别官员),但过去董事会会议纪要分类列表是公开的。这使得任何人都可以方便地按日期、PMC或重大特别决议回顾所有过去的董事会会议。请注意,这只是为了方便起见,此数据的官方/规范版本包含在我们所有过去董事会会议正式纪要中。 -如何发布一个项目或官员报告 参见PMC主席的详细董事会报告指南。 -如何参加会议 欢迎Apache成员和PMC主席参加。请将您自己列入议程,告知董事会您将出席: -导航到whimsy(需要Apache登录) -点击 Roll Call(点名)按钮增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/引言 最近的一次数据统计: -序号 项目名称 进入孵化器时间 毕业时间 ppmc/pmc人数 commiter人数(包含ppmc/pmc) 1 Kylin 2014年11月 2015年11月 23 39 2 Eagle 2015年10月 2016年12月 16 18 3 HAWQ 2015年9月 2018年8月 45 68 4 CarbonData 2016年6月 2017年4月 13 25 5 RocketMQ 2016年11月 2017年9月 13 26 6 Griffin 2016年12月 2018年11月 18 20 7 Weex 2016年11月 14 26 8 ServiceComb 2017年11月 2018年10月 20 23 9 SkyWalking 2017年12月 2019年4月 27 37 10 Dubbo 2018年2月 2019年5月 17 55 11 ECharts 2018年1月 13 19 12 Doris 2018年7月 13 17 13 brpc 2018年11月 9 9 14 IoTDB 2018年11月 2020.文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/引言 开源发展至今,来自community 的力量是无法忽视的,甚至有的观点认为,开源的核心就是开源community。我们在上篇: -增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇) 介绍 在Apache孵化项目的过程,需要做什么,以及如何避免走弯路,并给出了完美的实践。Apache SkyWalking的 VP 吴晟先生在 ApacheCon 2020 的Keynote分享上,明确的指出了摆在本土面前重要的障碍之一就是:共同体建设,如何吸引来自全球的开发者,不仅在语言上,更多在文化上有非常大的挑战。 -在COSCon‘2020 + Apache 中国路演的论坛上,我们看看有哪些关于开源共同体方面的建设的分享: -Apache Way 正确把握Apache 之道,从来不是一件容易的事,因为它从来也不是事无巨细的规则,而是一种哲学思想、一种向导指南,除了日常的融入已有的Apache项目进行感受之外,还要听听哪些前辈们对此如何解读: -Apache recently celebrated our 20-year anniversary as a software foundation. Our mission is to provide software for the public good, available at 100% no charge.#The Foundation now oversees over 300 projects with over 7,900 committers from more than 100 countries, and more than half a million contributors over the years, with nearly 40,000 this year alone.追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/引言 没有什么好说的,从分布式系统到调度器,再到可观察性,以及数据可视化,当然还有消息队列,大数据处理、IoT。 -让更多的人知道项目,才可能从这些人中转化为用户,用户中可能筛选出贡献者,进而形成良性循环,这大概是所有开源项目的期望。 -以下技术内容,因为缺少对比,仅仅在此给大家罗列出来目前在本土所分享的关于技术议题,没有逻辑、没有分类、没有主线,唯一的相似之处就是这些项目是捐赠给了Apache软件基金会,以Apache之道的方式在运作,技术水平如何,解决了用户什么问题,请详细阅读。或者来COSCon的现场聆听。 -项目在生产环境中的落地 本次分享首先会介绍DolphinScheduler社区的发展情况,然后会介绍我们当时为何要重复造轮子再造大数据任务调度,DolphinScheduler整体的设计思想、考量以及DolphinScheduler的特性和能力,接下来会介绍DolphinScheduler架构的变迁过程。#在此次分享中我也会讲述我们在做大数据任务调度时遇到的挑战和积累下来的经验,也会分享一些用户案例和使用场景,最后会分享一下开源的历程 -此次分享主要介绍Apache Skywalking 在小米信息技术部的应用,包括并且不限于Apache Skywalking 在小米新零售、商城、门店等10多个业务的应用以及整体部署架构(中国大陆、俄罗斯、新加坡等机房部署)、在小米如何处理每日新增数亿trace segment以及相关优化配置、Apache Skywalking 告警模块如何跟小米内部告警平台打通等二次开发内容、小米对Apache Skywalking 开源社区的一点贡献。 -作为Apache顶级项目的ShardingSphere,将会在最新发布版本中迈向从分布式数据库中间件生态圈到分布式数据库的转型。#已在GitHub上收获12k+ Star的开源人气项目将进一步根据用户需求和应用场景,在这个数据库化的过程中全力打造更为简单、丰富、一体化、可插拔的分布式数据库产品体系,从而为用户提供最简单易用、功能强大、性能稳定的分布式数据库化产品。本次分享将为详细阐述数据库化的产品特性、架构体系、极简落地方案实践等核心内容。 -自从2017年成为国内首个中间件Apache开源顶级项目以来,Apache RocketMQ 以高性能、低延迟和高可靠的消息发布与订阅服务成为各厂商业务消息的首选。进入云原生时代,Apache RocketMQ也在悄然成为云原生时代的通信基础设施。本次演讲将结合Apache RocketMQ开源历程,介绍在云原生时代 RocketMQ核心竞争力、最新的技术进展、开源社区生态以及未来展望。 -Apache Kylin 4.0 Alpha版本日前已经发布,它是Apache Kylin 4的第一个早期预览版本,是继Kylin 3之后的一个重大架构升级版本,采用Parquet这种真正的列式存储来代替HBase存储,提升文件扫描性能;同时重新实现了基于Spark的构建引擎和查询引擎,使得计算和存储分离变为可能,更加适应云原生的技术趋势。本次演讲嘉宾张智超将从架构升级,原理讲解,重大特性等几个方面来介绍Apache Kylin 4.0。 -Apache Doris(Incubating)是一款支持对海量数据进行快速分析的 MPP 数据库。Doris 自设计之初,就秉承着极简运维、高效可靠、易学易用的原则,为用户提供全面而高效的海量数据分析能力。自 2018 年底进入 Apache 孵化器后,Doris 已经发布了 5 个大版本,接收了来自社区 100 多位开发者的贡献,并在多家互联网头部企业和垂直领域企业落地和应用。本次演讲主要包含 Doris 的发展历程、系统架构、主要特性和应用案例四个部分,帮助听众对 Doris 有一个全面而具象的认识。最后,陈明雨会介绍 Doris 社区目前的发展情况,希望能够帮助开发者更方便快捷的加入开源社区。 -定制化Operator模式在面向Kubernetes的云化平台建构中变得越来越流行。Apache SkyWalking社区已经开始尝试使用Operator模式去构建基于Kubernetes平台的PaaS云组件。本次分享给将会给听众带来该项目的初衷,实现与未来演进等相关内容。分享的内容包含:#1. 项目动机与设计理念#2. 核心功能展示,包含SkyWalking核心组件的发布,更新与维护。#3. 观测ServiceMesh,包含于Istio的自动集成。#4. 目前的工作进展和对未来的规划。 -ElasticJob 在 2015 年首次面世,经历多年的开源历程,于 2020年5月28日 正式成为 Apache ShardingSphere 旗下子项目。#ElasticJob 是一款服务于任务分片的分布式调度中间件,在加入 Apache 软件基金会之后,它的设计理念,整体架构和功能都进一步的完善和升级,并且已经发布了第一个 Apache 版本 - 3.正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/引言 视频地址:https://www.youtube.com/watch?v=26aFGdbZvac&amp;t=1172s ,需要稳定的网络环境。 -正文 (以下内容根据吴晟的演讲视频进行的人工文字录入,若有出入,请以原视频为准。) -Rich Bowen 介绍了吴晟的出场:Apache SkyWalking VP -大家好!欢迎来到今年的ApacheCon@Home,我加入ASF也有四年的时间了,在过去的四年中我参与和见证了很多的Apache 项目,也为很多项目做了应有的贡献,今天非常荣幸的能够在ApacheCon上和大家分享我的经验,我的分享主题是:成长中的中国本土 Apache,在正式开始之前,我还是介绍一下我本人吧: -Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member. Speak at multiple conferences, including LC3 China twice, QCon Beijing (star speaker) three times.ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/内容梗概 软件以其飞速的发展,经过60年的发展,再也没有一个人能够写出来可以使用的软件了,尤其是以自由/开源软件项目的壮大为证,更是让人的协作提上了前所未有的高度。 这也就是说,作为软件的设计者,或者说开源的软件设计者,开始的时候应不应该考虑人与人之间的协作?甚至是以全球视野的想象力来介入,即跨时区的异步沟通为切入点? 那么我们不妨以Apache 软件基金会下众多的项目为例,甚至是以更广泛的开源项目为例,如Linux、Kubernetes等,探讨下关于康威定律是否适用? 架构和开源共同体(Community)究竟有没有关系?如果有的话,二者该如何理解?关系又该如何处理? -ALC Beijing 这次邀请到了Apache ShardingSphere 的核心团队成员来谈谈、聊聊。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 02:00 本次嘉宾的自我介绍 02:10 ~~ 10:50 (Apache ShardingSphere )模块化为什么重要?如何做模块化? 给项目带来了哪些变化。 11:00 ~~ 16:00 架构的演进,所带来的组织上的一些变化。 16:30 ~~ 20:40 高内聚,低耦合的实现。 21:00 ~~ 23:00 CHAOSS 项目介绍,对项目和community之间的关系量化 23:30 ~~ 27:50 (Apache ShardingSphere )community 的成员变化,以及对新版本发布后的期望 28:00 ~~ 31:00 community 的自主性如何?是否具备提交新特性的能力? 31:10 ~~ 34:00 关于项目的工程:持续集成、持续交付等 34:30 ~~ 38:00 Apache ShardingSphere community 的构成。 38:10 ~~ 41:00 一个初入community如何成长为核心成员 41:20 ~~ 44:00 技术架构的选择对于community建设是非常关键的选择 45:00 ~~ 52:00 参与community成员得到的益处~ 52:10 ~~ 54:00 引入下一期如何在Apache发版 请收听 ALC Beijing Podcast Episode #4: 康威定律在开源项目中的应用Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/Fri, 25 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/Apache 官方全球大会在线会议目前共有 170+ 场演讲议题,并有来自 DataStax, IBM, Imply, Instaclustr, NASA 喷气推进实验室, 橡树岭国家实验室, Red Hat, Tetrate, Two Sigma 与 VMWare 等公司或组织的众多大咖做主题分享。 -2020 年 9 月 21日, Apache® 软件基金会(ASF),携超过 350 个开源项目的全体志愿开发者、管理员和孵化器,与主题演讲嘉宾、大会赞助商和 ApacheCon@Home 大会组委,郑重宣布:ApacheCon@Home 在线会议将于 2020 年 9月 29 日 - 10 月 1 日召开。本次大会全员免费注册。 -Apache 软件基金会大会副总裁 Rich Bowen 表示“我们很高兴推出 ApacheCon@Home,我们聚焦于我们社区的健康福祉,所以将今年 ApacheCon 和其他 Apache 线下面对面活动转移到线上进行是个很简单的决定,改为线上活动后人人都可以在家参与。本次大会话题多样精彩纷呈,共有 10 个主题分享、24 个论坛、170+ 场演讲,也期待全球各地的观众都能观看。” -ApacheCon 是 Apache 软件基金会官方的全球系列大会,1998 年成功举办第一届。ApacheCon 吸引了 130 多个国家和地区的观众一起畅享「明日技术」,且不掺杂商业利益、公司偏见或销售推销。 -ApacheCon 集中展示众多 Apache 项目的最新进展,相关内容皆由 Apache 项目及所在社区精心呈现。各水平的参与者都能全方位、多层次地了解 Apache 项目创新与进展,比如:年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/Wed, 16 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/简介 ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯1998年,也是在这一届上,开发HTTPD服务的开发者们欢聚一堂,并决定成立 Apache 软件基金会。 -1998年首次ApacheCon大会照片 -[photo attribution (CC BY) Mark Cox. Tagged image at https://www.flickr.com/photos/iamamoose/63963722/in/album-1381277/ ; gallery at https://www.flickr.com/photos/iamamoose/albums/1381277] -ApacheCon由Apache软件基金会举办,现在是每年举办一次,一般在欧洲或北美举行,是Apache开发者们线下交流、讨论、见面的绝佳机会,也是分享想法、思想激荡的难得的场合。随着计算机技术的发展,ApacheCon每年的议题也在不断的增多,尤其是火热的大数据,干脆分离出来独立开启会议。 -ApacheCon 大会官网:https://apachecon.com/acah2020/index.html。 -2020是特殊的一年,尽管对于Apache的整体开发来说没有什么影响,但是线下交流是无法实现了,毕竟病毒仍在肆虐,只好像其它的大型会议一样,今年选择了在线上举办,线上举办的好处就是加大了更多可能性,比如支持多语言的分论坛,要知道讲中文的议题还是在ApacheCon上头一次出现。如此的机会怎能错过? -从9月29日到10月1日,会议共持续3天。官方议程已公布,可前往官网查看议题详情。同时,大会免费开放注册,可在Hopin平台报名。 -《ApacheCon @Home 2020: Keynote 》 《Apache Growth in China》 《Apache 在中国的成长》 分享时间:2020 年 9 月 29 日,星期二,下午 5:00(北京时间) -议题简介:在 Apache 基金会 2020 财年报告中,中国是 Apache 软件下载量最大的国家。越来越多的中国创建的开源项目加入 Apache 孵化器,和毕业成顶级项目。吴晟从 2017 年加入 Apache 社区,在这 3 年时间里,他见证了开源文化和 Apache Way 在中国的接受程度逐年提高。越来越多的开发者加入 Apache 社区,成为贡献者、Committer,甚至基金会正式成员。中国企业不再仅仅使用开源项目,也越来越关注对开源项目的贡献和参与。在这个 KeyNote 中,他将分享中国拥抱 Apache 文化和共建 Apache 社区的进展。ApacheCon 2020 参会指南https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/Tue, 15 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/每年一度的 Apache北美大会因为疫情的原因转到线上来举行了, 这次会议的主题是ApacheCon@Home, 也就是说借助网络我们可以足不出户就可以参加Apache大会了。 今年的会议为了针对不同的地域特点,特地安排了不同时间段的演讲,同时还专门增加了中文的演讲,欢迎大家关注。 -下面今年ApacheCon的参会指南译自 https://apachecon.com/acah2020/guide.html,祝大家参会愉快! -前期准备 为了您在ApacheCon@Home可以得到最好的体验,我们为你准备了以下清单,这样参会者就可以提前准备。 请提前浏览以下的技术要求和参会前可以准备的事项,这样就不需要在会议的过程中进行任何准备了。 -注册 请确认你已经在 ApacheConf @Home at Hopin 完成注册,如果你在右上角看到一条消息写着“You‘re in” 说明注册成功,借此机会可以点击“Add to calendar”将会议时间加入到日历。 -点击注册链接 ApacheConf @Home at Hopin -选择一个ticket,点击下方蓝色按钮checkout。(官网标注:General Admission即注册为免费,但如果你愿意帮助和支持活动可以选择Donation Ticket进行捐款) 此时页面会跳转到注册页,请填写您的名(First name),姓(Last name),邮箱地址(Email address)和设定一个密码(Password)。勾选下方的条款与隐私协议,点击蓝色按钮sign up即可。 检查是否注册成功 看到页面上有“You‘re in!”的提示则注册成功 或在右上角的个人信息中找到Events,点击进入看到如下页面,同样意味着注册成功 网络速度 请尝试接入到至少 5Mbit/s 下载速度和2Mbit/s 上传速度的网络。下载速度和上传速度越高越能够提供一个更好的体验,30Mbit/s 的下载速度和10Mbit/s 上传速度是最理想的。尝试限制其他可能占用网速的访问客户,比如:提前一天将软件更新完成,避免软件在会议中运行,暂停或停止所有大型下载项目,如果需要可以断开其他设备的网络连接。推荐用网线进行网络连接。可以用一个在线网站进行网络速度检查,搜索 Internet speed test。 -浏览器 Hopin 支持 Google Chrome (推荐) 和 Mozilla Firefox (备选),其他浏览器均不支持。请确认您的浏览器是最新版本,按照浏览器说明 Chrome 或 Firefox 进行操作。到底什么是The Apache Way?https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/Sun, 30 Aug 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/到底什么是The Apache Way? 作者:谭中意 审核:姜宁 李健盛 我们有可能听到过很多次“The Apache Way”。可能会在某个Apache基金会项目的分享会上,它宣称它的日常工作遵循“The Apache Way”;也有可能在某个InnerSource的分享会上,宣称内部开源就是在企业内部推行“The Apache Way”;也有可能在Apache基金会的报告上或者文档上,看到apache基金会的治理遵循“The Apache Way”。那么“The Apache Way”究竟是什么?我们如何来应用它? -我们先看一看Apache开源基金会对此的解释。从它的官网 https://www.apache.org/theapacheway 能看到“The Apache Way”内涵很丰富,即使是Apache基金会的成员们,对什么是“The Apache Way”有很多种解释。 -刷新这个页面,随机摘抄几种解释如下: -“THE APACHE WAY TO ME…” &ldquo;open, sharing, global team work&rdquo;** -—Jason Zhong, 10 year user of Apache Kylin, Hadoop, contributor to Apache Kylin Apache kylin的一个贡献者说它是一种开放/共享/国际团队合作的精神。 -&ldquo;Guide lines or Bible&rdquo; -—Koji, 18 year user of Apache Lucene, Solr, OpeNLP, Mahout, Spark, Commons, contributor to Apache Solr 一位18年Apache的用户说它是指南甚至是圣经。Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/内容梗概 你是如何去发现一件事情的价值的?又如何挖掘其意义的?知识该如何传播?文化该如何习得?Apache 之道作为哲学思想,甚至都找不到一条具体如何去做的规定,又怎么能指导他人了呢? -本期ALC Beijing Podcast ,三位常驻主持人,和大家聊一聊这款播客节目的基调、准则、做事方式,以及一个不那么正式的一个承诺:我们希望以这样的方式,生产高质量的知识,供有缘人学以致用!重要的是听众你的反馈和参与,才是赋予我们节目的真正活力!我们不期望是说我们想说的,而是希望能提供听众想听的。 -时间线 00:10 ~~ 01:10 本期播客的由来 -01:15 ~~ 02:40 三位主持人的自我介绍。(此处有猛料!) -02:50 ~~ 07:40 ALC Beijing 为什么要做Podcast? 和开发者、工程师等聊天能聊出啥? -08:00 ~~ 14:40 Podcast的受众是谁?谁会关注ALC Beijing 这样的关注开源隐性知识的内容? -15:00 ~~ 17:30 ALC Beijing Podcast 会呈现什么样的内容给大家了呢? 反馈就是礼物,听众的反馈至关重要。 -18:30 ~~ 24:00 和听众互动起来,才是最好的内容生产!再次呼吁大家,参与到我们的节目中来。 -24:40 ~~ 32:00 如何做才能吸引到更多的听众? 打造短视频类的及时娱乐的?还是走精心制作的深度内容? 这是个问题。 -33:00 ~~ 33:50 欢迎来“踢馆”! 我们在这里等你! -请收听 ALC Beijing Podcast Episode #0:Say Hello World! -本期嘉宾: ALC BeiJing Podcast 三位常驻主持 潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/主持人 潘娟: -江湖人尊称为“娟神”,京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Membe。才艺俱佳! -Hold 全场! -暖场嘉宾 姜宁 华为开源软件中心技术专家,前红帽软件首席软件工程师,Apache软件基金会成员,Apache软件基金孵化器导师,参与了绝大多个中国发起的Apache基金会项目的孵化。本人06年开始加入到Apache社区项目开发,就被社区开放协作的氛围深深吸引,成为开源深度信徒。现在致力于开源社区建设,以及开源文化推广,尽其所能帮助国内开源项目成功。 -主题分享嘉宾1 李钰 Apache Flink 社区 PMC 成员, Apache HBase 社区 PMC 成员, ALC-beijing 成员, 阿里巴巴高级技术专家 -李钰将为我们带来的分享是:&laquo;Flink中文社区的发展与挑战&raquo;,会从如下几个视角切入: -Apache Flink 简介 Apache Flink 中文社区从零开始面临的挑战、困难和经验 Apache Flink中文社区取得的成果和发展计划 主题分享嘉宾2 郭炜 中国软件行业协会智能应用服务分会副主任委员,全球中小企业创业联合会副会长,TGO鲲鹏会 北京分会会长,虎啸十年 杰出数字技术人物,Apache Dolphin Scheduler PPMC,ClickHouse 华人社区发起人 -分享的主题是: 会从多个视角来看待开源: -开源的初心 几个失败开源项目的案例 优秀开源项目的特性 如何申请进入Apache基金会 开源不是一时兴起,而是一辈子的事情 开源不是天才的甜点,而是勤奋者的盛宴 圆桌嘉宾 1 上面介绍过的暖场大神,ALC Beijing的发起者:姜宁ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/内容梗概 来自Apache DolphinScheduler (孵化中)项目的李岗,年轻、对开源充满激情和憧憬,这次参与到ALC Beijing来,也是灌注了满满的热爱和斗志!本次采访将为大家展现一下这位用青春赌上开源梦想之路的大男孩。 -时间线 01:00 ~~ 01:20 李岗自我介绍 -01:20 ~~ 03:10 是如何接触到开源的,然后工作后自然而然的选择开源。感到非常幸运的是参与Apache的项目。 -03:30 ~~ 04:10 从上学到工作,中间所经历的开源共同体的经历。 -04:15 ~~ 09:00 Apache 文化中的个人与公司的见解,自己在经历成长的过程中遇到了那些坑。 -09:10 ~~ 11:10 参与开源对于自己个人的改变 -11:20 ~~ 13: 20 从开源Community中如何获得“荣誉” -13:30 ~~ 16:10 Apache 带给个人的社会认可 -17:00 ~~ 21:00 是什么样的动力?或者是在没有明确的直接的报酬的情况下,是如何在周末和工作之外的时间做开源? -21:10 ~~ 25:10 Apache local Community Beijing 是如何理解的。 -25:20 ~~ 26:00 DS项目中的Peer Review是如何实现的。 -26:40 ~~ 28:00 DS为什么选择Apache 软件基金会。 -28:00 ~~ 33:00 DS 在发展过程中克服了那些困难。如何进入Apache 孵化器、许可协议、沟通模式。 -33:00 ~~ 35 :30 微信在开发中遇到的障碍。Apache基金会项目孵化过程中知识产权转移的讨论https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Apache软件基金会项目孵化过程中知识产权转移的讨论 作者:张伟玲 谭中意 审核:姜宁 张亮 作者简介: 张伟玲,多年大型互联网知识产权法律经验,擅长商标、开源、著作权等知识产权法律领域的合规制度建设、 培训和诉讼支持,在互联网信息网络传播/合规/品牌等领域有丰富实战经验。 -讨论背景: 自2002年Apache Software Foundation(ASF)开始孵化项目以来,ASF至今已经毕业了200多个顶级项目。在这些项目中,无论是个人捐赠还是企业捐赠的,都必须严格遵守其孵化流程和政策要求。尤其是近几年来,越来越多的国人发起的开源项目进入Apache基金会孵化,并有不断的项目毕业,Apache开源基金会在国内的影响力越来越大。而它作为一个国际范围内host项目最多的开源基金会,它的各种政策和流程也越来越为更多人熟悉。 -而其中最重要的一个流程&mdash;项目孵化,在知识产权方面也有很独特的政策。那么,作为项目所有者的您,在面对这些政策和可能会遇到各种文件时,是否有过困惑“我签署了什么?项目的知识产权还是我的吗?或者说我还剩些什么权利呢?…”,为了解决这些困惑,本文会对您可能遇到的问题进行初步讨论分析,当然本人是从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结,也有些认识不到位的地方,请多多讨论,有问题可跟本人微信号weiweizhang0410讨论,thanks -先说结论: 总的来说,捐献项目给Apache基金会,Apache基金会需要您的“版权授权 + 专利授权 + 商标转让”。 -知识产权即人们常说的IP(Intellectual Property),跟开源软件相关的主要有如下三项:版权(即Copyright),专利(即Patent),商标(即Trademark )。根据Apache基金会的IP政策,个人或者公司捐献项目给它,该项目的专利和版权必须授权给它,商标必须要转让给它。 -即它既要商标的所有权(owner),又要专利的使用授权,还要版权的使用授权。 -具体解释: 开源项目要进入Apache基金会进行孵化,原有版权所有人必须要签署如下两个文件,一个是SGA(Software Grant Agreement),另外一个是CCLA/ICLA(公司或者个人贡献协议ICLA: Individual Contributor License Agreement,CCLA: Corporate Contributor License Agreement)。我们一起来看看这两个文件的内容。 -先看看SGA(Software Grant Agreement),以下是协议原文信息: 下面我们来仔细看下这篇文档的重点部分。 -“WHEREAS, Licensor owns or has sufficient rights to contribute the software source code and other related intellectual property as itemized on Exhibit A (&ldquo;Software&rdquo;) under the terms of this agreement to the Foundation for use within Foundation software development projects (&ldquo;Projects&rdquo;). Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/引言 本周我们推出了 Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版),为了能够让更多的习惯于文字阅读的成员们熟悉我们的故事,特别推出了全文实录的文字版,请笑纳! -Apache APISIX 或 APISIX 在下文中均指称:Apache APISIX。 -正文 适兕主持人: -Hello,大家好,欢迎来到ALC 北京 PodCast。这次我们请到的是 APISIX 的核心成员,请各位嘉宾跟我们听众打个招呼。 -温铭: -大家好,我是温铭,Apache APISIX的PPMC成员。我之前是在互联网公司工作了有10年,主要是在做安全方向,然后最近三年都是在做开源软件的商业化,也就是说我最近三年是全职做开源项目,非常庆幸今天有机会和大家一起聊聊 Apache APISIX,以及APISIX背后的一些故事。 -王院生: -大家好,我是王院生,我算是年纪比较大的一位了,05年毕业之后做了近10年的传统金融行业,在(20)14年之后进入互联网。在那一年认识了温铭,也开始做一些非常有意思的事情,从(20)15年开始做比较多的开源方面的事情,确实在做的过程中,开源、(过程很)开心让我是比较享受的。最近两三年也在尝试做一些开源方向的创业,正好跟大家一起来聊一聊我们在创业过程中的一些收获。 -姜宁: -我叫姜宁,熟悉ALC Beijing Podcast 应该比较了解,我好像每次活动我都会在场,今天很高兴能跟同学们一起来聊聊,有关孵化以及后面创业商业化相关的一些事情。 -适兕主持人: -我们先从项目开始,目前来说, APISIX,它是什么样的状态?花简单几分钟时间介绍一下这个项目是干什么的。 -温铭: -Ok,我先来大概说一下APISIX是干什么的。简单的来说 Apache APISIX它是一个API网关,它可以帮你来处理南北向以及东西向的流量。如果不太熟悉网关的同学,就可以把APISIX简单的认为和Nginx做的是同样的事儿,只不过 Nginx是靠静态的配置文件来驱动的,你修改了任何配置的话,都是要reload服务才能生效的。 但是在APISIX里面,我们一直在强调的,它是一个动态的实时的这样的一个网关。你所有的修改包括路由、证书、以及这种限流限速以及插件的各种配置,它全都是动态的。 你可以非常容易的去修改它的内容,而不用去重载它的服务。简单来说它就可以帮你动态的管理流量。 APISIX 现在的状态, 它是在去年10月份的时候进入了Apache孵化器,到现在我们有7个多月的时间,我们发布了6个Apache release,差不多是每个月会发布1个 apache 的 release,在进入Apache之前我们只有20多个contributor,到现在我们82 个contributor, 20多个 committer, 所以我们的发展速度还是比较快的。不管是从社区的发布版本,以及我们吸收更多的贡献者,和我们对贡献者一些快速的认可,我觉得我们这方面速度都是比较快的。 -王院生: -我简单补充一点,在APISIX 之前其实也有一些API 网关,因为 API 网关实际上是一个非常成熟,并且是被大家了解了很久的一个概念的存在。是在2000年之前就在普及的一个概念,我们当时之所以要开发网关类产品并捐赠给 Apache, 是因为我们发现已有的网关并不适合云原生,结构也比较臃肿复杂、弹性伸缩支持不好,性能上也不能满足现在 IoT、5G微服务等低延迟、高并发的要求。基于以上考虑我们希望能做一个真正是社区化的,如Apache这样的组织,能够持久的做大家都需要的产品,所以我们发起了 APISIX 这个项目,我们当时发起这个项目的目标,要把它的性能、扩展性等方面做到一个极致。这是我们一开始的目标,现在来看我们距离这个目标越来越近。而且对 Apache 的文化也有了进一步的认识,尤其是多样性、多元化,是非常契合我们当时的愿景的。我们 PPMC 里面除了少数几位我们公司的,其余都是来自各个不同公司的,将近有20多家公司都在参与,这还只是committer部分,如果算上contributor的话,还有更多的人参与。Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/内容梗概 Apache APISIX 在2019年10月份进入了 Apache 软件基金会孵化器,到现在(采访期2020年六月)有7个多月的时间,就做了多达 6 次的 release 发布,也就是说差不多是每个月就会发布1个release,在进入Apache之前,APISIX 只有20多位contributor,截止到现在,已经拥有了80多位committer,在如此之短的时间内,Apache APISIX 是如何做到的?是什么样的魔力,让Apache APISIX 项目、团队、Community 有这么快的加速发展了呢? -请仔细聆听,两位创始人和一位导师的精彩分享。 -时间线 时间区间 妙语连珠 00:30 ~~ 02:23 嘉宾自我介绍 02:24 ~~ 05:45 Apache APISIX 是什么? 05:48 ~~ 10:40 过去的开源相关经验(基金会、项目、Community)等对Apache 的孵化作用。 12:10 ~~ 15:00 开源共同体的身份,是否能够让开发者在所在公司加权? 15:10 ~~ 19:20 开源Community 最佳实践:抱怨也是爱! 19:30 ~~ 24:05 中文汉字与国际化的考量 24:20 ~~ 33:30 进入Apache 软件基金会孵化的一点提示 :创始人退一步,引进更多的committer 33:39 ~~ 42:37 线下活动对于项目的帮助非常之大,和上下游合作伙伴合作效果更佳 42:50 ~~ 48:15 还是有一些用户愿意付费的,就看你能否识别出来 48:20 ~~ 52:40 关于国内建立基金会与参与Apache 软件基金会之间的差别 52:50 ~~ 57:45 APISIX 将如何看待开源的 Supply Chain?未来怎么做 57:50 ~~ 60:00 总结:开源是提升开发者自我的最佳方式 请收听 ALC Beijing Podcast Episode #3: Apache APISIX的孵化故事越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/引言 2020年过去了一半了,这半年过的猝不及防,过的胆战心惊,让所有人都明白自身的脆弱。开源亦无幸免,尽管在远程协作上,开源有着由来已久的擅长,但是疫情仍然阻止了开源人最为重要的活动—— 线下见面会。 -我们所有人,依然要坚强的抵抗这次疫情,作为开源的一份子,能做到就是继续倡导合作的重要性,即使无法见面,我们可以通过互联网来实现沟通、协作,正如开源世界一直以来都在做的这样。而且要充分的利用互联网的全球性、世界性、跨地域的特性。当然,众所周知,全球性的沟通面临更多的问题:时区、即时、语言、文化等等。 -就Apache 软件基金会而言,作为一家慈善的非营利组织,20多年来一如既往的推动着基于来自全球各地的开发者共同协作,当然有可能会在地域色彩特别的地方会遇到一些障碍,比如在中国本土遇到的异步沟通问题。即使是这样,在中国本土仍然有勇敢而坚定的先行者们,他们不仅以身作则,突破了很多障碍,而且还顺利的晋升为 Apache 软件基金会的成员,更加重要的是他们在自身已经全球化之后,要将本土的后来者也带上,但是首先要做的是本土化。 -嗯,这就是 Apache local Community Beijing 成员们,以下是他们的个人介绍和承诺! -视频 时间线 时间 出场人物 00:00 ~~ 00:10 不容错过的Apache logo 片头 00:11 ~~ 01:23 开源重度爱好者姜宁 01:24 ~~ 02:50 开源玩家吴晟 02:51 ~~ 03:37 陈亮 03:38 ~~ 05:11 至凡至简 的 孙金城 05:12 ~~ 05:52 张亮 05:53 ~~ 06:52 潘娟,娟神 06:53 ~~ 07:41 李钰 07:42 ~~ 08:40 黄向东,清华大学 08:41 ~~ 10:00 李岗 10:01 ~~ 11:24 温铭 11:25 ~~ 12:26 布道师适兕 精彩语录 在 ALC Beijing ,你可以结识到Apache的开源大牛、了解 Apache 项目的最新进展,更有机会参与到实际的开发当中,全方位的提高自身的水平与能力。Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 01:00 ~~ 06:30 本次参与嘉宾的个人自述,各有精彩! -07:00 ~~ 10:00 灵魂拷问:在座的 ShardingSphere 成员是如何凝聚(bonding)在一起的,发起人张亮不正经回答。 -10:00 ~~ 13:00 Zhyee 的结识、加入分享,强调开源协作的重要 -13:21 ~~ 17:20 董宗磊和 ShardingSphere 的缘分,由于Apache 而更加紧密 -17:30 ~~ 17:50 姜宁表达新的感悟: 开源community 更是一个知识共享的平台 -21:30 ~~ 29:30 ShardingSphere 成长的几个阶段 -30:00 ~~ 36:15 娟神:女性既是优势,也是压力! 从“自我”到“心中有Ta”的转变! -37:10 ~~ 40: 00 另一位女性开发者颜志一 既是 ShardingSphere 的成长之旅,也是开源的晋级之旅。 -卖个关子,下期讲:ShardingSphere 的开源初心是什么?是什么样的力量驱动着Ta们走到今天? -请收听 ALC Beijing Podcast Episode #2:Apache ShardingSphere开发者们的欢乐与刺激(上)Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 00:00 ~~ 02:00 张亮谈开源初心, 开源让技术更为优雅、极致,开源的组织让我们走的更远! -02:10 ~~ 08:30 金卫个人的开源历程,全职做开源梦想成真! -12:00 ~~ 14:30 ShardingSphere 从个人项目到 Apache TLP 中间发生了哪些关键的跃迁?从技术模块扩展到共同体(Community)多样性 -15:00 ~~ 18:00 模块化架构的重构来龙去脉 -18:40 ~~ 19:00 好的软件是用出来的,不是设计出来的 -19:10 ~~ 23:30 共同体的变化, 从个人主义到 Apache 之道 -24:00 ~~ 25:00 Apache 孵化器的导师绝对“奥利给” -28: 00 ~~ 29:30 姜宁在参与导师当中的经历,对Apache 的重新认知,尤其是共同体的强调! -29:40 ~~ 31:00 张亮对开发者参与开源的职业生涯影响: 中国有很多优秀的开发者! -32:30 ~~ 33:00 吴晟分享在共同体中处理冲突, 开源项目在世界这个更大的舞台【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ALC Beijing 引言 2020年,对于世界上所有的人都是一场灾难,在刚刚开完的两会,国家希望通过地摊经济来复苏中华大地的经济繁荣,当然这在日常的小商品、食物等方面还可以,那么信息经济下,过去一直都在一个屋檐下工作的人,突然变成了在线会议的方式,一定会出现一定不适应,甚至会出现效率低下。这个时候,最应该考虑的就是开源的协作模式!当然,ASF 以其独特的完全虚拟享誉全球!值得学习的地方实在是太多了。 -前序 我(Marvin Humphrey)是在2005年”抵达“ ASF (Apache 软件基金会的简称,下同) 的,起因是我对 Apache Lucene 的一个Bug有了严重的不满情绪,之所以使用“抵达”这个词汇,就像是我找到了某种归属,因为自从那时发起了第一封邮件之后,在接下来的15年里,我发送了数以万计的邮件,可想而知我在ASF花了多长时间,这几乎是我的第二个家。由于 ASF 一直以来都没有实际的“物理”办公室,所以也就免去了很多现实中的麻烦,比如是否穿戴得体、肢体语言是否合规等等,其实就那个Bug 来讲,我当时不满的原因是:Doug Cutting (Hadoop创始人 ——译者注),当时还是Lucene 项目的贡献者,认为他非常没有耐心。 -让我们回到本文的主题上了,因为Apache 这20多年来没有实际的办公室,大家均是基于互联网这个虚拟的线上共同体而工作在一起,所以新冠病毒发生以来,其实对于 Apache 的成员和贡献者们的影响是微乎其微的,尽管对于每位贡献者的个人生活上是确确实实受到了影响,但是就ASF的整体而言,并没有出现什么不适应之类的。 -但是 ASF 之外仍然有很多的人,他们未必有这样的一套机制和习惯,世界各地的人们都在为抗争疫情而努力,尤其是“社交距离”的约定,原有的公司章程等均可为此而进行修订,另外让人痛心不已的是,有些人根本都没有机会来进行改变,直接破产倒闭,人已经失业了。 -然而,决定改变的人们遭遇到了一些窘境,是将大量的工作采用了远程的方式来做,但是进展缓慢;突然而至的远程工作,人们措手不及。那么我们是不是可以如此的积极思考了呢?加快并简化向远程协作的过渡,那么可以节省不少的精力,并可以提高效率。这里可能需要加上一点创造力,面对疫情之下的“新常态”,是可以做到比原来更加高效的,而且也不需要花多久就可以适应。 -请问你是开源贡献者吗?如果是的话,那么贡献你,你已经具备了当前全球复杂经济面前的急需的远程工作的能力和知识,接下来就让我们来聊聊我们所知道的以及或许可以帮助到你的一些内容。 -互联网将人们变成了“怪物” 在互联网,人们彼此的交流大多是通过对着电脑屏幕敲打键盘完成的,这区别于我们现实中面对面的语言交流。作为社会性的人类,我们可以通过他人的面部表情、语气、肢体语言等反馈来对自己进行相应的校准,并作出适当的反应。当时,当所有的沟通和交流都通过击打键盘来完成的时候,就没有了面对面那种反馈机制,这对于人来说是及其难以适应的事情,往往会产生一些不好的效果,尤其是带有情绪的词汇。 -那么,过往一直以来都是在办公室交流的人们,突然转移到了Slack、电子邮件、以及其它以文本的方式交流的方式和渠道,有一定的不适应是较为正常的,但是通过文本来进行沟通是有难度的,需要训练自身的同理心来获得提升,个人建议去观看“Jimmy Kimmel Show” 当中的“名人阅读Tweets”节目, 可以有效提升自己对于一些词语的敏感度。 -世界是动态演变的,只要开源共同体仍然有存在的意义,那么它就必须在每一天都要和这些不便进行斗争。随着时间的流逝,“阴谋”的人身攻击由于其潜在的腐蚀作用而逐渐成为禁忌。这就成就了我们在文化上的共识:应该去评判那些想法,而不是人本身。 -随着越来越多的共同体采用“行为准则”,辩护变得越来越正式和复杂。这些明文的文档,主要目的是防止骚扰,以及其它严重的不当行为,这些文档通常包含有关共同体成员应如何彼此相待的颇为理想的建议,因为在鱼龙混杂的环境下特别容易产生一些严重的不当行为。 -无论如何,各位看官,你自身所在的组织是否采用了行为准则,自觉的提高职员们对来自网络的攻击性的警觉意识,是上佳选择。基于此之上,职员们才能有效的识别言辞,设身处地的为他人着想,从而使每个人都能够采用更具建设性的沟通方式。 -知会大家 不过话说回来了,即使是在同一个办公室内,人与人之间的协调依然是件充满挑战的事情。当然,在远程这样的形势中,协调的难度更是加大了不少,需要付出更多的精力,这个时候最需要建立的就是公开透明的“知会大家”文化,否则,团队将变得碎片化,每个人也将变得孤立。 -在ASF,这样的情形可谓是极端化了,因为 Apache 的在线共同体遍布全球各个角落。由于牵扯到的时区实在过多,一般情况下是无法召集到全部的利益相关者在一起开会的,即使是在线视频会议也难以成行,另外,还有一个因素,那就是不是所有的贡献者都是专门针对 apache 项目进行的,大多时候是业余时间进行的。 -面对面,视频聊天,电话,文本聊天等“同步”通信渠道非常适合快速启动迭代和提炼想法,但实际上却将任何不实时关注的人排除在外。即使捕获了对话(例如通过AV录制的实时会议或记录的文本聊天),它的效率也很低,并且常常使事后回顾事情的发展变得混乱。 -面对如此的情形,ASF 采用的策略就是所有有实际意义的项目都需要在 单个、异步沟通渠道中进行。 -这个频道必须要严肃对待起来,从而能够让所有的参与者都信任该频道,即使是人们没有来得及观看和参与所有的消息,但是重要的内容不会被错过。 沟通渠道必须是异步的,从而确保一些资源受限的参与者的权益。 另外,关于同步的活动是可以在此频道之外进行的,再强调一点,同步有其自身的优点,同步的沟通对于迭代想法非常的有效,但是,身处共同体的人还是希望此类的会议能够被记录摘要,并将之发布到刚才提到的沟通渠道,从而使得所有的利益相关者有机会发表各自的看法。 -在 ASF,这个严肃而正式的异步通信渠道就是邮件列表,但这不代表什么,其它也有非常好的工具:对于某些非技术性的任务,可以是 Asana ,也可以是 Wiki,甚至是一个电子表格,都是可以的。过度追求技术上是没有太多意义的,最为关键的仍然是亮点:1)正式 2)异步。 -做出决策 在办公室,决策者可以通过获得各种各样的信息:如通过不经意的偷听、一起吃工作午餐、即兴的协作等等,然而在不期而至的远程工作中,这些渠道统统不复存在,只有经过人们深思熟虑的信息,是唯一的决策依据。 -但是,一个正式的异步通信渠道在某种程度上可以对这样的情形进行一定的补偿,这样的方式有效的提高了透明度,所有的工作及其进度、成员的合作状态,都是一目了然的,即使哪怕是工作是独立完成的,也是众人皆知的。而恰恰是通过正确的使用异步沟通渠道获得信息,而不是混乱而冗长的实时的信息交换,这样就可以有一个从高处观看的视角来洞察整个全局的情况,另外,正式的沟通渠道还有一个至为重要的能力,那就是可以衡量大家达成的共识,还保持所有的记录。 -懒人共识法(Lazy consensus)是一种蛮有效率的确认方式,例如某位成员将提案发布出来,如果在某个时间范围内(ASF为72小时)没有异议,则该提案被认为是隐式同意的。通过对沟通渠道进行积极的监督,将那些有缺陷的提案标记出来,懒人共识法 是鼓励积极主动者颇为强大的工具,这也是远程参与者非常宝贵的个人品质。英雄之旅-行走在开源领域的一个自叙故事https://alc-beijing.github.io/alc-site/post/heros_journey_trista/Sun, 24 May 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/heros_journey_trista/作者介绍 潘娟,京东数科高级DBA&amp;Apache ShardingSphere PMC,主要负责京东数科分布式数据库开发、数据库运维自动化平台开发等工作。曾负责京东数科数据库自动化平台设计与开发,现专注于Apache ShardingSphere分布式数据库中间件平台的开发。主要在分布式数据库、开源、分布式架构等相关领域进行探索。多次受邀参加数据库&amp;架构领域的相关会议并进行分享交流。 -前序 《英雄之旅》是由美国神话学家约瑟夫·坎贝尔提出的。好莱坞很多经典IP巨作即是把《英雄之旅》的套路搬上了巨幕。 -最近在读一些心理学书籍,随即发现我们每个人的一生都是一场英雄之旅。从被使命召唤、踏上艰辛的考验之旅、接收他人恩赐、发现自我、到达胜利顶点、回归自我。然而,很多人可能一生都行走在发现自我的路上,若是有幸,则能到达顶点,回归自我。 -这篇分享以”英雄之旅“为开始,是希望把自上篇文章-程序媛成长纪:从DBA到研发工程师以来到现在的经历,提取出经验点,与所有行走在英雄之旅的朋友交流,碰撞火花。毕竟我们每个人面对工作、生活、家庭、自我都有着太多冲撞和思考,需要被他人理解和照亮。:-) -由点及面 上篇的自叙文谈到我从运维DBA转成了Java开发工程师。准确的说,应该是开源分布式数据库开发工程师。因为在过去一年半多的时间里,我更多地是在分布式数据库中间件平台、分布式事务框架、分布式治理等领域做相关的研发工作。主要从事的项目是Apache分布式数据库中间件平台Apache ShardingSphere, 和京东数科主导的分布式事务平台JDTX(未开源)。 之所以说”由点及面”,是因为工作的内容开始从最初新手关注的一个点,开始渗透到整个项目的各个领域。从最初做的metaData初始化加载模块到现在Apache ShardingSphere的11个一级模块中,有8个模块都是深耕接触过,此外还有公司内部的分布式事务平台JDTX。从这里可以看出一个新手开始逐渐变成了”老司机“。这让我突然想到之前很多人问过的一个问题— 类似像ShardingSphere这样的大型项目,参与的正确姿势是什么?有人选择通读文档,有人选择把模块间架构关系梳理清楚……不过在我看来,从一个点入手,由浅入深,由点及面是参与大型开源项目相对容易的方式。因为一上来就啃一本厚书,很容易厌倦和恐惧,停留在表面,最后兴趣被各种事情冲淡,最后不了了之。而从社区一个很小的任务入手,不仅可以渐渐熟悉项目、获得成就感,更能够积累社区的信赖感,树立自我品牌,最终一览众山小。而在这个过程中,你也会发现自己的知识、技能、人际关系都在崎岖的路上不断上升! -由深入广 这个小节用来讨论大家争执已久的一个问题:究竟是先进行深度学习,还是先进行广度学习。标准答案似乎是:同时进行。但是从实践的角度讲,我们的精力、学习阶段、难易程度等因素都会让这个做法变得不太容易进展、很耗时、短期内没有产出。每个人从事的工作阶段、内容都有所不同,自然看法各异。从我个人角度来看,我更倾向于先深度后广度,同时尽可能兼顾彼此。 -先深度,是为了帮助我们打下坚实的基础。试想一座空中楼阁,每次风吹雨打都会引发你的惊慌,又如何风轻云淡地向四周望去?正是由于有了扎实的地基,才让你觉得能够更容易理解别的高楼的建筑风格和特色,即在同一个交流层次能帮助我们快速了解他人的核心要点和提出自己的见解。在我刚入行的时候,我很不理解为什么要去听其他人的分享?我自己的一亩三分地还没有耕作完,日日新增的工作还不够我操心,我真的有时间再关注他人吗?当时,我的思想和视野都是狭窄的,我的更多精力是聚焦在了基石的打造,从GitHub提交记录可以看到我疯狂地学习和贡献,此时我没有多余的精力,也没有欲望去关注别人,于是我的视野也很有限。而当我不断熟悉了这个项目的架构与细节,这个领域的知识体系之后,突然发现我可以抽出一部分时间和精力去了解整个行业,而不仅仅是整个项目。而且此刻,我特别有欲望想看看别的楼阁是怎么搭建的、别人的项目是什么情况,我们和别人的异同在哪里。这增大我的视野,也意味着我开始转向对广度的寻求。 -其实最好的做法,还是在深耕的同时,关注广度,了解别人在做什么。这样可以有效帮助我们在世界的大地图里,知道自己在哪个位置、自己的水准如何。不过,建议是建议,实践是实践。最好的方式还是问问自己,想不想,要做不做。因为,我选择,我自由,我存在。 -由内向外 作为开源分布式数据库开发工程师,开源是赋予这个工作岗位的神奇力量。因为在开源的世界里,有开放、自由、平等、自我提升、品牌打造,也有竞争和资本的力量。这让我发现,我不是固步自封,我能感受到来自其他城市、不同国家的新鲜气息。在与同行朋友交流的过程中,你会发现这个行业的立体面,每个人不同的想法都非常有意思。当然,冲撞必不可少,成长的代价和痛苦也一定会非常给力地到位。迷茫和挣扎也一定会伴其左右,因为这就是一场典型的英雄之旅。但我在这个领域除了收获技能和知识,还收获了良师新友和分享的机会和能力。我并不想带来太多负面情绪给大家,我希望阅读文章的朋友能获得新的想法和力量。 -过去一年半走过了深圳、上海、北京、南京,参加过中国系统架构师大会、COSCON中国开源年会、OSCHINA中国开源峰会、PstgreSQL中国技术大会、全国互联网架构峰会、ITPUB在线分享等各种会议。在机场写代码,在会场交流,在深夜写PPT。而这一系列的锻炼也磨练出了我的耐心、清晰的逻辑能力、良好的口语表达、自我的认识。我记得最开始,我编写PPT和准备分享都要提前2~3周准备,每天都抽空看看,现在已经变成提前1周准备,随后临场发挥。最近几期的音频和视频分享可以在公众号ALC Beijing 和B站收听和收看,欢迎关注。 ^_^ 后序 篇幅所限,未能展开叙述。在文章最后,还是有些”鸡汤”想和大家分享。例如:与其病态地熬时间地做事情,不如多费心在身体锻炼和思考如何高效集中工作。作为过来人,觉得非常重要。此外,在你的英雄之旅中,找寻本我,释放压抑的情绪,活出自己。每一字一句,是我斟酌良久,给出的建议。因为在高节奏的生活和工作中,我逐渐发现自己人云亦云,被快餐手机消费,压抑自己的情绪,活着像个机器人,追寻所谓的“你好,我好,大家好”。 -而现在,愿我,与你都能拥有力量,在不伤害他人的前提下,释放自己的能量,成为我自己,勇敢而执着地踏上英雄之旅!Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/内容梗概 个人项目、Apache TLP、潇洒的创始人、众多的客户、多个云厂竞相支持、中国本土、APM骨灰级玩家&hellip;&hellip;.拥有众多光环的 SkyWalking ,究竟有何神奇的魔力?在短短的几年内迅猛发展,在竞争如此激烈的APM 市场,获得无数的拥泵! ALC Beijing Podcast 首秀,诚挚邀请到 Apache SkyWalking的创始人、主要的贡献者来聊聊 SkyWalking的酝酿、命名、开发、开源、建设Community、收获用户、发展壮大、进入Apache、孵化、成为TLP、下一代版本、如何维护的。我们就是来不正经地“八卦” Apache 开源项目背后故事! -SkyWalking社区拥有来自全球的,200位以上的贡献者包括30多位以上的 Committer。SkyWalking的项目用户和贡献者来自亚洲、欧洲、北美。那么,SkyWalking的社区到底是什么样子?推进社区发展和合作的原则和背后的逻辑是什么? ​—— 吴晟,潇洒的程序员 -本期亮点 ALC Beijing 介绍 SkyWalking 这么酷炫的名字是从何而来的?是星球大战迷?还是信手拈来? 一位”007“全职之余的贡献者,是如何在为SkyWalking贡献中获得个人娱乐和满足的 SkyWalking 获“友商”青睐,受邀在竞品项目的会议上分享 .Net 探针的相爱相亲记 SkyWalking 受到各大云厂商的支持和追捧 SkyWalking 是如何获得一位同类项目开发者的赏识,放弃原有代码,转而全力加入SkyWalking的 创始人兼VP兜底自己的Merge “摸鱼”行为 主要的维护者打算什么时候离开项目,彻底交出控制权? 下一个版本,竟然还不知道开发什么功能?(ÒωÓױ)! 请收听 ALC Beijing Podcast Episode #1: Apache SkyWalking 精彩开源故事 -出场嘉宾 潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。 -姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,有十五年以上企业级开源中间件开发经验,有丰富的 Java 开发和使用经验,函数式编程爱好者。从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,先后参与 Apache CXF, Apache Camel,Apache ServiceMix,以及Apache ServiceComb的开发。2015年开始担任Apache 孵化器导师,参与孵化了 Apache Rocket, Apache Skywalking, Apache ShardingSphere, Apache iotDB, Apache Doris, Apache APISIX, Apache Weex。ALC Beijing 志愿者招募https://alc-beijing.github.io/alc-site/post/call_for_volunteer/Tue, 21 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/call_for_volunteer/Open source is changing the world. And if you want to be a part -of that change, all you have to do is participate. Jason Hibbets《 the foundation of an open source city》 -什么是 ALC? ALC是Apache Local Community的缩写,是全世界范围的 Apache 开源爱好者本地群组。 因为是本地组织,ALC 是按照城市或地区的方式进行划分的,类似的机构还有 GDG (Google Developer Group), Facebook Developer Circles, Mozilla Reps 等。 任何 Apache 开源爱好者都可以代表自己所在的城市向 ALC 提出申请创建本地的组织。 -为什么创建 ACL-Beijing? 根据 ASF 2019 年年度报告,中国已然成为Apache软件基金会项目下载量最大的地区。 然而,这个看起来脱颖而出的数据背后,却暴露出我国这片土地上几个可能让大家颇为惊讶的现状:Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/Mon, 20 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/作者介绍 -潘娟,京东数科高级DBA,Apache ShardingSphere PMC 张亮,京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目Elastic-Job作者 -前序 从Sharding-JDBC到Apache ShardingSphere; 从轻量级的分库分表中间件到完整闭环的分布式数据库中间件平台; 从2016年1月的第一行代码到现今的300K+行代码; 从寥寥无几的关注到GitHub 10K+的star; 从无人问津的社区到100+位贡献者; 从公司内部的应用类库到100+的采用公司列表; 从寻找mentor到顺利成为Apache顶级项目。 …… ShardingSphere在经历了500多天的ASF孵化器孵化,毕业成为Apache顶级项目。ASF孵化器作为进入ASF的通道,为进入ASF的项目提供Apache Way的辅导,协调孵化项目与ASF基础实施融合,帮助孵化项目发展社区,确保孵化器项目发布的软件符合ASF的软件发布规范。本文是Apache ShardingSphere核心开发团队分享的Apache孵化历程,很值得想加入ASF大家庭的新项目参考。 -项目介绍 Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景,核心功能如1-1所示。 -1-1 ShardingSphere核心功能架构图 -Apache ShardingSphere由三个子项目组成,形成一个完整的数据库解决方案,合称 J.P.S. 生态系统。 -ShardingSphere-JDBC:定位为轻量级Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。 ShardingSphere-Proxy:定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL协议的访问客户端操作数据,对DBA更加友好。 ShardingSphere-Sidecar(TODO):定位为Kubernetes的云原生数据库代理,以Sidecar的形式代理所有对数据库的访问。 通过无中心、零侵入的方案提供与数据库交互的的啮合层,即Database Mesh,又可称数据网格。 -Apache ShardingSphere的亮点主要包括: -完整的分布式数据库解决方案:提供数据分片、分布式事务、数据弹性迁移、数据库和数据治理等核心能力。 独立的SQL解析引擎:支持多SQL方言的完全独立化SQL解析引擎,能够脱离ShardingSphere独立使用。 可插拔微内核:所有的SQL方言、数据库协议和功能都能够通过SPI的可插拔方式加载或卸载,微内核甚至在未来可以运行于无任何功能的空白环境中。 Apache基金会 The most popular open source software is Apache. 这是对Apache开源软件基金最好的描述和肯定。它旨在为全世界提供优质的开源软件,同时欢迎全世界的朋友加入Apache社区贡献力量,并在这个过程中不断成长、得到肯定、共建开源社区。无论是否从事软件开发工作, 大家多少都知道它的存在和它提供的优质开源项目,可见其影响之大、之深远。此外,参与Apache开源社区,并在自己的努力下成为Apache committer,更是大多数软件开发工程师心之所向。 ShardingSphere在开源之初,就有进入Apache开源组织基金会的计划。其原因有以下几点 -Apache基金会独特的Apache way和社区建设思想会让一个开源项目更规范、更有生命力。 Apache基金会的导师制度会为一个开源社区带来优秀的指导和帮助。 Apache基金会会为其下的开源项目带来版权和商标上的法律保护。 Apache基金会在全世界范围内的影响不言而喻,若是能进入Apache基金会,则会扩大项目的影响力,使其进入世界范围的开源领域。 Apache基金会内的项目会更有机会登上世界舞台,并与其他开源项目建立友好交流,也能吸引更多贡献者加入社区。 但同样,进入Apache开源基金会的门槛可并不简单,特别对于国内的项目来说,语言和地域的障碍无疑雪上加霜。 为Apache做准备 找寻mentor是进入Apache基金的最初且最重要的一步。在了解了Apache基金会的运作方式后,我们便踏上了找寻mentor之旅。参加各种与开源相关的分享会或meetup,借此来认识Apache的member。但是,事情却并不顺利。多次的尝试,多次的接触换来的只是口头的认可。这段时间我们确实倍感压力和焦虑,甚至打算以后再说,一切随缘。 后来一个契机,我们认识了吴晟和姜宁。吴晟是Apache SkyWalking项目的VP,在开源领域有丰富的经验。他和ShardingSphere的前身Sharding-JDBC很有渊源,Sharding-JDBC项目原型也有他参与设计,因此,他最终作为ShardingSphere的PPMC一同建设社区。在参与ShardingSphere社区建设的这一年多的时间里,他又陆续担任了多个Apache孵化项目的Mentor,并在今年被选举为Apache Member;而姜宁同样是一位热心又有经验的老手,国内最资深的Apache Member之一,他是多个国内发起的Apache孵化项目的导师,有着丰富的项目孵化经验。 在与他交流的过程中,我们了解到项目孵化还需要再寻找到两位导师的支持,他也乐意帮助我们介绍导师。这终于让我们看到一些希望,他也最终成为了我们的mentor。再后来,团队VP张亮又前去上海参加HDC大会,认识了我们的另一位mentor—Craig L Russell,Craig当时是Apache的秘书长,所有的SGA、ICLA等法务文件均由他负责接收签署。在ShardingSphere孵化的过程中,Craig当选了Apache软件基金会的主席。他友善而和气,给予了我们很多有关社区规范的实用建议,也愿意助我们一臂之力;第三位mentor则是由Apache RocketMQ的核心成员冯嘉担任;最后由Roman Shaposhnik担任项目的Champion,为项目寻找导师之旅画上完美句号。 至今还记得我们当时的欣喜和激动。每个进入Apache基金会的项目,一定都有自己的故事。进入ASF孵化难这一问题是由于大家对ASF的孵化流程不了解, 同时缺少有经验的接口人(Champion)的介入引起的。 随着ALC Beijing的建立和越来越多本地开发者成为孵化器导师,我们相信这一问题能够很快得到解决。如果大家对加入ASF孵化器进行孵化感兴趣的话,欢迎大家与ALC Beijing的成员联系,在这里你可以结识到很多Apache的项目的开发者,ASF成员以及孵化器导师。为何Apache软件基金会能孵化出如此多成功的开源项目https://alc-beijing.github.io/alc-site/post/asf_incubator_process/Thu, 16 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/asf_incubator_process/ASF基金会的项目来源分为个人捐献项目和公司捐献项目。这两者在进入Apache基金会之后,并不做过多的区分。总体而言,虽然很多传奇的开源项目有个人英雄主义色彩,但也不乏有很多公司捐献的项目获得了巨大的成功(Hadoop, Spark, Kafka等)。那么问题来了,为什么ASF需要设置孵化器项目呢? -孵化器项目的必要性 ASF基金会有统一的开源治理原则与规则(被称为Apache Way, 具体请参考:https://www.apache.org/theapacheway) 来保障开源软件的质量以及开源社区的健康发展。而企业和个人捐献的项目可能五花八门,从而产生巨大的Gap。这个差距可能会包括:开发流程,基础设施支撑,社区文化,代码质量,文档质量等方面,因此需要经历孵化期来加以改进或者调整来达到基金会的基本要求。 除此之外,项目的贡献者从单一公司/个人贡献过渡到多元化的社区贡献需要一个过程。罗马不是一天建成的,让外部开发者了解开源项目的使用以及有兴趣和意愿参与进来,需要不断通过各种形式(技术会议,邮件组讨论,技术媒体文章等等)做社区推广。 最重要的是,由于捐献的项目可能会涉及到第三方的代码及知识产权,在孵化器阶段,知识产权(IP)和软件许可(License)需要进行统一的规范化,从而确保最终用户可以放心使用,不必有后顾之忧。 -了解为项目设定孵化器阶段的必要性之后,我们就很容易理解每个项目在孵化阶段需要达成的目标。 -项目在孵化阶段的目标 确保孵化器项目的组织架构以及日常运营能符合基金会统一的原则以及流程 确保捐献的项目的IP以及法律相关问题能在一个合适的时间和平台上得到关注、帮助以及充分解决 确保项目以及项目背后的社区的成长与推广符合基金会的目标 确保项目的成熟、毕业以及被基金会统一背书有统一的标准 在正式介绍孵化流程之前,笔者还想先介绍一下ASF孵化项目最重要的角色之一,就是导师(Mentor)。 -孵化器项目导师的角色与职能 Apache软件基金会所定义的导师职能如下: &ldquo;Mentors are chosen by the Sponsor to actively monitor the podling, guide the podling in the Apache Way, and report its status to the Sponsor and the Incubator PMC. All Mentors must be members of the Incubator PMC. A Mentor has the following responsibilities toward the Incubator PMC, the Sponsor, and the community of the assigned Podling.ASF公司架构和治理https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/Sat, 04 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/公司治理 总的来看,Apache软件基金会(ASF)的治理相当简单:由成员(Member)来选举董事会;董事会任命各种管理人员并创建PMCs;PMCs定期向董事会报告,大多数其他管理人员向总裁汇报,然后总裁向董事会报告。 -组织架构和职责 为了更好的管理公司,ASF建立了如下组织架构: -现有成员(Member)会定期提名和选举新成员,每年提名并选举9名董事加入董事会。 -董事会任命业务官员,并将特定政策或业务领域的责任分配给每位官员。例如,法律事务委员会副总裁负责为ASF和所有Apache项目设置法律政策,并与公司顾问进行合作。 -董事会任命执行官,包括总裁,秘书,财务总监等,他们负责ASF的特定领域运营。 -大多数官员每月直接向总裁报告,而总裁则每月向董事会报告ASF的整体运营状况。 -基础设施副总裁向总裁汇报,并对基础设施团队的运营进行宏观监督。在团队中,带薪的基础设施管理者角色有助于管理日常操作,为带薪人员确定工作优先级,并维护所有Apache项目中使用的基础服务。 -选举和任命 董事会创建并更新项目管理委员会(PMCs)。董事会只是批准孵化器的合理构建请求(毕业成为TLPs)或来自PMCs自身(添加或删除PMC成员)的请求。在每种情况下,向董事会建议进行的变更都已经由相关的PMC完成了投票。如下图所示: -项目治理 每个Apache PMC都独立管理他们的项目,以Apache的方式,遵循由所有官员为所有项目设置的一些核心原则。如下图所示: -PMC每季度直接向董事会报告一次。董事会对PMC进行监督,以确保PMC健康发展,顺利的管理社区,确保PMC遵守Apache的原则。项目的技术方向由PMC指定,董事会不对项目提供技术治理。 -每个PMC的主席都是该项目的副总裁,因此也是ASF的官员。主席的主要职责是确保项目报告全面,并提交到董事会。 -PMC对软件版本发布进行投票。PMC进行适当的发布治理,进而确保了所有的源代码版本发布都是ASF官方行为。 -PMCs为项目提名并选举新提交者(Committer)。PMCs还负责提名并投票新的PMC成员,然后PMCs向董事会汇报建议的变化。 -Apache孵化器(Incubator)是一种特殊的(I)PMC:它的工作是指导新建立的Podling社区,以帮助他们学习Apache Way。在每个Podling对他们的软件发布进行投票后,IPMC成员也对该Podling的发布过程进行监督和投票,以确保Podling逐渐成长为一个合格的Apache项目。 -根据政策,只有个人可以充当会员,提交者(Committer)或PMC成员(Member)或管理人员。这是ASF和Apache项目保持其独立性的一种方式。 -参考链接 [1] http://www.apache.org/foundation/governance/orgchartApache 软件基金会2020年度董事会成员介绍https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/Fri, 03 Apr 2020 09:59:50 +0800https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/在上周 Apache 软件基金会(下称 ASF )举行了成员会议,嗯,没错,就是一年一度的董事会选举会议,会议上以下个人成员组成了新的董事会: -Shane Curcuru (连任董事) Bertrand Delacretaz(原董事) Roy Fielding(原董事) Niclas Hedhman(新任董事) Justin Mclean(新任董事) Craig Russell (连任董事) Sam Ruby(原董事) Patricia Shanahan (新任董事) Sander Striker (原董事) 同时,ASF 要非常感谢去年的董事成员:Danny Angus、Rich Bowen、Ted Dunning、Dave Fisher、Myrle Krantz、Daniel Ruggeri、以及 Roman Shaposhnik,感谢他们卓越的服务。 -让我们再次欢迎新任的董事,以及回归的董事们! -有关 ASF 治理的概述以及ASF董事会、执行官和项目/委员会副主席的完整列表,请访问:http://apache.org/foundation/。 -更多关于 Apache 基金会的组织结构和运转方式,请移步:Apache 是如何运作的?。 -原文链接 Announcing New ASF Board of DirectorsASF年度大会程序https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/ASF年度大会程序 ASF至少每13个月举行一次年度成员大会,选举新的董事会,并对新的候选人进行投票。ASF年度会议由成员志愿者按照以下基本程序进行。 -[说明] 本篇参考[1]内容进行编写,部分措辞和语言组织略有调整,但保证内容含义的严格一致性。ASF虽然是一个非盈利组织,但是ASF是以公司化的方式进行运作的,有股东,董事会,还有执行机构,也有一些其他的雇员。本文中所提到的ASF年度大会算的是股东大会。 -目录 听众 会议机制-IRC沟通 成员候选人投票 如何计算成员投票 怎样决定如何对成员候选人进行投票 董事会投票 如何计算董事会投票 怎样决定如何对候选进行上投票 听众 本文档是ASF召开正式成员会议的概述。如果您是ASF的成员,请参阅本年度会议的 Private README.txt 以获取有相关方面的最新详细信息: /repos/private/foundation/Meetings/20200331/README.txt -会议机制-利用IRC沟通 由于我们的成员来自全球,因此成员会议在三天的时间内通过freenode的IRC举行。会议的前半部分(通常是星期二)在IRC实时聊天中举行,邀请所有成员参加。就像任何大型会议一样,轮值主席会负责根据预定的会议日程(agenda)和与会人员轮流在线交互。在会议的上半场中,我们审查来自各执行官的关于过去一年的基金会状况的报告。在上场年会无法出席的成员可以提交代理申请,以便可以将他们标记为出席。 -在会议上半场结束时,议程列出了下一届董事会的候选人,以及基金会的任何新候选人。候选人宣布后,会议将进行约46小时的休会。 -在休会期间,我们的Apache STeVe投票软件会向所有合格成员发送安全的私人电子邮件投票。投票通过电子邮件开放40多个小时,使世界各地的成员都可以方便地进行投票。所有选举计数和跟踪工作均由Apache STeVe和几位Member志愿者选举监督员执行。使用您的Apache ID登录后,在Web界面进行投票。 -在会议恢复之前(通常在星期四),投票将关闭几个小时,以使选举监督人员可以相互核对他们的票数是否一致。当会议在IRC上恢复时,主席宣布候选人名单的结果,并在会议上宣布董事会选举。会议的下半场通常要短得多,如果成员已经参加了上半场,则无需参加下半场。 -请不要等到最后一分钟进行投票:由于在会议召开前10天列出了所有董事会成员和新成员候选人,因此您有足够的时间事先研究您的选择。同时,投票过程是有监督的,监督人员来自组织的志愿者。 -会议结束后,将立即成立并宣布新董事会的任期,并由提名他们的现有成员向幸运的新成员候选人发出私人邀请。请注意,我们不会公开新当选成员(Member)的姓名,因为可能(很少)有些人不接受成为新成员的邀请。 -成员候选人投票 如何计算成员投票 要选出新成员,根据我们的章程4.1的规定,他/她必须获得在提名中进行投票的赞成票多于否决票。所有投票跟踪和记录都由Apache STeVe处理,由我们的票监督人员进行监控。投票的运行和审核过程均由ASF成员私下完成。 -对新成员候选人的投票是保密的;由于投票是针对个人的,因此投票监控器确投票结果后,便不会共享投票结果。 -怎样决定如何对成员候选人进行投票 这完全由每个ASF成员来决定。新成员候选人由现有成员提名,候选人发布说明为什么他们认为候选人会成为好的成员。提名通常需要几秒钟的时间,其中许多还包括有关候选人当选原因的个人事迹。 -由于新候选人是参与Apache项目的人员,因此许多人通过搜索邮件列表来查看候选人过去如是何参与我们的社区贡献的。使用PonyMail的存档非常容易-ASF成员可以在其中查看所有邮件列表,甚至是私人邮件列表。 -许多成员都希望从现有成员那里获得强有力的提名理由,解释说明提名人为什么会成为好的候选人。在投票之前花几秒钟仔细阅读一下成员提名文件十分重要。 -董事会投票 如何计算董事会投票额 ASF使用一次可转让投票(STV)来选举每年董事会的所有9个席位。每个候选人都单独参加;没有候选人名单。只有ASF成员才能提名人选参加董事会选举;所有候选人都已经是ASF成员。 -STV旨在帮助小规模的相关选区选举董事会成员。这种计票设计有助于使选民展示自己的实际愿望,避免过于灵活。请继续阅读有关如何使用STV的讨论,包括有关志愿者投票监控员实际上如何收集选票的详细信息。 -要记住的最重要的事情是:请按照您的偏好顺序进行投票!尽一切努力使您的#1偏好进入董事会;#1选票比其余选票更重要。如果您按字母顺序投票(某些人似乎对过去的选票进行了投票),那么您会发出强烈的信号,表示您希望董事会以Awful先生和Beastly女士之类的名字出现-可能不是您想要的。我们的Apache STeVe工具将分配给候选人的字母随机化,以尝试解决这个问题。 -选举结果使用Seek的Meek方法计算。技术细节可以查阅Apache STeVe项目代码,当然这是Apache项目。 -STV计票循环进行。每当董事会候选人获得足够的选票以当选时,该循环就会列出名字。投票首先要分配给该选票上指示的第一候选人。随着投票的进行,投票将重新分配。当确定某候选人不会当选时候,他们的选票将重新分配。当候选人当选时,他或她只带了足够的选票就足以使他当选;他们的其他选票是根据该选票上排名较低的排序发送的。 -该YouTube视频提供一个轻松活泼的介绍:Politics in the Animal Kingdom: Single Transferable Vote: or a shorter description of how second, third, etc.如何成为合格的ASF贡献者https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/阿里土话 ASF是一个开源组织,他有自身的文化,阿里是一个要活好102年的公司,其文化底蕴非凡!分享ASF之前总想或多或少的和大家分享一些阿里的味道! -给世界带来微小而美好的改变 把幸运种子种到别人身上去,你才会有幸运 Never, Never, Never Give Up(永不放弃) 没错,阿里人看到上面的三句话会倍感亲切,因为上面三句都是 “阿里土话”。虽然是阿里土话,但我认为其有放诸四海而皆准的魅力!这些话,同样适用于激发和指导你成为合格的开源贡献者!不经意间看了一眼窗外,心里开心默笑,其实阿里每个角落都充满着阿里气息: -缘 其实每个人参与社区贡献的机缘不一样,但无外乎两种: -偶发事件 - 由于参与某项工作,无选择的就参与了某个开源项目。(我就是这种,很自然的就跟着 蒋晓伟 老师踏入了Apache Flink之旅) -因爱而求 - 每个码农都有一颗想让自己的的代码被应用全球的梦想追求!这梦想的实现要依托有开源的力量,ASF可以为你提供一个逐梦的舞台~ -给个理由 也许目前的你既没有工作的需要,也没有对开源产生任何爱意❤️。但了解一件事情总没有坏处,了解参与开源的利好,也许明天你就踏上了开源之旅! -顺势而为 - 如果你是一个码农,那么参与开源是一种must to have的事情,目前开源领域形式大好,各大公司纷纷拥抱开源,比如:Google,Alibaba,Hortonworks, Tencent, Facebook等等。参与开源无疑是扩大了生存的空间。 -业界身份证 - 参与开源就是在一点一滴的描绘你的业界身份证,你的开源贡献可以公示全球,由一行代码,一句文档的贡献,到参与项目管理成为项目管理委员会(PMC)一员,到成为 ASF Member 甚至 成为董事会成员,这些就像你曾经为之努力的学士学位,硕士学位,博士学位一样为世人所认可!不夸张的说,某些情况甚至比学位证书还实用! -无国界导师 - 参与开源还有一个特别特别特别重大的利好,就是你可以在你所关注的领域在全球领域寻找到最好的导师,所谓最好,不是牛,最好是最适合!所谓“三人行,必有我师”,社区交流最初你会感觉和业界大牛无法沟通,因为他的一句话,需要分解成十句才能懵懵懂,甚至不懂!这个不是大牛原因,也不是你的原因,是大牛对你水平的了解不足导致,即使大牛了解你的水平,也很难让大牛将一句话分解成十句甚至百句话讨论你关注的问题,不是大牛不愿意,更多是我们不好意思:)。所以说,要“门当户对”找到 社区比你水平略高,同时你也能给人家一些反哺的贡献者长时间交流。开源社区有着“帮传带“”的传统, 社区导师对新人都非常友好,很多时候社区导师会通过帮助社区新人展示自己的技术能力,积累社区影响力。因此对于新人有价值的问题,导师基本上是知无不言,言无不尽。 目前ASF有7600+的Committer,就算是某一个项目,也应该有几十个Committer和数以百计的贡献者,总会遇到可以和你一起进步的小伙伴!虽不曾谋面,却已熟若亲朋! -全球性分享 - 目前ASF项目有140多个领域,参与者覆盖230个国家。如果你小有成就,想将你的知识分享给更多的人,想利用的开源知识帮助更多的人,那么无疑ASF为你提供了这样的平台!你又何尝不能成为上面“无国界导师”中的一员的导师呢! -最佳实践 - 不知 - 了解 - 有方案 - 最佳方案,开源是一个智慧的集结地,一个功能可能有几十种实现方式,这并不是一两个人或者某一个小团队能考虑到(ALL)的,然而在开源一个问题,你在考虑的同时,可能在世界的某个角落,某些角落还有其他人或团队在考虑解决方案,当大家共享方案的时候,智慧的火花将会产生!DolphinScheduler介绍https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/DolphinScheduler介绍 DolphinScheduler,简称”DS”, 中文名 “小海豚调度”(海豚聪明、人性化,又左右脑可互相换班,终生不用睡觉)。希望 DolphinScheduler 就像它的名字一样,成为一个“开箱即用”的灵活易用的调度系统。 -1概述 DAG 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。 -Apache DolphinScheduler(目前处在孵化阶段)是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 -DolphinScheduler是2019年开源的一个调度系统,在去年美国时间2019年8月29号,分布式任务调度引擎DolphinScheduler(原EasyScheduler)正式通过顶级开源组织Apache基金会的投票决议,以全票通过的优秀表现正式成为了Apache孵化器项目! -2背景 在2017年,易观在运营自己6.8Pb大小、6.02亿月活、每天近万个调度任务的大数据平台时,受到ETL复杂的依赖关系、平台易用性、可维护性及二次开发等方面掣肘,易观的技术团队渴望找到一个具有以下功能的数据调度工具: -易于使用,开发人员可以通过非常简单的拖拽操作构建ETL过程。不仅对于ETL开发人员,无法编写代码的人也可以使用此工具进行ETL操作,例如系统管理员和分析师; 解决“复杂任务依赖”问题,并且可以实时监视ETL运行状态; 支持多租户; 支持许多任务类型:Shell,MR,Spark,Flink,SQL(mysql,postgresql,hive,sparksql,clickhouse等),DataX,Sqoop,Python,Sub_Process,Procedure等; 支持HA和线性可扩展性。 易观技术团队意识到现有开源项目没有能够达到他们要求的,因此决定自行开发这个工具。他们在2017年底设计了DolphinScheduler的主要架构;2018年5月完成第一个内部使用版本,后来又迭代了几个内部版本后,系统逐渐稳定下来。 -3特点 DolphinScheduler提供了许多易于使用的功能,可加快数据ETL工作开发流程的效率。其主要特点如下: -通过拖拽以DAG 图的方式将 Task 按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态; 支持丰富的任务类型; 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill 任务等操作; 支持工作流全局参数及节点自定义参数设置; 支持集群HA,通过 Zookeeper实现 Master 集群和 Worker 集群去中心化; 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计; 支持补数,并行或串行回填数据。 4系统架构 DolphinScheduler 是从数据处理的痛点出发,其解决的问题以及优化的方向主要有以下 5 点: -可视化流程设计减轻了开发者配置工作流的复杂度,从繁琐的基础配置中解放出来,不用再靠编程来配置流程,提升开发效率; -扩展性强,在当下这样一个业务变化快、技术迭代频繁的现在,丰富的任务类型、跨语言和自定义插件机制良好的可扩展性,无疑使这款框架具备了更长的寿命和更广泛的落地场景; -支持工作流定时调度、依赖调度、手动调度、手动暂停 / 停止 / 恢复,同时支持失败重试 / 告警、从指定节点恢复失败、Kill 任务等操作 -支持集群 HA,通过 Zookeeper 实现 Master 集群和 Worker 集群的天然去中心化架构设计,使得系统的高可用性得到保证;为什么要成立 ALC (Apache Local Community) Beijing?https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/背景 当提起Apache软件基金会(Apache Software Foundation,ASF)项目时,国内大多数程序员都不会陌生。下图展示了在ASF 2019年年度报告中披露的ASF软件在全球各国家的下载量排名。 -可以看到,中国已然成为Apache软件基金会项目下载量最大的地区。然而,这个看起来脱颖而出的数据背后,却暴露出我国这片土地上几个可能让大家颇为惊讶的现状: -ASF 拥有7000+代码贡献者,然而为 ASF 项目提交贡献的本土工程师仅千人规模,不足七分之一。 ASF 项目约350个,然而由本土发起的 ASF 项目仅19个,已成为顶级项目的比例更是不足5%。 ASF 孵化器拥有导师200多个,然而活跃的中国导师不超过5位。 ASF 每年在美国、欧洲等地举办 ApacheCon ,然而迄今为止,ASF 尚未在中国举办过一次 ApacheCon。 作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者甚至成为开源项目的发起者、维护者是一个值得深思的问题。 缘起 作为发起人的姜宁,颇为忧伤的语气回忆道: -06年的时候国内参与 Apache 软基金会开发的人员很少,当时只有少数几个在外企工作的人员有机会直接参与ASF项目的开发。当时有个问题一直困扰着我,本土的软件开发人员这么多,但有多少人能够以开源项目维护人员的身份深度参与到开源项目开发中来呢? -以我的个人经历来看,加入到开源项目的开发贡献并不困难,因为开源社区会有很多热心的开发者提供指导和帮助,参与者只要保证有足够时间的投入就可以,但是在我维护 Apache Camel 的7,8年间,很少看到有国人会到项目的邮件列表里面用英文提问题,提补丁。 -我的私人邮箱接到国人最多的邮件是直接提需求找我要项目示例的邮件。期间也有国内公司的开发人员与我交流,很多人在使用ASF 项目的过程中发现开源版本不满足自己的需求,就在自己的公司的私有版本上进行了修改,大家没有意识到把问题反馈到ASF上游项目中是最优的解决方法。这里可能有缺乏直接和项目开发者交流的途径原因,也可能是大家已经习惯了拿来主义,缺乏深度参与开源项目开发的热情。 大部分的开发者只停留在使用开源项目这个层面上,没有真正参与到开源项目的全生命周期的开发过程中来。 -要改变这样的状况,需要有更多深度参与ASF项目人向大家介绍深度参与开源项目的经验,帮助更多的 ASF 项目用户从单纯的使用者转变成为开源项目的开发者。 -机会只会迟到,但永远不会缺席,过了大约十几年,终于迎来了一次真正的机会。 -自 2015年至今,ASF 已经接收19个源自中国本土的开源项目的捐赠(如下表所示),这也意味这我们有越来越多的 ASF 项目 Committer,ASF 项目 PMC 成员,或者是 ASF Member 在 Community 里是非常活跃的。这说明本土的人气已经足够, 我们可以一起做更多的事情了。 -序号 项目名称 进入孵化器时间 毕业时间 ppmc/pmc人数 commiter人数(包含ppmc/pmc) 1 Kylin 2014年11月 2015年11月 23 39 2 Eagle 2015年10月 2016年12月 16 18 3 HAWQ 2015年9月 2018年8月 45 68 4 CarbonData 2016年6月 2017年4月 13 25 5 RocketMQ 2016年11月 2017年9月 13 26 6 Griffin 2016年12月 2018年11月 18 20 7 Weex 2016年11月 14 26 8 ServiceComb 2017年11月 2018年10月 20 23 9 SkyWalking 2017年12月 2019年4月 24 34 10 Dubbo 2018年2月 2019年5月 17 55 11 ECharts 2018年1月 13 19 12 Doris 2018年7月 13 17 13 brpc 2018年11月 9 9 14 IoTDB 2018年11月 23 32 15 ShardingSphere 2018年11月 2020年5月 14 24 16 DolphinScheduler 2019年8月 13 22 17 Teaclave 2019年8月 15 15 18 APISIX 2019年10月 2020年7月 18 20 19 TubeMQ 2019年11月 20 21 在参与了几个Apache项目孵化之后 ,姜宁已然是一名国内比较有影响力的 ASF 成员 了。他于2018年和2019年在上海发起并组织过两次 ASF Committer 的 Meetup[1][2][3],希望能够帮助本土的开发者更好的理解开源、参与开源。由于时间仓促和场地有限,只邀请到华东地区的 ASF 项目开发者,并没有惠及到更多的的 ASF 项目的用户。通过这几次 Meetup, 大家发现本土开发者对于 Apache 理念和倡导的哲学并不了解。 \ No newline at end of file +Posts on ALC Beijing 博客https://alc-beijing.github.io/alc-site/post/Recent content in Posts on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000Rich Bowen: 无论你在创造什么,最终交付的是信任。https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/ +2023 年 CommunityOverCode Asia Rich 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。开源贡献难吗?https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/ +在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这个题目。从参会到办会的入’坑’指南https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/Mon, 25 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/CommunityOverCode Asia 2023 会议资料汇总https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/Sat, 23 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/ +本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频和会议演讲材料的访问信息。新孵化项目提案指导https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/Mon, 18 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/ +描述了进入ASF孵化器提案需要做的工作【Release】ASF 孵化项目发版常见问题https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/ +对于每个初入 ASF 的项目来说,第一次发版都会多少遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/ +在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。如何成为一名成功的学生导师https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/ +编程之夏 2020 优秀学生导师总结Apache孵化器指南表格版https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/Sat, 20 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/ +描述了进入ASF孵化过程中各个阶段需要注意的问题。Apache ServiceComb带您对话Apache大咖https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/Sat, 13 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/ +Apache专家现场解读Apache基金会及孵化器运作模式Apache 软件基金会品牌使用指南https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/Wed, 03 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/ +介绍了Apache 软件基金会品牌在使用过程中需要注意的原则问题Apache 下游项目的品牌使用原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/ +介绍了Apache下游项目的品牌使用过程中需要注意的原则问题Apache 商标使用管理原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/ +介绍了Apache商标在使用过程中需要注意的原则问题Apache 项目网站商标原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/Mon, 01 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/ +介绍了Apache项目网站商标在使用过程中需要注意的原则问题Apache孵化器指南https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/Sun, 28 Feb 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/ +描述了进入ASF孵化过程中各个阶段需要注意的问题。ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/ +本期节目中, ALC Beijing 邀请到了两位在校大学生同学来她们在开源社区中所做的非代码贡献,以及它们在社区中的成长故事。ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/ +这次 ALC Beijing 特别邀请到了在Apache ECharts PMC同学来分析Apache孵化的心路历程。从初识社区到融入社区https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/Tue, 05 Jan 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/ +Get yourself involved in the communityALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/ +这次 ALC Beijing 特别邀请到了在“点亮计划暑期2020”新晋成为Apache Committer的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程。ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。暑期 2020 活动学生(张可)心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/Sun, 20 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/ +学生(张可)参与暑期 2020 活动中 Apache SkyWalking 项目的感受与收获暑期2020活动心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/Sat, 19 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/ +参与开源项目有感ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/ +随着开源的发展,越来越多企业开始把开源的最佳实践应用到企业内部开发。今天我们就跟大家聊一下这一有趣的现象 InnerSource。我与开源的那些事儿https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/Thu, 29 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/ +一段有缘的开源经历ASF如何准备董事会会议https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/Wed, 21 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/ +ASF如何准备一个月一次的董事会增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/ +在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/Fri, 25 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/ +The Apache® Software Foundation Welcomes its Global Community Online at ApacheCon@Home年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/Wed, 16 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/ +ApacheCon 2020 Mandarin Track IntroductionApacheCon 2020 参会指南https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/Tue, 15 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/ +The creation story about ALC-Beijing到底什么是The Apache Way?https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/Sun, 30 Aug 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/ +What is the Apache Way?Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/ +Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/ +这个系列会为大家带来不一样的体验,针对ALC Beijing 成员的采访,让你了解ALC Beijing 的初心以及蓝图。Apache基金会项目孵化过程中知识产权转移的讨论https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/ +ASF项目孵化流程对知识产权授权与转移有完备的定义,本文从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结 Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/ +Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/ +Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/ +Apache 本土共同体部分成员的自我介绍,以及他们对这个组织的期望,当然了现在做的事情也非常值得说明。Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。英雄之旅-行走在开源领域的一个自叙故事https://alc-beijing.github.io/alc-site/post/heros_journey_trista/Sun, 24 May 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/heros_journey_trista/ +英雄之旅-行走在开源领域的一个自叙故事Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/ +ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。ALC Beijing 志愿者招募https://alc-beijing.github.io/alc-site/post/call_for_volunteer/Tue, 21 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/call_for_volunteer/ +ALC Beijing Call for VolunteerApache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/Mon, 20 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/ +Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路为何Apache软件基金会能孵化出如此多成功的开源项目https://alc-beijing.github.io/alc-site/post/asf_incubator_process/Thu, 16 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/asf_incubator_process/ +ASF项目孵化流程ASF公司架构和治理https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/Sat, 04 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/ +ASF公司架构和治理Apache 软件基金会2020年度董事会成员介绍https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/Fri, 03 Apr 2020 09:59:50 +0800https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/ +一年一度的基金会董事会成员选举在上周落下了帷幕,新旧成员的更替就这样更新着,在我们进一步理解 Apache 之前,我们暂时将之视为新闻即可。顺道看下有没有你认识的成员。ASF年度大会程序https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/ +ASF年度大会程序如何成为合格的ASF贡献者https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/ +如何成为合格的ASF贡献者DolphinScheduler介绍https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/ +The introduction about DolphinScheduler为什么要成立 ALC (Apache Local Community) Beijing?https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/ +The creation story about ALC-Beijing \ No newline at end of file diff --git a/post/interview/alc-beijing-member-ligang/index.html b/post/interview/alc-beijing-member-ligang/index.html index c071a568..e97f1287 100644 --- a/post/interview/alc-beijing-member-ligang/index.html +++ b/post/interview/alc-beijing-member-ligang/index.html @@ -1,3 +1,5 @@ -ALC Beijing 成员采访之李岗: 用青春谱写开源 · ALC Beijing

    ALC Beijing 成员采访之李岗: 用青春谱写开源

    内容梗概

    来自Apache DolphinScheduler (孵化中)项目的李岗,年轻、对开源充满激情和憧憬,这次参与到ALC Beijing来,也是灌注了满满的热爱和斗志!本次采访将为大家展现一下这位用青春赌上开源梦想之路的大男孩。

    时间线

    01:00 ~~ 01:20 李岗自我介绍

    01:20 ~~ 03:10 是如何接触到开源的,然后工作后自然而然的选择开源。感到非常幸运的是参与Apache的项目。

    03:30 ~~ 04:10 从上学到工作,中间所经历的开源共同体的经历。

    04:15 ~~ 09:00 Apache 文化中的个人与公司的见解,自己在经历成长的过程中遇到了那些坑。

    09:10 ~~ 11:10 参与开源对于自己个人的改变

    11:20 ~~ 13: 20 从开源Community中如何获得“荣誉”

    13:30 ~~ 16:10 Apache 带给个人的社会认可

    17:00 ~~ 21:00 是什么样的动力?或者是在没有明确的直接的报酬的情况下,是如何在周末和工作之外的时间做开源?

    21:10 ~~ 25:10 Apache local Community Beijing 是如何理解的。

    25:20 ~~ 26:00 DS项目中的Peer Review是如何实现的。

    26:40 ~~ 28:00 DS为什么选择Apache 软件基金会。

    28:00 ~~ 33:00 DS 在发展过程中克服了那些困难。如何进入Apache 孵化器、许可协议、沟通模式。

    33:00 ~~ 35 :30 微信在开发中遇到的障碍。

    36:00 ~~ 36:30 总结:拥抱开源,拥抱青春。挑战自我。

    请收听

    本期嘉宾

    李岗:Apache DolphinScheduler (Incubating) PPMC,开源的爱好者和实践者,易观开源工程师。

    适兕:主持人,开源布道师。

    相关链接

    关于 ALC Beijing 成员

    成员列表请访问:Apache 维基页面,我们会不定期的给大家介绍成员的背景和开源成长史以及他们参与ALC Beijing 的主张。

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing 成员采访之李岗: 用青春谱写开源 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    30 +Jul 2020

    ALC Beijing 成员采访之李岗: 用青春谱写开源

    内容梗概

    来自Apache DolphinScheduler (孵化中)项目的李岗,年轻、对开源充满激情和憧憬,这次参与到ALC Beijing来,也是灌注了满满的热爱和斗志!本次采访将为大家展现一下这位用青春赌上开源梦想之路的大男孩。

    时间线

    01:00 ~~ 01:20 李岗自我介绍

    01:20 ~~ 03:10 是如何接触到开源的,然后工作后自然而然的选择开源。感到非常幸运的是参与Apache的项目。

    03:30 ~~ 04:10 从上学到工作,中间所经历的开源共同体的经历。

    04:15 ~~ 09:00 Apache 文化中的个人与公司的见解,自己在经历成长的过程中遇到了那些坑。

    09:10 ~~ 11:10 参与开源对于自己个人的改变

    11:20 ~~ 13: 20 从开源Community中如何获得“荣誉”

    13:30 ~~ 16:10 Apache 带给个人的社会认可

    17:00 ~~ 21:00 是什么样的动力?或者是在没有明确的直接的报酬的情况下,是如何在周末和工作之外的时间做开源?

    21:10 ~~ 25:10 Apache local Community Beijing 是如何理解的。

    25:20 ~~ 26:00 DS项目中的Peer Review是如何实现的。

    26:40 ~~ 28:00 DS为什么选择Apache 软件基金会。

    28:00 ~~ 33:00 DS 在发展过程中克服了那些困难。如何进入Apache 孵化器、许可协议、沟通模式。

    33:00 ~~ 35 :30 微信在开发中遇到的障碍。

    36:00 ~~ 36:30 总结:拥抱开源,拥抱青春。挑战自我。

    请收听

    本期嘉宾

    李岗:Apache DolphinScheduler (Incubating) PPMC,开源的爱好者和实践者,易观开源工程师。

    适兕:主持人,开源布道师。

    相关链接

    关于 ALC Beijing 成员

    成员列表请访问:Apache 维基页面,我们会不定期的给大家介绍成员的背景和开源成长史以及他们参与ALC Beijing 的主张。

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目
    \ No newline at end of file diff --git a/post/interview/interview_with_rich_bown/index.html b/post/interview/interview_with_rich_bown/index.html index 13e353cf..2bc16a7d 100644 --- a/post/interview/interview_with_rich_bown/index.html +++ b/post/interview/interview_with_rich_bown/index.html @@ -1,4 +1,4 @@ -Rich Bowen: 无论你在创造什么,最终交付的是信任。 · ALC Beijing

    Rich Bowen: 无论你在创造什么,最终交付的是信任。

    早在开源被我们称之为开源,Rich Bowen 就已经参与其中。作为 Apache 软件基金会的成员,Rich 目前担任董事会成员、会议副总裁。此外,他还是 AWS 的开源策略师。这些多重角色赋予了他对开源的更广泛和深刻的理解。

    在他于 2023 年 CommunityOverCode Asia 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。

    思否:近年来,中国的公司相继设立开源计划办公室。作为一家知名的开源公司,AWS 是如何管理、运营和推广开源的呢?

    Rich Bowen: 总的来说,AWS 和亚马逊从一开始就一直在基于开源进行构建,我们所做的一切都依赖于开源。在亚马逊,我们遵循领导力准则,这些准则影响着我们的思考方式。

    第一个准则是顾客至尚。我们始终关注客户并优先满足他们的需求,所以我们构建了所有这些基础设施,而这些产品都建立在开源技术之上。最重要的是,开源项目必须具备可持续性。我们在开源上所做的一切,首先需要确保这些开源项目保持健康的运行。我们还有一项工作是项目选择,如果有多个项目可供选择,我们会尽量选择一个拥有健康生态系统和强大社区的项目。这意味着很多事情,包括众多公司的参与以及透明的项目沟通。接下来,我们会密切关注这些社区,确保它们的生态是健康的,同时我们也会积极参与社区维护,这是最重要也是我们关注的焦点。

    我们推广开源的方式不是独立进行的,而是是与社区一起。例如,我们非常依赖 Apache 项目,如 Kafka 和 Airflow 等。我们通过参与他们的会议,比如 Kafka Summit 和 Airflow Summit 去进行推广。通过和社区一起推广,我们可以确保这是社区的看法,而不是亚马逊的看法。此外,我们还会参与社区活动,如 KubeCon 或开源峰会。

    思否:这更像是让公司退居幕后,但对于一些在项目中投入了大量资源的开源公司来说,做出清晰的决策可能会很困难。他们可能会因为投资而模糊界限,或者将项目视为自己的品牌。

    Rich Bowen:的确如此。有时你会对一个开源项目的推广产生疑惑,他们是在谈论项目还是在谈论公司?这很难区分出来。

    像任何大公司一样,不同部门之间会存在差异。但作为一名开源策略师,我的工作是参与部门其中,并为他们提供建议,告诉他们我们认为正确的参与方式,即把社区放在第一位,而不是我们自己。

    思否:你能分享一些优秀的 AWS 开源项目吗?

    Rich Bowen:从我的角度来看,Amazon 参与的开源社区主要分为两种类型。一种是主要由亚马逊主导的,另一种是主要由社区主导的。

    我们参与的一类开源项目是围绕我们某项服务的,因此除非他们是客户,否则其他人没有真正的动力参与其中。还有一类项目是很多公司参与进来的,比如 Apache Kafka。我主要关注的是第二类项目,也就是真正的社区项目。在亚马逊,我参与的大多数项目实际上都是 Apache 项目。

    我最为兴奋的项目之一是 Apache Airflow,因为这是一个亚马逊积极参与的项目。虽然这个项目并不属于亚马逊,但我们有很多全职工程师也参与其中。作为一个社区项目,也有许多其他公司参与其中。我个人认为,这是我们最佳参与项目方式的模型之一。

    思否:在你看来,该如何建立一个开源生态系统呢?

    Rich Bowen:保持沟通透明是最重要的事情。所有关于 Apache Airflow 的讨论都通过邮件进行。我们并不会进行内部会议,然后通知项目:“这是我们做的决定”。相反,我们向社区递交提案,接着在社区中进行讨论和决策。所以,一切的前提是保持公开透明。

    第二部分是怀着谦卑去倾听。不是因为我有答案,所以你应该同意我的观点,而是要倾听整个社区的想法,然后共同做出决策。开源领域的早期思想家之一比尔·乔伊(Bill Joy),他创办了 Sun Microsystems 公司。我一直记得他说过的一句话:**不管你在哪家公司工作,世界上最聪明的人都在别处工作。**所以,认为你的团队拥有所有答案是傲慢和短视的。最好的想法总是来自其他地方,所以更应该倾听,因为它们能给你一种新的方式思考。

    所以,倾听也是其中一个重要的部分。获取信任很难,而失去信任却很容易,所以你必须赢得社区的信任。尊重他人,礼貌和冷静地倾听,贡献自己的想法,但不要试图强迫别人接受你的观点。

    思否:你既在 AWS 工作,又在 Apache 软件基金会工作,这两者之间有哪些相似和差异?

    Rich Bowen:最显著的差异是动机。公司存在的意义是服务客户和盈利,而 Apache 社区存在的意义是为了公众生产免费软件。

    但从某种程度上,两者之间是有一些相似的地方。正如我前面提到的,顾客至尚是我们的首要领导力准则,这和开源项目是一致的。如果不专注用户,那你就失去了意义。

    对于一家想要成功的公司,无论用户是否付费,你仍必须把他们都当做你的客户。也许他们未来会付费,也许不会,但你仍需要确保你们在开发人们需要的产品,这在开源领域也是同样适用的。

    在繁荣的公司和蓬勃发展的开源社区之间还有一件不变的事物,那就是无论你在创造什么——汽车、服务还是软件——最终你交付的产品还是信任。

    您的客户是否信任你?如果他们不信任你,无论你的产品有多好,他们都会离开你,这在开源社区中也是一样的。信任永远是最重要的事情。如果你的开源社区失去用户的信任,无论产品有多好,他们都不会使用它。我们每周都会跟进一些开源项目,这些项目会在不听取社区反馈的情况下做出决策。这种不透明的做法导致了信任的缺失,使得这个项目一夜间流失了所有用户。

    思否:从基金会或者社区的角度来看,当你以处在不同角色的时候,是否存在冲突?也就是说,是否会有一种感觉,认为这样做是错误的?

    Rich Bowen:会的。当存在利益冲突的时候,重要的是坦诚面对,并保持透明。

    例如,有一些项目是我所在公司高度依赖的,我可能会想让该项目做出特定的决策。或者当我们的竞争对手参与了该项目,我可能不希望他们成功。因此,在进行这些讨论的时候,对我来说非常重要的一点是,需要坦率地表达出,我在亚马逊工作,这些是我们的利益,这些是潜在的利益冲突。在表述后,我会努力将社区的利益放在首位。

    这和之前我提到的观点有关。项目的所有参与是透明的并以上游为先,这两者都很重要。因为如果你在内部先做出决策,然后将其带到项目中,那就没有把项目的利益放在首位。但如果你专注于你的客户和用户,那么你会希望项目能成功。有一句谚语叫水涨船高,这意味着如果我使项目成功,我会帮助我的竞争对手,这是可以接受的。因为涨潮推动了我们所有人,我们一起合作这个项目。看起来我或许在帮助我的竞争对手,但我主要在帮助我的客户。

    思否:那么管理层应该关注开源的哪些方面,以及为什么这些方面尤其关键?

    Rich Bowen:我认为管理层最需要理解的一点是,开源是供应链的一部分。

    无论你的产品是什么,都需要其他地方的原材料和自然资源。如果你只是消耗,那么最终将耗尽资源。如果我们把开源看作是我们的原材料,那么我们有责任确保这一原材料源头的健康。如果你是一名木匠,你会希望确保森林始终存在,你会种植新的树木,而不仅是砍伐。因此,我试图向管理层传达,我们的责任是维持可持续性。我们有责任确保我们依赖的项目是健康的。

    历史上,有许多公司构建了开源的业务模式,却没有回馈社区,这导致了几种情况。其中一种情况是,项目可能会对你产生敌意,并寻找方法来反对你。最终,你可能会陷入这样一种情况,你在某个基础上构建了产品,但该项目可能更改了许可证,将你排除在外。

    另一种情况是,如果您不积极参与,那么在项目决策中,你就没有发言权。也许项目会朝着不符合你的利益方向发展。因此,积极参与供应链其中是至关重要的。这一点不仅在软件领域如此,对于任何业务来说都是如此。如果你依赖煤炭,那么你应该了解煤炭业务的运作方式,以便可以提前几个月或几年看到将出现的问题。这对我来说是最重要的事情。

    最后一个是信任,这又与透明有关。你需要确保与项目进行开放的沟通,并且不做出让社区感到恼火、尴尬或贬低社区的决策或营销方式。你需要给予向那些正在工作的人正确的赞誉,并按这种方式去做事。

    思否:你提到了使用和应用开源软件,这让我想到了另个话题:贡献。管理团队在使用、贡献或应用开源软件时会面临哪些挑战?又该如何解决这些挑战呢?

    Rich Bowen:我认为企业在与开源合作时面临的最大困难,我在昨天的圆桌讨论中也提到过,就是要有耐心。当你尝试在开源项目中做出决策时,需要进行讨论,而不能仅仅让你的经理说:“这就是我们要做的方式。”

    有时,你必须等待数天甚至数周才能做出决策,而这对于需要发布产品的公司来说是非常沮丧的。例如,我有一个产品发布的截止日期,还有需要在即将到来的发布会上宣布新功能。而在开源项目中,你不能这么做。这就是一个挑战,你需要向管理层解释他们为什么应该等待。

    我们以客户为导向,而用户就是我们的客户,所以我们应该等待。我们需要确保我们有时间和耐心等待用户的反馈。当我对一个新功能有了很好的想法,我会感到兴奋并想要推出它,然而用户认为这不是一个好主意,那么最终这个功能将失败,所以我们需要等待。你甚至可以将其当作为市场研究,而来自社区的用户反馈是值得等待的。参与项目的开发人员代表了他们自己,他们是最了解产品也是最有经验的用户。所以我们必须确保他们在决策过程中,而这使得和管理层沟通截止日期的问题变得很难。

    思否:管理层代表着公司,和开源其实是有天然的冲突。那么,你将如何说服管理层,理解开源的概念有助于策略调整以实现业务目标?

    Rich Bowen: 回到之前的问题,我认为让他们理解原材料和供应链是很有用的隐喻:如果我们售卖牛奶,那就不应杀掉奶牛。

    如今,有些人会说,“那我们应该买下奶牛,不理会农民,我们应该自己做这些事情。”对于一家企业来说,理解自己在哪些领域有独特的优势,以及舍弃哪些领域是很重要的。因此,你可以在共同的领域进行合作,而专注于具有独特优势的领域。

    例如,AWS 完全致力并擅长托管网络服务。我们在世界各地都有数据中心,我们拥有庞大的规模、快速的网络和才华横溢的系统管理员。但我们运行的软件是由全世界和整个社区共同开发的,我们与他人分享这些资源。然后,我们专注于我们独特擅长的领域。

    我在红帽工作了九年。红帽并不是一家软件公司,它出售技术支持服务而不是软件。我会建议销售人员不要强调自己是世界上最优秀的软件生产商,因为软件是由社区共同开发的,而我们擅长的是销售支持服务。这是我在红帽工作期间思考了很久得出的结论,而在AWS也有着相似的情况。

    你可以访问 Rich 的博客 DrBacchus.com,了解更多关于他对于开源的想法和见解。

    作者: 大花

    Anne Zhu is the community manager of Answer, SegmentFault. 大花是思否旗下开源问答软件 Answer 的社区经理。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Rich Bowen: 无论你在创造什么,最终交付的是信任。 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    04 +Oct 2023

    Rich Bowen: 无论你在创造什么,最终交付的是信任。

    早在开源被我们称之为开源,Rich Bowen 就已经参与其中。作为 Apache 软件基金会的成员,Rich 目前担任董事会成员、会议副总裁。此外,他还是 AWS 的开源策略师。这些多重角色赋予了他对开源的更广泛和深刻的理解。

    在他于 2023 年 CommunityOverCode Asia 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。

    思否:近年来,中国的公司相继设立开源计划办公室。作为一家知名的开源公司,AWS 是如何管理、运营和推广开源的呢?

    Rich Bowen: 总的来说,AWS 和亚马逊从一开始就一直在基于开源进行构建,我们所做的一切都依赖于开源。在亚马逊,我们遵循领导力准则,这些准则影响着我们的思考方式。

    第一个准则是顾客至尚。我们始终关注客户并优先满足他们的需求,所以我们构建了所有这些基础设施,而这些产品都建立在开源技术之上。最重要的是,开源项目必须具备可持续性。我们在开源上所做的一切,首先需要确保这些开源项目保持健康的运行。我们还有一项工作是项目选择,如果有多个项目可供选择,我们会尽量选择一个拥有健康生态系统和强大社区的项目。这意味着很多事情,包括众多公司的参与以及透明的项目沟通。接下来,我们会密切关注这些社区,确保它们的生态是健康的,同时我们也会积极参与社区维护,这是最重要也是我们关注的焦点。

    我们推广开源的方式不是独立进行的,而是是与社区一起。例如,我们非常依赖 Apache 项目,如 Kafka 和 Airflow 等。我们通过参与他们的会议,比如 Kafka Summit 和 Airflow Summit 去进行推广。通过和社区一起推广,我们可以确保这是社区的看法,而不是亚马逊的看法。此外,我们还会参与社区活动,如 KubeCon 或开源峰会。

    思否:这更像是让公司退居幕后,但对于一些在项目中投入了大量资源的开源公司来说,做出清晰的决策可能会很困难。他们可能会因为投资而模糊界限,或者将项目视为自己的品牌。

    Rich Bowen:的确如此。有时你会对一个开源项目的推广产生疑惑,他们是在谈论项目还是在谈论公司?这很难区分出来。

    像任何大公司一样,不同部门之间会存在差异。但作为一名开源策略师,我的工作是参与部门其中,并为他们提供建议,告诉他们我们认为正确的参与方式,即把社区放在第一位,而不是我们自己。

    思否:你能分享一些优秀的 AWS 开源项目吗?

    Rich Bowen:从我的角度来看,Amazon 参与的开源社区主要分为两种类型。一种是主要由亚马逊主导的,另一种是主要由社区主导的。

    我们参与的一类开源项目是围绕我们某项服务的,因此除非他们是客户,否则其他人没有真正的动力参与其中。还有一类项目是很多公司参与进来的,比如 Apache Kafka。我主要关注的是第二类项目,也就是真正的社区项目。在亚马逊,我参与的大多数项目实际上都是 Apache 项目。

    我最为兴奋的项目之一是 Apache Airflow,因为这是一个亚马逊积极参与的项目。虽然这个项目并不属于亚马逊,但我们有很多全职工程师也参与其中。作为一个社区项目,也有许多其他公司参与其中。我个人认为,这是我们最佳参与项目方式的模型之一。

    思否:在你看来,该如何建立一个开源生态系统呢?

    Rich Bowen:保持沟通透明是最重要的事情。所有关于 Apache Airflow 的讨论都通过邮件进行。我们并不会进行内部会议,然后通知项目:“这是我们做的决定”。相反,我们向社区递交提案,接着在社区中进行讨论和决策。所以,一切的前提是保持公开透明。

    第二部分是怀着谦卑去倾听。不是因为我有答案,所以你应该同意我的观点,而是要倾听整个社区的想法,然后共同做出决策。开源领域的早期思想家之一比尔·乔伊(Bill Joy),他创办了 Sun Microsystems 公司。我一直记得他说过的一句话:**不管你在哪家公司工作,世界上最聪明的人都在别处工作。**所以,认为你的团队拥有所有答案是傲慢和短视的。最好的想法总是来自其他地方,所以更应该倾听,因为它们能给你一种新的方式思考。

    所以,倾听也是其中一个重要的部分。获取信任很难,而失去信任却很容易,所以你必须赢得社区的信任。尊重他人,礼貌和冷静地倾听,贡献自己的想法,但不要试图强迫别人接受你的观点。

    思否:你既在 AWS 工作,又在 Apache 软件基金会工作,这两者之间有哪些相似和差异?

    Rich Bowen:最显著的差异是动机。公司存在的意义是服务客户和盈利,而 Apache 社区存在的意义是为了公众生产免费软件。

    但从某种程度上,两者之间是有一些相似的地方。正如我前面提到的,顾客至尚是我们的首要领导力准则,这和开源项目是一致的。如果不专注用户,那你就失去了意义。

    对于一家想要成功的公司,无论用户是否付费,你仍必须把他们都当做你的客户。也许他们未来会付费,也许不会,但你仍需要确保你们在开发人们需要的产品,这在开源领域也是同样适用的。

    在繁荣的公司和蓬勃发展的开源社区之间还有一件不变的事物,那就是无论你在创造什么——汽车、服务还是软件——最终你交付的产品还是信任。

    您的客户是否信任你?如果他们不信任你,无论你的产品有多好,他们都会离开你,这在开源社区中也是一样的。信任永远是最重要的事情。如果你的开源社区失去用户的信任,无论产品有多好,他们都不会使用它。我们每周都会跟进一些开源项目,这些项目会在不听取社区反馈的情况下做出决策。这种不透明的做法导致了信任的缺失,使得这个项目一夜间流失了所有用户。

    思否:从基金会或者社区的角度来看,当你以处在不同角色的时候,是否存在冲突?也就是说,是否会有一种感觉,认为这样做是错误的?

    Rich Bowen:会的。当存在利益冲突的时候,重要的是坦诚面对,并保持透明。

    例如,有一些项目是我所在公司高度依赖的,我可能会想让该项目做出特定的决策。或者当我们的竞争对手参与了该项目,我可能不希望他们成功。因此,在进行这些讨论的时候,对我来说非常重要的一点是,需要坦率地表达出,我在亚马逊工作,这些是我们的利益,这些是潜在的利益冲突。在表述后,我会努力将社区的利益放在首位。

    这和之前我提到的观点有关。项目的所有参与是透明的并以上游为先,这两者都很重要。因为如果你在内部先做出决策,然后将其带到项目中,那就没有把项目的利益放在首位。但如果你专注于你的客户和用户,那么你会希望项目能成功。有一句谚语叫水涨船高,这意味着如果我使项目成功,我会帮助我的竞争对手,这是可以接受的。因为涨潮推动了我们所有人,我们一起合作这个项目。看起来我或许在帮助我的竞争对手,但我主要在帮助我的客户。

    思否:那么管理层应该关注开源的哪些方面,以及为什么这些方面尤其关键?

    Rich Bowen:我认为管理层最需要理解的一点是,开源是供应链的一部分。

    无论你的产品是什么,都需要其他地方的原材料和自然资源。如果你只是消耗,那么最终将耗尽资源。如果我们把开源看作是我们的原材料,那么我们有责任确保这一原材料源头的健康。如果你是一名木匠,你会希望确保森林始终存在,你会种植新的树木,而不仅是砍伐。因此,我试图向管理层传达,我们的责任是维持可持续性。我们有责任确保我们依赖的项目是健康的。

    历史上,有许多公司构建了开源的业务模式,却没有回馈社区,这导致了几种情况。其中一种情况是,项目可能会对你产生敌意,并寻找方法来反对你。最终,你可能会陷入这样一种情况,你在某个基础上构建了产品,但该项目可能更改了许可证,将你排除在外。

    另一种情况是,如果您不积极参与,那么在项目决策中,你就没有发言权。也许项目会朝着不符合你的利益方向发展。因此,积极参与供应链其中是至关重要的。这一点不仅在软件领域如此,对于任何业务来说都是如此。如果你依赖煤炭,那么你应该了解煤炭业务的运作方式,以便可以提前几个月或几年看到将出现的问题。这对我来说是最重要的事情。

    最后一个是信任,这又与透明有关。你需要确保与项目进行开放的沟通,并且不做出让社区感到恼火、尴尬或贬低社区的决策或营销方式。你需要给予向那些正在工作的人正确的赞誉,并按这种方式去做事。

    思否:你提到了使用和应用开源软件,这让我想到了另个话题:贡献。管理团队在使用、贡献或应用开源软件时会面临哪些挑战?又该如何解决这些挑战呢?

    Rich Bowen:我认为企业在与开源合作时面临的最大困难,我在昨天的圆桌讨论中也提到过,就是要有耐心。当你尝试在开源项目中做出决策时,需要进行讨论,而不能仅仅让你的经理说:“这就是我们要做的方式。”

    有时,你必须等待数天甚至数周才能做出决策,而这对于需要发布产品的公司来说是非常沮丧的。例如,我有一个产品发布的截止日期,还有需要在即将到来的发布会上宣布新功能。而在开源项目中,你不能这么做。这就是一个挑战,你需要向管理层解释他们为什么应该等待。

    我们以客户为导向,而用户就是我们的客户,所以我们应该等待。我们需要确保我们有时间和耐心等待用户的反馈。当我对一个新功能有了很好的想法,我会感到兴奋并想要推出它,然而用户认为这不是一个好主意,那么最终这个功能将失败,所以我们需要等待。你甚至可以将其当作为市场研究,而来自社区的用户反馈是值得等待的。参与项目的开发人员代表了他们自己,他们是最了解产品也是最有经验的用户。所以我们必须确保他们在决策过程中,而这使得和管理层沟通截止日期的问题变得很难。

    思否:管理层代表着公司,和开源其实是有天然的冲突。那么,你将如何说服管理层,理解开源的概念有助于策略调整以实现业务目标?

    Rich Bowen: 回到之前的问题,我认为让他们理解原材料和供应链是很有用的隐喻:如果我们售卖牛奶,那就不应杀掉奶牛。

    如今,有些人会说,“那我们应该买下奶牛,不理会农民,我们应该自己做这些事情。”对于一家企业来说,理解自己在哪些领域有独特的优势,以及舍弃哪些领域是很重要的。因此,你可以在共同的领域进行合作,而专注于具有独特优势的领域。

    例如,AWS 完全致力并擅长托管网络服务。我们在世界各地都有数据中心,我们拥有庞大的规模、快速的网络和才华横溢的系统管理员。但我们运行的软件是由全世界和整个社区共同开发的,我们与他人分享这些资源。然后,我们专注于我们独特擅长的领域。

    我在红帽工作了九年。红帽并不是一家软件公司,它出售技术支持服务而不是软件。我会建议销售人员不要强调自己是世界上最优秀的软件生产商,因为软件是由社区共同开发的,而我们擅长的是销售支持服务。这是我在红帽工作期间思考了很久得出的结论,而在AWS也有着相似的情况。

    你可以访问 Rich 的博客 DrBacchus.com,了解更多关于他对于开源的想法和见解。

    作者: 大花

    Anne Zhu is the community manager of Answer, SegmentFault. 大花是思否旗下开源问答软件 Answer 的社区经理。

    \ No newline at end of file diff --git a/post/introduce_of_apache_dolphinscheduler_incubating/index.html b/post/introduce_of_apache_dolphinscheduler_incubating/index.html index 8be7b97d..3766d279 100644 --- a/post/introduce_of_apache_dolphinscheduler_incubating/index.html +++ b/post/introduce_of_apache_dolphinscheduler_incubating/index.html @@ -1,6 +1,6 @@ -DolphinScheduler介绍 · ALC Beijing

    DolphinScheduler介绍

    DolphinScheduler介绍

    DolphinScheduler,简称”DS”, 中文名 “小海豚调度”(海豚聪明、人性化,又左右脑可互相换班,终生不用睡觉)。希望 DolphinScheduler 就像它的名字一样,成为一个“开箱即用”的灵活易用的调度系统。

    1概述

    DAG 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。

    Apache DolphinScheduler(目前处在孵化阶段)是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。

    DolphinScheduler是2019年开源的一个调度系统,在去年美国时间2019年8月29号,分布式任务调度引擎DolphinScheduler(原EasyScheduler)正式通过顶级开源组织Apache基金会的投票决议,以全票通过的优秀表现正式成为了Apache孵化器项目!

    2背景

    在2017年,易观在运营自己6.8Pb大小、6.02亿月活、每天近万个调度任务的大数据平台时,受到ETL复杂的依赖关系、平台易用性、可维护性及二次开发等方面掣肘,易观的技术团队渴望找到一个具有以下功能的数据调度工具:

    易于使用,开发人员可以通过非常简单的拖拽操作构建ETL过程。不仅对于ETL开发人员,无法编写代码的人也可以使用此工具进行ETL操作,例如系统管理员和分析师; +DolphinScheduler介绍 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    15 +Mar 2020

    DolphinScheduler介绍

    DolphinScheduler介绍

    DolphinScheduler,简称”DS”, 中文名 “小海豚调度”(海豚聪明、人性化,又左右脑可互相换班,终生不用睡觉)。希望 DolphinScheduler 就像它的名字一样,成为一个“开箱即用”的灵活易用的调度系统。

    1概述

    DAG 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。

    Apache DolphinScheduler(目前处在孵化阶段)是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。

    DolphinScheduler是2019年开源的一个调度系统,在去年美国时间2019年8月29号,分布式任务调度引擎DolphinScheduler(原EasyScheduler)正式通过顶级开源组织Apache基金会的投票决议,以全票通过的优秀表现正式成为了Apache孵化器项目!

    2背景

    在2017年,易观在运营自己6.8Pb大小、6.02亿月活、每天近万个调度任务的大数据平台时,受到ETL复杂的依赖关系、平台易用性、可维护性及二次开发等方面掣肘,易观的技术团队渴望找到一个具有以下功能的数据调度工具:

    易于使用,开发人员可以通过非常简单的拖拽操作构建ETL过程。不仅对于ETL开发人员,无法编写代码的人也可以使用此工具进行ETL操作,例如系统管理员和分析师; 解决“复杂任务依赖”问题,并且可以实时监视ETL运行状态; 支持多租户; 支持许多任务类型:Shell,MR,Spark,Flink,SQL(mysql,postgresql,hive,sparksql,clickhouse等),DataX,Sqoop,Python,Sub_Process,Procedure等; @@ -27,6 +27,4 @@ Apache 社区是一个公开、平等、精英治理的社区;Apache更多的是给一个思路,很多时候没有一个固定的规则和流程。。。”

    感谢吴晟老师、史少峰老师、陈亮老师、Furkan Kamaci老师和Kevin Ratnasekera老师。 感谢每一位使用过DS的用户、每一位参与过DS社区贡献的伙伴,感谢你们愿意牺牲自己宝贵的时间与我们一同前行,一个star,一个issue, 一篇文章、一行代码、一封邮件列表,参加一场meetup的举办,这都是我们一起同在的见证!也期待更多的伙伴加入到DS社区, -我们一起披荆斩棘、一起高歌猛进!一起经历风雨、一起见证胜利!

    欢迎加入Apache dolphinscheduler 社区

    订阅邮件列表

    • 用自己的邮箱向dev-subscribe@dolphinscheduler.apache.org发送一封邮件,主题和内容任意。

    • 接收确认邮件并回复。 完成步骤1后,将收到一封来自dev-help@dolphinscheduler.apache.org的确认邮件(如未收到,请确认邮件是否被自动归入垃圾邮件、推广邮件、订阅邮件等文件夹)。然后直接回复该邮件,或点击邮件里的链接快捷回复即可,主题和内容任意。

    • 接收欢迎邮件。 完成以上步骤后,会收到一封主题为WELCOME to dev@dolphinscheduler.apache.org的欢迎邮件,至此已成功订阅Apache DolphinScheduler(Incubating)的邮件列表。

    如何成为 ALC Beijing的成员

    ALC Beijing 欢迎任何人的参与!不设置任何门槛,只要有意愿传播 Apache 以及开源之道的小伙伴都可以参与进来!具体的方式如下:

    • 加入我们的活动。大家可以通过关注ALC Beijing公众号获取最新的活动信息,并参加我们的线上或者线下的活动。
    • 成为ALC Beijing会员。ALC Beijing作为一个公益组织,需要大量的志愿者的来帮助协调和组织活动。志愿者成为会员的原则和Apache软件基金的其他项目发展Committer以及PMC成员的方式一样, 基于志愿者在社区中的贡献,采用投票邀请方式成为ALC Beijing 会员。

    参考链接

    [1] https://dolphinscheduler.apache.org/zh-cn/index.html

    [2] https://www.infoq.cn/article/SeODu1bwlyjCUR70t6KD

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +我们一起披荆斩棘、一起高歌猛进!一起经历风雨、一起见证胜利!

    欢迎加入Apache dolphinscheduler 社区

    订阅邮件列表

    • 用自己的邮箱向dev-subscribe@dolphinscheduler.apache.org发送一封邮件,主题和内容任意。

    • 接收确认邮件并回复。 完成步骤1后,将收到一封来自dev-help@dolphinscheduler.apache.org的确认邮件(如未收到,请确认邮件是否被自动归入垃圾邮件、推广邮件、订阅邮件等文件夹)。然后直接回复该邮件,或点击邮件里的链接快捷回复即可,主题和内容任意。

    • 接收欢迎邮件。 完成以上步骤后,会收到一封主题为WELCOME to dev@dolphinscheduler.apache.org的欢迎邮件,至此已成功订阅Apache DolphinScheduler(Incubating)的邮件列表。

    如何成为 ALC Beijing的成员

    ALC Beijing 欢迎任何人的参与!不设置任何门槛,只要有意愿传播 Apache 以及开源之道的小伙伴都可以参与进来!具体的方式如下:

    • 加入我们的活动。大家可以通过关注ALC Beijing公众号获取最新的活动信息,并参加我们的线上或者线下的活动。
    • 成为ALC Beijing会员。ALC Beijing作为一个公益组织,需要大量的志愿者的来帮助协调和组织活动。志愿者成为会员的原则和Apache软件基金的其他项目发展Committer以及PMC成员的方式一样, 基于志愿者在社区中的贡献,采用投票邀请方式成为ALC Beijing 会员。

    参考链接

    [1] https://dolphinscheduler.apache.org/zh-cn/index.html

    [2] https://www.infoq.cn/article/SeODu1bwlyjCUR70t6KD

    \ No newline at end of file diff --git a/post/new-asf-board-of-directors-2020/index.html b/post/new-asf-board-of-directors-2020/index.html index 125f8632..277bb587 100644 --- a/post/new-asf-board-of-directors-2020/index.html +++ b/post/new-asf-board-of-directors-2020/index.html @@ -1,3 +1,2 @@ -Apache 软件基金会2020年度董事会成员介绍 · ALC Beijing

    Apache 软件基金会2020年度董事会成员介绍

    在上周 Apache 软件基金会(下称 ASF )举行了成员会议,嗯,没错,就是一年一度的董事会选举会议,会议上以下个人成员组成了新的董事会:

    • Shane Curcuru (连任董事)
    • Bertrand Delacretaz(原董事)
    • Roy Fielding(原董事)
    • Niclas Hedhman(新任董事)
    • Justin Mclean(新任董事)
    • Craig Russell (连任董事)
    • Sam Ruby(原董事)
    • Patricia Shanahan (新任董事)
    • Sander Striker (原董事)

    同时,ASF 要非常感谢去年的董事成员:Danny Angus、Rich Bowen、Ted Dunning、Dave Fisher、Myrle Krantz、Daniel Ruggeri、以及 Roman Shaposhnik,感谢他们卓越的服务。

    让我们再次欢迎新任的董事,以及回归的董事们!

    有关 ASF 治理的概述以及ASF董事会、执行官和项目/委员会副主席的完整列表,请访问:http://apache.org/foundation/

    更多关于 Apache 基金会的组织结构和运转方式,请移步:Apache 是如何运作的?

    原文链接

    Announcing New ASF Board of Directors

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache 软件基金会2020年度董事会成员介绍 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    03 +Apr 2020

    Apache 软件基金会2020年度董事会成员介绍

    在上周 Apache 软件基金会(下称 ASF )举行了成员会议,嗯,没错,就是一年一度的董事会选举会议,会议上以下个人成员组成了新的董事会:

    • Shane Curcuru (连任董事)
    • Bertrand Delacretaz(原董事)
    • Roy Fielding(原董事)
    • Niclas Hedhman(新任董事)
    • Justin Mclean(新任董事)
    • Craig Russell (连任董事)
    • Sam Ruby(原董事)
    • Patricia Shanahan (新任董事)
    • Sander Striker (原董事)

    同时,ASF 要非常感谢去年的董事成员:Danny Angus、Rich Bowen、Ted Dunning、Dave Fisher、Myrle Krantz、Daniel Ruggeri、以及 Roman Shaposhnik,感谢他们卓越的服务。

    让我们再次欢迎新任的董事,以及回归的董事们!

    有关 ASF 治理的概述以及ASF董事会、执行官和项目/委员会副主席的完整列表,请访问:http://apache.org/foundation/

    更多关于 Apache 基金会的组织结构和运转方式,请移步:Apache 是如何运作的?

    原文链接

    Announcing New ASF Board of Directors

    \ No newline at end of file diff --git a/post/page/1/index.html b/post/page/1/index.html deleted file mode 100644 index 10355f37..00000000 --- a/post/page/1/index.html +++ /dev/null @@ -1 +0,0 @@ -https://alc-beijing.github.io/alc-site/post/ \ No newline at end of file diff --git a/post/page/2/index.html b/post/page/2/index.html deleted file mode 100644 index 7d954a27..00000000 --- a/post/page/2/index.html +++ /dev/null @@ -1,34 +0,0 @@ -Posts · ALC Beijing

    Apache孵化器指南表格版

    作者:狄晓晓 -项目孵化成为ASF顶级项目的步骤 详见Apache Incubator cookbook -步骤 内容 详情 1 与孵化器沟通 孵化器PMC管理孵化器,帮助项目孵化。 2 寻找领路人(champion)和孵化导师,讨论并准备孵化提案 项目要进入孵化器,需要一个领路人(Apache officer或member)和至少2-3个导师(IPMC member)(孵化过程涉及的各角色及其职责请参见Roles and Responsibilities)。 3 创建孵化提案 领路人会帮助项目准备孵化提案,该提案将用于下一步与孵化器PMC的讨论。提案可以根据模板编写,需要包含几个标准部分。

    Apache ServiceComb带您对话Apache大咖

    Apache ServiceComb带您对话Apache大咖 前言: 这是一篇两年半前的活动记录,应该最早的一批Apache项目Committer参加的Meetup,在这次会上跟大家分享了很多Apache项目孵化的相关的经验,以及开源软件商业的故事。特别值得说明的是在最近结束的ASF成员大会中,文中的有四位专家当选成为ASF董事会成员,这些经验今天看来对大家也是很有启发的。 -PMC沉睡了怎么办?首次发版项目不一定能够跑起来,甚至不一定能成功编译,一定要先把合规性问题解决!有人给项目提交Patch,我们从来不说“No“!我曾工作过的Cloudera,利用开源赚钱,至少赚到了买下Hortonworks公司的钱&hel

    Apache 软件基金会品牌使用指南

    Apache 软件基金会品牌使用指南 翻译: 王堉琛 -原文出处:http://www.apache.org/foundation/marks/ -Apache® 品牌被 200 多个 Apache 软件基金会(ASF)项目社区共享,它也是我们使命——为公众利益提供软件——的重要组成部分。本品牌使用指南为引用 Apache® 软件项目和产品提供了示例。 -重要提示: 如果您请求在域名、活动或服务中使用 Apache 品牌,则必须遵循本指南。 -术语: 项目( Projects) 是 ASF 中开发并管理软件的组织委员会(PMC)。产品( Products) 是提供给公众的软件代码和下载。在大多数情况下,Apache 项目

    Apache 下游项目的品牌使用原则

    Apache Apache 下游项目的品牌使用原则 翻译: 王福政 -原文地址: http://www.apache.org/foundation/marks/downstream.html -初稿 ~ 初稿 ~ 初稿 本下游发行品牌政策定义了希望以原始 Apache® 产品名称分发 Apache® 软件产品的下游软件发行商的要求。希望使用其他名称的发行商应遵循我们正式商标政策。 -下游发行品牌政策 Apache 软件产品由一些为其平台提供软件包的下游实体分发。例如,Docker 镜像、Linux 发行商和云平台供应商。 -Apache 软件基金会认识到这些下游发行商的重要性,并乐于看到他们在遵循这一政策的前提下,以 A

    Apache 商标使用管理原则

    Apache 商标使用管理原则 翻译: 聂帅 原文出处:http://www.apache.org/foundation/marks/ -本文档概述了允许使用 Apache® 商标的其他方的政策。 -Apache 软件基金会(ASF)拥有所有与 Apache 相关的商标,服务标志,代表我们 Apache 社区的标志,所有 Apache 项目的名称都是 Apache 的商标。 -以下信息有助于确保其他方以经许可的方式使用我们的商标和徽记,确保我们能够合法的保护我们的项目品牌,并且鼓励第三方以所批准的方式使用 Apache 软件和我们的品牌。如果您对此政策或者 Apache 商标有任何疑问,可以联系我们,并请阅读我们的商标

    Apache 项目网站商标原则

    Apache 项目网站商标原则 翻译: 王皓月 -原文地址: http://www.apache.org/foundation/marks/pmcs -本文定义了商标原则,定义了 Apache®projects 网站显示的元素,以及如何正确地对待 Apache 和其他组织的商标。PMC 商标责任还解释了 PMC 成员应该以何种方式管理项目商标。 -项目网站和 URL 原则:使用 * .APACHE.ORG Apache 项目必须在 apache.org 域上托管官方网站,包括由项目 PMC 监督的内容(包括顶级网站,下载和 Wiki),并确保 ASF 基础架构团队可以维护服务,同时告知用户该内容是官方的并且来自 AS

    Apache孵化器指南

    Apache孵化器指南 翻译:狄晓晓 -Apache孵化器是项目捐赠到ASF的入口。目前国内越来越多的开源项目通过Apache孵化器进入Apache软件基金会孵化。 -本文翻译至 https://incubator.apache.org/cookbook/,为大家介绍了项目进入Apache孵化器需要做的准备,以及孵化过程中做的工作。 -该指南与孵化器主页为大家提供了在ASF孵化项目所需的必要信息。该指南汇集了所有孵化器的相关问题,给出了孵化器目标和过程的概述,并提供了更多详细信息的链接。 -该指南内容按照项目从被接收孵化到毕业成为顶级项目(Top-Level Project,TLP)的时间顺序进行组织。 -欢迎大家通过ge

    ALC Beijing Episode #9 开源社区中的非代码贡献

    音频编辑: 周禹任 -文案: 周禹任 -内容梗概 在开源社区中,除了代码贡献之外,非代码贡献同样也有着十分重要的作用。两者相辅相成,才能一起构建起更加蓬勃的社区。本期节目中,ALC Beijing 邀请到了两位在校的大学生嘉宾,她们都是以非代码贡献者身份分别加入到 CHAOSS 和 Apache 的社区当中。她们在融入社区的同时,也丰富了自身的经历并获得了成长。 -那么在本期节目中,就让我们一起来聊一聊大学生究竟该如何参与到开源社区中,以及她们在开源社区中都能得到哪些收获。通过与他们的对谈,我们也可以对开源社区中的非代码贡献的方式及其对社区的意义有一个更深的了解。 -时间线 时间区间 精彩话语提炼 03:1

    ALC Beijing Episode #8 Apache ECharts 孵化之路

    音频编辑: 余梓寒 -文案: 姜宁,余梓寒 -内容梗概 作为一个前端开发人员,你在制作各种报表的时候,一定离不开一个非常棒的project,那就是Apache ECharts。Apache ECharts 用 JavaScript 编写,基于支持 Canvas 和 SVG 的 ZRender 渲染引擎,提供了一系列动态的、高度可定制的图表类型,包括线图、柱图、散点图、饼图、雷达图、K 线图、仪表图、漏斗图、热力图等。最新发布的Apache ECharts 5 通过在动画叙事、优化的可视化设计、交互体验、性能提升、开发体验、国际化、可访问性等方面的 15 项新功能和改进,让开发者更容易讲述数据背后的故事。 -最近 Apa

    从初识社区到融入社区

    推荐语:夏小雅是华东师范大学数据学院的在读研究生,也是X-lab成员之一。我认识小雅还是在去年年初的时候,我和她聊了一下她选的ServiceComb的实践项目,当时能感觉得到她参与开源的经验还很少;后续在CHOASS 项目例会中发现她逐渐活跃起来,逐步在社区中找到自己的位置了;在刚刚结束的 CHOASS Shanghai Meetup,小雅忙前忙后俨然成为一个在 CHOASS 社区很相当活跃的活动组织者。 -&ndash; ALC Beijing 发起人 姜宁 -CHAOSS CHAOSS(Community Health Analytics Open Source Software)是Linux基金会下专注于开源社

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file diff --git a/post/page/3/index.html b/post/page/3/index.html deleted file mode 100644 index e0c41a37..00000000 --- a/post/page/3/index.html +++ /dev/null @@ -1,19 +0,0 @@ -Posts · ALC Beijing

    ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享

    内容梗概 在校大学生作为开源贡献者参与到顶级开源项目中,这对很多同学来说是一件很遥远而又陌生的事情。“不知道如何参与开源项目”、“不知道如何玩转社区”、“不知道如何和社区成员交流沟通”等问题,将跃跃欲试的同学们拦在开源项目的大门之外。 -2020年暑假,中科院软件所发起来了一个非常好的学生暑期实习计划&ndash;“点亮计划暑期2020”。这个计划鼓励研究人员、开源爱好者、在校师生参与开源软件的开发与维护,促进开源软件在国内的发展和优秀开源软件社区建设,增加开源项目在国内的活跃度,在开源领域与世界接轨。 这次“点亮计划暑期2020”通过开源社区导师出题,在校学生根据导师出的题目题目进行方案设计并提向导师提起项目申请

    ALC Beijing Episode #6 IoTDB 背后的科研故事(上)

    内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 03:16 本次嘉宾的自我介绍 03:20~~ 05:36 创立IoTDB的原因 05:50~~ 09:00 为什么IoTDB会开源 09:12~~

    ALC Beijing Episode #6 IoTDB 背后的科研故事(下)

    内容梗概 一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。 -时间线 时间区间 精彩话语提炼 00:10 ~~ 02:16 信息分享的同时要有很多的检索机制来查找 03:00~~ 05:11 高校是开源事业发展的沃土 05:12~~ 10:00 IoTDB 进入Ap

    暑期 2020 活动学生(张可)心得分享

    引言 如果能结合自己的科研学习述求参与到实际的开源项目中,既能为自己的后续的科研工作助力,又能在开源社区结识到一群志同道合的小伙伴,并且还能得到项目导师的指导,同时还能有一定的经济收益。 -暑期2020涌现出来了很多优秀的学生和导师, 这次 ALC Beijing 特别邀请张可给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期 2020 的导师同学的访谈播客,敬请关注。 -今年暑假期间我参加了开源软件供应链点亮计划—暑期 2020 的活动,在这个活动中,我主要参加了 Apache SkyWalk

    暑期2020活动心得分享

    引言 暑期2020涌现出来了很多优秀的学生和导师, 这次ALC Beijing 特别邀请江华禧给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期2020的导师同学的访谈播客,敬请关注。 -背景 我是一个热爱编程、热爱技术的人,⼀直以来都向往着能参与到开源项⽬中锻炼⾃⼰,但当我面对庞大而复杂的项目代码时,却感到手足无措,不知该从何开始。⽽此次的“开源软件供应链点亮计划-暑期2020”活动则正好提供了这样⼀个机会:清晰的任务要求、开源社区成员作为导师提供指导以及一笔丰厚的奖金,让我顺利地踏上了开源

    ALC Beijing 活动: Apache PMC 亲自教你系列

    目的 在诺大一个中国,开源的相关运转机理、成功方法等还是一片荒芜,ALC Beijing 不仅要怯魅,还得防止复魅。在接下来的2021年,我们特别每月推出一次在线的指导和交流,内容涵盖进入Apache的方方面面,包括但不限于: -进入apache 软件基金会的开源项目有何附加值? 开源或闭源项目如何加入Apache软件基金会孵化? 成为Apache Member 是一种什么体验? 如何让我的patch 被Apache 项目接受? 如何选择一个Apache开源项目进行贡献? &hellip;&hellip; 准备条件 一台安装有Zoom软件的接入互联网的终端设备,以及安静的角落。 -即将播出,在线交流 主题

    亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?

    作者:赵禹光 -简介: 2020年11月14日Apache SkyWalking 2020 DevCon由贝壳找房和tetrate赞助,Apache SkyWalking、云原生、Apache APISIX、Apache Pulsar 和 ALC Beijing 五大社区合作,在贝壳找房一年级会议室盛大举行,本次活动主要面对Apache SkyWalking的使用者、开发者和潜在用户。线上线下共有230多人报名。经统计,实际参加活动人数超过130人,近60%的人愿意抽出自己的休息时间,来交流学习Apache SkyWalking和开源文化。不难看见,在可预见的未来,中国的开源项目很快将进入下一个维度,那必定是更广的

    ALC Beijing Episode #5 : 内源 InnerSource

    内容梗概 开源越来越重要,而且在不断的吞噬着企业的软件技术栈,有的研究机构甚至得出的结论是超过95%都是开源,越来越多的软件开发者把开源的优秀实践带到企业内部。Tim OrReilly在2000年的时候发明了内源 (InnerSource)这个词,用来解释这一现象。 根据维基百科的定义,内源就是使用了开源软件开发的最佳实践,在组织内部建立起了一种类似开源的文化氛围。组织内部使用了开放的方式开发专有软件。 -为了让帮助大家进一步了解与内源相关的信息,ALC Beijing 播客邀请到有着多年开源以及内源经验的专家谭中意和我们聊一下内源这个话题。 -时间线 时间区间 精彩话语提炼 00:00:10 - 00

    我与开源的那些事儿

    我与开源的那些事儿。 很幸运!!!是的,很幸运,除了幸运,我不知道该怎么形容我和 开源 的缘分。感觉就好像在冥冥之中,肯定会走上这条道路一样。 -缘起 2020注定是特别的一年,年初,谁也没想到,一场疫情把我们牢牢的困在家里,哪也去不了。。说实话,或多或少有点抱怨吧。但伴随而来的,是一场灾难。那个时候每天一早醒来,看见手机屏幕刷新的数据,冰冷的可怕,红线一直在升。。。当时就在想,为什么我不是学医的,待在家里什么都做不了,似乎捐钱变成了最可悲的方式。 -偶然一次,在知乎上看见关于开发者抗疫的活动——“Wuhan2020”。学计算机专业的我,本身就对技术方面的文章也比较感兴趣,就随手点了进去。( 其实当时内心所想的是

    ASF如何准备董事会会议

    ASF旗下有三百多个项目,董事会只有9个成员,每个项目一个季度就会向董事会发送一次报告,而每个月召开一次董事会会议。 ASF每次董事会,需要处理70+个项目的报告,以及其他与基金会相关的事务。 ASF是如何保证在一个半小时的董事会中能够高效的处理这些报告的? -简单的说ASF为了提高效率,提前让各个项目PMC准备报告,并且开发了一套专门的IT系统whimsy来处理和追踪与董事会议相关的内容。 -本文翻译至 https://www.apache.org/foundation/board/meeting -董事会使用各种工具,并依靠Apache项目的志愿者来确保每月的会议顺利进行。这是一份关于每个月度董事会会议的经典时间表

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file diff --git a/post/page/4/index.html b/post/page/4/index.html deleted file mode 100644 index 1d344717..00000000 --- a/post/page/4/index.html +++ /dev/null @@ -1,23 +0,0 @@ -Posts · ALC Beijing

    增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)

    引言 最近的一次数据统计: -序号 项目名称 进入孵化器时间 毕业时间 ppmc/pmc人数 commiter人数(包含ppmc/pmc) 1 Kylin 2014年11月 2015年11月 23 39 2 Eagle 2015年10月 2016年12月 16 18 3 HAWQ 2015年9月 2018年8月 45 68 4 CarbonData 2016年6月 2017年4月 13 25 5 RocketMQ 2016年11月 2017年9月 13 26 6 Griffin 2016年12月 2018年11月 18 20 7 Weex 2016年11月 14 26 8

    文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)

    引言 开源发展至今,来自community 的力量是无法忽视的,甚至有的观点认为,开源的核心就是开源community。我们在上篇: -增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇) 介绍 在Apache孵化项目的过程,需要做什么,以及如何避免走弯路,并给出了完美的实践。Apache SkyWalking的 VP 吴晟先生在 ApacheCon 2020 的Keynote分享上,明确的指出了摆在本土面前重要的障碍之一就是:共同体建设,如何吸引来自全球的开发者,不仅在语言上,更多在文化上有非常大的挑战。 -在COSCon‘2020 + Apache 中国路演的论坛上,我们看

    追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)

    引言 没有什么好说的,从分布式系统到调度器,再到可观察性,以及数据可视化,当然还有消息队列,大数据处理、IoT。 -让更多的人知道项目,才可能从这些人中转化为用户,用户中可能筛选出贡献者,进而形成良性循环,这大概是所有开源项目的期望。 -以下技术内容,因为缺少对比,仅仅在此给大家罗列出来目前在本土所分享的关于技术议题,没有逻辑、没有分类、没有主线,唯一的相似之处就是这些项目是捐赠给了Apache软件基金会,以Apache之道的方式在运作,技术水平如何,解决了用户什么问题,请详细阅读。或者来COSCon的现场聆听。 -项目在生产环境中的落地 本次分享首先会介绍DolphinScheduler社区的发展情况,然后会介绍我们

    正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲

    引言 视频地址:https://www.youtube.com/watch?v=26aFGdbZvac&amp;t=1172s ,需要稳定的网络环境。 -正文 (以下内容根据吴晟的演讲视频进行的人工文字录入,若有出入,请以原视频为准。) -Rich Bowen 介绍了吴晟的出场:Apache SkyWalking VP -大家好!欢迎来到今年的ApacheCon@Home,我加入ASF也有四年的时间了,在过去的四年中我参与和见证了很多的Apache 项目,也为很多项目做了应有的贡献,今天非常荣幸的能够在ApacheCon上和大家分享我的经验,我的分享主题是:成长中的中国本土 Apache,在正式开始之前,我还是介绍一

    ALC Beijing Episode #4 : 技术架构、Community 和康威定律

    内容梗概 软件以其飞速的发展,经过60年的发展,再也没有一个人能够写出来可以使用的软件了,尤其是以自由/开源软件项目的壮大为证,更是让人的协作提上了前所未有的高度。 这也就是说,作为软件的设计者,或者说开源的软件设计者,开始的时候应不应该考虑人与人之间的协作?甚至是以全球视野的想象力来介入,即跨时区的异步沟通为切入点? 那么我们不妨以Apache 软件基金会下众多的项目为例,甚至是以更广泛的开源项目为例,如Linux、Kubernetes等,探讨下关于康威定律是否适用? 架构和开源共同体(Community)究竟有没有关系?如果有的话,二者该如何理解?关系又该如何处理? -ALC Beijing 这次邀请到了Apa

    Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开

    Apache 官方全球大会在线会议目前共有 170+ 场演讲议题,并有来自 DataStax, IBM, Imply, Instaclustr, NASA 喷气推进实验室, 橡树岭国家实验室, Red Hat, Tetrate, Two Sigma 与 VMWare 等公司或组织的众多大咖做主题分享。 -2020 年 9 月 21日, Apache® 软件基金会(ASF),携超过 350 个开源项目的全体志愿开发者、管理员和孵化器,与主题演讲嘉宾、大会赞助商和 ApacheCon@Home 大会组委,郑重宣布:ApacheCon@Home 在线会议将于 2020 年 9月 29 日 - 10 月 1 日召开。本次

    年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!

    简介 ApacheCon 是久负盛名的开源盛宴,为开源界备受关注的会议之一,也是开源运动早期的知名活动之一,其最早的一期要追溯1998年,也是在这一届上,开发HTTPD服务的开发者们欢聚一堂,并决定成立 Apache 软件基金会。 -1998年首次ApacheCon大会照片 -[photo attribution (CC BY) Mark Cox. Tagged image at https://www.flickr.com/photos/iamamoose/63963722/in/album-1381277/ ; gallery at https://www.flickr.com/photos/iamamoose

    ApacheCon 2020 参会指南

    每年一度的 Apache北美大会因为疫情的原因转到线上来举行了, 这次会议的主题是ApacheCon@Home, 也就是说借助网络我们可以足不出户就可以参加Apache大会了。 今年的会议为了针对不同的地域特点,特地安排了不同时间段的演讲,同时还专门增加了中文的演讲,欢迎大家关注。 -下面今年ApacheCon的参会指南译自 https://apachecon.com/acah2020/guide.html,祝大家参会愉快! -前期准备 为了您在ApacheCon@Home可以得到最好的体验,我们为你准备了以下清单,这样参会者就可以提前准备。 请提前浏览以下的技术要求和参会前可以准备的事项,这样就不需要在会议的过程中

    到底什么是The Apache Way?

    到底什么是The Apache Way? 作者:谭中意 审核:姜宁 李健盛 我们有可能听到过很多次“The Apache Way”。可能会在某个Apache基金会项目的分享会上,它宣称它的日常工作遵循“The Apache Way”;也有可能在某个InnerSource的分享会上,宣称内部开源就是在企业内部推行“The Apache Way”;也有可能在Apache基金会的报告上或者文档上,看到apache基金会的治理遵循“The Apache Way”。那么“The Apache Way”究竟是什么?我们如何来应用它? -我们先看一看Apache开源基金会对此的解释。从它的官网 https://www.apa

    Podcast Episode #0 : ALC Beijing Podcast 的承诺

    内容梗概 你是如何去发现一件事情的价值的?又如何挖掘其意义的?知识该如何传播?文化该如何习得?Apache 之道作为哲学思想,甚至都找不到一条具体如何去做的规定,又怎么能指导他人了呢? -本期ALC Beijing Podcast ,三位常驻主持人,和大家聊一聊这款播客节目的基调、准则、做事方式,以及一个不那么正式的一个承诺:我们希望以这样的方式,生产高质量的知识,供有缘人学以致用!重要的是听众你的反馈和参与,才是赋予我们节目的真正活力!我们不期望是说我们想说的,而是希望能提供听众想听的。 -时间线 00:10 ~~ 01:10 本期播客的由来 -01:15 ~~ 02:40 三位主持人的自我介绍。(此处有猛料!) -0

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file diff --git a/post/page/5/index.html b/post/page/5/index.html deleted file mode 100644 index e9d2c23a..00000000 --- a/post/page/5/index.html +++ /dev/null @@ -1,30 +0,0 @@ -Posts · ALC Beijing

    ALC Beijing Meetup #1 嘉宾和主题介绍

    主持人 潘娟: -江湖人尊称为“娟神”,京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Membe。才艺俱佳! -Hold 全场! -暖场嘉宾 姜宁 华为开源软件中心技术专家,前红帽软件首席软件工程师,Apache软件基金会成员,Apache软件基金孵化器导师,参与了绝大多个中国发起的Apache基金会项目的孵化。本人06年开始加入到Apache社区项目开发,就被社区开放协作的氛围深深吸引,成为开源深度信徒。现在致力于开源社区建设,以及开源文化推广,尽其所能帮助国内开源项目成功。 -主题分享嘉宾1 李钰 Apache Flink 社区 PMC 成员, Apa

    ALC Beijing 活动

    ALC Beijing 成员采访之李岗: 用青春谱写开源

    内容梗概 来自Apache DolphinScheduler (孵化中)项目的李岗,年轻、对开源充满激情和憧憬,这次参与到ALC Beijing来,也是灌注了满满的热爱和斗志!本次采访将为大家展现一下这位用青春赌上开源梦想之路的大男孩。 -时间线 01:00 ~~ 01:20 李岗自我介绍 -01:20 ~~ 03:10 是如何接触到开源的,然后工作后自然而然的选择开源。感到非常幸运的是参与Apache的项目。 -03:30 ~~ 04:10 从上学到工作,中间所经历的开源共同体的经历。 -04:15 ~~ 09:00 Apache 文化中的个人与公司的见解,自己在经历成长的过程中遇到了那些坑。 -09:10 ~~ 11:

    Apache基金会项目孵化过程中知识产权转移的讨论

    Apache软件基金会项目孵化过程中知识产权转移的讨论 作者:张伟玲 谭中意 审核:姜宁 张亮 作者简介: 张伟玲,多年大型互联网知识产权法律经验,擅长商标、开源、著作权等知识产权法律领域的合规制度建设、 培训和诉讼支持,在互联网信息网络传播/合规/品牌等领域有丰富实战经验。 -讨论背景: 自2002年Apache Software Foundation(ASF)开始孵化项目以来,ASF至今已经毕业了200多个顶级项目。在这些项目中,无论是个人捐赠还是企业捐赠的,都必须严格遵守其孵化流程和政策要求。尤其是近几年来,越来越多的国人发起的开源项目进入Apache基金会孵化,并有不断的项目毕业,Apache开源基金会

    Apache APISIX 的快速之旅(全文版)

    引言 本周我们推出了 Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版),为了能够让更多的习惯于文字阅读的成员们熟悉我们的故事,特别推出了全文实录的文字版,请笑纳! -Apache APISIX 或 APISIX 在下文中均指称:Apache APISIX。 -正文 适兕主持人: -Hello,大家好,欢迎来到ALC 北京 PodCast。这次我们请到的是 APISIX 的核心成员,请各位嘉宾跟我们听众打个招呼。 -温铭: -大家好,我是温铭,Apache APISIX的PPMC成员。我之前是在互联网公司工作了有10年,主要是在做安全方向,然后最近三年都是在做开源软件的商业化

    Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)

    内容梗概 Apache APISIX 在2019年10月份进入了 Apache 软件基金会孵化器,到现在(采访期2020年六月)有7个多月的时间,就做了多达 6 次的 release 发布,也就是说差不多是每个月就会发布1个release,在进入Apache之前,APISIX 只有20多位contributor,截止到现在,已经拥有了80多位committer,在如此之短的时间内,Apache APISIX 是如何做到的?是什么样的魔力,让Apache APISIX 项目、团队、Community 有这么快的加速发展了呢? -请仔细聆听,两位创始人和一位导师的精彩分享。 -时间线 时间区间 妙语连珠 0

    越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺

    引言 2020年过去了一半了,这半年过的猝不及防,过的胆战心惊,让所有人都明白自身的脆弱。开源亦无幸免,尽管在远程协作上,开源有着由来已久的擅长,但是疫情仍然阻止了开源人最为重要的活动—— 线下见面会。 -我们所有人,依然要坚强的抵抗这次疫情,作为开源的一份子,能做到就是继续倡导合作的重要性,即使无法见面,我们可以通过互联网来实现沟通、协作,正如开源世界一直以来都在做的这样。而且要充分的利用互联网的全球性、世界性、跨地域的特性。当然,众所周知,全球性的沟通面临更多的问题:时区、即时、语言、文化等等。 -就Apache 软件基金会而言,作为一家慈善的非营利组织,20多年来一如既往的推动着基于来自全球各地的开发者共同协作

    Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激

    内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 01:00 ~~ 06:30 本次参与嘉宾的个人自述,各有精彩! -07:00 ~~ 10:00 灵魂拷问:在座的 ShardingSphere 成员是如何凝聚(bonding)在一起的,发起人张亮不正经回答。 -10:00 ~~ 13:00 Zhyee 的结识、加入分享,强调开源协作的重要 -1

    Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apache

    内容梗概 2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程! -时间线 00:00 ~~ 02:00 张亮谈开源初心, 开源让技术更为优雅、极致,开源的组织让我们走的更远! -02:10 ~~ 08:30 金卫个人的开源历程,全职做开源梦想成真! -12:00 ~~ 14:30 ShardingSphere 从个人项目到 Apache TLP 中间发生了哪些关键的跃

    【Apache 博客】之 冠状病毒肆虐之下的远程协作

    ALC Beijing 引言 2020年,对于世界上所有的人都是一场灾难,在刚刚开完的两会,国家希望通过地摊经济来复苏中华大地的经济繁荣,当然这在日常的小商品、食物等方面还可以,那么信息经济下,过去一直都在一个屋檐下工作的人,突然变成了在线会议的方式,一定会出现一定不适应,甚至会出现效率低下。这个时候,最应该考虑的就是开源的协作模式!当然,ASF 以其独特的完全虚拟享誉全球!值得学习的地方实在是太多了。 -前序 我(Marvin Humphrey)是在2005年”抵达“ ASF (Apache 软件基金会的简称,下同) 的,起因是我对 Apache Lucene 的一个Bug有了严重的不满情绪,之所以使用“抵达”

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file diff --git a/post/page/6/index.html b/post/page/6/index.html deleted file mode 100644 index 049ea06c..00000000 --- a/post/page/6/index.html +++ /dev/null @@ -1,23 +0,0 @@ -Posts · ALC Beijing

    英雄之旅-行走在开源领域的一个自叙故事

    作者介绍 潘娟,京东数科高级DBA&amp;Apache ShardingSphere PMC,主要负责京东数科分布式数据库开发、数据库运维自动化平台开发等工作。曾负责京东数科数据库自动化平台设计与开发,现专注于Apache ShardingSphere分布式数据库中间件平台的开发。主要在分布式数据库、开源、分布式架构等相关领域进行探索。多次受邀参加数据库&amp;架构领域的相关会议并进行分享交流。 -前序 《英雄之旅》是由美国神话学家约瑟夫·坎贝尔提出的。好莱坞很多经典IP巨作即是把《英雄之旅》的套路搬上了巨幕。 -最近在读一些心理学书籍,随即发现我们每个人的一生都是一场英雄之旅。从被使命召唤、踏上艰辛的考验

    Podcast Episode #1:Apache SkyWalking 那些事

    内容梗概 个人项目、Apache TLP、潇洒的创始人、众多的客户、多个云厂竞相支持、中国本土、APM骨灰级玩家&hellip;&hellip;.拥有众多光环的 SkyWalking ,究竟有何神奇的魔力?在短短的几年内迅猛发展,在竞争如此激烈的APM 市场,获得无数的拥泵! ALC Beijing Podcast 首秀,诚挚邀请到 Apache SkyWalking的创始人、主要的贡献者来聊聊 SkyWalking的酝酿、命名、开发、开源、建设Community、收获用户、发展壮大、进入Apache、孵化、成为TLP、下一代版本、如何维护的。我们就是来不正经地“八卦” Apache 开源项目背后故事! -Sky

    ALC Beijing 志愿者招募

    Open source is changing the world. And if you want to be a part -of that change, all you have to do is participate. Jason Hibbets《 the foundation of an open source city》 -什么是 ALC? ALC是Apache Local Community的缩写,是全世界范围的 Apache 开源爱好者本地群组。 因为是本地组织,ALC 是按照城市或地区的方式进行划分的,类似的机构还有 GDG (Google Developer Group), Faceb

    Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路

    作者介绍 -潘娟,京东数科高级DBA,Apache ShardingSphere PMC 张亮,京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目Elastic-Job作者 -前序 从Sharding-JDBC到Apache ShardingSphere; 从轻量级的分库分表中间件到完整闭环的分布式数据库中间件平台; 从2016年1月的第一行代码到现今的300K+行代码; 从寥寥无几的关注到GitHub 10K+的star; 从无人问津的社区到100+位贡献者; 从公司内部的应用类库到100+的采用公司列表; 从寻找mentor到顺利成为Apa

    为何Apache软件基金会能孵化出如此多成功的开源项目

    ASF基金会的项目来源分为个人捐献项目和公司捐献项目。这两者在进入Apache基金会之后,并不做过多的区分。总体而言,虽然很多传奇的开源项目有个人英雄主义色彩,但也不乏有很多公司捐献的项目获得了巨大的成功(Hadoop, Spark, Kafka等)。那么问题来了,为什么ASF需要设置孵化器项目呢? -孵化器项目的必要性 ASF基金会有统一的开源治理原则与规则(被称为Apache Way, 具体请参考:https://www.apache.org/theapacheway) 来保障开源软件的质量以及开源社区的健康发展。而企业和个人捐献的项目可能五花八门,从而产生巨大的Gap。这个差距可能会包括:开发流程,基础设施支

    ASF公司架构和治理

    公司治理 总的来看,Apache软件基金会(ASF)的治理相当简单:由成员(Member)来选举董事会;董事会任命各种管理人员并创建PMCs;PMCs定期向董事会报告,大多数其他管理人员向总裁汇报,然后总裁向董事会报告。 -组织架构和职责 为了更好的管理公司,ASF建立了如下组织架构: -现有成员(Member)会定期提名和选举新成员,每年提名并选举9名董事加入董事会。 -董事会任命业务官员,并将特定政策或业务领域的责任分配给每位官员。例如,法律事务委员会副总裁负责为ASF和所有Apache项目设置法律政策,并与公司顾问进行合作。 -董事会任命执行官,包括总裁,秘书,财务总监等,他们负责ASF的特定领域运营

    Apache 软件基金会2020年度董事会成员介绍

    在上周 Apache 软件基金会(下称 ASF )举行了成员会议,嗯,没错,就是一年一度的董事会选举会议,会议上以下个人成员组成了新的董事会: -Shane Curcuru (连任董事) Bertrand Delacretaz(原董事) Roy Fielding(原董事) Niclas Hedhman(新任董事) Justin Mclean(新任董事) Craig Russell (连任董事) Sam Ruby(原董事) Patricia Shanahan (新任董事) Sander Striker (原董事) 同时,ASF 要非常感谢去年的董事成员:Danny Angus、Rich Bowen、Ted Dun

    ASF年度大会程序

    ASF年度大会程序 ASF至少每13个月举行一次年度成员大会,选举新的董事会,并对新的候选人进行投票。ASF年度会议由成员志愿者按照以下基本程序进行。 -[说明] 本篇参考[1]内容进行编写,部分措辞和语言组织略有调整,但保证内容含义的严格一致性。ASF虽然是一个非盈利组织,但是ASF是以公司化的方式进行运作的,有股东,董事会,还有执行机构,也有一些其他的雇员。本文中所提到的ASF年度大会算的是股东大会。 -目录 听众 会议机制-IRC沟通 成员候选人投票 如何计算成员投票 怎样决定如何对成员候选人进行投票 董事会投票 如何计算董事会投票 怎样决定如何对候选进行上投票 听众 本文档是ASF召开正式成员

    如何成为合格的ASF贡献者

    阿里土话 ASF是一个开源组织,他有自身的文化,阿里是一个要活好102年的公司,其文化底蕴非凡!分享ASF之前总想或多或少的和大家分享一些阿里的味道! -给世界带来微小而美好的改变 把幸运种子种到别人身上去,你才会有幸运 Never, Never, Never Give Up(永不放弃) 没错,阿里人看到上面的三句话会倍感亲切,因为上面三句都是 “阿里土话”。虽然是阿里土话,但我认为其有放诸四海而皆准的魅力!这些话,同样适用于激发和指导你成为合格的开源贡献者!不经意间看了一眼窗外,心里开心默笑,其实阿里每个角落都充满着阿里气息: -缘 其实每个人参与社区贡献的机缘不一样,但无外乎两种: -偶发事件 - 由于参

    DolphinScheduler介绍

    DolphinScheduler介绍 DolphinScheduler,简称”DS”, 中文名 “小海豚调度”(海豚聪明、人性化,又左右脑可互相换班,终生不用睡觉)。希望 DolphinScheduler 就像它的名字一样,成为一个“开箱即用”的灵活易用的调度系统。 -1概述 DAG 全称Directed Acyclic Graph,简称DAG。工作流中的Task任务以有向无环图的形式组装起来,从入度为零的节点进行拓扑遍历,直到无后继节点为止。 -Apache DolphinScheduler(目前处在孵化阶段)是一个分布式、去中心化、易扩展的可视化DAG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file diff --git a/post/page/7/index.html b/post/page/7/index.html deleted file mode 100644 index 684ac381..00000000 --- a/post/page/7/index.html +++ /dev/null @@ -1,4 +0,0 @@ -Posts · ALC Beijing
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file diff --git a/post/podcast/ep11-dolphinscheduler-community-building-road/index.html b/post/podcast/ep11-dolphinscheduler-community-building-road/index.html index c258be2a..d5f451c2 100644 --- a/post/podcast/ep11-dolphinscheduler-community-building-road/index.html +++ b/post/podcast/ep11-dolphinscheduler-community-building-road/index.html @@ -1,3 +1,5 @@ -ALC Beijing Episode #11 DolphinScheduler社区构建之旅 · ALC Beijing

    ALC Beijing Episode #11 DolphinScheduler社区构建之旅

    音频编辑: 周禹任

    文案: 周禹任

    内容梗概

    今年4月 Apache DolphinScheduler 正式毕业成为Apache顶级项目,在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。

    在这一期节目中,两位嘉宾和主持人就DolphinScheduler如何克服构建开源社区的挑战,OpenSource Community 对开源项目项目的影响,以及Community 构建之路给出了十分宝贵的经验和建议。对开源社区构建感兴趣的小伙伴们赶紧来听听吧!

    时间线

    时间区间精彩话语提炼
    03:17~~06:18Apache DolphinScheduler 是出于什么原因加入到Apache 软件基金会的?
    06:42~~13:56DolphinScheduler 在进入孵化器后遇到了哪些困难?又是如何克服的?
    14:00~~19:18社区对开源项目有什么影响,对开源项目的价值
    19:22~~34:18怎么吸引并留住社区的贡献者们
    32:30~~34:20社区构建的意义:可持续发展的项目的基石

    请收听

    ALC Beijing Podcast Episode #11:DophinScheduler社区构建之旅

    本期嘉宾

    郭炜:Apache Member,Apache DolphinScheduler PMC,前易观CTO

    代立冬:Apache DolphinScheduler PMC Chair,Apache 孵化器导师,前易观大数据平台负责人

    潘娟:SphereEx 联合创始人兼CTO, Apache member, Apache ShardingSphere PMC, 中国木兰开源社区导师。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,Apache 孵化器导师,参与孵化了多个源于中国 Apache 孵化器项目孵化。

    相关链接

    • Apache DolphinScheduler 官网:https://dolphinscheduler.apache.org
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #11 DolphinScheduler社区构建之旅 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    29 +Aug 2021

    ALC Beijing Episode #11 DolphinScheduler社区构建之旅

    音频编辑: 周禹任

    文案: 周禹任

    内容梗概

    今年4月 Apache DolphinScheduler 正式毕业成为Apache顶级项目,在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。

    在这一期节目中,两位嘉宾和主持人就DolphinScheduler如何克服构建开源社区的挑战,OpenSource Community 对开源项目项目的影响,以及Community 构建之路给出了十分宝贵的经验和建议。对开源社区构建感兴趣的小伙伴们赶紧来听听吧!

    时间线

    时间区间精彩话语提炼
    03:17~~06:18Apache DolphinScheduler 是出于什么原因加入到Apache 软件基金会的?
    06:42~~13:56DolphinScheduler 在进入孵化器后遇到了哪些困难?又是如何克服的?
    14:00~~19:18社区对开源项目有什么影响,对开源项目的价值
    19:22~~34:18怎么吸引并留住社区的贡献者们
    32:30~~34:20社区构建的意义:可持续发展的项目的基石

    请收听

    ALC Beijing Podcast Episode #11:DophinScheduler社区构建之旅

    本期嘉宾

    郭炜:Apache Member,Apache DolphinScheduler PMC,前易观CTO

    代立冬:Apache DolphinScheduler PMC Chair,Apache 孵化器导师,前易观大数据平台负责人

    潘娟:SphereEx 联合创始人兼CTO, Apache member, Apache ShardingSphere PMC, 中国木兰开源社区导师。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,Apache 孵化器导师,参与孵化了多个源于中国 Apache 孵化器项目孵化。

    相关链接

    • Apache DolphinScheduler 官网:https://dolphinscheduler.apache.org
    \ No newline at end of file diff --git a/post/podcast/episode-0-introduce-alc-beijing-podcast/index.html b/post/podcast/episode-0-introduce-alc-beijing-podcast/index.html index e8ac51c4..1869a905 100644 --- a/post/podcast/episode-0-introduce-alc-beijing-podcast/index.html +++ b/post/podcast/episode-0-introduce-alc-beijing-podcast/index.html @@ -1,3 +1,5 @@ -Podcast Episode #0 : ALC Beijing Podcast 的承诺 · ALC Beijing

    Podcast Episode #0 : ALC Beijing Podcast 的承诺

    内容梗概

    你是如何去发现一件事情的价值的?又如何挖掘其意义的?知识该如何传播?文化该如何习得?Apache 之道作为哲学思想,甚至都找不到一条具体如何去做的规定,又怎么能指导他人了呢?

    本期ALC Beijing Podcast ,三位常驻主持人,和大家聊一聊这款播客节目的基调、准则、做事方式,以及一个不那么正式的一个承诺:我们希望以这样的方式,生产高质量的知识,供有缘人学以致用!重要的是听众你的反馈和参与,才是赋予我们节目的真正活力!我们不期望是说我们想说的,而是希望能提供听众想听的。

    时间线

    00:10 ~~ 01:10 本期播客的由来

    01:15 ~~ 02:40 三位主持人的自我介绍。(此处有猛料!)

    02:50 ~~ 07:40 ALC Beijing 为什么要做Podcast? 和开发者、工程师等聊天能聊出啥?

    08:00 ~~ 14:40 Podcast的受众是谁?谁会关注ALC Beijing 这样的关注开源隐性知识的内容?

    15:00 ~~ 17:30 ALC Beijing Podcast 会呈现什么样的内容给大家了呢? 反馈就是礼物,听众的反馈至关重要。

    18:30 ~~ 24:00 和听众互动起来,才是最好的内容生产!再次呼吁大家,参与到我们的节目中来。

    24:40 ~~ 32:00 如何做才能吸引到更多的听众? 打造短视频类的及时娱乐的?还是走精心制作的深度内容? 这是个问题。

    33:00 ~~ 33:50 欢迎来“踢馆”! 我们在这里等你!

    请收听

    ALC Beijing Podcast Episode #0:Say Hello World!

    本期嘉宾: ALC BeiJing Podcast 三位常驻主持

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕:开源布道师。

    相关链接

    1. https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/
    2. https://github.com/alc-beijing/alc-site/issues/39
    3. 开源之道Talking 和 “鼠年话开源”系列 http://www.opensourceway.community/posts/opensource_talking/2020-done-and-plan-index/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每月会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Podcast Episode #0 : ALC Beijing Podcast 的承诺 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    13 +Aug 2020

    Podcast Episode #0 : ALC Beijing Podcast 的承诺

    内容梗概

    你是如何去发现一件事情的价值的?又如何挖掘其意义的?知识该如何传播?文化该如何习得?Apache 之道作为哲学思想,甚至都找不到一条具体如何去做的规定,又怎么能指导他人了呢?

    本期ALC Beijing Podcast ,三位常驻主持人,和大家聊一聊这款播客节目的基调、准则、做事方式,以及一个不那么正式的一个承诺:我们希望以这样的方式,生产高质量的知识,供有缘人学以致用!重要的是听众你的反馈和参与,才是赋予我们节目的真正活力!我们不期望是说我们想说的,而是希望能提供听众想听的。

    时间线

    00:10 ~~ 01:10 本期播客的由来

    01:15 ~~ 02:40 三位主持人的自我介绍。(此处有猛料!)

    02:50 ~~ 07:40 ALC Beijing 为什么要做Podcast? 和开发者、工程师等聊天能聊出啥?

    08:00 ~~ 14:40 Podcast的受众是谁?谁会关注ALC Beijing 这样的关注开源隐性知识的内容?

    15:00 ~~ 17:30 ALC Beijing Podcast 会呈现什么样的内容给大家了呢? 反馈就是礼物,听众的反馈至关重要。

    18:30 ~~ 24:00 和听众互动起来,才是最好的内容生产!再次呼吁大家,参与到我们的节目中来。

    24:40 ~~ 32:00 如何做才能吸引到更多的听众? 打造短视频类的及时娱乐的?还是走精心制作的深度内容? 这是个问题。

    33:00 ~~ 33:50 欢迎来“踢馆”! 我们在这里等你!

    请收听

    ALC Beijing Podcast Episode #0:Say Hello World!

    本期嘉宾: ALC BeiJing Podcast 三位常驻主持

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕:开源布道师。

    相关链接

    1. https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/
    2. https://github.com/alc-beijing/alc-site/issues/39
    3. 开源之道Talking 和 “鼠年话开源”系列 http://www.opensourceway.community/posts/opensource_talking/2020-done-and-plan-index/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每月会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    \ No newline at end of file diff --git a/post/podcast/episode-1-talk-to-skywalking/index.html b/post/podcast/episode-1-talk-to-skywalking/index.html index 9eaa62b8..d569ad9c 100644 --- a/post/podcast/episode-1-talk-to-skywalking/index.html +++ b/post/podcast/episode-1-talk-to-skywalking/index.html @@ -1,4 +1,6 @@ -Podcast Episode #1:Apache SkyWalking 那些事 · ALC Beijing

    Podcast Episode #1:Apache SkyWalking 那些事

    内容梗概

    个人项目、Apache TLP、潇洒的创始人、众多的客户、多个云厂竞相支持、中国本土、APM骨灰级玩家…….拥有众多光环的 SkyWalking ,究竟有何神奇的魔力?在短短的几年内迅猛发展,在竞争如此激烈的APM 市场,获得无数的拥泵! ALC Beijing Podcast 首秀,诚挚邀请到 Apache SkyWalking的创始人、主要的贡献者来聊聊 SkyWalking的酝酿、命名、开发、开源、建设Community、收获用户、发展壮大、进入Apache、孵化、成为TLP、下一代版本、如何维护的。我们就是来不正经地“八卦” Apache 开源项目背后故事!

    SkyWalking社区拥有来自全球的,200位以上的贡献者包括30多位以上的 Committer。SkyWalking的项目用户和贡献者来自亚洲、欧洲、北美。那么,SkyWalking的社区到底是什么样子?推进社区发展和合作的原则和背后的逻辑是什么? -​

    —— 吴晟,潇洒的程序员

    本期亮点

    • ALC Beijing 介绍
    • SkyWalking 这么酷炫的名字是从何而来的?是星球大战迷?还是信手拈来?
    • 一位”007“全职之余的贡献者,是如何在为SkyWalking贡献中获得个人娱乐和满足的
    • SkyWalking 获“友商”青睐,受邀在竞品项目的会议上分享
    • .Net 探针的相爱相亲记
    • SkyWalking 受到各大云厂商的支持和追捧
    • SkyWalking 是如何获得一位同类项目开发者的赏识,放弃原有代码,转而全力加入SkyWalking的
    • 创始人兼VP兜底自己的Merge “摸鱼”行为
    • 主要的维护者打算什么时候离开项目,彻底交出控制权?
    • 下一个版本,竟然还不知道开发什么功能?(ÒωÓױ)!

    请收听

    ALC Beijing Podcast Episode #1: Apache SkyWalking 精彩开源故事

    出场嘉宾

    潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,有十五年以上企业级开源中间件开发经验,有丰富的 Java 开发和使用经验,函数式编程爱好者。从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,先后参与 Apache CXF, Apache Camel,Apache ServiceMix,以及Apache ServiceComb的开发。2015年开始担任Apache 孵化器导师,参与孵化了 Apache Rocket, Apache Skywalking, Apache ShardingSphere, Apache iotDB, Apache Doris, Apache APISIX, Apache Weex。

    吴晟:Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member. Speak at multiple conferences, including LC3 China twice, QCon Beijing (star speaker) three times. Also be the member of Cloud Native Computing Foundation (CNCF) OpenTracing Specification Council, contribute to the OpenTracing project.

    柯振旭 : Apache SkyWalking PMC 成员, Apache Dubbo Committer, ALC Beijing Member, 阿里巴巴高级工程师, 开源爱好者;

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://skywalking.apache.org
    2. https://twitter.com/adrianfcole/status/1249856830777384962
    3. https://thenewstack.io/apache-skywalking-use-profiling-to-fix-the-blind-spot-of-distributed-tracing/
    4. https://alc-beijing.github.io/alc-site/

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Podcast Episode #1:Apache SkyWalking 那些事 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    27 +Apr 2020

    Podcast Episode #1:Apache SkyWalking 那些事

    内容梗概

    个人项目、Apache TLP、潇洒的创始人、众多的客户、多个云厂竞相支持、中国本土、APM骨灰级玩家…….拥有众多光环的 SkyWalking ,究竟有何神奇的魔力?在短短的几年内迅猛发展,在竞争如此激烈的APM 市场,获得无数的拥泵! ALC Beijing Podcast 首秀,诚挚邀请到 Apache SkyWalking的创始人、主要的贡献者来聊聊 SkyWalking的酝酿、命名、开发、开源、建设Community、收获用户、发展壮大、进入Apache、孵化、成为TLP、下一代版本、如何维护的。我们就是来不正经地“八卦” Apache 开源项目背后故事!

    SkyWalking社区拥有来自全球的,200位以上的贡献者包括30多位以上的 Committer。SkyWalking的项目用户和贡献者来自亚洲、欧洲、北美。那么,SkyWalking的社区到底是什么样子?推进社区发展和合作的原则和背后的逻辑是什么? +​

    —— 吴晟,潇洒的程序员

    本期亮点

    • ALC Beijing 介绍
    • SkyWalking 这么酷炫的名字是从何而来的?是星球大战迷?还是信手拈来?
    • 一位”007“全职之余的贡献者,是如何在为SkyWalking贡献中获得个人娱乐和满足的
    • SkyWalking 获“友商”青睐,受邀在竞品项目的会议上分享
    • .Net 探针的相爱相亲记
    • SkyWalking 受到各大云厂商的支持和追捧
    • SkyWalking 是如何获得一位同类项目开发者的赏识,放弃原有代码,转而全力加入SkyWalking的
    • 创始人兼VP兜底自己的Merge “摸鱼”行为
    • 主要的维护者打算什么时候离开项目,彻底交出控制权?
    • 下一个版本,竟然还不知道开发什么功能?(ÒωÓױ)!

    请收听

    ALC Beijing Podcast Episode #1: Apache SkyWalking 精彩开源故事

    出场嘉宾

    潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,有十五年以上企业级开源中间件开发经验,有丰富的 Java 开发和使用经验,函数式编程爱好者。从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,先后参与 Apache CXF, Apache Camel,Apache ServiceMix,以及Apache ServiceComb的开发。2015年开始担任Apache 孵化器导师,参与孵化了 Apache Rocket, Apache Skywalking, Apache ShardingSphere, Apache iotDB, Apache Doris, Apache APISIX, Apache Weex。

    吴晟:Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member. Speak at multiple conferences, including LC3 China twice, QCon Beijing (star speaker) three times. Also be the member of Cloud Native Computing Foundation (CNCF) OpenTracing Specification Council, contribute to the OpenTracing project.

    柯振旭 : Apache SkyWalking PMC 成员, Apache Dubbo Committer, ALC Beijing Member, 阿里巴巴高级工程师, 开源爱好者;

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://skywalking.apache.org
    2. https://twitter.com/adrianfcole/status/1249856830777384962
    3. https://thenewstack.io/apache-skywalking-use-profiling-to-fix-the-blind-spot-of-distributed-tracing/
    4. https://alc-beijing.github.io/alc-site/

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    \ No newline at end of file diff --git a/post/podcast/episode-10-inner-source-2/index.html b/post/podcast/episode-10-inner-source-2/index.html index d6453449..5efe07d7 100644 --- a/post/podcast/episode-10-inner-source-2/index.html +++ b/post/podcast/episode-10-inner-source-2/index.html @@ -1,3 +1,6 @@ -ALC Beijing Episode #10 谈谈内源2 · ALC Beijing

    ALC Beijing Episode #10 谈谈内源2

    音频编辑: 周禹任

    文案: 周禹任

    内容梗概

    目前,越来越多的软件开发者把开源的优秀实践带到企业内部,在组织内部建立起了一种类似开源的文化氛围。在上期关于内源的节目中,姜宁老师和谭中意老师让我们了解了内源和开源的关系,以及内源究竟是什么。

    在这一期节目中,姜宁老师,谭中意老师则对内源的话题进一步聚焦,就内源的具体适用性、责任方以及动力问题进行了详细的讨论。让我们一起听一下他们在这一期中为我们带来的精彩呈现吧。

    时间线

    时间区间精彩话语提炼
    03:10~~08:50什么样的项目适合以内源的方式在公司内部开源
    09:02~~13:29内源项目应该由谁来兜底?
    13:30~~17:56内源项目的商业交付模式
    18:00~~24:03内源参与的源动力,姜宁:知识共享
    24:52~~28:03内源参与的源动力,谭中意:解决需求&技术影响力
    32:20~~37:23Apache way在内源中的应用

    请收听

    ALC Beijing Podcast Episode #10:又谈内源 InnerSource

    本期嘉宾

    谭中意: 开源社区资深爱好者, 开放原子基金会TOC副主席,Mozilla/Gnome/Apache committer。 国际内源基金会成员和布道者, 曾在多个开源大会上分享内部开源相关议题。

    潘娟:京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    周禹任: 北京大学社会学系在读本科生, Apache IoTDB Committer

    相关链接

    • 国际内源基金会官网(InnerSource Commons):https://innersourcecommons.org
    • 上期内源主题播客:https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #10 谈谈内源2 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    03 +May 2021

    ALC Beijing Episode #10 谈谈内源2

    音频编辑: 周禹任

    文案: 周禹任

    内容梗概

    目前,越来越多的软件开发者把开源的优秀实践带到企业内部,在组织内部建立起了一种类似开源的文化氛围。在上期关于内源的节目中,姜宁老师和谭中意老师让我们了解了内源和开源的关系,以及内源究竟是什么。

    在这一期节目中,姜宁老师,谭中意老师则对内源的话题进一步聚焦,就内源的具体适用性、责任方以及动力问题进行了详细的讨论。让我们一起听一下他们在这一期中为我们带来的精彩呈现吧。

    时间线

    时间区间精彩话语提炼
    03:10~~08:50什么样的项目适合以内源的方式在公司内部开源
    09:02~~13:29内源项目应该由谁来兜底?
    13:30~~17:56内源项目的商业交付模式
    18:00~~24:03内源参与的源动力,姜宁:知识共享
    24:52~~28:03内源参与的源动力,谭中意:解决需求&技术影响力
    32:20~~37:23Apache way在内源中的应用

    请收听

    ALC Beijing Podcast Episode #10:又谈内源 InnerSource

    本期嘉宾

    谭中意: 开源社区资深爱好者, 开放原子基金会TOC副主席,Mozilla/Gnome/Apache committer。 国际内源基金会成员和布道者, 曾在多个开源大会上分享内部开源相关议题。

    潘娟:京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    周禹任: 北京大学社会学系在读本科生, Apache IoTDB Committer

    相关链接

    • 国际内源基金会官网(InnerSource Commons):https://innersourcecommons.org
    • 上期内源主题播客:https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/
    \ No newline at end of file diff --git a/post/podcast/episode-2-1-talk-to-shardingsphere/index.html b/post/podcast/episode-2-1-talk-to-shardingsphere/index.html index 26af7127..64d5f0df 100644 --- a/post/podcast/episode-2-1-talk-to-shardingsphere/index.html +++ b/post/podcast/episode-2-1-talk-to-shardingsphere/index.html @@ -1,3 +1,5 @@ -Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激 · ALC Beijing

    Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激

    内容梗概

    2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程!

    时间线

    01:00 ~~ 06:30 本次参与嘉宾的个人自述,各有精彩!

    07:00 ~~ 10:00 灵魂拷问:在座的 ShardingSphere 成员是如何凝聚(bonding)在一起的,发起人张亮不正经回答。

    10:00 ~~ 13:00 Zhyee 的结识、加入分享,强调开源协作的重要

    13:21 ~~ 17:20 董宗磊和 ShardingSphere 的缘分,由于Apache 而更加紧密

    17:30 ~~ 17:50 姜宁表达新的感悟: 开源community 更是一个知识共享的平台

    21:30 ~~ 29:30 ShardingSphere 成长的几个阶段

    30:00 ~~ 36:15 娟神:女性既是优势,也是压力! 从“自我”到“心中有Ta”的转变!

    37:10 ~~ 40: 00 另一位女性开发者颜志一 既是 ShardingSphere 的成长之旅,也是开源的晋级之旅。

    卖个关子,下期讲:ShardingSphere 的开源初心是什么?是什么样的力量驱动着Ta们走到今天?

    请收听

    ALC Beijing Podcast Episode #2:Apache ShardingSphere开发者们的欢乐与刺激(上)

    本期嘉宾

    张亮:京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目 Elastic-Job 作者。

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    董宗磊:京东零售子集团Java服务端高级开发工程师,9年工作经验,Apache ShardingSphere Committer,乐于参与开源社区建设,享受开源乐趣。

    颜志一:DaoCloud 微服务开发工程师,Apache ShardingSphere Committer,开源爱好者,现积极探索于分布式数据库中间件领域

    秦金卫,京东数科架构师,Apache ShardingSphere committer/Apache Dubbo PMC,热爱开源技术,拥抱开源社区。

    吴晟:Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member.

    姜宁(主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://shardingsphere.apache.org
    2. https://github.com/apache/shardingsphere
    3. https://mp.weixin.qq.com/s/WroNWdoNZv-dM5GLHFeaWw
    4. https://alc-beijing.github.io/alc-site/

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    31 +May 2020

    Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激

    内容梗概

    2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程!

    时间线

    01:00 ~~ 06:30 本次参与嘉宾的个人自述,各有精彩!

    07:00 ~~ 10:00 灵魂拷问:在座的 ShardingSphere 成员是如何凝聚(bonding)在一起的,发起人张亮不正经回答。

    10:00 ~~ 13:00 Zhyee 的结识、加入分享,强调开源协作的重要

    13:21 ~~ 17:20 董宗磊和 ShardingSphere 的缘分,由于Apache 而更加紧密

    17:30 ~~ 17:50 姜宁表达新的感悟: 开源community 更是一个知识共享的平台

    21:30 ~~ 29:30 ShardingSphere 成长的几个阶段

    30:00 ~~ 36:15 娟神:女性既是优势,也是压力! 从“自我”到“心中有Ta”的转变!

    37:10 ~~ 40: 00 另一位女性开发者颜志一 既是 ShardingSphere 的成长之旅,也是开源的晋级之旅。

    卖个关子,下期讲:ShardingSphere 的开源初心是什么?是什么样的力量驱动着Ta们走到今天?

    请收听

    ALC Beijing Podcast Episode #2:Apache ShardingSphere开发者们的欢乐与刺激(上)

    本期嘉宾

    张亮:京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目 Elastic-Job 作者。

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    董宗磊:京东零售子集团Java服务端高级开发工程师,9年工作经验,Apache ShardingSphere Committer,乐于参与开源社区建设,享受开源乐趣。

    颜志一:DaoCloud 微服务开发工程师,Apache ShardingSphere Committer,开源爱好者,现积极探索于分布式数据库中间件领域

    秦金卫,京东数科架构师,Apache ShardingSphere committer/Apache Dubbo PMC,热爱开源技术,拥抱开源社区。

    吴晟:Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member.

    姜宁(主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://shardingsphere.apache.org
    2. https://github.com/apache/shardingsphere
    3. https://mp.weixin.qq.com/s/WroNWdoNZv-dM5GLHFeaWw
    4. https://alc-beijing.github.io/alc-site/

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    \ No newline at end of file diff --git a/post/podcast/episode-2-2-talk-to-shardingsphere/index.html b/post/podcast/episode-2-2-talk-to-shardingsphere/index.html index 094a46b0..a0cc23c0 100644 --- a/post/podcast/episode-2-2-talk-to-shardingsphere/index.html +++ b/post/podcast/episode-2-2-talk-to-shardingsphere/index.html @@ -1,3 +1,5 @@ -Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apache · ALC Beijing

    Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apache

    内容梗概

    2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程!

    时间线

    00:00 ~~ 02:00 张亮谈开源初心, 开源让技术更为优雅、极致,开源的组织让我们走的更远!

    02:10 ~~ 08:30 金卫个人的开源历程,全职做开源梦想成真!

    12:00 ~~ 14:30 ShardingSphere 从个人项目到 Apache TLP 中间发生了哪些关键的跃迁?从技术模块扩展到共同体(Community)多样性

    15:00 ~~ 18:00 模块化架构的重构来龙去脉

    18:40 ~~ 19:00 好的软件是用出来的,不是设计出来的

    19:10 ~~ 23:30 共同体的变化, 从个人主义到 Apache 之道

    24:00 ~~ 25:00 Apache 孵化器的导师绝对“奥利给”

    28: 00 ~~ 29:30 姜宁在参与导师当中的经历,对Apache 的重新认知,尤其是共同体的强调!

    29:40 ~~ 31:00 张亮对开发者参与开源的职业生涯影响: 中国有很多优秀的开发者!

    32:30 ~~ 33:00 吴晟分享在共同体中处理冲突, 开源项目在世界这个更大的舞台

    33:30 ~~ 34:40 搭上Apache ,走向世界!走向星辰大海!

    35:00 ~~ 42:00 Apache ,更加开放的开源之道。

    请收听

    ALC Beijing Podcast Episode #2: ShardingSphere开发者们的欢乐与刺激 (下)

    本期嘉宾

    张亮:京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目 Elastic-Job 作者。

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    董宗磊:京东零售子集团Java服务端高级开发工程师,9年工作经验,Apache ShardingSphere Committer,乐于参与开源社区建设,享受开源乐趣。

    颜志一:DaoCloud 微服务开发工程师,Apache ShardingSphere Committer,开源爱好者,现积极探索于分布式数据库中间件领域

    秦金卫,京东数科架构师,Apache ShardingSphere committer/Apache Dubbo PMC,热爱开源技术,拥抱开源社区。

    吴晟:Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member.

    姜宁(主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://shardingsphere.apache.org
    2. https://github.com/apache/shardingsphere
    3. https://mp.weixin.qq.com/s/WroNWdoNZv-dM5GLHFeaWw
    4. https://alc-beijing.github.io/alc-site/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每周会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apache | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    31 +May 2020

    Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apache

    内容梗概

    2020 年 4 月 16 日,Apache ShardingSphere 最终通过基金会董事会决议,加入了 TLP 梯队!从 2016 年 1 月的第一行代码到现今的 300K+行代码,中间经历了什么?来自创始团队和中坚力量的成员们坐下来和大家分享 Apache ShardingSphere 成长的历程!

    时间线

    00:00 ~~ 02:00 张亮谈开源初心, 开源让技术更为优雅、极致,开源的组织让我们走的更远!

    02:10 ~~ 08:30 金卫个人的开源历程,全职做开源梦想成真!

    12:00 ~~ 14:30 ShardingSphere 从个人项目到 Apache TLP 中间发生了哪些关键的跃迁?从技术模块扩展到共同体(Community)多样性

    15:00 ~~ 18:00 模块化架构的重构来龙去脉

    18:40 ~~ 19:00 好的软件是用出来的,不是设计出来的

    19:10 ~~ 23:30 共同体的变化, 从个人主义到 Apache 之道

    24:00 ~~ 25:00 Apache 孵化器的导师绝对“奥利给”

    28: 00 ~~ 29:30 姜宁在参与导师当中的经历,对Apache 的重新认知,尤其是共同体的强调!

    29:40 ~~ 31:00 张亮对开发者参与开源的职业生涯影响: 中国有很多优秀的开发者!

    32:30 ~~ 33:00 吴晟分享在共同体中处理冲突, 开源项目在世界这个更大的舞台

    33:30 ~~ 34:40 搭上Apache ,走向世界!走向星辰大海!

    35:00 ~~ 42:00 Apache ,更加开放的开源之道。

    请收听

    ALC Beijing Podcast Episode #2: ShardingSphere开发者们的欢乐与刺激 (下)

    本期嘉宾

    张亮:京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目 Elastic-Job 作者。

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    董宗磊:京东零售子集团Java服务端高级开发工程师,9年工作经验,Apache ShardingSphere Committer,乐于参与开源社区建设,享受开源乐趣。

    颜志一:DaoCloud 微服务开发工程师,Apache ShardingSphere Committer,开源爱好者,现积极探索于分布式数据库中间件领域

    秦金卫,京东数科架构师,Apache ShardingSphere committer/Apache Dubbo PMC,热爱开源技术,拥抱开源社区。

    吴晟:Founding Engineer at Tetrate. Apache Member. He leads the Apache open source APM/Observability analysis platform project, SkyWalking, which has been included in cncf cloud native landscape. Be a PMC member of Apache Incubator. Take part in Zipkin and Apache ShardingSphere as a PMC member.

    姜宁(主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://shardingsphere.apache.org
    2. https://github.com/apache/shardingsphere
    3. https://mp.weixin.qq.com/s/WroNWdoNZv-dM5GLHFeaWw
    4. https://alc-beijing.github.io/alc-site/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每周会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    \ No newline at end of file diff --git a/post/podcast/episode-3-the-sotry-of-apisix-audio/index.html b/post/podcast/episode-3-the-sotry-of-apisix-audio/index.html index ca6ac1bf..d80e1bdf 100644 --- a/post/podcast/episode-3-the-sotry-of-apisix-audio/index.html +++ b/post/podcast/episode-3-the-sotry-of-apisix-audio/index.html @@ -1,4 +1,6 @@ -Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版) · ALC Beijing

    Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)

    内容梗概

    Apache APISIX 在2019年10月份进入了 Apache 软件基金会孵化器,到现在(采访期2020年六月)有7个多月的时间,就做了多达 6 次的 release 发布,也就是说差不多是每个月就会发布1个release,在进入Apache之前,APISIX 只有20多位contributor,截止到现在,已经拥有了80多位committer,在如此之短的时间内,Apache APISIX 是如何做到的?是什么样的魔力,让Apache APISIX 项目、团队、Community 有这么快的加速发展了呢?

    请仔细聆听,两位创始人和一位导师的精彩分享。

    时间线

    时间区间妙语连珠
    00:30 ~~ 02:23嘉宾自我介绍
    02:24 ~~ 05:45Apache APISIX 是什么?
    05:48 ~~ 10:40过去的开源相关经验(基金会、项目、Community)等对Apache 的孵化作用。
    12:10 ~~ 15:00开源共同体的身份,是否能够让开发者在所在公司加权?
    15:10 ~~ 19:20开源Community 最佳实践:抱怨也是爱!
    19:30 ~~ 24:05中文汉字与国际化的考量
    24:20 ~~ 33:30进入Apache 软件基金会孵化的一点提示 :创始人退一步,引进更多的committer
    33:39 ~~ 42:37线下活动对于项目的帮助非常之大,和上下游合作伙伴合作效果更佳
    42:50 ~~ 48:15还是有一些用户愿意付费的,就看你能否识别出来
    48:20 ~~ 52:40关于国内建立基金会与参与Apache 软件基金会之间的差别
    52:50 ~~ 57:45APISIX 将如何看待开源的 Supply Chain?未来怎么做
    57:50 ~~ 60:00总结:开源是提升开发者自我的最佳方式

    请收听

    ALC Beijing Podcast Episode #3: Apache APISIX的孵化故事

    本期嘉宾

    温铭:深圳支流科技创始人,云原生 API 网关 Apache APISIX(Incubating) PPMC 成员,360 开源委员会发起人,《OpenResty 从入门到实战》专栏作者。在互联网安全公司和黑产对抗多年,有 40 多项中美安全专利。

    王院生:深圳支流科技创始人,云原生 API 网关 Apache APISIX(Incubating) PPMC 成员 -前奇虎 360 企业安全基础架构组总负责人。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(主持人): 开源布道师

    相关链接

    1. APISIX 网站:http://apisix.apache.org

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每周会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版) | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    06 +Jul 2020

    Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)

    内容梗概

    Apache APISIX 在2019年10月份进入了 Apache 软件基金会孵化器,到现在(采访期2020年六月)有7个多月的时间,就做了多达 6 次的 release 发布,也就是说差不多是每个月就会发布1个release,在进入Apache之前,APISIX 只有20多位contributor,截止到现在,已经拥有了80多位committer,在如此之短的时间内,Apache APISIX 是如何做到的?是什么样的魔力,让Apache APISIX 项目、团队、Community 有这么快的加速发展了呢?

    请仔细聆听,两位创始人和一位导师的精彩分享。

    时间线

    时间区间妙语连珠
    00:30 ~~ 02:23嘉宾自我介绍
    02:24 ~~ 05:45Apache APISIX 是什么?
    05:48 ~~ 10:40过去的开源相关经验(基金会、项目、Community)等对Apache 的孵化作用。
    12:10 ~~ 15:00开源共同体的身份,是否能够让开发者在所在公司加权?
    15:10 ~~ 19:20开源Community 最佳实践:抱怨也是爱!
    19:30 ~~ 24:05中文汉字与国际化的考量
    24:20 ~~ 33:30进入Apache 软件基金会孵化的一点提示 :创始人退一步,引进更多的committer
    33:39 ~~ 42:37线下活动对于项目的帮助非常之大,和上下游合作伙伴合作效果更佳
    42:50 ~~ 48:15还是有一些用户愿意付费的,就看你能否识别出来
    48:20 ~~ 52:40关于国内建立基金会与参与Apache 软件基金会之间的差别
    52:50 ~~ 57:45APISIX 将如何看待开源的 Supply Chain?未来怎么做
    57:50 ~~ 60:00总结:开源是提升开发者自我的最佳方式

    请收听

    ALC Beijing Podcast Episode #3: Apache APISIX的孵化故事

    本期嘉宾

    温铭:深圳支流科技创始人,云原生 API 网关 Apache APISIX(Incubating) PPMC 成员,360 开源委员会发起人,《OpenResty 从入门到实战》专栏作者。在互联网安全公司和黑产对抗多年,有 40 多项中美安全专利。

    王院生:深圳支流科技创始人,云原生 API 网关 Apache APISIX(Incubating) PPMC 成员 +前奇虎 360 企业安全基础架构组总负责人。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(主持人): 开源布道师

    相关链接

    1. APISIX 网站:http://apisix.apache.org

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每周会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    \ No newline at end of file diff --git a/post/podcast/episode-3-the-story-of-apisix-fulltext/index.html b/post/podcast/episode-3-the-story-of-apisix-fulltext/index.html index b6df6ecb..56b7ce56 100644 --- a/post/podcast/episode-3-the-story-of-apisix-fulltext/index.html +++ b/post/podcast/episode-3-the-story-of-apisix-fulltext/index.html @@ -1,3 +1,5 @@ -Apache APISIX 的快速之旅(全文版) · ALC Beijing

    Apache APISIX 的快速之旅(全文版)

    引言

    本周我们推出了 Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版),为了能够让更多的习惯于文字阅读的成员们熟悉我们的故事,特别推出了全文实录的文字版,请笑纳!

    Apache APISIX 或 APISIX 在下文中均指称:Apache APISIX

    正文

    适兕主持人

    Hello,大家好,欢迎来到ALC 北京 PodCast。这次我们请到的是 APISIX 的核心成员,请各位嘉宾跟我们听众打个招呼。

    温铭

    大家好,我是温铭,Apache APISIX的PPMC成员。我之前是在互联网公司工作了有10年,主要是在做安全方向,然后最近三年都是在做开源软件的商业化,也就是说我最近三年是全职做开源项目,非常庆幸今天有机会和大家一起聊聊 Apache APISIX,以及APISIX背后的一些故事。

    王院生

    大家好,我是王院生,我算是年纪比较大的一位了,05年毕业之后做了近10年的传统金融行业,在(20)14年之后进入互联网。在那一年认识了温铭,也开始做一些非常有意思的事情,从(20)15年开始做比较多的开源方面的事情,确实在做的过程中,开源、(过程很)开心让我是比较享受的。最近两三年也在尝试做一些开源方向的创业,正好跟大家一起来聊一聊我们在创业过程中的一些收获。

    姜宁:

    我叫姜宁,熟悉ALC Beijing Podcast 应该比较了解,我好像每次活动我都会在场,今天很高兴能跟同学们一起来聊聊,有关孵化以及后面创业商业化相关的一些事情。

    适兕主持人

    我们先从项目开始,目前来说, APISIX,它是什么样的状态?花简单几分钟时间介绍一下这个项目是干什么的。

    温铭

    Ok,我先来大概说一下APISIX是干什么的。简单的来说 Apache APISIX它是一个API网关,它可以帮你来处理南北向以及东西向的流量。如果不太熟悉网关的同学,就可以把APISIX简单的认为和Nginx做的是同样的事儿,只不过 Nginx是靠静态的配置文件来驱动的,你修改了任何配置的话,都是要reload服务才能生效的。 但是在APISIX里面,我们一直在强调的,它是一个动态的实时的这样的一个网关。你所有的修改包括路由、证书、以及这种限流限速以及插件的各种配置,它全都是动态的。 你可以非常容易的去修改它的内容,而不用去重载它的服务。简单来说它就可以帮你动态的管理流量。 APISIX 现在的状态, 它是在去年10月份的时候进入了Apache孵化器,到现在我们有7个多月的时间,我们发布了6个Apache release,差不多是每个月会发布1个 apache 的 release,在进入Apache之前我们只有20多个contributor,到现在我们82 个contributor, 20多个 committer, 所以我们的发展速度还是比较快的。不管是从社区的发布版本,以及我们吸收更多的贡献者,和我们对贡献者一些快速的认可,我觉得我们这方面速度都是比较快的。

    王院生

    我简单补充一点,在APISIX 之前其实也有一些API 网关,因为 API 网关实际上是一个非常成熟,并且是被大家了解了很久的一个概念的存在。是在2000年之前就在普及的一个概念,我们当时之所以要开发网关类产品并捐赠给 Apache, 是因为我们发现已有的网关并不适合云原生,结构也比较臃肿复杂、弹性伸缩支持不好,性能上也不能满足现在 IoT、5G微服务等低延迟、高并发的要求。基于以上考虑我们希望能做一个真正是社区化的,如Apache这样的组织,能够持久的做大家都需要的产品,所以我们发起了 APISIX 这个项目,我们当时发起这个项目的目标,要把它的性能、扩展性等方面做到一个极致。这是我们一开始的目标,现在来看我们距离这个目标越来越近。而且对 Apache 的文化也有了进一步的认识,尤其是多样性、多元化,是非常契合我们当时的愿景的。我们 PPMC 里面除了少数几位我们公司的,其余都是来自各个不同公司的,将近有20多家公司都在参与,这还只是committer部分,如果算上contributor的话,还有更多的人参与。

    姜宁:

    我这边有一个问题。去年差不多是这个时候,我们正好是在上海开OpenSource Summit,温铭找到我说有项目要捐给 Apache。我回过头来看的话,实际上你们从有点子然后进入Apache,到发展到现在这个程度,作为我接触过的Apache项目孵化来说,算是做的走的比较快的。 从最开始跟你接触的时候,感觉对开源其实已经有一些了解了,而且社区怎么玩其实是比较清楚的,以至于后面很多事情实际上你们都自己做了,我觉得我基本上没帮上什么忙。 所以反过来的话我就想问一下,作为发展的时间其实挺短的一个项目,但是比较成熟。我觉得和你自己背后的那些开源经验会有很大关系。以上是作为问题的铺垫,二位可以介绍一下这方面的经验,以便为后面的想加入到 Apache,参与到孵化项目的同学也能提供一些参考。

    温铭

    没错,其实我和院生做开源确实比较早,我可能会更早一些。我是07年毕业,当时去了金山毒霸,我所在的部分其实就有很多在开源社区的,基本上是从那个时候我就接触到开源社区,知道原来开源不只是可以贡献代码,比如说我们去组织一些活动,去翻译一些文档,写一些技术的文章,其实也是参与开源一个比较好的这样的入门的一种方式。所以当时我们算是种下了一个开源的种子。 然后在15年左右的时候,我们开始去做 Open Resty社区, 包括写电子书,当时并没有想到这个居然最终能做成一个社区。当时我们只是说我写一本电子书,方便我公司的同事能够更好的去学一门技术。我自己对后来的同学培训的时候,我也不用去给他讲很多的东西,让他直接看书就ok了。 我们所以当时算是无心插柳,就进入了Open Resty这个社区里面去,在这个过程中从零把社区给搭建起来,认识了很多不同公司的人。对,这个算是我们之前的一些积累,所以APISIX也不算是零启动。 虽然我们之前有了一个社区的热身,但是 Apache 和我之前参与其他社区,比如说Python的社区,Open Resty社区,给我的感觉是完全不一样的,因为在 Apache 里面其实并没有一个人是说了算的,比如说我和院生对 APISIX 贡献了很多的代码,但是这个社区并不是说我们两个就可以说我们要做这件事,或者说我们要做那件事,并没有一个独裁者的存在,这是我觉得我非常喜欢 Apache 一个很主要的原因。因为在里面其实大家都是平等,然后互相讨论问题的时候都是很友善的这种方式,所以我感觉就像程序员的 “桃花源” 的存在。 Apache 对我来说就像一个发现了非常美妙的地方。我很认同 Apache 的文化,比如说大家都投票,一人一票的去决定某一个事情,或者是说所有的事情都要在邮件列表里面公开讨论。在做一件事情之前,先要 discuss,然后再 Vote,都是异步的,还要等三天时间等等,可能国内的一些同学觉得不太适应,但是我觉得你如果经历过一些其它社区的痛的话,就非常能感觉到 Apache 的做法其实非常的好。Apache 给出了体现平等和自由的流程,而且是用基金会的形式帮你把这个东西固定下来。 我记得有一个Apache APISIX 的贡献者,我给他发 committer 邀请的时候,他问我的第一个问题是:我会不会因为有了 committer 的身份,后面就需要花更多的时间和精力在这个项目上面 ?我说其实是不用的,这个committer 是对你历史做的贡献的一个认可,不会对你后面有任何这种要求。 然后他第二个问的问题是:会不会因为我后面没有做贡献,committer 的身份就被取消掉**?**我说 Apache 里面的这种贡献是永久的,大家没有权利把你的 committer 的身份给拿掉,因为它是对你历史做的贡献的一个认可。 对,所以这两个问题其实也是很多国内做开源经常碰到的一个问题。我做的贡献会不会能够被公平的对待,我会不会因为背上我一些这种思想上的包袱,我觉得 Apache 在这方面会做得比较好。 我举得我蛮喜欢Apache文化的。

    适兕主持人

    温铭你刚才提的 committer 的问题,他是以公司的这种思维来思考ASF和Open Souce Community,我觉得相当典型。

    温铭

    他其实也一直在玩开源。也一直在给开源社区去贡献。但是从来没有说我突然给你一个官方的认可。

    姜宁:

    这块我可以补充一下,为什么Apache 有这样的要求或者这种practice,其实他更多的是你是以个人的身份参与进来。我们在签 CLA的同时,如果你是受雇于公司同时加入Apache的话,需要公司那边还要再签一个协议,就是说允许你在上班的时间也能给Apache这边做贡献,而且你做这些贡献是捐给Apache的,相当于是公司派你去给Apache打工,所以他后面的所有的任职都是以个人身份,这样就带来一个好处,如果这个人换公司的话,不会对他有什么太大的影响。 对我自己来说的话,我可能前前后后可能换了三四家公司,然后因为但都是在Apache这边,以前的话只是公司名发生变更,但我们 team 是整个就被收购来收购去,具体的工作内容没有变,但是 manager 那块的话,其实他们需要去签协议了,但跟我没有什么太大关系,我反正我大概知道是有这么一个过程,然后到华为为这块的时候其实也是一样的,就相当于我们也去签公司的CLA,我觉得这样的话相当于从法律框架上面把怎么说就变成“包产到户”了。 你做的所有的东西其实是一直可以存在的,也给了程序员一个机会,我们现在能看到做比较成功的一些项目,他们其实是在大的互联网公司创建这么一个原型,然后后面逐步的商业化,例如像Kylin,Kafka 这样的公司。这些创业公司其实也是基于一帮人,在大公司工作的过程当中做的这些事情变成开源项目,后面他们基于这些开源项目成立了商业公司。我觉得捐基金会可能也有好处,基本上是把IP这个事情理清,然后有一定的法律框架去保证这个东西,就是你做的事情和公司这个事情能有一个比较好的切割,然后保证这些项目能够持续不断的得到演进。 只要你愿意啊,以个人为单位的这种权力授予的话,是去保证你在任何时候都可以回来,而且之前刚刚温铭提到的就是你得到这个title,其实是和你以前做的工作有关。如果想维持你的 credit,或者想保证你在社区的影响力的话,其实你还是要持续不断的去做这个事情,不是说你做完了就到头了。但是我觉得这种积分或者这种对你认同的这种机制是保证了你做的这个事情是得到公平对待的,然后和你的雇佣状态是没有直接关系的。Apache就一直在坚持厂商中立的这么一个原则,尽量去避免这种商业影响,这一块做的还是比较好的。

    王院生

    我也有这方面感触,我说一些自己做开源社区的一些体会心得。我们在做 APISIX 之前就已经做了几年开源社区经营,他们之间确实有一些共性的东西,这让我们适应 Apache 文化确实比较容易。 我举几个小例子,比如说你怎么看待社区中的一些抱怨,这是永远都存在。你做一件事,不敢说你永远做的都是对的、完美的,比如说我使用体验不好或者安装很麻烦、文档写的不清晰等等这些问题。那么社区可能散发的是一种不友好、或者是一种不开心的状态,上次我们和Craig 聊的时候 ,Craig Russell 主席告诉我们:抱怨也是爱。没有无缘无故的抱怨,是因为喜欢想让他变得更好才会来抱怨,在你和一个人没有见过面,很多时候文字理解偶尔会有情绪传达偏差,社区管理者要永远往往好的方向想。 这个就是我们以前做开源的时候,得到的一些基本的东西。 开源项目的文档是非常重要的,对于国际化项目英文文档就更必不可少。我们从一开始就对 GIT 的提交记录、Github issue 等默认使用英文,这样对于所有社区爱好者,大家会有意识的保持前后一致使用英文贡献。偶尔会有一些 APISIX 会私信我,他说不好意思去写 ISSUE,为什么呢?是因为英文不好。所以一个项目,创始人从开源第一天是怎么想的,如何带队的,就非常重要。 这种影响其实是双向的,说一个比较有意思的事情,APISIX 可能是第一个外国朋友帮我们写中文文档的项目。这位贡献者来自奥地利的,在提交的 PR 中除了必要的英文文档他把中文文档也写好了。在我们进入 Apache 基金会开始孵化,无论是邮件还是 ISSUE ,我们基本没遇到大的坎,尤其是沟通语言上。 还有一个比较关键的点就是要引导社区在公共平台上交流,避免线下的单向联系,期望用户多到公共频道交流把知识沉淀下来的复用。非常推荐用大家去用邮件列表,但由于中国人的沟通习惯,很难说由一两个项目都把用户的沟通习惯改过来,需要多去引导。让这种公开讨论的习惯逐步养成,困难虽大,但确实非常值得。 有了之前对社区的经营积累,当我们再去适应 Apache 文化时,除了邮件讨论这块花费了一些时间外,其他都感觉到特别适应,甚至可以说是二次的强化。APISIX 之所以能够比较快的能够达到现在的状态,除了有贡献者比较多,参与公司比较多外,上面这些点也发挥了不少作用。

    姜宁:

    刚才正好院生说的这边可能习惯的力量还是挺大的,之前的 APISIX大部分的参与者是不是都有开源的一个经验,然后可能社区里面也形成了这样的习惯,导致于我们的做事方式可能也反过来去影响了老外,但这里面可能会有一个问题,你总会有从 0 开始的,可能最开始是你们两个温铭和院生你们两个,然后你后面怎么去扩展到让更多的人去接受这些习惯或者这些Best Practice?

    王院生

    这些习惯其实,我觉得所有的程序员,Ta在看你在用的东西,它首先都要有一个学习的过程,我觉得所有人都一样,比如说我给别人贡献,我都要先看看别人这些大致的什么样的习惯、方法,甚至包括提一些issue怎么提,已有的issue大概写成什么样子的, 我举个特别简单的一个例子,我前两天在使用 Tengine 我发现了问题,我准备给他提一个问题,打开它的 issue 列表全是中文,我就不动脑子直接写了中文。但是中文写完后,感觉不对还是默默的在下面又翻译了一个英文版本。如果项目一开始没给大家传达正确基本规矩,后面很难改。如果你想要成为一个国际化的项目,那么从第一行代码、第一个 issue 开始就要传达这方面的信号。这是我一个个人的理解。

    姜宁:

    其实跟coding style 或者是 code of conduct的这些就是可能最开始要把规矩立好。我自己经验如果我要去融入到别人的社区的话,也要 follow 别人的那些东西,但的确这个标杆是一个很大的问题。

    王院生

    是的。

    姜宁

    温铭你这块有啥需要补充的?

    温铭

    这块我和院生差不多。但是APISIX 它加入 Apache 之前并不是一个冷启动的一个状态,我们是在2019 年6月份开源,然后10月份进Apache 孵化器。 APISIX在疫情之前,它都会保持每个月有一个线下的 meetup,然后我们也会写一些宣传的文章,去讲我们这个项目,所以我们大部分的贡献者其实是通过这种包括线上文章的传播,然后线下的meetup这种形式,慢慢地启动起来的。等于说最开始是参与APISIX的一批人,等于说是被我和院生的之前在社区里面做的一些事情,然后觉得我可以他们之前做的还不错,然后他们新开了一个项目,我们可以去参与,差不多冷启动,是这样一个状态。 所以都是知道我们认识我们的这一批人,然后可能会先跳这个坑里面先看一看。

    姜宁:

    我这边问题是做启动的有什么好一点的经验可以分享给大家,因为我们可能后面也会有很多的项目开源,怎么去吸引人。

    温铭

    我觉得我上一次和Justin和Craig见面的时候,我当时和他们说了,我们现在想捐给Apache,然后他说我们现在的初始的PPMC的数量太少了。 我当时的疑问就是:我们现在的项目就只有20多个贡献者,而且很多的贡献就只是一个两个PR,我如果把这些人都邀请进入PPMC,我会有一些担心。比如我不知道他们的能力怎么样,后面会不会持续贡献,但是当时Justin和Craig给我的反馈,刷新了我的一个认知。他们说:“当你把他们邀请进来,如果他们同意加入进来,会不会贡献更多的commit?” 那么很大概率上他们会因为我邀请他进来会继续贡献,那么这个其实就够了。 committer,是对他历史贡献的荣誉,是一个称号,并不是一个在公司里面的是一个职位。对,所以我们为什么后面就很积极的去邀请一些贡献者,能够很快的升成committer或者PPMC,我们觉得我给了你这份荣誉和title,那么你会更积极的去回馈社区,这个就是我们的目的。 所以我觉得可能会需要这个项目的最开始的几个代码的贡献者的心态能够更open一些,自己去往后站,然后把更多的人给往前面去推,这个可能会比较重要。

    姜宁:

    之前第一期跟吴晟那边聊的时候,那里面就有一条适当往后退一退,然后特别是那种项目的创始人,大部分大家觉得都可能顶着有这种光环,但是你要让更多人能够成长起来,特别是这种新鲜血液,能够觉得他是项目很重要的组成部分,这块的话是会持续让他让能够贡献,然后我觉得因为我们之前跟Justin也聊得比较多,而且上次的话应该是9月份在上海的是一个 Apache 的meet up。对,那次我们正好是做华为的HC然后就正好把Justin和Craig请过来,然后我们就弄了一次meet up,还下着雨,我就赶着赶紧回去,然后你们还帮着招待一下,请他们吃烤鸭我记得。

    王院生

    对。看来烤鸭很管用。

    姜宁:

    而且我觉得因为我之前跟Justin聊的比较多,他是对这个Committer的门槛有比较多的想法,基本上尽量要把门槛降低一些,然后让更多人能够进来,(让更多的人有)committer的权限,我们并没有失去什么。 但是因为这个鼓励可能会让更多人能够更好的参与到开源来,为项目来做贡献。但这里面也不排除就是有些人为了打卡什么之类的,得到 committer 之后就消失,但这种人可能还是会比较少。 因为在社区里面更大的一个程度上,就是你的credit,你的 reputation,你的 influence 其实是靠你日常的这些工作赢来的,如果你不做这些工作的话,可能这些东西就会慢慢的离你而去,然后你也就会淡出了。 如果你持续来做这件事情的话,你的 credit 是在不断的在增加,我觉得这可能也是我愿意拉着一票人的搞 ALC Beijing 的一个很重要的原因,然后我发现现在我做mentor,我感觉我没有之前的那么强的动力是因为是觉得现在已经有很多人起来了,然后我觉得我可能要做一项更有意思的事情。就是项目带动更多的项目来,因为其实 Mentor 的工作这块,我们就常用就是那几板斧,我觉得你们其实已经玩得都很顺了,我也希望你们毕业之后,院生、 温铭,我觉得还是挺希望你们能够帮助其他的这些,然后把你们的这些成功经验继续传递过去,这几板斧我还是以有些作用的。 只不过我现在觉得,我们社区还有很多没有做到的事情,比如我们能让更多的项目能够合作起来,把我们开源这些理念,这些好的 practice 能让更多人知道,这也是我们找大家聊一聊的一个很重要的原因,把大家做项目的一些心得传递给大家。我觉得你们的项目为什么能发展得这么快,然后孵化效果又这么好的一个很重要的原因,也是因为你们前期的铺垫工作真的是做的比较好,因为你之前在社区里面做的那些影响力带动了一票人,然后这些这票人又过来来支持 APISIX就这块可能是比较好的。 另外一点的话我想问一下,因为我们能看到 APISIX也有很多以英语母语的这些开发者,不同母语的开发者就是他们有什么样不同?

    温铭

    我这边看到 Apache APISIX 有一些在欧盟的贡献者,他们应该都是学生,他们会对开源项目,对APISIX会问很多问题,不管是在github的issue里面,或者是在邮件列表,甚至他们也会经常发邮件私信发给我会问很多问题,比如说APISIX的功能点为什么要做,然后它的某一个技术点具体是怎么实现的?如果我要实现这个功能,我应该怎么去做然后呢,他还会把自己的一些看法很详细的给你列出来。 所以我觉得这些都是能够接触到的形成正向反馈的这样的一些事情。而我接触到了其他的一些贡献者,比如说讲中文的一些贡献者,他可能更多的会是直接就给你提一个pr上来,或者直接来一个 issue 说我这个地方出了问题,而很少会去给你去详细的描述一下他这个问题的原因,或者是给出一两个解决方案。

    姜宁:

    这个是我觉得可能不太一样的一些点。贡献者里面是学生的,也大部分是一些英语的这种贡献者会居多一些。这个可能会有一个现在我们想向学校扩展,因为Apache在国内,在学生团体里面就是他的影响力还是有的,只不过大家还不知道怎么参与到项目中来。一般来说我们借助google Summer of code,还有编程之夏这些活动来让大家深入参与到开源项目中来。对,你这边应该也有人报名编程之夏的活动。

    温铭

    简单说一下情况。暑期 2020 是中科院软件所主办的,我们现在报名的有两个同学,都是大二的学生。他们其实有一个是之前就已经参与了APISIX前端的一些开发,已经给APISIX提了一些pr。另外一个完全从他们的学校的宣传里面知道了APISIX这个项目,然后参与进来的。

    姜宁:

    好像另外我可能也认识,可能也是ALC北京的一个志愿是吗? 二夕, 因为我订的邮件我大概能知道,我能看到他在那发邮件。对。我觉得可能真的是会有这种reference,他在这块晃一晃,然后在其他地方晃一晃。因为我记得上次播客的时候,我们有一个例子,好像也成功“安利”了一个 ShardingSphere 的 committer,这个人是在知乎上面去问问题,然后说贡献什么样的开源项目会比较好,然后我就在知乎上跟他说了一下,你可以看一看ShardingSphere,然后就成功把他“安利” 成committer的了。我觉得这个其实是挺有意思的一件事情,而且我觉得是可以拿去吹一下牛的,就怎么让大家的入坑。

    适兕主持人

    温铭,我正好我们的用户发现很多啊, 这个短短的一年,而且还有半年疫情期间,你怎么做到?我看见用户还不仅是一些互联网公司,还有一些传统的公司。

    温铭

    对,其实是这样的,我刚才有提到APISIX在疫情之前,每个月都有一个线下的Meetup,通过线下,其实我们能够和用户能够面对面的去聊,这样的话其实比线上沟通的效率会更高一些,这是一个方面。 第二个方面是APISIX它的底层是基于Ngnix+Lua,然后这个技术站去做的。而我和院生之前做开源社区的几年都是在Ngnix+Lua这个技术栈架构上去做的社区,所以我们能够比如说APISIX发一个版本,然后我们写了一篇文章,我都能够很快地触及到技术站里面的大部分的开发人员,这个可能是其他开源社区没有的一种优势。 然后另外一点,APISIX是个开源项目,但是我和院生也会基于APISIX做一些商业化的版本,我们会基于它做一个开源的商业公司,所以我们也会去去找自己的这些渠道,去把开源项目推到更多的像传统的公司里面去,去尝试去解决他遇到的一些痛点和问题。 其实我们是有多个渠道去推广项目的。

    适兕主持人

    APISIX的现在网上网站上公布的用户, GitHub 仓库列出来的,是你们努力推广的结果。

    温铭

    是这样子,我们在 github上面有一个issue,然后issue就是说你正在用的话,你可以把你的公司名,然后你的联系方式,你的使用场景写在Github的issue上面,给大家参考。然后所以我列出来的那些都是从issue里面给拿出来的一些公开的信息。

    姜宁:

    对,我觉得你这块是这种方式会比较好,让用户主动的去说这件事情,因为以前我们维护的Apache项目的话,基本上都是在邮件列表里面,可能某个人他有公司的邮箱,问了一个问题之后,我们可能才能推断哪一个公司做了这个事情,但我们其实原来也没有专门去列用户墙这么一件事情,是不是这种原因?

    适兕主持人

    就说原来是我们分邮件列表的一个列表,然后Developer出一个列表,然后就没有去跟他们这样一种issue去贴一个标签,或者这是专门是放有事 use case,有这个原因吗?

    姜宁:

    以前的项目的宣传可能完全是靠口碑,你要想在一年的时间内打开市场的话,其实还是比较难的,我觉得 APISIX相对来说给了我们一个比较好的启发,我们可以借力打力,在一个成熟的社区,为我们的(新项目)做一些导流的事情。其实最难的是要找到你项目对口的那些用户还有开发者,社区其实是建立可能是需要一段时间的,但如果你能直接找到你的目标用户的话,我觉得前期其实温铭那边,它有公众号,然后还有一个是加了微信,然后你基本上能知道你们又在做meetup,而且哪些meetup基本上是到用户现场,要么就大厂,要么其实可能是一个用的比较多的用户的场景里面去。 我记得好像有公司去赞助吧, 就是Meetup,你们简单说一说,因为我们可能 ALC 北京可能后续等疫情好一些的话,我们也会做一些Meetup,你们 Meetup 这方面的经验可能对我们会有一些帮助。

    温铭

    Meetup我们去年是一直和又拍云一起来合作的。因为我们当时没钱,等于说是又拍云出现场地费之类的,会Cover费用这一块,然后我们通过我们的社区去找一些当地的讲师出来。 关于话题的话,我们其实并不限定在 Open Resty 这里面,我们比如说讲Nginx,讲 Kong ,讲微服务的等等。它其实都是围绕着一个大的主题,比如说云原生,微服务,网络之类的。围绕着比较大的一个主题,大家还是比较愿意来听的。其实我们这边也一样,如Apache是一家慈善组织,也没有钱给你做这种活动,类似meetup的费用之类的,更多的需要的是在金钱上资助的一家厂商,这样会好些,公司也可以导入一些新鲜的血液进来。

    适兕主持人

    我正好有一个感慨,就说其实是我们在线上的这种协作,其实是是现实当中的一个增强。不知道在座的几位有没有什么新的看法,就是我听温铭的故事,我觉得线下更为重要一些,就是说面对面的交流,然后去推广自己的用户和潜在的开发者,交流更加的充分,也更能获得信任。是不是这样子?

    温铭

    你如果是站在开源项目的角度来说,线上和线下的区别不是很大。但是在线下的一个好处就是你能沟通的更充分,比如说有些问题他可能在线上不太方便问你,或者是觉得表达的不是很清楚,那么在线下的时候他就可以拉着你面对面的去聊,会聊得更透彻一些。我觉得可能会是这样一种大家能够没有顾虑的去聊一些事。

    王院生

    我稍微展开一下,我们经常会遇到类似问题。当时是四川成都的一个开源用户做调研,起 、初他决定使用 APISIX,后来他放弃了,放弃的原因他在网上留言一笔带过,然后我也就理解他留下的文字内容。但实际上当我跟他见了面后,才发现真正的原因与文字内容相距甚远。很多时候只能面对面沟通后,才能够把他的真实情况表达完整,线上交流比较容易出现理解偏差,不是所有人都有清晰的表达能力。 貌似中国人的害羞是与生俱来的,做社区会特别能够感受这一点,很多用户都特别喜欢单聊,为什么?因为他单聊他不害怕跟你说错话,说错了也无所谓,因为只有你一个人看到了。但是他如果在群里边聊,如果问了一个很特别特别小白的问题,他就会觉得自己丢面,然后所有的人面前他都觉得没有没面子,所以就喜欢单聊。但是你在线下的时候往往就不太一样,因为他可能当时脑子又没那么快没转过来,又着急的一个问题,能把他所有问题都都给抛出来了。我们与我们的商业客户沟通,也有类似的问题,这个应该就是线下沟通的独有优势,他确实跟线上有一些不一样。 刚刚你有一点说的我很认同,就是说是谁更合适或者哪个更好,其实这个很难说,我们现在也不敢说是不是线上的一定比线下好,但是他们两个的相互结合肯定更好。由于沟通方式很不一样,也能够从对应的角度看出不同问题。比如线上交流可能更多暴露的是文档问题,如果用户犯错,大概率是文档没写清楚,这时发现后,就要去新建 issue 或更新文档了。

    温铭

    线上私聊的我基本上都不回。即使回也是让他到GitHub开个issue之类的,但是线下私聊可能会和他聊两句,但是线上就是QQ单独找我的,院生可能会回,我基本上都不会回。

    姜宁:

    以前也有好多人跟我单独发邮件,说找我要demo或者什么的,我觉得回了就没有什么价值的,我也是往那边推,然后我还有一个是说是你要给我单独付咨询费吗? 对,这里面其实有一件事情跟创业有关,因为我以前接触到的聊着很多国内的开发者,然后很多时候他们可能也会存在潜在的这种商业支持,但是感觉他们不是 decision maker,其实这一块我不知道对APISIX这块有没有什么影响?

    温铭

    确实在做to b的话,特别因为APISIX是最终如果有用户买单的话,他是有一个走to b的这种决策链儿,一般去问你问题的,一般都是对一些具体的开发人员,他一般没有这种决策的权限,所以如果我们觉得他可能会是一个潜在的付费用户,我们就会问你们现在是处于一个什么阶段?是属于一个互联网公司,自己去玩玩,还是会是一个传统的公司,现在在去选型,可能我们会做一些这种筛选之类的。 确实to,b的,比如说我们已经有了一些付费的用户,其实他的决策链都是要在半年以上的,都是会比较长。

    姜宁:

    其实是如果要维护客户关系的话,其实你额外的还需要做一些。并不是说跟那个人聊嗨了就签了,有没有成功的案例?

    温铭

    这还比较远,因为和我们能聊嗨的都没有决策权。因为有决策权其实可能对技术的理解,就是它不只是站在技术层面去考虑问题了。

    姜宁:

    你觉得对你来说或者对现在的公司来说的话,你做的那些meetup或者发展的这些开发者,然后反过来对你的商业成功会有多大的帮助?

    温铭

    其实帮助还是挺大的。因为APISIX真正去开源,然后成熟能够在生产上用,其实也就是不到一年左右的时间。 但是通过比如说开源社区的,我们做meetup,我们做开源项目的一些传播,能够让更多的人知道APISIX。后面要做网关,去处理南北向、东西向的流量,我会有一个更好的选择,可以把 APISIX 放到他考察的列表里面去。 我们现在主要是在做这一步,因为最终去做选型,做选型对比的还是具体的开发去做,我们现在至少能够从下往上这样的,去先把具体的开发人员能够影响到。

    姜宁:

    其实这块我以前经验的时候,我们有接触到很多开发,但是中间我觉得可能就是商业的支持。因为那时候我们在红帽,然后其实我们在红帽的国内的支持力度其实并没有那么大,导致于其实如果我要去创业的时候,其实会有一些问题,那条路我们不清楚会是怎么样的,而且特别在国内体制里面的话,你这个公司能进到人家的采购目录里面,你可能国内很少有那种咨询公司能去搞这种事情,现在这块情况有没有好转?

    温铭

    如果是一些央企或者一些政府的话,确实还是一样有这个问题。其实你的资质什么的都没有,没法去纳入他的供应商的采购目录里边去,你根本连招标的资格都没有。 像一些互联网公司或者是一些那种流量比较大的一些传统行业公司,其实他们对技术这一块,比如说他们会有一些创新项目的招标,或者是一些比如说他们会为类似于云原生,微服务、分布式数据库,类似这种比较新的技术会单独去开一些绿灯,它会让一些之前没有办法满足它招标的这样一些公司的产品也可以进到里边来。

    姜宁:

    我觉得可能和现在提的这种自主创新或者是并不是简单的去采购,因为以前选的话,我记得10年前的话可能就 IBM,反正你要有钱的话,你就买IBM就没有错了,反正有的给你背锅,IBM都解决不了的问题,世界上应该没有其他公司能解决了。现阶段的话你选IBM可能就并不能完全达到解决问题的目的,你自己有没有尝试去解决这样的问题,我觉得小一点咨询公司或者创新型的科技公司的话,反而是不是机会就多一些了?

    温铭

    我觉得应该是的,因为其实现在技术发展得很快,一般的话比如说一个技术的问题,现在的开发看到的第一个点,就是说这个东西我能不能用开源的方案给解决掉,而不是说我买一整套商业公司的产品。

    姜宁:

    因为可能大家会有更多的拿工具拿开源去解决他实际问题,到这个时候的话,开源项目的背后的公司可能就它的价值就体现出来了,

    温铭

    对,至少我们是原厂的。

    适兕主持人

    我是根据刚才线上线下的差别,然后引申出一个问题,就是说我记得你在去年的COSCon, 开源社组织的大会有一个分享,怎么玩基金会,从你是一个基金会的发起者或者是整个的创造者,然后最后加入ASF这么一个过程,你对比你能给说一下一些感慨。

    温铭

    软件基金会其实有很多类,像asf —— Apache 基金会,它是个人会员参加的,像Linux基金会其实是企业会员参加的,所以 Linux基金会就特别有钱。 而我们之前做的 Open Resty 基金会,其实我们也是希望做成一个 Apache 式的这样的一个基金会,个人参加,然后我们去用个人之前的一些开源上的一些经验去能够孵化一些项目出来,这是我们当时的一个初衷。 但是最后基金会只是说我们接受了老罗,锤子科技的一些捐款,但是并没有真的像我们想的一样去做一些孵化的项目,我觉得其中可能的问题是因为你没有办法去建立一个像 Apache 基金会的那种大家都能公平参与,没有门槛,没有独裁者的这种环境,这其实是比较困难的。 当时的 OpenResty 其实是以中国人为主,大家都不愿意退后一步,这是我们当时没有想到的一点,往后退一步对大家的要求实在是太高了。 有一种声音,说中国也应该要建自己的软件基金会。其实我觉得不太确定它是一个能不能真的去孵化出来一些世界级的项目,但是我觉得在建立自己的这种基金会之前,更应该参与到其他的开源项目上面去。比如说参与 Apache 基金会,参与Linux基金会这种成熟的基金会,在里面去把更多国内的开源项目放到里面,孵化出更多好项目,其实我觉得可能会是一个更好的选择。

    王院生

    这块跟你想法是一样的,我可能唯一要说在接触 Apache 文化之前,当时Justin说我们要往后退一步,然后通过人进来的时候,其实刚开始我也确实是犯嘀咕的,有些犹豫。但是从我们真正去落地实施之后的结果,其实本身我之前完全是想多了,因为等于说我没有在放下之前,我总觉得比如说在这个是我跟温铭或者少数几个人写的,我就觉得他可能就是我的孩子会有这种情节在里面,当实际上你放开了以后,其实它依然是依然还是你看他是宝贝,你永远看他是宝贝。

    温铭

    有一点不一样,我记得我当时进 Apache 孵化器,我不记得是谁和我说过,说你进入孵化器就意味着一个重要的选择,这个项目可能是你一辈子的开源项目,但是他并不是你的,你知道吗? 就是从所属权上来说它不是你的,但是你对他的这种情节其实可能会更深一些,因为会有更多的人参与进来,更多的公司在用,这个其实才是创办这个项目最有意义的一个点。

    适兕主持人

    我想问一个可能跟你们的未来有关,就是说因为我们做的比较专和精,在现在微服务现在整个的软件架构里边分得很细,你打算未来的跟这种后边的生态,包括跟其他开源的community或者是项目,你们对其他的相互支撑这种比如像 Kubernetes 等等这些项目你们是怎么考虑的?

    温铭

    APISIX 现在已经对 Apache SkyWalking、Zipkin等进行了插件支持,因为APISIX 其实是一个流量入口,他天生的就需要和其他的一些开源项目去做一些配合,然后它才能自己变的,其生态才能会更好一些。 所以我们后面比如说我们会支持像Apache Dubbo,然后还有像腾讯 TARS 之类这种在微服务里面经常会用到的一些 RPC 的框架,会和他们去做一些对接。我们现在支持 Kafka,以及Apache 基金会的另外一个类似的项目,Pulsar。 还有云原生和k8s,APISIX 本来就叫做云原生的网关,我们会天生希望支持K8s这样的项目,比如说我们希望有基于APISIX的 K8S 的控制器,其实社区已经有一部分实现了。 说到 k8s 今天还有一个同学在邮件里面发邮件,他希望去贡献 Helm Charts 的一些APISIX的一些支持,也是希望能够把APISIX 更好的在k8s的环境上面给跑起来。这些生态我们会做一些。 经常有人会问,APISIX 为什么要把它的性能做得特别的好?对于API 网关的场景来说,其实不用把它的性能做到这么好,我们现在的性能已经做到和原生的 nginx 的性能是差不多的,甚至在某一些场景下,我们的性能比nginx性能还要好。 为什么我们要以性能在主打了呢?其实我们不只是想把 API 网关这层面给吃掉,我们其实更希望的是 APISIX 后面能够把自己扩展到 k8s的网络层,所有七层流量都通过 APISIX 来处理,这个可能就是一个比较大的比较长远的这样一个计划。

    姜宁:

    我刚才听到实际上因为 APISIX 其实也在跟其他项目在做合作,你觉得有什么困难的地方吗?或者是 ALC 北京能帮帮着做什么样的事情?

    温铭

    我觉得可能是我们的扩展的这种东西越多,越能感觉到自己不懂的东西太多了。 比如 Kafka 插件,是奥地利的一个 contributor 贡献的。如果让我自己从头写的话,我可能要花很长时间才能写出来。比如要对接Dubbo、pulsar等更多的项目,其实对我来说就是一个完全全新的领域,可能我需要那边的同学来给我大概的去讲解一下,可能我才能会比较好的去上手,或者他愿意贡献回来。就像吴晟去贡献了Nginx 的 Lua 库,如果没有那个库,我是没有办法在 Apache APISIX 里面对Skywalking 做支持的。 我们希望能够有这种更多的一些其他社区的贡献者,然后能够了解APISIX,然后把它们对应社区的功能,反哺回来,可能比我自己去了解他再自己写这种效率会更高一些。

    姜宁:

    Meetup这一块你可能可以去谈一些点子,我觉得更多的后面可能办一些类似于Hackthon的活动,因为在ApacheCon举办的前面三天,有一个是叫Hackthon的活动。 这个活动就是一票人说互相坐在那聊聊之后,有可能代码就写出来了,我觉得我们可以试图后面去搞搞这一活动。

    温铭

    对,其实难度也不是很大。

    姜宁:

    其实就互相把大家把接口说一说,然后把原理聊一聊,然后可能就会非常高效的(开发),因为当时我参加过一次大概做了有两天,正好那段时间正好是iPhone刚开始发的时候,我都不知道iPhone到底咋样,我就看到有几个人去买了,但是我就坐在那,我觉得那两天效率好高,写了好多东西。

    适兕主持人

    温铭和院生,你们俩还有什么需要去跟我们的听众去要说的?

    温铭

    希望有更多的中国的项目能够去进入 Apache 孵化器,然后我们也很愿意提供这种帮助。

    姜宁:

    你们作为过来人,下一棒就交给你们了。

    (一阵欢笑)

    在最初做的时候我们除了希望为大家能够容易使用好的软件作品,其实也是想减少社会冗余开发。如果大家都在做相同的事情,就有必要把它给公共化出来,这样也就容易释放社会资源,

    姜宁**:

    让我们有空去攻克一些更个性或有深度的工作,帮助提升整个社会的运转效率,

    王院生

    开源的本质也如此。而且很多大企业它也在考虑一个被锁定、退路问题,开源就是一个非常好的解决方法,而且他对个人的成长,无论是技术、朋友圈、眼界等,都是一个非常好的提升方式。 你不进来,永远体会不到,进来之后,哇,原来是这么一个好的、新的世界。

    适兕

    我觉得今天你们是作为过来人,总结的太棒了各位。感谢各位。我们今天就到这里。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +Apache APISIX 的快速之旅(全文版) | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    09 +Jul 2020

    Apache APISIX 的快速之旅(全文版)

    引言

    本周我们推出了 Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版),为了能够让更多的习惯于文字阅读的成员们熟悉我们的故事,特别推出了全文实录的文字版,请笑纳!

    Apache APISIX 或 APISIX 在下文中均指称:Apache APISIX

    正文

    适兕主持人

    Hello,大家好,欢迎来到ALC 北京 PodCast。这次我们请到的是 APISIX 的核心成员,请各位嘉宾跟我们听众打个招呼。

    温铭

    大家好,我是温铭,Apache APISIX的PPMC成员。我之前是在互联网公司工作了有10年,主要是在做安全方向,然后最近三年都是在做开源软件的商业化,也就是说我最近三年是全职做开源项目,非常庆幸今天有机会和大家一起聊聊 Apache APISIX,以及APISIX背后的一些故事。

    王院生

    大家好,我是王院生,我算是年纪比较大的一位了,05年毕业之后做了近10年的传统金融行业,在(20)14年之后进入互联网。在那一年认识了温铭,也开始做一些非常有意思的事情,从(20)15年开始做比较多的开源方面的事情,确实在做的过程中,开源、(过程很)开心让我是比较享受的。最近两三年也在尝试做一些开源方向的创业,正好跟大家一起来聊一聊我们在创业过程中的一些收获。

    姜宁:

    我叫姜宁,熟悉ALC Beijing Podcast 应该比较了解,我好像每次活动我都会在场,今天很高兴能跟同学们一起来聊聊,有关孵化以及后面创业商业化相关的一些事情。

    适兕主持人

    我们先从项目开始,目前来说, APISIX,它是什么样的状态?花简单几分钟时间介绍一下这个项目是干什么的。

    温铭

    Ok,我先来大概说一下APISIX是干什么的。简单的来说 Apache APISIX它是一个API网关,它可以帮你来处理南北向以及东西向的流量。如果不太熟悉网关的同学,就可以把APISIX简单的认为和Nginx做的是同样的事儿,只不过 Nginx是靠静态的配置文件来驱动的,你修改了任何配置的话,都是要reload服务才能生效的。 但是在APISIX里面,我们一直在强调的,它是一个动态的实时的这样的一个网关。你所有的修改包括路由、证书、以及这种限流限速以及插件的各种配置,它全都是动态的。 你可以非常容易的去修改它的内容,而不用去重载它的服务。简单来说它就可以帮你动态的管理流量。 APISIX 现在的状态, 它是在去年10月份的时候进入了Apache孵化器,到现在我们有7个多月的时间,我们发布了6个Apache release,差不多是每个月会发布1个 apache 的 release,在进入Apache之前我们只有20多个contributor,到现在我们82 个contributor, 20多个 committer, 所以我们的发展速度还是比较快的。不管是从社区的发布版本,以及我们吸收更多的贡献者,和我们对贡献者一些快速的认可,我觉得我们这方面速度都是比较快的。

    王院生

    我简单补充一点,在APISIX 之前其实也有一些API 网关,因为 API 网关实际上是一个非常成熟,并且是被大家了解了很久的一个概念的存在。是在2000年之前就在普及的一个概念,我们当时之所以要开发网关类产品并捐赠给 Apache, 是因为我们发现已有的网关并不适合云原生,结构也比较臃肿复杂、弹性伸缩支持不好,性能上也不能满足现在 IoT、5G微服务等低延迟、高并发的要求。基于以上考虑我们希望能做一个真正是社区化的,如Apache这样的组织,能够持久的做大家都需要的产品,所以我们发起了 APISIX 这个项目,我们当时发起这个项目的目标,要把它的性能、扩展性等方面做到一个极致。这是我们一开始的目标,现在来看我们距离这个目标越来越近。而且对 Apache 的文化也有了进一步的认识,尤其是多样性、多元化,是非常契合我们当时的愿景的。我们 PPMC 里面除了少数几位我们公司的,其余都是来自各个不同公司的,将近有20多家公司都在参与,这还只是committer部分,如果算上contributor的话,还有更多的人参与。

    姜宁:

    我这边有一个问题。去年差不多是这个时候,我们正好是在上海开OpenSource Summit,温铭找到我说有项目要捐给 Apache。我回过头来看的话,实际上你们从有点子然后进入Apache,到发展到现在这个程度,作为我接触过的Apache项目孵化来说,算是做的走的比较快的。 从最开始跟你接触的时候,感觉对开源其实已经有一些了解了,而且社区怎么玩其实是比较清楚的,以至于后面很多事情实际上你们都自己做了,我觉得我基本上没帮上什么忙。 所以反过来的话我就想问一下,作为发展的时间其实挺短的一个项目,但是比较成熟。我觉得和你自己背后的那些开源经验会有很大关系。以上是作为问题的铺垫,二位可以介绍一下这方面的经验,以便为后面的想加入到 Apache,参与到孵化项目的同学也能提供一些参考。

    温铭

    没错,其实我和院生做开源确实比较早,我可能会更早一些。我是07年毕业,当时去了金山毒霸,我所在的部分其实就有很多在开源社区的,基本上是从那个时候我就接触到开源社区,知道原来开源不只是可以贡献代码,比如说我们去组织一些活动,去翻译一些文档,写一些技术的文章,其实也是参与开源一个比较好的这样的入门的一种方式。所以当时我们算是种下了一个开源的种子。 然后在15年左右的时候,我们开始去做 Open Resty社区, 包括写电子书,当时并没有想到这个居然最终能做成一个社区。当时我们只是说我写一本电子书,方便我公司的同事能够更好的去学一门技术。我自己对后来的同学培训的时候,我也不用去给他讲很多的东西,让他直接看书就ok了。 我们所以当时算是无心插柳,就进入了Open Resty这个社区里面去,在这个过程中从零把社区给搭建起来,认识了很多不同公司的人。对,这个算是我们之前的一些积累,所以APISIX也不算是零启动。 虽然我们之前有了一个社区的热身,但是 Apache 和我之前参与其他社区,比如说Python的社区,Open Resty社区,给我的感觉是完全不一样的,因为在 Apache 里面其实并没有一个人是说了算的,比如说我和院生对 APISIX 贡献了很多的代码,但是这个社区并不是说我们两个就可以说我们要做这件事,或者说我们要做那件事,并没有一个独裁者的存在,这是我觉得我非常喜欢 Apache 一个很主要的原因。因为在里面其实大家都是平等,然后互相讨论问题的时候都是很友善的这种方式,所以我感觉就像程序员的 “桃花源” 的存在。 Apache 对我来说就像一个发现了非常美妙的地方。我很认同 Apache 的文化,比如说大家都投票,一人一票的去决定某一个事情,或者是说所有的事情都要在邮件列表里面公开讨论。在做一件事情之前,先要 discuss,然后再 Vote,都是异步的,还要等三天时间等等,可能国内的一些同学觉得不太适应,但是我觉得你如果经历过一些其它社区的痛的话,就非常能感觉到 Apache 的做法其实非常的好。Apache 给出了体现平等和自由的流程,而且是用基金会的形式帮你把这个东西固定下来。 我记得有一个Apache APISIX 的贡献者,我给他发 committer 邀请的时候,他问我的第一个问题是:我会不会因为有了 committer 的身份,后面就需要花更多的时间和精力在这个项目上面 ?我说其实是不用的,这个committer 是对你历史做的贡献的一个认可,不会对你后面有任何这种要求。 然后他第二个问的问题是:会不会因为我后面没有做贡献,committer 的身份就被取消掉**?**我说 Apache 里面的这种贡献是永久的,大家没有权利把你的 committer 的身份给拿掉,因为它是对你历史做的贡献的一个认可。 对,所以这两个问题其实也是很多国内做开源经常碰到的一个问题。我做的贡献会不会能够被公平的对待,我会不会因为背上我一些这种思想上的包袱,我觉得 Apache 在这方面会做得比较好。 我举得我蛮喜欢Apache文化的。

    适兕主持人

    温铭你刚才提的 committer 的问题,他是以公司的这种思维来思考ASF和Open Souce Community,我觉得相当典型。

    温铭

    他其实也一直在玩开源。也一直在给开源社区去贡献。但是从来没有说我突然给你一个官方的认可。

    姜宁:

    这块我可以补充一下,为什么Apache 有这样的要求或者这种practice,其实他更多的是你是以个人的身份参与进来。我们在签 CLA的同时,如果你是受雇于公司同时加入Apache的话,需要公司那边还要再签一个协议,就是说允许你在上班的时间也能给Apache这边做贡献,而且你做这些贡献是捐给Apache的,相当于是公司派你去给Apache打工,所以他后面的所有的任职都是以个人身份,这样就带来一个好处,如果这个人换公司的话,不会对他有什么太大的影响。 对我自己来说的话,我可能前前后后可能换了三四家公司,然后因为但都是在Apache这边,以前的话只是公司名发生变更,但我们 team 是整个就被收购来收购去,具体的工作内容没有变,但是 manager 那块的话,其实他们需要去签协议了,但跟我没有什么太大关系,我反正我大概知道是有这么一个过程,然后到华为为这块的时候其实也是一样的,就相当于我们也去签公司的CLA,我觉得这样的话相当于从法律框架上面把怎么说就变成“包产到户”了。 你做的所有的东西其实是一直可以存在的,也给了程序员一个机会,我们现在能看到做比较成功的一些项目,他们其实是在大的互联网公司创建这么一个原型,然后后面逐步的商业化,例如像Kylin,Kafka 这样的公司。这些创业公司其实也是基于一帮人,在大公司工作的过程当中做的这些事情变成开源项目,后面他们基于这些开源项目成立了商业公司。我觉得捐基金会可能也有好处,基本上是把IP这个事情理清,然后有一定的法律框架去保证这个东西,就是你做的事情和公司这个事情能有一个比较好的切割,然后保证这些项目能够持续不断的得到演进。 只要你愿意啊,以个人为单位的这种权力授予的话,是去保证你在任何时候都可以回来,而且之前刚刚温铭提到的就是你得到这个title,其实是和你以前做的工作有关。如果想维持你的 credit,或者想保证你在社区的影响力的话,其实你还是要持续不断的去做这个事情,不是说你做完了就到头了。但是我觉得这种积分或者这种对你认同的这种机制是保证了你做的这个事情是得到公平对待的,然后和你的雇佣状态是没有直接关系的。Apache就一直在坚持厂商中立的这么一个原则,尽量去避免这种商业影响,这一块做的还是比较好的。

    王院生

    我也有这方面感触,我说一些自己做开源社区的一些体会心得。我们在做 APISIX 之前就已经做了几年开源社区经营,他们之间确实有一些共性的东西,这让我们适应 Apache 文化确实比较容易。 我举几个小例子,比如说你怎么看待社区中的一些抱怨,这是永远都存在。你做一件事,不敢说你永远做的都是对的、完美的,比如说我使用体验不好或者安装很麻烦、文档写的不清晰等等这些问题。那么社区可能散发的是一种不友好、或者是一种不开心的状态,上次我们和Craig 聊的时候 ,Craig Russell 主席告诉我们:抱怨也是爱。没有无缘无故的抱怨,是因为喜欢想让他变得更好才会来抱怨,在你和一个人没有见过面,很多时候文字理解偶尔会有情绪传达偏差,社区管理者要永远往往好的方向想。 这个就是我们以前做开源的时候,得到的一些基本的东西。 开源项目的文档是非常重要的,对于国际化项目英文文档就更必不可少。我们从一开始就对 GIT 的提交记录、Github issue 等默认使用英文,这样对于所有社区爱好者,大家会有意识的保持前后一致使用英文贡献。偶尔会有一些 APISIX 会私信我,他说不好意思去写 ISSUE,为什么呢?是因为英文不好。所以一个项目,创始人从开源第一天是怎么想的,如何带队的,就非常重要。 这种影响其实是双向的,说一个比较有意思的事情,APISIX 可能是第一个外国朋友帮我们写中文文档的项目。这位贡献者来自奥地利的,在提交的 PR 中除了必要的英文文档他把中文文档也写好了。在我们进入 Apache 基金会开始孵化,无论是邮件还是 ISSUE ,我们基本没遇到大的坎,尤其是沟通语言上。 还有一个比较关键的点就是要引导社区在公共平台上交流,避免线下的单向联系,期望用户多到公共频道交流把知识沉淀下来的复用。非常推荐用大家去用邮件列表,但由于中国人的沟通习惯,很难说由一两个项目都把用户的沟通习惯改过来,需要多去引导。让这种公开讨论的习惯逐步养成,困难虽大,但确实非常值得。 有了之前对社区的经营积累,当我们再去适应 Apache 文化时,除了邮件讨论这块花费了一些时间外,其他都感觉到特别适应,甚至可以说是二次的强化。APISIX 之所以能够比较快的能够达到现在的状态,除了有贡献者比较多,参与公司比较多外,上面这些点也发挥了不少作用。

    姜宁:

    刚才正好院生说的这边可能习惯的力量还是挺大的,之前的 APISIX大部分的参与者是不是都有开源的一个经验,然后可能社区里面也形成了这样的习惯,导致于我们的做事方式可能也反过来去影响了老外,但这里面可能会有一个问题,你总会有从 0 开始的,可能最开始是你们两个温铭和院生你们两个,然后你后面怎么去扩展到让更多的人去接受这些习惯或者这些Best Practice?

    王院生

    这些习惯其实,我觉得所有的程序员,Ta在看你在用的东西,它首先都要有一个学习的过程,我觉得所有人都一样,比如说我给别人贡献,我都要先看看别人这些大致的什么样的习惯、方法,甚至包括提一些issue怎么提,已有的issue大概写成什么样子的, 我举个特别简单的一个例子,我前两天在使用 Tengine 我发现了问题,我准备给他提一个问题,打开它的 issue 列表全是中文,我就不动脑子直接写了中文。但是中文写完后,感觉不对还是默默的在下面又翻译了一个英文版本。如果项目一开始没给大家传达正确基本规矩,后面很难改。如果你想要成为一个国际化的项目,那么从第一行代码、第一个 issue 开始就要传达这方面的信号。这是我一个个人的理解。

    姜宁:

    其实跟coding style 或者是 code of conduct的这些就是可能最开始要把规矩立好。我自己经验如果我要去融入到别人的社区的话,也要 follow 别人的那些东西,但的确这个标杆是一个很大的问题。

    王院生

    是的。

    姜宁

    温铭你这块有啥需要补充的?

    温铭

    这块我和院生差不多。但是APISIX 它加入 Apache 之前并不是一个冷启动的一个状态,我们是在2019 年6月份开源,然后10月份进Apache 孵化器。 APISIX在疫情之前,它都会保持每个月有一个线下的 meetup,然后我们也会写一些宣传的文章,去讲我们这个项目,所以我们大部分的贡献者其实是通过这种包括线上文章的传播,然后线下的meetup这种形式,慢慢地启动起来的。等于说最开始是参与APISIX的一批人,等于说是被我和院生的之前在社区里面做的一些事情,然后觉得我可以他们之前做的还不错,然后他们新开了一个项目,我们可以去参与,差不多冷启动,是这样一个状态。 所以都是知道我们认识我们的这一批人,然后可能会先跳这个坑里面先看一看。

    姜宁:

    我这边问题是做启动的有什么好一点的经验可以分享给大家,因为我们可能后面也会有很多的项目开源,怎么去吸引人。

    温铭

    我觉得我上一次和Justin和Craig见面的时候,我当时和他们说了,我们现在想捐给Apache,然后他说我们现在的初始的PPMC的数量太少了。 我当时的疑问就是:我们现在的项目就只有20多个贡献者,而且很多的贡献就只是一个两个PR,我如果把这些人都邀请进入PPMC,我会有一些担心。比如我不知道他们的能力怎么样,后面会不会持续贡献,但是当时Justin和Craig给我的反馈,刷新了我的一个认知。他们说:“当你把他们邀请进来,如果他们同意加入进来,会不会贡献更多的commit?” 那么很大概率上他们会因为我邀请他进来会继续贡献,那么这个其实就够了。 committer,是对他历史贡献的荣誉,是一个称号,并不是一个在公司里面的是一个职位。对,所以我们为什么后面就很积极的去邀请一些贡献者,能够很快的升成committer或者PPMC,我们觉得我给了你这份荣誉和title,那么你会更积极的去回馈社区,这个就是我们的目的。 所以我觉得可能会需要这个项目的最开始的几个代码的贡献者的心态能够更open一些,自己去往后站,然后把更多的人给往前面去推,这个可能会比较重要。

    姜宁:

    之前第一期跟吴晟那边聊的时候,那里面就有一条适当往后退一退,然后特别是那种项目的创始人,大部分大家觉得都可能顶着有这种光环,但是你要让更多人能够成长起来,特别是这种新鲜血液,能够觉得他是项目很重要的组成部分,这块的话是会持续让他让能够贡献,然后我觉得因为我们之前跟Justin也聊得比较多,而且上次的话应该是9月份在上海的是一个 Apache 的meet up。对,那次我们正好是做华为的HC然后就正好把Justin和Craig请过来,然后我们就弄了一次meet up,还下着雨,我就赶着赶紧回去,然后你们还帮着招待一下,请他们吃烤鸭我记得。

    王院生

    对。看来烤鸭很管用。

    姜宁:

    而且我觉得因为我之前跟Justin聊的比较多,他是对这个Committer的门槛有比较多的想法,基本上尽量要把门槛降低一些,然后让更多人能够进来,(让更多的人有)committer的权限,我们并没有失去什么。 但是因为这个鼓励可能会让更多人能够更好的参与到开源来,为项目来做贡献。但这里面也不排除就是有些人为了打卡什么之类的,得到 committer 之后就消失,但这种人可能还是会比较少。 因为在社区里面更大的一个程度上,就是你的credit,你的 reputation,你的 influence 其实是靠你日常的这些工作赢来的,如果你不做这些工作的话,可能这些东西就会慢慢的离你而去,然后你也就会淡出了。 如果你持续来做这件事情的话,你的 credit 是在不断的在增加,我觉得这可能也是我愿意拉着一票人的搞 ALC Beijing 的一个很重要的原因,然后我发现现在我做mentor,我感觉我没有之前的那么强的动力是因为是觉得现在已经有很多人起来了,然后我觉得我可能要做一项更有意思的事情。就是项目带动更多的项目来,因为其实 Mentor 的工作这块,我们就常用就是那几板斧,我觉得你们其实已经玩得都很顺了,我也希望你们毕业之后,院生、 温铭,我觉得还是挺希望你们能够帮助其他的这些,然后把你们的这些成功经验继续传递过去,这几板斧我还是以有些作用的。 只不过我现在觉得,我们社区还有很多没有做到的事情,比如我们能让更多的项目能够合作起来,把我们开源这些理念,这些好的 practice 能让更多人知道,这也是我们找大家聊一聊的一个很重要的原因,把大家做项目的一些心得传递给大家。我觉得你们的项目为什么能发展得这么快,然后孵化效果又这么好的一个很重要的原因,也是因为你们前期的铺垫工作真的是做的比较好,因为你之前在社区里面做的那些影响力带动了一票人,然后这些这票人又过来来支持 APISIX就这块可能是比较好的。 另外一点的话我想问一下,因为我们能看到 APISIX也有很多以英语母语的这些开发者,不同母语的开发者就是他们有什么样不同?

    温铭

    我这边看到 Apache APISIX 有一些在欧盟的贡献者,他们应该都是学生,他们会对开源项目,对APISIX会问很多问题,不管是在github的issue里面,或者是在邮件列表,甚至他们也会经常发邮件私信发给我会问很多问题,比如说APISIX的功能点为什么要做,然后它的某一个技术点具体是怎么实现的?如果我要实现这个功能,我应该怎么去做然后呢,他还会把自己的一些看法很详细的给你列出来。 所以我觉得这些都是能够接触到的形成正向反馈的这样的一些事情。而我接触到了其他的一些贡献者,比如说讲中文的一些贡献者,他可能更多的会是直接就给你提一个pr上来,或者直接来一个 issue 说我这个地方出了问题,而很少会去给你去详细的描述一下他这个问题的原因,或者是给出一两个解决方案。

    姜宁:

    这个是我觉得可能不太一样的一些点。贡献者里面是学生的,也大部分是一些英语的这种贡献者会居多一些。这个可能会有一个现在我们想向学校扩展,因为Apache在国内,在学生团体里面就是他的影响力还是有的,只不过大家还不知道怎么参与到项目中来。一般来说我们借助google Summer of code,还有编程之夏这些活动来让大家深入参与到开源项目中来。对,你这边应该也有人报名编程之夏的活动。

    温铭

    简单说一下情况。暑期 2020 是中科院软件所主办的,我们现在报名的有两个同学,都是大二的学生。他们其实有一个是之前就已经参与了APISIX前端的一些开发,已经给APISIX提了一些pr。另外一个完全从他们的学校的宣传里面知道了APISIX这个项目,然后参与进来的。

    姜宁:

    好像另外我可能也认识,可能也是ALC北京的一个志愿是吗? 二夕, 因为我订的邮件我大概能知道,我能看到他在那发邮件。对。我觉得可能真的是会有这种reference,他在这块晃一晃,然后在其他地方晃一晃。因为我记得上次播客的时候,我们有一个例子,好像也成功“安利”了一个 ShardingSphere 的 committer,这个人是在知乎上面去问问题,然后说贡献什么样的开源项目会比较好,然后我就在知乎上跟他说了一下,你可以看一看ShardingSphere,然后就成功把他“安利” 成committer的了。我觉得这个其实是挺有意思的一件事情,而且我觉得是可以拿去吹一下牛的,就怎么让大家的入坑。

    适兕主持人

    温铭,我正好我们的用户发现很多啊, 这个短短的一年,而且还有半年疫情期间,你怎么做到?我看见用户还不仅是一些互联网公司,还有一些传统的公司。

    温铭

    对,其实是这样的,我刚才有提到APISIX在疫情之前,每个月都有一个线下的Meetup,通过线下,其实我们能够和用户能够面对面的去聊,这样的话其实比线上沟通的效率会更高一些,这是一个方面。 第二个方面是APISIX它的底层是基于Ngnix+Lua,然后这个技术站去做的。而我和院生之前做开源社区的几年都是在Ngnix+Lua这个技术栈架构上去做的社区,所以我们能够比如说APISIX发一个版本,然后我们写了一篇文章,我都能够很快地触及到技术站里面的大部分的开发人员,这个可能是其他开源社区没有的一种优势。 然后另外一点,APISIX是个开源项目,但是我和院生也会基于APISIX做一些商业化的版本,我们会基于它做一个开源的商业公司,所以我们也会去去找自己的这些渠道,去把开源项目推到更多的像传统的公司里面去,去尝试去解决他遇到的一些痛点和问题。 其实我们是有多个渠道去推广项目的。

    适兕主持人

    APISIX的现在网上网站上公布的用户, GitHub 仓库列出来的,是你们努力推广的结果。

    温铭

    是这样子,我们在 github上面有一个issue,然后issue就是说你正在用的话,你可以把你的公司名,然后你的联系方式,你的使用场景写在Github的issue上面,给大家参考。然后所以我列出来的那些都是从issue里面给拿出来的一些公开的信息。

    姜宁:

    对,我觉得你这块是这种方式会比较好,让用户主动的去说这件事情,因为以前我们维护的Apache项目的话,基本上都是在邮件列表里面,可能某个人他有公司的邮箱,问了一个问题之后,我们可能才能推断哪一个公司做了这个事情,但我们其实原来也没有专门去列用户墙这么一件事情,是不是这种原因?

    适兕主持人

    就说原来是我们分邮件列表的一个列表,然后Developer出一个列表,然后就没有去跟他们这样一种issue去贴一个标签,或者这是专门是放有事 use case,有这个原因吗?

    姜宁:

    以前的项目的宣传可能完全是靠口碑,你要想在一年的时间内打开市场的话,其实还是比较难的,我觉得 APISIX相对来说给了我们一个比较好的启发,我们可以借力打力,在一个成熟的社区,为我们的(新项目)做一些导流的事情。其实最难的是要找到你项目对口的那些用户还有开发者,社区其实是建立可能是需要一段时间的,但如果你能直接找到你的目标用户的话,我觉得前期其实温铭那边,它有公众号,然后还有一个是加了微信,然后你基本上能知道你们又在做meetup,而且哪些meetup基本上是到用户现场,要么就大厂,要么其实可能是一个用的比较多的用户的场景里面去。 我记得好像有公司去赞助吧, 就是Meetup,你们简单说一说,因为我们可能 ALC 北京可能后续等疫情好一些的话,我们也会做一些Meetup,你们 Meetup 这方面的经验可能对我们会有一些帮助。

    温铭

    Meetup我们去年是一直和又拍云一起来合作的。因为我们当时没钱,等于说是又拍云出现场地费之类的,会Cover费用这一块,然后我们通过我们的社区去找一些当地的讲师出来。 关于话题的话,我们其实并不限定在 Open Resty 这里面,我们比如说讲Nginx,讲 Kong ,讲微服务的等等。它其实都是围绕着一个大的主题,比如说云原生,微服务,网络之类的。围绕着比较大的一个主题,大家还是比较愿意来听的。其实我们这边也一样,如Apache是一家慈善组织,也没有钱给你做这种活动,类似meetup的费用之类的,更多的需要的是在金钱上资助的一家厂商,这样会好些,公司也可以导入一些新鲜的血液进来。

    适兕主持人

    我正好有一个感慨,就说其实是我们在线上的这种协作,其实是是现实当中的一个增强。不知道在座的几位有没有什么新的看法,就是我听温铭的故事,我觉得线下更为重要一些,就是说面对面的交流,然后去推广自己的用户和潜在的开发者,交流更加的充分,也更能获得信任。是不是这样子?

    温铭

    你如果是站在开源项目的角度来说,线上和线下的区别不是很大。但是在线下的一个好处就是你能沟通的更充分,比如说有些问题他可能在线上不太方便问你,或者是觉得表达的不是很清楚,那么在线下的时候他就可以拉着你面对面的去聊,会聊得更透彻一些。我觉得可能会是这样一种大家能够没有顾虑的去聊一些事。

    王院生

    我稍微展开一下,我们经常会遇到类似问题。当时是四川成都的一个开源用户做调研,起 、初他决定使用 APISIX,后来他放弃了,放弃的原因他在网上留言一笔带过,然后我也就理解他留下的文字内容。但实际上当我跟他见了面后,才发现真正的原因与文字内容相距甚远。很多时候只能面对面沟通后,才能够把他的真实情况表达完整,线上交流比较容易出现理解偏差,不是所有人都有清晰的表达能力。 貌似中国人的害羞是与生俱来的,做社区会特别能够感受这一点,很多用户都特别喜欢单聊,为什么?因为他单聊他不害怕跟你说错话,说错了也无所谓,因为只有你一个人看到了。但是他如果在群里边聊,如果问了一个很特别特别小白的问题,他就会觉得自己丢面,然后所有的人面前他都觉得没有没面子,所以就喜欢单聊。但是你在线下的时候往往就不太一样,因为他可能当时脑子又没那么快没转过来,又着急的一个问题,能把他所有问题都都给抛出来了。我们与我们的商业客户沟通,也有类似的问题,这个应该就是线下沟通的独有优势,他确实跟线上有一些不一样。 刚刚你有一点说的我很认同,就是说是谁更合适或者哪个更好,其实这个很难说,我们现在也不敢说是不是线上的一定比线下好,但是他们两个的相互结合肯定更好。由于沟通方式很不一样,也能够从对应的角度看出不同问题。比如线上交流可能更多暴露的是文档问题,如果用户犯错,大概率是文档没写清楚,这时发现后,就要去新建 issue 或更新文档了。

    温铭

    线上私聊的我基本上都不回。即使回也是让他到GitHub开个issue之类的,但是线下私聊可能会和他聊两句,但是线上就是QQ单独找我的,院生可能会回,我基本上都不会回。

    姜宁:

    以前也有好多人跟我单独发邮件,说找我要demo或者什么的,我觉得回了就没有什么价值的,我也是往那边推,然后我还有一个是说是你要给我单独付咨询费吗? 对,这里面其实有一件事情跟创业有关,因为我以前接触到的聊着很多国内的开发者,然后很多时候他们可能也会存在潜在的这种商业支持,但是感觉他们不是 decision maker,其实这一块我不知道对APISIX这块有没有什么影响?

    温铭

    确实在做to b的话,特别因为APISIX是最终如果有用户买单的话,他是有一个走to b的这种决策链儿,一般去问你问题的,一般都是对一些具体的开发人员,他一般没有这种决策的权限,所以如果我们觉得他可能会是一个潜在的付费用户,我们就会问你们现在是处于一个什么阶段?是属于一个互联网公司,自己去玩玩,还是会是一个传统的公司,现在在去选型,可能我们会做一些这种筛选之类的。 确实to,b的,比如说我们已经有了一些付费的用户,其实他的决策链都是要在半年以上的,都是会比较长。

    姜宁:

    其实是如果要维护客户关系的话,其实你额外的还需要做一些。并不是说跟那个人聊嗨了就签了,有没有成功的案例?

    温铭

    这还比较远,因为和我们能聊嗨的都没有决策权。因为有决策权其实可能对技术的理解,就是它不只是站在技术层面去考虑问题了。

    姜宁:

    你觉得对你来说或者对现在的公司来说的话,你做的那些meetup或者发展的这些开发者,然后反过来对你的商业成功会有多大的帮助?

    温铭

    其实帮助还是挺大的。因为APISIX真正去开源,然后成熟能够在生产上用,其实也就是不到一年左右的时间。 但是通过比如说开源社区的,我们做meetup,我们做开源项目的一些传播,能够让更多的人知道APISIX。后面要做网关,去处理南北向、东西向的流量,我会有一个更好的选择,可以把 APISIX 放到他考察的列表里面去。 我们现在主要是在做这一步,因为最终去做选型,做选型对比的还是具体的开发去做,我们现在至少能够从下往上这样的,去先把具体的开发人员能够影响到。

    姜宁:

    其实这块我以前经验的时候,我们有接触到很多开发,但是中间我觉得可能就是商业的支持。因为那时候我们在红帽,然后其实我们在红帽的国内的支持力度其实并没有那么大,导致于其实如果我要去创业的时候,其实会有一些问题,那条路我们不清楚会是怎么样的,而且特别在国内体制里面的话,你这个公司能进到人家的采购目录里面,你可能国内很少有那种咨询公司能去搞这种事情,现在这块情况有没有好转?

    温铭

    如果是一些央企或者一些政府的话,确实还是一样有这个问题。其实你的资质什么的都没有,没法去纳入他的供应商的采购目录里边去,你根本连招标的资格都没有。 像一些互联网公司或者是一些那种流量比较大的一些传统行业公司,其实他们对技术这一块,比如说他们会有一些创新项目的招标,或者是一些比如说他们会为类似于云原生,微服务、分布式数据库,类似这种比较新的技术会单独去开一些绿灯,它会让一些之前没有办法满足它招标的这样一些公司的产品也可以进到里边来。

    姜宁:

    我觉得可能和现在提的这种自主创新或者是并不是简单的去采购,因为以前选的话,我记得10年前的话可能就 IBM,反正你要有钱的话,你就买IBM就没有错了,反正有的给你背锅,IBM都解决不了的问题,世界上应该没有其他公司能解决了。现阶段的话你选IBM可能就并不能完全达到解决问题的目的,你自己有没有尝试去解决这样的问题,我觉得小一点咨询公司或者创新型的科技公司的话,反而是不是机会就多一些了?

    温铭

    我觉得应该是的,因为其实现在技术发展得很快,一般的话比如说一个技术的问题,现在的开发看到的第一个点,就是说这个东西我能不能用开源的方案给解决掉,而不是说我买一整套商业公司的产品。

    姜宁:

    因为可能大家会有更多的拿工具拿开源去解决他实际问题,到这个时候的话,开源项目的背后的公司可能就它的价值就体现出来了,

    温铭

    对,至少我们是原厂的。

    适兕主持人

    我是根据刚才线上线下的差别,然后引申出一个问题,就是说我记得你在去年的COSCon, 开源社组织的大会有一个分享,怎么玩基金会,从你是一个基金会的发起者或者是整个的创造者,然后最后加入ASF这么一个过程,你对比你能给说一下一些感慨。

    温铭

    软件基金会其实有很多类,像asf —— Apache 基金会,它是个人会员参加的,像Linux基金会其实是企业会员参加的,所以 Linux基金会就特别有钱。 而我们之前做的 Open Resty 基金会,其实我们也是希望做成一个 Apache 式的这样的一个基金会,个人参加,然后我们去用个人之前的一些开源上的一些经验去能够孵化一些项目出来,这是我们当时的一个初衷。 但是最后基金会只是说我们接受了老罗,锤子科技的一些捐款,但是并没有真的像我们想的一样去做一些孵化的项目,我觉得其中可能的问题是因为你没有办法去建立一个像 Apache 基金会的那种大家都能公平参与,没有门槛,没有独裁者的这种环境,这其实是比较困难的。 当时的 OpenResty 其实是以中国人为主,大家都不愿意退后一步,这是我们当时没有想到的一点,往后退一步对大家的要求实在是太高了。 有一种声音,说中国也应该要建自己的软件基金会。其实我觉得不太确定它是一个能不能真的去孵化出来一些世界级的项目,但是我觉得在建立自己的这种基金会之前,更应该参与到其他的开源项目上面去。比如说参与 Apache 基金会,参与Linux基金会这种成熟的基金会,在里面去把更多国内的开源项目放到里面,孵化出更多好项目,其实我觉得可能会是一个更好的选择。

    王院生

    这块跟你想法是一样的,我可能唯一要说在接触 Apache 文化之前,当时Justin说我们要往后退一步,然后通过人进来的时候,其实刚开始我也确实是犯嘀咕的,有些犹豫。但是从我们真正去落地实施之后的结果,其实本身我之前完全是想多了,因为等于说我没有在放下之前,我总觉得比如说在这个是我跟温铭或者少数几个人写的,我就觉得他可能就是我的孩子会有这种情节在里面,当实际上你放开了以后,其实它依然是依然还是你看他是宝贝,你永远看他是宝贝。

    温铭

    有一点不一样,我记得我当时进 Apache 孵化器,我不记得是谁和我说过,说你进入孵化器就意味着一个重要的选择,这个项目可能是你一辈子的开源项目,但是他并不是你的,你知道吗? 就是从所属权上来说它不是你的,但是你对他的这种情节其实可能会更深一些,因为会有更多的人参与进来,更多的公司在用,这个其实才是创办这个项目最有意义的一个点。

    适兕主持人

    我想问一个可能跟你们的未来有关,就是说因为我们做的比较专和精,在现在微服务现在整个的软件架构里边分得很细,你打算未来的跟这种后边的生态,包括跟其他开源的community或者是项目,你们对其他的相互支撑这种比如像 Kubernetes 等等这些项目你们是怎么考虑的?

    温铭

    APISIX 现在已经对 Apache SkyWalking、Zipkin等进行了插件支持,因为APISIX 其实是一个流量入口,他天生的就需要和其他的一些开源项目去做一些配合,然后它才能自己变的,其生态才能会更好一些。 所以我们后面比如说我们会支持像Apache Dubbo,然后还有像腾讯 TARS 之类这种在微服务里面经常会用到的一些 RPC 的框架,会和他们去做一些对接。我们现在支持 Kafka,以及Apache 基金会的另外一个类似的项目,Pulsar。 还有云原生和k8s,APISIX 本来就叫做云原生的网关,我们会天生希望支持K8s这样的项目,比如说我们希望有基于APISIX的 K8S 的控制器,其实社区已经有一部分实现了。 说到 k8s 今天还有一个同学在邮件里面发邮件,他希望去贡献 Helm Charts 的一些APISIX的一些支持,也是希望能够把APISIX 更好的在k8s的环境上面给跑起来。这些生态我们会做一些。 经常有人会问,APISIX 为什么要把它的性能做得特别的好?对于API 网关的场景来说,其实不用把它的性能做到这么好,我们现在的性能已经做到和原生的 nginx 的性能是差不多的,甚至在某一些场景下,我们的性能比nginx性能还要好。 为什么我们要以性能在主打了呢?其实我们不只是想把 API 网关这层面给吃掉,我们其实更希望的是 APISIX 后面能够把自己扩展到 k8s的网络层,所有七层流量都通过 APISIX 来处理,这个可能就是一个比较大的比较长远的这样一个计划。

    姜宁:

    我刚才听到实际上因为 APISIX 其实也在跟其他项目在做合作,你觉得有什么困难的地方吗?或者是 ALC 北京能帮帮着做什么样的事情?

    温铭

    我觉得可能是我们的扩展的这种东西越多,越能感觉到自己不懂的东西太多了。 比如 Kafka 插件,是奥地利的一个 contributor 贡献的。如果让我自己从头写的话,我可能要花很长时间才能写出来。比如要对接Dubbo、pulsar等更多的项目,其实对我来说就是一个完全全新的领域,可能我需要那边的同学来给我大概的去讲解一下,可能我才能会比较好的去上手,或者他愿意贡献回来。就像吴晟去贡献了Nginx 的 Lua 库,如果没有那个库,我是没有办法在 Apache APISIX 里面对Skywalking 做支持的。 我们希望能够有这种更多的一些其他社区的贡献者,然后能够了解APISIX,然后把它们对应社区的功能,反哺回来,可能比我自己去了解他再自己写这种效率会更高一些。

    姜宁:

    Meetup这一块你可能可以去谈一些点子,我觉得更多的后面可能办一些类似于Hackthon的活动,因为在ApacheCon举办的前面三天,有一个是叫Hackthon的活动。 这个活动就是一票人说互相坐在那聊聊之后,有可能代码就写出来了,我觉得我们可以试图后面去搞搞这一活动。

    温铭

    对,其实难度也不是很大。

    姜宁:

    其实就互相把大家把接口说一说,然后把原理聊一聊,然后可能就会非常高效的(开发),因为当时我参加过一次大概做了有两天,正好那段时间正好是iPhone刚开始发的时候,我都不知道iPhone到底咋样,我就看到有几个人去买了,但是我就坐在那,我觉得那两天效率好高,写了好多东西。

    适兕主持人

    温铭和院生,你们俩还有什么需要去跟我们的听众去要说的?

    温铭

    希望有更多的中国的项目能够去进入 Apache 孵化器,然后我们也很愿意提供这种帮助。

    姜宁:

    你们作为过来人,下一棒就交给你们了。

    (一阵欢笑)

    在最初做的时候我们除了希望为大家能够容易使用好的软件作品,其实也是想减少社会冗余开发。如果大家都在做相同的事情,就有必要把它给公共化出来,这样也就容易释放社会资源,

    姜宁**:

    让我们有空去攻克一些更个性或有深度的工作,帮助提升整个社会的运转效率,

    王院生

    开源的本质也如此。而且很多大企业它也在考虑一个被锁定、退路问题,开源就是一个非常好的解决方法,而且他对个人的成长,无论是技术、朋友圈、眼界等,都是一个非常好的提升方式。 你不进来,永远体会不到,进来之后,哇,原来是这么一个好的、新的世界。

    适兕

    我觉得今天你们是作为过来人,总结的太棒了各位。感谢各位。我们今天就到这里。

    \ No newline at end of file diff --git a/post/podcast/episode-4-conways-law-and-open-source-community/index.html b/post/podcast/episode-4-conways-law-and-open-source-community/index.html index 9ec32ce9..650900dd 100644 --- a/post/podcast/episode-4-conways-law-and-open-source-community/index.html +++ b/post/podcast/episode-4-conways-law-and-open-source-community/index.html @@ -1,5 +1,7 @@ -ALC Beijing Episode #4 : 技术架构、Community 和康威定律 · ALC Beijing

    ALC Beijing Episode #4 : 技术架构、Community 和康威定律

    内容梗概

    软件以其飞速的发展,经过60年的发展,再也没有一个人能够写出来可以使用的软件了,尤其是以自由/开源软件项目的壮大为证,更是让人的协作提上了前所未有的高度。 +ALC Beijing Episode #4 : 技术架构、Community 和康威定律 | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    30 +Sep 2020

    ALC Beijing Episode #4 : 技术架构、Community 和康威定律

    内容梗概

    软件以其飞速的发展,经过60年的发展,再也没有一个人能够写出来可以使用的软件了,尤其是以自由/开源软件项目的壮大为证,更是让人的协作提上了前所未有的高度。 这也就是说,作为软件的设计者,或者说开源的软件设计者,开始的时候应不应该考虑人与人之间的协作?甚至是以全球视野的想象力来介入,即跨时区的异步沟通为切入点? -那么我们不妨以Apache 软件基金会下众多的项目为例,甚至是以更广泛的开源项目为例,如Linux、Kubernetes等,探讨下关于康威定律是否适用? 架构和开源共同体(Community)究竟有没有关系?如果有的话,二者该如何理解?关系又该如何处理?

    ALC Beijing 这次邀请到了Apache ShardingSphere 的核心团队成员来谈谈、聊聊。

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 02:00本次嘉宾的自我介绍
    02:10 ~~ 10:50(Apache ShardingSphere )模块化为什么重要?如何做模块化? 给项目带来了哪些变化。
    11:00 ~~ 16:00架构的演进,所带来的组织上的一些变化。
    16:30 ~~ 20:40高内聚,低耦合的实现。
    21:00 ~~ 23:00CHAOSS 项目介绍,对项目和community之间的关系量化
    23:30 ~~ 27:50(Apache ShardingSphere )community 的成员变化,以及对新版本发布后的期望
    28:00 ~~ 31:00community 的自主性如何?是否具备提交新特性的能力?
    31:10 ~~ 34:00关于项目的工程:持续集成、持续交付等
    34:30 ~~ 38:00Apache ShardingSphere community 的构成。
    38:10 ~~ 41:00一个初入community如何成长为核心成员
    41:20 ~~ 44:00技术架构的选择对于community建设是非常关键的选择
    45:00 ~~ 52:00参与community成员得到的益处~
    52:10 ~~ 54:00引入下一期如何在Apache发版

    请收听

    ALC Beijing Podcast Episode #4: 康威定律在开源项目中的应用

    本期嘉宾

    张亮:京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目 Elastic-Job 作者。

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁(主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://shardingsphere.apache.org/
    2. https://github.com/apache/shardingsphere
    3. https://www.osgi.org/
    4. https://mobyproject.org/
    5. https://chaoss.community/software/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每月会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +那么我们不妨以Apache 软件基金会下众多的项目为例,甚至是以更广泛的开源项目为例,如Linux、Kubernetes等,探讨下关于康威定律是否适用? 架构和开源共同体(Community)究竟有没有关系?如果有的话,二者该如何理解?关系又该如何处理?

    ALC Beijing 这次邀请到了Apache ShardingSphere 的核心团队成员来谈谈、聊聊。

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 02:00本次嘉宾的自我介绍
    02:10 ~~ 10:50(Apache ShardingSphere )模块化为什么重要?如何做模块化? 给项目带来了哪些变化。
    11:00 ~~ 16:00架构的演进,所带来的组织上的一些变化。
    16:30 ~~ 20:40高内聚,低耦合的实现。
    21:00 ~~ 23:00CHAOSS 项目介绍,对项目和community之间的关系量化
    23:30 ~~ 27:50(Apache ShardingSphere )community 的成员变化,以及对新版本发布后的期望
    28:00 ~~ 31:00community 的自主性如何?是否具备提交新特性的能力?
    31:10 ~~ 34:00关于项目的工程:持续集成、持续交付等
    34:30 ~~ 38:00Apache ShardingSphere community 的构成。
    38:10 ~~ 41:00一个初入community如何成长为核心成员
    41:20 ~~ 44:00技术架构的选择对于community建设是非常关键的选择
    45:00 ~~ 52:00参与community成员得到的益处~
    52:10 ~~ 54:00引入下一期如何在Apache发版

    请收听

    ALC Beijing Podcast Episode #4: 康威定律在开源项目中的应用

    本期嘉宾

    张亮:京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目 Elastic-Job 作者。

    潘娟 :京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁(主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. http://shardingsphere.apache.org/
    2. https://github.com/apache/shardingsphere
    3. https://www.osgi.org/
    4. https://mobyproject.org/
    5. https://chaoss.community/software/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每月会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    \ No newline at end of file diff --git a/post/podcast/episode-5-inner-source/index.html b/post/podcast/episode-5-inner-source/index.html index be2b76e6..8971461f 100644 --- a/post/podcast/episode-5-inner-source/index.html +++ b/post/podcast/episode-5-inner-source/index.html @@ -1,3 +1,5 @@ -ALC Beijing Episode #5 : 内源 InnerSource · ALC Beijing

    ALC Beijing Episode #5 : 内源 InnerSource

    内容梗概

    开源越来越重要,而且在不断的吞噬着企业的软件技术栈,有的研究机构甚至得出的结论是超过95%都是开源,越来越多的软件开发者把开源的优秀实践带到企业内部。Tim OrReilly在2000年的时候发明了内源 (InnerSource)这个词,用来解释这一现象。 根据维基百科的定义,内源就是使用了开源软件开发的最佳实践,在组织内部建立起了一种类似开源的文化氛围。组织内部使用了开放的方式开发专有软件。

    为了让帮助大家进一步了解与内源相关的信息,ALC Beijing 播客邀请到有着多年开源以及内源经验的专家谭中意和我们聊一下内源这个话题。

    时间线

    时间区间精彩话语提炼
    00:00:10 - 00:03:00本次嘉宾的自我介绍
    00:03:26 - 00:06:53内源是什么?InnerSource Commons背后的故事。
    00:06:53 - 00:09:05内源兴起的原因
    00:12:12 - 00:23:12内源带来的好处有哪些?
    00:23:12 - 00:26:45企业中哪些项目适合内源?
    00:26:45 - 00:31:33员工参与企业内源项目能收获到什么?
    00:31:33 - 00:38:57内源地盘之争的解法?
    00:38:57 - 00:46:47大家真的是没有时间参与内源项目吗?
    00:46:47 - 00:50:19异步式沟通对程序员提高效率的重要性
    00:50:19 - 00:57:20内源和开源有什么区别?
    00:57:20 - 01:03:00Apache Way 能直接照搬到内源中吗?

    请收听

    ALC Beijing Podcast Episode #5:内源 InnerSource

    本期嘉宾

    谭中意: 开源社区资深爱好者, 开放原子基金会TOC副主席,Mozilla/Gnome/Apache committer。 国际内源基金会成员和布道者, 曾在多个开源大会上分享内部开源相关议题。

    潘娟:京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕:开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. 修复n年前的bug博客 https://willemjiang.github.io/opensource/2019/05/04/How-to-maintain-n-years-old-code.html

    2. 到底什么是Apache Way https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每月会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #5 : 内源 InnerSource | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    15 +Nov 2020

    ALC Beijing Episode #5 : 内源 InnerSource

    内容梗概

    开源越来越重要,而且在不断的吞噬着企业的软件技术栈,有的研究机构甚至得出的结论是超过95%都是开源,越来越多的软件开发者把开源的优秀实践带到企业内部。Tim OrReilly在2000年的时候发明了内源 (InnerSource)这个词,用来解释这一现象。 根据维基百科的定义,内源就是使用了开源软件开发的最佳实践,在组织内部建立起了一种类似开源的文化氛围。组织内部使用了开放的方式开发专有软件。

    为了让帮助大家进一步了解与内源相关的信息,ALC Beijing 播客邀请到有着多年开源以及内源经验的专家谭中意和我们聊一下内源这个话题。

    时间线

    时间区间精彩话语提炼
    00:00:10 - 00:03:00本次嘉宾的自我介绍
    00:03:26 - 00:06:53内源是什么?InnerSource Commons背后的故事。
    00:06:53 - 00:09:05内源兴起的原因
    00:12:12 - 00:23:12内源带来的好处有哪些?
    00:23:12 - 00:26:45企业中哪些项目适合内源?
    00:26:45 - 00:31:33员工参与企业内源项目能收获到什么?
    00:31:33 - 00:38:57内源地盘之争的解法?
    00:38:57 - 00:46:47大家真的是没有时间参与内源项目吗?
    00:46:47 - 00:50:19异步式沟通对程序员提高效率的重要性
    00:50:19 - 00:57:20内源和开源有什么区别?
    00:57:20 - 01:03:00Apache Way 能直接照搬到内源中吗?

    请收听

    ALC Beijing Podcast Episode #5:内源 InnerSource

    本期嘉宾

    谭中意: 开源社区资深爱好者, 开放原子基金会TOC副主席,Mozilla/Gnome/Apache committer。 国际内源基金会成员和布道者, 曾在多个开源大会上分享内部开源相关议题。

    潘娟:京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁:Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕:开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    1. 修复n年前的bug博客 https://willemjiang.github.io/opensource/2019/05/04/How-to-maintain-n-years-old-code.html

    2. 到底什么是Apache Way https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/

    关于 ALC Beijing Podcast

    该播客是 ALC Beijing 旗下的一款访谈、聊天的音频节目,每月会给大家带来Apache 相关的文化、项目、孵化、共同体(Community)建设、技术/架构等优质内容。旨在让更多的人了解Apache 之道,也希望在访谈中碰撞出更多的灵感,让本土的 Apache 力量茁壮成长。

    欢迎大家和嘉宾互动、提问,也欢迎来我们的录音室坐坐,谈谈开源和Apache之道!

    关于 ALC Beijing

    作为全球最大开源消费国, ASF 在国内有广泛的群众基础,如何将这些开源项目用户发展转换成为社区的贡献者、开发者, 甚至成为开源项目的发起者、维护者是一个值得深思的问题。

    基于对这个问题的思考,我们创建了 ALC-Beijing,并且致力于通过(但不限于)下述行动帮助开源爱好者更好的在 Apache 社区生根发芽:

    • 举办线上和线下沙龙,将本地的开发与用户聚焦在一起。
    • 通过分享开源开发经验,鼓励更多的人参与到 ASF 的项目开发中来。
    • 为 ASF 的项目寻找相互合作的机会,让这些项目能够更加茁壮的成长。
    • 介绍 ASF 管理和运作开源项目的成功之道,帮助大家更好地运作开源项目。
    \ No newline at end of file diff --git a/post/podcast/episode-6-1-apache-iotdb/index.html b/post/podcast/episode-6-1-apache-iotdb/index.html index 3e848223..9d88c5af 100644 --- a/post/podcast/episode-6-1-apache-iotdb/index.html +++ b/post/podcast/episode-6-1-apache-iotdb/index.html @@ -1,4 +1,6 @@ -ALC Beijing Episode #6 IoTDB 背后的科研故事(上) · ALC Beijing

    ALC Beijing Episode #6 IoTDB 背后的科研故事(上)

    内容梗概

    一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 03:16本次嘉宾的自我介绍
    03:20~~ 05:36创立IoTDB的原因
    05:50~~ 09:00为什么IoTDB会开源
    09:12~~ 15:00高校做开源与高校考核体制冲突的问题, 如何在论文和软件系统之间找到平衡点。
    15:11只有真的做出来一个被市场认可的东西,它才是一个能有长久生命力的东西,而不是一篇引用很高的论文。
    15:20~~ 24:36黄向东读博士期间很难拿奖学金到乔嘉林申请国家奖学金的故事
    25:20~~ 28:36在清华博士开题毕业的相关要求
    30:53~~ 45:36高校如何更好的去开展开源项目
    46:53~~ 54:55如何让老师和同学们公开的交流起来

    请收听

    ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事 (上) -)

    本期嘉宾

    黄向东: Apache IoTDB 项目VP,清华大学清华软件学院助理研究员

    乔嘉林:Apache IoTDB PMC成员,清华大学清华软件学院博士生

    王伟 (主持人):华东师范大学数据科学与工程学院研究员、计算机科学教育教学部主任,美国Wisconsin大学Madison分校和美国Florida大学访问学者,中国计算机学会高级会员,开源社理事会成员、执行长。研究方向为计算教育学、开源系统论。

    姜宁(联合主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB 采用轻量式架构,具有高性能和丰富的功能,并与Apache Hadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领域的海量数据存储、高速数据读取和复杂数据分析需求。

    官网:http://iotdb.apache.org/

    代码仓库:https://github.com/apache/iotdb/tree/master

    QQ群:659990460

    微信群:添加微信 tietouqiao

    微信公众号:Apache IoTDB

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #6 IoTDB 背后的科研故事(上) | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    30 +Dec 2020

    ALC Beijing Episode #6 IoTDB 背后的科研故事(上)

    内容梗概

    一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 03:16本次嘉宾的自我介绍
    03:20~~ 05:36创立IoTDB的原因
    05:50~~ 09:00为什么IoTDB会开源
    09:12~~ 15:00高校做开源与高校考核体制冲突的问题, 如何在论文和软件系统之间找到平衡点。
    15:11只有真的做出来一个被市场认可的东西,它才是一个能有长久生命力的东西,而不是一篇引用很高的论文。
    15:20~~ 24:36黄向东读博士期间很难拿奖学金到乔嘉林申请国家奖学金的故事
    25:20~~ 28:36在清华博士开题毕业的相关要求
    30:53~~ 45:36高校如何更好的去开展开源项目
    46:53~~ 54:55如何让老师和同学们公开的交流起来

    请收听

    ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事 (上) +)

    本期嘉宾

    黄向东: Apache IoTDB 项目VP,清华大学清华软件学院助理研究员

    乔嘉林:Apache IoTDB PMC成员,清华大学清华软件学院博士生

    王伟 (主持人):华东师范大学数据科学与工程学院研究员、计算机科学教育教学部主任,美国Wisconsin大学Madison分校和美国Florida大学访问学者,中国计算机学会高级会员,开源社理事会成员、执行长。研究方向为计算教育学、开源系统论。

    姜宁(联合主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB 采用轻量式架构,具有高性能和丰富的功能,并与Apache Hadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领域的海量数据存储、高速数据读取和复杂数据分析需求。

    官网:http://iotdb.apache.org/

    代码仓库:https://github.com/apache/iotdb/tree/master

    QQ群:659990460

    微信群:添加微信 tietouqiao

    微信公众号:Apache IoTDB

    \ No newline at end of file diff --git a/post/podcast/episode-6-2-apache-iotdb/index.html b/post/podcast/episode-6-2-apache-iotdb/index.html index 39c527b5..bbc52f47 100644 --- a/post/podcast/episode-6-2-apache-iotdb/index.html +++ b/post/podcast/episode-6-2-apache-iotdb/index.html @@ -1,3 +1,5 @@ -ALC Beijing Episode #6 IoTDB 背后的科研故事(下) · ALC Beijing

    ALC Beijing Episode #6 IoTDB 背后的科研故事(下)

    内容梗概

    一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 02:16信息分享的同时要有很多的检索机制来查找
    03:00~~ 05:11高校是开源事业发展的沃土
    05:12~~ 10:00IoTDB 进入Apache软件基金会孵化的故事,
    10:12~~ 15:00为什么IoTDB选择Apache软件基金会
    15:10 ~~ 20:30Apache IoTDB孵化前后Community的变化,德国老外也到微信群里聊天
    21:07~~ 23:00Apache IoTDB是如何保持Open的
    23:13~~ 35:36Apache IoTDB在孵化过程中遇到的转折点,如何处理人员流动的问题?
    30:53~~ 39:36开源是一个长跑,如何坚持下来?
    39:53~~ 43:55王伟老师访谈总结

    请收听

    ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事(下)

    本期嘉宾

    黄向东: Apache IoTDB 项目VP,清华大学清华软件学院助理研究员

    乔嘉林:Apache IoTDB PMC成员,清华大学清华软件学院博士生

    王伟 (主持人):华东师范大学数据科学与工程学院研究员、计算机科学教育教学部主任,美国Wisconsin大学Madison分校和美国Florida大学访问学者,中国计算机学会高级会员,开源社理事会成员、执行长。研究方向为计算教育学、开源系统论。

    姜宁(联合主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB 采用轻量式架构,具有高性能和丰富的功能,并与Apache Hadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领域的海量数据存储、高速数据读取和复杂数据分析需求。

    官网:http://iotdb.apache.org/

    代码仓库:https://github.com/apache/iotdb/tree/master

    QQ群:659990460

    微信群:添加微信 tietouqiao

    微信公众号:Apache IoTDB

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #6 IoTDB 背后的科研故事(下) | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    30 +Dec 2020

    ALC Beijing Episode #6 IoTDB 背后的科研故事(下)

    内容梗概

    一提到高校的科研,大家想到都是发论文,博士五年的输出往往都是顶会论文。而在Apache软件基金会的很多知名项目(Apache Spark, Apache Mesos)都是出自于博士生之手,这些博士不但依托自己创建的开源项目发了论文,还创业成立了自己的公司。今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 02:16信息分享的同时要有很多的检索机制来查找
    03:00~~ 05:11高校是开源事业发展的沃土
    05:12~~ 10:00IoTDB 进入Apache软件基金会孵化的故事,
    10:12~~ 15:00为什么IoTDB选择Apache软件基金会
    15:10 ~~ 20:30Apache IoTDB孵化前后Community的变化,德国老外也到微信群里聊天
    21:07~~ 23:00Apache IoTDB是如何保持Open的
    23:13~~ 35:36Apache IoTDB在孵化过程中遇到的转折点,如何处理人员流动的问题?
    30:53~~ 39:36开源是一个长跑,如何坚持下来?
    39:53~~ 43:55王伟老师访谈总结

    请收听

    ALC Beijing Podcast Episode #6: IoTDB 背后的科研故事(下)

    本期嘉宾

    黄向东: Apache IoTDB 项目VP,清华大学清华软件学院助理研究员

    乔嘉林:Apache IoTDB PMC成员,清华大学清华软件学院博士生

    王伟 (主持人):华东师范大学数据科学与工程学院研究员、计算机科学教育教学部主任,美国Wisconsin大学Madison分校和美国Florida大学访问学者,中国计算机学会高级会员,开源社理事会成员、执行长。研究方向为计算教育学、开源系统论。

    姜宁(联合主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    适兕(联合主持人):开源之道共同体(opensourceway.community)发起人,self-employee,ALC Beijing Member,开源社成员,开源布道师,作家。

    相关链接

    Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB 采用轻量式架构,具有高性能和丰富的功能,并与Apache Hadoop、Spark和Flink等进行了深度集成,可以满足工业物联网领域的海量数据存储、高速数据读取和复杂数据分析需求。

    官网:http://iotdb.apache.org/

    代码仓库:https://github.com/apache/iotdb/tree/master

    QQ群:659990460

    微信群:添加微信 tietouqiao

    微信公众号:Apache IoTDB

    \ No newline at end of file diff --git a/post/podcast/episode-7-summer2020/index.html b/post/podcast/episode-7-summer2020/index.html index 598e4054..026b78e7 100644 --- a/post/podcast/episode-7-summer2020/index.html +++ b/post/podcast/episode-7-summer2020/index.html @@ -1,3 +1,5 @@ -ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享 · ALC Beijing

    ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享

    内容梗概

    在校大学生作为开源贡献者参与到顶级开源项目中,这对很多同学来说是一件很遥远而又陌生的事情。“不知道如何参与开源项目”、“不知道如何玩转社区”、“不知道如何和社区成员交流沟通”等问题,将跃跃欲试的同学们拦在开源项目的大门之外。

    2020年暑假,中科院软件所发起来了一个非常好的学生暑期实习计划–“点亮计划暑期2020”。这个计划鼓励研究人员、开源爱好者、在校师生参与开源软件的开发与维护,促进开源软件在国内的发展和优秀开源软件社区建设,增加开源项目在国内的活跃度,在开源领域与世界接轨。 这次“点亮计划暑期2020”通过开源社区导师出题,在校学生根据导师出的题目题目进行方案设计并提向导师提起项目申请,导师在选定实习学生之后,学生会在导师的指导下进行为期三个月时间远程实习,实际参与的开源软件项目的开发与维护。

    今年的“点亮计划暑期2020”涌现出来了很多优秀的学生和导师,值得一提的是有三名学生成为Apache项目的Committer,并获得了“点亮计划暑期2020”优秀学生–最有潜力奖。 这次 ALC Beijing 特别邀请到了这三位新晋成为 Apache Committer 的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程,介绍一下大家是如何进行项目申请以及如何与导师沟通协作的。

    收听本次播客,你还将会收获:开源项目中如何给我的科研带来了灵感;参与开源我接触了很多学校中学习不到的新知识;开源社区提升了我的自信心,拓宽了我的视野……

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 04:30点亮计划暑期2020背景介绍。
    04:35 ~~ 08:39嘉宾个人介绍。
    08:50 ~~ 12:18吴舒旸同学介绍自己申请暑期2020计划的经历。
    12:51 ~~ 15:34作为导师大家是如何看待暑期2020计划。
    15:51 ~~ 19:30姜宁分享了他在GSoC当导师和在暑期2020计划当导师的不同体验。
    19:45 ~~ 24:00导师如何对学生的提案进行筛选的(导师特别喜欢主动性强的学生)。
    25:01 ~~ 32:00张可同学,江华禧,吴舒旸分享他的选题和项目申请经验。
    35:01 ~~ 42:05陈军旭,吴舒旸分享了导师和学生是如何进行沟通。
    42:20 ~~ 47:36柯振旭分享了如何拉近与学生之间距离的小贴士。
    47:40 ~~ 52:36张可,江华禧同学结合他的任务分享了他和导师交流的心得。
    52:53 ~~ 56:51柯振旭分享了如何平衡日常工作与辅导学生时间,以及当“学生鼓励师”的经验。
    57:30 ~~ 67:55成为Committer之后,大家对开源社区,对导师又有什么新的认识?

    请收听

    ALC Beijing Podcast Episode #7:“点亮计划暑期2020” 优秀学生导师经验分享

    本期嘉宾

    江华禧:中国科学院大学硕士在读,Apache SkyWalking Committer,研究方向有智能软件工程,自然语言处理。

    张可: 复旦大学硕士在读, Apache SkyWalking Committer,研究方向集中在云计算与微服务,包括微服务架构,微服务成熟度等。

    吴舒旸:佐治亚理工待入学,Apache APISIX committer,还在尝试云原生的各个方向。

    柯振旭: Tetrate.io 工程师, 开源爱好者, Apache SkyWalking PMC 成员, Apache Local Community Beijing 成员, Apache Dubbo Committer; 专注于微服务系统及其可观测性, 以及在云原生场景下的可观测性。

    陈军旭: 支流科技工程师,Apache APISIX PMC 成员,Apache SkyWalking Committer,专注于 API 网关及云原生。

    潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁(联合主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    相关链接

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    01 +Jan 2021

    ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享

    内容梗概

    在校大学生作为开源贡献者参与到顶级开源项目中,这对很多同学来说是一件很遥远而又陌生的事情。“不知道如何参与开源项目”、“不知道如何玩转社区”、“不知道如何和社区成员交流沟通”等问题,将跃跃欲试的同学们拦在开源项目的大门之外。

    2020年暑假,中科院软件所发起来了一个非常好的学生暑期实习计划–“点亮计划暑期2020”。这个计划鼓励研究人员、开源爱好者、在校师生参与开源软件的开发与维护,促进开源软件在国内的发展和优秀开源软件社区建设,增加开源项目在国内的活跃度,在开源领域与世界接轨。 这次“点亮计划暑期2020”通过开源社区导师出题,在校学生根据导师出的题目题目进行方案设计并提向导师提起项目申请,导师在选定实习学生之后,学生会在导师的指导下进行为期三个月时间远程实习,实际参与的开源软件项目的开发与维护。

    今年的“点亮计划暑期2020”涌现出来了很多优秀的学生和导师,值得一提的是有三名学生成为Apache项目的Committer,并获得了“点亮计划暑期2020”优秀学生–最有潜力奖。 这次 ALC Beijing 特别邀请到了这三位新晋成为 Apache Committer 的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程,介绍一下大家是如何进行项目申请以及如何与导师沟通协作的。

    收听本次播客,你还将会收获:开源项目中如何给我的科研带来了灵感;参与开源我接触了很多学校中学习不到的新知识;开源社区提升了我的自信心,拓宽了我的视野……

    时间线

    时间区间精彩话语提炼
    00:10 ~~ 04:30点亮计划暑期2020背景介绍。
    04:35 ~~ 08:39嘉宾个人介绍。
    08:50 ~~ 12:18吴舒旸同学介绍自己申请暑期2020计划的经历。
    12:51 ~~ 15:34作为导师大家是如何看待暑期2020计划。
    15:51 ~~ 19:30姜宁分享了他在GSoC当导师和在暑期2020计划当导师的不同体验。
    19:45 ~~ 24:00导师如何对学生的提案进行筛选的(导师特别喜欢主动性强的学生)。
    25:01 ~~ 32:00张可同学,江华禧,吴舒旸分享他的选题和项目申请经验。
    35:01 ~~ 42:05陈军旭,吴舒旸分享了导师和学生是如何进行沟通。
    42:20 ~~ 47:36柯振旭分享了如何拉近与学生之间距离的小贴士。
    47:40 ~~ 52:36张可,江华禧同学结合他的任务分享了他和导师交流的心得。
    52:53 ~~ 56:51柯振旭分享了如何平衡日常工作与辅导学生时间,以及当“学生鼓励师”的经验。
    57:30 ~~ 67:55成为Committer之后,大家对开源社区,对导师又有什么新的认识?

    请收听

    ALC Beijing Podcast Episode #7:“点亮计划暑期2020” 优秀学生导师经验分享

    本期嘉宾

    江华禧:中国科学院大学硕士在读,Apache SkyWalking Committer,研究方向有智能软件工程,自然语言处理。

    张可: 复旦大学硕士在读, Apache SkyWalking Committer,研究方向集中在云计算与微服务,包括微服务架构,微服务成熟度等。

    吴舒旸:佐治亚理工待入学,Apache APISIX committer,还在尝试云原生的各个方向。

    柯振旭: Tetrate.io 工程师, 开源爱好者, Apache SkyWalking PMC 成员, Apache Local Community Beijing 成员, Apache Dubbo Committer; 专注于微服务系统及其可观测性, 以及在云原生场景下的可观测性。

    陈军旭: 支流科技工程师,Apache APISIX PMC 成员,Apache SkyWalking Committer,专注于 API 网关及云原生。

    潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁(联合主持人):Apache Member , ALC Beijing 发起人,华为开源软件中心技术专家,前红帽软件首席软件工程师,从 2006 年开始一直从事 Apache 开源中间件项目的开发工作,2015年开始担任Apache 孵化器导师,参与孵化了多个源于中国Apache孵化器项目孵化。

    相关链接

    \ No newline at end of file diff --git a/post/podcast/episode-8-echarts/index.html b/post/podcast/episode-8-echarts/index.html index 8c79553c..7463cec6 100644 --- a/post/podcast/episode-8-echarts/index.html +++ b/post/podcast/episode-8-echarts/index.html @@ -1,3 +1,5 @@ -ALC Beijing Episode #8 Apache ECharts 孵化之路 · ALC Beijing

    ALC Beijing Episode #8 Apache ECharts 孵化之路

    音频编辑: 余梓寒

    文案: 姜宁,余梓寒

    内容梗概

    作为一个前端开发人员,你在制作各种报表的时候,一定离不开一个非常棒的project,那就是Apache ECharts。Apache ECharts 用 JavaScript 编写,基于支持 Canvas 和 SVG 的 ZRender 渲染引擎,提供了一系列动态的、高度可定制的图表类型,包括线图、柱图、散点图、饼图、雷达图、K 线图、仪表图、漏斗图、热力图等。最新发布的Apache ECharts 5 通过在动画叙事、优化的可视化设计、交互体验、性能提升、开发体验、国际化、可访问性等方面的 15 项新功能和改进,让开发者更容易讲述数据背后的故事。

    最近 Apache ECharts 从Apache软件基金会孵化器毕业成为顶级项目, ALC Beijing 非常有幸邀请到了Apache ECharts PMC成员,请他们来给大家去分享在从孵化器项目到Apache顶级项目背后的故事。看看他们是怎样吸引全世界的开发者,如何维护社区的日常运营,以及在构建社区过程中遇到了什么的问题,这些问题又是如何解决的。

    时间线

    时间区间精彩话语提炼
    02:27~~03:32Apache ECharts项目进入Apache的孵化器的初衷
    03:33~~09:43如何吸引国内外开发者,如何激励贡献者
    09:45~~13:41如何降低开发者参与的门槛,Apache ECharts有妙招
    16:21~~17:59Aapche ECharts PMC是如何进行项目维护的
    18:59~~21:26姜老师点评Apache Way和发展新用户的关系
    21:55~~28:16Apache项目邮件列表相关问题
    27:28~~30:40Github issue 讨论的问题
    32:51~~34:20Apache Mentor 对邮件列表的建议
    34:45~~36:55Apache发版的问题
    39:27~~44:08用户量多了的烦恼–如何面对用户反馈的问题
    45:44~~48:13Apache ECharts 5.0的新功能
    56:10~~57:30Apache孵化器广告时间

    请收听

    ALC Beijing Podcast Episode #8:Apache EChart毕业访谈

    本期嘉宾

    羡辙 Apache ECharts PMC Chair

    沈毅 Apache ECharts PMC,Apache ECharts 3D 图表插件 ECharts GL 的作者。

    宿爽 Apache ECharts PMC

    潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁(联合主持人):Apache Member,Apache软件基金会孵化器导师, ALC Beijing 发起人。

    相关链接

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #8 Apache ECharts 孵化之路 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    26 +Jan 2021

    ALC Beijing Episode #8 Apache ECharts 孵化之路

    音频编辑: 余梓寒

    文案: 姜宁,余梓寒

    内容梗概

    作为一个前端开发人员,你在制作各种报表的时候,一定离不开一个非常棒的project,那就是Apache ECharts。Apache ECharts 用 JavaScript 编写,基于支持 Canvas 和 SVG 的 ZRender 渲染引擎,提供了一系列动态的、高度可定制的图表类型,包括线图、柱图、散点图、饼图、雷达图、K 线图、仪表图、漏斗图、热力图等。最新发布的Apache ECharts 5 通过在动画叙事、优化的可视化设计、交互体验、性能提升、开发体验、国际化、可访问性等方面的 15 项新功能和改进,让开发者更容易讲述数据背后的故事。

    最近 Apache ECharts 从Apache软件基金会孵化器毕业成为顶级项目, ALC Beijing 非常有幸邀请到了Apache ECharts PMC成员,请他们来给大家去分享在从孵化器项目到Apache顶级项目背后的故事。看看他们是怎样吸引全世界的开发者,如何维护社区的日常运营,以及在构建社区过程中遇到了什么的问题,这些问题又是如何解决的。

    时间线

    时间区间精彩话语提炼
    02:27~~03:32Apache ECharts项目进入Apache的孵化器的初衷
    03:33~~09:43如何吸引国内外开发者,如何激励贡献者
    09:45~~13:41如何降低开发者参与的门槛,Apache ECharts有妙招
    16:21~~17:59Aapche ECharts PMC是如何进行项目维护的
    18:59~~21:26姜老师点评Apache Way和发展新用户的关系
    21:55~~28:16Apache项目邮件列表相关问题
    27:28~~30:40Github issue 讨论的问题
    32:51~~34:20Apache Mentor 对邮件列表的建议
    34:45~~36:55Apache发版的问题
    39:27~~44:08用户量多了的烦恼–如何面对用户反馈的问题
    45:44~~48:13Apache ECharts 5.0的新功能
    56:10~~57:30Apache孵化器广告时间

    请收听

    ALC Beijing Podcast Episode #8:Apache EChart毕业访谈

    本期嘉宾

    羡辙 Apache ECharts PMC Chair

    沈毅 Apache ECharts PMC,Apache ECharts 3D 图表插件 ECharts GL 的作者。

    宿爽 Apache ECharts PMC

    潘娟 (主持人):京东数科高级DBA,Apache ShardingSphere PMC,ALC Beijing Member。

    姜宁(联合主持人):Apache Member,Apache软件基金会孵化器导师, ALC Beijing 发起人。

    相关链接

    \ No newline at end of file diff --git a/post/podcast/episode-9-non-code-contribution/index.html b/post/podcast/episode-9-non-code-contribution/index.html index 9fdd0fd2..72d10c78 100644 --- a/post/podcast/episode-9-non-code-contribution/index.html +++ b/post/podcast/episode-9-non-code-contribution/index.html @@ -1,3 +1,5 @@ -ALC Beijing Episode #9 开源社区中的非代码贡献 · ALC Beijing

    ALC Beijing Episode #9 开源社区中的非代码贡献

    音频编辑: 周禹任

    文案: 周禹任

    内容梗概

    在开源社区中,除了代码贡献之外,非代码贡献同样也有着十分重要的作用。两者相辅相成,才能一起构建起更加蓬勃的社区。本期节目中,ALC Beijing 邀请到了两位在校的大学生嘉宾,她们都是以非代码贡献者身份分别加入到 CHAOSS 和 Apache 的社区当中。她们在融入社区的同时,也丰富了自身的经历并获得了成长。

    那么在本期节目中,就让我们一起来聊一聊大学生究竟该如何参与到开源社区中,以及她们在开源社区中都能得到哪些收获。通过与他们的对谈,我们也可以对开源社区中的非代码贡献的方式及其对社区的意义有一个更深的了解。

    时间线

    时间区间精彩话语提炼
    03:16~~07:57CHAOSS 社区是什么
    09:02~~11:15夏小雅是如何以非代码贡献者身份参与到 CHAOSS 社区当中,以及她在 CHAOSS 社区中做的贡献
    13:22~~16:34周禹任是如何以非代码贡献者身份参与到 Apache 社区当中,以及他在 Apache 社区中做的贡献
    16:37~~20:03两位嘉宾作为非代码背景的开源新人,在开源社区中得到的收获和成长
    20:58~~22:16大学生为何难以加入到开源社区中
    24:25~~28:15姜宁老师对于大学生参加开源的看法
    29:23~~35:16开源社区中各种非代码贡献的方式和途径

    请收听

    ALC Beijing Podcast Episode #9: 开源社区中的非代码贡献

    本期嘉宾

    夏小雅: 华东师范大学在读研究生, X-lab 实验室成员,CHAOSS 社区成员

    周禹任: 北京大学社会学系在读本科生, Apache IoTDB 参与者

    潘娟(主持人): 京东数科高级 DBA, Apache Shardingsphere PMC, ALC Beijing Member。

    姜宁(联合主持人): Apache Member, Apaches 软件基金会孵化器导师,ALC Beijing发起人。

    相关链接

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ALC Beijing Episode #9 开源社区中的非代码贡献 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    31 +Jan 2021

    ALC Beijing Episode #9 开源社区中的非代码贡献

    音频编辑: 周禹任

    文案: 周禹任

    内容梗概

    在开源社区中,除了代码贡献之外,非代码贡献同样也有着十分重要的作用。两者相辅相成,才能一起构建起更加蓬勃的社区。本期节目中,ALC Beijing 邀请到了两位在校的大学生嘉宾,她们都是以非代码贡献者身份分别加入到 CHAOSS 和 Apache 的社区当中。她们在融入社区的同时,也丰富了自身的经历并获得了成长。

    那么在本期节目中,就让我们一起来聊一聊大学生究竟该如何参与到开源社区中,以及她们在开源社区中都能得到哪些收获。通过与他们的对谈,我们也可以对开源社区中的非代码贡献的方式及其对社区的意义有一个更深的了解。

    时间线

    时间区间精彩话语提炼
    03:16~~07:57CHAOSS 社区是什么
    09:02~~11:15夏小雅是如何以非代码贡献者身份参与到 CHAOSS 社区当中,以及她在 CHAOSS 社区中做的贡献
    13:22~~16:34周禹任是如何以非代码贡献者身份参与到 Apache 社区当中,以及他在 Apache 社区中做的贡献
    16:37~~20:03两位嘉宾作为非代码背景的开源新人,在开源社区中得到的收获和成长
    20:58~~22:16大学生为何难以加入到开源社区中
    24:25~~28:15姜宁老师对于大学生参加开源的看法
    29:23~~35:16开源社区中各种非代码贡献的方式和途径

    请收听

    ALC Beijing Podcast Episode #9: 开源社区中的非代码贡献

    本期嘉宾

    夏小雅: 华东师范大学在读研究生, X-lab 实验室成员,CHAOSS 社区成员

    周禹任: 北京大学社会学系在读本科生, Apache IoTDB 参与者

    潘娟(主持人): 京东数科高级 DBA, Apache Shardingsphere PMC, ALC Beijing Member。

    姜宁(联合主持人): Apache Member, Apaches 软件基金会孵化器导师,ALC Beijing发起人。

    相关链接

    \ No newline at end of file diff --git a/post/sharding_sphere_graduation_celebration/index.html b/post/sharding_sphere_graduation_celebration/index.html index b9795e50..dde92d85 100644 --- a/post/sharding_sphere_graduation_celebration/index.html +++ b/post/sharding_sphere_graduation_celebration/index.html @@ -1,7 +1,7 @@ -Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路 · ALC Beijing

    Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路

    作者介绍

    潘娟,京东数科高级DBA,Apache ShardingSphere PMC -张亮,京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目Elastic-Job作者

    前序

    从Sharding-JDBC到Apache ShardingSphere;
    +Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    20 +Apr 2020

    Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路

    作者介绍

    潘娟,京东数科高级DBA,Apache ShardingSphere PMC +张亮,京东数科数据研发负责人,Apache ShardingSphere VP,Apache Dubbo PMC,人气开源项目Elastic-Job作者

    前序

    从Sharding-JDBC到Apache ShardingSphere;
     从轻量级的分库分表中间件到完整闭环的分布式数据库中间件平台;
     从2016年1月的第一行代码到现今的300K+行代码;
     从寥寥无几的关注到GitHub 10K+的star;
    @@ -9,7 +9,7 @@
     从公司内部的应用类库到100+的采用公司列表;
     从寻找mentor到顺利成为Apache顶级项目。
     ……
    -

    ShardingSphere在经历了500多天的ASF孵化器孵化,毕业成为Apache顶级项目。ASF孵化器作为进入ASF的通道,为进入ASF的项目提供Apache Way的辅导,协调孵化项目与ASF基础实施融合,帮助孵化项目发展社区,确保孵化器项目发布的软件符合ASF的软件发布规范。本文是Apache ShardingSphere核心开发团队分享的Apache孵化历程,很值得想加入ASF大家庭的新项目参考。

    项目介绍

    Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景,核心功能如1-1所示。

    +

    ShardingSphere在经历了500多天的ASF孵化器孵化,毕业成为Apache顶级项目。ASF孵化器作为进入ASF的通道,为进入ASF的项目提供Apache Way的辅导,协调孵化项目与ASF基础实施融合,帮助孵化项目发展社区,确保孵化器项目发布的软件符合ASF的软件发布规范。本文是Apache ShardingSphere核心开发团队分享的Apache孵化历程,很值得想加入ASF大家庭的新项目参考。

    项目介绍

    Apache ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由3款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景,核心功能如1-1所示。

    1-1 ShardingSphere核心功能架构图

    Apache ShardingSphere由三个子项目组成,形成一个完整的数据库解决方案,合称 J.P.S. 生态系统。

    ShardingSphere-JDBC:定位为轻量级Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。 ShardingSphere-Proxy:定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL协议的访问客户端操作数据,对DBA更加友好。 ShardingSphere-Sidecar(TODO):定位为Kubernetes的云原生数据库代理,以Sidecar的形式代理所有对数据库的访问。 通过无中心、零侵入的方案提供与数据库交互的的啮合层,即Database Mesh,又可称数据网格。

    Apache ShardingSphere的亮点主要包括

    1. 完整的分布式数据库解决方案:提供数据分片、分布式事务、数据弹性迁移、数据库和数据治理等核心能力。
    2. 独立的SQL解析引擎:支持多SQL方言的完全独立化SQL解析引擎,能够脱离ShardingSphere独立使用。
    3. 可插拔微内核:所有的SQL方言、数据库协议和功能都能够通过SPI的可插拔方式加载或卸载,微内核甚至在未来可以运行于无任何功能的空白环境中。

    Apache基金会

    The most popular open source software is Apache. @@ -32,7 +32,7 @@ 1-3 co-meetup

    经过时间的积累,社区已有了质的变化。从社区的邮件讨论、GitHub的数据展示中,你会发现ShardingSphere的社区开始真正变得活跃与多元化。图1-4展示了ShardingSphere在Apache孵化器一年多的社区数据变化。

    1-4 社区数据变化

    社区与贡献者之间的依赖和互赢也在整个过程中体现的淋漓尽致。对于贡献者来说,他们会在这个开源社区中与其他人交流、协作。而这个持续的过程,将带来以下成果,

    • 扩大人际交友圈
    • 不断学习与成长
    • 提高自己的技术影响力
    • 拓宽职业渠道
    • 结合兴趣,享受过程

    而对于社区来说,这个相互帮助和沟通的过程则会,

    • 拓展项目的功能
    • 收获活跃多元化的生态圈
    • 增加项目知名度
    • 获得社区的可持续发展

    从这个角度来看,不断探索Apache way不也是希望出现这样一种共赢而互助的局面吗?Please remember community over code。

    从孵化器毕业

    所有孵化器的项目最终都希望能走向TLP(Top Level Project)。在mentor的指导、PPMC的探索、committer和contributor的支持与付出下,ShardingSphere开始筹备Apache孵化器毕业。依据Apache的成熟度评估模型图1-5,在以下几个方面评估社区和项目是否成熟。其实在Apache项目社区的初建阶段,我们建议大家就在这几个方面发力,因为这是官方给予的毕业标准及指导方针。以此为方向,探索属于各自项目的独特社区运作方式,也可谓是百花齐放。

    1-5 Apache项目成熟度评估模型

    经历Release、社区建设、Apache member的指导、meetup举办等一系列事件,ShardingSphere终于在社区发起了毕业讨论,开始接受Apache member及所有Apache成员的指导和评估。虽然最终以10 +1 binding votes,6 +1 non-binding votes和 no -1 or +/-0 votes通过毕业投票,但过程也是一波三折。 -即便是经过1年多的社区建设,项目基本成熟,但面对毕业还是有很多工作要合乎毕业规范。例如确认商标是否可使用、完成项目官网有关Apache brand和trademark的陈述、网站符合Apache way等。在这个投票期间,由于官网存在fork me on github的slogan,而这一问题一直频繁出现并且没有结论,所以其他Apache成员借此单独开辟了thread来讨论这一问题,查看Email List了解详情。虽说这一举让ShardingSphere被成功推到前台,间接提高了项目的曝光,却也能看出Apache对于第三方独立、禁止参与商业行为的重视和严苛。可喜可贺的是,2020年4月16日,Apache ShardingSphere最终通过基金会董事会决议,加入了TLP行业!

    未来的路

    回首这一路,收获与付出兼存。这篇文章旨在用故事为大家带来更为生动、全面的阐述和论据支撑,而在文章结尾,我们也特别想对读者朋友说:

    1. 愿这篇文章能为你打开新的思路,它像一扇窗,为有心的人呈现另一种职业风景,带来新的思潮。
    2. 希望文章有关"参与开源社区意义"的部分能为你解答有关开源价值的问题。
    3. 每一个Apache开源项目都有自己独特的社区发展方向和价值观。参与其中,选择与你气味相投的社区,是一件很有价值且很有意思的事情。
    4. 有张有弛,有进有退;不妄自菲薄,也不目空一切;在开源的领域,更确切说在Apache开源社区,更多的是遵守规范、开放包容、平等交流、互相学习。
    5. 低头工作,便全力以赴;耳闻窗外,便接收新潮,更新大脑。

    从Apache孵化器毕业成为TLP,对ShardingSphere来说,并不是一个结束,而是另一个开始。在产品功能上,ShardingSphere将继续在分布式数据库中间件平台上深耕,打磨出以“分布式”为核心的数据库中间件生态圈,从而提供完整的解决方案,如图1-6所示。从社区角度讲,ShardingSphere仍将继续活跃社区,鼓励更多朋友成为社区的committer和contributor。所以,我们欢迎大家关注ShardingSphere,并加入到社区来,与更多知己结伴前行。 +即便是经过1年多的社区建设,项目基本成熟,但面对毕业还是有很多工作要合乎毕业规范。例如确认商标是否可使用、完成项目官网有关Apache brand和trademark的陈述、网站符合Apache way等。在这个投票期间,由于官网存在fork me on github的slogan,而这一问题一直频繁出现并且没有结论,所以其他Apache成员借此单独开辟了thread来讨论这一问题,查看Email List了解详情。虽说这一举让ShardingSphere被成功推到前台,间接提高了项目的曝光,却也能看出Apache对于第三方独立、禁止参与商业行为的重视和严苛。可喜可贺的是,2020年4月16日,Apache ShardingSphere最终通过基金会董事会决议,加入了TLP行业!

    未来的路

    回首这一路,收获与付出兼存。这篇文章旨在用故事为大家带来更为生动、全面的阐述和论据支撑,而在文章结尾,我们也特别想对读者朋友说:

    1. 愿这篇文章能为你打开新的思路,它像一扇窗,为有心的人呈现另一种职业风景,带来新的思潮。
    2. 希望文章有关"参与开源社区意义"的部分能为你解答有关开源价值的问题。
    3. 每一个Apache开源项目都有自己独特的社区发展方向和价值观。参与其中,选择与你气味相投的社区,是一件很有价值且很有意思的事情。
    4. 有张有弛,有进有退;不妄自菲薄,也不目空一切;在开源的领域,更确切说在Apache开源社区,更多的是遵守规范、开放包容、平等交流、互相学习。
    5. 低头工作,便全力以赴;耳闻窗外,便接收新潮,更新大脑。

    从Apache孵化器毕业成为TLP,对ShardingSphere来说,并不是一个结束,而是另一个开始。在产品功能上,ShardingSphere将继续在分布式数据库中间件平台上深耕,打磨出以“分布式”为核心的数据库中间件生态圈,从而提供完整的解决方案,如图1-6所示。从社区角度讲,ShardingSphere仍将继续活跃社区,鼓励更多朋友成为社区的committer和contributor。所以,我们欢迎大家关注ShardingSphere,并加入到社区来,与更多知己结伴前行。 未来之路不可预测,但立足当下,眺望未来,初心未改,即便亦步亦趋,也愿一苇以航!

    1-6 Apache ShardingSphere生态圈

    Apache ShardingSphere committer列表

    Mentor

    Craig L Russell 冯嘉,阿里巴巴 @@ -56,6 +56,4 @@ 王光远 秦金卫,京东数科 岳令 -赵亚楠

    官网:https://shardingsphere.apache.org/

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +赵亚楠

    官网:https://shardingsphere.apache.org/

    Tags

    \ No newline at end of file diff --git a/post/summer2020_activity_sharing/index.html b/post/summer2020_activity_sharing/index.html index 1642519e..15ae900e 100644 --- a/post/summer2020_activity_sharing/index.html +++ b/post/summer2020_activity_sharing/index.html @@ -1,5 +1,3 @@ -暑期2020活动心得分享 · ALC Beijing

    暑期2020活动心得分享

    引言

    暑期2020涌现出来了很多优秀的学生和导师, 这次ALC Beijing 特别邀请江华禧给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期2020的导师同学的访谈播客,敬请关注。

    背景

    我是一个热爱编程、热爱技术的人,⼀直以来都向往着能参与到开源项⽬中锻炼⾃⼰,但当我面对庞大而复杂的项目代码时,却感到手足无措,不知该从何开始。⽽此次的“开源软件供应链点亮计划-暑期2020”活动则正好提供了这样⼀个机会:清晰的任务要求、开源社区成员作为导师提供指导以及一笔丰厚的奖金,让我顺利地踏上了开源这条道路。

    回顾

    在“暑期2020”活动的这两个多月里,我为 SkyWalking 的命令行工具实现了一个 dashboard,此外在阅读项目源码的过程中,还发现并修复了几个 bug。到活动结束时,我共提交了 11 个 PR,贡献了两千多行改动,对 SkyWalking CLI 项目的贡献数量排名第二,还获得了“最具潜力奖”。

    我觉得之所以能够如此顺利地完成这个项⽬主要有两个原因。一方面,我选择的 SkyWalking CLI 项⽬当时最新的版本号为 0.3.0,还处于起步阶段,代码量相对较少,⽽且项⽬结构非常清晰,文档也较为详细,这对于我理解整个项⽬⾮常有帮助,从⽽能够更快地上⼿。另一方面,我的项目导师非常认真负责,每次我遇到问题,导师都会及时地为我解答,然后我提交的 PR 也能够很快地被 review。⽽且导师不时会给予我肯定的评论与⿎励,这极⼤地提⾼了我的成就感,让我更加积极地投⼊到下⼀阶段的⼯作,形成⼀个正向的循环。

    收获

    回顾整个参与过程,觉得自己收获颇多:

    首先,我学习到了很多可能在学校里接触不到的新技术,了解了开源项目是如何进行协作,开源社区是如何运转治理的,以及开源文化、Apache Way 等知识,仿佛进入了一个崭新而精彩的世界。

    其次,我的编程能力得到了锻炼。因为开源项目对于代码的质量有较高的要求,因此我会在编程时有意识地遵守相关的规范,培养良好的编码习惯。然后在导师的 code review 中也学习到了一些编程技巧。

    此外,参与开源为我的科研带来了不少灵感。因为我的研究方向是智能软件工程,旨在将人工智能技术应用在软件工程的各个环节中,这需要我在实践中发现实际问题。而开源则提供了这样一个窗口,让我足不出户即可参与到软件项目的设计、开发、测试和发布等环节。

    最后也是本次活动最大的一个收获,我的贡献得到了社区的认可,被提名成为了 SkyWalking 社区的第一位学生 committer。

    建议

    最后,对于将来想要参加此类活动的同学,附上我的一些建议:

    第一,选择活跃、知名的社区。社区对你的影响将是极其深远的,好的社区意味着成熟的协作流程、良好的氛围、严谨的代码规范,以及有更大几率遇到优秀的导师,这些对于你今后在开源方面的发展都是非常有帮助的。

    第二,以兴趣为导向来选择项目,同时要敢于走出舒适区。我最初在选择项目时,初步确定了两个,一个是低难度的 Python 项目,另一个是中等难度的 Go 项目。当时我很纠结:因为我对 Python 语言比较熟悉,选择一个低难度的项目是比较稳妥的,但是项目的代码我看的并不是很懂,具体要怎么做我完全没有头绪;而 Go 项目是一个命令行工具,我对这个比较感兴趣,且有一个大致的思路,但是我对go语言并不是很熟悉,实践经验为零。最后凭借清晰具体的 proposal 我成功申请到了 Go 项目并顺利地完成了,还在实践中快速掌握了一门新的编程语言。

    这次的“暑期2020”活动虽已圆满结束,但我的开源之路才刚刚开始。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +暑期2020活动心得分享 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    19 +Dec 2020

    暑期2020活动心得分享

    引言

    暑期2020涌现出来了很多优秀的学生和导师, 这次ALC Beijing 特别邀请江华禧给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期2020的导师同学的访谈播客,敬请关注。

    背景

    我是一个热爱编程、热爱技术的人,⼀直以来都向往着能参与到开源项⽬中锻炼⾃⼰,但当我面对庞大而复杂的项目代码时,却感到手足无措,不知该从何开始。⽽此次的“开源软件供应链点亮计划-暑期2020”活动则正好提供了这样⼀个机会:清晰的任务要求、开源社区成员作为导师提供指导以及一笔丰厚的奖金,让我顺利地踏上了开源这条道路。

    回顾

    在“暑期2020”活动的这两个多月里,我为 SkyWalking 的命令行工具实现了一个 dashboard,此外在阅读项目源码的过程中,还发现并修复了几个 bug。到活动结束时,我共提交了 11 个 PR,贡献了两千多行改动,对 SkyWalking CLI 项目的贡献数量排名第二,还获得了“最具潜力奖”。

    我觉得之所以能够如此顺利地完成这个项⽬主要有两个原因。一方面,我选择的 SkyWalking CLI 项⽬当时最新的版本号为 0.3.0,还处于起步阶段,代码量相对较少,⽽且项⽬结构非常清晰,文档也较为详细,这对于我理解整个项⽬⾮常有帮助,从⽽能够更快地上⼿。另一方面,我的项目导师非常认真负责,每次我遇到问题,导师都会及时地为我解答,然后我提交的 PR 也能够很快地被 review。⽽且导师不时会给予我肯定的评论与⿎励,这极⼤地提⾼了我的成就感,让我更加积极地投⼊到下⼀阶段的⼯作,形成⼀个正向的循环。

    收获

    回顾整个参与过程,觉得自己收获颇多:

    首先,我学习到了很多可能在学校里接触不到的新技术,了解了开源项目是如何进行协作,开源社区是如何运转治理的,以及开源文化、Apache Way 等知识,仿佛进入了一个崭新而精彩的世界。

    其次,我的编程能力得到了锻炼。因为开源项目对于代码的质量有较高的要求,因此我会在编程时有意识地遵守相关的规范,培养良好的编码习惯。然后在导师的 code review 中也学习到了一些编程技巧。

    此外,参与开源为我的科研带来了不少灵感。因为我的研究方向是智能软件工程,旨在将人工智能技术应用在软件工程的各个环节中,这需要我在实践中发现实际问题。而开源则提供了这样一个窗口,让我足不出户即可参与到软件项目的设计、开发、测试和发布等环节。

    最后也是本次活动最大的一个收获,我的贡献得到了社区的认可,被提名成为了 SkyWalking 社区的第一位学生 committer。

    建议

    最后,对于将来想要参加此类活动的同学,附上我的一些建议:

    第一,选择活跃、知名的社区。社区对你的影响将是极其深远的,好的社区意味着成熟的协作流程、良好的氛围、严谨的代码规范,以及有更大几率遇到优秀的导师,这些对于你今后在开源方面的发展都是非常有帮助的。

    第二,以兴趣为导向来选择项目,同时要敢于走出舒适区。我最初在选择项目时,初步确定了两个,一个是低难度的 Python 项目,另一个是中等难度的 Go 项目。当时我很纠结:因为我对 Python 语言比较熟悉,选择一个低难度的项目是比较稳妥的,但是项目的代码我看的并不是很懂,具体要怎么做我完全没有头绪;而 Go 项目是一个命令行工具,我对这个比较感兴趣,且有一个大致的思路,但是我对go语言并不是很熟悉,实践经验为零。最后凭借清晰具体的 proposal 我成功申请到了 Go 项目并顺利地完成了,还在实践中快速掌握了一门新的编程语言。

    这次的“暑期2020”活动虽已圆满结束,但我的开源之路才刚刚开始。

    Tags

    \ No newline at end of file diff --git a/post/summer2020_activity_sharing2/index.html b/post/summer2020_activity_sharing2/index.html index 95ffb5a4..45cbfd99 100644 --- a/post/summer2020_activity_sharing2/index.html +++ b/post/summer2020_activity_sharing2/index.html @@ -1,5 +1,3 @@ -暑期 2020 活动学生(张可)心得分享 · ALC Beijing

    暑期 2020 活动学生(张可)心得分享

    引言

    如果能结合自己的科研学习述求参与到实际的开源项目中,既能为自己的后续的科研工作助力,又能在开源社区结识到一群志同道合的小伙伴,并且还能得到项目导师的指导,同时还能有一定的经济收益。

    暑期2020涌现出来了很多优秀的学生和导师, 这次 ALC Beijing 特别邀请张可给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期 2020 的导师同学的访谈播客,敬请关注。

    今年暑假期间我参加了开源软件供应链点亮计划—暑期 2020 的活动,在这个活动中,我主要参加了 Apache SkyWalking 的 Python Agent 的开发,最终项目顺利结项并获得了”最具潜力奖“,今天我想分享一下我参与这个活动以及开源社区的感受与收获。

    缘起

    其实我在参加暑期 2020 活动之前就听说过 SkyWalking 了。我研究生的主要研究方向是微服务和云原生,组里的学长们之前就在使用 SkyWalking 进行一些研究工作,也是通过他们,我了解到了 OpenTracing, SkyWalking 等与微服务相关的 Tracing 工具以及 APM 等,当时我就在想如果有机会可以深度参加这些开源项目就好了。 巧的是,也正是在差不多的时候,本科的一个学长发给了我暑期 2020 活动的链接,我在其中惊喜的发现了 SkyWalking 项目。

    虽然说想要参与 SkyWalking 的开发,但是真的有了机会我却有一些不自信——这可是 Star 上万的 Apache 顶级项目。万幸的是在暑期 2020 活动中,每一个社区都提供了很多题目以供选择,想参与的同学可以提前对要做的事情有所了解,并可以提前做一些准备。我当时也仔细地浏览了项目列表,最终决定申请为 Python Agent 支持 Flask 或 Django 埋点的功能。当时主要考虑的是,我对 Python 语言比较熟悉,同时也有使用 Flask 等 web 框架进行开发的经验,我认为应该可以完成项目要求。为了能让心里更有底一些,我阅读了 Python Agent 的源码,写下了对项目需要做的工作的理解,并向项目的导师柯振旭发送了自荐邮件,最终被选中去完成这个项目。

    过程

    被选中后我很激动,也把这份激动化作了参与开源的动力。我在进一步阅读源码,搭建本地环境后,用了三周左右的时间完成了 Django 项目的埋点插件的开发,毕竟我选择的项目是一个低难度的项目,而我在 Python web 方面也有一些经验。在这之后,我的导师和我进行了沟通,在我表达了想要继续做贡献的意愿之后,他给我建议了一些可以进一步进行贡献的方向,我也就继续参与 Python Agent 的开发。接下来,我陆续完成了 PyMongo 埋点插件, 插件版本检查机制, 支持使用 kafka 协议进行数据上报等功能。在提交了暑期 2020 活动的结项申请书后,我又继续参与了在端到端测试中增加对百分位数的验证等功能。

    在整个过程中,我遇到过很多问题,包括对问题认识不够清晰,功能的设计不够完善等等,但是通过与导师的讨论以及 Code Review,这些问题最终都迎刃而解了。此外他还经常会和我交流项目进一步发展方向,并给我以鼓励和肯定,在这里我想特别感谢我的导师在整个项目过程中给我的各种帮助。

    收获

    参加暑期 2020 的活动带给我了很多收获,主要有以下几点:

    第一是让我真正参与到了开源项目中。在之前我只向在项目代码或文档中发现的 typo 发起过一些 Pull Request,但是暑期 2020 活动通过列出项目 + 导师指导的方式,明确了所要做的事情,并提供了相应的指导,降低了参与开源的门槛,使得我们学生可以参与到项目的开发中来。

    第二是对我的专业研究方向也有很多启发,我的研究方向就是微服务与云原生相关,通过参与到 SkyWalking 的开发中使得我可以更好地理解研究问题中的一些概念,也让我更得心应手得使用 SkyWalking 来解决一些实际的问题。

    第三是通过参与 SkyWalking Python Agent 以及其他部分的开发,我的贡献得到了社区的承认,并在最近被邀请作为 Committer 加入了社区,这对我而言是很高的认可,也提升了我的自信心。

    第四点就是我通过这个活动认识了不少新朋友,同时也开拓了我的视野,使得我对于开源项目与开源社区有了很多新的认识。

    建议

    最后同样是我对想要参与开源社区,想要参与此类活动的同学们的一些建议:

    1. 虽然奖金很吸引人,但是还是希望大家能抱着长期为项目进行贡献的心态来参与开源项目,以这样的心态参与开源可以让你更好地理解开源社区的运作方式,也可以让你更有机会参与完成激动人心的功能,你在一个东西上付出的时间精力越多,你能收获的往往也越多。
    2. 在申请项目的时候,可以提前阅读一下相关功能的源码,并结合自己的思考去写一份清晰明了的 proposal ,这样可以帮助你在申请人中脱颖而出。
    3. 在开始着手去完成一个功能之前,首先理清思路,并和自己的导师或了解这一部分的人进行沟通与确认,从而尽量避免在错误的方向上浪费太多时间。
    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +暑期 2020 活动学生(张可)心得分享 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    20 +Dec 2020

    暑期 2020 活动学生(张可)心得分享

    引言

    如果能结合自己的科研学习述求参与到实际的开源项目中,既能为自己的后续的科研工作助力,又能在开源社区结识到一群志同道合的小伙伴,并且还能得到项目导师的指导,同时还能有一定的经济收益。

    暑期2020涌现出来了很多优秀的学生和导师, 这次 ALC Beijing 特别邀请张可给我们带来他参与暑期2020的心路历程, 让我们看看一个在校学生,一个编程技术爱好者,如何通过加入社区项目快速成长的故事。另外打一个广告,ALC Beijing 即将推出暑期 2020 的导师同学的访谈播客,敬请关注。

    今年暑假期间我参加了开源软件供应链点亮计划—暑期 2020 的活动,在这个活动中,我主要参加了 Apache SkyWalking 的 Python Agent 的开发,最终项目顺利结项并获得了”最具潜力奖“,今天我想分享一下我参与这个活动以及开源社区的感受与收获。

    缘起

    其实我在参加暑期 2020 活动之前就听说过 SkyWalking 了。我研究生的主要研究方向是微服务和云原生,组里的学长们之前就在使用 SkyWalking 进行一些研究工作,也是通过他们,我了解到了 OpenTracing, SkyWalking 等与微服务相关的 Tracing 工具以及 APM 等,当时我就在想如果有机会可以深度参加这些开源项目就好了。 巧的是,也正是在差不多的时候,本科的一个学长发给了我暑期 2020 活动的链接,我在其中惊喜的发现了 SkyWalking 项目。

    虽然说想要参与 SkyWalking 的开发,但是真的有了机会我却有一些不自信——这可是 Star 上万的 Apache 顶级项目。万幸的是在暑期 2020 活动中,每一个社区都提供了很多题目以供选择,想参与的同学可以提前对要做的事情有所了解,并可以提前做一些准备。我当时也仔细地浏览了项目列表,最终决定申请为 Python Agent 支持 Flask 或 Django 埋点的功能。当时主要考虑的是,我对 Python 语言比较熟悉,同时也有使用 Flask 等 web 框架进行开发的经验,我认为应该可以完成项目要求。为了能让心里更有底一些,我阅读了 Python Agent 的源码,写下了对项目需要做的工作的理解,并向项目的导师柯振旭发送了自荐邮件,最终被选中去完成这个项目。

    过程

    被选中后我很激动,也把这份激动化作了参与开源的动力。我在进一步阅读源码,搭建本地环境后,用了三周左右的时间完成了 Django 项目的埋点插件的开发,毕竟我选择的项目是一个低难度的项目,而我在 Python web 方面也有一些经验。在这之后,我的导师和我进行了沟通,在我表达了想要继续做贡献的意愿之后,他给我建议了一些可以进一步进行贡献的方向,我也就继续参与 Python Agent 的开发。接下来,我陆续完成了 PyMongo 埋点插件, 插件版本检查机制, 支持使用 kafka 协议进行数据上报等功能。在提交了暑期 2020 活动的结项申请书后,我又继续参与了在端到端测试中增加对百分位数的验证等功能。

    在整个过程中,我遇到过很多问题,包括对问题认识不够清晰,功能的设计不够完善等等,但是通过与导师的讨论以及 Code Review,这些问题最终都迎刃而解了。此外他还经常会和我交流项目进一步发展方向,并给我以鼓励和肯定,在这里我想特别感谢我的导师在整个项目过程中给我的各种帮助。

    收获

    参加暑期 2020 的活动带给我了很多收获,主要有以下几点:

    第一是让我真正参与到了开源项目中。在之前我只向在项目代码或文档中发现的 typo 发起过一些 Pull Request,但是暑期 2020 活动通过列出项目 + 导师指导的方式,明确了所要做的事情,并提供了相应的指导,降低了参与开源的门槛,使得我们学生可以参与到项目的开发中来。

    第二是对我的专业研究方向也有很多启发,我的研究方向就是微服务与云原生相关,通过参与到 SkyWalking 的开发中使得我可以更好地理解研究问题中的一些概念,也让我更得心应手得使用 SkyWalking 来解决一些实际的问题。

    第三是通过参与 SkyWalking Python Agent 以及其他部分的开发,我的贡献得到了社区的承认,并在最近被邀请作为 Committer 加入了社区,这对我而言是很高的认可,也提升了我的自信心。

    第四点就是我通过这个活动认识了不少新朋友,同时也开拓了我的视野,使得我对于开源项目与开源社区有了很多新的认识。

    建议

    最后同样是我对想要参与开源社区,想要参与此类活动的同学们的一些建议:

    1. 虽然奖金很吸引人,但是还是希望大家能抱着长期为项目进行贡献的心态来参与开源项目,以这样的心态参与开源可以让你更好地理解开源社区的运作方式,也可以让你更有机会参与完成激动人心的功能,你在一个东西上付出的时间精力越多,你能收获的往往也越多。
    2. 在申请项目的时候,可以提前阅读一下相关功能的源码,并结合自己的思考去写一份清晰明了的 proposal ,这样可以帮助你在申请人中脱颖而出。
    3. 在开始着手去完成一个功能之前,首先理清思路,并和自己的导师或了解这一部分的人进行沟通与确认,从而尽量避免在错误的方向上浪费太多时间。

    Tags

    \ No newline at end of file diff --git a/post/the_procedures_of_asf_annual_members_meeting/index.html b/post/the_procedures_of_asf_annual_members_meeting/index.html index 78b6401c..ca4e2981 100644 --- a/post/the_procedures_of_asf_annual_members_meeting/index.html +++ b/post/the_procedures_of_asf_annual_members_meeting/index.html @@ -1,5 +1,3 @@ -ASF年度大会程序 · ALC Beijing

    ASF年度大会程序

    ASF年度大会程序

    ASF至少每13个月举行一次年度成员大会,选举新的董事会,并对新的候选人进行投票。ASF年度会议由成员志愿者按照以下基本程序进行。

    [说明] 本篇参考[1]内容进行编写,部分措辞和语言组织略有调整,但保证内容含义的严格一致性。ASF虽然是一个非盈利组织,但是ASF是以公司化的方式进行运作的,有股东,董事会,还有执行机构,也有一些其他的雇员。本文中所提到的ASF年度大会算的是股东大会。

    目录

    • 听众
    • 会议机制-IRC沟通
    • 成员候选人投票
      • 如何计算成员投票
      • 怎样决定如何对成员候选人进行投票
    • 董事会投票
      • 如何计算董事会投票
      • 怎样决定如何对候选进行上投票

    听众

    本文档是ASF召开正式成员会议的概述。如果您是ASF的成员,请参阅本年度会议的 Private README.txt 以获取有相关方面的最新详细信息: /repos/private/foundation/Meetings/20200331/README.txt

    会议机制-利用IRC沟通

    由于我们的成员来自全球,因此成员会议在三天的时间内通过freenode的IRC举行。会议的前半部分(通常是星期二)在IRC实时聊天中举行,邀请所有成员参加。就像任何大型会议一样,轮值主席会负责根据预定的会议日程(agenda)和与会人员轮流在线交互。在会议的上半场中,我们审查来自各执行官的关于过去一年的基金会状况的报告。在上场年会无法出席的成员可以提交代理申请,以便可以将他们标记为出席。

    在会议上半场结束时,议程列出了下一届董事会的候选人,以及基金会的任何新候选人。候选人宣布后,会议将进行约46小时的休会。

    在休会期间,我们的Apache STeVe投票软件会向所有合格成员发送安全的私人电子邮件投票。投票通过电子邮件开放40多个小时,使世界各地的成员都可以方便地进行投票。所有选举计数和跟踪工作均由Apache STeVe和几位Member志愿者选举监督员执行。使用您的Apache ID登录后,在Web界面进行投票。

    在会议恢复之前(通常在星期四),投票将关闭几个小时,以使选举监督人员可以相互核对他们的票数是否一致。当会议在IRC上恢复时,主席宣布候选人名单的结果,并在会议上宣布董事会选举。会议的下半场通常要短得多,如果成员已经参加了上半场,则无需参加下半场。

    请不要等到最后一分钟进行投票:由于在会议召开前10天列出了所有董事会成员和新成员候选人,因此您有足够的时间事先研究您的选择。同时,投票过程是有监督的,监督人员来自组织的志愿者。

    会议结束后,将立即成立并宣布新董事会的任期,并由提名他们的现有成员向幸运的新成员候选人发出私人邀请。请注意,我们不会公开新当选成员(Member)的姓名,因为可能(很少)有些人不接受成为新成员的邀请。

    成员候选人投票

    如何计算成员投票

    要选出新成员,根据我们的章程4.1的规定,他/她必须获得在提名中进行投票的赞成票多于否决票。所有投票跟踪和记录都由Apache STeVe处理,由我们的票监督人员进行监控。投票的运行和审核过程均由ASF成员私下完成。

    对新成员候选人的投票是保密的;由于投票是针对个人的,因此投票监控器确投票结果后,便不会共享投票结果。

    怎样决定如何对成员候选人进行投票

    这完全由每个ASF成员来决定。新成员候选人由现有成员提名,候选人发布说明为什么他们认为候选人会成为好的成员。提名通常需要几秒钟的时间,其中许多还包括有关候选人当选原因的个人事迹。

    由于新候选人是参与Apache项目的人员,因此许多人通过搜索邮件列表来查看候选人过去如是何参与我们的社区贡献的。使用PonyMail的存档非常容易-ASF成员可以在其中查看所有邮件列表,甚至是私人邮件列表。

    许多成员都希望从现有成员那里获得强有力的提名理由,解释说明提名人为什么会成为好的候选人。在投票之前花几秒钟仔细阅读一下成员提名文件十分重要。

    董事会投票

    如何计算董事会投票额

    ASF使用一次可转让投票(STV)来选举每年董事会的所有9个席位。每个候选人都单独参加;没有候选人名单。只有ASF成员才能提名人选参加董事会选举;所有候选人都已经是ASF成员。

    STV旨在帮助小规模的相关选区选举董事会成员。这种计票设计有助于使选民展示自己的实际愿望,避免过于灵活。请继续阅读有关如何使用STV的讨论,包括有关志愿者投票监控员实际上如何收集选票的详细信息。

    要记住的最重要的事情是:请按照您的偏好顺序进行投票!尽一切努力使您的#1偏好进入董事会;#1选票比其余选票更重要。如果您按字母顺序投票(某些人似乎对过去的选票进行了投票),那么您会发出强烈的信号,表示您希望董事会以Awful先生和Beastly女士之类的名字出现-可能不是您想要的。我们的Apache STeVe工具将分配给候选人的字母随机化,以尝试解决这个问题。

    选举结果使用Seek的Meek方法计算。技术细节可以查阅Apache STeVe项目代码,当然这是Apache项目。

    STV计票循环进行。每当董事会候选人获得足够的选票以当选时,该循环就会列出名字。投票首先要分配给该选票上指示的第一候选人。随着投票的进行,投票将重新分配。当确定某候选人不会当选时候,他们的选票将重新分配。当候选人当选时,他或她只带了足够的选票就足以使他当选;他们的其他选票是根据该选票上排名较低的排序发送的。

    该YouTube视频提供一个轻松活泼的介绍:Politics in the Animal Kingdom: Single Transferable Vote: or a shorter description of how second, third, etc. place votes are allocated. Wikipedia has a general overview of Single Transferable Voting.

    怎样决定如何对董事会候选人进行投票

    显然,这取决于每个ASF成员的决定。实际上,所有成员以及董事会的所有候选人都是以个人身份行事,这意味着我们的公司治理永远不会受到其他公司或其雇主的影响。董事会的这种独立性是多年来ASF成功的关键因素。

    STV票数排名;您所投票的第一人比第二人更可能获得投票(依此类推)。

    如果您确实不希望某个人成为董事会成员,请完全省略他们,而不是将他们放在最后。

    尽管有9个空位,但您可以根据需要给任何人投票-即使第9位之后的投票也可能最终有重大意义。请注意,您不希望当选的人根本不会出现在您的列表中。

    例如,如果在选举中有89位成员投票,则候选人只需10张第一票就可以赢得董事会九个席位之一。这有助于确保首位偏好的小选区能够获得董事会席位。

    并提醒:您的投票顺序很重要!提交前请仔细检查您的选票,您可以根据需要多次投票给董事会。仅使用最后一次投票。因此,如果您犯了一个错误或改变了主意,只需再次投票。

    参考链接

    [1] https://www.apache.org/foundation/governance/meetings

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +ASF年度大会程序 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    02 +Apr 2020

    ASF年度大会程序

    ASF年度大会程序

    ASF至少每13个月举行一次年度成员大会,选举新的董事会,并对新的候选人进行投票。ASF年度会议由成员志愿者按照以下基本程序进行。

    [说明] 本篇参考[1]内容进行编写,部分措辞和语言组织略有调整,但保证内容含义的严格一致性。ASF虽然是一个非盈利组织,但是ASF是以公司化的方式进行运作的,有股东,董事会,还有执行机构,也有一些其他的雇员。本文中所提到的ASF年度大会算的是股东大会。

    目录

    • 听众
    • 会议机制-IRC沟通
    • 成员候选人投票
      • 如何计算成员投票
      • 怎样决定如何对成员候选人进行投票
    • 董事会投票
      • 如何计算董事会投票
      • 怎样决定如何对候选进行上投票

    听众

    本文档是ASF召开正式成员会议的概述。如果您是ASF的成员,请参阅本年度会议的 Private README.txt 以获取有相关方面的最新详细信息: /repos/private/foundation/Meetings/20200331/README.txt

    会议机制-利用IRC沟通

    由于我们的成员来自全球,因此成员会议在三天的时间内通过freenode的IRC举行。会议的前半部分(通常是星期二)在IRC实时聊天中举行,邀请所有成员参加。就像任何大型会议一样,轮值主席会负责根据预定的会议日程(agenda)和与会人员轮流在线交互。在会议的上半场中,我们审查来自各执行官的关于过去一年的基金会状况的报告。在上场年会无法出席的成员可以提交代理申请,以便可以将他们标记为出席。

    在会议上半场结束时,议程列出了下一届董事会的候选人,以及基金会的任何新候选人。候选人宣布后,会议将进行约46小时的休会。

    在休会期间,我们的Apache STeVe投票软件会向所有合格成员发送安全的私人电子邮件投票。投票通过电子邮件开放40多个小时,使世界各地的成员都可以方便地进行投票。所有选举计数和跟踪工作均由Apache STeVe和几位Member志愿者选举监督员执行。使用您的Apache ID登录后,在Web界面进行投票。

    在会议恢复之前(通常在星期四),投票将关闭几个小时,以使选举监督人员可以相互核对他们的票数是否一致。当会议在IRC上恢复时,主席宣布候选人名单的结果,并在会议上宣布董事会选举。会议的下半场通常要短得多,如果成员已经参加了上半场,则无需参加下半场。

    请不要等到最后一分钟进行投票:由于在会议召开前10天列出了所有董事会成员和新成员候选人,因此您有足够的时间事先研究您的选择。同时,投票过程是有监督的,监督人员来自组织的志愿者。

    会议结束后,将立即成立并宣布新董事会的任期,并由提名他们的现有成员向幸运的新成员候选人发出私人邀请。请注意,我们不会公开新当选成员(Member)的姓名,因为可能(很少)有些人不接受成为新成员的邀请。

    成员候选人投票

    如何计算成员投票

    要选出新成员,根据我们的章程4.1的规定,他/她必须获得在提名中进行投票的赞成票多于否决票。所有投票跟踪和记录都由Apache STeVe处理,由我们的票监督人员进行监控。投票的运行和审核过程均由ASF成员私下完成。

    对新成员候选人的投票是保密的;由于投票是针对个人的,因此投票监控器确投票结果后,便不会共享投票结果。

    怎样决定如何对成员候选人进行投票

    这完全由每个ASF成员来决定。新成员候选人由现有成员提名,候选人发布说明为什么他们认为候选人会成为好的成员。提名通常需要几秒钟的时间,其中许多还包括有关候选人当选原因的个人事迹。

    由于新候选人是参与Apache项目的人员,因此许多人通过搜索邮件列表来查看候选人过去如是何参与我们的社区贡献的。使用PonyMail的存档非常容易-ASF成员可以在其中查看所有邮件列表,甚至是私人邮件列表。

    许多成员都希望从现有成员那里获得强有力的提名理由,解释说明提名人为什么会成为好的候选人。在投票之前花几秒钟仔细阅读一下成员提名文件十分重要。

    董事会投票

    如何计算董事会投票额

    ASF使用一次可转让投票(STV)来选举每年董事会的所有9个席位。每个候选人都单独参加;没有候选人名单。只有ASF成员才能提名人选参加董事会选举;所有候选人都已经是ASF成员。

    STV旨在帮助小规模的相关选区选举董事会成员。这种计票设计有助于使选民展示自己的实际愿望,避免过于灵活。请继续阅读有关如何使用STV的讨论,包括有关志愿者投票监控员实际上如何收集选票的详细信息。

    要记住的最重要的事情是:请按照您的偏好顺序进行投票!尽一切努力使您的#1偏好进入董事会;#1选票比其余选票更重要。如果您按字母顺序投票(某些人似乎对过去的选票进行了投票),那么您会发出强烈的信号,表示您希望董事会以Awful先生和Beastly女士之类的名字出现-可能不是您想要的。我们的Apache STeVe工具将分配给候选人的字母随机化,以尝试解决这个问题。

    选举结果使用Seek的Meek方法计算。技术细节可以查阅Apache STeVe项目代码,当然这是Apache项目。

    STV计票循环进行。每当董事会候选人获得足够的选票以当选时,该循环就会列出名字。投票首先要分配给该选票上指示的第一候选人。随着投票的进行,投票将重新分配。当确定某候选人不会当选时候,他们的选票将重新分配。当候选人当选时,他或她只带了足够的选票就足以使他当选;他们的其他选票是根据该选票上排名较低的排序发送的。

    该YouTube视频提供一个轻松活泼的介绍:Politics in the Animal Kingdom: Single Transferable Vote: or a shorter description of how second, third, etc. place votes are allocated. Wikipedia has a general overview of Single Transferable Voting.

    怎样决定如何对董事会候选人进行投票

    显然,这取决于每个ASF成员的决定。实际上,所有成员以及董事会的所有候选人都是以个人身份行事,这意味着我们的公司治理永远不会受到其他公司或其雇主的影响。董事会的这种独立性是多年来ASF成功的关键因素。

    STV票数排名;您所投票的第一人比第二人更可能获得投票(依此类推)。

    如果您确实不希望某个人成为董事会成员,请完全省略他们,而不是将他们放在最后。

    尽管有9个空位,但您可以根据需要给任何人投票-即使第9位之后的投票也可能最终有重大意义。请注意,您不希望当选的人根本不会出现在您的列表中。

    例如,如果在选举中有89位成员投票,则候选人只需10张第一票就可以赢得董事会九个席位之一。这有助于确保首位偏好的小选区能够获得董事会席位。

    并提醒:您的投票顺序很重要!提交前请仔细检查您的选票,您可以根据需要多次投票给董事会。仅使用最后一次投票。因此,如果您犯了一个错误或改变了主意,只需再次投票。

    参考链接

    [1] https://www.apache.org/foundation/governance/meetings

    \ No newline at end of file diff --git a/post/what_i_do_with_open_source/index.html b/post/what_i_do_with_open_source/index.html index f0ce59b7..2bdc9f4e 100644 --- a/post/what_i_do_with_open_source/index.html +++ b/post/what_i_do_with_open_source/index.html @@ -1,5 +1,3 @@ -我与开源的那些事儿 · ALC Beijing

    我与开源的那些事儿

    我与开源的那些事儿。

    很幸运!!!是的,很幸运,除了幸运,我不知道该怎么形容我和 开源 的缘分。感觉就好像在冥冥之中,肯定会走上这条道路一样。

    缘起

    2020注定是特别的一年,年初,谁也没想到,一场疫情把我们牢牢的困在家里,哪也去不了。。说实话,或多或少有点抱怨吧。但伴随而来的,是一场灾难。那个时候每天一早醒来,看见手机屏幕刷新的数据,冰冷的可怕,红线一直在升。。。当时就在想,为什么我不是学医的,待在家里什么都做不了,似乎捐钱变成了最可悲的方式。

    偶然一次,在知乎上看见关于开发者抗疫的活动——“Wuhan2020”。学计算机专业的我,本身就对技术方面的文章也比较感兴趣,就随手点了进去。( 其实当时内心所想的是,可能有是一个营销号在做文章 )。在大致了解了Wuhan2020整个项目之后,便开始搜集更多的与之相关的信息。最后偶然在一个公众号中,看见了“黑客松活动”。就水群,进去了,,哈哈哈哈。但当时还是个技术小白,啥都不懂,可以理解成比会写“hello world“强那么一点点。在那之后,也找到了Wuhan2020的官方公众号。那时,想着尽自己的一份力,但是无论是对于开源文化上还是技术上都感到了很大的局限性,说俗点,大概就是心有余而力不足吧。随后大约在四月份( 精确点是4月4号,因为那一天整个世界都是灰色的 ),看见了Wuhan2020公众号招人,我想了想自己对于做图剪视频之类的,还算是比较擅长的,就去试试水。进入了设计组。这也算是我第一次真正接触到开源吧。


    幸运

    说实话,除了幸运我不知道该怎么来形容这段经历。当时在设计组群里,几乎什么都没做,就发了一份作品+自我介绍,然后有一位华师大的学姐,就加我为好友,说是带我一起和一位大佬做Apache相关的推广。哈??Apache是什么??当时的我是一脸问号。。。。然后就抱着试一试的心态跟着去了。。。( 现在想想当时真的是有趣,如果我说我什么都不了解,甚至拒绝的话还会有现在的我么。。而且群里那么多人咋就单单选中了我呢,哈哈哈哈)然后和Apache的姜宁老师简单聊了一下,说到hugo啥的。我心里想hugo??雨果还搞开源??随后查了一下,是一款搭建静态博客的框架,这也是我正式使用github的起点吧,更新博客。学了点东西总要找点事情做的,要不然时间一长,不就那也记不住了,哈哈哈。

    慢慢的跟着学姐运营ALC-Beijing和Wuhan2020的公众号,也一起了解到更多有关开源的文化。习惯也由之前的天天逛CSDN、知乎变成Github、掘金之类的。成功搭建博客,给我学习新的知识也树立了信心。似乎一切都好了起来,那个时候武汉已经宣布解封。

    当时接触开源之前,总感觉自己怀才不遇,明明会的不少,懂得知识也挺多的,为什么就还只是一个普普通通的大学生呢??还是做不到出圈,每天混学分,做着毫无疑义的事情。但当皓月姐姐加我好友的那一刻开始,就感觉那份属于我的运气该来了,还撞的特别准。

    随后也加入了开源社,慢慢认识了更多的小伙伴,一群人不认识也不了解,分布在各个地方,做着一件共同的事情,可能这就是我当时所理解的开源吧。


    受阻

    当时想着为一些顶级的开源项目做贡献,就开始学会主动去吸取知识,那种学习给我的感觉是由心而发的,主动的。如果问我那时为什么想参与开源,大概是开源本身就具有向善的属性,也认为那是一种体现自己价值的方式。

    当五月份学校宣布返校的时候,回头学校之后,就开始感觉自己有出圈的能力了,也有出圈的想法,可能是技术层面,学校没有需要学习的,也可能是真正意识到现在的自己可以做一些更有意义的事情了。就逐渐向周围的同学唠叨着自己接触开源的事情,很多人的情况和我一样,一开始都是一脸懵圈,但遗憾的是懵圈之后,就什么都没了。这就好比一个主动跳入坑里的人,很难再拉下一个人主动入坑。其实准确点来说,都感觉开源离自身太远。从学生角度来思考,学好文化课,在课余时间参加活动、比赛之类的,赚学分,才是本职工作。至于开源,第一是不了解(不直接和自己的利益挂钩),第二是技术层面达不到。可以发现github上面的顶级项目几乎大多数都不适合学生来做,而且更多的是面向求职者或者说是已经工作了的,这样一来,即使有一腔热血,但是也被挡在门外。(回头想想自己,能想到把blog部署到github上,这样一来,几乎就和github捆绑在一起了,也就是这样能有更多的机会接触更多的项目。)带着这样的问题,我就在思考如何才能让身边的人参与开源,其实参与开源也不一定是技术层面,是不是??

    是的,参与开源的方式有很多,并非一定是要通过技术层面。想想当时的Wuhan2020项目,并非所有的人都是程序员,但是每个人都可以凭借着自己的一腔热血贡献出属于自己的那一份力,这是开源的力量。再想到之前在ALC-Beijing学习到的理念:community大于代码。加上之前给APISIX项目提交修改文档的pr,自己提交的第一份pr被合并的喜悦感是无可替代的。于是结合自己周围的环境以及所经历的事情,就一边学习一边探索。还好不算太差,前不久在学校的实验室里遇见了一位小伙伴,也成功拉入坑。用他的话说:“以后我是要开货车的,然后再搞搞开源多舒服啊!” 这样一想,是啊,国内真正能为开源项目提交代码的人确实有限,但是每个人都能了解到开源文化,开源协作是未来每个人都会接触到的,只不过这次疫情的爆发,把这个远程办公的缺口给暴露出来,而开源协作的方式不是刚好可以封上它吗??就像姜宁老师所说的:“让更多的人了解,参与开源 ,应该是我们布道的目的吧!”

    COSCon‘20

    期盼已久的开源年会终于来了,尤其是今年年会的主题——“开源向善“ 。这可能也是我接触到开源的初衷。当时去之前,就在脑子里构想了很多有关开源的问题,在自身深入了解开源之后,总感觉没有自己想的那么简单,说大点可以是一种哲学,甚至是一种信仰。这是开源带给我最直观的感受。

    年会现场,也可谓是大型的网友见面会,虽然每个人都不一样,学着不同的专业、不同的城市、不同的年龄段,但是却都可以在彼此身上找到各自的影子,有时候有些事确实挺奇妙的。在第二天,无论是和庄表伟老师的聊天学习,还是和王伟老师的沟通交流,都刷新了我对于开源的认识,就好像是打破之前的定义,更深入的思考,对,这次是思考,不再是了解。如果说皓月姐姐是我接触开源的引路人,这大概就是遇见了自己的伯乐。

    可能是因为王伟老师就是做开源教育的,和他交流能够更深入探讨或者说思考自己在布道开源时所遇见的问题,记得我当时提到作为大学生,但是不能被学生的身份所限制,应该想到“出圈”,只有在一定程度上做到出圈,才能够从更高的维度来审视自身所处的状态和环境,这样才能更好的找到适合自己的路,从而才能走的更远。而王伟老师所说的作为学生不能被“分”给限制住,更多应该是培养自身的能力。这些思想上擦出的火花,都不约而同的交叉在一起了。由此可想,我们在布道开源的时候,是不是也应该要有跳出圈内人的思维,这样才能更好地推广下去。还记得,当时和王老师提到,从学生角度来说,参与开源的门槛是不是有点高,那么我们反过来想,如果我们做一个贴合学生的项目,尽量做到人人都可以参与的项目,这样一来,不就是可以让想参与开源的同学参加进来了嘛??带着这样的思考,我在年会上又找到另外的一位小伙伴,愿意一起来尝试。通过这次年会,给我最大的感受,这不仅仅是一次技术上的交流,更是一场思想碰撞的盛宴,也可以说在这里的我们都是同一类人!!!

    我想把这次参会体验比喻成读一本好书,这里的每个人都是书中的一份子,可能过了一段时间已经记不清书中的内容,但是对于精神上的沉淀是无法抹去的,是由内而外的提升。天下没有不散的宴席,虽然很不舍,但是离别是必然的,愿下次再遇见,那个时候的自己更优秀。

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +我与开源的那些事儿 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    29 +Oct 2020

    我与开源的那些事儿

    我与开源的那些事儿。

    很幸运!!!是的,很幸运,除了幸运,我不知道该怎么形容我和 开源 的缘分。感觉就好像在冥冥之中,肯定会走上这条道路一样。

    缘起

    2020注定是特别的一年,年初,谁也没想到,一场疫情把我们牢牢的困在家里,哪也去不了。。说实话,或多或少有点抱怨吧。但伴随而来的,是一场灾难。那个时候每天一早醒来,看见手机屏幕刷新的数据,冰冷的可怕,红线一直在升。。。当时就在想,为什么我不是学医的,待在家里什么都做不了,似乎捐钱变成了最可悲的方式。

    偶然一次,在知乎上看见关于开发者抗疫的活动——“Wuhan2020”。学计算机专业的我,本身就对技术方面的文章也比较感兴趣,就随手点了进去。( 其实当时内心所想的是,可能有是一个营销号在做文章 )。在大致了解了Wuhan2020整个项目之后,便开始搜集更多的与之相关的信息。最后偶然在一个公众号中,看见了“黑客松活动”。就水群,进去了,,哈哈哈哈。但当时还是个技术小白,啥都不懂,可以理解成比会写“hello world“强那么一点点。在那之后,也找到了Wuhan2020的官方公众号。那时,想着尽自己的一份力,但是无论是对于开源文化上还是技术上都感到了很大的局限性,说俗点,大概就是心有余而力不足吧。随后大约在四月份( 精确点是4月4号,因为那一天整个世界都是灰色的 ),看见了Wuhan2020公众号招人,我想了想自己对于做图剪视频之类的,还算是比较擅长的,就去试试水。进入了设计组。这也算是我第一次真正接触到开源吧。


    幸运

    说实话,除了幸运我不知道该怎么来形容这段经历。当时在设计组群里,几乎什么都没做,就发了一份作品+自我介绍,然后有一位华师大的学姐,就加我为好友,说是带我一起和一位大佬做Apache相关的推广。哈??Apache是什么??当时的我是一脸问号。。。。然后就抱着试一试的心态跟着去了。。。( 现在想想当时真的是有趣,如果我说我什么都不了解,甚至拒绝的话还会有现在的我么。。而且群里那么多人咋就单单选中了我呢,哈哈哈哈)然后和Apache的姜宁老师简单聊了一下,说到hugo啥的。我心里想hugo??雨果还搞开源??随后查了一下,是一款搭建静态博客的框架,这也是我正式使用github的起点吧,更新博客。学了点东西总要找点事情做的,要不然时间一长,不就那也记不住了,哈哈哈。

    慢慢的跟着学姐运营ALC-Beijing和Wuhan2020的公众号,也一起了解到更多有关开源的文化。习惯也由之前的天天逛CSDN、知乎变成Github、掘金之类的。成功搭建博客,给我学习新的知识也树立了信心。似乎一切都好了起来,那个时候武汉已经宣布解封。

    当时接触开源之前,总感觉自己怀才不遇,明明会的不少,懂得知识也挺多的,为什么就还只是一个普普通通的大学生呢??还是做不到出圈,每天混学分,做着毫无疑义的事情。但当皓月姐姐加我好友的那一刻开始,就感觉那份属于我的运气该来了,还撞的特别准。

    随后也加入了开源社,慢慢认识了更多的小伙伴,一群人不认识也不了解,分布在各个地方,做着一件共同的事情,可能这就是我当时所理解的开源吧。


    受阻

    当时想着为一些顶级的开源项目做贡献,就开始学会主动去吸取知识,那种学习给我的感觉是由心而发的,主动的。如果问我那时为什么想参与开源,大概是开源本身就具有向善的属性,也认为那是一种体现自己价值的方式。

    当五月份学校宣布返校的时候,回头学校之后,就开始感觉自己有出圈的能力了,也有出圈的想法,可能是技术层面,学校没有需要学习的,也可能是真正意识到现在的自己可以做一些更有意义的事情了。就逐渐向周围的同学唠叨着自己接触开源的事情,很多人的情况和我一样,一开始都是一脸懵圈,但遗憾的是懵圈之后,就什么都没了。这就好比一个主动跳入坑里的人,很难再拉下一个人主动入坑。其实准确点来说,都感觉开源离自身太远。从学生角度来思考,学好文化课,在课余时间参加活动、比赛之类的,赚学分,才是本职工作。至于开源,第一是不了解(不直接和自己的利益挂钩),第二是技术层面达不到。可以发现github上面的顶级项目几乎大多数都不适合学生来做,而且更多的是面向求职者或者说是已经工作了的,这样一来,即使有一腔热血,但是也被挡在门外。(回头想想自己,能想到把blog部署到github上,这样一来,几乎就和github捆绑在一起了,也就是这样能有更多的机会接触更多的项目。)带着这样的问题,我就在思考如何才能让身边的人参与开源,其实参与开源也不一定是技术层面,是不是??

    是的,参与开源的方式有很多,并非一定是要通过技术层面。想想当时的Wuhan2020项目,并非所有的人都是程序员,但是每个人都可以凭借着自己的一腔热血贡献出属于自己的那一份力,这是开源的力量。再想到之前在ALC-Beijing学习到的理念:community大于代码。加上之前给APISIX项目提交修改文档的pr,自己提交的第一份pr被合并的喜悦感是无可替代的。于是结合自己周围的环境以及所经历的事情,就一边学习一边探索。还好不算太差,前不久在学校的实验室里遇见了一位小伙伴,也成功拉入坑。用他的话说:“以后我是要开货车的,然后再搞搞开源多舒服啊!” 这样一想,是啊,国内真正能为开源项目提交代码的人确实有限,但是每个人都能了解到开源文化,开源协作是未来每个人都会接触到的,只不过这次疫情的爆发,把这个远程办公的缺口给暴露出来,而开源协作的方式不是刚好可以封上它吗??就像姜宁老师所说的:“让更多的人了解,参与开源 ,应该是我们布道的目的吧!”

    COSCon‘20

    期盼已久的开源年会终于来了,尤其是今年年会的主题——“开源向善“ 。这可能也是我接触到开源的初衷。当时去之前,就在脑子里构想了很多有关开源的问题,在自身深入了解开源之后,总感觉没有自己想的那么简单,说大点可以是一种哲学,甚至是一种信仰。这是开源带给我最直观的感受。

    年会现场,也可谓是大型的网友见面会,虽然每个人都不一样,学着不同的专业、不同的城市、不同的年龄段,但是却都可以在彼此身上找到各自的影子,有时候有些事确实挺奇妙的。在第二天,无论是和庄表伟老师的聊天学习,还是和王伟老师的沟通交流,都刷新了我对于开源的认识,就好像是打破之前的定义,更深入的思考,对,这次是思考,不再是了解。如果说皓月姐姐是我接触开源的引路人,这大概就是遇见了自己的伯乐。

    可能是因为王伟老师就是做开源教育的,和他交流能够更深入探讨或者说思考自己在布道开源时所遇见的问题,记得我当时提到作为大学生,但是不能被学生的身份所限制,应该想到“出圈”,只有在一定程度上做到出圈,才能够从更高的维度来审视自身所处的状态和环境,这样才能更好的找到适合自己的路,从而才能走的更远。而王伟老师所说的作为学生不能被“分”给限制住,更多应该是培养自身的能力。这些思想上擦出的火花,都不约而同的交叉在一起了。由此可想,我们在布道开源的时候,是不是也应该要有跳出圈内人的思维,这样才能更好地推广下去。还记得,当时和王老师提到,从学生角度来说,参与开源的门槛是不是有点高,那么我们反过来想,如果我们做一个贴合学生的项目,尽量做到人人都可以参与的项目,这样一来,不就是可以让想参与开源的同学参加进来了嘛??带着这样的思考,我在年会上又找到另外的一位小伙伴,愿意一起来尝试。通过这次年会,给我最大的感受,这不仅仅是一次技术上的交流,更是一场思想碰撞的盛宴,也可以说在这里的我们都是同一类人!!!

    我想把这次参会体验比喻成读一本好书,这里的每个人都是书中的一份子,可能过了一段时间已经记不清书中的内容,但是对于精神上的沉淀是无法抹去的,是由内而外的提升。天下没有不散的宴席,虽然很不舍,但是离别是必然的,愿下次再遇见,那个时候的自己更优秀。

    Tags

    \ No newline at end of file diff --git a/post/what_is_the_apache_way/index.html b/post/what_is_the_apache_way/index.html index f0a2c8cc..a7f72805 100644 --- a/post/what_is_the_apache_way/index.html +++ b/post/what_is_the_apache_way/index.html @@ -1,6 +1,6 @@ -到底什么是The Apache Way? · ALC Beijing

    到底什么是The Apache Way?

    到底什么是The Apache Way?

    • 作者:谭中意
    • 审核:姜宁 李健盛

    我们有可能听到过很多次“The Apache Way”。可能会在某个Apache基金会项目的分享会上,它宣称它的日常工作遵循“The Apache Way”;也有可能在某个InnerSource的分享会上,宣称内部开源就是在企业内部推行“The Apache Way”;也有可能在Apache基金会的报告上或者文档上,看到apache基金会的治理遵循“The Apache Way”。那么“The Apache Way”究竟是什么?我们如何来应用它?

    我们先看一看Apache开源基金会对此的解释。从它的官网 +到底什么是The Apache Way? | ALC Beijing 博客

    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    30 +Aug 2020

    到底什么是The Apache Way?

    到底什么是The Apache Way?

    • 作者:谭中意
    • 审核:姜宁 李健盛

    我们有可能听到过很多次“The Apache Way”。可能会在某个Apache基金会项目的分享会上,它宣称它的日常工作遵循“The Apache Way”;也有可能在某个InnerSource的分享会上,宣称内部开源就是在企业内部推行“The Apache Way”;也有可能在Apache基金会的报告上或者文档上,看到apache基金会的治理遵循“The Apache Way”。那么“The Apache Way”究竟是什么?我们如何来应用它?

    我们先看一看Apache开源基金会对此的解释。从它的官网 https://www.apache.org/theapacheway 能看到“The Apache Way”内涵很丰富,即使是Apache基金会的成员们,对什么是“The Apache Way”有很多种解释。

    刷新这个页面,随机摘抄几种解释如下:

    “THE APACHE WAY TO ME…”

    “open, sharing, global team work”**

    —Jason Zhong, 10 year user of Apache Kylin, Hadoop, contributor to Apache Kylin Apache kylin的一个贡献者说它是一种开放/共享/国际团队合作的精神。

    “Guide lines or Bible”

    —Koji, 18 year user of Apache Lucene, Solr, OpeNLP, Mahout, Spark, Commons, contributor to Apache Solr 一位18年Apache的用户说它是指南甚至是圣经。

    “Freedom, choice and affordability” @@ -28,6 +28,4 @@ 不欢迎Jerks,Be kind

    那么,我们从“The Apache Way”中可以参考到什么? 把哪些部分应用到我们的内部开源实践中呢? 很显然,它的核心价值观,开放(Open)/透明(transparency)/协作(Collaboration)/等等,是完全适用于企业内部开源环境的, 其次,它的一些基本原则,协同软件开发,持续保持高质量,尊重/诚实,基于共识的决策,这些也是能应用到InnerSource中的。 -最后,它的一些行为准则和惯例,也是非常有参考价值的。包括使用工具使得决策公开透明并且可以追溯。

    总结:“The Apache Way”是apache基金会用于实现可持续开源成功的一整套方法论体系,我们可以把它其中的价值观/原则/行为规范应用到我们的内部开源实践中,就是在企业内部推行“The Apache Way”。

    参考资料:

    © . Made with Hugo using the Tale theme.
    \ No newline at end of file +最后,它的一些行为准则和惯例,也是非常有参考价值的。包括使用工具使得决策公开透明并且可以追溯。

    总结:“The Apache Way”是apache基金会用于实现可持续开源成功的一整套方法论体系,我们可以把它其中的价值观/原则/行为规范应用到我们的内部开源实践中,就是在企业内部推行“The Apache Way”。

    参考资料:

    \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000..54fb9891 --- /dev/null +++ b/robots.txt @@ -0,0 +1,2 @@ +User-agent: * + diff --git a/series/index.html b/series/index.html new file mode 100644 index 00000000..ed08068b --- /dev/null +++ b/series/index.html @@ -0,0 +1 @@ +Series | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Series

    \ No newline at end of file diff --git a/series/index.xml b/series/index.xml new file mode 100644 index 00000000..3a93c68b --- /dev/null +++ b/series/index.xml @@ -0,0 +1 @@ +Series on ALC Beijing 博客https://alc-beijing.github.io/alc-site/series/Recent content in Series on alc-beijing.github.ioHugo -- gohugo.ioen-us \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index cdca79d3..bbacc1b6 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://alc-beijing.github.io/alc-site/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/2023-09-25T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/2023-09-23T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/2023-09-18T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/2023-04-07T17:07:07+08:00https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/2022-01-12T16:06:05+08:00https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/2021-08-29T20:00:00+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/2021-05-03T20:00:00+08:00https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/2021-04-29T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/2021-03-20T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/2021-03-13T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/2021-03-03T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/2021-03-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/2021-03-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/2021-03-01T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/2021-02-28T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/2021-01-31T16:18:00+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/2021-01-26T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/2021-01-05T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/2021-01-01T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/2020-12-30T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/2020-12-30T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/2020-12-20T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/2020-12-19T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/2020-12-08T11:22:56+08:00https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/2020-11-16T18:45:20+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/2020-11-15T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/2020-10-29T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/2020-10-21T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/2020-10-12T17:55:29+08:00https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/2020-10-12T17:55:29+08:00https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/2020-10-12T17:55:29+08:00https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/2020-10-12T17:45:31+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/2020-09-30T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/2020-09-25T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/2020-09-16T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/2020-09-15T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/2020-08-30T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/2020-08-13T10:12:41+08:00https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/2020-08-11T18:46:08+08:00https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/2020-08-11T18:45:20+08:00https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/2020-07-30T11:01:48+08:00https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/2020-07-24T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/2020-07-09T20:15:27+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/2020-07-06T21:02:45+08:00https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/2020-07-05T10:41:22+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/2020-05-31T17:08:49+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/2020-05-31T17:08:49+08:00https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/2020-05-25T16:06:05+08:00https://alc-beijing.github.io/alc-site/post/heros_journey_trista/2020-05-24T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/2020-04-27T16:10:58+08:00https://alc-beijing.github.io/alc-site/post/call_for_volunteer/2020-04-21T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/2020-04-20T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/asf_incubator_process/2020-04-16T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/2020-04-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/2020-04-03T09:59:50+08:00https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/2020-04-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/2020-04-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/2020-03-15T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/2020-03-15T00:00:00+00:00 \ No newline at end of file +https://alc-beijing.github.io/alc-site/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/apachecon/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/communityovercode/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/opensource/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/2023-10-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/2023-09-25T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/2023-09-23T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/apache-way/2023-09-18T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/2023-09-18T00:00:00+00:00https://alc-beijing.github.io/alc-site/categories/apache-way/2023-04-07T17:07:07+08:00https://alc-beijing.github.io/alc-site/categories/2023-04-07T17:07:07+08:00https://alc-beijing.github.io/alc-site/tags/release/2023-04-07T17:07:07+08:00https://alc-beijing.github.io/alc-site/categories/release/2023-04-07T17:07:07+08:00https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/2023-04-07T17:07:07+08:00https://alc-beijing.github.io/alc-site/tags/apache-blog/2022-01-12T16:06:05+08:00https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/2022-01-12T16:06:05+08:00https://alc-beijing.github.io/alc-site/categories/%E4%BC%A0%E6%92%AD/2022-01-12T16:06:05+08:00https://alc-beijing.github.io/alc-site/categories/%E5%8D%9A%E5%AE%A2/2022-01-12T16:06:05+08:00https://alc-beijing.github.io/alc-site/categories/%E5%BC%80%E6%BA%90/2022-01-12T16:06:05+08:00https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/2021-08-29T20:00:00+08:00https://alc-beijing.github.io/alc-site/tags/alc-beijing-%E6%92%AD%E5%AE%A2/2021-08-29T20:00:00+08:00https://alc-beijing.github.io/alc-site/tags/alc-beijing/2021-08-29T20:00:00+08:00https://alc-beijing.github.io/alc-site/categories/%E6%92%AD%E5%AE%A2/2021-08-29T20:00:00+08:00https://alc-beijing.github.io/alc-site/categories/%E6%95%99%E8%82%B2/2021-08-29T20:00:00+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/2021-05-03T20:00:00+08:00https://alc-beijing.github.io/alc-site/categories/%E5%86%85%E6%BA%90/2021-05-03T20:00:00+08:00https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/2021-04-29T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/%E5%BC%80%E6%BA%90/2021-04-29T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%8F/2021-04-29T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/2021-03-20T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/2021-03-13T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/2021-03-03T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/apache-policy/2021-03-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/2021-03-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/2021-03-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/2021-03-01T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/2021-02-28T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/2021-01-31T16:18:00+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/2021-01-26T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/2021-01-05T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/%E9%9D%9E%E7%A4%BE%E5%8C%BA%E8%B4%A1%E7%8C%AE/2021-01-05T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/2021-01-01T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/2020-12-30T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/2020-12-30T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/2020-12-20T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/2020-12-19T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/2020-12-08T11:22:56+08:00https://alc-beijing.github.io/alc-site/tags/apache-local-communtiy/2020-12-08T11:22:56+08:00https://alc-beijing.github.io/alc-site/categories/event/2020-12-08T11:22:56+08:00https://alc-beijing.github.io/alc-site/categories/%E6%9C%AC%E5%9C%9F/2020-12-08T11:22:56+08:00https://alc-beijing.github.io/alc-site/tags/apache-local-community/2020-11-16T18:45:20+08:00https://alc-beijing.github.io/alc-site/categories/apache-skywalking/2020-11-16T18:45:20+08:00https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/2020-11-16T18:45:20+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/2020-11-15T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/2020-10-29T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/2020-10-21T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/2020-10-12T17:55:29+08:00https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/2020-10-12T17:55:29+08:00https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/2020-10-12T17:55:29+08:00https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/2020-10-12T17:45:31+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/2020-09-30T11:18:04+08:00https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/2020-09-25T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/2020-09-16T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/2020-09-15T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/2020-08-30T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/2020-08-13T10:12:41+08:00https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/2020-08-11T18:46:08+08:00https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/2020-08-11T18:45:20+08:00https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/2020-07-30T11:01:48+08:00https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/2020-07-24T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/asf%E9%A1%B9%E7%9B%AE%E5%AD%B5%E5%8C%96%E6%B5%81%E7%A8%8B/2020-07-24T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/%E7%9F%A5%E8%AF%86%E4%BA%A7%E6%9D%83%E8%BD%AC%E7%A7%BB/2020-07-24T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/2020-07-09T20:15:27+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/2020-07-06T21:02:45+08:00https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/2020-07-05T10:41:22+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/2020-05-31T17:08:49+08:00https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/2020-05-31T17:08:49+08:00https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/2020-05-25T16:06:05+08:00https://alc-beijing.github.io/alc-site/tags/member-story/2020-05-24T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/heros_journey_trista/2020-05-24T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/2020-04-27T16:10:58+08:00https://alc-beijing.github.io/alc-site/post/call_for_volunteer/2020-04-21T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/%E5%BF%97%E6%84%BF%E8%80%85volunteer/2020-04-21T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/2020-04-20T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/asf-ss/2020-04-20T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/asf_incubator_process/2020-04-16T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/asf%E5%85%AC%E5%8F%B8%E6%9E%B6%E6%9E%84%E5%92%8C%E6%B2%BB%E7%90%86/2020-04-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/2020-04-04T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/new-asf-board-of-directors-2020/2020-04-03T09:59:50+08:00https://alc-beijing.github.io/alc-site/tags/asf%E5%B9%B4%E5%BA%A6%E5%A4%A7%E4%BC%9A%E7%A8%8B%E5%BA%8F/2020-04-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/2020-04-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/2020-04-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/%E5%A6%82%E4%BD%95%E6%88%90%E4%B8%BA%E5%90%88%E6%A0%BC%E7%9A%84asf%E8%B4%A1%E7%8C%AE%E8%80%85contributor/2020-04-02T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/2020-03-15T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/the-introduction-about-dolphinscheduler/2020-03-15T00:00:00+00:00https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/2020-03-15T00:00:00+00:00https://alc-beijing.github.io/alc-site/tags/index/https://alc-beijing.github.io/alc-site/series/ \ No newline at end of file diff --git "a/tags/alc-beijing-\346\222\255\345\256\242/index.html" "b/tags/alc-beijing-\346\222\255\345\256\242/index.html" new file mode 100644 index 00000000..2a5783a5 --- /dev/null +++ "b/tags/alc-beijing-\346\222\255\345\256\242/index.html" @@ -0,0 +1,17 @@ +ALC Beijing 播客 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    A l c beijing 播客

    \ No newline at end of file diff --git "a/tags/alc-beijing-\346\222\255\345\256\242/index.xml" "b/tags/alc-beijing-\346\222\255\345\256\242/index.xml" new file mode 100644 index 00000000..aa2e62ff --- /dev/null +++ "b/tags/alc-beijing-\346\222\255\345\256\242/index.xml" @@ -0,0 +1,17 @@ +ALC Beijing 播客 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/alc-beijing-%E6%92%AD%E5%AE%A2/Recent content in ALC Beijing 播客 on alc-beijing.github.ioHugo -- gohugo.ioen-usSun, 29 Aug 2021 20:00:00 +0800ALC Beijing Episode #11 DolphinScheduler社区构建之旅https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/ep11-dolphinscheduler-community-building-road/ +在本次ALC Beijing的播客中,我们非常有幸请到郭炜和代立冬分享一下 DolphinScheduler在ASF的项目孵化心得。ALC Beijing Episode #10 谈谈内源2https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/Mon, 03 May 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-10-inner-source-2/ +本期节目中, ALC Beijing 再度邀请到了上一期关于内源的节目中的姜宁老师和谭中意老师,和我们一起聊聊内源的适用场景、责任方和动力等问题。ALC Beijing Episode #9 开源社区中的非代码贡献https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/Sun, 31 Jan 2021 16:18:00 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-9-non-code-contribution/ +本期节目中, ALC Beijing 邀请到了两位在校大学生同学来她们在开源社区中所做的非代码贡献,以及它们在社区中的成长故事。ALC Beijing Episode #8 Apache ECharts 孵化之路https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/Tue, 26 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-8-echarts/ +这次 ALC Beijing 特别邀请到了在Apache ECharts PMC同学来分析Apache孵化的心路历程。ALC Beijing Episode #7 点亮计划暑期2020优秀学生导师经验分享https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/Fri, 01 Jan 2021 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-7-summer2020/ +这次 ALC Beijing 特别邀请到了在“点亮计划暑期2020”新晋成为Apache Committer的学生以及他们的导师一同与我们分享他们参与暑期2020的心路历程。ALC Beijing Episode #6 IoTDB 背后的科研故事(上)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-1-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #6 IoTDB 背后的科研故事(下)https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/Wed, 30 Dec 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-6-2-apache-iotdb/ +今天非常有幸请到了 Apache IoTDB 项目背后的博士生们给我们讲一下,一个来自于高校的Apache项目背后的科研故事。ALC Beijing Episode #5 : 内源 InnerSourcehttps://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/Sun, 15 Nov 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-5-inner-source/ +随着开源的发展,越来越多企业开始把开源的最佳实践应用到企业内部开发。今天我们就跟大家聊一下这一有趣的现象 InnerSource。ALC Beijing Episode #4 : 技术架构、Community 和康威定律https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/Wed, 30 Sep 2020 11:18:04 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-4-conways-law-and-open-source-community/ +在开源的项目中,或者是更扩大一些,任何做项目的工程中,人员的组织关系是和要做的工程是有很大关系的。不确定读者你是否意识到这些,《人月神话》中提到了,更多的软件工程中也提到了这个,随着你参与Apache项目的深入,接下来该如何处理?Podcast Episode #0 : ALC Beijing Podcast 的承诺https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/Thu, 13 Aug 2020 10:12:41 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-0-introduce-alc-beijing-podcast/ +Podcast 在开源世界里其实是蛮流行的,成本低、渠道广,重要的是欧美的上班一族或宅男有听podcast这样一个习惯,那么在讲普通话的地缘了呢?这种情形如何面对?ALC Beijing 成员采访之李岗: 用青春谱写开源https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/Thu, 30 Jul 2020 11:01:48 +0800https://alc-beijing.github.io/alc-site/post/interview/alc-beijing-member-ligang/ +这个系列会为大家带来不一样的体验,针对ALC Beijing 成员的采访,让你了解ALC Beijing 的初心以及蓝图。 Apache APISIX 的快速之旅(全文版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/Thu, 09 Jul 2020 20:15:27 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-story-of-apisix-fulltext/ +Apache 为一个已经拥有蛮多用户和开发者的项目带来多大的帮助?答案就是国际化、火箭般的上升速度、以及不是自己的孩子但更加的热爱!Podcast Episode #3: Apache APISIX 的快速孵化之旅(音频版)https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/Mon, 06 Jul 2020 21:02:45 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-3-the-sotry-of-apisix-audio/ +Apache APISIX 可以算是带师学艺了,已经拥有一定的用户和粉丝,有了Apache 这样的开源背书,可以说是如鱼得水,不仅发展和壮大了自己的Community,也赢得了国际的声誉和口碑。可能找不到第二条路能够让 APISIX 有如此的迅速成长的道路了!Podcast Episode #2(上) : Apache ShardingSphere 开发者们的欢乐与刺激https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-1-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #2(下) : Apache ShardingSphere 团队谈Apachehttps://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/Sun, 31 May 2020 17:08:49 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-2-2-talk-to-shardingsphere/ +在这一期的播客里,让我们认识一下ShardingSphere的开发者们口述自身的经历,这中体验是区别于文字的,这是一种复杂的情感,ta们仿佛就在我们的眼前,和我们非常放松的聊天,聊日常、聊枯燥、聊编程带来的愉悦、聊开源带给人生的冲击。Podcast Episode #1:Apache SkyWalking 那些事https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/Mon, 27 Apr 2020 16:10:58 +0800https://alc-beijing.github.io/alc-site/post/podcast/episode-1-talk-to-skywalking/ +ALC Beijing Podcast Episode #1, 聊聊Apache SkyWalking 的故事!是幸运还是坚持?是技术实力过硬?还是人缘杠杆?Apache TLP 是如何炼成的?这些你都需要了解一下。 \ No newline at end of file diff --git a/tags/alc-beijing/index.html b/tags/alc-beijing/index.html new file mode 100644 index 00000000..3598440a --- /dev/null +++ b/tags/alc-beijing/index.html @@ -0,0 +1,3 @@ +ALC-Beijing | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    A l c beijing

    \ No newline at end of file diff --git a/tags/alc-beijing/index.xml b/tags/alc-beijing/index.xml new file mode 100644 index 00000000..69bc3f05 --- /dev/null +++ b/tags/alc-beijing/index.xml @@ -0,0 +1,2 @@ +ALC-Beijing on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/alc-beijing/Recent content in ALC-Beijing on alc-beijing.github.ioHugo -- gohugo.ioen-usSun, 29 Aug 2021 20:00:00 +0800为什么要成立 ALC (Apache Local Community) Beijing?https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/alc-beijing-creation/ +The creation story about ALC-Beijing \ No newline at end of file diff --git a/tags/apache-blog/index.html b/tags/apache-blog/index.html new file mode 100644 index 00000000..68d78c8d --- /dev/null +++ b/tags/apache-blog/index.html @@ -0,0 +1,3 @@ +Apache blog | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Apache blog

    \ No newline at end of file diff --git a/tags/apache-blog/index.xml b/tags/apache-blog/index.xml new file mode 100644 index 00000000..8963b7cb --- /dev/null +++ b/tags/apache-blog/index.xml @@ -0,0 +1,3 @@ +Apache blog on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/apache-blog/Recent content in Apache blog on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 12 Jan 2022 16:06:05 +0800【Apache 博客】之 ASF 软件安全报告https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/apache-security-report/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。【Apache 博客】之 冠状病毒肆虐之下的远程协作https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/Mon, 25 May 2020 16:06:05 +0800https://alc-beijing.github.io/alc-site/post/apache-blog/success-at-apache-remote-collaboration/ +Apache 之道的异步通信,是否在疫情发生的非常时期能够凸显出其优势了呢?还是只是没有被影响到罢了?让我们来听听 ASF 的名誉会员怎么讲。 \ No newline at end of file diff --git a/tags/apache-local-community/index.html b/tags/apache-local-community/index.html new file mode 100644 index 00000000..c870c824 --- /dev/null +++ b/tags/apache-local-community/index.html @@ -0,0 +1,8 @@ +Apache local Community | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Apache local community

    \ No newline at end of file diff --git a/tags/apache-local-community/index.xml b/tags/apache-local-community/index.xml new file mode 100644 index 00000000..0713fdd5 --- /dev/null +++ b/tags/apache-local-community/index.xml @@ -0,0 +1,6 @@ +Apache local Community on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/apache-local-community/Recent content in Apache local Community on alc-beijing.github.ioHugo -- gohugo.ioen-usMon, 16 Nov 2020 18:45:20 +0800亲临百人盛况的Apache SkyWalking 2020 DevCon,看见了什么?https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/what_do_we_see_at_the_apache_skywalking_2020_devcon_event/增长与挑战 —— Apache 中国路演2020在 COSCon'2020(项目孵化篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual/ +Apache顶级项目意味着你所开发的项目,得到了Apache 软件基金会的认可,有了一定的共同体意识和实力,那么在选择进入Apache,孵化的过程中要做些什么?怎么最快获得认可?成为顶级项目又能获得什么?文化融合 —— Apache 中国路演2020在 COSCon'2020(Community 建设篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-1/ +在本土会将open source community 翻译为开源社区,这样的翻译对于多数人来讲是会和居委会相混淆的,失去了计算机、信息领域的职业共同体的意味,也就是说开源本来就很小众了,如果加上知识产权方面的伤害,真的吃不消。这可能是中国本土开源一直萎靡不振的一个重要原因吧。那么在如此恶劣的情形下,加入Apache的项目如何在建立共同体方面突围了呢?追赶与创新 —— Apache 中国路演2020在 COSCon'2020(技术篇)https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/Mon, 12 Oct 2020 17:55:29 +0800https://alc-beijing.github.io/alc-site/post/event/apache-roadshow-china-2020-virtual-2/ +放眼整个互联网,如果没有地域关系的话,是个什么样的光景?地域性有的时候成了某种竞争关系的借口。那么本土的项目究竟在原创性上有何突破之处?还是对标欧美已有项目的更多些?分享项目本身解决的问题更多些?还是将COSCon错误的认为是一种营销的手段?我们来捋一捋本土项目的技术方面的内容。正在成长中的中国本土 Apache —— 吴晟在 ApacheCon@Home 2020的主题演讲https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/Mon, 12 Oct 2020 17:45:31 +0800https://alc-beijing.github.io/alc-site/post/event/apachehome-shengwu-keynote/ +ApacheCon 今年全部在线上举办,来自Apache 顶级项目 SkyWalking 的创始人兼VP——吴晟先生,在今天的Keynote环节为大家分享了他对Apache在中国的增长形势做了介绍。ALC Beijing Meetup #1 嘉宾和主题介绍https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/Tue, 11 Aug 2020 18:46:08 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-guest-introducation/ +不说明Meetup的嘉宾和主题,是一种非常不礼貌的行为。ALC Beijing 活动https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/Tue, 11 Aug 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/post/event/first-meetup-open-source-roadblock/ \ No newline at end of file diff --git a/tags/apache-local-communtiy/index.html b/tags/apache-local-communtiy/index.html new file mode 100644 index 00000000..4998bed6 --- /dev/null +++ b/tags/apache-local-communtiy/index.html @@ -0,0 +1,3 @@ +Apache local Communtiy | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Apache local communtiy

    \ No newline at end of file diff --git a/tags/apache-local-communtiy/index.xml b/tags/apache-local-communtiy/index.xml new file mode 100644 index 00000000..52c21914 --- /dev/null +++ b/tags/apache-local-communtiy/index.xml @@ -0,0 +1,3 @@ +Apache local Communtiy on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/apache-local-communtiy/Recent content in Apache local Communtiy on alc-beijing.github.ioHugo -- gohugo.ioen-usTue, 08 Dec 2020 11:22:56 +0800ALC Beijing 活动: Apache PMC 亲自教你系列https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/post/event/alc-beijing-apache-mentor-series/ +传播即媒介,ALC Beijing 视传播Apache way 为己任,但是在介绍Apache Way 之前,可能需要做的是:什么是Apache?做什么和能做什么。越是全球化,越要本土化:ALC Beijing 成员(部分)自我承诺https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/Sun, 05 Jul 2020 10:41:22 +0800https://alc-beijing.github.io/alc-site/post/alc-beijing-member-self-introduce/ +Apache 本土共同体部分成员的自我介绍,以及他们对这个组织的期望,当然了现在做的事情也非常值得说明。 \ No newline at end of file diff --git a/tags/apache-policy/index.html b/tags/apache-policy/index.html new file mode 100644 index 00000000..58409b64 --- /dev/null +++ b/tags/apache-policy/index.html @@ -0,0 +1,5 @@ +Apache policy | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Apache policy

    \ No newline at end of file diff --git a/tags/apache-policy/index.xml b/tags/apache-policy/index.xml new file mode 100644 index 00000000..e3e914d0 --- /dev/null +++ b/tags/apache-policy/index.xml @@ -0,0 +1,3 @@ +Apache policy on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/apache-policy/Recent content in Apache policy on alc-beijing.github.ioHugo -- gohugo.ioen-usTue, 02 Mar 2021 00:00:00 +0000Apache 下游项目的品牌使用原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-downstream-mark-policy/ +介绍了Apache下游项目的品牌使用过程中需要注意的原则问题Apache 项目网站商标原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/Mon, 01 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-website-mark-policy/ +介绍了Apache项目网站商标在使用过程中需要注意的原则问题 \ No newline at end of file diff --git a/tags/apache-way/index.html b/tags/apache-way/index.html new file mode 100644 index 00000000..9de60d58 --- /dev/null +++ b/tags/apache-way/index.html @@ -0,0 +1,17 @@ +Apache Way | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Apache way

    \ No newline at end of file diff --git a/tags/apache-way/index.xml b/tags/apache-way/index.xml new file mode 100644 index 00000000..dde0d4d3 --- /dev/null +++ b/tags/apache-way/index.xml @@ -0,0 +1,9 @@ +Apache Way on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/apache-way/Recent content in Apache Way on alc-beijing.github.ioHugo -- gohugo.ioen-usMon, 18 Sep 2023 00:00:00 +0000新孵化项目提案指导https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/Mon, 18 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/new-proposal-template-guide/ +描述了进入ASF孵化器提案需要做的工作Apache孵化器指南表格版https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/Sat, 20 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book-table/ +描述了进入ASF孵化过程中各个阶段需要注意的问题。Apache ServiceComb带您对话Apache大咖https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/Sat, 13 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/talk-to-apache-experts/ +Apache专家现场解读Apache基金会及孵化器运作模式Apache 软件基金会品牌使用指南https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/Wed, 03 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/asf-mark-policy/ +介绍了Apache 软件基金会品牌在使用过程中需要注意的原则问题Apache 商标使用管理原则https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-policy/apache-mark-policy/ +介绍了Apache商标在使用过程中需要注意的原则问题Apache孵化器指南https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/Sun, 28 Feb 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/incubator-cook-book/ +描述了进入ASF孵化过程中各个阶段需要注意的问题。ASF如何准备董事会会议https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/Wed, 21 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache-way/apache-board-meeting/ +ASF如何准备一个月一次的董事会到底什么是The Apache Way?https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/Sun, 30 Aug 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_is_the_apache_way/ +What is the Apache Way? \ No newline at end of file diff --git a/tags/apachecon/index.html b/tags/apachecon/index.html new file mode 100644 index 00000000..1d167ce2 --- /dev/null +++ b/tags/apachecon/index.html @@ -0,0 +1,15 @@ +ApacheCon | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Apache con

    \ No newline at end of file diff --git a/tags/apachecon/index.xml b/tags/apachecon/index.xml new file mode 100644 index 00000000..c45f9334 --- /dev/null +++ b/tags/apachecon/index.xml @@ -0,0 +1,7 @@ +ApacheCon on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/apachecon/Recent content in ApacheCon on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000Rich Bowen: 无论你在创造什么,最终交付的是信任。https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/ +2023 年 CommunityOverCode Asia Rich 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。开源贡献难吗?https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/ +在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这个题目。从参会到办会的入’坑’指南https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/Mon, 25 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/CommunityOverCode Asia 2023 会议资料汇总https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/Sat, 23 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/ +本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频和会议演讲材料的访问信息。Apache® 软件基金会官宣:全球社区在线大会 ApacheCon@Home 即将召开https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/Fri, 25 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apache-software-foundation-welcomes/ +The Apache® Software Foundation Welcomes its Global Community Online at ApacheCon@Home年度开源盛会ApacheCon首发中文盛宴来临,欢迎报名!https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/Wed, 16 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-mandarin-track/ +ApacheCon 2020 Mandarin Track IntroductionApacheCon 2020 参会指南https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/Tue, 15 Sep 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/apachecon-2020-guide/ +The creation story about ALC-Beijing \ No newline at end of file diff --git a/tags/asf-ss/index.html b/tags/asf-ss/index.html new file mode 100644 index 00000000..777c5d06 --- /dev/null +++ b/tags/asf-ss/index.html @@ -0,0 +1,3 @@ +ASF-SS | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    A s f s s

    \ No newline at end of file diff --git a/tags/asf-ss/index.xml b/tags/asf-ss/index.xml new file mode 100644 index 00000000..7a430308 --- /dev/null +++ b/tags/asf-ss/index.xml @@ -0,0 +1,2 @@ +ASF-SS on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/asf-ss/Recent content in ASF-SS on alc-beijing.github.ioHugo -- gohugo.ioen-usMon, 20 Apr 2020 00:00:00 +0000Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/Mon, 20 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/sharding_sphere_graduation_celebration/ +Apache毕业贺礼—Apache ShardingSphere跌宕起伏的开源之路 \ No newline at end of file diff --git "a/tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.html" "b/tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.html" new file mode 100644 index 00000000..57d481fc --- /dev/null +++ "b/tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.html" @@ -0,0 +1,3 @@ +ASF公司架构和治理 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    A s f公司架构和治理

    \ No newline at end of file diff --git "a/tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.xml" "b/tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.xml" new file mode 100644 index 00000000..fbc66a06 --- /dev/null +++ "b/tags/asf\345\205\254\345\217\270\346\236\266\346\236\204\345\222\214\346\262\273\347\220\206/index.xml" @@ -0,0 +1,2 @@ +ASF公司架构和治理 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/asf%E5%85%AC%E5%8F%B8%E6%9E%B6%E6%9E%84%E5%92%8C%E6%B2%BB%E7%90%86/Recent content in ASF公司架构和治理 on alc-beijing.github.ioHugo -- gohugo.ioen-usSat, 04 Apr 2020 00:00:00 +0000ASF公司架构和治理https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/Sat, 04 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_corporate_organization/ +ASF公司架构和治理 \ No newline at end of file diff --git "a/tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.html" "b/tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.html" new file mode 100644 index 00000000..0061b627 --- /dev/null +++ "b/tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.html" @@ -0,0 +1,3 @@ +ASF年度大会程序 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    A s f年度大会程序

    \ No newline at end of file diff --git "a/tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.xml" "b/tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.xml" new file mode 100644 index 00000000..3f9afd5e --- /dev/null +++ "b/tags/asf\345\271\264\345\272\246\345\244\247\344\274\232\347\250\213\345\272\217/index.xml" @@ -0,0 +1,2 @@ +ASF年度大会程序 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/asf%E5%B9%B4%E5%BA%A6%E5%A4%A7%E4%BC%9A%E7%A8%8B%E5%BA%8F/Recent content in ASF年度大会程序 on alc-beijing.github.ioHugo -- gohugo.ioen-usThu, 02 Apr 2020 00:00:00 +0000ASF年度大会程序https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/the_procedures_of_asf_annual_members_meeting/ +ASF年度大会程序 \ No newline at end of file diff --git "a/tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.html" "b/tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.html" new file mode 100644 index 00000000..03558415 --- /dev/null +++ "b/tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.html" @@ -0,0 +1,5 @@ +ASF项目孵化流程 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    A s f项目孵化流程

    \ No newline at end of file diff --git "a/tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.xml" "b/tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.xml" new file mode 100644 index 00000000..3aa84e2c --- /dev/null +++ "b/tags/asf\351\241\271\347\233\256\345\255\265\345\214\226\346\265\201\347\250\213/index.xml" @@ -0,0 +1,3 @@ +ASF项目孵化流程 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/asf%E9%A1%B9%E7%9B%AE%E5%AD%B5%E5%8C%96%E6%B5%81%E7%A8%8B/Recent content in ASF项目孵化流程 on alc-beijing.github.ioHugo -- gohugo.ioen-usFri, 24 Jul 2020 00:00:00 +0000Apache基金会项目孵化过程中知识产权转移的讨论https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/ +ASF项目孵化流程对知识产权授权与转移有完备的定义,本文从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结为何Apache软件基金会能孵化出如此多成功的开源项目https://alc-beijing.github.io/alc-site/post/asf_incubator_process/Thu, 16 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/asf_incubator_process/ +ASF项目孵化流程 \ No newline at end of file diff --git a/tags/communityovercode/index.html b/tags/communityovercode/index.html new file mode 100644 index 00000000..91666540 --- /dev/null +++ b/tags/communityovercode/index.html @@ -0,0 +1,9 @@ +CommunityOverCode | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Community over code

    • 04 +Oct 2023

      Rich Bowen: 无论你在创造什么,最终交付的是信任。

      2023 年 CommunityOverCode Asia Rich 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。
    • 04 +Oct 2023

      开源贡献难吗?

      在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这个题目。
    • 25 +Sep 2023
    • 23 +Sep 2023
    \ No newline at end of file diff --git a/tags/communityovercode/index.xml b/tags/communityovercode/index.xml new file mode 100644 index 00000000..a1ca732d --- /dev/null +++ b/tags/communityovercode/index.xml @@ -0,0 +1,4 @@ +CommunityOverCode on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/communityovercode/Recent content in CommunityOverCode on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000Rich Bowen: 无论你在创造什么,最终交付的是信任。https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/interview/interview_with_rich_bown/ +2023 年 CommunityOverCode Asia Rich 发表了“与管理层谈论开源”的主题演讲后,我们和 Rich 坐下来一起探讨了演讲背后的更多内容。除了管理层和开源,我们还讨论了 AWS 和 Apache 软件基金会在开源项目中的方法和策略,构建开源生态系统最重要的因素,以及 Rich 是如何平衡不同的角色等话题。开源贡献难吗?https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/ +在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这个题目。从参会到办会的入’坑’指南https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/Mon, 25 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/CommunityOverCode Asia 2023 会议资料汇总https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/Sat, 23 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-conference-meterials/ +本文汇集了CommunityOverCode (原ApacheCon) Asia 2023 所有会议视频和会议演讲材料的访问信息。 \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 00000000..966f2579 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,24 @@ +Tags | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Tags

    \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml new file mode 100644 index 00000000..494c4971 --- /dev/null +++ b/tags/index.xml @@ -0,0 +1 @@ +Tags on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/Recent content in Tags on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000ApacheConhttps://alc-beijing.github.io/alc-site/tags/apachecon/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/apachecon/CommunityOverCodehttps://alc-beijing.github.io/alc-site/tags/communityovercode/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/communityovercode/OpenSourcehttps://alc-beijing.github.io/alc-site/tags/opensource/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/opensource/Apache Wayhttps://alc-beijing.github.io/alc-site/tags/apache-way/Mon, 18 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/apache-way/Releasehttps://alc-beijing.github.io/alc-site/tags/release/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/tags/release/Apache bloghttps://alc-beijing.github.io/alc-site/tags/apache-blog/Wed, 12 Jan 2022 16:06:05 +0800https://alc-beijing.github.io/alc-site/tags/apache-blog/ALC Beijing 播客https://alc-beijing.github.io/alc-site/tags/alc-beijing-%E6%92%AD%E5%AE%A2/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/tags/alc-beijing-%E6%92%AD%E5%AE%A2/ALC-Beijinghttps://alc-beijing.github.io/alc-site/tags/alc-beijing/Sun, 29 Aug 2021 20:00:00 +0800https://alc-beijing.github.io/alc-site/tags/alc-beijing/开源https://alc-beijing.github.io/alc-site/tags/%E5%BC%80%E6%BA%90/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/%E5%BC%80%E6%BA%90/编程之夏https://alc-beijing.github.io/alc-site/tags/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%8F/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%8F/Apache policyhttps://alc-beijing.github.io/alc-site/tags/apache-policy/Tue, 02 Mar 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/apache-policy/非社区贡献https://alc-beijing.github.io/alc-site/tags/%E9%9D%9E%E7%A4%BE%E5%8C%BA%E8%B4%A1%E7%8C%AE/Tue, 05 Jan 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/%E9%9D%9E%E7%A4%BE%E5%8C%BA%E8%B4%A1%E7%8C%AE/Apache local Communtiyhttps://alc-beijing.github.io/alc-site/tags/apache-local-communtiy/Tue, 08 Dec 2020 11:22:56 +0800https://alc-beijing.github.io/alc-site/tags/apache-local-communtiy/Apache local Communityhttps://alc-beijing.github.io/alc-site/tags/apache-local-community/Mon, 16 Nov 2020 18:45:20 +0800https://alc-beijing.github.io/alc-site/tags/apache-local-community/ASF项目孵化流程https://alc-beijing.github.io/alc-site/tags/asf%E9%A1%B9%E7%9B%AE%E5%AD%B5%E5%8C%96%E6%B5%81%E7%A8%8B/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/asf%E9%A1%B9%E7%9B%AE%E5%AD%B5%E5%8C%96%E6%B5%81%E7%A8%8B/知识产权转移https://alc-beijing.github.io/alc-site/tags/%E7%9F%A5%E8%AF%86%E4%BA%A7%E6%9D%83%E8%BD%AC%E7%A7%BB/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/%E7%9F%A5%E8%AF%86%E4%BA%A7%E6%9D%83%E8%BD%AC%E7%A7%BB/Member-Storyhttps://alc-beijing.github.io/alc-site/tags/member-story/Sun, 24 May 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/member-story/志愿者,Volunteerhttps://alc-beijing.github.io/alc-site/tags/%E5%BF%97%E6%84%BF%E8%80%85volunteer/Tue, 21 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/%E5%BF%97%E6%84%BF%E8%80%85volunteer/ASF-SShttps://alc-beijing.github.io/alc-site/tags/asf-ss/Mon, 20 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/asf-ss/ASF公司架构和治理https://alc-beijing.github.io/alc-site/tags/asf%E5%85%AC%E5%8F%B8%E6%9E%B6%E6%9E%84%E5%92%8C%E6%B2%BB%E7%90%86/Sat, 04 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/asf%E5%85%AC%E5%8F%B8%E6%9E%B6%E6%9E%84%E5%92%8C%E6%B2%BB%E7%90%86/ASF年度大会程序https://alc-beijing.github.io/alc-site/tags/asf%E5%B9%B4%E5%BA%A6%E5%A4%A7%E4%BC%9A%E7%A8%8B%E5%BA%8F/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/asf%E5%B9%B4%E5%BA%A6%E5%A4%A7%E4%BC%9A%E7%A8%8B%E5%BA%8F/如何成为合格的ASF贡献者,Contributorhttps://alc-beijing.github.io/alc-site/tags/%E5%A6%82%E4%BD%95%E6%88%90%E4%B8%BA%E5%90%88%E6%A0%BC%E7%9A%84asf%E8%B4%A1%E7%8C%AE%E8%80%85contributor/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/%E5%A6%82%E4%BD%95%E6%88%90%E4%B8%BA%E5%90%88%E6%A0%BC%E7%9A%84asf%E8%B4%A1%E7%8C%AE%E8%80%85contributor/The introduction about DolphinSchedulerhttps://alc-beijing.github.io/alc-site/tags/the-introduction-about-dolphinscheduler/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/the-introduction-about-dolphinscheduler/indexhttps://alc-beijing.github.io/alc-site/tags/index/Mon, 01 Jan 0001 00:00:00 +0000https://alc-beijing.github.io/alc-site/tags/index/ \ No newline at end of file diff --git a/tags/index/index.html b/tags/index/index.html new file mode 100644 index 00000000..b803e195 --- /dev/null +++ b/tags/index/index.html @@ -0,0 +1,3 @@ +index | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Index

    • 04 +Oct 2023
    \ No newline at end of file diff --git a/tags/index/index.xml b/tags/index/index.xml new file mode 100644 index 00000000..79ea5595 --- /dev/null +++ b/tags/index/index.xml @@ -0,0 +1 @@ +index on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/index/Recent content in index on alc-beijing.github.ioHugo -- gohugo.ioen-usPostshttps://alc-beijing.github.io/alc-site/post/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/ \ No newline at end of file diff --git a/tags/member-story/index.html b/tags/member-story/index.html new file mode 100644 index 00000000..6bf4e512 --- /dev/null +++ b/tags/member-story/index.html @@ -0,0 +1,3 @@ +Member-Story | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Member story

    \ No newline at end of file diff --git a/tags/member-story/index.xml b/tags/member-story/index.xml new file mode 100644 index 00000000..6813a991 --- /dev/null +++ b/tags/member-story/index.xml @@ -0,0 +1,2 @@ +Member-Story on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/member-story/Recent content in Member-Story on alc-beijing.github.ioHugo -- gohugo.ioen-usSun, 24 May 2020 00:00:00 +0000英雄之旅-行走在开源领域的一个自叙故事https://alc-beijing.github.io/alc-site/post/heros_journey_trista/Sun, 24 May 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/heros_journey_trista/ +英雄之旅-行走在开源领域的一个自叙故事 \ No newline at end of file diff --git a/tags/opensource/index.html b/tags/opensource/index.html new file mode 100644 index 00000000..94e200ff --- /dev/null +++ b/tags/opensource/index.html @@ -0,0 +1,5 @@ +OpenSource | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Open source

    \ No newline at end of file diff --git a/tags/opensource/index.xml b/tags/opensource/index.xml new file mode 100644 index 00000000..1088d9e3 --- /dev/null +++ b/tags/opensource/index.xml @@ -0,0 +1,2 @@ +OpenSource on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/opensource/Recent content in OpenSource on alc-beijing.github.ioHugo -- gohugo.ioen-usWed, 04 Oct 2023 00:00:00 +0000开源贡献难吗?https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/Wed, 04 Oct 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-how-hard-is-opensource-contribution/ +在本次 CommunityOverCode Asia 2023 的 keynote 演讲中,李本超根据自己在开源社区的贡献经历,跟大家分享了《开源贡献难吗》这个题目。从参会到办会的入’坑’指南https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/Mon, 25 Sep 2023 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apachecon/cocasia-2023-why-do-we-host-cocasia/ \ No newline at end of file diff --git a/tags/release/index.html b/tags/release/index.html new file mode 100644 index 00000000..331f420b --- /dev/null +++ b/tags/release/index.html @@ -0,0 +1,2 @@ +Release | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    Release

    \ No newline at end of file diff --git a/tags/release/index.xml b/tags/release/index.xml new file mode 100644 index 00000000..83b08ece --- /dev/null +++ b/tags/release/index.xml @@ -0,0 +1,2 @@ +Release on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/release/Recent content in Release on alc-beijing.github.ioHugo -- gohugo.ioen-usFri, 07 Apr 2023 17:07:07 +0800【Release】ASF 孵化项目发版常见问题https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/Fri, 07 Apr 2023 17:07:07 +0800https://alc-beijing.github.io/alc-site/post/apache-policy/asf-release-notes/ +对于每个初入 ASF 的项目来说,第一次发版都会多少遇到不少小问题和麻烦事,尤其以 License/Notice/Copyright 相关的问题为典型代表 \ No newline at end of file diff --git a/tags/the-introduction-about-dolphinscheduler/index.html b/tags/the-introduction-about-dolphinscheduler/index.html new file mode 100644 index 00000000..dfa93945 --- /dev/null +++ b/tags/the-introduction-about-dolphinscheduler/index.html @@ -0,0 +1,3 @@ +The introduction about DolphinScheduler | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    The introduction about dolphin scheduler

    \ No newline at end of file diff --git a/tags/the-introduction-about-dolphinscheduler/index.xml b/tags/the-introduction-about-dolphinscheduler/index.xml new file mode 100644 index 00000000..ef9fa0c7 --- /dev/null +++ b/tags/the-introduction-about-dolphinscheduler/index.xml @@ -0,0 +1,2 @@ +The introduction about DolphinScheduler on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/the-introduction-about-dolphinscheduler/Recent content in The introduction about DolphinScheduler on alc-beijing.github.ioHugo -- gohugo.ioen-usSun, 15 Mar 2020 00:00:00 +0000DolphinScheduler介绍https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/Sun, 15 Mar 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/introduce_of_apache_dolphinscheduler_incubating/ +The introduction about DolphinScheduler \ No newline at end of file diff --git "a/tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.html" "b/tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.html" new file mode 100644 index 00000000..c08a0fbe --- /dev/null +++ "b/tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.html" @@ -0,0 +1,3 @@ +如何成为合格的ASF贡献者,Contributor | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    如何成为合格的 a s f贡献者, contributor

    \ No newline at end of file diff --git "a/tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.xml" "b/tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.xml" new file mode 100644 index 00000000..fe474243 --- /dev/null +++ "b/tags/\345\246\202\344\275\225\346\210\220\344\270\272\345\220\210\346\240\274\347\232\204asf\350\264\241\347\214\256\350\200\205contributor/index.xml" @@ -0,0 +1,2 @@ +如何成为合格的ASF贡献者,Contributor on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/%E5%A6%82%E4%BD%95%E6%88%90%E4%B8%BA%E5%90%88%E6%A0%BC%E7%9A%84asf%E8%B4%A1%E7%8C%AE%E8%80%85contributor/Recent content in 如何成为合格的ASF贡献者,Contributor on alc-beijing.github.ioHugo -- gohugo.ioen-usThu, 02 Apr 2020 00:00:00 +0000如何成为合格的ASF贡献者https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/Thu, 02 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_qualified_asf_contributor/ +如何成为合格的ASF贡献者 \ No newline at end of file diff --git "a/tags/\345\274\200\346\272\220/index.html" "b/tags/\345\274\200\346\272\220/index.html" new file mode 100644 index 00000000..0c68d692 --- /dev/null +++ "b/tags/\345\274\200\346\272\220/index.html" @@ -0,0 +1,11 @@ +开源 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    开源

    \ No newline at end of file diff --git "a/tags/\345\274\200\346\272\220/index.xml" "b/tags/\345\274\200\346\272\220/index.xml" new file mode 100644 index 00000000..92246c9c --- /dev/null +++ "b/tags/\345\274\200\346\272\220/index.xml" @@ -0,0 +1,6 @@ +开源 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/%E5%BC%80%E6%BA%90/Recent content in 开源 on alc-beijing.github.ioHugo -- gohugo.ioen-usThu, 29 Apr 2021 00:00:00 +0000如何成为一名成功的学生导师https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/ +编程之夏 2020 优秀学生导师总结从初识社区到融入社区https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/Tue, 05 Jan 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/ +Get yourself involved in the community暑期 2020 活动学生(张可)心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/Sun, 20 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing2/ +学生(张可)参与暑期 2020 活动中 Apache SkyWalking 项目的感受与收获暑期2020活动心得分享https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/Sat, 19 Dec 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/summer2020_activity_sharing/ +参与开源项目有感我与开源的那些事儿https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/Thu, 29 Oct 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/what_i_do_with_open_source/ +一段有缘的开源经历 \ No newline at end of file diff --git "a/tags/\345\277\227\346\204\277\350\200\205volunteer/index.html" "b/tags/\345\277\227\346\204\277\350\200\205volunteer/index.html" new file mode 100644 index 00000000..3cfa5fb8 --- /dev/null +++ "b/tags/\345\277\227\346\204\277\350\200\205volunteer/index.html" @@ -0,0 +1,3 @@ +志愿者,Volunteer | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    志愿者, volunteer

    \ No newline at end of file diff --git "a/tags/\345\277\227\346\204\277\350\200\205volunteer/index.xml" "b/tags/\345\277\227\346\204\277\350\200\205volunteer/index.xml" new file mode 100644 index 00000000..a032b638 --- /dev/null +++ "b/tags/\345\277\227\346\204\277\350\200\205volunteer/index.xml" @@ -0,0 +1,2 @@ +志愿者,Volunteer on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/%E5%BF%97%E6%84%BF%E8%80%85volunteer/Recent content in 志愿者,Volunteer on alc-beijing.github.ioHugo -- gohugo.ioen-usTue, 21 Apr 2020 00:00:00 +0000ALC Beijing 志愿者招募https://alc-beijing.github.io/alc-site/post/call_for_volunteer/Tue, 21 Apr 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/call_for_volunteer/ +ALC Beijing Call for Volunteer \ No newline at end of file diff --git "a/tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.html" "b/tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.html" new file mode 100644 index 00000000..09563c3f --- /dev/null +++ "b/tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.html" @@ -0,0 +1,3 @@ +知识产权转移 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    知识产权转移

    \ No newline at end of file diff --git "a/tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.xml" "b/tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.xml" new file mode 100644 index 00000000..02dfe71e --- /dev/null +++ "b/tags/\347\237\245\350\257\206\344\272\247\346\235\203\350\275\254\347\247\273/index.xml" @@ -0,0 +1,2 @@ +知识产权转移 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/%E7%9F%A5%E8%AF%86%E4%BA%A7%E6%9D%83%E8%BD%AC%E7%A7%BB/Recent content in 知识产权转移 on alc-beijing.github.ioHugo -- gohugo.ioen-usFri, 24 Jul 2020 00:00:00 +0000Apache基金会项目孵化过程中知识产权转移的讨论https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/Fri, 24 Jul 2020 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/apache_incubator_ip_policy/ +ASF项目孵化流程对知识产权授权与转移有完备的定义,本文从公开发表的资料和文档,并结合亲身经历的项目捐献和孵化过程中总结 \ No newline at end of file diff --git "a/tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.html" "b/tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.html" new file mode 100644 index 00000000..f6cec856 --- /dev/null +++ "b/tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.html" @@ -0,0 +1,3 @@ +编程之夏 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    编程之夏

    \ No newline at end of file diff --git "a/tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.xml" "b/tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.xml" new file mode 100644 index 00000000..cd6895b4 --- /dev/null +++ "b/tags/\347\274\226\347\250\213\344\271\213\345\244\217/index.xml" @@ -0,0 +1,2 @@ +编程之夏 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%A4%8F/Recent content in 编程之夏 on alc-beijing.github.ioHugo -- gohugo.ioen-usThu, 29 Apr 2021 00:00:00 +0000如何成为一名成功的学生导师https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/Thu, 29 Apr 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/how_to_be_a_successful_mentor/ +编程之夏 2020 优秀学生导师总结 \ No newline at end of file diff --git "a/tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.html" "b/tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.html" new file mode 100644 index 00000000..8a83d50e --- /dev/null +++ "b/tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.html" @@ -0,0 +1,3 @@ +非社区贡献 | ALC Beijing 博客
    ALC Beijing 博客

    介绍 Apache 之道,传播 Apache 精神,让更多的年轻人了解 ASF 和开源之道, 让本土项目被更多的人知道!

    非社区贡献

    \ No newline at end of file diff --git "a/tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.xml" "b/tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.xml" new file mode 100644 index 00000000..e716c4c3 --- /dev/null +++ "b/tags/\351\235\236\347\244\276\345\214\272\350\264\241\347\214\256/index.xml" @@ -0,0 +1,2 @@ +非社区贡献 on ALC Beijing 博客https://alc-beijing.github.io/alc-site/tags/%E9%9D%9E%E7%A4%BE%E5%8C%BA%E8%B4%A1%E7%8C%AE/Recent content in 非社区贡献 on alc-beijing.github.ioHugo -- gohugo.ioen-usTue, 05 Jan 2021 00:00:00 +0000从初识社区到融入社区https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/Tue, 05 Jan 2021 00:00:00 +0000https://alc-beijing.github.io/alc-site/post/chaoss_meetup_sharing/ +Get yourself involved in the community \ No newline at end of file diff --git a/webfonts/KaTeX_AMS-Regular.woff b/webfonts/KaTeX_AMS-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..9b826783ac9c864a9a1e01feb6b61ad533981b9e GIT binary patch literal 36920 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 Q0Y5`u0RRC20ssF1599qWVgLXD literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Caligraphic-Bold.woff b/webfonts/KaTeX_Caligraphic-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..d0e5f82078bffa04287bc33fe2299e81646ee333 GIT binary patch literal 9384 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 Y)EO-t&-nwFmeza#000310ssF156q^$0RR91 literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Main-BoldItalic.woff b/webfonts/KaTeX_Main-BoldItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..d6ea5a6e80752c13be0672c8038a1adb93533e30 GIT binary patch literal 24504 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 R0szXFKg$3C00IC101s5L5_GL?*7rI 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 S0pG#mxBvhE0RRF2{{RmT9=oyt literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Math-BoldItalic.woff b/webfonts/KaTeX_Math-BoldItalic.woff new file mode 100644 index 0000000000000000000000000000000000000000..b1aebf3fa24f633f72f429228f8365c81db6dcca GIT binary patch literal 23988 zcmY(JV~{3Il!f26ZQHgnZQHh{ZFf)Gwr$(?v~AlqcD~sCvp3?2%6sCR$oy4tBdgrx z#l!$WfPbai1c3kVSuF9t{eSEKU-HTf%m9FL&_7k_9|mG|(mTdBhW7uo)qj1$KPEv* zUfGOYoe2Q|t^a&{|F9rP0HZduH@5)*RIC92uqXfkCUpaK0eg2>YoSl|3Eai z_AmngfJ6WQ`E&pvnmCg#5Y@ue&;$Tb-2LZa{}0>-URH~L;=g_W=>UR%kV0&O@LAY6 zyZ<{H=D)nuKiaS{5GAecjQ{x*|5*Ur|1tEO2WDgF{%>D}-G4pde*ne7%Gny)nEpHS z(7#+V003&Muj#dCZ|CF;0O;ua(-i)3q!hT$X76bFFRS_bFBkrg8Aa2wiJY74vJ>|8tyiWcKgMSNTOr&(YsqS^ z^Q1T3A28)!J&GMW{cmQ#pe}${hX^1Lu#r}Y7(tRHu`(oT4xzVq3WmiCRIjhv^H(@* z9_Nc2$}j=AUu6Tqc626TNHuoe-7mM}!4b7d6!;qJ5(Qg2xaN}{H;Rs!Yn7QdaU7HN}j8-E_o zghvx~=M*2-CGKDrSV$ym!zD;Rb1yJN!pu%bGHZF!l1_J6T+XJ_q{;c#e(~e3r%t?y zi+#2)_RKO8Oac?)g7@_f=l&u0{?rDBJnb>V06+peOuywGOAN_@7>k{g@=&$9h0N~{=!dw)1fl|S+tY+d zS2`-1JdrLQ98*-hw?S}Mja#^+ZA}vJeaOdw>b-tY%pmo=VLjk`54h&F!XvYdzlvDUP#59VAWC}=iaYqmbC41Fu+1Ignod7$IDb5Ds9D6J;I}rdp_hFEXF21x+8w+5{V8d z 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 O)nJ$a0RRF2{{RokB9O8G literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Math-Italic.woff b/webfonts/KaTeX_Math-Italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..3126ebecd83f07c766b0ba6ae780222e6f1c6322 GIT binary patch literal 24672 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 R4!?NSV3+^_00IC101ujsrN{sP literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_SansSerif-Bold.woff b/webfonts/KaTeX_SansSerif-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..42ee227335c42373aa3e87358413269e41f4b9a7 GIT binary patch literal 17988 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 Zj7;W$;!FUjs5g250000100IC101qeKM;8D9 literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_SansSerif-Italic.woff b/webfonts/KaTeX_SansSerif-Italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..b4c1660d0b51a7a77514eddea514b09b5903bde9 GIT binary patch literal 17052 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 R>N|h{0000100IC101vH0h*kgq literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_SansSerif-Regular.woff b/webfonts/KaTeX_SansSerif-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..b068a8e1d22edb64bc3b15f978d1b79897f9a360 GIT binary patch literal 15724 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 gFqQMgcM=dIcM@|G)Bpeg literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Script-Regular.woff b/webfonts/KaTeX_Script-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..fe4cb846ec4aea799e3ed7567abdb9322987f80d GIT binary patch literal 13000 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�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 C{HG28 literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Size1-Regular.woff b/webfonts/KaTeX_Size1-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..ae27c249f57ac9c54314f371b1c6e8bb067f5abf GIT binary patch literal 6304 zcmY+HWmFtNvxawB+}%ka5ZqmsAd83KE@5$Z2oOBDyTd|oPk;cyf=h4>!2-eE-S%$2 z@7^D``aIM9R(DO+nVEB@+e=kW4gdrojJyDV`>*FL|F8Zx{{N<`$;Ar*;0YtVDhQwu z)0Efdj;1aMUnD{|002N_CIUqg^A8@h001dB!iR|f8v($|#o7@7zy|{WD6s$lR>mCh z(y6tnJ0g}m6EThczu;Rt_*fzCBZCNwL(G*Yq#)_rSejY@0JwUHHG==3+yS%MAe@N2 z1jc z{gVH)?}vxX)hzm$fz=!1OtI{wNUd~+JxE_ld9lL&fe0u{IhFN8Kd08A(H(~Th~;|T zvn|DYj^NAUwU$$)R?Xt55uQck+M>2`E^c<|6K!Rlrrs3QPp*hG@c_My|hnq{+G-AL|% z7-9UV*(V_S1c}Y@4&Rw+46m5#gvCY@iA9mWl+wnN!bahdl#cyweCFouw`r^@eXzh5 z6X^fpjG8kJos&!v)2AX)emazk0Ea~w3m3Q+*0XlkZOA_p`87o=jxwneM*QY9WJk%w zra>LwLBK=w#dF)AD+W=G$AkD+ZR8Ke@s&T~pPI}&&n9_g6HVE)?7e$HhCg&_gk-9s zi*#zjgm(MgI*ck9WKzHP^kd{CpUPe=hjOW$dO8_EVnWnOf~49PzEH$c7zFagHy6lZ z%?nGSZ}hG2?^+q7{>fi;kioO0p|J43D5q@CJn%PH*`T-nL&@tzf^&+B$f1B;2oEKz z=`7op9OM>nhIZ6o%1vLEpl_(PUhy5Tu!tCgyp^tP_#b`;Wr!w?N_bb$1_I1#4kvAFH9TNzml$JVSP%s84q(H4rm_!eQk|< zljEUh*rpMZ%=6VKT@$6KxW=FeN3$XDHp{|TISPEErjhX$I6j5qGFm8=o4x zru1E@#@d2PsU8NNod%U#2bMF<)!}c2_EN^UNpsJKbx0?wF~?qqne7q+7Ka-hQI^`Y zYW1)9zO#O>@5M_9?4_DDXzGP8J5^-0mfu+mcf>tPQ_2X~hTB<4sGspRM&qZ{Z5Vr% z)9a3Si(KM*#*XQnzOZ+UMb+(Hu%|S%pGwnl)$_3nBZ;YIu&Q(Hz8-(4$nuwDZ!fJi zGor73Y0Qt4Y*;ws-udKkQc80Y2ySwx|2|Oy!CBf}*LO=SO?-$L5|3M^uMtiD$uP|j z3=+BYW<0pl=+OnBy>E$6mZ_rc0Mp7D2~SsT6n_MUk@d!eH-^d?&70^=3Bzy$o@gteR}E+7-nhTJN?_-PBAnwB+xPT2AA()`MY!wYL!AL zniwFH&xJdkrNaUlU7eZUq~+dD*j+B+^SOP<&Sd9b_GH3^>c~SDb2|kb9x2~0jKOoY zu4#N2RYBL;TOd*)IeEp)39usxGY@FWOa(RF@%e%)0LWgnhb!^4y%f?cj@_33oMXyi zC>W!h@aDpP&vA2rn{S=tB^`=E*81`lSUt?nok3!7f6nfR$3YUcApRY2Xv#(_#zHAB zOM6V4FHVE8Fz-P!IkGFFEcBM@>$LLLhUECf)UEY-V3DVz*v|a%>)UILk(iS)OjnXNM`R=;=pv)A&*y|dMsRasF#ep>Eb*>3RoJ1qh*k@?MJsvrB9R$V9LJLKaA zg(q8FCFVZ9lhlc`TdhNDcigj_^Bl=hY}mWHCnO-9YK|ZkCw>Zq7qLxmu8vf8!`)W9 zYL1#k8~g`b6D0U3<6b}e)8yPYBg+=PVs)#hNmG5hNF{*?rMN#K&w?j#E#I5)?`y!d zqhu$3ec70`InaJ(Z!AoJ+6e9Z?G^Tu!EH@_l}y-1W6QI=M5LPM*A^ z&uk=vt9GRd7&Wi3cFn)td5zV( zKW%$FOZ=(AoNa9FXl0SLoP!JFBy|RCI!F{?4d$;@!ReSyW;EC>QF~L_DWlUOEs_LO zxZITGIr$~7NlIs>v^#h0B&q>65N=guF3FY)kcw2+DwI0CUZdF#7E`Xbw#s0!xVkx8 z^Y3m;6~lE8_^xd|g;I;O*1*<Hr0~x>08&>ip^3NOhodg*XA-W^h?{+d-{_e&Vus;Ob5x6q1pVKEKi6SlgWC-YkLEwAI&WtcesaAzHO39{ zKkbRY!xoZr_Nf>IHK)EXdT(I->g8DQ`kV7;N3y-JqBgP@DHB`xW;av)9asq%*X_H$ zxI6%Kv0kjsja63rw5#-NsPFiWyw($TVE_le3_&EOlMR-)rLw3>^%e&hw%403AI z{^b_ZBG`q`s&@=+?M4)Ray%vHlQq{^twc$UAO?@FJ>gzuAlbSo6vDxk6zGZ*>Vp6A zeaY6ak;-GCSQwvu%|wt~(I*Lby&VSM^4`?ulF#(~HkD+GI-AsIo-cQbTY~y`^CUBC zVz~p2+x&bVQ$+J&pG&ElcSrf>Q#w#{oa{c{R8O*fXzI&laep1MjqYw3@RjdFwZ9^L ztJnQvv2^HeW@fyci@`AS=152VzUw`Ecg}YAJyg6M<4@ni=|`h`GzkS^#GwgsR6)QE zmLHKV5MWz zVQV2W{Hp;$?BMDj6Fl%001LGHFY&VLW5xgVPovL;DC8gwghu~Qm571&qWNt>b;q^E!4%~jNRNM?b`FTzMcGCS}=_{n4EbKn^K8SW2ve{O{f+>iLeZ#o8i zac*)?L{`i@AK=F~ZL7xt?Kv*G+bVrHgZ7K_-)e1K*51nA7{cX< z$TlVSlY(Vm9_6Hpk2(zgJmn9_x1Vyl?`VI(4xkhnfnQHu4=K9exIwf^G!*6KHNw*9 zbgC2`qTW9hmy(&dn%{MVI=6zIXE=s+iE8;9^5y5s4NT_kYj^7Et6#0`vB}HY?lzcb zPIKh5g$qUo>aQ&>`#$+tgQMp+N^Xc$eVt(VT3- zw;oy9|FY8s4e_m?g)xMMZ#o$1G+TO#d1~6%jHoObjM>pGeEYRiNq1Wzzz3+5$HJKR z9KxYN`eDg*)ndi(G9{;Of~BZ}+P#&cP5H&WaZBo@x{8P&neM^6;>OHkET<+5B1hMI z50UPqnBpe-2O}XcVdFz3Z$W8r4X!}lwCO-vBgcnd1o;OX`SREpLs2$QW!VPwXI-kA zY>c*L$Rc+4^hB)Dz3I)6>&yk!XYV}}VgAb@;S%9_3PH z3U7;=3~+=Q${T0%TS`Ago!RAj*Iqk}T=)zVrzwq6=@0JMf*`M8vG0dH**$E0ls>%u z{myjf0(*HhJr$o^Pu>U?uQ9B-ZkxD$QSH;1Oxze3-!ZD0b5E78nyDM}vuZ1N`l>)e zdtWtMdQ7HDk%y0{E+q^+lg=o65Z+(xr~Ef0uOT~eP+9}sXGn0=owc_K9B02|@8uHD zcFQF|nsph}iFWj?L8I9vU7<i8 zVqDbDAj}j-%0%V(Tz~W)>0MdUQbp5*wesIcFcwS}#wV-2>7zL-^PXGQcvDuBU#7K` zoZya2GdB9MnPoucc~z}zJmO9BaDUmG=8=BuH}FAbm>nD?7LGCi?-BwQDd3UIzDJTv zqC|A4a!K!?#3E?1uiyxFg4K(8F26bmtkNDjC?yRDCc8=2Ck0?(KR90VDC%OXC&X8T zjvw3k3+rfCo_Ru=mD+`%JADx$&>s9pn-0;3 zyyX0GbN}Y=$GK8+LP-)=@!cb=!^ii2Bgi{1?)@Haloz6YnFgS}R=3U}R!c}r9}h^{ z5nq|1cx^wFPosS4I4I&yd3His&=a)wh5v6|c}Esn_O2j}1xX1Vc*zd5{uG3G z@xDVBFKa9REEmdo{)xG$*h34SL!DnmL!q|l^L|8oPm#qeyVRPy>FMy%fb`E3EHvbI z{!T-|0qAxwA}L$;@vV(lQlJ_&5rtet-?F|6BCg|dHl{C+qRW1dx~ z0awSS3kLAZ;5%k8rhVB7VR6bhubU!9w>Jil;yJ1zkK1CerO;gUyuX@x`X#>z=JRXz zFP@n^?f4MiHO(&R`y15~LpaFx+l(pHs|-cJKz!0G;#kz1|1=yPrgQkDxx#eX&=yp3 z7J69GY#l*vPG>F#uiZS^qXXU_Kd1UC+>JtoAC$IFwYr3OVkQ!%I=RE#RPxsi^*Z_e z(ALwwl7{H+Z%dxpCtL+lO97D8_y@!_ly{KoI+{f6AM`@7oZ#wbo^vl}Ru4N}#Igg2 zBY)q+)MZE_Xc@2n0wdXQr9N##l8S*Wl!>K4ifl63bkt27Nf;`z%^zY}O0`0uC8gTu zJ1s3+$vD(mTgi}Z?WtlQ2jyfbFg&yQukA5+WkIDhSNJVg z=q-DCqYvD9+~4X!4ibomfS z;P4KL_#d7A>2`U=Y(`ISZnB9wkVlP8jr|jaisE;!ATPI#lnpNNMSqHj%CNC`AJ7W`#MSTYf`YhJ=zBR7Y=&|RaQ`|o~98X zQ-OgBkw+4-p}_w4Z}(oTN$UM&BtQ;6hwqz`Q7@x>-=&w+``Q+KkOl51btHNehtkjI%Ua;DVfBcNS`IJ5kD;R1P?qui--kmwMGar=k+qo7 z2o3%0wHRm^{?z3+b2*$(iwc~DKMu(ht(L|NVO~cGbtYOru4GZf;A6fI#@~P3)^mAu z?2xC-{PLJ+vwx^&64ClLa+B1UM_b{)yF2Vl1H!y@`V(>fBBK%A_*dZkqhVmm#fwym zsx!npap;x;0wn=}?iDe_eku|W$c$v13NXoI2DOjj-}=yGUQ7@tN;0ShQ@+)yUZ@vx z*)ioeoldpovl7YK=o@QCsU_vmZ!(+9_M{SYTxc?%hxw!7(uf4iv(KYq%kW@Jww-c^ zL%s5^(fKxRfrb?@sY;1>szS-qWd4(!CqEuBn$pe~{F{T6gR9GrxjEa9m!eI6*~c$; z#seQ$YUq?}nGd^>`PiLa4XG7mD?x-m0p)~JM3^DFEt1F-n1?;jXwX>AQN;HJgu?-N F{{w=YvuXeU literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Size2-Regular.woff b/webfonts/KaTeX_Size2-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..8285fed1bf30cc17b3505d8aa939eb963a84cfd7 GIT binary patch literal 6016 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 GK=D6VA+Fm1 literal 0 HcmV?d00001 diff --git a/webfonts/KaTeX_Typewriter-Regular.woff b/webfonts/KaTeX_Typewriter-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..ea5be72834b9bb201c84fabd992a0bccee311cbd GIT binary patch literal 19708 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 z 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 Dx%kbz literal 0 HcmV?d00001 diff --git a/webfonts/Roboto-Medium.woff b/webfonts/Roboto-Medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..61b97d784013406d631203db53baf5b8a6a75e0c GIT binary patch literal 70620 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%0Av;fFhL!=9Pa3|V%=P1Lm1fnn;M3ADC9Q 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 DjoD+e literal 0 HcmV?d00001 diff --git a/webfonts/RobotoMono-Regular.woff b/webfonts/RobotoMono-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..44b84dd6b71e05aff21693ef95f513c0ff2b8a24 GIT binary patch literal 26464 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

    )n+sYj_ttH-Fb)nnB;>Rff6dYpQ^dV+eQdXhR{ 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

    ScPp7UYvIFke%a6|Du^G1HLKYdKRQUP3kr~WU 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 PAApscxF+9%?|HK{Ep3zbfwb*orEJ71 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 {0*j9;c)hv7CKtT<=$) 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 literal 0 HcmV?d00001 diff --git a/webfonts/fa-solid-900.woff b/webfonts/fa-solid-900.woff new file mode 100644 index 0000000000000000000000000000000000000000..73c1a4d5d156b6ddc62a7e3eba1c206bd6ad19c8 GIT binary patch literal 101652 zcmZTvV{j-<(~WK0c5-9ewr$(CZQD+6a%0=JZChWS_wTn=XJ-0L_tx~*R&{SzubZ5x zC;%V;003YN3IOcy42=E?C>3(>yZV2ZsHn2cuOh?m2KFy-l81Er#Dqmee>v%28Sj6f z0=}11qG$T$tbgVIc>O|y0QK2_by$AEioMb;YyM0Aa=-Qf1iv5w5dxz% zw{dp=<>G&xI0XQJuOD0jhP1Xb`qeXb2LOPg{pFfLfh~n?4BYJj0By^E?ePDz2ayHT zu{E$U`Q=6d0Dyj<0w^_UBO{)@os%;Fp#AEvs~i9TjC4S^q6Y5SM*8~t#sGmEZ1c7L zr(7mWdijs=0GhZEF2C;m-VNp#XukmZm4JaSerJ&XNx#E?wg#V5oBh4xy}hRc>BGIf zyKp5vOyW$<3=9m6^-O>CK>;mlDPdsY)%`xrxNm;|g76M7LlN>Bh{a>)A{{8>74`K& z00NxgOx&}tmc7(hmT-IT=ph=}^JZSWmu?lo1Z*d2l1(ErDoA9SBv?(GaEe>3ry7{2 zj*}^MZv&qXC#5RFV>)46N+hU+5DAY#h0Qq;<7WYoAG05LcAUDA(z?IiYsm9#p6tBv zc4nOD@=iWK-VZQB=f++gpICu9w;*UAO96IpP};W`fLg(@hF_v<{`UQC_}gT;piTg7 zN_H{auTH<571C5d6FbxdNfYsvJ7w~qfu%L9+Nfd;t2M*4iq?{KWl(a-TxIb0lBlDf z#OfqCs}uTWYQO{KX5{7o{e9$H!e_m<#p+7#(zIj9wu#Hw%wmjUO>CPUe7w&w9EZ&42;!|AhY~;S&aqlL{=lTr zTU9ny$+*#5V>-F%h`WuSF5&E+n;Kqnm~jA2a!I3LZW{Wb$O)QRO4FFf z#@cb`N$1U_+kH0CNwCs+GM8D7WZ8JzuJ@(3BUU!`v`U!_D5aE(QkQaYr1Bh2|T7`*a&3b-Ixs7GmdI_(5+j;!B zTF7}aXARXN-;#!l>{5ADr7laQDXDUl?0XJ*`<(HjVF0{w2(8&%Ij4EKgpd)Up% zTj$_ObL7gs98Xy-gK#_qD$k$|ks=I2(4ak|DEAph4xQ;ocK5YYyM%G1jbYx-8KMHs z_~2Vzw&UJwHrRUWYxeN!!I!KOPgz*^(iydnQ=^Y60K}{)B4(_F^8YaGbhKiz)8K*Wiq>oZyAf8)4FHS zf^Y6Zn5}*0E{Dux_P1u&Ysvy&IY;h-^4~$Hc3qSAoa5IVyskcrzm*RhHj0GqKZEqlMq7ZlK%^}eJ7aB6F`bohCf?%TDW*2()RA2{1>%gGF07l) za0bf})yr2peR$;HjNla+nFGO+8<|aDj^!1+DVuBNi^<<>X6uS^Eo+^(ZH9&|%`qo{ zW!RWPduShkfCapEf-rixGI`z)?H8f*t-RnDP}$b|j4fvuvLoCnj!>0w*HQ5GS@*i~%j| zfB`2m$N^z^m){!zeAj0c{-zJ&GK35$RG$FMA9y7n5~~1@P5^h2pG8@KG&=x_B8-V0 zw8S1KwvR6#BQhTWiU9n%&#NA}(SXaipKKMtuFumQR<$2WJnX0*W?rALxZhhmfP(?q zwAa}ku(X#X9b%@Je(wYUo|phFv=1RXAdjDU6PhoSB0PAb0NWW5ngYN%RG&ed%YwM3 zI7FMAb?*?XO)^sgxlI~N0=RP^ptz*rtb2^|v4+n7AFC3Nu=&P0gAgjaT z>nC4Ut^4iEiD|Xo_%{*)0RF~$AouLfF34;gF&BpICAB9Wo&}x-r>komu958~E-tPr zug-SW#JIl+He;@X?}GiR{KH_;eWtK*;l!dXkmH)bz4(U@1PnY-Nkt45g(Ay~vOr40dCPI?`VD1%ecW7$n7 zoN*SKTXTA*zFDd(UzcMdLRM@XCF?~VLvqG`t?49Hr~Hs>FNaE4N&S3c1|CjK-zE%->7o`kpRUf7L2 zO3ND7v2>X3e&1YnkQPGmBxDLvLzOV z(h8t}U{XUWFzZ)D>f$7Q_ZD8RQdKnhqe?A-0A9@6U}pCu~PASe_wrgwNUKk0bDr3?j8|uezfuJeup2( zn?)|1Ve7&eQ=td`wJdmjKN3X0peR)8n&(?#)2^BEY8YmecDQx)kwVH5QQ$J9N)4iA zE1^KLvq01k1nO^$Bt3-~Xk?ZMyhfB(YSFGXdk7aRJcSU1iQwQOg33gVAy8l~N+pXd z#av*)Ak~N~LzPHE1*TpTK-9>jje?X@@xbF%rG2)j_OWBhsxj3&(oD4~7zo5jArZil z#Kv&!3k5yGDlFDW?Hh<5V%R8f)`&GvC9udm!B7uz_M8kH=TD*GA{S7IkD#cO+(bPp zH@(}}SM4h`m5`(=NWzM!yiO0LuuQelPnThoBHn?EDF2evP%Jn=t3V*n=DCQg8|SF+ zu`lVA&%-=yC0HCy+M7Thcb=J8*qWghOe51z${_wQL9WUE4Y+41)r$KjS7R=sAm5?WWPzd*li; zmD=W1%DEk5pe0_HwOo*Qi^;-z5?Ee?%2nLWv`;LVnrpIMr32WAW)p>=EW*TBCZRMB z_BW&2vf5e&v=}CRa;2T{^#90Fg>%n`QldV2%(AD!7Kpo7kc` z(h0jm+(u;Jif4w>Wn5F=4zt(Y-dQMQ!*QESt>Jt=7$3S0MYW3}sd8T)`_xhviDMSH z<7|yT1cA}t59{v=)Y$3{l}d)#lwVy4Nm10v*rjY>I4qOy5mV< z!E>w@^>9b0TYS6cx8VTj9~nSYS^7z!75)#cCnYXEJ(B1_Nl;iphPigMymub;SfrqDv8VEkV^aQc#GQfe7 zXP)T+pw3Wn(J#uny{*|V32l1Tp;7lb_-X!d8XRJgghxFX6Sw+W5OfYVuok(ozd>x} zO&*;nnYx7Y9+7(gRh^qNGgX;JDubJo0J^qVe4qYj@THTfHWPeC4qtIn!?x9+ zI#)$Lmoks3C8ODBlYKUzdEW?kl7v=B`Nf&RQJjFzxItTb%iV{-6R(J`;6zL z%#u}!3#9N~s*Eg?yUPxZ6t+0x4=S}|vck5m zL>OkeVnSKW{nO&9zx^W%;0WXzTE}E6)DgZ`PG|VG`6^S+XscP6Vmr~fOoc_*W>xjX zx1KZdmmHc0SmrQdx*lx4j5yQDWg4p|VJj^;hjp6Q&=uLRn7ta`Z=i&z+3zmtDRc#f zGov4ICf_&+$_j>!S>;ZsHxzc{J*;UO_)49@?G71{x;xsFPJ*9%z6l(hKLpM7Ese*% zQ=eJy)dkq`d(a(N6=^Pj^*&cw`3q)&r?$2nUJ0a^aXy9F+EgE2%%}6Bh&QeD;hv`$ z$MTF8$HK_fLJIgo?%~=64PYSa16Ubq0W2mFBu4>(n3DWa=+-hRcL0{T4#?v};44nf z!)u9CYBZW-CPgt2`D*p%a}frB9J8wHUpDVS(723CxOAcAdgLZE{$pC#^ zRde1M*#j9bDwzmhV;4X42`j}fE-lHF>YHz&HknwNr#yaGg2fv(yFxm`yx?C*^LNLKk74A{ke)KgFsUW= zSX!x_g=o>wVBpY*5R`%)sTa;Zb zNQ5Hw$H)b}ksIx)omuD%v8wJ^v=^Qpx5(;H9J>(* zt%&H%$#63m3U68qGj3Whv!Gm<{lpw0dHT@nBz&y4w0C!MIb65lXPcKQLIiCJqG}p5Pe(?J>FvIE z(>2$J5haX~0lYAex7)^l`6rI0dPvOX-(vXT90xCIRAH1?GuqO-B_9AKC&PG#HA5XU z_URaef^acEpLme#Bmp!?EUw0$r^B&C&@dV1$s$U&A)XI+#L%s#vIu#UmICunPZ=Q6 z7Pc<1wK-!Nj&)#8XbKaNb^~dkCcHzDM?jg!IXnXV=4jU!+7v zdVCj5F?rzpIR4mr?_j&*RgDj%WI&CWy9>LQ!RgPU3r?9K35}AooBJ48b3;{gB2HU@HlrbI9oN_*$ z$c9&ILx}Bxc3uB={g>NQrf6Kogs%T+^22e$M~WX9PoPPfF6kBXkGf*u5b)d3)f_$~ zBRcU%CK4gTn&}iIRH_MDKju*@Z z1MvM2Vht0bRjpQWJSk!&C31z-KTj$&3tAij@;nNqcHt#zd62{*~V8_f^t+| znB`d5Lq;^M+-}nJBrD6cOa{5&{dvMp$oy#jK@KD2`V@6>FPXwKUg^EbcDez)aHAy> zAeehAvb{o@G$g*75|Y&CfZuimmJ83tHlm{yA^qJ6V}`A7Guhv82ZjM6w02V%d)`{c z@lrI^p7CbsK(~mFh1-vct? zYpzxYwByST`755!NNYJ#XEa9p<9TUvl9ve*Rs;fd7YFya9<_A zpCK~W8%{M)&u=`9oUcxxJJV{|?xXKxT@9PDx;OA|qyIu2te4$*A-PE(qJ&cSwHFi> zvk7UXtrV=>s5^5OE=x?Sdi^BoCJ_6F83=ON47{2jPm}GRiS>lhhI3S=@slBBDG)!u zpdGwM^o~t5Tk^G-ETjtjvxT)|*NO%MseHm7&K6XiTZO_oQHb@`}g*O!C_pQ0#fgT@c4}(TF+i>xI_Z{e+llL-@j_iqa z*}pZ@500Y?Vs)uBCwemZ5)>lPPvSz}{eC{Ab7FdLSr7bxy+0a9!aA44)U$k8bL9yX z@Ww=vi?b=>rgb^ZFM{H1g$P&_EsIAY~2{`dl#w`ZXOafa;rqxV%4lE>wp z=dfMZ$tErbE!>X(D92WhM1397B3HcH6&bzAvpawB_p=xilVRHqgk!=&3=&+DfmshR zqh@up78R^0G=02}&3b&?*M)W-QEc1)45OY_==}rod5T()K8HcP-2J@G%L?9dh2JA& zEMGRC|AJ7;41t+|Ly6abbQC@)B3>P-E||$88cM=cjo~c-&TZ*YuRvkT_^doTg#|EG zmo0H>bCw(iDD{QBLb4hZIH*)cF4$tZgWPzlJj;IL8hN`7C&_V`tmAw}icc~``HtXs z_-2s;k1f``e8@b^`+B=tozdyX_3EQdAOIcu<_W!J)0m*zgH$1UH8M(M5I-4D0U|y= zpDC)j`YSFB0<_)|kccMaTej-~3NK@Uh%!fFYzbk3_?g{hZ>S?W`BR2Bc5@CfHXKi& zBvog?G#$RL!t@vi4v16Mi=B#o6(L$84VpgN<7dTtPANyN>-??dx+s+QRCp@0qxn!6 ziS)GGZ4wtd-^t1TLI85gi(n${NbrrN*m)2)%{tdgGUiNyXT4#@v6IA~cY@p0l^L+r zPU8FC8t`~NKPTz6W5@w6t z%JTVu4Ttk@&mUw?1ICWo3rBa;b#0$}7<`m^p1g9aeaz|f`Nc5aO7qBwt{QD6>Pk)dEPg^$-d>qOo=oC*I_AEF zt}c+dG|hl5U{?olJoVqoT(>$ab++PQ?Z+6q=-+e)Hg#`1iWe(tD`j_LdCm)0ZtJg< z6z2=x-*NB40qlYYET@cX57_H6d;PZpb{mH_4~1o$y7slG%(?xyA(r)3Yr zi?Dxt1d(y!+u~@kha2x4&bxiKw7~qP`Tc4g5p5yfoxvXs=}WlPE@78L7$m@XsGkx& zM3i-iVM(WRdy7cF$l1%+BSflFTO_%8WIr-wDb`|2jCRykqVym2rn_>ZyO3{G=gb5{ zgYHcAYNC8@9Q3Fi^xhT!8~-h)eYetFc`7>D^IBNY6YAPKZmnvwJzM#r*x23Tbu}Pw zxUB14{iXtRi1-e^c<$^L~L3x1tGEIyVi|AO2_>J3HDQ}hwFgZM4E$Sh-+;rUIBK%oHG_RY8-7v9=VA6h@YE!-m|%7v zew5DmToWR*OQ&SD5FQ?V%l^Q%FYTLtjyaWN&CQ-$E|!{7<%es?x?E!32+s~AE%+w? zz*=Fc1X^UXZ?H3>Yx`7*3NsKUN6&T|Hy|K z*rr~WqoC$%4}h3BsRv)_m`VSW5I*#_$A9H7vwV2*e%gM^#7eVP7;M|KdcN#-We*dX zOWmh$X~xM=+s$u9v)y!k%=L=3?I@s-vQ&+b7~>)CsOvJdGqF>Qq|{LHOeFEitPzZm z0-AP&IbYTZ(r&_6eF~B4<2{{lXUil0BoSCUJ9||e3A4n#IfM1CQq~ROoKR-X;k2T% z%`4D5G55}LJf4MumPf7*pOt;D*-_SB2CN_-fRP!A_&Y)aRi-> zXF{|fOPml==I!D*Aq`jO^ze*;2&4ygKF?Dj)J#ojkQT6+wg{Olr%EddxZ%lfl-N93+NSkrW9lqI}nsto5pis4#R0gev{x zG5F`x1ArbJ0z8uLgsvJU*7wVvQhyC$p7^$!i&IoW0TEyI4)SL=^?lY&gpgD+@z!tm z=m$|)LmG0Qz9!HEH1(KNS~mFF51>kU6(Lk)S^2Y%B`b*N1=K3L#Y=YRqq5wKR(Bzjk4NTzzck{gl_Rc;k{ zCElpm3e0-Zk^59=&dGFSjBtUSx8?xLLt}swJ@F-6i86%N-(b-vV;*3q)a+R&0+i}T z5`s~j=wn+<3h`p!n{Gy|idP@Y@BVRtKtRHFzf_?~X+K<$TIBBu@=s zY`RV32#h)=x_RmQxTJ0>XSC~iz78XS3$oP5Y|!10o3~}&vW6iOGS4SlY!*Id`b`*o zdhvXlgzJfXQV%L4qXmex2uat(HIpIFSCVY)U{GL%oIZWk?eVlb1XCe-Fp%I{gV%GW zi$0^Ll%juwg>Nl6xMXjx=mifKogjt;niilYi8ze_(rreE<7YEKs2HU^Dx`9lYMCS8 zx27zYo&i1fA;?0V%O%5iE^tH@1mS~aY4Ez_0jccy5k;&1gcRF-1XX@{(n8xr&}gB4 zDHHPzVrdzi>G+L?ni)pdT|}f?xT|(CDFNLFofeDL$IT=O4ytAaFVw9 zVjX&#_{#Bl8u848X$7*V+VX`cIUe?t3#mkSNe^Ce#uh9nG-BTFL-_LLoW_IUIKWI` z0onSU9LqQu3G0d#CJXvzwspA21xFuai_4SbvLcR=J%k$uf1|FAgM*8!P4b|4Hv>d% ztjh#T&G{4wij(~*I)*1}d=UN)m>d$j=qd(QL(3H!SJFD8nF-5oL$F@(N@fGd8Ch!y?NS&At#&ZlqmM}&|h8ACwXmb(|2yN8kof^kUSbmwWx zZHVT(6Ed=xtn8kx>!$P*1zI|LM2oTcy%yV&&c7Tt6%0f-py#wSi*6s9x!wq<%JwSM zKkN>Au%P1~1%ELICo1QBmDX(QQ=h;WLlMHPmGgjYUJLA3eM!#z>f71OT+ZXhzNns% z8sb)kL?I<3bolgh?q@fqT*-c9m82y%Tx^u>)zl87s3mbIi5Tu!Ix`75)kou%9`Nep zh`edUhV-G!N}ASrY6q?YiWQeZogwD)k9=}k?~JBEbG^$-ZB1lV)cIqn%tB>($5I61 z5+Fq#910Y0WqI59=+f8J=|yR)+V#JW*hreS+GM`xN+XZ4za?U6ddZ2TA}+>e8@V>S zqNE%wtqNY0F;Gsq+4Tm!7Q_HaJf~MsmqeSa%5iG@PohnD^sEudYC$1V2(}0s!JgTl z^s2k9E%TZhz-2Nx$rH3EniDnJaNpDM>8e(+zPE|*YK{|DZ7JGxBWt+d;{QHjs`*sI zDE-N0R;TpQb7PnNN`4qsVk!nK$x;=@dYoyHiGLQ=Lxl%tCB2T+-a_`glcf^2q5tIp z>e0rBPPgkh)Yxe*t5s8RUl)=y#Q6+O3Fbp3+`1DX;GuhW38bEg)2GGO>;dE?hpU67 zs2VbZzxN10Hg}3yFn+>Byqj}=nJpAU?Lb30OWeK8EBe6`@n){&c|;ue7-Nn2~$+l&beb8wtfeL^s?;AL}$Dsi#sVDVNx_$dnLR|R~gms6( zRL`78!ZEUhAr%s6uNmzi-ZQb_?1igh;aCSPAtOVmj8^siEU2h4p zmw-saKkZs|&oa*l5TE(Fjm9S>a1lwYu^*bsUANiJmR*1ZXpPlBW#M5GKQ#n-a2 z87ryXlT~Q#WnHAyxf}=3bA;`a+$wKT{+AwhD;5y1UPep7fST>|1K>x$F1@e%O;TuO zRqjl|6vk<*QKDA- z#nlr_N968@+!H%RtHWP;XepIMi0mfqm7mUcwr`xL8~BZ_$WW^9zVC0-?>}3Tp=t+` ztz|Qzo<0Nb&vU>}=vcgJKe-e5=Lab#_lnyu3-xZ<=LbG74=umv(o^@0<-PIiS=@WD zJ|q~|vQkP9*TnuvYsb%5UFlhW%GHJEiD<&IM6_gIjhr4EjGDqH&^>H{wUKu!Ee8z*8#(5f?+U~Q6m#PSk5swxOp&_)2|@j+t>Tc zgJ}*O%33fCZ4Pf0DVX`BMPJRMlPedzJN!Ln2JV&&gjE%gO3^_o#KD%p-o;J;~6aVBB;P+yM)C%rg?AF5S(p59K>0RUXR$WDY7C83;iiM&$9F zkDC5xP8Bn<#ZI4J`NaT+&|rP;pKGKlMUvgzd;yWvs=!A%f9EgGH$kCN*Cn@lo5N_L zuVQnIE56j=N*d~$BE4P!(c;Qg-J*jz&W|2_Zr;Hm1Mb4h;Bw4K3QyhzCd*-?1Vzew z40r9ve1q)oU`(eCYTL=rSA0xsX+OA!Q<>n0h127?B!&1a1s1%>WIUob9uU97a%|i` z(I0;3jh#{KS1hA1U3MhX9k9bA`5qU>!_1iSL>a36z5@));;FPhZ{WWjeOSgVSa7dS zw+4?8o;dd;%!H}N>u-3T3>nsSo(oT}KP|`AHE^ZX06U+&LpNi1eIB@sz%7cB zTgYfwE|GLd`vgA{*#!(nHE7Wy%SS++8CMw>s_yApp{iWGuPr@(7$FmyK|;Qd3*B(< zT0L^|)QbYlvuwHiVhXvGsTIrEQ?YoOFbxmFxmtXMr>W0hdxRx#uA$9t(;@fpjbz#r zDYwN!H`e&~X1M2*oQ_}*__Jny0w2-0{X&}_jj@tCo!#Nf>7@h+nY%4=FeUqCH3}Eb z+$_Q}vhrLqPcqw?Hgz6Zr|!nn-v}wQH}MbpsWJ2n2TE{FLt+h4$QXM&Z@BhI2=2;n z??vhF1d*Ks@x^>~NIWMb;8Dtlp*a9W0kBLTMKMg!16_uvm!bCFTu2PbUb{}n=YPH- zrzH-kjPQKF2l)Ctj3~zcRkHb&W%Z}(S}|II$3xTw3~x`gqgam z4TB{%IK5df8W{LZj-hJAKG^V5ZacGXDA*RJFwxDqGI7tWqHY*$!~2Ce z^cO!w=x*?nmWbljb!j*eB8Cg;oHaZty3(o5n2w_Lf}{Wxq>Pp#I8$vcGZ|0A0f?8< zb!6jgeaM6opO+~GU-t#%;N7ahoXtQoU<2+$b~Y>tQ>cn*{IdWMM|*_&#L<)vm*A6z zT|yIrTP29CFU(-ai4rxIhz|nKnbw*TV^8hZ}Nlk+TmAc4Yi?HDks+ApI)0z znEDVjAy3|JwD|Uef2*7KJs+K@zw&`_Y0)6Me(gA+*ae@N_Y>grNfSGLso*y6Wo-aS zTUAUC4r$aePXs1;j4sS(ZCvOusGU2!32Nx0^g(#_n?{p^sL|e9{2x)|VZCo@Vkv%;9wPX&*pej?h}a zfH@#oQ*|1?V20)fk8#8Dy^P~hI9=0qEu2=6%X7Ivhh(7&xe#79YZm*>+(sQb%qp6B zP7eeuuKwh3E-+MpAx0WEgkN;ZyyIgS`|)8E>#qen6dHyXtsD5es59t5LRIeijx#!y zI#piywDSdeR7|c=`kTukXItTp1RM|9gQWtxtZF;@$G)Pw%IXrC2ZWSDSoS`$Gisn1 z-@WY%34gf7R@lBXiSmp3$fb~oIi|Eij?PcChXl7$(hZ8AZ@J}tEK!q)(UvEA-@Z6c z%=_Ks(+JEa&~@J8+Xogdr_)eO0ciu^oX?P z{Y`53RUBr||4X@}1NM(&j3pu_%(Fc40@DuE4se) zp)fP2fq}L)gB2U&)d)5`I>xs183ivxRK28xY<{FO`odX?cb2~H^=IuQ=hfW~Jq|yU z(mnBtV!Dd9<)PLa(xJ~i>bKvLj}kg5DY%d0UO$_!W(v8~K~iXKN%ZUDvnF8qKv1eQ zjU`3SpR^GQ&~sODdDrr(!)Y=RqUdL12hVo*g%4ZH^Pm#v(#v9S9FE*&sMEg7$=69x zrNhbBewk3jE@mYdaxsx48^&M{XGiab=E zjDuFl{?o6#PQPRx-^QoiJ}r2>P0gIV9`hvgRa;e-Z>SCTv-7I7)dM|v+Y*c1P>?LD z(gIVR4FoS6v(?|0j;w0N!t~*D#ubuEOYDoYzD;q2KN$fD*m29z(y3UCvCB+TYYFoy z#gVBmig!rPPCei2$)D%d2!A&##T4)B{r~bI|5q_LSS#Yy=*mb17O&Mb?PHWL`%`A2v zUs941%a#(&P$(zlA84qY8_#dxDw5Dh{$W15iZI+Tr7#7ay8>q6G5%_u%8KYHDQ2Re zD5yt{;re6qt8*5*D&e$%gDR#}@YH0!=1tZVBXQKBoo|HJRPb(>408{XsO3%EY<)I? z2_5NP92|s`AHo)AIOHiQ=ot7+c&mR8Rzi-gxs$+x2NU=?I8 z9K%A(mxL_@ZY+kkO&H{f5w(@K)3d^$F9XCVy@{NkFhC9-Nfq#kAmfG^olLY{Rk`au zmQmT5jRWf9|KvmKdoW56rhT(uXSKtiiG6#eURb5IJISi=-2VM2@45(md-phzB8oLV zk}-e!t*|?tW5vpmvtIQ?*R1q}w(x@38^x>hyS~eENb=k(IXD(#rtzTjL-*ykLp^tE z1cG0u*>gM6AdQ?l(rnqu^F;`s_G{^SO^6_n?`72d!H6-kphSujOC_=H#eeF7lR7xx zr`2lNY*fo6Gb3z5Zn`Bm2&8w^0?^x(IkgDek1_@}{h$+({juRWi*B*uH+1UqVBAc- zT(vGL4L{YZnXx(v)d2jW%>DxP<7$Uqo|^WJ?ooK0!Olo9kK~i$ovw#{LIURn!l|3N zt!u|~?7=g_9dUSSsx%ys|50wLL|AnAILjrtmhrmeBm%ukL^sMCY~eMx*uf^Y+Y)B? z9~krQssODl61Ao|;Tcbm2H8+(lfTWZ zinh^_i~BlthJFWhCzJO`q}zBtAwm&wmOd4dN9U;ZDk^22oCbOTIj6Dux$p5`Tb40& z{Yh8d1S#z6R2gzzpu-pvf`EN4+)j25I&QGyyDY?o&)%m~=ga$sI0c?_fFD7=cotXp zvl(mnCzt0uzm06YQV3hZD%%sD*yS0!-!<2z^e7{uNcy_m<7t2~;5)KTAhdqUk(Wjy zUJ8P#e<#J%E71(%uouy@nm1Pm?!z9+Q4xCzj+@ovV=q2$^?2(jljRuIcS$dNw@NC0 zaUm*rg}KOf;Ce!P$wXK7Om-v-(PSgd%}6B!A^gOZS^40wR>k0Obz}iO&EM={LM^&O~##Nj?*1_FN^#d4Zja2U&jQcgMS`Lg{qMxc zpMtPIx?~+UrwS30&<@$&&nISlGd+Ml37V7ynpS>eUo3OhFu_|9Mkn%u~wi)0%F5%M;2`krk8M@z1NmEGkyxxt<8@CiC%bOUv+r z`DAYcK-DJ{m~PtOcmaf@V)WS=>IJgxbZZ1r3<3W9v$pcFRzwPMFZSLL;)@vsRmjAt zva`XJ8m_kTL$=WrhIYf1C}EzXjb22LZN8!USC}d}74yKRQ(V;$Rd#{1z#+n6=@u+B z7n@7T7v`w5H2kL%qyH-kG!xOTygJqs+DM^_UN5ercGtGqVb8 z-mKl!oJ28Z<&BiHSgpB+QPN44^{yo8586FXKpV;VaA27cNiu91mw4VcACCgXM`~`ca z8(NRIq%Ka_8r>8y(phu)QPaA|Gv@5Cp|zQNqS--_eucgAMa}-i3E|H)@W{WNIbjO;yYz9}`3{fuI7<__vR;I0wjFowC;Rs?5oR*eGT$V@(oF@f- z4(oDt9EOUHva7?7snmb8XtkAa9>EKnmVMVbjwx8IZKkyUdWgp5hD#8x2{fL_*7AKh zrLPSLCX~YsZ4vtSq%`7(dqv#t?H<8fs<$JU&b2Mb+&|E%1y+`O+wmP zMZ`keOu$WVmqQ^o$K`%6zzjx)RkV6RE3LDFpQ(` zBn$QG2CZ836$7eG<4;X0WS0&!D6KS-5w&>s9GT~itV~GbxVa8T7MFp{)Ld4`sJG;3 z`gZ~sJ(NjgFXA;0i!Qhp>_5f4dl!IY4?5(IX<^2x`a?-n^PTb%7Z0RzJ!YDR;uwj-OO?BG4!Sk(y2^cm!Uj-|~pwe9pax zz5YQD;P3HFE;xZVi+cb>{r-Z8eS6GC!DXbA(RXIOaDhQRwAC2cxbsjg@_y1X(=o|E zTs?oOFR5$iQS5!B@rUQLnniP`wa+4ED){mQ$+aV>+IgoKOZ5 z&xfo7=xR_Ypc9EJNaP0Psl~EEa8!vQCPi>!G+`>kje~=2OQ232gpfj77bl0w?Q!NU z%@Xo9iJ(;3)B5qcSnv!)zu9d6op{4t;d5MQ%|Qfu0k+B$YT&KZ9_pb+$=SBVPVnee0nt_WrOx_k-FistZf@2sWAeNSq~HE^Qk_X&h;B7AC5Hpj z-LVdn-J`pyK`ti=GlVjq&*cP{QQ?{Fq>5Jax>B=)kJ3F&K zx?0LZB3cNRi{j1ctAxG`P`aZ?j>;nLzzX<9od^dW5LiV`KcMd2!ZShao_LZbzy;sN zW&(0+q2FiC4aGj1j~u0A51^C% zno9m_J>hKxp`d^8RcHi4=u&~9*Idz4~C}En| zMC6?H2TVZU!*ZTd|H*9X`fK$qA#}NBco)SNoo+5?Qt_ZsWQ5p0Zs<5|PNE!ksnODC z|CO)4GB)htvaud3~+D;C~QK+?bdcygdR|99%1 z$;N?$Tc`F%Bw^vm_^>@+jY0qY6!40#PP?JIun-E@bc&bwcFp`xv>Y6@GI=+B`370PcQcsgArIMKDU z)~tjKyAadBkS0(F4EV(;@gY@B?n&N~!qf;Gmh*X;T*k08k5jk63sr5uyGye;YaddT zRO;qbG)B{)d>+y7Vo``pDe4|}o6x`b6i(NUAkm42jt^)}#&D0iiMm68NRQ^AN8txF z0JSWwO)a%7=Di0g&xQpbd=0U?fhjKrozSfIlU^Pj3QSv(n0=Vo=U{LIXwFB7457!Q zKfPee&QUf3nWj`Ia<&qfEbPP=#>UY2*9%AT`TVC6twbCp-eC|C#Z$zP?x!LVs~Y)6 zy1tlth{irNaYt<8^%LJN6bdiS|EWhrEfe?Ydcx4}gY?R0?9oUh@~zB)M*6g2By{8S zgg=gJlwX*lXV1Nih&+&Y{zy5q%vuLK1Zbc?wmJ+3!?oT+EZmk>ML`sQXc$i!2xz1B zPXqRY)xMjWz(s}#DU4%=@hiwb3sgsb4c+CR#c=%=sHEozhcuzirBZ~ps+cMRR_TVe zftL&E5V8AhMbq9Da-YvWEuZ~`zt4_xo4Nhm z72GY{J2|e&AX9+ICp%pQCvmFuR z;pD)f?BD1Z2#^-HTUIg|w^dn|bgWpms7OeFfb1#CCS5`wc|Jk=4Y z@qDB5{*<9rdWplM#o1k@Z8q$3V*=oa*3d#M9knh`91+n*uR>aYnE_d@@2lhxd6_^; zHXXA(F|%wK>*BqDuSDT4)dh6c?LbUmVExX-jP3SM7Fr8xb0{~pFck_Nx$6iz5n8+< zEvnW0)Koq+G^-0ojx4OUH_#jN&prc73hTMCfc6o44wC;2pG2QtU0p>h#OdR=E-$YJ ze_UX{IJjTRW4Np{g?0d05<%>VrNGau&k;PcN%jletl%?tE@#7UHPdKh;D>hmo@-!( ze5ab$E>%@@9G+V)uV03iXpH7F&L9~jNwO=~jW5%Y zAjS>IkEP7IHAw0nKM?|cA2+TeHVI^kD6UYxsY~_#%cLjQjaYrQTx`GsD0Z$CYQS=V z!E+NlH7)SVHR9T>QYKSs{VO#RhL*wGDxno-rNA*!%XHeOGo{s1=4patEFFX7XIhyO zwVT9UjyAy-rn8gsK>m6N@usHUDcka$s)o1}c)^$QZ7p%j@Qq4!kn&y10p;86?nleL z-;lYoh7QwmqFv%+El7pV3xDjNqro?S$i86;HVoqkKG_kjW0=NbYhZnEMvKur{Cej- z%=-R0k2qq?;VfPM=GkXZ9i8-bxI$*NN`cTU%4+xr913~j@-9QnbhJx_wAUq&; z@TJ56%&V!~DPnnYM8~ry$8av44{3Vt44S2Npr>J-{`Nv2oaubfy$gPT+PawQfk8l0 z42m<`h2|VCO!7tl_|L~Fu#5{9kN#c2tbeeOe+}GirAKU~FzL*6S5pg$IP<%fuvR}cy68wa%QCTP7L@59w5BEC7 z!5+qP^ud zehT;`kf%hue7n*!2`tET0#Jt;28ke4wJdxZTZSb}zFN0X4q56c2#lg!(r7Ufufr|B%!Hb=ZxH{9|fn`^b&Qa7gSa7<=^$$w2y88)gNArtF3 zwMk5^tQA;9nO^(C&I1RLM9>VznXZ(#vx`OM8hi^GO1jZZi3Ut=MbWKDOdYDaf+41w zvl+!e@poJW#MxEvX#Y(lYTHx!)TkmEDNho0to{KYU|F*`h5|)J2>E%Z$H*ocsZ?yBI^$J4!EnuWP#q2ZZa)dy94P^-a=y6H` z)~K=FGLV1^I5>O!0@Xt{xg0rr^avk|s{N8xBFr)z7vM-OUYwnV9&L6+rPH`L!rl8Zgc?P&X3E3`W8NCnh8bwDeW{=!rnZxBLAJ z?Upak?N2-H-*(ciTGY!=<`XeP&u#_;0%eD-AqAd_Q>!`DlQW02%slunY0tl(zpydk zq|?sC^a15!X}}@!1kQkT2`^|GLX*Y5(jt-1V-E&S3 zJqp<9Ube&eN1gsL+#FLpB8QF47VNgJE(hxlJcwvCSp}UNMZS6{l++eT5#&udS>xq38B8)km)7d|LYiTFK>>&T?)REoa-Gg{=y_K3{GPJp%JZ zA~Hn@$gb`-6CIXSlU?;R*98r6mz)^>e73yuZZ&4LSFD(d_(;@UoQIV^zvxCIJVCr} z(hRbm4GjsA1#9}44>5&lG_#|jF=Pm4~G88ve9RFVze z5J9yyVgU=CY#cby$jw)wVd-)?(dP07bhf}RMnoyCwC1Z%X%@`1>O9J=lxNHBm0S`d zZ$PC-p}4b7GSp5Zvq%4OK<0@&!WJe`8orD^4&5yjyW;M!_jUx}JrZB1=jh${UE%mf zrQT8ArQd`Vd(m3EMQp(zqT)1%h(UNJzW(t*puII4mW|iavMZ-$nLWl`*FXS_7AYUg z(%Sc<981>@zKJ>z=gyyqoEGJ$d1+k{gD>eA} zkM}-*dg8mG&y@M6yVOOO7BpeD5gzJ3vZ}h;3H5WXEa|x~Q*12f=<>^*A?we!iQ)on znN7`V(P}dVgut6a{sL{UZnQE_^{1y^F3ek=Vt5))43W7|!Fr>Jixqg(8fxdrybHWBqxgG?v_B3JA&dpd_{<4cTmQgb22+bX7-aqesm%~m5yH= za9xSKTnk#+R6j+*=;aKUE>Gp}OjfjECh~WR%Ex{EPOLth5_hYZo@<4j9@(pUuhlqG zFHDE87`n{YAH&XQ&Xxl`6-M}+*wD@pI?+v$-KFBCrA{R}-k!Q_K*v6tj(-n_wAH8S z-$R)FqF3Rc=aSqIdJtU=6!b`7>3|~WT_hg&Anq)_a^@sM%a@m#dc;ZmX^i{gzJ8M7 z;Si>nJiN}(q&>0yb!e_Pl%H^$JtPK;_nuE3{^)tu0rs_L(0M=~vO27{+CMi_2`gv# z@y(Atul(1ZM@`q&q5qx$Qn0td88Uvy|6Cmq84K^@F#; zP|>>-4ndz(yShGoqq4yOp!Ie1_3AvfqBH7g1F?yoiq7Vc^HHscvHMUa$q|dd_^ypC%+^)0%SJ*%L zcAz8%w**oqY@FqEn@g8f{I9OL&5EH%+ZXs@_IDZA zCd{{uY{UuboZ5w8&j;DHh-(37h?LdN`R8vezgAy zfz8cMn1JwSd&ziND{l740=u^-U0xrvM#EY6>4hUy9;%#ft&i!i6Ixenm(g8cU#HMZ zQm1a=OTHLwUkm~5&srZE)4^XuJm;a{thS>M?w?ErIy<=_6xbEbBQtRGe{j7g*fCv(N)9v`ka{n0-oO?hCPX(E_vFi$XF`of9#4hTsTpea^23EAXb z_i^uEZ_6%x|5x(``lVkXed!!&c)KgJoo!#mD6Zvad9+VIkC#BrJw;C3{pcQZeCux* z3;!K_-tjO$0(<MsUVIW&p2IeOf>`FS&)|lP<8vkA%9TdB5-+ouW_-?z zC%i@iJWYsc%>6{2iNN3A+tiZ(OH)0T{E?L3dn{f1$3nG;E~pfXWn+7}=rkv@)x5r= zTr8DxqZ!2WQDGPSzTg}DFC_X5{+qf{{D(y$vd4Vu-l)7NtGjr2moDu^@jX#-kAPWl zQB3Y}<-KAcn?z_TV$W+htmhlTZlqrM{W#*8Wg7h3zs*pLM=^RepaM?>9KsE(eSO}) zMu^-EMDCpa9RDWtMc<|+Csl~;0VoO!azzf*P>8U50!u7h@#8S^wi)6{!62@9yP}@b zv{R}wrm9z738YE3;~k@~S~0;u-!cSvv`39wROQX8`esF)RF$PAMV;#SCg~f$KfVj= z@%Onj(O+@sB%qcp2%C7WT=C`Pa3Cs&<@mHq@5`y2JZ)s_7jDnjih5kkZaSDXPAj)k z6Fk4}IKNKp?hvCpFB0P;d#1)OO(~Xf#USA+E^ttSm@dbUNbUKyMJoH&(3N|E9%cM@1CW7;nH6Eic(KC%cdoztF zt}`ZbzulR5v3pigO4QMK!rj85JFFU$sB^n@oUr1Wb4@=gFbo!m@WcY! zWGjP76gMYw*%@1tyzJD%)KDrlL?6jb$>bo`QJS2zx4%tEY>&GC!N~1edQ=%r+m6gj zilnF`DRR!98O4v|(TwjsrOUjat7cN6QB#y@*?tRspk{E%t3c)b$UV?raBomY;E#zv zF;OVbx1AZXqscCJb!1{hgwcic%)F+m6GX~yf*OgNh>vcKPbi9A-6;A8u;$u(*}_CX z6^$y8=xa49_t<8>Rg-%+Dl2yxdELa5$$qSV%4 zM{-1uWfG8sU>E=L!pqX7QX1$3%`%4^CzBXYWeN$|QN|QO-mzzMwYs^A)~;yfrZa9_ zm+AF?i9*KEBk@Qg>!l%89#UV~e%r{Vk&#US9?z}OyHLyIw6ym`s!#hNsEF&jieV@x z6oWqR2WM{U=;+qbuZfWP4P^xt5xOSBN-R`#dMlpqjk*E z2r#y^1J#smLz582616i-peW$g&dJZS*D6zCr&VR zubXei{o(K##0qO${yEwv{Quszjao(|YM!HMY;R=p?`g6(GBK@uM}UQFjwNVC6aC-2 zPZ>u0y{@%vS%|Z$)~eP1;_H@PvFoFE6H8#r5ChQ=Tb;grX=k7lOzCcFONd<$Pwhnk zGEg9vn;QN-<}x{SAW~w)JYCI8KxD%|RU>C;+tChG!*YFQj>nn7fwVgvjmD5D2*&Kh zWO}%m$qc(LAZ|{qbs|^Eri;VX&6`~}>Wru}?=NRE#o<)3Xd1GJV$oY^`*P0 z@ZxCwLQ%e8zD5L~__P0c_S5vf`64;{l?c=gu96QlKe0C#s!nA6nk3bws9w{9=J2i8uf-!?!lHMvT#A-I{-dQiCYYX#axZ z>Y_1j7{hLs5GCYCP4}`hb6PId;PPcfi2PkK&W;O%{%JNwc}rqO#^#!3s_IvtZFVj- z{9|$_-Gf?nXoOx*G%_R(%1JqfO;r+{m?92t)$@bdg0fk=lkLABLW*&yQrLCo(o4^EX=td&oU+)S4-?eikQOdAZ1p(f9`Jd>BMT zB#5mxFVU&!f8t$RZT%Vvwx5KaR_iKKyknXrOiO9wSmnCKdQLmZNV<>YXBMxk95YkW zv|wq+JV;sBGHSxoWa(PX-nJ9-@AnD2u=d^0C?B}x1XM{G6YO!rdorWWGSfiDB>A{ zS#fIXwfhCNITsj_Hx*ghr6{{3St(kV)addV-c+qNhqJTPyi@HGtJqDGv+w@!-8SMV zt719Aq9c`Q`SY+SC2eM?x(T8A%Fv7^(Q7h3FHcv3RQoQ!d>_j7>NWd1?K96?t39~i zja2@e8tx~UNx^4Pbicnw>=P2_*?2b_Sj-9WZXUY-`0@LXzmbYiyo71tuvyst{&Di^ zD^x(@l~luq@{1MjR+uM>Uk*3SX3A#1mz9SWDbjWe#p>E$rjPGYH}psIOP+n4d$3dQ zpw?S?R$bno=nMVdB4vF6T<`rL9yj9imp0@rliNUv);$>qs)$b|nR{Y-v;)|A@Yh5v zz4Ap8*0)|N>TiX>$L@f@OYRl*ej!E1dc@L;UMXR*sEe0w)vx1OhLQE93FIo*9Xu(r$zTx^0h;Y8 z_LC=Nq)MAkieghbI!Fj7;uAgGd++4r$xV`qWJoqIs)InAiBeO9RIa~&ornGm=$RI^ zrv$6EVDTYazJc-`o~7cC&E8uU*!@?SUbDc@pV9{=cGTjA=&D0w*@->-rv~&>${K(o z$uMLs==j&Dk}?<7d5Z4rD~WsdC|z|_Hsg9v<)4A>epdEMk0{rhl3`^ zq)38Yw?O-_3j+o?ZaZRA>i<#q9&nOe<-KT~%BibUbyuh9=`h_rd3vU&yJy4f^ya)f zD{Ycc7?gGukOm}_0Bc0DWCUITmIcOUh*w~IS$JF|%Y-4AU>m%)Fkl1raxdn}etuXO zuCHvP-gmz5RCQO+%r267@ArOhce?7-sj5>apYMF(|M8uk1xHPbzs@x;A zUdH%fkXw_szXu>XBz88GNcA-64c(MO-DqFJtI}PKITppfjAO34&iku|h_4(Tp3r#$ zSV-Gk`!vw@@^og)9qn19bHGAau6P==sF)`^UI;Y5nhny_cq7|?a50*d6f;KnI6dX# zckD@~C7GCl5epA)3H^qw5SiEC!Siosp;raB4#yp{Flq?u@m-3PG3~e_WzE*SM90La z!Ha`MP43g9jwWZc%7n~!@(wsDlP>N$BV}=y=t4B3nFr9GATDS1>B8jh)$v+L@YNf5dM^TiS)Yqp&#+9o zjvzY*Ol6k_pdA{f;_1Dbw8=E<(t!=XEz9cVlJFtAoE+`1Nbfbxx7$OkGx|Kao#thuYy0eG2FRzr4m@}VV7u;t>AUc* zd<~QmYvfu*5#~3V=1H5bH@DF>08aKv)7&^OD9Tnll6?zYZ&GtWE^*+;lpF*pN z?TRQRXMUh{f zgsgf*etn7;c#{_%G%Kbc5W;7bBMRZ5^iOKqlkmd|7&MPans)p+`$G#+R)jD#8g&0Nl%!Z0zW^mRu%8FVmz83fFXP;k@qC;ix%Et#a1y$B-FB z(w{Ml?3ATW=)FW!lBOW-7DXdTpV=fD!-hDW3oW1vum!rIsxs`%mZn53eV5BP>jaPS z0!=IsFf>Krmkr~_D)RK#mNDvw59laHNWV%MLu<>p@KVZ1a$X_Z=g_3Cy7UqXDM1-s zTcVO@C9&GqTICWgdvRZTYy2BlU59t{u(r&2bHy#QdmtPfFW}MdT6J}+uB_4J!zBIw zBwtiHg>_qZwYA4fDChaLj_5t>^l*<~?Q>+>`hYQ6 zF=|_)ye!*6Nm9kxvfXzTf*`4@o7@|ptgJSdVP!2{sw|aXQV|uWr`=rxG_vm^#mcN# z2Y=Nqr0azBvllPb^Xt{ZCSQ9)sXg5?;_77WSZl@9v2L)D7zW567r9Kac*KKaGZErd zfpvD4N0XU(IAj@i&dD6PF_K=l|SQeiPDblwkA$Bkr9Nj1d2e@_05bnjssyAGn9LOy~e__d{ zkXFbtSM%^!V^b+g4tTc&^f1Ws!rL^Tp}I}!zi@F+Rp`qPV_D>YsFG+gc_YaMlQBRX zb&D~Dg>OH*aWoh_7!zo&l~9hitVqflvT2E;S*NJXC6fa|3Ft8C!V32vC^su~`3%wc zDvu}F#o|p$?cazX3r`A`IfLw|8PgJ~V$>*=jHpOf5MrVIB{PDpaXMnIM8e^SPZp?v z?n1}E*Tuc7#G56vvn zCrq7Gc6B&iP}pe?xQ{7h!o1)rQ87UWIj-y1?u4!CzUxW|JV^e-RTEMm}aa^tAJ;9G`xf&QD=Q*ld zhE3UNlla`9fHr6#8vP+sO!P6f1{-=Rs?A!>fE^9YOyHd#W8B0{AliQB zs%_`r8;FE*eVZY!nftkE{yf)&$2RxnLXm(K-87DOFm8NPltj0UkFVt?tl=u5B^gt- zKeG-;B6l$^1GfrKE$GwJb2ao_-rXJ)N4uQ6hfosTkHQQ=&3Zx zK9Q_bW8JsnSZ))) zRasvg98_CsFTb;dSa_?rwhmqFrnb#FRBr)MS&? z!*63+Vvy$$&GU0K&ko{$amZJQF^&;#nq4YX@S|AQnozawZwm3#HWBiint)wyLY1B+ zB6(Iy=$6{9s+K;}f`0>Md%+wat&j?qVrod@PZDyHZ~rM>CRCM{;JFp}XWF*u`7nNv zypby+#xZ(b1^9Y|gYr-Sm;oWU2P(m0;GkMl(~0x9M(M-^$OZYBs&2L%Jsi^SR7_L3Qx8S7R4mBu{O{3M0vzotN3p)Z zAT&q&-~tT=DeZ8Gy8)~}igP4h@>)B*j^&N4&?z9u%TC;pnG;AD>cCW`4d0;aa|tG} zF!Yor@5a!adz)*x+t-W*tIDni-cWem7@w0$7?)OB$?#`uqpzGxFlIy+=R#BP^CPrvt zG@(HIcRP>&dM9+>I&t@az1dRBj|k%Pm*nwNX1Tqzj$Tf?mN$?(YZFg$Oc_bcg6P z$Bry@3F$|=#6(=tA0qFCJG5g*XR=FP+>4^XKaFbFMgyThG=#@%ff6`=({Y_#iNe8o zdU;Lze?jdoE@B-U*8s_I;soOJT=);VUP$CaT!hjI1*W~wm~vsMfL+hl+;SWgEa=`$ zhGSNQs|E`b`EL$fwWVB09*9N`CJW^)$&fudOn<*OF&44u@4KURXqf(XPS}w#`a8e< z+HxwJOlDK%Yj2qz)BE6OmbW(PFQt!7_tBqeHn*1PuVdSfy3v563O+d-uFW{pS7g@Z zO3Z22g=Ss(=WzI(6;7Xv#m}X})(`1)3Ftvj%km*P5&U5`aN00V2eLm5Cgji_{?H-5 z{iFFeZ}aRqzDK|F0s4(RA_z^;RTQx}yl*M)_h5ZzB6+(0)|FTVK3)-Ms98}Q$vu;Q zaO@jGq0^^Bp&M-H<<1R(zzt5}*gZGhbW`NmF?uA&@$?lfd3#)+Qq}2cRh`n~w23;`vLq-{04c-Nie2g>Jpoe=Ju}N(%UMg?Uri$Zru` zUw(PEQ;*qMVIv_w2Z58I+3^rgd>1%8h2pj*$h6Kkhs_OzrNRa?-2OgT5KBpG$x3eE z1F|72LLoz!)k9V!k||K?+mHj4K9Lhzw6B_oG;k`#xwH{URQsY@Le_?J<#KK~GBp(l zhd)kuK^BAg2u&mt$p=MQ;EAWl%=Sc+lrlm6k`fM$iDy3BBiQR6py6~ z%h4#n}B~$Mr%(yT-us#BZ79Sz^>t^ub ztf*-VnkHr+4x0LWf6&wp_XTBHzg@DV+jUtE_8r#DVE-;7otRXEL3J{bHm*z=FS7#1 zt0n2xM!vZ-3hfi2;I zjIHaT!wSe45^`x|MRCG|jZ~1g6UU9dU`!%`uF&Bj-TGK$U?OZ8s!l1koK+6#TWld( z(1PDnba_c>zgGznZyxvLB%6Szw2q9VpvbW@$~6@v2Vp?cMg~J4N&&_lM)uKN%KDO$ z4LXVQ8D8tt>5)WvJxM9J60esuAwh^36ST6w*xDiY#VbG1R}vro5BvkOT77*U;dsnjfI2YrgGDe*Cr$3Kybl{3hf`!lY2|^b}=n zQ>>;U>9i<*F<=D)>1VKKH2rz659W`+ZmM5Wh;2HdsHuJ;oDR=^7`woOJyNP?@}r9M zHF$ahFB{=xZyr^oL&jjlxs{}>>HMC%4yRsm6>(x@iPgNsXM8WVyBm@^0za@{ ztQf1gKSd_@VFi9L9gU`=OTKD6oog-Sl2iR+gxBM_?!Tx+PO!1`WGEgA#lP#XPkf@i zR8F4IeXrzRp5VA%*<_y5Gqc>T_4+KVcR_C-=ENIKG_IUx_MLWH9E;nLv$6Q?U?N_h18C} zA_b2y>95!E@3aX&ILH&5P%>dF&u^vVL!F3ZiRKeq1Z_-Tx%j|~ja2lyBv zv%JX9l1cFy0yt9abPD50?}Kzj>+%Q#bOlW#Mcv^QmdX`a-8?~$tT>IP0`zHx2I!^B zL;SFvn#+VALw0p8Ww*kaS76LfFzoUclX&qyzmFDGBAO#?vjx8`8 z!Hpl1i9P_Xa-HNN=8>Bpz3J4W5%d~{pn~tA)^vtQ_Z;lC; z8IDMy>*fyJcH4ou>q1h5;UQf3BU%%G%*8vlaubX@7;Tgli7weq^8G-P-^0iB*R}NA zPX$$M|L_)z50K9);b42-Fs12(0V8~blq5xXVN}j~J}kaU{*BgW$+a*q7F_(S4i=%( zaeWGkdX3r?e!D~Ip~s%*A3b$)he}jKjw(|v$oXD6X{pAeie@WQd#*n>n=S0pRBj$uR2A6`G2Ecj7^m;9pF*81_#M{+J-GS6r|zhE)!6X39HkrfXY zh{=C*V1@l0{lFQ(C`NlAvdGSh*Szr>%_qAk(s|)lpT_iB=}@P|R@+NbTHZ5%?L5=G zxRj~u^_hVbpT(>)H}0%DeBm|%-I4k3Gv_dPt{Y^P$1FvB!R40}?b(DPZOw2uT<5ng zm_6XyqbEgX9k0Z}K87qH8a;ngssQFIh15+vqS8ZvMlRunp|@f*5NqiMK1~C08r35U zsjq`aR8T5(scW)f1e-la0mcUi7@7{l2V9LvbS56!!Sg#paVMW2&$|H!BI#wmN6GV_ zf3|PAf_{a{tHfzyJ8yP*|~*)bv5qOqgahkr-DaT38LM$KVjw z!kgT4`@Q89G~3_|SjL>51_+$+(Ae?&X)=+pqNJzIL}D`}k{Hn<^bPt8V_K0UeI3p# zsWN?c1}vkP9=*>O&oJln##3q1Jq?^>rAbe8$)n3$yjhu}6gAvbT>Fccr{= z8ii@`s+pOq0QZ2_zeK*_^UHoUcQf~D?m_OY+`G6Bai5^{5~6RSDGyj6RqM^N;#6Iv zaKr?6n4%%bd}1#(Ed2`4U+i6J$CFR)(A5#i5QGzkys#h}Cj`NeMubbjA^Zxc2;}6B z$;lmhV5droVt{Ne7B`cCSS0FBNm9RhDUby4H25OpIX|Ab#`STNbT2c6@Nl021 zJ9FU{p_CPz?$k(0v3Q9A#Uk!_Ek>3XQ2D3591Sew5VDonPLw=IqK-}QI!Ax)=g??# zu|>|H8~b|#(dA{}V~mdO9@@~~zhP+i=qOw-FGufWuI?{z%ga7mRbgHTSzf2&e(eB- z#(|ArNB_)yhO}DIR1{^>p}oykb1zPzix5e(4G6PuWvkDID~#)}H?G*g7NaG+h5Q8< z)5E6pDA?(2;r4OI*O4M7peO7(`dDTRDJo{Vdy>OZ40@}nrNIs5y>ru~} zO{JVe7A>gG#J!zb$-Px@Z#Aa)*GN*qFm7*u`*y=9NYaTP{pbQJWDo;y%sny3;-4iY z(Sn#8Zh#0&JhEX!`yWw5<37-f*7Zh1*Xa%EfFIA&^I?9NyB6>)*W%s(Y7(8*_ro1g zDU*&8bi71+G(FC{&dhrbOTRR-{WowVG)!C{Pkpq{Mf=(ZJI}nS6MD^haUX^d9Efxi z1mVE&Mm>AjaoD@{Sj4V@I7QD3lO+d*5X~(-!$$43fPJ(y+d(}g8fpL9U;T>}(JV9m zh3WEAkL~N?WS|!SmFOlB9{M0aqz0|2zb~cJy|!(L`?|*4ysH;YguH;#|1v?^iFru4 zS5tzo3ex%Hg&0|ikxcYoqZ#7!k`N8h$>bopy!{8!RH|2(V$yF5#nk>4i)Zo|Fhu|! zeto(!&a*Wgl(5}>(klc$DVTy_7Q)5KU|}F78bX{G#BjZD%VkIAax-Cfuk-7UpBkt@4GfwaS0`MKJ09$U&5VM8 z08tnz7oF;uj>idi%iH!H2!cQwGSy7wa zck0nckHkumurpwjr(S!*+)*M2&2W6fAkBayjzEOy*#K(rc9B zc|SV^4rcCz`?=iASeh)%%)t;(Ms%qPn(p)z3mVF98(>l4G59qqSgKW&i zqv`j)T&PEF%?g=Lq}V@`?(!jE9xBoiHb>`t(48$%($*8`6=WAi-LIm6KHjDPoeY08 zqK2xdjXHG7+PXoqVpb+9iAus5Gy*haX6z6uG9dgajmNtam4H!6wCQ@8)8mm>^_*Ia zTQyHVh(uxMGOuST%tv+*}?gQuIRdpm5Q-!D3@>4 zjo;g<=;swpUV8U?q@XxL$ioX)z11X|>MN7I%BHs7)#ROW4dGo)zpg9~{r$0xUKJGF zV1Gw9pjjigpr`b`<7j%g1A=>Vh8b$Pvk}_^w$B0X#@!*4KCNl{#?e4=Ck^e(p_@S0 zcP-Eo2Cb7m7rhK7KUy0eK3f!yBZw5UG{3kwzXFFPR0jNC02DnrIZ2ilmlx^ZTTnyr z0!I(cw>Q1^^wRH1y@O%cO_ROtrPXF&=A1;w-33Y$EYUsGCfe)gxto}80*jytBe+Z$ zA-*}R>8b3YAgl-Lqai7^vVt~DphJVx+Z-t>Fuk!!P3fqv$xfE=q`se!{q^bnL&4)p zVA|L@THk+w?hCS$x@8$B6zx^P8tRz`ltc0MGl>y#Ut&-@Vp-~#s^uppzPxWKF(AKC zn3~Az`j{Zd0XZOy*@TP|?qI#Xk0w4nQ%=0a7;fxuOz&5#mabcrE=(Y7gYi0bUpanv zDxNg=@)O%87VaI)RTubbAwR+Ip$Ta;!QF}e{?QJv9p@*|I6nYVW75M#h^slrO-Mgcyuo3$=tl zYy@*%0U{;Nmod6p7#}ZG+s`raq3gPV9u~Vk={j>m1@{N5bVDN1O+yuC|^J%A4 zh$TchD+ozpdVHcGWkfM8OBadv@hlMY5`{57-JKp)>}aoEk0;k{U|FBfI}A$3(w~@_ z$Iw%XHb3(O^d113aq^l%5>CF&cxR967QN}2FSNfqGY^VUXdFR_bo9#xdHWptv#3Jf zDdipX&lC52RWyqbM5XYi;N#`d85v22O7YT2-l&!OZ|(2NBw$#)oXaQTIYJ_T87?Mb z{e;i%+66u6lp5eQ@~~+M6XIP}90eXmw;No_MT}&y=;U+pWH^)nXuAGbAwo_dd(%+I zBF4GsGPEylP7tR_ zPt(mhlsZbIo*E~Trc%P$mU)X;`r@+sNMyFiJZTJUiELJ_{(K;62PO-eBw31L zNs?BW1WoUJzoq^oouXG(a)X}~1Vfe$I{sBb4u@qq7L;Tr=jyCyyJ^{PWAj*Ct}t$? z#k3x9IYUDcr&(sUYG|oeTLoR!oiUt-)Vr>g8okRIXy$LBE86saa)2&1V}VQ`Awm5p zUDFzLk=rvBkD8&}47AzI&i;4X+mMTFDe#u9y+_Y8)&EfKkTLDXgZiX#sJ8j&(X?j@z-T@KzUC5K4tlps+4gw2EdyuDr6=w( zgHrfNoPOcx=HcReSd!IGGl;t-^Dvzz!}G;q`h|Os#*c)hV0#6#;qB*hojLH*Wox3Z zV;n>1il@=+U|T2`FLg~6$`Yl=2X$TyJG-2)$m@f$LZq@N)L4Byx3)UAj|f6;LQ?f; z(6)n7U6m$sB0o}KRn*lBon*MzzWTXj>s+kjR=3ouN?hqwBF$+Apl(eQPuOtl)hVS= zxWj-|`=av(G&loNWrh-ri{Q9OpH5?S&cC&8&f_6lQ!|D)zm(^RSp%8 zzUV>?7els6-@_ujsy5F~sa(#+^uX#yU|ANY zepyfUj5zseuW*~ED!q;3mb87xy+>Cy>K&cV*(pGOGKX!_pX$d#wxDI!wC5w;@kh%7 zv;o7L>#zk-PSt6(&SZe>)m4*%q|p8zu{15CsaC{moJbG{fED&nue7FNkkN->*jW*5 zjm>mYh*+wIF}|_F){;E=GB*kw-lnTB)o6AF`*lC0nGftN?wKh5>oCpEaCXoJH8DFu zKMu}>WLZtHn86BUY~tI)G}HGE_h~5vEK3C0V^$I`Q`$2V?rH<|RV9B<<{5r0BH^+P zE^Am>amA2vr`E+XY&c$i$oDmEMhYfi=Fs}Qufjx<2ueT0ynM~eplRBJSug+e0&;(5 zqC2Ovbr$?>u~~#=!J9R_=ArWdO&!PoCs-@M_y*Al8`oY>@XD5>Wn=bu9$vo7OJ;9B z0$DyvLipAl(AM|DyPD58se@7rCVxJ`T}yN4L)(T1@(}ntNc_LzeR96t@~lRpH8kx# zgvXOFF&+$1@D4qkWDY-=v%r@W-JLI%kas$Q^y7=rukcV6mDQ30NIU0? zk1VWm^Dt8@INS^u4-}tU{TK^Yk-v58;pQ;#6Na0IL!oY7f8C{Zn`lkhwNmI{mE+o~ zTr!V`#!S;OjPY^9a7=To=c@hg^>TV{y+_@vE$d{L@%Mn%Q-CMl@Ng*o`aqs4jE{){ z^VeUvy?=Zgt2rNh!g)<$bIy@%1Mf2%#JE&d3v_I%x2P$CB_c3La z49!z9B`b%f=R`qnpOXb~Zu-#S$(5-?RX@u7yT(D2gDhO&DjTK*!w{x6R0s`k__(J> zXf;6jW4x=6>E);CdP}@Sp8RsY=BjHij{}#=>+_b*%++=4Yuz9N>1+Rpc@nu)-n)l! zpI;G=C(P{p6y`&RwqPEVU7J044KbfBHhA{qbL|{CpUZ{lRtQ;vv|n+q+nxoITWPhH zGIj`A2%guPg{7tcH@>&nUip9gd&Nt9FLeG=pZm{z&$-n1&Msa2b9~RYUc{F!UaED! z!MS=~pCdac9S{Tm&>aQ?rTn3XJK!mL{FWI(Rwk8zP(Pu@9feTR86V3D|+{#FZ00K6><7(_?FmlL`t=8B426vrQ{r082o$zg(6$TX>+h z38zR$fx0>hG=-BLi$un=aR{#$OCFJw>LOi}7bgjl7eXW)iSQU)H{P40+4?%l&9JfV zX1Rb9o~N=CcC+c(H?n7>u61Gz4Q5^TJlH9ow^1DjO%ZJj6BedX2oXhE=21)EgCS)Ak#dltA$9^2M=0VpZzgEH!uEp$LWp7u8fD(aoUZ6UG zYK0v!f$K3Ag6GhcFv_$TJrd&*+&DK0tx`hLz6vZYN4bn1E1D&!(b*%>g^rr!Va}L!Ro5`r4U2p{~lq*|Lgg3ulstlBn|fdbPX= zyC9-Eo2SdE)L?x>TqDb8LTe*KXWGyC^m8krA*Rv9G?|7%?Z5Wh#}45N?v@2T2FF%` zeN3Zo4iDK0)j0{Sc{}R$9oU3t{Z}M3dwiCxAUk^dt&zyB+cCKMy4~7z?AWGW+XKi; z{UzmQ9E=O2je5~`E}17OFtvFq@U(Hxco8{U8Wy@ zHaUHfJOOae501~CBTJXa3?9xL+qB8k@n!jV@wt#M`Tbx1ZT8*2LthEAUfa;o?bA7T z?S*Tue^eHztqn{!$X`S=DnK(lN0+t5T%S!ZS0Bh?pZz8~a#tiOKo*pkbwl6CHapX2 zSCxn0)L(_;L=MArStJ);aCM8Oy7@yv49(aUaJq1bJkbDoSICjlLOS%7MDTUGl+J58 zClpSo-9v)35~0VO*egRZ`(su42^bAZ5|!#VBTCnKTYK=gA-tuL@>hpmT1X+EqK9Mz#e zN-SDC)qzq-+23zUO3QSfv*JRIc=Q2VYX;~93*{Z!A>!>9oXlOG&Nwvmui&azHLZ0G`C8-(Lv0*-Ka`2zg&@NFTFv~LZp z>gNsEn_@24W{>=O!ND9o=a?-;GW+){q0)f56Lu_^r)Qn;JZ8jR4D@Nq&qW7aZ!Xb$0PJ62~mni*DDR;ET+9ya2Aix+t+A4j>XG0u||)A~hrh zP-^+RNT6X5jTlN+(55uLKSFq(UN&TfB#5z96GlQrQ%3}Ct3l|lR2q?#p8{3+QyMhe z-v}6QY832aigK)xO}q)PO9l<~fqE|XfNJ#W$_GJLzJxxer{bOmplG?$KoPUwi!!q@ zC4HH!6SKaDT7TjQDc`bN3kEeuw^E~um9VUz_RW~C*MjB4d}8VfOGkB$J(mX(oL_ES z1iP({Ur~=&=R^AM@yUuVG@tY7L!NyOV)#&-^E|Tp5EFAfURk?)^*-8bb|e4E#-NzUSXOGOef~jc??uFEu(7HD)NY{Jy(~^`SN;i zxL4eo@@#sE<*E3f`e`99U4|>@CvO=?miA?u`kR-|_d-TfZ<$bOZq=iz`Zle*rg7+> z9qj*B;rYZ}L@@F_Gf8Qjs>@n=iC9Rm*;a?2D^2?WH+ESF2>H)m|c>r@{7zX)Iat+Um0|4pVoA zL%C#UPFn$Y&SzdH2NobeR?4aN`BeEDQBjW4%Ur6w%BIQjTe+^*(_hWMW7^x#q8=7g z#_9%Lh3zMoJ7$fY1J|RYt@yl$OiSy2ft>8Vy(ZnRp3Mr%B$)iaYpl$cX0TmHOcalQ z-;q-+EKKCv=kpT_bc?vMRGuzBhV1lDx{UeubGYdXl*;pXptzVO#ZJJ*A#HX7u7eLl$a z46N%yL?5Do;C^~ge(4iWJJ&lz*OxSDP(Q9~(q(vnt2I%d1n#7S^xT(yzOKi*TzpTS zp{itFVEDP|K&u@d9*C3nu%f2xA zV9KO3X38YzbWZA_jUYd?hCR1Po--cL^H0N*M{OY;x7DB|M*AmV8Z;QRNS0Fdm2tk_ zAjdxj_KoeYdwTK6^Rg8XBBCxvgn%XUx~%n) zGhk%-vG?OZy8?BTcf{cRgTxFdd^pT20fRTiiLKFuVo9|&H+!CT9dKtk1023gFuFwF9k_qK!Sx<7vYk6McU#CjH zMt(Xc8HuDcAP%Hb1F1V?UR7-6Cc=xPf18*{no=VK`d70GUG0=PB7Rd)&e4~@^lme$ z8|F!}IR!6%NwsDA>Vv$Cmvfvm4m}2t`IrG{u_8OoDa3eiW1?{zeUO$BLIX4sn}D9-i%?cwzq~az zJ_ptwd`>h8naSm52rXN3GN~$L5<#bxrW!i+c zqRRTF*6;s*OIHUaT@a2K@|9Q0#t}i#r9pwbFH{Iggr=Y>A^NB+lH-j>8oDN{>eyXl zsw!*E;>jYtR@BtCl&Z*dZ7^NA-7?qf;~wNzu9Vo@jmRCpTiz_td+y-GUL^iv&o80w z+#o83OQ?GHOxKmW8$+UNqWllBzwcrE3SN*qG1cF}i?_a%sLMM(&}5gV@FhA*S&du; zh#yT?@nXtT!Jt!N8U5ArY(%1}ZGCzRUuWj#_>fm>uNE1PcN+8pkP8F2xVEHJn%@m2 zK!{I|bb*?D`>A-^nHw`hAv2zJ((zq4?4oxr$MU`ck32^s$dQ(zD>389O{D#9JqyhjVDXda&l_dt|_>^_f1&hSK#r_A%-Vp#~pDo7T3k} zBgcjRMiXRX<=-!Sg?}@7nwzAx@k;Iiy5^M?aB)~fBaC8&%~Nwc9Y0xsu2R5sh8fZ{ z7%H?<_Ke$_jas=B5AyUT4!CB=*ro|O*G&MvXcj=D1@&KR4kV=%6uB5jL=0NFq?pUk zCX|px$xCA-bsE0Po|>G7Z)v*NlE4wJ=I z&uVthvzkBk%vF&3AL5G&CPIXeSqmhS0Vkv7MM=IQsO9%vxq&VKaU~peB$|{F=J|jg zlVZBAY>mZ&pan>#Lu&7H0n`7S)SK#V`Ud?NeU;Y#f1oYUF=P(qv$7bwbl18TFl_NOx!N z)EEvrrK>+#n4a2>Fe~B zuu;@io`m&kIBs4Uw6@a^DT02zaG#z~=tu4suVaBXmCZ2C9ZcaDp1<%pN@stO(rw#Z zTxd__yCTR+6bKAD)*P^FaP0t~(CALpGk9t^jF76w0T)+MCQpn=f*PQ7z%T5`=OW>F zeCVD~;B~Lu91M1E)dz>K_^pQu^E0VLbhsQzCI^z16#1@^GLDXHRBcJ8&ygFoK>Me> zu<`f9(N7NElt^@M?a@#CQKdFBuVn%@eKi?L%_iNs_XX4^Npd-E5Z5HsL!|^z88DSl zV>$*i#&okz=Mtv|P&4(7gpsBalhApTs{}g>MCyS9{EBrTn*doaONlA+e+0CqD84;q z>QX?O4-|AgaGe(T(n2c`9YVLUFRUy?0~+%n`$3(yy_(jgoYrqf!gc#)k){?ndRd&e z?M*bjC9U~INw_;F&iaX@X+e6!lO{4qtY@ zsqMEngX8aXM-KS~x_946>BJ5-MH{gSQtm823DyuwnYMQo1molUWEuG(F&pHA;?x!a zgoX9#3ePcGDl+uijOD1RV`W}D6xk*!#ogZZ?xG@UyfCnfk6TX6jyYDG-!&lcDE22x z!pdD4(+oq4U752I+hj3aW0$qGC|f))3aKeRtOsN{pojUXlpylFpT7gN#dh#i)zQ1` zdd~7wiLTtgqi2S@UP{*&yEG#C6iB%7$JmaH)o7dFMrWVZN=AwfN2N?9pnXaUkQ@lb zTZ|#ZXi3H+%Ao_$uSOFERV^f5xKMN@0>K@;bTkSv5=RwueE8?e`<8*_HJ1219$2_Q#%%17#J=34~ z)Ry=xMC2vCM-nLIu$YN4`|+&UdBh z3mtDR@pYSa#lJ(yu_3y&PO~C@18Y}}uAu$cvUA)KS560zOEsb6aiVk)+-ZN<>z@n& zvVq{LtQ^p`FVKut`4($pvaq%>AH(AO0k5l1t8|}Ph^e$#YODZ_90CLDMN(~p;Nur- zT9uXW!%DzZqe)dw;+nZam`(Z=tN_s%>OWT*vI3F_0#E|uvd2BK6rjUg3c>?sh@a2x zuao*da0jxGpWt~}Q0V*(N@OYx$vi)i+e(RM@D!XQ3x8Uw*7qN%R|o!daAu}`dLl2I znjveVMt%S-@&iIAHrdb&C0CsX1o=|rA3!nlA0nRp6U%duD?pxC=cT!(2r*%G0ifbn zybR^KnGda-b&{WGv3z_4^6`;K)n9q+yg)NTI-wUW; zX-zr^Qr)TbCVFwEoiayOm>~25(`U{RMA~bkXf!mm!H$jU z%n&|pF?{x+O8>eX?RLS+AC4OA)2<6SEsG zBYag76-$=-HVu{PJTE={hFvp)Ohi%|J-uh|so?>EhGk*H&OgS{H{>|UW6tQPbL``i zs0USfWXtR^o!_>-by4aY9NNJ1_0k9t-f;D{+tR!!rtQR`@x7-`?HN0i;Du;X z6#4XR+pg}zf$!-@b?qJ2&>vErfm!)2{>d4Ds_Lbz(3yiz-p4I~<;7~xQ~p#IGB#3j zIi?%iwYLhp5|=Q;7AZ4;5x^x}jZ?_TiyDyW)rtH$#=7i*8Q5X|$ovI40}^quT(;RiBbaJ3-cXc(F>Dn>`S`AU0UOV0n&{~$R!Lj&Ma|>T@xaP<- z5FIB>f88Cb&2ynrEI#T(~wEdK=FhyEl)N2IR_AuToRAxLZmSL(X6Vhjl{E%-<8HB~()-Hr zbvt)oPsr%7k+t+UhfHH&XV+fl3+VF?Fgj_Z)7gbFYyMeO^i?hrUb8a0_-#24qJ@Om zrf{L>L|SV>-9lu(eU{D~#6FLRC>J?=q!;e3S6+{JE{MFqM88ecEo3;-P+J_0|3k9EaDtPd1J1p3yYv#GN|_yvn~X zYYeZBrTGle`u;SX%L-^G=|Ly>wEtm#kGmGzyx&F%tP;-N|FQdT+@CScdrdPlGnz(S zo<34Ii>gkIz(*ut~5Fuf?H=jpt$1Y|^LB2UhG z7la<$E2yflgDjj>)raV$mt&k!4hgb(FPyP=pz6ayb1E_~H2q@59 zgtxd|!6s(@T^ooe6y)ngy0F*Dzl>|@9hx?74O*M6A7Qxt@AsP#K7N(0zgwrjfdMnu zB2(jw4I3F?Z&$-W?uC{XK0QUV(eiT|`9C6r}kN9D zArc^eZ&@3bHqft=>uFqogv?jb&Ep_OTE4Vk9`AS2S}_d;bPRD*ftV0(Y01BM>HX2M z%m4TYe&fjF&P@nncaM=LcYA3M9;Ns3dq*CR-((n$Vcu=Rmg5jGHE`_1r+GD4sQSs(Z;_Ng zQO>1V{*LD3eL!K9V&1G#>0PLs-sEeO&(zzqO0DHea4D({c7`)Zf}8e@do*bk*+c+(3;l zGmYw9H`ual%N%QK+Ba)}BuV^DRqSc_8oA%A-k)~@B<^p6o(A#S@bk0{zW`}B{oSzM z)1a|$Uo@FrYd_kn{|CwlE|*7%b+N`=eP|ao{T;hiS-w+M@04YAx7jjXjPy6&6_g-W z3f^U|)+?mxdRF5I*~WBe5u=Uv6>@4#0yFD=X?2<%?MN^Tq#32vA-hW3?^=_jD^2)i zX*OIASF_HX)-eSlWYMeZCUC_%rSIDGWpQm-i@(X1-7ty*qCH5QuD9(PKmmJ<0#va) z13o8CVvqkBZBa*2ehy<`NmG`*F3HT=R~ErPg{3dSfcUvWpR|>q4FLM4-+w`I9sdQz zf?rXa!RPgOD>w;*EcYc%>sPfe<$xUYJ17{)!acQLgL^nSUApIIv@YIC$KnXbh3l@< z3I8-!mV7=ey2HfM$?2>yuPF0$8hTu}7z||laW9S}Lb_F@Ihv;>oTp!`T5m)3%AU9m zuLg9F(nyQ;&>z#xKF4v%4%XefsDj`*?hDye9gAeeX&H};LKYT)!2#} zwp$HVxy3MkpzRv3??1YEVqZ`awp}wi5Skf`+^pD$+puWEBQG&8Jw4Dh%UCxrzs+)R zOD9X~=H-yh9&&T!=^X*4jX-<9LDyyn5m}vLrRe0F#hOx#)qo`@4-=7Wf6a~GqgUW1b9p)U3tr&43+*rR{I*|Q;03mZ zyl~<3WG7++0VVFOqn-~%*oo4TlZ~fUTRp9tq1I7J04S6%>sBjd&Md0xqR~e};*1oe z9pR}yH_a8A<`+;;KHhb=g1WC^cW!jZMo7-mzYG8{f^?K7r^8ps9-|K&6$Pakk%an; zMWCRFTQ6VWKr6e)(@Ys;-JP*f zgiH^+THe0k^SD+4pPzHaWmn6_k^o7@rE))(m`xRofUvl{CX4TmS z;NKHlXF8hYGh0s}6M5U@hNGHt8htJuGmK;2k8re$Zo6J9botE%?dBcGOBt>m66J$4 z;1zgga2fVlYDmqwKMyN{mZyb0M+axIRnCY#l;36;t=+@8s(WYx8T)#q{Lh$QGwENi zNVlCs^8N}kW14iE=lMMV-H<+RjGICU%nsn*mpb<8z*_WtcQETN^tRKB(qE(9rVeJY zUf!g7L5|U_upK80s@hW35HE;=%8Nl+u~ZU*UET}m$2im~rPHO>vsjB{kp^3(WfeuU zO(LKsgf6Nl&-?uzx6h_a%cb-M4t1WdqbZzkrAtUV17`k%>=NKv{1koQWw*n!OtkeBy`H(N?ojh>F)xLq-}oS*@< zs#p(;0V!qb%aV?sBA_H8a!m2d1*sq7f4V&eV>{jCoci{Ns8cI8U_X(6-Uh zV@cIAM_R*4gPaTo^v9Jr@<2XAo}=Z9BSi>vy~QhXWn8FFBLt%(Y@swW`AaJ_x@*rs zBr<%kRS8)ubYhC^zn(u!Zj%zhLl3`fv!$xx?bp73cQ7H%i(-3M>HW9u^Xt3xj)hMB z`Njf`qqpcX?{|3r0UQkH%r@AB?fGTH!Kc>{K)s6*ZZo%wJA{-N?I!SDkouGug#R3! zHYUf32NTxt(B2y3LBrTBN-rqE!eYHfx$D2%+y{ZnraF zXGhSY5n(o2)Na?D19})9ljL!BbNM6p9NHcXZa;L-&Gb^v5XlI%&-;{b>v}}iw5Rw| zG8_zs`=Sp7LBaKJdvKotLtH?)1{cl8@&mL?9UK$PaNW}(DpYzQf9gx5)m|ZIGB(r6 zfEuNBO1r9kz%xh(Lv)f`xr^@InN-IMARH=U0{Q4j1^UmxC6JfMX0*`?)%UX|++S}N z4-}WtMC-2ob)5g`O@{a6mtCzh>R>;8G1I*sdDemL+cj-a)3$BHQ_oeen5+G_>pkOM z;k@+MB6C5e&=tG z|K8l?{OGC(@_)i(o-DenbLRN9&b;ZQ;bO&k*G%i|R-7srN6!U|XIsPyMqPrYp3Wf}a&$;7+bK3Y=t4?Y`{=JZp9ro}_88=~ zRc5K+YNXh7?dLA`{=Ndylnn`0O;8#EP8;ZUu%I(Z{}L1SKk3RB93(Z(%v=y(>+GW5VuEz?xEXN%M9h=gn1=gEbvEJP| zy0xnA9yTllyPAbA&_3LObjhF&7(&^B*BcbN8$6Wq(VYq{&WQ{1iG z9kj39LwgI@FwhJuwHSJwj?#05{?Mx{{lQsso&17nY?Ph}-eF!7_{#}pdIH0ZhF zhT$GO4_?SB^bC@3h_67J@Gd<&@IKc9gf03X&SZ%m+bguT!OhAN9NG|tkuB14WAR3- zb%ATK_g1>GG`%*y+)08ywFJ@b3oGuKVAA++rRB>7%Lv|HVL?p4<=*M|Pg-IA7W1pM zBG~ZCUwRM{L=tkH5-bLyWMBK+`$#mf3{INWstP9`a8Qnt5z@E6ElGiB)xAqkRaa*W z_U$FQ7nr5JlZ`w0_$F7cGloPRh~x=?CeN-!otr= z^CKhkk_V{R&5Y3TV+1zFXkW=Fnds^k?KY?@4X$l*Cjb{`pG^gE=B3^t4nij0>uceU zDEv+Bb2srypQ&33oO zskEzPZAsNb@pwpArAVJZdyVSfw=5$Kyvf~FE4Gtw)GJ*h_nuHqaFqyG*D_gDv{s<~ z<3NjUofWOBDf4(d36#07V9T^4t0rcskRit)XWnU$XB*GJSu@Tn@TXSyU>#RcG|k^4|mGcN?{Adzzgi;m1#Xm;P?*%gB-`NqtU6mJM0X#QP*Xly-071f?`%qPrZ?@l@2SpRPp4rSAcS&cJd;*^?E7Q&`#*O7r>tmP>9f^6 zcyz32%M0Kh4Gbjc`3KFbGnuQK$M3)Y^-;@F?LH+w!A|x;_w4gerEn3B+e{eGy#f~0 z%yR6pZ#_o;nqU8Vlb)VO=7%+y%?{oUEFtXMpGDt)K<|N6-?1$LEp8ep%p{;gQ}dJv zqacX_b)^d8Pr5@E6C#JWMBG7=GpDzVYx0Vr;2@AjBLS*dOT-O&}Zf*9(*_+=}SqOfl~^7CM;i3>^oBUAi6i_ zIQha0DEIg*Vu7S^Roh5=4_HpZFp5_o1T;R3D>SN%JFe|yLy0$Wj}pz2Scb%Cc(PIc zpY{EbfmnE9M{HorwaMV_oyEUwR)s68wdv_M9=LpH(9G_7`<8s|?zilG*{)6cpX|MA zbd1QAZ{)9^EspPgRc`8V_WHRaXUhHGkkhZf+LEWkX&(g+TGc_%yACC7 z8Rl$A&@zoI-IjGRXdDIb=<%?)u|eAwI` zMLve$$MILzdy=nq2qU_;X`gcg^BtDBcWasLsNk>=i!HP|Aq=#7?{>=%7(ji@ zbH`eLyY6aDcL^xRz6f-cpKmjtv6t=4%2H09p=&ST+~bL~{2IV0!l>qQx#xY4s53rX zNFB8ax?XW2xUA6WYvtIjw|?~2TSkvI78c0L!4GY`=I*<%+4!OMTkFF!H{U!n?9wK? zX}S97yfXnj5A^g&$7%&rbAc7kZ*KzU$W`8p>eO~>mr5n6T1%_7 zw4~lQwWRKuo*qrlzV|G)$2MaNd$7kVJ+?8%7jQGFxx%c;GTD6=ism?id&Ue1`|ItWFZa5h# z_4d!@&R~fuxyMH9oY6}Qn!lnE82Q6ng2|8`#`-%-$CJ^?PpQG*86&ry8(Wwk$ws1+ zZ(X9zTN>SPJf`S_R);P+3flg)eGTk$%V(fNLl&#~wb9gbpbA6&rQng)#(@Iwf({RY z9vJK2fs`X{2q;(o(ykAs&J5M&>PywEn{>7IZjJ315h>W+iue1bFZ(+U+mq`A46bQf z^Ksv7X4|J>+k6+;FHZWlZq8%CiKBX)GGy4lBf6=?c}qhE%)X?dH9I3FP+oA^x!W-Y^z*E!H}hPE8N(pB%|OU0_R#n;5aCl(zY&{<9)j7-V zzh)*uu1Gp*q=w>=o}QDTP^kG_h-#zhy!&&=jYs1N2?tUD_jIRLYI&I#fq8@6o1F>r z96JVJ4Xr$p#R?}$^Vv<=O_I*dk>hteO|tzPv~9F^Sd>Rzay3}K9eiRm^-Xe1^Aq4b z_x=@f9Jw)aW0c(dF|2bHYY=Pv&XE~e97)&mC<<>S*8C>w-$`zH!bPrcV;e>w>aFGe z#}*8jq^!jE;$|jnV1)>KC_r|Z z3^}?OfW-sur!!EN+k3R+UTB{6(KwlKd{rtv^+GCp2UD9`2Tidr2ZQ)3id~Is0BFt3 z8DFh;Ehbk{$ZPyM)uh&SBE~&Oj=tqzN#uY}zcU_~q3FKtN&x=k6d4C)mI~HQUe>a? z(keP$?NO#xlO1_Zg4spA!J^?D)>aT()J6mK8B`fJNs$UFrbr6u+3A9A>8`Fc; zX1#N%bvu5$6HdH&4wT~I`=(RE_a zNxzjVt(fzUXl*RT%62sGz9WBJ{@K+XV8ib12+)=|RsMrzP-l0puZ_kE*t4H8Fob2> z*gz`{nhCHSpXc!ovykQBvfPY)nRkCV{(x~gyE;d<{1pAW6syzxLB}Bfs)rpQ_-N@2 zS@Y^ZPuDWwPJVslSU>o;Sjk7TRIwPm_ zpx$1L{fG1)tLyi;ZG<+k9M%k}kvmL#=;6A=Kt^wjK}Xi zD(9px9#QfleqO@kXa!hQx_K94P}9$2F|QoCcO2J_k`4X_mU4b<_AJ$Y*p+OXYPyuD zW1p{e@jZ|do#sitPnPdsuP`R%}h}GL(|x z*R#jUUah*<65pen8PtHfJ=-akwDK)|97S3X^IG1PS z*2@<}hRZ{;{AQ7hObHPobrUVVKL*G9U>=`a81oG@mPhD38IQ}PCxw9<6@^9;kI?wK*MmLbnZm^Ud|<-3ma*|u)iMK}S(B9BS(_O(hWA7x3UCT13A zmZ|25i~^u^Y}+KC85Ux{1BFR@Hw=el} z{(MwFvDC&rWB7!5u%jIaT+`uQRpud2udB#xTSg;%*Jz_t9{KL|-Rk&$j=PVNce!tH zjO_aRddU`gzzw`;JcZ;$nqHbCn`3aVi>HB<2@w8$QIDPi@*eb*{T;+xO$qJqZB=2}u9@?76hpn-%W?sy*PA~{8Y z{Tp~m;y2t#KKto0x($dRrHMO$Fw#>uHer=R=!+2PLj8*KkcDqEs;p7*d;58WzMoGu zPh5>7Ccb)f3VLD6x2Mf5k0tk`4`dIgE?kYx2)_DdV`b>LsWtnQ1pajwF8+7)L-bLy z?#5m8WBQ(HbYnaGwpPOE2O{lO?HB3c@xG*#{$~x&lNT6-v2QQH?sZVFvKrT&CMZ;?%oNB~Cne-E|LMw_-U?&e3w5sOvmhCbz(i zsGcZ}mJgmfb+9~oF>oEdbwf{xW*rFX2PHD}q>lH^@RZ7w4;gtms>dr3 zDKZLheKbCP6LP>c(TUY!tgKdbveiDIRAZ=y-jAh+P4(Ns(6?0cVF{m1RL)eXcrlFSeT&>tn1>3!+lE|$y))!ArSE8ZM3K+8-RG-$VhPN%@*Ks z>mj1FL|O=!St%wmGXtnTFa!1kw2~-h6kI1`W*K%Fa-E7xws9^|qt1V+pdngA+7VhI9|bx@!ev0D8%ItA^C}SSps>@R8`6 zTv;&(CK+ioOs8ti1&ID}JlA7y)>T|oLsCc(?H&bdSS6*Ad0mxCP>KY*N0oF*{RJgo zEPrVxJ-nF=v)fg*K9bG=SoE`~KM~DJHcvHi*n^4XYmMM8)Q>DL?>PcT(#JhXALAWQ1@nZ5Ouh3jTyVHXZ@{UPhn z$xSsy-F{4*%Z@i(OBS=QZV4>Y{DuXX%Uyx_G~AuOhX_M}u1;|k9qEsSW6j^AW1u#k z8CnV292e0K(DQp8>$uW$pPE))WrB*Wm~c!zNFHbI@pM((7Sb1Cs;errP(9}vG6q?u zUsNTKeTTy*oJ~*%gb3F{sk>SijYPZK7YrwO zJ`-1Q7^`+j#Pf)=B!QDL3SQ>g zld2h1TYY33JlE=_b{}bUWcTOX;Txl9mM`i>?pmBVB8J2xAA8}Kw^}QWEJ@PRNa=yg zk1t9eb5vhbYq@upif*PcNHj)uqE%+o_L3pFihl4$W0?&k<|A2|{`zb}!4K*@k8e@Q zDsYWpiiRo|Wj>ZbZ%NqdEtu!^2eFcvl@l?ZTu=?s6t4Ns{@gGTi*#LigJFG#l7@HO zE{TSsm1)9)-?xqLSjHRZWxO<;+pp4G24zh#MCtZ-7y*|L{tS19%#{Mw17lET>&AHiQ*i&{zfe!jZO61rTb~L|4f0Nrkw0C%5J?jtVC6MlTVIVrP^MI zCBuGeZ;fU;B=fx{Me`1*oxFq=Q%)^ET}mTDD^;vK%-O~=8N&}NSVj2Q=K0h;7)>l4 zy6(`@1j6^E<~JXsl=pFoTc&-x%t?={xOz0Y?e^2$^5Hx0JiN@EzI|KtXh3xPk@0_t zz=^;eG%Gh-o4klx+q0c+=3+sPB7Ed2^bd=Ir=ufJ`x?YaYEHp9(ui@6uJMHPp&&pW zS#V1nu@3?Af9)Mi+&=-k1EQu&QcO;AgDQ?~Rk^T^cq4>V-Way9WS1pvMU%>5jICjV zS5e5|ksjvMtubulbZ@fX&_ZAh4{1g|nNH&iKN{qcVozKXQNyPjXfEk-k&A4%$4+G8 z`;O}&E@HkU5}e!_wT-NRkdQU(=+4PtfJq|^oCxDb(z$_nj_0#6NkWRraY1cZJGNmNhk8dcc8|e;?pB;0G_yFP ziRVD25H=3Al}CqSTZ_ebG$lnOP1dd2ZZ5YkmS&vuCn)L}WpWU5u@OFrzJNX-kZIIA z;c^*Q%a+FyKZd5~*=wG1T-zF1&x<)Mz2e}tW_X*zqfcQ@*&a6j-O#bfjYw+lwmwxF zv2ZkZa9YS-lNC-MyD6ln$Uu-|Qc4dYJD5)<6@Ira#bT1aJ5_gzS8bHS;kG`D@>Rva z7+7>^&r^=5T666>EI(iiSv-h9{3v^==LNTPjB7K;2;u^pKTSq|3|tF68yzLRH__7r zd<=uDZ{7zbTBgE4?5Tn)+eZ$_zMi39>RC*sDC-;m2Kj@mKrdd|Gq8)X%>Fo;9`K-S zQvVX?%LK&o<%ZLSy`4 zD|~TnMtHlDjWQc^^DI1rxqZ4we?%^4;*x7R@!io}J$G(xd_*6OF!B8D!mf-#)*5Q0 zfMHHoHe596LIXHVIS7fUL4SN$C2xW+3>0`2lvJ(w85|bH(Kn5%aW#J@i-Si==DA;Ve#BLGG&@ZON%aQou}+_)1%f{0yA8wFvg0zAEZd*>E;^?AV(hf*GMXJ zXDDas7ru|~G%RXkQbCeb9zod@$da2zY_<;*GXoO?GpWegNNShfPt%z9zp1=E6OEsbtOpPdi+x47U!B^#GM6T-Md_bzT1*XT^-jV6|(>;=kp_ zJPuzz>d}{9g8B7EZ{551*1g5rL1uhBShMo`^603nyjfNbfiu?VEsDIlm)>^U!P*ej z`VZ9(hC<7-Ol~Hp*Y9UXty-l>%<Pj9=BdxaTiq9t2Kg7LBBw?r8wUhGVDKm=oJTFZdfG(n>FirF&dB-}rD-iB zhdSNGnC2|T-H;HG+9MFTDDPghzl*{wXwe zH<7~HZ^t5ZlowQ8Mo89GK~L$Hs>tHrATMR&0v9xKTB5-3QW~2j zd=z?$p-Z^qZsXtq8DS(ef9ADr{*j#zZ;~~H;usI@5(_wj-O)F;U)DCMnp?Bqet732 z7-{nVAU6!{5{eiHJRcOcR=PO%082o$ztzjk2H#8pUUr&Ng%Z2=b1*#TC$=*4{niO3 zyCaJPSVbqs7E+N9qk&|v;0!sd3^icuL@%8jy%SqQp$sgk#}>vSDZ*}+W`~0eXUy~8 z`C=dhxq}(a@#<7_co$xjc2sLwD^a}oHaaCBZKKWAy==zrtzQ2P)BJ2C@>$btn53u7 z1zihrqA(M?-OtOO1ZbUJdiDsic|*E4Hxhda@axp zEwT!ysn=Q|=D{c+7AJ-&h=NDSa3r=4C7Y1AJHv_L;i#rn7Q=UInwH%tG``E;UTs8C zeFO=K2z?lbNA{OlM<#z5sg$j`9Rmp`rHhf&ws9q!=Xe1LG}AlEt90em zLgKH}1L6YZ_3Me-{`c2Vkgs+uj8U(oxPy==>hT=e*e*Kcxq) z;+xLya)~0kiWeq0N$MkCAC|f7_&|xArLo43WX_8^vcmD8nr zow4jVT6WLgB4OyJhMG!7NI%$#G;RLO*wPyzKEf-{b*}&$_g| zpKyHC)AuCx@}T+0m?47NAfQqM9AfqMm#vAIytMHVMOvnG0lG(~8&jBOWC9_2B^ zjIY@(T30STrt`AQ>p5BBWSLXs>-C`E2#S(dg=9j|@(L+Wumd3`26cK#dsWw$4xi>l zDJ|*z9lTUDXyHXifuhHibpk-mL0K){QsUv~YFrvVexb8-Y?3JN?=3ibTaizNysQMR&C24D2t_!huL z+cGZj(Saz>1On#f`)^8m-*UaV(w9v|8VlogDrJu^&~<`|14!UMugi%X!MLRn}@b+lT}rH3(6Km!}S^pyxu3LbcEcE%{WRu8woX zzJqYMpz&JzniBqbgN}&C&%?^La<{Uy{OzbbzN+BY$lE2F1L>3ZoJ`Y#mCf1d=6fOU zGx|M!;?8nynEYe@Kd`cXBc4pgr)k09X02z~O1~9Cij|xr7KX#=%j4US6{JjoLn>!$XUt_Lyp0E^^PflHXr!vc7;A40#^~&b1>dS+ zJglk_H&zeo8VdA4AI^ZKY0+oo&tLLcthv5txcM+!nb|xkvx};+ zd{r!G9QXz_VcUSLQ$K?36@+aC-qo;uG!iUn*)^V@9_Qg%(wIJo@fb@i&YKxaeI)PA z(R4c6ynCgMg$U1}IzI4PY{_s|o&`DblqL2*vli=k+}XxbB=wVEya~89i>CT|phT|k zaJ@Iu{4n~Q5D7K2tmqCc%>T?kX95$X4;NVvcFPKDGG(o_yAAoe@NB!=R((C_`H_i) zcgz7oXAqUCNyp@%!M@0wR~mZc zLi4#q@lWoTMmCHbVQazlkyt37v#z|wHn8&Ao)KG$MiXjWi6?^QLUMwZ780-dgw|Uq zY+Z}V5F~5dwslasSPm0F6Q<5QS*w%F17{z4wdAgRn1*fu^Va+)7++gx+5H01N6V!5xV5K*LVG?d*b(@lxxJa!cq)H$g}l|!x>u26ye z)@kZ0Qsw5ktrLZ@1)lHc`Gv8<#8z%p-P#`_lCwx87&9CU38lfojkP_sje~29W6xCsM=r1=LM9G6r$-TWO>K<)=eX&(#WQ*<2z*eW5t3& zf05?J5{Ptfy;Dyl^mkecmIRhfixZ7PvH4GfhEa(2CY^#|4BE+FW;?xb@dA1sIunSw z{ei_+zA&bmaL}FMaP#YWTr?#`|L%7TMKZ;>{&P8+izsg;MZJ1ly6GlT)Jrb8>)dl> z&VGdaW|7E1?$3ywzury!YK9@|V$wikj?;YJOp+7BcI9|nL>=&0DEr*&Pt4?7_T z-zVyN+UOCso%2VgQM*6YwX6bGC7D@;+&EukiJHpYfr4asvN=_Xmd6lC%5B+fib#kP zA@$0Y3{vC)SsZ@uDF(y^m~6+-*v86h)NLOSrEI?W3|!e^I9lDfyMDW@OB?)QgJ+H# z_NQMxzO5;mLYl>rYiusLSS%EQC*RJ6#aLQ0+NyYp4ll9_Wj%~s^tU^1ym7~&9psPg zzdug?rH6;nKC(%ZW7N3r!Rrnlgw44+6EuocYUEv-^JicKsY4zQ>JK(fq3W>D7mC)w z?+!IhQ+tCeXp7`H6$x{7o#RwtkFM|AXE}fXX>vV1a4<5R>Yqp`M|W&pRL8czlEFq; z&X0eg3-ZHgQd2g9s}z!|biXHl_4MGjVoK%giLp(4f!O@Xjh4db^96Lq9iJ}HLjm0J z3avDBceq2c`SoxZmA!#_jXNUW+Bs0yjL%xdr=zGR(3yPB^&ig(d+KH zWiuQ$FTmC|IEn<`V1SMdZkhUvE&D!blNe9O#T##gT^=k@%kXct(MU?FDkax$TmBwY z*HQ^wL7EfunK~-#Fl7-eBG7h=>sb$19kmw)r1IQ1KhzSiw zSY%%dUuR~^RnzL+AU3B$VHJ!f=qs>$WYmu#pD{y`o&-}03>B9<@#pd2z^s6XfX3xK zUyO5vj=Y<^qdfTO)Yv)=Od`u)PItg7PC??j@{|~zs@95p%o#&@kCzrJCc?2=rAYll z?*NqQ;mP@5%x|vvjxYSm$&3BTbPg2~{|LDLs1ZpEeNG~cGUyRG*8HLw=8XB697CJn z=)|UUjBEZ>;}iWB$nr-w@JXBh@ubT4&0^}MCjDWnU?eccy2e-^n@zJWArk!kLniE29F3V^_ zmYdJH!ROQu^8$s)r~@kg_dPgnH4}d_E(!PDBOPX3~DH(Z>Ei8;*y~Q3Z=BEJ=cnWz!-R zUbpZ(>xUJ2QKo-1au<=dt@v5t=C@EH9PAMdUKM457c?wti1xwy#Tj25uM5&cY4M+< zFO#`nCbT%;1`>5cSzC&|T5FwklZU!@qLmx=evsDZmq!#MZm49vRzd(2V=El5ErEA-@s}5$A^hlH`f!p0b~Wt+T1wRGiv{6d3LwdoR{m=7 ztydJ2i^TyenCKfnxj1M9?;Ho|sJu4Z>QkXj4;)Aq>$%iM5f3fCX6v3intu&K%N?*C zh3%1UIWWj%s5N8Cb%t#vH`s(~EEc`uhwERZ#H`^N>}j7(biu5jBU90Z8=F|BJ_mHo zC(m0(uk&QkFmo74b4(JYnBrbaY08Z+gOpkLF5MJ%sA}`)YC?^vDhiW5DnRjf**$+l zO2}n$H9;?{9li?vzRX80Uj;r|j^?9I4wrnWH{CZeu?;r$bLZ;)_U?vTz=S(?+1r!S zOr}1ulyOV!_66oUfR-T+fuW{&_8S*p(cQpHa4`U2W4#!xtefO;ST0sYRjk6M*mX`r z=sW+=XCy^!W>iHQ9p!oUAtmUXzohxqblXIM0uwHM}>nFWqDn*mq z&#gjNPc+YiRy&j(XU=`&r|EspG4h*lb&pn-sqF2^9AD?o5dN#i^53@PsY^v`uK{X} zIozuytTlsLLRyq0efyk%4J^#fqy(BMJXIs-WItC+!5+@Z^^M!f{U}a0%^#C*y+MoP z(#xE3goFlh#W^CWdFpmOZ|QZh8ydS z?ppc$z9>IJb)#DXfr=03vbUYZhaA_ajjru4YjrB-+n7$|NsCxPCjlNJB)`X8W{_Ow ziX4&4j8R&m3YW!mWYt}zYzSRO>#{shSFPq7SzG{mg{9smivIxyAM%^c^VHtp8(#|O zh#j2AW2jWCV5%?-wn+7Ay)l0ThqNQBvH9WHE3~v$(KJ%Jd_)W3BlDk#4bPKOQkd3S zK2%?XH6Tk@Z<_^PL^;?p#44KjhDMuJrsl~EW5|w#RUG5;73yOEI?l{F^2sF8$nKkV z?H`@ak8Vf}2knV(?B8|M?wJWYIGoxrnlGaaRbV!ML^i8aW5oqa6*wcbtSNd1#jSadFuSNMopwShv5mvLX9#4ZE}k`x@N@tZ zP;<%^r&d!Z8~^rHIsQc-S@v5!jD$_ zdU#3Fg6@vUZ~sc#a}Q}x0+0?^^jJw^fAn?J2qD6WI{Z`(tecElFz+TJqQ9Jv<y6yJMdKCqcj#2mumEn9B`iLxjOCQl~acXKYn>TZBKU^ zpG&0m>BdIC6ju5RoVV*zBOCnb(b3U&jk15Yvcdf+j_Y*+%*S#T0IgWw4q#`j+^7q5 z?(Rm}ZKBnAch*It`9Jt;kCSTtjC{6{&&S9Ioq}2QHeTZY|F6u8{IxQvr*G`iTqOJ3 z{ub^k=0AdfTA$N}Q>qYdywXl+QxK~O7Kg%29 ztQ=&MKPb;iIw=yQF9tX7+Z;p<-jME+L_Q@bN)z}OMG;cGND2+U5ltkb-rDmSv=w|+ zH&6+|i?1cb8EWB0&YFnD(GvQD0ge<1Wo=#}G@eYB8cj|^muIkQ{17}i$8<%H>yD#{ z)~F`Lcq8HPVL_X7F)~9^HH&oZvLIqY@e$@gw4h5oQ4bQs1CV_&4$>hivOR-X#FedXf z8+yL#6iek81@$L9q!R(xL9b@+yN`NMm3D=V05mU;>RhSB>7!TTAbk-zaw?CG$|Y_e z3Sv_BOO@l)pw@h5uvQyHI}$9eC(|VSZrD6O8SNd+4E9FTcqpA7;(7-sAB#>74yK1N zDR?v}D$}~Egmja9wLVx&6j_|kU)IB^FvZEaaPhO~40@KdZXj?f@G7$YQO*PW`7mAm zDf|feFH#>!@F1p_DaT6hfiYApjgdu+!39&NM|PENz$*^)%&>v}Am1WgWlBYtjeKb= z9k!+ki&dCbRDMi1cu5gB)W@sJbV0KCX)BzLNqorA_oyjd=~48Q$`kgC!@R=BBuNYs zT1{wlP?V%tR0&$Ks2Yt~K_%LKkym-li{cZt1GU7mBq_s0_5u85Ao)N{g|RWW+za3eqPsOx;8(rk)7Ug zhL&kQ(qzGYR86Rl+RgRuanHK+u!TT{;edD93@HALLq<4xt9c4~0QNFMNxGFuUR+9^ zPKsiQE^YJ3?!Ifu#lInCEgh_0r~vgYj^Th(fXOPuiDI2uk7yCpMRKb5}UlJm0?P#!h?%eLgTr{oX{-)lXMz z6`#h;HC@J>R+3f*GzUpIOA^jfAub<9W8W)=6VoH@v`wLCxTNU1rs>nLRfdy^@b?Nd z1isMIsAosY(^tpeNr;W4!sea2MeZjzlKbga86K;YN3s`UrBclJ_{TeOKoy8l3$*q1 ze1(BHxp*F=0bV{=L|WP;tV4#5i#q8JGM4^=`6R5`#yJq1iIiD@AyzN!cbyN~{P8r< zyu*Q)1Wt70i>w3a;6A-0lB*DHEA%|gFzsZfg5^9LMaw6PL6Dfbmx~VRz<{xW8=6u4owy^@m6S=Xm+{6rM`e1Y1}1`0e!&UjH*l-+ZRk{L-2YrKLvq~(revoTo+ z3vw)*J(AN92Vc{MQ=`X3TkMNj3Ko%`tjlser6Cb3R;-U)u$1hTd5z;FiaS4;;8A61 zz`)oTSgP9qdjYtVB??>idpr`$s#HeB)LPl{82cbZo? zyDo`XgAJHDd}p(M=i!iRJtGu>p(?O|mrdGhj~;!kX15KaO<#l{X6MRQ5E# zy{59OL&Zx}cA9+Q)Y_{0^nN{%(W--{0X7KpwnG+Z``2QHFbXvQjs`1~f}W$>fp%d7 zworg}HK@>pb~QiQpjwgE74T(teNuvio|gjUz-Cx~Z(b))a7PS$i<(BA7jayxbQ-)w z-*5SCpeQ7tlgZytm?5&h-flp_Fp9~>yB#%{P)Hj`LFp-?g}kd9p4k0!Q|Xb-tKhya z`K3fXYCZXdjOlqqwH;JGDG}j?GDSpY@diq*)P0GvOY?|{E|2$OOT?)Zkrd@#?^q1U zH-ftH`L!3|*p*%8JFmLOg7iVqRQ|!*3vleM(VunmC~cztCIuSMKh9NalyfRE(YnTP z{AfUAt?fcD;nGBIA~%U4NnDkB#d-4reXWL(iL14d!vm-HOi%5sQcikj*5P@H@Wp0i zn@$LpKAoQ^bKKT^ZuUf>j-~Zs4F`eAG8r&Jhvt-DGs`VOcC9*mZ)DyaT{tgab0<=6MJ&1So9M zEP;xX)WH*S4p9;SPFCnchiLS{^c>mDQJ=$I6Z3~h?b+I$f~W`zkDDLyvUrIq5Z-dWH;=@eMn-%_M@dgjV)eR%s~qYUN08azri0oT3_v z^O1Nw@@9kQjYP3{hgx)EMRg?E8~5e1%aGodTo+l&WB6QTsVamED5JL?GDB~F*@nII z_1U&>EGLLl+pax$A&YZfV1 zNl${K>)U2+s=&s~akd552ZlvwY7%h!z>SSA$+nk15eeq%h4hWmRRxR6=Iol!}y~B=t~7 zEXU0_;^(C;LUktAYqwo3c3`>y)L(7=rtFhtZ3`^jTQpg2h^F|#b?VuCAC7?c?P3Hs zL=hck)nPW7oj@}jz{8`ti0S-+P$0@tS15+QBhorX{dEM@Aw_kKqGkHL8}O%ey@4b3 zI^nQ>q~NDoH6*otiV*D`-4wa0(>Uw4;UFUwFzQ-1^hsP)njv9=!r7NGf)b)29m+VuLx z0e_Aa3s4C5tvg$(>ZDrf_U$RJV>r8SSEnb4&QpTq`WqZw`wyQit%%PIncl5-vp9(BXmmst;N@kyAt!n(yw)bqO zKsu>yDIAr195mn~5#tXWMq)RW<(W|}!Zunow>#SuyonW{u?>&n{*uvJ4)BKp5WigXV|h%slLnAZvuh>nP&Ra&;)`G^ zr~e?en0iGjb^Vo~N4xSch4PsEqm3Jta8lWL$P~H1BPBmbk$V=&O`v5XH!01(pP)A- z!^+0PhS*+v2oLg=fEvhw1mYp~khl5bD#Qh-Dkno_#}};E^6@;??S$$*54^YG z=nDaZ$lY54FA3ZhcnBh@qM-XI)~coH8j*yl5`*TpH6C-R1 zVs}slNg6p3!V-E#W2ltF(ijEF6d3>?>4Fl)+bvNO5Ga)~#Q~A>6R`FaL81JMh{^Sd z;h@H)IcInt=}0gYMdvh>bK+?f4ssMXNE6|*ipc1Ec;6jJLZ+q~M7BnU zX2T)H5;dgsHF^?`x_ zgL6X*SX1x3Q`PXo(A+0|`oGRtXo%|c!m*29be)$W!4=<~DZ1E1%B|?e1E6Yr8nzY) zW{X2}Lql_)4TY9Nq0{tm=vThj+5ZdVuR&Ix$()3n*TiOnpLMwV*==Y|GGn|Nv<+Ey z;t9n-;-Ew3xdTsEcXeDEP3?jrS-kU$SbGvnfDc|BDW&N^B2 zi*L?&dZ%xOEC+qsvGz0{nm|41_1|1&s;1R%hK7cu2_{>4ZMxNm&PjiijD5CHGaZV% zpb_fMpum}0g9Q4xm0#*z8N6fLgrw;MkNivwJ*uuegbD>!Uky-|_kvMBSCsVn#z zNhJSOtZ3sBDKJntn2cqdIK`{9g0i8R0um5s^9q(_k%(59=XgP|c~Rhlirbkxv9jT? z62)X`5s|>_0#?YcDw58JI37z{G?X-*jDmY@E2u|89~VT8d?O+S3F+Z=o|6TY z(Mqq6t`FSl>m{<*Ll;mdA5Xbdc6+Gm6)*sCYDwm*46Fz+i(+7Arlu|0X@pcoS+|k@ z)Srl|N7WBvCtix6E-8406c>Se!tQx6t&B5MmojN}XvSsV&+lFD80cOCv|O1@`*-uaYNxO4+qzR6QC*N^9Wh(Yg1i5j`(^ z29GG~owEbBA8~Tr^;Busv7am_AlA|$?Jh6A^P;p~J+Ce1Ih|MaqM`5x;=b5<8e6ZXXfTa= z(Tc?^k;m!5j|5Kd>Iw+RE=?y3^s&}(c*8^2K2pw)DS0g zLlcSyi|5UI=H>Byze$toDch;>e9f`v_=)n(v`+@ZW_C<&HA@owjihJ)c$sk%C+}p| zH}fb?s+$0YVhk0f&e2ksr~GA*ZZOph$7<}oTqByH9WoaYtdQ9waM(=T(phgaWQt=&XN)(2;T9 z$^|P6$f87Mbr=#jrLEGsqdp-?i?WHcS!~Mx0^3C>Ikw(78YL8NLJZ0S19DId!*+rd zHP3hSummGCBVO8TE{9`9AkvnXVt^SdCsA1R*BWUIL?u- z1}T(k6=HoHbuf~siW<<(tLUAC&T1iZsMoZbzr~IR)24+U$o33IUiHLIEOK$jcl-ti z5mtnVl+z-L97hq(;Z%11y>+tAaPpd&XXU!2D|5t+)Mj0l1FZH$hsU%b&tVJV2t`Ax5gkdIe=b) zy~%NoimzQG(JkgW?`ALddXeW762f9%pCBVC!SiB1NY?w{j?NcbYF)^;zae6>qPj#5 zDSSLnmOsnlBq1N?6(nW^A=CU<-wXeeS1NYi4ddXe-0Mgi={Tqawg;{V+z1F)t#>cd zCev8_Dv{@?GtVTzVNU?RM27=lWz)&{n^BsZ+5>?*0YPQax4-_zV_hFSNT@vcOto-ER+(P z6~al%7|WX0(Uw?Xn#lSGs5WBV+Hsd{qQfYdJIqT!+8CWfg|(G_c-@wMvy0Lh3Zrzp z*VY`}dYM*lxg-%}y4KIRbGiUr-BHpDZK?KhP3%nF;COG-S--zr(f32^Hg&Z#y@U1; zSS5{hUat&d@nTv7?oLqgsjde6J)Lq_ zdlRrDLj{%;xm~}P(n(Zh6N>ra2Qp|CY~VB=U~}Lg;P7`xtzZ7Uyaq)21@345XD#ID zt|Mm7zU1Wg6xHvD>KLih*$3-0dmnyuf*Pn_lSt#$_tSjQ5wj>}&M;hcqzl z@^^T;&vyLB#ut3kWkPnGmUmgF2XGZ)R6|s`c@8w3^z>`rcn1%P`};p|KkWGx2%DrJ zy+zotNY=n(w*X|)(v|n$eGJ&X)z3|SQKlB}N>^1^-HMVr zJ{9t+{ja31mBPoVzkVi?y2*;S>U@5QBCJj%3-%w_hIfn_kKOXeg$e-V#jW>pwC2ov z=oYu$S;Eip0gGy>qBRG5*^f&#>evW~9yBG3vu$fWKKQ|WC^lSflnoB81i9e*pZrQ_ zIF#A3HIG914-Q$_AlHUPDf9tS{FNu)Pi}$O*jE48kQH}l;0PJJw*~HojD;=|D)Sm< zW~Q}eT@gN@*20&F*T2-UhZu?8B_@Y4QgO)ST1R)TQ}zMchfTm08;)8pcN1tg*4s5d z1tHhS9EkPLV{P3X8S5+VxHFD?5&!|#{-HVqZ@Ya~2b|7Lf&GEwfjdZlouN3|C~vjm z*1FS&u+T|=aFnfhFI(qk&)0*+ zq%t&n>RlB;zHH^bB<5nZkNW3S(Iu0h_ko^qsvVIqj?kxR?(zXhW8VCK`+H7Z{n+v~ z=)e0io`0e@a_`l>kyjveB{fW0Y5QKJxhcz2UJmo$m68vVj>@i+^*r`S>=9F4Qq9;S z-Rn1CsJ3+A9xpNtHqa8~#K4jiard#>JlCNSXKdvY`TSs?#7kB*YKbD5h1mShdn25?rRPsMdM2!z%rM z^E#IYre86N#>w?7zop|Qw-I|gxcWc8Tw^}bajQFyzKZ^nw8;W~e^1~VFApkJt+U*u zRU#WjefX%w{1}BhxWsz_y@c1+PJu~^p?||x_=w6oV#Kym0xyU9{?r+t21Sac$Z zwE{2bap(X6)20ik-2)+2D`^T5zFiJ&ESwc%oN^?b;W;~`aAHt9%CwI+kB#sJE}wef zh2QZP2=ms?HP-#EUqG+u01HXuo~ZNZI(o&K+967)oBvGnI3B9GZw>q8mkYb9SkrKI z*X8teq7>`y&5m=iRS8Pz+kCm~#|}gGvanOvy6k-KZlg+qV(} z(j0;)a}Lpb>5++v3Fzz30uP`;hOdV6_x~OZ8zWiwwsY5ig>z*OuL?GEQ&=1>C*VPq$34wQiuOg zwn8CG{=;GQ?$FB3^b1wdK=L@o<1+bXVVcMR@i-A?rURXJP(U>9Uio9|tnMFKyNuiG z#Er%oPDOXzXlpu2KC6C5dDMN{u_Adijs4_u=fJN2`qsH;5vHCIW^kH_bzBtc9^(M!z`m*k38Sf-Mm; zWQVp^BO)P!=LiiHBh{@8x!}x=zl#OApJf=GducS8!Mct!$>>Yx+|UnSd_oW~;{90+ zXmUj#pk{}t%-sH}6~H0`*_Z}@Ws-%Nft8jZUr4S{S-llWmnkIc12dU6lv9Rg_*fJF z>I71Rq!>#dQab%LB;qmXZj1f(=S;0l2mV95q5{UR?92(qy2z+oZF@rS2kJU?0LkG%u4e)=|g1F6>#jgv39Nh919vXpPdGPzt2O)&ug zfw&N5VRC5n0C)@@H~^l22bMi#^0Nao6a7b7Y4ceY7wO*Peq$M=b`-$M%s_utJj#ln zrdjtoM)7*MR4(PYS7>Arm|2{mNxLCZ7QH`aHV-!% z`=C3YYy1Q3C*HQW@H4}Dxna|2A^IVAlKZW@h~P}^qGp{iKw5+eT{Qg`RccJxhUx2#h| zv7ZGX{FIvSvm{HUVQO6ZVP%ZS$Rk3=wLY} zbEPr9GF_fZb56{u*5-MUDvzs>H;@b%Zbp`ZrQRbyInrASN^+>Qd0T4OafVadHkX>e zvJ;7HVuvj6jOP+@6p(|3jho|#4#hWbECgjS*qo_9BpM8@$}%*rTlW;{kdge|Nh1G7@J`>u9<;82BG%{Q2u7v z?q4UxM}w{c3~kkz835^-{K&-s0O}zNE|h&qKiHp_jm6_+9A(>R@315Wqn2K;*HK_*fJOHY%vd@an6jfI8)R{~ zHFP)KlY zZhld(-WB)OLl*y#4~z#k0yb(_%&{Lr!ILM%OCY0`ywL&C5iEgN$Oj4qItLW;qoF=E z!IT&%11X98kWo<3m8HA|>zm8j_y8rq(-M6|QJ&w6l!WpSh!B5`MD)zZ$l34rb!J71AvR$ycSIF@2}UF-8^t^y!J`b6Gv%Y z$r{xUfIOP^Xa=QJWL+RHi|oY~HTFRNe3rx-vx;@^%U)X4&thep7FrybJYmP=oP7dI z;ZsRRolxVwq29PUfu4Z(x1m_P2mUs&_gS!mR>%t4d%E_8<|NGZhp~7=NSp0dV?wSN z6Jkg(7P+XRIF6Em;gf-Xa2PfzzCHUiV6MCIz?A=(ratS1|4IuBIfzQDcC1yv4wly~ zrQAX#&lu_7puNjIsu=PQwf-)$pnYGL=y9kBYpJztN-rmwH= zE=rm;P<(#$pl{*w{HSX1mc<+DDB!02 z8=-f9iM~c9CIpUTbWP1c0@hsX7)-+e6-BE|1M{jNIiXJn3u#FL2r*fJ63Bmv>Mz4w{26I!WF+Vx5^~h{aGYs{OMmTJ|Q8f%LH+y93z|^K( zSyt@2z>B6#sCHhH%U;~wY4jzCZ|$WuwZ~}MA;&}*l5A5Mu0}pIVu19R-MwNF0r_rB znD+;FmUbumvW;Ow9qUQvH*Dri`KF{S^tK_#eztpV3##!UX=WquT(e2rcfDY}?b^Q{ zIlW6(_`>l$>E@$tx$mp7r#ookIN?KUkiGRPrVH|^eJHEnR{!`E-ephO9W9g9wp_6Y zWz3R~ySlK&CJLtKGT{9OXbx~t39Y({p^noAA&i8(Th6$EJZy*Rm$;ps!o;HA%VZku zFVUU1E{k41Ef;UJMi|tM?W}@j>Q~rCG3o7THhOyTZr;-7Br=($InCm~080uN9~_LM ze%%a(=o}4Nrk?P{?~rGq!vCV~&BNrl%6s8DwVYFXS65Y6^}cVjsHbOodXYv;YqVIl zWNBo{l5C7TUNK%^ykX-Q+!*2rE{g(*F_4%EAp{;stPno|5&{E+d<2pp5+K}c=#tBY zJePpU{X*adx4yGfFEbirnlcuXqo!U>G^PYG8z4%^4X5##H!8-(6Fla2INQelS zH~vQ0m(R<7xH{jJECpVGiY0aD??E3$0b0!c`pNc3ku0N+womH!gVm*_VSMs1-);`i zVV83+vxoLhBE_0h`A09QsaD{_-XJb6#uWu za&@s(<3w)E2gpm*N14h6cv&Gk2UU#>ksiVIm6#_ZSualQwkUj*wR@_l;~FnkiB1+{ zvEpRL^erdE^P)owK!RWwDr9D+rY@^*Q)OA*R=;d&Y9>=aqDD;jTFHPCFzup4)*;98 zIpyN_aKHL$kbAwv)$usp$?fM36Hn>^2j2FON07qs)QBIFL@?rS*8(01bErUq8buSH zW0I3clI$Ur!3TLBe2yKuGQM8K~V3>~1of|up8Lx zc7I8*1hp8E)6+>Ggh}8U4@F(HfS;UB%aNk`Jo`u3E`WaTD6!yifvkmC9=3Au0>tr~ z)=={mNqE!(ED7vRXrTQMYav@d1GejSNPBpnY{0$X4222&p(y_d$zlP5koHa80wl4B z07F2$zy3`v1W;a-(T`+tVjLf{M7&uB%68nOEPR$2B<3lo3|%zpbF(`EwOKHPaoXN2 zA&uwbos`ZJ_;KW&kC!LYei691N%YUtBE8;Z8a$XNB_icGl<{$P*bihQ+)*xo z9&XPDw@9Sl6743V3|YBhiFTA-Jeea1{$L5^aElYu0@}v!6q?KqmK!M5)510YK4$xj z0$k)6A@FV8)wkw*`K`L!|L-o~Tq$Pu%-B}mfEq+XK55(FFy;Z1c@nA!jqjnHTaVhU z5tLlZj@I2AO3r1=Gq z(zxVTBIO|*I|J$uG6u|n3oLB`eKZD)PnQ?DzyXbuDWIGjtUz}hs)<1{vE`WoLeubA zxynfw`xpO+e*^d|mfCOS?&lumei_R=m{y@cGeTi`hYAvs$dBqthz^A}fy5X;NOaQV z$O^?3Et8;jx*%byJPW#{a7UEXQ+zD<|- zf~4^wUOfy2X}5yrL1Vp~6DW*v?@2`JDCc}VC&1KJ8Wzx9TkbrfMF~iOCbiNG3LyPgQ7M%u-@CQId=E zu7TyT3>N(qQy~Z*{r@QM6@^t2NB54gtR_>6{F-ew&con2gDjV=Bh+<@bw=+ucMR0i91hC?Q z8doo{)h|GJwVlmHc3u7Li9kbJ%jXhr$F96CqsyARN1e~sFDvvdP=ncH0Q`E>kQLteL9^1&!^%BvirEEEg{;=m)N`!?eL?`&`lmt8TK}@BQI| zrY(@8=~>hVh7~lnBPj*Z*14rGLgNP2(=o72a6*4Lz#AZ`)vV+xy5Sn1)GsJI~)v zR+!Yml!RBeODPz?T#_z-H>)Ol={DmdFa7~-`%?i{$_yRe0onnHODC4M0NnuZCaQZ9 z5Zm4n=&lU#D8l@)RgLj>DSWoBi|XxBoa zhwkESF(j&j#FvxXJxTsB8SEdHC2xDO%u9lbciQ}2WAO($>RmtZeH$?cmuQZq@m$3X zmb|n{`MT0D-;P_L9w0RP1u5tXs$v3Fq+s)y01<^T;rEZ+J==emjD=shMFmKi<$12g^c4-DM>MjD6=NWa=R;c%zOFjPjLzHo z^@amt^%2Nw9mRI`w(n%#sGr3rVCyI(v zBIQh`3nN@02tI?UuS4*i2Qp-dxf@aI;>IW;>eX@({D+kJG4n{i3Tar98Pra zqjsref6TV~{~A=U8bNNbK9*mQ`t(ZsN>{Rc#N`!F~e@LRK)~8QQhZ zKm%_H@XVRbtM3sFse>n&Bfn0*$FCp3(@qD=T89rmM?DwV$r#;DVGd?19up)&^=|Hw zO>+BH&-`l&y(CO+`ZiExVK%B zwXESc$KSX8g0~`@TxZmZ?H9a7TDX+xbHsx4aL=oqb6FaOHE2n{v%WOk`^Hj&e)Vjkw3Hp}Nk&O2N{$|uLc_gOH+b<`EK9u} zx4T3U{`PQ3aJ%0`M3xdLWI+kV;o#bVsb#?l@Z z6>h%fb%K*k^1z-p1n^$l7PIKs4ZDxDP*zMu-gAc4lS2~6_N%qm=Y@Y{o0w||Pk(7j zbEA`!(K)S<1;xGP-;Y$(tx)uVC`D!gn6eVk2}^k948e?AjyyeaAgAqKp7{MpT8RA) ztCzy~nDe3OO46UK9wD2OW8q!HI0I%s9azaZDg-oKf-#UMYL{lCIa&oeJR zfgX7C*m7jsB+p*MU;R<;P2Asd-x{-R2U%jhVY0o-f6;ZBy)NwSIkd-Hq{}d!gcWqoG49Sd$F3l$ z2j0*)3aH#82~ec|*`mrE^fWctmPG0K4tRuqqt*YU>s+AK>3lv-euFTzWy6Wy<`~`O zZvVoIzVIanEYTh^zxi>v@FFin#|V@2TiiBokzh3s``G3Y63^M!B8|$xs4lMimUH~# zb&LF7x||Cb!&Uk%@2Zn;`Q(*fV`F7I`yA}qrP|_RP0|KymL$$_dbl~y;O1Pz^8eb{ zNaF^1+lkJM$MaPjb7cpphwf0NerZbIAruwEooe_5nQ1VQP{3&-=F_R^N!$Jv>IHCy zX8T9> z9?N=6F6eqV&LOAs223_j^QM(jxek@_e(DFqUm>z|jX2_e%rkYjFWm4Qy zy5i0&O8chcY1>Y((fTJy{S&mf(A<6G$nNICxqLdh)pfT<(}7?88jXV_eS<4)o}Gw= zmyYt14MIc5F_4Fui`F*eCF-A7P@QEJgJix#oIZDp{0i&Nbp*Jp?FjfTtfke*D4X=hd>RtLk>O z+phKRPdQ5|XVpn9IVt61y<@mG z9(Cu~^65)zj$cyK|K8XJH^8zd*aI$iEby5q&`g||BJSjguqRRMD2g7qz%vBpGIdr7 zMu17sb}5MR07KcM@E;5`n&dIOz0=rzNam$b3T_2aKPB+d@ElaIU@FNlECSKAY5R@# z!1X)8>O&uS$Z5!eAYxf>>lG)S=1b9VObP)c^CCV{7ZjcbnAp#?V~De`h~L%b4w1|~ z+}OJ^xpq!q-}>i3jg~y>Lq}~+6^{ZQREXS+pZ&!4##Bw_J+u7KM{a#CjOa@%!L_D` zrM}u!V|(|usBPZ#7O?dISbW3jSPZv>pP6VZo+h~^tW8j&t<9_7obg397HduOcOOwz zdugsQko5y!yv@AuHe~up0l*yKsU>}^7@%D+d-&MSk&H$3X(urSxCzsMS7Ivg8t(Pn z8;Oh+(EmaOGhEc+G*4JAKk(>i6P7Db@Z#b?erk=PH*j&_-9gx{KuzcQ6|zZe$N1m^ zU9t-DL*B@s+{TAA=#t*S13y5jio$ZykbvZgrlid*00pISS6rCUBvbT6$tcR<;Zfpq zAM__;$e2oBQ%X-6p*th6D=3FxWL6RO(E2%Qx!yLmSMQSD-~2i6cIiQn;A_rCAiZb0 zgl~F?-t3oX^#jzxeRj0-fJpWRzCa}35kti}J{EBrd@Ix(S5@W99#b?j`PL`i_o$hR zROr~EhwhXbb7_$!CHBq@HCE?>HD2tWk9>vkA723}8#6)6wq+*W!vKM#>C3WjCUNnw zn>4>W(qAnN3d%j9cYclVA76Xt56q~#{}Z3suSQKnopzHz0ue>iln5>)-DzzshY|5K z9+&ai9FzeYgXzwXSfkZ0mZYg+WQ|xfsJkfRdb%GRJ`A_+9?j>z$2cp&?l#VDtiSIm z6?RofrW&fsz;}Xb7pj*&!*Ktw$nqP1lFr30m*h_1CnA*0rxwT^V1U>=aGUmje&qb$ z+jZ4~T(Fj`kA=b!a3K;7z4{HOPru>xxfg+$AGcn%=jc{T(YEXEuYEC8sf6Binq1`V zFPzxn>M`B%EtulGdW_R-7Rdid1OFe-Qrp1)3laMNQh8vV;cS!ja8Zdgf@_YnJb=Q6 zEKv_ImV-Gc2O^-w>}cJwAO3py@5fA8%N#Xv&+8#&wYR+7TV?D3E7R%~DwVB_xiXI} zS172+$~kIN`xxsLW9>7`?IODM5<^mE@WJiTI|n?_CFRDPNC5Y1JaJ-7gMmB(o)wf^ zJ0I=bst9tV8_h;lR~;_9k^cXw*L7VA&#@ItTlW@-4CNKux4%L$5OmI4(Wv#9s{Srn z|E{V&M%L$hS^P4QB3*7D_|gw!mgh)ZRVnaip8>u*a%yk3QGV##&TzroENI#b@s&2o zaE&TH@)5~%T>;M+l78bs#Wd~|HCcvx_d;3L#5;LjSLK5@>XPw_Ny*hu=f${~Kdrmc z29&CEpBtBIM3&D{J((&Y#vjiLiBD~L)Tn`H2LmmL_OAo31Ho3gwggp4C9XN zC~VyJnrcj*OEns)IXPC^#y;K2e-CX~4l~O?7Ul;mzVh`DpI3 zqYz#BNT#|V0x&b-ogit11fXt1aANBepWu0s=YdP2PF)}q2R7VlnRT^vBf*!NGCu*) zHWdh>B8exwi5Va*EFU-}p4_+KxDr&t|4D1Vm9GK>wU_M!w zNP%G&F%d5()QR3P;*tiVAaJ9`-VSExX-+4a(20bEQwJm5t32HB&G}}fO|z!skB7e` zs?6sjsDk?>vC<((7epGvvnU!kEVYULiQNo>KUgnZ?qNbCNIhE;WXv}!I}YzqqP&1# zTPR5pL6G@`l~JQs%;60HM8y^aTfyJW#NSNE6+k96G7ta&8t=rcsG6}7JZ3E;(*6yC zY5(bvhGkG-0g&ZInU9obXUh?u;GFYWd`a6Q=f$((keznIo|_R13cdpf3HZT96W>i; z5ye;1+l#nL2;rLw0OiDt>xG@P9SUdT_aMAZbJ~f2~(A@+RYHW+2^!oqq`~83SzGr65Y10I@sr{?! zssE~(Jt!_g@;eK~Wk`PK;F1W*?<`!#1^fedB7b%Xp`}?L9g(EFMDeO`Yhj_q^DQB) zeLHW767T?)MevH>f>(T;ZN>Sp1$hrhVi@8hq+%H2U34qXOJu(OKe!z<+zz*M_izu< zNFBrwb}%P98>E(<0g<5!tBD4=XzP9e4N)mmuTa{zG6a`@7Y#6F3QMBgq_#b(=8Uw- zl+VUJB3&8t)fLw#Ug!|4cIGTK)0DNP)Qm&~P{jZf76}`e0ER*;q?y!`CU+ugY-YQL zCzn_`cjYt^<#;9?gQC2!fCqCdor%i=oIaE<$MC?vIw2bdO!ZQdX`%#pZTj9_mEsN+ zPP#c@x~8rq(~3=G2wO=f6`dq#&AF3M-5rhX>*2{zRjV`A{a(v0A|)JZWYUe0rl4jM zDO#wJ&NM<{1r^@O21~+&u^7T2%jM0YRw9LxCSJ?)pIRmVn4`<` zSh7oL%84_NrkVvM9{%y#=1mYH+=g?KsZ)gL2! zAFF$-j^RK%m-ZA3r1G|8VWE#&3?7T+vWC;^c9+TJu@qPy(*+T1kraNfIs9G+xMSRD zEDzqteKhb29}nf)ywqq7GQ*4|iTSyU(mFvV(%9&svcWFzt<$Ns&Qk49k1j8am0yF0 zhAe0AeZec9Md)^_YplD_R9NTMszHE`!BVlW5jk5yXV22G^bO0bW5`)uuhB8{bC>@5 zY!LF^9d*cVr^;##hd$joXAm#KzGsx%Lr{q#;YOHAgQXm$BQ*6LZsTEqMqm;xP}#!d zS!oR6uOXyG_L1AnRiEF}e|PHCzA0Ir+INa&Esi_gC}tb21c|Pv)~22ydtnnZhgs0= zlm7M>$;_V4R8v)(Q=L7T?KGN=VQwCX6p<{b<;VfH%>v!JK(Zq_JDW|`)q(#Hp$nhK zbI{AU9;ORS*AV#srko;LqM}e6ZP-xNIFzcL+^npGXF@9GNNt`sXN%rM%tJhMG||MO z9e6#y2fG_y3B84hn~U?fksvBVL7WOHH-|8FPi1n=gPHoQ4<*QpZX{!t=gUCO%AsU6 zsUhTwAy`(WTDDSDWADa{Tu~5^VTYWkCg@>VltYq%+qX|+jn=r|;66mOz(o=+Sf<<* zrej29lLpLt4mTqS6)=S$%X*6{bOv$rum*OLq(>xLs!ctrz_CiQT(TTej+OX)cs>^~Ok(;WtFR!MsW=Krk}QA>$1;_CsOwPufc4|Dc zPq`BDTd0Y=cBIu7s7fNpP5{oG-2FQL8`qTYZIs`&`=tN6AnNXAdtRn};AIn!-E&#~ z<@YFguuFT{o|%c4jr@fOUXqMw^yv`_L{q}Um!>XeSrLb1XcuS(13LxyyBsVb_c`Y- zEJK6y7IBkYw(80uO*^C9e4+fD zM$>m_F&+S$glYlLBXX)}1Hi{LATG@8-8&O;B!nqUr&GZKBoCo`|8rSWAM`|#5647Z z7h_>w6g_^=p5;A=mtf~`2bie;7G_r!hPDY3clnZWkMbR048F86H_RvBW>Qmxq2jX8 z4VKxLc-}GrtI6Cu;g zm*7eSkFaf$AZ}u1Bbq!cl{E(;qdsg8B?JNQaM^eyBJkf-Juec^#%hKgPM=&Q_~$&7 z*I4xJTH{{4YYW-+#`NiluoLrh2fW?qRxgm?Cf>AIlvDqibLYF|lWgx0my6^mPLK$a z(!k|?1UWUxRp}2A-360ECXXbF3?KkB`~v2@YZNl7R-?F5V_O25^*?tb%vu@y)HK;R z>ZseU=56isn;jl(ecM#)s@Z>I#7(}R7Q?rLJ(@9mZl2_T%ZDE>5)h}%lg1Q zgyg4uE^rV4j$=7{s&@P1kKbOK)&<@`{K8w97a;G+tG@)1x2`EAsw`0YZwQ2~!PH7{~UN1N0- zcSJm`xqfr8>SmiO&E`tSuYKHgt5x?ce(h}4UAx99p0@4NMdzAf3FO+RPMrc~xs%JC z%RPcuBbn&WsEk`75fSu}!njkmbEI>I3En^j%S5EAj7&f?LlgQ@p+Pt_nQej5R7_E5 zECK!y`$b(W_Yi*%>XmWvfA#d`Eonc!toPglj>8K=B?cgfRRn=wzxf}MG}V9RTO@q< zTfmxarS4fVv0d<<(`dnq9`_ z5fc3~Y{}$w$5_rTcgepo8LP|fCH`V1kEjnfgV!0BDs(PuQen4A2`pt`BGgt8Dd9(z za?Kq7Y8e2zP4BomwrrE?YubwPKmrQrV;@5TOgx|{?f%-@MUF`3Gm z^)Uk?z+M?^eMyRFc>-v^;Tj152ZuQSux^@k9=ULwDpkV7~=U@$H#xfK42|XP{ zp<)uw|E7j7d8yN>F0HIARXfMVp@F_b4P1A1mO3k|E1ji}4{&NJ@7cw?XM&>1A0j!* zs8tRXHmq~u9HMbo#38s%qfwbVtB)t8jVjFHRDMR5pS0gB%Wtsnk>!_%`xihj++UIO z3T86*^ZVtPR?(%nq;E+iw&)Ug2|-6C;HsrWfNVrkNpuH4u-xtc&_Gcr$X9;(FlJq% z$k?R=>53~Pps$n?%w0H9S{{H?z#;F6xHMPC??;h^27JE1IUfosdo?tjVckBUPgYve%gbi89o(PS2r-DPc6=5sgRQWoPaL74EJY2zVSvGuh9Pe!>#|zIM4^^ zB|wLYz2CWn9Zi?xS;rvV-Egw;*U3UUEnrz*n3|%iU~6(xkbgk<(%?E{_@Dm|o&gJ& zM1U>;XS}0_u#Ary;|QCvA2bysW~dVrDqbngAN2qEzVD7ni&tD>D2`%uI&^hK{|{DI zxuO5ZDmO(lLhYm0hsN9}^$QvjIrcRJM*sfsBscON6M z2ak1^#+42PGh>ZnX81&_@2tZInv*kin_QCDG47$A@i52VhYX0ZXpZ~ny|7j?}JUQ7i5z2Zao^g@#UfTzeRkR7Q z#4yj|Mm?WJRFV7%5S3|`ghC#bD?wOkn&c3~9UYv^OwQzwHsqzk#9i0(wM=fNQ_ak(Sg5LY624uIhbved*ew+;q8>yD8T!(S z01Uz1Ke7KM!5qhM6;n*ZyFM0d!xO`j=R*b(7?_^N&Fp}@43(bPIV6;$2KZg6VyD{2 zuQ6W&i?w{qwCs2p^sfp zMym3VI-4OKq1+MxuQDBgkRi?C88PXt445w zX$+XenYjOCF&|gQGyEc+Louyw`xVkZU;w*|%B=>;c2p6VhSMGlk-u`czzctl#CwkN{5vH@+;P|S_<65?4KG4)$XXH= z>76`J46dIO(fzk$Y4&{V=9_Q+=TCXE*uk~$6L?Vj4iCLWQR2Zhvq0o;6cp)QAC%<} zrU2b9Jd}8wqzE_iBIth&@+WyoT>R#*iL&?kbLZ%H{$osYzeIB$76PQXfzEpnvq%^O z^3F8ewA=(A5XC?JQ&IdtHv6xP7M}O8;W12cZyBoQ$a?y9rY; zHAh;*oX!0vub-TnoN&>;MQeLuri-6ku);AReSPb$82$vYIZ-ukQdAiwZN)F8%-_|+ z065g|^V7TlK0~x<_(C*2DG9hDQk73_WCWMC63B%_r-eH<_;Q2K9EhhuI)z2R6V;F+ z7UpbU&Uo8c#Iw*6$JxMUcSjSR#jak zjF#@=WzW^|@>ygUnA1hIDJY6(cmv+1X}3Xxmr0z?K=Ile6+u#$p{$^WXu@JtkkHpn z(=hO+2&ZaD{Y_|!4W!^h^lOnMM8C7?MZVAT{lAsvXKlUzZCM5h-F}wl50Hlb#e{D^ z!reykzX+qY&h1~Iu7v}YH}kh2Xi0pgSSwSV8r#L9+iBC|QyT5SJ)dGK4xRN;x!I;u zKJLI5O!bVZ_RkR!;0w#6G$rKeWqI0;nI5m{vaAnFB>7oUGNmG3Th^;l52^@sRI~qa zat&}Em%eMsG*KNsf~l%~%hDadBU~|7d{CAn?TRE-+7VpJ#N(N#kqUcgtZg(rzZ~XH zbFUy7(DDQ4+K5l6MkLoHdACTrwAq4Av%~oQouEBvu;9E3bu49DxkO2pvlQ-8)AU3n0fAuhyePnUB_kUJ5+1)2FK5Fc1`ydl7ci1RM_^tKS>YX2 zC_Pn87Q5XZ>>HY$t6EbgF>VuA`m_ao#r+}odG0)JwZb$}tZOaa1gB>VV<>d__F=vK{;*>jU_=OmG+aq{Le< z#E(Kjao5x#j6VBOwgxs^|07$?ty{f)vr3SaAH-vOlOG-=8yzT^Bw#qqbKEiTcGl8h zLRBlKW(`ZDy6z@>UucP2pSP1B9bKBKfpDt30-%t>E--^9*EY%kQexi9%xCGGb@r9v z;wL*IJaOLYcC*=TFPpV2{2P0}?EfuC?)Z?Z8u}Nr_=s+HjUHiTY2J-bQyQmoG0a0_ zDZ+32)K!gWC5ZnyLsKA(W=FBo-pQ)#aU5xjm|W$E&^samQT4yEck%EWt2T3()vUuQV% zqtNbuneSglpMUZ6#4MS%Oqh#fHgYMDlW89zzLpea9Z(*%Ji|xokukWrfn}A>z`JNj zKohQGj3W5?**hSX3uy2HT{ovivE0nmD33+sydp2^LW~#V84#vlX1XiLEAOJiBs<-{h_S;Io ziilh5k8~}f>EG70Z|f>%ZULvK^;;Mpb>(LO{|ThDyKj7;d%1!>!Gi;u9@Vuks_GYM z;ajSD?L2wpGnD_n07!qi2G1ackwPUs42@F&UM7jn>fHsvR9QHKiN8M zQ&>OGZYoFp5D%1J1wD!eOR`DL4X{juiM&90{T9S*97Q+v#bF8T{+lc2GKpQO%&u}= zujsLI_s9*7f6o<1PUjRQM;2gqRP5b#`N;!mqf-ut%bhbz%hSpK7tj3@W51DZjqs)( z!KtREupBjQwu$#=2>9&={|l0+IM1#*3htv>HLoUaEqAXD$%>4^VT4y;EfhNR-g0-$ zC+;BTbdM3g<z%Ax6MYydq#I@=4&yQ`~M!B%) z0qVp_76(8S^J=|bue%J^mOqY^>L|Tcb-YZ66Z(Fi2~b@}@q)-7 zzD{LKHwbA@_S``aZVh_v0*}WT9Lt4Sz}ynQOrU!G>)J^&Jue;n)h=0I2qsR)xHDas zP`bLZ)OlAZ?1H#sY^B7)3dN)=A24qvX}+@6&fF`gs_^U*UE%$h=$BHH>2i%OmA55F4Af1FZH-88`&#K+w1`;io}^V-0V(Mmog|SNxCj1 zua1P&QpnJ&YTOdEN@@DCNjDCb>8$mWWC%u5xOsZ`mzX$QRMMeaJzj_!C+CcscTy76 zv@Aptayp4=UbQ*yW3@(+2+Bcwu?|ZSUI`aoA>B2c^K$_b7bdj$hD(@4a%n%k#R5y! zPX9udpbRe7`sb=0;xa_SqTK!?(XuF2QeY+Sb*dLROjK%%oobN33w)NwskT|Pk~BbQ zx)hjch{rVY{ex(jq;5klR`4+>3Z`I4fAmL^feRvh>sv3Wc}KQ<{K4bpEaWx$wX(|p z3Y7+!$wR`zc@m#-?X~#GBo^fN?YpGr9pP$m~vPwV2CeN%9VE}1Q6$SXhFzF zU82tbZ&nP$RO&N3BuZYc;M-TV`73By+A&jCOv6y-)$rkcDrzc*X()3$iYkvn$zn2u zc(u4=j@CAjy6RKX`{MhN7YO{K$R$m75Rn(20p|*Vn#(}i5`8(orjhm3i%eCcMs9MONtmZKXL%y zO~Q9QEJB1@N*qFhU(^qL^keI?)o@OZSoK{KAco++QzArfqgc9e-P&L`?15x5O9XSj z{~cKs1VcnT-vN}~U4F^(gA^_~Fdwd^ZrS;f*laxR8M0E=V}`4KWNGEXn1N*c?{8LC zS5{Wfvc&9TxQ?HpG9}4l|KJE`V(@efb1g)GL=a?$iq1)@wa)zPX>+o`@&%+RA zh3XcG$c*_)Zs29rs1zdLdk5y{56mB?zC*X+>7WryEEJDordUD}gc)Q*$qX6Fv|@xz z3EC(FA>M;uifr^>NfEzqeZ|BbEA!;?+o``1upOgeC=I<1 zpZj8$-p|nA;U-hBuhxoCimGbZs|HZ;Us+xrV&GGICd3re#l0oVRf+WnpaRXRP-uH> z7&b^WLJNy!Bx*X6F9%aXW#~Q>xK1?iL3Y%015wCpWHFAmfVYJ^K$P< zd(usM@!ZU^Westfdw5<RTWHZLBnP8AmZ)iLo!sF1`|5Ya|CyZ@ILe4srF}a1h zV1i)Pa}46G9|`YBrFMiPEWqR$+7a0woooI(uY%v^GMM6HKDj-|a2CozPFmum#1OC7 zWqcr*kHil#A83!Ma7j+Y@+BezbNqbjnqT?#(pC{}n<_LRugY0nM1IKOc~^fcp%#># zI;^`q?}U6L>RC+x(VmG!6)M}d)LVNEG?SS+U<#_7S4A^Pn*Tm6wKh|n-aVa1n(Fzc z9vb73L%QjEs)j0CWLQnqF3TQor)yB1s>p^M#UGz^=4H$tRtrbFJe%nLJ!LMAbWQH=^wap3z%cajgJZ=(8!UU z5N!jqa{-9hC+P}{sj{tyC0U=-5e)0Lj4O&!ycH|Fw^N;hN+ccGj(-ZAs&+~#ezBHq zn$c2jh6kX!JO-8&Cg+3=!S@BjW*4B>de2fvS0nhJVsxsRIaO0@i@9WKCP%SB;Lt7` zU9JHlPZy?mp!lSFtDX`Q_ZZG$r5(eRu%$c{n{v&duI8#OAtzzuLZRhr3N(42hTGnXBGu%0)>LMN=*b#!Ft<#y?8asocy= zE;TLTChJt?QUb_g6M)o=I^}Fz;(^MCn(5}=kIQCP=J5gw!t)imb$w=lp2$&-e;hD$ z-M5!W{vR+<0k(g}7FeZdl53ZI^8Uwporih+#q%H7qy&f`!N$-0BM2jN;YcbKu^N%* zC{uhoI}&tbmieeI2wn2Ua3gnxyVh;} z{<P-k7i><+yFd!QTIrfwqf>w#`fKx|gLIKGMGgKF`%L_jx1t3lvd@&K5OTiR3CM(A|;lM;*avbJHZjL}>S=z+pdd<#$;c zcM`Au;_9Vl?h<7u{~Eb|@NRTA4zuGFRM#fP>vUU(ivY-o!gr+71mDk14(eIV_ zMEalNf#9n=1ez!Cyd_G4>k5+Cdr{T>FM#DSXMj%|imjNK{Zj=jlO4XZpx8;UR8Nf@U0h7`!6galfrdzEH^2OB{c9nKFb~B zUV`Zf;j3v5;PB9giWu|Sm=2hL;FLCZ0Ey8aY~#t=$RW(JvZhf zBtaw8@oRc#xv|5ZJ+^E2$;Q-?EhVx^*5%sqX}qrK_{%hNtpkI)Z6}*^2WGAhFLo5(+SQS{eQBe#fTgcoUj_(hwpmAite-(q^PnS-hsF86ZstAt<1hb z3pz zc;s?^vk{CNXQ&N|jF~^`zP%ki?ah4Ey2v;83VnXRY&(0jgVIBTOW@=OrR#o~+(QFI=r0^Y@Z`lOg0Do)?ScJ?lY!CYP!4RybZB zBA1ur;Q`KE7yK5N#!}uj1oNF`c^V{etd!RoPyCkm!uRIa?F9O18>v3AR{_vLlgCvi1Jq6wi55DmzB~oWj{Gw(&b_*>(cHi$_tKWBmmfzGk zEW#^0wEV^^?m3CYoIwD%W6;u@3tO44;P0u;OX2d|0(YEZkVkTX0R_)2Gd!6nOhDrq z=tMyy#9l;o;Dke=@;9@l;Yr5}tj>J)*$bx^FD#z!pA~p9VE`Ez36U3E2|zI#6(Nw` z|Dtz1jg)2~Gr_V6tP-Ut~T0Zrws% z5NESfE5iu{om&ZfD@MF_Z|F01*$6vth%3IqXKAC=w-N;U3^`A#yvbJrpW#t#CUwK$ zsV$K?c`R)|eti3msi_^+y>>KCuxq!MPM4NOP;ASi;%IU1_=Cr{Y?;jKi`Ok?vqSyT zK*l6*v71IvuG24}F;o*m;dnZ{gRou9Keoq22BzKx500t8dRcteEWYC}FV18!CCVq@x$uGN9C@wTi4Wix>OVS@t47y|_`Vjc<_=4-5GjXZ(qEIe`Tyy& zJM7top?x}orJAjm^c*r*P+zJXb0%t{+%W!^xzP{Z=b3irS!!A8da4S(r>b7I-(wn_ z{$C?>g^XS&%Q0ELenLjQAOj|eTVc5|x?MnHYThKHgR=aHjN-CRQ7x{fPNh`5 zye6q7)L8C6>!4^CC=ic3(Tn4Mo=6hOD?qdrUh#o1v!(33`9JX}N?Qny8hAbJ+aBht zc3}QAU@rtBD=-@^$#2tUn%;qdszr5DC{k$Bbhb3igcz^?2i3CvVoH?^&2aU)tkibg zUsL3|?&1nbO~u~fNalo}SJ2kb2ig7D0L34E=!}FJ z2{Lgt2Kwi0z$^apD=%{ODLn_MRkgl7p2yE8=Jw}Ayw1nBgI+n_4?ZmoS4-1^rt2nb!oQq{Azjmi>7so{%N2Cd3{5T1#iv3pLOWV9 z*NwGyLKq26#pjl%LZ+zmkybRLPT&ICfAfBX<+}+r^A)D_TT-o9I2^Oo{wESkGlH~d zG8UWMBMCE03HyI#cR(arN<4Au#<(J4nMTisVzE$G$3;nw-*_q!m%|c*JF+HBC3ek9 z5V>~az=4L1-&?A86Djz%0d6{>B~R1%<_y=Me%n+@$8t~({nto4lq+oXr@;Vrwl>Jl zy15{LW>{V=2I<^&W{)2Y&j*0Dx zd2;WMi6hRB1L_Q|IoXFWv@3{YX(YckLk`9}h=>XPH9pbmzh9PZHH)AQZqOl8Y(-AU zc$q^;OO~c{3{gK zEHNyG+FBf0{%i+E&RumiO(-ty?usl4c*1ZBZ0^4bhNvy`4DrhV;q8b5O}z!V@{#^qQ7 zdMT!2ui@Uvy^H(M0Fh;gutst#j{IK6eNKI}p;x03APVhJmBRXpN~2lu*8`C>{PmZJ zjN`sPFY3xgz+!(v0@(W1bQl1R4u*fz!~CC*c--ue;jIsO-?y!;RfpBt(Xro<&&l{N zI+lTJRNN;?FCl!WXp|F4kY464eDgq;kHBj)9Q@)^@X)SY; zWJobdx+$mW)`d%IteYe$rs+3jw6v+NSi08l4@x<*3mV|E6Z1>WtGxV~$PA|Jc zZUp#2X?V+EzGay3GN*GEreB0U6e`5Q)Pto+q22HcO)1btpdk;jSt{O&J}r11lgXxEbBe`PnVbV z9#h$@jwAZAcxx(7Q9lI2*Z&5VP82SQIk#Ojl7MK$3e83Vzl1bHU1sOtY@N7tkg&qx zJJD-mdMZ+$R2DT zXsvtmRBk!F`=u}4UA}9kSoQwe-jzUT=9rYLI+a<5X&?A>HO73@Xwc`_ZFJqX^f08&7$zmMlR`YfJzw&Q+v6Q+U>Q2Y`Sr&1Wi zy#&#_m4P2kd*HV-^k5?P4}xccPhkqeLYM`zP6!XQ(MVJ5O9k&jIE2MNEaG{JVHk>^!54@4Cao5}IK(%}`1s<6 zWQd-f>OZyIbDSPN8f39t*drxfPfi~^IGxmtdPvb^L69{iROdMX&vAduzaI0%1Z83O zz_vlXy%+*2^Cc&4bJTT-wqSdMBN&Or@Q9t9Afxh+2l#SZU;z56hG973sRr&V9sMI*8t!fZ>;x0C0r6cjH0E{*!l&~Dh|#J z@DH7x#66j&AF2eN$tjX!lsbY&0%*6j`;QUi;gmpPt0E#25O63DCt zGn#@*B0^$TA|@o!A}d`{vLbS|{%3;l|o=47d6=n}o$#_jP43vgjnUL6Hh^wt5N@g!E3 zyAbI9IDcq2Vqsp+hVA7|uT$T6J65LT^5TD7{3Dw4VTw{s);~z{acWW_5@e01;$)j* z3j4dLKkA%6ke5k@E}@`D}eTU%nv^UR8Q|_3tF<@2W2^2?dlq z**)9q-j+axfFJlI^)Y4fRJ({5$UqA+H$d+g`0qlh79mly9xIU?yA*M`P3KBHiW#IE z6}O2@&H_=(m3*aDDL1!+03eh$F22V5X``@!k}4~Ms32oDOT+D^2ne<36vxLko}FICfQXQD&R@?Hvtd03Hdh?nj^jq?Dwo z+vbpt>qJ+Jy2yYTQF*h0X18e?OiI8&5l?qT!F8q@BrHOeGJ{G11^!A9)9D)53aB)- zU{RA)jeI8}Nk;-FTs#PN@)S3XWO^KGANt6wDMrImYhE-pqXR|IMIqGAPson_J;Sj| zi}f$6yjjoAX%A7K!28@#RWZ6oHYW0dE=j2}53aJ(j&XF?jaM(&2Sv4&gp--h08$M1 zpP$mW=QS>lHw2ik2$ace*nd_r2cY3zTei(*=XW~QkIV$7l;F_*o_Bcfe^Kt*Ab7rhKCy<(HP z_YzZu)v2ykJD5XRA$k`J)M8Fy7HMY2%S_|dx-Fu7CoVK=hO(5H?H0&G9rhJtX^ z-6GII+5aw{mRi%$6pohHrlUP5h}q>1Qup?tLC|3g*weFg;JPa6EN4Xl_M+1PpULKZ z4a+YjisH9p_==JD<4o!&HU2R&e$}UYuM+BthIB%u!mFXuwyiXmJvA ze|wz5kLhF#GI!Fm2F~vi#esNzKzE7W;OY_G6@#_o!S#8mh(n7+cwLDRu#BBSWHsrCm zkib{DLkbCgSUHNXO^&Fm_{^kQUs4jcUB2&%_wKuVA9-XN6Bage$0?m1%BYHI`e~;KE!4 zztMX9-ZnvNYXm>gC1~3hxp=vkt@rSMuvU)ud!!O{d#lUzU*H2Yyk->hZv}1=&y!7# zqx_mbxO$sjmyovjC6a3r2sSL-mE&tYcH0ZxRR&MFN()`UUF5oW6X0j) z_1DOQtaV96w@2XRSdk#aWxEdHcYZR&+KO^jZjL)LvS-?JL4Kz)^RJlCwWw`@a$Cg4 z)20DTdD1I`WAL1xUmviG*)s4jC2$j_l5_|9tp1OP-qEa>dv#yiD;YZ=N?)hM9i>i$ z)W3*FoT~uXVd77A*ySS;!1AH?uTzklq^>tq7ipS%HDBK=eq539*-l*jD}2JNa}1y9 zUPB{w54#z&8l87uh_4-2;AU{B9AGx7R_Y!l-G#E zSX6;21;5?aXjmW2tzG(VHHsoJdb=R{ihUiYUT&6$A!JlnK$HuudDI>SnIWM;KWl@^ za4ZxJ+)Ur}N!OfA_p^kSO|^JgP^&DKY}#<#_L8ksV~QJBp_`^ zNSB6h`+ieRPm*LF_{!=qw9GL)`J<+rKl=aGcI~lk-1q%{clWyo?~X_Ecsz=tL{bzV zdRU^xrz}fmXgPK)FH!tL;-oemFK$*Bj`DEh&RM|B$(*&`8lYaAtP7$H9U25Hrfprj z2hgZ#)1({PdBEB(SkMYXgKg~}&4BI!v^nqhxH~>X`LSZa@!og5-`(%=eSSV(;u+7{ zKYu3V)9zbyGSdz?Io21EY&F0v5JW?&F}pGU1SJFum6@_rBZpa+OD#f^v0eMm6ks15 zV%f>z4}L)c9nk16V**s4`oWvH>X_RPPafWG#*JM^R(2>ytfziOkwl-S zYQ86M?p*1fQZ|P92%7m?p-?C(dq}<-<<<-_B{ZHr(Z#QsrR$VRvadjo$4;lC)Uk`P!n?|4g@ivczw@hahTqqI&BjxrhLH)5e-5BB_Pyse=Mc ztkmcoU_q6QB#0j*JtF2PLy%}?t4?b*4mU~zqRIP@1^luhiE_};b^Ft)0566NUevQ_ z>{GS<>G7Z;4+(N~K#1)cFdtTU$rn&w+!@l3u)=GQb*l20cMa!^;nTV>0!4BI2|lZ) zWE{?@L%$$u7C%tV2Tef;?NDNhq?Sx6a7Y^TY1_7i0|PLQ`Z%ADadXL7BoExp+{>Iq zTIVColgu;3SEYk+B#b?@M1sR~dk#NTq3UHjwkb@un^wi+H^6L{g;LvygO$-yN7D*z z!2(ZghLmgBBZj}mLg5nNQ<9v{1k6(*EtQ?*!6j_i<5VH;@Y89L+Hx(TVWv8?9Tzm# z-XH;wW1F(h0yqO#;)iI^XkJjcDu6tz1xB__-94a6=I;Ei$$+L-(e3@%I5~vd=oA2! zt`4TKY(5fGbqjzgynhHAGsnrD?SCbUYRCL8OU5Vh0b$04RHQjsUAQU7m=nyIcDBn_ zOK5e#W2Yk>G45To;nc55Js%Orz6MOIm@^0(CHW;8dKMp zsYZGT=`8W^^GWqCSRc!vV-W~PExT3!^~D`np}9s%*# zh2uyU8v2T=6^$L^?q5cdr<34Nv%YG#Xi5$3a|up?LGqAhP+72KO|Z|?=vOLc@IF*3 zybc~$)yrxP{Z#Ofs@gB0WfE=wNJUdkZJ{5UJil>^#PH%+4F<_Nomsk+sjAxR9E4_@ zkJ-bOTnQwn^AV(*uLlf1lAlfzX92*{hW(CIkkC|l{NTaI4}#}k3K%noV|(>jOy3(j zJYxi2YJ1J1#8-BeY9&08(II#f$$-;TXZ5hru@;riRV~!mB32G{G){_{4!qEMLBwuY z%aM;f`^JANO4*lC&IKjq%tEu?IukAgOPYERj1S(C5jnVDSzLk|D~AV-0V8omRG&1; z8RLa>{atEueH`wfk<1#8BkIaN?Wi?zQ%MP`un z@}k=@!hUR{0Nq|Gqt`37SlV~-uP>gsV|IMdH)^1+cgOu=KDAVv0KZeXJaOXEr4yCa z#qy4%{Z{PWoUH6VClzXgwLLDU1I9ujoDLOCF(XoIUIAP5cp7nov}Vx{k=&6X9~mdP z`FR(@0-Xl&RH^~u=suqyXW}8z7t3T#BV>G~<8W@eeRv>C z4yWi%ygYs<_Iifdu_eO;X>d-XD>|Wp)QO%R*^YYMS4oB{ScOj?dq-qk4k(=46ksMXezuDsLmLN@x(FG) z_b!NJ=DnwC#Ni+Ca7`$sYNj${xu`N2n+ot?uKQK}4dhKIiu`*}h3{eCM}&t2W5z|7 zA-FP&UGMD*6a^TC{NM6uLMws@{{;&cZGLzBja~V3dk@3=b&5emM^GgM?mU(qL9_d5 z+uZCNk_LC&arA80gL$?NibIvb_-()&LY)z^ih4<%b@s3rbewqU1ndI^Kc@rJUqEOf zjgPHvJ8KM{KTXH8(}SXMc3V~RE&2r3SeAi+PO%_5nH>Iae6l!rn%?2``9Xa01$?r+ zY_K%u@n_e*&vM`k%m~uQX)7Qe1qv&XrC_!dN8xpV4m=`^-qafKPZ?okA-%xcR zd3&}Ph-;y&IhNa(GN%R($N@27+a0KLR51F5x;vE6;|n9P$e1DOaw#zzi-HTb^Vz+cMRAZ*YY|LJbWo2u?~XR5ftTNXOaM^-u}MbIapglq-Ln!Q1hxc6=H%A6T*VCSnfR5A~EmxG^T(Nj~igB0Ynk_#&?34 ziDbMLm)XzI-VsaWg3Dz7TOId{2|w#N;$X=jS?CQ$LpAC)W(mDt^!kXaiXcB(xS~_P zr#Io0RQxuv2h^J?kS6v<5*+C`kQNI5VcN1+qa&&5C}>9WysSahO6CMU>dwP`_SsJ= z1{=H@EE>wo-Wph+ZbZ?&rc)#6Ue*&(^Ffsta!D)d&W%3%{!%fD=mspgm9s|t$FGA` z)P_vd{@Xd)ZU6~U7`a>uNvzaKVpC3eaQOUT@W-bBb4tzw>Vb$$^4yUlbFyUr*>}DZ z>dH&OEIngbR<2@g09Q2vFj?%<8ZtpQwSYrwuvg}E!twr1>Ktl7(q_=p;P_Cxg`MZ9 zqhWAI^V6_4?+<|uscYa_v)6FwXxx4mTSS}fenv5aI(}ZK-RjH$YPrRJ9Boc`p<{tD zi!?$ID{o|XYNi5+eU+MfnPhB>uZXA$}+vya1NYWQ?VceCmLeN?G|`W5X%Ed~rso z+`BZIAC8-0ma{PGs!!$rDmSvXK9-tFWf$suLecEhVlXm$=ZK|F46$egN2h6{RWC;e z+aoj&-G(s;gocikAM9DeUR&t2mtGr!J5Id(+_wTiQ)h*>%Q_dHe&+MM{Vc}{KJX|R z{&ti31qZZ7d-FNfVNN7z>`{u)4|I(vW&de4&i1y?C>W!JAE`7VLS1dB^? z6po~dX>+{DQS{NU047#@>sXa4>SYtOOb|Ez%ZTq0C1sZMwzG;P9z&AEKZ_oK=y_Sx zAJtI@1`gR@G-9!@OD657P3bsxG%-hDwgo2Gu5z7V}@D{1QB{y)%7@^a7;X%wID*z{uf z@R;jLOnZB*lilE?L_>74>M%`gS7ul*iV~m!AEmLmaqQ|i=vP)`Rgw3WNvEJxNb>M$ z;%l@&*|Fi6AAc`3Gw2Hvh5O-(FR05+Nu0&W$s|+x9Pv>8e#bg(*DlwiLHL{!n|nT( zHZk&2QN;1o=m%EYialtyTI(d{5zR5&p0gYC>(ZSqT))gsoRV#9_m`PJVP0qcp7|m3 zQ|216m`tMq^e!**xC8h5y4&q&@&1{QH@v=jgKhB!$9vJ|ja&SGc>U+U;q%?#eHGvL zyx6TiYuA|T9&WGoo2~ZQSHH>o+5IlQ{;YlR#?4-|e*MGEzGwDdwLAV4v~K!u*KhQ1 z&3-p<;)nXQoo6<+kYf54Yxs@$4UGQRr&FE5742%({^A=qS#Nq~_VdoDl)UM;x&`NL zvUj&llGMTTbi8A|cncTF3`sK61c#j9&^U-<2|zK3B08ve7Tc5a$0VRg7qq)~N-9v( z<2~DpRDP*%aoF2lb%Yn_*kRvbLd52Fg@Z>P~tR(XH z^P0p)7X%3efpS2Q*htPF&XzNoK}lM1mb&uZsmMY&1Pw(oU?{v0IR%>m+-? zi-g61|Ik5{H`eXS zZabUWJPLvm@v7p~uxyS}7iLKaH8C?+J1LpLvV1$oi7>I0&O$KE`&e+B`r3Jw>!D)) zHeh}HFo4iO4HSGR8wewjFvXG%<+S!V7*?Y@n=7fh3A|6-@+4Y$z3 zJJ-dYf<+tw9hP%Qelck-cWWJu<@@Ae8BL%`mz~qAZ4uyCXnkjztz@0xy&y#g)a&Rr zA10^1Mdpum%nRrwV(14r_=GfrZ#VJf$!*zg}OYw1Z4jd3T@RqZ3@1zs8 zg3h>7Y7Ws{=^v81V=`sbKOZE0vm1##2izd+VATax?dqX*;QCpth-=JBQ>enS6XIow z#oU@ANy|vmUzQ|==0BpRR_1F?@tm~;ki`L&gL`>i89-g(9O0ZPB?HZ{*o3eth5?EC zwy&bGE9Cdx?iAKr{Ru|5Q8Z1FMUGunlm`p_%4d*HhU7&}0B=07ewp$GHkEJVR>}vG zZUOD9q_Z#7Z@Pda*82m;9_o&>M@T8V$Wg?e?OtnMx#xJQZ!LJ=8!hWz)oiteF#KDm zo15MU=pV=5F(P)bO!R*6|DQ5u`qqS-Eu-E1<;u9;`_WzOf(`Je;8jvz_ix=EVQ=43 zPPgkMI>gc8lj2END^)_9>8fj++am~gJp;DqumRqOUVSCMFg_`0tPg6cJUZbMhDHLa z8c;Vi$a+@^c`k|8SHN#5+jB~B!NBb1I)oBGpA8S)ui{&5QC7q1`V>?inAxO%+)7!` zv`bbd$H8v-8lHc5k@iFCJ?Mw~p+(V(S#whs z_&W%%qFS*6;Wntj>I=LE*NI3xp5XX!$V#(Za^mfRKkRSf*>8T2Wkp#X9aUwKWxp4B ze$ThiWmh3wL5pn=)?R?ni4kU!Xk4tLaSeM?$?_O&BRSW9fEPG2 znID_g$zBf8=<)`i-7Z&8jnBsc%$UUUQR&{)OI~suKen* zYLJHl{H$gDyI)oP-{55=Gz~A7Cnm~^!$=$wWl2p&4I`S+c%J4X;pcf8JyrumnS%ubtT?DnHUE;%`>hU3a`JbrkBz0FMUV_?|oh*6P|WM(l;JK?vR zQxvq0H|mY!Yio4TY_%H4kApv4PohO5>E!20*WL#I<8TGzn4?Wx!EDd=caP4`ADyRB zL3fd0`>zu#5XjHtBfBYVHA~roiJ`}_-EKHGE9}+Wf!SzW%ahl)6JKH4^YWv;ZWZcH zgSWhG@FMZu5oOO_t1Z`(#HihD9JfD83|T8}-iUQ#)qbD&?>F{sN_c{D1R* z3)57_vp_Bf0}}&K2LQG2548XQ0C=2ZU}RumJn;Vj0|QgT|2IH#Dg#gi88E*A0FhG$ zc6gkHS4(c&Fc2N72<(j!qgm8IHaZHAl4XywD34 zv)UCM+vYFrOF`!xZP)o>E^lb(xeEKbCZyMNJXGoRvhF9{lgeFUro5GRlwv-V!a7J_ zhEEcUj*1iJ3-`7>Wj|l*que|eib>+!g5e_=c^OXL7UvRt?NpuRbuAArmYd6YsB^@2 zQw3)D0+PD~JCRUpHAcd!;Z$?k<*d~*ja?0y9GawNr`Fz~3BOA|+S(px#zRE;R&I#)vHD8{TYn*emd#^(E zK+p8f{sTNnZcv_AIh+l*#{X{wHj2<8a#J-YIb2=8XF;uUaFK z!?t&FeKkSo$ALeluLx&{iG7vv*yUU1jyz7051|j|rEtxfzS;J#UX7AN$yIHHNcrTKfrD&rv?e zyX60*amRZC^H#t4ed43&5PzgrdjFEG?e~Vehv0T(yV?1b8FRi{2tU+LG9PfwoonXa z&PD5kr2ph}3ceHe65s1P@!##)?m3G)P+Hd$?MHsDo_F4+%LCz9V{>sNhrjc05eMKs zWOn(}dE@o~E*8ZbXzdfvDiQ$PFq@Npc)cdDzvci?kpj^9EaV}14iAFKyL`Muy9 z`>T1JUH#<+#utt0hx;!hF-tw97;`(TB=1MQXSe@UeAdIVMs=^pGI4Lu<(JQso=44J z?t7_82|dT-lw94U4ma_?$4T;*n6GWE{#THGarbw7@_~CQ=eM1O!XK#jr&?1L7ro2e z$cOS*Fy;JAJpb)_J&B^A-m1wYR7UA%u`C4Vp)%I;m(l&4Y9ssgy>VPNYt^ zq)Brsr9q`=P7}(_6+#k1moBNOODPmhDDKDK*YhlU@9$pgUGMv@b$+{u|NC!kL^3<# z!g3M0^NV>AdAdgA-5qhsjEH>wA}-B|xGX#3@*WZS^F&n28A-zMS)=Y@)kJrOr9i?|8a&2S1&jkv}0t@;+}6mi=Ku`{A*DWPZ4y%EJS zguLPhB1*u!{ai#zQ7TJpi72hE^r46{YRl?XPHnlv5#{wSe>S25E){XB2(Oa9l{1BY zRq_eARrI@~RzwEf89b;;W7S;|)o81BJfb@8)%D3#m$@~f2HYB}BJRY$CT=zLss*n$ zKDG6`OWeIZqK>mV>g)2buKc?A*OOE4WJG;+_3^2%HVb~1o>?0s8t}9MZyVsz5Wj}> zG{nDAE}?HD{Tmk)@S3P=!iT2Kh1zD$n++B`Yfevd*e&R5fkR8)w=|b~Dhab{g;OgW z?^W9xPU~?If7hdpS+>!mEx+2DOIuvq!D{bad)~KK(*agT&mGP3KJ}e=)!DVP_g(Ps zBIf}-x)v6$-Q;%TdpCU_^xPeGciMZ<)|1Ab`t{;vZ@9hfTpzpFXO!UML)#)Arn|2h z_gxs#kH&uT`|C9T)&R2`$jgDe&6YC=_8?vk;>RQA^(a1rVLhhT5buWYb|^kW`J1CI zr;mV}!<%8whshhp+hIKX2X6n6H{3oAr*(wu<8mISZzPp9Pc^-=Lu#u(eor&lNt+NOu~P%y2*BC3jI@PnWFbp+Na_&&3vZe z^^}~a?89`rrkl@9&rkmqe49njEPjEA+5YzoALiJ%Ik?Y-GuJN6qj$dh`M5r-#{#(v z__;AbU)Ak=V^bzp1jaO@Oh~@FU4h8kt>e>r95%q($h(d5UgGP^G`uYD6+U^4 zO@Ce8Z06%;{=UkqS7HCter<8Th5py{c}@N6IBvD?Z>7rmTlr~@s7Xw zci_EiZrklw7pNqPQL>??d}Km@k8%E^!M};Uq5oTi|&uj;uF0-@$OUn zcjK{Jzt3p;9Outz*kiBu$p6B-FW`PD?@QOc-tEQpE1v9=v(MRnd$ym~2XHvRo3HK1 zH{KuQ&q10G`7Qb{UfqyGy(E%6 zSwelDLy_cdBb;4aSe%RGlI@Y?b9QMZ;rX(ykz6kF?~UY&W073dCz1mCU9Imm@~-U^ zNx>pwcO=)rxjvs*70C_W7s92Gnj7`Hsj+Zh7}hNlBl+7@f#0nK#f(Ub;8JvFB*kbd z=32Z~Bqj2QwUOMOA=H(`za(v?)R(5O^p;4<$SFg28RunqP*%^fBO>vwO3L9=-lw-b zp5@_G$R*rYz^@{#ifSs!uS9cYnksLLqzXP&Xsog)k~{RxfSm8a%qQgHT(uUnI3))xxDVZFk{#x4b%@>y{I^*Q2Ap`z*W~z-vIa zZ&T6`*M{yJHIJlm{z#gbR}-~O^=RtajJM6aZ_fMX=GuafEnV-?w-qn%#r0lXTjS8$ z4BHeJYTELot=x9{w%4b<8FVoB4)}GHe;-cw%j;wYop{$7ug<*cLQ@xgyTa*e4&C5) zbA8Zxci!~Cu?Jl};rGJ1mma;<_30|qJ`+g*g=w4*Mp2K6YeOSz+CHOCKT?%Wdcgt{DE^j$LD{>-P zX?`o!uC}wQ{q3!B|018)I$vk6*Xy@luMK?LfYV03Hk#c_JtBG8UcUlslXsh7Z-%#7 z{j2)bV#1uk_nzCi@mfvR{w=xF4Y5YhHW}>l;3P~IWs=5=Da?C(EMlPNFz_A$<9dq&Zielj5JrSNG~iP zjz@aY)JSvZM4Bf1A>*hjYcoNUt0b=~d0eu1E`viu7uA z*X)V(+HH{*lz&~VNUw);gZG6h3FkL%iu5KqH_wZ-aCW4(xWBbeq($7{=DujZNQ>2p zv;6HCg&*&5pDo%tp=| z7ZLh5@!V8yGg!?$H`l)fuUp{PQrjjtA}d-5!UI zg@pI_=wjJ_c>3|SIs4qZ9wa$pVP*)Y6@I~&el|JF`NsD0dg zNAhVTj3+upItsVZg$3SYyc;8D?AA#AHl}_X)A4#tkT+3GvJ;cfMLI>lDfCapeVYE$ z^z$2-PPYfs@tW@43>s$AKNH^5Glbk(c5gQQvvGU|)*NSZ^`7f~9*^gl?Rj>Q_2jrT6NEk*?vvi)OUejMn0~ z&UGEU^>%grsz^8V`5zmb$`=3t0C=2ZU}Rume#02WpuhkEOhC*CgbWN0U_Ju?Cp7`E z0C=3OlFe?@Koo_K?W7Xvrav?&sEb+UM`|1;t}BrhRi%gp8`KK1brQF+8fPqfny3$e z`WP%&vH+fe2VlX1hhWJIaO_;s2GI(n*pla)x!331J2L?Gt=F)ye4gS+*g_3&g>97a zLD+%9PvH`3)(hb>>eeUW4OH#2a0LhUTzC^t>~F$b*mZV=w^4RH;T_bRSa^>)ABC&T z`AT=I^oX;=qLQ2~^zcg9rrSGV2hZ_YxP+edSh$Rr)=+o@2iAAt3f|cJ!kcjI_rhDK z+dqW2QE?i=JLoyjg!fQ)ZiK7M`GON@B)CS32p5>ZaMzj`p~Z2)*sNGN#sVQS&SQ=^ z(aCihT}+H>j#_Gz)gTQ+b*iTkLwB-d z<^T2DjJW6)U+)38w(oX**IRcB9^WpleV)Hp?C$;gbAD6KqaveUINp}tqL|lp{hp_q zD~9th%_2SPt7QkR+ZI+0{NKg5|14gl{JiqERDQ<$kXMyU4AG#BqKxL4*PawN=ZYc$ zMHQt+g{fjZEHVPl#vBdTbF)k471AY?onJ~rtBf1c;d?H<1uMO|g?-F)W0I`j>728xVA+*B((%6@>)(!YJ@@dTOS0D5 zegPNp>vsSE0C=2jS_PQo#?jsG>fxD%yE6yvaH7O<5{KhB%*?EjdPcetom$$txp3kn zj_r`c%*^aCGc!2M%#8o5Zq4rO<=^jHO;t;3sk^IQy{gulT(f`wy>RV>wg2ajeuaZr zlR^p-O0+~jU7*btjyOY9T-#Q|}QI941dju$706U9m5BI2UrV&dZB z65^8LWO0hPl(@9GjJT}0oVdKWg1Dl%lJLZp#Z|iAY5za#4swq7+6{ zq88g?zP7&h+qIE6EEeL3c%XQYc(8bgc&K=oc({0kc%(Q>JW4!TJVu-?9xKif=Zf>h zJ&Esp4tk>EapUnc`XE+2T3kx#D@^`QioQh2llx#o{I6rQ&7c z<>D3MmEu+6)#5ecwc>T+_2LcUjp9w>&EhTMt>SIs?cxIQ4)IR$F7a;h9`RoBKJk9> z0r5fcA@O1H5%E#+G4XNn3GqqsDe-CX8Sz>1Iq`Y%1@T4kCGlnP74cQ^HSu-v4e?EJ zq4<{gw)l?tuK1q#zW9Ooq4<&bvG|GjsrZ@rx%h?nrTCTjwfK$rt@xezz4(LpqxjR> z$>PuAFXFG_Z{qLbAL5_lU*g~5KjOcV%|J?$O15NMc4SxfWM2;CP>$rf+>o1cOYW2V zieg1n-ypz1Myod4YU~e5ZVue7Ag$e6M_;e82pF{Gj}h{IL9p{HXkx{J8vt{G|Mp z{IvXx{H*+({Ji{v{G$Al{IdLt{Hpw#{JQ*x{HDB6eoKB^en);+eoua1{y_dv{z(2< z{zU#%{!IQ{{zCpz{!0E@{zm>*{!ad0{z3jx{z?8>{zd*({!RW}{zLv#{!9K_{zv|o z)<}>fB1J7~Q-`|LqdpC2NF!RO4ceqF+DH5803Ace(s6V=oj@njNpumqC|!&$PM4rd z(#doRU5YMEm!Zqj<>>Ns1-c?#i9EV8U4>4itI}z7HM%-ogHESw(zWQ?bRD`bU5~C$ zH=r}|GB0Y)Drzg`>=&AHH zdOAIWo=MN5XVY`&x%51GKD~fmNH3xn(@W^3^fG!my@FmzucBAeYv{G~I(j|5f!;`O zqBql9=&kfNdOKY}@1S?myXf8Y9(pgmkKRuopbyfA=)?38`Y3&jK2D#YPtvF8)ASko zEPakXPhX%f(wFGV^cDIleT}|O-=J^Oh4d}@HhqV_OW&jK(+}u}^dtH){e*r>Kck=1 zFX)%_EBZD4hJH)GquNs`0IzgSNPEr?97gZNi7gv{1msBUKQ`Du@ zrPXEBW!2@><<%9`71foLr>?B7qE1y;Ri~+|sjI7NsMFOo)wR^M)pgW$)%Dc%)eY1c z>W1n}bt83SbrW?{bu)EybqjS%bt`pibsKeCbvt!?bq94vbtiRabr*G4bvJc)bq{q< zbuV>qbsu$Kbw71~^#J9ou?keU_HCurL`~QBsYu1@pqi;fr7BaoD%2rWDx)e@t8Fz` zht)zIQ4drPQV&)SQ4duQQx8{