From 3e1bd554383ed792ccbbb8246273c7a908c6e7aa Mon Sep 17 00:00:00 2001 From: projectdx Date: Sun, 1 Mar 2026 17:55:20 +0900 Subject: [PATCH] Add clipping/highlight planning docs and sync current extension updates --- docs/CLIPPING_HIGHLIGHT_PLAN.md | 115 ++++++++++++++++++ docs/TODO.md | 8 ++ packages/chrome/.vite/manifest.json | 58 ++++----- ...{client-CBvt1tWS.js => client-BzjyOx7y.js} | 2 +- packages/chrome/assets/index-CJaGAyoX.css | 1 + packages/chrome/assets/index-D6aWDpYY.css | 1 - packages/chrome/assets/index.html-92_ZB8wX.js | 1 + ...tml-B0Kfv8fq.js => index.html-B7fMyQPm.js} | 4 +- packages/chrome/assets/index.html-BLzIyLM-.js | 1 - packages/chrome/assets/index.ts-BljhweV3.js | 1 - packages/chrome/assets/index.ts-C6ePCen1.js | 1 - packages/chrome/assets/index.ts-U8lbRRO-.js | 1 + ...ju9eGS_.js => index.ts-loader-D_eQmgUa.js} | 2 +- packages/chrome/assets/index.ts-w1ilzv93.js | 1 + packages/chrome/assets/settings-Bo6W9Drl.js | 1 - ...yfill-CZ_dLIqp.js => settings-CgBxHrrF.js} | 2 +- packages/chrome/manifest.json | 6 +- packages/chrome/service-worker-loader.js | 2 +- packages/chrome/src/config/index.html | 7 +- packages/chrome/src/popup/index.html | 9 +- packages/gomdown-helper.v0.0.16.chrome.zip | Bin 97637 -> 97129 bytes src/content/index.ts | 54 +++++++- src/popup/main.tsx | 24 ++-- src/popup/styles.css | 41 +++++++ 24 files changed, 272 insertions(+), 71 deletions(-) create mode 100644 docs/CLIPPING_HIGHLIGHT_PLAN.md rename packages/chrome/assets/{client-CBvt1tWS.js => client-BzjyOx7y.js} (87%) create mode 100644 packages/chrome/assets/index-CJaGAyoX.css delete mode 100644 packages/chrome/assets/index-D6aWDpYY.css create mode 100644 packages/chrome/assets/index.html-92_ZB8wX.js rename packages/chrome/assets/{index.html-B0Kfv8fq.js => index.html-B7fMyQPm.js} (89%) delete mode 100644 packages/chrome/assets/index.html-BLzIyLM-.js delete mode 100644 packages/chrome/assets/index.ts-BljhweV3.js delete mode 100644 packages/chrome/assets/index.ts-C6ePCen1.js create mode 100644 packages/chrome/assets/index.ts-U8lbRRO-.js rename packages/chrome/assets/{index.ts-loader-Bju9eGS_.js => index.ts-loader-D_eQmgUa.js} (82%) create mode 100644 packages/chrome/assets/index.ts-w1ilzv93.js delete mode 100644 packages/chrome/assets/settings-Bo6W9Drl.js rename packages/chrome/assets/{browser-polyfill-CZ_dLIqp.js => settings-CgBxHrrF.js} (53%) diff --git a/docs/CLIPPING_HIGHLIGHT_PLAN.md b/docs/CLIPPING_HIGHLIGHT_PLAN.md new file mode 100644 index 0000000..3698eab --- /dev/null +++ b/docs/CLIPPING_HIGHLIGHT_PLAN.md @@ -0,0 +1,115 @@ +# Page Clipping + Highlight Implementation Plan + +## Goal +- 사용자가 특정 페이지에서 선택한 텍스트를 클리핑(저장)한다. +- 저장된 클립은 원문 위치에 하이라이트로 다시 표시된다. +- 팝업에서 클립 목록을 보고 해당 위치로 다시 이동할 수 있다. + +## Scope (v1) +1. 지원 대상 +- 텍스트 기반 웹페이지 (`contenteditable` 제외, 일반 DOM 문서 우선) +- 탭 단위 클립 저장/조회 + +2. 포함 기능 +- 선택 텍스트 캡처 +- 하이라이트 주입/복원 +- 클립 목록 조회/삭제 +- 클릭 시 원문 위치로 스크롤 + +3. 제외 기능(후속) +- PDF/캔버스/이미지 OCR 하이라이트 +- 협업 공유/서버 동기화 +- 다중 색상 태깅, 폴더 분류 + +## Data Model (Draft) +```ts +type ClipItem = { + id: string + tabId?: number + pageUrl: string + pageTitle: string + quote: string + createdAt: string + color: 'yellow' + anchor: { + textStart: string + textEnd: string + exact: string + prefix?: string + suffix?: string + xpathStart?: string + xpathEnd?: string + startOffset?: number + endOffset?: number + } +} +``` + +## Architecture +1. Content Script +- 사용자 선택(`window.getSelection`)에서 `Range` 추출 +- `anchor` 생성(텍스트 인용 + DOM 포지션) +- background에 `clip:create` 메시지 전송 +- `clip:apply` 이벤트 수신 시 하이라이트 렌더링 + +2. Background (Service Worker) +- `clip:create`, `clip:list`, `clip:delete`, `clip:reveal` 메시지 처리 +- `storage.local` 기반 영속화 +- 탭 활성화/페이지 완료 시 `clip:sync` 트리거 + +3. Popup/History UI +- 현재 탭 URL 기준 클립 목록 요청 +- 항목별 `위치로 이동`, `삭제` 버튼 +- 상태 메시지(저장 성공/실패) 표시 + +## Step-by-Step +1. Step 1: Selection Capture + Overlay +- `src/lib/clipAnchor.ts` 생성 +- `Range -> anchor` 변환 유틸 구현 +- `src/content/index.ts`에 단축키/우클릭 기반 캡처 진입점 추가 +- `span[data-gomdown-clip]` 하이라이트 렌더링/해제 로직 구현 + +2. Step 2: Store + Message Channel +- `src/lib/clipStore.ts` 생성 (`list/upsert/delete/byUrl`) +- background message router에 `clip:*` 타입 추가 +- dedupe(`pageUrl + exact + createdAt window`) 정책 추가 + +3. Step 3: Popup UI +- `src/popup/main.tsx`에 "Clips" 섹션 추가 +- 현재 탭 URL 클립 조회 + 목록 렌더링 +- `Reveal/Delete` 액션과 오류 상태 처리 + +4. Step 4: Re-anchoring +- 페이지 로드 시 `clip:list` 후 순차 복원 +- 우선순위: +- `exact + prefix/suffix` 텍스트 매칭 +- 실패 시 `xpath + offset` 복구 +- 둘 다 실패 시 `broken anchor`로 표시 + +5. Step 5: Export/Import + QA +- JSON export/import 메시지 추가 +- 샘플 페이지(뉴스, 블로그, SPA) 수동 테스트 +- 회귀 체크리스트 문서화 + +## QA Checklist +- 같은 페이지 새로고침 후 하이라이트가 유지된다. +- SPA 라우팅(YouTube/블로그) 후에도 복원 시도가 동작한다. +- 원문 DOM이 일부 바뀐 경우, 텍스트 매칭 fallback이 동작한다. +- 클립 삭제 시 화면/저장소에서 모두 제거된다. +- 확장 비활성화 상태에서 캡처가 차단된다. + +## Risk & Mitigation +1. DOM 변형으로 앵커 붕괴 +- 텍스트 인용 앵커 + XPath 이중 저장 + +2. 성능 저하(클립 다수) +- URL 단위 lazy apply, viewport 근처 우선 렌더 + +3. 사이트 충돌(CSS/스크립트) +- 고유 data-attribute와 최소 침습 스타일 사용 + +## Definition of Done +- 사용자는 텍스트 선택 후 1회 액션으로 클립 저장 가능 +- 같은 URL 재방문 시 하이라이트 자동 복원 +- 팝업에서 클립 조회/이동/삭제 가능 +- 크롬 기준 수동 시나리오 10개 중 9개 이상 성공 diff --git a/docs/TODO.md b/docs/TODO.md index 0efa4c4..170e4e1 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -9,3 +9,11 @@ - [ ] Step 2: content script 보조 탐지 - [ ] Step 3: 노이즈 필터/품질 그룹핑 - [ ] Step 4: 고급 분석/진단 UI + +## Page Clipping + Highlight +- [x] 계획서 작성 (`docs/CLIPPING_HIGHLIGHT_PLAN.md`) +- [ ] Step 1: 텍스트 선택 캡처(`Selection` + `Range`)와 하이라이트 렌더러 구현 +- [ ] Step 2: 저장소/메시지 채널 추가 (`clipStore`, background relay) +- [ ] Step 3: Popup/History UI에 클립 목록, 재이동(스크롤), 삭제 기능 추가 +- [ ] Step 4: 페이지 재진입 시 하이라이트 복원(anchoring) 및 깨진 앵커 fallback 처리 +- [ ] Step 5: 내보내기/가져오기(JSON)와 기본 회귀 테스트 시나리오 정리 diff --git a/packages/chrome/.vite/manifest.json b/packages/chrome/.vite/manifest.json index e14a1c7..d8c8fa2 100644 --- a/packages/chrome/.vite/manifest.json +++ b/packages/chrome/.vite/manifest.json @@ -1,83 +1,73 @@ { - "../../../../../@crx/manifest": { - "file": "assets/crx-manifest.js-mSo6-ym3.js", + "../../../../../../../@crx/manifest": { + "file": "assets/crx-manifest.js-CXu7hmTa.js", "name": "crx-manifest.js", - "src": "../../../../../@crx/manifest", + "src": "../../../../../../../@crx/manifest", "isEntry": true }, - "_browser-polyfill-CZ_dLIqp.js": { - "file": "assets/browser-polyfill-CZ_dLIqp.js", - "name": "browser-polyfill" - }, - "_client-CBvt1tWS.js": { - "file": "assets/client-CBvt1tWS.js", + "_client-BzjyOx7y.js": { + "file": "assets/client-BzjyOx7y.js", "name": "client", "imports": [ - "_browser-polyfill-CZ_dLIqp.js" + "_settings-CgBxHrrF.js" ] }, "_downloadIntent-Dv31jC2S.js": { "file": "assets/downloadIntent-Dv31jC2S.js", "name": "downloadIntent" }, - "_index.ts-loader-Bju9eGS_.js": { - "file": "assets/index.ts-loader-Bju9eGS_.js", - "src": "_index.ts-loader-Bju9eGS_.js" + "_index.ts-loader-D_eQmgUa.js": { + "file": "assets/index.ts-loader-D_eQmgUa.js", + "src": "_index.ts-loader-D_eQmgUa.js" }, - "_settings-Bo6W9Drl.js": { - "file": "assets/settings-Bo6W9Drl.js", - "name": "settings", - "imports": [ - "_browser-polyfill-CZ_dLIqp.js" - ] + "_settings-CgBxHrrF.js": { + "file": "assets/settings-CgBxHrrF.js", + "name": "settings" }, "src/background/index.ts": { - "file": "assets/index.ts-BljhweV3.js", + "file": "assets/index.ts-U8lbRRO-.js", "name": "index.ts", "src": "src/background/index.ts", "isEntry": true, "imports": [ - "_browser-polyfill-CZ_dLIqp.js", - "_downloadIntent-Dv31jC2S.js", - "_settings-Bo6W9Drl.js" + "_settings-CgBxHrrF.js", + "_downloadIntent-Dv31jC2S.js" ] }, "src/config/index.html": { - "file": "assets/index.html-B0Kfv8fq.js", + "file": "assets/index.html-B7fMyQPm.js", "name": "index.html", "src": "src/config/index.html", "isEntry": true, "imports": [ - "_client-CBvt1tWS.js", - "_settings-Bo6W9Drl.js", - "_browser-polyfill-CZ_dLIqp.js" + "_client-BzjyOx7y.js", + "_settings-CgBxHrrF.js" ], "css": [ "assets/index-B2D5FcJM.css" ] }, "src/content/index.ts": { - "file": "assets/index.ts-C6ePCen1.js", + "file": "assets/index.ts-w1ilzv93.js", "name": "index.ts", "src": "src/content/index.ts", "isEntry": true, "imports": [ - "_browser-polyfill-CZ_dLIqp.js", + "_settings-CgBxHrrF.js", "_downloadIntent-Dv31jC2S.js" ] }, "src/popup/index.html": { - "file": "assets/index.html-BLzIyLM-.js", + "file": "assets/index.html-92_ZB8wX.js", "name": "index.html", "src": "src/popup/index.html", "isEntry": true, "imports": [ - "_client-CBvt1tWS.js", - "_browser-polyfill-CZ_dLIqp.js", - "_settings-Bo6W9Drl.js" + "_client-BzjyOx7y.js", + "_settings-CgBxHrrF.js" ], "css": [ - "assets/index-D6aWDpYY.css" + "assets/index-CJaGAyoX.css" ] } } \ No newline at end of file diff --git a/packages/chrome/assets/client-CBvt1tWS.js b/packages/chrome/assets/client-BzjyOx7y.js similarity index 87% rename from packages/chrome/assets/client-CBvt1tWS.js rename to packages/chrome/assets/client-BzjyOx7y.js index 5765dc3..f0a3fbf 100644 --- a/packages/chrome/assets/client-CBvt1tWS.js +++ b/packages/chrome/assets/client-BzjyOx7y.js @@ -1,4 +1,4 @@ -import{g as zc}from"./browser-polyfill-CZ_dLIqp.js";(function(){const H=document.createElement("link").relList;if(H&&H.supports&&H.supports("modulepreload"))return;for(const V of document.querySelectorAll('link[rel="modulepreload"]'))Ne(V);new MutationObserver(V=>{for(const Y of V)if(Y.type==="childList")for(const fe of Y.addedNodes)fe.tagName==="LINK"&&fe.rel==="modulepreload"&&Ne(fe)}).observe(document,{childList:!0,subtree:!0});function m(V){const Y={};return V.integrity&&(Y.integrity=V.integrity),V.referrerPolicy&&(Y.referrerPolicy=V.referrerPolicy),V.crossOrigin==="use-credentials"?Y.credentials="include":V.crossOrigin==="anonymous"?Y.credentials="omit":Y.credentials="same-origin",Y}function Ne(V){if(V.ep)return;V.ep=!0;const Y=m(V);fetch(V.href,Y)}})();var Eo={exports:{}},hr={},_o={exports:{}},D={};var Ea;function Lc(){if(Ea)return D;Ea=1;var R=Symbol.for("react.element"),H=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),Ne=Symbol.for("react.strict_mode"),V=Symbol.for("react.profiler"),Y=Symbol.for("react.provider"),fe=Symbol.for("react.context"),ce=Symbol.for("react.forward_ref"),W=Symbol.for("react.suspense"),_e=Symbol.for("react.memo"),ye=Symbol.for("react.lazy"),ee=Symbol.iterator;function Z(f){return f===null||typeof f!="object"?null:(f=ee&&f[ee]||f["@@iterator"],typeof f=="function"?f:null)}var He={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},We=Object.assign,J={};function Q(f,h,O){this.props=f,this.context=h,this.refs=J,this.updater=O||He}Q.prototype.isReactComponent={},Q.prototype.setState=function(f,h){if(typeof f!="object"&&typeof f!="function"&&f!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,f,h,"setState")},Q.prototype.forceUpdate=function(f){this.updater.enqueueForceUpdate(this,f,"forceUpdate")};function vt(){}vt.prototype=Q.prototype;function it(f,h,O){this.props=f,this.context=h,this.refs=J,this.updater=O||He}var Je=it.prototype=new vt;Je.constructor=it,We(Je,Q.prototype),Je.isPureReactComponent=!0;var ge=Array.isArray,qe=Object.prototype.hasOwnProperty,Ce={current:null},ze={key:!0,ref:!0,__self:!0,__source:!0};function Qe(f,h,O){var M,F={},j=null,$=null;if(h!=null)for(M in h.ref!==void 0&&($=h.ref),h.key!==void 0&&(j=""+h.key),h)qe.call(h,M)&&!ze.hasOwnProperty(M)&&(F[M]=h[M]);var A=arguments.length-2;if(A===1)F.children=O;else if(1>>1,h=S[f];if(0>>1;fV(F,_))jV($,F)?(S[f]=$,S[j]=_,f=j):(S[f]=F,S[M]=_,f=M);else if(jV($,_))S[f]=$,S[j]=_,f=j;else break e}}return L}function V(S,L){var _=S.sortIndex-L.sortIndex;return _!==0?_:S.id-L.id}if(typeof performance=="object"&&typeof performance.now=="function"){var Y=performance;R.unstable_now=function(){return Y.now()}}else{var fe=Date,ce=fe.now();R.unstable_now=function(){return fe.now()-ce}}var W=[],_e=[],ye=1,ee=null,Z=3,He=!1,We=!1,J=!1,Q=typeof setTimeout=="function"?setTimeout:null,vt=typeof clearTimeout=="function"?clearTimeout:null,it=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function Je(S){for(var L=m(_e);L!==null;){if(L.callback===null)Ne(_e);else if(L.startTime<=S)Ne(_e),L.sortIndex=L.expirationTime,H(W,L);else break;L=m(_e)}}function ge(S){if(J=!1,Je(S),!We)if(m(W)!==null)We=!0,Le(qe);else{var L=m(_e);L!==null&&re(ge,L.startTime-S)}}function qe(S,L){We=!1,J&&(J=!1,vt(Qe),Qe=-1),He=!0;var _=Z;try{for(Je(L),ee=m(W);ee!==null&&(!(ee.expirationTime>L)||S&&!$t());){var f=ee.callback;if(typeof f=="function"){ee.callback=null,Z=ee.priorityLevel;var h=f(ee.expirationTime<=L);L=R.unstable_now(),typeof h=="function"?ee.callback=h:ee===m(W)&&Ne(W),Je(L)}else Ne(W);ee=m(W)}if(ee!==null)var O=!0;else{var M=m(_e);M!==null&&re(ge,M.startTime-L),O=!1}return O}finally{ee=null,Z=_,He=!1}}var Ce=!1,ze=null,Qe=-1,xt=5,ht=-1;function $t(){return!(R.unstable_now()-htS||125f?(S.sortIndex=_,H(_e,S),m(W)===null&&S===m(_e)&&(J?(vt(Qe),Qe=-1):J=!0,re(ge,_-f))):(S.sortIndex=h,H(W,S),We||He||(We=!0,Le(qe))),S},R.unstable_shouldYield=$t,R.unstable_wrapCallback=function(S){var L=Z;return function(){var _=Z;Z=L;try{return S.apply(this,arguments)}finally{Z=_}}}})(Po)),Po}var Na;function Mc(){return Na||(Na=1,xo.exports=Dc()),xo.exports}var za;function Ic(){if(za)return Ie;za=1;var R=No(),H=Mc();function m(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),W=Object.prototype.hasOwnProperty,_e=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ye={},ee={};function Z(e){return W.call(ee,e)?!0:W.call(ye,e)?!1:_e.test(e)?ee[e]=!0:(ye[e]=!0,!1)}function He(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function We(e,t,n,r){if(t===null||typeof t>"u"||He(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function J(e,t,n,r,l,u,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=o}var Q={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Q[e]=new J(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Q[t]=new J(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){Q[e]=new J(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Q[e]=new J(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Q[e]=new J(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){Q[e]=new J(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){Q[e]=new J(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){Q[e]=new J(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){Q[e]=new J(e,5,!1,e.toLowerCase(),null,!1,!1)});var vt=/[\-:]([a-z])/g;function it(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(vt,it);Q[t]=new J(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(vt,it);Q[t]=new J(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(vt,it);Q[t]=new J(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){Q[e]=new J(e,1,!1,e.toLowerCase(),null,!1,!1)}),Q.xlinkHref=new J("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){Q[e]=new J(e,1,!1,e.toLowerCase(),null,!0,!0)});function Je(e,t,n,r){var l=Q.hasOwnProperty(t)?Q[t]:null;(l!==null?l.type!==0:r||!(2{for(const Y of V)if(Y.type==="childList")for(const fe of Y.addedNodes)fe.tagName==="LINK"&&fe.rel==="modulepreload"&&Ne(fe)}).observe(document,{childList:!0,subtree:!0});function m(V){const Y={};return V.integrity&&(Y.integrity=V.integrity),V.referrerPolicy&&(Y.referrerPolicy=V.referrerPolicy),V.crossOrigin==="use-credentials"?Y.credentials="include":V.crossOrigin==="anonymous"?Y.credentials="omit":Y.credentials="same-origin",Y}function Ne(V){if(V.ep)return;V.ep=!0;const Y=m(V);fetch(V.href,Y)}})();var Eo={exports:{}},hr={},_o={exports:{}},D={};var Ea;function Lc(){if(Ea)return D;Ea=1;var R=Symbol.for("react.element"),H=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),Ne=Symbol.for("react.strict_mode"),V=Symbol.for("react.profiler"),Y=Symbol.for("react.provider"),fe=Symbol.for("react.context"),ce=Symbol.for("react.forward_ref"),W=Symbol.for("react.suspense"),_e=Symbol.for("react.memo"),ye=Symbol.for("react.lazy"),ee=Symbol.iterator;function Z(f){return f===null||typeof f!="object"?null:(f=ee&&f[ee]||f["@@iterator"],typeof f=="function"?f:null)}var He={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},We=Object.assign,J={};function Q(f,h,O){this.props=f,this.context=h,this.refs=J,this.updater=O||He}Q.prototype.isReactComponent={},Q.prototype.setState=function(f,h){if(typeof f!="object"&&typeof f!="function"&&f!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,f,h,"setState")},Q.prototype.forceUpdate=function(f){this.updater.enqueueForceUpdate(this,f,"forceUpdate")};function vt(){}vt.prototype=Q.prototype;function it(f,h,O){this.props=f,this.context=h,this.refs=J,this.updater=O||He}var Je=it.prototype=new vt;Je.constructor=it,We(Je,Q.prototype),Je.isPureReactComponent=!0;var ge=Array.isArray,qe=Object.prototype.hasOwnProperty,Ce={current:null},ze={key:!0,ref:!0,__self:!0,__source:!0};function Qe(f,h,O){var M,F={},j=null,$=null;if(h!=null)for(M in h.ref!==void 0&&($=h.ref),h.key!==void 0&&(j=""+h.key),h)qe.call(h,M)&&!ze.hasOwnProperty(M)&&(F[M]=h[M]);var A=arguments.length-2;if(A===1)F.children=O;else if(1>>1,h=S[f];if(0>>1;fV(F,_))jV($,F)?(S[f]=$,S[j]=_,f=j):(S[f]=F,S[M]=_,f=M);else if(jV($,_))S[f]=$,S[j]=_,f=j;else break e}}return L}function V(S,L){var _=S.sortIndex-L.sortIndex;return _!==0?_:S.id-L.id}if(typeof performance=="object"&&typeof performance.now=="function"){var Y=performance;R.unstable_now=function(){return Y.now()}}else{var fe=Date,ce=fe.now();R.unstable_now=function(){return fe.now()-ce}}var W=[],_e=[],ye=1,ee=null,Z=3,He=!1,We=!1,J=!1,Q=typeof setTimeout=="function"?setTimeout:null,vt=typeof clearTimeout=="function"?clearTimeout:null,it=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function Je(S){for(var L=m(_e);L!==null;){if(L.callback===null)Ne(_e);else if(L.startTime<=S)Ne(_e),L.sortIndex=L.expirationTime,H(W,L);else break;L=m(_e)}}function ge(S){if(J=!1,Je(S),!We)if(m(W)!==null)We=!0,Le(qe);else{var L=m(_e);L!==null&&re(ge,L.startTime-S)}}function qe(S,L){We=!1,J&&(J=!1,vt(Qe),Qe=-1),He=!0;var _=Z;try{for(Je(L),ee=m(W);ee!==null&&(!(ee.expirationTime>L)||S&&!$t());){var f=ee.callback;if(typeof f=="function"){ee.callback=null,Z=ee.priorityLevel;var h=f(ee.expirationTime<=L);L=R.unstable_now(),typeof h=="function"?ee.callback=h:ee===m(W)&&Ne(W),Je(L)}else Ne(W);ee=m(W)}if(ee!==null)var O=!0;else{var M=m(_e);M!==null&&re(ge,M.startTime-L),O=!1}return O}finally{ee=null,Z=_,He=!1}}var Ce=!1,ze=null,Qe=-1,xt=5,ht=-1;function $t(){return!(R.unstable_now()-htS||125f?(S.sortIndex=_,H(_e,S),m(W)===null&&S===m(_e)&&(J?(vt(Qe),Qe=-1):J=!0,re(ge,_-f))):(S.sortIndex=h,H(W,S),We||He||(We=!0,Le(qe))),S},R.unstable_shouldYield=$t,R.unstable_wrapCallback=function(S){var L=Z;return function(){var _=Z;Z=L;try{return S.apply(this,arguments)}finally{Z=_}}}})(Po)),Po}var Na;function Mc(){return Na||(Na=1,xo.exports=Dc()),xo.exports}var za;function Ic(){if(za)return Ie;za=1;var R=No(),H=Mc();function m(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),W=Object.prototype.hasOwnProperty,_e=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ye={},ee={};function Z(e){return W.call(ee,e)?!0:W.call(ye,e)?!1:_e.test(e)?ee[e]=!0:(ye[e]=!0,!1)}function He(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function We(e,t,n,r){if(t===null||typeof t>"u"||He(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function J(e,t,n,r,l,u,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=o}var Q={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Q[e]=new J(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Q[t]=new J(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){Q[e]=new J(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Q[e]=new J(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Q[e]=new J(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){Q[e]=new J(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){Q[e]=new J(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){Q[e]=new J(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){Q[e]=new J(e,5,!1,e.toLowerCase(),null,!1,!1)});var vt=/[\-:]([a-z])/g;function it(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(vt,it);Q[t]=new J(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(vt,it);Q[t]=new J(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(vt,it);Q[t]=new J(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){Q[e]=new J(e,1,!1,e.toLowerCase(),null,!1,!1)}),Q.xlinkHref=new J("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){Q[e]=new J(e,1,!1,e.toLowerCase(),null,!0,!0)});function Je(e,t,n,r){var l=Q.hasOwnProperty(t)?Q[t]:null;(l!==null?l.type!==0:r||!(2i||l[o]!==u[i]){var s=` diff --git a/packages/chrome/assets/index-CJaGAyoX.css b/packages/chrome/assets/index-CJaGAyoX.css new file mode 100644 index 0000000..d8b30c1 --- /dev/null +++ b/packages/chrome/assets/index-CJaGAyoX.css @@ -0,0 +1 @@ +:root{color-scheme:dark;font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}body{margin:0;background:#151821;color:#e7ebf7;width:360px}.container{padding:14px;display:grid;gap:10px}.top-row{display:flex;align-items:center;justify-content:space-between;gap:8px}h1{margin:0;font-size:14px}.power-toggle{height:28px;min-width:70px;border-radius:999px;padding:0 12px;display:inline-flex;align-items:center;justify-content:center;gap:6px;font-size:11px;font-weight:800;letter-spacing:.04em}.power-toggle.on{background:#204f37;border-color:#2b7a52;color:#c7ffe3}.power-toggle.off{background:#4a2631;border-color:#75404d;color:#ffd6df}.power-dot{width:7px;height:7px;border-radius:50%;background:currentColor;opacity:.9}.field{display:grid;gap:6px}label{font-size:12px;color:#aeb6cc}input[type=text],input[type=number]{height:32px;border:1px solid #3e4658;border-radius:6px;padding:0 10px;background:#202532;color:#e7ebf7}.toggle{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:#cdd5ea}button{height:34px;border:1px solid #5562f0;border-radius:8px;background:#5562f0;color:#fff;font-weight:600;cursor:pointer}.media-panel{margin-top:6px;border:1px solid #384255;border-radius:8px;padding:8px;background:#1b202c;display:grid;gap:8px}.media-head{display:flex;align-items:center;justify-content:space-between;font-size:12px}.media-list{display:grid;gap:6px;max-height:150px;overflow:auto}.media-item{display:flex;align-items:center;justify-content:space-between;gap:8px}.media-meta{min-width:0;display:grid;gap:2px}.kind{font-size:11px;color:#8fc0ff}.url{font-size:11px;color:#c6d1e8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.mini{height:26px;min-width:44px;padding:0 8px;border-radius:6px;font-size:11px}.mini.ghost{background:#2a3140;border-color:#47546c;color:#d4def2}.empty{font-size:11px;color:#96a3bc}.status{font-size:12px;color:#8fe0a6;min-height:14px} diff --git a/packages/chrome/assets/index-D6aWDpYY.css b/packages/chrome/assets/index-D6aWDpYY.css deleted file mode 100644 index 9e31168..0000000 --- a/packages/chrome/assets/index-D6aWDpYY.css +++ /dev/null @@ -1 +0,0 @@ -:root{color-scheme:dark;font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}body{margin:0;background:#151821;color:#e7ebf7;width:360px}.container{padding:14px;display:grid;gap:10px}h1{margin:0;font-size:14px}.field{display:grid;gap:6px}label{font-size:12px;color:#aeb6cc}input[type=text],input[type=number]{height:32px;border:1px solid #3e4658;border-radius:6px;padding:0 10px;background:#202532;color:#e7ebf7}.toggle{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:#cdd5ea}button{height:34px;border:1px solid #5562f0;border-radius:8px;background:#5562f0;color:#fff;font-weight:600;cursor:pointer}.media-panel{margin-top:6px;border:1px solid #384255;border-radius:8px;padding:8px;background:#1b202c;display:grid;gap:8px}.media-head{display:flex;align-items:center;justify-content:space-between;font-size:12px}.media-list{display:grid;gap:6px;max-height:150px;overflow:auto}.media-item{display:flex;align-items:center;justify-content:space-between;gap:8px}.media-meta{min-width:0;display:grid;gap:2px}.kind{font-size:11px;color:#8fc0ff}.url{font-size:11px;color:#c6d1e8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:250px}.mini{height:26px;min-width:44px;padding:0 8px;border-radius:6px;font-size:11px}.mini.ghost{background:#2a3140;border-color:#47546c;color:#d4def2}.empty{font-size:11px;color:#96a3bc}.status{font-size:12px;color:#8fe0a6;min-height:14px} diff --git a/packages/chrome/assets/index.html-92_ZB8wX.js b/packages/chrome/assets/index.html-92_ZB8wX.js new file mode 100644 index 0000000..5314395 --- /dev/null +++ b/packages/chrome/assets/index.html-92_ZB8wX.js @@ -0,0 +1 @@ +import{c as N,j as t,R as r}from"./client-BzjyOx7y.js";import{g as k,b as i,s as m}from"./settings-CgBxHrrF.js";function S(){const[s,d]=r.useState(null),[x,n]=r.useState(""),[l,u]=r.useState([]);r.useEffect(()=>{k().then(d)},[]),r.useEffect(()=>{let e=null;const a=async()=>{const o=await i.runtime.sendMessage({type:"media:list"});o?.ok&&Array.isArray(o.items)&&u(o.items.slice(0,10))};return a(),e=window.setInterval(()=>{a()},2e3),()=>{e!==null&&window.clearInterval(e)}},[]);const c=(e,a)=>{d(o=>o&&{...o,[e]:a})},p=async e=>{if(!s)return;const a={...s,extensionStatus:e};d(a),await m({extensionStatus:e}),n(e?"Extension ON":"Extension OFF"),window.setTimeout(()=>n(""),1200)},g=async()=>{s&&(await m(s),n("Saved"),window.setTimeout(()=>n(""),1200))},h=async()=>{const e=i.runtime.getURL("src/config/index.html");await i.tabs.create({url:e})},j=async()=>{const e=i.runtime.getURL("src/history/index.html");await i.tabs.create({url:e})},v=async()=>{const e=await i.runtime.sendMessage({type:"page:enqueue-ytdlp"});n(e?.ok?"Active tab sent to gdown (yt-dlp)":`Send failed: ${e?.error||"unknown error"}`),window.setTimeout(()=>n(""),1800)},w=async e=>{const a=await i.runtime.sendMessage({type:"media:enqueue",url:e.url,referer:e.referer||"",kind:e.kind,suggestedOut:e.suggestedOut||"",cookie:e.cookie||"",userAgent:e.userAgent||""});n(a?.ok?"Media sent to gdown":`Send failed: ${a?.error||"unknown error"}`),window.setTimeout(()=>n(""),1600)},y=async()=>{await i.runtime.sendMessage({type:"media:clear"}),u([]),n("Captured media cleared"),window.setTimeout(()=>n(""),1200)};return s?t.jsxs("div",{className:"container",children:[t.jsxs("div",{className:"top-row",children:[t.jsx("h1",{children:"Gomdown Helper"}),t.jsxs("button",{className:`power-toggle ${s.extensionStatus?"on":"off"}`,onClick:()=>{p(!s.extensionStatus)},children:[t.jsx("span",{className:"power-dot"}),s.extensionStatus?"ON":"OFF"]})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:"RPC Secret"}),t.jsx("input",{type:"text",value:s.motrixAPIkey,onChange:e=>c("motrixAPIkey",e.target.value),placeholder:"aria2 rpc secret"})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:"RPC Port"}),t.jsx("input",{type:"number",value:s.motrixPort,onChange:e=>c("motrixPort",Number(e.target.value||16800))})]}),t.jsxs("label",{className:"toggle",children:["Use Native Host",t.jsx("input",{type:"checkbox",checked:s.useNativeHost,onChange:e=>c("useNativeHost",e.target.checked)})]}),t.jsxs("label",{className:"toggle",children:["Activate gdown App",t.jsx("input",{type:"checkbox",checked:s.activateAppOnDownload,onChange:e=>c("activateAppOnDownload",e.target.checked)})]}),t.jsx("button",{onClick:g,children:"Save"}),t.jsx("button",{onClick:h,children:"Settings"}),t.jsx("button",{onClick:j,children:"History"}),t.jsx("button",{onClick:()=>{v()},children:"Send Active Tab (yt-dlp)"}),t.jsxs("div",{className:"media-panel",children:[t.jsxs("div",{className:"media-head",children:[t.jsx("strong",{children:"Captured Media"}),t.jsx("button",{className:"mini ghost",onClick:y,children:"Clear"})]}),l.length===0?t.jsx("div",{className:"empty",children:"No media captured yet"}):t.jsx("div",{className:"media-list",children:l.map(e=>t.jsxs("div",{className:"media-item",children:[t.jsxs("div",{className:"media-meta",children:[t.jsx("span",{className:"kind",children:e.kind.toUpperCase()}),e.pageTitle?t.jsx("span",{className:"url",children:e.pageTitle}):null,t.jsx("span",{className:"url",children:e.url})]}),t.jsx("button",{className:"mini",onClick:()=>{w(e)},children:"Add"})]},e.id))})]}),t.jsx("div",{className:"status",children:x})]}):t.jsx("div",{className:"container",children:"Loading..."})}N.createRoot(document.getElementById("root")).render(t.jsx(r.StrictMode,{children:t.jsx(S,{})})); diff --git a/packages/chrome/assets/index.html-B0Kfv8fq.js b/packages/chrome/assets/index.html-B7fMyQPm.js similarity index 89% rename from packages/chrome/assets/index.html-B0Kfv8fq.js rename to packages/chrome/assets/index.html-B7fMyQPm.js index 7816542..df44250 100644 --- a/packages/chrome/assets/index.html-B0Kfv8fq.js +++ b/packages/chrome/assets/index.html-B7fMyQPm.js @@ -1,3 +1,3 @@ -import{c as p,j as e,R as a}from"./client-CBvt1tWS.js";import{g as j,s as m}from"./settings-Bo6W9Drl.js";import"./browser-polyfill-CZ_dLIqp.js";function u(){const[t,i]=a.useState(null),[l,r]=a.useState(""),[h,d]=a.useState("");a.useEffect(()=>{j().then(s=>{i(s),r((s.blacklist||[]).join(` +import{c as j,j as e,R as a}from"./client-BzjyOx7y.js";import{g as p,s as m}from"./settings-CgBxHrrF.js";function u(){const[t,i]=a.useState(null),[l,r]=a.useState(""),[h,d]=a.useState("");a.useEffect(()=>{p().then(s=>{i(s),r((s.blacklist||[]).join(` `))})},[]);const n=(s,c)=>{i(o=>o&&{...o,[s]:c})},x=async()=>{if(!t)return;const s={...t,minFileSize:Number(t.minFileSize||0),motrixPort:Number(t.motrixPort||16800),blacklist:l.split(` -`).map(c=>c.trim()).filter(Boolean)};await m(s),i(s),d("Saved"),window.setTimeout(()=>d(""),1500)};return t?e.jsxs("div",{className:"wrap",children:[e.jsx("h1",{children:"Gomdown Helper Settings"}),e.jsxs("div",{className:"grid",children:[e.jsxs("section",{className:"card",children:[e.jsx("label",{children:"RPC Secret"}),e.jsx("input",{value:t.motrixAPIkey,onChange:s=>n("motrixAPIkey",s.target.value)}),e.jsx("label",{children:"RPC Port"}),e.jsx("input",{type:"number",value:t.motrixPort,onChange:s=>n("motrixPort",Number(s.target.value||16800))}),e.jsx("label",{children:"Min file size (MB)"}),e.jsx("input",{type:"number",value:t.minFileSize,onChange:s=>n("minFileSize",Number(s.target.value||0))}),e.jsx("label",{children:"Blacklist (one per line)"}),e.jsx("textarea",{rows:8,value:l,onChange:s=>r(s.target.value)})]}),e.jsxs("section",{className:"card",children:[e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Extension enabled"}),e.jsx("input",{type:"checkbox",checked:t.extensionStatus,onChange:s=>n("extensionStatus",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Enable notifications"}),e.jsx("input",{type:"checkbox",checked:t.enableNotifications,onChange:s=>n("enableNotifications",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Use native host"}),e.jsx("input",{type:"checkbox",checked:t.useNativeHost,onChange:s=>n("useNativeHost",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Activate app on download"}),e.jsx("input",{type:"checkbox",checked:t.activateAppOnDownload,onChange:s=>n("activateAppOnDownload",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Hide browser download shelf"}),e.jsx("input",{type:"checkbox",checked:t.hideChromeBar,onChange:s=>n("hideChromeBar",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Show context menu option"}),e.jsx("input",{type:"checkbox",checked:t.showContextOption,onChange:s=>n("showContextOption",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Download fallback"}),e.jsx("input",{type:"checkbox",checked:t.downloadFallback,onChange:s=>n("downloadFallback",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Dark mode"}),e.jsx("input",{type:"checkbox",checked:t.darkMode,onChange:s=>n("darkMode",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Show only aria downloads"}),e.jsx("input",{type:"checkbox",checked:t.showOnlyAria,onChange:s=>n("showOnlyAria",s.target.checked)})]})]})]}),e.jsxs("div",{className:"actions",children:[e.jsx("button",{onClick:x,children:"Save"}),e.jsx("button",{className:"ghost",onClick:()=>window.close(),children:"Close"})]}),e.jsx("div",{children:h})]}):e.jsx("div",{className:"wrap",children:"Loading..."})}p.createRoot(document.getElementById("root")).render(e.jsx(a.StrictMode,{children:e.jsx(u,{})})); +`).map(c=>c.trim()).filter(Boolean)};await m(s),i(s),d("Saved"),window.setTimeout(()=>d(""),1500)};return t?e.jsxs("div",{className:"wrap",children:[e.jsx("h1",{children:"Gomdown Helper Settings"}),e.jsxs("div",{className:"grid",children:[e.jsxs("section",{className:"card",children:[e.jsx("label",{children:"RPC Secret"}),e.jsx("input",{value:t.motrixAPIkey,onChange:s=>n("motrixAPIkey",s.target.value)}),e.jsx("label",{children:"RPC Port"}),e.jsx("input",{type:"number",value:t.motrixPort,onChange:s=>n("motrixPort",Number(s.target.value||16800))}),e.jsx("label",{children:"Min file size (MB)"}),e.jsx("input",{type:"number",value:t.minFileSize,onChange:s=>n("minFileSize",Number(s.target.value||0))}),e.jsx("label",{children:"Blacklist (one per line)"}),e.jsx("textarea",{rows:8,value:l,onChange:s=>r(s.target.value)})]}),e.jsxs("section",{className:"card",children:[e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Extension enabled"}),e.jsx("input",{type:"checkbox",checked:t.extensionStatus,onChange:s=>n("extensionStatus",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Enable notifications"}),e.jsx("input",{type:"checkbox",checked:t.enableNotifications,onChange:s=>n("enableNotifications",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Use native host"}),e.jsx("input",{type:"checkbox",checked:t.useNativeHost,onChange:s=>n("useNativeHost",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Activate app on download"}),e.jsx("input",{type:"checkbox",checked:t.activateAppOnDownload,onChange:s=>n("activateAppOnDownload",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Hide browser download shelf"}),e.jsx("input",{type:"checkbox",checked:t.hideChromeBar,onChange:s=>n("hideChromeBar",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Show context menu option"}),e.jsx("input",{type:"checkbox",checked:t.showContextOption,onChange:s=>n("showContextOption",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Download fallback"}),e.jsx("input",{type:"checkbox",checked:t.downloadFallback,onChange:s=>n("downloadFallback",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Dark mode"}),e.jsx("input",{type:"checkbox",checked:t.darkMode,onChange:s=>n("darkMode",s.target.checked)})]}),e.jsxs("div",{className:"row",children:[e.jsx("span",{children:"Show only aria downloads"}),e.jsx("input",{type:"checkbox",checked:t.showOnlyAria,onChange:s=>n("showOnlyAria",s.target.checked)})]})]})]}),e.jsxs("div",{className:"actions",children:[e.jsx("button",{onClick:x,children:"Save"}),e.jsx("button",{className:"ghost",onClick:()=>window.close(),children:"Close"})]}),e.jsx("div",{children:h})]}):e.jsx("div",{className:"wrap",children:"Loading..."})}j.createRoot(document.getElementById("root")).render(e.jsx(a.StrictMode,{children:e.jsx(u,{})})); diff --git a/packages/chrome/assets/index.html-BLzIyLM-.js b/packages/chrome/assets/index.html-BLzIyLM-.js deleted file mode 100644 index 87126ce..0000000 --- a/packages/chrome/assets/index.html-BLzIyLM-.js +++ /dev/null @@ -1 +0,0 @@ -import{c as k,j as t,R as r}from"./client-CBvt1tWS.js";import{b as i}from"./browser-polyfill-CZ_dLIqp.js";import{g as N,s as m}from"./settings-Bo6W9Drl.js";function b(){const[s,d]=r.useState(null),[x,n]=r.useState(""),[l,u]=r.useState([]);r.useEffect(()=>{N().then(d)},[]),r.useEffect(()=>{let e=null;const a=async()=>{const o=await i.runtime.sendMessage({type:"media:list"});o?.ok&&Array.isArray(o.items)&&u(o.items.slice(0,10))};return a(),e=window.setInterval(()=>{a()},2e3),()=>{e!==null&&window.clearInterval(e)}},[]);const c=(e,a)=>{d(o=>o&&{...o,[e]:a})},h=async e=>{if(!s)return;const a={...s,extensionStatus:e};d(a),await m({extensionStatus:e}),n(e?"Extension ON":"Extension OFF"),window.setTimeout(()=>n(""),1200)},g=async()=>{s&&(await m(s),n("Saved"),window.setTimeout(()=>n(""),1200))},p=async()=>{const e=i.runtime.getURL("src/config/index.html");await i.tabs.create({url:e})},j=async()=>{const e=i.runtime.getURL("src/history/index.html");await i.tabs.create({url:e})},v=async()=>{const e=await i.runtime.sendMessage({type:"page:enqueue-ytdlp"});n(e?.ok?"Active tab sent to gdown (yt-dlp)":`Send failed: ${e?.error||"unknown error"}`),window.setTimeout(()=>n(""),1800)},w=async e=>{const a=await i.runtime.sendMessage({type:"media:enqueue",url:e.url,referer:e.referer||"",kind:e.kind,suggestedOut:e.suggestedOut||"",cookie:e.cookie||"",userAgent:e.userAgent||""});n(a?.ok?"Media sent to gdown":`Send failed: ${a?.error||"unknown error"}`),window.setTimeout(()=>n(""),1600)},y=async()=>{await i.runtime.sendMessage({type:"media:clear"}),u([]),n("Captured media cleared"),window.setTimeout(()=>n(""),1200)};return s?t.jsxs("div",{className:"container",children:[t.jsx("h1",{children:"Gomdown Helper"}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:"RPC Secret"}),t.jsx("input",{type:"text",value:s.motrixAPIkey,onChange:e=>c("motrixAPIkey",e.target.value),placeholder:"aria2 rpc secret"})]}),t.jsxs("div",{className:"field",children:[t.jsx("label",{children:"RPC Port"}),t.jsx("input",{type:"number",value:s.motrixPort,onChange:e=>c("motrixPort",Number(e.target.value||16800))})]}),t.jsxs("label",{className:"toggle",children:["Extension Enabled",t.jsx("input",{type:"checkbox",checked:s.extensionStatus,onChange:e=>{h(e.target.checked)}})]}),t.jsxs("label",{className:"toggle",children:["Use Native Host",t.jsx("input",{type:"checkbox",checked:s.useNativeHost,onChange:e=>c("useNativeHost",e.target.checked)})]}),t.jsxs("label",{className:"toggle",children:["Activate gdown App",t.jsx("input",{type:"checkbox",checked:s.activateAppOnDownload,onChange:e=>c("activateAppOnDownload",e.target.checked)})]}),t.jsx("button",{onClick:g,children:"Save"}),t.jsx("button",{onClick:p,children:"Settings"}),t.jsx("button",{onClick:j,children:"History"}),t.jsx("button",{onClick:()=>{v()},children:"Send Active Tab (yt-dlp)"}),t.jsxs("div",{className:"media-panel",children:[t.jsxs("div",{className:"media-head",children:[t.jsx("strong",{children:"Captured Media"}),t.jsx("button",{className:"mini ghost",onClick:y,children:"Clear"})]}),l.length===0?t.jsx("div",{className:"empty",children:"No media captured yet"}):t.jsx("div",{className:"media-list",children:l.map(e=>t.jsxs("div",{className:"media-item",children:[t.jsxs("div",{className:"media-meta",children:[t.jsx("span",{className:"kind",children:e.kind.toUpperCase()}),e.pageTitle?t.jsx("span",{className:"url",children:e.pageTitle}):null,t.jsx("span",{className:"url",children:e.url})]}),t.jsx("button",{className:"mini",onClick:()=>{w(e)},children:"Add"})]},e.id))})]}),t.jsx("div",{className:"status",children:x})]}):t.jsx("div",{className:"container",children:"Loading..."})}k.createRoot(document.getElementById("root")).render(t.jsx(r.StrictMode,{children:t.jsx(b,{})})); diff --git a/packages/chrome/assets/index.ts-BljhweV3.js b/packages/chrome/assets/index.ts-BljhweV3.js deleted file mode 100644 index 9311254..0000000 --- a/packages/chrome/assets/index.ts-BljhweV3.js +++ /dev/null @@ -1 +0,0 @@ -import{b as i}from"./browser-polyfill-CZ_dLIqp.js";import{n as P,a as j}from"./downloadIntent-Dv31jC2S.js";import{g as h}from"./settings-Bo6W9Drl.js";const z="org.gdown.nativehost";async function J(e){return i.runtime.sendNativeMessage(z,{action:"addUri",...e})}async function Z(){return i.runtime.sendNativeMessage(z,{action:"focus"})}const C="history";async function ee(){const t=(await i.storage.local.get([C]))[C];return Array.isArray(t)?t:[]}async function te(e){await i.storage.local.set({[C]:e.slice(0,300)})}async function ne(e){const t=await ee(),n=t.findIndex(r=>r.gid===e.gid);n>=0?t[n]=e:t.unshift(e),await te(t)}function G(e,t){const n=Array.isArray(e?.responseHeaders)?e.responseHeaders:[],r=t.toLowerCase(),o=n.find(s=>String(s?.name||"").toLowerCase()===r);return String(o?.value||"")}function re(e){const t=e.toLowerCase();return t?t.includes("application/vnd.apple.mpegurl")||t.includes("application/x-mpegurl")||t.includes("audio/mpegurl")?"m3u8":t.includes("video/mp4")?"mp4":t.includes("application/octet-stream")&&t.includes("m3u8")?"m3u8":t.includes("hls")?"hls":"unknown":"unknown"}function oe(e){const t=String(e||"").toLowerCase();return t.includes(".m3u8")?"m3u8":t.includes(".m3u")?"m3u":t.includes(".mp4")?"mp4":t.includes("m3u8")?"m3u8":t.includes("hls")?"hls":"unknown"}function B(e,t){const n=re(t);return n!=="unknown"?n:oe(e)}function ie(e){if(!e?.url)return!1;const t=String(e?.method||"").toUpperCase();if(t&&t!=="GET")return!1;const n=Number(e?.statusCode||0);if(n>0&&(n<200||n>299))return!1;const r=String(e?.type||"");if(!["xmlhttprequest","media","other","main_frame","sub_frame","fetch"].includes(r))return!1;const o=G(e,"content-type");return B(e.url,o)!=="unknown"}function se(e,t=""){const n=G(e,"content-type"),r=String(e?.url||""),o=B(r,n),s=Number.isInteger(e?.tabId)?Number(e.tabId):-1,a=Date.now();return{id:`${a}:${s}:${o}:${r}`,url:r,kind:o,tabId:s,pageUrl:String(e?.documentUrl||e?.initiator||""),referer:String(t||e?.documentUrl||e?.initiator||""),contentType:n,detectedAt:a}}function q(e){try{const t=new URL(e);return`${t.protocol}//${t.host}${t.pathname}`.toLowerCase()}catch{return String(e||"").toLowerCase()}}const b="media_candidates",ae=200;async function W(){const t=(await i.storage.local.get([b]))[b];return Array.isArray(t)?t:[]}async function ue(e){const t=[...e].sort((n,r)=>r.detectedAt-n.detectedAt);await i.storage.local.set({[b]:t.slice(0,ae)})}async function ce(e,t){const n=await W(),r=n.findIndex(o=>{try{const s=new URL(o.url);return`${s.protocol}//${s.host}${s.pathname}`.toLowerCase()===t}catch{return o.url.toLowerCase()===t}});r>=0?n[r]={...n[r],...e,detectedAt:Date.now()}:n.unshift(e),await ue(n)}async function le(){await i.storage.local.set({[b]:[]})}const k=8e3,de=7e3,U="gomdown-helper-download-context-menu-option",m=new Map,M=new Map,I=new Map,L=new Map,w=new Map,R=new Map,A=new Map;let $=!1,E=!1,_=!1,p=null;const K="bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/best",fe=[{hosts:["youtube.com","www.youtube.com","m.youtube.com","youtu.be"],extractor:"yt-dlp",format:K}];function x(e){try{const t=new URL(e),n=(t.pathname||"/").replace(/\/+$/,"")||"/";return`${t.protocol}//${t.host}${n}`.toLowerCase()}catch{return String(e||"").toLowerCase()}}function f(e){const t=Date.now();for(const[n,r]of e.entries())r<=t&&e.delete(n)}function Y(e){const t=Date.now()+k;M.set(P(e),t),I.set(x(e),t)}function Q(e){!Number.isInteger(e)||(e??-1)<0||R.set(e,Date.now()+k)}function pe(e){f(M),f(I);const t=P(e);return M.has(t)||I.has(x(e))}function me(e){return f(R),!Number.isInteger(e)||(e??-1)<0?!1:R.has(e)}function we(e){return f(L),L.has(x(e))}function ge(e){L.set(x(e),Date.now()+de)}function he(e){return f(w),!!e&&w.has(e)}function ye(e){e&&w.set(e,Date.now()+k)}function Se(e){f(A);const t=q(e);return A.has(t)}function be(e){A.set(q(e),Date.now()+k)}async function ke(){try{await Z()}catch{}}async function v(e){await i.notifications.create(`gomdown-notice-${Date.now()}`,{type:"basic",iconUrl:"/images/icon-large.png",title:"Gomdown Helper",message:e}).catch(()=>null)}async function d(e,t="",n,r,o,s){if(we(e))return{ok:!1,error:"duplicate transfer suppressed"};const a=await h();if(!a.extensionStatus)return{ok:!1,error:"extension disabled"};if(!a.motrixAPIkey)return{ok:!1,error:"motrixAPIkey is not set"};try{const u=await J({url:e,rpcPort:a.motrixPort,rpcSecret:a.motrixAPIkey,referer:t,split:64,out:o?.trim()||void 0,cookie:s?.cookie?.trim()||void 0,userAgent:s?.userAgent?.trim()||void 0,authorization:s?.authorization?.trim()||void 0,proxy:s?.proxy?.trim()||void 0,extractor:n==="yt-dlp"?"yt-dlp":void 0,format:n==="yt-dlp"?r||K:void 0});if(!u?.ok)return{ok:!1,error:u?.error||"native host addUri failed"};a.activateAppOnDownload&&await ke(),ge(e);const c=String(u?.gid||u?.requestId||`pending-${Date.now()}`),l=(()=>{try{return new URL(e).pathname}catch{return""}})().split("/").filter(Boolean).pop()||e;return await ne({gid:c,downloader:"native",startTime:new Date().toISOString(),icon:"/images/32.png",name:decodeURIComponent(l),path:null,status:u?.pending?"queued":"downloading",size:0,downloaded:0}),a.enableNotifications&&await i.notifications.create(`gomdown-transfer-${Date.now()}`,{type:"basic",iconUrl:"/images/icon-large.png",title:"Gomdown Helper",message:"Download sent to gdown"}),{ok:!0}}catch(u){return{ok:!1,error:String(u)}}}function F(e){try{return new URL(e).hostname.toLowerCase()}catch{return""}}function V(e,t="",n=""){const r=[F(e),F(t)].filter(Boolean);for(const s of fe)if(r.some(a=>s.hosts.includes(a)))return{extractor:s.extractor,format:s.format};const o=n.toLowerCase();return o==="m3u8"||o==="m3u"||o==="hls"?{extractor:"yt-dlp",format:"best"}:o==="mp4"?{extractor:"aria2"}:{extractor:"aria2"}}function O(e,t){const n=t.toLowerCase(),r=e.find(o=>String(o?.name||"").toLowerCase()===n);return String(r?.value||"").trim()}async function xe(e){if(e.type!=="main_frame"||(e.method||"").toUpperCase()!=="GET"||typeof e.statusCode=="number"&&(e.statusCode<200||e.statusCode>299))return!1;const t=await h();if(!t.extensionStatus||!t.motrixAPIkey)return!1;const n=String(Array.isArray(e?.responseHeaders)&&e.responseHeaders.find(o=>String(o?.name||"").toLowerCase()==="content-length")?.value||""),r=Number(n||0);return t.minFileSize>0&&r>0&&r=0){const X=await i.tabs.get(u.tabId).catch(()=>null);c=String(X?.title||"").trim()}const S=Ie(u.url,u.kind,c),l={...u,pageTitle:c||void 0,cookie:s||void 0,userAgent:a||void 0,suggestedOut:S||void 0};await ce(l,q(l.url)),be(l.url),l.tabId>=0&&await i.tabs.sendMessage(l.tabId,{type:"media:captured",kind:l.kind,url:l.url,suggestedOut:l.suggestedOut||""}).catch(()=>null)}function Ue(e){let t=e.trim().replace(/[\\/:*?"<>|]/g,"_").replace(/\s+/g," ").replace(/^\.+/,"").replace(/\.+$/,"");return t.length>180&&(t=t.slice(0,180).trim()),t}function Me(e){try{return new URL(e).pathname.toLowerCase().match(/\.([a-z0-9]{2,6})(?:$|[?#])/)?.[1]||""}catch{return""}}function Ie(e,t,n){const r=Ue(n||""),s=Me(e)||(t==="mp4"||t==="m3u8"||t==="m3u"||t==="hls"?"mp4":"");return r?!s||r.toLowerCase().endsWith(`.${s}`)?r:`${r}.${s}`:""}async function y(){const e=i.downloads;if(!e.setShelfEnabled)return;const t=await h();if(!t.extensionStatus)return;const n=t.useNativeHost?!1:!t.hideChromeBar;await e.setShelfEnabled(n)}function H(){E||(E=!0,i.downloads.onCreated.addListener(async e=>{await y();const t=e,n=t.finalUrl||t.url||"";!pe(n)&&!me(t.tabId)||(await i.downloads.cancel(e.id).catch(()=>null),await i.downloads.erase({id:e.id}).catch(()=>null),await i.downloads.removeFile(e.id).catch(()=>null))}))}function T(){$||($=!0,i.webRequest.onSendHeaders.addListener(e=>{m.set(e.requestId,e)},{urls:[""]},["requestHeaders","extraHeaders"]),i.webRequest.onErrorOccurred.addListener(e=>{m.delete(e.requestId),w.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onCompleted.addListener(e=>{m.delete(e.requestId),w.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onHeadersReceived.addListener(e=>{ve(e),Ce(e)},{urls:[""]},["responseHeaders"]))}async function N(e,t){console.log("[gomdown-helper] context menu clicked",{menuItemId:e?.menuItemId,linkUrl:e?.linkUrl,srcUrl:e?.srcUrl,frameUrl:e?.frameUrl,pageUrl:e?.pageUrl,tabUrl:t?.url});const n=e?.menuItemId;if(n!=null&&String(n)!==U)return;const r=String(e?.linkUrl||e?.srcUrl||"").trim(),o=String(e?.frameUrl||e?.pageUrl||t?.url||"").trim(),a=String(r||o||"").trim();if(!a||/^(about:|chrome:|chrome-extension:|edge:|brave:)/i.test(a)){await v("다운로드 가능한 URL을 찾지 못했습니다.");return}const u=V(a,String(e?.pageUrl||t?.url||""),""),c=await d(a,String(e?.pageUrl||t?.url||""),u.extractor,u.format);if(!c.ok){await v(`전송 실패: ${c.error||"unknown error"}`);return}await v(u.extractor==="yt-dlp"?"페이지 URL을 yt-dlp로 gdown에 전송했습니다.":"gdown으로 전송했습니다.")}function Le(){if(typeof chrome>"u"||!chrome.contextMenus?.create){i.contextMenus.create({id:U,title:"Download with Gomdown",visible:!0,contexts:["all"]});return}chrome.contextMenus.create({id:U,title:"Download with Gomdown",contexts:["all"]},()=>{chrome.runtime.lastError})}function D(){_||(typeof chrome<"u"&&chrome.contextMenus?.onClicked?chrome.contextMenus.onClicked.addListener((e,t)=>{N(e,t)}):i.contextMenus.onClicked.addListener((e,t)=>{N(e,t)}),_=!0)}async function Re(){const e=await h();if(!e.extensionStatus||!e.showContextOption){await i.contextMenus.removeAll().catch(()=>null);return}await i.contextMenus.removeAll().catch(()=>null),Le()}function g(){return p||(p=Re().finally(()=>{p=null}),p)}i.runtime.onMessage.addListener((e,t)=>{if(e?.type==="capture-link-download"){const n=String(e?.url||"").trim();if(!n)return Promise.resolve({ok:!1,error:"url is empty"});const r=Number(t?.tab?.id);return d(n,String(e?.referer||"")).then(o=>(o.ok&&(Y(n),Q(r)),o))}if(e?.type==="media:list")return W().then(n=>({ok:!0,items:n}));if(e?.type==="media:clear")return le().then(()=>({ok:!0}));if(e?.type==="media:enqueue"){const n=String(e?.url||"").trim(),r=String(e?.kind||"").trim(),o=String(e?.suggestedOut||"").trim(),s=String(e?.referer||"").trim(),a=String(e?.cookie||"").trim(),u=String(e?.userAgent||"").trim();if(!n)return Promise.resolve({ok:!1,error:"url is empty"});const c=V(n,s,r);return d(n,s,c.extractor,c.format,o,{cookie:a,userAgent:u}).then(S=>S)}if(e?.type==="page:enqueue-ytdlp")return i.tabs.query({active:!0,currentWindow:!0}).then(async n=>{const r=n[0],o=String(r?.url||"").trim();return o?d(o,o,"yt-dlp"):{ok:!1,error:"active tab url is empty"}});if(e?.type==="page:enqueue-ytdlp-url"){const n=String(e?.url||"").trim(),r=String(e?.referer||n).trim();return n?d(n,r||n,"yt-dlp"):Promise.resolve({ok:!1,error:"url is empty"})}});i.runtime.onInstalled.addListener(()=>{console.log("[gomdown-helper] onInstalled"),T(),H(),D(),g(),y()});i.runtime.onStartup.addListener(()=>{console.log("[gomdown-helper] onStartup"),T(),H(),D(),g(),y()});i.storage.onChanged.addListener((e,t)=>{t==="sync"&&((e.hideChromeBar||e.useNativeHost||e.extensionStatus)&&(y(),g()),e.showContextOption&&g())});T();H();D();g();y();console.log("[gomdown-helper] service worker initialized"); diff --git a/packages/chrome/assets/index.ts-C6ePCen1.js b/packages/chrome/assets/index.ts-C6ePCen1.js deleted file mode 100644 index 2ee71d0..0000000 --- a/packages/chrome/assets/index.ts-C6ePCen1.js +++ /dev/null @@ -1 +0,0 @@ -import{b as m}from"./browser-polyfill-CZ_dLIqp.js";import{i as s,n as C}from"./downloadIntent-Dv31jC2S.js";const S=8e3,i=new Map;function v(){const e=Date.now();for(const[n,t]of i.entries())t<=e&&i.delete(n)}async function a(e,n){const t=C(e,window.location.href);if(!t)return!1;if(v(),i.has(t))return!0;i.set(t,Date.now()+S);try{if((await m.runtime.sendMessage({type:"capture-link-download",url:t,referer:n||document.referrer||window.location.href}))?.ok)return!0}catch{}return i.delete(t),!1}function g(e){return e?e instanceof HTMLAnchorElement?e:e instanceof Element?e.closest("a[href]"):null:null}function b(e){return!!(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)}async function k(e){if(e.defaultPrevented||b(e))return;const n=g(e.target);if(!n)return;const t=n.href||"";!t||!s(t,window.location.href)||(e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),await a(t,document.referrer||window.location.href))}function E(e){const n=g(e.target);if(!n)return;const t=n.href||"";!t||!s(t,window.location.href)||b(e)||(e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),a(t,document.referrer||window.location.href))}document.addEventListener("pointerdown",e=>{e.button===0&&E(e)},!0);document.addEventListener("mousedown",e=>{e.button===0&&E(e)},!0);document.addEventListener("click",e=>{e.button===0&&k(e)},!0);document.addEventListener("keydown",e=>{if(e.key!=="Enter"||e.defaultPrevented||b(e))return;const n=g(e.target);if(!n)return;const t=n.href||"";!t||!s(t,window.location.href)||(e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),a(t,document.referrer||window.location.href))},!0);document.addEventListener("auxclick",e=>{e.button===1&&k(e)},!0);function L(){try{const e=window.open.bind(window);window.open=function(t,o,u){const y=String(t||"").trim();return y&&s(y,window.location.href)?(a(y,window.location.href),null):e(t,o,u)}}catch{}try{const e=HTMLAnchorElement.prototype.click;HTMLAnchorElement.prototype.click=function(){const t=this.href||this.getAttribute("href")||"";if(t&&s(t,window.location.href)){a(t,document.referrer||window.location.href);return}e.call(this)}}catch{}}L();let l=null,r=null,w=!1,x=null,d=window.location.href;function T(e){try{const n=new URL(e);return n.hostname!=="www.youtube.com"&&n.hostname!=="youtube.com"?!1:n.pathname==="/watch"&&n.searchParams.has("v")}catch{return!1}}function c(e,n="idle"){r&&(r.textContent=e,n==="ok"?r.style.color="#8ff0a4":n==="error"?r.style.color="#ff9b9b":r.style.color="#aeb7d8")}async function I(){if(!w){w=!0,c("gdown으로 전송 중...");try{const e=await m.runtime.sendMessage({type:"page:enqueue-ytdlp-url",url:window.location.href,referer:window.location.href});e?.ok?c("다운로드 모달로 전송됨","ok"):c(`전송 실패: ${e?.error||"unknown error"}`,"error")}catch(e){c(`전송 실패: ${String(e)}`,"error")}finally{w=!1}}}function M(){l&&(l.remove(),l=null,r=null)}function p(){if(window.top!==window.self)return;if(!T(window.location.href)){M();return}if(l)return;const e=document.createElement("div");e.id="gomdown-youtube-overlay",e.style.position="fixed",e.style.right="20px",e.style.bottom="24px",e.style.zIndex="2147483647",e.style.background="rgba(17, 21, 32, 0.94)",e.style.border="1px solid rgba(133, 148, 195, 0.35)",e.style.borderRadius="12px",e.style.padding="10px",e.style.boxShadow="0 8px 24px rgba(0, 0, 0, 0.28)",e.style.backdropFilter="blur(6px)",e.style.width="220px",e.style.fontFamily="ui-sans-serif, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",e.style.color="#e8edff";const n=document.createElement("div");n.textContent="Gdown Helper",n.style.fontSize="12px",n.style.fontWeight="700",n.style.marginBottom="8px";const t=document.createElement("button");t.type="button",t.textContent="이 영상 다운로드",t.style.width="100%",t.style.height="34px",t.style.border="1px solid #5a69f0",t.style.borderRadius="8px",t.style.background="#5a69f0",t.style.color="#ffffff",t.style.fontSize="12px",t.style.fontWeight="700",t.style.cursor="pointer",t.addEventListener("click",()=>{I()});const o=document.createElement("div");o.textContent="클릭 시 gdown 다운로드 모달로 연결",o.style.fontSize="11px",o.style.marginTop="8px",o.style.lineHeight="1.35",o.style.color="#aeb7d8",e.appendChild(n),e.appendChild(t),e.appendChild(o),document.documentElement.appendChild(e),l=e,r=o}function P(){x===null&&(x=window.setInterval(()=>{const e=window.location.href;e!==d&&(d=e,p())},800),window.addEventListener("popstate",()=>{d=window.location.href,p()}),document.addEventListener("yt-navigate-finish",()=>{d=window.location.href,p()}))}p();P();let h=null,f=null;function O(){if(h)return h;const e=document.createElement("div");return e.id="gomdown-media-toast",e.style.position="fixed",e.style.left="18px",e.style.bottom="18px",e.style.zIndex="2147483647",e.style.maxWidth="360px",e.style.padding="10px 12px",e.style.borderRadius="10px",e.style.border="1px solid rgba(128, 140, 180, 0.42)",e.style.background="rgba(18, 21, 31, 0.95)",e.style.color="#dce4fa",e.style.fontSize="12px",e.style.lineHeight="1.35",e.style.fontFamily="ui-sans-serif, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",e.style.boxShadow="0 10px 24px rgba(0, 0, 0, 0.28)",e.style.display="none",document.documentElement.appendChild(e),h=e,e}function A(e){const n=O(),t=String(e?.kind||"media").toUpperCase(),o=String(e?.suggestedOut||"").trim(),u=String(e?.url||"").trim().slice(0,96);n.textContent=o?`캡처됨 [${t}] ${o}`:`캡처됨 [${t}] ${u}${u.length>=96?"…":""}`,n.style.display="block",f!==null&&window.clearTimeout(f),f=window.setTimeout(()=>{n.style.display="none",f=null},2200)}m.runtime.onMessage.addListener(e=>{e?.type==="media:captured"&&A({kind:e?.kind,url:e?.url,suggestedOut:e?.suggestedOut})}); diff --git a/packages/chrome/assets/index.ts-U8lbRRO-.js b/packages/chrome/assets/index.ts-U8lbRRO-.js new file mode 100644 index 0000000..551edde --- /dev/null +++ b/packages/chrome/assets/index.ts-U8lbRRO-.js @@ -0,0 +1 @@ +import{b as i,g as h}from"./settings-CgBxHrrF.js";import{n as P,a as j}from"./downloadIntent-Dv31jC2S.js";const z="org.gdown.nativehost";async function J(e){return i.runtime.sendNativeMessage(z,{action:"addUri",...e})}async function Z(){return i.runtime.sendNativeMessage(z,{action:"focus"})}const C="history";async function ee(){const t=(await i.storage.local.get([C]))[C];return Array.isArray(t)?t:[]}async function te(e){await i.storage.local.set({[C]:e.slice(0,300)})}async function ne(e){const t=await ee(),n=t.findIndex(r=>r.gid===e.gid);n>=0?t[n]=e:t.unshift(e),await te(t)}function G(e,t){const n=Array.isArray(e?.responseHeaders)?e.responseHeaders:[],r=t.toLowerCase(),o=n.find(s=>String(s?.name||"").toLowerCase()===r);return String(o?.value||"")}function re(e){const t=e.toLowerCase();return t?t.includes("application/vnd.apple.mpegurl")||t.includes("application/x-mpegurl")||t.includes("audio/mpegurl")?"m3u8":t.includes("video/mp4")?"mp4":t.includes("application/octet-stream")&&t.includes("m3u8")?"m3u8":t.includes("hls")?"hls":"unknown":"unknown"}function oe(e){const t=String(e||"").toLowerCase();return t.includes(".m3u8")?"m3u8":t.includes(".m3u")?"m3u":t.includes(".mp4")?"mp4":t.includes("m3u8")?"m3u8":t.includes("hls")?"hls":"unknown"}function B(e,t){const n=re(t);return n!=="unknown"?n:oe(e)}function ie(e){if(!e?.url)return!1;const t=String(e?.method||"").toUpperCase();if(t&&t!=="GET")return!1;const n=Number(e?.statusCode||0);if(n>0&&(n<200||n>299))return!1;const r=String(e?.type||"");if(!["xmlhttprequest","media","other","main_frame","sub_frame","fetch"].includes(r))return!1;const o=G(e,"content-type");return B(e.url,o)!=="unknown"}function se(e,t=""){const n=G(e,"content-type"),r=String(e?.url||""),o=B(r,n),s=Number.isInteger(e?.tabId)?Number(e.tabId):-1,a=Date.now();return{id:`${a}:${s}:${o}:${r}`,url:r,kind:o,tabId:s,pageUrl:String(e?.documentUrl||e?.initiator||""),referer:String(t||e?.documentUrl||e?.initiator||""),contentType:n,detectedAt:a}}function q(e){try{const t=new URL(e);return`${t.protocol}//${t.host}${t.pathname}`.toLowerCase()}catch{return String(e||"").toLowerCase()}}const b="media_candidates",ae=200;async function W(){const t=(await i.storage.local.get([b]))[b];return Array.isArray(t)?t:[]}async function ue(e){const t=[...e].sort((n,r)=>r.detectedAt-n.detectedAt);await i.storage.local.set({[b]:t.slice(0,ae)})}async function ce(e,t){const n=await W(),r=n.findIndex(o=>{try{const s=new URL(o.url);return`${s.protocol}//${s.host}${s.pathname}`.toLowerCase()===t}catch{return o.url.toLowerCase()===t}});r>=0?n[r]={...n[r],...e,detectedAt:Date.now()}:n.unshift(e),await ue(n)}async function le(){await i.storage.local.set({[b]:[]})}const k=8e3,de=7e3,U="gomdown-helper-download-context-menu-option",m=new Map,M=new Map,I=new Map,L=new Map,w=new Map,R=new Map,A=new Map;let $=!1,E=!1,_=!1,p=null;const K="bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]/best",fe=[{hosts:["youtube.com","www.youtube.com","m.youtube.com","youtu.be"],extractor:"yt-dlp",format:K}];function x(e){try{const t=new URL(e),n=(t.pathname||"/").replace(/\/+$/,"")||"/";return`${t.protocol}//${t.host}${n}`.toLowerCase()}catch{return String(e||"").toLowerCase()}}function f(e){const t=Date.now();for(const[n,r]of e.entries())r<=t&&e.delete(n)}function Y(e){const t=Date.now()+k;M.set(P(e),t),I.set(x(e),t)}function Q(e){!Number.isInteger(e)||(e??-1)<0||R.set(e,Date.now()+k)}function pe(e){f(M),f(I);const t=P(e);return M.has(t)||I.has(x(e))}function me(e){return f(R),!Number.isInteger(e)||(e??-1)<0?!1:R.has(e)}function we(e){return f(L),L.has(x(e))}function ge(e){L.set(x(e),Date.now()+de)}function he(e){return f(w),!!e&&w.has(e)}function ye(e){e&&w.set(e,Date.now()+k)}function Se(e){f(A);const t=q(e);return A.has(t)}function be(e){A.set(q(e),Date.now()+k)}async function ke(){try{await Z()}catch{}}async function v(e){await i.notifications.create(`gomdown-notice-${Date.now()}`,{type:"basic",iconUrl:"/images/icon-large.png",title:"Gomdown Helper",message:e}).catch(()=>null)}async function d(e,t="",n,r,o,s){if(we(e))return{ok:!1,error:"duplicate transfer suppressed"};const a=await h();if(!a.extensionStatus)return{ok:!1,error:"extension disabled"};if(!a.motrixAPIkey)return{ok:!1,error:"motrixAPIkey is not set"};try{const u=await J({url:e,rpcPort:a.motrixPort,rpcSecret:a.motrixAPIkey,referer:t,split:64,out:o?.trim()||void 0,cookie:s?.cookie?.trim()||void 0,userAgent:s?.userAgent?.trim()||void 0,authorization:s?.authorization?.trim()||void 0,proxy:s?.proxy?.trim()||void 0,extractor:n==="yt-dlp"?"yt-dlp":void 0,format:n==="yt-dlp"?r||K:void 0});if(!u?.ok)return{ok:!1,error:u?.error||"native host addUri failed"};a.activateAppOnDownload&&await ke(),ge(e);const c=String(u?.gid||u?.requestId||`pending-${Date.now()}`),l=(()=>{try{return new URL(e).pathname}catch{return""}})().split("/").filter(Boolean).pop()||e;return await ne({gid:c,downloader:"native",startTime:new Date().toISOString(),icon:"/images/32.png",name:decodeURIComponent(l),path:null,status:u?.pending?"queued":"downloading",size:0,downloaded:0}),a.enableNotifications&&await i.notifications.create(`gomdown-transfer-${Date.now()}`,{type:"basic",iconUrl:"/images/icon-large.png",title:"Gomdown Helper",message:"Download sent to gdown"}),{ok:!0}}catch(u){return{ok:!1,error:String(u)}}}function F(e){try{return new URL(e).hostname.toLowerCase()}catch{return""}}function V(e,t="",n=""){const r=[F(e),F(t)].filter(Boolean);for(const s of fe)if(r.some(a=>s.hosts.includes(a)))return{extractor:s.extractor,format:s.format};const o=n.toLowerCase();return o==="m3u8"||o==="m3u"||o==="hls"?{extractor:"yt-dlp",format:"best"}:o==="mp4"?{extractor:"aria2"}:{extractor:"aria2"}}function O(e,t){const n=t.toLowerCase(),r=e.find(o=>String(o?.name||"").toLowerCase()===n);return String(r?.value||"").trim()}async function xe(e){if(e.type!=="main_frame"||(e.method||"").toUpperCase()!=="GET"||typeof e.statusCode=="number"&&(e.statusCode<200||e.statusCode>299))return!1;const t=await h();if(!t.extensionStatus||!t.motrixAPIkey)return!1;const n=String(Array.isArray(e?.responseHeaders)&&e.responseHeaders.find(o=>String(o?.name||"").toLowerCase()==="content-length")?.value||""),r=Number(n||0);return t.minFileSize>0&&r>0&&r=0){const X=await i.tabs.get(u.tabId).catch(()=>null);c=String(X?.title||"").trim()}const S=Ie(u.url,u.kind,c),l={...u,pageTitle:c||void 0,cookie:s||void 0,userAgent:a||void 0,suggestedOut:S||void 0};await ce(l,q(l.url)),be(l.url),l.tabId>=0&&await i.tabs.sendMessage(l.tabId,{type:"media:captured",kind:l.kind,url:l.url,suggestedOut:l.suggestedOut||""}).catch(()=>null)}function Ue(e){let t=e.trim().replace(/[\\/:*?"<>|]/g,"_").replace(/\s+/g," ").replace(/^\.+/,"").replace(/\.+$/,"");return t.length>180&&(t=t.slice(0,180).trim()),t}function Me(e){try{return new URL(e).pathname.toLowerCase().match(/\.([a-z0-9]{2,6})(?:$|[?#])/)?.[1]||""}catch{return""}}function Ie(e,t,n){const r=Ue(n||""),s=Me(e)||(t==="mp4"||t==="m3u8"||t==="m3u"||t==="hls"?"mp4":"");return r?!s||r.toLowerCase().endsWith(`.${s}`)?r:`${r}.${s}`:""}async function y(){const e=i.downloads;if(!e.setShelfEnabled)return;const t=await h();if(!t.extensionStatus)return;const n=t.useNativeHost?!1:!t.hideChromeBar;await e.setShelfEnabled(n)}function H(){E||(E=!0,i.downloads.onCreated.addListener(async e=>{await y();const t=e,n=t.finalUrl||t.url||"";!pe(n)&&!me(t.tabId)||(await i.downloads.cancel(e.id).catch(()=>null),await i.downloads.erase({id:e.id}).catch(()=>null),await i.downloads.removeFile(e.id).catch(()=>null))}))}function T(){$||($=!0,i.webRequest.onSendHeaders.addListener(e=>{m.set(e.requestId,e)},{urls:[""]},["requestHeaders","extraHeaders"]),i.webRequest.onErrorOccurred.addListener(e=>{m.delete(e.requestId),w.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onCompleted.addListener(e=>{m.delete(e.requestId),w.delete(String(e.requestId))},{urls:[""]}),i.webRequest.onHeadersReceived.addListener(e=>{ve(e),Ce(e)},{urls:[""]},["responseHeaders"]))}async function N(e,t){console.log("[gomdown-helper] context menu clicked",{menuItemId:e?.menuItemId,linkUrl:e?.linkUrl,srcUrl:e?.srcUrl,frameUrl:e?.frameUrl,pageUrl:e?.pageUrl,tabUrl:t?.url});const n=e?.menuItemId;if(n!=null&&String(n)!==U)return;const r=String(e?.linkUrl||e?.srcUrl||"").trim(),o=String(e?.frameUrl||e?.pageUrl||t?.url||"").trim(),a=String(r||o||"").trim();if(!a||/^(about:|chrome:|chrome-extension:|edge:|brave:)/i.test(a)){await v("다운로드 가능한 URL을 찾지 못했습니다.");return}const u=V(a,String(e?.pageUrl||t?.url||""),""),c=await d(a,String(e?.pageUrl||t?.url||""),u.extractor,u.format);if(!c.ok){await v(`전송 실패: ${c.error||"unknown error"}`);return}await v(u.extractor==="yt-dlp"?"페이지 URL을 yt-dlp로 gdown에 전송했습니다.":"gdown으로 전송했습니다.")}function Le(){if(typeof chrome>"u"||!chrome.contextMenus?.create){i.contextMenus.create({id:U,title:"Download with Gomdown",visible:!0,contexts:["all"]});return}chrome.contextMenus.create({id:U,title:"Download with Gomdown",contexts:["all"]},()=>{chrome.runtime.lastError})}function D(){_||(typeof chrome<"u"&&chrome.contextMenus?.onClicked?chrome.contextMenus.onClicked.addListener((e,t)=>{N(e,t)}):i.contextMenus.onClicked.addListener((e,t)=>{N(e,t)}),_=!0)}async function Re(){const e=await h();if(!e.extensionStatus||!e.showContextOption){await i.contextMenus.removeAll().catch(()=>null);return}await i.contextMenus.removeAll().catch(()=>null),Le()}function g(){return p||(p=Re().finally(()=>{p=null}),p)}i.runtime.onMessage.addListener((e,t)=>{if(e?.type==="capture-link-download"){const n=String(e?.url||"").trim();if(!n)return Promise.resolve({ok:!1,error:"url is empty"});const r=Number(t?.tab?.id);return d(n,String(e?.referer||"")).then(o=>(o.ok&&(Y(n),Q(r)),o))}if(e?.type==="media:list")return W().then(n=>({ok:!0,items:n}));if(e?.type==="media:clear")return le().then(()=>({ok:!0}));if(e?.type==="media:enqueue"){const n=String(e?.url||"").trim(),r=String(e?.kind||"").trim(),o=String(e?.suggestedOut||"").trim(),s=String(e?.referer||"").trim(),a=String(e?.cookie||"").trim(),u=String(e?.userAgent||"").trim();if(!n)return Promise.resolve({ok:!1,error:"url is empty"});const c=V(n,s,r);return d(n,s,c.extractor,c.format,o,{cookie:a,userAgent:u}).then(S=>S)}if(e?.type==="page:enqueue-ytdlp")return i.tabs.query({active:!0,currentWindow:!0}).then(async n=>{const r=n[0],o=String(r?.url||"").trim();return o?d(o,o,"yt-dlp"):{ok:!1,error:"active tab url is empty"}});if(e?.type==="page:enqueue-ytdlp-url"){const n=String(e?.url||"").trim(),r=String(e?.referer||n).trim();return n?d(n,r||n,"yt-dlp"):Promise.resolve({ok:!1,error:"url is empty"})}});i.runtime.onInstalled.addListener(()=>{console.log("[gomdown-helper] onInstalled"),T(),H(),D(),g(),y()});i.runtime.onStartup.addListener(()=>{console.log("[gomdown-helper] onStartup"),T(),H(),D(),g(),y()});i.storage.onChanged.addListener((e,t)=>{t==="sync"&&((e.hideChromeBar||e.useNativeHost||e.extensionStatus)&&(y(),g()),e.showContextOption&&g())});T();H();D();g();y();console.log("[gomdown-helper] service worker initialized"); diff --git a/packages/chrome/assets/index.ts-loader-Bju9eGS_.js b/packages/chrome/assets/index.ts-loader-D_eQmgUa.js similarity index 82% rename from packages/chrome/assets/index.ts-loader-Bju9eGS_.js rename to packages/chrome/assets/index.ts-loader-D_eQmgUa.js index 08be718..8486299 100644 --- a/packages/chrome/assets/index.ts-loader-Bju9eGS_.js +++ b/packages/chrome/assets/index.ts-loader-D_eQmgUa.js @@ -5,7 +5,7 @@ (async () => { const { onExecute } = await import( /* @vite-ignore */ - chrome.runtime.getURL("assets/index.ts-C6ePCen1.js") + chrome.runtime.getURL("assets/index.ts-w1ilzv93.js") ); onExecute?.({ perf: { injectTime, loadTime: performance.now() - injectTime } }); })().catch(console.error); diff --git a/packages/chrome/assets/index.ts-w1ilzv93.js b/packages/chrome/assets/index.ts-w1ilzv93.js new file mode 100644 index 0000000..09cfe85 --- /dev/null +++ b/packages/chrome/assets/index.ts-w1ilzv93.js @@ -0,0 +1 @@ +import{b as m,g as L}from"./settings-CgBxHrrF.js";import{i as c,n as T}from"./downloadIntent-Dv31jC2S.js";const I=8e3,a=new Map;let o=!1;function M(){const e=Date.now();for(const[n,t]of a.entries())t<=e&&a.delete(n)}async function f(e,n){if(!o)return!1;const t=T(e,window.location.href);if(!t)return!1;if(M(),a.has(t))return!0;a.set(t,Date.now()+I);try{if((await m.runtime.sendMessage({type:"capture-link-download",url:t,referer:n||document.referrer||window.location.href}))?.ok)return!0}catch{}return a.delete(t),!1}function x(e){return e?e instanceof HTMLAnchorElement?e:e instanceof Element?e.closest("a[href]"):null:null}function k(e){return!!(e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)}async function S(e){if(!o||e.defaultPrevented||k(e))return;const n=x(e.target);if(!n)return;const t=n.href||"";!t||!c(t,window.location.href)||(e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),await f(t,document.referrer||window.location.href))}function C(e){if(!o)return;const n=x(e.target);if(!n)return;const t=n.href||"";!t||!c(t,window.location.href)||k(e)||(e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),f(t,document.referrer||window.location.href))}document.addEventListener("pointerdown",e=>{e.button===0&&C(e)},!0);document.addEventListener("mousedown",e=>{e.button===0&&C(e)},!0);document.addEventListener("click",e=>{e.button===0&&S(e)},!0);document.addEventListener("keydown",e=>{if(!o||e.key!=="Enter"||e.defaultPrevented||k(e))return;const n=x(e.target);if(!n)return;const t=n.href||"";!t||!c(t,window.location.href)||(e.preventDefault(),e.stopImmediatePropagation(),e.stopPropagation(),f(t,document.referrer||window.location.href))},!0);document.addEventListener("auxclick",e=>{e.button===1&&S(e)},!0);function P(){try{const e=window.open.bind(window);window.open=function(t,r,p){const g=String(t||"").trim();return o&&g&&c(g,window.location.href)?(f(g,window.location.href),null):e(t,r,p)}}catch{}try{const e=HTMLAnchorElement.prototype.click;HTMLAnchorElement.prototype.click=function(){const t=this.href||this.getAttribute("href")||"";if(o&&t&&c(t,window.location.href)){f(t,document.referrer||window.location.href);return}e.call(this)}}catch{}}P();let u=null,i=null,b=!1,E=null,y=window.location.href;function O(e){try{const n=new URL(e);return n.hostname!=="www.youtube.com"&&n.hostname!=="youtube.com"?!1:n.pathname==="/watch"&&n.searchParams.has("v")}catch{return!1}}function w(e,n="idle"){i&&(i.textContent=e,n==="ok"?i.style.color="#8ff0a4":n==="error"?i.style.color="#ff9b9b":i.style.color="#aeb7d8")}async function A(){if(!b){b=!0,w("gdown으로 전송 중...");try{const e=await m.runtime.sendMessage({type:"page:enqueue-ytdlp-url",url:window.location.href,referer:window.location.href});e?.ok?w("다운로드 모달로 전송됨","ok"):w(`전송 실패: ${e?.error||"unknown error"}`,"error")}catch(e){w(`전송 실패: ${String(e)}`,"error")}finally{b=!1}}}function h(){u&&(u.remove(),u=null,i=null)}function s(){if(!o){h();return}if(window.top!==window.self)return;if(!O(window.location.href)){h();return}if(u)return;const e=document.createElement("div");e.id="gomdown-youtube-overlay",e.style.position="fixed",e.style.right="20px",e.style.bottom="24px",e.style.zIndex="2147483647",e.style.background="rgba(17, 21, 32, 0.94)",e.style.border="1px solid rgba(133, 148, 195, 0.35)",e.style.borderRadius="12px",e.style.padding="10px",e.style.boxShadow="0 8px 24px rgba(0, 0, 0, 0.28)",e.style.backdropFilter="blur(6px)",e.style.width="220px",e.style.fontFamily="ui-sans-serif, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",e.style.color="#e8edff";const n=document.createElement("div");n.textContent="Gdown Helper",n.style.fontSize="12px",n.style.fontWeight="700",n.style.marginBottom="8px";const t=document.createElement("button");t.type="button",t.textContent="이 영상 다운로드",t.style.width="100%",t.style.height="34px",t.style.border="1px solid #5a69f0",t.style.borderRadius="8px",t.style.background="#5a69f0",t.style.color="#ffffff",t.style.fontSize="12px",t.style.fontWeight="700",t.style.cursor="pointer",t.addEventListener("click",()=>{A()});const r=document.createElement("div");r.textContent="클릭 시 gdown 다운로드 모달로 연결",r.style.fontSize="11px",r.style.marginTop="8px",r.style.lineHeight="1.35",r.style.color="#aeb7d8",e.appendChild(n),e.appendChild(t),e.appendChild(r),document.documentElement.appendChild(e),u=e,i=r}function U(){E===null&&(E=window.setInterval(()=>{const e=window.location.href;e!==y&&(y=e,s())},800),window.addEventListener("popstate",()=>{y=window.location.href,s()}),document.addEventListener("yt-navigate-finish",()=>{y=window.location.href,s()}))}s();U();let d=null,l=null;function v(){d&&(d.style.display="none",l!==null&&(window.clearTimeout(l),l=null))}function R(){if(d)return d;const e=document.createElement("div");return e.id="gomdown-media-toast",e.style.position="fixed",e.style.left="18px",e.style.bottom="18px",e.style.zIndex="2147483647",e.style.maxWidth="360px",e.style.padding="10px 12px",e.style.borderRadius="10px",e.style.border="1px solid rgba(128, 140, 180, 0.42)",e.style.background="rgba(18, 21, 31, 0.95)",e.style.color="#dce4fa",e.style.fontSize="12px",e.style.lineHeight="1.35",e.style.fontFamily="ui-sans-serif, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif",e.style.boxShadow="0 10px 24px rgba(0, 0, 0, 0.28)",e.style.display="none",document.documentElement.appendChild(e),d=e,e}function z(e){if(!o)return;const n=R(),t=String(e?.kind||"media").toUpperCase(),r=String(e?.suggestedOut||"").trim(),p=String(e?.url||"").trim().slice(0,96);n.textContent=r?`캡처됨 [${t}] ${r}`:`캡처됨 [${t}] ${p}${p.length>=96?"…":""}`,n.style.display="block",l!==null&&window.clearTimeout(l),l=window.setTimeout(()=>{n.style.display="none",l=null},2200)}m.runtime.onMessage.addListener(e=>{e?.type==="media:captured"&&z({kind:e?.kind,url:e?.url,suggestedOut:e?.suggestedOut})});async function F(){try{o=!!(await L()).extensionStatus}catch{o=!1}o?s():(h(),v())}F();m.storage.onChanged.addListener((e,n)=>{if(n==="sync"&&e.extensionStatus){if(o=!!e.extensionStatus.newValue,!o){h(),v();return}s()}}); diff --git a/packages/chrome/assets/settings-Bo6W9Drl.js b/packages/chrome/assets/settings-Bo6W9Drl.js deleted file mode 100644 index cbfb728..0000000 --- a/packages/chrome/assets/settings-Bo6W9Drl.js +++ /dev/null @@ -1 +0,0 @@ -import{b as e}from"./browser-polyfill-CZ_dLIqp.js";const t={extensionStatus:!0,useNativeHost:!0,activateAppOnDownload:!0,enableNotifications:!0,hideChromeBar:!0,showContextOption:!0,downloadFallback:!1,darkMode:!1,showOnlyAria:!1,minFileSize:0,blacklist:[],motrixPort:16800,motrixAPIkey:""};async function n(){const o=await e.storage.sync.get(Object.keys(t));return{extensionStatus:!!(o.extensionStatus??t.extensionStatus),useNativeHost:!!(o.useNativeHost??t.useNativeHost),activateAppOnDownload:!!(o.activateAppOnDownload??t.activateAppOnDownload),enableNotifications:!!(o.enableNotifications??t.enableNotifications),hideChromeBar:!!(o.hideChromeBar??t.hideChromeBar),showContextOption:!!(o.showContextOption??t.showContextOption),downloadFallback:!!(o.downloadFallback??t.downloadFallback),darkMode:!!(o.darkMode??t.darkMode),showOnlyAria:!!(o.showOnlyAria??t.showOnlyAria),minFileSize:Number(o.minFileSize??t.minFileSize),blacklist:Array.isArray(o.blacklist)?o.blacklist.map(a=>String(a)):t.blacklist,motrixPort:Number(o.motrixPort??t.motrixPort),motrixAPIkey:String(o.motrixAPIkey??t.motrixAPIkey)}}async function s(o){await e.storage.sync.set(o)}export{n as g,s}; diff --git a/packages/chrome/assets/browser-polyfill-CZ_dLIqp.js b/packages/chrome/assets/settings-CgBxHrrF.js similarity index 53% rename from packages/chrome/assets/browser-polyfill-CZ_dLIqp.js rename to packages/chrome/assets/settings-CgBxHrrF.js index 377b743..076059a 100644 --- a/packages/chrome/assets/browser-polyfill-CZ_dLIqp.js +++ b/packages/chrome/assets/settings-CgBxHrrF.js @@ -1 +1 @@ -function j(l){return l&&l.__esModule&&Object.prototype.hasOwnProperty.call(l,"default")?l.default:l}var h={exports:{}},O=h.exports,R;function q(){return R||(R=1,(function(l,D){(function(w,p){p(l)})(typeof globalThis<"u"?globalThis:typeof self<"u"?self:O,function(w){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)w.exports=globalThis.browser;else{const p="The message port closed before a response was received.",N=c=>{const k={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(Object.keys(k).length===0)throw new Error("api-metadata.json has not been included in browser-polyfill");class v extends WeakMap{constructor(r,g=void 0){super(g),this.createItem=r}get(r){return this.has(r)||this.set(r,this.createItem(r)),super.get(r)}}const $=e=>e&&typeof e=="object"&&typeof e.then=="function",E=(e,r)=>(...g)=>{c.runtime.lastError?e.reject(new Error(c.runtime.lastError.message)):r.singleCallbackArg||g.length<=1&&r.singleCallbackArg!==!1?e.resolve(g[0]):e.resolve(g)},f=e=>e==1?"argument":"arguments",F=(e,r)=>function(n,...a){if(a.lengthr.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${f(r.maxArgs)} for ${e}(), got ${a.length}`);return new Promise((t,i)=>{if(r.fallbackToNoCallback)try{n[e](...a,E({resolve:t,reject:i},r))}catch(s){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),n[e](...a),r.fallbackToNoCallback=!1,r.noCallback=!0,t()}else r.noCallback?(n[e](...a),t()):n[e](...a,E({resolve:t,reject:i},r))})},P=(e,r,g)=>new Proxy(r,{apply(n,a,t){return g.call(a,e,...t)}});let d=Function.call.bind(Object.prototype.hasOwnProperty);const b=(e,r={},g={})=>{let n=Object.create(null),a={has(i,s){return s in e||s in n},get(i,s,A){if(s in n)return n[s];if(!(s in e))return;let m=e[s];if(typeof m=="function")if(typeof r[s]=="function")m=P(e,e[s],r[s]);else if(d(g,s)){let x=F(s,g[s]);m=P(e,e[s],x)}else m=m.bind(e);else if(typeof m=="object"&&m!==null&&(d(r,s)||d(g,s)))m=b(m,r[s],g[s]);else if(d(g,"*"))m=b(m,r[s],g["*"]);else return Object.defineProperty(n,s,{configurable:!0,enumerable:!0,get(){return e[s]},set(x){e[s]=x}}),m;return n[s]=m,m},set(i,s,A,m){return s in n?n[s]=A:e[s]=A,!0},defineProperty(i,s,A){return Reflect.defineProperty(n,s,A)},deleteProperty(i,s){return Reflect.deleteProperty(n,s)}},t=Object.create(e);return new Proxy(t,a)},y=e=>({addListener(r,g,...n){r.addListener(e.get(g),...n)},hasListener(r,g){return r.hasListener(e.get(g))},removeListener(r,g){r.removeListener(e.get(g))}}),_=new v(e=>typeof e!="function"?e:function(g){const n=b(g,{},{getContent:{minArgs:0,maxArgs:0}});e(n)}),S=new v(e=>typeof e!="function"?e:function(g,n,a){let t=!1,i,s=new Promise(u=>{i=function(o){t=!0,u(o)}}),A;try{A=e(g,n,i)}catch(u){A=Promise.reject(u)}const m=A!==!0&&$(A);if(A!==!0&&!m&&!t)return!1;const x=u=>{u.then(o=>{a(o)},o=>{let C;o&&(o instanceof Error||typeof o.message=="string")?C=o.message:C="An unexpected error occurred",a({__mozWebExtensionPolyfillReject__:!0,message:C})}).catch(o=>{console.error("Failed to send onMessage rejected reply",o)})};return x(m?A:s),!0}),B=({reject:e,resolve:r},g)=>{c.runtime.lastError?c.runtime.lastError.message===p?r():e(new Error(c.runtime.lastError.message)):g&&g.__mozWebExtensionPolyfillReject__?e(new Error(g.message)):r(g)},M=(e,r,g,...n)=>{if(n.lengthr.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${f(r.maxArgs)} for ${e}(), got ${n.length}`);return new Promise((a,t)=>{const i=B.bind(null,{resolve:a,reject:t});n.push(i),g.sendMessage(...n)})},L={devtools:{network:{onRequestFinished:y(_)}},runtime:{onMessage:y(S),onMessageExternal:y(S),sendMessage:M.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:M.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},T={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return k.privacy={network:{"*":T},services:{"*":T},websites:{"*":T}},b(c,L,k)};w.exports=N(chrome)}})})(h)),h.exports}var W=q();const U=j(W);export{U as b,j as g}; +function q(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var w={exports:{}},I=w.exports,O;function W(){return O||(O=1,(function(t,P){(function(p,k){k(t)})(typeof globalThis<"u"?globalThis:typeof self<"u"?self:I,function(p){if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)p.exports=globalThis.browser;else{const k="The message port closed before a response was received.",R=x=>{const y={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(Object.keys(y).length===0)throw new Error("api-metadata.json has not been included in browser-polyfill");class S extends WeakMap{constructor(r,n=void 0){super(n),this.createItem=r}get(r){return this.has(r)||this.set(r,this.createItem(r)),super.get(r)}}const $=e=>e&&typeof e=="object"&&typeof e.then=="function",E=(e,r)=>(...n)=>{x.runtime.lastError?e.reject(new Error(x.runtime.lastError.message)):r.singleCallbackArg||n.length<=1&&r.singleCallbackArg!==!1?e.resolve(n[0]):e.resolve(n)},f=e=>e==1?"argument":"arguments",L=(e,r)=>function(g,...i){if(i.lengthr.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${f(r.maxArgs)} for ${e}(), got ${i.length}`);return new Promise((m,A)=>{if(r.fallbackToNoCallback)try{g[e](...i,E({resolve:m,reject:A},r))}catch(s){console.warn(`${e} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),g[e](...i),r.fallbackToNoCallback=!1,r.noCallback=!0,m()}else r.noCallback?(g[e](...i),m()):g[e](...i,E({resolve:m,reject:A},r))})},N=(e,r,n)=>new Proxy(r,{apply(g,i,m){return n.call(i,e,...m)}});let b=Function.call.bind(Object.prototype.hasOwnProperty);const h=(e,r={},n={})=>{let g=Object.create(null),i={has(A,s){return s in e||s in g},get(A,s,l){if(s in g)return g[s];if(!(s in e))return;let a=e[s];if(typeof a=="function")if(typeof r[s]=="function")a=N(e,e[s],r[s]);else if(b(n,s)){let u=L(s,n[s]);a=N(e,e[s],u)}else a=a.bind(e);else if(typeof a=="object"&&a!==null&&(b(r,s)||b(n,s)))a=h(a,r[s],n[s]);else if(b(n,"*"))a=h(a,r[s],n["*"]);else return Object.defineProperty(g,s,{configurable:!0,enumerable:!0,get(){return e[s]},set(u){e[s]=u}}),a;return g[s]=a,a},set(A,s,l,a){return s in g?g[s]=l:e[s]=l,!0},defineProperty(A,s,l){return Reflect.defineProperty(g,s,l)},deleteProperty(A,s){return Reflect.deleteProperty(g,s)}},m=Object.create(e);return new Proxy(m,i)},C=e=>({addListener(r,n,...g){r.addListener(e.get(n),...g)},hasListener(r,n){return r.hasListener(e.get(n))},removeListener(r,n){r.removeListener(e.get(n))}}),_=new S(e=>typeof e!="function"?e:function(n){const g=h(n,{},{getContent:{minArgs:0,maxArgs:0}});e(g)}),B=new S(e=>typeof e!="function"?e:function(n,g,i){let m=!1,A,s=new Promise(d=>{A=function(c){m=!0,d(c)}}),l;try{l=e(n,g,A)}catch(d){l=Promise.reject(d)}const a=l!==!0&&$(l);if(l!==!0&&!a&&!m)return!1;const u=d=>{d.then(c=>{i(c)},c=>{let T;c&&(c instanceof Error||typeof c.message=="string")?T=c.message:T="An unexpected error occurred",i({__mozWebExtensionPolyfillReject__:!0,message:T})}).catch(c=>{console.error("Failed to send onMessage rejected reply",c)})};return u(a?l:s),!0}),j=({reject:e,resolve:r},n)=>{x.runtime.lastError?x.runtime.lastError.message===k?r():e(new Error(x.runtime.lastError.message)):n&&n.__mozWebExtensionPolyfillReject__?e(new Error(n.message)):r(n)},M=(e,r,n,...g)=>{if(g.lengthr.maxArgs)throw new Error(`Expected at most ${r.maxArgs} ${f(r.maxArgs)} for ${e}(), got ${g.length}`);return new Promise((i,m)=>{const A=j.bind(null,{resolve:i,reject:m});g.push(A),n.sendMessage(...g)})},D={devtools:{network:{onRequestFinished:C(_)}},runtime:{onMessage:C(B),onMessageExternal:C(B),sendMessage:M.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:M.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},v={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return y.privacy={network:{"*":v},services:{"*":v},websites:{"*":v}},h(x,D,y)};p.exports=R(chrome)}})})(w)),w.exports}var U=W();const F=q(U),o={extensionStatus:!0,useNativeHost:!0,activateAppOnDownload:!0,enableNotifications:!0,hideChromeBar:!0,showContextOption:!0,downloadFallback:!1,darkMode:!1,showOnlyAria:!1,minFileSize:0,blacklist:[],motrixPort:16800,motrixAPIkey:""};async function z(){const t=await F.storage.sync.get(Object.keys(o));return{extensionStatus:!!(t.extensionStatus??o.extensionStatus),useNativeHost:!!(t.useNativeHost??o.useNativeHost),activateAppOnDownload:!!(t.activateAppOnDownload??o.activateAppOnDownload),enableNotifications:!!(t.enableNotifications??o.enableNotifications),hideChromeBar:!!(t.hideChromeBar??o.hideChromeBar),showContextOption:!!(t.showContextOption??o.showContextOption),downloadFallback:!!(t.downloadFallback??o.downloadFallback),darkMode:!!(t.darkMode??o.darkMode),showOnlyAria:!!(t.showOnlyAria??o.showOnlyAria),minFileSize:Number(t.minFileSize??o.minFileSize),blacklist:Array.isArray(t.blacklist)?t.blacklist.map(P=>String(P)):o.blacklist,motrixPort:Number(t.motrixPort??o.motrixPort),motrixAPIkey:String(t.motrixAPIkey??o.motrixAPIkey)}}async function H(t){await F.storage.sync.set(t)}export{q as a,F as b,z as g,H as s}; diff --git a/packages/chrome/manifest.json b/packages/chrome/manifest.json index 4aeff20..f00ab3f 100644 --- a/packages/chrome/manifest.json +++ b/packages/chrome/manifest.json @@ -28,7 +28,7 @@ "content_scripts": [ { "js": [ - "assets/index.ts-loader-Bju9eGS_.js" + "assets/index.ts-loader-D_eQmgUa.js" ], "matches": [ "" @@ -57,9 +57,9 @@ ], "resources": [ "images/*", - "assets/browser-polyfill-CZ_dLIqp.js", + "assets/settings-CgBxHrrF.js", "assets/downloadIntent-Dv31jC2S.js", - "assets/index.ts-C6ePCen1.js" + "assets/index.ts-w1ilzv93.js" ], "use_dynamic_url": false } diff --git a/packages/chrome/service-worker-loader.js b/packages/chrome/service-worker-loader.js index f7c4242..7f12106 100644 --- a/packages/chrome/service-worker-loader.js +++ b/packages/chrome/service-worker-loader.js @@ -1 +1 @@ -import './assets/index.ts-BljhweV3.js'; +import './assets/index.ts-U8lbRRO-.js'; diff --git a/packages/chrome/src/config/index.html b/packages/chrome/src/config/index.html index f9377f9..53a3ae7 100644 --- a/packages/chrome/src/config/index.html +++ b/packages/chrome/src/config/index.html @@ -4,10 +4,9 @@ Gomdown Helper Settings - - - - + + + diff --git a/packages/chrome/src/popup/index.html b/packages/chrome/src/popup/index.html index 091206d..b80a3e8 100644 --- a/packages/chrome/src/popup/index.html +++ b/packages/chrome/src/popup/index.html @@ -4,11 +4,10 @@ Gomdown Helper - - - - - + + + +
diff --git a/packages/gomdown-helper.v0.0.16.chrome.zip b/packages/gomdown-helper.v0.0.16.chrome.zip index 97ce5b88be91980f6a91971729175c65f6a0ba05..aa0a7c26ff7a02bc8085fc4c676747484772d8b2 100644 GIT binary patch delta 63354 zcmagEV|XB4*EJa1HafQLq~mm)j@_~CRBT%vyJOq7ZFg*A?)#bRedhgUeoS3ee^%|Y z>)QLQRr~1h74q*RB$}cuI0PKXzt>EImQMcm3sXEA4fKj!u7!$RZoDWho*K8ck+QM^ z1EZxA6(8LHHc!k2CHjx$Kh}x0-gsa$4T-y;^#6gB<#OvWz><0X#s2V-|Bu7OPiwOJ z7ruVjfAKDH%KzGaTH`_ei$TjV{TCCELjwC3`yo&9Kke&1950Ud`FTKtM7eK|l~e2taHMZ7obqoSgp&$<9_y6&3{i-+2FhT-@P7 zKp`GLK|mld{z*x)YOn1&GeYMv9RhLaphZIdNrYi&<4T(tvUcq}GfadWpUkgO^h0vp zS%8>gy)M-h)Rje8@HG4?{`QVsdM?6B69D0D0*{jG+nPE_up5rVE>Z0`6O3%h<4O9YtIifoJTATZd} zP(1rG1O9hi8r0hEJf)*0Jl!HQ-E-HV9`P}?rGz)ETy86_V`NI)OmBE&T`{w*47?Vz z9%Z6%YB#P@x5#s@Yel-`lcPW>or`tLd1FWcoVE2og>l+(~6Zc%k%yzmiDljuy2 z=0ccnsVZYTh}fV0bOoUm#p%2K3UI@H9>UUTeBDUf?Ie_3^=xL{wkKb)8+Ia~9>MW* zH*^`=x&YU$>tQ3T7!Hxwc5^3CNJqm{AbW8YDj(9Hq6k(E?L!-<>c{?{@cuJ&+$s@F zA1!<;cp7*6T7`VJrMK1K-j+Zwkjmzjs8>ocgvGaNu&IYUT~6IWuVE)YF!uq zl_%@`#V&Kr@|&p+Ony8a3#qm{}zM}{@KcG zEa&eIxlfS)M@*mSot*yr4b}gz7An;yV+y!&I;K?`7S^<*o{?EH#w!};h>qCT z=FO3y04O{B^}0z)+=2FL(iy^p2KKpoRAX#F?I9W7I>}M2GKh6#iNV>AhJ}ejWsX#W zmvO4)cm&NN9Rl2^P-fnLeGcG#uI0>_8 z88Fn0e=TAuPsI?D)Knc%;$iEVt_h8}7$+;K8k8nFoyS=qO0tJFoe5HA#3v|vRaFLT z8%fMIaOB5B%n2sjf6tAS?$>mgg2_{$cEpEyg+~V%$s+y;jPAJ@JY=&-*&5=k?-Y_xC7wW;d>(d5Io-m!8p%O7Dx*xlj0)_>VMYo-a`V5*jt)>I386bKcA(FKQS|_HV|7lq zeB8_sa|p9GVmB89&fDQ8VqM;)-^WnjQ28|}xP3h3Nha&}LcF`8d$W?FpBz#K*1cGY zyyVxfg5PS_GUgCQG#;j2a4G`kLIdjPV>R8$N?Vj_tUU>t*U4F*!tcTBKY#!9HWGj$ zRFsdSoQpkhyztIvT=g}uj2{9tAN~3*PZ@GbZ?l)4I$1XF4(AzAUh|HsdIGecnEgy7 z<;_|6#)?r&zj~PSV$$yAE03wbh*d4%ji6%??0#Twy|K;%y9r2KgLQHZ1}-D-$rsV? zW|F_>VIsK18A=w|(rr;abss<#FtNHR~j!Py`Big~yJwzuj|KZF~Hn_nNF4=q`{0Pk=R}+9*LS0^W z(<(MVN$|$1J2H6f^nNA&SJwZQ1(<(oWnuup{U7oEBbEAI00|uS-%5jsKP$77*j?}q z_^xlFWMigg_)m@bud4p3sQ>Q@W1=uA-_MND^+Z#ln<8&TI}ol0&bYx%>h4E<*Cbad zz;nr4`g&Q2YA&@w4}6(!CocCu6bIFUXgs2lmP1sJ7fT^eV_<^)o;mY6L20s=Sgm)C z;n&*h1(JU3;bIGoPIImgpWo9F`u{zQ=u!`&Dcjr;Wj&vww`4`m)$6^Zp#HflOb_$t z75Z9o7pd~TkY=4oQD{qVvTra9?@XAlLo0gG9(%2NyuVXmP&~b;6@4Q=rvlgM<_E2_ zc6~_7rfnDJmzl_e+Y^Ke=WiJmt*Zs%N&YzP27tORp~q+_V-Np-CrwLdi7}UKxef%R zjvnlP|B8&QElg~k8ALrTJrvxzJpO-@Hlb~!zTcAYNjEgUyM}Lwme$2~mV3l1jC4;K zL@8iz&Uj`F5b(IJ)dpUGkREi~C6li^q7@%+)e}F$*A^*DKjfE}kfX~NOJ^|YOing% z+5IgU{oee@nsRK&Kjx|+(cPV0Vlj+o=DB`tR+}0sZJh?s6ke~xSJFR_`9mX1TW@S5 z>$f<HHtC3+x(!Td zyiO?ZhxqELCT{GKb5YViOpP6@NYE^Hl0=12``i8u5)>Qb8z)3sy=KL&o48L;ZZD8^ z>yvZ=m>9pbw^#iobkKEm7pIUaM$L}q8qjJn3gV*a$8awyDMw9XJ;reO87E!yd~CqL zq`^042kRIXiZ(S2v+9-bj_!UF#^rez$izz98Yl_Ms-);qD4oErd7|qU^(yIQ{L&Oc zlr)U`Hp$uq&q>^uFUB=?U%)5pQRIo^HETTrID6R?;#1vtCrm62lP5ASUnCD9B(-H; z&+@ivr)cfC>iRX>(sMHCK;``XS+8pjt+x26c?l_u<)?TsrNj86-&&}>%r#{O((6#( zoGC>XtuR-9uc9G4KZd7Odo}kA*ZY=DUB2>n)3naoUeK~La}Gace6V0a|IoE#Wccqq zAoIXmjA`mfVuojR=5NWRR7~eD{MUMZ#Lf*+Dq~^C`f#6&XTt&IldkoR4+12Q=57nH z8Ph2}2VXlCF8;2TzcZi@V51ksm{WB$k!(8I_2K%ntASP>zF1qPy42- zqi!~@Cxh7okr}b3^G`kqpP0{80C<8kzyYCGRHzSW{hG$OhVKg3%N=;SdH~)F49bM! zj4-$@d-a8GZ3rwFXIqY=82c(xCxofQv|+=IK(#9=3|WFoanH!hhCkDgNEyqWO};oX zC8~y@UL+yFQ>xt92HMt{3vF~S;@%0gNAPVgmZ%HO*n&zWkgSw>vu{q(6 zfL_*DasKINUX?Wf5HcID=4Mn-#QmA3TR3*xI2W-6M{YX-zXD{{wy~#6+{W^6(Nl#lp4%Ru3nT?R=?+Ht!8b#4Ouf6p2Ba zL!D0T7A;6G7Z&`32VRzIy<8Bez*NCmkyh+IymhXxLhfd5&quR}!EB0%#K>|n;jgJW zf6Xd*$+@$nEtk`t4SxCZ2hS}54B1u9`UzgMn!A}JLzkUHUa+NlNTZqL7X78Wa<_FR zm7DhXP%`5m!e;l`U5=IdS=f_IA}dTL`l=SHO1A4n$l?};;&4%P`Q1(T0y zghc&068+w7#Py*Od>tH*#A|TFB^1nehC*6mNA300!@;J>-(oB}LkTjyZz8~+-&n9E ztXl>jn^x{0Iby4t6lTngZR>6NKISil*L=b?Epz;ag5p!vssLb8T<#@|bl57(s;BkU zoM3bnn=g0gN_$Uam*_y|Q*jT#t)IC+K`Bi&vPF4mGpe1`%)JF~n<=wBYbZm1_7C;x z^fP~L+UhB~sj)lXRCzPB`#y#<%Y==(@kE^RZSxn;=G(EJv7IW9LulFB^WTWpz`b$Q z3guzUT&FevWGVn$80lt&`?*~+{Fb^I#($IaJKnre1ZNAEQ8$h^Nz|$$030L6N~5uG zEzPF;)Vj4$+09pCdD_M&P1+!UY*^H%qA0E6#8treknGdV+I*r-Q^xv9Sj&IFFz-la zHp|{v^E9!B8072T?XK|wR?k$Yz4SZP6)vOh?dnT;AyY)6OZ7JW2|Au5=w%|I>CJH!?^^TL^+Ki!!MUP)-ebDM0t`t zQQ;!wettC0Fn%x#K@+X4gSd4vm>-JUZFmY2c(H(M#x8ge{#wQsGuVL_6N^92C&+0c z;*PaHRLDp}@K&5OoW7xqRaQ`K9y+2;-NFTkubgcAb)yICJY@}q;{Z9zB#3VRyB?b1 zV#GQ^!_V)!`64XAr2~UCh=!cw>3rYGmAUO2`8HWwBW(uV)Ifb&Up((WL3KJc5suzk zL*)UjyLs9r7`}(mG-u&A*~I(uzilVn-n8Q)h3w5R6*FQE+;B|;@Dw}~iaui?qS+*WfDh1f=0w#RO zOMmgce@d!>RX)}4b+K<7D%7BzXZecF&-NsXO|i#L}Sy>|%W9}^V!Z&f3t&`*9#K_qFTUVdR4SLFAyY(CZoIY`~cs{I-tG+^=yk;+WyK{JcN1oNItOXm^ z7@YQ0WA}c)or$ShQw?Xv$0$Tf#$0O#Y4~PS`NLEbskbDmO<4%yo#A-b0dA4b90NpJ zOwuQO2eJ`D*b#P34(1m@RU8Xunr$W)h&<$J%K}G~AQlc`h-#W6xWN^*pDqX>4e_G` zq|DGDo`>uH+G&hRkCNK`%Ytod*tEdyE6DvzdT?_1Fe4@=Z+OVoA0$VR8amtE`_zUJ zI(uTUmL5EN!ZrRS(s4&R349oT95i_U=Jq(Oy&v^SBmY9rzrMM3JyK;CUDL&OrBSfb z{Vj@nPM!+}K3B1{^U4_9{Tn$jj7}tyaUheeb2B1ikd5#?-Y$kcVTU3^Lh1HI!d;%u zxYiDnJ}G#kx5H?(DV7{k|5Tk7GxLa!E|ZrLYrv_EXr+twj3p`*NBlmpp0Gth#Ee8{?%Dxe&tV1919gip38t$q zf+wOMZ6ik}LU|qgxF;?c_Y-$4w#E!+Xk|k&i*liRk>WB4le|Q-<{+~$b=+xFqO9(pUCVY5wu*zAtRssw%SF`^QFKk*degaf_l4x^-H zpwb+>A%1%sGZ2CKa6ABLyt1NO`pe}NU2oZ5c4fXKC#((@G0eJ<%g(FAD5=$Y8AHyx zT3Jtw%##)pX^8%aR`I*-8xAa?O_)N_6_7jhqNC|Y@PD@9(21#fv@w$BzgO2Q|5X$0 zjOF(=;h!tpufp|Xj-ms^SrS^RVkbcjYzp;PfrpC6K$g9RdOUz5wzGaYtEeU(3gz%K zpJh2@QN7#34CpEQhWYt0F^4exw{p7z{7+G$N;W;=VayS0SsKsfTl;Q{q7ipEg`FF< z-d>sv__2My{WGPVhy0j!Hi=D+>M}of|Il03Y18pBHm?xhQ%BzN7t}=k(io)UQ+0OA z>x3VKqbvbsJ_A4wHgr93-_Fe&g!PpH6T>g;K%^}+nB@IehPai30^UU2rT7oc zxy~G)3I=w^CKgR&)`4!U$XJ_(iHruZg0sOzY{@ka z-gTkY_YK58blAm(CgvOU0DC&##uCKv6o*Z zyIfk7J>^Kumjc3r^HvSH?zkJV!4o-lQAiGQfRi`Q`T5Q|XD_&HRe(*vFF$>6UQV0Y zCDM`5=7%J<2FnJrhY}>c*&K{EZJOg^+inD%eK3%tGuviQ#%qT10*`|ga5@4}fLrHh zYCw&b2p>AvBaUu2k*a4Uw?`Qv({1Zjspwo+l>vcr^>G5<0a$oojy_zo(LDw$!It?O zAb0+ksme-*CzY-3zWbOXj0saNEEMT=Kd_95HHK!kS3m{val7F!@ z(F4gPgWHcsE8}tzGju>zFnhto!2e~O~Rupx4Sx5#O+HbQ9CZDWQ zkKtlA4qG9uO~~o8y6NEI6jw+INA&XD883{U5mY{Zqa?&TNeSqxtYX>lG^6QAi1+N6 z9??-~HzNp9WZ*Ox>lB1n&5-Mw@{dw5aE8~_gHu}!gw-u=`tz=%qiZXAVv*AVf)`G< z-jIe}to%raQ&d%2gs-{_BDuU8TB(4H|F|XFPk9S#ktS`_52s~sfLM5HbBOJY6_4$w zWozZe&2n?8sH!!Lc}B5e05Pe{DjT{8d+z7!Kq!is$oRvic~UB(hz)cp8)TeY?=3aK z*U%}}Ri22EgH;-MU0y=f|iYeZ`!1t&Bn~TqznmrhW=Yz8df{rX@c+LR#a2Ue9p>>fw8h zlvXlVv=)bnZwUNGo3VR*fu39rPOl@+>dJ36FEe!s?%ztyQxabb8GV(L4-+Eu#uTaE zBbqILJg`MFZcmUr`(-iruu^$1=PP3rl{g{?pmvw%h$AhXLk_}m=gxV8a$F>Dz!-Qn zmcUGzxXE5zQZktgGg%G;6ve%z=X{E91G}t2%Dc`o)5MCHUqlpJ$S3r}mwzybj+V?n zm?0L}O6{&pY&6jRS$QxvtDeZLTyp)Vmzh8t%X?=kqK~(`K}54_&a{f)<~fCsx3;z4 za*&`U!+s^gh=y_}Rw2`NVb1lyit@{V%*2MyzQ7yTE-h@hmxAI0`Mb<<`gab6P^2&t zkh|0dWhsGYr13`z^^J5Gn+=A?oQ8w~T*&l7G6tv&t~FfD7YZB}5*5^aRSPH0pgP|A zgv+q=^h^t}+v&DA1IFpRj8%mE{!<4gFK!-^TWD?vZ+pi*ST{SudiCQOBbRemaKeGv`RT#Iy)<-IDMas=-fI5$Gv`dEZeUd4Ec zO9EQBU}ax8(72Boo?HBwi%iZWp27s}LZuPn#Za`|5WhLIKgR`2Mi7tgqF5 zLHy5P&;a?(WDp$eHJmVsg3bjGbju_}%xek{QTg1rUDi^1lPHc=Xbq|C*oBXTVy4bb zTXxU;G0#_N2D?ypq>Y3?q`O%Bl<>On@>=F=JYGqR_Yr#xnVp%3uf5B{=%t_rfja;^ zCX*~y8p;L0haRQJ+X|+~o4e4t@Q~j8JETGFI`eefRqc2j>pBDNR=_dbU!7Eqrm?No z_xnM)tl3MZ(?jYb&E@-=|g)V^gv9umISzi3tI zx?!H?5qQcslej5FViCpv+0sRQ^*#Eujh0ct>W-b5kV6Rx>U?;_4LPj( z=cIsFE>CYJziS$HdH-35Y{*xF!GSP|EmB_7CT-so{DQ{lxLJ?pVd`xDDDCId&h+bP zs-9FhvFF$M0UF$X=T~cUtXntV<>k7N+2j!*?Su`;e@%UT4(ap07xn8u@)16JUDHwV zJwGIUUG&KQ2^4tiF--l++S8YB+I~g!lFxWAa)M%lo-~EmlLrP_et+!={GLbm=DD~| zl|R1U{W|OWY_yfll-y*hR2+l|2t=H#6>{jO3v{T(AC_i|v@KG^`qi%2 zaV93EW51=n{GguzdnMu;RgnPZHezYzS5ja%%HQ`DbNGn2U z=xtOaD2q7sL#b$kBuhKoN;2&;)hd2qRKi!{yP~NtB+XE#Ah7sT!gnpDraA`{MP6Xd zo?$agf{Z0~u)17#)-D3YG#=E8{+4S-Y<`%<_jwLqlGU=8LI$@`jA5FK z>v!#Xv(txa_MeJZjBCw*HVL>A{T^F&Va$rW^)MRsyn(0tYi0eRwQ}^KpsN?)@~E%H zow(CZMjz8oJ<^}cmmz1uyW;YDATD|Dw~-a*j=C7qn3Z6fJ_UsjYufQ^sWJX8Jt>jT zA09spSz`T`$jhM+g@jvXR7vE(jYDHRPQRD3iV~E~i6?=Pen1U;a_gAi-D|qiZA~5B zifFzBpEB}`c|SEIiy9LYp~ss6k>5N(zIj1_8Gl~(k2>`Gd@ZMQsj$4tP%5@z-rn=* zK-^KYCC9%H6C88kzYJqmo z2W$CIL<__qViIcUxL=U>tH{I_^#ncECSz=YW9(Ey!-QlcR8`54xv>-gCLCk4pjy69 zZGX0g+2tY3Gl-=B`J;8RAkN6Rt{zw~TLzje5(?6JuA^r7AaSS`pk$y)i7t=r6i?nT z5Jx&MU+udySLbZeaEq#k$E`JTuCw!p7>WG($Bj;@+n+sxo7+4kLV>+9O z-Tggk$avxdP1ImgO#QRY$poG7@KL-p3 zZI?qwN@(`j)hB0W74i{;Fwg#;O~B^E-Y{IHJ9&3}9B6t~pOiKDRpq_>gCqrs%r6wz z^Nl;_Y%4o#qOgtw^X3;VzMnX{k(2haqQW!!;j9b4B`F@Kv*Dk#A+9=5t12M^ikl9O z*aOuf#{n4)@i>r~Gxi)a0Csk=t#0W@mT=P!udB*I7ORe^GT)RRMXb)q_lV)5;F4bn z1%z(kf^u588)768y;F66l=#zUv^DWDqixETmGXYANBLqHDE=Q!h zA@uX56Th`$q;HvXnv@r)%E+aLYsxLVR7Si5he#Oc)wlA~$6z2~0c%K*jiyVU%6ENI z{ApnWhZIUwG_0CnY-STw2&wBRGo?>V%e+SUDWgPk9qS&*%=s=_HC(OYGqjdKNqv<< zBq!Ac5ES!4q_8Z^{6&iiwzYArIE=UKs4D&&iUc*fb%0LMmgPpL=b+Ldh_b)JGT2*Iiu%U3Z(C8osq+S z3+B0t5p%N`6q0fUI)5}klbhMTcc+aRt$pJQ6vr!2U2lsSt{puX88DE?s^qCUt#DY6 zxL#|+^23Zv7lkJ{Y{HBc=Nv6~Ng6Y=zlV4iD|M2UzhMxe1Y{5gsQU__liAG=j)?Hw zYU-haFK^SBVK&3@pXwpF&%N%e?KbZGzjhIOb%JlSTa!f)_^l8_l{(EVas{QX;X9_e zQ)71|7I~;(*L{Yiab;Da_z%CR!UiNB^t(FR+t*vp;u8w$o132!B<^%rks}u+;UJxf z5@FA=sltWy0FlQpK1E+49tnF_{o)KnCVvPyyt3Xns|LMiAtz85U+?-Hn;E>0@j*o3 zC>>0}rH7BVD1o?=95xHYIXK6;FHOE*cfSbW#|BAsuZ;xrrTjZGRt5D@c z;`$8-76hzSRXQ5J*eExJeAr49pGGEzG-jdZ0jZ+5fP+U zIQ$R?*oLFa)4xqjtIJe}KgXUQ&Vax0@O5#yEK*wcH?Ot8EKOXU4?Eyr9^U!m7t@`( z9E9kfp4uFQhmN#VEczP7$j!-`AyrmiL55XR($U&Spi?)u21VY9br5Pt2h zm^lAw!>h&k0+rCx$4kG=7$4WE?xWIfw^D#+E(_1hFG`b0Fp+KcQ#8uuGZ( zz{_%+SHM5)mny{rtBq%gIY^ym=7dty)z5NSeSR{!;+++VkAc2f!p2xv3$tV8XIF+3 z)_<6+_uQ)W%%3I1z=bh`vUvFmLR7n?p=fIOnN+)wcius$Y}Mw2aB3u}2W@J3*~#jr zm>JY`q-y4|i~_bbp%rh%OGqQ=#nBK72ujus;uRralrx?2z%+dh!x=g|8#M_@o!VpV z!h3f3BM#LpA1ShA38@&fe%?Tl#x~+iL~Q(iGmMMpY=4&f!3!mN*+ljAfTDyMi5R-i z0n&JrAEHf|xTG#`9kma}f#aTBQH_mHAYN+jSuMAcyX>rvWoXFfOc$t3C8*d1l(f^# z%oP95t={6z$(~5WC(1Lxd@S)kQk>j<&!8C=`z#GF^4Zh33a&_EqKlip}5obkkYh@+37!8r_y}xC$0`=LY zCdcaB?e2ZP`q=cW`0p29q}rPW?iyVq_p9Mon*-p!1@hDx!iIq8uZU~>1vGD6J?weK zJcDjRw(=Ydt>(lkk#%wy?hwkw=eojGk7N-#7dBeXfmvv{5K(=6s85ai8-&)+ZN;5nhnmfv6tP#{S*w(fb%@oEbd+) zpMUd1JFP8ZEvFkMDtJf?Aj?R<=Tf<}F!76|a#C*Lpq(W9@b z_fqH#^z>kl5%F`dWi<@#QwlwbFPOg4BUxv~=SQ7Wq9A|~E_X-Tlc>j#95;-ikPM7df*w)grcS9kn$nSj|T+XVEh`m6k@BAif5iH{TnjbBe@L<;fka0 z`mL~+t`Q2XG-;JU0Z*&9EvFw+K!mpI|pkR z9VoudY8ti_)QB_lto@oaBdkRRPBDaPOY@``%zC5@^?eG{2rPkSg22(0EPIRvvyO6#Eok^saM?EhH#YDv=g};NCPs(#L>9%D;}=u z9(#;O&SPU+DUWHJ(y>y?Z#C^Mmp=d-N4*NIXabP4^p{jtC7qNa|)A?qy{T zk|E^iBeG(=w-HyILs&tOm$&2N9XDOzK};Wi#PP%UVT~P>E7H8lZ4(VLr&Pbs3VFZ+ z`%n9lns^i8{wouyH;*1j0#wqS<hcE&fIU&uP?=u6 zTBNIAlBK0}E^im(N>fkK@WT68UC3AeSyNt+Qht`@mI~9bW)>b=;;eP3f=AoLB?Zf5 z-pY(@QPQZ}dOSLy%v4riXDQ}jlIb{Ubh}RmC~qL%k_j60MNIt)$N|yl*9&-qmYreZ za%1UQ`!V)l1cyBQESj81p&f>p7fqOl)0zos~Ov790kcJ~m^DBMnq#O&1d ziWefAO5zZHxOoewin8mnqILP^e8#+i=RM7U_?( zXWc7e5m2;l87_*fEanHhs+^A~7m+m%tyB{d+!I;p7-EIQTp=9Cgzo9o=49q3Uze}} z5x~AKiiFXq(>W|0nO?!;ZW&%qxJT{elE-^=eDQtUg+rl#)3yBrEt8rDrIH{Uu=ruO za}p{3l||sC#^bQK&X%Fr#(F?QO!<~I0F6=oX2yrxM}G6r*p-)#RDsz9qD8hR?K#Gz zGVQjhjx6BjVV@RUBx%QxR?Tc>8dd5Jvsa z=k)-0S1`DDDj%^|wSnLA7QA3m3D=M9p{@sg_i8<5ff<75^N_5|I0VF?%o~nK$<<=* zl5Z&pzlwOW)150a+Fhtm)@1J&s#5cai~QqR%Tpa%0>3ee|M5~a_uk?11isqG*zWSL zQcLC>kksPF0@>e*if*Fh(qc|7(9vk~@iw%T{PU2eYfxMLCQPRmzHp*O`sNoHX7=>NS@N_6S`%H?{s@Dgbe zb3~ct#Y7pe?G*u%F!n8W7UZcs?1U~!=#Qn65TII~B_rN5w%RotPlOIq3#JsrdD^OxU)2rFH<(%0px%!d>d{9S zNP|TA_KlFbhN2*!yRf3V(%yPl`0i~)Dl|O8${sJcM*!?aHy4w~=K3it7JIFK)^17? z4}hRY_?Ye@l})&ySwqnJMYf8$b&8em#)QK|6%#jHy1j=g z5`Z%#)O%XeM8%Yj4X`3DaoV!|_h{%K=oQ{TPy$*JM?s_kQXJVj%lYp} zQB~Ss#?FMI)JfU}L=f!+wD8fhwL-%frXQkTx{w!DuyUl#Zu&18_VRC3XMKUz4!^@3 z#Y!sH-pTt%3RiX8bd=ZcA-FFO6V{4}j~Bgd>YGm*b{-6AmH@{BhnrDL|9A|`4Dvx; zroxHq2<*r3I5ru~0;iE*`_acQ&slXT$lQJzdAJx{&;ld>k6Z2UuUasPbfLT$&omsKsj3ROfC4}(I9rT!@ zg1D+wU@K>vmjTl-UH@GwbJ?bW@l5_9*U8HdHY$o1jnwr`}X$B#H-Yi#YWtoXCHN*OciziY%yKn z^_{FkRFk7$t;{4KjtCPP{HyBC$NE$PcQRH44$7#Vb9- zrh-a;`vc5NbMXUgSbx>W<3-#W5QbTnw$ zSw_Q<=WgAZR-U#EYTIGk{>4@IO`s#Pp*yevSX8pjrF7toJT&xXaAaSgTP08;8OxBE zoc16A^EI?w>)Ae~{OjzdR63Bzvvm)Ac3*DQx7+;E#Q5+9f(H+WW%-*Mq#>baa2T~y z>P@2OqlTBqLn%pd$zXO!s5SOpE~-UCEkTk5>Yscps#mdA%$-XwtEzM|wP&hWIybfm zdXKR(nuM$SF51_%`PTWcTAGA23v4&Lyv*FE@x0r>j8p#Xm#&hwB!r~(z>5MtiqGfk z0sGrsS*8va+}!x)o~0gKNsEJPla@r&Wp(8@R?iFXQw0@vl(lS2zIbAnG~u_O0C>Gf zZ(1ZwlOosa`O*Py^3sWjGJ;0I5$PXrB~ZPGdA~{r zzgz0pGsvip(`t3v4~p{D3p>CWUvJ4&AEg(EdjRPNQp9Id9$6$E&e{p5vg8dE@02kZ zB_jAKFSA>i$EdgHB6Ng_dp91qA&41YmE!k!iGsH$|BBWK#f)$l5Vl|EGIHPP3J)jj!q7%co279S_9(f6fYyU~LFShF;DDZO?!oh8t}NTlWs9 z0Y#c3;edC<&`mG;(J<|Tq#V)A?uS<5x7IB&7mx+=^E{noR8Q_`p6-ob%u=tKJ<5PP zy}QajuAdC*c?krhp`nM+Hx^>I%3()L3jcuqm+f#2B@UAaM}rR+_*}wo{UO3tpz;lh znJ^$o;`!6w2H!2(mwp4r%`E`2@zWL7(aQV;v*wv0D{FIWOB9ZdyWV`=# z5zXIZgThW?*XnnQ^La@smqAjW;<|-lO^u%%@ySDPj)Ezyw$_01N@BXno%;}O8&qGm z-0)(_JzG>|kI)&;RQQ)^O|xZfv+oZd_h+)82OPKjh1$O@_Jru73_}*(Z4pA4Id2W^ zySs3R=QaA3%$_jq1CPX1j&@H44;s;z!-+P}LW;_d$^~rfpyc~;{jMXmrGLI}LQK&s ziRaIK?vM6CSS?2N#A%vdeY-%ODxhg~sUGe<~Yf9hsaB22L#vIC!Q>hwFuE z^J)#oHSz)3w$91HHblC<;_{5y-BW!slXvKzqZX$adH&7VH33wy@q}>j6k0G=gK(7W zw;+#fjAJPBugcQnA`4fl{?u*h`PG?V5;F!iIzl zt^SXdZ8h=%DO)LK!<~PJsUOIUU|5yXvgL5o9D~OsIGE#wU`x|x%uI~O-a$C=AAe1D zeYt#xH~0?Z&afnUJMvMKQGBIR8F4PBI={w;J;ZjA-7%RwmCOl|Ba2Bi_DF=Rm-z6P zSXMx{LDNz?)f@F(LYY@xynA^fJj8^~)Jbq0$th;a=vB{C-)pb*YAJqD?M7Ut^l!cM zk2i7>I>UwtsJ8BcJ{2O}ML|ut{T^y$aER>F%Y@3Q3+*59JCMoJb}WS7G1Q``{c4rd ziN5hX<^=_H5n=exy;|tOSxqZrI{I)3DiQ$$7(Kabx#o7@WV!n22gV6Fa4|jMf2^1b zxWA@LY8aj+1noC_v7s?WB=j*rb!Ki41v@vmn7X}~y64BQjwlGkjp33&{=WCT(MXwB z@+Lb)v431#p_7pKSr4-yFLDI*_gadq-&v5De0Im%k9<~uNNP3Ob4sD=E6e}+=+gk` z^hIBMMZ5+n><)8Ro6zD{GQa}cR*xNae?)ut;HmUS(n_vqy9=6lpE2~P43!gYr5*Z>gPnH^C>;F&S{yaN@d>89=NO?U-O_CIAEidP_uAc6jp-S#m`_M_{6XknNcrMrY}?(WUU zumda0x>ePHc4Y6f4=NQ|soW1(8^49rx8<-3Wjuw8lURuKD=j3AMc0SS{$OlCVmBF# zgaCJ*MO7lH2~rd$eTlG}4v+PE+ei5HsV7QM9`$L+nSyUqYNlvwo(BUlNKqwX+2N>a zAE$a>hTRyGvbN{q6>pa7dAr?0`*ivAmG9@HEU%Pu!)@7u4JbW#N6v_9k~23bv)3=V zt{~h|gpsS2i~vp3!4!JN31b^zq7?zzR0Cl$95x2Lh2|!*pf+RsMf8@1PzUkj7ahu- zcSNn*1Jh(utNuVnYtDlxD_efKDGTCNKu3m86$8SI{i-@bw< zg0TdT5LGeWJ#^x9!%>Nt$}IqK9k#6_!dT-T?m^5=5X7apM)>-&-td0ZsdE6&E3u{8 zN$km*oeq8WVZ>tL`BLl~_v96Y`I)k+Xa=ZcI!? zC8Z7I?8<8M$|c^ZmV6WdccAL5P#42E*T_GpsZerzf{Wh-E$n6~^3mUr7vz=A)nMxd z37uShLd1FI;X6+%a)E92Mfp^cLqDT4}2L-se3A-b2zHO{g_bAP2AM z9oFl8C?{ch0qQ-v4z_$(G@`*2@_a>b>zucq&K~jdvBO7Ji1m_+b;kO?Y<}uEr!?!TxmiRNAfL^}>`K(%h ze#!ih@BXXPl*POUej--Svqz7%bZU^A+gsJZTf9#-RMS~{UcfIJxqqyg`&GoN7T*=dbj|k*_r)RO6xvx}mx{Zx`j!VU4KY$!VXnf|hC%PS1_k{I(qLfZ z-O;{#pjJC8N_8`27@uPf58OUEA%UYuX%^;)RU56C+m&5U3FKKcdtI%jM)~a{s%Hjx zY!3KDehqLwhmw&|1|I*4>WS0qPEVKAK+^u4O$HD|-9fhz3~Tdouo><5-`qE!1v!VG zP%{A0_5;m;_8m;t_|T5$YB-m0T;DCyW-lD<22IvA`bERs2(f0#_rYFIeTzFxMJ55~ z%;{Ij1O(sGoqEWb^Q1u}SERTzr*^y*nID}+Gct@?z1}eTcNQ$6^UN0+73#fmD_=7B z8eYLLAqk!ndBbHVsJ+7A8R$vH*RR*iZ5sfcnIZCLI^$lpXCzXqeu?->`>YDnen0KG z0CmJW0{_w^dmG;Cs#xF4vH^C|Sk&5mBj5$?Z>dCco)7=ZwR`AW=+q80`z^_!^7E%34nrdk z0t=}2DA{VqzF$+L^v>E^Uz_BKRc=$$OL}ijW1zs)F6gUQhH-v&B_GkR=1aH{+s(V) zHi3J;HpEI$f6!DR{%zN5!d(L5*lPe(;?^CV*Z?QC`5Ls#qazymx_6(@+Ygk#D;jy` zVW00AWK*y!GB@CpXuCfYm6Lmb$`WsVYoJMT<(ZScOFxI1UxJ&qRW&p7`W2HzN+X4b z9^Q}boaN}82Jxh(s%~-X+*)T@ZDJqJs>BYaEEe zBqjO<|01Y3OWuQZ=+egkC(^=#w}S&iiZyNBEn22*YH z(C@Fk$ka(f6$WcneRcH$sKmSX@!!$tm*@r1<)=x6x8%3PbCta4HXhL;QNuDGT1`M@ z4i(z`Xp2E7UA5?6SAsg5oA+!bDRgZLTAe7@22#8x3FMJyn1nHLi4~DK0)K2Udde_q zcM1|=*8O0XdB8Y7>;y(rlBv6eG3W@kVr~`!gw@ccV^e1~K)?@S74#=UifX4((eUV! zIZgWgZ;5svYKpZQ5&aGht+V&c`tESNK!4;{SFktweZA&*tD%$&WnWLy$VkKpCQ7@B zG@Ze<09-msHUK~&#P*KF5Rm@S%iVUB9C~Cb%0WB^B0+JeD0Ya z>(qLW11%u$i~$sY7^8?R9F&4%DU>B9e!^!;K1FdAfO?)$#VStu&wn|^WH7zd1r?vg zF$P@_B-@!VM2V4mH1T%jvmbZYQgY6_7D%*xBw6r`eGV(nx7KaOw~14`J;+hhRz)8Q zOmvfHyDWeYlrz!bTsraDjX%i<;}~CDFCFK?SWs$FS!rXide60z3rj*L?8(5YvT-IF5(bsF_22u^w?Uz)`D@ zXgY=42A(i!(hr8NBZ=8NtKY{~MAW}SmrWsRsnN7!I^VJG2VI6XG)! z$4zW$_)28vc_LzLRrKhkYi=hB;%WFXf8<-Mytme3ECiOJizxV?EYPN28Yz*ps(15f zo3kPsjtdtmvoKaZX_S2`I3DFI<@) zbgYe<4iaf5PECzbxnxuq1sR0X1pUBd6Ola#%{1y&`{*_X=Jw ztsQT_kN^3>fct&ebB!_!T)nnR$3iWv(Gx&emsOlYszCK>u>oW%vjsZL@_^zZyPJi= z)_>tf&Vp>iFNKRu6zyem_P0Gr5bA0>_G>{soluT+|g!liVIRXp*R|TsDCP7 z*n)TYV#)TTR=G-0@>65z!hx||^$b^G_oLlvY;r(~t}qfO_Sk#}y`r%=^v$7Wv@~V4 zI0oe=ofNN{Yc`{<`R^b4cV2tagqPL`+l2b#Q$j%-GTUV6UCQ?`x{819#(51#FEcdH z9L?bYRTmf+sfgxT7aAxCl@!6Gh<`5WB!xu-EhyL}vJf`L5(6*6nQGv%qKU-X2R~?> zayWXI?gT+M?uU{`$iCs9%AO&3VV{*aL#CX6EdzjkzYiqjA9$Vt93RMYN3WYUGr}x@ zp%V~tKU7Br3zqAv5ft3dz<--jb0F?}4=Uo9jBje(Uy>TtVtVh;4`MGCnJA8RoIfg5 z8OQ0rF6tevcOERaMnlAZ({tm^AVX(D#WqsF^Z?}S%e?oAzvpC#6_ z^KlaOreAaR)7)i0NcPKwKL_db!u);5`R0wUB-$VwS4mV^JC{l{wST04_O$yZsq6UZ zJmL2*(Nd9~UZ3iBZ=I9pyw;JI*&#DNSyV|pzY%A%;$l(J(;WZBI6XIxa^L_++q6j(A1t-3pRsN8h^^~qY`@5lXl7`~tYOBE zt8BY`gRPe74|WTi12fxbx7Hilhx-N!GT)O~FnjOr3YXqJA8Vbf*Z72ohT*us@- z(YVj1u;ZXRwr=foo_)hIhs$RqRHJA05!2FQ97@Bpl{JtcWq*DDabk#&vNo*$w2mGp zpUV2P`tvZF)(wpQ9?L!rKR2QsLp`?C90g+-!JmhCSM_eaKMa=e^G$+38<-o)U;E_} zKf~Kc{#%2I-yp^`#`dZa6p~*XSs1>3Og7V^JSV|oo;^f!Ybt+59W_w6IwV1)h~lU| zIh$rB?3q7%b${s?{SVqIz82i4TXnt`Wht^QA(?KEJTD#lfG)W zzT3I1aCvtszV-k`+q_d%%a7nc)jneszXNtY_=i2vt$+JGGq)DpP78fY;onN%QsxSo z{md1@xPR`hffIQRFgUudIKwt`pVW8^=wXZ1s3LDBw#SkPMA-I?T3( z6?tOvoqr7~9jr*WZMKpcnc*ORnWE@{?V3;^Y{>s{9BS`3oqL^vn7crRg-h){ydUM5 zvfD&^Dn8|(RT(84M(C#&@WUJam_iRGwmVf~AOhg$It_{kL15z90z^}ls0BLJm8{vp zG37AF+;TtTT<1vosj;a4z(6Pt;;{*R7)KA9k$+u(Y-N6@@MY&1L}ohwMogbGZb<_xnR`}Ykv<8DN1&66>Y<&M;TG93e+M| zi0LBgvA+Qa(Zxe@iv&?{5zg}ynYU!?cA)R~O|j$uGFED9@u&C2XG}{4f6ypkKW=AC zfPXKwcB!-Rhj>RxRtP@-Lg4aCLrzQ3j-sK<@%Fpa*N5~Ed5qmSt_i_(p+z&8yH7mhPa z^#)LDA8?=u72(RJ^Bg&kCSAZpAIvBvlYjhTlCBAB?pEkz?CVkogD@(1%ukXoQ5(=% z9dmI0M58~`lFYKG{abZd4n{O&^8om3WFkIQ{Z0L7BfrKWsbR)it>bCI#s)K0(<2H& zhgy-VEBv!`=K`_7wn<1Rqjm4iG zM}MShH;S7UIiBUsYYZJhasLc1?tk`vMcc09==4xV+OeLsyIQf`Q^(QQv{i*{w4e_8 zU$&}T=g8Tts~vzzXUIMpF!W7-=-0aqcY5nKohp6b-qkLao+I;dG)tNxl2-aE|8pF>K(|2>ac;g@|JEfTu<&mG~Y@;F*M@Ap|t$skd)=zMZ& zA}pWY>eHVqUO<=nz^56 z(W`7QRkJ{ynS?RtEVcfM<$q^t9>D)#*cvfUqp876!~5q>B7RCF)$!m|?HZG-3qVhv z0Q^)4z|WUDz%_v84r824z+;HFBIlPxfYoLv64rn1KuZ1>o>qAc%H9T~wbPDT*UJzPdUMXpR?719LIC2&u%+;D0(f_0=1v8n3gu zTs!=z<4O0BtQQzeZ~@4AcS570ji7ejs=+RLfiI{m2c~CN$Nz@4HjlRho;Y4eK{z;O zT6s4Ds`?mS@3NNo9MF_HiyG3DS=124n5cO@HE065V|lRWbJ+ddurElNMJ;K})PCK= zofaLNqY!?}2FHP#M}NDr1g6cq?R;>irnh>G9n~>!xl`+q8^g2jj5mh?5flKb7r5yb zG*E79hHWt-#yyN}om&kJJo-&R>u1q94HuRZpdM6g#d01U!yI>EQbQQ{`FK8_M<>|; zj?whiEjq<>cykub#%JR*d~+5AbNvRmz3KXV9Gqi0G(KHlH-F{x_31d6VL2StxhcmA zdKsf=c6H?rHWi2z54@kNv1wX2wLBNWKKOZjY#Vuy435+(K=zy%Ah!YY*slZ7*u_ei zxz?QG#RS%B5!fvsoeFD@(-qbpP)+7vIhF<=r`A@3az+J+^bVqzht}rcEE${zsJJ*z zf`jN0zqmYz-hUhtg4~bZ9nwSxaxAb{kNq)tMkc3SsnbszsnaRgRrLCh=&l3$aR4Ov z0x;+0TZGR6?I&xxwBPUV!~0X@aGQ33gMApBmy{J+-`{ZA+$A7%7COoreyYq**!P^E zcBx6d{pMn{LOdeu_5u6tueNl-yCaMCQE9y}8tb5&xPODUP)lpMTah36ibY-b(7*AU zVPJgX%Ti6GC08#It`4f>?sy}ZOyw{TH99F-+ZJ8d-$@)(13Pq$9lxfHC=x`}C5{|> zRA|#+y!j1^M^}Df0-ZEJ(sD_=t=<_EIF53ZO~_6km3D)!{LE z(>j6iJAZhG#_pMK><*=~?CR7wR1<>h~R4@{W-EJQ=)G@k+YnouEthmx1~|c}Mp8(f1HWbwqKdJbwsHP z_%%q$(25eEVMs4Si53`yk0QO%*lUWEsq0lU1(F5nyP%hVoZ^e@nnZpDF>Eg%}yJv$BD%sfi|4Cd9@v zcQ(&MgwiULmwd_S^}%8Eum4s2uWa(KBY*V}pX(v~@9KZmj~_pN^sgf)?tCa*vE@qSm-*x)Rryb);Xr`9W^j466~?t6tyT(J%vq@Es{PiE-8-}RAvVLwaEX9vKi zC1vb=q03C=-)tX$)o~raN`SMjrsc8sjsMC7W_g-mN_Cer-FXE*O<*gPd3qX?Fge($ zzQy={gLBaRdKfIj(^@2rBm-av0DmdB)4B_Zj=$BOu0o;qV4mBoUee^9oLOXoatz0g zdK4+X3@Aom${v7}^7mgidsdW-?6ucK8mQmU-rR)LE!NkyGY{V0H+zhkdN(KbX$>}B z0h|hSvSh571!HPMc$rkr3t>&iK13ygH0WH$=qL0>YF0(PFMRP(DyEygTc??d3tNgh zxROgRTwNOoS-+|68&W&y4}WeR+G3-K&~IM2H&0=JY0TyBoP3n&2tUoL&#eBmSz%;q z4`DW}y+f)fLkSH47e8f(k*E?^rpA~y@v69Ly*E0U%x~=M;tBLK9+%xdV_nU8G+?|i ze|+5;1S$2da5Khc;Ud5psI^$r&cL&2!?RrW{Rc)_?o?m5I*X$irJ8wW+uFvyAp!`bx)MeV?7c#S+g6!Rk;r=w@Wv zT>0Uv)@Rzw0j5^dd8luYYexF1Mq|s`8e0}R38u`&{C7rIt*+l56nR1jAH}%gLO&CA z38YHj0RrP95%py7E)LX_!I|{^{528O*_mBt*!i%mjiiRRF@LGy3#f%$zzb+iNl(X{ zEyECR1<7rqHBwCt6sSOxbN2G~T6}=|xkkl-i{+i-Vif^7vZriK+nmAhuDS`(qo6Gu z2M*a5v#JykgF`-B@c4+tU-SUc#HwYCfsgZ+@#^YTg{Q*-SrIH_4a;}7oYE4wb9p^n z*ILObZ{LF{Wq%kYKrhMf(BkSt&>AQ(k7BEsK?Wfgnsp}xr9%(gB)gC^-;LrU-SS7q zQegs57%1q-W-t=5vx$VeNm+F1GvVG*0UY7@~gj)p*lzs+C{FLa>mkC>kBW{l-8aBffZV9u&&q}~F-&~q^U zLtDX~WuM*x-u@hYER=nIQDB=fHYj`nf4AG|X8h?zj1|u+WuM=Q=O-0*9&3zzh8aQM z8Wg#;iGTTtiU6*rq96VD0J9?je|jq#>HN1`p$cwMO75-U{o3UDO4rl>V`p4PfYkA` z9NLhy6p&EGFTX^&O4s2Zob~W|;9C_n2i=fvb36I?yef4}0<%bJNqpLm|df5d|wEzQDzV8>_1%Zdo=-lM&jd++uh z^_0j1LjH#gwJ4_CHRKS1LRcGU9o^V$X~eEwhn(&P{b}`4m$$?pjkq;PIBA=solp`9 zE`N}Pa|vcAzs%PgpcG++T0=(xu{k+#xN?2~%NPL(>{BH?wF9ycTGNq@Z9>b+B{m}x z9vKMagXHkGezr?m2-(eOE9{=}-FA~1>?-r)GMR^PfKdT>nC55U+iJ;r%SI;d=+dR# z#>R>`*7!bzD=!A@iMh!_m(~uhLfkl`yMNx!S-nFvAp#V7*Bq~j3A9%WffL52oX7o< zNlqF2>1xHj_@&l#_*cW#JYYh@^7eE+>J3LVsi&s6X@pcwg?qsFfY)g6LyX3Sx|Io> zD@=b7nsG&DeCyl8dv~rj`8Xl~0?yQPeYZbsWhvnF+=dzua#E)e?BHp(Bu~Tf2!Hfv z)V8}5Z0;VY`5|_(6A*x34gE#^c?5|$sT1gC`qFJx$LCgx9=dat*I+};y+QoRF!P6Ms=4T@I?#L8#CLyyUhuX z*DMqp74ESSbX#EfL~Fo|DSx_-0Ar(}Tk28AaB)~+Ys8xVPrQmc!p-O2L@(P z(@1&avUkgmEVJ=vo@9fby3q@6^_IObmL%d=8JcV3OOhonh$`&*FN^5~dRK@q;<6DH zf2O9qC%K(@G;_4ncy1}InWV6$pVdrKSaUuRQ)$|r*_PL0Ps7HxD}Pqx#v@Q@T2^ZL zYo{=+;P&wAnQ{IU%}fzq22IY$8;^?Mo6!8ED1<9In~69j+>?0`{icUF;|72knwhV4 z%scmOjaAj$eXYNlt9UY)OQRe$w}jL@n(ML6?@tlb8nl}@_&HqjUWxpz6Ffty$QwAA z$!IsC%gC}FuE9W#K7ZlSt25ic)LQsYjf8SCm`307!5pA~L=se1#wsvEIEC;&9Uu_= za*-{_b;D*nbC1?OfIh#+lMAjzalA^a2t%Vp3ey`-E#85pm3%}L9atsVfmDVa*e?z? zZrP7M-O7o&^uje8~i> zgVeR{I0!9%Vj;HiafOXLyq^0de&yt3!2ly49IEXX;UZuB%p%)`xw`uFdF6^|20EU*4MT6HT%^Y`XRdA6wo9wFa^O_?WgN1_ z@YKIB5O8NOCVOeX=Xj;Q$pEomUA=^V9fZt~KRbF7ThU^%h7Mx%D==FO#>U$b;LM1Mpw6Nkrm#ErFZ6&GC5drN=FtMoS1iD>JdX}0XA;n7KA_LqfS$p9hAt;_ zlhZcAO@Xk+cE^6Z7S?A?Sf8ziwdvtZgOZ8Ckbas@OX`$*Y%IXfe7$IVtxv~(bmpH9 z1F?N*&3~=Ufmxd~TAQ;b#t*)Y#`g-=nE|7onB$iB2-; zOw``ppBrKGI}|p5XWHVIcas5B{tn;L2txc}sUY%EjBxvXSMyKrKI^mc-k3;Tes{#f z_vj?nY~K>D&hP#H`wkidiKg#JYSn}HFqwB~rGKZF;2?S*?pqS-J-m3Yuu+61S_#e@ zaeFgv>TAFM2et}L9Z;xMJ2)aK8}t4iAwtu0krsS7qVKH{eHSD84lll2eT?ju9KgOu z1r4a#BLMUmT85go+Y`s(p%vLl>;Pq7d^gE;Phz=G--Y~}L3k3kMtl;BA;bH9S{6t6 zeSdFzh5qWylW<1AqKTmL=Vv2IHc>QU9&w}(Jl$A>d)yf^k2Q}Dm>0s!L@!pe>L_r! zv;F8`#r{_BVOM0VX>)72_I_iYXE8!wRQMZP{?|(H`S)yKs<-{G)z9twU#sgk{;ySQ z)qbtSs=@nx{Kss5p3dLf_A6lUp0>Z6mVbKhpMak@lRt3+R(5UXTa1$W6t0o&0sDDg`XwjbGoRD_h zkEY{&&xmE;&>r;5a9E02D_w)dj(37f+-Mev2Yy_1ETFc2F(}sU%oH z)La)R5z?9EbzCU4*anrOs`o8bt$)w){wlKCAY4awA)b|_w!00RboJk3QBc-HtcVj{ znB}@X8FYiRW2a?CX0}=mgB2Bm1y~M`6U#Y7+g=vM<$$scmh?0V)E@xL8Gt=_--R=7=I&D=}&-0 zC-%}HosU-bp~|rASEPfTc!gJJTI=qe!hZ#@S@BXg*6|4max-mhD*Oxt@vd#no}<+R z1Bf-Dq`OAdZJf;#wvVz(GgkW=t0OZcm`m!0gNn%4oFUTxK--HrLzdW+3QK4s*v`@S zA`VCoajA{q!dMxl6V(f06@N%6i|dM;z+6nIwzAP7nhFNgeSJYK?DN8#YII4{2!~1z zJ2ZC(eDa00o{`fr&@O%6v?zE5oeFYmD6~+JXAVXv87ywT`txj9xz2H)Eq-a~qh#Eq}VT&TL%@9<4gG zs~9}j-`ie`%4@B$Z5vG*64R!I7aAd#;O24V*;2jJMl9@-_A6S{N0(m#>*@?q4ZS6; z^}}hYgYvPyGM%=|%5T#mo`;v(tbq#!h|QO@g_bHlJjDFkJWQb=C^gU{Z-lT~a=e_; zzFIv8``jA8K6I|6Ie!^kZtuOGSiHdxcI5Gfev&Q$dzJJbVILaGp%v5A(OP19M9EF* z24kQgclC8TJLX^R$hv0#teS>ThBH(m~1W-GmK`byx0enr88A795UxRqOI>x_=&=me_X$s{Fm;P7uB_ z)6e?bqkG$%+d~F|0cFKU7ERBrO%9znm0e-ZXnqX{;@6Z1A#_ZoZ;&hp(Yoj4B?S`rQ=K<+v1vI+rl}uIhRHATo(3RDj&-k zgo&pA%|mWD|49qj5r#3>`?mR+BzwLV&6~P5ypfPQ&XpU*&{UM*pRux}Ii!kRG3n(q=vwsV3%U-zsdJ$cC`!#{z&B0<6 z3vyW0JzTWlxCj%|WApQ<42Y1g?c~TL7z2Ts9Wl9J`uJveSJCZlXgxKj z6?@VM!xTlIlF#8O6NL%v5JDWs9m{t5Z!DX#GJmSUBD#o5BP0MAMW@T@q1r&)FcU%Dn%&%NS?fd@86F}+SUes4t1 z9w{Fd;2JoiL{Xr>&%8noyZ|maEzDDGoOr*e|`QJ)`FrgSucB znzUf|k2x^Q$e;_$UlT0k#yt-AH5!E&34b+eC8G(D@|&K-l(_r-n`hzcl%p{AdO;&p zV@%Ls6wWK>`;zIdSQ0tbiFyVeurg_i^_rNY)V8ZR4KWzD7p%xfZGR|M zGfs^~t!CNBl@okWBz|Wgs%?t>gFv*N;QgXZn29RGyQ9fEMTjt_nBwPJ&x*P#E6=t4 z-a`XE&mb1q$kTY5zAol55~n88AlcyxQ|UF~^eWr+JTWizZzH?HouG?sl*FaBK{bKM z*ud7x{e5WZcFe3rfp3V0-DtATHh*OYp&w{0WM}v&rvj&;E2cj_*IJrQgpZ zOqa0nuC} zS&XAf{dcbaW+_^D=j1n)pu^9TLkw?homOJ&yl!PYn!}}_#afYyO8utUu(P#B_k-lP7mD=O#(gHTG z8GXlpJq+U+rZgI0fDeFLa9Ok0K1Km`Fx=d^AJr|<7^*qzThRz%UtTjbH=xROrf+fR zk`98aQ^Oa~oC^!W{D%I`i+`^>^p?EoRJk=Ac3v6pYaMnpjuJfRLsN%lDk?52Tk+C^ z9t$QMr)GcBr1|Gx?olv~#)`)ASIvciS8+JUzgl<*a~19cG5hS5HqMJ4U?zDL&$zxl zaz%zqY+8wDPfFca~gU#mVvDZB_=)E}VQHBWx2dCn=p zGhA%&gZeft_ohcWb{rIYzf~+>xgU}fg%LNtn#ihQ3<$~e#tHv4!_6bQ_>YfhTv{e8 z0S^91Bz&p^*CI3(>VI|;1$R)U zAL;-8NIMl7hk@btT{SHR_tastpA@-C9g~R`Q7u;8bAQ|Dii9X`i$&^JSD2ANVa86Y z3vf`ITHapx^={qW#!FI633y135|}L&=IHY!`%aaBsH&{?NGhNeP*o13xV{hl4~eYg z_o!(^tzcvdENeB9RZuj}x=5KTLMS73Fhi6V$Q1#MGDn9WKvSis$eh{fTf;CBT*~`K zd^Inn5`S3qLt1MZfe2Pm*<8Csi=(oF)Bjo$T+n)=rPEO(O-vh z>r?QI7Lttx7MKbFzm4K?iGs&iae6}7yYslLihukf#FT-HGAtyG_MhF(u6|?)JH4;n z8@abT>SL}?*4`+ixmWsK(dYr=F$&XvM2H#&i28h}32koL)QQlx$t(uI^tS%)04R^H z@Dq)LP_e0#Yv4peDF{ki&Hqm6rlZzJTJPd=^^|dgY;02Igs$N>(hDjKP=H-76uv;0 z;(yDI@#BbU%q?uJN`7j-wP$?rt@P+|0OZ}Rd&Ap1x7A%0d(yIpe#An631RnUwTrS@ zZChKt{{*>2Q1E1j^QgGsPKt0Kx~JfNgBE`}c4B`q~$B^B2C1INjG-`V1ZUi@tf zt47(HQRL~IQ-tstY4C*3N-w_*3{k3lC^rZoPqy;uPJq=oLSu{^dABXhU zM#@@1HDo<#6Hp-yf#h8lea&$kmW0lTgob}*V@LqXpdg15NDs#kaYLZqY5SLKl7EG; zok@?vKzde-46I}C7iOWwn>8k*I>1^Y1W%^?s)aNh`$^RJ{Lr`PcxaNoWSR*p3=`Jm zzA)93`_&M*sB^rdgM$*Wkjv!`$HLJr!hC?S<^gV{ywb_8faKd}Ix2RVWc85y6? z#b_0&;BT4TOjI72R7SpSn&Wx3Fe0@^X}W;fR;9Vuv}u%<+8cz)xTRgjR4yY$U&b|5 zoogr;@!X>)9egbkh8APaucfgBmAD2DG!DuE!=xr`R^}{c#)9H#*bw=Y27jfTw>Ct= z>Qt%#n>IWD*kp%x6zo+X(@bcx@MEm%GTt@H;kW!#zvN$<9^)U+P8O7G^)%+7n5H-@ z;{u27Rem|W$m_~0!YFC_(NL`B*P(vmL&DFG;;;1)n{k?g!x%2Xxh!)TSWPE2#r%Jp z*Tu|KdV7)0_Rcv}+gqe6&40+}^nfA6;gc^(xgVdsiSgD1-n)R4yHsBfuZ5Ytq9xgY zBwokW(Y&YNDp^X1f0PjaR(3*M_V=@wK9Ekhhqi`yS6%(B_3E6K*ACG{U8}$HQ$uXo zo#5BxW8^Va?WfU$&MFK?IAoh&PfsY^mfhiHn0GK1|NXE}U3~p%5wRVTO?kDZ-%(dKmZ-3vZ#i zx)=6tRkwO?dbco0aZ=p6rH1#>bfLNx^`1hh_X&*P7Jg!)QGY)5^7s$S%H4&q=jDIeVw{Wxgd(fyX+D&K?!U1c3 zm>aI6y^3r-#hGkF-b3?o~$gKm@-AJDWEqf;x@2`TNfr&F?e8ag>{$t}r z^RSWn-#6aJIc#)owC~frs|K6#V4a9z582ux(3yueRb>a5x&c;pfHac!05Pu?IL@hFdp(;WUn%|ls z(FLJrVpT*r#-f!$W2@#40$TXrji{ggt%&+CJAnw_2^FE8rr9_MJH4jAC20z%JcjF3 z2LSdXEv~Fc8^JaBe*f)*$9rFXy4@eu*Uj7IfbE&58y%=;P?=gxBa1lq;w~_bFfPn| z%75PUfaG;fvDR(DVI$Fynp_n%_3v-xYxi(!s+zrAckX3Zjkawa1S^Mx-2>P0C@ug_ zT=uxgPY7a4j74fc^_5s7)>+Z6SjSbZ%SNp)dMY)+oOG^@f<*1EMW_3+Gf-)|aec+B zt3hQF!l`S%@!`=`V-TnxkFnXz%8CO<`hR+4EB9?`Rzvf4sHk>|0xDYcoZVvypnI;UYq zy)>E_hrjjLF7u;7f8Np9CApn{G_LK+W^eIP(%^%&k@&y_1(4{2Pt~`i{2YWIs*UM< zKEPi(%yG_F?(BGsh3z4ky{0bhtGBd$b8~s*VXwEuXhLGa9yJK8cw+%aZhv<=`{w&z zUwW@-xY^8{Ump9opfI*%Bc*Nr$f64a4X2XtvR^3o1yaD@(8db2qbbcD*{A5+ObQ8^ zsj76YJLOq0y(0aOwp8^(uCr^3j;a)~QO;o9oW9YF5OiuBMGImQu0cmBHVShKHO$B$3@W&wL zE{o7*K!i3~dmT?2;TD?V84R>HhdWya3jOH6Q}u;I7f=TKul;`3@4rPQsQCl{sr2MY zZK)?O=JcmGCuw)D6~&pKI5Ru6Ml#Tml3j<7S3Qa>#jP{E>)u)+#eWk zs#fnyP3sjr&lrP9@qe(C7Auou3-Tf{?kV)w{7>lLa z_vSLO0`xQ#DaG{W4xeNy8|1K6P&7n=-MM>nZ0#ah*^XPC7-MInb{5IX67b{gurY+4AAg@y-GFKV;G^(S5}WZu z<0|k6#m=TC)>wVLR|;Jnv?tJe?^`mT$8dwQ_np9gK~q*q5fff&Roe`2nu9z~HK%L^ zmBw=L#o&9U9s&vbFusa1>$@_@`Yt^S_hUsKP8hIZyShTl4g<7G#HEQ`Gc9GB7-{_D zk#;yzd4uPpG=Kj0z)^J04(8@{RcOCvQx&dw4;GzHYC(wJ!+tvkDQOIs^36=p6Gr=< zT^Hl%fxts+)~8Lxn$js7=*Bi@b!W8c(CX&!-ks6Tri>^hx3oToZ!iU{&lp=05BcH> zr8nlL$XYi=@xSq=C|2JTS@%uxu!(hOc4n$;!||`hz<>Fyb50sFw@QeWG^#37CQV<` z^@|Ab*Lq-@SD0bW+E@8kQXYxcR1!7(ZpXQnfh0OwM{Xn$YC#CRCFfX3IfwCtnJiGg zu>fE#x|R{zqV-#7()a?JUMa&kGOW}^rwAec8G*z2NYww4oT*dtkgpbdH3SeCZlt)n zLZ_+)9Djj#xI%Ef!DN+-vvS&UPRTWYe~Mf`5*#_MWZA5zbn~b1r@Xpy*%Ys?9#@k= z7pPd^gPY?5H%hC?Kn;@UF*NXAT^QJvUj%n^ZFZgQ^q z-G7xB=C~Wf93zHlH3=AIAu-H?Fw8Ct`05Ha-DGg_1K=^Ze+F#rnk(^4dktHN#%jiJ ztkGte);$)H{OIT<>DJ?D%R-!@<;JgDTCj3j}%c79y zsx4*CFWFQS)oY=q-V?6VG&NH(8!3C`8dp% zYEbAQ2?aRX?KlC=5RH4Jo8FuMi`<-(P&T&lXUVRGf|W-nU&f43!Zu)m6>m0+3Wjw8Es zRl)LXz22t@mdD)-4m7oQ>?wSMb}kCKfyg>I8OKd5w)4jx$Sv?G{(mflT(<)ed_XKo zXJD*Ccoh1Mz!e_xm6NP6I4+$Dg8^)WHJ5%{*fk}>)w<mi!dAb*Ezl7OOTn z_q`zCHAQ`!_DGQnx}>nIfTbm_VB+L8kn)Kh(IU1^{WhFt-hW@ub*#+oFpV~K&`XY* zc^gXZ%97jLI-cg{U4DSg#}7NBP5lbE1^sTgt!r%$@9AoHNB2xU428mvTbp-o>zb_S z<_e_I(oNmo9Bu2`JDb~^cki0cD3Pq`kL3TlOAnROMi9y&VOhKRS^VO^CrbVw6mGACEH{BD@r*6d`cd!1sNNo-;BZYC;1>~p7K%Sl-r0j zGJNJ_;2r7Kd5OvcZ?XfIN%;_P=-ITGm*|Q}jHvZBv_GM8 z!Lgr*@2nFNP4A>fn=-3h4 zAgm${4>{9Ylb>#Ws^6zgg065*$z?;y23;@xcz>{lV01)Zkv2Ew}{}1ov4%Tq5VLkh)T2-%3wS?g;?a|a3 z{zyg$e`u`pxITn?c7s5qBR~)gZJG-{DG?OaWy!>vhmljpq;Sc%kU5SLVaXtz1USb9 zQZx+#miN+=nPeQQAW__z}ROKLeRKxD&P#I{W# z8eVQ~I}I@xm$ls&$i%nY64RSJrPaeFrKo=H1|)v(SUE$PZip198NSh@FbtbJ-XYl^ zooL;&$U>q&iprodMnyFB-2P%R0jiR2Q%@BvS=6SqIY)WknzLFUx%X9khLXkcp`U1? zX_Ct%bu7}j`CPUXZ{}{>My7sVbvm`5XMk4lC#H-w)?x4uk6FVWIS_)P9cx}ExRY?h zI27Od<SEUHK4hjK6-igch`8jK#i0C6JZMJ>{}5`7*tNd)Ns~0yXAn8OtPI z>M>ApHj~Y@GFKF5ZIh;9ig?`j9wmhSIGb?jB*o`yDjBUUtK+X%*90RZ>(9pHggm?N zJYL^DX5!_Jy*|52kauS^bZ3n^DWh*SL(-GjNN2GMS6KOPP}t1v&0*)UQ-EBQfM-oU zj5W29Y_$q^#>hQd+bEg40ox!6q=E%f&uyyx7?zWqKI>gl7lR9R9qgQ^EeM_1#cO%6 z|L9v#2Eze6`a~r3Wx*4eWrN`cCTx;@nQaV1r+QaexEHRx^>inFDlKway;i!GSv)Ik z6n?Rrl*sVe=${|Q4AD;h_LtpAX8`phJoGs!PW?@K4Rh8jCXFf34D@IJuO!2=E6GZk zcpTGp8T|XidxBS{Um+b5Ok_GLt14P$sZB)hK2$Ent!`H*djEAHs_?0B9o0CE>T{@N zXU*?#(?_#L;hp7p<2Gx*E**i_-+?Y$&-TOh=m{b)iziC67uf~tm<*46F@t;=N9p=K zI96StZz$*kmZOp$Ja7*1=Zf~T>9y($W^YhTl#7dDL6e7r97R3<*creNlW0!EMGejj zOY9aA`k8k>t5jQd)idW+!I5V!;h3;$=5@zjlWXQbnAhX|q>QKW1g~f3m-b{Fp!6Nl zJz3H1DU7(@D;E{*9OBiSi`oDw$+n|#K@H5FJx~0^-B8I}0y3KFQYBI^Cwr$H`NNHj z27p@|k;-HIf|nOzS@*YChOuNlm1Mks%;YzZ2z5XkT0&cCZc0Otc^cTmgCkM3vK-5o^HXI$FD(CO^1(puY2Gd1K-y_-qhiAJ8ia5`c}>Oe zFUWH-GVSV)6jv+TJFnhTlCzbz* zNQSJ$0ug!Le(YW8ymXfnVv@;v2RWUUyP_TQ#X<|$T?a@+81Zc`%tvc9jq1KT(ayJQ zDQwZcx{HR}#9#5f+H+bEB0Qt{XD3h!$R336xq30ccVltc=u*zJG7R-8{@=Uv5#a2u z!BomYa#rVv8(5>YRb$@qq`Iw~wD-Gj<6g8r@W=gdm;&)nFii|7d*Xe9nHxT#Pzkc* zgd7iHN(3WH*qgtT_!(1w_r2N&1^ZqjTF*$yVyu4?nriz*TZ=T^#qT}oD};jFr%@?;zt{-!jyN4bePZpaC@~ zn9gGvRij_;ItjA*Pd$GEkx{>rgsW>k6h)ryV>)ELIK7!7WO zdrG(|X-2`}o5=b-0?{h2MA&Uy^TVA?D3dI2QTS?M+5L4TAb91-XvexBenSxSNrg@X zhyK^D2yWW_(Nu|V9H30Yme|Jej9ACjIPH1nOke=SLf@yC)PTuUcfZy{^%}FU!E0!Q zr+fvIn*SSOAE!O(ga}Os3=pv$wE2^FK3goff`4+z=cZf8b@2E2gHGi$eRD3R3CGLP zhf1IiFl)(AzNx|{$390S#eRQFiJADmiW!3Skp!%7&bj|K} zrddr7z_WWj+DYtV_#9ouo5;6lW&iO>VI{wmw88xr z6ZLgeZp6{p+#|KWV^0N!xtB@bF#V}kT-k(EJ&-%Pm!?EP`z_QBSB0ggUh8incX^y#4s?+h? zkmSM7{Zv&)eI_jXO;Y7oR~}y0fq*F(T;p(h@&77D{-MDE*3GP5?R&es+aZnH^jo)| zhqH$hEAhCL#DtTLIk(;q#9rU~0n7%2zD3&tN=+mrM6e}0&0jA7FPsr85I9g*zaR#V zZKh~K&{pmrmJ1QZX6|^KL%Ha*h~-_#X>GrET;2p}xRV?UNLAdxmB6kHkF0tAB8baY zX)Un`ZjPk_=_=#V5O|lFVoY#tcKZg^kqfnmwG`oEi<9tBz;gR6Kje0yf_oFd+tcBJ zWgv0bn5d?s?)j~xovKf<>h)Q^)dm&m zp5s#BW_CB+c1UKd%nYB=z#Ah&P0lgA&5S@A!cinUjumc^t}XX0uNC9ialYHf@*VN( zk=e25&%lTn?$nij5MeV$%Vc7mI)qDSpU@b1f>^3($MkW7IC%sdyVG1*oJ{&(TrJUm7JnF zBEh?&#=4nUnHAAlOn*L3jekl-b!K!5u%OY!snZHEY&~+AUccaF$d}E0YzR0bAI!lp zH+6tCvDf3Zl_`M4Yjywl??0mLYPk^Vor(bJOwlFNTgFt-f=AoQ!H0UwAGgYGVt_tS zHtQJ-!;Gf^u-+uvRn2BJpwFC9Kj2={18A0pV<1>LAI=PAGKt;)=1$#eCrtv*pf1gM zyV`W^`>FR%$NqssXQv|6!kflU{OBXURpG-nvsNVY%QL{XGKp< z&WLhz@AItU|NDix>}LFpeZaohPS5q9EsAdG#^v9&##b&n+dM}*m(eY03pmzM0cnQd zLl^UDvSZiB27kIog13Bhg28glN%VYXk{ZI_KD+IDshX&Ttm5iQ{%59p`s@Zk<{$L1 zG@RSC(};bhWKz5RFmnFR4sMwSPe1cUWn*2aMckE?Uan2W03XeOfi68ni{RrNoZF*C zz%w1g*mfRUZRzRL9*I|60u3Ro7^h4#5+t(4>`FCh<5X6k?mhu=WYs<)JE6XA1*H172i(?M6WvZsSueF<#f z9J6j;BGLD+aQ%1n=@<-HQ!?H^+A1aHJG9JduDArFzHQ*RDF?3M$c9lMX`gWyoMxm> z>l|;mZ%qJp{{pTI18I-&oP9P=qQ2ZQd7aAvC3gr?96KY3nK)R;@5dhC6e%mMHj$oQ z%A-aSpz8>A!{lgzoS|?rp5&Kn2#FfD7seWDO)R}t$N|?mD z0n`P8O5D8sX~ushecVyNyZWpL%T}R)lX}YiER$oY-qLx1noDv3mQf_BJc(acc9f#Z zNnic2U^S}>xeL@-2L14D>lmdUVfA75sB`;YiKKSbO7U*})9&8Yn^}%y+#AahOiZb2 z-AZ8*#4^bA_iN@$cae@wWPUrNYvhq}i{K=h3!ds3F!pkXr9v{``8FbRvm;r(z*H_B zE7pVEqeS_y!AiXZu^vlYOqhYZcCSHPg~%9l>AQhVZhrx#H5g>VS?5R?={L3aY|PQu zn-U7}=QaK_!M0@O<>1*6ov1`j=t2FcVJ#k}eJl%*$Bh^frE`pA-&KE{M7_N!b}`Mb5s2d(D%u~(SsRdE>B7Sxc`sz%FY7>OvnWXSyL^rj?8ck@Y=PH z+P*Anyi-44zvn$E4-vX*?Y>#TD2SmZenq#E-ZZjli#>R3^2J_f3RzaRmNMm}>ltRV z%~?5>R8o*OvaROk1b}p`O=?|}{W+h47=xz7y7b$>>4_*SY~vY+xT{N0bmHn!`ehTW zC9$4AKLi4FM(9+hEN^&`6YpP_lqc0Q+V>X|*%;=TJv%Sh96ucD=%|Qhwx5P6Eb*J= znn%ABWT~4&rzXE|VBNh>TU)Pl>vo@`|0ZebG&~pCE3;7iG=$2ziD=+o4r8n4#XRnI zjbF0+k50&zmrYJOjA)cMW7Pu@k;Wzv7;e*)m6r`9Up_dr(e0X*&%EP~u+mYozlBT+ z%b?v7526`s$#G!l>DZX1bnRA(y6?zNWOHO=S7~upEu(alXZpKT9$!#~k@-7kgjXnG zU}E#2o|htVe>|{G3puzfhIH@Yh-Z5n;pbbi$A}liamx}S@gEen9(LxHLv|7?_!bRM zj|~=Rc!#irEWS?dl;Ad72bbT_Od-~7OJyT!=gp+ERl7h>9C1jAA|V8s9xAb*kf}}T z8&HsLok&TT5IRWljJ>qcO7unho{2^b20KV~7;sLJe@Qzk7wUhK|3YZZxq)*LDLynE zyRER<%Q)VidG1Is&t&tS>DFQ+h6$4}%2^FG9fn|+FmivRF#MgWAP?ouM3J!>1@3}$ znH<uT$%`G6Tg^}zmsJ;+$IN|>7Dl}$vg2+EtO^@1+uWbRs3UI z{pw@GCHyecNI@zv8oSXCHO1ET6?tYo^^_<6jqxaH_@R5sAbFwEoJ2C?W4%=8=sE%~ zQgOte%U=QQYuv&)SXBneacrQ;n!13)hKR6Vd&m^V(9EG}>eOSe_xF= z1m)zk3S3M|P+%g3_j>;0`qc&`tMAST2QbnT$W#87!sBd3DP;3JVX!ifwNwl!&XSWP!I4YYuj>@sF%ecU+&zS0INzr<^C_#!2oD=I!7&un1uTa+*Doydji2yHSy6v5#WEs_NX=oT--VM(T@w`#29wqaN*udL;?V_pChSbIm@_dmyXI?(6^Ix-Z zLM%N@`;#tnu<*v!hlEGfX(PbgSQhZ&9;?gHx@ZD}2l_-pbna8nY7G@MU z&{w>=SBa4}bX0kXg!~oD+PSNBz641D!qPwi&G$6-fO{i|_?UxCL za1{OY$r*Qq+|MoX>{h`H#37kTQ6X;fvKPN#khYe|6Lyr(yx;QHr8ZCG%5;gJaRQ zIoQAGHxlqZ+!fx>yM=yoof703yeiT_=XMpq=4dLc)SnFd@ZMdA?1LQQJ@nFUD~&p2 zipI!nB>(=yOmxCilvw4NZNLC+dA?Y%4n%l9ZQ>6WB(2~t?LO*6>LL>0vOCisy^Kt7 zSD#F|_j3*FIXHkyX61RUH8rug1KL3mn#;mngn5f0o0vY8n;X zYJ1xZY%X$sq9j`6MzZK`o$WgJVp|4vCyxlb5Ys}@D*f6bJT3yg^{oZ7y6A1jG&Q0F z6WD`gO9I&IUo6EU7t?WAN&z<1Lv<=t4W^nO8tGkG*s0OCrR!fM4Ht$h$pX7vF*Iuee9cU6DeV}yGV;Qh~?8LeCr2NYEL4JsI$#u-zRsEZa zKmax_pmj%SI^IQm@?sIY15J?8MlkWrQYW}Q(oMc1pk<9cqksqFQ;vSA`~%N^m)O17 zE@1I5Cc<~HuV5YP9t3&bg_F!``ow?FIg8CWLOUzIJR(kDFg7t?m7_IK27;)=T8$2% z0DB-EH#Mz|JX{JS|G&CXV?98g(-I5$DpMA<4}%1wN$Wts8IvZb2pjdyl$Pc804{$N z8<}Z1`kr*~Z@3@Zn{XUKqTxEcuUq)D1r}G|sQEl=lvdUFD%N~q1|^&%ZtVn$V$#f~ zqmL;E+^xHWB-UGNL;V@!s{P{BTzcvE+A$Cusa%UIkxq@vJn2y9xXB8}sp7~F5L@>r zdNP$;I6Nl8s_Z1tfEzBM%9e!Gv`1h-UvC@l((JYp9qH$bCmpE5 z5Hlb>$Fy4IuwU!2?_e?t`-gxgI%djzzS8Q+)&%oUd1lG9>~WmGT7Ug;i1foX>xsg? z`J2e6F~=-o64?_iZbe9{3B~&j2mIg{^3PkYSX@OvqoT?u8$**K*nz^dii^C^zm6ll zU$MY!{jC{h%r~2AC-=;IV01uIHW27LSMo>oUGRr{7*hfEwQT9Br^NEfGk^s0(oP`! zU+d`_b?**>$0WLosDNQFrJpg7n?K_RVgQ+Ht=Cu8yP-)_bM;eeou~K^%BTbgM znLX%QmD(FDOCK@I-9>z1WkUq~21L}7<@cmx0pCRx(RGaY*p<-yUtHX3KhWyYlc?fw zu_@zxfAiQ6kMgR zCk^siD{dDi>zgxNI0FLV&d%Qk-mV&|6TFdQun%CbGq`uW@_g);kMK}QIqS$$m4vim z>0vO+o4-AorJQwQ!}z|gxkP-01&WiQyZ;obo+`+iu1i<_?u$1FERvSr@2bg_Z}h~K zD0|8u<3)qYjRu-or_q?VZKsoTfZEwDHeiwlv%(IXii?EtOx4x%<09Q)nUFE9<5rJi zh__V~&3}DxZP4Y%GXI1;P#sbxMSXWtF}I6O6EABgZdB z!2*LXGQtn7Wh{(qlM{{#AID6f!LIifJuJ=`RwxQ8`fL~^GXVl&H)t*5h`JI`7mJnagr9Wk`hVe-?L>Bzo1{ivdNg&RzpB0+RP5MA+xo#1kxi+ zT4o#g>Y!$aE(SxzhJbgawky)eW6wCXR;Z-vvzeWxB$r%}AdIFQpjVXEZ82jm_?cPp zW3=niU=8;S6lKtSvivEs6EHzffCi%zVj~5-se&;;NK{Q4i=&apC=ijs1ou^* zaU!5Ei;T(!$|BPfuc9#)hwnxZ7tJc{pf7aq_mA%xBp6Y{!#Q!MIXiyr93WrVXR%h@v6Y3dn8%?bWBE5 zN&2irv-6HJ7XJ-m;m4-0*<)z4qAB$IE zM+Q42mbk%`EDshdG%hN;Zhg5?pNdR*5SG3;ji#{V$qG#h7lQ5}f^#H4jHy>{2oJx zcXu@HKhTY%i9`34qFWH$W3%wus1h)Oy+s>Lls*q8l6GOsxj{Y0Qyg2cE}TqvXyR8P zdo&HSp0g5eVrJ5gvdBv3JWF%D5z_&jD~n>m#yO=DfO~gG9|i;OSxiy{YB}y~mmKc@f5kHU>(8Pvs>lw5rGG0rZB8b(HD{VE`y@1F>RG z1~LCzXSACdnoG}n)Qy4AdtECpCCDVjMA-wjx%$t>jQ}-tvo>Yq2oSzcKRQOoHb`;v z2_62#)aHx5X5_?_S&tn|Q0xRSTUYs4ySc3(X)DC5mg;x6oX&G&rleWFTt2_e=S45%JqS|za3^C5ehZ~cot zaX!W{nut0Ie1%`t)KCCvF6Y4F*cY>VWSzoo$6`kt+pH0@S@W_pTLF3n{vG6N2nl&I zezV(<1^G^Nre{5KfRVIeAFm%(4!Uc0e@x05-jU-WzTPbBoE06L;N|Ja|DaS)Z~iac zmpjXDbrZpVA>kdE7QVowJJ-<&XFM|v4Z$RO$?%rD+$ut(sY}7bmtQ7 zsT66ZwD#2a9`rd%2*^XU(JV_2;{Rgn6xvT6qgQBYh`I7r77s&E_MJ9$utSmWx%9Os<;9Cze;r>y0+c_?Ino zyi_iTD;zko?mH=9)+bP+^h5=|W0ikobH0!WCMY}=E5h8AM^NeMgr0`+c^LLPCo!ZQ zPE!M4Ldp(fq<#b;XmJUO6hjza`)ef{x*4WAl&5~`&!6FHoxMIwWl)7hvI!X61~dRt z!ZEnOJ_KU{Of<;25wO-&0M&Tw`?q+veKbw6jw#Tz#AMGYcoRCM7S14oqeVPG%J(6f zJfaEiW$VrkH*jg5uzgrNXtX~!r4Kf$gS^7GOw6Lua7_~3H~9sv@vI?4Y4%h>T`pX&MHYiUy-O>hh-|avcR7Kt%XsZkJ`^v0{vA zc@6aBYWszrNx-l%B2;F#EoU)0w_eV+z^UKhIZ_iX$9)}*VEX4@)Oa;vI+FJiEUP8Pn5`is8)1Yaj5-xsojR_qo{M$G z6#?xo?>;IV-0W2cic86YuMEh6Da3KD{wW|WUGIscXDr1Zb`JZ7a(vI4)lDen61m)3 zh-fy6CW>2244yRq@h`$#R$@RRCg2|n)rrmrQN>@uc)Ad2ESpkk1YeRMJ|2hQmorf2 z+|bhE)c-=z(_F~YoFai!F&9Qr+g=wygfSibklBxe=oCF?4bEWr7;}9JPk_P1D*^-z zvKRuCM3^yz%{RN$XeyJiVfJ@2oi)ZZEogxrg8`RRjdyt|o}swK46gY2ID^quv^|OJ zRNNkU^53>#GZ0H8JF8$RsyhQ3E!RhZ_(9bMofy37)MQv#6_dE~(E6WTI~|LG*MGRq z!EnygK_%;H4boU0z&8Hf8H?ke0)!R>sWuJ-At0NQO;by|+iMliUoNr?NE9Lr;pi*+_??cZ70cKaIT`NVV z+)9rQI1aX_OVy$opoWvDX;M`m)6gRu1{6j}`i{)YI(-b%r#;TATc*mj$#d|e-WwW* ziTncR~4`(Fkvhg+gQNfhz!0MXJ6PYPK`ui&H*p z|3^{1WXprKH0k;FO*r-wSZI@HN97L32MP^`)Hqxz;ZD7R;ffYj;0J>FprC@t?x$ag zEGdb(iluKYfydR@mi=}ky3;+U%SdfD-061Qc-*BD=ZpYt0of@QOVu|5`+XEz5vS0P>PlQ z5gEu*WFS>ASBg6dd~gem6rn7Kf;{SKc$C8MePkD1K_$_cAH3hd)jYa;Qfn!g$SZ`6 z6&X!K61@ujv$b-|zI62jhWDqPxjz`*$Vl0z)OMHE7Z53hyYLy{`Jw6j%V6in5BUPP zaXi?te60R!GF)8^n_98@cI|IRlvA3y+eWM?DpmYohqqcXu#2h(v+1`MZ>4iDhk&W` z_?Dl}hy0u9t-*PkQNiIPGU5jO%^k9&^=IWH_TL3Dy%D4b?kt5Ua{7Xi3HOP4Z%u_y z?RN>k0~-IBS?6u;y=IvI6e3I+RLB9@u$FLUm>z9@EEn-w91_(U%>7FXE2EnNcT5Yx zNdBP}>L>UKz<%H|G&%^dBpFowMvDYgd=}COY!Ez_WlDJZUt4?4+V=uhkF=W==6Ise zhxI=#=>*HS{ZXwz(7aJ|-2R2atPzriyIE&@_va4->y{NQSNQX>%>UT!^hT=N?<#_M zgmRW#xG89dU~*J&y8r8rKGewy@XF_C$rYmSGtJJA28wqv8Imp|h!tIYYU7T*I?n%H z0%vGcW^t9hVAURu(Q4?Htudtpxkhq-v_D80we2!iSvI}`0~{SA_}s|+YA3kt(hlfzx^5JXJT|U+4`lrl>P*@^Bok*0uE+GCwV}FWN-Uey z&}EKur55y*F!6p-hy1&HZ7FxyRYmRw{|j^8xagCeZvSoV^%Exx1FhRoxxq{t2k~(c z60c47^j>g1uF$Ey$xEAcG9Jdet4^;}KEG!b6Brul@j2A91aE=kI4a+1|A!y`er!aY z8L=tYL^ikR7|Y#tfNayEXJ33reBJt*B1x2#Aj)ZHJ7_3RcBXMGr!6Y%DngIv&{6&r zgl)9F^^tP~wl$g|r;02qcG&hurjyK>V^|xQygBgO2T&8fBrr^K4Vz^}$|hMAL88YJ z3tWE1Mq1OhBz7*0S+X{5-wvRKL3+=D?9kMJS<17;=W2M_{7@!isMsDznRYSwL07=z z-e%;?bc}#J5XLVEn4L_N03B{<6GOKSPgT>{NvwCi5N`Erm z_ioJ;cpQo4*0fDUnaTa;-1Um@&HrBsXJtrYwf);Z+T5XxLc(%+}Kf-c2_&g?=7c{Be z(9g@k;9~S43d@B^Yqk8Fx@(C~%qd#Uaf8J3*R(o(x!KuhzT z?4?8CYvaz!NWfRdv)?mO+~Z(HSoupgQDUp_FxpgEz& znakBgJccfZs z+jly##`#J$Mu(z*`l`NNejn=!`sYJh(U!-Dz97$Yu^n|n3k#)6hgm`6*Y>T>dpi42 zMG&wc>T=rO!dz|uskvnL_d())ob3LqZV6B_wPYr|*zBS=zuS4Fqz8mvODtM%5y zK;-QQ8F4Xa_{LfYIHYW$7A}^QJWR zO&i?&@b)tqs74{O+9$bwsE&vkJ6;xb&SKC41nV+b$OE^}NpXn+QtfSIty%$Y9FV#= zVZaYbNggsLYpwWsVoz$>0yO(mFa}ZnK|X2w)$uzyt1Oc~8yZ^mhrL?@8x+=05FQY; zXyOX=+a;55jwNssnKR`C?}NcqJG2Pl>ft7}j5Fw5f=8u3dsbiha3iXFv%a%z6HMxX zlzu)!(ux6heELv;8z{{9gD`0E22-IM5KFNf04 zqk4sDy-~h&Yuib=uI@qKJku{H?UtPhFm@{}fHH_3ID5$s2rfIeK%96AjT7Rcbb{Wq zuCaEXUlDc2_k{tJJIQ=(t~b=5yq!;@ReBZ-FCZtkgyo>{taHjF0AsR&gA^a!8o!h!|EhJUg+_l=l}-vj?F{>?a-b|$##XqFr^ zJmxNznL6>Shf5H=l)-h>4&PMYYp`A_x~_(Wd7=#SFP%0p}I3y0=y zI=()ZMj$KDwnKUB0P+-p?-8 zGBFnz8U8;>4`Eme52%_T z#mmJa526*a%R4r%Sp_c{SCBzexok|l>oi+L=_eD5pxch3HT5I^tcFy?{s`kZ(u`4s zhtJn)78L-704dyh(7zy0EQEu}uE`D3DvvBmolTM z)Md93r}af63auQ>*w>yE^Yaj*xk33(b$$;=&tzF536(RKRI7ADtQv{b(9ke2uNF#< zbH;Z=N&EX5;f6KPZM|1)<6#IUt*(%LGQuv#6o1kPLG63nddH0`QbiQo(sE6>L$E_o zV~@zu8n&6$>Mi34lmouqo8R935N$Ukv=bpYM;-!n_R#1-u(y zD7o{fUgK3Hi40@on;rt!y43fZ*QxF{mQWe8kC}$KZQ2Tv!e%hG!`IeUoX()cwqgay zw+*+fZ+G}E@Il6E!u`o*i&|A|Ji3pE;9`veFO1c@_ca~KbAscPGB;35Y9ip%EJx>j z;{G-bSKZS9(Oa8r6dlA1Z6x^hvi1}bL7A4dzYr=?NP`u-%piUfHcHeQB%n7-c~&`j zrk=^!22)P%v6n<-3Y?UmyE0i9AbvbWMAbzl8e$LIEO-_SfHxWfK4COg^2@veVum{- zYVHEUFGD0F05lqfzcC&z7dt+mpGmXC2-;!_ZI#%7a{X>xB2}Ooo?qX5t-8J;iM>-c z4b5S4je4CP-fd{xd-A3qHWtkZrc3f!jp0#LGY8jDy}uT1*_k(G zC;yRBCW0z1ifa=ri<>tCFFcRO`z%_femyc8BJZ1VtWK-t_`q>l$liucEL#Y>J*7~h z<=7XAHmLWQ)peVBBme90Ui3kiAYR8TPImwU&gKXw+%kJ85onKfVY0SwoX#N(<18+bew?fsuk2#ag^R&Q7|IgHh`vK@YQFHf?&0FeR%Y+sEAT)* z*6)h8yPMT#4)Z=8Zbu+Myf%_?1Q2L*z|a)!+~ylI{@Di)^8UvP2$}AftRH8u+p2OB z;T~utrz6iX9foV%ugIdAeF`krZNah@+M=>1dBwsn@NRKbGN3Xz7 z14S8d2y_q-kY6BkP1?FtIY5pda1fBdr1@%GAcwh}r;?&Ay|uHNDhvqtnryz6%D?04 z0S5vK@dOG2^8deVR@aN$XGiz_Yp{20bR@asa#C;wJERJpb5*tUHaEu~Bd&dbZ9Gy> zwuxgH@Uvr+#7H9OUOuFP`nT4(CN78OUKp>{G+dkYx604%;k>}97r=$^w*U)O8_J>k>juBZkey|FJ>uJx!g-~B8a78vIAH)t*# zT|(r2Lgn;G_CM8G)V0!Hu^HEPD}CH|pF22JJ$H_-_>Y{yooTvQbv$QSI z*gj@B6J3Um5EDnkK$9&50YDvm31N&9@Kz0KnVoWu-SfRkI0NKrC>%Ak9Z)7Jd^TH@ z`iLU)0X0n%KKc)Oi-U(aNM^-@lp@*91BrWNjMvqz zkU6|?K++mhF2Xm)DexKN+bnMf^^JugV!;=q+mIad5z za4?}(iX_XCi$6je$`cAlmZVETE^8t74xk#EkxP;e{V5jWR3lv+<*=STFese(PuqOM z?VQ)0Iq~wmZsyaaxdK1l$Vs2{{b~X?c{iRP=JSsskGPM@fc;_r>HOLV(yPwX5Yrxq zEEJ!+O5nV@ej;rT!`F!4kN3CUWWt>NyCbCa2NhRs z?+gK-#!_DN<)MvGEo(jLxFyMPOQQsSj%jt32x(%m>fw?Y^BpKY7!O;-YpSP!mX5PW z>a(=5r`m`*BibaBud$l=vHHCaCp!aGg%Z6NPaM*2p%O_Ug1wp!2kRBo$dqadvwqO_ zas9u9WKKEHT?-NfWGW3{28sjZVm8ng=5*KmKcu8u!`6P29r?S*pa3;U2(&5FMNnf+ zF`CsT4WwFS=&FoZ5a*1RB~>z}*w`la=OZ@xYOFq~W4K4tr=4eq@5NdvS$b0p)d3BD zJ?BHy?TFutYo&sC{(>BcMQr=>)$9Ir^f}Aj!BWhC+cJeBzh3?E%Y3U$vk|9GeQe5Q zw&CT$xmv($#PK&8O)|VVt1h`TuD7kG7uv;t%#00NU@2<3VV7Prhbv4Z9_fwN7q{;e zmmgPQci5;hR@iy8rL57H5ae=$zeQkML=u7!h~1E$x)DL++RM#=`wUrV7!NpD?8pf< z#TbyHP^RxV(R(;^A=NUc31G_o-tCO3w1YjkqShN{+1Aq+lGr~b)To%SXl~rgUIZDs zrk+d0R_(EhD| zWGOyqKQpho%d+IKDxr$}D80aVDOm7(BVQCcgrUYQEj!Dtm2oqyR0HI zRVEwHF&A!^uTn>bc$D6-M`R&NtA+!caH8()fG@YF2-G5A(y9j!=DJNX%!8$IRCe%} ztE#4-O`&K|)PPutv&BW?HUX`7piq&^7t6rS%P#?9Ng3T2!EY5I$nA|%&$GbgcE~|j zL3t*k8HaLd0!_Wl&G{X-YECL|I%_ zm&qk(!irK^V}8Tigz`@#qrOadUD@$^bqU=xE?VKW>2^|9Sqr&PJS&8r zYw}83DlVRb5rxr%zSa={*OFssugL?o?Z- zb~}xf-GH9V0~rZCl$`@qP9pMK`4RTYf!Q4B=7IWeNd$Ep)00WQ4=OVP8FY&fOF7hj zBd(#RmbmMU2unZ<1`;LEH{paUz2O$+wtE+>cL4g3H4@RtI17vT%1E#%ZrK-(Uaqx*I&y;eG`;ty2ue~@2xA<N(yt(>=#*G{VHShBVcpV=hieR< zi5c&M*asVKhs#^tdz)S!gO{CRu|J08L^U=rdfNmz%PyWId)e zKI~5WEc&E>ab33H6KS~6mE3ytI7XCwo1OJRnBQi$T5>$~;7s>=Ut!WO@^fmC&x)e& zR>k*n1^+>=Hk)_MAc?M;I)h5gPfE}j17ZGPzDDgh70KhxmlkT{e$Xpcs(P()WW!W~ z^$RHrjPR41oqfEtu`Y4x*#pkL9NHtFr?KA7EHFxpC|7li>ej4ig|EA!;raYHc%-3< zg)>w|s3Pv!`FM~k+yof=mfx;6vQ{}oW*-(lT<%19o5Su10D*&-UJpmB8--4ooLACh z$u(0rXrrKWw>1RwI(G~Cr@?`QK!@h6idX96x#Wca&{DzgcjXGf#4k1-=;mg_lhvO zwt)J!K{h`boP1(8f>GHU=N9yU{O5uXt*5KY7X<+DU`zxSV}Uey>`hfwl^B1Yr&a%Z z$=9i?=Y&6!?7v|&eT*4#>RczYEXg+O78PePsf}xQEUig}j%dc&5oI2mG4JNyM3YVt z7fu4h7BvVak}zlrW*@-dQK#fJEO=rHn$o=@zRfDH?uxG;@&Szm51h7V@wt~D@^A3Y zPuu6bt|P$pw-q-J5}Lh9qh_D|TB05ip)m8QcV}}R{gaSKm+XXpkvEI|eb(LGRq`n+ z6+9NTzvnQ7MZwj<<@%`>^cyAfZW5C+7DFG)KI%^pdVJ&9)0Ej%Wh@W=-VUkun9?f&^f%(s`2MXh!(Vvo8`&p44_RZFsR;Ul9|ZFp4eQ0?ANvAX})h=ne-|xNQwdXGbkS#bt)& zAY-Ec6nL13N|@XoKaDuVs=toG&^a^P6^uQguY#2(38XtLAqL{^ft-9cQJYKBA&Z#ZMG zE)ZJ=Q?ggv$i9KYb8-Hdc}_M>Jj4Y*8?-!aPEl9E#pD2A66k&*Ja1~#EKNQ?63D~L z9S|OlMLkYs4ZXe3SCDvZhmV z$J`6@^;0zFNlko(i_(R{#VlmKYa~uT~0B*rhro09ZIzYenB>9T0|vXv`iT_C3U{2eWpb^-q>rDJI~m4tz@b7?4G% zz`%b=qaTTsl~S2F?o5+7UUU-k$jeKYgA`R-IyhV4$;Xs)d!r^)(zkS>+p)v?kj{rNNHUyshN)X^c7c+!G@0#j^p@ zY^>N(p=!+Ooa?)p>;-#q0oq6*9Glf%jC>{n(9^KF-}`>Jy*kET=xYCQ4nEj0x{V0k z0#BVf>vh~OdE&p^*)U5<<%0I!lUo^7`wS_Fu@X}u)ezLf!Y+rE+lxv_Wfsf_@DTuW z0{^rZ2<@2IClVT(z+WBrZP3H(4b#1pOT#NEc9=|p(H8m}O^;_%4<`q2q*_?OeO`l| z5WvcZfnQBE*$9;_)swwB#-6Pi=_CkMfcavP$ECy{E}%)5aFlwkh|E-yUStxq#MeB+ zpM=-wv1UeFHmZu{&Z^{a>9%T(zI<$BlQ25aSN_4qU>$7EcG|~fwN+v8Z`h6 zvEx{O8)X5iv7w>Tc#~I$jNTbE5uf|AZ;31o(FNFmKLI$IVZw4V%>}=lSRSAtLu2K5 z79Zirk+uiFQ>`n7SE(T9YyxC|L-FF;!`h>W>;aO(%247b!{;Q{S-5P1y;k{z%GM_@ z0W}A}Frj5ZCZE_7ex6AR+vDTz&h2<#MpnwW0i4Tc2n8xp0N3a`tj$0nDu=PAw94+e zl&`I8ZgYtZr;e)pDiGh%aQ3td10Z2&SQ*Be?gN{|_atC*p(lGm9lC;D#+$IAgLF~J zb3sSv4I-%LXC;FfihV&~!XXZCQ=={Y zp+a({YIdReN}7VA_W+<8t;HpIL3{Po*2x|fyJO-5Xl|#Jhag>ilIYyM8@r~w<(`+# z)Qk}7!_WbC$x*B*dx*(0tRMZ0H0R&2P`kiBSc3#XABlE9wXSK>hd{?j^Net-=gII5 z=Zd31Sm4}`#ciXkf7-`LBhBPcOjIycI`#GPbQjmWt4lahe>ub41}wbJUW%!n(r=aL zEhNcqKSgBOWS$Y5RKIF8v#gC|73IMml(;MW5|C8L!oD`qC+%s#OI}MTpM05$(0h8A3P-aqt-~*Bg}) zg?DoROSTfOECwW0NKc22Rkcb1#(uL6CXzORu`)G*qryxO-=T>C#I(H+6=g3wQv+c| zvj0MC+7S+e)Bf8Miefvho6L&jnEZFi{g=-`QQx8uoxe8i-QC*vD6QYVnZ3Y ze1;QKyVgtB{#ty`q86s$=&;GYkZ6UgvrK$z^|~fnBaCCmaC599jpH7x<(lsWPl^jrE7-NKq}D+1z9UqDfBDRx=_I2yNl1y&C7cC}-^ma@2?EkCjMo zEAz&Y`^+m%xtB8Wfy*^X-?7uEW$<`CHF>tkASdxC(*l(`tu%w$xGBU*K5Csw`|}Cb z6Vr?dq}OjZBV>UCR6pOR*U#iE&T3znDe+Uim)Rw_lEk-fF+vF^1}7CoRucoKJR9II zA_1l{f?QefrNGRQ(mo8E^PPseDfB}1u8JN!7BEauec6LR%mvB_Ob;FjU_!*Z$Q$a^ z>2iZzM0is;v#!lNkJ@ZaBy_2b;@e=;H<&qonKZfS-K}_MT3He#ul2T?9)o{gi(@oJ zIe#gx)J1Hoe3&26<^$W7(8J|e^+RuuZ*2>n2Z(yWS4R%I=uPeT`;;Hoa{DpzsOlNK zUJH2;FridF9mJ;ox}Fv>2(s63qDuz0UgA#Q_A?IWd&km8aQhDy(l@-;j(j=v*C{u^ zpSWMY(XxT=Q|F?)e!Zfu@@ zw2CDhL_#TUES2D+{C=wFAP6Y#L#}Js*SHYQ2OQC&-YmPqu0;0&LP+@Ji}kEZ!uvzU zJwt{SQgpKXu>5i69Bw2%o_M{EmS3#rUe3^*@~0#y(H{>ue2@`J5vJy-ztMA*2R5xT z<{6QNqvNRM_PR{{SV$C<5eyusVj$9f0X0i1nB5|HN=sAv*d6CU&l z$%J~#p}?Qqd4P$9BY5U9zDQtLZVnw3AHu^tGdZY%nY0`085K$?$`;mSAS~h_?sc-1 zkbdr=cZIq$Tj~x`W;n5%F*3$btTvwr&PbbS`@?)ypOxn;W#n|W?;0$RqH2|jPU(F4 zgW4FeNrDxobk9t8HrU-~Ohi&XgXmU}j6nzdCp-^`kG8yb`nr3WHP4<`$RK~vRk+jo z<30X%_tSL)clUj%6X*)jyCiet`E%>{S6&c=MmZ<bt zq=>}tj+_}Fes>Ilp0Pdplq>?W^(u9GzCCmDf40iZ@xohQ!rJ!cR{pw)@n&nMbQi{h+VZ$aC{VD;CHqPkLufwzEg5MY z0NQ@X3qDa_(guQP+~G!=32c&&znUI2BqD9KtWMs1Y(n7 zJL_qUnp@sqO5;@hE7ESRwKh_G`v(L_a9$4kKVY<^dG^Z_mQw_<7T;)iFD~8$KyrY$p3il@7 zjqQS0TR>;HSbYmK3B)2k>f2x6uwJVV)8$3uR_=zP3u|4omU^PcH|`nD5GlgBkr<; zx_;6_9AXh2sCXVjk=gys;x*KQP|%GHTx7pl-oaWV-*);;p`6wfDxHT_Zo1HnHEAls z4)*a~F5U{2p083zG-n>_!7}u#hde9dxA%OKoqj2=b(snS@S;MDlpWt+>l1WJuHHT$ zb_0J8a3mfjvq1mMTdB+EHISuz2ZDZPxp)S3PKpo!fMPlT03SdAFmZLYaC2pT`Es*y zv~pz>vl8``c5#vXJqq$a5?}Lpc2282mk&SS2DNtvz_p~?drUSf@mg(yp`RO#vAt7u;oWnX?L~5n0zvyRXar zV)&moT(1-d+rET{Yi$d8nFq_$R~)l#_r6Q72>q}?x4ps?909wj#~1NEWVa7#xD0Xh zOspe^{e-a(6EvRGY}u+?^Hri1W|Xy)FI`>K_u3A(Iw$9`;ymph6KxOFO;s_$QiyDR z15mArjAbi}N^{0hkS@Fr zE-y7+_0~Xb-BL%O8DAg{tL1cmws*~^(X)Q=C7e{DUWj(@!7W-4WI&l_+q=mm<#xS> zn0qAO^2{Aw3$F!`D_10@0bd9YP0NyAxRt-~=Tn8u{pRU0Z`3lTSx&#qv+PDa+HCvc zWeS)33>_|g2fZ_*SwXYu%8jnco?diEZyUpk&;j99CHHDKU6=*2Yc5vJuNKS`#X*gp z@a8DoKCm_EtnkIT@khElv*NceML#AYWtQErqShKVqZHMk8Djcgc?O&%ekRujA3h(7 zBc#P2)8yr!D!C7vEjNN06p3!e`J2~?i4_*N?C`GIG-P`kBRO!@g$16{hP4^P=mo8O z2E9e5Yawe8hywb-v*^tdqF#O7Z^^i6@vFokhEyW0nETKoGd?75)E`0^RCs`|7n}CZ zGZl%x9f@NRG=5!FaV36UU3*y&@m2^&l`Z8BllHyU3~p#I*yVNU3_+4v6mhhvyC2k^ zNe{|=&=AdM#)0yr*a8^Y5~SeDugouRQedkqkM&is(r7hteiV6=L#h4tvJhRC~&oSb@=eUpH*!HQv1aC-TL1_s%*$sAo;O6G7;K_1kM2>0*{5H?n+A zJvY!9C`H~1?5W)Ypg7+2s-yE{$wvwM&^Gjw=W=zfp4AiKnp%snPw)Ew< z1UJG1$$<6l&VA}*5m@PTw$!<_8)Xcp)j2O!naO0`7U?~R=1nyuBacu0_GwpRy(S%P zOonVAAWJ+5cY6&Bd%EsI(B<|##$qtE`V+ada90UiRt3dv%<$-ra{gU{@{!{}_7gLR zK}oC=s`JkKsw==V4nkN-$gJ$~@+CKo_i^A}6fTy$Fi*o&Ku@?5$e0BR7vx@Cj!+P~pc{<|1Ciio?p#{0`s_Dmu<2hiFim%RNG#1B2Ybr`J9NrLbG(;!rqj? zMOH{G7=4D9;Pi#n51qcPNiVk@32Ha2H}`iOnaO&6Ygd)Wwbzw9gG%HObahM*Dvq2V zo4-bXey15X#r;%1_noD9a0FTEOF>8_X|g2y28z|0>^ZQ+FHx zHjKa>!5qa<89O|jr6X)PH)m8s_+9#B7Q`-_0xQ%rj=c(?sGw}!0zP`kH$mEv5M4VU z|A0EtJj3o=7C6^1rFgk_2#Bu+8KPwu4nv5Vo*;xb4c3A>S_}r)0y3JPZggdc_m#W2 z>A@1@tJmE6jAf(bOl^*L;%*U4((d2pch>rs$$*MM4xdsmFHd?PsuN})Qh53!PPZx7 zElf#DT~dXnTra*|VXr2Ydy`22w z>SPO`5#a@Q`}roNRl5!qd$lPbTLucw5Qvf5@4;cfK8I(c+#fnnx#tgth`JlRRPrrxz$~umdqNctqNM+&BD;hZR{owo@+o-it zGa4D^vDkuxhlhz=jR;hLQb*7I2*Zxdq*%x%zLqWiB{Y8D5yd>D!#xt^Fvs*vMME|K zTucKp-9%XNtPfA%13WbO*WCoI$VBq)(gGOzX-{EvkUJ>1+==-6oq{{1pMj<`x8s{{ z-wpz9LQtk;l;4xlZS1plUKCggSVabCuq2Ai@6+lulNjdH3fq8?L_osi;|R%R`-1$K zV#AtW!a|;KO}U(TLuTo!4meLL+r4EO-rEx^HX+YXzezQ}JXeOAJltvI&9~QdtA6y> zD*4a{9+hBvuZ5v8>!HH=1O9FKS9S@^l5h8^1cm35Wbh_$^WEp;)HTH5ss$12KaW46 z=CfHh*7>7O2zS(g`serD6^VpxyU268Eai9AW~zB&=Tzs4XN! zf_*;D+TaW!-iBJjaEb^K9_ys?kflM92*N{z|>#sR`2~Gs{ zGunWt01BQ*&~H61N6H}e&PBd**G73(A)7(@y+sJ8k z7!`C@n&+t%C{CMW&fmPpuKfvBL#*~_Z5h)yuyNn>CxksyWu)0&Y6{%jzSg8 zj6&#?lF2I2)*mYng@{n1s&KmMtHGzUG$TpdjWG@Z-g&O~kDlt*Joch~l3D0<0dE&h zqSij8O7UBjBuNxBC z9>(H$3hDwmLAEDGC%2y^dYMTKZ>zTvU4$yIyTAvEb%>RA8ZH_mThKzh_&lF1(q|_u6QIfaobNxZ1=RF?lH=jOXtpM<| z>A^k|4+7&amULp9rgbA%;)~E!{6>6fU(#OXP%po+h)kM_mZa9{mX>=!Ydj!I3Nw-zA`NLlo^N^h2xK-LQJz+S(Y3 z1T?H<(yW~a?EUe`isw^3oEyoUyKs9ek0<*^Q_-b|vW}VPb*r#bj}F6*C@;$Q7&Uls zPRLDilx3pXdk7N?7ACCn6{m>70+a1MNBQ_cFon=%+m?nVR8! z(2|@z_r6GbELcG*WA!T&B@k4scn+PFV6kr~jFLlzCrAbD(uL2opejZ22|@dk z+8BlL?qTy`F&w0IvkH%B#yX=T37naQma_|znRNu#r_H2d^#$v}zD-5OhvlnwpQ9f7 zAQF@Nn>I6g!C6%UB~YKY(yd6O9S1CfV&0mt9uRo+D`T~WprRFHGe}X*c;A+l`g6tSl**!_IK~pACLM-)+i!zh0izbKdi{+%EaLBqcdMUr?%b^`p3&R6<6z;g9Xh z8~WYD$?o?18@t`Zi8J|G^@iIL>1n%09%;BGwyE496frw00wH@7pTrxU%v;yxTYJaX z_ayvTz-5^l0{?qQs?pSxqso~RYm8~?y&APacX2|*F#G7ufRW-rv z!gvgU@vF2Pv;DAWB{<8=@nMsRZ%TV}RPelvB;V9I^kYpeCn?^wZtRA|qHf}}@O~sm ztA!U1sx0;@elMk~GP}P`IZZ(`vMF3LI5*xc{-pzQR<8JACB;ma8*>p<0j@oUZtp7W zJvkz-Mu>dXid?dO?D^K6aNR&WDloG+E)}Y*i!G?)!Z2d3PK*Dw~}c} ztjvO1wQcpjZke)W*;jF`O!`k`R~sVt_v(5LU4^_dC9&hMDih`6$d+lZ zFwuaue`&35Kc-*L#cBMgd#GgYPxGc1x$X_C_23En881eJ=B|-&3Lf-{2QP{-@%FTy zmp{q-!}_S@J;eoNX-787uiBwKDDKELPuGfV_lJY?%tkaCw{cgt!*5njh*SEUPj?+N z%1!Ow`nd!j6StqtgJ>m0-R)MA%?)SiBlVw>E;VQdxoA?uOo?RVyt)~no15!0VyZAx zz>1a-9G?Q$_TBBfeJ)NfkGe_4x>RQl^X<3yg?z7SoVryIyNJ}Kpa$)1&Lcv3T|x<5 z@lW@9JWYvO%_%*14Np&vAQ_3$Bsy#ZOiQ3T9z zb=KN+78sqk_#nA~%TRk_y)vmKS>xns-&fq)oi~Exa7BrWEQ4*9nDpyTb8mILb8TQH z$(*A__k!sYt2@eK=8MlN%z)|s@zdj{{yuimDu*{##avB`Lkm%BF_o@9+JSs)jR+?v z2WJ%}YacQ^W^8pC-wpP<*e|)tbdqU&hiN97ewIM2mdPR)S&f~rVZ{CU!VfnTsY%)qY6&_GX|7_nOsuu=wns8vgT@@)#?oYZF535o z#&H^;54gpEZiMTt!nwmPtu6-biQNXqnuYP*+nwS1 z4rHH&$+Mipk_e<;PG9KSRa^qJ)t8!JJL*g8N})^s5bomKWJ8jS{TLF{Qzntr)&9v4 zu{ibBR|qJuild@*YCj!(){CbH_N^h~ofgad0dQL$sIDQ*7ECTS7 z69uO>V*6a^+ivWvdRS`t#)KF%Sdh`revE23T0^rb=K$Y*{!|wp{dwDj0*?B{D#^z% zL>4v@iy4KJo_GQ~68KAMSY?m>9J;|?PD%oGbF1HiF?* z96;gnGFQ7HhQ)ft);)S2W(uOs6nPgbmrX+n4pS6H7W zN`{>B+BVZwnMx1TocO3(d|em$`HEI`60&qFhqVrhdrlj8GD{H?enZo@`|hf`DPw}l zB}P^}0l|PGd3B_`s!VD-AvU)>g{6phNqBE$JY#twbO(&Ag3ydWKKG>Wm{f(!PqWhY zwy*oN@64@W&N}GSicQA>u{wOkx)MhDNhT7!N;%#DUFSi^p~j$!3^!ZoB>bo~N3V{k zbKz3qf|7{r{CZUgX&2upZ~8l^Iyi*)&FJXe}6%|q!CmkN5P$lD(2l1V(~B>#q)s^iN&Y`q$W9PZ>LtS z&={^+0h9$)yg7JLTD3-maDtFvWj(Le;5UU*yg1+3DNvIjiq#4~Sn4<-UU_lgE8F3Z zU$XMWL@gTLCqsIr8~OIajEJ_~Mqgx`;ny-ksK{3&k{<>z){%OR;5)4|799n}PD58t z)!{VmgubO+)XrmnJsf^mpINbAI{0CAuVYwFMLvssuE56(cpSMzb&~uYwi^6{fBdZQ zL3tWu#h{uAdY|pi6MiXUiN8futN{qrdI}1aIAk2a3wR=nrnDO4Z|XYv!L{g27P)nu zw>6mg1jF5GWle#+K0B3+p|m%Wh!p+2{c;G#Z(~r?2}t(4-qC;RUC~>?ne|2QykGzT zCV(K7)DMUQ`ge)b{}_we3B8K_EC^v|0usaNjR7Ga^S|cjv63nT1VFO}KOqd1+hWACEeb@mMKN>vI7OOYPiAW&VrafEg+r=C zbLMOJxKIbVgaqaTMds$ta9JiGQ;4*Limxxd?tNuKdV?q^Nn9&AWIC0wPgjy}7W1ix z3E%#$ZL{vJQmjLB%m;?c$cAuTw=;%-S127AJ{JB#nScs%UX#;ObZ+-1y$}}Sw&#yF zQ8vy6_xj(EJ9M7u8C0D}xd7MLHjNDBW2+TyT}GCCibZ5XAM7vo6uQIlKeKQoK%dzx z$&ONA6v?E1jJm45ah37v!AU9el}oodHL-Cq{_ei{x^B#%YSi0`Ti#7;9+|0X!SeD zKde5#w8c*o|GTaE8+-HrZ2gNR>rd93vZ+e0K;pkx{<;wRasiK8;co<1w*QA6$xlC% z9@t2+c=55HA4CAo-!n#0AkZci=my023;SOpa{r_$LNCq%K)p15`TR*!W%oB*cDDZ# z`xmh*#=SMi3$u)u+MBgcFrC~003&-R zGZXv&FvoA2bO#dP)c@Yj+xovP=l9YI?9MGU(;Z0iXIFpP_47{*Vb9-qSvdYT29w8& z)x$gii9KEfQ2%(wKcf8dA2T1oUwPc$J4PV(Q>DqSxobauY6Thq!2P!w{-u?of5>bc z&0k(+C?;znCF13z&1B~KQuX)`yI;oVee=?tYyVWOH$a-dxTMe6#O@$ znZ1pLqZ^~Bx2>0wC%4ys0!jUprMs z{awg~^q*kQeE$pVk4mrKz$AW3_D{9J&&2z`hQq(?P$T>wU@uDhqZr{gDAJ!$c4dka z8!xo+FV(7lnlwNKm>TH$+pzt``p=yI@2u<9{$~BZcL4mx`WMtcv9kZ{MTPO-P=A~L zk5Jk_Q2)3ujt`Ik4QLAlFnQRxS^Vk$zqZGY}-{`wq5o2cjDc9&w26UzZp9ta*v#A z<=!jDM9ewY=@aaUf*-@q_|fS`eJf#^k53{+el zoXyl!|IZ{?y}4Fyp0Gf`V2{9m<^CCZnZ^Y3TM$X?dyo(~laB5gX4??jJ4jbh2w8}P zQoHm{7hi6`Unv^6n)r#aeOYss1+v3vKS%@B znt~WF=w}DGhF^?2X=YNBTI#_IDf71-uxejXI}zB=O640KVOV!@qQfO zUjDFmt9@KaV?Oq!vE_myz5VSN?vqmrswZ~NNGSS47wF%YHa-*|@}EWgd!{m317m|o zS;UXf{tH6v&8>e+=K6~y#&eVY7nC?BO47K)Jpla=UL;EXFC3{iw{cDs8{!}AQkvnv zWE)9j5J3LHSmen58#9or!ubb-xBAaHb*yy%CEITE-}t}gg#YLL3n!O-aex2;6(qts zV*&op5B|SjShA{|!v-T<_pt^hKSJXIsn{&~0K!B-O&<*0x!nLECG#a^JedZ8RB*w! zUy|*Feg^nzyzd{>SIIN81X3$GGKPN521vWMgj2f)&ud^Q8$pt86}Nl@=2w^k;B1I0 zpaE6~Tbx|}AOLMbvpOUw_iexM+;38KvgFqFtU!V8@!Gq!hEnQs)D)58R-GEVfEeidS&57BvVYWccMk~e= zU5uM72U|MtdHz*rnlH9OrL-T+J+4Y)QQG>d_X##Y{#0c|CHpwSShZa;ZA# zBxTms?lW&_ehu-r1T(BIV%C)$)R*9hKY5+=_id5fs+`IU*n7k>MC zXXa&-E&|@>VTW|_V474ngdlTut-J7Nteb-=g$$*fgxNU0FhVUBJlUK)yGb~3kj$=A z#_tkXuvIUzhp8_gFD3~$8~uPzCwEnN5axLM-XM9oy51$DlYBgZOe}{s+M5sU(fkoC zY`%0#*s&v^&ETwFw1MUflNR8nWv{=J0R!lpTlziSQJ|RY`R@r0;t?ieA*1R7Qn#01 z~=KCXoSV(b6W2{fqxvO|eIt|b3{=O1lJ1ao7A_=k`OrH$NfNTB~f zJ+3&2X7&vKZCw6Mxe^mR|66?2v-n?(ckua79R&Qt_z((7DC573&j$wr!uo5nj9gsI zTwNHf>`l!)=|tI$G(;V>wCGJ-T>kqhf9>G^tr69#a&eiANZrpGqU$!%0YDSjkMknM z_}KivfZ)nvc4J)>~KuOryF(L9VVvtM_i4U~ z)Ibfx@tWtH;yA75HTmPVAjzq+hw_9TU!WxU6F|i&E96zTRJ-lf56Mb}Xnc5PYb7&3M|ae@6lI4RsM~4Vi=6k$2;Cxc}TSdDALffBq;*A4W;1^b#y4!Y~!Ff#-%9?3~G0sro|@-I2L zkx{RGpXYuC73Xj%CR8n7MnCP`FOYwCwg~{vf2qh{HZ}?X5J3M$=1GU8+l{||H69EI z2vwQ4xj4{4wd)-?JW~ES&jCS096n&92K|$|0^=-t7FZNps%me)EgH1Yl>EmHP z1Bu`Ng%dy3@awK?#Dx?02-SR=`H3A8OT}B^&9S{jP;M>W>Dqv=qwg(2agT)AqoRa)2KZgsU+0Omh0Z7Awo|^$hXvG}6{(7io%0M*8dW z>HdQ=|1yB|u75f6Kk?rGA7=pF+6E2>qw#=V1tFGD!K)@pFY~&!;!q6UoHad*%j^ig zY4erJXsQM>Cpk8*sS>j|QbI%_B-7vlV4;KoBT!PoAf8PXd}jsdE6^>^-T^hY##f01 z3-_x8-c{mv1vfXh=URWYDa#CU-N~@fT&y|g!Nl@Y*HGScv!vDq(jEZ5nA7I=_lK9K z=MAx2&*Y?jQ3vD2UDC_Teeo3*ISU4bzh@tqS;6PY-S%|qyNANr=kTgg0gtI_cz8_X z)4-oCg&n}4$r`JqCV6yfPWnwfi+Dc5y_l;Mg%tT@POe^KALbz~lG5+!Ypul`7i#C} z=+Qkc)VU;XEVDg|h6Mof6f;1!I@R=Q0>9=oY>z5VcApbLZ+!wiFjvQc#vuvJ%RGp* z__fDEzCf1r!&^>ETByyMjCUgUH9kP7jxOAFpY+DWLN>&$MWD{^WrYT9?O?Oly+HO$ z`}Y;>vu#~PTb^a)lyLw2GA>vLV=^a9*%H}vhn|n$lPt^}H8sGfjLj&=Q5-pV2>vvA zs9WzUx^VWMH?r3~?$Ud!htmW!uH*NZ7JGy^h$%7|XcFpE1MZPX6iWVxk-m$6)3swp zv7&@Pfxo1e`SYnYGG>6|tQ2Y3SoEErfCwFGoD^O4pq{Qj4D%4sQ;=K9E0whRXMi+r|~^axj+ zoKJmQ^{v`_i?|miS$0E%gZ%a3b-I1`m>HU~t+RppK%CD8r4(VArA3emzvb&pd0;_j^~7 zfZyM|2F7Tc;?-4>3uf#m!=0@FbpN2X<4qX&q+r}k5hVAp!`}Ia8h^HK^Q+CBt ze~*sE(Gq|)2P)qAjkq+RV=!x;@otX;8Fl=2D{l23IV=&JL5rU@S3(sG)kSeFy%s*p z)ALKtGd>n%gk5GKXl>4vwEmpE#um0D(Ct=m$=QlslH_qLkduoeAS?`nVv=0Th^G(t zLEXemY!4ApxU+UjyQ}jOZ{H`*R|rqBc(eYV(iJe%di*uNm1FV3&=2tSk~ic`O@s{~ z;viBE&5TFudqJb7t`>I0QJH-~YYu)67bCs{Zb`1milr>o^+0Nv!g)hu_kcz2rT%T1eWez@TD+EkkB&4fPO(%LM7f6#mU!tkhxKLXz6cac6Y;Q^R7 zbVcl%+nt`(n0fvbve3lv2u0D9Smen(5C$$}s!i1WBXR~N7#G2nIhAET=6a~t!zE&k z02O{HD2aNNu~L9HOcgHwviRd_WJ0L6>1pXQjDRvn4bOqI4Ue-utE3(gr}i*Oy zcf;5ycb$y*P1A3KgVFRCETCm$C&FCC#EfvNYH&W1^Hp*O#fskM1AG}Nw-f-gO(a*- z*j~xpaKoCBS;G3@?~X1hm2J4i^@8eUTf1GGHAVIAWmSrh@+WGV?lLW_+B)SWBTAkN zsd5H&)ox9Z99U6&URW4Eeun20=jKB*z6RrnaB=XM=`0{9){6$07!ggJ*{7$j(2!%( z*s4LcFnC`j7Yi==W%T8DuloSJ9ffK+o~k(* z3nqciL4eT+^M2QL&7S!z zT8))eS^g?DjkcLSC7TPt^*Lm#rTR;dI1XV9!H-9o<~*+*DSCD~Fx64W0Gs3}CZr?y zWGN8* zAS|W_$qS~5tBE`Y`1*M9$^KQwJZ^C&8GS~y8}U)LQakLC#=w$*S4Ju0GnSLoB1_GR zTQRDsGB(Jq%>YY#;LPH>ASuF|{e3M~@E&-WycCR%#^6MXp-Ee>^~ys3>l*I;vOJu5 zAmNsUgWylo401U4DD(}mM~_=oRP^QiM_8E$IYxPemQWHMOVs=(T5qW>`(mS$-w7z3 zxp0V^6mEm_QMcp(!Ue&b=MZL;G_k&$z(4iI>a?w#c6Ud8m) zK2c#hgTTR)r=}?RR$7czHRlQHP7pU)X1d0uhBI{P8D)mGG-qTQeAO!N*&&c|_O>DI z<0Jh>6`fvWj!3GzEoS3fimig{k!$8(<2 z*R=femES9(*J-LGyvA#azCck@vILOhw(?VF1ylMwqe?nhS!->Bpe>mP$n~!C2=anM zvn)&{vv@c01`>u8mHoypk_RNGH8a;p!5sF+W%A%&m|*zq0PC#a7|$&NrDUJk1m5IuJWx6)IfHY0 ztPeRrPo+-$h8>B!mv-Wgsf|l$fI<*O!S%L55?rVVH}Qvh)pCp=ZvnoPu6*lVuXBcH zW6^a|r1<*K_(dAd3sn_=n{TpG^pfhYQ|URm5aZIXNbxl!>Li>yReMQYbgxpP7!9!x z3j^Odr=8PGME4)T(`jilIHv&@2q{>P4FrCGz0G*4AZ?b?QEXM9{8>|vW4=iR*xK=U zp$L5;s7@NXxRc8-U6pQfPc9WM6U;5{`wfQ9%V)^@&Ods)06z~Or{(YIzAK=N>`S|V_CekNgm}e%p=7Y=^IS86&mUl8tIkF8Vc*D-A}qz2VXJ3D(V`b zG(Ju97=b)>=8}Izm&Kq$1F0^OZpAD#$veK#%aA-9PTwFh5jsX9jtmbjGvH1|hWCGS(3Q?@+|c_b3;7S=EY zD^O3vDg8vHFqz=BF>iqskDp^_EVKgy%J^}DcJ$&+c=7<`PP|Qi#(^Sn0V2XeNrx{r z99$sEhb$EyMf|C&uO_5*8{P`g)FdV~(Of4(V--(YiPd37-L|&k5AuC$iXeQfY!_zn zN-uV;@Nv!~Q&XwVwbh}7py(!M>PW2R0UnV$W1~KA(scDVeHD?tqXmK1d~4MM$?eP| z5-p7)dS)oM@#xbUi0#v?2FjJ0@O@k&u>ZQ8srCPUtTgbq`z(}0$9?bi$I}ew<8J^`1;k_#@q6aZM^yf>-TDxl+T#jfs3cQ+vF;X$rPY(KhM2Y4 zyOaEFo$hfTt@IGeox=R0NFb0u#yR_55KUkyJ(8J-2^7*6%?mbBS6mAWe{$Gp}Ypt=&HQCil16WQ|NC}ON7u0da6+<#=(=WIz;GZK%!iiwIhA#fp%MtxhZ#+M` zpfs2)Mo7H z8>D@P)RLYP4{Iy zRoMOMdd@{|H#moSsicv5^(H zg5Dp%D=fEbFBmH%2M(L0Y0V*$dB_#U%Pq(=#{I(9V9{6tY)x|PFFES4e`^Y}jga0? zf;0GNkFL?)@3ebOy5hiW=Fq))n~JCHoZb;Fm!AvY|B+HljaC9?{I8^1>wpsQEAYRv zYJeqaTYgv|ASH4jAd>&dsu?>wc(|B3(>XfWdYN0<+R}+=8<@&UIXV6>*|jBYJBJNU zlrR5YVI~az(?0Zsi`3vo>)j6c8o_l4uXd1D&7vmOlqJQYlp?^z3-0$bjxs|Eo{E)s z-~N?|b_9zE!tr4`(V^CuNjCJA-@R5{N}kLZA3JWt%@_WnM0^rl=)lZ^1JZfjFJahj zYQij)N3XHkB1*wCHB6OZUvUWNNz1VZLQV^#PhR6p@Z@b??Ew>_BK5*Ya}j=t`#OJ$ z6^lmk2!Rjvuya5u#Wy!Mk-x~`>kjz&<#_^He}`Z-N1%f%3JZgovGm#{uSze%c>n8@ zn<@*XA&U$%V&RM_k5=8Z`B!`|I`lz18rRk5nj)o4O{2bY8kta@ljW(CruTI*+B^ZK zxWW)KO;hPnfoTK0W?uIbJH{ne@ZzvUSbyidTAnjeG`*O*yspOLXbNY@eoxD zkqQyMGc|x<@(iUclcf$SKSJu0 zm-}}N@Ha3~(~?d`(G3QqGL>|WEEwv%oz{e36c^yoyd6bM>*0lbVbV-wP^gEZ=YaPS z#%(K8ox!e9<3WU0H^1_YeTS!fgHpbp+m<<}r!XUS`F+lZu!({-=XvBA43!sjY2sd< zwjFrgzXq1*Ub-H?1Yjx++kSS~j;4v>@C)9lG4(c*x*6>byt_s--MmYJj_x1Ufi=KRms=>Mg)ey|Ry! z&?gMr@3SQH}=eBI$u{MDI+oFW|Qn-R2=b%R6%RU24muNY)OzadwJQ1*N z8DDVdk^zwj?4upiVubeBk^V@FmEr3(L^<`bET61$2LMpWWB>L#GJzxNpekR-z1fJAm4Wau8KC)M2Zuw`KYQ z|4no9v!mLk657lPQ*w=`)Ob)j^R6}sJ`sJrU(*l8E9_a9Zzbt=m+t!OU;uP{=ci#A z2cHGn02y2nXM`uKPRFyr3}BvXKwt%dF+%8UY%0d&ny*xGgNF0gxfQT|`|6REvk8L- zR$r};G5BQLLvdaAim>9}e}%#{DCU%SY7y47g>MVJpx_!`+(dVw=|fLCl@00a;?C&$ z!*w@$MGi0HAU`?K7uH2rWOQtkwGI;A-mM<82^6yW)6v)M$AdA7DgZ83^%NF4)vs?G z6|MVoVR#dCCG{4uPWej&iFvm?M?%T<<6}4-V{L}ZGE!y!CKF{dQ{~WT;6x6%E%i1n z`LWx@FZtPpXw^D}i5+U%SUmX-V@b@lpo>9}fPcQAV>a0=8hkXBGzNoMrt844TKYoq zgOzZ7J6z`-F#Aiw84&D#Yv$AHa9Re9z{j`t!|deUSrQ>Uo3-i>N9Gy*YbjI#2P5us z>l>07s8I~_YHWx%0xt9v`gcHAoG&4B`1XqtW=UXsx;?|7Q|bEp1+Fl(IW@p$7}VCt zj{qNx1dE@iMS!okS;s#{K6C&S_wWC4HC|B;qU%!t@O<%M0^GKP;nUaj#OKCd1IC+J zkAL--`Kf|B&)JrJM)yP8$E-VGHO&FJRSTbLdHVW&YwB5hs`_Z^#h9(oy+at7f2n&P z7{P{_)ZK#a7yoADh_dZjXF!`e$4ROPY5`2?vdXA$UM4i($jB`3nVR<|fcTi)_{lLJ ztWQq5lqDlH0d%Wh9d0@!K%}?d&)1Jg)RmhrCuY-gSa zm5BJ{%etic#DcfI)(XIXaxm~Asy-!yZjXl^3-pEH*R6gHvPc_odb;Dj!pEgrIi&Bo z7C%|iu-)~bp#M@|3&7n*2}M!%JpN3x6j)8G<3C9{f=!N!ab~WUS%Puc2 z`|BG0uCY?8Ll4Cx>zKM~dc&23PP1H0YwpJay(F6x!z)c8$|6>NXYkb$MQXqjXg-&) z5!L({;ar^@E!6J%4VRl54gOQyCYTOuy+%n2>t}E&#k)W&quq(Atx7RAe1_$l+^4^} z0ED`-5J0ZZXOyIDjBWalUO05i0m_=Yq?c=m4&(gbEXaGzlt|#9g3>~t{RvaY4Z0Lv zH_46WJ9FIKxOE-+^~s#EVeE~uEfenk1&Rg0yFx>Vt;FA+tt|Dlg6U<$Fb-4#J7=A@ zc?dPl3>TZj2#nJB&NQXCxGC3#5h9R8x!Ga(2v99D*B44(4iW<_l%)^1M%odK%QL z7=Zoj+{<(PoX1{atQ<1mndl8y^g4GU#G{5@Y<~iZtjxlL++-N&$}5l%5Gq>#&&@7l zyr5a-;!t+VF!_iMO9SkpIBj?2s%GF`l-$YKVGD?h5#-f~28j6yppi4G3~K`jH-~r$ z6P2vEuz}o<`fBT`ccoZBhj?&dB6d1H37}BaY6IS2mxL_}RY_#=kE|gE%*;07&FaN6 zhVX??MR!z5av#`m4GhfyA!n}W<&7l@{O~3X7i$P=bQi_`s%ybmfFi&TkQ)U61fISh zNxxNG?blphU0ut8w4f5_K^mFCC;@Ug4&f_uZiCF>G?49+M7S*V{Gv2^u{q* z^~H21jPmifu#L0~_?AIEf2l9Mc4M#pDkn&kxeF-o{DhvR=zaT45So(P<(awNT>9dl z`0_oMc?jEiF!q?^_=YWLC#${Y5fOMWBiN;Z9ReZ1k?o}CiC z3;zByQ%^yN1Qioj1f202RaiMf=-4iqAdreml-qdrd6lSYH@d;(lo#A}5b(ofW0Hm6 zPbtk-{e1s{1~1_BH8Nl0CsXC;(1`77w$>sVzF=cO=}ejC2wy!RZ3Y1$?oS@q`NSjJ zR*6qfA10Pu6l-f@yW2C?rA$cQEyAr%lZ-WDy6jzy&yz{TNCubujSL>n`W^X|yKmaE z?<;&G+LA)HW$@ZP!;(N>VL%u$EmjqIRdo;We^!0zud3OytXu!HTlPP&$D(7Wns{%X*1 zgk(b}rn#6N3SmArf&CI+THY8fPM1-_d3cep#ZdD^E&3Nip<{93LM)G_!y;A4#2@$4 z???s|(S@lg47e2?nuSQbg)_X}L@`LFxOd_b-30>VfJSlF`C=v3ruWH6!LxZRn=U+&4a}0vaUY z)q|)Ink>)gco-e7D9wjD zVZ>{;t=edK$ZH#i_gG<+#=NdL`6kGxI{DH7?oqLv$XRr|u1Jp4`q>1WFAvi1XdvRo z9}fK#=28bypA@vwvSrVXjuEkDiSx-Z$%Nqqwqpe`Vln+%GIz{@<%iJd{K#rIH(zJx z4A2M>S1tHfyno4Vd9~x5^X$Mnkw-r{Ujjvy zB&u4TZFdPAV8PAw+o5FGABUooMS3oYqW95XxY4hjC_%P@YLq!{rH19HKe|Wge)aL zk~h6#%3NeD$-NM|MBJ%vwJwUI=vqtap zkwc@`FJG_wBiKxfw9+W@qe}=c7~mS<2K>z%imAttoe6-P{Fz0a9%k zH!m)AMqmH)mCf7pb>w*ca7SN{|J~>G>hRhCS%t{*0ryi1`FCUL&exTif)5}zv1r#Q zVdMjMf~Cq{nK6;V9KogsP@ZO=MnnN-nmrB`=QMed9)$edxp{*sx;kR_1h@^49s(z1 zTb}PK*cNKR^12x{zdbd}9l{GaZwIe!4%W270>d;wB=DIqu3wO*LA6 z>Nl>D3pK7%&iiZHF}U>*Z|$G^EhO!^_$1_UozI%tS^*Nvsm9-5Kd(Km%3z#LwlI z-iDApj3Sq(r?=%jd^{{_0n9<%#{-IkxY^KQpcNiZvUZgw)*Ct{%PmhH(PtO=uxWeQ zh81GJEoxF?R=3%kr{#ZqU+yRew>VV8zy0i>jdeUxU#bThg7o+?MWZA;BaY@&FQs$7 zZ%mzKTg^V5`>Cy?SBM`PmEjrps@%?bbD+2bUy@9ZdNht4q$n{d0-$e`7@5pnBQ>uM zzbgyTpgT&}j)Dk8thNmO&B@*zw+O%YliT9-oe$T-+JX@+kB^tR+1ZfGLkMaXeC2+$ z!Qa!x_y$`dKDYd1_9~dbFvj>Ua>L>RmJ+FYT_A*(?P>k8!6^C>=78YvH83y1tl2r6 zC;f_sya8=!HKaeu4S-ntb*J6=c6Yi|n`^CBqxfk(>al)FkUFe%b?BZ^akq}R@Z1`GxXi74v+V5 z(I~RQ$oZgN@RbXfX=e!MD^jQi`==5H{g8-~u-bdzzO`Th2ANbYv6O;RAi4)hwSr7& z${B3TP0*WnD>b9K$4V1PXt@_WR?(LQuSsm#lcSU;cEmaox zmS_$s1CG=ld1}AEHD&q0^S)S#^E)Ln#I`41KY}0?RKPUa?^c@9i2@)RgiObNrb7pB zbqUY3Jl^uwN`p{C|BQyVaU*EY*wa{a!wjo4bqf4_-94fh)j)D;yh2Y-Fu3JU&YCTt zskV7&*mdhnbfN{2(AM70itPQ}u_XZmUB7!W_44(?=VNBCX!K&qoCo%`1F&z#{#V6V z{-$RSM8Ie-;1T^4S*`L;tq#J|J$}1eTuA;k-rcvWfVU3?@0<(oI!8aG0meld#D>NE z#zKORsb1O&M@s7kHYfEx(lP}%aeD@l*=^WI8pe^~TX|rtbRC=hrqkGuRaM zVmJB;Dw&4B8^eD_IBVsef#_g=8zIY6``Cf80gN){?wsaM|4TsAtghp*!H(vCUAz0B zs0dWZhDf80GmX@Fijvn(xUFa?R5!oqH29O4E&k4|<@+7MY%JcvhObYd!OMQf z^t!sIWR!p123i4IEc}$G+2f82=9yOKd0(gZ)s2ZD#3?;6y>^iv8ZRTL5(OY_1`th9 zHO~n;-4+zN-M_=~}*|!^c=Sh+N)S^C_0OYx;6oHPGM`4HEzjppA9zJw-4$HQA zshU2zUw9_i&fkFXmJwrDnNRL31SDCgx=xG!1g3%?fO@}Vlvu$8*A0teCvZ8HJo8ax zCoU1njUyb^k1dX!;{3hwp;uxUX?DNgFjLxVxFqH?7S(0|d~I)Rg*2hmXD;kyi3l`8dC9boR-qQ^xRwSeI{rSGUcoEfuvxjCL>b>=siD;=9qH&8vL zxNvRfUYv-J+AT(l#)7`%4gh$$dPu%(PO!^3X>s=Fv0)HZph;FPdo?0DYcqsJBeS}n zt>o26a+6H1rbpPm?eHUZdQ=3c-De-@6eP?}m!BL4ba-lD`b*Udtg$WY;++3Fx_jdq z&QU0SB^pljH%9~t_uTMUKH8?o6#j6btm8uT&VIwCGb=wplQfu393Y5d^4y!yS+?7H zR07vMI4Xx?GhEm&Ah8vDb1vbTf~=a7TRna=P&8CYdaUJMDWHbM{(9lcja@5)1zNrw zhE8RSsyGl_MwV8Zy4wJvm*b$U&4M2zEx=?F^d3NjV7KXD>Q zuY(|Qpt8e<MqSe~&f>Jk#ij(YE*X z$A20a&G0$-%?2Q#4qA|Z-#K7nYh`BdN+%-h?#kq{vTThCUxvI4%!mF zXofQfnmK-xGWuC83r(2?;GW1q$$9V2>MoCvI$t!IP_%&l{Po?VmS8&}m6qc(%r!mD#AcHWqZwqTZFQ@= zZvGYRSZ>KeBzJJYYqUfVw^L+`6*XllvFvatg6ODy$ykA=Bx6de;iT~wd;=#Jw8()2 z=LRTTsZACBw|R!fWE-0fGQel9<9>4J@Ht0t*dhh9_2IrD>kmFfJDXAYvwBM!vvfKC zO|WA)%89wu2~$y5>*n4s_}YCU8M!#Ebe;}p3SZUZyR+WMEj`OYwz)^O%d6iRyyi8s zG#D~W&TFF$X>;3Fzg)kP$fElX#%&MRSI7x}vG(!l)o2UrtyiOqVgYc-gj!a&z_B7Z zDjw4QU|<~9lNyb=;X;54>DU#VvvOMh8njxM2~tAJm%LB944ew9JL!X0`Fz<{)-T5w z4R+)=?dWEjkJ-0mia5?R*_Zlt`lM|FBfS;%YMH%R3q$AFN#C#CijjFlA3Wn)Iyc@N zTw(1+i}NCQ6s-7XTNh9*J7CM#8R3qcM;GbKds>0hi2Y{GY-;C6}+adW!=|myqFZLszV#El&h) ztaWKgG}u+E8Yn;%q3Dzrk37Uh+$qw2fwacMPMy^Wf~LTGc-~CI)HHg#Nz({;!zL@d zIPz-{zP9B-E7^TE&~f;pX=)%wvXr|W=zxr zF!MO9gH~`P)W2vC087!O> zv-Fmfb^*k0IuUx>Ise4ns| zf!sJpv&Vp{#}F;vE^?R2UO^B9D_^4u1lc?A&m-@gI<}p_)#xgT=p53BP9Wkh8S@Z@ z)X0aere_qrfj6xLx=||Iu72DE<)quoHe!d_yI?v-l_1iW15PT~`%+JY$idC>3;2|C z2#q;1JJ%zoXFlZv0Vp-!(-_Q<4s9eWerxNn`C|YlrZxO%8ryiL?7mJNP_u=sTlch1 z{z6t@jjkXi|7k{NCy&FqFxIMV6G2DZVwk|+B$FZsmJ{bMZK5dg^j?pE3GTqzW!4Rh zFsM9;b(?xdGi+D3IC)tFGsh3vlVwh(v9vjHo5@)DU4?G@Y5d`f`acK`kHI4;znxk@ z%<%yi5;mi}9{A>MvrVdl(A7`BP!k#Sm4E;Od%wfsTdS4^OIjT~U7Pv-HZZzmEnFE=v7s^@l7!;cI@RzWpXED|S}0ruWc6A^K!$YYQoV{qe2YyA zFBFR8>EE>r{mD!ai)j=*e0MEZ*;=*|p|}BnB0_p2%spi2j}+h5Ia~-RzB>U#BQfV_ zF!lr<@HL3HimpjUseu4;dqnsa|T9J38 ztx$nmM55RWzL6Mh9LBv+zJ%eciU7bdyn+)hGspZ~I$ym<8^y|rJSrcD!nip+C=kG7 z{eetSl^ufg9E4HwRoXSPSM+`iH4iycMF1G?Wp4jcnO7&4E`})0lEb&ny&tk>Hra-Y zyHW_uc7dH0DbC$#>aE`X)NR%*hE=vxMtssTb3`1`J6u+RP%bV7LWZSa#r@f>v1Wh( zB+}YNY%gFl)I@#NY*M|%sufm!*BoHivq9D7lKF5pERQ31`=!6JRlSEw8`X+?-Vu|s z&u|2Jzru$)Fyor@*0(~cJIA(8s3*qXsRQ{#bS;284v_*0RX&y%OGldm2{Xmyj4z9~ zMfByQKzq2ZRi~NT@3#b+3&dC5IOudV@yYnyysVgvFMiy#=pRtxEC)#5kwyUVC|{_R zwumGIor~JGVfd5z;qE0@3GbkaUVmCCWeM3M60r(p zpIh@{S@Eu0g+e0PTiSSU-Nau94}uxLkd!H~2Q6k%Ck0& zNw@mFFwtGkFJRp2X7;6wA|(O@SwUUl?-BQrD%Cg5^O||jP~an}M9Jtw?VuX1hBt|b z<2St~woWm|^lWK*DxFUzrdEm(<95$td>MCU^jzm7b5rWYSIZ@ai{RG{(u;KDSA<6P zRJ0I?i@jhf)@_dR5wuZLgqba07dd9}SaQWevFE5sZ~|H@qZtj+=;Q#(j75BcYTxv^ z!PEqasu46z@FB|_8a4&&uvUT-$g-!$u9b@J?l(z*1FgE8|!hrjIbI?&1_6?4E( z7ehQD#;A-$FJJL86%IyW#oc@77ZTf*1KDE(0~7*h1gGK~F^YT%M(;7$2SpLMoH$c~ z0SNYK1tND?eb?$qdr3}r_z>8wERJ!6GL3QzsAalVSVc>lc&!2kb?kf#JjaO%PHu5*?kku zw9}__JwT@PR=_&BT7LT59{C-m8gM&iOmf$|Lr!nUr5wjQSre5G#~d0I**z}HE;Zge zSpsjz^4G)d*PnZvdhXoQ*T?ejcSj%5?uMAOY1}tFP)5XFmJ%y=6{2Z$Fv?-$FqfH# z+VL&RyD9)ty>bGOuaw&x&X6;7R+xaIn!+B@n;>lv!geq_axi8DjnOn1S&c%j z0F^*)dNy4({y|vS>Y?K zgYPWp9Jy#V-28#~IGx}iS$>KLlb*h3_6(5bM|Ywrz$}2qWQ(sZ+_VViT~iybJV#!w zPh6)~u6=x&rmZO__n6LZPIUfcwc`}M^SOl9k#Ler*Qh!mn2_;zVDakfr5~n5UTK%@9{(SUjDD^8jy!D1Z64w6c(~*O7Yu6FY1XFbRn7 zDlr`RDP2Ln?=AoE4_?D}6>`|RiABBLwdU@m_PK2vl=N3c33(*&^erP_6y7Nv9yo1_ z)4DD+T){ffBJ=kleWX%XehctKvb9#?Kzk*-9csY6jf`JEOFgX?EgxuPCSj0XyQccv z5S)vkj_2LMA0p(sRVpNb_Fw{?kbsw53Do42#Hv3pai4y6b%a0tx$dI*rX)6v)F>#q zU(-JvtG`K((C?fhU1ow+pEN{KlPU~T2jq5iaa_4rVa~?T;?#&V^xNhbO>v;jd4ijj z5;y_J&=Cwm_yE1=W}*sSydNk^Pb*sG57fC=68OFB_@|3b9B_h|!^yn`m{Ph+BTqne zO!G9Cz5eR&{g_VcTCv)q!S^fCWOeaxNQYkqOdO$V8ohQFfWC54^smRs1hkRUshuj3 z%JM{(99q1?*duECbgrxS&b>B8W6pXq2M++H{(hP?=&@sk;|sZimwc2CzJOJB$_g*% z!18<6UCZ(D4{iaT=dNOoZ-~i8_Hl6M@7kOc@5ul#X9-;L0yG|**Nqd`Ok9R`r9U2BFHM!*2Y zBZTh^s91=AeF)ooG?lwz8^1r(Nwi7mYUwqlb+GaM5Fp@w$K2h9C=g632YDNJoQ;k| z=-&eyoPNateuFC1`0X@3)HR+gl-aN7|N3;f9yx5L&s0wP^5k*;dVtu}IP5+d3+RE5 z-WD{xszj3W?r=Z%8iW7rSoX#P9H-{5jIU28HR~O$*Erc7GWEr@(^@h_^PfU_I1_qJ zu$1+1j+~{@^?@0ds2_}4K~u+Z`%KN`3UEM^zC&Ik|9=2AK+3%fh}|(wY=DBM z|KI?iCJyxk1mP#BnYt4e`q{bZkGFe+pC0m0N@Uf>*`P(MNof; zX*@N!*E!(OARKm3M~Wh3XyEE4JJO>*3e@tBdQ!+PJ@`+<~ z(tj8WnLpneZQ_{b_{iVg#kU&4152)g8bLC^FCHD6wrFb;ZorxO_7~Q-cRC=u_ zeyJQU^11J+Lejb^VH{F#=8}8l0*Qm4UkbNk^b9f_-e`MF^!}VpPPsP#-5{4cJZy6q z{#`Kec_tzv1js{-jyp}ftcAZ{@Xy!$96e>(w_w5mN>px{%VtrnJZJfULCAmHWZMw6 zLktQsWtPjygbf1_^GKg_{zU^PZb{0>eGW!=|BYn3yTz-O4txL|VGxa!NWHBa3X98V zI?t}5*!Y*JWo@*DQ2FTP3*VIahU(CX0V$@{k@p-ezF#{$S8(Jm&n;jpBU$eJ9a&I- z!j5QP_7cT&X$Qk+knrz>kc@v^K09xs~8D$^!;BGhZp$xnuY#(ZskjmCbppTEJ##*+ULyp3c`G4cpS=|Ph7P+^t-5o zKy|RR4*!$_m(^mdn9|sRY_}%*=Z^XQ-iMr9!!!FL8Z%aCxux9kSGRwtLX>X^XqqNL zj2|I&*fSGB)TiFMWALCe+MXcU(Xeq{%!Gx?Br!SW~^|HkSL@1a3racjXFT2gq7 zM1}nPY^RrBP04^PtkPYxN>{N8s1gP>^B~zP%FHqfI3fy&U~$R~_9i>Ip$JropNOBq zW9jOs@BC{LV_ge-es+KKnkn~nX(ll0TOkb>pueHN7EIHZsS89!pXksxW`Ixj%M!VB z+-3%(kji3Z;1m*YS=vl7eozTYX1h|n2APq9`;WC6$;dDyRA5azl9>#+o&{>QqOTf@!65KvFQy1iGGVR4iN(VU&X zvcY`4w!35ac?o~0RSkw_Wjz1>1rYLt-Bc=7n6~k`|Nh=Q_;l1iMkE`D5IV$}bahbv zt&j#z5a3Y)fPOrT&R!Ucw1(zJLk-vv4TpjJnujAb2thE)4@N#qvOe&rx(lc%6iWFi1VHv9=h&+| zwrAQ<=8#fukwzhZlpjif8hm>2N&R*Ll;G25DXT=KhVJB?Cg1_iRF*N(&q>cIBt(TCh1pg?8ozPcptEE zNNbte^OCsJt+7z-pzpxgGkzBET0IMRQ#f48gRQsXVC#~#-Zl=la3b})b5+uH)I2dS&8Lmlkhl*_$QXI-Ss*n5lj>vtzT=kqI%uT>Qvu_p7h}nNh9R( z$IWGNCu)?}RZ(#&qj!TS@B%i>?;3Fd+JAq*_`2TGo&!h%nqJT9ItF}*>eB)SZGvOeZSFlO$aEw-4-*W(05Y*in|N4zGXn zt{DDHf{_7%xH*K{b|()zFHmE}FP{Nt6<8_q5MW@#U<|U)t@n$N#Sj`(M_cwYhC1 z$M5$mWY&~R+)$1leoA3fo;cq4){e(^vY8u?D@#jli3vq&$d(_8{ofBjqaUOwCwqHU zGjYGzjqXOH0W<*p+1hBg_HgK5cW{`t8grY5=^fHAo9(N={qhoZ4rnbdN@#!eN7LG% zeNx&}Ap+qK*V=u~Kd5}C|5XpbgZjRIt`@aPS@BV2}nmQI6CIMyd9e z(K@oVPUXszY~*J|1ZCz|kYe2H^H*(UG!k=J{Hod&{iXaU`P_T%wdgI@I!fbJH2SeLL4r<+;kLPXV75 zXGwfB322|&g>Y8N=S5NL#rJnl4=?p)tgSj>O!%JfZZ3?A_tE>N^i}b8wHSEg*Ye5C z$LdZrm_ZUOf{YErE9)5Ih+UW>{OPGbo60ggk}{947gCUaQ(jY8%p-rGHHoT0!w(QH zG!+Qbz}TToq)ogKeX%JP4b7hDQm>KkfmZr~qz1l*Ax~$IA~cFFmyr zAnWFZkY2#~)`$zPf=h3dL`8v12i26OQoLFZv)m)60WOjAw|_0-TPVYHOHk(OsuntR zk&Dar)!^(>YCvVsAwVxXS5;WOQF)bM6j+wYgww@bBnd4sWXONC)2ko2v@Bg3t$c)+ z296doI~VxshXVy-KsdpdFCLP;Zlqi1p|azhYoi8$$T39JS>&bJ)oJ{-651+ zz&!{U7ZnfbsDU6I;$W2e4S4qkE>E5%g+@303$o-mCV<8|@moB?Oa3V3gf2e^ga`2- zdO|J}`Hk88j4U)ZP^g{8<1q{lvgRE4loRqPgoLSw^OZK{@NsdJg2)f@tcb>^Xug*7 z>Og{4aNHH@eIh#a(Cv=2G=zt&*Uc-g-6Mb&i_X(X{U=Pp{3P(TF)7B3cmN@lW z8NR&yv(>+9UIHU?<-2YIv2+*#Jj~GB$N60M_C#bRm943WCsWw~ESeCT+q#B&!k;LQ zuH#V)(XgQlTg5cKkquaL{oyEy=dF1prz({rR>CTR1b|+r`8-R1h;G)EwQk}BvIW<% znKJ%TQ|`x zPB@KwZBwmi`~@u-Re{XWhg4@C5^l&cjmq4q<(MQ7^JyzZeUeIobPTJi<~xPVH)ssf z!gA#;nyHLXkib@d0KjeQp3}*Opp zNy5bjT(CLqt5TJrWx6hbJ9zXpMd~m|MGXLfR_uVtSs_}T#yq3FYyn9DX{=#jqAi9+ zDW=if1+|dboZ+IR-UxL4_$tuCbTOG)Fv`Ui7AViYiq<%Pg8s=~-YLj#Zs5YyB{&Jd zQ#XtD`Z_;Dug@fgKf1($2(x$b7?2tbv|3R*nxf>0X_RXfE1>drhUgblSxj4GXRt_P zlxkbo@i;b_9GMu*$)YvKRh>0%TM=Gc*8;EtGE-=QqujRQvB)NQG@nxW433_Fe+YGM z$tk`i$V91sffz-2^q`UkjojQr;|_M#pwL|&69%C>apQiL0Ec~#{`HM}KJY)hA(*Q$ zek->!h=FIV;V`QAEDh8L34Ve18Rzm5+^9O|Bw@SnI4NUkijk-M{{)fPsQ$~BcXxLi zcRf;aboTc4UeaiuOXgv*`beRG&SNrx{o*9?$1BKx{(lC_?fJq}Y z7;=r)3;$;>pw5qP_OlIIgLk>O;mChgd`ZWa_Hxek891YQOJNSCV{O+ zc{4+Qvj$F|qJ{;oVoax0uF~(xbq>T%1S0`JAeSnsF@T;E7C?u803=k!dBHN$zLv(I zzE3XMPD$W-FH+y{CsomGC@zzdTn6hGmZpZXAj;pK*H8N(2Pb8@FUYGUgo45I@HLZA z^$zV4C2iuL&GmKsZmo^(ZwPXb56e?|f6>f;aieOc2=num(rY6APxf-?f&82u- z6Sm=7ZCnIv=6CkvxDEI6`M?d+74a;SqNLzU z?aKHL$Irxf$m{CxJ|~F_8eFW7|8VRwx>a3`Sc?AuBdxEC%ZsbWM^PXBL6l7loahgK zpDUpkZY&g2go2%2mGz5{N`KdN#(x?`qyo}pKSgtb(bo;Ygjv(ym{IM^KhtL8Z_P+H z{GtC62vsN*rFeYwJXY`g>%ac>;^u|&(?=r&=W#%(iqW}AJU*VXD$4T)r`jSU4G9`R z9)YI!7YMwJwmmx>X8ls>n!Z7aNEB8yznb1E(jLFUT6no1S2 zN;PPgp2j<7bP=BL_{4V!?yj?3zoA5&QnR{V+E`sytHXNO1^L1hQk4CFmUY;TI^yfs zVTNAz$H$sa_3_ak>bD53asMVXXxa+fQ&W0lDt=Sfx+=amQ_+r^TybXFTMtdHIU^Z#+n)JayT$R>h3s2F z1(CrV*{}pdfG_MKtn@5@dAmF~ogqEKcth{dxUeDA$(&@Ap_eKhP zOdJ95{$;%YM*oP>9v!$!dh1m$7T4Lmr`|!mJQ~L!z&JOVutVXfL-WYd=XWoVZJ7<8 z23S&F0OFvk+4A@r0Imy$d`)|R};Q3;@bZTFSUzRuxjVJWnlsVT}e zTGv6J06R$yG*z$X;89D0fhTX`$s$JuJi3le${aj*kT8=xjWOs$iObKB9fs*;!NN8Q zGGh0i8CRr87-`gW!)D;4?*IZjj4wM8(%_X^0|8XZY>p=ltzg~H;ew!jq&kr+>)EkL zgcJ?j7c|g+GT88tBQ{h%LE>2Hgs{fJqHh^9L~FuY3~2lbDfPJ_$D@usLWZsLl|gbxVIIZv z`sH%iHv>C|=`wlSlm{E6;XZ5H9ERPq<)I?{~xO&#T{)y8vyMkyB87^U{{k#cBWAkp7tNzcjG zfEI0^WR-^N2Ez|DV^)az{pE%(x}faqet-*q)T%-8JFuCG&0EiHDZH%Gga*%I1(9s5_(omqca)lo~; zb1X}I0#KTiMt@0@i726x6gcr12n1{5}+OFL5WMZk8)LB`zp}4Y5xn?o>@ewJ1 z?gsf0A24A>XEMQ00IXpz!Tp0J=$D(j7+>usWqta2S`O7|HI0k3WF?18RyN0)LY;jy zN;E30_8@tcYHQU54Sg>$9AbKzT%oNYwM?N^`bxOwz)84_PQM^)lwO(p3)9++1ZG5- z?Usd!A0(t}Q{_C<3tf%RL8QP_Fu>e@_nSaYrMmPL=)wh^W($BD0s}io`NDP?sNs^@ z;S5n&)5>bqlFfwhat*P>H!YAeb-Q;R0?!kp@`dADZwyxxUw78r>-c{4zAW8>b=Rae zyX*e|)!d8mv~n@hAVk2m%NnJni98g@%JmtfPN*kYKbx*kPT1!u>>jo27>uibHtj*v zG)&R$8@3t#H;YWi8$fwlb(^ZiKn!uV;Gi_Y(rvXwp$DlUz=Uim(FP_(&gFwBSi?f# z#a21PH3t}0Ajp>qy*b^vvpXkQNp1o`nr$HmidwGTW1z)M)*L*wMAZ&)l)1W49rN>c zqUE}pr{Qk9-F}HplpKgw4$riIrZ;f(#iD;sj=id!xa#d0O(@#$KER#;I;RH59R4i)3>p2{TJS= zmsAfl2R^$Yr#mD=1L0DH-;B?DP$j%OwvtLAPU3cB_ZJ+Soi z9PXfqOVR2c6&fG-jo$x%uJX*h==@`_^9iiFT=|Z9)UoN~rQ~OHUCp4T=W%q}PxOb9&hpTDM`O|!i&o8EElqHLq z1w>^FOx|!OH>!s_o&Js8J9YkInxnZ1=iZA+i^tg=6@F8Gc9_bt84VXF$*Jv$%psjTszORxG=e+OW_INwWoT#1PK+&` zEnDhKqs3Ej9)*{G-Y0SWHAZvy8Cu$&WZ&T5Q}1fvhS)tw>+QGBqvc{HZ@xf~v-H^vpf6u|^LytZ@gs8=$YGQ9so|@CQ;cS$-s7vCr$*39fffQP z0NwLiEf3Y5fL|fZ64)%@hk<<`&=0c!LPVqk1-4{V6o-`cwH1!-7-)VU8R;-laScwR z5V%JmzYDY?rw#rd@$o`?IQpCOk;Xp)7KTpAluF~-g#Mrk789`Z6Or;Mpwm1Pl6sp* zc|@peqE!WxV5;?h|ICa&SE6dy{mqsyiTeXB6-4OnBF1Wgfqp>+#~nx#px)(h+=4H# z47Ms@69HMmpnU=W*wF(2Qz5{F-v>b9ob~~3VcY(iDUaohZKp(-p_EvpcyiziJxiJt zjDr-i#zz*am4B?`*qD_${-!Iqe9GuYS75-8Ny*IW%+-c}eKfWV$`)~ejoYq{`<-rX zOirl30On(K0EO`sL|ahwz{W|Jj$G=BneNgnS$f&5LfrtcB`J}Zysk|e=J?Vi^zSNY zcTHdlfw}w2$AWX(KUo(ZWQ*%Wlp8u_)#fJ|MkdYf(&ducrYFF0FPGFd{W!1YYn#1A zrvPlTLNsu-O^CL3=&&&TJKwS2$<)C|p_ zxH)*zsx~jFeV}{p!1X$SJi4J(+N3JTU&24LF%o2PNMwoP-_}2;9i@SX!MA}m_UQ4< zefYx8+V~X59^lb<{1zQN@Qqr)wbJy^Vb}|xlcUssv|>-q)eZSEhd_1ICQ;clHHd>k zVfUPsj?T|ap`f823{41tpyv;ip`MDUkOp&Yboansu34%U@xfR0`Y^>~cfl`uUvtdu zGo?I?A5hdN7woZ6C0eM^Sx{h~Q9BoWoSF z(?vdiD2=J2998(0yulOd3Gj8LI=PqIShjdgx0g#pf-Re<7ZkAH`Ea9@M-It+B zlVFZA=QyK}QPxeONwL1!hEdn(DTZ`=sy!YM^Q|(>6Xpj8BwEqXea63)U=44~UByj0 zJ*%=p^J0*H#-yMcI1bxDD>fItUZ|8ZVa5I_J6NbNebm2RVpza` z1WmoTJTI5a!2&uf;%f|H^;EaANJAMw058{AmWBx|!osSJaHbg^lh}Y0D{x|^z|Zhp z=+DfYVuDFk!css3QyInvFxCoWDRKgX7_Lfs_pjL zdX?bdtf8*x8H7qLOQGY|BKSkmmllTt|0k2tt~D2X7QR~@#3}frR9%jF7JQ6K-`e0n z!9SB7uNzgrOOV#ZZwub$Zj*9gxZu|k6izs~;IC58ZiKqvGv8!4vLZdai?qLkw7=>o zH&Bx}o5k`lz7{ze>XmGcC=g{$qvq#45COk1HErN;b(3_uyC_uRlZ~(RfA04Fx4ZZ3 zZW~z^MZe!)VR8BK63;DdQo#WW8Q8USU_ z?0sL_YqkY88Xc;;t1B0@YfLYnQ(B`OHx9{E=-m?au zuE3b(>Nsk42(F|dCh&q#e;*V+`?lctw=btzTpA9}2AUpf-VJ4Sv39eX$8)NzYWx~L zHNW#H>zhgJjJ2P}kb6p^y#L?8Y)~-fB7&`&1mU3WN4cssc}Ar*de9N^h^_s1s&e;5 z9)!)hhMg1x)~I>N>OfS0SN$|#YaF0FivD^5Bd_}Fl}dk!YIge@f8BU$Fa{2> zLz9D|zisHq;tGZ~x{cIPyn&AMn1D&cfVvLM9b#TGpHTIIVj14A#y}Xr*^Vm|QKZr6 z{(T^8t|F9XVjTdJwHtIK-jr9Z;YZ*{9CUGeZeid(eVEM|HYfN0bLX|XwG(gs2hZyI zsChyg2eNVgx{up>e^VH@E`v9HoVs9XR#4&}pQ3Sm@PzrX3iT0_2XuJ9)}%G%KRZV22 z@xGjorHmV!e-!p)X4yQRafYseuqV@T^(p-fV=M5_I)-!NzZvYUTI{V~Qy(7w2w^?O zohWr|Ixbwtgiwod+OMwSPsQgx?QVFuLIXSOS1XJj!Y;A>$BEqA{b)T_qx8~zWJ zl)cpG3{3#ZIOMP$axCg9Q8$4zOH`4lG*K@|u)1I1e||jBMqK;)?|1$8L&j02rwjGK zJ-(zp{A3#S(3LR8XhJvWsb1Wu@_P1-xdVR2pepphaa5-D`3wb~H|Aece$eqz^f&q! zwW*(>RScem4dGvIXI|us8<-SJM-aic;wM)+jxVSo_)Edb@BvyQ2_*$3q44_f-QwcL z3?3HKf3k{i@UUjzDAI`bCPJ;<4KlU7q0KKv=nP@%mvr5M9BM1ctTqLH<#p8yHP~hD zUY==Xy+81G8c$KWyWg%&P{%+tMkhnRvFY#a${L)ax+%dAK4cqgw~rpXT>fkx$nTHx z%C40Z7^ivJdhwvMHF2CCW>TWp;g*h8F=XwIf2SK=Wnr5~mtT>Si|4Piuu}8J5?ZxZl>t#rhri&Xgni2 zxWX8JR&nLpRjK{HvI@U6&^c8#wnt%(kaztd1f0%CsJVSKkYL*Y_znP1+E0`T3n})G zf3Cexwf8$~i~XZ(f2Z2tJ8OFz$cV)3>YCf@19`{{Y6b0lAg>u90JIOHYt*&cv8{AV zUh{x}T)PjhZMP$|W1cv9;>T)W7R?uvXx#n+??W#lCCeL0GDPx56sl6u&73S?ZM}HI zZcwMF1DHe7R3A_sz@i z-plXw^1FEnN70x9B|thq@O}ysTB}aw93xGC`}+h42q4>W%tLjJ;Bc^7(Dr;9NSXg{ zBpk9oE5MOfEu0Nf#Fv!QYQHenf6A9ozF*K@amiabXtu3HB(|o&plAF#&M z@S@5Q_7+uK!__D*qEnfq(sXI^6yT9f~g~ZIbQxclW|m7R_oZFVs6gHNart z(J!216kPK5stN*(OOh{8+dMs*^2K0l>MvE*-|hq7djHAP5)x>CLK`6U<^DAytCYr5 zJNhF*=DU^yR<&LI=5XPKe^Gd)00>9MbPSadrEP%_LZ)@c?}~;D{C6La`aLkCk5k0G zFo~^ixDw4+g-I-MyS_&B4gU9T+LrpYy8e!p{gMun z6s>$Jbz1-n4(}&26(t=`0L&g4lP_ULG6V8Ewx(c~S+OOH3-eeTe{(LwgBcb>b7F$y z0B%bB;%KbqcfOE(Ob1s(KiLYzJfC9hUHwZlW$qWTX6|Rbkj#vzs##3KyCAP-pKA*P z^w;;<8xM4Xzw}FN!?@JU{Fwssu(Qt?>Q;N^$1%CG^ABbV`G??wWr+i;M1(oBX zJDF^~VZ;ZLk6yuQml&PXZHA*GYpY3HK{R&uEw;Ocx|S28e*!rb-IJ`Ni*zkdan{qR zJbK24?E%o8T2TKmZ7AWM=MAmfUcrLqhtsCE?XSG80%|CDMz@#k62309u<405FM89w zKBfuVG`_J`4{r*h_~BBCo}jUTp@fhHjI@hw0?4(Ryfcp9@F09VRBc0mjhzW3TA6*K z@xq>xFUk7cNwV zv~dB;j-t6;={xh3;y|i+@Q^ySrWcbBtlABpc5HYZ8DJul@_^jrbz%g;y_q}) z{6UoSFMS`s<3ipMn#50TXwRpHEq}ruzwxK!GqnMKqilj|xR4^PSphq?k2kx{Y)t%T zJdXyo%XX~GbohYwi?G%2dPc)|WI7u>cU zmLKmAe_Cvgz{M$S0(6X?j@gFa-lSQ89uy|%iI~b-)T^`O3@=D(Ma~i%gqaxrq zA!6Qg4%ZH~@!h0VA_vPC>%;o%*R(ZS`40VmuUQNl@B;IrmmaW}3aWE43JxC?7+;Yv z)nOK0(sU1CJe@+&jd8CcdVP9WeVQyWWb62%?*boNt zuBc0TUaCLR2#(<)Q0l*C5&0n>X6o`ZiO)iGK?dS8g=#?m9%8*;q2BXU{gtYlnR-?5 z2fxAxd^`UR-|*8%9DR!6)ql57SO(yVf7gGhPF18Y;tTu^Sw?=GruqS0PxuK=>#KZ@ zf0?1!6E=)%#TLQ@FnmCO6#y-m7$5I$IC)iUw9rYsaaiOh+QOgw{hY(V1Y;KI=g_Md zHriV%ymL=z+U?$Z_9Y|Wc*E7EU|u(I-{L>94gTTCh{@nN86z;H*KcO#5thT2e{|&^ zgAiW8H$zygD8_{g-1t6TH@=U}@qL7*f6y*@mf$XUg-qljFaE1SU1ElxcgXD?#szJb zj5bSk7^vdV?Gb-*u-;eNd>hv4fohJ2#{@^5rj~T>v-q)!rr^-*Pa?}Li3mq8y>e{zC=2z(QRlS z4>mmB;r^jB_yLVPNU;>YKOja+Z4N_Bz*h1|Ht#r~ZEX^`wzjbD5&9aat!;j0Fl_B$ zk8^l{{+{NTsAubr2idK=0%;0$|=IeSV2I_zouihBY!XHO$kSbSWRuxF5N zPngy(4jl#Ax>&8SqKS|vf9;|HX}F^KA^QAG*4B^;_F`JawR34-9MWZYBJc$euim*O zodFb@!5u=w_!~n><6on8@i%QNe4fLtR!o4TFcHp56SaE(hU}+K7=Kq2$|x%fy*7yL zC!1PV28{n?rpJe0VfbioSQxBUVe$z;X=y%V!sh4i!y;b9(@K9!f8;^e4QYt`6%<1Y z3x75fPG;%Dj`8chn zopcSqF?Xo0$1;aU;?;V*A}b-f(DB~(_y^Ip@bHRvPoVZ_ z#>X(@FNe{mdvJ%r4FnetuzYnii~IfFu9IvLD#Z4+AL$FNe-xm4CN{<^&1ak6K-ob( z8#zN(V|l>tA$NqqR2x0?`)e;Ub&^np!CF;cUA+J*@$P;6cQpDXdI5C#X%gWr`7QBW zB`>;-N3=-Pu#AUR6Hu8$g*HFhV$exfE&A7$pw8yzJzGf%U7LbdC(5;f6t77FdE^-; zVN6_NMP!Zue;bURGECZ?f<%~gKbU16FwPGTY2SI)bg3n}q;jHFW9N)R_$s z@IzPy{fUsG+G$iYJi25~lYakOqTPp@Vy#9*zk@^T>^-x-I~*_2ANkc4?2Ue3uQ}do zDCI)g*ON3d5;1~_(rzM6XK*b5myVJR08q%dYD1$WfArpGgoRHUV^JJBT>))VxPtY@ zpBAub@AH#Ux>~SeA-nbyfX$1pi`Z0Iwnn>RK~EAK4d0kZCmiQGD+RAh_bN~pVW6+b zBOYTNpj6xZMW!2{d*;VFwcg`E3&=ZT00kh%C?X37rQlc!Wr>NO@R^cNQCtO}o@Z3C zic|h`e@-zOOfPjo#b)5^Wzz7Cd90!^-om zb(`^R;?!;ra@4d{(T4&P-Q?LW3*ZCgOf)!`PJDLbk96Q_D5HnaIzCh(#%#mHvXC%S zsrF?p!)mF+;eFIb0>3xC>Aw@r`W}ZSg`v-ce=zi0rX85Rqdw1`A`$%3oiZJZlP6>8 zM{MUfaqhk>e5&QIq6WN_F*pV8ClAA-<~n;xbZz{k@m}I5*s(3Dp7tfgz#z5BR1ej4 z1?lax%<8D9SxX3yFlZQhR^#>2c?Vrx-Mim?IXMV@K{4(}lu>-l2q7C&7Z{n&@EG_S4rHzb;z2Apr``tuPL95U)?70eBQ?a4|4}tnMAACQ=bRi;+ zH0_wqcdYwC zm!VDhPIDA;`{wQ=<*BGG4SOCnDtq4Xe~o?H`1I9bGsGI(;jEFt{ODiA0R0Qo8ON+! zMvjX2epQ(*r(N4As)*fj6I&X-5}A3Ph!|THJ$mVy+lhjB8h*?l`PM4$t+f~nfo13- z3jQYxw5gXyO608S-8|antcZr=!iCB#jFnFsWuFR;2mYImo2}9SuiJ{^Oe(bZf3_1F zby#ejC&pfXOjy|qSLO#DYon%vM4E|HQ)5&v8P!EW2H`Y8KQI}&3B|WEsiiVnt(ZI@ zieDlV+WHc|1;nf4OI7Rf5_&0?ameF#eL!Px+2Iq7=DY$EePM~^E-VWCWI^ka#_z>% z+)w;1343lr`x29;+bhgQTUi^0f9Uk+7jhe-!yxQw+lkW3_VjN~(}pwx)HbnQ4>Y|1 zm*8OKON{+Kx{ZOkJvqjA#EWJv;z)A^RdiIqJzL#KP;H*gXq#_fWT0n{3&409>yJ5g zl2&AxfIT|Z^KUGGGy;MR%**E@`DlO4Ovks#0;Dj#FWIt%t#4>NvBmAqfA8N-B(48B z9bv-v+hG2VU#A=yl7VMR$14Jo$NLSmj`!P8OcdnUBTcYYBQrL=$AIgS77$`BTrfqU z{t&^(b6g7YOR|{!4dPI1$J_7Ye||9FejoN+qs#(VudULtPz!7H1Q6C`73YvDP`z4g z0GY~cfey1gpt#8HW}&ckf4GseAlvXu;bId-d)b`*ZBG(JycsL14YISAPH{xG$KL2& zT*pAft^Sb2XCh+KQLKaMCV9p|(PYVhSy>Ew(1CGkH!?GKv{~ZmJ5@{_ifRZLv=&GA z8)$3Z@7KQ+?9oV0`!xj^jsQbusy2#s`c(vD0C-M2k!WlRZpbOLf8q^JD!b1-Y)YHk z6~877NG})};w#!K`h(nlK&7^RuImSE_^;_Z+DrqCC=0J>%?8|~GVLSvtAm)QDOE3_ zKFoB2fk5VSZh@*X7zR87WjhQ)P9U(?@lJVd1lkal{B7bWBmaGeI5B#rK&{TX;4(Hk zFO{O=f>cf@j)otqf65oO;9b60vOTF)t`d~|)EK&OU@TWX!&TV*Xtx@h9FU?bjKqmO zHs3+7XeU^wdKX=!n&ZS}YjB*E;5bP;Z%jw#nP*Y{*mESm zT-xv*pBh)=e`mBN^>g6bz?-+?&r$D8KUeqyV{lUG2|hp(ZR3TE7mF(jz4soN0+^M3 zM*UZyY~94fmRWtmVOQ15IB)OSB?jD zr4mgof9an+?Y>FsI(|A&`29wAs$c#@GRT9r{#M!L4SXA^h z$A2+S&yAxTH~`Z4=%9Am*;AV!qXXz8?GbulJVM_uZeY4Q`X?sC0sV-I*tz-1BSK%t zMh7P*Fdsi*+&zAJ4gK;1&gz6??P(uVvRJ->f40i>4?7d^OD*eXY}-6y z>-rhnFY+Ur8QL*xn6cw3+b-W=t7ZCw-NNR;%r@Gs^@jH0zJY?w_hc5#-n+ZPrFYM` z^fFA?bXj-BH~bB@aOGMw?z1WEIOvY8TRWX+->}T#@)-%$=vjTlw6qw9((r6$4J1fe zf8T$c7$T&s4eLLxqsPgovi_|8JdCDw1EaskvQNX$jcCVEk1aJv!5BvH=ONxzy<6`O zgC+cYli<$==7#due!0ZY@b;1a)?nf{h%t?^y=nx7#RguB*4dZCMyUE6?z``Gsx&x-ULL06TW|Zj|G2-0WG>J8C766e;h~(q zMhQif(&`-x5uwtguNtoJb}lPi-kplCJwVYm?^MSOpSx?|L|y|7jxO{q@$Ssx-D@$fL$w+R(hJ0(OgUfm z;gIg?w}2me=4PhL*IaOPlX*y3evi_Z*|Zuw$Ka@r&}nc-EXujMGM2ULM0NMZanmMS zJ)RB<_)-TXL!+Dyvu$BTo|t@Re}hT~D-v#-t)xa~ILKe7D0*PKCKL!8@_!tM+WSrC zUZ)`DE|6j2QhN{YM>(eKHqoAnPx)t6M#+W|`l$u{@P9%Y(gK#(Sv4We^(*M{@qJO z^y#AhOwsSH)Jqqd?HHJFEVp`JzOY$zZ%mQ=nLGY~dZActQgZAJg&a^WShd62--APn zl3iRy+py_TMii?8wMZ0Vx`=x0Z@@ux@sQjiK@?ns^ZZ2SE!nyq==*(B?D)TomD*bT z>3#7T(^A17Gz!>{+ZhvJe^8W`tcmMkfFBNNiWy81W`NG%cnbIt4+MJo8xIdpw16qb ze9=PXR4F(ZOm1Zc1?{yu$FBS^;U9#$SKA7dXcu7vak0Gbuc-*?abr77qpzmKXw}o` zW4g?ubmJ@VO#{P)37ckKWGfK%Mf4`WdYr>kl6*?LF zy41lSj0zs}lcY=326R@(9GpMV=+Cqyvn*==Rvngu5e?Zq0R9@8h)-32Q$O0suW?9f zn6Xytcv`Tr!A#Zkh(gezR^;jm|7=^_w92n^tb?Hf@DsVA?)LkMkPHe>UfsiXzzE1h zejVq&`*0cMWFIkM9m&RSyh+%h^0of^D1j=qSLGEJ zz4eA*TuG0kf7mP6j-$uXo>$!I0wiH zj@Himeb!PkNYpGkpPZTq%cr+`HnRcQj-8Ir@sJzpa2hStd^~jsXdX=oIiE#yKV`(+ zgk$da&s?~ud32^`?&n$bDjQ7IEKp}AVaz#8t-oUVf0>#G@IM%~M$FS_YB1CA{<)Kg zpAt!RJUCUm#^mY((32+sKNSM-^Q8`O4WPNh80Ql37~-wS`6Urxwb_Y;HDC=<$(g1| z9{sf6NBZX(&T^N+qzmt$tE)`9S>b&FID8ifqTNpy)n`YF;s}qgu1*7*#Q!<4nOL6(mf>W1qKsb0J7el(5Pr5s9m>eu!~;c3o6Tj>Dkrs zzhSM-hBRdsHAFEcYFwG z@a#L|&0#i{%%u@YvkHK%wnfwfu$cFRYn!rJ3>g|!D%llfPUrNPIkwbh`UQ2`>o zgXraDnAbP|vE)SwNe}{x1_oH`*G|_<^3+&Zne+-_H$!S;W^wUP_ zbP9GAy*?zm>wtb7013VT%z611;d4Oy$(kL$fA8zS}%;oI_M_uf8Z_D z(pv6Tmnkri;mB@G?(#J+i7@8laKpPWf5U4^+`Vu$ zD+hid2EKrSU)Yf?-{Y390-2}#tBuO6%`uJG4h?Q}J0U<+%J0HVifW2x?Cr`CtEwPY z)aTFBD5jVtjxJ3dQR)JI4N@|+q6BCd(#uey1qR`xNN+Uunj&TDdX-ntP^`KVhm6*A zYCGurNhYkTWza1e`aHkkf4(+ZjL2o4Ni1uU7;_v?k@7B)f)@j(I;upV5tSpHGCOxl zY%?|@l#Jx5E~OC)R6U};v>&1@p)leS2i1jxY66HloeW9@7#gpk{8iuI60p#xN&sdd zMn>$cY@lmuqDhqrv9ZjZ&GQhUw94cqUov`qa2WmTe--~LoBZoYe?7$KdI&S^a9|{+(f$+=H#;KE-lGFzc9TSf4Sce4^>YZXg(-JQokyC zh*CyHove|Kde+FDv%R?^WxWpzlPqwq&9)YG!%O6(ZrQ$jW~6jw=fL(Q3or-$Z~ z8M^OxeI#Gl&l2<50q|)_8GB#oGE@0C+s9vZT*t2x;H;}@dF*}TzcPVYo+g-5-Q`So zUV%>&*h*!dp2j3h4mPT9F}~m69CW`P2FviY7D*$?0N4RQf6DE&?n0vDZ?&hZP^dka z=QgXCGKy2Oy>V{nyQ&73Cs(?KP1G>Nm7E09!z$zc(Ru zi}iKw%!9Z0%^qW>-pz@9T7!*O0H*?-EEy|i!I;_*UM7|ELRizW4^fFA4f>m!1(VZl z#D>>fP6S-hy!g1X=YJ(dR)o=M8*LgBKTUf6cQkv?(XQ?G@Ec(mGEXhy(**Xvfw+qg zJRHYklki?b+lJI9&psWWkw%u;k!5CNmwHe`XLwavcEhVxCn3tYAx1z(pYX|9&fuxjFV=b zw`?Xri$Gk^ihpbJuE`9(-u1S%C2zN<-atRasLHb&?x;pn?u!ilwVjVx<-WMoL}Mru zB0a(P!(T2kOuuRq&K=dCF0#*x|L{F}k*%+bp}b(cc#++@WvbcFovL2@jJ>MR?(-~; zU^uVfK7U6~D6ROtie6Q2xJQlbx|DWQ^PG67DM!fWWv&L_Hb2iv#s!a3*~}e@z5+c4n6uc0Md? zBdOtSOn++l0%{=_@B&&>($n!~%P_=SL2{dDjZ{+u1uD?woV~og79XH~u2FH|VtJ>y zSVcgN>?vE*HfJ!rt8N1HC}<1EfkU>%tSUvs;E>N2JU$}v7d=2Uv1%D(;N!eyyt;Z- z;puQdRs_pf!}6Uir?dp_TwV{?wN`S<+xK8f8Gl9z&`a_=w7B{Zv<3>yqu45DkU_|W zX59%v>Cgi=$u8u~ccb`7xBQW@RG7dM1`0Z|8H_~iY$D-qQWjnMOt^Pd9L{s?tnT-Z zT=Imo+C(&rqalzd568~i?uak5htUYbbjnQS#-jtRvVq@({WMq`2AbKl3i+isFP-~1 zHGkCPkw^jp6=6O)c;~GVaA;5R!NXKNtLVtuz~L1GXW61D&N4*tZ!?&~3mxeCBc`Xj z8DseioZAyUn6oMxskcBd^c;-;&{nW#*{8RFw?9W83uT{Q6xe2r4GLet-|cp~8Gm{a zW5u&d+2^<7`ALPH#~LG_VMfrm21RadVt;<3B7m!@=tuuO!0brCpWcc_I{z(KsDfLR zl6z}-zczWk()INJ*csOmAa(pKhc+ZF1te7Q%P&!`(slR;XMO*^YwRk6j;;y>M13n} zQjY7?;+43r-;(cR?9$olr6bVceTDECsiC};k84Lx!}fhqj01oq0Cs)-EnK1m;eXF| zwYtj3_TwkjH~=UDP}kRA#Ge_u`s24N%FnvXIWalM1XmCA->-P|vSuRDC!S~VAMs#E zOSAAF*zuY1vLeE|_h|3s-n+d=JtgvhkpCe=Es8034LL-h5Y`4-M>jTG8nJ8FA*Z`R ze_DOi|8BeyKGb{?%|b517!fygglydc#po>ZvJi z8X;9v;U4fk;5FL&5TkLSZe;@J3ez8iW?YdO-}?6O-kqyWK8^^0fHU=6-|Y`uSqeBk zx1k1voYZLqJ9wHc$Wet(ld6YkzbHmo&6XBzjeU zSE6BrNG!g%WF+NFbgTlZS|LMP6VfEWQ(DX+npo;Xs*_5=uMhEr`f(O~vPYQ=N|LC5 z`GFGP9HP5%d&J^~Md=*%=Wa0(ONNeiW^b8{Nyp5Qj@Z%fhu0*aaaUm`<!zE<36B?K?%f(m_iY%1FL!t(7m_%^C1R2ahEvZB)5XhKqaRgR5K_VFZgYa;H4DW?g?nrS-4+-=(Hbygihr&nz}RT$mU`4NTpU)| z8nLGT6R)C* zW+F}r_heo~zv&^)xB*~>X69=h^Ui%+V^uYGU+Zt?DxM7H(kMsGEg?0J=6Y=N`%?t9 z2JI#eeh$~XS0aDw1kX?^@&*oOGTM#kGO}!kYcPdZDUwHE$UBcYrOrqQ>2 zFb60gkpz{Mu?mb3P9eNc2M7eeTx1J!-LM(Y+@rM*pwI8|V=z)P4z2f`fE`l--m@5=;hXJO}PQP-leGvO+H} z{nj%(gMS&HMQ7=NXTifWUoye!Aa!j!4nm8cScq+WTw&u5ujhV=UpYBhFu=$Mhidyp zxX2ejv&eQ~uC6|PUb*5IW4 z7wNIgnQPm%?b52P95_{e8Ha2!JoPUO1l$>n$zB@pIbNx6GC=HCS1;jT2ca|*z0k-S zT|HrZ-K`ioZ6W{zx(UI82|Neoxm>@wzkc)f`k7abqo9#YI=em$o7zKw1jLfH{Ef-71`!RhZK%%!BTEx+BK6d9(oY6$@}I z&!dCMnFREi59qTtpl5KOq07nKZF)GC=UoRS8>(j9xo%yH3Kx`jcbAM}dVAkf0*5)i&37QMjk6WH8E^X)X?7H(| z_?ZJHHTL<>_h_o#MQCMwqLU0d6Sa5u=SJB44u#F%nYQ@l-DCijzr(jQf)IaLDu{d( zBiw%9)%?@D&-$#qHzrb--yQMrJvxas+qZ3``Z zIEdbd`<8@y4=>&;Y!qRMR)X_J+}@0v`r7aRfvrMQ2NY`64vt95#=O5rh|u(0qy-<2 z=zD8K-^GZ&!;9}$A0xXZ2e9u^K?7>`2mn2XmZ7HY_QY{`Xhn7sJ3!eN-%WDelUVN4 zcOm~~5T3-X5ue0j$nbujmcMz2BJUS&YyZ75>JS|FzP4 z{yiI*>TUmP^>h3F*XsI>|7+D+wO=c-YVdv^|1q1Nr}Ou={R$Yor|s{irGMW0C*UW} z_ILmBOp@ZLWN@7+20JHzfi1N$@Y48YHoXCRN=A@~8|08hp)|9gx- z+yuz&s>#L#>K~IKTC`_4C!`(sqv?3xGh*2{vKP`a z$#`0xWUjZP*WG`J37kcaCO}5sk~DhN_j$#o3m`y#s#kkIpdY-j+rW{m;t!)1f9O~C znZc;dAM)Bv{k6H49h6H#DhU=4HP;17gmh+k9Ty5Mwn62n>U~R9>wj~+zly9j2-lHa zh-W3K?QX*+UH$i16qNN4E8>I~X1Q)p2Hha-*lC%OnXQ(?U`2&s0hYt##BvVNwwFb5 zIiPHVB|VJ-^+$o`Q_Rdg*LDD3bacw|rn&P0rdNVesG#eLn9Cy4?;nLRC>cK){6UfU zzvu!^&?u||zT1cz#(#)Z`V*khiM=#P=cAQ8??A8)vhG?W3&HjMcuz>c|WU=90SMpd#`$ zXNdGa(DowEkR|q{!V=mDwsZ8ohy&6?Txuh@FjhwCMD;>g1%Fb?;=1A{Fc%Z5t!#9N zrh)-=UtdrQ`@Ha`8eP&f!l9DG4$a*GpL}7hXXJDYv`e2iEec-J&U$WjGS68j^Sr~H zCo5fS5!Pc=8!pSR4TPRr5w{*frl1oFd8-Rj`lC|)8e?~gcA)+-8gWQ_tz&Hvqn8i% z&Df~d+y_qNxf@>*+b+eVXy#I$MQg+|CFxOrT8wp8!5 z5evJd{fZX#(dAdbx;jHtLvKlI{cu|9pnR;aOsDO#^4qkC=i#L`Yv4iwV)G?!p{0rs z4>7+s4^t=zN)7bL8zHQg94}|IuU5~&KDWlN51lJ%PJafM+k3Ak7H{x_9eKQ=pQKB` zUM2lU*oTI4XvH*jw3e72QF2qd!5ApWU45O-j`^26vaZ=btES*aL)^bNxsP)~A(?d3Z`diq)bWk#TH(|qK-IY6=rdd3j1&5Ju73xoCH5VGDu1uI6NInK^t1l<=-&3`_K<;KKw0sTMbk5DlS3y?WmlLpnqLEg z_%-E02pv=D8zjp?wC*{1Ndbgp-HiOeY#IsN1p1=Zs^R9A%`A(d-A(dHY_)8|KJ%ty ztVBDHaE04_8~RCX!42~$HsZK8YnWo(o3M^*UVp1xncNP>pTvyJ|D40!mBz z?0>@BvKMZ@UPKq(eof$abFdi2f*clg4;L*sF2cn0*!(;y10v*WJ2^55#z0_ZM~w4m zs4gOy7EdLKYU68liUI0ygCE0#-TFjZ7X4FXMNfmv#&l>P;>;ZLNg2{1NxVanv=2$r zbw~me#c3Bw#wamSnobdc0sc4__K72OYk%L3&TZ40%h;6`7s2IGw9BHmV|AoXos|xh zd#>g;w!&R){bG zA1;>;I2Po*KE4^=RdjnBT2IYs#hx_6Fh$X)GZ$FiON8_TAwjDKpd zh%TaIRYpfaX!ppm%CDkR6OfVasYKGz?NjRBGk*cw6N*mx+f#8GnXFMvx<3-eT)ClL#>5-#jT z%XsU~w(}+t_DgSS&*=HZpf1>jCN0?gV-CzRGU&qc*8~f>agW1&jYc6xLVt}~$!G$k z{H7-{CGLLz=2`eU zy(Z=;we4z7Lkx!P1uODV8-I$`j8kJ#t6BDOvp*e<G$&p(02DSq=Vq<)bIr~=fZ+8zoCEg;(zN7y(MotRc;N3oma;D zT8ABtqXZB7(A1%sii(TMR=o6}$ASsRso9@2Y5w__dlZbLv7&MORdZqBRUFRouNEG{ zT!lM9%szXijq{=hm`Ps6Gp=usoRJnnkSQ3((5uH3>ap15ZrCsRsK7AdvGK*QLu%UY z<1%1P)q-Q$6o0Qdn3hs%@Ca4ku= z)Z-a*L#1kA5(^!a5mzils}Y7Q%6v-OYp*tfsUi}hiGML0x91ue^Ph#|MuA5q%tZX> z*Q!rZ3NHc|^#`bS&68hho^wj@3>O>xpuSDZz3GvT9S6nUZxzc|?uX<=VZ@EECbDW6 z141&ral${%aPx>R{^KJWmzK#&fP+6$c~k_U1;i0lHInlSg&f1hasg8if+ZIe37_h~ zwFpgxx__NS!5vgIuMi9auT?J1%LVH??kU&5czcw}-=+GCrFQ+0Y*Q@QrWo0#+Hg&7 zUNz0D?&723z{td!iUee!_(*^kH*W|-z5g_S**O7F+sni`tRd-Rb?gV9R*%Ta5 z0|0_kJg8M}wxYr)-2ymh0-XZg4y69ySk&5EMt>&@7Asu`or_y*)cC1Zg@9^OV%#W) zD?PDqhO%CQHL%Q>kugF-sA#NKO00WLx=4StsnXLxEW>#HVLh0YA_hJZO2DpQJ|aa? z3*KhaMfokKyvtWtm>SSg5Az28NBX}%(oRLjVPLp@S51q-J$2aZCq-^j$7G^KREt&j z+uLE>h--5Xwj$%n;=Tazy~6 z%+cWo&{XLuGG})B)-X&2m-4<5U(HLY1b-I&kk*<;Ac7TCHrFoE;;5|P^uLw_7qp&e z`I!CJ$4+sQSClnlq}F9tf)nx0q7sRHU1T@mE{1-KgP?sp8CV?%HSWTfo$Na zuq;&TNQW`{n9;G)x>M6m^w*)>`V>5)g=Axa1*Ss4Z=-lzqTn%BoSqQ&?mRB5B7eUK zF=gPQ3=2u4{b#qcs~;J{PVZ~?M(*v7`k3pJwKvLW?v;L5G8SOQ*1Nb|J!RY= z8=I6lp=-E}^nwZl6kwMNg)h*h_(i=oGM zNlVRGNrkokz;W{4cec2p7k}Hrs!_IP6nQ%56d`;@8a$!1(#tOcLzJrJr+>9~*&lnC zJ?$^x>Kps3vQ(14hs^3Z=UTaofU)>A`W#G(Ps7h>r{ZsnPtfgWC9jaZ|GS35Yw_a& zeQ7`+X@N~nPlFa*7R{5=$07Z-k+K$04OtJ`1XM^vAbFQXUvnIXC80ASq2XWI7!rUo zD9E7%(!=pX+z_aD+WsY*WPc%SXVRlEke<~d1MArPg;{9vW{t_H4zQL8!ILS!Y9S5B zeiAi4KlCj+9-5>tnP$QY!-O@tFHH61el-Lx>KyOr;Gje-mCH!cmvIeM=NigIJoo5H2VaYXp~aZkxL_7&f*XpnQ)DT;CC-^n_7sM8j6%24D1os^Ap z__S`HL)qEt1HjFS(<+Et)@Pis^*+Ya9lAv9(I0Z^G16$Nt9jsD4Fr4)Ao^K$(sig4(H9tM8I!ds}W?uETu)vex}-YpDLoD{ciso{MzU8rtFy{Ay>eF7u6 zg`b#c)PGM7p}uXTXjZ=kFYFF$3TKwrUkLH++6&>hT#3>j*4>wA*@Z?g$`(>SDlO{V zD-9M!S7TOR0@v1)fe{xlwnMYAsxeR4G z(RNxK`R=k}tIaCV4ovQyGw{GL$8mth8<9x2Oux~r!x0WHhPv(jw^~TXTe0slvVb6a ztjsJx$OFP;F)b;8@_9W^_9-Y59XU7$x;`mi<#mSf^xF3^#n1Bt7MH=~1+uSbO~hy| zqkqfeE!-^r9yBV8b`x5JaKM@$=7#HNuOeHIac!(m(Q4eJVHwoI+z_t~a_hi!H_~T8 z%if8_`>Wt*VB*Xe-*9e}|JXRuJZz-?_l@^)4jWw??fW$Es=;PFSSMoGL$Vnp(PZ8|lcTjy}eN8YL9bn;4ja$?sJtqKp@QlYpEe^k&hb+zCbKPk)2( z6)gtFcdIxPQH#uAsEQDT=C@`@bV2BuSQSx@v1nz`*s8gMfENCDBkHGrE22KkP9VZ} zLPcn&X*LeRPOs^2NtyyGkKsDi0f7BTiz_SAMsN+j-+%ky@!pr8Zudv^b@O&PV0-52 zMhEH{RHhcw$Rf_YxC@LUj0-cLvVS){AbFirtaV#(*hn;_CRasG{rg+_+C7|_s%9_O zoqO3;qitIU!O9_F_rP^LiVJ`fmpv}>6M~o$W0BfVeI?e2byl=1)^SzqvQg`co=QzH zC!K4fAW^$((doYI3{;wKTwn3(YEYSkaO#?Ge0X%#7zFCaV{A6Fvf_Y|zJDIs%6*%f z)zG{h`E6xfEsO#{_B4bCw=1xllA~jo*mtQfddtPur*>wn-cdZ9@+%|gej zWbzXzUivIm^W-QlTW+T}YkyzT*8E;8s>yF~GGVJ^Zm8m)qOBLTn?4-8GEd`;nB)PK z$#u#z%&yPCl`XYAH=7v`rr+Y}@vG^=yMT3Bhyg~O^Mt)AGbAe3M|e2deR@k-XUOPM zhd|Lv3L|u8a|`QqZ7B~i#04hcTcBWEC1~QN^sJXE6HW%#jKZd@A%AM111r$Nix5tQ z?=fb4>Md>G+*}@c*y}AZ znvhtqM-2ii-dMnq+kc(TzWKh_m)Q!E>=(*? zffVpJw6Q|%Xi9TO_9^-{lR`pfsw$o9PI(qguSox+Emggc>+G7MW32nP9|v34e6#aO z(PbfPU=6`6!)fTmo7N?`GfdtyL3_7D_iJ5pgh4@^0h5aK5ver#e{BOJ|iq$to)_qevY+@anotf&|aQtgA zaDP7QoRh}PtrB7-jjGC&Nz<2f{UQSVwH}z}6=s;T_Er9slt-d9l|&7{+i|XCAc>CF zksC>bS`Y$n$vGBM&S5-ZCJU5rEC5)Gu4RO_X#EzNG`@hQSIRJs3@dffDMHA9M&K|$ z67_#1XX=zZex&nGAje zxYe?n{3m2Jt84lb=&Io)G}nx**~~Q(8qwU3Bq>!>l7hCO|M+9oID=8kODrk_Wq%GP z+IRC#DV05((E`qV^6!lTh4b1-!bcK1?pYgIz%i~&Skp?zW}PHqf%&M2$V}YW7kHR` zs^nB)n9|2EW<5%YVT`Zhq(lr;!j#KS3{x_OG0gYzH5g_*xG*T@_@ASg;Qw9>bEHv# z#4x4CFsg-JR3~;Bb3~w)o1ANYcYh^@Iqt?V$B1ECO#+5lNDQ+e46_RZzPf@~ z0C)`Up8;FD=1M%%Uc(lmv6?X)>-FfSyS3Fdb)ze=PFHK<%!;pmVr$AzM?;{gS0Rcn z;9k1 z(1oV-wWzWcWrcGv0}-7YW(+9m7YQ9_G!E1Ra*Zxd-sLfK@g|IWx;?v{IGLo#5*FG| zN{fqxm8g&dIPbuT3I7uLvMA)aYD<~(OEwin^;)Q@_k`;-O-)%TBW678;FX?w2JB8O zZErlSmYr}i@-(RB$ny zJGYe(_t`n(q@L7XZdJ|1iu9@^OtKkPhr)*850U!xZ!z9NbNeIVM&<7Qnu5->_pnMx zsth|2h15wTdDhN|ENi21kebM(DwzzBQxk0BX!9OP)K&y`F>)monSYZ|_Qim9(I~Jn z9j%ayxXHM6Z_D%^kxb6%{Q4&iq0GdHLPlXM12Eb0yP>V&u;vD)sgJC0J&;T%j!S34U;rCo&86QKc1?+J zwQjkR?qWD+)g}cq>D%j+s>DDIEFSdWa@9h<~QI7WiU^!Borw=(C&R>1~`{ zxz*|)9bLC&S^d#ompoXFvhz-qT?gZ~V!}ibGoWN8FZoT%n1mE(Q^$PK*_+XhNBpGf zC91jure2GU`B7;F(M6P?#i~uteJ==jO;O*bJyPU?E-5T4U}=dfm^gV2qG?OruR5^pc}y-iDI9vgG!*j;FbKmmgsB@x#t&Q@;XkLBAVr>ss5x zd%D`)(LGZSL!t2F*5;ktx+W{SxdLglbW^uCN87sg&gS;!-MgkUN+fIgBl*AXk_1rt zle=4Y@7^AoZ*JeYb7ym;Kib;b+1cLS(qG-aGk+RFRfNQr2MQR~-8;j3FiC*X?YrAs zJKHo-iyv2GGQ_anyh-s7?QEuO$@bX(ic*dMpOS}b zLB_`DH)HVpNj?agr+m~n)94lSw-62R+4km-t3 ztbcoZJWwCdUX@bb>o^ATnz$K%dJ*5c^*K7Llzo0Ho}X0e3|XFJuHNF`{4_2O)BH?5 zso3e?cF5yhn>#or0Er37Tmez98KNQr z`u=LuyLwyzLczE+1GdH?I(Ec12&+iLL(cTpi21rpevkHa@kO_LDx$^9)GMM z7#&ezj+GY=mc-gNxHu;a>Wm0$nGnYZ+5*>rFg}W#(O~VSCEIWl4YnVRa2&)n7EOAu zrF*CG(3JIsk@9WPgOSr#>k-&9OF45ohjC`1kD=pSvKPS}r|gen92=0pL~{QgZ`FWQ73{wFGJ<-wx%wi&~FFZob7=M*Ww+eG8 z_1SAB?%ZM?ycx~e!yT|Hzv0MZ55+mw1QyBCr0(>J9Ur?b>9%Kgo1!Iu`>tHBdS-yC zk7OnCENq2OF|wLMIh;qpggKUb!3$=uk@ z)+D4SR#X^vwG~Hpt1DpxrPniLMxp(kH@$m2z2=4|GQNG?5lL^RZ13i=oD>CjZGlV3 zn$jkXkZKyBw#gcFI5ftmjS0Yd>A>dlJTfhA2=}efZetU@+FF#E9e-{?M-t(WrTSW{ z-%ItR9DgjG1f~46>j>>?H0*GCrA^)fRbJXi;yDzk!>dmLwQC#G8nO?k& zt7jSD@Tc!yz0}54Jwun9-(|g6V3dDi@3Lxdo{&TKZ_^^Bt zv$`a|hW6AaHGd2lSBj)cHRWDqIpBivao~Vjn21va0)x}gOg7+Ibpjd?H*i^OvIxf{^;MJ7r?* zXx2muSy84_$I|%ywtBr=CA9V**=L>GYG9{BL(a3evm#GZsQ&w)SMoE;Hfq*~mj=ci z+Yr-qWi5E<&4c$XZc2=W-Y@}O1iobjVCW}Z7#VM`qEXdpI1dXO;$ZD-ps{Xj*>jD4 zwE`z(zkik_6&Wnpe%RiSRY&%6WZeRpFT@2jiybu(`n0J;#4`ZrbWz6hUYIpUP&Apr ztZM{Cll3$HMUx7-UK&KlkoegfSLmxHgr@g6?u-K`bhWlj6Zw{ffT3YjRx(zo0y8zM zSrhDGW^zZBSE(T3RB^RRsl~4j{j$`_5K^JFqkjXB-Tzx%iyl{XWFzIs?=a4s6fa{O zXpy04cAap@5DdrKy4kTSRv4`R?u0sbn@QV5fA459t`RR#9=<5oKbpAaIbvTzKKov?1Zmz z>9l8GBM}t`zhbk@R)7P9qrQ57m-Zsc81$3%{|{~Ytpsqb(CLy|#_J76|MqQ{8pchB zC2)ARtrmSDM3Xq$UMUO%99cN!+6iZmd-KM+~>>oSH!|*XDPp$vn<=&1pSPau#o; zfV|TC&oh(1D7|$n_leG{A1o)IPZ?w+41{q?=DprblLkfHjW&Z`6tb&VOUX z*(Fu3@}r})J#}U#Ugj7%gxX0mUmU@~L8#oG03TgVa z-dIKaK!vqozyF{Zc;Bgnv^LQv*MFBvfWQ|0Y09kMZ*~ZT*?+80YzrNhI|*Pzp5?2_ zGXQxvmw8d3>irF^5?ai4uOioal@Gf244=41PhN5ETU#QtU|<1_ozB; z0-xF(g)sMflQaZ=6y0MV>AZxBedDTX5&r96XJ=;{XImS2arCdzy?gimb$^aDJ0}`= zmZPK3Pt=}d#O=(AWKs3du{hu0*!?;K;s8+7X%F#nVi_UCydueS%MvwAli7~;gQItoonCrg|rNE_M;XT2Wa@Yfj+M0{lL6?(^9e*IHi ze*FV3zy7f_sSYM~g7tM=e`u>ck14iWiDsFrFPoSy8#EMM8?C-J@;e1G0cb#pRWP3AK*jUnkv zkj(jzB+*-f9jxQ%gX84_DS2{wMxp}km%!G!7$&5k^0ki*ko**hc}?TXx`VvBfyy(V zzRJSPr>_D{6TE}{g`lArR2mj?9g0mq+-wcm0IXzMCDJ1l^})0cY& zj-C$!Da8Lu27j#cb-Vc9-JRP*@>;N3t~#O(B1qH@U1=lY2=d&mys)FYydPWH@Sr~t zZlLMd(a{hF(ykf)I@>)?qBTK=K|2D0u=yJEO5udH{Cu^jLy>blPpx52OBRR|9SKXD zzc*bz(2CAvT&T#D-9VH;J6O5e&Ub?m6KfXr4A3^RWq->mhwm%@<`XLZ$bm<%1Jw;#+WmJl`TK+m4G+<=VMo8uM zq#aT)IDcV=VEP2ql6z4kJg(AbI6ZGb-<1O8)|u*3me&z^;uw?bex#+(w+ST9zR9{f zv|Vg;JQ?GyV5|%q184;8F||4@-|Kcbl-jowGCf!3=q7??QK>rsI-xPnd8%%!_NMIm4Rs z&t*foqD@Ac#wb^t&NELM46-?>-F|gE2!45)dEURUaghddyVsycZH4W!B&-zy-7att z@<3#fC6R8kxvUXMC0lg{GVcuVD29QtXtg7EcC9Y_5c;0F?GC@bwvh*4C!7B#PJO-0 zjDMEkfunP-Z+{OyW6yebLc$DIV>JyDb4q#0M!U+zyR!B3(AG4jy}2c1y`{t)j9lQ^ z3RebfRw3AJIb3u0I?oFzlP0}vU^>ZgXN4IVT*25|7f;(#Xu-zq-99SnM|W#ep^CR^ zpo%6DH5ojNWk4u>+w$;yEZV=_YA*wsJ<^os4E!TF0okEH=drpsKHc=Q6wq~sa(l)HdG)VR-iC%m%|yMd1nTE`81n-%L{V%XU(fAdVP3^-ecs7he8n!RBL|m zTT15W*kQop=20it%Y-S%jhHh_pgViC4m$|{S-`Ig_&@qSpK4nY5;~8^&VLf~cua=R zS6AAv>Bx2izqiOEKEDMV7uKq;u8I}4fUvp+toV^+-?vb#e=9n2f&eY$1_tpMiiQ5c z(zU125sX)xU^3Z_2AHvSn4k!-81Dj>;?^xR4`QEdAV#pX#?p(3uMqSb=Z>UTlQ{`2 z-8hO);lra13_zKYKw$~JFMqQL4U5)CS63zd)g&8lxrFvuxira(=rm*qLS11<6^32~ zwuGyrOIqQ0jyeqtOKo=28{9saLi{DAL)eR|@ty?=p4wKL%jVt;(><~-VMP~dqi ziumT3dD5?GG+PxNW#C1aqKH$7-zMiG)YLg}Y%x$P%@hfp0dl5GG5jquil0X-Ip^_Q z?)TATF4d}0uNQjn@Adohjk(4O zqnT2?@U{-%PZV|ngvaxoVuDhBl|HA%G5&k0$$&k!PdX4TrBpTHbK%yaB-X())vmre z`ZL>73)8d1)Lv7SKYl;ZbaU{PH+XyhQ*uX%zus@h(p9Ka)@}HS8|9| zF0JGArQhsdMxP;3up-W@BPaF*)7XR}wYBK#`HFTioLu3XT21$M_m?pepigYJl=MXqq}Ah+Ul)oOeba+7-tQ1nq29siO6itwP$A_fG+lOmix$wIx_+C z0m=otpZL3P;;AU^PBK9}Y$TLij&Bsg8e!H^HfS_4z<*rBt`$nE?0u6_a5j>YNLQFR zV9}6v@y>I)dgyjCIkB#;Dx=I>bAo88-*Zkh1v}6TEHs4*iM%Wgxcnt{HmqIm9kh#o z2<5WS_A^RdZ`7i^E~jKo zT#e0??Htu9N}N;7H+3px=xK#!NvAPSP^7T(_INChiKKY4AZ!){;c25t_#x(O&d%W;z-;5q2MhZ>G{#=4>rakFFh)Alb+a;~O&Tt{@wn!cu;?OKsVLgX<{ zD}Pxrfz46aUA_reiRF`%!Cs6>=Jw(M-2*$Npl%C5-6CkUX-IinE{VOVq`(^FbS0?w zCRs6V(}CvRCqEL8GKtS_lrz%L=EdF=U}K$MtRv!)pT(sJfNI5TF9kVPQMMP<&U0Ru zlyWS}dDN93Mc&ebp2W(zq728yeQPII+<&@dhLL?LK3gufj!@?X>lfu?O#mep7aO^3 z;vqsfgo)UJjNzq~3i5$oovu^uf3f{HzE~zuQ&Uzb-B@Wvf}&8kFKP|~?%zmkZzdue zj7x_TN=ecN&TWKfP2Twn+WDAbegSL57W$rqVe{_JHZ4YFwUN#-DVq)`H@$E}5`R?I z)R##*0Qg0d$uMXV+9;ddRFfjGfV@OMlSs6N)nqzYRvdV-nYXZ32(=w>G=76yh{q<0(VG(QAfJ z;>vA`*CFYw)VNo6XFGu-C3IEZtADVDv&PxKRN2NyZ7ihB#v}xeayD&6MjAf8fqTUi zEo8AIo1R!pw|6<^5>>C#K>`<#cHX03wf5TtERo+Y4VK7nMH*TcoA6Jc z!(I>j43;T-;{4=tJ$PxS4qlj~P4 z(9U&nrD$_Y;~bs(S+l9++f}kFVz~#Ufr_o!z&0W3X6C?e5Q8K2QZ!Idv8UDq?N)iM zWmXqOI?Zimfn80kl@2@NryK_}%WsR<=DkyHTph8RElK4l5Yv!jQ0QF0-sYJu5`J*; z!qES~7WQcvX&qil#WqP*5=W|wsk~)R0_56HOTqWX63CjnBYqdH&=u*vJNUAe*y-&s z*;TApFcX=51O#y0Cjzb`tkX5#<6VUL6JM^75m6c}P(4|vo=wwU4HHZ^_Q$eQFjMG|?9d8;xgn6vy6EkwV5VEuF2|is37)lu{@yqjf|f1HUr0OV6^E zn19Y!^jJfUz=q@p1)=#Mn%1lne}l?-Nv__N;G0#V=SDp`wVRIyzcS?0hjQUxOf}0e zo)4;~&AZ;^jb2HSXDY(UnUz%ZT7Zt~JJ+^ad#5K-jg%5cMv^3tb#f&{QK8*<@|DcWy2z$^*3EOo$@I z5&%qEq<^n{`AnjxHpMa5|3ad#Gs7{0y?&W`Xl|E#zN(Ha5YDQrtC}1Magg;ae|1Pk zbwKXN{vn$;JR=ub)O*6BwXx#_Vh!q|d@6Nm@R+1e8Y_zBt+#2~n|ll@6ao>-v-KK$ zQXr-8nginVyvT4)dH9mm4#jG`B%;Yp;mM9-S^V;bIWm>n8W>B0U?9>*UP&mnUITvuN4gK1mCLVw<2uSopLtK8 z$+Nmx(* zt}>>slgxCJ^1u*8>UxNfEI8SvSTm3a`9kN`;XtS3XJ8}^(YAuN4gP9=EuXmEz{F|{ z*-%z$5={4%+lt?1CTF(W8&xDIJ(YS}Z#w+hVONFo0q1U^YhddPPL2g%9Q>WGPuna~ZNf%<)k#^_6MWdk;yW^#TSfwcLM^=AsHdBN2(O6upuWrY z2ws2TLGK-l@uexbUdZD}^v(u$qOTb+vwgF9Chw|D45ip+5cuHveKT7rZ6#a-aNGo> z0lqxQQ3wMd7RRd^A(r-!S1YXKY-;YxlwR@bxbfc+^&})f9Y0FMU@cOjJb`GQsZxQg z)A)*lB&Z{$DS>40Lev#(H!Ha_G_Wc4?D(qicse0l9f$kmV>tULUpIwGmKh2kUp|o2nPAl6S%!a!h~W{0 zt%9~ivm1V~eL8u!Jo|LDg(Y1Nkro6sAi@JNb_55T@og-pCRmgu`+)lbhc^xXYP@u_ z7`~knG`SCr*Rcuc&^9mSlrD$Bpnz-~OqpUKVxSbP%(EI@7)$@u80F)Z$YH4TEn1DR z9gP-VnPZF&*3Rgbqe>ZP42gu@$c^tNRPZNdwPsqbwmsahiW@Gf9==#D$980o^<$f# zO99&h+AQ?!gF3M_ji%*ecsAUFIV1%dRV38fAXWd!gRZ>+r;y=ptm<=MpwB#oXK#@Z zYMwH+h*&$}CPA=nS4+N$M2Oj@)D_bQEeWxibHa!HbQOghZaIvf>%r?7=Ck_q1#iA%Qfe zptR+^2z+~P^N;oc87uYWq3~~`gIHRpCbv-8ZOdZ^`yK}trR5tXkDWp>DvvB(U;Sg; zkxKGML0i6vyd%4LuazRaURWg-0?E9%GK&sTe*l=e?TO!sZZzF{9 z%6Ob>Toh4Caw)cag;`)=D?e3qG7rMkn>E0kQUvOr%-y7Aj)9K5A| z-$;E9#l0Dh!PaQtmnvMC9@0d}$){id5+E2hmTA`4w?`v4r?y%fLRzE)p!1@SU))D<2`9;tSl7 z3ljrOmDw=V8VTCm%c-D8?%(da{_MweBN+=E7JUn|sw~NOxr(2_Mh6ALyMFmOqDO$O zN8oCdqm}b@!mKaj%c4MZaq*?zy`9(II3nj<*s$Y@*`QPyq1epa_Xuq<#I}{MB=@2uB!q>Dx2BWhsT_2PT0Y9UVNfB$tSuLsI!>Vn5Y?oH z*49K{ZxB};zYjgn{P^q&Nh+7$qc$=7ocFfOVbQnS2X)M81Qc8inj#2nSb`UE{WkAZ zH6o(8uwJtkIb`5IZ?U)eVJ{UcTh#9O)9qvIh)4xaMBXJSR5h;Yj^+y4towVIKHepr zuIRE$-Zc4?Xn^t*?+W|LQIjU4{SQiyT*KD4MznOgb*?Sa+zxQP!rSzv`d+#B{R8$d zE$m+cE$|J#Ggy=OfI`>+)Um{7?#DeMT(p6S9u(U1D)@)05|^osyuaqm1AaBR9$t> zs^7fCnq;o?qrXuQIoJXdEnLy59L1CdwsD8FxcjiT8 zae??chsGk7sE_6MlGWlf5a)F~&eKFglLbf#hpn9)2n<%e3XGPI@xx_w`#Ky0dZjong{q^# zN~!{87!E`ch==}5>g8y>d#|gi(g1w-aYW{oah_BKSk%&q9QJ}eSaKdIHK2}fggQ%$tWKZxi^>#CCCN3f z@E>jk`r%m=JD`mS35gSWN`>i07vIZR6WlNcoUW@}we|0@Ae+3JM`vJ+q{mE*p7(Zk z*fBe^6P!BPUsom*xd0!-4ru4whBfiOPX_T%KhgZ`U?KfFd%*fpSf@uXb2(~1rs<;0 z*I`{UM@ijZU9%UiWb`4BUn!9m>K9iD;*QTmnL2^I!%uNHYPl$&3~ zMBkKbv{H$_bC{2d`|=ZwpR2t&dROKV1d}Yqt8BSXwnvlEx3U78n5JO$y|Pjf{W!PM zv7}Q0&L{LuIu1&N2le602>ajn&i z5o#XD$$jHW3I9ULO5JZHz=Oc@A-%P}01$^>w-bkaYB6M;O*8<65qdC|DK;}cgPg}6 zQc2Jabt-r2+vI2nlnzA?*X-il5wR03+fros`Ax>@Sd)h(UA=qe`lEAD*a`HCSiwVg zEDwadB_xHg^Wp~mQfvrb6X=u5IpGfCAr3xB`|v|E(blcV-f^$ic65b`k?Mv3g$(&= z?|YB-j4(2{dMW#w`Aw&43##hgJf=_98&*?G40v2`BuMw3`x$(!%qk*jAJm;yyWbmO z5j-1;`$)z(IaOecl;f>x;Ntc7;}I;qC1lUw zGC*a53^gB$Y;>9|)%BQJVs&-5j^>C-vCXcbH%*M;H-%b4$XwBCV@s=}1_Y?^Htmz& ze)8z^O3HWy-#-gcnRU%aJwmk|f$Lk|*)u2Ll&9dn>`PY`^MX0S`i^6Z+H~&Cm2?w} zb57zY8wPv8nTf!!Y6&tAWT_K#)?{G^$$dZPRn5--_GxS^!}gt2_VG<)pt@D!0X>B2 z7)AwxfX=`;m63B7oB#@ZMga_=v2n5>b72qVh~cCLSt#fus|pk% zP}hqSK^Xz;5N;pu8ic8mn=X&uI_E_R|9(XV>~IhNQ89}dhe3OquM zFdM|d{e4yX_{t+B@k;jFl@A7)eStM`Spj0TZhsLv0`8a!pTiI0^C95vvWGcrL$oJXTZ;Pr+Zh9w77RpJn*F8<{^<(Y>~`)f3F_hug;&lNBcc?h%L znYTImLraymzI5;s)Si{QjV}9DM1;4B!B16!v;!r+L3~)_y1Km)R@2MZFWIi-s<^Rep5?9Bhg7T_D?%Ox(hQRX@NU{@U2vYLH|4I2wEtI5 z<3qJ=Lko54X7@|78z-`l6-fCf5RwG5cIO1;gnE^Hx$RVN%#!d!j;%N1J3~fn| zt!ZPvQ%w-#DdiXN1MLG_NHABQj{tN6!Rx#CgH5g~DVKfim09?8R)|B1_GwrkPa9y=c6edFy$hW+I3nj+1t5Y$pj zONwIsS(Q?!^WN#RQTIVj8uL=xYN@|Q>!vu_*tfsi zQdFkl%!)xkauPjImt?kPrg)e)|3dO3y22t3i3OjAHXnrHfSfArCN}khuj?}`o4?*Q z_f7Zr@>zM}8NO&uC)3Zi%!%~)hyjm%#Lp|9drpK^i?bZ9E0R8Atg9W3t-59Ni`=h= z;bPJEqnQ;`QVaIhVIPL0?XtaD@AHLmB^3taHhd=;x-;Jdp^NhiK6{PhG&c~_lHfh& zZy16fa5@07I>U7}nuF}&_^UL@sxu$U!lspXRXI%{6rd2h^H>otHw|%3GmmbQ?^tdCtq)GhA;7oJ2ZR}&Rfa;Zr z$tOJKbjJ8Trlyy1M~>!rxX9FL<#qaOcvYcho^-F#5rH&=p8Q7XGNP^5JY5>)jg5)) zLX;_pQ*aQf5r<$n(~_crK-=DfOs+TB-y)D{UIX&Rf>0{v%`&%qt%=ED%-Cj=^*^5h_PGNp0-+Eq9;04@9^tGij#avAkHg`yOJ`I9GHrMAj zLQzl5O)j(sUh&2BOg~Mu)jlb4tH$rrckq#a{HW83|$}3 z^wQWa@Nz-%kze^0gI}4j!`_!#OPDs(1z&&=XeVK?S8u!kYjZg_N3i@_S5}OHA2G23 z8m~`o*k3hOYA?$u6r|3NtHns?$Sco@U{q4#P|;3vkfdn*@G-BHeuc}^Y$ke>n_09d zs?om4-abbJ=dBs7C%sN~U*$|sb-?n^TSW#?Pg?|%+Yjh?e%&Hc?C*g%^CnKTscxoa zoP?bGZ*9^=&7%D<7DqJI`?XISlV{U2K;1g!O{4PU{8=&z3-!ihwVxRyl*BlL2|zX;-G!si9A|@lI$j!x_KFmdHB!aEIilVFZfT@a2mJb+wB1 zcu;R#&~k!%qL(hA|H#HzeKeicdW z@L*RLqzloS#-WC*R)pvT{ZL6a6Nw$U9iV|r<%IF>jMv`I;8e#d@Y~Mft7oK;z5g#B zd(f|j%fpT{r7m}0okgV$RRhQD0*v)v)pfPP^dSv-z+f^CXs?#U4_*W4bDsvF@e7 zEi@7CdWQ1m)fOGeu0p)fKsi4Uy>Ejc+qu#Bk_v&`yMnFv;;xDc4`+eOafQ>y%Me5K z7jCZWM24~^Ls3w;>&^5f*-W)X*=ksz~j2?)MQ$8M%*B z_32zCrTKaW*k-Nz5is)zXsDWM}-ahZE|Xgs2&*ZB<#)Rr0=Tv?C1F{rIJxCof5k+TIb=3>gwI6-Pg~uEHR3gKPemB=$H@kVT22ra zW?DQ(ych|SsoWLX87_FBnsDQj3=FgMeWIVkdXO0z2m?F(@>Ci@L8D6&#<)3OCDOj6G#Wz(!IZ&yAJk3_YIqZpZcPC~>Z=enr z%lAX8S8SUjb6R+a?M7bV9^@ow<>t?02iOPRNro>y⩔m8^2Dw<(Si_KU#EF7Y;eb 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 G#Qy_*uLx%V diff --git a/src/content/index.ts b/src/content/index.ts index 011a271..5fa6252 100644 --- a/src/content/index.ts +++ b/src/content/index.ts @@ -1,8 +1,10 @@ import browser from 'webextension-polyfill' import { isLikelyDownloadUrl, normalizeUrl } from '../lib/downloadIntent' +import { getSettings } from '../lib/settings' const CAPTURE_TTL_MS = 8000 const captureInFlight = new Map() +let extensionEnabled = false function pruneCaptureInFlight(): void { const now = Date.now() @@ -12,6 +14,7 @@ function pruneCaptureInFlight(): void { } async function sendCapture(url: string, referer: string): Promise { + if (!extensionEnabled) return false const normalized = normalizeUrl(url, window.location.href) if (!normalized) return false @@ -46,6 +49,7 @@ function shouldIgnoreHotkey(event: MouseEvent | KeyboardEvent): boolean { } async function interceptAnchorEvent(event: MouseEvent): Promise { + if (!extensionEnabled) return if (event.defaultPrevented) return if (shouldIgnoreHotkey(event)) return @@ -61,6 +65,7 @@ async function interceptAnchorEvent(event: MouseEvent): Promise { } function interceptMouseLike(event: MouseEvent): void { + if (!extensionEnabled) return const anchor = findAnchor(event.target) if (!anchor) return const href = anchor.href || '' @@ -89,6 +94,7 @@ document.addEventListener('click', (event: MouseEvent) => { }, true) document.addEventListener('keydown', (event: KeyboardEvent) => { + if (!extensionEnabled) return if (event.key !== 'Enter') return if (event.defaultPrevented) return if (shouldIgnoreHotkey(event)) return @@ -114,7 +120,7 @@ function installProgrammaticInterceptors(): void { const originalOpen = window.open.bind(window) window.open = function gomdownInterceptOpen(url?: string | URL, target?: string, features?: string): Window | null { const raw = String(url || '').trim() - if (raw && isLikelyDownloadUrl(raw, window.location.href)) { + if (extensionEnabled && raw && isLikelyDownloadUrl(raw, window.location.href)) { void sendCapture(raw, window.location.href) return null } @@ -128,7 +134,7 @@ function installProgrammaticInterceptors(): void { const originalAnchorClick = HTMLAnchorElement.prototype.click HTMLAnchorElement.prototype.click = function gomdownInterceptAnchorClick(): void { const href = this.href || this.getAttribute('href') || '' - if (href && isLikelyDownloadUrl(href, window.location.href)) { + if (extensionEnabled && href && isLikelyDownloadUrl(href, window.location.href)) { void sendCapture(href, document.referrer || window.location.href) return } @@ -196,6 +202,10 @@ function removeYoutubeOverlay(): void { } function ensureYoutubeOverlay(): void { + if (!extensionEnabled) { + removeYoutubeOverlay() + return + } if (window.top !== window.self) return if (!isYoutubeWatchPage(window.location.href)) { removeYoutubeOverlay() @@ -283,6 +293,15 @@ watchYoutubeRouteChanges() let mediaToastRoot: HTMLDivElement | null = null let mediaToastTimer: number | null = null +function hideMediaCapturedToast(): void { + if (!mediaToastRoot) return + mediaToastRoot.style.display = 'none' + if (mediaToastTimer !== null) { + window.clearTimeout(mediaToastTimer) + mediaToastTimer = null + } +} + function ensureMediaToastRoot(): HTMLDivElement { if (mediaToastRoot) return mediaToastRoot const root = document.createElement('div') @@ -308,6 +327,7 @@ function ensureMediaToastRoot(): HTMLDivElement { } function showMediaCapturedToast(payload: { kind?: string; url?: string; suggestedOut?: string }): void { + if (!extensionEnabled) return const root = ensureMediaToastRoot() const kind = String(payload?.kind || 'media').toUpperCase() const out = String(payload?.suggestedOut || '').trim() @@ -332,3 +352,33 @@ browser.runtime.onMessage.addListener((message: any) => { }) } }) + +async function syncExtensionEnabled(): Promise { + try { + const settings = await getSettings() + extensionEnabled = Boolean(settings.extensionStatus) + } catch { + extensionEnabled = false + } + + if (!extensionEnabled) { + removeYoutubeOverlay() + hideMediaCapturedToast() + } else { + ensureYoutubeOverlay() + } +} + +void syncExtensionEnabled() + +browser.storage.onChanged.addListener((changes, areaName) => { + if (areaName !== 'sync') return + if (!changes.extensionStatus) return + extensionEnabled = Boolean(changes.extensionStatus.newValue) + if (!extensionEnabled) { + removeYoutubeOverlay() + hideMediaCapturedToast() + return + } + ensureYoutubeOverlay() +}) diff --git a/src/popup/main.tsx b/src/popup/main.tsx index 1e2a58e..affe060 100644 --- a/src/popup/main.tsx +++ b/src/popup/main.tsx @@ -111,7 +111,18 @@ function App(): JSX.Element { return (
-

Gomdown Helper

+
+

Gomdown Helper

+ +
@@ -132,17 +143,6 @@ function App(): JSX.Element { />
- -