PixiJS 中 HTMLText 富文本渲染問題探究與優化思考?

起因

在使用 PixiJS 進行富文本渲染開發過程中,遭遇 HTMLText 組件處理中文字體加載時出現顯著卡頓現象。針對此問題,在開源社區提交 issue 并附上相關技術細節與運行表現,期望獲得解決方案。

提issues
提issues

從 issue 反饋內容來看,項目維護者提出兩種建議:

其一,針對中日韓(CJK)語言場景,推薦使用 Text 組件替代 HTMLText 組件;

其二,若使用 HTMLText 組件,則建議避免使用自定義字體,轉而采用內置網絡字體。維護者進一步解釋,由于 HTMLText 組件的渲染機制依賴字體內嵌,在當前架構下暫無其他有效解決方案。

維護者意思是不想支持中日韓字體(擺爛), 基于維護者對新紋理方案支持意愿較低的情況,決定深入研究 HTMLText 組件的內部實現機制。在剖析源碼過程中,不僅探尋解決當前卡頓問題的線索,更對其模塊設計理念進行深度挖掘,從中獲得諸多可復用的設計思路與技術啟發。

還是想吐槽,不支持中日韓字體,難道是因為CJK字體文件太大么,就不去優化處理么?或因開發者群體使用場景傾向,導致該場景在項目優先級中較低?

紋理生成流程

圖一 紋理生成流程
圖一 紋理生成流程

在技術實現層面,HTMLText 組件在渲染富文本時,因需將字體資源內嵌至渲染流程,導致中文字體加載時資源消耗激增,進而引發卡頓。結合現有紋理生成流程(見圖 1),雖可嘗試通過優化紋理生成邏輯來緩解性能瓶頸,但需突破組件原有設計限制。

從圖中可以看到PixiJS采用的方案是?SVG + foreignObject?實現富文本渲染轉紋理。

前端通常處理富文本渲染的方式: 你可以選擇以下路徑之一:

  1. HTML → Canvas → 紋理 將富文本繪制到 canvas 上,然后將其內容生成 WebGL 紋理。

  2. HTML → SVG → Canvas → 紋理 先將富文本封裝成 SVG,再繪制到 Canvas,再轉紋理,適用于需要保留更多字體樣式的情況。

  3. HTML → dom-to-image / html2canvas → 圖片 → 紋理 直接截屏 DOM 元素,生成圖片紋理。

優勢對比:

HTMLTextSystem

HTMLTextSystem?類負責生成 HTMLText 所需的紋理,并對這些紋理進行管理和清理操作。

核心方法還是_buildTexturePromise,源碼如下:

