OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 06:16

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 19 Январь, 2007 17:06 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Здравствуйте!
Я только недавно стал осваивать BlackBox.
Решил разобраться с потоками.
Переделал пример из Obx\Cubes.odc.
Способ синхронизации взят из Delphi 2.0.
Кубик нормально закрутился.
Но, есть одно но: кубик замирает при перетаскивании окна за заголовок
и при активизации меню.

Все похоже застревает где-то в Views.Update(v, Views.keepFrames).
В реальной ситуации пользователь может просто нажать alt попасть в меню, а процесс обработки может просто встать. А надо бы продолжать отрисовку объекта не зависимо от того тащим мы окно или находимся в меню.
Например, в программах на Delphi замирания обработки не наблюдается.

как избежать остановки кручения кубика в такой ситуации?
Как устроен обработчик сообщений в BlackBox?

MODULE ObxThreadCubes;
(**
project = "BlackBox"
organization = "www.oberon.ch"
contributors = "Oberon microsystems"
version = "System/Rsrc/About"
references = "Adopted from a program written in C in 1986 by Roland Karlsson,
Swedish Institute for Computer Science (SICS), roland@sics.se"
changes = ""
issues = ""

**)

IMPORT Views, Ports, Properties, Stores, Models, Math, Controllers, StdCmds, Containers,
SYSTEM, Dialog, WinApi;

CONST
minVersion = 0; maxVersion = 1;
pi2 = 255;
invisible = Ports.white;

TYPE
Colors = ARRAY 6 OF Ports.Color;

View = POINTER TO RECORD (Views.View)
fi1, fi2: INTEGER; (* rotation angles *)
colors: Colors (* colors of the six sides of the cube *)
END;

Msg = RECORD (Models.Message)
consumed: BOOLEAN
END;

ThreadMethod* = PROCEDURE;

VAR
para*: RECORD
colors*: Colors
END;

actual: View;
sinus: ARRAY 256 OF INTEGER;
Terminated: BOOLEAN;
ThreadHandle: WinApi.HANDLE;
ThreadID: WinApi.HANDLE;
UtilWindow: WinApi.HWND;
hInstance: WinApi.HINSTANCE;

(* property dialog *)

PROCEDURE Singleton (): View;
VAR v: Views.View;
BEGIN
Controllers.SetCurrentPath(Controllers.targetPath);
v := Containers.FocusSingleton();
Controllers.ResetCurrentPath();
IF (v # NIL) & (v IS View) THEN RETURN v(View) ELSE RETURN NIL END
END Singleton;

PROCEDURE Notify* (op, from, to: INTEGER);
VAR v: View;
BEGIN
v := Singleton();
IF v # NIL THEN v.colors := para.colors END
END Notify;

(*Thread*)

PROCEDURE Do;
BEGIN
actual.fi1 := (actual.fi1 + 7) MOD pi2;
actual.fi2 := (actual.fi2 + 1) MOD pi2;
(*msg.consumed := TRUE;*)
Views.Update(actual, Views.keepFrames)
END Do;

(* View *)

PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer);
VAR i: INTEGER;
BEGIN
wr.WriteVersion(maxVersion);
wr.WriteInt(v.fi1); wr.WriteInt(v.fi2);
FOR i := 0 TO 5 DO wr.WriteInt(v.colors[i]) END
END Externalize;

PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader);
VAR version: INTEGER; i: INTEGER;
BEGIN
rd.ReadVersion(minVersion, maxVersion, version);
IF ~rd.cancelled THEN
rd.ReadInt(v.fi1); rd.ReadInt(v.fi2);
IF version = maxVersion THEN
FOR i := 0 TO 5 DO rd.ReadInt(v.colors[i]) END
ELSE
FOR i := 0 TO 5 DO v.colors[i] := invisible END
END
END
END Internalize;

PROCEDURE (v: View) CopyFromSimpleView (source: Views.View);
BEGIN
WITH source: View DO
v.fi1 := source.fi1; v.fi2 := source.fi2;
v.colors := source.colors
END
END CopyFromSimpleView;

PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
BEGIN
WITH msg: Properties.SizePref DO
IF (msg.w > Views.undefined) & (msg.h > Views.undefined) THEN
Properties.ProportionalConstraint(1, 1, msg.fixedW, msg.fixedH, msg.w, msg.h);
IF msg.w < 10 * Ports.mm THEN
msg.w := 10 * Ports.mm; msg.h := msg.w
END
ELSE
msg.w := 40*Ports.mm; msg.h := msg.w;
END
| msg: Properties.FocusPref DO
msg.hotFocus := TRUE
ELSE
END
END HandlePropMsg;

PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message;
VAR focus: Views.View);
VAR c: Containers.Controller;
BEGIN
WITH msg: Controllers.TrackMsg DO
IF Controllers.modify IN msg.modifiers THEN
c := Containers.Focus();
IF c.opts # Containers.mask THEN
para.colors := v.colors;
StdCmds.OpenToolDialog('Obx/Rsrc/Cubes', 'Cube Colors');
c.SetSingleton(v)
END
END
ELSE
END
END HandleCtrlMsg;

PROCEDURE (v: View) HandleModelMsg (VAR msg: Models.Message);
BEGIN
WITH msg: Msg DO
v.fi1 := (v.fi1 + 7) MOD pi2;
v.fi2 := (v.fi2 + 1) MOD pi2;
msg.consumed := TRUE;
Views.Update(v, Views.keepFrames)
ELSE
END
END HandleModelMsg;

PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
VAR
fi1, fi2, a, c: INTEGER;
p0h, p0v, p1h, p1v, p2h, p2v, p3h, p3v: INTEGER;
w, h: INTEGER;
e01, e12, e23, e30,
e45, e56, e67, e74,
e04, e15, e26, e37: BOOLEAN;
p: ARRAY 4 OF Ports.Point;

PROCEDURE DrawSides(visible: BOOLEAN);
BEGIN
IF (e01 & e12 & e23 & e30 = visible) & (v.colors[0] # invisible) THEN
p[0].x := (p0h - c) * w; p[0].y := p0v * w;
p[1].x := (p1h - c) * w; p[1].y := p1v * w;
p[2].x := (p2h - c) * w; p[2].y := p2v * w;
p[3].x := (p3h - c) * w; p[3].y := p3v * w;
f.DrawPath(p, 4, Ports.fill, v.colors[0], Ports.closedPoly)
END;
IF (e45 & e56 & e67 & e74 = visible) & (v.colors[1] # invisible) THEN
p[0].x := (p0h + c) * w; p[0].y := p0v * w;
p[1].x := (p1h + c) * w; p[1].y := p1v * w;
p[2].x := (p2h + c) * w; p[2].y := p2v * w;
p[3].x := (p3h + c) * w; p[3].y := p3v * w;
f.DrawPath(p, 4, Ports.fill, v.colors[1], Ports.closedPoly)
END;
IF (e01 & e15 & e45 & e04 = visible) & (v.colors[2] # invisible) THEN
p[0].x := (p0h - c) * w; p[0].y := p0v * w;
p[1].x := (p1h - c) * w; p[1].y := p1v * w;
p[2].x := (p1h + c) * w; p[2].y := p1v * w;
p[3].x := (p0h + c) * w; p[3].y := p0v * w;
f.DrawPath(p, 4, Ports.fill, v.colors[2], Ports.closedPoly)
END;
IF (e12 & e26 & e56 & e15 = visible) & (v.colors[3] # invisible) THEN
p[0].x := (p1h - c) * w; p[0].y := p1v * w;
p[1].x := (p2h - c) * w; p[1].y := p2v * w;
p[2].x := (p2h + c) * w; p[2].y := p2v * w;
p[3].x := (p1h + c) * w; p[3].y := p1v * w;
f.DrawPath(p, 4, Ports.fill, v.colors[3], Ports.closedPoly)
END;
IF (e23 & e37 & e67 & e26 = visible) & (v.colors[4] # invisible) THEN
p[0].x := (p2h - c) * w; p[0].y := p2v * w;
p[1].x := (p3h - c) * w; p[1].y := p3v * w;
p[2].x := (p3h + c) * w; p[2].y := p3v * w;
p[3].x := (p2h + c) * w; p[3].y := p2v * w;
f.DrawPath(p, 4, Ports.fill, v.colors[4], Ports.closedPoly)
END;
IF (e30 & e04 & e74 & e37 = visible) & (v.colors[5] # invisible) THEN
p[0].x := (p3h - c) * w; p[0].y := p3v * w;
p[1].x := (p0h - c) * w; p[1].y := p0v * w;
p[2].x := (p0h + c) * w; p[2].y := p0v * w;
p[3].x := (p3h + c) * w; p[3].y := p3v * w;
f.DrawPath(p, 4, Ports.fill, v.colors[5], Ports.closedPoly)
END;
IF e01 = visible THEN
f.DrawLine((p0h - c) * w, p0v * w, (p1h - c) * w, p1v * w, 0, Ports.black)
END;
IF e12 = visible THEN
f.DrawLine((p1h - c) * w, p1v * w, (p2h - c) * w, p2v * w, 0, Ports.black)
END;
IF e23 = visible THEN
f.DrawLine((p2h - c) * w, p2v * w, (p3h - c) * w, p3v * w, 0, Ports.black)
END;
IF e30 = visible THEN
f.DrawLine((p3h - c) * w, p3v * w, (p0h - c) * w, p0v * w, 0, Ports.black)
END;
IF e45 = visible THEN
f.DrawLine((p0h + c) * w, p0v * w, (p1h + c) * w, p1v * w, 0, Ports.black)
END;
IF e56 = visible THEN
f.DrawLine((p1h + c) * w, p1v * w, (p2h + c) * w, p2v * w, 0, Ports.black)
END;
IF e67 = visible THEN
f.DrawLine((p2h + c) * w, p2v * w, (p3h + c) * w, p3v * w, 0, Ports.black)
END;
IF e74 = visible THEN
f.DrawLine((p3h + c) * w, p3v * w, (p0h + c) * w, p0v * w, 0, Ports.black)
END;
IF e04 = visible THEN
f.DrawLine((p0h + c) * w, p0v * w, (p0h - c) * w, p0v * w, 0, Ports.black)
END;
IF e15 = visible THEN
f.DrawLine((p1h + c) * w, p1v * w, (p1h - c) * w, p1v * w, 0, Ports.black)
END;
IF e26 = visible THEN
f.DrawLine((p2h + c) * w, p2v * w, (p2h - c) * w, p2v * w, 0, Ports.black)
END;
IF e37 = visible THEN
f.DrawLine((p3h + c) * w, p3v * w, (p3h - c) * w, p3v * w, 0, Ports.black)
END
END DrawSides;

BEGIN
v.context.GetSize(w, h); w := (w DIV 170);

fi1 := v.fi1;
fi2 := v.fi2;

a := sinus[fi2];
c := (sinus[(64 - fi2) MOD pi2] * 91) DIV 128; (* 91/128 := sqrt(2) *)

p0v := 85 + sinus[fi1];
p0h := 85 + (a * sinus[(64 - fi1) MOD pi2]) DIV 64;

p1v := 85 + sinus[(64 + fi1) MOD pi2];
p1h := 85 + (a * sinus[(-fi1) MOD pi2]) DIV 64;

p2v := 85 + sinus[(128 + fi1) MOD pi2];
p2h := 85 + (a * sinus[(-64 - fi1) MOD pi2]) DIV 64;

p3v := 85 + sinus[(192 + fi1) MOD pi2];
p3h := 85 + (a * sinus[(-128 - fi1) MOD pi2]) DIV 64;

(* determine visibility of the twelve edges *)

e01 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128))
OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128)));
e12 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128))
OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128)));
e23 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128))
OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128)));
e30 := ~((((fi2 - 192) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128))
OR (((fi2 - 128) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128)));
e45 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128))
OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128)));
e56 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128))
OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128)));
e67 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 160) MOD pi2 < 128))
OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 32) MOD pi2 < 128)));
e74 := ~((((fi2) MOD pi2 < 64) & ((fi1 - 96) MOD pi2 < 128))
OR (((fi2 - 64) MOD pi2 < 64) & ((fi1 - 224) MOD pi2 < 128)));
e04 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 224) MOD pi2 < 64))
OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 96) MOD pi2 < 64)));
e15 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 160) MOD pi2 < 64))
OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 32) MOD pi2 < 64)));
e26 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 96) MOD pi2 < 64))
OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 224) MOD pi2 < 64)));
e37 := ~((((fi2 - 64) MOD pi2 < 128) & ((fi1 - 32) MOD pi2 < 64))
OR (((fi2 - 192) MOD pi2 < 128) & ((fi1 - 160) MOD pi2 < 64)));

DrawSides(FALSE); (* draw hidden sides and edges *)
DrawSides(TRUE) (* draw visible sides and edges *)
END Restore;

(* commands *)

PROCEDURE New* (): View;
VAR v: View;
BEGIN
NEW(v);
v.fi1 := 0; v.fi2 := 0;
v.colors := para.colors;
RETURN v
END New;

PROCEDURE Deposit*;
BEGIN
actual := New();
Views.Deposit(actual);
END Deposit;

PROCEDURE InitData;
VAR i: INTEGER;
BEGIN (* Pi = 128 *)
FOR i := 0 TO 255 DO
sinus[i] := SHORT(ENTIER(0.5 + 64 * Math.Sin(i * 2 * Math.Pi() / 256)))
END;
para.colors[0] := Ports.green;
para.colors[1] := Ports.blue;
para.colors[2] := invisible;
para.colors[3] := Ports.red;
para.colors[4] := invisible;
para.colors[5] := Ports.red + Ports.green (* yellow *)
END InitData;

PROCEDURE Execute;
VAR
r: WinApi.BOOL;
BEGIN
r := WinApi.SendMessageA(UtilWindow, WinApi.WM_NULL, 0, SYSTEM.ADR(Do));
END Execute;

PROCEDURE ThreadProc(Parameter: INTEGER): INTEGER;
VAR
r: WinApi.BOOL;
BEGIN
WHILE ~Terminated DO
Execute;
WinApi.Sleep(10);
END;
WinApi.ExitThread(0);
RETURN 0;
END ThreadProc;

PROCEDURE [2] UtilWinHandler(wnd: WinApi.HWND; message: INTEGER;
wParam, lParam: INTEGER): WinApi.LRESULT;
VAR
Method: ThreadMethod;
r: WinApi.BOOL;
BEGIN
IF message = WinApi.WM_NULL THEN
Method := SYSTEM.VAL(ThreadMethod, lParam);
Method;
RETURN 0;
ELSE
RETURN WinApi.DefWindowProcA(wnd, message, wParam, lParam);
END;
END UtilWinHandler;

PROCEDURE Init*;
VAR
res: BOOLEAN;
SuspendCount: INTEGER;
class: WinApi.WNDCLASSA;
result: WinApi.ATOM;
BEGIN
Terminated := FALSE;
hInstance := WinApi.GetModuleHandleA(NIL);
class.style := BITS(0);
class.lpfnWndProc := UtilWinHandler;
class.cbClsExtra := 0;
class.cbWndExtra := 0;
class.hInstance := hInstance;
class.hIcon := 0;
class.hCursor := 0;
class.hbrBackground := 0;
class.lpszMenuName := NIL;
class.lpszClassName := "OberonUtilWindowClass";
result := WinApi.RegisterClassA(class);
UtilWindow := WinApi.CreateWindowExA(WinApi.WS_EX_TOOLWINDOW, class.lpszClassName,
NIL, WinApi.WS_POPUP, 0, 0, 0, 0, 0, 0, hInstance, 0);
ThreadID := 0;
ThreadHandle := WinApi.CreateThread(NIL, 0, ThreadProc,
0, WinApi.CREATE_SUSPENDED, ThreadID);
res := ThreadHandle # 0;
IF res THEN
SuspendCount := WinApi.ResumeThread(ThreadHandle);
END;
END Init;

PROCEDURE Done;
VAR
r: INTEGER;
BEGIN
Terminated := TRUE;
IF ThreadHandle # 0 THEN
r := WinApi.WaitForSingleObject(ThreadHandle, 5000);
r := WinApi.CloseHandle(ThreadHandle);
ThreadHandle := 0;
END;
r := WinApi.DestroyWindow(UtilWindow);
r := WinApi.UnregisterClass("OberonUtilWindowClass", hInstance);
END Done;

BEGIN
InitData;
Init;
CLOSE
Done;
END ObxThreadCubes.

"ObxThreadCubes.Deposit; StdCmds.Open;ObxThreadCubes.Init"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 20 Январь, 2007 00:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Здравствуйте!

Попробую по порядку ответить на вопросы :-)

По поводу примера - не совсем понятно, к чему там создание окна, ведь оно нигде не используется - просто из старого примера "перекочевало", наверное?

Многопоточность через WinApi.CreateThread использовать нельзя ни в коем случае. ББ - среда со сложным рантаймом, и такое использование рано или поздно приведет к краху, например, в момент сборки мусора (когда структура памяти временно нецелостна, но поток-то ничего об этом не знает...).
В обычной версии ББ многопоточности нет в принципе. В Active BlackBox нужно использовать либо активные процедуры, либо низкоуровневую оболочку для CreateThread - Kernel.cCreateTask, которая корректно зарегистрирует поток в ядре.
И то - прежде чем вызывать из параллельного потока Views.Update, нужно будет выполнить блокировку Synch.BeginOberonSafe (как в Delphi VCL используется Synchronize).

По поводу обновления - Views.Update не производит перерисовки экрана, а всего лишь ставит отображение в очередь отложенной перерисовки. Перерисовка выполняется почти сразу, но все равно отложенно. Ее выполняет главный поток среды. Естественно, что от введения многопоточности поведение обновления экрана не изменилось.
Почему меню и перетаскивание замораживают обновление - отдельный вопрос. Нужно смотреть, как это реализовано в HostMenus и HostWindows.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 20 Январь, 2007 07:02 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
Здравствуйте!

Попробую по порядку ответить на вопросы :-)

По поводу примера - не совсем понятно, к чему там создание окна, ведь оно нигде не используется - просто из старого примера "перекочевало", наверное?

Многопоточность через WinApi.CreateThread использовать нельзя ни в коем случае. ББ - среда со сложным рантаймом, и такое использование рано или поздно приведет к краху, например, в момент сборки мусора (когда структура памяти временно нецелостна, но поток-то ничего об этом не знает...).
В обычной версии ББ многопоточности нет в принципе. В Active BlackBox нужно использовать либо активные процедуры, либо низкоуровневую оболочку для CreateThread - Kernel.cCreateTask, которая корректно зарегистрирует поток в ядре.
И то - прежде чем вызывать из параллельного потока Views.Update, нужно будет выполнить блокировку Synch.BeginOberonSafe (как в Delphi VCL используется Synchronize).

По поводу обновления - Views.Update не производит перерисовки экрана, а всего лишь ставит отображение в очередь отложенной перерисовки. Перерисовка выполняется почти сразу, но все равно отложенно. Ее выполняет главный поток среды. Естественно, что от введения многопоточности поведение обновления экрана не изменилось.
Почему меню и перетаскивание замораживают обновление - отдельный вопрос. Нужно смотреть, как это реализовано в HostMenus и HostWindows.


1.Если Вы посмотрите как реализован Synchronize в Dephi 2.0, то он как раз реализован через скрытое окно и SendMessage. Что как раз и сделано в данном примере. Поэтому и создается скрытое окно.
Что позволяет синхронизировать основной поток программы и вторичный.

2.Я понимаю, что Views.Update лишь ставит отображение в очередь отложенной перерисовки. Ну, она по идее и должна выскакивать из нее немедленно: поставило в очередь сообщение "отрисовать данный объект". А когда обработчик дойдет до данного сообщения
объект и перересуется. А тут выходит, что в момент нахождения в меню или при перетаскивании за заголовок очередь сообщений обрабатывает только действия от мыши и действия в меню.
Что есть не хорошо.

3. По поводу Synch.BeginOberonSafe и Synch.EndOberonSafe.
Ставил я их. Эффект такой: мышью не двигаешь кубик крутится медленно, если двигать мышью быстро то и скорость вращения возрастает.

4. Active BlackBox я еще пока не пробовал. Я только-только начал разбираться с Blackbox. Но я подозреваю, что если очередь обработки сообщений реализована не очень хорошо, то когда вам надо что-бы параллельный поток рисовал что-то на экране (например, график) не зависимо от того в меню вы сейчас находитесь или нет. У вас этого не получится. И вообще все остановится как только вы нажали alt и случайно попали в меню. Я думаю с Active BlackBox будет то же самое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 20 Январь, 2007 13:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
3. По поводу Synch.BeginOberonSafe и Synch.EndOberonSafe.
Ставил я их. Эффект такой: мышью не двигаешь кубик крутится медленно, если двигать мышью быстро то и скорость вращения возрастает.

Естественно - BeginOberonSafe ждет, пока главный цикл обработки сообщений будет в определенной точке, выполняет в этой точке блокировку главного потока среды. Затем мы выполняем действия из побочного потока, не боясь коллизий, и отпускаем главный поток среды "на все четыре стороны".