private?async?_buildTexturePromise(options: HTMLTextOptions){// 解構出所需的屬性,包括文本內容 text、樣式 style、分辨率 resolution 以及可選的紋理樣式 textureStyle。const?{ text, style, resolution, textureStyle } = options?as?{text:?string,style: HTMLTextStyle,resolution:?number,textureStyle?: TextureStyle,};// 獲取 HTMLTextRenderData 實例,從 BigPool 中獲取一個 HTMLTextRenderData 實例,用于存儲和處理 HTML 文本的渲染數據。const?htmlTextData = BigPool.get(HTMLTextRenderData);// 提取字體家族并生成字體 CSS// extractFontFamilies 函數用于從文本和樣式中提取使用的字體家族。const?fontFamilies = extractFontFamilies(text, style);// getFontCss 函數根據提取的字體家族、樣式和默認文本樣式生成字體相關的 CSS 字符串const?fontCSS =?await?getFontCss(fontFamilies,style,HTMLTextStyle.defaultTextStyle?as?{fontWeight:?string, fontStyle:?string});// 測量 HTML 文本const?measured = measureHtmlText(text, style, fontCSS, htmlTextData);// 計算紋理的寬度和高度const?width =?Math.ceil(Math.ceil((Math.max(1, measured.width) + (style.padding *?2))) * resolution);const?height =?Math.ceil(Math.ceil((Math.max(1, measured.height) + (style.padding *?2))) * resolution);// 設置圖像的寬度和高度const?image = htmlTextData.image;const?uvSafeOffset =?2;image.width = (width |?0) + uvSafeOffset;image.height = (height |?0) + uvSafeOffset;// 生成 SVG URL 并加載圖像const?svgURL = getSVGUrl(text, style, resolution, fontCSS, htmlTextData);await?loadSVGImage(image, svgURL, isSafari() && fontFamilies.length >?0);// 處理 WebGPU 的兼容性問題const?resource: HTMLImageElement | HTMLCanvasElement = image;let?canvasAndContext: CanvasAndContext;if?(this._createCanvas){// silly webGPU workaround..canvasAndContext = getTemporaryCanvasFromImage(image, resolution);}// 生成紋理const?texture = getPo2TextureFromSource(canvasAndContext ? canvasAndContext.canvas : resource,image.width - uvSafeOffset,image.height - uvSafeOffset,resolution);// 應用紋理樣式if?(textureStyle) texture.source.style = textureStyle;// 處理 WebGPU 的兼容性問題if?(this._createCanvas){this._renderer.texture.initSource(texture.source);CanvasPool.returnCanvasAndContext(canvasAndContext);}// 返回 HTMLTextRenderData 實例并返回紋理BigPool.return(htmlTextData?as?PoolItem);return?texture;}

其中對于svg轉紋理的邏輯,涉及到幾個關鍵的函數

getFontCss

getFontCss?核心功能是動態加載多個字體的 CSS,并做緩存處理以避免重復請求。以下是源碼部分:

import?{ Cache }?from'../../../assets/cache/Cache';
import?{ loadFontCSS }?from'./loadFontCSS';importtype?{ FontCSSStyleOptions }?from'./loadFontCSS';
exportconst?FontStylePromiseCache =?new?Map<string,?Promise<string>>();
exportasyncfunction?getFontCss(fontFamilies:?string[],style: FontCSSStyleOptions,defaultOptions: {fontWeight:?string, fontStyle:?string}
)
{const?fontPromises = fontFamilies// 過濾出 Cache 中存在對應字體 URL 的字體家族。.filter((fontFamily) =>?Cache.has(`${fontFamily}-and-url`)).map((fontFamily, i) =>{// 檢查 FontStylePromiseCache 中是否已經存在該字體家族的 Promise。if?(!FontStylePromiseCache.has(fontFamily)){const?{ url } = Cache.get(`${fontFamily}-and-url`);if?(i ===?0){FontStylePromiseCache.set(fontFamily, loadFontCSS({fontWeight: style.fontWeight,fontStyle: style.fontStyle,fontFamily,}, url));}else{FontStylePromiseCache.set(fontFamily, loadFontCSS({fontWeight: defaultOptions.fontWeight,fontStyle: defaultOptions.fontStyle,fontFamily,}, url));}}return?FontStylePromiseCache.get(fontFamily);});return?(awaitPromise.all(fontPromises)).join('\n');
}

函數 getFontCss 旨在:

  • 根據傳入的字體列表和樣式,加載字體的 CSS;

  • 只加載 Cache 中有記錄的字體;

  • 使用緩存(FontStylePromiseCache)避免重復加載相同字體;

  • 返回一個合并后的 CSS 字符串(所有字體的樣式表拼接在一起)。

中間穿插一下?loadFontCss?函數

loadFontCSS
loadFontCSS

loadFontCSS會把字體文件的 URL 編碼為 Base64 格式。

開始認為PixiJS這么做是緩存字體文件數據到內存,避免字體文件的多次請求,后面問了GPT,才知道?SVG → Canvas → Texture?這種轉紋理的方案:SVG 本身是一個獨立的文檔環境,無法自動使用你在 HTML 頁面中通過?link?或?@font-face?加載的字體。

如果不處理字體嵌入,SVG 渲染時可能會回退為默認字體,導致樣式錯亂或排版異常。

這也解釋文章開頭提及作者回復的方案,CJK這種字體太大,轉base64無法很好的解決。結合現有方案的設計,只能避免使用CJK字體,或者使用Text節點。

GPT還給出了SVG轉紋理的注意事項:

注意點
注意點

分析到這,其實知道getFontCss會返回兩種結果:

第一種web fonts,通過如下方式注冊:

Assets.addBundle('fonts', [{?alias:?'Lineal2', src:?'https://pixijs.com/assets/webfont-loader/Lineal.otf'?},]);

通過getFontCss處理后,會返回

網絡字體轉base64結果
網絡字體轉base64結果

第二種,不注冊web fonts,在項目里面用css fonts方案加載,比如引入一個font.css文件:

@font-face?{font-family:?'Lineal';src:?url('https://pixijs.com/assets/webfont-loader/Lineal.otf');font-weight: normal;font-style: normal;
}

返回的如下截圖:

未通過Assets.addBundle注冊
未通過Assets.addBundle注冊

這種方式加載到document.fonts里面后, 可以通過:

分析到這,接下來就是看getSVGUrl是如何處理的

getSVGUrl
export?function?getSVGUrl(text:?string,style: HTMLTextStyle,resolution:?number,fontCSS:?string,htmlTextData: HTMLTextRenderData
)
{const?{ domElement, styleElement, svgRoot } = htmlTextData;domElement.innerHTML =?`<style>${style.cssStyle}</style><div style='padding:0;'>${text}</div>`;domElement.setAttribute('style',?`transform: scale(${resolution});transform-origin: top left; display: inline-block`);styleElement.textContent = fontCSS;const?{ width, height } = htmlTextData.image;svgRoot.setAttribute('width', width.toString());svgRoot.setAttribute('height', height.toString());returnnew?XMLSerializer().serializeToString(svgRoot);
}

該函數用于生成一個渲染了 HTML + 字體樣式的 SVG 字符串:

  • 實現文字轉 SVG 圖像的功能

  • 保持樣式、字體、縮放一致

  • 可用于導出富文本圖像、預覽編輯內容等

getSVGUrl函數存在兩種情況,如何fontCss存在,即web Font加載的字體(系統不支持的字體),比如Lineal字體族,轉換后的svg內容:

<svg?xmlns="http://www.w3.org/2000/svg"?width="331"?height="157"><foreignObject?width="10000"?height="10000"?style="overflow: hidden;"><style?xmlns="http://www.w3.org/1999/xhtml">@font-face {font-family: "Lineal";src: url('data:application/x-font-otf;basesrc: url('data:application/x-font-otf;base64,T1RUTwARAQAABAxx.....');
font-weight: normal;font-style: normal;}</style><div?xmlns="http://www.w3.org/1999/xhtml"?style="transform: scale(1.5);transform-origin: top left; display: inline-block"><style>div?{?color:?#1a1a1a;font-size:?36px;font-family: Sourcehansanssc Normal;font-weight: normal;font-style: normal;font-variant: normal;letter-spacing:?0px;text-align: center;padding:?0px;white-space: pre-wrap;line-height:?36px;word-wrap: break-word;max-width:?218.67921982473445px?} * {?padding:?0px?}?p?{?line-height:?51.42857142857143px?}?a?{?color:?#4c84ff?}</style><div?style="padding:0;"><p?style="margin:0; padding: 0">柴門聞犬吠,風雪夜歸人。</p></div></div></foreignObject></svg>

如果fontCss不存在,返回的svgURL內容如下:

<svg xmlns="http://www.w3.org/2000/svg"?width="323"?height="80"><foreignObject width="10000"?height="10000"?style="overflow: hidden;"><style xmlns="http://www.w3.org/1999/xhtml"></style><div xmlns="http://www.w3.org/1999/xhtml"?style="transform: scale(1.5);transform-origin: top left; display: inline-block"><style>div { color:?#1a1a1a;font-size: 36px;font-family: Comic Sans MS;font-weight: normal;font-style: normal;font-variant: normal;letter-spacing: 0px;text-align: center;padding: 0px;white-space: pre-wrap;line-height: 36px;word-wrap: break-word;max-width: 296.6889602439261px } * { padding: 0px } p { line-height: 51.42857142857143px } a { color: #4c84ff }</style><div style="padding:0;"><p style="margin:0; padding: 0">1234567890</p></div></div></foreignObject></svg>

兩者的區別在于沒有@font-face加載的字體信息。

如果是中文字體,通過web fonts加載的話,PixiJS會將字體轉換成base64存起來,數據會很大,截圖看下Texture紋理的數據:

Texture紋理數據
Texture紋理數據

哪怕PixiJS內部對資源數據做了Cache緩存,但是大文件字體,每次通過loadImage形式,耗時是很大的:

圖二
圖二

交互表現來說,體驗上會卡頓,因為從紋理計算到最后更新耗時遠大于一幀的時間,從圖二的截圖可以看出。

卡頓的會很明顯。當時有個疑問的點,哪怕是GPT說,SVG轉紋理,需要將字體轉為 Base64 并內嵌到 SVG 中。?為了驗證這個結論,我嘗試做了個demo。

demo驗證

在線網站:https://codepen.io/daydaylee1227/pen/ogXPLOK

情況一

直接用css @font-face加載字體。通過分析代碼,直接給出getSVGUrl函數生成的svgURL:

<svg xmlns="http://www.w3.org/2000/svg"?width="248"?height="80"><foreignObject width="100"?height="100"?style="overflow: hidden;"><style xmlns="http://www.w3.org/1999/xhtml"></style><div xmlns="http://www.w3.org/1999/xhtml"?style="transform: scale(1.5);transform-origin: top left; display: inline-block"><style>div { color:?#1a1a1a;font-size: 36px;font-family: Lineal;font-weight: normal;font-style: normal;font-variant: normal;letter-spacing: 0px;text-align: center;padding: 0px;white-space: pre-wrap;line-height: 36px;word-wrap: break-word;max-width: 292.02037419639566px } * { padding: 0px } p { line-height: 51.42857142857143px } a { color: #4c84ff }</style><div style="padding:0;"><p style="margin:0; padding: 0">abcdefghijkl</p></div></div></foreignObject></svg>

將上面的svgURL貼進上面的在線平臺,查看渲染結果:

svg未帶上字體信息
svg未帶上字體信息
情況二

通過PixiJS預定義一組字體資源,注冊字體資源:

Assets.addBundle('fonts', [{?alias:?'Lineal2', src:?'https://pixijs.com/assets/webfont-loader/Lineal.otf'?},]);

通過分析代碼,直接給出getSVGUrl函數生成的svgURL:

<svg xmlns="http://www.w3.org/2000/svg"?width="259"?height="80"><foreignObject width="100"?height="100"?style="overflow: hidden;"><style xmlns="http://www.w3.org/1999/xhtml">@font-face {font-family:?"Lineal";src: url('data:font/otf;base64,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AKYArQC0ALoAwADKANQA2wDiAOgA7gD5AQQBCgEQARoBJAEwATwBRwFSAVYBWgFgAWYBbQF0AXoBgAGHAY4BmAGaAZwBpwGyAb4BygHWAdwB4gHuAfoCAAIGAgoCDgIUAhoCJgIyAjgCPgJJAkwCTwJWAl0CYwJpAnYCgwKJAo8CmwKnAq0CswK5Ar8CygLVAt0C5QLxAv0DAwMJAw0DEQMXAx0DJAMrAzEDNwM8A0EDTgNbA2IDaQN0A38DigOVA5sDoQOrA7UDugPBA8gDzwPWA90D5APrA/ID+QQABAcEDgQVBBwEIwQqBDEEOAQ/BEYETQRUBFsEYgRpBHAEdwR+BIUEjASTBJgEnQSkBKsEsgS5BMAExwTOBNUE3ATjBOoE8QT4BP0FAgUJBRAFFwUeBSUFLAUzBToFQQVIBU8FVgVdBWQFawVyBXkFgAWHBY4FlQWcBaMFqgWxBbgFvwXGBc0F1AXbBeIF6QXwBfcF/gYFBgwGEwYaBiEGKAYvBjYGPQZEBksGUgZZBmAGZwZuBnUGewaBBogGjwaWBp0GpAarBrIGuQbABscGzgbVBtwG4wbqBvEG+Ab/BwkHEwcaByEHLAc3Bz4HRQdMB1MHWgdhB2gHbwd2B30HhAeLB5IHmQegB6cHrge1B7wHwwfKB9EH2AffB+sH9wf+CAUIDAgTCBoIIQgoCC8INgg9CEQISwhSCFkIYAhnCG4IdQh8CIMIigiRCJgInwimCK0ItAi7CMIIyQjQCNcI3gjlCOwI8wj6CQEJCAkPCRYJHQkkCSsJMgk5CUAJRwlOCVUJXAljCWoJcQl4CX8JhgmNCZQJmwmiCakJsAm3Cb4JxQnMCdMJ2gnhCegJ7wn2Cf0KBAoLChIKGQogCicKLgo1CjwKQwpKClEKWApfCmYKbQp0CnsKggqJCpAKlwqeCqUKrAqzCroKwQrICs8K1grdCuQK6wryCvkLAAsHCw4LFQscCyMLKgsxCzgLPwtGC00LVAtbC2ILaQtwC3cLfguFC4wLkwuaC6ELqAuvC7YLvQvEC8sL0gvZC+AL5wvuC/UL/AxSDFgMXnVuaTAwQUR1bmkwMEIydW5pMDBCM3VuaTAwQjV1bmkwMEI5QW1hY3JvbmFtYWNyb25BYnJldmVhYnJldmVBb2dvbmVrYW9nb25la0NhY3V0ZWNhY3V0ZUNjaXJjdW1mbGV4Y2NpcmN1bWZsZXhDZG90YWNjZW50Y2RvdGFjY2VudENjYXJvbmNjYXJvbkRjYXJvbmRjYXJvbkRjcm9hdGRjcm9hdEVtYWNyb25lbWFjcm9uRWJyZXZlZWJyZXZlRWRvdGFjY2VudGVkb3RhY2NlbnRFb2dvbmVrZW9nb25la0VjYXJvbmVjYXJvbkdjaXJjdW1mbGV4Z2NpcmN1bWZsZXhHYnJldmVnYnJldmVHZG90YWNjZW50Z2RvdGFjY2VudEdjb21tYWFjY2VudGdjb21tYWFjY2VudEhjaXJjdW1mbGV4aGNpcmN1bWZsZXhIYmFyaGJhckl0aWxkZWl0aWxkZUltYWNyb25pbWFjcm9uSWJyZXZlaWJyZXZlSW9nb25la2lvZ29uZWtJZG90YWNjZW50SUppakpjaXJjdW1mbGV4amNpcmN1bWZsZXhLY29tbWFhY2NlbnRrY29tbWFhY2NlbnRrZ3JlZW5sYW5kaWNMYWN1dGVsYWN1dGVMY29tbWFhY2NlbnRsY29tbWFhY2NlbnRMY2Fyb25sY2Fyb25MZG90bGRvdE5hY3V0ZW5hY3V0ZU5jb21tYWFjY2VudG5jb21tYWFjY2VudE5jYXJvbm5jYXJvbm5hcG9zdHJvcGhlRW5nZW5nT21hY3Jvbm9tYWNyb25PYnJldmVvYnJldmVPaHVuZ2FydW1sYXV0b2h1bmdhcnVtbGF1dFJhY3V0ZXJhY3V0ZVJjb21tYWFjY2VudHJjb21tYWFjY2VudFJjYXJvbnJjYXJvblNhY3V0ZXNhY3V0ZVNjaXJjdW1mbGV4c2NpcmN1bWZsZXhTY2VkaWxsYXNjZWRpbGxhVGNvbW1hYWNjZW50dGNvbW1hYWNjZW50VGNhcm9udGNhcm9uVGJhcnRiYXJVdGlsZGV1dGlsZGVVbWFjcm9udW1hY3JvblVicmV2ZXVicmV2ZVVyaW5ndXJpbmdVaHVuZ2FydW1sYXV0dWh1bmdhcnVtbGF1dFVvZ29uZWt1b2dvbmVrV2NpcmN1bWZsZXh3Y2lyY3VtZmxleFljaXJjdW1mbGV4eWNpcmN1bWZsZXhaYWN1dGV6YWN1dGVaZG90YWNjZW50emRvdGFjY2VudGxvbmdzdW5pMDE4MHVuaTAxODF1bmkwMTgydW5pMDE4M3VuaTAxODR1bmkwMTg1dW5pMDE4NnVuaTAxODd1bmkwMTg4dW5pMDE4OXVuaTAxOEF1bmkwMThCdW5pMDE4Q3VuaTAxOER1bmkwMThFdW5pMDE4RnVuaTAxOTB1bmkwMTkxdW5pMDE5M3VuaTAxOTR1bmkwMTk1dW5pMDE5NnVuaTAxOTd1bmkwMTk4dW5pMDE5OXVuaTAxOUF1bmkwMTlCdW5pMDE5Q3VuaTAxOUR1bmkwMTlFdW5pMDE5Rk9ob3Jub2hvcm51bmkwMUEydW5pMDFBM3VuaTAxQTR1bmkwMUE1dW5pMDFBNnVuaTAxQTd1bmkwMUE4dW5pMDFBOXVuaTAxQUF1bmkwMUFCdW5pMDFBQ3VuaTAxQUR1bmkwMUFFVWhvcm51aG9ybnVuaTAxQjF1bmkwMUIydW5pMDFCM3VuaTAxQjR1bmkwMUI1dW5pMDFCNnVuaTAxQjd1bmkwMUI4dW5pMDFCOXVuaTAxQkF1bmkwMUJCdW5pMDFCQ3VuaTAxQkR1bmkwMUJFdW5pMDFCRnVuaTAxQzB1bmkwMUMxdW5pMDFDMnVuaTAxQzN1bmkwMUM0dW5pMDFDNXVuaTAxQzZ1bmkwMUM3dW5pMDFDOHVuaTAxQzl1bmkwMUNBdW5pMDFDQnVuaTAxQ0N1bmkwMUNEdW5pMDFDRXVuaTAxQ0Z1bmkwMUQwdW5pMDFEMXVuaTAxRDJ1bmkwMUQzdW5pMDFENHVuaTAxRDV1bmkwMUQ2dW5pMDFEN3VuaTAxRDh1bmkwMUQ5dW5pMDFEQXVuaTAxREJ1bmkwMURDdW5pMDFERHVuaTAxREV1bmkwMURGdW5pMDFFMHVuaTAxRTF1bmkwMUUydW5pMDFFM3VuaTAxRTR1bmkwMUU1R2Nhcm9uZ2Nhcm9udW5pMDFFOHVuaTAxRTl1bmkwMUVBdW5pMDFFQnVuaTAxRUN1bmkwMUVEdW5pMDFFRXVuaTAxRUZ1bmkwMUYwdW5pMDFGMXVuaTAxRjJ1bmkwMUYzdW5pMDFGNHVuaTAxRjV1bmkwMUY2dW5pMDFGN3VuaTAxRjh1bmkwMUY5QXJpbmdhY3V0ZWFyaW5nYWN1dGVBRWFjdXRlYWVhY3V0ZU9zbGFzaGFjdXRlb3NsYXNoYWN1dGV1bmkwMjAwdW5pMDIwMXVuaTAyMDJ1bmkwMjAzdW5pMDIwNHVuaTAyMDV1bmkwMjA2dW5pMDIwN3VuaTAyMDh1bmkwMjA5dW5pMDIwQXVuaTAyMEJ1bmkwMjBDdW5pMDIwRHVuaTAyMEV1bmkwMjBGdW5pMDIxMHVuaTAyMTF1bmkwMjEydW5pMDIxM3VuaTAyMTR1bmkwMjE1dW5pMDIxNnVuaTAyMTdTY29tbWFhY2NlbnRzY29tbWFhY2NlbnR1bmkwMjFBdW5pMDIxQnVuaTAyMUN1bmkwMjFEdW5pMDIxRXVuaTAyMUZ1bmkwMjIwdW5pMDIyMXVuaTAyMjJ1bmkwMjIzdW5pMDIyNHVuaTAyMjV1bmkwMjI2dW5pMDIyN3VuaTAyMjh1bmkwMjI5dW5pMDIyQXVuaTAyMkJ1bmkwMjJDdW5pMDIyRHVuaTAyMkV1bmkwMjJGdW5pMDIzMHVuaTAyMzF1bmkwMjMydW5pMDIzM3VuaTAyMzR1bmkwMjM1dW5pMDIzNnVuaTAyMzd1bmkwMjM4dW5pMDIzOXVuaTAyM0F1bmkwMjNCdW5pMDIzQ3VuaTAyM0R1bmkwMjNFdW5pMDIzRnVuaTAyNDB1bmkwMjQxdW5pMDI0MnVuaTAyNDN1bmkwMjQ0dW5pMDI0NXVuaTAyNDZ1bmkwMjQ3dW5pMDI0OHVuaTAyNDl1bmkwMjRBdW5pMDI0QnVuaTAyNEN1bmkwMjREdW5pMDI0RXVuaTAyNEZ1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjUzdW5pMDI1NHVuaTAyNTV1bmkwMjU2dW5pMDI1N3VuaTAyNTh1bmkwMjU5dW5pMDI1QXVuaTAyNUJ1bmkwMjVDdW5pMDI1RHVuaTAyNUV1bmkwMjVGdW5pMDI2MHVuaTAyNjF1bmkwMjYydW5pMDI2M3VuaTAyNjR1bmkwMjY1dW5pMDI2NnVuaTAyNjd1bmkwMjY4dW5pMDI2OXVuaTAyNkF1bmkwMjZCdW5pMDI2Q3VuaTAyNkR1bmkwMjZFdW5pMDI2RnVuaTAyNzB1bmkwMjcxdW5pMDI3MnVuaTAyNzN1bmkwMjc0dW5pMDI3NXVuaTAyNzZ1bmkwMjc3dW5pMDI3OHVuaTAyNzl1bmkwMjdBdW5pMDI3QnVuaTAyN0N1bmkwMjdEdW5pMDI3RXVuaTAyN0Z1bmkwMjgwdW5pMDI4MXVuaTAyODJ1bmkwMjgzdW5pMDI4NHVuaTAyODV1bmkwMjg2dW5pMDI4N3VuaTAyODh1bmkwMjg5dW5pMDI4QXVuaTAyOEJ1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjhGdW5pMDI5MHVuaTAyOTF1bmkwMjkydW5pMDI5M3VuaTAyOTR1bmkwMjk1dW5pMDI5NnVuaTAyOTd1bmkwMjk4dW5pMDI5OXVuaTAyOUF1bmkwMjlCdW5pMDI5Q3VuaTAyOUR1bmkwMjlFdW5pMDI5RnVuaTAyQTB1bmkwMkExdW5pMDJBMnVuaTAyQTN1bmkwMkE0dW5pMDJBNXVuaTAyQTZ1bmkwMkE3dW5pMDJBOHVuaTAyQTl1bmkwMkFBdW5pMDJBQnVuaTAyQUNDcmVhdGVkIGJ5IEZyYW5rIEFERUJJQVlFIHdpdGggRm9udEZvcmdlIDIuMCAoaHR0cDovL2ZvbnRmb3JnZS5zZi5uZXQpCkxpY2VuY2UgT0ZMIDEuMUxpbmVhbExpbmVhbAAAAAABAAIAAwAEAAUABgAHAGgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAHwAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAZwBkAKAAZgCDAKoAiwBqAJcBhwClAIAAoQCcAYgBiQB9AYoAcwByAIUBiwCPAHgAngCbAKMAewCuAKsArACwAK0ArwCKALEAtQCyALMAtAC5ALYAtwC4AJoAugC+ALsAvAC/AL0AqACNAMQAwQDCAMMAxQCdAJUAywDIAMkAzQDKAMwAkADOANIAzwDQANEA1gDTANQA1QCnANcA2wDYANkA3ADaAJ8AkwDhAN4A3wDgAOIAogDjAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwAkQG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywCMAJIBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoAjgCUAdsB3AHdAd4B3wHgAeEB4gHjAeQB5QHmAMAA3QHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8AMYB/QH+Af8CAADHAOQCAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwBlAhQCFQIWAhcCGAIZAhoCGwIcAh0CHgIfAiACIQIiAiMCJAIlAiYCJwIoAikCKgIrAiwCLQIuAi8CMAIxAjICMwI0AjUCNgI3AjgCOQI6AjsCPAI9Aj4CPwJAAkECQgJDAkQCRQJGAkcCSAJJAkoCSwJMAk0CTgJPAlACUQJSAlMCVAJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewJ8An0CfgJ/AoACgQKCAoMChAKFAoYChwKIAokCigKLAowCjQKOAo8CkAKRApICkwKUApUClgKXApgCmQKaApsCnAKdAp4CnwKgAqECogKjAqQCpQKmAqcCqAKpAqoCqwKsAq0CrgKvArACsQKyArMCtAK1ArYCtwK4ArkCugK7ArwCvQK+Ar8CwALBAsICwwLEAsUCxgLHAsgCyQLKAssCzALNAs4CzwLQAtEC0gLTAtQC1QLWAtcC2ALZAtoC2wLcAt0C3gLfAuAC4QLiAuMC5ALlAuYC5wLoAukC6gLrAuwC7QLuAu8C8ALxAvIC8wL0AvUC9gL3AvgC+QL6AvsC/AL9Av4C/wMAAwEDAgMDAwQDBQMGAwcDCAMJAwoDCwMMAw0DDgMPAxADEQMSAxMDFAMVAxYDFwMYAxkDGgMbAxwDHQMeAx8DIAMhAyIDIwMkAyUDJgMnAygDKQMqAysDLAMtAAgCbQIAAQAjACYAPwBYApUCrgTSBOsFDgVUBW4FhwZRBnQGjQizCTUKDApwC68NGw4ID10QmhEwEtgUIBTfFkgYhhn8HBcd7R8OH9sgIyBOIJAg6CEVIUYheyGkIdQh/CKUIscjmSPTJCIkYCSnJN4lBSUuJckmuibSJvonFyddJ8Un3yf6KBUoMChMKJQovykBKVkphim3KewqFSpFKm0rlCvHLKIs3C0rLWktsC3nLg4uNy7mL/gw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ABUhCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO+GuL1v8AQgKA/wBL+wD/AEICgP8AS/rA/wDQAsDWAf8AOYAA/wBMBQD/APL4QP8ATALAqf8ATAUA/wBB+sD/AEwCwP8AQkAA/wBLvYAD/wHigAD/ANj9gBWL///9gACL//+5BQCL///9gAD/AAKAAIv/AIt/wIuL//91fYCL///9gAD/AAKAAIv/ACQCwIuui/8AAoAAi4v/AAKAAIv/AIqCgP8Ai32Ai/8AAoAAiwWL/wACgACL/wBG+wCL/wACgAD///2AAIv//3SCgIv//7P9QIv//3SAQIsF/wCyAoD38hX/ADqrgP8ALRSA///SOED//8VKQP//xUpA///S9cD//9MwgP//xUpA///FSkD//9I4QP8ALNnA/wA6q4D/ADq1wP8ALcfA/wAtx8D/ADq1wB///e6CgBb/AIp6wP///sAA/wBofYD//5WrgIv//3UXAIv//3YcQP//l4KA//+VrgD//3WFQP///rXACPic/wI2/YAV//+ea4D///tjwP//to+A//+0LgCL//+c8MAI//+atcD/AE4/wP//scpA/wBmQsD/AGVKQP8ATjNA/wBONcD/AGVKQP8AZkKA//+xwoD/AE07AP//msAAHv/9on2AFov///2AgIv//YMCAIv///2AAP8AAoAAi/8AJAUAi66LBf8AtkUA/wCLNgD/AIs4QP8AtUfA/wC2RUD//3TKAP8AizhA//9JuwAf//+4+wAGDm7/ABVIAHagdvkWd593Ev8AOcuA/wEb/YATqP8BDsQA/wKCSAAViYAA///9gAD/AAD4AP//K0KA//2CyAD/AAJFAP///0AAiYAA/wBG+wCLi/8AAoAA/wACgAD///84AP8A1TMA/wJ8wsD///1PgP8AAQVAi/8AAoAABQ7ki9b/ATn7AP8ATAUAAf8AGgKA/wBL+wD/AToFAP8AS/sAA/8BAoKA/wGE+wAV/wBZuwD/AEPFAP//vDrA//+nSkD//6dKQP//vDsA//+7NcD//6ZFAP//p0qA//+8MID/AETKQP8AWLXA/wBYtcD/AEPPgP8AQ8VA/wBYtYAf/wBMBQAE//98tgD//5rKAP//mspA//98tcD//3y1wP8AZTYA//+aykD/AINKAP8AhEVA/wBlNcD/AGU1wP8Ag0pA/wCDSkD//5rKQP8AZTXA//97usAfDvukoHagdhL/ACh9gP8ATAUAE6D/ACh9gP8B0fhAFYv///2AAIv//jMHwIv///2AAP8AAoAAi/8AJAUAi66L/wACgACLi/8AAoAAi/8BzPhAi/8AAoAA///9gACL//+4+wCLBQ7ai/8ATAVA/wCI/YD/AEwFAPeq/wBL+wAB/wApgAD/AEb6gP8BGYWA1gP/AP6CgP8CgwLAFf//hbsA//+iwoD//6LCwP//hbqAH/8AAoAA///9gAD/AEb6gP8AAoAA/wACgAAG/wBPuwD/ADzIAP8AO8zA/wBOwAD/AE61wP8APMfA///EM0D//7BFAP//sUpA///DOED//8Q9gP//sUpAHv//uPsAiYAAi4v///49wP//coUA//7keoD/AAH9gP///sAAiYAA/wBp+oCL/wCOCACL/wCw/YCL/wACgACLi/8AAoAAi/8ARwVAi/8AAoAA///9gACL//7FPYCLBf8ARD0A/wCI/YD/ACKIAIsF/wB5QAD/AF09gP8AXT1A/wB5QAD/AHpFgP//osKA/wBdPUD//4bAAB8Oi/8ASvXA/wDzAsD/AEwCgP8Aq/2A/wBL+sAB/wArPYD/AEtFAP8A8wMA/wBL+oAD/wAqgAD/AoHzQBWL///9gACL//+5BUCL///9gAD/AAKAAIv3NIv/AFmHwIv//7X4QP//VAKA//+XgoCL///9gACLiYAAi///uP2AiYAA/wACgACL/wBHBUCL/wA0+ECLBf8ARMAA/wA0xYD//8wzAP//u0pA//+6RUD//8swQP//yzrA//+7SkD//7pFgP//zD0A/wA0xUD/AEW6wB+L/wAz/YCL/wACgAD///2AAIv//7j9gIv///49gIuL//+0BUAF/wAKHsD//5qFAP8AUa4A//+1goD/AGj1wIv/AG9KQIv/AFY1wP8AVTDAi/8AcEUAi/8AXJSA///EZAD/AEpzQP//q9wA/wAWdcAI/wBsgsD/APuFQP///b1A/wAA+sCL/wACgAD//9wFgIv//sD6gIsFDq6gdqB2/wCN/YD/AEwFQPg9d593Ev8Bc+FA1hO0/wELY8D/AoMCwBWL///9gAD///34gP8AAPrA//8HwoD//hAFQP8AAkKA///++sCL///9gAD/AER7AIv/AAKAAIv/ALEHgIv/AGh9gIuL//90goCL///9gAD/AAKAAIuui66L/wACgACLBYv/AAKAAIv/AIt9gIv/AAKAAIv/AEcFQIv/AAKAAIv/APV4QIv/AAKAAP///YAAi0WL///9gACLiYAAi///CofA//8OPYCL/wDSgoD/AaVAAP///b2A/wABQAAF/wACgAAHDuaL/wBL+sD/ARcFQNb/AIj9gP8ATAUAAf8ALv6A/wBHAwD/ARl9AP8ATAMAA/8ALv6A/wKDAoAViTgA///9gAD///8IAP8Ajf2A//7mPYCL///9gAD/AAKAAIv/AEcCgIv/AAKAAIsF/wBNeID///61wP8AO4eA///DpkCL//+yJoAI//+xSkD//8M4gP//wy4A//+xR4D//7FKgP//wziA/wA80gD/AE61wB7///2AAP8AAoAA//+4/QD///2AAP///YAABv//hbsA/wBdPYD//6LCgP8AekKA/wB5SoD/AF44gP8AXTNA/wB6T0Aei/8AeG4A//+jB4D/AFzFQP//h/WA/wABSkAI///9gACL///efYCL//+7QAD/AIj9gP8BO0WAi/8AAoAAi4v/AAKAAIv/AEa9AIv/AALIAP///YAAi///Tf0Ai///cv2AiwUO5ov/AEwFAP8BOfsA/wBMBQD/ALD9gHefdxL/ABsCgP8AS/sA/wE6BQD/AEv7ABPs/wDPhQD/AoMCgBWL///9gAD///29gP8AAUAA//94QAD//vA9gAX//+UXAP//2hHA///waQD//9DuQIv//8yFAAj//3u7AP8AZThA//+awAD/AIRCwP8Ag0oA/wBlNgD/AGVAAP8AhEUA/wCDSkD//5rKAP8AZTXA//98tgAecov//+hUQP///HsA///psMD///k9gAj/AFt9gP8At4UA///9gAD/AAFAAIv/AAKAAAX//+39gP//Av2AFf8AWMAA/wBDxQD//7w6wP//p0pA//+mRUD//7w7AP//vDrA//+nQAD//6ZFAP//vDsA/wBDxUD/AFm6wP8AWLXA/wBDxQD/AEPFQP8AWbsAHw59oHagdv8CNwfA/wBL+wASE6D/ABwgAP8CgwLAFYv///2AAIv//7kFAIv///2AAP8AAoAAi/8Anv2Ai/8AWFHAi///BjDA//3MfYD/AAKAAP///vrAiYAA0YuL/wACgAD/AAKAAP///wVA/wEbwAD/An4CgP///b2A/wAA+wCL/wACgAAF///cBQCL//7B/YCLBQ6Ti/8ATAKA/wDQAoD/AEv7AP8AzweA/wBL+wAB/wAnAoD/AEv7AP8AzweA/wBL+IAD/wDagAD/AoMCgBX//5q1wP//sczA//+xykD//5q1wB+L///Fo8D/ABohgP//zWvA/wApXoD//991gP//1qGA///fioD//+XegP//zUzAi///xaPACP//mbrA/wBOM0D//7HCwP8AZUpA/wBmRQD/AE04gP8ATj1A/wBmRUAei/8AOlxA///mQoD/ADKzQP//1sAA/wAgdYD/AClAAP8AIIqA/wAZvYD/ADKUQIv/ADpcQAj/AGVAAP//sseA/wBOQAD//5m7AB7//7QFAAT/ADq1wP8ALM9A///TMwD//8VIAP//xUpA///TMMD//9MzQP//xUpA///FSkD//9MzQP8ALMzA/wA6tcD/ADq4AP8ALMzA/wAszQD/ADq1wB///uT9gAT/ADq1wP8ALM9A///TM0D//8VKQP//xUpA///TMMD//9I1wP//xUpA///FSkD//9MzQP8ALcpA/wA6tcD/ADq1wP8ALMzA/wAszMD/ADq1wB8O56B2oHb/ALICgP8ATAKA/wE5/YD/AEwCgBL/ABuCgP8AS/sA/wE6BQD/AEv7ABO8/wEE/YD/AoQFABX//3u7AP//msoA//+awAD//3u9gP//fLXA/wBlNgD//5rKQP8AhEUAH/8AGfrAi/8AGLhA/wAEI8D/ABcNAP8AB1dACP//o0KA//9GBQCN///+/YCL///9gAD/AEcCgIuL/wACgAD/AAI7AP///wUA/wCOQoD/ARq9gP///nsA/wAAvYAF/wAWgAD/ACPwgP8ADQKA/wAqz4CL/wAuwoAI/wCEQoD//5rKQP8AZUAA//98tcAe//+z/YAE/wBYtcD/AEPPQP//vDhA//+mR8D//6dHgP//vDDA//+8OwD//6dKQP//pkUA//+8OwD/AEPFAP8AWLiA/wBZuED/AEPFAP8AQ8fA/wBZuwAfDvuQi/8AS/sA/wCI/YD/AEwFAAH/ADKCgP8AS/sAA/8AMoKA/wEg/YAViYAAi///uPsAiYAA/wACgACLrov/ACP7AIv/AAKAAIuL/wACgACL/wBHBQCL/wACgAD///2AAIv//7kFAIsF///9gAD//yr9gBWL///9gACL//+5BQCL///9gAD/AAKAAIuui/8AI/sAi/8AAoAAi4v/AAKAAIv/AEb7AIv/AAKAAP///YAAi///uQUAiwUO+M+gdqB2/wEbApD/AEwCjv8A0AJO/wBL+yQS/wCzAUj/AEwE3f8Azv2z/wBL+qD/AEIC0P8ATATcE77/ALMBSP8CgwKQFYv///2AAIv//YH9cIv///2AAP8AAoAAi66L/wAkBN2L/wACgACLi/8AAoAAi/8BGIKQ/wBneJOL/wBnhSCLi//+531wiYAA/wACgACL/wAj+p6LBf8AIwACi/8AAoAAi4v/AAKAAIv/AjSHbP8AQgLQi4v//ct4lIv///2AAP8AAoAAi66L/wAkBNyL/wACgACLi/8AAoAAi/8CNIds/wCKeJSL/wACgACLBYv/AAKAAIv/AEb7JIv/AAKAAP///YAAi///dYdsi///s/ski///LX1wiYAAi4v///2AAIv//7kE3Iv///2AAP8AAoAAi/8ARIUgi4v//y/9sv//MQJNiwWL/wEZfXKL/wACgAD///2AAIv//7j7I4sFDvc/oHagdv8CgwKAd593EhMg/wAzgAD/AoMCgBWL///9gAD///29gP///0AA/wBqwoD//sD6wP8AAoAA/wAAx8CL///9gAD/AEcCgIuL/wACgAD/AAKAAP///zhA/wBEAoD/AMzFQP8ARD2A//8zOsD/AAI7AP8AAMfAiYAA/wBHAoCLi/8AAoAA/wACgAD///84QAX/AGrCgP8BPwVA///9vYD/AADAAIv/AAKAAP//uQUAi4v///2AAP///YAA/wABAoD//7tAAP//Mn2A//+7uID/AM2CgP///YAA///+/YCL/wACgAD//7kFAIuL///9gAD///2AAP8AAQKA//+7woD//zJ9gP//uvsA/wDNgoAF///9xQD///79gIv/AAKAAAX//7j7AP/+wQKAFYv///2AAP///b2AOED/AGrCgP/+wQVA/wACgAD/AAC9gAUTgP///YAA/wBHAoD/AAKAAAf/AAKAAP///0KA/wBEAoD/AMzCgP8ARD2A//8zPYD/AAI7AP8AAL2AiYAA/wBHAoCLi/8AAoAA/wACgAD///9CgP8AasKA/wE++sD///29gP8AAMfAi/8AAoAA//+5BQCLiYAA///9gAD/AAC9gP//u0AA//8ygAAF//+7uID/AM2AAP///YAAQoCL/wACgAD//7kFAIuL///9gAD///2AAP8AAL2A//+7woD//zKAAP//uvsA/wDNgAD///3FAP///0KAi/8AAoAABQ75LaB2oHb/ANP9gP8ATAUA/wEW+wD/AEwFAP8AaH2AdxL/AOF+gP8ATAWAEzz/AveGgP8CDgKAFf8AT32A+4L//2ECgIsF/wBNvYD/Act9gBX//9v6gP//k9SA//9RSAD//fRpAP//ajsA/wHDQAD/ACvAAIv/AAKAAIuL/wACgACL/wBHBQCL/wACgAD///2AAIv794v///2AAIuL///9gACL//+4+wCL///9gAD/AAKAAIsF/wCLfQD//cuCgAYTvP///YAA/wACgAAHrov/ACQFgIv/AAKAAIuL/wACgACL/wI0fYD/ABN9gIv/ALyFAP/9ysUA/wACgAD/AAC9gIv///2AANGLi/8AAoAA/wACOAD///9CgP8ARkgA/wDSOwD/AGmAAIv/AGg4AIsF/wBGSAD//y3FAP8AAoAA/wAAvYCL///9gAD/AEb4AIuL/wACgAD/AAKAAP8AAL2A//8ICAD/AuhCgP///YAA///++wAFDvc/oHagdv8CpYVAdhITIP8BKV6A/wMOQsAV///cBUD//5SAAP//u/2A//8z+sD//7v9gP8AzcfA///9gAD///79gIv/AAKAAP//uP1Ai4v///2AAP///cVAQAD/AGn6wP/+wPrA/wACQsD/AADHwIv///2AAP8ARwUAi4v/AAKAAP8AAjrAOED/AEQ9gP8AzYKABf8ARQVA//8yfYD/AAKAAP8AAMfAiYAA0YuL/wACgAD/AAKAAP///zhA/wBq/YD/AT8FQP///YAA/wAAwACL/wACgAD//7j9QIuL///9gAD///3FQP8AAQKA//+7QAD//zE1wP//mEAA/wE4h8D///29QP///0KABf///YAA//6euEAV///cBUD//5SAAP//u/2A//80BUD//7v9gP8AzYAA///9gAD///9CgIv/AAKAAP//uP1Ai4v///2AAP///cVAOED/AGn6wP/+wQVA/wACQsD/AAC9QAUToP///YAA/wBHBQD/AAKAAAf/AAI6wP///0LA/wBEPYD/AM2AAP8ARQVA//8ygAD/AAKAAP8AAL1AiYAA0YuL/wACgAD/AAKAAP///0LA/wBq/YD/AT76wP///YAA/wAAx8CL/wACgAD//7j9QIuL///9gAD///3FQP8AAL2A//+7QAD//zHAAAX//5hAAP8BODrA///9vUD///9CgAUO9z+L/wBMBUD/ANF9QP8ARwVA/wBneED/AEwFQP8AHwUA/wBL+EAS/wC/hQD/AEv7AP8AZQUA/wBL+ID//9cHgP8AS/iAE/z/AiQCgP8BZwfAFf//mrYA//+xzID//7HCgP//msAA//+atcD/AE4zgP//scAA/wBlSgAf/wACgAD/AAKAAP8ARwVA///9gAD/AAKAAAf//8VKgP//0zCA/wAsxQD/ADrAAP8AOrXA/wAsz4D/ACzCgP8AOrWAH/8AAoAA/wACgAD/AEcFQP///YAAB///KYKA/wCzfYAViYAAi///uPrAiYAA/wACgACLBRP6/wBDgAD//5iHwAb///2AAP8AAoAAB/8AI/iAi66L/wACgACLi/8AAoAAi/8AZ3hA/wBEhQCL/wACgACLi/8AAoAAi/8ARwVAi/8AAoAA///9gACL//8sAoCLBf/+4XiA/wBq/UAViYAAi///uQfAiYAA/wACgACL/wCLh4CLi//9y3XAiYAA/wACgACLrov/ACP7AIv/AAKAAIuL/wACgACL/wI0ikD/AIqFAIv/AAKAAIsFi/8AAoAAi/8ARvhAi/8AAoAA///9gACL//6d+ICLBQ731aB2oHb/ANP9gP8ATAVA/wEW+sD/AEwFQP8AaEAAdxL/Ad8BQP8ATALAE7z/AS4+wP8C60LAFf//3AVA//+UgAD//yu9QP/9g3rA/wACgAD///9CgIv///2AAP8ARwLAi4v/AAKAAP8AAoAAQsD/AEW6wP8A0jrA/wBoh8CL/wBousCL0f//LcVAij1A/wACgACLrov/ACQCwIsF/wACgAD/AAKAAAb/AjR9gP8AinrAB/8AAoAA/wACgAAGi/8ARwVAi/8AAoAA///9gACL//6gR8CL///dOwD/AGhAAP///UUAQoAF/wA+uwD//0x4QBX/AG//wP/+sEKABv//UUVA/wEmwsAV/wBPOED7gv//YYVAiwUO9aB2oHb/ANUCgP8ATAKA/wHLQoB3EhOw/wEJRoD/AuxHgBX//we4QP19/wACgAD///84gIv///2AANGLi/8AAoAA/wACQoD///9CgP8ARoLA/wDTQAD/AGk6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S/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDvjPi/8AS/rA/wDzArD/AEwCkP8Aq/0w/wBMBWAS5f8AS/iT/wHrBNz/AP0CkP//Av1w/wBL+yQT9P8Bm3ri/wKDApAVdgoT+HcKE/R4ChP4eQoT9HoKE/h7ChP0fAoT+H0KE/R+Cv//s/qgBBP4fwoO+M+L/wBL+sD/APMCsP8ATAKQ/wCr/TD/AEwFYBLl/wBL+JP/AesE3P8A/QKQ//8C/XD/AEv7JBP0/wGbeuL/AoMCkBV2ChP4dwoT9HgKE/h5ChP0egoT+HsKE/R8ChP4fQoT9H4K//+z+qAEE/h/Cg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg7/AI4HwP8AS/rAAf8AynsA/wCOB8AVIAoO/wCOB8D/AEv6wAH/AMp7AP8AjgfAFSAKDv8AjgfA/wBL+sAB/wDKewD/AI4HwBUgCg77jf8Bp8AA/wDYQAAB/wA2fsD/AEcCgAP/ADZ+wPkUFSEKDvh0FPhBFYmNi4v5E48GjAwK1gqQzIyOjIyu9AwM1gvRjI6MjPchr6kMDRwALhMAYAIAAQBdAJgAwADUAPMBCwE2Ac8CYQKXAs0DTwO5A+8EPwRTBHIEigSpBMEE5gWfBk0G9Ac6B/IItAmQCeIKNApqCngK3QuFDDUM+Q0vDpUPGA/EEKkRRhHlEfcSlxLREwsTHRO9FEsUYxSCFJoU7xULFR0V9BZAFlQWcxaLFqMW3RcqFz4XVhd1F4oXrxfpGCMYaRigGOYZOBmKGcQaFhpoGqIbYBuaHE4ciB0hHVsdpx3HHdsd+h4SHjEeSR6GHqgfCP8ATAUAi/8AioKAi/8AAoAAi4v/AAKAAIv/AEb6wIv/AAKAAP///YAAi///dX2Ai///s/sAi///dHgAiYqAi4v///2AAIv//7kFQIv///2AAP8AAnWAiwUL///9gAD///2AAP//Kv2A/wACgAAH/wACgAD///9CgP8ARwKA/wDUxUD///2AAP8AAPrAi/8AAoAABQuL///9gACL//2B/UCL///9gAD/AAKAAIuui/8AIXsAi/8AAoAAiwUL/wACgACL/wBEgoCL/wBG+oCLBQv/AAKAAP8AAoAABov/AEcFQIv/AAKAAP///YAAiwUL//90gwD/Aer6wP8ARIKABv8ARvqAiwUL/wACgAD/AAKAAAaL/wBHAsCL/wACgAD///2AAIv//3IDAIv//7kFAIsFC4v///2AAIv//YH9QIv///2AAP///YAAi2iL///ehQCL///9gACL///9gACL//+7fYCL//+5BYCL///9gACLi/8AAoAAi/8ARwVAi/8AAoAA/wACgACLBf8Ai30A/wHq+sD//7t9gAb//7kFgIv///2AAIuL/wACgACL/wBHAsCL/wACgAD/AAKAAIv/AI39AIv/AEb7AIsFC4v///2AAIv//YH9gIv///2AAP8AAoAAi/8AJAUAi66L/wACgACLBf8AZQzA/wABQAD/AEvwwP8ATc9Ai/8AZHhAi/8AOwVA///mLgD/ADK1wP//1o9A/wAgQoD/AClwwP8AIFnA/wAZ0gD/ADKUQIv/ADsPgAj/AGVAAP//ssUA/wBOQAD//5m9gB7//7j7AAYL/wA5gAD///7AAP8ALH2A///Tl0CL///GI8CL///GJoD//9OCgP//0qZA///GgAD///61wAgL/wA5gAD///61gP8ALH2A///SpsCL///GJkCL///GHED//9OCgP//057A///GgAD///7AAAgL//9JusD//3THwP//dL2A//9JuoD//0m9wP8AizhA//90x8D/ALZFQB//AAKAAP8AAoAA/wBG+AD///2AAP8AAoAAB///dEVA//+WQoD/AGnKgP8Ai7gA/wCLuwD/AGm9gP8AacfA/wCLusAf/wACgAD/AAKAAP8ARwVA///9gAAHC4v///2AAIv//YH9gIv///2AAP8AAoAAi66L/wAkBQCL/wACgACLBf8AtQKA/wABSkD/AIn4gP8AispAi/8AtXCAi/8AtXNA//92B4D/AIrKQP//Sv2A/wABQAAI///9gACL//+4+wCLBQv/AImAAP///rYA/wBpgoD//5amQIv//3UhQIv//3UZwP//ln2A//+Wo8D//3aAAP///sAACAuL///9gACL//+4+sCL///9gACL//9UAsCL///9gACL//+4+oCL///9gACL//8NCACL///9gACL//+4/YCL///9gAD/AAKAAIv/ACP6wIsFC/8AJYAAi/8AM4VAi/8AewKAiwUL/wACgAD/AAKAAAaL/wBHAoCL/wACgAD///2AAIsFC///UXhA/wDy+AD/ADOFQAb/AHsCgIsFC/8AAoAA/wACgAAGi/8ARwWAi/8AAoAA///9gACLBQv//1F4QP8Aq/1A/wAzhUAG/wB7AoCLBQv/AAKAAP8AAoAABov/AEcFQIv/AAKAAP///YAAi///B/2AiwULiYAAi///uP2AiYAAi///VAKAiYAAi///uPqAiYAAi//+w4WAiYAA/wACgACLrouui/8AAoAAi4v/AAKAAIv/ATx6gAX/ADOFAIv/AHv7AIv/AAKAAIuL/wACgACL/wBHBYCL/wACgAD///2AAIv//1CAAIuL/wCr/YD/ADOFAIv/AHv7AIv/AAKAAIuL/wACgACL/wBHAoCL/wACgAAF///9gACL+4yLBQv//0q1gP//c8UA//90x8D//0m9gP//SrXA/wCMOwD//3THwP8AtUqAH/8AI/qAi66L/wACgACLi/8AAoAAi/8BYfqAi/8AAoAA///9gACL//+5BYCL///9gACLiYAAi//+5oWABf//doAA/wABQAD//5Z9QP8Aal6Ai/8AieQACP8Ai7CA/wBqwsD/AGnHgP8AisAAHv8AAoAA/wACgAD/AEcCwP///YAABwuL///9gACL//2DAoCL///9gAD/AAKAAIv/ACP4QIuui/8AAoAAi4v/AAKAAIv/ARiAAP8AZ4VAi/8AaH2Ai4v//ueAAIv///2AAP8AAoAAi66LBa6L/wACgACLi/8AAoAAi/8CfP2Ai/8AAoAA///9gACLRYv///2AAIuL///9gACL//7nfQD//y/9QIuL/wEYgwCL/wACgAD///2AAIv//7kHwIsFC4v///2AAIv//YL4QIv///2AAP8AAoAAi/8AJAKAi66L/wACgACLi/8AAoAAi/8CfQfAi/8AAoAA///9gACL//+4/YCLBQuL///9gACL//4iCoAF///ORQD//9o4gP//2zNA///PSkD//89AAP//20AA/wAkwoD/ADHFQB6L/wAz/YCL/wACgAD///2AAIv//7j6wIv///5HwIuL//+z+sAFlf//r2uA/wBCuED//8SUgP8AVAVAi/8AVUeAi/8AQb2A/wA748D/AAmcQP8AUSGA/wAEQoD/AK5CgP///bCA/wCwQADrwP8AlnWACP///iFAi///uFwAiwULiYAAi//9gf2AiYAA/wACgACLrov/ACOzAIv/AALHgIuL/wACgAD/AEQ9gP8AzAeA/wBEwAD//zM7AP8AAoAA/wAAvYCL///9gAD/AEa9gIuL/wACgAD/AALHgP8AAMAABf//lYMA99L/AGp9AP8BPkAA///9OID/AAECgIv/AAKAAP//uUKAi4v///2AAP///YAA/wABBQD//3cCgP/+ZTiAi/8BmcKAi/8AAoAA///9OICL//+5TQCLBQuL///9gACL///++sCL//2DAsCL///9gAD/AAKAAIv/AEcFAIv/AAKAAIuL/wACgACL/wGY/UD/AKv9gP/9/EAA/wACgAD/AADAAP8AAjsAQAD/ACQCgP8Aa4AA/wCIQAD/AZhAAIv//mcCwAX///2AAP8AAoAAB/8ARwUAi/8AAoAAi4v/AAKAAIv/An4CgIv/AAKAAP///YAAi2iL///b+wCL///9gACLinrA//9RgoD//fOAAP//UYKA/wIMgACL/wABhUD///2AAItoiwX//9v7AAYL/wCLuoD/AGnIAP//ljgA//90RUD//3VAAP//ljgA//+VPUD//3RFgP//dUoA//+VM4D/AGrNAP8AirXA/wCLusD/AGrMgP8AacgA/wCKtgAfC///Sb0A//90yAD//3THgP//SbsA//9KtcD/AIs4AP//dMeA/wC2QwD/ALZFAP8AizgA/wCLOID/ALVKQP8AtkUA//90yAD/AIs4gP//SbsAHwv/ADl1gP///rWA/wArgsD//9OhQIv//8YjwIv//8YmgP//1H1A///ToUD//8aKgP///rXACAuL///9gACL//2C/8AFCYAA/wACgAAHrov/ACQFQIv/AAKAAIuL/wACgACL/wEYgsAF/wBkCgD/AAFKQP8ATPNA/wBNxQCL/wBkbgCL/wBlaQD//7MCwP8ATM0AJ/8AAUpACP///YAAi///uPrAiwUL//9JvYD//3THwP//dL1A//9JuwD//0m9QP8AizhA//90x8D/ALZCgB//AC9FQIv/ACxzAP8ACThA/wAnz4D/ABEHwAj/AAg9gP//54LA/wACOED/AAC9QIv///2AAP8ARwVAi4v/AAKAAP8AAoAA/wAAvYB3xwX/AE11gP8AOc9A/wAwj4D/AFyzQIv/AGu7AAj/ALZFAP//dL2A/wCLQsD//0m6wB4L/wCLusD/AGnIAP//ljhA//90RUAfi///txxA///jFwD//8BUgP//0KkA///T0cAI///DQoD/ALXCgP///YAA///++wCL/wACgAD//7j6wIuL///9gAD///2AAP///0KA/wBKfYD//yI9gAX//+ACgP//8T1A///b1ID///fAAP//2SuAiwj//3RHwP//ljXA/wBpyoD/AIu4QP8Ai7rA/wBpykD/AGnHwP8Ai7hAHwuL///9gACL//2C+ACL///9gAD/AAJrgIv/ACMUgIuui/8AAoAAi4v/AAKAAIv/ARiAQAX/AA5XAP8AADNA/wAN8MD/AAGuAP8ADTWA/wADHsAI/wBfvYD//uHAAP8AAkLA/wAAv8CL///9gAD/AEcFAIuL/wACgAD/AAKAAP8AAMgA//+WusD/ATu9QAX/ACsAQP8AIHXA/wAbRQD/ADN7AIv/ADuKAAj/AGZNAP//scKA/wBNOwD//5m7AB7//7nrgAYL/wA6esD///7AAP8AK4LA///ToUCL///GHACL///GJAD//9R9QP//06FA///FhUD///7AAAgL//+awAD//7HCgP//ssfA//+ZsID//5rAAP8ATj2A//+xwoD/AGVAAP8AOsAA/wAtx4D//9MzQP//xVIA///FSkD//9IuAP//0i4A///FSoAf///GMICL///TlID/ACyHwP///sAA/wA5gAD4QP8AANSA/wAAB8D/AADRwIv/AADZwAiLrov/AAKAAP///YAAi///uP2AiYAAi4v///2AAItoiYAABf8AAUpA//+a/YD/AE3FAP//s/rA/wBkbkCLCP8AZkUA/wBNQoD/AE1FQP8AZkKA/wBlQAD//7LHwP8ATkAA//+ZsMD//8VKAP//0zsA/wAswoD/ADq1wP8AOsAA/wAsxQD/ACzFQP8AOrYA/wA6wAD/AC3HgP//0zCA///FSkAfi2iL///9gAD/AAKAAIuui66L/wACgACLi/8AAoAAi64F/wBmRUD//7K9gP8ATUKA//+ZuwAeC4v///2AAIv//7j9gIv///2AAP8AAoAAi/8Ai4fAi4v//cuAAIv///2AAP8AAoAAi66L/wAj+sCL/wACgACLi/8AAoAAi/8CNIAA/wCLfYCL/wACgACLBYv/AAKAAIv/AEcCgIv/AAKAAP///YAAi///dIKAi///tAVAi///dHhAiwULiYAAi/xgiYAABf8AAUfA//+bB8D/AEzXAP//s/sA/wBlaUCL/wBkbcCL/wBNxQD/AEv6wP8AAUpA/wBlAoAIi/8AAoAAi/hgi/8AAoAA///9gACL//+4+wCL///9gACLiYAAi/xgBf//xUpA///TM0D//9I4gP//xVTA///FSgD//9IuAP8ALdHA/wA6q4Aei/hgi/8AAoAA///9gACLRYsFC4v///2AAP///bsA///+6QD/AI2FAP/+whyA//9yewD//sH9QP8AAkUA///+/UCL///9gAD/AEcDAIuL/wACgAD/AAKAAP///0AA/wBn/QD/AOnAAP8AaEAA//8WQAD/AAI7AP8AAMAAiYAA/wBHBQCLi/8AAoAABf8AAoAA/wABAsD//3KDAP8BPgLA/wCNfQD/AT3jgP///YAA/wABFwCL/wACgAD//7j7AIuL///9gAD///3FAP8AAMAA//+XwAD//xaFgP//mAMA/wDpeoD///2AAP///0AAi/8AAoAABQuL///9gAD///27AP///wUA/wCMx8D//sEXQIv//sHrgIv///2AAP8AAoAAi/8AI/rAi66L/wACgACLi/8AAoAAi/8BPngA/wCN/YD/AT6FQP///YAA/wAA+wCL/wACgAD//7kFAIsFiYAA///9vYD/AAECgP//l72A//8WQAD//5jCgP8A6cAA///9xUD///79gIv/AAKAAAULiYAAi///uP2AiYAA/wACgACL/wCfBQCL/wBYwACL//8FuwD//cx7AP8AAoAAB4CL///9gAD/ACCAAIv/ACaCgIv/AHv9gIv/AJ8FAIv/AAKAAIuL/wACgAAFi/8ARviAi/8AAoAA///9gACL//8IOwCL/wD6RQD/AjN6wP///YAA/wABDMCL/wACgABoi//+wPsAiwUL//+xQAD//xM9QP8AncgAiwULiYAA/wACgAD/AAC9gPdp//2COsD///2AAP///wVAiYAA//+4/YCLi/8AAoAA///9uoD///9CgP//uYgA/wDTQAD//5d4AIv//5fIAIv//7m6gP//LMAA///9xYD/AAC9gIv///2AAP//uP2AiwWL/wACgAD///26gP8AAPrA/wDTwoD/An3FQP8AAoAAQoCL/wACgAAFC/8A1T2A//+4/UD///76gP///YAAiYAA//8rCACLi/8AAoAA///9gACLi/8ARwLA/wACgACLBQv//yrCgP//uP1A/wABBYD///2AAIv///2AAP8A1PgAi4v/AAKAAP8AAoAAi4v/AEcCwP///YAAiwUL/wBOwAD//xM9QP//YjgAiwULiYAA///9gAD/AAC9gPtp//2COsD/AAKAAP///wVAiYAA/wBHAoCLi/8AAoAA/wACRYD///9CgP8ARngA/wDTQAD/AGiIAIv/AGg4AIv/AEZFgP//LMAA/wACOoD/AAC9gIv///2AAP8ARwKAiwWL/wACgAD/AAJFgP8AAPrA//8sPYD/An3FQP///YAAQoCL/wACgAAFC///B9cA//0YAoD/AAKwgP///v2AiYAA/wBHBQCLi/8AAoAA/wACgAD///9AAP8ARoAA/wDTQAD/AGf9gIv/AGhCgIv/AEY7AP//LMAAikAA/wACgACL/wAkBQCL/wBY+wCL/wB7AoCLBf8AAoAA/wACgAAGi/8ARwKAi/8AAoAA///9gACLBQv//1GCgP8A8viA/wAzewAG/wB7AoCLBQv/AAKAAP8AAoAABov/AEcFAIv/AAKAAP///YAAiwUL//9RgoD/AKv9gP8AM3sABv8AewKAiwUL/wACgAD/AAKAAAaL/wBHAoCL/wACgAD///2AAIv//wf9gIv///2AAIuL///9gACL//+4/YCL///9gACL//9UAoCL///9gACL//+4+wCL///9gAAFC4v//6hFAP//U8UA/wIEQAD///29gP///vsABQv/AE8FgP//Ez2A//9iOoCLBQv//0m9gP//dL2A//90x8D//0m6wB+L//9qq4D/AF2CgP//h4fA/wCF/YD//9lKQAj//82HgP//aIKA/wACgAD///79gIv///2AAP8ARvsAi4v/AAKAAP8AAoAAi4v/AJJAAAX/ABXzQP//+4pA/wAW+ED///2zQP8AF5cAiwj/AAKAAP8AAoAA/wBHAoD///2AAP8AAoAAB///dEfA//+WNcD/AGnHwP8Ai7rA/wCLuwD/AGnKQP8AacfA/wCLuEAf/wACgAD/AAKAAP8ARvrA///9gAAHC4v///2AAIv//7j6wIv///2AAIv//1QCwIv///2AAIv//7j7AIv///2AAIv//wz9QIv///2AAIv//7kHwIv///2AAP8AAoAAi66LBQv/ACWAAIv/ADN9gIv/AHwFAIsFC/8AAoAA/wACgAAGi/8ARvhAi/8AAoAA///9gACLBQv//1B9gP8A8wLA/wAzfYAG/wB8BQCLBQv//1B9gP8Aq/1A/wAzfYAG/wB8BQCLBQv///84gP///YAA///9gACLi///uPsA/wACgACLiYAA/wD4AoCLi/8AAoAA/wAAvYD/AAKAAAULiYAAi///uP3AiYAAi/tAiYAAi///uP1AiYAAi///DQfAiYAAi///uPsAiYAA/wACgACL/wAkBQCLBQv/ACWAAIv/ADJ1wIv/AHwHwIsFC///UYKA/wDy+ED/ADJ1wAb/AHwHwIsFC/8AAoAA/wACgAAGi/8ARwLAi/8AAoAA///9gACLBQv//1GCgPdA/wAydcAG/wB8B8CLBQv/AAKAAP8AAoAABov/AEcCQIv/AAKAAP///YAAi///B/2AiwUL//8IOID//7j9QP8AAIKA///9gACL///9gAD/APgCgIuL/wACgAD/AAKAAIuL/wBHAsD///2AAIsFC0KA///9gAD///2AAIuL//+4+wD/AAKAAIuL///9gAD/ANP9gIuL/wACgAD/AAD6gP8AAoAABQuL///9gACL//2CB8CL///9gAD/AAKAAIuui/8AJALAi/8AAoAAi4v/AAKAAIv/An34QIv/AAKAAP///YAAi///uP1AiwUL//8rQoD//7kHgP8AAMAA///9gACL///9gAD3aYuL/wACgAD/AAKAAIuL/wBG+ID///2AAIsFC4v///2AAIv//YH9gIv///2AAP8AAoAAi/8AI/sAi66L/wACgACLi/8AAoAAi/8CfgKAi/8AAoAA///9gACL//+5BQCLBQv/ALZPgP8AizhA//90x4D//0m7AP//Sb2A//90x8D//3S9gP//SbCA//9JvYD//3THwP8Ai0KA/wC2QoD/ALZFAP8AizhA/wCLOID/ALZCgB8L//90R8D//5ZCwP//ljiA//90RQD//3RHwP8Aab1A//+WOED/AIu4QP8AisAA/wBqwsD/AGnHwP8Ai7hA/wCLuwD//5U9QP8AaceA//91QAAfC/8BYcAA//+5BQDFQP///kAAiMAA//6d+ECLi/8AAoAA///9gACLi/8ARvsA/wACgACLBQv//0mwgP//dMfA//90x4D//0m7AP//Sb2A/wCLOED//3S9gP8Atk+A/wC2QoD/AIs4QP8Ai0KA/wC2QoD/ALZFAP//dMfA/wCLOID//0m9gB8L/wCLuED/AGm9QP//ljiA//90RQD//3RHwP//lkLA//+WOED//3RHwP//dUAA//+VPUD/AGnHwP8Ai7hA/wCLuwD/AGrCwP8AaceA/wCKwAAfC//+nkAA//+5BQD/AAA6wP///kAAiMAA/wFiB8CLi/8AAoAA/wACgACLi/8ARvsA///9gACLBQuL///9gACL//4zCACL///9gAAF/wABSkD//5v1gP8ATcVA//+zCoD/AGRuAIsI/wBlSkD/AE41wP8ATjWA/wBlSoAfi/8BzPgAi/8AAoAA///9gACL//+4+sCL///9gACLiYAAi//+MwgABf//xUAA///TPYD//9M6wP//xUfAHv//xhxAi///06uA/wArhUD///61wP8AOYAACIv/AAKAAIv/Acz4AIv/AAKAAP///YAAi///uQUAiwULwoD///2AAP///YAAi4v//7j9QP8AAoAAi4v///2AAP8BYf2Ai4v/AAKAAP8AAIAA/wACgAAFC4v///2AAIv//jL7AIv///2AAAX/AAFKQP//m/WA/wBNxUD//7MNAP8AZG4Ai/8AZWkAi/8ATMzA/wBM/YD/AAFHwO8Ii/8AAoAAi/8BzQUAi/8AAoAA///9gACLRYv///2AAIuL///9gACL//4y+wAF///FVID//9I4QP//0zMA///FSkD//8VKQP//0zNA/wAswoD/ADq2AB6L/wHNBQCL/wACgAD///2AAIv//7kFAIsFC//+ngKA//+5B4D/AACCgP///YAAiYAA/wFh+wCLi/8AAoAA/wACgACLi/8ARviA///9gACLBQuL///9gAD///27AP///wUA/wCNwoD//sD7AIv//sIHgIv///2AAP8AAoAAi66L/wAkBQCL/wACgACLi/8AAoAAi/8BPniA/wCM+ID/AT6FAP///YAA/wAA+wCL/wACgABFiwWL///9gAD///3HgP8AAQKA//+XvYD//xYFAP//l72A/wDp+wD///29gP///v2Ai/8AAoAABQv//p29gP//uPsA/wAAgoD///2AAIv///2AAP8BYfsAi4v/AAKAAP8AAoAAi4v/AEcFAP///YAAiwUL//9JvbH//3THbf//dL1w//9JvXD//0m6oP8AiziT//90x/D/ALZCTx//AGQUvIv/AFcwYv8AKfWB/wA6PXD/AEQKfwiL///d+sAFC4v///2AAIv//7kFQIv///2AAP8AAoAAi/8AI/skiwUL/wAlgACL/wAygACL/wB8B2yLBQv/AAKAAP8AAoAABov/AEb6wIv/AAKAAP///YAAiwUL//9ReJT/APMCsP8AMoAABv8AfAdsiwUL/wACgAD/AAKAAAaL/wBHApCL/wACgAD///2AAIsFC///UXiU/wCr/TD/ADKAAAb/AHwHbIsFC/8AAoAA/wACgAAGi/8ARwVgi/8AAoAA///9gACL//8H/XCL///9gACLiYAAi///uPqgiYAABQv//94FYAf//8XCkP8ARAKQ//+oz57/ACn9cP//m+tEiwgL/wCLuuL/AGnHrP//ljhS//90R+4f///9gAAH///+wAD//3WFH///lqao//+XeDH//3UWyosI//91Sn7//5UzM/8AacfP/wCLuuH/AIu4Ev8AaszN/wBpx67/AIq1gh8LAAH0AAAAlgAAAeAAPAHgADwDIAArAeAAPAK8AEAB4AA8ALQAMwGQAFsBkABbAeAAPAHgADwAtAAzAeAAPAOEADkBkAA3AgYAGgCdACgB/AAnAeAAKgHQABECCAAsAggAGwGfABwBtQAnAgkAGwCxADID6ACzAlgAMQRGAFMCWAAxAlgAMQLuADYCFwAQAVkALQF9ABwB2gAnAWEAMQFWACwByAAeAcsAMgCxADIBfwAdAXgAKwFUACsCWgAyAtkABwKzABgBSgAmArQAGAF4ACsBtwAnAY0AEgHHAC8CGQARAu0AEQGsACIBiAAQAbIAJQGQAFsBkAA3AZAAWwPoAUAD6AFAA+gBQAIWABABWQAtAX0AHAHaACcBYQAxAVYALAHIAB4BywAyALEAMgF/AB0BeAArAcMALQJaADIBhQAyArMAGAFKACYCtAAYAXgAKwG3ACcBjQASAccALwIYABEC7AARAawAIgGIABABsgAlAeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAFCACIB4AA8Au4ANQHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAFCACIB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwCFwARAhcAEQHgADwB4AA8AeAAPAHgADwDFgA3AX0AHAFhADEBYQAxAeAAPAHgADwAsf/tALH/7QHgADwB4AA8AeAAPAHgADwCswAXArMAFwHgADwB4AA8AeAAPAHgADwB4AA8AccAMAHHADAB4AA8AeAAPAGIABAB4AA8AeAAPAIXABECFwARAeAAPAHgADwB4AA8AeAAPAMWADcBfQAcAWEAMQFhADEB4AA8AeAAPACx/+0Asf/tAeAAPAHgADwB4AA8AeAAPAKzABcCswAXAeAAPAHgADwB4AA8AeAAPAHgADwBxwAwAccAMAHgADwB4AA8A+gBQAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAPoAFoD6ABaAeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8AeAAPAHgADwB4AA8ALQAMwAAAAEAAAAAxcmyNAAAAADI7kQHAAAAAMjvk+0=');font-weight: normal;font-style: normal;}</style><div xmlns="http://www.w3.org/1999/xhtml"?style="transform: scale(1.5);transform-origin: top left; display: inline-block"><style>div { color:?#1a1a1a;font-size: 36px;font-family: Lineal;font-weight: normal;font-style: normal;font-variant: normal;letter-spacing: 0px;text-align: center;padding: 0px;white-space: pre-wrap;line-height: 36px;word-wrap: break-word;max-width: 274.26368140781403px } * { padding: 0px } p { line-height: 51.42857142857143px } a { color: #4c84ff }</style><div style="padding:0;"><p style="margin:0; padding: 0">abcdefghijkl</p></div></div></foreignObject></svg>

將svgURL貼進上面的在線平臺,查看渲染結果:

svg內容帶上字體base64信息
svg內容帶上字體base64信息

直接將svgString插入到document文檔流中,可以渲染相應字體,而放在img中加載不會繼承樣式。 我們可以得出一個結論:

SVG 被當作圖片加載時(如放在 ?或用于 Canvas 繪制)是脫離 HTML 文檔上下文的,它不會繼承頁面里的 CSS、link 或 style 樣式。

解決方案

現有的 PixiJS 中HTMLText渲染富文本的方式,處理紋理更新是采用svg + foreignobject方案。字體文件大(中文常上 MB 級),導致加載緩慢,甚至阻塞渲染。為了讓字體樣式不丟失,需要將字體數據轉 Base64, 嵌入會讓 SVG 體積暴漲。

? 方法一:字體子集化(最推薦)

僅保留所需字符,極大減小字體體積

工具推薦:
  • Fontmin(Node.js 工具)

  • [Glyphhanger](https://github.com/filamentgroup/glyphhanger)

  • 在線:FontSubsetter

步驟:
  1. 提取文本,例如?"你好世界"

  2. 使用 Fontmin 等工具生成僅包含這些字符的字體子集(.woff2?等)

  3. 將字體嵌入 SVG,或遠程引用

SVG 中嵌入子集字體示例
<svg?xmlns="http://www.w3.org/2000/svg"?width="300"?height="100"><foreignObject?width="100%"?height="100%"><style>@font-face?{font-family:?'MySubsetFont';src:?url(data:font/woff2;base64,...subset font base64...)?format('woff2');}div?{font-family:?'MySubsetFont';font-size:?24px;}</style><div?xmlns="http://www.w3.org/1999/xhtml">你好,世界!</div></foreignObject>
</svg>
優點:
  • 幾 KB 的字體即可完整顯示中文

  • 可嵌入?<foreignObject>?作為富文本渲染

? 方法二:將文字轉為路徑(Path)

將文字轉為 SVG 中的 path 元素,避免字體依賴

工具:
  • Illustrator / Inkscape / svg-text-to-path 工具

優點:
  • 不依賴字體文件

  • 100% 可視、跨平臺一致渲染

缺點:
  • 文本無法被選中或編輯

  • 文件體積可能因路徑復雜度而增大

? 方法三:使用系統字體(不推薦用于中文)

使用用戶本地安裝的字體,例如?SimSun,?Arial

缺點:
  • 樣式不可控,在未安裝字體的設備上顯示不一致

  • 離線或導出使用時易失效

  • 不推薦,本身就需要字體不丟失,并且支持該功能

總結對比表

方案

優點

缺點

子集字體

最推薦,字體小,兼容性好

需要構建工具,流程稍復雜

轉路徑

穩定,無依賴

不可編輯,體積可能增大

系統字體

簡單,無需額外處理

顯示不一致,離線不可靠

在當前項目中,嘗試采用 GPT 提供的方案均未能適配實際需求。若不改變 HTMLText 紋理更新方案,可選擇的方式極為有限。

曾設想繼續使用 HTMLText 節點渲染富文本內容,并期望 PixiJS 內部能暴露接口,允許外部將更新后的紋理直接傳入進行渲染。然而,與作者溝通后此提議被否決,作者建議自行繪制 canvas 內容,再將其作為 Sprite texture 更新。但該方式存在明顯弊端,背離了使用現有庫簡化開發的初衷,有本末倒置之嫌。

此外,就 “為何 PixiJS 內部采用 SVG 方案而非其他紋理更新方式” 與作者展開探討,最終作者仍堅持現有方案。至此,使用 PixiJS 的 HTMLText 節點渲染富文本時,在涉及中文字體的場景下,卡頓問題始終難以攻克。

若轉而采用原生 canvas 處理富文本渲染,雖可解決卡頓問題,但面臨更多復雜挑戰:

  1. 文本分行處理:需設計分行邏輯,逐行檢測寬度,精準定位需切分的 segment 片段;

  2. segment 切分規則:涉及軟切分與硬切分,針對中文字符、英文字符、半角符號等不同詞性,制定差異化切分規則;

  3. 字符尺寸測量與緩存:需測量 segment 寬度和高度,同時為提升性能,需對對應字符進行緩存處理。

方案對比與困境

最初選擇 PixiJS 的 HTMLText 進行富文本渲染,正是為避免原生 canvas 方案過高的實現成本。但從當前情況來看,兩種方案均存在難以逾越的技術瓶頸。在開發效率與性能優化之間,如何權衡取舍,成為解決的關鍵問題。?如果是你,你會怎么選擇呢?

模塊設計

PixiJS 能高效支持游戲開發,歸根到底是它在底層架構設計中,融合了多個經典的軟件設計模式和圖形學結構。這些模式為 靈活的擴展性、對象管理、渲染流程、事件處理等 提供了可靠支撐。

在翻閱HTMLText源碼中實現的過程,就發現一些經典的模式,比如對象池:

BigPool對象池
BigPool對象池

對象池(Object Pool)是 PixiJS 或任何性能敏感場景(如游戲、粒子系統、動畫系統)中非常常見的優化技術,尤其適用于頻繁創建和銷毀對象的場景。

對象池技術的核心價值在于減少創建和銷毀對象的開銷,適用于以下場景:

  • 頻繁創建 / 銷毀對象(如臨時計算、事件處理)。

  • 資源密集型對象(如數據庫連接、網絡套接字)。

  • 需要嚴格控制內存使用(如嵌入式系統、移動應用)。

對象池在PixiJS中,由Pool和PoolGroup一起實現。

Pool(泛型類)
// 泛型參數 T 限制為實現了 PoolItem 類型的對象(即可能包含 init() 和 reset() 方法的對象)。exportclass?Pool<T?extends?PoolItem>
{/** @internal */public?readonly _classType: PoolItemConstructor<T>;private?readonly _pool: T[] = [];?// 實際的對象池數組,存放可復用的對象。// 累計創建過的對象總數。private?_count =?0;?// 當前池中可用對象的數量(即 _pool 中“有效”的長度)。private?_index =?0;constructor(ClassType: PoolItemConstructor<T>, initialSize?:?number){this._classType = ClassType;// 如果傳入 initialSize,就預先創建這么多對象并放入池中。if?(initialSize){this.prepopulate(initialSize);}}// 預填充方法// 調用構造器創建指定數量的對象,存入池中。public?prepopulate(total:?number):?void{for?(let?i =?0; i < total; i++){this._pool[this._index++] =?newthis._classType();}this._count += total;}publicget(data?: unknown): T{let?item;if?(this._index >?0){item =?this._pool[--this._index];}else{item =?newthis._classType();}item.init?.(data);return?item;}publicreturn(item: T):?void{item.reset?.();this._pool[this._index++] = item;}get?totalSize():?number{returnthis._count;}get?totalFree():?number{returnthis._index;}get?totalUsed():?number{returnthis._count -?this._index;}// 將池清空public?clear(){this._pool.length =?0;this._index =?0;}
}// 可拓展性好:通過 init() / reset() 實現狀態初始化與清理。
exporttype?PoolItem = {init?:?(data?:?any) =>void;reset?:?()?=>void;[key:?string]:?any;
};// PoolItemConstructor 是一個構造器類型約束,確保能用 new 來構造。
exporttype?PoolItemConstructor<K?extends?PoolItem> =?new?() => K;

對象池也支持更多高級特性(如 async 初始化、生命周期跟蹤、懶回收等),在PixiJS中并未實現,可能暫時沒有用到的場景。

PoolGroupClass(對象池管理器)

在前面對象池?Pool?基礎上構建的一個對象池管理器,用于統一管理多個不同類型的對象池。

import?{ Pool }?from'./Pool';importtype?{ PoolItem, PoolItemConstructor }?from'./Pool';exporttype?PoolConstructor<T?extends?PoolItem> =?new?() => Pool<T>;exportclass?PoolGroupClass
{private?readonly _poolsByClass: Map<PoolItemConstructor<PoolItem>, Pool<PoolItem>> =?new?Map();// 預先向某個類的對象池中添加一定數量的對象,用于初始化緩存。public?prepopulate<T?extends?PoolItem>(Class: PoolItemConstructor<T>, total:?number):?void{const?classPool =?this.getPool(Class);classPool.prepopulate(total);}// 從指定類型的池中獲取一個對象:// 如果池中有可用對象,就復用, 否則創建新的。// 自動調用 init(data) 初始化(由 Pool 內部處理)publicget<T?extends?PoolItem>(Class: PoolItemConstructor<T>, data?: unknown): T{const?pool =?this.getPool(Class);return?pool.get(data)?as?T;}// 將對象歸還池中。通過 item.constructor 找到對應的池,調用 pool.return(item) 復用它。// 使用者不需要關心具體歸還到哪個池// 支持任意類型的對象publicreturn(item: PoolItem):?void{const?pool =?this.getPool(item.constructor?as PoolItemConstructor<PoolItem>);pool.return(item);}public?getPool<T?extends?PoolItem>(ClassType: PoolItemConstructor<T>): Pool<T>{if?(!this._poolsByClass.has(ClassType)){this._poolsByClass.set(ClassType,?new?Pool(ClassType));}returnthis._poolsByClass.get(ClassType)?as?Pool<T>;}// 統計當前所有池的使用情況:public?stats(): Record<string, {free:?number; used:?number; size:?number}>{const?stats = {}?as?Record<string, {free:?number; used:?number; size:?number}>;this._poolsByClass.forEach((pool) =>{const?name = stats[pool._classType.name]? pool._classType.name + (pool._classType?asany).ID : pool._classType.name;stats[name] = {free: pool.totalFree,used: pool.totalUsed,size: pool.totalSize,};});return?stats;}
}// 單例導出 BigPool
// 全局可用,便于跨模塊共享統一的池系統。
exportconst?BigPool =?new?PoolGroupClass();

實現了如下功能:

  • 自動按類型管理對象池

  • 動態獲取/創建池

  • 預填充池對象

  • 對象歸還

  • 獲取使用統計

其中核心結構:

// key 是構造函數(類型)
// value 是該類對應的對象池 Pool<PoolItem>
// 借助構造函數作為 key,可以區分不同類型的對象(例如 Bullet, Enemy, Particle 各自有獨立的池)。
private?readonly _poolsByClass: Map<PoolItemConstructor<PoolItem>, Pool<PoolItem>>;

再比如不用關心什么時候歸還到哪個池中:

// 將對象歸還池中。通過 item.constructor 找到對應的池,調用 pool.return(item) 復用它。// 使用者不需要關心具體歸還到哪個池// 支持任意類型的對象public?return(item: PoolItem):?void{const?pool =?this.getPool(item.constructor?as PoolItemConstructor<PoolItem>);pool.return(item);}

設計的優勢:比如類型安全,使用泛型和構造函數精確綁定類型。首次會幫你自動注冊,同時也避免了頻繁的new和GC。

使用起來很方便,比如在HTMLTextSystem中需要獲取htmlTextData數據的時候,通過簡單的get就行:

例子
例子

當然PoolGroupClass可以繼續拓展,比如:

  • 支持設置池容量上限,防止無限增長。

  • LRU 或閑置回收機制,防止冷對象堆積。

  • 異步對象初始化支持,適合需要加載資源的對象。

在HTMLTextSystem中,還涉及到了資源緩存類:CacheClass。它設計了一個功能齊全、可擴展的 資源緩存管理系統,支持資源存取、別名、多 key 映射、自動解析器支持等,服務于 PixiJS 的資源系統(如 Assets 模塊)。

源碼如下,部分注釋:

import?{ warn }?from'../../utils/logging/warn';
import?{ convertToList }?from'../utils/convertToList';
importtype?{ CacheParser }?from'./CacheParser';class?CacheClass
{// 自定義緩存解析器列表,可用于分解資源private?readonly _parsers: CacheParser[] = [];// 核心緩存 Map:key 對應資源本體。private?readonly _cache: Map<any,?any> =?new?Map();// key → 關聯的多個別名、解析出的緩存 key 的映射。主要用于清理時能還原關系。private?readonly _cacheMap: Map<string, {keys:?string[],cacheKeys:?string[],}> =?new?Map();// 清空整個緩存和映射關系。public?reset():?void{this._cacheMap.clear();this._cache.clear();}public?has(key:?any):?boolean{returnthis._cache.has(key);}publicget<T =?any>(key:?any): T{const?result =?this._cache.get(key);if?(!result){// #if _DEBUGwarn(`[Assets] Asset id?${key}?was not found in the Cache`);// #endif}return?result?as?T;}// 這是核心的緩存設置函數,處理邏輯較復雜:// 支持多 key(別名)綁定publicset(key:?any?|?any[], value: unknown):?void{// // 統一處理為數組const?keys = convertToList<string>(key);let?cacheableAssets: Record<string,?any>;// 支持自動解析資源(例如紋理圖集可能拆成多個子紋理):for?(let?i =?0; i <?this.parsers.length; i++){const?parser =?this.parsers[i];if?(parser.test(value)){cacheableAssets = parser.getCacheableAssets(keys, value);break;}}const?cacheableMap =?new?Map(Object.entries(cacheableAssets || {}));if?(!cacheableAssets){keys.forEach((key) =>{cacheableMap.set(key, value);});}const?cacheKeys = [...cacheableMap.keys()];const?cachedAssets = {cacheKeys,keys};keys.forEach((key) =>{this._cacheMap.set(key, cachedAssets?asany);});cacheKeys.forEach((key) =>{const?val = cacheableAssets ? cacheableAssets[key] : value;if?(this._cache.has(key) &&?this._cache.get(key) !== val){// #if _DEBUGwarn('[Cache] already has key:', key);// #endif}// 存入緩存 _cache 中,同時進行沖突檢查this._cache.set(key, cacheableMap.get(key));});}public?remove(key:?any):?void{if?(!this._cacheMap.has(key)){warn(`[Assets] Asset id?${key}?was not found in the Cache`);return;}const?cacheMap =?this._cacheMap.get(key);const?cacheKeys = cacheMap.cacheKeys;cacheKeys.forEach((key) =>{this._cache.delete(key);});cacheMap.keys.forEach((key:?string) =>{this._cacheMap.delete(key);});}// 對外暴露解析器數組,用于注冊自定義 CacheParserpublicget?parsers(): CacheParser[]{returnthis._parsers;}
}// 全局唯一單例
exportconst?Cache =?new?CacheClass();

多key支持,自定義解析器,清理機制的處理等,都值得我們借鑒,其中解析器定義是可自動處理復雜資源(如圖集、字體)

比如內置的cacheTextureArray,用于解析一類特定的資源類型:Texture 數組。它遵循 CacheParser 接口結構,并提供了將?Texture[]拆解為可緩存資產的能力。如下源碼:

export?const?cacheTextureArray: CacheParser<Texture[]> = {extension: {type: ExtensionType.CacheParser,name:?'cacheTextureArray',},test:?(asset:?any[]) =>Array.isArray(asset) && asset.every((t) =>?t?instanceof?Texture),// 用戶調用 set 時自動啟用,無需關注解析細節getCacheableAssets:?(keys:?string[], asset: Texture[]) =>{const?out: Record<string, Texture> = {};keys.forEach((key:?string) =>{// 將原始資源分解成可以單獨緩存的部分asset.forEach((item: Texture, i:?number) =>{out[key + (i ===?0???''?: i +?1)] = item;});});return?out;}
};

甚至你可以設計一個適配你項目自定義格式(比如 Spine、DragonBones 動畫資源)的 CacheParser,適配你的需求。

小結尾

PixiJS 作為高性能 2D WebGL 渲染引擎,其架構設計有諸多亮點值得深入研究。精妙的分層架構、高效的渲染策略、靈活的插件機制和清晰的抽象接口等等....實現了復雜圖形渲染與極致性能的平衡。

下次有時間再研究一下其他模塊的代碼實現....

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87887.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87887.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87887.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五、Redis的IO模型

簡介 在談及Redis為什么快的時候&#xff0c;很多人都只能回答redis是基于內存&#xff0c;所以快。但他們往往不知道&#xff0c;決定redis快的因素&#xff0c;還有它的IO模型-Reactor模型。談及Redis的IO模型之前&#xff0c;先補充一下IO模型的基礎知識。 IO模型演化 1.堵塞…

Cesium、ThreeWebGL詳解(二)渲染引擎向GPU傳數據、性能優化、引擎對比

下面從 API 定位、坐標體系、性能表現、面試常問點幾個維度詳細對比 Cesium、Three.js 與原生 WebGL 的繪制差異。 &#x1f9ed; 1. API 定位與典型應用 Cesium 聚焦全地球 GIS 場景&#xff0c;支持地形、影像、時空動態等地理信息功能&#xff0c;是專業級地圖應用首選。 T…

單點登錄(SSO)系統

設計一個 Java 單點登錄&#xff08;SSO&#xff09;系統需要解決跨系統認證和會話共享問題。以下是核心設計和實現方案&#xff0c;包含關鍵組件和代碼示例&#xff1a; 一、核心概念 認證中心 (Auth Center)&#xff1a;中央身份驗證服務令牌 (Token)&#xff1a;用戶身份憑…

《信息技術》科技核心期刊推薦

【科研必看】《信息技術》——科技核心期刊&#xff0c;助力你發表高影響力論文&#xff01; 如果你是一位科研工作者、學者或者在校學生&#xff0c;正在為發表論文而努力&#xff0c;那么《信息技術》期刊無疑是你不可錯過的選擇&#xff01;這本期刊以其卓越的學術影響力&am…

界面組件DevExpress WPF中文教程:Grid - 如何遍歷節點?

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

2D寫實交互數字人:讓AI形象擁有“真人溫度“的技術革命

在人工智能技術日新月異的今天&#xff0c;數字人已不再是科幻電影中的概念&#xff0c;而是逐步滲透到我們日常生活的各個領域。然而&#xff0c;市場上大多數數字人產品仍停留在"能說會動"的初級階段&#xff0c;缺乏真正的情感交互能力&#xff0c;這種"機械…

2025 年拓客系統排行榜

在數字化營銷時代&#xff0c;拓客系統成為企業獲取客戶資源、提升銷售效率的關鍵工具。以下為您盤點 2025 年表現出色的中文名字拓客系統&#xff0c;其中 微拓客 憑借強大功能脫穎而出&#xff0c;成為眾多從業者的首選。 一、微拓客&#xff1a;精準拓客的全能王者 微拓客堪…

TikTok 矩陣如何快速漲粉

在社交媒體的廣袤天地里&#xff0c;TikTok 以其強大的影響力和龐大的用戶基礎&#xff0c;成為眾多創作者和品牌競相角逐的舞臺。構建 TikTok 矩陣&#xff0c;是擴大影響力、實現快速漲粉的有效策略。那么&#xff0c;究竟如何讓 TikTok 矩陣快速漲粉呢&#xff1f;下面將為您…

基于微信小程序和云開發的企業綠色融資平臺的設計與實現

文章目錄 摘要前言緒論1. 課題背景2. 國內外現狀與趨勢2.1 國內研究現狀2.2 國外研究現狀2.3 發展趨勢3. 課題內容相關技術與方法介紹1. 微信小程序開發技術2. 騰訊云開發平臺3. 綠色項目評估模型4. 智能匹配算法5. 碳核算方法系統分析1. 需求分析1.1 用戶需求1.2 功能需求1.3 …

如何自建服務器并開啟公網IP:本地內網網址讓外網訪問詳細教學

本地內網環境自建服務器后&#xff0c;如何讓外網訪問&#xff0c;提供互聯網連接服務呢&#xff1f;有不少方法都可以實現&#xff0c;常見的有如公網IP、DDNS動態域名、nat123內網穿透等&#xff0c;下面詳細教學。 一、申請開公網IP-----------------公網IP篇-------------…

企業公用電腦登錄安全管控的終極方案:ASP操作系統安全登錄管控方案

一、引言&#xff1a;公用電腦——企業安全管理的“灰色地帶” 在企業辦公場景中&#xff0c;公用電腦&#xff08;如會議室電腦、生產線終端、客服工位&#xff09;因多用戶共用、權限復雜&#xff0c;往往成為安全管理的薄弱環節。員工隨意登錄、弱密碼泛濫、敏感數據泄露事…

HarmonyOS-ArkTS開發指南:從基礎到實戰

目錄 一、基礎語法 二、聲明式 UI 開發 基本組件結構 三、狀態管理 四、生命周期鉤子 五、組件化開發 1. 創建自定義組件 2. 組件嵌套 六、事件處理 七、布局系統 八、樣式設置 九、條件渲染與列表渲染 十、異步操作 十一、路由導航 開發建議 一、基礎語法 ArkT…

算法-Day04

今天還是給大家分享幾道題目&#xff0c;希望大家可以好好理解。 第一題 問題描述 小藍有一天誤入了一個混境之地。 好消息是&#xff1a;他誤打誤撞拿到了一張地圖&#xff0c;并從中獲取到以下信息&#xff1a; 混境之地是一個 n?m大小的矩陣&#xff0c;這個地圖中一共…

Git版本控制詳細資料

Git安裝基本配置 下載安裝(一路next) 打開bash終端&#xff08;git專用&#xff09; 命令: git -v(查看版本號) 配置: 用戶名和郵箱,應用在每次提交代碼版本時表明自己身份 命令: git config --global user.name "FT" git config --global user.email "F…

利用井云平臺把Coze工作流接入小程序/網站封裝變現 | 詳細步驟→

今天來看看怎么把Coze工作流接入井云生成你的專屬網站/小程序&#xff01; 當前已支持三大模塊接入&#xff1a;? 工作流 ? 智能體 ? 外部網頁 本文所用工具 1、扣子&#xff1a;www.coze.cn 2、井云智能體&#xff1a;jingyun.center 為什么選擇井云平臺&#xff1f; …

linux weston flutter remote desktop

參考:Outputs — weston 14.0.90 documentation Weston 14.0: DRM-backend, color management, and output mirroring Weston 14.0: DRM-backend, color management, and output mirroring ??? 3. DRM 輸出可鏡像至遠程輸出(RDP、VNC、PipeWire) 這次更新還帶來了一個…

GitHub Copilot 是什么,怎么使用

GitHub Copilot 是一個由 GitHub 和 OpenAI 聯合開發的 AI 編程助手&#xff0c;它可以在你寫代碼的時候自動給出建議、補全代碼&#xff0c;甚至生成整個函數或算法。它就像一個“聰明的副駕駛”&#xff0c;時刻在你旁邊協助你寫代碼。 簡單解釋&#xff1a; GitHub Copilot …

Android系統及應用QUIC協議支持詳解

QUIC協議在Android中的全面支持與實踐指南 本文深入探討QUIC協議在Android中的實現細節&#xff0c;涵蓋基礎原理、開發技巧、性能優化及前沿擴展&#xff0c;提供完整的Kotlin代碼示例和工程實踐指南。 1. QUIC協議核心優勢 QUIC&#xff08;Quick UDP Internet Connections&…

.NET基于類名約定的自動依賴注入完整指南

&#x1f680; .NET基于類名約定的自動依賴注入完整指南 基于類名約定的自動依賴注入可大幅減少手動注冊服務的工作量&#xff0c;本文將通過清晰的結構、美觀的排版和豐富的示例&#xff0c;幫助你快速掌握這一實用技術。 &#x1f308; 核心特性概覽 特性說明類名約定自動…

Redis各數據結構的詳細使用和使用場景

Redis各數據結構的詳細使用 大家好&#xff01;今天我們來聊聊Redis這個強大的內存數據庫。就像我們生活中的工具箱一樣&#xff0c;Redis提供了多種"工具"&#xff08;數據結構&#xff09;來幫助我們解決不同的問題。有些工具像螺絲刀&#xff08;字符串&#xff…