BeginOberonSafe - это, так скажем, не "реального времени" вещь. Вся логика по изменению состояния отображения должна производиться отдельным потоком, который не завязан на GUI и никого не ждет, работает синхронно по времени, со Sleep. А периодический сигнал на обновление экрана лучше всего делать через Services.Action. Хотя можно и через специальный поток обновления с BeginOberonSafe. Пример такой графики (с летающими шариками и комнатами) есть в Active BlackBox. Хотя Вы правы - меню и т.п. также прерывает перерисовку. Можно разобраться и переделать политику обработки сообщений в HostWindows, но у меня сейчас времени на это нет... Кстати, допускаю, что это принципиальная особенность MDI-интерфейса в Винде.

P.S. А использовать многопоточность в обычной версии ББ для работы нельзя, только поэкспериментировать/поиграться. Попробуйте в побочном потоке сделать активное выделение памяти и увидите мгновенную смерть среды... :-) Почему и был сделан Active BlackBox.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 20 Январь, 2007 15:06 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
Цитата:
3. По поводу Synch.BeginOberonSafe и Synch.EndOberonSafe.
Ставил я их. Эффект такой: мышью не двигаешь кубик крутится медленно, если двигать мышью быстро то и скорость вращения возрастает.

Естественно - BeginOberonSafe ждет, пока главный цикл обработки сообщений будет в определенной точке, выполняет в этой точке блокировку главного потока среды. Затем мы выполняем действия из побочного потока, не боясь коллизий, и отпускаем главный поток среды "на все четыре стороны".

BeginOberonSafe - это, так скажем, не "реального времени" вещь. Вся логика по изменению состояния отображения должна производиться отдельным потоком, который не завязан на GUI и никого не ждет, работает синхронно по времени, со Sleep. А периодический сигнал на обновление экрана лучше всего делать через Services.Action. Хотя можно и через специальный поток обновления с BeginOberonSafe. Пример такой графики (с летающими шариками и комнатами) есть в Active BlackBox. Хотя Вы правы - меню и т.п. также прерывает перерисовку. Можно разобраться и переделать политику обработки сообщений в HostWindows, но у меня сейчас времени на это нет... Кстати, допускаю, что это принципиальная особенность MDI-интерфейса в Винде.

P.S. А использовать многопоточность в обычной версии ББ для работы нельзя, только поэкспериментировать/поиграться. Попробуйте в побочном потоке сделать активное выделение памяти и увидите мгновенную смерть среды... :-) Почему и был сделан Active BlackBox.


Так вот в очереди обработки сообщений и есть загвоздка. Ее и надо копать. Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню.

По поводу MDI - нет это не особенность реализации этого интерфейса в Винде, а именно особенности реализации очереди сообщений в Blackbox. В той же Delphi с MDI все работает на работает и не приостанавливается. А очередь сообщений получается краеугольным камнем всей среды. Если бы обработка сообщений была "правильной", то многопоточность пошла бы на ура, а так же Services.Action бы не останавливался, от действий пользователя в меню.

Просто я как бы новичок в Blackbox, то и хотелось бы сократить время копания в исходниках и услышать идеи по этому поводу.

P.S. Если память выделять не в самом потоке, а в процедуре Method
типа:
ThreadMethod* = PROCEDURE;

PROCEDURE Synchronize*(Method: ThreadMethod);
VAR
r: WinApi.BOOL;
BEGIN
r := WinApi.SendMessageA(UtilWindow, WinApi.WM_NULL, 0, SYSTEM.ADR(Method));
END Synchronize;

UtilWindow- см. выше в примере с кубиком.
Ничего со средой не произойдет и можно подружить BlackBox с потоками


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 20 Январь, 2007 22:47 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню.

Ну, не надо так драматизировать :-) Тормозится исключительно обновление экрана, причем тут многопоточность? Потоки как работали, так и работают. Их назначение все же преимущественно не GUI, а вычисления либо серверные задачи.

И Synchronize не годится для выделения памяти, т.к. время отклика его порядка десятков миллисекунд, а на выделение памяти уходят микросекунды.
Проблема многопоточности серьезней, чем кажется на первый взгляд. Полгода назад, берясь за Active BlackBox, я тоже начал с таких штучек. Не заработало. Ключевая проблема - сборка мусора. Сборщик мусора, проходя по ссылкам, маркирует доступные объекты, изменяя их тег типа на нечетный. Таким образом, во время сборки мусора память в нецелостном состоянии. Многопоточное ядро знает все потоки и умеет их замораживать на этот период. Добавьте сюда то, что NEW не поддерживает повторную входимость. Без многопоточного ядра работать с потоками в ББ нельзя.

По поводу обработки сообщений - попробую поглядеть, в чем там дело...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 20 Январь, 2007 23:29 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
Цитата:
Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню.

Ну, не надо так драматизировать :-) Тормозится исключительно обновление экрана, причем тут многопоточность? Потоки как работали, так и работают. Их назначение все же преимущественно не GUI, а вычисления либо серверные задачи.

И Synchronize не годится для выделения памяти, т.к. время отклика его порядка десятков миллисекунд, а на выделение памяти уходят микросекунды.
Проблема многопоточности серьезней, чем кажется на первый взгляд. Полгода назад, берясь за Active BlackBox, я тоже начал с таких штучек. Не заработало. Ключевая проблема - сборка мусора. Сборщик мусора, проходя по ссылкам, маркирует доступные объекты, изменяя их тег типа на нечетный. Таким образом, во время сборки мусора память в нецелостном состоянии. Многопоточное ядро знает все потоки и умеет их замораживать на этот период. Добавьте сюда то, что NEW не поддерживает повторную входимость. Без многопоточного ядра работать с потоками в ББ нельзя.

По поводу обработки сообщений - попробую поглядеть, в чем там дело...


То что тормозит обновление экрана это мне было понятно с самого начала. Но в момент отображения поток "сливается" с основным потоком Blackbox (происходит синхронизация). Представьте себе, что поток обрабатывает критически важную информацию и в какой-то момент надо отобразить ее (довести до пользователя), а тут бах приходится ждать пока пользователь не закроет меню. И все ведь потоки (если их несколько), которые захотят что-то отображать будут ожидать.

P.S. Если Blackbox был использован для управления крупнейшей ГЭС
(Unix вариант), я не думаю, что из-за меню останавливалась отображение критических параметров системы.

Поэтому должно быть Active BlackBox + продуманная обработка очереди сообщений. И тогда получится хороший продукт. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 21 Январь, 2007 00:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Суть проблемы проста.

Схематически:

Главный цикл обработки сообщений HostMenus.Loop:
Код:
WHILE WinApi.GetMessage DO
  ...
  Services.actionHook.Loop; - вот здесь идет выполнение всех поставленных в очередь Services действий.
  ...
  INC(n);
  IF n > num THEN
      Windows.dir.Update(NIL); n := 0
  END;
  - а вот здесь та самая отложенная перерисовка окошек. Параметр num задает, как часто она делается. По умолчанию num = 10.
  DispatchMessage(...)
END

Таким образом, по WM_TIMER все это хозяйство постоянно крутится.
Проблема, однако, в том, что при входе в меню или перетаскивании окна по какому-то сообщению DispatchMessage забирает управление и не возвращает его до выхода из меню / отпускания окна.
Сообщения на окна среды продолжают приходить - ОС вызывает обработчики окон напрямую, минуя главный цикл сообщений.
В результате чего и actions, и отложенная перерисовка замирают (хотя перерисовка по WM_PAINT, если закрыть выпадающим меню какое-то из отображений, спровоцировав восстановление куска окна, остается).

Принудительное обновление можно вызвать через Windows.dir.Update(NIL), но это не выход - ведь с главным потоком перед этим надо синхронизироваться, а как - если цикл сообщений не крутится?

Чтобы все работало, нужно выносить эту логику на уровень обработчиков окон, но это решение мне не нравится - не понятно, в какой обработчик это вынести. Среда может быть запущена в режиме /NOAPPWIN и не иметь главного окна. Может не иметь ни одного диалогового. Можно ввести во все обрабочики и оставить в главном цикле, но придется избегать двойной прокрутки одних и тех же действий...

В общем, хорошего решения у меня пока нет.

Кто что думает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 21 Январь, 2007 12:23 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Илья Ермаков писал(а):
Суть проблемы проста.

Схематически:

Главный цикл обработки сообщений HostMenus.Loop:
Код:
WHILE WinApi.GetMessage DO
  ...
  Services.actionHook.Loop; - вот здесь идет выполнение всех поставленных в очередь Services действий.
  ...
  INC(n);
  IF n > num THEN
      Windows.dir.Update(NIL); n := 0
  END;
  - а вот здесь та самая отложенная перерисовка окошек. Параметр num задает, как часто она делается. По умолчанию num = 10.
  DispatchMessage(...)
END

Таким образом, по WM_TIMER все это хозяйство постоянно крутится.
Проблема, однако, в том, что при входе в меню или перетаскивании окна по какому-то сообщению DispatchMessage забирает управление и не возвращает его до выхода из меню / отпускания окна.
Сообщения на окна среды продолжают приходить - ОС вызывает обработчики окон напрямую, минуя главный цикл сообщений.
В результате чего и actions, и отложенная перерисовка замирают (хотя перерисовка по WM_PAINT, если закрыть выпадающим меню какое-то из отображений, спровоцировав восстановление куска окна, остается).

Принудительное обновление можно вызвать через Windows.dir.Update(NIL), но это не выход - ведь с главным потоком перед этим надо синхронизироваться, а как - если цикл сообщений не крутится?

Чтобы все работало, нужно выносить эту логику на уровень обработчиков окон, но это решение мне не нравится - не понятно, в какой обработчик это вынести. Среда может быть запущена в режиме /NOAPPWIN и не иметь главного окна. Может не иметь ни одного диалогового. Можно ввести во все обрабочики и оставить в главном цикле, но придется избегать двойной прокрутки одних и тех же действий...

В общем, хорошего решения у меня пока нет.

Кто что думает?



Все дело в процедуре USER32.DefMDIChildProcA(wnd, message, wParam, lParam) в (HostWindows .DocWinHandler).
При нажатии на заголовок или на рамку окна не выходит из нее до тех пор пока мышь не отпущена. Поэтому отрисовка замирает.
В Delphi такого не наблюдается, хотя там синхронизация реализована через сообщения. Попробую покопать исходники VCL и посмотреть как они обошли проблему DefMDIChildProcA.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 21 Январь, 2007 16:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В HostWindows есть процедура Idle, которая вызывается по таймеру от главного окна приложения. Из нее вызывается Services.actionHook.Step для прокручивания отложенных действий.
Мне показалось разумным добавить вызов Windows.dir.Update(NIL) именно туда. После чего обновление больше не тормозится.

Итого исправлений - модуль HostWindows, процедура Idle.
Новый вариант модуля HostWindows выкладываю в StdCoder-виде ниже. Если не будет обнаружено проблем, то он войдет в очередной Service-Pack.
Код:
StdCoder.Decode ..,, ..yDG...3Qw7uP5PRPPNR9Rbf9b8R79FTvMf1GomCrlAy2xhX,Cb2x
 hXhC6FU1xhiZiVBhihgmRiioedhgrZcZRiXFfaqmSrtuGfa4700zdGrr8rmCLLCJuyKtYcZRiX
 7.2.s,sU5N.k,5TWyql.bnayKmKKqGomC5XzET1.PuP.MHT9N9ntumaU2,CJuyKtQC98P9PP7O
 NbXmb.2.AuWA.H.Hi61E.2U.cUGpmWLuOpoKqvCbHZiYpedhA704TeKKw.bHfEWUmL.6..D.bf
 61.CcIhgsNHT9N9ntQ8qorG4704D.CbB,708T1U.Et1m.w,IxUA.,U.k38,86.QC18RdfQHfMf
 9R9vQ7ONb17.,.D,,6.I12U.U,.JFyuv.U.2m,.d.1cUZT1E.sAE.c4E.k.0.e0M.6YE.G.4.2
 UegiJQeFK.3Qwb8R79G9PM7PNZvQRdJ.0U1.,UH,,Uy.,c.o2rFHoA2lqK.o27HHQ52C2FI3Yj
 yC.E6V.A..2UeEeWQ1Iklb8IepZhZJinpZHZCZORNX2hgnRg.AS.QiiIepZhZ7F6.Z52.KAS.i
 80E.QE.sQRtIQeoBjghg2hgn7.X5.u0n9PU.Iy5.,.60cM6.,U00.umUG5.E.Y.2..EKE.4.0E
 .EM4PhU.wcNC.zwPA.A.I.,gA3EUfL6k.W42.0kyix.ow6I.3QwbGmmoouqpCLLmoouqpGomC5
 C.2.y22.O22.1cDsId9N5OP7vQRtHVPNR9JTvPN9FHPMNvPD98DtInvQdPNPv9ZuQZvMTNE3vP
 f9RD79,t71eMTXUIcgBgXRh0xhsxYdc.3gwP.0.b,0.p.,6.wT6.J7.k,E6,X.16.2Ux,EtH,0
 .802.W.0.U,2W.2.0.q5.U.UUV.U4,,k.u1C3......w2.00.k6k.0.,MT..0.800E.606..4E
 5k.0.q5.U.UR,,U1V.2.1sCsI.U0Jijxinhgm3ZbYcjRgpxZ0JchYddRgZphnhgbYZUwY0ZhVR
 A66NOO5PNkIIUDU,2.gD..,.3,,6.2,2..1c1M.,.D0BD0MwcFT9P7vQRdFT9P79F9vQ516.,U
 rUAUd.,.1U1Ky9U.2..s0,.,.4.,sz1M.s.3gwP.,6.252.I12U.kz1.0EJ.1.V20k,1.1s3E.
 kX.cwf.0.L,N.X.0U,M.2E0.M.P.16.,6.,Mg5T.OC.2.mL.61sN6.,.sUZ52.UDU7,,.O1Ikm
 j,6..EBU.U,.J,.V20k22.zT1HM9,d9Rd9PM01.,Mg..2.i0m.4,2.1.06,.AU06.4E.E.emu6
 mcwT.,6.YBw.A96.CcF.,.60sD6.,U0u2E..UYU.A.6.6AU.2U5VT0M.6.,U,o.s,6,3gwP.0.
 t1,.p.0.4E.EJ0.2.0ES9.A.s.,6.A..o.slM.R.4E.M.Z.m.Gk10.,60M.z.8N.M.lE.2Uq,J
 ,,czM,3gwP.,6.Ix.E.0.p.0.zD.6.J,U.2m,.l.,c06,7.,s76,B.,cPM.l,,M1M.D,,c2kJ.
 kRUK.z,S04E92.,s2kIE.K,4EH.kAE.i2Gk2UcV2A.cA6,J.,6T6,N.,c16,L.,.2,2UsU2o,2
 UXV22,2UXV4Ikmj,6.om7.,EBU.kzF.0EJ.6.t3Q,gUcU.Q.YU1U.20YU2U.Q.YU4..E7k.8,0
 k,U2U.Y,AUWU2gU.UIU2Q.2U1U2.,61M.v.C.Gk0..61M.5,,6AM.9,C,4ECE.S,w22UKU,o62
 UUW,I1,UJU,A32.M.1,,64M.r.W,4kHUPU2I,sGk4UGV,A.c.6,UXV,I.2USW,I22UlU,Y22UO
 U,A.2UoU2o.2UuU,Y22Ua0R.,cM3U,Q22UdU,.WC4kSE.CJ.M.TU.YUfW.gj.k.80Y,YU7U.A9
 YU4.d.7.A7.Q5Y.k4.kTK.1c8E9O.1s26.v,1s2ESk.G,0E,E0U.A9M16.h6.YU6U.o4M,.c,6
 .7,1646.F01sBE9W.16C6.lh.YU,A.4k5E0S04k9E04E.EN9U.636.R.7636.p.1M72.,Y.AUw
 U.wAc36.fu.YU1U.g6YU,U.YHYUEU.Q00E0G.0k.0.7MP6.J,7s.6.H11sBkjl.C10kpD.7M.6
 .LP.0k.W10kY5U.620E.0kVk.4,240k..V,1626.16.AU1.B01M16.Hu.,6.7s.kIE0.5,1622
 U.21YUC.rM.s.2U.wj,E0S.gl3k.O3,kS4.7606.J37616.5.1M.2U.oH606.t.1c46.4.7s,6
 .dT.YU72.A3AUf.7M.s,EZ4.7c,kO5.1642U.Ih4E0q.0kk4.7MA2.757s1kyH.7M,EO4.1s8k
 .0U.YUsW.A9M.6.h37616.T31M.2.16.AU1U.wPYU6U.AAAUFE.0kB0.G.0Eb5.1M4klk.W,0k
 Sl.a,0EE7.1M,2.D,i,0En4.7666.96.YUz2..u1.K.0kf4.7M,k9E0O.w46,6.l,7c,k8E0.T
 ,C.0ESE0O.23YU3U.g4YU4.R.7.0EO0.7.2QAUAU.YG0k.u.IW,UBU.gl0E0K.Qb,2.a.2JAUO
 .L.7616.114.,kb4.O.IZ,k.4,,kI4.1656.v.1c5E3k.a.0kPk.u.0kBUDU.gY.k.i.Y1AUAU
 .A,,UFU.ADAUXE.24AUVE.0E6k.4.,E6k.y.6.AU02.,kxk.G00kHU,U.2,AUXU.A2AU7U.AU.
 k.8.Ik.k.000kHk.4.0E2k.4020AU,.V.1M1Ewk.800kHU,.F.1s66.V.1M.E6k.u.Ih.k.W.0
 k.0.1s.koU9.16.s.Eqk.e.0U.U1.nT.AU8.Pv0YUC.pc,AUGE.Ah0k.y.2b0k.8,Qg46.7c,k
 K9.7s2EbD.7c,kQF0O.Ah..kw..AUxU.wb.k.8.,Ed8.7c,kD4.7.IHY.6.x17.0EM7.7.wAAU
 N2.23YU5U.Av1k.G.0kP5.1M.2.r7.AUd.,R.Y.knE0O.2e,.kT.Ex5.7.ga3E0.H17.AD..1M
 D6.z,1c.kU5.7.w1Y.EBF0U.oDY.6.3C.0E0U.IPY.6.59.0E0.N01656.N.7M1E8l.qm06.3.
 1646.n27c.,U.Y1Y.ElC.7s1,U.AI0U2U.QU1k0S,21YUAU.Q7YUE2.,6.Rx.c2,.,M.,UB.t5
 7s16.9e,AUF.ba.AUEU.ge.k.q.0E13.1s36.XX.AUKE.0kh6.1s36.V57M22U.QV,2.1656.B
 17626.xy.AUO2.I20k0C8,s,3gwP.0..IX.E.0.z5,6.JFA0z.6.0E65.gh.k0W00Ey9.1M46.
 T31M62.9B.AUXU.YFA.kV4.7c5kbl.8,Ig0E001,6.NQ.AUGE.o2AUHE.gDc26.Le.AU3V.Io0
 kzrobGoemoW0GYyqtGrfaKrGqrSrtin4WGJem48E,aEs8rreqmCKuakS0GF8Iq4qlUWgV7whmx
 gVphdJjVZidxhiBVx2YWwirxiiwhWhgmxhipZX3hWgV7QgjphoJidJAyKtCr2qHE8mb8qm85,N
 PHvMZvPbPSb9RQiWgV7oiZJinBhjph7U0QetRiolLQimRAU0IYBAVX7QnfQHvNF9RHMD,,...Y
 hdRgZV7gbUI27uP51klU0IYBAVX3hVphbhgnBVx22qk2qGE8HM0HP4HN0HQmGEaIqark0mW8rq
 4qpyKvmGEOqumKqqmtCKtKqmuKEqqrGaUQip3ikxhmZiBAVh22wakAamAag2Y7ZB.UVZgYhgY3
 YLBhi,R7NHfQRNJV9N19R998ROGNO8,tM19PN96dvP,NG79P996VfQTvM99NffQ9P1HM9,NKnO
 KnOHP8F789,dPR99,d9Rd9IUWg,HvQbPR9vQHMDc.3N13M1Jd8HN1PM0HOHVuHZ8J,7HTvNNN1
 HM0bOKb8J9OHN76LOFZeH98HbdAN76D8FHuAZ79,NJbOFZuAZ79,tI9fQhPO5PNb99PM0iom8L
 rKKqmGEqomGrkmGEOoomqmCLK0GYyqtocdZB6ITfQdvQN76F0ZONDPOb9RZPSN76FuP2ejJC6I
 ZvPVPNZ9RHPNb99PUKBhZtQN765uPR9RyKqmqm8rtmGEC2448bg6FHPM69,tEoiZJiohgmRCwh
 XNPEKwed,mGES318QH99PM0H6GTvQdPH9vMFPMaqtqqt0GIeGEGqruqHGLE8rmqqrOrm0GJamR
 qk4akVyIbCJeqk2akouKcmqkCqmeGEqHECnMin2WGJ0GnmqkSKEOqr8LEaKr0Gsmqk66jPOR9N
 66JN8PM0HMRR9RH9RNPN7vG9PS,ND,d65tInvQghugiiZid,3tCPM0HMMN9PTvMLONn96EYyqt
 Ib,ZhgxB19R99NPONPvPZPS3tCPM0GrrGrkmqZKqw.UIxhoBA3tCPUWBjohg9hgt32.IctZiZR
 iWQbBA,HvENvPbPN,ND,NAV7ArN0Fd8iKryqvuKEaKr2djRCPGrKrt0GJa0Crl8rrmKq8pkuqn
 KKEq1htAl7BrN1HM03vPZ9N9fQj86v76f76J76VuPZXi2ijBhiZivgV7sNfPMZ9N58O9vML96v
 76dtCPUpRiZReZ3iVJiVZijJC,ND,7JZOJ9uC,dPTvI99Q11.BOENuI9uC,N0Fd8,7Q1fQ1PP9
 9R9fQb96dvP,dM996fvQ99N,tRH9RF9618QVPNR9NHePd96JN8PUhBhiBhhBhuhgY3Yx2YBBcM
 3Z7pdIhc5hcGBZvg,akWuIeKId0mS0GMGIgiHEKodCIEqHE4HVWpRqk2Ye,JcUgbUMCluC,7Hd
 OE386MEluC,dI7OFN86v76VtBluC,7H7OFN866CluCPM00Ja0mS0mM0HgiHE0Jd0mSAalUEheU
 g58HgiHE0JW0mS0Wn2fvgV76FN86vVoU2JeUg5KHgiHEGoe0mScBluC,7F786vVr2fvg,4Ia0m
 SsEluC,NEZ86vV23fv2Y,heUgbUMFluC,NE786v76OIgin4qk2YgZJgpxgUg5B0gV7AVBAV7Ah
 YZhZhekNMAdiZiZJiqBgg3Yx2Yp2avgVB6Jn8I9O1HM0FmriKJ0mS0GcyoYuIeK2duH,NE3uId
 eI1uEd86ZOF5uHZ8F,NFR8FrN1Pk2SpouKmc8,ND..98KdOFRuIHeENOF,dI9uEEISpouKmsQR
 tJHfPM8PM0aEoyqriau2Y6xhjRhvgV7AV7wiiZghIbUgeHh6oZ6BgiZgghgvgV7klWqomKmqGR
 0GVyobmoW4Ibin2WGJAha3YrBhiVUAhn3YV3YX3hdZB,tPB96d9O99619QV9PHvM19RHvP0mva
 4c8H,GKqSKR0GVy2...FPMb961nNGKEGqo4Kq663vPZ9N8LEemIq.OqoWLR0GVy2.wid,a4T9Q
 9nmGKES5ogd3jUQgjxhmZgdphVZiZRiUI3ErKKwGLR0mfaKrkRaEIe0UUIidphbZZUYij7QZPN
 hPNR9R,tN1fQ3PMDPN,tMT9PNPN59RHvPRnrOKESroUn32UoJiV3ik7Np7630.AB.0ml4quCrm
 GaoJiV3ig2YdZiUwijphbYCDPNd96H9NNPN,NP9vQbPMDPNb961fPnPPTfQ996Jl4ktKKuKLse
 HE82UBA,Gqo8LuaLR0GV.A,YgdJio76PPMZvO,tQFvPjfP,d8H,K5eHE..S5EtKqlKqoOrmGKE
 4Ku0GqKqkCLu0mruKEqqmC52YeA36Nj99,7NFfC,NGR8JS2rN0F,.bPOpPN,tMTfQZPN59RH1B
 vPZHuyqrQiUIZd.PvRNlqWKR0mY..PPMl96jPOR1.J,YgZRioJijBjZZgu22.q.SLoKqmmKcyq
 teHECJYyIdGpYuIein4EuaKumau2YKBhZFLGpoGLqgV7AV37Fr,Goo8rmCKuyatJZUg5.Z0...
 .QiiYcdJiZ,am4ak2akuuqoGLJeHEaIbgc5VBUdphqBhnBhWZhZJZu2Y0x7.MRqqrOrm4Klmqm
 ..El4qliqn8rrKLrGKJeX0,gV7AV3,sI5fQTX7phaxhe2YxcI90QflgfBAV7AVnBhuhgeIbUA7
 .kq4qtiKJeXHhcIRbBA,ABJ79,NP19SJ79,7Q1vN9f8N76VvPbf8p76H0.YimtM0prCLJ.k4ak
 2.PM1HcJ1eIPM0OroCru4KqCpl8rrc8p76.i1qqmqqYuqdGrkGruCLJeHE82.ohjBck3iLBhiJ
 Zu2Y0,66Fd8aIn0Gu8ruKKEyKrmqw0Guyqr2YrBBEE4KtKKECLoy4.RnVmqoKKrGrdCKt....6
 RFPNCKqaqm66jPOEEyKn0Gukk0bg,kv.GqrKqtuqHGbYBhn3igBgt3YnRgmxB0Gl4KtCLJam4a
 UahigZhHBhuhAI6...kl..wBUV,..YA.....UXJiZdPJdC..OoumKqCrl8rm66YA,,VvP2Ye.7
 POqGR0GWaKtK4sCPM0qqkaKrqGK0mlmqokKmGECLu44bP9p76f0.sCH68gBHfP,tRH1Cbe.fno
 gZuMGR0Qb7UmhgnxhghioBhjlrOahBA.2Ye.59RNvA7P9p76f0.k4sQ5vJP79CrlWoKeHEa2.s
 Q5fQoBjHmGLo0mkuKm0GoKqoSKoGLEemIkqkfqGK0mq4qo2dhIbU..gB22u4QggBB2YVJiZBgU
 QidJD,,.FuPTvOJdCW2iXBA,dvJHfP7Xg2YaxedpBIbUwed,r,Grk8rnKKu0mku4BfQTfPd96B
 vP5PRb96jPOR1b1AVVxedpBI5.r,4qlGroOrkGrmGKECKoa4SroUUI3cP9vRRORPfM9fQp76H0
 .ohphhWFEOqrcP99Sd96ffPdPO6N,7NT166J,SrouqUuqlWqr8LR0mfa4Q56PHvQd96OaVZhg3
 YrBBsQNFn8bh3Yoxhk3YoxB3vPd9RTPPN76BPOZvQd96HvQ,7NfPPn96FPN19N8LE.3vNjOOR9
 NI5.r76H68QgpJimhgiZC3PM5vOD12YrBB69aKn0mkuqw0GJa0SLoaKuKKV8ruCLomGEuqumKq
 0pmuKR0mXGoYIai27YBr,7vP5PG5vPR99,7NHfQdnYCqruKR0meC3..aanZiVphXhgu2YJR8.U
 7UV3ik,UdtQd10GJUXJgKBhZNNZfC,tJUvA,2inhgpZgj3YrBB66BvPQggBhkJgjBgmZgUYgmB
 grBhixgUIZd.AggBhYJbUUA,H.59P.QgjphohgiZin3YdRChPM66J,q44olG59fC,dE.UhVUAh
 n3YVRgoVUwid,e0AgXZidNMaKrSKR0GV..fvQ9HEOqr8bhxhpRiZ3Yr,AgX,wBe0UBxBp76LON
 ZfPoZBxhYhighgvg,OIt4qqKKc4qouKueGR0Gc8pbCoWGoe8pWWm4ak2akvuau2YJR8.UUghnx
 gg2Yr3eVJig2Yg3eVJiu2Y7,AZu2Y7,QbBM0DONdvI5fQTX7,p76V0kW....IgVJiu22.0Gf4I
 d0moogjJbUQeXJij,AZu2Y7,M1QeZZiH,Ue..90.....UU.ERUj,QbUIiZZgmBgrJbUAdC,a0.
 in4qk2ogjphoZZUAhipApleC3.k4sQdPMdntWIK0mkmKqyag2Yo7RIbUAdC,M04KqkdGLtmGEG
 rrkdGLtmWWBjotIdfQp761eIZOEn86ZNBh76TeF,tEFOEZuCPUdZAGJt4KsKKme1Y7M1Qicxhr
 ReoBA9fC,NG.a.CLoyaUQgjhhhBgiZgUogjVVVr,I3qU7Yh0xhmZAZ99,7R3uPZ1Ii0xhm,8KV
 yKtER00.UkBgXhABvPZHuktAhi3YhBA..Hk46P1vQdPJV9N1Xu.UBgVB6IZuH50KIECpl8rrMH
 T9NVeQ9vQbPN796FN8p7630.3OFDOGRO1HEdKIeKJduIEKpd.DONdPEbPSRvMLONnvIdPMdHI4
 nMWoI0GS0GMqk2KIb2YHRgm,T1UvgVBAVcIZUAgp3jdZhdBgmBjU2ijJC1fMNPN,7QCqmGqusQ
 ,d8g,.g6DONdvI9vMdPOTXcwiu2YL,iHEOqrC4NFvKKtGroCqkmKR0GV.k2ak2UKB6,tQHfSmG
 ECrmCKumGE0rrI5H0EEUqBggFR.M8rN1HEfkqCrneHECoruKu85KKtoZExhgZhHhgXNOgdnxgv
 gV7I6M0Fd8,7QT1EJaW7MPbvNRdNTvMfHEenS0GnyqlsC,NPbHLOrm.0GRqHEOrm85sCPM0q4S
 LoyKqKqdaKxKKEenS0mMiHEq40rkYiHBhu,0nR0mqC5Ecyqt0GRq1qk2.hPMNPO0GRqX4B6bWU
 gBYgjphZ3Yu.k4sRRdFTfQjPMZ9N58RZ9PPuQD98PvQDP8rN1Ad43YhRCR,Ye6hcChV7M0bPO.
 PvQDnv.sC,lmCaUIbx.05CZuVkxhn32.EcsCPM0HM0HWnBB0GS0WUYe6h6,tQH1pVk2Y3p7A,U
 ZRAmHE01UZVu.modaIX0mtUy2YnBBY8.I5CrokWuIW.6QTvQuHEC5gZUQiZRAGJYEsy4p,.U3,
 .ES0GM.UuEMcHqk2akWmodKIECroERMAQCcC2av2YkxBUBAV7cHi1Orkmqo.P1h1qk2K2,tF99
 RkosCPM1H6I.sI99RTeQHvNHfP,78jXL,.Y3.I5.iHE0rrI5.amR68JltKKu0mr8roS4yKnwCG
 4DtQ,dRHXUI3cJ.p,IC.buMZvPgdnxgvEVMGUkdQ.UhVa,,,B1i1oZqhAUUUq,sCMPsPV96pND
 Coru4MNsNT9RT9ITvQr76P1VvPb966QTvQrN1a.YAcCo6sCAVr,44.W0DP8PkWu2bONd1sCPM1
 kV.QATXU2ZrJ5j0Q5Ug.Uu.kRYgdJiu22.EIsQ51IiZZhVZidpiZZZUIgt3YgBhihgUwB,7Q1v
 N0mouql8rmqqmu4TfQ,7N9vMZPNP1e0o8Uu.UZVH,q2r765fC,tEMMgAumVyKrICgAr76hfC,d
 JHPNCbKVvgV7I6a26QYC.sM,dCvlvuGmyqluGeWqoCrVyKrG5EIamR0Gv0GRqHECKLGJocFTvM
 fHIamRqk2akYOYcoiUQYUod7Z7OGEWGvAdH3Y1xhiNM.h0H76d8Gg,QcjpB.OokGqmqok8rpCL
 IOLICoru4.h0uGeWqoQ6IC.N76BOENWdgV7MFQ5gBoA66cNkRUioC.,,h1kR.wBEmaKtin4a.6
 Nu4pV4,r,j1AA.23A3K2,llUvgVBg,FFJ0mqaqtCqmmKq4KrKqrKrt0Gs8rr.EJam46I.KY,Rg
 ohiVZhLphYJZU2ZdI5f06G.aEVMGqEIem4ak2aIXcNjOOR9N2YX2YC,ojaxedpBoZX3hdZBOGE
 Oqfa4MRbPN796d8G2YGhcIh8ogL,wiiZgBA,m2,dI98Jkq44PM0HMFRm4emIqk2A7.66..UiQA
 ..gC..cN.S5EaA7Kpd.HuQjOOG4hOObPO68PPMHnI0mF0GM0Ge..P1P.g6.0n4a.RW7g60mUCK
 u.in4qk2.UI3hdRiL,0GISLrGKR.6GUdIbUwed,rN1H680GmKKuKKtqqouqm0mv.,dMn96H9Rb
 96jOOR1V8RZ96JN8Ic3,HkYsRR9N,NDCKlOpoMNumvuKm0GeW2.QgWp8k4ak2KIa.UHBfHZ8Pe
 9hOEN88jOOR1NleC3sFwedpBYdjphbBccwiiZgg2YkAZdgV7MFRm4UUYecBB.rl4..18QVPNRn
 YEIOpU8ZnJbUAcG,TeF,,ZGEuKR0mY.iXpRiZR84aVZCIbUI6UdU7o8YhZphuMG.Ahg2YeJbUA
 7.GKR0mU83Qam2YDp6UBAV0,MEbuI9eId88R96xND,7AN76Z7AHtCPUd3Yug5VtC8pW0pW4Ieq
 k2ak2Gqhaqi0GRqX13dG3Zn2a63Yf2Yi3YBxd23Yl2adQbUAdCRccAhdQbUohUIbxcP,7FHeJ,
 NAVtCPM0akYMRb1.2Ya2YcAhUgdDZ6d76vlNaGEOGEWGr0mF0GMaGEGJYEmipoq3IYbIYv2Y7p
 7669eHkeuIeaIa0Gr0mS0GMin46P9fP,dCvFaKIbWmtaGEqGE4nRqk2IhUIbx6A0mfWoYmoW0m
 tiJpqJECGE2fUYcD3Y7p7eqI0mWuYvU7Fp0mJ0mo0GSYhZphUYe6h6PU7I8VOF2Y2hc13ZdBZv
 sQreOIbx6NrOOiHEa2keuIea2H96v76Vl4M0bvKJPLEMWp4ak2K2PkW6618QUitCq...66FdJs
 Q.w7.,7Rp7610.M8r,h0NXu..H1.UX3husEFWvg,.YBI5m2sCPUd,VtC,,UdhfUQYU..HHE.IB
 .Z0sMF96pNDGrheqiiHECbdFRsMFvC,NGRWetC,NGMOgeC,FtMF96v76V7KH76TeI,78HnSYhZ
 phdQbBktYhZphUgZUAaR3YuEMWp4g6.QbB..QeoJid3iIBhoFEWGf42bXKBBCbIBBAZvgV7cJM
 Op76H0k4.kYsQr8Av86v7637D376d8GU7ABMA0mfW22ZnRfdlFIYyIYd2Ya22bvKUkM8Gob0mt
 iZUg3.bvKqpR.MF.H6F9uEFVv.0GR6AM0M1EECJu85UvM1.U5dPdOOdXUsRp76j066RPMPPNp7
 61eIU4,2YKVoBhoFRA6.UdUcknKKrKKt4KuKKESroUUYidZC0GnyKt0mk0GmyqlMNc8M0h0Rnv
 uokqqmEdUqY4TeF,,iXdJbU...A7SLLCru8KEGJY66dPOsKVNL,dCvFFmXv2YoBBMAv86pVk66
 98HKYoBhoVk.UC,a2RPMPHECGE8GF0GeW2PU7ABkRq.HsJFOGNWiBghtKHPL,t60XUY6a266.A
 7WmoobUYad2YaEr4qqkKGni0mSc93N8,,5OEV88RPMUngfd2Yx22Te6H76B,.ENqpI0mS6F3N8
 ,d7..4niaGEq15e6HN1Hk2GJYKIbU7ohVhB6BI52fBk2K2r,4Is0rm68dPOdXg2YiBghN8PU3Z
 7qk2ak2Goo4Kqc9POMVvIdfQHfPWmuuKua4GqZ69,dP9vRgBin4A,10.Y3.6618QV1HWcYid,U
 phhWFK0Gryqd2CsPAZvg,AdCRccohZxCUdgV7MFR0Ad4tREEUUAck3C23.3dD3V3l4UUw6R1Q5
 ..6I19RF9JH9R2YcUL,iXDheI3YoBhoFRcIkb.a0o8YhjRgu2Y4BhgFLmorCqkwhmRbUQA.rlt
 4HK0mt8HR27bHX.BORNHb4qqKqR0mom0...YhjRgUIbxsRmqrCqR0Gua40GRqXWIYvgV7AVLBd
 I3dUYhjRgu6GT1UAlkEEGobqk2ak2a42av2YX3hUI5mqrCKL0rkGLoiJMqpR0Gp0GRqXkkt8HE
 enSI2UL37sMF96576V,q.akY6859OqXWYfWAZUwdGll.Td6H76d8Gg,ak2QilQfehfUUk2fv2Y
 n,CrMGmR0Gp000n4k2KIa.HM0C5.5nRA7IBP.HMFRmRU7AdCloQ559Oe1N1UdhfBAV7MF.C5.V
 7Kq.aIX685OEQilQfkgfd2Yxka8mI0GHkU.XNLH76sHc7.cAvO8,,70BVnB4bNL,ND,7AaWDJe
 BU72Z1BcE,V,I2.50MA.T0.EN.C2,,.CXd22geWAZUUnFOqJEqXk.U723.V,IYGJYd2YakV.41
 kd8mI00.I4UG,.sA.50sQY46AAZBU7oYU2ZnJaUQYUI2H76d0k2Gro.IYcIYv2Y,3C.69,tQam
 R0mU..IYdIYdgV7kWM1akWm2MFRmRkU2C.kvuGr4qqAZBMF22.d0i1.UIVHZitZB,783PMbPNN
 76B9P1nteHECpWAZu2YHh6rV0,MGojcwedpBQiiohj3dHRgmxB0mYuIEOKqkI0GeEEaIbCIaWG
 l44Iak669eHin2W0FvPZntC4IgVJiUI3MG..oeHRgmVU....UlAZUg6.hPNZ96bvMEl....ZON
 bPOpX7pdU....4HQaGEK2UnBBHfPD963vPZ9N9fQ,,I8d08qkCbBAV3VI,kR..9eL,78jXL,aG
 EKJsG4Cpl8rr.b96FdNTvMIbUI6.N76ROFjuCPk423WYjFJaWB6I.2Yc2hfJbU27AZUAcXNOhX
 ZJZU2Zjphu2Y0,.YZUAc0R8kRqk20Jd...ocjRAeWcwB........8pmCroc8,78j99,7Op76Y8
 M8N76..M1PEIsJUUQgmhgVZidxB,d8Ec.kb0rmuKWyql0GISLR.Q5N99,7RN76Z99,FR0mY.iH
 EqqouKK0mq2ju2Y0,sC68JFnaKtEs4KtGLEyKnwdkhAN765PMNnmGKEOKtEmaaZ,umr05,d8Hl
 2o8YgrZZUYAN76ZPNbfC,NG.wiiZgusF7Wm.EEqKRgeHVmMH7OG5eQ9PMKqdGbpRAr765fCC24
 48rtQ6ICgArN182U,ReH,x98j0QCHvQduPT9P,NGRmvuGnmqkS4N76Z7Ai1qKLGroEEUWU7A7S
 po.MEf9S,NGR0UUYe6h6qKLCKq4qtCLEe1yIlKKt661ORlf6PM0KIa66Pf951..GYXJYBAV7cH
 in4AVhNORvQdPMERqXdphnZCsCPM06S,dCgeHh6sEjOJbPN7ONBPMf9PdvCPM0MS,dCv,...Ur
 3Yug5....WKEenS....a2F7P,dDv76aGEO0d96xND.x98F7P,ND,7AH,FVx.cQ,ND,,cM,NDM8
 ,7JFWBk2qas,NvC,NPRNS,,dvCPU7A7ICx76NP8,d7ET0GuaGEG3U7gBj18LEqGEmqREo008KE
 qGEGrR0mvuGnaKw0GR6JZWBAV7AV3l4.rFIem4MG6PmHE8rI00GbwcMH76d0M0PHwUg,j96cQ6
 PkwUolq2BcM6RwC.G3kWm2PU7.MJ....a5....kv.....W4...M1HM0u2emIq.PntAjg76pVI3
 B.FtSv99,tROKqkIin4MGoDj0S5R1EE..,,U7lq4Kw0GeW2,NGC2Pf9b1mGE8HOaGEK2H68Jlq
 MOPPOp1JVcIZB.MOR96d8G...nN8,NF.aadhB.emIq.90aUh7PVOMZPMP96pVHBfH,kYu269,t
 RHtCPUrtMF1e1deIQbBg,HsMkvYA5f9d050.FN8rN1A7GqooZWBgXRBEm0Gek4kvYgjFcEdKql
 2ZgZZUYCY3amRq.H6Nj96pNDWGt0mKYhUAZUYc7p8jf98rkqaigiiBhoRbUYgc3Yug58KEqWoB
 ZUY6..EIeWIxd2xdu2Y1dQZ1,7RFPO0GJaW7M0HW2xhXhCsQRtRuqfaKmG5HeHCKLyKsGrt0Ge
 W2,NPS5ghVBBj8698HbGEsREmSLEKIbGoR...6G9PO66HeH..6OkqEY0mWm26OEmWKEKIb.qas
 ,VtCqat,g,wCBPOUI,a.PntUUUvhjBA,90sRRHEenSg8UHhgiZgBhgnRCAccQggBhZFK0meC3s
 JPOH7OG50YZU2ag2YHBfH,18FZ88PP8HtCPU7Fm...q.8rmCLEe1jOORPEVHLCpmGrfohYtRVu
 Pb98PM0ak2S5N76X76Fd8WofuIWyJVyIeGpbqIEemImGE01V79.SpoA6sJVuLRuHbOGpOF,t8,
 tJHfP.kayIfKoIqk2a..oD6NQCUd,wCm4.23P.HWhBA,,0GtKqt00K3kdWqrwedpB2ZrphYZ3b
 N8,NFRW7.1no.EJk2a.AB,,.....oad2Y3l2UdNO.M0K2q.5f9bONdfFTvM2ZrpZYFLG3OpoKq
 vWmIamRq.ZXU..KKu.oBHtCP...KJsULBhi,k4akW66TmmY6in4qk203.CItKqk6FTvM,VidCK
 3EY.rlv0pkEK0Gq03IbUAdCZ8M8r,FVnhgXxhiZgU2iV,.N,.kva42YcdPcQ,,o8IiZ79,tMj9
 9CKomGEKLK0GmmKK0GmGLK0Gm8LKYgWJbUcHUvER0mf.rltGrw69OKR0mdsCOLR.bHfkR0mlyK
 qeHE0pr8LuCb1xhgxhmRbBk2GqleHEK3.kRIiZRgoZ35fQ9vMdfC,NJ.ZON5nRQgnJbU.6I5eQ
 kdUoVusEuaV,Q6RHt.rV0,sMb96pVH,o8geHh6..EKYhE,HtCPUr3Yug5.ULdP69Qii2iVJCCL
 LmKc44a0ICUJ,Q8SZiVA,EK24C3.A7UgUdQbBkvumvu4pVrphYR5HEm.f0sFYc13ZrlIi1Sbkx
 hm78FuPbHcICbHcyKtAZiQeZ7FYgXZZUwiiZAkYcT.C5W2y4,,..qk2AVm,.sIQeXJCIeVtNWm
 vuagMJ.8IYyKteLK0GMmWnRgm,EK0WdgV7MFQ5.F,.O3EE......91EdsNW0.U0peZ7RN76V,.
 EK..oiUIbxsRR,.68iHEOKEenSQDrN1HkfaIecRp765uPAAUKVUYcDh,akl00OLLGJoaa1Fu85
 KacA3kYsM,t6,,,7JFWUogUI5CKLyaolWuYBkWm2Pk2o7klyKq0GRqXKBhZtQGbVphn3iVJCR9
 Rr76hf9DON8okC4EmWmlyKqamRq.jHmmqn0GRqXcQj1xB44EryqV4KtKKumGECor..bONNPN59
 Ryax3Yh2Ya3Yx2YvhjdAVcI3PPMbvO,NPT9N9HJg,HM0Hc7Qgj76vFcyKtQC7POEV4ql.AZvAV
 cEmaqkEEAgX,66JN8qU7QioBD008oYGpdWmeCpWU5lfoBY7.M9XdBHN8rN1QC.GJosIEICLua5
 ,N9,tSZ7AN76ZNAN76X7Cv99,tR.i1a2j0QCI8a4.UUY8g,QCERsQdPSM9Wmfaa,VLReTZe6Bd
 1Rd4Je,hd33Yf22.MH18KHOHHeK9eET8KHlJ00.IcDJe2hcGh,KIa.H.cC.Q3.Ee.k4ak2KIbk
 4ak2a27Ht..G3k2.e1.P,...00oB.P0.0mJqk2ak2aEESpou4.HeHHOHHeK.,tJ.cEUUQZUw8.
 YcAxc4Je,lIin4Et66sJ.b8OTndCKtEV4KtWmvuKmsJ.8oj8obGJYmGES3EX4IaCZdU3,cQ.f0
 sI9nf6NY7.M9YZUwdGZccQioBDamIi1C52YuEV..D0..Um2adAZvU7FzGqo8LL..EEaY1ltG5m
 WsAZUgcAR8,NFluEN88b1.uYvAVckv.,NN7vN996JV7AV7lvYggFeW2WGJ0mY..VN8,d8H7698
 HMGRuE.MCH7690EmAAMPTnkmKEOKt4qqYZUQAEEYgb,PM1ICUJ,Q8cP6H..mGEyId.A3r,Z1..
 .03SLLSLrY3VVk..iLMmGE4HK0GNmGECHK0mOqrIin4M0FVixhUQidNNNFryKEqqrOrmmGEEx0
 mr8LmKKtm0IiZZA1HKoA6659O1fPDHm0GJM0H..U5lVmqoK4ZON5HISLrEtKqlAZvg,KLEe1jH
 n85u0G55vR,dCIiZRARdQHvNFnR0mlW4.8qrGLuyavgV7sR05umdKKuCpoebc2ag2YkAZvg,6N
 TXE7PgAWGmmKK6RNVmFmAZvU7,BPOY8g,A7Gam,Ui,.HsRUHhAZON5XkYZU69GaUg379P,79,7
 N396PVoBZU2Ze6J.8bXZiU.,d8k2KIaM1aU7A7SbY,66jXj,.6AQgr3Ye2YpZZU6O,d8,NRHN1
 M090,tRR7N.UWxhmVLZZUIgj,sMj10mK0Gly4.F1.UdgV7A,HMFRm4M0.98HaIXwCm4k4klSLE
 e1F7NZ966PH7670fvCPU76O,dCEl00G570.j1.EM6AYgm,N99IA6Rqk2akWMFPU7ICUJ,..klm
 qoEKQgmhAa0sMj1WWm,N96L76Z76J763vPZ12Y2B72Yf2YlQbB.F1cMEu0mJ00....aIXojc.Q
 C27UUA7cNN1H76BVXxiUobUQgmhAuGtUUgZUYakAZUY82YXxiUI5CKtK4.6CV7690PM0..UK,.
 ..Way2YX,8466PFO.Eo0GR...l,EIk2UXxCxFtKqlcQUI,SbuEt.U3p7A,UcdD85IAUI376Oe1
 ..9eHc8Ur,.2ZW,Y331..,t8,7NZ966PNFly4.8KEEua0KIbQ5HkYkvYbU2aU.wCpVk22.EoYb
 U24.FHR..jndKaH,5vRN,HtCP.8pmCLuyKtKKI01VVXxig..f8Q71rN1H..buMElEIOoUm2HtC
 PU7FzSLLOqo.wCbON..0mW.85ke.kfoBIeZRAS5.H,SbhxiUI585uGt.PFtK4mqmOKuiHESbh3
 hUIbx.IAUhcQEuyKsin4aU6tQdPHC4a4umYuqtAggZh2Jij3iIBgmxAWmvu4SrIi1SbnhAfHEe
 nSYeGl4g60mV8rmEWsC6IQc3V3tHVHrGIqSKEWWu2YL,iXgFucQN763fCodItFQ5PPOmWhFRI6
 Ud.FVa,AA.69C4EnwBGqogAyat,00AVK,CLK6SQgtZZUQgrVcJ5H0UrpBplXEN.ktGrwcC,tIQ
 bBk28bXdC.I8QbUcCcPABkV6RZvPgAr,.4283jOOktAhnZ8MGEnUg2Ym24ktUU.FXH,FtSj79,
 NAn79,dAZ79,dAb79WGJ8nOmGJaGECnMqLK0mv.amRaEI6N44mWnBjnhhZphpZZUIgjVmZ359P
 0rlWqocQ9fPN76VHsKLs0GJa0SbX3B22o6sC,tRR7NcCYeGlREtQCMJ.D0u483Wmq4qoY3ZPNA
 3sMj1WGtKqloZm,.YhZlI0GWENin4ak22jUI585.,t8,tMjHWaIf.2B68UW,.6RAZU..n96pND
 85UUQZU6OGoYO3kY68o5AZUo2Gby.cTW0vFMUckS.ICvFM.3nSkI.PU7Qgs,NXXBjUI5GbBk2a
 28by6Po2cDG5d0k2CqvUm32mqR6Oe131dvC,tROqocCY8g,HM09WB.iXc.H0NHSICEuY53P8,,
 k2CKwUgVrdCICYBAD6RQgc,31dXr,Ee.KIaM1AVm,g8...F,.a0sMj1W0oZm,.YBA3.Us,ZPN.
 00Sb2,.F1W0cM..G5H,.MSEt.222B70qk2akWu2e0akYcPTPEV9QohUY8U7QC66sQUfsJuqUkf
 MH.kRq.SLr22g8U1JiZBASZiV33j,3ZLBhi,MFluL18IVuJHeH7uHj86L76j0.6FNuFPuH7OEN
 eFZOEPGKqk2AV7..8mb8qmEEYhbJYg2YWIYg2YnZitFKQgs,sRQANN1HM0a..ME59Rf1GKIaGK
 2agMOC5RXgsIn0P0W0UgUdg,KIaU7AVr,...y4sSVNTN763tH3PNUg,..l1sMj1.H..A6.Uk..
 ....kWu2aUm,.sIFXLdPyacwCmWlAZvg,CKEkvsPY8Q6.23r,u0O2ELG4UKNNWWd.Z1MJ.K4.R
 nIg,..MJUL,.PkW66TmmY6in46I.sEU2Zhb3YccPeXJR8EYUZlv0pkEKYBER.M8EIsQwB7Hs..
 Nll44.wid,,7O118LE.h069wC2B,7NNXYZCGKtmWYdC.Q5eXLFmsCPM0aEmYZUghZphpJbU..s
 C8bXdCKpd.Z0rVnle.03kdG5GrRqU0,PUXRiUUHtI.Wme...Y3.H,SLE..sJUgkt2CsQHtCPUm
 ,g8UHlfoBY7.mWkkd.U7,Y3sCsRRtR2Yukvuav2YrtMF1EXUvELGKq2YuEekRkYcTFNOR9INXZ
 3Y7pdUUg,,7Jk4AV7ghZphp3Yuke.S2bOSb9R9naKKr2ZrFKM8k285.UGNPTnmqomkqKKrY3Vd
 FV7AV7GN76rPTHtCH68Qe1xfHBdOFJM0HkYEryqU05uKEUUIC00..MN2369EN0HYmGEEEK2aEI
 .POGa222A,85...9Xc.N,CHMWIK00i1.10.a....MN2369MAZ7AF89..ZOFb8JTeI986JV7kY6
 N8LLKLrqqrMM66d8GgV7M0HcQ...qom68EKEM4HMWIK00a.kayIf2Yek2MFQbBg,HEm..S27Wr
 lIi1wCVHt2Z6VExhmtQ0ZmN8CpmY6G4,tR.A7uLIS37XndPW2y4,,..U7IC..bWHRAcI1nn23Y
 3f0EVW2p1QC.694nIq.K2AV7MG68.Ef.00...HcQ..gA.ZWb78..8If.V79..N,kW.IC..DW1,
 83WmvUmhAa0MGwCa4d0k2CqvUmViIidxAiXX3Bp,El.r,akvYAQ883WGM6AQgr3YesRRFt.Yig
 2YX3hUI3j1.AZBM0KIaM1aU7wCEcYBK4G4YCICM8U7QAEIGKtEmmqIY6wC.kRq.aklW4ElUo76
 70..U7wCkd.24017HEEqm03966Rq.KIb.a25vRm1,,0mlSbuEM00.Eo0GS24.FHR..SbHlda4.
 FP8r,cICLuMNEMsMj99.UJ3Cggv..QeX,31.H,kd..M1HkW.W2q2.u06P.85.SbvUrtQEEe1d0
 PkW6650Y6DvCqk4qk2WWesJUUIZeM128C2g6FtRw8kI0GXIirBAYim,J76FdJ1WhFR.kmQiigd
 ZRCM8N7698KdOFA7QbBA,h07fC,dE.rFtKqte1sFQbBcEA7MGwCUUQ2R0k4M0hOO9ntQeZdITv
 Pd98jf9B1mWr,oZqBBmGESLEqHEOqfaKrEKwii6PkRq.HsRO2jPM.cLFNPbvNHtCkfUhRibJ5.
 .buMka667uHk2SbJ,.84.g,akWm2P.uYv.HWcwii.0GJ0mxSpou4CbdRi,7SN76j0.d0v96v76
 rXUoYUsRCrm4LECGEkIY8.H6N,dCojcw8.RPNhPNZ9FHHu2Y7p7.aGEOWrtQoZ2BhmFIamRq.a
 kYEm0mF0mvuWdJioN8,d7WWUg51vJHfPM8G3U7cQ.f08XHhgiVn,1mvumv69K3kfod1BcXZidp
 CY3X790nI.HkYMJ.HGhyqrqqmGKISLLS5H76576V76EE8bn32.6FZPMjPH9X0Bgm3ZhBgdN8KI
 bg,AV3l4.kWU3FEOor85.sCPM1H6I...sI9ndIDJFIAhYZCN76FPNER0mY.a0oe,Ft69WLK0mw
 mGEGqvmWYdC.QbUQgmZZUcQp76f0cICav2YkJbUgeH,0praKrQbBAV0lYU7lv2ijJC,t6,dH22
 M1AV7FIS5dHEqHE0XUUchgdVUg56J66jndsIcLFNPHfPH1YZUghdpBUdg,gcA,AVrtI91kvaKm
 Gbg.M8rN1AV7IC..D0.9XcwC69CKta0M07vRkvaKmGbUgZUQgmpZmBhblRYAe1FPNH1,N9ElyK
 u.M0HWy3Zd,.oA.wiUQYUQgWp8gAH76BVcYgr3YX6AHlb2279O,t6,7Aa0M1M085ke.kfoBI8.
 kv8rIi1A,Vf9l96pVrJiiYhZpArFsumwI5EuyKsi1Hk2A7sJUnNOUUA7.EeEE85,,f0sI5fQ9P
 NR9JTvENPO6859PK4NFsaGEK2r,aUs3YuEsuGwiHEaLEe1Ajv.HkYsJ....,7JF07OF5GwmGEG
 qv0GWa2ZN8r767OF5mwmGE2hUYc7,,NF.aUrBhYZCe1jXm,sRZHqEE6NjvC,7O9POER.3122S5
 dvP00WqRqk2M0a2jnl.d8Gg,A,85ke.S250I8sMUgsM.a.71QgmdQkREEe1cMUBAV7M0K2U7Em
 .bvMjuC,7N.Wo4aU7A,9eHi1A,HWs3Yf2YrBhYZCuHEGqv0GeW2,7S,dCYgr3Yh2YrBBMF.aU7
 lw0mJ0Go.,dD,Fo0GeW2aLEe1Wah6O91g6M1aU7MG2Dt76006Se1V,M0A,HWt7D,,kwI5.68qU
 7M0a2lnJUoFTsRG3widZAI5Gqvg3l969eHk2A,HWtt8.0GT6OG32hZBBcC6OqWt3Y3,emIqU7M
 085ke.CpmGrfoBTHc.j101l99a5jPO79Rm0UggV7A,HULBhiB6QeLFX8pUsEFOERuF98F,t8SZ
 iB6.RGhyIdG2..kUCIeaIf4IeKoIqk2M09WBM0.K2g60mdKKuUvgVB6IQ6..7Xd.dOOdXmIZU2
 ZoBBI5h0bHeYCaGKod3tCaEI2YVRinBhb76RPM2YjpgUwidpBY3DPNRXVNN,7RH1,tPf9R,tPB
 Hr44NlkuaUgikZA2YrdP66d1IgVJiU.HcJ.p,.WKR0mf.r76dfC42aZm.Q6ktI510.sIFuHQc6
 B6q..HMEbuIkvUUQYU69,dAV,QeoJid3CH1F7RH9RAZvUc3Yukvin4ak28ZENEqU7AV5dPd0WG
 omGEGroG5NFuamR0mt2YukdWob68d97HtCM0Z1MJ.UiVIhgsZi,3ZcpZrphYZ3b9RH,2B6OR7P
 HfPWmfaKrkIqU7g8Y7F96vlvqk2KIb.UmQbBg,..w8UU.EJ0GIG5I5.UdU0,..66.Q5akvuGua
 Ku66pVoBBQ57OO11R,GLtaKr2ZrpZoBBY3a4a0kd6JENWGuaKuM8PkWu2.QbBg,...Edogmhgn
 3hIBhoFJQbBM0h0d1e1.kRAV0,....M07mk...EK.amRkv.EN.am4.ZONB16RQ5P....wcZZiI
 ,JFIyoeG3H1p,.M8rVcknYiUohVFEkv.,d8HV7o8IC..I51000.F050.....U7YC66sRR7RkRA
 ,HeFGroEEqXWIYU.PU7ICUJ,w6SZiVI,SLLEKEKYd3p7dPOM8HtCM0d10GRsQd97r76b8RZHs.
 F7RkIqU7g6qU3FESYo,iXB..UL,aWHld0rmCKJ2ZgxhXJ5B0u044iHEuqkcCOooUCBghtCCqru
 KveHEC2hPNgAbnVy4UdQbBEfEuUu..Q5HcE.a2R1,t68WU.,tG91MMLPNBOONPNROMPPNFdP1P
 PmWWIYdMF.j1C3uJEWGq69uqkUXxBamRqU7A7WGq66576RWdc7wiiUUUd2YI,DONR9I1HoAB2Z
 rZZUYidVdQbUwCbWI,F7RkI0mWM1UH,QbBg,.66..POMZvO,787vPN76jvOp7630M8NFb.O3qq
 k8bu2Y1Fu85K4qok8bBRibR5HcE.qqk8rpumtWqrSLEe17vPrN1HM0P1OqrC4,dCojrRhvgV7s
 RO244.WWVJCHtCPUEJij3iZJCKaiA75PFZPMPM090POMZnRqk4....yquCrmGorSLreGEWGwmG
 EEughZJ5H0UhxhYBhaBhZJinJbUQe3N8682hVpBNPN,NM,NPTPR2YYxhrphUggqhgiZiUAhi3Y
 r,0GJk2O30rvmGE0LoeHEa2.dfQ1vMeHEC2.6JZPMgdn,3W7,dfQ1XighjZgd,0GRMPT9N.rN1
 HM0jHsICRtF99RbOO2ZkxigUdQbUYim,l96pVs3Ye2205giiBho76dfQkw0GRMS,d8,tR.UB.B
 011.GLt44HtCPk203...sPfX2Vvg,kV.UL,aW9hgtZcjxCJVXdCC22YWhioZCRvQp76.82H0Sb
 9hgtZ6ofcQgcZZUIgpZCM8rV7....ioma5Q5qk203.KJsG4C3cM68jfC.iXqhgmNO5Xg2YaxhX
 FRI6UdQ5o8ICmWnBhu79CrmC40rrCLKYit3iZZZU2ig2YlZZUghuMG.oiVZBeX0,Q5HXHRATX7
 VvgV7M0PvQe1.K403C3aqrg7iHEOKR0Gf.BeQ1XvgV7I6.HWrpZaJC2Yx2YCBdA32EdUCNFR8F
 r,HWqhAUUYe6VoBjk76pVJ,Qe0,,NFNWUYit3C..W20mWu2sFGbZRA68j99,dNT1NFvkoEKQid
 ,EK.Orkm4HtCPk2a24Kq66d0PU7IC..W4bGtEV44jf9jXg6RnXgMAHtCM0..gciBgWZhZReXtP
 ...Kpd.CJVKIr448orGLoamRq.0LEe1LOFZmWm2RNHf9P7OOh98VvPbXnRATXGBADHKQidFEqW
 nVd.a2F7FHPMEsmqkGLnyKtqKECGE4nMaGEO0DONdvI51a20mF00aWI,M0Hf9bPOpXukdaIhKI
 ICpl.M8r76Hf9PPMbvOenSQjkY3X798nyin2W0ZPMRvN6Q1vNmGEwB,d8H,HM0Z1sF91.2ZrpZ
 r,.HP8r,akYEtKqt0mF0GM.U7MGQiZFEuXk2YIVUAiUIbxsG..sQ9vMmWnRAcI.b1q0M80mq0G
 RsQ5fQ.2YfMQPM0Hk2gcAVl3YukK4nR0mqUn,.PM0Hk2gcCtCk2A7WmouGsyqtQYU2id2YDVdl
 kSqm0mF0ms0mJ0mMaGEG3q.a.HHsER6Qr76Hf9V1enSAiUQ3iHEaah7S,dCghvg,A,85e1bON.
 a2..EK0mMg,Hk2g6qU7M098Ha2V96576fuI90S2.VuPb98.Ud2YI,M085ke.CpmQ8...mWkZ3X
 N8k2KIb.m2..S2...M8.M0Z1.kd....N,.KIbU3Z7cTBvP5XUYe6,gBuGny4I5O2Q5PvQuGv.2
 YuEvK4kR0mqC57vPRHEe1B0g,ogUI5O36JFX4JiVhBFtRRdNEKwiiYgjRAd8Oo823H,A7OKECG
 Eu2,,U7oedltocjtR11.OKK0mqCbdQ5M0HWhRCRViFe.A,Z1MJ.W4.30..4Xv.HEt..gci,buM
 ...MJ.CJVGooCrk8KqKKVUBA,akWMF,dQ9vQ.UH,...EMam4a.HMFR0aUA,.......UC,90K2,
 NJV9N.cMQbBM0.g6F,j0A3buMy4,785vP7PNNFseHEa2.BvP69gAQAe1.H79sJEf4269Cro69g
 AmWkFKYCIbUA7.O5YZUohjJcppgu2Y0,QbBA,A7sFMNAB..h1EKMO.Y3UqBAA3MGoC66.aEryK
 VKbUI5WorCbExBCbixh0hCBPNZvC,7GTvQ..66pNDG3i1akYsMT9N0mSgeH,IcI3hphhW3ejRi
 UYe6,AVHhATmocPFtRN,.91U9h6.P06QN76b1,,UnRAcIwAHN8PM0gcANGoidRip,EEOGEWmly
 4..UIJiVVUY8.HsI........a4.klUG,Q5M0Z1MJ.f0w8R9N23R,HtCk2Gqo8LLK368jP8Pk2g
 6kl..Q8NOORne0LEGJY66buMEISLK...C2UZFLGqmCKaaKrKqIqU7....U2xhr76d8G.68....
 kmkouqlmoouad....Ec4qngek32.EI....UZVYFc4qnKqIqk2....U2xB..W0....gAAB0pkSa
 d.uYv68M0KJsGqksIUWFIY3h1.B1amRIZd.D0MO.B1m0.sQHXg.mWkFKMMYgd.aIXoiZ,2YI,d
 1,lS.UKVU.Grw..EY.k2cQ..ggotMEc.69UgsG..krktC4I869Cro66.H79.YA.23iX7EY6R.y
 4B1EryKVM1HM09WB.,tI51iXB.U3,.aWJ,C3cMQiU2Za,p,Ud.EV.A7WmeC3sFA6nX9hAUcAad
 2YygbUM8P.Hc7Wme....dN8,dDv,k2O0....ZN8,dDv,,7JM1AV7FzW0ktohj37wB0mYELYBA3
 d0,NJV9NsIUWFIEX42mGEOqrkI0mW...UK,22....El.GJdKZgcN.M1a.qU3FEK3..bvCq..K2
 .M8.Cou8rtyKt2ZsVuMG.gB.e1UC,aEfEsS5VHR..bHRQ6.9Xi28QcpJinxBPuQiXXhimJ5HeH
 .P..jHsICRtFQedJDF,M8r,HWc2Zr3YxcNaKrG4wdGlv00dvJHfP.ojrtMF1H76BVs3Yyg5c7E
 S2irBZUo2aby..tFsWaUY8g,akqEw00W5EtELK5dHEq4RNS,dCAD...QgpJC2YuEcy4bnk8Lty
 qvCou8rtsCPk2a.ghjZAUUI5qqr.Q5HM0Sb4VVVo,ghnxgdQbUQgp76p,bHLC4M1gcANF,tMff
 QEc...cHi1a25PRZHTq1,7J66j1kdKa1himVcQgpJid22.00.kRg,sE...VORdvHR9JT9QN76R
 OFUKVqJbUw8kRqU0lYU7lv0mFIgbxed,,7JM1AVq,jPORPERHoyKtin4aU7we6,FdR,t6kIo2O
 LLuqmWLuQYUwid2Y2xdUoiUUqpZi,9eHi1A7OLEC022F0M0hf9RPNcCwiiohZ3Dr76jHrEEUd,
 c9RPNQ5aKr..,,qU7MFg,H.g60GcKLu.rl4...kIQcgxhnhgeY398KK2H0A,h0ZXuMGR066FXL
 ,i1.A6UrdNEECWCB7N76ZVvU7FlSqf.,ND,tR,7J6631UuEbaIa0mWu2.BvJHfP71v,k4M0jna
 44FdF10NFXUdQbUogLBBER.rN1Hk2a2dvJH1g5.,7Rj0cCUUUBM0mY7Fu.g5.P.j1.Y3UdEuSp
 o.p,gV7EbQ5F,W0ZPNPvP2YVZhg3Yn3hjdPqqksQ,NOR9619PNnvaKrkt00MGoAUUQ2RWUY8U7
 A6Uaxed,RdNZ1.NlM8nOamR0mUCpdK2.sR220HKA4hN8r,qqkc9b1,dCo6sC,dN.OorMM.UVlI
 qk2akWU76RjGrEEEbsC,dNj0.k4e0F,aIXwCvFn.Y82Yax8Uu.0mWsCMG.d1EeUo,cC.Uek2aE
 oUrBhiB6kRkf.WKLuqmW55FbM8Eou0Ur,WKEe1FHrU3,HkU.WKL.vVgcAXN8rN12hiohZVukvu
 0Q5u022o7iX76GMH.EdKqqEW8rr0Le.FFLS5H,Sb1ZhjRCxuCPM0a2xvRGqmCLu8rrEEG3q.Hs
 RGqm.cCY8Q5AV7lvumlUU6G.HMGg8ELa2..,Vk22.aUm,g8UHdP.klABke.SZBFdKqtG5mGESb
 rFK2adU7AV3,M0Z1.kd....kfU2hgnZCY3j1.MFNmWq.aEt..YcZRioVLBhiVc.am4kWu2kvYi
 mBgk3C796pVI,,tRS5,dC2aB.U,,wCB1g5RWgcBVN8PM09eH0mVmqrsCPM1P..QecxBPOMHfPJ
 tCPM0O3sQ.D0qqmuausJAckFY4IbGIaKoRcEA7MGYgZJgpxAd0,7HTvNRtIdfQHfPIYn3hj76P
 PMHHFamR0GayqnYdi3Y3p7kYcNf9PCpo66d0PU7ghZFEkfoBsF99RartkaEIqqk690nIi1HM0Z
 1.EdKqqkaKKrkm69Spo.buEzOHTWgsSvn4ak2K2r,Z1MJ.b8Ow8R1qqka4CLosIdPMAZvg,..M
 JULdP.AZvUn3Bj12Yu.UHxeH3hjN1HMF2YH3Bq2in4g,FV2BhmhAyatd8g,V0.F7Np767OO.aG
 EyIsohe2YcgV7AVrJbUw8G4bf9jWYlR0GmyqleX2xhXhC9HuCb2luUv2YaZhVFRQ8iXiBAeXK,
 GpokREqcCO2CbAlkUUogiBghV4,u2iHECqrcCEvK49XiQ6.qk2aGK0mW..o8Uu..h99,dMDfC,
 ,wC0LR0GYyqt28EcyKtQbBcEcHsJH0jfC,tJUUYcDhV7AV723a43PM5nnUY3Yo3hZphUAho3Yc
 Bgn7RTHlKKE4KrGKE4ouWLWaqkEEemIA,HMGYgiIgVRA.PM0ak2O0FtJHfPsQa4kYcNN1HlbEI
 .cPW2y4,NG....h0..am4EecHM0H6NRdM11UUI5O2k2g6i1HEI6QTXUAggtPMO22UChcL3ZkBZ
 v.H0KLr665FM.,7QRNGRPOd987f9f1NFcyKtQCbvMK4H76mod2YkpZ7VcgiiBhoZ3..cH.FVdp
 hdNO1noerkGroy4.jf9..kRqk2U7phd78VP8r,GaD3iZdLFtRYgjRggcNN1NFrEKYhj79ohV,5
 1H,A7SLECWX,jPN0Gek4k2a2x9NRdM11.d0k2wCRPN.jPO4IrsPZf9K4rVd,.22M0Fd8uqm2Yo
 xhk3YrBhiZA0GJ.HMFNWBU7cR,,aa,,in4k2we6,hf9UXcHHGEGob0GvUq,g62YqdPERsRr76j
 f9R1EbsCk2IA,dCIgbx8kRIgb,2Yukv0GIeWiVWBA.wid7Nc8U7gcCl4k2a2Wmo.00SbaZBAZU
 Y8.HEIsRH1QA9Xd,U7MGw8ktABy4a2B100.HUD3iZph2FISLK0WiYhg2YYpZoZZUYAZ99GKL8K
 K0GmghdphdhB69G419SH1A3aU7MFN0M0A7uLmAhipidRC66B76Kpd.HmfoBo8b1W0AZUg5VFEG
 30mdWqr.,NFR0M0w7sPWmvm0m4YCcQElUhBB.N,44Ud.HkWu2k2A7WGq66o7a0oB22OKr44H76
 d0SYi,a4WmvmWi,K2U7sRCpmY8d1RPMsCP.HkYsJUn,..UBU7Et.K3kdK4.sRS5Nle.SZC,HfR
 690HK24U7Et..Q8....S3.UlY3VN8P.HkW.A,10.Z1,t6u2N,U7g6q.kRUY7P,dCvlKEmuGu0G
 Rq1Um3Yug5.396p,gV7.PPO.0GRcFkR0GmgB..UB.KLr66pVkQ5.q4440GRcF.MGYA3PM.6J.a
 kYcM0mFUUY82YYBBRtENvP2ZWxgd2Y3,M03nf.,dCwivg,Hk2GaW,.pV4,P.9WBkWU3FEy2in4
 A,Q6MF..66BOOZvQeGEWmIeXL,in4aEVEbEdY8uYrBB10o39XBAV3V4BhmlRqk4....2YCVe2Y
 cwiusJUntJYAaGR0mf.r,cHMGwCMG.83UcwedpBAZiohZ3D,NFNuI0GdK2cHH8HK2P.odZlRqk
 4....aGEsRJ76FN8.Y398KK2H0EfkveHE.i1EbEbkvamR0GdKIeUrhV7g6kvin4q....UUocjR
 AeWcYiVJCIbUI6UdIbUw8.UCV7Fu442YI,.GrfoB2Y3Z7.cNoBEb.ocjVvgVB....66bONNPNI
 3.kt.QbUYhVJjtJ530kR.IC.UBcEcHsJH0.6670akYcTF,.wCm4a0M1AV7ICUJ,Q8dfF8rmSKt
 yqusJHfP68kIi1AV7FtKaUgbU2aU.,dQcC..1uMdXZxedpB.2Y3lRaEIsRQamQiUIZdk2AV7lv
 uml....8ItaKrSqfa4YejZej3icghV,M1ak2K2rN1HU7le.aY7RgjNO598jf9M8,Vk.q.aEt..
 Qeclf.FtRR,NlQamRa.85dXZ3Ye.aEt..AdipiVZBYiZJeZRAFtRS5od7Zdg6AU3,MG.sFYej3
 iL,gBkFwiiwC0Ge.AVm,.cE.Ee.jf9M8P.90W0aUm,.MJULdP68j1Q5J,..kdKa4tM23R,q.9W
 BMF2YHhggVvgVB...UjNS0mXKaI3hdtJUe68VfC,7I8503iHE0LwmGE0rweHE.U7M0..wdJZeU
 2jgMS.EEyoeGZrJ5j0QC6NAZvUK,I5.sRRHRgeH,W2mav2YkZiu2YJ,2ejVvsQp761eIA9bVD,
 T0I8PEVEbkvu4pVk3Z6xBUn,aWrphYRbBEsGLLWLEUsRbU2iopZt32MSr,Z1MJ.58PHXoZejRe
 XJiZFISLrY3V9RHtCaUr,.sJHfPcFZvPP9ITPORHI0Lua0A7SLr2YX6A,,k285.U5lVmqkcH1P
 P4IISLrY3b99,7H9WnN8r,HMG2Zn3Yxc6Tmm85,VXJYd2YDFIC5.MEWLFaGEy2..GIqSKFaGEG
 3U7IC..buMK4d0EISLrEs.AVs,V9RR7SrVU.Ajv2Yr3YuEeW4krSLIohYB3AV3Z7q.akv00u2P
 .9eHqU7gcA,wC.EbkW66D0.sCPM1....H7658PTXe2YcwCABsQ.amREfEvmGEKLR0mf.b1kR0G
 oe1.PM030R0F96sRHfP10QbUwe67H236S0mFo7a02B.SrIUc,F1MFRmRA,HWcpZi,vVUY8U7A7
 urvQipJgUYe6,AVq,jf9NPORvOrN1HM0HM0j8GEv0mFwiUYcD3Yp3Yug5hHqaKr66hf958PTXv
 2Yq,f969eHqU7AV3lRUrpZ1,PM0K2PkW665mrsCPk2....H76DW0xhpphYRie2Ycw769,7OplY
 u2M8EfEtQAple.83iHE8rm.Uvg,EbEt.K3kXUdhA83Wml.NFtkIin4sR,,ZnloZmBBQbU2hU.E
 lyKuG5g6w6.in4qk423JlvaaYFEWqkkm8bUIZeM128.QcVZhg3dZBgkRecFJMMp76H0M8Eea3,
 7I,ND,7IZuH.FNMp76.iHEGLRA6kbOY1Vd.HcJ,ND8Z1x72ZBhgod9hOMNPR9P8,7Qp760mWuY
 vUKB6aKRgdZZCaIuKqqiHEyqpeHE82kR0GveXKRbBA,.qomGrkYdjxhfhik3ZWYcZpi2hgWFFm
 GEaqIU7loumr8Kp0mS0maKKuMPT9NTeMJHeW2,NOR7HT1sIFX6hgV3iDJA9vMdf6N76H1AV7,T
 XUg5UkJijRgDJge7J.DGuOpk2ZqZZUwhfBZv.HMGwhf3YI37oii2icAggc6.Pk2g6q.90K2,tE
 19PUHVvM1H..,tG9nayKma48bU2ZYBgoBgu22.HdCCpWM1o8Igu2YH,82UW3Yug5rPTr,HWJ,U
 9hgtR8ggcAak2dd2YwEE.HmVcMN765uPGLtyKqgAummWLuKKrGqI2Y7,6GT1sQCLoaKnGrI0mW
 sCA,...kM66t,..C2.MPTnoOqwamR0mY.27.QgoJigBZUg6.wd2ZccYgVNM,7FHGE2ak2ak24W
 oIY8...MMN9RHlW.83Elqk2KIbsGg7MOsCq..6G1fP7X9hAWmvuau.EYoBQ55HmY399SdfCaYI
 ,i1O3.2YrJ5.r76VPPbHR..28NHXyqlMHbvNrltCKty4p7630sCCKRQ6AgdFtCb1Fu85KavM0.
 wC6J.68M8rFl0GRsG91.WmmWLuamR0mvumuC5e1deIM1HktCKty4,dCvlbGIWgeH,S2sIMNanM
 WoIaGEWGJQiX,mqrQhUI3rN12ihRCRdNEEEbsC,tRRdFTnv44kaEsq4Hl4MG2Zkhhnd9.576Yd
 d.V1.RdRHPN0mYCJEUV,o8SrI0Gek4M0596pVkhhn,.2Z1xhi,.AZi6OQ6GLtkm23r,HMGsM,t
 6,,U1xhiNM.RvP500mYuYXp3Gbd2YIVUQiX,,dCY82Y3p7Pk2kRkV4odKIECqrGaUwd4hV76T,
 dA98GplvumZK468Z8F98HN763P8H68J767PNNPNdPN,N9x76ZPOD9O0GmKKqUe.tHMWHYeHES5
 .mIWKYg.cM1Xn3iVRAqGTYhZpgo7N91.kQWIR0GIeWoBgW3YeA3A,QcjFtkmQC912Y7Fl0GeW2
 S5.Ye,79,dMH,mqmEu4Kl.gcAFESb9,6J1eE.Iid,dPM.cHq.tX23du22.MFR8J9eIN7631ggi
 ZiZJiUI36T4HVWIRwC.sI5898qI.bvM19Q996J,cAX7GpN0Fd80rkSaUgik3Ye.HMGQiX,,7JF
 WBk2akvumdC42ZJR8kd8Ic44fGK0GMmWIJ8mWy3Z1xBUZFLq4Oqw0mYu2HN8PM0HkWmY7lV...
 UU.,78ghjpC,tM1fQ9XgdNwhihgU2iVFEe0M0jnZ.2eAZZUIgUg3rvET1..qrIqk2MFg6Fd8..
 fHEyKr..AVr,.f89,dMqk2MFR0ENEI6Q1171,d8U7,EE27q.akvQ8EI..Y6jHK0GMm0Z0u5.K4
 .00A3kWmY7,...66EEkqUX,8roS4yKr.0GJ.HsRi2EIIeg22,,...v1g6K2..GqrSbUwhihA.U
 7wC.WW2ZZUIgd.9eH.ZtAFeC,78ggiZAJ,A7.0W6l4k2SbH,W0.GJocMVuPmWn,83DHKYeG,5u
 P.91.,,am4kWmY7,...66EEkq.UoxhUYgj769fP.AVrtG.GIWmGE22...gDkWMF...NPORPN,N
 NR9N.akv.UGZZUM8kWu2Uo2du2YcEoyqqKKEemIU7,EEUBU7wCb023...V79I8.UZ,UU.H,KIa
 A7....,,00q4.UYVnZiVJiod8U7wCL0UJZZUIgU...Ux,K290..6PktGrk.k2S5.Ydg22H,KIb
 .ga6JbUUg,J,A7.0W6l4k2SbH,W0.m2KZg.83o6M8P.98Hg,Hk2Sb9,MEN89,,MFR0EPWIR00K
 Ls0GJ.H0UU6G.HsRC368...cIEekIq.KIa.akvQ7.KJK0Gla0gcC,sBFeC,,Z1I3kY.66W2k2S
 bH,W0.U2tRmWkUGFKo6M8kWm2P.HsRi2EIIeg22U3p7Um2b6JbUUYxhr76J,A7.0W6,AVrtIUc
 ...mWkUG,d0H,KIa.akvQ7Uc6FNFl.9eHkWm2MFRmREckm8bdhAsM90EEWoku4i2rN1P...Qcc
 Bgm3YcwiidCK3EY.rlv0pkEK6IERA7w6k2o8wCS3sCqqrI5bOFiXXdCC2i1MGkY68j9I11,dDv
 FN0HYaGEO0j1s6SHXWoI0090akv002hdtJUcwCa0PvP0GRsGg7aaddQYhEBAA3,tRRNR.GJdsC
 M0HWJ,oefRdZBD5PMRPEFtIFuH2Z13dG3Zr3eV,HN8,dDYaUIZUIapo4d8G2Y33f1ZdcghjZgg
 6GT1..i1Q6sRVOM66TeFEy2bk2du2YX3BcA4oVWp2WGJggpJij3YeAZBk2ENWIRQA.XNElO1Hk
 2kNWIR0ml.VNAndAlO1H.Ya6J5.ZV33fBA,kOWIR0ml.Iaq2fBA,EPWIR00.0Hgqk2.j7Gp76.
 MA.2b6J5.VdA5eBlO1H.Ab6J5.ZlN0Hgq.kUWIR00EM4HP0Hgq.EVWIR00ENMClO1H.Qc6JbU.
 24fdAlO1UtA4.I4X7ClO1H.I4.Ut2fBA,kN..CIgqk2a.Ya6J5.6FlO1H.ga6JbU.EN8Hgq.EP
 WIR00.XtAlO1H.wa6JbU.Uo2fBA,EQWIR00EM8HWCIgq.kQWIR00EN4HN8Hgq.kUWIR00EM4HP
 4Hgq.EVWIR.IakQa,3fBA,kVI5.VlOCHgq.EXWIR.kPWHgqk2MFNWUQgc32Qc6,kIqk2EbQ5sR
 R,UX3BqqrGqIqk2g6qU3FE.C2iXB...qorKrtKKEWmvcC.27kR6I11N,ER..o8UL,iXdRi2xhr
 phu22Y7Q5l99,,.iXWJbU.OKK0mneHEOZZtQOItkRqU0,sR,,d8OH1R1FtRA384QD0mvu0.deI
 U7A7y2SLcUd2YINFA75027.YhZpAH,...,7FHWload2YI,...PPO79NNPNHlW...UKdAHFe...
 UmBhblI00UdRi2xB0GRqXW3YXsSvvCPU7,..GnIY8...sQUv2Y7,sE.K4K4M8,NF....lN8,7J
 ..F0.51HtC,,U1,.q4Ajd2Y3,UJ,w64otaLrQ7YCMAZ7GH76t,..W2.44g6.w7..4HNWXUY8.U
 1,.GqrKLlmqmCIqaqliqI0mW.W5YhEBAMHTWqgapQaqQbBAV7AjUIbx.EWEPKnO.W2.CZohdjh
 CCJu44WLK0WgcMNloCLWkIi1a2j9I11Umg4qHE4HEGJYM1AV7lxWorCLu.q469W2.C5YZU..51
 v96P76396vlx2YI37U7QcVZhg,EICpgC3.u269,tRHN8Pk2akWmY7lx.Uh,..C5..AAqLEq0..
 AVa,jHn8bhFEWLEe1l1Bf9ffPHnRADMSeWa,g,ak28ZEh6d86D96pVaRbUogUUK,.18RFtNN76
 l96P76Df9D9SN76n96P76DXtBZUg8d0B96vFbsCP.HsE.....wgdAZBU3,urkCKuoiVNOSKEGJ
 Y.akvumayqu6F68l99,FK2agcMU3p7Pk2KIaUr,..Z76d8G90wCf8QkVsQTHIWLKUWB3gcCtCM
 GojdRi2xB0GeW2,NM5no.I5O2MF.V0.kW.2211q2Q5P..YcZBgXZidVZx80GISLrI5f06GUvEc
 Ug.cC6JkIUK,.QbBAV0VCVr32Yec,EIS5Hl4MGogLdP66vlv.PU7c9POM23EKY8AZvcN.e1R0M
 0HWcAhi38kYsROKq.TGEubL,CbdRCkY..d0k2S5Ee8peY3kIg,AV7Vr3YX2YVxed7NAZUo2xno
 ....,7RjGrEE.0WCN1AV3l4MFkW667ON11.i1.U,RA.22uau....N,ER..o8ICb1.rlve1UvEV
 .wiUUI,UcUd.HWaFrEECWr7JM1AV7,.o7Y8.H6F9PM51.FdNjOOELS5NFM6AHl2AV3lRk2SLL0
 puGrbY8iX7Et.K3ke.jWYFI.kY68H1..kbUL,C5...d0k2SbB,B0..aEucP66pVrh,HkW.ogLB
 hi,kR00POM6J69Ud.03..QbB2Zek2YcdBATHLCIoKqlwcpdQCr4emIM0.odjZidpgt3ZkY3mWv
 xgpBgmtEF1vP8Pk2K2P.0mUCKu.ohvk4qk4a....G4JVrJ5.bnf.r767HR0GV.a082U7FmKKl6
 6.akYkr0GeW2,7HsIUcIY,Rgo,0GFaGEKIaCZUYdjxA.YcZBgX,.uYvk2YdjxgiAdiZi4xhmhh
 cQeNR8..Y3jHKAaqYZU2bg2YW2aWYZUoc,VdQ5a.sE4KtWGF0GFamR.MG....cNjOOkImGE..O
 2.A7aKr03..00.C3UUAhkJYd22.kf.bno......dvPTHFaGE.6H6Hqk2akWsCqU7A7G4U,RAUL
 FISLISZiVdoZrpBUkA3gcANF,7F91....m0H,uYB.,,.YAin4qUE,UHBhutJHHEcPe1.F0Ug.H
 0M8EfEveXLBBU7I6.h1G3.W0amRkYcTFNO.EvoggBAa0M1AVqpZHhAbOOpHISLKM8P.Q5H.OLL
 WqryaUQYU.EEO5c9ZONbPO.2Y3l4UUQedJDjWvk2..5nrsJHfP,,e1..6IEKoiZloC4plYkX.o
 8wCEmsC.kv00.UcUd.HWyBAUdVI,jndC42Zr3866P0g4mGESLc44Y6o4UHRAMHTHc85bPNWmIm
 GEO5UUQYU2adg,k4UUsMkfsC.U3tJFPN9ndCajFEWmvuau....NFq.p,.Ef.EmsC,dQYZUYhdp
 Bb99GqmmKu4KKQhZBjnJbU.sCqqtI550kmc9j8O9PNqotSqRqk2ak20LR0mfMEVXExd7p7rN1H
 cE.GqmmKu2Yug5j9IEEUl2ak2ak2dv2Yfhgt76p,.P0XFMUBM0j1G3.W0a0YhdpB00CnRqk2IC
 ULdPkdartGbh3eVJiVNNd1HePBvPFNAV7B,78JtIVOGzuF98Jj8G9OFNuI5eIT8HN8HHeH9uIJ
 N8NFMsIC3Ac2JecYhdpBaGK0GMamREsu06PUU.h,iHE0LL2Yu.U2Vq.q.Z1sJ6QsMZPN.EIEK2
 idQ5ghnd9l10LLWLEeWrpZkdQumuAB0mqc9nHRUtd8,tR.UB.ohjpgABhiFEEMiHEq4yaUI5q0
 PM0a2NPOR1x76X7A,7JFW72ZesQwB0Gs4qnQCJ,akYu2jXchA03N7671amRq.HEXwiiwC.,dDv
 76XdAV76d8Gg,ak2q4.Cor.K4R7N9vM4aZRbBA,aEWK2jf9.Y3XdAVN8P.98Ha2.EEmnS0mK4H
 N0HE.M0P1...H1.AV7p7.Ug.U3p7Pk2Y76P.01.a2..G42Ye2YgBBAZv.jmYkvumv.2Yy.0GWy
 o4k2q4...G4NGrQbBU7A7ghnxAR1sQ.H6F..mWlkIU3p7r,S3..0GS..AVhVj,wB.MOY7RnRU7
 A7knoBUn,AV7Vr,Ug.U3l4.r,P17vPRXuEXUvU7p6P1TXyg5V76EEcFMM6Rg7WmqCbd2Y3lR.u
 rqCrnuGmUI,FVn,0GmyqlKbZFEe0sE1mWgBumrsHBO16TC2UZVYFcERqk2aU7wiiQ8EIK3kd28
 g8NVgsH78Fiqma57OG25N76xvH78FF,.dlIq.m5.K4a4V0p,akv.23..70NFM..EQ...d,6TC2
 UZVYFaERqk2M0j0ghnFr.CLEU2x7AV7sR.W0.m2K3..Us...G1r,aU2VhRC.QidgV7A,HMFg,a
 Ey.kmko6HcCk2S3..QiU..Hkv.23..7024..25..EO.A,70.UnB3M090EagcBM0o7WGJqU7MGB
 GqUUkM.aUe.66V1b1k2aIb..mWY,H,AV7p6jnv.2YykM66d0P.Hkv.23.28g8...l,..Y4.HEW
 kv.EKA4a0AV3Z7HWr,UUY5..A,j1...70...l,..Y4.HkYu2.EK.k2KIbM06HEq.24d0k2a2..
 G422.HtCk2SZ7Vr,UUo5EEG2M0S5..6HMJ...W1..6B.aU2,.6941H,akWuYv.HsJ..66t,.k2
 wC...Y6...25..EO.A,H0.EK.k2K2P.EJU3V7g60mfW4C3sCq.Q6MFaIrAAH9NUi32UYRguMJ.
 F0Es4qouKueX7,A36JgcUIeZRAV8RZ96vFcy2KId0GeyIEKpd.Z0rN1o8ULFmsC2iu2YGhgX7I
 QbBcEA7sR,,d0.F,H,SLL0bm78F0kt28ZnIQeZZi278kvu4Et0LEenSQeNR8cJmYGhgX,N76VP
 MHXdQbBkvI8b9RggcIikpZghAmWm3iiYij79,dQIidxAmGE853vPG5HN1HMFMGRfR.kR.C2Ec4
 qouaLBhi32cC.27.199,dMplYu2D0Ef.EmsCPM030UUI5G3.W0a0wiig8k4akWEc4qo.r,.kh8
 ni0GWyqlSpouKY4KrEt0GIER..sCqqmC5Y3j9IEK.I5.I5H0sCPk2O385NFwmWY3jg22nfC,,U
 UwCEmsC,7QbfC,NJ.VOMHXHZimhiXtCM0FVkhhu2YJ,MHHfPPOMlPGRfNiHEemIk28rmCKR00U
 GVv2YnZit,b9RpldsCSLseHES310jOGR8F2eDRevgV7.kVy4kmQCbONdvEffQZHr2eVZic3Z1x
 B.6R850pkGbdQ5Qc,NFgAEEyIXEyg8ULhd1JiZBA9fCPM0akZ.GJtaLICItK4GorY3jXgsRVOM
 69.am4AVw,.mqrcCP.ZntI5K3kdKKr.MEqqkaagMJ.jWjhhhBA799,NO58PTXg2Yk.akVy4.Ie
 ZRiZZi1,.FN8r,8ZI,VN1YD.6F9Hu8rrIbBA,SLEEe.G4F,H,Ad4dTjHmKqtG5K4d0k2SLLG4.
 e183r,akvQ6M1AV3lRU7lv0mSAAYA0GeEE4qfa4cCo7gcC,.6RohYVI,d1ER.k4A,.kVWqoma,
 Rgo,9fCkv00GJo.68.EL03Y8iHE4qf.,,jvCPk2YCu4.PUw,.bONdfFERqk2aUr32Y8.23.akY
 6N9Xb,q.aEakd.YcjdCCpmGLXUUIYdQ5M0N0H0..MGsFY3jP8A4UWc6o6M8U7Y7Q6UWsCk2m2a
 2....O4R1H79..O2.AV7lo6P.Sba,,,0Gakd.2Yd3C00i1AV7lf.bXn,aIb....EuEF22.aEaE
 a.90kY6Rj02YXsRG3AgXNOMOcCcI2Y3,.j13vN.G3q.aEt.SZiB6Q8S37XExBFtRRHKAaUU6x8
 70d8JqYe69Y3V,k4ak2ak2wedph,,jmjsI66Llfoh,,UBVUQ3..8pWGId4ofam4A,90kZ.U,Rg
 o,9vJuKK0mvu4S569.amRq.aIXc9FvPTHECWCVIVUwCELOorC4F7JZWd2Y3l46T.kZaKqmKXy4
 e1HkvUI3B.W0amRU7Fm.k4A,H6HsI.G2QddZhg,00U7Y7A7....wid..EX.U7Y7Q6.i1AVAV7,
 ...Ua,A3..O2.AV7lo.A7cN.66N0b0EEaKs66sCk2a2jWYlt.22R0....d13FE.M0N0N0g6.HW
 r3eVVUQ2PPM2YI37Q7.6F9PM.cPcPm0Ug.M8,NF.Ui2B22.kv.R,2Z4B6669WB..sIHfSen4kv
 ..68M8r,a2FtR,ND84Ud22WGISLcUUg5jOO42AdOhcThd,3f6Bd2hcdsHZGI28...sIFuHjO8H
 76d0P.HsE.UGtQEt.G5.HcI.q.HMFNmWqU7M0L0.CpoebLdPUg6PV0g7kO69m4EWa2hlOM8PM0
 HkWuYBEy.U6ReXJijFRqk2aU9,.C4w8m0kv.NFMa0AV1,MN....I8...oeHRgmVu.L0..S3..M
 AHtCkV.gA....83.EM8HM4IYeXckfqojqYJRe3xe6hc376JN8kZ.UL3hZVX,N76jfPEc.m4M8r
 ,C2UZ,...Ed..K3.VOMHXugV7kv..68M8.RtF99RbGx2ZY3jg6NamRq.a2GKw0mF0mqa4Ud2Ya
 EmaLECGE..d0k2W05Xk3YmhgbBhjphUghpRio3YWhgUIiZRC0GuMNCruggUQgjJimhA0GsCLL0
 rkEE4GEemIq.aEt.SIWaYmoZH7P9HuCIqaKs8pnuKISLL0bm78y4ktEtA37vMN76VN8M0aEwUJ
 ,IcZxgdphEBgdFIo3R9N2inB3Pk2AV9,.HePh1kf.Y3l99C3kUGId2inp3kIamRU7IC..9eP79
 I1PO23.V1k2i2.2eVBBSZi,6A0Wdg,g6..SZAJcp7RY6j1.cI3ORG5..MH3ORd9R.pN1HM0aIX
 wii76g8U5FX.H,.HcQ..CZi,.5XZFKg8ULFWAcXNOEKwii79sCk285.UH7RB0wiiN8P.9Wv.Z1
 ..Cok0LuKLt2ZrpBi1Q7.6G1fPMHT1Nlv69S566L76ZNBh79,7PUd.a2f0sFQ6.H76v76jfP0G
 eEE85,,.8ZghgVRiZRcV3io,g6i1Q6..Ka1him,.UG,..sJm2G58KqCIqiKK0me.cI...UBJ6.
 ERqk2aUm,.sIMM.jXd.i2....N,EE68XdAl76L76ZVdYZUYBkI.H0.D0.aWx.,,UU..Z0..K2U
 1,.kmQcp,..Z0..kfY7YCKJsmGEK3.Z0..ka.cCPM0Q7....m0Ug.M8U1,..50..I8...sPfXB
 xhqhgug,HkZ...EK..008HEeGE81.M8U1,.....Z0...LONn9F.Q7..sGY3j1.m0Udg,H6T.kV
 WqkIbBA,...50Nlv.Ug.M8r,C2.....I8...o7NeEf9RdX2xB.HWVRAkoEH0Wc.2YxcBH76T0.
 sBH76T0.cAVN8H76d0HEJAB,tQ5184N7659PTXUI3M0HsE.K4.50..AVG,.HMFg,m5..YCKZg.
 .Ie0hio,e1AgXZC.e1BWH,t1.qIW.MNp,SLEEe..A3kYsRR,00EeEES5c91uMd12ZrpB,NDmKc
 Ud22g,..RmUYCERUr,..A3kY68j96.kIw72ZWxgL,0mFUd.j9IEEq2.,NDSZiBckFXsIamI0Ge
 k4k285kf.CpmGrfohYFc683vNj0o3G4X,W2EeUe690HK69.PU7A,jGr42w8sI66LlfME.MHO3.
 .ME58JOpUgcdU7g6i1QioVUI582b0U5lf6NY7.mWhA4H,MGwiE,.UX6A,,M0akYcTPPMHfP10K
 KEOGE665FuSZiVdc7YiLBB66o76J.aUn76p,...Y7EuSpoUi..U7sQUn76P76rPAh79,NAj79,
 NAnNTrN0FVhBBUUIgj3jg2YhBAHPP.sQnvQPHr2YeM1aU7cQ.f0sIErEa..u0.NlbY6bnIamRU
 7cQ..S2.ZmlGLIGrf.R,IiZRgdQ5M0W5w6I45eQ44ZmlIebph7phYBhmVcIiZRAU7cQ.f0sIu4
 .YiL,.K3kfEc4qouag6S2adgV7k2K2U7A7WWioAEJ00UnV,7SEr.Y8gjUg5rnI0Ge.A,HWy3ZL
 ,cPO57GtG5HeHcNkIo2jntKqsEt680Ge.A,85.cACZoRcgBAmoru4S5g3d79Gqo85HuMuqIiHE
 SLLGqoYC,dCYeGl4A,HkWm2Pk2A,85ke....g36NTnYC4..o6.aU3p7P.HMFQ5M0bnw.CbtVfU
 iB6weHNH.8YM32,tJ.sInuIPOFROJrN1M0H0Em.TfICro66HeHcN.d0,tQdPScC.Q3ME.POEa2
 .9eHU3Z7HWhBgd,Eek4k2C5cC.gZUQDMA.H68J,.84gB..b1.A,9eH.ZXUUJ,ULdP7XA,.PFPs
 HUtlIg,H6TSpoA6MHzuJHeH70Qc6BcCx6en4kvUI3B.W0a0Es0GRsIC3o8w8.H0EK0Gq03AZv.
 HWc66vFl.A32Zr3ii2hrpBHePbPNZ9R1eNdPNZ96576X76F,.UeM8,7J.aEt.SZi,bONEm6IsR
 Y3X,..6966m0k4k2w8R1w8sI.ME.MH...42.rN1M050.UZtEffQ..M0Z0MJ.7GnqIWaYcBB0Jt
 ya,3Zr,PPNb1m0V0m0Udg,akWmY3l2AV1,.....HcI........Y3.H,KIbgVc.tne.SZ5hgohd
 dVsB7IbBA,HsR,,d0.F,H,A7665,c7c9PvRuHEAZUo2SpoYAC5kokY...Hk20rq0GRqXH,.f06
 IP0.N76N1sCk20bighV3jIJiVRAbOOoZs3YukvumqQbBAV7M0V1..n96p,2hvgV7k2C2.....A
 VG,24MFc8M098H.RmRkV.....Ed.K3EW...Y3..69.am4g60GWyqlEY.ZvCq.Q6MFi3AhVV6Bg
 iZA2YcwiidCKpd.F0Q5..69.e1sFA3.QbBM0hWUktmWsFmW5aLR.EES5jOOkR.f06I11b05XBc
 E.C2.CbH7R50.Q6.Eu.YCH,CoU.UU.m5.jmV85I5AV9,.50Ycgxgg2YrFKwCEK.A3aEy..N1p,
 85,,f0sIu4.1mqEKg8ULlrMMko.NFMamRk2Cor.UGtQ91.68H,I8UkUw,.7WoVu.j1G3Em68M8
 U7FzS5C5gAG3U7wiiYA.I5I8i1AVrtEk4AV7g6qk2..Cpmo6cCkv002B..U7Fmkn.k2m2C3U2Z
 hbJ5bONdfFEE.AVAV77R..kYkX69SrI22hVsEFIYgcFkIi1AVAV1Vc.r,aEakY....EncP7XdY
 3..B0.akYMO0Jq..66d0,7HsI.0mo05,,rV7M0HWL,Cbd,0mYu2....G58mI00.H6H6HU3lRU9
 ,.1WdNMw8R99SLrY3j1Y3.HtCkYsRR7O665,00sRUio668d0H,q..U9BB.pV7sR..23AZv.HWY
 ,UBU7Y7Q8.70i2.,,k2m2a2....SrI..cF.k2m2C2.r,aEakY....En.a0..B0.akYMO..B1.,
 7HsI.0mo05,,r,akYsJUn,66u2....G58WU.k2m2m2MF.a2x98H1..A3U9,.70a4ErErY3.N,k
 I00.sRW400.sRUi.WGX.,,P..kda4p,S5..F,HtCkZ.UHBhutJu469m466.f,L76jXrZZUYBU2
 B7,Vp.Eoam46T.EYkrcC..klULFK.S56901M050km.b185..83UB..cJC4I5sG..kf...XN8U1
 ,MN....I8.UkkU.Spay3f0.k2i2.w8klUgErUE,YBkIi1Q6.91...UG,.g8.03I5sR...H,c9D
 WHVc.7nI.HWcYgsVh,6No2GqwQ2.UIVBU723C4V96wAT1f13HE.,,QipNN,lrIC2YkRii.00g,
 AVm,w6I4bGqKao,ZWc.ZHIW2cQC58bd6N5HE01A,H6Ske.8omcPV0W0jHm6QbP8M0akZ.U7,AA
 .69W5b0ME70.a0k285.U3Fc4qo68.05U7Q7.6IkfoB.VFEAZBU3l4..jGaEu6F69.EdEu...Pe
 EYCUu.Z1.kdYC11sRA3kZ.U6,qor.jfPmWr,0mJI4mWg,a0MGBme.S250kIg5jXUY82YmFE.UG
 ,..9Wv.50.UZtEf1..83..UL7H6RcMEKg8.83...MH..pV7cQ..C344kvM8U9,...EK.22WmMk
 JI4aGKYBkI.H0.D0.aWx.,,UU..Z0..K2U1,.kmQcp,..Z0..kfY7YCKZg..Z0..ka.cCkZ...
 .69.m0Ud.C2..Q6..Ed...UjVB,A,L0...N,.66cA..M8U1,.....Z0...LONG2.L0..i2Nlv.
 Ug.M8PUw,.58OY3f0UHBjnRccBgmJ5...Q6Y3j1.m0UdQ5sE.....Ed...kUCKu.p,SLEEe..A
 3kYsRUU.Y8sRUiA6.FFc440mF2ad2Y3l4..o7UgMJ.kUYCER.ocmBA0ZdFECGEu2UBU7Q6..Um
 ,.U7I8U4JC.WWi79q4EK6IEK.AZBk2K2MFNWBkWuYvU1,....UG,g8U2lfaKrG4VeQTvM...EK
 .A3K2,lo44.8rRgVBEII359PIgjBA0Go4KrMORvNeGJg,0350KYD3iZph1Zhd,IZU2ZYxhXJ57
 uP5PRktYcjRgp,HtCI6.R05fMhWrhAHtCPk2GqosHVPNWml8Kf.N767vPmWvxedVrRCRPN.gjg
 c658PH1c6NFbaIamWWIYgcHAZBAV3VDNNC2.rN1F,VeI.QedlVmqo05c8wCe1.F0KqRwig6OpF
 ayIbSoYuIeamRq.hWUUu6HT0QbUYgX,..PEV.QgWNOELS5,dCwiitCak2GqlI5K3kX6FwCa0ak
 l.6QTfQW0.bHckIQeZZi2Fm66j123AVm,.sIFXHRgmxB82oBNle.Ic6xBp994nIUm,.kmQeXJi
 jFdsNWmv..82EMmWnRA.Y3X,..Uc,EV..U0p8Y3XN8...K4UG,F,.EV.0HK..m0c8kZ.UHBhut
 Ju4UrZ3amR.C4.f8Q71bWjFlsQFdFQ8HtC.Z1.Ed.GoVWmvUYRgdQ5K2CposE.Q5P..9GcU1Zh
 d,I3F,p,U6,2YKB6,7QbfCK3Ec44C3CadQ5HM0h0Z1m2..U6,g,30..S5kvsCaUm,w6I4KKq.I
 82in7N599,7Ai1HsG.kY.kfoBEK2CR,4IW8JIEsUdA3a..EcULdP.01VN8PM0EcU1VW,rl4..b
 uMy458PH1c8W0e1..0mlEK2ijdCm2.hPNABI530M8q.h0cCm2.71f0.k4I6...kvsCW0aEm.f0
 sFUrlIk2C4.V1F,Un,a0Y6G4S5..QeX,FtMT1EK0GvK4kIin4..KKuCpo685fMh06Qc9j99CKl
 O3.6OHtC..f0Q8El.Q8Um,.cI..NFmM1JN8g6QeX,50Uvc8g,F,Pnt6PNPMkt0GJe028.9me0L
 mkYuKnyqRqU7o8.a2S2rltIiuMEAcNdA2YD,66CLu8LR..sIFuHZmVUBcE.aIXghZhh7,dPRb9
 6B76WmkmKqQgUQ2LONZ14Iqm41nm2ZdAZU23yId0WoxhoFECW9,genhgY33IZd2Yd2YI,AVVZB
 2YukZICMEkk.r76dvPd1pND.g8UBk2Cbm3Yukkm4CZmZYv2Y,3C9X7pho3ZnZimZZUAggVgMRb
 PNbON44dvPZvQ2Y,3C68b9RcMn9RYCHtCP68U,3ikhA.GrrG5bWd6610A7..N76fvQ...23El.
 M1JV7AV7QinZim32Qe6x7WmtGbYAZv.Z1MJ.bWLdP7XIhgsNEaKrOqrmWnRioN8Pk2K2PkW66f
 GmMNkR2328.QcchAin4cJMOplY.ERQe3tC,tP3fOp76LONUDJgehAin4I6.HW2tMUn7NHvQVPH
 bvNFONHvN2Yx6A.AV7lkMH2YxcHmIEG30mk.e1L0MPT9NNOOb9R,NFQ5ak2.EL8rmOqluKu0GT
 qXk.q.akr8KpIbx.EeWqowdWJhZFI4qlG5mWWojWAZvM0AVn3YuEVY84qlG5umlCroebdQ5M0H
 96pVDJe2tQ,t9,tInuIEdyYcQig2YrAZUwZUQ8..P7CHN8r,akY68TfMJ96vFbM8,tHZ86y4Rd
 NVfQHHu0mFAhd2YD,sPBfNb965lUGIdwhWJhSBZd22.aUHB9EcKJeWmUGIdYcjRA...aGK0GIe
 GEm2WGEemIWGJY7.XN8PM0HM0HMFg,HM0sCkkCaBFEe11vMd1RdP9XBM09WBMF2Y13hZ,JN828
 .QeZZiKBhnhCNvIwBeGEWGmI530.82U7Fva4.2YX2YYxhU.M0hPOK5.e17nRU6VGtNC5nf9jeQ
 H9R9fETvPN983dJHvQ44UWY37nIqk2akWM1EECpmG5.kR..9mYGKqKKJin4ak2O3S5jOOsRrFu
 aqliKRQ6.9ntuGeaqlg7iHEOqrER0GV.in4I6.j1AhmpZ4xhXFI.k2aIX2Zr32u2o2xvRGLt4K
 s6NG3k2SLLGLt.e1deIQ5AV7lvogmVUQ2RWU.k2GroCqpuGuaqliKEe1LOFgcAR4RtFYedlVyq
 uuKuWmIi1AVrdF8bVlVGbgVcYidRAHN1HM0HMFQ5sRG5.o6M1g6UaxhXhC,dCQeXtPg70JtsQk
 R0mv0GRqXYdQAhm7RFN8q.j8GH00mF.7uHM0HeFurv.Ee.AVr,UuEe.M0jne0LmkdC4IAcNTvM
 c7,lvg5BvJu4amIin4k2Sbo,.B0k2K2Ur32YAodZ3DFtRHN1akW.aIXMO79PGZV3iZ76d0koGa
 Z,cCY8.HMGg8U5lUAD5vG.WmMa0.22ABABDHRcFEEK2...kl.EN2Yy...wA..UJ7N1X7pB.aU1
 3hZRA.HM0H1..M1g6UHhgmpC5ntumkC4THYyqrsIdPNVvCPM0SpouKmsQGampZJ,WGbM8P.0mY
 GKqQ5P..9mUEvMNPOMHfPJ76F7N.kIEVMGRW7ghVBhiB6MNe17vPPM0901044kRk2.UGhgnBBq
 okaaLBhiVe2YcYit3CwigERA7UdQ5aEfEt69qKRA7Uvg,.66sR,7FHeJ8nRM0PPM66p,qWgJcj
 JiYhgm3Yh2YmJcjJCQ5H.2dUI5WKEqWoJcj,,VWJcj,r,HW2BhVViQicxBbvIdPMKbUY86F9uE
 qqka4N76AA2dd.23cQ.f06FocmBA0JtyqlMP1XgsMgAmWJ,w8bOOY3dPSV1PPMHnfQ3PPM2dUI
 ZUoapg4amRqEJU7FmMRD16HSaHdQHnncQ9vQ66PPM2YrVjd6HtC,7HTXA76u2aUm,.MHTfRSpo
 UcQggBBEq8orUg2YoJ6.PPMweg2YhBAWIKA4kY6F.b1.00g,akYMP...aEt....CLu44mGE0HK
 2hUg3b9R11F89qKEiGE4HK0mt.MAU7AVm,...AhipANlqmGEWKE..j96PlqmGEC5.X,M0Z1.kd
 W4jGr.UlAZBM0HMFN0M0Z1.ka.Un,m0..FWrZ3b1UlsCk285.UH,.H12adk2gcCtCEt....C56
 94XBkWm2M0.....6Ai1....MO.q.9eHq.2YGtQMHsJH1in4q..sIgdVBB3uPZ1jOO79ReGEWGq
 mWoZ3mGEI5HeHUdk2o8UuMG.r76ZnlGLRg8UGtMi130Eq8266pVgR5dfET1UoR5ZfET1UmRbUI
 g0xB.8qRq.Z1MJ.DW1ZhdhA8pm68P1NFtQAH,8pmCro.S368V79,dQ9XiIidxAmGE.31U3VH,I
 6kf6Rin4q..sFg7.IZUcJ6PN76EK..H,O385.sCUu.EdkR.Um,.sF..F,m0M8Eq0GR6ArFu0GR
 .Z96pVmhgXd9Z1iHE8KE.cMUvU7FW.Un,22667OFIgg2YnZC6GH,q.sF.30Q5PM0.kd4KvKqfk
 rQeoBA9f8r,h0..wikJbUg8ULBB6INPM5nqKKrQ5NPObHR0mU.X7A,tHB86HeH.PEV.A7uLnKL
 qQ82YIFbq.HsRVf9NPNR96pVHBdO78fuI90..kIi1aEt.K3kXsJu4.EIqqk69SLsamRq.a2ZXU
 Q2V76.AVgBhnZiP3aR3Yukv0LLuqr8rq0prCLLmqmOavg,Hk2m4AaR3Yu..6RT9QrN1M0N18ni
 I5..ZPOD1P.H6PkNqJEenS..8qrG5.H6PEOqJEe1MPHHcyqtuGwin4k2m4gaR3Yu..Ajv.H6PE
 PqJEe1kkWLcyqtuGw.H6PkPqZu..ADk2m42bR3Yu.CLoya1hhYRbBU7A74HEaIb6QRdNNPM226
 6NPObXtgfUI54HEKIaCZUYBb1Uk2Y3lRU727knQCa5kYYiAVcIYBBAS3c6NFqaqtAZBA,HMFNW
 BU7ICI5i2K2Zd96H1vQdPFZfQTfQFN8r76FOEN8JFNAZ7AU3p7Pk2.9WUQeVpCj0Q8sC..mor4
 KmSZi,EEWmIi1HcJ.p,.,,.w8Ec.sCUu...UBM0HsQHfC,tG9eI.b8R1fQKLsaIrOav2YmhAeX
 LlU05ZOF58JrN1HcE.m4iJQ.VtCm4A5.PM0HMGogpZB.odBk2S5.C3....H,a.O4cCw8R1SJcO
 ojCpWGpaaIb0pbCpYGpYyIb0mJ0mfoB.8pWCZDFeyoa42EWin4Et..QetRiohAVGtghZZCZvQH
 0FtJHfPUEBdT,TeILOEZOF189Y3bmdU,Z68rmCadY3VN8r,S5R1EqEEe1Z1R7P9fNi1..G5,dC
 .GrrQ5..ICDXUI5.Z1i1..8466p,El.r,kqa46S,,Ug,..AjUI5.d1.AAEw.Eq...a5.G5.QCU
 UI5K3kdSJYaKmKqRqk2sQFnvC3KaukfEskfypdWobSpRM085ke.gA6N.Uc.N,qk2gcA,HM0F0k
 tUGNM7PGR9RN0F,w8EF.mGE8rmCrIk2A785,ND0XI,M0jXgdPkd..j028.a0M0jXa,kx0nyiHE
 a.CrmGLEqqo2Ykxhn3YeAZBM0akvcP.m400mqosKVlRq.akv.UoFE.MAin4k2S5.IC66.I4rN1
 HU7wC.cMUU.kNQbBA,akvMPH1uGw.EOQbBU7wC.AD.g4rN1M0HWg,lVx6AU7c8OrMuGMuGLOrM
 umM0GJam4k2wCC5C2.cBin4k2wCqqk.l1qWv.Hkv.kw.qk2aU7g6AVcIZUUlAaioZUIZd.Hkv.
 EwUg,.aUr,Ut,UrsCP.HkvsQ..6Cin4k2A7.nVy2Yk2266HeH5GISLsu0694XUg6a.8rmYijFE
 qasBBEEemIq.akWuYv.HsQHf9bPOcCQ8sG9eIK26R.M8q.akZKIdu2sFQeoBgm,MEFtQHP8r,a
 kY6A,NGRmtaKLOKq44,7JM0sQFvPS366hPMaaUI3k2A7CroQic,UyMA,7J66jXnV1,Qidp3sJU
 BM0aU3Z7HWr3CkVkSIaUY8A,IC.aKra4.k2MGA4HWrFn.EEkt.I5CHEKIa66j9QR,.AbUUBM0H
 M0KIbg,AV3lRU7Qicld.sR.5Wv2Yrd9.00K3kdS3.aEtER.UZtJu403.F,m0.9WBkWU3FEmor4
 4UH,rl4..5eQ44P0j0Qie2YcghZpB3OMmWrBhihdZpBp76f06G.,7G1fPcQple.SJrGKc8rrAZ
 vg,O3EREeEd2YXZhVRCp76.kVmqksC,tM5vQp,U1ZhdV1JiZVHZCCavU7YgXJ5.W2sCGrqeX5Z
 68XIhgsZiBhgoJidRgv2YnZimJ5.Z,sEEEOrmI5102bUwd4,g,QinFR.o4y2b0C2EV.23aad76
 jPOG4,tMN19vQ,lIM059P1vQumlKLtwBe1.mor4KmCou854II0HKg8UBBgfNGR9RZuQCKIKpd.
 H8F5OEZfQTvRHN8r,51AhXxhi3Yug5.m2aolya,3ZdphnNMRnmMJ.P0.AadAZvU7FICKq44UUg
 bU2adsHsM..XN8,7JM1AVX,.p,.N0kU24.g7.ke.aY7Bck3igtM19RHXdAZBM09WvUX,qqmuaC
 Bgh76pNDu2r,.59P1XC,c6ggmdP,NEV9Q3tCPk2.RdM1vMLvNR9N,,VFEW0XdA,t8,NArFJam2
 WGJAgk3ig,66jvPZvOb9Q1nm0mlyKqyaUIZdUX,CLuaLq2YukxCHKgaxRb7UYxhpJA9vMNPO5n
 tmGE0LtaKv4Ku0GmCKEeWB.kouqtG52Yug5HfPb1Q5.wiiZgEVUI5WokUmR5H.klQi33joJiV3
 Yug5Vl4.sRg6dfQUoQbBkeCpW838ZbtQKKtCYVlUWmlmqkM8rV7QAc95PREEEMAVcI3RvP,tMN
 1,tMfntEJ.ELq4.cH..31666A.IgVtO85GKE..59P1XC,c6.GIqSavg,.RtR28.7OO11FOMMNU
 J,.b15042kIk2C4oZX,R0EF.Acp3jWQbB.c9j1.Gorw8W2.g8.sQ.A6UdU7YgjNG5XUUJ,Y7.1
 mo.Y3.q291UmAZdQ5A7YA5PG66vFM.G4.41.YA.p,.N0kU24.g7.ke.a2.Ud.906NHfQdnYCai
 32.6H.4Yd,..P0.gadAZvU7,HfQd12Yx6A...X,6671.pVYtMU3p7r,51umoC4e1.in4A,UX,R
 0EF.YcjRgWQbB.c9j1.G2j0.ke.83C5.10M8M0FVj3iZphUghVFESbilvCLEe0QC22Qe6VcYcd
 ,RNMVHb4qqYYd.HWa,5nmKKr0GeW2P.P1e1f0sEZnksJu4K22bgMCv99wdW,4IsIYg22bXgsJA
 6weHtIC32YfsJ.MHH0cEWJEiGES3.0pb0pe0JKqk2ak2a..0HK0GMm0.D0nvQKqqqYoJCCLISp
 o.bOHzuEleFf8HNuI5eI9OFRO8NN1HU7.ke.....UNpcJZdA,.A,.24qqmua0BAAhiRC.V,gcA
 ,B1bOO6J.q4..50.......ULla....b0..kV4IcGpYyIbmm4ak2A,.g8.jmtYcZVgZig2YJ,..
 M1M0.MJ...00...P.H..VFE...k4MFgcBk2q4..85......M1HU7.UvBaqoZiAatYZUIamY3Zt
 Av99H68Jlq4Kw8qrWLKghddMT9SNFn8rk69CrwgBRHKYidZCmGE8qrEt0GJ.H..f0kf..,,..U
 BU7.UJ,..66...g,A,.24gA82..V,KIb.5vMbf9jPOG4PONKLEe1jPORPHsCP.cNH158OH9P0G
 RMAV7A0nRq.HWixh1ZB9XHRATXUYe6,QggBB22g8.Z1.K2gjgc6P8FHGaaoWuIe8GK0GbYdggV
 7k2.kx8nOmGECHMqLKaEIsMaKsCadZBZ1CKoa4,d8H,HM0.6A2401g,A,.gBY3bdAjdBj79,NO
 R1UHtIU2llCqtamIkWm2M051.......Y3.A,.QDV79,dAX798nOmGEC1UnRA69CKq.ICsMEE.a
 ..0122k4k2.kq.blP..sI...9eHUnZiVNRb96p,....sIdOEdOG5e6o7.H.Uvxag2YmQagsAV,
 6P9Xg2YixBZPNBPOl99,dMT1mWX,.HM0.2466UBU7.kq.EPmGEa4.0XvUdpha76pND.......k
 2.QD........A,.V,00M1M0.q4.KHKAhi,EM.Z1.kdohY,MECLu4Ku69K3kfqYZdFuKumGEOqr
 uKuMAi1..sI..HfPBHKg8UL,.B1A4EmCKE.U5FW2ZnZCM8r,Z1sFQ4S2dONl9RUXNEF7N599,7
 RPP8rN1.MJ.ZGq.5mt.NFmCqIi1C56G,dCYihpZchgdxAin4EosIMN,,f0sIjuIFXvM0mYVZgL
 dPsIEIamREt..6Ow8R9N2ZXZB9Xg.MGY6sNC5CrdAAfHEG3Um,..S3ktG5Y3X,AV7lqMG.00.H
 cQ....HfPkMg,HkWM1akWsCWW7ghjpC796dvP,7GTvQqYitQPM0HcQ....PnokeC3kfUdQ5..k
 e05Kqf.UdQ5Jl46GcFELqqkaaUUhBgdtCaUY,K3kX6FghVlIM0KLrYCpVExBdvQaKrCKo0GWaI
 fwc2tAZ,ggqBhXhg1BAb987vMNlXG2YdjxgEBhshggRiNBZvUm,g8UG,UhVg6N51Pk2Goo.PGs
 YimBBDnkmKqsGY319PsIAZvU2,..dvPdX9hANFuyKusIA3..koElaLuQdZVWBDC3HVBkY6F.1X
 CVUg53dE442D,7JF0sQdfQ,,7OO..7tCPU7oiZJiUUW2YspZtJYv.sKXNL,,58GYcd,O5bPOTf
 PGoYOZlkJ0mb8JWIYkIYdAZv.kNqJE...UBx74XU...1GsKKr23dHK0GvKadQ5HU2,QecxBb0f
 HICbmBZBkWUBEYkaQA1fPghnNGCbVZhgZcmFe442ZXZhd,u2Hl2K2,tEZ1q2SZiZgjtQrVBAVE
 ,MFaIraKui1O385N76hfCa2.7X2dQ9XjNS0GmCKKgC8LRg8U6,in4aU7I8DntggmJ5VeITuEUc
 Ahu2YJ,.AZuEb.2iu2Y9h6ENQeoJidFcGLti130R0HntcP22vlZ.sFgdjZgpZhZ3dVphYlUWGb
 a2rV7YAke.S27uE0nIi1K5d966I.66kXENw6gA..D0Y7..85ke.83.0HKYAM0CrlSJEe1.S2b0
 qqaUX78VN8aEIsQgARnvYgo76JN8sQWIE....kMamRa..2hZtN2Ye.R07P8r767f9N96pVhsC,
 Vo3Yu.Et00.8KEe1UdJiUI5GqR0mfa4c9bGuGoo8LIGqIin4cHsRHfP1ePWqr8rIiHESro.oZi
 hgs76pVClRaEI6NfPPPPS,7O44006RjGrEEe1EEOqfohY,.4qfa4.UWxAu4.M1ohjRcg,bWjFE
 e1B0iHEOqumaH,p,.RvP18QVXi3Yu.k4sRF13eQfXUI5S2bV5VoxhXRhDJA9Xcwc2B7wecBho,
 AZvUihigZhEFEe1.D0..UChig,H,Oai76p,U5,..kUuqtaKf4KtOoruadQ5QgWNMERcFUUMNjf
 HfPP3Ht004nRq.hPOAA.EeUU2djFdktIitdI4a0tPN1.UWEva4.Y3Znta0aUUU9,kXcJ9fQcPF
 N8rN1.OLEqobcAfdBeGE4HM0HEiGEOLEGoYcAfdBqob.rN1HM0HeFOLEmHEGHM0HE.AVm,Q7.C
 pm4KtCKo0pkGLo4IIuoYYZUsEd8Hb7FbdAR7FN8H379,dHEM2YC,VP8rN1AV7Ft66xFMY8AVck
 VGJaC10mkOrkaKq4Klmag2YVpijBhYRiUggmJijJiUYgdBA2YdpBNuP1HaaKl8rk8rw0mruKES
 poQ40Wdk2ak2CKumqNGKEe1.6H44.1883tEd0IYdQ5M0HWXZigR4CWk.q.aUHB9EcY8bOKb04I
 WcI9vNCbZJidYZUQ7.S2VeQAcYZgmhgnRicQgoZBmGE8WoZB8pmS4c6HN8rV7M0a2ZONDntEEC
 WCB7,7JF0M0ICI58pmS468HfPb1KqIi1Hk2MGIC0mF..H.b06IM1Hk2a.Q8U,V4JiVFc44aGKQ
 7...QCUg.6FNvNBeQ11EFamIq.a.98H2YXZigFEe1VN1M0gcCN1M0K2k2K2.kWsCaUpRCZ96pV
 9,.q2.UWgeHhcGFFa0Q8UEVH,A6wcZZiHRAMGM8N76L0.28.kuCrmY33tF99Rb0.3N8HtC.Ec.
 U,VHhgoR8.A3..03..kdKKuC3.80PkW66HePHnRgV0hc5,HmoGr4KIbGY6xhntJuKmsQqE,5Te
 KKwQcjphoJijlmQiiQeoZg1ZimZh2hgnRg.ASW5.ELCor.6F9vQ59.C2dPMHnmc9Et...ktu0.
 Y62Umb.,6.,.dU.2.AV.2.0..4E,9z52U.2U.kk0U.wU.2U.Af.2.,6.C60E.2.U6Uz6.0E.cU
 Zb.2.,..G00k.0U.6.665hK0E.0E.SoAtb2U,2.4G.6.,U0O10.,..u,2.A.MEZPO19P0S45E.
 E.0t.U..61lL.m.GpOycAgYvob0Cy2xhXhCYintET1.UM6.,6..U6U..HE.6O5vQWnBCO.0Myf
 U.az86mDRN,6ix6a.6Q0...
 --- end of encoding ---


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 22 Январь, 2007 04:45 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
В процедуру (HostPorts):

PROCEDURE (rd: Rider) Input* (OUT x, y: INTEGER; OUT modifiers: SET; OUT isDown: BOOLEAN);
VAR msg: USER32.Message; wnd, mw: USER32.Handle; pt: USER32.Point; res: INTEGER; set: SET;
BEGIN
wnd := rd.port.wnd; mw := USER32.GetCapture();
IF USER32.PeekMessageA(msg, mw, USER32.WMMouseMove, USER32.WMMButtonDblClk, 1) # 0 THEN
mx := (msg.lParam + 32768) MOD 65536 - 32768; my := msg.lParam DIV 65536;
IF (mw # 0) & (wnd # mw) THEN
pt.x := mx; pt.y := my; res := USER32.ClientToScreen(mw, pt);
res := USER32.ScreenToClient(wnd, pt); mx := pt.x; my := pt.y
END;
mb := {};
set := SYSTEM.VAL(SET, msg.wParam);
IF WinApi.MK_LBUTTON * set # {} THEN INCL(mb, left) END;
IF WinApi.MK_MBUTTON * set # {} THEN INCL(mb, middle) END;
IF WinApi.MK_RBUTTON * set # {} THEN INCL(mb, right) END;
IF WinApi.MK_CONTROL * set # {} THEN INCL(mb, ctrl) END;
IF WinApi.MK_SHIFT * set # {} THEN INCL(mb, shift) END;
IF USER32.GetAsyncKeyState(12H) < 0 THEN INCL(mb, alt) END;
(*
Windows.dir.Update(NIL)
*)
END;
IF WinApi.GetSystemMetrics(WinApi.SM_SWAPBUTTON) # 0 THEN
IF USER32.GetAsyncKeyState(1) >= 0 THEN EXCL(mb, right) END;
IF USER32.GetAsyncKeyState(2) >= 0 THEN EXCL(mb, left) END
ELSE
IF USER32.GetAsyncKeyState(1) >= 0 THEN EXCL(mb, left) END;
IF USER32.GetAsyncKeyState(2) >= 0 THEN EXCL(mb, right) END
END;
IF USER32.GetAsyncKeyState(4) >= 0 THEN EXCL(mb, middle) END;
IF WinApi.GetAsyncKeyState(WinApi.VK_SHIFT) < 0 THEN
mb := mb + {shift, extend} ELSE mb := mb - {shift, extend}
END;
IF WinApi.GetAsyncKeyState(WinApi.VK_CONTROL) < 0 THEN
mb := mb + {ctrl, modify} ELSE mb := mb - {ctrl, modify}
END;
IF WinApi.GetAsyncKeyState(WinApi.VK_MENU) < 0 THEN INCL(mb, alt) ELSE EXCL(mb, alt) END;

(*
(* alt handling *)
res := USER32.PeekMessageA(msg, 0, USER32.WMSysKeyDown, USER32.WMSysKeyDown, 1);
*)
x := mx; y := my; modifiers := mb; isDown := mb * {left, middle, right} # {};

IF USER32.PeekMessageA(msg, 0, USER32.WMTimer, USER32.WMTimer, 1) #0 THEN
res := USER32.TranslateMessage(msg);
res := USER32.DispatchMessageA(msg)
END;

END Input;

необходимо добавить
IF USER32.PeekMessageA(msg, 0, USER32.WMTimer, USER32.WMTimer, 1) #0 THEN
res := USER32.TranslateMessage(msg);
res := USER32.DispatchMessageA(msg)
END;
иначе, если в клиентской области окна редактирования нажать мышь и не отпускать, то отображение также замораживается.

Вообще-то WM_Timer не очень надежное сообщение. В некоторые моменты оно вообще может не посылаться или посылаться с большими задержками, чем установлено.
Можно подумать над реализацией кокого-нибудь thread таймера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 22 Январь, 2007 09:56 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Ужас... :!: :!: :!: Нельзя так проектировать программу чтоб в окне рисовал чужой поток. Перерисовку окон должен делать только их собственный.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 22 Январь, 2007 15:56 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Здравствуйте, Штирлиц! : ))

Очень приятно видеть, что кто-то заинтересовался главным циклом BlackBox. Проблема остановки фоновых задач при удержании кнопки мыши или вхождении в главное меню - это первое, что мне сильно не понравилось, когда я стал изучать BlackBox чуть больше года назад. Кстати, обратите внимание на 100% загрузку процессора при удержании кнопки мыши.

Я пожаловался на это дело в официальную рассылку blackbox@oberon.ch, в результате чего некто Marco Ciot 25.03.2006 поделился своим вариантом исправления. (Его вариант был куда лучше того, что к тому времени придумал я.) Данный патч, впоследствии немного доработанный мною, выложен здесь под названием "Фоновая многозадачность". Этот патч положил начало целой серии исправлений стандартных модулей BlackBox, предпринятых мною за почти год освоения среды и попыток написать на ней полезный код. Все эти правки (кроме самой последней, некритичной) выложены на блоге, ссылку на который я дал выше.

Недавно некто O.Nick спросил у меня на том же блоге, как эти исправления сочетаются с SP от Метасистем. Вот мой ответ, опубликованный там:
Цитата:
К сожалению, метасистемщики не включили мои заплатки в свой последний сервис-пак. Я так понимаю, что сам выход SP 4 связан скорее с работой над Active BlackBox, а не с желанием устранить существующие неисправности. Моя же цель - устранить неисправности, поэтому наши пакеты обновлений несколько рассинхронизировались.

Что касается того, как они уживаются, могу ответить так: все мои исправления полностью совместимы с их SP. Однако, некоторые модули были исправлены как мной, так и ими (например, HostWindows, входящий в патч "проблема прорисовки"). Такие модули нужно править вручную, причем мои исправления добавлять в SP, а не наоборот. Это не сложно, так как мои правки немногочисленны, выделены цветом и перечислены в стандартном заголовке (внутри складки после слова "сhanges").

В свое время метасистемщики ко мне обратились с вопросом об интеграции моих исправлений в разрабатываемую ими версию BlackBox. Я провел означенную интеграцию в их базу данных исходников. Честно говоря, я думал, что SP формируется именно на основе этой базы данных. Отдельно исправлять еще и ServicePack никто меня не просил. Поскольку сам я им не пользуюсь, то подобные проблемы мне даже и в голову не приходили.


Если будете качать патчи, то лучше сразу берите полный архив из последнего поста блога. Дело в том, что некоторые модули правились несколько раз, последняя по времени версия содержит все предыдущие исправления.

Что касается цикла обработки сообщений, то он сделан не во всех местах очень хорошо : )) (покосился на info21, но продолжил рассказ). Например, 100% загрузка процессора берется из того факта, что всякий View, если он хочет отслеживать положение мыши (например, когда вы выделяете блок текста, нажав кнопку) вынужден организовывать цикл опроса мыши и клавиатуры, постоянно вызывая Rider.Input. Этот способ официально рекомендуется в документации разработчика. Видимо, это единственный способ реализовать перехват всех сообщений от мыши, так уж устроен фреймворк. Выглядит это иногда вот так (циатата из HostMechanisms):
Код:
REPEAT f.Input(x, y, m, isDown) UNTIL ~isDown;

Подобных циклов немало разбросано по исходникам BlackBox (более десятка). В Delphi VCL при организации подобного цикла всегда есть возможноть "дать дышать" всем другим объектам и процессам, вызывая главный цикл обработки сообщений: Application.ProcessMessages. В BlackBox такой возможности не предусмотрено. Более того, если внимательно посмотреть на HostMenus.Loop, то станет очевидно, что процедура не рассчитана на повторное вхождение. Потому и не опубликована. Кстати, в официальной почтовой рассылке уже не один раз за прошедший год пролетали "рецепты по разморозке" в виде небольших циклов обработки сообщений Windows. Естественно, ни о какой платформенной независимости тут речи вести не приходится.

Что касается приемлемого решения, то оно есть. Если в Rider.Input внедрить небольшой Sleep, а заодно вызывать обработку фоновых задач и прорисовку окон, то многих неприятностей можно избежать малой кровью. Только фоновые задачи нужно прокручивать не выуживая WM_TIMER (я тоже сначала пошел по этому пути), а вызывая напрямую Services.actionHook.Step. Идеи Sleep и Step принадлежат Marco Ciot, за что я ему до сих пор благодарен.

Однако, это не решает всех проблем. Например, кубик все равно не будет перерисовываться при нажатии кнопки мыши, вхождении в меню или перетаскивании окна. Он будет крутиться "в памяти", но прорисовка будет отложена до момента выхода из меню. Форсировать прорисовку возможно с помощью некоторых недокументированных процедур, таких как Views.ValidateRoot, Windows.Directory.Update и пр.

Чтобы кубик вертелся при работе с меню, нужно поправить процедуру HostWindows.Idle следующим образом:
Код:
...
      WHILE w # NIL DO
         IF ~w.trapped THEN
            w.trapped := TRUE;
            Views.ValidateRoot(w.frame); (* <- добавить эту строчку *)
            w.UpdateScrollbars(focus & (w = fWindow));
            w.trapped := FALSE
         END;
         w := dir.Next(w)
      END;
...


Я думаю, что по умолчанию этого не сделано чтобы не загружать процессор лишней работой. Типа: "Зачем вам обновление окон, если вы в меню находитесь?" Лично я не согласен с этим, но допускаю, что на слабых машинах это могло когда-то иметь смысл. А может быть, это банальная недоработка. К сожалению, разработчики вряд ли станут это комментировать или обсуждать.

PS: Илья, ваш способ с Windows.dir.Update не защищен от трэпов при прорисовке.
PPS: Во время выделения текста кубик все равно замирает, так что, по-видимому, из Rider.Input нужно вызывать HostWindows.Idle, а не Services.actionHook.Step. Я протестирую этот момент и выложу заплатку на свой блог.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 22 Январь, 2007 16:14 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Штирлиц писал(а):
Вообще-то WM_Timer не очень надежное сообщение. В некоторые моменты оно вообще может не посылаться или посылаться с большими задержками, чем установлено.
Можно подумать над реализацией кокого-нибудь thread таймера.


Период работы таймера в миллисекундах задается константой HostMenus.idlePeriod = 50. Вы можете поменять это значение. Я ставил себе 10 и все нормально работало, плюс фоновые задачи чаще проверяли, не пора ли им выполниться. Сейчас вернулся к прежнему значению, ибо незачем.

Да, WM_TIMER - не очень надежное сообщение. Но ведь вы не звук выводите и не видео отображаете? С точки зрения пользовательского интерфейса обновление раз в 50 и раз в 100 миллисекунд практически не отличается, так что тут особая точноть и не нужна. Если же вы работаете со звуком или видео, заводите мультимедийный таймер. От повседневного интерфейса не требуется такого сверхточного быстродействия.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 22 Январь, 2007 16:30 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Илья Ермаков писал(а):
Цитата:
Каким бы способом не реализована многопоточность толку от нее если все затормозится случайным нажатием на alt и попаданием в меню.

Ну, не надо так драматизировать :-) Тормозится исключительно обновление экрана, причем тут многопоточность? Потоки как работали, так и работают. Их назначение все же преимущественно не GUI, а вычисления либо серверные задачи.

И Synchronize не годится для выделения памяти, т.к. время отклика его порядка десятков миллисекунд, а на выделение памяти уходят микросекунды.
Проблема многопоточности серьезней, чем кажется на первый взгляд. Полгода назад, берясь за Active BlackBox, я тоже начал с таких штучек. Не заработало. Ключевая проблема - сборка мусора. Сборщик мусора, проходя по ссылкам, маркирует доступные объекты, изменяя их тег типа на нечетный. Таким образом, во время сборки мусора память в нецелостном состоянии. Многопоточное ядро знает все потоки и умеет их замораживать на этот период. Добавьте сюда то, что NEW не поддерживает повторную входимость. Без многопоточного ядра работать с потоками в ББ нельзя.

Ну, не надо так драматизировать ;-)
BlackBox 1.5 стандартной поставки содержит два потока. И может содержать сколько угодно еще. С потоками работать можно, достаточно соблюдать только одно условие: поток должен работать только с базовыми типами (никаких RECORD или ARRAY). Впрочем, насчет ARRAY, Илья, вам виднее. Если при обращении к массиву не производится проверка динамического типа (изменяемого сборщиком), то с массивами работать можно. Тогда добавляется второе условие: нельзя динамически выделять память под такие массивы. Массив должен быть глобально заякорен, чтобы сборщик мусора его не уничтожил.

Да, условия жесткие.

Есть еще вариант: в каждом потоке должен быть свой менеджер памяти с собственным NEW и сброщиком. Это легко сделать, залинковав Kernel в DLL и создавая параллельный поток в DLL. Правда, это решение очень плохо масштабируется: чтобы создать 10 параллельных потоков, нужно создать 10 разных DLL. ;-)

Зато если подключить еще модуль Services и в параллельной DLL запустить кооперативную многозадачность, то чем вам не серверный вариант?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 22 Январь, 2007 16:35 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Сергей Губанов писал(а):
Ужас... :!: :!: :!: Нельзя так проектировать программу чтоб в окне рисовал чужой поток. Перерисовку окон должен делать только их собственный.

Это точно! В поток лучше выносить только обработку данных и сигнализацию об их изменении/готовности к прорисовке.

PS: Уф! Какая хорошая, вдохновляющая ветка : ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 22 Январь, 2007 21:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да, ветка весьма интересная :-)

Александр, прокомментирую про слияния наших сервис-паков с вашими исправлениями.

Дело в том, что действительно имеет место рассогласование. Над сервис-паками работаю лично я и никто более, в то же время я не работаю над юникодизацией и "линуксоидизацией", над которой работают остальные. Вы отдали свои исправления в репозиторий, но у меня никак не доходят руки с ним разобраться, равно как и с Subversion. Поэтому, как Вы правильно заметили, SP4 формировался в основном из потребностей Active BlackBox + я туда включил навигатор исходного кода и еще кое-какие мелочи.

Давайте выпустим следующий Service Pack с Вашими исправлениями и с тем, что обсуждалось в этой ветке. Если Вы возьметесь все это туда включить, то было бы превосходно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 24 Январь, 2007 02:08 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Сергей Губанов писал(а):
Ужас... :!: :!: :!: Нельзя так проектировать программу чтоб в окне рисовал чужой поток. Перерисовку окон должен делать только их собственный.


В ужас надо приходить от того, что в Blackbox одним кликом мыши загружается процессор почти на 100%.

И от того что, для определения отпущена мышь или нет используется такой код:

| msg: Controllers.TrackMsg DO
v.x := msg.x; v.y := msg.y;
v.context.GetSize(w, h); v.Restore(f, 0, 0, w, h);
REPEAT
f.Input(x, y, m, isDown);
IF (x # v.x) OR (y # v.y) THEN
v.x := x; v.y := y; v.Restore(f, 0, 0, w, h)
END
UNTIL ~isDown;
Views.Update(v, Views.keepFrames)
(ObxView5)

Почему нельзя сделать так:

MODULE ObxViews5;
(**
project = "BlackBox"
organization = "www.oberon.ch"
contributors = "Oberon microsystems"
version = "System/Rsrc/About"
copyright = "System/Rsrc/About"
license = "Docu/BB-License"
changes = ""
issues = ""

**)

IMPORT Views, Ports, Properties, Controllers;

TYPE
View = POINTER TO RECORD (Views.View)
x, y: INTEGER
END;

VAR
doUpdate: BOOLEAN;

PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
BEGIN
f.DrawRect(l, t, r, b, Ports.fill, Ports.red);
f.DrawLine(v.x, t, v.x, b, 0, Ports.white); f.DrawLine(l, v.y, r, v.y, 0, Ports.white)
END Restore;

PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
CONST min = 5 * Ports.mm; max = 50 * Ports.mm;
BEGIN
WITH msg: Properties.SizePref DO
IF (msg.w = Views.undefined) OR (msg.h = Views.undefined) THEN
msg.w := 20 * Ports.mm; msg.h := 10 * Ports.mm
ELSE
Properties.ProportionalConstraint(2, 1, msg.fixedW, msg.fixedH,
msg.w, msg.h);
IF msg.h < min THEN msg.h := min; msg.w := 2 * min
ELSIF msg.h > max THEN msg.h := max; msg.w := 2 * max
END
END
| msg: Properties.ResizePref DO
msg.horFitToWin := TRUE; msg.verFitToWin := TRUE
| msg: Properties.FocusPref DO
msg.setFocus := TRUE
ELSE (* ignore other messages *)
END
END HandlePropMsg;

PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame;
VAR msg: Controllers.Message;
VAR focus: Views.View);
VAR x, y, w, h: INTEGER; m: SET; isDown: BOOLEAN;
BEGIN
WITH msg: Controllers.PollOpsMsg DO
msg.valid := {Controllers.paste}; msg.selectable := TRUE;
msg.type := "Obx.Tutorial"
| msg: Controllers.EditMsg DO
IF msg.op = Controllers.pasteChar THEN (* cursor keys *)
IF msg.char = 1DX THEN INC(v.x, Ports.mm)
ELSIF msg.char = 1CX THEN DEC(v.x, Ports.mm)
ELSIF msg.char = 1EX THEN DEC(v.y, Ports.mm)
ELSIF msg.char = 1FX THEN INC(v.y, Ports.mm)
END;
Views.Update(v, Views.keepFrames)
END
| msg: Controllers.TrackMsg DO
v.x := msg.x; v.y := msg.y;
v.context.GetSize(w, h); v.Restore(f, 0, 0, w, h);
f.Input(x, y, m, isDown);
doUpdate := isDown;
| msg: Controllers.PollCursorMsg DO
msg.cursor := Ports.graphicsCursor;
f.Input(x, y, m, isDown);
IF isDown THEN
IF (x # v.x) OR (y # v.y) THEN
v.context.GetSize(w, h);
v.x := x; v.y := y; v.Restore(f, 0, 0, w, h);
END;
END;
IF ~isDown & doUpdate THEN
doUpdate := FALSE;
Views.Update(v, Views.keepFrames);
END;
ELSE (* ignore other messages *)
END
END HandleCtrlMsg;

PROCEDURE Deposit*;
VAR v: View;
BEGIN
NEW(v); v.x := 0; v.y := 0; Views.Deposit(v)
END Deposit;

END ObxViews5.


И процессор не грузится и делается все тоже самое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 24 Январь, 2007 02:58 

Зарегистрирован: Среда, 17 Январь, 2007 03:59
Сообщения: 225
Здраствуйте Александр!

Цитата:
Что касается цикла обработки сообщений, то он сделан не во всех местах очень хорошо : )) (покосился на info21, но продолжил рассказ). Например, 100% загрузка процессора берется из того факта, что всякий View, если он хочет отслеживать положение мыши (например, когда вы выделяете блок текста, нажав кнопку) вынужден организовывать цикл опроса мыши и клавиатуры, постоянно вызывая Rider.Input. Этот способ официально рекомендуется в документации разработчика. Видимо, это единственный способ реализовать перехват всех сообщений от мыши, так уж устроен фреймворк. Выглядит это иногда вот так (циатата из HostMechanisms):
Код:
REPEAT f.Input(x, y, m, isDown) UNTIL ~isDown;

Подобных циклов немало разбросано по исходникам BlackBox (более десятка). В Delphi VCL при организации подобного цикла всегда есть возможноть "дать дышать" всем другим объектам и процессам, вызывая главный цикл обработки сообщений: Application.ProcessMessages. В BlackBox такой возможности не предусмотрено. Более того, если внимательно посмотреть на HostMenus.Loop, то станет очевидно, что процедура не рассчитана на повторное вхождение. Потому и не опубликована. Кстати, в официальной почтовой рассылке уже не один раз за прошедший год пролетали "рецепты по разморозке" в виде небольших циклов обработки сообщений Windows. Естественно, ни о какой платформенной независимости тут речи вести не приходится.


Обычно обработку реализуют так (схема):

WM_LBUTTONDOWN:
GetCapture; (подготовка к обработке)
WM_MOUSEMOVE:
(обработка, например выделяем текст)
WM_MOUSEUP:
ReleaseCapture;(конец обработки)

Для этого у нас почти все есть
Controllers.TrackMsg - возникает когда нажали мышь
Controllers.PollCursorMsg - возникает при движении мыши
ввести еще сообщение типа(по крайней мере в документации я не нашел чего-то подобного)
Controllers.MouseUpMsg возникает когда мышь отпущена
И тогда не надо будет писать
REPEAT f.Input(x, y, m, isDown) UNTIL ~isDown;

Если такой способ обработки в приложении остается на совести программиста, то
из ядра Blackbox такие вещи надо выкинуть однозначно (если это возможно). Необходимо критически пересмотреть обработку сообщений в ядре Blackbox. Тогда и процессор не будет загружаться на 100% и другие задачи замирать не будут, только от того что нажата мышь.
Ввести все-таки функцию (например, включить ее в модуль System\Windows) типа PROCEDURE ProcessMessages: BOOLEAN,
которую программист мог-бы вызывать на свое усмотрение (все зависит от задачи которую он решает).
переносимость не пострадает, потому как на других платформах ProcessMessages может быть пустышкой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 24 Январь, 2007 10:27 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Чего-то тут не многопоточность обсуждается, а оконная подсистема. Надо в другую ветку форума перемещаться...

Цитата:
когда мышь отпущена


Мышь может быть нажата на одном окне, а отпущена уже на другом. То есть окно на котором мышь была нажата, сообщения об отпускании нажатой кнопки может и не получить.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB