From 8872ef327bd0a801363edf1c6ce8df0b74e51c8d Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi <> Date: Fri, 3 Apr 2009 18:22:56 -0700 Subject: AI 144573: Checking in Sonivox' JetCreator code. BUG=1721874 Automated import of CL 144573 --- jet_tools/JetCreator/JetAudition.py | 509 ++++++++++ jet_tools/JetCreator/JetCreator.py | 1431 +++++++++++++++++++++++++++++ jet_tools/JetCreator/JetCreatorhlp.dat | 119 +++ jet_tools/JetCreator/JetCtrls.py | 567 ++++++++++++ jet_tools/JetCreator/JetDebug.py | 71 ++ jet_tools/JetCreator/JetDefs.py | 560 +++++++++++ jet_tools/JetCreator/JetDialogs.py | 1031 +++++++++++++++++++++ jet_tools/JetCreator/JetFile.py | 775 ++++++++++++++++ jet_tools/JetCreator/JetHelp.py | 33 + jet_tools/JetCreator/JetPreview.py | 200 ++++ jet_tools/JetCreator/JetSegGraph.py | 361 ++++++++ jet_tools/JetCreator/JetStatusEvent.py | 38 + jet_tools/JetCreator/JetSystemInfo.py | 40 + jet_tools/JetCreator/JetUtils.py | 788 ++++++++++++++++ jet_tools/JetCreator/ReadMe1st.txt | 44 + jet_tools/JetCreator/eas.py | 1229 +++++++++++++++++++++++++ jet_tools/JetCreator/img_Copy.py | 51 ++ jet_tools/JetCreator/img_Cut.py | 104 +++ jet_tools/JetCreator/img_Find.py | 85 ++ jet_tools/JetCreator/img_New.py | 61 ++ jet_tools/JetCreator/img_Open.py | 79 ++ jet_tools/JetCreator/img_Paste.py | 41 + jet_tools/JetCreator/img_Print.py | 62 ++ jet_tools/JetCreator/img_Redo.py | 79 ++ jet_tools/JetCreator/img_Save.py | 99 ++ jet_tools/JetCreator/img_Undo.py | 81 ++ jet_tools/JetCreator/img_favicon.py | 61 ++ jet_tools/JetCreator/img_splash.py | 1157 +++++++++++++++++++++++ jet_tools/JetCreator/midifile.py | 1579 ++++++++++++++++++++++++++++++++ 29 files changed, 11335 insertions(+) create mode 100755 jet_tools/JetCreator/JetAudition.py create mode 100755 jet_tools/JetCreator/JetCreator.py create mode 100755 jet_tools/JetCreator/JetCreatorhlp.dat create mode 100755 jet_tools/JetCreator/JetCtrls.py create mode 100755 jet_tools/JetCreator/JetDebug.py create mode 100755 jet_tools/JetCreator/JetDefs.py create mode 100755 jet_tools/JetCreator/JetDialogs.py create mode 100755 jet_tools/JetCreator/JetFile.py create mode 100755 jet_tools/JetCreator/JetHelp.py create mode 100755 jet_tools/JetCreator/JetPreview.py create mode 100755 jet_tools/JetCreator/JetSegGraph.py create mode 100755 jet_tools/JetCreator/JetStatusEvent.py create mode 100755 jet_tools/JetCreator/JetSystemInfo.py create mode 100755 jet_tools/JetCreator/JetUtils.py create mode 100755 jet_tools/JetCreator/ReadMe1st.txt create mode 100755 jet_tools/JetCreator/eas.py create mode 100755 jet_tools/JetCreator/img_Copy.py create mode 100755 jet_tools/JetCreator/img_Cut.py create mode 100755 jet_tools/JetCreator/img_Find.py create mode 100755 jet_tools/JetCreator/img_New.py create mode 100755 jet_tools/JetCreator/img_Open.py create mode 100755 jet_tools/JetCreator/img_Paste.py create mode 100755 jet_tools/JetCreator/img_Print.py create mode 100755 jet_tools/JetCreator/img_Redo.py create mode 100755 jet_tools/JetCreator/img_Save.py create mode 100755 jet_tools/JetCreator/img_Undo.py create mode 100755 jet_tools/JetCreator/img_favicon.py create mode 100755 jet_tools/JetCreator/img_splash.py create mode 100755 jet_tools/JetCreator/midifile.py diff --git a/jet_tools/JetCreator/JetAudition.py b/jet_tools/JetCreator/JetAudition.py new file mode 100755 index 0000000..bc0d4de --- /dev/null +++ b/jet_tools/JetCreator/JetAudition.py @@ -0,0 +1,509 @@ +""" + File: + JetAudition.py + + Contents and purpose: + Auditions a jet file to simulate interactive music functions + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from __future__ import with_statement + +import wx +import sys +import thread +import time + +from JetUtils import * +from JetDefs import * +from JetCtrls import JetListCtrl, JetTrackCtrl +from JetSegGraph import SegmentGraph, Marker +from eas import * +from JetStatusEvent import * + +CMD_QUEUE_AND_CANCEL = 'QueueNCancel' +CMD_QUEUE_AND_CANCEL_CURRENT = 'QueueCancelCurrent' +CMD_MUTEALL = 'MuteAll' +CMD_UNMUTEALL = 'UnMuteAll' +CMD_ORIGINALMUTES = 'MuteOrg' +CMD_STOP = 'Stop' +CMD_PAUSE = 'Pause' +CMD_PLAY = 'Play' + +STATUS_PENDING = 'Pending' +STATUS_PLAYING = 'Playing' +STATUS_COMPLETE = 'Complete' +STATUS_CANCELED = 'Canceled' +STATUS_QUEUED = 'Queued' + +LOAD_QUEUE_DISPLAY = 'LOAD_QUEUE' +GRAPH_POSITION_UPDATE = 'GRAPH_POS' +NEW_SEGMENT_DISPLAY = 'NEW SEG' +CLR_INFO = 'CLR_INFO' + +class Audition(wx.Dialog): + """ Initializes Audition window controls, then spawns off a thread to be ready for playback commands """ + def __init__(self, jet_file, pSize): + wx.Dialog.__init__(self, None, -1, title=JetDefs.DLG_AUDITION) + + self.jet = None + self.playerLock = threading.RLock() + self.jet_file = jet_file + self.queueSegs = [] + self.keepPlaying = True + self.nextSegNum = 0 + self.currentSegmentIndex = None + self.currentSegmentName = "" + self.playCommand = "" + self.threadShutdown = True + + panel = wx.Panel(self, -1) + + self.segList = JetListCtrl(panel) + self.segList.AddCol(JetDefs.GRD_SEGMENTS, 180) + self.segList.AddCol(JetDefs.GRD_LENGTH, 20) + + self.segList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnQueueSegment) + self.segList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnSegListClick) + + self.queueList = JetListCtrl(panel) + self.queueList.AddCol(JetDefs.GRD_QUEUE, 180) + self.queueList.AddCol(JetDefs.GRD_STATUS, 20) + + self.trackList = JetTrackCtrl(panel) + self.trackList.AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) + self.trackList.AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) + self.trackList.AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) + self.trackList.BindCheckBox(self.OnTrackChecked) + + self.btnMuteAll = wx.Button(panel, -1, JetDefs.BUT_MUTEALL) + self.btnUnMuteAll = wx.Button(panel, -1, JetDefs.BUT_MUTENONE) + self.btnMuteOrg = wx.Button(panel, -1, JetDefs.BUT_ORGMUTES) + hMuteButs = wx.BoxSizer(wx.HORIZONTAL) + hMuteButs.Add(self.btnMuteAll, 1, wx.EXPAND) + hMuteButs.Add(self.btnUnMuteAll, 1, wx.EXPAND) + hMuteButs.Add(self.btnMuteOrg, 1, wx.EXPAND) + vMuteButs = wx.BoxSizer(wx.VERTICAL) + vMuteButs.Add(self.trackList, 1, wx.EXPAND) + vMuteButs.Add((-1, 5)) + vMuteButs.Add(hMuteButs, 0, wx.EXPAND) + + self.btnQueue = wx.Button(panel, -1, JetDefs.BUT_QUEUE) + self.btnCancelNQueue = wx.Button(panel, -1, JetDefs.BUT_CANCELANDQUEUE) + hSegButs = wx.BoxSizer(wx.HORIZONTAL) + hSegButs.Add(self.btnQueue, 1, wx.EXPAND) + hSegButs.Add(self.btnCancelNQueue, 1, wx.EXPAND) + vSegButs = wx.BoxSizer(wx.VERTICAL) + vSegButs.Add(self.segList, 1, wx.EXPAND) + vSegButs.Add((-1, 5)) + vSegButs.Add(hSegButs, 0, wx.EXPAND) + + self.btnQueueCancelCurrent = wx.Button(panel, -1, JetDefs.BUT_CANCELCURRENT) + self.btnPause = wx.Button(panel, -1, JetDefs.BUT_PAUSE) + self.btnStop = wx.Button(panel, -1, JetDefs.BUT_STOP) + hQueueButs = wx.BoxSizer(wx.HORIZONTAL) + hQueueButs.Add(self.btnQueueCancelCurrent, 1, wx.EXPAND) + hQueueButs.Add(self.btnPause, 1, wx.EXPAND) + hQueueButs.Add(self.btnStop, 1, wx.EXPAND) + vQueueButs = wx.BoxSizer(wx.VERTICAL) + vQueueButs.Add(self.queueList, 1, wx.EXPAND) + vQueueButs.Add((-1, 5)) + vQueueButs.Add(hQueueButs, 0, wx.EXPAND) + + self.Bind(wx.EVT_BUTTON, self.OnQueueSegmentViaBut, id=self.btnQueue.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnCancelNQueue, id=self.btnCancelNQueue.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnStop, id=self.btnStop.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnQueueCancelCurrent, id=self.btnQueueCancelCurrent.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnPause, id=self.btnPause.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnMuteAll, id=self.btnMuteAll.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnUnMuteAll, id=self.btnUnMuteAll.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnMuteOrg, id=self.btnMuteOrg.GetId()) + + EVT_JET_STATUS(self, self.OnJetStatusUpdate) + + BORDER = 10 + hboxTop = wx.BoxSizer(wx.HORIZONTAL) + hboxTop.Add(vSegButs, 1, wx.EXPAND) + hboxTop.Add((5, -1)) + hboxTop.Add(vQueueButs, 1, wx.EXPAND) + hboxTop.Add((5, -1)) + hboxTop.Add(vMuteButs, 1, wx.EXPAND) + + self.log = wx.TextCtrl(panel, -1) + self.graph = SegmentGraph(panel, size=(-1, 50)) + self.graph.ClickCallbackFct = self.GraphTriggerClip + + vboxBot = wx.BoxSizer(wx.VERTICAL) + vboxBot.Add(self.log, 0, wx.EXPAND) + vboxBot.Add((-1, 5)) + vboxBot.Add(self.graph, 1, wx.EXPAND) + + hboxMain = wx.BoxSizer(wx.VERTICAL) + hboxMain.Add(hboxTop, 2, wx.EXPAND | wx.ALL, BORDER) + hboxMain.Add(vboxBot, 1, wx.EXPAND | wx.ALL, BORDER) + + panel.SetSizer(hboxMain) + + self.LoadSegList() + self.initHelp() + + self.SetSize(pSize) + self.CenterOnParent() + + wx.EVT_CLOSE(self, self.OnClose) + + thread.start_new_thread(self.PlaySegs, ()) + + def initHelp(self): + """ Initializes context sensitive help text """ + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP ) + self.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, '')) + self.segList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_SEGLIST)) + self.queueList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_QUEUELIST)) + self.trackList.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_TRACKLIST)) + self.graph.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_GRAPH)) + + def OnMuteAll(self, event): + """ Sets command to mute all tracks """ + self.SetPlayCommand(CMD_MUTEALL) + + def OnUnMuteAll(self, event): + """ Sets command to un-mute all tracks """ + self.SetPlayCommand(CMD_UNMUTEALL) + + def OnMuteOrg(self, event): + """ Sets command to set mute flags to their original values """ + self.SetPlayCommand(CMD_ORIGINALMUTES) + + def OnTrackChecked(self, index, checked): + """ Mutes or un-mutes a track interactively """ + with self.playerLock: + trackNum = self.trackList.GetTrackNumber(index) + self.SetMuteFlag(trackNum, checked) + + def SetMuteFlag(self, trackNum, mute): + """ Mutes or un-mutes a track """ + with self.playerLock: + try: + sync = JetDefs.DEFAULT_MUTE_SYNC + self.jet.SetMuteFlag(trackNum, mute, sync) + logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync)) + return True + except: + return False + + def LoadSegList(self): + """ Loads the list of segments """ + with self.playerLock: + self.segList.DeleteAllItems() + for segment in self.jet_file.GetSegments(): + info = MidiSegInfo(segment) + index = self.segList.InsertStringItem(sys.maxint, StrNoneChk(segment.segname)) + self.segList.SetStringItem(index, 1, TimeStr(info.iLengthInMs)) + + def GraphTriggerClip(self, sClipName, iEventId): + """ Triggers a clip """ + with self.playerLock: + try: + self.jet.TriggerClip(iEventId) + self.log.SetValue(JetDefs.PLAY_TRIGGERCLIP_MSG % (iEventId, sClipName)) + return True + except: + return False + + def OnSegListClick(self, event): + """ Sets current segment name based on what's clicked """ + with self.playerLock: + self.currentSegmentIndex = event.m_itemIndex + self.currentSegmentName = getColumnText(self.segList, event.m_itemIndex, 0) + + def OnCancelNQueue(self, event): + """ Sets command to cancel the currently playing segment and queues another """ + if self.currentSegmentIndex == None: + return + self.SetPlayCommand(CMD_QUEUE_AND_CANCEL) + + def OnPause(self, event): + """ Sets a command to pause playback """ + if self.currentSegmentIndex == None: + return + self.SetPlayCommand(CMD_PAUSE) + + def OnStop(self, event): + """ Sets a command to stop playback """ + if self.currentSegmentIndex == None: + return + self.SetPlayCommand(CMD_STOP) + + def OnQueueCancelCurrent(self, event): + """ Sets a command to cancel the currently playing segment """ + if self.currentSegmentIndex == None: + return + self.SetPlayCommand(CMD_QUEUE_AND_CANCEL_CURRENT) + + def OnQueueSegmentViaBut(self, event): + """ Queues a segment via the button """ + if self.currentSegmentIndex == None: + return + with self.playerLock: + segNum = self.currentSegmentIndex + segment = self.jet_file.GetSegment(self.currentSegmentName) + self.QueueOneSegment(segment, segNum) + + def OnQueueSegment(self, event): + """ Queues a segment """ + with self.playerLock: + segNum = event.m_itemIndex + segment = self.jet_file.GetSegment(getColumnText(self.segList, segNum, 0)) + self.QueueOneSegment(segment, segNum) + + def QueueOneSegment(self, segment, segNum): + """ Queues one segment """ + with self.playerLock: + userID = len(self.queueSegs) + if FileExists(segment.dlsfile): + dls_num = FindDlsNum(self.jet_file.libraries, segment.dlsfile) + else: + dls_num = -1 + self.queueSegs.append(QueueSeg(segment.segname, userID, segNum, dls_num, segment.repeat, segment.transpose, segment.mute_flags, STATUS_PENDING)) + self.LoadQueueDisplay() + + def SetKeepPlayingFlag(self, val): + """ Sets a flag to continue play loop or shut down """ + with self.playerLock: + self.keepPlaying = val + + def GetKeepPlayingFlag(self): + """ Gets the play flag """ + with self.playerLock: + return self.keepPlaying + + def SetThreadShutdownFlag(self, val): + """ Set a flag to shutdown thread """ + with self.playerLock: + self.threadShutdown = val + + def GetThreadShutdownFlag(self): + """ Gets the thread shutdown flag """ + with self.playerLock: + return self.threadShutdown + + def SetPlayCommand(self, cmd): + """ Sets a play command """ + with self.playerLock: + self.playCommand = cmd + + def GetPlayCommand(self): + """ Gets a play command """ + with self.playerLock: + return self.playCommand + + def SetStatus(self, index, status): + """ Sets the status of a segment """ + with self.playerLock: + self.queueSegs[index].status = status + + def GetStatus(self, index): + """ Gets the status of a segment """ + with self.playerLock: + return self.queueSegs[index].status + + def LoadQueueDisplay(self): + """ Loads up the displayed queue list """ + with self.playerLock: + self.queueList.DeleteAllItems() + for item in self.queueSegs: + index = self.queueList.InsertStringItem(sys.maxint, item.name) + self.queueList.SetStringItem(index, 1, item.status) + + def NextSegment(self): + """ Gets the next segment in the queueu """ + with self.playerLock: + num = len(self.queueSegs) + for i in range(num): + if self.queueSegs[i].status == STATUS_PENDING: + return i + return -1 + + def PlaySegs(self): + """ Sets up a loop looking for jet file actions based on UI commands """ + self.jet = JET() + self.jet.eas.StartWave() + self.jet.OpenFile(self.jet_file.config.filename) + + self.SetKeepPlayingFlag(True) + while self.GetKeepPlayingFlag(): + self.SetThreadShutdownFlag(False) + + time.sleep(.5) + index = self.NextSegment() + if index != -1: + lastID = -1 + + Queue(self.jet, self.queueSegs[index]) + + self.SetStatus(index, STATUS_QUEUED) + + wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) + + self.jet.Play() + self.paused = False + wx.PostEvent(self, JetStatusEvent(CMD_PLAY, None)) + + while self.GetKeepPlayingFlag(): + self.jet.Render() + status = self.jet.Status() + + if status.currentUserID <> lastID and status.currentUserID <> -1: + wx.PostEvent(self, JetStatusEvent(NEW_SEGMENT_DISPLAY, status.currentUserID)) + if lastID != -1: + self.SetStatus(lastID, STATUS_COMPLETE) + self.SetStatus(status.currentUserID, STATUS_PLAYING) + lastID = status.currentUserID + wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) + + if status.numQueuedSegments == 0: + break + + self.jet.GetAppEvent() + + index = self.NextSegment() + if (index >= 0) and (status.numQueuedSegments < 2): + Queue(self.jet, self.queueSegs[index]) + self.SetStatus(index, STATUS_QUEUED) + wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) + + wx.PostEvent(self, JetStatusEvent(GRAPH_POSITION_UPDATE, status.location)) + + playCmd = self.GetPlayCommand() + if playCmd == CMD_QUEUE_AND_CANCEL or playCmd == CMD_STOP or playCmd == CMD_QUEUE_AND_CANCEL_CURRENT: + if playCmd == CMD_QUEUE_AND_CANCEL or playCmd == CMD_STOP: + num = len(self.queueSegs) + for i in range(num): + curStatus = self.GetStatus(i) + if curStatus == STATUS_PENDING or curStatus == STATUS_PLAYING or curStatus == STATUS_QUEUED: + self.SetStatus(i, STATUS_CANCELED) + + if playCmd == CMD_QUEUE_AND_CANCEL_CURRENT: + self.SetStatus(status.currentUserID, STATUS_CANCELED) + num = len(self.queueSegs) + for i in range(num): + curStatus = self.GetStatus(i) + if curStatus == STATUS_QUEUED: + self.SetStatus(i, STATUS_PENDING) + + if playCmd == CMD_QUEUE_AND_CANCEL: + segNum = self.currentSegmentIndex + segment = self.jet_file.GetSegment(self.currentSegmentName) + wx.PostEvent(self, JetStatusEvent(CMD_QUEUE_AND_CANCEL, (segment, segNum))) + + #MAC has a 'pop' when clearing the queue; not sure why so this avoids it + if OsWindows(): + self.jet.Clear_Queue() + else: + self.jet = self.SafeJetRestart(self.playerLock, self.jet, self.jet_file.config.filename) + + if playCmd == CMD_ORIGINALMUTES: + wx.PostEvent(self, JetStatusEvent(CMD_ORIGINALMUTES, segment.mute_flags)) + + if playCmd == CMD_UNMUTEALL: + wx.PostEvent(self, JetStatusEvent(CMD_UNMUTEALL, None)) + + if playCmd == CMD_PAUSE: + wx.PostEvent(self, JetStatusEvent(CMD_PAUSE, None)) + + if playCmd == CMD_MUTEALL: + wx.PostEvent(self, JetStatusEvent(CMD_MUTEALL, None)) + + self.SetPlayCommand('') + + if self.GetStatus(lastID) != STATUS_CANCELED: + self.SetStatus(lastID, STATUS_COMPLETE) + + wx.PostEvent(self, JetStatusEvent(LOAD_QUEUE_DISPLAY, None)) + wx.PostEvent(self, JetStatusEvent(CLR_INFO, None)) + + SafeJetShutdown(self.playerLock, self.jet) + self.SetThreadShutdownFlag(True) + + def OnJetStatusUpdate(self, evt): + """ All UI needed from within thread called via postevent otherwise mac crashes """ + if evt.mode == LOAD_QUEUE_DISPLAY: + self.LoadQueueDisplay() + elif evt.mode == GRAPH_POSITION_UPDATE: + self.graph.UpdateLocation(evt.data) + elif evt.mode == NEW_SEGMENT_DISPLAY: + self.currentSegmentName = getColumnText(self.queueList, evt.data, 0) + segment = self.jet_file.GetSegment(self.currentSegmentName) + info = self.graph.LoadSegment(segment) + self.trackList.DeleteAllItems() + if info <> None: + for track in info.trackList: + self.trackList.AddTrackRow(track) + self.trackList.CheckTracks(segment.mute_flags) + self.log.SetValue(self.currentSegmentName) + elif evt.mode == CMD_QUEUE_AND_CANCEL: + self.QueueOneSegment(evt.data[0], evt.data[1]) + elif evt.mode == CMD_ORIGINALMUTES: + self.trackList.CheckTracks(evt.data) + elif evt.mode == CMD_UNMUTEALL: + num = self.trackList.GetItemCount() + for i in range(num): + self.trackList.CheckItem(i, False) + elif evt.mode == CMD_MUTEALL: + num = self.trackList.GetItemCount() + for i in range(num): + self.trackList.CheckItem(i) + elif evt.mode == CLR_INFO: + self.log.SetValue("") + self.graph.ClearGraph() + self.graph.UpdateLocation(0) + elif evt.mode == CMD_PLAY: + self.btnPause.SetLabel(JetDefs.BUT_PAUSE) + elif evt.mode == CMD_PAUSE or evt.mode == CMD_PLAY: + if not self.paused: + self.jet.Pause() + self.paused = True + self.btnPause.SetLabel(JetDefs.BUT_RESUME) + else: + self.jet.Play() + self.paused = False + self.btnPause.SetLabel(JetDefs.BUT_PAUSE) + + def SafeJetRestart(self, lock, jet, filename): + """ Shuts down the jet engine """ + SafeJetShutdown(lock, jet) + with lock: + jet = JET() + jet.eas.StartWave() + jet.OpenFile(filename) + return jet + + def OnClose(self, event): + """ When exiting the audition window, shut down jet play thread """ + i = 0 + while(not self.GetThreadShutdownFlag() and i < 5): + #Make sure we shutdown the playing thread, but don't wait forever + self.SetKeepPlayingFlag(False) + logging.info("Waiting on shutdown %d" % (self.GetThreadShutdownFlag())) + time.sleep(.5) + i = i + 1 + + #make certain we clean up + if self.jet is not None: + SafeJetShutdown(self.playerLock, self.jet) + self.Destroy() + diff --git a/jet_tools/JetCreator/JetCreator.py b/jet_tools/JetCreator/JetCreator.py new file mode 100755 index 0000000..a6f9eb6 --- /dev/null +++ b/jet_tools/JetCreator/JetCreator.py @@ -0,0 +1,1431 @@ +""" + File: + JetCreator.py + + Contents and purpose: + Jet file creation utility for JET sound engine + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from __future__ import with_statement + +import wx +import sys +import thread +import copy +import wx.html +import operator + +from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin +from eas import * +from JetFile import * +from JetUtils import * +from JetCtrls import * +from JetDialogs import * +from JetSegGraph import SegmentGraph, Marker +from JetAudition import * +from JetStatusEvent import * + +import img_favicon +import img_New + +provider = wx.SimpleHelpProvider() +wx.HelpProvider_Set(provider) + + +class JetCreator(wx.Frame): + """ Main window of JetCreator utility """ + def __init__(self, parent, id, jetConfigFile, importFlag=False): + wx.Frame.__init__(self, parent, id, size=(1050, 720), style=wx.DEFAULT_FRAME_STYLE | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX) + + self.myicon = img_favicon.getIcon() + self.SetIcon(self.myicon) + self.UndoStack = [] + self.RedoStack = [] + self.queueSegs = [] + self.clipBoard = None + self.jet = None + self.playerLock = threading.RLock() + self.SetKeepPlayingFlag(True) + self.currentSegmentName = None + self.currentSegmentIndex = None + self.currentEventName = None + self.currentEventIndex = None + self.currentCtrl = "" + self.currentJetConfigFile = jetConfigFile + self.paused = False + self.eventlistSort = (0, 1) + self.seglistSort = (0, 1) + if self.currentJetConfigFile == "": + FileKillClean(JetDefs.UNTITLED_FILE) + self.currentJetConfigFile = JetDefs.UNTITLED_FILE + + self.jet_file = JetFile(self.currentJetConfigFile, "") + + if not ValidateConfig(self.jet_file): + FileKillClean(JetDefs.UNTITLED_FILE) + self.currentJetConfigFile = JetDefs.UNTITLED_FILE + self.jet_file = JetFile(self.currentJetConfigFile, "") + + if self.currentJetConfigFile == JetDefs.UNTITLED_FILE: + self.LoadDefaultProperties() + + self.initLayout() + self.initStatusBar() + self.createMenuBar() + self.createToolbar() + self.SetCurrentFile(self.currentJetConfigFile) + self.initHelp() + + self.graph.ClickCallbackFct = self.GraphTriggerClip + + EVT_JET_STATUS(self, self.OnJetStatusUpdate) + + wx.EVT_CLOSE(self, self.OnClose) + + self.Centre() + self.Show(True) + + if importFlag: + self.OnJetImportArchive(None) + + self.eventList.OnSortOrderChangedAlert = self.OnEventSortOrderChanged + self.segList.OnSortOrderChangedAlert = self.OnSegSortOrderChanged + + def initLayout(self): + """ Initializes the screen layout """ + panel = wx.Panel(self, -1) + + hboxMain = wx.BoxSizer(wx.HORIZONTAL) + + leftPanel = wx.Panel(panel, -1) + leftTopPanel = wx.Panel(leftPanel, -1) + leftBotPanel = wx.Panel(leftPanel, -1) + rightPanel = wx.Panel(panel, -1) + + self.segList = JetCheckListCtrl(rightPanel) + for title, width, fld in JetDefs.SEGMENT_GRID: + self.segList.AddCol(title, width) + + self.eventList = JetListCtrl(rightPanel) + for title, width, fld in JetDefs.CLIPS_GRID: + self.eventList.AddCol(title, width) + + self.eventList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnEventListClick) + self.segList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnSegListClick) + self.segList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnSegmentUpdate) + self.eventList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnEventUpdate) + + self.segList.BindCheckBox(self.OnSegmentChecked) + + BUT_SIZE = (95, 25) + self.btnAddSeg = wx.Button(leftTopPanel, -1, JetDefs.BUT_ADD, size=BUT_SIZE) + self.btnRevSeg = wx.Button(leftTopPanel, -1, JetDefs.BUT_REVISE, size=BUT_SIZE) + self.btnDelSeg = wx.Button(leftTopPanel, -1, JetDefs.BUT_DELETE, size=BUT_SIZE) + self.btnMoveSeg = wx.Button(leftTopPanel, -1, JetDefs.BUT_MOVE, size=BUT_SIZE) + + self.btnQueueAll = wx.Button(leftTopPanel, -1, JetDefs.BUT_QUEUEALL, size=BUT_SIZE) + self.btnDequeueAll = wx.Button(leftTopPanel, -1, JetDefs.BUT_DEQUEUEALL, size=BUT_SIZE) + self.btnPlay = wx.Button(leftTopPanel, -1, JetDefs.BUT_PLAY, size=BUT_SIZE) + self.btnPause = wx.Button(leftTopPanel, -1, JetDefs.BUT_PAUSE, size=BUT_SIZE) + self.btnAudition = wx.Button(leftTopPanel, -1, JetDefs.BUT_AUDITION, size=BUT_SIZE) + + self.btnAddEvt = wx.Button(leftBotPanel, -1, JetDefs.BUT_ADD, size=BUT_SIZE) + self.btnRevEvt = wx.Button(leftBotPanel, -1, JetDefs.BUT_REVISE, size=BUT_SIZE) + self.btnDelEvt = wx.Button(leftBotPanel, -1, JetDefs.BUT_DELETE, size=BUT_SIZE) + self.btnMoveEvents = wx.Button(leftBotPanel, -1, JetDefs.BUT_MOVE, size=BUT_SIZE) + + self.Bind(wx.EVT_BUTTON, self.OnSegmentAdd, id=self.btnAddSeg.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnSegmentUpdate, id=self.btnRevSeg.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnSegmentDelete, id=self.btnDelSeg.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnSegmentsMove, id=self.btnMoveSeg.GetId()) + + self.Bind(wx.EVT_BUTTON, self.OnSelectAll, id=self.btnQueueAll.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, id=self.btnDequeueAll.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnPlay, id=self.btnPlay.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnPause, id=self.btnPause.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnAudition, id=self.btnAudition.GetId()) + + self.Bind(wx.EVT_BUTTON, self.OnEventAdd, id=self.btnAddEvt.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnEventUpdate, id=self.btnRevEvt.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnEventDelete, id=self.btnDelEvt.GetId()) + self.Bind(wx.EVT_BUTTON, self.OnEventsMove, id=self.btnMoveEvents.GetId()) + + BORDER = 5 + BUT_SPACE = 3 + vBoxLeftTop = wx.BoxSizer(wx.VERTICAL) + vBoxLeftBot = wx.BoxSizer(wx.VERTICAL) + + vBoxLeftTop.Add(self.btnAddSeg, 0, wx.TOP, BORDER) + vBoxLeftTop.Add(self.btnRevSeg, 0, wx.TOP, BUT_SPACE) + vBoxLeftTop.Add(self.btnDelSeg, 0, wx.TOP, BUT_SPACE) + vBoxLeftTop.Add(self.btnMoveSeg, 0, wx.TOP, BUT_SPACE) + vBoxLeftTop.Add((-1, 12)) + vBoxLeftTop.Add(self.btnQueueAll, 0, wx.TOP, BUT_SPACE) + vBoxLeftTop.Add(self.btnDequeueAll, 0, wx.TOP, BUT_SPACE) + vBoxLeftTop.Add(self.btnPlay, 0, wx.TOP, BUT_SPACE) + vBoxLeftTop.Add(self.btnPause, 0, wx.TOP, BUT_SPACE) + vBoxLeftTop.Add(self.btnAudition, 0, wx.TOP, BUT_SPACE) + + vBoxLeftBot.Add(self.btnAddEvt, 0) + vBoxLeftBot.Add(self.btnRevEvt, 0, wx.TOP, BUT_SPACE) + vBoxLeftBot.Add(self.btnDelEvt, 0, wx.TOP, BUT_SPACE) + vBoxLeftBot.Add(self.btnMoveEvents, 0, wx.TOP, BUT_SPACE) + + leftTopPanel.SetSizer(vBoxLeftTop) + leftBotPanel.SetSizer(vBoxLeftBot) + + vboxLeft = wx.BoxSizer(wx.VERTICAL) + vboxLeft.Add(leftTopPanel, 1, wx.EXPAND) + vboxLeft.Add(leftBotPanel, 1, wx.EXPAND) + vboxLeft.Add((-1, 25)) + + leftPanel.SetSizer(vboxLeft) + + self.log = wx.TextCtrl(rightPanel, -1) + self.graph = SegmentGraph(rightPanel, size=(-1, 50)) + + vboxRight = wx.BoxSizer(wx.VERTICAL) + vboxRight.Add(self.segList, 4, wx.EXPAND | wx.TOP, BORDER) + vboxRight.Add((-1, 10)) + vboxRight.Add(self.eventList, 3, wx.EXPAND | wx.TOP, BORDER) + vboxRight.Add((-1, 10)) + vboxRight.Add(self.log, 0, wx.EXPAND) + vboxRight.Add((-1, 5)) + vboxRight.Add(self.graph, 1, wx.EXPAND) + vboxRight.Add((-1, 10)) + + rightPanel.SetSizer(vboxRight) + + hboxMain.Add(leftPanel, 0, wx.EXPAND | wx.RIGHT | wx.LEFT, BORDER) + hboxMain.Add(rightPanel, 1, wx.EXPAND) + hboxMain.Add((BORDER, -1)) + + panel.SetSizer(hboxMain) + + pnlGraph = wx.Panel(leftBotPanel, -1) + graphSizer1 = wx.BoxSizer(wx.VERTICAL) + pnlGraph.SetSizer(graphSizer1) + + graphBox = wx.StaticBox(pnlGraph, wx.ID_ANY, label='Graph') + graphSizer2 = wx.StaticBoxSizer(graphBox, wx.VERTICAL) + + self.chkGraphLabels = wx.CheckBox(pnlGraph, -1, JetDefs.GRAPH_LBLS) + self.chkGraphClips = wx.CheckBox(pnlGraph, -1, JetDefs.GRAPH_TRIGGER) + self.chkGraphAppEvts = wx.CheckBox(pnlGraph, -1, JetDefs.GRAPH_APP) + + graphSizer2.Add(self.chkGraphLabels, 0, wx.TOP, BUT_SPACE) + graphSizer2.Add(self.chkGraphClips, 0, wx.TOP, BUT_SPACE) + graphSizer2.Add(self.chkGraphAppEvts, 0, wx.TOP | wx.BOTTOM, BUT_SPACE) + graphSizer1.Add((-1, 10)) + graphSizer1.Add(graphSizer2) + + vBoxLeftBot.Add(pnlGraph, 0, wx.TOP, BUT_SPACE) + + self.Bind(wx.EVT_CHECKBOX, self.OnSetGraphOptions, id=self.chkGraphLabels.GetId()) + self.Bind(wx.EVT_CHECKBOX, self.OnSetGraphOptions, id=self.chkGraphClips.GetId()) + self.Bind(wx.EVT_CHECKBOX, self.OnSetGraphOptions, id=self.chkGraphAppEvts.GetId()) + + + def initHelp(self): + """ Initializes the help text for screen elements """ + self.SetHelpText(GetJetHelpText(JetDefs.MAIN_DLG_CTRLS, '')) + self.segList.SetHelpText(GetJetHelpText(JetDefs.MAIN_DLG_CTRLS, JetDefs.MAIN_SEGLIST)) + self.eventList.SetHelpText(GetJetHelpText(JetDefs.MAIN_DLG_CTRLS, JetDefs.MAIN_EVENTLIST)) + self.graph.SetHelpText(GetJetHelpText(JetDefs.AUDITION_CTRLS, JetDefs.AUDITION_GRAPH)) + + def initStatusBar(self): + """ Initializes the status bar """ + self.statusbar = self.CreateStatusBar() + + def OnSelectAll(self, event): + """ Called from select all button """ + num = self.segList.GetItemCount() + for i in range(num-1, -1, -1): + self.segList.CheckItem(i) + + def OnDeselectAll(self, event): + """ Called from deselect all button """ + num = self.segList.GetItemCount() + for i in range(num-1, -1, -1): + self.segList.CheckItem(i, False) + + def LoadSegList(self): + """ Loads up the list of segments """ + self.seglistSort = (IniGetValue(self.currentJetConfigFile, JetDefs.INI_SEGSORT, JetDefs.INI_SEGSORT_0, 'int', 0), IniGetValue(self.currentJetConfigFile, JetDefs.INI_SEGSORT, JetDefs.INI_SEGSORT_1, 'int', 1)) + segments = self.jet_file.GetSegments() + if self.seglistSort[0] == 0: + self.SegSort(segments, "segname") + elif self.seglistSort[0] == 1: + self.SegSort(segments, "filename") + elif self.seglistSort[0] == 2: + self.SegSort(segments, "dlsfile") + elif self.seglistSort[0] == 3: + self.SegSort(segments, "start") + elif self.seglistSort[0] == 4: + self.SegSort(segments, "end") + elif self.seglistSort[0] == 5: + self.SegSort(segments, "quantize") + elif self.seglistSort[0] == 6: + self.SegSort(segments, "transpose") + elif self.seglistSort[0] == 7: + self.SegSort(segments, "repeat") + elif self.seglistSort[0] == 8: + self.SegSort(segments, "mute_flags") + listDataMap = [] + self.currentSegmentIndex = None + self.currentSegmentName = None + self.segList.DeleteAllItems() + self.eventList.DeleteAllItems() + self.menuItems[JetDefs.MNU_UPDATE_SEG].Enable(False) + self.menuItems[JetDefs.MNU_DELETE_SEG].Enable(False) + self.menuItems[JetDefs.MNU_MOVE_SEG].Enable(False) + + self.menuItems[JetDefs.MNU_ADD_EVENT].Enable(False) + self.menuItems[JetDefs.MNU_MOVE_EVENT].Enable(False) + self.menuItems[JetDefs.MNU_UPDATE_EVENT].Enable(False) + self.menuItems[JetDefs.MNU_DELETE_EVENT].Enable(False) + self.menuItems[JetDefs.MNU_MOVE_EVENT].Enable(False) + for segment in self.jet_file.GetSegments(): + index = self.segList.InsertStringItem(sys.maxint, StrNoneChk(segment.segname)) + self.segList.SetStringItem(index, 1, FileJustName(StrNoneChk(segment.filename))) + self.segList.SetStringItem(index, 2, FileJustName(StrNoneChk(segment.dlsfile))) + self.segList.SetStringItem(index, 3, mbtFct(segment.start, 1)) + self.segList.SetStringItem(index, 4, mbtFct(segment.end, 1)) + self.segList.SetStringItem(index, 5, StrNoneChk(segment.quantize)) + self.segList.SetStringItem(index, 6, StrNoneChk(segment.transpose)) + self.segList.SetStringItem(index, 7, StrNoneChk(segment.repeat)) + self.segList.SetStringItem(index, 8, StrNoneChk(segment.mute_flags)) + + self.segList.SetItemData(index, index) + listDataMap.append((getColumnText(self.segList, index, 0).upper(), getColumnText(self.segList, index, 1).upper(), getColumnText(self.segList, index, 2).upper(), MbtVal(getColumnText(self.segList, index, 3)), MbtVal(getColumnText(self.segList, index, 4)), int(getColumnText(self.segList, index, 5)), int(getColumnText(self.segList, index, 6)), int(getColumnText(self.segList, index, 7)), int(getColumnText(self.segList, index, 8)))) + + self.segList.itemDataMap = listDataMap + self.segList.InitSorting(9) + self.graph.ClearGraph() + + def LoadEventsForSeg(self, segName): + """ Loads up the events associated with a segment """ + self.currentEventIndex = None + self.eventList.DeleteAllItems() + self.menuItems[JetDefs.MNU_UPDATE_EVENT].Enable(False) + self.menuItems[JetDefs.MNU_DELETE_EVENT].Enable(False) + self.menuItems[JetDefs.MNU_MOVE_EVENT].Enable(False) + self.eventlistSort = (IniGetValue(self.currentJetConfigFile, JetDefs.INI_EVENTSORT, JetDefs.INI_EVENTSORT_0, 'int', 0), IniGetValue(self.currentJetConfigFile, JetDefs.INI_EVENTSORT, JetDefs.INI_EVENTSORT_1, 'int', 1)) + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment is not None: + if self.eventlistSort[0] == 0: + self.EventSort(segment.jetevents, "event_name") + elif self.eventlistSort[0] == 1: + self.EventSort(segment.jetevents, "event_type") + elif self.eventlistSort[0] == 2: + self.EventSort(segment.jetevents, "event_start") + elif self.eventlistSort[0] == 3: + self.EventSort(segment.jetevents, "event_end") + elif self.eventlistSort[0] == 4: + self.EventSort(segment.jetevents, "track_num") + elif self.eventlistSort[0] == 5: + self.EventSort(segment.jetevents, "channel_num") + elif self.eventlistSort[0] == 6: + self.EventSort(segment.jetevents, "event_id") + listDataMap = [] + for jet_event in self.jet_file.GetEvents(segName): + index = self.eventList.InsertStringItem(sys.maxint, StrNoneChk(jet_event.event_name)) + self.eventList.SetStringItem(index, 1, StrNoneChk(jet_event.event_type)) + self.eventList.SetStringItem(index, 2, mbtFct(jet_event.event_start, 1)) + self.eventList.SetStringItem(index, 3, mbtFct(jet_event.event_end, 1)) + self.eventList.SetStringItem(index, 4, StrNoneChk(jet_event.track_num)) + self.eventList.SetStringItem(index, 5, StrNoneChk(jet_event.channel_num + 1)) + self.eventList.SetStringItem(index, 6, StrNoneChk(jet_event.event_id)) + + self.eventList.SetItemData(index, index) + listDataMap.append((getColumnText(self.eventList, index, 0).upper(), getColumnText(self.eventList, index, 1).upper(), MbtVal(getColumnText(self.eventList, index, 2)), MbtVal(getColumnText(self.eventList, index, 3)), int(getColumnText(self.eventList, index, 4)), int(getColumnText(self.eventList, index, 5)), int(getColumnText(self.eventList, index, 6)))) + + self.eventList.itemDataMap = listDataMap + self.eventList.InitSorting(7) + + def OnEventListClick(self, event): + """ Sets the current event variable when selecting from the list """ + self.currentCtrl = "eventList" + self.currentEventIndex = event.m_itemIndex + self.currentEventName = getColumnText(self.eventList, event.m_itemIndex, 0) + self.menuItems[JetDefs.MNU_UPDATE_EVENT].Enable(True) + self.menuItems[JetDefs.MNU_DELETE_EVENT].Enable(True) + self.menuItems[JetDefs.MNU_MOVE_EVENT].Enable(True) + + def OnSegmentChecked(self, index, checked): + """ Selects the segment when checkbox clicked """ + ClearRowSelections(self.segList) + SetRowSelection(self.segList, index, True) + + def SelectSegment(self, segName): + """ Selects a segment by segment name """ + itm = self.segList.FindItem(-1, segName) + self.segList.EnsureVisible(itm) + ClearRowSelections(self.segList) + SetRowSelection(self.segList, itm, True) + + def SelectEvent(self, eventName): + """ Selects an event by event name """ + itm = self.eventList.FindItem(-1, eventName) + self.eventList.EnsureVisible(itm) + ClearRowSelections(self.eventList) + SetRowSelection(self.eventList, itm, True) + + def OnSegListClick(self, event): + """ Loads up a segment when the list is clicked """ + self.currentCtrl = "segList" + self.currentSegmentIndex = event.m_itemIndex + self.currentSegmentName = getColumnText(self.segList, event.m_itemIndex, 0) + self.LoadEventsForSeg(getColumnText(self.segList, event.m_itemIndex, 0)) + self.menuItems[JetDefs.MNU_UPDATE_SEG].Enable(True) + self.menuItems[JetDefs.MNU_DELETE_SEG].Enable(True) + self.menuItems[JetDefs.MNU_MOVE_SEG].Enable(True) + self.menuItems[JetDefs.MNU_ADD_EVENT].Enable(True) + info = self.graph.LoadSegment(self.jet_file.GetSegment(self.currentSegmentName), showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + if info == None: + self.log.SetValue("") + else: + iLength = info.iLengthInMs + if iLength > 0: + self.log.SetValue("%s %.2f Seconds" % (self.currentSegmentName, iLength / 1000.00)) + else: + self.log.SetValue("%s" % (self.currentSegmentName)) + + def OnSegmentAdd(self, event): + """ Calls the dialog box for adding a segment """ + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + + dlg = SegEdit(JetDefs.MAIN_ADDSEGTITLE, self.currentJetConfigFile) + + for filename in self.jet_file.GetMidiFiles(): + dlg.je.ctrls[JetDefs.F_MIDIFILE].Append(filename) + for library in self.jet_file.GetLibraries(): + dlg.je.ctrls[JetDefs.F_DLSFILE].Append(library) + + result = dlg.ShowModal() + if result == wx.ID_OK: + if len(dlg.lstReplicate) > 0: + if dlg.chkReplaceMatching: + self.jet_file.DeleteSegmentsMatchingPrefix(dlg.replicatePrefix) + + for replicate in dlg.lstReplicate: + self.jet_file.AddSegment(replicate[0], dlg.GetValue(JetDefs.F_MIDIFILE), + mbtFct(replicate[1],-1), mbtFct(replicate[2],-1), + JetDefs.MBT_ZEROSTR, + SegmentOutputFile(dlg.GetValue(JetDefs.F_SEGNAME), self.currentJetConfigFile), + dlg.GetValue(JetDefs.F_QUANTIZE), + [], dlg.GetValue(JetDefs.F_DLSFILE), + None, + dlg.GetValue(JetDefs.F_TRANSPOSE), + dlg.GetValue(JetDefs.F_REPEAT), + dlg.GetValue(JetDefs.F_MUTEFLAGS)) + + self.LoadSegList() + self.SelectSegment(dlg.lstReplicate[0][0]) + else: + self.jet_file.AddSegment(dlg.GetValue(JetDefs.F_SEGNAME), dlg.GetValue(JetDefs.F_MIDIFILE), + dlg.GetValue(JetDefs.F_START), dlg.GetValue(JetDefs.F_END), + JetDefs.MBT_ZEROSTR, + SegmentOutputFile(dlg.GetValue(JetDefs.F_SEGNAME), self.currentJetConfigFile), + dlg.GetValue(JetDefs.F_QUANTIZE), + [], dlg.GetValue(JetDefs.F_DLSFILE), + None, + dlg.GetValue(JetDefs.F_TRANSPOSE), + dlg.GetValue(JetDefs.F_REPEAT), + dlg.GetValue(JetDefs.F_MUTEFLAGS)) + self.LoadSegList() + self.SelectSegment(dlg.GetValue(JetDefs.F_SEGNAME)) + self.UndoAdd(saveState) + dlg.Destroy() + + def OnSegmentUpdate(self, event): + """ Calls the dialog box for updating a segment """ + if self.currentSegmentName is None: + return + + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment == None: + return + + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + + dlg = SegEdit(JetDefs.MAIN_REVSEGTITLE, self.currentJetConfigFile) + + for filename in self.jet_file.GetMidiFiles(): + dlg.je.ctrls[JetDefs.F_MIDIFILE].Append(filename) + for library in self.jet_file.GetLibraries(): + dlg.je.ctrls[JetDefs.F_DLSFILE].Append(library) + + dlg.SetValue(JetDefs.F_SEGNAME, segment.segname) + dlg.SetValue(JetDefs.F_MUTEFLAGS, segment.mute_flags) + dlg.SetValue(JetDefs.F_MIDIFILE, segment.filename) + dlg.SetValue(JetDefs.F_DLSFILE, segment.dlsfile) + dlg.SetValue(JetDefs.F_START, segment.start) + dlg.SetValue(JetDefs.F_END, segment.end) + dlg.SetValue(JetDefs.F_QUANTIZE, segment.quantize) + dlg.SetValue(JetDefs.F_TRANSPOSE, segment.transpose) + dlg.SetValue(JetDefs.F_REPEAT, segment.repeat) + dlg.jetevents = segment.jetevents + + result = dlg.ShowModal() + if result == wx.ID_OK: + self.jet_file.UpdateSegment(self.currentSegmentName, dlg.GetValue(JetDefs.F_SEGNAME), + dlg.GetValue(JetDefs.F_MIDIFILE), + dlg.GetValue(JetDefs.F_START), dlg.GetValue(JetDefs.F_END), + JetDefs.MBT_ZEROSTR, #dlg.GetValue(JetDefs.F_LENGTH), + SegmentOutputFile(dlg.GetValue(JetDefs.F_SEGNAME), self.currentJetConfigFile), + dlg.GetValue(JetDefs.F_QUANTIZE), + [], dlg.GetValue(JetDefs.F_DLSFILE), + None, + dlg.GetValue(JetDefs.F_TRANSPOSE), + dlg.GetValue(JetDefs.F_REPEAT), + dlg.GetValue(JetDefs.F_MUTEFLAGS)) + + if len(dlg.lstReplicate) > 0: + if dlg.chkReplaceMatching: + self.jet_file.DeleteSegmentsMatchingPrefix(dlg.replicatePrefix) + + for replicate in dlg.lstReplicate: + self.jet_file.AddSegment(replicate[0], dlg.GetValue(JetDefs.F_MIDIFILE), + mbtFct(replicate[1],-1), mbtFct(replicate[2],-1), + JetDefs.MBT_ZEROSTR, + SegmentOutputFile(dlg.GetValue(JetDefs.F_SEGNAME), self.currentJetConfigFile), + dlg.GetValue(JetDefs.F_QUANTIZE), + [], dlg.GetValue(JetDefs.F_DLSFILE), + None, + dlg.GetValue(JetDefs.F_TRANSPOSE), + dlg.GetValue(JetDefs.F_REPEAT), + dlg.GetValue(JetDefs.F_MUTEFLAGS)) + + self.LoadSegList() + self.SelectSegment(dlg.lstReplicate[0][0]) + else: + self.LoadSegList() + self.SelectSegment(dlg.GetValue(JetDefs.F_SEGNAME)) + self.UndoAdd(saveState) + dlg.Destroy() + + def OnSegmentDelete(self, event): + """ Confirms the deletion segment(s) by user action """ + if self.currentSegmentName is None: + return + + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment == None: + return + + count = 0 + deleteMsg = '' + item = self.segList.GetFirstSelected() + while item != -1: + if count == 0: + deleteMsg = getColumnText(self.segList,item,0) + else: + if count == 40: + deleteMsg = deleteMsg + "\n" + "....more" + elif count < 40: + deleteMsg = deleteMsg + "\n" + getColumnText(self.segList,item,0) + count = count + 1 + item = self.segList.GetNextSelected(item) + + if YesNo(JetDefs.MAIN_CONFIRM, deleteMsg + JetDefs.MAIN_CONFIRM_SEG_DLT, False): + item = self.segList.GetFirstSelected() + while item != -1: + segName = getColumnText(self.segList,item,0) + self.SegmentDelete(segName) + item = self.segList.GetNextSelected(item) + + self.graph.ClearGraph() + self.LoadSegList() + + def SegmentDelete(self, segName): + """ Deletes a segment """ + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + self.jet_file.DeleteSegment(segName) + self.UndoAdd(saveState) + + def OnSegmentsMove(self, event): + """ Move segment(s) """ + if self.currentSegmentName is None: + return + + lstMoveItems = [] + count = 0 + item = self.segList.GetFirstSelected() + while item != -1: + max = GetMidiInfo(self.jet_file.GetSegment(getColumnText(self.segList,item,0)).filename).endMbtStr + lstMoveItems.append((getColumnText(self.segList,item,0), mbtFct(getColumnText(self.segList,item,3),-1), mbtFct(getColumnText(self.segList,item,4),-1), max)) + count = count + 1 + item = self.segList.GetNextSelected(item) + + if count == 0: + InfoMsg("Move", "Select one or more items to move.") + return + + dlg = JetMove("Move Segments") + dlg.lstMoveItems = lstMoveItems + result = dlg.ShowModal() + if result == wx.ID_OK: + if len(dlg.lstMoveMbt) > 0: + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + + for moveitem in dlg.lstMoveMbt: + self.jet_file.MoveSegment(moveitem[0], moveitem[1], moveitem[2]) + + self.LoadSegList() + self.UndoAdd(saveState) + + dlg.Destroy() + + def UndoAdd(self, saveState): + """ Adds the current state to the undo stack """ + self.UndoStack.append(saveState) + self.menuItems[JetDefs.MNU_UNDO].Enable(True) + + def RedoAdd(self, saveState): + """ Adds the current state the the redo stack """ + self.RedoStack.append(saveState) + self.menuItems[JetDefs.MNU_REDO].Enable(True) + + def OnRedo(self, event): + """ Redo if there's one in the stack """ + if len(self.RedoStack) > 0: + self.UndoAdd(JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex)) + state = self.RedoStack.pop() + self.jet_file = copy.deepcopy(state.jet_file) + self.LoadSegList() + self.currentSegmentIndex = state.currentSegmentIndex + if self.currentSegmentIndex != None: + SetRowSelection(self.segList, self.currentSegmentIndex, True) + if len(self.RedoStack) == 0: + self.menuItems[JetDefs.MNU_REDO].Enable(False) + + def OnUndo(self, event): + """ Undo if there's one in the stack """ + if len(self.UndoStack) > 0: + self.RedoAdd(JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex)) + state = self.UndoStack.pop() + self.jet_file = copy.deepcopy(state.jet_file) + self.LoadSegList() + self.currentSegmentIndex = state.currentSegmentIndex + if self.currentSegmentIndex != None: + SetRowSelection(self.segList, self.currentSegmentIndex, True) + if len(self.UndoStack) == 0: + self.menuItems[JetDefs.MNU_UNDO].Enable(False) + + def OnEventAdd(self, event): + """ Calls a dialog box to add an event to the current segment """ + if self.currentSegmentName is None: + return + + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment == None: + return + + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + + dlg = EventEdit(JetDefs.MAIN_ADDEVENTTITLE, self.currentJetConfigFile) + editSegment = copy.deepcopy(segment) + dlg.SetSegment(editSegment) + dlg.SetEventId() + + result = dlg.ShowModal() + if result == wx.ID_OK: + if dlg.GetValue(JetDefs.F_ETYPE) == JetDefs.E_EOS: + #check for an existing EOS event + events = self.jet_file.GetEvents(self.currentSegmentName) + for evt in events: + if evt.event_type == JetDefs.E_EOS: + self.jet_file.DeleteEvent(self.currentSegmentName, evt.event_name) + dlg.SetValue(JetDefs.F_ESTART, dlg.GetValue(JetDefs.F_EEND)) + + if len(dlg.lstReplicate) > 0: + if dlg.chkReplaceMatching: + self.jet_file.DeleteEventsMatchingPrefix(self.currentSegmentName, dlg.replicatePrefix) + + for replicate in dlg.lstReplicate: + self.jet_file.AddEvent(self.currentSegmentName, replicate[0], + dlg.GetValue(JetDefs.F_ETYPE), + dlg.GetValue(JetDefs.F_EEVENTID), + dlg.GetValue(JetDefs.F_ETRACK), + dlg.GetValue(JetDefs.F_ECHANNEL), + mbtFct(replicate[1],-1), + mbtFct(replicate[2],-1)) + self.SelectSegment(self.currentSegmentName) + self.SelectEvent(dlg.lstReplicate[0][0]) + else: + self.jet_file.AddEvent(self.currentSegmentName, dlg.GetValue(JetDefs.F_ENAME), + dlg.GetValue(JetDefs.F_ETYPE), + dlg.GetValue(JetDefs.F_EEVENTID), + dlg.GetValue(JetDefs.F_ETRACK), + dlg.GetValue(JetDefs.F_ECHANNEL), + dlg.GetValue(JetDefs.F_ESTART), + dlg.GetValue(JetDefs.F_EEND)) + + self.SelectSegment(self.currentSegmentName) + self.SelectEvent(dlg.GetValue(JetDefs.F_ENAME)) + + self.UndoAdd(saveState) + dlg.Destroy() + + def OnEventUpdate(self, event): + """ Calls the dialog box to update the current event """ + if self.currentSegmentName is None: + return + + if self.currentEventName is None: + return + + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment == None: + return + + curEvent = copy.deepcopy(self.jet_file.GetEvent(self.currentSegmentName, self.currentEventName)) + if curEvent == None: + return + + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + + #only want the event we are editing to show up in graph + editSegment = copy.deepcopy(segment) + editSegment.jetevents = [] + editSegment.jetevents.append(curEvent) + + dlg = EventEdit(JetDefs.MAIN_REVEVENTTITLE, self.currentJetConfigFile) + dlg.SetSegment(editSegment) + dlg.SetValue(JetDefs.F_ENAME, curEvent.event_name) + dlg.SetValue(JetDefs.F_ETYPE, curEvent.event_type) + dlg.SetValue(JetDefs.F_ESTART, curEvent.event_start) + dlg.SetValue(JetDefs.F_EEND, curEvent.event_end) + dlg.SetValue(JetDefs.F_ETRACK, curEvent.track_num) + dlg.SetValue(JetDefs.F_ECHANNEL, curEvent.channel_num) + dlg.SetValue(JetDefs.F_EEVENTID, curEvent.event_id) + dlg.OnEventSelect() + + result = dlg.ShowModal() + if result == wx.ID_OK: + if dlg.GetValue(JetDefs.F_ETYPE) == JetDefs.E_EOS: + dlg.SetValue(JetDefs.F_ESTART, dlg.GetValue(JetDefs.F_EEND)) + + self.jet_file.UpdateEvent(self.currentSegmentName, + self.currentEventName, + dlg.GetValue(JetDefs.F_ENAME), + dlg.GetValue(JetDefs.F_ETYPE), + dlg.GetValue(JetDefs.F_EEVENTID), + dlg.GetValue(JetDefs.F_ETRACK), + dlg.GetValue(JetDefs.F_ECHANNEL), + dlg.GetValue(JetDefs.F_ESTART), + dlg.GetValue(JetDefs.F_EEND)) + + if len(dlg.lstReplicate) > 0: + if dlg.chkReplaceMatching: + self.jet_file.DeleteEventsMatchingPrefix(self.currentSegmentName, dlg.replicatePrefix) + + for replicate in dlg.lstReplicate: + self.jet_file.AddEvent(self.currentSegmentName, replicate[0], + dlg.GetValue(JetDefs.F_ETYPE), + dlg.GetValue(JetDefs.F_EEVENTID), + dlg.GetValue(JetDefs.F_ETRACK), + dlg.GetValue(JetDefs.F_ECHANNEL), + mbtFct(replicate[1],-1), + mbtFct(replicate[2],-1)) + self.SelectSegment(self.currentSegmentName) + self.SelectEvent(dlg.lstReplicate[0][0]) + else: + self.SelectSegment(self.currentSegmentName) + self.SelectEvent(dlg.GetValue(JetDefs.F_ENAME)) + self.UndoAdd(saveState) + dlg.Destroy() + + def OnEventDelete(self, event): + """ Confirms the deletion of event(s) """ + if self.currentSegmentName is None: + return + + if self.currentEventName is None: + return + + curEvent = self.jet_file.GetEvent(self.currentSegmentName, self.currentEventName) + if curEvent == None: + return + + count = 0 + deleteMsg = '' + item = self.eventList.GetFirstSelected() + while item != -1: + if count == 0: + deleteMsg = getColumnText(self.eventList,item,0) + else: + if count == 40: + deleteMsg = deleteMsg + "\n" + "....more" + elif count < 40: + deleteMsg = deleteMsg + "\n" + getColumnText(self.eventList,item,0) + count = count + 1 + item = self.eventList.GetNextSelected(item) + + + if YesNo(JetDefs.MAIN_CONFIRM, deleteMsg + JetDefs.MAIN_CONRIRM_EVT_DLT, False): + item = self.eventList.GetFirstSelected() + while item != -1: + eventName = getColumnText(self.eventList,item,0) + self.EventDelete(eventName) + item = self.eventList.GetNextSelected(item) + + self.SelectSegment(self.currentSegmentName) + self.LoadEventsForSeg(self.currentSegmentName) + + def EventDelete(self, eventName): + """ Deletes an event """ + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + self.jet_file.DeleteEvent(self.currentSegmentName, eventName) + self.UndoAdd(saveState) + + def OnEventsMove(self, event): + """ Move event(s) """ + if self.currentSegmentName is None: + return + + if self.currentEventName is None: + return + + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment == None: + return + + curEvent = self.jet_file.GetEvent(self.currentSegmentName, self.currentEventName) + if curEvent == None: + return + + lstMoveItems = [] + count = 0 + item = self.eventList.GetFirstSelected() + while item != -1: + lstMoveItems.append((getColumnText(self.eventList,item,0), mbtFct(getColumnText(self.eventList,item,2),-1), mbtFct(getColumnText(self.eventList,item,3),-1), segment.end)) + count = count + 1 + item = self.eventList.GetNextSelected(item) + + if count == 0: + InfoMsg("Move", "Select one or more items to move.") + return + + dlg = JetMove("Move Events") + dlg.lstMoveItems = lstMoveItems + result = dlg.ShowModal() + if result == wx.ID_OK: + if len(dlg.lstMoveMbt) > 0: + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + + for moveitem in dlg.lstMoveMbt: + self.jet_file.MoveEvent(self.currentSegmentName, moveitem[0], moveitem[1], moveitem[2]) + + self.SelectSegment(self.currentSegmentName) + self.LoadEventsForSeg(self.currentSegmentName) + + self.UndoAdd(saveState) + + dlg.Destroy() + + def OnJetOpen(self, event): + """ Calls a dialog box to get a jet config file to open """ + dlg = JetOpen() + result = dlg.ShowModal() + if result == JetDefs.ID_JET_OPEN: + self.jet_file = JetFile(dlg.fileName , "") + if not ValidateConfig(self.jet_file): + FileKillClean(JetDefs.UNTITLED_FILE) + self.currentJetConfigFile = JetDefs.UNTITLED_FILE + self.jet_file = JetFile(self.currentJetConfigFile, "") + else: + self.SetCurrentFile(dlg.fileName) + elif result == JetDefs.ID_JET_NEW: + self.jet_file = JetFile("" , "") + self.SetCurrentFile(JetDefs.UNTITLED_FILE) + self.LoadDefaultProperties() + elif result == JetDefs.ID_JET_IMPORT: + self.OnJetImportArchive(event) + dlg.Destroy() + + def OnJetSaveAs(self, event): + """ Calls a dialog box to allow saving the current jet file as another name """ + defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.JTC_FILE_SPEC, 'str', str(os.getcwd())) + dialog = wx.FileDialog(None, JetDefs.SAVE_PROMPT, defDir, "", JetDefs.JTC_FILE_SPEC, wx.SAVE | wx.OVERWRITE_PROMPT ) + if dialog.ShowModal() == wx.ID_OK: + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.JTC_FILE_SPEC, str(FileJustPath(dialog.GetPath()))) + self.currentJetConfigFile = FileJustRoot(dialog.GetPath()) + ".jtc" + self.jet_file.config.filename = FileJustRoot(self.currentJetConfigFile) + ".jet" + self.jet_file.SaveJetConfig(self.currentJetConfigFile) + self.jet_file.WriteJetFileFromConfig(self.currentJetConfigFile) + self.SetCurrentFile(self.currentJetConfigFile) + dialog.Destroy() + + def OnJetSave(self, event): + """ Saves the current jet file to disk """ + if self.currentJetConfigFile == JetDefs.UNTITLED_FILE: + self.OnJetSaveAs(event) + else: + self.jet_file.SaveJetConfig(self.currentJetConfigFile) + self.jet_file.WriteJetFileFromConfig(self.currentJetConfigFile) + + def OnJetNew(self, event): + """ Initializes the state to a new jet file """ + self.jet_file = JetFile("" , "") + self.SetCurrentFile(JetDefs.UNTITLED_FILE) + self.LoadDefaultProperties() + + def SetCurrentFile(self, fileName): + """ Sets the state for the current jet file """ + self.clipBoard = None + self.currentJetConfigFile = fileName + self.SetTitle(JetDefs.MAIN_TITLEPREFIX + FileJustName(fileName)) + AppendRecentJetFile(fileName) + self.LoadSegList() + self.graph.ClearGraph() + self.chkGraphLabels.SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True')) + self.chkGraphClips.SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True')) + self.chkGraphAppEvts.SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def createMenuBar(self): + """ Creates a menu bar """ + self.menuItems = {} + menuBar = wx.MenuBar() + for eachMenuData in JetDefs.MENU_SPEC: + menuLabel = eachMenuData[0] + menuItems = eachMenuData[1:] + menuBar.Append(self.createMenu(menuItems), menuLabel) + self.SetMenuBar(menuBar) + + def createMenu(self, menuData): + """ Creates a menu from the structure menuData in JetDefs """ + menu = wx.Menu() + for eachLabel, eachStatus, eachHandler, eachEnable in menuData: + if not eachLabel: + menu.AppendSeparator() + continue + self.menuItems[eachLabel] = menu.Append(-1, eachLabel, eachStatus) + self.menuItems[eachLabel].Enable(eachEnable) + try: + self.Bind(wx.EVT_MENU, getattr(self, eachHandler) , self.menuItems[eachLabel]) + except: + print("def " + eachHandler + "(self, event): pass") + return menu + + def createToolbar(self): + """ Creates the toolbar """ + toolbar = self.CreateToolBar() + toolbar.SetToolBitmapSize((32,32)) + self.toolItems = {} + for eachTool in JetDefs.TOOLBAR_SPEC: + if eachTool[0] == '-': + toolbar.AddSeparator() + else: + b = __import__(eachTool[1]) + bitMap = b.getBitmap() + self.toolItems[eachTool[0]] = toolbar.AddLabelTool(-1, label=eachTool[0], + bitmap=bitMap, + shortHelp=eachTool[0], longHelp=eachTool[2]) + self.Bind(wx.EVT_TOOL, getattr(self, eachTool[3]) , self.toolItems[eachTool[0]]) + toolbar.Realize() + + def OnAudition(self, event): + """ Calls the audition window for simple preview of jet file """ + jet_file = CreateTempJetFile(self.jet_file) + + w, h = self.GetSize() + w = w - 50 + if w < 900: + w = 900 + h = h - 50 + if h < 650: + h = 650 + dlg = Audition(jet_file, (w,h)) + dlg.ShowModal() + CleanupTempJetFile(jet_file) + + def SetKeepPlayingFlag(self, val): + """ Sets a flag to communicate playing state to the play thread """ + with self.playerLock: + self.keepPlaying = val + + def GetKeepPlayingFlag(self): + """ Gets the playing state flag """ + with self.playerLock: + return self.keepPlaying + + def GraphTriggerClip(self, sClipName, iEventId): + """ Triggers a clip when they click on the graph """ + with self.playerLock: + try: + self.jet.TriggerClip(iEventId) + self.log.SetValue(JetDefs.PLAY_TRIGGERCLIP_MSG % (iEventId, sClipName)) + return True + except: + return False + + def OnHelpJet(self, event): + """ Loads the jet help file """ + import webbrowser + webbrowser.open(JetDefs.MAIN_HELPFILE) + return + + def OnHelpJetGuidelines(self, event): + """ Loads the authoring guidelines file """ + import webbrowser + webbrowser.open(JetDefs.MAIN_HELPGUIDELINESFILE) + return + + def OnAbout(self, event): + """ Loads the about dialog box """ + dlg = JetAbout() + result = dlg.ShowModal() + dlg.Destroy() + + def OnJetImportArchive(self, event): + """ Imports a jet archive file """ + defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.ARCHIVE_FILE_SPEC, 'str', str(os.getcwd())) + dialog = wx.FileDialog(None, JetDefs.IMPORT_ARCHIVE_PROMPT, defDir, "", JetDefs.ARCHIVE_FILE_SPEC, wx.OPEN) + if dialog.ShowModal() == wx.ID_OK: + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.ARCHIVE_FILE_SPEC, str(FileJustPath(dialog.GetPath()))) + defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.ARCHIVE_FILE_SPEC + "Dir", 'str', str(os.getcwd())) + dlg1 = wx.DirDialog(self, JetDefs.IMPORT_ARCHIVEDIR_PROMPT, style=wx.DD_DEFAULT_STYLE, defaultPath=defDir) + if dlg1.ShowModal() == wx.ID_OK: + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.ARCHIVE_FILE_SPEC + "Dir", str(FileJustPath(dlg1.GetPath()))) + if YesNo(JetDefs.MAIN_IMPORTTITLE, JetDefs.MAIN_IMPORTMSG % (dialog.GetPath(),dlg1.GetPath()), False): + projectPath = dlg1.GetPath() + zipFile = dialog.GetPath() + z = __import__('zipfile') + + if not z.is_zipfile(zipFile): + wx.MessageBox(JetDefs.IMPORT_ARCHIVE_NO_JTC) + else: + zip = z.ZipFile(zipFile, 'r') + + jtcFile = "" + fileList = zip.namelist() + + isArchive = False + for myFile in fileList: + if myFile == 'JetArchive': + isArchive = True + break + if not isArchive: + wx.MessageBox(JetDefs.IMPORT_NOT_JET_ARCHIVE) + else: + for myFile in fileList: + if FileJustExt(myFile) == '.JTC': + jtcFile = myFile + break + if jtcFile == "": + wx.MessageBox(JetDefs.IMPORT_ARCHIVE_NO_JTC) + else: + for name in zip.namelist(): + ext = FileJustExt(name) + if ext == '.MID' or ext == '.DLS' or ext == '.JET': + file(FileFixPath(projectPath + "/" + name), 'wb').write(zip.read(name)) + else: + if len(ext) > 0 and ext != '.DS_STORE': + file(FileFixPath(projectPath + "/" + name), 'w').write(zip.read(name)) + zip.close() + self.currentJetConfigFile = FileFixPath(projectPath + "/") + jtcFile + self.jet_file = JetFile(self.currentJetConfigFile, "") + + #fix paths + self.jet_file.config.filename = FileJustRoot(self.currentJetConfigFile) + ".JET" + for index, segment in enumerate(self.jet_file.segments): + self.jet_file.segments[index].filename = FileFixPath(projectPath + "/" + segment.filename) + if segment.dlsfile > "": + self.jet_file.segments[index].dlsfile = FileFixPath(projectPath + "/" + segment.dlsfile) + self.jet_file.segments[index].output = FileFixPath(projectPath + "/" + segment.output) + + for index, library in enumerate(self.jet_file.libraries): + self.jet_file.libraries[index] = FileFixPath(projectPath + "/" + library) + + if ValidateConfig(self.jet_file): + self.jet_file.SaveJetConfig(self.currentJetConfigFile) + self.jet_file.WriteJetFileFromConfig(self.currentJetConfigFile) + self.jet_file = JetFile(self.currentJetConfigFile , "") + self.SetCurrentFile(self.currentJetConfigFile) + + dlg1.Destroy() + dialog.Destroy() + + def OnJetExportArchive(self, event): + """ Exports the current setup to an archive file """ + self.OnJetSave(event) + defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.ARCHIVE_FILE_SPEC, 'str', str(os.getcwd())) + dialog = wx.FileDialog(None, JetDefs.EXPORT_ARCHIVE_PROMPT, defDir, "", JetDefs.ARCHIVE_FILE_SPEC, wx.SAVE | wx.OVERWRITE_PROMPT ) + if dialog.ShowModal() == wx.ID_OK: + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, JetDefs.ARCHIVE_FILE_SPEC, str(FileJustPath(dialog.GetPath()))) + ExportJetArchive(FileJustRoot(dialog.GetPath()) + ".zip", self.currentJetConfigFile, self.jet_file) + dialog.Destroy() + + def OnCopy(self, event): + """ Copies the current segment or event to the clipboard """ + if self.currentCtrl == JetDefs.MAIN_SEGLIST: + if self.currentSegmentName is None: + return "" + + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment == None: + return "" + self.clipBoard = JetCutCopy(self.currentCtrl, segment, self.currentSegmentName) + return self.currentCtrl + elif self.currentCtrl == JetDefs.MAIN_EVENTLIST: + if self.currentSegmentName is None: + return "" + + if self.currentEventName is None: + return "" + + segment = self.jet_file.GetSegment(self.currentSegmentName) + if segment == None: + return "" + + curEvent = self.jet_file.GetEvent(self.currentSegmentName, self.currentEventName) + if curEvent == None: + return "" + self.clipBoard = JetCutCopy(self.currentCtrl, curEvent, self.currentSegmentName) + return self.currentCtrl + + def OnCut(self, event): + """ Cuts the current segment or event to the clipboard """ + retCopy = self.OnCopy(event) + if retCopy == JetDefs.MAIN_SEGLIST: + self.SegmentDelete(self.currentSegmentName) + self.LoadSegList() + elif retCopy == JetDefs.MAIN_EVENTLIST: + self.EventDelete(self.currentEventName) + self.LoadEventsForSeg(self.currentSegmentName) + + def OnPaste(self, event): + """ Pastes the current segment or event from the clipboard """ + if self.clipBoard is not None: + if self.currentCtrl == JetDefs.MAIN_SEGLIST and self.clipBoard.objType == JetDefs.MAIN_SEGLIST: + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + self.jet_file.segments.append(self.clipBoard.GetObj(self.jet_file.segments)) + self.UndoAdd(saveState) + self.LoadSegList() + elif self.currentCtrl == JetDefs.MAIN_EVENTLIST and self.clipBoard.objType == JetDefs.MAIN_EVENTLIST and self.clipBoard.currentSegmentName == self.currentSegmentName: + for segment in self.jet_file.segments: + if segment.segname == self.currentSegmentName: + saveState = JetState(self.jet_file, self.currentSegmentIndex, self.currentEventIndex) + segment.jetevents.append(self.clipBoard.GetObj(segment.jetevents)) + self.UndoAdd(saveState) + self.LoadEventsForSeg(self.currentSegmentName) + self.graph.LoadSegment(self.jet_file.GetSegment(self.currentSegmentName), showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def OnJetProperties(self, event): + """ Opens a dialog box for jetfile properties """ + dlg = JetPropertiesDialog() + dlg.SetValue(JetDefs.F_JETFILENAME, self.jet_file.config.filename) + dlg.SetValue(JetDefs.F_COPYRIGHT, StrNoneChk(self.jet_file.config.copyright)) + dlg.SetValue(JetDefs.F_CHASECONTROLLERS, StrNoneChk(self.jet_file.config.chase_controllers)) + dlg.SetValue(JetDefs.F_DELETEEMPTYTRACKS, StrNoneChk(self.jet_file.config.delete_empty_tracks)) + + result = dlg.ShowModal() + if result == wx.ID_OK: + self.jet_file.config.filename = dlg.je.ctrls[JetDefs.F_JETFILENAME].GetValue() + self.jet_file.config.copyright = dlg.je.ctrls[JetDefs.F_COPYRIGHT].GetValue() + self.jet_file.config.chase_controllers = dlg.je.ctrls[JetDefs.F_CHASECONTROLLERS].GetValue() + self.jet_file.config.delete_empty_tracks = dlg.je.ctrls[JetDefs.F_DELETEEMPTYTRACKS].GetValue() + dlg.Destroy() + + def OnPreferences(self, event): + """ Opens a dialog box to capture preferences and saves them to a configuration file """ + dlg = JetPreferences() + dlg.SetValue(JetDefs.F_COPYRIGHT, IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_COPYRIGHT)) + dlg.SetValue(JetDefs.F_CHASECONTROLLERS, IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_CHASECONTROLLERS, 'bool', True)) + dlg.SetValue(JetDefs.F_DELETEEMPTYTRACKS, IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_DELETEEMPTYTRACKS, 'bool', False)) + result = dlg.ShowModal() + if result == wx.ID_OK: + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_COPYRIGHT, dlg.GetValue(JetDefs.F_COPYRIGHT)) + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_CHASECONTROLLERS, dlg.GetValue(JetDefs.F_CHASECONTROLLERS)) + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_DELETEEMPTYTRACKS, dlg.GetValue(JetDefs.F_DELETEEMPTYTRACKS)) + dlg.Destroy() + + def LoadDefaultProperties(self): + """ Loads default properties from the a configuration file """ + self.jet_file.config.copyright = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_COPYRIGHT) + self.jet_file.config.chase_controllers = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_CHASECONTROLLERS, 'bool', True) + self.jet_file.config.delete_empty_tracks = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_PREF_SECTION, JetDefs.F_DELETEEMPTYTRACKS, 'bool', False) + + def OnClose(self, event): + """ Called upon closing the JetCreator main window """ + if self.isDirty(): + ret = YesNoCancel(JetDefs.MAIN_JETCREATOR, JetDefs.MAIN_SAVEBEFOREEXIT, True) + if ret == wx.ID_YES: + self.OnJetSave(None) + if ret == wx.ID_CANCEL: + return + + if self.jet is not None: + SafeJetShutdown(self.playerLock, self.jet) + self.Destroy() + + def OnPlay(self, event): + """ Plays the currently queued segments """ + if self.btnPlay.GetLabel() == JetDefs.BUT_PLAY: + if not ValidateConfig(self.jet_file): + return + + #make sure something is queued + iQueued = False + num = self.segList.GetItemCount() + for seg_num in range(num): + if self.segList.IsChecked(seg_num): + iQueued = True + if not iQueued: + InfoMsg(JetDefs.MAIN_PLAYSEG, JetDefs.MAIN_PLAYSEGMSG) + return + + for segment in self.jet_file.segments: + if FileExists(segment.dlsfile): + if not segment.dlsfile in self.jet_file.libraries: + self.jet_file.libraries.append(segment.dlsfile) + + self.eventList.DeleteAllItems() + num = self.segList.GetItemCount() + for seg_num in range(num): + if seg_num == 0: self.log.Clear() + if self.segList.IsChecked(seg_num): + segment = self.jet_file.GetSegment(getColumnText(self.segList, seg_num, 0)) + if segment != None: + #so we can determine which segment is playing, make these the same + userID = seg_num + if FileExists(segment.dlsfile): + dls_num = FindDlsNum(self.jet_file.libraries, segment.dlsfile) + else: + dls_num = -1 + self.queueSegs.append(QueueSeg(segment.segname, userID, seg_num, dls_num, segment.repeat, segment.transpose, segment.mute_flags)) + + if len(self.queueSegs) == 0: + return + + self.btnPlay.SetLabel(JetDefs.BUT_STOP) + + thread.start_new_thread(self.PlaySegs, ()) + else: + with self.playerLock: + self.jet.Clear_Queue() + self.SetKeepPlayingFlag(False) + + def PlaySegs(self): + """ Thread writes a temporary copy of the jet file, and calls the library to play it """ + if len(self.queueSegs) == 0: + return + + jet_file = CreateTempJetFile(self.jet_file) + + if not ValidateConfig(jet_file): + CleanupTempJetFile(jet_file) + return + + self.jet = JET() + self.jet.eas.StartWave() + self.jet.OpenFile(jet_file.config.filename) + + lastID = -1 + + # queue first segment and start playback + Queue(self.jet, self.queueSegs[0]) + index = 1 + self.jet.Play() + self.paused = False + + # continue playing until all segments are done + self.SetKeepPlayingFlag(True) + while self.GetKeepPlayingFlag(): + self.jet.Render() + status = self.jet.Status() + + if status.currentUserID <> lastID and status.currentUserID <> -1: + wx.PostEvent(self, JetStatusEvent(JetDefs.PST_PLAY, status.currentUserID)) + lastID = status.currentUserID + + # if no more segments - we're done + if status.numQueuedSegments == 0: + break + + self.jet.GetAppEvent() + + # if less than 2 segs queued - queue another one + if (index < len(self.queueSegs)) and (status.numQueuedSegments < 2): + Queue(self.jet, self.queueSegs[index]) + index += 1 + + wx.PostEvent(self, JetStatusEvent(JetDefs.PST_UPD_LOCATION, status.location)) + + + SafeJetShutdown(self.playerLock, self.jet) + + self.queueSegs = [] + + CleanupTempJetFile(jet_file) + + wx.PostEvent(self, JetStatusEvent(JetDefs.PST_DONE, None)) + + def OnJetStatusUpdate(self, evt): + """ These are screen updates called for from within the thread. Communication + is via a postevent call. + """ + if evt.mode == JetDefs.PST_PLAY: + segName = getColumnText(self.segList, evt.data, 0) + self.LoadEventsForSeg(segName) + self.log.SetValue(segName) + ClearRowSelections(self.segList) + SetRowSelection(self.segList, evt.data, True) + elif evt.mode == JetDefs.PST_UPD_LOCATION: + self.graph.UpdateLocation(evt.data) + elif evt.mode == 3: + self.graph.UpdateLocation(0) + ClearRowSelections(self.segList) + self.eventList.DeleteAllItems() + self.SetKeepPlayingFlag(False) + self.btnPlay.SetLabel(JetDefs.BUT_PLAY) + self.btnPause.SetLabel(JetDefs.BUT_PAUSE) + + def OnPause(self, evt): + """ Pauses the playback """ + if self.jet is None: + return + if not self.paused: + self.jet.Pause() + self.paused = True + self.btnPause.SetLabel(JetDefs.BUT_RESUME) + else: + self.jet.Play() + self.paused = False + self.btnPause.SetLabel(JetDefs.BUT_PAUSE) + + def isDirty(self): + if len(self.UndoStack) == 0 and len(self.RedoStack) == 0: + return False + else: + return True + + def OnSetGraphOptions(self, evt): + """ Sets graph options """ + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.chkGraphLabels.GetValue()) + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.chkGraphClips.GetValue()) + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.chkGraphAppEvts.GetValue()) + self.graph.LoadSegment(self.jet_file.GetSegment(self.currentSegmentName), showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def OnEventSortOrderChanged(self): + """ Called when sort order has changed """ + IniSetValue(self.currentJetConfigFile, JetDefs.INI_EVENTSORT, JetDefs.INI_EVENTSORT_0, self.eventList.GetSortState()[0]) + IniSetValue(self.currentJetConfigFile, JetDefs.INI_EVENTSORT, JetDefs.INI_EVENTSORT_1, self.eventList.GetSortState()[1]) + self.LoadEventsForSeg(self.currentSegmentName) + self.graph.LoadSegment(self.jet_file.GetSegment(self.currentSegmentName), showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def EventSortCmp(self, a, b): + """ Sorts based on selected sort order """ + if self.eventlistSort[0] == 0 or self.eventlistSort[0] == 1: + if self.eventlistSort[1] == 1: + return cmp(a[0].upper(), b[0].upper()) + else: + return cmp(b[0].upper(), a[0].upper()) + elif self.eventlistSort[0] == 2 or self.eventlistSort[0] == 3: + if self.eventlistSort[1] == 1: + return cmp(MbtVal(a[0]), MbtVal(b[0])) + else: + return cmp(MbtVal(b[0]), MbtVal(a[0])) + else: + return cmp(a[0], b[0]) + + def EventSort2(self, seq, attr): + """ Does Sorting """ + intermed = map(None, map(getattr, seq, (attr,)*len(seq)), xrange(len(seq)), seq) + intermed.sort(self.EventSortCmp) + return map(operator.getitem, intermed, (-1,) * len(intermed)) + + def EventSort(self, lst, attr): + """ Does Sorting """ + lst[:] = self.EventSort2(lst, attr) + + def OnSegSortOrderChanged(self): + """ Called when sort order has changed """ + IniSetValue(self.currentJetConfigFile, JetDefs.INI_SEGSORT, JetDefs.INI_SEGSORT_0, self.segList.GetSortState()[0]) + IniSetValue(self.currentJetConfigFile, JetDefs.INI_SEGSORT, JetDefs.INI_SEGSORT_1, self.segList.GetSortState()[1]) + self.LoadEventsForSeg(self.currentSegmentName) + self.graph.LoadSegment(self.jet_file.GetSegment(self.currentSegmentName), showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def SegSortCmp(self, a, b): + """ Sorts based on selected sort order """ + if self.seglistSort[0] == 0: + if self.seglistSort[1] == 1: + return cmp(a[0].upper(), b[0].upper()) + else: + return cmp(b[0].upper(), a[0].upper()) + elif self.seglistSort[0] == 1 or self.seglistSort[0] == 2: + if self.seglistSort[1] == 1: + return cmp(FileJustName(a[0]).upper(), FileJustName(b[0]).upper()) + else: + return cmp(FileJustName(b[0]).upper(), FileJustName(a[0]).upper()) + elif self.seglistSort[0] == 3 or self.seglistSort[0] == 4: + if self.seglistSort[1] == 1: + return cmp(MbtVal(a[0]), MbtVal(b[0])) + else: + return cmp(MbtVal(b[0]), MbtVal(a[0])) + else: + return cmp(a[0], b[0]) + + def SegSort2(self, seq, attr): + """ Does Sorting """ + intermed = map(None, map(getattr, seq, (attr,)*len(seq)), xrange(len(seq)), seq) + intermed.sort(self.SegSortCmp) + return map(operator.getitem, intermed, (-1,) * len(intermed)) + + def SegSort(self, lst, attr): + """ Does Sorting """ + lst[:] = self.SegSort2(lst, attr) + +if __name__ == '__main__': + """ Sets the logging level, then calls the open dialog box before initializing main window""" + + logLevel = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_LOGGING, JetDefs.INI_LOGGING) + if logLevel == 'DEBUG': + logging.basicConfig(level=logging.DEBUG, format='%(funcName)s[%(lineno)d]: %(message)s') + elif logLevel == 'INFO': + logging.basicConfig(level=logging.INFO, format='%(funcName)s[%(lineno)d]: %(message)s') + elif logLevel == 'ERROR': + logging.basicConfig(level=logging.ERROR, format='%(funcName)s[%(lineno)d]: %(message)s') + elif logLevel == 'WARNING': + logging.basicConfig(level=logging.WARNING, format='%(funcName)s[%(lineno)d]: %(message)s') + else: + install_release_loggers() + + app = wx.App(None) + + if not os.path.isdir(JetDefs.TEMP_JET_DIR): + os.mkdir(JetDefs.TEMP_JET_DIR) + + openFile = "" + dlg = JetOpen() + result = dlg.ShowModal() + if result == wx.ID_CANCEL: + dlg.Destroy() + elif result == JetDefs.ID_JET_IMPORT: + dlg.Destroy() + + au = JetCreator(None, -1, "", importFlag=True) + app.MainLoop() + else: + openFile = dlg.fileName + dlg.Destroy() + + au = JetCreator(None, -1, openFile) + app.MainLoop() + diff --git a/jet_tools/JetCreator/JetCreatorhlp.dat b/jet_tools/JetCreator/JetCreatorhlp.dat new file mode 100755 index 0000000..4a08b07 --- /dev/null +++ b/jet_tools/JetCreator/JetCreatorhlp.dat @@ -0,0 +1,119 @@ +[EVTDLG_CTRLS] +labels = +play = Plays the segment with associated event attributes. To trigger the event, click the event in the timeline. +midi file = Displays the MIDI file associated with the segment. This is pulled in from the segment attributes. +quantize = Displays the quantization associated with the segment. This is pulled in from the segment attributes. +cancel = +event type = Selects the type of trigger event. +track mutes = Displays the track mute assignments associated with the segment. This is pulled in from the segment attributes. +event = +pause = +graph = +trigger = +replicate = +starting m/b/t = Sets the starting measure, beat, and tick for the event. +channel = Selects the MIDI channel for the event. +eventid = Sets the ID of the event. Each event must have a unique ID. +app events = +repeat = Displays the repeat count of the segment. This is pulled in from the segment attributes. +ok = +track = Selects the MIDI track (not the channel) for the event. +transpose = Displays the transpose value of the segment. This is pulled in from the segment attributes. +un-mute = +segment = Displays the name of the segment. This is pulled in from the segment attributes. +event name = Identifies the name of the event. +segment name = Identifies the name of the segment. This is pulled in from the segment attributes. +trigger clips = +length = +ending m/b/t = Sets the ending measure, beat, and tick for the segment. +dls file = Displays the DLS file associated with the segment. This is pulled in from the segment attributes. + +[MOVE_CTRLS] +ok = +move = +starting m/b/t = +cancel = +preview = +increment m/b/t = + +[MAIN_DIALOG_CTRLS] +seglist = The list of segments display here. You may add, revise, or delete segments using the buttons at the left. You may also double click to edit a segment. +eventlist = The list of events for the currently selected segment display here. Double click to edit, or use the buttons at the left to add, revise, or delete and event. + +[SEGDLG_CTRLS] +labels = +app events = +midi file = Selects the source MIDI file from which the segment will be created. +quantize = Selects the quantization amount for the segment. Use 0 for no quantization. +display empty tracks = +play segment = +cancel = Cancels any changes and exits the segment window. +track mutes = Checking a mute box will mute the associated track. You should mute a track if you intent to add a trigger event for that track. +pause = +graph = +replicate = +starting m/b/t = Sets the starting measure, beat, and tick for the segment. +play midi file = +play = Plays the segment. +repeat = Sets the number of repeats for the segment. +graph type = +transpose = Sets the transposition value for the segment, in semitones (half-steps). +audition = Click this button to audition the JET file. This is an interactive playback mode that simulates a how the JET file will work in production. +ok = Confirms segment attributes and closes segment window. +segment = +segment name = Identifies the name of the segment. +trigger clips = +length = +ending m/b/t = Sets the ending measure, beat, and tick for the segment. +dls file = Selects the source DLS file, if any, for the given segment. + +[PREFERENCES_CTRLS] +ok = +preferences = +copyright = The copyright in this field will default on new JET files. It can be overridden in the Properties setting for a specific JET file. +chase controllers = This option will force JET to chase controllers up to the beginning of a given segment. This help keep a segment in sync with its parent MIDI file. +cancel = +delete empty tracks = This option will tell JET to delete any empty tracks from the output file. + +[REPLICATE_CTRLS] +ok = +replace existing items matching prefix = +replicate = +number = +name prefix = +starting m/b/t = +cancel = +preview = +increment m/b/t = + +[JET_PROPERTIES_CTRLS] +omit empty tracks = +jet project properties = +ok = +copyright = +chase controllers = If on, MIDI CC messages and program changes will be read from the beginning of the segment when playing or triggering events in the middle of the segment. This should almost always be checked. +jet file = +export = Export will collect all the source MIDI, DLS and JET files into a single .ZIP file. +cancel = +delete empty tracks = Selecting this will delete any empty MIDI tracks. + +[AUDITION_CTRLS] +seglist = The list of segments in the JET file display here. Double click on a segment to add it to the play queue, or use the buttons below. +tracklist = The tracks in the segment currently playing segment display here. Tracks which are muted are checked. Click on a track to toggle its mute status. +queuelist = The currently queued segments display here. Each segment displays its current run status. You may modify the playback state with the buttons below. +graph = The currently playing segment is displayed graphically here. You may trigger clips by clicking within their boundaries on the graph. + +[EXPORT_CTRLS] +omit empty tracks = Selecting this will delete any empty MIDI tracks. +copyright = +chase controllers = If on, MIDI CC messages and program changes will be read from the beginning of the segment when playing or triggering events in the middle of the segment. This should almost always be checked. +jet file = +export = Export will collect all the source MIDI, DLS and JET files into a single .ZIP file. +cancel = + +[PREFERENCES] +cancel = +ok = +preferences = +use project directories = + diff --git a/jet_tools/JetCreator/JetCtrls.py b/jet_tools/JetCreator/JetCtrls.py new file mode 100755 index 0000000..9b3ca5d --- /dev/null +++ b/jet_tools/JetCreator/JetCtrls.py @@ -0,0 +1,567 @@ +""" + File: + JetCtrls.py + + Contents and purpose: + Auditions a jet file to simulate interactive music functions + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import wx +import sys + +from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin, ColumnSorterMixin +from JetUtils import * +from JetDefs import * + +class JetSpin(wx.SpinCtrl): + """ Spin control """ + def __init__(self, parent, id=-1,value=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.SP_ARROW_KEYS,min=0,max=100,initial=0): + wx.SpinCtrl.__init__(self, parent, id=id,value=value,pos=(pos[0]-MacOffset(),pos[1]),size=size,style=style,min=min,max=max,initial=initial) + + def SetValue(self, val): + try: + if type(val).__name__=='str': + wx.SpinCtrl.SetValue(self, int(val)) + else: + wx.SpinCtrl.SetValue(self, val) + except: + wx.SpinCtrl.SetValue(self, 0) + +class JetSpinOneBased(JetSpin): + """ Spin control that's one based """ + def __init__(self, parent, id=-1,value=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.SP_ARROW_KEYS,min=0,max=100,initial=0): + wx.SpinCtrl.__init__(self, parent, id=id,value=value,pos=(pos[0]-MacOffset(),pos[1]),size=size,style=style,min=min,max=max,initial=initial) + + def SetValue(self, val): + try: + if type(val).__name__=='str': + wx.SpinCtrl.SetValue(self, int(val) + 1) + else: + wx.SpinCtrl.SetValue(self, val + 1) + except: + wx.SpinCtrl.SetValue(self, 1) + + def GetValue(self): + val = wx.SpinCtrl.GetValue(self) + val = val - 1 + return val + +class JetCheckBox(wx.CheckBox): + """ Checkbox control """ + def __init__(self, parent, id=-1,label=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize): + wx.CheckBox.__init__(self, parent, id=id, label=label, pos=pos, size=size) + + def SetValue(self, val): + try: + if type(val).__name__=='str': + if val == 'True': + val = True + else: + val = False + wx.CheckBox.SetValue(self, val) + else: + wx.CheckBox.SetValue(self, val) + except: + wx.CheckBox.SetValue(self, False) + +class JetRadioButton(wx.RadioButton): + """ Radio button control """ + def __init__(self, parent, id=-1,label=wx.EmptyString,pos=wx.DefaultPosition,size=wx.DefaultSize): + wx.RadioButton.__init__(self, parent, id=id, label=label, pos=pos, size=size) + + def SetValue(self, val): + try: + if type(val).__name__=='str': + if val == 'True': + val = True + else: + val = False + wx.RadioButton.SetValue(self, val) + else: + wx.RadioButton.SetValue(self, val) + except: + wx.RadioButton.SetValue(self, False) + +class JetListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin, ColumnSorterMixin): + """ List control """ + def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize): + wx.ListCtrl.__init__(self, parent, id, pos=pos, size=size, style=wx.LC_REPORT | wx.SUNKEN_BORDER) + ListCtrlAutoWidthMixin.__init__(self) + self.iCol = 0 + self.iWidth = 0 + self.OnSortOrderChangedAlert = None + self.iInitialized = False + + def AddCol(self, title, width): + self.InsertColumn(self.iCol, title) + if width > 0: + self.SetColumnWidth(self.iCol, width) + else: + width = self.GetColumnWidth(self.iCol) + self.iCol += 1 + self.iWidth = self.iWidth + width + self.SetSize((self.iWidth + 10, -1)) + + def AddRows(self, values): + for value in values: + iCol = 0 + for row in value: + if iCol == 0: + index = self.InsertStringItem(sys.maxint, row) + else: + self.SetStringItem(index, iCol, row) + iCol = iCol + 1 + + # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py + def GetListCtrl(self): + return self + + def InitSorting(self, cols): + if not self.iInitialized: + ColumnSorterMixin.__init__(self, cols) + self.iInitialized = True + + def OnSortOrderChanged(self): + if self.OnSortOrderChangedAlert is not None: + self.OnSortOrderChangedAlert() + + def __OnColClick(self, evt): + oldCol = self._col + self._col = col = evt.GetColumn() + self._colSortFlag[col] = int(not self._colSortFlag[col]) + self.OnSortOrderChanged() + +class JetCheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin, ColumnSorterMixin): + """ List control with checkboxes on each line """ + def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.LC_REPORT | wx.SUNKEN_BORDER): + wx.ListCtrl.__init__(self, parent, id, pos=pos, size=size, style=style) + CheckListCtrlMixin.__init__(self) + ListCtrlAutoWidthMixin.__init__(self) + + self.iCol = 0 + self.iWidth = 0 + self.OnSortOrderChangedAlert = None + self.iInitialized = False + + def AddCol(self, title, width): + self.InsertColumn(self.iCol, title) + if width > 0: + self.SetColumnWidth(self.iCol, width) + else: + width = self.GetColumnWidth(self.iCol) + self.iCol += 1 + self.iWidth = self.iWidth + width + self.SetSize((self.iWidth + 10, -1)) + + def OnCheckItem(self, index, flag): + if hasattr(self, 'BindCheckBoxFct'): + self.BindCheckBoxFct(index, flag) + + def BindCheckBox(self, fct): + self.BindCheckBoxFct = fct + + def AddRows(self, values): + for value in values: + iCol = 0 + for row in value: + if iCol == 0: + index = self.InsertStringItem(sys.maxint, row) + else: + self.SetStringItem(index, iCol, row) + iCol = iCol + 1 + + # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py + def GetListCtrl(self): + return self + + def InitSorting(self, cols): + if not self.iInitialized: + ColumnSorterMixin.__init__(self, cols) + self.iInitialized = True + + def OnSortOrderChanged(self): + if self.OnSortOrderChangedAlert is not None: + self.OnSortOrderChangedAlert() + + def __OnColClick(self, evt): + oldCol = self._col + self._col = col = evt.GetColumn() + self._colSortFlag[col] = int(not self._colSortFlag[col]) + self.OnSortOrderChanged() + +class JetTrackCtrl(JetCheckListCtrl): + """ List control specifically designed to show tracks in midi file """ + def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.LC_REPORT | wx.SUNKEN_BORDER): + wx.ListCtrl.__init__(self, parent, id, pos=pos, size=size, style=style) + CheckListCtrlMixin.__init__(self) + ListCtrlAutoWidthMixin.__init__(self) + + self.iCol = 0 + self.iWidth = 0 + self.muteFlags = 0 + + def SetValue(self, muteFlags): + self.muteFlags = muteFlags + + def GetValue(self): + return self.muteFlags + + def CheckTracks(self, muteFlags): + num = self.GetItemCount() + for iRow in range(num): + track_num = self.GetTrackNumber(iRow) + self.CheckItem(iRow, GetMute(track_num, muteFlags)) + + def AddTrackRow(self, track, loadEmpty=False): + if loadEmpty or not track.empty: + index = self.InsertStringItem(sys.maxint, str(track.track)) + self.SetStringItem(index, 1, str(track.channel)) + self.SetStringItem(index, 2, str(track.name)) + + def GetTrackNumber(self, index): + return getColumnValue(self, index, 0) + +class JetFileCombo(): + """ Combo box with file open button """ + def __init__(self, parent, pos=(0,0), size=(200,-1), title='Open File', spec='*.*', id=-1): + self.spec = spec + self.title = title + self.EventFire = False + BUTWIDTH = 20 + BORDER = 5 + w = size[0] - (BUTWIDTH + BORDER) + col = pos[0] + w + BORDER + + self.cmb = wx.ComboBox(parent, id, "", pos=(pos[0]-MacOffset(),pos[1]), size=(w, -1), style=wx.CB_DROPDOWN) + self.btn = wx.Button(parent, -1, "...", pos=(col, pos[1]+MacOffset()), size=(BUTWIDTH,self.cmb.GetSize()[1])) + self.btn.Bind(wx.EVT_BUTTON, self.OnBrowse, self.btn) + + def OnBrowse(self, event): + os = __import__('os') + defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, 'str', str(os.getcwd())) + if OsWindows(): + defDir = defDir.replace('/','\\') + else: + defDir = defDir.replace('\\', '/') + + dlg = wx.FileDialog(None, self.title, defDir, '', self.spec, wx.FD_OPEN) + ret = dlg.ShowModal() + if ret == wx.ID_OK: + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, str(FileJustPath(dlg.GetPath()))) + val = dlg.GetPath() + + self.Append(val) + self.cmb.SetValue(val) + + if self.EventFire: + SendEvent(self.cmb, wx.EVT_COMBOBOX.evtType[0]) + dlg.Destroy() + + def SetEventFire(self, fire): + self.EventFire = fire + + def GetValue(self): + return StrNoneChk(self.cmb.GetValue()) + + def SetValue(self, val): + try: + self.cmb.SetValue(val) + except: + pass + + def Append(self, val): + try: + self.cmb.Append(val) + except: + pass + + def SetFocus(self): + self.cmb.SetFocus() + + def SetListValues(self, list): + self.cmb.AppendItems(list) + + def Enable(self, enable): + self.cmb.Enable(enable) + self.btn.Enable(enable) + + def SetHelpText(self, Lbl): + self.cmb.SetHelpText(Lbl) + self.btn.SetHelpText(Lbl) + +class JetFileText(): + """ Capture a filename with a button to browse for a file """ + def __init__(self, parent, pos=(0,0), size=(200,-1), title='Open File', spec='*.*', id=-1): + self.spec = spec + self.title = title + BUTWIDTH = 20 + BORDER = 5 + w = size[0] - (BUTWIDTH + BORDER) + col = pos[0] + w + BORDER + + self.txt = wx.TextCtrl(parent, id, "", pos=(pos[0]-MacOffset(),pos[1]), size=(w, -1)) + self.btn = wx.Button(parent, -1, "...", pos=(col, pos[1]), size=(BUTWIDTH,self.txt.GetSize()[1])) + self.btn.Bind(wx.EVT_BUTTON, self.OnBrowse, self.btn) + + def OnBrowse(self, event): + os = __import__('os') + defDir = IniGetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, 'str', str(os.getcwd())) + if OsWindows(): + defDir = defDir.replace('/','\\') + else: + defDir = defDir.replace('\\', '/') + + dlg = wx.FileDialog(None, self.title, defDir, '', self.spec, wx.FD_OPEN) + ret = dlg.ShowModal() + if ret == wx.ID_OK: + IniSetValue(JetDefs.JETCREATOR_INI, JetDefs.INI_DEFAULTDIRS, self.spec, str(FileJustPath(dlg.GetPath()))) + val = dlg.GetPath() + self.txt.SetValue(val) + dlg.Destroy() + + def GetValue(self): + return StrNoneChk(self.txt.GetValue()) + + def SetValue(self, val): + try: + self.txt.SetValue(val) + except: + pass + + def Append(self, val): + try: + self.txt.Append(val) + except: + pass + + def SetFocus(self): + self.txt.SetFocus() + + def Enable(self, enable): + self.txt.Enable(enable) + self.btn.Enable(enable) + + def SetHelpText(self, Lbl): + self.txt.SetHelpText(Lbl) + self.btn.SetHelpText(Lbl) + +def YesNo(title, question, default): + """ Simple Yes/No question box """ + dlg = wx.MessageDialog(None, question, title, wx.YES_NO | wx.ICON_QUESTION) + if dlg.ShowModal() == wx.ID_YES: + result = True + else: + result = False + dlg.Destroy() + return result + +def YesNoCancel(title, question, default): + """ Simple Yes/No question box """ + dlg = wx.MessageDialog(None, question, title, wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION) + result = dlg.ShowModal() + dlg.Destroy() + return result + +def ErrorMsg(title, message): + """ Dipslay an error message """ + dlg = wx.MessageDialog(None, message, title, wx.ICON_ERROR) + dlg.ShowModal() + dlg.Destroy() + +def InfoMsg(title, message): + """ Displays an informational message """ + dlg = wx.MessageDialog(None, message, title, wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + +class TimeCtrl(wx.Frame): + """ Combination of controls to capture measure, beat, tick times """ + def __init__(self, parent, pos=(0,0), minimums=(1,1,0), maximums=(999,4,480), value=JetDefs.MBT_DEFAULT, ctlName=''): + wx.Frame.__init__(self, parent, -1) + + self.ChangeCallbackFct = None + self.ctlName = ctlName + self.mx = maximums + self.mn = minimums + self.maxTicks = 0 + self.iCtrl = 0 + p1 = pos[0] + top = pos[1] + MacOffset() + w1 = 30 + self.time = (wx.TextCtrl(parent, -1, str(value[0]), pos=(p1, top), size=(w1, -1), style=wx.TE_NOHIDESEL), + wx.TextCtrl(parent, -1, str(value[1]), pos=(p1 + (w1 + 3), top), size=(w1, -1), style=wx.TE_NOHIDESEL), + wx.TextCtrl(parent, -1, str(value[2]), pos=(p1 + (w1 + 3) *2, top), size=(w1, -1), style=wx.TE_NOHIDESEL), + ) + h = self.time[2].GetSize().height + w = self.time[2].GetSize().width + self.time[2].GetPosition().x + 8 + + self.spin = wx.SpinButton(parent, -1, (w, top), (h*2/3, h), wx.SP_VERTICAL) + self.spin.SetValue(1) + self.spin.SetRange(-999,999) + + self.spin.Bind(wx.EVT_SPIN_UP, self.OnSpinUp, self.spin) + self.spin.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown, self.spin) + + self.time[0].Bind(wx.EVT_SET_FOCUS, self.OnFocusMeasure, self.time[0] ) + self.time[1].Bind(wx.EVT_SET_FOCUS, self.OnFocusBeat, self.time[1] ) + self.time[2].Bind(wx.EVT_SET_FOCUS, self.OnFocusTick, self.time[2] ) + + self.time[0].Bind(wx.EVT_KILL_FOCUS, self.OnChangeVal, self.time[0] ) + self.time[1].Bind(wx.EVT_KILL_FOCUS, self.OnChangeVal, self.time[1] ) + self.time[2].Bind(wx.EVT_KILL_FOCUS, self.OnChangeVal, self.time[2] ) + + self.SetValue(value) + + def UnBindKillFocus(self): + self.time[0].Unbind(wx.EVT_KILL_FOCUS, self.time[0]) + self.time[1].Unbind(wx.EVT_KILL_FOCUS, self.time[1]) + self.time[2].Unbind(wx.EVT_KILL_FOCUS, self.time[2]) + + def SetChangeCallbackFct(self, ChangeCallbackFct): + self.ChangeCallbackFct = ChangeCallbackFct + + def OnChangeVal(self, event=None): + if not OsWindows(): + self.time[self.iCtrl].SetSelection(-1,-1) + if int(self.time[self.iCtrl].GetValue()) > self.mx[self.iCtrl]: + self.time[self.iCtrl].SetValue(str(self.mx[self.iCtrl])) + if int(self.time[self.iCtrl].GetValue()) < self.mn[self.iCtrl]: + self.time[self.iCtrl].SetValue(str(self.mn[self.iCtrl])) + if self.ChangeCallbackFct is not None: + self.ChangeCallbackFct() + if event is not None: + event.Skip() + + def OnSpinUp(self, event): + if int(self.time[self.iCtrl].GetValue()) < self.mx[self.iCtrl]: + self.time[self.iCtrl].SetValue(str(int(self.time[self.iCtrl].GetValue()) + 1)) + self.OnChangeVal() + + def OnSpinDown(self, event): + if int(self.time[self.iCtrl].GetValue()) > self.mn[self.iCtrl]: + self.time[self.iCtrl].SetValue(str(int(self.time[self.iCtrl].GetValue()) - 1)) + self.OnChangeVal() + + def OnFocusMeasure(self, event): + self.iCtrl = 0 + + def OnFocusBeat(self, event): + self.iCtrl = 1 + + def OnFocusTick(self, event): + self.iCtrl = 2 + + def SetValue(self, mbt): + try: + if type(mbt).__name__=='str' or type(mbt).__name__=='unicode': + mbt = ConvertStrTimeToTuple(mbt) + mbt = mbtFct(mbt, 1) + self.time[0].SetValue(str(mbt[0])) + self.time[1].SetValue(str(mbt[1])) + self.time[2].SetValue(str(mbt[2])) + except: + self.time[0].SetValue(str(self.mn[0])) + self.time[1].SetValue(str(self.mn[1])) + self.time[2].SetValue(str(self.mn[2])) + if not OsWindows(): + self.time[0].SetSelection(-1,-1) + self.time[1].SetSelection(-1,-1) + self.time[2].SetSelection(-1,-1) + + def GetValue(self, typ='str'): + try: + if typ == 'str': + ret = "%d:%d:%d" % (int(self.time[0].GetValue()), int(self.time[1].GetValue()), int(self.time[2].GetValue())) + else: + ret = (int(self.time[0].GetValue()), int(self.time[1].GetValue()), int(self.time[2].GetValue())) + except: + ret = self.minimums + return mbtFct(ret, -1) + + def Enable(self, enable): + self.time[0].Enable(enable) + self.time[1].Enable(enable) + self.time[2].Enable(enable) + self.spin.Enable(enable) + + def SetFocus(self): + self.time[0].SetFocus() + + def SetMaxMbt(self, m, b, t): + self.mx = (m,b,t) + + def GetMaxMbt(self): + return "%d:%d:%d" % self.mx + + def SetMinMbt(self, m, b, t): + self.mn = (m,b,t) + + def SetMaxTicks(self, maxTicks): + self.maxTicks = maxTicks + + def GetMaxTicks(self): + return self.maxTicks + + def SetHelpText(self, Lbl): + self.spin.SetHelpText(Lbl) + self.time[0].SetHelpText(Lbl) + self.time[1].SetHelpText(Lbl) + self.time[2].SetHelpText(Lbl) + + def GetMeasure(self): + return int(self.time[0].GetValue()) + + def GetBeat(self): + return int(self.time[1].GetValue()) + + def GetTick(self): + return int(self.time[2].GetValue()) + +if __name__ == '__main__': + """ Test code for controls """ + class TestFrame(wx.Frame): + def __init__(self, parent, id, title): + wx.Frame.__init__(self, parent, id, title, size=(350, 220)) + + panel = wx.Panel(self, -1) + + self.tc = TimeCtrl(panel, pos=(30, 20), maximums=(25, 4, 120), value=(2, 3, 4)) + #tc.Enable(True) + #tc.SetValue((2,3,4)) + #tc.SetValue("1:2:3") + #print(tc.GetValue()) + + js = JetSpin(panel, -1, pos=(30, 100)) + js.SetValue("1") + #js.SetValue(1) + + #fl = JetFileCombo(panel) + + wx.EVT_CLOSE(self, self.OnClose) + + self.Centre() + self.Show(True) + + def OnClose(self, event): + self.tc.UnBindKillFocus() + self.Destroy() + + app = wx.App(None) + TestFrame(None, -1, 'TestFrame') + app.MainLoop() + + diff --git a/jet_tools/JetCreator/JetDebug.py b/jet_tools/JetCreator/JetDebug.py new file mode 100755 index 0000000..dcff7a6 --- /dev/null +++ b/jet_tools/JetCreator/JetDebug.py @@ -0,0 +1,71 @@ +""" + File: + JetDebug.py + + Contents and purpose: + Dumps info from various jet file structures for debugging + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from JetUtils import * + +def DumpEvent(evt): + print("event_name: %s" % evt.event_name) + print("event_type: %s" % evt.event_type) + print("event_id: %d" % evt.event_id) + print("track_num: %d" % evt.track_num) + print("channel_num: %d" % evt.channel_num) + print("event_start: %s" % evt.event_start) + print("event_end: %s" % evt.event_end) + +def DumpQueueSeg(queueSeg): + print("name: %s" % queueSeg.name) + print("userID: %d" % queueSeg.userID) + print("seg_num: %d" % queueSeg.seg_num) + print("dls_num: %d" % queueSeg.dls_num) + print("repeat: %d" % queueSeg.repeat) + print("transpose: %d" % queueSeg.transpose) + print("mute_flags: %d" % queueSeg.mute_flags) + +def DumpSegments1(segments): + for segment in segments: + DumpSegment(segment) + +def DumpSegment(segment): + print("userID: %d" % segment.userID) + print("name: %s" % segment.name) + print("seg_num: %d" % segment.seg_num) + print("dls_num: %d" % segment.dls_num) + print("repeat: %d" % segment.repeat) + print("transpose: %d" % segment.transpose) + print("mute_flags: %d" % segment.mute_flags) + +def DumpSegments(segments): + for segment in segments: + DumpSegment1(segment) + +def DumpSegment1(segment): + print(segment.segname) + print(segment.filename) + print(segment.start) + print(segment.end) + print(segment.length) + print(segment.output) + print(segment.quantize) + print(segment.dlsfile) + print(segment.dump_file) + + diff --git a/jet_tools/JetCreator/JetDefs.py b/jet_tools/JetCreator/JetDefs.py new file mode 100755 index 0000000..b1e73cd --- /dev/null +++ b/jet_tools/JetCreator/JetDefs.py @@ -0,0 +1,560 @@ +""" + File: + JetDefs.py + + Contents and purpose: + Holds definitions used throughout JetCreator + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import wx + +class JetDefs(): + def CreateHelpIniFile(self): + """ Used to create the help data file for context sensitive help """ + self.CreateHelpIniForDialog("SEGDLG_CTRLS") + self.CreateHelpIniForDialog("EVTDLG_CTRLS") + self.CreateHelpIniForDialog("PREFERENCES_CTRLS") + self.CreateHelpIniForDialog("JET_PROPERTIES_CTRLS") + self.CreateHelpIniForDialog("REPLICATE_CTRLS") + self.CreateHelpIniForDialog("MOVE_CTRLS") + + def CreateHelpIniForDialog(self, dlgName): + """ Used to create the help data file for context sensitive help """ + print("\n" + dlgName) + lst = getattr(self, dlgName) + u = __import__('JetUtils') + for ctrl in lst: + fld = ctrl[0] + if fld[0:2] != "fr": + if u.IniGetValue(self.JETCREATOR_HLP, dlgName, fld) == "": + u.IniSetValue(self.JETCREATOR_HLP, dlgName, fld, "") + print(fld) + + DEFAULT_MUTE_SYNC = False + + TEMP_JET_DIR = "./Tmp/" + TEMP_JET_CONFIG_FILE = "./Tmp/Temp.jtc" + UNTITLED_FILE = "Untitled.jtc" + JETCREATOR_INI = "JetCreator.ini" + JETMIDIFILES_INI = "JetMidiFiles.ini" + JETCREATOR_HLP = "JetCreatorhlp.dat" + + #Postevent message defines + PST_UPD_LOCATION = 1 + PST_PLAY = 2 + PST_DONE = 3 + PST_PAUSE = 4 + PST_RESUME = 5 + PST_MIDI_INFO = 6 + + #Dialog titles and prompts + DLG_JETOPEN = "Open Jet File" + DLG_PREFERENCES = "Preferences" + DLG_ABOUT = "About" + DLG_PROPERTIES = "Jet Project Properties" + DLG_AUDITION = "Audition Jet File" + DLG_REPLICATE = "Replicate Event" + DLG_MOVE = "Move Events" + MAIN_TITLEPREFIX = 'Jet Creator - ' + MAIN_DLG_CTRLS = 'JET_CREATOR' + MAIN_SEGLIST = 'segList' + MAIN_EVENTLIST = 'eventList' + MAIN_ADDSEGTITLE = "Add Segments" + MAIN_REVSEGTITLE = "Revise Segments" + MAIN_ADDEVENTTITLE = "Add Event" + MAIN_REVEVENTTITLE = "Revise Event" + MAIN_CONFIRM = "Confirm Deletion" + MAIN_CONFIRM_SEG_DLT = "\n\nOkay to delete segment(s)?" + MAIN_CONRIRM_EVT_DLT = "\n\nOkay to delete event(s)?" + MAIN_PLAYSEG = "Play Segments" + MAIN_PLAYSEGMSG = "Queue one or more segments by checking them in the list, then play." + MAIN_HELPTITLE = "Jet Creator Help" + MAIN_HELPFILE = "JET Creator User Manual.htm" + MAIN_HELPGUIDELINESTITLE = "Jet Authoring Guidelines" + MAIN_HELPGUIDELINESFILE = "JET Authoring Guidelines.htm" + MAIN_IMPORTTITLE = "Import Project" + MAIN_IMPORTMSG = "Okay to import\n\n%s\n\ninto\n\n%s?" + MAIN_SAVEBEFOREEXIT = "Save project before exiting?" + MAIN_JETCREATOR = "Jet Creator" + + #Audition window defines + AUDITION_CTRLS = 'AUDITION_CTRLS' + AUDITION_SEGLIST = 'segList' + AUDITION_QUEUELIST = 'queueList' + AUDITION_TRACKLIST = 'trackList' + AUDITION_GRAPH = 'graph' + + PLAY_TRIGGERCLIP_MSG = 'Triggered Clip %d: %s' + + #Config file defines + RECENT_SECTION = "Recent" + DIR_SECTION = "Directories" + IMAGES_DIR = "ImagesDir" + INI_PREF_SECTION = "Preferences" + INI_PROJECT_DIRS = "chkProjectDir" + INI_LOGGING = "Logging" + INI_DEFAULTDIRS = "Directories" + INI_DISPEMPTYTRACKS = "DisplayEmptyTracks" + INI_EVENTSORT = "EventSort" + INI_EVENTSORT_0 = "EventSort0" + INI_EVENTSORT_1 = "EventSort1" + INI_SEGSORT = "SegSort" + INI_SEGSORT_0 = "SegSort0" + INI_SEGSORT_1 = "SegSort1" + + #Mbt defines + MBT_DEFAULT = (0,0,0) + MBT_MIN = 0 + MBT_ZEROSTR = "0:0:0" + + #File open dialog specs + APPLICATION_TITLE = "Jet Creator" + MIDI_FILE_SPEC = 'MIDI Files (*.mid)|*.mid|All Files (*.*)|*.*' + DLS_FILE_SPEC = 'DLS Files (*.dls)|*.dls|All Files (*.*)|*.*' + JTC_FILE_SPEC = 'Jet Content Files (*.jtc)|*.jtc|All Files (*.*)|*.*' + ARCHIVE_FILE_SPEC = 'Jet Archive Files (*.zip)|*.zip|All Files (*.*)|*.*' + OPEN_PROMPT = "Open Jet Creator File" + SAVE_PROMPT = "Save Jet Creator File" + EXPORT_ARCHIVE_PROMPT = "Save Jet Archive" + MUST_SAVE_FIRST = "You must save your JetCreator project before exporting it." + IMPORT_ARCHIVE_PROMPT = "Select the Jet Archive to import" + IMPORT_ARCHIVEDIR_PROMPT = "Choose a directory:\n\nYour imported project files will be placed there." + IMPORT_ARCHIVE_NO_JTC = "This does not appear to be a JetCreator archive file." + IMPORT_NOT_JET_ARCHIVE = "Not a recognized Jet Archive file." + + #Button texts + BUT_ADD = 'Add' + BUT_REVISE = 'Revise' + BUT_DELETE = 'Delete' + BUT_PLAY = 'Play' + BUT_STOP = 'Stop' + BUT_MOVE = 'Move' + BUT_QUEUEALL = 'Queue All' + BUT_DEQUEUEALL = 'Dequeue All' + BUT_UNMUTE = 'Un-Mute' + BUT_MUTE = 'Mute' + BUT_AUDITION = 'Audition' + BUT_QUEUE = 'Queue' + BUT_MUTEALL = 'Mute All' + BUT_MUTENONE = 'Mute None' + BUT_ORGMUTES = 'Original Mutes' + BUT_CANCELANDQUEUE = 'Cancel && Queue' + BUT_CANCELCURRENT = 'Next' + BUT_PAUSE = 'Pause' + BUT_RESUME = 'Resume' + BUT_PLAYSEG = 'Play Segment' + BUT_PLAYMIDI = 'Play MIDI File' + + #Grid defines + GRD_TRACK = "Track" + GRD_CHANNEL = "Channel" + GRD_NAME = "Name" + GRD_SEGMENTS = "Segments" + GRD_LENGTH = "Length" + GRD_QUEUE = "Queue" + GRD_STATUS = "Status" + + #Menu defines + MNU_ADD_SEG = "Add Segment" + MNU_UPDATE_SEG = "Revise Segment" + MNU_DELETE_SEG = "Delete Segment" + MNU_MOVE_SEG = "Move Segment(s)" + MNU_ADD_EVENT = "Add Event" + MNU_UPDATE_EVENT = "Revise Event" + MNU_DELETE_EVENT = "Delete Event" + MNU_MOVE_EVENT = "Move Events(s)" + MNU_UNDO = "Undo\tctrl+z" + MNU_REDO = "Redo\tctrl+y" + + HLP_QUANTIZE = "The quantize element is optional and defaults to 0 if omitted.\nThis value sets a window size in ticks for the breaks in\n a segment when notes are extracted from a larger file. \nSee the section on Quantization for further detail \non the operation of this parameter." + + #Status bar messages + SB_NEW = "New JET Creator file" + SB_OPEN = "Open JET Creator file" + SB_SAVE = "Save Jet Creator file and generate .JET output file" + SB_SAVEAS = "Save JET Creator file as another file" + SB_EXIT = "Exit the application" + SB_CUT = "Cuts the current segment or event to the clipboard" + SB_COPY = "Copies the current segment or event to the clipboard" + SB_PASTE = "Pastes the current segment or event from the clipboard" + SB_UNDO = "Undo the last segment or event edit." + SB_REDO = "Reverse the last segment or event undo edit." + SB_IMPORT_PROJ = "Imports a JetCreator project archive." + SB_EXPORT_PROJ = "Saves all project files to an archive." + + #Defines the menus + MENU_SPEC = (("&File", + ("&New", SB_NEW, 'OnJetNew', True), + ("&Open...", SB_OPEN, 'OnJetOpen', True), + ("&Save", SB_SAVE, 'OnJetSave', True), + ("Save As...", SB_SAVEAS, 'OnJetSaveAs', True), + ("", "", "", True), + ("Import Project...", SB_IMPORT_PROJ, "OnJetImportArchive", True), + ("Export Project...", SB_EXPORT_PROJ, "OnJetExportArchive", True), + ("Properties...", "Sets properties specific to this Jet project", 'OnJetProperties', True), + ("", "", "", True), + ("Exit", SB_EXIT, 'OnClose', True)), + ("&Edit", + (MNU_UNDO, "Undo", 'OnUndo', False), + (MNU_REDO, "Redo", 'OnRedo', False), + ("C&ut\tctrl+x", "Cut", 'OnCut', True), + ("&Copy\tctrl+c", "Copy", 'OnCopy', True), + ("&Paste\tctrl+v", "Paste", 'OnPaste', True)), + ("Jet", + ("Preferences", "Set user preferences including defaults for new project files.", 'OnPreferences', True)), + ("Segments", + (MNU_ADD_SEG, "Add a new segment to the segment list", 'OnSegmentAdd', True), + (MNU_UPDATE_SEG, "Revise the segment attributes", 'OnSegmentUpdate', False), + (MNU_DELETE_SEG, "Delete the segment from the segment list", 'OnSegmentDelete', False), + (MNU_MOVE_SEG, "Move one or more segments by incrementing or decrementing their time values", 'OnSegmentsMove', False)), + ("Events", + (MNU_ADD_EVENT, "Add a new event for the currently selected segment", 'OnEventAdd', False), + (MNU_UPDATE_EVENT, "Revise the current event's attributes", 'OnEventUpdate', False), + (MNU_DELETE_EVENT, "Delete the event from the event list for this segment", 'OnEventDelete', False), + (MNU_MOVE_EVENT, "Move one or more events by incrementing or decrementing their time values", 'OnEventsMove', False)), + ("Help", + ("JET Creator User Manual", "Get help on the JET Creator", "OnHelpJet", True), + ("JET Authoring Guidelines", "Guidelines helpful for JET content creation", "OnHelpJetGuidelines", True), + ("About", "About the JET Creator", "OnAbout", True)) + ) + + #Define the toolbar + TOOLBAR_SPEC = ( + ("-", "", "", ""), + ("New", "img_New", SB_NEW, "OnJetNew"), + ("Open", "img_Open", SB_OPEN, "OnJetOpen"), + ("Save", "img_Save", SB_SAVE, "OnJetSave"), + ("-", "", "", ""), + ("Cut", "img_Cut", SB_CUT, "OnCut"), + ("Copy", "img_Copy", SB_COPY, "OnCopy"), + ("Paste", "img_Paste", SB_PASTE, "OnPaste"), + ("-", "", "", ""), + ("Undo", "img_Undo", SB_UNDO, "OnUndo"), + ("Redo", "img_Redo", SB_REDO, "OnRedo"), + ) + + F_HLPBUT = "hlpButton" + F_OK = "btnOk" + F_CANCEL = "btnCancel" + F_MIDIFILE = "filecmbMidiFile" + F_DLSFILE = "filecmbDlsFile" + F_SEGNAME = "txtSegName" + F_START = "tmStart" + F_END = "tmEnd" + F_QUANTIZE = "spnQuantize" + F_REPEAT = "spnRepeat" + F_TRANSPOSE = "spnTranspose" + F_MUTEFLAGS = "grd2MuteFlags" + F_SYNCMUTE = "chkSync" + F_ETYPE = "cmbEventType" + F_ENAME = "txtEventName" + F_ESTART = "tmEventStart" + F_EEND = "tmEventEnd" + F_EID = "spnEventID" + F_ETRACK = "spnEventTrack" + F_ECHANNEL = "spn1EventChannel" + F_EEVENTID = "spnEventID" + F_EMUTEBUT = "btnMute" + F_ETRIGGERBUT = "btnTriggerClip" + F_GRAPH = "graphPlay" + F_PAUSE = "btnPause" + F_ADDSEG = "btnAddSeg" + F_UPDSEG = "btnUpdateSeg" + F_DELSEG = "btnDeleteSeg" + F_PLAY = "btnPlay" + F_PLAYMIDI = "btnPlayMidi" + F_EASPLAY = "btnEasPlay" + F_ADDCLIP = "btnAddEvent" + F_UPDCLIP = "btnUpdateEvent" + F_DELCLIP = "btnDeleteEvent" + F_EXPORT = "btnOkExport" + F_JETFILENAME = "filecmbJetFileName" + F_COPYRIGHT = "txtCopyright" + F_JFILE = "filetxtJetFileName" + F_JOPEN = "btnOpen" + F_JNEW = "btnNew" + F_JIMPORT = "btnImport" + F_JLIST = "lstRecent" + F_ERRGRID = "grdErrors" + F_CHASECONTROLLERS = "chkChaseControllers" + F_DELETEEMPTYTRACKS = "chkDeleteEmptyTracks" + F_OPTMIDI = "optMidiGraph" + F_OPTSEG = "optSegGraph" + F_RDOGRAPH = "rdoboxGraphType" + F_DISPEMPTYTRACKS = "chkDisplayEmptyTracks" + F_GRAPHLABELS = "chkGraphLabels" + F_GRAPHCLIPS = "chkGraphClips" + F_GRAPHAPPEVTS = "chkGraphAppEvts" + F_REPLICATE = "btnReplicate" + + GRAPH_LBLS = "Labels" + GRAPH_TRIGGER = "Trigger Clips" + GRAPH_APP = "App Events" + + #IDs for dialogs + ID_JET_OPEN = 0 + ID_JET_NEW = 1 + ID_JET_IMPORT = 2 + + #Event types + E_CLIP = 'TriggerClip' + E_EOS = 'End of Segment' + E_APP = 'App Controller' + + INTWIDTH = 70 + TIMEWIDTH = 70 + + #Definitions of fields in the edit frame + TM_WIDTH = 100 + TRACK_MIN = 1 + TRACK_MAX = 32 + EVENTID_MIN = 1 + EVENTID_MAX = 63 + APPCONTROLLERID_MIN = 80 + APPCONTROLLERID_MAX = 83 + #NEEDS TO DEFAULT TO RANGE OF BOTH POSSIBLE TYPES + DEFAULTID_MIN = 1 + DEFAULTID_MAX = 100 + + #Mins and maxs for dialog values + QUANTIZE_MIN = 0 + QUANTIZE_MAX = 9 + CHANNEL_MIN = 1 + CHANNEL_MAX = 16 + TRANSPOSE_MIN = -12 + TRANSPOSE_MAX = 12 + REPEAT_MIN = -1 + REPEAT_MAX = 100 + + #Standardize the columns + BUTSIZE = wx.DefaultSize + COLSIZE = 120 + COL1 = 30 + COL2 = COL1 + COLSIZE + COL3 = COL2 + COLSIZE + COL4 = COL3 + COLSIZE + COL5 = COL4 + COLSIZE + COL6 = COL5+ COLSIZE + COL7 = COL6 + COLSIZE + ROWSIZE = 50 + ROW1 = 40 + ROW2 = ROW1 + ROWSIZE + ROW3 = ROW2 + ROWSIZE + ROW4 = ROW3 + ROWSIZE + ROW5 = ROW4 + ROWSIZE + ROW6 = ROW5 + ROWSIZE + ROW7 = ROW6 + ROWSIZE + BUTOFF = 25 + BUTROW1 = 25 + FILEPATH_GRIDWIDTH = 120 + FILEPATH_WIDTH = 250 + + #Segment grid column definitions + SEGMENT_GRID = [('Segment Name', 200, F_SEGNAME), + ('MIDI File', FILEPATH_GRIDWIDTH, F_MIDIFILE), + ('DLS File', FILEPATH_GRIDWIDTH, F_DLSFILE), + ('Start', TIMEWIDTH, F_START), + ('End', TIMEWIDTH, F_END), + ('Quantize', 0, F_QUANTIZE), + ('Transpose', 0, F_TRANSPOSE), + ('Repeat', 0, F_REPEAT), + ('Mute Flags', 0, F_MUTEFLAGS) + ] + + #Clips grid column definitions + CLIPS_GRID = [('Event Name', 200, F_ENAME), + ('Type', 100, F_ETYPE), + ('Start',TIMEWIDTH, F_ESTART), + ('End',TIMEWIDTH, F_EEND), + ('Track',0, F_ETRACK), + ('Channel',0, F_ECHANNEL), + ('EventID',0, F_EEVENTID) + ] + + #Jet open dialog control definitions + JETOPEN_SIZE = (365+200,360) + JETOPEN_CTRLS = [ + ('Jet Creator Files', 'frCreator', 20, 20, (234+200, 244 + ROWSIZE), 0, 0, -1, [], "", True, ""), + ('Open', F_JOPEN, BUTROW1, COL3+200, BUTSIZE, 0, 0, ID_JET_OPEN, [], "OnOk", True, ""), + ('New', F_JNEW, BUTROW1+BUTOFF*1, COL3+200, BUTSIZE, 0, 0, ID_JET_NEW, [], "OnNew", True, ""), + ('Import', F_JIMPORT, BUTROW1+BUTOFF*2, COL3+200, BUTSIZE, 0, 0, ID_JET_IMPORT, [], "OnJetImport", True, ""), + ('Cancel', F_CANCEL, BUTROW1+BUTOFF*3, COL3+200, BUTSIZE, 0, 0, wx.ID_CANCEL, [], "", True, ""), + ('', F_JFILE, ROW1, COL1, 200+200, 0, 0, -1, JTC_FILE_SPEC, "", True, ""), + ('Recent Files', F_JLIST, ROW2, COL1, (200+200,200), 0, 0, -1, [], "", True, ""), + ] + + #Jet properties dialog control definitions + JET_PROPERTIES_SIZE = (465,460) + JET_PROPERTIES_CTRLS = [ + ('Jet Project Properties', 'frProperties', 20, 20, (334, 344 + ROWSIZE), 0, 0, -1, [], "", True, ""), + ('Ok', F_OK, BUTROW1, COL3+100, BUTSIZE, 0, 0, wx.ID_OK, [], "OnOk", True, ""), + ('Cancel', F_CANCEL, BUTROW1+BUTOFF*1, COL3+100, BUTSIZE, 0, 0, wx.ID_CANCEL, [], "", True, ""), + ('Jet File', F_JETFILENAME, ROW1, COL1, 300, 0, 0, -1, JTC_FILE_SPEC, "", True, ""), + ('Copyright', F_COPYRIGHT, ROW2, COL1, 300, 0, 0, -1, [], "", True, ""), + ('Chase Controllers', F_CHASECONTROLLERS, ROW3, COL1, 200, 0, 0, -1, [], "", True, ""), + ('Delete Empty Tracks', F_DELETEEMPTYTRACKS, ROW4 - ROWSIZE/2, COL1, 200, 0, 0, -1, [], "", True, ""), + ] + + #Preferences dialog control definitions + PREFERENCES_SIZE = (465,460) + PREFERENCES_CTRLS = [ + ('Preferences', 'frPreferences', 20, 20, (334, 344 + ROWSIZE), 0, 0, -1, [], "", True, ""), + ('Ok', F_OK, BUTROW1, COL3+100, BUTSIZE, 0, 0, wx.ID_OK, [], "OnOk", True, ""), + ('Cancel', F_CANCEL, BUTROW1+BUTOFF*1, COL3+100, BUTSIZE, 0, 0, wx.ID_CANCEL, [], "", True, ""), + ('Copyright', F_COPYRIGHT, ROW1, COL1, 300, 0, 0, -1, [], "", True, ""), + ('Chase Controllers', F_CHASECONTROLLERS, ROW2, COL1, 200, 0, 0, -1, [], "", True, ""), + ('Delete Empty Tracks', F_DELETEEMPTYTRACKS, ROW3 - ROWSIZE/2, COL1, 200, 0, 0, -1, [], "", True, ""), +# ('Use Project Directories', INI_PROJECT_DIRS, ROW1, COL1, 150, 0, 0, -1, [], "", True, ""), + ] + + #Error dialog control definitions + ERRORCOLW = 220 + ERRORDLG_SIZE = (600,400) + ERRORDLG = [ + ('Ok', F_OK, BUTROW1, 500, BUTSIZE, 0, 0, wx.ID_OK, [], "OnOk", True, ""), + ('', F_ERRGRID, BUTROW1, COL1, (200,300), 0, 0, -1, [], "", True, ""), + ] + + #Event dialog control definitions + BGR = 100 + EVT_OFFSET = 525+BGR + EVTDLG_SIZE = (375+EVT_OFFSET,530) + ID_MUTE = 124 + ID_MIDIFILE = 123 + ID_TRIGGERCLIP = 122 + SEGFRAME_SIZE = (500+BGR, 344 + ROWSIZE) + TRACKGRD_SIZE = (70, SEGFRAME_SIZE[1]-50) + GRAPH_SIZE = (760, 50) + AUDCOL=190 + EVTDLG_CTRLS = [ + ('Segment', 'frSeg', 20, 20, SEGFRAME_SIZE, 0, 0, -1, [], "", False, ""), + ('Segment Name', F_SEGNAME, ROW1, COL1, 200+BGR, 0, 0, -1, [], "", False, ""), + ('MIDI File', F_MIDIFILE, ROW2, COL1, FILEPATH_WIDTH+BGR, 0, 0, ID_MIDIFILE, MIDI_FILE_SPEC, "", False, ""), + ('DLS File', F_DLSFILE, ROW3, COL1, FILEPATH_WIDTH+BGR, 0, 0, -1, DLS_FILE_SPEC, "", False, ""), + ('Starting M/B/T', F_START, ROW4, COL1, TM_WIDTH, 0, 0, -1, [], "", False, ""), + ('Ending M/B/T', F_END, ROW5, COL1, TM_WIDTH, 0, 0, -1, [], "", False, ""), + ('Quantize', F_QUANTIZE, ROW6, COL1, INTWIDTH, QUANTIZE_MIN, QUANTIZE_MAX, -1, [], "", False, HLP_QUANTIZE), + ('Repeat', F_REPEAT, ROW4, AUDCOL, INTWIDTH, REPEAT_MIN, REPEAT_MAX, -1, [], "", False, ""), + ('Transpose', F_TRANSPOSE, ROW5, AUDCOL, INTWIDTH, TRANSPOSE_MIN, TRANSPOSE_MAX, -1, [], "", False, ""), + ('Event', 'frEventg', 20+EVT_OFFSET, 20, (234, 344 + ROWSIZE), 0, 0, -1, [], "", True, ""), + ('Ok', F_ADDCLIP, BUTROW1, COL3+EVT_OFFSET, BUTSIZE, 0, 0, wx.ID_OK, [], "OnOk", True, ""), + ('Cancel', F_CANCEL, BUTROW1+BUTOFF*1, COL3+EVT_OFFSET, BUTSIZE, 0, 0, wx.ID_CANCEL, [], "OnClose", True, ""), + ('Replicate', F_REPLICATE, BUTROW1+BUTOFF*2, COL3+EVT_OFFSET, BUTSIZE, 0, 0, wx.ID_CANCEL, [], "OnReplicate", True, ""), + ('Event Name', F_ENAME, ROW1, COL1+EVT_OFFSET, 200, 0, 0, -1, [], "", True, ""), + ('Event Type', F_ETYPE, ROW2, COL1+EVT_OFFSET, 120, 0, 0, -1, [E_CLIP, E_EOS, E_APP], "OnEventSelect", True, ""), + ('Starting M/B/T', F_ESTART, ROW3, COL1+EVT_OFFSET, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Ending M/B/T', F_EEND, ROW4, COL1+EVT_OFFSET, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Track', F_ETRACK, ROW5, COL1+EVT_OFFSET, INTWIDTH, TRACK_MIN, TRACK_MAX, -1, [], "", True, ""), + ('Track Mutes', F_MUTEFLAGS, ROW1, COL3 + 15+BGR, TRACKGRD_SIZE, 0, 0, -1, [], "", False, ""), + ('Channel', F_ECHANNEL, ROW6, COL1+EVT_OFFSET, INTWIDTH, CHANNEL_MIN, CHANNEL_MAX, -1, [], "", True, ""), + ('EventID', F_EEVENTID, ROW7, COL1+EVT_OFFSET, INTWIDTH, DEFAULTID_MIN, DEFAULTID_MAX, -1, [], "", True, ""), + ('Play', F_PLAY, BUTROW1+BUTOFF*4, COL3+EVT_OFFSET, BUTSIZE, 0, 0, -1, [], "OnPlay", True, ""), + ('Trigger', F_ETRIGGERBUT, BUTROW1+BUTOFF*5, COL3+EVT_OFFSET, BUTSIZE, 0, 0, ID_TRIGGERCLIP, [], "OnTriggerClip", False, ""), + ('Un-Mute', F_EMUTEBUT, BUTROW1+BUTOFF*6, COL3+EVT_OFFSET, BUTSIZE, 0, 0, ID_MUTE, [], "OnMute", False, ""), + ('Pause', F_PAUSE, BUTROW1+BUTOFF*7, COL3+EVT_OFFSET, BUTSIZE, 0, 0, -1, [], "OnPause", False, ""), + ('Graph', F_GRAPH, 430, 20, (EVTDLG_SIZE[0]-40,60), 0, 0, -1, [], "", True, ""), + (GRAPH_LBLS, F_GRAPHLABELS, (BUTROW1+BUTOFF*10)+70, COL3+EVT_OFFSET+5, 200, 0, 0, -1, [], "OnSetGraphOptions", True, ""), + (GRAPH_APP, F_GRAPHCLIPS, (BUTROW1+BUTOFF*10)+90, COL3+EVT_OFFSET+5, 200, 0, 0, -1, [], "OnSetGraphOptions", True, ""), + (GRAPH_TRIGGER, F_GRAPHAPPEVTS, (BUTROW1+BUTOFF*10)+110, COL3+EVT_OFFSET+5, 200, 0, 0, -1, [], "OnSetGraphOptions", True, ""), + ("Graph", "boxGraph", (BUTROW1+BUTOFF*10)+45, COL3+EVT_OFFSET, (90,95), 0, 0, -1, [], "", True, ""), + + ] + + #Segment dialog control definitions + BGR = 100 + AUDCOL = 560 + COLADD = 500 + BGR + SEGDLG_SIZE = (890+BGR,530) + SEGFRAME_SIZE = (375+BGR, 394) + AUDFRAME_SIZE = (350, 394) + TRACKGRD_SIZE = (200, AUDFRAME_SIZE[1]-60) + MUTEGRD_TRACK = 50 + MUTEGRD_CHANNEL = 60 + MUTEGRD_NAME = 100 + BIGBUT = (100, 25) + FILEPATH_WIDTH = 350 + SEGDLG_CTRLS = [ + ('Segment', 'frSeg', 20, 20, SEGFRAME_SIZE, 0, 0, -1, [], "", True, ""), + ('Audition', 'frAudition', SEGFRAME_SIZE[0]+30, 20, AUDFRAME_SIZE, 0, 0, -1, [], "", True, ""), + ('Segment Name', F_SEGNAME, ROW1, COL1, 200+BGR, 0, 0, -1, [], "", True, ""), + ('MIDI File', F_MIDIFILE, ROW2, COL1, FILEPATH_WIDTH+BGR, 0, 0, ID_MIDIFILE, MIDI_FILE_SPEC, "", True, ""), + ('DLS File', F_DLSFILE, ROW3, COL1, FILEPATH_WIDTH+BGR, 0, 0, -1, DLS_FILE_SPEC, "", True, ""), + ('Starting M/B/T', F_START, ROW4, COL1, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Ending M/B/T', F_END, ROW5, COL1, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Quantize', F_QUANTIZE, ROW6, COL1, INTWIDTH, QUANTIZE_MIN, QUANTIZE_MAX, -1, [], "", True, HLP_QUANTIZE), + ('Repeat', F_REPEAT, ROW1, AUDCOL+100+BGR, INTWIDTH, REPEAT_MIN, REPEAT_MAX, -1, [], "", True, ""), + ('Transpose', F_TRANSPOSE, ROW2, AUDCOL+100+BGR, INTWIDTH, TRANSPOSE_MIN, TRANSPOSE_MAX, -1, [], "", True, ""), + ('Track Mutes', F_MUTEFLAGS, ROW1, COL3 + 145+BGR, TRACKGRD_SIZE, 0, 0, -1, [], "", True, ""), + ('Display Empty Tracks', F_DISPEMPTYTRACKS, ROW1+TRACKGRD_SIZE[1]+20, COL3 + 145+BGR, 200, 0, 0, -1, [], "OnSetTrackDisplayOption", True, ""), + ('Ok', F_ADDSEG, BUTROW1, COL3 + COLADD, BIGBUT, 0, 0, wx.ID_OK, [], "OnOk", True, ""), + ('Cancel', F_CANCEL, BUTROW1+BUTOFF*1, COL3 + COLADD, BIGBUT, 0, 0, wx.ID_CANCEL, [], "OnClose", True, ""), + ('Replicate', F_REPLICATE, BUTROW1+BUTOFF*2, COL3 + COLADD, BIGBUT, 0, 0, wx.ID_CANCEL, [], "OnReplicate", True, ""), + + ('Play Segment', F_PLAY, BUTROW1+BUTOFF*4, COL3 + COLADD, BIGBUT, 0, 0, -1, [], "OnPlay", True, ""), + ('Play MIDI File', F_PLAYMIDI, BUTROW1+BUTOFF*5, COL3 + COLADD, BIGBUT, 0, 0, -1, [], "OnPlayMidi", True, ""), + ('Pause', F_PAUSE, BUTROW1+BUTOFF*6, COL3 + COLADD, BIGBUT, 0, 0, -1, [], "OnPause", False, ""), + ('Graph', F_GRAPH, 430, 20, (SEGDLG_SIZE[0]-40,60), 0, 0, -1, [], "", True, ""), + ('Graph', F_RDOGRAPH, (BUTROW1+BUTOFF*10), COL3 + COLADD, (100,140), 0, 0, -1, ["MIDI File", "Segment"], "OnSetGraphType", True, ""), + + (GRAPH_LBLS, F_GRAPHLABELS, (BUTROW1+BUTOFF*10)+70, COL3 + COLADD+5, 200, 0, 0, -1, [], "OnSetGraphOptions", True, ""), + (GRAPH_APP, F_GRAPHCLIPS, (BUTROW1+BUTOFF*10)+90, COL3 + COLADD+5, 200, 0, 0, -1, [], "OnSetGraphOptions", True, ""), + (GRAPH_TRIGGER, F_GRAPHAPPEVTS, (BUTROW1+BUTOFF*10)+110, COL3 + COLADD+5, 200, 0, 0, -1, [], "OnSetGraphOptions", True, ""), + ] + + + REPLICATE_MAX = 999 + F_RPINCREMENT = "tmIncrement" + F_RPGRDPREVIEW = "grdPreview" + F_RPPREFIX = "txtPrefix" + F_RPREPLACE = "chkReplaceMatching" + F_RPMOVE = "chkMoveMatching" + F_RPNUMBER = "spnNumber" + F_RPBUT = "btnPreview" + REPLICATE_GRID = [('Event Name', 200, F_ENAME), + ('Start',TIMEWIDTH, F_ESTART), + ('End',TIMEWIDTH, F_EEND) + ] + REPLICATE_SIZE = (515,550) + REPLICATEGRID_SIZE = (350,310) + REPLICATE_CTRLS = [ + ('Replicate', 'frRep', 20, 20, (384, 480), 0, 0, -1, [], "", True, ""), + ('Ok', F_OK, BUTROW1, COL3+150, BUTSIZE, 0, 0, wx.ID_OK, [], "OnOk", True, ""), + ('Cancel', F_CANCEL, BUTROW1+BUTOFF*1, COL3+150, BUTSIZE, 0, 0, wx.ID_CANCEL, [], "", True, ""), + ('Preview', F_RPBUT , BUTROW1+BUTOFF*2, COL3+150, BUTSIZE, 0, 0, -1, [], "OnPreview", True, ""), + ('Name Prefix', F_RPPREFIX, ROW1, COL1, 300, 0, 0, -1, [], "", True, ""), + ('Replace Existing Items Matching Prefix', F_RPREPLACE, ROW3, COL1, 200, 0, 0, -1, [], "", True, ""), + ('Preview', F_RPGRDPREVIEW, ROW4-20, COL1, REPLICATEGRID_SIZE, 0, 0, -1, [], "", True, ""), + ('Starting M/B/T', F_ESTART, ROW2, COL1, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Increment M/B/T', F_RPINCREMENT, ROW2, COL2+20, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Number', F_RPNUMBER, ROW2, COL3+40, INTWIDTH, 1, REPLICATE_MAX, -1, [], "", True, ""), + ] + + + MOVE_SIZE = (350,390) + MOVE_CTRLS = [ + ('Move', 'frRep', 20, 20, (384, 480), 0, 0, -1, [], "", True, ""), + ('Ok', F_OK, BUTROW1, COL3+150, BUTSIZE, 0, 0, wx.ID_OK, [], "OnOk", True, ""), + ('Cancel', F_CANCEL, BUTROW1+BUTOFF*1, COL3+150, BUTSIZE, 0, 0, wx.ID_CANCEL, [], "", True, ""), + ('Preview', F_RPBUT , BUTROW1+BUTOFF*2, COL3+150, BUTSIZE, 0, 0, -1, [], "OnPreview", True, ""), + ('Starting M/B/T', F_ESTART, ROW1, COL1, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Increment M/B/T', F_RPINCREMENT, ROW1, COL2+20, TM_WIDTH, 0, 0, -1, [], "", True, ""), + ('Preview', F_RPGRDPREVIEW, ROW2, COL1, MOVE_SIZE, 0, 0, -1, [], "", True, ""), + ] + +if __name__ == '__main__': + jd = JetDefs() + jd.CreateHelpIniFile() diff --git a/jet_tools/JetCreator/JetDialogs.py b/jet_tools/JetCreator/JetDialogs.py new file mode 100755 index 0000000..67d689b --- /dev/null +++ b/jet_tools/JetCreator/JetDialogs.py @@ -0,0 +1,1031 @@ +""" + File: + JetDialogs.py + + Contents and purpose: + Dialog boxes used in JetCreator + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import wx +import thread +import wx.lib.newevent + +from JetDefs import * +from JetCtrls import * +from JetFile import * +from JetUtils import * +from JetPreview import * +from JetSegGraph import * +from eas import * +from JetStatusEvent import * + +PLAY_SEGMENT = 1 +PLAY_MIDI = 2 + +class JetEdit(): + """ Class used to build dialog box controls from the definitions in JetDefs """ + def __init__(self, panel, ctrlList, callbackClass): + LBL_OFFSET = 15 + + ctrls = getattr(JetDefs, ctrlList) + self.ctrls = {} + for Lbl, Text, Row, Col, Len, Min, Max, Id, Lst, Fct, Enabled, HelpText in ctrls: + try: + iDisplayLbl = True + if Text[0:3] == "btn": + self.ctrls[Text] = wx.Button(panel, Id, Lbl, wx.Point(Col, Row), size=Len) + if Fct > "": + self.ctrls[Text].Bind(wx.EVT_BUTTON, getattr(callbackClass, Fct), self.ctrls[Text], id=Id) + if Id == wx.ID_OK: + self.ctrls[Text].SetDefault() + iDisplayLbl = False + else: + if Text[0:3] == "txt": + self.ctrls[Text] = wx.TextCtrl(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET +3), wx.Size(Len,-1)) + elif Text[0:4] == "spn1": + self.ctrls[Text] = JetSpinOneBased(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max) + elif Text[0:3] == "spn": + self.ctrls[Text] = JetSpin(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), min=Min, max=Max) + elif Text[0:3] == "cmb": + self.ctrls[Text] = wx.ComboBox(panel, Id, "", wx.Point(Col, Row + LBL_OFFSET), wx.Size(Len,-1), Lst, wx.CB_DROPDOWN | wx.CB_READONLY ) + self.ctrls[Text].SetValue(Lst[0]) + if Fct > "": + self.ctrls[Text].Bind(wx.EVT_COMBOBOX, getattr(callbackClass, Fct), self.ctrls[Text]) + elif Text[0:2] == "tm": + self.ctrls[Text] = TimeCtrl(panel, pos=(Col, Row + LBL_OFFSET), ctlName=Text) + elif Text[0:7] == "filecmb": + self.ctrls[Text] = JetFileCombo(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id) + elif Text[0:7] == "filetxt": + self.ctrls[Text] = JetFileText(panel, pos=(Col, Row + LBL_OFFSET), size=wx.Size(Len,-1), title=Lbl, spec=Lst, id=Id) + elif Text[0:2] == "fr": + self.ctrls[Text] = wx.StaticBox(parent=panel, id=wx.ID_ANY, label=Lbl, pos=(Row, Col), size=Len) + iDisplayLbl = False + elif Text[0:3] == "chk": + self.ctrls[Text] = JetCheckBox(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1)) + iDisplayLbl = False + if Fct > "": + self.ctrls[Text].Bind(wx.EVT_CHECKBOX , getattr(callbackClass, Fct), self.ctrls[Text]) + elif Text[0:6] == "rdobox": + self.ctrls[Text] = wx.RadioBox(panel, Id, label=Lbl, pos=(Col, Row), size=Len, choices=Lst, majorDimension=1, style=wx.RA_SPECIFY_COLS) + iDisplayLbl = False + if Fct > "": + self.ctrls[Text].Bind(wx.EVT_RADIOBOX , getattr(callbackClass, Fct), self.ctrls[Text]) + elif Text[0:3] == "opt": + self.ctrls[Text] = JetRadioButton(panel, Id, label=Lbl, pos=(Col, Row), size=wx.Size(Len,-1)) + iDisplayLbl = False + self.ctrls[Text].SetValue(Lst) + if Fct > "": + self.ctrls[Text].Bind(wx.EVT_RADIOBUTTON , getattr(callbackClass, Fct), self.ctrls[Text]) + elif Text[0:3] == "lst": + self.ctrls[Text] = wx.ListBox(panel, Id, pos=(Col, Row), size=Len) + iDisplayLbl = False + elif Text[0:4] == "grd2": + self.ctrls[Text] = JetTrackCtrl(panel, Id, pos=(Col, Row + LBL_OFFSET), size=Len, style=wx.LC_REPORT | wx.SUNKEN_BORDER) + iDisplayLbl = True + elif Text[0:3] == "grd": + self.ctrls[Text] = JetListCtrl(panel, Id, pos=(Col, Row), size=Len) + iDisplayLbl = False + elif Text[0:5] == "graph": + self.ctrls[Text] = SegmentGraph(panel, pos=(Col, Row), size=Len) + iDisplayLbl = False + elif Text[0:3] == "hlp": + self.ctrls[Text] = wx.ContextHelpButton(panel, Id, pos=(Col, Row)) + iDisplayLbl = False + elif Text[0:3] == "lbl": + self.ctrls[Text] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row), size=wx.Size(Len[0],Len[1])) + iDisplayLbl = False + elif Text[0:3] == "box": + self.ctrls[Text] = wx.StaticBox(panel, wx.ID_ANY, Lbl, pos=(Col, Row), size=Len) + iDisplayLbl = False + + if iDisplayLbl: + self.ctrls[Lbl] = wx.StaticText(panel, Id, Lbl, wx.Point(Col, Row)) + if not Enabled: + self.ctrls[Text].Enable(False) + + helpText = IniGetValue(JetDefs.JETCREATOR_HLP, ctrlList, Lbl) + if helpText > "": + self.ctrls[Text].SetHelpText(helpText) + + #except AttributeError: + #No stub function for testing + #print("def " + Fct + "(self, event): pass") + except: + raise + + def GetValue(self, fld): + """ Gets the value of a control """ + return self.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + """ Sets the value of a control """ + self.ctrls[fld].SetValue(val) + +class JetOpen(wx.Dialog): + """ Opens a jet definition file """ + def __init__(self): + wx.Dialog.__init__(self, None, -1, JetDefs.DLG_JETOPEN) + self.fileName = "" + self.je = JetEdit(self, "JETOPEN_CTRLS", self) + fileList = GetRecentJetFiles() + self.je.ctrls[JetDefs.F_JLIST].AppendItems(fileList) + if len(fileList) > 0: + self.je.ctrls[JetDefs.F_JFILE].SetValue(fileList[0]) + self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnOpen) + self.Bind(wx.EVT_LISTBOX, self.OnClick) + self.SetSize(JetDefs.JETOPEN_SIZE) + self.CenterOnParent() + + def OnJetImport(self, event): + """ Exit the dialog with flag to import """ + self.EndModal(JetDefs.ID_JET_IMPORT) + + def OnClick(self, event): + """ Clicking on item in listbox """ + sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection()) + self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue) + + def OnOpen(self, event): + """ Double clicking on item in listbox """ + sValue = self.je.ctrls[JetDefs.F_JLIST].GetString(self.je.ctrls[JetDefs.F_JLIST].GetSelection()) + self.je.ctrls[JetDefs.F_JFILE].SetValue(sValue) + if self.Validate(): + self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue() + AppendRecentJetFile(self.fileName) + self.EndModal(JetDefs.ID_JET_OPEN) + + def OnOk(self, event): + """ Clicking the ok button """ + if self.Validate(): + self.fileName = self.je.ctrls[JetDefs.F_JFILE].GetValue() + AppendRecentJetFile(self.fileName) + self.EndModal(JetDefs.ID_JET_OPEN) + + def OnNew(self, event): + """ Exit the dialog with flag to create new blank jet file """ + self.EndModal(JetDefs.ID_JET_NEW) + + def Validate(self): + """ Validates the filename """ + if len(self.je.ctrls[JetDefs.F_JFILE].GetValue()) == 0: + InfoMsg("Jet Filename", "The Jet filename is blank.") + self.je.ctrls[JetDefs.F_JFILE].SetFocus() + return False + if not FileExists(self.je.ctrls[JetDefs.F_JFILE].GetValue()): + InfoMsg("MIDI File", "The file does not exist.") + self.je.ctrls[JetDefs.F_JFILE].SetFocus() + return False + return True + +class JetPreferences(wx.Dialog): + """ Preferences dialog box """ + def __init__(self): + wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PREFERENCES) + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) + self.je = JetEdit(self, "PREFERENCES_CTRLS", self) + self.SetSize(JetDefs.PREFERENCES_SIZE) + self.CenterOnParent() + + def OnOk(self, event): + self.EndModal(wx.ID_OK) + + def GetValue(self, fld): + return self.je.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + self.je.ctrls[fld].SetValue(val) + + +class JetAbout(wx.Dialog): + """ About dialog box """ + def __init__(self): + wx.Dialog.__init__(self, None, -1, JetDefs.DLG_ABOUT) + img = __import__('img_splash') + bmp = img.getBitmap() + b = wx.StaticBitmap(self, -1, bmp) + self.SetSize((bmp.GetWidth(), bmp.GetHeight())) + self.CenterOnParent() + s = __import__('sys') + print(s.platform) + + def OnOk(self, event): + self.EndModal(wx.ID_OK) + + def GetValue(self, fld): + return self.je.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + self.je.ctrls[fld].SetValue(val) + + +class JetPropertiesDialog(wx.Dialog): + """ Properties dialog box """ + def __init__(self): + wx.Dialog.__init__(self, None, -1, JetDefs.DLG_PROPERTIES) + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) + self.je = JetEdit(self, "JET_PROPERTIES_CTRLS", self) + self.SetSize(JetDefs.JET_PROPERTIES_SIZE) + self.CenterOnParent() + + def OnOk(self, event): + self.EndModal(wx.ID_OK) + + def GetValue(self, fld): + return self.je.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + self.je.ctrls[fld].SetValue(val) + + +class JetErrors(wx.Dialog): + """ Errors dialog box """ + def __init__(self, title): + wx.Dialog.__init__(self, None, -1, title) + self.je = JetEdit(self, "ERRORDLG", self) + self.SetSize(JetDefs.ERRORDLG_SIZE) + self.CenterOnParent() + + def OnOk(self, event): + self.EndModal(wx.ID_OK) + + def SetErrors(self, errors): + self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Error", JetDefs.ERRORCOLW) + self.je.ctrls[JetDefs.F_ERRGRID].AddCol("Description", JetDefs.ERRORCOLW) + self.je.ctrls[JetDefs.F_ERRGRID].AddRows(errors) + + +class SegEdit(wx.Dialog): + """ Dialog box to edit segments """ + def __init__(self, title, currentJetConfigFile): + wx.Dialog.__init__(self, None, -1, title) + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) + self.currentJetConfigFile = currentJetConfigFile + self.je = JetEdit(self, "SEGDLG_CTRLS", self) + self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_KILL_FOCUS, self.OnMidiChanged) + self.je.ctrls[JetDefs.F_MIDIFILE].cmb.Bind(wx.EVT_COMBOBOX, self.OnMidiChanged) + self.je.ctrls[JetDefs.F_MIDIFILE].SetEventFire(True) + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) + self.je.ctrls[JetDefs.F_MUTEFLAGS].BindCheckBox(self.OnEventChecked) + self.je.ctrls[JetDefs.F_START].SetChangeCallbackFct(self.UpdateGraph) + self.je.ctrls[JetDefs.F_END].SetChangeCallbackFct(self.UpdateGraph) + self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_DISPEMPTYTRACKS, JetDefs.F_DISPEMPTYTRACKS, 'bool', 'False')) + self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True')) + self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True')) + self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + self.replicatePrefix = "" + self.lstReplicate = [] + self.chkReplaceMatching = False + + EVT_JET_STATUS(self, self.OnJetStatusUpdate) + wx.EVT_CLOSE(self, self.OnClose) + + self.Player = None + self.segment = None + self.graphSegment = None + self.jetevents = [] + self.lastMidiFile = "" + self.lastMidiInfo = None + self.playMode = PLAY_SEGMENT + self.graphMode = PLAY_MIDI + self.SetSize(JetDefs.SEGDLG_SIZE) + self.CenterOnParent() + + def OnClose(self, event): + """ Closing the dialog box """ + self.ShutdownPlayer() + self.je.ctrls[JetDefs.F_START].UnBindKillFocus() + self.je.ctrls[JetDefs.F_END].UnBindKillFocus() + self.EndModal(wx.ID_CANCEL) + + def ShutdownPlayer(self): + """ Shutdown player flag """ + if self.Player is not None: + self.Player.SetKeepPlayingFlag(False) + + def OnMidiChanged(self, event): + """ When new midi file selected, get its info """ + self.UpdateMaxMbt() + event.Skip() + + def UpdateMaxMbt(self): + """ Get midi info in thread so UI smoother """ + thread.start_new_thread(self.UpdateMaxMbtThread, ()) + + def UpdateMaxMbtThread(self): + """ Thread to get midi file info """ + if self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() == self.lastMidiFile: + return + self.lastMidiFile = self.je.ctrls[JetDefs.F_MIDIFILE].GetValue() + self.lastMidiInfo = GetMidiInfo(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) + wx.PostEvent(self, JetStatusEvent(JetDefs.PST_MIDI_INFO, self.lastMidiInfo)) + + def GetValue(self, fld): + """ Gets a control value """ + return self.je.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + """ Sets a control value """ + self.je.ctrls[fld].SetValue(val) + if self.je.ctrls[fld] == self.je.ctrls[JetDefs.F_MIDIFILE]: + self.UpdateMaxMbt() + + def OnOk(self, event): + """ Exits dialog box """ + self.ShutdownPlayer() + if self.Validate(): + self.je.ctrls[JetDefs.F_START].UnBindKillFocus() + self.je.ctrls[JetDefs.F_END].UnBindKillFocus() + self.EndModal(wx.ID_OK) + + def Validate(self): + """ Validates the control values before exiting """ + if not CompareMbt(self.je.ctrls[JetDefs.F_START].GetValue(), self.je.ctrls[JetDefs.F_END].GetValue()): + InfoMsg("Start/End", "The segment starting and ending times are illogical.") + self.je.ctrls[JetDefs.F_START].SetFocus() + return False + if len(self.je.ctrls[JetDefs.F_SEGNAME].GetValue()) == 0: + InfoMsg("Segment Name", "The segment must have a name.") + self.je.ctrls[JetDefs.F_SEGNAME].SetFocus() + return False + if len(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()) == 0: + InfoMsg("MIDI File", "The segment must have a midi file selected.") + self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus() + return False + if not FileExists(self.je.ctrls[JetDefs.F_MIDIFILE].GetValue()): + InfoMsg("MIDI File", "The MIDI file does not exist.") + self.je.ctrls[JetDefs.F_MIDIFILE].SetFocus() + return False + if len(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()) > 0: + if not FileExists(self.je.ctrls[JetDefs.F_DLSFILE].GetValue()): + InfoMsg("DLS File", "The DLS file does not exist.") + self.je.ctrls[JetDefs.F_DLSFILE].SetFocus() + return False + self.je.ctrls[JetDefs.F_MUTEFLAGS].SetValue(ComputeMuteFlagsFromList(self.je.ctrls[JetDefs.F_MUTEFLAGS])) + return True + + def SetSegment(self, mode): + """ Builds the segment info for graphing """ + if mode == PLAY_SEGMENT: + jetevents = self.jetevents + segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), + self.GetValue(JetDefs.F_MIDIFILE), + self.GetValue(JetDefs.F_START), + self.GetValue(JetDefs.F_END), + JetDefs.MBT_ZEROSTR, + self.GetValue(JetDefs.F_SEGNAME), + self.GetValue(JetDefs.F_QUANTIZE), + jetevents, + self.GetValue(JetDefs.F_DLSFILE), + None, + self.GetValue(JetDefs.F_TRANSPOSE), + self.GetValue(JetDefs.F_REPEAT), + self.GetValue(JetDefs.F_MUTEFLAGS)) + else: + jetevents = [] + segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), + self.GetValue(JetDefs.F_MIDIFILE), + JetDefs.MBT_ZEROSTR, + self.lastMidiInfo.endMbtStr, + JetDefs.MBT_ZEROSTR, + self.GetValue(JetDefs.F_SEGNAME), + self.GetValue(JetDefs.F_QUANTIZE), + jetevents, + self.GetValue(JetDefs.F_DLSFILE), + None, + 0, + 0, + 0) + return segment + + def OnEventChecked(self, index, checked): + """ Track is checked so mute or unmute it """ + if self.Player is not None: + trackNum = self.je.ctrls[JetDefs.F_MUTEFLAGS].GetTrackNumber(index) + self.Player.SetMuteFlag(trackNum, checked) + + def OnPlay(self, event): + """ Play the segment button pressed """ + if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP: + self.Player.SetKeepPlayingFlag(False) + return + + if not self.Validate(): + return + + self.playMode = PLAY_SEGMENT + self.graphSegment = self.SetSegment(self.graphMode) + self.UpdateGraph() + self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], self.SetSegment(self.playMode)) + self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) + self.PlayerThread = thread.start_new_thread(self.Player .Start, ()) + + def OnPlayMidi(self, event): + """ Play the whole midi file pressed """ + if self.je.ctrls[JetDefs.F_PLAYMIDI].GetLabel() == JetDefs.BUT_STOP: + self.Player.SetKeepPlayingFlag(False) + return + + if not self.Validate(): + return + + self.playMode = PLAY_MIDI + self.graphSegment = self.SetSegment(self.graphMode) + self.UpdateGraph() + self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAYMIDI], self.SetSegment(self.playMode)) + self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) + self.PlayerThread = thread.start_new_thread(self.Player .Start, ()) + + def OnSetGraphType(self, event): + """ Sets the type of graph """ + self.SetGraphType(event.GetInt()) + + def SetGraphType(self, iMode): + """ Sets the type of graph """ + if iMode == 1: + self.graphMode = PLAY_SEGMENT + else: + self.graphMode = PLAY_MIDI + self.graphSegment = self.SetSegment(self.graphMode) + self.UpdateGraph() + + def OnGraphUpdate(self, evt): + """ Calls graph control to draw """ + self.je.ctrls[JetDefs.F_GRAPH].DoDrawing() + + def UpdateGraph(self): + """ Updates values for graph control """ + if self.graphMode == PLAY_SEGMENT: + self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + else: + if self.playMode == PLAY_SEGMENT: + iMidiMode = True + else: + iMidiMode = False + self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.graphSegment,(self.GetValue(JetDefs.F_SEGNAME), self.GetValue(JetDefs.F_START), self.GetValue(JetDefs.F_END)), iMidiMode, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def OnJetStatusUpdate(self, evt): + """ All UI needed by thread must be called via Postevent or OS X crashes """ + if evt.mode == JetDefs.PST_UPD_LOCATION: + self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data) + elif evt.mode == JetDefs.PST_PLAY: + if self.playMode == PLAY_SEGMENT: + self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP) + self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = False + else: + self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = False + self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_STOP) + self.je.ctrls[JetDefs.F_PLAY].Enabled = False + + self.je.ctrls[JetDefs.F_PAUSE].Enabled = True + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) + elif evt.mode == JetDefs.PST_DONE: + self.je.ctrls[JetDefs.F_RDOGRAPH].Enabled = True + if self.playMode == PLAY_SEGMENT: + self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAYSEG) + self.je.ctrls[JetDefs.F_PLAYMIDI].Enabled = True + else: + self.je.ctrls[JetDefs.F_PLAYMIDI].SetLabel(JetDefs.BUT_PLAYMIDI) + self.je.ctrls[JetDefs.F_PLAY].Enabled = True + + self.je.ctrls[JetDefs.F_PAUSE].Enabled = False + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) + elif evt.mode == JetDefs.PST_PAUSE: + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME) + elif evt.mode == JetDefs.PST_RESUME: + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) + elif evt.mode == JetDefs.PST_MIDI_INFO: + ClearRowSelections(self.je.ctrls[JetDefs.F_MUTEFLAGS]) + self.md = evt.data + if self.md.err == 0: + self.je.ctrls[JetDefs.F_END].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks) + if self.je.ctrls[JetDefs.F_END].GetValue() == JetDefs.MBT_ZEROSTR: + self.je.ctrls[JetDefs.F_END].SetValue((self.md.maxMeasures,0,0)) + self.je.ctrls[JetDefs.F_START].SetMaxMbt(self.md.maxMeasures+1,self.md.maxBeats,self.md.maxTicks) + self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() + loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False') + for track in self.md.trackList: + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty) + self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue()) + self.graphSegment = self.SetSegment(self.graphMode) + self.UpdateGraph() + + def OnSetTrackDisplayOption(self, evt): + IniSetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, self.je.ctrls[JetDefs.F_DISPEMPTYTRACKS].GetValue()) + loadEmpty = IniGetValue(self.currentJetConfigFile, JetDefs.INI_DISPEMPTYTRACKS, JetDefs.INI_DISPEMPTYTRACKS, 'bool', 'False') + if self.md is not None: + self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() + if self.md.err == 0: + for track in self.md.trackList: + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track, loadEmpty) + + def OnPause(self, evt): + """ Pauses the playback """ + self.Player.Pause() + + def OnSetGraphOptions(self, evt): + """ Sets graph options """ + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue()) + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue()) + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue()) + self.UpdateGraph() + + def OnReplicate(self, evt): + dlg = JetReplicate("Replicate Segment") + dlg.SetValue(JetDefs.F_RPREPLACE, True) + dlg.SetName(self.GetValue(JetDefs.F_SEGNAME)) + dlg.event_type = "SEGMENT" + dlg.event_max = self.je.ctrls[JetDefs.F_START].GetMaxMbt() + dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_START)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_END))) + result = dlg.ShowModal() + if result == wx.ID_OK: + self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX) + self.lstReplicate = dlg.lstReplicate + self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE) + self.EndModal(wx.ID_OK) + else: + dlg.Destroy() + +class EventEdit(wx.Dialog): + """ Event edit dialog box """ + def __init__(self, title, currentJetConfigFile): + wx.Dialog.__init__(self, None, -1, title) + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) + self.title = title + self.currentJetConfigFile = currentJetConfigFile + self.je = JetEdit(self, "EVTDLG_CTRLS", self) + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_TRACK, JetDefs.MUTEGRD_TRACK) + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_CHANNEL, JetDefs.MUTEGRD_CHANNEL) + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddCol(JetDefs.GRD_NAME, JetDefs.MUTEGRD_NAME) + self.je.ctrls[JetDefs.F_ESTART].SetChangeCallbackFct(self.UpdateGraph) + self.je.ctrls[JetDefs.F_EEND].SetChangeCallbackFct(self.UpdateGraph) + self.je.ctrls[JetDefs.F_GRAPHLABELS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True')) + self.je.ctrls[JetDefs.F_GRAPHCLIPS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True')) + self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].SetValue(IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + EVT_JET_STATUS(self, self.OnJetStatusUpdate) + self.segment = None + self.Player = None + self.event_id = 1 + self.replicatePrefix = "" + self.lstReplicate = [] + self.chkReplaceMatching = False + + wx.EVT_CLOSE(self, self.OnClose) + self.SetSize(JetDefs.EVTDLG_SIZE) + self.CenterOnParent() + + def OnGraphUpdate(self, evt): + """ Calls the graph module to update the graph """ + self.je.ctrls[JetDefs.F_GRAPH].DoDrawing() + + def OnJetStatusUpdate(self, evt): + """ Updates to UI needed by play thread come through here otherwise OS X crashes """ + if evt.mode == JetDefs.PST_UPD_LOCATION: + self.je.ctrls[JetDefs.F_GRAPH].UpdateLocation(evt.data) + elif evt.mode == JetDefs.PST_PLAY: + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) + self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_STOP) + self.je.ctrls[JetDefs.F_PAUSE].Enabled = True + self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = True + self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = True + elif evt.mode == JetDefs.PST_DONE: + self.je.ctrls[JetDefs.F_EMUTEBUT].SetLabel(JetDefs.BUT_UNMUTE) + self.je.ctrls[JetDefs.F_PLAY].SetLabel(JetDefs.BUT_PLAY) + self.je.ctrls[JetDefs.F_PAUSE].Enabled = False + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) + self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enabled = False + self.je.ctrls[JetDefs.F_EMUTEBUT].Enabled = False + elif evt.mode == JetDefs.PST_PAUSE: + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_RESUME) + elif evt.mode == JetDefs.PST_RESUME: + self.je.ctrls[JetDefs.F_PAUSE].SetLabel(JetDefs.BUT_PAUSE) + + def OnPause(self, evt): + """ Pause the player """ + self.Player.Pause() + + def UpdateGraph(self): + """ Called back from player thread to update the graph """ + if len(self.segment.jetevents) == 0: + self.segment.jetevents.append(JetEvent(self.je.ctrls[JetDefs.F_ENAME].GetValue(), + self.je.ctrls[JetDefs.F_ETYPE].GetValue(), + 1, + self.je.ctrls[JetDefs.F_ETRACK].GetValue(), + self.je.ctrls[JetDefs.F_ECHANNEL].GetValue(), + self.je.ctrls[JetDefs.F_ESTART].GetValue(), + self.je.ctrls[JetDefs.F_EEND].GetValue())) + + self.segment.jetevents[0].event_name = self.je.ctrls[JetDefs.F_ENAME].GetValue() + self.segment.jetevents[0].event_type = self.je.ctrls[JetDefs.F_ETYPE].GetValue() + self.segment.jetevents[0].event_start = self.je.ctrls[JetDefs.F_ESTART].GetValue() + self.segment.jetevents[0].event_end = self.je.ctrls[JetDefs.F_EEND].GetValue() + self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(self.segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def OnClose(self, event): + """ Called when dialog is closed """ + self.ShutdownPlayer() + self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus() + self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus() + self.EndModal(wx.ID_CANCEL) + + def ShutdownPlayer(self): + """ Sets flag to kill play loop """ + if self.Player is not None: + self.Player.SetKeepPlayingFlag(False) + + def GetValue(self, fld): + """ Gets the value of a control """ + return self.je.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + """ Sets the value of a control """ + self.je.ctrls[fld].SetValue(val) + + def SetEventId(self): + """ Sets the eventid value """ + if self.title == JetDefs.MAIN_ADDEVENTTITLE: + iNextEventId = -1 + for evt in self.segment.jetevents: + if evt.event_type == JetDefs.E_CLIP: + if iNextEventId < evt.event_id: + iNextEventId = evt.event_id + self.je.ctrls[JetDefs.F_EEVENTID].SetValue(iNextEventId + 1) + + def OnEventSelect(self, event=None): + """ Adjusts the dialog box controls for various types of events """ + eType = self.je.ctrls[JetDefs.F_ETYPE].GetValue() + if eType == JetDefs.E_EOS: + self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_EOS) + self.je.ctrls[JetDefs.F_ENAME].Enable(False) + self.je.ctrls[JetDefs.F_ESTART].Enable(False) + self.je.ctrls[JetDefs.F_EEND].Enable(True) + self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False) + self.je.ctrls[JetDefs.F_EEVENTID].Enable(False) + elif eType == JetDefs.E_CLIP: + if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_APP: + self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_CLIP) + self.je.ctrls[JetDefs.F_ENAME].Enable(True) + self.je.ctrls[JetDefs.F_ESTART].Enable(True) + self.je.ctrls[JetDefs.F_EEND].Enable(True) + self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(True) + self.je.ctrls[JetDefs.F_EEVENTID].Enable(True) + self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.EVENTID_MIN, JetDefs.EVENTID_MAX) + if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.EVENTID_MIN: + self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MIN) + if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.EVENTID_MAX: + self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.EVENTID_MAX) + self.SetEventId() + elif eType == JetDefs.E_APP: + if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0 or self.je.ctrls[JetDefs.F_ENAME].GetValue() == JetDefs.E_EOS: + self.je.ctrls[JetDefs.F_ENAME].SetValue(JetDefs.E_APP) + self.je.ctrls[JetDefs.F_ENAME].Enable(True) + self.je.ctrls[JetDefs.F_ESTART].Enable(True) + self.je.ctrls[JetDefs.F_EEND].Enable(False) + self.je.ctrls[JetDefs.F_ETRIGGERBUT].Enable(False) + self.je.ctrls[JetDefs.F_EEVENTID].Enable(True) + self.je.ctrls[JetDefs.F_EEVENTID].SetRange(JetDefs.APPCONTROLLERID_MIN, JetDefs.APPCONTROLLERID_MAX) + if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() < JetDefs.APPCONTROLLERID_MIN: + self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MIN) + if self.je.ctrls[JetDefs.F_EEVENTID].GetValue() > JetDefs.APPCONTROLLERID_MAX: + self.je.ctrls[JetDefs.F_EEVENTID].SetValue(JetDefs.APPCONTROLLERID_MAX) + + def OnOk(self, event): + """ Exits the dialog box """ + self.ShutdownPlayer() + if self.Validate(): + self.je.ctrls[JetDefs.F_ESTART].UnBindKillFocus() + self.je.ctrls[JetDefs.F_EEND].UnBindKillFocus() + self.EndModal(wx.ID_OK) + + def Validate(self): + """ Validates the control values prior to exiting """ + if len(self.je.ctrls[JetDefs.F_ENAME].GetValue()) == 0: + InfoMsg("Event Name", "The event must have a name.") + self.je.ctrls[JetDefs.F_ENAME].SetFocus() + return False + if len(self.je.ctrls[JetDefs.F_ETYPE].GetValue()) == 0: + InfoMsg("Event Name", "The event type must be selected.") + self.je.ctrls[JetDefs.F_ETYPE].SetFocus() + return False + if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_CLIP: + if not CompareMbt(self.je.ctrls[JetDefs.F_ESTART].GetValue(), self.je.ctrls[JetDefs.F_EEND].GetValue()): + InfoMsg("Start/End", "The event starting and ending times are illogical.") + self.je.ctrls[JetDefs.F_ESTART].SetFocus() + return False + if MbtVal(self.je.ctrls[JetDefs.F_ESTART].GetValue()) < MbtVal(self.je.ctrls[JetDefs.F_START].GetValue()): + InfoMsg("Event Starting Time", "The event starting time is illogical.") + self.je.ctrls[JetDefs.F_ESTART].SetFocus() + return False + if MbtVal(self.je.ctrls[JetDefs.F_EEND].GetValue()) > MbtVal(self.je.ctrls[JetDefs.F_END].GetValue()): + InfoMsg("Event Ending Time", "The event ending time is illogical.") + self.je.ctrls[JetDefs.F_ESTART].SetFocus() + return False + if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_APP: + self.je.ctrls[JetDefs.F_EEND].SetValue(self.je.ctrls[JetDefs.F_ESTART].GetValue()) + if self.je.ctrls[JetDefs.F_ETYPE].GetValue() == JetDefs.E_EOS: + self.je.ctrls[JetDefs.F_ESTART].SetValue(self.je.ctrls[JetDefs.F_EEND].GetValue()) + return True + + def SetSegment(self, segment): + """ Sets the segment values, then calls the graph update """ + self.segment = segment + md = GetMidiInfo(segment.filename) + if md.err == 0: + self.SetValue(JetDefs.F_SEGNAME, segment.segname) + self.SetValue(JetDefs.F_MUTEFLAGS, segment.mute_flags) + self.SetValue(JetDefs.F_MIDIFILE, segment.filename) + self.SetValue(JetDefs.F_DLSFILE, segment.dlsfile) + self.SetValue(JetDefs.F_START, segment.start) + self.SetValue(JetDefs.F_END, segment.end) + self.SetValue(JetDefs.F_QUANTIZE, segment.quantize) + self.SetValue(JetDefs.F_TRANSPOSE, segment.transpose) + self.SetValue(JetDefs.F_REPEAT, segment.repeat) + maxMeasures = abs(int(self.je.ctrls[JetDefs.F_END].GetValue('int')[0])) + self.je.ctrls[JetDefs.F_EEND].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks) + self.je.ctrls[JetDefs.F_ESTART].SetMaxMbt(maxMeasures+1,md.maxBeats,md.maxTicks) + minMeasures = abs(int(self.je.ctrls[JetDefs.F_START].GetValue('int')[0])) + self.je.ctrls[JetDefs.F_EEND].SetMinMbt(minMeasures+1,0,0) + self.je.ctrls[JetDefs.F_ESTART].SetMinMbt(minMeasures+1,0,0) + self.je.ctrls[JetDefs.F_END].GetValue('int') + self.je.ctrls[JetDefs.F_ETRACK].SetRange(1, md.maxTracks) + self.je.ctrls[JetDefs.F_MUTEFLAGS].DeleteAllItems() + for track in md.trackList: + self.je.ctrls[JetDefs.F_MUTEFLAGS].AddTrackRow(track) + self.je.ctrls[JetDefs.F_MUTEFLAGS].CheckTracks(self.je.ctrls[JetDefs.F_MUTEFLAGS].GetValue()) + self.je.ctrls[JetDefs.F_MUTEFLAGS].SetTextColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT)) + self.je.ctrls[JetDefs.F_GRAPH].LoadSegment(segment, showLabels=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, 'bool', 'True'), showClips=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, 'bool', 'True'), showAppEvts=IniGetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, 'bool', 'True')) + + def OnPlay(self, event): + """ Plays the segment allowing interaction with events """ + if self.je.ctrls[JetDefs.F_PLAY].GetLabel() == JetDefs.BUT_STOP: + self.Player.SetKeepPlayingFlag(False) + return + + if not self.Validate(): + return + + jetevents = [] + jetevents.append(JetEvent(self.GetValue(JetDefs.F_ENAME), self.GetValue(JetDefs.F_ETYPE), + self.event_id, int(self.GetValue(JetDefs.F_ETRACK)), + int(self.GetValue(JetDefs.F_ECHANNEL)), + self.GetValue(JetDefs.F_ESTART), self.GetValue(JetDefs.F_EEND))) + + segment = JetSegment(self.GetValue(JetDefs.F_SEGNAME), + self.GetValue(JetDefs.F_MIDIFILE), + self.GetValue(JetDefs.F_START), + self.GetValue(JetDefs.F_END), + JetDefs.MBT_ZEROSTR, + self.GetValue(JetDefs.F_SEGNAME), + self.GetValue(JetDefs.F_QUANTIZE), + jetevents, + self.GetValue(JetDefs.F_DLSFILE), + None, + self.GetValue(JetDefs.F_TRANSPOSE), + self.GetValue(JetDefs.F_REPEAT), + self.GetValue(JetDefs.F_MUTEFLAGS)) + + self.Player = PreviewPlayer(self.je.ctrls[JetDefs.F_PLAY], segment) + self.Player.SetGraphCtrl(self.je.ctrls[JetDefs.F_GRAPH], self) + self.je.ctrls[JetDefs.F_GRAPH].ClickCallbackFct = self.GraphTriggerClip + self.Player.trigger_button = self.je.ctrls[JetDefs.F_ETRIGGERBUT] + self.Player.mute_button = self.je.ctrls[JetDefs.F_EMUTEBUT] + thread.start_new_thread(self.Player .Start, ()) + + def GraphTriggerClip(self, sClipName, iEventId): + """ Triggers a clip via graph """ + if self.Player is not None: + self.Player.GraphTriggerClip(sClipName, iEventId) + + def OnMute(self, event): + """ Mutes a track """ + if self.Player is not None: + self.Player.MuteTrackViaButton(self.je.ctrls[JetDefs.F_EMUTEBUT], + int(self.je.ctrls[JetDefs.F_ETRACK].GetValue())) + + def OnTriggerClip(self, event): + """ Triggers a clip """ + if self.Player is not None: + self.Player.TriggerClip(self.event_id) + + def OnSetGraphOptions(self, evt): + """ Sets graph options """ + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHLABELS, JetDefs.F_GRAPHLABELS, self.je.ctrls[JetDefs.F_GRAPHLABELS].GetValue()) + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHAPPEVTS, JetDefs.F_GRAPHAPPEVTS, self.je.ctrls[JetDefs.F_GRAPHAPPEVTS].GetValue()) + IniSetValue(self.currentJetConfigFile, JetDefs.F_GRAPHCLIPS, JetDefs.F_GRAPHCLIPS, self.je.ctrls[JetDefs.F_GRAPHCLIPS].GetValue()) + self.UpdateGraph() + + def OnReplicate(self, evt): + dlg = JetReplicate("Replicate Event") + dlg.SetValue(JetDefs.F_RPREPLACE, True) + dlg.SetName(self.GetValue(JetDefs.F_ENAME)) + dlg.event_type = self.GetValue(JetDefs.F_ETYPE) + dlg.event_max = self.segment.end + dlg.length = MbtDifference(ConvertStrTimeToTuple(self.GetValue(JetDefs.F_ESTART)), ConvertStrTimeToTuple(self.GetValue(JetDefs.F_EEND))) + result = dlg.ShowModal() + if result == wx.ID_OK: + self.replicatePrefix = dlg.GetValue(JetDefs.F_RPPREFIX) + self.lstReplicate = dlg.lstReplicate + self.chkReplaceMatching = dlg.GetValue(JetDefs.F_RPREPLACE) + self.EndModal(wx.ID_OK) + else: + dlg.Destroy() + +class JetReplicate(wx.Dialog): + """ Replicate dialog box """ + def __init__(self, title): + wx.Dialog.__init__(self, None, -1, title) + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) + self.je = JetEdit(self, "REPLICATE_CTRLS", self) + + self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(0,0,0) + self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1)) + self.je.ctrls[JetDefs.F_RPNUMBER].SetValue(1) + for title, width, fld in JetDefs.REPLICATE_GRID: + self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width) + self.lstReplicate = [] + + self.SetSize(JetDefs.REPLICATE_SIZE) + self.CenterOnParent() + + def OnOk(self, event): + self.EndModal(wx.ID_OK) + + def GetValue(self, fld): + return self.je.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + self.je.ctrls[fld].SetValue(val) + + def SetName(self, name): + for i in range(len(name), 1, -1): + if not name[i-1].isdigit() and name[i-1] <> ' ': + break + else: + name = name[0:i-1] + self.SetValue(JetDefs.F_RPPREFIX, name) + + def Validate(self): + if self.GetValue(JetDefs.F_RPPREFIX) == '': + InfoMsg("Message", "Prefix is required.") + return False + return True + + def OnPreview(self, event): + if not self.Validate(): + return + start = MbtVal(self.GetValue(JetDefs.F_ESTART)) + max = MbtVal(self.event_max) + increment = MbtVal((self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat(), self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick())) + + self.lstReplicate = [] + iTo = int(self.GetValue(JetDefs.F_RPNUMBER)) + for i in range(iTo): + evt_name = "%s %.2d" % (self.GetValue(JetDefs.F_RPPREFIX), i) + s_ticks = start + (i * increment) + s_mbt = TicksToMbt(s_ticks) + evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2]) + if self.event_type == JetDefs.E_CLIP or self.event_type == "SEGMENT": + e_ticks = s_ticks + self.length + e_mbt = TicksToMbt(e_ticks) + evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2]) + else: + e_ticks = s_ticks + evt_end = evt_start + if s_ticks <= max and e_ticks <= max: + self.lstReplicate.append((evt_name, evt_start, evt_end)) + + self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems() + self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstReplicate) + +class JetMove(wx.Dialog): + """ Move events dialog box """ + def __init__(self, title): + wx.Dialog.__init__(self, None, -1, title) + self.SetExtraStyle(wx.DIALOG_EX_CONTEXTHELP) + self.je = JetEdit(self, "MOVE_CTRLS", self) + + self.je.ctrls[JetDefs.F_RPINCREMENT].SetMinMbt(-999,-4,-480) + self.je.ctrls[JetDefs.F_RPINCREMENT].SetValue((-1,-1,-1)) + for title, width, fld in JetDefs.REPLICATE_GRID: + self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddCol(title, width) + self.lstMove = [] + self.lstMoveMbt = [] + self.lstMoveItems = [] + + self.SetSize(JetDefs.REPLICATE_SIZE) + self.CenterOnParent() + + def OnOk(self, event): + self.EndModal(wx.ID_OK) + + def GetValue(self, fld): + return self.je.ctrls[fld].GetValue() + + def SetValue(self, fld, val): + self.je.ctrls[fld].SetValue(val) + + def OnPreview(self, event): + increment = MbtVal((abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat()), abs(self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick()))) + if self.je.ctrls[JetDefs.F_RPINCREMENT].GetMeasure() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetBeat() < 0 or self.je.ctrls[JetDefs.F_RPINCREMENT].GetTick() < 0: + increment = 0 - increment + self.lstMove = [] + self.lstMoveMbt = [] + for itm in self.lstMoveItems: + max = MbtVal(itm[3]) + evt_name = itm[0] + start = MbtVal(itm[1]) + s_ticks = start + increment + + s_mbt = TicksToMbt(s_ticks) + evt_start = "%d:%d:%d" % (s_mbt[0]+1, s_mbt[1]+1, s_mbt[2]) + evt_start_save = "%d:%d:%d" % s_mbt + + end = MbtVal(itm[2]) + e_ticks = end + increment + e_mbt = TicksToMbt(e_ticks) + evt_end = "%d:%d:%d" % (e_mbt[0]+1, e_mbt[1]+1, e_mbt[2]) + evt_end_save = "%d:%d:%d" % e_mbt + + if s_ticks <= max and e_ticks <= max and s_ticks >= 0 and e_ticks >= 0: + self.lstMove.append((evt_name, evt_start, evt_end)) + self.lstMoveMbt.append((evt_name, evt_start_save, evt_end_save)) + + self.je.ctrls[JetDefs.F_RPGRDPREVIEW].DeleteAllItems() + self.je.ctrls[JetDefs.F_RPGRDPREVIEW].AddRows(self.lstMove) + +if __name__ == '__main1__': + """ Test dialogs """ + app = wx.PySimpleApp() + + #dlg = JetOpen() + #dlg = JetPropertiesDialog() + #dlg = ExportDialog("Export Jet File") + #dlg = JetAbout() + + dlg = JetReplicate("Replicate Event") + dlg.SetValue(JetDefs.F_RPREPLACE, True) + dlg.event_max = "5:0:0" + dlg.event_type = JetDefs.E_APP + dlg.length = 480 + dlg.SetName("abc 02") + result = dlg.ShowModal() + if result == wx.ID_OK: + print("OK") + + dlg.Destroy() + +if __name__ == '__main1__': + """ Test Segment dialog """ + app = wx.PySimpleApp() + + helpProvider = wx.SimpleHelpProvider() + wx.HelpProvider_Set(helpProvider) + + dlg = SegEdit("Segments", JetDefs.UNTITLED_FILE) + dlg.SetValue(JetDefs.F_SEGNAME, "Test Segment Name") + dlg.SetValue(JetDefs.F_MIDIFILE, '/Users/BHruska/JetContent/jenn_Burning Line.mid') + dlg.SetValue(JetDefs.F_MIDIFILE, 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid') + dlg.SetValue(JetDefs.F_DLSFILE, '') + dlg.SetValue(JetDefs.F_START, '4:0:0') + dlg.SetValue(JetDefs.F_END, '8:0:0') + dlg.SetValue(JetDefs.F_QUANTIZE, 6) + + result = dlg.ShowModal() + dlg.Destroy() + +if __name__ == '__main__': + """ Test Event dialog """ + app = wx.PySimpleApp() + + jetevents = [] + + segment = JetSegment("Test Segment Name", 'C:/_Data/JetCreator/JetDemo1/jenn_Burning Line.mid', + '0:0:0', '4:0:0', None, + "Test Segment Name", 6, jetevents, + '', None, 0,0,3) + + dlg = EventEdit("Event Edit", JetDefs.UNTITLED_FILE) + dlg.SetValue(JetDefs.F_ENAME, "Test Event Name") + dlg.SetValue(JetDefs.F_ETYPE, "TriggerClip") + dlg.SetSegment(segment) + + result = dlg.ShowModal() + dlg.Destroy() + + + diff --git a/jet_tools/JetCreator/JetFile.py b/jet_tools/JetCreator/JetFile.py new file mode 100755 index 0000000..d29db7e --- /dev/null +++ b/jet_tools/JetCreator/JetFile.py @@ -0,0 +1,775 @@ +""" + File: + JetFile.py + + Contents and purpose: + Auditions a jet file to simulate interactive music functions + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from __future__ import with_statement + +import logging +import ConfigParser +import struct +import os +import sys +import midifile + +from JetUtils import * +from JetDefs import * + +VERSION = '0.1' + +# JET file defines +JET_HEADER_STRUCT = '<4sl' +JET_HEADER_TAG = 'JET ' +JET_VERSION = 0x01000000 + +# JET chunk tags +JET_INFO_CHUNK = 'JINF' +JET_SMF_CHUNK = 'JSMF' +JET_DLS_CHUNK = 'JDLS' + +# JINF defines +JINF_STRUCT = '<4sl4sl4sl4sl' +JINF_JET_VERSION = 'JVER' +JINF_NUM_SMF_CHUNKS = 'SMF#' +JINF_NUM_DLS_CHUNKS = 'DLS#' + +# JCOP defines +JCOP_STRUCT = '<4sl' +JCOP_CHUNK = 'JCOP' + +# JAPP defines +JAPP_STRUCT = '<4sl' +JAPP_CHUNK = 'JAPP' + +# config file defines +OUTPUT_SECTION = 'output' +OUTPUT_FILENAME = 'filename' +OUTPUT_COPYRIGHT = 'copyright' +OUTPUT_APP_DATA = 'app_data' +OUTPUT_CHASE_CONTROLLERS = 'chase_controllers' +OUTPUT_OMIT_EMPTY_TRACKS = 'omit_empty_tracks' +SEGMENT_SECTION = 'segment' +SEGMENT_FILENAME = 'filename' +SEGMENT_DLSFILE = 'dlsfile' +SEGMENT_NAME = 'segname' +SEGMENT_START = 'start' +SEGMENT_END = 'end' +SEGMENT_END_MARKER = 'end_marker' +SEGMENT_QUANTIZE = 'quantize' +SEGMENT_OUTPUT = 'output' +SEGMENT_LENGTH = 'length' +SEGMENT_DUMP_FILE = 'dump' +SEGMENT_TRANSPOSE = 'transpose' +SEGMENT_REPEAT = 'repeat' +SEGMENT_MUTE_FLAGS = 'mute_flags' +LIBRARY_SECTION = 'libraries' +LIBRARY_FILENAME = 'lib' +CLIP_PREFIX = 'clip' +APP_PREFIX = 'app' + +# JET events +JET_EVENT_MARKER = 102 +JET_MARKER_LOOP_END = 0 +JET_EVENT_TRIGGER_CLIP = 103 + +class JetSegment (object): + """ Class to hold segments """ + def __init__ (self, segname, filename, start=None, end=None, length=None, output=None, quantize=None, jetevents=[], dlsfile=None, dump_file=None, transpose=0, repeat=0, mute_flags=0): + self.segname = segname + self.filename = filename + self.dlsfile = dlsfile + self.start = start + self.end = end + self.length = length + self.output = output + self.quantize = quantize + self.dump_file = dump_file + self.jetevents = jetevents + #API FIELDS FOR UI + self.transpose = transpose + self.repeat = repeat + self.mute_flags = mute_flags + +class JetEvent (object): + """ Class to hold events """ + def __init__(self, event_name, event_type, event_id, track_num, channel_num, event_start, event_end): + self.event_name = event_name + self.event_type = event_type + self.event_id = event_id + self.track_num = track_num + self.channel_num = channel_num + self.event_start = event_start + self.event_end = event_end + +class JetFileException (Exception): + """ Exceptions class """ + def __init__ (self, msg): + self.msg = msg + def __str__ (self): + return self.msg + +class JetSegmentFile (midifile.MIDIFile): + def ConvertMusicTimeToTicks (self, s): + measures, beats, ticks = s.split(':',3) + return self.ConvertToTicks(int(measures), int(beats), int(ticks)) + + def ExtractEvents (self, start, end, length, quantize, chase_controllers): + if (start is None) and (end is None) and (length is None): + logging.debug('ExtractEvents: No change') + return + + if start is not None: + start = self.ConvertMusicTimeToTicks(start) + else: + start = 0 + if end is not None: + end = self.ConvertMusicTimeToTicks(end) + elif length is not None: + length = self.ConvertMusicTimeToTicks(length) + end = start + length + + if quantize is not None: + quantize = int(quantize) + else: + quantize = 0 + + self.Trim(start, end, quantize, chase_controllers=chase_controllers) + #self.DumpTracks() + + def SyncClips (self): + """Add controller events to the start of a clip to keep it synced.""" + values = None + last_seq = 0 + for track in self.tracks: + for event in track.events: + + # find start of clip and chase events from last save point + if (event.msg_type == midifile.CONTROL_CHANGE) and \ + (event.controller == JET_EVENT_TRIGGER_CLIP) and \ + ((event.value & 0x40) == 0x40): + logging.debug('Syncing clip at %d ticks' % event.ticks) + values = track.events.ChaseControllers(event.seq, last_seq, values) + + #BTH; Seems to fix chase controller bug when multiple clips within segment + #last_seq = event.seq + + # generate event list from default values + clip_events = values.GenerateEventList(event.ticks) + + #for evt in clip_events: + # logging.info(evt) + + track.events.InsertEvents(clip_events, event.seq + 1) + + def AddJetEvents (self, jetevents): + for jet_event in jetevents: + if jet_event.event_type == JetDefs.E_CLIP: + #DumpEvent(jet_event) + + # sanity check + if jet_event.track_num >= len(self.tracks): + raise JetFileException('Track number %d of out of range for clip' % jet_event.track_num) + if jet_event.channel_num > 15: + raise JetFileException('Channel number %d of out of range for clip' % jet_event.channel_num) + if jet_event.event_id > 63: + raise JetFileException('event_id %d of out of range for clip' % jet_event.event_id) + + logging.debug('Adding trigger event for clip %d @ %s and %s' % (jet_event.event_id, jet_event.event_start, jet_event.event_end)) + + events = midifile.EventList() + events.append(midifile.ControlChangeEvent( + self.ConvertMusicTimeToTicks(jet_event.event_start), + 0, + jet_event.channel_num, + JET_EVENT_TRIGGER_CLIP, + jet_event.event_id | 0x40)) + + events.append(midifile.ControlChangeEvent( + self.ConvertMusicTimeToTicks(jet_event.event_end), + sys.maxint, + jet_event.channel_num, + JET_EVENT_TRIGGER_CLIP, + jet_event.event_id)) + + # merge trigger events + self.tracks[jet_event.track_num].events.MergeEvents(events) + + elif jet_event.event_type == JetDefs.E_EOS: + if jet_event.track_num >= len(self.tracks): + raise JetFileException('Track number %d of out of range for end marker' % jet_event.track_num) + if jet_event.channel_num > 15: + raise JetFileException('Channel number %d of out of range for end marker' % jet_event.channel_num) + + events = midifile.EventList() + logging.debug('Adding end marker at %s' % jet_event.event_start) + events.append(midifile.ControlChangeEvent( + self.ConvertMusicTimeToTicks(jet_event.event_start), + 0, + jet_event.channel_num, + JET_EVENT_MARKER, + JET_MARKER_LOOP_END)) + self.tracks[jet_event.track_num].events.MergeEvents(events) + + elif jet_event.event_type == JetDefs.E_APP: + if jet_event.track_num >= len(self.tracks): + raise JetFileException('Track number %d of out of range for app marker' % jet_event.track_num) + if jet_event.channel_num > 15: + raise JetFileException('Channel number %d of out of range for app marker' % jet_event.channel_num) + if jet_event.event_id > 83 or jet_event.event_id < 80: + raise JetFileException('EventID %d out of range for application controller' % jet_event.event_id) + + events = midifile.EventList() + logging.debug('Adding application controller at %s' % jet_event.event_start) + events.append(midifile.ControlChangeEvent( + self.ConvertMusicTimeToTicks(jet_event.event_start), + 0, + jet_event.channel_num, + jet_event.event_id, + jet_event.event_id)) + self.tracks[jet_event.track_num].events.MergeEvents(events) + +class JetFile (object): + """Write a JET file based on a configuration file.""" + def __init__ (self, config_file, options): + self.config_file = config_file + self.config = config = ConfigParser.ConfigParser() + if self.config_file == "": + self.InitializeConfig(JetDefs.UNTITLED_FILE) + if not FileExists(self.config_file): + self.InitializeConfig(self.config_file) + + config.read(self.config_file) + self.ParseConfig(options) + + def DumpConfig (self): + """Drump configuration to log file.""" + # dump configuration + config = self.config + for section in config.sections(): + logging.debug('[%s]' % section) + for option, value in config.items(section): + logging.debug('%s: %s' % (option, value)) + + def ParseConfig (self, options): + """Validate the configuration.""" + # check for output name + config = self.config + if config.has_option(OUTPUT_SECTION, OUTPUT_FILENAME): + config.filename = config.get(OUTPUT_SECTION, OUTPUT_FILENAME) + else: + raise JetFileException('No output filename in configuration file') + if config.filename == '' or config.filename == None: + config.filename = FileJustRoot(self.config_file) + ".JET" + config.chase_controllers = True + if config.has_option(OUTPUT_SECTION, OUTPUT_CHASE_CONTROLLERS): + try: + config.chase_controllers = config.getboolean(OUTPUT_SECTION, OUTPUT_CHASE_CONTROLLERS) + except: + pass + + config.delete_empty_tracks = False + if config.has_option(OUTPUT_SECTION, OUTPUT_OMIT_EMPTY_TRACKS): + try: + config.delete_empty_tracks = config.getboolean(OUTPUT_SECTION, OUTPUT_OMIT_EMPTY_TRACKS) + except: + pass + + config.copyright = None + if config.has_option(OUTPUT_SECTION, OUTPUT_COPYRIGHT): + config.copyright = config.get(OUTPUT_SECTION, OUTPUT_COPYRIGHT) + + config.app_data = None + if config.has_option(OUTPUT_SECTION, OUTPUT_APP_DATA): + config.app_data = config.get(OUTPUT_SECTION, OUTPUT_APP_DATA) + + # count segments + segments = [] + seg_num = 0 + while 1: + + # check for segment section + segment_name = SEGMENT_SECTION + str(seg_num) + if not config.has_section(segment_name): + break + + # initialize some parameters + start = end = length = output = end_marker = dlsfile = dump_file = None + transpose = repeat = mute_flags = 0 + jetevents = [] + + # get the segment parameters + segname = config.get(segment_name, SEGMENT_NAME) + filename = config.get(segment_name, SEGMENT_FILENAME) + if config.has_option(segment_name, SEGMENT_DLSFILE): + dlsfile = config.get(segment_name, SEGMENT_DLSFILE) + if config.has_option(segment_name, SEGMENT_START): + start = config.get(segment_name, SEGMENT_START) + if config.has_option(segment_name, SEGMENT_END): + end = config.get(segment_name, SEGMENT_END) + if config.has_option(segment_name, SEGMENT_LENGTH): + length = config.get(segment_name, SEGMENT_LENGTH) + if config.has_option(segment_name, SEGMENT_OUTPUT): + output = config.get(segment_name, SEGMENT_OUTPUT) + if config.has_option(segment_name, SEGMENT_QUANTIZE): + quantize = config.get(segment_name, SEGMENT_QUANTIZE) + if config.has_option(segment_name, SEGMENT_DUMP_FILE): + dump_file = config.get(segment_name, SEGMENT_DUMP_FILE) + #API FIELDS + if config.has_option(segment_name, SEGMENT_TRANSPOSE): + transpose = config.get(segment_name, SEGMENT_TRANSPOSE) + if config.has_option(segment_name, SEGMENT_REPEAT): + repeat = config.get(segment_name, SEGMENT_REPEAT) + if config.has_option(segment_name, SEGMENT_MUTE_FLAGS): + mute_flags = config.get(segment_name, SEGMENT_MUTE_FLAGS) + + if config.has_option(segment_name, SEGMENT_END_MARKER): + end_marker = config.get(segment_name, SEGMENT_END_MARKER) + track_num, channel_num, event_time = end_marker.split(',',2) + #jetevents.append((JetDefs.E_EOS, 0, int(track_num), int(channel_num), event_time, '')) + jetevents.append(JetEvent(JetDefs.E_EOS, JetDefs.E_EOS, 0, int(track_num), int(channel_num), event_time, event_time)) + + # check for jetevents + for jetevent, location in config.items(segment_name): + if jetevent.startswith(CLIP_PREFIX): + event_name, event_id, track_num, channel_num, event_start, event_end = location.split(',', 5) + jetevents.append(JetEvent(event_name, JetDefs.E_CLIP, int(event_id), int(track_num), int(channel_num), event_start, event_end)) + + # check for appevents + for jetevent, location in config.items(segment_name): + if jetevent.startswith(APP_PREFIX): + event_name, event_id, track_num, channel_num, event_start, event_end = location.split(',', 5) + jetevents.append(JetEvent(event_name, JetDefs.E_APP, int(event_id), int(track_num), int(channel_num), event_start, event_end)) + + segments.append(JetSegment(segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, int(transpose), int(repeat), int(mute_flags))) + seg_num += 1 + + self.segments = segments + if not len(segments): + #TODO: Check for segments when writing + #raise JetFileException('No segments defined in configuration file') + pass + + # count libraries + libraries = [] + lib_num = 0 + while 1: + library_name = LIBRARY_FILENAME + str(lib_num) + if not config.has_option(LIBRARY_SECTION, library_name): + break + libraries.append(config.get(LIBRARY_SECTION, library_name)) + lib_num += 1 + self.libraries = libraries + + def WriteJetFileFromConfig (self, options): + """Write JET file from config file.""" + + # open the output file and write the header + output_file = open(self.config.filename, 'wb') + jet_header = struct.pack(JET_HEADER_STRUCT, JET_HEADER_TAG, 0) + output_file.write(jet_header) + + # write the JINF chunk + jet_info = struct.pack(JINF_STRUCT, + JET_INFO_CHUNK, struct.calcsize(JINF_STRUCT) - 8, + JINF_JET_VERSION, JET_VERSION, + JINF_NUM_SMF_CHUNKS, len(self.segments), + JINF_NUM_DLS_CHUNKS, len(self.libraries)) + output_file.write(jet_info) + + # write the JCOP chunk (if any) + if self.config.copyright is not None: + size = len(self.config.copyright) + 1 + if size & 1: + size += 1 + extra_byte = True + else: + extra_byte = False + jet_copyright = struct.pack(JCOP_STRUCT, JCOP_CHUNK, size) + output_file.write(jet_copyright) + output_file.write(self.config.copyright) + output_file.write(chr(0)) + if extra_byte: + output_file.write(chr(0)) + + # write the app data chunk (if any) + if self.config.app_data is not None: + size = os.path.getsize(self.config.app_data) + if size & 1: + size += 1 + extra_byte = True + else: + extra_byte = False + jet_app_data = struct.pack(JAPP_STRUCT, JAPP_CHUNK, size) + output_file.write(jet_app_data) + with open(self.config.app_data, 'rb') as f: + output_file.write(f.read()) + if extra_byte: + output_file.write(chr(0)) + + # copy the MIDI segments + seg_num = 0 + for segment in self.segments: + logging.debug('Writing segment %d' % seg_num) + + # open SMF file and read it + jet_segfile = JetSegmentFile(segment.filename, 'rb') + jet_segfile.ReadFromStream() + + # insert events + jet_segfile.AddJetEvents(segment.jetevents) + + # trim to length specified in config file + jet_segfile.ExtractEvents(segment.start, segment.end, segment.length, segment.quantize, self.config.chase_controllers) + + # chase controller events and fix them + if self.config.chase_controllers: + jet_segfile.SyncClips() + + # delete empty tracks + if self.config.delete_empty_tracks: + jet_segfile.DeleteEmptyTracks() + + # write separate output file if requested + if segment.output is not None: + jet_segfile.SaveAs(segment.output) + + # write dump file + if segment.dump_file is not None: + with open(segment.dump_file, 'w') as f: + jet_segfile.DumpTracks(f) + + # write the segment header + header_pos = output_file.tell() + smf_header = struct.pack(JET_HEADER_STRUCT, JET_SMF_CHUNK, 0) + output_file.write(smf_header) + start_pos = output_file.tell() + + # write SMF file to output file + jet_segfile.Write(output_file, offset=start_pos) + jet_segfile.close() + + # return to segment header and write actual size + end_pos = output_file.tell() + file_size = end_pos - start_pos + if file_size & 1: + file_size += 1 + end_pos += 1 + output_file.seek(header_pos, 0) + smf_header = struct.pack(JET_HEADER_STRUCT, JET_SMF_CHUNK, file_size) + output_file.write(smf_header) + output_file.seek(end_pos, 0) + + seg_num += 1 + + # copy the DLS segments + for library in self.libraries: + if FileExists(library): + # open SMF file and get size + lib_file = (open(library,'rb')) + lib_file.seek(0,2) + file_size = lib_file.tell() + lib_file.seek(0) + + # write the library header + dls_header = struct.pack(JET_HEADER_STRUCT, JET_DLS_CHUNK, file_size) + output_file.write(dls_header) + + # copy DLS file to output file + output_file.write(lib_file.read()) + lib_file.close() + + # write the header with the read data size + file_size = output_file.tell() + output_file.seek(0) + jet_header = struct.pack(JET_HEADER_STRUCT, JET_HEADER_TAG, file_size - struct.calcsize(JET_HEADER_STRUCT)) + output_file.write(jet_header) + output_file.close() + + def GetMidiFiles(self): + """ Gets a list of midifiles """ + midiFiles = [] + for segment in self.segments: + if segment.filename not in midiFiles: + midiFiles.append(segment.filename) + return midiFiles + + def GetLibraries(self): + """ Gets the libraries """ + return self.libraries + + def GetEvents(self, segName): + """ Gets the events for a segment """ + for segment in self.segments: + if segment.segname == segName: + return segment.jetevents + return None + + def GetEvent(self, segName, eventName): + """ Gets a single event from a segment """ + for segment in self.segments: + if segment.segname == segName: + for event in segment.jetevents: + if event.event_name == eventName: + return event + return None + + def AddEvent(self, segname, event_name, event_type, event_id, track_num, channel_num, event_start, event_end): + """ Adds an event """ + for segment in self.segments: + if segment.segname == segname: + segment.jetevents.append(JetEvent(event_name, event_type, int(event_id), int(track_num), int(channel_num), event_start, event_end)) + + def ReplaceEvents(self, segname, newEvents): + """ Replaces all events """ + for segment in self.segments: + if segment.segname == segname: + segment.jetevents = newEvents + return segment + + def UpdateEvent(self, segname, orgeventname, event_name, event_type, event_id, track_num, channel_num, event_start, event_end): + """ Updates an event """ + for segment in self.segments: + if segment.segname == segname: + for jetevent in segment.jetevents: + if jetevent.event_name == orgeventname: + jetevent.event_name = event_name + jetevent.event_type = event_type + jetevent.event_id = event_id + jetevent.track_num = track_num + jetevent.channel_num = channel_num + jetevent.event_start = event_start + jetevent.event_end = event_end + + def DeleteSegmentsMatchingPrefix(self, prefix): + """ Deletes all segments matching name """ + iOnce = True + iAgain = False + while(iOnce or iAgain): + iOnce = False + iAgain = False + for segment in self.segments: + if segment.segname[0:len(prefix)].upper() == prefix.upper(): + self.segments.remove(segment) + iAgain = True + + def DeleteEvent(self, segname, event_name): + """ Deletes an event """ + for segment in self.segments: + if segment.segname == segname: + for jetevent in segment.jetevents: + if jetevent.event_name == event_name: + segment.jetevents.remove(jetevent) + + def DeleteEventsMatchingPrefix(self, segname, prefix): + """ Deletes all events matching name """ + for segment in self.segments: + if segment.segname == segname: + iOnce = True + iAgain = False + while(iOnce or iAgain): + iOnce = False + iAgain = False + for jetevent in segment.jetevents: + if jetevent.event_name[0:len(prefix)].upper() == prefix.upper(): + segment.jetevents.remove(jetevent) + iAgain = True + + def MoveEvent(self, segname, movename, event_start, event_end): + """ Move an event """ + for segment in self.segments: + if segment.segname == segname: + for jetevent in segment.jetevents: + if jetevent.event_name == movename: + jetevent.event_start = event_start + jetevent.event_end = event_end + return + + def GetSegments(self): + """ Gets all segments """ + return self.segments + + def GetSegment(self, segName): + """ Gets one segment by name """ + for segment in self.segments: + if segment.segname == segName: + return segment + return None + + def AddSegment(self, segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, transpose, repeat, mute_flags): + """ Adds a segment """ + if length == JetDefs.MBT_ZEROSTR: + length = None + if end == JetDefs.MBT_ZEROSTR: + end = None + self.segments.append(JetSegment(segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, transpose, repeat, mute_flags)) + + def UpdateSegment(self, orgsegname, segname, filename, start, end, length, output, quantize, jetevents, dlsfile, dump_file, transpose, repeat, mute_flags): + """ Updates a segment """ + if length == JetDefs.MBT_ZEROSTR: + length = None + if end == JetDefs.MBT_ZEROSTR: + end = None + for segment in self.segments: + if segment.segname == orgsegname: + segment.segname = segname + segment.filename = filename + segment.start = start + segment.end = end + segment.length = length + segment.output = output + segment.quantize = quantize + segment.dlsfile = dlsfile + segment.transpose = transpose + segment.repeat = repeat + segment.mute_flags = mute_flags + + def MoveSegment(self, segname, start, end): + """ Moves a segment """ + for segment in self.segments: + if segment.segname == segname: + segment.start = start + segment.end = end + return + + def DeleteSegment(self, segname): + """ Deletes a segment """ + for segment in self.segments: + if segment.segname == segname: + self.segments.remove(segment) + + def SaveJetConfig(self, configFile): + """ Saves the jet config file """ + if self.config.filename == '' or self.config.filename == None: + self.config.filename = FileJustRoot(configFile) + ".JET" + config = ConfigParser.ConfigParser() + config.add_section(OUTPUT_SECTION) + config.set(OUTPUT_SECTION, OUTPUT_FILENAME, self.config.filename) + config.set(OUTPUT_SECTION, OUTPUT_CHASE_CONTROLLERS, self.config.chase_controllers) + config.set(OUTPUT_SECTION, OUTPUT_OMIT_EMPTY_TRACKS, self.config.delete_empty_tracks) + if self.config.copyright is not None: + config.set(OUTPUT_SECTION, OUTPUT_COPYRIGHT, self.config.copyright) + if self.config.app_data is not None: + config.set(OUTPUT_SECTION, OUTPUT_APP_DATA, self.config.app_data) + + self.libraries = [] + seg_num = 0 + for segment in self.segments: + segment_name = SEGMENT_SECTION + str(seg_num) + config.add_section(segment_name) + config.set(segment_name, SEGMENT_NAME, segment.segname) + config.set(segment_name, SEGMENT_FILENAME, segment.filename) + + config.set(segment_name, SEGMENT_DLSFILE, segment.dlsfile) + if FileExists(segment.dlsfile): + if not segment.dlsfile in self.libraries: + self.libraries.append(segment.dlsfile) + config.set(segment_name, SEGMENT_START, segment.start) + if segment.end > JetDefs.MBT_ZEROSTR and len(segment.end) > 0: + config.set(segment_name, SEGMENT_END, segment.end) + if segment.length > JetDefs.MBT_ZEROSTR and len(segment.length) > 0: + config.set(segment_name, SEGMENT_LENGTH, segment.length) + config.set(segment_name, SEGMENT_OUTPUT, segment.output) + config.set(segment_name, SEGMENT_QUANTIZE, segment.quantize) + if segment.dump_file is not None: + config.set(segment_name, SEGMENT_DUMP_FILE, segment.dump_file) + config.set(segment_name, SEGMENT_TRANSPOSE, segment.transpose) + config.set(segment_name, SEGMENT_REPEAT, segment.repeat) + config.set(segment_name, SEGMENT_MUTE_FLAGS, segment.mute_flags) + + clip_num = 0 + app_num = 0 + for jet_event in segment.jetevents: + if jet_event.event_type == JetDefs.E_CLIP: + clip_name = CLIP_PREFIX + str(clip_num) + s = "%s,%s,%s,%s,%s,%s" % (jet_event.event_name, jet_event.event_id, jet_event.track_num, jet_event.channel_num, jet_event.event_start, jet_event.event_end) + config.set(segment_name, clip_name, s) + clip_num += 1 + elif jet_event.event_type == JetDefs.E_APP: + app_name = APP_PREFIX + str(app_num) + s = "%s,%s,%s,%s,%s,%s" % (jet_event.event_name, jet_event.event_id, jet_event.track_num, jet_event.channel_num, jet_event.event_start, jet_event.event_end) + config.set(segment_name, app_name, s) + app_num += 1 + elif jet_event.event_type == JetDefs.E_EOS: + s = "%s,%s,%s" % (jet_event.track_num, jet_event.channel_num, jet_event.event_start) + config.set(segment_name, SEGMENT_END_MARKER, s) + + seg_num += 1 + + lib_num = 0 + config.add_section(LIBRARY_SECTION) + for library in self.libraries: + library_name = LIBRARY_FILENAME + str(lib_num) + config.set(LIBRARY_SECTION, library_name, library) + lib_num += 1 + + FileKillClean(configFile) + cfgfile = open(configFile,'w') + config.write(cfgfile) + cfgfile.close() + + def InitializeConfig(self, configFile): + """ Initializes the values for an empty flag """ + self.config.filename = FileJustRoot(configFile) + ".JET" + self.config.chase_controllers = True + self.config.delete_empty_tracks = False + self.config.copyright = None + self.config.app_data = None + self.segments = [] + self.libraries = [] + self.config_file = configFile + self.SaveJetConfig(configFile) + + + +#--------------------------------------------------------------- +# main +#--------------------------------------------------------------- +if __name__ == '__main__': + sys = __import__('sys') + optparse = __import__('optparse') + + # parse command line options + parser = optparse.OptionParser(version=VERSION) + parser.set_defaults(log_level=logging.INFO, log_file=None) + parser.add_option('-d', '--debug', action="store_const", const=logging.DEBUG, dest='log_level', help='Enable debug output') + parser.add_option('-l', '--log_file', dest='log_file', help='Write debug output to log file') + (options, args) = parser.parse_args() + + # get master logger + logger = logging.getLogger('') + logger.setLevel(options.log_level) + + # create console logger + console_logger = logging.StreamHandler() + console_logger.setFormatter(logging.Formatter('%(message)s')) + logger.addHandler(console_logger) + + # create rotating file logger + if options.log_file is not None: + file_logger = logging.FileHandler(options.log_file, 'w') + file_logger.setFormatter(logging.Formatter('%(message)s')) + logger.addHandler(file_logger) + + # process files + for arg in args: + print arg + jet_file = JetFile(arg, options) + jet_file.WriteJetFileFromConfig(options) + diff --git a/jet_tools/JetCreator/JetHelp.py b/jet_tools/JetCreator/JetHelp.py new file mode 100755 index 0000000..1606a2a --- /dev/null +++ b/jet_tools/JetCreator/JetHelp.py @@ -0,0 +1,33 @@ +""" + File: + JetHelp.py + + Contents and purpose: + Displays the help text + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import wx +import wx.html +from JetDefs import * + +app = wx.PySimpleApp() +frame = wx.Frame(None, -1, JetDefs.MAIN_HELPTITLE, size=(800,600)) +html1 = wx.html.HtmlWindow(frame, -1) +html1.LoadPage(JetDefs.MAIN_HELPFILE) +frame.Center() +frame.Show() +app.MainLoop() diff --git a/jet_tools/JetCreator/JetPreview.py b/jet_tools/JetCreator/JetPreview.py new file mode 100755 index 0000000..34c16d3 --- /dev/null +++ b/jet_tools/JetCreator/JetPreview.py @@ -0,0 +1,200 @@ +""" + File: + JetPreview.py + + Contents and purpose: + Plays the preview of a segment or event via the dialog box + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from __future__ import with_statement + +import wx +import threading + +from JetDefs import * +from JetCtrls import * +from JetFile import * +from JetUtils import * +from eas import * +from JetStatusEvent import * + +class PreviewPlayer(wx.Frame): + """ Segment player """ + def __init__ (self, play_button, segment): + self.segment = segment + self.play_button = play_button + self.mute_button = None + self.trigger_button = None + self.playerLock = threading.RLock() + self.SetKeepPlayingFlag(False) + self.graph = None + + def SetGraphCtrl(self, graph, parentWin): + """ Sets the graph control for the player """ + self.graph = graph + self.parentWin = parentWin + + def SetGraphCallbackFct(self, ClickCallbackFct): + """ Sets the callback function for the graph control to update """ + self.ClickCallbackFct = ClickCallbackFct + + def GraphTriggerClip(self, sClipName, iEventId): + """ Triggers a clip by clicking on it """ + with self.playerLock: + try: + self.jet.TriggerClip(iEventId) + return True + except: + return False + + def SetMuteFlag(self, trackNum, mute): + """ Sets a mute flag """ + sync = JetDefs.DEFAULT_MUTE_SYNC + with self.playerLock: + try: + self.jet.SetMuteFlag(trackNum, mute, sync) + logging.info("SetMuteFlag() Track:%d Mute:%d Sync:%d" % (trackNum, mute, sync)) + return True + except: + return False + + def TriggerClip(self, eventID): + """ Triggers a clip via function """ + with self.playerLock: + try: + self.jet.TriggerClip(eventID) + logging.info("TriggerClip() eventID: %d" % eventID) + return True + except: + return False + + def MuteTrackViaButton(self, button, trackNum): + """ Mutes a track via a button """ + with self.playerLock: + self.mute_button = button + if button.GetLabel() == JetDefs.BUT_MUTE: + if self.SetMuteFlag(trackNum, True): + button.SetLabel(JetDefs.BUT_UNMUTE) + else: + if self.SetMuteFlag(trackNum, False): + button.SetLabel(JetDefs.BUT_MUTE) + + def Start(self): + """ Starts the playback. Called as a thread from dialog boxes """ + self.paused = False + + wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PLAY, None)) + + # create a temporary config file, and jet output file + FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE) + + self.jet_file = JetFile(JetDefs.TEMP_JET_CONFIG_FILE, "") + + self.jet_file.AddSegment(self.segment.segname, + self.segment.filename, + self.segment.start, + self.segment.end, + self.segment.length, + SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE), + self.segment.quantize, + self.segment.jetevents, + self.segment.dlsfile, + None, + self.segment.transpose, + self.segment.repeat, + self.segment.mute_flags) + userID = 0 + dls_num = -1 + seg_num = 0 + + if len(self.segment.dlsfile) > 0: + self.jet_file.libraries.append(self.segment.dlsfile) + dls_num = 0 + + self.jet_file.SaveJetConfig(JetDefs.TEMP_JET_CONFIG_FILE) + self.jet_file.WriteJetFileFromConfig(JetDefs.TEMP_JET_CONFIG_FILE) + + if not ValidateConfig(self.jet_file): + return + + self.queueSegs = [] + self.queueSegs.append(QueueSeg(self.segment.segname, userID, seg_num, dls_num, self.segment.repeat, self.segment.transpose, self.segment.mute_flags)) + + self.jet = JET() + self.jet.eas.StartWave() + self.jet.OpenFile(self.jet_file.config.filename) + + # queue first segment and start playback + index = 0 + Queue(self.jet, self.queueSegs[index]) + + index += 1 + self.jet.Play() + + self.SetKeepPlayingFlag(True) + while self.GetKeepPlayingFlag(): + self.jet.Render() + status = self.jet.Status() + + # if no more segments - we're done + if status.numQueuedSegments == 0: + break + + self.jet.GetAppEvent() + + # if less than 2 segs queued - queue another one + if (index < len(self.queueSegs)) and (status.numQueuedSegments < 2): + Queue(self.jet, self.queueSegs[index]) + index += 1 + + wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, status.location)) + + SafeJetShutdown(self.playerLock, self.jet) + + FileKillClean(SegmentOutputFile(self.segment.segname, JetDefs.TEMP_JET_CONFIG_FILE)) + FileKillClean(JetDefs.TEMP_JET_CONFIG_FILE) + FileKillClean(self.jet_file.config.filename) + + self.SetKeepPlayingFlag(False) + + wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_DONE, None)) + + wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_UPD_LOCATION, 0)) + + def SetKeepPlayingFlag(self, val): + """ Sets the flag to tell us wheter to keep playing """ + with self.playerLock: + self.keepPlaying = val + + def GetKeepPlayingFlag(self): + """ Gets the keep playing flag """ + with self.playerLock: + return self.keepPlaying + + def Pause(self): + """ Pauses playback """ + if self.jet is None: + return + if not self.paused: + self.jet.Pause() + self.paused = True + wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_PAUSE, None)) + else: + self.jet.Play() + self.paused = False + wx.PostEvent(self.parentWin, JetStatusEvent(JetDefs.PST_RESUME, None)) + diff --git a/jet_tools/JetCreator/JetSegGraph.py b/jet_tools/JetCreator/JetSegGraph.py new file mode 100755 index 0000000..04d4ca3 --- /dev/null +++ b/jet_tools/JetCreator/JetSegGraph.py @@ -0,0 +1,361 @@ +""" + File: + JetSegGraph.py + + Contents and purpose: + Draws the event graph and progress bar + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + + +import wx +import logging + +from JetUtils import * +from JetDefs import * + +GRAPH_COLORS = [ + '#C0E272', + '#85CF89', + '#CF9683', + '#749EDE', + '#9FB5B1', + '#B095BF', + '#FE546D', + '#B3BB97', + '#FFFFB8', + + ] + +PROGRESS_BAR = '#0000CC' +EOS_BAR = '#095000' +APP_BAR = '#B3BB97' + + +class Marker(): + """ Defines portions of the graph for events """ + def __init__(self, sEventType, iEventId, sName, sStartMbt, sEndMbt, iStartMeasure, ppqn): + self.sEventType = sEventType + self.iEventId = iEventId + self.sName = sName + self.StartMbt = ConvertStrTimeToTuple(sStartMbt) + self.EndMbt = ConvertStrTimeToTuple(sEndMbt) + self.iStartMeasure = iStartMeasure + self.iStart = 0 + self.iEnd = 0 + self.iWidth = 0 + self.iHeight = 0 + self.iTop = 0 + self.iUpdate = False + self.sColor = '#FFFFB8' + self.ppqn = ppqn + self.isDirty = False + + def CalcCoord(self, step, height, ColorFct): + """ Calculates the coordinates in pixels for graphing the shaded regions """ + #measures + iStartM = self.StartMbt[0] - self.iStartMeasure + iEndM = self.EndMbt[0] - self.iStartMeasure + self.iStart = step * iStartM + self.iEnd = step * iEndM + #beats + self.iStart = self.iStart + ((step / 4.0) * (self.StartMbt[1]-1)) + self.iEnd = self.iEnd + ((step / 4.0) * (self.EndMbt[1]-1)) + #ticks + pctTickOfBeat = (float(self.StartMbt[2]) / float(self.ppqn)) + self.iStart = self.iStart + ((pctTickOfBeat * (step / 4.0))) + pctTickOfBeat = (float(self.EndMbt[2]) / float(self.ppqn)) + self.iEnd = self.iEnd + ((pctTickOfBeat * (step / 4.0))) + + self.iWidth = self.iEnd - self.iStart + + self.iHeight = height + self.sColor = ColorFct() + self.iUpdate = False + +class SegmentGraph(wx.Panel): + """ Draws the player graph bar """ + def __init__(self, parent, pos=wx.DefaultPosition, size=wx.DefaultSize, ClickCallbackFct=None, showLabels=True, showClips=True, showAppEvts=True): + wx.Panel.__init__(self, parent, -1, pos=pos, size=size, style=wx.BORDER_STATIC) + self.iLocationInMs = 0 + self.iLengthInMs = 0 + self.iLengthInMeasures = 0 + self.iMarkerTop = 15 + self.iScaleTop = 0 + self.iEdges = 5 + self.iStartMeasure = 0 + self.iMidiMode = False + self.ClickCallbackFct = ClickCallbackFct + self.iColor = 0 + self.showLabels = showLabels + self.showClips = showClips + self.showAppEvts = showAppEvts + + self.font = wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, 'Courier') + + self.Markers = [] + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) + self.Bind(wx.EVT_PAINT, self.OnPaint) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) + + #initialize buffer + self.OnSize(None) + + def ClearGraph(self): + """ Clears the graph values """ + self.iLocationInMs = 0 + self.iLengthInMs = 0 + self.iLengthInMeasures = 0 + self.iMarkerTop = 15 + self.iScaleTop = 0 + self.iEdges = 5 + self.iStartMeasure = 0 + self.iMidiMode = False + self.iColor = 0 + self.Markers = [] + self.iLocationInMs = 0 + self.DoDrawing() + + def LoadSegment(self, segment, segMarker=None, iMidiMode=False, showLabels=True, showClips=True, showAppEvts=True): + """ Loads up the segment drawing the graph """ + if segment is None: + self.ClearGraph() + return None + self.iMidiMode = iMidiMode + self.showLabels = showLabels + self.showClips = showClips + self.showAppEvts = showAppEvts + self.Markers = [] + self.iLocationInMs = 0 + info = MidiSegInfo(segment) + #disable graph for debugging + #return info + self.iLengthInMs = info.iLengthInMs + self.ppqn = info.ppqn + self.StartMbt = mbtFct(ConvertStrTimeToTuple(segment.start), 1) + self.EndMbt = mbtFct(ConvertStrTimeToTuple(segment.end), 1) + self.LengthMbt = None + self.iStartMeasure = self.StartMbt[0] + self.iLengthInMeasures = self.EndMbt[0] - self.StartMbt[0] + + for jet_event in segment.jetevents: + if self.showClips and jet_event.event_type == JetDefs.E_CLIP: + self.AddMarker(JetDefs.E_CLIP, jet_event.event_id, jet_event.event_name, mbtFct(jet_event.event_start,1), mbtFct(jet_event.event_end,1), self.iStartMeasure, self.ppqn) + elif jet_event.event_type == JetDefs.E_EOS: + self.AddMarker(JetDefs.E_EOS, jet_event.event_id, jet_event.event_name, mbtFct(jet_event.event_end,1), mbtFct(jet_event.event_end,1), self.iStartMeasure, self.ppqn) + elif self.showAppEvts and jet_event.event_type == JetDefs.E_APP: + self.AddMarker(JetDefs.E_APP, jet_event.event_id, jet_event.event_name, mbtFct(jet_event.event_start,1), mbtFct(jet_event.event_end,1), self.iStartMeasure, self.ppqn) + + if segMarker is not None: + self.AddMarker(JetDefs.E_CLIP, 0, segMarker[0], mbtFct(segMarker[1],1), mbtFct(segMarker[2],1), self.iStartMeasure, self.ppqn) + + self.DoDrawing() + return info + + def AddMarker(self, sEventType, iEventId, sName, sStartMbt, sEndMbt, iStartMeasure, ppqn): + """ Adds a marker to the list """ + if not CompareMbt(sStartMbt, sEndMbt): + sEndMbt = sStartMbt + self.Markers.append(Marker(sEventType, iEventId, sName, sStartMbt, sEndMbt, iStartMeasure, ppqn)) + + def OnLeftDown(self, event): + """ Calls the function assicated with an event """ + pt = event.GetPosition() + for Marker in self.Markers: + if pt[0] >= Marker.iStart and pt[0] <= Marker.iEnd and pt[1] >= Marker.iTop and pt[1] <= Marker.iTop + Marker.iHeight: + if self.ClickCallbackFct != None: + self.ClickCallbackFct(Marker.sName, Marker.iEventId) + + def GetAColor(self): + """ Gets a color """ + color = GRAPH_COLORS[self.iColor] + self.iColor = self.iColor + 1 + if self.iColor >= len(GRAPH_COLORS): + self.iColor = 0 + return color + + def OnSize(self, event=None): + """ Repaints for resizing of screen """ + if OsWindows(): + # The Buffer init is done here, to make sure the buffer is always + # the same size as the Window + Size = self.GetClientSizeTuple() + + # Make new offscreen bitmap: this bitmap will always have the + # current drawing in it, so it can be used to save the image to + # a file, or whatever. + self._Buffer = wx.EmptyBitmap(*Size) + self.DoDrawing(None) + if event is not None: + event.Skip() + + def OnPaint(self, event=None): + """ Painting of windows """ + if OsWindows(): + dc = wx.BufferedPaintDC(self, self._Buffer) + else: + dc = wx.AutoBufferedPaintDC(self) + dc.Background = wx.Brush(wx.WHITE) + self.DoDrawing(dc) + + def DoDrawing(self, dc=None): + """ Does the actual drawing of the control """ + if dc is None: + if OsWindows(): + dc = wx.BufferedDC(wx.ClientDC(self), self._Buffer) + else: + dc = wx.AutoBufferedPaintDC(self) + dc.Background = wx.Brush(wx.WHITE) + + dc.Clear() + + self.iColor = 0 + gWidth, gHeight = self.GetSize() + gWidth = gWidth - (self.iEdges * 2) + step = int(gWidth / (self.iLengthInMeasures + .01)) + + for Marker in self.Markers: + Marker.CalcCoord(step, gHeight, self.GetAColor) + + """ eliminate overlaps; establish colors """ + iClips = 0 + iMarkers = 0 + for index, Marker in enumerate(self.Markers): + if Marker.sEventType == JetDefs.E_CLIP: + iClips = iClips + 1 + iOverlaps = 1 + for index1, Marker1 in enumerate(self.Markers): + if Marker.sEventType == JetDefs.E_CLIP: + if index != index1 and not Marker1.iUpdate: + if Marker.iStart <= Marker1.iStart and Marker.iEnd <= Marker1.iEnd and Marker.iEnd >= Marker1.iStart: + iOverlaps = iOverlaps + 1 + Marker.iUpdate = True + Marker1.iUpdate = True + if not Marker.iUpdate and Marker.iStart >= Marker1.iStart and Marker.iEnd >= Marker1.iEnd and Marker.iStart <= Marker1.iEnd: + iOverlaps = iOverlaps + 1 + Marker.iUpdate = True + Marker1.iUpdate = True + if iOverlaps > 1: + iTop = 0 + for index1, Marker1 in enumerate(self.Markers): + if Marker.sEventType == JetDefs.E_CLIP: + if Marker1.iUpdate: + Marker1.iHeight = gHeight / iOverlaps + Marker1.iTop = iTop * Marker1.iHeight + iTop = iTop + 1 + elif Marker.sEventType == JetDefs.E_APP: + iMarkers = iMarkers + 1 + + for Marker in self.Markers: + if Marker.sEventType == JetDefs.E_CLIP: + dc.SetPen(wx.Pen(Marker.sColor)) + dc.SetBrush(wx.Brush(Marker.sColor)) + dc.DrawRectangle(Marker.iStart + self.iEdges, Marker.iTop, Marker.iWidth, Marker.iHeight) + width, height = dc.GetTextExtent(Marker.sName) + k = ((Marker.iStart + Marker.iEnd) / 2) - (width/2) + self.iEdges + if self.showLabels or self.iMidiMode: + dc.DrawText(Marker.sName, k, ((Marker.iTop+Marker.iHeight/2) - (height*.5))) + if self.iMidiMode: + self.iMidiModeStart = Marker.iStart + elif Marker.sEventType == JetDefs.E_EOS: + dc.SetPen(wx.Pen(EOS_BAR)) + dc.SetBrush(wx.Brush(EOS_BAR)) + dc.DrawRectangle(Marker.iStart + self.iEdges, Marker.iTop, 1, Marker.iHeight) + width, height = dc.GetTextExtent(Marker.sName) + k = Marker.iStart - (width/2) + self.iEdges + dc.DrawText(Marker.sName, k, ((Marker.iTop+Marker.iHeight/2) - (height*.5))) + elif Marker.sEventType == JetDefs.E_APP: + dc.SetPen(wx.Pen(APP_BAR)) + dc.SetBrush(wx.Brush(APP_BAR)) + dc.DrawRectangle(Marker.iStart + self.iEdges, Marker.iTop, 1, Marker.iHeight) + width, height = dc.GetTextExtent(Marker.sName) + k = Marker.iStart - (width/2) + self.iEdges + if self.showLabels or self.iMidiMode: + dc.DrawText(Marker.sName, k, ((Marker.iTop+Marker.iHeight/2) - (height*.5))) + + + """ Draw scale """ + if gWidth == 0: + iDiv = 50 + else: + iDiv = (gWidth)/18 + if iDiv == 0: + iDiv = 50 + scale = ((self.iLengthInMeasures / iDiv) + 1) + if scale == 0: + scale = 1 + beatStep = step / 4.0 + dc.SetFont(self.font) + j = 0 + lastEnd = 0 + num = range(self.iStartMeasure, self.iStartMeasure + self.iLengthInMeasures + 1, 1) + dc.SetPen(wx.Pen('#5C5142')) + for i in range(0, (self.iLengthInMeasures+1)*step, step): + k = i + self.iEdges + dc.DrawLine(k, self.iScaleTop, k, self.iScaleTop+8) + if i != (self.iLengthInMeasures)*step: + for iBeat in range(1,4): + k = i+(iBeat * beatStep) + self.iEdges + dc.DrawLine(k, self.iScaleTop, k, self.iScaleTop+4) + width, height = dc.GetTextExtent(str(num[j])) + k = i-(width/2) + self.iEdges + if k > lastEnd: + if j == 0 or (j % scale) == 0: + dc.DrawText(str(num[j]), k, self.iScaleTop+8) + lastEnd = k + width + j = j + 1 + + """ Updates the location bar in case screen moved or resized """ + if self.iLocationInMs > 0 and self.iLengthInMs > 0: + iOffset = 0 + if self.iMidiMode: + iOffset = self.iMidiModeStart + + till = gWidth * (self.iLocationInMs / self.iLengthInMs) + dc.SetPen(wx.Pen(PROGRESS_BAR)) + dc.SetBrush(wx.Brush(PROGRESS_BAR)) + dc.DrawRectangle(self.iEdges + iOffset, gHeight-6, till, 3) + + def UpdateLocation(self, iLocationInMs): + """ Updates the location bar """ + #disable graph for debugging + #return info + + self.iLocationInMs = iLocationInMs + if self.iLocationInMs > 0 and self.iLengthInMs > 0: + if OsWindows(): + dc = wx.BufferedDC(wx.ClientDC(self), self._Buffer) + else: + dc = wx.AutoBufferedPaintDC(self) + dc.Background = wx.Brush(wx.WHITE) + + iOffset = 0 + if self.iMidiMode: + iOffset = self.iMidiModeStart + + gWidth, gHeight = self.GetSize() + gWidth = gWidth - (self.iEdges * 2) + + till = gWidth * (self.iLocationInMs / self.iLengthInMs) + dc.SetPen(wx.Pen(PROGRESS_BAR)) + dc.SetBrush(wx.Brush(PROGRESS_BAR)) + dc.DrawRectangle(self.iEdges + iOffset, gHeight-6, till, 3) + self.isDirty = True + else: + if self.isDirty: + self.DoDrawing() + self.isDirty = False diff --git a/jet_tools/JetCreator/JetStatusEvent.py b/jet_tools/JetCreator/JetStatusEvent.py new file mode 100755 index 0000000..64b4b50 --- /dev/null +++ b/jet_tools/JetCreator/JetStatusEvent.py @@ -0,0 +1,38 @@ +""" + File: + JetStatusEvent.py + + Contents and purpose: + Creates an event for postevent callbacks + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import wx + +EVT_JET_STATUS_ID = wx.NewId() + +def EVT_JET_STATUS(win, func): + win.Connect(-1, -1, EVT_JET_STATUS_ID, func) + +class JetStatusEvent(wx.PyEvent): + """Used for posting events out of play thread back to UI""" + def __init__(self, mode, data): + wx.PyEvent.__init__(self) + self.SetEventType(EVT_JET_STATUS_ID) + self.mode = mode + self.data = data + + diff --git a/jet_tools/JetCreator/JetSystemInfo.py b/jet_tools/JetCreator/JetSystemInfo.py new file mode 100755 index 0000000..a9ac932 --- /dev/null +++ b/jet_tools/JetCreator/JetSystemInfo.py @@ -0,0 +1,40 @@ +""" + File: + JetSystemInfo.py + + Contents and purpose: + Displays the system info regarding os version, wxPython version, and Python version + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import sys +import os +import string +import wx + +print("") +print("wxPython Version:") +print(wx.__version__) + +print("") +print("Python Version:") +print(sys.version) + +print("") +print("Python Paths:") +for dir in string.split(os.environ['PYTHONPATH'], os.pathsep): + print dir + diff --git a/jet_tools/JetCreator/JetUtils.py b/jet_tools/JetCreator/JetUtils.py new file mode 100755 index 0000000..d81e34d --- /dev/null +++ b/jet_tools/JetCreator/JetUtils.py @@ -0,0 +1,788 @@ +""" + File: + JetUtils.py + + Contents and purpose: + Utilities used throughout JetCreator + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from __future__ import with_statement + +import wx +import os +import copy +import ConfigParser +import logging +import time +import tempfile + +from JetDefs import * +from JetDebug import * +from midifile import TimeBase, trackGrid + +class JetCutCopy(object): + """ Handles cut/copy/pasting of events and segments """ + def __init__ (self, objType, objSave, currentSegmentName): + self.objType = objType + self.objSave = copy.deepcopy(objSave) + self.currentSegmentName = currentSegmentName + + def GetObj(self, objList): + """ Gets an object """ + objSave = copy.deepcopy(self.objSave) + if self.objType == JetDefs.MAIN_SEGLIST: + oldName = objSave.segname + i = len(oldName) - 1 + while i > 0: + if not oldName[i].isdigit(): + break + i = i - 1 + oldName = oldName[0:i+1] + i = 1 + while True: + newName = oldName + str(i) + if self.UniqueSegName(newName, objList): + break + i = i + 1 + objSave.segname = newName + elif self.objType == JetDefs.MAIN_EVENTLIST: + oldName = objSave.event_name + i = len(oldName) - 1 + while i > 0: + if not oldName[i].isdigit(): + break + i = i - 1 + oldName = oldName[0:i+1] + i = 1 + while True: + newName = oldName + str(i) + if self.UniqueEventName(newName, objList): + break + i = i + 1 + objSave.event_name = newName + return objSave + + def UniqueSegName(self, nameVal, seglist): + for nm in seglist: + if nm.segname == nameVal: + return False + return True + + def UniqueEventName(self, nameVal, eventlist): + for nm in eventlist: + if nm.event_name == nameVal: + return False + return True + + +class JetState(object): + """ Saves the state for cut/copy/paste """ + def __init__ (self, jet_file, currentSegmentIndex, currentEventIndex): + self.jet_file = copy.deepcopy(jet_file) + self.currentSegmentIndex = currentSegmentIndex + self.currentEventIndex = currentEventIndex + +def Queue (jet, queueSeg): + """ Queues a segment """ + jet.QueueSegment(queueSeg.userID, queueSeg.seg_num, queueSeg.dls_num, queueSeg.repeat, queueSeg.transpose, queueSeg.mute_flags) + +class QueueSeg(object): + """ Object representing a segment """ + def __init__ (self, name, userID, seg_num, dls_num=-1, repeat=0, transpose=0, mute_flags=0, status=''): + self.name = name + self.userID = userID + self.seg_num = seg_num + self.dls_num = dls_num + self.repeat = repeat + self.transpose = transpose + self.mute_flags = mute_flags + self.status = status + #DumpQueueSeg(self) + +def FindDlsNum(libraries, dlsfile): + """ Looks for a dls file in the library list """ + for index, library in enumerate(libraries): + if library == dlsfile: + return index + return -1 + +def SetRowSelection(list, row, state): + """ Sets the selection status of a list row """ + if state: + list.SetItemState(row, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) + else: + list.SetItemState(row, ~wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) + +def ClearRowSelections(list): + """ Clears the list rows selection status """ + index = list.GetFirstSelected() + while index != -1: + SetRowSelection(list, index, False) + index = list.GetNextSelected(index) + +def getColumnText(list, index, col): + """ Sets the text of a column """ + item = list.GetItem(index, col) + return item.GetText() + +def getColumnValue(list, index, col): + """ Gets the text of a column """ + item = list.GetItem(index, col) + v = str(item.GetText()) + if len(v) > 0: + return int(item.GetText()) + else: + return 0 + +def StrNoneChk(fld): + """ Returns a blank string if none """ + if fld is None: + return "" + return str(fld) + +def ConvertStrTimeToTuple(s): + """ Converts a string time to a tuple """ + try: + measures, beats, ticks = s.split(':',3) + return (int(measures), int(beats), int(ticks)) + except: + return JetDefs.MBT_DEFAULT + +def FileRelativePath(target, base=os.curdir): + """ Returns relative file path """ + if not os.path.exists(target): + return target + + if not os.path.isdir(base): + return target + + base_list = (os.path.abspath(base)).split(os.sep) + target_list = (os.path.abspath(target)).split(os.sep) + if os.name in ['nt','dos','os2'] and base_list[0] <> target_list[0]: + return target + for i in range(min(len(base_list), len(target_list))): + if base_list[i] <> target_list[i]: break + else: + i+=1 + rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] + return os.path.join(*rel_list) + +def FileFixPath(fileSpec): + """ Tweaks slashes """ + return fileSpec.replace("\\", "/") + +def FileKillClean(fileName): + """ Deletes a file skipping errors """ + try: + os.remove(fileName) + except: + pass + +def FileJustRoot(fileName): + """ Gets just the root of the file name """ + try: + return os.path.splitext(fileName)[0] + except: + return "" + +def FileJustName(fileName): + """ Gets just the filename, without the path """ + try: + return os.path.split(fileName)[1] + except: + return "" + +def FileJustPath(fileName): + """ Gets just the path, without the file name """ + try: + return os.path.split(fileName)[0] + except: + return "" + +def FileJustExt(fileName): + """ Gets just the extension of the file """ + try: + ext = os.path.splitext(fileName)[1] + return ext.upper() + except: + return "" + +def FileDateTime(fileName): + """ Gets the date/time of a file """ + try: + filetime = time.ctime(os.path.getmtime(fileName)) + return filetime + except: + return "" + +def FileExists(fileName): + """ Checks if a file exists """ + try: + return os.path.exists(fileName) + except: + return False + +def IniSetValue(configFile, section, option, value): + """ Sets the value of a config file field """ + config = ConfigParser.ConfigParser() + config.read(configFile) + if not config.has_section(section): + config.add_section(section) + config.set(section, option, value) + cfgfile = open(configFile,'w') + config.write(cfgfile) + cfgfile.close() + +def IniGetValue(configFile, section, option, retType='str', default=''): + """ Gets the value of a config file field """ + ret = default + config = ConfigParser.ConfigParser() + config.read(configFile) + if config.has_section(section): + if config.has_option(section, option): + ret = config.get(section, option) + if retType =='int': + try: + ret = int(ret) + except: + ret = 0 + elif retType == 'float': + try: + ret = float(ret) + except: + ret = 0 + elif retType == 'bool': + try: + if ret[0].upper()=='T': + ret = True + else: + ret = False + except: + ret = False + elif retType == 'list': + try: + ret = eval(ret) + except: + ret = [] + return ret + +def GetRecentJetFiles(): + """ Builds a list of recent jet files """ + fileList = [] + config = ConfigParser.ConfigParser() + config.read(JetDefs.JETCREATOR_INI) + if config.has_section(JetDefs.RECENT_SECTION): + for count in range(0, 10): + sFile = "File" + str(count) + if config.has_option(JetDefs.RECENT_SECTION, sFile): + sFileName = config.get(JetDefs.RECENT_SECTION, sFile) + if FileExists(sFileName): + if sFileName != JetDefs.UNTITLED_FILE: + #fileList.append(FileRelativePath(config.get(JetDefs.RECENT_SECTION, sFile))) + fileList.append(config.get(JetDefs.RECENT_SECTION, sFile)) + return fileList + +def AppendRecentJetFile(jetFile): + """ Appends to a list of recent jet files """ + addedFiles = [] + fileList = GetRecentJetFiles() + config = ConfigParser.ConfigParser() + config.read(JetDefs.JETCREATOR_INI) + if config.has_section(JetDefs.RECENT_SECTION): + config.remove_section(JetDefs.RECENT_SECTION) + config.add_section(JetDefs.RECENT_SECTION) + config.set(JetDefs.RECENT_SECTION, "File0", jetFile) + addedFiles.append(jetFile) + count = 1 + for file in fileList: + if file not in addedFiles: + sFile = "File" + str(count) + config.set(JetDefs.RECENT_SECTION, sFile, file) + addedFiles.append(file) + count += 1 + FileKillClean(JetDefs.JETCREATOR_INI) + cfgfile = open(JetDefs.JETCREATOR_INI,'w') + config.write(cfgfile) + cfgfile.close() + +def CompareMbt(mbt1, mbt2): + """ Compates to measure/beat/tick values """ + try: + m1, b1, t1 = mbt1.split(':',3) + m2, b2, t2 = mbt2.split(':',3) + if int(m1) > int(m2): + return False + elif int(m1) == int(m2) and int(b1) > int(b2): + return False + elif int(b1) == int(b2) and int(t1) > int(t2): + return False + elif int(m1) == int(m2) and int(b1) == int(b2) and int(t1) == int(t2): + return False + else: + return True + except: + return False + +def MbtVal(mbt): + """ Converts mbts to ticks """ + if type(mbt).__name__=='str' or type(mbt).__name__=='unicode': + mbt1 = mbt + else: + mbt1 = "%d:%d:%d" % mbt + try: + return TimeBase().ConvertStrTimeToTicks(mbt1) + except: + return 0 + +def TicksToMbt(ticks): + """ Converts ticks to mbts """ + return TimeBase().ConvertTicksToMBT(ticks) + +def TicksToStrMbt(ticks): + """ Converts ticks to mbts """ + return TimeBase().ConvertTicksToStr(ticks, '%02d:%02d:%02d') + +def MbtDifference(mbt1, mbt2): + """ Returns difference between mbt values """ + return TimeBase().MbtDifference(mbt1, mbt2) + +def PlayMidiFile(midiFile, dlsFile=''): + """ Plays a midi file """ + try: + e = __import__('eas') + + if midiFile == '': + return + eas = e.EAS() + if dlsFile > '': + eas.LoadDLSCollection(dlsFile) + eas.StartWave() + audio_file = eas.OpenFile(midiFile) + audio_file.Prepare() + audio_file.Play() + audio_file.Close() + eas.StopWave() + eas.Shutdown() + except: + return + +def SegmentOutputFile(segName, configFile): + """ Computes a segment output file """ + configPath = FileJustPath(configFile) + "/" + segOutput = configPath + "Seg_" + segName + ".mid" + return segOutput + +def ComputeMuteFlags(jet_file, segName): + """ Computes mute flags """ + muteFlag = 0 + for jet_event in jet_file.GetEvents(segName): + muteFlag = SetMute(jet_event.track_num, muteFlag) + return muteFlag + +def ComputeMuteFlagsFromList1(list): + """ Computes mute flags from a list """ + muteFlag = 0 + num = list.GetItemCount() + for iRow in range(num): + track_num = list.GetTrackNumber(iRow) + if list.IsChecked(iRow): + muteFlag = SetMute(track_num, muteFlag) + else: + muteFlag = ClearMute(track_num, muteFlag) + return muteFlag + +def ComputeMuteFlagsFromList(list): + """ Computes mute flags from a list """ + muteFlags = 0 + num = list.GetItemCount() + for iRow in range(num): + track_num = list.GetTrackNumber(iRow) + if list.IsChecked(iRow): + muteFlags = SetMute(track_num, muteFlags) + return muteFlags + + +def SetMuteFlag(track, muteFlag, mute): + """ Sets a mute flag """ + if mute: + SetMute(track, muteFlag) + else: + ClearMute(track, muteFlag) + +def SetMute(track, muteFlag): + """ Sets a mute flag """ + try: + muteFlag |= 1 << (track) + return muteFlag + except: + #bad argument + return muteFlag + +def ClearMute(track, muteFlag): + """ Clears a mute flag """ + try: + muteFlag &= ~(1 << (track)) + return muteFlag; + except: + #bad argument + return muteFlag + +def GetMute(track, muteFlag): + """ Get a mute flag """ + try: + if (muteFlag & ( 1 << (track))) == 0: + return False + else: + return True + except: + #bad argument + return False + +def InfoMsg(msgTitle, msgText): + """ Display a simple informational message """ + dlg = wx.MessageDialog(None, + message=msgText, + caption=msgTitle, + style=wx.OK|wx.ICON_INFORMATION + ) + dlg.ShowModal() + dlg.Destroy() + +def SendEvent (mycontrol, evt): + """ Sends an event """ + cmd = wx.CommandEvent(evt) + cmd.SetEventObject(mycontrol) + cmd.SetId(mycontrol.GetId()) + mycontrol.GetEventHandler().ProcessEvent(cmd) + +def GetJetHelpText(dlgName, fld): + """ Gets the jet help text file """ + return IniGetValue(JetDefs.JETCREATOR_HLP, dlgName, fld) + +def ExportJetArchive(fileName, jetConfigFile, jetFile): + """ Exports all files into a zip archive file """ + z = __import__('zipfile') + zip = z.ZipFile(fileName, 'w') + + #zip the original .JET file + if FileExists(jetFile.config.filename): + zip.write(jetFile.config.filename, FileJustName(jetFile.config.filename)) + + #make copy of object so we can modify it + jet_file = copy.deepcopy(jetFile) + + #zip the files, without paths + for segment in jet_file.GetSegments(): + if FileExists(segment.filename): + if not FileJustName(segment.filename) in zip.namelist(): + zip.write(segment.filename, FileJustName(segment.filename)) + if FileExists(segment.output): + if not FileJustName(segment.output) in zip.namelist(): + zip.write(segment.output, FileJustName(segment.output)) + + #zip the library files + for library in jet_file.GetLibraries(): + if FileExists(library): + if not FileJustName(library) in zip.namelist(): + zip.write(library, FileJustName(library)) + + #remove the paths on filenames + for segment in jet_file.GetSegments(): + segment.filename = FileJustName(segment.filename) + segment.dlsfile = FileJustName(segment.dlsfile) + segment.output = FileJustName(segment.output) + + #remove paths + for index, library in enumerate(jet_file.libraries): + jet_file.libraries[index] = FileJustName(library) + + #create temporary .JTC file so we can modify paths to files + tmpConfigFile = JetDefs.TEMP_JET_CONFIG_FILE + FileKillClean(tmpConfigFile) + + #save the file + jet_file.SaveJetConfig(tmpConfigFile) + + #zip it and rename it back to original name without path + zip.write(tmpConfigFile, FileJustName(jetConfigFile)) + + #create a flag file so we know this is a jet archive + zip.write(tmpConfigFile, "JetArchive") + + zip.close() + + FileKillClean(tmpConfigFile) + +def ValidateConfig(test_jet_file): + """ Validates the contents of a config file """ + dImp = __import__('JetDialogs') + errors = [] + fatalError = False + for segment in test_jet_file.segments: + logging.debug(segment.filename) + if segment.filename is not None and len(segment.filename) > 0 and not FileExists(segment.filename): + errors.append(("Segment MIDI file not found", segment.filename)) + fatalError = True + if segment.dlsfile is not None and len(segment.dlsfile) > 0 and not FileExists(segment.dlsfile): + errors.append(("Segment DLS file not found; removing from config", segment.dlsfile)) + segment.dlsfile = "" + + logging.debug(test_jet_file.config.filename) + + if len(errors) == 0: + return True + else: + dlg = dImp.JetErrors("Jet Definition File Errors") + dlg.SetErrors(errors) + result = dlg.ShowModal() + dlg.Destroy() + if fatalError: + return False + else: + return True + +def release_getLogger(name): + """ passing original handler with debug() method replaced to empty function """ + + def dummy(*k, **kw): + pass + + global __orig_getLogger + log = __orig_getLogger(name) + setattr(log, 'debug', dummy) + setattr(log, 'info', dummy) + setattr(log, 'error', dummy) + setattr(log, 'critical', dummy) + return log + +def install_release_loggers(): + """ Save original handler, installs newer one """ + global __orig_getLogger + __orig_getLogger = logging.getLogger + setattr(logging, 'getLogger', release_getLogger) + +def restore_getLogger(): + """ Restores original handler """ + global __orig_getLogger + if __orig_getLogger: + setattr(logging, 'getLogger', __orig_getLogger) + +def GetMidiFileLength(midiFile): + """ Gets the length of a midi file via eas """ + e = __import__('eas') + + if not FileExists(midiFile): + return 0 + + eas = e.EAS() + audio_file = eas.OpenFile(midiFile) + audio_file.Prepare() + midiLength = eas.audio_streams[0].ParseMetaData() + audio_file.Close() + eas.Shutdown() + return midiLength + +def GetMidiInfo(midiFile): + """ Gets midi file info """ + m = __import__('midifile') + md = m.GetMidiInfo(midiFile) + return md + +def PrintMidiInfo(midiFile): + """ Prints info about a midi file """ + mi = GetMidiInfo(midiFile) + if mi.err == 0: + print("ppqn: " + str(mi.ppqn)) + print("beats_per_measure: " + str(mi.beats_per_measure)) + print("ending mbt: " + str(mi.endMbt)) + print("ending mbt str: " + mi.endMbtStr) + print("maxMeasures: " + str(mi.maxMeasures)) + print("maxBeats: " + str(mi.maxBeats)) + print("maxTicks: " + str(mi.maxTicks)) + print("maxTracks: " + str(mi.maxTracks)) + print("totalTicks: " + str(mi.totalTicks)) + for track in mi.trackList: + print(track) + else: + print("Error opening") + +def MidiSegInfo(segment): + """ Midi file info saved in config file for speed """ + class segInfo: + iMsPerTick = 0 + bpm = 4 + ppqn = 480 + total_ticks = 0 + iLengthInMs = 0 + iTracks = 0 + trackList = [] + + ver = "1.5" + ret = segInfo() + savedVer = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Ver") + savedDateTime = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "DateTime") + dateTime = FileDateTime(segment.filename) + if ver != savedVer or dateTime != savedDateTime: + mi = GetMidiInfo(segment.filename) + if mi.err == 0: + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Ver", ver) + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "DateTime", str(dateTime)) + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "PPQN", str(mi.ppqn)) + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "BPM", str(mi.beats_per_measure)) + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "totalTicks", str(mi.totalTicks)) + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "maxTracks", str(mi.maxTracks)) + iLengthInMs = GetMidiFileLength(segment.filename) * 1000 + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "LengthInMs", str(iLengthInMs)) + if iLengthInMs > 0: + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "MsPerTick", str(iLengthInMs / mi.totalTicks)) + #have to write out the tracklist in format that can be saved in INI file + tl = [] + for track in mi.trackList: + tl.append((track.track, track.channel, track.name)) + IniSetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Tracks", tl) + + trackList = [] + tl = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "Tracks", 'list', []) + for t in tl: + trackList.append(trackGrid(t[0], t[1], t[2],False)) + iTracks = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "maxTracks", 'int', 0) + iMsPerTick = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "MsPerTick", 'float', 0) + bpm = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "BPM", 'int', 0) + ppqn = IniGetValue(JetDefs.JETMIDIFILES_INI, segment.filename, "PPQN", 'int', 480) + if iMsPerTick == 0 or bpm == 0 or ppqn == 0: + return ret + tb = TimeBase(ppqn, bpm) + total_ticks = tb.ConvertStrTimeToTicks(segment.length) + if total_ticks == 0: + total_ticks = tb.MbtDifference(tb.ConvertStrTimeToTuple(segment.start), tb.ConvertStrTimeToTuple(segment.end)) + if total_ticks == 0: + return ret + + ret.iTracks = iTracks + ret.iMsPerTick = iMsPerTick + ret.bpm = bpm + ret.ppqn = ppqn + ret.total_ticks = total_ticks + ret.iLengthInMs = total_ticks * iMsPerTick + ret.trackList = trackList + return ret + +def TimeStr(ms): + """ Returns a time string """ + s=ms/1000 + m,s=divmod(s,60) + h,m=divmod(m,60) + d,h=divmod(h,24) + if m > 0: + return "%d Min %d Sec" % (m,s) + else: + return "%d Seconds" % (s) + +def mbtFct(mbt, mod): + """ Converts times """ + if type(mbt).__name__=='str' or type(mbt).__name__=='unicode': + mbt = ConvertStrTimeToTuple(mbt) + retType = 'str' + else: + retType = 'int' + + m = mbt[0]+mod + b = mbt[1]+mod + t = mbt[2] + if m < 0: + m = 0 + if b < 0: + b = 0 + if b > 4: + b = 4 + if t < 0: + t = 0 + + if retType == 'str': + return "%d:%d:%d" % (m, b, t) + else: + return (m, b, t) + +def OsWindows(): + """ Tells us whether windows or os x """ + if os.name == 'nt': + return True ; + else: + return False ; + +def MacOffset(): + """ Mac screen coordinates funky on some controls so we finagle a few pixels """ + if not OsWindows(): + return 3 + else: + return 0 + +def SafeJetShutdown(lock, jet): + """ Makes sure we do the jet shutdown properly """ + with lock: + #MAKE SURE WE CLEANUP + #try: jet.Clear_Queue() + #except: pass + + try: jet.eas.StopWave() + except: pass + + try: jet.Shutdown() + except: pass + + jet = None + + +def CreateTempJetFile(org_jet_file): + """ Creates temporary jet file for playback testing """ + dirname = JetDefs.TEMP_JET_DIR + if not os.path.isdir(dirname): + os.mkdir(dirname) + + tmpConfigFile = dirname + FileJustName(org_jet_file.config_file) + FileKillClean(tmpConfigFile) + + jet_file = copy.deepcopy(org_jet_file) + + for tmp in jet_file.segments: + tmp.output = dirname + FileJustName(tmp.output) + + jet_file.config_file = tmpConfigFile + jet_file.config.filename = dirname + FileJustName(jet_file.config.filename) + FileKillClean(jet_file.config.filename) + + jet_file.SaveJetConfig(tmpConfigFile) + jet_file.WriteJetFileFromConfig(tmpConfigFile) + + return jet_file + +def CleanupTempJetFile(jet_file): + """ Cleans up temporary files """ + FileKillClean(jet_file.config.filename) + FileKillClean(jet_file.config_file) + for tmp in jet_file.segments: + FileKillClean(tmp.output) + +def GetNow(): + return time.asctime() + + +if __name__ == '__main__': + """ Tests functions """ + pass + + \ No newline at end of file diff --git a/jet_tools/JetCreator/ReadMe1st.txt b/jet_tools/JetCreator/ReadMe1st.txt new file mode 100755 index 0000000..121ae32 --- /dev/null +++ b/jet_tools/JetCreator/ReadMe1st.txt @@ -0,0 +1,44 @@ +# +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the 'License'); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +PREREQUISITES + +JetCreator was created and tested with: + +Python Version 2.5.4 +wxPython Version 2.8.7.1 + +These can be downloaded here: + +PC + +http://www.python.org/download/releases/2.5.4/ +http://www.wxpython.org/download.php + +MAC + +http://wiki.python.org/moin/MacPython/Leopard +http://www.wxpython.org/download.php + + + +INSTALLING + +1. Install Python +2. Install wxPython +3. Unzip or copy the JetCreator directory +4. Execute JetCreator.py +5. Use Import to import simple example project off Demos directory diff --git a/jet_tools/JetCreator/eas.py b/jet_tools/JetCreator/eas.py new file mode 100755 index 0000000..127314b --- /dev/null +++ b/jet_tools/JetCreator/eas.py @@ -0,0 +1,1229 @@ + +from __future__ import with_statement + +import threading +import logging +import time +from ctypes import * +from JetUtils import OsWindows + + +# stream state +EAS_STATE_READY = 0 +EAS_STATE_PLAY = 1 +EAS_STATE_STOPPING = 2 +EAS_STATE_PAUSING = 3 +EAS_STATE_STOPPED = 4 +EAS_STATE_PAUSED = 5 +EAS_STATE_OPEN = 6 +EAS_STATE_ERROR = 7 +EAS_STATE_EMPTY = 8 + +# EAS error codes +EAS_SUCCESS = 0 +EAS_FAILURE = -1 +EAS_ERROR_INVALID_MODULE = -2 +EAS_ERROR_MALLOC_FAILED = -3 +EAS_ERROR_FILE_POS = -4 +EAS_ERROR_INVALID_FILE_MODE = -5 +EAS_ERROR_FILE_SEEK = -6 +EAS_ERROR_FILE_LENGTH = -7 +EAS_ERROR_NOT_IMPLEMENTED = -8 +EAS_ERROR_CLOSE_FAILED = -9 +EAS_ERROR_FILE_OPEN_FAILED = -10 +EAS_ERROR_INVALID_HANDLE = -11 +EAS_ERROR_NO_MIX_BUFFER = -12 +EAS_ERROR_PARAMETER_RANGE = -13 +EAS_ERROR_MAX_FILES_OPEN = -14 +EAS_ERROR_UNRECOGNIZED_FORMAT = -15 +EAS_BUFFER_SIZE_MISMATCH = -16 +EAS_ERROR_FILE_FORMAT = -17 +EAS_ERROR_SMF_NOT_INITIALIZED = -18 +EAS_ERROR_LOCATE_BEYOND_END = -19 +EAS_ERROR_INVALID_PCM_TYPE = -20 +EAS_ERROR_MAX_PCM_STREAMS = -21 +EAS_ERROR_NO_VOICE_ALLOCATED = -22 +EAS_ERROR_INVALID_CHANNEL = -23 +EAS_ERROR_ALREADY_STOPPED = -24 +EAS_ERROR_FILE_READ_FAILED = -25 +EAS_ERROR_HANDLE_INTEGRITY = -26 +EAS_ERROR_MAX_STREAMS_OPEN = -27 +EAS_ERROR_INVALID_PARAMETER = -28 +EAS_ERROR_FEATURE_NOT_AVAILABLE = -29 +EAS_ERROR_SOUND_LIBRARY = -30 +EAS_ERROR_NOT_VALID_IN_THIS_STATE = -31 +EAS_ERROR_NO_VIRTUAL_SYNTHESIZER = -32 +EAS_ERROR_FILE_ALREADY_OPEN = -33 +EAS_ERROR_FILE_ALREADY_CLOSED = -34 +EAS_ERROR_INCOMPATIBLE_VERSION = -35 +EAS_ERROR_QUEUE_IS_FULL = -36 +EAS_ERROR_QUEUE_IS_EMPTY = -37 +EAS_ERROR_FEATURE_ALREADY_ACTIVE = -38 + +# special result codes +EAS_EOF = 3 +EAS_STREAM_BUFFERING = 4 + +# buffer full error returned from Render +EAS_BUFFER_FULL = 5 + +# file types +file_types = ( + 'Unknown', + 'SMF Type 0 (.mid)', + 'SMF Type 1 (.mid)', + 'SMAF - Unknown type (.mmf)', + 'SMAF MA-2 (.mmf)', + 'SMAF MA-3 (.mmf)', + 'SMAF MA-5 (.mmf)', + 'CMX/QualComm (.pmd)', + 'MFi (NTT/DoCoMo i-mode)', + 'OTA/Nokia (.ott)', + 'iMelody (.imy)', + 'RTX/RTTTL (.rtx)', + 'XMF Type 0 (.xmf)', + 'XMF Type 1 (.xmf)', + 'WAVE/PCM (.wav)', + 'WAVE/IMA-ADPCM (.wav)', + 'MMAPI Tone Control (.js)' +) + +stream_states = ( + 'Ready', + 'Play', + 'Stopping', + 'Stopped', + 'Pausing', + 'Paused', + 'Open', + 'Error', + 'Empty' +) + +# iMode play modes +IMODE_PLAY_ALL = 0 +IMODE_PLAY_PARTIAL = 1 + +# callback type for metadata +EAS_METADATA_CBFUNC = CFUNCTYPE(c_int, c_int, c_char_p, c_ulong) + +# callbacks for external audio +EAS_EXT_PRG_CHG_FUNC = CFUNCTYPE(c_int, c_void_p, c_void_p) +EAS_EXT_EVENT_FUNC = CFUNCTYPE(c_int, c_void_p, c_void_p) + +# callback for aux mixer decoder +EAS_DECODER_FUNC = CFUNCTYPE(c_void_p, c_void_p, c_int, c_int) + +# DLL path +if OsWindows(): + EAS_DLL_PATH = "EASDLL.dll" +else: + EAS_DLL_PATH = "libEASLIb.dylib" + +eas_dll = None + +# logger +eas_logger = None + +#--------------------------------------------------------------- +# InitEASModule +#--------------------------------------------------------------- +def InitEASModule (dll_path=None): + global eas_dll + global eas_logger + + + # initialize logger + if eas_logger is None: + eas_logger = logging.getLogger('EAS') + + # initialize path to DLL + if dll_path is None: + dll_path=EAS_DLL_PATH + + # intialize DLL + if eas_dll is None: + eas_dll = cdll.LoadLibrary(dll_path) + +#--------------------------------------------------------------- +# S_JET_CONFIG +#--------------------------------------------------------------- +class S_JET_CONFIG (Structure): + _fields_ = [('appLowNote', c_ubyte)] + +#--------------------------------------------------------------- +# S_EXT_AUDIO_PRG_CHG +#--------------------------------------------------------------- +class S_EXT_AUDIO_PRG_CHG (Structure): + _fields_ = [('bank', c_ushort), + ('program', c_ubyte), + ('channel', c_ubyte)] + +#--------------------------------------------------------------- +# S_EXT_AUDIO_EVENT +#--------------------------------------------------------------- +class S_EXT_AUDIO_EVENT (Structure): + _fields_ = [('channel', c_ubyte), + ('note', c_ubyte), + ('velocity', c_ubyte), + ('noteOn', c_ubyte)] + +#--------------------------------------------------------------- +# S_MIDI_CONTROLLERS +#--------------------------------------------------------------- +class S_MIDI_CONTROLLERS (Structure): + _fields_ = [('modWheel', c_ubyte), + ('volume', c_ubyte), + ('pan', c_ubyte), + ('expression', c_ubyte), + ('channelPressure', c_ubyte)] + +#--------------------------------------------------------------- +# WAVEFORMAT +#--------------------------------------------------------------- +class WAVEFORMAT (Structure): + _fields_ = [('wFormatTag', c_ushort), + ('nChannels', c_ushort), + ('nSamplesPerSec', c_ulong), + ('nAvgBytesPerSec', c_ulong), + ('nBlockAlign', c_ushort), + ('wBitsPerSample', c_ushort)] + +#--------------------------------------------------------------- +# EAS_Exception +#--------------------------------------------------------------- +class EAS_Exception (Exception): + def __init__ (self, result_code, msg, function=None): + self.msg = msg + self.result_code = result_code + self.function = function + def __str__ (self): + return self.msg + +#--------------------------------------------------------------- +# Log callback function +#--------------------------------------------------------------- +# map EAS severity levels to the Python logging module +severity_mapping = (logging.CRITICAL, logging.CRITICAL, logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG) +LOG_FUNC_TYPE = CFUNCTYPE(c_int, c_int, c_char_p) +def Log (level, msg): + eas_logger.log(severity_mapping[level], msg) + return level +LogCallback = LOG_FUNC_TYPE(Log) + +#--------------------------------------------------------------- +# EAS_Stream +#--------------------------------------------------------------- +class EAS_Stream (object): + def __init__ (self, handle, eas): + eas_logger.debug('EAS_Stream.__init__') + self.handle = handle + self.eas = eas + + def SetVolume (self, volume): + """Set the stream volume""" + eas_logger.debug('Call EAS_SetVolume: volume=%d' % volume) + with self.eas.lock: + result = eas_dll.EAS_SetVolume(self.eas.handle, self.handle, volume) + if result: + raise EAS_Exception(result, 'EAS_SetVolume error %d on file %s' % (result, self.path), 'EAS_SetVolume') + + def GetVolume (self): + """Get the stream volume.""" + eas_logger.debug('Call EAS_GetVolume') + with self.eas.lock: + volume = eas_dll.EAS_GetVolume(self.eas.handle, self.handle) + if volume < 0: + raise EAS_Exception(volume, 'EAS_GetVolume error %d on file %s' % (volume, self.path), 'EAS_GetVolume') + eas_logger.debug('EAS_GetVolume: volume=%d' % volume) + return volume + + def SetPriority (self, priority): + """Set the stream priority""" + eas_logger.debug('Call EAS_SetPriority: priority=%d' % priority) + with self.eas.lock: + result = eas_dll.EAS_SetPriority(self.eas.handle, self.handle, priority) + if result: + raise EAS_Exception(result, 'EAS_SetPriority error %d on file %s' % (result, self.path), 'EAS_SetPriority') + + def GetPriority (self): + """Get the stream priority.""" + eas_logger.debug('Call EAS_GetPriority') + priority = c_int(0) + with self.eas.lock: + result = eas_dll.EAS_GetPriority(self.eas.handle, self.handle, byref(priority)) + if result: + raise EAS_Exception(result, 'EAS_GetPriority error %d on file %s' % (result, self.path), 'EAS_GetPriority') + eas_logger.debug('EAS_GetPriority: priority=%d' % priority.value) + return priority.value + + def SetTransposition (self, transposition): + """Set the transposition of a stream.""" + eas_logger.debug('Call EAS_SetTransposition: transposition=%d' % transposition) + with self.eas.lock: + result = eas_dll.EAS_SetTransposition(self.eas.handle, self.handle, transposition) + if result: + raise EAS_Exception(result, 'EAS_SetTransposition error %d on file %s' % (result, self.path), 'EAS_SetTransposition') + + def SetPolyphony (self, polyphony): + """Set the polyphony of a stream.""" + eas_logger.debug('Call EAS_SetPolyphony: polyphony=%d' % polyphony) + with self.eas.lock: + result = eas_dll.EAS_SetPolyphony(self.eas.handle, self.handle, polyphony) + if result: + raise EAS_Exception(result, 'EAS_SetPolyphony error %d on file %s' % (result, self.path), 'EAS_SetPolyphony') + + def GetPolyphony (self): + """Get the polyphony of a stream.""" + eas_logger.debug('Call EAS_GetPolyphony') + polyphony = c_int(0) + with self.eas.lock: + result = eas_dll.EAS_GetPolyphony(self.eas.handle, self.handle, byref(polyphony)) + if result: + raise EAS_Exception(result, 'EAS_GetPolyphony error %d on file %s' % (result, self.path), 'EAS_GetPolyphony') + eas_logger.debug('EAS_SetPolyphony: polyphony=%d' % polyphony.value) + return polyphony.value + + def SelectLib (self, test_lib=False): + eas_logger.debug('Call EAS_SelectLib: test_lib=%s' % test_lib) + with self.eas.lock: + result = eas_dll.EAS_SelectLib(self.eas.handle, self.handle, test_lib) + if result: + raise EAS_Exception(result, 'EAS_SelectLib error %d on file %s' % (result, self.path), 'EAS_SelectLib') + + def LoadDLSCollection (self, path): + eas_logger.debug('Call EAS_LoadDLSCollection: lib_path=%d' % path) + with self.eas.lock: + result = eas_dll.EAS_LoadDLSCollection(self.eas.handle, self.handle, path) + if result: + raise EAS_Exception(result, 'EAS_LoadDLSCollection error %d on file %s lib %s' % (result, self.path, path), 'EAS_LoadDLSCollection') + + def RegExtAudioCallback (self, user_data, prog_chg_func, event_func): + """Register an external audio callback.""" + eas_logger.debug('Call EAS_RegExtAudioCallback') + if prog_chg_func is not None: + prog_chg_func = EAS_EXT_PRG_CHG_FUNC(prog_chg_func) + else: + prog_chg_func = 0 + if event_func is not None: + event_func = EAS_EXT_EVENT_FUNC(event_func) + else: + event_func = 0 + with self.eas.lock: + result = eas_dll.EAS_RegExtAudioCallback(self.eas.handle, self.handle, user_data, prog_chg_func, event_func) + if result: + raise EAS_Exception(result, 'EAS_RegExtAudioCallback error %d on file %s' % (result, self.path), 'EAS_RegExtAudioCallback') + + def SetPlayMode (self, play_mode): + """Set play mode on a stream.""" + eas_logger.debug('Call EAS_SetPlayMode: play_mode=%d' % play_mode) + with self.eas.lock: + result = eas_dll.EAS_SetPlayMode(self.eas.handle, self.handle, play_mode) + if result: + raise EAS_Exception(result, 'EAS_SetPlayMode error %d on file %s' % (result, self.path), 'EAS_SetPlayMode') + +""" +EAS_PUBLIC EAS_RESULT EAS_GetMIDIControllers (EAS_DATA_HANDLE pEASData, EAS_HANDLE streamHandle, EAS_U8 channel, S_MIDI_CONTROLLERS *pControl); +""" + +#--------------------------------------------------------------- +# EAS_File +#--------------------------------------------------------------- +class EAS_File (EAS_Stream): + def __init__ (self, path, handle, eas): + EAS_Stream.__init__(self, handle, eas) + eas_logger.debug('EAS_File.__init__') + self.path = path + self.prepared = False + + def Prepare (self): + """Prepare an audio file for playback""" + if self.prepared: + eas_logger.warning('Prepare already called on file %s' % self.path) + else: + with self.eas.lock: + eas_logger.debug('Call EAS_Prepare for file: %s' % self.path) + result = eas_dll.EAS_Prepare(self.eas.handle, self.handle) + if result: + raise EAS_Exception(result, 'EAS_Prepare error %d on file %s' % (result, self.path), 'EAS_Prepare') + self.prepared = True + + def State (self): + """Get stream state.""" + with self.eas.lock: + eas_logger.debug('Call EAS_State for file: %s' % self.path) + state = c_long(-1) + result = eas_dll.EAS_State(self.eas.handle, self.handle, byref(state)) + if result: + raise EAS_Exception(result, 'EAS_State error %d on file %s' % (result, self.path), 'EAS_State') + eas_logger.debug('EAS_State: file=%s, state=%s' % (self.path, stream_states[state.value])) + return state.value + + def Close (self): + """Close audio file.""" + if hasattr(self, 'handle'): + with self.eas.lock: + eas_logger.debug('Call EAS_CloseFile for file: %s' % self.path) + result = eas_dll.EAS_CloseFile(self.eas.handle, self.handle) + if result: + raise EAS_Exception(result, 'EAS_CloseFile error %d on file %s' % (result, self.path), 'EAS_CloseFile') + + # remove file from the EAS object + self.eas.audio_streams.remove(self) + + # clean up references + del self.handle + del self.eas + del self.path + + def Pause (self): + """Pause a stream.""" + eas_logger.debug('Call EAS_Pause') + with self.eas.lock: + result = eas_dll.EAS_Pause(self.eas.handle, self.handle) + if result: + raise EAS_Exception(result, 'EAS_Pause error %d on file %s' % (result, self.path), 'EAS_Pause') + + def Resume (self): + """Resume a stream.""" + eas_logger.debug('Call EAS_Resume') + with self.eas.lock: + result = eas_dll.EAS_Resume(self.eas.handle, self.handle) + if result: + raise EAS_Exception(result, 'EAS_Resume error %d on file %s' % (result, self.path), 'EAS_Resume') + + def Locate (self, secs, offset=False): + """Set the playback position of a stream in seconds.""" + eas_logger.debug('Call EAS_Locate: location=%.3f, relative=%s' % (secs, offset)) + with self.eas.lock: + result = eas_dll.EAS_Locate(self.eas.handle, self.handle, int(secs * 1000 + 0.5), offset) + if result: + raise EAS_Exception(result, 'EAS_Locate error %d on file %s' % (result, self.path), 'EAS_Locate') + + def GetLocation (self): + """Get the stream location in seconds.""" + eas_logger.debug('Call EAS_GetLocation') + msecs = c_int(0) + with self.eas.lock: + result = eas_dll.EAS_GetLocation(self.eas.handle, self.handle, byref(msecs)) + if result: + raise EAS_Exception(result, 'EAS_GetLocation error %d on file %s' % (result, self.path), 'EAS_GetLocation') + msecs = float(msecs.value) / 1000 + eas_logger.debug('EAS_GetLocation: location=%.3f' % msecs) + return msecs + + def GetFileType (self): + """Get the file type.""" + eas_logger.debug('Call EAS_GetFileType') + file_type = c_int(0) + with self.eas.lock: + result = eas_dll.EAS_GetFileType(self.eas.handle, self.handle, byref(file_type)) + if result: + raise EAS_Exception(result, 'EAS_GetFileType error %d on file %s' % (result, self.path), 'EAS_GetFileType') + file_type = file_type.value + if file_type < len(file_types): + file_desc = file_types[file_type] + else: + file_desc = 'Unrecognized type %d' % file_type + eas_logger.debug('EAS_GetFileType: type=%d, desc=%s' % (file_type, file_desc)) + return (file_type, file_desc) + + def SetRepeat (self, count): + """Set the repeat count of a stream.""" + eas_logger.debug('Call EAS_SetRepeat: count=%d' % count) + with self.eas.lock: + result = eas_dll.EAS_SetRepeat(self.eas.handle, self.handle, count) + if result: + raise EAS_Exception(result, 'EAS_SetRepeat error %d on file %s' % (result, self.path), 'EAS_SetRepeat') + + def GetRepeat (self): + """Get the repeat count of a stream.""" + eas_logger.debug('Call EAS_GetRepeat') + count = c_int(0) + with self.eas.lock: + result = eas_dll.EAS_GetRepeat(self.eas.handle, self.handle, byref(count)) + if result: + raise EAS_Exception(result, 'EAS_GetRepeat error %d on file %s' % (result, self.path), 'EAS_GetRepeat') + eas_logger.debug('EAS_GetRepeat: count=%d' % count.value) + return count.value + + def SetPlaybackRate (self, rate): + """Set the playback rate of a stream.""" + eas_logger.debug('Call EAS_SetPlaybackRate') + with self.eas.lock: + result = eas_dll.EAS_SetPlaybackRate(self.eas.handle, self.handle, rate) + if result: + raise EAS_Exception(result, 'EAS_SetPlaybackRate error %d on file %s' % (result, self.path), 'EAS_SetPlaybackRate') + + def ParseMetaData (self): + """Parse the metadata in a file.""" + eas_logger.debug('Call EAS_ParseMetaData') + length = c_int(0) + with self.eas.lock: + result = eas_dll.EAS_ParseMetaData(self.eas.handle, self.handle, byref(length)) + if result: + raise EAS_Exception(result, 'EAS_ParseMetaData error %d on file %s' % (result, self.path), 'EAS_ParseMetaData') + return float(length.value) / 1000.0 + + def RegisterMetaDataCallback (self, func, buf, buf_size, user_data): + """Register a metadata callback.""" + eas_logger.debug('Call EAS_RegisterMetaDataCallback') + with self.eas.lock: + if func is not None: + callback = EAS_METADATA_CBFUNC(func) + else: + callback = 0 + result = eas_dll.EAS_RegisterMetaDataCallback(self.eas.handle, self.handle, callback, buf, buf_size, user_data) + if result: + raise EAS_Exception(result, 'EAS_RegisterMetaDataCallback error %d on file %s' % (result, self.path), 'EAS_RegisterMetaDataCallback') + + def GetWaveFmtChunk (self): + """Get the file type.""" + eas_logger.debug('Call EAS_GetWaveFmtChunk') + wave_fmt_chunk = c_void_p(0) + with self.eas.lock: + result = eas_dll.EAS_GetWaveFmtChunk(self.eas.handle, self.handle, byref(wave_fmt_chunk)) + if result: + raise EAS_Exception(result, 'EAS_GetWaveFmtChunk error %d on file %s' % (result, self.path), 'EAS_GetWaveFmtChunk') + return cast(wave_fmt_chunk, POINTER(WAVEFORMAT)).contents + + def Play (self, max_time=None): + """Plays the file to the end or max_time.""" + eas_logger.debug('EAS_File.Play') + if not self.prepared: + self.Prepare() + if max_time is not None: + max_time += self.eas.GetRenderTime() + while self.State() not in (EAS_STATE_STOPPED, EAS_STATE_ERROR, EAS_STATE_EMPTY): + self.eas.Render() + if max_time is not None: + if self.eas.GetRenderTime() >= max_time: + eas_logger.info('Max render time exceeded - stopping playback') + self.Pause() + self.eas.Render() + break + +#--------------------------------------------------------------- +# EAS_MIDIStream +#--------------------------------------------------------------- +class EAS_MIDIStream (EAS_Stream): + def Write(self, data): + """Write data to MIDI stream.""" + with self.eas.lock: + result = eas_dll.EAS_WriteMIDIStream(self.eas.handle, self.handle, data, len(data)) + if result: + raise EAS_Exception(result, 'EAS_WriteMIDIStream error %d' % result, 'EAS_WriteMIDIStream') + + def Close (self): + """Close MIDI stream.""" + if hasattr(self, 'handle'): + with self.eas.lock: + eas_logger.debug('Call EAS_CloseMIDIStream') + result = eas_dll.EAS_CloseMIDIStream(self.eas.handle, self.handle) + if result: + raise EAS_Exception(result, 'EAS_CloseFile error %d' % result, 'EAS_CloseMIDIStream') + + # remove file from the EAS object + self.eas.audio_streams.remove(self) + + # clean up references + del self.handle + del self.eas + +#--------------------------------------------------------------- +# EAS_Config +#--------------------------------------------------------------- +class EAS_Config (Structure): + _fields_ = [('libVersion', c_ulong), + ('checkedVersion', c_int), + ('maxVoices', c_long), + ('numChannels', c_long), + ('sampleRate', c_long), + ('mixBufferSize', c_long), + ('filterEnabled', c_int), + ('buildTimeStamp', c_ulong), + ('buildGUID', c_char_p)] + +#--------------------------------------------------------------- +# EAS +#--------------------------------------------------------------- +class EAS (object): + def __init__ (self, handle=None, dll_path=None, log_file=None): + if eas_dll is None: + InitEASModule(dll_path) + if log_file is not None: + eas_logger.addHandler(log_file) + eas_logger.debug('EAS.__init__') + self.Init(handle) + + def __del__ (self): + eas_logger.debug('EAS.__del__') + self.Shutdown() + + def Init (self, handle=None): + """Initializes the EAS Library.""" + eas_logger.debug('EAS.Init') + + # if we are already initialized, shutdown first + if hasattr(self, 'handle'): + eas_logger.debug('EAS.Init called with library already initalized') + self.ShutDown() + + # setup the logging function + eas_dll.SetLogCallback(LogCallback) + + # create some members + self.handle = c_void_p(0) + self.audio_streams = [] + self.output_streams = [] + self.aux_mixer = None + + # create a sync lock + self.lock = threading.RLock() + with self.lock: + # set log callback + + # get library configuration + self.Config() + + # initialize library + if handle is None: + self.do_shutdown = True + eas_logger.debug('Call EAS_Init') + result = eas_dll.EAS_Init(byref(self.handle)) + if result: + raise EAS_Exception(result, 'EAS_Init error %d' % result, 'EAS_Init') + else: + self.do_shutdown = False + self.handle = handle + + # allocate audio buffer for rendering + AudioBufferType = c_ubyte * (2 * self.config.mixBufferSize * self.config.numChannels) + self.audio_buffer = AudioBufferType() + self.buf_size = self.config.mixBufferSize + + def Config (self): + """Retrieves the EAS library configuration""" + if not hasattr(self, 'config'): + eas_logger.debug('Call EAS_Config') + eas_dll.EAS_Config.restype = POINTER(EAS_Config) + self.config = eas_dll.EAS_Config()[0] + eas_logger.debug("libVersion=%08x, maxVoices=%d, numChannels=%d, sampleRate = %d, mixBufferSize=%d" % + (self.config.libVersion, self.config.maxVoices, self.config.numChannels, self.config.sampleRate, self.config.mixBufferSize)) + + def Shutdown (self): + """Shuts down the EAS library""" + eas_logger.debug('EAS.Shutdown') + if hasattr(self, 'handle'): + with self.lock: + # close audio streams + audio_streams = self.audio_streams + for f in audio_streams: + eas_logger.warning('Stream was not closed before EAS_Shutdown') + f.Close() + + # close output streams + output_streams = self.output_streams + for s in output_streams: + s.close() + + # shutdown library + if self.do_shutdown: + eas_logger.debug('Call EAS_Shutdown') + result = eas_dll.EAS_Shutdown(self.handle) + if result: + raise EAS_Exception(result, 'EAS_Shutdown error %d' % result, 'EAS_Shutdown') + del self.handle + + def OpenFile (self, path): + """Opens an audio file to be played by the EAS library and + returns an EAS_File object + + Arguments: + path - path to audio file + + Returns: + EAS_File + + """ + with self.lock: + eas_logger.debug('Call EAS_OpenFile for file: %s' % path) + stream_handle = c_void_p(0) + result = eas_dll.EAS_OpenFile(self.handle, path, byref(stream_handle)) + if result: + raise EAS_Exception(result, 'EAS_OpenFile error %d on file %s' % (result, path), 'EAS_OpenFile') + + # create file object and save in list + stream = EAS_File(path, stream_handle, self) + self.audio_streams.append(stream) + return stream + + def OpenMIDIStream (self, stream=None): + """Opens a MIDI stream. + + Arguments: + stream - open stream object. If None, a new synth + is created. + + Returns: + EAS_MIDIStream + + """ + with self.lock: + eas_logger.debug('Call EAS_OpenMIDIStream') + stream_handle = c_void_p(0) + if stream.handle is not None: + result = eas_dll.EAS_OpenMIDIStream(self.handle, byref(stream_handle), stream.handle) + else: + result = eas_dll.EAS_OpenMIDIStream(self.handle, byref(stream_handle), 0) + if result: + raise EAS_Exception(result, 'EAS_OpenMIDIStream error %d' % result, 'EAS_OpenMIDIStream') + + # create stream object and save in list + stream = EAS_MIDIStream(stream_handle, self) + self.audio_streams.append(stream) + return stream + + def OpenToneControlStream (self, path): + """Opens an MMAPI tone control file to be played by the EAS + library and returns an EAS_File object + + Arguments: + path - path to audio file + + Returns: + EAS_File + + """ + with self.lock: + eas_logger.debug('Call EAS_MMAPIToneControl for file: %s' % path) + stream_handle = c_void_p(0) + result = eas_dll.EAS_MMAPIToneControl(self.handle, path, byref(stream_handle)) + if result: + raise EAS_Exception(result, 'EAS_MMAPIToneControl error %d on file %s' % (result, path), 'EAS_OpenToneControlStream') + + # create file object and save in list + stream = EAS_File(path, stream_handle, self) + self.audio_streams.append(stream) + return stream + + def Attach (self, stream): + """Attach a file or output device to the EAS output. + + The stream object must support the following methods as + defined in the Python wave module: + close() + setparams() + writeframesraw() + + Arguments: + stream - open wave object + + """ + self.output_streams.append(stream) + stream.setparams((self.config.numChannels, 2, self.config.sampleRate, 0, 'NONE', None)) + + def Detach (self, stream): + """Detach a file or output device from the EAS output. See + EAS.Attach for more details. It is the responsibility of + the caller to close the wave file or stream. + + Arguments: + stream - open and attached wave object + """ + self.output_streams.remove(stream) + + def StartWave (self, dev_num=0, sampleRate=None, maxBufSize=None): + """Route the audio output to the indicated wave device. Note + that this can cause EASDLL.EAS_RenderWaveOut to return an + error code if all the output buffers are full. In this case, + the render thread should sleep a bit and try again. + Unfortunately, due to the nature of the MMSYSTEM interface, + there is no simple way to suspend the render thread. + + """ + if sampleRate == None: + sampleRate = self.config.sampleRate + if maxBufSize == None: + maxBufSize = self.config.mixBufferSize + with self.lock: + result = eas_dll.OpenWaveOutDevice(dev_num, sampleRate, maxBufSize) + if result: + raise EAS_Exception(result, 'OpenWaveOutDevice error %d' % result, 'OpenWaveOutDevice') + + def StopWave (self): + """Stop routing audio output to the audio device.""" + with self.lock: + result = eas_dll.CloseWaveOutDevice() + if result: + raise EAS_Exception(result, 'CloseWaveOutDevice error %d' % result, 'CloseWaveOutDevice') + + def Render (self, count=None, secs=None): + """Calls EAS_Render to render audio. + + Arguments + count - number of buffers to render + secs - number of seconds to render + + If both count and secs are None, render a single buffer. + + """ + + # determine number of buffers to render + if count is None: + if secs is not None: + count = int(secs * float(self.config.sampleRate) / float(self.buf_size) + 0.5) + else: + count = 1 + + # render buffers + eas_logger.debug('rendering %d buffers' % count) + samplesRendered = c_long(0) + with self.lock: + for c in range(count): + # render a buffer of audio + eas_logger.debug('rendering buffer') + while 1: + if self.aux_mixer is None: + result = eas_dll.EAS_RenderWaveOut(self.handle, byref(self.audio_buffer), self.buf_size, byref(samplesRendered)) + else: + result = eas_dll.EAS_RenderAuxMixer(self.handle, byref(self.audio_buffer), byref(samplesRendered)) + + if result == 0: + break; + if result == EAS_BUFFER_FULL: + time.sleep(0.01) + else: + raise EAS_Exception(result, 'EAS_Render error %d' % result, 'EAS_Render') + + # output to attached streams + for s in self.output_streams: + s.writeframesraw(self.audio_buffer) + + def GetRenderTime (self): + """Get the render time in seconds.""" + eas_logger.debug('Call EAS_GetRenderTime') + msecs = c_int(0) + with self.lock: + result = eas_dll.EAS_GetRenderTime(self.handle, byref(msecs)) + if result: + raise EAS_Exception(result, 'EAS_GetRenderTime error %d' % result, 'EAS_GetRenderTime') + msecs = float(msecs.value) / 1000 + eas_logger.debug('EAS_GetRenderTime: time=%.3f' % msecs) + return msecs + + def SetVolume (self, volume): + """Set the master volume""" + eas_logger.debug('Call EAS_SetVolume: volume=%d' % volume) + with self.lock: + result = eas_dll.EAS_SetVolume(self.handle, 0, volume) + if result: + raise EAS_Exception(result, 'EAS_SetVolume error %d' % result, 'EAS_SetVolume') + + def GetVolume (self): + """Get the stream volume.""" + eas_logger.debug('Call EAS_GetVolume') + volume = c_int(0) + with self.lock: + result = eas_dll.EAS_GetVolume(self.handle, 0, byref(volume)) + if result: + raise EAS_Exception(result, 'EAS_GetVolume error %d' % result, 'EAS_GetVolume') + eas_logger.debug('EAS_GetVolume: volume=%d' % volume.value) + return volume.value + + def SetPolyphony (self, polyphony, synth_num=0): + """Set the polyphony of a synth.""" + eas_logger.debug('Call EAS_SetSynthPolyphony: synth_num=%d, polyphony=%d' % (synth_num, polyphony)) + with self.lock: + result = eas_dll.EAS_SetSynthPolyphony(self.handle, synth_num, polyphony) + if result: + raise EAS_Exception(result, 'EAS_SetSynthPolyphony error %d on synth %d' % (result, synth_num), 'EAS_SetPolyphony') + + def GetPolyphony (self, synth_num=0): + """Get the polyphony of a synth.""" + eas_logger.debug('Call EAS_GetSynthPolyphony: synth_num=%d' % synth_num) + polyphony = c_int(0) + with self.lock: + result = eas_dll.EAS_GetSynthPolyphony(self.handle, synth_num, byref(polyphony)) + if result: + raise EAS_Exception(result, 'EAS_GetSynthPolyphony error %d on synth %d' % (result, synth_num), 'EAS_GetPolyphony') + eas_logger.debug('Call EAS_GetSynthPolyphony: synth_num=%d, polyphony=%d' % (synth_num, polyphony.value)) + return polyphony.value + + def SetMaxLoad (self, max_load): + """Set the maximum parser load.""" + eas_logger.debug('Call EAS_SetMaxLoad: max_load=%d' % max_load) + with self.lock: + result = eas_dll.EAS_SetMaxLoad(self.handle, max_load) + if result: + raise EAS_Exception(result, 'EAS_SetMaxLoad error %d' % result, 'EAS_SetMaxLoad') + + def SetParameter (self, module, param, value): + """Set a module parameter.""" + eas_logger.debug('Call EAS_SetParameter: module=%d, param=%d, value=%d' % (module, param, value)) + with self.lock: + result = eas_dll.EAS_SetParameter(self.handle, module, param, value) + if result: + raise EAS_Exception(result, 'EAS_SetParameter error %d (param=%d, value=%d)' % (result, param, value), 'EAS_SetParameter') + + def GetParameter (self, module, param): + """Get the polyphony of a synth.""" + eas_logger.debug('Call EAS_GetParameter: module=%d, param=%d' % (module, param)) + value = c_int(0) + with self.lock: + result = eas_dll.EAS_GetParameter(self.handle, module, param, byref(value)) + if result: + raise EAS_Exception(result, 'EAS_SetParameter error %d (param=%d)' % (result, param), 'EAS_GetParameter') + eas_logger.debug('Call EAS_SetParameter: module=%d, param=%d, value=%d' % (module, param, value.value)) + return value.value + + def SelectLib (self, test_lib=False): + eas_logger.debug('Call EAS_SelectLib: test_lib=%s' % test_lib) + easdll = cdll.LoadLibrary('EASDLL') + with self.lock: + result = eas_dll.EAS_SelectLib(self.handle, 0, test_lib) + if result: + raise EAS_Exception(result, 'EAS_SelectLib error %d' % result, 'EAS_SelectLib') + + def LoadDLSCollection (self, path): + eas_logger.debug('Call EAS_LoadDLSCollection: lib_path=%s' % path) + with self.lock: + result = eas_dll.EAS_LoadDLSCollection(self.handle, 0, path) + if result: + raise EAS_Exception(result, 'EAS_LoadDLSCollection error %d lib %s' % (result, path), 'EAS_LoadDLSCollection') + + def SetAuxMixerHook (self, aux_mixer): + + # if aux mixer has bigger buffer, re-allocate buffer + if (aux_mixer is not None) and (aux_mixer.buf_size > self.config.mixBufferSize): + buf_size = aux_mixer.buf_size + else: + buf_size = self.config.mixBufferSize + + # allocate audio buffer for rendering + AudioBufferType = c_ubyte * (2 * buf_size * self.config.numChannels) + self.audio_buffer = AudioBufferType() + self.buf_size = buf_size + self.aux_mixer = aux_mixer + + def SetDebugLevel (self, level=3): + """Sets the EAS debug level.""" + with self.lock: + eas_logger.debug('Call EAS_SetDebugLevel') + eas_dll.EAS_DLLSetDebugLevel(self.handle, level) + +#--------------------------------------------------------------- +# EASAuxMixer +#--------------------------------------------------------------- +class EASAuxMixer (object): + def __init__ (self, eas=None, num_streams=3, sample_rate=44100, max_sample_rate=44100): + eas_logger.debug('EASAuxMixer.__init__') + self.Init(eas, num_streams, sample_rate, max_sample_rate) + + def __del__ (self): + eas_logger.debug('EASAuxMixer.__del__') + self.Shutdown() + + def Init (self, eas=None, num_streams=3, sample_rate=44100, max_sample_rate=44100): + """Initializes the EAS Auxilliary Mixer.""" + eas_logger.debug('EASAuxMixer.Init') + + if hasattr(self, 'eas'): + raise EAS_Exception(-1, 'EASAuxMixer already initialized', 'EASAuxMixer.Init') + + # initialize EAS, if necessary + if eas is None: + eas_logger.debug('No EAS handle --- initializing EAS') + eas = EAS() + self.alloc_eas = True + else: + self.alloc_eas = False + self.eas = eas + + # initialize library + eas_logger.debug('Call EAS_InitAuxMixer') + buf_size = c_int(0) + result = eas_dll.EAS_InitAuxMixer(eas.handle, num_streams, sample_rate, max_sample_rate, byref(buf_size)) + if result: + raise EAS_Exception(result, 'EAS_InitAuxMixer error %d' % result, 'EAS_InitAuxMixer') + self.buf_size = buf_size.value + self.streams = [] + eas.SetAuxMixerHook(self) + + def Shutdown (self): + """Shuts down the EAS Auxilliary Mixer""" + eas_logger.debug('EASAuxMixer.Shutdown') + if not hasattr(self, 'eas'): + return + + with self.eas.lock: + if len(self.streams): + eas_logger.warning('Stream was not closed before EAS_ShutdownAuxMixer') + for stream in self.streams: + self.CloseStream(stream) + + self.eas.SetAuxMixerHook(None) + + # shutdown library + eas_logger.debug('Call EAS_ShutdownAuxMixer') + result = eas_dll.EAS_ShutdownAuxMixer(self.eas.handle) + if result: + raise EAS_Exception(result, 'EAS_ShutdownAuxMixer error %d' % result, 'EAS_ShutdownAuxMixer') + + # if we created the EAS reference here, shut it down + if self.alloc_eas: + self.eas.Shutdown() + self.alloc_eas = False + del self.eas + + def OpenStream (self, decoder_func, inst_data, sample_rate, num_channels): + """Opens an audio file to be played by the JET library and + returns a JET_File object + + Arguments: + callback - callback function to decode more audio + + """ + with self.eas.lock: + eas_logger.debug('Call EAS_OpenAudioStream') + decoder_func = EAS_DECODER_FUNC(decoder_func) + stream_handle = c_void_p(0) + result = eas_dll.EAS_OpenAudioStream(self.eas.handle, decoder_func, inst_data, sample_rate, num_channels, stream_handle) + if result: + raise EAS_Exception(result, 'EAS_OpenAudioStream error %d on file %s' % (result, path), 'EAS_OpenAudioStream') + self.streams.add(stream_handle) + return stream_handle + + def CloseStream (self, stream_handle): + """Closes an open audio stream.""" + with self.eas.lock: + eas_logger.debug('Call EAS_CloseAudioStream') + result = eas_dll.JET_CloseFile(self.eas.handle, stream_handle) + if result: + raise EAS_Exception(result, 'EAS_CloseAudioStream error %d' % result, 'EAS_CloseAudioStream') + +#--------------------------------------------------------------- +# JET_Status +#--------------------------------------------------------------- +class JET_Status (Structure): + _fields_ = [('currentUserID', c_int), + ('segmentRepeatCount', c_int), + ('numQueuedSegments', c_int), + ('paused', c_int), + ('location', c_long), + ('currentPlayingSegment', c_int), + ('currentQueuedSegment', c_int), + ] + +#--------------------------------------------------------------- +# JET_File +#--------------------------------------------------------------- +class JET_File (object): + def __init__ (self, handle, jet): + eas_logger.debug('JET_File.__init__') + self.handle = handle + self.jet = jet + +#--------------------------------------------------------------- +# JET +#--------------------------------------------------------------- +class JET (object): + def __init__ (self, eas=None): + # eas_logger.debug('JET.__init__') + self.Init(eas) + + def __del__ (self): + eas_logger.debug('JET.__del__') + self.Shutdown() + + def Init (self, eas=None, config=None): + """Initializes the JET Library.""" + # eas_logger.debug('JET.Init') + + if hasattr(self, 'eas'): + raise EAS_Exception(-1, 'JET library already initialized', 'Jet.Init') + + # create some members + if eas is None: + # eas_logger.debug('No EAS handle --- initializing EAS') + eas = EAS() + self.alloc_eas = True + else: + self.alloc_eas = False + self.eas = eas + self.fileOpen = False + + # handle configuration + if config is None: + config_handle = c_void_p(0) + config_size = 0 + else: + jet_config = S_JET_CONFIG() + jet_config.appLowNote = config.appLowNote + config_handle = c_void_p(jet_config) + config_size = jet_config.sizeof() + + # initialize library + # eas_logger.debug('Call JET_Init') + result = eas_dll.JET_Init(eas.handle, config_handle, config_size) + if result: + raise EAS_Exception(result, 'JET_Init error %d' % result, 'JET_Init') + + def Shutdown (self): + """Shuts down the JET library""" + eas_logger.debug('JET.Shutdown') + if not hasattr(self, 'eas'): + return + + with self.eas.lock: + if self.fileOpen: + eas_logger.warning('Stream was not closed before JET_Shutdown') + self.CloseFile() + + # shutdown library + eas_logger.debug('Call JET_Shutdown') + result = eas_dll.JET_Shutdown(self.eas.handle) + if result: + raise EAS_Exception(result, 'JET_Shutdown error %d' % result, 'JET_Shutdown') + + # if we created the EAS reference here, shut it down + if self.alloc_eas: + self.eas.Shutdown() + self.alloc_eas = False + del self.eas + + def OpenFile (self, path): + """Opens an audio file to be played by the JET library and + returns a JET_File object + + Arguments: + path - path to audio file + + """ + with self.eas.lock: + eas_logger.debug('Call JET_OpenFile for file: %s' % path) + result = eas_dll.JET_OpenFile(self.eas.handle, path) + if result: + raise EAS_Exception(result, 'JET_OpenFile error %d on file %s' % (result, path), 'JET_OpenFile') + + def CloseFile (self): + """Closes an open audio file.""" + with self.eas.lock: + eas_logger.debug('Call JET_CloseFile') + result = eas_dll.JET_CloseFile(self.eas.handle) + if result: + raise EAS_Exception(result, 'JET_CloseFile error %d' % result, 'JET_CloseFile') + + def QueueSegment (self, userID, seg_num, dls_num=-1, repeat=0, tranpose=0, mute_flags=0): + """Queue a segment for playback. + + Arguments: + seg_num - segment number to queue + repeat - repeat count (-1=repeat forever, 0=no repeat, 1+ = play n+1 times) + tranpose - transpose amount (+/-12) + + """ + with self.eas.lock: + eas_logger.debug('Call JET_QueueSegment') + result = eas_dll.JET_QueueSegment(self.eas.handle, seg_num, dls_num, repeat, tranpose, mute_flags, userID) + if result: + raise EAS_Exception(result, 'JET_QueueSegment error %d' % result, 'JET_QueueSegment') + + def Clear_Queue(self): + """Kills the queue.""" + with self.eas.lock: + eas_logger.debug('Call JET_Clear_Queue') + result = eas_dll.JET_Clear_Queue(self.eas.handle) + if result: + raise EAS_Exception(result, 'JET_Clear_Queue error %d' % result, 'JET_Clear_Queue') + + def GetAppEvent(self): + """Gets an App event.""" + with self.eas.lock: + eas_logger.debug('Call JET_GetEvent') + result = eas_dll.JET_GetEvent(self.eas.handle, 0, 0) + return result + + def Play(self): + """Starts JET playback.""" + with self.eas.lock: + eas_logger.debug('Call JET_Play') + result = eas_dll.JET_Play(self.eas.handle) + if result: + raise EAS_Exception(result, 'JET_Play error %d' % result, 'JET_Play') + + def Pause(self): + """Pauses JET playback.""" + with self.eas.lock: + eas_logger.debug('Call JET_Pause') + result = eas_dll.JET_Pause(self.eas.handle) + if result: + raise EAS_Exception(result, 'JET_Pause error %d' % result, 'JET_Pause') + + def Render (self, count=None, secs=None): + """Calls EAS_Render to render audio. + + Arguments + count - number of buffers to render + secs - number of seconds to render + + If both count and secs are None, render a single buffer. + + """ + # calls JET.Render + with self.eas.lock: + self.eas.Render(count, secs) + + def Status (self): + """Get JET status.""" + with self.eas.lock: + eas_logger.debug('Call JET_Status') + status = JET_Status() + result = eas_dll.JET_Status(self.eas.handle, byref(status)) + if result: + raise EAS_Exception(result, 'JET_Status error %d' % result, 'JET_Status') + eas_logger.debug("currentUserID=%d, repeatCount=%d, numQueuedSegments=%d, paused=%d" % + (status.currentUserID, status.segmentRepeatCount, status.numQueuedSegments, status.paused)) + return status + + def SetVolume (self, volume): + """Set the JET volume""" + eas_logger.debug('Call JET_SetVolume') + with self.eas.lock: + result = eas_dll.JET_SetVolume(self.eas.handle, volume) + if result: + raise EAS_Exception(result, 'JET_SetVolume error %d' % result, 'JET_SetVolume') + + def SetTransposition (self, transposition): + """Set the transposition of a stream.""" + eas_logger.debug('Call JET_SetTransposition') + with self.eas.lock: + result = eas_dll.JET_SetTransposition(self.eas.handle, transposition) + if result: + raise EAS_Exception(result, 'JET_SetTransposition error %d' % result, 'JET_SetTransposition') + + def TriggerClip (self, clipID): + """Trigger a clip in the current segment.""" + eas_logger.debug('Call JET_TriggerClip') + with self.eas.lock: + result = eas_dll.JET_TriggerClip(self.eas.handle, clipID) + if result: + raise EAS_Exception(result, 'JET_SetTransposition error %d' % result, 'JET_TriggerClip') + + def SetMuteFlag (self, track_num, mute, sync=True): + """Trigger a clip in the current segment.""" + eas_logger.debug('Call JET_SetMuteFlag') + with self.eas.lock: + result = eas_dll.JET_SetMuteFlag(self.eas.handle, track_num, mute, sync) + if result: + raise EAS_Exception(result, 'JET_SetMuteFlag error %d' % result, 'JET_SetMuteFlag') + + def SetMuteFlags (self, mute_flags, sync=True): + """Trigger a clip in the current segment.""" + eas_logger.debug('Call JET_SetMuteFlags') + with self.eas.lock: + result = eas_dll.JET_SetMuteFlags(self.eas.handle, mute_flags, sync) + if result: + raise EAS_Exception(result, 'JET_SetMuteFlag error %d' % result, 'JET_SetMuteFlags') + + diff --git a/jet_tools/JetCreator/img_Copy.py b/jet_tools/JetCreator/img_Copy.py new file mode 100755 index 0000000..6df3f2e --- /dev/null +++ b/jet_tools/JetCreator/img_Copy.py @@ -0,0 +1,51 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\xd3\x02,\xfd\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x02\x8aIDATX\x85\xcd\x97Mk\x13A\x18\xc7\xff\xcf\xce\xee\ +\x9a\xe0!9X\xfa\t\x92\x8dh\xfd\x06\x82\x07\x11z\n\xf8\x1dz\xd0[%\x8d"\x05O\ +\x966*\x05\xf1\x05\xf1\xe0I\xc5\xb3w\xa9\x96\xe2QQ\x0f\x01\xb5*B$x\xc8\x8b\ +\xdb$\xe6e\xc6C\xdc\xcd\xce\xb2\xb3/\xbaA\x1f\x08\x99\xd9\x99\x9d\xffo\xfe\ +\xcf3\x9b\r\xf0\x8f\x83\x00`{\xbbvn0\x1c-\xa6\xb9\xb0a\x18\xdf+\x17\xaa\xb7\ +\xa3\xe6\xe9\x000\x18\x8e\x16/U/\xa7\xa9\x8f\xcd\xda\xc6B\x9cy\xba\xb7\xd3n\ +\xb7S\x11\xcf\xe7\xf3\xb1\xe7j\xa9(\xfeE\xe8\xd1S\xe2\x07\xe7|>\x00\x8f\x9f<\ +<\xdf\xedvb\xe5\xd4\t"`\xb3v\xf5\x8aR\xd80\xdeVV\xab\'\x02\x01\xea\xf5\xba\ +\xd4\xefv;\x0b\x17\xd7\xd2-\xd2\xadk\x1bK\x80\xc2\x81R\xa9$\xf5\x9f\xef>\x03\ +\x90N\x91\x12\x11r\xb9\x9c\xdb\xff?\x8b\xd0\x9f\x82\xb4B\x08\x11\x0f@\x95\ +\x824\x84\xfd\x10\xa1\xa7@u\xac\x928\xe4\x08\n!P(\x14\xa0\xeb\xb2\xa42\x05ag\ +\xda\xefP\x98\xb0\x1f"\xd2\x01\xce9\x8a\xc5\xa2tmwo\'R0J8h<\x10\xc0\x0f\x13\ +\x14\xaa\x14\x84\tZ\x96\x15x\x8f\x04\xe0\x08&MA\xd8\xae\xfdcD\xa4\x06p \xfc)\ +\xd8{\xf9"\x10$\xae\xddsIA\\A`j\xbf\n\xc2\x05\xe0\x9c\xbb\x82a\xf6\x0b!\xdc|\ +F\xd9\xed|{\xdbD$\xad/\x01\xc4\x11\x8f#\x185?\x14\xc0\x1b\xfek\xce\x02\xaa\ +\x14D\xc1X\x96\x05"J\'\x05\x7fR\x80\x8c1\xf5\x930\xed\x14x\xc74M\x03c\xcc\ +\x05\xd0\xb4\xd9\x8f\xb0\x04\x90\xc9d$\x08\xefD\x7f1\xc5\xd9=\x11I\xc2N\xbb\ +\xf1\xad\x01\x011\x030L\xa3y\xeb\xceM\xe5\xff\x02\xa2\x19T\x12\xbb\x89\x08\ +\xf7\x1f\xdc\x83i\x9a\x00\x00\xd301\x1c\r\x91\xcdd\xa7\x8b:\x00\x95\xd5\xea]\ +\x9580}\xb7\xe3\x9c+m\x0e\xb3\x1b\x00N\x9f:\x03\xe7\xfe\xc1`\x80\xd7o^\x81@\ +\x8f\\\x808\x11\x04\xe0m\xab\xecf\x8c\x81s\x8eV\xab\x05!\x04>\xec\xbf\x87\ +\xdd\xb7;}\xfb\xe7Jb\x00\xd5\xaeU\xc2\xba\xae\x83s\x8e^\xaf\x07\xdb\xb6\xf1\ +\xe5\xebg\xf4\xfa?ZG\x8f/\x9d,/\x97{\x89\x00&\x93\t\xb2\xd9\xacT\x8cD\x04"\ +\x82\xa6i\xd2\x871\x06!\x04\x0e\x0el\x00\xc0\xfe\xa7\x8fh4\x1b\x02\x02;\x87\ +\x8e\x1c>[^.\xbbo\xb7\x14,\'\xc7\xf5\x1b[\xef\xc6\x93\xf1\xb1\xb8\xb0N\x88\ +\xdf\xb5\xaei\xac9\x16\x93\x95\xf5\xb5\xf5\xa7I\xd7\x98{\xfc\x02\\\xe5\x0c\ +\xee\x86\xfe\xecP\x00\x00\x00\x00IEND\xaeB`\x82h\xfd>s' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_Cut.py b/jet_tools/JetCreator/img_Cut.py new file mode 100755 index 0000000..2ce5ca5 --- /dev/null +++ b/jet_tools/JetCreator/img_Cut.py @@ -0,0 +1,104 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01-\x08\xd2\xf7\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x07\xe4IDATX\x85\xad\x97{PU\xc7\x1d\xc7\xbf\xbb{\xce\xb9\ +\x8fs/\xf7\x12^\x82T\xb8\x02Q\xab\xc18\nV\x1b\x9f\xa0M\x1f\x99\xb6\x7f\x946&\ +\x13;M\x94\xe9\xa4\x99vb\x0c\x125\xe6\x86\xd2\x82\x8f\x90L\x9264\xd3vR\x9b4\ +\xb1\xc9\xc4\xcc\xb4\xd3\xd6\x17\xad\xd1&\x05\xb5>\x88\x164 p\x91\xc7\xe5\ +\xa1\xf7r\x9f\xe7\xecn\xff\xc0\xeb\xe0\x03\x84iw\xe67\xe7\xcc\xd9\xdf~\x7f\ +\x9f\xf3\xdb\xfd\xed\xd9C0A{\xe9\xe5\xddU\xf1xl[$\x14wz\xbd\xde\x91\x89|om\ +\xbb_\xaa\xad3M\xf3\'*\xb3\xda7m\xda\x14\x19\xcf\x8f\x8e\xd7Q[[\x9b\xc59\x7f\ +:#=#\x96\xe4\xb2{\xa7\x12\xbc\xa6\xe6\xc5\xfb@HyZZzL\xc0\xdc4\x91\xef\xb8\ +\x00\xaaF\xdfY\\\xbcX[S\xba\xd6"\t~X\xbd\xbbz\xf6d\x82K)\x89f\xb1\xee]\xfa\ +\xa5/[\xd6\x96~\xc5\xc2(\xad\x98h\xec\x1d\x01jj\xaa\x96*\x9a\xb2\xb0 \xff^EJ\ +\x82%\xc5K,6E{k2\x00;\xf7\xd4lp:\x93\xf2rsr\xa9\x10\x12\xc5\xc5\xc5v\x9b\xa2\ +\xd5N\t\x00\x94\xce\xcf\xce\xfa\x02\xe3\x9cCJ\t\x8f\'\x8fZ\xad\xb6\xb9\xb5\ +\xbb\x7f\xf6\xc8D\xc1\xab\xab\xab\xd3\x18%\xbbW\xaf*u\xc4\xe3\x06\xa4\x94\ +\xc8\xcc\x9cN\xa5\x94ES\x02\xe0\xc0\xd9\xcf\xdb.1\t\t\x000\x0c\x13kJJuF\xd8\ +\xab;^\xd9\x914\x9e\x98M\xd7^\x9d\xfb\xc5y\x9a\xa2\xa8\x90R\x82R\x8a\x93\xa7\ +\x1a#\x9c\xf3O\xa6\x04\xb0\xf5\xd9\xad\xc7\xa5D\xdd\xf1\xe3\xc7\xc2\x94RH)a\ +\xb5\xda\x91\x9f\x9foM\xe2\x8e\x9a;\x8d\xf9\xf9\xae\xaa\xe5\x84\x90\x87\xee\ +\x9b7\xdf\xc29\x07\x00\x84BAttv\x85B\xc1\xe8\xfa)\x01\x00@(\x18y\xd1\xd7\xdd\ +5\x12\x0c^\x03!\x04\x9c\x0b\x14-*\xb6\x11\x8a\xf5;wV\x17\x8e\xf5\xad\xaf\xaf\ +W-\x8a\xe5w%\xabJ\xed\x86a\x02\x004M\xc5\xe1\x86\xc3!a\x98\x1b&*\xe1q\x01\ +\xbc^o\xd80\x8d\x8d\x87\x8f\x1c\ni\xdahJ\xe3q\x03\x0f,]fe\x9a\xf6\x96\x94\ +\x92$|\x83\xc1\xe1-\xe9\x19\xe9\xa9n\xf7=\x10B\x80\x10\x82\x8b\x17[\xcch,\ +\xdaXQ\xb1u\xffx1&\x04\x00\x80\xcag\xb7}\x14\x8b\xc5\x9aZ/\xfe\xc7$\x84@J ++\ +\x9b&9\x9c\xf9\xbbv\xd5\xac\x07\x80]\xbb\xaa<\xa0d\xcb\xf2\x07V\xeb\xf1x\x1c\ +RJ0F\xd0t\xf2D\xdc\x88\xf2\x1fL\xa4\x7fW\x00\x00\x88\xc7\xf8\xe3M\'N\xc4\x15\ +E\x81\x94\x12\xb1X\x0c%\xab\xd78\x08#\xaf\xd4\xd5\xedp3\xd5\xf6\x9b\xc5\xc5K\ +4\xc3\x18]\xf5\x16\x8b\x05G\x8f\xfd=D\xa4\xac\xa9\xac\xac\xbc\xfc?\x03TVV\ +\xb6I)^>v\xfch81\x15\x84P\xcc\x993W\xe3\xc2\xfe\x81\xc5b)\xca\xcd\xf1(\x89\ +\xd4_\xbd6\x84\xbe>\xff\xa0\xd3\x99|\xc7\xc5:e\x00\x00\x18\tD\xaa|\xdd]\xc1\ +\x91\x91 \x00\xc04M\xdc_x\xbf\x952\xba\xaahQ\xb1\x1e\x89D \xa5\x84\xddn\xc7\ +\x91\x86\xc3!3\x1e\x7f\xac\xbc\xbc\xdc\xf8\xbf\x01x\xbd\xde\xa8\xc9\x8d\xc7\ +\x0f7\x1c\n\xd9\xedvH)\x11\x89D\xb1jE\t9s\xf64\x84\x10P\x14\x05\xe7\x9a\xcf\ +\xc4Mn\xfe\xa5\xa2b\xeb?&\xa3;i\x00\x00\xd8\xb2y\xdb\x9f\xe3F\xfc\xd3K\x9f\ +\xb7\x9a\x8a\xa2\xe0\xe2\xa5\x16$\'\'C\xd34\\\xeeh\x07S\x18\xce5\x9f\x8b\t#\ +\xf4\xe4d5\xa7\x04\x00\x00<\x1e\xdd\xd0\xd8\xd4\x18\xb7X,\xf0u\xfb\xd0\xdf\ +\xdf\x8f\x15\xcbV\xa2\xa5\xf5\x02\x0e\x1e\xfak\x88ss\xcb\xe6\xcd\xde\xfe\xa9\ +h\xb2\xa98\x1f<\xd8p\xf5\xeb32\x9f\x18\x94"yu\xc9\x83H\xec\x92$\x1cF\xef\xc7\ +G\r\xc7\x81\x86\xb2?\xf5\xf4\x88\xa9h*Sq~\xc3\x86E\xeaG\xef{\x06=y8u\xb2\x11\ +\xe6o\xeb\x119\xff\x19b\x83\x03\xb0\xc5c\xbat\xba\x9e\x07\xb0}*\x9a\xe4\xee.\ +\xa3\xad\x1eP\x15\x079\xbf sf\x9e:#\x97\xb4gg\xa1\xf7\x83\xbd\xc8w\xa5!\xdb\ +\x99\x02P\xe0\xe3\xce\x960\xe7r\xd6\xc6\x08|\x93\xd5\x1d7\x03o\x03\xc9\x92\ +\xd2\'UB\xd6q)\xb3A\xa0Q\x83)\x16\xc2\x88>0\x00\xe3\\S\x04 \x1fv\x04\x87\xbe\ +\x95\xa2\xeav\xcdb\x81\xc7\x9d\xaeu\x0e\x0f\x9c~\x97A\x95\x00e\x94v\x19\x9c\ +\xbf\xab\n\xf1Z\x1904\xe9\x0c\xbc\r|\x87P\xfa\xebT\x97K\xc9\xce\xc8\xb0\xb9t\ +\x1d\x12@\xdf\xd0\x10\xda|>X\xdc\xb6\xa8?6r\xc4\x19\x10\xdf\x0e:\xc9{\x19\ +\xba\xeb\xab\xd3T\xa7\xc5a\xb7\xa3y\xa8\x1bk\xe7\x15\x81\x00\x18\x0e\x04\xd0\ +\xe6\xf3E\xae\x0c\x0c\x98\xe0\xfc\x89u\xc0\xbe\xbb\x02\xfc\x81\xd2g(c/\x14\ +\xe6\xe5\xe9\x86i\xa2\xa3\xb7\xf7Z0\x1c\xd6\x18c\xea\xc29s\x94p$\x82\xcf:\ +\xda\xfbX\xdc\x9c^\x06\xf0\xd7\xd2\xe0\xb0G\xe9\xd1\x99\xee\xf4\xf9\x0e\xa8\ +\x94ZU\xb4uv\x07\xb8\x10$\xc5\xe9$3\xb3\xb3\x1d\x94R4]\xb8\x1029\xafz\xd84o:\ +\x1d\xddT\x86\xef\x00e\x84R\xef\xc2\xd9\xb3\xf5\xce\xde\xdeps[[\xd7\xf0\xc8\ +\xc8\xf7\x15!R\xa2\xdcx\xee|[\x1b2RR L\x91T\x06p\x00\xf8\x91\x1f#AU\xac\xbc<\ +\xd4\x0fS%h\xef\xba\x12\x88\xc5b\x0fs\xc3\x98\xdd;4\xb4\xe5_\xcd\xcd\xc3\x1d\ +==\xd1\xa5\x85\x85\xbaB\xe9\xf6\xdfS\xfa\xdd;\x02\xec\x03\\\x84\xd27\xe7\x17\ +\x14\xd8\xdb\xbb\xbb\xc3\x83\x81@\xa3[\x88\x82\xc7\x80\xfde@D\x13\xf8c8\x16\ +\x8b(\x8a\x02Hy\xd3\xda\xf9\xf1\x10\x02jDr]\xd7\x117\x0c\x85\x00\'\xd7\x01W\ +\x1e\x05^gBx\xae\xf8\xfd\xad\x97:;cEs\xe7\xea\n!\xbf\xda\x07\xdcs\x1b\x80Iiy\ +\xaa\xdb\xad\x00\xc0\xc0\xd5\xab#n!\x1e\xfc\x1a\x10K\xf4s`Y\xb2\xae\x1b\xc1P\ +\x08\nc\xed\xb7N\x9dBY\xbb\xce,p\xdal\xa6\x00V&\x9e\x97\x01\xd7\x98\x10\xcb\ +\xbb\xfd\xfe(\x01\x90\x95\x96\xa6\x1a\x94n\xbc\r\x80\x12\xb2>;=\xdd\xee\xeb\ +\xef\x0f\x9bB\xfctl\xf0z\xc0\xce\x18\xdbyonnRgOO\x94\x0b\xb1\xf7V\x00.\xc4\ +\xde\xae\x9e\x9e\xa8\'++\x89R\xba\xa7\x1e\xb0\x8f\x85\x90\xc0\xce\x8e\x9e\ +\x9e\xa8\';\xdb\xa62v\xe3\x88F\xc7\x08x\x1c\xba\x8eP8\x1c\'\xc0\xa9\xb1\xc1\ +\x93\x18;\x90\x99\x9a\xea\xd24\r>\xbf\xdf0\x84\xf8\xe5m\x19\x10\xe2\x17\xdd~\ +\xbf\xa1i\x1aR\\\xae\x14\'\xa5\x07\xc7Bp!\x9a\x82\xa1P\xd4\xe5t\xc2\xe4<\xf7\ +6\x00B\x88\t\x00\xba\xcd\xc6\x08P\xf8\x14\x90\xf4&\xb0\xce\xc1X[fj\xea\x82y\ +\x05\x05\xb6O\xce\x9c\t\rJ\xf9\xf4z@\x02H\x01\x90\x9a\xb02\x80\x0c\x00\x9bN\ +\xb7\xb6\x86f\xe5\xe4XS\xdd\xee\x05\x0eJ\xdb\xeb\x81u\x8f\x00I\x84\xd2\x85\ +\x0e]W)\xa5\x00pc\xbb\xbeQ\x86\xef)\xca\x87\x0599\xdfLq\xb9Hcss\xc8\xe4\x9c%\ +\xe9\xba1\xdb\xe3qZ5\r\xff<{6\xdck\x9a\xf5Oq\xfe\xc6up\x8a\x9b\xcbX\x02\x10u\ +\x8cm\x9c\xceX\xf9\xc2Y\xb3\xecQ\xc3@\x9b\xcf\x17\x0c\x84\xc3\x9a\xaa(\xa2d\ +\xf1b\xdbp O\x9c?\xff\xb7\xef\x19\xc67\x00\xf0\x84\x80R\x03\x14\xe40\xf6\ +\xe9\xac\xdc\\\xc7\x8ci\xd3\xa8\xaa(\x08\x8c\x8c\xa0\xbd\xbb;\xea\xf3\xfb\ +\xf9\x05)_\xa8\x12\xe2\x00\x00\x15\xa3;h\xc2\x18FK\xd2L\xd8s\x94\x96\xce\x03\ +\xb6g\xa5\xa51\xcf\xf4\xe9\xd6\x14\xb7\x1b\x00\xe0\xeb\xeb\x13\xffni\t^4\xcd\ +\x15\xcf\x03-\x00\x8c\xb1o@\xeb\x80\xc2tE\xd9CF\xffd(\x08\xe9\x1d\xe6|\xff\ +\xfbR\xeem\x00\x82\xd7\x83%\x8c\x8c19\xc68\x00\xbe\x0cp\x96\x11\xf2h\x8a\xa2\ +\x80Cu`\x98\x06\xf1D\x8c\xd1\xbf\x8f0:2\xc2\xfe}/\xd0\xda\xda\xb6f\ +\xee\xdc|\x1bV\xa0\xd8n\x8d\xdcbt\xf43\x0e\x1d~\x95\xb6\xd6v\x06?\x1c\xe3\ +\xca\xdb\x9f29\xbbDc\x8d\x87\x83{\x9a9\xf9R7\xcf>\xb3\x93\xdf\xfc\xf6\xd7\ +\xb44\xb7\xb1\xff\xf9\x17\x1e\xa9\x80T\x0e\xa0\xb8\n\x84\x10\xdc\x99\xb9Mo\ +\xef+x}\xf5\x1c\xe9\xfb\x13\xff\xba\xa7\xf3\x8d\xd7\xbb\xf8\xe5w{\xf9\xf6\ +\x1b_ k;8\xf6\xfdw\x99\x8e\xa69y\xe2\xcbLMO\x92J\xa7\xf2\xb9QJ\x81\r\x01\x00\ +\xcc\xce\xce\xe0v\xbbhmm\xe7\xcd\x9f\x0cq\xe2@\x88\xaf\xbc\x18dsC%^\xb7B\xc0\ +\xabr`w3\xa7z\xb7\xf1\x9d\xb7?f)c\xb1o\xdf\xf3|\xf2\xc90B\x08l\xdb\xde8@)\ +\xa9"\x93\xe3<\xb7{\x0f\xbf\xff`\x8c\x9d\x9d\x9b\xe8\xde\xde\x82\xac(\xc8\ +\xb2\x8c\xaa(8T\x15\x97\xd3I]\xb5\x8f\x03{\x83\xfc\xf4\xf2\x08\xdb\xb6ngrj\ +\x02\xc306\xbe\x04\xb9\x97s\x96Sa.\x1a\xc5S\xe1a\xf0\xfa,;\x83\x01\x0c\xd3B7\ +,4\xc3\xc4\xb0,\xc0F\x126+\xbaAK}\x15\xb7\xa6\xee\x93\xcad\xa9\xf6\xfb\x99_\ +\x98/\xbb\x04\xebnD9\xcbjY4-\xcb\x9d\x85eL-\xcbr2\x8d\xa6J(\x92\x00\x1e\xc8\ +\xfb\x9f{1\x16\x17\x93\xe8\x96\xc0\xad\nn\xdf]\xc4\xe9r\xa3kZY\x80\xb29\x00p\ +\xe3\xc6\r$\xe9\xc1+\xaa\xea@7t\x02~\x0fK\x1a\xc8\xaa\x03Eu\xe0p9q\xb9\xdc\ +\x98B\xc1_]M\xc7S\xcd\xb4lj$k\x80m\xe9,%\x128\x1c\x8e\x87\x02\x97U\xc00\x8c\ +\xfcZ\xf5\xf4\xf4\xa0\xad\xd2764\x92I\xaf\xf0\xc5\x1d~>\xbeu\x1b\xd9\xc8P\ +\xe9\x92Q0\x11\xb6\x8e,l\x0c\x0b\xb2\xa6\xe0\xce\xa2Nm\xa5J\xad\xcf\xc9\xfc\ +\xfc<\r\r\x8de\x01\x1eY\x05\x85\x1bQ8\xbc\x8d\x91\xd1\x11N\xbc\xf4\x0c\x8b\ +\xf1\x15\x12Y\x99*_\r\x81\xc6&\xda\xdb;\x08\x05\x83l\xd9\xd2IM\xa0\x89kc\xf7\ +\xf9\xe6kA\xa6\xa7\xa7I$\x12\xcc\xcdE7\xae@\xb9\x8dhS\xd3&\xae_\xbf\xca\xc2|\ +\x94\xf3\xdf\xda\xcf\x9b?~\x9f\xb1\xc9Y\x9em\xf7R[%\xa3\xeb\x16\xe3w\xd3\xdc\ +\xf8\xe7}\xfa\xde\xd8M\xb8\xa3\x8eH$A\xd7\x9en\xce\x9d?\xc7\xe1C\xafnL\x81\ +\xc2%(\xb6\xde\x97\x0f\xf1\xfe_\x86H\xc4\xe6\x18\xf8\xe1a\x0e\xedm\xe3o\x13\ +\xcb\xfclp\x8aw\x86\x17\xe9h\xaa\xe5\xf2\x0f^a\xdbS~&\'#$b\xcbd2Y\x9e\xfb\ +\xdc\x1e\x06\x07\x07P\x1d\n}}}kb>t|\x1d?~\xdc\xbep\xe1\x02\xb1X\x0c!\x04\x86\ +a\xe0\xf1x0M\x93\xb1\xb11VV2L\xfc;BMM\r={{\x08\xd47\xa0:\x1c\x98\x86I,~\x9fO\ +?\xbb\xc9\xd0\xd0\x10\xa1`\x98\x96\xe66\x0c\xc3 \x1a\x8d\xa2\xaa*\x13\x93\ +\x11F\xff1\xfa\x07aI\'/]\xba\x94,\tp\xf4\xe8Q\xfb\xe2\xc5\x8b%\x01r\xa5)I\ +\x12ssQ\xc6\'\xc6\x99\x9d\xb9C2\x95DUT|>?\xa1P\x98`g\x88s\xe7\x7fAUU\x15\x9d\ +[B\xe8\x9a\xce\xc2\xc2\x02\x0e\x87\x83\xb9\x85(W\xaf~8b(\xf6\xc1\x81\x8b\x03\ +w\x1f\xeb0\xca\xd9\x83kv\x03\x8d\x8dM\xf9\xbd"w\x82\xe6\xec\xeb_{\x8b\x0b\ +\xbf\xea\xe7\xda\xf5\x8f\xd8\xdb\xf5y\xea\xea\xea\x88\xc7\xe3\x84\x83a\x02\r\ +\xf5;\x06~w\xe5\xe7\xc0\x91\xe2\x1c\xf0\n!\x96l\xdb\xc6\xeb\xf5\xe2\xf5z\xf1\ +\xf9|\xb8\xddn***\xf0x<8\x9d\xce\xfc\xbf%M\xd3H\xa7\xd3\xa4R)\x92\xc9$\x89D\ +\x82D"A<\x1e\'\x9dNs\xf4\xc8\xebl\xeex\x9a?\xbf\xfbG,\xcb\xa4\xa5\xb5\x99\ +\xb6\xcd\xcdtwwc\xc3\x8b\xb0\xb6\n\xaa\x80\xfa\x99\x99\x99\x1f\x9d:u\xea{B\ +\x08w\xf1\x97\xe7.\xac\xb9\x83\xa5\xd4s\xa1\x1a9\x97\x15\x89\xcbW.s\xec\xd81\ +\xda]m\x0c\x0f\x0fc\xdb\xf6G\x80\\\x98\x03N \x00\xd4\x02\xfe\xd5\xbe\\\xc4 \ +\x17\xb8\xb4\xearA+\n\xdc\x06\xacU\xcf\xb4?\xdd\xde\xbec\xfb\xf6\x13N\x973l\ +\x99\xe6\x07)c\xe5\xad\xf7\xdeyo\xba\xd4%\xce\t\xb8V\xdbr\x97\xeeN,\x88\xf9\x03\xa4\ +\x94A\xff.!R\xc0\x05S\xb1\x00qi\x88\x93\xbf\x1f )5Q\xa3]-\xde\x7fe\x93N\\\ +\x11\x8et\x9eX\x07\x92G5\x8f\x92G}\x1d1\xb5\xa8\x13\\o\xe6=\xd4\x1f\x83\x9e\ +\x85\x88;G\xb5N\xe0c\xbb`\x08 i|5\xdaY\x94\x19\x949<5\x02\xff2\x8a[\x0e\xbb\ +\xefOp\x9d?\xa1\xe0^\x82;\x00W\xe5\xb4\xf5\xda\x8c\x02\xd8\xdc\xdc\x8c\x05\ +\x88\xbb\x1a\xdbL\x89\xca\xeec\x96>l=E\xdbO\x99lnA\xccJ\xe8\ +\x9cCU\xa3\xa8\xae\xd9\x92J\x19\xa7\x0f\x81\x02\xeag0r\nD\x00\x81L\xf3b\xe7\ +\x19\x9f\x7f\x16\xfe\xc4dsK$\xaa\x8e\x91\n\x0c\xda85\x01s8fPN\xf0\x1c!z\x01\ +\x92\xc5\x9b\x05~\xf9\xf5Gd\xb2\xfe\xa4\x7f\xce\xb1\xbb \xcd\xf9\xd5\xd6\xb3\ +(eT\xcb\xd1PA)Po\x0c\x95\xdcx\x00\xfd\x11\xa6\xb5g\x92\xa9\xeaeJS\x01\x06w\ +\xbd\x9e]wm\x18\xb5{&\x02\x84a\x18\xeb4\r(\x0e`\xd0\xc6V \xceq\xda:pS\x80\ +\xc4\x85\x08`cc\x03c\x86\x0bg\\@cLjm\x0c\xcd\x1e\x86\xe1e\xaeVVVFnLI\x8e\x93\ +\x14\x8a\xb3\x91)\x18\xdc\x9aG)\x11\xbf&\xa4\xdb\xc8\x14\x8c\xe34\xed]\x1aLl\ +\x17$\xb5\xe1M\xc0z\xcbz\x92\xddH\x81\xdb\xb4k\xed\x05iv\x13\xe5n\x04\xd0\ +\xdf\x19i \xaa:\x12l\x10\xa0$"g\xaaZ*\x95J\x88D\xe7\x02k\xed\x7f\xae\x0b\x80\ +l6{\x0e\xdc\x03N\x80\xd6 \xc0\x14P\xde\xdb\xdb\xfbzuu\xf5+\x91\xee\x89\xe2\ +\x96LU\x9b\xbb\xbb\xbb\xdf\x00\x0b@\x00\x1c\x00\xbe_\xc3\x1c0\x0f\xdc\x01\ +\xa6\xbb\xe3\xe0\x96\xfc7\x89\x82}\x0b\xd4\x80\xbf\x80\x0b\x88?\x1d\xe7\x80|\ +\xf7~[\xa7g\x07t\x88do\xd1\xf7?\xfd\x1fi[\xcc\xd5\x90zP\xe4\x00\x00\x00\x00I\ +END\xaeB`\x82\xd34\xc5\xd2' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_Open.py b/jet_tools/JetCreator/img_Open.py new file mode 100755 index 0000000..7a1fe25 --- /dev/null +++ b/jet_tools/JetCreator/img_Open.py @@ -0,0 +1,79 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\x96\x05i\xfa\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x05MIDATX\x85\xed\x96Ol\x13\xd9\x1d\xc7?ofl\'v\xb6\x0eN\ +\x1c\xa5E\x02\xad@P$\x96C\xb47\n\xe5\x92Ks\xe1\x88\xb6R9\xf5\xc4\xa9\xf7\x82\ +\x84\xf6\x80\xe8\xb5\x87\xaa\x08\xf5\x86\xca\xa1Zi\x0fU\xa5\xa5\xda\xf6\xd0U\ +\xcb\x8av\xd5\x06*6 \xc7I\x086\x8e\'x<\xf6\x8cg\xe6\xfd\xe9!\xb1\xeb\xb1M \ +\xab\xaa\xbd\xf4;\x1a\xbd\xf7~\xbf7\xef\xfb\xfd\xfd\xde{\xf3\x1e\xfc\x8f!\ +\x0er\xae\xac\xac\xfc\x00\xf8m&\x93\xe9\x8e\xf6\xb5,\x0b\xdb\xb6\xb1m[\xd8\ +\xb6\x8d\xe38\xfd6\x96eaY\x96\rd\x87m\xc3\xe5\xad[\xb7\x04\x80s\xa0:!\xbe\ +\x9c\x9e\x9e\xe6\xfe\xfd\xfb\x05)%\xc6\x18\x00\x8c1\x83\xb7\x8f\xd1\xb6eYd2\ +\x99\xd4x}\xff\xf5\xeb\xd7\x076\x07\xe0\xea\xd5\xab\x7fL\x92\xe4\xfb\x93D\ +\x84a8,(U\xbe\r\xc3\x82\xfaPJ\xa1\xb5V)\x01I\x92\x9c\xbfq\xe3\x06\xadV+\x15\ +\x811\x86\xdb\xb7o\x03\xe0\xba.\x0f\x1e\x9f?\xd4\xea\x0f\x82 eK\x92\x84g\xcf\x9e\xc5B\ +\x88\xbbc\x02\x80W\xbe\xef\xeb\xb3g\xcfb\x8c\xa1R\xa9p\xf9\xf2e\xfe\xf9t\x8d\ +\x9f}\x161\xfe;\xf9\x86\xc8.\x17\x81\xd7\x1f\xfexy\\@\xbb\xdd\x16\xae\xeb\ +\xd2h4\xd8\xdc\xdc\xe4\xe8\xd1\xa3|\xfe\xe7U\x8e-\xce\xf0\x93\x8f\xce\x1f\ +\x9e\xcc\xf4\x8bq\xf9\x06\x88"\xc9O\x7f\xf9\x87-\x07\xc0\xb2\xacW\x9e\xe7\ +\xe5\x16\x16\x16\xd8\xde\xde\xe6\xd4\xa9St:\x1dZ!|\xa7<\x8b\xebG\xacnx\x07\ +\xf1\xa4\x08\xc7m\xe9\xf6\xd1\xb9i^\xbf\xee\x80\xb1>\xb7\x00\xee\xdd\xbb\xd7\ +\x8e\xa2\x08\xd7u\xa9T*\\\xb8p\x81f\xb3\xc9n (\x15\xf3\xb4\x03\x99"4\x801\ +\xa0\xf7\x0f m\x0c\x1a\xb3\xdf\xde\xf3\x19\xdd\xef\xb3\xdf6{\xd2\x946d\x1d\ +\x8b\xaf7\x9b]%\xe5\xef\xad\xfe\xc0B\x88V\xa1P I\x12fff\x10B\xd0\xe8\x18f\ +\xbf\x95\xc7\x0f\xe5D\xc2\x14\xc1(a\xff\x19\x9c\x9c \x95!L$SY\x9b\xb5\x8d\ +\xa6\xb0\x84\xf9bp\x1c[\x96\xb5\xdbl6\xcb\x9dN\x87L&\x83\xd6\x9a\xa6\xaf\x98\ +\xc9gi\xf5\x12t\xff(\x9e\x98\xde\xfe1\xfd\xe6\xe9I\x94&\x91\x9a\xc2\x94\x83\ +\xeb\x85D\xb1\x8c\xbf\xbc\xfb\xa3\xf5\xe1\x0c\xd4\x1c\xc7!\x08\x02\n\x85\x02\ +\xb6\xed\xe0v$\xf9\xa9\x0ca\xac\'\xa6S\x0fE\xb7\x175\x83z\xdf\xa7\x94\xa1\ +\x97(b\xa91@>g\xb3Q\xf3\x10\xb6\xf5\x05\x0c]H\xb4\xd6\xdb\xbb\xbb\xbb(\xa5\ +\x10B\xb0\xd3\xd1\x94\x8f\x14\xe8%\x06\xa5\xf4X\x84\x93\x16\xdfp\x1f\xa5\xcd\ +\xe0\x1dF\xd6\xb1Y\x7f\xe1vu\xac~\x93\x12\xa0\x94Z\x97R\x1a\xc7qD\x14El4c\ +\x16\xe6\xde\xc3\x0f\x93At}B\xdd_\x07z\x7f\xae\x87\xa7c\x90\xa1q\x08\xb1w\ +\xaf\xdb\xac\xb7l\xa9\xad\xcfF3\xf0\xaa\xd5jER\xca\xa9\x9b7o\xd2\x9e\xfb\x1e\ +\x1f\x9e\xbfD\x10)\xa4\xdeK\xa52\x06\xa3\'\x0f\xfe.\xc896\xf5\xdd\x0e\xc6\ +\x98\xdaW\xbf\xfa\xe8eJ\x00P\xeb\xf5z\xc9\xc5\x8b\x17\xa7vvvx\x18|\x9b\xfcT\ +\x16/HH\xf6\xa7`\x14\x93\xae\\\x03\xdf\x04\x9b\xb0`\xf3\xe5\xae4\xda|\xd2\ +\xb7\r\xef\x82\x86\xef\xfb*\x97\xcbQ\xf7\x14\xf6\xb4C\x8cE\x10\xff\xfb\x1f\ +\x80\x99<\xf0\x81\xc4\xfb\x06\x01\xc4\x89a\xe3e\xb3\'5\xbf\x1e\x13 \xa5|\xe5\ +\xfb\xbeS.\x97\xa9\x89\xf7\x99/\xcf\xe3\xf7$Z\x8dl\xbf7P\x9aqS\nB\x08Z\xcd6I\ +\xac[\x7f\xbb\xfb\xc3\xbf\x8e\tx\xfc\xf8qx\xe2\xc4\x89\xdcW\xf5)B{\x8ecG\x8a\ +\xf4b5>\xd2\x9bx&\x90\xa6\xfd\x86j\xb5\x16\x06\xbb[?\x07\xde\x03\xfc\x94\x80\ +\'O\x9eD\xc7\x8f\x1f\x7f\xda0\xc7>@\x1a\x9e\xfc\xfd\xeb\x03\xc9\x0f\x03\x03\ +\xca\x08\x81\x8a:\xffX\xfb\xf4\xe3\xdf\x01\xd9\xbeo\xf8\x82_\xcc\xe5r\xe5bi\ +\xe1}\x91?R\x92I\x92\x1d\x1f\xea\xf0\xd0\xda\xc8^";Bi\x154+u\xa0\tl\x03jT\ +\x00@\x0e(\x02\xd3@\x86\xff\x1c$\x90\x00\x1e\xd0\xe5\xedk\xf9\xff\xf8\xef\ +\xe1_\x86IG\x92\xf3G\x04=\x00\x00\x00\x00IEND\xaeB`\x82\x8f\x9d\xc6\xf3' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_Paste.py b/jet_tools/JetCreator/img_Paste.py new file mode 100755 index 0000000..842c4a7 --- /dev/null +++ b/jet_tools/JetCreator/img_Paste.py @@ -0,0 +1,41 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\xdd\x01"\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x01\x94IDATX\x85\xed\x97\xbdN\xc30\x14\x85OJ\x06gK6\x18;\ +\xa6\x1bk^\xa1\x8fS\xb5\x08\x18\x10\x03c\x07\x84X\x902\xb6o\x90\x951\xdd\xca\ +\xd6\x8c\x1e\x93\xcd\x06\x06\xdf\xad\x0c\xb4\x15HIs\x9dDD\x958[,\xfb\x9e/\ +\xbe\xd7\x7f\x8e38C\x9fr\x01\xe0\xe9\xe5qKZw\x1cZ`:\xbbrX\x00\xa45&\x93\xdbN\ +\xed\xe7\xf3\x07V?\xf7\xe7\x87\xeeh\x16|\xdfg\xf7\x1dt\xe2\xd8B\xff\x00nYc\ +\x96e\x8d\x82\r\x87C\x08!\xda\x03\x84a\xd8\x08\xa0\x89N#\x05i\x9aB)\xb2\x0e~\ +s}\xbf\x05\x80 \x00\xa6\xb3\xbb\xd2M\x89\x95\x82$y\x85\x94\xd6\xfe,\x9dF\n\ +\xfe\x1c\xa0,\x05{\x8dF\xe7\x10\xc2\xab\rLd\xb0\xd9\x14\xcd\x00\x8e\xc9\x18\ +\x821\x9c\x9e\xbc\xa2\xb5N\x81\xd6\xc4\nN\xccUS\x99\x02\xa2\xf2\x00ax\xc1\ +\xda\xedV+\t\x98z\x88R\x80*s\x00H\xd3n\xd7\xe3/\x80c\xc6{\x8d\xc7\x97\xa8\ +\x9b\x80\xf5ZBJ\xde\xdd\xc2\xba\x08\x93\xe4\xcdv\x08\x0f\x80\xf3\xf7\x00\x10\ +E\xbc\x13\x8f\x88X\xe9\xb2\x9e\x81,\xcbm\x87t\x0b\xd0\xe4Pb\x01\x10\x91\xf5e\ +\xa2L\x9e\x07\xf8>v\x85*vm\xd5\xd0;\x00\x818~nm\x0e|\x1bGQx\xb8\x19\x17E\x81\ +<\xaf\xae\x05\x17@\xed\x03b\x7f\xae\xf3!\xc4\xc1\\)\x05)\xab\xeb\xc6\xba\x06\ +8\xd2Z\xc3\x18\x03M\x1aRJ,\x16\x8bv\x00A\xc07\xf7< \xcfs(RX\xc6K(\xa5\xf0\ +\xfe\xf1Y9\xc3N\xdf\x8f\xd3\xdeoD\xbd\x03|\x01\xd0i\x97\xf5j]\xc4\xe0\x00\ +\x00\x00\x00IEND\xaeB`\x82q\x05\xc6\xef' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_Print.py b/jet_tools/JetCreator/img_Print.py new file mode 100755 index 0000000..cf2e00d --- /dev/null +++ b/jet_tools/JetCreator/img_Print.py @@ -0,0 +1,62 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\xf5\x03\n\xfc\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x03\xacIDATX\x85\xe5\x97\xcfK+W\x14\xc7?\x93d\x921&5\xc4TD\ +\x9fZ4\xb8x\xbc\x85F\xe9?P\xca\xdb\n\xee\xdd\xd5TT\xac\xbb\x16\xe9+B\x97>\ +\xa5.Z(B\xb7.\xba.v\xe9>\x1b\x17\x82P\x8a\xf8\xe3\x11SS\x13\'\xc6\x9a\x99;s\ +\xbbp2L\x12\x7f\xcc3\xb6]\xf4\x0b\x87\xdc{\xee\x99s\xbe|\xcf\xbdw&\xf0\x7f\ +\x87r\xdf\xc2\xc6\xc6\xc6\x0f\x86a\xcc\x02\x816k\xd8\xe1p\xf8\xc7\xe5\xe5\ +\xe5\xb9\xbb\x16C\xf7=e\x9a\xe6\xec\xd2\xd2R\xbb\xc5\x01\x02\x9b\x9b\x9b\xb3\ +\xc0\xfb\x11\x90R\x06\x00\xce\xce\xce\xda\xaa\xde\xdb\xdb\xeb\xe6z/\x02^\x9c\ +\x9c\x9c\xdc\xe9\x17BP*\x95H\xa5R(Jc7\x07\x06\x06|\x11|\x94\x80\xaa\xaa\x0c\ +\x0f\x0f\xdfY|oo\x8fZ\xad\x86\x10\x82\xd1\xd1Q_\x05\x9fD\xe0\xf8\xf8\x18\x00\ +)\xa5\xeb\xcf\xe7\xf3T\xabU\x00\n\x85\x02\x00\xf1x\xdc]\x1f\x1c\x1c|\x1e\x02\ +\xa1P\xa8E\x81\x83\x83\x03\xb7x\x1d\xe7\xe7\xe7\xa4\xd3ib\xb1\x98\xeb\xf3\ +\x12~2\x01UU9::r\xe7\xa5R\x89\xd3\xd3\xd3\x968\xdb\xb6\xc9\xe5r\x8c\x8c\x8c\ +\x10\x08\x04\x18\x1a\x1az\xb4\xb8o\x02\xe9t\x1a\x80b\xb1\xc8\xfe\xfe\xfe\xbd\ +\xb1\xb5Z\r]\xd7\x99\x9c\x9c\xf4U\xdc7\x81\xc3\xc3Cw\x9e\xc9d\x00\xc8\xe5r-\ +\xb1SSS\xa8\xaa\xda\xe0\x13B\xb4G@\xd7uR\xa9\x94;o>n^\xdc\xdc\xdc \x84h\x88\ +\t\x85\x1e.\xf1\xe0\xaaa\x18\xeeE\xe4M\xaa(\x8a\xab\x84\xd7_,\x16[\x88\xf6\ +\xf4\xf4\xf8\'\x90\xcdf?\x0e\x06\x83\xbfX\x96\xd5\rpqqqgR/\x9a}\xcd\xf3\xba\ +\x02\xd9lV\x86\x82\xc1B\xcd0>\xd9\xda\xdar7\x92\x1b\xbd\xb8\xb8\x18\t\x06\ +\x83\xbf\xaf\xac\xac\xf4\'\x12\t\xd6\xd7\xd7\x19\x1b\x1b\xa3R\xa9\xb4$\xbe\ +\xebx\xddG\xa4\xb3\xb3\x93\\.\xc7\xc2\xc2\x02\xe5r\x99\xb5\xb5\xb5\xdf\x92\ +\xc9\xe4\xcb\xd5\xd5U\xd1\xac\xc0W333=\x89D\x02\x80d2\xe9^0\xed\xe0\xea\xea\ +\x8ax<\xce\xf5\xf55\xb1X\x8c\xe9\xe9\xe9\x8f\xb6\xb7\xb7\xbf\x04\xbem\x08\ +\x9c\x9f\x9f/Y\x96%m\xdb\xf6e\x96e=\xc9\x84\x10rn\xee\xf3\xabz]W\x01!DBJI>\ +\xff\x0eUU9=}\x87\xa6i$\x93I\xa4\x94\xdc\xaa.AJl)\x01\x89\xb4Ar\xdb\x0ey;\ +\xb9]\x93\xcd~\x89\xaeW0\x85\xc9\xf8\xf8\x04\xb6-;[\x08\x00X\x96\xc5\xe5\xe5\ +%\x03/\x06\xb1,\x8b\xae\x0f\xe2D;\xa2\x9e\x88zr\x1a}@\xe3\xb6h\x8e\x93\x9c\ +\x15\xfe\xe0\xe6\xafk\x8cZ\xad\xe1\xe9\x86\xf7\xb4eY\xec\xec\xfc\x8a\x10&/\ +\xfa\xfb\xd14\x8dpX\xf5X\x98p$L\xa4\xc1"D"\x114\xcdk\x1aZ\x87F\x87c\x00\xbb\ +\xbb\xbb\x00\x18\xa6\xd1@\xa0E\x81\xbe\xbe>\xbe~\xf3\r\xa6i6\x04\xd6\xf7\xf8\ +\xe3\xaf\x97V\xa8\xaa\xca\xabW/o\t\x18\x0f\x10\xb0m\x8b\x89\x89\x0c\x99\xcc8\ +RJl\xdbv\xfa\xef\x19\xdb6\xb6\xe3\x93\x8e\xcf\xf63v~\xcd&\x02--\xf8\xa7a4)\ +\xfb\xef\x13\xf8\xaf\x15hnA}\x0fD\x02\x81\x80Q\xa9\xe8\xe1h4\xea\xe9\xbbs\ +\xde\xbdc\xdb{\x0f8{\xc1\xcfX\xdaH\t\xba~\x89\xa2(\x16\x90\x04\xca!G\x85\xae\ +j\xb5\xfa\xfd\xdb\xb7\x1b_\xf8\xf9\x8cj\x07\x8a\xa2P.\x97\x7fr\x08H\xc5Q\xa1\ +\x1bH\xbd~\xfd\xe9|w\xf7\x87\x9fI)}}\xae?\x01V\xa9T\xfaygg\xe7;\xe0O\xa0P?\ +\xde\x9a\xc3\xa8\x0b\x88:\xa4\x9e\xe3_\x91\x17\xa6\x93\xd3\x04\xae\x80s\xe0\ +\xb2\xf9\x05\xaf\x02a \xf2\xcc\xc5\x01,\xc7L\xc0\xe0iw\xda\xf3\xe3o\xfe\xfdT\ +R\xd6\x04\xb1Y\x00\x00\x00\x00IEND\xaeB`\x829\x9b\xe7\xcb' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_Redo.py b/jet_tools/JetCreator/img_Redo.py new file mode 100755 index 0000000..10624f4 --- /dev/null +++ b/jet_tools/JetCreator/img_Redo.py @@ -0,0 +1,79 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\xb6\x05I\xfa\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x05mIDATX\x85\xd5\x95Yl\x94U\x14\xc7\xff\xf7~\xcb,\xdd\xe8\ +\x12JK+\xb4bE\x8a .mR7\x12\x16\x83\x0eBb\x9a\x10\x83\xf1\x05\xa1\xf0\xe2\x93\ +>\xca\x83/\x9a\xa8\xf1\xc1\x18[\x9e \x06\x03\x06\x0cK\x13pCQD\xa0-\x96\xb6`)\ +HK;\xa5e:\xcct\xda\x99\xf9\x96\xbb\xf8\xd0\xce\xf81|C\x01\x93\x1a\xcf\xe4\ +\xe4\xdc;\xdf\xbd\xf7\xff\xbb\xe7\x9c\x99\x0f\xf8\xbf\xdb\xfa\x16\xed\xd3\ +\x9d;A\x1ft\xff\x03o\xfc\xc7\xc8\x8e\xceJ\xedx\xe3\xc7\xf0\xfd\'\x00\x04 K\ +\xab\x1a^\xb0\x0b\xf43\x81f\x94\xcc:\x00\x00\xd4-^\xa5\xd7\xd7\xae^\xa2P\xad\ +sc\xb3\xe7\xe1Y\x07\xa0D\xc1\xe2\xca\'\x94UOn\x9c\'(\xda\x02\xcd\xea3\xb3\ +\x06@@@\xa1"l\x0f\xa0\xbct!\r4l\x9a\xa3Q\xfd\xc4\xfa\x16=0;\x00\x84\x80\x12\ +\n\x02\x8a\x885\x88\x82\xfcBlx\xf1\x8d\x1c\xaf\xee\xd9\xf7j\x8b\xda4\xf3\x05\ +\xee\xc3\x02\xcd\xf0\x03\xfaZ\xaa`\x13\x01\x9e\x86\xc4\\\n5\xaf)\xf0>\x86\ +\xcd.pi\x83K\x0b9J1\x08S\xd1z\xfa\xabx<\x19\xfb\xfc\xd0[\xf6\xbb\xff\x1a`\ +\xc3.\xcfJ\x10\xf9uy\xd1C\x9e\x9a\x05+rK\xf2KI\xae\xa7\x10~=\x1f\x94\xa8\x18\ +Nv\x81I\x1bB\xda`\xd2\x86\x97\xe6B\x85\x1f\xdf\x9d=\x10\x8f\xc6\xa2\xad\xf3\ +\x84\xb5\xb9e\x1b\xec\xfb\x06h\xdc\x0f\xdd\x1c\xd7>*\xf4\x95mY[\xf7\x9aoA\ +\xd1\xe3H\xb2(L\x19\x87-\x0c\xd8"\tK&\xc1\xa5\x05.\x19\xb8\xb4`\xf0\t\x0c\ +\x1b\xddP\x89\x17\xa5\xfa\xa3\xb8\xd0\xf3Gbt\xec\xc6y\tk\xdd\xe1-\x98\xb8g\ +\x80\x97?\xf3\xcf\xd3\xbc\xf6/\xf5\x8f\xac\xablX\xfc\x8a\x87\xc3DR\x8cCH\x06\ +&\xadtL\xa5>\x05\xd0\x9fhC\x92G\x01\x00\x1e\x9a\x8b\xf9\xdee\xb8\xd8\xd7c\ +\x0e\r\xf5\xf7\x9b\t\xbb\xee\xd8\xdb\x88\xa54\xd4\xbb\x01\xe8>\xbb\xa5n\xf1\ +\x9a\xaa\xe7j\x02\xca\x04\x0b\x81b\xaa\xd9\xa6\xc8I:\x12\xc77\x13,\x94\x16\ +\x07\x80\x1c\xb5\x18\xb6\xcd\x10\x1e\x0b1\x10\x1ct\x8a\xdf\x15 \xf0\x85g\xd5\ +\xfc95k\xea\x17\xadS\xa2v\x10\x00 \x89\n@\xa6?H\xcfR#\xe0\xa6\xd9\x97>\xa3D\ +\xaf\x86\x87\x17\xe2\xd4\xb9\x9f\x13\xa6e\xbewx\xab\xfdI\xa6\x8e+@\xe3~\xe8\ +\xd6\xb8\xd8\xbdzE\xa37\xce\xc3`\xd2\x04\x85\n\t\t"\t\xbcJ\x1e\x14\xa29v\x10\ +\x04\x8d\x0b\x88\xd9\xa3\xb0D\x02\x00P\xea\xa9\x011\xfd8\xd5~2aY\xd6\x8e#\ +\xdb\xec\xddnZ\xae\x00fD\xdb\\]Q[\x94\x93\x93\x83\x885\x08JTH\x00\xf9j)4\xe9\ +C\xdfH\xa7\x0c\x86{\x93c\xb1\x90\x88L\x84\xfdo\xae}\x87J)\x10\xb2\xae\x02\ +\x00\xca\xbcK\xc0\xe2\x14g:~M0\xce^?\xb2\xcd>\x94-\xd3\xae\x00\x92\xa2\xb6\ +\xba\xb4\xd6;\xc9\xc6 $\x03\x01E\xbe^\x8a\xe1[W\xf1]\xdb\xfed\xcc\x88\xee\ +\x85\x94\' d/\xa1\xda\xefR\n\x8c\x98\xbd0\xf88\xca\xbdK\x91\x8cq\xb4\x9d\xff\ +-.!\x03G\xb6Z?e\x13\xcf\n@\x15\xfaXqn\x19\xb1D\x12\\2\xcc\xd1\xe6\xe3\xcap7?\ +\xd6\xb6g\x84s\xd9x\xb4\x89\x9dN\xad\xdd\xb8K\x95\xa3F\x1f\xc2\xe65T\xf8\x96\ +#:6):z\xda\'\xc0\xf9\xea\xc3M\xac\xedn\xe2Y\x01\x88D\xb5\xa6i0\xc5\x04T\xaa#\ +i%p\xacm\xaf\xc5\x98Z\xdf\xba=\x19t\xae\x15R \xce\xc3\xa8\xf0-Gh$\xcc\xbbz;#\ +\x82\xe3\xf9\xa3M\xec\xcf\x99\xc4\xb3\x02\x08!K\x18IBH\x0e\x0f\xc9A\xe7\x95\ +\xd3I)\xf9\x87\xad\xdb\xad\xa0\xdbz&\r\\\x1f\x18d}\xfd\x97G\x04W\x9e=\xba\ +\xcd\xb8~/\xe2@\x96\x97\x91B\xd0\x1dI\xdc\xc4\xd4OK\xe0\xdaH\xaf$\x9c\xb8v1\ +\x00\\\xea\xeb\xb1\xfa\xfa/\xff\xa5X\xfaS\xf7#\x9e\x15\xc0c\xc8=\xe1\xc8\x80\ +M@`K\x0b\xb6\x95`0\xcc\xe8\xf4z\x05S\x99K9\x82\xc1\xa1\xee\xf8\x15\xbb\xe1\ +\x9b\x1d\xf1[\xd3\xcf\x95\xe9\xb53\xfe\xd5\xbb\x03\xd8\xf6\xc1\xe1\xa1\x9e\ +\x0e.\x18,\x91@\x91\xd7\x17\xb9\xd9\x0b\x1d\xb8\xc3=\x9c\x89\xd6K_Z/\xfd\xf0\ +\x01\x8c\x8cg\x9a\xc3\xd5l@\x8a\x1bT\xe7q\xd8+V\x8a\x11\xb5P\xd9\xe0\xf3\xe7\ +k\x8c\xc6\x153v\xf3\xc2\xc5\xef\xe5\xb5\x8c\xdb+7:\xc4\xd1\x1b\xdd\xe0\x8e\ +\x9b\xa7n\x9f\x99\x89T\xbc\r\xc2\t@\x9c\x87\x04;\xf8@e]<\xe4/*h\xc8\xc9\x9d\ +\xa3NN\x06\xcd\xeb\xed\xf6\xc9\xc48\x88\x13\xc0\x9aL\x97$\x13\xc0)\xe8\xe6\ +\x00 \x9d\x00\xd4\xb99\x1e\x07=w\xc0\xe8Z\xb0f\xfcJ^Aq\xb9?//\xaf\xb04::\xd8\ +\xcdB\xc6d\x1aVs\x11\x9eI\xd4ii\x00g\x8a\x9c\xf4\xb4}_\xf2\xaa\xaf"r\xaar\ +\xd1\xc2\x12_\xb9\xaf\xcaW1yk\xe0\x9c\x1de\xc6m\r\xe9\x9a^`\xfa=\xe5>\x96\ +\x99\x19\xc8FL.\xffhLt}\xdb\x7f.\xb7\\\x1d*\xa9*\xa8([F\xd5\xe8\xa8\x88\xc5G\ +\xb9\r@8\x9cO\x1f\x9c\x9aK\xc7\\f\xb8\x00 2\x89o+Cf6\x00P\xe4\x82V.\xf3\xe9s\ ++\x85\x8f\xeaR\t\rQ\xb3\xff\xaca ~\xc7\xe1\x99 NP6\x1d]\xeb\xe2,Cf\x07g\xa6\ +\xda-\xe5\xae7\x9d\x1e\xf3i\xbfM\xecn\x96\x12\xcb\xecjdD\xd7\xfa\xe2\xceR\ +\xb8\n<\x88\x91\x8cq\xb6f\x9b\xd1\xfe\x06%@\xa0\xd7\xa5<\xcc\xbe\x00\x00\x00\ +\x00IEND\xaeB`\x82\xe2\xa8\xb4\xdb' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_Save.py b/jet_tools/JetCreator/img_Save.py new file mode 100755 index 0000000..9e19146 --- /dev/null +++ b/jet_tools/JetCreator/img_Save.py @@ -0,0 +1,99 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\xb3\x07L\xf8\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x07jIDATX\x85\xc5\x97}l\x14\xc7\x15\xc0\x7f3\xbb\xf7\xe1\ +\xb3\xcf\x17\x1f\x0e&\xfe\xc06N\x1cc\x02D\xb81\xf9\xc0\xd0\xf0i\xd2\x98P\x82\ +\xd34*\x89PR\xaa\xf4\x9fTj\xaaP%-j\x155\x91h*\xf5\x8fV*\x8d\xfa\x0fU\xd5D\ +\xa5Q\x9aF!T\x90\x94\xb4I\xaa\x94&\x18T\x01&\xe5\xcb\x18\xf7(\xf6\xf9|\xbb\ +\xbe\xdb\xdd\x99\xe9\x1f\xe6\xb6\xb6\x81\xd0(T\x1d\xe9ig\xe6\xcd\xce\xfb\xed\ +{o\xdf\xec\xc2\xff\xb9\x89\xab-h\xfe\xc2\xf3\x9d\x1a\xf1\x15)X\n"j\xc0A\xe9w\ +\x8c\xe1\xe5S\xbb\xb7\xbe\xff?\x03\xa8_\xfdB\xda\xb2\xbd_U\x94\xc7\xef\\8\ +\xaf\xa9\xbcqV\x95\xbc\xae\xb2\x8c P\x9c\x19\x1a\xd1\x07\xfaN\x142Y\xe7#e\ +\xfc\x07\x06^\x7f\xe6\xec5\x05\xa8\xeb~\xbe>"\xcd\xfe\x8e[\x1as\x8b\x17\xb6T\ +\t)gGl\x0bK\x82%%R\n\x84\x80CG\xcf\xaa7\xf6\x1f\xca\x17\x03\xd35\xf0\xc6\xd6\ +C\xd7\x04\xa0\xbdw[4\x9f\x8f\xbf\xdd\xb5h\xce9\x84\xac?\x9b\x19\x9de\xdbve\ +\xc3\r\xe9\xca\x85mu\xd2\x92\x92\xa2\xa7\xd0\xc6\x90\x88\xd9\x0c\xfd+\xc7/_{\ +?\xa3}\xff\xd6\xd3o>s\xee\xd3\x02X\xd3\'\x12\x8dk\x9e\x98Q\x95\xb8k\xf0|\xae\ +\xed\xf8\x99\xcc\xfe\x91Q\xf7\xd9\x91\x9c\xf3\xca\xc9\xb3\x99\xb2#\x1f\x9fk\ +\xbe\xa9\xa9&bG,\x8a\x9e"_\xf0I\xa7\x12TT\xc4\xcbN\x0c\x8c\xcc\xc9\xf6\xff\ +\xe1\xe5\xcf\xe4\x81\xfa\xde\x17\xcad\xbe\xb8\xcf\x92\xf2\x96\x00u\xcf\x99\ +\xd7\x9f~g\xb2\xbe\xb1\xfb\xf9\x07gT\'~\xfe\xf0}wU\x8c\x8c\x15\t\x94\xc6\x18\ +CM\xba\x9c_\xfcf\x7f\xee\xc2ha\xc9\xa7\r\x85\x9c<\xb0r\xc5[\x81\xd3\x81V\x1b\ +\xa6\x1b\x078\xb5{\xeb\xaf\x87\x87\xc7\x7fw\xecDF\xd9\x96\xc4\x0f4E_\xe3\x8c\ +\xfb,jo.\x97\xe8\xcd\x9f\xc68L\xf3\xc0\xec\xb5\xcf\xdeo\x0cm\xb7\'\x0f\xbe\ +\xa4\xb5\xfeY$\x12\xf9\xbcm\xdbS G\xfd\x04\xe3\xd7-b\xd5\xd2\x0e\x86\x86\xf3\ +\x04j"\x17\xe2Q\xc9K\xaf\xbe\xc5\xe7*\x8fb\x8c\t\xd7+\xa5\x94\xe7y\xbb\\\xd7\ +}x\xf7\xee\xdd\xc5\xe9\x00\xf6\xe4\x816\xf2\xb4T\xeaoJ\xa9\x9fl\xda\xb4iyOO\ +\x0fR\xcapCc\x0cy\xb7\xc8\xdd[^DJ\xf0\x02\x8d\xd6\x86\xb1q\x9f\x9at\ni\'\xd8\ +\xb1c\x07\xc6\x98\xc9b\xed\xdc\xb9\xf3\x81\xbd{\xf7\xfe\x15\xd8\xfe\x89\x00\ +\x9egNw\xdexfL\\\x10\x8bW\xaf^\xcdko\xf7\xf1\x8d\x1f\xbdy\x89\xdbl["\x84\xc0\ +\xf3\x15Z\x1b\xb41\xc4"\x16N\xc1c\xee\xc6\x1fOY\xbb~Y+O\xf4\xaee\xdf\xbe}\ +\x8f\x01?\x04\xcc\x94\xbd&\x0f2\xfb\x9e\xfeg\xac\xea\xfe/\xaf\\\xb92mY\x16\ +\x9dsk\xf8\xce\xa3Kx\xf1\xd5>\x96\xdf5\x9f\xb2x\x14K\nlK"\x00\xcf\xd7hc\xd0\ +\xda`\x04l\xdd\xb2\x16)\x05\xc6\xc0_\x0e\x9e\xe0\xdc\xd0y\xbe\xfe\xc5\x05\ +\xa4R)\xe6\xcd\x9b\xd7\n,\xdf\xb5k\xd7\xde+\x02\\t\xf3\xa3\xdd\xdd\xdd\xe4\ +\xf3y|\xdfgMg\x13\x99a\x97\xdf\xbf\xfbw\xee\xbec\x1e\x99\xec8n!\xc0`0f",n1\ +\xe0\x95?\x1e\xc7-\x06t\xb4\xd6\x10x\x05\x0e\x1d9\xc9O\xbf\xb9\x1c\xad\x02\ +\x1c\xc7a\xd5\xaaU\x1c>|\xf8k\xc0\x14\x80)\t\xb6a\xc3\x869555\xcb\xeb\xea\ +\xeap\x1c\x07\xdb\xb6\xb1m\x9b\xcd\xf7.`Qk5\xef}x\x94\x99Ue(c\xc8\xe6\x8b\ +\x0c]p\xf8\xc7\xe0(g\xcf\xe7\xc9\xe6\x8b\xb4\xd4\xa6\x88\xdb\xf0\xe7\x03Gy\ +\xee\xf1\xa5\xa4S\t\xa4\x94\x8c\x8f\x8f\xd3\xda\xdaJ2\x99\xbc\xaf\xa7\xa7\ +\xa7\xe6\x8a\x00B\x88\xc76n\xdc(\\\xd7-\x8d\xd1Z\xa3\x94\xe2\xc9\x87:\x99\ +\x95\x8a\xf1\xde\x87\xc7I\'\xe3d\xc7\x8a\xe4\\\x0f\xa5\'BZ[]A\xf3\r\x95\xec}\ +\xf70\xdfz\xa8\x83\xe6\x1b*1\xc6 \x84\xc0\x18\x83\xef\xfb\xacX\xb1"\x1a\x89D\ +6_\x16`\xd9\xb2e\xb6\x10\xe2\x91\x8e\x8e\x0e\xf2\xf9<\xb6mc\x8cA)E\x10\x04\ +\xa8\xc0\xe7\xbb\x9b\x17\x13\xc5\xe7\xe3\x93g\xb9m\xee,\xa2\x91\x89BZY\x1e\ +\xe5\xb6\xb6\x1a\xdez\xf70=w6\xd2\xd96\x13\xa5T\xf8\xf6H)q]\x97\xce\xceN\x80\ +-\xdb\xb6m\x93\x97\x00\xa4\xd3\xe9{\xba\xba\xbaj#\x91\x08\x85B\x01)%A\x10\ +\xe0y\x1e\xc5b\x91b\xb1\x88V\x01\xcf>v;\xb9\xec(\x83C\x17X\x9f\x07\xa0\xac\xac,,FJ)\x94RT\x96I\xb6mZ\xc8\x81\ +\x83\xfd\xfc\xe9\xc0q\xfa\x8e\x9c\xe4\xc9\xde6,a\x08\x82\x00\xad5\x00\xf1x\ +\x1c!\x04\xb9\\\x0e\xad5\x85B\x81\x96\x96\x16*++{z{{\xebB\x00\xdb\xb6\x1fY\ +\xbf~\xbd\xed\xba.B\x88P\xc6\xc7\xc7\xf1}\x9f\xf2\xf2r\x12\x89\x04\xd1h\x14!\ +\x04\x96eQ[]\xceS\x0f\xdeB\xdf\x91S<\xf5\xa5y\xcc\xac*\'\x1a\x8d\x92H$H&\x93\ +$\x93I<\xcf\xc3q\x1c\xa4\x94H)\x89D"(\xa5X\xb2d\x89\xad\x94z\x14.\xd6\x01!\ +\xc4C\x1d\x1d\x1d\xb8\xaeKmm-\xd9l\x96\xb1\xb11\x84\x10\x04A\x10\xf6-\xcb"\ +\x99L\x96\xea\x05\xb7\xa7\xd3\xfc\xf6\x07\rT\x94\xd9H)\xd1Z\xa3\xb5\x9e\xc8\ +\x17\xad\xc3{\xa4\x94\xa4R)\xaa\xab\xab\x19\x18\x18\xa0\xb3\xb3\x93={\xf6l\ +\x02\xbe_*D7%\x93I\xc6\xc6\xc6\x18\x1c\x1cDk\x8d\x94\x13\xe9aYVhPk\x1d\xe6Ci\ +\x1c\xb3\xc1\xf7\xfd)\x9e\x8b\xc5b\x08\xf1\x9fs\xce\x18C>\x9f\xc7q\x1c\xb4\ +\xd6\\\x7f\xfd\xf5h\xado\x0c=\x00\xc4<\xcf\xc3\xb6\xed\xf0\xc6\xc9\x07P\xe9Z\ +\x82\xba\x92~\xb2\xae$\x93u\xa5\xdc\x18\x1a\x1a\n\xfba)\x0e\x82\x80c\xc7\x8e\ +]\xb2\x81\xd6z\xfa\xe9v\xd9\xb9\xffv-@mmm\x08\x1b>R\x89\x08\xe0\x83\x0f>\xa0\ +\xaf\xaf\x8f\xfe\xfe~\x06\x06\x06\xc8d2d\xb3Y\x1c\xc7\xa1X,\x86E\xa6T\xe5\ +\x8c1\x0c\x0f\x0f\xd3\xd0\xd0@6\x9b\xa5\xa1\xa1\x81\x91\x91\x11f\xcf\x9eM6\ +\x9b\xa5\xa9\xa9)\xbcN\xb7\x15\x02LvW)\xeeWj\x97s\xfbt\xdd\x95\xc2\x01\xa0\ +\x94\xfad\x0f\xc4b\xb1)\xf1\xfe$\x90\xe9\x9bO\xd7]\xaeM\xb6\x15\xe6@\x89\xca\ +\x18C{{;J\xa9\xb0\x84\x96\\\xae\x94B\x081\xa5\xce_\rf\xfa\\\xe9\xd56\xc6\xe8\ +\x10\xc0\x18s\xf2\xd4\xa9SM7\xdf|s\x988\xa5\xe4)\xf5\xaf&uuuh\xadioo\xc7\xf3\ +<\xda\xda\xda(\x14\n\xb4\xb6\xb6\xe28\x0e---\xe4r9R\xa9\x14\x83\x83\x83\x18c\ +\x8e\x02q\x1b\xc0u\xddoo\xdf\xbe}\xbbeY\xf5W\xf5\xfb5hA\x10\x0cd2\x99\xe7\ +\x80h\xa9Z\xc4\x81\x19@\x15P\tD\x81\xc85\xb6\xeb1\xf1#T\x00r\xc0y\xe0\xfc\ +\xe4\xcfr\x01\x94_\x948\x97\xf9k\xfa\x8c-\xb8(\x05 \x7f\x11\x88\x7f\x03\xca\ +\x8e`}\xd3\xc8\x9b>\x00\x00\x00\x00IEND\xaeB`\x82\xfca\xccs' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_Undo.py b/jet_tools/JetCreator/img_Undo.py new file mode 100755 index 0000000..d5339a4 --- /dev/null +++ b/jet_tools/JetCreator/img_Undo.py @@ -0,0 +1,81 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\xf3\x05\x0c\xfa\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \ +\x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08\ +|\x08d\x88\x00\x00\x05\xaaIDATX\x85\xd5\x97klT\xc7\x15\xc7\x7fs\xef\xdd\xf5\ +\xda^\xdb\x18;\x88\xf2\x067\x01\x1a\'$\xc4T\x8aM)\xc1\xc9\x07\xac\xa8\xe9\ +\x87\x88$R\xe2\x00!\tAj\x91"%RZ\xa2\xaa\x8f\xa8\xfd\x10\xa9B\xfeDKx\xb6Q\xde\ +o\xa1\xa0\xe6\x81\x8c\r\x08\xec\x90\xd4\xe088\x10\xe3\x801v\xec]\xaf\xf7u\ +\x1f3\xd3\x0f\xf6\xdd\x98\xcdbl\x17U\xea\x91\x8ef\xee\xee\x99\xf9\xff\xee\ +\xcc9s\xef\x85\xffW\xd3\x1a\xd1\xb4\x9b?\xb6\xec\xa0\xe4\xbf\x99GLe\xd0\xb1\ +\xfd\x14+\xcd[JQ\xebjJ\xef\xda@t\xaa\x00\xc6d\x074\xee\xe5&\xa5E\xdb\x9c\x9b\ +\x1fX%\x0c\xcb\x99\xaa\xf0\x94\x00\x9avQgY\x85\x9f\xddX\xfd\x9b\xb93\x16\xfd\ +"\x80@\xff\xcf\x00\x9a\xf7\xf2|h\xda\x827+k_,,,\x0e\x8b)\xee\xde\x0f\xcc\xba\ +V\xc0\xc1}\x14\x16\xc1+\xa5\xb3\xd6\xdc=\x7f\xf9\x93!\xed\xb6#\xed\xaf1\x82\ +\x0b\xb9\x1e\x10\xe3\x02\x1c\xdd\xcd\x02%\x8c\x7f\xcd[\xb6e~\xf9\xbc\xda\x80\ +L\xb7\xa0e\x1f\x08\xeb\xba\x88\x8f\x0b\xd0\xbc\x8b5\xe4\x85\xdf^Z\xfd\xa7\ +\xa2\x82\xd2yB\xa6Z\xd1*\x0e\x98\x8c\xec\x9c@ \xcc\x80A\xcf\x91}D\x11t)\xc5\ +\x1bBq\xa0f\x03\x1d\x13\x05\xc8y\x1bM{y\xba\xa0\xf8\xc7/\xdcT\xf3\x87\x90\ +\x15\x90H\xfb\x0ch\x1b\xad\xedL\x1b\x08\xaf\x055\x8c\xf4\xa2x\xce\x00N\xfc,\ +\xb1\xfeo\x9c\xbe\xee\xcf=-\x9d\x8f<\x97M\xab\x1e\xa3\x7fR\x00\x9f\xee&\x144\ +\xd9S:\xab\xf6\xbe\x85\xcb\x9f\niy\x1e\xed\xf5\x02\xa0\xf1@\xbb\xa3\x00\x0e(\ +\x17\xad\x86\x90^/\xa8a\x84\x11\xc6\xcc[\x8a\xb0\xe62p\xe1\x0b\xaf\xf7\xebci\ +\xd7\x8dl^Y\xcf?\'\x04\xd0\xb4\x93"\x11\xa0y\xf6\x92\x87\x17\xcf\\|_\xd0K\ +\xb5\x80\x8e\x93)\x14-\x01\x0f\xad]Pq\xdc\xc4!\xb4\xfc\xe1\r\n\xa3\x14+\xff\ +\xa7h\xf36\xba\xda\xdeK\'\x06\xbf<\x1a\x1ddm\xddV\xec\\\x00\x992\\\xb9\x89a\ +\x0c^\x1a\xb8\xd8$];\x82a\x95\xa3U\x1aT\nT\n\xad\xd3hm\xa3e\x04\'~0\xa78\x80\ +V\x11\xdc\xc4Adr?\x15\xcb\xef\rM\x9fs{u\xc94\xfe|\xcd\x15\xf0\xed\xf0\x1e\ +\xd6ZyE\xaf/\xae~\xae \xbf\xb0Dx\xe9\x13\xa0=@\xa1e\x0c7\xf11\xe8\xd4\xe8\ +\xd0\xf1\xcf!a\x96a\x15?J\xe7\xf1w\xd3\xe9\xc8\xd9U5\x1b9qM\x00\x80\xe6}T\ +\x82\xf9IE\xd5\x96\xe9%3\x97\x99^\xa2\x11\xe5v\xe3\xa5\x8e\x83N\x02\x10*\xdf\ +\x06Z\xa2u\nt\x1a-\x07\xf1\xd2m(\xe7\x0c 3s\x99y\xb7\xe0\xc8\x15\xba\xf3\xf8\ +\xae\xf3%!\x16W\xae\xe3\x8a\xe3;\xe7IXS\xcf)\x90\x95\xe7Z\x1b\xbe\xeci\x7f\ +\xd9\x11\xd6\x8fPnWF|\x04]p\xeaP\x83\xd7~xO\xf2\xec\xc9\xf7\x87/wu:\x1eU\xe4\ +\x95\xfd\x1a3\xb4"\x13&\xed\xd3\xe4\x87\xb5()\x9f\x7fC$\xc5C\xd9ZW=\x8ak\xea\ +\xe9\xb3=V\\>\xf7\xc9\x87\xe7Z_MY\xe1\xfb1CU\xdf\x07h\x17\xcfKK7\x11]=\xdcw\ +\xf1\xc1K\xe7N>\xdbyl\x7f\xcf7\x9f\xedN\ns\tV\xc1\xea\xd1\xe9\x152\xd5BQ\xf9\ +\xdc\x02\x03~2a\x00\x80\xbb6\x90\xbe\xf3\x11~\x19\x1f\xec\xda\xde\xd1\xfc\ +\xf7\x946n\xc5*\xbc\x1b0\xd0jd5\x1cA\xe7\xca\x8d\x1c\xf8\xd9z\xb6G#,\x8a\xf5\ +G\xffz\xba\xf9\xb5\xb4\xe7\x15`\xe6\xdd\x0c\x80\x92\x03\x04C\x960\x0cn\x9d\ +\x14\x00\x80\x10\xe8\xeaz\x9e\xb3\x93COt4\xefO\xda\xa9\x00\x81p\x1dZ%\xc8N\ +\xc2\xba\xad\xd85\xeb\xd9\xa6\xa4\xfd\xdb\xeeS\x8dI#\xb0\x00D\x10\xad\xe2X\ +\x01\xd0p\xe3\xa4\x01|[\xb9\x9e\x7f(\xd7\xbd\xa7\xb3\xe5\xc3\xa1\xc8\xe5\x8b\ +j\xa4\x12r[O>\xdbS\xf1\xf8\xb7C\xdf\x9d\xd7\xc2\x9c\x81\xc0@\x88\x04ZS6e\x00\ +\x80\x9a\x8d\x1c\xf1\xd0\xb7_\xfc\xea\xe4\xb7=_5\xba(\x9d\xb3\x8a\xd6\xadC*\ +\xcd\xdfR\xb1~W\x88 \x18\x05\xa4\x87\xfb\x11\x82\xf6\xa9\x02\x88\xd1X\xf3\ +\xe7\xf5tw\xb6s\xc7\xc0\x85\x0b\'\xb4V\xc1\x7f\x9f!\xc0\xc8C\xcdw\x130\x94b\ +\xd8sS\x1e(\x84\xc8ch0jK\xc9\x07\x13\x05\xf0\x05- 0\xeaA\xdf\x1f\xfd\x0b\xa9\ +_5Pg\xdb\xbct\xe12\x01 o\xec\xff@\xd0\xf1(V\xca\x10h\x89\xeb(\xa2\x97b\x9e\ +\xe9\xb2#[(\xfbq\xec\x0b\xfb.\xb2\xfa\x19omE\xd4>\xc93\xc5\xc5\x88QQ\x18\xc9\ +J\xbdb\tV~\x88\xcd\xa5e\x96\xad\xb4J\xf6\x9e\xed3l\xa5^\\\xf381\xfc\xda\xcc\ +\x01`L\xc0\x05Y0\xb1XF\xd8o\xd5\xd3\x1bX\x1b\x0e[N _u\xf4v\x0fN\x8b\x0c\xd9G\ +\xb7\xed\xa4\x81\x91\xed\xf1\xc7* \x93D\x82\xef\xdf4|\xcf\xbe\x1e\xfb\xdbX\ +\x10\xdf\x14\xa0v\xfe\x9e;\x97T\x88M3\xe6\x05\x93\xc9\xa8S<\xd0\xafO\xff\xae\ +\x81\x17\x9a>\'\xe9\xc7\x8c\xba\x04\x94?\xc1\xd5\x84\'\xd2\x17\x80\xaa\x98\ +\x83\xf9\xfcfV/Z@Ua\x11v2A\xe0|7\x1f=\xb3\x9d\xc6K\x97p\xb2\x85\xfd\xfe\xd8\ +\x15\xc8u\xd7\xb9V\xe1\x8a\x15\xa8\xba\x85\x82UwP\xb6l)\x15\xb3\xca\x99\xedH\ +\x86\xa3Qz?=B\xdb\xcew\xf8.\x87\xa8\x7f-\xc7n\xc1x\x10W$b8\x8c9}:V\xc5l\x82\ +\x95\x8b(\xbca&\xf9\xf9`y\xe0\xf5v\x13oj#\xd6\xda\x81\x9d%\xa8\xb3@\xa4\x9f7\ +\xb9\x0e\x92\tUA\x8e\xb1c\x13\xd1\x17\xccn=\xb2\xce\xefk\xbd[\x8f\x0706f\xac\ +\xb8\xdff\xaf\xc0U\x05&kW\x13\xf7mR\x9fk\xff\x01\xb0\x15\x95\x01\xe1\xb3\xd2\ +\x81\x00\x00\x00\x00IEND\xaeB`\x825\x1a\xdc\x86' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_favicon.py b/jet_tools/JetCreator/img_favicon.py new file mode 100755 index 0000000..39b2dde --- /dev/null +++ b/jet_tools/JetCreator/img_favicon.py @@ -0,0 +1,61 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\x01\xd4\x03+\xfc\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\ +\x00\x00 \x08\x06\x00\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\x03\x8bIDATX\x85\xc5\x97klSe\x18\xc7\x7f\xef9\xed\xda\xb5\ +\xdd\xa8\xeb\xec\x9cd\xc9\xe6\xb0&\x18#\xc6(\xd1\xb0(\n\x0eG\xb8\x05GLX\xe2\ +\x17\xa3\x04\xd4hP\x13t&\x98\r\xbf\x90h\xe2\x06Y\xf8`d\x18!r\t\xa0f\xb0\xa0s\ +\xea\xbc\x8d\xc5!c\x85Ywi\xe9\xd8\xad[\xaf\xf3\xf4z\xfc\xe2t\x10l\xc7\xba\ +\xd6\xff\xc7s\x9e\xff\xf3\xfe\xce\xfb\xbe\xcf\x93\xe7\x08!\xc9\xfc\x9f\xd2\ +\x00$\xe21u\xbe\t\xa2\xfc\x8e\x8a\x96\x1cJ\xe7\xe5\x97\xe6\xbb0\x80\xcb\xe9b\ +[\xfdS\xf4xN\xcf;GZ\x00\xa1\xa0\x82\xe3\xd28\xae\xc0\xb7\xc0\xfc61-\x00I\x96\ +\xc83\xdc\xc6h\xf0\x02\xed\x83u\xd9\x07\x00PU\x15\x93\xc1\x8c\xdd\x7f\x90\ +\xf6\xc1\xfa\xec\x03\xe8\x8d2mGGq\xfc,\xe8\x8f6\xf3\xd5\xc0.Tu\xee\xc7\x916\ +\x80\x90\x12X,\x054\xbd:\xc2\xe9F\x0f\xfd\xcag\xb4\xbbj\xb3\x070\x1d\x88\xf3\ +P\x95\x91\xc3g\xdf\xe3\xf2\x17e4l\xbf\x8a}\xeaSz=G\xb2\x03 !\x11\x0c\x06\x88\ +\x96\xb4\xd0\xda\xd5\x88nb\x05Mo8\xe9\xf1\x1f@\x89y\xb3\x00 \x0b\xc6\x06TF\ +\xc6\x878\x1f|\x87\x83gw\xe2\xe9\xb6\xd1r\xbc\x93\xf1\xf8\x8f\x99\x070\xe4\ +\xcbt\x9d\xf3\xb1\xa7\xe6\n=\xdd\x7fp5\xaf\x81\x17k+\xe8\xfa2\x8e\'|)\xf3\ +\x00\x01\x9fB\xf5\xf6{yv\xfd\xcb\xec\xd92\xc4\xe7\x87z(\xad\xec\xa6\xd0\x9a\ +\xcf\xc4X\xea#\xd0\xa4\x0b@B\x837<\xc8\x0bu\x1bX\xf9h\x0b\xeb7\xadE\xda/\xb1\ +\xe95\x0b"\x91\x93\xd2\xbe \x8d\xc8\xa03\xf1M\xdf\x07\xdc\xb7\xd6\xc3\xf1c\'\ +i|\xc5I(\xe4\xe7N\xeb\x92\xcc\x03\x18\xf2\xb4\x1cmt`\xef\x08\xd36\xb4\x9b\ +\x077O\xb2\xb5\xfay\x8e5\xb8\x91\xf5J\xa6\x01T\x0cfXv\xd7j\x9a\xdf\xf2\xd1\ +\xbc\xdb\xcd\xd7}{Y\xb9-\x84\x7f8\x07\xf7x_\xa6\x01\xc0\xe7\xf3\xf2\xfa\x8e\ +\x9dtv\x9e\'2\xf0\x00o>}\x11\xaf\xda\xcd\x86\x97,(\x81\xd4\xfe\xf4[\xb1\x10L\ +(\x1e\xca\xcb\xcb\xf9\xbe\xe3;\xaa+w\xf0\xf6F;\xd6R\r\x8b\x8b\xeeN\xe9O\xbf\ +\n\xfe\x86\x98\xd1\xbe\xfd\x8d\xa0\n>\xaam\xa2\xe2d?**\x02\xf1\x9f\xde\xb4w\ +\xe0f\xfap\xdf\xfb\x14\xe9\x96\xd1\xf5k\'q\x82Ic3\x02 KZ\xaa\xd6l\xe4\xda`\ +\x08A$\xfb\x00\x006\xdb\x124\x1a\x19\t}\xe6\x00\xb4\xc2D4|\xf3\xe1cl\xca\x89\ +>W\x87\xc0\x984\xc7-_\xc2\xc9?\x1d8&\xcf\xe0\x8f\xb8\xf0\xfb\xe2\x94\xd8\x0c\ +\xc4c\x80\xee\xfa8\x87\xfb\'V\xad{2e\xbe[\x02\xe8p\xee\xe5\xb7\xd1C\x84\xe3\ +\x01$\xa1A\x96%\xee\x7f\xdcDTQ\x99\xfd\xa1\xc3\xc3nb\xdaQ*\x96>\xb70\x00*\tZ\ +\xaf\xec\xa2w\xea0\xb9\x9a\x02\x0cZ\xcb?\xef\x94\x88\x97\x1bG\xf2~\xd7E\xb6\ +\xae\xa9\'W*^\x18\x80\x8fO\xd43b\xfe\x84Bs1\xb3\xe7M\x95\x04\x92\xd0\xb0H_z]\ +\xfc\x8a\xe5\x95\x90\xa4\xf6g+\xe5%\xbc\xe6\x1e\xe5\xc8\x89\x03\xdcQl%\x91\ +\xf8\xf7\xb9\x10\x02%\xe6\xc1fY\xc7\xed\xc6\xa57\xb8\xe6\xb6\xf8\x9c\x00"\ +\xb1i.\xfc0\xc2\xb47\x81\xb9PK\xaeIFgT\x99\xf4\r\xb38g5O\x94\xd5%\xedt\xa9$\ +\x84$\'\xfd9U\xd58\xcfTo\xa6\xed\x97S\xac\xaa\xc9gQA\x0e\t\xc5\xc4\xf2{\xb6P\ +S\xf5.\x06c\xf2:O\x1b`F\xad\xe7\xce`\xef\xbdLiY\t\x8f<\xfc\x18\xd6\xa2\xc2\ +\xb4\x16\x9e\xd1_\xa4\x9cO6P\x7f\x0e\x9e\x00\x00\x00\x00IEND\xaeB`\x82\x80\ +\xab\xe3<' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/img_splash.py b/jet_tools/JetCreator/img_splash.py new file mode 100755 index 0000000..beb94a9 --- /dev/null +++ b/jet_tools/JetCreator/img_splash.py @@ -0,0 +1,1157 @@ +#---------------------------------------------------------------------- +# This file was generated by C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\img2py.py +# +from wx import ImageFromStream, BitmapFromImage, EmptyIcon +import cStringIO, zlib + + +def getData(): + return zlib.decompress( +'x\xda\xbc\x9b\xe3s%\xbe\x1f\xefOmlmlm\xb7[\xdb\xc6\xd9\xb6[\xebT[\xdb\xb6\ +\xdd\x9e\xda\xb6vk\xdb\xc6\xd6\xb6\xad\xfb\xfd=\xb8\x7f\xc2\xbd\x0f2\xc9d&\ +\xc9L\xf0\xce\xfb\x95\xf9$BEI\x1a\x05\x91\x00\x11\x00\x00\xa0\xc8\xcaH\xa8\ +\x01\x00\x10,\xff\xa5\xef\xf0\x90\xff\xd5\xd0|\xefW\xfd/\x83r\x12\x93\xd5\ +\x80\x87\x87_\xdfQ\xde\x06\x00\xc8\x00\xb2\x12\xa2\x1a\xeeY\xe7\x9dnY\xd9\ +\x9a\x1e\xcc\xaf\x02W\xaf%\xd6\x91\x9e\x841\x94\x95\x7f\xcbVa+\xff\xf8\xdb\ +\xfc5\x84/\tEZ\t\xb5\xc7\xb4\x87\xcf\'\x10\xdb\xce"\nsT\x16S\x84Gh\xd9\xd9\ +\x1fp\x8d\x86\n5\xc4d\xbd\x84-Dm\x01\xea-\x14\xe3\xbbX\x16e\xccNX\x80\xfc\ +\xce|\xaeH\xad}\xbc\xecV\xc1\x82\x89\xe8\xbcNv\x8fww\xca9\xab\x8d\xdd\x0f\ +\xd5\x8f\x8fn\x9dQ\xa0P\xf61Z\x13x\x91Oe\xb7\xbch\xf6\xb1pZu\x13|3d\xec\xe4\ +\xf2\xfah\xf6P\xc4\xb1\x05-)|q\x183+\xc6\xc2\xe8\xfc@v\xaeT\xd5!\x15\xd1\x0c\ +\x82qZ\x93\xb2<\x85\x18\xb3d6\r\x95\x92!\xf61<\xfa\xff\xd7\xcd\x0cE\xac8{&\ +\x0c\x01\x0b\x13P\x80\xa6\xe3\xad]R\xfd\x07ko\xfaT+\xa6WM\x88\x90\x1d,\xf9?\ +\x04y\xa1\xd72\xde8\xe1\xb9\x10\xa0\x904\x90 \xe3\xa7#w\xa4X\x1a\xba\xa7\xc6\ +\xfd\xc1n\x0e\x1a\'\x1fS\xc5\x0fB!\x05\x14\xf8\xc2\xf0Fh T|*\x91"A\x9b\xedK\ +\x80E\xbe_\x88o\x0e\xf4/\x01(\x9c\x9c\x18e\xec\x8f_x\xcdCh\rW\xc1\x08\xe3?E\ +\xf7Z\x19\xd3\xaae\x1e=\xca\x85\xf6\xbfR;\xfbnsC`\x16\x0b\xcc\x17\x11\xb7T\ +\x196\x01\x92^\x94\xd6b7\x15\xe6\x8d\x97C\xae\xb0Z\xcd+e\x9d\x8e\xa4 \x16\ +\xaf\x83\x8a\x90\xe9H/}Nf\x06p\x80\xa6\xf3=\x10E|\x12\x17\xfc\xc3\xc8QY7o\ +\xe6\xab\xc9\x02\xae\xa2\x0f\xed\x07\x8e?\x14\x90\x87\x9b#qF\xa6\x0e\x94\xe3\ +\x0c\xf0\xc7\x92A&\x03\xdc\x91\x01\x9b\xdb\xfd\xdc\xcc\xfd\x18\x14-|\x07\xea\ +\xfe\x02eM\x96\xe0ez^{\xe5\xd0\\\xfc3\xe2\x7f\xa9Q\x1f}\x81\xfb0\x00VtT\x08h\ +\xe5\xa2e\xac\x10\xd8\xe8P\x8f\xae\x8ci\xef\xeaV\x14\xa1\x93\xd52\xa7\xb2=\ +\x80P\xde\x14\xccL\x98<\x10%J\xfc\xb95dP\xaf\x0c\x88"f\x8b\xc7\xff\xe6\x8d1\ +\xfa8x\x11\x83#\xaa:Eb\x96\xe8\xb0\xb5\xab\x07\xf9>\xb8\x07Z\xe2\xc6\x0b\xc2\ +,\xff\x8bF!!\xa3\xeex\x1c\x1e\x13\xca\xbd\x07"D\x94|\x02\x1bYN\xe6\x99G\xc8L\ +\x05\x8c\xd7{-\x8aH\x19tO\x8a\x08\x8f"E\x85\xae\x83\xfa6 FQQ\xe4\x9f:Y\xdb;\ +\xaf;\x1b-\x9b>\xfd\x879t\x05\x12o\xd8\xd6\xb8\'v)\xb6\xa6KH\xa4\x8c\xb78\ +\x9ax\x83\xb5\xa5\x1c\xdcT\x80\xd3\xe7\r\x9e\xe3\x97G\x96"`\xcc,\xeb\x9b\x08\ +\xf6\xc0\x01DK\xe0\xf1\x0f\xf5a\x91\xafO\xd0\xbeO\x88R\x7fG\xcd|\x81C?\xfe\ +\xfe\xa5\t\x7fg\xc0\x1d\xb8:#\x93\x8e\xf2\x1c\tQ^\xcf\xea\x13"\x98\xec\x02\ +\xc3\xaa5\xe5v\xf9\xdb\xcf}}\'\xec\xc9Y\x00\\\xc1K?\x91\xd13A\x9f4t\x83\x125\ +\xc4\xc3\x08\xe6{\x1fZ;\xbd\tv~l\xf9\xdc\x7f\x89\xaam\xdf\xde\x1a\xe6\xd2\ +\x0f\xc5|4C\xa0\xd5\x10\xf1\xb7\x8a\xff\x833\x90\x13{\xe0\xc5\xe7\xd7\xd9\ +\xed$\xe9\xf5\xf4*\xb4\x85\x00\xd0\x803?\x8c\x18\x88\x87\x9c\xd3\xe0\xf7Z\ +\xa8C\x1aB\xf3\xdaHV]\x06\xfe\t\xedc\x0cK\xfd.Y,\x92x\x15\xd1\x87\xa4KD\xb6H\ +f\xfd\xab\xbb\xc0aL\x02R^\x1dB0\xba\x88\xe3\x0e\xb7\xe5]RkA\x84\x10D\xe2\\\ +\xbc\xfc- \x88\x17\xa6\xa8\xd0n\xb9\x05J\x98\xf3\x8e\x1a\x0b\n\xa2\xb0\x17>\ +\\\xcdR.1\xd4\x01%-\xceZ7\x8b&\x1f\xb3\x05\x8cP\x06\x920\xc5\x06\xdc\x05G\ +\xbc\xf9~B\x96\xb1\x96&&q~\xeb\x13A\xc1R\xc28\xa5+\xd0\xdfv\xbc\xbf3WH\xe7p\ +\xa2l\xb6 \xcc6\x15\x0e\x87\x80Cu\x11\xfekUJ3@\x0b\x8a\xd4\x1dC$\xb7\x10r^a\ +\xd89_\x839\x8a\xc6W\x85i\x93\x81]]2\x0fH\x87\x04"\xe5e\xba\xb9U\xf9y|\xbd\ +\xa6\xad\xb7^\xf2zn\xab\xc4E\x84\x01\xe3I\xe4T\xa0p\xf19:@\xbf\xeeF\xfe6J\ +\xb1\xe4\xf08\x9c\x8f\x9c\n\xc4\xe0\x9bd\x92\x9c\xb2O\xa5\x18,}\x84y\xf9\xfe\ +5\xd6A\x85V\x17\x91Q\xd3\x93S\xa4-\xb1\xf2W\x93\x95\xbe\x93R\x93u\x1c-H\x9d\ +\xa58-\xc2\x92<\xdd|\xdcS\xaeZ3>\x8d\x06\xfb\xd7!rp\xa8V$\xdc\x17\xa8\xf0\ +\xa9\'\x98\x0e\x84\x9fZ\xe3*Q\x1b\xa2\x0f\xf1j\xd0+\xf3MS\xad\xe4\x935\xf8C\ +\xf2\xc7\x91\xaa\x19\x08=\xf7\xd8\xb5\xfa\xb4\x18\xc4\xd1i\x19p9HLf\xa9>\xe0\ +\xa6\x07:\x87\xc5\xda\xfc\x98kli\xfeH\xc8\xbe\x88\xab\xfa\xf7\xf2\x92\xb0\ +\x88\xabH\xe2`\xe35\x8d\xc4{3$\x01\x94D/\xdb)\n\xef\xe0\xee`\x98\xaaF?>]\x7f\ +\xd1]\xdf:\xffq\x1b\xae\x1c7khoh\xa0\xbe\xf1^2\x96\xba\xd3\x7f\x98^L9ijp4/\ +\xf8\x01\x17\xfb\xf8\xfb\xf8\xd8\xc3h<\x80\xf4\xdd\x93\xb0$\xc6\xe3\xe9o\xe1\ +\x96`\x8b\xd17\xc6&\xac\xe7$\x1aL@@\x8d\x0cF\x8d\xcc\x02\xbc\xbfO\xf6\xf8#\ +\xb1\x9e\x91Z\xd5\x1f\x15C\xc4\xc0\x1c\xfb\r\x9fv\xe6\xdc\x9b8\x7f\x7f\x15\ +\xf7\xfc\xc6\xe8\x19yFJ*\xb9\xd2\xcf&\x93\xafY\xf35/\xfd\xe3;\xe2\x9c)F\xc5\ +\xe3\t\x05\x8e!\xf5\x83S\xe9\x85\xc9\xf2r\xf0\x0f\x82(\xaa**\xe5\xf8;X\xe5}\ +\xaa8\xda\xce\x1er\x19z\xe3\x8bq\xaf\x96\x0b\xa1\xcd\xf5\xf5\xa3\xc9\x85\xf2\ +2\xdcJ\x99\xecH\xa0\xfb~V\xa4j\x88J\xff\xbdl\x8c\x894\xe7\xd4\xe0\x08\x19\ +\x9dr\x17\xb3j\x87\xd6\x93C\xf7\xe3\x01\x94\x8ek+\xe9\xd9\xa3\xfd\x18\x19\ +\x01\n\xab\xaceJ\t"\x8f\xddP\x99d\xa3\xcePl\x15w\x8fz6\xc2\x1d\x81\x1c\xd6\ +\x02\x02\xb2`\xe7I\x90\xb2\xad\xd7=\xcf:\x1a\xf19;_3\x11\xad\x894\n\xe1\x96\ +\x06\xc7\xd3\xbf\xfa\xe0\x122\x7f\x1b\x9b04\xa2\xd3\xadY\xd7\xe7\xed\xd9\xbd\ +\xca\xe5\xab\xce\xb3\xb0i=\xfb\xcb\xe73\x96\x8c&\xd3\x9b\x05Z\xf5r\x10\xc6I\ +\x18A\x19\xb3\xfd\xe2T\xce\xe7\x91\xbe\xd0\x1f\xd0:\x04\xc4"Fq\xa4e\xc1\xc8\ +\xac\x04\xe5\xfc!\xd5\xb7\xd1\x0c\xbe\xfe\x97F)\xa6\x1c~\xfdP4\x81o\xfe\xa2m\ +^\x8eg\xfaV[\xb3K\xb3\x1bI\xea\x9el\xe0\x19\x85~4+\xe8\xa6\xae\x16\xab\xd3\ +\x81!|Lp\x9d\n\x00H6\xcd\x08\xbbFIejb\x84o\x98#j\x8b\x0e+\xd0\xf8R\x98\x89\ +\xb6\x81v\x1al\x94f\xc0y\xc2\x013\x85\xd2#\xb0-r~\xa2u\xe3\xbd\x9e\xf6\xe4Z#\ +\xa5A\xc6\t\xb3\xe5\xfc\xa9L\xc3\xc9L"\x11jZ\x80\x90\x10f%mp\xb6\xb6d\xf7\ +\x9b\xef\xbe\xf6\xfe\xfbw\xab\xbf71\x9aJ\xa4\x0f\x8f\xa3\x85\x9b*\'\xa1\xd2\ +\xcd4\x1d\x94\x02\x00\xbf\xa6\xb7\x904To\xbf\xf5^\xd2\x877W\x00\xbd\xed{]\ +\x08.\x8f\x1fHwO\x0c:\x9b5V\xa8\x8b\xad\x82/^!\xc2L\xff\xe5\xdf\xea\xe7u\xe8\ +\x86\xdb\xe5\x996\x08\xc4\xfa\xad\x0c\xa6\x02j\xc0}4\x99E\x8fu\'N[%W\x8ev\ +\x07ln\xbf\x1a\x99.\x8a\xb5\xb2U\xef\xfd05M|\xbez\xcc.o\xabq\x91%\xa9nK\xba\ +\xee.\x99\x958\x92\xaf&\xde\x07Igl7\x1c\xe9C,_\x99\xf8\xea4\xd4\xd5\xba\xb6\ +\x88;\xa04\xeb\xb6d\xb3\xf9V+\xbc\xde\xe1;\x0f\xf1#\x04W%[\x8cx\x81\x12\x02w\ +\x02\xff+\xe2\xa9\xb3\xa5ki\x90\x97h \x1c\x9e\x00Z\xbc\xd5\xef\xf5~\xdcM\xa0\ +N\x7f;\xef\x832%\xa7\xcc{:\x13\xd4\xf91\xa6\xdd\xcc\x85\r@\xa6K\xc0\x92\x7f\ +\xa8\xbbg\xe5w\x15xJ*\xd5\xff\x1c\x9dgyz\x04\x97S\'\xcf*.\xf20\xf3~\xcdy\x14\ +\x0eG[\x84\xf3O\n\x9c\xdc\x9a\xac\xf9\x95Y\xaf\xb6m\x08{X\xcd\xe7S\xf8\x80\ +\xe4\xc6\x8eK\xd62\xb78\xbdF\x0bF\xa1\x03=\xa4\xe4\xbf\x8b\xd3u\xc4\x06\xc0\ +\twy/\x0b\xc6U\xf1\xdb\xd7\xf1\x9b\xf4(YX\x15\xf5&|\xdc\xa7M\xda\xbe,\x90\ +\xeaii\xeaA\xf8S\xd1\xf4\xc6c\xf8S!\n\xdc\xdf\x1f\xf2\xfb6\xa5\xaa\x14\xf6\ +\x12\xed\x10\xef\x9f\xc2\xa8\xdbvX\x1d6\xc9>\x88b\x14\x90\xcd5\xe0 ~?\x82N.\ +\x1a\xea\xf8\xa5\x0cIG\x06\xfb\xf2\x90\x1ag\xc3\xef\xde\xadZ\x1a\xe7>}\xc0\ +\xf1\x85*\xf2(\x87\xf0>\xc2\x9e2\x9d\xa7\x83\xfanx\xf0\xf8\x95s\x97-W\xb8B8\ +\xfdq\xb2\x12*Is!}\x13i\x0e\xa9\x8d\xedks\xb6%\xbc\xf5\xd8*\xe5p\x88\x82mB\ +\x80\xc3(p4Na\r\xca\xf8\xdb\xf3\x85e84\x12\xc9\x84\x1et\x7f\x14k\xbb\xe2\xb7\ +|Wm\x90\xd2\x93tr\x14\xfdq\xfd.\xdb\nl3\xf28t\x0cl\x9b\xb6\xc0\x01\xbd\x91Ik\ +@\x13^dL\x92n\xb8>\xbf\x89\xaasq$\x0cLD\x07\xb7\x9e\x1d\tp\xd6\x1b\xddD\xf0\ +\xed\xe7%e|Q^.\x08m\xdd\x14\x1e1_\xde\x11\x93t-\xc5\xb8\xbfIVV&~s?\x00\x87\ +\xd4\xc0\x0ej\xa5\xd9\xbe\x1c\x1fB\t_\x17\x18\xab\xd1\xa1\xf0L\xf8\xdaK\\d\ +\xe5\xa1\x83~6\xb6\xe6!\x89\xd8\xbe\x1d\xaa\xb3\xfc\xe6+R\x13\xddb\xf9\xbe\t\ +\xcf\xc6\xf5\x95T\xdbY\\\xd3\xc27\xd2)\xc2\x07E\x11\xc2\x07\xbf\x07\xd9\x8b\ +\x7f\x13\xe3\xa5)\xdcb\x0c\'{\x94\x81h\xdb\xfe\xb2k\x8d\xa3\x14\x13\x8aa\xa8\ +\xf1\xcb\x10Q\n\x0c\x86\xc6i\xf7\xbe\xd8\xb4\xfb\x18?-\xf4\xf1a\x95=\xd1\x91\ +\xe2|\xdf\xbaJw:y\x07\x85|\xebMG\x83B\xabpw&\x95\x88\xc1rw>\x98\xba\x12\xba\ +\xf66\xb7\x9bRE>\xe981\x11~\xe9\x92\xff\xef\xa8\xc7\xe0\xacU&_tt\xcd-z\xbd{\ +\xa1Uy9\x0f2C8\x16\x00\xc7\xb0(\xcb\xaf\xf3|.L4\xa7s\xd8\xd8\x0b\x0f\x92\xd4\ +\xe5[\xa2\x01\x86`5\x0c(\xa1w\x9e\xee\x95\x96\xcaLN \xf1O\xcd\xb7\xde\xd6\\\ +\xb7\x8f\xc0\x93\x10=\x15\xc3\x84\xa0Bh4\x19\x14\x9c\xa6\x1f\x1cAT\xb0\x1e\ +\xbe\xcb[\xb6B\xce\xdd}`B;-\x81;\x1d\xd8\xd9<\xba`3M\x93\x99\xf5\xc0]\xd4\ +\x0c\xb6\xc3\r\xcd\xdc\'\x16#\x8cr_\xb2T\xfb]\x8b\x10g\xd6\xfb\xe2\ra=\xa7\ +\x8bF\x1b?\xeb"r\xe0uby\xeb\x96}ow\\\xd5\xdf\x1e\xc6\x88JIl\xd0f\xbf!Jo?\x00\ +3\x1d\x08\xe4\xd4\x13\xd8\xe1\xb0\xcb}\x93\x08\xb1f-\x9a\xa2_\xbex\x1b6\xf8\ +\xed>\x9e\xbfG\x18\xcd\n\xdd\xfds%\x00\x91>/\xdf\r\x9f\xa6R\x06\x02\xde\xe8\ +\xb3\x01\x7f\x8b@\xdd\x8d\x0e\x06\x11\x8e\xa6\x04\xb20\x83\xcdA\xb9\xd3^]\ +\xfa\xcb\x15\x1a\x91\x96-\xd7\xb5\x0f\r$\xc4\xa8v\xec\x05\x9c\xfb\xe1s\xdf\ +\x9e,\xf7\xa7\xbcpK\xfbB\n\xf0Ws\x12\xb8M f\xac<\\1\t\xe7\x9b\'VH\xe0\xa1\ +\xcb\xafy\xf9\x87\xb8\x179\xea\x9d\x0b\xce\x81\x13a\xe13D\x87\xa5\xba\xbc\ +\x9a\xf3N*-(,\xbdl\xea7\xbe\xaa\x9eND^ \x98\n\xa6\xf6A\xb6=W\x04\x19\xb61o1(\ +\xd4\x81"4a*\x8f\xfe}\x80\t\xd7\xa0\xd1\xde\xca4L\x03Z\x19-\x1f\xb9\xad\x15>\ +\xff\xde\xa0\xfd\x88\xc7\xa0\xc3\xfad\xe7S\xa8/\xe0\xef\x7f&\xe2\xb1\xba\xbb\ +\xc3\xea\xe6\x1d\x04\x80\x86\xda1\xfd\x07D\xf6\xa72D\xb4\x8a\x7f\xa7\xbbX\ +\x93L\xba\xfa\x98#,m\xe6,:\x15\xd5n7\xfb\n\xeb~\x1fh\xe0\xb2\x81_\x17J46"\ +\x9b-\x82;\xb5\xa6\x17v\x1d\x1f\\f\xb4\x1d\x8dp\xb3\xffP\t\xcf\xc07\xc2\xf8\ +\xa0\x806\x9aH\x99Q\xc7\xf7\x1e\x01\xd1\x8b\xdapj\x15\xcf\xe49\xf7u\xbf\xee\ +\x85,\xb3d\xd5\xec\x16\xaa\xf3D\xce\xb2\x06\xfc\xda\xef\xe4\xe7\x95S1\x11c\ +\x1f\xa1M\x84=;\xb5\xf3q\xb8"\x86U>\xa0:\xf2\x9e\xc5/\xa36\xa2C(\x04a\x92\ +\xc3\xc2\x04\xad\x85 \xa0 \x1d)}F\x03\x8cS\xec\xc1\x1e\xaep\xc8\xb0\xd0\xbb|\ +\x0b\xed\x9f\xc3\xd3\xfa\xee\x7f\xec\x98\xb6\xf3~M\xee\xa4)~-\xbd\xec\tI`\ +\xe2\xb1\x933\xce\xb2\xa1\xd3r\xbcK\x87\xd5\xe5PN\x88\xcfh\xf16%\xfc\x1b8C9\r\xd3\ +l\xd5\xaccL\x9e\xa2\xb7\xf6\x1c\x88A\xe4\x85`\x90\xf1\xbf\x8d\x07d\x05,\xde!\ +\x14=\x08S}3+\x1b\x97\xdb\x96J\x10=p\x1b\x06\xb2\xb8\xc0\xf8\xaa\x97\x04w\ +\xc284\x9b\x85\xea\x11\xea\xae#\x14z\x11OSe!\x8a*\xeaP\xe9\x8f\xafQ\xd3n4\ +\xedD\xa9\xa8!*\xa4\xb8\xb9\xdde\xa1\x81\xef\xe9(p\xbd\xfcP$\xa4\xf3\xe2\xa1\ +Q\xc8\xe5N\xb2\xff\xb4"\x9d\xc9\xe7z\x18T\x85b\x88\x88\x83C\x10\nM\xa9\xa2\ +\xae~\xf3\x10\xa7\xef\xf1Q\xac>\x01\xef$\xe83\xdc\xed}\xd4 \xad\xd9\x8a:\xa0\ +\x08\x8f\xcb\x1d\x9d\xfe\xb60\x99\xa6\x90\xf9\x03\xe3\x90\x81\x1c\xc4yc\xac\ +\x14c\xddJ2!\xf5\xcb\x88\xb17\x05\x1a\xda\x125\xa2\x17\xb5\xe5\xe9\xf2\x9f\ +\x0b\x9e\xff\xb7\xdc\xb6\x93]\x8f\xa3X\xd4\xb6\xfcoF\xa4\xd4\xa9H&\xe4\x86\ +\xa9\xad\xddJ\xb1sJ/\x1dG\xd4T\x7fOz\xd0^\xbd[\xf1\xacN\xc1\x84\x15\xd4\xc3!\ +\x01\xf4\xc9\xb3.9\xa4\x1du\xd7K\xa6\x8f\xe9h?\xc7Xa\x14\xb3\x91\xa0\rG\x11\ +\xbcw\x07ffv6Q\x84\xb7\x9eKH\xb6LN\xa1s\xe2\x97\x95>\xfa&f\xafb}\x8d\n\x8e\ +\xbf\x06\xa1<\x16A\xc6+\xb8\xbf\xab\xc0\xf7\xafNW\xe5\xce(\x94\xa2g\xcbS\xd2\ +\x06\xee\xeb\x8f\x8f\x06\xc8=%\xec\x98\x9c\x8ekX\x80\xd1\xff<\xef4\xd3\xc5\xa8\x10\x08`\x1f\x92zZ\xdd\x05\x88\x0fsLw\xe2\xdd\x06\ +\xa80U\x15f\xa3\xe7\x90\x9f\xc7\xc2-\xd1\x1b\x8d\xb5\xeazL-F\x95\xa8B\xf0\ +\x91MB\xd2\x03\x18\x1al\xc7\r=\x8dF\xff\xe4j\xeb{R\x82\x96<\x9f\x85E\xd0F\ +\xea\xc6\x0e\xd19U_\xab"\xd44\xf4\x80\xab\xacN\xe7^}i\xdf\xb01H\t\xe2\x18\ +\x86\x03c\x17f[\xeff]x^\x9b\xe0j\x0c\xa2A\xbe\xbd\x0b,\xca\x84w5\xa2Cl=\xc7\ +\r=\xf5\\\x1a\x8a\xee\x1f\x1e_\xe3\x1ep\x85\xb8\x17W\xc2m\xde\xe3\xc3\xa8\ +\xa4[2s\r=\x0b\x80\xf0`\xd5\x04\xce\x05\xcd\xd6p\xa3\xa1\x95\xcc\x92X\x8f011\ +\xf4>\r\x8b\xa5\xb5\xcf\xeb\xc6j\x83\xc9tO\x0c\x03\x92\xfd`\x94\x8a,/\x8c\ +\xe6\xc5B\xd9\xc0_\x19\xc8\xc3=\x1d\xbc\xac\xe1\xda\x85[:\x83\xa1\x86\x94\ +\x19\x88(\xb8\n\xcfy\x12g\xd9V\xf0|\x81\xdauD\xd0".\x8a\x8e\x17\x05\xa3V\xf7\ +\x04\xc1\xdd\xaa\xef\x85\x95\xae\xb0\x05S\xc9\x1f\x01\xcb\t\xacEl\x18\x84U\ +\xa2\xc6\xfd%>\xb0\x1ew\x8b\xf3RqD\xb0\xe3Z\xf6\xe9\x01\xdb\xdcf\xc8\xb1~\ +\xaf:\xcavv6\xb5*Ed;\xcc\xd9\xf3\xef7:8\xf1\xa8\xa0\xe0}\xaa\x8b\xf2~\x00\ +\xd8\xfbbO\x13\xb9R6/\xd6X\xc3m\xba\xff\x8cDo\xc3J\x06\xaf\x9c\xe6~\xa9\x01\ +\x08K\x9e\xb7\xb4\xb4{G\xaa\xff;\xe0v\xf2\x9b\xfdv\xbd\xed\xdb\xd9\x95\xd0`\ +\x8f\x04\xc4\xaf\xfaVe\xfc\\\x14)\x95\xacx\x9a\x9fM5\xba\x8dI\x03Y\xda\x14v>\ +G\x92\x19wl\xa8_\xce\xc8C\xe1\x18\x1a\x94\x01\xf2\t\xb3\x9e\x02swb*M\x96d\ +\x16\xbd\xb3\x04\x8cCj\xbe\xda03\xec\xef1ym\x02N\x863\xa5\x9c\xeb\xed\x18\ +\x18n\xafs5\xa5\xfa\xef"\xc2m\x13\xd1\x87\x1a\x8e{\x99\xcc\xc2~\xffHi\xf08\ +\x7fx8\x0e\x90\xf7\xcc\x9a\x1a\xf7\x9f\x1dr\xf9\xb1\x97\x95\xc0>\x16g\xa3\ +\xd5\xfa\x98\xd4\nC\xe6\xb1^\xd1\x04e\xc0i\xf4\xacU8@F\xaea\xcf\x7f9h\\\x10%\ +Z\xfd%\xeb\xc4\xd6Z~L\xc9\x96\xf6M\xfd\xa6Fn\x94\x97\xdc(\xe0\x8c\x81\r\x92\ +\xd2`\x9f\x1f\x96s\x81\x05$\xd2k\xfa\xf5w\xd0P\xa3\xf9%\xa9/\xfd\x19\xf2\x98\ +l\x9d\xcc\xbd\xc7\x17\x9bP#3[\x823m\x17x\x96\xb2\xedp\xa4\xde\xa1\xcb\x93\ +\xb5\x87\x13\xe8\xaaX4\x9c}\x07\x9d\xf0H?\xd0\xd4\xa9\xe2\xfd\xac\xb2\x11\\\ +\x92N\xefv5B\xba\x0bd\xfd\x81\x16\xdfZ\x102S\xfbqf\xd7\xda\xea\xda\x93\xa5\ +\x86`\xa0\xae\xf3r\xa2\xc3l\xec\xcc\x1cLG@yc\xe8_~\xcd\xe52j\xe0s\xacf^\x0e\ +\x0e\xa0O\xf5\xbe\xbb< \xe4&F\xac\xca%\xdb\x951a\xd7\xd6\xc0\xea\xb1\xc4\x0c\ +\xddz\x9d\xf2(\xb9/\x80\x97\xefq\x96?\xab\xbf\x12\xa8c\xe6\xf0\xde\x1d\xa3C\ +\xf4\x9dJ\xaf\x15\x07\xfcwc\x7fL\x91\xd6\xceJTTT|\x9d.\x8d\x07\xbd)\xec\xdc\ +\xa9\'\xbc\xac(CA\x99\x0f\x85\x9c\x93\xc2\x90\x15\xad/\xd7c\x1d\x02\xf0<\x9a\ +\xbc\xc4\xc3\x9d\xb1\xd5\xfe\xc9\xdd:\x8a\x84-\xebmkh\xec\x1d\x8e\xd8)\x9b0G\ +\xb3\x07\xbf-5\xf9\x1e\xd8_\xf1\x01\x8b\xe5-\xe8\xa9\xd3\x94\xde\xc2D\x89\ +\x85\xa1\xee\x85\xef\x99\x94\x18\xca\x82\xf5Yo\x94\t\xad\xa8gi\xe4\xa0\xaaI\ +\x05\x95;\xef\xa5\x83\x1e\x84-"\x8c\n0\xb8 \xd4 \x97\'}\xcb\x02]\xfa\x06\x08\ +\x81\x02\x832B\x8d/&p\xed<\x90\xfe\xb2\x86ZA\xdc\xfa\x1d\x86 )\xca\xe2~d\x87\ +\x98\x88\x92S:y\xd0\xc7\x95\xf0/\xefm\xc1\xb4\xdf]e\x07\xf3\xd0\xe8\x81e\xa9\ +\xa6\x96\xb4\x890x\xdf\x87b*xK\xff\n\xad\x80\xa4\xa0f6\x92\xbc\xac\xcc\xac\ +\xa3E\xb0\x04P\xa1\x1e8\xa3\xaa1\xfd\x85Z\nRdp\'r\x05l%:a\xd6g\x18\xd59\xc5t\ +\xbf\x81Z\xbc/>KS\xaf\xe0k\x91\xfe\x9d\x04\xd9e\xaak\xaa\xdb@\x17\x02\x9e\ +\x8aW{F\x8fzE\xf8\xc4\x0e\xa7\xf0\x9cF%\xf7&-\xd0\xc14\xf4v\xddN\x96n\xb5\ +\xad\x13{\x05\xacs\xb3\x86\xfe\xc1\xa3y\x89\xde\xe3)\x8d8\xd3\xd9d\xd49K,\ +\xbc\xe6\xe8\x7f\xc2r\xd6\x1a\\\xe7EE\xa2\x03\x9c\x81\xdb\xec\xdc\xa6\xa2M\ +\x18\xc7\xe7\'o\xa7>\xdd\'\'B\xb6\xf4\x06\xef\xf3\xf2\xa7\x95Id\xec0\xbd[\ +\x96?T?\x84$\x91;N{\xfd(\x08\xdeD\x0b\xa1\x87)\xde\xbc\x97\x03\xa6\xb6\xfc\ +\xe9\xeb~\x9f!\'\x9e\xfcLX\xd8lx\xde~.\x19\xff\xd6\xe7\x95\xd1\x1fV\x16\xae\ +\x0f\xdd\xd8\x99-\xcfs\xd9\x1ed\\\xe4\x01\xe3\x8fo\xb25\xaf\xb5\xe8\xb8f\x12\ +\xf9\xc1\xe2Hg\xd6\xe6\x1b\xb20\x9dyo)\x87h\xb4\xa2\xee\xc5\x9f\xd6Y\xf7V\ +\xa3\xde\x98+\xde.\xf53];\xa6\xb2\xddw\xcaO\xa3^\xc8BT\xa3\xd02\xf7\xca\xf3\ +\xb5X\xc7\xd3\x07\xce\xbf\x80V\xfdd\x88\xc3\x8e\xc40\xc8\xb4\rr\xa4\xdd\xb4\ +\x90[\x92\xeb\x90X\xc09/\'\x1e&\xeb(U\x9b\xc7\xb6\xc3\xb3\xe5\x17F\xa2\x85a\ +\x84\x7f\xb7~;\x92J\x0fZ*\xbef2\x1c\x9c\xf3\xc3k\xca\xd9Z\xb4\xeb\x05\xd5^\ +\xd04\xe3\x17\x8d\x18\xba`\xde\xf1\xc9\xc5\xdbPge\xe3\x11\x10e/lY\xbf\xdb"\ +\x92m\xcdI\xc5\xe4\xf0\x9a_Pk"\x88\xfa9\xbfu:\x0c*?G\xe5\xf92\xe7\x9e\xd0\ +\xad\x96\x1a\xa2Xv\x86\x85K)P\x0b\x19\x1a\x0f\xf9\xf1\xe6\xa9\xbb\xa4\x8b\ +\xef\x9bIH$\x02\n\xdd@\x97\xfdQC\xcd\xe6\x9e\x84\x0c\rz\x14\xb8\xc3\xcc\x9a\ +\x12\xd0\xe5\xf1\xd4\xb8\xae\x13\x978Z}\x95\xcec\xfe\xfa\x83c\x9a\x11\xde\ +\x92\x95\n;\x84%\x97\x0fv\x95\xd6\xa3\xb4\xd8\xb2`\xd3\x10\xf5\x9e\xfa\xf1\ +\xf7\x99f\xc1\x90\xday\x98\xc0KUD\x06\r\xbd\xee;8p\xe26\x18I\xd4\t\xb3f\xf3Q\ +8\x1a!\x85U\xfa0\x99\xcf\xaf\xcf`\x80[\xc9Z\xe1\x85\xc7\x9c>T\xd4\xd8n4\xe3?\ +4\xaf\xf2\xac\xf00\x91y\xc8\xaf\xb1|\x03\x19\xac\xb1\xad\x08Hl(\xf7.\xcc\xd5\ +\xb1\x16Z\x81X\xd2_\xa9 ,T*\x113\xc2\x89?\xf8\xfd^\xe6\xe0\xd8Y\x8aAB\xeb\ +\xa2f,\x13\n\x94*\xa3\xdb\xf2\xe9T6\x90b3\x19l_\x88\xb7\xd0\xfc@\x132\xaa\ +\xa9\xa1\x82\xd5\xbd\xffV\xfc\xf8"\x1f\xfc\x9cb\xfdtaw\x85?\xe1\x8e\xaah]\ +\xc7\x02\xefc\xbc\xc8\xdd\x17cU\xd1\xee\xec+\x1fO\xce\x86\x81\x13\xaa\x80Q\ +\x11\xeaE\xea\xfb\xb7\x90\xc7\xdc\x98s_\xc2\xe26\x87g2\xe2\x90\xb3yf\xfb\xc4\ +ZX\xca\x9f\xdc\x0ejOj\xc9\xe0k-\xb5g/\xdb#q|\xf9B\xfbmN\x083g\x1b\xcc\x8eP/\ +\x13\x00\xc1\xdbGPA\xffy\xba\x04\xc3\xa9Zj%EY\xb26\x7f\xd6}\x9f\x9d\xd2\xebg\ +\xa2\x9a#\xdd\xed\xb3R#\xecq[\xbcx\xf6D\xf0o\xf0n\xa8\xeba\x0c_\n\x9d\x99o\ +\x13~\x8e\x92O\xfa\x9c\xd1\xaab\xc4\xfb\x0c6\xef;\xbe\xd4,+\x19\xc7\xba\xdf\ +\xef\x93\x92\xa0\xa7\xb7h,\xf9k@P\xbe\xccr\x13f\x90\xd8\x8d\x1fu\xe6\xe3\xd7\ +z\xc2\xde\xd9\xa2\xa3\x7f\x85\xbb*O\xfeN\x83\x11\x103!\xc3\xa6\x94\xab\xc2\ +\xdf\x825\x9d-s\xb2\xa7\x16\x9cY\xa3\x1cL\xb29\xd1_\xb4\x8c\xdaQw\x15\x8bq\ +\x81\xf7]9\x82\x91\xfb7$<2\xc7P\xc7[\xc7\x8d\xdf.\x99\xf3p\'L\x10\xe3\xea\ +\xfa\xcd\x19p]\xd8\x0e\xbd\xd1\xd0K\xde\xb2\x1dK\xf5\xcdph;\x921%)\x9a\xfe]y\ +\xa2\xe3\x1b\x8e\x1br\x94\xe3\xeb\xfe@-\x9c\x15\xb29\xa0*\x9fY[\xc0\xce\xfb\ +\x99Z\x9c\x19\xf7\xfd\x96\xebM\x94\x838\x19)X\x83\x9dmdo\\\xc7\xf2\xb3\xe1\ +\x05\x13@\x95>\xed\x1b\xa3\xae\xc8\x95\xd4/\xddF\xea\xed\xc8Q\xce\xca&\x0eYY\ +\xa9\x883\x9d\x89\xde*\x8e\xacd\xcd=X\n7W\x86\xa1\x97\x15)\xe9D\x03\x1bG bW\ +\xde\xb3\xf16"\x1f\xcc\xfe\xe7\xa7X\xa0W\xaa0\x00s\xe6\x1b\xe4\xce?\xfc=;\ +\xcfy\xc6\x10\'\xd8 \x1e\x1a\xab\xbf\xcd:h_\xfb\'iA\xb3o\x915\xd5[\xce\xdb\ +\xff\xc9\xa5|\x86R\xe6\x8a\xfd\xfa\x9b\xbe\x89\xb6V\xb3\xa1Kf\xf03\xd3\xe8\ +\x1c\xaf M\xe6\x16\x84t\xa5G/\xbc\xe1~\x1do\xaf-4\xf4\xa1\xc0\xfb-\x13\xe9\ +\xba\xe7\xf5\xe7\x8f\x96\xc4F\x9c\xc5\x93w\x9e\xbb\xa9\xad\x9e"d\xca\x16\xa2\ +\xd7.\x1e>yCT\xea\xbcI\xbc\x870\x82\x18\x14\xb7\xb6B\xfa\x0eb\xe6\x8a\xa8\ +\xd4\xce\xect\xdeG=\x12\xde\xef\x11P\xc1\xebuG5\x01\xeb\xe1\xe4\xfc\xec\xf6\ +\x82\xe10\xad\xed\xb0\x0c\xfb\x89t_\xd3+C\x83\x1aj\x0b\x98\x9c\xea\xc6{]\xfc\ +\xdc\xa4\x1d\xc2\x97|\xfb\xb0\\\xc4w\xef\xf4wY)$\xa9\x03\xceT0\xe2B>\t\xd0#\ +\xb9AQ\x1b\xa8\xc2a2a\xe8\xf1\xd68\x8a\xa1\xb8\x98\x1c\xb4\xf9\x08\x07\xf94\ +\xfa\x91l}\x01\xe5}\x80t\xb47\x0f\xeb\xf5\x84\xea\xf68z\x87\xc9@\'\xc6xZ\x13\ +J\xaa\xe32\xf2\xd8\xd7(l\xfe\x98_\'\xe5\xd7\xbb\xf4\x0b\xbfg;n\\\x9a\xb1\xfd\ +\xfb\xa0z\x87m\x8di3\xf2\x05\xaf)E\x00\xb4Fd8z+\xba\xeaz\x92l!\xe1\x85}v+\ +\xce\x86o55\xde\x1dc\x88\x97x\xcd2\x05\xac\xb4\xe1O]\x0eS\xd1\x11\xfd\xbb \ +\x95P\x99\x07=a\xddn\x1fM8\xc8\xa7BO\x00\xb5\xa0\xe0G\xeb\xd6\xdf\x7f\xfe\ +\xaf\x15`\xe5\x8d\x86\xbc\xfc6\xbek\xb7q\xeb>\x95`N \xce_&%\x13\x19(2R\xd3\ +\xfas\xd6\xe5\xa2\x9de\xc2\xa0C\x13\xe3\xdd\x88\xe2L\xe1\x16\x87+\xb7\xbd\ +\x80\x84]\xe9(\xdf:\xc6\xe4o\xda\xe1f\xea\xb9\xab\x9b\x81!\x1d\xc2dX\x83\x17,\ +\xfdk\xb4V4\xa4\x80\x07\xa2\xa4"\x7f\x02\xc0\n\xd4{W\xc6\xf3\x82{2J"M?\xef\ +\xd9\x1c:\x98\xef\nQO\x1d\x98!\xa0\xc8vT\xd2!\xeeJ\xe3\xd89T\x14\x83\xe4\x8c\ +\xd1\xbe@a\x92m*\xa1x\xa2\x1a\x13\x94\xebI\x90\xb4\xd8\xad~\xc7\x91\x15|\xfe\ +\xb1*\x08\xa3R\x0b\xebW\xaf.n\xca+\xef\x18\xd4O\x8f\xed\xa9.OE\xd0B\xcf5\x7f\ +\xe7\xa9\xb9\xbe\xe7\x8c^K\x8a\xc3\xdb\xee3Jy.\x99R\x10!\x12p\xc0+\x90\xb8ds\ +\xc0\x0b\xe0a\xcca\x16W\xaf\xbc\xac\xd2\xe8w\x94\xb3\\\xd0\xf3%0\xae\xa6\x8e\ +i\xb9;4J\xb2\xc5\xc6gJU\xae\xb8<\x0bO\x04bq\x01\xc3\xff\xbc\x8e\xd1\xb9,2\ +\x85\xdf~),,`\x90\xf1\xb6}\xb2\xcf\x10eU \x02~\x9d\xf5\x0e7|\xca\n\xb5\xa9\ +\xb3\x7f\x96Ld\x85\xa5\xc8\xee\xa5\x1cmhZ\xa2\x00,\xac0\x10\xb6q\tm\xcf\xa7\ +\x89\'\xd7\xb3$\xd1\x8e\xe2\xd6PKz\x0f\xdf\xd0\x93\xe1\xc7\x87\xdb#)w\xc8\ +\xee\xd4\x93)pd\xa5j\xff:\xd3\xcb\x86\xfc(\xe6\xa0z\xd9fi\x05g\xa0(\xe0G\xc3\ +E\x0e\xfa\x0fk\xda\xe2$Y\xe3(1\xdc,1U_\xc0\xc5\xddgj\xdfo\'N9OU\xd5\x17\x0f{\ +\xfd\x82\x7f\xa3\t\x85\xcbw\x9a"&\x9c\xda\x95\xb9\xa7\x1d\xb5\xcb\xb1i\x0c,t\ + \x83\x97\x90\x8e){\xb9gJ\x13UTX\x80Q\xa5|\x8b{\xf4>\x92\xb6\x16\xdb\x03\\\ +\xba\x1bN\xbe\xa6\xa1\x11\xde,UNw>6\xab\x174\x17\x00\xb2QA\x11Y\xdf\xe5\xbc\ +\xe68\xc8\rIz\x8a\xbe\xd9U\x18\x07\x15\x88)@\x83\x7f1{\x17?\x8c\x98\xa0U{m\ +\xe4\xd4\x00\x8d\x90\xe1\xcb\xabE\xa4\x0ci\xc8\xe4\xd6\xfe\x8c\xef\x06,tJ\ +\xa7Q\x8b\xa1a\x96\xcd\xe0\xcf\xed4\xe3\x06\x07\x89E\x87\xce\xacR\xcap\x10j\ +\x0b\x13\x0e\xd5\x81v\x92|\x86Sa)\x04\xef\x16a\x92\xa3\xff\x95\x99\xca\x12\ +\xe2i\xf3\\Df|QJ\xe1\xa1\xe8O\x14\x8bT\x10\xa3\xd9y[\xdf\x8fg\xf706\xce\x0b\ +\xab\x15|p\xdaiBe\x98\x89\xf9\x1f\x9fZ\xaf\xcf\xffu\xbe\x0bx\xcb\xb5\xfb\x18\ +\x1b\xcb\xfe\xba0\'\xb4}\x7f\x19\xe2A[\x90\xbbO3\xdd$\x02\xc0\xeav\x1a\xb2Ot\ +\xec\xbf\x05\x99Y?\x91\xf0_6\xfe\xdbH\xe2\xc1J\x0e6\xb3v{\xb8\'\xc8[fL\xd75\ +\xf6\xe5\xb6\x15J\x9f\x83\xa2\xee\r\xb1\xfe\xa9\xa9\xce\xeb*q\xd1\xb3\'\xe8c\ +zs}\xbd~/\xebR\xc2\xe9\xae\x8e\x183\xe6#\xfd\x8aJ|\xca\xdf\xdc\xe2|\x93\xe5\ +\xb0\xcc\x046.\xaaH\xd4\x90V\x17\xe8r|+dp\xed3\x1d\\[\xca}w\xc4\x1c\x00)V\ +\xbd\xcd\xac3\x8bl\xaaR\x8c\xe5\x95\xe6\xa2$\xdb[\x99\x13\x85\x90e\x91k^\x10\ +\xb0d\xbe\xc4\xc5\xd9y\xd6z\xe4\x87\x87\xcfhp\xaaj\x99o]\x1a\xfc\xeep\x18\ +\xbb&d\xce\xfd\xbc\xa8(\x12\xe2\xf85\x10-I\xccd\xean\x86\xa1&\xb6w\xd1I\xb8H\ +(\x11\xb8&\xf3\xe7\x9b\x0b.\x16\x9f\xfd\xcfoD\xbe{\x04,\xda\x14E\xda#\xa0\ +\xe2\xbcJ\xbb\xa3\xfa\xcf\xce\x07`\xa1L\x98\x18\xb5\xe4(\xea\xbe4\xc4\x0c=u\ +\xcc\x9f\xc3>\xd9V\xc1\xf5G\xae\xd2\xeb\xfb\xd8\xfb\xd0\xfeN\x16\xa1\xc6\x07\ +\nM\x857\xd7G\x85z+O9\xd4\x0b\x05\xe2\xbeS\xe2\xdc\x8d\x86+i\x9f%Q0O\xa4d!\ +\xba\x06\xdd`&\xcc\x8d\x96B\xd72\xbb\xad\xe9F\xc7\x89\xc9\xd2o^C\xf26\xc3\ +\xa5\xf5\xf9n+\x9b\xf5D\x98#\xe4\xa2\x1f\xa1\xd7\xd9\x81\xca\xb5\x16\xc0\xe7\ +A\xa7\xcc\xb3Szy\x95\xbd\xc7\x16f\xb6\x1e\xfa\xe8\xf2\x0c\x00wsq\xd7\xbe\xbb\ +2\x1a(\xd5\xf2\xf4f\x99w~\xf8\xa0R0\xbd\x18z\xb1\xf8\x8c\xfbB\x8f\xdd\xea\ +\x94L\x11"\x1f\xb1\x0fn\x8b\xcdm\xfc\xb2_g\x9dO\xb2\x93\xed\x87\xe9K\'\xa9\ +\x90\x81\x01\x83A\xe7\x91v\x00\xe1\xcfA\x16\xbf\xdd_\xa6\xe6\xc61\x18\xbfqo\ +\x9f\x18\t\xa3\xb0\xa6\x0c\xdf\x80\xe8k\xec\xbbk\x19\x85\xb6\x05=a\x02t\xe22\ +\x89\xc8\xd5\xe7|\xb7\xd7P\xd3S\x1buG^\xa13\xe3\x1d\xb9\xf6\xfe\xad\xa6\xab\ +\x84z>6\xbb\xf0\xd0\xb9\xe9\xe9\x19\xfd\x0c9|\xd6\xa6\xf8J\x1f\xeaI\xdesD\ +\x14\xd3\xb2\xb1\xc4[J\x7f\x18q\x02E)0q\xa6\xa2\xa0KI\x80\xdb\x87\xcam\xd5f\ +\xcf\xcd\xe84\x00lH\xec\xde\x12(\xe1\x95?G\xb9\xc6\xea!\xde\x95\xa2\x7f-\xb9\ +\xf7\x15x\xf0\xf5y\xae\xfe\x1d\xea\x94\xc6t\x95\x97\x18\x17\x04\xd1\xc6`q`V\ +\xe3UqE\xa0z\x8eG\xbb\xec\xb6\x85$\xc1\x97\x1dP\x82\xf3\x1eGn\xb3\xa9~\xff\ +\x10S\x1f\xb9\xd9t\x1e\\\xdb\x00\xd4h\x0b\xf0\x1en\xa0\xf8\x0b^\xe8A\xf7$\ +\xdb\xf7\xb2%\xd2\xca5\xf9\xb5\x8dt\x14\x1a\xf9\x8a\xf0U\x90S\x16\xcb\xa0\ +\xf6\x86kn,;\xbcc\x81\x13\x93\xc9\x9aZZn\x93x\xbaq@\x04j:\xf0l\xce\x8fO>;\ +\xb1\xc0NA\xf0\x9c\xdf\xe74\x0ej\xa5\x0b\x9b\x94U>z\x98\xd8\xbd\xe9\xd2gF^\ +\x13\x7f\xb2\xe4l\xc8\xf6t\x9bpXsH\x88\xfa\xa1[\x1e\n\xc5_Yt\xa9\x8c\x16\x8a\ +\xd4i\xd3\xcfaw\xc3\x9flN\xb1X\x01\xb8.\xfe\x01B\x88\xb2\xafA\x82\x84~-\x8fc\ +G\xae>\x8beC\x9f\x98:\xe1#\xba\xd5k\xb9g\xac\xee\xf9H\xeb\xbcR\xa1L1\xb2\x81\ +\x8c\xce{\x8c\x05\xf4\xe5\x88\xc63\xc9\x1e,f\x06\x97\x16\t\xa4{XL\x01\xee]\ +\xd4\xa7\x8b\x12!\x0b\xba^\x97_5\n\xa1\xe2\x9d\x91?0\x0e\x17v\xd2X\xba\xbe,\ +\xb6b\xbf/\xd7\xb0W\x92\xdb\xab\r\x08\x1f\xc4\xf9\x84\x14\x9aZ\x81\xc4\x92x\ +\x93\x84P\xa8q\xac\xac\xca\xa1\xe4\xd1]{\xf1\x04\x98\xe9\xfeo,\xc0\xb3i4\xd3\ +\xc0}r\x88\x13\x8d\xff\xc4\x15e\xad\xb7\xf1b\x0b\xc4\x1b\x14\xc0\xdd{\xd0UY\ +\xb7\xdb\xbe\x81\\\xd3S\xbf-\xceK\x1c\x91v"\xa1$Un\x14~\x0c?p\x16\xe1\xdb\ +\x8a\x82O3\x94\x82\n\x04\xd7\x0c\xfe\xfbM\x8e!#\x8a\xc0\xf4K\x15\xc2\x80\xac\ +\xdf\xd9\xffh\x8a\xc4\xf2\x94\x162\t\xd1E\x05\xbc\x1a\x9d\xba#\x8a\x15\xe6\ +\xb0\x9f\xbd\xe8\xcbJ|\xba\xe0@O\x90G\xd6v\xcf\xe9$<\x12\xe8\xf4y\x94xwY-\ +\x86B\x96\xe7\xc6f d@\x1c\xae_WrQ\x89V\xd3\xd9\xd0\xfe\xe4O\x9e6\r\x13\xa1\ +\x1e\x7f\x10\x08Q\x10\x1cnA\xde9\x0e\xc58\xc0\x1d\xc5\x8e>E\xcdX\x8f\x97\x15\ +CSl\xf2\xad\xce{\xc8>\xa1@\x08\x80e\xf4k\x02\xae\xb4%\x03?\xd9\xd9%%)u\xa2C\ +\x9aJ5]\r\xd8\xe1\xce[C<\xddq\x1f\xd0\xd54\x1e?\x9e9P\xfb\xe8x :\x87\xdc\xf4\ +\xbb&\x10\x97f\xaf\xaf\xf0\xf4\xb0\xc2#\x04\x06_\x95\x1d\x8aA\xdd\xa6\xa0b\ +\xa7\x81\xb5\xb6\xe3a,#/\xa4\x90o\n\xab\xc7d\xdc-\xd9\xc2\xdcZg\xb8\xa5e\n\ +\xba\xc3\xb3\xd7\xb4/%\xf5\x1c\x96K\x83\x95r\xa0W|{\xfa\x94\x00\'4\xcb\xfc~\ +\x01\xfd\x95\xf3\x0e\x92+?C\xb6\x0c\x9d\x87\x95\xeb\xf0c\x02D\x02\xff\x88!\ +\xf4\xd0\x15\xd2\xdc\x0f\xcf!~J\x07i\xa7\xf4\xb9\xee\x96\xea\xfaD"\xed\\V\ +\xcc\xb6"\xfd#9\xe7k\xbe\xa7\xbcE\rK,"`j\x94\xa2\xc6\xef\xc8zI\xc9\xb6-\xf6\ +\xd4[\xc8=f ,R\x12\x16p\xd1\xc9\xf2\xe9\xfeq\xe6J\xe2!\x80I\x86\x01\xe59\x81\ +\xdb\x07\xff\x9fH\xd3\xd4\x07!\xa1\xc6a\xb4?\xde\'\xd4\xc6\x9d6\xce\xa5\xa9^\ +\xe3tR\x90\xce3d\xa3\xa0\xe1\xec\xb7\x98\xfe\xc5\xa5\x1bu\x88\x89\xc2Uz\x81T\ +$:\xd6\x00`\'AuZk\x9e\xbf\n\xa8B$\x15\xdc-\x81\x1d\x88:\xc4v"\x86\xb7\xa3\ +\xee\x03\xdf\x19\xc3hI\xc5Q\x99\xabM\x0b\xcc\x91\x05B\xc3\xf4\xba\xc8\x8d\ +\xd7\x8a\xda\xd8\xfa\xad1\xd1\xa9\x11\xc9\xff~YL\x87*\xc2\x19WTB\xd4\xf3Yh9x\ +\x98\x1e(\x01\xd4\xc1\x99%\xcaV*\xc8\x97\x7f\xe0-\xf7\xc9\xc5\x11\x86\xaaL\'\ +W\xc5\x9b\x02\x1a1J\xd0\t,!=\x0b\x0b=M\xeeQ\x90[\xa6\x81\x8a\rw[\x00\x15\xcd\ +L\xef\xd3C\xf9pD\x7f\xc3\xa9\xf9\x88\xb5\x9b\xbd\xff\xd9E>\xd0\xcaw:\xfar\ +\xfa\xa00+e\x14s\x91y\x8cl\x08+\xa0\xec\xde\xd9\xf4\xdb\xb2\xf5\xd1gY\xbd\ +\xa3\xf1\x08\x0c{\xa91\xb2\x837\xb62G\xae\xab\xe0\xc3\xee\x9b\x01\x9f\xb3\ +\x81\xee?t\xe4\xb1@"\x90\xbe\x04g7W\xff_\xac\xd9\xef\x8b\xf2\xd3-\xba\xc9\ +\xbb\xc6h\xfel\xd4\xc2\x07\xf2\xd0\x11\xda;G\xf3v\xc2l\x1c\xe2\x9e\xbd\xcf:\ +\xe61\x9e\x95\xf8@\x0b\x15L\'j\x9d\'\x9f\xaf\xbfz~H\x90\xa9\xc1\xdb\\\x8c\ +\xa1\xf62e8\xe6\xc4\xef\xbeF\x80\xf8\xffV\xfbN-]U\x84\xab\x96S\xa8\xc5\x98_\ +\x9c\x96\x0bg*Z\x16\xd5_\xa8\xd3\x18I\xa1Fo\x052\xd2\xbf\xb8\x95\x8c\t\xde\ +\xad4\xff\x19H\xfb\xc3\x8d{\x18x\xbd\xc8\xb1\x00\x0f\xc1\x98\xfa3\xaf\x8f\ +\x1f\xb3^n\x9e\x08\xae\xf1t\x82va7\xd9\x07\x8a\xc4\xdb\xb11\x83fg!"\x14\x93|\ +4\x94\xe9\x8d\xd4\xdb\xcai\xdf\x1a\x87q\x19\x8b\x8f\xb69\x97~\xaa\x08;Q\x84\ +\x99\xc8\xdb\xb9\'\xf8\x95aS\xe0*#*\xf3+\x10\xa4\xcfE\xeb[0\x95\x8c\x18x\x08\ +#\xdf\xeamz\x17@\x1aF \x9d\x7f\xaexm\x13XS\xff\xaa\x0b\x0e\xae#\xe6\xd8\xdc8\ +\xe2/\\\xe0$\xac"\xb8\xcd \x0b\x96j\x14?\xc0\xc9b\xeb\x0f\xcb\xceE\xb1\xbf~\ +\x15\xa4\x12\x89\x971t}\x89\xbeB\xae\xcd\xa8\xbe\x96\x92e\nI\xd8\x07o\x18\ +\xac\xaf~\xda/\x08$\x08\x07\xe2\xc1\'~\xefM\x17x\xcb\xcfN\xda\xbd\xf5(D\xf0\ +\xe7\x9d\x89\x08\xcf\x10l\xb1:\xaa\xdfDO\x82\x0f\x97%f\xc8\xb1;;\x7f\x9a\xb2\ +\xbf\x08,\x0f\xa8\x93\xb3\xbe\x9d\x07\x87=\xcdC\xea\x84"\xc4do\x9c\xac\xde\ +\xc7Pd\xd1E\x18\x0bh\xf5\xd1G@\xa02\x87~\xe5\xab\xeb\x0c\x1d5\xdfCd"\xea\x9b\ +\xc97\xf4Q=/\x87\x19\xac\xfd9\xf1\xe7\xa8\xae,\x1fC\xd8\x96\x10cc\xd8nG\x13\ +\xe86\xd3l\x17\x15-\x06KC\xe2\xef\x1b\x1e\x97\xef!\x9b\x0f\xab\x04\xbc\xf3\ +\x12\xe4\xd1\x97w\xdb\xcf\xd9\xd8u\x1f\xaf\x1e\x0e\x8d\x03\x17\x07\xe6\xe3MU\ +!\xfb\xfa\xe9};\x0f\xc4\xf9c\x05\x88rY* \xf5\x81\xb3X\xa7\xea\x14\x0b\x9c\ +\xc1\xe0\xb1\x1d\x93\xb3~\xbas\xfb\x96\xeb\xf3Hiq[\xbf#z\x86"\xdc\xc8\xf4t\ +\xed\x14\xc2\x0c\x96\xa4\xa4\x94I\xd2\x01M\x87\x86\xa1\xbb\x1c\x9a\xa0\xb5\ +\x07\'\x92\xaa\x9dk\x15?\xe0`\xbf\x05\xfd\xf4\xef\x97F\xf1\r\x16\x80\xa8\xb8\ +\xcc\xadcz\xd1\xea\x95\x1e=,\xf4\x86\xdf~\xf8\xeb\x7f\xe0\x18<`\x12DS\xbe\ +\xfb\xb3fUo\xa4\xde\x9c\xb5x\x7f\x16\xe8U\xd6\xb2\xdd\xf7\x1f"\xa5\x880\x97\ +\xcdP\xfd\xeb\xeb\xb7J\x0c^\x8d\x90\xa6\xf7\xbf\xf0Z\xf7\xa0\x97\x1eR\xc2\ +\xae\xa8#\x1bj\x14\xc9\xfa\xedm\x89\x06@\xcb\xf5\xa7\xeb\x90^S\x19W\xc3\x97\ +\n\'IX\x91\xc5\x84\x1c_\xbe\xec\xba2\'\xd4\xf8W\x94Zb\xe7\xe7*\xab\xee\x12"\ +\xb6\xa8[V\x91\x17\xdf\xdde\xbdzC\xc2\x05\x1f\xcc\xbct\xf4,\\R\x0e9\xbb\x98\ +\xd6\x8fp\x03\xe0\xfc\xd9\xf2\xcf\xfeS<\xaa\xc4\xb7\x1eR\xd1\xde\x9f\xf5\x8f\ +\xa9\x04\x03\x11D\xb9V\xcb\x0b\x85\xa0\xa5\xf9\xac\x978I4\xa9\xaa\x93m\xfd\ +\xaeQ\xfd\xcf\xdf8T\xe2\x97\x8c\xbc\xf1\x8dS\xfd\xc5\xae\xba\r\x14\xb1\x01\ +\x900x\xeb\x7fX\t\x95\xc2u\xc8\x18\xb0]~\xc5\x1cq\xec\xc1\xf4\x11h\xfa}d\xc1\ +e\xbb\xb1\x05\xd2\xf1:,\xd5\n\xfe\xb7\xab\xf6\xdd/-~\x98d\xc3@}\xa3G\xcfar{\ +\xa1\x13\x11\xd5gk\xcd(`^p`\xc7\xb6\x13\xf6\xb0\xe2\x88_$\xe2\x80\xb2\xaf*\ +\xb5\x1bl\xe36o1\xddIF\xf7\xfe\xe9\xcepr&TjVT\x81\x81\x0e\x8eTG\xca\xf9\xcb\ +\xc1\xbb\xe7\xe7\x98\xae%3\x1b\xdd\xae\x1a\xe3@o\xb2*\n\xa6aI\x17\xa2\x96W&\ +\x068\xe0\xf6\x90I\x9d\x0b/<\xc4x\xf9U\x1e\x9eV\xd0\x7f\xbe.\r\x9aH/\xfa\xdc\ +\x1e\xbe\x18G4.\x90\xc9q\xec\x1az]i^\xea\xc7\xb8\x0fm!\xc1R<\xab\x0f\x9d\xa8\ +\x9b\xec\x84\xcb\x0e2\xb8`W\xe0\x83\xe2\xba\x1fB\xff\n\xdbVt\xf5\xf4\x87\xdd\ +\xc5\xb3\xe1\x0e4\xb1\x08>\xeev]\xc1PP\nA\xc4\xdb\x8a\xf5c\xfbC\xc2\x16\xd2\ +\xc9l,\xd7s\x92\xf8\xb3\xde.\xb2\xbcn\x18\x0eA\xe9UZ\x920\xfeq\x95^\x9a\x18o\ +\xc0\xdb5\x1a\xe1\xa0F\x1c\x9fkGamTmnd\xc9\xbcQ\x0c\x88@P\xcd\xa8P\xab\xee4\ +\xbf\x98\xcf\xdcL\xa3"!\x00\xc0\xee\x8d\xfd\xf3\x0b\x9c\x85\x1f`\x92\xe9?\ +\xc3U\xc6\xff\xa9\x8dp\'\x87\x1e!\xd2z\xc9\xdbp\xa5\xc2\xe2_Uc\xf9\xfa\\\xc1\ +\rpi^\x8c:RDN\xc9i\x10\x14 \x03)\x13\x92\x7fG\xe5\xe40\xa7oj\xce|\xca\xda\ +\x80\x0f\xeb\x8d\x92\x08\x13\xf6\x7f\xc8|\x0cD\x1e2A\x0cRU\xf8O\x19\x89\xaa\ +\xbe\xb1"A>\xdc\xefw]o\x1cdo\x0cg\x1f_\xb42\x13\xf1\x1b\xe3\xe5E\xfd\xe7\xf2\ +<\x8d\xe4GL\xd8\xfe\x88\xdc\xca\xf3\x9c{8\x9a\x11\xe2\xbd\'\x98\xc7\x04\xe4\ +\x08q\xc9\x91\xc7\xfa\x15,\xab\x16>\xda\xe2\x019\xae^y\x85m,=\x0b{\xe0K9Q\ +\x18s[\\\xbe|"\xd1\xcbF\x11\x1dEi8u\xe5`\xbf\x80\xc8\x1cMn\xb5\xd3\xba\x1e\ +\x8c\x88aY\xc4\xf1\xbf\xaf6\xb5\xe0/\xe7\x01\xc4\xcb\xee\x11\xd0\xea\xdc\x98\ +\xcf\xe6`Gt\x90\x94x\xfc\x0fN.\x93\t\xafi\xe27\xf2_V%X\x85eb\x8f.\xd5Z]\x1fN\ +\x04\xff\x88w^Q\x80\xf5?x\xcd\xad\xeb\x82z\xa1\xb4\x1a\xdc\x1b\xd2\x83\x93*#\ +\x83\x87\xc2r6\x83\x19{PFL*]g\xec\x1f\n@x\xb4\x19F\xef\x15\x8d~\x83\xe9\xc2&\ +\x02F\x04\x88\x92\x19\x10\x87;\xb7T\xa7S\x90\xf0aU\x12|\x00\xc3\xf5K[\xad\ +\xb1\xed\x04\x8c\xc2\xd1\xaa\x08\x97f\xaeR\xea\x18\x94`\xdf\xff\xa0\xad\xe5\ +\xf2\x14\'\xc1m\xcb\xfe3+\xc3\xc4\x18\xdc4\xfa\x9f\xd7\xf6rt\xead-\x869S\xc0\ +\xdc\x13\x16\xaa\x03Y[\x87\xc1\xcd\x9d\x1bN_\xc5r\xcck(\x83\xd7\xb1Q\x13\xa1\ ++e\xadt?\xb8\x8e69\x9c\xee\xdb\x1b\xc8\xb8;3\x027|l.6\xce\x90,\x1f\xe4D\xa8c\ +:\x84\x12<{\x00@p\xef\xd3\x8b\x89t\x1b\x0f8\xdf~yn5\x98\xe4X\x0b6\xca\xd9\ +\x90\x92l~\xa8\x0bN\xa4\xcb\xd9\xb8\xeb\xb6\xef\xa4\xafa\xa5\xf0\xcf\xf1)u\x8b\x81{\xd4\ +\x02\xeb\xec\xbb\xaf\xf1\xb5\x14\x80\x04<\x17\xe5#9\xc8\x11\xd2\xdc\xaf\xec\ +\x844\x17\xfeu\xd2\x93E\n\xfa\x1czC+P?}\xa6\xf4\xe2Tl6j\xb6\xf0\xa8\xbc\xb8}\ +\x833:;w\x0fc\xde\xd8\xf9\xd07H\xf9\xa9\xce\xf6|\xc7Hs\xfa\xeb\x92\x04;&\xeb\ +\x0f\xef\xb7\xfa\x91\x1c\r\x81\x82\xbb\xb3\xa7+\xf5b\xd0_\xbd\xf4M\x01\xef\ +\xb5"\xa9\xbe\x83;\xd7G\xd2\x0b\xed\xe6G\xff>\xf1\x9b\xe7\n\xbd<\xc5\xcc\x15\ +\xd6N3\t\xac0j\xaa\xd3\xaf\xa1\xc3\x00I\xdcX\xb4Y\x98|\xfc\xc5\x00k\x03\xa1\ +\xf7\x8a\xf3\x115\xc8\x16\xca\x86\x0e\x03Z\xff\xa9\xcd\xcf\x03BW\x82\x8e\x0c\ +:\xdd\x02\xc8\xe3\x02\x8f$\x84\x87\x90\x89\xb0\x82e\xba\x86W\x87r\x88\xffx\ +\xab\xcbs\xda\x0e\x02\x9f\xc7x\xc5\xdc\xf6\x97\xbf\xfbt\\\x18\x1b\xd1V\xf6\ +\xa6\xae\xdf\x1di\x96\x1d`\x07>\x04\x18\xffo\xce\xf5~\nn\xc9+/\xbe\x04C|\x98\ +\x04\xbe\x96O\xb0\x16\x18q\xe7U\xfb\xfe0\xb0}\xc1\x00\xb3\'2\xc9\x98s\xc3\ +\x05\x976\tFX\xf1\xf1v\xeb\xc0\x0e\x83)q4\x1a?:\x9eO\xe7.\xd0W\xf9k\xf9\xf5\ +\x14\x13\x94\x03&E\xaf]\xe2h\xd4\xc1w\x19\xde1\xf8\xf1C\x0bF2B\x8ec"\xf7~51\ +\xc6\x8c\xc4P\xbeG3gE\xc0E\xe3\xef\x8ef\xf6\xd3\xf4\xe2o\xb5\x1f\x89\x90\x85\ +\xcf\xba\x9e\xe7\xb31vg\x0f\x1b"\xfak\xef\xfa\xa8\xb5\x1d\x90\xda\xaf\xe1\ +\xc1\xfc\x845\xda+\x05\xac2#Q\x8a\xd8\xef\x0f\xafz\x90\xe6\xf7\xca\xcc\xeb\ +\xa8N\x9a,Vt\x7f\\\x11\xdf\xf24\\\x07\x12%\x93h8\x97\x124(,*\xb4\xba\xf2\x9b\ ++y\x98\x1c!\xe1\x1b^gK\xe3\xaa\xba`\x17\xf2*\x97\xcea0\xa1Dj\xaf\xcb\x8f\xb9\ +\xa2J\xa3\x89\xb5QD\x1aL\xd9A\xc5]\x93\x80\x88\x947#Ye\xe5\xcbG\xfe\\r\xd6*\ +\xa9\xcf\xd3\xa5\x90\xc5~zd\xb9\x9ey\xf8\xb9\x8e0\x7f\xcf=`#s\xf6\x98\x02\ +\x05\xc04\x9cN\xfe\xad*\x996\x90\x80\x9ef\x8a\xc0\x0b\tP\x1c\t\xc5\xe9V\xe4\ +\xb6\x91p\x99v\xa1\xa1,\xd0\x81!\xa9\x9d7h\x19<\x97\xeb\xfa[\xf0\x19\xca\x8e\ +\xfaX\x1d\x08\xe6\x06*\x83=\x10\x17\x93\xfa\xff:f9\x80s z\xca\xd6x\xff\xc3\ +\x188\xe92w\x80\x06\xcd\xa1\xe7\xf9\x0c\xc5\xd9\xd6o\x00\xddK\x81\xda\x17\ +\xbe\xa1\xbe\xca58\xe4\x08\x9e\xebR\x1dh\xee\xee\xb88e\xb2\xd1Y\xb9L|~.\x8f\ +\xa0\xd7p\x9d\xf5\x9bL\xb4\x08P\xbb\xbb2x\r\x08x\xea\xf0h\x11\x85gA\xc7\x0c\ +\xba\xb9\xc1^\x87\xdf\xd7\xd3\x95\xa4\x11V\xc6\xb5\x8a.n-\xbf\xddf1\xf0\x7fQ\ +!\xa3\xbf?=$\x9cB\xf3\x8e9\xbcK\x0b\x84\xce\xc571\x8auwZ\xc2\xbd\xf4>\x14\ +\xf1b\xd9\xb1\xf5\x19\xee\xb0\x9cT\xec5e\xadH\x87\x12\x8fgBY\xb4\x15\xf2\x1d\ +\xb7\x1e\xe2YD\xc8\xe2)\x0e\xf2t\x1f\xe3\xb9z\xb1Y\xbe\xf9\xf4V\\\x8b>\xc9E\ +\x90\xcbQ\x85O\x8bA\x9c\xf8\xf3427\tw9|\xe2\xf5ndA\xe2\x0bs,~\x18\xf8=B\xde\ +\x82-\x8a\xee\xab\xf9\xefdn\x15"On\xa81|Oh\xa7\x9b\xd9\xebM\x86\x19\x1dt\xc5\ +\x93d\\)\xe1\xe3?I\x88\x01\xff\x01\x19<\x96\xecO7\xbc\t\xa3$\x8f\xc4\xdba\ +\xed\xa9<\x1eK\x0b\xf3\xdbk\xc2C\xc5gg\xd6"\x936^\x86\xb5\xb7%\x96\x8d\xf7#\ +\x0c\xf1\x0b\xf3\x9f4\x87\x9c\xed\xea\xfb\xbeAu5KL\xe9\xf3\x8c\xb0b!\x08\n\ +\x8c\x07&\x95\xeb$:\xf5)M\xff\xe1\x16\xa7\x86\xa6)\x1dbir1\x16s\x97\x96\xe3\ +\xe8s9fX\x14/W\x10\x15\xe4\xd3\x0cK+l\'\x15\xf5\x93\xa4\xf5\xc3\xfd\xb7+YJ\ +\x94\xb3\x96\x8b\xf5\xb95\xec\xd3\xfe\x1e\x89\x10\x9e\xee\x9b\x8ezE\x17\x15\ +\x84\xb4e\x90\x12\xe2\xb3{X\x06\x86\xac=\xe2\xd6\xdbuhs&_\xf0\x7f\x1d\rX\xe3\ +(F\xf1\x92\xd7\xb7\x10|\x9bF\xa2\xde!r\xf5\xa9~\x1b`\xc2=\x8aw*\xb3\x07\xd9\ +\xcb\xcdN]\xde\xcboi\xdb\xc6{\xd7\xe8\x96\xb8Y\x94\xcf\xaf\xd3\x88\x97\xf3\ +\xa2\xb8p"\xf3\x06R\xd7|\xac \x99\x7f\'\n\xff\xb6\xd8\xd8\xdfN\x0b\x9b\xe0\ +\x80\x92\xf6\x8d :\xe2\xf9;`\xe1\xf54U\xbe\xc4{V\x1bC8o\xdd\xf3\x1aN\xda\x93\ +;8xt\x9e\x00\xb84\x9a\x97\xa1\xb1\xbf5\xe7\xe2=\x1d\xf5\xf6\x95\xc6\x13D\r\ +\xda\x9c\x9d\xc2\xbf\xabA@\xd14D?\xe0\x907~\xcf\xee\x93\xbb\xb9\xfd\t\xc0m\ +\xf6n+>\x89\xa1Tw\xa1F\x7f`]\xf5>\xde\x9a\xa0\xadk\x04\x0bq\xb3\x8ay\xd0\x8a\ +K!;^\x14\xc8\x92o\xd7\xb2J\x17\xae`\x8e\xb7\xb2\xe8,SW,\xeb\xf3Q\x91\x1aI\ +\xfbB%\xb7\xd8\x89\x07H\x95?/(\xe2\x02\x17Ee\n\xc1\xab\x9f\xe2\x1bh\x9f\x8eI\ +\xe3\xa5\xbdb\xfdL?JQ\xe8e\x8a\xe1\x1c\x8e\xd0xB\xcf=J\xa1]\x0e\x9fK\x08k\ +\xc10\x08\x12;\xb7\x91\xe9\xb2\x04v#\x13\x1aK\x07g\xae~_G,\x90|.\xc6\xfda\ +\x9b\x0f\xe0*KI\xf4\xd8\xf0\xa7p:H\xd9~2\'\xf3X\x9f/\x14\'d!I1\n\x14\xe7\xd7\ +\x7fK\x1f[~\xeeAZ \x8fA\xbc\xb4,f\x1d\xa6\x94\xb7\xe9\xf4\x04U\x88\x1e\xc6\ +\x8b\xd6K\x15\x997\xe0\xd4\xd0\\\xbb4\x82\xc3\x88\xd2GYlY;\x99\xa36\xfa\x0b\ +\xbd\x16\x08\x00\x8a\xf6xjb\xbbB\xce\xa8\xe1\x9d\xc4\xbf_\xd6\x11\x82\xe5M"\ +\xf2\xb8\xc5\xd6T\xaf\x80\xec\xde\xbcM\xc8\xd1\xe5\x0f\x0e\xcc\n\xe7\x04N\ +\xebp\x1e\xc8\x075c\x1d-O\x04#L%S3U\xb8\x93S\xe9\xd4\xa6?V\'4\x1fE\xa5gDPU \ +\x07\xf2u\xdc\x08\x8b\xabR!\xd7\x93\x01 \xf0p\xa639=\xf7Y\xa1B\x96\x94\xa9\ +\xfe\xda(\xc3\xf9\xb7\xad\xad\xc18\x81\x1b\x07\xe8\x01\x89t\xc4A=\xe2\x1a\ +\xf3\'L(\xa4\xbeo!\xac\x10N\xb1\x94\xff6\x84\xfd\x1c\xfc\xbc\xd0\x98\xdc\x9f\ +dJ\xccY\xf5I#C3\xda\xaf\x8eX~\xdb\x08\x8a\xb9Ct\xae\xd4\x9d\xeec\xb6v\x94\ +\xd4\xb4aP\x870\xe2\xd3\x8fT1\xa7"\x02\x8d\xde\xd0\x9e\xbc\xf7.\x81VU\x95\ +\x8a\x9f\xa7\xca\x06\x9a\x9a\x17\x05\x889/\x910SyR\xc50<\xd2#\xb7\xfd^[\xce\ +\x9b\x1d\'&\xc62h\xc1s\xa2\x97oq1:na\x15\x1d\x96?\x19\xd0K+\xe7S\x9e]M3p\x88\ +eK\xc0\xeb.\xfb\xb8\xf9\xfaHJ\xf1\xf1\xc5\x06t\xd9\x7f\x89\xd9\xf6&t\xc7\xaf\ +y4\xa8\xebW~^\xef\xb2\x96t\xfe\x00\x18{_$\x7f\xf1\x16<\n@dk\xf4\xb8\xff1\xff\ +\xb8\xab6\xe0\xad&7\x9b\xd9\xb5/\x13\xe5\xbe|+\xfd\xd0\xab\xc4SJ\xa8\xd0\x18\ +\xbb\xae\x9cjo\xa7\xb7\\\x10]@\x88\xb0uV\x9b\x1d\x97\xe10\xff\xde\x95\xae\ +\x17h3TQ\xf4y\xea\xf4U\x1d\xe9\x02H\xb6$\x93\x9f\xe9\x97\x91\x9fZ\xca\xf0\ +\xc7`\xbd\xab\xdd\xfd\xd7\xe6~\xf9C$:\xf5$\x15\x96Z\x93)k\x1f0\xd40\xf82\x0c\ +\xb7\'+\x07!\x81\x91\xae\xdbh\xbf\x96(\xff\xab\x0c[\x0e\xb8r\xa3\xff\xf5\xe0\ +\x95\xc3cZ\xcc\xc9\xc8\x1b\xf4\x82\xec\\\xd7\\\xbd\xb7\x99k\x97GK\xdb\x94\ +\x1c\x1f\xf75\xbb[\x9eD@\xb9\x0f\x0b]\x1b\xfc\x12\x7f\x8b\xe3\xea\xf8\xc7O\ +\xa9\xe7\xcb\xe1\xe8\xb6f\x8f\xec\xbd\xd4N\x9f\xb5\xa6\x9c})\x9aM\xc2\xcd\ +\xa1\x89\x11z\x10\x8e\xd2\xe4\xc4\xf1e\x9b\x9f\x05\x8b>\xff\xe6\x13\xad8\xd1\ +\xcfgx\xaef\x93\x13\xa5\x95\x89\xd5\xc7\x85iI\x1d\x7f\x010B\xf8\xfc\x92\x85w\ +;\xb8\xe1\xf6p\xf4\x1a)\xf6U\x1a\xec\x93=.CO\xc4\xc9c\xde\x97\x0b\x12\x10\ +\xe7\xb8\xfc\xce\x98L\xbaL\xa0\xf9\x15\xca\x8b\xc6\xbd4\xc9\xddh\xff\xfc\xbc\ +\xdaRk\xbb\xee\xf7e\x19{\x86->\xdfI<\x9e\xbb\xee\xdb\x1e\xd6\'a\x08L\x89Y\ +\x9e\xf0\xcd\xabo\xc0\xf7G\xf6=\x88\r\x0e^\xdc\xec\x82\xc2a\x08\xcc\xe5\xe6\ +\x99\xbe\x14\x9eP\xce\xe6\xd4\x88\xe9>\xfd\xf7\x06\xa0\x95\xe0\xf2\xce\xb9\ +\x1a\xbd\xda(\x95k\x8bw\xb49D\x01\xa8\x07u\\T\xdcAp)Z\xc8\x04*\x19\xba^\xf4\ +\x8d\x8a\xc0s\x85p\xc4\x80\x85\xcd\xb5\xe9E\xc5\x02\xe3\xa8.\xaf\x95;\xbf\ +\x9a\xe5q\x14\x7f"\xa55\x15[\xf3\\|\xbdy\xf9a"c\x04\x99\x8f\xce\x1c\x8c\xbe\ +\xa1]\x9c<\xb6~|$\x05(\x82\xf1\xabv1y\xf4\x1cW\xb3\xd8\xf2\x85(9\x10H*IAV\ +\xa6e\x10\x9f1\xed~\xf3kK\xa8EN\xa0h\xbd\x1f~\xde\xb4F\xc7\xbb\xf6\x81Dr\x00\ +\x99d\x1c\xedD\x1c\x08\xb2\x90\xdc%]a\x0fcuN{hz\xce\xbc\xce\x8f\xe7\xb4K-\ +\x9c\x8e\xb2\xd0\xfd\x147\xc6\\H\xd8,\x18~\xb6\x87\x08\x19\xe8\x13\x87\x8b\ +\xe7\xc5T\xe1\xbb\x80\xd7F<\xa5\x95t\xa1\xf9\xe3[?D\xe6\xd5\x9c{\x8b\xb3\x1d\ +\xe9>\xd9y:E;\x92\xad:2?z\xe4\x97K\x8c\x1b\xf3HQ\x86\x8d\xeb\xb3\xa9\xaf\xd9\ +2\xf0\x1d\x84\'\x1b\xa0{\xed\xf6\x88\x85\xf4\xd9wbC\x95L\xfdY\xe5\x0fA\xf9\ +\xf3\x1f\xc3\xa5o\xc1\xc6\xef?V\xda?\xcb\xd3l\x7fj\xcd\x04\x9c1d\xd6vo\xd3\ +\x98X\x1d\xe2\x1e\x1d\x1f\x08r\xa6J\xc6\xdc\x12\x14\xe2\xc3/\xa7\xb9:?\xd8\ +\xd0\xfcm\xdf\xd3\x84\xd7y\t\x86Z\xc0\x0b\xee\xe5\x10>\x85\xa4\xe6d\xee2\x1d\ +\xc3\x1d\x94a3\xbf\xbe\xd6W\xc2\x10\xae\x13\xdb{\x99\xa5\x8bf\xc6\x932E\xe47\ +\x92\xec\xab!\xa8\x92\xbfAv\x8a\x0e\xa7\x86\x1e\x8a\xad\xca\xd9\x14H\x94\xd9\ +\xe1\xc4F\xb7\xb5r\xeao:\xdc\x19Q\xdb\xd9\xbbd\x900\x93gg\x87\x15\xd6#P2\xf0\ +9M]\xd6o5d/\xcf\xc1\xbaNH\xe1\xff\xbc4\xf0M\x1a\xcc\xeag-D\xeb(#S\x97\xba\ +\x00\xbb\xc5\x0f\xa4\\\x9c*\xda\xbd\xbd\xd1xyjh\xc4\xd8j)\x1e\xd0l}\x81\xcfp\ +\x14\x99u\xc7\x93\xb0\x15\'e\xd8\xa4~D\xbb\x1b\x0fN\xd1\xfc\xb4\xbdc\x15\x1d\ +|@*\r\xe6N\xc1\x89V\xf8\xce\xd0\x96d\xc02$\x89\xb0\xd6\x16\x04u\xd0\xf0w\x92\ +U\x19/\x06\xb4\x99\xe1\xd1\xd8\xac\x83\xeas\x91\xb3\x85\x17\x8cO\xea\xe9\xe2\ +\xdd<\x10\x8c"\x13C\tT7=\xd0Yp\xacC\x04\xd8\x10\x0b\xeb\xb4\x1dL\x0b\xdc~ a\ +\xa5\xb4\xbdw\xba\xb2\x99\x1b\xf4\x9f\x04\x9b\xe9|uL\xbb\xa94\xfd"`\x16|\xba\ +b\xd5\xfa4\xb7\xa8\xe3\xc6w\xd8{7\x98$\xfa\xf0\xfb\xbb\xade\xdf`\xee\xf3\xe3\x0f\xde\x9a\ +:^\xcb\xd5\xa9\xe7\xd7\x91oWc\xb5\x0e\x02\x95tL\xd9\xfb\xd8p\xadnC\xde\xa0\ +\xf1\xabX\xef"VQ\x08\xdbd\xed\x14&C\x8b\xdf\xc5\xe5\x168<`\xecs\x96\xe2\x14\ +\xcf\x8d\xf8[\x10)\x95\x935\xa5\x99\xb3=\xec\x8dN\xbe\xca\\1\xb3\xaa;\x9a\ +\x8f\xe7A,\xcd\xcf\xdfp\xf3\xee\xf3\xb2R\xc68\xda\xbf\xca3\x18_xd\xfbd]\x01b\ +\xb8?Byl\xf9\xef{\xd4Y|\xc96\x07\xb0F6\x12\xe3-\xcc4\xa2\x08P\xdf\xe6j\xcct\ +\x84\xba\x1a?\xbe%.\x12\xf9n\xfc#\xd5\x94W\x1f\xc5\x96\xf8=\x03\x80BIS\xfeZ\ +\x02\x1e}\xc87s\xce0Ri^=\xbfS\x10n\xf9\x9e?\x93pDA\x03\xc8\xda\xf7Fo\x1dX\ +\xefv\x1ekL|\xdaI|w\x86\x0cl>\x9c0\xaf\xb6\xb7/\xfad\xfdnBW\xbf\xf43\xa3G(e]\ +u\x94h\xf5\xe5\xd2=\x10\xa6z\x04\xa8L\xd5\x9e\x06\x05\xdd \xd1\x1d\xde\xdaR/\ +\x84\xda\x04\xb2\xe6$\xfe\x94Fi\xfa,q\nfCYf\xb0\x19)\xb3\xfb#M\xbe$\x8eTI\x03c\xf4?V\xfa\\\xc5%Y\xaf\ +\xe3]HD\xb4\xca\x97\xde!0\x84\xc0\xa7O\x85\xc5\xd5rS\xf6<\x8a\xcb\xfd\x9a\ +\xef\xf6h\xe2O\xbb\xbb6n\xb3\xbf\x0c\xe6\x17r\xfb\xe0M"\xe8\xd7\x8b\x175B\ +\x180\x06i\xcc\x89\xc8\xcb\xdc)\xe4\xfej\xf9 |\x12\x82\xbb\xb1\x92\xfa93\xb3\ +\xb8l\x07\xab\x95\xce\xa4\xee\x8es\xd3\x9b\x14\x87\xac\xe2x\xb5\xc3\x0cd\xe9\ +]\x08SS\xa4,W\xf1\\Y\xbez\x9b\xf4\x11\xde"\xb0\x8a\x1f\xf6\xc2\xe7\xdc\xe4KD\ +\xf8H\xe2\xb9\xb0\xed\xfexL\xfa\xec\x9d\x083t\xd6\x8a\x12\xd4\x1b\x7ft\xadA/\ +\xfc\x06\xebz\xdf\xd9d\xb6%\xb8\xe9\x19\x06l\xd1\xa0\xea\x0f\x02+\xf9\xa7&N\ +\xf5L\x86u}UN\xfa\xfds\xfdm)fY\xd1\xb5=vwI\x02\xe4\xe7Iz\xfc\x85\xceK\x03a\ +\x12\x8b*[\xa4\xc8\xd5\x08\x8ay\xf3\x7f\xd9\x0c\xda\xa84\xaa\xa9\xb4{\x1b\ +\xfa\xd8:;\xb5\xc3\x94\xf3YD\x8e\xc40\xa5\xe5\x8e_\xa4\x83-~\xb8\xee\xb7~\ +\xf2\xf6:I\x8dsyl\x0e\x94+=B\xf6\x9bn>\xda\xda\x98s\x8eA\xaf\xb3_\x90G\xc6\ +\x89\xb3`\xcfq\xffNuJ\x85\x83\xa9\x0e\x7fr\xba\xfeP\xa9H\xba:\xff"\xe1\x8a\ +\x82\xb7\x1e+\xb0\xfb\xe0\xbeW\xe7\x84\xa9\x89\x84\'>\xaa}g\xae\xa6\x99\xe4\ +\x7f\xb2Po\xe7\xe71-\\z\x1c\xb0]p8\x1d*$\xa5\xd7\xa0R\x07g\xa5\xb2\xab\xb5\ +\xb5Y\x9c)\xb4\x96}\xa9\x19\x14\x1eJ\xbc2\xdb^^\xef*\xe5\xe3"\x7f\xf8n\xea\ +\xfa\xfay\x1f\x9dV$\x86Jz\xb9>\xb7\x94P\xc6\x0c\xde\xea0\x9d\xc5\x12\x9b\xde\ +\x16\x88\xca8\xb4\x83\xf2\x0f\x90\x88\xdf/\xe2\xe4\xfa\xd9yr{\xe2\xc2\x85\ +\xcdb+\xbc\xed\xb46\x9f)\xd4\xd2\xe6\xb2W"N\xc7\xe6j\n\x04\xaaaK\xa2q\x86\ +\xa2\x8b\x14\xda\xd8]\xbc\xef`\xb2\xf8~\\\x1e-\xd9\xf1a\xa5\xda\\6\xcd\xe6z|\ +\x05\xba\xe9\xf24V|\xcf\xf7\xc8\x87\xfeH\x1eq\xd4\xc4\x9f&\xf7_Y[{A\xdb\xf2{\ +\xfc,m\xe9\xa9D\xa4G\x8f\x8c\xfa\xb5\x1e0u\xc8\xa6\xb8\'\xb5H\x9e,\x14l:\xac\ +\x03\x8b\x87+\xb3\x9dOc\xf0\xba\xb3\xa7C\x8b\x85bD\x17\x897\x11$\xfbc\xbe\ +\xd9v<\xe0!3naQC\x81\x80g"\xd0\n \xaeOX\x98s\x0fC\xa4\xd5\x8d8(&B\x9b<}\xf92\ +\x06\xce\xdeJg\xbb\xbc\xe0\x90\xeaj\xffxFZG\xfb268r\x04 \xcch\xf0w\x97\xdb\ +\xfe4Y\xa4\x0cB\xdc\xb8,d@s\x13\xcel$\x01\x80\xd29.\xc5\x9dt\x84\xb4\xf7B\ +\xc3\xb89T\xb9-\x06E\xb90\x8d\xec\xef\xf1\xc8\xf4\x86\xddl\xf8\xee\xedtP\xff\ +m\xcdw\xafO`\x91\xf1\xb6\xf8:\xa8\x03\xe5m\x0e$0\xe1,4\xb7\x1e\xff;gh\xceU\ +\xf0\xe5f\x94\x92\x04%\xd1\x1d;\xbb\x08\xad(\x95\xb6\x11\x08\xc7\xb3\xe04\ +\xcc\xbb>\xa4Q\x0b\xd1^rK\x19R\x9d\xa7\xd8\xc2\x8f\xf6\xd8\x83\xc7\xa0\xf2\n\ +e\t\x05\xd1\xe7\xf8_\x90\x86\xee\x93\xff\x084\xdd6\xb2ra\xd9\x89\xabF\xdeG\ +\xe1\x08A\xcf\xf6[CaK\xba\x08\xc7p8\xc4\x13\xceL\xa4Q\xe4\xe8\xb0z\xcd\x17w\ +\xd2\x9e\x06\xc7\xa7\xeb\xab\x1b\xedp\t4IVy<\xd4ya\xc0\x1fK\xd15\x99\xc2N\ +\x13\xfc\xe6\xd1\x1e\xad\x9dmsS\xe5.\x16\xabk-,>n0)\xb9\xed.;fw`y\x87)\xd1!\ +\xec\xf4B6\xe1,\xda\x1a\x98\x12\xa9\x93\xd3\x0b\x83f\xd0S\x90\xb2\xdd\xea\ +\x9c+\xe5\x02n\x89\xd1XQh\x04\xc5i\t7\x1a\x1aFi\xe5\xb0\x9d\x9d\xf5VWea;\x8b\ +\xf9i\xb4\xdc\xf3\xe0\x1dx\xeb\xf65\xc3\xc9<\xe6\xa7;\x9b\xb9*\xfd!\x8f\x17\ +\'\xa7\xc8\xc6\xda\xdaM\'i\x8d\x9f\xa5\xb2\x97\xb2\x1d\xd8_(y\x82\xa3\x08uw\ +\xb0,8\x81\xbd\xad\xfc\xb5D8\xdd\xef?\xb5\xa9\xd7RpM\xb8\xabt8\x82\x9a\x16nq\ +<\xaa\xcf\xd9\x9b\xa2\xef,\xe2\x84X\x9c\xd7\x95IA\x107/\x96\x9e\xea\xed\x9d3\ +j^\xf4\xbb\x8d]\xfe\xcf\x9aA&@b\x07\x80\xe1\xc0\xb3\x01\xe5lN\x0f\x18\xfecN\ +\xed_\x87\x83\x1b[>\xc3\xd69\x95r\x04\x10e\xe4G\xed\xa8\xae\x82\xf3\xae\xa6\ +\'\x9b&\x0c\xa8\x0f\xbf)\x17\xb4\x8dU\x8a!-\xca\xb2\x16\xe6\xeeK\x90\xa8\xbd\ +\xeb\xba\xda\xa8\x98Q\x8d\xe9q\x1a\xdb\x0b`CCwSA8D\xc6\xa9\x07\xb1x\xa6vGs\ +\x1f\xc4\x0cO\xae\x9f\xb7\xf6OQ\xc3\x0feQ]c\xb472\x15\xc6\xbf\xf7\xcc\n\xad\ +\xa7I\xd7\x9d\xb5\xc7\xaf\xcf\x06t\x17\x04\xf03\x05\x03\x0c\x95\xd2\xd3\xfb\ +\x1e\xb6\xc97\xeb@\xcb\xcb\xc02\x99l>\x07\x05\xe0 \xed\xac5\xc6G\xe4\xd4{\ +\x87l\xeeT&C)\x12\x07\x9eb\xb4\xd5\x7f\xf3`\xffV\x8f\xcb\xfc\xfbSaF\x15\x869\ +Y\x04\x89G\xc1F\xf0\xba?\xb6Kob\xc5\xaa\x0c\x02\xdbV\n\xbet\x83\xcb\xca\x93h\ +\xab\xce]w\xcf\xac\xc7\xb2\x11\x16\x80\xc8b\xcf\xf3\xd5\x9a\xfb\xf4\xf0\xf8u\ +}f7I ;\xfd\x9cw\x8d\xa0;m\xa8\x10A\t\x93X\xe5\x85\xb8\xde\\y\xf7R\xfd\xc6\ +\xdd\xe1m(\xaf3\xbc\xd9\xbfA\x9d\x8f\x91\x83\x80\xf9\xeb\xf4\x84\xd6s\xea\ +\xf9\xdb|\xe6\xd9\xd1\x04Q\xf3q_j[\x05"H\x8d\x87^\'\x10\x12A;\\\x99\x12\xf0H\ +z\xe9\xe1\xf8\xf2\xb3\xd8\xb4\x05\x99\x0e\xf1\xc1\x10\xc6_\xeb\xb2g>b2G\xc8s\ +\xaa\xaa^\x82\x80^\x05\x85\x92\x99\xc4\xa0\xde\xe9k\xc7\x163F\x12\x96\x0b\ +\xa2\x03!\x1b\xad \x0b\xd9XA\xad\x0c*\xa4nu^z:\x9b\x8b\x00\xbe\x81\xc7\x8f\ +\xe3L6\x15$b5\x11\xcd6\x1a\xc6\xce\xe5Z_gv\xb7c\x88\xc7\xe7\xd4\xde\xe6\xd9\ +\x8a\x89\xad\x11M\xd8\xf5\'\xde\xac\xdf\xdb\xba\xe6\xf8[\xf2&m\x05\xfd\xf7\ +\x97\x0fS\xd1/\xd4\x80QL\xdd\xd8\x86R\xa7\xf2r\x95\xe4\xd3\x88\xb1\x1d\x97# \ +\x90\xd3\xac\x96y7y\xec\xdc\x94\xba\xe13\xb7\x89\xc6\xeaZ\xf2\x84\x7f,\x10+\ +\xe6\x9cLI\xd7\xa8\xd6<[\xc0\xa6\x9a\xb5\xab?\x1d$\xa9\xbd\x80\x1e\x18\xb3\ +\xc3\x18\xa7\xf5G\x90\xe5L\x84\xba\xc5R%\xf4\x1b]\xb4\xd0\xa1\x14\xe8\xb7\ +\x92x\xe8\x97!\xdfH\x8f`_\xec\x12E\x89@i1\x1d\xfd\x9d9\x19qTnD\x80\x10Y\x8d\ +\xc9\x10N\x90@\xb4>\x0f\xe8\x15\xa6\xa5\xb5\xc5\xed\xe19oS\xed\xf7\xf9u\t[a\ +\x05\n\x01\xaaf\xe8\xa4!\xf4\x04\\\xaf\xb5\x14t\xdc\xafT+\xfc\r1\x87\xea\xbb\ +G\xa7HFq\x1ad:e\x17\xc9\xec\x98h\xaf\x9e\x0f\xcb\xf0\xb4\x06K\x19i\xe5\xa0yJ\ +F\xc4\xdb"#\x12{I8&\xe3-Ny\x17\xe1\x93`T\x85\x98\x90\x08\x06\xf6\xbdj\xfbD\n\ +\xdb\x04\xef\xf6T^\x7f(\x86f\xe8\x1d\xb9\xa7\xc0\xab\x9dE\x03\x06\x18\x06,\ +\x84\tJ\x9d\x00$\xe4\x85\xed\x08\xb0\xbd\xd1D\x00\xbc\x19\xab\x15\xdd)\x90z"\ +\xe0x\x88j/\x18\x0bO\xa2\xde\x97\x10\xff\xee$\xaa\xb0\x80n2,eW)f\xe7F@\x99\ +\xce\x99\xdd\xc2\xc2c\xcb\'\x9d"t\x01\\\x16\xefe\xda\x1a\x9dM}\xdb\x01\x80\ +\x87c\xe4\xe4\xa5(7Xq\xdf)("\xbbPv\x8f\xd2v\x15\xf7(\x1a`\x85\xc3\x87j@\x7f\ +\x8d\xaaA+H\xdf\xdb\x8716\x12\xff\x8eb\x9eW(\x18\xd8w:,^\x1a\xd0\n\xa2w\xfe\ +\x96r\x8a\xe0C\x18\xfd4\xd0\xbd\xce\x80\xa2\xd0\xb8\x82[l\xc6C94\x1a\xad\x89\ +\xc2\xfe\x83\xf6\x02\xe8\x81\xfb\x8d\xea|\x88}\x8cvO\x18\xbb\xfb)+\xee\x7f%,\ +\xd5\xff?\xff\xac\xff?5\xeb\xd5.\x1dr7\xb2\xdfQ\x93\t\n\x91\xf7\xd8#\x9d?\ +\x17\x17\xa9>\xae%\xc8\xe52\xed\x16S\xfd\xa3;\x07\xe0@\x1b\xf7+\x92\xbc\x08\ +\x93V\xc3\xf2{\xab\xea\x03|\xe8\x11.\x9e\x1b\xf8\x98\xf1\xa08\xfc\x1a{\xae\ +\x8diT\x88\x01\xdd4h\r\x9d\x05C|\xffw\x93\xdd\xc9\xc4v\x07\xef\xc6\x15\x951\ +\x18\x95\xa48\xb8\x0b\xac\x07o\xe0WA\xf6\xf5\xb9\xd4\xca\xf9;\xb3\x8eo\xf1\ +\x10=\xf1\xa4\xa8\x10L\x10\xc1\x8b#\x92\x1dhS\x0f\x9f\x0b\xad\xb1\x96qX\xea\ +\xeeM\xc0\x93\x05\x0fIM\x10\x1a^\xc3\xf2&H<\x14\xc5$\xdf|\xd9e\r\xb6\xc7\x18\ +8\x90sG\xb6$g\xed\xd7\xd2t;\xbe\x07\xd7fx\x0c\x9d5py}oW\x12ho#\x86-\x84\x14\ +\x0b\xea\xc5d\xd6\xed\xf3M\x85Mq\xa1\xd0\xd5\xd3?\xbe8\xd9\xa2\xd5\xb7`\xfa\ +\xe7@\xeck\xbf\xf3\xf8;\x88\x86xA\x04g\x8bT\x7f\xc8\x8f.Kr\x95V\xdbZ\x15wR(\ +\xa1\xa0\xbb"\x03.\xef\x1a\x1el.U\xb6s\xf7\xcc\x15$\xe9\x03\xec\xc1\xf2\x17e\ +l*\xe4\x15\x89t\x16,j"\xd3\x13\x8d\x0fq\xb5\xb3\xfb\xbf\xb1\x00SeE\xd9\x1bg\ +\xf3Q\x16onY\xcc1\xd5\x19\x00\xc8\xb6O\xdd4Q\x112\x95v\xf4`\xd1\xf1\xa2g\x03\ +L\xf3\x18\x82(\xacj\xca\xc4\xd4lCK\x985$1\xa9md\xa1\xdf\xbd\x82\xff\xe9)\xc9\ +\x07\xf6\x0e@+O\xc1\x8aLlnB\xd7`\xad\xde\xe1\x8a\x18`\x01Y\xcezG\x86\r\xa8\ +\xffRY\x8e\xcaD\xfd_x\xa1\xc1[}\xdd\xf2\x13\xe9i\xc8\xe8jJ\x0c<\xfd\x03\x02\ +\xdfi\xc6\xa4\x8e~{(\xc4t\xb3\xcf\x81\xca\xf4\xebn\xec/V%\xc5\xa9\x96U\x9d\ +\xa1/\x9e\xf8\xac\xe6T\xe4\xca\x96\xaf\x03\xa4\xb7\xaf\xbf\x06jl\x19\x82\x97\ +\xca8\n/\x8e\xcavg\x91z_>\xcb\t\x06\xee\xf2\xd2\xcbz\x1a\xe4.\xf8\xd9\xc7\ +\x9bS\xd8\xb8<~\xaf}\x87\xca\x17\x17\xbf\xba\xfe\x1b\x9f\xa9\x7fK\xc5@\x90N\ +\xf6\xe5\xab\xe5\xa9\xba\xd7FW\x13|\xc4M\x9bY`S@\xdeM+\x0c\xafR\xcf\xe4\xb9\ +\x87>9\xd6\xafF\xfdM\xc4\xb2\xc7\xf5\xff3\x8cP\xad\x13\x1bNE\x8ag|\x1f\xa0\xae\xf2\ +\xd9as\xb8\xad\xe5\xccs\xb2-\xde\xd5{\xe71Q\xf4\xcc\xaf\x07\xde\xde\xb1\xb8\ +\xf9g8\xe2@\xb9\xfei\x7f\xc9\x93h\xf2\xe9OpS\xe0\xb7 \x94%\xbb1\x14\xd0\x83e\ +<\x8d\x81\xdfU\xff\xba\xedi[\xc1[\x1a?i\x7f\xd7I\xb9\xea.{\xf7\xfd\xd8PJ\xbf\ +\xd1\xc5Z\x19\x04\x10qD\x0c\x1b\x8a\x11\x08\x11\t\xc9\x0cs\tZQ\xf3!\x88\x90\ +\x93&!\xa8/\xc9\xe3\xa8\xd71\xce?\xb0i\x9c%8Q\xe0y\xb7y>\x9b[*\xce\xd4r\xff\ +\xf4\xec.YT2\xd7\xde\x1e~\xa2\xfd &j\xfb\xee\\Pxwi$F\xb1\xf2a\xf2\x8c%\xfb\ +\xef\xf8\xc5YM\xc7M4v\xfb\xb3\x8a\x88\x87\xa8\xed\x81\xe5\xa2d\xe0\xf9\xe5\ +\xb0B\x96\xc0\xe5\xcf\xabOg\xb5\x8eb\xacV$\xbb@\x00=\xae\x97\x04F\\\x10z\xbf\ +\xfd\xee\xc3\xec?\x9b\x0cA4\x08\x9d?^\x0e\x80m\xbd\x14/t\xf8\x9cm\x84\x19Q\ +\xd5\xbe\xe2\xeb~\xfcuB\x8b\x14\xc9&*\x82d\xb6\xf9x*\x1b\xbe\xa9\xf5X\xb1-\ +\x0f\xaf\xa8y\x85\x82\xf2\x0b\xf1v\xed\xe8L\x97r\xe5\xfe\x13\xddd7\x86\x111\ +\xbdt\xecl\x1c\xe77#iJv\x94\x88\xd1\xda\x0f\xba\x98\xf4RI\xe3A\xe0~\xc26xp\ +\xf3\xb1\xfe\xe5\xeb[\xcf\xc6\xc0\xa3\xc3\x9dh\xcb\xcdq\xff\xc2\xab\xd1W\x01\ +7B\x97%\x86\xf7^\x8b\x9b\x03\x06\x9d\xda\xb5\x17\x88\x11a\xda\xe5\x9c\xde\ +\x1dy7\nb\x0b\x1eO\xfaxT\xac!l\x88\xc26\x1d\xcf,!\xef\xd8\x916"\x95\xdb}\xc7\ +\xcf6Y\x1c\x91\x82\x9a\xe0\x99\xa7\xb5\x81\x19b\xc6(`)\x14V\x10Zm\xafp\x12\ +\xa8\xc6\xb1\r\xe6y\xfa\xf4\t\x13A\xd8$F\xe0\xaa?\xd50#\xfb\xe5_\xc0\xf6\x8b\ +\x88\x1c \xccH\x04\xe6?\x8f\xcb[t+:\xf6SJ\x1f3R\xec\xb7F\x8c\x9f\xb2[&\xa9@\ +\xa6\xa3\xcb\tFF\x88Hhv \xe4H\x04D\xd1_\x84 \xfa\xa0:\x99\xf6\x1f\x08\xa2\ +\x16\x95\xf5\x90b\x11dA-\xab=MK\x10}\x1d\xd8\x9d\xcf\x8a\xed\xd3\xb6\xd4\x08\ +M\xd8 q\xa3Lpm\xb3\xff\x1b\x90\xdb\x08\x19B"\xa1\xf8W\x91\x90\x14\xe7^\x90\ +\x05#3r\xdf[xn~\xdbB\xddn\xb4j\xe4\xa2\x9f\xff\xed\xc6\x9c\x87\x80ABn\x8a@\ +\x0c\x99\xae\xa6\xffo8R\x10\x18\xaeh\xa05\xc7|j\xf6\xcd\xfa\xe5g\xafhT\xe6\ +\xebA\x9c\x01\x11k\xb4\xd4\xb3l\x96\xe0w\xd9:0!\x86y\xd1ki\xd0\x101\x9c\x9f\xb0\x85\x9c\xb1\xdf\xc8h \xf0/\xdf\ +\xb7\xc6\xe9\xae\x94iB\x10!N!\xc6(\x05\xaan\x8b\x1f>\xc8\x0et\xf2\xcb#"\x98\ +\xca\xd8z2\x08!\x01T\xa4\x8f\xcf.\x80`\xfd62\xb8\x8f\xd8\\j\x9f\x81\x8a\xd5\ +\x8a\xd7\xfd\xcfz\xcfK.LT\xd2\x9d\xd3\xae\xb7\xd7\x08\x19\x14I\xe0=#\xc2\xb7\ +\x19t5\x98\x88\x84\xd9\x9b2#S\x13<`\xc9\x9a\x16\xac\x06\xa6FD!;\xa3\xe0\xf5>\ +\x8d\rM>\xb2\xc9\xf4\xcb\xa6\xe9q\xb5q\xa8zR-\x99 \xcf\x99\xecY\x9a\xbd\xb7t\ +\x84q\xd0\xbc\xff\xe5\x8dRi1\x8a\xaa\xf7\xdej\xad\xb3\x8e\x14\x074\xc9\xa1\ +\x01j\xfc\x9a\xe8\x85\x89\xf9\xe3\ +\xe5\xcf\xe6\xdb\x83\x9a\xd3t\xde\xca\xb5\xd9\x0b\xcf\xfe\xcc\xe7U\xec9J\xf9\ +\x9e\xe6i\x7f\xdd\xc3HE\x84^\x88\xeaA\xcf\xed\xaeaU\xf7\xc5\xdf\xd9\x92\x89\ +\x03\x17\xefM\xcbv.zO\x0e$\xb3!\x08\x87\xec\xe43U\xd7m\x117\r\xa7`\xc7\xf6\ +\xa9\xd0S\xffFs\xb3\x06h\xe9\xbe\xbf\xadM3\xde0\xbc9\xb7;\xed\x1ej\xeb\x88 \ +\x93\xbb\xbe\xd5\x0e\xdf\xe7\x1aZ\xcaI\x1f\x1b\x1b\xed\xe9jix\x1a#\xe1wy\xbc\ +.\xf1qx\x19\xa3\xcbF\xd6\xd0\xd2\xf2\xba\r\x17\xfar\xd7\x90\xfe\xfe\xbe\xa1\ +\xe4\x19\xd6\x13`|\xf6\xbc6\x11(U\xa3?\xdb\xfc\x14\xa9\xe8\xb6\xc6\x84\xf8+\ +\xd6\xdes}u\xdf\x04\xf5\xed\xc9\xac\xd8\xb3\xaeCkn\xdfGP\xeb\xfa\xb3t@@p\xdf\ +G\xfajR\xe6\xc0d\xd5-\xff`\xc6I\t\x94\x91B\xf0\x8a\x81\xc0\x9f\xa7\x96K\x06#\ +fT\xd9\xb3\x1c!\xef\xc7\xb1OB\x9d\x7f6C\x82\xa9\xaaD\n\x9f|`*do$\xb8JR\x8bsP\ +\x82\xfe\x1b3\xa2\' \xd2\x8e\xfa8\x05j\\\xefy\xdew\xf7\\\xbfN~\nW\xcc\x11hyZ\ +\x0e\xec>\x9b\xd0\x15t[\x8c\x05\xe1}s\xfb;\x06\x13\xa2\\\xef\xb1\x1f\x1d>k\ +\xebx\xbb|\xbf\xb8\xc1\x7fO\xf9\xf2\xd7\xd2\xf0)\xe9b9\xd6\x13Qj\xf3a\xbaF\ +\xf0\xf6\xe7q\x85\xa1\x8f\xd3\x99\x1c\xcbev*B\xc0\xc5<3\xa5$kX\xcf\xf5\xf4\ +\xd9\xd3\xdd\xe2\xe6\x83a\xcf\xe3\x1a\xdd\xa2\x80\xd3&\xb3x\x13\xda\xf9xd*\ +\xbb$a.\xe9\xf3\xb5|UU\x84\xac\xe5\xe4N\xee\xf3\x8d\xa2\x05vW\x17\xf3y\x9d\ +\xee\xdb*\xc3{Q(Qx\\\xb6\xdf\xd5uK \xeb(\xe6I\xd7\xd9\xc2\xb2\xa8\xa3\'\xcf\ +\x89\x1a\xc2\x7f\x84(D\x1e\xf7\xb8\x98a\x15\xa0\x9f^x["\xaaL\x89\xe3\xf1\x11\ +\xaf7Zq\xad\xd8\xf5\xbc\xb9\xc0\xd9&\x88\xc3\xb1\x94\xddp\ts\x08=k\x18\xdd$9\ +o\x80\x042\xc8\x08\xf3.\xdf\x1c\x96 \xe3.\x85\xc2A\xdc\xf0\x8e\xaa \xd9\xa6\ +\xd1=\x0e$\x07F\xc3!A,\xeb\xed\xb5\xe8="\xab\x16\rR\xa5\xdb|\x1a\x9a*q\xb4\ +\xb1\x7f\xda\xdd\xec\xb8\x1dXv\x1d\x0b:x\xa3-\xfa\xd1\xaf\xb4\xe1-\x0eqe\xfb\ +m\xdc\x9f\x1c_\xc7\xfb\xd3\xf8\x03\xc1\x8e>4LAXw\x83\xe5S\x15h\xe8\x80\x9b\ +\xaf\xe4\xd62\x80=\xf9\xe1(%\x9e\xe3{\x10\xf3;\xf0O\xb3\xda+\xf1\x8f\xeci\ +\x02\xd7\x0b\x1b\xa9.\x817\x94\x82\xfe\xa6\xc7\x1fAF*\xb2\xb6d~\x17\xb7\x8b/\ +\xeb\xb7s\x93\x0e\'G\xda\x81\x8c\xe0\xc6\x1a\x83A\xe2\xc7\xd3\xb0\t\xecu\xb8\ +p\xd0l\xc9d\x81\x18!/"\x0fv-zT\xf4X\x90\x12\x886}\xe2\t\x84?>\xa7\x0e\nB\xdd\ +w\n\xb6\xc5\xd3\xecW17Z"\xee(\xaa:\xf8C&\xa4\x10\x9d\xeb\xf5f\xa3u\x05M\xb8D\ +\xcezNr\xa80\xe3\xa0\x0f\x13\x04+&\xab\x9eU\xcc\xf2\x87N]\xbc:u\x05\xb1j\xf0\ +oh\x1b\x191\x82\x96\x88\xa9\x08\xed\x8c\x10\xd1\x88\xc1T\x1b\xce\xc7\xaf\xb9\ +\x9b\x9ag\xd8\xfe#\xd3lA\xf8u\xddc\x86\x91t\x91\x1d\xe8\x17\xcaF\xfb\x8e\xd5\ +\xec\xb7\x7f\x0b\xc9\x10\xdc\x0c\xe3Oe\x0f\t\x08\x87\xedj\x1f\xd2\xb2\xc1\ +\xdb\xa7\xe5\x1c\x1an\x1c\x1dK\x82G\xf8\xb7\xb32!\x7f\xb6\xd9\x86g\r\x14\t\x04\r\xe9\ +\x11A\xb7\x16\xc4^V\xe1\xf6<{\x02\x93>#.2k\x11\x94A\xc4Z\xa5\xfaz\x98_\xd6\ +\x80\x0c\x13\xf3\xf4\x0f\x04\xb8\x96\xc1r\xfc\x87\xda\xfcV\xf4\x94\xf2\xe0\ +\xcaV\n-\xfe\x14\xb4\xde47\xcb\x87\xa1\x996\xd5\x99\xd8\xd4\x1c\xa2w;\x92\ +\x0b\xeb\x97;\x9f6\xf9\xee\xf6\x01JYW\x19{\x03J\x7f\xddk\xa4\x04\xd2C\x1eCA\ +\x81\'I\xe1\xd92P\xe1\x13K\xf5b\x1aq\xb1&H_\xfd-\xcb\xc1^\xef\x86\xde\x9eJ&\ +\x10\x13\x07%}\x1d\xed\x05\x81\x9c\x8e\xaeg\x84h\x0c\xe7\xe3r\x9fF\xf8\x1e\ +\xaaZ\x9a\xba\xd2\x85\x86A\tl \xc4\xd7\x10\x10\x9a\\&\x9d\xa3uI_\x10\xd9\x8a\ +]\x90\n\x06\xe2\x7fW\\z\xee\xaad!\xdf.\x9a\x03\x8a\xd5\x9e\x8a\xc03uj\x16\ +\xa6\x9c\\\xcbv\x8d\xbe\xd2t\xa8Z\x89~\xa0$\x84\x91I\x82\xf37m %\x1f\xab\xaf\ +H\xc6\x95\x06\xfd\xad\xe8\x15`<\x8ej\xd1\x10B\xe5X\x8cU\n\xc2azz\xd2\xc6\xa6\ +K\xe3\xb1\x97\xa9\xae\xa0P\xa2bl\x82T3\x18%!\x88\x06M\xe3\x1dG\\\x97\xebQ\tG\ +:8;\xd2<\x0c\t\x99\x8c\x18\xb3/l\x8f\x1f\x81\xbb\xb9y\xecy\xdf\xde\x87K\t\ +\x8c\x82\xb7BL\xd8\xf0\xf7\xaan\x801|\x03-\x00V\x80\xfd4!\x10\xb3\xacA\x022J\ +\xb8\x1f\xa3ALC\xb0\x8b\xc4M\xc5q\xf0\xd4\x0b\xa7\xca\xe67\x9d\xfa\xc5\x10\ +\xa2\x8e\xea\xb4\xe3\x96\x87|\xbe\xaf\xab\x99<\xd6\x8b\xde;\x82\x10J0\xf9\ +\x8d\xa3\x00\xd4\x8b\xa3\x05\x8b\xe0gl\nA\x92b\x93\xad\xb1ZNw\xc4\'\xf9\x16\ +\xb5\xc8\x952.q\xf5\xa7%X\x8bJ\x936,\xec\xbf\xc6\xcc\xbe\x96\xdd\xbbm\xbb\xe6\x9e\x98\xa0\xba\x86o\x80\xbf\x13\xc3\ +\x1d\xd9\xd3|\xed\xbb{\xb7\xaer\xb5\xc2\xf7\x9a"*"\xc2Q\x89\x86\xde\xaf\xc8 \ +$\xc8}\xc9O\x82\x05>O\x81\x8d4\xc2L\xbe\xde\x90\x0e\xd7\x0b9a|\xff3\x0e\xe1\ +\x880\xc6\x00S\xe9Y\xd6\xee\xd4)\x84!\x83xZ\xdcD\xbe\xdcc\x0c-u\x1c(N\xe5c\ +\x98b\xa6]\xac\x0e\x12\x19\xfa\xda\xde\xc6V|\xe93\x9a\x9b\r\x96FFqd~\xa6D[.s\ +\r\'\x11\x95\xd0\xddF\xc5\xfc\xf0\xf3\xc9\x87\x1e\x13\x9b\xff\xce\xf1A\xf0\ +\xba!\x15+p\xf7\x0bG\x89\x02Q+\xd99\xe3\xab\xcd\xe7\x87\x03\x8b\x9e\xcb3\x9f\ +D\x84\x9fn\x7f\xe6:Pg"g\x0fp\x83\tEF\xc8\x9f.)\x03\xc6\xbcSw;^\xbc\x8c^\xd6\ +\xd8\x92\x1e\xaf\x97\x8b\xb2\x85\xeezz\xd1[\xd6\xd7\xb0N\x1e{J\x97\xdfXN\xbc\ +\\N\xd5mv:\xfbI\'\xed\x13]\ni\x1e\xe0\xc6\xb8{B\x909\r\xbco\xecQP8\xb6\x88^m\ +\x1e\xb5\x1d4O\xda;\xc9?\x9e\x19\xe6\x08>U\xf7\xa1\x83\x9cN\xe7:6\x03\xb7\ +\xa7\xfa\xc9\x16\x00\x1c%\x1d\x02\xd5B\x07\xd2g%\x10\x14\xb2y1\x06\x1b\xdc\ +\x89(\x85\x89:"\xc0\xb4L\xb3=u\x8d\xd7-b\xbe\x9b\x1f\x84\xfa\x8b^n\x87\x0e\ +\xd7\x12\x1d[\xcf\x9e\x8f$\xcf\xee\\A\xcd^,\xa9\x82\x97\xe3o\x0e\\Q\xa4\xc6\ +\x843\x91"\xac\x84\xbf&\xe9\x14^%=\x15?\x08-\xdfp\x07\x15r\xd2 \xedN\xd5\xad\ +\xd7tu\x91\xa5\xbf\x0b\x86\x17\xa7T\xc7\xbb=\xd3\xf9\x1eg\xfb\xe5f#0\x0e\xfe\ +\x07\xf0\xdc\xb3\xd9Kb[\xc8\x15\xdc\xbe\xaa\xc2\xd1\xaa\r`9hN\\8\x17\x1f\xc9\ +O$\x9e\x87#\xdd\x97\xc6\x97q\xd3aE\x99\xa0\xe3\xd3\xa4\'\xec\xaa\x1e\x7fy\ +\xc6\xda\x9d)\xd7\xcb\x93\xb6\xb2\xdc\xee\xe6\xdb"9\xddL\xb7a\xd2\x87*\x97c\ +\xca\x97\xaf\x93\xf2\xf6\x15 #\x80\xf7\x1a\x84\xd4\x14\xb3y;\xa0\xb7\x82k\ +\xee\x07\xe3\x8a\x81\x07\x07-\x1bk\x7f\xab\xaa\xb0\x9b\xd6k\x7f\x83\x1e\xcf\ +\x84\xd2V9\x92\x8f[\xcd\x9b\\&\xed\xbb\xbb}\xf9\x1c\xda\x10\xfa\xeeJ\x9e\x1c\ +\x1fm\xff\x96\xce\xce\xb3\x90\xdcer\x13\x01h|\xc5A\xb6\xc0\xf6_K\xdc\x01]\t\ +\xc72\xf7U\xd0\x10s\xcb\xda\xdd\x03\xe5\xb1\xce\x8b\xa3\x03\x82\x96\t\x95\ +\xb1\xb3\xa6\xc4\t%\xba\xde\x7f\xb7;\xf6v \xa9\x08\xceO:\xa1 \xcc\x94\x99\ +\xf0\x9e"\x8a{\t\xc5\x83E!\x9fEM\x08v\xab\xdb\x9f\xa2\xc3\x89I\xba\xf0\x91(\ +\x83\xfeJ\x1eX\xd2\xe1\x14&~\xd9kP\xef!\x0b\x16\x1f\xf5p\x8c\t]\xf3\xf56^:\ +\xe4\xaf9\xd1\x13\xa7\xd5\xfbBN=\x10"\xbd\xf0\xb4gtV\x92\xac\xa5\x9b\xdc\xf3\ +\xef1\x8b\xdf\xe5j\xe3;65\x08a\xff%\xf5E\xbd3\xc3&\x1a1\xc7%\x01M\xe1\xb1\ +\xe1k\xe5!\xdb\xed\xc3\xd1\xd9e`\xcc\xa6J+&\x048\xadA\xe6\xb1\xe3^\xef\x98M\ +\xb9$\xd6\xe3D\xd2^\xd3\xe8^`\xd2!\n\x87\x89\xaf\xc6`y\x13h^\xe1\x06\x19\xf7\ +i\xac|\xdc\x12+*\xa8\x0cB)\xf8\xe2*\x0c\x1e\xc2\x01-\xe3}\xf7BN\n\x1e\xe4\ +\xc8\x92\x1d`e\xca\xfej\x8a,\x8c"e\x9bV\xe96\xfc\nj\x8d\x7f6YG\xc0,Vp\xb84\ +\x1ad\xec\xfc\x05)\x8a\x0c\xb3\xc8\x860y\x1ad\x1c\x14\x0c\xc2\x93A\xd1#f\xa7\ +\xd1y\x8f\x9c\x80\x93\xf0\x83\xc9\xc6H\x02ci\x04\x936U\x1c)$\x18i\x04\'\x91\ +\r1\xb2\x97\xc8\xaf\x12\x19\t\x9428\x84Q\xfd\xb7\xc8\xb6@\x0b\xf6\x1fw\xa7\ +\xeb_"\xe4\x01\xb2\x9a\x8eh\x82*\xed!\x10\xb1(_\xec\xb8LwsoJoc\xaa\xbe\xc9\ +\xa5\xca\xc5\x04Y=4j\xe0\x071(\x84\x90\xaf\xff7\x0e\xa8\xc8\xa4\x84\xdbN\xe9\ +\x9a\x8fe~\xb0YM/\x99\x89y\x89\x1a\x9f\x98y^\n\xf3\'\xa8\xf2PcR\x89\x9d\x98:\ +\xe8\xb54q\xc68\xf8\x97\xb7\xd1\xe029\x98J\xaa\xd1-zD\xc9\x04\x05?\xbedF\x07\ +\x9f\x11\xceM\xacd\x84\xe9-"1\xac\xa7\xed|\xbe\xd5\x9d\x10\xc36D\x9c?\xe0\ +\xe9#lw\x88\x91VK\xbe.\xb5\xaf7\x8diz\xee`|\xb1\xb7\xdc?\x12\xc3Md\xc8__{P\ +\xac\xee\xd9\xbe\xf0\x88\xc0=S\xaaHd\x14\xc9\xa6{\xa1\xf4\x19\xcc|\x0fJ\xd2a\ +4\xc0~EEP\xe3b"\x1b\x83`\x94g\x16\n6r\x96\xfdEo3\t\x06\x85J\r\x16\x0eB\x17\t\ +uf\x18X\xe2\xce\x03\xe2\xb9\x90\x8e\xfe\x0e\xaa\xae\xbb\x1d\xab9g6\x1c:\x80\ +\x1b\x85e\x87\xcd"\x9a1{Q\x06uQ\x89\x83\x90\x9a\xa9\tdO\x8a\xea\x0bw<\x8a\ +\xbe.*\x1a+\x97\x11\xae\xa2o\x89|\xce\xb3\xc2\xfa\x9e\x93:\xfd\x17\xbc\xc8\ +\xb2q\xcc\xac\xfe\xdd\xebOl\x8f\xff\xc3uM\x1c\xd3I\xdb\xec\xc5\xfd\xab\x8e\ +\xe7\x99\x80\xa7\xec \xe6"\xb4U\xf1\xab\xce\x9d\xca2\xab\xb6i\x07\xcf\x8b\ +\x98b5\xb7\xb3\xd6Z\xe8x\xac\x80\xa0""\x08\x14Y=\xdb\xc6*\xce\xe4\xc0O\x18\ +\xb4L,<=\xda\xcd\xa9\xfaA<*\x08\x93D\x8a\x13M\xcfd\tB-\xc7\xf5\xb3\xebJ\xe5\xc7P\x13\xfc\xd6\xbfVi\x0eL\x8b\ +\x01a\xc6RIj\xcf\xcd&\xe5\x04\xd3\xb2)3\xa1\x0e\xf8Z\xda\x9c\'g\xdc\xc5*eN<\ +\x95\xf42<\xe4)\xe6\xda\x8b7\x89\x89\xb8b\x85\xb97Jl\x99\xe3\xedz\xd5\xe6\ +\xf8\x02||\xbf\x89\xc9HI?\x06\x12\xc4J\x90\x98\xd63\x1d\\\xdd\x07\x07#\xc8N\ +\xbfy\xf3&\xcc\x98\x87\x1c\xcbg\x14\x8d\xc1\x8a\xa1\x96\xda*\xad\xe8\xe8\xc6\ +\x87@\x1c\x01\xa4\x9d\x02\x0b\xecX\xa7@\x0f=\xb4\x14O[t\x07\x19\x99\x99\x99\ +\x91@\x87v/\x96\x97\x97\xfd\x04\r\x9f?&C\nU\xca\x80Ez6s\xa5h\xea\x97\x99B]/\ +\xe9\xf0"\xfb\xfa\xbe\xfadB\xccZi\xbeE\x81\x19\xbfIL\x90\x85\x87\x85\xd1\xd2\ +\xd1\x8d\xbf\xc3\n/\xd0\xd9s\xc1\xe0%\x8d]x3{9{v\xab9[jjjjP\x93Z\n\xbd\xf1y\ +\x9f\x88\x1a\xaa*E\x83w\xe1\xd3\x85o\x12\xc0h\x11\x03f\x0c\x95\xa8\x9f\x86\ +\xba\xb8\xbb\xbb\xc7\xc6\xc7\xbf\xcf//\x8f\xca?l\xa7\x88\x1e\xc4\x8b\x1c\x98\ +\x9aJ(\xb6\xceS\x1a9\xbe\x192a\xd3Nqm\xd3cO\x97+RI\x94\xa2I\x97\x03>\x91\xfe\ +\xf8l\xdf\x9f\x98\x98\xe8\xc5O\x11?\xdc\xbf\xcdJ-x\xbf\x97\xec\xd0\xe2\xeb\ +\xe7\xe7ge5rv\x9byKq\x87hH)"FQZ^>\n\xcd\xcfeI\x95UW\xe7\x98=d\xfe\x00;:\xca\ +\xc8\xceF\xae\xab\xfcX\x9bou\x1e\xb0\xdb\xdb\x0b\x92\x9f\xdf\xb9h\xdd<\xc3F\ +\x02\x07\xf4\xf4\xd4\xd4L\x1e\xdf8\xac6W\xd5\xd4(.\xde\x04\x07\x07\xeb\xb1\ +\x1c\xb8\xb4Q\'J\xf9\xfa>\x00Q\x8dB\xd1\x91\xc0\x03\xff9\xf1\xd8\xb5\xac>\ +\x05\xf4l\x9e\xa5\x9a{\x9b\x99\r\xec^\xb0\x0e\xa1\xa0\xa0P\'FT\x1fC\xcc\xea\ +\xfd\xb6\xc3S\xa2\xe9\xff\x9bmZ;i\xac\xdc\xb9d\xa0\xa6k\xf8\x99\xdf\x8b\x9e\ +\xdf\xf7\x85<$$$].lr\xaa\xb8\xb8XM]\x9e6\xb9\x9e\xe9U\xc8WP\xed*<\x86\xadc\ +\x1d\x0b\xb4\xed\xd4\xda\xd3#\x84\x83\x9av\x90\x021K\xda\xcf\x05myt\xa8\x96\ +\xe1\x7f\xdf\xcf\xef\xc4\xf7ae\x94\xceO\x0e-\xca\xce\xce\xe6\'\xf8\xf4\xfd\ +\xa0\xd6a\x9d\x8fb\xf6QC\xd8\xa8h\xea.\xd99^\xe8\x99\xc7\x9a\xeb\xdfR\xf5L\ +\xbe]\x06\xddC\xfd\xb7\xfc\xa0^\x98[R\x1bq\xf4\xe0\xcf\x81\x0f:\xf1\x1f~\xed\ +]ycHK\xdd\xa4\x07^\xbe\x9a\xcd\x15\xf8\xe4R_S\xf3)]N\xe5?\x18\x0c6L\xe1;F\ +\xde\xb7{\x813\x8f@\x95(u}{\x1bMR\xd0\xfb;\xdf\xd8nO\x83\xda\x9e\x06\xe7\x16\ +H\x01\x15\xce\x14\'s\xee\xe4\xf0\xae\xb3\xfe\xe2g\xf9\xdd\x0bI\t\t)K\x17\x94\ +\xa3v\xa0\x87v.xpi)\xe2\xc3E\xf2\xfc\x04k\x8e\xf9\x8af8c]\x7f\x84\xd4Cu\xe2h\ +\xb3b\xea\x84\xa9~\x96\x97W\x1f\xb7WONL$\x19q2 \x07\x01mu\xb5*LE5\xa6\x16\ +\xfcc\x90\x80\x97$u\xdc"[\x81\xce\xfd\xd4\x0c(4\xad\xb5E\x9aL\x91\x15d\x00\ +\xe66\xc3(\xf6\x9d\xc6z\xb6X\xbeL-\xea:s\xf1x\xdc\xa2\x01\xe6\xa6\x93T\x98\ +\x93\x93S]\xcd"#\xce\xc8\xd2\xa6\x17\xb7\xe3D\x90\n1si#\x07\xb5\xea\xb1|TS\ +\x9f\xb7\xe3\x92\xfd\r\xcc\x88\x18\xf5;\xe9\xa4\xe1\xddw\xefy)\xe2;\xf4XH\ +\x998\xe5W[\x1c)\xcd\xa5\x86j\xb5\x06q\xb5\xbeV\xee-\x1f\xae\xe8\xf7\x04\x98\ +\xa8\xad\xd6\x1b.\x87\x08\x82\xc1\xa9\xd1?\xae\xb9\xaa\xc7\x13|\xeeT\xa7%\ +\x07\xc8UL+\x196i\xdb\xccp\xf7\x13\xc2\xe2M\xe6\xd9\xf5.\\\x1bL\xf8\xfc\xe7\ +\x9d\xcc\x97\x97\x96\xb0\xb5\xa7E\xcb\xf3ES\xbc\xc5K\xf2\'\x98\x84\xf2l\xa4\ +\xad }Y)\x8aJ\xe3\xd3G\xa9=\xa4\xe5\xf7Z\x06\xa1\xc9>\x04\xc8\r\x95Q\xf3\xc9\ +b[\x02;2\xbc\x84\x06\xe6\xa3N\xde\x07\xb2\xb6%\xe5o\xbb\xf99Z%\xccF+V\x84\ +\xc8\xe2F\xb3\x89\xf4\x90\x13\x05\x83Z\xa9\xbb_4\x0f\xdf\xabs\x92\xa6j\x9a\ +\x0c\xee"\xec\xbb\xf2\xcf_6\x1e\x0e\x99\x7f\xd7\x92\xc7U\xe7OW\xba\xb07U\x16\ +\xad\x8d"\x0c\x87\xba\xd5\t#:#\x0b\x94\x93&\xc1\xa1\xe8\xc2\x0ez7\x95\xd8\ +\xea\xd1\xaa\xa7\xa8\x0b\xc2\x9f\xdd!\x1a:}\xc5\x15\xaa1\xd0\xf4w\xe0\x9b\ +\x9f\xc6\xed\x17.\xee\x83\xecJ\xbe\xe7\xc5\x13\xca\x89Q)\xaa\x95\x04o?{i\xec\ +_\xa1\x11\xcco\xd5\x1f(\x13\xf6\x8d\xd1\x11\xda\x98\x05\x88\xeb\xce\xe7\x9f~\ +\x9cHa\xc6&\xd0U\xfc\xf9\xce\xea\xfcTH\xc00OQ}C\xdc\xc2\xd2\xb2\x7f\xbb\x96\ +\x17\xe9\xf7_\xc2\xef\xd9&U)\xde\xf0\xfc\xe3\xd4\xaag\xb9#\xd82a\x93^G\xc4\ +\xa8\x08m\xf2r\x9d\xe9\xab\xb6\xa4\x1f\xa9\x83r\xc3\xfe\xcc\xd8&h\x07\xe8y}\ +\xe8\xcc?d\xba\x9e\xff\x1e\x1f/T\xcdr\x02\xef\xad3$J66\xbe\x00\x85\xca&\xd9\ +\x12\x1e\x18\x1c\x14\xd7N9.\x13\xa1\xc1{\xb7\x89\x1b\xa0\x11\x87T`*\x1c,\x0c\ +\x02\xa9\xa9\xc7\x0e\xefF\xe5\x9b5h_\xea\xc7\r\x9a,\xdbi(\xe3\xab\xab\xf3\ +\xc2\xbd\xc3\x801\x9em$2\xf02vq\xa9W\x18eN\x86\xb8\xb9\xbb\xff\x08W\xbd\xd4b\ +\xe2\x12\x14\xecv?^x~\x0e0\x90\xa1N\\\xaa3\r/:\x8d\xfd\x96Oo1\xc9\x1e\xcd\ +\x0fJ\x18\xb7\x006P}\\PP@\xf0\x81\xc8\x8a\xa6\xd69bxWQ\xe8\x89\xf3\xa5\xccz\ +\x05@\x00\x01\xb20ef\xf5XM~`#h\xa1"\x04\x9b)\x9a_g\x1b\xe5hM\'\xf8\x13\xa5\ +\xac2\xc2"\x0cj<\x17\xab\xf5#\xd2 f#\xb6H\xb8\xafPP\xe8\xbb\x87w\xf3\x12\xac\ +8Ic%p\xa7\x1dZT\xa5X\x89\xfd\xee\xa1\xa9\xde\xb80\xb7\x8cQQ6\xdb\xc5\x88\xf0\ +s\x942\x94\xdc\xc9\xc5\xe5\xe5t\x85\x12oT\x02\xb5\xba\x1fc\xd3c\xc8\xda\xd4\ +\x9a\xb6\xc6\xfd\xac\xfc\x14\x8a\xd4\x89\xa5\xcc*\xf4\xf8\xe5\x0bw7\xdf\xa9\ +\x95\x84H\xdb\x8aI\xd1C\xc3\xc2\xc3\xeb\n\xcb\xcc\xb4\xf7\xff\x16\x0e\xb9E|J\ +]\x8c\xd8ri\x1bY\xac\xa3`\x03\x07\x83<\xa9\xf3\xc6\x08\xc4\xf3B\x1c\x819\x8b\ +\x9b\x8e\x8d\x8b\xf3\xe1\xa7\xa0\x7f\xcb\x12/F\xedf\x12\xa7\x92\x9e\x1d\x0f\ +\xbb\xa3\xf8\xee\xad Y0\xed\'\x18\x1f\xe1\x864\xc9\xe4\x11K\x80\xdbP\xa4T\ +\xc7\xd7\xd5\xd5\x05@q\xb0pP\xdc\xbe\xc9\xcd\x07\xbd$\x12\x96\x9c\xc5\x1f\ +\x99\xddZ\xd6\xa3\xdf\xb9\x15\xda\x1a\x91\xae\xfcM\xdc\xb9|\x9b\xce\xe8\x81@\ +\x86$\xd4\xd5\xcbz2J\xec\xf7N2\x15J\x80!O\x82\x98\xf1\x90+\x94\xcc\xb6\xe9M\ +\xec^\x00\xc8 I\x8d\xdb\xb3I\x89\x89\xd2\xb0|b\x1a/ \x81DLJ*C\x9b\x9c\xa7T\n\ +\xa0\ta\xf42\xfc\x0f@ yy\xef.w4\xd5\x9bzz\x02]\\f\xcen\xc3\xfb\xb7\x81\xa9D\ +\xd98?g}k\x00\xd4\xb7\xbc<\x89\x8c\xe8;\xdf+\xcf\x91\xfc\xab\x8a\x08\x1enn\ +\xc95\xd3\x98D\xc6\xc8\xe5\xfb%\xa8K\xe2\x953\x13!\x06\x12x\xb5\xd9\xfe\xca\ +\x8b?\xab"\xa2\x94\xfe\xf7\xd6\x96\x91\xa2\xe2\xe4\xdc\x1c\xbew\xfaa\xbbBR||\ +\xfc\x1b\xa8\x84\x84\x04\xbe\xf8\xbb\xe5\x88\xba\xbd{\xb4\xa27W\xaa\xaa\xaa\ +\x00h\xc6\x98\xe5pLg\xea\x89n\xef\x94\xad\x0c\x0c 5\xe5\x95\x97744$\'\'/\xdb\ +q\xa5\xcbu\x9f\xff\xc2\xa0\x88\xa7\xa3\x88?p\xe1\xed\xd9\x14\xe2\xe4\x14\x0b\ +\x83.-i\xd1&\x93PP\xd0Z:\\\x82\xb1\xc3\xfb\xe7j\xb1\xc2\xdf\'C\xa4\x92\xcc\ +\x88%\xd8\xd3\xaf\x1f\x9e\x06\xe0&-\xf4\xde\x01W\xd8\x19\x93\x07\x00\xeaO\ +\x1eD\x0f\x9a\x04\xf4\xe4\xc6kl;\xf1P\xc4\xab\x8a\x97;\xeb\xfe4\xe0\x94\x81\ +\xd0\xe2E\xcagri\x83_\xf7Oq\x8e\xc3\xdc.q\x80\x9c\xd5\xd6\xe2`\x85\xb7]\x14\ +\xd0\x03}\xe9\xf5\x17V\x024\x0ff\x7f\x84D\xc1\x9c\xd0\x9a\x037uRh\xba\x14\ +\xcdH\x0cp\x8f\xd9\xd9\xd9\x08b\xf4P\x93:\xe2\x1b\xe2\xcb\xa3\xa5F\xeb7$\xfa\ +\x04U\x9f\xd8=\xdb\xf2\xac\xe2\x92\xa5h:\rj\x06)\nR\xdeE7\x96\x94\x0c\x9b\ +\xb8\xb8"\xb6\x96\x94XZYE\xb0\xefy\x14L\x1e\xc8\xd2\xe0E\x8a}+7b\x89\xab\x7f\ +\xfb\xf6-\xf4\x0f3Q\xc8\xe5\x1e\xbb\x17\x7f\xce\xf4\xb4\xb2\xd8Z\xb7\xff\x97\ +\x0f\xe9YY\x85\x7f\n\xd9X\xf0\xd1\x13\xbb\x84?\xa8\x84\xc5\x0b\xfe-\x9d<\x10\ +\x1d\xd0\xef\xf0\x00\xe6REyB0\x17\xa0\x02\x97\xb2Rc\xe9\xda*\xdd\x96\x14\xb2\ +.\xf2Ns\x91<%Vb\xce\x16\xc5\xc1(T&\xb2\xd7\xb3\xb1,\xa9\xb6\x0e\x0eq\x1cY\ +\x14R\x99\xceU\xbf\n\xf2 9y\x06\x97w\xbb\xf1\x8a\xf2\xf2\xd3\xe6\xaa\x8d\xf6\ +#\x8e\x1d\xec\x92\\\x98!\'\xa2\xfa\x8bD\x84\x84\xf4\t\x8d\xaa\x9fM\xd3\x8e \ +\xc4\xd1b\xd4\x9c\xf9\xef\xf3\xcd\xbf\xe6wu\xad3\xd1P\xaf\xc0=\xe4g\x81\xf2\ +\xfd\xdav\xfa\xf8\x83\xfa\x06\\\xac\xae$v\xed\xd3\xf5\xf0\x07\xee\xfb|\x7f\ +\x004V\xb7\xffCkrc>}a\xfa\xf8\xafL\xfb\x11\x08D\x9a\x05d\xf8\xb5n\x842~\x18\ +\x16\x87\x97C\x93\x0c9YmQTW\x0f\x08\xc6\x99\xe4\xc7A\x9d\xfa\xa6\x1a\x18\x18\ +\xc8\x9e>\xe7\x9e\xbd\xd0\xa2R\xf6=\x9f\x9e\x869\xd6G\x89\xbd\xad\xad\x8b\ +\x95\x9d}\xc7\x89g\xcd\xc1sp\x81#\xe4\x87_\xfd=c\xb476\xf8\xecu\xac\xd9\xfbu\ +\x03\xc4\xe28\x82\xf8a\xeb\xe9$\xc9Yw`F\xb2s\xea\x1a\x1dN\x9dxVVW\xfd\x05)\ +\xd7\x11\xd0\x88|\t2\xe57\xe9r\xfd\xd8)\xfem\xd2\xbca\x19\x90?\xac\xf2\x9acC\ +?x\xdf\x99\x13D\x0f\xde!{\xc4\xb0\x9d\xda\xc4D\x00\xb4\xdf\xd3\xb3y|s\t]\xf0\ +\x7f\xf8s\xff\xf4\xdc\xd6\xd6\x96\x93C\xf1\x8f\x8f\x81\xb1;CRJ\x02\xf0\xce\ +\xe7\x06H\x96e\xc3\xf2\x9f?\x1e\x01\x8e\xd9\xd5\xc7k\xd2\xed~\x8c\xd8\xa0\ +\x85J\xedd\x85\x12\xe6\xd7\x11D\x8ap3\xed\xb8\xe1\xdd\xc6\xd6\xa8\x08\xb1w\ +\xf1\xc3\xbb7>\xd6C\xb6\x13\x80\x96\xb2\x04\xd0\x90\xf6\x03G\xd2\x82\x11\xdc\ +\xe3\x0b\tV\x0c\x9b\xfc\xec\xe1Gy\xd7\xaf1u@\xb1\x14\x80\x97\x9c\x9c\x9a\x9d\ +@\xb4\x9a_9DRN]}\xb4Bi\xc2,\xd8gjD=K\x8b\xa9\xd9v\x91e\xe6]{\xb5d\x81rx\x7f\ +\x1e\xbd\x8c\xa3\xe3\'wAu\xf5u\x07O\xe0\x1d(!\x10@F\xa0\xfb\xdcR\x19\xe4\xf5\ +\xf1\xc5\xd9*\x04\x99\x96\xf3\xdb\xabUS/\xbd\xf8\xf1\x93\x1f\xe8\x0f\xae\xbc\ +\x87\x96.v\x87#\xb1\xe7\xc4\xc7r\xc6\xa7\xad\x00\x82\xad\xab\xabs\xe2\x91\ +\xdby\x8d\x89Y8k\xad\xbfxu\xdfY^\x0e\xec2\x8b\xc2\xd2\xd2\x12\x97\x8d46\xac\ +\x7f\x1b\xd8\xfb\xcc\x9f\x186j!\xcd\x06P-\x10\x00\x9e\xe2,\xa7\xceM\x1e\x8e\ +\xfc,=;D\x0e<\xc5\x01);\xfe\xbbP\xa5\x0b\xe0\x0b\xb0 g\xec\xe4B\xa9\x070\xbd\ +\xbe\n\x8cQ\x97\xd7\xb3\x8a\xaa\x8b\xd8\xa1"_\xe3\x92]kyX\ +\xca\xfd\xb1\xc6\xdaH9\x1b\'\xa7\xee\xa4\x15\x97w5\xd2\x7f\x18\xf3\xeaC\xbf7\ +\xb7\xee\x9e\xe1\x0bg\x86\x10\xe4\x8c7\x9a\xba\xdc\x19\x81\x0b\xbb\xb6\xbe\ +\x109\rt\xb1A/~\x85a\xf3L\xb1\x8f\xc1\xb7\x9fI\'\x87\xa2\x9e\xeawt\xee\xcdo\ +\x8cF\x83\'WBg\xc2n\x08\xcc#\x96\xa5\x7f\xfb\xc5M\xeaU\x8b\x83\xa2\x9d\x03 \ +\x07.\xa8\x13\x86\xabV\xacd\xaf\xfbKGR\xa28\x12H\xf7\x98\x02\xab\x97\xd6\x19\ +-\xc4KD\x7f_\xd5\xa44{\xc0>\x0b\x97H\x8f2\x0cs\xa3\xfc\xc6\x0e\xd5 W\xfd\xdd\ +_\x81F\x85\xb9kK\x06\xd8\xc5\xfbi\xfb\xb8(\x8f2\xedX-\xbeR\xe82^\x03\x8a\xf7\ +\xc8\xe7e\x15\x9f\xa6S\x03\xb6N\xae+\xe6U\xe7\x14w\x86QcOY\xff\n\xde\x8c\xef\ +\x92\x15\xa5F\xa1\x0e\x9d\xcd\xc6\x8cg\xad\xa3\x88\xf7\x99\xbf\xeb\xd7\x16\ +\x16\x08Q\x91,,,(\xfc\xce\xfb,s\xfd=,,\xf6\x0f\xa7\x0b\x0c\xef\x7fk\x9aiw\ +\x03\x02\xea\xd5\xabW\x96\x16\x16\\vK\xb5\xae\x07\x13\xa9\x06>\xd6\x01\x01\ +\xcf\x91t9\t\xe6\xde7G\xf3\xc1\xc2F/\xcfOd\\v?\xd5\xd6\xd7\xd7\xab\xaa\xaa\ +\xda\xab\xcf\x96\x1b,\x03\x02\x02\xec\xecN\xb6\xc3)5\xd4o\x96-s\x91\x83..\ +\x9c\xb5Stuu\xb9\x1d7\x1e\xd7\\\'\xb3\x05|\xb9\xc8\xb1&\'\'===\x03\xe1\xb6\ +\x86\xbeGe%~\x82\x9b\x86\x8f\x83\x86\'\x1b]\x1d55\x8e\xc0\xaa\x80f\x00\x16\ +\xf6\x02\xber\xd3\x7f\xb9\xa9\t|\x02~8m\xa8MAA\x91b\xdeVP`z\xb5?n\xbbX\x1d;h\ +2G\x05H$\xe0\xafe\xbb\x94\xa8\x82\x824\x80\x83\xca\xcb\x03\x1eV7\xf7%[HL#\ +\xc5~\x9d\xdd\x06>\x1d\x1b\xbe\xdcO\x06\x9e\xba\xf1\xa9\x96\xcd=>\xfa\xf1\ +\x90\x17\xc3\x95\x14t\xd4\xd5s\xbd\xf7I\xf8z\xa9\xa4\x93\xaa\x8f\xbfx\x9e\ +\xd2\x1c\xe0\x19$\xaewx\xe6~\xf1t03\xdb\xeb\rF\xbc\xf7\x0b\xb8=]\x17\x15\x15\ +\x8d\xe7\xbf\x8c\xb8\xc3\xf9\xef\x92\x18\x04"\xb0\xf9\xf7\xbf\x00\xd1\x02\ +\x94\xf8F\xbb\xe7\x87\x05\xf1Ige\x93\x07\xefs\x17\xad8e\x0c\xaa\x04s\xe3Y\n\ +\xb7kL\xea\xd2\x8a\xad\xc3\x8c\xf9\xff\x1e\x164\xe2\xfc2L,a\xa2&\r\x03,d\xb3\ +\xdd\xf2\xb7\x08\xc0\x84\x91\xa7\xbe\xee\xa7\xba\xd5.\x99\x05D\xe0\x1f\xf8j\ +\x1b\x06S\xd9w\x18\xcc\xdaE\x1e\x90:{\x87\xe4\xf1\xc3\xb3\xb0k\xe0sH \x11\ +\xae\xa4\xa4$$\x9a\x9b\x18s\xc6\x1c\xbcG\xc1& \x00\xf7\xe8\x00~K\x84\x93::X\ +\xe3\x9b\xb7\x83/\xce\x80\x8f\x1eQj\xad\xc3\x97]\\?\x03sc%.LshY\xf5c\xc3NY\ +\x8b\xf0\xf5\xf19,)\xb6\x06\x92\xb0\x13,\x1f\x18\xb6~2*\x1b\xfb\x06=TJ\xc1\ +\xf9x\xec\x15Blg\xdf\xc5\xc50%\xf7Cg\xd2\x15V\xec1PL?\xbf\xac\xb5O\x87\x04\ +\x9e-d\xe4\xe4kM\xb6D\xeb\xd4_\x17\xc7\x80\xe0\xbf\x93\xe3.Vj\x8bv#\xc3\xdc\ +\xda+*\xa2S\xe4p\x12\xc1\x1f\xa4\xd9_\xa6M8\x19p\xc4\x95\xc9\xb1$\x01\xebT2\ +\x0b\x80\xce1s\xd7\x11\x1c\xfe\xe1eH\x8a\xc6\xe5\xf1\xce\xb9\xdd&H\x86\xa6\ +\xec\xc4\xa3\xa3\xbc\xfc\x9fu\xe4N\x1d\xfd\xcc\xc5e\xd1\xb2\n\xe3$\xf7f\x9d2\ +\xf6\xbc\x1c+L\x03\xb2\xeb\xd0\x92\xb9)\x0b**\x08|\xd4y\xfb{\x13\x88\xd5\x14\ +!\xbe\x7f0\xe8\xa3g;\xba^\xb2\xd5\x1e|\x08H\xab\x9fA\x8b\xdd\xf2\xce\xed\xc3\ +\xf0\xd0\x90\x14"(h\xf0\xad\x87\x9d]\x8c\xa7d\xcff\xee(\xf4\xf0\x07\x00\xcej\ +J\x19\xef\xa1W\xf7\xd3\xd3\xd3ZL\x12\x1b\xa2klQVT\xa3\xf5\xd0\xb5fs\x1dbL\ +\x14\x08>\x12\xc8\xd5\x85\x14\x03Gy\xd1\xbd\x9d.\x8c\x9f\xaco\xee\x0c\x12\ +\x1eq Ag:>\xd1\x84\x14\xde\xcf\xc6\xce.\xa2 \xad\x96\xad\xf6q\xd0\x1f\xec\ +\xad\xb1\xff\xdf\x1a\xda\x12\x93\xdc`[~z\xf0/\xb9\xae\xfd\xe9-u\xf2\x9eME\ +\xac\xb2\xbd\xab\x95\xcd\xcd\xc9\x07\x9c.0(`6\x91\x97\xe0\x9e0S\xc0\x9c\xd2\ +\xf7\xa4\x0e\xd0\x98\x9eY\x00:\xf5l\xd6\xd0G\xad\xc2\x8b\x1d\xaa\xca\xcb\xf3\ +\xe9\xa3\xf2\x01.P\xd1\xf9\x9d\xf5ps\x99\xc5\xc0\x0b\xfaO$\x0f\xc0 \xf4\x92\ +\x9e\xc0\xac\xc9\x03\x88!\x17a\xf4\xbd_7\xc0/\xb6\x19\xcd\xb5\xb5\xbd2\x9a\ +\x9a\xf4QI\n%$\xa6\x85\xfa\x88\xc1\xa0\'l\x10\xc0Kk\x8f\x9c\xf2\x80"\x05h\ +\xa1\x93\x10\xf0\x12\xffs\x0e\x80\x15\x8e\x88[F\xf8\x9d\xc0\xbb\x94&Yz\xa6BL\ +S]\xdd\xd7\xd7\x97@|{\x03\xb2\xffru\xcfO\xf9\x15\xa9\xda\x9bs\xe9\xb9l\xff\ +\xea\xb7\xa17?\x85N;}\xa0\xb94A\xa4\x18\xca\xabW\xd6X\xb4\xd2I\xb30\x1aw\xd2\ +\xf8\xe1\xb7X\xc3\xbf~\x89\x04\x06\xf6T\x1f\x0f\x10\x9e\x82G\xaf\xf6\x04;\ +\xea\xb4bN\t\x7f~\x8b\x18\xdb\x13\x90\xabn1\xa8I}\t6\x03\xf3\xee\xcep\xf4\ +\x98\xf5\x1e\\\xe1\xcaB\xf6h=-/\xa1\x1f\x96G\x90s|\x852_\x16\xf8\x18\x0e\x80\ +\x94\xdfB\xa7o<\x00\x1d\\Xm\x9dE\x1d\x7f\x04\xd8d=\x16\xc9\xf4\x04d\x8cb2z\ +\xe4j{\xbdX\xa1\x1c\xe3\x8d\xc0\x0e3\xce\xab\xc9\xcbF\xaf\x0b\xe9\xc5K\x9ay\ +\x97je\x9f&\xd4\xfd\xf3\xcb\x97c\xc7`\x9bzu\xc6:\x9d\x11\xf6\xdf\x04^\x81y\ +\x17\xdc\xcesX5\r\xbe\x9f\xcb\x0f\xd4M\xed\xb2\xb7\xf7[4\xbf\xae\x0cY|8\xef\ +\x16}\x7f\x10\xdb\xc4\xbd\x907C(T\xf5M\xe7r\xbb\xab\xc7\x84\xc1\xeb"\x9d\xa2\ +\xb2\x91\xd7\x81e\xa5\x1e\xe7\xdbg\xcfU\xdb\xef\xba\xf0\xefr\xe2\xa1\x1al\ +\xe1\xa4[?\xca\xfd\xcf\x85\xb7V\x86~\xcc\xc4\xa6r\xf6o\x14\xc0[b\xf2\x8f\x19\ +\x8a\x14:\xda=\xbe6\xed\x1a\xa6\x04w\xc5|D\xed\x0ctF~\x99\xf1\x12H\x16(\x15\ +\x0b\xe2\xfbb\x15\x9b\xff\x89q\x02\xeaqa\xee\xd4a\xc2\x90\xca\xb9\xf2\xc9\ +\xd6\n\xa7\x15\xc5\xe9\xc7\x9f\xef\xc7\'\x8a\xeex3&\xf6\x06\x84\x1dG\xf1~\ +\x10\xe3\x1d\x17\xcb\xa4\xb3\xec^\xf0"\x97\xc6\xf3\x7f\xc3P\x9b_\xd0\x9bi(C/\ +\x9fki\x97\x9c\xfa\x97Be0\x86\x1e\xa2\x967\x17:**Nu\x13\x06*2\xd2F\xcf\xff\ +\xf3\xd9\xe1\xff\xcf\x97o\xb1/ED|\x0e\xd0\xc0\xf4\x16\xca7a>\xaa\xd41\xd5\ +\xfd)\x11\xb2\x88S\xaf\xcc\xdey\xebgs\xa0\xa4\xf8\x9c\x1a\xd3\x10\x83\x9az24\ +\xcf\xde\x86\xbe\xde\xc1\xc2\x95D\x1eSw\x99k\x81\xeb\x8d\xe4\xda\x18\xa5\xad\ +\x1d@m\x12\xabQ\xb1\x80\x9e:\xcf\x07\x85j\xbc\x89g\xd3x\xfe\xad\xd2d\xb3\x9c\ +\xd2\x02\x81\xca\xd8V\x7f\x96\xfe%:\xf6M\x9d)\x82Z\xedM\x13\xff\xcbJ~\xca\ +\x81\xea\x05\xd9\xfc\x1d\x9f\xdeV\x14\xda\xb1\xf5\xcc\x8a\xf3\xc7\x80\xca({\ +\x93\x00si\x13\xd8\xefeE\xf1\xd6K\xea^\xb3t!i\xbe]\xa9\ +\xed?\xa5\xb2\xbc\xdf\xc9\x99/5<\n\xea\xc7R)\xc6\xbf\x1e\x9buJ>\x12\xb5vb\ +\xa8\x8b}\xfe\xa6&\xa6\xce\xa5#\xf6\xa9FZ\\\x8b\xb4h\xa7\xc2\xa6\x90\x9dH\ +\xbf:\x80\xf9\xbabZ\x92y\x1b\xd8\xda\xaeql\x8b\x12\xec\x8b:\xb9m\xde\x89\xe8\ +\xc2\x82&`\x142X>NV\x99|-/?j\x9f@dt\x19\xca\x8a\xe2\x8e\x86\x8e^\x8e\x00\x12\ +/s<\x85\x0e\xe1\xcd\xd3\x98}\xe6\xb8E2\xc4\x0c0e\xf1v\x84e($,\xbc\x95z*\xc6\ +\x1as^\xd0$\xb5=\xad\xc1\x96\xe8\xe8\xe8\xf2r\r9uy\x14\x8aq\xd6\x18\x9bD[\ +\x8eYB\xacp\xdbN\ruw@=l\xf5\x85tx\x9ey\xf0e\x03\x10\x05\x02\xb4#?\xc5\xa2\ +\xbb@\xb6\x02%\x8f\xd3V\xdc\x97S+{{\xe4 -\xa6?\xbf0>\x8d\xd4\xafMO\x7fE\x06\ +\xdc\xf4\xf0\xaes\xea\xa8y\xcb\xaat\xb1\x16\x13\xd7\xe7\xcf?\xc6-\x08\xc4\ +\x11\x82\x00P\x8c\x8f\x8b\xa3\x10\xf4\xd3R\xc6\xd7_\xbc=Yv\xdd\xea\r\xbe\xbf\ +\xbf\x07,\xce2\xdc#\xbc?Q\x8e\x96\x8e\x96\x16\xa0\x06\xb61\xf4\x89\xee\\\xdc\xbd\x8f\xe7\xc7\x03\xc2\xa57sMr1(+?\ +\xba\xba\xe7rX;ti\x1b\xdb\xe6\x0f\x10\x17WS\xf8H\x914y\xd0\xf3\x08\xfdD\xf9\ +\xc5cl\xf7b\x8e\xe2\x81\x81\xe0&\xa1\xbb\xbb[\x89\xfez\xe4}<(\xa8\xfa\x18\ +\xd8\xe0\x82\xbb\x00a4B\xd0,\x8cI\xf3\xfd\rf\xf1\xbe\xe6\xb2\x9d\xc7p\xdc[\ +\x98\x9b\xcf\xeeP,?`\x89\xcf\xe3\xd4\xaa\xea\xa1\xe0L\xd7j\xabC\xe5\x11UE\ +\x81&@@\tS)\xbd\x9f\x84@ \x079\xbe,\xc9\x10\xfa(\x11w\xce\x16\xb3{/\xcd\x8ez\ +q\\\xdb\xde\xb3[\xb2\xb0`\xc0\xcd\xb1\'JQ\x99p\x92\xbeF\t\xe1\xffVl\r\xd4!\ +\x192\xa5\xd8\xb2ZE\xff\xfb\xd7/p\xe0\xe8{\xc7\x95F4\\\xc0\xe3\xea\xb1,^_s\ +\x9a\xdb\x12\x0f\xf5\xf6\x82pW\x0f\xae\xac3\x86\\\xb1PB\x92\x93\x93\xff\xf9y\ +\xc0\xe4cc#\x81\xf9I\xcd\xf1b%L\xeb\x88\x05R\xfb\xc9\r(J&Z\x00\xbdmd\xf4\x93\ +\x9fTZ\xa5\xee\xd0\xe6Rk\xe3R\xb1Wt,\xd6(@]^-~X4\xb7\xf8\x1d+\xe6{r,\xc7\xcd\ +\xee\xae\x8c^\xc2D?A\xca2\xcf\x8dW(((\xa5\x88V\x19\\||>\x90\x9d\xc3\xed\x9bE\ +\xc3\x92jC\x03B\xe3\xc5j\xfdz&\xc0\xdeQ\xe0a\xa20\x0b\x04\x0b\x1d\xb7\x1bt\ +\xb4\xcav\xcb\xd3\xe0\xcd\x99\xda\x8a\xe9ji\x81@W\xb7\xe5w\xb16D6C\x1f\x96\ +\x9666&\x18S\xc6-\xdc\xf5\xcf`\xb0\xba\x01`\xaf\x00\xbf\xe4\xc0D]\xb0\xc8\ +\xc2p\xd1C\x99.CE\xde)(\xeb/\x02\xaa\xe7u\xff\xb9O\xd7\xa3\xeb\xe5\x08\xa0\ +\x0e\xca\x8f.\xbc\x0e;$\n\x94e9;\xf1\x0bRb/\x17\x1a\xcd\x14\xde+?A5\xcc:Bc\ +\xf7\xf9+\x8a\x9a\xf6T\x13c\xe7w\x0cU\x14\xfe\x9a\xed\xd7h\x90\xa9\xf94M\xff\ +\x0b\xb2\x87\t\xc1\xe6zK\x8c\x9a\x8d\x97\xd7\xbaeu\x16\xc6\x19\xfa\x1d\x03\ +\xa2\xea\xcd\x9f\xe3sY\x89\x9b#EC\x9f\xbcR\x06\xeaM\n\xbc\x9f\xd2\x16\xd2\ +\xb1\x81\xc9\x07mo\x1b\xc7\x0f\xbf\x89\x14\xeb4p\xb4\xb4<\xb8\xbb\xf324\xcc\ +\x15oj\xd7c\x91\x9f\xad_\xae\x1c\x85\x8a\x0c$&\xe2\xf6l\n\xb1\xb3\x03]\xd4f\ +\x107h\xb2\xbb\xbb\x1b)\x06\x06\x81\x83\x83\xf2\xe9\xb7\x9d\xb4R\xa0\x07\xb9\ +\x81\x1bg\xb7\x07.\xbc\xf2\xb3c\xcd\x8407`\xbd\xf8a\x80\xce\xd3;@?\xe9\xa3>\ +\xe8pe\xbe%!\xb9\xf0\xe2\x0f\x16\xa6J\x97\x03\x07\x95\x97\x03\x12\x88_\xe4\ +\xdf\xe9s2\xe0\x94\xa9q]\x8dx\xc8)\xde\xbe\xf5\xbf\x84\xd0\x01\x9agfqQ\xd2\ +\x1a\x01h\x0eDa\x1er\r\xfcP\x0b\xacka\xde\xd2\xf2r\xeb\x95n\xff\x87o}[\xbd\ +\xbd\xc2,\xa9\xb2E*\xff\xdb/^x\xe9\xa5\x98\x7f\xcc\x8e\xa1\xafY$\x8b\x14\x03\ +t(\xd3\xe8w!\xea?\xb7\xb7\x80\xc0\xb0_\xe5*\x99\x85T1\x89\x99\xc5\xc0\xda)P\ +\x91\xacHiG]\x98\x08U\xf1?$C\xc6&&\x86v/\xb4\x98\x8a\xff\x89\x96BQ\t\t\t7}\ +\xee\x16\t\xbe\xec\x89\x83\xab6\xbd\t\xc0\xf9\x93\xc7\x19\xb1\x12\xa3"\xd1{\ +\xb3\x12\x8fA]\xbe3\x8f\xcb\x0f\r\x0f\x1b\x06\xdcC76\x0clZ\x9cx\xf8\xb9\xb8\ +\x08\xd1C\xc1\xc1 h\n\xc4\x0c\xf8J\x9f%\xf5\xdf3\x8at\xf0gy2J\xca\x12\x144$p\ +{\xb5e\x83\xb6\xbazG{;\xdf\x97/0W\xd5\xb6m\'\x1e\x1cT7ww\x04\xc0(\x97\xb4\ +\x9f\xab\xf5\x19999%\xcc\xa8(F\x88Q\xcf\xfd\xba\xf7\x13$\x8d\xfd\x18%B\xb0-\ +\x8f\x04\xf2\xe8\x10\xf8g\xfe6\xec\xb8F\xc5\xc1 \xfd\xc5\xf1\xdcO\xe4X%*e\ +\xffN\xdaU\x00\xf1\xcbB\x14?\xcc\x91>&\x8a-\xb0\xe7\xc6gZ\x97\xb6y\xe6\xd9\ +\xa6G3\x7fr\xc2Db\x05\xe4\x17PO6\xf0\x1b\x9f\xb2\xee\xffy(u}{{U<\x94\xc4\x1b\ +U\x94\xee\xc1\x9eNNB\x82\x16*\x02\x8c.\xe0BIcg\x16\x0b\x1f!Y\xcd~\xb6\xa5\ +\x11\xb2\x97\xee..\x00\xc2\xcc\xf0\xe0c\x853\xc6e\xf8\xf1\x14\xb6d\x14\xbb{x\ +d\x88N\x99%\xbd\xcb\x07t\x7fr\xc8\x86\x82\xa2\xa2+\xdcf\x08\xd0\xeb\xde.x\ +\xa2\x8b7\x97\xb8\x11C\x97b\xd4_\xff\xceV\xd2\xb3\xa7c\xbe.\x02\x9450%\xfbce\ +\xfd\xb8\xad|\xa4\xc4\xc4R4x\xd3Vn\xc7\x0bUj\xf4h\xbdp\xc2(i\xf1\xf3\xed7\ +\xb8!}T\x0cp\xc0D\xfcJ0)I\x0b\xe8\xd9\xccz\xe9\xed\xed\x05\xe6\x9bZ\xc5\x90M\ +\xd6|\x82\x03\x1f=\xd1;\x0b\xf8i$R:\x9aB\tG2D\x89a\xbfx\xc2\x8c}m\xe7g~\x97\ +\xc1\xa7\xcf#{{4-\xec>>>30\xce\xc9q\xa8K\xe2\xdf|\xe7X\x9d\x90n\x17 9\x12\ +\xac\xa2\xca\xf82#U\x85\xf2\x99\\\x89E6@Y\xffx\xf1\xfb\x1d\xf5\xc9.r\x8e\xc3\ +=\xc8\xc2\xfab\xdf\x92\xc6\x8d\x13\xdcz\xf1\xe3\x03\xf5\xb9*\xd9s-\x9a\x9eV>\ +b\xceS\x8a\xe0\x0b\xba\xbfR\xee\xbf\xd4(jW}\x06j\x90\x0cq\xf2\x1d\xa7& x\x1b\ ++\xf1Y\xbe _\x80"\xbe\xfa\x18\x11\x11\x11\xea\xfa\nk\x88X3in\xf6[\x1fU\xbao\ +\'\xf5\xdc\xd6\xbc\x0b\xeb.\xdeCl\xc4\xe1\xed\xc3,\xcc\xed\xdf\xe3\xb2]\xa0E\ +\xef\xfd(F\x17B\xdd\xf4K\x94\x13\xe2\x8d?u\x9e\xff\xea\xed\r2\xb7\x8e{O\x8c\ +\x19\x17\x1bk\xceNB\xea\xf8\xef`\x86\x96\xe7\xd3w\nB"\xa2\xfb\xad\x0c\x88YXx\ +8\x80>L\xb64\xfc?\xf2\xe9\xeb\xb4\x98pP\xd3\xe6CG\xa1\xf9}h\xb8\xd8\x94\x82v\ +\xb8\xfdP\x80fXH\xb7\xa4Cg"\xd2F\xa1V]Q\xc7\x9c\xf4\xe3=\xe6\xda\xc0\x1e\xa1\ +\x9f\xa3\x06M\xf4J\x12A\xf5L\xabp\x8f\x9a\xc5/\xdc\xdc\xa9\x10\xb3\xb1\xfb\ +\xe4\xc8\xaf\xd9\xab*\xb6\xb2\xab*\x1a\x065\x8b\xc77+p\x0fuusm \x9d\x80\xfa\ +\x1dH0O\xcf\x88X\x98/\xc5\x9f\x11\xe2\x0flC\x029\xf1\x90\xb7W\xfbv\x19\xa8\ +\xec\xc2\xe1\xf0N\xed,\x05\xba\xcf\x11\xc6\xc4\x85\xf5CCCc\x974\xc9\x90?\x7f\ +<~\x0f;\xb4\xd4h7\xd0&J)y6\xce\x89(\xe3W\x87\'C\n\xfb\xb7\x7f\xaa\xd1H|\xfc\ +\xb1S_\xa5\xdd\x10&(\xe0\xaf\xa4\xaeNb\x8a\xdfVR\x12\x9e1:\xc3\x18\x16\x16\ +\x06\x0c\x02\xe41\xcf\x9c\xc6\xe6^\xed#\xf4\xc6\x07pU\x9e\x98=\x9b\x93\x04\ +\xad\x9bg\xb9YYY\x99\x99W\x0fO49\xda\x1f\xd9\xd7\xf4XR\x99F\x05\x04\x04\xe6\ +\x8e\xfd\x04\ri\xf0\xb6}Z;\x0f2Gw\xaa\xaa\xacW\xd6\xd6\xc8\x05\x10\x83V\xe1\ +\\\x9a\x85(,}\x12\xbf\xe7\xb6\x9d\xfe\xeb7VW\x7fxx\x80!\xa6\x15A\xa0.\xf5L_\ +\xb2\x158\xa4\x81\xee\x181kB\x95\xbf\x81\x1d\x1f\x03\xd0\xec\x05 \x8c\xbf %\ +\xc8\xcd\xc3\x83\x8f\x1cKA\xdf\x01QNQQ\xf5?+N>\x1e\x1e\xc03!\x04}\x02gr\x14f\ +T\x94\xcb\xa4\x10\x10)\xcer\x02\x81UY\xb9\xce{1\xb4W\xab\xbe\xfa\xe0\n\xe4\ +\xcda\xb9\xde\xdc\xc6&\n\x93\xee\xef\x91\xde\xb3\x15g;\x001\xf5t\xe3m\xd0+ov\ +\xc7\xc7\x00\xa1\xd7$\x9d\x11\xbb\xc3\xf1\xaa\xcf\x80E72\n\xf2*\xb2\xd6\xb9_\ +\x00S\xcb\xcc\x84~2!L#\xcd\xfd\xfb\xdat\xcc\xa1\xe5\x13\x0bK\x06\xf2\x94{6\ +\x9bD\x11\xe6\xeb\xd7\xca\xfe\x15\xcc\xefT\x16\xbf\x9b/\xff\x03\xd3]\x86\xfa\ +Q\xe8o\x8b\x063\xe7\xf4~\xe6\xdc\x9c\xc2\xa6\x81m2D\xb3\xa5\xd9R\xc72\xac\ +\x1aZ\xf3_71\xd5\xc75=\xcf\xed\xda\x16\x14\xe3\x8f\xaevvL\xe9rC\xbb\xce\xa0\ +\xffyZ\xe8\xdb\xb5\x01\xf4;2\x18A\x07\x9d+\x95\x00\x15\x89:\x11\xd54\xa6r\n\ +\x18\xcdF\x06\xc3\xfd&\xce\xd4u\x07\x00#\xe6\x8e\xef\xb8?\xbe\xf0\xed\xd7\ +\x1fj\'\x15\x86\x86\x86^>\xebQl~\x93\xade#\x8dU\xf1\xd1_|\xf8\xfb\xf7\xc4\ +\xc3\x97\x93\xf4-\x05\xc5>\xbc\xa3\xb5\x15 VZ:\xba\xb299\xda\xfe/\xd4\xe3\ +\xd8\xcc\xe0\x8bp\xfb\xd5f\x92\xb0\xaf\x1f#\xd8\x08\x01\xfa\xcc\xc3\x89=\xc4\ +g\xe7\xe4\xe4\x14\x14T\x98\xa5#\xad\x03Q\x91c\xc5\xc7\xc4\xc4\xc4\xc7g\x92%\ +\xd2H\x17\xa9\xc0\xdc2\x8a\x19\x1f\xe1\x000\x8doZINt~\x1a\x16be\x88\x02\x0cT\ +\xd7W\xf5\xf9\xcf\xb6\x0b\tM$\x91b\x11\xabz\'o\xbfx\xfc;@\x00\x1a\xd2\x0eI~\ +\x16$<\xdb\x98\x97\xf7NP\xeed\xb5e\x92\x9f\xf5\xe6\xe6F\xf9\x19\x940y\xa0\ +\xae\x1e+F\xdd\xf9z\xdb\xa4\\IU4R_o\x05\xb0\x973\xfa\xed\xd5\xb6\x19\x7f\xf6\ +\x92\x15\x05\x9f\xaeg\xf7\x8f\x90\xc0\xc10\x18lyY\x9b\x1e.,\x934\x90.\x81\ +\xddI\xc8\x89]\xb2\x06LX\x9d\x1d\xad(\xa9\x1d\xa0\\\xe6\x10P3\xb9\xec\xf3\ +\x131dD\x89\xb5\xcf:\x05`\xc162\x04\x00I\xf9\xfb\xfb\xe3\xa7\xb3\x15[\x93"g\ +\xf8\x16\x1a\x13w"K\xb5)\xe7\x15\xcez\x8d211\x9d\xffU\xf1\x9d\xd1=J\x01\x18\ +\xf0\xbb\x10%Fi\xdeONk7\xbe\xec\xae\xae\xae\xce\x10\xef.\x83\x1cc\xc1\\\xba\ +\xfe\x1c\xd9__\xbb\xbea\xd7\xa8}f\xc1St\xc0*L,\xaa\xa9\x89g\x93\xb8p\xd7\x9f\ +\x84\xba\xf8A\xf3\x87h%\xab\x9e$\xc4\xf8=O\xd7\x1e\x1f\x1fON\xec$%\xc3\x17\ +\x8f\xcdc\xaa\xf4;\xfet?\x9c>L\xc7\x07\x14\x1e\xf3\xdd\xdc\xd0\xe5x}\x93\x12\ +\x8f\xfe\x00\xea}e\x018qD{~\x8a\xb3\xd3\xd3\x05\xf7\xae\x8e\x8e\xcc\xc2\xb6\ +\x97\xe7\x87/||^c\x0b\x0b\x1a:2\xbc^\xe7[\xd3\x05\x92\xaaes\xfb\xe3\x99\x1d\ +\x1d\x1do"\x07\x80u==\xb9\x97\xedz\x9eoj\xca\xb0\x9d\x03f4n\x00\xd1\xa8\xab\ +\xab\x0b@H\xe51\x9f\xb9\xac\xbaS\x9b\xde+,\xf2\xb4\xf4t\xd8\xe9)\x80\x03\xc0\ +\xbe\x1be\xff=\x10\xa6\x8c1q\xd8\xe8\xbcO\xb7\xccI\xcf\xcc\xcc\xcc\xcd\r\xbc\ +\xdb\x0e\xcf\xf5\xdeO\x8f\x8c\x8c\x8c%\xe3\xf6\xf0\xf4lin>j\x17\xe4\xe0\x10\ +\xf5\x89\x94c8R\x01H\xf8\x156EVz\xfa\xbf\x98z\xceC?M\xe9\x8c\x06#\xbe\xa2\ +\x08\xb83\x8e\xda\x9c\x9f\xff0\xcaN\xfd\xb8\x9ac\x8a\x90\xf2>\xdd\xec\t\x84\xaf4\ +]]]UUU\xd1\x84\xac\xc2s\xd2\xd2\xd2rs5\xf1\xcd\x9d\x9d\xa7\x0f\xae\x80\x06\ +\x80\xafw\xa4z*\x89+Sx\xef\xe1\xaaH\xbe}\xfbv\xd10P\x00w\x06\xeeQ\xa2\xc2\ +\x10\xde\xff\x15.Q\x89\x8a\x04\xae\xd3\xb2\x0b\x08\xd8\x80{\x1c\\\xdd7XN\xce\ +\x90b2\x8f\xbc\xe5\xf7J\x90!\'\'_k\xb0\xc4\xfe\x8ei\x01\xba\xdb!\xea!\x8e\ +\x1e\x9c\xc8\x11\xe8\xb0\x9c\xcc\xa9\xab\xabC|\x85\x95\xf5\xc53\x0e\xaf\xda\ +\xa0+#\xf07\xe0\x0cF\xa13\xb0\xeb\xf3s\xd6\xcf\x9f\x8a\x808\xcf\x0e\x0f\x0f\ +\x81\xb8#\xe8\x80B\xd3d2\x8d\x02i\xfb\x19\x0e\x94\xc7\xc4\xc4DD]\xddFz\xe3\ +\x0c\x16\xd4\xf7\xf7\xe6X\xb3\xc6\xe05\x08\x08\x8b\x8c\xcbn+\xd7\xf1`"\xbb\ +\xa1\xa1\xe1\xfa^j+\xfb\x8b\xa7\neA\xcd\x9f\xa6\x1a\xff\xd8\xeb\xda\xc5c\xf8\ +\xe1\xa1\xb0\x98\xab\xbe\xc7\xc9\x12\x9b\x90\x90"\xe2\x9b2\x1cA\x18\xd5\x97\ +\xc3\xde`D\xe0\x06\xfd\xfd\xfd\x9cQ\xb8e\x1eg\x1b\x80\xfe\x05\x8aJDDT\xf6\ +\x05R/W\xd5\x12\xf0\xe4S~\x03\x8c\x91\xbaY@@\x00\xb0z&\xb7c\xb5\x047\xa8\xf4\ +vI\xe1\xfe\xdc\xda\x1bC]\x01{^A\xeb\xfd\xcb\xe8\xeb2\r\xa5lp\x9a\xe9\xfe\xd5\ +=\xb3n\xf3\xde\x15\x00\xb5\xe2\x1c\xbeW\x95\xad\ns\tUaR7R\xb6\\\x0f\xc7c%\ +\x14\xc6G\x90\x85,\xf4\xf2\x93<\xc3z\t\xf7\x00\x86\xd1\x93\xe2\t\x94\xca\x94\ +\xbc"n\x8d\x93\xac\xd41.\x8a\xf8\x8eu\x87#\xcc\xf9\xfa\xf6J\x8b\xc6\x9f\x06\ +\x94q\x97(\xd0\x17\xd1"\x12d5!4m\xe6@\xd7\x9cy\xc1\xbcA\x96\xfa1\xad\xb1\x1a\ +&\x93\xef\x18\x86\xcf\xc9\x07\xac\xbc\xbc\xbc\x9f?\x0f\xa6\x8a\x8e\x87\xb1)\ +\xaa\x180\xc8Jy\x0b\x95\xd27\x7f\xf0\x1e\xf4h6sH\xdfP\x1b;JRc\xaai\x82\xe6\r\ +i\xf6\xd7\xbf\xa1#8V\xa9z\xaa\x80:B\x86\xb3\x02c\x8f\xa6\x107\xdb\xaa\xd2\ +\xde)\x9a\x94\x99\x0e\xe21\xf3f\x8a\x92c\xbd\xa2L\xad0W\xaf\xeb_,\xbbb\xd9\ +\x95\xb2\xf5FH\x99.\nc\xaf\xac\x1a`\xe1\xd5\xd1\x8c\xf1\xd3\xb6)\x9cp\xfa\ +\xb6yV"/\x02\xda\xd2\x8dK\xcd\x84\x98\x0f\x1a6\xfb\x94\xf5\xb0\xd9\xeeub\x16\ +\x98\x92 \x06\xbeF \xcd\x81\xfb\xa6\x0e\x90k\xc5\xa3i\xbc7~\xfa\xa1#HVc<%\ +\x821\x8e3\xf6\xd0\x0c\x06k\xe2\x7f\x8b\x15\x9f\x13z\xae\xda\xbacv\xb2\x17\ +\xad\xadc?2\xf4\xc5\xc1\xb1\xc2G";\x16\x89\xbd\x11@\x08\x96\xf8Z{\xc1~n@X\ +\x83\x8c\xc4\x82\xd67\xe4\xf3\x8e\x98\xde\xa9\xe8\x9d\x83S\'h\x94\xb6\xfcC\ +\xe7\x8a\xe2\xbfK\x0e\x87F\x83j\xd5\x90\xab\xe9\xff\xb7\x8b\xff\xa5B\xf0\x7f\ +\x7f\x0c\xf0\x18hhJ,\xe3\xacr\x9c\x05\x02^\xd2\xe2\nb\xd5"F\xdf\xfe\x17]\xf7\ +x\x8e' ) + +def getBitmap(): + return BitmapFromImage(getImage()) + +def getImage(): + stream = cStringIO.StringIO(getData()) + return ImageFromStream(stream) + +def getIcon(): + icon = EmptyIcon() + icon.CopyFromBitmap(getBitmap()) + return icon + diff --git a/jet_tools/JetCreator/midifile.py b/jet_tools/JetCreator/midifile.py new file mode 100755 index 0000000..63449c0 --- /dev/null +++ b/jet_tools/JetCreator/midifile.py @@ -0,0 +1,1579 @@ +""" + File: + midifile.py + + Contents and purpose: + Utilities used throughout JetCreator + + Copyright (c) 2008 Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import logging +import struct +import copy +import array + +# JET events +JET_EVENT_MARKER = 102 +JET_MARKER_LOOP_END = 0 +JET_EVENT_TRIGGER_CLIP = 103 + +# header definitions +SMF_HEADER_FMT = '>4slHHH' +SMF_RIFF_TAG = 'MThd' + +SMF_TRACK_HEADER_FMT = '>4sl' +SMF_TRACK_RIFF_TAG = 'MTrk' + +# defaults +DEFAULT_PPQN = 120 +DEFAULT_BEATS_PER_MEASURE = 4 +DEFAULT_TIME_FORMAT = '%03d:%02d:%03d' + +# force note-offs to end of list +MAX_SEQ_NUM = 0x7fffffff + +# MIDI messages +NOTE_OFF = 0x80 +NOTE_ON = 0x90 +POLY_KEY_PRESSURE = 0xa0 +CONTROL_CHANGE = 0xb0 +PROGRAM_CHANGE = 0xc0 +CHANNEL_PRESSURE = 0xd0 +PITCH_BEND = 0xe0 + +# System common messages +SYSEX = 0xf0 +MIDI_TIME_CODE = 0xf1 +SONG_POSITION_POINTER = 0xf2 +SONG_SELECT = 0xf3 +RESERVED_F4 = 0xf4 +RESERVED_F5 = 0xf5 +TUNE_REQUEST = 0xf6 +END_SYSEX = 0xf7 + +# System real-time messages +TIMING_CLOCK = 0xf8 +RESERVED_F9 = 0xf9 +START = 0xfa +CONTINUE = 0xfb +STOP = 0xfc +RESERVED_FD = 0xfd +ACTIVE_SENSING = 0xfe +SYSTEM_RESET = 0xff + +ONE_BYTE_MESSAGES = ( + TUNE_REQUEST, + TIMING_CLOCK, + RESERVED_F9, + START, + CONTINUE, + STOP, + RESERVED_FD, + ACTIVE_SENSING, + SYSTEM_RESET) + +THREE_BYTE_MESSAGES = ( + NOTE_OFF, + NOTE_ON, + POLY_KEY_PRESSURE, + CONTROL_CHANGE, + PITCH_BEND) + +MIDI_MESSAGES = ( + NOTE_OFF, + NOTE_ON, + POLY_KEY_PRESSURE, + CONTROL_CHANGE, + CHANNEL_PRESSURE, + PITCH_BEND, + SYSEX) + +# Meta-events +META_EVENT = 0xff +META_EVENT_SEQUENCE_NUMBER = 0x00 +META_EVENT_TEXT_EVENT = 0x01 +META_EVENT_COPYRIGHT_NOTICE = 0x02 +META_EVENT_SEQUENCE_TRACK_NAME = 0x03 +META_EVENT_INSTRUMENT_NAME = 0x04 +META_EVENT_LYRIC = 0x05 +META_EVENT_MARKER = 0x06 +META_EVENT_CUE_POINT = 0x07 +META_EVENT_MIDI_CHANNEL_PREFIX = 0x20 +META_EVENT_END_OF_TRACK = 0x2f +META_EVENT_SET_TEMPO = 0x51 +META_EVENT_SMPTE_OFFSET = 0x54 +META_EVENT_TIME_SIGNATURE = 0x58 +META_EVENT_KEY_SIGNATURE = 0x59 +META_EVENT_SEQUENCER_SPECIFIC = 0x7f + +# recurring error messages +MSG_NOT_SMF_FILE = 'Not an SMF file - aborting parse!' +MSG_INVALID_TRACK_HEADER = 'Track header is invalid' +MSG_TYPE_MISMATCH = 'msg_type does not match event type' + +LARGE_TICK_WARNING = 1000 + +# default control values +CTRL_BANK_SELECT_MSB = 0 +CTRL_MOD_WHEEL = 1 +CTRL_RPN_DATA_MSB = 6 +CTRL_VOLUME = 7 +CTRL_PAN = 10 +CTRL_EXPRESSION = 11 +CTRL_BANK_SELECT_LSB = 32 +CTRL_RPN_DATA_LSB = 38 +CTRL_SUSTAIN = 64 +CTRL_RPN_LSB = 100 +CTRL_RPN_MSB = 101 +CTRL_RESET_CONTROLLERS = 121 + +RPN_PITCH_BEND_SENSITIVITY = 0 +RPN_FINE_TUNING = 1 +RPN_COARSE_TUNING = 2 + +MONITOR_CONTROLLERS = ( + CTRL_BANK_SELECT_MSB, + CTRL_MOD_WHEEL, + CTRL_RPN_DATA_MSB, + CTRL_VOLUME, + CTRL_PAN, + CTRL_EXPRESSION, + CTRL_BANK_SELECT_LSB, + CTRL_RPN_DATA_LSB, + CTRL_SUSTAIN, + CTRL_RPN_LSB, + CTRL_RPN_MSB) + +MONITOR_RPNS = ( + RPN_PITCH_BEND_SENSITIVITY, + RPN_FINE_TUNING, + RPN_COARSE_TUNING) + +RPN_PITCH_BEND_SENSITIVITY = 0 +RPN_FINE_TUNING = 1 +RPN_COARSE_TUNING = 2 + +DEFAULT_CONTROLLER_VALUES = { + CTRL_BANK_SELECT_MSB : 121, + CTRL_MOD_WHEEL : 0, + CTRL_RPN_DATA_MSB : 0, + CTRL_VOLUME : 100, + CTRL_PAN : 64, + CTRL_EXPRESSION : 127, + CTRL_RPN_DATA_LSB : 0, + CTRL_BANK_SELECT_LSB : 0, + CTRL_SUSTAIN : 0, + CTRL_RPN_LSB : 0x7f, + CTRL_RPN_MSB : 0x7f} + +DEFAULT_RPN_VALUES = { + RPN_PITCH_BEND_SENSITIVITY : 0x100, + RPN_FINE_TUNING : 0, + RPN_COARSE_TUNING : 1} + +# initialize logger +midi_file_logger = logging.getLogger('MIDI_file') +midi_file_logger.setLevel(logging.NOTSET) + + +class trackGrid(object): + def __init__ (self, track, channel, name, empty): + self.track = track + self.channel = channel + self.name = name + self.empty = empty + def __str__ (self): + return "['%s', '%s', '%s']" % (self.track, self.channel, self.name) + + +#--------------------------------------------------------------- +# MIDIFileException +#--------------------------------------------------------------- +class MIDIFileException (Exception): + def __init__ (self, stream, msg): + stream.error_loc = stream.tell() + self.stream = stream + self.msg = msg + def __str__ (self): + return '[%d]: %s' % (self.stream.error_loc, self.msg) + +#--------------------------------------------------------------- +# TimeBase +#--------------------------------------------------------------- +class TimeBase (object): + def __init__ (self, ppqn=DEFAULT_PPQN, beats_per_measure=DEFAULT_BEATS_PER_MEASURE): + self.ppqn = ppqn + self.beats_per_measure = beats_per_measure + + def ConvertToTicks (self, measures, beats, ticks): + total_beats = beats + (measures * self.beats_per_measure) + total_ticks = ticks + (total_beats * self.ppqn) + return total_ticks + + def ConvertTicksToMBT (self, ticks): + beats = ticks / self.ppqn + ticks -= beats * self.ppqn + measures = beats / self.beats_per_measure + beats -= measures * self.beats_per_measure + return (measures, beats, ticks) + + def ConvertTicksToStr (self, ticks, format=DEFAULT_TIME_FORMAT): + measures, beats, ticks = self.ConvertTicksToMBT(ticks) + return format % (measures, beats, ticks) + + def ConvertStrTimeToTuple(self, s): + try: + measures, beats, ticks = s.split(':',3) + return (int(measures), int(beats), int(ticks)) + except: + return (0,0,0) + + def ConvertStrTimeToTicks(self, s): + measures, beats, ticks = self.ConvertStrTimeToTuple(s) + return self.ConvertToTicks(measures, beats, ticks) + + def MbtDifference(self, mbt1, mbt2): + t1 = self.ConvertToTicks(mbt1[0], mbt1[1], mbt1[2]) + t2 = self.ConvertToTicks(mbt2[0], mbt2[1], mbt2[2]) + return abs(t1-t2) + + +#--------------------------------------------------------------- +# Helper functions +#--------------------------------------------------------------- +def ReadByte (stream): + try: + return ord(stream.read(1)) + except TypeError: + stream.error_loc = stream.tell() + raise MIDIFileException(stream, 'Unexpected EOF') + +def ReadBytes (stream, length): + bytes = [] + for i in range(length): + bytes.append(ReadByte(stream)) + return bytes + +def ReadVarLenQty (stream): + value = 0 + while 1: + byte = ReadByte(stream) + value = (value << 7) + (byte & 0x7f) + if byte & 0x80 == 0: + return value + +def WriteByte (stream, value): + stream.write(chr(value)) + +def WriteBytes (stream, bytes): + for byte in bytes: + WriteByte(stream, byte) + +def WriteVarLenQty (stream, value): + bytes = [value & 0x7f] + value = value >> 7 + while value > 0: + bytes.append((value & 0x7f) | 0x80) + value = value >> 7 + bytes.reverse() + WriteBytes(stream, bytes) + +#--------------------------------------------------------------- +# EventFilter +#--------------------------------------------------------------- +class EventFilter (object): + pass + +class EventTypeFilter (object): + def __init__ (self, events, exclude=True): + self.events = events + self.exclude = exclude + def Check (self, event): + if event.msg_type in self.events: + return not self.exclude + return self.exclude + +class NoteFilter (EventFilter): + def __init__ (self, notes, exclude=True): + self.notes = notes + self.exclude = exclude + def Check (self, event): + if event.msg_type in (NOTE_ON, NOTE_OFF): + if event.note in self.notes: + return not self.exclude + return self.exclude + +class ChannelFilter (EventFilter): + def __init__ (self, channel, exclude=True): + self.channel = channel + self.exclude = exclude + def Check (self, event): + if event.msg_type in (NOTE_ON, NOTE_OFF, POLY_KEY_PRESSURE, CONTROL_CHANGE, CHANNEL_PRESSURE, PITCH_BEND): + if event.channel in self.channel: + return not self.exclude + return self.exclude + +#--------------------------------------------------------------- +# MIDIEvent +#--------------------------------------------------------------- +class MIDIEvent (object): + """Factory for creating MIDI events from a stream.""" + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + if msg_type == SYSEX: + return SysExEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif msg_type == END_SYSEX: + return SysExContEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif msg_type == META_EVENT: + return MetaEvent.ReadFromStream(stream, seq, ticks, msg_type) + else: + high_nibble = msg_type & 0xf0 + if high_nibble == NOTE_OFF: + return NoteOffEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif high_nibble == NOTE_ON: + return NoteOnEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif high_nibble == POLY_KEY_PRESSURE: + return PolyKeyPressureEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif high_nibble == CONTROL_CHANGE: + return ControlChangeEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif high_nibble == PROGRAM_CHANGE: + return ProgramChangeEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif high_nibble == CHANNEL_PRESSURE: + return ChannelPressureEvent.ReadFromStream(stream, seq, ticks, msg_type) + elif high_nibble == PITCH_BEND: + return PitchBendEvent.ReadFromStream(stream, seq, ticks, msg_type) + else: + stream.Warning('Ignoring unexpected message type 0x%02x' % msg_type) + def WriteTicks (self, stream, track): + WriteVarLenQty(stream, self.ticks - track.ticks) + track.ticks = self.ticks + def WriteRunningStatus (self, stream, track, filters, msg, data1, data2=None): + if not self.CheckFilters(filters): + return + self.WriteTicks(stream, track) + status = msg + self.channel + if track.running_status != status: + WriteByte(stream, status) + track.running_status = status + WriteByte(stream, data1) + if data2 is not None: + WriteByte(stream, data2) + def CheckFilters (self, filters): + if filters is None or not len(filters): + return True + + # never filter meta-events + if (self.msg_type == META_EVENT) and (self.meta_type == META_EVENT_END_OF_TRACK): + return True + + # check all filters + for f in filters: + if not f.Check(self): + return False + return True + + def TimeEventStr (self, timebase): + return '[%s]: %s' % (timebase.ConvertTicksToStr(self.ticks), self.__str__()) + +#--------------------------------------------------------------- +# NoteOffEvent +#--------------------------------------------------------------- +class NoteOffEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, note, velocity): + self.name = 'NoteOff' + self.msg_type = NOTE_OFF + self.seq = seq + self.ticks = ticks + self.channel = channel + self.note = note + self.velocity = velocity + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + ticks = ticks + channel = msg_type & 0x0f + note = ReadByte(stream) + velocity = ReadByte(stream) + if msg_type & 0xf0 != NOTE_OFF: + stream.seek(-2,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + return NoteOffEvent(ticks, seq, channel, note, velocity) + def WriteToStream (self, stream, track, filters=None): + # special case for note-off using zero velocity + if self.velocity > 0: + self.WriteRunningStatus(stream, track, filters, NOTE_ON, self.note, self.velocity) + if track.running_status == (NOTE_OFF + self.channel): + self.WriteRunningStatus(stream, track, filters, NOTE_ON, self.note, self.velocity) + else: + self.WriteRunningStatus(stream, track, filters, NOTE_ON, self.note, 0) + def __str__ (self): + return '%s: ch=%d n=%d v=%d' % (self.name, self.channel, self.note, self.velocity) + +#--------------------------------------------------------------- +# NoteOnEvent +#--------------------------------------------------------------- +class NoteOnEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, note, velocity, note_length, note_off_velocity): + self.name = 'NoteOn' + self.msg_type = NOTE_ON + self.ticks = ticks + self.seq = seq + self.channel = channel + self.note = note + self.velocity = velocity + self.note_length = note_length + self.note_off_velocity = note_off_velocity + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + channel = msg_type & 0x0f + note = ReadByte(stream) + velocity = ReadByte(stream) + if msg_type & 0xf0 != NOTE_ON: + stream.seek(-2,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + if velocity == 0: + return NoteOffEvent(ticks, seq, channel, note, velocity) + return NoteOnEvent(ticks, seq, channel, note, velocity, None, None) + def WriteToStream (self, stream, track, filters=None): + self.WriteRunningStatus(stream, track, filters, NOTE_ON, self.note, self.velocity) + def __str__ (self): + if self.note_length is not None: + return '%s: ch=%d n=%d v=%d l=%d' % (self.name, self.channel, self.note, self.velocity, self.note_length) + else: + return '%s: ch=%d n=%d v=%d' % (self.name, self.channel, self.note, self.velocity) + +#--------------------------------------------------------------- +# PolyKeyPressureEvent +#--------------------------------------------------------------- +class PolyKeyPressureEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, note, value): + self.name = 'PolyKeyPressure' + self.msg_type = POLY_KEY_PRESSURE + self.ticks = ticks + self.seq = seq + self.channel = channel + self.note = note + self.value = value + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + channel = msg_type & 0x0f + note = ReadByte(stream) + value = ReadByte(stream) + if msg_type & 0xf0 != POLY_KEY_PRESSURE: + stream.seek(-2,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + return PolyKeyPressureEvent(ticks, seq, channel, note, value) + def WriteToStream (self, stream, track, filters=None): + self.WriteRunningStatus(stream, track, filters, POLY_KEY_PRESSURE, self.note, self.value) + def __str__ (self): + return '%s: ch=%d n=%d v=%d' % (self.name, self.channel, self.note, self.value) + +#--------------------------------------------------------------- +# ControlChangeEvent +#--------------------------------------------------------------- +class ControlChangeEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, controller, value): + self.name = 'ControlChange' + self.msg_type = CONTROL_CHANGE + self.ticks = ticks + self.seq = seq + self.channel = channel + self.controller = controller + self.value = value + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + channel = msg_type & 0x0f + controller = ReadByte(stream) + value = ReadByte(stream) + if msg_type & 0xf0 != CONTROL_CHANGE: + stream.seek(-2,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + if controller >= 120: + return ChannelModeEvent(ticks, seq, channel, controller, value) + return ControlChangeEvent(ticks, seq, channel, controller, value) + def WriteToStream (self, stream, track, filters=None): + self.WriteRunningStatus(stream, track, filters, CONTROL_CHANGE, self.controller, self.value) + def __str__ (self): + return '%s: ch=%d c=%d v=%d' % (self.name, self.channel, self.controller, self.value) + +#--------------------------------------------------------------- +# ChannelModeEvent +#--------------------------------------------------------------- +class ChannelModeEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, controller, value): + self.name = 'ChannelMode' + self.msg_type = CONTROL_CHANGE + self.ticks = ticks + self.seq = seq + self.channel = channel + self.controller = controller + self.value = value + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + channel = msg_type & 0x0f + controller = ReadByte(stream) + value = ReadByte(stream) + if msg_type & 0xf0 != CONTROL_CHANGE: + stream.seek(-2,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + if controller < 120: + return ControlChangeEvent(ticks, seq, channel, controller, value) + return ChannelModeEvent(ticks, seq, channel, value) + def WriteToStream (self, stream, track, filters=None): + self.WriteRunningStatus(stream, track, filters, CONTROL_CHANGE, self.controller, self.value) + def __str__ (self): + return '%s: ch=%d c=%d v=%d' % (self.name, self.channel, self.controller, self.value) + +#--------------------------------------------------------------- +# ProgramChangeEvent +#--------------------------------------------------------------- +class ProgramChangeEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, program): + self.name = 'ProgramChange' + self.msg_type = PROGRAM_CHANGE + self.ticks = ticks + self.seq = seq + self.channel = channel + self.program = program + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + channel = msg_type & 0x0f + program = ReadByte(stream) + if msg_type & 0xf0 != PROGRAM_CHANGE: + stream.seek(-1,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + return ProgramChangeEvent(ticks, seq, channel, program) + def WriteToStream (self, stream, track, filters=None): + self.WriteRunningStatus(stream, track, filters, PROGRAM_CHANGE, self.program) + def __str__ (self): + return '%s: ch=%d p=%d' % (self.name, self.channel, self.program) + +#--------------------------------------------------------------- +# ChannelPressureEvent +#--------------------------------------------------------------- +class ChannelPressureEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, value): + self.name = 'ChannelPressure' + self.msg_type = CHANNEL_PRESSURE + self.ticks = ticks + self.seq = seq + self.channel = channel + self.value = value + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + channel = msg_type & 0x0f + value = ReadByte(stream) + if msg_type & 0xf0 != CHANNEL_PRESSURE: + stream.seek(-1,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + return ChannelPressureEvent(ticks, seq, channel, value) + def WriteToStream (self, stream, track, filters=None): + self.WriteRunningStatus(stream, track, filters, CHANNEL_PRESSURE, self.value) + def __str__ (self): + return '%s: ch=%d v=%d' % (self.name, self.channel, self.value) + +#--------------------------------------------------------------- +# PitchBendEvent +#--------------------------------------------------------------- +class PitchBendEvent (MIDIEvent): + def __init__ (self, ticks, seq, channel, value): + self.name = 'PitchBend' + self.msg_type = PITCH_BEND + self.ticks = ticks + self.seq = seq + self.channel = channel + self.value = value + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + channel = msg_type & 0x0f + value = (ReadByte(stream) << 7) + ReadByte(stream) - 0x2000 + if msg_type & 0xf0 != PITCH_BEND: + stream.seek(-2,1) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + return PitchBendEvent(ticks, seq, channel, value) + def WriteToStream (self, stream, track, filters=None): + value = self.value + 0x2000 + if value < 0: + value = 0 + if value > 0x3fff: + value = 0x3fff + self.WriteRunningStatus(stream, track, filters, PITCH_BEND, value >> 7, value & 0x7f) + def __str__ (self): + return '%s: ch=%d v=%d' % (self.name, self.channel, self.value) + +#--------------------------------------------------------------- +# SysExEvent +#--------------------------------------------------------------- +class SysExEvent (MIDIEvent): + def __init__ (self, ticks, seq, msg): + self.name = 'SysEx' + self.msg_type = SYSEX + self.ticks = ticks + self.seq = seq + self.length = len(msg) + self.msg = msg + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + pos = stream.tell() + length = ReadVarLenQty(stream) + msg = ReadBytes(stream, length) + if msg_type != SYSEX: + stream.seek(pos,0) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + return SysExEvent(ticks, seq, msg) + def WriteToStream (self, stream, track, filters=None): + if not self.CheckFilters(filters): + return + self.WriteTicks(stream, track) + WriteByte(stream, SYSEX) + WriteVarLenQty(stream, self.length) + WriteBytes(stream, self.msg) + track.running_status = None + def __str__ (self): + fmt_str = '%s: f0' + ' %02x'*self.length + return fmt_str % ((self.name,) + tuple(self.msg)) + +#--------------------------------------------------------------- +# SysExContEvent +#--------------------------------------------------------------- +class SysExContEvent (MIDIEvent): + def __init__ (self, ticks, seq, msg): + self.name = 'SysEx+' + self.msg_type = END_SYSEX + self.ticks = ticks + self.seq = seq + self.length = len(msg) + self.msg = msg + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + pos = stream.tell() + length = ReadVarLenQty(stream) + msg = ReadBytes(stream, length) + if msg_type != END_SYSEX: + stream.seek(pos,0) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + return SysExContEvent(ticks, seq, msg) + def WriteToStream (self, stream, track, filters=None): + if not self.CheckFilters(filters): + return + self.WriteTicks(stream, track) + WriteByte(stream, END_SYSEX) + WriteVarLenQty(stream, self.length) + WriteBytes(stream, self.msg) + track.running_status = None + def __str__ (self): + fmt_str = '%s:' + ' %02x'*self.length + return fmt_str % ((self.name,) + tuple(self.msg)) + +#--------------------------------------------------------------- +# MetaEvent +#--------------------------------------------------------------- +class MetaEvent (MIDIEvent): + def __init__ (self, ticks, seq, meta_type, msg): + self.name = 'MetaEvent' + self.msg_type = META_EVENT + self.ticks = ticks + self.seq = seq + self.meta_type = meta_type + self.length = len(msg) + self.msg = msg + @staticmethod + def ReadFromStream (stream, seq, ticks, msg_type): + pos = stream.tell() + meta_type = ReadByte(stream) + length = ReadVarLenQty(stream) + msg = ReadBytes(stream, length) + if msg_type != META_EVENT: + stream.seek(pos,0) + raise MIDIFileException(stream, MSG_TYPE_MISMATCH) + obj = MetaEvent(ticks, seq, meta_type, msg) + return obj + def WriteToStream (self, stream, track, filters=None): + if not self.CheckFilters(filters): + return + self.WriteTicks(stream, track) + WriteByte(stream, META_EVENT) + WriteByte(stream, self.meta_type) + WriteVarLenQty(stream, self.length) + WriteBytes(stream, self.msg) + track.running_status = None + def __str__ (self): + fmt_str = '%s: %02x' + ' %02x'*self.length + return fmt_str % ((self.name, self.meta_type) + tuple(self.msg)) + +#--------------------------------------------------------------- +# MIDIControllers +#--------------------------------------------------------------- +class MIDIControllers (object): + def __init__ (self): + self.controllers = [] + self.rpns = [] + for channel in range(16): + self.controllers.append({}) + self.controllers[channel] = copy.deepcopy(DEFAULT_CONTROLLER_VALUES) + self.rpns.append({}) + self.rpns[channel] = copy.deepcopy(DEFAULT_RPN_VALUES) + self.pitchbend = [0] * 16 + self.program = [-1] * 16 + self.pressure = [0] * 16 + + def __str__ (self): + output = [] + for channel in range(16): + output.append('channel=%d' % channel) + output.append(' program=%d' % self.program[channel]) + output.append(' pressure=%d' % self.pressure[channel]) + + output.append(' controllers') + for controller in self.controllers[channel].keys(): + output.append(' %03d: %03d' % (controller, self.controllers[channel][controller])) + + output.append(' rpns') + for rpn in self.rpns[channel].keys(): + output.append(' %05d: %05d>' % (controller, self.rpns[channel][rpn])) + return '\n'.join(output) + + + def Event (self, event): + """Process an event and save any changes in controller values""" + # process control changes + if event.msg_type == CONTROL_CHANGE: + self.ControlChange(event) + elif event.msg_type == CHANNEL_PRESSURE: + self.PressureChange(event) + elif event.msg_type == PROGRAM_CHANGE: + self.ProgramChange(event) + elif event.msg_type == PITCH_BEND: + self.PitchBendChange(event) + + def PitchBendChange (self, event): + """Monitor pitch bend change.""" + self.pitchbend[event.channel] = event.value + + def ProgramChange (self, event): + """Monitor program change.""" + self.program[event.channel] = event.program + + def ControlChange (self, event): + """Monitor control change.""" + controller = event.controller + if controller in MONITOR_CONTROLLERS: + channel = event.channel + self.controllers[channel][controller] = event.value + if (controller == CTRL_RPN_DATA_MSB) or (controller == CTRL_RPN_DATA_LSB): + rpn = (self.controllers[channel][CTRL_RPN_MSB] << 7) + self.controllers[channel][CTRL_RPN_LSB] + if rpn in MONITOR_RPNS: + value = (self.controllers[channel][CTRL_RPN_DATA_MSB] << 7) + self.controllers[channel][CTRL_RPN_DATA_LSB] + self.rpns[channel][rpn] = value + + # reset controllers + elif event.controller == CTRL_RESET_CONTROLLERS: + self.ResetControllers[event.channel] + + def PressureChange (self, event): + """Monitor pressure change.""" + self.pressure[event.channel] = event.value + + def ResetControllers (self, channel): + """Reset controllers to default.""" + self.controllers[channel] = DEFAULT_CONTROLLER_VALUES + self.rpns[channel] = DEFAULT_RPN_VALUES + self.pressure[channel] = 0 + + def GenerateEventList (self, ticks, ref_values=None): + """Generate an event list based on controller differences.""" + events = EventList() + + # if no reference values, based on default values + if ref_values is None: + ref_values = MIDIControllers() + + # iterate through 16 MIDI channels + for channel in range(16): + + # generate RPN changes + for rpn in self.rpns[channel].keys(): + value = self.rpns[channel][rpn] + if value != ref_values.rpns[channel][rpn]: + events.append(ControlChangeEvent(ticks, -1, channel, CTRL_RPN_MSB, rpn >> 7)) + events.append(ControlChangeEvent(ticks, -1, channel, CTRL_RPN_LSB, rpn & 0x7f)) + events.append(ControlChangeEvent(ticks, -1, channel, CTRL_RPN_DATA_MSB, value >> 7)) + events.append(ControlChangeEvent(ticks, -1, channel, CTRL_RPN_DATA_LSB, value & 0x7f)) + + # generate controller changes + for controller in self.controllers[channel].keys(): + if self.controllers[channel][controller] != ref_values.controllers[channel][controller]: + events.append(ControlChangeEvent(ticks, -1, channel, controller, self.controllers[channel][controller])) + + # generate pressure changes + if self.pressure[channel] != ref_values.pressure[channel]: + events.append(ChannelPressureEvent(ticks, -1, channel, self.pressure[channel])) + + # generate program changes + if self.program[channel] != ref_values.program[channel]: + if self.program[channel] in range(128): + events.append(ProgramChangeEvent(ticks, -1, channel, self.program[channel])) + + # generate pitch bend changes + if self.pitchbend[channel] != ref_values.pitchbend[channel]: + if self.pitchbend[channel] in range(-8192,8191): + events.append(PitchBendEvent(ticks, -1, channel, self.pitchbend[channel])) + + return events + +#--------------------------------------------------------------- +# EventList +#--------------------------------------------------------------- +class EventList (list): + def __init__ (self): + list.__init__(self) + + def FixNoteLengths (self): + midi_file_logger.debug('Fix note lengths') + + # search for note-on's in event list + for index in range(len(self)): + event = self[index] + if event.msg_type == NOTE_ON: + note_off_ticks = event.ticks + event.note_length + + # check for note-on occuring before end of current note + for i in range(index + 1, len(self)): + event_to_check = self[i] + if event_to_check.ticks >= note_off_ticks: + break + + # adjust note length + if (event_to_check.msg_type == NOTE_ON) and (event_to_check.note == event.note): + midi_file_logger.debug('Adjusting note length @ %d' % event.ticks) + event.note_length = event_to_check.ticks - event.ticks + break + + def ChaseControllers (self, end_seq, start_seq = 0, values = None): + midi_file_logger.debug('ChaseControllers from %d to %d' % (start_seq, end_seq)) + + # initialize controller values + if values is None: + values = MIDIControllers() + + # chase controllers in track + for i in range(start_seq, min(end_seq, len(self))): + values.Event(self[i]) + + # return new values + return values + + def SelectEvents (self, start, end): + midi_file_logger.debug('SelectEvents: %d to %d' % (start, end)) + selected = EventList() + for event in self: + if event.ticks >= start: + if event.ticks >= end: + break + midi_file_logger.debug('SelectEvent: %s' % event.__str__()) + selected.append(event) + return selected + + def MergeEvents (self, events): + # copy events and sort them by ticks/sequence# + self.extend(events) + self.SortEvents() + + def InsertEvents (self, events, seq): + self[seq:seq] = events + self.RenumberSeq() + + def DeleteEvents (self, start_index, end_index, move_meta_events=None): + # default parameters + if start_index is None: + start_index = 0 + if end_index is None: + end_index = len(self) + + #print("\n") + #for evt in self[start_index:end_index]: + # print("%d %s" % (evt.ticks, evt)) + + # delete events + delete_count = 0 + move_count = 0 + for event in self[start_index:end_index]: + #Bth; Added this so we always get clip end events; clips that ended on last measure wouldn't end on repeat + if (event.msg_type == CONTROL_CHANGE) and \ + (event.controller == JET_EVENT_TRIGGER_CLIP) and \ + ((event.value & 0x40) != 0x40): + pass + else: + if (move_meta_events is None) or (event.msg_type != META_EVENT): + self.remove(event) + delete_count += 1 + + # move meta-events + else: + event.ticks = move_meta_events + move_count += 1 + + midi_file_logger.debug('DeleteEvents: deleted %d events in range(%s:%s)' % (delete_count, start_index, end_index)) + midi_file_logger.debug('DeleteEvents: moved %d events in range(%s:%s)' % (move_count, start_index, end_index)) + + + def SeekEvent (self, pos): + for i in range(len(self)): + if self[i].ticks >= pos: + return i + return None + + def RenumberSeq (self): + seq = 0 + for event in self: + event.seq = seq + seq += 1 + + def SortEvents (self): + self.sort(self.EventSorter) + self.RenumberSeq() + + @staticmethod + def EventSorter (x, y): + if x.ticks == y.ticks: + return cmp(x.seq, y.seq) + else: + return cmp(x.ticks, y.ticks) + + def DumpEvents (self, output, timebase): + if output is not None: + for event in self: + output.write('%s\n' % event.TimeEventStr(timebase)) + else: + for event in self: + midi_file_logger.debug(event.TimeEventStr(timebase)) + +#--------------------------------------------------------------- +# MIDITrack +#--------------------------------------------------------------- +class MIDITrack (object): + """The MIDITrack class implements methods for reading, parsing, + modifying, and writing tracks in Standard MIDI Files (SMF). + + """ + def __init__ (self): + self.length = 0 + self.events = EventList() + self.end_of_track = None + self.channel = None + self.name = None + + def ReadFromStream (self, stream, offset, file_size): + self.stream = stream + ticks = 0 + seq = 0 + running_status = None + tick_warning_level = stream.timebase.ppqn * LARGE_TICK_WARNING + + # read the track header - verify it's an SMF track + stream.seek(offset) + bytes = stream.read(struct.calcsize(SMF_TRACK_HEADER_FMT)) + riff_tag, track_len = struct.unpack(SMF_TRACK_HEADER_FMT, bytes) + midi_file_logger.debug('SMF track header\n Tag: %s\n TrackLen: %d' % (riff_tag, track_len)) + if (riff_tag != SMF_TRACK_RIFF_TAG): + raise MIDIFileException(stream, MSG_INVALID_TRACK_HEADER) + self.start = stream.tell() + + # check for valid track length + if (self.start + track_len) > file_size: + stream.Warning('Ignoring illegal track length - %d exceeds length of file' % track_len) + track_len = None + + # read the entire track + note_on_list = [] + while 1: + + # save current position + pos = stream.tell() + + # check for end of track + if track_len is not None: + if (pos - self.start) >= track_len: + break + + # are we past end of track? + if self.end_of_track: + stream.Warning('Ignoring data encountered beyond end-of-track meta-event') + break; + + # read delta timestamp + delta = ReadVarLenQty(stream) + if ticks > tick_warning_level: + stream.Warning('Tick value is excessive - possibly corrupt data?') + ticks += delta + + # get the event type and process it + msg_type = ReadByte(stream) + + # if data byte, check for running status + if msg_type & 0x80 == 0: + + # use running status + msg_type = running_status + + # back up so event can process data + stream.seek(-1,1) + + # if no running status, we have a problem + if not running_status: + stream.Warning('Ignoring data byte received with no running status') + + # create event type from stream + event = MIDIEvent.ReadFromStream(stream, seq, ticks, msg_type) + + if self.channel == None: + try: + self.channel = event.channel + except AttributeError: + pass + + # track note-ons + if event.msg_type == NOTE_ON: + + """ + Experimental code to clean up overlapping notes + Clean up now occurs during write process + + for note_on in note_on_list: + if (event.channel == note_on.channel) and (event.note == note_on.note): + stream.Warning('Duplicate note-on\'s encountered without intervening note-off') + stream.Warning(' [%s]: %s' % (stream.timebase.ConvertTicksToStr(event.ticks), event.__str__())) + note_on.note_length = event.ticks - note_on.ticks - 1 + if note_on.note_length <= 0: + stream.Warning('Eliminating duplicate note-on') + event.ticks = note_on.ticks + self.events.remove(note_on) + """ + + note_on_list.append(event) + + # process note-offs + if event.msg_type == NOTE_OFF: + for note_on in note_on_list[:]: + if (event.channel == note_on.channel) and (event.note == note_on.note): + note_on.note_length = event.ticks - note_on.ticks + note_on.note_off_velocity = event.velocity + note_on_list.remove(note_on) + break + #else: + # stream.Warning('Note-off encountered without corresponding note-on') + # stream.Warning(' [%s]: %s' % (stream.timebase.ConvertTicksToStr(event.ticks), event.__str__())) + + # check for end of track + elif event.msg_type == META_EVENT and event.meta_type == META_EVENT_END_OF_TRACK: + self.end_of_track = event.ticks + + # BTH; get track name + elif event.msg_type == META_EVENT and event.meta_type == META_EVENT_SEQUENCE_TRACK_NAME: + self.name = array.array('B', event.msg).tostring() + + # append event to event list + else: + self.events.append(event) + seq += 1 + + # save position for port-mortem + stream.last_good_event = pos + + # update running statusc_str( + if msg_type < 0xf0: + running_status = msg_type + elif (msg_type < 0xf8) or (msg_type == 0xff): + running_status = None + + # check for stuck notes + #if len(note_on_list): + # stream.Warning('Note-ons encountered without corresponding note-offs') + + # check for missing end-of-track meta-event + if self.end_of_track is None: + self.last_tick = self.events[-1].ticks + stream.Warning('End of track encountered with no end-of-track meta-event') + + # if track length was bad, correct it + if track_len is None: + track_len = stream.tell() - offset - 8 + + return track_len + + def Write (self, stream, filters=None): + # save current file position so we can write header + header_loc = stream.tell() + stream.seek(header_loc + struct.calcsize(SMF_TRACK_HEADER_FMT)) + + # save a copy of the event list so we can restore it + save_events = copy.copy(self.events) + + # create note-off events + index = 0 + while 1: + if index >= len(self.events): + break + + # if note-on event, create a note-off event + event = self.events[index] + index += 1 + if event.msg_type == NOTE_ON: + note_off = NoteOffEvent(event.ticks + event.note_length, index, event.channel, event.note, event.note_off_velocity) + + # insert note-off in list + for i in range(index, len(self.events)): + if self.events[i].ticks >= note_off.ticks: + self.events.insert(i, note_off) + break + else: + self.events.append(note_off) + + # renumber list + self.events.RenumberSeq() + + # write the events + self.running_status = None + self.ticks = 0 + for event in self.events: + + # write event + event.WriteToStream(stream, self, filters) + + # restore original list (without note-off events) + self.events = save_events + + # write the end-of-track meta-event + MetaEvent(self.end_of_track, 0, META_EVENT_END_OF_TRACK,[]).WriteToStream(stream, self, None) + + # write track header + end_of_track = stream.tell() + track_len = end_of_track - header_loc - struct.calcsize(SMF_TRACK_HEADER_FMT) + stream.seek(header_loc) + bytes = struct.pack(SMF_TRACK_HEADER_FMT, SMF_TRACK_RIFF_TAG, track_len) + stream.write(bytes) + stream.seek(end_of_track) + + def Trim (self, start, end, slide=True, chase_controllers=True, delete_meta_events=False, quantize=0): + controllers = None + + if quantize: + # quantize events just before start + for event in self.events.SelectEvents(start - quantize, start): + midi_file_logger.debug('Trim: Moving event %s to %d' % (event.__str__(), start)) + event.ticks = start + + # quantize events just before end + for event in self.events.SelectEvents(end - quantize, end): + midi_file_logger.debug('Trim: Moving event %s to %d' % (event.__str__(), end)) + event.ticks = end + + # trim start + if start: + + # find first event inside trim + start_event = self.events.SeekEvent(start) + if start_event is not None: + + # chase controllers to cut point + if chase_controllers: + controllers = self.events.ChaseControllers(self.events[start_event].seq) + controller_events = controllers.GenerateEventList(0) + midi_file_logger.debug('Trim: insert new controller events at %d:' % start) + controller_events.DumpEvents(None, self.stream.timebase) + self.events.InsertEvents(controller_events, start_event) + + # delete events + midi_file_logger.debug('Trim: deleting events up to event %d' % start_event) + if delete_meta_events: + self.events.DeleteEvents(None, start_event, None) + else: + self.events.DeleteEvents(None, start_event, start) + + # delete everything except metadata + else: + self.events.DeleteEvents(None, None, start) + + # trim end + end_event = self.events.SeekEvent(end) + if end_event is not None: + midi_file_logger.debug('Trim: trimming section starting at event %d' % end_event) + self.events.DeleteEvents(end_event, None) + + # trim any notes that extend past the end + for event in self.events: + if event.msg_type == NOTE_ON: + if (event.ticks + event.note_length) > end: + midi_file_logger.debug('Trim: trimming note that extends past end %s' % event.TimeEventStr(self.stream.timebase)) + event.note_length = end - event.ticks + if event.note_length <= 0: + raise 'Error in note length - note should have been deleted' + + midi_file_logger.debug('Trim: initial end-of-track: %d' % self.end_of_track) + self.end_of_track = min(self.end_of_track, end) + + # slide events to start of track to fill hole + if slide and start: + midi_file_logger.debug('Trim: sliding events: %d' % start) + for event in self.events: + if event.ticks > start: + event.ticks -= start + else: + event.ticks = 0 + self.end_of_track = max(0, self.end_of_track - start) + midi_file_logger.debug('Trim: new end-of-track: %d' % self.end_of_track) + + self.events.RenumberSeq() + self.events.FixNoteLengths() + + def DumpEvents (self, output): + self.events.DumpEvents(output, self.stream.timebase) + if output is not None: + output.write('[%s]: end-of-track\n' % self.stream.timebase.ConvertTicksToStr(self.end_of_track)) + else: + midi_file_logger.debug('[%s]: end-of-track' % self.stream.timebase.ConvertTicksToStr(self.end_of_track)) + + +#--------------------------------------------------------------- +# MIDIFile +#--------------------------------------------------------------- +class MIDIFile (file): + """The MIDIFile class implements methods for reading, parsing, + modifying, and writing Standard MIDI Files (SMF). + + """ + def __init__ (self, name, mode): + file.__init__(self, name, mode) + self.timebase = TimeBase() + + def ReadFromStream (self, start_offset=0, file_size=None): + """Parse the MIDI file creating a list of properties, tracks, + and events based on the contents of the file. + + """ + + # determine file size - without using os.stat + if file_size == None: + self.start_offset = start_offset + self.seek(0,2) + file_size = self.tell() - self.start_offset + self.seek(start_offset,0) + else: + file_size = file_size + + # for error recovery + self.last_good_event = None + self.error_loc = None + + # read the file header - verify it's an SMF file + bytes = self.read(struct.calcsize(SMF_HEADER_FMT)) + riff_tag, self.hdr_len, self.format, self.num_tracks, self.timebase.ppqn = struct.unpack(SMF_HEADER_FMT, bytes) + midi_file_logger.debug('SMF header\n Tag: %s\n HeaderLen: %d\n Format: %d\n NumTracks: %d\n PPQN: %d\n' % \ + (riff_tag, self.hdr_len, self.format, self.num_tracks, self.timebase.ppqn)) + + # sanity check on header + if (riff_tag != SMF_RIFF_TAG) or (self.format not in range(2)): + raise MIDIFileException(self, MSG_NOT_SMF_FILE) + + # check for odd header size + if self.hdr_len + 8 != struct.calcsize(SMF_HEADER_FMT): + self.Warning('SMF file has unusual header size: %d bytes' % self.hdr_len) + + # read each of the tracks + offset = start_offset + self.hdr_len + 8 + self.tracks = [] + self.end_of_file = 0 + for i in range(self.num_tracks): + #print("Track: %d" % i) + + # parse the track + track = MIDITrack() + length = track.ReadFromStream(self, offset, file_size) + track.trackNum = i + + self.tracks.append(track) + + # calculate offset to next track + offset += length + 8 + + # determine time of last event + self.end_of_file = max(self.end_of_file, track.end_of_track) + + # if start_offset is zero, the final offset should match the file length + if (offset - start_offset) != file_size: + self.Warning('SMF file size is incorrect - should be %d, was %d' % (file_size, offset)) + + def Save (self, offset=0, filters=None): + """Save this file back to disk with modifications.""" + if (not 'w' in self.mode) and (not '+' in self.mode): + raise MIDIFileException(self, 'Cannot write to file in read-only mode') + self.Write(self, offset, filters) + + def SaveAs (self, filename, offset=0, filters=None): + """Save MIDI data to new file.""" + output_file = MIDIFile(filename, 'wb') + self.Write(output_file, offset, filters) + output_file.close() + + def Write (self, output_file, offset=0, filters=None): + """This function does the actual work of writing the file.""" + # write the file header + output_file.seek(offset) + bytes = struct.pack(SMF_HEADER_FMT, SMF_RIFF_TAG, struct.calcsize(SMF_HEADER_FMT) - 8, self.format, self.num_tracks, self.timebase.ppqn) + output_file.write(bytes) + + # write out the tracks + for track in self.tracks: + track.Write(output_file, filters) + + # flush the data to disk + output_file.flush() + + def ConvertToType0 (self): + """Convert a file to type 0.""" + if self.format == 0: + midi_file_logger.warning('File is already type 0 - ignoring request to convert') + return + + # convert to type 0 + for track in self.tracks[1:]: + self.tracks[0].MergeEvents(track.events) + self.tracks = self.tracks[:1] + self.num_tracks = 1 + self.format = 0 + + def DeleteEmptyTracks (self): + """Delete any tracks that do not contain MIDI messages""" + track_num = 0 + for track in self.tracks[:]: + for event in self.tracks.events: + if event.msg_type in MIDI_MESSAGES: + break; + else: + midi_file_logger.debug('Deleting track %d' % track_num) + self.tracks.remove(track) + track_num += 1 + + def ConvertToTicks (self, measures, beats, ticks): + return self.timebase.ConvertToTicks(measures, beats, ticks) + + def Trim (self, start, end, quantize=0, chase_controllers=True): + track_num = 0 + for track in self.tracks: + midi_file_logger.debug('Trimming track %d' % track_num) + track.Trim(start, end, quantize=quantize, chase_controllers=chase_controllers) + track_num += 1 + + def DumpTracks (self, output=None): + track_num = 0 + for track in self.tracks: + if output is None: + midi_file_logger.debug('*** Track %d ***' % track_num) + else: + output.write('*** Track %d ***' % track_num) + track.DumpEvents(output) + track_num += 1 + + def Warning (self, msg): + midi_file_logger.warning('[%d]: %s' % (self.tell(), msg)) + + def Error (self, msg): + midi_file_logger.error('[%d]: %s' % (self.tell(), msg)) + + def DumpError (self): + if self.last_good_event: + midi_file_logger.error('Dumping from last good event:') + pos = self.last_good_event - 16 + length = self.error_loc - pos + 16 + elif self.error_loc: + midi_file_logger.error('Dumping from 16 bytes prior to error:') + pos = self.error_loc + length = 32 + else: + midi_file_logger.error('No dump information available') + return + + self.seek(pos, 0) + for i in range(length): + if i % 16 == 0: + if i: + midi_file_logger.error(' '.join(debug_out)) + debug_out = ['%08x:' % (pos + i)] + byte = self.read(1) + if len(byte) == 0: + break; + debug_out.append('%02x' % ord(byte)) + if i % 16 > 0: + midi_file_logger.error(' '.join(debug_out)) + +def GetMidiInfo(midiFile): + """Bth; Get MIDI info""" + + class midiData(object): + def __init__ (self): + self.err = 1 + self.endMbt = "0:0:0" + self.totalTicks = 0 + self.maxTracks = 0 + self.maxMeasures = 0 + self.maxBeats = 0 + self.maxTicks = 0 + self.totalTicks = 0 + self.timebase = None + self.ppqn = 0 + self.beats_per_measure = 0 + self.trackList = [] + + md = midiData() + + try: + m = MIDIFile(midiFile, 'rb') + m.ReadFromStream() + + for track in m.tracks: + if track.channel is not None: + empty = False + trk = track.channel + 1 + else: + empty = True + trk = '' + md.trackList.append(trackGrid(track.trackNum, trk, track.name, empty)) + + md.endMbt = m.timebase.ConvertTicksToMBT(m.end_of_file) + md.endMbtStr = "%d:%d:%d" % (md.endMbt[0], md.endMbt[1], md.endMbt[2]) + md.maxMeasures = md.endMbt[0] + md.maxBeats = 4 + md.maxTicks = m.timebase.ppqn + md.maxTracks = m.num_tracks + md.totalTicks = m.end_of_file + md.timebase = m.timebase + md.ppqn = m.timebase.ppqn + md.beats_per_measure = m.timebase.beats_per_measure + + #add above if more added + md.err = 0 + + m.close() + except: + raise + pass + + return md + + + + +#--------------------------------------------------------------- +# main +#--------------------------------------------------------------- +if __name__ == '__main__': + sys = __import__('sys') + os = __import__('os') + + # initialize root logger + root_logger = logging.getLogger('') + root_logger.setLevel(logging.NOTSET) + + # initialize console handler + console_handler = logging.StreamHandler() + console_handler.setFormatter(logging.Formatter('%(message)s')) + console_handler.setLevel(logging.DEBUG) + root_logger.addHandler(console_handler) + + files = [] + dirs = [] + last_arg = None + sysex_filter = False + drum_filter = False + convert = False + + # process args + for arg in sys.argv[1:]: + + # previous argument implies this argument + if last_arg is not None: + if last_arg == '-DIR': + dirs.append(arg) + last_arg = None + + # check for switch + elif arg[0] == '-': + if arg == '-DIR': + last_arg = arg + elif arg == '-SYSEX': + sysex_filter = True + elif arg == '-DRUMS': + drum_filter = True + elif arg == '-CONVERT': + convert = True + else: + midi_file_logger.error('Bad option %s' % arg) + + # must be a filename + else: + files.append(arg) + + # setup filters + filters = [] + if sysex_filter: + filters.append(EventTypeFilter((SYSEX,))) + if drum_filter: + filters.append(ChannelFilter((9,),False)) + + + # process dirs + for d in dirs: + for root, dir_list, file_list in os.walk(d): + for f in file_list: + if f.endswith('.mid'): + files.append(os.path.join(root, f)) + + # process files + bad_files = [] + for f in files: + midi_file_logger.info('Processing file %s' % f) + midiFile = MIDIFile(f, 'rb') + try: + midiFile.ReadFromStream() + + #midiFile.DumpTracks() + #print('[%s]: end-of-track\n' % midiFile.timebase.ConvertTicksToStr(midiFile.end_of_file)) + + # convert to type 0 + if convert and (midiFile.format == 1): + midiFile.Convert(0) + converted = True + else: + converted = False + + # write processed file + if converted or len(filters): + midiFile.SaveAs(f[:-4] + '-mod.mid', filters) + + except MIDIFileException, X: + bad_files.append(f) + midi_file_logger.error('Error in file %s' % f) + midi_file_logger.error(X) + midiFile.DumpError() + midiFile.close() + + # dump problem files + if len(bad_files): + midi_file_logger.info('The following file(s) had errors:') + for f in bad_files: + midi_file_logger.info(f) + else: + midi_file_logger.info('All files read successfully') + -- cgit v1.2.3 From b2e9f5cfd5b727c9044a218256b65b27dd00a604 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi <> Date: Sat, 11 Apr 2009 10:50:51 -0700 Subject: AI 145803: Add Sonivox' JET documentation: authoring guidelines, JETCreator user manual, programming manual for the native library. BUG=1721874 Automated import of CL 145803 --- docs/JET_Authoring_Guidelines.htm | 2442 +++++++++++++++++ docs/JET_Authoring_Guidelines_files/header.htm | 202 ++ docs/JET_Authoring_Guidelines_files/image001.jpg | Bin 0 -> 113715 bytes docs/JET_Authoring_Guidelines_files/image002.emz | Bin 0 -> 3093 bytes docs/JET_Authoring_Guidelines_files/image004.emz | Bin 0 -> 2896 bytes docs/JET_Authoring_Guidelines_files/image006.emz | Bin 0 -> 2840 bytes docs/JET_Authoring_Guidelines_files/image008.gif | Bin 0 -> 8332 bytes docs/JET_Authoring_Guidelines_files/image010.gif | Bin 0 -> 4439 bytes docs/JET_Authoring_Guidelines_files/image011.png | Bin 0 -> 84979 bytes docs/JET_Authoring_Guidelines_files/image012.gif | Bin 0 -> 35354 bytes docs/JET_Authoring_Guidelines_files/image013.gif | Bin 0 -> 8144 bytes docs/JET_Authoring_Guidelines_files/image014.gif | Bin 0 -> 8546 bytes docs/JET_Authoring_Guidelines_files/image015.emz | Bin 0 -> 2459 bytes docs/JET_Creator_User_Manual.htm | 3032 ++++++++++++++++++++++ docs/JET_Creator_User_Manual_files/header.htm | 220 ++ docs/JET_Creator_User_Manual_files/image001.emz | Bin 0 -> 3093 bytes docs/JET_Creator_User_Manual_files/image002.gif | Bin 0 -> 8144 bytes docs/JET_Creator_User_Manual_files/image003.emz | Bin 0 -> 2896 bytes docs/JET_Creator_User_Manual_files/image004.gif | Bin 0 -> 8546 bytes docs/JET_Creator_User_Manual_files/image005.emz | Bin 0 -> 2840 bytes docs/JET_Creator_User_Manual_files/image006.gif | Bin 0 -> 8332 bytes docs/JET_Creator_User_Manual_files/image007.emz | Bin 0 -> 2459 bytes docs/JET_Creator_User_Manual_files/image008.gif | Bin 0 -> 4439 bytes docs/JET_Creator_User_Manual_files/image009.png | Bin 0 -> 17097 bytes docs/JET_Creator_User_Manual_files/image010.jpg | Bin 0 -> 15103 bytes docs/JET_Creator_User_Manual_files/image011.png | Bin 0 -> 62984 bytes docs/JET_Creator_User_Manual_files/image012.jpg | Bin 0 -> 31618 bytes docs/JET_Creator_User_Manual_files/image013.png | Bin 0 -> 49892 bytes docs/JET_Creator_User_Manual_files/image014.jpg | Bin 0 -> 25662 bytes docs/JET_Creator_User_Manual_files/image015.png | Bin 0 -> 54424 bytes docs/JET_Creator_User_Manual_files/image016.jpg | Bin 0 -> 24013 bytes docs/JET_Creator_User_Manual_files/image017.png | Bin 0 -> 21566 bytes docs/JET_Creator_User_Manual_files/image018.jpg | Bin 0 -> 21521 bytes docs/JET_Creator_User_Manual_files/image019.png | Bin 0 -> 21236 bytes docs/JET_Creator_User_Manual_files/image020.jpg | Bin 0 -> 21251 bytes docs/JET_Creator_User_Manual_files/image021.png | Bin 0 -> 16350 bytes docs/JET_Creator_User_Manual_files/image022.jpg | Bin 0 -> 16546 bytes docs/JET_Creator_User_Manual_files/image023.png | Bin 0 -> 38252 bytes docs/JET_Creator_User_Manual_files/image024.jpg | Bin 0 -> 32400 bytes docs/JET_Creator_User_Manual_files/image025.emz | Bin 0 -> 3414 bytes docs/JET_Creator_User_Manual_files/image026.gif | Bin 0 -> 8166 bytes docs/JET_Creator_User_Manual_files/image027.emz | Bin 0 -> 2194 bytes docs/JET_Creator_User_Manual_files/image028.gif | Bin 0 -> 3717 bytes docs/JET_Creator_User_Manual_files/image029.jpg | Bin 0 -> 113715 bytes docs/JET_Creator_User_Manual_files/image030.emz | Bin 0 -> 3093 bytes docs/JET_Creator_User_Manual_files/image031.emz | Bin 0 -> 2896 bytes docs/JET_Creator_User_Manual_files/image032.emz | Bin 0 -> 2840 bytes docs/JET_Creator_User_Manual_files/image033.emz | Bin 0 -> 2459 bytes docs/JET_Creator_User_Manual_files/image034.emz | Bin 0 -> 3414 bytes docs/JET_Creator_User_Manual_files/image035.emz | Bin 0 -> 2194 bytes docs/JET_Programming_Manual.htm | 1333 ++++++++++ docs/JET_Programming_Manual_files/header.htm | 73 + docs/JET_Programming_Manual_files/image002.png | Bin 0 -> 6098 bytes docs/JET_Programming_Manual_files/image004.png | Bin 0 -> 6817 bytes docs/JET_Programming_Manual_files/image006.png | Bin 0 -> 5332 bytes docs/JET_Programming_Manual_files/image008.png | Bin 0 -> 3830 bytes docs/JET_Programming_Manual_files/image010.png | Bin 0 -> 3054 bytes docs/JET_Programming_Manual_files/image012.png | Bin 0 -> 8994 bytes docs/JET_Programming_Manual_files/image013.emz | Bin 0 -> 3093 bytes docs/JET_Programming_Manual_files/image014.emz | Bin 0 -> 2896 bytes docs/JET_Programming_Manual_files/image015.emz | Bin 0 -> 2840 bytes docs/JET_Programming_Manual_files/image016.emz | Bin 0 -> 2459 bytes docs/JET_Programming_Manual_files/image017.emz | Bin 0 -> 2194 bytes docs/JET_Programming_Manual_files/image018.emz | Bin 0 -> 3414 bytes 64 files changed, 7302 insertions(+) create mode 100644 docs/JET_Authoring_Guidelines.htm create mode 100755 docs/JET_Authoring_Guidelines_files/header.htm create mode 100755 docs/JET_Authoring_Guidelines_files/image001.jpg create mode 100755 docs/JET_Authoring_Guidelines_files/image002.emz create mode 100755 docs/JET_Authoring_Guidelines_files/image004.emz create mode 100755 docs/JET_Authoring_Guidelines_files/image006.emz create mode 100755 docs/JET_Authoring_Guidelines_files/image008.gif create mode 100755 docs/JET_Authoring_Guidelines_files/image010.gif create mode 100755 docs/JET_Authoring_Guidelines_files/image011.png create mode 100755 docs/JET_Authoring_Guidelines_files/image012.gif create mode 100755 docs/JET_Authoring_Guidelines_files/image013.gif create mode 100755 docs/JET_Authoring_Guidelines_files/image014.gif create mode 100755 docs/JET_Authoring_Guidelines_files/image015.emz create mode 100644 docs/JET_Creator_User_Manual.htm create mode 100755 docs/JET_Creator_User_Manual_files/header.htm create mode 100755 docs/JET_Creator_User_Manual_files/image001.emz create mode 100755 docs/JET_Creator_User_Manual_files/image002.gif create mode 100755 docs/JET_Creator_User_Manual_files/image003.emz create mode 100755 docs/JET_Creator_User_Manual_files/image004.gif create mode 100755 docs/JET_Creator_User_Manual_files/image005.emz create mode 100755 docs/JET_Creator_User_Manual_files/image006.gif create mode 100755 docs/JET_Creator_User_Manual_files/image007.emz create mode 100755 docs/JET_Creator_User_Manual_files/image008.gif create mode 100755 docs/JET_Creator_User_Manual_files/image009.png create mode 100755 docs/JET_Creator_User_Manual_files/image010.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image011.png create mode 100755 docs/JET_Creator_User_Manual_files/image012.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image013.png create mode 100755 docs/JET_Creator_User_Manual_files/image014.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image015.png create mode 100755 docs/JET_Creator_User_Manual_files/image016.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image017.png create mode 100755 docs/JET_Creator_User_Manual_files/image018.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image019.png create mode 100755 docs/JET_Creator_User_Manual_files/image020.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image021.png create mode 100755 docs/JET_Creator_User_Manual_files/image022.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image023.png create mode 100755 docs/JET_Creator_User_Manual_files/image024.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image025.emz create mode 100755 docs/JET_Creator_User_Manual_files/image026.gif create mode 100755 docs/JET_Creator_User_Manual_files/image027.emz create mode 100755 docs/JET_Creator_User_Manual_files/image028.gif create mode 100755 docs/JET_Creator_User_Manual_files/image029.jpg create mode 100755 docs/JET_Creator_User_Manual_files/image030.emz create mode 100755 docs/JET_Creator_User_Manual_files/image031.emz create mode 100755 docs/JET_Creator_User_Manual_files/image032.emz create mode 100755 docs/JET_Creator_User_Manual_files/image033.emz create mode 100755 docs/JET_Creator_User_Manual_files/image034.emz create mode 100755 docs/JET_Creator_User_Manual_files/image035.emz create mode 100644 docs/JET_Programming_Manual.htm create mode 100755 docs/JET_Programming_Manual_files/header.htm create mode 100755 docs/JET_Programming_Manual_files/image002.png create mode 100755 docs/JET_Programming_Manual_files/image004.png create mode 100755 docs/JET_Programming_Manual_files/image006.png create mode 100755 docs/JET_Programming_Manual_files/image008.png create mode 100755 docs/JET_Programming_Manual_files/image010.png create mode 100755 docs/JET_Programming_Manual_files/image012.png create mode 100755 docs/JET_Programming_Manual_files/image013.emz create mode 100755 docs/JET_Programming_Manual_files/image014.emz create mode 100755 docs/JET_Programming_Manual_files/image015.emz create mode 100755 docs/JET_Programming_Manual_files/image016.emz create mode 100755 docs/JET_Programming_Manual_files/image017.emz create mode 100755 docs/JET_Programming_Manual_files/image018.emz diff --git a/docs/JET_Authoring_Guidelines.htm b/docs/JET_Authoring_Guidelines.htm new file mode 100644 index 0000000..2ade2e3 --- /dev/null +++ b/docs/JET_Authoring_Guidelines.htm @@ -0,0 +1,2442 @@ + + + + + + + + +JET Authoring Guidelines + + + + + + + + +
+   Copyright (C) 2009 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ +
+ +

JET™ Content Authoring Guidelines

+ +

JET Interactive Music Engine

+ +

Vrs 1.0

+ +

Authored by SONiVOX

+ +

www.sonivoxrocks.com

+ +

Copyright 2009 Sonic Network, Inc.

+ +

 

+ +

 

+ +

1         +Introduction

+ +

1.1        +Overview

+ +

This document contains content creation +guidelines for composers and sound designers authoring music and sound effects +for the SONiVOX JET platform.  JET is an +interactive music player for small embedded devices, including the Google Android +platform. It allows applications to include interactive music soundtracks, in MIDI format, that respond in real-time to game play +events and user interaction.

+ +

 

+ +

JET works in conjunction with SONiVOX’s +Embedded Audio Synthesizer (EAS) which is the MIDI +playback device for Android.  Both the +JET and EAS engines are integrated into the Android embedded platform as well +as inherent in the JET Creator application. As such, the JET content author can +be sure that the playback will sound exactly the same in both the JET Creator +and the final Android application playing back on Android mobile devices.

+ +

 

+ +

The JET content author works in up to three +different applications to create JET content; a standard MIDI +sequencer (Logic, Cubase, etc.), optionally a DLS2 instrument editor (Awave), +and the JET Creator application to add and audition JET interactive elements.

+ +

 

+ +

The final result is a .jet file that the +content author gives to the application programmer for use in the game or +application.

+ +

 

+ +

 

+ +

1.2        +Abbreviations and Common Terms

+ +

It is important to use a common set of +terms to minimize confusion. Since JET uses MIDI +in a unique way, normal industry terms may not always suffice. Here is the +definition of terms as they are used in this document and in the JET Creator +application:

+ +

 

+ +

Channel: MIDI data associated with a specific MIDI +channel. Standard MIDI allows for 16 channels of MIDI +data each of which are typically associated with a specific instrument.

+ +

 

+ +

Controller: A MIDI event consisting of a +channel number, controller number, and a controller value. The MIDI spec associates many controller numbers with +specific functions, such as volume, expression, sustain pedal, etc. JET also +uses controller events as a means of embedding special control information in a +MIDI sequence to provide for audio +synchronization.

+ +

 

+ +

DAW: Digital Audio Workstation. A common term for MIDI +and audio sequencing applications such as Logic, SONAR, Cubase and others.

+ +

 

+ +

EAS: Embedded MIDI Synthesizer. The +name of the SONiVOX MIDI synthesizer engine.

+ +

 

+ +

JET: Jet Interactive Engine. The name of the SONiVOX JET interactive +music engine.

+ +

 

+ +

Segment: A musical section such as a chorus or verse that is a component of +the overall composition. In JET, a segment can be an entire MIDI file or a +derived from a portion of a MIDI file.

+ +

 

+ +

SMF-0: Standard MIDI File Type 0, a MIDI file that contains a single +track, but may be made up of multiple channels of MIDI +data.

+ +

 

+ +

SMF-1: Standard MIDI File Type 1, a MIDI file that contains a one more +tracks, and each track may in turn be made up of one or more channels of MIDI data. By convention, each channel is stored on a +separate track in an SMF-1 file. However, it is possible to have multiple MIDI +channels on a single track, or multiple tracks that contain data for the same MIDI channel.

+ +

 

+ +

Track: A single track in a DAW containing a timed sequence of MIDI events. Be careful not to confuse Tracks with +Channels. A MIDI file may contain many tracks with several tracks utilizing the +same MIDI channel.

+ +

 

+ +

 

+ +

1         +The JET Interactive Music Concept

+ +

Interactive music can be defined as music +that changes in real-time according to non-predictable events such as user +interaction or game play events. In this way, interactive music is much more +engaging as it has the ability to match the energy and mood of a game much +closer than a pre-composed composition that never changes. In some applications +and games, interactive music is central to the game play. Guitar Hero is one +such popular game. When the end user successfully ‘captures’ the musical notes +coming down the fret board, the music adapts itself and simultaneously keeps +score of successes and failures. JET allows for these types of music driven +games as well.

+ +

 

+ +

There are several methods for making and +controlling interactive music and JET is one such method. This section +describes the features of JET and how they might be used in a game or software +application. It also describes how JET can be used to save memory in small +footprint devices such as Android enabled mobile handsets.

+ +

1.1.1       Data Compression

+ +

JET supports a flexible music format that +can be used to create extended musical sequences with a minimal amount of data. +A musical composition is broken up into segments that can be sequenced to +create a longer piece. The sequencing can be fixed at the time the music file +is authored, or it can be created dynamically under program control.

+ +

1.1.2       Linear Music Example

+ +

+ +

Figure 1: Linear Music Piece

+ +

 

+ +

This diagram shows how musical segments are +stored. Each segment is authored as a separate MIDI +file. A post-processing tool combines the files into a single container file. +Each segment can contain alternate music tracks that can be muted or un-muted +to create additional interest. An example might be a brass accent in the chorus +that is played only the last time through. Also, segments can be transposed up +or down.

+ +

 

+ +

The bottom part of the diagram shows how +the musical segments can be recombined to create a linear music piece. In this +example, the bridge might end with a half-step key modulation and the remaining +segments could be transposed up a half-step to match.

+ +

1.1.3          +Non-linear Music Example

+ +

+ +

Figure 2: Non-linear music piece

+ +

 

+ +

In this diagram, we see a non-linear music +piece. The scenario is a first-person-shooter (FPS) and JET is providing the +background music. The intro plays as the level is loading and then transitions +under program control to the Searching segment. This segment is repeated +indefinitely, perhaps with small variations (using the mute/un-mute feature) +until activity in the game dictates a change.

+ +

 

+ +

As the player nears a monster lair, the +program starts a synchronized transition to the Danger segment, increasing the +tension level in the audio. As the player draws closer to the lair, additional +tracks are un-muted to increase the tension.

+ +

 

+ +

As the player enters into combat with the +monster, the program starts a synchronized transition to the Combat segment. +The segment repeats indefinitely as the combat continues. A Bonus Hit +temporarily un-mutes a decorative track that notifies the player of a +successful attack, and similarly, another track is temporarily un-muted to +signify when the player receives Special Damage.

+ +

 

+ +

At the end of combat, the music transitions +to a victory or defeat segment based on the outcome of battle.

+ +

1.1.4          +Mute/Un-mute Synchronization

+ +

JET can also synchronize the muting and +un-muting of tracks to events in the music. For example, in the FPS game, it +would probably be desirable to place the musical events relating to bonuses and +damage as close to the actual game event as possible. However, simply un-muting +a track at the moment the game event occurs might result in a music clip +starting in the middle. Alternatively, a clip could be started from the +beginning, but then it wouldn’t be synchronized with the other music tracks.

+ +

 

+ +

However, with the JET sync engine, a clip +can be started at the next opportune moment and maintain synchronization. This +can be accomplished by placing a number of short music clips on a decorative +track. A MIDI event in the stream signifies +the start of a clip and a second event signifies the end of a clip. When the +application calls the JET clip function, the next clip in the track is allowed +to play fully synchronized to the music. Optionally, the track can be +automatically muted by a second MIDI event.

+ +

 

+ +

+ +

Figure 3: Synchronized Mute/Unmute

+ +

1.2        +Audio Synchronization

+ +

JET provides an audio synchronization API +that allows game play to be synchronized to events in the audio. The mechanism +relies on data embedded in the MIDI file at +the time the content is authored. When the JET engine senses an event during +playback it generates a callback into the application program. The timing of +the callback can be adjusted to compensate for any latency in the audio +playback system so that audio and video can be synchronized. The diagram below +shows an example of a simple music game that involves pressing the left and +right arrows in time with the music.

+ +

 

+ +

 

+ +

+ +

Figure 4: Music Game with Synchronization

+ +

 

+ +

The arrows represent events in the music +sequence where game events need to be synchronized. In this case, the blue +arrow represents a time where the player is supposed to press the left button, +and the red arrow is for the right button. The yellow arrow tells the game +engine that the sequence is complete. The player is allowed a certain time +window before and after the event to press the appropriate key.

+ +

 

+ +

If an event is received and the player has +not pressed a button, a timer is set to half the length of the window. If the +player presses the button before the timer expires, the game registers a +success, and if not, the game registers a failure.

+ +

 

+ +

If the player presses the button before the +event is received, a timer is set to half the length of the window. If an event +is received before the timer expires, the game registers a success, and if not, +the game registers a failure. Game play might also include bonuses for getting +close to the timing of the actual event.

+ +

 

+ +

2         +JET Content Authoring Overview

+ +

To author JET files and hear them playback interactively, +the content author will work in two or three applications which are designed to +work together smoothly. The first is application is any off-the-shelf MIDI sequencing application or Digital Audio Workstation +that supports VST (for PC) or AU (for Mac) plugins. (Logic, SONAR, Cubase, etc) +Here the author will compose their MIDI music +files using the SONiVOX EAS Synth plugin as the playback synthesizer.

+ +

 

+ +

Once the composer has completed their MIDI file(s), they import them into the JET Creator application. +Here the author will setup and audition the conditions for interactive playback +within the JET enabled game.

+ +

 

+ +

Optionally, the author may elect to create +a custom DLS soundbank. This can be created in any off-the-shelf DLS authoring +application, such as Awave from MJSoft, and loaded into JET Creator along with +the MIDI files.

+ +

 

+ +

Below is an overview of this process. A +more detailed explanation of each step follows.

+ +

 

+ +
    +
  • Launch digital audio workstation (DAW)
  • +
      +
    • Assign the SONiVOX EAS Synth plugin as the playback + synthesizer
    • +
    • Optionally load a custom DLS2 soundset
    • +
    • Compose and save MIDI file(s)
    • +
    +
  • Launch the JET Creator application
  • +
      +
    • Create segments using the MIDI + and DLS2 source files
    • +
    • Add interactive elements
    • +
    • Audition interactive elements
    • +
    • Save and Export JET files for use in the Android application
    • +
    +
+ +

 

+ +

Launch DAW – Content authors will need to +use a third party MIDI authoring application to compose their MIDI +files. It is recommended they use a digital audio workstation (DAW) application +that supports VST or AU plugins as this will enable them to listen to the EAS +MIDI Synthesizer and DLS2 soundsets that will be utilized in the Android +application itself. Some examples of popular DAWs include SONAR (PC) and LOGIC +(MAC).

+ +

 

+ +

Assign SONiVOX EAS Synth plugin as the +playback synthesizer – The SONiVOX EAS Synth plugin is a VST and AU compatible +virtual instrument that plugs into VST or AU compatible DAWs. This software +plugin uses the same SONiVOX EAS MIDI synthesizer engine and default General +MIDI  wavetable soundset inherent in +Android. Using this plugin allows content authors to hear the exact audio +rendering of the instruments and MIDI file +that will be used in their Android applications.

+ +

 

+ +

Optionally Load DLS2 Soundset – The SONiVOX +EAS Synth plugin allows for the loading of any DLS2 compatible soundset for +playback. These could include a new GM wavetable set, or a small collection of +just a few custom instruments for a given application. Note, the DLS file does +not replace the internal GM wavetable used by the EAS engine. DLS soundsets +play in conjunction with the internal GM wavetable.

+ +

 

+ +

Compose MIDI File – Compose MIDI soundtracks for the Android application.

+ +

 

+ +

Launch JET Creator – Once all DLS2 and MIDI source files have been authored, the content author +should launch the JET Creator and begin creating JET Segments. The segments +will reference the MIDI files and any custom +DLS2 soundbanks.

+ +

 

+ +

Assign JET Segment Attributes – After +creating segments the content author interactive elements. Interactive elements +include mute and unmute settings of individual tracks in the MIDI file(s) as +well as MIDI controller numbers that serve as +“events” in the game. These attributes tell the JET engine how and when to play +the different musical segments according to the JET API commands in the Android +application. See below for more detail on this.

+ +

 

+ +

Audition Interactive Playback – After +assigning the segment attributes and creating the JET file, the content author +can audition all interactive playback elements in the JET Audition window.

+ +

 

+ +

Save .jtc File – After the author is +satisfied with the result, it is recommended they save the JET Creator .jtc +file which will save their settings, references to source files, etc.

+ +

 

+ +

Export Files – Exporting the JET Creator +file will bundle all source files and their attributes into a single .zip file. +The zip file will also contain a .jet file for use by the Android application.

+ +

 

+ +

 

+ +

3         +EAS Synth Virtual Instrument Plugin

+ +

Included in the JET Creator package is the +EAS software synthesizer in plug-in format. The EAS plugin synth allows the +composer to hear the instruments used in Android as they are composing their MIDI sequence. The EAS Synth plugin allows for the +loading of custom DLS2 sounds as well.

+ +

 

+ +

3.1        +Installing the EAS Synth Plugin

+ +

Follow the instructions for your individual +DAW to install and utilize the plugin. For Mac users this will typically +involve copying the “EAS Synth.componant” file into your plugins folder which +is usually located at /Library/Audio/Plug-ins/Components. PC users will want to +install the “EAS Synth.dll” into the plugin folder that their DAW requires.

+ +

 

+ +

3.2        +Requirements and Settings for +using the EAS Synth Plugin

+ +

The EAS Synth is an embedded synthesizer +for small mobile devices. This means it does not have the flexibility of high +end synthesizers typically utilized in a professional application such as +Logic, Digital Performer, etc. As such, only the following attributes are +supported.

+ +

 

+ +

Macintosh:

+ +

 

+ +

Mac OSX (Intel) Macs

+ +

ASIO Supported Soundcards

+ +

Sample Rate:    44100 hz

+ +

Buffer Size:       256 kbytes

+ +

 

+ +

PC:

+ +

 

+ +

Windows 2000 or Vista +operating systems

+ +

ASIO supported soundcards

+ +

Sample Rate:    44100 hz

+ +

Buffer Size:       256 kbytes

+ +

 

+ +

3.3        +Assigning MIDI +Tracks to use the EAS Synth

+ +

Each DAW has its own particular method of +assigning MIDI tracks to virtual instrument +plugins such as the SONiVOX EAS Synth. Please consult the user manual for your +DAW for detailed instructions. Below are some general guidelines for Logic +(Mac) and SONAR (PC).

+ +

3.3.1          +LOGIC 8

+ +

The SONiVOX EAS Synth virtual instrument is +a multi-timbral synthesizer. (i.e. it plays back multiple instruments on unique +MIDI channels in a single instance) In Logic +8, however, you’ll want to set up 16 Logic Instruments, +each with their own instance of the EAS Synth. Each Instrument should be assigned +its own MIDI channel. Use Channel 10 for +Drums. The reason for this is that MIDI controller messages, such as Volume +(CC7) and Pan (CC10) will not be channelized if the plugin is assigned to only +a single Instrument and all MIDI tracks are +set to playback on that Instrument. In order for each MIDI +channel to respond to its own controller messages, you must assign 16 different +EAS Synth instances to 16 unique Logic Instruments.

+ +

 

+ +

A Logic 8 template file has been included +in the Android Cupcake release to facilitate the above.

+ +

 

+ +

Playback in Logic 8 may require you to be +in record enable mode for each track you are auditioning. To record enable +multiple tracks hold down the Option key.

+ +

 

+ +

To write out a standard MIDI +(type 1) file from Logic, you need to use the File Export command. IMPORTANT: +Most edits in Logic are non-destructive edits meaning they are not modifying +the actual data but rather adding an overlay onto to the data. Quantize is one +such non-destructive edit. Therefore when you export a MIDI +file, you may not see your quanitization settings.

+ +

 

+ +

In addition, the mix parameters for volume, +pan and program changes may not appear in the event list and therefore may not +write out with the MIDI file. Before exporting +a MIDI file in Logic it is recommended you do +the following:

+ +

 

+ +

Select All and use the “Insert MIDI > +Insert MIDI Settings as Events” command.

+ +

 

+ +

Select All and use the “Apply Quantization +Settings Destructively” command.

+ +

 

+ +

3.3.2          +Cakewalk SONAR 7

+ +

Sonar 7 is a bit easier to set up, use and +save than Logic 8. Simply open or start a new MIDI +file. Go to the Insert menu and select Insert Soft Synth>SONiVOX>EAS +Synth. Then assign each MIDI track’s output to +the EAS Synth. There is no need to record enable a track to hear it play back. +When saving, be sure to select MIDI Type 1.

+ +

 

+ +

SONAR 8 works similarly to SONAR 7.

+ +

 

+ +

3.3.3          +Digital Performer

+ +

We’ve seen some instances when creating +content with Digital Performer where notes with a release velocity of non-0 +will generate an extra note-on event in the EAS synth. If you are hearing a +doubling, editing the release velocity events to zero should fix this problem.

+ +

 

+ +

3.4        +Using Custom DLS2 Soundsets

+ +

The SONiVOX EAS Synthesizer supports two +simultaneous soundsets or wavetables. One is the internal General MIDI wavetable +inherent to the SONiVOX EAS Synthesizer. The other is a Downloadable Sounds +Level 2 (DLS2) soundset. The internal wavetable is a GM Level 1 compliant +wavetable with 127 melodic instruments and 1 drumkit. It is in a proprietary +SONiVOX format. The DLS2 soundsets are an open format published by the MIDI +Manufactures Association.

+ +

 

+ +

In the Android Cupcake release, the +internal wavetable is only 200 kbytes, very small, in order to be compliant +with all Android devices which may not have a lot of memory. DLS2 soundsets can +be any size that a particular device supports. Upgraded (larger) internal +wavetables as well as custom DLS2 instruments can be licensed from SONiVOX.

+ +

3.4.1          +Loading a DLS2 Soundset

+ +

To load a custom soundset, click on the +Load DLS button in the EAS Synth plugin interface. Browse to the DLS2 file you +wish to load and say OK. Only DLS Level 2 formatted soundsets are +supported.

+ +

 

+ +

3.4.2          +Using a DLS2 Soundset

+ +

Since both the internal EAS GM wavetable +and a custom DLS2 soundset are used simultaneously, you must be sure you have +your MIDI Program Changes set correctly. DLS2 instruments must be assigned to a +Bank other than the default GM bank +used by the internal synthesizer.

+ +

 

+ +

The internal EAS synthesizer is assigned to +Banks 121 (melodic instruments) and 120 (drum instruments). This follows the +General MIDI Level 1 specification. Note: Most MIDI +sequencers require you to use Bank 0 to select the default wavetable. Custom +DLS2 soundsets, therefore, should utilize a different Bank. We recommend Bank +1.

+ +

 

+ +

The EAS synth supports MSB (Controller 0), +LSB (Controller 32) Bank change messages. There are two places you need to set +this Bank and Program Change number. The first is in your DLS2 soundset. Using +Bank 1, each Instrument would be assigned MSB 1, LSB 0, then the Instrument +Program Change number. The second place to use the Bank and Program Change +number is in your MIDI sequence.

+ +

 

+ +

In your MIDI +track, the MSB should be sent first followed by the LSB and then the Instrument +number. For example, if your DLS2 instrument is assigned MSB 1, LSB 0, +Program1, you would send CC0, 1 followed by CC32, 0 followed by Program Change +Message 1. This might look like the following in an event window:

+ +

 

+ +

 

+ +

+ +

 

+ +

 

+ +

 

+ +

4         +JET Creator Guidelines

+ +

JET Creator is the desktop application +where you’ll edit and audition the JET interactive music elements. For details +on the JET Creator application please see the “JET Creator User Manual”. Below +are some additional guidelines to help you out.

+ +

 

+ +

 

+ +

 

+ +

4.1        +Order of Tasks

+ +

As with all projects, its best to discuss and +design the interactive music scheme with the game designer and programmer +before beginning your composition. An outline and/or specification can go a +long way in saving you from having to redo things after the game is in place.

+ +

 

+ +

In general you’ll want to first write your +music in your DAW of choice the way you’re used to composing, then break up the +final MIDI file as needed for the application. +Next, move to JET Creator and create all of your music segments in the order +easiest to preview them when played in order. Finally, add the JET Events to +control the segments via the Android game and Audition them as needed in JET +Creator. Finally, save the project in JET Creator and hand off the .jet file to +the programmer to integrate it in the game. After previewing there will likely +be changes to the MIDI file(s) and JET Creator +attributes.

+ +

 

+ +

4.2        +Conserving Memory

+ +

If you’re trying to conserve memory, +compose as few MIDI files as possible, and create several segments from that MIDI file. For example a 12 bar MIDI +file with three sections of 4 bars, A, B, C, can create a much longer song. +Simply create multiple segments that reference the one MIDI +file, then order them however you like. For example, A, A, B, A, C, A, B, A, A +would create a 36 bar song. Use JET to add repeats, transpose segments, and +interactively mute and unmute tracks to keep it even more interesting.

+ +

 

+ +

4.3        +Replicate

+ +

To make adding segments or events faster, +use the Replicate command. Replicate can add multiple segments or events at one +time and uses an offset parameter and prefix naming convention to keep things +easy to read. The MOVE command is also useful for moving multiple events by a +set number of measures, beats or ticks.

+ +

 

+ +

4.4        +Interactive Options

+ +

There are several interactive audio +concepts possible in JET. Below are a few examples although we hope developers +will come up with others we haven’t thought of! These are:

+ +

4.4.1          +Multiple Segment Triggering

+ +

In this method the application is +triggering specific segments based on events in the game. For example a hallway +with lots of fighting might trigger segment 1 and a hallway with no fighting +might trigger segment 2. Using JET TriggerClips in conjunction with this method +creates even more diversity.

+ +

4.4.2          +Mute Arrays

+ +

In this method the application is +triggering mute and unmute events to specific tracks in a single MIDI sequence. For example a hallway with lots of +fighting might play MIDI tracks 1-16 and a +hallway with no fighting might play the same midi file but mute tracks 9-16. +Using JET TriggerClips in conjunction with this method creates even more +diversity.

+ +

4.4.3          +Music Driven Gameplay

+ +

Music driven gaming is similar to what +Guitar Hero and JETBOY have done in that the music content determines how +graphic events are displayed. The application then queries the user response to +the graphic events and interactively modifies the music in response. In this +method the game is utilizing JET Application Events, MIDI controllers that are +embedded in the MIDI file and read by the game +in real-time. Based on the user response, multiple segment triggering and/or +mute arrays can be set.

+ +

 

+ +

 

+ +
+ + + + diff --git a/docs/JET_Authoring_Guidelines_files/header.htm b/docs/JET_Authoring_Guidelines_files/header.htm new file mode 100755 index 0000000..4284a7a --- /dev/null +++ b/docs/JET_Authoring_Guidelines_files/header.htm @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

 

+ +

 

+ +
+ +
+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

SONiVOX JET Creator User Documentation    +Vrs.3   Page 1/13

+ +
+ + + + diff --git a/docs/JET_Authoring_Guidelines_files/image001.jpg b/docs/JET_Authoring_Guidelines_files/image001.jpg new file mode 100755 index 0000000..d244843 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image001.jpg differ diff --git a/docs/JET_Authoring_Guidelines_files/image002.emz b/docs/JET_Authoring_Guidelines_files/image002.emz new file mode 100755 index 0000000..f152c11 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image002.emz differ diff --git a/docs/JET_Authoring_Guidelines_files/image004.emz b/docs/JET_Authoring_Guidelines_files/image004.emz new file mode 100755 index 0000000..010c4bd Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image004.emz differ diff --git a/docs/JET_Authoring_Guidelines_files/image006.emz b/docs/JET_Authoring_Guidelines_files/image006.emz new file mode 100755 index 0000000..a29ebfd Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image006.emz differ diff --git a/docs/JET_Authoring_Guidelines_files/image008.gif b/docs/JET_Authoring_Guidelines_files/image008.gif new file mode 100755 index 0000000..17919fd Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image008.gif differ diff --git a/docs/JET_Authoring_Guidelines_files/image010.gif b/docs/JET_Authoring_Guidelines_files/image010.gif new file mode 100755 index 0000000..54111a0 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image010.gif differ diff --git a/docs/JET_Authoring_Guidelines_files/image011.png b/docs/JET_Authoring_Guidelines_files/image011.png new file mode 100755 index 0000000..1573b01 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image011.png differ diff --git a/docs/JET_Authoring_Guidelines_files/image012.gif b/docs/JET_Authoring_Guidelines_files/image012.gif new file mode 100755 index 0000000..4300d15 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image012.gif differ diff --git a/docs/JET_Authoring_Guidelines_files/image013.gif b/docs/JET_Authoring_Guidelines_files/image013.gif new file mode 100755 index 0000000..eb1aa37 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image013.gif differ diff --git a/docs/JET_Authoring_Guidelines_files/image014.gif b/docs/JET_Authoring_Guidelines_files/image014.gif new file mode 100755 index 0000000..4e99824 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image014.gif differ diff --git a/docs/JET_Authoring_Guidelines_files/image015.emz b/docs/JET_Authoring_Guidelines_files/image015.emz new file mode 100755 index 0000000..31cba25 Binary files /dev/null and b/docs/JET_Authoring_Guidelines_files/image015.emz differ diff --git a/docs/JET_Creator_User_Manual.htm b/docs/JET_Creator_User_Manual.htm new file mode 100644 index 0000000..8582f5f --- /dev/null +++ b/docs/JET_Creator_User_Manual.htm @@ -0,0 +1,3032 @@ + + + + + + + + + + + +SONiVOX JET Creator User Manual + + + + + + + + +
+   Copyright (C) 2009 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ +
+ +

JETCreator™ User Manual

+ +

Vrs 1.0

+ +

Content +Authoring Application for the

+ +

JET +Interactive Music Engine

+ +

Authored by SONiVOX

+ +

www.sonivoxrocks.com

+ +

Copyright 2009 Sonic Network, Inc.

+ + + +

 

+ +

 

+ +

1         +Introduction

+ +

1.1        +Overview

+ +

This document contains the user guidelines +for the SONiVOX JET Creator, an authoring application for creating and +auditioning JET files. JET is an interactive music player for small embedded +devices, including the Google Android platform. It allows applications to +include interactive music soundtracks, in MIDI +format, that respond in real-time to game play events and user interaction.

+ +

 

+ +

JET works in conjunction with SONiVOX’s +Embedded Audio Synthesizer (EAS) which is the MIDI +playback device for Android.  Both the +JET and EAS engines are integrated into the Android embedded platform as well +as inherent in the JET Creator application. As such, the JET content author can +be sure that the playback will sound exactly the same in both the JET Creator +and the final Android application playing back on Android mobile devices.

+ +

 

+ +

In addition to the graphical user +interface, there are two main functionalities taking place in JET Creator. The +first involves gathering all the source data (MIDI +files and DLS file), adding JET’s real-time attributes and building a JET +(.jet) file that the Android application will use. The second functionality +involves auditioning the interactive playback elements as they will take place +in the Android application.

+ +

 

+ +

The JET Creator application is written in +the Python programming language, therefore you need to have the current version +of Python and WXWidgets installed. There is both a Mac and Windows version.

+ +

 

+ +

 

+ +

1.2        +Abbreviations and Common Terms

+ +

 

+ +

It is important to use a common set of +terms to minimize confusion. Since JET uses MIDI +in a unique way, normal industry terms may not always suffice. Here is the +definition of terms as they are used in this document and in the JET Creator +application:

+ +

 

+ +

Channel: MIDI data associated with a specific MIDI +channel. Standard MIDI allows for 16 channels of MIDI +data each of which are typically associated with a specific instrument.

+ +

 

+ +

Controller: A MIDI event consisting of a +channel number, controller number, and a controller value. The MIDI spec associates many controller numbers with +specific functions, such as volume, expression, sustain pedal, etc. JET also +uses controller events as a means of embedding special control information in a +MIDI sequence to provide for audio synchronization.

+ +

 

+ +

DAW: Digital Audio Workstation. A common term for MIDI +and audio sequencing applications such as Logic, SONAR, Cubase and others.

+ +

 

+ +

EAS: Embedded MIDI Synthesizer. The +name of the SONiVOX MIDI synthesizer engine.

+ +

 

+ +

JET: Jet Interactive Engine. The name of the SONiVOX JET interactive +music engine.

+ +

 

+ +

M/B/T: Measures, Beats and Ticks

+ +

 

+ +

Segment: A musical section such as a chorus or verse that is a component of +the overall composition. In JET, a segment can be an entire MIDI file or a +derived from a portion of a MIDI file.

+ +

 

+ +

SMF-0: Standard MIDI File Type 0, a MIDI file that contains a single +track, but may be made up of multiple channels of MIDI +data.

+ +

 

+ +

SMF-1: Standard MIDI File Type 1, a MIDI file that contains a one more +tracks, and each track may in turn be made up of one or more channels of MIDI data. By convention, each channel is stored on a +separate track in an SMF-1 file. However, it is possible to have multiple MIDI +channels on a single track, or multiple tracks that contain data for the same MIDI channel.

+ +

 

+ +

Track: A single track in a DAW containing a timed sequence of MIDI events. Be careful not to confuse Tracks with +Channels. A MIDI file may contain many tracks with several tracks utilizing the +same MIDI channel.

+ +

 

+ +

 

+ +

1         +The JET Interactive Music Concept

+ +

Interactive music can be defined as music +that changes in real-time according to non-predictable events such as user +interaction or game play events. In this way, interactive music is much more +engaging as it has the ability to match the energy and mood of a game much +closer than a pre-composed composition that never changes. In some applications +and games, interactive music is central to the game play. Guitar Hero is one +such popular game. When the end user successfully ‘captures’ the musical notes +coming down the fret board, the music adapts itself and simultaneously keeps +score of successes and failures. JET allows for these types of music driven +games as well.

+ +

 

+ +

There are several methods for making and +controlling interactive music and JET is one such method. This section +describes the features of JET and how they might be used in a game or software +application. It also describes how JET can be used to save memory in small +footprint devices such as Android enabled mobile handsets.

+ +

1.1.1       Data Compression

+ +

JET supports a flexible music format that +can be used to create extended musical sequences with a minimal amount of data. +A musical composition is broken up into segments that can be sequenced to +create a longer piece. The sequencing can be fixed at the time the music file +is authored, or it can be created dynamically under program control.

+ +

1.1.2       Linear Music Example

+ +

+ +

Figure 1: Linear Music Piece

+ +

 

+ +

This diagram shows how musical segments are +stored. Each segment is authored as a separate MIDI +file. A post-processing tool combines the files into a single container file. +Each segment can contain alternate music tracks that can be muted or un-muted +to create additional interest. An example might be a brass accent in the chorus +that is played only the last time through. Also, segments can be transposed up +or down.

+ +

 

+ +

The bottom part of the diagram shows how +the musical segments can be recombined to create a linear music piece. In this +example, the bridge might end with a half-step key modulation and the remaining +segments could be transposed up a half-step to match.

+ +

1.1.3          +Non-linear Music Example

+ +

+ +

Figure 2: Non-linear music piece

+ +

 

+ +

In this diagram, we see a non-linear music +piece. The scenario is a first-person-shooter (FPS) and JET is providing the +background music. The intro plays as the level is loading and then transitions +under program control to the Searching segment. This segment is repeated indefinitely, +perhaps with small variations (using the mute/un-mute feature) until activity +in the game dictates a change.

+ +

 

+ +

As the player nears a monster lair, the +program starts a synchronized transition to the Danger segment, increasing the +tension level in the audio. As the player draws closer to the lair, additional +tracks are un-muted to increase the tension.

+ +

 

+ +

As the player enters into combat with the +monster, the program starts a synchronized transition to the Combat segment. +The segment repeats indefinitely as the combat continues. A Bonus Hit +temporarily un-mutes a decorative track that notifies the player of a +successful attack, and similarly, another track is temporarily un-muted to +signify when the player receives Special Damage.

+ +

 

+ +

At the end of combat, the music transitions +to a victory or defeat segment based on the outcome of battle.

+ +

1.1.4          +Mute/Un-mute Synchronization

+ +

JET can also synchronize the muting and +un-muting of tracks to events in the music. For example, in the FPS game, it would +probably be desirable to place the musical events relating to bonuses and +damage as close to the actual game event as possible. However, simply un-muting +a track at the moment the game event occurs might result in a music clip +starting in the middle. Alternatively, a clip could be started from the +beginning, but then it wouldn’t be synchronized with the other music tracks.

+ +

 

+ +

However, with the JET sync engine, a clip +can be started at the next opportune moment and maintain synchronization. This +can be accomplished by placing a number of short music clips on a decorative +track. A MIDI event in the stream signifies +the start of a clip and a second event signifies the end of a clip. When the +application calls the JET clip function, the next clip in the track is allowed +to play fully synchronized to the music. Optionally, the track can be +automatically muted by a second MIDI event.

+ +

 

+ +

+ +

Figure 3: Synchronized Mute/Unmute

+ +

1.2        +Audio Synchronization

+ +

JET provides an audio synchronization API +that allows game play to be synchronized to events in the audio. The mechanism +relies on data embedded in the MIDI file at +the time the content is authored. When the JET engine senses an event during +playback it generates a callback into the application program. The timing of +the callback can be adjusted to compensate for any latency in the audio +playback system so that audio and video can be synchronized. The diagram below +shows an example of a simple music game that involves pressing the left and +right arrows in time with the music.

+ +

 

+ +

 

+ +

+ +

Figure 4: Music Game with Synchronization

+ +

 

+ +

The arrows represent events in the music sequence +where game events need to be synchronized. In this case, the blue arrow +represents a time where the player is supposed to press the left button, and +the red arrow is for the right button. The yellow arrow tells the game engine +that the sequence is complete. The player is allowed a certain time window +before and after the event to press the appropriate key.

+ +

 

+ +

If an event is received and the player has +not pressed a button, a timer is set to half the length of the window. If the +player presses the button before the timer expires, the game registers a +success, and if not, the game registers a failure.

+ +

 

+ +

If the player presses the button before the +event is received, a timer is set to half the length of the window. If an event +is received before the timer expires, the game registers a success, and if not, +the game registers a failure. Game play might also include bonuses for getting +close to the timing of the actual event.

+ +

 

+ +

2         +JET Content Authoring Overview

+ +

To author JET files and hear them playback +interactively, the content author will work in two applications which are +designed to work together smoothly. The first is application is any +off-the-shelf MIDI sequencing application that +supports VST (for PC) or AU (for Mac) plugins. Here the author will compose +their MIDI music files using the plugin as the +synthesizer device. The second application is the JET Creator application. Here +the author will import their MIDI music files +(and optionally a DLS2 soundset) and setup the conditions for interactive +playback within the JET enabled game. Optionally the content author may create +a custom set of DLS instruments using an instrument editor that supports the +DLS Level 2 format. One such application is Awave from MJSoft.

+ +

 

+ +

Please see the JET Content Authoring Guidelines documentation for additional +details on content authoring.

+ +

 

+ +

3         +Installing and Launching JET +Creator

+ +

JET Creator is a python language +application, therefore, you must have Python and wxPython installed on your +machine.

+ +

 

+ +

JetCreator was created and tested with:

+ +

 

+ +

Python Version 2.5.4

+ +

wxPython Version 2.8.7.1

+ +

 

+ +

These can be downloaded here:

+ +

 

+ +

PC:

+ +

http://www.python.org/download/releases/2.5.4/

+ +

http://www.wxpython.org/download.php

+ +

 

+ +

MAC:

+ +

http://wiki.python.org/moin/MacPython/Leopard

+ +

http://www.wxpython.org/download.php

+ +

 

+ +

After installing Python and wxPython, +simply unzip or copy all the files in the JET Creator application directory to +a folder on your hard drive.

+ +

                                                    

+ +

To launch JET Creator go to a command +prompt and set the directory to where you’ve installed Python. Next run python +with the command:

+ +

 

+ +

python +jetcreator.py

+ +

 

+ +

 

+ +

4         +Using JET Creator

+ +

 

+ +

4.1        +File Types

+ +

There are a few different file types +associated with JET Creator.

+ +

 

+ +

.jtc        JET +Creator project file. This file contains all the information associated with a +JET Creator project. When you Save or Save-as out of JET Creator, this file +type is saved.

+ +

 

+ +

.jet        JET +File. This output file is automatically generated from JET Creator whenever you +save your JET Creator project. This is the file that bundles all JET assets +together into a single file that the Android application will use. Give this +file to the Android application developer.

+ +

 

+ +

.mid      MIDI File. This is the standard MIDI +type 1 file that JET Creator will use to make segments.

+ +

 

+ +

.seg      Segment +File. This is a JET Segment file. It has the same name as the MIDI +file which it references but contains additional Segment information.

+ +

 

+ +

.zip       Zip +Archive file. When you Export a JET Archive, a zip file is created that +contains all the assets (files) necessary for JET Creator. Use this to transfer +JET Creator projects to other people.

+ +

 

+ +

4.2        +Open Dialog

+ +

When +you first launch JET Creator you are presented with an open dialog like the +following.

+ +

 

+ +

+ +

 

+ +

 

+ +

Open will open an existing .jtc (JET Creator file) file. Use the browser +button to browse to the directory where you have saved your .jtc file.

+ +

 

+ +

New will create a new .jtc file.

+ +

 

+ +

Import will import a JET Archive (.zip) file.

+ +

 

+ +

Cancel will cancel the dialog and exit the application.

+ +

 

+ + + +

5         +Main Window

+ +

The main window of the JET Creator +application looks like the picture below. There are three main sections from +top to bottom: segment view, event view, and timeline.

+ +

 

+ +

The segment view section displays a list of +the current segments, which MIDI file and +(optionally) DLS2 file each segment is derived from. It also shows each +segments start and stop time and each segments quantize, transpose, repeat and +mute flag settings.

+ +

 

+ +

Just below the Segment view is the event +view. The event view section displays all events associated with a given +segment. Events only display when the segment they are assigned to is +highlighted. Each event displays its type, start and end points, track and midi +channel assignment, and its event ID.

+ +

 

+ +

Just below the Event view is the timeline +display. The timeline shows how many measures a given segment is as well as any +events associated with that segment. The timeline changes to display the +currently selected or playing segment. You can trigger an event in this window +while the segment is play by simply clicking on the event in the timeline +display.

+ +

 

+ +

 

+ +

+ +

 

+ +

JET +Creator Main Window

+ +

 

+ +

 

+ +

The buttons along the left side of main +window do the following:

+ +

 

+ +

Add:                    - +Displays the segment or event window for adding a new segment or event

+ +

Revise:                - +Displays the segment or event window for updating an existing segment or event

+ +

Delete:                 - +Deletes the selected segment or event (will ask for confirmation)

+ +

Move:                  - +Displays the move window which allows you to move selected segments or events +in time

+ +

Queue All:            - Queue’s +(selects) all segments for playback

+ +

Dequeue All:        - Dequeue’s +(deselects) all segments

+ +

Play:                    - +Starts playback of all queue’d segments. This button changes to Stop if any +segments are playing

+ +

Audition:              - +Displays the Audition window (see below)

+ +

 

+ +

5.1        +Segment Window

+ +

The segment window is where a given +segment’s attributes are assigned and auditioned, as shown in the picture +below. The left side of the window displays the segments attributes that are +stored in the JET file. The right side of the window allows the author to set +mute flags, repeat and transpose settings and audition the segment as it will +play in the JET game.

+ +

 

+ +

Note: the audition attributes (mute flags, repeat and transpose) are not stored in the JET content file +(.jet) but rather are defined by the game or application itself. In programming +language, these settings correspond directly with the API calls to the JET +engine. By including them here, the JET content author can simulate how the +segment will respond to the applications API commands during game play.

+ +

 

+ +

 

+ +

+ +

 

+ +

 

+ +

The segment parameters do the following:

+ +

 

+ +

Segment Name             - Sets +the name of the segment

+ +

MIDI File                       - +The name and location of the MIDI file from which +the segment is derived. The button to the immediate right will bring up a +browser for locating a midi file on the hard drive.

+ +

DLS File                       - +The name and location of the DLS2 file, if any, that the MIDI +file uses for that segment.

+ +

Starting M/B/T               - +Starting measure, beat and tick of the segment

+ +

Ending M/B/T                - +Ending measure, beat and tick of the segment

+ +

Quantize                       - +Quantize value for quantizing the current segment during playback

+ +

 

+ +

 

+ +

The audition fields are as follows:

+ +

 

+ +

Track Mutes                  - +Shows the MIDI tracks (not channels) +in the MIDI file. Clicking on a track’s +checkbox will mute that track.

+ +

Channel                        - +Displays the MIDI channel assigned to each +track

+ +

Name                            - +Displays the track name meta event (if present) for each track

+ +

Repeat                          - +Indicates the number of times a segment should repeat during playback

+ +

Transpose                     - +Indicates the transposition in semi-tones or half-steps a segment should +transpose during playback

+ +

 

+ +

To the right of the Audition window are a few additional buttons. +These do as follows:

+ +

 

+ +

OK                               - +Selecting OK confirms all segment settings and closes the segment window

+ +

Cancel                          - +Selecting Cancel cancels any changes and closes the segment window

+ +

Replicate                      - +Displays the Replicate Segment window for entering multiple segments at once. +See below.

+ +

Play/Stop Segment       - Starts +or Stops playback of the segment using the segment attributes assigned.

+ +

Play/Stop MIDI File       - +Starts or Stops playback of the MIDI file +which the segment is assigned to.

+ +

Pause/Resume              - +Pauses or Resumes playback.

+ +

 

+ +

 

+ +

5.2        +Event Window

+ +

The event window is where a given segment’s +event attributes are assigned and auditioned, as shown in the picture below. To +add an event to a segment, the author must first select the segment which will +contain the event, then select the Add button. This will bring up the Event +window.

+ +

 

+ +

+ +

 

+ +

 

+ +

There are two main sections to the event +window. The segment section on the left side of the event window is for display +only. It shows what the segment attributes are for the given segment. The Event +section, on the right side, is where events can be assigned. The following +parameters are available:

+ +

 

+ +

Event Name                    - +Assigns a name to an event

+ +

Event Type                     - +Selects which type of event to assign.

+ +

Starting M/B/T                - +Sets the starting measure, beat, and tick for the event

+ +

Ending M/B/T                 - +Sets the ending measure, beat, and tick for the event, if applicable

+ +

Track                              - +Sets which track in the given segment the event will apply to

+ +

Channel                          - +Sets which MIDI channel the event will apply +to. The MIDI channel should match the MIDI +channel of the track

+ +

Event ID                         - +Sets the event ID for the event. Multiple events can be assigned to the same +segment and therefore the Event ID is used to identify them

+ +

 

+ +

To the right of the Audition window are a few additional buttons. +These do as follows:

+ +

 

+ +

OK                               - +Selecting OK confirms all event settings and closes the event window

+ +

Cancel                          - +Selecting Cancel cancels any changes and closes the event window

+ +

Replicate                      - +Displays the Replicate Event window for entering multiple events at once. See +below.

+ +

Play/Stop                     - +Starts or Stops playback of the segment using the segment attributes assigned. +While the segment is playing, events can be triggered and auditioned.

+ +

Trigger                          - +Triggers the event assigned. This replicates the API command that the JET game +will use to trigger the event, therefore giving the content author a method for +auditioning the behaviour of the event.

+ +

Mute/UnMute                 - +Mute/UnMute will mute or unmute the track that the event is assigned to

+ +

Pause/Resume              - +Pauses or Resumes playback.

+ +

 

+ +

To audition the behaviour of an event, you +can select the Play button. This will initiate playback. The trigger button +will send the trigger event when pressed. This is equivalent to selecting the +green trigger event in the timeline.

+ +

 

+ +

Note: Trigger events are meant to unmute a +single track of a segment when triggered, then mute that track at the end of +the trigger segment. Therefore you should make sure the mute flag is set to +mute the track that a trigger event will be unmuting when receiving a trigger event. +

+ +

 

+ +

Please read Section 7 “Under The Hood” +below for details on how trigger events work and behave.

+ +

 

+ +

5.3        +Replicate Windows

+ +

Often in creating JET files, you’ll need to +create tens or even hundreds of events. You may also need to move events. The +Replicate and Move windows allow for this. There are two Replicate windows for +creating multiple segments or events. They look like the following:

+ +

 

+ +

+ +

 

+ +

Replicate Segment Window

+ +

 

+ +

 

+ +

 

+ +

+ +

 

+ +

Replicate Event Window

+ +

 

+ +

Both Replicate windows function the same. +After creating an initial segment or event, you can select the Replicate +button. The parameters are as follows:

+ +

 

+ +

Name Prefix                  - +Sets the prefix for the name of each segment or event created

+ +

Starting M/B/T               - +Sets the starting time for the first segment or event

+ +

Increment M/B/T            - +Sets the time between segments or events created.

+ +

Number                         - +Sets the number of segments or events you wish to create. If the number +overflows the length of the MIDI file (for +segments) or segment (for events), those objects will not be created.

+ +

Preview                         - +Preview allows you to examine the objects created before saying OK to insert +them.

+ +

 

+ +

 

+ +

5.4        +Move Windows

+ +

The Move function acts similarly to the +Replicate function in that it allows you to edit multiple segments or events at +one time, in this case move them in time. Like Replicate, there are two Move +windows, one for Segments and one for Events. The windows look like the +following:

+ +

 

+ +

+ +

 

+ +

Move Event Window

+ +

 

+ +

To use Move, first select the segments or +events you wish to move in time, then click the Move button. The parameters are +as follows:

+ +

 

+ +

Starting M/B/T               - +Sets the starting time for the first segment or event

+ +

Increment M/B/T            - +Sets the time in M/B/T you wish to move the objects by.

+ +

Preview                         - +Preview allows you to examine the objects created before saying OK to move +them.

+ +

 

+ +

 

+ +

5.5        +Audition Window

+ +

Clicking the Audition button in the main +window of the JET Creator application will open the Audition window. This is +where the content author or application programmer can simulate the interactive +playback as it may occur in the mobile application or game itself.

+ +

 

+ +

+ +

 

+ +

JET Audition Window

+ +

 

+ +

 

+ +

There are four main sections to the +audition window. The left most section displays the available segments and +their length in seconds. The middle section displays a running list of what +segments are queued for playback and what their playback status is. The far +right section displays the mute flags for the currently playing segment. The +timeline section at the bottom is the same as in the main window. It displays +the currently playing segment as well as a visual display of any event triggers +associated with that segment.

+ +

 

+ +

The Audition window allows you to queue up +any segment in any order for playback. To do this simply select the segment you +wish to cue and hit Queue. That segment will appear in the queue window and +start playing (if it is the first segment). Subsequently you can select any +other segment or segments and cue them up for playback. As the segments +complete playback, the next segment in the queue will begin playing. As is the +other windows of JET Creator, you can mute, unmute, trigger event clips, etc. +in realtime as each segment is playing back.

+ +

 

+ +

Specifically the buttons behave as follows:

+ +

 

+ +

Queue                           - +loads the selected segment into the queue and starts playback

+ +

Cancel and Queue         - +cancels the currently playing segment before queueing the selected segment for +playback

+ +

Cancel Current               - +cancels the currently playing segment in the queue and begins playback of the +next segment

+ +

Stop                             - +stops playback of all queued segments

+ +

Mute All                        - +mutes all tracks in the current segment

+ +

Mute None                    - +unmutes all tracks in the current segment

+ +

Original Mutes               - +sets the original mute flags for the current segment

+ +

 

+ +

The combination of these playback options +allows an author or application programmer to audition any behaviour an +interactive music application may encounter.

+ +

 

+ +

 

+ +

5.6        +JET Creator Menus

+ +

The JET Creator menus provide access to +many of the parameters in the main window plus a few additional parameters.

+ +

5.6.1          +File Menu

+ +

The File Menu contains the following +elements:

+ +

 

+ +

New                              - +Creates a new JET Creator file (.jtc)

+ +

Open                            - +Opens an existing JET Creator file

+ +

Save                             - +Saves the currently opened JET Creator file

+ +

Save As                        - +Saves the currently opened JET Creator file to a new file

+ +

Import Project               - Imports a JET Creator archive (.zip)

+ +

Export Project               - Exports a JET Creator archive (.zip)

+ +

Exit                              - +Exits the application

+ +

 

+ +

5.6.2          +Edit Menu

+ +

The Edit Menu contains the following +elements:

+ +

 

+ +

Undo                            - +Undo will undo the last edit made

+ +

Redo                            - +Redo will redo the last undo

+ +

Cut                               - +Copy selected parameter into clipboard and Delete selection

+ +

Copy                            - +Copy selected parameter into clipboard and keep selection

+ +

Paste                            - +Paste selected parameter

+ +

 

+ +

5.6.3          +JET

+ +

The Edit Menu contains the following +elements:

+ +

 

+ +

Properties                     - +Brings up the JET Creator priorities window. This window allows you to set the +following conditions for a given JET file:

+ +

Copyright Info               - Contains copyright info to be inserted into JET file

+ +

Chase Controllers          - Option to chase controllers (on/off). This should usually +be ON.

+ +

Delete Empty Tracks     - Deletes any empty MIDI tracks

+ +

 

+ +

5.6.4          +Segments

+ +

The Segments Menu contains the following +elements:

+ +

 

+ +

Add Segment                - +Brings up the Segment window

+ +

Update Segment           - Updates segment attributes

+ +

Delete Segment                        - Deletes the current segment from the +Segment List

+ +

 

+ +

5.6.5          +Help

+ +

The Help Menu will contain at least the +following elements:

+ +

 

+ +

JET Creator Help           - will launch PDF help document or go to on-line help

+ +

About                           - +JET Creator version number, SONiVOX info

+ +

 

+ +

 

+ +

6         +Trigger Events Explained

+ +

Breaking a MIDI +file into individual (non-linear) segments and queueing up those segments for +playback in a game based on events within the game is one way JET music files are +interactive. Trigger events are an additional method for interactive playback. +Both would be used together in an interactive game or application.

+ +

 

+ +

Trigger events allow for the following:

+ +

 

+ +
    +
  1. Tracks within a MIDI segment can be turned on or off based on game + events. For example the composer could author two drum tracks, one fast + and one slow. If the action in a game is fast, the fast drum track could + play. If the action in the game is slow, the slow drum track can play.
  2. +
  3. User actions can be compared to trigger events which are + pre-inserted into a music file at musically ‘correct’ places. Based on the + results, scoring or other game actions can take place.
  4. +
  5. Musical transitions between levels or action sequences can be + synchronized to be musically seemless.
  6. +
+ +

 

+ +

Under the hood, JET uses standard MIDI CC +events to accomplish these actions and to synchronize audio. The controllers +used by JET are among those not defined for specific use by the MIDI specification. The specific controller definitions +are as follows:

+ +

 

+ +

            Controllers +80-83           Reserved for use by +application

+ +

            Controller +102                JET event marker

+ +

            Controller +103                JET clip marker

+ +

            Controllers +104-119        Reserved for future use

+ +

 

+ +

6.1        +JET Clip Marker (CC103)

+ +

Controller 103 is reserved for marking +clips in a MIDI track that can be triggered by +the JET_TriggerClip API call. The clip ID is encoded in the low 6 bits of the +controller value. Bit 6 is set to one to indicate the start of a clip, and set +to zero to indicate the end of a clip.

+ +

 

+ +

For example, to identify a clip with a clip +ID of 1, the author inserts a MIDI controller +event with controller=103 and value=65 at the start of the clip and another +event with controller=103 and value=1 at the end of the clip. When the +JET_TriggerClip() function is called with a clip ID of 1, the track will be +un-muted when the controller value 65 is encountered and muted again when the +controller value 1 is encountered.

+ +

 

+ +

+ +

Figure 5: Synchronized Clip

+ +

 

+ +

In the figure above, if the +JET_TriggerClip() function is called prior to the first controller event, Track +3 will be un-muted when the first controller event occurs, the first clip will +play, and the track will be muted when the second controller event occurs. If +the JET_TriggerClip() function is called after the first controller event has +occurred, Track 3 will be un-muted when the third controller event occurs, the +second clip will play, and the track will be muted again when the fourth +controller event occurs.

+ +

 

+ +

Note: Normally, the track containing the clip is muted by the application +when the segment is initially queued by the call to JET_QueueSegment(). If it +is not muted, the clip will always play until Jet_TriggerClip() has been called +with the clip ID.

+ +

 

+ +

6.2        +JET Event Marker (CC102)

+ +

Controller 102 is reserved for marking +events in the MIDI streams that are specific +to JET functionality. Currently, the only defined value is 0, which marks the +end of a segment for timing purposes.

+ +

 

+ +

Normally, JET starts playback of the next +segment (or repeats the current segment) when the MIDI +end-of-track meta-event is encountered. Some MIDI +authoring tools make it difficult to place the end-of-track marker accurately, +resulting in synchronization problems when segments are joined together.

+ +

 

+ +

To avoid this problem, the author can place +a JET end-of-segment marker (controller=102, value=0) at the point where the +segment is to be looped. When the end-of-segment marker is encountered, the +next segment will be triggered, or if the current segment is looped, playback +will resume at the start of the segment.

+ +

 

+ +

The end-of-segment marker can also be used +to allow for completion of a musical figure beyond the end of measure that +marks the start of the next segment. For example, the content author might +create a 4-bar segment with a drum fill that ends on beat 1 of the 5th +bar – a bar beyond the natural end of the segment. By placing an end-of-segment +marker at the end of the 4th bar, the next segment will be +triggered, but the drum fill will continue in parallel with the next segment +providing musical continuity.

+ +

 

+ +

+ +

Figure 6: End-of-segment Marker

+ +

6.3        +Application Controllers +(CC80-83)

+ +

The application may use controllers in this +range for its own purposes. When a controller in this range is encountered, the +event is entered into an event queue that can be queried by the application. +Some possible uses include synchronizing video events with audio and marking a +point in a MIDI segment to queue up the next +segment. The range of controllers monitored by the application can be modified +by the application during initialization.

+ +

 

+ +
+ + + + diff --git a/docs/JET_Creator_User_Manual_files/header.htm b/docs/JET_Creator_User_Manual_files/header.htm new file mode 100755 index 0000000..e7a72f2 --- /dev/null +++ b/docs/JET_Creator_User_Manual_files/header.htm @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +


+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

 

+ +

 

+ +

 

+ +

 

+ +

 

+ +
+ +
+ +

SONiVOX JET Creator User Documentation    +Vrs.3   Page 1/20

+ +

 

+ +
+ + + + diff --git a/docs/JET_Creator_User_Manual_files/image001.emz b/docs/JET_Creator_User_Manual_files/image001.emz new file mode 100755 index 0000000..f152c11 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image001.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image002.gif b/docs/JET_Creator_User_Manual_files/image002.gif new file mode 100755 index 0000000..eb1aa37 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image002.gif differ diff --git a/docs/JET_Creator_User_Manual_files/image003.emz b/docs/JET_Creator_User_Manual_files/image003.emz new file mode 100755 index 0000000..010c4bd Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image003.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image004.gif b/docs/JET_Creator_User_Manual_files/image004.gif new file mode 100755 index 0000000..4e99824 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image004.gif differ diff --git a/docs/JET_Creator_User_Manual_files/image005.emz b/docs/JET_Creator_User_Manual_files/image005.emz new file mode 100755 index 0000000..a29ebfd Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image005.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image006.gif b/docs/JET_Creator_User_Manual_files/image006.gif new file mode 100755 index 0000000..17919fd Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image006.gif differ diff --git a/docs/JET_Creator_User_Manual_files/image007.emz b/docs/JET_Creator_User_Manual_files/image007.emz new file mode 100755 index 0000000..31cba25 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image007.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image008.gif b/docs/JET_Creator_User_Manual_files/image008.gif new file mode 100755 index 0000000..54111a0 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image008.gif differ diff --git a/docs/JET_Creator_User_Manual_files/image009.png b/docs/JET_Creator_User_Manual_files/image009.png new file mode 100755 index 0000000..0d5a14d Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image009.png differ diff --git a/docs/JET_Creator_User_Manual_files/image010.jpg b/docs/JET_Creator_User_Manual_files/image010.jpg new file mode 100755 index 0000000..d0dbb1d Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image010.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image011.png b/docs/JET_Creator_User_Manual_files/image011.png new file mode 100755 index 0000000..29c47ec Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image011.png differ diff --git a/docs/JET_Creator_User_Manual_files/image012.jpg b/docs/JET_Creator_User_Manual_files/image012.jpg new file mode 100755 index 0000000..ac54829 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image012.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image013.png b/docs/JET_Creator_User_Manual_files/image013.png new file mode 100755 index 0000000..b0434d7 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image013.png differ diff --git a/docs/JET_Creator_User_Manual_files/image014.jpg b/docs/JET_Creator_User_Manual_files/image014.jpg new file mode 100755 index 0000000..18212b3 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image014.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image015.png b/docs/JET_Creator_User_Manual_files/image015.png new file mode 100755 index 0000000..807797e Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image015.png differ diff --git a/docs/JET_Creator_User_Manual_files/image016.jpg b/docs/JET_Creator_User_Manual_files/image016.jpg new file mode 100755 index 0000000..fa7931d Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image016.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image017.png b/docs/JET_Creator_User_Manual_files/image017.png new file mode 100755 index 0000000..ca200d1 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image017.png differ diff --git a/docs/JET_Creator_User_Manual_files/image018.jpg b/docs/JET_Creator_User_Manual_files/image018.jpg new file mode 100755 index 0000000..64bb5c3 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image018.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image019.png b/docs/JET_Creator_User_Manual_files/image019.png new file mode 100755 index 0000000..7867902 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image019.png differ diff --git a/docs/JET_Creator_User_Manual_files/image020.jpg b/docs/JET_Creator_User_Manual_files/image020.jpg new file mode 100755 index 0000000..9943ae2 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image020.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image021.png b/docs/JET_Creator_User_Manual_files/image021.png new file mode 100755 index 0000000..690dcad Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image021.png differ diff --git a/docs/JET_Creator_User_Manual_files/image022.jpg b/docs/JET_Creator_User_Manual_files/image022.jpg new file mode 100755 index 0000000..7b517fa Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image022.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image023.png b/docs/JET_Creator_User_Manual_files/image023.png new file mode 100755 index 0000000..43f0fb1 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image023.png differ diff --git a/docs/JET_Creator_User_Manual_files/image024.jpg b/docs/JET_Creator_User_Manual_files/image024.jpg new file mode 100755 index 0000000..cea31c8 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image024.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image025.emz b/docs/JET_Creator_User_Manual_files/image025.emz new file mode 100755 index 0000000..1668a8e Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image025.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image026.gif b/docs/JET_Creator_User_Manual_files/image026.gif new file mode 100755 index 0000000..f9a4a89 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image026.gif differ diff --git a/docs/JET_Creator_User_Manual_files/image027.emz b/docs/JET_Creator_User_Manual_files/image027.emz new file mode 100755 index 0000000..2b06699 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image027.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image028.gif b/docs/JET_Creator_User_Manual_files/image028.gif new file mode 100755 index 0000000..1d18152 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image028.gif differ diff --git a/docs/JET_Creator_User_Manual_files/image029.jpg b/docs/JET_Creator_User_Manual_files/image029.jpg new file mode 100755 index 0000000..d244843 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image029.jpg differ diff --git a/docs/JET_Creator_User_Manual_files/image030.emz b/docs/JET_Creator_User_Manual_files/image030.emz new file mode 100755 index 0000000..f152c11 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image030.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image031.emz b/docs/JET_Creator_User_Manual_files/image031.emz new file mode 100755 index 0000000..010c4bd Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image031.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image032.emz b/docs/JET_Creator_User_Manual_files/image032.emz new file mode 100755 index 0000000..a29ebfd Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image032.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image033.emz b/docs/JET_Creator_User_Manual_files/image033.emz new file mode 100755 index 0000000..31cba25 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image033.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image034.emz b/docs/JET_Creator_User_Manual_files/image034.emz new file mode 100755 index 0000000..1668a8e Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image034.emz differ diff --git a/docs/JET_Creator_User_Manual_files/image035.emz b/docs/JET_Creator_User_Manual_files/image035.emz new file mode 100755 index 0000000..2b06699 Binary files /dev/null and b/docs/JET_Creator_User_Manual_files/image035.emz differ diff --git a/docs/JET_Programming_Manual.htm b/docs/JET_Programming_Manual.htm new file mode 100644 index 0000000..198a9e6 --- /dev/null +++ b/docs/JET_Programming_Manual.htm @@ -0,0 +1,1333 @@ + + + + + + + + + + + +JET PROGRAMMING MANUAL + + + + + + + + +
+   Copyright (C) 2009 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ +
+ +

JET™ Programming Manual

+ +

JET +Interactive Music Engine

+ +

Vrs 2.0

+ +

Authored by SONiVOX

+ +

www.sonivoxrocks.com

+ +

Copyright 2009 Sonic Network, Inc.

+ + + +

 

+ +

 

+ +

 

+ +

Introduction

+ +

This document contains programmer guidelines for the SONiVOX +JET Interactive Music System. JET is an interactive music player for small +embedded devices, including the Google Android platform. It allows applications +to include interactive music soundtracks, in MIDI +format, that respond in real-time to game play events and user interaction.

+ +

 

+ +

JET works in conjunction with SONiVOX’s Embedded Audio +Synthesizer (EAS) which is the MIDI playback +device for Android.  Both the JET and EAS +engines are integrated into the Android embedded platform as well as inherent +in JET Creator, an application for +authoring JET content files. As such, the JET content author can be sure that +the playback will sound exactly the same in both JET Creator and the final Android application playing back on +Android mobile devices.

+ +

 

+ +

The programmer of a JET application will want to work +closely with the content author in designing how real-time application events +and music will interactively work together. Once decided, the content author +will create the content and ultimately save a .jet file for the programmer to +include in the application.

+ +

 

+ +

Please see “JET Creator User Documentation” for additional +information on authoring JET content.

+ +

 

+ +

Abbreviations and Common Terms

+ +

It is important to use a common set of terms to minimize confusion. +Since JET uses MIDI in a unique way, normal +industry terms may not always suffice. Here is the definition of terms as they +are used in this document and in the JET Creator application:

+ +

 

+ +

Channel: MIDI data +associated with a specific MIDI channel. +Standard MIDI allows for 16 channels of MIDI +data each of which are typically associated with a specific instrument.

+ +

 

+ +

Controller: A MIDI event consisting of a channel number, controller +number, and a controller value. The MIDI spec +associates many controller numbers with specific functions, such as volume, +expression, sustain pedal, etc. JET also uses controller events as a means of +embedding special control information in a MIDI +sequence to provide for audio synchronization.

+ +

 

+ +

DAW: Digital Audio +Workstation. A common term for MIDI and audio +sequencing applications such as Logic, SONAR, Cubase and others.

+ +

 

+ +

EAS: Embedded MIDI Synthesizer. The name of the SONiVOX MIDI +synthesizer engine.

+ +

 

+ +

JET: Jet +Interactive Engine. The name of the SONiVOX JET interactive music engine.

+ +

 

+ +

Segment: A musical +section such as a chorus or verse that is a component of the overall +composition. In JET, a segment can be an entire MIDI file or a derived from a +portion of a MIDI file.

+ +

 

+ +

SMF-0: Standard +MIDI File Type 0, a MIDI file that contains a single track, but may be made up +of multiple channels of MIDI data.

+ +

 

+ +

SMF-1: Standard +MIDI File Type 1, a MIDI file that contains a one more tracks, and each track +may in turn be made up of one or more channels of MIDI +data. By convention, each channel is stored on a separate track in an SMF-1 +file. However, it is possible to have multiple MIDI channels on a single track, +or multiple tracks that contain data for the same MIDI +channel.

+ +

 

+ +

Track: A single +track in a DAW containing a timed sequence of MIDI +events. Be careful not to confuse Tracks with Channels. A MIDI file may contain +many tracks with several tracks utilizing the same MIDI +channel.

+ +

 

+ +

 

+ +

The JET +Interactive Music Concept

+ +

Interactive music can be defined as music that changes in +real-time according to non-predictable events such as user interaction or game +play events. In this way, interactive music is much more engaging as it has the +ability to match the energy and mood of a game much closer than a pre-composed +composition that never changes. In some applications and games, interactive +music is central to the game play. Guitar Hero is one such popular game. When +the end user successfully ‘captures’ the musical notes coming down the fret +board, the music adapts itself and simultaneously keeps score of successes and +failures. JET allows for these types of music driven games as well.

+ +

 

+ +

There are several methods for making and controlling +interactive music and JET is one such method. This section describes the +features of JET and how they might be used in a game or software application. +It also describes how JET can be used to save memory in small footprint devices +such as Android enabled mobile handsets.

+ +

 

+ +

JET Operation

+ +

JET supports a flexible music format that can be used to +create extended musical sequences with a minimal amount of data. A musical +composition is broken up into segments that can be sequenced to create a longer +piece. The sequencing can be fixed at the time the music file is authored, or +it can be created dynamically under program control.

+ +

Linear Music +Example

+ +

+ +

Figure 1: Linear Music Piece

+ +

 

+ +

This diagram shows how musical segments are stored. Each +segment is authored as a separate MIDI file. A +post-processing tool combines the files into a single container file. Each +segment can contain alternate music tracks that can be muted or un-muted to +create additional interest. An example might be a brass accent in the chorus +that is played only the last time through. Also, segments can be transposed up +or down.

+ +

 

+ +

The bottom part of the diagram shows how the musical +segments can be recombined to create a linear music piece. In this example, the +bridge might end with a half-step key modulation and the remaining segments +could be transposed up a half-step to match.

+ +

Non-linear Music Example

+ +

+ +

Figure 2: Non-linear music piece

+ +

 

+ +

In this diagram, we see a non-linear music piece. The +scenario is a first-person-shooter (FPS) and JET is providing the background +music. The intro plays as the level is loading and then transitions under +program control to the Searching segment. This segment is repeated +indefinitely, perhaps with small variations (using the mute/un-mute feature) +until activity in the game dictates a change.

+ +

 

+ +

As the player nears a monster lair, the program starts a +synchronized transition to the Danger segment, increasing the tension level in +the audio. As the player draws closer to the lair, additional tracks are +un-muted to increase the tension.

+ +

 

+ +

As the player enters into combat with the monster, the +program starts a synchronized transition to the Combat segment. The segment +repeats indefinitely as the combat continues. A Bonus Hit temporarily un-mutes +a decorative track that notifies the player of a successful attack, and +similarly, another track is temporarily un-muted to signify when the player +receives Special Damage.

+ +

 

+ +

At the end of combat, the music transitions to a victory or +defeat segment based on the outcome of battle.

+ +

Mute/Un-mute Synchronization

+ +

JET can also synchronize the muting and un-muting of tracks +to events in the music. For example, in the FPS game, it would probably be +desirable to place the musical events relating to bonuses and damage as close +to the actual game event as possible. However, simply un-muting a track at the +moment the game event occurs might result in a music clip starting in the +middle. Alternatively, a clip could be started from the beginning, but then it +wouldn’t be synchronized with the other music tracks.

+ +

 

+ +

However, with the JET sync engine, a clip can be started at +the next opportune moment and maintain synchronization. This can be +accomplished by placing a number of short music clips on a decorative track. A MIDI event in the stream signifies the start of a clip +and a second event signifies the end of a clip. When the application calls the +JET clip function, the next clip in the track is allowed to play fully +synchronized to the music. Optionally, the track can be automatically muted by +a second MIDI event.

+ +

 

+ +

+ +

Figure 3: Synchronized Mute/Unmute

+ +

Audio Synchronization

+ +

JET provides an audio synchronization API that allows game +play to be synchronized to events in the audio. The mechanism relies on data +embedded in the MIDI file at the time the +content is authored. When the JET engine senses an event during playback it +generates a callback into the application program. The timing of the callback +can be adjusted to compensate for any latency in the audio playback system so +that audio and video can be synchronized. The diagram below shows an example of +a simple music game that involves pressing the left and right arrows in time +with the music.

+ +

 

+ +

 

+ +

+ +

Figure 4: Music Game with +Synchronization

+ +

 

+ +

The arrows represent events in the music sequence where game +events need to be synchronized. In this case, the blue arrow represents a time +where the player is supposed to press the left button, and the red arrow is for +the right button. The yellow arrow tells the game engine that the sequence is +complete. The player is allowed a certain time window before and after the +event to press the appropriate key.

+ +

 

+ +

If an event is received and the player has not pressed a +button, a timer is set to half the length of the window. If the player presses +the button before the timer expires, the game registers a success, and if not, +the game registers a failure.

+ +

 

+ +

If the player presses the button before the event is +received, a timer is set to half the length of the window. If an event is +received before the timer expires, the game registers a success, and if not, +the game registers a failure. Game play might also include bonuses for getting +close to the timing of the actual event.

+ +

 

+ +

Operational Details

+ +

JET uses the standard EAS library calls to manage multiple MIDI streams that are synchronized to sound like a +seamless audio track. JET requires the use of the dynamic memory model, i.e. +support for malloc() and free() memory allocation functions or their +equivalent. JET also requires the DLS parser and synthesizer module to support +custom instruments in JET content files.

+ +

 

+ +

JET uses standard MIDI +events for audio synchronization. This simplifies the authoring process by +allowing content authors to use their favorite tools for developing content. +After the content has been developed, a simple post-processing tool pulls the +content together into a JET compatible content file.

+ +

Synchronization Events

+ +

JET uses MIDI controller +events to synchronize audio. The controllers used by JET are among those not +defined for specific use by the MIDI +specification. The specific controller definitions are as follows:

+ +

 

+ +

            Controllers +80-83                 Reserved for use by +application

+ +

            Controller 102                       JET event marker

+ +

            Controller +103                       JET clip marker

+ +

            Controllers +104-119             Reserved for future +use

+ +

 

+ +

Controllers 80-83 – Application Controllers

+ +

The application may use controllers in this range for its +own purposes. When a controller in this range is encountered, the event is +entered into an event queue that can be queried by the application. Some +possible uses include synchronizing video events with audio and marking a point +in a MIDI segment to queue up the next +segment. The range of controllers monitored by the application can be modified +by the application during initialization.

+ +

Controller 102 – JET Event Marker

+ +

Controller 102 is reserved for marking events in the MIDI streams that are specific to JET functionality. +Currently, the only defined value is 0, which marks the end of a segment for +timing purposes.

+ +

 

+ +

Normally, JET starts playback of the next segment (or +repeats the current segment) when the MIDI +end-of-track meta-event is encountered. Some MIDI +authoring tools make it difficult to place the end-of-track marker accurately, +resulting in synchronization problems when segments are joined together.

+ +

 

+ +

To avoid this problem, the author can place a JET +end-of-segment marker (controller=102, value=0) at the point where the segment is +to be looped. When the end-of-segment marker is encountered, the next segment +will be triggered, or if the current segment is looped, playback will resume at +the start of the segment.

+ +

 

+ +

The end-of-segment marker can also be used to allow for +completion of a musical figure beyond the end of measure that marks the start +of the next segment. For example, the content author might create a 4-bar +segment with a drum fill that ends on beat 1 of the 5th bar – a bar +beyond the natural end of the segment. By placing an end-of-segment marker at +the end of the 4th bar, the next segment will be triggered, but the +drum fill will continue in parallel with the next segment providing musical +continuity.

+ +

 

+ +

+ +

Figure 5: End-of-segment Marker

+ +

Controller 103 – JET Clip Marker

+ +

Controller 103 is reserved for marking clips in a MIDI track that can be triggered by the JET_TriggerClip +API call. The clip ID is encoded in the low 6 bits of the controller value. Bit +6 is set to one to indicate the start of a clip, and set to zero to indicate +the end of a clip.

+ +

 

+ +

For example, to identify a clip with a clip ID of 1, the +author inserts a MIDI controller event with +controller=103 and value=65 at the start of the clip and another event with controller=103 +and value=1 at the end of the clip. When the JET_TriggerClip() function is +called with a clip ID of 1, the track will be un-muted when the controller +value 65 is encountered and muted again when the controller value 1 is +encountered.

+ +

 

+ +

+ +

Figure 6: Synchronized Clip

+ +

 

+ +

In the figure above, if the JET_TriggerClip() function is +called prior to the first controller event, Track 3 will be un-muted when the +first controller event occurs, the first clip will play, and the track will be +muted when the second controller event occurs. If the JET_TriggerClip() +function is called after the first controller event has occurred, Track 3 will +be un-muted when the third controller event occurs, the second clip will play, +and the track will be muted again when the fourth controller event occurs.

+ +

 

+ +

Note: Normally, +the track containing the clip is muted by the application when the segment is +initially queued by the call to JET_QueueSegment(). If it is not muted, the clip +will always play until Jet_TriggerClip() has been called with the clip ID.

+ +

JET Programming

+ +

The JET library builds on functionality in the EAS library. +It is assumed that the reader is familiar with EAS and has implemented basic +EAS audio functionality in the application. Specifically, the application must +first initialize EAS by calling EAS_Init() and must call EAS_Render() at +appropriate times to render audio and stream it to the audio hardware. JET also +requires the use of the dynamic memory model which uses malloc() and free() or +functional equivalents.

+ +

 

+ +

Most JET function calls return an EAS_RESULT type which +should be checked against the EAS_SUCCESS return code. Most failures are not +fatal, i.e. they will not put the library in a state where it must be +re-initialized. However, some failures such as memory allocation or file +open/read errors will likely result in the specific open content failing to +render.

+ +

JET Application Initialization

+ +

The JET library is initialized by the JET_Init() function. +The application must first call EAS_Init() and then pass the EAS data handle +returned by EAS_Init() to the JET_Init() function. Currently, only a single JET +application can be active at a time.

+ +

 

+ +

The JET_Init function takes 3 arguments: The first is the +EAS data handle. The second is a pointer to a configuration structure +S_JET_CONFIG and the third is the size of the configuration structure. For most +applications, it is sufficient to pass a NULL pointer and size 0 for the +configuration data.

+ +

 

+ +

However, if desired, the configuration can be modified to +allow the application to monitor MIDI events +outside the normal range of controllers allocated for JET application events. +In this case, a configuration structure should be allocated and the data fields +initialized with the appropriate values with the low and high controller +numbers to be monitored. The size field should be the sizeof() of the data +structure. This is to allow for future enhancement of the configuration data +while maintaining compatibility.

+ +

JET Application Termination

+ +

When the JET application terminates, it should call +JET_Shutdown() to release the resources allocated by the JET engine.  If the application has no other use for the +EAS library, it should also call EAS_Shutdown().

+ +

JET Audio Processing

+ +

To start the JET engine, the content must first be opened +with the JET_OpenFile() function. Just as with EAS_OpenFile(), the file locator +is an opaque value that is passed to the EAS_HWOpenFile() function. It can +either be a pointer to a filename, or a pointer to an in-memory object, +depending on the user implementation of file I/O in the eas_host.c or +eas_hostmm.c module. Only a single JET content file can be opened at a time.

+ +

 

+ +

Once the JET file is opened, the application can begin +queuing up segments for playback by calling the JET_QueueSegment() function. +Generally, it is advisable to keep a minimum of two segments queued at all +times:  the currently playing segment +plus an additional segment that is ready to start playing when the current +segment finishes. However, with proper programming, it is possible to queue up +segments using a “just-in-time” technique. This technique typically involves +careful placement of application controller events near the end of a segment so +that the application is informed when a segment is about to end.

+ +

 

+ +

After the segment(s) are queued up, playback can begin. By +default, the segments are initialized in a paused state. To start playback, +call the JET_Play() function. Playback can be paused again by calling the JET_Pause() +function. Once initiated, playback will continue as long as the application +continues to queue up new segments before all the segments in the queue are +exhausted.

+ +

 

+ +

The JET_Status() function can be used to monitor progress. +It returns the number of segments queued, repeat count, current segment ID, and +play status. By monitor the number of segments queued, the application can +determine when it needs to queue another segment and when playback has +completed.

+ +

 

+ +

When playback has completed and the application is finished +with the contents of the currently open file, the application should call +JET_CloseFile() to close the file and release any resources associated with the +file.

+ +

JET_Init

+ +

EAS_PUBLIC EAS_RESULT JET_Init +(EAS_DATA_HANDLE easHandle, S_JET_CONFIG *pConfig, EAS_INT configSize)

+ +

 

+ +

Initializes JET library for use by application. Most +application should simply pass a NULL for pConfig and 0 for configSize, which +means that only controller events in the application range (80-83) will end up +in the application event queue. If desired, the application can instantiate an +S_JET_CONFIG data structure and set the controller range to a different range. +In this case, the configSize parameter should be set to sizeof(S_JET_CONFIG).

+ +

JET_Shutdown

+ +

EAS_PUBLIC EAS_RESULT JET_Shutdown +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Releases resources used by the JET library. The application +should call this function when it is no longer using the JET library.

+ +

JET_ OpenFile

+ +

EAS_PUBLIC EAS_RESULT JET_OpenFile +(EAS_DATA_HANDLE easHandle, EAS_FILE_LOCATOR locator)

+ +

 

+ +

Opens a JET content file for playback. Content must be +formatted for use by the JET library, which is typically accomplished with the +jetfile.py script (see “Creating JET Content”). Only a single JET content file +can be opened at a time. However, since JET can contain many MIDI +files and DLS libraries, this limitation is normally not an issue.

+ +

JET_ CloseFile

+ +

EAS_PUBLIC EAS_RESULT JET_CloseFile +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Closes a JET file and release the resources associated with it.

+ +

JET_ Status

+ +

EAS_PUBLIC EAS_RESULT JET_Status +(EAS_DATA_HANDLE easHandle, S_JET_STATUS *pStatus)

+ +

 

+ +

Returns the current JET status. The elements of the status +data structure are as follows:

+ +

 

+ +

typedef struct s_jet_status_tag

+ +

{

+ +

     EAS_INT   currentUserID;

+ +

     EAS_INT   segmentRepeatCount;

+ +

     EAS_INT   numQueuedSegments;

+ +

     EAS_BOOL paused;

+ +

} S_JET_STATUS;

+ +

 

+ +

currentUserID: An +8-bit value assigned by the application.

+ +

 

+ +

segmentRepeatCount: +Number of times left to repeat. Zero indicates no repeats, a negative number +indicates an infinite number of repeats. Any positive value indicates that the +segment will play n+1 times.

+ +

 

+ +

numQueuedSegments: +Number of segments currently queued to play including the currently playing +segment. A value of zero indicates that nothing is playing. Normally, the +application will queue a new segment each time the value is 1 so that playback +is uninterrupted.

+ +

JET_ QueueSegment

+ +

EAS_PUBLIC EAS_RESULT JET_QueueSegment +(EAS_DATA_HANDLE easHandle, EAS_INT segmentNum, EAS_INT libNum, EAS_INT +repeatCount, EAS_INT transpose, EAS_U32 muteFlags, EAS_U8 userID)

+ +

 

+ +

Queues up a JET MIDI segment for playback. The parameters +are as follows:

+ +

 

+ +

segmentNum: +Segment number as identified in the JET content configuration file.

+ +

 

+ +

libNum: The library +number as specified in the JET content configuration file. Use -1 to select the +standard General MIDI library.

+ +

 

+ +

repeatCount: The +number of times this segment should repeat. Zero indicates no repeat, i.e. play +only once. Any positive number indicates to play n+1 times. Set to -1 to repeat +indefinitely.

+ +

 

+ +

transpose: The +amount of pitch transposition. Set to 0 for normal playback. Range is -12 to ++12.

+ +

 

+ +

muteFlags: +Specific which MIDI tracks (not MIDI channels) +should be muted during playback. These flags can be changed dynamically using +the mute functions. Bit 0 = track 0, bit 1 = track 1, etc.

+ +

 

+ +

userID: 8-bit +value specified by the application that uniquely identifies the segment. This +value is returned in the JET_Status() function as well as by the application +event when an event is detected in a segment. Normally, the application keeps +an 8-bit value that is incremented each time a new segment is queued up. This +can be used to look up any special characteristics of that track including +trigger clips and mute flags.

+ +

JET_ Play

+ +

EAS_PUBLIC EAS_RESULT JET_Play +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Starts playback of the current segment. This function must +be called once after the initial segments are queued up to start playback. It +is also called after JET_Pause() to resume playback.

+ +

JET_ Pause

+ +

EAS_PUBLIC EAS_RESULT JET_Pause +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Pauses playback of the current segment. Call JET_Pause() to +resume playback.

+ +

JET_ SetMuteFlags

+ +

EAS_PUBLIC EAS_RESULT JET_SetMuteFlags +(EAS_DATA_HANDLE easHandle, EAS_U32 muteFlags, EAS_BOOL sync)

+ +

 

+ +

Modifies the mute flags during playback. If the sync parameter is false, the mute flags +are updated at the beginning of the next render. This means that any new notes +or controller events will be processed during the next audio frame. If the sync parameter is true, the mute flags +will be updated at the start of the next segment. If the segment is repeated, +the flags will take effect the next time segment is repeated.

+ +

JET_ SetMuteFlag

+ +

EAS_PUBLIC EAS_RESULT JET_SetMuteFlag +(EAS_DATA_HANDLE easHandle, EAS_INT trackNum, EAS_BOOL muteFlag, EAS_BOOL sync)

+ +

Modifies a mute flag for a single track during playback. If +the sync parameter is false, the mute +flag is updated at the beginning of the next render. This means that any new +notes or controller events will be processed during the next audio frame. If +the sync parameter is true, the mute +flag will be updated at the start of the next segment. If the segment is +repeated, the flag will take effect the next time segment is repeated.

+ +

JET_ TriggerClip

+ +

EAS_PUBLIC EAS_RESULT JET_TriggerClip +(EAS_DATA_HANDLE easHandle, EAS_INT clipID)

+ +

 

+ +

Automatically updates mute flags in sync with the JET Clip +Marker (controller 103). The parameter clipID +must be in the range of 0-63. After the call to JET_TriggerClip, when JET next +encounters a controller event 103 with bits 0-5 of the value equal to clipID and bit 6 set to 1, it will automatically un-mute the track containing +the controller event. When JET encounters the complementary controller event +103 with bits 0-5 of the value equal to clipID +and bit 6 set to 0, it will mute +the track again.

+ +

JET_ GetEvent

+ +

EAS_BOOL JET_GetEvent (EAS_DATA_HANDLE +easHandle, EAS_U32 *pEventRaw, S_JET_EVENT *pEvent)

+ +

 

+ +

Attempts to read an event from the application event queue, +return EAS_TRUE if an event is found and EAS_FALSE if not. If the application +passes a valid pointer for pEventRaw, +a 32-bit compressed event code is returned. If the application passes a valid +pointer for pEvent, the event is +parsed into the S_JET_EVENT fields. The application can pass NULL for either +parameter and that variable will be ignored. Normally, the application will +call JET_GetEvent() repeatedly to retrieve events until it returns EAS_FALSE.

+ +

JET_ ParseEvent

+ +

EAS_PUBLIC void JET_ParseEvent (EAS_U32 +event, S_JET_EVENT *pEvent)

+ +

Parses a 32-bit compressed event code into a data structure. +The application passes the event code received from JET_GetEvent(). The parsed +event data is returned in the memory pointed to by pEvent.

+ +

JET_GetAppData

+ +

EAS_RESULT JET_GetAppData +(EAS_DATA_HANDLE easHandle, EAS_I32 *pAppDataOffset, EAS_I32 *pAppDataSize)

+ +

Returns the offset and size of the JAPP chunk in the JET +file. The application can use the file I/O functions in the eas_host module to +retrieve application specific data from the file.

+ +

 

+ +

 

+ +

Creating JET Content

+ +

JET uses standard MIDI files and DLS files that can be +created with commercially available content tools such as Logic, Cubase, +Digital Performer, or SONAR for MIDI files and +Awave for DLS2 files. These source files are then bundled into a .jet package +file suitable for use in a JET application.

+ +

 

+ +

To create JET file use the “JET Creator” desktop +application. The JET Creator application is written in Python and includes a +full graphical interface. It is available for MAC and PC platforms. See “JET +Creator User Manual” for more information.

+ +
+ + + + diff --git a/docs/JET_Programming_Manual_files/header.htm b/docs/JET_Programming_Manual_files/header.htm new file mode 100755 index 0000000..8cc7121 --- /dev/null +++ b/docs/JET_Programming_Manual_files/header.htm @@ -0,0 +1,73 @@ + + + + + + + + + + + + + +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

+ +


+ +

+ +
+ +
+ +

                                        JET +Programming Guide   vrs.2   Page 1/19

+ +
+ + + + diff --git a/docs/JET_Programming_Manual_files/image002.png b/docs/JET_Programming_Manual_files/image002.png new file mode 100755 index 0000000..931d4a4 Binary files /dev/null and b/docs/JET_Programming_Manual_files/image002.png differ diff --git a/docs/JET_Programming_Manual_files/image004.png b/docs/JET_Programming_Manual_files/image004.png new file mode 100755 index 0000000..93086b5 Binary files /dev/null and b/docs/JET_Programming_Manual_files/image004.png differ diff --git a/docs/JET_Programming_Manual_files/image006.png b/docs/JET_Programming_Manual_files/image006.png new file mode 100755 index 0000000..2916ddd Binary files /dev/null and b/docs/JET_Programming_Manual_files/image006.png differ diff --git a/docs/JET_Programming_Manual_files/image008.png b/docs/JET_Programming_Manual_files/image008.png new file mode 100755 index 0000000..d80d93c Binary files /dev/null and b/docs/JET_Programming_Manual_files/image008.png differ diff --git a/docs/JET_Programming_Manual_files/image010.png b/docs/JET_Programming_Manual_files/image010.png new file mode 100755 index 0000000..542a7f7 Binary files /dev/null and b/docs/JET_Programming_Manual_files/image010.png differ diff --git a/docs/JET_Programming_Manual_files/image012.png b/docs/JET_Programming_Manual_files/image012.png new file mode 100755 index 0000000..547759c Binary files /dev/null and b/docs/JET_Programming_Manual_files/image012.png differ diff --git a/docs/JET_Programming_Manual_files/image013.emz b/docs/JET_Programming_Manual_files/image013.emz new file mode 100755 index 0000000..f152c11 Binary files /dev/null and b/docs/JET_Programming_Manual_files/image013.emz differ diff --git a/docs/JET_Programming_Manual_files/image014.emz b/docs/JET_Programming_Manual_files/image014.emz new file mode 100755 index 0000000..010c4bd Binary files /dev/null and b/docs/JET_Programming_Manual_files/image014.emz differ diff --git a/docs/JET_Programming_Manual_files/image015.emz b/docs/JET_Programming_Manual_files/image015.emz new file mode 100755 index 0000000..a29ebfd Binary files /dev/null and b/docs/JET_Programming_Manual_files/image015.emz differ diff --git a/docs/JET_Programming_Manual_files/image016.emz b/docs/JET_Programming_Manual_files/image016.emz new file mode 100755 index 0000000..31cba25 Binary files /dev/null and b/docs/JET_Programming_Manual_files/image016.emz differ diff --git a/docs/JET_Programming_Manual_files/image017.emz b/docs/JET_Programming_Manual_files/image017.emz new file mode 100755 index 0000000..2b06699 Binary files /dev/null and b/docs/JET_Programming_Manual_files/image017.emz differ diff --git a/docs/JET_Programming_Manual_files/image018.emz b/docs/JET_Programming_Manual_files/image018.emz new file mode 100755 index 0000000..1668a8e Binary files /dev/null and b/docs/JET_Programming_Manual_files/image018.emz differ -- cgit v1.2.3 From 7b5dbbaa5190a7d9854dd2689bf542382aa00f76 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi <> Date: Wed, 15 Apr 2009 18:23:58 -0700 Subject: AI 146399: Add sources of the OSX native lib for JetCreator. BUG=1721874 Automated import of CL 146399 --- .../darwin-x86/EASLIb.xcodeproj/project.pbxproj | 357 + arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.c | 1809 +++ arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.h | 31 + .../jetcreator_lib_src/darwin-x86/EASLibVst.c | 1504 ++ .../jetcreator_lib_src/darwin-x86/README.txt | 9 + .../jetcreator_lib_src/darwin-x86/eas_host_debug.h | 47 + .../jetcreator_lib_src/darwin-x86/eastestv37.c | 999 ++ .../easwt_vst_lib.xcodeproj/project.pbxproj | 645 + .../jetcreator_lib_src/darwin-x86/wt_44khz.c | 14723 +++++++++++++++++++ 9 files changed, 20124 insertions(+) create mode 100644 arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLIb.xcodeproj/project.pbxproj create mode 100755 arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.c create mode 100755 arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.h create mode 100755 arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLibVst.c create mode 100644 arm-wt-22k/jetcreator_lib_src/darwin-x86/README.txt create mode 100755 arm-wt-22k/jetcreator_lib_src/darwin-x86/eas_host_debug.h create mode 100755 arm-wt-22k/jetcreator_lib_src/darwin-x86/eastestv37.c create mode 100644 arm-wt-22k/jetcreator_lib_src/darwin-x86/easwt_vst_lib.xcodeproj/project.pbxproj create mode 100644 arm-wt-22k/jetcreator_lib_src/darwin-x86/wt_44khz.c diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLIb.xcodeproj/project.pbxproj b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLIb.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dc24dec --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLIb.xcodeproj/project.pbxproj @@ -0,0 +1,357 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 44; + objects = { + +/* Begin PBXBuildFile section */ + 9A56ACEA0F72B84D00D115A7 /* libeaswt_vst_lib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A56ACD80F72B7D600D115A7 /* libeaswt_vst_lib.a */; }; + C5AB01090E3400DC0051F183 /* EASLib.h in Headers */ = {isa = PBXBuildFile; fileRef = C5AB01070E3400DC0051F183 /* EASLib.h */; }; + C5AB010A0E3400DC0051F183 /* EASLib.c in Sources */ = {isa = PBXBuildFile; fileRef = C5AB01080E3400DC0051F183 /* EASLib.c */; }; + C5AB01240E3406090051F183 /* eas_config.c in Sources */ = {isa = PBXBuildFile; fileRef = C5AB01230E3406090051F183 /* eas_config.c */; }; + C5AB017A0E340DD60051F183 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5AB01790E340DD60051F183 /* AudioUnit.framework */; }; + C5AB018C0E340EAA0051F183 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5AB018B0E340EAA0051F183 /* AudioToolbox.framework */; }; + C5AB01910E340EC50051F183 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5AB01900E340EC50051F183 /* CoreAudio.framework */; }; + C5AB02F60E341AAC0051F183 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C5AB02F50E341AAC0051F183 /* Carbon.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 9A56ACD70F72B7D600D115A7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A56ACD30F72B7D600D115A7 /* easwt_vst_lib.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D2AAC046055464E500DB518D; + remoteInfo = easwt_vst_lib; + }; + 9A56ACFC0F72B8B200D115A7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9A56ACD30F72B7D600D115A7 /* easwt_vst_lib.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D2AAC045055464E500DB518D; + remoteInfo = easwt_vst_lib; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 9A56ACD30F72B7D600D115A7 /* easwt_vst_lib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = easwt_vst_lib.xcodeproj; sourceTree = ""; }; + C5AB01070E3400DC0051F183 /* EASLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EASLib.h; sourceTree = ""; }; + C5AB01080E3400DC0051F183 /* EASLib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = EASLib.c; sourceTree = ""; }; + C5AB01230E3406090051F183 /* eas_config.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_config.c; path = ../../host_src/eas_config.c; sourceTree = SOURCE_ROOT; }; + C5AB01790E340DD60051F183 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = /System/Library/Frameworks/AudioUnit.framework; sourceTree = ""; }; + C5AB018B0E340EAA0051F183 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; + C5AB01900E340EC50051F183 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; + C5AB02F50E341AAC0051F183 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + D2AAC0630554660B00DB518D /* libEASLIb.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libEASLIb.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D289988505E68E00004EDB86 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9A56ACEA0F72B84D00D115A7 /* libeaswt_vst_lib.a in Frameworks */, + C5AB017A0E340DD60051F183 /* AudioUnit.framework in Frameworks */, + C5AB018C0E340EAA0051F183 /* AudioToolbox.framework in Frameworks */, + C5AB01910E340EC50051F183 /* CoreAudio.framework in Frameworks */, + C5AB02F60E341AAC0051F183 /* Carbon.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* EASLIb */ = { + isa = PBXGroup; + children = ( + 9A56ACD30F72B7D600D115A7 /* easwt_vst_lib.xcodeproj */, + C5AB02F50E341AAC0051F183 /* Carbon.framework */, + C5AB01900E340EC50051F183 /* CoreAudio.framework */, + C5AB018B0E340EAA0051F183 /* AudioToolbox.framework */, + C5AB01790E340DD60051F183 /* AudioUnit.framework */, + 08FB7795FE84155DC02AAC07 /* Source */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = EASLIb; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + C5AB01230E3406090051F183 /* eas_config.c */, + C5AB01070E3400DC0051F183 /* EASLib.h */, + C5AB01080E3400DC0051F183 /* EASLib.c */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC0630554660B00DB518D /* libEASLIb.dylib */, + ); + name = Products; + sourceTree = ""; + }; + 9A56ACD40F72B7D600D115A7 /* Products */ = { + isa = PBXGroup; + children = ( + 9A56ACD80F72B7D600D115A7 /* libeaswt_vst_lib.a */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC0600554660B00DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C5AB01090E3400DC0051F183 /* EASLib.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D2AAC0620554660B00DB518D /* EASLIb */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "EASLIb" */; + buildPhases = ( + D2AAC0600554660B00DB518D /* Headers */, + D2AAC0610554660B00DB518D /* Sources */, + D289988505E68E00004EDB86 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 9A56ACFD0F72B8B200D115A7 /* PBXTargetDependency */, + ); + name = EASLIb; + productName = EASLIb; + productReference = D2AAC0630554660B00DB518D /* libEASLIb.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "EASLIb" */; + compatibilityVersion = "Xcode 3.0"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* EASLIb */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 9A56ACD40F72B7D600D115A7 /* Products */; + ProjectRef = 9A56ACD30F72B7D600D115A7 /* easwt_vst_lib.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + D2AAC0620554660B00DB518D /* EASLIb */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 9A56ACD80F72B7D600D115A7 /* libeaswt_vst_lib.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libeaswt_vst_lib.a; + remoteRef = 9A56ACD70F72B7D600D115A7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXSourcesBuildPhase section */ + D2AAC0610554660B00DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C5AB010A0E3400DC0051F183 /* EASLib.c in Sources */, + C5AB01240E3406090051F183 /* eas_config.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 9A56ACFD0F72B8B200D115A7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = easwt_vst_lib; + targetProxy = 9A56ACFC0F72B8B200D115A7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1DEB914B08733D8E0010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + EXECUTABLE_PREFIX = lib; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "EAS_MAX_FILE_HANDLES=100", + "_DEBUG_CMF=1", + "JET_INTERFACE=1", + "MAX_SMF_STREAMS=32", + "NUM_OUTPUT_CHANNELS=2", + "_SAMPLE_RATE_44100=1", + "_8_BIT_SAMPLES=1", + "_FILTER_ENABLED=1", + "_NO_DEBUG_PREPROCESSOR=1", + "_CORE_CYCLES_PER_MEMORY_CYCLE=1", + "_IMA_DECODER=1", + "_XMF_PARSER=1", + "_DLS_PARSER=1", + "MAX_DLS_MEMORY=16777216", + "EAS_WT_SYNTH=1", + "MAX_SYNTH_VOICES=64", + "X_ENHANCER_ENABLED=1", + "_REVERB_ENABLED=1", + "_CHORUS_ENABLED=1", + "DLS_SYNTHESIZER=1", + "EXTERNAL_AUDIO=1", + "TEST_HARNESS=1", + "MMAPI_SUPPORT=1", + "X_MAXIMIZER_ENABLED=1", + "X_COMPRESSOR_ENABLED=1", + "X_STATS=1", + "X_DEBUG_DLS=1", + "X_OPTIMIZED_MONO=1", + "X_CHECKED_BUILD=1", + "_NO_ALIGN=1", + "_C_REFERENCE=1", + "XMAXIMIZER_USE_FLOATING_POINT=1", + "BUFFERED_FILE_ACCESS=1", + ); + HEADER_SEARCH_PATHS = ( + "${TARGET_BUILD_DIR}/**", + "../../Common/**", + "../../Parsers/**", + "../../Effects/**", + "../../WTSynth/**", + "../../FMSynth/**", + "../../SplitArch/**", + "../../Jet/**", + ); + INSTALL_PATH = /usr/local/lib; + MACOSX_DEPLOYMENT_TARGET = 10.4; + PRODUCT_NAME = EASLIb; + ZERO_LINK = YES; + }; + name = Debug; + }; + 1DEB914C08733D8E0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = i386; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EXECUTABLE_PREFIX = lib; + GCC_AUTO_VECTORIZATION = YES; + GCC_MODEL_TUNING = G5; + GCC_PREPROCESSOR_DEFINITIONS = ( + "BUFFERED_FILE_ACCESS=1", + "EAS_FILE_BUFFER_SIZE=1024", + "EAS_MAX_FILE_HANDLES=100", + "JET_INTERFACE=1", + "MAX_SMF_STREAMS=32", + "EAS_WT_SYNTH=1", + "NUM_OUTPUT_CHANNELS=2", + "_SAMPLE_RATE_44100=1", + "_8_BIT_SAMPLES=1", + "_FILTER_ENABLED=1", + "_NO_DEBUG_PREPROCESSOR=1", + "_CORE_CYCLES_PER_MEMORY_CYCLE=1", + "_IMA_DECODER=1", + "_XMF_PARSER=1", + "_DLS_PARSER=1", + "MAX_DLS_MEMORY=16777216", + "MAX_SYNTH_VOICES=64", + "X_ENHANCER_ENABLED=1", + "_REVERB_ENABLED=1", + "_CHORUS_ENABLED=1", + "DLS_SYNTHESIZER=1", + "EXTERNAL_AUDIO=1", + "TEST_HARNESS=1", + "MMAPI_SUPPORT=1", + "X_MAXIMIZER_ENABLED=1", + "X_COMPRESSOR_ENABLED=1", + "X_STATS=1", + "X_DEBUG_DLS=1", + "X_OPTIMIZED_MONO=1", + "X_CHECKED_BUILD=1", + "_NO_ALIGN=1", + "_C_REFERENCE=1", + "XMAXIMIZER_USE_FLOATING_POINT=1", + ); + GCC_UNROLL_LOOPS = YES; + HEADER_SEARCH_PATHS = ( + "${TARGET_BUILD_DIR}/**", + "../../Common/**", + "../../Parsers/**", + "../../Effects/**", + "../../WTSynth/**", + "../../FMSynth/**", + "../../SplitArch/**", + "../../Jet/**", + ); + INSTALL_PATH = /usr/local/lib; + MACOSX_DEPLOYMENT_TARGET = 10.4; + PRODUCT_NAME = EASLIb; + }; + name = Release; + }; + 1DEB914F08733D8E0010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; + }; + name = Debug; + }; + 1DEB915008733D8E0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = i386; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "EASLIb" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB914B08733D8E0010E9CD /* Debug */, + 1DEB914C08733D8E0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "EASLIb" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB914F08733D8E0010E9CD /* Debug */, + 1DEB915008733D8E0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.c b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.c new file mode 100755 index 0000000..6f98bc1 --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.c @@ -0,0 +1,1809 @@ +/* + * EASLib.c + * EASLIb + * + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include + +#include "eas.h" +#include "eas_report.h" +#include "eas_host.h" +#include +#include + +#ifdef JET_INTERFACE +#include "jet.h" +#endif + + +#define EAS_EXPORT __attribute__((visibility("default"))) + +// #define DEBUG_FILE_IO + +/* include debug interface */ +#include "eas_host_debug.h" + +#ifdef AUX_MIXER +#include "eas_auxmix.h" +#endif + +/* this module requires dynamic memory support */ +#ifdef _STATIC_MEMORY +#error "eas_hostmm.c requires the dynamic memory model!\n" +#endif + +#ifndef EAS_MAX_FILE_HANDLES +#define EAS_MAX_FILE_HANDLES 32 +#endif + +#ifndef EAS_FILE_BUFFER_SIZE +#define EAS_FILE_BUFFER_SIZE 32 +#endif + +/* + * this structure and the related function are here + * to support the ability to create duplicate handles + * and buffering it in memory. If your system uses + * in-memory resources, you can eliminate the calls + * to malloc and free, the dup flag, and simply track + * the file size and read position. + */ + #ifdef BUFFERED_FILE_ACCESS +typedef struct eas_hw_file_tag +{ + FILE *pFile; + EAS_I32 bytesInBuffer; + EAS_I32 readIndex; + EAS_I32 filePos; + EAS_I32 fileSize; + EAS_BOOL dup; + EAS_U8 buffer[EAS_FILE_BUFFER_SIZE]; +} EAS_HW_FILE; +#else +typedef struct eas_hw_file_tag +{ + EAS_I32 fileSize; + EAS_I32 filePos; + EAS_BOOL dup; + EAS_U8 *buffer; +} EAS_HW_FILE; +#endif + +typedef struct eas_hw_inst_data_tag +{ + EAS_HW_FILE files[EAS_MAX_FILE_HANDLES]; +} EAS_HW_INST_DATA; + +EAS_BOOL errorConditions[eNumErrorConditions]; +EAS_BOOL ledState; +EAS_BOOL vibState; +EAS_BOOL backlightState; + +#define MAX_DEBUG_MSG_LEN 1024 + +typedef void (*EAS_LOG_FUNC)(EAS_INT severity, char *msg); + +static EAS_LOG_FUNC logCallback = NULL; +static char messageBuffer[MAX_DEBUG_MSG_LEN]; + +/* error counts */ +static EAS_INT eas_fatalErrors; +static EAS_INT eas_errors; +static EAS_INT eas_warnings; +static int severityLevel = 9999; + + +#define MAX_BUFFERS 8 + +// The output unit +AudioUnit OutputUnit; +AudioStreamBasicDescription streamFormat; + +// sync stuf +pthread_mutex_t mtx; +pthread_cond_t cond; +bool bStopped = true; + +// buffer to hold the data +typedef struct +{ + UInt32 uOutBufferLength; + UInt32 uOutFrames; + int ix; + short* pData[8]; + unsigned int uLength; +} S_BUFFER_INFO; + +static S_BUFFER_INFO *pBuf = NULL; +const S_EAS_LIB_CONFIG *pConfig = NULL; + +/*---------------------------------------------------------------------------- + * ResetErrorCounters() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT void ResetErrorCounters() +{ + eas_fatalErrors = 0; + eas_errors = 0; + eas_warnings = 0; +} + +/*---------------------------------------------------------------------------- + * SetLogCallback() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT void SetLogCallback (EAS_LOG_FUNC callback) +{ + logCallback = callback; +} + +#ifndef _NO_DEBUG_PREPROCESSOR +static S_DEBUG_MESSAGES debugMessages[] = +{ +#ifdef UNIFIED_DEBUG_MESSAGES +#include "eas_debugmsgs.h" +#endif + { 0,0,0 } +}; + +/*---------------------------------------------------------------------------- + * EAS_ReportEx() + *---------------------------------------------------------------------------- +*/ +void EAS_ReportEx (int severity, unsigned long hashCode, int serialNum, ...) +{ + va_list vargs; + int i; + + switch (severity) + { + case _EAS_SEVERITY_FATAL: + eas_fatalErrors++; + break; + + case _EAS_SEVERITY_ERROR: + eas_errors++; + break; + + case _EAS_SEVERITY_WARNING: + eas_warnings++; + break; + + default: + break; + } + + /* check severity level */ + if (severity > severityLevel) + return; + + /* check for callback */ + if (logCallback == NULL) + return; + + /* find the error message and output to stdout */ + for (i = 0; debugMessages[i].m_pDebugMsg; i++) + { + if ((debugMessages[i].m_nHashCode == hashCode) && + (debugMessages[i].m_nSerialNum == serialNum)) + { + va_start(vargs, serialNum); +#ifdef WIN32 + vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); +#else + vsprintf(messageBuffer, debugMessages[i].m_pDebugMsg, vargs); +#endif + logCallback(severity, messageBuffer); + va_end(vargs); + return; + } + } + printf("Unrecognized error: Severity=%d; HashCode=%lu; SerialNum=%d\n", severity, hashCode, serialNum); +} /* end EAS_ReportEx */ + +#else +/*---------------------------------------------------------------------------- + * EAS_Report() + *---------------------------------------------------------------------------- +*/ +void EAS_Report (int severity, const char *fmt, ...) +{ + va_list vargs; + + switch (severity) + { + case _EAS_SEVERITY_FATAL: + eas_fatalErrors++; + break; + + case _EAS_SEVERITY_ERROR: + eas_errors++; + break; + + case _EAS_SEVERITY_WARNING: + eas_warnings++; + break; + + default: + break; + } + + /* check severity level */ + if (severity > severityLevel) + return; + + /* check for callback */ + if (logCallback == NULL) + return; + + va_start(vargs, fmt); +#ifdef _WIN32 + vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); +#else + vsprintf(messageBuffer, fmt, vargs); +#endif + logCallback(severity, messageBuffer); + va_end(vargs); +} /* end EAS_Report */ + +/*---------------------------------------------------------------------------- + * EAS_ReportX() + *---------------------------------------------------------------------------- +*/ +void EAS_ReportX (int severity, const char *fmt, ...) +{ + va_list vargs; + + switch (severity) + { + case _EAS_SEVERITY_FATAL: + eas_fatalErrors++; + break; + + case _EAS_SEVERITY_ERROR: + eas_errors++; + break; + + case _EAS_SEVERITY_WARNING: + eas_warnings++; + break; + + default: + break; + } + + /* check severity level */ + if (severity > severityLevel) + return; + + /* check for callback */ + if (logCallback == NULL) + return; + + va_start(vargs, fmt); +#ifdef _WIN32 + vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); +#else + vsprintf(messageBuffer, fmt, vargs); +#endif + logCallback(severity, messageBuffer); + va_end(vargs); +} +#endif + +/*---------------------------------------------------------------------------- + * EAS_DLLSetDebugLevel() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT void EAS_DLLSetDebugLevel (int severity) +{ + severityLevel = severity; +} + +/*---------------------------------------------------------------------------- + * EAS_ExSetDebugLevel() + *---------------------------------------------------------------------------- +*/ +void EAS_SetDebugLevel (int severity) +{ + severityLevel = severity; +} + +/*---------------------------------------------------------------------------- + * EAS_SelectLibrary() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT EAS_RESULT EAS_SelectLib (EAS_DATA_HANDLE pEASData, EAS_HANDLE streamHandle, EAS_BOOL testLib) +{ + extern EAS_SNDLIB_HANDLE VMGetLibHandle(EAS_INT libNum); + return EAS_SetSoundLibrary(pEASData, streamHandle, VMGetLibHandle(testLib ? 1 : 0)); +} + +// Callback proc +static OSStatus RenderProc( void *inRefCon, + AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList *ioData) +{ + // Get the mutex + pthread_mutex_lock(&mtx); + + short* ptrOutL = (short *)ioData->mBuffers[0].mData; + short* ptrOutR = (short *)ioData->mBuffers[1].mData; + + memset(ptrOutL, 0, pBuf->uOutFrames); + memset(ptrOutR, 0, pBuf->uOutFrames); + + // check if there is any data in the buffer + if (pBuf->ix == 0 ) + { + // Release the mutex and signal the python thread + pthread_mutex_unlock(&mtx); + pthread_cond_signal(&cond); + return 0; + } + + // Get a ptr to the data + short* pData = pBuf->pData[--(pBuf->ix)]; + + // Now copy the data + int i; + for (i = 0; i < pBuf->uOutFrames; i+=2 ) + { + *ptrOutL++ = pData[i]; + *ptrOutR++ = pData[i+1]; + } + + // Release the mutex + pthread_mutex_unlock(&mtx); + pthread_cond_signal(&cond); + + return 0; +} + +EAS_RESULT addData(EAS_PCM *pAudioBuffer) +{ + // Copy the data we got from the synth + memcpy(pBuf->pData[(pBuf->ix)++], pAudioBuffer, 2048); + + // Start the output Audio Unit only the first time + if ( bStopped == true ) + { + bStopped = false; + OSStatus err = AudioOutputUnitStart (OutputUnit); + if (err) + { + printf ("AudioDeviceStart=%ld\n", err); + return EAS_FAILURE; + } + } + + return EAS_SUCCESS; +} + + +EAS_EXPORT EAS_RESULT EAS_RenderWaveOut(EAS_DATA_HANDLE easHandle, EAS_PCM *pAudioBuffer, EAS_I32 numRequested, EAS_I32 *pNumGenerated) +{ + // Get the mutex + pthread_mutex_lock(&mtx); + + // Check if our buffer is full + while(pBuf->ix == MAX_BUFFERS - 1) + pthread_cond_wait(&cond, &mtx); + + // Call the synth the render a buffer + EAS_RESULT result = EAS_Render(easHandle, pAudioBuffer, numRequested, pNumGenerated); + addData( pAudioBuffer ); + + // Release the mutex + pthread_mutex_unlock(&mtx); + + //Done + return result; +} + +#ifdef AUX_MIXER +EAS_EXPORT EAS_RESULT EAS_RenderAuxMixerWaveOut (EAS_DATA_HANDLE easHandle, EAS_PCM *pAudioBuffer, EAS_I32 *pNumGenerated) +{ + // Get the mutex + pthread_mutex_lock(&mtx); + + // Check if our buffer is full + while(pBuf->ix == MAX_BUFFERS - 1) + pthread_cond_wait(&cond, &mtx); + + EAS_RESULT result = EAS_RenderAuxMixer(easHandle, pAudioBuffer, pNumGenerated); + addData( pAudioBuffer ); + + // Release the mutex + pthread_mutex_unlock(&mtx); + + return result; +} +#endif + +EAS_EXPORT EAS_RESULT OpenWaveOutDevice(EAS_INT devNum, EAS_INT sampleRate, EAS_INT maxBufSize) +{ + // Open the default output unit + ComponentDescription desc; + desc.componentType = kAudioUnitType_Output; + desc.componentSubType = kAudioUnitSubType_DefaultOutput; + desc.componentManufacturer = kAudioUnitManufacturer_Apple; + desc.componentFlags = 0; + desc.componentFlagsMask = 0; + + Component comp = FindNextComponent(NULL, &desc); + if (comp == NULL) + { + printf ("Could find the default output unit!!!\n"); + return EAS_FAILURE; + } + + OSStatus err = OpenAComponent(comp, &OutputUnit); + if (comp == NULL) + { + printf ("OpenAComponent=%ld\n", err); + return EAS_FAILURE; + } + + // Set up a callback function to generate output to the output unit + AURenderCallbackStruct auRenderCallback; + auRenderCallback.inputProc = RenderProc; + auRenderCallback.inputProcRefCon = NULL; + + err = AudioUnitSetProperty (OutputUnit, + kAudioUnitProperty_SetRenderCallback, + kAudioUnitScope_Input, + 0, + &auRenderCallback, + sizeof(auRenderCallback)); + if (err) + { + printf ("AudioUnitSetProperty-CB=%ld\n", err); + return EAS_FAILURE;; + } + + pConfig = EAS_Config(); + + // The synth engine already uses short* for the buffers so let CoreAudio do any conversions if needed + if (sampleRate != 0) + streamFormat.mSampleRate = sampleRate; + else + streamFormat.mSampleRate = pConfig->sampleRate; + + streamFormat.mFormatID = kAudioFormatLinearPCM; + streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger + | kAudioFormatFlagsNativeEndian + | kLinearPCMFormatFlagIsPacked + | kAudioFormatFlagIsNonInterleaved; + + streamFormat.mBytesPerPacket = 2; + streamFormat.mFramesPerPacket = 1; + streamFormat.mBytesPerFrame = 2; + streamFormat.mChannelsPerFrame = 2; + streamFormat.mBitsPerChannel = 16; + + err = AudioUnitSetProperty (OutputUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, + 0, + &streamFormat, + sizeof(AudioStreamBasicDescription)); + if (err) + { + printf ("AudioUnitSetProperty-SF= %4.4s, %ld\n", (char*)&err, err); + return EAS_FAILURE; + } + + // Initialize + err = AudioUnitInitialize(OutputUnit); + if (err) + { + printf ("AudioUnitInitialize = %ld\n", err); + return EAS_FAILURE; + } + + pBuf = (S_BUFFER_INFO *) malloc(sizeof(S_BUFFER_INFO)); + if( !pBuf ) + return EAS_FAILURE; + + pBuf->uOutBufferLength = pConfig->mixBufferSize * streamFormat.mBitsPerChannel / 2; + UInt32 uDataSize = sizeof(pBuf->uOutBufferLength); + + err = AudioUnitSetProperty(OutputUnit, kAudioDevicePropertyBufferSize, kAudioUnitScope_Output, 0, &pBuf->uOutBufferLength, uDataSize); + if (err) + { + printf ("AudioUnitSetProperty = %ld\n", err); + return EAS_FAILURE; + } + + err = AudioUnitGetProperty(OutputUnit, kAudioDevicePropertyBufferSize, kAudioUnitScope_Output, 0, &pBuf->uOutBufferLength, &uDataSize); + if (err) + { + printf ("AudioUnitGetProperty = %ld\n", err); + return EAS_FAILURE; + } + + pBuf->uLength = pBuf->uOutBufferLength; + int i; + for ( i = 0; i < MAX_BUFFERS; i++) + pBuf->pData[i] = malloc(pBuf->uLength); + + pBuf->uOutBufferLength /= pConfig->numChannels; + pBuf->uOutFrames = pBuf->uOutBufferLength / sizeof(short); + + pBuf->ix = 0; + + // Init the stop flag + bStopped = true; + + int result = pthread_mutex_init(&mtx, NULL); + if (result) + { + printf("pthread_mutex_init failed\n"); + return EAS_FAILURE; + } + + result = pthread_cond_init(&cond, NULL); + if (result) + { + printf("pthread_cond_init failed\n"); + return EAS_FAILURE; + } + + // Done + return EAS_SUCCESS; +} + + +EAS_EXPORT EAS_RESULT StartStream() +{ + OSStatus err = noErr; + pthread_mutex_lock(&mtx); + if ( bStopped == true ) + { + err = AudioOutputUnitStart (OutputUnit); + if (err) + { + printf ("AudioOutputUnitStart=%ld\n", err); + return EAS_FAILURE; + } + bStopped = false; + } + + return EAS_SUCCESS; +} + + +EAS_EXPORT EAS_RESULT CloseWaveOutDevice() +{ + OSStatus err; + + pthread_mutex_lock(&mtx); + if( false == bStopped ) + { + AudioOutputUnitStop (OutputUnit); + bStopped = true; + + err = AudioUnitUninitialize (OutputUnit); + if (err) + { + printf ("AudioUnitUninitialize=%ld\n", err); + return EAS_FAILURE; + } + + CloseComponent (OutputUnit); + int i = 0; + for(i; i < MAX_BUFFERS; i++) + free(pBuf->pData[i]); + + free(pBuf); + } + + pthread_mutex_unlock(&mtx); + return EAS_SUCCESS; +} + + +#if defined(_DEBUG) && !defined(MSC) +#include +/*---------------------------------------------------------------------------- + * EnableHeapDebug() + *---------------------------------------------------------------------------- +*/ +static void EnableHeapDebug (void) +{ + int temp; + temp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + temp |= _CRTDBG_ALLOC_MEM_DF; + temp |= _CRTDBG_CHECK_ALWAYS_DF; + temp |= _CRTDBG_LEAK_CHECK_DF; +// temp |= _CRTDBG_DELAY_FREE_MEM_DF; + _CrtSetDbgFlag(temp); +} + +/*---------------------------------------------------------------------------- + * HeapCheck() + *---------------------------------------------------------------------------- + * Check heap status + *---------------------------------------------------------------------------- +*/ +void HeapCheck (void) +{ + int heapStatus; + + /* Check heap status */ + heapStatus = _heapchk(); + if ((heapStatus == _HEAPOK) || (heapStatus == _HEAPEMPTY)) + return; + + EAS_ReportX(_EAS_SEVERITY_FATAL, "Heap corrupt\n" ); +} +#endif + + +/*---------------------------------------------------------------------------- + * EAS_HWInit + * + * Initialize host wrapper interface + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWInit (EAS_HW_DATA_HANDLE *pHWInstData) +{ + +#if defined(_DEBUG) && !defined(MSC) + EnableHeapDebug(); +#endif + + #ifdef BUFFERED_FILE_ACCESS + EAS_ReportX(_EAS_SEVERITY_INFO, "EAS_HWInit: Buffered file access\n"); + #else + EAS_ReportX(_EAS_SEVERITY_INFO, "EAS_HWInit: Memory mapped file access\n"); + #endif + + /* simulate failure */ + if (errorConditions[eInitError]) + return EAS_FAILURE; + + /* need to track file opens for duplicate handles */ + *pHWInstData = malloc(sizeof(EAS_HW_INST_DATA)); + if (!(*pHWInstData)) + return EAS_ERROR_MALLOC_FAILED; + + EAS_HWMemSet(*pHWInstData, 0, sizeof(EAS_HW_INST_DATA)); + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * EAS_HWShutdown + * + * Shut down host wrapper interface + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWShutdown (EAS_HW_DATA_HANDLE hwInstData) +{ + + /* simulate failure */ + if (errorConditions[eShutdownError]) + return EAS_FAILURE; + + free(hwInstData); + +#if defined(_DEBUG) && !defined(MSC) + HeapCheck(); +#endif + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMalloc + * + * Allocates dynamic memory + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +void *EAS_HWMalloc (EAS_HW_DATA_HANDLE hwInstData, EAS_I32 size) +{ + /* simulate failure */ + if (errorConditions[eMallocError]) + return NULL; + + return malloc((size_t) size); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFree + * + * Frees dynamic memory + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +void EAS_HWFree (EAS_HW_DATA_HANDLE hwInstData, void *p) +{ + free(p); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMemCpy + * + * Copy memory wrapper + * + *---------------------------------------------------------------------------- +*/ +void *EAS_HWMemCpy (void *dest, const void *src, EAS_I32 amount) +{ + return memcpy(dest, src, (size_t) amount); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMemSet + * + * Set memory wrapper + * + *---------------------------------------------------------------------------- +*/ +void *EAS_HWMemSet (void *dest, int val, EAS_I32 amount) +{ + return memset(dest, val, (size_t) amount); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMemCmp + * + * Compare memory wrapper + * + *---------------------------------------------------------------------------- +*/ +EAS_I32 EAS_HWMemCmp (const void *s1, const void *s2, EAS_I32 amount) +{ + return (EAS_I32) memcmp(s1, s2, (size_t) amount); +} + +#ifdef BUFFERED_FILE_ACCESS +/*---------------------------------------------------------------------------- + * + * EAS_HWOpenFile + * + * Open a file for read or write + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWOpenFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_LOCATOR locator, EAS_FILE_HANDLE *pFile, EAS_FILE_MODE mode) +{ + EAS_HW_FILE *file; + int i; + + /* set return value to NULL */ + *pFile = NULL; + + /* only support read mode at this time */ + if (mode != EAS_FILE_READ) + return EAS_ERROR_INVALID_FILE_MODE; + + /* find an empty entry in the file table */ + file = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (file->pFile == NULL) + { + EAS_RESULT result; + + /* open the file */ + file->pFile = fopen((const char*) locator, "rb"); + if (file->pFile == NULL) + return EAS_ERROR_FILE_OPEN_FAILED; + + /* get file length */ + if ((result = EAS_HWFileLength(hwInstData, file, &file->fileSize)) != EAS_SUCCESS) + { + EAS_HWCloseFile(hwInstData, file); + return result; + } + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWOpenFile: Open file %d\n", i); +#endif + + /* initialize some values */ + file->bytesInBuffer = 0; + file->readIndex = 0; + file->filePos = 0; + file->dup = EAS_FALSE; + + *pFile = file; + return EAS_SUCCESS; + } + file++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFillBuffer + * + * Fill buffer from file + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFillBuffer (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file) +{ + /* reposition the file pointer */ + if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) + return EAS_ERROR_FILE_SEEK; + + /* read some data from the file */ + file->bytesInBuffer = (EAS_I32) fread(file->buffer, 1, EAS_FILE_BUFFER_SIZE, file->pFile); + file->readIndex = 0; + if (file->bytesInBuffer == 0) + return EAS_EOF; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWReadFile + * + * Read data from a file + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) +{ + EAS_RESULT result; + EAS_I32 temp; + EAS_U8 *p = pBuffer; + EAS_I32 bytesLeft = n; + + *pBytesRead = 0; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWReadFile: Reading %d bytes from position %d\n", n, file->filePos); +#endif + + /* try to fulfill request from buffer */ + for (;bytesLeft > 0;) + { + /* how many bytes can we get from buffer? */ + temp = file->bytesInBuffer - file->readIndex; + if (temp > bytesLeft) + temp = bytesLeft; + + /* copy data from buffer */ + EAS_HWMemCpy(p, &file->buffer[file->readIndex], temp); + *pBytesRead += temp; + file->readIndex += temp; + file->filePos += temp; + p += temp; + bytesLeft -= temp; + + /* don't refill buffer if request is bigger than buffer */ + if ((bytesLeft == 0) || (bytesLeft >= EAS_FILE_BUFFER_SIZE)) + break; + + /* refill buffer */ + if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) + return result; + } + + /* more to read? do unbuffered read directly to target memory */ + if (bytesLeft) + { + + /* position the file pointer */ + if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) + return EAS_ERROR_FILE_SEEK; + + /* read data in the buffer */ + temp = (EAS_I32) fread(p, 1, (size_t) bytesLeft, file->pFile); + *pBytesRead += temp; + file->filePos += temp; + + /* reset buffer info */ + file->bytesInBuffer = 0; + file->readIndex = 0; + } + +#ifdef DEBUG_FILE_IO + { +#define BYTES_PER_LINE 16 + char str[BYTES_PER_LINE * 3 + 1]; + EAS_INT i; + for (i = 0; i < (n > BYTES_PER_LINE ? BYTES_PER_LINE : n) ; i ++) + sprintf(&str[i*3], "%02x ", ((EAS_U8*)pBuffer)[i]); + if (i) + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "%s\n", str); + } +#endif + + /* were n bytes read? */ + if (*pBytesRead != n) + return EAS_EOF; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetByte + * + * Read a byte from a file + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWGetByte (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p) +{ + EAS_RESULT result; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* use local buffer - do we have any data? */ + if (file->readIndex >= file->bytesInBuffer) + { + if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) + return result; + + /* if nothing to read, return EOF */ + if (file->bytesInBuffer == 0) + return EAS_EOF; + } + + /* get a character from the buffer */ + *((EAS_U8*) p) = file->buffer[file->readIndex++]; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetByte: Reading from position %d, byte = 0x%02x\n", file->filePos, *(EAS_U8*)p); +#endif + + file->filePos++; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetWord + * + * Read a 16-bit value from the file + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWGetWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_I32 count; + EAS_U8 c[2]; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetWord: Reading 2 bytes from position %d\n", file->filePos); +#endif + + /* read 2 bytes from the file */ + if ((result = EAS_HWReadFile(hwInstData, file, c, 2, &count)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U16*) p) = ((EAS_U16) c[0] << 8) | c[1]; + else + *((EAS_U16*) p) = ((EAS_U16) c[1] << 8) | c[0]; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetDWord + * + * Read a 16-bit value from the file + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWGetDWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_I32 count; + EAS_U8 c[4]; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetDWord: Reading 4 bytes from position %d\n", file->filePos); +#endif + + /* read 4 bytes from the file */ + if ((result = EAS_HWReadFile(hwInstData, file, c, 4, &count)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U32*) p) = ((EAS_U32) c[0] << 24) | ((EAS_U32) c[1] << 16) | ((EAS_U32) c[2] << 8) | c[3]; + else + *((EAS_U32*) p) = ((EAS_U32) c[3] << 24) | ((EAS_U32) c[2] << 16) | ((EAS_U32) c[1] << 8) | c[0]; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFilePos + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFilePos (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pPosition) +{ + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + *pPosition = file->filePos; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeek + * + * Seek to a specific location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFileSeek (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + EAS_I32 newIndex; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for seek past end */ + if ((position < 0) || (position > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeek: Seeking to new position %d\n", file->filePos); +#endif + + /* is new position in current buffer? */ + newIndex = position - file->filePos + file->readIndex; + if ((newIndex >= 0) && (newIndex < file->bytesInBuffer)) + { + file->readIndex = newIndex; + file->filePos = position; + return EAS_SUCCESS; + } + + /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ + file->filePos = position; + file->bytesInBuffer = 0; + file->readIndex = 0; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeekOfs + * + * Seek forward or back relative to the current position + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFileSeekOfs (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + EAS_I32 temp; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeekOfs: Seeking to new position %d\n", file->filePos + position); +#endif + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for seek past end */ + temp = file->filePos + position; + if ((temp < 0) || (temp > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + + /* is new position in current buffer? */ + temp = position + file->readIndex; + if ((temp >= 0) && (temp < file->bytesInBuffer)) + { + file->readIndex = temp; + file->filePos += position; + return EAS_SUCCESS; + } + + /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ + file->filePos += position; + file->bytesInBuffer = 0; + file->readIndex = 0; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileLength + * + * Return the file length + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFileLength (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pLength) +{ + long pos; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + if ((pos = ftell(file->pFile)) == -1L) + return EAS_ERROR_FILE_LENGTH; + if (fseek(file->pFile, 0L, SEEK_END) != 0) + return EAS_ERROR_FILE_LENGTH; + if ((*pLength = ftell(file->pFile)) == -1L) + return EAS_ERROR_FILE_LENGTH; + if (fseek(file->pFile, pos, SEEK_SET) != 0) + return EAS_ERROR_FILE_LENGTH; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWDupHandle + * + * Duplicate a file handle + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWDupHandle (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_FILE_HANDLE* pDupFile) +{ + EAS_HW_FILE *dupfile; + int i; + + /* check handle integrity */ + *pDupFile = NULL; + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* find an empty entry in the file table */ + dupfile = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (dupfile->pFile == NULL) + { + + /* copy info from the handle to be duplicated */ + dupfile->filePos = file->filePos; + dupfile->pFile = file->pFile; + dupfile->fileSize = file->fileSize; + + /* set the duplicate handle flag */ + dupfile->dup = file->dup = EAS_TRUE; + + /* initialize some values */ + dupfile->bytesInBuffer = 0; + dupfile->readIndex = 0; + + *pDupFile = dupfile; + return EAS_SUCCESS; + } + dupfile++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWClose + * + * Wrapper for fclose function + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWCloseFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file1) +{ + EAS_HW_FILE *file2,*dupFile; + int i; + + /* check handle integrity */ + if (file1->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for duplicate handle */ + if (file1->dup) + { + dupFile = NULL; + file2 = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* check for duplicate */ + if ((file1 != file2) && (file2->pFile == file1->pFile)) + { + /* is there more than one duplicate? */ + if (dupFile != NULL) + { + /* clear this entry and return */ + file1->pFile = NULL; + return EAS_SUCCESS; + } + + /* this is the first duplicate found */ + dupFile = file2; + } + file2++; + } + + /* there is only one duplicate, clear the dup flag */ + if (dupFile) + dupFile->dup = EAS_FALSE; + else + /* if we get here, there's a serious problem */ + return EAS_ERROR_HANDLE_INTEGRITY; + + /* clear this entry and return */ + file1->pFile = NULL; + return EAS_SUCCESS; + } + + /* no duplicates - close the file */ + if (fclose(file1->pFile) != 0) + return EAS_ERROR_CLOSE_FAILED; + + /* clear this entry and return */ + file1->pFile = NULL; + return EAS_SUCCESS; +} +#else +/*---------------------------------------------------------------------------- + * + * EAS_HWOpenFile + * + * Open a file for read or write + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWOpenFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_LOCATOR locator, EAS_FILE_HANDLE *pFile, EAS_FILE_MODE mode) +{ + EAS_HW_FILE *file; + FILE *ioFile; + int i, temp; + + /* set return value to NULL */ + *pFile = NULL; + + /* simulate failure */ + if (errorConditions[eOpenError]) + return EAS_FAILURE; + + /* only support read mode at this time */ + if (mode != EAS_FILE_READ) + return EAS_ERROR_INVALID_FILE_MODE; + + /* find an empty entry in the file table */ + file = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (file->buffer == NULL) + { + /* open the file */ + if ((ioFile = fopen(locator,"rb")) == NULL) + return EAS_ERROR_FILE_OPEN_FAILED; + + /* determine the file size */ + if (fseek(ioFile, 0L, SEEK_END) != 0) + return EAS_ERROR_FILE_LENGTH; + if ((file->fileSize = ftell(ioFile)) == -1L) + return EAS_ERROR_FILE_LENGTH; + if (fseek(ioFile, 0L, SEEK_SET) != 0) + return EAS_ERROR_FILE_LENGTH; + + /* allocate a buffer */ + file->buffer = EAS_HWMalloc(hwInstData, file->fileSize); + if (file->buffer == NULL) + { + fclose(ioFile); + return EAS_ERROR_MALLOC_FAILED; + } + + /* read the file into memory */ + temp = (int) fread(file->buffer, (size_t) file->fileSize, 1, ioFile); + + /* close the file - don't need it any more */ + fclose(ioFile); + + /* check for error reading file */ + if (temp != 1) + return EAS_ERROR_FILE_READ_FAILED; + + /* initialize some values */ + file->filePos = 0; + file->dup = EAS_FALSE; + + *pFile = file; + return EAS_SUCCESS; + } + file++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWReadFile + * + * Read data from a file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) +{ + EAS_I32 count; + + /* simulate failure */ + if (errorConditions[eReadError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* calculate the bytes to read */ + count = file->fileSize - file->filePos; + if (n < count) + count = n; + + /* copy the data to the requested location, and advance the pointer */ + if (count) + EAS_HWMemCpy(pBuffer, &file->buffer[file->filePos], count); + file->filePos += count; + *pBytesRead = count; + + /* were n bytes read? */ + if (count!= n) + return EAS_EOF; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetByte + * + * Read a byte from a file + * + *---------------------------------------------------------------------------- +*/ +/*lint -e{715} hwInstData available for customer use */ +EAS_RESULT EAS_HWGetByte (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p) +{ + + /* simulate failure */ + if (errorConditions[eReadError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for end of file */ + if (file->filePos >= file->fileSize) + { + *((EAS_U8*) p) = 0; + return EAS_EOF; + } + + /* get a character from the buffer */ + *((EAS_U8*) p) = file->buffer[file->filePos++]; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetWord + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWGetWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_U8 c1, c2; + + /* read 2 bytes from the file */ + if ((result = EAS_HWGetByte(hwInstData, file, &c1)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c2)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U16*) p) = ((EAS_U16) c1 << 8) | c2; + else + *((EAS_U16*) p) = ((EAS_U16) c2 << 8) | c1; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetDWord + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWGetDWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_U8 c1, c2,c3,c4; + + /* read 4 bytes from the file */ + if ((result = EAS_HWGetByte(hwInstData, file, &c1)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c2)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c3)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c4)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U32*) p) = ((EAS_U32) c1 << 24) | ((EAS_U32) c2 << 16) | ((EAS_U32) c3 << 8) | c4; + else + *((EAS_U32*) p)= ((EAS_U32) c4 << 24) | ((EAS_U32) c3 << 16) | ((EAS_U32) c2 << 8) | c1; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFilePos + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFilePos (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pPosition) +{ + + /* simulate failure */ + if (errorConditions[ePosError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + *pPosition = file->filePos; + return EAS_SUCCESS; +} /* end EAS_HWFilePos */ + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeek + * + * Seek to a specific location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFileSeek (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + + /* simulate failure */ + if (errorConditions[eSeekError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* validate new position */ + if ((position < 0) || (position > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + + /* save new position */ + file->filePos = position; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeekOfs + * + * Seek forward or back relative to the current position + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFileSeekOfs (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + + /* simulate failure */ + if (errorConditions[eSeekError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* determine the file position */ + position += file->filePos; + if ((position < 0) || (position > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + + /* save new position */ + file->filePos = position; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileLength + * + * Return the file length + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFileLength (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pLength) +{ + + /* simulate failure */ + if (errorConditions[eLengthError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + *pLength = file->fileSize; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWDupHandle + * + * Duplicate a file handle + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWDupHandle (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_FILE_HANDLE *pDupFile) +{ + EAS_HW_FILE *dupFile; + int i; + + /* simulate failure */ + if (errorConditions[eDupError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* find an empty entry in the file table */ + dupFile = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (dupFile->buffer == NULL) + { + + /* copy info from the handle to be duplicated */ + dupFile->filePos = file->filePos; + dupFile->fileSize = file->fileSize; + dupFile->buffer = file->buffer; + + /* set the duplicate handle flag */ + dupFile->dup = file->dup = EAS_TRUE; + + *pDupFile = dupFile; + return EAS_SUCCESS; + } + dupFile++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWClose + * + * Wrapper for fclose function + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWCloseFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file1) +{ + EAS_HW_FILE *file2,*dupFile; + int i; + + /* simulate failure */ + if (errorConditions[eCloseError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file1->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for duplicate handle */ + if (file1->dup) + { + dupFile = NULL; + file2 = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* check for duplicate */ + if ((file1 != file2) && (file2->buffer == file1->buffer)) + { + /* is there more than one duplicate? */ + if (dupFile != NULL) + { + /* clear this entry and return */ + file1->buffer = NULL; + return EAS_SUCCESS; + } + + /* this is the first duplicate found */ + else + dupFile = file2; + } + file2++; + } + + /* there is only one duplicate, clear the dup flag */ + if (dupFile) + dupFile->dup = EAS_FALSE; + else + /* if we get here, there's a serious problem */ + return EAS_ERROR_HANDLE_INTEGRITY; + + /* clear this entry and return */ + file1->buffer = NULL; + return EAS_SUCCESS; + } + + /* no duplicates -free the buffer */ + EAS_HWFree(hwInstData, file1->buffer); + + /* clear this entry and return */ + file1->buffer = NULL; + return EAS_SUCCESS; +} +#endif + +/*---------------------------------------------------------------------------- + * + * EAS_HWVibrate + * + * Turn on/off vibrate function + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWVibrate (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) +{ + vibState = state; +// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Vibrate state: %d\n", state); + return EAS_SUCCESS; +} /* end EAS_HWVibrate */ + +/*---------------------------------------------------------------------------- + * + * EAS_HWLED + * + * Turn on/off LED + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWLED (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) +{ + ledState = state; +// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "LED state: %d\n", state); + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWBackLight + * + * Turn on/off backlight + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWBackLight (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) +{ + backlightState = state; +// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Backlight state: %d\n", state); + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWYield + * + * This function is called periodically by the EAS library to give the + * host an opportunity to allow other tasks to run. There are two ways to + * use this call: + * + * If you have a multi-tasking OS, you can call the yield function in the + * OS to allow other tasks to run. In this case, return EAS_FALSE to tell + * the EAS library to continue processing when control returns from this + * function. + * + * If tasks run in a single thread by sequential function calls (sometimes + * call a "commutator loop"), return EAS_TRUE to cause the EAS Library to + * return to the caller. Be sure to check the number of bytes rendered + * before passing the audio buffer to the codec - it may not be filled. + * The next call to EAS_Render will continue processing until the buffer + * has been filled. + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_BOOL EAS_HWYield (EAS_HW_DATA_HANDLE hwInstData) +{ + /* put your code here */ + return EAS_FALSE; +} + + diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.h b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.h new file mode 100755 index 0000000..0c0a89d --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLib.h @@ -0,0 +1,31 @@ +/* + * EASLib.h + * EASLIb + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "eas_types.h" + +extern EAS_RESULT EAS_LibInit (EAS_DATA_HANDLE *pHandle) +{ + return EAS_Init(pEASData); +} + +EAS_EXPORT EAS_LibShutdown (EAS_DATA_HANDLE handle) +{ + EAS_Shutdown(handle); +} diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLibVst.c b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLibVst.c new file mode 100755 index 0000000..58c8770 --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/EASLibVst.c @@ -0,0 +1,1504 @@ +/* + * EASLib.c + * EASLIb + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +#include +#include +#include +#include + +#include "eas.h" +#include "eas_report.h" +#include "eas_host.h" + +#ifdef JET_INTERFACE +#include "jet.h" +#endif + + +#define EAS_EXPORT __attribute__((visibility("default"))) + +// #define DEBUG_FILE_IO + +/* include debug interface */ +#include "eas_host_debug.h" + +#ifdef AUX_MIXER +#include "eas_auxmix.h" +#endif + +/* this module requires dynamic memory support */ +#ifdef _STATIC_MEMORY +#error "eas_hostmm.c requires the dynamic memory model!\n" +#endif + +#ifndef EAS_MAX_FILE_HANDLES +#define EAS_MAX_FILE_HANDLES 32 +#endif + +#ifndef EAS_FILE_BUFFER_SIZE +#define EAS_FILE_BUFFER_SIZE 32 +#endif + +/* + * this structure and the related function are here + * to support the ability to create duplicate handles + * and buffering it in memory. If your system uses + * in-memory resources, you can eliminate the calls + * to malloc and free, the dup flag, and simply track + * the file size and read position. + */ + #ifdef BUFFERED_FILE_ACCESS +typedef struct eas_hw_file_tag +{ + FILE *pFile; + EAS_I32 bytesInBuffer; + EAS_I32 readIndex; + EAS_I32 filePos; + EAS_I32 fileSize; + EAS_BOOL dup; + EAS_U8 buffer[EAS_FILE_BUFFER_SIZE]; +} EAS_HW_FILE; +#else +typedef struct eas_hw_file_tag +{ + EAS_I32 fileSize; + EAS_I32 filePos; + EAS_BOOL dup; + EAS_U8 *buffer; +} EAS_HW_FILE; +#endif + +typedef struct eas_hw_inst_data_tag +{ + EAS_HW_FILE files[EAS_MAX_FILE_HANDLES]; +} EAS_HW_INST_DATA; + +EAS_BOOL errorConditions[eNumErrorConditions]; +EAS_BOOL ledState; +EAS_BOOL vibState; +EAS_BOOL backlightState; + +#define MAX_DEBUG_MSG_LEN 1024 + +typedef void (*EAS_LOG_FUNC)(EAS_INT severity, char *msg); + +static EAS_LOG_FUNC logCallback = NULL; +static char messageBuffer[MAX_DEBUG_MSG_LEN]; + +/* error counts */ +static EAS_INT eas_fatalErrors; +static EAS_INT eas_errors; +static EAS_INT eas_warnings; +static int severityLevel = 9999; + +/* wave out device */ +#ifndef MAX_WAVE_OUT_BUFFERS +#define MAX_WAVE_OUT_BUFFERS 8 +#endif + +#ifndef EAS_BUFFERS_PER_WAVE_BUFFER +#define EAS_BUFFERS_PER_WAVE_BUFFER 8 +#endif + +/*---------------------------------------------------------------------------- + * ResetErrorCounters() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT void ResetErrorCounters() +{ + eas_fatalErrors = 0; + eas_errors = 0; + eas_warnings = 0; +} + +/*---------------------------------------------------------------------------- + * SetLogCallback() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT void SetLogCallback (EAS_LOG_FUNC callback) +{ + logCallback = callback; +} + +#ifndef _NO_DEBUG_PREPROCESSOR +static S_DEBUG_MESSAGES debugMessages[] = +{ +#ifdef UNIFIED_DEBUG_MESSAGES +#include "eas_debugmsgs.h" +#endif + { 0,0,0 } +}; + +/*---------------------------------------------------------------------------- + * EAS_ReportEx() + *---------------------------------------------------------------------------- +*/ +void EAS_ReportEx (int severity, unsigned long hashCode, int serialNum, ...) +{ + va_list vargs; + int i; + + switch (severity) + { + case _EAS_SEVERITY_FATAL: + eas_fatalErrors++; + break; + + case _EAS_SEVERITY_ERROR: + eas_errors++; + break; + + case _EAS_SEVERITY_WARNING: + eas_warnings++; + break; + + default: + break; + } + + /* check severity level */ + if (severity > severityLevel) + return; + + /* check for callback */ + if (logCallback == NULL) + return; + + /* find the error message and output to stdout */ + for (i = 0; debugMessages[i].m_pDebugMsg; i++) + { + if ((debugMessages[i].m_nHashCode == hashCode) && + (debugMessages[i].m_nSerialNum == serialNum)) + { + va_start(vargs, serialNum); +#ifdef WIN32 + vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); +#else + vsprintf(messageBuffer, debugMessages[i].m_pDebugMsg, vargs); +#endif + logCallback(severity, messageBuffer); + va_end(vargs); + return; + } + } + printf("Unrecognized error: Severity=%d; HashCode=%lu; SerialNum=%d\n", severity, hashCode, serialNum); +} /* end EAS_ReportEx */ + +#else +/*---------------------------------------------------------------------------- + * EAS_Report() + *---------------------------------------------------------------------------- +*/ +void EAS_Report (int severity, const char *fmt, ...) +{ + va_list vargs; + + switch (severity) + { + case _EAS_SEVERITY_FATAL: + eas_fatalErrors++; + break; + + case _EAS_SEVERITY_ERROR: + eas_errors++; + break; + + case _EAS_SEVERITY_WARNING: + eas_warnings++; + break; + + default: + break; + } + + /* check severity level */ + if (severity > severityLevel) + return; + + /* check for callback */ + if (logCallback == NULL) + return; + + va_start(vargs, fmt); +#ifdef _WIN32 + vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); +#else + vsprintf(messageBuffer, fmt, vargs); +#endif + logCallback(severity, messageBuffer); + va_end(vargs); +} /* end EAS_Report */ + +/*---------------------------------------------------------------------------- + * EAS_ReportX() + *---------------------------------------------------------------------------- +*/ +void EAS_ReportX (int severity, const char *fmt, ...) +{ + va_list vargs; + + switch (severity) + { + case _EAS_SEVERITY_FATAL: + eas_fatalErrors++; + break; + + case _EAS_SEVERITY_ERROR: + eas_errors++; + break; + + case _EAS_SEVERITY_WARNING: + eas_warnings++; + break; + + default: + break; + } + + /* check severity level */ + if (severity > severityLevel) + return; + + /* check for callback */ + if (logCallback == NULL) + return; + + va_start(vargs, fmt); +#ifdef _WIN32 + vsprintf_s(messageBuffer, sizeof(messageBuffer), fmt, vargs); +#else + vsprintf(messageBuffer, fmt, vargs); +#endif + logCallback(severity, messageBuffer); + va_end(vargs); +} +#endif + +/*---------------------------------------------------------------------------- + * EAS_DLLSetDebugLevel() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT void EAS_DLLSetDebugLevel (int severity) +{ + severityLevel = severity; +} + +/*---------------------------------------------------------------------------- + * EAS_ExSetDebugLevel() + *---------------------------------------------------------------------------- +*/ +void EAS_SetDebugLevel (int severity) +{ + severityLevel = severity; +} + +/*---------------------------------------------------------------------------- + * EAS_SelectLibrary() + *---------------------------------------------------------------------------- +*/ +EAS_EXPORT EAS_RESULT EAS_SelectLib (EAS_DATA_HANDLE pEASData, EAS_HANDLE streamHandle, EAS_BOOL testLib) +{ + extern EAS_SNDLIB_HANDLE VMGetLibHandle(EAS_INT libNum); + return EAS_SetSoundLibrary(pEASData, streamHandle, VMGetLibHandle(testLib ? 1 : 0)); +} + + +#if defined(_DEBUG) && !defined(MSC) +#include +/*---------------------------------------------------------------------------- + * EnableHeapDebug() + *---------------------------------------------------------------------------- +*/ +static void EnableHeapDebug (void) +{ + int temp; + temp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + temp |= _CRTDBG_ALLOC_MEM_DF; + temp |= _CRTDBG_CHECK_ALWAYS_DF; + temp |= _CRTDBG_LEAK_CHECK_DF; +// temp |= _CRTDBG_DELAY_FREE_MEM_DF; + _CrtSetDbgFlag(temp); +} + +/*---------------------------------------------------------------------------- + * HeapCheck() + *---------------------------------------------------------------------------- + * Check heap status + *---------------------------------------------------------------------------- +*/ +void HeapCheck (void) +{ + int heapStatus; + + /* Check heap status */ + heapStatus = _heapchk(); + if ((heapStatus == _HEAPOK) || (heapStatus == _HEAPEMPTY)) + return; + + EAS_ReportX(_EAS_SEVERITY_FATAL, "Heap corrupt\n" ); +} +#endif + + +/*---------------------------------------------------------------------------- + * EAS_HWInit + * + * Initialize host wrapper interface + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWInit (EAS_HW_DATA_HANDLE *pHWInstData) +{ + +#if defined(_DEBUG) && !defined(MSC) + EnableHeapDebug(); +#endif + + #ifdef BUFFERED_FILE_ACCESS + EAS_ReportX(_EAS_SEVERITY_INFO, "EAS_HWInit: Buffered file access\n"); + #else + EAS_ReportX(_EAS_SEVERITY_INFO, "EAS_HWInit: Memory mapped file access\n"); + #endif + + /* simulate failure */ + if (errorConditions[eInitError]) + return EAS_FAILURE; + + /* need to track file opens for duplicate handles */ + *pHWInstData = malloc(sizeof(EAS_HW_INST_DATA)); + if (!(*pHWInstData)) + return EAS_ERROR_MALLOC_FAILED; + + EAS_HWMemSet(*pHWInstData, 0, sizeof(EAS_HW_INST_DATA)); + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * EAS_HWShutdown + * + * Shut down host wrapper interface + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWShutdown (EAS_HW_DATA_HANDLE hwInstData) +{ + + /* simulate failure */ + if (errorConditions[eShutdownError]) + return EAS_FAILURE; + + free(hwInstData); + +#if defined(_DEBUG) && !defined(MSC) + HeapCheck(); +#endif + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMalloc + * + * Allocates dynamic memory + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +void *EAS_HWMalloc (EAS_HW_DATA_HANDLE hwInstData, EAS_I32 size) +{ + /* simulate failure */ + if (errorConditions[eMallocError]) + return NULL; + + return malloc((size_t) size); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFree + * + * Frees dynamic memory + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +void EAS_HWFree (EAS_HW_DATA_HANDLE hwInstData, void *p) +{ + free(p); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMemCpy + * + * Copy memory wrapper + * + *---------------------------------------------------------------------------- +*/ +void *EAS_HWMemCpy (void *dest, const void *src, EAS_I32 amount) +{ + return memcpy(dest, src, (size_t) amount); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMemSet + * + * Set memory wrapper + * + *---------------------------------------------------------------------------- +*/ +void *EAS_HWMemSet (void *dest, int val, EAS_I32 amount) +{ + return memset(dest, val, (size_t) amount); +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWMemCmp + * + * Compare memory wrapper + * + *---------------------------------------------------------------------------- +*/ +EAS_I32 EAS_HWMemCmp (const void *s1, const void *s2, EAS_I32 amount) +{ + return (EAS_I32) memcmp(s1, s2, (size_t) amount); +} + +#ifdef BUFFERED_FILE_ACCESS +/*---------------------------------------------------------------------------- + * + * EAS_HWOpenFile + * + * Open a file for read or write + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWOpenFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_LOCATOR locator, EAS_FILE_HANDLE *pFile, EAS_FILE_MODE mode) +{ + EAS_HW_FILE *file; + int i; + + /* set return value to NULL */ + *pFile = NULL; + + /* only support read mode at this time */ + if (mode != EAS_FILE_READ) + return EAS_ERROR_INVALID_FILE_MODE; + + /* find an empty entry in the file table */ + file = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (file->pFile == NULL) + { + EAS_RESULT result; + + /* open the file */ + file->pFile = fopen((const char*) locator, "rb"); + if (file->pFile == NULL) + return EAS_ERROR_FILE_OPEN_FAILED; + + /* get file length */ + if ((result = EAS_HWFileLength(hwInstData, file, &file->fileSize)) != EAS_SUCCESS) + { + EAS_HWCloseFile(hwInstData, file); + return result; + } + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWOpenFile: Open file %d\n", i); +#endif + + /* initialize some values */ + file->bytesInBuffer = 0; + file->readIndex = 0; + file->filePos = 0; + file->dup = EAS_FALSE; + + *pFile = file; + return EAS_SUCCESS; + } + file++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFillBuffer + * + * Fill buffer from file + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFillBuffer (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file) +{ + /* reposition the file pointer */ + if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) + return EAS_ERROR_FILE_SEEK; + + /* read some data from the file */ + file->bytesInBuffer = (EAS_I32) fread(file->buffer, 1, EAS_FILE_BUFFER_SIZE, file->pFile); + file->readIndex = 0; + if (file->bytesInBuffer == 0) + return EAS_EOF; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWReadFile + * + * Read data from a file + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) +{ + EAS_RESULT result; + EAS_I32 temp; + EAS_U8 *p = pBuffer; + EAS_I32 bytesLeft = n; + + *pBytesRead = 0; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWReadFile: Reading %d bytes from position %d\n", n, file->filePos); +#endif + + /* try to fulfill request from buffer */ + for (;bytesLeft > 0;) + { + /* how many bytes can we get from buffer? */ + temp = file->bytesInBuffer - file->readIndex; + if (temp > bytesLeft) + temp = bytesLeft; + + /* copy data from buffer */ + EAS_HWMemCpy(p, &file->buffer[file->readIndex], temp); + *pBytesRead += temp; + file->readIndex += temp; + file->filePos += temp; + p += temp; + bytesLeft -= temp; + + /* don't refill buffer if request is bigger than buffer */ + if ((bytesLeft == 0) || (bytesLeft >= EAS_FILE_BUFFER_SIZE)) + break; + + /* refill buffer */ + if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) + return result; + } + + /* more to read? do unbuffered read directly to target memory */ + if (bytesLeft) + { + + /* position the file pointer */ + if (fseek(file->pFile, file->filePos, SEEK_SET) != 0) + return EAS_ERROR_FILE_SEEK; + + /* read data in the buffer */ + temp = (EAS_I32) fread(p, 1, (size_t) bytesLeft, file->pFile); + *pBytesRead += temp; + file->filePos += temp; + + /* reset buffer info */ + file->bytesInBuffer = 0; + file->readIndex = 0; + } + +#ifdef DEBUG_FILE_IO + { +#define BYTES_PER_LINE 16 + char str[BYTES_PER_LINE * 3 + 1]; + EAS_INT i; + for (i = 0; i < (n > BYTES_PER_LINE ? BYTES_PER_LINE : n) ; i ++) + sprintf(&str[i*3], "%02x ", ((EAS_U8*)pBuffer)[i]); + if (i) + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "%s\n", str); + } +#endif + + /* were n bytes read? */ + if (*pBytesRead != n) + return EAS_EOF; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetByte + * + * Read a byte from a file + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWGetByte (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p) +{ + EAS_RESULT result; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* use local buffer - do we have any data? */ + if (file->readIndex >= file->bytesInBuffer) + { + if ((result = EAS_HWFillBuffer(hwInstData, file)) != EAS_SUCCESS) + return result; + + /* if nothing to read, return EOF */ + if (file->bytesInBuffer == 0) + return EAS_EOF; + } + + /* get a character from the buffer */ + *((EAS_U8*) p) = file->buffer[file->readIndex++]; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetByte: Reading from position %d, byte = 0x%02x\n", file->filePos, *(EAS_U8*)p); +#endif + + file->filePos++; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetWord + * + * Read a 16-bit value from the file + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWGetWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_I32 count; + EAS_U8 c[2]; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetWord: Reading 2 bytes from position %d\n", file->filePos); +#endif + + /* read 2 bytes from the file */ + if ((result = EAS_HWReadFile(hwInstData, file, c, 2, &count)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U16*) p) = ((EAS_U16) c[0] << 8) | c[1]; + else + *((EAS_U16*) p) = ((EAS_U16) c[1] << 8) | c[0]; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetDWord + * + * Read a 16-bit value from the file + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWGetDWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_I32 count; + EAS_U8 c[4]; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWGetDWord: Reading 4 bytes from position %d\n", file->filePos); +#endif + + /* read 4 bytes from the file */ + if ((result = EAS_HWReadFile(hwInstData, file, c, 4, &count)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U32*) p) = ((EAS_U32) c[0] << 24) | ((EAS_U32) c[1] << 16) | ((EAS_U32) c[2] << 8) | c[3]; + else + *((EAS_U32*) p) = ((EAS_U32) c[3] << 24) | ((EAS_U32) c[2] << 16) | ((EAS_U32) c[1] << 8) | c[0]; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFilePos + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFilePos (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pPosition) +{ + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + *pPosition = file->filePos; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeek + * + * Seek to a specific location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFileSeek (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + EAS_I32 newIndex; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for seek past end */ + if ((position < 0) || (position > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeek: Seeking to new position %d\n", file->filePos); +#endif + + /* is new position in current buffer? */ + newIndex = position - file->filePos + file->readIndex; + if ((newIndex >= 0) && (newIndex < file->bytesInBuffer)) + { + file->readIndex = newIndex; + file->filePos = position; + return EAS_SUCCESS; + } + + /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ + file->filePos = position; + file->bytesInBuffer = 0; + file->readIndex = 0; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeekOfs + * + * Seek forward or back relative to the current position + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFileSeekOfs (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + EAS_I32 temp; + +#ifdef DEBUG_FILE_IO + EAS_ReportX(_EAS_SEVERITY_NOFILTER, "EAS_HWFileSeekOfs: Seeking to new position %d\n", file->filePos + position); +#endif + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for seek past end */ + temp = file->filePos + position; + if ((temp < 0) || (temp > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + + /* is new position in current buffer? */ + temp = position + file->readIndex; + if ((temp >= 0) && (temp < file->bytesInBuffer)) + { + file->readIndex = temp; + file->filePos += position; + return EAS_SUCCESS; + } + + /* save new position and reset buffer info so EAS_HWGetByte doesn't fail */ + file->filePos += position; + file->bytesInBuffer = 0; + file->readIndex = 0; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileLength + * + * Return the file length + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) hwInstData available for customer use */ +EAS_RESULT EAS_HWFileLength (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pLength) +{ + long pos; + + /* check handle integrity */ + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + if ((pos = ftell(file->pFile)) == -1L) + return EAS_ERROR_FILE_LENGTH; + if (fseek(file->pFile, 0L, SEEK_END) != 0) + return EAS_ERROR_FILE_LENGTH; + if ((*pLength = ftell(file->pFile)) == -1L) + return EAS_ERROR_FILE_LENGTH; + if (fseek(file->pFile, pos, SEEK_SET) != 0) + return EAS_ERROR_FILE_LENGTH; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWDupHandle + * + * Duplicate a file handle + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWDupHandle (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_FILE_HANDLE* pDupFile) +{ + EAS_HW_FILE *dupfile; + int i; + + /* check handle integrity */ + *pDupFile = NULL; + if (file->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* find an empty entry in the file table */ + dupfile = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (dupfile->pFile == NULL) + { + + /* copy info from the handle to be duplicated */ + dupfile->filePos = file->filePos; + dupfile->pFile = file->pFile; + dupfile->fileSize = file->fileSize; + + /* set the duplicate handle flag */ + dupfile->dup = file->dup = EAS_TRUE; + + /* initialize some values */ + dupfile->bytesInBuffer = 0; + dupfile->readIndex = 0; + + *pDupFile = dupfile; + return EAS_SUCCESS; + } + dupfile++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWClose + * + * Wrapper for fclose function + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWCloseFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file1) +{ + EAS_HW_FILE *file2,*dupFile; + int i; + + /* check handle integrity */ + if (file1->pFile == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for duplicate handle */ + if (file1->dup) + { + dupFile = NULL; + file2 = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* check for duplicate */ + if ((file1 != file2) && (file2->pFile == file1->pFile)) + { + /* is there more than one duplicate? */ + if (dupFile != NULL) + { + /* clear this entry and return */ + file1->pFile = NULL; + return EAS_SUCCESS; + } + + /* this is the first duplicate found */ + dupFile = file2; + } + file2++; + } + + /* there is only one duplicate, clear the dup flag */ + if (dupFile) + dupFile->dup = EAS_FALSE; + else + /* if we get here, there's a serious problem */ + return EAS_ERROR_HANDLE_INTEGRITY; + + /* clear this entry and return */ + file1->pFile = NULL; + return EAS_SUCCESS; + } + + /* no duplicates - close the file */ + if (fclose(file1->pFile) != 0) + return EAS_ERROR_CLOSE_FAILED; + + /* clear this entry and return */ + file1->pFile = NULL; + return EAS_SUCCESS; +} +#else +/*---------------------------------------------------------------------------- + * + * EAS_HWOpenFile + * + * Open a file for read or write + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWOpenFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_LOCATOR locator, EAS_FILE_HANDLE *pFile, EAS_FILE_MODE mode) +{ + EAS_HW_FILE *file; + FILE *ioFile; + int i, temp; + + /* set return value to NULL */ + *pFile = NULL; + + /* simulate failure */ + if (errorConditions[eOpenError]) + return EAS_FAILURE; + + /* only support read mode at this time */ + if (mode != EAS_FILE_READ) + return EAS_ERROR_INVALID_FILE_MODE; + + /* find an empty entry in the file table */ + file = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (file->buffer == NULL) + { + /* open the file */ + if ((ioFile = fopen(locator,"rb")) == NULL) + return EAS_ERROR_FILE_OPEN_FAILED; + + /* determine the file size */ + if (fseek(ioFile, 0L, SEEK_END) != 0) + return EAS_ERROR_FILE_LENGTH; + if ((file->fileSize = ftell(ioFile)) == -1L) + return EAS_ERROR_FILE_LENGTH; + if (fseek(ioFile, 0L, SEEK_SET) != 0) + return EAS_ERROR_FILE_LENGTH; + + /* allocate a buffer */ + file->buffer = EAS_HWMalloc(hwInstData, file->fileSize); + if (file->buffer == NULL) + { + fclose(ioFile); + return EAS_ERROR_MALLOC_FAILED; + } + + /* read the file into memory */ + temp = (int) fread(file->buffer, (size_t) file->fileSize, 1, ioFile); + + /* close the file - don't need it any more */ + fclose(ioFile); + + /* check for error reading file */ + if (temp != 1) + return EAS_ERROR_FILE_READ_FAILED; + + /* initialize some values */ + file->filePos = 0; + file->dup = EAS_FALSE; + + *pFile = file; + return EAS_SUCCESS; + } + file++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWReadFile + * + * Read data from a file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWReadFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *pBuffer, EAS_I32 n, EAS_I32 *pBytesRead) +{ + EAS_I32 count; + + /* simulate failure */ + if (errorConditions[eReadError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* calculate the bytes to read */ + count = file->fileSize - file->filePos; + if (n < count) + count = n; + + /* copy the data to the requested location, and advance the pointer */ + if (count) + EAS_HWMemCpy(pBuffer, &file->buffer[file->filePos], count); + file->filePos += count; + *pBytesRead = count; + + /* were n bytes read? */ + if (count!= n) + return EAS_EOF; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetByte + * + * Read a byte from a file + * + *---------------------------------------------------------------------------- +*/ +/*lint -e{715} hwInstData available for customer use */ +EAS_RESULT EAS_HWGetByte (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p) +{ + + /* simulate failure */ + if (errorConditions[eReadError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for end of file */ + if (file->filePos >= file->fileSize) + { + *((EAS_U8*) p) = 0; + return EAS_EOF; + } + + /* get a character from the buffer */ + *((EAS_U8*) p) = file->buffer[file->filePos++]; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetWord + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWGetWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_U8 c1, c2; + + /* read 2 bytes from the file */ + if ((result = EAS_HWGetByte(hwInstData, file, &c1)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c2)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U16*) p) = ((EAS_U16) c1 << 8) | c2; + else + *((EAS_U16*) p) = ((EAS_U16) c2 << 8) | c1; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWGetDWord + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWGetDWord (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, void *p, EAS_BOOL msbFirst) +{ + EAS_RESULT result; + EAS_U8 c1, c2,c3,c4; + + /* read 4 bytes from the file */ + if ((result = EAS_HWGetByte(hwInstData, file, &c1)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c2)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c3)) != EAS_SUCCESS) + return result; + if ((result = EAS_HWGetByte(hwInstData, file, &c4)) != EAS_SUCCESS) + return result; + + /* order them as requested */ + if (msbFirst) + *((EAS_U32*) p) = ((EAS_U32) c1 << 24) | ((EAS_U32) c2 << 16) | ((EAS_U32) c3 << 8) | c4; + else + *((EAS_U32*) p)= ((EAS_U32) c4 << 24) | ((EAS_U32) c3 << 16) | ((EAS_U32) c2 << 8) | c1; + + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFilePos + * + * Returns the current location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFilePos (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pPosition) +{ + + /* simulate failure */ + if (errorConditions[ePosError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + *pPosition = file->filePos; + return EAS_SUCCESS; +} /* end EAS_HWFilePos */ + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeek + * + * Seek to a specific location in the file + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFileSeek (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + + /* simulate failure */ + if (errorConditions[eSeekError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* validate new position */ + if ((position < 0) || (position > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + + /* save new position */ + file->filePos = position; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileSeekOfs + * + * Seek forward or back relative to the current position + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFileSeekOfs (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 position) +{ + + /* simulate failure */ + if (errorConditions[eSeekError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* determine the file position */ + position += file->filePos; + if ((position < 0) || (position > file->fileSize)) + return EAS_ERROR_FILE_SEEK; + + /* save new position */ + file->filePos = position; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWFileLength + * + * Return the file length + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWFileLength (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_I32 *pLength) +{ + + /* simulate failure */ + if (errorConditions[eLengthError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + *pLength = file->fileSize; + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWDupHandle + * + * Duplicate a file handle + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWDupHandle (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file, EAS_FILE_HANDLE *pDupFile) +{ + EAS_HW_FILE *dupFile; + int i; + + /* simulate failure */ + if (errorConditions[eDupError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* find an empty entry in the file table */ + dupFile = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* is this slot being used? */ + if (dupFile->buffer == NULL) + { + + /* copy info from the handle to be duplicated */ + dupFile->filePos = file->filePos; + dupFile->fileSize = file->fileSize; + dupFile->buffer = file->buffer; + + /* set the duplicate handle flag */ + dupFile->dup = file->dup = EAS_TRUE; + + *pDupFile = dupFile; + return EAS_SUCCESS; + } + dupFile++; + } + + /* too many open files */ + return EAS_ERROR_MAX_FILES_OPEN; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWClose + * + * Wrapper for fclose function + * + *---------------------------------------------------------------------------- +*/ +EAS_RESULT EAS_HWCloseFile (EAS_HW_DATA_HANDLE hwInstData, EAS_FILE_HANDLE file1) +{ + EAS_HW_FILE *file2,*dupFile; + int i; + + /* simulate failure */ + if (errorConditions[eCloseError]) + return EAS_FAILURE; + + /* make sure we have a valid handle */ + if (file1->buffer == NULL) + return EAS_ERROR_INVALID_HANDLE; + + /* check for duplicate handle */ + if (file1->dup) + { + dupFile = NULL; + file2 = hwInstData->files; + for (i = 0; i < EAS_MAX_FILE_HANDLES; i++) + { + /* check for duplicate */ + if ((file1 != file2) && (file2->buffer == file1->buffer)) + { + /* is there more than one duplicate? */ + if (dupFile != NULL) + { + /* clear this entry and return */ + file1->buffer = NULL; + return EAS_SUCCESS; + } + + /* this is the first duplicate found */ + else + dupFile = file2; + } + file2++; + } + + /* there is only one duplicate, clear the dup flag */ + if (dupFile) + dupFile->dup = EAS_FALSE; + else + /* if we get here, there's a serious problem */ + return EAS_ERROR_HANDLE_INTEGRITY; + + /* clear this entry and return */ + file1->buffer = NULL; + return EAS_SUCCESS; + } + + /* no duplicates -free the buffer */ + EAS_HWFree(hwInstData, file1->buffer); + + /* clear this entry and return */ + file1->buffer = NULL; + return EAS_SUCCESS; +} +#endif + +/*---------------------------------------------------------------------------- + * + * EAS_HWVibrate + * + * Turn on/off vibrate function + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWVibrate (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) +{ + vibState = state; +// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Vibrate state: %d\n", state); + return EAS_SUCCESS; +} /* end EAS_HWVibrate */ + +/*---------------------------------------------------------------------------- + * + * EAS_HWLED + * + * Turn on/off LED + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWLED (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) +{ + ledState = state; +// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "LED state: %d\n", state); + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWBackLight + * + * Turn on/off backlight + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_RESULT EAS_HWBackLight (EAS_HW_DATA_HANDLE hwInstData, EAS_BOOL state) +{ + backlightState = state; +// EAS_ReportX(_EAS_SEVERITY_NOFILTER, "Backlight state: %d\n", state); + return EAS_SUCCESS; +} + +/*---------------------------------------------------------------------------- + * + * EAS_HWYield + * + * This function is called periodically by the EAS library to give the + * host an opportunity to allow other tasks to run. There are two ways to + * use this call: + * + * If you have a multi-tasking OS, you can call the yield function in the + * OS to allow other tasks to run. In this case, return EAS_FALSE to tell + * the EAS library to continue processing when control returns from this + * function. + * + * If tasks run in a single thread by sequential function calls (sometimes + * call a "commutator loop"), return EAS_TRUE to cause the EAS Library to + * return to the caller. Be sure to check the number of bytes rendered + * before passing the audio buffer to the codec - it may not be filled. + * The next call to EAS_Render will continue processing until the buffer + * has been filled. + * + *---------------------------------------------------------------------------- +*/ +/*lint -esym(715, hwInstData) available for customer use */ +EAS_BOOL EAS_HWYield (EAS_HW_DATA_HANDLE hwInstData) +{ + /* put your code here */ + return EAS_FALSE; +} + + diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/README.txt b/arm-wt-22k/jetcreator_lib_src/darwin-x86/README.txt new file mode 100644 index 0000000..bcc6ef0 --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/README.txt @@ -0,0 +1,9 @@ +OS X JetCreator Library Build Instructions + +1/ Open easwt_vst_lib.xcodeproj and build + +2/ Open EASLIb.xcodeproj and build + +3/ Copy build/Release/libEASLIb.dylib to the JetCreator folder + + diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/eas_host_debug.h b/arm-wt-22k/jetcreator_lib_src/darwin-x86/eas_host_debug.h new file mode 100755 index 0000000..8a01922 --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/eas_host_debug.h @@ -0,0 +1,47 @@ +/*---------------------------------------------------------------------------- + * + * File: + * eas_host_debug.h + * + * Contents and purpose: + * This header defines the host wrapper functions for simulating + * error conditions. + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +// sentinel +#ifndef _EAS_HOST_DEBUG_H +#define _EAS_HOST_DEBUG_H + +#include "eas_types.h" + +typedef enum +{ + eInitError, + eShutdownError, + eMallocError, + eOpenError, + eReadError, + ePosError, + eSeekError, + eLengthError, + eDupError, + eCloseError, + eNumErrorConditions, +} E_ERROR_CONDITIONS; + +#endif + diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/eastestv37.c b/arm-wt-22k/jetcreator_lib_src/darwin-x86/eastestv37.c new file mode 100755 index 0000000..e4e9c48 --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/eastestv37.c @@ -0,0 +1,999 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#include "eas_sndlib.h" + +/*---------------------------------------------------------------------------- + * Articulations + *---------------------------------------------------------------------------- +*/ +const S_ARTICULATION testArticulations[] = +{ + { /* articulation 0 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 1 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 19, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 2 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 34, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 3 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 86, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 4 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 172, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 5 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 345, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 6 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 517, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 7 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 689, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 8 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 861, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 9 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 1723, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 10 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 191, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 11 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 382, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 12 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 13 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 1903, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 14 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 3804, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 15 */ + { 1902, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 16 */ + { 380, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 17 */ + { 190, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 18 */ + { 38, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 19 */ + { 19, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 20 */ + { 10, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 21 */ + { 5, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 22 */ + { 32767, 17213, 0, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 23 */ + { 32767, 28809, 0, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 24 */ + { 32767, 30725, 0, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 25 */ + { 32767, 32349, 0, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 26 */ + { 32767, 32558, 0, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 27 */ + { 32767, 32663, 0, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 28 */ + { 32767, 32715, 0, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 29 */ + { 32767, 30725, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 30 */ + { 32767, 30725, 3566, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 31 */ + { 32767, 30725, 42, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 32 */ + { 32767, 30725, 5, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 33 */ + { 32767, 30725, 2, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 34 */ + { 32767, 0, 32767, 17213 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 35 */ + { 32767, 0, 32767, 28809 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 36 */ + { 32767, 0, 32767, 30725 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 37 */ + { 32767, 0, 32767, 32349 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 38 */ + { 32767, 0, 32767, 32558 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 39 */ + { 32767, 0, 32767, 32663 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 40 */ + { 32767, 0, 32767, 32715 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 41 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 190, 0, 0, 0, 1, 0, 0 + }, + { /* articulation 42 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 189, 0, 0, 0, 3, 0, 0 + }, + { /* articulation 43 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 190, 0, 0, 0, 4, 0, 0 + }, + { /* articulation 44 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 190, 0, 0, 0, 6, 0, 0 + }, + { /* articulation 45 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + -1200, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 46 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + -600, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 47 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + -100, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 48 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + -50, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 49 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 50, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 50 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 51 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 600, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 52 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 1200, 0, 190, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 53 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, -1200, 0, 0, 0, 0, 0 + }, + { /* articulation 54 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, -600, 0, 0, 0, 0, 0 + }, + { /* articulation 55 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, -100, 0, 0, 0, 0, 0 + }, + { /* articulation 56 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, -50, 0, 0, 0, 0, 0 + }, + { /* articulation 57 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 50, 0, 0, 0, 0, 0 + }, + { /* articulation 58 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 100, 0, 0, 0, 0, 0 + }, + { /* articulation 59 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 600, 0, 0, 0, 0, 0 + }, + { /* articulation 60 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 1200, 0, 0, 0, 0, 0 + }, + { /* articulation 61 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 5535, 0, 0, 0 + }, + { /* articulation 62 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 7121, 0, 0, 0 + }, + { /* articulation 63 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 8321, 0, 0, 0 + }, + { /* articulation 64 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 9906, 0, 0, 0 + }, + { /* articulation 65 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 11106, 0, 0, 0 + }, + { /* articulation 66 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 9521, 0, 0, 0 + }, + { /* articulation 67 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 9521, 0, 8, 0 + }, + { /* articulation 68 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 9521, 0, 16, 0 + }, + { /* articulation 69 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 9521, 0, 24, 0 + }, + { /* articulation 70 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 9521, 0, 30, 0 + }, + { /* articulation 71 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, -6400, 9521, 0, 0, 0 + }, + { /* articulation 72 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, -3200, 9521, 0, 0, 0 + }, + { /* articulation 73 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, -1600, 9521, 0, 0, 0 + }, + { /* articulation 74 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, -800, 9521, 0, 0, 0 + }, + { /* articulation 75 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, 800, 7121, 0, 0, 0 + }, + { /* articulation 76 */ + { 190, 30725, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, 1600, 7121, 0, 0, 0 + }, + { /* articulation 77 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, 3200, 7121, 0, 0, 0 + }, + { /* articulation 78 */ + { 32767, 0, 32767, 0 }, + { 190, 190, 0, 0 }, + 0, 0, 951, 0, 6400, 7121, 0, 0, 0 + }, + { /* articulation 79 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 190, 0, 0, 11106, 0, 0, 0 + }, + { /* articulation 80 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 191, 0, 0, 11106, 0, 0, 0 + }, + { /* articulation 81 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 190, 0, 0, 7121, 0, 0, 0 + }, + { /* articulation 82 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, -63 + }, + { /* articulation 83 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, -50 + }, + { /* articulation 84 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, -37 + }, + { /* articulation 85 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, -25 + }, + { /* articulation 86 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, -12 + }, + { /* articulation 87 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 12 + }, + { /* articulation 88 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 25 + }, + { /* articulation 89 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 37 + }, + { /* articulation 90 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 50 + }, + { /* articulation 91 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 0, 0, 0, 63 + }, + { /* articulation 92 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 9907, 0, 0, 0 + }, + { /* articulation 93 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 10574, 0, 0, 0 + }, + { /* articulation 94 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 11373, 0, 0, 0 + }, + { /* articulation 95 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 951, 0, 0, 11376, 0, 0, 0 + }, + { /* articulation 96 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 100, 0, 949, 0, 0, 0, 0, 0, 0 + } +}; /*end Articulations */ + +/*---------------------------------------------------------------------------- + * Regions + *---------------------------------------------------------------------------- +*/ +const S_WT_REGION testRegions[] = +{ + { { 32769, 0, 127 }, -6000, 32767, 101, 301, 4, 0 }, /* region 0 */ + { { 1, 0, 60 }, -6000, 32767, 101, 301, 4, 2 }, /* region 1 */ + { { 1, 61, 61 }, -6000, 32767, 101, 301, 4, 3 }, /* region 2 */ + { { 1, 62, 62 }, -6000, 32767, 101, 301, 4, 4 }, /* region 3 */ + { { 1, 63, 63 }, -6000, 32767, 101, 301, 4, 5 }, /* region 4 */ + { { 1, 64, 64 }, -6000, 32767, 101, 301, 4, 6 }, /* region 5 */ + { { 1, 65, 65 }, -6000, 32767, 101, 301, 4, 7 }, /* region 6 */ + { { 1, 66, 66 }, -6000, 32767, 101, 301, 4, 8 }, /* region 7 */ + { { 32769, 67, 127 }, -6000, 32767, 101, 301, 4, 9 }, /* region 8 */ + { { 32769, 0, 127 }, -6005, 32767, 3, 171, 5, 0 }, /* region 9 */ + { { 32768, 0, 127 }, -6555, 32767, 0, 0, 2, 0 }, /* region 10 */ + { { 32770, 0, 127 }, -6000, 32767, 0, 0, 0, 0 }, /* region 11 */ + { { 1, 60, 60 }, -6000, 32767, 101, 301, 4, 0 }, /* region 12 */ + { { 1, 61, 61 }, -6100, 16422, 101, 151, 4, 0 }, /* region 13 */ + { { 1, 62, 62 }, -6200, 8231, 101, 151, 4, 0 }, /* region 14 */ + { { 1, 63, 63 }, -6300, 2067, 101, 151, 4, 0 }, /* region 15 */ + { { 1, 64, 64 }, -6400, 130, 101, 151, 4, 0 }, /* region 16 */ + { { 32769, 65, 65 }, -6500, 1, 101, 151, 4, 0 }, /* region 17 */ + { { 1, 60, 60 }, -6000, 32767, 101, 301, 4, 0 }, /* region 18 */ + { { 1, 61, 61 }, -6200, 32767, 101, 151, 4, 0 }, /* region 19 */ + { { 1, 62, 62 }, -6400, 32767, 101, 151, 4, 0 }, /* region 20 */ + { { 1, 63, 63 }, -6600, 32767, 101, 151, 4, 0 }, /* region 21 */ + { { 1, 64, 64 }, -6800, 32767, 101, 151, 4, 0 }, /* region 22 */ + { { 1, 65, 65 }, -7000, 32767, 101, 151, 4, 0 }, /* region 23 */ + { { 1, 66, 66 }, -7200, 32767, 101, 151, 4, 0 }, /* region 24 */ + { { 1, 67, 67 }, -7400, 32767, 101, 151, 4, 0 }, /* region 25 */ + { { 1, 68, 68 }, -7600, 32767, 101, 151, 4, 0 }, /* region 26 */ + { { 1, 69, 69 }, -7800, 32767, 101, 151, 4, 0 }, /* region 27 */ + { { 1, 70, 70 }, -8000, 32767, 101, 151, 4, 0 }, /* region 28 */ + { { 1, 71, 71 }, -8200, 32767, 101, 151, 4, 0 }, /* region 29 */ + { { 32769, 72, 72 }, -8400, 32767, 101, 151, 4, 0 }, /* region 30 */ + { { 1, 60, 60 }, -6000, 32767, 101, 301, 4, 0 }, /* region 31 */ + { { 1, 61, 61 }, -6099, 32767, 101, 151, 4, 0 }, /* region 32 */ + { { 1, 62, 62 }, -6190, 32767, 101, 151, 4, 0 }, /* region 33 */ + { { 1, 63, 63 }, -6250, 32767, 101, 151, 4, 0 }, /* region 34 */ + { { 1, 64, 64 }, -6300, 32767, 101, 151, 4, 0 }, /* region 35 */ + { { 1, 65, 65 }, -6500, 32767, 101, 151, 4, 0 }, /* region 36 */ + { { 1, 66, 66 }, -6601, 32767, 101, 151, 4, 0 }, /* region 37 */ + { { 1, 67, 67 }, -6710, 32767, 101, 151, 4, 0 }, /* region 38 */ + { { 1, 68, 68 }, -6850, 32767, 101, 151, 4, 0 }, /* region 39 */ + { { 32769, 69, 69 }, -7000, 32767, 101, 151, 4, 0 }, /* region 40 */ + { { 1, 0, 0 }, 0, 32767, 101, 151, 4, 1 }, /* region 41 */ + { { 1, 1, 1 }, -100, 32767, 101, 151, 4, 10 }, /* region 42 */ + { { 1, 2, 2 }, -200, 32767, 101, 151, 4, 11 }, /* region 43 */ + { { 1, 3, 3 }, -300, 32767, 101, 151, 4, 12 }, /* region 44 */ + { { 1, 4, 4 }, -400, 32767, 101, 151, 4, 13 }, /* region 45 */ + { { 1, 5, 5 }, -500, 32767, 101, 151, 4, 14 }, /* region 46 */ + { { 1, 6, 6 }, -600, 32767, 101, 151, 4, 0 }, /* region 47 */ + { { 1, 7, 7 }, -700, 32767, 101, 151, 4, 15 }, /* region 48 */ + { { 1, 8, 8 }, -800, 32767, 101, 151, 4, 16 }, /* region 49 */ + { { 1, 9, 9 }, -900, 32767, 101, 151, 4, 17 }, /* region 50 */ + { { 1, 10, 10 }, -1000, 32767, 101, 151, 4, 18 }, /* region 51 */ + { { 1, 11, 11 }, -1100, 32767, 101, 151, 4, 19 }, /* region 52 */ + { { 1, 12, 12 }, -1200, 32767, 101, 151, 4, 20 }, /* region 53 */ + { { 1, 13, 13 }, -1300, 32767, 101, 151, 4, 21 }, /* region 54 */ + { { 1, 14, 14 }, -1400, 32767, 101, 151, 4, 22 }, /* region 55 */ + { { 1, 15, 15 }, -1500, 32767, 101, 151, 4, 23 }, /* region 56 */ + { { 1, 16, 16 }, -1600, 32767, 101, 151, 4, 24 }, /* region 57 */ + { { 1, 17, 17 }, -1700, 32767, 101, 151, 4, 25 }, /* region 58 */ + { { 1, 18, 18 }, -1800, 32767, 101, 151, 4, 26 }, /* region 59 */ + { { 1, 19, 19 }, -1900, 32767, 101, 151, 4, 27 }, /* region 60 */ + { { 1, 20, 20 }, -2000, 32767, 101, 151, 4, 28 }, /* region 61 */ + { { 1, 21, 21 }, -2100, 32767, 101, 151, 4, 29 }, /* region 62 */ + { { 1, 22, 22 }, -2200, 32767, 101, 151, 4, 30 }, /* region 63 */ + { { 1, 23, 23 }, -2300, 32767, 101, 151, 4, 31 }, /* region 64 */ + { { 1, 24, 24 }, -2400, 32767, 101, 151, 4, 32 }, /* region 65 */ + { { 1, 25, 25 }, -2500, 32767, 101, 151, 4, 33 }, /* region 66 */ + { { 1, 26, 26 }, -2600, 32767, 101, 151, 4, 24 }, /* region 67 */ + { { 1, 27, 27 }, -2700, 32767, 101, 151, 4, 0 }, /* region 68 */ + { { 1, 28, 28 }, -2800, 32767, 101, 151, 4, 34 }, /* region 69 */ + { { 1, 29, 29 }, -2900, 32767, 101, 151, 4, 35 }, /* region 70 */ + { { 1, 30, 30 }, -3000, 32767, 101, 151, 4, 36 }, /* region 71 */ + { { 1, 31, 31 }, -3100, 32767, 101, 151, 4, 37 }, /* region 72 */ + { { 1, 32, 32 }, -3200, 32767, 101, 151, 4, 38 }, /* region 73 */ + { { 1, 33, 33 }, -3300, 32767, 101, 151, 4, 39 }, /* region 74 */ + { { 1, 34, 34 }, -3400, 32767, 101, 151, 4, 40 }, /* region 75 */ + { { 1, 35, 35 }, -3500, 32767, 101, 151, 4, 41 }, /* region 76 */ + { { 1, 36, 36 }, -3600, 32767, 101, 151, 4, 42 }, /* region 77 */ + { { 1, 37, 37 }, -3700, 32767, 101, 151, 4, 43 }, /* region 78 */ + { { 1, 38, 38 }, -3800, 32767, 101, 151, 4, 44 }, /* region 79 */ + { { 1, 39, 39 }, -3900, 32767, 101, 151, 4, 45 }, /* region 80 */ + { { 1, 40, 40 }, -4000, 32767, 101, 151, 4, 46 }, /* region 81 */ + { { 1, 41, 41 }, -4100, 32767, 101, 151, 4, 47 }, /* region 82 */ + { { 1, 42, 42 }, -4200, 32767, 101, 151, 4, 48 }, /* region 83 */ + { { 1, 43, 43 }, -4300, 32767, 101, 151, 4, 49 }, /* region 84 */ + { { 1, 44, 44 }, -4400, 32767, 101, 151, 4, 50 }, /* region 85 */ + { { 1, 45, 45 }, -4500, 32767, 101, 151, 4, 51 }, /* region 86 */ + { { 1, 46, 46 }, -4600, 32767, 101, 151, 4, 52 }, /* region 87 */ + { { 1, 47, 47 }, -4700, 32767, 101, 151, 4, 53 }, /* region 88 */ + { { 1, 48, 48 }, -4800, 32767, 101, 151, 4, 54 }, /* region 89 */ + { { 1, 49, 49 }, -4900, 32767, 101, 151, 4, 55 }, /* region 90 */ + { { 1, 50, 50 }, -5000, 32767, 101, 151, 4, 56 }, /* region 91 */ + { { 1, 51, 51 }, -5100, 32767, 101, 151, 4, 57 }, /* region 92 */ + { { 1, 52, 52 }, -5200, 32767, 101, 151, 4, 58 }, /* region 93 */ + { { 1, 53, 53 }, -5300, 32767, 101, 151, 4, 59 }, /* region 94 */ + { { 1, 54, 54 }, -5400, 32767, 101, 151, 4, 60 }, /* region 95 */ + { { 2, 55, 55 }, -5500, 32767, 0, 0, 0, 61 }, /* region 96 */ + { { 2, 56, 56 }, -5600, 32767, 0, 0, 0, 62 }, /* region 97 */ + { { 2, 57, 57 }, -5700, 32767, 0, 0, 0, 63 }, /* region 98 */ + { { 2, 58, 58 }, -5800, 32767, 0, 0, 0, 64 }, /* region 99 */ + { { 2, 59, 59 }, -5900, 32767, 0, 0, 0, 65 }, /* region 100 */ + { { 2, 60, 60 }, -6000, 32767, 0, 0, 0, 0 }, /* region 101 */ + { { 2, 61, 61 }, -6100, 32767, 0, 0, 0, 66 }, /* region 102 */ + { { 2, 62, 62 }, -6200, 32767, 0, 0, 0, 67 }, /* region 103 */ + { { 2, 63, 63 }, -6300, 32767, 0, 0, 0, 68 }, /* region 104 */ + { { 2, 64, 64 }, -6400, 32767, 0, 0, 0, 69 }, /* region 105 */ + { { 2, 65, 65 }, -6500, 32767, 0, 0, 0, 70 }, /* region 106 */ + { { 2, 66, 66 }, -6600, 32767, 0, 0, 0, 71 }, /* region 107 */ + { { 2, 67, 67 }, -6700, 32767, 0, 0, 0, 72 }, /* region 108 */ + { { 2, 68, 68 }, -6800, 32767, 0, 0, 0, 73 }, /* region 109 */ + { { 2, 69, 69 }, -6900, 32767, 0, 0, 0, 74 }, /* region 110 */ + { { 2, 70, 70 }, -7000, 32767, 0, 0, 0, 75 }, /* region 111 */ + { { 2, 71, 71 }, -7100, 32767, 0, 0, 0, 76 }, /* region 112 */ + { { 2, 72, 72 }, -7200, 32767, 0, 0, 0, 77 }, /* region 113 */ + { { 2, 73, 73 }, -7300, 32767, 0, 0, 0, 78 }, /* region 114 */ + { { 2, 74, 74 }, -7400, 32767, 0, 0, 0, 79 }, /* region 115 */ + { { 2, 75, 75 }, -7500, 32767, 0, 0, 0, 79 }, /* region 116 */ + { { 2, 76, 76 }, -7600, 32767, 0, 0, 0, 79 }, /* region 117 */ + { { 2, 77, 77 }, -7700, 32767, 0, 0, 0, 80 }, /* region 118 */ + { { 2, 78, 78 }, -7800, 32767, 0, 0, 0, 81 }, /* region 119 */ + { { 2, 79, 79 }, -7900, 32767, 0, 0, 0, 81 }, /* region 120 */ + { { 2, 80, 80 }, -8000, 32767, 0, 0, 0, 81 }, /* region 121 */ + { { 2, 81, 81 }, -8100, 32767, 0, 0, 0, 81 }, /* region 122 */ + { { 2, 82, 82 }, -8200, 32767, 0, 0, 0, 0 }, /* region 123 */ + { { 257, 83, 83 }, -8300, 32767, 101, 151, 4, 0 }, /* region 124 */ + { { 257, 84, 84 }, -8405, 32767, 0, 171, 5, 0 }, /* region 125 */ + { { 0, 85, 85 }, -9055, 32767, 0, 0, 2, 82 }, /* region 126 */ + { { 0, 86, 86 }, -9155, 32767, 0, 0, 2, 83 }, /* region 127 */ + { { 0, 87, 87 }, -9255, 32767, 0, 0, 2, 84 }, /* region 128 */ + { { 0, 88, 88 }, -9355, 32767, 0, 0, 2, 85 }, /* region 129 */ + { { 0, 89, 89 }, -9455, 32767, 0, 0, 2, 86 }, /* region 130 */ + { { 0, 90, 90 }, -9555, 32767, 0, 0, 2, 0 }, /* region 131 */ + { { 0, 91, 91 }, -9655, 32767, 0, 0, 2, 87 }, /* region 132 */ + { { 0, 92, 92 }, -9755, 32767, 0, 0, 2, 88 }, /* region 133 */ + { { 0, 93, 93 }, -9855, 32767, 0, 0, 2, 89 }, /* region 134 */ + { { 0, 94, 94 }, -9955, 32767, 0, 0, 2, 90 }, /* region 135 */ + { { 0, 95, 95 }, -10055, 32767, 0, 0, 2, 91 }, /* region 136 */ + { { 2, 96, 96 }, -9600, 32767, 0, 0, 0, 63 }, /* region 137 */ + { { 2, 97, 97 }, -9700, 32767, 0, 0, 0, 92 }, /* region 138 */ + { { 2, 98, 98 }, -9800, 32767, 0, 0, 0, 93 }, /* region 139 */ + { { 2, 99, 99 }, -9900, 32767, 0, 0, 0, 94 }, /* region 140 */ + { { 2, 100, 100 }, -10000, 32767, 0, 0, 0, 95 }, /* region 141 */ + { { 32770, 101, 101 }, -10100, 32767, 0, 0, 0, 0 }, /* region 142 */ + { { 1, 36, 60 }, -6000, 32767, 1481, 1565, 0, 0 }, /* region 143 */ + { { 1, 61, 61 }, -7300, 32767, 740, 782, 1, 0 }, /* region 144 */ + { { 32769, 62, 62 }, -8599, 32767, 370, 391, 3, 0 }, /* region 145 */ + { { 32769, 60, 60 }, -6000, 32767, 101, 301, 4, 1 }, /* region 146 */ + { { 32769, 60, 60 }, -6000, 32767, 101, 301, 4, 50 }, /* region 147 */ + { { 32769, 60, 60 }, -6000, 32767, 101, 301, 4, 11 }, /* region 148 */ + { { 32769, 60, 60 }, -6000, 32767, 101, 301, 4, 96 }, /* region 149 */ + { { 32769, 60, 60 }, -6000, 32767, 101, 301, 4, 13 }, /* region 150 */ + { { 32769, 60, 60 }, -6000, 32767, 101, 301, 4, 14 } /* region 151 */ +}; /* end Regions */ + +/*---------------------------------------------------------------------------- + * Programs + *---------------------------------------------------------------------------- +*/ +const S_PROGRAM testPrograms[] = +{ + { 0, 41 } /* program 0 */, + { 1, 10 } /* program 1 */, + { 2, 11 } /* program 2 */, + { 3, 12 } /* program 3 */, + { 4, 18 } /* program 4 */, + { 5, 31 } /* program 5 */, + { 6, 143 } /* program 6 */, + { 7, 146 } /* program 7 */, + { 8, 147 } /* program 8 */, + { 9, 148 } /* program 9 */, + { 10, 149 } /* program 10 */, + { 11, 150 } /* program 11 */, + { 12, 151 } /* program 12 */, + { 13, 0 } /* program 13 */, + { 14, 9 } /* program 14 */, + { 15, 1 } /* program 15 */ +}; /* end Programs */ + +/*---------------------------------------------------------------------------- + * Banks + *---------------------------------------------------------------------------- +*/ +#define testBanks NULL + +/*---------------------------------------------------------------------------- + * Samples + *---------------------------------------------------------------------------- +*/ + +const EAS_SAMPLE testSamples[] = +{ + -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, + 13, 13, 14, 13, 13, 13, 12, 12, 10, 9, 8, 6, 5, 3, 2, 0, + -1, -3, -5, -8, -10, -12, -14, -15, -16, -17, -17, -17, -17, -16, -14, -13, + -11, -10, -8, -6, -5, -4, -4, -3, -3, -2, -1, -1, -1, -1, -1, -1, + -1, -2, -3, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -1, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 4, 6, 9, 11, 12, 13, 15, 16, 17, + 19, 20, 22, 23, 25, 28, 32, 34, 36, 36, 35, 31, 25, 18, 11, 3, + -5, -13, -20, -26, -31, -34, -35, -36, -36, -35, -34, -32, -29, -26, -23, -19, + -16, -12, -8, -5, -4, -4, -4, -6, -8, -9, -11, -11, -12, -13, -13, -13, + -12, -11, -10, -9, -7, -5, -4, -3, -2, -1, -1, 0, 0, 2, 4, 5, + 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 7, 9, 12, 14, 17, 20, + 24, 27, 30, 33, 36, 39, 41, 43, 46, 49, 51, 51, 50, 48, 43, 35, + 25, 14, 1, -12, -25, -37, -48, -56, -61, -63, -62, -60, -57, -53, -48, -42, + -35, -29, -23, -17, -12, -8, -5, -3, -3, -4, -5, -7, -9, -11, -12, -14, + -14, -14, -14, -13, -11, -9, -7, -5, -3, -1, 0, 1, 1, 1, 2, 3, + 4, 5, 6, 6, 7, 8, 9, 10, 11, 11, 11, 11, 10, 9, 9, 10, + 12, 14, 17, 20, 23, 26, 30, 34, 38, 40, 43, 46, 49, 52, 55, 57, + 58, 56, 50, 42, 30, 16, 1, -15, -29, -43, -54, -63, -68, -69, -68, -65, + -60, -55, -49, -42, -35, -29, -22, -16, -10, -6, -2, -1, 0, -1, -3, -6, + -9, -12, -16, -18, -20, -21, -21, -21, -19, -17, -14, -11, -8, -5, -2, 1, + 3, 5, 7, 9, 11, 12, 12, 12, 11, 10, 9, 8, 7, 7, 7, 7, + 8, 9, 10, 12, 15, 17, 19, 22, 24, 26, 28, 30, 32, 34, 36, 38, + 42, 44, 47, 49, 53, 56, 55, 52, 45, 35, 22, 8, -8, -23, -37, -50, + -60, -67, -71, -71, -69, -63, -56, -48, -40, -33, -27, -21, -16, -12, -8, -6, + -5, -5, -6, -8, -11, -14, -17, -19, -21, -22, -22, -22, -20, -18, -16, -13, + -9, -6, -2, 1, 5, 7, 8, 9, 10, 11, 11, 11, 10, 10, 9, 9, + 9, 8, 8, 9, 9, 10, 10, 12, 13, 14, 16, 18, 19, 21, 24, 26, + 29, 32, 35, 39, 42, 46, 49, 51, 53, 56, 59, 59, 55, 48, 37, 22, + 5, -12, -29, -45, -58, -68, -74, -77, -77, -75, -69, -62, -53, -44, -35, -28, + -21, -15, -11, -8, -5, -4, -4, -4, -6, -8, -10, -13, -15, -17, -19, -19, + -19, -18, -16, -13, -10, -8, -4, -1, 1, 4, 5, 7, 8, 10, 11, 12, + 13, 14, 14, 13, 12, 12, 11, 9, 8, 7, 6, 6, 7, 8, 10, 12, + 15, 18, 21, 25, 29, 34, 39, 45, 51, 57, 61, 67, 73, 77, 82, 84, + 81, 70, 52, 29, 3, -24, -49, -72, -90, -103, -110, -112, -109, -102, -91, -78, + -64, -49, -35, -23, -13, -5, 1, 5, 8, 9, 9, 7, 4, 0, -4, -9, + -12, -15, -18, -18, -18, -17, -14, -12, -9, -6, -3, 0, 3, 6, 8, 10, + 11, 12, 11, 11, 10, 8, 7, 5, 4, 2, 2, 1, 2, 3, 4, 6, + 8, 11, 13, 15, 18, 21, 26, 31, 36, 42, 48, 53, 60, 66, 72, 77, + 82, 87, 91, 91, 86, 73, 54, 28, -2, -32, -61, -86, -105, -119, -126, -126, + -121, -111, -98, -82, -65, -48, -33, -19, -7, 1, 8, 12, 14, 14, 12, 10, + 6, 1, -4, -9, -14, -18, -20, -21, -22, -21, -19, -17, -14, -11, -8, -4, + 0, 3, 7, 10, 12, 13, 14, 14, 13, 12, 11, 10, 9, 8, 7, 5, + 4, 3, 2, 2, 4, 6, 9, 12, 16, 20, 26, 31, 36, 42, 48, 53, + 58, 64, 69, 74, 79, 82, 84, 83, 80, 72, 59, 39, 14, -14, -43, -70, + -92, -109, -119, -123, -120, -113, -102, -88, -73, -56, -40, -25, -12, -2, 5, 10, + 12, 12, 11, 9, 5, 1, -3, -8, -12, -15, -18, -20, -21, -21, -20, -18, + -16, -13, -9, -6, -2, 1, 5, 8, 11, 13, 15, 16, 16, 16, 15, 14, + 12, 10, 7, 5, 4, 3, 3, 5, 6, 8, 9, 12, 15, 19, 23, 27, + 31, 35, 38, 42, 46, 50, 54, 59, 65, 71, 75, 77, 78, 76, 68, 54, + 34, 10, -16, -43, -68, -88, -103, -112, -114, -112, -105, -94, -80, -65, -50, -35, + -22, -10, -2, 5, 9, 11, 10, 9, 6, 2, -3, -7, -12, -15, -18, -20, + -21, -22, -21, -20, -17, -14, -11, -7, -3, 0, 4, 7, 9, 11, 13, 15, + 17, 17, 17, 16, 14, 12, 11, 10, 8, 7, 5, 5, 5, 6, 7, 8, + 10, 11, 14, 17, 20, 24, 28, 32, 37, 43, 49, 57, 63, 70, 77, 82, + 83, 80, 73, 60, 42, 18, -8, -34, -59, -80, -95, -105, -110, -109, -103, -94, + -81, -67, -53, -38, -24, -13, -3, 4, 9, 11, 11, 9, 6, 3, -2, -6, + -10, -14, -17, -19, -20, -20, -20, -19, -17, -15, -12, -8, -5, -1, 2, 6, + 9, 11, 13, 15, 15, 16, 16, 15, 14, 12, 11, 9, 8, 6, 6, 5, + 5, 5, 6, 7, 8, 10, 12, 15, 19, 23, 28, 32, 38, 44, 50, 58, + 66, 74, 82, 87, 90, 89, 83, 69, 48, 21, -9, -41, -69, -93, -111, -121, + -124, -121, -113, -100, -85, -68, -50, -33, -18, -5, 5, 12, 16, 17, 16, 13, + 9, 4, -1, -6, -11, -15, -18, -20, -21, -21, -21, -19, -17, -15, -12, -8, + -4, -1, 3, 6, 9, 12, 14, 15, 15, 14, 13, 12, 11, 10, 9, 9, + 8, 8, 6, 6, 5, 5, 6, 7, 8, 11, 15, 18, 23, 27, 31, 36, + 41, 46, 51, 58, 66, 74, 82, 88, 91, 90, 83, 68, 46, 16, -16, -48, + -77, -101, -118, -127, -128, -124, -114, -101, -84, -66, -47, -30, -14, -1, 9, 16, + 19, 20, 19, 15, 11, 5, -1, -6, -11, -16, -19, -21, -23, -23, -23, -21, + -19, -16, -12, -8, -4, 0, 4, 8, 11, 13, 14, 15, 15, 14, 13, 12, + 11, 10, 9, 8, 7, 7, 7, 7, 7, 8, 8, 9, 11, 12, 14, 16, + 19, 23, 27, 31, 35, 40, 45, 51, 58, 66, 74, 82, 88, 90, 88, 77, + 58, 32, 1, -31, -62, -87, -107, -119, -125, -123, -117, -105, -90, -73, -56, -38, + -22, -8, 2, 10, 15, 17, 17, 15, 11, 7, 2, -4, -9, -14, -17, -20, + -22, -23, -22, -21, -19, -17, -14, -10, -6, -2, 2, 5, 9, 12, 14, 15, + 17, 18, 18, 18, 17, 15, 12, 10, 8, 6, 4, 4, 4, 5, 6, 7, + 8, 10, 13, 16, 19, 22, 25, 28, 32, 35, 40, 45, 52, 59, 67, 75, + 81, 85, 86, 80, 66, 45, 18, -12, -42, -69, -91, -107, -116, -119, -115, -107, + -95, -80, -64, -47, -31, -17, -5, 4, 10, 13, 14, 14, 11, 7, 3, -2, + -7, -12, -15, -18, -20, -21, -21, -20, -18, -16, -14, -11, -7, -4, 0, 4, + 7, 10, 12, 14, 16, 16, 16, 16, 16, 15, 14, 12, 10, 9, 7, 6, + 5, 4, 4, 5, 6, 7, 8, 10, 12, 15, 19, 23, 27, 31, 36, 41, + 47, 55, 64, 73, 81, 87, 90, 86, 75, 56, 30, 1, -30, -58, -82, -100, + -112, -117, -115, -109, -98, -84, -69, -52, -37, -22, -10, 0, 8, 12, 14, 14, + 13, 10, 6, 2, -3, -8, -12, -16, -18, -20, -20, -20, -19, -17, -15, -12, + -9, -5, -1, 2, 6, 9, 12, 14, 16, 17, 17, 17, 16, 14, 13, 11, + 8, 6, 4, 3, 2, 2, 2, 3, 5, 6, 8, 10, 12, 15, 18, 22, + 26, 30, 35, 40, 47, 55, 63, 71, 80, 87, 90, 88, 78, 59, 34, 4, + -27, -57, -82, -101, -113, -118, -117, -110, -99, -85, -69, -53, -37, -22, -9, 2, + 9, 14, 17, 17, 15, 12, 8, 3, -2, -7, -12, -16, -19, -20, -21, -21, + -19, -18, -15, -12, -9, -6, -2, 2, 6, 9, 12, 14, 16, 17, 17, 16, + 14, 12, 10, 8, 6, 5, 4, 3, 3, 2, 3, 4, 6, 7, 9, 11, + 13, 16, 19, 22, 26, 30, 34, 39, 46, 53, 61, 70, 80, 88, 93, 91, + 80, 61, 34, 3, -30, -59, -84, -102, -114, -119, -117, -110, -99, -84, -68, -51, + -35, -20, -7, 3, 11, 15, 17, 18, 16, 13, 9, 4, -2, -7, -11, -15, + -18, -20, -21, -21, -20, -19, -16, -14, -11, -8, -4, 0, 3, 7, 10, 13, + 15, 16, 17, 16, 14, 12, 10, 9, 7, 6, 5, 4, 4, 4, 5, 6, + 7, 8, 9, 11, 13, 15, 18, 21, 24, 27, 31, 35, 41, 48, 55, 64, + 73, 82, 89, 91, 85, 71, 48, 19, -13, -44, -71, -93, -108, -117, -118, -114, + -105, -92, -77, -60, -43, -27, -13, -1, 8, 14, 17, 18, 17, 14, 8, 13, + -1, -1, 0, 2, 4, 6, 9, 11, 13, 14, 13, 12, 11, 8, 5, 2, + -1, -5, -10, -14, -16, -17, -16, -14, -11, -8, -5, -4, -3, -1, -1, -1, + -1, -3, -3, -3, -2, -1, -1, 0, 0, 0, 0, 2, 6, 11, 14, 16, + 19, 22, 25, 32, 36, 34, 25, 11, -5, -20, -31, -35, -36, -34, -29, -23, + -16, -8, -4, -4, -8, -11, -12, -13, -12, -10, -7, -4, -2, -1, 1, 4, + 7, 7, 6, 6, 6, 7, 12, 17, 24, 30, 36, 41, 46, 51, 50, 43, + 25, 2, -25, -48, -61, -62, -57, -48, -35, -23, -12, -5, -3, -5, -9, -12, + -14, -14, -12, -7, -3, 0, 1, 2, 4, 6, 7, 9, 11, 11, 10, 9, + 12, 17, 23, 30, 37, 43, 49, 55, 58, 50, 30, 1, -29, -54, -68, -68, + -60, -49, -35, -22, -10, -2, 0, -3, -9, -16, -20, -21, -19, -14, -8, -2, + 3, 7, 11, 12, 11, 9, 7, 7, 8, 10, 15, 19, 24, 28, 33, 36, + 42, 47, 53, 56, 45, 23, -8, -37, -60, -71, -69, -56, -40, -27, -16, -8, + -5, -6, -11, -17, -21, -22, -20, -16, -9, -2, 5, 8, 10, 11, 10, 9, + 8, 8, 9, 10, 13, 16, 19, 24, 29, 35, 42, 49, 53, 59, 55, 37, + 5, -29, -58, -74, -77, -69, -53, -35, -21, -11, -5, -4, -6, -10, -15, -19, + -19, -16, -10, -5, 1, 5, 8, 11, 13, 14, 12, 10, 8, 6, 7, 10, + 15, 21, 29, 39, 51, 62, 72, 82, 81, 52, 3, -50, -90, -110, -109, -91, + -64, -35, -13, 1, 8, 9, 4, -4, -12, -18, -18, -14, -9, -3, 3, 8, + 11, 11, 10, 7, 4, 2, 2, 4, 8, 13, 18, 26, 36, 48, 60, 72, + 82, 91, 86, 54, -2, -61, -105, -126, -121, -98, -65, -33, -7, 8, 14, 12, + 6, -4, -14, -20, -22, -19, -14, -8, 0, 7, 12, 14, 13, 11, 9, 7, + 4, 2, 4, 9, 16, 26, 36, 48, 58, 69, 79, 84, 80, 59, 14, -43, + -92, -119, -120, -102, -73, -40, -12, 5, 12, 11, 5, -3, -12, -18, -21, -20, + -16, -9, -2, 5, 11, 15, 16, 15, 12, 7, 4, 4, 6, 9, 15, 23, + 31, 38, 46, 54, 65, 75, 78, 68, 34, -16, -68, -103, -114, -105, -80, -50, + -22, -1, 9, 10, 6, -3, -12, -18, -21, -21, -17, -11, -3, 4, 9, 13, + 16, 17, 14, 11, 8, 5, 5, 7, 10, 14, 20, 28, 37, 49, 64, 77, + 83, 73, 42, -8, -59, -95, -110, -103, -81, -53, -24, -3, 9, 11, 6, -2, + -10, -17, -20, -20, -17, -12, -5, 2, 9, 13, 15, 16, 14, 11, 8, 6, + 5, 6, 8, 12, 19, 28, 38, 50, 66, 82, 90, 83, 48, -9, -69, -111, + -124, -113, -85, -50, -18, 5, 16, 16, 9, -1, -11, -18, -21, -21, -17, -12, + -5, 3, 9, 14, 15, 13, 11, 9, 8, 6, 5, 6, 8, 15, 23, 31, + 41, 52, 66, 82, 91, 83, 46, -16, -77, -118, -128, -114, -84, -47, -14, 9, + 19, 19, 10, -1, -11, -19, -23, -23, -19, -12, -4, 4, 11, 14, 15, 13, + 11, 9, 7, 7, 7, 8, 11, 14, 19, 27, 35, 45, 58, 74, 88, 88, + 58, 1, -62, -107, -125, -116, -90, -56, -22, 2, 15, 17, 11, 2, -9, -17, + -22, -22, -20, -14, -6, 2, 9, 14, 17, 18, 17, 12, 8, 4, 4, 6, + 8, 13, 19, 25, 32, 40, 52, 67, 81, 86, 66, 18, -42, -91, -116, -115, + -95, -64, -31, -5, 10, 14, 11, 3, -7, -15, -20, -21, -18, -14, -7, 0, + 7, 12, 16, 17, 16, 14, 10, 7, 5, 4, 6, 8, 12, 19, 27, 36, + 47, 64, 81, 90, 75, 30, -30, -82, -112, -115, -98, -69, -37, -10, 8, 14, + 13, 6, -3, -12, -18, -20, -19, -15, -9, -1, 6, 12, 16, 17, 16, 13, + 8, 4, 2, 2, 5, 8, 12, 18, 26, 35, 47, 63, 80, 90, 78, 34, + -27, -82, -113, -117, -99, -69, -37, -9, 9, 17, 15, 8, -2, -12, -19, -21, + -19, -15, -9, -2, 6, 12, 16, 17, 14, 10, 6, 4, 3, 3, 6, 9, + 13, 19, 26, 34, 46, 61, 80, 93, 80, 34, -30, -84, -114, -117, -99, -68, + -35, -7, 11, 17, 16, 9, -2, -11, -18, -21, -20, -16, -11, -4, 3, 10, + 15, 17, 14, 10, 7, 5, 4, 5, 7, 9, 13, 18, 24, 31, 41, 55, + 73, 89, 85, 48, -12, -71, -108, -118, -104, -77, -43, -13, 8, 16, 17, 16, + 0, -3, -4, -5, -4, 0, -4, -8, -20, -25, 51, 11, -55, 9, 39, 55, + -76, -19, 92, -23, -58, 2, -15, 57, 71, 34, -41, 20, 51, 22, 63, -21, + 63, 74, 32, 36, 99, -14, 27, 102, 66, 90, 79, 77, 58, 66, 65, 114, + 69, 26, 30, 92, 90, 53, 78, 97, 77, 66, 39, -4, 60, 57, 64, 68, + -16, 36, 49, 12, 19, 12, -12, 21, 11, -32, -19, -41, -44, -12, -36, -44, + -45, -51, -55, -70, -69, -73, -85, -102, -86, -99, -92, -105, -108, -103, -100, -107, + -112, -104, -113, -112, -104, -119, -124, -115, -87, -100, -128, -106, -83, -105, -108, -109, + -91, -95, -90, -83, -80, -79, -83, -68, -59, -53, -63, -69, -57, -28, -11, -38, + -43, -23, -10, -6, 3, 1, 6, 14, 21, 23, 34, 40, 42, 48, 57, 61, + 63, 65, 73, 82, 90, 82, 89, 98, 100, 110, 111, 109, 115, 120, 121, 121, + 123, 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 113, 104, 103, 113, 110, 94, 80, 88, 96, 89, 81, 70, + 68, 64, 59, 59, 54, 44, 44, 39, 31, 31, 21, 18, 16, 8, 6, 2, + -3, -6, -13, -19, -27, -31, -34, -30, -38, -47, -48, -51, -56, -64, -68, -67, + -68, -76, -73, -79, -85, -94, -89, -90, -94, -92, -99, -100, -107, -107, -104, -107, + -106, -112, -114, -113, -112, -111, -112, -116, -116, -115, -115, -115, -115, -115, -115, -115, + -114, -114, -114, -114, -114, -114, -114, -114, -113, -113, -113, -113, -113, -108, -106, -107, + -111, -110, -105, -108, -107, -102, -100, -103, -103, -100, -100, -97, -97, -100, -99, -97, + -94, -90, -94, -94, -93, -93, -92, -92, -90, -89, -89, -90, -91, -87, -87, -88, + -89, -88, -84, -85, -88, -87, -86, -85, -85, -84, -82, -83, -83, -82, -81, -80, + -79, -79, -79, -78, -75, -74, -75, -73, -74, -71, -69, -67, -69, -66, -64, -66, + -65, -64, -62, -58, -57, -57, -57, -56, -52, -51, -50, -48, -46, -43, -43, -42, + -39, -36, -35, -34, -32, -31, -29, -26, -23, -23, -21, -15, -18, -15, -11, -8, + -6, -7, 0, 2, 0, 2, 7, 15, 14, 15, 16, 19, 23, 27, 29, 30, + 31, 34, 41, 41, 42, 44, 45, 51, 55, 54, 56, 57, 60, 65, 67, 69, + 69, 71, 74, 77, 79, 78, 80, 82, 86, 86, 84, 86, 88, 87, 87, 87, + 87, 87, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 84, 84, 84, 84, + 84, 83, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 81, 81, 81, 81, + 81, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 78, 78, 78, 78, 76, + 75, 72, 69, 67, 65, 64, 63, 59, 55, 54, 52, 50, 48, 45, 42, 38, + 36, 34, 31, 30, 27, 24, 21, 18, 16, 14, 12, 9, 7, 4, 1, -2, + -4, -7, -10, -11, -13, -16, -17, -18, -21, -24, -26, -27, -28, -30, -32, -33, + -35, -36, -38, -39, -41, -42, -43, -45, -45, -46, -47, -48, -49, -50, -51, -50, + -51, -52, -53, -53, -53, -53, -53, -53, -53, -54, -54, -54, -54, -53, -53, -52, + -52, -52, -51, -51, -51, -50, -50, -50, -48, -49, -48, -47, -46, -45, -45, -44, + -43, -42, -41, -41, -40, -39, -38, -37, -36, -35, -34, -33, -31, -30, -29, -28, + -27, -26, -24, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -13, + -12, -11, -11, -10, -9, -9, -8, -8, -7, -6, -7, -6, -5, -5, -5, -4, + -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, 0, 0, + 0, 0, -1, 0, 4, 9, 13, 13, 11, 5, -1, -10, -16, -17, -11, -5, + -2, -1, -2, -3, -2, -1, 0, 0, 6, 14, 19, 26, 36, 25, -5, -30, + -36, -29, -16, -4, -7, -13, -12, -7, -2, 1, 6, 7, 6, 11, 24, 36, + 46, 50, 26, -25, -60, -57, -36, -12, -3, -9, -14, -12, -3, 1, 4, 7, + 11, 10, 12, 23, 37, 49, 58, 31, -29, -67, -61, -36, -10, 0, -9, -20, + -19, -8, 3, 11, 11, 7, 8, 15, 24, 32, 41, 53, 45, -7, -60, -68, + -41, -16, -5, -11, -21, -20, -10, 4, 10, 10, 8, 9, 13, 19, 29, 42, + 54, 55, 6, -57, -77, -54, -21, -6, -6, -15, -19, -11, 1, 8, 13, 12, + 8, 7, 15, 29, 50, 73, 80, 5, -90, -109, -65, -13, 8, 4, -13, -18, + -10, 3, 11, 10, 4, 2, 8, 18, 36, 60, 82, 86, 1, -105, -121, -66, + -8, 13, 6, -14, -22, -15, -1, 12, 13, 9, 4, 3, 16, 36, 58, 78, + 81, 15, -91, -121, -74, -13, 12, 5, -11, -21, -16, -2, 11, 16, 12, 4, + 6, 15, 31, 46, 64, 79, 36, -66, -115, -81, -23, 9, 6, -11, -21, -17, + -4, 9, 16, 15, 8, 5, 9, 20, 37, 63, 83, 43, -57, -110, -83, -25, + 8, 7, -10, -20, -17, -5, 9, 15, 14, 8, 5, 8, 18, 37, 65, 91, + 50, -67, -124, -86, -19, 16, 9, -10, -21, -18, -5, 9, 15, 11, 8, 5, + 8, 22, 40, 65, 92, 48, -74, -128, -85, -16, 19, 11, -11, -23, -19, -4, + 10, 15, 11, 8, 7, 11, 19, 35, 57, 88, 60, -58, -125, -92, -24, 15, + 12, -8, -22, -20, -7, 9, 17, 17, 8, 4, 8, 18, 31, 51, 81, 67, + -38, -116, -96, -33, 9, 11, -6, -20, -19, -8, 7, 16, 16, 11, 5, 5, + 12, 26, 47, 80, 76, -26, -111, -99, -39, 7, 13, -3, -18, -19, -9, 5, + 16, 16, 8, 2, 4, 12, 25, 46, 79, 79, -23, -112, -101, -39, 9, 15, + -2, -18, -20, -9, 5, 16, 14, 7, 3, 5, 13, 25, 44, 79, 81, -25, + -113, -100, -37, 10, 16, -1, -18, -20, -11, 3, 15, 15, 7, 4, 6, 13, + 23, 40, 72, 86, -7, -107, -106, -46, 7, 16, 0, 16, 31, 47, 61, 75, + 87, 98, 107, 115, 121, 125, 127, 127, 125, 121, 116, 108, 99, 88, 75, 62, + 47, 32, 16, 0, -16, -31, -47, -61, -75, -87, -98, -108, -116, -122, -126, -128, + -128, -126, -123, -117, -109, -100, -89, -77, -64, -49, -34, -18, -2, 14, 29, 45, + 59, 73, 86, 97, 106, 114, 121, 125, 127, 127, 126, 122, 116, 109, 100, 89, + 77, 63, 49, 34, 18, 2, -14, -30, -45, -60, -73, -86, -97, -107, -115, -121, + -126, -128, -128, -127, -123, -118, -110, -101, -91, -79, -65, -51, -36, -20, -4, 12, + 28, 43, 58, 72, 84, 96, 106, 114, 120, 124, 127, 127, 126, 122, 117, 109, + 100, 90, 78, 64, 50, 35, 19, 3, -13, -29, -44, -59, -73, -85, -97, -107, + -115, -121, -125, -128, -128, -127, -123, -118, -110, -101, -91, -79, -65, -51, -36, -20, + -4, 12, 28, 43, 58, 72, 84, 96, 106, 114, 120, 124, 127, 127, 126, 122, + 117, 109, 100, 90, 78, 64, 50, 35, 19, 3, -13, -29, -44, -59, -73, -85, + -97, -107, -115, -121, -125, -128, -128, -127, -123, -118, -110, -101, -91, -79, -65, -51, + -36, -20, -4, 12, 28, 43, 58, 72, 84, 96, 106, 114, 120, 124, 127, 127, + 126, 122, 117, 109, 100, 90, 78, 64, 50, 35, 19, 3, -13, -29, -44, -59, + -73, -85, -97, -107, -115, -121, -125, -128, -128, -127, -123, -118, -110, -101, -91, -79, + -65, -51, -36, -20, -4, 12, 28, 43, 58, 72, 84, 96, 106, 114, 120, 124, + 127, 127, 126, 122, 117, 109, 100, 90, 78, 64, 50, 35, 19, 3, -13, -29, + -44, -59, -73, -85, -97, -107, -115, -121, -125, -128, -128, -127, -123, -118, -110, -101, + -91, -79, -65, -51, -36, -20, -4, 12, 0, -104, -55, -11, 24, 33, 30, 7, + -15, -31, -30, -25, -23, -20, -9, 10, 31, 59, 91, 111, 115, 92, 51, 7, + -33, -64, -81, -81, -71, -51, -22, 16, 52, 74, 82, 81, 68, 38, 0, -40, + -81, -112, -124, -102, -57, -11, 24, 33, 30, 7, -15, -31, -30, -25, -23, -20, + -9, 10, 31, 59, 91, 111, 115, 92, 51, 7, -33, -64, -81, -81, -71, -51, + -22, 16, 52, 74, 82, 81, 68, 38, 0, -40, -81, -112, -124, -102, -57, -11, + 24, 33, 30, 7, -15, -31, -30, -25, -23, -20, -9, 10, 31, 59, 91, 111, + 115, 92, 51, 7, -33, -64, -81, -81, -71, -51, -22, 16, 52, 74, 82, 81, + 68, 38, 0, -40, -81, -112, -124, -102, -57, -11, 24, 33, 30, 7, -15, -31, + -30, -25, -23, -20, -9, 10, 31, 59, 91, 111, 115, 92, 51, 7, -33, -64, + -81, -81, -71, -51, -22, 16, 52, 74, 82, 81, 68, 38, 0, -40, -81, -112, + -124, -102, -57, -11, 0 +}; + +const EAS_U32 testSampleLengths[] = +{ + 1568, 784, 642, 392, 302, 172 +}; + +const EAS_U32 testSampleOffsets[] = +{ + 0x00000000, 0x00000620, 0x00000930, 0x00000bb2, 0x00000d3a, 0x00000e68 +}; + +/*---------------------------------------------------------------------------- + * S_EAS + *---------------------------------------------------------------------------- +*/ +const S_EAS easTestLib = +{ + 0x01534145, + 0x00105622, + testBanks, + testPrograms, + testRegions, + testArticulations, + testSampleLengths, + testSampleOffsets, + testSamples, + 0, + 0, + 16, + 152, + 97, + 6, + 0 +}; /* end S_EAS */ + +/*---------------------------------------------------------------------------- + * Statistics + * + * Number of banks: 0 + * Number of programs: 16 + * Number of regions: 152 + * Number of articulations: 97 + * Number of samples: 6 + * Size of sample pool: 3861 + *---------------------------------------------------------------------------- +*/ +/* end ..\..\EASLib\WTLibrary\eastestv37.c */ diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/easwt_vst_lib.xcodeproj/project.pbxproj b/arm-wt-22k/jetcreator_lib_src/darwin-x86/easwt_vst_lib.xcodeproj/project.pbxproj new file mode 100644 index 0000000..bd0d6ef --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/easwt_vst_lib.xcodeproj/project.pbxproj @@ -0,0 +1,645 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 44; + objects = { + +/* Begin PBXBuildFile section */ + 9A56AB8F0F7197AE00D115A7 /* wt_44khz.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A56AB8E0F7197AE00D115A7 /* wt_44khz.c */; }; + 9A56ABD00F71998600D115A7 /* eas_fmengine.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A56ABCF0F71998600D115A7 /* eas_fmengine.h */; }; + 9A56ABDB0F719D4600D115A7 /* eas_xmf.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A56ABD70F719D4600D115A7 /* eas_xmf.c */; }; + 9A56ABDC0F719D4600D115A7 /* eas_xmf.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A56ABD80F719D4600D115A7 /* eas_xmf.h */; }; + 9A56ABDD0F719D4600D115A7 /* eas_xmfdata.c in Sources */ = {isa = PBXBuildFile; fileRef = 9A56ABD90F719D4600D115A7 /* eas_xmfdata.c */; }; + 9A56ABDE0F719D4600D115A7 /* eas_xmfdata.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A56ABDA0F719D4600D115A7 /* eas_xmfdata.h */; }; + 9A56AC050F71BCFE00D115A7 /* eas_build.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A56AC040F71BCFE00D115A7 /* eas_build.h */; }; + C55B113D0E2D33B4006357C1 /* eas.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11290E2D33B4006357C1 /* eas.h */; }; + C55B113E0E2D33B4006357C1 /* eas_audioconst.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B112A0E2D33B4006357C1 /* eas_audioconst.h */; }; + C55B11400E2D33B4006357C1 /* eas_config.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B112C0E2D33B4006357C1 /* eas_config.h */; }; + C55B11410E2D33B4006357C1 /* eas_data.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B112D0E2D33B4006357C1 /* eas_data.h */; }; + C55B11420E2D33B4006357C1 /* eas_host.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B112E0E2D33B4006357C1 /* eas_host.h */; }; + C55B11430E2D33B4006357C1 /* eas_math.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B112F0E2D33B4006357C1 /* eas_math.h */; }; + C55B11440E2D33B4006357C1 /* eas_midi.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11300E2D33B4006357C1 /* eas_midi.h */; }; + C55B11450E2D33B4006357C1 /* eas_midictrl.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11310E2D33B4006357C1 /* eas_midictrl.h */; }; + C55B11460E2D33B4006357C1 /* eas_mixer.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11320E2D33B4006357C1 /* eas_mixer.c */; }; + C55B11470E2D33B4006357C1 /* eas_pan.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11330E2D33B4006357C1 /* eas_pan.h */; }; + C55B11480E2D33B4006357C1 /* eas_pcm.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11340E2D33B4006357C1 /* eas_pcm.h */; }; + C55B11490E2D33B4006357C1 /* eas_pcmdata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11350E2D33B4006357C1 /* eas_pcmdata.h */; }; + C55B114B0E2D33B4006357C1 /* eas_report.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11370E2D33B4006357C1 /* eas_report.h */; }; + C55B114C0E2D33B4006357C1 /* eas_sndlib.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11380E2D33B4006357C1 /* eas_sndlib.h */; }; + C55B114D0E2D33B4006357C1 /* eas_synth.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11390E2D33B4006357C1 /* eas_synth.h */; }; + C55B114E0E2D33B4006357C1 /* eas_synth_protos.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B113A0E2D33B4006357C1 /* eas_synth_protos.h */; }; + C55B114F0E2D33B4006357C1 /* eas_types.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B113B0E2D33B4006357C1 /* eas_types.h */; }; + C55B11500E2D33B4006357C1 /* eas_vm_protos.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B113C0E2D33B4006357C1 /* eas_vm_protos.h */; }; + C55B115B0E2D3796006357C1 /* eas_effects.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11530E2D3796006357C1 /* eas_effects.h */; }; + C55B11640E2D37FC006357C1 /* eas_imelodydata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11620E2D37FC006357C1 /* eas_imelodydata.h */; }; + C55B11760E2D38CE006357C1 /* eas_mdls.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B116B0E2D38CE006357C1 /* eas_mdls.h */; }; + C55B11770E2D38CE006357C1 /* eas_otadata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B116C0E2D38CE006357C1 /* eas_otadata.h */; }; + C55B11780E2D38CE006357C1 /* eas_parser.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B116D0E2D38CE006357C1 /* eas_parser.h */; }; + C55B11790E2D38CE006357C1 /* eas_rtttldata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B116E0E2D38CE006357C1 /* eas_rtttldata.h */; }; + C55B117B0E2D38CE006357C1 /* eas_smf.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11700E2D38CE006357C1 /* eas_smf.h */; }; + C55B117C0E2D38CE006357C1 /* eas_smfdata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11710E2D38CE006357C1 /* eas_smfdata.h */; }; + C55B117D0E2D38CE006357C1 /* eas_tcdata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11720E2D38CE006357C1 /* eas_tcdata.h */; }; + C55B117E0E2D38CE006357C1 /* eas_wavefile.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11730E2D38CE006357C1 /* eas_wavefile.h */; }; + C55B11830E2D38FB006357C1 /* jet.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11810E2D38FB006357C1 /* jet.h */; }; + C55B11840E2D38FB006357C1 /* jet_data.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11820E2D38FB006357C1 /* jet_data.h */; }; + C55B11860E2D395F006357C1 /* eas_wtengine.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11850E2D395F006357C1 /* eas_wtengine.h */; }; + C55B11900E2D39ED006357C1 /* eas_reverb.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B118E0E2D39ED006357C1 /* eas_reverb.h */; }; + C55B11910E2D39ED006357C1 /* eas_reverbdata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B118F0E2D39ED006357C1 /* eas_reverbdata.h */; }; + C55B11940E2D39FE006357C1 /* eas_chorus.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11920E2D39FE006357C1 /* eas_chorus.h */; }; + C55B11950E2D39FE006357C1 /* eas_chorusdata.h in Headers */ = {isa = PBXBuildFile; fileRef = C55B11930E2D39FE006357C1 /* eas_chorusdata.h */; }; + C55B11AE0E2D3B1B006357C1 /* eas_data.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B119F0E2D3B1B006357C1 /* eas_data.c */; }; + C55B11AF0E2D3B1B006357C1 /* eas_flog.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A00E2D3B1B006357C1 /* eas_flog.c */; }; + C55B11B10E2D3B1B006357C1 /* eas_ima_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A20E2D3B1B006357C1 /* eas_ima_tables.c */; }; + C55B11B20E2D3B1B006357C1 /* eas_imaadpcm.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A30E2D3B1B006357C1 /* eas_imaadpcm.c */; }; + C55B11B30E2D3B1B006357C1 /* eas_math.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A40E2D3B1B006357C1 /* eas_math.c */; }; + C55B11B40E2D3B1B006357C1 /* eas_midi.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A50E2D3B1B006357C1 /* eas_midi.c */; }; + C55B11B50E2D3B1B006357C1 /* eas_mididata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A60E2D3B1B006357C1 /* eas_mididata.c */; }; + C55B11B60E2D3B1B006357C1 /* eas_mixbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A70E2D3B1B006357C1 /* eas_mixbuf.c */; }; + C55B11B70E2D3B1B006357C1 /* eas_pan.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A80E2D3B1B006357C1 /* eas_pan.c */; }; + C55B11B80E2D3B1B006357C1 /* eas_pcm.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11A90E2D3B1B006357C1 /* eas_pcm.c */; }; + C55B11B90E2D3B1B006357C1 /* eas_pcmdata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11AA0E2D3B1B006357C1 /* eas_pcmdata.c */; }; + C55B11BA0E2D3B1B006357C1 /* eas_public.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11AB0E2D3B1B006357C1 /* eas_public.c */; }; + C55B11BB0E2D3B1B006357C1 /* eas_voicemgt.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11AC0E2D3B1B006357C1 /* eas_voicemgt.c */; }; + C55B11BD0E2D3B55006357C1 /* jet.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11BC0E2D3B55006357C1 /* jet.c */; }; + C55B11C10E2D3BFD006357C1 /* eas_chorus.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11C00E2D3BFD006357C1 /* eas_chorus.c */; }; + C55B11E40E2D3C62006357C1 /* eas_imelody.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11D00E2D3C62006357C1 /* eas_imelody.c */; }; + C55B11E50E2D3C62006357C1 /* eas_imelodydata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11D10E2D3C62006357C1 /* eas_imelodydata.c */; }; + C55B11E60E2D3C62006357C1 /* eas_mdls.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11D20E2D3C62006357C1 /* eas_mdls.c */; }; + C55B11E70E2D3C62006357C1 /* eas_ota.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11D30E2D3C62006357C1 /* eas_ota.c */; }; + C55B11E80E2D3C62006357C1 /* eas_otadata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11D40E2D3C62006357C1 /* eas_otadata.c */; }; + C55B11E90E2D3C62006357C1 /* eas_rtttl.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11D50E2D3C62006357C1 /* eas_rtttl.c */; }; + C55B11EA0E2D3C62006357C1 /* eas_rtttldata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11D60E2D3C62006357C1 /* eas_rtttldata.c */; }; + C55B11EE0E2D3C62006357C1 /* eas_smf.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11DA0E2D3C62006357C1 /* eas_smf.c */; }; + C55B11EF0E2D3C62006357C1 /* eas_smfdata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11DB0E2D3C62006357C1 /* eas_smfdata.c */; }; + C55B11F00E2D3C62006357C1 /* eas_tcdata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11DC0E2D3C62006357C1 /* eas_tcdata.c */; }; + C55B11F10E2D3C62006357C1 /* eas_tonecontrol.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11DD0E2D3C62006357C1 /* eas_tonecontrol.c */; }; + C55B11F20E2D3C62006357C1 /* eas_wavefile.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11DE0E2D3C62006357C1 /* eas_wavefile.c */; }; + C55B11F30E2D3C62006357C1 /* eas_wavefiledata.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11DF0E2D3C62006357C1 /* eas_wavefiledata.c */; }; + C55B11F70E2D3C7B006357C1 /* eas_reverb.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11F60E2D3C7B006357C1 /* eas_reverb.c */; }; + C55B11FA0E2D3CAC006357C1 /* eastestv37.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B11F80E2D3CAC006357C1 /* eastestv37.c */; }; + C55B12050E2D3D56006357C1 /* eas_dlssynth.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B12020E2D3D56006357C1 /* eas_dlssynth.c */; }; + C55B12060E2D3D56006357C1 /* eas_wtengine.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B12030E2D3D56006357C1 /* eas_wtengine.c */; }; + C55B12070E2D3D56006357C1 /* eas_wtsynth.c in Sources */ = {isa = PBXBuildFile; fileRef = C55B12040E2D3D56006357C1 /* eas_wtsynth.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 9A56AB8E0F7197AE00D115A7 /* wt_44khz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wt_44khz.c; sourceTree = ""; }; + 9A56ABCF0F71998600D115A7 /* eas_fmengine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_fmengine.h; path = "../../../arm-fm-22k/lib_src/eas_fmengine.h"; sourceTree = SOURCE_ROOT; }; + 9A56ABD70F719D4600D115A7 /* eas_xmf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_xmf.c; path = ../../lib_src/eas_xmf.c; sourceTree = SOURCE_ROOT; }; + 9A56ABD80F719D4600D115A7 /* eas_xmf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_xmf.h; path = ../../lib_src/eas_xmf.h; sourceTree = SOURCE_ROOT; }; + 9A56ABD90F719D4600D115A7 /* eas_xmfdata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_xmfdata.c; path = ../../lib_src/eas_xmfdata.c; sourceTree = SOURCE_ROOT; }; + 9A56ABDA0F719D4600D115A7 /* eas_xmfdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_xmfdata.h; path = ../../lib_src/eas_xmfdata.h; sourceTree = SOURCE_ROOT; }; + 9A56AC040F71BCFE00D115A7 /* eas_build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_build.h; path = ../../host_src/eas_build.h; sourceTree = SOURCE_ROOT; }; + C55B11290E2D33B4006357C1 /* eas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas.h; path = ../../host_src/eas.h; sourceTree = SOURCE_ROOT; }; + C55B112A0E2D33B4006357C1 /* eas_audioconst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_audioconst.h; path = ../../lib_src/eas_audioconst.h; sourceTree = SOURCE_ROOT; }; + C55B112C0E2D33B4006357C1 /* eas_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_config.h; path = ../../host_src/eas_config.h; sourceTree = SOURCE_ROOT; }; + C55B112D0E2D33B4006357C1 /* eas_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_data.h; path = ../../lib_src/eas_data.h; sourceTree = SOURCE_ROOT; }; + C55B112E0E2D33B4006357C1 /* eas_host.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_host.h; path = ../../host_src/eas_host.h; sourceTree = SOURCE_ROOT; }; + C55B112F0E2D33B4006357C1 /* eas_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_math.h; path = ../../lib_src/eas_math.h; sourceTree = SOURCE_ROOT; }; + C55B11300E2D33B4006357C1 /* eas_midi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_midi.h; path = ../../lib_src/eas_midi.h; sourceTree = SOURCE_ROOT; }; + C55B11310E2D33B4006357C1 /* eas_midictrl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_midictrl.h; path = ../../lib_src/eas_midictrl.h; sourceTree = SOURCE_ROOT; }; + C55B11320E2D33B4006357C1 /* eas_mixer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_mixer.c; path = ../../lib_src/eas_mixer.c; sourceTree = SOURCE_ROOT; }; + C55B11330E2D33B4006357C1 /* eas_pan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_pan.h; path = ../../lib_src/eas_pan.h; sourceTree = SOURCE_ROOT; }; + C55B11340E2D33B4006357C1 /* eas_pcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_pcm.h; path = ../../lib_src/eas_pcm.h; sourceTree = SOURCE_ROOT; }; + C55B11350E2D33B4006357C1 /* eas_pcmdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_pcmdata.h; path = ../../lib_src/eas_pcmdata.h; sourceTree = SOURCE_ROOT; }; + C55B11370E2D33B4006357C1 /* eas_report.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_report.h; path = ../../host_src/eas_report.h; sourceTree = SOURCE_ROOT; }; + C55B11380E2D33B4006357C1 /* eas_sndlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_sndlib.h; path = ../../lib_src/eas_sndlib.h; sourceTree = SOURCE_ROOT; }; + C55B11390E2D33B4006357C1 /* eas_synth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_synth.h; path = ../../lib_src/eas_synth.h; sourceTree = SOURCE_ROOT; }; + C55B113A0E2D33B4006357C1 /* eas_synth_protos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_synth_protos.h; path = ../../lib_src/eas_synth_protos.h; sourceTree = SOURCE_ROOT; }; + C55B113B0E2D33B4006357C1 /* eas_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_types.h; path = ../../host_src/eas_types.h; sourceTree = SOURCE_ROOT; }; + C55B113C0E2D33B4006357C1 /* eas_vm_protos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_vm_protos.h; path = ../../lib_src/eas_vm_protos.h; sourceTree = SOURCE_ROOT; }; + C55B11530E2D3796006357C1 /* eas_effects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_effects.h; path = ../../lib_src/eas_effects.h; sourceTree = SOURCE_ROOT; }; + C55B11620E2D37FC006357C1 /* eas_imelodydata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_imelodydata.h; path = ../../lib_src/eas_imelodydata.h; sourceTree = SOURCE_ROOT; }; + C55B116B0E2D38CE006357C1 /* eas_mdls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_mdls.h; path = ../../lib_src/eas_mdls.h; sourceTree = SOURCE_ROOT; }; + C55B116C0E2D38CE006357C1 /* eas_otadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_otadata.h; path = ../../lib_src/eas_otadata.h; sourceTree = SOURCE_ROOT; }; + C55B116D0E2D38CE006357C1 /* eas_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_parser.h; path = ../../lib_src/eas_parser.h; sourceTree = SOURCE_ROOT; }; + C55B116E0E2D38CE006357C1 /* eas_rtttldata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_rtttldata.h; path = ../../lib_src/eas_rtttldata.h; sourceTree = SOURCE_ROOT; }; + C55B11700E2D38CE006357C1 /* eas_smf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_smf.h; path = ../../lib_src/eas_smf.h; sourceTree = SOURCE_ROOT; }; + C55B11710E2D38CE006357C1 /* eas_smfdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_smfdata.h; path = ../../lib_src/eas_smfdata.h; sourceTree = SOURCE_ROOT; }; + C55B11720E2D38CE006357C1 /* eas_tcdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_tcdata.h; path = ../../lib_src/eas_tcdata.h; sourceTree = SOURCE_ROOT; }; + C55B11730E2D38CE006357C1 /* eas_wavefile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_wavefile.h; path = ../../lib_src/eas_wavefile.h; sourceTree = SOURCE_ROOT; }; + C55B11810E2D38FB006357C1 /* jet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jet.h; path = ../../host_src/jet.h; sourceTree = SOURCE_ROOT; }; + C55B11820E2D38FB006357C1 /* jet_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jet_data.h; path = ../../lib_src/jet_data.h; sourceTree = SOURCE_ROOT; }; + C55B11850E2D395F006357C1 /* eas_wtengine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_wtengine.h; path = ../../lib_src/eas_wtengine.h; sourceTree = SOURCE_ROOT; }; + C55B118E0E2D39ED006357C1 /* eas_reverb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_reverb.h; path = ../../host_src/eas_reverb.h; sourceTree = SOURCE_ROOT; }; + C55B118F0E2D39ED006357C1 /* eas_reverbdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_reverbdata.h; path = ../../lib_src/eas_reverbdata.h; sourceTree = SOURCE_ROOT; }; + C55B11920E2D39FE006357C1 /* eas_chorus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_chorus.h; path = ../../host_src/eas_chorus.h; sourceTree = SOURCE_ROOT; }; + C55B11930E2D39FE006357C1 /* eas_chorusdata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = eas_chorusdata.h; path = ../../lib_src/eas_chorusdata.h; sourceTree = SOURCE_ROOT; }; + C55B119F0E2D3B1B006357C1 /* eas_data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_data.c; path = ../../lib_src/eas_data.c; sourceTree = SOURCE_ROOT; }; + C55B11A00E2D3B1B006357C1 /* eas_flog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_flog.c; path = ../../lib_src/eas_flog.c; sourceTree = SOURCE_ROOT; }; + C55B11A20E2D3B1B006357C1 /* eas_ima_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_ima_tables.c; path = ../../lib_src/eas_ima_tables.c; sourceTree = SOURCE_ROOT; }; + C55B11A30E2D3B1B006357C1 /* eas_imaadpcm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_imaadpcm.c; path = ../../lib_src/eas_imaadpcm.c; sourceTree = SOURCE_ROOT; }; + C55B11A40E2D3B1B006357C1 /* eas_math.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_math.c; path = ../../lib_src/eas_math.c; sourceTree = SOURCE_ROOT; }; + C55B11A50E2D3B1B006357C1 /* eas_midi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_midi.c; path = ../../lib_src/eas_midi.c; sourceTree = SOURCE_ROOT; }; + C55B11A60E2D3B1B006357C1 /* eas_mididata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_mididata.c; path = ../../lib_src/eas_mididata.c; sourceTree = SOURCE_ROOT; }; + C55B11A70E2D3B1B006357C1 /* eas_mixbuf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_mixbuf.c; path = ../../lib_src/eas_mixbuf.c; sourceTree = SOURCE_ROOT; }; + C55B11A80E2D3B1B006357C1 /* eas_pan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_pan.c; path = ../../lib_src/eas_pan.c; sourceTree = SOURCE_ROOT; }; + C55B11A90E2D3B1B006357C1 /* eas_pcm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_pcm.c; path = ../../lib_src/eas_pcm.c; sourceTree = SOURCE_ROOT; }; + C55B11AA0E2D3B1B006357C1 /* eas_pcmdata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_pcmdata.c; path = ../../lib_src/eas_pcmdata.c; sourceTree = SOURCE_ROOT; }; + C55B11AB0E2D3B1B006357C1 /* eas_public.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_public.c; path = ../../lib_src/eas_public.c; sourceTree = ""; }; + C55B11AC0E2D3B1B006357C1 /* eas_voicemgt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_voicemgt.c; path = ../../lib_src/eas_voicemgt.c; sourceTree = SOURCE_ROOT; }; + C55B11BC0E2D3B55006357C1 /* jet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jet.c; path = ../../lib_src/jet.c; sourceTree = SOURCE_ROOT; }; + C55B11C00E2D3BFD006357C1 /* eas_chorus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_chorus.c; path = ../../lib_src/eas_chorus.c; sourceTree = SOURCE_ROOT; }; + C55B11D00E2D3C62006357C1 /* eas_imelody.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_imelody.c; path = ../../lib_src/eas_imelody.c; sourceTree = SOURCE_ROOT; }; + C55B11D10E2D3C62006357C1 /* eas_imelodydata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_imelodydata.c; path = ../../lib_src/eas_imelodydata.c; sourceTree = SOURCE_ROOT; }; + C55B11D20E2D3C62006357C1 /* eas_mdls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_mdls.c; path = ../../lib_src/eas_mdls.c; sourceTree = SOURCE_ROOT; }; + C55B11D30E2D3C62006357C1 /* eas_ota.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_ota.c; path = ../../lib_src/eas_ota.c; sourceTree = SOURCE_ROOT; }; + C55B11D40E2D3C62006357C1 /* eas_otadata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_otadata.c; path = ../../lib_src/eas_otadata.c; sourceTree = SOURCE_ROOT; }; + C55B11D50E2D3C62006357C1 /* eas_rtttl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_rtttl.c; path = ../../lib_src/eas_rtttl.c; sourceTree = SOURCE_ROOT; }; + C55B11D60E2D3C62006357C1 /* eas_rtttldata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_rtttldata.c; path = ../../lib_src/eas_rtttldata.c; sourceTree = SOURCE_ROOT; }; + C55B11DA0E2D3C62006357C1 /* eas_smf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_smf.c; path = ../../lib_src/eas_smf.c; sourceTree = SOURCE_ROOT; }; + C55B11DB0E2D3C62006357C1 /* eas_smfdata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_smfdata.c; path = ../../lib_src/eas_smfdata.c; sourceTree = SOURCE_ROOT; }; + C55B11DC0E2D3C62006357C1 /* eas_tcdata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_tcdata.c; path = ../../lib_src/eas_tcdata.c; sourceTree = SOURCE_ROOT; }; + C55B11DD0E2D3C62006357C1 /* eas_tonecontrol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_tonecontrol.c; path = ../../lib_src/eas_tonecontrol.c; sourceTree = SOURCE_ROOT; }; + C55B11DE0E2D3C62006357C1 /* eas_wavefile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_wavefile.c; path = ../../lib_src/eas_wavefile.c; sourceTree = SOURCE_ROOT; }; + C55B11DF0E2D3C62006357C1 /* eas_wavefiledata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_wavefiledata.c; path = ../../lib_src/eas_wavefiledata.c; sourceTree = SOURCE_ROOT; }; + C55B11F60E2D3C7B006357C1 /* eas_reverb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_reverb.c; path = ../../lib_src/eas_reverb.c; sourceTree = SOURCE_ROOT; }; + C55B11F80E2D3CAC006357C1 /* eastestv37.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = eastestv37.c; sourceTree = ""; }; + C55B12020E2D3D56006357C1 /* eas_dlssynth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_dlssynth.c; path = ../../lib_src/eas_dlssynth.c; sourceTree = SOURCE_ROOT; }; + C55B12030E2D3D56006357C1 /* eas_wtengine.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_wtengine.c; path = ../../lib_src/eas_wtengine.c; sourceTree = SOURCE_ROOT; }; + C55B12040E2D3D56006357C1 /* eas_wtsynth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = eas_wtsynth.c; path = ../../lib_src/eas_wtsynth.c; sourceTree = SOURCE_ROOT; }; + D2AAC046055464E500DB518D /* libeaswt_vst_lib.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libeaswt_vst_lib.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D289987405E68DCB004EDB86 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* easwt_vst_lib */ = { + isa = PBXGroup; + children = ( + C55B11280E2D31B6006357C1 /* Header Files */, + 08FB7795FE84155DC02AAC07 /* Source */, + C6A0FF2B0290797F04C91782 /* Documentation */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = easwt_vst_lib; + sourceTree = ""; + }; + 08FB7795FE84155DC02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + C55B119F0E2D3B1B006357C1 /* eas_data.c */, + C55B11A00E2D3B1B006357C1 /* eas_flog.c */, + C55B11A20E2D3B1B006357C1 /* eas_ima_tables.c */, + C55B11A30E2D3B1B006357C1 /* eas_imaadpcm.c */, + C55B11A40E2D3B1B006357C1 /* eas_math.c */, + C55B11A50E2D3B1B006357C1 /* eas_midi.c */, + C55B11A60E2D3B1B006357C1 /* eas_mididata.c */, + C55B11A70E2D3B1B006357C1 /* eas_mixbuf.c */, + C55B11320E2D33B4006357C1 /* eas_mixer.c */, + C55B11A80E2D3B1B006357C1 /* eas_pan.c */, + C55B11A90E2D3B1B006357C1 /* eas_pcm.c */, + C55B11AA0E2D3B1B006357C1 /* eas_pcmdata.c */, + C55B11AB0E2D3B1B006357C1 /* eas_public.c */, + C55B11AC0E2D3B1B006357C1 /* eas_voicemgt.c */, + C55B11BC0E2D3B55006357C1 /* jet.c */, + C55B11960E2D3A56006357C1 /* Chorus */, + C55B119A0E2D3A7F006357C1 /* Parsers */, + C55B11970E2D3A5C006357C1 /* Reverb */, + C55B119B0E2D3A99006357C1 /* SoundLibs */, + C55B119D0E2D3AB6006357C1 /* Wavetable */, + ); + name = Source; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC046055464E500DB518D /* libeaswt_vst_lib.a */, + ); + name = Products; + sourceTree = ""; + }; + C55B11280E2D31B6006357C1 /* Header Files */ = { + isa = PBXGroup; + children = ( + 9A56AC040F71BCFE00D115A7 /* eas_build.h */, + 9A56ABCF0F71998600D115A7 /* eas_fmengine.h */, + C55B11880E2D39B0006357C1 /* Reverb */, + C55B11870E2D39A9006357C1 /* Chorus */, + C55B11850E2D395F006357C1 /* eas_wtengine.h */, + C55B11810E2D38FB006357C1 /* jet.h */, + C55B11820E2D38FB006357C1 /* jet_data.h */, + C55B116B0E2D38CE006357C1 /* eas_mdls.h */, + C55B116C0E2D38CE006357C1 /* eas_otadata.h */, + C55B116D0E2D38CE006357C1 /* eas_parser.h */, + C55B116E0E2D38CE006357C1 /* eas_rtttldata.h */, + C55B11700E2D38CE006357C1 /* eas_smf.h */, + C55B11710E2D38CE006357C1 /* eas_smfdata.h */, + C55B11720E2D38CE006357C1 /* eas_tcdata.h */, + C55B11730E2D38CE006357C1 /* eas_wavefile.h */, + C55B11620E2D37FC006357C1 /* eas_imelodydata.h */, + C55B11530E2D3796006357C1 /* eas_effects.h */, + C55B11290E2D33B4006357C1 /* eas.h */, + C55B112A0E2D33B4006357C1 /* eas_audioconst.h */, + C55B112C0E2D33B4006357C1 /* eas_config.h */, + C55B112D0E2D33B4006357C1 /* eas_data.h */, + C55B112E0E2D33B4006357C1 /* eas_host.h */, + C55B112F0E2D33B4006357C1 /* eas_math.h */, + C55B11300E2D33B4006357C1 /* eas_midi.h */, + C55B11310E2D33B4006357C1 /* eas_midictrl.h */, + C55B11330E2D33B4006357C1 /* eas_pan.h */, + C55B11340E2D33B4006357C1 /* eas_pcm.h */, + C55B11350E2D33B4006357C1 /* eas_pcmdata.h */, + C55B11370E2D33B4006357C1 /* eas_report.h */, + C55B11380E2D33B4006357C1 /* eas_sndlib.h */, + C55B11390E2D33B4006357C1 /* eas_synth.h */, + C55B113A0E2D33B4006357C1 /* eas_synth_protos.h */, + C55B113B0E2D33B4006357C1 /* eas_types.h */, + C55B113C0E2D33B4006357C1 /* eas_vm_protos.h */, + ); + name = "Header Files"; + sourceTree = ""; + }; + C55B11870E2D39A9006357C1 /* Chorus */ = { + isa = PBXGroup; + children = ( + C55B11920E2D39FE006357C1 /* eas_chorus.h */, + C55B11930E2D39FE006357C1 /* eas_chorusdata.h */, + ); + name = Chorus; + sourceTree = ""; + }; + C55B11880E2D39B0006357C1 /* Reverb */ = { + isa = PBXGroup; + children = ( + C55B118E0E2D39ED006357C1 /* eas_reverb.h */, + C55B118F0E2D39ED006357C1 /* eas_reverbdata.h */, + ); + name = Reverb; + sourceTree = ""; + }; + C55B11960E2D3A56006357C1 /* Chorus */ = { + isa = PBXGroup; + children = ( + C55B11C00E2D3BFD006357C1 /* eas_chorus.c */, + ); + name = Chorus; + sourceTree = ""; + }; + C55B11970E2D3A5C006357C1 /* Reverb */ = { + isa = PBXGroup; + children = ( + C55B11F60E2D3C7B006357C1 /* eas_reverb.c */, + ); + name = Reverb; + sourceTree = ""; + }; + C55B119A0E2D3A7F006357C1 /* Parsers */ = { + isa = PBXGroup; + children = ( + 9A56ABD70F719D4600D115A7 /* eas_xmf.c */, + 9A56ABD80F719D4600D115A7 /* eas_xmf.h */, + 9A56ABD90F719D4600D115A7 /* eas_xmfdata.c */, + 9A56ABDA0F719D4600D115A7 /* eas_xmfdata.h */, + C55B11D00E2D3C62006357C1 /* eas_imelody.c */, + C55B11D10E2D3C62006357C1 /* eas_imelodydata.c */, + C55B11D20E2D3C62006357C1 /* eas_mdls.c */, + C55B11D30E2D3C62006357C1 /* eas_ota.c */, + C55B11D40E2D3C62006357C1 /* eas_otadata.c */, + C55B11D50E2D3C62006357C1 /* eas_rtttl.c */, + C55B11D60E2D3C62006357C1 /* eas_rtttldata.c */, + C55B11DA0E2D3C62006357C1 /* eas_smf.c */, + C55B11DB0E2D3C62006357C1 /* eas_smfdata.c */, + C55B11DC0E2D3C62006357C1 /* eas_tcdata.c */, + C55B11DD0E2D3C62006357C1 /* eas_tonecontrol.c */, + C55B11DE0E2D3C62006357C1 /* eas_wavefile.c */, + C55B11DF0E2D3C62006357C1 /* eas_wavefiledata.c */, + ); + name = Parsers; + sourceTree = ""; + }; + C55B119B0E2D3A99006357C1 /* SoundLibs */ = { + isa = PBXGroup; + children = ( + 9A56AB8E0F7197AE00D115A7 /* wt_44khz.c */, + C55B11F80E2D3CAC006357C1 /* eastestv37.c */, + ); + name = SoundLibs; + sourceTree = ""; + }; + C55B119D0E2D3AB6006357C1 /* Wavetable */ = { + isa = PBXGroup; + children = ( + C55B12020E2D3D56006357C1 /* eas_dlssynth.c */, + C55B12030E2D3D56006357C1 /* eas_wtengine.c */, + C55B12040E2D3D56006357C1 /* eas_wtsynth.c */, + ); + name = Wavetable; + sourceTree = ""; + }; + C6A0FF2B0290797F04C91782 /* Documentation */ = { + isa = PBXGroup; + children = ( + ); + name = Documentation; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D2AAC043055464E500DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C55B113D0E2D33B4006357C1 /* eas.h in Headers */, + C55B113E0E2D33B4006357C1 /* eas_audioconst.h in Headers */, + C55B11400E2D33B4006357C1 /* eas_config.h in Headers */, + C55B11410E2D33B4006357C1 /* eas_data.h in Headers */, + C55B11420E2D33B4006357C1 /* eas_host.h in Headers */, + C55B11430E2D33B4006357C1 /* eas_math.h in Headers */, + C55B11440E2D33B4006357C1 /* eas_midi.h in Headers */, + C55B11450E2D33B4006357C1 /* eas_midictrl.h in Headers */, + C55B11470E2D33B4006357C1 /* eas_pan.h in Headers */, + C55B11480E2D33B4006357C1 /* eas_pcm.h in Headers */, + C55B11490E2D33B4006357C1 /* eas_pcmdata.h in Headers */, + C55B114B0E2D33B4006357C1 /* eas_report.h in Headers */, + C55B114C0E2D33B4006357C1 /* eas_sndlib.h in Headers */, + C55B114D0E2D33B4006357C1 /* eas_synth.h in Headers */, + C55B114E0E2D33B4006357C1 /* eas_synth_protos.h in Headers */, + C55B114F0E2D33B4006357C1 /* eas_types.h in Headers */, + C55B11500E2D33B4006357C1 /* eas_vm_protos.h in Headers */, + C55B115B0E2D3796006357C1 /* eas_effects.h in Headers */, + C55B11640E2D37FC006357C1 /* eas_imelodydata.h in Headers */, + C55B11760E2D38CE006357C1 /* eas_mdls.h in Headers */, + C55B11770E2D38CE006357C1 /* eas_otadata.h in Headers */, + C55B11780E2D38CE006357C1 /* eas_parser.h in Headers */, + C55B11790E2D38CE006357C1 /* eas_rtttldata.h in Headers */, + C55B117B0E2D38CE006357C1 /* eas_smf.h in Headers */, + C55B117C0E2D38CE006357C1 /* eas_smfdata.h in Headers */, + C55B117D0E2D38CE006357C1 /* eas_tcdata.h in Headers */, + C55B117E0E2D38CE006357C1 /* eas_wavefile.h in Headers */, + C55B11830E2D38FB006357C1 /* jet.h in Headers */, + C55B11840E2D38FB006357C1 /* jet_data.h in Headers */, + C55B11860E2D395F006357C1 /* eas_wtengine.h in Headers */, + C55B11900E2D39ED006357C1 /* eas_reverb.h in Headers */, + C55B11910E2D39ED006357C1 /* eas_reverbdata.h in Headers */, + C55B11940E2D39FE006357C1 /* eas_chorus.h in Headers */, + C55B11950E2D39FE006357C1 /* eas_chorusdata.h in Headers */, + 9A56ABD00F71998600D115A7 /* eas_fmengine.h in Headers */, + 9A56ABDC0F719D4600D115A7 /* eas_xmf.h in Headers */, + 9A56ABDE0F719D4600D115A7 /* eas_xmfdata.h in Headers */, + 9A56AC050F71BCFE00D115A7 /* eas_build.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + D2AAC045055464E500DB518D /* easwt_vst_lib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB91EB08733DB70010E9CD /* Build configuration list for PBXNativeTarget "easwt_vst_lib" */; + buildPhases = ( + D2AAC043055464E500DB518D /* Headers */, + D2AAC044055464E500DB518D /* Sources */, + D289987405E68DCB004EDB86 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = easwt_vst_lib; + productName = easwt_vst_lib; + productReference = D2AAC046055464E500DB518D /* libeaswt_vst_lib.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "easwt_vst_lib" */; + compatibilityVersion = "Xcode 3.0"; + hasScannedForEncodings = 1; + mainGroup = 08FB7794FE84155DC02AAC07 /* easwt_vst_lib */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC045055464E500DB518D /* easwt_vst_lib */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + D2AAC044055464E500DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C55B11460E2D33B4006357C1 /* eas_mixer.c in Sources */, + C55B11AE0E2D3B1B006357C1 /* eas_data.c in Sources */, + C55B11AF0E2D3B1B006357C1 /* eas_flog.c in Sources */, + C55B11B10E2D3B1B006357C1 /* eas_ima_tables.c in Sources */, + C55B11B20E2D3B1B006357C1 /* eas_imaadpcm.c in Sources */, + C55B11B30E2D3B1B006357C1 /* eas_math.c in Sources */, + C55B11B40E2D3B1B006357C1 /* eas_midi.c in Sources */, + C55B11B50E2D3B1B006357C1 /* eas_mididata.c in Sources */, + C55B11B60E2D3B1B006357C1 /* eas_mixbuf.c in Sources */, + C55B11B70E2D3B1B006357C1 /* eas_pan.c in Sources */, + C55B11B80E2D3B1B006357C1 /* eas_pcm.c in Sources */, + C55B11B90E2D3B1B006357C1 /* eas_pcmdata.c in Sources */, + C55B11BA0E2D3B1B006357C1 /* eas_public.c in Sources */, + C55B11BB0E2D3B1B006357C1 /* eas_voicemgt.c in Sources */, + C55B11BD0E2D3B55006357C1 /* jet.c in Sources */, + C55B11C10E2D3BFD006357C1 /* eas_chorus.c in Sources */, + C55B11E40E2D3C62006357C1 /* eas_imelody.c in Sources */, + C55B11E50E2D3C62006357C1 /* eas_imelodydata.c in Sources */, + C55B11E60E2D3C62006357C1 /* eas_mdls.c in Sources */, + C55B11E70E2D3C62006357C1 /* eas_ota.c in Sources */, + C55B11E80E2D3C62006357C1 /* eas_otadata.c in Sources */, + C55B11E90E2D3C62006357C1 /* eas_rtttl.c in Sources */, + C55B11EA0E2D3C62006357C1 /* eas_rtttldata.c in Sources */, + C55B11EE0E2D3C62006357C1 /* eas_smf.c in Sources */, + C55B11EF0E2D3C62006357C1 /* eas_smfdata.c in Sources */, + C55B11F00E2D3C62006357C1 /* eas_tcdata.c in Sources */, + C55B11F10E2D3C62006357C1 /* eas_tonecontrol.c in Sources */, + C55B11F20E2D3C62006357C1 /* eas_wavefile.c in Sources */, + C55B11F30E2D3C62006357C1 /* eas_wavefiledata.c in Sources */, + C55B11F70E2D3C7B006357C1 /* eas_reverb.c in Sources */, + C55B11FA0E2D3CAC006357C1 /* eastestv37.c in Sources */, + C55B12050E2D3D56006357C1 /* eas_dlssynth.c in Sources */, + C55B12060E2D3D56006357C1 /* eas_wtengine.c in Sources */, + C55B12070E2D3D56006357C1 /* eas_wtsynth.c in Sources */, + 9A56AB8F0F7197AE00D115A7 /* wt_44khz.c in Sources */, + 9A56ABDB0F719D4600D115A7 /* eas_xmf.c in Sources */, + 9A56ABDD0F719D4600D115A7 /* eas_xmfdata.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB91EC08733DB70010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG_JET=1", + "_DEBUG_SMAF=1", + "_DEBUG_CMF=1", + "JET_INTERFACE=1", + "MAX_SMF_STREAMS=32", + "NUM_OUTPUT_CHANNELS=2", + "_SAMPLE_RATE_44100=1", + "_8_BIT_SAMPLES=1", + "_FILTER_ENABLED=1", + "_NO_DEBUG_PREPROCESSOR=1", + "_CORE_CYCLES_PER_MEMORY_CYCLE=1", + "_IMA_DECODER=1", + "_XMF_PARSER=1", + "_DLS_PARSER=1", + "MAX_DLS_MEMORY=16777216", + "EAS_WT_SYNTH=1", + "MAX_SYNTH_VOICES=64", + "X_ENHANCER_ENABLED=1", + "_REVERB_ENABLED=1", + "_CHORUS_ENABLED=1", + "DLS_SYNTHESIZER=1", + "EXTERNAL_AUDIO=1", + "TEST_HARNESS=1", + "MMAPI_SUPPORT=1", + "X_MAXIMIZER_ENABLED=1", + "X_COMPRESSOR_ENABLED=1", + "X_STATS=1", + "X_DEBUG_DLS=1", + "X_OPTIMIZED_MONO=1", + "X_CHECKED_BUILD=1", + "_NO_ALIGN=1", + "_C_REFERENCE=1", + "XMAXIMIZER_USE_FLOATING_POINT=1", + ); + HEADER_SEARCH_PATHS = ( + "${TARGET_BUILD_DIR}/**", + "../../Common/**", + "../../Parsers/**", + "../../Effects/**", + "../../WTSynth/**", + "../../FMSynth/**", + "../../SplitArch/**", + "../../Jet/**", + ); + INSTALL_PATH = /usr/local/lib; + MACOSX_DEPLOYMENT_TARGET = 10.4; + PRODUCT_NAME = easwt_vst_lib; + ZERO_LINK = YES; + }; + name = Debug; + }; + 1DEB91ED08733DB70010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = i386; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_AUTO_VECTORIZATION = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_PREPROCESSOR_DEFINITIONS = ( + "JET_INTERFACE=1", + "MAX_SMF_STREAMS=32", + "NUM_OUTPUT_CHANNELS=2", + "_SAMPLE_RATE_44100=1", + "_8_BIT_SAMPLES=1", + "_FILTER_ENABLED=1", + "_NO_DEBUG_PREPROCESSOR=1", + "_CORE_CYCLES_PER_MEMORY_CYCLE=1", + "_IMA_DECODER=1", + "_XMF_PARSER=1", + "_DLS_PARSER=1", + "MAX_DLS_MEMORY=16777216", + "EAS_WT_SYNTH=1", + "MAX_SYNTH_VOICES=64", + "X_ENHANCER_ENABLED=1", + "_REVERB_ENABLED=1", + "_CHORUS_ENABLED=1", + "DLS_SYNTHESIZER=1", + "EXTERNAL_AUDIO=1", + "TEST_HARNESS=1", + "MMAPI_SUPPORT=1", + "X_MAXIMIZER_ENABLED=1", + "X_COMPRESSOR_ENABLED=1", + "X_STATS=1", + "X_DEBUG_DLS=1", + "X_OPTIMIZED_MONO=1", + "X_CHECKED_BUILD=1", + "_NO_ALIGN=1", + "_C_REFERENCE=1", + "XMAXIMIZER_USE_FLOATING_POINT=1", + ); + GCC_UNROLL_LOOPS = YES; + HEADER_SEARCH_PATHS = ( + "${TARGET_BUILD_DIR}/**", + "../../Common/**", + "../../Parsers/**", + "../../Effects/**", + "../../WTSynth/**", + "../../FMSynth/**", + "../../SplitArch/**", + "../../Jet/**", + ); + INSTALL_PATH = /usr/local/lib; + MACOSX_DEPLOYMENT_TARGET = 10.4; + PRODUCT_NAME = easwt_vst_lib; + }; + name = Release; + }; + 1DEB91F008733DB70010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; + }; + name = Debug; + }; + 1DEB91F108733DB70010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = i386; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO; + SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB91EB08733DB70010E9CD /* Build configuration list for PBXNativeTarget "easwt_vst_lib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91EC08733DB70010E9CD /* Debug */, + 1DEB91ED08733DB70010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB91EF08733DB70010E9CD /* Build configuration list for PBXProject "easwt_vst_lib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB91F008733DB70010E9CD /* Debug */, + 1DEB91F108733DB70010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/arm-wt-22k/jetcreator_lib_src/darwin-x86/wt_44khz.c b/arm-wt-22k/jetcreator_lib_src/darwin-x86/wt_44khz.c new file mode 100644 index 0000000..688c715 --- /dev/null +++ b/arm-wt-22k/jetcreator_lib_src/darwin-x86/wt_44khz.c @@ -0,0 +1,14723 @@ +/*---------------------------------------------------------------------------- + * + * Filename: wt_44khz.c + * Purpose: Wavetable sound libary + * + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +#include "eas_sndlib.h" + +/*---------------------------------------------------------------------------- + * Articulations + *---------------------------------------------------------------------------- +*/ +const S_ARTICULATION eas_articulations[] = +{ + { /* articulation 0 */ + { 32767, 31730, 0, 31730 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 1 */ + { 32767, 29669, 0, 29669 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 2 */ + { 32767, 31605, 0, 31701 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 3 */ + { 32767, 29434, 0, 29434 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 4 */ + { 32767, 0, 32767, 32742 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 5 */ + { 32767, 26439, 0, 26439 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 6 */ + { 32767, 32322, 0, 32350 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 7 */ + { 32767, 32715, 32767, 32715 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 8 */ + { 32767, 0, 32767, 0 }, + { 32767, 951, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 9 */ + { 32767, 32558, 0, 32558 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 10 */ + { 32767, 0, 32767, 23749 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -1 + }, + { /* articulation 11 */ + { 32767, 32245, 0, 32245 }, + { 32767, 380, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -44 + }, + { /* articulation 12 */ + { 32767, 27897, 0, 27897 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 56 + }, + { /* articulation 13 */ + { 32767, 32245, 0, 32245 }, + { 32767, 380, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -31 + }, + { /* articulation 14 */ + { 4755, 26439, 0, 26439 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 56 + }, + { /* articulation 15 */ + { 32767, 32187, 0, 32187 }, + { 32767, 380, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -6 + }, + { /* articulation 16 */ + { 32767, 32444, 0, 32480 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 56 + }, + { /* articulation 17 */ + { 32767, 32153, 0, 32153 }, + { 32767, 380, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 6 + }, + { /* articulation 18 */ + { 32767, 32072, 0, 32072 }, + { 32767, 476, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 31 + }, + { /* articulation 19 */ + { 32767, 32363, 0, 32363 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 25 + }, + { /* articulation 20 */ + { 32767, 31901, 0, 31901 }, + { 32767, 476, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 63 + }, + { /* articulation 21 */ + { 32767, 32528, 0, 32518 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -37 + }, + { /* articulation 22 */ + { 9511, 32322, 0, 32337 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -37 + }, + { /* articulation 23 */ + { 32767, 32376, 0, 32398 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -37 + }, + { /* articulation 24 */ + { 32767, 0, 32767, 32715 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 12 + }, + { /* articulation 25 */ + { 32767, 32052, 0, 32052 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -25 + }, + { /* articulation 26 */ + { 32767, 0, 32767, 32715 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 25 + }, + { /* articulation 27 */ + { 32767, 32289, 0, 32271 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -25 + }, + { /* articulation 28 */ + { 32767, 31730, 0, 31730 }, + { 32767, 48, 0, 0 }, + 0, 0, 476, 240, 0, 0, 0, 0, -56 + }, + { /* articulation 29 */ + { 32767, 32498, 0, 32492 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -37 + }, + { /* articulation 30 */ + { 32767, 29434, 0, 29434 }, + { 32767, 1902, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 50 + }, + { /* articulation 31 */ + { 32767, 27897, 0, 27897 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -50 + }, + { /* articulation 32 */ + { 32767, 31056, 0, 31056 }, + { 32767, 1902, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -50 + }, + { /* articulation 33 */ + { 32767, 31479, 0, 31476 }, + { 32767, 1902, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -44 + }, + { /* articulation 34 */ + { 32767, 32663, 0, 32663 }, + { 32767, 127, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 25 + }, + { /* articulation 35 */ + { 32767, 0, 32767, 32715 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -63 + }, + { /* articulation 36 */ + { 1902, 27897, 0, 27897 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -63 + }, + { /* articulation 37 */ + { 32767, 27897, 0, 27897 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -59 + }, + { /* articulation 38 */ + { 32767, 31730, 0, 31730 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 50 + }, + { /* articulation 39 */ + { 32767, 30725, 0, 30725 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 44 + }, + { /* articulation 40 */ + { 951, 31730, 0, 31730 }, + { 32767, 190, 0, 0 }, + 0, 0, 476, -100, 0, 0, 0, 0, 44 + }, + { /* articulation 41 */ + { 32767, 17213, 0, 17213 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 25 + }, + { /* articulation 42 */ + { 32767, 31295, 0, 31295 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 63 + }, + { /* articulation 43 */ + { 32767, 31479, 0, 31476 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 63 + }, + { /* articulation 44 */ + { 9511, 25581, 0, 25581 }, + { 476, 32767, 32767, 0 }, + 0, 0, 476, 100, 0, 0, 0, 0, -25 + }, + { /* articulation 45 */ + { 1902, 23749, 0, 23749 }, + { 476, 32767, 32767, 0 }, + 0, 0, 476, 500, 0, 0, 0, 0, -25 + }, + { /* articulation 46 */ + { 32767, 23749, 0, 23749 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -56 + }, + { /* articulation 47 */ + { 32767, 31730, 0, 31730 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, -56 + }, + { /* articulation 48 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 49 */ + { 32767, 31964, 0, 31964 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 50 */ + { 9511, 32363, 0, 32418 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 51 */ + { 32767, 31180, 0, 31180 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 52 */ + { 32767, 32251, 0, 32052 }, + { 32767, 147, 0, 0 }, + 0, 0, 476, 0, 10000, 7121, 0, 0, 0 + }, + { /* articulation 53 */ + { 32767, 0, 32767, 32072 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 778, 0, -2300, 11920, 0, 0, 0 + }, + { /* articulation 54 */ + { 587, 0, 32767, 32376 }, + { 32767, 63, 0, 0 }, + 0, 0, 778, 0, 2000, 10721, 0, 8, 15 + }, + { /* articulation 55 */ + { 587, 0, 32767, 32376 }, + { 476, 63, 0, 0 }, + 0, 0, 778, 0, 2000, 9023, 0, 5, 15 + }, + { /* articulation 56 */ + { 3804, 0, 32767, 31477 }, + { 32767, 34, 5898, 0 }, + 0, 0, 778, 0, 6000, 9080, 0, 0, -2 + }, + { /* articulation 57 */ + { 32767, 0, 32767, 31005 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 778, 0, 0, 0, 0, 0, 1 + }, + { /* articulation 58 */ + { 2570, 0, 32767, 31455 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 778, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 59 */ + { 32767, 32663, 0, 29434 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 60 */ + { 32767, 32558, 0, 29434 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 61 */ + { 32767, 32418, 0, 32418 }, + { 32767, 48, 0, 0 }, + 0, 69, 495, 0, 2400, 9521, 0, 0, 0 + }, + { /* articulation 62 */ + { 32767, 31476, 0, 31476 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 11738, 0, 16, 0 + }, + { /* articulation 63 */ + { 32767, 32558, 0, 31391 }, + { 32767, 317, 0, 0 }, + 0, 69, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 64 */ + { 32767, 32245, 0, 32115 }, + { 32767, 317, 0, 0 }, + 0, 69, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 65 */ + { 32767, 32593, 0, 28809 }, + { 32767, 48, 0, 0 }, + 0, 69, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 66 */ + { 32767, 32408, 0, 32363 }, + { 32767, 317, 0, 0 }, + 0, 69, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 67 */ + { 32767, 32350, 0, 32350 }, + { 32767, 317, 0, 0 }, + 0, 69, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 68 */ + { 4755, 32715, 18820, 27897 }, + { 951, 29, 13107, 0 }, + 0, 0, 495, 0, 6000, 5535, 0, 4, 0 + }, + { /* articulation 69 */ + { 32767, 32257, 0, 32245 }, + { 32767, 951, 0, 0 }, + 0, 103, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 70 */ + { 63, 32727, 3811, 32558 }, + { 48, 19, 32767, 0 }, + 0, 0, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 71 */ + { 2378, 32715, 3566, 30725 }, + { 1902, 32767, 32767, 0 }, + 0, 0, 495, 100, 0, 11919, 0, 0, 0 + }, + { /* articulation 72 */ + { 32767, 32349, 0, 32349 }, + { 32767, 168, 0, 0 }, + 0, 34, 495, 0, 7000, 9023, 0, 0, 0 + }, + { /* articulation 73 */ + { 32767, 32072, 0, 32072 }, + { 32767, 168, 0, 0 }, + 0, 3, 476, 0, 7000, 9023, 0, 0, 0 + }, + { /* articulation 74 */ + { 32767, 32698, 6208, 32349 }, + { 190, 48, 0, 0 }, + 0, 0, 495, 0, 3840, 8302, 0, 8, 0 + }, + { /* articulation 75 */ + { 32767, 32418, 0, 32468 }, + { 32767, 190, 0, 0 }, + 0, 0, 495, 0, 5000, 8321, 0, 0, 0 + }, + { /* articulation 76 */ + { 32767, 32349, 0, 32349 }, + { 32767, 190, 0, 0 }, + 0, 0, 476, 0, 5000, 7934, 0, 0, 0 + }, + { /* articulation 77 */ + { 32767, 32441, 0, 31709 }, + { 32767, 32, 0, 0 }, + 0, 34, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 78 */ + { 32767, 32505, 0, 27897 }, + { 32767, 951, 0, 0 }, + 0, 345, 495, 0, 1000, 11107, 0, 0, 0 + }, + { /* articulation 79 */ + { 32767, 32715, 6208, 32349 }, + { 48, 48, 0, 0 }, + 0, 69, 811, 0, 3560, 8834, 1, 8, 0 + }, + { /* articulation 80 */ + { 32767, 32564, 0, 29434 }, + { 32767, 95, 0, 0 }, + 0, 34, 495, 0, 6000, 9907, 0, 0, 0 + }, + { /* articulation 81 */ + { 32767, 32505, 0, 27897 }, + { 32767, 32, 0, 0 }, + 0, 34, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 82 */ + { 32767, 32245, 18820, 17213 }, + { 32767, 32767, 32767, 0 }, + 0, 34, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 83 */ + { 32767, 32742, 128, 32466 }, + { 32767, 63, 0, 0 }, + 0, 0, 495, 0, 0, 11920, 0, 8, 0 + }, + { /* articulation 84 */ + { 32767, 32418, 0, 32418 }, + { 32767, 33, 0, 0 }, + 3, 0, 286, 0, 5000, 5535, 0, 0, 0 + }, + { /* articulation 85 */ + { 1902, 32715, 18820, 27897 }, + { 32767, 1012, 0, 0 }, + 10, 69, 504, -30, 0, 0, 0, 0, 0 + }, + { /* articulation 86 */ + { 9511, 32715, 18820, 27897 }, + { 380, 48, 0, 0 }, + 0, 69, 495, 0, 4473, 7131, 0, 8, 0 + }, + { /* articulation 87 */ + { 951, 32698, 6208, 32468 }, + { 317, 19, 16384, 0 }, + 0, 0, 495, 0, 2987, 7877, 0, 12, 0 + }, + { /* articulation 88 */ + { 32767, 32680, 0, 32349 }, + { 32767, 48, 0, 0 }, + 0, 0, 581, 0, 4053, 7930, 2, 12, 0 + }, + { /* articulation 89 */ + { 190, 32726, 6208, 32349 }, + { 32767, 56, 0, 0 }, + 0, 0, 495, 0, 0, 8887, 0, 0, 0 + }, + { /* articulation 90 */ + { 9511, 32715, 18820, 27897 }, + { 634, 48, 0, 0 }, + 0, 69, 495, 0, 5113, 7981, 0, 4, 0 + }, + { /* articulation 91 */ + { 951, 32715, 6208, 31730 }, + { 951, 63, 0, 0 }, + 0, 69, 495, 0, 3500, 7877, 0, 5, 0 + }, + { /* articulation 92 */ + { 951, 32715, 6208, 31730 }, + { 634, 48, 0, 0 }, + 0, 69, 476, 0, 4773, 8355, 0, 5, 0 + }, + { /* articulation 93 */ + { 238, 32715, 10809, 32349 }, + { 32767, 32767, 32767, 0 }, + 0, 69, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 94 */ + { 1902, 32715, 18820, 31476 }, + { 32767, 32767, 32767, 0 }, + 0, 69, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 95 */ + { 3804, 32715, 18820, 23749 }, + { 1268, 130, 0, 0 }, + 0, 69, 495, 0, 1200, 11690, 0, 4, 0 + }, + { /* articulation 96 */ + { 19021, 32618, 15076, 31476 }, + { 32767, 32767, 32767, 0 }, + 0, 72, 1091, 0, 0, 11919, 1, 0, 0 + }, + { /* articulation 97 */ + { 32767, 0, 32767, 32715 }, + { 190, 32767, 32767, 0 }, + 0, 0, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 98 */ + { 32767, 32072, 0, 32072 }, + { 32767, 317, 0, 0 }, + 0, 0, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 99 */ + { 32767, 32663, 0, 27897 }, + { 634, 95, 13107, 0 }, + 0, 69, 495, 0, 3200, 8321, 0, 0, 0 + }, + { /* articulation 100 */ + { 32767, 0, 32767, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 101 */ + { 32767, 32418, 0, 27897 }, + { 32767, 543, 0, 0 }, + 0, 69, 495, 0, 8187, 5535, 0, 5, 0 + }, + { /* articulation 102 */ + { 19021, 32663, 0, 31056 }, + { 32767, 95, 7667, 0 }, + 5, 0, 495, 0, 6053, 5535, 0, 5, 0 + }, + { /* articulation 103 */ + { 32767, 32715, 18820, 27897 }, + { 951, 48, 0, 0 }, + 0, 0, 495, 0, 2700, 9852, 0, 0, 0 + }, + { /* articulation 104 */ + { 32767, 32715, 18820, 30234 }, + { 951, 48, 0, 0 }, + 0, 0, 495, 0, 2700, 9852, 0, 0, 0 + }, + { /* articulation 105 */ + { 32767, 32715, 18820, 27897 }, + { 32767, 634, 0, 0 }, + 0, 103, 476, 0, 2500, 10490, 1, 8, 0 + }, + { /* articulation 106 */ + { 32767, 32715, 23493, 27897 }, + { 32767, 190, 0, 0 }, + 0, 69, 494, 0, 4000, 10223, 1, 4, 0 + }, + { /* articulation 107 */ + { 32767, 32715, 18820, 30234 }, + { 32767, 63, 7667, 0 }, + 0, 0, 495, 0, 1813, 9154, 0, 0, 0 + }, + { /* articulation 108 */ + { 19021, 32245, 0, 32245 }, + { 32767, 190, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 109 */ + { 32767, 31964, 0, 31605 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 11690, 0, 0, 0 + }, + { /* articulation 110 */ + { 32767, 31730, 0, 31730 }, + { 32767, 190, 0, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 111 */ + { 32767, 32558, 18820, 30234 }, + { 32767, 48, 0, 0 }, + 12, 69, 476, 0, 3000, 10223, 0, 0, 0 + }, + { /* articulation 112 */ + { 32767, 32558, 18820, 30234 }, + { 32767, 32, 0, 0 }, + 12, 69, 476, 0, 1900, 10031, 0, 0, 0 + }, + { /* articulation 113 */ + { 32767, 32715, 18820, 29434 }, + { 32767, 32, 0, 0 }, + 12, 69, 494, 0, 1000, 11107, 0, 0, 0 + }, + { /* articulation 114 */ + { 32767, 32715, 18820, 29434 }, + { 32767, 32, 0, 0 }, + 12, 69, 494, 0, 2000, 11107, 0, 0, 0 + }, + { /* articulation 115 */ + { 32767, 32636, 0, 29434 }, + { 32767, 95, 0, 0 }, + 0, 34, 495, 0, 4000, 8321, 0, 0, 0 + }, + { /* articulation 116 */ + { 32767, 32297, 19893, 17213 }, + { 32767, 238, 0, 0 }, + 0, 69, 726, 0, 0, 11919, 0, 0, 0 + }, + { /* articulation 117 */ + { 9511, 32418, 23493, 17213 }, + { 32767, 32767, 32767, 0 }, + 0, 69, 678, 0, 0, 11877, 1, 0, 0 + }, + { /* articulation 118 */ + { 32767, 32618, 0, 27897 }, + { 32767, 95, 0, 0 }, + 0, 69, 495, 0, 3500, 9023, 0, 0, 0 + }, + { /* articulation 119 */ + { 32767, 23749, 23493, 0 }, + { 32767, 32767, 32767, 0 }, + 0, 34, 761, 0, 0, 10925, 1, 0, 0 + }, + { /* articulation 120 */ + { 32767, 32636, 0, 29434 }, + { 32767, 95, 0, 0 }, + 0, 103, 495, 0, 3200, 8721, 0, 4, 0 + }, + { /* articulation 121 */ + { 1902, 32715, 18820, 27897 }, + { 32767, 32767, 32767, 0 }, + 0, 69, 495, 0, 0, 0, 1, 0, 0 + }, + { /* articulation 122 */ + { 4755, 32715, 18820, 28809 }, + { 32767, 32767, 32767, 0 }, + 0, 69, 495, 0, 0, 11877, 0, 8, 0 + }, + { /* articulation 123 */ + { 32767, 32715, 18820, 27897 }, + { 32767, 16, 0, 0 }, + 0, 34, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 124 */ + { 32767, 32663, 0, 27897 }, + { 32767, 190, 0, 0 }, + 0, 69, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 125 */ + { 32767, 32715, 18820, 27897 }, + { 32767, 12, 0, 0 }, + 0, 34, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 126 */ + { 32767, 31730, 0, 31730 }, + { 32767, 380, 0, 0 }, + 0, 0, 495, 0, 3000, 10223, 0, 8, 0 + }, + { /* articulation 127 */ + { 63, 0, 32767, 32558 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 761, 0, 0, 11423, 4, 0, 0 + }, + { /* articulation 128 */ + { 476, 32595, 0, 32577 }, + { 32767, 10, 0, 0 }, + 0, 0, 495, 0, 0, 11423, 0, 0, 0 + }, + { /* articulation 129 */ + { 196, 0, 0, 31964 }, + { 95, 32767, 32767, 0 }, + 0, 0, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 130 */ + { 32767, 31730, 0, 31730 }, + { 32767, 380, 0, 0 }, + 0, 0, 495, 1200, 0, 0, 0, 0, 0 + }, + { /* articulation 131 */ + { 32767, 32245, 0, 32349 }, + { 32767, 190, 0, 0 }, + 0, 0, 495, 50, 0, 0, 0, 0, 0 + }, + { /* articulation 132 */ + { 32767, 32418, 0, 32418 }, + { 32767, 9511, 0, 0 }, + 0, 0, 495, 0, 4700, 7769, 0, 0, 0 + }, + { /* articulation 133 */ + { 32767, 31391, 0, 31391 }, + { 32767, 19021, 0, 0 }, + 0, 0, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 134 */ + { 32767, 32663, 32767, 32663 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 135 */ + { 32767, 32715, 18820, 23749 }, + { 32767, 95, 0, 0 }, + 10, 68, 476, 0, 2000, 10696, 0, 0, 0 + }, + { /* articulation 136 */ + { 32767, 32715, 10809, 23749 }, + { 32767, 95, 0, 0 }, + 12, 69, 491, 0, 0, 10910, 0, 0, 0 + }, + { /* articulation 137 */ + { 32767, 32715, 18820, 23749 }, + { 32767, 95, 0, 0 }, + 10, 69, 476, 0, 1200, 10218, 0, 0, 0 + }, + { /* articulation 138 */ + { 19021, 32715, 18820, 23749 }, + { 32767, 95, 0, 0 }, + 10, 69, 476, 0, 1100, 9525, 0, 0, 0 + }, + { /* articulation 139 */ + { 9511, 32663, 18820, 27897 }, + { 32767, 10, 0, 0 }, + 10, 69, 494, 0, 2000, 10962, 0, 0, 0 + }, + { /* articulation 140 */ + { 32767, 32558, 18820, 27897 }, + { 9511, 317, 0, 0 }, + 10, 63, 504, 0, 1200, 10090, 0, 0, 0 + }, + { /* articulation 141 */ + { 1268, 0, 32767, 30234 }, + { 951, 190, 0, 0 }, + 7, 69, 494, 0, 1620, 8933, 0, 0, 0 + }, + { /* articulation 142 */ + { 32767, 32558, 10809, 27897 }, + { 19021, 190, 0, 0 }, + 7, 69, 494, 0, 2200, 8994, 0, 0, 0 + }, + { /* articulation 143 */ + { 32767, 32715, 15076, 27897 }, + { 32767, 951, 0, 0 }, + 10, 69, 491, 0, 2500, 9525, 0, 0, 0 + }, + { /* articulation 144 */ + { 32767, 32715, 15076, 27897 }, + { 32767, 95, 0, 0 }, + 10, 69, 476, 0, 1500, 11423, 0, 0, 0 + }, + { /* articulation 145 */ + { 32767, 32715, 18820, 27897 }, + { 32767, 951, 0, 0 }, + 9, 69, 491, 0, 1500, 9521, 0, 0, 0 + }, + { /* articulation 146 */ + { 1902, 0, 32767, 30725 }, + { 32767, 32767, 32767, 0 }, + 0, 0, 761, 0, 0, 9521, 0, 0, 0 + }, + { /* articulation 147 */ + { 32767, 32663, 0, 27897 }, + { 32767, 9511, 0, 0 }, + 0, 34, 495, 0, 5000, 10223, 0, 0, 0 + }, + { /* articulation 148 */ + { 32767, 32715, 18820, 27897 }, + { 32767, 32, 0, 0 }, + 10, 69, 476, 0, 1500, 9907, 0, 0, 0 + }, + { /* articulation 149 */ + { 32767, 32733, 11682, 27897 }, + { 32767, 951, 0, 0 }, + 0, 69, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 150 */ + { 32767, 32418, 0, 32418 }, + { 32767, 190, 0, 0 }, + 0, 34, 495, 0, 3440, 9260, 0, 0, 0 + }, + { /* articulation 151 */ + { 32767, 31476, 0, 31730 }, + { 32767, 951, 0, 0 }, + 0, 34, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 152 */ + { 32767, 32245, 0, 31730 }, + { 32767, 190, 0, 0 }, + 0, 34, 495, 0, 4000, 7823, 0, 0, 0 + }, + { /* articulation 153 */ + { 32767, 32663, 3566, 27897 }, + { 391, 32767, 32767, 0 }, + 100, 0, 761, 500, 0, 11877, 0, 0, 0 + }, + { /* articulation 154 */ + { 32767, 32715, 18820, 23749 }, + { 32767, 951, 0, 0 }, + 8, 69, 495, -22, 0, 0, 0, 0, 0 + }, + { /* articulation 155 */ + { 9511, 30830, 6784, 27897 }, + { 32767, 951, 0, 0 }, + 0, 69, 476, 0, 5000, 9521, 1, 0, 0 + }, + { /* articulation 156 */ + { 32767, 32663, 0, 32349 }, + { 951, 127, 16384, 0 }, + 0, 103, 495, 0, 3627, 10547, 0, 5, 0 + }, + { /* articulation 157 */ + { 1902, 0, 32767, 27897 }, + { 951, 951, 0, 0 }, + 0, 69, 495, 27, 0, 11919, 0, 0, 0 + }, + { /* articulation 158 */ + { 32767, 0, 32767, 32245 }, + { 38, 33, 10092, 0 }, + 5, 0, 495, 0, 8007, 5535, 0, 8, 0 + }, + { /* articulation 159 */ + { 32767, 32618, 0, 31056 }, + { 32767, 63, 0, 0 }, + 0, 103, 495, 0, 2500, 9032, 0, 0, 0 + }, + { /* articulation 160 */ + { 4755, 32715, 10809, 28809 }, + { 32767, 32767, 32767, 0 }, + 0, 69, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 161 */ + { 9511, 32663, 18820, 27897 }, + { 32767, 95, 0, 0 }, + 10, 69, 494, 0, 2600, 9513, 0, 0, 0 + }, + { /* articulation 162 */ + { 32767, 32435, 9568, 27897 }, + { 1174, 196, 0, 0 }, + 10, 103, 490, 0, 6500, 9023, 0, 0, 0 + }, + { /* articulation 163 */ + { 32767, 32663, 0, 29434 }, + { 32767, 32, 0, 0 }, + 0, 69, 495, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 164 */ + { 32767, 32418, 15076, 23749 }, + { 32767, 634, 0, 0 }, + 0, 0, 476, 0, 2000, 10223, 0, 0, 0 + }, + { /* articulation 165 */ + { 32767, 32663, 0, 27897 }, + { 32767, 190, 0, 0 }, + 0, 69, 495, 0, 3000, 9366, 0, 0, 0 + }, + { /* articulation 166 */ + { 32767, 32715, 18820, 27897 }, + { 951, 64, 10879, 0 }, + 0, 0, 495, 0, 6000, 7121, 0, 4, 0 + }, + { /* articulation 167 */ + { 32767, 32636, 0, 29434 }, + { 32767, 10, 0, 0 }, + 0, 103, 495, 0, 3500, 6236, 0, 5, 0 + }, + { /* articulation 168 */ + { 32767, 32636, 0, 29434 }, + { 32767, 95, 0, 0 }, + 0, 103, 495, 0, 2800, 7121, 0, 0, 0 + }, + { /* articulation 169 */ + { 32767, 32593, 0, 31056 }, + { 32767, 63, 0, 0 }, + 0, 103, 495, 0, 2100, 9626, 0, 0, 0 + }, + { /* articulation 170 */ + { 32767, 32558, 0, 31476 }, + { 32767, 63, 0, 0 }, + 0, 103, 495, 0, 3000, 9626, 0, 0, 0 + }, + { /* articulation 171 */ + { 32767, 32527, 0, 30506 }, + { 32767, 63, 0, 0 }, + 0, 103, 495, 0, 1000, 9032, 0, 0, 0 + }, + { /* articulation 172 */ + { 32767, 32418, 0, 30725 }, + { 32767, 63, 0, 0 }, + 0, 103, 495, 0, 1000, 9032, 0, 0, 0 + }, + { /* articulation 173 */ + { 1902, 32418, 15076, 23749 }, + { 32767, 634, 0, 0 }, + 0, 103, 496, 0, 0, 11107, 0, 8, 0 + }, + { /* articulation 174 */ + { 32767, 32558, 15076, 27897 }, + { 3804, 73, 0, 0 }, + 0, 0, 495, 0, 4500, 9521, 0, 8, 0 + }, + { /* articulation 175 */ + { 32767, 32715, 18820, 27897 }, + { 32767, 48, 0, 0 }, + 0, 0, 495, 0, 2000, 8321, 0, 8, 0 + }, + { /* articulation 176 */ + { 32767, 32742, 128, 31180 }, + { 32767, 865, 0, 0 }, + 0, 0, 495, 0, 6000, 7823, 0, 8, 0 + }, + { /* articulation 177 */ + { 9511, 32608, 0, 32322 }, + { 32767, 48, 0, 0 }, + 0, 0, 495, 0, 4500, 7121, 0, 8, 0 + }, + { /* articulation 178 */ + { 19021, 32664, 3646, 32436 }, + { 32767, 95, 0, 0 }, + 0, 0, 495, 0, 4000, 8321, 0, 8, 0 + }, + { /* articulation 179 */ + { 32767, 32685, 13644, 29434 }, + { 32767, 32, 0, 0 }, + 12, 69, 494, 0, 2000, 11107, 0, 0, 0 + }, + { /* articulation 180 */ + { 9511, 31605, 0, 27897 }, + { 32767, 951, 0, 0 }, + 0, 0, 495, 0, 5000, 8321, 1, 0, 0 + }, + { /* articulation 181 */ + { 130, 32617, 0, 32350 }, + { 32767, 317, 0, 0 }, + 0, 69, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 182 */ + { 32767, 32593, 0, 32251 }, + { 1174, 20, 0, 0 }, + 0, 69, 495, 0, 3600, 7121, 0, 4, 0 + }, + { /* articulation 183 */ + { 32767, 32427, 0, 32427 }, + { 32767, 317, 0, 0 }, + 0, 69, 476, 0, 0, 0, 0, 0, 0 + }, + { /* articulation 184 */ + { 834, 32742, 19242, 31455 }, + { 32767, 148, 0, 0 }, + 0, 0, 778, 0, 3000, 9907, 0, 4, 0 + } +}; /*end Articulations */ + +/*---------------------------------------------------------------------------- + * Regions + *---------------------------------------------------------------------------- +*/ +const S_WT_REGION eas_regions[] = +{ + { { 0, 27, 27 }, -4068, 16422, 0, 0, 81, 0 }, /* region 0 */ + { { 0, 28, 28 }, -4768, 32767, 0, 0, 40, 0 }, /* region 1 */ + { { 0, 29, 29 }, -5753, 32767, 0, 0, 32, 1 }, /* region 2 */ + { { 0, 30, 30 }, -6053, 32767, 0, 0, 32, 2 }, /* region 3 */ + { { 0, 31, 31 }, -5068, 23197, 0, 0, 48, 3 }, /* region 4 */ + { { 1536, 32, 32 }, -4400, 20675, 0, 0, 137, 4 }, /* region 5 */ + { { 1537, 33, 33 }, -4903, 20675, 792, 879, 50, 5 }, /* region 6 */ + { { 1537, 34, 34 }, -5003, 16422, 792, 879, 50, 6 }, /* region 7 */ + { { 0, 35, 35 }, -6168, 32767, 0, 0, 83, 7 }, /* region 8 */ + { { 0, 36, 36 }, -6168, 32767, 0, 0, 83, 7 }, /* region 9 */ + { { 0, 37, 37 }, -5251, 18426, 0, 0, 53, 8 }, /* region 10 */ + { { 0, 38, 38 }, -5351, 23197, 0, 0, 16, 9 }, /* region 11 */ + { { 0, 39, 39 }, -4768, 32767, 0, 0, 40, 10 }, /* region 12 */ + { { 0, 40, 40 }, -5351, 23197, 0, 0, 16, 4 }, /* region 13 */ + { { 1, 41, 41 }, -7055, 26028, 798, 993, 45, 11 }, /* region 14 */ + { { 257, 42, 42 }, -5400, 26028, 4288, 7488, 7, 12 }, /* region 15 */ + { { 1, 43, 43 }, -6955, 26028, 798, 993, 45, 13 }, /* region 16 */ + { { 257, 44, 44 }, -5600, 26028, 4288, 7488, 7, 14 }, /* region 17 */ + { { 1, 45, 45 }, -6955, 26028, 798, 993, 45, 15 }, /* region 18 */ + { { 257, 46, 46 }, -5800, 26028, 4288, 7488, 7, 16 }, /* region 19 */ + { { 1, 47, 47 }, -6655, 26028, 798, 993, 45, 17 }, /* region 20 */ + { { 1, 48, 48 }, -6555, 26028, 798, 993, 45, 18 }, /* region 21 */ + { { 1, 49, 49 }, -6400, 16422, 1294, 5778, 8, 19 }, /* region 22 */ + { { 1, 50, 50 }, -6455, 26028, 798, 993, 45, 20 }, /* region 23 */ + { { 1, 51, 51 }, -6468, 16422, 6592, 9921, 6, 21 }, /* region 24 */ + { { 1, 52, 52 }, -6800, 32767, 1294, 5778, 8, 22 }, /* region 25 */ + { { 1, 53, 53 }, -6618, 14636, 6592, 9921, 6, 23 }, /* region 26 */ + { { 0, 54, 54 }, -6951, 26028, 0, 0, 39, 24 }, /* region 27 */ + { { 1, 55, 55 }, -6500, 32767, 1294, 5778, 8, 25 }, /* region 28 */ + { { 0, 56, 56 }, -8455, 32767, 0, 0, 90, 26 }, /* region 29 */ + { { 1, 57, 57 }, -6900, 32767, 1294, 5778, 8, 27 }, /* region 30 */ + { { 1, 58, 58 }, -8253, 23197, 0, 166, 113, 28 }, /* region 31 */ + { { 1, 59, 59 }, -7168, 16422, 6592, 9921, 6, 29 }, /* region 32 */ + { { 1, 60, 60 }, -7653, 23197, 432, 582, 63, 30 }, /* region 33 */ + { { 1, 61, 61 }, -8053, 16422, 432, 582, 63, 30 }, /* region 34 */ + { { 1, 62, 62 }, -8453, 20675, 432, 582, 63, 31 }, /* region 35 */ + { { 1, 63, 63 }, -8553, 23197, 432, 582, 63, 32 }, /* region 36 */ + { { 1, 64, 64 }, -9153, 23197, 432, 582, 63, 33 }, /* region 37 */ + { { 0, 65, 65 }, -8755, 32767, 0, 0, 14, 34 }, /* region 38 */ + { { 0, 66, 66 }, -9155, 20675, 0, 0, 14, 34 }, /* region 39 */ + { { 512, 67, 67 }, -8355, 18426, 0, 0, 90, 35 }, /* region 40 */ + { { 512, 68, 68 }, -8955, 18426, 0, 0, 90, 35 }, /* region 41 */ + { { 0, 69, 69 }, -8955, 32767, 0, 0, 86, 36 }, /* region 42 */ + { { 0, 70, 70 }, -8055, 21900, 0, 0, 86, 37 }, /* region 43 */ + { { 769, 71, 71 }, -7555, 23197, 0, 1226, 35, 38 }, /* region 44 */ + { { 769, 72, 72 }, -8155, 26028, 0, 1226, 35, 38 }, /* region 45 */ + { { 1024, 73, 73 }, -9155, 32767, 0, 0, 22, 39 }, /* region 46 */ + { { 1024, 74, 74 }, -9655, 32767, 0, 0, 22, 40 }, /* region 47 */ + { { 1, 75, 75 }, -9100, 23197, 0, 31, 139, 41 }, /* region 48 */ + { { 0, 76, 76 }, -11655, 23197, 0, 0, 134, 42 }, /* region 49 */ + { { 0, 77, 77 }, -11255, 23197, 0, 0, 134, 43 }, /* region 50 */ + { { 0, 78, 78 }, -10053, 16422, 0, 0, 89, 44 }, /* region 51 */ + { { 0, 79, 79 }, -11453, 16422, 0, 0, 89, 45 }, /* region 52 */ + { { 1281, 80, 80 }, -7500, 13045, 209, 230, 103, 46 }, /* region 53 */ + { { 1281, 81, 81 }, -7600, 16422, 209, 230, 103, 47 }, /* region 54 */ + { { 0, 82, 82 }, -9655, 20675, 0, 0, 87, 48 }, /* region 55 */ + { { 0, 83, 83 }, -10100, 32767, 0, 0, 13, 49 }, /* region 56 */ + { { 1, 84, 84 }, -9600, 23197, 0, 10294, 5, 50 }, /* region 57 */ + { { 0, 85, 85 }, -10855, 32767, 0, 0, 135, 4 }, /* region 58 */ + { { 0, 86, 86 }, -10268, 16422, 0, 0, 24, 51 }, /* region 59 */ + { { 32769, 87, 87 }, -10368, 32767, 1335, 1603, 24, 52 }, /* region 60 */ + { { 1, 12, 67 }, -7805, 23197, 437, 16584, 2, 48 }, /* region 61 */ + { { 1, 68, 73 }, -8396, 23197, 452, 16803, 0, 48 }, /* region 62 */ + { { 32769, 74, 108 }, -9667, 23197, 404, 16698, 1, 48 }, /* region 63 */ + { { 1, 12, 78 }, -7805, 16422, 437, 16584, 2, 48 }, /* region 64 */ + { { 1, 79, 91 }, -8396, 16422, 452, 16803, 0, 48 }, /* region 65 */ + { { 32769, 92, 108 }, -9667, 16422, 404, 16698, 1, 48 }, /* region 66 */ + { { 1, 12, 78 }, -7805, 16422, 437, 16584, 2, 48 }, /* region 67 */ + { { 1, 79, 91 }, -8396, 16422, 452, 16803, 0, 48 }, /* region 68 */ + { { 32769, 92, 108 }, -9667, 16422, 404, 16698, 1, 48 }, /* region 69 */ + { { 1, 12, 70 }, -7800, 23197, 437, 16584, 2, 48 }, /* region 70 */ + { { 1, 71, 88 }, -8391, 23197, 452, 16803, 0, 48 }, /* region 71 */ + { { 32769, 89, 108 }, -9662, 23197, 404, 16698, 1, 48 }, /* region 72 */ + { { 1, 12, 54 }, -7156, 13045, 639, 4368, 10, 48 }, /* region 73 */ + { { 32769, 55, 108 }, -7551, 18426, 702, 3112, 12, 48 }, /* region 74 */ + { { 1, 12, 66 }, -7811, 23197, 437, 16584, 2, 48 }, /* region 75 */ + { { 1, 67, 87 }, -8402, 23197, 452, 16803, 0, 48 }, /* region 76 */ + { { 32769, 88, 108 }, -9673, 16422, 404, 16698, 1, 48 }, /* region 77 */ + { { 1, 12, 43 }, -4255, 23197, 920, 1383, 30, 59 }, /* region 78 */ + { { 32769, 44, 96 }, -6260, 18426, 885, 1176, 37, 59 }, /* region 79 */ + { { 1, 12, 48 }, -4661, 18426, 1148, 1514, 26, 60 }, /* region 80 */ + { { 32769, 49, 96 }, -7453, 16422, 1347, 1420, 29, 60 }, /* region 81 */ + { { 1, 33, 56 }, -6800, 26028, 1064, 1170, 38, 61 }, /* region 82 */ + { { 1, 57, 72 }, -7200, 26028, 930, 1014, 44, 61 }, /* region 83 */ + { { 32769, 73, 108 }, -8800, 26028, 726, 826, 52, 61 }, /* region 84 */ + { { 1, 36, 96 }, -8800, 20675, 635, 735, 58, 62 }, /* region 85 */ + { { 32769, 97, 108 }, -11308, 13045, 0, 31, 139, 62 }, /* region 86 */ + { { 1, 36, 96 }, -8800, 14636, 635, 735, 58, 0 }, /* region 87 */ + { { 32769, 97, 108 }, -11308, 13045, 0, 31, 139, 0 }, /* region 88 */ + { { 1, 36, 83 }, -7206, 13045, 838, 922, 47, 63 }, /* region 89 */ + { { 1, 84, 93 }, -9606, 14636, 209, 230, 103, 63 }, /* region 90 */ + { { 32769, 94, 108 }, -11308, 13045, 0, 31, 139, 63 }, /* region 91 */ + { { 1, 36, 83 }, -7206, 13045, 838, 922, 47, 64 }, /* region 92 */ + { { 1, 84, 93 }, -9606, 13045, 209, 230, 103, 64 }, /* region 93 */ + { { 32769, 94, 108 }, -11308, 13045, 0, 31, 139, 64 }, /* region 94 */ + { { 1, 21, 56 }, -6795, 23197, 1064, 1170, 38, 65 }, /* region 95 */ + { { 1, 57, 72 }, -7195, 23197, 930, 1014, 44, 65 }, /* region 96 */ + { { 32769, 73, 108 }, -8798, 23197, 726, 826, 52, 65 }, /* region 97 */ + { { 1, 12, 83 }, -7206, 16422, 838, 922, 47, 66 }, /* region 98 */ + { { 1, 84, 93 }, -9606, 16422, 209, 230, 103, 66 }, /* region 99 */ + { { 32769, 94, 108 }, -11308, 16422, 0, 31, 139, 66 }, /* region 100 */ + { { 1, 24, 83 }, -7206, 16422, 838, 922, 47, 67 }, /* region 101 */ + { { 1, 84, 93 }, -9606, 16422, 209, 230, 103, 67 }, /* region 102 */ + { { 32769, 94, 108 }, -11308, 16422, 0, 31, 139, 67 }, /* region 103 */ + { { 1, 12, 83 }, -7220, 16422, 0, 83, 126, 68 }, /* region 104 */ + { { 1, 84, 90 }, -9682, 16422, 0, 20, 145, 68 }, /* region 105 */ + { { 32769, 91, 108 }, -10301, 16422, 6, 20, 147, 68 }, /* region 106 */ + { { 1, 21, 75 }, -8441, 16422, 419, 460, 76, 69 }, /* region 107 */ + { { 32769, 76, 108 }, -10890, 14636, 254, 264, 101, 69 }, /* region 108 */ + { { 32769, 36, 84 }, -8955, 16422, 0, 2775, 17, 70 }, /* region 109 */ + { { 32769, 12, 108 }, -7855, 23197, 30, 276, 100, 71 }, /* region 110 */ + { { 0, 12, 60 }, -9114, 26028, 0, 0, 15, 72 }, /* region 111 */ + { { 32768, 61, 96 }, -9114, 26028, 0, 0, 15, 73 }, /* region 112 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 74 }, /* region 113 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 74 }, /* region 114 */ + { { 1, 12, 35 }, -6555, 16422, 2869, 3778, 11, 75 }, /* region 115 */ + { { 1, 36, 48 }, -7755, 20675, 2869, 3778, 11, 75 }, /* region 116 */ + { { 32769, 49, 72 }, -7755, 20675, 2869, 3778, 11, 76 }, /* region 117 */ + { { 1, 16, 55 }, -7424, 20675, 1045, 1119, 41, 77 }, /* region 118 */ + { { 32769, 56, 96 }, -7918, 20675, 907, 963, 46, 77 }, /* region 119 */ + { { 1, 16, 53 }, -7194, 29204, 1140, 1479, 27, 78 }, /* region 120 */ + { { 1, 54, 70 }, -8371, 29204, 726, 812, 55, 78 }, /* region 121 */ + { { 32769, 71, 108 }, -8988, 29204, 718, 748, 56, 78 }, /* region 122 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 79 }, /* region 123 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 79 }, /* region 124 */ + { { 1, 16, 54 }, -6927, 20675, 5362, 5461, 9, 80 }, /* region 125 */ + { { 1, 55, 63 }, -7051, 26028, 1362, 1454, 28, 80 }, /* region 126 */ + { { 32769, 64, 108 }, -7944, 16422, 311, 366, 88, 80 }, /* region 127 */ + { { 1, 16, 48 }, -5998, 20675, 1132, 1301, 31, 81 }, /* region 128 */ + { { 32769, 49, 108 }, -7188, 20675, 1099, 1184, 36, 81 }, /* region 129 */ + { { 1, 21, 68 }, -9658, 20675, 87, 2170, 18, 82 }, /* region 130 */ + { { 1, 69, 82 }, -10160, 20675, 120, 2167, 19, 82 }, /* region 131 */ + { { 32769, 83, 108 }, -11360, 20675, 376, 2041, 20, 82 }, /* region 132 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 83 }, /* region 133 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 83 }, /* region 134 */ + { { 32769, 55, 108 }, -8568, 20675, 0, 477, 75, 84 }, /* region 135 */ + { { 32769, 36, 96 }, -8100, 14636, 101, 151, 116, 85 }, /* region 136 */ + { { 1, 24, 83 }, -7220, 13045, 0, 83, 126, 86 }, /* region 137 */ + { { 1, 84, 90 }, -9682, 13045, 0, 20, 145, 86 }, /* region 138 */ + { { 32769, 91, 108 }, -10301, 13045, 6, 20, 147, 86 }, /* region 139 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 87 }, /* region 140 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 87 }, /* region 141 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 88 }, /* region 142 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 88 }, /* region 143 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 89 }, /* region 144 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 89 }, /* region 145 */ + { { 1, 24, 83 }, -7220, 13045, 0, 83, 126, 90 }, /* region 146 */ + { { 1, 84, 90 }, -9682, 13045, 0, 20, 145, 90 }, /* region 147 */ + { { 32769, 91, 108 }, -10301, 13045, 6, 20, 147, 90 }, /* region 148 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 91 }, /* region 149 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 91 }, /* region 150 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 92 }, /* region 151 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 92 }, /* region 152 */ + { { 1, 12, 62 }, -8253, 16422, 23, 10953, 4, 93 }, /* region 153 */ + { { 32769, 63, 108 }, -8955, 20675, 11, 11753, 3, 93 }, /* region 154 */ + { { 1, 12, 62 }, -8253, 16422, 23, 10953, 4, 94 }, /* region 155 */ + { { 32769, 63, 108 }, -8955, 16422, 11, 11753, 3, 94 }, /* region 156 */ + { { 1, 24, 79 }, -7220, 13045, 0, 83, 126, 95 }, /* region 157 */ + { { 1, 80, 90 }, -9682, 13045, 0, 20, 145, 95 }, /* region 158 */ + { { 32769, 91, 108 }, -10301, 13045, 6, 20, 147, 95 }, /* region 159 */ + { { 1, 12, 65 }, -8253, 13045, 23, 10953, 4, 96 }, /* region 160 */ + { { 32769, 66, 108 }, -8955, 16422, 11, 11753, 3, 96 }, /* region 161 */ + { { 32768, 36, 84 }, -8700, 20675, 0, 0, 25, 97 }, /* region 162 */ + { { 32769, 36, 96 }, -10055, 20675, 1482, 1613, 23, 98 }, /* region 163 */ + { { 32769, 12, 96 }, -5566, 32767, 818, 1033, 42, 99 }, /* region 164 */ + { { 32769, 36, 84 }, -9768, 18426, 0, 293, 98, 100 }, /* region 165 */ + { { 32769, 12, 96 }, -7220, 26028, 0, 83, 125, 101 }, /* region 166 */ + { { 32769, 12, 96 }, -7220, 20675, 0, 83, 125, 102 }, /* region 167 */ + { { 1, 12, 83 }, -7220, 13045, 0, 83, 125, 104 }, /* region 168 */ + { { 1, 84, 90 }, -9682, 13045, 0, 20, 146, 104 }, /* region 169 */ + { { 32769, 91, 108 }, -10301, 13045, 6, 20, 148, 104 }, /* region 170 */ + { { 32769, 36, 108 }, -9770, 32767, 472, 491, 74, 105 }, /* region 171 */ + { { 32769, 36, 108 }, -9770, 20675, 472, 491, 74, 106 }, /* region 172 */ + { { 1, 12, 72 }, -7212, 7336, 2, 86, 124, 107 }, /* region 173 */ + { { 1, 73, 101 }, -9700, 8231, 2, 22, 143, 107 }, /* region 174 */ + { { 32769, 102, 108 }, -10883, 20675, 173, 183, 110, 107 }, /* region 175 */ + { { 1, 21, 96 }, -8968, 13045, 477, 507, 73, 108 }, /* region 176 */ + { { 32769, 97, 108 }, -10883, 13045, 173, 183, 110, 109 }, /* region 177 */ + { { 32769, 12, 108 }, -8971, 16422, 477, 507, 73, 110 }, /* region 178 */ + { { 1, 12, 53 }, -6171, 16422, 388, 541, 68, 111 }, /* region 179 */ + { { 32769, 54, 60 }, -7149, 11626, 473, 560, 65, 111 }, /* region 180 */ + { { 32769, 36, 72 }, -7149, 16422, 473, 560, 65, 112 }, /* region 181 */ + { { 1, 48, 58 }, -8253, 16422, 356, 402, 82, 113 }, /* region 182 */ + { { 1, 59, 65 }, -8774, 16422, 514, 548, 67, 113 }, /* region 183 */ + { { 1, 66, 78 }, -9374, 16422, 505, 529, 71, 113 }, /* region 184 */ + { { 32769, 79, 96 }, -10433, 16422, 178, 191, 109, 113 }, /* region 185 */ + { { 1, 55, 60 }, -8253, 16422, 356, 402, 82, 114 }, /* region 186 */ + { { 1, 61, 69 }, -8774, 16422, 514, 548, 67, 114 }, /* region 187 */ + { { 1, 70, 79 }, -9374, 16422, 505, 529, 71, 114 }, /* region 188 */ + { { 32769, 80, 108 }, -10433, 16422, 178, 191, 109, 114 }, /* region 189 */ + { { 1, 16, 82 }, -9229, 23197, 180, 206, 106, 115 }, /* region 190 */ + { { 32769, 83, 108 }, -8440, 18426, 3, 44, 131, 115 }, /* region 191 */ + { { 32769, 21, 108 }, -10069, 20675, 483, 515, 72, 116 }, /* region 192 */ + { { 1, 21, 89 }, -8405, 18426, 3, 45, 130, 117 }, /* region 193 */ + { { 32769, 90, 108 }, -10301, 10362, 6, 20, 148, 117 }, /* region 194 */ + { { 1, 21, 42 }, -5886, 20675, 0, 180, 111, 118 }, /* region 195 */ + { { 1, 43, 51 }, -6486, 23197, 0, 127, 120, 118 }, /* region 196 */ + { { 1, 52, 58 }, -7492, 26028, 0, 71, 127, 118 }, /* region 197 */ + { { 1, 59, 68 }, -8668, 23197, 0, 36, 136, 118 }, /* region 198 */ + { { 32769, 69, 108 }, -9774, 20675, 0, 19, 149, 118 }, /* region 199 */ + { { 1, 21, 89 }, -8399, 20675, 3, 45, 130, 119 }, /* region 200 */ + { { 32769, 90, 108 }, -10301, 14636, 6, 20, 148, 119 }, /* region 201 */ + { { 1, 21, 46 }, -6851, 26028, 236, 340, 92, 120 }, /* region 202 */ + { { 1, 47, 71 }, -7763, 20675, 824, 885, 49, 120 }, /* region 203 */ + { { 1, 72, 88 }, -9107, 18426, 719, 747, 57, 120 }, /* region 204 */ + { { 1, 89, 93 }, -10076, 16422, 83, 99, 122, 120 }, /* region 205 */ + { { 32769, 94, 108 }, -10889, 16422, 173, 183, 110, 120 }, /* region 206 */ + { { 1, 60, 71 }, -8405, 16422, 0, 42, 132, 121 }, /* region 207 */ + { { 1, 72, 78 }, -9103, 16422, 0, 28, 141, 121 }, /* region 208 */ + { { 32769, 79, 96 }, -9605, 16422, 0, 21, 144, 121 }, /* region 209 */ + { { 1, 48, 65 }, -7516, 11626, 0, 70, 128, 122 }, /* region 210 */ + { { 1, 66, 79 }, -8924, 14636, 0, 31, 138, 122 }, /* region 211 */ + { { 32769, 80, 96 }, -9230, 11626, 0, 26, 142, 122 }, /* region 212 */ + { { 1, 16, 44 }, -7068, 14636, 163, 254, 102, 123 }, /* region 213 */ + { { 1, 45, 51 }, -7618, 16422, 261, 393, 85, 123 }, /* region 214 */ + { { 1, 52, 58 }, -8533, 18426, 190, 229, 104, 123 }, /* region 215 */ + { { 1, 59, 66 }, -9300, 18426, 168, 193, 108, 123 }, /* region 216 */ + { { 1, 67, 70 }, -9776, 18426, 138, 157, 115, 123 }, /* region 217 */ + { { 1, 71, 80 }, -10303, 18426, 166, 180, 112, 123 }, /* region 218 */ + { { 32769, 81, 108 }, -11274, 18426, 135, 151, 117, 123 }, /* region 219 */ + { { 32769, 12, 96 }, -6204, 23197, 570, 719, 59, 124 }, /* region 220 */ + { { 1, 12, 48 }, -7068, 14636, 163, 254, 102, 125 }, /* region 221 */ + { { 1, 49, 54 }, -7618, 16422, 261, 393, 85, 125 }, /* region 222 */ + { { 1, 55, 63 }, -8533, 18426, 190, 229, 104, 125 }, /* region 223 */ + { { 1, 64, 70 }, -9300, 18426, 168, 193, 108, 125 }, /* region 224 */ + { { 1, 71, 75 }, -9776, 18426, 138, 157, 115, 125 }, /* region 225 */ + { { 1, 76, 82 }, -10303, 18426, 166, 180, 112, 125 }, /* region 226 */ + { { 32769, 83, 108 }, -11274, 18426, 135, 151, 117, 125 }, /* region 227 */ + { { 32770, 36, 84 }, -8400, 29204, 0, 0, 0, 126 }, /* region 228 */ + { { 32770, 36, 84 }, -8800, 8231, 0, 0, 0, 127 }, /* region 229 */ + { { 32770, 36, 84 }, -8400, 20675, 0, 0, 0, 128 }, /* region 230 */ + { { 32769, 36, 84 }, -7200, -24285, 1294, 5778, 8, 129 }, /* region 231 */ + { { 32769, 36, 84 }, -7755, 29204, 798, 993, 45, 130 }, /* region 232 */ + { { 32769, 36, 84 }, -8055, 20675, 798, 993, 45, 131 }, /* region 233 */ + { { 32769, 36, 84 }, -8955, 29204, 798, 993, 45, 132 }, /* region 234 */ + { { 32768, 36, 84 }, -9355, 32767, 0, 0, 133, 133 }, /* region 235 */ + { { 32768, 36, 84 }, -7755, 20675, 0, 0, 91, 134 }, /* region 236 */ + { { 1, 24, 62 }, -8200, 23197, 286, 333, 94, 135 }, /* region 237 */ + { { 1, 63, 66 }, -8564, 26028, 297, 335, 93, 135 }, /* region 238 */ + { { 1, 67, 72 }, -8922, 23197, 368, 399, 84, 135 }, /* region 239 */ + { { 32769, 73, 96 }, -9510, 23197, 116, 138, 119, 135 }, /* region 240 */ + { { 1, 24, 48 }, -6341, 23197, 309, 447, 77, 136 }, /* region 241 */ + { { 1, 49, 56 }, -7466, 26028, 211, 283, 99, 136 }, /* region 242 */ + { { 1, 57, 63 }, -8200, 26028, 286, 333, 94, 136 }, /* region 243 */ + { { 32769, 64, 84 }, -8922, 23197, 368, 399, 84, 136 }, /* region 244 */ + { { 1, 24, 56 }, -7466, 29204, 211, 283, 99, 137 }, /* region 245 */ + { { 1, 57, 63 }, -8200, 29204, 286, 333, 94, 137 }, /* region 246 */ + { { 1, 64, 69 }, -8922, 29204, 368, 399, 84, 137 }, /* region 247 */ + { { 32769, 70, 96 }, -9510, 29204, 116, 138, 119, 137 }, /* region 248 */ + { { 1, 24, 68 }, -8922, 18426, 368, 399, 84, 138 }, /* region 249 */ + { { 1, 69, 76 }, -9510, 26028, 116, 138, 119, 138 }, /* region 250 */ + { { 32769, 77, 108 }, -9958, 23197, 127, 144, 118, 138 }, /* region 251 */ + { { 1, 24, 82 }, -8813, 23197, 389, 422, 80, 139 }, /* region 252 */ + { { 32769, 83, 108 }, -9964, 26028, 146, 163, 114, 139 }, /* region 253 */ + { { 1, 12, 58 }, -8098, 29204, 386, 436, 78, 140 }, /* region 254 */ + { { 32769, 59, 96 }, -8571, 26028, 290, 328, 95, 140 }, /* region 255 */ + { { 1, 12, 58 }, -8098, 16422, 386, 436, 78, 141 }, /* region 256 */ + { { 32769, 59, 96 }, -8571, 18426, 290, 328, 95, 141 }, /* region 257 */ + { { 1, 12, 48 }, -8098, -28771, 386, 436, 78, 142 }, /* region 258 */ + { { 32769, 49, 84 }, -8571, 29204, 290, 328, 95, 142 }, /* region 259 */ + { { 1, 12, 60 }, -6653, 20675, 314, 430, 79, 143 }, /* region 260 */ + { { 32769, 61, 84 }, -7753, 18426, 263, 324, 96, 143 }, /* region 261 */ + { { 1, 24, 60 }, -7753, 16422, 263, 324, 96, 144 }, /* region 262 */ + { { 1, 61, 70 }, -8869, 20675, 279, 311, 97, 144 }, /* region 263 */ + { { 32769, 71, 96 }, -9298, 23197, 179, 204, 107, 144 }, /* region 264 */ + { { 1, 24, 84 }, -9683, 20675, 191, 211, 105, 145 }, /* region 265 */ + { { 32769, 85, 108 }, -10883, 20675, 92, 102, 121, 145 }, /* region 266 */ + { { 1, 21, 69 }, -7753, 13045, 263, 324, 96, 146 }, /* region 267 */ + { { 1, 70, 94 }, -8869, 20675, 279, 311, 97, 146 }, /* region 268 */ + { { 1, 95, 96 }, -9298, -24285, 179, 204, 107, 146 }, /* region 269 */ + { { 32769, 97, 108 }, -10883, -24285, 173, 183, 110, 146 }, /* region 270 */ + { { 1, 16, 55 }, -9300, 20675, 168, 193, 108, 147 }, /* region 271 */ + { { 1, 56, 74 }, -9776, 26028, 138, 157, 115, 147 }, /* region 272 */ + { { 32769, 75, 96 }, -11274, 26028, 135, 151, 117, 147 }, /* region 273 */ + { { 1, 24, 72 }, -9298, 26028, 179, 204, 107, 148 }, /* region 274 */ + { { 1, 73, 85 }, -9683, 20675, 191, 211, 105, 148 }, /* region 275 */ + { { 32769, 86, 108 }, -10883, 18426, 92, 102, 121, 148 }, /* region 276 */ + { { 32769, 36, 108 }, -8930, 18426, 1839, 1901, 21, 149 }, /* region 277 */ + { { 32769, 24, 108 }, -8473, 20675, 494, 534, 69, 150 }, /* region 278 */ + { { 32769, 12, 108 }, -8473, 20675, 494, 534, 69, 151 }, /* region 279 */ + { { 32769, 24, 108 }, -8473, 20675, 494, 534, 69, 152 }, /* region 280 */ + { { 1, 36, 60 }, -6100, 5193, 2, 22, 143, 153 }, /* region 281 */ + { { 32769, 61, 84 }, -7283, 20675, 173, 183, 110, 153 }, /* region 282 */ + { { 32769, 24, 96 }, -7753, 14636, 263, 324, 96, 154 }, /* region 283 */ + { { 32769, 36, 96 }, -8930, 26028, 1839, 1901, 21, 155 }, /* region 284 */ + { { 32769, 24, 108 }, -8473, 20675, 494, 534, 69, 156 }, /* region 285 */ + { { 1, 24, 58 }, -9051, 14636, 0, 29, 140, 157 }, /* region 286 */ + { { 32769, 59, 96 }, -9051, 14636, 0, 29, 140, 157 }, /* region 287 */ + { { 1, 12, 83 }, -7220, 13045, 0, 83, 125, 158 }, /* region 288 */ + { { 1, 84, 90 }, -9682, 13045, 0, 20, 146, 158 }, /* region 289 */ + { { 32769, 91, 108 }, -10301, 13045, 6, 20, 148, 158 }, /* region 290 */ + { { 1, 21, 42 }, -5863, 26028, 1047, 1229, 34, 159 }, /* region 291 */ + { { 1, 43, 48 }, -6656, 29204, 1138, 1253, 33, 159 }, /* region 292 */ + { { 1, 49, 53 }, -7045, 26028, 559, 651, 60, 159 }, /* region 293 */ + { { 1, 54, 60 }, -7932, 26028, 508, 563, 64, 159 }, /* region 294 */ + { { 1, 61, 65 }, -8280, 32767, 819, 864, 51, 159 }, /* region 295 */ + { { 1, 66, 70 }, -8066, 26942, 981, 1032, 43, 159 }, /* region 296 */ + { { 1, 71, 76 }, -9366, 26028, 790, 814, 54, 159 }, /* region 297 */ + { { 1, 77, 82 }, -9966, 26028, 592, 609, 61, 159 }, /* region 298 */ + { { 1, 83, 87 }, -10717, 23197, 543, 554, 66, 159 }, /* region 299 */ + { { 1, 88, 96 }, -11271, 18426, 601, 609, 62, 159 }, /* region 300 */ + { { 32769, 97, 108 }, -11766, 18426, 523, 529, 70, 159 }, /* region 301 */ + { { 1, 48, 69 }, -7513, 14636, 0, 70, 128, 160 }, /* region 302 */ + { { 1, 70, 79 }, -8924, 18426, 0, 31, 138, 160 }, /* region 303 */ + { { 32769, 80, 96 }, -9230, 14636, 0, 26, 142, 160 }, /* region 304 */ + { { 1, 36, 72 }, -8334, 29204, 0, 87, 123, 161 }, /* region 305 */ + { { 32769, 73, 96 }, -9160, 29204, 0, 54, 129, 161 }, /* region 306 */ + { { 32769, 36, 96 }, -8930, 26028, 1839, 1901, 21, 162 }, /* region 307 */ + { { 32769, 12, 96 }, -5572, 32767, 818, 1033, 42, 163 }, /* region 308 */ + { { 32769, 36, 108 }, -9770, 26028, 472, 491, 74, 164 }, /* region 309 */ + { { 32769, 12, 96 }, -6204, 29204, 570, 719, 59, 165 }, /* region 310 */ + { { 1, 12, 83 }, -7220, 13045, 0, 83, 125, 166 }, /* region 311 */ + { { 1, 84, 90 }, -9682, 13045, 0, 20, 146, 166 }, /* region 312 */ + { { 32769, 91, 108 }, -10301, 13045, 6, 20, 148, 166 }, /* region 313 */ + { { 1, 21, 46 }, -6851, 32767, 236, 340, 92, 167 }, /* region 314 */ + { { 1, 47, 75 }, -7763, 26028, 824, 885, 49, 167 }, /* region 315 */ + { { 1, 76, 84 }, -9107, 23197, 719, 747, 57, 167 }, /* region 316 */ + { { 1, 85, 93 }, -10076, 20675, 83, 99, 122, 167 }, /* region 317 */ + { { 32769, 94, 108 }, -10889, 20675, 173, 183, 110, 167 }, /* region 318 */ + { { 1, 21, 46 }, -6851, 26028, 236, 340, 92, 168 }, /* region 319 */ + { { 1, 47, 71 }, -7763, 20675, 824, 885, 49, 168 }, /* region 320 */ + { { 1, 72, 88 }, -9107, 18426, 719, 747, 57, 168 }, /* region 321 */ + { { 1, 89, 93 }, -10076, 16422, 83, 99, 122, 168 }, /* region 322 */ + { { 32769, 94, 108 }, -10889, 16422, 173, 183, 110, 168 }, /* region 323 */ + { { 1, 21, 45 }, -5863, 26028, 1047, 1229, 34, 169 }, /* region 324 */ + { { 1, 46, 51 }, -6656, 29204, 1138, 1253, 33, 169 }, /* region 325 */ + { { 1, 52, 54 }, -7045, 26028, 559, 651, 60, 169 }, /* region 326 */ + { { 1, 55, 63 }, -7932, 26028, 508, 563, 64, 169 }, /* region 327 */ + { { 1, 64, 68 }, -8280, 32767, 819, 864, 51, 169 }, /* region 328 */ + { { 1, 69, 73 }, -8066, 26942, 981, 1032, 43, 169 }, /* region 329 */ + { { 1, 74, 79 }, -9366, 26028, 790, 814, 54, 169 }, /* region 330 */ + { { 1, 80, 88 }, -9966, 23197, 592, 609, 61, 169 }, /* region 331 */ + { { 1, 89, 99 }, -11271, 18426, 601, 609, 62, 169 }, /* region 332 */ + { { 32769, 100, 108 }, -11766, 18426, 523, 529, 70, 169 }, /* region 333 */ + { { 1, 21, 45 }, -5863, 26028, 1047, 1229, 34, 170 }, /* region 334 */ + { { 1, 46, 51 }, -6656, 29204, 1138, 1253, 33, 170 }, /* region 335 */ + { { 1, 52, 54 }, -7045, 26028, 559, 651, 60, 170 }, /* region 336 */ + { { 1, 55, 63 }, -7932, 26028, 508, 563, 64, 170 }, /* region 337 */ + { { 1, 64, 68 }, -8280, 32767, 819, 864, 51, 170 }, /* region 338 */ + { { 1, 69, 73 }, -8066, 26942, 981, 1032, 43, 170 }, /* region 339 */ + { { 1, 74, 79 }, -9366, 26028, 790, 814, 54, 170 }, /* region 340 */ + { { 1, 80, 88 }, -9966, 23197, 592, 609, 61, 170 }, /* region 341 */ + { { 1, 89, 99 }, -11271, 18426, 601, 609, 62, 171 }, /* region 342 */ + { { 32769, 100, 108 }, -11766, 18426, 523, 529, 70, 172 }, /* region 343 */ + { { 32769, 36, 108 }, -9770, 20675, 472, 491, 74, 173 }, /* region 344 */ + { { 32769, 12, 108 }, -8930, 20675, 1839, 1901, 21, 174 }, /* region 345 */ + { { 1, 12, 44 }, -7068, 18426, 163, 254, 102, 175 }, /* region 346 */ + { { 1, 45, 51 }, -7618, 20675, 261, 393, 85, 175 }, /* region 347 */ + { { 1, 52, 58 }, -8533, 23197, 190, 229, 104, 175 }, /* region 348 */ + { { 1, 59, 66 }, -9300, 23197, 168, 193, 108, 175 }, /* region 349 */ + { { 1, 67, 70 }, -9776, 23197, 138, 157, 115, 175 }, /* region 350 */ + { { 1, 71, 80 }, -10303, 23197, 166, 180, 112, 175 }, /* region 351 */ + { { 32769, 81, 108 }, -11274, 23197, 135, 151, 117, 175 }, /* region 352 */ + { { 1, 12, 65 }, -8253, 16422, 23, 10953, 4, 176 }, /* region 353 */ + { { 32769, 66, 108 }, -8955, 20675, 11, 11753, 3, 176 }, /* region 354 */ + { { 1, 12, 48 }, -5998, 29204, 1132, 1301, 31, 177 }, /* region 355 */ + { { 32769, 49, 108 }, -7188, 29204, 1099, 1184, 36, 177 }, /* region 356 */ + { { 1, 12, 83 }, -8441, 20675, 419, 460, 76, 178 }, /* region 357 */ + { { 32769, 84, 108 }, -11323, 20675, 0, 31, 139, 178 }, /* region 358 */ + { { 1, 55, 60 }, -8253, 18426, 356, 402, 82, 179 }, /* region 359 */ + { { 1, 61, 69 }, -8774, 18426, 514, 548, 67, 179 }, /* region 360 */ + { { 1, 70, 79 }, -9374, 18426, 505, 529, 71, 179 }, /* region 361 */ + { { 32769, 80, 108 }, -10433, 23197, 178, 191, 109, 179 }, /* region 362 */ + { { 32769, 36, 96 }, -8930, -24285, 1839, 1901, 21, 180 }, /* region 363 */ + { { 1, 12, 83 }, -7206, 16422, 838, 922, 47, 181 }, /* region 364 */ + { { 1, 84, 93 }, -9606, 18426, 209, 230, 103, 181 }, /* region 365 */ + { { 32769, 94, 108 }, -11308, 16422, 0, 31, 139, 181 }, /* region 366 */ + { { 1, 12, 56 }, -6795, 23197, 1064, 1170, 38, 182 }, /* region 367 */ + { { 1, 57, 72 }, -7195, 23197, 930, 1014, 44, 182 }, /* region 368 */ + { { 32769, 73, 108 }, -8798, 23197, 726, 826, 52, 182 }, /* region 369 */ + { { 32769, 24, 108 }, -8800, 23197, 635, 735, 58, 62 }, /* region 370 */ + { { 1, 36, 83 }, -7206, 13045, 838, 922, 47, 183 }, /* region 371 */ + { { 1, 84, 93 }, -9606, 13045, 209, 230, 103, 183 }, /* region 372 */ + { { 32769, 94, 108 }, -11308, 13045, 0, 31, 139, 183 }, /* region 373 */ + { { 1, 12, 66 }, -7811, 23197, 437, 16584, 2, 184 }, /* region 374 */ + { { 1, 67, 87 }, -8402, 23197, 452, 16803, 0, 184 }, /* region 375 */ + { { 32769, 88, 108 }, -9673, 16422, 404, 16698, 1, 184 } /* region 376 */ +}; /* end Regions */ + +/*---------------------------------------------------------------------------- + * Programs + *---------------------------------------------------------------------------- +*/ +const S_PROGRAM eas_programs[] = +{ + { 7864320, 0 } /* program 0 */ +}; /* end Programs */ + +/*---------------------------------------------------------------------------- + * Banks + *---------------------------------------------------------------------------- +*/ +const S_BANK eas_banks[] = +{ + { /* bank 0 */ + 30976, + { + 291, 324, 314, 334, 202, 319, 95, 195, + 107, 92, 371, 89, 87, 85, 135, 82, + 200, 192, 130, 267, 193, 302, 207, 210, + 128, 125, 190, 120, 118, 213, 221, 271, + 80, 78, 308, 164, 220, 310, 166, 167, + 186, 182, 181, 179, 160, 178, 176, 115, + 155, 153, 151, 149, 75, 73, 374, 111, + 252, 254, 258, 305, 256, 157, 146, 137, + 249, 237, 245, 241, 274, 262, 260, 265, + 172, 171, 309, 277, 284, 307, 136, 344, + 173, 168, 345, 353, 346, 70, 110, 311, + 357, 144, 104, 67, 364, 367, 64, 288, + 142, 140, 98, 355, 133, 123, 61, 113, + 285, 280, 279, 278, 370, 286, 359, 283, + 101, 236, 163, 235, 234, 233, 232, 231, + 162, 363, 230, 281, 165, 229, 109, 228 + } + } +}; /* end Banks */ + +/*---------------------------------------------------------------------------- + * Samples + *---------------------------------------------------------------------------- +*/ + +const EAS_SAMPLE eas_samples[] = +{ + 0, 0, -3, -4, -6, -8, -10, -12, -12, -11, -8, -3, 3, 7, 10, 14, + 16, 16, 15, 12, 9, 4, -4, -12, -18, -21, -21, -19, -18, -15, -10, -3, + 10, 20, 34, 44, 51, 52, 48, 43, 38, 26, 8, -15, -37, -52, -61, -64, + -66, -64, -59, -47, -31, -13, 4, 18, 30, 37, 40, 36, 30, 24, 19, 11, + -2, -17, -24, -28, -28, -21, -18, -16, -10, -3, 12, 27, 39, 49, 53, 53, + 50, 43, 37, 25, 11, -11, -31, -46, -57, -63, -66, -63, -57, -46, -34, -19, + -3, 13, 27, 35, 39, 37, 32, 26, 20, 11, 0, -13, -20, -24, -25, -21, + -19, -14, -8, -2, 9, 23, 37, 47, 53, 52, 49, 42, 35, 25, 13, -6, + -28, -48, -60, -67, -67, -64, -60, -51, -39, -23, -7, 10, 23, 35, 39, 38, + 32, 26, 21, 15, 4, -9, -20, -22, -21, -19, -14, -11, -5, 1, 9, 19, + 31, 45, 51, 52, 47, 39, 35, 25, 15, -3, -23, -42, -58, -70, -71, -66, + -60, -51, -43, -30, -13, 6, 22, 32, 40, 40, 38, 33, 27, 19, 9, -5, + -17, -25, -26, -22, -16, -11, -8, -4, 7, 21, 35, 48, 53, 56, 50, 43, + 34, 22, 13, -2, -22, -44, -63, -75, -76, -69, -61, -51, -43, -29, -13, 6, + 23, 32, 41, 43, 41, 37, 26, 18, 7, -8, -19, -25, -25, -22, -15, -9, + -5, 0, 10, 24, 37, 44, 48, 52, 52, 46, 33, 20, 8, -5, -20, -38, + -59, -74, -79, -73, -67, -55, -43, -26, -11, 4, 18, 29, 41, 45, 45, 38, + 29, 21, 11, -3, -15, -25, -27, -22, -16, -11, -8, 0, 10, 25, 38, 44, + 47, 50, 53, 49, 37, 20, 7, -5, -17, -34, -58, -74, -82, -76, -67, -59, + -47, -29, -12, 3, 14, 25, 38, 50, 52, 46, 33, 23, 14, 3, -11, -25, + -28, -27, -21, -16, -13, -7, 8, 27, 41, 44, 45, 47, 54, 55, 44, 25, + 7, -7, -18, -32, -53, -71, -81, -81, -72, -67, -55, -37, -16, 3, 15, 23, + 34, 48, 57, 56, 44, 30, 19, 5, -12, -26, -33, -31, -25, -19, -16, -11, + 7, 25, 45, 49, 49, 52, 57, 59, 48, 32, 11, -5, -22, -39, -56, -73, + -82, -88, -84, -75, -60, -38, -16, 5, 21, 30, 39, 52, 59, 61, 53, 37, + 22, 7, -12, -28, -35, -36, -30, -22, -19, -16, -2, 21, 41, 52, 51, 52, + 57, 62, 54, 40, 18, -2, -18, -36, -54, -70, -80, -86, -87, -81, -69, -48, + -23, 0, 18, 28, 35, 45, 57, 64, 59, 46, 27, 9, -11, -24, -30, -32, + -29, -25, -20, -16, -5, 15, 36, 47, 50, 49, 53, 57, 54, 43, 24, 5, + -14, -32, -50, -65, -75, -82, -86, -86, -77, -58, -32, -8, 14, 25, 30, 41, + 56, 69, 69, 57, 36, 17, -4, -20, -29, -32, -27, -28, -27, -23, -13, 10, + 33, 46, 50, 48, 50, 54, 55, 48, 34, 16, -6, -29, -50, -68, -75, -78, + -82, -86, -84, -72, -47, -16, 11, 28, 34, 41, 51, 64, 70, 64, 49, 27, + 5, -17, -30, -33, -29, -29, -30, -30, -22, -2, 23, 41, 49, 51, 51, 54, + 56, 50, 42, 25, 4, -20, -44, -62, -70, -76, -83, -87, -89, -78, -56, -29, + 0, 19, 31, 38, 48, 63, 72, 71, 60, 40, 14, -12, -25, -29, -26, -27, + -33, -37, -30, -12, 11, 31, 41, 48, 51, 53, 55, 55, 51, 39, 17, -12, + -38, -58, -67, -74, -82, -92, -98, -89, -69, -41, -13, 10, 29, 41, 50, 64, + 72, 78, 74, 57, 29, 0, -18, -26, -28, -32, -38, -42, -38, -23, -3, 18, + 30, 42, 52, 58, 60, 61, 57, 48, 28, 2, -30, -51, -62, -70, -81, -94, + -101, -93, -75, -49, -23, -2, 18, 36, 50, 61, 69, 77, 78, 66, 42, 11, + -11, -22, -27, -32, -39, -46, -46, -36, -14, 8, 25, 41, 52, 59, 62, 63, + 62, 57, 38, 11, -20, -47, -61, -69, -78, -89, -98, -94, -80, -60, -37, -12, + 13, 33, 48, 62, 70, 78, 81, 72, 52, 23, 0, -14, -24, -33, -43, -49, + -49, -39, -23, -2, 15, 33, 47, 57, 63, 62, 62, 57, 40, 20, -7, -34, + -52, -65, -74, -83, -94, -92, -81, -63, -42, -22, 0, 21, 39, 54, 63, 73, + 79, 76, 61, 37, 12, -5, -19, -28, -37, -46, -51, -47, -32, -13, 7, 25, + 43, 54, 58, 60, 60, 61, 48, 27, 3, -25, -45, -60, -72, -81, -90, -92, + -84, -71, -52, -32, -9, 14, 33, 50, 61, 74, 80, 78, 67, 47, 24, 6, + -12, -26, -37, -50, -56, -52, -37, -19, -2, 16, 35, 52, 61, 63, 61, 59, + 51, 35, 12, -15, -38, -55, -66, -77, -83, -83, -80, -68, -55, -39, -19, 4, + 25, 41, 54, 66, 73, 75, 68, 52, 31, 11, -7, -22, -33, -46, -54, -51, + -39, -24, -5, 12, 32, 48, 56, 60, 61, 58, 50, 36, 17, -8, -30, -46, + -63, -74, -80, -80, -74, -69, -58, -43, -27, -5, 15, 31, 48, 60, 68, 72, + 68, 57, 39, 20, 2, -16, -30, -44, -51, -50, -41, -27, -10, 9, 28, 43, + 53, 57, 57, 54, 48, 37, 19, -3, -25, -41, -56, -69, -75, -73, -69, -63, + -59, -49, -32, -13, 9, 25, 37, 48, 58, 66, 65, 58, 42, 25, 8, -9, + -22, -36, -41, -43, -37, -26, -14, 4, 21, 37, 48, 52, 53, 47, 42, 34, + 21, 3, -18, -39, -51, -64, -67, -62, -60, -60, -58, -50, -36, -16, 3, 17, + 29, 41, 49, 58, 61, 60, 49, 29, 11, -7, -19, -28, -32, -33, -30, -25, + -14, 2, 19, 33, 41, 45, 42, 38, 36, 29, 20, 6, -14, -28, -43, -54, + -58, -55, -50, -51, -54, -51, -41, -22, -4, 11, 19, 30, 37, 47, 55, 56, + 51, 34, 16, 0, -15, -19, -23, -22, -22, -21, -14, 0, 15, 29, 39, 43, + 37, 31, 25, 21, 18, 6, -11, -28, -42, -50, -51, -48, -44, -41, -44, -43, + -41, -25, -8, 9, 16, 22, 26, 35, 43, 50, 48, 33, 16, -3, -13, -16, + -16, -15, -13, -11, -6, 5, 16, 28, 38, 41, 35, 24, 15, 12, 10, 4, + -11, -27, -39, -46, -46, -45, -40, -36, -36, -37, -38, -29, -13, 6, 16, 19, + 22, 27, 37, 43, 42, 32, 19, 2, -10, -13, -12, -7, -4, -2, 2, 10, + 18, 27, 36, 38, 32, 20, 9, 4, -2, -4, -11, -23, -34, -42, -42, -38, + -31, -28, -29, -32, -33, -30, -18, 0, 10, 12, 12, 17, 26, 35, 36, 31, + 19, 5, -6, -11, -9, -2, 7, 14, 13, 13, 16, 23, 31, 34, 29, 15, + -3, -8, -10, -10, -14, -20, -26, -30, -32, -30, -25, -18, -17, -24, -31, -32, + -26, -11, 2, 7, 8, 9, 17, 25, 29, 28, 21, 9, -2, -7, -5, 4, + 12, 21, 24, 23, 25, 26, 29, 31, 27, 15, -2, -15, -21, -23, -23, -23, + -28, -30, -31, -27, -19, -10, -9, -13, -21, -22, -20, -11, -4, -3, -5, -2, + 5, 13, 17, 17, 16, 10, 6, 0, 3, 11, 23, 32, 33, 30, 28, 27, + 24, 24, 19, 9, -6, -19, -29, -29, -26, -20, -19, -22, -24, -23, -16, -10, + -9, -14, -20, -24, -21, -16, -10, -6, -5, 1, 5, 11, 12, 13, 11, 8, + 6, 1, 4, 9, 23, 33, 39, 36, 32, 32, 28, 22, 17, 7, -7, -22, + -31, -33, -31, -24, -19, -18, -18, -16, -13, -7, -6, -8, -14, -21, -24, -20, + -15, -12, -9, -6, 0, 4, 6, 8, 8, 5, 5, 2, 7, 15, 27, 37, + 42, 45, 41, 39, 32, 22, 13, 3, -11, -26, -37, -41, -37, -29, -21, -18, + -15, -11, -6, -2, -2, -4, -7, -13, -16, -20, -21, -16, -14, -10, -6, -3, + -3, 0, 3, 2, 3, 3, 9, 18, 32, 41, 46, 49, 44, 43, 35, 24, + 12, 1, -14, -27, -39, -40, -36, -31, -22, -16, -13, -6, -3, -3, -4, -9, + -9, -13, -16, -20, -21, -16, -15, -11, -6, -4, -4, -5, -5, -3, -3, 0, + 10, 19, 33, 44, 51, 56, 52, 50, 40, 23, 11, -6, -19, -30, -40, -43, + -40, -35, -24, -16, -7, 2, 6, 5, 1, -6, -9, -9, -9, -12, -19, -21, + -21, -17, -9, -7, -9, -11, -15, -14, -9, -7, 7, 19, 36, 51, 57, 61, + 59, 56, 48, 33, 13, -8, -24, -35, -45, -51, -46, -38, -26, -14, -7, 3, + 11, 15, 12, 3, -5, -7, -6, -9, -15, -22, -25, -23, -17, -13, -12, -16, + -19, -21, -18, -12, 3, 21, 38, 50, 58, 67, 65, 64, 55, 41, 21, -4, + -25, -38, -46, -50, -49, -43, -33, -23, -11, 3, 14, 19, 16, 8, 0, -2, + -2, 0, -8, -19, -27, -30, -25, -22, -20, -20, -22, -25, -24, -16, 1, 22, + 43, 56, 62, 67, 68, 65, 60, 46, 24, -3, -25, -40, -45, -49, -50, -46, + -37, -23, -10, 1, 12, 20, 20, 14, 7, 2, 3, 3, -4, -15, -26, -31, + -30, -27, -26, -26, -29, -33, -33, -25, -8, 17, 41, 57, 65, 71, 73, 73, + 66, 53, 33, 5, -23, -41, -48, -50, -48, -48, -40, -30, -14, 1, 12, 21, + 24, 18, 13, 6, 5, 5, 0, -11, -25, -37, -39, -35, -31, -31, -33, -38, + -37, -29, -12, 15, 40, 59, 67, 71, 72, 73, 69, 59, 39, 14, -16, -38, + -50, -51, -50, -48, -45, -36, -21, -4, 12, 25, 30, 25, 18, 11, 11, 10, + 6, -8, -25, -39, -46, -42, -38, -37, -37, -40, -42, -34, -15, 13, 40, 57, + 66, 71, 72, 72, 69, 61, 45, 19, -10, -34, -46, -48, -47, -45, -45, -41, + -28, -12, 7, 23, 27, 25, 18, 15, 17, 17, 12, 1, -20, -37, -47, -50, + -46, -45, -44, -45, -46, -41, -21, 7, 37, 60, 69, 73, 72, 72, 72, 67, + 52, 25, -6, -33, -47, -50, -47, -47, -47, -45, -35, -16, 6, 23, 31, 30, + 24, 23, 24, 25, 18, 4, -15, -33, -50, -56, -57, -53, -48, -49, -49, -45, + -29, 2, 35, 58, 68, 71, 72, 74, 73, 68, 56, 34, 5, -26, -43, -48, + -45, -42, -46, -46, -41, -24, 0, 21, 33, 34, 31, 25, 27, 27, 19, 6, + -14, -36, -55, -64, -64, -60, -50, -47, -45, -44, -31, -4, 32, 58, 71, 72, + 68, 70, 70, 66, 57, 36, 11, -20, -43, -50, -48, -41, -37, -42, -40, -28, + -5, 21, 36, 38, 34, 26, 29, 28, 20, 8, -13, -33, -52, -68, -69, -65, + -55, -49, -47, -44, -31, -3, 30, 55, 67, 70, 68, 70, 70, 65, 57, 39, + 15, -13, -38, -49, -47, -40, -35, -39, -41, -30, -9, 17, 37, 44, 45, 38, + 32, 29, 22, 9, -10, -34, -54, -70, -75, -73, -64, -52, -45, -43, -31, -7, + 25, 53, 67, 72, 70, 72, 70, 62, 53, 38, 16, -10, -32, -49, -50, -43, + -35, -33, -36, -29, -10, 16, 35, 46, 46, 41, 35, 30, 23, 10, -10, -34, + -53, -69, -75, -74, -66, -53, -45, -42, -34, -13, 17, 46, 63, 68, 66, 63, + 65, 63, 54, 43, 24, 0, -20, -40, -43, -42, -36, -32, -32, -28, -16, 7, + 29, 47, 52, 47, 39, 31, 21, 10, -9, -30, -50, -66, -78, -77, -71, -59, + -49, -42, -34, -17, 9, 37, 56, 66, 66, 62, 62, 61, 56, 45, 30, 7, + -13, -31, -39, -40, -36, -33, -32, -28, -18, 1, 21, 41, 54, 52, 44, 36, + 26, 13, -8, -29, -48, -66, -76, -80, -74, -64, -55, -45, -34, -18, 5, 29, + 50, 65, 68, 66, 64, 60, 59, 47, 33, 15, -5, -23, -37, -43, -41, -37, + -35, -31, -21, -4, 16, 36, 52, 59, 54, 45, 33, 17, -5, -25, -45, -60, + -74, -83, -82, -71, -59, -49, -37, -23, -2, 22, 43, 59, 66, 65, 64, 60, + 58, 50, 39, 23, 2, -17, -32, -39, -40, -38, -35, -32, -23, -6, 14, 33, + 49, 59, 58, 49, 34, 16, -5, -25, -43, -60, -74, -83, -83, -76, -63, -53, + -40, -24, -5, 16, 36, 54, 65, 67, 65, 61, 57, 52, 43, 27, 9, -12, + -26, -37, -40, -39, -36, -32, -28, -13, 6, 27, 46, 58, 60, 52, 39, 23, + 5, -16, -36, -53, -66, -77, -84, -81, -72, -60, -45, -32, -15, 5, 25, 48, + 62, 69, 71, 69, 65, 58, 50, 34, 16, -6, -24, -36, -42, -45, -44, -39, + -33, -21, -2, 22, 43, 59, 64, 60, 47, 34, 17, -6, -28, -50, -66, -76, + -84, -86, -82, -72, -57, -40, -21, -2, 21, 42, 58, 66, 73, 76, 71, 64, + 53, 40, 26, 4, -17, -34, -45, -49, -48, -43, -38, -28, -10, 15, 40, 58, + 66, 64, 56, 42, 25, 4, -21, -44, -62, -73, -81, -87, -86, -78, -65, -47, + -31, -9, 15, 34, 52, 62, 72, 79, 80, 72, 61, 49, 34, 12, -12, -32, + -43, -49, -54, -55, -48, -36, -16, 10, 35, 56, 67, 71, 67, 54, 38, 15, + -10, -34, -57, -72, -85, -93, -97, -89, -76, -59, -40, -20, 8, 32, 50, 67, + 77, 87, 89, 81, 66, 52, 35, 16, -6, -30, -47, -58, -61, -57, -50, -37, + -19, 6, 29, 51, 65, 73, 73, 62, 44, 18, -6, -28, -49, -67, -81, -93, + -97, -94, -83, -65, -47, -28, -5, 19, 42, 61, 76, 87, 90, 88, 80, 66, + 48, 27, 3, -17, -40, -56, -65, -66, -58, -49, -30, -6, 17, 41, 59, 71, + 77, 70, 56, 36, 11, -13, -34, -53, -71, -89, -98, -100, -94, -79, -62, -44, + -21, 3, 27, 52, 74, 90, 98, 95, 86, 75, 59, 37, 12, -14, -35, -54, + -64, -67, -64, -51, -34, -10, 11, 32, 50, 65, 73, 71, 58, 37, 14, -10, + -29, -48, -64, -81, -93, -98, -94, -82, -63, -45, -26, -5, 16, 40, 65, 83, + 94, 94, 84, 75, 63, 46, 23, -3, -27, -47, -58, -64, -64, -56, -39, -17, + 3, 20, 38, 57, 71, 72, 61, 45, 24, 1, -19, -37, -56, -73, -91, -99, + -100, -92, -74, -53, -34, -16, 7, 31, 59, 82, 97, 101, 92, 78, 65, 48, + 29, 6, -21, -43, -55, -64, -66, -58, -40, -18, 3, 17, 32, 51, 69, 71, + 62, 45, 27, 6, -15, -34, -50, -64, -81, -93, -99, -96, -80, -59, -40, -23, + -4, 21, 50, 77, 94, 100, 93, 81, 67, 53, 36, 14, -12, -36, -53, -58, + -63, -56, -42, -22, -5, 10, 23, 42, 63, 70, 62, 47, 29, 13, -6, -27, + -43, -57, -72, -84, -98, -99, -87, -66, -44, -27, -11, 10, 38, 67, 91, 99, + 92, 82, 70, 57, 41, 21, -3, -27, -47, -58, -63, -58, -44, -23, -5, 7, + 17, 35, 55, 66, 61, 46, 29, 13, -4, -22, -39, -51, -65, -78, -90, -95, + -85, -69, -47, -30, -12, 9, 30, 57, 83, 96, 91, 81, 67, 57, 42, 26, + 6, -18, -39, -55, -62, -58, -43, -24, -8, 2, 14, 30, 47, 60, 60, 49, + 34, 17, 0, -16, -31, -43, -58, -71, -86, -93, -86, -72, -52, -32, -15, 3, + 22, 48, 76, 90, 89, 78, 69, 59, 46, 32, 14, -6, -27, -47, -57, -56, + -45, -29, -12, -5, 4, 18, 37, 54, 58, 51, 36, 21, 6, -8, -20, -33, + -52, -68, -84, -90, -85, -74, -58, -42, -22, 0, 20, 42, 67, 83, 87, 80, + 68, 58, 47, 34, 19, 0, -20, -40, -52, -53, -45, -27, -13, -4, 6, 17, + 33, 47, 53, 52, 38, 21, 3, -11, -24, -35, -50, -65, -80, -89, -85, -71, + -55, -39, -21, -2, 20, 39, 59, 74, 81, 75, 67, 57, 47, 38, 23, 4, + -17, -32, -43, -45, -39, -26, -14, -4, 4, 12, 26, 38, 47, 48, 35, 19, + 4, -10, -20, -29, -41, -56, -71, -78, -81, -71, -56, -43, -23, -6, 15, 35, + 49, 62, 72, 69, 63, 54, 45, 41, 28, 11, -11, -27, -37, -40, -35, -24, + -17, -7, 2, 9, 22, 35, 46, 49, 37, 21, 4, -9, -18, -27, -41, -55, + -71, -79, -79, -70, -53, -38, -23, -8, 9, 31, 46, 58, 63, 63, 59, 52, + 45, 40, 32, 14, -6, -24, -32, -31, -30, -23, -18, -12, 1, 9, 21, 31, + 41, 44, 33, 21, 5, -6, -20, -29, -43, -57, -69, -77, -73, -65, -52, -41, + -27, -8, 11, 32, 49, 57, 64, 61, 55, 47, 39, 36, 29, 13, -8, -25, + -36, -35, -26, -16, -9, -5, 1, 9, 22, 36, 45, 43, 33, 17, 1, -11, + -21, -32, -45, -57, -71, -78, -73, -61, -45, -33, -23, -8, 11, 31, 46, 53, + 57, 54, 48, 40, 34, 31, 27, 14, -4, -20, -29, -28, -22, -12, -4, 1, + 4, 8, 21, 34, 43, 43, 31, 17, 1, -11, -22, -31, -44, -59, -72, -78, + -70, -54, -40, -28, -19, -8, 10, 28, 45, 53, 57, 53, 43, 34, 28, 27, + 26, 18, 0, -18, -31, -29, -20, -11, -3, 2, 5, 10, 19, 31, 43, 44, + 34, 19, 2, -13, -23, -32, -43, -55, -68, -77, -73, -57, -41, -26, -15, -6, + 11, 28, 43, 52, 52, 49, 41, 33, 24, 22, 21, 14, 1, -14, -25, -24, + -18, -7, -2, 2, 7, 10, 20, 31, 40, 43, 33, 18, 3, -13, -24, -35, + -44, -55, -70, -78, -74, -59, -40, -26, -11, 1, 13, 29, 44, 53, 57, 54, + 45, 32, 24, 18, 13, 9, -4, -16, -26, -29, -22, -10, 1, 8, 13, 18, + 23, 35, 42, 45, 37, 21, 5, -14, -30, -41, -49, -57, -69, -77, -76, -61, + -39, -20, -5, 9, 20, 34, 47, 53, 55, 48, 39, 27, 14, 8, 3, 2, + -4, -15, -23, -24, -16, -3, 6, 11, 19, 24, 30, 34, 41, 43, 35, 18, + 1, -17, -31, -44, -52, -59, -68, -75, -73, -61, -38, -19, 1, 13, 23, 30, + 42, 52, 52, 47, 36, 23, 14, 7, 4, 0, -6, -11, -20, -24, -18, -5, + 7, 15, 18, 22, 28, 36, 43, 43, 38, 24, 4, -13, -30, -44, -55, -64, + -69, -77, -76, -65, -44, -19, 1, 15, 27, 35, 46, 53, 53, 46, 36, 23, + 11, 3, -5, -7, -9, -14, -20, -23, -19, -7, 11, 18, 21, 25, 30, 40, + 43, 43, 38, 24, 7, -14, -30, -41, -55, -65, -73, -77, -74, -66, -49, -24, + -2, 17, 29, 35, 44, 51, 54, 49, 35, 23, 11, 1, -6, -12, -15, -16, + -20, -24, -21, -10, 8, 21, 27, 33, 35, 42, 48, 47, 37, 23, 7, -12, + -28, -44, -60, -69, -75, -78, -74, -65, -49, -25, -2, 17, 30, 40, 48, 54, + 55, 48, 36, 20, 6, -4, -9, -14, -20, -22, -24, -21, -15, -6, 7, 21, + 32, 39, 43, 44, 49, 50, 38, 21, 4, -13, -28, -47, -62, -74, -77, -78, + -77, -65, -48, -26, -4, 15, 28, 40, 50, 56, 54, 46, 33, 20, 9, -2, + -10, -16, -21, -21, -23, -21, -15, -5, 9, 19, 30, 38, 42, 44, 46, 47, + 36, 22, 6, -10, -23, -39, -57, -74, -78, -79, -75, -65, -51, -33, -11, 9, + 25, 37, 46, 55, 56, 48, 34, 21, 10, 4, -4, -14, -20, -25, -24, -21, + -12, -3, 8, 17, 26, 36, 47, 50, 50, 47, 36, 25, 10, -5, -21, -40, + -57, -75, -82, -79, -75, -64, -51, -37, -16, 5, 25, 40, 48, 55, 55, 49, + 37, 25, 15, 6, -6, -18, -26, -29, -25, -20, -16, -7, 5, 17, 29, 39, + 49, 56, 56, 51, 39, 28, 15, 0, -17, -38, -58, -75, -86, -86, -80, -70, + -54, -37, -16, 7, 25, 42, 50, 55, 58, 52, 40, 25, 11, 2, -5, -14, + -21, -26, -26, -18, -12, -5, 4, 13, 25, 34, 45, 53, 55, 48, 39, 25, + 16, 3, -13, -31, -54, -70, -83, -85, -78, -68, -55, -38, -20, 1, 20, 36, + 46, 51, 55, 48, 39, 27, 17, 7, -5, -13, -20, -23, -23, -18, -10, -4, + 3, 10, 21, 29, 40, 48, 52, 50, 40, 28, 20, 10, -5, -24, -48, -67, + -82, -87, -81, -73, -56, -44, -25, -5, 15, 34, 46, 52, 55, 51, 39, 27, + 18, 7, -2, -13, -22, -25, -24, -16, -9, 1, 8, 13, 22, 30, 42, 48, + 50, 47, 38, 26, 15, 6, -8, -22, -41, -61, -77, -86, -81, -70, -54, -40, + -27, -8, 12, 31, 42, 49, 50, 48, 38, 26, 16, 7, -4, -11, -18, -22, + -21, -16, -9, 0, 9, 15, 21, 26, 35, 47, 50, 46, 36, 28, 18, 7, + -7, -22, -37, -53, -70, -81, -83, -72, -58, -43, -30, -14, 5, 22, 37, 44, + 46, 44, 37, 26, 17, 8, 2, -7, -12, -17, -16, -12, -6, 3, 8, 13, + 17, 22, 31, 42, 43, 43, 35, 29, 25, 14, 2, -17, -35, -51, -65, -77, + -80, -75, -63, -47, -34, -18, 4, 21, 32, 38, 41, 41, 36, 28, 17, 8, + 1, -9, -12, -16, -15, -9, -2, 8, 13, 15, 17, 23, 28, 39, 43, 38, + 30, 21, 17, 11, 4, -12, -28, -45, -60, -68, -71, -66, -58, -49, -38, -23, + -5, 15, 27, 34, 34, 32, 28, 23, 18, 13, 4, -2, -7, -9, -7, -4, + 5, 14, 16, 16, 14, 15, 24, 35, 39, 35, 23, 17, 15, 11, 8, -4, + -19, -37, -53, -62, -65, -62, -57, -53, -43, -31, -14, 5, 19, 27, 31, 28, + 26, 23, 20, 18, 11, 5, -2, -5, 0, 3, 8, 14, 16, 15, 11, 7, + 12, 23, 32, 32, 21, 12, 10, 13, 12, 6, -9, -27, -43, -50, -55, -53, + -51, -52, -44, -38, -23, -6, 7, 18, 22, 19, 16, 15, 16, 19, 17, 12, + 6, 3, 7, 10, 16, 20, 23, 20, 14, 8, 9, 17, 27, 26, 17, 6, + 3, 7, 10, 7, -5, -18, -32, -41, -46, -45, -45, -45, -44, -40, -30, -16, + -3, 8, 15, 12, 10, 11, 16, 19, 19, 16, 12, 10, 11, 15, 20, 25, + 26, 24, 18, 11, 6, 11, 17, 21, 15, 3, -6, -2, 4, 7, 2, -14, + -25, -32, -36, -38, -37, -37, -35, -33, -33, -25, -15, -4, 3, 4, 0, -3, + 2, 13, 21, 21, 20, 17, 19, 23, 27, 31, 33, 31, 24, 16, 4, 2, + 7, 13, 13, 3, -10, -9, 0, 8, 7, -3, -15, -22, -24, -30, -32, -37, + -39, -38, -37, -34, -28, -17, -8, -2, -4, -4, 4, 16, 26, 30, 26, 22, + 22, 25, 29, 31, 30, 29, 24, 17, 6, -2, 7, 10, 13, 4, -11, -15, + -10, 3, 8, 2, -10, -17, -17, -17, -23, -29, -35, -37, -34, -36, -35, -28, + -19, -10, -11, -14, -8, 8, 21, 26, 26, 21, 24, 31, 38, 40, 38, 37, + 33, 26, 15, 4, 1, 2, 1, -6, -19, -24, -18, -7, 2, 5, -4, -10, + -9, -6, -7, -16, -27, -33, -35, -38, -41, -38, -32, -22, -20, -18, -10, 4, + 20, 29, 31, 30, 28, 32, 38, 43, 42, 39, 34, 28, 14, 4, 1, 3, + 4, -5, -21, -30, -26, -14, 1, 3, -4, -8, -8, 0, 0, -8, -15, -26, + -29, -35, -40, -40, -36, -30, -28, -29, -22, -10, 9, 22, 28, 28, 27, 30, + 39, 46, 50, 50, 43, 33, 21, 9, 3, 3, 1, -10, -22, -35, -34, -22, + -8, 2, 0, -6, -7, 0, 5, -2, -9, -18, -28, -34, -41, -43, -39, -35, + -33, -33, -25, -12, 5, 19, 26, 29, 31, 31, 39, 46, 51, 52, 47, 38, + 27, 18, 10, 5, -3, -13, -22, -33, -36, -28, -16, -4, -2, -4, -6, 0, + 8, 7, 0, -12, -22, -33, -40, -42, -39, -37, -38, -39, -32, -17, 2, 15, + 24, 25, 28, 33, 39, 47, 51, 53, 51, 44, 35, 23, 15, 8, 1, -12, + -25, -37, -41, -33, -22, -11, -4, -5, -3, 3, 10, 13, 6, -5, -17, -28, + -38, -43, -44, -44, -44, -43, -36, -23, -7, 7, 20, 26, 29, 35, 43, 51, + 54, 58, 56, 52, 44, 29, 18, 9, -2, -12, -28, -39, -45, -38, -26, -16, + -7, -3, 1, 6, 12, 15, 12, 3, -11, -25, -37, -41, -43, -46, -47, -46, + -39, -28, -15, 0, 11, 21, 25, 31, 38, 46, 53, 60, 62, 59, 53, 42, + 32, 19, 6, -10, -27, -41, -47, -47, -39, -31, -21, -9, -2, 5, 11, 16, + 19, 13, 2, -15, -30, -35, -37, -43, -47, -49, -42, -32, -21, -11, 0, 8, + 19, 27, 38, 47, 51, 58, 63, 63, 59, 50, 41, 28, 10, -9, -26, -37, + -43, -44, -40, -33, -23, -11, 0, 6, 9, 14, 15, 13, 1, -15, -25, -32, + -34, -43, -49, -50, -43, -30, -20, -13, -9, 0, 10, 23, 36, 46, 52, 55, + 62, 65, 66, 61, 51, 36, 15, -7, -24, -34, -42, -45, -46, -42, -34, -20, + -5, 5, 11, 14, 16, 13, 2, -10, -18, -24, -31, -39, -49, -48, -42, -34, + -24, -18, -15, -8, 2, 13, 29, 42, 51, 57, 62, 65, 70, 69, 60, 45, + 20, -3, -24, -37, -43, -46, -49, -48, -39, -24, -6, 5, 12, 17, 20, 16, + 6, -9, -15, -21, -26, -38, -50, -56, -50, -37, -26, -23, -19, -14, -4, 11, + 27, 42, 54, 58, 63, 65, 68, 70, 63, 50, 26, 1, -21, -37, -43, -44, + -44, -44, -40, -28, -11, 5, 10, 16, 18, 14, 5, -12, -19, -22, -24, -33, + -47, -52, -52, -38, -25, -17, -17, -16, -10, 4, 22, 39, 53, 59, 62, 63, + 66, 68, 66, 55, 32, 9, -17, -34, -43, -42, -39, -38, -38, -31, -19, -3, + 10, 17, 19, 12, 3, -12, -21, -24, -24, -31, -40, -49, -52, -41, -30, -18, + -15, -17, -10, 0, 16, 33, 47, 59, 65, 64, 65, 67, 63, 56, 38, 13, + -12, -32, -41, -39, -35, -33, -32, -27, -17, -4, 8, 15, 16, 13, 4, -11, + -20, -25, -27, -32, -40, -48, -52, -46, -37, -25, -18, -16, -10, 1, 16, 33, + 49, 59, 66, 67, 65, 66, 62, 51, 38, 15, -9, -30, -38, -41, -33, -29, + -26, -23, -17, -5, 7, 16, 15, 14, 5, -9, -19, -27, -31, -34, -40, -47, + -52, -49, -40, -30, -22, -16, -8, 4, 19, 32, 46, 59, 67, 71, 69, 64, + 57, 49, 36, 17, -7, -27, -38, -40, -35, -28, -23, -19, -12, -5, 6, 12, + 16, 15, 10, -5, -19, -28, -32, -36, -39, -46, -53, -52, -45, -34, -25, -18, + -7, 6, 20, 33, 46, 60, 67, 74, 71, 65, 56, 46, 37, 18, -2, -20, + -33, -38, -38, -30, -22, -16, -12, -6, 2, 6, 15, 15, 11, 1, -11, -19, + -31, -37, -42, -46, -51, -54, -53, -46, -35, -26, -14, 3, 17, 33, 45, 57, + 67, 75, 77, 71, 62, 50, 36, 18, 0, -19, -31, -36, -37, -31, -23, -17, + -11, -6, 1, 6, 11, 15, 14, 8, -3, -16, -27, -37, -41, -47, -52, -58, + -60, -55, -46, -32, -16, 0, 17, 32, 46, 59, 70, 79, 80, 75, 65, 51, + 35, 20, 2, -15, -27, -38, -42, -36, -27, -17, -10, -4, 3, 7, 12, 18, + 19, 14, 5, -7, -22, -37, -46, -53, -57, -62, -67, -65, -58, -43, -22, 1, + 20, 35, 48, 60, 69, 79, 82, 79, 68, 53, 36, 21, 4, -11, -24, -36, + -40, -38, -31, -21, -14, -5, 1, 5, 11, 17, 22, 19, 14, -2, -17, -35, + -48, -55, -63, -67, -73, -72, -64, -49, -27, -4, 19, 36, 52, 64, 73, 81, + 85, 82, 72, 56, 36, 20, 3, -14, -24, -33, -36, -35, -32, -22, -13, -6, + 2, 7, 10, 15, 19, 19, 17, 6, -10, -29, -48, -58, -67, -71, -75, -78, + -72, -58, -35, -10, 16, 35, 52, 65, 74, 80, 86, 87, 79, 62, 39, 21, + 5, -11, -22, -33, -39, -39, -34, -25, -15, -7, 3, 8, 16, 17, 21, 22, + 19, 9, -6, -27, -47, -60, -71, -77, -80, -81, -73, -61, -39, -12, 16, 36, + 52, 63, 73, 80, 85, 87, 76, 59, 41, 23, 8, -7, -18, -29, -36, -38, + -33, -23, -13, -8, 1, 6, 14, 18, 19, 23, 23, 17, 1, -20, -43, -57, + -67, -78, -83, -89, -81, -67, -45, -19, 9, 35, 55, 67, 74, 80, 87, 91, + 83, 68, 44, 24, 6, -9, -21, -29, -36, -39, -39, -31, -20, -10, 1, 13, + 20, 26, 26, 27, 28, 22, 8, -16, -40, -60, -75, -86, -93, -95, -89, -75, + -52, -24, 7, 37, 57, 69, 77, 83, 90, 93, 85, 70, 48, 27, 8, -8, + -19, -26, -32, -35, -39, -37, -28, -17, -2, 9, 19, 21, 27, 31, 32, 29, + 12, -9, -32, -54, -71, -86, -94, -96, -90, -82, -62, -33, 2, 34, 56, 69, + 78, 87, 94, 94, 85, 69, 49, 29, 9, -10, -21, -27, -30, -33, -37, -36, + -29, -17, -5, 9, 19, 25, 27, 31, 33, 33, 21, -2, -25, -51, -71, -86, + -95, -95, -92, -85, -69, -42, -8, 27, 52, 67, 74, 83, 92, 95, 89, 75, + 56, 35, 16, -6, -17, -26, -28, -34, -41, -39, -37, -25, -9, 6, 20, 28, + 31, 37, 37, 34, 24, 3, -20, -46, -69, -85, -96, -99, -97, -89, -73, -47, + -11, 21, 45, 61, 73, 84, 92, 95, 89, 77, 61, 41, 20, -2, -13, -20, + -28, -36, -43, -46, -40, -30, -16, 0, 12, 24, 30, 38, 43, 41, 33, 13, + -14, -39, -63, -80, -93, -98, -100, -94, -76, -52, -19, 14, 38, 56, 70, 80, + 90, 94, 88, 75, 58, 40, 22, 6, -8, -19, -25, -33, -39, -41, -38, -31, + -19, -5, 7, 21, 31, 39, 45, 42, 32, 15, -8, -32, -55, -77, -93, -102, + -101, -94, -80, -57, -29, 5, 34, 54, 70, 78, 88, 96, 92, 80, 62, 41, + 24, 8, -9, -21, -32, -35, -38, -41, -39, -35, -22, -6, 6, 21, 31, 39, + 46, 44, 35, 18, -5, -27, -49, -70, -86, -97, -102, -96, -84, -58, -30, -2, + 26, 45, 62, 74, 82, 89, 89, 80, 66, 46, 28, 12, -3, -14, -26, -36, + -39, -42, -40, -36, -28, -15, 0, 17, 30, 37, 45, 48, 40, 23, 3, -20, + -43, -64, -81, -93, -98, -96, -85, -65, -38, -8, 20, 40, 55, 68, 80, 88, + 88, 82, 68, 54, 35, 18, 2, -12, -24, -35, -40, -45, -45, -41, -33, -20, + -4, 15, 31, 41, 49, 52, 48, 32, 13, -14, -38, -59, -77, -92, -101, -102, + -91, -70, -45, -15, 15, 38, 53, 65, 77, 89, 91, 85, 71, 52, 38, 21, + 5, -12, -26, -36, -42, -45, -45, -43, -34, -22, -7, 9, 26, 39, 50, 56, + 50, 34, 14, -7, -29, -50, -69, -84, -96, -98, -90, -72, -50, -24, 7, 32, + 48, 57, 68, 84, 91, 88, 74, 58, 44, 30, 11, -9, -26, -38, -41, -46, + -45, -44, -38, -23, -7, 9, 24, 36, 49, 55, 51, 35, 18, -3, -24, -45, + -64, -78, -89, -93, -90, -75, -54, -29, 0, 23, 42, 54, 67, 80, 90, 91, + 81, 65, 48, 31, 13, -5, -24, -41, -50, -53, -51, -46, -42, -28, -10, 8, + 23, 36, 50, 59, 56, 44, 26, 8, -13, -35, -56, -77, -89, -94, -92, -80, + -61, -39, -11, 14, 33, 50, 63, 77, 88, 89, 81, 67, 54, 38, 21, 1, + -23, -39, -50, -54, -53, -46, -42, -31, -17, 1, 17, 33, 46, 56, 56, 46, + 33, 16, -4, -24, -46, -67, -82, -92, -94, -87, -67, -45, -19, 4, 22, 43, + 62, 76, 87, 90, 87, 76, 59, 40, 20, 1, -22, -40, -55, -62, -58, -50, + -40, -29, -17, -3, 14, 33, 49, 59, 58, 49, 35, 21, 2, -17, -39, -59, + -76, -90, -93, -86, -70, -49, -29, -8, 12, 33, 57, 75, 84, 87, 84, 78, + 65, 47, 28, 6, -18, -39, -58, -65, -64, -57, -44, -33, -22, -10, 6, 26, + 44, 56, 56, 48, 40, 27, 11, -8, -30, -49, -65, -80, -86, -87, -72, -51, + -31, -13, 5, 24, 48, 70, 81, 86, 83, 79, 69, 51, 30, 8, -16, -37, + -55, -65, -67, -61, -48, -36, -21, -10, 5, 22, 40, 55, 58, 53, 43, 31, + 16, -2, -23, -45, -60, -74, -82, -86, -75, -56, -36, -16, 1, 21, 44, 65, + 81, 88, 85, 81, 72, 54, 33, 8, -18, -41, -58, -71, -74, -70, -56, -41, + -23, -6, 8, 23, 38, 53, 60, 59, 50, 37, 22, 1, -20, -41, -56, -69, + -79, -83, -78, -62, -42, -20, 2, 22, 41, 59, 77, 86, 87, 79, 67, 50, + 31, 10, -15, -36, -52, -63, -69, -69, -59, -41, -23, -9, 4, 15, 29, 44, + 55, 56, 53, 43, 27, 12, -8, -27, -44, -57, -68, -78, -77, -67, -48, -29, + -12, 12, 32, 52, 70, 79, 84, 82, 73, 59, 38, 15, -9, -33, -52, -63, + -71, -72, -66, -50, -30, -13, 2, 12, 27, 42, 50, 54, 54, 46, 34, 19, + -2, -19, -35, -47, -61, -71, -72, -66, -51, -36, -19, 5, 27, 46, 63, 74, + 79, 79, 70, 58, 41, 21, 3, -24, -44, -58, -66, -66, -65, -52, -36, -22, + -10, 4, 18, 34, 43, 49, 52, 48, 43, 31, 14, -4, -21, -35, -51, -61, + -66, -64, -56, -43, -29, -8, 16, 37, 54, 67, 72, 74, 70, 61, 46, 27, + 7, -19, -40, -56, -62, -62, -63, -55, -43, -26, -10, 3, 13, 26, 38, 44, + 47, 43, 39, 30, 19, 5, -12, -24, -40, -47, -51, -53, -51, -44, -32, -14, + 6, 24, 41, 54, 61, 63, 61, 56, 47, 32, 13, -9, -31, -46, -56, -53, + -54, -54, -48, -37, -18, -3, 8, 17, 27, 33, 38, 39, 39, 37, 30, 18, + 1, -16, -29, -35, -39, -42, -47, -47, -39, -22, -3, 14, 29, 42, 51, 57, + 56, 54, 45, 36, 20, -2, -23, -41, -50, -51, -52, -53, -51, -42, -27, -8, + 5, 12, 19, 28, 35, 40, 39, 40, 37, 28, 12, -7, -23, -28, -30, -37, + -43, -49, -45, -32, -15, 3, 19, 34, 45, 49, 49, 51, 47, 41, 26, 6, + -18, -34, -43, -45, -45, -48, -51, -49, -33, -15, -2, 8, 12, 19, 26, 33, + 38, 38, 38, 34, 25, 8, -11, -19, -20, -23, -32, -43, -48, -41, -24, -8, + 10, 21, 31, 38, 43, 47, 48, 45, 34, 16, -9, -31, -41, -42, -42, -46, + -52, -52, -40, -23, -6, 6, 11, 17, 24, 30, 35, 38, 39, 40, 29, 14, + -3, -14, -14, -15, -24, -36, -47, -45, -33, -15, 3, 14, 23, 29, 35, 39, + 44, 45, 38, 22, -3, -26, -38, -37, -37, -41, -50, -56, -45, -26, -8, 5, + 12, 16, 22, 27, 32, 39, 41, 41, 33, 17, 1, -9, -8, -8, -16, -30, + -41, -45, -35, -21, -5, 10, 18, 24, 28, 31, 38, 42, 39, 25, 2, -23, + -36, -36, -37, -39, -47, -53, -47, -31, -11, 3, 12, 16, 23, 27, 32, 37, + 40, 41, 33, 18, 2, -7, -8, -6, -10, -23, -36, -41, -35, -20, -6, 7, + 14, 17, 24, 29, 36, 42, 40, 28, 5, -20, -35, -38, -38, -39, -45, -51, + -46, -33, -15, 2, 13, 22, 27, 28, 27, 30, 37, 41, 35, 20, 5, -4, + -4, -2, -3, -13, -28, -35, -32, -23, -10, 3, 11, 14, 14, 20, 28, 37, + 40, 27, 7, -16, -31, -36, -37, -36, -41, -44, -45, -35, -18, 1, 12, 19, + 25, 26, 27, 31, 34, 39, 34, 20, 8, 0, 0, 1, 0, -9, -23, -33, + -34, -24, -10, 2, 8, 8, 10, 16, 27, 34, 35, 27, 10, -10, -27, -35, + -35, -34, -39, -46, -47, -38, -22, -3, 10, 19, 26, 31, 32, 32, 35, 41, + 39, 25, 9, -2, -3, -2, -2, -7, -19, -30, -33, -26, -14, -3, 6, 6, + 7, 12, 26, 37, 37, 26, 10, -8, -25, -35, -39, -39, -42, -47, -49, -42, + -27, -4, 12, 20, 29, 33, 36, 35, 35, 38, 37, 27, 10, -3, -6, -3, + -2, -7, -16, -24, -28, -24, -13, -4, 4, 5, 7, 9, 19, 30, 33, 28, + 12, -6, -24, -35, -40, -39, -42, -47, -47, -41, -26, -8, 10, 22, 31, 36, + 41, 39, 34, 33, 33, 29, 15, 2, -7, -8, -6, -6, -10, -18, -24, -24, + -15, -5, 6, 7, 7, 10, 17, 23, 23, 18, 9, -7, -23, -36, -42, -41, + -41, -45, -45, -39, -28, -11, 7, 21, 31, 36, 39, 39, 34, 31, 33, 29, + 19, 7, -5, -6, -6, -4, -6, -13, -17, -20, -16, -8, 1, 6, 7, 7, + 11, 16, 20, 18, 9, -7, -24, -37, -43, -42, -42, -42, -45, -41, -28, -11, + 7, 19, 28, 35, 40, 42, 38, 33, 29, 27, 21, 10, -2, -8, -8, -6, + -8, -11, -13, -16, -14, -8, 1, 5, 8, 9, 15, 19, 20, 18, 9, -4, + -18, -34, -42, -46, -47, -45, -47, -45, -36, -20, 0, 13, 26, 36, 45, 48, + 42, 35, 29, 28, 26, 20, 6, -6, -10, -10, -6, -7, -8, -10, -14, -10, + -7, 0, 6, 8, 13, 14, 16, 13, 7, -3, -13, -27, -37, -44, -49, -44, + -42, -40, -37, -25, -9, 9, 23, 31, 41, 44, 44, 37, 30, 27, 28, 27, + 15, 2, -7, -9, -6, -7, -9, -8, -13, -12, -8, -3, 4, 9, 13, 14, + 14, 11, 6, 0, -9, -23, -34, -43, -49, -46, -42, -40, -35, -29, -13, 3, + 19, 31, 41, 45, 43, 37, 31, 29, 30, 28, 19, 4, -5, -7, -7, -5, + -8, -7, -9, -11, -9, -4, 0, 6, 12, 14, 13, 9, 5, -3, -9, -19, + -28, -37, -48, -48, -45, -39, -34, -30, -18, -5, 12, 23, 34, 42, 44, 39, + 34, 32, 31, 33, 30, 18, 8, 1, -5, -6, -5, -5, -8, -13, -16, -14, + -7, 2, 7, 11, 10, 7, 4, -2, -7, -12, -22, -32, -45, -50, -45, -38, + -33, -30, -24, -13, 2, 20, 31, 39, 43, 42, 38, 36, 33, 33, 33, 24, + 14, 1, -8, -9, -7, -4, -5, -11, -16, -16, -11, -4, 2, 9, 8, 7, + 3, -3, -6, -9, -15, -24, -38, -47, -48, -42, -35, -32, -29, -21, -9, 11, + 27, 35, 42, 42, 42, 40, 40, 38, 36, 30, 19, 8, -4, -9, -8, -5, + -5, -12, -18, -20, -15, -5, -2, 3, 4, 5, 6, 1, -3, -8, -12, -19, + -31, -43, -47, -43, -36, -35, -36, -32, -19, 2, 19, 30, 38, 42, 46, 49, + 50, 47, 43, 39, 28, 16, 1, -10, -13, -11, -9, -14, -21, -25, -20, -10, + -4, 1, 3, 4, 7, 4, -3, -7, -7, -10, -23, -38, -47, -46, -41, -37, + -38, -37, -27, -11, 11, 24, 33, 38, 45, 50, 53, 52, 48, 43, 37, 25, + 10, -3, -11, -11, -11, -13, -20, -27, -29, -22, -14, -7, -2, 2, 6, 3, + -2, -3, 0, 0, -11, -28, -41, -45, -39, -35, -36, -39, -37, -24, -7, 11, + 22, 32, 41, 51, 55, 56, 54, 53, 50, 40, 23, 6, -5, -10, -11, -14, + -20, -28, -34, -33, -25, -16, -10, -5, 0, 0, 1, 2, 4, 5, -4, -16, + -29, -35, -37, -37, -35, -39, -39, -32, -19, 0, 13, 23, 36, 46, 54, 58, + 57, 59, 56, 47, 33, 16, 3, -5, -9, -11, -19, -29, -36, -39, -33, -26, + -18, -12, -7, -5, -2, 4, 11, 15, 10, -3, -18, -29, -32, -35, -36, -41, + -44, -40, -30, -18, 0, 13, 28, 41, 50, 59, 63, 66, 66, 60, 44, 26, + 11, 2, -6, -12, -19, -29, -38, -44, -41, -33, -25, -16, -9, -8, -6, 1, + 11, 18, 16, 8, -6, -17, -27, -32, -36, -39, -43, -44, -37, -30, -12, 8, + 26, 39, 46, 56, 64, 70, 72, 66, 51, 36, 18, 7, -4, -11, -18, -29, + -42, -50, -51, -45, -35, -23, -14, -10, -9, 0, 14, 27, 29, 20, 7, -5, + -15, -23, -30, -38, -45, -50, -49, -43, -30, -9, 13, 31, 41, 52, 65, 75, + 79, 77, 66, 50, 30, 13, 3, -6, -14, -26, -41, -53, -57, -54, -44, -32, + -23, -17, -13, -5, 10, 24, 31, 28, 20, 9, -5, -17, -26, -35, -40, -48, + -54, -53, -44, -23, 0, 21, 35, 46, 60, 73, 81, 83, 77, 60, 42, 25, + 11, 1, -11, -25, -42, -57, -64, -62, -54, -43, -33, -24, -17, -6, 9, 23, + 37, 37, 33, 19, 6, -9, -20, -30, -41, -49, -57, -59, -54, -38, -16, 10, + 31, 46, 58, 70, 78, 85, 84, 73, 54, 32, 16, 5, -5, -22, -41, -60, + -72, -71, -66, -54, -43, -30, -19, -6, 10, 25, 41, 47, 43, 32, 20, 7, + -10, -25, -40, -52, -61, -68, -65, -54, -34, -11, 16, 39, 57, 72, 80, 88, + 91, 83, 67, 46, 28, 13, 1, -18, -40, -62, -77, -77, -70, -63, -54, -43, + -30, -12, 7, 25, 40, 51, 51, 42, 31, 19, 3, -13, -32, -48, -60, -68, + -71, -63, -49, -28, -2, 23, 46, 66, 77, 86, 92, 89, 82, 62, 43, 22, + 7, -12, -39, -59, -74, -80, -78, -72, -63, -50, -35, -17, 5, 22, 35, 45, + 49, 49, 42, 31, 13, -7, -25, -38, -49, -59, -66, -65, -57, -42, -20, 8, + 34, 55, 69, 79, 84, 84, 84, 77, 64, 42, 18, -6, -29, -49, -69, -82, + -87, -87, -78, -66, -48, -27, -4, 17, 33, 47, 56, 60, 58, 49, 31, 8, + -18, -36, -47, -57, -67, -75, -74, -60, -36, -3, 25, 48, 65, 76, 83, 87, + 90, 88, 77, 52, 24, -4, -26, -42, -61, -77, -91, -94, -85, -70, -54, -34, + -11, 12, 30, 44, 56, 63, 66, 61, 43, 19, -8, -27, -39, -49, -62, -74, + -80, -71, -49, -20, 9, 34, 56, 70, 79, 86, 93, 96, 91, 70, 41, 11, + -18, -39, -58, -77, -91, -99, -95, -83, -65, -42, -17, 7, 27, 43, 57, 66, + 69, 67, 55, 32, 5, -21, -32, -42, -56, -73, -84, -79, -60, -33, -5, 21, + 44, 61, 72, 80, 92, 100, 99, 82, 54, 23, -10, -31, -51, -71, -87, -101, + -101, -92, -76, -49, -24, 1, 21, 37, 52, 66, 72, 72, 64, 44, 18, -7, + -23, -31, -45, -64, -79, -83, -71, -46, -18, 7, 27, 46, 62, 72, 85, 97, + 100, 92, 65, 35, 2, -22, -40, -60, -78, -92, -100, -96, -82, -59, -29, -6, + 15, 28, 44, 57, 65, 67, 65, 49, 27, 2, -17, -23, -35, -53, -70, -79, + -73, -52, -27, -4, 16, 35, 54, 65, 77, 88, 95, 93, 73, 44, 12, -17, + -38, -54, -74, -86, -97, -98, -89, -69, -37, -11, 9, 27, 42, 56, 65, 68, + 71, 59, 39, 13, -9, -20, -30, -45, -62, -74, -75, -60, -41, -18, 3, 23, + 43, 60, 74, 83, 91, 91, 78, 52, 22, -8, -30, -46, -66, -82, -90, -92, + -85, -70, -44, -17, 5, 22, 33, 45, 56, 60, 63, 56, 39, 21, 5, -9, + -20, -33, -49, -62, -70, -62, -47, -28, -9, 11, 29, 47, 60, 73, 83, 87, + 81, 62, 32, 4, -21, -39, -60, -78, -88, -90, -86, -73, -55, -28, -2, 18, + 30, 42, 50, 57, 58, 53, 44, 27, 15, 4, -10, -24, -40, -53, -59, -57, + -49, -38, -21, -3, 17, 34, 49, 62, 75, 81, 76, 63, 39, 15, -11, -31, + -50, -69, -79, -84, -82, -73, -57, -34, -7, 12, 26, 35, 42, 50, 56, 53, + 42, 31, 20, 13, 1, -16, -30, -43, -50, -51, -49, -42, -28, -11, 7, 23, + 38, 52, 65, 75, 73, 62, 43, 20, -2, -24, -43, -60, -69, -74, -74, -69, + -59, -42, -19, 2, 19, 27, 34, 41, 48, 50, 45, 39, 33, 25, 13, -3, + -18, -32, -42, -47, -49, -47, -40, -27, -8, 11, 28, 43, 57, 69, 73, 65, + 50, 31, 8, -16, -36, -53, -63, -70, -72, -70, -62, -46, -25, -6, 11, 23, + 30, 38, 45, 49, 50, 46, 42, 33, 22, 6, -13, -25, -37, -43, -48, -50, + -45, -35, -18, 2, 21, 39, 51, 61, 64, 63, 53, 38, 19, -6, -30, -49, + -59, -63, -65, -66, -64, -52, -31, -14, 2, 13, 25, 35, 42, 46, 46, 47, + 48, 44, 33, 15, -6, -21, -32, -37, -42, -48, -46, -39, -26, -8, 12, 31, + 45, 55, 58, 57, 51, 39, 22, 2, -21, -39, -49, -56, -59, -62, -59, -52, + -38, -22, -9, 5, 16, 25, 32, 40, 46, 51, 54, 52, 40, 24, 5, -11, + -20, -28, -35, -44, -48, -43, -33, -17, 0, 18, 32, 44, 48, 49, 48, 40, + 28, 11, -10, -26, -37, -45, -52, -58, -57, -51, -41, -29, -19, -10, 3, 15, + 27, 36, 40, 50, 59, 60, 51, 33, 15, 2, -11, -21, -34, -45, -49, -45, + -36, -25, -11, 8, 26, 38, 43, 42, 41, 39, 31, 16, -5, -24, -31, -37, + -43, -51, -54, -49, -40, -31, -24, -13, -3, 12, 22, 29, 33, 43, 55, 60, + 53, 37, 18, 5, -4, -12, -23, -35, -44, -42, -35, -26, -15, -2, 15, 26, + 33, 31, 31, 29, 28, 21, 6, -13, -27, -30, -37, -44, -48, -45, -39, -34, + -28, -18, -8, 4, 17, 23, 31, 40, 51, 58, 56, 42, 25, 12, 2, -7, + -16, -27, -36, -39, -37, -31, -21, -12, 3, 14, 21, 25, 23, 23, 25, 23, + 11, -4, -16, -21, -26, -34, -39, -40, -34, -31, -30, -23, -17, -3, 9, 16, + 23, 31, 42, 54, 57, 49, 29, 14, 7, 4, -3, -15, -26, -32, -32, -31, + -24, -16, -5, 5, 8, 10, 9, 10, 16, 19, 14, 4, -8, -14, -16, -21, + -29, -34, -33, -30, -29, -26, -20, -10, 2, 11, 20, 28, 40, 51, 55, 51, + 33, 17, 9, 6, 4, -9, -20, -28, -32, -29, -25, -20, -11, -2, 3, 4, + 1, 6, 12, 18, 16, 8, -5, -10, -14, -17, -20, -23, -25, -26, -28, -26, + -21, -12, -2, 6, 13, 20, 29, 40, 48, 48, 37, 23, 13, 8, 7, 3, + -6, -15, -22, -24, -24, -21, -16, -10, -6, -11, -15, -10, 1, 12, 15, 9, + 4, 3, 1, -5, -11, -18, -18, -22, -25, -29, -27, -19, -7, 4, 10, 14, + 21, 35, 46, 48, 40, 27, 16, 13, 11, 11, 5, -5, -14, -19, -21, -24, + -19, -14, -13, -17, -21, -21, -11, 1, 11, 12, 5, 3, 2, 5, 6, 0, + -6, -16, -20, -25, -26, -20, -12, -4, 1, 5, 11, 25, 38, 46, 41, 33, + 21, 17, 15, 15, 14, 8, -3, -14, -23, -27, -26, -21, -20, -22, -26, -25, + -20, -7, 5, 10, 10, 8, 5, 6, 6, 5, 1, -7, -14, -20, -23, -21, + -17, -11, -4, 2, 7, 17, 29, 38, 40, 37, 30, 23, 21, 20, 17, 14, + 5, -6, -19, -26, -29, -25, -24, -27, -28, -28, -26, -18, -4, 6, 9, 8, + 4, 5, 10, 12, 11, 3, -8, -15, -18, -18, -15, -11, -10, -5, 1, 8, + 16, 26, 35, 35, 31, 24, 22, 21, 22, 21, 16, 5, -12, -24, -30, -31, + -29, -31, -32, -31, -32, -22, -12, 0, 7, 11, 12, 10, 11, 15, 13, 10, + 2, -10, -13, -16, -17, -14, -14, -12, -6, 0, 10, 20, 26, 32, 30, 29, + 27, 26, 28, 26, 22, 13, -2, -16, -25, -30, -32, -33, -35, -35, -34, -28, + -19, -12, -5, 1, 5, 9, 11, 16, 17, 18, 11, 3, -4, -10, -12, -13, + -12, -13, -14, -10, -4, 8, 20, 27, 31, 31, 28, 29, 31, 30, 26, 17, + 5, -9, -23, -32, -37, -36, -34, -35, -34, -32, -24, -16, -7, 2, 4, 6, + 10, 16, 17, 15, 12, 8, 3, -5, -11, -11, -10, -11, -12, -11, -5, 3, + 13, 22, 30, 32, 27, 25, 25, 28, 27, 19, 7, -8, -22, -31, -34, -32, + -30, -28, -31, -31, -29, -21, -12, -4, 1, 1, 3, 10, 16, 18, 18, 14, + 12, 3, -5, -8, -7, -8, -10, -12, -12, -5, 6, 16, 26, 30, 29, 24, + 25, 26, 29, 23, 13, -2, -16, -26, -32, -33, -30, -30, -30, -30, -29, -25, + -18, -12, -5, -2, 2, 8, 14, 18, 16, 18, 14, 10, 4, 0, -5, -4, + -7, -9, -14, -10, -3, 9, 19, 26, 26, 23, 23, 26, 29, 28, 21, 7, + -10, -19, -25, -26, -27, -27, -29, -30, -32, -31, -27, -19, -13, -9, -7, 0, + 9, 18, 24, 26, 21, 13, 9, 8, 4, -2, -6, -9, -11, -11, -7, 4, + 16, 24, 26, 21, 19, 22, 26, 29, 23, 7, -10, -17, -19, -19, -23, -25, + -25, -25, -26, -26, -29, -26, -17, -14, -9, -7, 1, 12, 21, 26, 23, 18, + 13, 11, 11, 6, -4, -6, -10, -10, -9, -2, 9, 20, 25, 23, 18, 18, + 23, 26, 24, 10, -5, -13, -17, -14, -15, -17, -20, -24, -25, -29, -31, -32, + -28, -22, -16, -13, -8, 2, 14, 25, 27, 27, 22, 17, 15, 13, 10, 5, + -3, -6, -8, -6, 1, 11, 18, 20, 13, 11, 15, 19, 20, 14, 4, -4, + -12, -12, -12, -12, -14, -17, -23, -30, -35, -37, -31, -26, -20, -16, -12, -4, + 9, 22, 28, 26, 22, 17, 14, 15, 11, 8, 6, 2, 0, -2, 4, 11, + 16, 16, 12, 7, 8, 13, 13, 10, 1, -5, -8, -8, -8, -7, -7, -10, + -20, -26, -34, -36, -33, -31, -29, -25, -19, -12, 4, 18, 27, 28, 23, 22, + 18, 19, 17, 14, 9, 7, 4, 0, 2, 8, 14, 16, 12, 2, 0, 2, + 5, 6, 2, -4, -7, -6, -2, -2, -3, -5, -11, -19, -28, -37, -37, -37, + -34, -29, -24, -18, -8, 7, 20, 25, 25, 25, 22, 21, 21, 21, 19, 15, + 11, 6, 6, 6, 10, 11, 6, -2, -5, -5, -2, 0, 0, 0, -4, 0, + 2, 4, 2, -2, -8, -16, -25, -34, -39, -42, -39, -33, -26, -21, -16, -4, + 11, 22, 25, 27, 25, 23, 23, 24, 25, 22, 17, 13, 10, 9, 12, 10, + 4, -5, -12, -12, -11, -9, -8, -6, -5, 1, 4, 8, 10, 7, 4, -7, + -18, -26, -34, -39, -43, -42, -34, -28, -22, -13, 2, 14, 18, 21, 23, 27, + 30, 32, 31, 28, 23, 20, 20, 15, 14, 10, 2, -5, -13, -15, -16, -16, + -12, -12, -5, 1, 5, 8, 8, 10, 8, 0, -13, -23, -27, -33, -40, -44, + -41, -32, -24, -17, -6, 3, 9, 17, 22, 25, 29, 34, 39, 36, 32, 26, + 25, 23, 19, 11, 1, -9, -16, -18, -17, -19, -21, -17, -8, 0, 4, 7, + 8, 10, 11, 6, -4, -13, -21, -25, -35, -40, -41, -37, -26, -21, -13, -8, + -3, 6, 15, 23, 27, 35, 40, 41, 38, 33, 31, 29, 24, 16, 5, -5, + -16, -23, -23, -23, -18, -14, -6, 2, 3, 4, 7, 11, 13, 7, -5, -13, + -21, -25, -32, -40, -42, -37, -28, -21, -14, -13, -9, 1, 11, 22, 27, 33, + 39, 43, 42, 41, 33, 29, 25, 18, 7, -6, -17, -25, -24, -23, -21, -16, + -9, 2, 6, 5, 5, 10, 15, 12, 3, -8, -16, -22, -29, -39, -44, -42, + -34, -27, -22, -21, -17, -8, 4, 19, 29, 40, 48, 53, 51, 49, 43, 38, + 28, 19, 6, -9, -19, -27, -30, -30, -24, -16, -10, -3, 3, 6, 5, 6, + 9, 11, 7, 2, -7, -16, -25, -34, -37, -37, -33, -31, -28, -27, -24, -20, + -10, 8, 22, 35, 46, 52, 53, 54, 49, 46, 37, 23, 9, -7, -18, -24, + -30, -32, -28, -22, -12, -5, 1, 6, 4, 8, 9, 11, 9, 3, -3, -13, + -21, -32, -37, -38, -35, -34, -32, -32, -32, -27, -14, 5, 24, 38, 48, 55, + 56, 56, 54, 50, 40, 23, 4, -10, -18, -24, -26, -29, -29, -24, -17, -5, + 2, 9, 9, 6, 6, 7, 12, 11, 6, -7, -18, -30, -36, -36, -37, -35, + -38, -40, -41, -36, -24, -2, 20, 35, 47, 55, 60, 62, 62, 61, 47, 26, + 7, -12, -18, -22, -24, -28, -33, -31, -24, -12, -2, 7, 9, 5, 4, 5, + 11, 14, 13, 7, -8, -24, -37, -41, -38, -34, -37, -44, -50, -46, -33, -10, + 16, 36, 49, 57, 61, 64, 66, 65, 55, 34, 11, -14, -24, -26, -26, -24, + -30, -34, -33, -24, -7, 5, 12, 10, 5, 6, 9, 16, 22, 21, 10, -10, + -32, -45, -44, -38, -38, -47, -61, -60, -48, -21, 11, 34, 51, 60, 63, 66, + 70, 69, 63, 45, 18, -10, -27, -27, -23, -20, -28, -36, -37, -32, -17, -2, + 8, 9, 5, 6, 8, 15, 24, 30, 25, 5, -22, -41, -44, -40, -38, -50, + -64, -72, -62, -37, -3, 29, 52, 62, 66, 69, 73, 78, 72, 54, 26, -5, + -25, -32, -29, -24, -27, -34, -37, -36, -26, -11, 5, 15, 15, 11, 9, 15, + 26, 35, 33, 14, -14, -37, -49, -47, -45, -51, -63, -72, -66, -42, -10, 22, + 49, 64, 69, 69, 70, 75, 73, 59, 34, 4, -20, -30, -30, -25, -24, -29, + -36, -40, -35, -22, -2, 16, 20, 17, 14, 15, 27, 39, 41, 27, -4, -32, + -48, -54, -53, -59, -65, -73, -71, -55, -23, 16, 49, 67, 70, 68, 71, 77, + 78, 65, 40, 10, -17, -31, -34, -28, -24, -26, -31, -40, -40, -30, -10, 10, + 21, 18, 15, 16, 26, 40, 48, 40, 13, -20, -44, -55, -61, -63, -69, -76, + -76, -63, -35, 6, 41, 66, 75, 71, 71, 75, 77, 67, 44, 17, -10, -25, + -34, -35, -29, -27, -28, -35, -40, -35, -18, 1, 16, 21, 20, 19, 25, 38, + 47, 43, 23, -9, -34, -50, -59, -65, -72, -76, -74, -66, -43, -9, 27, 58, + 71, 69, 70, 71, 73, 67, 48, 25, 2, -18, -28, -33, -29, -25, -25, -31, + -39, -41, -28, -10, 8, 19, 20, 23, 27, 36, 45, 45, 31, 4, -22, -45, + -58, -67, -74, -75, -73, -66, -50, -21, 16, 49, 67, 73, 72, 72, 74, 69, + 53, 33, 9, -11, -25, -34, -35, -31, -27, -30, -38, -43, -33, -16, 6, 18, + 24, 27, 30, 38, 45, 46, 34, 10, -16, -40, -61, -70, -77, -76, -72, -66, + -52, -31, 2, 36, 60, 71, 72, 69, 71, 68, 57, 44, 20, 2, -17, -32, + -36, -33, -31, -31, -40, -46, -41, -29, -5, 16, 27, 34, 35, 41, 49, 51, + 41, 17, -11, -34, -56, -71, -79, -80, -76, -68, -57, -36, -10, 21, 48, 64, + 71, 71, 73, 69, 61, 48, 32, 11, -5, -21, -31, -34, -34, -37, -43, -48, + -45, -34, -14, 8, 25, 34, 41, 43, 49, 51, 43, 26, -2, -27, -49, -65, + -74, -77, -74, -70, -58, -42, -20, 9, 38, 56, 64, 67, 69, 71, 66, 53, + 37, 16, 1, -15, -30, -33, -39, -38, -41, -45, -42, -35, -15, 7, 25, 36, + 41, 45, 49, 49, 40, 23, 1, -20, -41, -59, -71, -75, -73, -65, -57, -45, + -28, -6, 22, 42, 56, 63, 67, 71, 70, 59, 44, 28, 12, -3, -19, -32, + -40, -41, -46, -47, -46, -37, -20, -2, 20, 34, 45, 48, 52, 53, 42, 26, + 4, -15, -35, -51, -65, -70, -70, -68, -61, -50, -34, -15, 9, 28, 45, 54, + 64, 71, 72, 67, 53, 40, 24, 8, -10, -27, -37, -41, -49, -53, -53, -42, + -25, -8, 14, 31, 43, 52, 56, 56, 46, 30, 11, -8, -26, -43, -59, -70, + -69, -68, -62, -55, -44, -25, -4, 17, 36, 48, 62, 69, 69, 67, 57, 47, + 33, 17, -2, -21, -33, -41, -47, -52, -53, -43, -25, -10, 9, 23, 36, 46, + 52, 54, 47, 31, 14, -4, -19, -32, -49, -57, -62, -60, -57, -58, -51, -39, + -19, 6, 23, 38, 51, 60, 68, 71, 67, 58, 44, 27, 7, -17, -32, -41, + -47, -52, -54, -46, -31, -12, 7, 22, 35, 45, 51, 53, 46, 33, 18, 2, + -12, -26, -42, -55, -61, -60, -56, -57, -55, -46, -29, -8, 10, 27, 42, 55, + 65, 70, 69, 61, 49, 34, 16, -5, -23, -36, -45, -51, -54, -50, -35, -17, + 3, 17, 29, 37, 44, 51, 47, 39, 21, 6, -8, -20, -31, -44, -52, -58, + -60, -58, -58, -51, -39, -22, -4, 14, 31, 48, 62, 70, 69, 65, 57, 45, + 28, 7, -15, -31, -44, -50, -53, -50, -39, -24, -6, 11, 24, 33, 43, 46, + 45, 35, 25, 14, 1, -13, -23, -35, -44, -53, -57, -59, -59, -57, -47, -33, + -15, 3, 21, 39, 56, 69, 72, 69, 60, 49, 36, 17, -5, -25, -42, -52, + -52, -48, -40, -26, -9, 9, 20, 29, 34, 39, 40, 34, 25, 16, 6, -6, + -16, -27, -34, -44, -50, -55, -58, -57, -52, -41, -27, -11, 11, 31, 51, 67, + 70, 68, 61, 53, 43, 30, 7, -14, -35, -49, -54, -50, -40, -26, -13, -2, + 9, 22, 30, 38, 41, 36, 28, 20, 12, 4, -5, -15, -26, -41, -52, -58, + -60, -60, -59, -55, -41, -25, -5, 19, 42, 62, 74, 75, 70, 63, 55, 43, + 22, -3, -24, -42, -51, -50, -45, -32, -22, -14, -2, 14, 28, 35, 34, 33, + 30, 25, 21, 11, 4, -6, -18, -32, -46, -56, -61, -61, -62, -60, -51, -39, + -16, 11, 37, 58, 70, 75, 72, 67, 58, 46, 31, 10, -17, -35, -48, -49, + -41, -28, -17, -14, -7, 4, 18, 28, 32, 29, 27, 21, 19, 16, 7, 2, + -11, -22, -35, -48, -57, -61, -60, -60, -56, -47, -30, -5, 23, 48, 63, 72, + 75, 71, 64, 53, 39, 20, -2, -22, -40, -48, -45, -34, -21, -17, -10, -4, + 10, 22, 27, 28, 29, 26, 26, 22, 14, 7, -3, -14, -30, -46, -59, -65, + -65, -65, -64, -56, -41, -17, 15, 42, 62, 73, 77, 75, 69, 57, 43, 25, + 6, -12, -31, -44, -46, -37, -24, -16, -11, -3, 6, 20, 24, 23, 24, 23, + 25, 23, 16, 9, 1, -10, -23, -41, -56, -63, -67, -67, -66, -59, -47, -25, + 3, 32, 54, 70, 75, 76, 70, 62, 47, 32, 15, -3, -21, -38, -44, -41, + -31, -21, -15, -11, -2, 8, 18, 24, 27, 28, 29, 29, 24, 17, 8, -2, + -17, -35, -54, -66, -73, -74, -71, -66, -55, -35, -6, 24, 50, 69, 77, 79, + 74, 63, 51, 38, 22, 2, -17, -35, -42, -39, -32, -24, -17, -11, -5, 6, + 13, 20, 28, 31, 33, 29, 23, 15, 10, 3, -12, -30, -51, -65, -73, -75, + -71, -67, -58, -41, -18, 11, 38, 60, 75, 77, 74, 64, 53, 42, 31, 15, + -7, -25, -38, -40, -37, -29, -24, -15, -11, -2, 9, 17, 28, 33, 36, 33, + 27, 18, 13, 4, -8, -26, -48, -65, -75, -76, -72, -68, -58, -43, -18, 11, + 37, 58, 72, 76, 73, 63, 51, 40, 28, 13, -6, -23, -35, -41, -40, -33, + -24, -16, -9, -2, 7, 18, 29, 38, 42, 38, 31, 21, 11, 3, -10, -26, + -47, -65, -75, -79, -75, -69, -58, -39, -19, 7, 33, 54, 71, 77, 75, 66, + 52, 39, 27, 15, -2, -22, -35, -41, -41, -36, -27, -17, -8, 1, 11, 22, + 33, 41, 47, 45, 35, 21, 11, 4, -7, -24, -46, -66, -77, -81, -79, -73, + -62, -44, -24, -2, 23, 47, 69, 79, 79, 70, 57, 45, 33, 20, 5, -18, + -36, -43, -41, -37, -32, -23, -14, -3, 8, 20, 34, 45, 53, 52, 41, 27, + 16, 7, -5, -24, -47, -69, -83, -86, -84, -74, -62, -44, -22, 1, 24, 47, + 66, 78, 76, 69, 57, 43, 31, 17, 5, -13, -33, -43, -46, -41, -31, -22, + -12, 0, 11, 24, 39, 49, 57, 58, 48, 30, 15, 4, -8, -26, -52, -74, + -86, -89, -83, -74, -60, -43, -21, 1, 22, 45, 65, 78, 79, 68, 54, 40, + 26, 17, 7, -9, -31, -45, -46, -40, -31, -21, -11, 0, 8, 21, 39, 51, + 60, 60, 52, 36, 19, 4, -9, -25, -49, -71, -87, -92, -89, -79, -63, -45, + -24, 0, 22, 43, 65, 75, 80, 70, 57, 44, 30, 16, 2, -14, -31, -46, + -52, -47, -35, -21, -9, 1, 12, 26, 44, 59, 68, 68, 59, 42, 22, 6, + -11, -29, -49, -72, -87, -96, -95, -86, -67, -46, -23, -4, 16, 38, 59, 76, + 82, 74, 61, 45, 31, 20, 3, -14, -30, -44, -51, -51, -41, -26, -11, 3, + 13, 25, 44, 61, 71, 72, 59, 45, 28, 9, -10, -33, -53, -70, -83, -93, + -96, -91, -74, -53, -27, -6, 15, 35, 53, 71, 80, 77, 66, 51, 34, 20, + 3, -15, -30, -45, -53, -55, -48, -32, -17, 1, 16, 29, 47, 62, 73, 77, + 67, 50, 30, 9, -10, -32, -55, -73, -86, -93, -94, -90, -76, -54, -27, -4, + 17, 32, 48, 64, 74, 78, 68, 55, 38, 17, 1, -15, -28, -39, -47, -52, + -49, -37, -21, -3, 16, 31, 46, 61, 70, 75, 70, 55, 36, 13, -9, -32, + -56, -72, -84, -89, -93, -91, -81, -61, -30, -5, 18, 32, 45, 58, 71, 76, + 70, 57, 40, 18, 1, -17, -28, -35, -45, -52, -50, -39, -25, -7, 15, 33, + 48, 60, 67, 73, 70, 60, 42, 19, -8, -34, -57, -69, -77, -83, -87, -92, + -85, -66, -39, -10, 12, 27, 39, 52, 62, 73, 72, 61, 46, 25, 4, -14, + -27, -34, -41, -46, -48, -43, -30, -11, 14, 38, 53, 63, 66, 69, 72, 65, + 48, 23, -4, -31, -56, -72, -81, -83, -87, -91, -87, -72, -46, -15, 11, 28, + 40, 50, 60, 71, 75, 69, 54, 32, 8, -13, -29, -39, -45, -48, -50, -48, + -40, -21, 9, 37, 57, 66, 71, 74, 75, 71, 55, 32, 2, -29, -55, -73, + -81, -84, -87, -89, -88, -75, -49, -19, 10, 29, 39, 48, 53, 62, 72, 68, + 58, 35, 9, -11, -27, -34, -39, -42, -44, -46, -41, -26, 5, 35, 56, 65, + 69, 72, 73, 72, 59, 37, 9, -22, -50, -71, -83, -83, -83, -86, -88, -81, + -55, -24, 5, 24, 37, 48, 54, 59, 64, 66, 59, 41, 17, -9, -27, -36, + -38, -39, -42, -45, -41, -28, -2, 28, 53, 65, 68, 71, 71, 70, 58, 40, + 16, -14, -46, -67, -79, -81, -80, -83, -87, -83, -64, -36, -4, 19, 35, 46, + 51, 58, 65, 69, 64, 49, 26, -2, -25, -38, -41, -39, -40, -43, -45, -33, + -8, 24, 52, 65, 72, 74, 72, 66, 55, 40, 20, -7, -38, -65, -80, -85, + -80, -82, -84, -82, -65, -38, -9, 13, 29, 41, 49, 57, 62, 64, 59, 48, + 29, 6, -19, -36, -39, -37, -35, -38, -39, -31, -11, 19, 47, 63, 70, 71, + 71, 65, 55, 38, 17, -4, -33, -58, -76, -83, -79, -79, -80, -82, -70, -46, + -19, 8, 25, 36, 43, 51, 59, 63, 62, 50, 34, 14, -9, -27, -35, -38, + -36, -38, -39, -30, -15, 10, 34, 52, 67, 73, 74, 68, 54, 37, 21, 2, + -21, -45, -68, -78, -81, -81, -80, -79, -70, -51, -28, -4, 17, 32, 40, 48, + 56, 59, 57, 46, 34, 18, 3, -20, -34, -39, -35, -31, -30, -26, -13, 8, + 31, 48, 61, 67, 69, 66, 53, 38, 16, -4, -23, -41, -58, -72, -78, -80, + -76, -74, -64, -50, -33, -8, 12, 28, 35, 41, 50, 57, 53, 44, 31, 20, + 10, -8, -24, -34, -34, -30, -25, -21, -13, 5, 22, 38, 52, 61, 66, 65, + 53, 36, 15, -4, -18, -33, -45, -61, -73, -79, -78, -72, -62, -49, -33, -13, + 3, 19, 29, 38, 48, 52, 49, 41, 29, 22, 14, 2, -11, -25, -27, -25, + -20, -15, -8, 4, 19, 30, 42, 53, 57, 61, 50, 32, 15, -7, -18, -27, + -37, -50, -65, -73, -72, -66, -57, -49, -37, -19, -3, 13, 23, 32, 41, 44, + 41, 35, 29, 26, 21, 10, -2, -13, -21, -18, -14, -8, -4, 3, 12, 21, + 29, 42, 51, 54, 49, 32, 14, -5, -15, -22, -28, -39, -55, -69, -68, -62, + -52, -44, -37, -25, -11, 4, 16, 24, 32, 37, 35, 28, 23, 23, 23, 18, + 8, -4, -12, -12, -8, -2, 5, 9, 14, 18, 23, 31, 41, 45, 43, 29, + 11, -8, -18, -23, -21, -29, -43, -60, -65, -58, -50, -39, -32, -26, -17, -6, + 8, 18, 25, 31, 29, 24, 17, 20, 24, 25, 19, 8, 0, -5, -3, 4, + 11, 13, 12, 14, 16, 22, 31, 38, 37, 27, 9, -11, -22, -24, -22, -25, + -36, -50, -57, -53, -46, -37, -30, -24, -17, -9, 1, 10, 16, 20, 19, 17, + 13, 14, 21, 24, 24, 19, 10, 8, 9, 13, 18, 20, 15, 12, 11, 14, + 21, 27, 30, 21, 8, -12, -23, -24, -22, -20, -29, -40, -49, -47, -41, -33, + -26, -23, -20, -16, -11, -2, 7, 12, 14, 14, 13, 14, 19, 26, 30, 26, + 20, 11, 11, 16, 21, 26, 22, 18, 15, 14, 15, 19, 20, 16, 4, -15, + -29, -32, -27, -21, -24, -34, -40, -41, -33, -28, -24, -21, -20, -15, -14, -10, + -5, 1, 7, 10, 10, 12, 18, 26, 36, 34, 27, 21, 17, 20, 23, 25, + 24, 19, 11, 10, 9, 12, 16, 14, 3, -16, -32, -34, -27, -19, -20, -27, + -34, -35, -31, -27, -22, -18, -18, -19, -19, -20, -15, -7, 2, 6, 8, 9, + 18, 26, 38, 41, 37, 28, 21, 23, 25, 27, 25, 20, 13, 7, 3, 5, + 9, 11, 4, -14, -31, -35, -29, -20, -18, -23, -26, -32, -29, -25, -23, -15, + -17, -18, -21, -25, -23, -15, -6, 0, 5, 6, 16, 25, 37, 45, 43, 36, + 27, 25, 28, 30, 29, 26, 16, 7, -2, -2, 2, 3, -2, -15, -31, -38, + -35, -23, -15, -15, -19, -23, -26, -23, -21, -15, -12, -18, -24, -27, -25, -19, + -9, -3, 2, 5, 12, 19, 32, 42, 45, 41, 31, 28, 31, 33, 37, 33, + 26, 14, 4, -2, -3, -3, -5, -18, -34, -43, -42, -31, -20, -18, -17, -19, + -18, -16, -13, -9, -8, -13, -22, -32, -32, -28, -19, -11, -6, -2, 7, 18, + 31, 42, 46, 46, 41, 36, 32, 35, 39, 39, 30, 17, 5, -3, -3, -3, + -7, -19, -32, -39, -41, -36, -26, -17, -12, -13, -18, -20, -14, -7, -6, -11, + -23, -32, -34, -28, -23, -15, -9, -2, 9, 17, 28, 37, 44, 48, 45, 38, + 32, 35, 41, 45, 37, 23, 10, 1, -3, -5, -8, -20, -35, -44, -44, -42, + -34, -24, -14, -10, -12, -14, -11, -6, -2, -5, -15, -25, -32, -29, -24, -19, + -15, -10, 1, 10, 20, 31, 40, 45, 48, 43, 39, 39, 45, 51, 43, 28, + 15, 2, -4, -8, -13, -20, -34, -42, -45, -45, -36, -26, -13, -8, -11, -13, + -8, -2, 1, -4, -13, -22, -30, -33, -28, -25, -18, -12, -5, 3, 13, 25, + 37, 46, 47, 45, 40, 41, 47, 53, 49, 35, 21, 10, 2, -6, -11, -22, + -32, -43, -50, -50, -47, -34, -17, -9, -9, -12, -9, 3, 7, 4, -8, -18, + -25, -31, -31, -27, -21, -16, -11, -8, 2, 17, 31, 45, 47, 44, 40, 43, + 54, 60, 58, 42, 26, 14, 4, -5, -14, -26, -37, -47, -54, -53, -49, -38, + -22, -13, -9, -7, -3, 6, 11, 6, -5, -14, -22, -28, -31, -30, -29, -24, + -18, -15, -2, 14, 29, 42, 45, 47, 45, 48, 56, 63, 59, 46, 29, 17, + 5, -4, -11, -23, -36, -49, -53, -52, -48, -40, -29, -21, -16, -11, -2, 5, + 6, 3, -5, -10, -13, -17, -21, -25, -26, -23, -19, -15, -8, 5, 20, 31, + 38, 42, 41, 46, 55, 62, 63, 50, 36, 24, 12, 5, -7, -20, -33, -46, + -51, -51, -48, -40, -33, -27, -20, -15, 0, 9, 7, 1, -6, -10, -11, -16, + -22, -25, -30, -28, -25, -21, -11, 2, 17, 28, 32, 41, 47, 55, 64, 66, + 64, 54, 41, 32, 19, 4, -9, -24, -37, -48, -54, -55, -51, -41, -33, -29, + -24, -15, 0, 13, 14, 8, 1, -5, -6, -10, -17, -24, -30, -32, -33, -32, + -22, -9, 9, 21, 25, 35, 45, 56, 67, 71, 71, 63, 49, 37, 25, 11, + -5, -19, -32, -45, -54, -59, -54, -43, -36, -31, -27, -18, -3, 11, 13, 9, + 2, -3, -6, -9, -13, -20, -25, -29, -33, -30, -23, -9, 2, 11, 19, 28, + 40, 51, 63, 68, 71, 66, 55, 44, 31, 16, 1, -15, -30, -41, -50, -57, + -56, -46, -37, -32, -30, -21, -7, 8, 17, 12, 5, 3, -2, -6, -11, -19, + -23, -27, -33, -34, -28, -19, -6, 3, 13, 24, 38, 51, 62, 70, 72, 68, + 60, 48, 38, 22, 6, -13, -27, -39, -46, -53, -52, -48, -42, -37, -36, -25, + -9, 4, 11, 9, 7, 8, 6, 2, -6, -13, -20, -24, -28, -31, -30, -27, + -19, -10, 4, 19, 33, 45, 57, 67, 74, 74, 70, 60, 47, 31, 10, -8, + -25, -36, -42, -51, -56, -56, -51, -40, -35, -28, -16, -4, 7, 7, 10, 12, + 13, 11, 3, -8, -18, -21, -25, -29, -33, -33, -30, -20, -8, 11, 27, 42, + 54, 64, 72, 77, 76, 69, 56, 34, 14, -5, -20, -32, -43, -50, -57, -59, + -57, -47, -39, -31, -17, -5, 6, 8, 9, 17, 19, 16, 5, -9, -13, -18, + -21, -26, -33, -37, -35, -28, -15, 1, 18, 34, 47, 58, 68, 76, 77, 76, + 65, 47, 25, 6, -12, -24, -37, -49, -57, -62, -64, -58, -50, -40, -24, -12, + 3, 9, 13, 22, 26, 26, 17, 4, -9, -21, -25, -30, -36, -41, -44, -41, + -27, -8, 12, 31, 44, 57, 68, 77, 81, 80, 72, 56, 34, 12, -6, -19, + -30, -41, -53, -65, -68, -65, -56, -44, -30, -17, -8, 2, 10, 23, 31, 32, + 25, 10, -4, -14, -20, -25, -31, -39, -45, -45, -35, -17, 2, 22, 37, 51, + 63, 72, 79, 78, 74, 62, 43, 20, 2, -12, -24, -34, -49, -61, -69, -70, + -63, -48, -35, -23, -11, 0, 9, 20, 31, 36, 32, 20, 7, -9, -18, -24, + -30, -38, -47, -50, -44, -29, -9, 10, 27, 45, 60, 71, 78, 80, 78, 68, + 54, 33, 13, -5, -18, -29, -44, -57, -68, -74, -66, -54, -41, -30, -18, -5, + 8, 19, 26, 33, 32, 24, 13, -4, -15, -22, -24, -29, -40, -44, -42, -29, + -14, 0, 15, 31, 48, 63, 69, 74, 74, 72, 64, 47, 27, 11, -4, -17, + -33, -50, -66, -78, -78, -68, -54, -38, -25, -11, 4, 18, 31, 38, 40, 34, + 21, 5, -12, -23, -28, -34, -43, -50, -51, -39, -22, -6, 10, 26, 46, 61, + 70, 75, 79, 76, 67, 52, 34, 18, 4, -11, -27, -45, -63, -76, -78, -70, + -57, -44, -29, -15, 0, 14, 26, 35, 39, 34, 23, 9, -7, -18, -23, -30, + -40, -49, -51, -41, -24, -9, 5, 19, 39, 55, 67, 74, 77, 79, 72, 56, + 39, 24, 12, -5, -23, -42, -60, -73, -78, -74, -62, -48, -33, -18, -6, 10, + 25, 34, 37, 34, 26, 16, -2, -15, -23, -28, -32, -42, -46, -44, -31, -16, + -4, 11, 28, 44, 56, 64, 69, 75, 73, 63, 50, 37, 22, 6, -10, -27, + -47, -68, -81, -80, -68, -52, -39, -25, -13, 2, 17, 29, 36, 37, 32, 23, + 4, -14, -24, -26, -26, -36, -44, -45, -36, -20, -7, 9, 25, 38, 49, 58, + 66, 75, 77, 67, 52, 39, 26, 14, -3, -21, -43, -65, -81, -84, -74, -56, + -40, -27, -15, -2, 15, 27, 37, 38, 35, 26, 8, -11, -23, -26, -27, -34, + -42, -45, -40, -27, -13, 4, 19, 33, 45, 54, 60, 67, 72, 67, 57, 44, + 32, 20, 5, -11, -32, -55, -72, -82, -76, -62, -46, -31, -21, -5, 6, 19, + 29, 34, 33, 26, 12, -6, -17, -22, -23, -28, -38, -42, -38, -27, -14, 1, + 14, 27, 40, 48, 53, 62, 68, 67, 58, 44, 32, 21, 9, -5, -22, -43, + -63, -76, -75, -62, -46, -30, -24, -13, 0, 10, 20, 28, 31, 27, 12, -5, + -16, -20, -19, -21, -29, -35, -35, -27, -16, -6, 9, 21, 33, 41, 47, 53, + 61, 63, 60, 51, 39, 27, 15, 3, -13, -33, -55, -72, -75, -67, -52, -37, + -26, -18, -7, 4, 15, 26, 27, 25, 14, 0, -10, -15, -16, -19, -24, -31, + -32, -27, -17, -5, 5, 15, 26, 35, 43, 49, 54, 57, 57, 52, 42, 29, + 18, 10, -3, -23, -46, -64, -71, -66, -53, -39, -27, -19, -11, 0, 5, 16, + 22, 23, 15, 1, -10, -15, -18, -17, -17, -20, -24, -22, -14, -4, 7, 16, + 25, 31, 36, 41, 47, 49, 49, 46, 41, 32, 21, 13, 3, -14, -33, -51, + -60, -60, -52, -39, -28, -20, -14, -7, 1, 9, 14, 16, 10, 1, -10, -15, + -14, -15, -15, -15, -17, -14, -11, -4, 5, 13, 22, 29, 33, 35, 39, 43, + 45, 45, 42, 35, 26, 17, 7, -10, -25, -38, -48, -53, -53, -46, -33, -23, + -16, -13, -8, -3, 4, 9, 7, 1, -6, -10, -13, -12, -12, -8, -7, -6, + -2, 3, 6, 10, 14, 23, 28, 29, 30, 29, 34, 39, 40, 36, 30, 21, + 13, 1, -15, -27, -36, -44, -48, -45, -36, -26, -17, -13, -10, -6, -2, 2, + 3, -3, -6, -10, -14, -13, -12, -7, -3, 1, 2, 5, 6, 10, 15, 19, + 25, 25, 26, 26, 29, 34, 35, 32, 29, 20, 13, 4, -12, -20, -27, -33, + -38, -41, -36, -27, -19, -13, -10, -8, -8, -7, -5, -5, -7, -9, -13, -18, + -15, -12, -5, 3, 7, 10, 10, 11, 13, 20, 27, 27, 23, 20, 20, 24, + 27, 25, 26, 23, 17, 7, -6, -13, -16, -20, -26, -32, -33, -28, -20, -13, + -12, -12, -16, -15, -15, -12, -10, -13, -13, -16, -12, -7, 0, 9, 14, 18, + 18, 14, 11, 14, 18, 21, 17, 10, 11, 15, 20, 21, 20, 20, 17, 9, + 2, -5, -10, -14, -21, -25, -29, -27, -23, -17, -13, -13, -16, -18, -20, -20, + -12, -8, -9, -15, -16, -10, -2, 9, 14, 18, 18, 18, 14, 14, 17, 20, + 18, 12, 8, 11, 13, 16, 18, 19, 16, 9, 3, 1, 1, -6, -13, -20, + -23, -21, -19, -15, -15, -14, -17, -21, -22, -22, -17, -11, -11, -13, -18, -14, + -4, 12, 21, 22, 23, 21, 20, 17, 16, 16, 12, 7, 1, 5, 7, 8, + 12, 15, 15, 10, 3, 0, 3, 1, -5, -12, -19, -19, -16, -11, -9, -11, + -14, -23, -28, -29, -24, -17, -13, -15, -19, -18, -10, 7, 22, 29, 30, 24, + 22, 18, 17, 17, 11, 4, -2, -3, 2, 4, 8, 13, 16, 13, 7, 4, + 9, 8, 2, -7, -16, -15, -14, -12, -10, -12, -12, -19, -25, -29, -25, -18, + -15, -18, -21, -19, -12, 1, 16, 28, 34, 32, 29, 23, 18, 15, 11, 4, + -3, -10, -8, -5, 0, 7, 12, 14, 10, 6, 10, 15, 13, 3, -7, -11, + -13, -13, -13, -12, -14, -20, -28, -31, -29, -20, -13, -14, -18, -18, -15, -3, + 12, 24, 33, 32, 29, 25, 22, 16, 11, 3, -3, -6, -7, -8, -3, 2, + 8, 11, 11, 9, 10, 13, 13, 8, 0, -6, -9, -9, -9, -10, -11, -18, + -26, -30, -29, -22, -17, -18, -20, -21, -17, -7, 6, 21, 34, 38, 34, 29, + 21, 17, 13, 8, 1, -8, -13, -15, -10, -3, 5, 10, 11, 10, 11, 15, + 16, 11, 3, -4, -7, -9, -8, -10, -13, -19, -26, -26, -23, -17, -15, -16, + -17, -17, -15, -9, -2, 10, 26, 31, 31, 24, 21, 18, 13, 6, 1, -6, + -8, -9, -8, -4, 0, 6, 10, 12, 15, 14, 13, 9, 5, -2, -7, -8, + -9, -8, -10, -18, -25, -25, -23, -18, -16, -19, -22, -18, -16, -10, 0, 10, + 24, 33, 35, 29, 22, 17, 13, 7, -3, -8, -12, -14, -12, -7, -3, 4, + 10, 14, 16, 17, 16, 16, 11, 3, -7, -11, -10, -7, -10, -19, -26, -27, + -23, -17, -14, -14, -17, -18, -16, -12, -3, 7, 20, 26, 28, 24, 20, 16, + 15, 10, 2, -8, -13, -11, -7, -2, -2, 4, 6, 9, 14, 17, 19, 15, + 8, -4, -12, -15, -11, -5, -8, -18, -25, -24, -17, -9, -6, -7, -11, -15, + -15, -13, -6, 4, 11, 15, 16, 15, 16, 13, 9, 5, 1, -3, -7, -5, + -2, 3, 5, 6, 8, 10, 14, 17, 18, 14, 3, -8, -15, -13, -9, -6, + -9, -19, -22, -19, -13, -6, -4, -5, -8, -13, -15, -10, -5, 5, 8, 8, + 8, 11, 14, 14, 8, 2, 1, 1, 2, -2, 1, 5, 6, 7, 7, 6, + 11, 13, 16, 13, 3, -6, -13, -14, -8, -5, -6, -15, -20, -15, -10, -5, + -2, -6, -6, -8, -12, -10, -8, -3, 5, 3, 3, 5, 7, 10, 6, 2, + -3, -2, 2, 8, 9, 12, 11, 8, 9, 8, 11, 13, 11, 10, 0, -12, + -20, -21, -13, -10, -11, -14, -16, -10, -3, 4, 8, 5, 2, -2, -4, -4, + -7, -4, -4, -5, -7, -8, -5, 0, 2, 2, 0, 1, 6, 11, 15, 19, + 19, 18, 14, 10, 12, 12, 11, 6, -6, -16, -23, -23, -17, -13, -12, -12, + -13, -8, -2, 8, 13, 13, 8, 4, 1, -3, -3, -3, -4, -11, -16, -16, + -13, -9, -5, -4, -2, 1, 6, 13, 17, 21, 24, 23, 18, 14, 10, 11, + 12, 8, -3, -16, -26, -27, -20, -17, -21, -21, -17, -7, 2, 10, 16, 19, + 18, 13, 10, 5, 2, -2, -5, -14, -22, -26, -21, -15, -11, -11, -6, -2, + 6, 16, 22, 27, 28, 28, 23, 17, 13, 10, 12, 7, -4, -18, -29, -32, + -24, -20, -21, -22, -18, -5, 5, 14, 19, 21, 20, 17, 13, 8, 5, -2, + -9, -18, -26, -26, -21, -14, -12, -11, -8, -2, 10, 16, 21, 24, 25, 27, + 24, 16, 11, 6, 7, 6, -4, -16, -25, -29, -25, -19, -19, -22, -18, -7, + 6, 15, 17, 18, 19, 18, 15, 10, 8, 3, -5, -15, -24, -30, -27, -19, + -15, -15, -13, -8, 5, 14, 20, 25, 28, 31, 30, 26, 18, 11, 9, 7, + -2, -14, -27, -33, -30, -25, -25, -27, -26, -15, 2, 17, 22, 23, 23, 22, + 22, 18, 14, 7, -4, -14, -24, -31, -30, -25, -19, -16, -16, -11, -3, 8, + 17, 24, 29, 31, 31, 29, 22, 17, 12, 8, 2, -12, -26, -36, -35, -30, + -26, -26, -29, -20, -5, 13, 24, 26, 26, 26, 28, 23, 19, 11, 1, -9, + -24, -34, -33, -30, -24, -21, -21, -17, -11, 1, 9, 19, 27, 33, 34, 30, + 28, 24, 21, 16, 7, -6, -23, -35, -40, -36, -33, -31, -32, -27, -13, 3, + 17, 25, 29, 34, 34, 30, 23, 17, 11, 0, -14, -27, -32, -33, -30, -26, + -21, -18, -15, -9, 1, 11, 22, 29, 32, 33, 30, 28, 23, 21, 13, 3, + -15, -30, -37, -38, -35, -35, -33, -28, -18, -5, 10, 22, 30, 37, 36, 32, + 26, 21, 14, 7, -6, -19, -28, -34, -32, -27, -21, -20, -21, -20, -11, 5, + 17, 25, 29, 30, 33, 35, 31, 27, 19, 8, -7, -25, -37, -42, -41, -39, + -35, -30, -22, -11, 4, 21, 32, 38, 39, 36, 29, 22, 15, 9, -4, -15, + -24, -32, -35, -31, -24, -18, -18, -19, -14, -3, 11, 21, 27, 31, 32, 34, + 34, 31, 27, 18, 1, -19, -33, -39, -38, -40, -39, -35, -28, -17, -3, 14, + 28, 37, 41, 40, 34, 30, 24, 18, 7, -6, -20, -30, -36, -34, -30, -26, + -26, -27, -26, -16, 0, 16, 26, 30, 33, 36, 42, 43, 38, 27, 10, -10, + -27, -39, -43, -43, -43, -40, -34, -26, -14, 2, 21, 36, 42, 40, 36, 33, + 30, 24, 16, 5, -11, -25, -34, -35, -32, -29, -30, -31, -31, -27, -15, 5, + 21, 27, 30, 34, 42, 51, 48, 40, 20, -3, -21, -32, -38, -40, -43, -42, + -38, -30, -18, -3, 15, 29, 40, 41, 39, 34, 31, 28, 20, 10, -4, -18, + -29, -33, -34, -34, -35, -37, -38, -34, -21, -6, 12, 22, 26, 33, 44, 55, + 56, 46, 26, 5, -11, -25, -36, -42, -47, -47, -43, -37, -24, -11, 9, 25, + 36, 38, 38, 40, 39, 39, 28, 17, 3, -10, -23, -30, -37, -38, -42, -44, + -43, -40, -30, -16, 3, 17, 26, 34, 44, 57, 61, 52, 34, 9, -7, -21, + -30, -38, -46, -49, -48, -39, -27, -13, 5, 22, 32, 35, 35, 37, 41, 43, + 33, 19, 4, -8, -16, -25, -32, -39, -42, -44, -42, -41, -33, -20, -4, 11, + 21, 28, 38, 49, 58, 54, 36, 16, -6, -16, -21, -28, -36, -46, -49, -42, + -29, -17, 0, 13, 26, 30, 30, 35, 41, 47, 41, 25, 9, -4, -12, -17, + -28, -38, -46, -52, -51, -49, -39, -23, -9, 4, 12, 23, 39, 54, 66, 62, + 43, 23, 2, -10, -16, -26, -36, -45, -51, -50, -37, -20, 0, 16, 27, 28, + 29, 38, 47, 50, 44, 28, 13, -2, -10, -16, -26, -35, -45, -55, -57, -56, + -44, -27, -13, -4, 5, 17, 34, 53, 64, 64, 46, 29, 13, 1, -8, -17, + -28, -39, -48, -51, -42, -26, -8, 9, 18, 20, 24, 34, 46, 53, 47, 33, + 15, 4, -4, -13, -22, -35, -47, -56, -59, -56, -48, -32, -18, -8, 3, 14, + 33, 52, 65, 64, 49, 31, 17, 5, -3, -13, -25, -36, -45, -49, -44, -31, + -14, 7, 16, 21, 21, 31, 48, 57, 53, 38, 20, 8, -3, -9, -21, -35, + -47, -57, -62, -62, -54, -38, -22, -12, -5, 7, 26, 49, 66, 69, 56, 37, + 24, 15, 6, -4, -17, -30, -43, -53, -47, -34, -18, -2, 9, 14, 17, 29, + 46, 58, 56, 43, 25, 13, 2, -5, -15, -30, -45, -59, -66, -65, -57, -43, + -28, -16, -10, 2, 21, 44, 66, 71, 62, 43, 28, 19, 13, 3, -12, -25, + -42, -51, -50, -38, -18, -3, 5, 12, 17, 30, 48, 59, 58, 45, 26, 11, + 0, -6, -15, -29, -45, -63, -71, -68, -58, -41, -28, -19, -12, -4, 16, 42, + 62, 70, 61, 43, 29, 21, 16, 8, -6, -20, -35, -45, -45, -37, -21, -6, + 3, 8, 14, 24, 42, 54, 58, 47, 29, 16, 3, -3, -12, -27, -42, -62, + -73, -74, -66, -52, -34, -23, -14, -5, 12, 38, 60, 72, 68, 49, 34, 23, + 17, 10, -3, -18, -31, -42, -42, -36, -20, -4, 5, 9, 11, 22, 37, 51, + 55, 46, 29, 13, 2, -9, -14, -25, -38, -53, -67, -72, -67, -53, -35, -23, + -17, -10, 6, 32, 55, 69, 67, 53, 36, 26, 19, 12, 2, -13, -26, -37, + -40, -36, -24, -7, 3, 9, 13, 20, 36, 49, 52, 47, 32, 17, 3, -12, + -19, -29, -38, -52, -66, -75, -72, -56, -36, -20, -15, -10, 2, 25, 48, 63, + 63, 52, 39, 28, 20, 14, 5, -6, -19, -30, -38, -35, -25, -8, 4, 8, + 11, 17, 33, 47, 54, 47, 34, 18, 4, -9, -19, -28, -40, -53, -65, -75, + -74, -60, -41, -22, -15, -12, -2, 18, 43, 59, 63, 55, 41, 31, 27, 20, + 13, 3, -11, -24, -35, -34, -26, -11, 2, 8, 9, 11, 22, 37, 47, 49, + 39, 22, 6, -7, -19, -26, -36, -48, -60, -74, -77, -66, -47, -26, -13, -8, + 1, 15, 36, 53, 63, 56, 45, 30, 22, 16, 10, 5, -7, -19, -32, -34, + -25, -7, 8, 16, 17, 17, 23, 37, 48, 51, 40, 22, 4, -14, -24, -33, + -39, -49, -61, -72, -77, -66, -47, -27, -13, -5, 1, 13, 30, 47, 59, 57, + 47, 31, 23, 17, 15, 6, -5, -18, -26, -30, -24, -10, 8, 19, 21, 20, + 22, 30, 40, 48, 41, 25, 3, -17, -29, -32, -37, -46, -59, -70, -73, -65, + -46, -27, -14, -4, 3, 15, 29, 41, 52, 54, 45, 31, 19, 15, 15, 9, + 1, -14, -26, -27, -21, -8, 10, 17, 23, 23, 23, 32, 39, 45, 44, 29, + 7, -16, -32, -40, -42, -49, -61, -72, -76, -69, -50, -28, -12, -2, 5, 17, + 31, 43, 48, 49, 44, 34, 24, 15, 13, 9, 5, -8, -24, -27, -21, -7, + 10, 20, 25, 29, 29, 32, 36, 41, 41, 34, 14, -12, -35, -46, -49, -52, + -61, -74, -78, -73, -56, -31, -14, 2, 10, 19, 31, 44, 54, 53, 47, 34, + 24, 16, 9, 4, -2, -12, -25, -28, -22, -7, 9, 23, 32, 36, 36, 36, + 37, 42, 42, 33, 15, -14, -36, -50, -57, -56, -62, -74, -81, -77, -59, -36, + -15, 2, 11, 20, 31, 44, 56, 56, 51, 39, 26, 15, 7, 1, -3, -13, + -26, -33, -31, -14, 9, 25, 36, 41, 40, 41, 40, 44, 44, 35, 17, -13, + -39, -54, -61, -64, -69, -76, -81, -78, -63, -39, -15, 4, 14, 24, 35, 45, + 54, 56, 53, 41, 25, 14, 7, 3, -4, -14, -26, -34, -31, -15, 9, 25, + 36, 41, 43, 44, 43, 46, 45, 35, 16, -9, -31, -49, -63, -69, -75, -78, + -84, -79, -66, -45, -22, 0, 13, 23, 35, 48, 56, 58, 53, 43, 30, 19, + 10, 4, -7, -18, -26, -33, -30, -17, 4, 24, 37, 44, 50, 50, 49, 46, + 43, 35, 16, -7, -30, -52, -65, -75, -78, -83, -85, -82, -70, -50, -26, -4, + 14, 26, 39, 53, 63, 64, 59, 49, 35, 18, 6, -2, -13, -25, -35, -40, + -36, -22, 3, 26, 38, 47, 54, 60, 61, 57, 50, 39, 20, -5, -26, -49, + -66, -80, -87, -91, -93, -88, -74, -54, -34, -12, 8, 24, 40, 55, 68, 70, + 66, 55, 41, 26, 14, 6, -9, -25, -37, -43, -39, -28, -9, 15, 32, 41, + 48, 59, 65, 65, 58, 45, 25, 5, -17, -38, -61, -77, -91, -97, -100, -94, + -79, -64, -44, -23, -2, 24, 42, 57, 72, 77, 74, 63, 48, 33, 21, 10, + -7, -27, -43, -45, -41, -29, -14, 4, 26, 40, 49, 58, 66, 69, 64, 48, + 29, 7, -13, -31, -53, -73, -89, -100, -102, -95, -83, -67, -51, -29, -7, 17, + 37, 55, 72, 81, 77, 67, 55, 40, 25, 12, -4, -22, -40, -45, -42, -31, + -19, -4, 15, 34, 48, 55, 63, 67, 66, 57, 41, 20, -4, -25, -46, -69, + -88, -104, -110, -106, -95, -79, -63, -39, -13, 15, 39, 60, 75, 88, 91, 81, + 66, 44, 27, 13, -3, -22, -41, -50, -48, -38, -26, -13, 6, 29, 46, 55, + 62, 66, 69, 63, 48, 26, 5, -14, -33, -57, -84, -105, -115, -113, -102, -88, + -73, -53, -26, 1, 31, 57, 78, 91, 95, 88, 75, 60, 41, 22, 1, -19, + -38, -51, -53, -48, -36, -22, -6, 19, 39, 53, 62, 65, 69, 67, 55, 36, + 14, -6, -28, -54, -79, -100, -111, -116, -110, -98, -83, -61, -35, -6, 26, 53, + 75, 89, 96, 96, 87, 71, 50, 29, 10, -9, -30, -44, -53, -50, -45, -32, + -19, 2, 23, 43, 55, 62, 66, 66, 62, 49, 30, 11, -12, -39, -70, -95, + -112, -118, -118, -109, -94, -74, -48, -18, 17, 47, 70, 88, 98, 99, 95, 80, + 61, 37, 14, -9, -26, -43, -51, -52, -48, -40, -25, -6, 17, 37, 52, 57, + 63, 64, 62, 55, 36, 17, -8, -34, -62, -86, -106, -117, -118, -110, -99, -83, + -57, -27, 10, 42, 67, 85, 96, 101, 101, 91, 69, 46, 21, 1, -21, -38, + -49, -54, -49, -44, -35, -18, 2, 24, 44, 55, 64, 67, 63, 59, 46, 29, + 7, -21, -51, -79, -104, -117, -122, -117, -108, -94, -70, -40, 0, 34, 63, 85, + 96, 104, 105, 99, 82, 59, 31, 4, -20, -37, -46, -51, -51, -50, -44, -28, + -8, 17, 38, 53, 60, 65, 67, 64, 54, 40, 18, -10, -40, -71, -98, -115, + -121, -118, -113, -103, -82, -52, -14, 22, 53, 77, 94, 106, 109, 104, 93, 76, + 50, 21, -11, -33, -43, -48, -53, -56, -56, -46, -27, 2, 29, 48, 58, 62, + 63, 62, 58, 49, 33, 5, -27, -57, -87, -108, -119, -118, -114, -106, -91, -68, + -31, 8, 42, 69, 88, 102, 110, 110, 100, 83, 60, 33, 3, -23, -39, -46, + -52, -57, -57, -51, -35, -14, 15, 38, 54, 63, 65, 66, 58, 51, 40, 17, + -11, -44, -76, -101, -114, -116, -111, -106, -96, -77, -47, -11, 28, 58, 81, 97, + 109, 112, 105, 95, 77, 53, 23, -9, -30, -45, -52, -58, -64, -61, -52, -35, + -9, 20, 44, 62, 67, 67, 65, 62, 54, 35, 7, -24, -60, -91, -110, -119, + -116, -112, -105, -90, -65, -31, 8, 43, 73, 94, 109, 117, 113, 105, 91, 68, + 39, 4, -24, -43, -56, -64, -67, -67, -61, -47, -21, 9, 35, 55, 63, 66, + 66, 61, 56, 46, 23, -10, -46, -81, -100, -111, -115, -112, -107, -94, -75, -48, + -12, 28, 59, 84, 103, 116, 120, 114, 103, 81, 56, 22, -10, -35, -53, -64, + -71, -73, -71, -59, -39, -10, 19, 43, 60, 66, 68, 67, 64, 53, 33, 7, + -27, -64, -91, -108, -115, -113, -108, -97, -82, -59, -27, 11, 46, 75, 98, 112, + 119, 117, 109, 89, 64, 34, 4, -24, -50, -62, -69, -69, -70, -65, -49, -23, + 8, 32, 52, 61, 64, 65, 64, 55, 39, 15, -16, -46, -76, -97, -109, -110, + -107, -102, -91, -71, -42, -4, 34, 66, 90, 106, 116, 121, 118, 101, 78, 47, + 15, -15, -44, -60, -70, -73, -75, -74, -63, -39, -7, 23, 45, 60, 66, 69, + 69, 62, 49, 29, 1, -32, -65, -94, -108, -112, -109, -102, -97, -83, -58, -22, + 18, 54, 84, 103, 116, 121, 120, 112, 91, 63, 29, -6, -34, -54, -66, -75, + -79, -81, -72, -50, -22, 9, 33, 50, 59, 67, 70, 70, 60, 43, 13, -20, + -51, -78, -97, -107, -111, -109, -105, -94, -72, -37, 5, 42, 72, 96, 114, 124, + 127, 118, 100, 75, 42, 10, -22, -47, -62, -72, -79, -84, -82, -64, -35, -2, + 23, 39, 50, 61, 69, 71, 66, 51, 27, -6, -36, -62, -81, -96, -104, -105, + -106, -101, -83, -52, -11, 27, 57, 82, 103, 120, 127, 122, 107, 82, 53, 19, + -12, -39, -55, -65, -73, -81, -81, -67, -40, -8, 16, 30, 41, 52, 62, 68, + 66, 56, 34, 3, -28, -53, -71, -86, -96, -102, -106, -103, -88, -62, -25, 15, + 47, 72, 90, 109, 120, 123, 115, 93, 63, 31, 1, -24, -40, -52, -64, -76, + -82, -73, -50, -22, 1, 18, 27, 39, 51, 63, 67, 61, 44, 18, -13, -38, + -53, -69, -83, -96, -105, -103, -93, -69, -36, -3, 30, 56, 77, 95, 111, 116, + 113, 97, 72, 42, 13, -12, -25, -38, -54, -70, -79, -74, -57, -32, -11, 4, + 15, 26, 40, 55, 65, 62, 51, 28, 1, -24, -40, -56, -73, -89, -101, -102, + -95, -79, -50, -17, 16, 47, 68, 88, 104, 114, 115, 102, 80, 53, 24, 0, + -18, -31, -45, -60, -73, -74, -63, -42, -21, -6, 6, 16, 28, 45, 56, 59, + 51, 35, 14, -9, -26, -41, -57, -73, -87, -97, -95, -85, -62, -32, -2, 26, + 50, 71, 91, 105, 111, 105, 89, 64, 40, 16, -4, -20, -35, -49, -64, -70, + -68, -53, -35, -18, -6, 5, 14, 29, 45, 55, 54, 39, 21, 4, -13, -25, + -42, -63, -77, -89, -90, -80, -66, -44, -19, 10, 35, 57, 76, 93, 104, 104, + 91, 68, 48, 29, 13, -6, -24, -42, -56, -63, -61, -54, -42, -27, -17, -6, + 5, 18, 33, 44, 47, 39, 25, 10, 0, -14, -29, -50, -67, -79, -85, -81, + -70, -53, -32, -5, 24, 47, 67, 84, 98, 103, 95, 77, 56, 37, 22, 6, + -14, -34, -48, -56, -57, -52, -48, -37, -28, -17, -6, 8, 23, 34, 41, 38, + 28, 15, 4, -4, -16, -38, -59, -73, -78, -75, -66, -54, -37, -19, 7, 32, + 53, 72, 87, 95, 92, 78, 58, 44, 32, 20, 2, -21, -38, -47, -48, -47, + -46, -42, -36, -26, -14, -5, 9, 20, 32, 35, 30, 19, 12, 8, -5, -25, + -48, -63, -71, -70, -63, -58, -44, -26, -6, 20, 40, 59, 79, 92, 93, 83, + 60, 47, 37, 29, 13, -10, -28, -40, -44, -44, -48, -47, -41, -33, -22, -13, + 0, 14, 29, 36, 34, 24, 18, 15, 4, -13, -39, -60, -69, -72, -68, -62, + -51, -34, -13, 9, 31, 52, 73, 88, 95, 87, 70, 55, 45, 35, 20, -2, + -23, -36, -42, -47, -48, -51, -50, -40, -30, -17, -8, 7, 23, 36, 37, 30, + 22, 19, 13, -3, -24, -49, -65, -71, -71, -64, -54, -40, -20, -3, 21, 44, + 65, 85, 92, 87, 72, 57, 48, 39, 29, 11, -12, -27, -36, -41, -42, -47, + -49, -45, -37, -28, -17, -4, 13, 28, 33, 29, 26, 23, 17, 6, -11, -33, + -53, -64, -66, -62, -55, -44, -29, -12, 10, 31, 51, 71, 84, 85, 77, 61, + 50, 41, 36, 22, 2, -17, -33, -38, -42, -45, -48, -46, -41, -34, -23, -9, + 7, 24, 35, 32, 28, 23, 17, 10, -4, -26, -49, -64, -68, -64, -58, -46, + -32, -13, 8, 28, 45, 65, 78, 82, 76, 62, 52, 45, 37, 23, 6, -10, + -26, -35, -41, -45, -46, -48, -48, -39, -27, -11, 3, 14, 23, 27, 28, 25, + 23, 15, 2, -17, -34, -52, -60, -61, -56, -44, -32, -17, -3, 16, 34, 54, + 66, 73, 68, 58, 47, 42, 37, 29, 17, 3, -14, -25, -31, -36, -39, -44, + -48, -44, -33, -20, -9, 2, 13, 22, 26, 24, 20, 14, 5, -7, -22, -39, + -50, -55, -51, -43, -32, -20, -7, 10, 28, 44, 57, 65, 67, 64, 54, 44, + 36, 28, 18, 4, -9, -23, -32, -39, -42, -46, -44, -38, -29, -19, -12, -4, + 10, 22, 27, 22, 14, 8, 1, -6, -17, -30, -43, -49, -47, -38, -26, -18, + -10, 3, 17, 34, 45, 54, 59, 57, 53, 45, 37, 30, 22, 11, -3, -14, + -24, -34, -40, -45, -43, -39, -29, -21, -14, -6, 3, 16, 20, 17, 10, 3, + 0, -6, -15, -25, -33, -38, -37, -31, -21, -12, -6, 5, 15, 27, 39, 46, + 50, 51, 47, 44, 36, 29, 20, 10, 1, -10, -18, -27, -36, -40, -42, -37, + -29, -21, -14, -7, 1, 10, 16, 10, 3, -2, -3, -6, -12, -22, -28, -30, + -28, -23, -16, -11, -7, 0, 7, 19, 31, 42, 47, 47, 46, 46, 40, 33, + 21, 10, 2, -6, -12, -24, -33, -37, -38, -36, -31, -21, -14, -7, -2, 2, + 7, 8, 4, -2, -7, -12, -14, -19, -23, -24, -20, -16, -11, -6, -2, 3, + 9, 16, 24, 33, 37, 40, 44, 44, 40, 33, 22, 13, 5, -3, -8, -21, + -30, -35, -34, -32, -30, -23, -13, -6, -3, -3, -2, -2, -4, -7, -9, -12, + -13, -13, -14, -14, -11, -12, -4, -2, 2, 0, 3, 10, 18, 27, 32, 35, + 38, 40, 37, 32, 23, 13, 8, 2, -4, -11, -22, -27, -31, -30, -29, -24, + -14, -7, -8, -7, -10, -10, -10, -10, -11, -12, -13, -12, -11, -11, -7, -2, + 4, 5, 3, -2, 0, 8, 15, 21, 26, 30, 32, 37, 37, 32, 26, 16, + 10, 4, -4, -9, -16, -21, -26, -29, -28, -23, -15, -11, -9, -11, -13, -14, + -14, -13, -13, -12, -13, -12, -8, -3, 3, 6, 8, 10, 7, 1, -3, 2, + 8, 17, 22, 22, 27, 32, 37, 35, 29, 18, 11, 2, -4, -8, -14, -17, + -21, -23, -25, -22, -17, -11, -9, -11, -16, -16, -16, -16, -14, -15, -14, -11, + -5, 0, 4, 5, 6, 7, 6, 4, 0, 3, 8, 16, 21, 20, 24, 28, + 34, 35, 29, 17, 8, 3, 1, -3, -9, -15, -20, -21, -23, -22, -21, -17, + -13, -14, -18, -23, -22, -17, -13, -10, -9, -8, 0, 6, 9, 10, 8, 6, + 6, 4, 0, -2, 1, 10, 17, 20, 22, 25, 29, 31, 29, 20, 10, 2, + -2, 0, -5, -11, -18, -20, -19, -19, -19, -18, -16, -14, -18, -26, -26, -22, + -16, -13, -9, -6, 1, 7, 10, 10, 7, 7, 7, 5, 0, -4, -2, 7, + 14, 19, 22, 26, 30, 32, 30, 22, 13, 6, 1, -2, -7, -13, -16, -18, + -19, -19, -21, -21, -19, -17, -16, -23, -25, -23, -17, -10, -9, -4, 2, 8, + 10, 12, 9, 7, 5, 4, 2, -3, -2, 3, 9, 18, 23, 28, 29, 28, + 27, 26, 19, 12, 6, 0, -7, -11, -15, -17, -20, -21, -20, -22, -23, -25, + -24, -26, -27, -25, -20, -13, -5, 3, 9, 11, 15, 17, 15, 10, 4, 0, + -4, -5, -4, 2, 5, 13, 19, 25, 29, 28, 26, 25, 20, 16, 11, 2, + -5, -10, -10, -10, -14, -17, -21, -24, -26, -29, -27, -28, -28, -26, -23, -17, + -8, 1, 12, 15, 16, 14, 13, 10, 6, 0, -5, -6, -5, 1, 6, 12, + 20, 27, 30, 28, 24, 23, 21, 17, 11, 4, -6, -9, -10, -10, -11, -16, + -18, -21, -24, -26, -29, -28, -27, -25, -23, -18, -11, -2, 11, 15, 15, 12, + 11, 9, 6, 1, -6, -6, -2, 3, 7, 11, 19, 26, 28, 26, 22, 21, + 23, 24, 17, 10, 4, 0, -2, -5, -10, -15, -20, -25, -32, -36, -36, -35, + -32, -30, -26, -19, -10, 2, 14, 21, 21, 17, 13, 10, 7, 1, -5, -5, + -6, -4, 0, 6, 12, 19, 22, 24, 20, 21, 24, 29, 28, 20, 13, 8, + 3, 2, -4, -9, -16, -27, -34, -41, -44, -41, -38, -35, -31, -27, -18, -3, + 13, 26, 29, 23, 18, 14, 11, 8, 4, -2, -8, -11, -9, -6, 4, 9, + 16, 17, 16, 16, 23, 33, 37, 33, 26, 19, 12, 8, 1, -7, -15, -30, + -41, -50, -53, -50, -43, -38, -34, -28, -17, -3, 13, 26, 30, 26, 19, 14, + 12, 9, 4, -2, -10, -14, -13, -7, 4, 9, 12, 13, 13, 17, 25, 32, + 40, 39, 32, 24, 15, 11, 8, 1, -10, -27, -43, -51, -55, -52, -49, -45, + -40, -32, -21, -8, 9, 23, 31, 30, 24, 19, 17, 16, 11, 4, -7, -15, + -18, -14, -6, 2, 5, 7, 9, 14, 24, 35, 45, 48, 45, 34, 25, 16, + 8, 2, -11, -27, -46, -59, -64, -61, -53, -46, -40, -35, -24, -9, 8, 23, + 30, 31, 27, 24, 21, 17, 12, 4, -6, -15, -19, -17, -12, -3, 3, 4, + 6, 12, 25, 37, 45, 47, 47, 43, 35, 23, 12, 2, -10, -24, -42, -60, + -71, -71, -63, -55, -45, -36, -22, -7, 9, 22, 30, 35, 34, 31, 24, 19, + 13, 6, -3, -13, -20, -21, -16, -9, -3, -2, 4, 11, 26, 38, 45, 50, + 49, 48, 42, 31, 16, 4, -9, -21, -38, -59, -72, -77, -70, -61, -53, -41, + -26, -9, 7, 17, 26, 34, 41, 41, 35, 25, 17, 9, 0, -10, -21, -24, + -22, -15, -9, -7, -2, 10, 25, 39, 44, 47, 49, 52, 50, 39, 22, 6, + -8, -20, -34, -54, -70, -78, -77, -68, -61, -49, -33, -15, 3, 16, 25, 32, + 43, 49, 47, 37, 25, 16, 3, -10, -22, -29, -27, -22, -15, -12, -7, 7, + 25, 42, 47, 50, 53, 57, 57, 46, 31, 11, -5, -22, -39, -56, -72, -81, + -85, -81, -71, -56, -36, -16, 4, 19, 29, 37, 48, 55, 56, 48, 34, 20, + 7, -10, -25, -32, -34, -28, -21, -17, -14, 0, 20, 40, 50, 51, 53, 58, + 61, 53, 39, 18, -2, -18, -36, -53, -70, -80, -85, -86, -79, -67, -46, -23, + -2, 17, 27, 35, 44, 55, 62, 57, 44, 26, 9, -10, -23, -29, -32, -28, + -24, -20, -15, -4, 15, 35, 47, 50, 49, 53, 57, 53, 43, 24, 5, -14, + -32, -50, -64, -5, 0, -2, -3, -3, -3, -3, -2, -2, 1, 2, 3, 5, + 8, 11, 11, 10, 8, 5, 1, -6, -13, -19, -21, -18, -15, -13, -10, -7, + -2, 4, 8, 12, 17, 28, 33, 29, 23, 14, 7, -5, -19, -33, -42, -36, + -28, -24, -17, -13, -8, 1, 7, 15, 23, 33, 42, 42, 35, 26, 15, 0, + -16, -30, -44, -45, -34, -27, -20, -16, -13, -4, 4, 12, 21, 29, 40, 45, + 40, 30, 20, 6, -13, -25, -38, -45, -38, -31, -24, -18, -15, -10, -4, 5, + 17, 27, 35, 44, 43, 37, 27, 15, -4, -19, -31, -44, -44, -35, -30, -22, + -19, -16, -8, 2, 15, 25, 32, 42, 47, 42, 32, 18, 0, -16, -26, -39, + -45, -38, -31, -25, -19, -18, -14, -5, 11, 23, 29, 39, 46, 45, 38, 25, + 7, -8, -18, -31, -44, -43, -35, -30, -25, -25, -20, -9, 7, 21, 27, 36, + 48, 51, 44, 32, 14, -3, -16, -28, -42, -46, -41, -33, -27, -24, -23, -15, + 1, 16, 27, 33, 42, 47, 46, 38, 21, 5, -9, -21, -34, -44, -45, -39, + -31, -28, -26, -20, -8, 9, 25, 34, 41, 49, 51, 47, 31, 11, -6, -18, + -30, -42, -48, -45, -36, -28, -26, -23, -12, 6, 23, 33, 38, 43, 51, 50, + 36, 15, 0, -12, -22, -35, -50, -50, -40, -31, -29, -27, -18, 1, 20, 32, + 36, 43, 52, 56, 45, 23, 2, -10, -20, -33, -48, -56, -49, -36, -30, -26, + -18, -5, 17, 33, 39, 40, 46, 52, 49, 32, 9, -8, -18, -26, -40, -54, + -53, -39, -30, -28, -23, -12, 10, 31, 39, 38, 42, 54, 54, 41, 17, -5, + -15, -22, -35, -53, -59, -47, -36, -30, -24, -14, 6, 27, 40, 42, 43, 51, + 56, 46, 26, 3, -13, -22, -33, -49, -61, -55, -41, -32, -26, -18, 0, 22, + 38, 45, 43, 48, 55, 50, 33, 11, -10, -21, -29, -43, -59, -60, -46, -35, + -28, -18, -6, 15, 35, 45, 46, 45, 52, 53, 41, 20, -6, -19, -26, -38, + -54, -62, -53, -39, -29, -19, -11, 6, 29, 44, 48, 45, 47, 52, 49, 32, + 5, -18, -26, -32, -45, -61, -61, -48, -35, -23, -14, -2, 22, 42, 52, 50, + 46, 50, 50, 38, 12, -15, -26, -31, -43, -59, -65, -53, -37, -25, -16, -6, + 16, 40, 53, 53, 47, 49, 51, 42, 22, -10, -27, -31, -38, -54, -67, -63, + -46, -27, -18, -7, 10, 31, 52, 59, 53, 48, 50, 46, 32, 3, -24, -34, + -39, -50, -66, -68, -54, -35, -20, -8, 6, 23, 47, 62, 59, 52, 50, 48, + 37, 13, -18, -35, -40, -46, -62, -72, -63, -43, -25, -10, 6, 20, 41, 59, + 63, 55, 49, 46, 39, 21, -9, -31, -39, -42, -52, -68, -68, -52, -32, -17, + -4, 9, 31, 54, 66, 63, 54, 51, 44, 32, 6, -26, -40, -44, -51, -65, + -72, -61, -41, -23, -5, 9, 25, 48, 64, 66, 59, 54, 46, 33, 12, -17, + -36, -45, -51, -62, -73, -67, -48, -31, -11, 8, 21, 44, 64, 70, 64, 57, + 49, 36, 20, -8, -34, -47, -52, -58, -68, -73, -59, -40, -19, 4, 17, 36, + 58, 72, 73, 65, 56, 41, 26, 4, -24, -44, -55, -63, -69, -73, -66, -51, + -28, -2, 18, 32, 51, 67, 75, 72, 62, 46, 29, 11, -13, -37, -54, -64, + -70, -71, -70, -58, -38, -13, 14, 30, 48, 64, 73, 76, 69, 52, 34, 15, + -7, -31, -50, -62, -69, -71, -71, -66, -47, -19, 8, 26, 40, 58, 73, 81, + 76, 57, 39, 23, 2, -22, -45, -62, -71, -73, -71, -69, -57, -32, 0, 26, + 41, 55, 70, 81, 83, 64, 41, 24, 6, -15, -39, -60, -71, -73, -69, -69, + -62, -40, -11, 20, 39, 51, 65, 78, 86, 75, 50, 29, 11, -8, -30, -53, + -70, -77, -71, -66, -67, -53, -22, 13, 37, 49, 60, 75, 89, 84, 58, 33, + 16, -2, -22, -47, -68, -77, -72, -67, -68, -60, -34, 0, 29, 47, 56, 69, + 85, 88, 69, 40, 20, 4, -13, -35, -61, -76, -74, -65, -66, -65, -47, -15, + 20, 43, 53, 64, 81, 89, 77, 50, 26, 9, -10, -29, -51, -71, -78, -71, + -66, -64, -52, -27, 9, 38, 54, 62, 73, 85, 82, 60, 34, 13, -3, -19, + -40, -65, -80, -74, -68, -69, -61, -40, -4, 29, 49, 61, 72, 86, 86, 70, + 45, 21, 3, -16, -33, -56, -80, -78, -70, -70, -65, -50, -18, 20, 48, 62, + 68, 80, 88, 78, 53, 26, 5, -12, -26, -45, -72, -81, -71, -67, -64, -56, + -34, 4, 37, 57, 63, 73, 85, 83, 63, 37, 16, 0, -17, -36, -63, -79, + -74, -70, -69, -63, -44, -10, 26, 52, 62, 69, 81, 84, 69, 45, 22, 3, + -15, -28, -52, -75, -76, -69, -67, -64, -52, -24, 14, 45, 60, 65, 74, 82, + 75, 54, 32, 12, -6, -21, -44, -68, -78, -74, -71, -69, -60, -34, 2, 34, + 55, 66, 73, 79, 78, 61, 39, 20, 2, -16, -34, -56, -72, -74, -70, -71, + -66, -47, -14, 21, 48, 61, 68, 76, 80, 69, 46, 27, 11, -7, -26, -50, + -68, -72, -70, -70, -69, -54, -24, 10, 39, 57, 66, 72, 76, 70, 52, 33, + 16, -4, -20, -39, -59, -70, -71, -69, -67, -60, -37, -6, 27, 50, 62, 67, + 72, 74, 61, 41, 25, 10, -10, -31, -51, -67, -74, -73, -73, -68, -48, -16, + 17, 45, 60, 66, 73, 75, 66, 48, 29, 15, -3, -24, -45, -62, -70, -72, + -74, -70, -55, -26, 7, 32, 51, 63, 70, 73, 67, 51, 35, 24, 9, -16, + -38, -54, -64, -68, -75, -75, -62, -36, -5, 22, 45, 60, 69, 74, 68, 57, + 43, 29, 15, -9, -29, -45, -60, -67, -75, -76, -64, -44, -16, 10, 32, 52, + 63, 68, 66, 59, 48, 36, 24, 6, -17, -35, -51, -60, -70, -78, -72, -55, + -27, 1, 20, 39, 56, 65, 68, 60, 51, 41, 31, 15, -9, -27, -44, -58, + -67, -75, -73, -58, -35, -8, 11, 32, 50, 60, 61, 57, 53, 47, 37, 25, + 4, -19, -35, -48, -60, -73, -76, -67, -46, -18, 2, 20, 40, 56, 64, 62, + 56, 49, 43, 34, 15, -10, -31, -45, -57, -70, -78, -69, -52, -27, -4, 13, + 34, 52, 60, 57, 53, 52, 46, 36, 22, 1, -19, -35, -50, -65, -73, -70, + -58, -41, -17, 4, 22, 42, 55, 58, 57, 55, 50, 43, 32, 12, -11, -30, + -47, -61, -71, -72, -63, -46, -26, -6, 13, 30, 47, 53, 54, 56, 52, 46, + 38, 24, 5, -20, -39, -52, -63, -67, -66, -57, -37, -15, 3, 18, 37, 50, + 55, 59, 55, 49, 45, 32, 15, -10, -34, -50, -61, -66, -66, -58, -42, -24, + -4, 11, 27, 44, 50, 54, 57, 53, 49, 39, 23, 2, -23, -43, -57, -64, + -67, -62, -50, -33, -14, 4, 18, 37, 48, 53, 57, 55, 52, 44, 30, 13, + -14, -38, -54, -62, -65, -62, -54, -42, -24, -2, 13, 28, 41, 48, 56, 57, + 52, 45, 37, 23, 0, -28, -47, -57, -62, -63, -59, -50, -34, -14, 1, 16, + 35, 48, 56, 59, 59, 54, 45, 31, 8, -20, -42, -56, -62, -64, -60, -52, + -40, -23, -5, 10, 28, 43, 52, 56, 57, 56, 49, 38, 21, -8, -33, -46, + -56, -60, -59, -56, -47, -32, -15, 0, 17, 34, 47, 55, 58, 57, 53, 43, + 30, 8, -24, -42, -52, -59, -58, -57, -51, -42, -26, -8, 11, 29, 42, 50, + 57, 59, 55, 48, 34, 15, -15, -36, -45, -52, -55, -58, -55, -43, -31, -17, + -2, 16, 37, 50, 56, 58, 58, 54, 43, 23, -8, -33, -40, -47, -54, -57, + -58, -48, -34, -23, -10, 9, 31, 48, 54, 55, 55, 57, 50, 32, 3, -28, + -37, -41, -49, -55, -58, -49, -36, -27, -17, 1, 21, 41, 50, 52, 51, 54, + 55, 41, 13, -18, -32, -35, -42, -50, -57, -55, -41, -32, -24, -10, 10, 33, + 47, 50, 51, 54, 59, 49, 24, -8, -26, -30, -37, -46, -56, -59, -46, -35, + -29, -18, 2, 25, 44, 48, 47, 51, 57, 56, 36, 5, -20, -28, -31, -40, + -51, -58, -52, -39, -33, -25, -8, 15, 38, 49, 47, 50, 56, 60, 46, 15, + -11, -25, -30, -36, -49, -60, -54, -39, -33, -30, -14, 8, 32, 47, 44, 44, + 51, 59, 52, 26, -4, -20, -24, -29, -41, -54, -55, -43, -34, -33, -26, -8, + 17, 37, 43, 42, 48, 59, 60, 42, 13, -11, -21, -25, -36, -51, -59, -51, + -38, -34, -32, -17, 10, 33, 43, 43, 44, 55, 60, 46, 21, -6, -18, -22, + -28, -42, -54, -52, -39, -30, -32, -25, -4, 20, 36, 39, 39, 48, 60, 57, + 36, 10, -11, -19, -22, -34, -51, -58, -48, -35, -36, -34, -13, 13, 35, 41, + 38, 46, 59, 61, 44, 20, -5, -20, -22, -30, -46, -56, -53, -39, -34, -36, + -22, 1, 25, 39, 39, 42, 53, 60, 54, 34, 10, -10, -17, -21, -39, -57, + -59, -48, -38, -43, -35, -11, 16, 37, 43, 42, 52, 61, 58, 41, 19, -3, + -16, -21, -31, -50, -59, -53, -40, -39, -39, -22, 5, 30, 40, 38, 45, 58, + 64, 52, 28, 5, -12, -17, -23, -44, -58, -56, -46, -40, -43, -33, -7, 22, + 39, 41, 44, 55, 64, 60, 40, 13, -7, -16, -21, -35, -56, -60, -52, -44, + -43, -40, -21, 11, 34, 40, 40, 50, 61, 64, 53, 29, 6, -10, -16, -25, + -47, -62, -61, -53, -49, -47, -35, -5, 26, 42, 45, 49, 58, 65, 59, 39, + 15, -5, -16, -22, -37, -56, -61, -56, -50, -47, -42, -21, 11, 33, 40, 44, + 53, 63, 66, 54, 29, 8, -6, -15, -28, -52, -64, -60, -57, -53, -49, -31, + 1, 28, 40, 42, 51, 63, 66, 56, 36, 14, -3, -13, -25, -45, -61, -61, + -58, -54, -47, -38, -11, 20, 36, 41, 44, 55, 64, 60, 47, 28, 9, -4, + -15, -32, -56, -67, -64, -62, -55, -48, -27, 8, 29, 41, 47, 57, 66, 65, + 56, 39, 17, 0, -13, -27, -49, -66, -68, -67, -58, -48, -36, -8, 22, 38, + 45, 53, 63, 65, 61, 51, 28, 11, -4, -20, -40, -62, -70, -71, -68, -55, + -44, -24, 9, 30, 42, 52, 66, 69, 64, 58, 42, 20, 4, -14, -34, -57, + -71, -73, -73, -63, -51, -35, -5, 23, 38, 48, 62, 71, 69, 65, 54, 32, + 14, -6, -26, -48, -68, -79, -82, -72, -57, -42, -18, 11, 33, 48, 63, 73, + 72, 68, 62, 46, 22, 0, -21, -42, -63, -76, -83, -80, -65, -49, -28, -2, + 23, 42, 58, 71, 75, 72, 68, 56, 33, 10, -12, -32, -54, -73, -84, -87, + -73, -54, -36, -15, 11, 34, 52, 67, 73, 73, 72, 66, 48, 21, -6, -26, + -47, -67, -80, -88, -81, -62, -41, -23, 0, 27, 47, 65, 74, 74, 71, 67, + 57, 33, 4, -20, -42, -64, -77, -88, -88, -72, -49, -27, -7, 16, 40, 63, + 75, 75, 74, 69, 64, 46, 16, -13, -35, -57, -74, -87, -93, -81, -58, -35, + -17, 6, 33, 59, 73, 76, 76, 71, 68, 58, 29, -4, -29, -48, -68, -83, + -94, -92, -70, -42, -22, -4, 21, 51, 73, 78, 76, 73, 70, 63, 40, 7, + -24, -42, -60, -79, -91, -92, -76, -52, -30, -12, 9, 39, 66, 76, 76, 75, + 74, 70, 54, 24, -12, -36, -52, -72, -93, -100, -90, -64, -38, -21, -5, 25, + 61, 81, 81, 77, 78, 76, 63, 33, -5, -33, -49, -67, -90, -100, -92, -71, + -44, -21, -8, 14, 49, 75, 82, 77, 76, 75, 66, 45, 10, -27, -45, -59, + -80, -98, -98, -81, -52, -26, -12, 2, 34, 71, 86, 80, 75, 77, 71, 54, + 23, -17, -44, -57, -74, -93, -99, -87, -65, -36, -14, -4, 20, 55, 79, 82, + 78, 78, 75, 65, 41, 1, -34, -52, -67, -88, -104, -98, -76, -47, -23, -12, + 6, 45, 81, 90, 81, 79, 81, 72, 50, 11, -28, -50, -61, -81, -102, -103, + -84, -57, -30, -13, 1, 30, 70, 92, 88, 81, 80, 75, 59, 27, -15, -48, + -62, -76, -97, -106, -94, -69, -39, -16, -4, 17, 59, 92, 94, 87, 86, 83, + 67, 36, -4, -38, -61, -77, -96, -111, -102, -80, -53, -26, -8, 14, 50, 89, + 101, 93, 87, 83, 73, 46, 7, -31, -58, -72, -87, -106, -106, -88, -59, -31, + -12, 5, 33, 74, 99, 99, 90, 84, 78, 57, 22, -18, -49, -70, -84, -100, + -108, -96, -72, -43, -21, -3, 24, 61, 95, 106, 99, 90, 82, 65, 34, -6, + -40, -66, -83, -96, -106, -102, -82, -52, -27, -8, 15, 48, 86, 107, 105, 94, + 85, 73, 45, 6, -32, -61, -80, -91, -102, -106, -92, -63, -35, -15, 8, 37, + 74, 102, 109, 98, 87, 76, 54, 21, -16, -50, -76, -89, -98, -104, -98, -76, + -46, -23, -2, 25, 60, 93, 111, 106, 92, 82, 65, 35, -5, -39, -66, -83, + -95, -105, -105, -86, -57, -33, -11, 15, 50, 86, 111, 115, 102, 88, 71, 43, + 7, -32, -64, -86, -96, -100, -102, -92, -67, -40, -13, 13, 42, 75, 103, 116, + 106, 90, 74, 49, 16, -21, -54, -80, -94, -98, -100, -94, -75, -50, -23, 4, + 30, 62, 95, 117, 115, 100, 81, 57, 28, -10, -46, -75, -95, -102, -101, -97, + -83, -61, -32, -2, 24, 55, 87, 111, 118, 106, 88, 65, 35, 0, -36, -67, + -89, -101, -102, -98, -89, -68, -43, -13, 16, 46, 80, 107, 121, 116, 98, 75, + 47, 11, -27, -62, -87, -101, -104, -100, -93, -77, -51, -18, 13, 36, 67, 99, + 119, 119, 103, 81, 53, 21, -16, -52, -79, -96, -106, -102, -93, -82, -60, -30, + 3, 30, 59, 88, 111, 121, 111, 89, 61, 30, -4, -41, -74, -94, -106, -104, + -95, -87, -70, -41, -8, 22, 49, 81, 106, 120, 118, 98, 73, 41, 8, -30, + -64, -87, -104, -111, -100, -91, -77, -51, -21, 13, 41, 73, 100, 117, 122, 107, + 83, 52, 19, -18, -55, -82, -101, -111, -105, -93, -83, -60, -29, 5, 35, 64, + 92, 112, 121, 112, 88, 61, 29, -7, -45, -75, -94, -108, -108, -96, -87, -67, + -37, -5, 26, 52, 83, 105, 116, 116, 97, 70, 41, 7, -33, -67, -91, -105, + -110, -99, -88, -73, -48, -18, 15, 45, 74, 98, 114, 118, 104, 79, 51, 17, + -21, -58, -86, -102, -109, -103, -90, -77, -54, -23, 9, 36, 62, 88, 107, 114, + 107, 88, 63, 30, -8, -46, -77, -96, -107, -108, -97, -81, -63, -36, -4, 30, + 59, 84, 104, 115, 112, 95, 69, 38, 5, -33, -69, -94, -104, -105, -99, -87, + -72, -44, -11, 21, 47, 71, 97, 113, 113, 99, 77, 49, 17, -19, -57, -87, + -101, -105, -103, -90, -72, -54, -24, 10, 41, 64, 86, 104, 111, 104, 85, 57, + 25, -7, -42, -75, -96, -101, -98, -92, -79, -61, -36, -4, 28, 51, 74, 98, + 110, 107, 94, 70, 38, 5, -30, -64, -89, -101, -101, -95, -79, -63, -43, -14, + 21, 48, 68, 90, 105, 108, 97, 74, 44, 12, -20, -52, -83, -96, -96, -92, + -82, -67, -49, -24, 10, 39, 59, 79, 99, 107, 101, 83, 54, 21, -11, -41, + -71, -92, -98, -95, -84, -68, -54, -35, -5, 28, 54, 73, 92, 103, 103, 90, + 64, 31, -4, -34, -63, -85, -94, -92, -84, -70, -56, -38, -11, 19, 44, 64, + 83, 95, 98, 90, 66, 39, 9, -22, -50, -73, -86, -89, -84, -72, -59, -45, + -23, 6, 35, 58, 75, 89, 96, 92, 75, 49, 19, -14, -42, -63, -80, -88, + -84, -74, -60, -48, -30, -5, 23, 52, 70, 82, 91, 91, 79, 57, 29, -3, + -33, -54, -70, -84, -87, -79, -65, -50, -35, -16, 10, 41, 68, 80, 85, 88, + 82, 64, 36, 3, -28, -49, -60, -72, -83, -81, -66, -49, -37, -22, -2, 28, + 58, 74, 78, 83, 81, 69, 45, 14, -18, -42, -55, -66, -77, -79, -68, -53, + -39, -25, -8, 17, 46, 67, 72, 75, 74, 70, 53, 24, -9, -34, -48, -55, + -64, -74, -70, -55, -40, -28, -17, 3, 33, 61, 70, 71, 69, 68, 61, 37, + 3, -28, -44, -50, -57, -70, -73, -58, -41, -30, -21, -8, 21, 52, 67, 69, + 66, 66, 64, 44, 10, -22, -39, -48, -52, -61, -72, -62, -43, -29, -20, -12, + 7, 38, 62, 68, 61, 56, 60, 51, 23, -12, -36, -43, -44, -49, -65, -65, + -45, -29, -22, -19, -7, 24, 52, 65, 57, 52, 58, 57, 36, 0, -30, -38, + -37, -39, -55, -66, -52, -33, -23, -21, -14, 10, 40, 60, 59, 49, 51, 54, + 43, 11, -21, -35, -37, -33, -42, -55, -49, -29, -19, -20, -19, -5, 23, 49, + 54, 43, 42, 50, 49, 23, -12, -30, -34, -29, -31, -49, -54, -35, -19, -16, + -18, -11, 10, 39, 55, 45, 35, 41, 47, 31, -3, -26, -33, -28, -23, -36, + -47, -36, -18, -11, -16, -16, -3, 21, 42, 42, 32, 32, 40, 35, 13, -13, + -25, -24, -17, -22, -37, -38, -25, -16, -16, -19, -11, 7, 30, 42, 34, 27, + 33, 35, 19, -6, -21, -23, -17, -14, -23, -29, -21, -11, -10, -17, -16, -4, + 14, 30, 31, 20, 21, 29, 24, 6, -11, -16, -11, -5, -10, -20, -22, -15, + -12, -17, -21, -15, 0, 20, 29, 22, 17, 23, 25, 16, -2, -14, -14, -7, + -2, -9, -14, -12, -9, -11, -17, -17, -11, 3, 18, 17, 9, 13, 19, 17, + 7, -5, -5, 3, 8, 3, -7, -10, -12, -14, -20, -22, -17, -7, 9, 17, + 10, 8, 15, 18, 11, 2, -3, 1, 8, 9, 5, -3, -9, -12, -18, -21, + -21, -19, -4, 10, 9, 2, 5, 14, 16, 11, 4, 5, 13, 16, 14, 6, + -8, -14, -19, -23, -24, -21, -13, -2, 7, 3, -2, 8, 12, 11, 9, 10, + 14, 19, 20, 16, 4, -9, -17, -23, -26, -27, -24, -14, -2, 1, -5, 3, + 15, 17, 14, 14, 17, 22, 25, 20, 9, -8, -19, -25, -30, -29, -26, -22, + -11, 0, -3, -3, 9, 16, 19, 20, 21, 24, 28, 28, 20, 2, -16, -25, + -30, -34, -33, -32, -23, -9, -6, -8, 2, 15, 21, 24, 26, 29, 33, 34, + 30, 14, -11, -26, -33, -38, -38, -37, -34, -23, -12, -7, 0, 11, 21, 29, + 34, 35, 37, 39, 35, 21, -5, -26, -34, -39, -40, -42, -42, -31, -17, -9, + -4, 7, 19, 31, 38, 38, 41, 42, 40, 28, 3, -22, -36, -42, -45, -46, + -46, -37, -23, -14, -6, 6, 20, 32, 40, 40, 44, 46, 41, 31, 13, -12, + -32, -44, -47, -48, -49, -44, -32, -20, -8, 3, 15, 27, 40, 45, 47, 50, + 47, 39, 21, -6, -29, -42, -46, -51, -56, -52, -41, -24, -13, -4, 11, 27, + 41, 51, 52, 53, 52, 45, 29, 2, -25, -45, -50, -52, -57, -56, -49, -32, + -16, -4, 9, 22, 36, 49, 55, 56, 56, 50, 35, 11, -14, -37, -51, -57, + -61, -61, -56, -41, -23, -8, 8, 21, 33, 48, 61, 64, 60, 54, 40, 17, + -8, -34, -52, -59, -62, -63, -60, -49, -30, -14, 2, 19, 33, 47, 60, 66, + 67, 65, 50, 25, -3, -26, -47, -59, -68, -72, -66, -57, -38, -20, -5, 14, + 30, 44, 61, 71, 71, 68, 57, 34, 7, -20, -43, -58, -68, -72, -69, -62, + -45, -25, -10, 7, 24, 42, 59, 70, 74, 73, 65, 46, 16, -15, -38, -53, + -65, -77, -77, -70, -54, -34, -19, 0, 20, 41, 60, 74, 82, 80, 71, 54, + 27, -8, -36, -55, -68, -78, -82, -76, -61, -40, -20, -2, 17, 36, 57, 74, + 83, 82, 74, 62, 39, 3, -31, -49, -62, -75, -84, -84, -69, -47, -27, -13, + 6, 31, 56, 73, 82, 86, 80, 68, 49, 14, -24, -46, -60, -74, -83, -86, + -76, -54, -32, -15, 3, 23, 48, 71, 85, 87, 80, 71, 57, 27, -12, -41, + -57, -68, -78, -88, -84, -64, -41, -23, -5, 16, 40, 65, 84, 90, 87, 77, + 63, 36, -3, -34, -57, -69, -76, -85, -87, -73, -48, -27, -8, 13, 34, 60, + 83, 91, 86, 77, 66, 44, 9, -26, -53, -68, -74, -83, -88, -80, -56, -33, + -13, 9, 29, 55, 79, 93, 89, 76, 67, 52, 21, -15, -46, -69, -74, -77, + -84, -86, -67, -42, -20, 4, 23, 43, 71, 94, 95, 80, 67, 56, 32, 0, + -37, -66, -74, -73, -78, -87, -76, -50, -25, 1, 21, 37, 61, 88, 97, 84, + 67, 57, 38, 8, -25, -59, -77, -77, -76, -81, -80, -61, -34, -6, 20, 36, + 55, 80, 96, 91, 70, 54, 39, 17, -14, -51, -75, -79, -75, -77, -80, -68, + -40, -11, 15, 33, 48, 71, 92, 91, 73, 57, 45, 24, -3, -38, -68, -79, + -77, -76, -80, -74, -51, -19, 12, 32, 46, 65, 88, 96, 83, 59, 40, 24, + 4, -31, -67, -83, -80, -73, -73, -72, -55, -24, 9, 31, 44, 58, 78, 90, + 84, 63, 42, 28, 10, -18, -53, -77, -82, -76, -73, -74, -65, -37, -2, 27, + 42, 55, 73, 88, 90, 72, 47, 28, 13, -12, -45, -74, -84, -78, -70, -68, + -63, -43, -9, 23, 42, 52, 64, 78, 84, 75, 52, 32, 17, -3, -32, -62, + -79, -78, -71, -67, -65, -52, -19, 15, 38, 50, 61, 73, 80, 79, 59, 34, + 18, 3, -21, -51, -75, -81, -72, -64, -61, -54, -31, 4, 31, 48, 55, 63, + 73, 78, 67, 40, 21, 8, -12, -39, -65, -80, -76, -65, -58, -52, -38, -8, + 25, 45, 56, 61, 67, 74, 69, 47, 22, 7, -10, -31, -56, -75, -77, -66, + -57, -49, -37, -14, 16, 40, 53, 57, 61, 67, 69, 55, 30, 11, -6, -25, + -47, -69, -78, -70, -59, -51, -40, -20, 10, 34, 51, 58, 59, 63, 66, 59, + 36, 14, -2, -19, -40, -61, -75, -71, -59, -51, -41, -27, -2, 26, 47, 58, + 58, 59, 64, 63, 46, 19, -2, -17, -35, -56, -71, -75, -64, -50, -40, -26, + -6, 21, 43, 55, 57, 56, 58, 59, 47, 23, 1, -13, -29, -48, -63, -69, + -61, -48, -40, -29, -11, 13, 35, 48, 53, 51, 53, 57, 50, 33, 9, -10, + -25, -42, -56, -65, -64, -51, -40, -29, -13, 9, 30, 44, 50, 48, 47, 50, + 46, 35, 13, -8, -20, -33, -47, -57, -56, -48, -38, -30, -16, 1, 21, 35, + 44, 46, 42, 44, 44, 39, 21, -3, -18, -30, -40, -51, -57, -51, -37, -26, + -14, 0, 16, 33, 42, 43, 37, 34, 37, 35, 22, 1, -17, -27, -34, -41, + -48, -45, -36, -25, -11, 0, 11, 24, 34, 38, 35, 30, 29, 30, 24, 8, + -11, -24, -31, -36, -42, -42, -35, -25, -12, -2, 9, 21, 29, 33, 32, 27, + 25, 26, 23, 9, -8, -21, -31, -34, -36, -37, -33, -26, -13, -2, 8, 18, + 24, 28, 29, 27, 22, 20, 21, 14, -2, -17, -27, -30, -31, -33, -32, -26, + -14, -3, 6, 15, 22, 27, 26, 25, 22, 17, 17, 13, 3, -12, -25, -30, + -31, -30, -27, -24, -14, 0, 8, 16, 20, 22, 22, 21, 16, 11, 13, 13, + 3, -8, -21, -27, -26, -25, -25, -23, -12, 0, 6, 12, 18, 20, 22, 20, + 15, 9, 9, 10, 3, -9, -21, -29, -28, -23, -20, -19, -10, 3, 13, 17, + 19, 19, 21, 17, 11, 4, 1, 4, 0, -8, -17, -25, -24, -21, -19, -16, + -9, 4, 13, 17, 19, 20, 22, 19, 11, 3, -4, -3, -4, -12, -18, -26, + -28, -23, -16, -10, -5, 5, 18, 25, 25, 22, 21, 19, 9, 0, -9, -11, + -10, -13, -16, -24, -27, -22, -14, -8, -2, 7, 17, 25, 25, 22, 20, 17, + 10, -2, -10, -12, -13, -15, -18, -20, -24, -22, -16, -8, 3, 11, 17, 25, + 27, 23, 21, 17, 9, 0, -10, -12, -13, -18, -19, -20, -24, -23, -17, -10, + 0, 11, 19, 26, 30, 26, 24, 20, 12, 3, -8, -15, -18, -22, -25, -25, + -25, -24, -20, -12, 2, 15, 20, 25, 31, 33, 29, 23, 12, 3, -5, -15, + -23, -28, -28, -25, -22, -22, -18, -10, 2, 15, 19, 23, 30, 32, 28, 24, + 15, 7, 1, -13, -23, -27, -29, -28, -26, -24, -20, -14, -2, 13, 20, 24, + 32, 34, 32, 29, 22, 9, -2, -10, -21, -30, -34, -34, -29, -22, -20, -18, + -5, 14, 23, 25, 31, 36, 35, 30, 22, 10, 0, -8, -21, -34, -39, -36, + -32, -27, -20, -15, -5, 14, 27, 28, 32, 36, 35, 33, 25, 14, 0, -11, + -21, -34, -40, -41, -39, -30, -20, -13, -6, 10, 27, 30, 32, 35, 34, 36, + 29, 17, 5, -7, -16, -33, -45, -45, -43, -33, -24, -18, -9, 8, 26, 32, + 33, 39, 38, 36, 31, 20, 10, -6, -19, -32, -45, -47, -46, -39, -25, -12, + -3, 8, 22, 32, 32, 35, 35, 32, 31, 23, 14, 0, -15, -26, -43, -51, + -50, -43, -29, -17, -6, 5, 19, 34, 36, 33, 37, 37, 34, 25, 16, 5, + -11, -26, -41, -51, -55, -51, -36, -21, -7, 7, 16, 28, 37, 35, 35, 36, + 34, 30, 20, 9, -7, -22, -37, -49, -56, -54, -42, -25, -11, 2, 13, 24, + 35, 38, 37, 38, 37, 32, 25, 16, 1, -21, -38, -47, -56, -58, -50, -34, + -14, 4, 13, 20, 31, 40, 39, 35, 36, 34, 28, 20, 5, -15, -33, -44, + -55, -63, -54, -38, -19, -2, 10, 17, 30, 40, 41, 36, 38, 41, 33, 22, + 9, -13, -36, -50, -55, -63, -61, -44, -22, 2, 18, 22, 28, 38, 42, 39, + 34, 35, 34, 27, 14, -7, -29, -43, -51, -60, -63, -50, -30, -10, 8, 16, + 21, 32, 40, 40, 38, 39, 41, 35, 24, 6, -20, -41, -54, -62, -65, -58, + -39, -16, 7, 18, 22, 29, 39, 43, 40, 35, 38, 37, 27, 12, -14, -37, + -51, -58, -64, -64, -47, -22, -2, 14, 18, 24, 36, 44, 45, 41, 43, 43, + 32, 17, -8, -35, -54, -63, -67, -68, -56, -29, -4, 16, 24, 26, 35, 44, + 47, 43, 38, 38, 36, 24, 0, -30, -50, -57, -59, -63, -61, -40, -11, 11, + 20, 20, 26, 39, 48, 46, 40, 39, 42, 33, 12, -20, -47, -58, -60, -62, + -61, -49, -23, 2, 17, 21, 22, 33, 48, 51, 45, 43, 43, 38, 20, -10, + -41, -58, -61, -64, -62, -55, -35, -9, 10, 21, 23, 32, 50, 57, 49, 45, + 45, 43, 26, -6, -38, -58, -62, -65, -67, -61, -44, -15, 10, 23, 26, 28, + 44, 59, 55, 46, 42, 41, 33, 6, -30, -57, -64, -62, -64, -62, -50, -26, + 2, 18, 26, 28, 39, 59, 60, 48, 43, 43, 37, 14, -22, -53, -67, -63, + -65, -66, -55, -33, -2, 19, 28, 31, 37, 55, 64, 53, 41, 39, 37, 20, + -16, -48, -66, -65, -62, -66, -60, -43, -12, 15, 26, 31, 37, 53, 69, 63, + 46, 39, 38, 27, -5, -44, -72, -73, -65, -65, -63, -52, -24, 11, 31, 36, + 38, 48, 65, 70, 53, 38, 34, 28, 5, -35, -69, -78, -70, -65, -63, -53, + -30, 2, 26, 38, 43, 49, 62, 69, 58, 40, 33, 28, 9, -25, -61, -78, + -75, -69, -64, -55, -37, -7, 22, 36, 43, 49, 57, 66, 62, 44, 31, 29, + 15, -16, -52, -76, -77, -69, -63, -57, -44, -16, 14, 33, 42, 48, 54, 65, + 68, 52, 33, 27, 19, -6, -41, -72, -82, -74, -65, -59, -48, -24, 7, 29, + 43, 50, 53, 60, 67, 58, 39, 28, 22, 2, -31, -64, -82, -79, -71, -61, + -49, -31, -2, 22, 40, 51, 55, 58, 65, 63, 46, 29, 21, 9, -21, -56, + -79, -83, -77, -65, -54, -37, -10, 16, 36, 50, 57, 60, 65, 64, 50, 33, + 22, 11, -13, -47, -73, -82, -80, -70, -57, -42, -19, 8, 30, 49, 58, 61, + 62, 64, 56, 41, 24, 11, -6, -35, -66, -80, -82, -75, -61, -45, -25, -2, + 22, 43, 57, 63, 64, 63, 58, 49, 31, 15, -2, -26, -58, -79, -85, -81, + -66, -49, -31, -9, 17, 39, 55, 64, 69, 67, 61, 53, 35, 16, 1, -20, + -49, -75, -86, -85, -74, -54, -34, -11, 11, 33, 53, 64, 70, 68, 59, 51, + 40, 22, 5, -15, -40, -66, -79, -81, -78, -63, -41, -19, 4, 25, 44, 58, + 67, 72, 65, 57, 47, 29, 11, -8, -31, -61, -81, -85, -82, -68, -47, -25, + -3, 21, 44, 59, 68, 73, 68, 56, 47, 33, 15, -7, -27, -52, -76, -82, + -82, -72, -52, -30, -7, 13, 36, 57, 67, 74, 72, 61, 48, 36, 20, -4, + -25, -47, -71, -81, -81, -75, -56, -33, -10, 11, 30, 49, 63, 73, 74, 63, + 48, 37, 25, 6, -20, -41, -63, -79, -81, -77, -65, -43, -19, 4, 25, 45, + 63, 73, 76, 70, 55, 41, 28, 10, -15, -38, -59, -77, -83, -79, -70, -49, + -25, -4, 20, 40, 59, 74, 76, 73, 62, 46, 33, 16, -10, -34, -51, -68, + -83, -85, -75, -58, -34, -11, 14, 35, 55, 73, 79, 76, 69, 51, 33, 20, + -2, -30, -53, -67, -81, -84, -76, -61, -39, -14, 11, 32, 49, 67, 77, 74, + 68, 55, 37, 23, 5, -22, -45, -59, -73, -84, -82, -68, -46, -24, 3, 26, + 43, 62, 75, 74, 72, 61, 42, 25, 10, -15, -40, -57, -70, -83, -84, -71, + -49, -28, -6, 20, 41, 59, 72, 72, 69, 63, 48, 29, 13, -8, -31, -51, + -66, -79, -84, -75, -56, -37, -16, 12, 36, 55, 71, 74, 72, 69, 54, 34, + 16, -5, -28, -47, -61, -75, -85, -80, -60, -38, -20, 4, 30, 53, 68, 71, + 69, 67, 57, 39, 20, 0, -21, -41, -58, -71, -79, -79, -66, -45, -25, -3, + 23, 45, 61, 68, 69, 70, 63, 47, 29, 8, -16, -37, -56, -71, -80, -81, + -71, -52, -30, -7, 17, 41, 60, 67, 67, 68, 65, 50, 30, 10, -14, -31, + -47, -65, -77, -79, -70, -53, -33, -14, 8, 34, 56, 62, 62, 66, 64, 54, + 36, 15, -8, -27, -42, -61, -73, -75, -70, -56, -36, -14, 5, 26, 49, 60, + 59, 61, 60, 54, 42, 23, -2, -22, -35, -53, -69, -75, -70, -58, -41, -20, + -3, 18, 43, 59, 57, 57, 60, 56, 44, 28, 7, -17, -32, -47, -63, -73, + -72, -62, -46, -23, -6, 12, 35, 55, 60, 57, 59, 56, 49, 35, 14, -13, + -28, -40, -58, -72, -73, -62, -50, -31, -13, 5, 30, 51, 59, 56, 58, 61, + 56, 38, 17, -9, -26, -37, -52, -68, -74, -63, -50, -32, -14, 1, 22, 45, + 57, 56, 51, 54, 54, 41, 21, -4, -22, -31, -44, -59, -69, -63, -48, -36, + -21, -7, 11, 35, 52, 56, 53, 54, 58, 48, 30, 8, -17, -32, -43, -57, + -68, -69, -56, -39, -22, -8, 6, 28, 49, 57, 54, 51, 55, 52, 35, 13, + -13, -29, -36, -49, -64, -70, -58, -39, -23, -11, 0, 19, 43, 57, 55, 47, + 49, 55, 43, 18, -9, -28, -35, -42, -57, -69, -65, -45, -25, -11, 1, 14, + 37, 55, 60, 50, 45, 48, 42, 21, -4, -25, -35, -40, -50, -60, -61, -46, + -27, -15, -6, 6, 25, 46, 56, 50, 43, 45, 47, 33, 9, -15, -30, -37, + -45, -58, -64, -56, -36, -18, -8, 4, 18, 40, 58, 59, 47, 39, 41, 35, + 12, -15, -32, -38, -39, -46, -57, -55, -37, -17, -7, 1, 11, 27, 48, 56, + 47, 37, 38, 38, 21, -6, -24, -32, -37, -43, -54, -57, -44, -25, -9, 2, + 11, 24, 44, 57, 51, 38, 32, 31, 21, -5, -28, -35, -36, -36, -45, -51, + -41, -25, -8, 3, 8, 17, 33, 48, 49, 37, 31, 30, 25, 7, -18, -30, + -34, -37, -40, -48, -47, -33, -16, 1, 11, 16, 28, 42, 50, 43, 30, 25, + 22, 10, -12, -28, -33, -34, -35, -41, -44, -33, -18, -2, 9, 12, 20, 32, + 43, 41, 29, 24, 22, 14, -3, -21, -29, -30, -31, -35, -41, -35, -21, -6, + 9, 13, 18, 27, 38, 42, 29, 18, 16, 13, 4, -15, -27, -28, -27, -28, + -34, -34, -23, -10, 5, 11, 14, 22, 32, 37, 31, 20, 16, 12, 6, -9, + -22, -25, -27, -26, -32, -34, -27, -15, 0, 10, 12, 18, 28, 36, 35, 23, + 14, 11, 8, -3, -19, -28, -28, -25, -27, -32, -28, -16, -2, 11, 14, 14, + 22, 30, 31, 24, 15, 11, 8, 2, -11, -22, -25, -25, -26, -30, -28, -18, + -7, 5, 12, 14, 19, 27, 30, 26, 19, 13, 9, 4, -6, -20, -26, -23, + -24, -27, -27, -19, -6, 4, 12, 12, 13, 22, 26, 22, 15, 11, 10, 6, + -2, -12, -19, -19, -21, -25, -25, -20, -11, -3, 5, 9, 13, 19, 24, 24, + 21, 15, 12, 7, 2, -9, -20, -22, -22, -23, -24, -22, -11, -2, 7, 11, + 13, 17, 21, 21, 18, 13, 11, 7, 1, -7, -15, -19, -19, -21, -20, -18, + -12, -4, 2, 8, 11, 15, 17, 16, 15, 13, 11, 8, 4, -3, -11, -16, + -15, -19, -20, -16, -12, -5, 2, 5, 8, 14, 17, 15, 11, 10, 9, 8, + 4, -2, -6, -11, -12, -14, -18, -13, -7, -6, -3, 2, 6, 10, 13, 13, + 9, 8, 9, 6, 1, 0, -5, -9, -12, -12, -13, -12, -4, 1, 3, 4, + 4, 7, 11, 10, 7, 3, 3, 4, 2, -2, -3, -6, -7, -6, -6, -8, + -5, 2, 1, 1, 0, 1, 5, 5, 3, 0, 0, 5, 5, 2, 3, 0, + -3, -5, -6, -8, -7, -2, -3, -4, -2, -2, 3, 6, 4, 1, -3, 1, + 5, 3, 2, 0, -2, -3, -4, -5, -5, 1, 2, -3, -3, -4, -3, 4, + 4, 0, -5, -3, 3, 3, 2, 1, 1, 0, 0, 0, -3, -2, 1, -2, + -4, -3, -4, 1, 5, 2, -5, -7, -2, 2, -2, -2, 0, 2, 3, 2, + 2, 3, 6, 4, -2, -5, -6, -2, 3, -2, -9, -11, -5, 0, -3, -4, + -2, 3, 7, 8, 4, 2, 4, 3, 0, -6, -8, -6, 2, 4, -3, -10, + -10, -5, -2, -4, -5, -3, 5, 11, 11, 8, 5, 5, 4, -2, -9, -9, + -2, 0, -5, -13, -14, -10, -5, -4, -2, 2, 6, 14, 15, 11, 8, 6, + 1, -5, -10, -12, -6, 1, -2, -10, -15, -11, -4, -3, -6, -5, 2, 14, + 19, 14, 10, 10, 8, 3, -6, -15, -12, -4, -4, -12, -18, -17, -10, -2, + 0, 1, 6, 16, 25, 21, 12, 8, 4, -2, -8, -18, -20, -11, -6, -9, + -14, -14, -10, -3, 0, 1, 6, 13, 23, 25, 17, 13, 9, 1, -6, -13, + -18, -14, -11, -13, -17, -19, -14, -8, -3, 1, 7, 14, 24, 30, 24, 16, + 12, 4, -5, -11, -18, -19, -15, -12, -14, -19, -18, -14, -9, 0, 8, 13, + 19, 27, 28, 22, 18, 9, -4, -11, -14, -16, -15, -16, -16, -17, -16, -14, + -13, -6, 4, 12, 19, 26, 31, 27, 19, 13, 3, -8, -12, -16, -18, -19, + -17, -16, -20, -18, -15, -10, 1, 10, 18, 24, 31, 30, 22, 18, 9, -4, + -10, -14, -17, -20, -22, -19, -19, -22, -18, -13, -2, 9, 16, 21, 29, 36, + 29, 19, 12, 1, -7, -10, -15, -22, -24, -20, -18, -21, -21, -17, -8, 7, + 16, 23, 27, 33, 35, 26, 17, 7, -5, -11, -14, -22, -27, -24, -19, -22, + -25, -19, -11, 5, 16, 21, 25, 33, 38, 31, 18, 9, -2, -10, -13, -22, + -29, -28, -21, -18, -24, -22, -15, -3, 14, 21, 24, 30, 38, 36, 24, 13, + 4, -5, -9, -16, -28, -32, -25, -21, -25, -27, -18, -7, 8, 18, 24, 31, + 40, 40, 29, 16, 6, -3, -8, -16, -27, -31, -27, -22, -24, -27, -21, -10, + 4, 16, 22, 28, 37, 40, 33, 19, 7, 1, -5, -12, -23, -32, -28, -23, + -23, -27, -26, -15, -2, 13, 21, 25, 34, 41, 38, 28, 14, 4, -3, -11, + -22, -34, -35, -30, -26, -28, -29, -20, -3, 14, 24, 27, 32, 41, 42, 34, + 17, 4, -4, -11, -20, -32, -38, -33, -28, -27, -27, -22, -9, 7, 20, 29, + 34, 39, 40, 37, 24, 10, 2, -7, -16, -28, -40, -40, -33, -29, -28, -27, + -16, 5, 21, 28, 32, 36, 41, 40, 30, 12, 1, -6, -11, -22, -37, -42, + -34, -30, -29, -27, -20, -3, 16, 27, 32, 34, 39, 41, 35, 20, 6, -4, + -11, -16, -32, -45, -41, -33, -31, -27, -23, -10, 13, 28, 33, 35, 38, 39, + 36, 25, 8, -6, -11, -14, -26, -42, -45, -34, -29, -25, -23, -15, 6, 26, + 36, 36, 36, 37, 36, 29, 14, -2, -12, -14, -23, -42, -50, -42, -32, -23, + -18, -15, 3, 25, 38, 39, 35, 35, 37, 33, 18, -3, -15, -18, -20, -34, + -48, -47, -34, -22, -14, -12, -4, 17, 35, 41, 37, 34, 33, 33, 24, 6, + -13, -22, -22, -30, -45, -51, -39, -23, -10, -6, -3, 13, 32, 41, 37, 30, + 29, 31, 27, 10, -10, -22, -23, -26, -38, -48, -44, -28, -12, -5, -3, 9, + 27, 38, 38, 32, 28, 29, 27, 17, -4, -21, -26, -27, -35, -47, -49, -33, + -12, 2, 5, 9, 23, 35, 40, 34, 21, 23, 25, 22, 5, -20, -28, -28, + -29, -39, -50, -43, -19, 3, 10, 7, 15, 29, 41, 43, 28, 22, 23, 22, + 12, -16, -33, -32, -32, -38, -46, -43, -21, 3, 15, 13, 16, 29, 35, 35, + 27, 19, 19, 19, 15, -8, -30, -31, -30, -32, -40, -44, -29, -2, 18, 17, + 11, 22, 34, 37, 32, 21, 18, 20, 17, -2, -28, -37, -34, -34, -38, -42, + -30, -7, 16, 22, 16, 20, 31, 31, 29, 23, 17, 18, 19, 6, -21, -37, + -35, -34, -35, -38, -35, -15, 14, 27, 21, 13, 23, 31, 31, 26, 16, 12, + 16, 12, -10, -35, -39, -35, -36, -36, -34, -21, 6, 24, 24, 16, 20, 29, + 28, 27, 22, 16, 17, 15, -4, -29, -41, -39, -40, -39, -36, -29, -6, 20, + 27, 21, 19, 28, 33, 31, 27, 18, 14, 13, 2, -22, -41, -43, -40, -39, + -34, -28, -12, 16, 28, 24, 19, 25, 29, 27, 24, 19, 15, 12, 4, -15, + -34, -41, -40, -37, -32, -26, -18, 5, 24, 24, 20, 21, 26, 27, 26, 24, + 18, 12, 6, -9, -30, -44, -45, -41, -33, -26, -19, -2, 23, 29, 24, 22, + 24, 28, 25, 22, 18, 13, 7, -7, -24, -40, -46, -42, -36, -28, -21, -6, + 15, 28, 25, 22, 25, 29, 28, 23, 20, 14, 6, -6, -22, -40, -47, -42, + -36, -28, -23, -10, 13, 30, 28, 21, 23, 27, 28, 21, 18, 16, 9, -2, + -17, -33, -44, -44, -38, -31, -23, -14, 5, 25, 32, 25, 23, 26, 29, 24, + 16, 13, 8, -2, -15, -31, -43, -44, -37, -30, -23, -14, 1, 21, 31, 27, + 22, 24, 28, 25, 17, 13, 10, 3, -10, -27, -40, -44, -38, -32, -26, -17, + -3, 16, 31, 31, 25, 25, 30, 29, 17, 8, 7, 3, -8, -25, -39, -43, + -37, -31, -27, -18, -4, 13, 29, 32, 26, 24, 27, 27, 17, 9, 8, 6, + -5, -20, -34, -39, -37, -34, -30, -21, -8, 6, 23, 34, 31, 29, 28, 27, + 22, 13, 6, 5, -4, -18, -34, -40, -37, -34, -29, -23, -10, 5, 21, 32, + 29, 27, 29, 26, 20, 12, 4, 3, 0, -12, -28, -37, -35, -31, -29, -23, + -13, 1, 16, 30, 33, 29, 27, 25, 21, 15, 5, -2, -3, -9, -22, -35, + -36, -31, -29, -24, -14, 0, 12, 27, 35, 31, 29, 26, 21, 16, 8, -2, + -3, -7, -19, -34, -36, -32, -31, -28, -18, -3, 11, 22, 32, 32, 30, 29, + 23, 16, 11, 2, -3, -6, -17, -32, -37, -32, -30, -31, -23, -6, 9, 18, + 30, 36, 32, 31, 25, 17, 13, 4, -6, -8, -14, -26, -36, -34, -31, -31, + -25, -11, 6, 16, 24, 34, 35, 33, 28, 17, 16, 10, -3, -9, -13, -23, + -34, -36, -32, -31, -27, -16, 2, 16, 22, 30, 35, 33, 30, 21, 15, 11, + 0, -7, -11, -20, -31, -35, -31, -31, -29, -21, -6, 13, 21, 25, 32, 34, + 33, 26, 18, 13, 4, -6, -10, -19, -29, -34, -34, -29, -27, -24, -12, 7, + 20, 25, 30, 33, 32, 29, 21, 13, 7, -5, -11, -18, -28, -35, -36, -29, + -25, -24, -16, 3, 21, 26, 28, 34, 37, 34, 26, 12, 4, -5, -13, -20, + -30, -35, -39, -35, -24, -19, -13, -2, 15, 27, 30, 32, 34, 31, 28, 18, + 5, -6, -15, -20, -24, -31, -37, -35, -24, -19, -16, -9, 8, 24, 30, 30, + 33, 35, 35, 24, 5, -5, -11, -20, -27, -34, -40, -39, -30, -21, -16, -9, + 4, 20, 32, 36, 36, 36, 35, 31, 13, -3, -13, -23, -27, -29, -41, -44, + -33, -19, -11, -10, -4, 14, 32, 38, 34, 33, 36, 33, 18, -4, -13, -20, + -25, -28, -37, -43, -34, -22, -14, -8, -4, 9, 26, 39, 38, 35, 35, 34, + 23, 3, -12, -21, -28, -28, -31, -41, -40, -27, -15, -7, -6, 2, 20, 37, + 42, 36, 34, 35, 28, 9, -10, -18, -24, -26, -29, -38, -42, -32, -21, -11, + -6, -3, 12, 33, 45, 41, 37, 37, 29, 13, -4, -17, -26, -28, -28, -33, + -39, -37, -26, -15, -8, -7, 6, 29, 47, 46, 39, 34, 30, 20, 1, -18, + -26, -26, -25, -29, -37, -40, -31, -17, -8, -7, 0, 20, 42, 51, 45, 38, + 30, 18, 7, -10, -24, -27, -26, -24, -29, -38, -37, -27, -14, -9, -6, 11, + 36, 51, 47, 42, 34, 24, 14, -3, -20, -25, -23, -22, -26, -37, -42, -33, + -17, -8, -7, 4, 28, 50, 54, 45, 35, 24, 15, 3, -16, -24, -25, -22, + -23, -32, -41, -37, -22, -11, -8, 0, 21, 44, 54, 46, 34, 26, 18, 7, + -11, -22, -21, -20, -21, -28, -40, -43, -30, -15, -10, -3, 16, 40, 56, 52, + 37, 24, 16, 9, -6, -21, -22, -18, -17, -22, -35, -43, -34, -21, -14, -9, + 7, 34, 53, 54, 40, 29, 21, 14, 4, -14, -21, -17, -17, -22, -33, -46, + -45, -31, -16, -8, 4, 25, 50, 60, 49, 31, 20, 15, 9, -5, -17, -18, + -15, -17, -26, -42, -50, -40, -24, -11, -2, 18, 43, 56, 52, 35, 21, 17, + 11, 0, -12, -18, -14, -15, -22, -36, -50, -46, -30, -15, -3, 12, 35, 53, + 55, 41, 24, 18, 12, 5, -4, -15, -18, -15, -20, -33, -46, -49, -37, -21, + -7, 7, 25, 46, 54, 45, 27, 18, 14, 10, 3, -8, -15, -16, -18, -28, + -41, -49, -44, -29, -12, 4, 17, 35, 49, 49, 34, 19, 16, 15, 9, 1, + -10, -14, -16, -24, -38, -50, -49, -36, -18, -3, 10, 26, 43, 49, 38, 22, + 18, 20, 16, 9, -5, -13, -16, -23, -36, -50, -53, -43, -25, -8, 6, 21, + 38, 48, 44, 27, 19, 21, 19, 13, -2, -13, -17, -21, -30, -45, -52, -46, + -29, -10, 3, 14, 29, 42, 44, 30, 17, 19, 21, 17, 6, -8, -14, -19, + -26, -39, -49, -48, -36, -18, -2, 11, 27, 37, 42, 37, 22, 18, 21, 19, + 9, -5, -13, -18, -24, -33, -45, -46, -39, -24, -8, 6, 20, 33, 40, 38, + 27, 19, 22, 23, 17, 4, -8, -14, -22, -29, -43, -48, -43, -32, -16, -2, + 13, 25, 34, 39, 33, 23, 21, 23, 20, 9, -4, -11, -19, -25, -33, -43, + -42, -34, -20, -7, 3, 14, 24, 32, 31, 22, 20, 26, 28, 20, 6, -5, + -11, -18, -28, -42, -44, -38, -28, -15, -5, 8, 19, 28, 31, 24, 21, 25, + 27, 22, 10, 0, -6, -12, -22, -34, -38, -34, -30, -20, -11, 0, 11, 20, + 26, 23, 19, 22, 27, 25, 17, 7, -2, -7, -17, -29, -35, -35, -34, -26, + -16, -5, 7, 15, 23, 28, 24, 21, 22, 24, 20, 11, -2, -8, -14, -24, + -29, -31, -31, -27, -18, -9, 0, 8, 15, 22, 23, 20, 21, 24, 24, 19, + 7, -4, -10, -19, -26, -32, -34, -33, -24, -12, -2, 6, 14, 22, 26, 23, + 22, 22, 22, 21, 10, 0, -6, -15, -21, -24, -28, -31, -28, -17, -7, 2, + 7, 13, 19, 23, 23, 21, 19, 21, 18, 8, -2, -11, -17, -21, -24, -30, + -33, -25, -11, 0, 4, 9, 16, 20, 21, 20, 18, 18, 20, 14, 4, -6, + -12, -15, -17, -25, -32, -32, -20, -6, -3, -3, 7, 18, 23, 19, 16, 19, + 26, 24, 11, 0, -6, -9, -15, -25, -33, -35, -26, -15, -9, -6, 5, 17, + 22, 21, 17, 18, 25, 26, 16, 4, -5, -7, -9, -18, -29, -38, -35, -21, + -11, -9, -4, 9, 22, 25, 20, 16, 22, 30, 24, 8, -4, -5, -5, -13, + -25, -36, -38, -26, -16, -11, -10, 2, 19, 25, 18, 12, 19, 30, 28, 14, + 1, -2, 3, -3, -17, -31, -36, -29, -21, -18, -19, -11, 7, 20, 16, 10, + 16, 30, 36, 24, 8, 4, 8, 6, -12, -32, -40, -35, -26, -21, -20, -14, + 2, 19, 20, 10, 12, 24, 35, 29, 13, 5, 7, 9, -3, -23, -37, -37, + -31, -23, -21, -19, -8, 12, 19, 10, 6, 19, 36, 37, 23, 11, 12, 16, + 7, -15, -35, -43, -38, -30, -27, -23, -16, 2, 18, 16, 7, 13, 30, 38, + 29, 17, 12, 16, 15, -4, -27, -40, -39, -32, -28, -28, -24, -8, 12, 14, + 5, 7, 26, 40, 36, 24, 18, 21, 21, 4, -20, -38, -41, -37, -34, -30, + -26, -15, 4, 14, 7, 3, 18, 37, 41, 33, 24, 22, 25, 14, -10, -33, + -44, -42, -36, -32, -29, -22, -6, 10, 9, 2, 9, 29, 40, 37, 32, 28, + 29, 21, 0, -24, -39, -44, -44, -38, -31, -24, -16, 0, 7, 3, 8, 24, + 38, 43, 41, 32, 28, 25, 9, -15, -34, -44, -44, -39, -31, -26, -20, -10, + 3, 2, 1, 14, 32, 44, 46, 39, 33, 31, 20, -7, -31, -45, -47, -44, + -38, -30, -26, -16, 0, 5, 4, 12, 30, 45, 52, 47, 36, 30, 22, 0, + -24, -40, -50, -49, -42, -31, -24, -19, -10, -3, 3, 11, 24, 39, 51, 55, + 49, 37, 27, 8, -18, -36, -50, -54, -47, -36, -29, -25, -16, -6, 4, 10, + 18, 34, 52, 59, 53, 39, 28, 15, -8, -29, -45, -53, -51, -43, -34, -29, + -23, -14, -4, 7, 17, 33, 52, 62, 61, 50, 37, 23, -4, -28, -44, -55, + -55, -48, -38, -30, -25, -18, -8, 5, 13, 25, 46, 61, 65, 57, 43, 30, + 8, -17, -36, -50, -55, -53, -47, -39, -32, -24, -15, -3, 11, 25, 45, 62, + 68, 63, 51, 37, 14, -14, -34, -46, -56, -57, -51, -44, -33, -25, -18, -6, + 8, 19, 36, 55, 67, 65, 53, 42, 23, -4, -26, -40, -50, -56, -54, -49, + -41, -31, -23, -12, 1, 15, 34, 53, 65, 68, 59, 49, 33, 6, -21, -37, + -47, -57, -60, -56, -48, -38, -28, -16, -2, 14, 33, 51, 64, 70, 63, 53, + 38, 13, -14, -34, -44, -53, -59, -59, -53, -42, -30, -19, -8, 5, 26, 47, + 61, 68, 64, 57, 48, 26, -3, -26, -39, -49, -58, -63, -59, -49, -37, -24, + -13, 1, 20, 42, 55, 65, 69, 64, 54, 34, 7, -18, -34, -44, -55, -65, + -64, -54, -42, -31, -19, -8, 12, 37, 54, 61, 67, 67, 60, 46, 22, -8, + -29, -40, -50, -64, -70, -63, -50, -34, -21, -13, 2, 28, 51, 62, 68, 68, + 61, 51, 32, 3, -23, -36, -47, -60, -70, -67, -58, -44, -27, -14, -2, 22, + 45, 58, 65, 70, 68, 56, 38, 16, -11, -32, -45, -58, -69, -70, -62, -52, + -34, -17, -6, 13, 38, 54, 64, 70, 67, 59, 47, 29, -2, -28, -40, -51, + -65, -74, -67, -54, -37, -20, -11, 5, 33, 53, 59, 63, 67, 62, 51, 34, + 7, -20, -35, -46, -59, -72, -70, -60, -46, -27, -12, 1, 24, 47, 60, 64, + 69, 66, 54, 39, 15, -13, -32, -44, -54, -68, -71, -60, -48, -32, -18, -7, + 14, 38, 54, 61, 68, 70, 60, 46, 26, -2, -23, -38, -50, -63, -72, -68, + -55, -39, -24, -13, 5, 31, 52, 61, 67, 71, 64, 53, 34, 7, -21, -36, + -46, -57, -69, -72, -60, -42, -27, -17, -2, 21, 45, 58, 65, 69, 66, 57, + 42, 15, -13, -30, -43, -54, -66, -72, -65, -47, -30, -18, -5, 15, 40, 57, + 64, 67, 62, 56, 46, 23, -6, -27, -39, -50, -58, -67, -67, -51, -32, -20, + -9, 9, 31, 51, 60, 64, 64, 58, 48, 27, 1, -20, -34, -46, -56, -65, + -70, -57, -37, -22, -14, 2, 26, 48, 62, 66, 64, 59, 51, 34, 8, -18, + -31, -42, -52, -61, -70, -63, -42, -24, -15, -3, 19, 43, 60, 63, 60, 57, + 52, 39, 14, -14, -28, -36, -46, -54, -65, -66, -49, -29, -17, -9, 10, 33, + 54, 64, 62, 58, 53, 42, 23, -5, -25, -35, -46, -54, -63, -67, -54, -33, + -17, -7, 7, 30, 51, 61, 58, 55, 51, 43, 28, 3, -21, -30, -37, -46, + -56, -63, -56, -39, -22, -12, -5, 16, 40, 57, 58, 55, 53, 48, 38, 19, + -10, -27, -35, -45, -56, -66, -65, -49, -28, -14, -6, 8, 34, 57, 60, 55, + 54, 50, 42, 26, -4, -28, -35, -42, -52, -62, -63, -51, -32, -14, -5, 3, + 24, 47, 57, 53, 50, 47, 41, 33, 11, -20, -35, -40, -46, -56, -65, -58, + -38, -17, -4, 1, 15, 41, 57, 55, 47, 45, 42, 35, 17, -13, -33, -38, + -41, -49, -58, -55, -41, -21, -4, 0, 7, 29, 50, 52, 45, 42, 40, 37, + 25, 0, -28, -38, -38, -44, -53, -58, -46, -26, -6, 3, 4, 18, 42, 53, + 47, 41, 39, 37, 30, 10, -21, -41, -43, -41, -47, -54, -46, -29, -8, 7, + 9, 13, 31, 46, 45, 37, 33, 33, 28, 15, -10, -35, -42, -38, -39, -45, + -46, -32, -10, 6, 9, 8, 19, 38, 44, 38, 30, 29, 30, 19, -3, -29, + -42, -38, -34, -40, -43, -32, -14, 3, 11, 11, 15, 30, 41, 39, 30, 25, + 25, 19, 4, -21, -40, -42, -32, -30, -33, -29, -15, 2, 11, 10, 8, 17, + 30, 35, 30, 23, 24, 23, 11, -11, -32, -43, -34, -26, -29, -29, -18, -3, + 9, 12, 9, 12, 26, 35, 32, 21, 18, 18, 12, -6, -29, -43, -36, -22, + -22, -25, -15, 1, 10, 11, 10, 8, 17, 29, 29, 21, 16, 17, 15, 2, + -21, -39, -39, -24, -17, -20, -16, -5, 9, 13, 10, 7, 12, 24, 28, 23, + 14, 12, 11, 4, -14, -33, -39, -28, -15, -14, -12, -6, 5, 11, 9, 7, + 7, 16, 26, 25, 16, 10, 11, 6, -8, -24, -37, -32, -17, -12, -11, -5, + 5, 11, 11, 10, 7, 12, 21, 21, 16, 7, 4, 3, -6, -20, -32, -32, + -20, -8, -5, 0, 5, 11, 11, 9, 8, 8, 13, 17, 16, 9, 3, 2, + -3, -13, -25, -31, -23, -9, -4, -2, 5, 11, 14, 11, 7, 6, 12, 15, + 12, 5, -2, -2, -3, -11, -22, -29, -24, -9, 0, 3, 8, 13, 13, 12, + 8, 4, 5, 7, 9, 6, -3, -5, -4, -5, -14, -24, -23, -13, 0, 4, + 6, 10, 14, 14, 9, 3, 3, 5, 6, 4, -4, -6, -5, -5, -9, -18, + -20, -15, -4, 6, 9, 11, 13, 13, 10, 5, 1, 0, -3, 0, -4, -6, + -6, -5, -4, -11, -16, -16, -9, 3, 8, 11, 11, 10, 11, 8, 3, -2, + -5, -4, -3, -5, -6, -6, -2, -5, -12, -15, -13, -2, 8, 9, 11, 11, + 11, 7, 4, 0, -6, -6, -4, -4, -6, -6, -2, 0, -7, -13, -15, -5, + 8, 13, 12, 9, 11, 9, 4, -5, -11, -11, -8, -5, -5, -5, 0, 4, + 3, -4, -11, -8, 3, 11, 12, 8, 7, 4, 2, -2, -10, -14, -13, -7, + -3, -4, -2, 3, 4, 1, -8, -8, 3, 13, 17, 12, 11, 7, 1, -6, + -16, -21, -19, -13, -7, -2, 3, 7, 10, 10, 1, -6, -2, 8, 14, 12, + 10, 4, -2, -6, -15, -21, -20, -15, -8, -2, 3, 5, 9, 14, 5, -6, + 1, 12, 18, 14, 9, 7, 2, -4, -18, -28, -27, -22, -12, -5, 3, 9, + 13, 18, 16, 5, 1, 7, 14, 13, 8, 5, -5, -9, -17, -26, -26, -23, + -15, -4, 5, 8, 11, 17, 17, 7, 2, 7, 16, 18, 10, 4, -2, -6, + -16, -31, -33, -27, -18, -9, 0, 7, 12, 18, 22, 16, 9, 9, 16, 20, + 13, 5, -2, -9, -18, -33, -37, -29, -22, -13, -4, 7, 15, 21, 25, 21, + 15, 13, 17, 20, 14, 5, -3, -8, -18, -35, -42, -36, -24, -16, -6, 5, + 13, 23, 27, 25, 20, 17, 19, 20, 15, 5, -3, -8, -21, -35, -45, -39, + -25, -18, -11, 3, 16, 25, 29, 27, 26, 24, 23, 21, 17, 8, -4, -12, + -23, -35, -46, -46, -34, -22, -15, -3, 13, 25, 31, 33, 34, 31, 28, 25, + 20, 11, -4, -12, -22, -38, -49, -51, -39, -26, -21, -11, 8, 24, 34, 35, + 36, 37, 35, 29, 21, 13, 0, -11, -20, -36, -48, -52, -46, -31, -22, -14, + 1, 19, 34, 38, 39, 40, 38, 34, 24, 15, 0, -14, -21, -34, -47, -53, + -50, -35, -22, -17, -5, 13, 31, 37, 38, 42, 41, 37, 28, 21, 9, -8, + -19, -30, -44, -50, -53, -46, -32, -23, -11, 7, 26, 39, 43, 49, 48, 42, + 32, 20, 9, -9, -21, -31, -46, -52, -54, -50, -35, -24, -13, 4, 23, 40, + 46, 48, 49, 46, 37, 26, 13, -4, -20, -29, -42, -50, -53, -54, -43, -31, + -21, -2, 17, 36, 47, 53, 56, 51, 42, 29, 17, 3, -16, -30, -41, -51, + -55, -57, -51, -35, -24, -9, 11, 30, 47, 53, 57, 55, 46, 34, 20, 6, + -12, -29, -43, -52, -55, -55, -55, -42, -29, -12, 8, 25, 41, 55, 62, 59, + 51, 37, 23, 10, -6, -24, -40, -51, -56, -58, -58, -48, -33, -19, 2, 22, + 41, 55, 61, 61, 56, 45, 28, 11, -3, -19, -37, -51, -57, -58, -58, -54, + -39, -23, -2, 20, 36, 52, 64, 65, 58, 48, 33, 19, 4, -13, -35, -51, + -58, -61, -62, -60, -47, -29, -7, 17, 34, 50, 67, 70, 62, 50, 35, 20, + 6, -8, -29, -47, -57, -62, -61, -60, -54, -37, -15, 10, 29, 44, 60, 68, + 66, 56, 42, 24, 12, 1, -19, -41, -55, -60, -62, -61, -57, -43, -21, 7, + 24, 36, 53, 66, 67, 59, 46, 30, 15, 5, -11, -32, -48, -58, -63, -62, + -59, -50, -32, -3, 22, 35, 49, 60, 66, 63, 53, 38, 19, 8, -5, -25, + -43, -57, -64, -64, -62, -54, -39, -13, 16, 32, 46, 59, 65, 66, 56, 45, + 26, 11, 3, -17, -39, -56, -65, -67, -62, -56, -44, -21, 10, 29, 40, 54, + 63, 68, 61, 49, 33, 13, 2, -14, -34, -50, -64, -67, -63, -56, -44, -26, + 2, 27, 38, 49, 57, 64, 61, 50, 36, 17, 6, -7, -27, -44, -60, -67, + -63, -57, -48, -32, -7, 22, 36, 44, 53, 60, 62, 55, 41, 21, 7, -3, + -20, -40, -58, -68, -65, -57, -47, -34, -14, 16, 37, 42, 47, 55, 59, 53, + 42, 27, 10, -2, -14, -30, -47, -60, -63, -57, -49, -38, -20, 5, 30, 40, + 44, 52, 57, 57, 46, 31, 13, -2, -12, -27, -44, -57, -64, -61, -50, -38, + -20, 2, 25, 39, 41, 49, 55, 54, 45, 32, 17, 0, -12, -23, -37, -50, + -59, -61, -52, -38, -22, -6, 17, 35, 39, 42, 48, 53, 48, 36, 22, 4, + -9, -18, -30, -45, -56, -59, -54, -42, -27, -10, 12, 29, 37, 38, 44, 50, + 47, 37, 25, 9, -5, -13, -23, -38, -50, -55, -54, -45, -32, -17, 5, 25, + 34, 35, 39, 46, 48, 40, 29, 13, -3, -11, -21, -33, -44, -51, -54, -47, + -34, -17, 2, 21, 32, 34, 34, 38, 42, 39, 27, 15, 1, -7, -13, -25, + -36, -45, -49, -46, -36, -23, -6, 15, 27, 31, 31, 34, 39, 38, 30, 18, + 3, -6, -10, -19, -32, -40, -46, -45, -36, -24, -11, 8, 24, 29, 27, 29, + 34, 36, 30, 18, 4, -5, -5, -12, -25, -34, -39, -41, -37, -24, -11, 4, + 18, 24, 25, 25, 29, 29, 26, 19, 5, -6, -6, -6, -18, -28, -33, -37, + -34, -24, -11, 2, 15, 24, 23, 20, 24, 27, 22, 14, 4, -4, -4, -5, + -15, -24, -26, -29, -32, -27, -13, 2, 14, 21, 21, 18, 21, 23, 20, 13, + 5, -3, -5, -4, -9, -16, -21, -25, -28, -25, -14, 1, 10, 16, 19, 16, + 16, 18, 16, 11, 5, -2, -5, -4, -6, -12, -17, -20, -22, -22, -17, -4, + 8, 13, 16, 15, 13, 15, 14, 10, 4, -4, -6, -6, -5, -7, -11, -15, + -17, -17, -15, -3, 10, 13, 14, 11, 7, 8, 9, 5, -3, -8, -7, -4, + -2, -2, -6, -10, -9, -10, -12, -5, 11, 15, 13, 11, 5, 6, 7, 3, + -6, -10, -8, -6, -6, -2, 1, -2, -6, -6, -7, -5, 8, 14, 10, 7, + 4, 0, 1, -2, -6, -12, -11, -6, -2, 4, 8, 4, -2, -2, -4, -5, + 3, 12, 8, 5, 4, 0, 0, -2, -8, -13, -15, -12, -7, -3, 6, 10, + 7, 5, 6, 4, 6, 14, 10, 3, 0, -6, -10, -7, -10, -16, -19, -15, + -8, 0, 11, 17, 13, 10, 11, 7, 5, 8, 9, 2, -4, -7, -12, -10, + -10, -16, -21, -19, -13, -4, 10, 21, 22, 17, 17, 14, 9, 9, 9, 3, + -7, -12, -17, -16, -14, -20, -25, -21, -15, -5, 10, 23, 27, 25, 22, 18, + 11, 8, 4, -2, -9, -14, -18, -19, -14, -15, -23, -25, -20, -10, 9, 22, + 29, 29, 26, 23, 16, 12, 6, 1, -6, -14, -18, -22, -20, -19, -27, -28, + -25, -18, 0, 19, 32, 36, 33, 31, 23, 14, 7, 1, -4, -15, -23, -25, + -24, -19, -25, -32, -29, -20, -3, 16, 31, 40, 38, 36, 29, 16, 9, 1, + -4, -12, -23, -26, -28, -24, -26, -34, -33, -24, -8, 12, 29, 41, 44, 44, + 37, 22, 11, 4, -4, -11, -24, -31, -32, -31, -30, -36, -39, -30, -11, 11, + 29, 43, 51, 50, 44, 32, 15, 4, -4, -11, -24, -32, -33, -33, -34, -38, + -42, -35, -17, 4, 24, 42, 56, 60, 52, 38, 19, 7, 1, -13, -28, -37, + -37, -35, -37, -39, -43, -37, -19, 3, 22, 41, 57, 64, 57, 44, 26, 7, + -2, -11, -24, -35, -41, -40, -38, -39, -43, -40, -24, 0, 20, 37, 55, 65, + 63, 50, 32, 9, -4, -10, -24, -36, -42, -42, -41, -41, -41, -39, -26, -2, + 19, 34, 51, 64, 66, 55, 38, 15, -3, -8, -20, -34, -42, -44, -43, -44, + -45, -45, -35, -12, 14, 31, 50, 66, 73, 65, 49, 28, 7, -6, -18, -35, + -45, -49, -51, -53, -51, -47, -37, -16, 10, 30, 49, 69, 78, 72, 56, 35, + 14, -4, -17, -33, -46, -51, -55, -56, -54, -51, -40, -20, 5, 26, 44, 64, + 76, 77, 64, 41, 19, 1, -14, -30, -43, -50, -57, -60, -58, -54, -43, -24, + -2, 21, 39, 61, 76, 79, 72, 52, 28, 9, -10, -26, -41, -49, -54, -61, + -62, -59, -51, -33, -10, 14, 34, 55, 75, 81, 79, 63, 39, 19, -2, -23, + -40, -51, -56, -64, -67, -64, -56, -39, -16, 9, 29, 51, 73, 83, 82, 73, + 50, 27, 9, -18, -40, -52, -56, -63, -69, -69, -61, -43, -20, 2, 21, 42, + 66, 81, 82, 76, 59, 36, 19, -6, -33, -50, -57, -61, -71, -76, -68, -52, + -28, -2, 17, 36, 62, 83, 86, 82, 69, 43, 22, 2, -28, -51, -60, -63, + -67, -76, -74, -57, -34, -7, 14, 29, 53, 76, 87, 84, 75, 54, 33, 14, + -18, -46, -58, -62, -69, -80, -84, -68, -44, -18, 7, 26, 49, 75, 91, 92, + 82, 64, 42, 21, -8, -43, -63, -68, -68, -75, -86, -76, -48, -22, 4, 23, + 41, 66, 87, 92, 83, 69, 51, 31, 6, -31, -59, -67, -69, -74, -88, -87, + -62, -34, -7, 17, 36, 62, 87, 96, 90, 76, 60, 39, 14, -23, -58, -70, + -71, -73, -83, -89, -68, -37, -13, 9, 26, 51, 79, 94, 91, 80, 68, 52, + 28, -8, -48, -67, -70, -73, -84, -96, -83, -49, -22, 0, 20, 44, 75, 96, + 98, 88, 75, 61, 40, 6, -39, -67, -72, -75, -83, -95, -91, -60, -29, -7, + 13, 36, 66, 89, 97, 92, 78, 65, 50, 22, -21, -58, -71, -73, -78, -91, + -98, -79, -45, -15, 4, 25, 56, 84, 101, 99, 86, 73, 60, 35, -9, -53, + -72, -77, -80, -90, -98, -85, -51, -20, -2, 18, 48, 77, 96, 99, 87, 75, + 62, 46, 9, -39, -68, -75, -75, -83, -95, -94, -67, -30, -7, 8, 34, 68, + 92, 102, 93, 82, 72, 58, 26, -24, -61, -75, -78, -85, -97, -99, -78, -42, + -12, 6, 28, 59, 87, 102, 99, 86, 74, 62, 38, -7, -52, -76, -81, -83, + -93, -100, -90, -57, -23, -2, 18, 48, 80, 102, 103, 92, 81, 71, 51, 9, + -41, -72, -83, -85, -93, -100, -92, -65, -32, -7, 13, 39, 72, 97, 103, 95, + 85, 73, 55, 25, -21, -61, -79, -83, -90, -99, -97, -77, -45, -17, 1, 24, + 59, 93, 107, 103, 92, 85, 72, 42, -6, -54, -80, -86, -91, -104, -105, -87, + -56, -23, 0, 18, 48, 85, 106, 106, 96, 87, 77, 52, 13, -35, -71, -84, + -88, -98, -106, -96, -70, -40, -14, 6, 31, 70, 103, 111, 103, 95, 88, 68, + 29, -19, -61, -84, -91, -99, -106, -101, -80, -51, -22, 2, 23, 56, 91, 109, + 108, 98, 89, 76, 45, 1, -44, -76, -87, -92, -102, -104, -90, -64, -34, -11, + 8, 37, 78, 108, 113, 106, 96, 85, 61, 19, -29, -68, -88, -94, -102, -104, + -93, -73, -46, -21, 2, 28, 63, 98, 113, 109, 100, 89, 70, 33, -14, -55, + -81, -91, -98, -104, -98, -79, -54, -30, -9, 18, 52, 89, 108, 110, 104, 96, + 79, 46, 2, -40, -71, -90, -100, -104, -100, -86, -67, -44, -19, 7, 40, 77, + 105, 115, 109, 99, 86, 58, 17, -29, -63, -86, -97, -101, -101, -92, -74, -50, + -26, -4, 28, 66, 98, 114, 113, 102, 90, 68, 33, -15, -53, -76, -93, -101, + -104, -96, -79, -57, -34, -15, 15, 56, 90, 110, 115, 105, 93, 75, 44, 0, + -43, -68, -86, -98, -101, -98, -83, -65, -42, -22, 4, 41, 79, 104, 113, 107, + 96, 81, 57, 16, -31, -59, -79, -95, -101, -100, -90, -71, -49, -30, -9, 28, + 67, 97, 110, 107, 97, 86, 65, 30, -14, -47, -67, -84, -98, -102, -96, -79, + -59, -41, -22, 14, 53, 90, 110, 111, 101, 90, 75, 45, 2, -39, -64, -79, + -93, -102, -101, -87, -64, -44, -28, 0, 39, 81, 108, 110, 102, 93, 82, 58, + 18, -25, -54, -70, -85, -101, -103, -94, -72, -53, -39, -14, 25, 70, 104, 112, + 103, 96, 88, 70, 34, -13, -48, -65, -78, -97, -108, -101, -79, -55, -42, -24, + 11, 56, 96, 111, 103, 94, 90, 77, 46, 5, -34, -56, -71, -92, -109, -109, + -91, -64, -46, -30, 0, 44, 89, 112, 108, 95, 88, 80, 57, 16, -27, -54, + -66, -82, -104, -112, -100, -71, -46, -34, -13, 29, 80, 111, 112, 97, 86, 84, + 69, 32, -15, -48, -61, -72, -94, -109, -106, -82, -54, -37, -23, 11, 61, 101, + 113, 101, 85, 80, 75, 48, 4, -37, -56, -64, -84, -107, -112, -90, -60, -37, + -29, -7, 43, 91, 111, 103, 86, 80, 77, 58, 20, -24, -52, -61, -75, -100, + -111, -99, -72, -44, -27, -12, 29, 77, 105, 106, 91, 80, 75, 64, 33, -9, + -43, -58, -69, -94, -111, -104, -78, -49, -28, -18, 11, 62, 97, 107, 94, 80, + 75, 69, 47, 6, -36, -55, -62, -81, -105, -108, -87, -59, -33, -18, 1, 46, + 86, 103, 97, 83, 75, 69, 52, 19, -23, -50, -59, -74, -97, -106, -91, -64, + -38, -21, -9, 26, 70, 95, 95, 80, 71, 69, 60, 35, -6, -40, -53, -64, + -87, -102, -96, -72, -45, -25, -14, 13, 56, 87, 95, 86, 75, 69, 60, 41, + 6, -32, -54, -62, -77, -95, -99, -79, -51, -23, -8, 6, 39, 75, 92, 87, + 72, 64, 62, 49, 21, -17, -47, -57, -67, -86, -97, -87, -59, -32, -16, -4, + 25, 63, 89, 92, 78, 67, 63, 53, 27, -10, -40, -55, -63, -78, -93, -89, + -65, -36, -17, -7, 11, 44, 77, 89, 79, 65, 61, 58, 41, 8, -26, -50, + -59, -67, -83, -90, -76, -47, -25, -13, 3, 30, 63, 85, 82, 70, 63, 58, + 45, 14, -18, -43, -56, -63, -74, -84, -78, -52, -26, -13, -2, 19, 46, 73, + 81, 68, 57, 55, 49, 27, -5, -32, -48, -54, -63, -77, -80, -60, -34, -17, + -5, 10, 34, 62, 79, 71, 57, 52, 48, 31, 2, -26, -45, -50, -53, -65, + -75, -63, -37, -16, -6, 4, 19, 45, 68, 70, 57, 49, 49, 39, 16, -11, + -33, -45, -49, -56, -70, -71, -51, -26, -8, 2, 13, 35, 63, 76, 63, 48, + 43, 38, 23, -7, -32, -45, -47, -47, -58, -67, -55, -30, -8, 0, 4, 20, + 46, 68, 65, 47, 38, 38, 31, 8, -19, -37, -44, -42, -48, -63, -62, -41, + -16, -2, 5, 16, 37, 61, 68, 53, 38, 34, 31, 14, -14, -33, -40, -38, + -41, -54, -60, -46, -20, -5, -3, 6, 25, 49, 63, 55, 38, 32, 33, 24, + 1, -23, -34, -35, -36, -45, -59, -55, -30, -9, -3, 2, 16, 39, 59, 59, + 44, 32, 30, 26, 7, -20, -33, -33, -32, -40, -53, -54, -35, -12, -3, -2, + 10, 29, 48, 55, 45, 32, 28, 27, 14, -10, -27, -30, -28, -34, -46, -53, + -41, -17, -5, -5, 5, 24, 44, 54, 46, 32, 25, 25, 18, -4, -25, -31, + -24, -27, -39, -47, -42, -21, -4, -2, 1, 15, 35, 46, 44, 31, 22, 23, + 20, 6, -15, -26, -23, -20, -29, -41, -42, -29, -11, -4, -4, 7, 26, 42, + 47, 37, 25, 21, 19, 9, -10, -25, -25, -18, -24, -38, -40, -29, -11, 1, + 0, 3, 19, 34, 42, 33, 19, 14, 15, 10, -5, -21, -24, -15, -13, -26, + -35, -31, -17, -2, 0, -2, 11, 26, 37, 34, 20, 14, 13, 12, 2, -17, + -25, -17, -12, -21, -31, -30, -19, -4, 4, 1, 9, 22, 32, 32, 19, 9, + 9, 10, 4, -11, -21, -16, -9, -14, -23, -26, -20, -8, 0, -2, 3, 15, + 26, 31, 24, 12, 9, 10, 6, -5, -17, -19, -12, -11, -18, -25, -22, -10, + 1, 2, 2, 11, 22, 29, 24, 10, 3, 5, 4, -4, -13, -15, -8, -5, + -10, -16, -18, -14, -5, -2, 0, 6, 13, 20, 23, 16, 6, 5, 5, 0, + -7, -12, -12, -8, -7, -12, -19, -18, -7, 0, 2, 7, 13, 18, 20, 13, + 3, -2, 1, -2, -6, -8, -6, -3, -2, -2, -10, -14, -10, -6, -4, 0, + 4, 9, 14, 15, 6, -2, -2, -2, -4, -4, -5, -3, 2, 3, -3, -10, + -9, -5, 0, 0, 0, 3, 8, 10, 3, -5, -7, -6, -4, 0, -2, -2, + 3, 7, 7, 2, -5, -6, -3, 2, 2, 0, 0, 2, 2, -4, -9, -9, + -7, -3, 2, 4, 8, 9, 6, 2, -3, -4, -3, -2, -2, -2, 0, 1, + -3, -8, -11, -8, -6, -4, 2, 6, 9, 10, 9, 8, 5, -4, -7, -3, + 1, 1, -6, -7, -6, -6, -11, -14, -10, -5, 3, 9, 12, 14, 13, 10, + 9, 1, -6, -5, -4, -3, -4, -6, -8, -12, -12, -13, -13, -11, -3, 9, + 16, 18, 15, 13, 14, 11, -2, -6, -4, -3, -5, -11, -13, -12, -14, -15, + -14, -10, -4, 6, 15, 22, 21, 16, 13, 12, 3, -7, -8, -7, -7, -10, + -14, -17, -16, -13, -12, -10, -7, 3, 15, 24, 26, 19, 16, 18, 12, -3, + -9, -10, -9, -11, -18, -22, -21, -17, -14, -14, -10, 0, 14, 26, 32, 28, + 23, 22, 21, 5, -9, -12, -16, -18, -22, -27, -27, -23, -17, -13, -8, 2, + 12, 25, 35, 36, 29, 21, 20, 11, -6, -14, -17, -19, -22, -27, -28, -24, + -20, -15, -11, -4, 7, 19, 32, 39, 35, 28, 25, 19, 4, -10, -17, -24, + -28, -31, -33, -30, -26, -19, -11, -3, 8, 19, 31, 42, 42, 34, 27, 21, + 9, -9, -19, -26, -31, -35, -34, -30, -26, -23, -13, -4, 4, 14, 25, 42, + 49, 41, 31, 27, 20, 3, -15, -28, -37, -38, -39, -38, -35, -29, -16, 0, + 9, 17, 26, 41, 52, 48, 36, 26, 19, 6, -16, -30, -39, -43, -41, -39, + -33, -29, -22, -5, 7, 13, 21, 36, 55, 56, 46, 34, 24, 15, -8, -29, + -44, -54, -50, -44, -39, -35, -27, -7, 11, 20, 25, 34, 54, 63, 53, 38, + 22, 14, 0, -27, -45, -56, -56, -46, -39, -36, -31, -14, 8, 19, 23, 29, + 46, 63, 61, 47, 30, 20, 8, -15, -39, -56, -62, -54, -44, -41, -38, -23, + -2, 16, 23, 28, 42, 63, 69, 58, 41, 25, 13, -7, -34, -56, -68, -64, + -50, -45, -43, -29, -7, 15, 26, 29, 40, 58, 72, 67, 48, 30, 16, 0, + -26, -53, -68, -69, -57, -47, -46, -36, -16, 9, 25, 30, 38, 53, 71, 74, + 58, 37, 17, 2, -21, -49, -70, -76, -64, -49, -43, -38, -21, 3, 25, 33, + 37, 49, 65, 74, 65, 45, 24, 8, -11, -40, -68, -79, -72, -57, -48, -42, + -29, -6, 20, 34, 39, 48, 63, 77, 74, 56, 31, 11, -8, -33, -61, -79, + -80, -68, -53, -45, -34, -16, 11, 31, 41, 51, 61, 75, 78, 64, 42, 19, + -3, -27, -55, -78, -84, -73, -59, -48, -37, -20, 5, 27, 40, 49, 58, 71, + 80, 71, 49, 23, 2, -20, -47, -72, -86, -82, -66, -52, -39, -26, -5, 20, + 39, 51, 59, 69, 79, 77, 61, 34, 7, -16, -42, -68, -88, -90, -75, -58, + -41, -26, -8, 17, 39, 52, 59, 65, 74, 77, 65, 41, 12, -12, -35, -60, + -81, -89, -79, -60, -45, -33, -17, 6, 31, 49, 59, 64, 73, 80, 74, 51, + 22, -5, -29, -54, -78, -92, -90, -70, -49, -35, -18, 3, 26, 48, 60, 64, + 68, 75, 75, 58, 31, 1, -25, -48, -73, -88, -90, -77, -56, -41, -23, -3, + 21, 43, 58, 64, 70, 75, 77, 64, 40, 12, -18, -44, -70, -87, -94, -87, + -64, -42, -22, -4, 16, 39, 58, 65, 66, 67, 74, 68, 46, 18, -12, -38, + -62, -82, -92, -89, -67, -45, -28, -9, 13, 31, 52, 64, 67, 66, 72, 71, + 53, 29, -3, -34, -59, -79, -94, -96, -77, -50, -29, -8, 12, 30, 49, 63, + 68, 67, 68, 70, 56, 34, 6, -29, -57, -77, -92, -99, -84, -56, -32, -10, + 11, 29, 45, 61, 69, 69, 68, 70, 60, 37, 12, -20, -50, -73, -90, -100, + -91, -64, -37, -14, 7, 25, 42, 57, 66, 67, 65, 67, 64, 45, 21, -9, + -41, -66, -84, -98, -95, -74, -47, -21, 3, 23, 39, 54, 64, 69, 69, 67, + 63, 50, 27, 0, -33, -63, -83, -94, -95, -79, -54, -26, -2, 18, 35, 49, + 61, 67, 67, 65, 64, 55, 33, 6, -25, -55, -82, -95, -98, -84, -60, -32, + -6, 17, 36, 48, 56, 64, 66, 65, 62, 55, 39, 14, -16, -46, -76, -92, + -96, -88, -69, -41, -9, 15, 33, 46, 54, 62, 68, 66, 59, 54, 44, 20, + -12, -41, -72, -92, -97, -90, -71, -46, -14, 15, 34, 48, 55, 59, 62, 63, + 60, 51, 42, 24, -6, -34, -63, -87, -95, -89, -75, -52, -23, 10, 31, 45, + 54, 58, 62, 66, 63, 51, 42, 30, 1, -32, -59, -84, -96, -93, -80, -58, + -28, 7, 32, 45, 53, 60, 64, 67, 62, 52, 41, 31, 9, -25, -55, -78, + -92, -91, -82, -65, -39, -2, 30, 43, 49, 56, 61, 65, 63, 54, 44, 33, + 16, -15, -47, -72, -88, -91, -84, -70, -45, -12, 22, 42, 48, 54, 58, 61, + 63, 56, 43, 32, 20, -4, -36, -65, -82, -87, -82, -72, -53, -23, 15, 40, + 46, 48, 55, 61, 62, 55, 43, 32, 21, 4, -26, -57, -75, -82, -80, -73, + -58, -30, 5, 35, 46, 47, 51, 57, 61, 57, 46, 34, 22, 9, -15, -47, + -71, -81, -80, -75, -62, -36, -4, 28, 46, 47, 49, 56, 60, 57, 48, 35, + 23, 12, -9, -39, -67, -78, -76, -71, -65, -45, -13, 21, 45, 50, 46, 50, + 58, 59, 49, 35, 23, 12, -4, -31, -62, -78, -74, -70, -65, -49, -18, 18, + 43, 51, 45, 48, 56, 56, 45, 30, 20, 12, 0, -24, -53, -71, -69, -63, + -60, -51, -25, 9, 36, 50, 47, 44, 50, 52, 45, 32, 21, 12, 1, -18, + -44, -66, -70, -64, -59, -51, -31, 2, 32, 50, 51, 46, 47, 52, 47, 32, + 17, 9, 0, -14, -34, -57, -67, -62, -56, -50, -33, -6, 24, 44, 51, 48, + 47, 48, 46, 34, 21, 12, 2, -13, -32, -51, -62, -62, -56, -51, -38, -13, + 18, 40, 51, 50, 45, 47, 46, 36, 20, 9, -2, -14, -28, -45, -59, -61, + -54, -48, -37, -15, 14, 36, 49, 52, 48, 44, 42, 33, 19, 10, 0, -13, + -26, -39, -52, -58, -54, -47, -37, -19, 9, 30, 44, 52, 48, 40, 38, 31, + 19, 7, -3, -12, -22, -31, -42, -51, -49, -43, -36, -22, 1, 22, 35, 45, + 47, 41, 37, 31, 23, 13, 3, -11, -22, -28, -36, -48, -53, -46, -35, -23, + -4, 17, 31, 45, 49, 41, 33, 29, 23, 13, 2, -11, -22, -26, -29, -38, + -46, -45, -34, -21, -6, 14, 25, 38, 46, 43, 35, 27, 19, 10, 3, -7, + -20, -28, -28, -32, -38, -41, -35, -23, -8, 10, 23, 33, 44, 44, 36, 27, + 18, 10, 0, -9, -22, -28, -28, -28, -33, -37, -32, -21, -7, 8, 20, 28, + 38, 41, 36, 27, 17, 8, -2, -6, -17, -28, -31, -28, -27, -30, -30, -22, + -7, 9, 19, 26, 35, 41, 37, 26, 16, 6, -5, -11, -18, -28, -31, -28, + -22, -23, -23, -18, -4, 11, 19, 24, 27, 33, 33, 24, 14, 3, -8, -11, + -15, -23, -29, -29, -21, -18, -19, -15, -5, 9, 16, 21, 26, 30, 32, 25, + 13, 2, -9, -13, -16, -21, -27, -27, -20, -12, -13, -14, -7, 9, 17, 20, + 24, 25, 26, 27, 15, 2, -9, -17, -17, -20, -25, -28, -23, -11, -6, -8, + -5, 7, 19, 23, 24, 24, 24, 25, 16, 0, -13, -22, -22, -22, -26, -28, + -22, -8, 2, 1, 0, 8, 18, 24, 24, 20, 18, 20, 15, 1, -12, -22, + -24, -22, -23, -25, -22, -13, 2, 7, 3, 8, 16, 25, 28, 21, 15, 15, + 15, 4, -13, -25, -29, -24, -20, -24, -21, -12, 1, 12, 10, 9, 16, 23, + 27, 21, 14, 12, 10, 3, -10, -21, -28, -27, -22, -22, -20, -14, -4, 10, + 14, 11, 17, 23, 29, 26, 15, 11, 10, 4, -12, -25, -33, -33, -26, -23, + -22, -12, 0, 13, 22, 19, 20, 25, 29, 25, 12, 5, 3, 0, -12, -25, + -32, -34, -27, -21, -20, -11, -2, 7, 18, 21, 22, 26, 30, 29, 21, 11, + 4, -5, -14, -29, -38, -38, -33, -27, -23, -10, 4, 12, 22, 29, 30, 30, + 31, 30, 21, 10, 0, -11, -19, -30, -39, -40, -36, -28, -20, -9, 4, 12, + 20, 29, 32, 30, 32, 32, 23, 12, 3, -8, -18, -27, -39, -44, -40, -32, + -25, -15, 1, 13, 22, 30, 37, 38, 36, 34, 26, 14, 2, -11, -22, -31, + -40, -45, -42, -35, -26, -14, 0, 12, 19, 26, 35, 39, 36, 33, 28, 18, + 6, -7, -18, -28, -37, -43, -43, -37, -30, -19, -6, 8, 20, 25, 34, 42, + 41, 37, 32, 22, 8, -7, -19, -32, -40, -44, -44, -38, -30, -20, -6, 8, + 19, 24, 30, 40, 41, 36, 29, 23, 13, -3, -16, -28, -39, -43, -44, -41, + -34, -23, -11, 2, 16, 25, 32, 41, 46, 42, 34, 26, 15, 0, -16, -29, + -40, -45, -45, -40, -32, -24, -12, -2, 12, 22, 26, 37, 45, 44, 34, 24, + 18, 6, -12, -24, -37, -41, -40, -40, -36, -30, -17, -4, 9, 18, 25, 37, + 45, 45, 40, 29, 19, 8, -8, -22, -38, -43, -42, -42, -35, -28, -17, -4, + 7, 17, 23, 33, 43, 43, 38, 28, 19, 12, -3, -19, -34, -40, -38, -40, + -38, -31, -22, -8, 5, 14, 21, 31, 44, 47, 41, 31, 20, 13, 3, -15, + -33, -45, -45, -41, -38, -31, -24, -10, 4, 15, 21, 29, 42, 47, 41, 33, + 22, 13, 4, -13, -29, -40, -41, -41, -41, -36, -26, -14, -2, 8, 17, 29, + 42, 50, 46, 37, 27, 17, 7, -9, -27, -41, -48, -45, -42, -38, -29, -15, + -2, 10, 18, 26, 38, 50, 51, 40, 28, 17, 6, -7, -24, -36, -43, -45, + -41, -38, -31, -18, -8, 2, 13, 26, 38, 44, 49, 42, 33, 22, 8, -4, + -20, -32, -41, -46, -44, -37, -32, -21, -8, 2, 14, 25, 35, 42, 47, 44, + 31, 19, 7, -4, -15, -28, -36, -42, -40, -34, -31, -24, -9, 0, 7, 18, + 30, 40, 44, 42, 32, 22, 12, 2, -10, -23, -31, -38, -42, -38, -31, -26, + -13, -3, 2, 14, 29, 40, 41, 40, 36, 26, 13, 1, -10, -19, -26, -35, + -43, -41, -33, -27, -17, -6, 1, 12, 27, 43, 47, 42, 37, 29, 14, 0, + -10, -21, -29, -34, -40, -42, -33, -26, -18, -5, 3, 10, 23, 39, 45, 39, + 33, 30, 18, 3, -8, -15, -22, -29, -37, -43, -36, -27, -22, -13, -4, 6, + 19, 36, 47, 47, 37, 33, 25, 6, -8, -15, -25, -31, -36, -43, -42, -32, + -21, -11, 0, 5, 15, 32, 46, 45, 35, 31, 28, 12, -6, -13, -20, -24, + -31, -41, -46, -38, -26, -18, -9, 1, 14, 31, 43, 48, 42, 33, 28, 15, + -5, -15, -18, -24, -31, -38, -41, -34, -26, -19, -8, 1, 10, 23, 37, 43, + 41, 32, 26, 19, 3, -12, -15, -18, -24, -34, -42, -38, -28, -20, -13, -4, + 6, 21, 37, 44, 43, 36, 28, 21, 8, -9, -16, -19, -25, -34, -42, -39, + -29, -21, -13, -3, 8, 19, 34, 42, 41, 36, 28, 20, 8, -7, -15, -16, + -19, -30, -41, -42, -31, -23, -15, -8, 3, 19, 36, 43, 39, 36, 30, 23, + 13, -6, -19, -21, -20, -26, -38, -43, -35, -25, -15, -7, 3, 14, 30, 42, + 40, 35, 28, 23, 16, 0, -14, -20, -19, -22, -34, -42, -37, -26, -15, -8, + 0, 12, 27, 40, 41, 35, 29, 22, 16, 4, -9, -19, -20, -20, -29, -39, + -39, -30, -19, -10, -3, 10, 24, 37, 42, 37, 31, 25, 18, 7, -7, -17, + -21, -20, -28, -38, -40, -33, -22, -11, -5, 9, 25, 37, 44, 40, 32, 24, + 17, 10, -5, -18, -24, -23, -28, -35, -38, -35, -26, -14, -5, 5, 19, 34, + 44, 42, 33, 23, 18, 13, 0, -15, -20, -22, -26, -33, -39, -35, -28, -18, + -10, 1, 18, 33, 43, 45, 38, 28, 20, 11, 2, -12, -22, -24, -28, -31, + -36, -35, -29, -21, -11, 0, 15, 30, 40, 44, 39, 31, 21, 13, 8, -5, + -17, -20, -25, -28, -32, -36, -34, -27, -18, -7, 9, 26, 39, 46, 45, 36, + 25, 14, 10, -2, -16, -24, -29, -31, -31, -36, -36, -27, -16, -7, 6, 23, + 37, 45, 44, 36, 26, 14, 8, 1, -14, -22, -23, -29, -32, -35, -36, -29, + -21, -14, 0, 16, 35, 46, 45, 39, 33, 20, 8, 3, -9, -21, -28, -32, + -34, -35, -36, -32, -25, -15, 1, 17, 32, 45, 49, 44, 35, 23, 7, 0, + -7, -17, -25, -30, -31, -32, -34, -31, -25, -18, -7, 10, 27, 43, 50, 45, + 35, 24, 13, 3, -7, -17, -24, -28, -30, -30, -33, -34, -26, -19, -11, 5, + 22, 39, 50, 48, 37, 26, 16, 5, -7, -18, -23, -27, -28, -28, -33, -34, + -24, -16, -11, 2, 17, 33, 48, 48, 37, 27, 18, 7, -5, -14, -20, -25, + -30, -31, -32, -37, -31, -20, -15, -3, 15, 30, 46, 53, 43, 31, 20, 11, + 0, -12, -21, -27, -31, -30, -30, -36, -33, -20, -10, -5, 9, 25, 41, 52, + 46, 34, 23, 15, 6, -9, -21, -27, -30, -31, -31, -37, -39, -25, -12, -7, + 1, 18, 36, 52, 53, 40, 28, 22, 13, -2, -18, -29, -32, -35, -34, -39, + -40, -28, -13, -7, -2, 12, 33, 50, 56, 44, 30, 24, 18, 4, -15, -29, + -32, -33, -33, -35, -40, -35, -20, -7, -2, 8, 25, 43, 54, 49, 35, 25, + 18, 8, -7, -23, -32, -32, -34, -34, -37, -36, -24, -11, -5, 2, 18, 36, + 51, 51, 39, 30, 24, 14, 0, -19, -32, -35, -35, -37, -38, -39, -29, -12, + -2, 3, 14, 29, 47, 54, 45, 33, 26, 17, 5, -12, -31, -37, -36, -38, + -38, -38, -32, -17, -3, 3, 9, 25, 42, 53, 49, 39, 31, 23, 10, -9, + -27, -38, -40, -41, -41, -41, -36, -23, -5, 5, 8, 18, 36, 51, 51, 43, + 34, 26, 16, 1, -20, -36, -40, -41, -42, -40, -38, -28, -10, 4, 7, 14, + 30, 48, 51, 45, 39, 31, 21, 4, -16, -33, -41, -43, -43, -39, -38, -32, + -15, 1, 7, 13, 25, 42, 52, 48, 39, 31, 22, 9, -10, -29, -40, -40, + -40, -38, -35, -34, -20, -2, 5, 9, 17, 33, 49, 50, 43, 34, 25, 13, + -4, -21, -36, -44, -44, -40, -35, -34, -26, -8, 5, 11, 17, 26, 43, 51, + 46, 36, 27, 16, 1, -16, -31, -42, -46, -43, -37, -35, -29, -12, 3, 11, + 17, 23, 37, 50, 52, 41, 29, 20, 4, -15, -30, -43, -49, -46, -39, -37, + -33, -15, 3, 13, 19, 23, 35, 52, 55, 44, 29, 20, 8, -12, -28, -40, + -48, -45, -39, -35, -32, -20, -2, 12, 16, 19, 28, 45, 55, 49, 35, 24, + 14, -3, -20, -36, -49, -53, -45, -38, -35, -27, -9, 8, 19, 23, 26, 40, + 55, 55, 41, 25, 15, -2, -19, -33, -46, -53, -47, -39, -35, -29, -14, 6, + 19, 24, 25, 35, 53, 59, 47, 29, 17, 7, -12, -30, -47, -58, -56, -47, + -39, -35, -22, -2, 17, 28, 30, 34, 50, 63, 56, 35, 19, 8, -9, -26, + -43, -56, -58, -49, -42, -38, -27, -9, 12, 26, 33, 34, 44, 60, 62, 44, + 23, 9, -4, -20, -40, -56, -63, -56, -44, -39, -30, -14, 8, 26, 35, 35, + 43, 60, 64, 50, 28, 13, 2, -16, -37, -53, -62, -61, -50, -42, -32, -17, + 2, 18, 32, 40, 44, 54, 63, 55, 37, 17, 4, -10, -31, -48, -61, -67, + -59, -45, -36, -24, -5, 17, 33, 43, 47, 54, 64, 59, 42, 20, 3, -10, + -28, -49, -63, -68, -63, -50, -37, -25, -7, 13, 31, 44, 48, 54, 61, 59, + 48, 27, 6, -10, -24, -43, -59, -67, -67, -56, -39, -28, -13, 8, 24, 42, + 51, 54, 58, 58, 52, 37, 14, -6, -20, -38, -54, -65, -70, -63, -45, -29, + -17, 2, 18, 37, 52, 56, 58, 56, 51, 42, 23, -2, -19, -34, -50, -62, + -70, -69, -52, -30, -17, -3, 15, 33, 50, 58, 58, 56, 52, 46, 29, 3, + -15, -31, -45, -58, -68, -71, -60, -38, -20, -5, 11, 25, 42, 58, 62, 58, + 51, 44, 36, 15, -10, -29, -43, -53, -64, -72, -67, -45, -21, -8, 4, 20, + 40, 60, 65, 57, 53, 48, 42, 21, -8, -27, -40, -50, -62, -71, -71, -54, + -29, -9, 3, 18, 34, 54, 68, 65, 57, 48, 40, 28, 2, -23, -41, -52, + -60, -71, -75, -60, -34, -12, 0, 13, 31, 52, 69, 66, 56, 50, 44, 33, + 7, -21, -38, -47, -55, -65, -75, -67, -41, -15, 2, 11, 23, 41, 61, 68, + 59, 49, 40, 34, 17, -11, -35, -47, -48, -55, -69, -72, -50, -21, 0, 8, + 15, 33, 56, 69, 62, 52, 44, 40, 26, -4, -30, -44, -48, -56, -69, -77, + -59, -28, -7, 7, 15, 30, 52, 68, 66, 55, 45, 38, 30, 6, -24, -43, + -49, -52, -64, -75, -65, -35, -10, 4, 11, 25, 45, 65, 67, 55, 48, 43, + 34, 13, -18, -39, -45, -49, -61, -75, -72, -45, -17, -2, 9, 20, 39, 61, + 70, 62, 52, 45, 36, 18, -9, -34, -47, -52, -58, -69, -72, -52, -23, -5, + 7, 17, 35, 54, 65, 63, 55, 45, 37, 23, 0, -27, -45, -49, -53, -63, + -71, -59, -31, -8, 7, 15, 28, 47, 61, 65, 58, 47, 38, 27, 6, -21, + -41, -49, -53, -62, -69, -62, -39, -14, 3, 14, 28, 46, 59, 64, 62, 51, + 39, 29, 11, -16, -40, -52, -55, -58, -65, -65, -47, -20, 1, 14, 24, 39, + 52, 59, 64, 56, 43, 33, 16, -8, -32, -49, -55, -58, -63, -65, -54, -29, + -3, 12, 21, 36, 51, 60, 65, 59, 46, 35, 21, -4, -28, -48, -56, -57, + -59, -60, -55, -37, -12, 9, 19, 32, 46, 54, 58, 58, 48, 36, 26, 7, + -18, -41, -53, -53, -52, -57, -58, -45, -19, 6, 15, 26, 42, 54, 59, 59, + 52, 39, 28, 10, -16, -40, -56, -56, -52, -51, -53, -45, -22, 4, 17, 24, + 35, 46, 56, 57, 52, 40, 30, 18, -7, -33, -54, -58, -52, -49, -53, -51, + -33, -5, 17, 26, 34, 43, 54, 58, 53, 42, 31, 19, 0, -24, -47, -60, + -55, -46, -46, -50, -39, -13, 13, 25, 32, 38, 48, 56, 52, 41, 30, 20, + 7, -15, -41, -58, -55, -44, -41, -44, -40, -19, 10, 25, 28, 32, 41, 53, + 52, 42, 31, 21, 13, -5, -32, -55, -60, -47, -36, -38, -40, -26, 2, 24, + 29, 28, 32, 46, 48, 40, 29, 21, 14, 1, -23, -48, -56, -46, -34, -33, + -36, -29, -7, 20, 28, 25, 26, 37, 46, 42, 30, 19, 15, 7, -13, -39, + -58, -54, -37, -27, -27, -29, -17, 13, 29, 28, 24, 31, 42, 42, 34, 21, + 11, 5, -10, -32, -51, -52, -40, -28, -24, -24, -18, 6, 27, 30, 26, 28, + 36, 38, 33, 22, 11, 6, -7, -26, -44, -49, -42, -30, -21, -17, -16, -5, + 18, 29, 26, 25, 29, 33, 33, 25, 13, 7, 0, -18, -36, -46, -45, -31, + -20, -16, -16, -9, 12, 28, 29, 24, 25, 29, 31, 26, 13, 2, -5, -15, + -26, -39, -46, -37, -19, -9, -9, -11, 1, 21, 31, 26, 21, 23, 26, 25, + 15, 4, -4, -10, -20, -32, -41, -38, -22, -10, -7, -9, -6, 11, 26, 29, + 22, 20, 21, 24, 19, 7, -6, -12, -17, -23, -30, -36, -27, -12, -3, 0, + -5, 3, 18, 28, 25, 18, 15, 16, 15, 7, -4, -10, -14, -19, -24, -30, + -26, -13, -3, 2, -3, -2, 12, 23, 26, 18, 13, 13, 14, 9, 0, -11, + -14, -15, -18, -24, -26, -16, -4, 4, 0, -5, 6, 17, 25, 21, 11, 7, + 8, 8, 1, -11, -14, -11, -10, -13, -20, -18, -7, 5, 7, -3, -2, 8, + 21, 23, 12, 4, 4, 8, 7, -5, -15, -14, -11, -9, -15, -20, -13, 1, + 8, 3, 0, 6, 17, 24, 16, 3, -2, 1, 0, -10, -17, -14, -8, -4, + -5, -11, -12, 0, 9, 6, -3, 1, 10, 18, 16, 5, -3, 0, 3, -4, + -13, -15, -10, -6, -4, -8, -13, -8, 5, 8, 5, 3, 9, 17, 18, 13, + 0, -7, -5, -5, -11, -14, -11, -6, 2, 2, -6, -9, 1, 8, 5, -2, + 1, 8, 14, 12, 2, -6, -5, -2, -6, -12, -10, -2, 3, 4, -5, -11, + -6, 5, 6, 0, 0, 7, 12, 14, 6, -7, -8, -6, -6, -9, -10, -5, + 4, 8, 4, -7, -11, -2, 6, 3, -2, 2, 9, 15, 12, -2, -8, -6, + -3, -5, -11, -9, 2, 10, 7, -5, -15, -10, 4, 6, -2, -2, 8, 14, + 14, 3, -9, -8, -5, -4, -8, -10, 0, 8, 9, 3, -9, -12, -3, 6, + 3, -3, 1, 8, 13, 5, -9, -13, -7, -2, -2, -6, -2, 9, 13, 6, + -6, -13, -10, 2, 4, -3, -2, 7, 13, 9, -6, -12, -11, -6, 0, -5, + -5, 7, 15, 13, 1, -10, -13, -4, 5, -2, -7, -2, 9, 9, -3, -11, + -11, -8, 2, 1, -3, 7, 15, 12, 4, -7, -13, -11, -2, 1, -4, -3, + 7, 11, 3, -8, -11, -10, 0, 1, -5, 2, 12, 17, 11, -2, -11, -11, + -3, 4, -4, -9, 1, 10, 3, -9, -11, -8, 0, 5, 1, 2, 11, 14, + 9, 1, -11, -15, -11, -3, 1, -3, 3, 12, 11, 1, -7, -9, -6, -3, + -5, -5, 5, 12, 9, 4, -3, -8, -8, -5, 0, -4, -3, 5, 6, -3, + -10, -7, -3, 0, 2, 3, 10, 14, 11, 4, -3, -11, -15, -15, -9, -5, + -5, 5, 13, 5, -2, 0, 2, 4, 1, -3, 4, 12, 11, 2, -5, -10, + -13, -13, -11, -6, -4, 3, 13, 9, 1, -2, 4, 5, 1, -5, 3, 12, + 13, 4, -9, -12, -14, -16, -17, -12, -5, 5, 16, 17, 6, 3, 9, 9, + 2, -8, -7, 2, 7, 4, -8, -12, -10, -13, -14, -13, -6, 4, 13, 19, + 10, 0, 6, 14, 8, -6, -9, 0, 7, 5, -8, -17, -13, -9, -14, -18, + -13, 2, 15, 23, 16, 4, 5, 16, 15, 0, -10, -6, 3, 6, -4, -15, + -15, -10, -11, -16, -16, -5, 10, 21, 18, 7, 2, 12, 18, 6, -7, -9, + 1, 7, 1, -14, -19, -15, -13, -16, -18, -8, 7, 19, 24, 16, 5, 8, + 16, 9, -4, -9, -5, 3, 4, -9, -19, -18, -13, -12, -17, -12, 2, 16, + 22, 17, 6, 4, 14, 13, 1, -8, -6, 2, 6, -5, -18, -20, -16, -14, + -18, -17, -5, 12, 23, 24, 14, 9, 15, 19, 9, -5, -8, -3, 2, -6, + -17, -23, -19, -14, -16, -17, -8, 7, 19, 24, 19, 10, 11, 17, 13, 3, + -5, -3, -2, -4, -14, -24, -25, -20, -18, -16, -10, 3, 16, 26, 28, 18, + 11, 15, 17, 9, -4, -7, -6, -6, -12, -24, -29, -22, -16, -15, -10, 0, + 13, 24, 27, 22, 14, 13, 16, 13, 2, -6, -7, -9, -12, -21, -29, -27, + -21, -15, -10, -3, 8, 21, 29, 26, 17, 13, 17, 19, 9, -5, -10, -9, + -12, -21, -30, -29, -22, -14, -10, -4, 7, 17, 26, 23, 17, 13, 12, 18, + 16, 5, -6, -10, -11, -19, -29, -32, -27, -18, -10, -4, 4, 13, 25, 26, + 21, 16, 11, 16, 17, 8, -5, -12, -12, -16, -25, -30, -27, -19, -10, -6, + 0, 10, 21, 24, 18, 15, 13, 16, 20, 14, 1, -10, -12, -15, -26, -31, + -29, -22, -12, -5, 0, 8, 19, 25, 22, 17, 14, 14, 19, 17, 4, -10, + -15, -15, -22, -30, -30, -26, -16, -6, 1, 7, 15, 23, 23, 18, 17, 17, + 17, 17, 8, -6, -15, -18, -24, -31, -29, -26, -19, -8, 2, 7, 15, 23, + 24, 21, 17, 15, 15, 17, 13, -4, -16, -20, -23, -30, -32, -27, -19, -8, + 3, 7, 14, 23, 24, 20, 16, 16, 15, 14, 10, 0, -12, -20, -24, -31, + -32, -25, -19, -10, 0, 9, 14, 22, 27, 23, 17, 17, 18, 12, 8, 1, + -12, -18, -23, -31, -34, -26, -17, -9, -2, 6, 14, 22, 27, 22, 16, 15, + 18, 17, 10, 3, -9, -17, -21, -31, -38, -32, -23, -13, -5, 4, 14, 21, + 30, 30, 21, 17, 18, 17, 10, 3, -8, -20, -23, -29, -38, -34, -25, -12, + 0, 3, 11, 17, 26, 31, 23, 15, 13, 16, 14, 5, -4, -15, -19, -23, + -35, -38, -32, -19, -7, -5, 6, 16, 25, 36, 32, 22, 19, 19, 15, 3, + -7, -16, -23, -26, -35, -42, -34, -19, -3, 1, 6, 18, 26, 37, 34, 20, + 15, 14, 14, 5, -7, -15, -21, -23, -28, -39, -37, -22, -5, 1, 3, 15, + 25, 35, 40, 27, 14, 14, 14, 6, -7, -14, -20, -25, -27, -36, -41, -28, + -8, 2, 4, 14, 24, 33, 40, 32, 17, 13, 12, 5, -7, -14, -17, -24, + -28, -34, -40, -32, -14, 1, 4, 13, 26, 33, 41, 40, 26, 15, 12, 4, + -9, -17, -20, -25, -31, -34, -41, -38, -20, 0, 7, 12, 24, 32, 40, 41, + 30, 17, 11, 4, -10, -18, -19, -21, -27, -31, -35, -36, -24, -5, 5, 9, + 21, 31, 37, 41, 36, 21, 11, 4, -8, -15, -18, -21, -26, -31, -34, -37, + -30, -12, 3, 9, 18, 30, 38, 44, 42, 29, 15, 7, -6, -18, -23, -24, + -25, -31, -34, -36, -33, -15, 3, 9, 17, 28, 38, 44, 42, 34, 20, 8, + -5, -18, -23, -22, -24, -30, -35, -35, -35, -24, -6, 6, 14, 25, 36, 42, + 45, 42, 28, 13, 1, -15, -26, -27, -26, -29, -35, -39, -38, -28, -10, 5, + 13, 21, 36, 47, 48, 45, 36, 21, 6, -11, -25, -31, -30, -29, -35, -41, + -41, -34, -18, 1, 15, 24, 35, 47, 52, 51, 42, 26, 8, -9, -25, -32, + -34, -32, -34, -40, -41, -35, -22, -5, 11, 21, 30, 44, 52, 51, 45, 32, + 15, -3, -19, -28, -33, -34, -36, -42, -44, -41, -30, -13, 6, 20, 29, 43, + 54, 56, 50, 37, 22, 4, -17, -31, -39, -39, -38, -40, -44, -41, -31, -14, + 4, 18, 26, 37, 52, 57, 54, 44, 29, 11, -9, -26, -38, -42, -40, -41, + -45, -46, -39, -24, -2, 17, 25, 35, 49, 59, 59, 52, 36, 19, -2, -22, + -38, -46, -45, -43, -44, -47, -41, -28, -7, 12, 22, 32, 45, 58, 60, 52, + 40, 26, 9, -14, -36, -46, -47, -44, -44, -50, -47, -34, -14, 8, 21, 30, + 42, 58, 65, 58, 46, 32, 14, -7, -30, -47, -51, -50, -45, -50, -51, -38, + -20, 4, 19, 28, 38, 53, 67, 63, 50, 40, 23, 2, -22, -43, -54, -55, + -50, -53, -57, -48, -31, -6, 17, 28, 39, 53, 69, 72, 60, 47, 29, 7, + -18, -39, -54, -59, -56, -53, -55, -52, -37, -16, 10, 25, 36, 48, 65, 75, + 68, 54, 40, 20, -6, -31, -52, -61, -61, -59, -63, -62, -46, -24, 2, 20, + 33, 50, 67, 79, 75, 62, 49, 30, 2, -29, -50, -63, -66, -65, -64, -64, + -50, -28, -6, 18, 34, 48, 62, 74, 79, 70, 54, 38, 14, -19, -45, -62, + -70, -71, -67, -68, -61, -39, -15, 10, 28, 45, 63, 77, 82, 77, 62, 47, + 25, -9, -40, -61, -70, -73, -69, -70, -66, -47, -23, 2, 23, 41, 57, 71, + 79, 83, 72, 55, 37, 6, -27, -51, -67, -76, -78, -77, -75, -60, -35, -12, + 13, 37, 59, 75, 82, 86, 81, 66, 48, 17, -23, -50, -66, -77, -83, -83, + -78, -66, -43, -18, 7, 31, 54, 73, 83, 87, 87, 74, 55, 29, -10, -41, + -61, -76, -85, -88, -84, -72, -53, -28, -3, 22, 51, 75, 84, 88, 92, 87, + 67, 40, 0, -38, -60, -77, -89, -94, -89, -77, -59, -34, -7, 17, 44, 73, + 88, 90, 91, 88, 74, 49, 12, -29, -57, -73, -84, -93, -94, -84, -68, -44, + -17, 8, 33, 64, 85, 90, 92, 91, 83, 63, 30, -15, -50, -71, -82, -92, + -96, -90, -74, -52, -26, 0, 24, 56, 82, 92, 93, 92, 89, 74, 42, 0, + -41, -67, -80, -93, -100, -97, -83, -62, -35, -8, 16, 43, 74, 91, 96, 96, + 93, 83, 56, 16, -28, -61, -79, -92, -99, -99, -90, -71, -45, -16, 9, 36, + 66, 88, 98, 97, 93, 87, 68, 31, -16, -52, -75, -89, -98, -103, -98, -81, + -54, -23, 1, 25, 56, 83, 97, 98, 92, 88, 76, 46, 1, -42, -68, -81, + -91, -99, -97, -82, -58, -30, -6, 15, 44, 73, 91, 94, 89, 85, 78, 55, + 16, -28, -59, -77, -87, -93, -95, -85, -65, -40, -16, 6, 33, 62, 85, 94, + 90, 86, 81, 66, 32, -15, -52, -73, -84, -90, -93, -87, -69, -45, -22, 0, + 22, 48, 75, 88, 88, 85, 80, 67, 42, 4, -36, -62, -77, -87, -90, -85, + -72, -52, -30, -11, 11, 36, 63, 83, 86, 86, 82, 74, 54, 17, -25, -55, + -72, -81, -88, -87, -77, -57, -34, -16, 4, 26, 54, 77, 84, 84, 82, 75, + 58, 27, -12, -45, -65, -76, -84, -84, -76, -61, -41, -24, -7, 15, 41, 67, + 78, 81, 80, 76, 67, 42, 5, -30, -54, -67, -79, -85, -79, -67, -50, -32, + -16, 6, 32, 58, 73, 77, 81, 78, 68, 49, 16, -19, -45, -63, -74, -80, + -77, -67, -53, -35, -20, -3, 20, 45, 65, 72, 76, 75, 68, 56, 29, -6, + -33, -52, -65, -75, -77, -70, -57, -42, -28, -13, 9, 34, 57, 70, 73, 75, + 72, 63, 41, 7, -24, -46, -60, -70, -75, -72, -59, -45, -31, -18, 0, 25, + 48, 63, 68, 70, 71, 65, 47, 17, -13, -33, -49, -62, -73, -73, -61, -48, + -37, -25, -10, 14, 39, 57, 64, 67, 70, 69, 54, 28, -3, -27, -44, -57, + -68, -74, -66, -50, -39, -26, -13, 5, 30, 50, 60, 62, 64, 65, 58, 38, + 9, -17, -35, -46, -59, -69, -67, -52, -40, -31, -20, -6, 18, 42, 55, 58, + 60, 65, 62, 47, 20, -10, -28, -39, -51, -66, -70, -58, -44, -34, -23, -10, + 11, 34, 51, 57, 58, 62, 63, 51, 29, 2, -21, -34, -46, -60, -69, -63, + -49, -37, -27, -15, 3, 26, 45, 55, 56, 58, 62, 55, 37, 11, -14, -29, + -39, -52, -65, -66, -52, -40, -30, -18, -5, 17, 39, 52, 54, 55, 58, 57, + 44, 21, -8, -24, -33, -45, -59, -66, -57, -43, -31, -20, -11, 7, 30, 47, + 53, 51, 52, 55, 51, 33, 4, -20, -29, -36, -49, -64, -63, -50, -36, -24, + -14, 0, 22, 43, 55, 53, 49, 52, 51, 39, 12, -16, -27, -33, -45, -60, + -66, -53, -37, -25, -16, -6, 16, 40, 53, 53, 47, 49, 51, 43, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, -2, -2, -2, -2, 0, -2, + 0, 0, 1, 2, 3, 4, 4, 4, 5, 6, 7, 6, 3, 1, 0, -3, + -5, -11, -17, -20, -20, -18, -16, -17, -17, -14, -10, -9, -13, -18, -19, -15, + -13, -12, -13, -8, 1, 12, 25, 32, 40, 45, 50, 49, 41, 32, 24, 16, + 9, 1, -12, -20, -23, -24, -20, -20, -18, -12, -11, -12, -7, 0, 10, 17, + 23, 25, 24, 21, 22, 23, 21, 10, 1, -5, -8, -11, -19, -29, -33, -32, + -26, -19, -16, -14, -12, -8, -7, -11, -19, -27, -29, -27, -25, -25, -24, -17, + -4, 13, 26, 34, 43, 54, 59, 56, 46, 33, 23, 15, 5, -11, -23, -32, + -35, -32, -30, -27, -23, -16, -11, -5, 3, 11, 23, 31, 36, 33, 28, 27, + 26, 21, 11, 1, -9, -14, -18, -23, -28, -35, -33, -26, -18, -12, -11, -7, + -4, -2, 0, -8, -19, -29, -33, -32, -30, -30, -25, -17, -4, 13, 26, 36, + 47, 55, 59, 53, 43, 32, 23, 12, 0, -14, -23, -30, -35, -35, -35, -33, + -28, -19, -11, -6, 3, 11, 22, 33, 39, 38, 34, 30, 27, 20, 11, 0, + -9, -17, -21, -26, -31, -34, -29, -19, -8, -3, 0, -3, 1, 4, 1, -11, + -25, -35, -37, -39, -35, -32, -27, -17, 0, 15, 29, 42, 55, 63, 62, 55, + 47, 38, 27, 14, -4, -20, -31, -40, -44, -46, -45, -41, -34, -25, -14, -3, + 8, 22, 32, 43, 44, 40, 36, 34, 26, 18, 8, -2, -11, -20, -25, -29, + -33, -31, -21, -10, -2, -2, -2, 4, 6, 9, 0, -14, -28, -35, -39, -38, + -38, -36, -30, -16, 0, 16, 29, 41, 55, 65, 67, 59, 49, 39, 28, 13, + -3, -19, -32, -42, -48, -51, -53, -47, -36, -22, -12, 0, 10, 24, 38, 46, + 48, 43, 39, 32, 26, 17, 6, -7, -16, -21, -26, -31, -34, -28, -16, -2, + 3, 1, 2, 8, 16, 12, 2, -15, -27, -34, -37, -41, -47, -44, -33, -16, + 1, 16, 31, 47, 65, 75, 73, 63, 52, 41, 27, 9, -14, -34, -47, -54, + -55, -58, -57, -50, -35, -17, 0, 8, 20, 34, 47, 54, 49, 42, 36, 29, + 21, 9, -4, -14, -21, -26, -30, -33, -28, -18, -5, 4, 6, 6, 8, 13, + 17, 12, -4, -21, -33, -39, -44, -49, -50, -46, -35, -15, 4, 22, 36, 55, + 72, 81, 78, 69, 54, 42, 27, 6, -19, -38, -52, -57, -62, -65, -64, -52, + -35, -17, -3, 8, 19, 33, 45, 50, 48, 42, 35, 29, 18, 7, -5, -11, + -20, -26, -29, -27, -20, -13, -4, 3, 8, 9, 11, 12, 12, 5, -8, -22, + -33, -42, -50, -53, -51, -42, -27, -11, 9, 27, 45, 62, 75, 78, 73, 60, + 48, 32, 14, -8, -30, -46, -54, -60, -64, -62, -53, -39, -23, -8, 5, 17, + 30, 41, 46, 44, 38, 30, 22, 11, 4, -5, -12, -20, -25, -26, -24, -17, + -7, 3, 8, 11, 12, 14, 15, 14, 9, -4, -17, -32, -44, -54, -57, -56, + -48, -36, -22, -5, 18, 41, 61, 74, 79, 75, 67, 55, 39, 20, -2, -20, + -37, -47, -56, -62, -63, -57, -44, -31, -18, -5, 7, 16, 28, 35, 38, 37, + 32, 25, 16, 8, 3, -2, -5, -11, -19, -21, -16, -7, 3, 6, 8, 7, + 8, 10, 9, 5, -4, -13, -23, -37, -49, -54, -54, -47, -38, -25, -9, 9, + 30, 50, 67, 77, 75, 69, 58, 42, 26, 7, -12, -31, -46, -52, -56, -59, + -58, -49, -36, -19, -5, 8, 14, 22, 28, 33, 35, 30, 23, 13, 4, 3, + 3, 0, -8, -12, -13, -10, -6, 2, 8, 11, 12, 11, 9, 4, -2, -5, + -12, -23, -35, -46, -52, -54, -48, -36, -22, -8, 9, 28, 46, 61, 70, 72, + 68, 58, 45, 27, 9, -8, -22, -35, -43, -48, -48, -46, -39, -33, -23, -12, + 1, 8, 11, 14, 16, 19, 19, 17, 11, 7, 8, 11, 13, 7, 5, 2, + 2, 2, 4, 6, 6, 5, 2, -3, -5, -9, -11, -17, -23, -29, -34, -40, + -45, -41, -32, -18, -5, 7, 19, 36, 54, 64, 67, 61, 55, 48, 36, 18, + 3, -11, -23, -36, -45, -46, -42, -39, -34, -27, -20, -11, 0, 10, 13, 14, + 12, 13, 13, 10, 7, 6, 9, 11, 11, 11, 10, 10, 8, 9, 9, 9, + 6, 1, -4, -12, -16, -22, -25, -28, -29, -30, -39, -43, -39, -26, -11, 0, + 8, 19, 33, 48, 58, 63, 61, 56, 50, 40, 25, 8, -5, -15, -24, -35, + -41, -42, -39, -32, -29, -25, -21, -13, -6, 0, 4, 2, 2, 3, 6, 6, + 7, 11, 17, 20, 22, 23, 24, 23, 21, 17, 12, 4, -5, -13, -22, -29, + -37, -41, -40, -36, -31, -32, -34, -34, -22, -6, 8, 14, 20, 29, 41, 50, + 56, 56, 49, 45, 39, 30, 17, 5, -8, -19, -28, -34, -35, -32, -27, -25, + -25, -23, -19, -12, -7, -4, -6, -10, -11, -7, 0, 4, 10, 14, 19, 26, + 32, 35, 34, 31, 25, 16, 6, -5, -17, -29, -39, -47, -51, -50, -44, -35, + -28, -27, -25, -18, -6, 10, 18, 21, 25, 31, 40, 46, 49, 48, 44, 42, + 37, 29, 19, 8, -5, -14, -21, -29, -30, -30, -27, -28, -32, -33, -31, -22, + -17, -15, -17, -19, -19, -9, 5, 16, 22, 25, 31, 38, 44, 47, 43, 34, + 20, 6, -9, -21, -35, -49, -59, -62, -60, -53, -42, -30, -22, -15, -6, 4, + 14, 23, 27, 28, 27, 30, 35, 38, 39, 42, 38, 35, 30, 25, 20, 12, + 4, -6, -18, -23, -22, -20, -22, -30, -37, -39, -34, -29, -27, -27, -26, -23, + -16, -3, 10, 21, 29, 35, 43, 46, 50, 49, 41, 28, 15, -2, -19, -35, + -50, -62, -67, -67, -60, -50, -36, -23, -14, -6, 3, 11, 21, 27, 27, 24, + 25, 27, 29, 31, 36, 41, 42, 39, 33, 27, 22, 17, 8, -3, -11, -15, + -15, -18, -25, -35, -42, -45, -42, -41, -41, -40, -38, -28, -12, 7, 22, 34, + 43, 51, 59, 62, 59, 49, 37, 20, 1, -19, -38, -54, -65, -73, -74, -69, + -55, -35, -19, -10, -2, 8, 18, 23, 25, 25, 22, 20, 19, 20, 22, 30, + 39, 44, 42, 39, 35, 32, 29, 18, 4, -8, -13, -15, -17, -24, -33, -43, + -47, -44, -42, -40, -40, -39, -32, -17, 3, 16, 28, 39, 47, 53, 56, 56, + 52, 40, 24, 5, -12, -29, -43, -54, -65, -72, -71, -56, -36, -20, -13, -4, + 5, 12, 18, 21, 23, 20, 18, 14, 16, 19, 27, 38, 45, 45, 42, 41, + 42, 37, 27, 15, 1, -8, -12, -13, -17, -30, -40, -47, -48, -47, -46, -46, + -45, -41, -28, -9, 11, 26, 38, 45, 51, 55, 58, 55, 47, 31, 10, -12, + -27, -39, -49, -58, -67, -69, -62, -46, -26, -13, -4, 2, 7, 14, 18, 21, + 20, 15, 11, 12, 14, 21, 32, 40, 44, 42, 42, 40, 37, 33, 22, 11, + 1, -7, -11, -11, -19, -30, -39, -43, -43, -42, -43, -44, -44, -36, -20, 0, + 14, 25, 35, 42, 46, 50, 50, 48, 36, 17, -3, -18, -30, -36, -43, -52, + -59, -60, -49, -35, -20, -12, -7, -4, 2, 8, 12, 12, 9, 9, 12, 16, + 23, 29, 39, 45, 46, 46, 43, 41, 37, 30, 20, 7, -5, -10, -11, -15, + -25, -39, -46, -45, -43, -42, -45, -46, -39, -26, -8, 8, 20, 31, 41, 45, + 48, 46, 44, 36, 21, 1, -20, -31, -33, -36, -44, -53, -59, -54, -41, -26, + -17, -12, -6, -3, 5, 7, 9, 11, 11, 12, 15, 20, 29, 36, 42, 46, + 45, 42, 40, 38, 33, 25, 13, 4, -7, -10, -11, -17, -29, -38, -38, -34, + -35, -39, -41, -39, -31, -16, -6, 4, 14, 24, 30, 34, 34, 35, 32, 22, + 8, -9, -16, -16, -17, -22, -33, -43, -46, -41, -34, -30, -25, -19, -14, -9, + -6, -2, 5, 9, 13, 15, 21, 29, 36, 43, 47, 46, 46, 42, 39, 37, + 31, 20, 10, 0, -6, -9, -14, -22, -29, -33, -31, -30, -34, -37, -37, -30, + -21, -12, -5, 1, 10, 20, 28, 31, 31, 28, 20, 12, 0, -8, -10, -10, + -16, -24, -33, -39, -44, -42, -35, -28, -23, -18, -14, -10, -4, 6, 12, 16, + 17, 22, 29, 33, 35, 38, 41, 43, 41, 38, 34, 30, 24, 16, 9, 3, + -4, -10, -15, -21, -23, -23, -23, -24, -28, -32, -31, -28, -22, -15, -10, -6, + 2, 11, 20, 23, 25, 19, 14, 9, 5, 3, 2, -2, -8, -19, -28, -36, + -42, -44, -39, -33, -28, -26, -20, -11, 0, 8, 15, 22, 28, 33, 35, 36, + 37, 38, 41, 40, 38, 32, 27, 21, 17, 11, 4, -3, -8, -12, -17, -18, + -16, -16, -15, -18, -22, -25, -26, -25, -23, -19, -15, -9, -2, 8, 13, 17, + 18, 17, 16, 15, 13, 10, 6, 0, -9, -21, -32, -42, -47, -46, -43, -36, + -30, -22, -15, -6, 4, 14, 22, 28, 33, 36, 37, 36, 35, 37, 36, 36, + 32, 27, 23, 16, 10, 5, 0, -7, -10, -12, -11, -11, -11, -10, -9, -11, + -16, -22, -27, -30, -30, -30, -25, -19, -9, 0, 7, 13, 18, 23, 27, 27, + 26, 20, 12, 1, -13, -27, -40, -50, -54, -54, -49, -42, -33, -21, -10, 1, + 14, 24, 30, 39, 44, 43, 38, 36, 38, 37, 34, 31, 28, 22, 13, 7, + 5, -2, -7, -11, -14, -13, -13, -8, -6, -6, -10, -12, -14, -19, -26, -34, + -38, -33, -26, -15, -7, 2, 7, 17, 26, 35, 40, 37, 29, 19, 7, -12, + -31, -44, -53, -56, -61, -62, -59, -46, -27, -9, 5, 14, 25, 36, 47, 53, + 51, 45, 37, 34, 32, 29, 26, 23, 18, 13, 5, 0, -3, -4, -6, -10, + -12, -12, -6, 2, 6, 2, -6, -12, -17, -21, -31, -41, -47, -43, -32, -20, + -11, -4, 9, 21, 40, 50, 48, 42, 34, 22, 5, -16, -36, -53, -58, -63, + -69, -73, -63, -43, -19, -2, 9, 19, 34, 50, 60, 61, 53, 42, 37, 32, + 30, 24, 21, 16, 11, 4, -4, -7, -6, -5, -5, -10, -14, -11, -4, 3, + 2, -2, -8, -13, -19, -26, -36, -42, -40, -33, -21, -9, 1, 10, 22, 36, + 49, 53, 47, 36, 19, 1, -18, -36, -51, -60, -65, -67, -67, -63, -47, -24, + -4, 11, 20, 33, 48, 57, 57, 52, 42, 33, 30, 28, 25, 19, 16, 12, + 8, 3, -2, -2, -2, -2, -5, -8, -10, -5, -2, 0, 0, -5, -8, -15, + -23, -32, -39, -38, -33, -24, -15, -7, 5, 16, 30, 45, 52, 49, 40, 23, + 4, -14, -29, -42, -55, -63, -67, -67, -61, -50, -35, -19, 0, 16, 31, 46, + 56, 59, 56, 47, 38, 34, 31, 28, 23, 16, 10, 4, 0, -2, -2, 0, + -5, -9, -12, -11, -7, -3, -3, -4, -5, -4, -7, -14, -26, -33, -32, -27, + -20, -15, -7, 2, 13, 21, 34, 42, 46, 40, 25, 7, -13, -27, -35, -44, + -54, -62, -64, -60, -51, -39, -26, -10, 8, 24, 40, 51, 58, 60, 54, 44, + 36, 29, 24, 19, 13, 8, 0, -6, -5, 0, 1, 0, -4, -3, -2, 0, + 1, -2, -5, -5, -4, -7, -17, -27, -31, -29, -24, -19, -15, -9, -3, 7, + 18, 27, 34, 39, 37, 26, 9, -9, -24, -32, -39, -47, -55, -60, -57, -51, + -42, -32, -20, -6, 14, 31, 48, 57, 60, 58, 52, 45, 35, 25, 21, 17, + 9, 0, -8, -10, -8, -7, -6, -9, -9, -6, -2, 0, -3, -6, -6, -2, + 1, -6, -15, -25, -25, -20, -17, -13, -11, -7, 1, 8, 16, 24, 31, 34, + 29, 16, -3, -17, -28, -35, -41, -47, -54, -56, -54, -46, -37, -27, -15, 4, + 23, 40, 50, 58, 60, 58, 50, 42, 34, 26, 19, 14, 4, -6, -13, -13, + -13, -14, -16, -15, -12, -9, -7, -7, -4, -4, 2, 7, 5, 0, -8, -11, + -13, -13, -11, -10, -11, -11, -9, 0, 8, 14, 22, 24, 19, 9, -3, -14, + -23, -29, -32, -38, -47, -54, -52, -44, -32, -23, -9, 8, 23, 39, 52, 59, + 58, 51, 46, 43, 33, 25, 16, 9, 4, -4, -11, -15, -16, -16, -15, -14, + -15, -16, -13, -7, -5, 2, 5, 5, 5, 6, 3, -4, -6, -4, -5, -10, + -16, -16, -13, -6, 4, 12, 15, 17, 14, 10, 4, -8, -17, -23, -30, -38, + -46, -52, -51, -41, -30, -20, -8, 9, 29, 47, 56, 57, 55, 52, 50, 45, + 34, 20, 10, 2, -2, -9, -16, -22, -24, -22, -21, -22, -19, -14, -7, -4, + 1, 5, 11, 15, 20, 17, 9, 3, 3, 0, -6, -15, -21, -23, -16, -9, + -3, 4, 10, 13, 15, 13, 4, -9, -15, -20, -27, -39, -48, -51, -47, -38, + -29, -21, -7, 16, 36, 48, 51, 52, 55, 60, 59, 49, 33, 20, 12, 7, + -2, -13, -24, -28, -27, -26, -30, -32, -29, -20, -9, 0, 3, 8, 16, 25, + 28, 23, 17, 12, 6, -2, -14, -26, -31, -27, -18, -10, -3, 7, 15, 22, + 24, 18, 9, 0, -9, -19, -34, -46, -57, -57, -51, -44, -38, -26, -5, 21, + 42, 48, 53, 58, 67, 75, 71, 57, 37, 23, 12, 3, -12, -27, -39, -43, + -43, -45, -47, -42, -28, -12, 2, 7, 12, 20, 32, 38, 37, 30, 21, 13, + 1, -13, -26, -34, -33, -26, -17, -10, -3, 9, 20, 25, 22, 13, 5, -3, + -13, -28, -43, -53, -56, -51, -46, -40, -31, -14, 10, 31, 41, 47, 56, 67, + 76, 73, 63, 46, 30, 19, 9, -7, -25, -39, -47, -50, -54, -52, -50, -38, + -22, -9, 4, 12, 22, 30, 39, 41, 39, 31, 22, 12, -3, -19, -30, -32, + -29, -23, -17, -9, 1, 12, 20, 24, 18, 10, 2, -7, -19, -35, -50, -59, + -59, -54, -49, -43, -31, -9, 15, 32, 41, 53, 70, 85, 87, 80, 64, 49, + 37, 23, 2, -23, -42, -52, -59, -66, -69, -68, -56, -38, -18, -2, 9, 19, + 31, 41, 49, 51, 44, 35, 21, 5, -9, -22, -29, -30, -26, -20, -14, -7, + 5, 15, 17, 14, 9, 2, -4, -16, -29, -45, -55, -56, -50, -46, -44, -36, + -19, 1, 19, 33, 46, 63, 79, 86, 84, 73, 60, 47, 32, 12, -10, -30, + -48, -59, -68, -72, -73, -64, -49, -30, -12, 2, 12, 26, 35, 45, 51, 51, + 44, 30, 15, 3, -9, -17, -20, -21, -19, -18, -14, 0, 10, 16, 15, 7, + -4, -10, -14, -24, -38, -51, -58, -55, -50, -44, -36, -23, -7, 10, 26, 41, + 57, 76, 89, 89, 81, 70, 59, 45, 25, 0, -24, -41, -56, -67, -75, -80, + -76, -63, -45, -26, -9, 6, 20, 32, 44, 52, 54, 53, 47, 35, 18, 3, + -6, -11, -14, -16, -19, -19, -12, -4, 5, 5, 0, -8, -12, -15, -21, -34, + -47, -51, -45, -39, -34, -30, -23, -12, 4, 17, 31, 45, 60, 72, 78, 75, + 69, 62, 53, 40, 18, -5, -24, -38, -50, -62, -73, -78, -74, -59, -41, -28, + -17, -4, 14, 33, 47, 55, 58, 55, 48, 39, 29, 16, 4, -5, -11, -18, + -21, -20, -15, -8, -7, -9, -13, -15, -16, -17, -23, -33, -43, -44, -41, -34, + -28, -23, -16, -8, 5, 21, 36, 50, 62, 73, 76, 73, 68, 59, 48, 30, + 9, -16, -35, -48, -59, -70, -77, -79, -72, -54, -38, -24, -8, 8, 29, 45, + 56, 61, 62, 56, 51, 39, 27, 16, 4, -8, -16, -22, -23, -25, -19, -16, + -17, -19, -20, -21, -18, -19, -25, -32, -38, -34, -24, -19, -15, -12, -7, 3, + 15, 28, 39, 48, 56, 63, 63, 63, 57, 47, 32, 14, -5, -22, -36, -46, + -58, -68, -73, -71, -61, -47, -35, -23, -9, 10, 29, 43, 52, 56, 56, 56, + 52, 45, 33, 19, 6, -5, -15, -22, -25, -26, -26, -29, -29, -26, -24, -20, + -19, -23, -27, -30, -27, -21, -18, -14, -10, -7, 0, 8, 18, 30, 40, 47, + 52, 54, 54, 55, 49, 39, 22, 7, -9, -24, -37, -50, -58, -65, -71, -67, + -59, -50, -39, -23, -6, 15, 32, 43, 51, 57, 61, 64, 61, 52, 37, 21, + 4, -11, -20, -26, -30, -35, -37, -39, -35, -29, -22, -17, -20, -22, -20, -18, + -17, -16, -13, -8, -3, 2, 7, 10, 17, 27, 35, 42, 43, 44, 45, 44, + 38, 28, 16, 3, -10, -22, -33, -46, -57, -64, -64, -59, -53, -46, -34, -17, + 3, 21, 32, 41, 48, 55, 60, 60, 54, 44, 31, 18, 3, -10, -19, -27, + -30, -32, -34, -35, -30, -23, -17, -17, -20, -20, -20, -17, -15, -13, -11, -8, + 1, 8, 12, 17, 23, 30, 39, 39, 37, 36, 35, 34, 27, 14, 0, -10, + -15, -23, -34, -46, -56, -60, -56, -49, -39, -32, -23, -8, 8, 23, 32, 38, + 44, 54, 58, 57, 48, 37, 29, 17, 4, -11, -21, -28, -29, -31, -34, -35, + -27, -20, -15, -16, -16, -17, -13, -10, -10, -11, -10, -4, 5, 11, 13, 15, + 21, 29, 33, 32, 28, 25, 25, 23, 16, 5, -6, -10, -16, -21, -30, -42, + -48, -48, -43, -34, -29, -21, -13, -3, 11, 22, 27, 34, 39, 48, 53, 48, + 42, 32, 23, 16, 4, -7, -18, -24, -24, -26, -28, -24, -19, -14, -13, -16, + -18, -18, -16, -14, -15, -16, -15, -7, 3, 11, 14, 21, 27, 33, 36, 33, + 30, 25, 22, 17, 9, -4, -15, -21, -24, -31, -39, -44, -44, -39, -30, -23, + -16, -8, 4, 14, 21, 23, 25, 29, 37, 43, 42, 36, 31, 25, 18, 11, + 4, -7, -11, -13, -16, -21, -22, -18, -14, -13, -16, -19, -21, -21, -19, -19, + -20, -18, -11, -2, 8, 14, 18, 23, 30, 34, 35, 31, 27, 21, 13, 2, + -11, -17, -23, -28, -36, -39, -40, -37, -31, -23, -14, -9, 0, 7, 13, 15, + 15, 16, 22, 27, 30, 28, 29, 32, 29, 23, 16, 9, 4, 1, -2, -7, + -14, -19, -14, -10, -10, -14, -18, -22, -24, -23, -26, -28, -27, -18, -8, -3, + 2, 9, 22, 33, 40, 40, 36, 30, 25, 20, 8, -8, -22, -29, -32, -39, + -48, -50, -42, -30, -19, -13, -8, 2, 11, 22, 25, 21, 17, 15, 20, 23, + 21, 20, 20, 19, 19, 16, 11, 9, 7, 7, 3, 0, -3, -5, -5, -5, + -7, -12, -22, -28, -32, -35, -35, -36, -30, -21, -12, -4, 3, 16, 29, 39, + 46, 45, 40, 34, 26, 13, -2, -17, -28, -37, -48, -57, -60, -52, -36, -19, + -12, -8, 2, 16, 28, 33, 28, 23, 21, 22, 21, 19, 18, 16, 14, 12, + 8, 6, 5, 5, 7, 5, 4, 5, 7, 9, 7, 3, -5, -13, -22, -28, + -35, -44, -49, -48, -38, -26, -14, -7, 4, 20, 38, 49, 54, 53, 49, 40, + 26, 8, -11, -24, -33, -46, -61, -70, -67, -52, -31, -14, -5, 4, 14, 27, + 36, 36, 33, 29, 26, 25, 21, 14, 10, 7, 8, 6, 5, 5, 6, 8, + 9, 10, 14, 18, 17, 13, 5, -4, -12, -20, -28, -37, -49, -56, -56, -48, + -36, -25, -15, -2, 16, 36, 51, 55, 57, 55, 48, 37, 20, 1, -17, -30, + -43, -60, -73, -76, -63, -43, -24, -14, -6, 7, 23, 39, 44, 38, 34, 31, + 32, 30, 24, 16, 8, 5, 6, 6, 5, 5, 6, 10, 10, 13, 16, 19, + 19, 14, 5, -7, -18, -25, -34, -45, -55, -61, -59, -51, -39, -25, -12, 5, + 27, 48, 58, 60, 61, 58, 49, 32, 14, -4, -20, -36, -54, -69, -79, -75, + -57, -35, -21, -15, -4, 12, 28, 39, 42, 41, 38, 38, 38, 33, 23, 13, + 8, 9, 11, 9, 5, 3, 6, 10, 13, 14, 15, 17, 16, 9, -6, -16, + -21, -27, -40, -56, -65, -67, -57, -45, -33, -23, -5, 21, 44, 60, 66, 67, + 65, 61, 47, 25, 2, -16, -34, -53, -72, -83, -82, -70, -51, -33, -20, -8, + 8, 25, 39, 46, 43, 43, 43, 43, 38, 27, 17, 9, 8, 10, 11, 9, + 5, 5, 8, 13, 14, 18, 20, 18, 12, -2, -13, -19, -25, -34, -48, -62, + -69, -67, -58, -46, -32, -14, 9, 30, 48, 60, 69, 72, 69, 57, 36, 13, + -6, -27, -47, -66, -79, -83, -77, -64, -46, -29, -13, 4, 17, 30, 39, 41, + 46, 48, 45, 40, 31, 20, 12, 10, 13, 14, 12, 11, 10, 10, 15, 17, + 20, 20, 17, 12, 0, -14, -24, -30, -37, -47, -60, -69, -68, -62, -51, -36, + -18, 5, 25, 45, 58, 65, 68, 67, 59, 42, 20, -2, -22, -42, -61, -75, + -81, -77, -66, -51, -35, -20, -4, 14, 28, 37, 38, 38, 42, 47, 43, 35, + 24, 17, 14, 14, 17, 20, 20, 17, 13, 14, 17, 18, 18, 17, 11, -2, + -15, -24, -31, -38, -46, -52, -58, -62, -61, -52, -38, -22, -4, 16, 35, 48, + 55, 60, 62, 57, 46, 26, 6, -17, -35, -53, -68, -76, -75, -66, -51, -38, + -23, -7, 10, 25, 35, 38, 37, 39, 40, 39, 30, 21, 16, 15, 15, 16, + 20, 24, 26, 27, 27, 26, 24, 21, 19, 11, -3, -16, -29, -40, -44, -50, + -54, -57, -58, -55, -48, -36, -21, -5, 13, 29, 41, 48, 52, 53, 50, 41, + 26, 7, -14, -33, -49, -62, -70, -69, -61, -48, -36, -21, -5, 16, 30, 35, + 35, 35, 32, 31, 29, 24, 17, 13, 13, 14, 15, 18, 26, 34, 39, 37, + 32, 29, 26, 22, 13, 1, -15, -29, -40, -46, -51, -54, -55, -52, -46, -40, + -32, -22, -10, 5, 19, 28, 33, 35, 37, 38, 33, 21, 8, -7, -20, -35, + -50, -57, -57, -49, -37, -28, -21, -8, 10, 25, 32, 32, 31, 27, 24, 22, + 20, 15, 13, 13, 15, 15, 19, 26, 36, 42, 43, 40, 33, 27, 22, 16, + 3, -13, -26, -37, -44, -50, -55, -54, -48, -42, -32, -24, -18, -10, -3, 8, + 20, 30, 31, 26, 22, 20, 15, 7, -7, -20, -32, -43, -52, -52, -46, -36, + -25, -16, -5, 9, 24, 38, 42, 39, 30, 23, 19, 15, 11, 8, 6, 6, + 6, 9, 18, 30, 42, 47, 45, 43, 38, 31, 22, 8, -9, -21, -33, -45, + -55, -59, -56, -47, -37, -29, -21, -13, -5, 2, 8, 13, 19, 22, 20, 15, + 9, 5, -3, -9, -20, -30, -39, -46, -45, -40, -31, -24, -16, -6, 7, 21, + 35, 39, 36, 31, 24, 22, 15, 10, 8, 5, 6, 3, 4, 12, 25, 40, + 48, 50, 48, 43, 37, 30, 17, -2, -18, -33, -45, -57, -64, -62, -53, -40, + -31, -23, -13, -3, 4, 11, 16, 19, 18, 17, 13, 7, -3, -10, -16, -22, + -31, -40, -45, -45, -41, -32, -24, -15, -5, 8, 24, 39, 47, 44, 38, 32, + 26, 20, 12, 3, -4, -4, -5, -4, 1, 11, 29, 41, 49, 51, 49, 45, + 38, 27, 9, -11, -27, -38, -52, -60, -64, -58, -45, -32, -21, -14, -5, 3, + 10, 13, 13, 14, 14, 12, 4, -6, -12, -17, -21, -25, -31, -35, -40, -39, + -33, -27, -19, -12, 1, 16, 29, 38, 42, 40, 36, 33, 30, 22, 11, 1, + -2, -2, -3, -2, 2, 16, 32, 44, 48, 46, 44, 39, 31, 19, 1, -21, + -36, -48, -58, -62, -59, -49, -38, -28, -20, -12, -2, 9, 16, 16, 15, 16, + 14, 9, 2, -7, -14, -19, -25, -31, -36, -38, -38, -36, -34, -28, -20, -7, + 8, 22, 33, 41, 46, 46, 42, 39, 33, 25, 14, 4, -4, -8, -8, -4, + 4, 16, 30, 38, 42, 46, 45, 38, 25, 10, -7, -24, -39, -51, -58, -59, + -53, -43, -34, -28, -21, -9, 5, 15, 17, 16, 15, 16, 15, 10, 2, -10, + -17, -21, -26, -33, -38, -40, -37, -34, -33, -28, -17, 0, 15, 29, 40, 48, + 50, 48, 44, 40, 34, 26, 15, 3, -6, -11, -11, -4, 7, 18, 24, 30, + 36, 38, 35, 31, 24, 13, -7, -25, -40, -50, -53, -51, -47, -41, -38, -33, + -25, -10, 4, 14, 19, 21, 22, 19, 19, 17, 7, -5, -15, -23, -31, -39, + -46, -49, -49, -46, -41, -33, -19, 0, 21, 39, 53, 61, 64, 63, 56, 50, + 42, 31, 15, -2, -13, -19, -19, -11, 0, 10, 15, 19, 27, 33, 37, 35, + 25, 9, -13, -28, -38, -44, -46, -50, -53, -51, -46, -38, -23, -7, 10, 20, + 21, 24, 25, 28, 28, 19, 8, -7, -18, -28, -36, -43, -52, -56, -57, -51, + -44, -31, -13, 7, 29, 46, 60, 66, 71, 68, 61, 54, 45, 32, 13, -5, + -17, -22, -20, -15, -8, -2, 8, 14, 24, 31, 35, 32, 21, 4, -13, -24, + -34, -42, -49, -55, -58, -54, -48, -38, -23, -4, 14, 26, 32, 31, 32, 36, + 34, 23, 7, -12, -25, -35, -47, -61, -68, -68, -61, -53, -42, -26, -7, 22, + 45, 61, 71, 75, 78, 74, 66, 56, 42, 24, 7, -13, -24, -29, -25, -18, + -11, -7, 2, 14, 27, 36, 38, 32, 19, 1, -14, -22, -33, -44, -56, -64, + -65, -60, -47, -32, -16, 3, 18, 31, 37, 37, 38, 41, 35, 20, 0, -18, + -31, -43, -56, -64, -69, -68, -60, -50, -36, -15, 6, 31, 50, 62, 71, 77, + 78, 74, 66, 54, 38, 20, 2, -15, -23, -26, -24, -22, -17, -7, 8, 20, + 29, 35, 33, 25, 13, -2, -14, -29, -42, -57, -67, -72, -67, -57, -42, -24, + -5, 13, 31, 43, 46, 47, 48, 43, 32, 14, -5, -22, -40, -55, -63, -68, + -69, -66, -57, -44, -25, -5, 18, 37, 55, 66, 75, 78, 75, 70, 62, 47, + 28, 9, -7, -19, -27, -30, -27, -21, -11, 5, 18, 28, 34, 36, 32, 24, + 12, -4, -20, -38, -55, -68, -75, -71, -65, -53, -35, -14, 6, 24, 39, 47, + 50, 48, 44, 36, 22, 5, -16, -34, -47, -56, -60, -60, -59, -54, -45, -28, + -9, 9, 25, 41, 53, 63, 67, 66, 65, 62, 54, 40, 22, 6, -8, -16, + -22, -23, -20, -11, 1, 13, 22, 27, 29, 26, 24, 15, 2, -15, -33, -49, + -64, -74, -74, -67, -55, -39, -20, -2, 16, 32, 45, 50, 49, 43, 35, 26, + 11, -9, -25, -35, -44, -49, -52, -54, -50, -39, -26, -12, 1, 14, 27, 39, + 48, 53, 55, 57, 56, 48, 36, 25, 15, 6, -5, -12, -17, -14, -8, 3, + 14, 21, 26, 23, 21, 21, 14, 3, -11, -26, -44, -61, -72, -72, -68, -56, + -42, -25, -11, 7, 24, 37, 44, 44, 40, 33, 25, 13, 0, -12, -24, -32, + -39, -41, -39, -36, -30, -24, -18, -10, 1, 11, 21, 29, 36, 41, 47, 51, + 51, 42, 35, 27, 19, 10, 1, -6, -10, -9, -2, 6, 11, 13, 13, 15, + 14, 10, 4, -9, -19, -31, -45, -58, -67, -68, -56, -43, -31, -20, -9, 7, + 21, 31, 35, 35, 33, 27, 18, 7, -3, -9, -13, -20, -27, -32, -33, -29, + -23, -19, -16, -12, -4, 6, 15, 23, 30, 39, 47, 49, 42, 35, 31, 27, + 22, 14, 2, -8, -9, -4, 5, 8, 8, 9, 7, 6, 3, 0, -5, -12, + -22, -35, -50, -58, -58, -50, -39, -32, -26, -19, -8, 7, 21, 26, 27, 25, + 22, 18, 11, 5, 2, 1, -3, -10, -19, -24, -23, -16, -15, -17, -20, -17, + -10, -2, 6, 12, 21, 32, 44, 45, 38, 30, 27, 31, 31, 21, 8, 1, + 0, 2, 8, 10, 7, 1, -3, -2, -4, -9, -12, -17, -25, -37, -47, -53, + -50, -42, -32, -27, -26, -22, -11, 5, 15, 18, 20, 22, 23, 22, 18, 15, + 14, 11, 7, -3, -14, -18, -17, -18, -22, -27, -27, -21, -14, -6, 3, 12, + 24, 34, 40, 39, 35, 32, 31, 34, 30, 19, 10, 4, 2, 5, 7, 7, + 1, -6, -10, -9, -8, -8, -11, -16, -25, -34, -41, -41, -36, -32, -33, -33, + -29, -22, -11, -2, 6, 13, 17, 22, 23, 22, 22, 24, 23, 20, 12, 0, + -7, -11, -14, -20, -26, -28, -26, -22, -15, -9, 2, 13, 25, 32, 33, 35, + 36, 37, 38, 35, 29, 19, 9, 5, 7, 6, 4, -3, -9, -12, -11, -6, + -4, -5, -10, -17, -26, -33, -37, -38, -38, -38, -41, -39, -31, -20, -9, -2, + 6, 15, 23, 31, 31, 31, 30, 29, 28, 21, 13, 2, -9, -17, -20, -23, + -26, -27, -26, -20, -14, -6, 6, 14, 22, 26, 32, 34, 35, 37, 37, 36, + 27, 15, 6, 6, 7, 5, -3, -13, -17, -17, -11, -5, -5, -6, -11, -18, + -24, -27, -30, -35, -40, -44, -44, -39, -28, -16, -6, 1, 9, 20, 31, 34, + 36, 37, 36, 33, 23, 14, 5, -3, -10, -17, -23, -30, -34, -31, -22, -14, + -8, 0, 7, 15, 20, 26, 30, 35, 40, 40, 34, 27, 18, 14, 9, 8, + 5, -2, -11, -15, -13, -8, -4, 0, 1, -6, -12, -18, -23, -29, -38, -45, + -52, -53, -47, -37, -28, -16, -5, 6, 17, 28, 37, 42, 43, 40, 37, 31, + 19, 8, 1, -7, -14, -22, -27, -33, -34, -28, -18, -8, 0, 5, 10, 14, + 19, 25, 33, 38, 39, 35, 27, 18, 13, 9, 8, 4, -3, -8, -12, -13, + -10, -4, 4, 4, -2, -7, -14, -21, -28, -36, -45, -53, -54, -50, -44, -34, + -20, -5, 7, 18, 28, 37, 39, 42, 40, 35, 28, 17, 7, 0, -7, -12, + -18, -23, -28, -28, -23, -17, -8, 2, 8, 9, 10, 12, 17, 25, 32, 33, + 28, 20, 13, 10, 10, 8, 6, 5, 1, -5, -6, -3, 3, 10, 10, 5, + -6, -15, -21, -28, -38, -49, -59, -62, -59, -51, -39, -25, -8, 7, 17, 28, + 37, 42, 44, 43, 38, 30, 17, 7, 0, -4, -10, -16, -24, -26, -27, -21, + -14, -9, -2, 5, 11, 14, 12, 13, 19, 26, 29, 26, 19, 13, 8, 8, + 9, 5, 2, 2, 4, 3, 1, 1, 5, 8, 7, 0, -10, -18, -25, -32, + -42, -52, -56, -53, -48, -38, -29, -14, 1, 14, 23, 30, 33, 33, 35, 33, + 26, 17, 9, 2, 1, 0, -5, -12, -19, -22, -21, -13, -8, -4, 5, 10, + 12, 10, 10, 14, 21, 25, 24, 15, 5, 3, 5, 7, 5, 2, 5, 10, + 12, 10, 9, 11, 13, 10, 2, -8, -18, -25, -32, -40, -50, -55, -53, -45, + -35, -27, -17, -4, 11, 20, 28, 30, 28, 29, 30, 28, 19, 10, 6, 6, + 5, 0, -10, -18, -20, -18, -14, -11, -10, -4, 6, 13, 13, 11, 13, 20, + 25, 24, 15, 7, 3, 4, 5, 4, 0, 3, 9, 14, 15, 11, 9, 8, + 8, 6, -5, -16, -24, -29, -35, -43, -48, -47, -42, -31, -23, -17, -7, 5, + 17, 24, 26, 22, 19, 19, 20, 17, 11, 5, 2, 2, 0, -4, -10, -14, + -14, -10, -8, -6, 1, 10, 19, 23, 22, 17, 16, 19, 18, 11, 1, -8, + -11, -10, -7, -4, 1, 7, 15, 22, 22, 18, 17, 16, 12, 4, -8, -21, + -29, -34, -39, -46, -49, -46, -37, -28, -19, -9, -2, 8, 19, 22, 20, 18, + 18, 19, 19, 12, 6, 3, 2, 0, -5, -10, -16, -18, -14, -9, -8, -3, + 6, 17, 25, 27, 26, 24, 25, 22, 15, 3, -8, -13, -13, -12, -11, -6, + 0, 9, 16, 19, 19, 16, 13, 10, 6, -5, -14, -22, -26, -32, -37, -41, + -39, -32, -23, -17, -14, -10, -3, 9, 17, 18, 10, 7, 10, 16, 18, 12, + 5, 1, 1, -4, -13, -18, -18, -15, -12, -11, -10, 1, 15, 29, 37, 35, + 31, 30, 30, 24, 11, -8, -18, -18, -15, -17, -20, -17, -6, 8, 15, 18, + 16, 15, 11, 12, 8, 0, -10, -16, -20, -28, -35, -38, -33, -27, -23, -21, + -19, -13, 0, 11, 14, 12, 9, 11, 18, 21, 19, 10, 2, -3, -5, -12, + -21, -28, -26, -20, -15, -12, -6, 9, 25, 38, 43, 42, 40, 38, 34, 23, + 6, -12, -18, -18, -18, -23, -25, -22, -13, 0, 7, 9, 8, 8, 11, 12, + 9, 6, 2, -5, -14, -21, -24, -24, -22, -22, -21, -22, -20, -12, -3, 4, + 5, 5, 6, 11, 15, 16, 10, 4, -2, -7, -11, -20, -25, -27, -21, -13, + -11, -5, 6, 22, 37, 46, 50, 49, 44, 39, 31, 16, -3, -15, -21, -24, + -27, -32, -33, -28, -17, -5, 5, 7, 7, 10, 15, 16, 15, 10, 4, -4, + -11, -18, -22, -22, -20, -22, -21, -21, -17, -10, 1, 6, 9, 10, 15, 19, + 18, 12, 5, 0, -9, -15, -23, -31, -36, -32, -24, -17, -11, -4, 12, 31, + 47, 53, 58, 60, 56, 49, 35, 15, -4, -16, -21, -25, -32, -42, -45, -35, + -23, -14, -8, 0, 6, 13, 20, 21, 19, 15, 9, 1, -6, -11, -13, -16, + -18, -20, -23, -20, -14, -8, 0, 2, 5, 11, 18, 18, 14, 6, -2, -10, + -18, -27, -34, -41, -40, -31, -20, -12, -7, 4, 23, 47, 64, 71, 71, 63, + 56, 46, 30, 12, -7, -22, -35, -42, -49, -52, -48, -34, -22, -14, -7, 3, + 15, 24, 27, 27, 24, 15, 6, -4, -8, -11, -13, -13, -15, -16, -14, -12, + -7, -2, 3, 10, 12, 14, 15, 7, 0, -7, -16, -25, -32, -40, -44, -44, + -36, -24, -11, 0, 6, 16, 36, 58, 72, 76, 71, 62, 51, 38, 24, 5, + -13, -30, -42, -50, -52, -53, -46, -33, -21, -15, -6, 7, 20, 25, 25, 21, + 18, 14, 7, 2, -5, -9, -9, -7, -8, -9, -10, -7, -3, 1, 6, 7, + 8, 9, 6, -2, -13, -23, -30, -35, -41, -45, -44, -38, -26, -15, -3, 11, + 19, 33, 52, 69, 75, 72, 65, 54, 42, 29, 13, -6, -25, -41, -49, -54, + -55, -48, -38, -26, -18, -8, 1, 13, 24, 29, 26, 19, 11, 5, 2, -2, + -6, -6, -6, -5, -7, -5, 1, 5, 9, 11, 8, 8, 7, 4, -6, -17, + -28, -35, -42, -47, -48, -45, -39, -29, -16, -5, 7, 18, 32, 45, 57, 64, + 67, 62, 54, 45, 35, 22, 5, -13, -28, -40, -47, -49, -46, -42, -32, -21, + -11, -4, 6, 15, 21, 21, 16, 12, 6, 1, -3, -5, -3, 3, 8, 9, + 8, 7, 7, 11, 12, 11, 6, -2, -9, -13, -20, -29, -40, -47, -47, -45, + -42, -37, -29, -16, -5, 7, 17, 27, 38, 48, 56, 59, 53, 44, 40, 37, + 30, 17, -2, -16, -25, -32, -35, -36, -35, -31, -23, -16, -10, -3, 4, 10, + 11, 8, 1, 0, 0, 0, 0, 1, 6, 14, 20, 21, 19, 15, 14, 13, + 11, 7, 0, -13, -21, -28, -37, -46, -51, -48, -43, -37, -32, -28, -21, -9, + 4, 17, 27, 32, 40, 45, 50, 51, 46, 40, 38, 35, 27, 12, -3, -13, + -23, -27, -29, -30, -29, -28, -23, -15, -10, -5, 2, 5, 5, 1, -2, -2, + 1, 4, 4, 8, 14, 19, 25, 26, 21, 15, 13, 12, 12, 5, -9, -21, + -30, -37, -43, -50, -51, -47, -42, -38, -34, -27, -17, -5, 10, 22, 30, 38, + 44, 49, 50, 46, 40, 37, 38, 33, 19, 4, -8, -14, -18, -22, -24, -24, + -22, -18, -16, -14, -10, -6, 1, 1, -6, -8, -9, -6, 0, 2, 8, 14, + 21, 28, 31, 27, 24, 21, 20, 16, 9, -3, -16, -26, -33, -42, -50, -55, + -56, -50, -43, -39, -38, -29, -13, 6, 18, 27, 33, 42, 51, 54, 53, 48, + 41, 39, 38, 29, 12, -5, -15, -19, -20, -23, -24, -22, -18, -17, -13, -12, + -10, -4, -3, -4, -7, -8, -9, -9, -7, 2, 9, 14, 21, 26, 27, 27, + 22, 20, 19, 17, 12, 1, -14, -25, -35, -41, -45, -50, -53, -54, -51, -47, + -41, -31, -18, -3, 12, 24, 35, 47, 55, 58, 57, 55, 49, 46, 40, 26, + 11, -5, -17, -22, -23, -23, -22, -21, -21, -18, -15, -9, -5, -3, -4, -6, + -7, -9, -12, -12, -8, 1, 7, 13, 14, 19, 23, 27, 26, 25, 25, 20, + 13, 4, -9, -22, -36, -42, -48, -55, -61, -62, -59, -54, -43, -32, -18, 0, + 18, 35, 49, 57, 60, 62, 63, 61, 57, 48, 33, 15, -2, -15, -24, -28, + -27, -22, -23, -24, -21, -13, -4, 3, 3, 1, -2, -4, -4, -9, -15, -16, + -13, -9, -5, 2, 7, 11, 19, 24, 28, 31, 29, 28, 24, 12, -4, -21, + -33, -38, -48, -61, -72, -76, -71, -61, -47, -34, -20, 2, 26, 45, 58, 65, + 69, 74, 75, 68, 55, 41, 28, 13, -7, -22, -32, -32, -29, -24, -23, -22, + -19, -7, 6, 7, 2, -2, -3, 0, -3, -10, -20, -24, -19, -12, -5, 1, + 5, 14, 23, 30, 33, 37, 39, 36, 24, 8, -10, -25, -33, -43, -55, -71, + -82, -82, -71, -57, -44, -29, -11, 13, 34, 52, 64, 70, 73, 77, 76, 65, + 50, 35, 20, 4, -13, -26, -31, -32, -27, -26, -25, -21, -10, 2, 8, 5, + 3, 0, 1, 2, -3, -12, -22, -24, -21, -16, -9, -3, 6, 14, 22, 28, + 34, 41, 42, 35, 23, 6, -10, -21, -32, -45, -61, -76, -85, -82, -70, -54, + -43, -29, -7, 18, 40, 55, 64, 71, 77, 81, 76, 62, 48, 32, 19, 6, + -10, -23, -30, -29, -28, -30, -27, -20, -10, -2, 3, 1, 0, 3, 6, 4, + -9, -18, -24, -22, -18, -14, -8, 0, 8, 16, 24, 32, 38, 42, 42, 31, + 15, -2, -14, -25, -38, -52, -67, -81, -85, -76, -63, -49, -37, -19, 3, 26, + 43, 57, 67, 75, 82, 79, 70, 56, 41, 28, 15, 1, -12, -22, -27, -27, + -28, -26, -21, -12, -3, 3, -2, -2, 1, 3, 1, -12, -22, -28, -29, -27, + -23, -18, -11, 3, 16, 25, 34, 44, 51, 52, 43, 27, 12, -2, -17, -34, + -51, -71, -82, -86, -83, -75, -61, -45, -27, -7, 16, 37, 53, 63, 72, 78, + 77, 68, 60, 45, 33, 20, 10, -2, -9, -15, -18, -22, -23, -19, -15, -8, + -5, -7, -8, -7, -4, -3, -10, -22, -29, -29, -24, -21, -18, -14, -3, 12, + 23, 27, 35, 44, 49, 47, 34, 18, 1, -11, -23, -40, -57, -73, -81, -80, + -74, -64, -50, -36, -19, 2, 22, 38, 49, 61, 69, 74, 69, 60, 50, 40, + 29, 20, 10, 2, -5, -9, -12, -16, -18, -14, -9, -6, -10, -13, -12, -10, + -11, -15, -23, -30, -31, -27, -25, -23, -19, -8, 8, 20, 28, 36, 45, 49, + 49, 41, 29, 15, -2, -15, -31, -49, -65, -76, -79, -77, -67, -55, -43, -30, + -13, 7, 25, 40, 51, 60, 66, 66, 62, 54, 45, 37, 29, 22, 14, 7, + 3, -3, -7, -10, -12, -10, -8, -12, -18, -19, -16, -13, -15, -23, -31, -33, + -29, -26, -25, -23, -15, 1, 14, 23, 31, 40, 50, 52, 46, 36, 21, 7, + -8, -24, -41, -58, -70, -75, -74, -67, -57, -43, -30, -18, -3, 13, 26, 39, + 48, 56, 60, 58, 51, 45, 42, 36, 29, 25, 20, 14, 9, 6, 3, 0, + -5, -6, -12, -17, -22, -21, -20, -24, -33, -37, -38, -35, -30, -28, -24, -17, + -3, 12, 24, 33, 43, 50, 52, 49, 40, 28, 13, -3, -18, -34, -51, -63, + -71, -72, -67, -59, -49, -37, -24, -10, 3, 16, 27, 37, 46, 50, 53, 51, + 49, 46, 43, 37, 32, 29, 25, 21, 17, 10, 4, -3, -8, -10, -11, -18, + -25, -29, -31, -34, -37, -40, -40, -37, -31, -25, -20, -13, 0, 17, 31, 41, + 48, 50, 49, 46, 36, 22, 8, -5, -20, -36, -49, -61, -67, -67, -61, -51, + -44, -36, -23, -9, 4, 13, 20, 30, 38, 46, 48, 47, 44, 44, 44, 46, + 42, 35, 31, 28, 24, 15, 5, -3, -6, -10, -18, -28, -35, -39, -41, -41, + -43, -45, -42, -36, -29, -23, -15, 1, 15, 28, 40, 47, 51, 51, 46, 37, + 27, 14, 2, -14, -29, -42, -49, -54, -62, -63, -57, -49, -41, -31, -21, -12, + -3, 6, 17, 25, 32, 40, 45, 49, 50, 48, 49, 49, 48, 44, 39, 34, + 26, 13, 4, -4, -11, -17, -23, -32, -41, -48, -48, -49, -48, -44, -39, -36, + -31, -21, -5, 13, 24, 35, 44, 51, 52, 47, 39, 30, 21, 8, -6, -18, + -34, -44, -50, -54, -59, -58, -53, -46, -38, -28, -18, -10, -4, 6, 16, 24, + 30, 37, 42, 48, 49, 47, 48, 51, 51, 49, 45, 35, 27, 17, 9, 0, + -12, -23, -32, -41, -48, -53, -55, -54, -53, -49, -43, -38, -27, -13, 5, 20, + 33, 44, 52, 58, 57, 50, 40, 29, 16, 5, -11, -29, -43, -53, -56, -62, + -65, -63, -54, -42, -33, -24, -16, -8, 3, 16, 23, 29, 33, 38, 44, 46, + 45, 43, 45, 49, 52, 48, 42, 37, 28, 19, 10, 0, -13, -25, -36, -42, + -47, -56, -58, -56, -53, -49, -48, -40, -26, -6, 13, 27, 39, 49, 59, 64, + 62, 53, 42, 29, 16, 2, -18, -37, -52, -60, -65, -71, -75, -68, -55, -41, + -30, -19, -10, 0, 14, 24, 33, 37, 38, 39, 42, 45, 45, 43, 45, 48, + 47, 46, 41, 35, 28, 19, 8, -6, -20, -30, -38, -44, -50, -55, -57, -59, + -57, -53, -46, -35, -19, 0, 17, 32, 45, 59, 66, 66, 59, 54, 46, 32, + 15, -5, -24, -43, -57, -65, -71, -76, -78, -71, -58, -41, -27, -16, -5, 5, + 15, 27, 37, 43, 43, 42, 42, 42, 43, 46, 46, 46, 45, 42, 41, 35, + 28, 18, 7, -6, -18, -29, -37, -44, -51, -56, -59, -61, -60, -55, -45, -33, + -18, -2, 18, 37, 50, 61, 67, 68, 65, 59, 47, 31, 10, -11, -32, -47, + -58, -71, -81, -86, -83, -70, -52, -36, -21, -9, 2, 13, 25, 35, 41, 44, + 43, 40, 39, 39, 40, 43, 43, 40, 39, 40, 40, 36, 28, 18, 9, -5, + -18, -28, -36, -44, -52, -57, -61, -64, -63, -56, -43, -27, -13, 6, 26, 44, + 56, 66, 71, 71, 64, 55, 42, 23, 3, -19, -38, -52, -66, -76, -82, -86, + -81, -67, -49, -32, -19, -8, 3, 15, 28, 36, 42, 43, 43, 41, 41, 40, + 40, 41, 40, 40, 41, 41, 36, 30, 24, 17, 10, -5, -19, -29, -37, -43, + -50, -57, -64, -66, -60, -50, -40, -28, -10, 12, 32, 45, 54, 59, 64, 67, + 63, 54, 35, 14, -6, -22, -35, -50, -64, -75, -82, -81, -73, -59, -46, -33, + -21, -8, 5, 19, 27, 33, 40, 44, 44, 42, 40, 42, 41, 40, 38, 39, + 38, 38, 35, 30, 21, 13, 4, -8, -16, -25, -35, -45, -53, -62, -65, -63, + -56, -47, -39, -25, -6, 15, 32, 45, 53, 58, 64, 65, 60, 48, 30, 9, + -7, -19, -31, -47, -60, -72, -79, -79, -73, -61, -50, -37, -24, -10, 3, 12, + 22, 33, 43, 47, 46, 44, 43, 45, 46, 45, 45, 43, 41, 38, 34, 26, + 16, 7, -2, -10, -19, -29, -39, -50, -59, -64, -62, -58, -51, -44, -34, -22, + -2, 16, 30, 41, 52, 56, 57, 58, 54, 42, 29, 13, 2, -12, -27, -42, + -56, -67, -71, -73, -70, -63, -55, -42, -26, -10, 2, 11, 20, 33, 41, 46, + 45, 43, 49, 53, 52, 48, 44, 43, 42, 38, 33, 22, 12, 4, -5, -13, + -23, -34, -43, -50, -57, -61, -60, -55, -49, -40, -29, -14, -2, 12, 25, 35, + 44, 51, 56, 56, 49, 39, 30, 20, 10, -2, -17, -32, -48, -60, -67, -74, + -77, -74, -66, -50, -36, -21, -9, 0, 14, 30, 43, 51, 53, 57, 62, 64, + 62, 58, 53, 48, 42, 36, 25, 12, 4, -4, -12, -21, -31, -38, -43, -45, + -47, -49, -47, -44, -40, -34, -28, -22, -11, 1, 11, 21, 28, 39, 49, 53, + 52, 49, 44, 38, 29, 16, -4, -24, -41, -57, -74, -86, -90, -86, -73, -59, + -44, -30, -16, 1, 21, 40, 54, 61, 66, 67, 71, 72, 65, 57, 49, 41, + 33, 24, 12, 1, -8, -12, -15, -22, -31, -37, -35, -31, -33, -36, -39, -40, + -38, -34, -32, -29, -24, -14, -2, 11, 24, 36, 48, 56, 61, 63, 59, 54, + 44, 27, 6, -19, -46, -68, -84, -94, -99, -98, -90, -72, -51, -30, -15, 1, + 22, 46, 64, 76, 78, 80, 81, 78, 72, 60, 45, 34, 24, 13, 0, -13, + -18, -18, -18, -22, -28, -29, -24, -19, -19, -26, -33, -38, -40, -40, -41, -42, + -41, -32, -15, 6, 22, 37, 50, 62, 74, 79, 76, 65, 50, 30, 6, -24, + -54, -78, -94, -106, -110, -103, -89, -69, -49, -29, -10, 11, 36, 57, 73, 78, + 80, 82, 83, 77, 66, 51, 37, 24, 14, 5, -5, -12, -17, -17, -17, -18, + -19, -17, -13, -13, -19, -28, -37, -44, -44, -48, -53, -59, -54, -35, -12, 11, + 29, 46, 61, 78, 88, 90, 84, 68, 49, 24, -6, -39, -71, -92, -104, -115, + -116, -108, -89, -66, -43, -21, 1, 24, 49, 68, 78, 82, 81, 81, 79, 71, + 56, 37, 24, 15, 6, -4, -9, -11, -9, -6, -6, -10, -11, -6, -4, -8, + -20, -33, -44, -55, -61, -65, -70, -68, -55, -31, -6, 15, 38, 61, 82, 97, + 101, 94, 80, 61, 37, 9, -25, -60, -88, -107, -119, -123, -116, -99, -77, -53, + -30, -5, 20, 47, 68, 80, 82, 82, 80, 77, 70, 57, 40, 23, 10, 3, + -2, -3, -4, -3, 2, 5, 7, 5, 5, 4, -4, -17, -32, -45, -60, -69, + -74, -79, -80, -70, -47, -20, 9, 32, 55, 76, 94, 104, 103, 91, 71, 46, + 16, -16, -48, -75, -97, -115, -121, -117, -101, -80, -57, -32, -8, 15, 39, 58, + 68, 73, 73, 73, 69, 61, 50, 39, 26, 15, 7, 4, 7, 12, 18, 19, + 20, 18, 17, 15, 10, -4, -20, -41, -57, -68, -77, -85, -91, -90, -76, -53, + -25, 2, 28, 55, 79, 97, 106, 104, 94, 77, 52, 22, -9, -39, -67, -92, + -111, -119, -115, -99, -79, -55, -33, -11, 15, 37, 55, 67, 71, 68, 61, 51, + 44, 40, 35, 24, 10, 3, 4, 13, 25, 36, 42, 41, 34, 29, 20, 12, + -2, -21, -43, -66, -84, -94, -96, -96, -93, -81, -55, -26, 4, 30, 56, 80, + 98, 107, 106, 95, 77, 53, 24, -8, -38, -64, -85, -101, -109, -109, -100, -80, + -55, -31, -8, 13, 31, 46, 56, 61, 59, 52, 43, 36, 30, 25, 16, 8, + 7, 11, 23, 37, 48, 56, 59, 56, 48, 33, 17, -5, -29, -54, -79, -96, + -106, -109, -105, -96, -82, -57, -25, 8, 38, 61, 79, 94, 103, 102, 92, 73, + 46, 19, -10, -36, -62, -81, -95, -101, -100, -90, -71, -47, -25, -3, 18, 31, + 41, 49, 53, 50, 42, 32, 21, 13, 9, 7, 8, 8, 12, 30, 49, 63, + 71, 76, 75, 67, 48, 25, -3, -30, -59, -87, -107, -120, -124, -117, -105, -89, + -63, -31, 5, 40, 63, 81, 92, 100, 100, 88, 69, 46, 20, -6, -31, -55, + -73, -87, -91, -88, -80, -64, -45, -22, 1, 16, 27, 34, 39, 45, 41, 31, + 20, 9, 4, 3, 1, 3, 6, 15, 32, 53, 71, 81, 85, 86, 78, 61, + 35, 3, -29, -63, -93, -113, -124, -128, -124, -110, -89, -64, -32, 5, 38, 62, + 80, 91, 98, 93, 80, 63, 42, 19, -5, -29, -51, -68, -78, -81, -79, -72, + -58, -40, -19, 0, 13, 21, 29, 35, 35, 29, 21, 14, 8, 2, -2, -3, + 1, 10, 20, 36, 56, 73, 84, 89, 89, 81, 65, 41, 6, -32, -63, -90, + -110, -124, -127, -123, -110, -89, -61, -30, 2, 33, 56, 71, 81, 86, 85, 74, + 58, 38, 17, -5, -21, -38, -52, -62, -69, -69, -64, -50, -34, -18, -5, 5, + 13, 23, 28, 27, 22, 15, 10, 6, 1, 0, -2, 2, 9, 23, 41, 56, + 72, 84, 88, 89, 81, 66, 45, 15, -20, -55, -84, -106, -119, -121, -116, -105, + -89, -67, -38, -7, 21, 44, 58, 69, 75, 74, 64, 50, 36, 22, 8, -10, + -26, -39, -47, -54, -56, -53, -47, -36, -25, -11, -2, 5, 14, 23, 24, 20, + 12, 7, 6, 6, 6, 4, 5, 10, 22, 39, 57, 72, 80, 82, 80, 73, + 62, 45, 18, -13, -48, -78, -96, -105, -105, -104, -97, -81, -64, -40, -15, 10, + 28, 40, 49, 54, 53, 49, 42, 31, 22, 13, 2, -9, -17, -22, -30, -38, + -40, -37, -33, -28, -22, -16, -10, -5, 5, 11, 11, 6, 3, 5, 11, 16, + 16, 18, 22, 29, 40, 54, 68, 75, 74, 72, 63, 49, 35, 15, -10, -37, + -63, -83, -94, -95, -89, -82, -73, -63, -46, -24, -2, 16, 25, 31, 35, 39, + 41, 37, 30, 22, 15, 11, 4, -3, -11, -18, -25, -31, -35, -33, -28, -22, + -18, -16, -13, -4, 5, 10, 11, 10, 5, 6, 14, 21, 23, 24, 27, 33, + 45, 59, 68, 72, 67, 57, 46, 34, 19, 0, -24, -49, -70, -81, -82, -77, + -70, -65, -60, -49, -34, -15, 2, 9, 13, 14, 18, 20, 21, 19, 18, 17, + 16, 15, 13, 10, 5, -3, -12, -20, -26, -28, -27, -24, -26, -25, -18, -9, + 3, 9, 10, 10, 11, 18, 27, 32, 33, 33, 35, 42, 51, 58, 59, 55, + 46, 36, 25, 16, 3, -15, -33, -50, -61, -65, -64, -59, -57, -56, -52, -42, + -29, -14, -5, -2, -3, 1, 8, 12, 13, 13, 16, 16, 18, 19, 19, 14, + 4, -3, -10, -19, -24, -24, -22, -20, -24, -23, -16, -2, 10, 16, 14, 13, + 16, 28, 35, 36, 35, 32, 33, 40, 45, 49, 47, 41, 31, 20, 12, 4, + -8, -16, -29, -41, -50, -53, -50, -49, -51, -51, -48, -40, -30, -20, -13, -13, + -12, -6, 2, 8, 12, 13, 16, 21, 26, 27, 23, 15, 8, 0, -10, -19, + -23, -24, -24, -26, -25, -21, -9, 5, 15, 19, 20, 22, 28, 36, 39, 38, + 36, 33, 33, 35, 37, 38, 36, 30, 20, 9, 4, -3, -10, -17, -26, -35, + -40, -45, -47, -51, -52, -49, -46, -39, -30, -23, -19, -17, -12, -5, 1, 4, + 7, 11, 18, 22, 22, 22, 20, 17, 12, 3, -8, -16, -18, -16, -17, -19, + -18, -12, 3, 13, 19, 20, 24, 29, 34, 35, 33, 32, 31, 31, 30, 26, + 24, 24, 25, 21, 14, 6, 0, -4, -5, -10, -19, -31, -37, -40, -47, -51, + -50, -49, -45, -39, -31, -25, -19, -12, -6, -3, 0, 2, 6, 13, 17, 18, + 16, 15, 16, 14, 7, -3, -10, -12, -13, -13, -14, -13, -6, 6, 18, 24, + 25, 26, 29, 33, 32, 26, 24, 23, 23, 22, 18, 14, 15, 21, 24, 22, + 14, 6, 4, 4, 1, -9, -21, -32, -41, -47, -50, -54, -54, -51, -47, -37, + -30, -21, -10, -3, 1, 4, 6, 7, 8, 7, 7, 7, 7, 6, 6, 5, + 2, -3, -8, -8, -6, -3, 1, 3, 9, 17, 25, 29, 32, 33, 29, 26, + 24, 23, 20, 17, 14, 11, 8, 8, 14, 21, 22, 17, 13, 9, 9, 7, + 1, -11, -25, -37, -44, -52, -53, -55, -55, -51, -43, -35, -24, -14, -4, 3, + 4, 4, 6, 7, 6, 3, -2, -2, 2, 6, 5, 1, -4, -8, -7, -5, + 3, 9, 9, 12, 17, 25, 32, 37, 37, 32, 25, 21, 19, 17, 15, 9, + 6, 6, 6, 8, 14, 23, 24, 20, 15, 14, 11, 3, -6, -18, -31, -44, + -53, -54, -57, -58, -55, -47, -37, -26, -16, -4, 7, 10, 10, 9, 7, 3, + -2, -6, -8, -6, -5, -4, -7, -10, -8, -6, 0, 6, 12, 16, 20, 27, + 33, 35, 35, 36, 34, 28, 21, 16, 10, 7, 7, 5, 3, 1, 5, 12, + 21, 25, 23, 17, 14, 13, 9, -3, -17, -30, -41, -50, -54, -59, -61, -55, + -46, -37, -26, -15, -4, 7, 14, 15, 12, 6, 1, -3, -7, -12, -14, -15, + -13, -12, -12, -12, -8, 0, 8, 15, 20, 25, 31, 36, 40, 41, 41, 38, + 33, 27, 21, 12, 4, 1, 0, -4, -5, -2, 5, 12, 17, 19, 19, 18, + 14, 11, 2, -9, -21, -32, -42, -49, -55, -57, -56, -49, -39, -30, -20, -8, + 3, 12, 17, 18, 12, 5, -2, -8, -14, -18, -21, -22, -21, -21, -19, -13, + -7, 4, 14, 24, 32, 39, 44, 48, 47, 44, 41, 38, 33, 27, 17, 7, + -3, -5, -5, -5, -5, -5, 3, 12, 17, 19, 16, 11, 7, 3, -6, -15, + -26, -36, -42, -48, -53, -54, -50, -40, -31, -22, -12, -2, 11, 19, 20, 13, + 6, 2, -5, -12, -21, -26, -29, -31, -30, -27, -21, -13, -2, 12, 25, 36, + 48, 57, 62, 60, 51, 46, 43, 37, 28, 15, 3, -8, -12, -14, -12, -10, + -7, -4, 8, 16, 20, 17, 14, 10, 6, -2, -12, -24, -32, -39, -45, -51, + -54, -52, -43, -32, -21, -12, -2, 11, 22, 28, 24, 13, 4, -6, -14, -23, + -32, -38, -41, -42, -39, -31, -20, -8, 6, 21, 37, 50, 63, 69, 68, 61, + 55, 48, 39, 29, 20, 9, -6, -15, -17, -13, -11, -7, -4, 3, 11, 13, + 16, 15, 10, 5, 0, -8, -15, -25, -31, -37, -42, -49, -52, -46, -37, -30, + -21, -12, 0, 14, 25, 28, 25, 15, 2, -11, -22, -29, -36, -44, -49, -49, + -43, -32, -18, -5, 13, 30, 50, 66, 74, 75, 71, 68, 61, 50, 37, 26, + 15, 3, -13, -22, -22, -20, -16, -14, -9, 1, 9, 11, 11, 9, 9, 9, + 6, -3, -15, -25, -32, -37, -41, -50, -53, -50, -41, -30, -20, -8, 6, 21, + 31, 33, 26, 15, 0, -12, -23, -34, -46, -56, -60, -54, -44, -31, -19, -2, + 21, 44, 66, 77, 81, 79, 75, 72, 63, 51, 35, 23, 10, -4, -16, -25, + -28, -26, -22, -16, -12, -7, -2, 4, 8, 10, 14, 14, 7, -3, -12, -20, + -28, -36, -42, -48, -53, -53, -43, -31, -19, -6, 12, 25, 31, 30, 26, 15, + -2, -17, -28, -40, -52, -60, -61, -53, -40, -25, -9, 11, 32, 56, 74, 84, + 85, 81, 76, 72, 61, 46, 29, 13, -2, -16, -23, -29, -33, -31, -25, -19, + -14, -8, 2, 10, 14, 18, 19, 17, 8, 1, -12, -24, -35, -42, -49, -54, + -57, -53, -43, -30, -13, 7, 22, 32, 34, 32, 26, 11, -8, -24, -40, -50, + -60, -66, -63, -53, -36, -17, 2, 23, 45, 67, 84, 90, 91, 85, 78, 72, + 62, 44, 24, 4, -9, -21, -32, -39, -41, -36, -30, -23, -17, -9, 2, 13, + 23, 27, 26, 19, 12, 2, -12, -26, -38, -47, -54, -59, -59, -53, -41, -23, + -5, 14, 28, 36, 36, 31, 21, 6, -13, -31, -46, -58, -66, -70, -65, -50, + -28, -7, 14, 35, 58, 76, 89, 96, 94, 90, 82, 72, 54, 35, 16, -5, + -21, -31, -40, -48, -47, -38, -28, -20, -13, 1, 15, 28, 33, 33, 27, 18, + 8, -6, -21, -37, -52, -64, -66, -65, -58, -47, -30, -9, 13, 28, 38, 43, + 40, 31, 15, -5, -24, -40, -57, -69, -75, -74, -65, -48, -26, -2, 24, 47, + 66, 83, 97, 102, 102, 101, 91, 73, 51, 28, 7, -15, -33, -45, -56, -60, + -54, -42, -28, -17, -4, 13, 26, 36, 38, 36, 29, 16, 2, -14, -34, -52, + -62, -66, -65, -63, -53, -36, -15, 9, 27, 36, 41, 40, 35, 25, 8, -16, + -37, -55, -68, -77, -81, -75, -60, -37, -12, 12, 35, 57, 75, 94, 105, 107, + 103, 97, 84, 64, 41, 18, -6, -25, -40, -51, -57, -56, -46, -32, -19, -6, + 7, 20, 30, 34, 32, 24, 12, 0, -17, -33, -47, -60, -65, -64, -58, -46, + -31, -12, 8, 26, 37, 43, 44, 41, 28, 11, -12, -31, -49, -67, -81, -87, + -85, -72, -52, -30, -6, 21, 45, 69, 87, 101, 110, 113, 110, 100, 77, 51, + 27, 8, -11, -32, -49, -59, -59, -53, -41, -27, -11, 3, 14, 24, 28, 28, + 24, 17, 5, -15, -32, -45, -54, -61, -58, -54, -44, -32, -13, 8, 26, 37, + 41, 40, 36, 29, 16, -3, -24, -47, -66, -81, -89, -88, -76, -58, -37, -16, + 10, 34, 58, 78, 94, 106, 111, 107, 97, 81, 58, 37, 17, 0, -17, -33, + -45, -51, -48, -38, -26, -14, -3, 9, 16, 19, 17, 14, 10, 0, -15, -30, + -42, -49, -52, -49, -44, -37, -25, -8, 9, 21, 29, 32, 35, 33, 29, 19, + 1, -18, -38, -58, -75, -85, -85, -79, -70, -52, -29, -6, 20, 44, 67, 89, + 101, 110, 114, 107, 93, 72, 49, 28, 10, -9, -25, -38, -48, -49, -42, -31, + -20, -11, 0, 9, 13, 12, 7, 5, 0, -11, -24, -36, -42, -44, -43, -38, + -28, -16, -4, 8, 16, 22, 29, 30, 29, 24, 13, 2, -14, -32, -51, -68, + -79, -83, -77, -69, -56, -41, -19, 6, 31, 53, 74, 90, 101, 108, 109, 101, + 83, 60, 38, 24, 9, -10, -25, -36, -40, -37, -29, -21, -13, -8, 0, 3, + 0, -5, -6, -8, -16, -27, -35, -39, -40, -33, -27, -21, -11, 3, 14, 21, + 24, 27, 26, 22, 19, 13, 3, -14, -32, -53, -66, -74, -80, -80, -75, -63, + -47, -28, -4, 19, 41, 66, 85, 99, 105, 106, 104, 95, 76, 51, 29, 13, + 2, -12, -27, -36, -38, -32, -22, -15, -12, -8, -3, -4, -9, -12, -14, -18, + -26, -31, -35, -36, -29, -20, -10, -2, 7, 16, 25, 25, 24, 19, 15, 10, + 4, -4, -16, -30, -44, -57, -67, -73, -75, -70, -60, -48, -34, -16, 5, 27, + 51, 71, 85, 92, 99, 101, 95, 82, 64, 44, 28, 14, 1, -12, -22, -28, + -27, -22, -18, -17, -15, -15, -15, -21, -23, -25, -24, -27, -31, -34, -30, -21, + -6, 7, 13, 17, 22, 27, 28, 24, 16, 7, -3, -10, -17, -27, -35, -43, + -50, -58, -68, -70, -65, -53, -42, -32, -22, -4, 15, 36, 54, 70, 83, 89, + 92, 91, 82, 68, 54, 42, 29, 14, 2, -9, -17, -21, -22, -20, -21, -20, + -23, -26, -30, -32, -32, -29, -27, -28, -30, -26, -15, 0, 15, 25, 25, 25, + 26, 27, 21, 11, 0, -9, -17, -24, -30, -38, -45, -47, -49, -55, -59, -56, + -48, -39, -28, -20, -9, 7, 26, 44, 55, 65, 72, 79, 80, 77, 66, 57, + 49, 41, 30, 19, 7, -2, -7, -12, -17, -22, -25, -29, -33, -36, -39, -41, + -36, -29, -26, -26, -22, -11, 2, 17, 28, 32, 31, 29, 28, 23, 11, -2, + -9, -17, -24, -36, -44, -48, -49, -50, -53, -54, -54, -47, -36, -25, -17, -7, + 7, 21, 36, 47, 55, 63, 70, 72, 69, 60, 52, 46, 42, 34, 23, 15, + 8, 3, 0, -7, -14, -21, -24, -27, -32, -39, -44, -43, -37, -29, -25, -23, + -16, -2, 14, 26, 32, 33, 32, 30, 25, 16, 4, -6, -16, -25, -36, -45, + -50, -54, -51, -51, -54, -54, -48, -36, -23, -15, -6, 5, 17, 31, 42, 51, + 59, 62, 63, 61, 56, 51, 43, 40, 38, 28, 20, 13, 9, 7, 2, -8, + -16, -23, -27, -31, -36, -40, -43, -39, -31, -23, -20, -15, -4, 11, 24, 31, + 32, 31, 30, 25, 17, 7, -3, -13, -23, -36, -48, -56, -58, -57, -53, -50, + -52, -51, -40, -25, -12, 0, 7, 16, 25, 36, 49, 58, 60, 59, 57, 54, + 49, 43, 36, 31, 26, 18, 13, 10, 6, 4, 0, -6, -12, -19, -22, -26, + -31, -35, -35, -32, -27, -22, -16, -7, 4, 13, 21, 26, 30, 29, 27, 22, + 15, 4, -7, -19, -31, -44, -55, -59, -59, -58, -54, -52, -49, -41, -28, -14, + 0, 10, 18, 26, 33, 44, 50, 53, 51, 50, 48, 46, 41, 37, 30, 24, + 21, 18, 15, 13, 8, 4, 0, -6, -9, -14, -19, -23, -27, -33, -33, -31, + -25, -19, -11, -3, 3, 11, 20, 28, 31, 28, 22, 14, 8, -3, -15, -29, + -40, -49, -57, -62, -60, -56, -50, -47, -42, -32, -18, -3, 11, 20, 25, 29, + 35, 43, 49, 51, 47, 43, 41, 37, 33, 29, 24, 18, 15, 14, 13, 11, + 8, 5, 1, 0, -5, -11, -19, -23, -24, -25, -25, -26, -22, -15, -9, -3, + 4, 12, 19, 25, 26, 24, 17, 11, 2, -11, -26, -37, -45, -53, -58, -59, + -57, -53, -47, -42, -35, -25, -10, 5, 15, 19, 22, 29, 37, 45, 48, 47, + 44, 44, 43, 40, 33, 24, 19, 14, 13, 12, 8, 2, -2, 1, 1, 1, + -4, -12, -15, -14, -13, -14, -18, -18, -15, -12, -8, -5, 2, 10, 18, 21, + 20, 15, 10, 3, -7, -18, -31, -42, -47, -50, -53, -57, -57, -51, -42, -34, + -25, -15, -5, 7, 16, 22, 30, 35, 40, 43, 42, 39, 39, 38, 38, 31, + 22, 16, 14, 15, 17, 16, 12, 6, 4, 5, 7, 6, 0, -8, -12, -13, + -15, -19, -21, -20, -17, -14, -11, -6, 2, 10, 18, 21, 21, 19, 11, -2, + -17, -29, -37, -42, -46, -52, -55, -58, -52, -42, -34, -24, -15, -5, 5, 12, + 17, 24, 32, 37, 37, 36, 33, 33, 35, 35, 32, 26, 22, 16, 17, 19, + 19, 14, 7, 5, 5, 6, 5, 0, -7, -10, -9, -6, -7, -13, -17, -15, + -11, -8, -7, -6, 1, 7, 12, 13, 11, 7, 0, -12, -25, -35, -40, -42, + -43, -44, -47, -49, -43, -34, -22, -12, -7, 0, 4, 9, 17, 25, 31, 33, + 33, 31, 30, 27, 28, 30, 29, 25, 20, 17, 20, 24, 22, 17, 11, 10, + 9, 9, 5, -6, -11, -13, -9, -5, -9, -16, -19, -16, -9, -6, -6, -2, + 4, 8, 11, 11, 6, -4, -11, -21, -34, -39, -41, -40, -38, -40, -44, -38, + -28, -17, -10, -6, -5, -3, 3, 10, 15, 17, 20, 23, 26, 25, 24, 26, + 28, 30, 30, 28, 25, 24, 23, 25, 22, 18, 14, 9, 5, 0, -7, -12, + -13, -12, -7, -6, -9, -12, -10, -4, 2, 2, 3, 3, 3, 6, 7, 3, + -9, -21, -28, -35, -40, -40, -37, -37, -36, -36, -29, -22, -11, -3, 2, 3, + 0, 1, 3, 6, 9, 10, 10, 10, 13, 16, 21, 24, 29, 31, 33, 33, + 33, 32, 30, 27, 23, 16, 12, 7, -2, -7, -14, -19, -16, -10, -5, -7, + -9, -9, -6, 2, 6, 8, 7, 4, 3, 1, -3, -9, -16, -25, -34, -39, + -41, -37, -33, -31, -31, -29, -22, -12, -4, 2, 7, 5, 1, -2, 0, 4, + 4, 2, 2, 5, 10, 14, 19, 24, 28, 32, 36, 38, 36, 34, 31, 27, + 23, 18, 11, 3, -5, -12, -15, -15, -11, -6, -5, -6, -8, -7, -3, 1, + 4, 6, 3, -2, -7, -9, -12, -19, -24, -30, -34, -36, -35, -32, -29, -26, + -22, -16, -10, -3, 4, 8, 9, 4, 0, -3, 0, 1, -5, -7, -5, 1, + 7, 13, 14, 17, 27, 35, 38, 37, 35, 33, 31, 29, 25, 19, 11, 3, + 0, -6, -10, -10, -7, -5, -5, -7, -7, -6, -3, 1, 4, 3, 0, -8, + -15, -18, -20, -23, -27, -30, -32, -33, -29, -28, -25, -20, -16, -13, -6, 1, + 6, 7, 4, 0, -5, -5, -5, -6, -7, -6, -2, 5, 10, 15, 20, 25, + 32, 34, 34, 34, 32, 29, 24, 22, 19, 14, 9, 6, 4, 2, 0, 0, + 2, 2, -2, -4, -6, -5, -5, -4, -4, -7, -12, -19, -25, -26, -26, -26, + -26, -29, -28, -28, -25, -22, -18, -14, -10, -5, 0, 3, 4, 5, 4, 3, + -2, -7, -10, -12, -9, -6, 0, 6, 11, 14, 16, 22, 30, 33, 34, 29, + 25, 23, 21, 22, 22, 20, 18, 16, 14, 13, 11, 11, 11, 6, -4, -12, + -16, -17, -16, -13, -16, -22, -26, -30, -30, -25, -21, -18, -17, -19, -18, -20, + -19, -15, -13, -9, -7, -6, -5, -2, 3, 5, 4, 0, -5, -8, -6, -6, + -6, -2, 4, 9, 11, 13, 15, 19, 23, 25, 22, 19, 16, 17, 20, 21, + 22, 23, 24, 25, 24, 23, 22, 21, 16, 7, -4, -14, -21, -23, -24, -24, + -28, -34, -38, -36, -31, -21, -13, -9, -8, -10, -11, -12, -14, -13, -12, -9, + -10, -12, -11, -9, -4, 3, 4, 1, -3, -4, 1, 4, 7, 10, 10, 11, + 12, 11, 8, 9, 11, 13, 11, 5, 4, 11, 20, 26, 29, 32, 35, 39, + 39, 34, 30, 23, 15, 5, -10, -23, -31, -34, -32, -33, -37, -42, -41, -32, + -21, -11, -6, -3, -3, -6, -8, -11, -14, -15, -14, -14, -14, -19, -20, -15, + -7, 0, -2, -3, 0, 4, 10, 17, 19, 18, 18, 20, 18, 11, 5, 1, + -2, -4, -7, -8, -4, 4, 14, 24, 32, 38, 46, 51, 52, 46, 37, 28, + 19, 5, -12, -29, -39, -44, -46, -46, -50, -48, -39, -29, -14, -4, 6, 9, + 8, 6, 0, -8, -13, -15, -18, -22, -28, -30, -26, -18, -9, -7, -4, 2, + 10, 18, 24, 26, 26, 23, 22, 21, 14, 3, -5, -9, -14, -16, -16, -11, + -4, 6, 14, 24, 37, 50, 58, 58, 53, 45, 36, 28, 17, 1, -18, -36, + -47, -53, -54, -53, -51, -43, -33, -20, -8, 5, 15, 17, 13, 5, -4, -12, + -14, -18, -23, -30, -34, -32, -24, -15, -10, -6, -3, 7, 18, 27, 32, 33, + 30, 28, 24, 19, 12, 2, -10, -18, -24, -26, -23, -16, -6, 4, 12, 25, + 39, 53, 60, 60, 58, 51, 42, 30, 16, 0, -20, -37, -49, -57, -61, -57, + -50, -40, -29, -17, -4, 9, 17, 17, 11, 5, -3, -8, -13, -21, -30, -35, + -34, -29, -22, -16, -11, -6, 1, 12, 24, 34, 39, 39, 35, 28, 21, 16, + 8, -3, -16, -29, -35, -34, -26, -16, -9, 1, 14, 30, 46, 56, 60, 62, + 59, 57, 46, 32, 15, -2, -17, -35, -51, -61, -61, -55, -46, -39, -30, -19, + -4, 10, 14, 13, 7, 3, -2, -6, -15, -24, -31, -33, -31, -26, -23, -19, + -11, -2, 6, 17, 30, 38, 41, 39, 34, 25, 18, 14, 6, -9, -24, -34, + -38, -34, -28, -18, -9, 0, 14, 32, 44, 52, 58, 63, 66, 59, 45, 31, + 18, 4, -17, -36, -53, -60, -59, -54, -46, -39, -30, -18, -3, 6, 8, 6, + 3, 1, -3, -11, -22, -29, -28, -23, -20, -20, -18, -10, -2, 7, 17, 27, + 34, 37, 38, 33, 26, 19, 15, 11, 0, -17, -31, -39, -40, -34, -27, -20, + -11, 1, 16, 31, 43, 52, 59, 67, 70, 62, 47, 32, 19, 4, -18, -39, + -53, -60, -57, -51, -44, -37, -30, -17, -6, 1, 2, 1, 0, -2, -7, -15, + -23, -27, -25, -19, -16, -15, -12, -4, 5, 15, 25, 33, 37, 34, 31, 27, + 22, 17, 11, 2, -11, -25, -35, -41, -41, -34, -23, -13, -4, 6, 18, 31, + 43, 54, 61, 65, 62, 53, 44, 34, 22, 2, -20, -38, -47, -50, -47, -43, + -42, -41, -32, -19, -13, -11, -10, -7, -5, -5, -9, -14, -18, -17, -12, -9, + -8, -6, 1, 6, 12, 16, 21, 25, 25, 23, 19, 18, 14, 11, 8, 0, + -10, -23, -34, -36, -32, -24, -16, -12, -6, 4, 15, 30, 42, 52, 59, 60, + 58, 53, 46, 39, 27, 5, -19, -35, -43, -44, -43, -45, -49, -48, -39, -31, + -27, -24, -19, -11, -6, -3, -4, -6, -8, -5, 3, 5, 7, 6, 7, 9, + 12, 13, 15, 14, 12, 11, 11, 9, 8, 5, 4, 0, -12, -22, -28, -26, + -21, -17, -13, -10, -5, 4, 14, 22, 32, 44, 56, 61, 59, 56, 48, 38, + 25, 7, -10, -24, -33, -38, -44, -50, -51, -47, -41, -41, -41, -37, -26, -14, + -6, 0, -2, -3, 5, 13, 19, 21, 16, 12, 9, 9, 10, 7, 3, 2, + 2, 1, -2, 0, 3, 4, 1, -4, -12, -16, -16, -9, -9, -10, -9, -5, + 2, 7, 11, 17, 27, 39, 51, 54, 52, 52, 49, 42, 28, 10, -4, -15, + -25, -36, -48, -56, -58, -56, -52, -53, -54, -45, -28, -11, -2, 3, 8, 15, + 24, 30, 34, 30, 22, 16, 12, 6, -4, -9, -9, -8, -12, -14, -12, -5, + 3, 4, 2, -3, -4, 0, 3, 2, -4, -6, -6, -5, -4, -5, -3, 8, + 21, 36, 44, 50, 55, 58, 55, 45, 33, 20, 5, -11, -27, -43, -55, -60, + -61, -62, -64, -66, -58, -40, -20, -6, 3, 8, 16, 26, 34, 39, 38, 30, + 21, 11, 2, -9, -14, -13, -13, -15, -16, -14, -6, 1, 4, 4, 3, 4, + 7, 10, 10, 5, -3, -7, -8, -9, -12, -14, -11, 0, 13, 28, 40, 51, + 58, 61, 60, 56, 47, 33, 15, -8, -28, -44, -55, -62, -72, -81, -83, -74, + -58, -39, -21, -6, 8, 18, 30, 40, 47, 49, 44, 33, 19, 6, -6, -14, + -19, -23, -26, -24, -19, -13, -5, -2, 2, 5, 8, 11, 14, 13, 9, 2, + -4, -8, -12, -15, -19, -18, -13, -3, 14, 30, 44, 53, 62, 66, 66, 59, + 48, 33, 12, -10, -31, -46, -58, -71, -79, -84, -81, -71, -54, -34, -14, 1, + 14, 26, 37, 44, 48, 49, 41, 29, 12, -3, -13, -17, -19, -24, -26, -22, + -16, -8, -3, -2, 3, 6, 10, 13, 12, 10, 6, 2, -4, -11, -18, -22, + -22, -19, -14, -3, 13, 30, 46, 61, 68, 71, 70, 64, 52, 32, 10, -12, + -31, -51, -67, -81, -88, -91, -84, -69, -51, -32, -12, 8, 25, 37, 43, 47, + 52, 50, 40, 23, 5, -8, -13, -18, -23, -28, -26, -19, -12, -6, -4, -2, + 2, 6, 11, 11, 5, 3, 4, 1, -9, -17, -21, -23, -22, -19, -14, 0, + 17, 37, 54, 65, 70, 75, 76, 67, 50, 30, 6, -15, -35, -56, -75, -88, + -93, -88, -78, -64, -47, -26, -3, 17, 31, 37, 42, 46, 48, 42, 27, 10, + 0, -3, -7, -14, -21, -21, -13, -4, 1, -2, -3, 1, 5, 7, 4, -3, + -8, -7, -7, -14, -19, -22, -23, -21, -20, -16, -6, 12, 32, 51, 63, 70, + 76, 78, 75, 63, 44, 20, -5, -26, -46, -67, -83, -94, -93, -83, -69, -55, + -40, -17, 8, 25, 34, 38, 43, 48, 45, 35, 20, 8, 2, 3, -2, -12, + -18, -15, -8, 0, 0, -5, -6, -4, -3, -5, -11, -15, -14, -12, -13, -16, + -19, -20, -20, -16, -10, -2, 11, 24, 42, 57, 64, 70, 73, 72, 64, 48, + 26, 4, -15, -35, -50, -68, -81, -88, -81, -68, -55, -44, -29, -10, 9, 22, + 25, 30, 37, 38, 35, 24, 14, 11, 13, 14, 9, 0, -5, -3, 3, 4, + -2, -10, -15, -15, -15, -19, -25, -24, -20, -18, -19, -20, -18, -16, -13, -9, + 1, 12, 25, 37, 53, 63, 69, 74, 73, 69, 56, 37, 15, -6, -25, -42, + -59, -75, -82, -81, -72, -61, -50, -35, -17, -2, 13, 20, 27, 31, 34, 34, + 28, 19, 14, 13, 15, 14, 8, 4, 3, 5, 5, 1, -6, -15, -18, -22, + -27, -33, -34, -31, -25, -24, -20, -19, -17, -10, -2, 9, 18, 28, 39, 51, + 60, 67, 71, 72, 67, 53, 35, 16, -4, -21, -40, -57, -70, -76, -74, -65, + -55, -44, -34, -21, -7, 6, 15, 18, 20, 24, 24, 21, 16, 15, 16, 17, + 17, 16, 13, 12, 13, 13, 9, 0, -12, -17, -22, -31, -40, -43, -40, -35, + -30, -26, -24, -20, -11, -2, 9, 19, 29, 39, 46, 54, 60, 66, 67, 66, + 58, 41, 21, 5, -11, -29, -47, -62, -68, -68, -65, -57, -49, -39, -27, -13, + -2, 6, 11, 18, 23, 24, 21, 19, 19, 21, 21, 18, 15, 11, 13, 15, + 15, 10, -2, -8, -14, -21, -30, -39, -44, -44, -40, -33, -29, -27, -21, -12, + -3, 6, 16, 28, 40, 48, 54, 56, 59, 61, 62, 57, 44, 28, 12, -3, + -22, -40, -55, -64, -63, -61, -56, -51, -41, -29, -15, -6, 1, 8, 15, 20, + 20, 18, 17, 18, 23, 23, 20, 17, 15, 18, 20, 20, 15, 4, -5, -11, + -20, -32, -43, -49, -48, -43, -36, -32, -29, -21, -13, 0, 11, 20, 30, 38, + 46, 50, 51, 53, 56, 53, 48, 41, 30, 19, 5, -10, -26, -42, -50, -56, + -57, -56, -53, -46, -38, -27, -18, -10, -2, 8, 16, 19, 24, 24, 22, 23, + 25, 23, 17, 16, 15, 16, 14, 10, 3, -5, -11, -20, -28, -35, -42, -44, + -42, -35, -29, -25, -19, -11, 0, 10, 20, 26, 31, 38, 45, 48, 46, 46, + 44, 41, 37, 30, 22, 13, 1, -15, -27, -36, -44, -49, -51, -52, -49, -44, + -37, -27, -20, -12, 1, 10, 19, 23, 28, 29, 28, 28, 24, 19, 17, 16, + 15, 14, 10, 4, -3, -10, -15, -23, -31, -36, -41, -41, -39, -32, -24, -19, + -11, -3, 5, 15, 24, 31, 36, 42, 45, 44, 41, 37, 33, 31, 29, 23, + 14, 2, -8, -16, -22, -31, -40, -44, -46, -46, -46, -44, -37, -28, -20, -10, + 2, 11, 20, 28, 32, 32, 29, 26, 22, 19, 17, 14, 12, 11, 8, 2, + -5, -14, -20, -24, -30, -34, -37, -38, -36, -30, -21, -14, -6, 2, 11, 19, + 26, 30, 34, 41, 44, 42, 38, 32, 27, 25, 24, 21, 11, 1, -9, -16, + -25, -34, -40, -43, -45, -48, -50, -49, -40, -27, -15, -6, 4, 15, 27, 36, + 40, 37, 32, 27, 22, 15, 11, 10, 8, 6, 0, -8, -14, -16, -17, -18, + -24, -31, -33, -33, -27, -22, -17, -10, -4, 6, 13, 17, 22, 27, 33, 38, + 39, 37, 35, 33, 31, 27, 23, 19, 11, 3, -7, -20, -30, -38, -42, -42, + -46, -53, -58, -53, -41, -27, -13, -2, 10, 19, 30, 39, 43, 38, 29, 23, + 18, 12, 8, 6, 6, 4, -3, -8, -12, -13, -10, -12, -17, -24, -25, -23, + -23, -23, -19, -12, -4, 2, 5, 9, 14, 22, 32, 37, 39, 39, 37, 37, + 33, 28, 27, 21, 12, 0, -14, -25, -33, -38, -43, -48, -54, -60, -59, -48, + -36, -20, -8, 2, 12, 26, 39, 44, 40, 32, 27, 23, 16, 8, 3, 3, + 2, 1, -4, -9, -9, -6, -6, -8, -13, -16, -18, -21, -22, -21, -16, -7, + -2, 0, -2, 2, 13, 25, 30, 34, 34, 34, 34, 33, 33, 31, 26, 21, + 11, -3, -15, -25, -31, -37, -48, -57, -62, -63, -56, -46, -35, -25, -12, 5, + 18, 32, 40, 40, 36, 32, 29, 22, 15, 7, 3, 0, 0, 0, 1, -2, + -2, 0, 0, -3, -4, -7, -13, -22, -28, -25, -17, -10, -10, -11, -10, -4, + 12, 26, 36, 39, 40, 41, 40, 37, 35, 33, 28, 19, 3, -11, -22, -30, + -37, -46, -56, -63, -65, -59, -52, -43, -29, -17, -4, 10, 23, 32, 36, 36, + 34, 29, 24, 19, 12, 5, -2, 0, 4, 7, 10, 9, 6, 5, 5, 5, + 0, -10, -20, -26, -29, -26, -20, -18, -19, -17, -9, 3, 16, 28, 36, 40, + 42, 43, 41, 40, 36, 33, 26, 16, 3, -10, -21, -31, -42, -53, -61, -65, + -63, -58, -52, -41, -31, -18, -4, 9, 21, 26, 29, 30, 31, 31, 28, 21, + 12, 6, 5, 10, 13, 13, 14, 9, 8, 7, 5, 0, -8, -17, -24, -28, + -27, -23, -17, -14, -12, -8, 2, 15, 26, 32, 36, 39, 38, 37, 36, 33, + 28, 21, 16, 10, 1, -13, -25, -34, -41, -50, -59, -62, -62, -53, -44, -37, + -28, -19, -6, 7, 14, 18, 22, 26, 28, 28, 21, 13, 6, 6, 15, 19, + 21, 20, 20, 18, 16, 13, 7, -3, -12, -21, -27, -31, -30, -24, -15, -11, + -8, 0, 10, 23, 29, 32, 34, 34, 34, 33, 32, 27, 23, 20, 17, 10, + -2, -15, -25, -34, -43, -52, -61, -63, -58, -49, -43, -41, -33, -22, -9, 3, + 11, 17, 21, 26, 30, 28, 23, 17, 15, 18, 22, 22, 20, 21, 21, 18, + 12, 4, -5, -11, -16, -22, -28, -32, -24, -14, -7, -5, 1, 11, 20, 27, + 30, 26, 25, 29, 30, 29, 22, 17, 18, 22, 20, 9, -8, -18, -25, -31, + -40, -53, -60, -58, -54, -46, -45, -42, -32, -20, -10, -2, 5, 12, 19, 25, + 27, 22, 18, 18, 21, 24, 25, 22, 24, 26, 27, 22, 10, 0, -7, -9, + -12, -21, -28, -28, -20, -9, -4, -2, 5, 14, 22, 24, 21, 15, 18, 24, + 28, 24, 19, 21, 26, 30, 22, 7, -6, -15, -23, -34, -50, -61, -66, -61, + -52, -50, -49, -45, -36, -22, -10, 1, 11, 15, 20, 26, 26, 24, 21, 21, + 27, 28, 24, 21, 22, 26, 24, 16, 5, -5, -7, -5, -11, -17, -22, -17, + -7, 0, 1, 4, 9, 16, 19, 18, 13, 12, 16, 22, 24, 23, 23, 28, + 33, 27, 16, 2, -12, -23, -33, -45, -57, -64, -64, -55, -51, -52, -49, -39, + -25, -13, -6, 1, 6, 12, 16, 18, 20, 18, 20, 25, 28, 28, 29, 31, + 36, 37, 28, 15, 7, 3, 0, -4, -14, -21, -23, -16, -7, -4, -3, 1, + 10, 16, 17, 10, 7, 9, 18, 24, 24, 24, 28, 34, 34, 26, 12, -3, + -15, -26, -40, -53, -61, -65, -62, -59, -57, -55, -49, -39, -27, -18, -6, 3, + 8, 14, 17, 21, 25, 26, 27, 28, 30, 32, 32, 31, 32, 28, 22, 14, + 6, 3, 0, -3, -8, -12, -12, -5, 0, 2, 1, 3, 6, 11, 11, 7, + 4, 6, 13, 20, 24, 28, 31, 32, 28, 19, 7, -7, -20, -32, -44, -53, + -58, -58, -55, -54, -53, -50, -46, -40, -27, -14, -6, -6, -5, 0, 8, 16, + 20, 23, 25, 30, 37, 42, 43, 41, 39, 34, 28, 18, 9, 4, 3, 0, + -10, -13, -12, -10, -5, 1, 1, 0, 4, 8, 7, 5, 6, 11, 19, 23, + 27, 32, 33, 27, 20, 10, 0, -15, -30, -41, -49, -52, -54, -55, -55, -53, + -50, -45, -40, -32, -24, -16, -11, -10, -8, -3, 6, 13, 17, 21, 29, 37, + 43, 48, 47, 43, 38, 35, 30, 19, 11, 7, 2, -5, -9, -9, -5, 1, + 1, 0, -2, 1, 3, 6, 5, 4, 5, 10, 16, 20, 24, 27, 25, 18, + 10, 3, -9, -21, -31, -39, -44, -47, -47, -44, -46, -48, -48, -45, -39, -36, + -30, -26, -25, -23, -19, -9, 4, 14, 24, 32, 41, 48, 54, 56, 57, 52, + 47, 40, 28, 17, 10, 4, -3, -8, -10, -8, -6, -5, -5, -5, -3, 0, + 3, 4, 4, 5, 7, 12, 19, 26, 27, 24, 18, 12, 5, -3, -12, -24, + -34, -43, -46, -48, -48, -46, -46, -45, -44, -42, -38, -33, -29, -26, -26, -22, + -14, -5, 5, 13, 23, 32, 40, 47, 52, 56, 57, 55, 52, 47, 36, 27, + 19, 11, 3, -5, -6, -8, -10, -13, -15, -14, -13, -11, -6, 1, 4, 7, + 11, 17, 21, 26, 28, 26, 19, 10, 2, -7, -17, -26, -36, -41, -45, -47, + -45, -44, -44, -41, -39, -40, -40, -37, -33, -34, -32, -26, -18, -9, 2, 12, + 26, 40, 47, 56, 63, 66, 66, 63, 60, 53, 40, 27, 14, 3, -8, -11, + -12, -15, -19, -19, -18, -15, -12, -8, 0, 6, 11, 13, 14, 17, 23, 29, + 27, 18, 9, 1, -7, -16, -25, -35, -43, -49, -47, -44, -43, -42, -40, -36, + -34, -33, -33, -33, -35, -34, -30, -23, -16, -9, 2, 14, 27, 39, 49, 58, + 66, 69, 68, 66, 61, 53, 45, 32, 18, 1, -11, -14, -17, -17, -20, -23, + -21, -17, -13, -3, 4, 10, 13, 14, 17, 18, 21, 24, 22, 15, 6, -4, + -12, -22, -28, -38, -49, -51, -48, -45, -43, -40, -38, -36, -35, -34, -33, -33, + -34, -35, -33, -29, -18, -6, 6, 19, 33, 46, 59, 71, 78, 78, 78, 74, + 67, 54, 39, 22, 6, -8, -16, -22, -25, -25, -26, -22, -17, -12, -3, 6, + 15, 17, 16, 14, 14, 16, 17, 16, 13, 6, -2, -11, -20, -27, -34, -43, + -49, -48, -44, -41, -39, -36, -33, -34, -33, -34, -32, -33, -35, -35, -30, -21, + -11, 0, 9, 23, 38, 52, 65, 74, 76, 76, 74, 70, 62, 47, 28, 13, + 2, -6, -14, -21, -23, -20, -18, -16, -13, -7, 1, 8, 10, 11, 9, 11, + 11, 13, 15, 16, 13, 8, -2, -11, -19, -27, -37, -47, -52, -51, -48, -46, + -43, -40, -38, -36, -35, -35, -38, -38, -33, -27, -21, -16, -7, 6, 21, 36, + 49, 61, 70, 75, 79, 78, 73, 62, 49, 35, 22, 8, -3, -12, -17, -20, + -18, -14, -13, -15, -12, -5, 4, 7, 8, 8, 9, 8, 9, 11, 14, 14, + 10, 4, -6, -15, -25, -35, -41, -48, -54, -53, -47, -42, -38, -37, -35, -31, + -31, -30, -30, -29, -26, -24, -19, -12, -2, 10, 22, 35, 48, 60, 70, 76, + 76, 73, 67, 57, 44, 28, 14, 5, -3, -8, -13, -14, -13, -10, -11, -11, + -8, -2, 4, 6, 5, 5, 5, 6, 10, 11, 10, 8, 4, -2, -9, -15, + -24, -35, -44, -50, -52, -49, -45, -42, -42, -40, -37, -37, -37, -33, -29, -26, + -24, -21, -16, -7, 6, 18, 30, 41, 54, 66, 75, 77, 79, 76, 67, 53, + 37, 21, 8, 2, -5, -10, -14, -14, -12, -12, -11, -10, -5, 4, 7, 4, + 1, 2, 6, 9, 9, 7, 5, 4, 0, -7, -14, -23, -32, -37, -43, -48, + -50, -51, -47, -42, -34, -32, -32, -34, -32, -26, -21, -18, -17, -14, -11, -4, + 5, 13, 24, 40, 55, 67, 72, 74, 76, 75, 67, 51, 37, 23, 11, 4, + -4, -11, -15, -17, -17, -16, -14, -13, -8, -2, 1, 1, 1, 3, 5, 9, + 7, 5, 4, 4, 3, -5, -14, -24, -32, -38, -41, -47, -52, -53, -49, -41, + -35, -34, -35, -33, -29, -24, -19, -13, -10, -9, -7, -2, 8, 17, 29, 43, + 56, 67, 74, 75, 75, 72, 64, 53, 38, 23, 13, 4, -5, -12, -16, -20, + -21, -18, -16, -14, -11, -8, -5, -3, 0, 2, 6, 6, 6, 5, 5, 6, + 3, -6, -19, -31, -37, -41, -45, -50, -52, -53, -48, -39, -32, -30, -26, -25, + -22, -16, -10, -7, -11, -10, -8, -2, 6, 17, 31, 45, 58, 68, 78, 80, + 76, 70, 65, 55, 37, 18, 5, -4, -10, -19, -25, -26, -24, -18, -13, -11, + -9, -6, -2, 4, 6, 5, 4, 3, 4, 2, 1, -3, -4, -11, -20, -29, + -38, -43, -45, -48, -51, -48, -44, -39, -35, -34, -31, -30, -25, -15, -8, -8, + -10, -8, 1, 11, 22, 33, 42, 54, 66, 76, 80, 75, 70, 66, 59, 42, + 23, 6, -4, -9, -17, -22, -27, -25, -19, -9, -7, -8, -5, 0, 4, 5, + 2, -2, -5, -5, -4, -6, -7, -6, -10, -16, -21, -29, -34, -37, -38, -41, + -44, -42, -36, -32, -33, -37, -39, -35, -27, -17, -12, -13, -12, -6, 6, 22, + 36, 44, 54, 66, 77, 82, 80, 75, 68, 59, 47, 29, 10, -3, -13, -18, + -23, -26, -27, -24, -16, -9, -5, -4, -2, 3, 6, 4, -2, -6, -8, -7, + -8, -8, -9, -10, -13, -16, -22, -29, -31, -30, -34, -36, -36, -32, -28, -30, + -36, -39, -38, -33, -28, -24, -24, -22, -15, -2, 13, 26, 38, 53, 67, 78, + 84, 88, 85, 81, 71, 59, 39, 13, -5, -14, -19, -26, -32, -34, -30, -22, + -13, -5, 0, 6, 7, 10, 8, 2, -4, -10, -12, -15, -18, -20, -20, -20, + -22, -24, -26, -26, -23, -23, -23, -24, -21, -17, -18, -25, -31, -35, -37, -37, + -36, -33, -29, -22, -10, 5, 19, 31, 45, 62, 75, 84, 86, 88, 87, 80, + 66, 45, 22, 4, -9, -18, -26, -34, -37, -33, -24, -15, -9, -3, 6, 13, + 15, 11, 2, -5, -10, -13, -20, -25, -27, -26, -25, -26, -29, -29, -23, -18, + -16, -19, -18, -15, -9, -6, -12, -21, -32, -36, -36, -40, -39, -36, -30, -21, + -10, 6, 20, 36, 55, 69, 79, 85, 90, 92, 88, 75, 56, 33, 12, -3, + -15, -24, -33, -37, -35, -28, -20, -12, -4, 6, 14, 18, 16, 9, 0, -8, + -15, -19, -27, -33, -35, -34, -34, -36, -36, -29, -19, -10, -10, -10, -8, -4, + -2, -2, -8, -18, -28, -36, -43, -48, -46, -36, -25, -14, -4, 10, 27, 46, + 65, 78, 86, 89, 87, 85, 78, 64, 42, 19, 0, -12, -20, -29, -34, -36, + -30, -22, -12, -6, 1, 8, 16, 18, 13, 2, -7, -12, -17, -24, -33, -38, + -39, -36, -36, -36, -34, -26, -18, -11, -7, -6, -5, -5, 1, 1, -5, -14, + -24, -33, -41, -42, -37, -28, -19, -10, 3, 16, 30, 47, 64, 76, 83, 85, + 83, 78, 69, 54, 37, 17, -2, -14, -21, -28, -32, -32, -27, -18, -11, -6, + 2, 12, 18, 16, 5, -5, -11, -14, -19, -30, -40, -47, -45, -38, -36, -34, + -33, -26, -15, -6, -2, 1, 1, 3, 5, 4, -3, -13, -26, -35, -41, -39, + -33, -23, -13, -5, 7, 21, 36, 53, 68, 79, 82, 78, 72, 66, 59, 47, + 30, 10, -6, -16, -21, -22, -25, -27, -25, -18, -10, -4, 4, 10, 11, 6, + -4, -11, -13, -18, -25, -34, -43, -45, -41, -36, -34, -32, -27, -19, -10, -5, + 0, 2, 5, 5, 5, 1, -7, -16, -25, -33, -38, -35, -25, -13, -6, 0, + 11, 27, 46, 60, 69, 70, 68, 69, 68, 62, 52, 39, 22, 8, -2, -11, + -18, -21, -22, -23, -24, -17, -10, -5, 1, 5, 5, 2, -3, -5, -9, -17, + -28, -41, -46, -48, -43, -42, -42, -39, -30, -19, -9, -3, 6, 11, 15, 16, + 12, 5, -2, -12, -23, -33, -37, -34, -25, -18, -8, 1, 15, 32, 48, 62, + 69, 68, 67, 63, 62, 58, 50, 34, 15, -2, -8, -10, -11, -16, -24, -24, + -19, -12, -6, -2, 2, 3, 1, 0, -6, -10, -17, -26, -37, -46, -48, -45, + -44, -42, -38, -32, -22, -12, -6, 4, 10, 14, 16, 15, 11, 5, -2, -11, + -23, -31, -29, -22, -18, -16, -11, 3, 17, 34, 50, 56, 59, 61, 63, 62, + 59, 53, 44, 32, 16, 3, -8, -9, -13, -20, -26, -27, -21, -16, -11, -9, + -6, 1, 7, 7, 0, -10, -15, -20, -30, -39, -45, -48, -48, -46, -41, -36, + -29, -20, -11, 3, 11, 14, 19, 21, 19, 15, 6, -3, -13, -18, -18, -17, + -20, -19, -12, 2, 15, 26, 36, 43, 51, 59, 61, 61, 57, 54, 49, 37, + 21, 9, 1, -8, -17, -25, -29, -28, -27, -23, -19, -13, -5, 2, 8, 5, + -4, -11, -13, -17, -27, -40, -49, -53, -53, -50, -44, -37, -28, -19, -7, 8, + 18, 22, 26, 26, 23, 17, 10, 0, -8, -15, -20, -25, -23, -19, -11, 0, + 13, 25, 34, 44, 54, 60, 62, 60, 58, 56, 52, 38, 21, 6, -6, -16, + -26, -32, -33, -30, -26, -24, -17, -8, 3, 13, 16, 10, 1, -7, -12, -18, + -34, -50, -61, -63, -58, -54, -50, -45, -33, -13, 6, 21, 27, 34, 37, 36, + 30, 20, 11, -2, -13, -24, -32, -37, -34, -24, -10, 2, 12, 25, 41, 55, + 61, 64, 65, 67, 64, 59, 48, 32, 16, 0, -12, -20, -27, -33, -33, -31, + -28, -23, -12, 0, 10, 13, 9, 2, -2, -7, -13, -25, -41, -56, -65, -66, + -62, -56, -53, -42, -25, -5, 13, 24, 34, 39, 42, 39, 32, 22, 11, -2, + -15, -27, -36, -37, -31, -22, -13, 0, 12, 27, 43, 55, 61, 64, 65, 63, + 60, 53, 42, 28, 10, -6, -20, -27, -28, -28, -25, -23, -20, -13, -2, 11, + 16, 14, 8, 2, -6, -14, -25, -38, -53, -67, -73, -73, -67, -58, -46, -32, + -14, 6, 24, 36, 43, 45, 44, 39, 30, 18, 5, -11, -25, -35, -39, -37, + -28, -17, -7, 4, 16, 32, 48, 58, 64, 66, 63, 61, 56, 46, 31, 18, + 3, -13, -21, -25, -23, -19, -15, -11, -7, -2, 6, 13, 14, 8, -3, -12, + -21, -32, -40, -55, -70, -78, -75, -67, -56, -47, -29, -12, 10, 29, 40, 47, + 49, 48, 43, 31, 15, 0, -16, -29, -39, -45, -41, -32, -18, -6, 3, 13, + 27, 43, 57, 64, 65, 61, 58, 52, 43, 32, 18, 6, -9, -18, -20, -17, + -12, -4, 1, 3, 7, 12, 17, 16, 9, -3, -15, -27, -39, -48, -60, -72, + -82, -82, -73, -58, -45, -33, -14, 7, 28, 42, 49, 51, 51, 48, 38, 22, + 2, -16, -30, -37, -42, -45, -40, -26, -11, 3, 11, 20, 34, 52, 65, 69, + 64, 54, 46, 38, 28, 16, 4, -11, -18, -16, -10, -4, 3, 13, 21, 23, + 22, 20, 18, 11, -2, -16, -34, -47, -59, -70, -76, -83, -83, -76, -64, -48, + -31, -12, 10, 30, 42, 50, 53, 51, 46, 37, 25, 8, -13, -30, -41, -45, + -43, -35, -23, -15, -5, 8, 17, 28, 40, 56, 64, 63, 55, 45, 34, 24, + 14, 7, -4, -12, -13, -9, -2, 11, 23, 31, 33, 33, 31, 26, 17, 4, + -14, -31, -48, -62, -75, -86, -90, -87, -79, -68, -54, -39, -18, 4, 23, 39, + 47, 52, 52, 47, 39, 29, 15, -5, -23, -35, -41, -40, -34, -26, -16, -8, + 2, 12, 22, 30, 43, 52, 58, 54, 45, 36, 25, 16, 7, -2, -7, -8, + -3, 4, 13, 24, 32, 39, 42, 39, 30, 19, 6, -10, -25, -44, -62, -79, + -88, -90, -85, -78, -70, -59, -45, -24, 0, 20, 35, 43, 48, 48, 46, 42, + 33, 20, 2, -19, -32, -38, -41, -37, -29, -19, -8, 1, 11, 19, 26, 35, + 43, 48, 48, 41, 35, 26, 16, 7, 0, 0, 3, 6, 10, 16, 24, 32, + 40, 44, 43, 33, 21, 8, -5, -19, -37, -54, -72, -84, -87, -81, -75, -68, + -61, -50, -33, -12, 8, 22, 29, 34, 40, 42, 41, 35, 24, 13, -2, -16, + -27, -33, -33, -27, -22, -17, -13, -4, 9, 18, 25, 31, 36, 42, 44, 40, + 32, 21, 12, 9, 7, 8, 9, 13, 17, 23, 29, 35, 40, 40, 35, 26, + 13, 0, -11, -24, -41, -60, -74, -80, -79, -73, -68, -63, -56, -43, -27, -10, + 6, 18, 24, 29, 34, 38, 37, 30, 20, 9, -3, -14, -24, -27, -27, -25, + -23, -18, -9, 2, 10, 19, 25, 30, 37, 40, 41, 33, 22, 16, 10, 6, + 6, 10, 16, 21, 28, 31, 35, 38, 44, 45, 34, 19, 5, -5, -17, -33, + -52, -68, -76, -78, -75, -71, -67, -62, -51, -37, -20, -7, 4, 13, 21, 29, + 34, 36, 33, 26, 17, 10, 0, -8, -13, -19, -21, -21, -17, -11, -6, 4, + 10, 13, 19, 25, 30, 31, 28, 20, 14, 10, 7, 7, 11, 20, 26, 32, + 36, 39, 41, 44, 46, 41, 30, 13, 0, -13, -27, -44, -62, -72, -74, -74, + -74, -71, -66, -57, -47, -32, -19, -9, 2, 14, 24, 28, 32, 34, 33, 25, + 17, 9, 2, -5, -10, -17, -22, -18, -13, -7, 0, 4, 10, 17, 23, 26, + 25, 21, 15, 9, 9, 7, 4, 7, 16, 27, 34, 39, 43, 48, 49, 52, + 49, 39, 24, 9, -3, -17, -32, -52, -67, -75, -75, -71, -70, -70, -66, -56, + -43, -31, -21, -12, -2, 11, 21, 27, 30, 33, 31, 29, 22, 15, 8, 0, + -6, -13, -14, -14, -11, -5, 0, 4, 8, 13, 16, 18, 15, 12, 10, 7, + 7, 6, 7, 14, 24, 36, 44, 46, 46, 49, 52, 53, 47, 35, 21, 9, + -6, -23, -43, -59, -68, -71, -74, -74, -76, -73, -64, -52, -39, -31, -25, -15, + 0, 12, 20, 24, 29, 32, 30, 26, 21, 16, 10, 4, -2, -7, -7, -5, + -3, 0, 3, 5, 6, 9, 8, 8, 6, 3, 2, 4, 5, 7, 14, 22, + 34, 43, 49, 57, 57, 55, 52, 48, 43, 31, 17, 2, -13, -33, -49, -59, + -63, -66, -72, -75, -76, -70, -61, -52, -44, -37, -30, -18, -4, 11, 20, 25, + 28, 32, 32, 30, 26, 19, 13, 5, 0, -4, -5, -3, 1, 2, 1, -3, + -2, 2, 6, 4, 2, -3, -2, 3, 10, 13, 18, 27, 40, 49, 56, 59, + 60, 56, 52, 47, 41, 30, 17, 1, -19, -39, -55, -64, -67, -70, -76, -81, + -78, -69, -56, -46, -40, -33, -24, -12, 3, 15, 22, 25, 26, 29, 27, 23, + 19, 14, 9, 4, 0, -2, 1, 5, 9, 7, 2, -3, -3, 3, 3, -2, + -10, -13, -10, -2, 7, 14, 22, 31, 45, 59, 65, 68, 65, 62, 58, 50, + 41, 28, 12, -9, -31, -49, -59, -65, -70, -76, -84, -84, -77, -63, -50, -45, + -40, -32, -21, -7, 7, 16, 24, 28, 29, 28, 23, 18, 15, 11, 6, 0, + -4, -3, 4, 11, 14, 11, 6, 5, 7, 7, 2, -7, -12, -16, -13, -6, + 1, 8, 17, 32, 50, 63, 68, 68, 69, 70, 65, 56, 43, 27, 7, -17, + -38, -52, -62, -71, -78, -86, -88, -84, -73, -59, -50, -43, -34, -25, -11, 2, + 11, 19, 23, 26, 26, 21, 17, 12, 9, 7, 5, 2, 2, 4, 11, 16, + 14, 10, 9, 10, 9, 1, -8, -16, -19, -16, -11, -6, 0, 8, 24, 43, + 57, 66, 70, 72, 72, 67, 63, 52, 37, 18, -5, -23, -41, -54, -62, -70, + -78, -81, -82, -76, -67, -56, -45, -36, -31, -22, -12, 0, 10, 16, 20, 21, + 17, 13, 7, 3, 3, 6, 6, 6, 9, 14, 20, 21, 20, 17, 17, 15, + 9, -3, -15, -23, -27, -20, -14, -9, -4, 9, 31, 49, 64, 70, 75, 78, + 76, 70, 60, 45, 31, 12, -11, -31, -46, -58, -66, -70, -73, -77, -74, -67, + -59, -52, -44, -36, -29, -22, -14, -6, 1, 11, 14, 14, 11, 6, 6, 7, + 10, 11, 12, 15, 18, 24, 23, 21, 19, 20, 18, 12, 0, -13, -20, -27, + -27, -22, -16, -11, 1, 19, 36, 52, 64, 73, 79, 81, 77, 69, 56, 43, + 26, 5, -16, -37, -54, -62, -66, -69, -72, -71, -65, -62, -56, -47, -39, -33, + -26, -19, -14, -12, -3, 9, 9, 3, -6, -4, 5, 11, 12, 11, 12, 20, + 29, 31, 29, 25, 25, 27, 24, 11, -6, -17, -25, -31, -32, -30, -26, -16, + 0, 17, 35, 51, 66, 78, 87, 88, 84, 73, 57, 40, 23, 3, -20, -42, + -57, -65, -69, -71, -70, -68, -63, -58, -52, -45, -38, -30, -26, -24, -23, -16, + -8, -2, -5, -9, -6, 1, 9, 12, 13, 17, 24, 32, 37, 37, 34, 32, + 33, 31, 19, 2, -15, -25, -31, -36, -38, -35, -27, -13, 4, 23, 40, 59, + 76, 91, 96, 91, 80, 69, 55, 35, 13, -12, -35, -52, -61, -66, -71, -70, + -63, -54, -48, -44, -42, -36, -31, -30, -34, -36, -33, -26, -20, -20, -21, -18, + -9, 5, 13, 18, 21, 29, 40, 47, 50, 49, 44, 40, 34, 23, 6, -14, + -27, -39, -45, -48, -45, -35, -23, -7, 11, 30, 51, 73, 89, 97, 96, 89, + 80, 63, 44, 25, 4, -18, -39, -53, -59, -63, -61, -58, -55, -52, -49, -45, + -39, -35, -37, -41, -46, -43, -38, -33, -29, -25, -18, -11, 3, 13, 20, 25, + 30, 38, 46, 51, 50, 47, 43, 37, 26, 9, -7, -19, -32, -45, -52, -51, + -40, -28, -12, 4, 19, 38, 61, 83, 94, 95, 89, 82, 67, 50, 30, 12, + -8, -26, -40, -52, -57, -56, -52, -48, -46, -44, -40, -34, -32, -32, -37, -44, + -47, -45, -41, -39, -35, -28, -17, -6, 7, 15, 23, 32, 40, 47, 52, 52, + 51, 46, 39, 32, 17, 1, -14, -26, -37, -46, -50, -45, -35, -25, -11, 5, + 24, 44, 62, 79, 88, 86, 79, 70, 59, 45, 25, 7, -13, -25, -36, -46, + -50, -51, -50, -46, -43, -41, -37, -34, -33, -36, -40, -43, -46, -46, -41, -36, + -31, -22, -10, 4, 13, 21, 30, 40, 47, 50, 53, 52, 47, 39, 30, 18, + 3, -12, -22, -33, -42, -47, -45, -36, -25, -14, -2, 14, 34, 52, 67, 76, + 77, 72, 65, 55, 43, 27, 12, -7, -21, -29, -36, -41, -44, -43, -39, -36, + -32, -27, -26, -26, -29, -33, -36, -43, -49, -48, -44, -38, -32, -22, -11, 4, + 15, 25, 34, 44, 50, 53, 54, 52, 44, 35, 23, 9, -4, -15, -27, -37, + -43, -45, -42, -34, -21, -9, 5, 19, 34, 50, 63, 70, 69, 63, 54, 46, + 35, 20, 4, -11, -23, -29, -33, -37, -41, -40, -33, -25, -20, -19, -21, -22, + -23, -26, -34, -42, -47, -46, -43, -36, -30, -22, -11, 5, 17, 28, 37, 45, + 52, 55, 53, 49, 41, 30, 19, 4, -12, -23, -33, -41, -45, -45, -40, -31, + -18, -3, 11, 23, 38, 51, 63, 64, 58, 51, 45, 36, 25, 10, -4, -15, + -24, -28, -32, -36, -35, -29, -19, -13, -13, -14, -13, -13, -13, -21, -33, -43, + -45, -45, -41, -38, -34, -25, -11, 4, 17, 29, 39, 49, 57, 60, 55, 48, + 39, 29, 16, 1, -14, -27, -35, -42, -47, -48, -42, -29, -15, -3, 10, 20, + 34, 48, 56, 57, 51, 45, 38, 30, 20, 7, -7, -17, -22, -26, -32, -36, + -31, -21, -9, -6, -8, -8, -4, 1, -4, -13, -26, -35, -39, -40, -42, -44, + -40, -29, -13, 3, 16, 29, 43, 58, 67, 67, 59, 49, 39, 27, 11, -9, + -28, -39, -47, -50, -53, -52, -44, -29, -12, 5, 13, 25, 38, 51, 57, 52, + 45, 38, 30, 21, 9, -4, -14, -21, -26, -29, -33, -28, -18, -7, 2, 2, + 2, 4, 8, 10, 5, -10, -25, -36, -42, -45, -49, -49, -45, -33, -14, 5, + 22, 35, 54, 69, 78, 76, 67, 53, 41, 27, 6, -17, -36, -50, -55, -60, + -63, -62, -51, -34, -16, -2, 9, 20, 34, 45, 50, 48, 42, 35, 29, 18, + 7, 0, 0, 0, 0, 0, 0, 7, 0, -1, -7, -18, -16, 3, 6, -18, + -29, -21, 6, 6, -12, -10, -10, -2, 4, 15, 21, 14, 4, 9, 29, 27, + 15, 9, 13, 20, 0, -21, -11, 3, -11, -37, -36, -7, 11, -4, -26, -23, + -4, 15, -4, -15, -11, -10, -1, 9, 23, 15, 8, 6, 24, 35, 19, 14, + 6, 17, 10, -15, -26, -7, -1, -23, -40, -24, 4, 10, -16, -25, -13, 11, + 10, -14, -15, -12, -6, 1, 19, 22, 6, 7, 15, 40, 31, 22, 7, 7, + 15, 5, -22, -21, -5, -9, -33, -32, -15, 5, -4, -19, -20, 1, 17, -4, + -15, -11, -12, -4, 9, 27, 13, 7, 11, 32, 44, 30, 14, 2, 7, 9, + -8, -25, -18, -9, -19, -30, -21, -4, 2, -10, -21, -13, 15, 8, -11, -13, + -16, -12, 0, 20, 24, 9, 9, 19, 44, 47, 25, 6, 2, 11, -1, -21, + -27, -19, -17, -20, -23, -17, -5, -5, -14, -20, 0, 15, -4, -7, -17, -17, + -8, 7, 25, 18, 7, 11, 31, 54, 41, 14, -1, 10, 3, -14, -27, -29, + -21, -16, -16, -18, -17, -11, -10, -16, -16, 10, 6, -3, -9, -19, -16, -2, + 18, 27, 16, 8, 19, 45, 54, 29, 5, 6, 4, -9, -18, -29, -30, -18, + -10, -9, -14, -20, -12, -13, -17, -5, 12, 7, 2, -16, -22, -13, 8, 25, + 23, 12, 11, 32, 53, 48, 17, 9, 9, -7, -16, -24, -37, -28, -12, -4, + -2, -18, -21, -18, -23, -17, 7, 11, 10, -4, -16, -22, -7, 21, 28, 18, + 9, 20, 43, 55, 37, 11, 11, 1, -14, -17, -31, -34, -21, -10, 4, -2, + -20, -23, -26, -29, -3, 6, 13, 8, -5, -23, -27, 7, 28, 27, 15, 12, + 32, 48, 50, 24, 9, 8, -12, -19, -26, -37, -35, -19, 3, 6, -12, -21, + -31, -38, -17, 6, 4, 14, 6, -8, -35, -15, 19, 26, 21, 7, 23, 43, + 52, 42, 14, 9, -2, -16, -21, -25, -33, -33, -4, 13, 3, -13, -30, -47, + -37, 1, 6, 7, 12, 6, -15, -31, -1, 22, 30, 14, 9, 37, 48, 50, + 26, 8, 6, -11, -22, -22, -25, -45, -22, 13, 15, 1, -22, -43, -56, -21, + 7, 6, 10, 15, -7, -25, -21, 7, 28, 21, 2, 25, 47, 53, 39, 11, + 10, 1, -20, -22, -18, -37, -42, 2, 15, 15, -8, -32, -57, -48, -9, 9, + 5, 14, 8, -14, -20, -13, 17, 33, 8, 9, 37, 52, 55, 25, 7, 8, + -11, -23, -15, -23, -47, -20, 12, 21, 10, -23, -50, -57, -31, 2, 10, 9, + 11, -8, -10, -18, -3, 30, 22, 1, 22, 45, 57, 45, 11, 11, 0, -23, + -22, -16, -36, -36, -6, 15, 18, -3, -43, -56, -49, -21, 5, 11, 12, -2, + -8, -9, -15, 12, 31, 9, 10, 34, 48, 60, 29, 16, 10, -17, -24, -21, + -27, -31, -17, 5, 14, 12, -22, -50, -48, -41, -9, 7, 13, -1, -8, -2, + -11, -5, 26, 19, 6, 21, 37, 55, 49, 25, 22, -5, -20, -24, -26, -29, + -23, -9, 8, 13, -1, -41, -48, -47, -30, -3, 12, 7, -12, -2, 1, -8, + 10, 20, 11, 16, 26, 40, 54, 42, 36, 7, -13, -18, -26, -29, -26, -14, + -2, 7, 8, -18, -45, -48, -45, -19, 6, 11, -10, -8, 5, -7, 2, 12, + 17, 15, 16, 23, 45, 55, 48, 27, -7, -12, -18, -30, -31, -17, -5, -3, + 4, 5, -24, -40, -50, -38, -8, 8, 1, -13, 1, -1, 3, 8, 15, 18, + 15, 15, 28, 52, 59, 47, 9, -9, -10, -25, -40, -29, -3, -5, -13, 1, + 3, -26, -47, -53, -23, -2, 5, -11, -6, 4, 6, 10, 10, 19, 11, 13, + 15, 42, 61, 61, 32, 3, -5, -12, -35, -43, -14, 1, -16, -13, 9, -1, + -33, -57, -46, -19, -3, -1, -16, -2, 5, 15, 6, 17, 9, 5, 9, 26, + 54, 65, 52, 21, 3, -6, -21, -48, -33, -4, -7, -22, -2, 18, -4, -47, + -58, -33, -11, 2, -13, -15, 3, 16, 15, 9, 15, -1, 5, 14, 48, 66, + 65, 37, 23, 2, -11, -42, -48, -20, -4, -23, -18, 18, 19, -17, -61, -52, + -27, -2, -5, -24, -7, 9, 20, 14, 18, 2, -3, 7, 34, 63, 68, 50, + 37, 19, -9, -25, -49, -38, -14, -14, -28, 6, 25, 9, -40, -62, -45, -17, + 3, -21, -16, -3, 12, 18, 18, 10, -6, 0, 16, 56, 69, 63, 43, 38, + 2, -20, -42, -44, -33, -14, -25, -10, 22, 18, -11, -55, -57, -37, -3, -10, + -26, -10, 2, 17, 21, 20, -3, -2, 5, 39, 67, 73, 56, 47, 22, -17, + -35, -43, -36, -28, -18, -20, 9, 22, 8, -33, -56, -53, -26, -2, -23, -24, + -11, 4, 23, 30, 4, -3, 0, 27, 60, 71, 69, 58, 43, -6, -35, -43, + -35, -36, -27, -18, -2, 19, 17, -9, -41, -51, -45, -10, -12, -31, -21, -9, + 8, 33, 17, 0, 2, 8, 50, 69, 75, 70, 64, 16, -31, -47, -35, -32, + -34, -25, -14, 10, 16, 5, -26, -42, -50, -32, -8, -22, -31, -22, -8, 22, + 32, 7, 6, 4, 28, 63, 69, 71, 78, 43, -20, -51, -41, -23, -34, -30, + -22, 2, 13, 9, -10, -31, -45, -44, -21, -19, -27, -36, -26, 2, 29, 24, + 12, 11, 13, 45, 69, 68, 81, 70, 6, -47, -52, -28, -23, -27, -26, -14, + 11, 10, -2, -18, -33, -43, -34, -25, -22, -36, -44, -14, 14, 29, 27, 22, + 18, 29, 60, 65, 71, 86, 41, -32, -57, -41, -23, -22, -22, -24, -4, 10, + 0, -11, -21, -31, -37, -37, -29, -29, -53, -33, -3, 16, 33, 31, 27, 23, + 46, 64, 65, 85, 71, -4, -48, -47, -31, -20, -15, -15, -19, 1, 0, -5, + -14, -21, -26, -40, -39, -28, -51, -50, -18, 4, 26, 38, 36, 30, 32, 61, + 64, 70, 80, 31, -35, -43, -40, -25, -19, -6, -17, -11, 0, -6, -11, -17, + -15, -31, -47, -39, -45, -62, -34, -8, 12, 36, 38, 41, 37, 51, 65, 60, + 71, 56, -7, -36, -38, -35, -27, -11, -5, -17, -8, -8, -9, -17, -13, -20, + -37, -47, -50, -62, -49, -16, 1, 25, 34, 43, 53, 49, 62, 58, 62, 65, + 22, -23, -31, -34, -35, -19, -3, -8, -18, -7, -4, -14, -17, -9, -27, -40, + -56, -68, -64, -27, -4, 9, 28, 37, 54, 60, 61, 59, 54, 63, 43, -1, + -25, -23, -37, -28, -8, 4, -10, -15, -3, -7, -26, -15, -11, -29, -51, -71, + -71, -49, -8, 5, 14, 30, 48, 66, 68, 63, 51, 56, 51, 18, -18, -20, + -25, -39, -23, -5, 3, -13, -6, -5, -21, -28, -10, -18, -43, -67, -78, -64, + -25, 1, 8, 15, 38, 60, 75, 74, 58, 54, 57, 28, -7, -18, -8, -31, + -34, -15, 4, -2, -4, 0, -15, -32, -21, -8, -28, -57, -77, -75, -44, -12, + 6, 8, 20, 49, 68, 77, 71, 53, 61, 41, 3, -18, -4, -14, -36, -28, + -7, 1, 7, 6, -8, -34, -35, -16, -15, -41, -66, -75, -59, -31, -4, 10, + 11, 31, 56, 72, 85, 63, 58, 55, 14, -17, -10, -1, -24, -30, -22, -6, + 11, 16, 9, -27, -43, -27, -15, -26, -53, -63, -66, -46, -21, 3, 13, 15, + 40, 63, 83, 78, 60, 67, 38, -9, -20, 4, -7, -23, -25, -22, 6, 24, + 20, -8, -48, -43, -24, -16, -39, -55, -57, -57, -36, -10, 9, 11, 22, 50, + 73, 88, 71, 65, 59, 14, -24, -9, -3, -15, -18, -31, -14, 25, 28, 10, + -36, -56, -41, -21, -29, -48, -47, -51, -50, -26, -2, 11, 6, 30, 57, 82, + 83, 69, 65, 35, -12, -16, -3, -10, -12, -21, -26, 11, 33, 26, -7, -56, + -54, -32, -26, -41, -39, -37, -52, -41, -16, 5, 7, 11, 37, 72, 91, 78, + 66, 55, 11, -19, -14, -15, -9, -7, -19, -8, 22, 30, 13, -32, -62, -44, + -31, -34, -40, -29, -40, -46, -29, -8, 2, 1, 18, 49, 84, 86, 72, 67, + 39, -6, -21, -25, -16, 2, -6, -12, 6, 23, 18, -7, -51, -56, -39, -33, + -41, -30, -24, -41, -36, -17, -8, -5, 7, 32, 66, 84, 78, 75, 58, 20, + -15, -29, -33, 2, 4, -1, 1, 11, 17, 4, -27, -56, -46, -36, -37, -39, + -22, -24, -38, -23, -16, -16, -7, 18, 46, 72, 82, 81, 72, 44, -1, -25, + -41, -18, 14, 8, 10, 0, 5, 2, -11, -40, -50, -42, -38, -37, -33, -11, + -27, -26, -20, -22, -13, 0, 31, 52, 73, 82, 80, 61, 26, -16, -37, -40, + 0, 18, 17, 12, -5, -8, -10, -21, -41, -43, -44, -36, -35, -20, -12, -23, + -14, -32, -21, -12, 15, 38, 58, 76, 82, 72, 46, 4, -26, -41, -23, 14, + 25, 18, 2, -23, -18, -14, -29, -35, -45, -42, -35, -29, -15, -19, -3, -23, + -32, -19, -1, 27, 40, 67, 81, 76, 61, 26, -11, -33, -36, -6, 28, 28, + 13, -15, -38, -19, -20, -26, -36, -46, -35, -32, -20, -21, -4, -4, -28, -25, + -16, 13, 31, 49, 74, 79, 69, 48, 8, -16, -33, -21, 7, 33, 24, 5, + -32, -38, -22, -21, -22, -41, -43, -32, -25, -23, -16, 6, -9, -29, -28, -5, + 20, 39, 58, 75, 71, 60, 22, 0, -18, -27, -10, 16, 30, 15, -14, -49, + -34, -19, -16, -27, -43, -31, -25, -27, -24, -1, 7, -15, -32, -22, 3, 28, + 50, 61, 67, 59, 38, 13, 5, -17, -16, -3, 21, 23, 3, -34, -49, -28, + -17, -19, -34, -34, -18, -26, -32, -16, 14, 6, -23, -34, -11, 14, 44, 54, + 56, 60, 44, 25, 18, 2, -18, -9, 3, 21, 9, -14, -45, -39, -24, -22, + -28, -32, -18, -17, -36, -30, 5, 21, -5, -31, -27, 1, 30, 56, 46, 50, + 47, 32, 29, 20, -4, -9, -9, 4, 10, -2, -28, -38, -31, -33, -26, -26, + -19, -9, -24, -38, -11, 24, 10, -17, -36, -14, 14, 48, 49, 37, 43, 39, + 33, 32, 11, 1, -5, -11, -6, -3, -16, -29, -28, -40, -38, -27, -20, -6, + -11, -31, -29, 15, 22, 0, -25, -25, 2, 31, 51, 38, 35, 41, 41, 34, + 27, 8, 6, -7, -20, -14, -7, -20, -19, -34, -52, -35, -23, -11, -5, -18, + -33, -5, 26, 5, -11, -27, -11, 17, 43, 43, 30, 29, 46, 45, 38, 17, + 6, 2, -22, -27, -16, -16, -18, -18, -53, -48, -23, -19, -3, -10, -21, -19, + 18, 12, -6, -20, -21, 6, 29, 42, 31, 23, 37, 54, 48, 31, 13, 13, + -13, -31, -25, -16, -16, -11, -38, -62, -33, -28, -7, -3, -12, -17, 6, 16, + 2, -11, -17, -5, 15, 35, 34, 25, 23, 44, 55, 41, 22, 14, 2, -29, + -32, -23, -11, -13, -18, -60, -50, -32, -16, -6, -11, -4, 3, 11, 3, -1, + -14, -8, 5, 20, 39, 31, 24, 26, 54, 57, 37, 16, 8, -19, -32, -27, + -17, -17, -17, -36, -58, -40, -32, -11, -11, -2, 6, 10, 2, 0, -4, -12, + 1, 8, 33, 42, 26, 17, 35, 63, 53, 26, 6, -9, -27, -30, -25, -17, + -23, -24, -47, -51, -38, -17, -11, -6, 12, 17, 8, -8, -1, -10, -7, 4, + 18, 40, 33, 18, 22, 49, 70, 46, 12, -11, -16, -23, -27, -19, -28, -26, + -36, -50, -48, -31, -13, -13, 10, 20, 21, 0, -6, -1, -7, 3, 15, 32, + 40, 24, 17, 31, 58, 67, 28, -2, -21, -14, -31, -18, -24, -33, -33, -49, + -49, -41, -18, -20, -2, 20, 23, 19, -12, -7, -2, -3, 10, 22, 33, 37, + 21, 23, 39, 72, 51, 10, -17, -18, -20, -29, -17, -33, -36, -49, -48, -47, + -24, -16, -15, 11, 24, 30, 6, -12, -2, -2, -1, 18, 29, 35, 27, 25, + 25, 56, 63, 23, -5, -19, -14, -23, -21, -21, -38, -52, -54, -40, -32, -15, + -23, -7, 18, 31, 22, -2, -7, 3, 0, 12, 21, 34, 31, 28, 22, 35, + 66, 40, 2, -19, -19, -15, -21, -16, -30, -60, -62, -42, -33, -18, -18, -22, + 4, 29, 29, 14, -2, -4, 5, 6, 16, 28, 36, 24, 29, 26, 52, 49, + 14, -13, -24, -19, -14, -15, -17, -53, -75, -54, -32, -18, -11, -26, -18, 18, + 28, 25, 13, -6, 4, 13, 9, 17, 37, 24, 28, 33, 37, 49, 26, 1, + -19, -26, -16, -11, -7, -33, -77, -71, -45, -15, -8, -18, -30, 1, 25, 21, + 26, 3, 5, 17, 14, 11, 33, 27, 17, 34, 38, 42, 33, 6, -11, -28, + -22, -12, -3, -16, -60, -81, -62, -25, -2, -14, -27, -17, 20, 18, 24, 18, + 6, 16, 21, 12, 24, 28, 12, 26, 44, 42, 35, 13, -5, -21, -31, -18, + -2, -2, -42, -77, -76, -47, -10, -6, -22, -24, 4, 16, 18, 25, 18, 18, + 24, 20, 20, 32, 14, 11, 40, 49, 41, 21, -6, -13, -27, -28, -5, 5, + -18, -59, -79, -63, -30, -6, -11, -28, -11, 8, 10, 23, 27, 17, 24, 25, + 25, 28, 19, 8, 25, 47, 46, 27, -5, -15, -18, -33, -20, -5, -3, -35, + -70, -66, -51, -22, -7, -21, -19, -3, 6, 17, 29, 26, 23, 28, 25, 32, + 23, 14, 11, 39, 50, 38, 3, -19, -10, -21, -29, -12, -3, -12, -55, -65, + -56, -42, -14, -10, -23, -11, -3, 10, 23, 32, 26, 28, 28, 35, 29, 22, + 13, 18, 41, 43, 18, -16, -18, -14, -29, -21, -11, -8, -32, -61, -52, -52, + -30, -11, -18, -16, -10, 2, 22, 35, 30, 25, 32, 34, 40, 27, 19, 11, + 23, 39, 32, -1, -22, -14, -22, -23, -14, -11, -17, -45, -52, -51, -51, -22, + -17, -19, -17, -10, 11, 35, 39, 29, 26, 34, 43, 43, 27, 16, 12, 25, + 31, 18, -13, -20, -19, -22, -12, -14, -15, -28, -44, -47, -53, -33, -15, -22, + -24, -20, 5, 27, 38, 31, 21, 27, 46, 51, 40, 18, 8, 13, 23, 24, + 3, -21, -22, -22, -8, -9, -22, -26, -31, -40, -51, -44, -17, -15, -26, -31, + -10, 24, 35, 37, 25, 21, 42, 57, 53, 30, 11, 7, 11, 21, 12, -11, + -23, -25, -12, 0, -18, -32, -31, -30, -45, -46, -26, -13, -25, -39, -25, 15, + 36, 29, 25, 20, 37, 58, 63, 46, 15, 3, -2, 19, 16, -2, -19, -25, + -23, 4, -4, -31, -36, -29, -32, -43, -37, -17, -16, -39, -43, -2, 34, 31, + 21, 17, 30, 62, 67, 62, 27, 9, -9, 3, 26, 8, -18, -26, -26, -5, + 9, -23, -44, -33, -26, -33, -40, -28, -12, -30, -52, -24, 23, 33, 15, 14, + 22, 54, 75, 68, 47, 14, -9, -12, 19, 23, -12, -20, -20, -13, 11, -6, + -40, -41, -19, -23, -34, -34, -14, -13, -48, -48, 4, 35, 23, 7, 13, 40, + 77, 78, 57, 31, -3, -18, 3, 27, 7, -24, -19, -16, 1, 5, -29, -49, + -28, -13, -26, -34, -26, -4, -30, -57, -24, 22, 30, 6, 7, 31, 63, 86, + 68, 42, 10, -19, -13, 15, 25, -10, -22, -14, -7, 6, -11, -45, -40, -14, + -24, -35, -31, -12, -8, -51, -44, -2, 29, 11, -1, 22, 47, 74, 78, 49, + 25, -8, -26, -4, 26, 12, -16, -19, -11, -1, -1, -28, -45, -22, -13, -29, + -29, -23, -1, -26, -55, -26, 14, 20, -3, 13, 39, 63, 80, 61, 33, 8, + -22, -25, 10, 22, -1, -14, -15, -7, -1, -14, -37, -26, -13, -25, -28, -26, + -2, -5, -48, -44, -7, 18, 3, 9, 30, 49, 71, 70, 45, 23, -13, -33, + -5, 22, 11, -7, -17, -14, -6, -8, -29, -29, -15, -19, -26, -31, -15, 6, + -25, -52, -30, 7, 7, 2, 21, 40, 60, 67, 52, 33, 7, -29, -19, 16, + 22, 4, -8, -15, -11, -6, -23, -24, -10, -11, -23, -27, -22, 1, 0, -34, + -45, -14, 2, 1, 15, 35, 52, 62, 49, 36, 21, -16, -26, 1, 20, 12, + -7, -10, -20, -10, -19, -28, -9, -8, -15, -26, -27, -11, 2, -15, -41, -34, + -10, -7, 6, 32, 48, 56, 51, 35, 26, 1, -24, -10, 15, 18, 2, -9, + -17, -18, -11, -32, -6, 2, -9, -18, -22, -17, -3, -2, -21, -34, -26, -13, + -8, 20, 47, 53, 52, 38, 24, 5, -14, -15, 9, 14, 4, -6, -14, -21, + -14, -28, -22, 12, 0, -10, -23, -24, -13, 2, -10, -23, -34, -26, -13, 4, + 39, 58, 51, 45, 28, 6, -9, -11, 3, 17, 7, -3, -10, -18, -15, -22, + -35, 2, 18, 2, -11, -23, -20, -1, 0, -15, -24, -39, -25, -6, 17, 52, + 56, 47, 35, 6, -10, -8, 0, 13, 13, -2, -9, -13, -13, -25, -43, -16, + 21, 19, -3, -21, -25, -10, 2, -5, -14, -30, -40, -13, -1, 34, 58, 51, + 44, 18, -10, -9, -2, 6, 12, 7, -7, -12, -12, -18, -40, -33, 9, 32, + 19, -9, -23, -15, 1, 3, -9, -18, -40, -28, -4, 7, 47, 59, 49, 24, + 1, -13, -5, 1, 10, 11, 5, -12, -12, -15, -35, -42, -9, 23, 33, 9, + -22, -24, -5, 1, -5, -12, -30, -40, -7, -3, 22, 56, 58, 35, 11, -12, + -9, -5, -1, 7, 13, -4, -13, -13, -25, -43, -29, 10, 34, 32, -6, -27, + -8, 3, -5, -13, -22, -40, -18, -3, -1, 37, 61, 46, 23, -5, -13, -4, + -4, -7, 12, 14, -10, -18, -22, -34, -35, -10, 22, 39, 23, -15, -14, 5, + 3, -8, -15, -36, -23, -1, -7, 14, 51, 57, 37, 8, -13, -7, -2, -14, + -6, 20, 3, -21, -26, -27, -30, -27, 1, 28, 36, 7, -10, 0, 5, -8, + -14, -30, -29, -3, -10, -5, 31, 56, 46, 19, -7, -10, 3, -11, -21, 9, + 19, -10, -30, -29, -19, -24, -20, 10, 35, 29, 8, -1, 5, -2, -13, -28, + -33, -3, -1, -13, 12, 49, 55, 31, -1, -12, 2, -3, -26, -2, 21, 2, + -28, -34, -21, -17, -29, -12, 23, 34, 19, 6, 7, 4, -4, -23, -40, -10, + 7, -12, -2, 34, 55, 36, 8, -10, 1, 3, -19, -18, 15, 15, -10, -33, + -30, -9, -19, -25, 4, 32, 30, 16, 11, 10, 3, -15, -35, -27, 9, -4, + -10, 16, 52, 42, 12, -7, -6, 4, -6, -21, -2, 17, 0, -20, -41, -13, + -9, -31, -16, 18, 34, 23, 14, 9, 10, -7, -26, -34, -3, 10, -10, 2, + 42, 51, 16, -8, -11, -2, -2, -11, -9, 9, 2, -8, -36, -31, 3, -23, + -30, -1, 27, 27, 23, 15, 18, 3, -17, -31, -19, 8, 1, -4, 24, 51, + 30, -11, -16, -6, -3, -5, -10, 3, 1, -10, -22, -41, -4, -6, -29, -18, + 12, 25, 26, 23, 20, 11, -10, -21, -27, -4, 7, 0, 13, 41, 40, 3, + -24, -11, -1, -2, -3, 5, 5, -14, -15, -35, -20, 0, -19, -24, -4, 11, + 23, 31, 24, 16, -3, -13, -23, -14, 2, 3, 18, 32, 38, 21, -20, -29, + -5, -2, 0, 5, 11, -14, -22, -25, -26, -3, -11, -26, -11, -2, 8, 32, + 34, 24, 2, -8, -16, -13, 1, 1, 10, 31, 31, 33, 1, -36, -22, 0, + 0, 8, 18, -3, -27, -22, -22, -10, -9, -24, -16, -5, -16, 16, 40, 34, + 8, -3, -13, -12, 1, 1, 3, 30, 30, 24, 18, -28, -35, -13, -2, 6, + 19, 10, -25, -28, -15, -9, -10, -19, -20, -3, -15, -8, 27, 42, 25, 1, + -14, -18, 7, 9, -1, 19, 37, 19, 23, -10, -41, -26, -9, 2, 20, 19, + -17, -35, -21, 0, -9, -18, -20, -7, -8, -24, 6, 37, 43, 14, -10, -22, + 3, 18, 4, 6, 36, 23, 16, 4, -32, -37, -19, -3, 17, 27, 0, -37, + -34, -3, 7, -17, -27, -19, -1, -20, -13, 17, 44, 35, 2, -22, -9, 19, + 20, 2, 26, 32, 15, 5, -17, -40, -29, -9, 10, 28, 17, -23, -41, -21, + 9, -2, -27, -30, -5, -7, -21, -4, 27, 47, 27, -14, -21, 11, 29, 14, + 15, 32, 20, 4, -11, -31, -38, -15, 2, 22, 22, -3, -32, -34, -6, 8, + -13, -38, -19, 0, -16, -14, 6, 37, 39, 11, -18, -4, 25, 25, 16, 24, + 27, 7, -10, -24, -38, -25, 0, 12, 23, 8, -16, -31, -23, 0, 0, -27, + -33, -2, -9, -16, -11, 17, 41, 32, 5, -15, 12, 25, 24, 21, 27, 14, + -4, -21, -31, -29, -4, 9, 19, 9, -9, -19, -25, -10, -5, -15, -38, -13, + -6, -13, -17, -1, 30, 36, 27, -2, 2, 20, 24, 25, 24, 19, 2, -16, + -32, -29, -13, 8, 18, 16, -6, -13, -21, -15, -14, -13, -26, -22, -6, -11, + -14, -14, 11, 30, 37, 17, 1, 13, 20, 23, 24, 21, 5, -10, -32, -31, + -15, 0, 17, 22, -3, -15, -17, -11, -15, -19, -23, -22, -8, -8, -13, -18, + -8, 18, 40, 38, 12, 12, 15, 21, 23, 24, 7, -9, -22, -34, -19, -6, + 11, 30, 9, -17, -20, -16, -11, -22, -30, -27, -8, -7, -10, -19, -16, -2, + 32, 52, 31, 17, 16, 13, 21, 19, 19, -9, -17, -30, -25, -7, 3, 29, + 25, -9, -21, -20, -11, -14, -29, -37, -14, 2, -5, -14, -22, -12, 13, 50, + 49, 27, 23, 15, 13, 9, 18, 7, -22, -22, -28, -11, -5, 19, 35, 13, + -20, -24, -18, -8, -22, -38, -31, 2, 3, -6, -26, -22, -3, 38, 56, 42, + 34, 21, 12, 6, 11, 17, -15, -24, -20, -15, -6, 9, 29, 29, -4, -28, + -23, -14, -13, -30, -39, -16, 9, 6, -12, -33, -16, 19, 57, 49, 41, 30, + 13, 4, -1, 6, -4, -27, -21, -13, -6, 2, 12, 34, 12, -24, -24, -20, + -16, -24, -38, -33, 2, 12, -2, -30, -31, 2, 45, 59, 46, 41, 24, 8, + -3, -6, 1, -15, -25, -16, -3, 5, 2, 21, 28, -11, -26, -23, -18, -20, + -32, -40, -14, 14, 11, -10, -40, -20, 30, 60, 55, 42, 34, 15, 6, -12, + -12, -4, -19, -21, -9, 8, 4, 10, 28, 6, -25, -22, -20, -22, -29, -38, + -27, 5, 16, 4, -24, -39, 12, 51, 61, 51, 41, 27, 10, -7, -25, -9, + -10, -17, -15, 0, 9, 5, 21, 15, -13, -27, -17, -21, -23, -38, -33, -11, + 10, 6, -4, -38, -17, 36, 55, 55, 45, 35, 21, 4, -27, -25, -2, -10, + -14, -13, 3, 5, 14, 16, 0, -24, -21, -18, -22, -36, -39, -17, -3, 5, + 3, -15, -28, 16, 50, 53, 52, 43, 29, 13, -14, -36, -10, -1, -15, -15, + -6, 6, 5, 13, 4, -11, -24, -17, -18, -27, -43, -18, -12, -7, 4, 3, + -17, -4, 38, 53, 52, 48, 41, 23, 0, -31, -30, 2, -7, -14, -13, -5, + 3, 11, 7, -4, -21, -25, -21, -19, -39, -23, -9, -19, -8, 5, -1, -10, + 24, 46, 48, 46, 44, 32, 10, -18, -37, -7, 0, -12, -14, -13, -4, 8, + 9, 1, -16, -29, -28, -17, -33, -31, -6, -21, -21, -4, 12, 3, 13, 41, + 46, 44, 46, 44, 20, -7, -36, -27, 6, -3, -18, -21, -12, 2, 12, 6, + -5, -27, -36, -21, -20, -34, -12, -8, -29, -16, 11, 15, 10, 28, 47, 46, + 41, 45, 35, 5, -24, -30, -5, 3, -14, -26, -16, -7, 7, 8, -3, -18, + -39, -32, -16, -28, -26, -8, -23, -26, 0, 19, 16, 20, 42, 55, 45, 38, + 39, 20, -11, -24, -13, -2, -6, -25, -22, -7, -5, 13, 0, -11, -36, -41, + -20, -16, -29, -16, -14, -28, -12, 13, 17, 15, 32, 50, 57, 41, 38, 30, + 2, -14, -9, -3, -3, -19, -33, -10, -7, 7, 7, -13, -30, -42, -28, -13, + -17, -26, -14, -22, -15, 7, 19, 15, 26, 46, 59, 51, 34, 33, 12, -7, + -11, -4, -5, -13, -38, -23, -3, 3, 15, -7, -32, -45, -34, -21, -11, -27, + -25, -21, -19, -1, 13, 15, 22, 37, 53, 62, 46, 34, 15, -2, 0, -4, + -8, -9, -34, -38, -8, 4, 17, 3, -25, -50, -44, -26, -12, -13, -32, -24, + -20, -7, 11, 18, 17, 33, 50, 65, 57, 41, 24, 0, 5, 5, -9, -11, + -25, -44, -25, -1, 17, 13, -18, -42, -51, -33, -20, -7, -27, -29, -23, -16, + 0, 14, 14, 28, 48, 60, 66, 51, 34, 4, 0, 15, -3, -14, -20, -35, + -37, -12, 12, 27, -7, -37, -50, -40, -29, -15, -15, -30, -24, -15, -7, 6, + 17, 25, 46, 59, 68, 63, 43, 20, -6, 14, 10, -8, -20, -30, -34, -22, + -2, 24, 15, -30, -49, -49, -37, -28, -15, -26, -28, -18, -11, -7, 7, 27, + 42, 58, 70, 70, 53, 35, 4, 0, 18, -1, -15, -32, -31, -26, -12, 12, + 28, -4, -44, -53, -44, -39, -25, -23, -28, -19, -11, -12, -16, 13, 42, 56, + 71, 71, 57, 45, 23, -3, 10, 11, -6, -27, -35, -25, -22, -1, 23, 17, + -29, -54, -46, -44, -39, -29, -28, -21, -15, -15, -26, -12, 39, 57, 70, 73, + 60, 49, 41, 13, 1, 11, 0, -16, -32, -25, -15, -14, 10, 23, -5, -48, + -46, -42, -49, -43, -31, -24, -15, -13, -24, -32, 18, 59, 71, 77, 67, 57, + 47, 33, 3, 5, 5, -9, -23, -33, -16, -14, -5, 17, 12, -29, -44, -35, + -50, -57, -43, -30, -18, -11, -22, -39, -9, 44, 68, 82, 69, 61, 49, 42, + 18, 5, 5, -8, -12, -26, -14, -7, -9, 5, 16, -6, -36, -32, -42, -62, + -55, -39, -29, -15, -14, -34, -30, 20, 59, 82, 79, 66, 58, 45, 38, 9, + 1, -7, -11, -16, -19, -3, -6, -6, 9, 5, -22, -32, -32, -58, -70, -56, + -42, -24, -16, -25, -39, -9, 41, 72, 86, 73, 65, 46, 40, 30, -4, -7, + -14, -12, -20, -3, 4, -5, 1, 8, -9, -27, -25, -40, -67, -67, -55, -38, + -24, -17, -25, -28, 16, 61, 81, 82, 71, 60, 37, 42, 17, -14, -17, -11, + -13, -8, 10, 2, -2, 1, -1, -17, -20, -26, -54, -69, -70, -58, -34, -25, + -16, -23, -9, 37, 70, 87, 80, 68, 44, 38, 39, -5, -27, -19, -12, -6, + 13, 10, 4, 1, 1, -5, -19, -20, -37, -59, -71, -71, -54, -35, -17, -9, + -20, 11, 49, 80, 86, 72, 54, 36, 45, 23, -25, -34, -16, -9, 11, 17, + 8, 5, -4, -2, -15, -19, -26, -50, -69, -77, -71, -51, -29, -7, -11, -6, + 26, 64, 87, 78, 60, 40, 42, 45, 2, -38, -34, -12, 10, 24, 10, 11, + 3, -1, -6, -20, -16, -31, -61, -81, -80, -69, -41, -16, -5, -8, 10, 47, + 81, 86, 70, 44, 36, 48, 32, -21, -48, -31, -3, 24, 24, 10, 15, 0, + 2, -17, -21, -18, -45, -81, -87, -80, -57, -33, -11, -6, 2, 30, 74, 86, + 77, 55, 34, 42, 48, 13, -39, -50, -20, 15, 34, 14, 16, 12, 4, -5, + -26, -16, -19, -64, -92, -91, -65, -43, -26, -12, -1, 16, 47, 83, 76, 66, + 40, 33, 45, 33, -8, -52, -41, -5, 32, 30, 15, 25, 13, 8, -22, -28, + -11, -34, -85, -101, -86, -52, -36, -25, -13, 15, 32, 69, 80, 69, 52, 32, + 37, 39, 19, -30, -54, -24, 10, 38, 25, 25, 22, 18, -6, -35, -20, -14, + -59, -98, -99, -68, -41, -30, -23, 5, 28, 52, 74, 67, 59, 43, 32, 35, + 32, -2, -47, -38, -13, 23, 33, 31, 26, 27, 16, -29, -37, -15, -33, -80, + -104, -89, -54, -35, -31, -11, 17, 42, 63, 68, 60, 59, 37, 27, 33, 22, + -28, -37, -26, 3, 32, 38, 30, 25, 30, -3, -41, -29, -23, -55, -90, -98, + -76, -39, -32, -21, 4, 36, 52, 61, 61, 63, 48, 24, 28, 34, -10, -31, + -29, -14, 15, 37, 37, 28, 31, 19, -27, -40, -24, -38, -69, -95, -96, -60, + -32, -26, -10, 19, 45, 53, 58, 59, 58, 29, 23, 39, 14, -21, -25, -23, + 1, 27, 43, 34, 34, 21, 0, -36, -32, -31, -49, -84, -102, -83, -41, -22, + -19, -1, 35, 49, 52, 53, 56, 39, 23, 34, 33, -3, -23, -22, -10, 17, + 36, 36, 39, 26, 8, -16, -34, -29, -36, -61, -93, -95, -58, -26, -18, -11, + 22, 48, 53, 53, 51, 41, 31, 33, 37, 16, -15, -24, -14, 4, 29, 34, + 41, 32, 8, -7, -19, -28, -30, -54, -83, -101, -76, -40, -20, -21, 1, 36, + 54, 55, 44, 33, 32, 35, 36, 30, 7, -26, -19, -5, 22, 36, 37, 37, + 15, -3, -5, -15, -24, -43, -75, -94, -87, -47, -29, -25, -14, 26, 48, 62, + 49, 29, 23, 35, 45, 38, 19, -16, -28, -7, 10, 29, 32, 38, 23, -2, + -10, -6, -12, -28, -67, -90, -98, -59, -32, -28, -25, 3, 43, 56, 59, 25, + 16, 24, 46, 43, 31, 0, -31, -14, 5, 25, 29, 32, 29, 6, -13, -6, + -3, -8, -49, -85, -97, -75, -31, -30, -30, -12, 31, 50, 61, 40, 12, 14, + 34, 53, 43, 20, -23, -20, -3, 21, 29, 23, 24, 15, -10, -8, -1, 2, + -25, -75, -98, -92, -42, -31, -35, -24, 14, 41, 50, 49, 22, 11, 20, 45, + 52, 39, 0, -26, -12, 9, 35, 25, 18, 14, 1, -13, -6, 4, 3, -49, + -89, -102, -61, -27, -30, -27, -4, 34, 46, 46, 32, 17, 13, 26, 47, 50, + 29, -19, -22, -4, 30, 37, 15, 7, 7, -5, -10, -4, 9, -20, -72, -100, + -86, -41, -33, -31, -16, 18, 43, 34, 32, 27, 23, 15, 31, 47, 48, 9, + -24, -16, 12, 43, 25, -2, 0, 9, -9, -15, 2, 8, -40, -87, -99, -69, + -37, -31, -19, 6, 38, 35, 25, 31, 35, 26, 18, 36, 49, 40, -10, -22, + -9, 29, 40, 6, -12, 6, 6, -16, -11, 9, -6, -61, -95, -90, -58, -35, + -26, -5, 23, 36, 18, 21, 36, 41, 28, 22, 38, 52, 23, -17, -17, 7, + 39, 21, -12, -13, 16, -8, -22, -5, 6, -25, -77, -93, -79, -46, -30, -11, + 15, 36, 22, 5, 29, 47, 47, 24, 22, 41, 48, 7, -15, -4, 22, 33, + 6, -23, 4, 8, -21, -15, -1, -5, -49, -79, -92, -71, -43, -20, 11, 31, + 29, 4, 16, 40, 55, 41, 22, 31, 50, 25, -9, -2, 8, 23, 16, -17, + -6, 8, -10, -15, -6, -4, -29, -56, -80, -86, -61, -42, 0, 30, 33, 12, + 2, 24, 47, 55, 37, 28, 39, 40, 4, -1, 6, 6, 16, -4, -13, 1, + -2, -9, -11, -11, -21, -35, -55, -82, -80, -64, -24, 27, 36, 23, 3, 10, + 35, 61, 55, 40, 35, 35, 19, 6, 12, 4, 1, 3, -12, -3, -2, -4, + -4, -14, -23, -30, -37, -58, -83, -84, -58, 8, 37, 33, 11, 3, 20, 46, + 62, 55, 50, 28, 16, 12, 15, 9, -4, -9, -9, -4, -5, -7, 2, -7, + -28, -35, -31, -36, -67, -90, -86, -23, 28, 38, 25, 5, 13, 34, 58, 58, + 69, 50, 15, 10, 20, 16, -3, -14, -14, -2, 1, -12, -3, 3, -20, -36, + -39, -26, -46, -81, -98, -61, 6, 27, 30, 16, 12, 25, 50, 57, 66, 74, + 31, 4, 16, 21, 8, -13, -21, -10, 8, -5, -11, 6, -8, -31, -40, -29, + -30, -66, -93, -84, -22, 17, 22, 26, 16, 20, 43, 56, 56, 70, 60, 17, + 8, 18, 15, -10, -26, -21, 6, 7, -12, -1, 1, -20, -33, -34, -31, -51, + -79, -92, -52, -6, 9, 19, 23, 21, 40, 57, 59, 60, 72, 43, 17, 13, + 18, 3, -23, -32, -5, 14, -7, -11, 7, -12, -26, -31, -37, -46, -66, -85, + -67, -21, -5, 3, 16, 22, 37, 54, 59, 55, 60, 58, 30, 16, 13, 11, + -15, -34, -23, 9, 7, -12, -2, -4, -19, -16, -31, -49, -64, -76, -72, -35, + -12, -14, 0, 15, 34, 53, 60, 58, 53, 57, 43, 30, 18, 12, -4, -27, + -28, -8, 14, -3, -9, -2, -13, -9, -17, -49, -66, -70, -69, -44, -15, -19, + -11, 2, 21, 53, 64, 68, 55, 48, 44, 36, 28, 15, -1, -18, -23, -19, + -4, 5, -3, 1, -9, -7, -1, -35, -70, -74, -70, -50, -21, -14, -22, -7, + -1, 39, 66, 77, 69, 46, 38, 36, 38, 22, 5, -12, -16, -12, -17, -8, + -5, 2, 1, -6, 5, -13, -64, -78, -73, -60, -31, -14, -17, -16, -10, 7, + 61, 79, 81, 57, 38, 28, 32, 24, 9, -4, -10, -4, -11, -20, -13, -2, + 11, 4, 4, -2, -41, -76, -76, -69, -43, -22, -12, -17, -14, -14, 25, 74, + 92, 79, 47, 31, 26, 26, 11, 3, -5, 0, 0, -20, -26, -11, 9, 14, + 9, 4, -24, -61, -76, -74, -53, -30, -13, -8, -12, -25, -8, 51, 90, 93, + 63, 42, 21, 18, 13, 6, 2, 1, 8, -12, -30, -27, -2, 14, 18, 11, + -13, -48, -68, -79, -70, -44, -19, -2, -5, -21, -31, 18, 77, 100, 81, 55, + 29, 7, 8, 6, 7, 4, 14, 0, -26, -34, -13, 9, 16, 17, 1, -35, + -58, -70, -82, -62, -29, -2, 1, -14, -36, -15, 50, 89, 95, 71, 46, 5, + -6, 4, 11, 3, 11, 14, -12, -31, -22, -2, 8, 16, 16, -15, -53, -56, + -80, -81, -41, -5, 9, -3, -30, -34, 17, 73, 97, 86, 63, 25, -12, -6, + 11, 13, 1, 15, 4, -19, -25, -5, 2, 9, 19, 10, -39, -48, -61, -95, + -67, -17, 12, 8, -23, -43, -9, 49, 85, 91, 76, 50, 1, -23, 2, 22, + 5, 2, 14, -5, -23, -12, 0, -2, 13, 17, -15, -48, -43, -83, -88, -38, + 5, 17, -11, -41, -28, 27, 67, 83, 82, 65, 29, -21, -18, 21, 19, -7, + 3, 6, -8, -14, 1, 0, 0, 13, 2, -34, -42, -59, -99, -63, -12, 17, + 0, -35, -42, 1, 53, 69, 79, 72, 53, -1, -34, 2, 32, 3, -8, 1, + 2, -2, -3, 8, -2, 3, 7, -18, -40, -39, -76, -81, -35, 9, 17, -22, + -46, -24, 34, 59, 68, 74, 66, 27, -26, -22, 31, 24, -10, -11, 0, 14, + 1, 5, 8, -5, -2, -10, -34, -35, -48, -77, -59, -13, 20, -4, -37, -35, + 8, 47, 55, 68, 74, 49, -4, -34, 10, 39, 1, -13, -11, 14, 14, 3, + 20, 6, -9, -14, -29, -37, -28, -56, -66, -42, 9, 9, -25, -38, -14, 27, + 45, 54, 72, 61, 21, -25, -14, 31, 19, -10, -15, -2, 22, 6, 22, 24, + -4, -20, -28, -38, -24, -28, -54, -57, -20, 14, -10, -29, -26, 2, 29, 39, + 61, 66, 39, -6, -25, 16, 30, 0, -16, -8, 12, 13, 18, 38, 10, -20, + -36, -34, -31, -16, -33, -56, -42, 0, 0, -21, -22, -12, 11, 25, 49, 68, + 53, 14, -20, -3, 29, 15, -11, -12, 3, 13, 13, 42, 34, -12, -39, -37, + -27, -22, -18, -44, -50, -21, 3, -12, -15, -18, -5, 9, 27, 60, 60, 32, + -6, -12, 21, 25, -4, -12, -2, 7, 8, 33, 53, 8, -37, -41, -25, -22, + -16, -27, -47, -34, -10, -10, -15, -15, -15, -5, 5, 41, 63, 44, 12, -11, + 10, 32, 10, -14, -8, 8, 5, 19, 53, 34, -24, -43, -25, -14, -15, -19, + -35, -35, -20, -12, -8, -14, -17, -19, -13, 19, 55, 53, 22, -8, 4, 31, + 26, -8, -13, 6, 10, 7, 39, 50, -2, -41, -31, -10, -13, -23, -31, -33, + -24, -15, -7, -13, -16, -22, -23, -6, 38, 55, 34, 1, -1, 23, 34, 9, + -18, -3, 14, 9, 20, 51, 24, -28, -37, -6, 2, -20, -30, -27, -21, -22, + -6, -12, -17, -21, -32, -27, 9, 49, 43, 12, -4, 14, 34, 24, -9, -12, + 12, 19, 13, 30, 37, -3, -35, -15, 12, -10, -31, -30, -15, -18, -13, -3, + -19, -20, -31, -35, -17, 28, 44, 22, 0, 7, 28, 27, 5, -15, 1, 20, + 20, 17, 28, 19, -21, -23, 12, 8, -22, -32, -20, -8, -15, 0, -13, -23, + -25, -43, -36, 4, 37, 30, 11, 4, 22, 28, 15, 0, -10, 9, 23, 14, + 11, 24, 5, -21, 2, 17, -8, -27, -27, -7, -10, -6, -1, -20, -26, -39, + -53, -20, 23, 36, 17, 7, 14, 28, 16, 12, -3, 2, 19, 16, 2, 14, + 19, -8, -5, 17, 4, -15, -26, -10, -4, -12, 1, -8, -23, -38, -58, -41, + 0, 29, 23, 11, 16, 21, 15, 9, 11, -6, 11, 20, 4, 3, 24, 5, + -5, 10, 17, -6, -15, -15, 6, -15, -8, 0, -11, -37, -54, -56, -24, 13, + 29, 12, 15, 20, 19, 6, 16, 5, -2, 10, 11, -3, 22, 18, 0, 6, + 20, 10, -6, -12, 1, -6, -23, 0, 1, -23, -56, -60, -43, -10, 19, 22, + 15, 22, 18, 6, 11, 17, -2, -5, 10, 4, 7, 23, 1, 3, 16, 22, + 5, -1, 0, 5, -21, -14, 6, -6, -46, -64, -54, -29, 1, 17, 18, 24, + 25, 10, 1, 17, 9, -8, -1, 15, 6, 20, 11, 2, 14, 25, 16, 9, + 5, 7, -11, -26, -5, 4, -27, -62, -62, -40, -17, 8, 11, 21, 29, 17, + -2, 10, 17, -8, -16, 6, 13, 11, 15, 3, 8, 24, 26, 14, 12, 12, + 4, -26, -15, 1, -12, -50, -64, -48, -27, -10, 5, 8, 32, 31, 1, -1, + 18, 0, -23, -6, 18, 14, 11, 5, 3, 17, 35, 25, 16, 18, 14, -11, + -27, -8, -6, -30, -55, -53, -36, -20, -5, 5, 14, 43, 13, -6, 11, 11, + -22, -22, 7, 19, 13, 10, 1, 7, 30, 36, 22, 23, 23, 6, -28, -20, + -6, -23, -43, -49, -43, -29, -19, 3, 1, 34, 29, -4, 3, 13, -13, -32, + -3, 20, 14, 11, 5, 2, 23, 42, 34, 22, 23, 21, -13, -26, -14, -19, + -32, -38, -43, -32, -29, -6, 4, 16, 35, 9, -4, 11, 0, -33, -22, 9, + 13, 12, 9, 3, 14, 35, 47, 34, 23, 27, 8, -22, -19, -16, -30, -29, + -42, -33, -32, -23, 4, 9, 24, 20, -1, 3, 10, -20, -36, -5, 13, 9, + 11, 8, 8, 21, 43, 48, 27, 22, 23, -7, -25, -20, -28, -25, -31, -36, + -28, -33, -8, 11, 14, 14, 6, -8, 7, -5, -39, -25, 7, 14, 9, 10, + 12, 15, 29, 55, 41, 23, 22, 9, -12, -23, -28, -24, -23, -34, -26, -31, + -21, 9, 19, 9, 1, -3, -1, 7, -32, -38, -9, 13, 11, 9, 11, 14, + 21, 46, 53, 32, 24, 12, -2, -16, -26, -24, -17, -34, -33, -25, -24, -4, + 17, 14, -3, -4, -7, 3, -13, -46, -25, 2, 17, 5, 8, 12, 18, 32, + 56, 38, 29, 15, 8, -4, -22, -30, -14, -22, -42, -25, -15, -10, 6, 17, + 1, -5, -7, -10, -2, -38, -37, -7, 15, 9, 2, 8, 21, 26, 43, 44, + 29, 18, 7, 12, -9, -25, -24, -11, -35, -43, -17, -5, 3, 10, 9, -3, + -3, -23, -9, -23, -45, -22, 7, 15, 2, 4, 17, 33, 31, 45, 35, 23, + 8, 17, 6, -16, -26, -14, -20, -48, -27, -2, 6, 11, 9, -1, 6, -15, + -28, -18, -39, -32, -7, 11, 7, 6, 7, 33, 30, 31, 41, 27, 7, 13, + 24, -3, -18, -22, -9, -40, -41, -10, 4, 9, 17, 3, 5, -4, -37, -29, + -29, -35, -19, 1, 10, 3, 7, 25, 41, 19, 31, 32, 13, 5, 27, 14, + -6, -19, -12, -23, -48, -22, 7, 8, 16, 11, 1, 6, -29, -46, -32, -32, + -20, -5, 7, 4, 3, 21, 43, 32, 15, 29, 16, 8, 19, 26, 3, -9, + -22, -13, -42, -37, -8, 11, 14, 25, 9, 4, -17, -50, -44, -30, -25, -14, + -1, 11, 1, 18, 36, 41, 12, 14, 18, 14, 15, 20, 17, 6, -14, -18, + -27, -39, -19, 5, 12, 24, 27, 8, -13, -49, -53, -32, -27, -19, -12, 7, + 7, 12, 31, 43, 26, 2, 8, 14, 22, 13, 17, 18, 6, -17, -26, -36, + -28, -6, 14, 25, 35, 20, -6, -42, -57, -37, -23, -23, -20, 0, 9, 8, + 25, 41, 40, 7, -4, 1, 23, 21, 14, 22, 20, -2, -24, -34, -31, -13, + 8, 24, 37, 33, 8, -32, -62, -44, -20, -22, -27, -9, 9, 7, 16, 31, + 42, 20, -10, -13, 10, 26, 7, 13, 25, 18, -11, -35, -39, -20, 0, 17, + 37, 37, 19, -17, -58, -55, -26, -18, -25, -21, 0, 14, 12, 20, 38, 35, + 0, -19, -9, 24, 19, 3, 21, 31, 17, -24, -42, -30, -3, 13, 34, 42, + 28, -2, -45, -62, -38, -22, -19, -20, -12, 12, 17, 11, 29, 42, 18, -16, + -20, 3, 24, 2, 4, 26, 36, 0, -38, -45, -13, 12, 27, 41, 34, 14, + -27, -62, -55, -30, -19, -15, -16, -2, 18, 11, 14, 37, 31, -6, -22, -12, + 15, 10, -10, 12, 36, 30, -19, -46, -33, 11, 24, 28, 35, 28, -5, -44, + -65, -44, -23, -11, -9, -8, 5, 14, 10, 25, 37, 14, -17, -18, -2, 14, + -7, -6, 23, 43, 10, -33, -38, -9, 24, 24, 28, 30, 11, -21, -57, -61, + -39, -12, -5, -5, -3, 7, 10, 17, 31, 30, -3, -20, -14, 6, 1, -16, + 2, 38, 38, -5, -30, -24, 13, 25, 21, 28, 15, 1, -34, -64, -62, -23, + 0, 2, -1, -1, 5, 14, 24, 33, 14, -12, -23, -4, 7, -18, -18, 18, + 43, 25, -9, -22, -2, 21, 19, 24, 20, 11, -13, -47, -69, -46, -7, 5, + 6, -1, -4, 9, 21, 31, 25, 5, -15, -20, 3, -8, -33, -7, 29, 37, + 20, -10, -10, 9, 15, 17, 14, 12, 1, -23, -55, -70, -30, 5, 13, 2, + -8, -1, 15, 25, 30, 15, -1, -20, -8, -3, -31, -28, 8, 31, 41, 15, + -6, 0, 9, 14, 12, 9, 8, -10, -28, -63, -55, -12, 17, 11, -7, -13, + 8, 22, 26, 19, 9, -7, -13, -5, -23, -39, -10, 17, 41, 38, 8, 0, + 5, 7, 12, 5, 7, -6, -8, -39, -60, -35, 7, 19, 6, -10, -6, 15, + 26, 22, 15, 9, -8, -13, -24, -45, -29, -1, 29, 48, 30, 2, 6, 5, + 9, 5, -1, -5, -4, -13, -51, -51, -16, 20, 13, 0, -11, 7, 25, 22, + 18, 17, 10, -8, -22, -50, -43, -13, 15, 46, 42, 16, 7, 8, 7, 7, + -1, -6, -10, -4, -27, -45, -36, 5, 16, 7, -5, -5, 20, 22, 19, 19, + 22, 7, -15, -43, -62, -29, 3, 35, 43, 27, 11, 9, 8, 4, 2, -9, + -13, -7, -15, -30, -43, -16, 12, 13, 4, -8, 12, 24, 17, 16, 24, 25, + -3, -38, -72, -52, -9, 25, 42, 30, 21, 8, 14, 4, 6, -3, -13, -12, + -13, -18, -36, -34, 3, 14, 9, -9, 5, 26, 18, 13, 26, 34, 13, -31, + -69, -68, -16, 19, 35, 29, 22, 6, 16, 3, 2, 6, -5, -15, -20, -19, + -21, -34, -17, 8, 16, -2, -3, 24, 27, 16, 23, 34, 32, -10, -56, -80, + -45, 6, 29, 29, 22, 10, 14, 13, -4, 6, 7, -8, -27, -27, -18, -20, + -28, -8, 14, 8, -7, 11, 29, 21, 17, 25, 35, 16, -36, -77, -67, -14, + 25, 30, 22, 11, 10, 19, 5, 2, 6, 5, -18, -34, -25, -13, -23, -19, + 4, 13, 0, 7, 24, 32, 24, 22, 31, 30, -12, -62, -76, -41, 9, 28, + 24, 15, 6, 18, 16, 6, 6, 7, -7, -32, -37, -16, -18, -24, -8, 11, + 7, 7, 20, 31, 35, 25, 24, 33, 9, -40, -72, -58, -16, 17, 27, 16, + 6, 10, 22, 12, 8, 8, 2, -23, -43, -26, -16, -24, -18, 2, 6, 7, + 21, 29, 36, 32, 21, 27, 22, -21, -57, -67, -38, -4, 26, 21, 9, 3, + 18, 25, 18, 10, 2, -11, -42, -36, -24, -27, -23, -9, 5, 2, 17, 32, + 42, 36, 27, 18, 25, -2, -39, -58, -51, -27, 11, 27, 11, 1, 9, 24, + 25, 21, 5, -8, -31, -37, -30, -33, -24, -15, 0, -2, 13, 31, 48, 47, + 33, 15, 18, 10, -27, -50, -52, -44, -12, 21, 21, 5, -1, 13, 33, 30, + 16, -6, -26, -39, -33, -35, -28, -20, -10, -8, 4, 27, 51, 61, 45, 21, + 13, 14, -11, -39, -40, -44, -36, 1, 25, 16, 1, 2, 27, 40, 28, 3, + -22, -38, -38, -32, -33, -21, -18, -14, -8, 18, 50, 66, 60, 27, 7, 12, + -3, -31, -36, -37, -46, -27, 18, 26, 5, -3, 8, 35, 43, 16, -14, -36, + -43, -32, -32, -25, -16, -23, -14, 6, 46, 64, 74, 49, 9, 4, 7, -23, + -37, -34, -41, -44, -8, 31, 19, -5, 0, 21, 47, 33, -2, -33, -43, -43, + -32, -29, -14, -22, -23, -6, 34, 62, 75, 71, 30, 0, 8, -13, -37, -34, + -35, -45, -34, 18, 31, 5, -5, 7, 35, 44, 12, -23, -45, -49, -40, -29, + -18, -18, -27, -15, 22, 57, 74, 80, 57, 15, 4, -1, -39, -34, -34, -40, + -46, -4, 25, 13, -3, 2, 22, 44, 25, -10, -38, -44, -50, -34, -20, -14, + -31, -21, 5, 47, 63, 81, 76, 38, 8, 9, -30, -45, -35, -36, -43, -20, + 9, 14, 5, 3, 7, 36, 32, 3, -32, -43, -50, -40, -28, -13, -24, -28, + -2, 35, 56, 73, 86, 58, 23, 21, -10, -49, -45, -33, -39, -25, -3, 5, + 5, 8, 5, 18, 32, 17, -19, -45, -49, -41, -35, -22, -19, -31, -12, 28, + 52, 59, 76, 74, 41, 31, 10, -39, -58, -41, -32, -27, -5, -3, 3, 8, + 8, 10, 24, 22, -4, -39, -52, -42, -35, -30, -18, -28, -22, 20, 53, 52, + 60, 73, 62, 43, 31, -18, -56, -61, -35, -28, -9, -6, -3, 3, 9, 10, + 12, 18, 8, -23, -53, -50, -31, -35, -24, -28, -26, 3, 48, 55, 52, 59, + 66, 57, 46, 7, -37, -67, -53, -24, -11, -4, -6, 0, 3, 13, 10, 7, + 10, -6, -38, -58, -36, -30, -30, -26, -26, -11, 33, 60, 56, 49, 59, 67, + 58, 32, -15, -58, -69, -34, -14, -8, -6, 1, -4, 7, 8, 2, 4, 4, + -21, -54, -49, -30, -30, -28, -29, -18, 13, 53, 60, 50, 44, 63, 61, 49, + 11, -33, -71, -49, -19, -9, -10, 5, 2, -1, 4, -1, 4, 5, -5, -38, + -55, -40, -28, -21, -25, -26, -2, 40, 61, 56, 39, 53, 66, 54, 33, -4, + -55, -63, -29, -18, -12, 3, 11, -4, -4, -9, -3, 4, 4, -18, -49, -49, + -35, -18, -18, -25, -16, 24, 51, 60, 42, 43, 66, 57, 42, 21, -23, -63, + -44, -26, -18, -10, 13, 9, -8, -18, -17, 5, 5, -4, -35, -47, -42, -24, + -11, -20, -21, 5, 36, 56, 53, 37, 60, 59, 40, 34, 11, -34, -52, -33, + -21, -15, 1, 21, 2, -19, -33, -10, 8, 3, -20, -42, -41, -33, -14, -16, + -18, -7, 21, 43, 54, 39, 47, 61, 44, 31, 27, -4, -41, -47, -28, -23, + -9, 11, 15, -9, -34, -34, 1, 10, -2, -30, -38, -34, -18, -15, -17, -10, + 10, 27, 43, 42, 42, 53, 54, 36, 24, 14, -15, -42, -36, -32, -22, 1, + 13, 7, -26, -48, -24, 11, 10, -14, -35, -32, -19, -16, -15, -11, 5, 18, + 31, 34, 41, 48, 51, 46, 28, 26, 8, -26, -36, -33, -35, -12, 7, 12, + -8, -45, -47, -9, 13, 5, -24, -32, -17, -14, -16, -11, 6, 14, 20, 26, + 27, 47, 49, 49, 34, 25, 22, -6, -31, -27, -39, -30, -10, 13, 6, -28, + -57, -31, -3, 12, -7, -28, -19, -8, -21, -18, -2, 18, 17, 17, 19, 34, + 47, 53, 42, 34, 30, 13, -22, -20, -30, -44, -32, -4, 15, -7, -45, -49, + -18, 4, 10, -14, -18, 0, -11, -26, -7, 15, 23, 10, 10, 20, 34, 51, + 49, 38, 41, 30, -8, -28, -15, -39, -47, -28, 5, 10, -26, -55, -34, -9, + 10, 3, -13, -4, 1, -21, -19, 3, 25, 13, 5, 9, 18, 36, 54, 39, + 40, 46, 16, -27, -17, -23, -47, -47, -18, 9, -2, -47, -51, -23, 0, 4, + 0, 1, 9, -11, -20, -9, 20, 23, 4, 2, 8, 20, 45, 46, 38, 53, + 41, -13, -30, -19, -36, -52, -40, -9, 5, -23, -53, -35, -6, 4, 3, 6, + 10, 5, -16, -17, 6, 30, 12, 0, -4, 9, 32, 47, 43, 55, 57, 16, + -27, -30, -28, -44, -52, -31, -6, -8, -43, -43, -15, -1, -1, 8, 10, 13, + 2, -18, -11, 21, 23, 6, -5, 0, 19, 33, 41, 56, 67, 44, -5, -34, + -35, -32, -46, -47, -27, -7, -30, -44, -23, -2, -2, 3, 7, 14, 18, -1, + -19, 4, 20, 16, -5, -9, 10, 27, 30, 46, 65, 63, 26, -22, -42, -34, + -41, -46, -40, -18, -25, -39, -28, -4, 1, -1, 5, 10, 24, 19, -8, -6, + 11, 20, 4, -13, 2, 22, 24, 36, 59, 70, 51, 5, -39, -39, -43, -47, + -45, -31, -30, -39, -33, -7, 1, -2, 1, 4, 19, 25, 5, -5, 1, 12, + 13, -12, -12, 18, 25, 21, 46, 68, 69, 36, -17, -39, -44, -51, -43, -33, + -35, -41, -38, -15, 8, 0, 0, 0, 13, 26, 19, 5, 0, -1, 10, -2, + -14, 5, 25, 19, 29, 54, 71, 59, 9, -31, -43, -56, -50, -32, -38, -47, + -42, -26, 8, 10, -3, -3, 7, 20, 23, 16, 8, -5, 3, 2, -17, -6, + 22, 20, 18, 40, 66, 71, 37, -13, -36, -52, -61, -38, -32, -47, -51, -38, + -7, 19, 6, -6, 4, 14, 19, 21, 19, 2, -5, 0, -13, -12, 14, 21, + 13, 27, 53, 71, 57, 12, -25, -42, -61, -54, -33, -38, -52, -50, -22, 13, + 17, -4, 1, 16, 17, 19, 25, 11, -2, -2, -11, -18, 6, 21, 15, 18, + 43, 66, 67, 34, -7, -30, -49, -58, -42, -36, -42, -54, -36, -2, 20, 4, + -4, 11, 16, 17, 26, 17, 4, 1, -8, -22, -8, 17, 16, 17, 27, 55, + 66, 48, 10, -25, -36, -49, -52, -42, -39, -47, -46, -18, 13, 14, -1, 3, + 13, 19, 27, 18, 2, 5, 1, -14, -17, 6, 13, 16, 26, 44, 64, 54, + 27, -15, -30, -33, -49, -50, -43, -44, -45, -30, -1, 13, 3, 6, 10, 22, + 30, 21, 3, 2, 2, -3, -18, -9, 8, 11, 23, 35, 55, 58, 37, 1, + -25, -18, -33, -51, -48, -46, -41, -30, -17, 6, 3, 7, 9, 16, 30, 27, + 9, 3, 3, 1, -10, -18, 0, 3, 12, 37, 46, 52, 40, 15, -23, -16, + -14, -39, -48, -48, -45, -31, -20, -7, 1, 4, 14, 13, 21, 26, 16, 2, + 1, 1, 1, -16, -12, 1, 5, 29, 50, 47, 39, 21, -11, -21, -3, -23, + -41, -45, -47, -37, -21, -13, -6, 1, 16, 20, 22, 22, 18, 10, 2, 1, + 6, -7, -16, -10, 0, 16, 51, 53, 38, 22, -1, -21, -1, -4, -30, -41, + -45, -45, -28, -13, -13, -8, 13, 24, 26, 15, 13, 15, 8, -4, 1, -2, + -11, -15, -11, 2, 40, 56, 44, 21, 1, -16, -10, 5, -16, -32, -38, -41, + -36, -22, -14, -15, 4, 24, 32, 18, 7, 14, 14, 4, -2, -1, -8, -12, + -15, -6, 24, 50, 51, 28, 1, -13, -14, 4, 1, -18, -31, -35, -36, -33, + -21, -21, -5, 19, 38, 23, 3, 5, 17, 15, 2, -3, -7, -8, -18, -14, + 12, 39, 50, 35, 2, -14, -14, -3, 6, -6, -24, -27, -32, -40, -25, -22, + -12, 8, 35, 34, 10, 2, 5, 19, 9, -6, -4, -3, -15, -18, 4, 30, + 42, 40, 13, -17, -16, -7, 3, 5, -14, -21, -24, -41, -37, -23, -18, -1, + 22, 37, 17, 4, -1, 11, 17, 1, -7, -4, -12, -22, -6, 24, 35, 33, + 25, -7, -26, -15, 2, 14, 3, -16, -19, -33, -42, -27, -23, -10, 15, 28, + 27, 8, 2, 5, 20, 11, -4, -6, -7, -19, -11, 17, 31, 26, 25, 6, + -24, -25, -6, 11, 14, -3, -13, -25, -39, -33, -23, -17, 7, 19, 26, 19, + 4, 1, 15, 14, -1, -5, -10, -14, -22, 8, 33, 28, 20, 16, -13, -26, + -17, 9, 22, 5, -8, -18, -37, -35, -28, -23, -4, 12, 16, 28, 12, 1, + 12, 18, 3, -2, -9, -10, -27, -10, 29, 34, 18, 16, 2, -26, -29, -3, + 27, 19, -4, -10, -29, -36, -30, -29, -12, 9, 3, 18, 21, 7, 12, 17, + 3, -2, -7, -7, -19, -26, 15, 36, 21, 12, 9, -15, -30, -18, 19, 30, + 6, -5, -21, -32, -25, -29, -22, 6, 0, 3, 20, 14, 12, 18, 12, 0, + -9, -12, -9, -26, -4, 31, 28, 11, 10, -6, -24, -29, 3, 35, 19, -3, + -15, -26, -19, -23, -31, -6, 4, -7, 13, 19, 17, 20, 18, 9, -9, -19, + -5, -17, -20, 16, 34, 18, 9, 0, -16, -25, -10, 30, 29, 3, -10, -19, + -19, -16, -29, -19, 3, -9, -5, 13, 21, 24, 16, 13, 1, -23, -14, -12, + -19, -2, 28, 21, 8, 1, -11, -23, -19, 16, 41, 14, -8, -13, -9, -13, + -18, -27, -4, -5, -12, -1, 19, 31, 18, 10, 16, -20, -22, -13, -14, -12, + 18, 26, 12, 4, -4, -17, -18, -1, 38, 31, -5, -14, -7, -7, -14, -24, + -13, -3, -13, -12, 7, 30, 34, 14, 18, -5, -33, -18, -10, -14, 1, 19, + 14, 6, -8, -13, -15, -2, 19, 40, 8, -13, -9, -4, -8, -18, -20, -9, + -14, -16, -7, 22, 37, 23, 16, 10, -26, -28, -13, -9, -5, 14, 14, 9, + -9, -17, -13, -1, 8, 31, 26, -6, -10, -4, -2, -12, -19, -11, -11, -17, + -12, 6, 34, 29, 15, 16, -7, -35, -25, -9, -6, 8, 14, 12, 1, -15, + -14, 3, 10, 19, 29, 8, -10, -9, 1, -7, -20, -10, -9, -17, -17, -1, + 30, 35, 18, 15, 5, -28, -33, -17, -6, -4, 8, 13, 5, -14, -19, 1, + 14, 14, 20, 17, 0, -8, -2, -3, -14, -18, -9, -12, -18, -6, 21, 37, + 26, 7, 10, -13, -33, -24, -6, -2, 0, 9, 11, -5, -19, -7, 16, 18, + 13, 18, 11, -2, -6, -3, -6, -22, -10, -11, -16, -11, 17, 34, 32, 9, + 9, 2, -26, -30, -14, -2, -5, 3, 8, 3, -16, -12, 8, 21, 13, 13, + 15, 2, -3, -5, -5, -20, -16, -8, -16, -20, 6, 32, 34, 14, -4, 6, + -12, -26, -20, -7, -6, -4, 4, 7, -2, -15, 1, 17, 15, 9, 15, 10, + 0, -3, -7, -15, -22, -4, -7, -19, -7, 29, 36, 20, -6, -1, 0, -17, + -19, -12, -9, -7, -1, 2, 6, -3, -8, 10, 18, 9, 8, 21, 4, -2, + -8, -13, -20, -12, -2, -16, -14, 14, 39, 26, -3, -17, 1, -6, -16, -12, + -7, -9, -9, 0, 3, 11, -3, 0, 15, 13, 3, 19, 12, -8, -6, -14, + -19, -16, 0, -6, -17, 3, 33, 35, 5, -18, -9, 1, -15, -11, -8, -8, + -16, -8, 1, 15, 15, 3, 11, 19, 2, 12, 26, 0, -10, -13, -21, -11, + 1, -1, -18, -2, 23, 35, 17, -12, -21, -2, -8, -9, -8, -9, -12, -17, + -5, 10, 22, 8, 7, 18, 7, -1, 23, 13, -13, -19, -23, -14, 5, 2, + -15, -13, 17, 30, 22, -3, -24, -7, -2, -9, -6, -10, -8, -21, -19, 5, + 22, 22, 13, 15, 13, -3, 11, 18, -4, -20, -28, -20, 4, 11, -10, -18, + 6, 26, 17, 3, -20, -12, -2, -11, -7, -8, -8, -16, -27, -7, 19, 30, + 21, 19, 15, 4, 3, 18, 2, -17, -33, -24, 0, 17, 1, -16, -6, 24, + 19, 5, -17, -18, 1, -8, -12, -7, -11, -10, -22, -14, 10, 29, 29, 32, + 23, 13, 0, 9, 6, -12, -28, -36, -7, 13, 12, -8, -17, 12, 24, 6, + -10, -20, 1, 1, -13, -9, -12, -16, -20, -17, 0, 21, 27, 31, 35, 20, + 7, 0, 2, -13, -19, -37, -19, 8, 18, 9, -16, -9, 20, 11, -2, -25, + -13, 8, -4, -16, -13, -18, -23, -17, 0, 14, 29, 27, 43, 35, 17, -1, + -4, -13, -22, -29, -31, -2, 17, 20, -5, -21, 6, 16, 5, -16, -25, 4, + 11, -12, -17, -20, -27, -19, -2, 13, 26, 27, 36, 46, 32, 7, -8, -18, + -26, -25, -32, -16, 12, 26, 11, -18, -11, 4, 13, -1, -27, -12, 14, 2, + -21, -23, -31, -26, -11, 10, 24, 30, 29, 43, 50, 24, -4, -16, -34, -28, + -28, -27, -1, 27, 24, -5, -21, -12, 6, 16, -13, -28, 1, 13, -9, -23, + -33, -32, -18, 2, 24, 34, 33, 34, 50, 49, 12, -11, -34, -37, -28, -25, + -14, 14, 28, 10, -10, -25, -9, 21, 15, -27, -15, 12, 2, -18, -33, -36, + -24, -7, 13, 30, 39, 42, 35, 54, 36, 1, -29, -45, -35, -26, -17, -1, + 20, 19, 2, -23, -30, 1, 30, -5, -32, 1, 7, -8, -27, -37, -25, -12, + -1, 23, 37, 51, 38, 41, 49, 16, -15, -41, -40, -31, -21, -11, 4, 19, + 15, -8, -33, -19, 22, 20, -21, -13, 2, -6, -17, -36, -32, -11, -8, 9, + 28, 48, 54, 36, 48, 30, 3, -30, -41, -34, -24, -15, -6, 2, 17, 8, + -19, -37, 0, 31, 3, -20, -6, -4, -7, -31, -35, -9, -3, -4, 16, 37, + 62, 44, 41, 33, 13, -11, -36, -39, -29, -21, -11, -11, 6, 14, -2, -28, + -24, 15, 22, -5, -10, -11, -10, -20, -35, -13, 2, -5, 2, 21, 55, 64, + 46, 37, 19, 2, -23, -36, -28, -23, -17, -18, -17, 10, 11, -12, -32, -7, + 23, 16, -7, -14, -17, -8, -27, -23, 1, 1, 0, 6, 31, 63, 60, 46, + 21, 7, -12, -29, -24, -18, -24, -23, -27, -11, 11, 5, -16, -19, 11, 21, + 4, -9, -21, -15, -17, -30, -5, 7, 2, -1, 9, 48, 65, 59, 30, 13, + -4, -25, -19, -6, -22, -33, -32, -31, -3, 7, -3, -20, -4, 14, 11, -1, + -11, -19, -13, -20, -16, 9, 7, 2, -3, 27, 60, 69, 44, 12, 7, -18, + -20, 1, -4, -35, -38, -34, -22, -9, 4, -2, -11, 8, 8, 2, -6, -19, + -23, -14, -16, 3, 13, 2, 2, 12, 47, 65, 62, 22, 10, -3, -21, -9, + 9, -17, -46, -40, -34, -23, -6, 4, -1, 3, 7, 2, -4, -13, -25, -18, + -11, -4, 18, 3, -2, 5, 30, 58, 66, 39, 12, 9, -10, -18, 8, 5, + -41, -49, -38, -33, -18, -4, 2, 7, 8, 2, -7, -12, -18, -23, -12, -6, + 18, 15, -8, 0, 21, 44, 62, 48, 22, 14, 7, -16, -7, 18, -18, -52, + -44, -42, -32, -18, -1, 12, 10, 6, -8, -20, -11, -18, -19, -10, 14, 24, + 2, -5, 14, 34, 57, 51, 27, 19, 20, -1, -13, 15, -1, -42, -45, -49, + -38, -28, -15, 13, 19, 10, -1, -23, -16, -11, -24, -10, 6, 21, 14, -5, + 3, 24, 48, 58, 29, 17, 24, 18, -6, 4, 8, -28, -38, -46, -50, -36, + -29, 3, 22, 15, 4, -18, -31, -7, -20, -17, 5, 11, 18, 4, -2, 15, + 37, 58, 35, 11, 26, 31, 11, -2, 6, -13, -32, -39, -55, -45, -38, -17, + 21, 23, 11, -10, -31, -18, -11, -25, 1, 9, 14, 15, 0, 7, 26, 49, + 49, 13, 10, 33, 26, 8, 4, -5, -25, -35, -46, -53, -41, -35, 5, 24, + 17, 0, -25, -26, -14, -24, -9, 6, 5, 17, 6, 6, 20, 38, 55, 30, + 3, 25, 38, 18, 10, -4, -16, -30, -42, -51, -46, -41, -16, 21, 23, 14, + -16, -30, -16, -17, -17, 0, 2, 12, 16, 3, 17, 28, 46, 49, 14, 13, + 39, 30, 17, 4, -9, -20, -38, -49, -50, -50, -34, 4, 21, 20, 4, -29, + -23, -15, -15, -8, -3, 7, 19, 8, 9, 26, 35, 47, 29, 6, 29, 35, + 26, 13, -5, -18, -29, -42, -49, -51, -50, -16, 11, 23, 18, -17, -34, -14, + -15, -9, -10, -2, 17, 14, 5, 21, 33, 44, 38, 14, 23, 37, 30, 20, + 6, -8, -26, -34, -47, -52, -54, -34, 0, 16, 19, 5, -29, -20, -13, -10, + -9, -10, 4, 19, 11, 13, 29, 37, 36, 22, 22, 39, 32, 23, 10, 2, + -18, -32, -40, -54, -56, -49, -23, 8, 17, 11, -15, -26, -11, -13, -9, -15, + -11, 14, 17, 10, 23, 34, 36, 24, 21, 35, 42, 26, 12, 2, -4, -23, + -31, -47, -57, -50, -33, -7, 17, 11, -2, -18, -12, -12, -11, -10, -21, -6, + 18, 19, 21, 33, 35, 28, 23, 34, 51, 40, 12, -2, 1, -9, -27, -43, + -59, -53, -39, -23, 4, 15, 1, -10, -14, -9, -8, -10, -22, -18, 5, 19, + 16, 27, 34, 28, 23, 27, 47, 53, 27, -3, -4, -1, -13, -33, -53, -57, + -45, -31, -13, 14, 4, -4, -11, -9, -9, -11, -19, -28, -16, 10, 24, 23, + 35, 24, 26, 26, 38, 60, 44, 2, -13, -3, -5, -19, -44, -58, -49, -33, + -26, 1, 14, 1, -4, -5, 0, -7, -14, -29, -26, -11, 20, 27, 30, 32, + 21, 27, 34, 59, 58, 22, -11, -10, -6, -10, -29, -55, -53, -38, -34, -16, + 12, 9, -5, -8, 5, 1, -16, -31, -32, -28, 0, 26, 26, 33, 23, 24, + 33, 49, 61, 37, 3, -15, -8, -11, -19, -43, -56, -44, -34, -25, -2, 17, + 5, -11, 2, 12, -2, -23, -32, -35, -23, 14, 26, 27, 35, 23, 32, 45, + 58, 47, 19, -5, -9, -10, -16, -27, -46, -48, -41, -34, -18, 11, 20, -6, + -10, 12, 9, -18, -34, -38, -29, -7, 17, 27, 32, 30, 30, 46, 52, 51, + 28, 6, -8, -9, -15, -24, -32, -41, -45, -40, -30, -1, 23, 10, -12, 2, + 17, -2, -31, -39, -32, -18, -6, 18, 29, 38, 32, 45, 54, 54, 33, 11, + 2, -9, -11, -19, -32, -33, -41, -45, -40, -18, 16, 19, 2, -6, 13, 12, + -20, -43, -35, -21, -18, -5, 21, 35, 36, 46, 58, 52, 38, 17, 9, -5, + -9, -13, -29, -32, -28, -41, -43, -36, 0, 22, 18, -4, -3, 17, 2, -33, + -43, -25, -18, -16, 4, 27, 38, 47, 64, 57, 40, 18, 10, 5, -7, -10, + -22, -39, -24, -30, -42, -39, -22, 13, 28, 14, -9, 3, 17, -16, -51, -36, + -17, -23, -18, 8, 35, 50, 66, 68, 43, 23, 12, 13, -1, -11, -17, -32, + -27, -22, -40, -38, -37, -10, 22, 34, 1, -10, 8, 6, -39, -48, -27, -19, + -25, -10, 18, 49, 66, 78, 54, 26, 17, 16, 3, -7, -15, -25, -29, -12, + -32, -37, -35, -28, 3, 38, 26, -7, -4, 11, -15, -46, -42, -26, -23, -24, + -2, 34, 66, 81, 70, 30, 19, 21, 10, -5, -11, -25, -29, -12, -20, -37, + -33, -39, -17, 25, 46, 6, -11, 2, 0, -29, -44, -41, -30, -27, -17, 12, + 58, 79, 84, 46, 19, 22, 19, 2, -7, -26, -35, -12, -1, -29, -33, -39, + -36, 3, 46, 31, -11, -6, -1, -14, -38, -46, -39, -32, -22, -5, 40, 76, + 88, 64, 23, 22, 30, 12, -8, -20, -39, -22, 0, -13, -29, -33, -43, -20, + 24, 49, 13, -12, 2, -6, -26, -45, -45, -39, -32, -15, 19, 68, 85, 77, + 32, 22, 35, 27, 0, -18, -36, -38, -6, 3, -17, -29, -44, -37, -2, 40, + 34, -8, -6, 3, -18, -44, -47, -44, -43, -21, 3, 49, 76, 80, 53, 21, + 35, 39, 15, -18, -35, -42, -23, 2, -3, -19, -33, -42, -23, 16, 46, 16, + -8, 2, -6, -37, -45, -47, -51, -33, -8, 31, 68, 74, 66, 33, 35, 45, + 36, -3, -33, -40, -34, -7, 5, -8, -18, -35, -39, -13, 32, 32, 3, -1, + 5, -26, -46, -50, -52, -44, -20, 15, 59, 68, 69, 50, 32, 42, 48, 21, + -26, -42, -42, -24, 2, 2, -8, -20, -38, -35, 6, 33, 17, -2, 5, -6, + -41, -55, -57, -46, -33, -6, 40, 64, 62, 63, 45, 38, 54, 40, -4, -42, + -50, -40, -11, 6, -2, -8, -24, -41, -19, 17, 28, 10, 0, 1, -26, -52, + -64, -51, -40, -23, 19, 54, 56, 61, 60, 38, 52, 55, 24, -30, -50, -47, + -27, 4, 8, -6, -11, -30, -36, -6, 19, 25, 4, 1, -9, -38, -64, -61, + -42, -36, 0, 44, 55, 51, 66, 50, 49, 62, 46, -5, -48, -51, -40, -11, + 11, 4, -14, -15, -36, -25, 1, 19, 15, -1, -2, -18, -53, -69, -48, -42, + -20, 21, 51, 45, 56, 62, 51, 60, 59, 23, -32, -53, -49, -28, 5, 17, + -12, -18, -22, -32, -12, 9, 20, 1, -6, -5, -29, -70, -62, -48, -32, 2, + 36, 45, 44, 62, 62, 60, 64, 47, -10, -45, -54, -42, -11, 21, 5, -19, + -18, -23, -20, -1, 15, 4, -6, -2, -6, -51, -72, -57, -44, -13, 19, 40, + 41, 51, 65, 66, 69, 63, 14, -32, -47, -50, -30, 10, 14, -12, -16, -18, + -16, -14, 7, 8, -6, -8, -1, -21, -65, -67, -54, -29, 1, 26, 38, 44, + 53, 69, 77, 73, 37, -17, -41, -46, -37, -10, 13, -1, -11, -14, -14, -10, + -6, 9, -5, -6, -11, -3, -43, -67, -68, -42, -15, 12, 27, 40, 47, 65, + 80, 83, 55, 7, -34, -43, -34, -22, -5, 2, -3, -2, -13, -10, -11, 3, + -2, -4, -13, -5, -15, -51, -72, -63, -31, -3, 16, 29, 42, 55, 78, 91, + 68, 25, -11, -40, -32, -22, -21, -9, -1, 8, -1, -19, -11, -3, 1, -5, + -11, -12, -3, -29, -58, -70, -48, -18, 6, 15, 35, 50, 68, 89, 84, 37, + 11, -27, -38, -19, -20, -23, -8, 10, 18, -10, -19, -8, 4, 0, -11, -14, + -7, -20, -42, -63, -60, -37, -4, 7, 23, 41, 67, 82, 90, 53, 19, -4, + -34, -23, -20, -31, -22, 5, 25, 8, -17, -20, 0, 10, -5, -20, -9, -12, + -31, -47, -60, -53, -26, -3, 12, 32, 58, 81, 85, 70, 27, 9, -19, -26, + -19, -28, -31, -8, 24, 21, -2, -26, -11, 14, 10, -20, -18, -8, -24, -33, + -53, -56, -44, -23, 3, 22, 44, 77, 85, 74, 40, 17, -3, -21, -21, -24, + -36, -25, 11, 22, 15, -13, -28, 5, 23, 0, -28, -12, -19, -26, -42, -56, + -48, -39, -17, 12, 34, 62, 84, 73, 52, 26, 9, -12, -21, -22, -31, -30, + -1, 15, 16, 6, -25, -14, 23, 19, -17, -21, -13, -24, -34, -54, -44, -39, + -36, -9, 27, 46, 79, 79, 59, 38, 16, -2, -17, -25, -25, -27, -10, 5, + 10, 15, -4, -24, 5, 29, 5, -24, -18, -19, -28, -48, -50, -35, -38, -28, + 10, 33, 62, 82, 62, 46, 27, 4, -8, -23, -24, -25, -15, -3, 0, 8, + 6, -12, -9, 22, 25, -6, -21, -22, -28, -45, -53, -39, -30, -37, -11, 20, + 43, 75, 66, 53, 41, 10, -8, -16, -25, -23, -15, -2, -4, -5, 4, 1, + -7, 8, 29, 19, -9, -21, -24, -42, -55, -48, -30, -31, -19, 5, 23, 61, + 74, 58, 53, 26, -7, -11, -18, -25, -14, 0, 1, -16, -8, 4, 0, 3, + 20, 28, 11, -16, -19, -38, -58, -55, -35, -27, -16, -1, 5, 32, 63, 61, + 56, 44, 3, -17, -13, -22, -19, -4, 5, -8, -21, -6, 7, 8, 12, 25, + 25, 2, -17, -26, -54, -64, -47, -32, -11, 5, 3, 16, 40, 60, 58, 56, + 26, -16, -19, -16, -20, -8, 0, -4, -20, -22, 1, 12, 9, 17, 30, 20, + -2, -15, -42, -68, -57, -44, -19, 11, 6, 10, 19, 42, 58, 58, 45, 6, + -23, -18, -13, -13, -3, -3, -10, -26, -14, 9, 15, 12, 26, 27, 10, -7, + -25, -61, -68, -54, -36, 10, 15, 13, 16, 19, 42, 55, 52, 31, -9, -25, + -18, -15, -7, -3, -9, -23, -26, -2, 15, 19, 19, 26, 18, 7, -10, -41, + -72, -60, -51, -8, 25, 22, 20, 13, 19, 45, 51, 44, 19, -15, -28, -15, + -7, -4, -9, -19, -28, -14, 6, 18, 18, 24, 22, 12, 1, -17, -55, -67, + -56, -35, 19, 33, 30, 20, 9, 23, 44, 48, 39, 6, -22, -25, -9, -8, + -9, -15, -29, -21, -3, 10, 16, 20, 23, 13, 7, -4, -31, -63, -61, -50, + -11, 33, 37, 30, 12, 7, 24, 44, 48, 28, -4, -28, -14, -4, -14, -14, + -27, -27, -8, 5, 13, 15, 19, 19, 11, 3, -12, -44, -64, -58, -31, 17, + 40, 39, 24, 8, 3, 30, 46, 42, 16, -18, -21, -6, -16, -18, -26, -32, + -15, 1, 6, 10, 10, 15, 12, 10, -3, -23, -51, -63, -50, -4, 34, 41, + 33, 17, -4, 10, 35, 42, 32, 5, -15, -8, -10, -18, -21, -30, -22, 0, + 3, -2, -2, 6, 5, 4, 3, -7, -25, -45, -45, -18, 25, 33, 32, 21, + 7, 8, 20, 30, 31, 20, 3, -7, -10, -14, -17, -23, -29, -12, 6, -2, + -11, -11, -4, 2, 3, -7, -10, -27, -33, -21, 13, 27, 23, 19, 8, 15, + 17, 18, 21, 23, 19, 2, -12, -10, -9, -15, -27, -28, -2, 9, -8, -18, + -17, -4, 9, -6, -7, -10, -17, -13, 2, 21, 20, 14, 4, 15, 25, 15, + 11, 14, 19, 13, -13, -17, -6, -5, -20, -36, -23, 4, 6, -18, -28, -20, + 6, 6, 0, 3, 5, 5, 28, 31, 31, 49, 55, 35, 11, 27, 26, 4, + 7, 11, 31, 54, 38, 26, 34, 35, 20, -10, -32, -43, -47, -43, -20, -7, + -37, -55, -62, -61, -63, -34, -21, -35, -28, -10, 15, 24, 23, 5, -31, -38, + -6, 23, 19, 15, 24, 20, 31, 57, 54, 28, 13, 33, 20, 1, 4, 17, + 38, 44, 33, 31, 43, 36, 10, -14, -34, -53, -53, -46, -22, -22, -38, -46, + -54, -60, -58, -29, -25, -39, -29, -12, 11, 25, 27, 6, -31, -33, -3, 27, + 32, 21, 13, 16, 38, 60, 53, 26, 18, 28, 11, -2, 8, 26, 37, 34, + 36, 42, 47, 31, 6, -14, -41, -61, -54, -49, -26, -30, -41, -40, -44, -54, + -48, -23, -28, -41, -33, -7, 14, 26, 29, 3, -32, -27, 6, 33, 35, 18, + 5, 21, 45, 61, 49, 25, 30, 22, 0, -5, 9, 37, 39, 27, 33, 47, + 50, 31, 1, -22, -51, -65, -59, -45, -31, -40, -36, -29, -35, -49, -41, -28, + -39, -44, -26, -8, 6, 27, 31, -5, -31, -18, 14, 33, 31, 17, 4, 25, + 48, 57, 45, 32, 27, 9, -6, -5, 14, 43, 36, 29, 39, 51, 50, 31, + 0, -32, -65, -73, -62, -37, -36, -46, -36, -23, -26, -37, -32, -35, -46, -42, + -22, -11, 2, 30, 28, -8, -29, -12, 22, 33, 32, 15, 4, 25, 49, 58, + 50, 36, 20, 2, -9, -3, 21, 43, 37, 32, 44, 55, 53, 33, -7, -42, + -67, -72, -64, -43, -43, -46, -35, -17, -17, -24, -31, -40, -47, -39, -18, -15, + 0, 33, 22, -14, -22, 5, 29, 29, 28, 11, 7, 23, 49, 54, 50, 37, + 13, -6, -11, -6, 25, 44, 38, 26, 40, 57, 54, 28, -12, -48, -70, -73, + -66, -43, -43, -43, -29, -12, -15, -16, -32, -48, -51, -38, -24, -19, 4, 31, + 12, -16, -14, 21, 34, 24, 24, 13, 10, 27, 49, 53, 53, 33, 6, -9, + -16, -4, 33, 48, 37, 24, 45, 61, 54, 23, -15, -60, -76, -76, -60, -48, + -45, -38, -26, -11, -3, -5, -33, -49, -52, -35, -25, -21, 7, 24, 1, -15, + -1, 34, 30, 23, 29, 17, 5, 26, 49, 55, 53, 26, -3, -16, -16, 4, + 38, 43, 33, 33, 49, 59, 45, 19, -18, -63, -78, -79, -58, -50, -39, -31, + -21, -11, -2, -3, -30, -49, -51, -35, -29, -20, 8, 12, -10, -11, 17, 37, + 27, 29, 29, 13, 2, 33, 56, 55, 38, 18, -7, -19, -17, 13, 40, 42, + 33, 35, 52, 58, 40, 10, -28, -68, -84, -78, -56, -47, -36, -30, -17, -7, + 5, -4, -30, -49, -51, -34, -30, -18, 10, 1, -18, -9, 30, 39, 26, 32, + 28, 9, 7, 38, 51, 45, 35, 16, -13, -28, -11, 27, 41, 41, 34, 45, + 58, 54, 29, 7, -33, -69, -80, -78, -59, -43, -31, -24, -15, -3, 9, -4, + -29, -51, -51, -33, -27, -8, 8, -13, -24, -1, 40, 41, 29, 31, 22, 7, + 15, 46, 48, 38, 33, 11, -19, -28, -7, 26, 42, 36, 39, 54, 54, 48, + 20, 3, -39, -68, -79, -78, -54, -37, -32, -27, -16, 5, 11, -6, -31, -50, + -49, -33, -24, -3, -3, -29, -26, 13, 44, 36, 30, 32, 17, 7, 28, 43, + 37, 31, 28, 4, -17, -27, -5, 24, 46, 43, 48, 56, 50, 41, 20, -1, + -47, -64, -82, -78, -48, -35, -34, -26, -14, 6, 9, -10, -31, -46, -43, -33, + -21, 1, -16, -38, -15, 24, 38, 35, 44, 33, 10, 15, 37, 43, 30, 22, + 18, 4, -20, -29, 0, 30, 43, 48, 54, 52, 46, 35, 19, -9, -41, -60, + -83, -73, -44, -29, -37, -27, -12, 6, 8, -10, -28, -45, -43, -25, -9, -3, + -33, -43, -4, 32, 35, 37, 49, 24, 7, 26, 47, 35, 17, 11, 14, 3, + -21, -30, 6, 30, 44, 60, 56, 44, 37, 33, 15, -11, -40, -63, -82, -61, + -36, -33, -39, -26, -13, 0, 4, -9, -29, -42, -37, -18, -7, -13, -39, -34, + 2, 30, 34, 45, 49, 16, 11, 37, 45, 26, 11, 8, 9, -1, -26, -25, + 17, 31, 46, 62, 52, 42, 29, 26, 15, -12, -45, -64, -71, -48, -34, -35, + -33, -27, -16, 1, 2, -10, -23, -41, -32, -12, -6, -29, -46, -28, 12, 26, + 36, 54, 43, 10, 23, 52, 43, 18, -2, 5, 5, -7, -25, -11, 19, 22, + 49, 61, 50, 40, 24, 20, 15, -10, -47, -62, -62, -45, -34, -30, -30, -23, + -16, -6, -1, -8, -25, -38, -29, -9, -10, -39, -42, -19, 5, 23, 48, 57, + 33, 7, 32, 57, 39, 8, -7, 3, -2, -16, -16, 1, 20, 22, 48, 55, + 46, 39, 17, 16, 17, -9, -48, -58, -54, -40, -37, -28, -26, -22, -23, -5, + 2, -11, -28, -37, -27, -10, -18, -44, -35, -18, 3, 31, 54, 52, 25, 13, + 45, 61, 29, -4, -10, 0, -5, -16, -8, 4, 21, 21, 50, 54, 45, 31, + 4, 20, 18, -15, -43, -48, -48, -39, -33, -28, -25, -22, -21, 0, -1, -19, + -29, -29, -22, -11, -29, -42, -30, -17, 3, 38, 61, 46, 24, 25, 53, 58, + 20, -10, -9, -5, -16, -12, 4, 11, 22, 17, 48, 51, 43, 16, 2, 18, + 13, -15, -35, -46, -43, -38, -31, -23, -27, -24, -13, 3, -8, -25, -29, -27, + -22, -18, -36, -38, -31, -19, 6, 46, 60, 36, 24, 33, 56, 44, 10, -8, + -9, -12, -24, -7, 14, 23, 18, 11, 45, 47, 39, 13, 5, 16, 1, -19, + -22, -39, -45, -45, -31, -20, -24, -16, -6, -3, -19, -24, -25, -26, -22, -24, + -39, -35, -25, -13, 8, 54, 64, 36, 29, 41, 56, 36, 5, -12, -11, -14, + -26, -6, 24, 33, 7, 12, 45, 44, 30, 13, 10, 17, -4, -17, -16, -34, + -46, -50, -30, -20, -23, -12, 1, -11, -26, -27, -24, -21, -19, -34, -48, -32, + -23, -10, 13, 66, 65, 33, 32, 48, 55, 25, 0, -8, -1, -18, -36, -4, + 40, 33, -1, 17, 37, 35, 25, 10, 14, 10, -13, -15, -9, -26, -46, -51, + -32, -18, -15, -4, 3, -17, -31, -28, -25, -20, -26, -48, -48, -27, -20, -13, + 19, 71, 61, 28, 33, 56, 50, 12, -8, -2, 5, -24, -41, 2, 52, 29, + -1, 24, 36, 26, 16, 14, 19, 6, -19, -12, 1, -21, -49, -50, -28, -12, + -3, 2, -2, -25, -32, -29, -24, -14, -31, -61, -44, -17, -15, -9, 28, 72, + 61, 25, 38, 61, 41, 7, -7, 4, 3, -32, -36, 9, 45, 21, 4, 30, + 33, 15, 11, 18, 17, -1, -18, -7, -4, -22, -47, -45, -24, -6, 2, 5, + -7, -27, -34, -28, -21, -14, -42, -69, -40, -11, -16, -3, 41, 68, 53, 29, + 48, 61, 32, 0, -5, 8, 2, -33, -28, 9, 31, 16, 16, 34, 22, 0, + 10, 24, 10, -9, -19, -6, -8, -26, -38, -34, -20, -10, 1, 11, -9, -33, + -31, -32, -25, -18, -50, -65, -40, -15, -8, 13, 47, 65, 50, 33, 54, 62, + 24, -2, 2, 12, -6, -31, -20, 12, 21, 10, 28, 34, 9, -5, 20, 20, + -2, -13, -10, -4, -18, -33, -26, -16, -19, -14, 6, 8, -14, -31, -32, -29, + -29, -31, -51, -69, -47, -12, 2, 21, 49, 56, 43, 45, 62, 54, 16, -2, + 7, 9, -13, -22, -4, 12, 7, 13, 37, 33, 7, -4, 23, 9, -8, -8, + -2, -8, -33, -38, -7, -1, -22, -19, 11, 7, -21, -29, -29, -29, -31, -32, + -55, -80, -49, -7, 16, 31, 43, 45, 44, 56, 66, 45, 12, 2, 10, 3, + -18, -13, 7, 9, -2, 17, 38, 22, 1, 5, 17, 4, -14, -12, -1, -11, + -43, -38, 6, 5, -22, -15, 12, 0, -23, -26, -28, -31, -32, -36, -60, -82, + -46, 3, 24, 35, 38, 41, 46, 59, 62, 41, 13, -1, 3, -6, -18, 3, + 22, 2, -9, 20, 36, 18, 10, 7, 4, -5, -17, -9, -2, -18, -55, -30, + 17, 6, -20, -10, 6, -5, -16, -26, -32, -27, -30, -42, -69, -84, -41, 13, + 31, 42, 37, 38, 45, 63, 65, 41, 12, 3, 1, -18, -10, 23, 27, -2, + -12, 17, 36, 26, 13, 4, -2, -5, -14, -14, -11, -26, -54, -19, 21, 8, + -16, -8, 6, -7, -20, -30, -33, -24, -33, -50, -74, -82, -32, 18, 34, 42, + 38, 34, 50, 69, 58, 34, 16, 7, -9, -29, -2, 41, 32, -7, -15, 11, + 34, 30, 9, 2, -3, -7, -23, -21, -15, -30, -52, -10, 18, 10, -8, -4, + 5, -4, -25, -33, -26, -22, -42, -59, -79, -72, -20, 23, 36, 41, 37, 34, + 54, 74, 53, 22, 17, 15, -17, -34, 10, 52, 37, -8, -11, 12, 33, 23, + 8, 4, -1, -16, -31, -25, -18, -38, -49, -3, 19, 11, -4, 0, 7, -8, + -34, -31, -19, -26, -52, -62, -79, -55, -7, 23, 41, 47, 41, 33, 61, 75, + 43, 22, 21, 13, -26, -33, 17, 58, 39, -6, -8, 13, 27, 10, 5, 13, + -2, -32, -43, -32, -19, -38, -36, -3, 12, 4, 4, 13, 6, -22, -41, -31, + -13, -33, -59, -71, -76, -35, 2, 20, 39, 53, 47, 39, 60, 62, 37, 26, + 22, 5, -33, -29, 26, 64, 40, 0, -5, 12, 21, 8, 16, 10, -13, -39, + -49, -37, -25, -41, -30, -6, 9, 9, 13, 23, 0, -30, -44, -26, -13, -45, + -67, -76, -68, -20, 10, 19, 39, 55, 50, 46, 57, 50, 37, 30, 16, -3, + -34, -22, 34, 65, 40, 13, -2, 6, 19, 12, 21, 5, -23, -49, -52, -38, + -33, -36, -24, -9, 10, 12, 25, 23, -11, -29, -43, -27, -21, -55, -73, -77, + -50, -2, 19, 19, 35, 59, 59, 49, 45, 40, 36, 27, 4, -10, -24, -12, + 31, 59, 44, 22, -5, 4, 19, 20, 12, -4, -27, -52, -50, -45, -39, -24, + -23, -13, 16, 20, 30, 15, -16, -28, -37, -30, -36, -64, -79, -73, -28, 17, + 24, 14, 36, 65, 68, 45, 33, 39, 40, 22, -2, -5, -11, -11, 28, 58, + 57, 20, -13, 0, 27, 23, 1, -15, -35, -58, -55, -52, -39, -20, -22, -9, + 20, 29, 30, 10, -15, -31, -39, -32, -48, -72, -86, -59, -4, 27, 19, 17, + 44, 77, 69, 31, 26, 40, 38, 14, -6, 0, 1, -11, 26, 67, 62, 10, + -18, 6, 31, 20, -5, -22, -44, -66, -61, -50, -31, -17, -24, -7, 24, 34, + 31, 3, -17, -31, -36, -40, -61, -73, -76, -46, 11, 34, 20, 22, 56, 83, + 60, 22, 24, 46, 32, 5, -4, 9, 0, -8, 31, 73, 53, 0, -13, 16, + 28, 14, -15, -31, -51, -74, -64, -43, -25, -22, -25, -1, 30, 37, 20, -2, + -20, -36, -39, -55, -69, -75, -69, -32, 21, 36, 22, 31, 63, 76, 50, 22, + 25, 49, 29, 3, 4, 9, 2, 0, 43, 74, 37, -8, -1, 28, 24, 8, + -22, -42, -65, -80, -60, -31, -25, -31, -24, 8, 41, 37, 10, -3, -22, -40, + -45, -60, -69, -69, -55, -15, 32, 37, 25, 42, 72, 70, 37, 21, 32, 41, + 20, 5, 15, 8, 0, 9, 46, 62, 26, -7, 8, 28, 21, 4, -29, -53, + -79, -82, -57, -25, -27, -32, -21, 14, 48, 35, -1, -7, -24, -44, -52, -70, + -69, -60, -38, 1, 34, 33, 32, 57, 70, 58, 34, 26, 31, 31, 16, 14, + 14, 3, 8, 25, 47, 47, 18, -2, 13, 25, 19, -2, -33, -64, -87, -83, + -53, -24, -29, -32, -17, 21, 46, 27, -4, -12, -30, -51, -61, -73, -60, -46, + -17, 9, 25, 32, 47, 69, 61, 48, 41, 30, 26, 24, 18, 24, 15, 2, + 14, 37, 42, 34, 17, 9, 19, 20, 11, -7, -35, -79, -97, -79, -45, -21, + -29, -33, -12, 26, 43, 27, -3, -15, -43, -58, -66, -69, -52, -37, -2, 16, + 24, 38, 61, 72, 56, 43, 41, 32, 28, 22, 22, 26, 12, 1, 23, 45, + 34, 21, 8, 17, 22, 19, 4, -18, -47, -93, -97, -70, -40, -29, -33, -22, + -5, 24, 44, 19, -6, -23, -53, -60, -74, -63, -41, -20, 10, 18, 19, 40, + 70, 70, 47, 41, 43, 37, 27, 14, 24, 32, 10, 1, 29, 44, 27, 12, + 7, 28, 32, 9, -11, -27, -56, -100, -94, -64, -43, -38, -31, -7, 0, 27, + 41, 11, -7, -35, -60, -62, -75, -54, -29, -5, 17, 22, 14, 46, 80, 72, + 46, 42, 44, 42, 24, 16, 31, 32, 9, 4, 33, 45, 22, 5, 8, 41, + 34, 0, -22, -36, -69, -100, -92, -65, -40, -44, -25, 0, 5, 28, 36, 4, + -12, -50, -64, -64, -68, -46, -19, 2, 25, 28, 19, 44, 72, 67, 46, 45, + 44, 39, 21, 21, 38, 29, 1, 9, 39, 39, 13, -4, 9, 54, 41, -11, + -38, -51, -76, -91, -92, -65, -44, -47, -17, 12, 11, 21, 27, 6, -24, -59, + -65, -67, -61, -40, -17, 8, 31, 26, 20, 49, 74, 65, 45, 48, 47, 36, + 25, 28, 36, 25, 5, 19, 42, 28, 6, -2, 21, 56, 27, -22, -45, -62, + -83, -92, -84, -65, -49, -37, -8, 15, 16, 22, 23, -1, -38, -65, -66, -65, + -51, -35, -15, 20, 42, 26, 25, 51, 70, 60, 45, 52, 47, 25, 25, 39, + 33, 24, 16, 31, 37, 14, 3, 2, 33, 55, 14, -35, -55, -67, -84, -88, + -84, -68, -47, -28, -1, 17, 22, 24, 17, -14, -54, -66, -64, -61, -46, -32, + -10, 26, 45, 24, 29, 52, 66, 57, 49, 56, 41, 16, 29, 46, 31, 22, + 24, 37, 30, 12, -1, 5, 40, 39, 1, -41, -63, -72, -89, -89, -77, -62, + -48, -17, 5, 13, 26, 31, 10, -29, -62, -64, -65, -54, -41, -25, -4, 32, + 52, 29, 32, 55, 61, 55, 56, 57, 35, 17, 33, 40, 28, 27, 37, 36, + 26, 14, -3, 13, 41, 22, -13, -45, -65, -78, -90, -87, -70, -56, -47, -12, + 9, 18, 35, 27, -5, -41, -63, -61, -65, -52, -37, -17, 5, 35, 52, 34, + 38, 55, 58, 53, 60, 54, 31, 21, 33, 34, 30, 35, 40, 32, 29, 15, + -4, 18, 30, 11, -25, -53, -69, -85, -91, -82, -66, -54, -36, -7, 6, 20, + 40, 19, -17, -52, -63, -60, -65, -50, -32, -11, 9, 34, 50, 40, 46, 51, + 56, 60, 60, 50, 28, 23, 33, 33, 31, 40, 43, 38, 38, 13, -6, 13, + 19, -2, -34, -57, -78, -91, -85, -73, -63, -55, -28, -1, 6, 26, 39, 13, + -28, -56, -61, -55, -61, -43, -27, -13, 12, 38, 48, 49, 54, 46, 52, 64, + 64, 48, 27, 22, 28, 33, 36, 44, 42, 39, 44, 15, -3, 10, 6, -19, + -46, -60, -81, -92, -83, -73, -52, -44, -22, -5, 5, 38, 37, -6, -41, -55, + -54, -49, -53, -45, -28, -9, 19, 41, 47, 56, 57, 41, 56, 69, 64, 42, + 26, 23, 27, 36, 39, 44, 39, 48, 53, 12, -4, 2, -8, -33, -61, -72, + -84, -87, -80, -73, -49, -36, -12, -5, 9, 42, 24, -15, -44, -50, -51, -51, + -51, -45, -26, -4, 20, 40, 47, 64, 58, 38, 61, 71, 55, 37, 32, 23, + 30, 34, 39, 50, 43, 58, 53, 9, 4, -3, -27, -49, -71, -79, -79, -79, + -82, -70, -44, -26, -7, -5, 16, 36, 9, -18, -40, -47, -49, -45, -42, -43, + -20, 1, 21, 40, 53, 72, 54, 36, 64, 66, 41, 30, 36, 26, 28, 31, + 44, 57, 48, 62, 45, 13, 3, -14, -47, -65, -77, -87, -78, -71, -75, -68, + -43, -16, -2, -1, 18, 20, -4, -18, -37, -46, -50, -36, -39, -46, -15, 7, + 23, 41, 62, 72, 49, 41, 69, 59, 33, 29, 38, 24, 28, 31, 52, 59, + 49, 61, 45, 21, 2, -31, -64, -73, -78, -89, -79, -71, -77, -62, -36, -8, + 3, 5, 15, 5, -10, -17, -34, -49, -50, -27, -37, -43, -12, 14, 25, 45, + 67, 68, 48, 48, 64, 48, 27, 33, 41, 25, 24, 32, 64, 66, 51, 62, + 41, 21, -7, -43, -77, -81, -83, -87, -74, -71, -77, -54, -29, -1, 7, 13, + 12, -6, -9, -18, -38, -54, -44, -21, -37, -41, -8, 16, 28, 53, 73, 61, + 46, 52, 60, 35, 25, 34, 38, 20, 25, 42, 73, 62, 60, 58, 39, 22, + -19, -54, -85, -88, -95, -88, -65, -69, -73, -47, -22, 3, 14, 15, -5, -14, + -6, -23, -42, -52, -34, -19, -42, -38, 0, 18, 30, 62, 76, 61, 49, 52, + 49, 26, 23, 34, 33, 22, 21, 50, 78, 68, 66, 47, 40, 22, -23, -66, + -95, -102, -97, -74, -61, -77, -68, -36, -12, 9, 15, 13, -18, -14, -5, -31, + -50, -44, -21, -25, -49, -25, 8, 16, 30, 70, 82, 56, 45, 55, 39, 21, + 25, 31, 24, 21, 28, 64, 81, 68, 64, 47, 44, 15, -30, -77, -101, -104, + -96, -71, -66, -76, -53, -22, -9, 6, 22, 10, -22, -15, -13, -38, -48, -32, + -9, -33, -49, -14, 10, 11, 37, 77, 85, 51, 44, 48, 30, 18, 21, 26, + 16, 21, 36, 71, 76, 73, 68, 48, 35, 4, -38, -81, -103, -109, -91, -67, + -71, -69, -40, -15, -12, 3, 23, 7, -23, -17, -24, -41, -45, -24, -11, -46, + -46, -1, 10, 8, 49, 84, 83, 48, 50, 48, 27, 16, 18, 20, 14, 26, + 44, 72, 75, 82, 71, 47, 26, -6, -45, -80, -107, -110, -88, -70, -69, -58, + -28, -9, -12, 2, 23, 2, -21, -19, -35, -38, -33, -13, -17, -50, -35, 8, + 9, 10, 57, 89, 74, 45, 52, 41, 24, 15, 11, 14, 13, 22, 54, 72, + 74, 86, 72, 41, 13, -14, -47, -86, -113, -111, -88, -72, -67, -42, -18, -11, + -11, 2, 18, -2, -17, -27, -44, -37, -28, -12, -26, -49, -22, 9, 3, 21, + 69, 87, 63, 46, 49, 36, 24, 13, 11, 11, 8, 26, 64, 68, 76, 89, + 74, 38, 3, -17, -44, -86, -117, -114, -86, -65, -58, -38, -19, -7, 0, 8, + 9, -5, -20, -37, -45, -29, -19, -15, -36, -39, -10, 6, 4, 33, 79, 81, + 55, 48, 42, 30, 23, 10, 13, 10, 3, 27, 62, 60, 76, 88, 68, 30, + -5, -21, -49, -89, -120, -115, -81, -54, -46, -34, -14, -1, 7, 9, 1, -6, + -18, -45, -52, -29, -16, -17, -35, -36, -12, 5, 11, 47, 81, 72, 53, 51, + 39, 28, 24, 9, 13, 7, 5, 36, 57, 55, 82, 90, 62, 31, -10, -29, + -55, -91, -121, -115, -76, -47, -38, -34, -13, 1, 13, 9, -4, -9, -17, -49, + -56, -26, -9, -12, -33, -40, -17, 12, 25, 57, 71, 62, 52, 50, 35, 22, + 21, 14, 11, -2, 10, 41, 50, 48, 85, 87, 66, 29, -15, -34, -64, -97, + -121, -108, -73, -43, -37, -28, -7, 7, 16, 6, -7, -5, -15, -59, -56, -19, + -4, -14, -37, -42, -10, 21, 38, 66, 63, 57, 52, 49, 28, 22, 28, 16, + 5, -3, 22, 47, 38, 45, 79, 85, 68, 23, -16, -34, -70, -100, -122, -107, + -62, -39, -38, -25, -4, 15, 18, 2, -3, 0, -27, -70, -51, -17, -3, -16, + -44, -40, -1, 27, 45, 67, 57, 54, 48, 39, 17, 18, 28, 17, 3, -3, + 27, 49, 37, 42, 69, 86, 66, 16, -17, -37, -72, -99, -117, -101, -55, -39, + -36, -24, 1, 20, 13, 4, 4, -5, -46, -74, -43, -9, -4, -28, -49, -33, + 6, 33, 63, 68, 54, 53, 49, 33, 18, 21, 24, 15, 7, 9, 33, 42, + 35, 39, 70, 85, 55, 10, -16, -40, -75, -98, -113, -92, -47, -38, -35, -21, + 1, 21, 15, 8, 7, -14, -62, -70, -30, -11, -15, -34, -49, -23, 9, 39, + 64, 58, 51, 56, 42, 20, 16, 19, 16, 16, 4, 13, 40, 46, 33, 31, + 65, 83, 49, 3, -24, -41, -73, -98, -105, -77, -45, -41, -30, -13, 7, 19, + 12, 13, 8, -26, -68, -61, -22, -14, -25, -38, -40, -18, 12, 47, 68, 59, + 49, 51, 42, 19, 17, 17, 12, 13, 5, 18, 41, 47, 26, 26, 67, 78, + 44, -2, -31, -47, -71, -97, -96, -67, -44, -42, -29, -11, 13, 21, 13, 17, + 8, -34, -68, -54, -17, -18, -36, -43, -35, -12, 14, 50, 69, 56, 49, 44, + 35, 16, 13, 17, 13, 13, 6, 27, 46, 50, 24, 28, 66, 64, 28, 0, + -25, -49, -75, -99, -87, -54, -42, -38, -28, -8, 20, 19, 11, 17, 1, -41, + -62, -49, -18, -27, -41, -39, -29, -8, 15, 55, 73, 55, 42, 42, 33, 16, + 12, 12, 9, 6, 14, 40, 52, 48, 21, 31, 60, 50, 23, 0, -32, -60, + -76, -90, -73, -44, -39, -36, -32, 1, 29, 20, 6, 13, -3, -41, -53, -43, + -21, -34, -47, -38, -22, -2, 22, 54, 65, 49, 38, 42, 32, 17, 12, 7, + 6, 3, 21, 48, 53, 42, 24, 39, 53, 38, 15, -3, -38, -65, -76, -85, + -59, -36, -35, -40, -26, 15, 26, 12, 6, 10, -12, -40, -49, -33, -26, -41, + -53, -36, -12, 5, 28, 50, 61, 46, 34, 37, 31, 20, 12, 1, 0, 5, + 32, 53, 56, 41, 23, 39, 48, 35, 13, -10, -44, -72, -81, -79, -50, -27, + -34, -41, -18, 20, 27, 12, 5, 1, -19, -36, -40, -22, -34, -50, -55, -33, + -3, 14, 33, 52, 54, 35, 27, 36, 37, 25, 7, -13, 1, 19, 41, 50, + 50, 38, 32, 43, 41, 32, 6, -17, -46, -69, -79, -75, -43, -20, -34, -38, + -8, 23, 26, 12, 6, -8, -23, -30, -30, -23, -46, -56, -52, -29, 6, 23, + 35, 44, 47, 31, 25, 33, 40, 26, -4, -22, 3, 28, 39, 40, 50, 40, + 28, 34, 37, 28, 0, -22, -50, -70, -81, -72, -34, -22, -36, -33, 2, 24, + 25, 12, 4, -15, -24, -26, -25, -23, -46, -56, -50, -24, 10, 33, 36, 40, + 35, 21, 25, 43, 47, 25, -13, -25, 11, 40, 36, 40, 56, 38, 27, 31, + 33, 24, -4, -24, -53, -71, -80, -59, -34, -27, -31, -27, 8, 24, 25, 17, + 2, -22, -25, -26, -19, -24, -51, -58, -40, -9, 14, 37, 36, 35, 27, 14, + 28, 48, 46, 19, -19, -24, 18, 40, 29, 41, 50, 29, 29, 27, 33, 18, + -12, -29, -53, -71, -75, -48, -33, -32, -25, -14, 13, 24, 19, 17, 2, -25, + -28, -28, -18, -28, -55, -59, -30, -3, 20, 41, 34, 24, 15, 15, 36, 49, + 39, 17, -17, -17, 22, 41, 33, 45, 38, 26, 30, 24, 27, 10, -11, -34, + -58, -70, -66, -38, -32, -36, -21, -2, 14, 28, 19, 14, 0, -25, -29, -28, + -17, -30, -57, -51, -22, 3, 23, 39, 34, 15, 11, 17, 38, 46, 39, 15, + -18, -14, 27, 40, 37, 45, 32, 28, 30, 29, 28, 1, -16, -38, -55, -65, + -62, -37, -31, -34, -17, 9, 18, 27, 18, 9, -1, -22, -35, -29, -17, -32, + -57, -45, -17, 15, 30, 30, 25, 8, 10, 19, 35, 46, 37, 4, -19, -8, + 31, 33, 33, 42, 28, 22, 24, 29, 23, -6, -21, -43, -54, -59, -55, -32, + -34, -39, -10, 19, 30, 25, 9, 2, -2, -20, -38, -30, -23, -41, -51, -35, + -12, 24, 32, 22, 12, 8, 16, 23, 32, 48, 33, 1, -16, 0, 29, 30, + 33, 36, 24, 23, 22, 33, 14, -14, -20, -42, -55, -50, -44, -27, -38, -41, + -3, 31, 35, 23, 5, -2, -4, -15, -34, -33, -38, -47, -40, -26, -3, 31, + 31, 9, 2, 13, 14, 20, 38, 53, 27, -6, -14, 11, 30, 23, 32, 28, + 25, 22, 24, 32, 5, -20, -26, -45, -49, -40, -36, -37, -48, -40, 8, 40, + 37, 16, -3, -6, -2, -9, -27, -42, -52, -48, -32, -21, 8, 39, 28, -2, + -5, 13, 17, 23, 40, 45, 19, -4, -3, 18, 15, 19, 33, 30, 29, 22, + 21, 22, 0, -17, -27, -46, -48, -33, -31, -38, -53, -33, 23, 43, 31, 11, + -7, -5, -3, -8, -26, -49, -59, -48, -25, -14, 15, 41, 23, -8, -6, 11, + 10, 26, 49, 41, 12, 0, 10, 19, 4, 22, 31, 25, 25, 24, 20, 12, + -4, -10, -37, -50, -37, -23, -26, -43, -55, -18, 34, 41, 28, 10, -9, -6, + -3, -8, -27, -57, -62, -37, -15, -8, 24, 44, 23, -10, -6, 3, 8, 39, + 55, 30, 12, 11, 20, 8, 3, 27, 26, 20, 21, 24, 19, -1, -10, -14, + -42, -47, -25, -14, -28, -49, -50, -5, 38, 38, 23, 9, -11, -9, -1, -5, + -33, -64, -59, -34, -14, -2, 32, 49, 17, -11, -6, -2, 11, 46, 46, 19, + 16, 23, 24, -3, 3, 29, 29, 16, 17, 22, 11, -12, -12, -18, -50, -43, + -15, -11, -30, -53, -38, 10, 31, 31, 25, 3, -16, -3, 3, -8, -41, -67, + -53, -24, -14, 3, 35, 46, 17, -2, -7, -9, 16, 49, 41, 20, 22, 34, + 21, -5, 5, 31, 29, 12, 14, 18, 8, -22, -17, -20, -52, -38, -13, -19, + -32, -48, -25, 11, 23, 29, 26, 1, -14, 1, 1, -18, -47, -60, -47, -31, + -11, 13, 45, 39, 8, -2, -2, -11, 16, 43, 35, 25, 34, 40, 18, -7, + 6, 34, 28, 14, 7, 11, 2, -23, -25, -29, -51, -30, -11, -24, -38, -40, + -15, 9, 18, 29, 32, -1, -10, 0, -9, -27, -48, -52, -46, -30, -2, 27, + 47, 30, 10, 7, -6, -15, 12, 35, 28, 30, 45, 42, 19, -4, 11, 29, + 21, 6, 1, 3, -3, -27, -31, -34, -40, -22, -18, -31, -35, -30, -18, 5, + 19, 32, 28, -9, -7, 1, -14, -30, -42, -45, -47, -28, 7, 38, 45, 23, + 14, 20, -2, -24, 7, 32, 30, 37, 43, 41, 22, 7, 18, 22, 14, 4, + -7, 4, -7, -36, -37, -37, -27, -15, -26, -34, -34, -29, -18, 4, 19, 31, + 20, -4, 0, -3, -21, -32, -37, -41, -40, -25, 14, 49, 44, 18, 19, 25, + -1, -19, 5, 26, 35, 38, 46, 41, 18, 18, 16, 13, 12, 2, -5, -3, + -23, -44, -37, -32, -20, -20, -33, -28, -32, -32, -16, 1, 17, 31, 17, -2, + 2, -3, -22, -33, -39, -40, -34, -23, 15, 56, 44, 15, 27, 23, -4, -14, + 2, 22, 38, 37, 48, 40, 25, 24, 15, 11, 2, -2, -3, -15, -31, -40, + -37, -33, -17, -17, -28, -29, -41, -34, -7, 1, 13, 31, 17, -2, 4, 1, + -20, -35, -47, -37, -24, -10, 22, 52, 38, 26, 35, 26, -2, -9, 4, 23, + 40, 38, 46, 39, 32, 31, 16, 2, -7, -8, -2, -21, -38, -44, -38, -31, + -18, -15, -29, -35, -45, -32, -1, -3, 4, 30, 16, 3, 8, 4, -20, -42, + -48, -30, -17, -8, 21, 49, 41, 30, 38, 23, -2, -5, 1, 21, 35, 37, + 44, 40, 40, 33, 17, 1, -13, -10, -9, -35, -41, -41, -39, -33, -19, -12, + -27, -40, -48, -28, -4, -10, 10, 28, 15, 9, 12, 5, -24, -43, -43, -23, + -18, 0, 26, 47, 43, 35, 40, 20, -1, 1, 4, 20, 28, 37, 42, 42, + 46, 31, 22, 8, -17, -15, -15, -42, -41, -37, -44, -37, -16, -13, -33, -41, + -41, -20, -11, -17, 10, 18, 13, 16, 17, 1, -24, -38, -38, -27, -21, 9, + 29, 46, 44, 43, 38, 18, 3, 6, 6, 12, 19, 38, 41, 47, 44, 28, + 29, 11, -26, -25, -27, -45, -39, -39, -48, -41, -18, -13, -33, -38, -36, -21, + -19, -14, 13, 11, 11, 26, 17, -6, -25, -32, -32, -35, -14, 21, 31, 38, + 49, 49, 34, 19, 13, 10, 4, 9, 20, 37, 41, 45, 39, 29, 35, 6, + -28, -28, -35, -43, -37, -42, -50, -44, -20, -20, -37, -37, -27, -16, -23, -11, + 10, 5, 17, 36, 16, -16, -23, -21, -33, -38, -5, 23, 28, 35, 55, 55, + 31, 17, 18, 12, 3, 4, 21, 33, 41, 45, 31, 32, 39, 3, -29, -35, + -41, -40, -38, -45, -55, -45, -26, -31, -36, -26, -22, -22, -29, 1, 9, -1, + 24, 39, 8, -19, -17, -14, -32, -34, 5, 29, 29, 35, 58, 51, 32, 29, + 23, 11, 1, 6, 29, 37, 38, 36, 24, 43, 39, -2, -32, -44, -45, -36, + -36, -45, -55, -51, -37, -35, -30, -22, -20, -32, -24, 6, 2, 3, 30, 36, + 3, -17, -16, -18, -29, -24, 10, 31, 25, 34, 58, 44, 33, 37, 26, 8, + 5, 10, 37, 36, 35, 29, 22, 47, 36, -6, -36, -51, -49, -34, -38, -48, + -58, -53, -46, -42, -24, -23, -22, -32, -13, 4, -7, 8, 35, 30, 6, -14, + -20, -19, -21, -20, 14, 34, 29, 43, 52, 37, 39, 43, 24, 8, 7, 15, + 45, 33, 36, 24, 25, 43, 25, -10, -39, -53, -47, -34, -39, -53, -56, -54, + -56, -42, -21, -23, -29, -25, -5, 1, -10, 12, 35, 27, 7, -14, -25, -19, + -11, -10, 13, 31, 37, 44, 42, 37, 45, 44, 24, 14, 13, 24, 40, 28, + 35, 23, 31, 35, 15, -16, -38, -53, -45, -37, -48, -56, -54, -63, -63, -40, + -23, -24, -27, -19, 3, 1, -11, 14, 33, 24, 5, -16, -28, -17, -6, -1, + 15, 38, 39, 38, 29, 36, 54, 42, 20, 20, 19, 32, 38, 30, 31, 23, + 33, 23, -1, -17, -35, -44, -43, -47, -51, -51, -56, -71, -67, -45, -28, -23, + -23, -13, 12, -1, -15, 15, 33, 20, -2, -22, -25, -17, -3, 10, 24, 46, + 44, 31, 26, 41, 53, 42, 23, 23, 26, 39, 37, 32, 24, 28, 36, 11, + -7, -19, -38, -39, -37, -49, -54, -51, -62, -76, -68, -51, -28, -19, -21, 1, + 22, -3, -11, 14, 25, 16, -5, -25, -25, -15, -2, 20, 36, 51, 42, 19, + 19, 43, 58, 43, 25, 21, 35, 46, 41, 34, 17, 26, 33, 5, -15, -25, + -39, -34, -37, -55, -50, -49, -69, -80, -67, -50, -31, -18, -12, 12, 17, -5, + -5, 14, 17, 6, -15, -27, -22, -14, 3, 37, 49, 48, 40, 22, 22, 36, + 51, 44, 29, 22, 42, 49, 41, 29, 16, 29, 31, -9, -30, -33, -35, -29, + -38, -55, -45, -54, -79, -80, -65, -51, -34, -16, -2, 18, 18, 5, 7, 8, + 6, 3, -19, -21, -22, -19, 12, 51, 53, 48, 39, 22, 18, 36, 46, 42, + 35, 31, 44, 46, 42, 31, 24, 35, 21, -25, -39, -33, -30, -24, -41, -53, + -47, -60, -81, -81, -63, -53, -40, -14, 6, 24, 20, 8, 7, 0, -1, -4, + -21, -23, -29, -16, 30, 60, 55, 50, 37, 19, 19, 35, 43, 46, 37, 29, + 43, 49, 43, 32, 27, 31, 13, -35, -46, -36, -26, -28, -44, -52, -47, -65, + -84, -84, -68, -49, -27, 0, 10, 15, 19, 15, 9, -3, -10, -16, -20, -26, + -28, -2, 41, 59, 62, 56, 37, 16, 15, 31, 43, 50, 42, 30, 41, 49, + 49, 38, 28, 23, 5, -42, -55, -42, -21, -22, -40, -49, -54, -71, -86, -81, + -62, -44, -21, 5, 17, 16, 25, 23, 0, -13, -17, -17, -24, -32, -21, 15, + 45, 58, 66, 52, 33, 15, 9, 35, 42, 44, 44, 36, 38, 50, 52, 40, + 28, 16, -11, -48, -60, -43, -22, -21, -40, -53, -58, -78, -90, -79, -61, -42, + -9, 14, 15, 16, 22, 21, -4, -20, -21, -19, -30, -31, -10, 26, 54, 63, + 69, 51, 33, 12, 13, 40, 42, 45, 42, 33, 36, 53, 57, 44, 24, 3, + -24, -53, -63, -45, -21, -15, -39, -57, -63, -78, -89, -76, -55, -34, 3, 18, + 9, 16, 21, 15, -8, -26, -28, -25, -32, -24, 4, 34, 56, 67, 75, 48, + 22, 7, 23, 44, 39, 40, 40, 35, 40, 59, 59, 44, 18, -6, -31, -54, + -58, -44, -20, -13, -43, -63, -69, -80, -88, -71, -48, -21, 12, 16, 12, 18, + 13, 6, -12, -27, -32, -30, -34, -20, 13, 46, 63, 74, 73, 40, 15, 13, + 39, 46, 33, 32, 35, 36, 48, 58, 61, 43, 16, -13, -36, -57, -62, -41, + -22, -16, -42, -66, -73, -79, -85, -65, -38, -7, 13, 9, 7, 16, 11, -2, + -18, -36, -39, -26, -25, -16, 21, 53, 64, 74, 68, 36, 19, 22, 38, 44, + 32, 28, 32, 38, 52, 60, 56, 43, 13, -25, -39, -54, -52, -35, -30, -27, + -46, -70, -79, -80, -79, -58, -26, 3, 15, 6, 0, 12, 6, -8, -27, -45, + -39, -17, -16, -13, 28, 57, 67, 71, 57, 37, 22, 25, 41, 46, 29, 24, + 34, 44, 56, 55, 52, 44, 7, -27, -38, -48, -44, -35, -31, -29, -46, -77, + -83, -73, -70, -48, -15, 6, 9, 1, 1, 9, -3, -20, -41, -48, -30, -5, + -14, -9, 39, 63, 70, 66, 47, 36, 25, 32, 40, 43, 26, 21, 36, 47, + 59, 50, 49, 35, 0, -26, -36, -44, -41, -36, -35, -33, -50, -79, -79, -66, + -63, -36, -8, 6, -3, -9, 2, 3, -13, -30, -49, -46, -18, -2, -15, 4, + 42, 58, 65, 61, 50, 38, 28, 37, 40, 38, 28, 30, 38, 48, 50, 42, + 46, 28, -3, -28, -37, -36, -36, -39, -36, -37, -59, -79, -69, -62, -52, -24, + -2, 3, -12, -11, 4, -5, -29, -42, -53, -39, -12, -4, -4, 14, 37, 52, + 63, 58, 50, 37, 34, 37, 36, 37, 38, 36, 35, 47, 46, 44, 42, 18, + -7, -30, -34, -32, -34, -41, -37, -45, -66, -74, -64, -57, -36, -12, 1, -8, + -23, -7, 6, -18, -39, -49, -53, -29, -5, -1, 10, 19, 30, 46, 59, 58, + 50, 36, 37, 37, 32, 40, 46, 38, 34, 44, 42, 41, 36, 9, -9, -27, + -29, -26, -34, -40, -40, -56, -69, -66, -56, -46, -22, -7, -7, -19, -21, 3, + 1, -35, -48, -53, -49, -22, -3, 12, 23, 18, 22, 46, 66, 59, 47, 38, + 43, 35, 30, 46, 51, 39, 33, 41, 37, 42, 24, 2, -8, -22, -23, -24, + -33, -39, -50, -66, -69, -59, -49, -31, -13, -10, -17, -25, -16, 1, -17, -50, + -55, -58, -42, -17, -1, 20, 31, 14, 15, 48, 70, 59, 42, 38, 45, 33, + 33, 51, 53, 36, 35, 37, 36, 37, 12, 0, -9, -16, -18, -22, -33, -42, + -59, -67, -62, -52, -40, -20, -11, -15, -23, -23, -11, -3, -28, -51, -59, -61, + -38, -14, 4, 26, 30, 10, 18, 53, 71, 56, 40, 42, 45, 32, 34, 53, + 52, 37, 36, 32, 37, 32, 10, -3, -10, -10, -11, -17, -31, -46, -62, -63, + -54, -44, -30, -14, -14, -23, -27, -22, -11, -11, -35, -51, -65, -59, -32, -11, + 11, 29, 25, 8, 24, 63, 73, 51, 38, 46, 44, 29, 34, 51, 51, 39, + 34, 27, 34, 23, 3, -5, -9, -6, -10, -18, -33, -51, -66, -60, -50, -35, + -20, -10, -21, -33, -29, -17, -9, -20, -39, -55, -71, -57, -26, -7, 11, 23, + 22, 11, 35, 70, 71, 46, 39, 48, 42, 29, 33, 51, 47, 38, 31, 28, + 35, 17, 0, -12, -7, 0, -4, -15, -36, -56, -67, -56, -42, -26, -15, -12, + -29, -36, -28, -15, -13, -25, -40, -58, -70, -49, -23, -6, 8, 19, 17, 18, + 49, 76, 66, 40, 42, 49, 39, 25, 35, 51, 43, 40, 30, 31, 32, 15, + -1, -14, -7, 1, -2, -17, -40, -59, -61, -51, -38, -21, -10, -17, -34, -35, + -28, -18, -17, -24, -40, -64, -65, -40, -18, -8, 5, 13, 17, 31, 61, 75, + 60, 41, 43, 47, 34, 20, 36, 47, 43, 41, 31, 32, 26, 7, -7, -16, + -6, 0, -3, -22, -44, -60, -56, -47, -34, -19, -8, -20, -39, -40, -27, -18, + -20, -29, -44, -63, -56, -38, -23, -11, 4, 14, 21, 42, 65, 71, 59, 45, + 42, 34, 21, 20, 42, 48, 44, 41, 31, 34, 24, 6, -10, -20, -11, 4, + 0, -20, -48, -57, -47, -39, -30, -17, -4, -24, -43, -40, -26, -19, -24, -29, + -45, -59, -51, -37, -25, -14, 3, 15, 27, 51, 72, 76, 61, 44, 38, 23, + 12, 21, 43, 46, 45, 40, 31, 35, 21, 5, -17, -22, -13, 3, 1, -24, + -51, -52, -43, -37, -28, -8, -7, -38, -46, -36, -21, -21, -31, -33, -45, -51, + -47, -40, -30, -13, 4, 14, 33, 60, 76, 76, 61, 47, 30, 16, 8, 20, + 40, 45, 48, 37, 37, 37, 22, 3, -19, -20, -10, 4, -6, -30, -49, -44, + -41, -38, -23, -1, -14, -41, -44, -36, -22, -26, -35, -33, -45, -52, -48, -40, + -32, -9, 6, 18, 35, 65, 85, 80, 62, 46, 24, 6, -1, 23, 41, 48, + 45, 31, 42, 40, 23, -6, -21, -15, -6, 0, -13, -31, -44, -41, -38, -32, + -15, 0, -22, -40, -41, -36, -24, -31, -28, -32, -46, -49, -47, -43, -30, -6, + 9, 19, 46, 77, 87, 77, 61, 42, 18, -2, -7, 22, 39, 51, 41, 32, + 43, 35, 13, -18, -18, -10, -5, -8, -21, -29, -39, -42, -41, -23, -3, -3, + -32, -39, -38, -34, -31, -35, -23, -32, -46, -50, -51, -46, -26, 0, 12, 20, + 54, 87, 91, 72, 60, 38, 13, -10, -11, 24, 44, 52, 43, 39, 45, 34, + 2, -19, -8, -1, -8, -19, -19, -25, -35, -42, -39, -17, 7, -7, -38, -36, + -36, -37, -37, -31, -20, -34, -49, -53, -50, -43, -19, 6, 10, 25, 66, 91, + 84, 67, 60, 36, 1, -18, -10, 27, 48, 52, 42, 42, 38, 25, -3, -18, + -5, -2, -13, -22, -24, -28, -35, -45, -35, -4, 14, -17, -41, -36, -33, -35, + -41, -29, -20, -38, -51, -54, -46, -33, -14, 6, 14, 37, 74, 87, 76, 65, + 64, 29, -9, -22, -7, 23, 52, 55, 46, 42, 25, 17, -5, -12, -4, -3, + -17, -25, -33, -36, -33, -39, -30, 5, 12, -25, -37, -33, -34, -42, -41, -25, + -22, -41, -52, -53, -40, -25, -10, 11, 21, 43, 72, 78, 74, 69, 58, 15, + -13, -15, -4, 22, 54, 58, 53, 41, 15, 6, -2, -1, -3, -6, -18, -24, + -42, -40, -29, -32, -20, 13, 8, -25, -35, -34, -29, -42, -43, -27, -27, -42, + -51, -50, -30, -14, -5, 17, 26, 46, 70, 72, 72, 69, 48, 2, -13, -9, + -3, 19, 55, 59, 53, 30, 1, -1, 5, 8, -7, -15, -19, -25, -48, -45, + -31, -28, -10, 15, 1, -24, -35, -35, -22, -37, -43, -36, -35, -41, -47, -45, + -18, -6, -1, 24, 32, 51, 65, 65, 67, 63, 37, -3, -13, -9, 1, 29, + 54, 60, 50, 18, -4, -4, 13, 9, -10, -15, -17, -30, -54, -47, -29, -20, + -8, 4, -8, -15, -29, -35, -21, -37, -43, -46, -37, -33, -48, -39, -10, 3, + 13, 31, 34, 54, 56, 57, 63, 56, 32, -3, -16, -6, 14, 38, 48, 53, + 40, 11, -3, 1, 6, -2, -11, -9, -11, -28, -54, -54, -29, -8, 2, -8, + -16, -13, -27, -31, -21, -32, -45, -54, -36, -27, -44, -33, 1, 16, 25, 29, + 39, 56, 48, 51, 57, 48, 22, 3, -14, 0, 22, 39, 42, 46, 36, 7, + -7, 0, 0, -3, -8, -8, -15, -34, -50, -49, -27, -3, 0, -15, -14, -16, + -28, -26, -21, -34, -56, -55, -32, -30, -41, -23, 8, 20, 31, 33, 45, 53, + 38, 42, 54, 40, 18, -3, -9, 14, 33, 37, 34, 34, 27, 8, -5, -1, + -9, -3, -1, -8, -19, -35, -43, -42, -28, -7, 1, -18, -13, -17, -29, -24, + -21, -34, -55, -52, -34, -30, -26, -9, 15, 28, 28, 32, 55, 50, 29, 38, + 45, 35, 17, -3, -1, 18, 36, 40, 27, 24, 19, 0, -5, -1, -14, -7, + -2, -12, -20, -30, -40, -42, -25, -5, -5, -24, -14, -16, -25, -20, -26, -38, + -52, -49, -35, -31, -13, 8, 16, 28, 29, 42, 57, 40, 23, 32, 35, 30, + 12, -5, 9, 22, 40, 38, 19, 17, 16, -1, -9, -7, -12, -6, -5, -13, + -18, -29, -39, -39, -18, -3, -19, -26, -11, -18, -24, -19, -30, -40, -51, -45, + -30, -24, 0, 19, 22, 28, 36, 49, 54, 41, 22, 30, 31, 26, 10, 2, + 10, 26, 43, 28, 14, 16, 7, -6, -12, -9, -9, -5, -12, -19, -16, -29, + -35, -34, -8, -8, -35, -20, -7, -26, -23, -23, -30, -39, -53, -38, -25, -12, + 11, 24, 24, 29, 47, 50, 48, 36, 20, 29, 24, 15, 5, 8, 12, 32, + 40, 21, 17, 11, 0, -3, -15, -14, -7, -4, -13, -17, -16, -28, -31, -23, + -6, -20, -37, -15, -12, -29, -22, -28, -30, -38, -54, -34, -20, -4, 21, 33, + 24, 33, 50, 45, 40, 33, 27, 28, 14, 8, 8, 11, 11, 30, 33, 26, + 20, -1, -8, -4, -17, -16, -2, -7, -22, -20, -20, -26, -26, -15, -10, -27, + -35, -12, -19, -31, -21, -23, -23, -42, -57, -31, -11, 9, 35, 33, 23, 39, + 53, 47, 40, 31, 31, 21, 10, 9, 11, 10, 13, 26, 35, 33, 13, -11, + -10, -4, -19, -22, 3, -2, -28, -26, -16, -21, -24, -12, -12, -31, -34, -17, + -27, -34, -25, -17, -19, -48, -59, -29, -2, 27, 46, 26, 22, 43, 54, 44, + 38, 30, 29, 16, 6, 15, 15, 6, 9, 22, 36, 37, 9, -20, -10, -5, + -21, -21, 2, -5, -29, -31, -18, -11, -17, -11, -15, -32, -34, -23, -30, -30, + -25, -15, -22, -52, -50, -17, 9, 36, 42, 26, 29, 50, 53, 40, 33, 32, + 27, 14, 7, 9, 7, 4, 12, 22, 36, 36, 3, -27, -16, -9, -20, -21, + -1, -12, -31, -27, -13, -12, -18, -12, -17, -33, -39, -29, -34, -35, -23, -7, + -25, -55, -42, -10, 20, 43, 40, 27, 33, 51, 51, 37, 34, 31, 21, 9, + 8, 5, 2, 11, 16, 18, 34, 35, 3, -22, -17, -16, -20, -17, -7, -20, + -32, -28, -14, -12, -10, -8, -17, -34, -41, -35, -34, -31, -19, -8, -27, -48, + -29, -4, 26, 50, 44, 32, 37, 50, 49, 40, 36, 22, 11, 11, 12, 5, + 3, 14, 12, 13, 34, 37, 9, -23, -24, -16, -21, -16, -17, -30, -27, -27, + -20, -10, -10, -9, -18, -39, -46, -42, -35, -31, -14, -9, -33, -42, -19, 1, + 36, 55, 41, 32, 46, 55, 47, 35, 32, 18, 6, 7, 9, -2, 7, 17, + 8, 13, 34, 32, 10, -22, -27, -14, -20, -21, -26, -31, -23, -27, -22, -6, + -5, -11, -21, -39, -46, -46, -37, -30, -14, -12, -33, -31, -8, 6, 41, 55, + 40, 38, 54, 57, 39, 30, 33, 17, 2, 1, 4, 7, 14, 14, -2, 11, + 37, 31, 11, -26, -30, -16, -20, -18, -21, -27, -32, -28, -12, 0, -4, -11, + -23, -40, -46, -43, -33, -26, -16, -15, -29, -19, -1, 13, 44, 58, 41, 49, + 68, 59, 36, 28, 36, 18, -9, -9, 4, 17, 20, 7, -6, 18, 36, 22, + -1, -30, -26, -19, -25, -26, -31, -35, -33, -21, -3, -8, -10, -14, -24, -40, + -45, -43, -35, -20, -18, -20, -22, -12, 0, 15, 48, 58, 41, 58, 77, 57, + 30, 27, 33, 7, -23, -16, 11, 23, 21, 2, -5, 24, 33, 10, -10, -24, + -19, -25, -37, -30, -30, -34, -29, -14, -5, -16, -8, -8, -26, -50, -47, -41, + -30, -16, -25, -24, -14, -6, 3, 23, 50, 51, 49, 69, 81, 56, 29, 33, + 30, -2, -29, -14, 15, 26, 18, 2, -1, 31, 28, 0, -20, -21, -21, -32, + -43, -34, -33, -36, -23, -4, -8, -20, -8, -11, -25, -44, -41, -39, -32, -17, + -30, -22, -4, 1, 6, 31, 48, 47, 63, 80, 82, 52, 31, 38, 23, -13, + -33, -11, 20, 29, 14, -1, 9, 34, 19, -12, -26, -13, -23, -46, -46, -38, + -39, -35, -24, -3, -7, -17, -15, -16, -25, -45, -37, -37, -33, -26, -36, -20, + 5, 3, 4, 32, 42, 50, 76, 83, 75, 49, 34, 36, 17, -24, -33, -12, + 23, 32, 10, 1, 23, 30, 7, -17, -22, -8, -27, -49, -50, -42, -38, -28, + -18, -3, -8, -13, -14, -15, -24, -43, -35, -33, -29, -27, -34, -15, 16, 8, + 5, 32, 43, 62, 84, 84, 73, 53, 40, 30, 6, -26, -34, -15, 25, 28, + 8, 9, 38, 27, -4, -26, -21, -12, -33, -54, -47, -48, -38, -21, -14, -2, + -3, -11, -25, -18, -26, -32, -34, -34, -29, -31, -35, -10, 18, 11, 7, 33, + 47, 68, 83, 81, 71, 58, 42, 20, -5, -25, -36, -15, 23, 23, 7, 20, + 40, 21, -14, -35, -21, -16, -40, -58, -52, -52, -31, -11, -9, -6, -1, -15, + -26, -15, -29, -31, -36, -31, -29, -36, -32, -4, 17, 8, 15, 36, 48, 66, + 77, 83, 77, 59, 38, 9, -11, -20, -34, -12, 22, 20, 14, 33, 39, 16, + -22, -36, -23, -21, -40, -56, -52, -47, -24, -10, -4, 3, 1, -17, -22, -18, + -28, -26, -32, -30, -32, -30, -22, 1, 15, 15, 27, 42, 52, 62, 75, 85, + 80, 59, 35, 1, -16, -20, -35, -12, 18, 17, 18, 40, 34, 5, -34, -38, + -27, -28, -42, -60, -58, -48, -18, -4, 0, 3, -4, -18, -20, -22, -35, -29, + -27, -34, -42, -28, -12, 3, 8, 19, 31, 40, 45, 60, 75, 79, 76, 62, + 37, -2, -20, -22, -31, -11, 13, 15, 31, 43, 27, 0, -28, -33, -36, -37, + -43, -58, -61, -47, -13, 1, 1, 3, -5, -12, -17, -25, -36, -27, -25, -39, + -45, -24, 1, 0, 8, 25, 43, 45, 42, 57, 76, 76, 73, 60, 37, -8, + -25, -22, -25, -6, 9, 21, 41, 41, 15, -6, -18, -33, -48, -40, -38, -57, + -64, -46, -6, 9, -4, 1, -1, -9, -18, -28, -33, -24, -27, -42, -45, -18, + 2, 3, 13, 31, 49, 43, 37, 60, 74, 68, 68, 60, 30, -12, -28, -23, + -19, -8, 5, 26, 48, 37, 11, -12, -17, -37, -54, -40, -41, -58, -65, -42, + 5, 12, -8, 0, 2, -6, -22, -29, -30, -28, -37, -44, -42, -9, 6, 7, + 17, 33, 44, 42, 40, 61, 72, 57, 63, 61, 24, -16, -34, -21, -15, -12, + 3, 31, 47, 28, 7, -10, -15, -43, -51, -38, -45, -61, -61, -31, 10, 8, + -3, 6, 5, -8, -24, -27, -28, -31, -44, -42, -29, -3, 6, 10, 24, 40, + 44, 45, 46, 57, 62, 56, 65, 56, 16, -13, -32, -18, -12, -10, 11, 32, + 39, 25, 6, -10, -19, -48, -44, -38, -49, -63, -61, -19, 12, 3, 4, 6, + 3, -9, -25, -26, -27, -38, -46, -39, -18, 1, 12, 20, 29, 33, 36, 49, + 47, 54, 59, 49, 63, 51, 8, -12, -25, -18, -18, -6, 20, 33, 28, 19, + 4, -9, -27, -43, -41, -45, -55, -64, -51, -13, 7, -3, 0, 7, 3, -12, + -28, -27, -33, -46, -51, -33, -10, -5, 15, 31, 34, 26, 32, 47, 51, 53, + 47, 50, 61, 41, 1, -8, -12, -21, -20, 5, 27, 29, 16, 13, 8, -9, + -28, -40, -40, -44, -55, -62, -40, -8, 5, -2, 4, 11, 4, -15, -26, -26, + -37, -49, -47, -27, -8, -3, 22, 45, 38, 22, 34, 47, 55, 52, 39, 44, + 58, 32, 2, 0, -7, -25, -21, 10, 29, 30, 9, 0, 0, -7, -26, -38, + -40, -53, -61, -53, -30, -5, 1, -2, 5, 10, 3, -18, -25, -33, -43, -51, + -46, -20, -10, -8, 26, 52, 35, 19, 32, 47, 56, 46, 33, 44, 48, 20, + 10, 11, -7, -29, -20, 15, 35, 28, 2, -9, -8, -6, -26, -32, -36, -54, + -64, -52, -22, 1, 3, 2, 3, 15, 2, -22, -24, -34, -41, -45, -39, -19, + -9, 1, 35, 57, 37, 18, 27, 46, 52, 41, 37, 44, 40, 18, 16, 13, + -7, -29, -14, 23, 36, 17, -6, -17, -2, 1, -24, -38, -43, -59, -62, -44, + -22, -4, 7, 2, 5, 16, -2, -24, -27, -36, -43, -48, -37, -20, -5, 14, + 40, 52, 36, 20, 26, 43, 46, 40, 41, 42, 28, 19, 19, 9, -4, -21, + -10, 27, 32, 10, -6, -16, -4, -5, -14, -37, -48, -59, -58, -36, -24, -1, + 13, -3, 7, 16, -5, -19, -32, -38, -46, -43, -32, -22, -7, 22, 49, 57, + 37, 22, 20, 37, 41, 36, 46, 41, 21, 19, 16, 9, -2, -25, -9, 27, + 24, 8, -12, -11, -2, -9, -10, -39, -51, -59, -59, -35, -21, 2, 15, -5, + 10, 11, -12, -19, -35, -39, -46, -35, -29, -26, -5, 37, 60, 53, 36, 26, + 19, 33, 37, 33, 48, 41, 18, 17, 19, 11, -8, -23, -3, 30, 21, -5, + -14, -2, -6, -9, -9, -42, -59, -64, -54, -33, -16, 6, 14, 0, 15, 4, + -14, -17, -35, -45, -46, -33, -27, -22, 2, 42, 56, 49, 37, 26, 19, 26, + 23, 36, 58, 44, 11, 8, 23, 10, -7, -15, 3, 26, 12, -10, -8, 3, + -10, -7, -13, -46, -58, -60, -57, -40, -11, 9, 9, 3, 13, -6, -12, -17, + -42, -53, -45, -28, -23, -14, 11, 49, 60, 49, 40, 27, 14, 16, 13, 43, + 62, 46, 6, 8, 22, 7, -9, -10, 11, 23, 4, -17, 2, 6, -6, -7, + -21, -51, -58, -58, -55, -38, -12, 12, 10, 13, 1, -15, -7, -14, -47, -62, + -45, -29, -19, -2, 21, 51, 63, 46, 37, 31, 16, 0, 4, 43, 64, 43, + 6, 9, 24, 4, -15, -2, 14, 9, -9, -15, 14, 7, -11, -10, -29, -53, + -54, -57, -48, -35, -9, 13, 9, 11, -5, -6, -2, -22, -57, -60, -39, -24, + -11, 5, 30, 52, 62, 49, 42, 38, 11, -9, 7, 45, 61, 44, 10, 15, + 21, -4, -15, 3, 13, 1, -13, -9, 13, 7, -9, -13, -32, -51, -53, -56, + -44, -35, -9, 15, 11, 7, -8, 0, -2, -34, -65, -56, -31, -24, -7, 20, + 37, 49, 56, 47, 47, 39, -3, -16, 12, 40, 53, 45, 16, 23, 17, -7, + -8, 7, 8, -5, -12, -7, 7, 7, -4, -17, -38, -56, -60, -50, -37, -33, + -8, 7, 9, 0, -6, 7, -8, -47, -71, -50, -25, -23, 0, 33, 41, 46, + 52, 53, 54, 35, -6, -9, 13, 32, 50, 48, 23, 25, 13, -4, -3, 0, + -1, -7, -7, -8, 3, 6, -3, -22, -41, -55, -62, -46, -30, -24, -5, 0, + 5, 2, 3, 10, -20, -57, -69, -41, -19, -16, 5, 37, 47, 46, 49, 54, + 58, 29, -4, -6, 7, 21, 49, 49, 24, 24, 12, -2, -5, -9, 0, 0, + -10, -15, 2, 8, -4, -23, -42, -57, -66, -43, -22, -16, -11, -8, 3, 5, + 7, 4, -28, -61, -61, -36, -19, -11, 10, 45, 51, 43, 46, 52, 54, 26, + 3, -8, -3, 15, 52, 48, 27, 30, 15, -1, -9, -14, 0, -2, -15, -17, + -2, -1, -5, -23, -37, -62, -64, -34, -17, -15, -19, -8, 4, 7, 8, -8, + -37, -55, -50, -33, -19, -5, 16, 49, 54, 44, 45, 52, 53, 32, 3, -12, + -5, 14, 46, 46, 38, 34, 21, 6, -13, -21, -2, -3, -18, -19, -14, -9, + -2, -14, -44, -74, -56, -26, -15, -16, -18, -6, -1, 7, 6, -20, -43, -48, + -35, -32, -24, 1, 23, 51, 54, 41, 42, 52, 49, 32, 3, -14, -5, 19, + 42, 47, 43, 38, 27, 10, -18, -19, -5, -7, -18, -27, -23, -9, 2, -8, + -51, -75, -41, -19, -15, -13, -15, -11, -5, 10, 1, -30, -37, -40, -30, -33, + -24, 6, 30, 49, 49, 45, 43, 52, 39, 24, 7, -10, -7, 12, 33, 44, + 48, 43, 36, 7, -29, -18, -6, -14, -23, -36, -32, -12, 2, -16, -60, -65, + -27, -22, -22, -9, -6, -14, -6, 11, -10, -38, -35, -27, -26, -35, -15, 18, + 39, 47, 48, 51, 55, 51, 28, 22, 13, -5, -6, 5, 27, 46, 57, 49, + 39, 1, -29, -12, -7, -15, -28, -48, -39, -11, -1, -28, -61, -51, -22, -30, + -22, -3, -4, -21, -6, 8, -23, -45, -29, -18, -27, -32, -11, 24, 44, 40, + 46, 56, 61, 44, 17, 18, 19, 1, -11, -2, 24, 48, 57, 54, 45, 2, + -27, -12, -11, -18, -32, -49, -41, -16, -10, -32, -47, -33, -25, -34, -13, 6, + -5, -24, -13, -4, -29, -43, -29, -18, -25, -21, -1, 25, 44, 40, 49, 67, + 60, 31, 12, 18, 24, -2, -18, -5, 22, 45, 62, 65, 46, -5, -21, -12, + -12, -17, -36, -57, -48, -23, -15, -29, -35, -28, -33, -31, -3, 12, -16, -32, + -12, -19, -36, -33, -25, -22, -29, -10, 14, 30, 41, 35, 51, 73, 57, 27, + 16, 21, 14, -4, -12, -2, 21, 41, 62, 71, 43, -7, -12, -19, -22, -23, + -46, -57, -51, -35, -20, -17, -22, -26, -37, -27, 7, 12, -24, -31, -14, -29, + -34, -30, -22, -20, -21, 2, 15, 26, 40, 45, 55, 66, 52, 28, 20, 17, + 10, -1, -12, -4, 21, 43, 65, 74, 39, 1, -9, -25, -27, -24, -45, -61, + -55, -43, -22, -9, -12, -24, -32, -26, 9, 7, -25, -31, -30, -40, -31, -26, + -19, -20, -11, 14, 18, 27, 45, 54, 52, 61, 49, 33, 24, 15, 5, 0, + -14, -2, 24, 44, 62, 67, 37, 12, -9, -30, -29, -33, -49, -66, -58, -51, + -25, -2, -6, -19, -31, -24, 6, 3, -21, -37, -43, -42, -31, -25, -17, -19, + -5, 15, 19, 30, 52, 56, 45, 54, 52, 38, 22, 11, 8, 0, -16, 2, + 27, 44, 63, 60, 34, 16, -10, -25, -31, -38, -55, -68, -62, -53, -18, 5, + -2, -17, -31, -16, 5, -4, -22, -43, -50, -38, -32, -21, -16, -11, 8, 10, + 19, 32, 60, 60, 43, 46, 51, 37, 24, 13, 8, -6, -17, 4, 32, 52, + 56, 52, 39, 23, -5, -23, -41, -48, -64, -65, -63, -57, -14, 9, 3, -18, + -28, -9, 0, -11, -25, -47, -53, -38, -30, -19, -11, 0, 10, 11, 23, 42, + 66, 60, 42, 49, 53, 36, 24, 20, 9, -17, -18, 3, 39, 59, 49, 41, + 39, 26, 1, -24, -53, -59, -70, -61, -66, -58, -12, 17, 7, -20, -26, -7, + -7, -16, -30, -51, -60, -45, -26, -11, -5, 5, 8, 10, 23, 48, 66, 55, + 40, 48, 48, 33, 30, 25, 2, -21, -15, 10, 41, 51, 44, 37, 41, 27, + 6, -28, -60, -65, -70, -63, -70, -55, -6, 21, 1, -20, -15, -2, -15, -24, + -32, -54, -66, -45, -22, -8, 6, 13, 5, 15, 31, 51, 64, 58, 41, 42, + 44, 35, 36, 29, 0, -20, -9, 14, 43, 53, 46, 39, 39, 24, 7, -33, + -69, -75, -73, -70, -75, -46, 4, 17, -2, -18, -6, 3, -18, -32, -38, -61, + -65, -39, -17, -2, 10, 10, 5, 19, 33, 55, 61, 54, 39, 40, 41, 41, + 40, 30, -6, -25, -6, 22, 44, 48, 42, 42, 37, 23, 11, -42, -73, -77, + -75, -74, -75, -39, 4, 8, -5, -15, 1, -1, -30, -33, -38, -69, -66, -40, + -14, 3, 16, 8, 5, 21, 39, 60, 59, 48, 40, 38, 39, 42, 42, 30, + -8, -20, 0, 26, 48, 51, 48, 43, 29, 21, 1, -47, -70, -80, -83, -80, + -70, -25, 0, -2, -9, -6, 9, -7, -29, -33, -49, -72, -59, -29, -3, 3, + 11, 6, 14, 27, 47, 61, 54, 47, 43, 34, 42, 45, 39, 21, -10, -17, + 4, 29, 53, 54, 47, 39, 29, 22, -11, -53, -70, -83, -86, -77, -61, -19, + -6, -7, -12, -2, 9, -14, -29, -35, -61, -70, -54, -25, -8, 2, 11, 8, + 17, 27, 54, 60, 50, 45, 42, 40, 43, 39, 35, 18, -9, -7, 8, 28, + 55, 56, 49, 32, 30, 15, -21, -53, -71, -88, -87, -74, -45, -12, -11, -15, + -14, 6, 12, -12, -30, -48, -66, -60, -44, -18, -8, 5, 13, 15, 21, 31, + 51, 57, 48, 43, 42, 40, 43, 37, 29, 16, -3, -1, 7, 35, 60, 54, + 38, 26, 29, 5, -30, -54, -72, -93, -87, -69, -34, -14, -19, -25, -12, 13, + 6, -17, -37, -56, -66, -49, -38, -18, -11, 1, 17, 24, 26, 32, 47, 52, + 50, 49, 45, 39, 40, 33, 32, 13, 4, 3, 3, 47, 65, 52, 29, 27, + 20, -5, -35, -56, -76, -90, -79, -63, -27, -17, -26, -24, 0, 12, -2, -16, + -33, -61, -61, -42, -33, -17, -16, -6, 22, 30, 25, 29, 45, 50, 46, 53, + 41, 37, 37, 33, 28, 17, 15, 2, 15, 54, 64, 46, 21, 25, 9, -12, + -39, -58, -77, -87, -75, -46, -21, -23, -34, -24, 9, 9, -7, -17, -40, -67, + -53, -33, -27, -22, -26, -4, 34, 34, 25, 27, 46, 44, 52, 59, 37, 30, + 35, 32, 26, 25, 16, 2, 30, 62, 57, 33, 19, 17, -7, -25, -43, -58, + -80, -82, -64, -36, -26, -26, -33, -17, 11, 4, -9, -18, -45, -62, -44, -30, + -24, -28, -29, 5, 38, 32, 25, 30, 48, 41, 53, 57, 35, 28, 26, 27, + 31, 29, 14, 12, 47, 63, 48, 35, 24, 4, -19, -32, -46, -55, -76, -77, + -58, -31, -30, -33, -36, -8, 12, -4, -9, -22, -51, -57, -30, -23, -27, -40, + -31, 18, 36, 31, 30, 33, 39, 36, 56, 51, 32, 27, 20, 24, 39, 30, + 16, 29, 55, 53, 43, 36, 21, -5, -28, -39, -45, -55, -71, -70, -47, -27, + -35, -36, -25, -2, 1, -4, -6, -23, -48, -48, -25, -16, -25, -46, -23, 24, + 30, 35, 34, 29, 33, 37, 51, 41, 30, 21, 12, 27, 47, 33, 19, 38, + 51, 43, 39, 36, 15, -17, -35, -35, -42, -55, -68, -62, -45, -33, -40, -36, + -19, -5, -4, -3, -6, -24, -47, -38, -17, -13, -37, -48, -13, 26, 30, 36, + 32, 27, 29, 36, 48, 38, 27, 9, 5, 34, 47, 31, 30, 49, 47, 36, + 38, 28, 11, -21, -32, -32, -47, -56, -60, -54, -40, -39, -42, -31, -12, -5, + -7, -1, -4, -21, -39, -28, -11, -13, -45, -42, -2, 23, 25, 42, 33, 26, + 26, 33, 44, 34, 20, 1, 5, 36, 47, 38, 40, 47, 37, 35, 38, 20, + 1, -23, -26, -35, -49, -56, -55, -48, -40, -46, -42, -28, -12, -12, -10, 2, + -6, -25, -32, -25, -13, -22, -43, -30, 5, 18, 24, 45, 35, 29, 21, 27, + 39, 28, 16, 2, 9, 39, 40, 44, 55, 45, 25, 31, 34, 15, -1, -18, + -25, -41, -49, -50, -52, -46, -42, -48, -40, -23, -9, -18, -13, 9, -1, -24, + -27, -22, -14, -30, -41, -26, 8, 15, 25, 40, 36, 26, 15, 26, 35, 21, + 11, 2, 17, 44, 37, 54, 63, 37, 16, 31, 27, 12, -3, -12, -24, -45, + -47, -46, -45, -40, -44, -55, -40, -17, -12, -22, -7, 19, -2, -22, -24, -15, + -17, -36, -36, -11, 16, 10, 17, 38, 43, 25, 15, 25, 26, 14, 7, 2, + 25, 39, 38, 63, 67, 30, 16, 25, 18, 14, -5, -9, -26, -43, -45, -47, + -42, -38, -52, -57, -35, -14, -22, -27, 0, 23, -5, -24, -22, -12, -21, -40, + -31, 1, 19, 6, 11, 35, 44, 22, 18, 28, 14, 4, 4, 11, 32, 34, + 38, 70, 68, 22, 18, 17, 15, 17, 0, -10, -31, -45, -43, -42, -34, -36, + -62, -61, -25, -11, -28, -29, 3, 25, -3, -26, -15, -12, -28, -34, -21, 9, + 17, 2, 10, 31, 40, 24, 23, 28, 5, -3, 6, 19, 35, 33, 42, 72, + 59, 22, 22, 12, 17, 17, 2, -11, -31, -40, -40, -36, -28, -40, -66, -57, + -18, -15, -32, -22, 9, 22, -3, -23, -8, -12, -31, -32, -12, 18, 15, -1, + 9, 25, 36, 26, 27, 20, -7, -5, 12, 23, 29, 33, 45, 70, 48, 25, + 20, 8, 16, 9, 4, -11, -33, -39, -37, -34, -30, -46, -65, -50, -23, -22, + -30, -19, 13, 22, -4, -21, -6, -15, -32, -28, -3, 18, 9, 0, 9, 21, + 30, 28, 30, 12, -14, -1, 17, 19, 27, 41, 51, 63, 35, 28, 22, 12, + 10, 6, 9, -14, -31, -36, -31, -27, -38, -49, -62, -48, -29, -25, -27, -13, + 13, 13, -3, -9, -9, -21, -30, -20, 4, 12, 4, 5, 12, 19, 27, 33, + 29, 6, -12, 2, 21, 17, 31, 45, 54, 55, 31, 31, 25, 14, 3, 5, + 11, -14, -27, -33, -24, -27, -41, -49, -63, -53, -37, -26, -22, -7, 11, 8, + 0, -3, -14, -19, -27, -14, 8, 5, 2, 9, 12, 20, 25, 31, 18, 0, + -6, 8, 20, 14, 27, 43, 59, 48, 24, 28, 25, 14, 2, 8, 6, -15, + -26, -30, -16, -28, -44, -53, -61, -58, -37, -27, -21, -4, 8, 3, 1, -2, + -18, -21, -24, -11, 3, -4, 3, 15, 17, 20, 22, 29, 15, 3, -2, 8, + 17, 18, 30, 46, 56, 40, 21, 29, 26, 14, -1, 5, 4, -6, -22, -29, + -13, -27, -46, -51, -62, -61, -37, -28, -14, 2, 7, 0, 5, -2, -16, -17, + -19, -10, -7, -9, 11, 20, 22, 18, 17, 25, 19, 4, -1, 10, 19, 25, + 32, 44, 53, 36, 19, 29, 24, 10, -4, 5, 4, -2, -22, -24, -13, -31, + -48, -56, -63, -60, -40, -31, -11, 8, 8, 2, 8, -6, -20, -17, -12, -10, + -20, -12, 14, 30, 26, 10, 14, 24, 24, -1, -7, 12, 25, 27, 30, 40, + 52, 34, 17, 28, 24, 7, -9, 1, 8, 3, -20, -20, -16, -33, -53, -59, + -62, -61, -47, -29, -5, 15, 5, 1, 9, -8, -20, -14, -5, -12, -30, -11, + 20, 37, 25, 10, 19, 25, 19, -5, -2, 18, 28, 26, 29, 41, 49, 31, + 20, 30, 24, 1, -8, 4, 10, 3, -17, -12, -18, -40, -57, -61, -62, -59, + -48, -23, 0, 18, 5, 5, 12, -9, -19, -9, -2, -20, -37, -7, 25, 39, + 23, 11, 25, 26, 10, -10, 5, 23, 24, 26, 30, 40, 42, 27, 23, 31, + 18, -7, -5, 2, 7, -1, -10, -10, -22, -45, -59, -63, -62, -58, -45, -21, + -1, 17, 10, 13, 7, -18, -21, -5, -3, -27, -38, -7, 26, 38, 21, 20, + 31, 23, 0, -9, 15, 25, 21, 28, 33, 35, 35, 29, 28, 31, 12, -5, + 0, 0, 4, 0, -3, -14, -27, -48, -57, -69, -66, -61, -40, -19, 1, 16, + 13, 16, -3, -18, -17, -4, -9, -30, -33, -1, 24, 35, 28, 34, 31, 16, + -4, -2, 22, 29, 20, 27, 38, 33, 30, 30, 31, 33, 9, 1, -3, -7, + 2, 6, -1, -22, -31, -50, -61, -74, -67, -52, -34, -25, 1, 19, 21, 14, + -8, -18, -14, -10, -14, -27, -26, -5, 21, 35, 38, 40, 31, 12, -1, 5, + 22, 29, 19, 31, 41, 28, 30, 28, 31, 28, 12, 7, -13, -11, -2, 13, + -5, -26, -32, -52, -67, -80, -65, -46, -34, -26, 2, 15, 25, 9, -8, -14, + -16, -10, -18, -25, -25, -9, 20, 37, 46, 35, 26, 10, 7, 8, 18, 27, + 18, 31, 39, 25, 29, 29, 34, 26, 20, 2, -18, -10, -5, 12, -9, -22, + -31, -48, -74, -79, -66, -42, -34, -22, -1, 14, 25, 13, -6, -19, -16, -8, + -19, -22, -21, -5, 21, 41, 51, 32, 25, 14, 19, 13, 14, 21, 21, 32, + 34, 26, 26, 30, 32, 25, 25, -3, -19, -13, -2, 8, -12, -24, -32, -46, + -75, -79, -67, -43, -33, -18, -7, 12, 25, 18, 0, -23, -13, -7, -23, -18, + -15, -4, 21, 48, 51, 27, 27, 23, 22, 12, 12, 19, 22, 28, 28, 28, + 28, 31, 28, 23, 28, -3, -20, -22, -5, 0, -14, -23, -28, -50, -78, -81, + -63, -44, -34, -19, -14, 10, 25, 18, -6, -19, -5, -11, -30, -17, -8, 2, + 21, 54, 45, 25, 28, 33, 25, 9, 12, 21, 26, 23, 24, 33, 37, 35, + 20, 23, 32, -1, -21, -25, -12, -11, -12, -19, -27, -53, -78, -79, -55, -42, + -31, -26, -18, 12, 24, 13, -9, -12, 0, -20, -33, -13, 1, 6, 26, 55, + 38, 25, 33, 45, 26, 7, 13, 21, 26, 16, 18, 38, 44, 33, 14, 25, + 30, 4, -24, -32, -21, -18, -19, -19, -25, -54, -79, -78, -53, -43, -29, -28, + -20, 6, 20, 12, -3, 0, -3, -35, -28, 1, 9, 8, 25, 46, 34, 30, + 37, 44, 19, 13, 20, 17, 20, 12, 18, 49, 49, 23, 13, 28, 33, 3, + -34, -37, -28, -30, -21, -10, -26, -57, -77, -74, -52, -40, -25, -32, -22, 3, + 17, 12, 3, 8, -15, -40, -18, 10, 10, 4, 32, 39, 27, 38, 48, 39, + 11, 18, 28, 17, 15, 5, 23, 61, 46, 21, 23, 35, 26, -3, -31, -37, + -39, -38, -23, -3, -29, -60, -74, -68, -58, -37, -27, -35, -22, -7, 15, 23, + 14, 8, -27, -41, -6, 19, 14, 9, 35, 31, 31, 48, 54, 35, 11, 27, + 26, 4, 7, 11, 31, 54, 38, 25, 34, 35, 20, -10, 19, 3, -8, -45, + 64, -15, -41, 23, 40, -58, 22, 29, -27, -28, 42, -36, 21, -12, -19, 39, + -14, 3, -18, 32, -27, 18, -8, -43, 43, 25, -52, 6, 19, 13, -7, -50, + 55, 5, -46, -22, 94, -53, -33, 35, 27, -45, -2, 20, 19, -30, -23, 47, + 8, -58, 5, 76, -67, -22, 42, 30, -54, 8, 23, 11, -51, 3, 47, -33, + -7, 5, 27, -33, 34, -35, 17, 4, -26, 5, 17, -30, 33, 5, -29, -5, + 44, -18, -50, 60, -33, 10, -5, 10, -7, 1, -5, 19, -36, 3, 37, -17, + -51, 52, 37, -64, 9, 4, 37, -44, -13, 25, 45, -75, -9, 79, -34, -57, + 53, 24, -59, 18, 22, -3, -24, 10, -2, 18, -53, 29, 35, -20, -43, 37, + 18, -17, -31, 8, 45, -49, 8, 11, 9, -23, 30, -24, -22, 29, 14, -43, + 27, 13, -22, -1, 2, 22, -37, 5, -5, 38, -43, 6, 36, -21, -20, 20, + 0, -5, -27, 27, 21, -53, 4, 52, -2, -84, 70, 5, -29, -19, 36, -6, + -8, -12, 3, 35, -32, -25, 48, 6, -60, 49, 4, -27, -13, 31, -15, -9, + -4, 31, -13, -25, 29, 12, -34, -6, 30, -41, 36, -23, 6, 31, -30, 0, + 17, -45, 47, -5, -47, 19, 28, -8, -30, 27, -6, 15, -54, 34, 21, -27, + -9, 25, 3, -45, 26, 27, -52, 22, 20, -29, 34, -46, 22, 40, -69, -27, + 108, -49, -54, 69, -11, -3, -18, 3, 15, -12, -23, 29, -8, 4, -23, 50, + -38, -8, 33, -32, -2, 26, -27, 12, 13, -39, 56, -31, -22, 28, 2, -39, + 54, -20, -36, 51, -6, -34, 15, 2, 1, 2, -36, 42, 2, -10, -39, 64, + -36, -16, 24, 1, -1, -18, -10, 54, -27, -54, 80, -18, -61, 51, 27, -76, + 64, -30, -1, 9, -19, 24, 13, -29, -13, 49, -18, -46, 43, 6, -47, 42, + -28, 14, 18, -18, 2, 14, -39, 25, 16, -58, 33, 29, -49, 16, 41, -62, + 43, -17, -17, 25, -10, -28, 41, -5, -30, 27, 14, -53, 27, 35, -63, 16, + 30, 0, -30, -10, 22, 31, -57, 0, 68, -59, 2, 37, -30, 6, -3, -19, + 35, -29, 1, 20, 22, -68, 33, 39, -71, 21, 27, -22, -1, 3, 0, 18, + -16, -13, 17, 4, -37, 44, -15, -26, 48, -29, -11, 34, -25, -4, 25, -48, + 43, 4, -49, 28, 42, -72, 7, 59, -36, -28, 45, -9, -28, 25, -19, 23, + -9, -40, 47, 18, -85, 78, -2, -53, 39, -17, 2, 14, -36, 10, 63, -78, + 17, 59, -66, -8, 54, -49, 14, 1, 5, 2, -18, 16, -12, 30, -58, 22, + 53, -83, 17, 79, -84, 19, 17, -34, 44, -33, -27, 82, -62, -19, 91, -93, + 22, 49, -51, -25, 48, -12, -6, 1, -2, -1, 22, -32, -1, 59, -78, 12, + 58, -49, -26, 70, -40, -8, 16, -8, 12, 10, -65, 74, -1, -97, 90, 0, + -56, 23, 25, -17, 11, -23, 14, 9, -24, -31, 77, -41, -48, 95, -38, -46, + 59, -1, -57, 49, -33, 19, 18, -46, 34, 31, -79, 47, 11, -38, 10, 19, + -14, -10, 26, -29, 28, -17, -27, 48, -15, -51, 78, -14, -73, 64, 12, -55, + 29, 3, -24, 52, -65, 26, 50, -75, -5, 81, -76, 0, 42, -6, -26, 10, + 18, -14, 4, -24, 33, 2, -69, 61, 43, -101, 40, 54, -73, 22, 18, -41, + 44, -19, -43, 94, -69, -13, 65, -26, -46, 35, 24, -34, -2, 23, -13, 6, + -19, 4, 38, -56, 14, 40, -37, -19, 66, -57, -9, 50, -47, 21, 6, -31, + 55, -34, -50, 98, -44, -47, 44, 28, -51, 6, 31, -3, -34, 8, 11, 6, + -18, -27, 78, -48, -28, 55, -2, -60, 57, -37, 14, 15, -48, 49, 22, -96, + 74, 23, -83, 36, 18, -17, -25, 41, -12, -4, -2, 1, 9, -14, -18, 36, + 12, -77, 54, 32, -67, 20, 38, -67, 61, -53, 32, 21, -60, 27, 41, -74, + 27, 33, -30, -6, 22, -1, -30, 20, 1, -4, -22, 9, 8, 37, -65, 18, + 61, -69, -3, 37, -19, -15, 15, -16, 57, -78, 20, 66, -67, -27, 76, -37, + -16, 11, 11, -5, -18, 10, 16, -5, -38, 36, 9, -20, -32, 73, -41, -36, + 62, -33, -9, 34, -41, 35, -7, -40, 65, -35, -26, 33, 2, -43, 42, -4, + -9, 5, -11, 19, -10, -16, 11, 16, -28, -9, 41, 2, -70, 67, -3, -55, + 23, 33, -26, 6, -29, 43, 16, -85, 51, 28, -54, 7, 27, -9, 2, -18, + 27, -4, -42, 31, 10, -19, -9, 18, 8, -24, -3, 45, -57, 25, 0, -7, + 15, -28, 10, 33, -46, -6, 52, -36, -15, 46, -29, -4, 12, -14, 34, -57, + 16, 40, -41, 3, 16, 8, -32, 16, 15, -17, -27, 47, -30, -1, 14, -5, + 16, -17, -33, 70, -44, -42, 84, -34, -27, 18, 15, 3, -20, -22, 55, -35, + -22, 31, 10, -11, -27, 27, 13, -28, -10, 41, -21, -3, -22, 41, -21, -13, + 6, 34, -68, 46, 25, -65, 50, -21, -1, 10, -33, 34, 1, -43, 58, -34, + -2, 13, 8, -25, 0, -2, 34, -29, -26, 45, -12, 4, -34, 32, 15, -54, + 17, 53, -76, 41, 4, -17, 13, -26, 13, 31, -47, 1, 52, -53, 11, 8, + 14, -31, -7, 19, 30, -60, 26, 27, -22, -10, 0, 18, -13, -24, 52, -38, + -17, 68, -60, 26, -9, -25, 41, -29, -8, 40, -25, -9, 26, -28, 15, -9, + -3, 11, -21, -1, 44, -47, 19, 0, 3, -14, -12, 38, -22, -23, 37, -10, + -13, 9, -6, 21, -14, -39, 61, -4, -68, 60, 6, -43, 28, -14, 21, -22, + -13, 36, -7, -40, 46, -14, -5, -18, 20, 22, -49, 22, 10, -18, 21, -30, + 9, 34, -54, 19, 22, -34, 27, 7, -45, 30, 0, -20, 23, -23, 29, -10, + -21, 25, 3, -23, -1, 5, 16, -33, 14, 25, -21, -11, 16, 3, -22, 5, + 6, 32, -73, 27, 62, -72, 5, 26, -21, 30, -37, 4, 40, -45, 5, 18, + -18, -1, 12, -3, 0, -18, 28, -8, -14, 11, -11, 13, -15, -3, 27, -17, + -30, 65, -45, -5, 28, -25, 1, 20, -36, 38, -11, -20, 35, -23, -20, 27, + 11, -42, 13, 17, 1, -25, 20, 10, -33, 10, 6, -7, 9, -26, 40, -3, + -63, 74, -30, -11, 10, -10, 5, 17, -47, 53, -10, -47, 29, 31, -45, 4, + 16, 14, -15, -33, 40, -11, -3, -10, 2, 18, -20, 9, 22, -44, 19, 20, + -42, 25, -5, -11, 25, -25, -3, 47, -63, 28, 20, -42, 7, 39, -41, 2, + 13, 10, -24, -8, 41, -26, -1, -13, 9, 42, -60, 0, 61, -54, -4, 19, + -6, 11, -19, -13, 52, -37, -26, 66, -38, -30, 49, -18, -11, 5, 7, 10, + -30, 4, 17, 2, -12, -15, 38, -19, -20, 30, -16, -23, 38, -13, -16, 29, + -22, 26, -17, -35, 62, -30, -35, 51, -16, -27, 40, -16, 3, -8, -4, 9, + 4, -26, 11, 20, -11, -38, 56, -19, -29, 31, 7, -39, 17, 10, 6, -8, + -41, 45, 26, -79, 36, 42, -58, 21, 6, -10, 7, -19, 17, -1, -15, -12, + 53, -22, -32, 24, 25, -59, 24, 22, -36, 10, 18, -27, 44, -45, 0, 42, + -45, -2, 30, -27, 12, 23, -38, 13, 5, 4, -4, -20, 1, 43, -27, -36, + 43, 14, -51, 12, 40, -41, 5, 18, -11, -1, -5, -11, 53, -56, -29, 91, + -41, -45, 57, -7, -18, -3, -4, 29, -20, -19, 20, 26, -57, 31, 17, -22, + -13, 28, -31, 3, 36, -33, 9, 17, -39, 42, -9, -54, 58, 6, -69, 44, + 30, -50, 24, 3, -17, 9, -20, 17, 8, -23, 1, 46, -50, 1, 27, 1, + -49, 37, 5, -17, 4, -5, 7, 18, -55, 39, 36, -85, 37, 48, -63, 5, + 27, -13, -6, -4, 5, 24, -26, -12, 42, -25, -34, 33, 20, -33, -13, 29, + -2, 7, -34, 12, 37, -50, 1, 47, -46, -1, 56, -54, -18, 59, -35, -6, + 12, -16, 20, -2, -27, 43, -12, -34, 22, 25, -41, -7, 43, -20, -18, 19, + -1, 1, -6, -20, 54, -55, -12, 67, -24, -56, 56, -8, -12, -7, -3, 16, + 20, -48, 20, 32, -46, 8, 23, -17, -38, 54, 1, -34, 2, 30, -1, -21, + -18, 38, -14, -35, 41, 3, -36, 19, 22, -45, 40, -32, 12, 12, -26, 2, + 35, -54, 34, 14, -25, -30, 47, 10, -53, 24, 13, -4, -18, 3, 5, 27, + -61, 38, 15, -39, 6, 40, -36, 0, 2, -6, 28, -40, 7, 46, -37, -30, + 59, -21, -29, 6, 48, -55, 12, 30, -21, -6, 5, -2, 1, -14, -7, 46, + -41, -4, 35, -8, -33, 29, -20, 26, -31, -10, 63, -46, -4, 12, 7, -11, + -15, 26, -14, -22, 54, -47, 12, 9, -1, -8, -7, -8, 41, -12, -60, 77, + -21, -26, 11, 13, 1, -26, -9, 59, -45, -16, 38, -3, -27, -1, 28, -8, + -19, 11, 20, -41, 34, -23, 22, -20, -9, 6, 51, -79, 40, 18, -40, 23, + -5, -19, 13, 2, 3, -4, -35, 71, -39, 5, -30, 33, 6, -29, -3, 38, + -29, -5, 18, -9, -4, -11, 16, 15, -32, -14, 77, -83, 30, 10, -10, -19, + 20, 15, -17, -19, 29, 7, -32, 6, -1, 14, -14, -6, 5, 36, -58, 47, + -18, -14, 4, 8, 8, -24, -15, 60, -36, -20, 43, -32, 3, -2, 1, 9, + -5, -8, 30, -33, 6, 6, 2, -12, -11, 24, 1, -22, 9, 34, -61, 25, + 11, -5, -18, -1, 38, -19, -33, 49, -19, -21, 18, -7, 1, 5, -4, -3, + 13, -30, 25, -5, -12, 2, 8, 17, -37, 0, 50, -38, -26, 40, -15, 7, + -24, 31, -11, -8, 6, -6, -3, 1, 9, -8, 6, -20, 25, 0, -21, 7, + 22, -48, 29, -4, 10, -22, 7, 22, -9, -34, 45, -15, -31, 30, -2, 0, + -30, 46, -18, -6, -17, 31, -6, -7, -21, 8, 45, -47, -7, 31, -17, -11, + 25, -20, 17, -30, 47, -38, -2, 5, 16, -36, 24, -2, 3, -7, 6, 10, + -23, 5, -11, 35, -42, 17, 0, 21, -35, 11, 16, -18, -15, 36, -24, -3, + 9, 5, 13, -49, 36, -11, -2, -14, 37, -32, 13, -1, 0, -2, -2, -8, + 17, -11, -21, 30, -1, -1, -41, 72, -65, 14, 14, 12, -41, 21, 4, 15, + -32, -1, 25, -9, -18, 3, 29, -38, 35, -22, 14, -20, 16, -6, -6, -13, + 29, -4, -17, 7, 14, -6, -38, 54, -32, 3, -16, 36, -39, 42, -40, 36, + -22, -13, 17, 14, -36, 12, 23, -25, 6, -25, 53, -33, -12, 5, 37, -46, + 6, 20, 9, -53, 52, -16, -22, 24, -9, 10, -17, 12, -20, 48, -73, 40, + 18, -30, -20, 52, -34, 11, -6, 0, 1, -15, 24, -16, 16, -30, 44, -27, + -10, 0, 34, -52, 24, 3, 2, -6, 12, -25, 35, -38, -14, 72, -73, 7, + 31, 15, -50, 20, 12, -5, -25, 23, 3, -10, -9, 15, 9, -41, 28, 6, + -5, -36, 44, -13, 10, -19, 2, 14, -10, -29, 56, -27, -35, 58, -19, -27, + 17, 16, -30, 10, -7, 15, -12, -3, 11, 18, -30, -13, 38, -17, -16, 3, + 32, -37, 23, -24, 30, -12, -26, 40, -14, -52, 59, 12, -55, 16, 35, -20, + -30, 39, -24, 21, -26, 12, 13, -10, -19, 23, 2, -35, 17, 33, -30, -17, + 39, -15, 12, -53, 50, -13, -25, 2, 50, -42, -1, 25, -22, 6, -5, 3, + -4, 2, -18, 39, -25, -3, 1, 29, -57, 22, 26, -22, -18, 34, -10, -10, + -11, 13, 31, -77, 46, 23, -22, -35, 61, -24, -13, 7, -3, 0, 4, -24, + 27, 12, -50, 35, 13, -19, -37, 69, -46, -4, 13, 5, -8, 6, -25, 40, + -26, -13, 38, -12, -28, 21, 22, -57, 40, -15, 11, -19, 4, 19, 9, -36, + 3, 42, -35, -30, 46, 0, -50, 59, -26, 9, -16, 12, -10, 10, -33, 44, + -8, -29, 8, 42, -43, -6, 26, -19, 14, -30, 34, 4, -21, -17, 49, -31, + -24, 34, 14, -53, 32, 13, -26, 12, -22, 26, -3, -22, -11, 66, -59, 0, + 43, -27, -23, 42, -32, 7, -7, 11, 9, -19, -1, 15, 16, -58, 43, 1, + -32, 11, 36, -44, 18, 0, 4, -4, -7, -22, 50, -22, -44, 67, -14, -43, + 37, 2, -32, 15, 7, 8, -22, -1, 14, 19, -43, 0, 40, -30, -14, 28, + 10, -32, 11, 1, 21, -33, -9, 31, 15, -72, 61, 4, -40, 21, 14, -37, + 22, 4, -4, -9, 5, -8, 23, -16, -22, 35, -24, 0, 12, 3, -17, 15, + 2, -10, -6, -8, 21, 7, -58, 40, 43, -75, 25, 28, -25, -18, 28, -15, + 6, -5, -4, 22, -5, -39, 37, 1, -30, 12, 23, -27, -8, 34, -22, 0, + -12, 15, 10, -28, 2, 45, -45, -9, 36, -22, -7, 13, -7, 6, 2, -18, + 17, 10, -34, 9, 18, -22, -1, 22, -9, -17, 23, -1, -22, 21, -20, 20, + -17, -6, 38, -33, -18, 55, -32, -21, 26, -5, -9, 5, -8, 16, 9, -47, + 36, 11, -36, -3, 38, -7, -48, 44, -2, -11, 2, -16, 15, 11, -36, 33, + -3, -18, 9, 19, -46, 26, -1, -11, 20, -24, 12, 16, -16, -17, 37, -32, + -6, 13, 13, -33, 25, 14, -27, 8, 1, -18, 22, -5, -15, 32, -46, 37, + -2, -19, -13, 38, -32, 8, 2, -4, 15, -12, -4, 19, -25, -10, 37, -19, + -11, -10, 57, -54, 19, -17, 18, 3, -18, -9, 27, -6, -36, 57, -23, -21, + 14, 11, -23, 32, -53, 56, -24, -5, -3, 11, -16, 16, -7, -20, 17, 11, + -3, -31, 42, -33, 14, -6, -2, -8, 39, -56, 48, -21, -20, 30, -8, -20, + 12, 15, -32, 41, -36, 29, -25, 14, -22, 22, -19, 9, 4, 10, -31, 17, + 11, -14, -1, -7, 17, -16, 6, -18, 64, -88, 47, 6, -20, -5, 22, -13, + 18, -28, 2, 25, -19, -10, -3, 29, -23, 11, -22, 39, -25, 13, -27, 20, + -2, -18, 15, -3, 3, 9, -17, -8, 38, -57, 35, 1, -9, -24, 43, -32, + 30, -30, -3, 19, -3, -21, 12, 14, -12, 2, -5, 11, -37, 37, -3, -13, + -4, 10, 11, -4, -38, 41, -9, -27, 37, -37, 16, 17, -7, -15, 22, -40, + 33, -2, -16, 4, 3, 8, -4, -20, 21, -3, -10, 8, -26, 37, -21, 8, + 0, -3, -3, 0, -8, 20, -15, -32, 54, -10, -26, 17, -12, 10, 24, -71, + 51, 3, -21, 9, -3, 17, -22, 2, 15, -21, -11, 39, -25, 11, -27, 28, + 3, -11, -26, 45, -43, 24, 7, -39, 47, -24, -15, 27, -13, -15, 35, -27, + 15, -17, 9, 0, -7, 0, 4, -9, 13, -3, -16, 28, -29, 21, -23, 11, + -4, 10, -30, 64, -63, 13, 28, -30, 16, -13, 0, 25, -39, -2, 53, -40, + 5, -19, 41, -25, -6, -3, 37, -40, 6, 8, 0, 6, -34, 32, 4, -27, + 13, 15, -34, 52, -63, 40, -5, -22, 5, 24, -32, 22, 11, -26, 14, -22, + 26, -21, 10, -8, 5, -10, 46, -66, 44, -20, 14, -7, -27, 23, 30, -53, + 24, 10, -37, 44, -40, 21, -11, 3, 6, 20, -47, 27, 5, -2, -18, -4, + 29, -13, -20, 27, 9, -47, 43, -37, 55, -62, 14, 33, -13, -28, 24, -9, + 23, -35, -4, 32, -14, -13, 28, -10, -30, 46, -43, 43, -46, 13, 13, -10, + 7, -3, -20, 39, -19, -19, 14, -15, 39, -31, -10, 25, 2, -34, 41, -35, + 15, -4, -3, 22, -18, -27, 46, -1, -36, 10, -4, 42, -56, 13, 31, -19, + -18, 28, -29, 27, -32, 24, 10, -44, 20, 32, -32, -17, 32, -13, 13, -35, + 20, 32, -53, 20, 9, -16, 16, -36, 39, -3, -33, 43, -26, 2, 2, 2, + -17, 24, -22, 14, -3, -12, 31, -28, -8, 26, -29, 19, -4, -15, 33, -39, + 22, 16, -37, 6, 17, -4, -13, -12, 37, 9, -65, 34, 25, -27, -9, 7, + 5, 10, -36, 45, -11, -41, 42, -6, -21, 7, -5, 31, -5, -57, 62, -12, + -15, -16, 23, 4, -24, 12, 26, -35, -11, 44, -25, -8, -1, -4, 28, -11, + -37, 61, -48, 23, -1, -30, 29, -8, -2, 6, -19, 18, 15, -41, 30, -4, + -11, -11, 28, -10, -4, -37, 81, -45, -43, 61, -19, 1, -11, 0, 31, -30, + -25, 68, -43, -11, 0, 27, -1, -33, -7, 77, -54, -30, 44, -6, -5, -14, + 17, -6, -10, 6, 30, -68, 50, -16, 5, 5, -30, 30, 26, -69, 36, 8, + -34, 37, -28, 11, 0, -1, 9, 1, -41, 53, -22, -24, 23, 5, -9, -11, + 12, 28, -61, 28, 36, -68, 51, -33, 25, -6, -26, 7, 53, -65, 2, 47, + -25, -23, 17, 20, -4, -51, 38, 29, -67, 31, 1, 22, -35, -8, 40, -9, + -46, 47, -13, -8, 5, -15, 37, -27, -20, 45, -16, -45, 59, -37, 19, -6, + 2, 1, -11, -3, 34, -42, 0, 33, -30, 16, -13, 13, 2, -23, 18, -5, + -26, 43, -24, 15, -26, 4, 35, -15, -62, 64, 19, -75, 50, -8, 8, -14, + -12, 31, -19, -30, 45, -10, -12, -10, 36, 3, -53, 14, 45, -37, -22, 42, + -25, 21, -36, 21, 37, -61, 5, 47, -49, 19, -4, 5, 1, -12, 7, 3, + -11, 2, 18, -28, 13, -4, 18, -13, -20, 33, -22, -8, 21, -12, -10, 24, + -9, 2, -27, 15, 33, -41, -18, 56, -40, 9, -5, 6, 20, -44, 11, 39, + -35, -22, 50, -7, -36, -6, 41, -10, -30, 15, 20, -22, 7, -11, 16, 6, + -51, 59, -21, -26, 24, 12, -24, 8, -7, 12, 3, -36, 27, 18, -42, 22, + 9, -22, 11, -2, 15, -40, 38, -13, -16, 8, 24, -33, 15, -13, 4, 23, + -42, 17, 30, -34, -5, 28, -22, 11, -23, 30, -14, -28, 37, 12, -46, 11, + 31, -23, -12, -7, 36, -17, -6, -4, 25, -18, 4, -29, 53, -48, 4, 24, + -9, -21, 30, -1, -20, 2, -13, 51, -51, -1, 39, -23, -18, 33, -23, 3, + 3, 2, -13, 11, 4, -13, 15, -14, -3, 1, 24, -53, 55, -24, -17, 36, + -1, -49, 45, -7, -12, -2, -4, 24, -23, 1, 6, 23, -51, 30, -8, 14, + -29, 17, 12, -9, -21, 21, 1, 3, -32, 21, 30, -59, 27, 25, -21, -26, + 36, -24, 16, -23, 15, 10, -15, 11, -11, -3, 14, 1, -30, 32, -24, 27, + -25, 10, -12, 29, -33, 7, -5, 25, -29, 14, 15, -42, 20, 18, -27, 1, + 21, -19, 17, -18, 2, 19, -12, -34, 47, -21, -6, 9, -2, 14, -32, 32, + -23, 14, -21, 21, 0, -13, -8, 42, -35, -19, 33, 4, -34, 23, -5, -6, + 22, -31, 21, -8, -5, -3, 15, -22, 10, 2, 7, -17, 11, 3, -10, 2, + -1, -2, -9, 25, -20, 11, -18, 17, -3, -12, 2, 9, -1, -10, 5, 0, + 15, -40, 36, -5, -28, 16, 24, -34, 16, -1, 13, -32, 11, 9, 5, -26, + 5, 32, -32, 4, -1, 29, -38, 8, 7, -6, 5, -2, -5, 18, -26, -2, + 39, -42, 0, 26, 2, -43, 45, -30, 20, -11, -6, -3, 16, -7, -6, 3, + 12, -13, 5, -7, -21, 47, -29, -11, 9, 36, -45, 8, 0, 22, -28, -7, + 32, -22, -9, 20, 12, -40, 24, -8, 14, -28, 10, 9, 12, -29, 15, -7, + 15, -23, 5, 14, -24, 12, 8, 4, -38, 36, -4, -7, -30, 47, -13, -24, + 16, 23, -46, 29, -3, -10, 20, -43, 35, 0, -4, -30, 47, -18, -21, 16, + 19, -35, 11, 19, -21, -11, 27, -12, -9, 16, -21, 23, -32, 30, 3, -22, + -15, 51, -38, -1, -2, 11, 15, -28, -1, 16, 13, -42, 23, 4, -6, -32, + 61, -24, -35, 34, 29, -55, 4, 13, 9, -6, -26, 35, -6, -11, -11, 19, + -6, -3, -15, 43, -41, 4, 22, -1, -34, 18, 15, -35, 18, -1, 23, -35, + 18, -2, -9, 1, 10, -18, 17, -18, 21, -8, -17, 24, -1, -20, -7, 26, + -11, 6, -33, 42, 0, -40, 9, 46, -48, -6, 24, 13, -39, 8, 41, -43, + 3, 6, 6, -7, -6, -8, 42, -37, -11, 39, -16, -26, 25, 3, -24, 9, + 11, 6, -34, 17, 14, -12, -22, 20, 0, 14, -38, 27, 10, -37, 22, -1, + -5, -7, 11, 4, -3, -29, 38, -5, -26, 4, 20, -17, 6, 2, 11, -17, + -10, 40, -49, 10, 26, -8, -24, 11, 12, 5, -36, 21, 20, -22, -29, 28, + 30, -30, -24, 31, 25, -70, 39, 4, -16, 3, 9, -13, 16, -26, 23, 19, + -46, 1, 29, 6, -37, 8, 27, -8, -33, 36, -24, 5, 14, -8, -8, 1, + 4, 15, -27, -11, 44, -38, 6, 12, -3, -12, 20, -17, 16, -35, 28, -4, + 0, -13, 8, 23, -24, -16, 28, 11, -58, 48, 6, -39, 11, 24, -9, -8, + -25, 42, -16, -14, 12, 2, 13, -31, 6, 26, -10, -48, 64, -22, -21, 6, + 28, -15, -11, -2, 22, -30, 11, 15, -25, 13, 2, -1, -7, -4, 6, 17, + -37, 17, 0, 1, 14, -23, 4, 16, -23, 6, 12, -31, 30, 6, -18, -25, + 45, -7, -20, -15, 44, -38, 9, 22, -37, 24, 6, -20, 14, -17, -8, 44, + -27, -22, 16, 30, -33, -18, 20, 31, -50, 11, 27, -21, -4, -3, 26, -15, + -24, 15, 20, -27, 16, -12, 9, 5, -24, 3, 26, -27, 5, 15, -19, 9, + -9, 26, -25, -5, 10, -4, -6, 31, -45, 18, 24, -23, -23, 27, -3, 2, + -18, 9, 13, -18, 19, -17, 7, -1, -24, 31, 5, -49, 31, 32, -40, -7, + 10, 14, -12, -12, 5, 21, -30, 25, -12, 4, -18, 9, 11, -13, -20, 37, + -8, -3, -13, -3, 33, -21, -32, 44, -7, -22, 28, -24, 5, 12, -19, 2, + 6, 2, -16, 11, 10, -6, -23, 31, -25, 7, 6, -16, 18, 1, -35, 40, + -9, -18, 12, 4, -2, -25, 20, 19, -16, -35, 46, -14, -8, -3, -1, 24, + -12, -25, 26, -4, -6, 3, -12, 20, -24, 18, 9, -20, -2, 18, -13, -1, + -16, 8, 26, -35, 12, 10, -11, 6, 2, -30, 46, -43, 16, 6, 1, -20, + 26, -18, 8, -13, 9, -3, 3, 1, -25, 29, 13, -50, 12, 41, -47, 15, + 14, -12, 2, -3, -1, 14, -25, -3, 26, -23, 19, -35, 41, -5, -23, -1, + 31, -30, 8, -15, 32, -29, -7, 22, 10, -35, 12, 6, -2, 20, -50, 36, + 7, -17, -4, -1, 7, 2, -21, 19, -12, 1, 28, -25, -5, 9, -3, -12, + 32, -45, 16, 21, 0, -43, 21, 28, -19, -38, 45, -15, -8, 28, -43, 39, + -12, -23, 13, 19, -39, 23, -3, 17, -32, 6, 20, -5, -32, 23, 8, -15, + -1, 11, 9, -28, 5, 20, -18, -6, 9, -18, 50, -50, -8, 49, -30, -5, + -4, 14, -19, 28, -21, 2, 4, 11, -20, 6, 3, -5, -24, 54, -34, -14, + 26, -4, -2, -16, 5, 20, -23, 1, 6, -9, 32, -37, 1, 25, -22, -8, + 31, -6, -37, 31, 0, 3, -37, 24, 25, -27, -20, 27, 1, 4, -26, 13, + 3, -14, 12, -6, 6, -3, -6, 18, -14, -27, 38, 5, -36, 14, 13, -22, + 26, -13, -22, 36, -23, -5, 3, 18, -12, -23, 31, -5, -24, 23, -15, 17, + -7, -23, 20, 6, -4, -19, 20, -8, 15, -32, 13, 17, -30, 17, 13, -19, + -8, 4, 24, -18, -29, 36, 7, -21, -20, 28, 13, -17, -31, 36, -9, -7, + 7, 6, -9, -4, 7, -6, 10, -32, 41, -26, 12, -10, -12, 35, -10, -39, + 36, -9, -7, 7, 6, -9, -4, 11, -14, 5, -7, 9, -13, 24, -27, 4, + 14, 7, -31, 19, -14, 17, -5, -34, 57, -31, -7, -6, 28, -15, -11, 2, + 25, -21, -14, 15, 18, -35, 12, 1, 9, -20, -2, 32, -37, 26, -17, 7, + 1, -10, -18, 54, -37, -16, 23, 11, -13, -23, 34, -5, -16, -10, 25, -28, + 30, -10, -7, -5, 18, -24, 25, -24, 18, -11, 0, 3, -19, 34, -12, -12, + 2, 3, -13, 32, -37, 20, 4, -6, -25, 29, -3, -2, -11, -2, 28, -38, + 18, 7, -5, -7, 0, -4, 21, -36, 30, -19, 25, -29, -15, 48, -11, -43, + 33, 33, -64, 17, 26, -12, -18, 9, -1, 18, -33, 23, -13, 21, -18, -13, + 18, -2, -20, 20, 6, -15, 4, -12, 28, -27, 1, 10, -5, 3, 0, -17, + 15, 17, -30, 2, 5, -8, 17, -11, -2, 9, -20, 23, -27, 23, -10, -3, + 7, -3, -25, 31, 9, -28, -9, 30, -5, -28, 15, 29, -36, -9, 29, -11, + -20, 33, -27, 21, -14, -12, 21, -3, -9, -2, 12, -5, -27, 27, 7, -20, + -11, 32, -9, -15, -1, 9, 20, -42, 12, 9, -4, 3, -6, -3, 6, 0, + -12, 15, -25, 27, -6, -6, -6, 6, -2, -4, 5, 9, -20, 12, 8, -17, + -10, 30, -12, -24, 25, -15, 18, -21, 21, -8, -6, -9, 12, -6, 15, -33, + 26, 8, -32, 13, 21, -12, -28, 20, 11, -6, -28, 27, 11, -21, -10, 22, + -1, -11, -7, 24, -12, -27, 35, -8, 0, -20, 23, -10, 9, -30, 32, -15, + 3, -7, 6, -2, 10, -17, 1, 8, -4, -5, -3, 14, -9, 1, -11, 18, + -13, 15, -33, 22, 14, -32, 11, 9, -1, -17, 14, 0, -3, -16, 29, -21, + -4, -1, 28, -24, -2, -11, 41, -25, -23, 24, 6, -18, -13, 37, -21, -2, + -4, 29, -40, 11, 12, 4, -25, 12, -9, 23, -17, -14, 27, -2, -26, 9, + 18, -14, -1, -15, 29, -18, -4, 5, 12, -26, 18, -3, -7, 3, 13, -10, + -25, 44, -38, 11, 8, -2, -25, 28, -9, 12, -13, -13, 10, 27, -53, 19, + 16, -4, -20, 12, 12, -21, 5, 12, 3, -35, 22, 8, 0, -28, 18, 16, + -25, -3, 9, 8, -3, -19, 8, 24, -34, -4, 38, -16, -30, 29, -1, -2, + -25, 28, -1, -21, 11, 10, -18, -1, 10, 1, -7, 0, 1, -7, 15, -15, + -5, 16, 2, -22, 8, 0, -1, 26, -34, -22, 56, -26, -11, 12, 9, -9, + -9, 4, 7, -8, -1, 8, 0, -21, 10, 19, -8, -25, 17, 10, -18, 3, + -4, 26, -15, -29, 30, 9, -46, 36, 12, -33, 1, 18, -2, -16, 4, 16, + -10, -16, 11, 2, 8, -19, 5, 1, 10, -21, 20, -8, -1, -3, 1, 7, + -19, 7, 11, -12, 5, 5, -26, 29, -11, -5, -2, 12, -13, 9, -22, 23, + 3, -20, 4, 17, -16, -13, 17, 15, -16, -34, 37, -5, 8, -32, 23, 17, + -36, -2, 36, -25, -4, 28, -18, -20, 15, 4, 7, -12, -24, 43, -19, 0, + -11, 25, -9, -12, -7, 10, -1, 11, -2, -12, 13, -27, 30, -9, -15, 8, + 17, -28, 18, -9, 3, 7, -8, -10, 16, -26, 35, -22, -10, 37, -35, 1, + 11, 11, -19, -2, 9, 17, -37, 11, 10, 9, -16, -12, 27, -11, -22, 16, + 24, -48, 25, -1, -3, 4, -20, 13, 39, -72, 34, 1, 2, -6, 4, -1, + -8, 2, -8, 18, -10, -1, -5, 19, -30, 5, 30, -16, -26, 36, -26, 3, + 21, -27, 10, 4, -10, 0, -4, 15, 9, -41, 32, -11, 2, -11, 15, -3, + -7, -8, 16, -3, -21, 23, -2, -9, -4, -2, 20, -5, -37, 49, -20, -6, + -9, 17, 17, -36, -8, 40, -24, -5, 3, 8, 5, -12, -6, 15, 2, -27, + 28, -4, -23, 16, 5, -1, -26, 29, 11, -38, 22, -12, -8, 38, -34, -3, + 10, 4, -2, -5, -8, 24, -16, -20, 21, 1, -7, 11, -7, -4, -15, 15, + 15, -21, -6, 10, -1, 17, -45, 23, 29, -42, 2, 18, -5, -6, -1, 22, + -20, -19, 16, 21, -20, -18, 23, 2, 5, -41, 36, 10, -34, 12, 12, -25, + 11, 1, 6, -6, -11, 20, -11, 10, -11, -12, 13, 8, -21, 5, -1, 14, + 3, -26, 5, 27, -39, 18, 7, -27, 34, -20, 13, -20, 7, -4, 25, -23, + -16, 7, 47, -35, -29, 37, 10, -35, 4, 12, -1, 0, -15, 25, -23, -12, + 35, 7, -51, 28, -1, 16, -33, 5, 27, -21, 2, -5, 13, -3, 0, -20, + 27, -30, 8, 16, -4, -13, 14, -15, 19, -12, -6, 8, -9, 19, -27, 4, + 20, -9, -12, 21, -37, 41, -22, 1, 1, 13, -33, 20, 14, -30, -2, 22, + 21, -51, 3, 38, -7, -35, 17, 6, 11, -43, 33, 9, -36, 10, 31, -24, + -13, 16, -6, 24, -36, -1, 16, 19, -45, 20, 11, 2, -30, 31, -21, -14, + 29, -4, -12, 3, -6, 9, 15, -37, 20, -4, 8, -18, 12, -7, 17, -8, + -12, -9, 23, 8, -28, 1, 29, -19, -18, 27, -2, -8, -28, 44, -4, -36, + 15, 33, -30, -13, 13, 14, -20, -7, 25, -11, -5, -8, 21, -1, -8, -37, + 50, 1, -53, 27, 28, -21, -10, 4, 16, -24, 10, 6, -12, 0, 2, 6, + 1, -13, 2, 21, -26, 3, 13, -19, 10, 9, -18, -3, 22, -18, -1, -2, + 14, -1, -23, 21, -6, -2, -9, 20, 5, -35, 1, 34, -21, -16, 22, 1, + -8, -5, 1, 18, -12, -23, 18, 5, -17, -7, 37, -6, -35, 6, 47, -44, + -7, 20, 5, -10, -23, 35, -6, -12, -12, 39, -27, -10, 9, 21, -21, -6, + 2, 5, 1, 6, -28, 17, 20, -31, -3, 15, 7, -26, 31, -40, 43, -32, + 23, -19, 11, -22, 26, -6, -1, -25, 33, 2, -25, -7, 9, 26, -16, -30, + 29, 20, -47, 13, 16, -9, -19, 18, 23, -32, -17, 32, 21, -38, -13, 14, + 43, -66, 19, 23, 5, -50, 47, -20, 2, -11, 22, -5, -6, -21, 4, 38, + -15, -32, 12, 35, -35, -4, 7, 18, -17, -1, -7, 6, 5, 0, 0, -7, + 0, -8, 21, -10, 5, -28, 30, 3, -17, -29, 57, -16, -17, -10, 28, -9, + -20, 26, -12, 3, -20, 27, -3, -7, -42, 65, -9, -45, -3, 63, -33, -11, + -6, 28, -17, -1, -6, 6, 7, -12, 0, 25, -21, -30, 54, -9, -37, 1, + 28, 7, -42, 18, 11, 17, -46, 24, -9, 27, -38, 22, -20, 23, -21, 11, + -6, 42, -71, 20, 32, -11, -43, 44, -3, -4, -27, 12, 24, -8, -18, -8, + 30, -19, -23, 44, -8, -30, 0, 45, -39, 0, -1, 28, -16, -17, -15, 44, + -13, -11, -13, 36, -24, -11, 12, 17, -30, 8, 17, -10, -18, 9, 22, -18, + -15, 3, 25, -25, 11, -6, 5, 7, -18, -3, 15, -1, -17, 8, 28, -32, + -17, 36, 8, -41, 12, 7, 13, -22, -14, 18, 41, -57, -1, 25, 10, -40, + 18, 11, -8, -23, 25, -16, 37, -45, 17, 10, 2, -60, 64, -15, -3, -16, + 22, -9, 9, -27, 30, -7, -21, 3, 20, -10, 6, -12, 15, -19, 14, -19, + 3, 22, -8, -29, 37, -28, 29, -26, 11, -15, 15, -17, 21, -26, 18, 5, + -5, -11, 2, 16, -10, -10, -5, 29, -30, 4, 3, 18, -21, 4, 1, 8, + -13, -10, 1, 40, -35, -26, 44, 5, -38, 8, 30, -24, 0, -1, 0, 12, + -18, -1, 18, -8, -28, 39, -18, 24, -35, 24, -36, 46, -41, 12, -3, 24, + -37, 31, -28, 32, -16, 2, -27, 39, -34, 7, 24, -19, -6, 14, -10, -1, + 14, -16, -4, 25, -26, -4, 8, 22, -40, 33, -30, 22, -15, 36, -63, 39, + 1, 10, -54, 36, 9, 5, -51, 49, -13, 5, -7, -7, 15, -9, -10, 2, + 12, -18, 6, 3, 18, -29, 9, 10, -10, 1, -20, 20, -3, -1, -13, 21, + -26, 41, -36, 2, 23, -23, -10, 39, -41, 17, -10, 8, 7, -13, 23, -54, + 66, -26, -50, 54, 17, -66, 59, -46, 30, -10, 6, -8, -18, 19, 16, -32, + 12, 6, -2, 3, -36, 33, -6, -7, 12, -16, 6, 14, -21, 14, 16, -58, + 37, 3, 0, -35, 44, -16, 17, -38, 28, -14, 25, -45, 28, -21, 32, -31, + 11, 17, -24, 11, 5, -24, 18, -6, -3, 0, -3, 21, -33, 24, 20, -78, + 66, -8, -24, 3, 17, -14, 24, -41, 34, -25, 27, -32, 17, -5, 13, -26, + 28, -29, 22, -8, -16, 33, -30, 2, 25, -27, 1, 31, -36, -7, 31, -8, + -12, -5, 17, -7, 5, -26, 32, 1, -18, -16, 27, -7, -10, 2, 21, -42, + 30, -3, -19, 33, -40, 19, 6, -13, -5, 17, -10, 28, -63, 40, 6, -10, + -9, 7, -3, 12, -20, -1, 17, -1, -6, -14, 18, 1, -19, 12, 5, -9, + -2, -14, 33, -3, -44, 51, -17, -6, -16, 36, -35, 29, -31, 31, -24, 15, + -23, 33, -35, 20, -4, -1, -19, 27, -1, -29, 25, 1, -20, 25, -23, -13, + 62, -50, -18, 43, -20, 1, -4, 16, -18, 4, -16, 36, -42, 42, -42, 38, + -28, 9, -10, 31, -40, 30, -39, 30, 8, -28, 11, 9, -7, -6, -8, 10, + 22, -36, -5, 26, 4, -41, 30, 12, -11, -10, -14, 37, -29, 3, -6, 9, + -5, 15, -30, 40, -26, 12, -25, 25, -21, -12, 46, -17, -39, 47, 7, -57, + 45, -14, 1, -13, 21, -21, 14, -7, 7, -11, 18, -34, 25, 7, -28, 22, + 1, -12, 11, -24, 4, 38, -44, 17, 2, -12, 19, -17, 0, 9, 17, -55, + 29, 3, 3, -27, 48, -38, 16, -17, 24, -19, 26, -49, 29, 9, -18, -25, + 50, 2, -31, -20, 43, -3, -35, 23, 13, -34, 9, 20, -15, -8, 29, -37, + 29, -21, 4, -8, 36, -52, 29, -8, 6, -18, 35, -34, 22, -21, 10, 5, + -11, -13, 35, -26, -3, 12, -17, 13, 1, -12, -4, 24, -18, -6, 18, -7, + -13, 17, -4, -30, 48, -41, 10, 34, -39, -22, 73, -48, -12, 12, 22, -14, + -31, 18, 29, -17, -21, 22, -3, -8, -12, 25, -11, 13, -41, 36, -3, -2, + -27, 37, -6, -36, 17, 18, -7, -10, 4, -5, 10, -21, 13, 15, -21, 2, + -1, -5, 8, -1, -16, 29, -24, 14, -18, 26, -24, 17, -26, 21, -18, 24, + -49, 82, -52, -11, 36, -22, -17, 30, -21, 1, 1, -1, 8, -2, -7, 2, + 17, -9, -36, 37, -5, -15, -4, 27, -20, 11, -31, 46, -18, -13, -11, 58, + -67, 19, -4, 40, -43, 9, -14, 41, -32, -16, 46, -19, -13, 5, -5, 6, + 2, -16, 10, -9, 18, -13, 3, 24, -37, 11, 1, 0, -8, -9, 28, -1, + -41, 40, -10, 6, -13, 1, -11, 30, -28, -10, 30, 1, -36, 17, 28, -54, + 51, -24, 1, -6, 6, -12, 33, -48, 23, 18, -17, -23, 27, 11, -23, -13, + 27, -7, -1, -24, 35, 3, -48, 35, 8, -20, -3, 3, 16, -11, 8, -35, + 32, 7, -27, -22, 81, -85, 36, -7, 16, -16, 2, 0, 13, -28, 12, -16, + 24, 6, -25, -14, 47, -15, -25, 3, 37, -41, -5, 32, -25, 11, 6, -16, + 25, -34, 14, 8, 13, -52, 30, 6, 13, -56, 56, -27, 13, -11, -6, 16, + -12, -1, 18, -40, 18, 19, -13, -11, 7, -2, 9, 10, -39, 9, 46, -48, + -18, 59, -32, -3, 14, -10, 10, -13, 10, -13, 14, -11, -10, 5, 31, -43, + 10, 23, -16, 3, -29, 50, -23, -19, 16, 15, -19, 3, -20, 39, -19, -14, + -6, 54, -44, -12, 18, 30, -56, 28, -15, 22, -16, -15, 31, -8, -9, -1, + 1, 1, 2, -8, 9, 10, -43, 41, -9, 8, -48, 62, -30, -9, 13, 6, + -24, 32, -31, 8, -4, 16, -27, 27, -19, -1, -6, 37, -40, 14, -3, 0, + 25, -59, 34, 18, -18, -21, 17, 13, -11, -8, -11, 43, -40, 1, 6, 24, + -37, 10, 14, -4, -12, -2, 17, 11, -40, 10, 16, 17, -51, 24, 14, -4, + -31, 22, 18, -32, 15, -24, 46, -38, 9, 2, -2, 14, -15, -12, 15, 3, + -28, 29, -7, -6, 13, -7, -6, 2, 3, -17, 28, -28, -9, 37, -17, 0, + 3, 10, -19, -5, 19, -17, 12, -25, 30, -19, 8, -27, 49, -15, -27, 9, + 10, 7, -31, 6, 30, -12, -45, 41, 24, -42, -1, 28, -2, -38, 29, -18, + 23, -4, -43, 35, 26, -54, 23, 7, 6, -30, 17, -14, 32, -40, 24, -13, + 17, -15, -11, 16, 16, -20, -26, 47, -10, -26, -6, 41, -19, -22, 36, -41, + 33, 5, -32, 12, 28, -51, 19, 27, -40, 7, 35, -34, 9, -22, 42, -20, + -15, -3, 43, -55, 15, 23, -10, -11, 3, 14, -32, 31, -26, 21, 7, -44, + 15, 40, -22, -41, 54, -17, -17, 8, -6, 10, 11, -17, -6, 15, -2, -20, + 31, -19, 4, -17, 22, 0, 2, -36, 39, 0, -31, 23, -38, 59, -15, -29, + -13, 69, -50, -22, 43, -11, -16, 0, 16, -9, -10, 13, 5, -8, -18, 27, + -8, -2, -12, 13, -1, -16, 16, -18, 27, -11, -19, 39, -28, -26, 28, 36, + -85, 72, -40, 24, -10, 0, -9, 30, -29, -11, 22, -13, -7, 23, -10, -14, + 6, 13, -15, 22, -31, 12, 0, 0, -3, -15, 19, 14, -21, -22, 27, 35, + -72, 36, -3, 18, -54, 50, -29, 38, -47, 14, 19, -11, -25, 27, 9, -23, + -2, 2, 16, -6, -24, 22, 10, -27, 7, 16, -30, 11, 24, -40, 31, -28, + 29, 1, -28, 7, 17, 3, -45, 40, -11, -7, 4, 19, -45, 24, 24, -50, + 48, -35, 11, 9, -12, -14, 30, -23, 8, 7, -15, -7, 53, -59, 13, 5, + 15, -46, 49, -48, 57, -36, -20, 34, 1, -10, -15, 15, 20, -36, -9, 35, + 6, -39, 7, 14, 27, -81, 70, -21, 5, -22, 21, -6, 1, -13, 19, -19, + 4, -10, 35, -43, 31, -3, -7, -15, 40, -56, 33, -1, -33, 51, -35, -2, + 24, -18, 5, 0, 4, -16, 10, -6, 9, -28, 37, -38, 45, -35, 0, 37, + -38, 7, 19, -32, 3, 17, -2, -23, 19, 15, -23, 5, -2, 13, 1, -37, + 8, 59, -80, 26, 13, 15, -31, -8, 30, -7, -7, -19, 22, -2, -9, -2, + 12, -7, 3, 1, -25, 47, -53, 35, -5, -27, 21, 15, -25, 13, -24, 42, + -41, 19, 2, -13, 1, 23, -40, 37, -45, 46, -8, -41, 44, -11, -17, 23, + -9, -20, 22, -3, -15, 22, -23, 19, -7, 2, -34, 65, -56, 7, 28, -8, + -37, 37, 3, -8, -34, 39, -11, 9, -29, 6, 35, -14, -49, 48, 5, -25, + 5, -25, 66, -47, -9, 28, -7, -12, 0, 17, -20, -2, 21, -12, -23, 54, + -50, 20, 7, -20, 7, -2, 3, 4, -26, 26, -6, -14, 15, -3, -10, 12, + -10, -4, 23, -33, 14, -12, 38, -55, 36, 0, -6, -5, 0, -4, 7, 0, + -14, 2, 8, -11, 13, 5, -33, 41, 4, -62, 40, 8, -6, -8, -31, 52, + -4, -44, 25, 20, -18, -24, 32, -11, -9, -4, 30, -37, 34, -31, 7, 30, + -29, -14, 28, -10, -9, 6, 0, -5, 14, -9, -3, -2, 10, -22, 29, -22, + -2, 6, -5, 16, -25, 6, 27, -19, -9, -11, 29, -13, -5, -6, 16, 5, + -20, -1, 30, -20, -8, 7, -8, -2, 3, 14, -9, -24, 35, -7, -14, -12, + 32, -5, -18, -15, 35, -7, -13, -1, -4, 27, -20, -30, 58, -15, -29, 9, + 15, -16, -3, 1, 4, 5, -4, -11, 17, 3, -29, 28, -10, -18, 20, -7, + -2, 4, 2, -17, 22, -3, -31, 23, 23, -32, -14, 34, -3, -14, -13, 11, + 21, -26, -16, 36, -7, -13, 15, -8, -3, -1, -11, 15, -8, -4, -4, 24, + -21, 1, 11, 3, -22, 5, 15, -24, 0, 37, -31, 7, -18, 15, 16, -15, + -19, 26, 0, -10, -26, 31, 6, -19, -6, 21, -19, 20, -13, -3, 13, -2, + -32, 24, 2, -8, -10, 36, -29, -10, 19, 10, -25, 5, -9, 31, -23, -21, + 21, 26, -25, -9, -5, 35, -17, -34, 17, 42, -44, -11, 30, 11, -40, 18, + 8, -6, -11, 11, -26, 39, -18, -23, 37, -12, -32, 45, -8, -22, 5, 16, + -15, -10, 6, 17, -15, -3, 9, -22, 41, -22, -25, 29, 5, -30, 6, 12, + 17, -32, 7, 20, -26, 9, 9, -10, 7, -17, 10, 11, -16, -7, 12, 5, + -4, -26, 25, 24, -46, -4, 50, -39, -11, 8, 35, -36, 2, -9, 33, -7, + -22, -26, 76, -37, -41, 33, 28, -43, 14, 6, 2, -8, 2, -20, 34, -19, + -2, -4, 15, -6, -23, 28, -3, -32, 33, -16, 7, -11, 14, 9, -10, -30, + 35, -25, 17, -14, 1, 14, 12, -38, 16, 15, -7, -30, 15, 18, -24, -6, + 47, -38, 6, 7, -9, -2, -3, 1, 12, -8, -23, 20, 35, -47, -14, 51, + -9, -48, 19, 20, 0, -25, -2, 20, 16, -29, -25, 60, -17, -23, -8, 31, + -4, -30, 12, 20, -14, -4, -1, 17, -11, -9, 7, 7, -17, 1, -12, 25, + -5, -20, 15, 19, -29, 2, 5, 11, -19, -18, 31, 1, -27, 18, -17, 51, + -53, -2, 29, 4, -37, 17, 11, -11, -23, 41, -17, -10, 13, -4, -8, 18, + -27, 17, 1, -19, -7, 51, -37, -28, 53, 4, -47, 5, 18, 17, -32, -8, + 14, 36, -46, 3, 11, 11, -24, 4, 0, 16, -7, -26, 25, 20, -44, 7, + 20, -12, 2, -14, 4, 33, -38, 1, 8, 20, -34, -12, 61, -46, -19, 44, + -10, -4, -18, 12, 12, -8, -26, 16, 22, 2, -51, 18, 53, -56, -5, 30, + -9, -22, 32, -11, -18, 18, 13, -25, -7, 8, 9, 3, -20, 1, 32, -27, + -9, 5, 19, -20, -13, 18, 8, 3, -35, 22, 31, -47, -2, 16, -8, 15, + -10, -22, 54, -20, -23, -6, 51, -52, -13, 48, -23, -11, 28, -30, 38, -6, + -50, 28, 33, -58, 2, 34, 16, -53, -1, 55, -13, -42, 15, 23, -7, -33, + 13, 21, -14, -6, 2, -2, 27, -43, 27, 11, -19, -16, 26, -16, -4, 16, + -17, 1, 20, -17, 8, -17, 6, 26, -25, -24, 40, -13, 6, -14, -14, 29, + 3, -32, -5, 46, -21, -28, 38, -30, 6, 28, -47, 3, 65, -67, -5, 61, + -34, -27, 31, 12, -30, -7, 11, 19, 0, -43, 18, 47, -52, -20, 52, -14, + -9, -10, -5, 55, -45, -29, 55, 16, -83, 28, 36, -23, 6, -8, -13, 37, + -17, -30, 32, -9, -6, 10, -19, 16, 4, 9, -35, 22, -1, -17, 3, 8, + 10, -10, -21, 40, -27, -5, 16, -6, -27, 47, -23, -26, 48, -18, -19, 14, + -1, -9, 5, 1, -20, 58, -57, -14, 55, -16, -40, 37, -6, 11, -19, -22, + 43, 2, -55, 27, 37, -38, -29, 58, -6, -11, -22, 4, 26, -7, -67, 67, + 21, -56, 19, 15, -5, 0, 2, -41, 37, 10, -65, 49, 8, 1, -19, 1, + 9, 8, -20, -9, 22, -14, -3, 4, -1, 13, -6, -11, 15, -8, -15, 13, + 16, -38, 14, 24, -39, 20, 9, -17, 14, -15, 7, 3, -12, -3, 30, -25, + -24, 43, -1, -40, 18, 17, 0, -22, -14, 31, 20, -68, 35, 32, -43, -9, + 35, -16, 4, 2, -35, 35, 27, -81, 40, 31, -21, -30, 29, -12, 13, 10, + -42, 26, 17, -33, -1, 16, 12, -29, 6, 4, 21, -27, -9, 39, -6, -54, + 40, -14, 15, -4, -17, 20, 4, -18, -4, 23, -24, -3, 30, -41, 15, 17, + -4, -29, 19, 4, -9, -10, 12, 17, -21, -7, 26, -19, -17, 17, 3, 1, + -3, -30, 47, 16, -62, -4, 68, -29, -54, 43, -1, -4, 20, -42, 22, 34, + -32, -43, 63, -12, -26, 8, -6, 10, 22, -66, 55, 25, -65, 15, 9, 21, + -22, -28, 36, 5, -16, -51, 102, -49, -12, 6, 21, -12, -23, 24, -15, 11, + -14, -8, 31, 4, -53, 64, -35, 13, -28, 23, -23, 22, -16, 13, -22, 23, + 27, -51, -8, 41, 6, -66, 36, 13, 4, -26, 7, 11, 9, -34, 0, 35, + -21, -15, 10, 34, -57, 60, -69, 60, -22, 1, -27, 27, 14, -27, 1, -13, + 35, -2, -51, 36, 35, -49, 5, -1, 31, -42, 25, -26, 34, -7, -60, 98, + -46, -22, -1, 49, -45, -2, 10, 26, -33, 25, -36, 37, -19, 4, -3, -7, + 9, 7, -8, -29, 48, -23, 0, -33, 45, 0, -23, -16, 47, -7, -31, -9, + 38, -2, -36, 18, -8, 43, -55, 16, -1, 41, -72, 54, -35, 24, 4, -46, + 47, -11, 6, -40, 24, 10, 8, -38, 16, 16, 24, -98, 80, 2, -28, -28, + 44, 11, -47, 31, -7, 35, -42, -25, 41, 12, -64, 34, 14, -2, -21, 24, + -14, 11, -3, -24, 22, -28, 46, -51, 38, -22, 35, -40, 2, 11, 22, -48, + 23, -9, 34, -35, -24, 52, -7, -37, 9, 36, -21, 0, -32, 61, -44, 6, + -1, -16, 41, -28, 19, -37, 49, -11, -38, -8, 65, -53, 9, -21, 59, -37, + 8, -33, 59, -13, -80, 67, 19, -39, -28, 70, -21, -25, -3, 23, 17, -29, + -44, 83, -41, 0, -23, 53, -27, -12, 21, -19, 21, -21, 13, -4, -12, -5, + 38, -58, 34, 10, -22, -16, 47, -8, -39, 19, 12, 4, -46, 39, -24, 48, + -69, 45, -18, 10, -5, -2, -4, 10, -5, 7, -17, -3, 20, 0, -40, 26, + 40, -64, 11, 34, 1, -49, 11, 35, -22, -14, -32, 98, -47, -37, 9, 76, + -70, -8, 7, 63, -92, 56, -49, 77, -64, 2, 41, -28, -25, 37, 0, -26, + 35, -40, 16, 3, 14, -46, 22, 18, -6, -9, -11, 22, 26, -44, -46, 94, + -60, 18, -37, 69, -33, 5, -20, 42, -32, -20, 24, -1, -10, -12, 39, -31, + 13, 1, 9, -47, 42, -26, 39, -73, 48, 48, -73, -13, 56, 14, -78, 38, + 11, 12, -50, 8, 39, 3, -79, 73, 2, -25, -17, 23, 27, -58, 26, -37, + 67, -49, 11, -12, 62, -82, 64, -41, 3, 26, -17, -45, 55, -4, -22, 10, + -2, 38, -54, 8, 5, 47, -79, 7, 54, -7, -64, 41, 49, -73, 29, -24, + 54, -51, -4, 14, 33, -84, 82, -46, 17, -25, 57, -44, -2, 11, 8, 15, + -66, 46, 19, -25, -44, 58, 10, -38, -23, 77, -48, -3, -12, 24, 24, -70, + 37, 21, -15, -48, 81, -66, 44, -29, 6, 4, 9, -30, 31, -24, 5, 19, + -51, 34, 21, 11, -92, 78, 19, -44, -54, 104, -47, -8, -19, 29, 45, -78, + 6, 55, -11, -75, 66, -10, 8, -38, 24, 10, 4, -57, 66, -20, -25, 20, + 6, 9, -71, 100, -60, -6, 8, 28, -37, 29, -42, 78, -58, -22, 42, 10, + -69, 34, 33, -36, 29, -54, 81, -54, 0, 7, 1, -19, 22, -14, 4, -3, + 32, -13, -59, 86, -54, 4, 0, 21, -35, 43, -68, 91, -31, -53, 38, 48, + -72, -15, 50, 3, -11, -72, 96, -1, -49, -23, 81, -21, -57, 15, 63, -67, + 5, 25, -27, 34, -48, 49, -26, 12, -33, 66, -73, 14, 35, -20, -27, 45, + -24, 12, -12, 0, 24, -50, 33, -26, 45, -65, 47, -7, -4, -9, 19, -19, + -2, 15, -17, 30, -39, 25, 2, -3, -57, 109, -86, 10, 14, 31, -53, 7, + 32, 5, -44, -20, 84, -35, -34, -6, 99, -97, 1, 23, 40, -65, 15, 9, + 36, -45, -22, 55, 4, -55, -3, 73, -80, 63, -49, 28, 2, -10, -19, 24, + -13, 8, 1, -15, 5, 22, -4, -57, 72, -41, 16, -45, 76, -57, 30, -26, + 38, -16, -34, 32, 12, -53, 22, 47, -46, -4, 6, 45, -65, 32, -21, 45, + -44, -22, 69, -44, -16, 29, 19, -59, 40, -7, 42, -77, 39, -4, 29, -74, + 27, 38, -12, -60, 69, 7, -32, 1, -9, 50, -56, -15, 19, 47, -75, 44, + 5, -22, 27, -7, -22, 0, 23, -30, 1, 4, 33, -44, 29, -24, 57, -67, + 17, 18, 4, -59, 32, 48, -72, 28, -2, 13, -10, -21, 16, 58, -117, 85, + -14, -5, -34, 21, 29, -27, -20, 31, 23, -49, 16, -14, 51, -74, 24, 38, + -38, -16, 56, -33, -7, 3, 0, 36, -80, 49, 23, -19, -48, 76, -61, 43, + -41, 27, -11, 23, -30, 8, 3, 15, -14, -22, 16, 3, 15, -39, 11, 38, + -13, -70, 88, -41, 2, 4, -30, 80, -84, 15, 37, -6, -61, 58, -19, 27, + -72, 64, -6, -16, -30, 59, -21, -21, -12, 44, 22, -101, 78, -10, -16, -11, + 20, -21, 31, -36, 37, -18, -20, 46, -24, -23, 10, 21, -36, 32, -38, 68, + -50, 12, -6, 19, -33, 14, -16, 20, -11, -14, 47, -59, 56, -14, -27, 5, + 29, -43, 49, -96, 106, -35, -41, 28, 35, -30, -29, 37, 12, -11, -58, 79, + -31, -16, -11, 43, -13, -25, 3, 71, -76, -13, 64, -39, 3, -45, 66, -13, + -1, -45, 80, -40, 6, -29, 26, -12, 6, -19, 21, -4, 9, 0, -37, 44, + -28, 11, -22, 19, 7, 1, -45, 60, -13, -42, 32, -16, 31, -50, 35, 10, + -22, -23, 60, -62, 21, -2, 39, -49, -4, 24, 30, -53, -23, 66, -33, 2, + -34, 69, -33, -10, 7, 24, -51, 28, 0, 9, -24, -3, 38, -24, -16, -9, + 68, -81, 38, -16, 35, -34, -4, 16, 20, -43, 10, 7, -3, 14, -30, 38, + -39, 38, -20, -12, -20, 78, -79, 22, -4, 44, -48, -6, 37, -2, -25, -24, + 60, -41, 15, -30, 50, -43, 7, 9, 27, -64, 45, 5, -15, -17, 1, 49, + -56, 3, -11, 69, -78, 37, -5, 38, -60, 26, -2, 9, -51, 53, -20, -3, + 9, -1, 38, -74, 40, 6, -13, -54, 69, -24, 6, -22, 31, 0, -17, 12, + -13, 8, -9, 20, -53, 56, -27, 29, -63, 41, 8, 11, -73, 59, 15, -25, + -21, -1, 61, -69, 10, 17, 28, -59, 34, -14, 32, -54, 17, 22, -11, -47, + 63, 7, -56, 46, -28, 50, -96, 60, 2, 0, -37, 36, -11, 15, -38, 41, + -19, -31, 46, -12, -25, 9, 49, -67, 47, -48, 51, -30, -15, 23, 19, -43, + 8, 17, 4, -11, -29, 54, -48, 38, -28, 10, -9, 38, -48, 27, -47, 55, + 3, -59, 22, 41, -5, -59, 38, 5, 31, -101, 72, 11, -36, -18, 54, -25, + -1, -30, 54, -28, -34, 61, -27, 13, -46, 55, -21, -10, -21, 52, -34, -8, + 30, -21, 20, -11, -21, 22, -2, -46, 79, -84, 60, -9, 13, -57, 51, 2, + -16, -38, 34, 15, -23, -7, -6, 53, -38, -22, 29, 23, -63, 65, -34, -21, + 34, -7, -19, -8, 24, 13, -8, -63, 110, -56, -8, -37, 79, -56, -3, -3, + 62, -57, 19, 9, 8, -20, -29, 27, 13, -28, -19, 79, -80, 58, -31, 24, + -16, -35, 46, 0, -52, 36, 21, -29, 16, -23, 26, -29, 38, -42, 26, -41, + 60, -29, -16, -4, 42, 7, -85, 53, 47, -54, -29, 67, -53, 39, -58, 45, + -5, 5, -37, 61, -56, 27, 17, -40, 1, 15, 17, -43, 19, 4, 30, -49, + 12, -1, 49, -64, -27, 96, -41, -47, 45, 8, -38, 35, -50, 74, -81, 54, + -14, 24, -64, 57, -5, -25, -19, 27, 16, -27, 4, 16, 2, -25, 26, -31, + 22, -35, 56, -54, 0, 55, -23, -29, 9, 38, -38, 12, -41, 74, -28, -29, + -3, 61, -71, 36, -32, 43, -19, -14, 21, 0, -10, -19, 32, -42, 20, 11, + 23, -94, 107, -13, -53, 5, 35, -17, -11, -25, 32, 40, -76, 29, 32, -9, + -65, 80, -42, 6, -22, 42, -27, -2, 10, -2, 13, -41, 32, 10, -17, -26, + 53, -50, 40, -42, 30, -19, 41, -50, 33, -20, -1, 40, -67, 8, 29, 15, + -58, 25, 32, 15, -81, 46, 14, -8, -51, 24, 40, -44, 17, 10, 2, -26, + 47, -68, 49, -49, 50, -27, -3, -20, 84, -62, -32, 52, 12, -52, 0, 42, + -30, 24, -47, 45, -16, 11, -51, 74, -47, -9, 45, -19, -18, -5, 41, -39, + 11, -33, 56, -20, -14, -8, 64, -85, 60, -23, -13, -3, 33, -20, -25, 57, + -34, 2, -23, 42, -21, 3, -49, 85, -35, -27, 1, 54, -34, -31, 24, 15, + 6, -45, 54, -30, 12, -27, 40, -61, 39, 1, -5, -18, 17, 14, 7, -33, + -27, 83, -44, -40, 21, 66, -82, 32, -7, 33, -54, 27, 3, 2, -13, -15, + 52, -57, 14, 14, -6, -27, 54, -45, 23, -11, 16, -27, 27, -33, -3, 36, + -46, 47, -15, -8, -7, 67, -93, 12, 34, 17, -73, 32, 15, 29, -44, -17, + 47, 2, -40, -31, 81, -43, 3, -24, 52, -32, 4, 1, 20, -48, 20, 40, + -68, 23, 14, 19, -64, 46, -8, 17, -48, 55, -29, 23, -59, 48, -2, -27, + 11, 1, 21, -30, 25, -24, 29, -41, 21, 0, -15, -17, 64, -47, 1, 31, + -22, 2, -11, 22, -56, 69, -53, 32, -30, 31, -16, 32, -68, 29, 42, -39, + -49, 80, 17, -74, 17, 0, 55, -88, 25, 29, 14, -72, 56, 0, 0, -33, + 20, 5, -34, 35, -33, 45, -37, 23, -9, 10, -54, 67, -22, -13, -15, 41, + -14, -16, 8, 0, 19, -51, 56, -51, 39, -20, 19, -34, 26, -18, 19, -31, + 23, 0, 12, -31, 7, 45, -65, 22, 4, 24, -73, 74, -13, -34, 18, 23, + -16, -25, -2, 40, 5, -84, 76, -4, 6, -74, 75, -7, -10, -51, 60, -13, + 0, -45, 50, 18, -57, 20, 21, -7, -26, 47, -51, 28, -19, 12, -13, 3, + -1, 20, -23, 1, 28, -18, 3, -41, 67, -72, 34, -11, 33, -47, 47, -9, + -20, -2, 28, -21, -27, 11, 26, -15, -25, 57, -44, 46, -67, 49, -5, -30, + 1, 42, -36, -9, 22, 7, -13, -34, 67, -29, -16, -26, 84, -49, -21, -11, + 77, -53, -43, 62, 0, -3, -32, 23, 13, -5, -69, 88, -42, 7, -17, 37, + -35, 27, -6, -13, -11, 31, -17, -28, 45, -17, 8, -32, 41, -48, 39, -35, + 41, -16, -28, 41, -3, -13, -26, 23, 12, -22, -50, 104, -57, 9, -28, 67, + -53, -7, 0, 45, -41, -22, 50, -8, -21, -9, 38, -19, -18, -2, 55, -76, + 38, -12, 39, -49, -14, 64, -24, -45, 25, 50, -66, 23, -15, 32, -36, 32, + -46, 44, -14, 2, -16, 22, -7, -11, 14, -28, 21, 4, -10, -18, 63, -66, + 30, -20, 36, -35, -16, 26, 12, -37, 6, 50, -35, -15, 6, 48, -64, 4, + 12, 46, -85, 33, 12, 25, -49, -11, 77, -53, -18, 19, 29, -41, -1, 3, + 39, -70, 55, -6, -1, -23, 38, -22, -12, 1, -11, 36, -39, 5, 15, 33, + -55, 32, -8, 6, -37, 39, -32, 4, 27, -23, 11, -1, 10, -28, 19, -24, + 52, -69, 27, 21, 11, -72, 52, 17, -35, -13, 16, 33, -44, 4, 19, 18, + -60, 13, 35, 12, -93, 82, 9, -35, -20, 26, 40, -74, 14, 18, 28, -66, + 37, 4, 9, -43, 34, -15, 17, -35, 38, -11, -14, 14, -5, 2, -36, 54, + -35, 2, 1, 29, -35, 9, -4, 24, -32, -5, 31, -19, -17, 28, 34, -86, + 49, 13, -16, -52, 71, -29, 3, -30, 51, -1, -36, 6, 25, 4, -75, 56, + 10, -21, -18, 37, -16, 17, -53, 60, -7, -38, -9, 63, -18, -70, 67, 1, + -19, -32, 50, -20, 11, -23, 24, -10, -3, -21, 32, -26, 7, 12, -19, 35, + -29, 26, -41, 32, -22, 14, -43, 41, 7, -16, -24, 57, -20, -35, 25, 7, + -11, -20, 31, -18, 10, -34, 44, -7, -22, -9, 49, -33, -18, 26, -4, 12, + -63, 51, 11, -16, -40, 80, -28, -37, 5, 61, -78, 22, 16, -3, -10, -5, + 26, -8, -2, -43, 68, -42, -24, 39, 11, -31, 15, -9, 18, -20, -1, 7, + -17, 26, -30, 31, -31, 42, -28, -1, -15, 49, -51, -2, 26, 3, -12, -11, + 7, 22, -9, -51, 70, -27, -14, -13, 53, -37, -12, 9, 44, -57, -14, 51, + -6, -27, -10, 60, -55, 2, 14, 18, -45, 32, -19, 29, -27, -12, 31, 14, + -54, 17, 41, -62, 51, -40, 40, -40, 12, -8, 28, -39, 16, 10, 10, -46, + 37, 12, -42, 17, -4, 2, -17, 35, -34, 38, -30, 21, -6, -36, 36, 13, + -56, 14, 53, -36, -13, -1, 61, -64, 7, -3, 54, -63, 5, 14, 34, -67, + 10, 46, -27, -18, 26, 20, -41, 14, -13, 40, -66, 20, 38, -34, -11, 39, + -16, 11, -26, 7, 28, -58, 26, 0, 30, -61, 44, 11, -30, -17, 66, -40, + -33, 35, 6, -21, -2, 9, 16, -13, -39, 79, -71, 27, 9, -9, -29, 28, + 4, -17, 1, 14, 2, -20, -2, 16, 24, -67, 20, 37, -4, -80, 75, 18, + -46, 2, 10, 25, -31, -28, 43, 19, -75, 59, -13, 14, -40, 29, 7, -22, + -20, 44, -20, -16, 10, 32, -21, -42, 61, -19, -29, 12, 39, -55, 32, -4, + 0, -2, -24, 40, -19, -38, 34, 22, -33, 11, -3, 31, -49, 21, -16, 40, + -54, 12, 29, -19, -8, 17, 17, -52, 28, 22, -39, -2, 45, -42, 23, -46, + 51, 11, -68, 26, 55, -34, -44, 45, 9, -19, -43, 57, -16, -5, -9, 40, + -24, -12, 8, 29, -54, -4, 50, -37, 0, 11, 7, -4, 0, -25, 57, -62, + 19, 18, -7, -22, 12, 19, -27, 9, -5, 15, -19, 2, 15, 4, -45, 36, + -5, 8, -48, 60, -13, -35, 36, -19, 21, -24, -7, 23, -24, -22, 73, -58, + -5, 34, 25, -71, 19, 30, 0, -43, -4, 50, -9, -21, -21, 69, -28, -46, + 24, 29, -45, 12, 3, 21, -13, -28, 47, -9, -37, 21, 22, -46, 21, 8, + -1, -32, 42, -22, 14, -27, 19, 16, -29, 3, 17, -1, -39, 28, 21, -42, + 8, 47, -45, 2, -16, 50, -20, -54, 50, 9, -25, -12, 41, -29, 8, -3, + -5, -13, 25, -16, 19, -30, 15, 15, -2, -52, 38, 38, -69, 12, 37, 9, + -54, 10, 36, 5, -79, 27, 57, -35, -40, 48, 21, -41, 13, -3, 10, -29, + 4, 18, 4, -50, 52, 1, -28, -6, 41, -25, -22, 34, -22, 10, -5, 3, + -6, -1, 2, 26, -48, 24, 12, 5, -54, 36, 18, -32, -6, -3, 48, -28, + -21, 22, 35, -63, 6, 43, -28, -27, 42, -7, -22, 6, 21, 8, -56, 31, + 23, -10, -73, 76, 18, -49, -26, 70, -21, -23, -8, 35, 0, -42, 7, 42, + -26, -28, 47, -31, 0, 13, 11, -25, 14, -6, 10, -13, -26, 40, -14, -5, + -8, 42, -36, 1, 15, -10, -34, 47, -24, 5, -22, 38, 14, -39, -10, 53, + -26, -67, 72, 0, -15, -25, 29, 19, -29, -25, 50, -14, -31, 10, 42, -44, + -24, 81, -40, -32, 12, 45, -41, -5, -1, 47, -27, -54, 54, 32, -64, 4, + 26, 1, -1, -41, 44, 4, -22, -22, 47, -30, 7, 5, 3, -37, 45, 1, + -53, 44, -1, -20, 7, 12, -13, 9, -23, 26, -2, -47, 32, 37, -61, 6, + 42, 0, -25, -43, 76, -23, -38, -10, 73, -24, -57, 47, 45, -70, 3, 19, + 7, -19, -8, 10, 24, -12, -36, 66, -60, -1, 50, -32, -19, 8, 26, 2, + -44, 11, 53, -42, -26, 20, 42, -52, 14, 16, -26, -11, 42, -41, 16, 16, + -23, 13, 1, -6, 17, -18, -41, 71, -39, -23, 40, 13, -30, 2, 19, 0, + -39, 10, 24, -15, -25, 12, 66, -81, 6, 47, 9, -69, 12, 47, -9, -36, + -27, 76, 9, -107, 58, 53, -68, 19, -10, 39, -49, 8, 14, -11, -17, 21, + 18, -25, -17, 47, -4, -48, 32, -9, -4, -3, 8, -5, 29, -40, 13, 14, + -31, 24, 7, -48, 27, 37, -61, 22, 15, 7, -46, 17, 10, 22, -45, -9, + 56, 1, -73, 43, 34, -51, -15, 40, 2, -47, 35, 8, 27, -87, 31, 86, + -94, -27, 67, 10, -44, -15, 43, 11, -46, 6, 9, 33, -71, 35, 26, -30, + -18, 37, -18, -9, 20, -15, 1, 5, 9, -2, -23, -11, 50, -42, -3, 24, + 6, -21, 17, -5, -8, 11, -26, 24, -19, -9, 33, 22, -78, 38, 44, -48, + -53, 80, 6, -66, 14, 36, 8, -37, -15, 66, -24, -75, 87, -14, -27, -10, + 45, -12, -38, 13, 33, 7, -67, 20, 75, -55, -67, 85, 8, -52, -11, 45, + -10, 13, -34, 12, 26, -36, 7, -1, -1, -7, 23, -27, 18, 15, -12, -28, + 27, -6, 9, -52, 40, 26, -50, 3, 51, -10, -71, 67, 10, -59, 4, 56, + -27, -20, -19, 58, 6, -81, 38, 49, -39, -39, 47, 14, -25, -40, 54, -2, + -20, -38, 82, -25, -51, 44, 24, -60, 8, 51, -47, -2, 6, 22, 9, -34, + -20, 78, -56, -25, 36, 19, -49, 17, 32, -50, 44, -29, 4, -11, 14, 3, + -13, -11, 19, 13, -24, 28, -32, 33, -37, 39, -61, 119, -76, 120, -70, 99, + -122, 89, -113, 91, -123, 122, -123, 77, 86, -116, 6, -118, 123, -23, 64, -93, + 17, 24, -125, 124, -125, 124, -24, -12, 56, 87, -54, 38, -91, 64, -2, -41, + 126, -127, 20, 8, -48, -62, 127, -128, 88, -43, -18, 86, -100, 44, -32, -26, + 71, -13, 6, 51, -33, -50, 106, -59, 33, 5, -20, 69, -56, 54, -48, -6, + 38, -5, -38, 35, -1, 12, -1, 4, 23, -56, 19, -7, 5, -4, 31, -38, + 3, -12, -9, -25, -7, 24, -32, 17, -21, -22, 24, -20, 6, -18, 0, -15, + 5, -16, 15, 3, 2, -10, 3, 27, -31, 37, -12, 32, -5, 2, -21, 27, + -14, 20, -8, 5, 15, -7, -11, 20, -37, 7, -23, 17, -22, 11, -14, 8, + -44, 39, -52, 26, 3, 14, -10, 51, -45, 29, -19, 19, -3, 41, -21, 46, + -23, 10, 16, -25, 3, 7, -30, 19, -9, -5, -1, 1, -19, 1, -24, -23, + 51, -48, -10, 17, -34, -38, 60, -71, 26, -43, 65, -59, 70, -26, 61, -51, + 63, -51, 42, -25, 58, -36, 31, 10, -14, -9, 8, -18, 8, 4, 8, 7, + 31, -52, 39, -53, 53, -56, 24, 11, 1, -20, -8, -32, -18, -10, -25, 4, + 1, 37, -37, 42, -42, 53, -57, 52, -18, 30, 11, 20, -52, 55, -61, 56, + -50, 24, -26, 38, -42, 36, -1, -43, 58, -46, 6, 18, -35, 31, -36, 28, + -55, 55, -98, 52, -41, 26, -24, 48, -31, 48, -26, 30, 19, -17, 23, -8, + 13, 15, 19, -7, -23, 41, -36, 20, -39, 65, -64, 66, -38, -9, 7, -14, + -10, -3, 6, 15, -19, -40, 53, -67, -11, -12, -25, 23, -11, -12, 46, -48, + 39, -20, 20, -14, 31, -54, 71, -25, 2, -8, -5, -9, 1, 7, 27, 17, + -14, 43, -31, 27, 11, -33, 20, -2, -33, 45, -38, 17, -9, -11, -17, -22, + -19, 20, -25, 4, 29, -35, 14, -17, 1, -7, 19, 2, 16, 32, -3, -17, + 4, 0, -9, 17, 5, -8, 52, -32, 40, -39, -5, -18, 14, -21, 31, 10, + -17, 8, -34, -7, 1, -44, 7, 10, -8, -6, -18, -25, -1, -19, 16, -29, + 62, 6, 9, 21, 0, -14, 4, 5, 20, 13, 27, -1, 18, -5, 21, -31, + 11, 2, -9, -4, 21, -27, 8, -21, -28, -19, 14, -12, 5, -20, 20, -36, + 4, -18, -27, -4, -4, 15, 4, 48, -7, -11, 20, -6, 7, 20, 1, 20, + 0, 35, -35, 28, -37, 7, -43, 21, -22, 23, -18, 12, -22, -13, -20, -11, + 7, 23, -10, 19, -18, 17, -41, 4, -16, -8, 21, 11, -4, 10, 30, -24, + 32, -15, 15, -13, 28, -5, 38, -10, 0, -22, -13, -12, 24, -18, 30, -7, + 4, -16, 27, -28, -3, -1, 18, -14, 31, -24, -3, -13, -19, -36, -2, -31, + 9, -2, -12, 17, 12, -50, 46, -49, 43, -15, 13, 22, 15, -25, 10, -8, + -6, 14, -2, 24, 15, 9, 17, -13, 5, 14, -15, 7, 20, 4, 4, 18, + -16, 3, -47, 31, -46, 19, -24, 5, -19, -1, -42, 14, -44, 18, -7, -1, + 15, 9, -35, 32, -44, 39, -46, 23, -16, 36, -25, 45, -34, 32, -8, 10, + 5, 28, 0, 12, 11, 3, 20, -23, 6, -8, 16, 7, 17, -19, 32, -44, + 3, -8, -21, -8, -5, 2, -29, 2, -3, -19, -14, 3, 7, -23, 10, 1, + 3, 8, 13, -44, 20, 21, -16, 23, 3, 5, 10, -11, 32, -11, 13, -7, + 30, 4, 16, -7, -6, -7, 14, -40, 4, -16, -26, 3, -1, 0, -6, 5, + -50, 37, -27, 18, -16, -14, 6, -1, -4, -15, 8, -12, 14, 9, -22, 42, + -10, 23, -11, 36, -15, 13, 30, 1, 47, -20, 33, -14, -12, 1, -20, -9, + -9, -11, -13, 7, -37, 25, -47, 14, -13, 4, -12, 9, -32, 18, -48, -1, + -35, -1, -7, 35, -20, 53, -4, 34, -7, 13, 19, 9, 30, 6, 45, -22, + 23, -18, -6, -1, 3, -30, 14, -15, 9, -39, 10, -33, -13, -24, 10, 14, + 14, -10, 2, -34, -4, -20, -21, -14, 40, -10, 17, -14, 28, -17, 37, -26, + 69, -15, 38, 2, 21, -25, 37, -61, 13, -9, 5, -17, 18, -41, 22, -57, + -1, -9, -13, 24, -10, 38, -5, 8, -16, -2, 1, 12, -25, -2, -13, 2, + 2, -16, -19, 32, -30, 22, 20, -4, 12, 11, -17, 19, -17, -3, 20, -33, + 65, -27, 32, -14, 8, -8, 13, -19, 9, -2, 7, 33, -40, 18, -18, -18, + 6, -23, -11, -11, -28, 4, -11, -15, -14, -8, -5, 34, -6, 19, 1, -3, + 9, -1, 5, 5, 14, -11, 40, -3, 18, -20, 16, -7, 2, -5, 9, -16, + 9, -17, 0, -17, 4, -17, -3, 3, 8, -14, -19, 12, -21, -7, 1, -2, + -8, 16, 3, -6, 35, -23, 33, -13, 11, 12, 3, -7, 26, -11, 19, -18, + 23, -22, 39, -49, 39, -50, 11, -38, 26, -29, 10, -6, -22, 15, -8, 15, + -37, 36, -43, 39, -43, 18, -26, 1, 11, 4, -2, 9, 7, 2, 7, 19, + 1, 1, -4, 16, -5, 16, -9, -3, 4, -4, -1, -17, 0, 11, 16, -27, + 12, -15, 15, -3, 0, 10, -3, -5, 12, -13, -7, -13, -31, -1, -3, -17, + 15, -31, 25, -10, 15, -1, 2, 4, 10, 7, 32, -13, 7, -22, 2, -10, + 16, 1, -15, 19, -24, 16, -18, -12, 18, -9, 9, 24, -8, 8, 11, 0, + -31, 17, -55, 21, -43, 40, -40, 29, -54, 44, -34, 22, 11, 16, 7, 19, + 21, -6, 2, -7, -16, 22, 0, -1, -4, 5, -8, 26, -42, 4, -6, -21, + 35, -16, 8, 0, -22, -13, 11, -31, 7, -28, 4, 17, -12, -18, -2, -23, + 23, -1, 19, 34, 7, 7, 35, -19, 11, -8, -17, 8, 4, 16, -16, -13, + 9, -15, -5, -1, -6, 7, 3, 11, 1, -7, -24, 21, -31, 36, -3, -10, + 8, 2, -17, 12, -24, 6, -3, 9, 15, 3, 13, -8, -13, -3, 6, -19, + 14, -33, 16, -17, -5, -31, 3, -29, 24, -7, -6, 35, -20, -5, 34, -20, + 25, -3, 10, 25, 8, 14, -13, 0, 1, 17, -33, 51, -38, 45, -32, 39, + -3, -2, -24, 3, -18, 14, -4, -44, 2, -25, -15, -2, -23, 3, -2, -2, + 20, -14, 8, -10, -4, 21, 11, -13, 32, -4, 8, 19, -16, -2, -2, -2, + 14, -2, -1, 27, -26, 20, 11, -13, 10, -3, -7, 12, -13, -3, -30, -16, + 10, -26, -3, -10, -2, -9, 15, -17, 1, -2, -7, 14, -8, 12, -3, -1, + 2, 47, -26, 22, -19, 16, 2, 13, -3, 21, -10, 22, -32, 43, -24, 16, + 0, 5, -2, 12, -44, -12, 1, -26, 1, -36, 5, 2, 9, -17, 20, -37, + 14, -9, -5, 6, -3, -13, 23, -19, 25, -33, 6, 17, 10, 19, 15, -4, + 12, 5, -9, 33, -20, 26, -9, 11, -2, 11, -21, -7, -13, -4, -8, -12, + 0, -10, -9, 8, -33, 9, -26, 8, 6, -8, 12, 7, -8, 0, 7, -16, + 25, -8, 27, 12, 0, 9, -9, 4, -17, 14, -16, 11, -8, 18, -2, 4, + 2, -20, -18, 22, -16, -5, 3, -24, 13, -10, -12, -10, 2, -16, 33, -15, + 21, -15, -4, -19, 29, -22, 18, 2, 20, 12, 18, -22, -7, -16, 7, -19, + 14, 1, -17, 33, -22, 38, -8, 3, -3, 21, -17, 51, -43, 15, -22, -23, + -6, -12, -14, 14, 9, 6, 4, -31, 3, -16, -14, 22, -22, 5, 13, -25, + 17, -2, -18, 7, 1, 5, 36, -16, 23, 4, -15, 29, -20, 10, 1, 24, + 17, 16, -4, -16, -37, -11, 1, -33, 27, -36, 17, -22, 2, -33, 16, -29, + 32, -7, 24, -12, 14, -12, 22, -16, 15, -20, 19, 9, 14, 12, -1, -24, + 13, -6, -1, 32, -19, 24, 12, -26, 4, -31, -38, 18, -16, -13, 3, -14, + -1, 11, -15, 15, 0, -2, 30, -6, 35, -23, 10, -35, 5, -14, 17, -21, + 20, 4, 7, 8, -5, -15, 20, -25, 26, 6, -3, 3, 5, -24, 26, -35, + 4, 0, -6, 13, -23, 8, -25, 1, -2, 9, 3, 17, 4, 0, 13, -15, + 3, -21, -16, 4, -5, -10, 11, -2, 7, 23, -22, 25, -19, 18, 25, -9, + 14, -21, -7, 11, -24, 22, -12, -7, 6, 9, -33, 11, -20, 2, -9, 2, + 3, -13, 12, -15, 23, -21, 16, -16, -2, 8, 13, -12, 18, -10, 16, -12, + 20, -18, 18, -1, 21, -21, 20, -30, -6, 10, -2, 13, -6, -15, 6, 2, + -1, 1, -19, 9, -15, -3, -11, 0, -5, 1, 5, 1, -4, -8, 1, -16, + 23, 0, -23, 2, 8, -6, 38, -4, 2, 13, -17, 31, -4, -8, 22, -14, + 0, 12, -22, 7, -7, 11, 4, -4, -12, -9, -22, 2, -17, -17, -11, 7, + -17, 19, -24, 9, -8, -6, 29, -4, 10, 4, 4, 23, -1, 9, -6, -12, + 23, 16, -6, 33, -29, 12, -7, -10, 17, -4, -18, 21, 0, -14, -2, -20, + -21, 10, -28, 5, -18, -4, 0, -11, 1, 5, -17, 3, 9, 20, 6, 1, + -7, 2, -7, 3, 9, -22, 29, 6, -1, 25, -10, 6, -1, 4, 12, 18, + -13, 28, -11, 6, -15, -14, -22, -7, 5, -14, 1, -16, -12, -5, 5, -9, + 4, -1, -14, 21, -10, -5, 0, -17, -7, 2, -10, 6, 11, 1, 37, -17, + 6, 21, -24, 41, 2, 23, 0, 10, -18, 16, -26, 14, -21, -19, 18, -9, + -14, -1, -9, -14, -3, -7, -10, 7, -7, 19, -11, 15, -25, -3, -6, 2, + 8, -10, 4, 12, -3, 11, -2, -2, 5, 31, -9, 39, -21, 14, -23, 18, + -16, -1, -3, -6, 0, 22, -9, -5, -17, -4, -12, 2, -3, -7, 10, -10, + 7, -20, -19, -10, 0, -14, 32, -15, -18, 13, -9, 2, 17, -14, 6, 36, + -9, 28, 1, 0, 17, -10, 5, 17, -8, 12, -2, 3, 2, -22, -6, -14, + 6, 8, -11, -14, 2, -23, 25, -35, 3, -18, 1, -14, 22, -1, -12, -7, + -9, 13, -4, 12, 4, -3, 18, 0, 1, 8, -14, 14, -2, 1, 17, -3, + -14, 35, -17, 19, -14, -6, 1, -9, 18, -17, -4, -13, -2, -14, 10, -10, + -6, 0, 3, 5, -12, -13, -3, -6, -6, 11, -13, -7, 13, -2, 6, 13, + -7, 11, -5, 23, 1, 29, -17, 23, -10, 18, -16, 12, -20, 10, 7, -9, + -5, -21, -9, 5, -13, -2, 0, -15, -11, 3, 0, -18, 5, -25, -2, 3, + -2, -3, 4, 8, 14, -7, 15, 4, 8, 19, 9, 11, 7, -3, 14, -11, + 1, 15, -35, 3, 3, -10, -16, 0, -15, 2, 3, -12, 27, -23, 32, -15, + 10, -14, 3, -27, 10, -15, 12, -24, 7, 2, 9, -2, -2, -1, 3, 1, + 1, 8, -4, 0, 6, -6, 1, 1, -1, 8, -11, 31, -27, 13, 4, -3, + 5, -1, 0, 2, 9, 0, 12, -31, 4, -27, 1, -25, 20, -21, -14, 12, + -14, 0, -5, -23, 18, -1, 15, 19, -5, 20, -8, 14, -7, 16, 3, 0, + 8, 10, 0, -8, -10, 3, -8, 9, -12, 4, 15, -6, 2, -12, -29, -3, + -16, -11, 35, -18, -1, -28, 7, -12, 0, 7, -5, 22, 10, 10, -4, 6, + -13, 21, -23, 20, 8, -13, 11, 15, -6, -6, -22, -1, 3, 14, 7, 11, + -27, 12, -17, -12, 8, -15, 3, -8, 12, -12, 5, -30, 12, -18, 9, -2, + 3, 4, 15, 1, 5, -9, 0, -8, 24, -2, 21, 5, -4, -4, 14, -15, + 0, -1, 3, 17, -5, 13, -19, -10, -4, -6, -4, -7, 18, -27, 8, 1, + -12, -21, -13, 1, -9, 11, 1, -3, -1, 22, -21, 9, 6, -3, 20, -2, + 17, 7, -12, 1, 4, 4, -9, 9, -20, 24, 7, -9, -3, -7, -6, 10, + 7, 3, 9, -2, -3, -4, 1, -19, -8, -16, 0, -12, 0, -25, 4, -22, + 10, -9, 0, -3, 15, -1, 8, 11, -15, 10, 13, 1, 22, -5, 15, 1, + 24, 6, 0, -6, 5, 5, 10, 8, -1, -11, -14, 3, -31, 2, -22, -4, + -8, -15, -2, -31, -12, 6, -7, 5, 2, 3, -4, 19, 3, 4, 7, 7, + -8, 31, -6, 26, 1, -2, 2, -3, -10, -4, -4, 9, 3, 12, -16, 16, + -9, -1, 5, 4, -7, 13, -17, 0, -11, -13, -22, 1, -9, 4, -7, 7, + -10, 5, -1, -6, -3, -21, 7, -10, 18, -3, 1, -7, -11, 11, -8, 12, + 20, 3, 13, 16, -1, 3, 13, -3, 23, 16, -3, 15, -14, 12, -6, -8, + -28, 0, -33, 4, -11, -12, -13, -21, -17, -16, -5, -12, 16, -7, 15, -6, + -5, 3, -9, 21, 17, 13, 14, 11, 21, -12, 31, -18, 7, 12, 8, 9, + 7, 1, -3, -7, -14, 17, -35, -10, -2, -18, -8, -10, -20, -22, 2, -10, + -3, 1, -1, 4, -5, 11, -20, 11, -6, 27, 7, 18, 8, -1, 2, 3, + 11, -9, 5, 5, -7, 29, -6, 20, -21, 23, -15, 19, -19, 2, -22, 11, + -26, -7, -10, -30, -1, -3, -6, 15, -22, 16, -7, -9, -2, -7, -5, 11, + 17, -13, 2, 8, -5, 6, 27, -6, 12, -6, 4, 15, 3, 14, -3, -12, + 11, -2, 6, 5, 4, -6, -12, 0, -32, 2, -22, 22, -12, -5, -7, -11, + -7, 6, -1, -3, -3, -16, 2, -1, 0, 0, -7, -2, 1, 12, -4, 5, + 20, 1, 16, -2, 14, -1, 19, 8, 29, -8, 7, -14, -2, 3, -13, 8, + -40, 22, -18, 2, -14, -8, -11, -8, 12, -21, -1, -10, -12, -6, -4, -14, + 6, -19, 7, 14, 1, 11, 11, -11, 25, 1, 14, -5, 31, 0, 22, 4, + 1, 3, 6, -3, 4, -2, -20, -7, -26, 1, -12, -7, -10, 2, -1, -5, + -7, -8, -10, 6, -7, -6, 10, -17, 6, 3, 15, -8, 15, -7, 12, 1, + 9, -4, -2, 10, 9, -1, 10, -4, 9, -8, 17, 0, -13, -7, -2, -11, + 3, -2, -15, -4, -11, -5, -9, 1, 8, -10, 8, -8, -6, -18, 21, -19, + 26, -19, -1, -11, 10, 4, 12, -10, 16, -10, 17, 8, 13, -1, 17, 1, + 5, -1, 11, -8, 9, 16, -17, 3, -26, -17, -14, 6, -17, 4, -20, 0, + -1, -6, -4, 2, -15, 13, -3, -1, 0, -2, -8, 11, 7, -3, -8, 5, + 14, -1, 28, -19, 13, -4, 8, 1, 11, 7, 6, -8, -2, -13, -10, -22, + 6, 11, -1, -1, -5, -13, 18, 3, -10, 9, -17, -8, 9, -9, 1, -17, + -4, -16, 18, -6, 15, -10, 17, 5, 0, -5, 0, -11, 12, 15, 4, 8, + 5, -4, 0, -2, 3, -17, -2, -1, 11, -6, -7, 2, -33, 23, -6, -1, + -2, -2, -1, -8, 3, -29, -2, -34, 16, -3, 16, 1, 10, -12, 23, 0, + -3, 16, 12, 19, 23, -1, 8, -26, 16, -32, 26, -13, 2, -11, 5, -1, + -15, -9, -16, 7, -6, 14, -15, 5, -10, -7, -9, -9, 6, -17, 13, 18, + -5, -3, -4, -4, -18, 28, -6, 13, 17, 24, -2, 9, -14, 1, -11, 7, + 17, 1, -15, 10, -23, -4, -12, 5, -20, 17, -10, 6, 0, -9, 4, -8, + -15, 6, -16, 7, 9, 3, 6, -12, -17, 0, 4, 13, 22, -4, 10, -8, + 7, -12, 5, 5, 1, 11, 2, 10, -3, -2, 3, -10, -5, -7, -4, -18, + 17, -2, -14, -16, -7, -10, -3, 6, -1, 14, -11, 15, -18, 2, -6, 0, + -1, 0, 20, -17, 1, 6, 2, 6, 12, -3, 7, 25, -5, 17, -14, 0, + -6, 0, -2, -5, -1, -10, 8, 2, -9, -19, -7, -17, 5, 3, -7, 4, + -15, -5, 9, -12, -1, -5, 3, -5, 26, -2, 3, -4, 5, 3, 7, 10, + 5, 6, 6, 26, -17, 0, -1, 3, -3, 10, -7, -7, -9, 11, -18, 0, + -16, -6, -5, 3, 7, -14, -14, 0, -21, 14, -8, -1, -12, 2, 1, 2, + -3, -1, -3, 18, 5, 5, 9, 12, 7, 18, 8, 5, -25, 16, -15, 16, + -7, 9, -22, 1, 14, -13, -5, 2, -6, -8, 13, -17, 6, -16, 1, -5, + -14, -6, -6, -15, -2, 9, -9, -18, 15, -19, 12, 7, 4, 8, 14, 15, + 6, 10, -3, 9, -7, 23, -17, 21, -20, 7, 0, -9, 8, -10, 1, 4, + 2, 3, -9, -9, -15, -6, -21, -16, -6, 0, -11, 19, -8, -9, 5, -6, + 0, 5, 14, 7, 1, 12, 8, 7, -5, 12, 8, -4, 19, 4, -7, 2, + 3, -12, -8, -1, 0, 5, 7, -5, -8, -22, -8, -21, -2, -9, 10, -20, + 13, -6, 8, -17, -9, -6, 2, 5, 8, 6, -3, 10, -9, -2, 15, -6, + 20, 7, 11, 10, -3, -4, -8, 25, -25, 18, -12, 17, -6, 20, -22, -1, + -17, -10, 5, -10, 9, -13, -9, -6, 10, -25, -5, -2, -5, 13, 2, -5, + -8, -10, 11, -27, 10, -4, 11, 0, 33, -4, 10, -14, 1, 12, -2, 27, + -8, 6, 11, 9, -12, -4, -10, -13, 12, 5, 1, -10, -14, -15, -8, -7, + -9, 3, -5, 10, 3, -11, -12, -13, -3, -3, 3, 2, 9, 17, -6, 25, + -3, -3, -8, 19, 3, 30, -10, 12, -22, 7, -5, -10, -3, 21, -8, 12, + 6, -5, -13, -13, -9, -9, -1, -23, 13, -17, 15, -22, -11, -18, 8, -14, + 20, 1, 4, -5, 3, 3, 5, 11, 1, 2, 27, 1, 10, -7, -8, -2, + -2, 7, -1, 17, -5, 24, -7, 5, -10, -20, -6, 5, -4, -5, -1, -18, + -5, -14, -1, -20, 1, 7, -7, 12, -4, -2, -4, 2, 8, 0, 7, 1, + 6, -2, 18, -5, -7, 4, 3, -2, 13, 4, 0, 2, -3, 2, -10, -6, + 1, -6, 6, -7, -3, -21, -2, -12, 5, -1, -9, 7, -3, 13, 5, 5, + -8, 0, -8, 19, -5, 13, 13, -7, 3, 0, -10, 0, -8, 20, -8, 13, + -20, -5, -7, 3, 5, -7, 2, -5, -4, -14, 11, -23, -13, 2, -1, 12, + 13, 5, -6, 23, -9, 9, -6, -9, 18, -13, 16, -3, -7, -17, 3, -13, + 12, -9, 4, 0, 0, 13, -18, -1, 3, -13, 20, -5, 1, -20, 15, -23, + 18, -4, -8, 5, -7, 16, 4, 6, -3, 7, -21, 19, -17, -7, 9, 5, + 3, -5, -3, -16, -9, 25, -9, 12, -5, 10, -5, 9, -4, -6, -3, 4, + 10, -2, 11, -12, -2, -14, 8, -23, -5, 0, -8, 9, -2, -11, -3, -9, + 9, 2, 2, 4, -5, 7, 11, -16, 0, -6, 7, 6, 25, 5, 6, -4, + 3, 4, 3, 2, -8, -3, 5, -1, -11, -4, -9, -3, -15, 10, -12, -5, + 11, -4, -7, 6, -29, -5, 6, 11, 3, 9, -18, 13, -14, 19, -1, -2, + 4, 5, 12, 1, 5, -8, 3, 1, 20, -6, 2, 3, -16, 10, -10, -18, + -11, -7, -7, 9, -4, -8, 9, -15, 13, -13, -3, -7, 3, 8, 11, -6, + -16, 1, -8, 20, 4, 15, -5, -3, 11, -5, 6, 0, -5, 10, 13, 0, + -6, -11, 0, 11, -11, 10, -7, -8, 1, 16, -9, 2, -22, -9, 0, 4, + 5, -12, -22, 2, -8, -8, 14, -16, 0, 13, 0, 9, -7, 2, -1, 7, + 8, -3, -3, 2, 15, 5, 10, -7, 12, -4, 22, -4, -3, -12, -2, -15, + 8, -2, -22, 7, -10, 5, 12, -20, -9, -11, -2, -12, 2, -9, 5, -3, + 11, 7, -9, 4, -4, 24, -7, 21, -15, -3, 2, 14, -1, 5, 18, -12, + 13, 3, 5, -10, -11, 0, -8, -2, -4, 2, -15, 9, -10, -16, -9, -7, + 0, -1, 3, -8, -10, 5, -8, 4, -3, 8, -2, 20, 1, 6, -4, -9, + 4, 14, 7, -1, 3, -5, 18, -7, 20, -6, -10, 8, 1, -2, 3, -4, + -5, -3, -6, 0, -16, -7, 12, 0, -17, 4, -31, -7, 1, 1, -4, 8, + -11, 6, -1, 11, -5, -7, -4, 2, 4, 15, -3, 21, -5, 20, 3, -12, + 21, -1, 10, 5, 6, -20, -1, -18, 2, 3, -4, -5, -1, 6, -2, -11, + -17, -15, -13, 0, 6, -18, 7, -18, 7, -7, 6, 7, -10, 18, 16, 2, + -1, 3, -11, 6, 14, 1, 15, -2, 29, -8, 17, -14, 2, -19, 12, 8, + -6, -1, -23, 6, -11, 7, -19, -18, 0, 1, -8, -8, -4, -20, 8, -8, + 4, 10, -12, 13, 0, 18, -10, -3, -4, 6, 4, 17, 7, -2, 18, -9, + 14, -10, -4, -11, 4, 3, 23, -17, -6, -2, -7, -7, 9, -10, 1, 2, + -4, -14, -7, -6, -8, -4, 7, 2, -3, 3, 0, 13, -10, -4, -9, -6, + 18, 11, -4, 16, -8, -4, 1, -1, 7, 3, 3, 3, 10, -15, -2, -9, + 9, 0, 2, 2, -9, 12, -7, 0, -23, -7, -19, 2, -1, 0, 4, -15, + 7, 3, -3, 0, 9, -12, 19, 4, 8, -13, -6, 5, -1, 14, 10, 9, + 13, -3, 16, -18, 13, -18, 7, -10, 13, -6, -11, -3, 7, -23, -6, -11, + -21, 9, -1, 4, -3, -16, 0, -12, 7, 14, -5, 15, 0, 6, -5, -3, + -9, 9, 4, 10, 4, -2, -7, 10, -1, 10, -6, -14, 15, -4, 13, -4, + -4, -14, 5, -2, 4, -9, 3, -14, 2, 3, -10, -1, -9, 0, 3, -6, + 12, -16, 0, 4, 10, -25, 6, -5, 2, 8, 3, -2, -4, 15, 4, 7, + 2, -1, -6, 10, 11, 2, -2, -14, 6, -3, 0, -3, -9, -10, 1, -1, + -15, 9, -29, 9, -10, 7, -3, -3, -10, -2, 14, 4, -6, 0, 1, 12, + 4, 18, -15, 19, 1, 15, 1, 1, 3, -10, 8, -1, 7, -30, 8, -19, + -2, -5, -9, -10, 0, -1, 6, -4, -12, 1, -18, 10, -1, -12, 2, 7, + 12, 11, 0, -4, -1, 6, 10, 17, -8, 1, -12, 5, -2, 1, -7, -1, + 4, 3, -3, -1, -18, 8, -9, 0, -2, 8, -12, 12, 7, -5, -2, -16, + -7, 9, -5, 11, -9, -4, 3, 1, -9, -1, -2, -6, 7, 12, 0, -8, + 9, -10, 3, 0, 2, -3, 11, 14, 4, 3, -12, 3, -3, 2, 12, -4, + -2, -2, 9, -21, -5, -28, -6, -10, 6, 7, -6, -3, -24, 7, -11, 10, + 0, 8, 13, 10, 6, -7, -2, -5, 7, -1, 9, 18, -2, 12, -4, 7, + -26, 13, -6, 19, 6, 6, -5, -16, -6, -8, -18, -2, 1, -11, 3, 4, + -16, -8, -10, -3, 2, -3, 5, 5, 0, 11, 0, -14, 0, 1, 14, 11, + 13, 0, -2, 5, -1, -4, -2, -4, 5, 21, 3, 14, -5, -22, 5, -11, + -3, -6, -3, -11, 0, -5, -13, -10, -18, 3, 9, -10, 2, 3, -11, 11, + -11, 5, -19, 23, -1, 20, 18, 4, -3, -6, 9, 4, -3, 8, 4, 6, + 2, 5, -14, -6, -3, 2, -6, -4, -3, -11, 0, -5, 0, -21, -2, -10, + 11, 5, -4, -5, -5, -8, 10, -10, 4, -1, 6, 12, 9, 2, 8, -20, + 8, -2, 11, -11, 1, -4, 5, 6, -6, 6, -14, 14, 4, -2, 12, -3, + -10, 8, -5, -15, -9, -1, 5, 8, -3, 0, -23, -9, -11, 4, -12, 3, + -4, 4, 1, 15, -12, 3, 13, 2, 5, 8, -8, 7, 11, -3, 17, -11, + 5, 3, 19, 13, 3, -11, -11, -2, -9, -7, -4, -24, -1, -17, -3, -17, + 0, -15, 2, -1, -5, -4, 3, 2, 2, 11, -4, 3, -6, 11, 8, 3, + 6, 3, 7, 7, 6, -6, 2, 0, 14, 14, 3, 8, -6, 4, -3, 6, + -13, -2, -9, -4, 5, -13, -5, -21, -1, -6, -1, -5, -14, 8, -7, 5, + -7, -17, -11, 7, 3, 20, 7, 1, -3, 4, 5, 14, -3, 5, 3, 10, + 8, 6, -6, -2, 6, 3, 7, -6, -3, -3, -6, -1, -27, -11, -17, 0, + 11, 7, 1, -7, -9, -13, 5, -11, 0, -10, 15, 2, 5, -2, -5, 1, + 6, 6, -6, -5, 6, 2, 5, 3, 10, -16, 11, 8, 18, 3, 13, -11, + 7, 5, -7, -6, -20, 15, -1, 10, -1, -13, -17, -11, -3, -13, -4, -14, + -3, -2, -6, 6, -28, 9, -8, 10, 0, 12, -2, 10, 9, 1, 3, -6, + 5, 17, 24, 18, 3, 4, -9, -4, 2, -8, -4, -2, -11, 1, -8, -12, + -9, -10, 5, 0, -7, -9, 7, -18, 6, -10, -12, -1, -1, 13, 1, 18, + 2, -3, 4, 3, 3, -3, 3, 10, 9, 7, 5, -8, -7, 0, 3, -7, + 7, -2, -2, 5, -10, 2, -5, -3, -1, 4, 1, -2, -10, 4, -9, -5, + -12, -18, 3, 6, -3, 3, -15, -1, -13, 6, -2, 8, 0, 8, 16, -2, + 17, -4, 8, 3, 23, -1, 11, -8, 10, -4, -5, -3, -13, -2, -1, -2, + 2, -9, -13, -13, -2, -11, -2, -20, -5, 0, 3, 2, -1, -10, 1, 8, + 3, 9, 6, 4, -3, 13, 3, 4, 11, 2, 11, 8, -2, -1, -2, -2, + -2, -1, -21, -1, -14, 8, 6, -8, -10, 2, -16, 4, -3, -1, -10, 7, + -1, 4, -4, -12, 3, -2, 13, 2, -3, -9, -2, 6, -7, 8, -8, -5, + 12, 7, 8, -3, 6, -1, 16, 0, 7, -8, 3, -7, -1, 0, -6, -4, + -8, 6, -1, 4, -19, 2, -3, -8, -3, -12, 4, -6, 2, -7, 1, -13, + 2, 9, -1, 17, -19, 3, -3, 23, 9, 6, 3, 6, 6, -5, 11, -11, + 1, 0, -5, 6, -6, -4, -5, -7, 3, -4, -14, -9, -7, -1, 5, -11, + 4, -19, 14, -4, 3, 4, 2, 0, 9, -2, -3, 2, -2, 10, 15, -3, + 14, -6, -4, 6, 1, -8, 11, -9, 4, 3, -9, 2, 2, -2, 2, -2, + -9, -2, -2, 1, -6, -6, -22, -16, -10, 12, 0, 5, -8, -2, -4, -2, + 5, -1, 7, 7, 9, 1, 7, 6, -1, 10, 11, 5, -3, 8, 1, -1, + 8, -15, -6, -10, 12, 0, 2, -5, -9, -12, -7, -4, -14, -4, 0, -1, + 5, -7, -8, -12, 0, 2, 16, -3, 11, -4, 16, 11, 2, -3, 2, 8, + -1, 7, -13, 4, -3, -1, 3, -10, -2, -11, 3, 2, 3, -7, -10, -5, + -10, 12, -8, 5, -7, 15, 1, -10, 7, -16, 1, 3, 4, -5, 7, -7, + 4, -2, -1, -8, 0, -2, 17, 10, -2, 6, -5, 3, 10, -7, 2, -3, + 4, 5, 5, -3, -8, -8, -1, 1, 7, -5, -11, -2, -10, -4, -15, -7, + -10, -2, 2, -4, -10, -8, 0, 2, 6, 3, 2, 3, 10, 14, 8, 7, + 3, 5, -5, 20, -6, -1, -2, 0, 1, -2, -2, -8, 3, -3, 10, -14, + 3, -3, -2, 0, -5, 0, -15, 4, -2, 0, 4, -7, 3, -8, 7, -14, + -2, -6, 4, 2, 3, -10, -2, 5, -3, 12, -2, -5, -9, 1, 4, 1, + 11, -12, 15, 5, 20, 10, -5, 1, 5, 3, -13, 6, -16, 5, 1, -5, + -8, -3, -14, -6, -2, -5, -8, -17, -9, 3, -6, -2, -3, -3, 1, 14, + 2, 4, 5, 3, 8, 7, 12, 0, 11, 4, 16, 2, -3, -9, -1, 1, + -1, -3, -6, -14, 4, -6, 2, -14, -9, -11, -1, 0, 0, -5, -6, -10, + 5, -5, 2, -3, 2, 2, 17, -2, -1, -3, 3, 11, 1, 10, 2, 7, + 6, 5, -5, -3, -3, -2, 7, 2, 1, -18, -5, -2, -3, -5, 0, -2, + 0, 8, -9, -10, -15, -7, -2, -1, 6, -8, 16, -10, 13, -4, 2, -4, + 4, 7, 9, 6, -5, -2, 8, -1, 11, -6, -1, 5, 8, 0, 9, -20, + 0, -9, 4, -3, 1, -4, -11, 2, -6, 0, -12, 0, 1, 5, -2, 1, + -7, -4, 3, -1, -10, 3, -3, 7, 4, 8, -9, -6, -10, 0, 0, 2, + -4, 6, 9, 10, 2, 0, -1, 2, 14, 3, 7, -7, 2, -2, -2, -6, + -9, 2, -3, 6, -3, -7, -9, -10, -2, 2, -1, -11, 2, 1, 7, -4, + -7, -19, 3, -1, 6, 6, 6, 6, 0, 6, 7, 3, -1, 3, 8, 3, + 4, -10, -5, -7, 5, -4, -14, 2, -8, 5, -2, 2, -16, -4, -11, 2, + 4, -1, 2, -1, 0, 5, 4, -12, 3, 9, 7, 13, -3, -7, 2, 6, + -1, 7, -1, -1, 5, -5, 7, -11, -9, -13, 2, 5, 2, -2, -7, 5, + 4, -4, -2, -15, -4, 3, 0, 0, -5, 2, -7, -1, 9, -2, -1, 5, + 1, 1, -4, -5, -4, 6, 8, 7, -5, 4, -7, 4, 0, 1, -6, -5, + -2, 5, -1, 0, 1, 1, 3, 9, -4, -2, -4, -9, -1, 4, -17, 1, + -13, 11, -1, 6, -9, -1, 5, 1, 8, -3, 4, -5, 1, 7, -5, 1, + -3, 5, 3, 4, -7, -11, -7, 1, 5, -13, 11, -11, 1, 3, 6, -9, + 6, -5, -7, 4, -13, 5, -7, 10, 5, 6, -15, -1, 6, 4, 18, -7, + -7, -3, -4, 2, -5, 3, -4, 9, -4, 3, 3, -3, -10, 0, -1, 2, + 5, -3, 7, 3, 2, -6, -11, -2, -1, 4, -5, 4, -5, 0, -5, 5, + -5, -4, 2, 4, 2, 5, -8, -13, -3, 0, -1, -2, 4, 6, 9, 1, + 3, -7, -1, 1, 12, 1, 1, -1, -5, -1, 2, -8, -9, -7, -2, 3, + 10, -6, -7, -12, -7, -4, -5, 6, 0, 10, 5, 7, -4, -2, -8, 10, + 5, 9, 4, -1, -1, -1, -1, -1, -2, -3, 3, 9, -2, 9, -14, -13, + -8, -10, 1, 1, 3, 3, 1, -3, -12, -5, -7, 1, 6, 6, -2, -7, + -3, -3, 2, 2, 4, -9, 14, 8, 11, -3, 5, -11, 1, -1, 5, 3, + 8, 2, 8, -2, -6, -13, -10, 0, 4, 3, 4, -3, -9, 1, -5, -5, + -6, 1, -2, 2, -10, -6, -15, 1, -5, 4, -1, 2, 2, 4, 10, 4, + 2, -13, 0, 4, 8, 17, 2, 5, 4, 2, -6, 5, -5, 0, 8, -2, + -1, -5, -4, -5, -1, -5, -4, -5, 0, 0, 1, -9, -15, -3, -12, 1, + -1, -7, 10, 2, 5, -1, 2, -6, 2, 2, 10, 10, -1, 2, -2, 4, + 5, 0, -6, 12, 5, 3, -1, -8, -8, -4, -4, 3, -11, 0, -1, -1, + 0, -2, -14, -6, -9, 2, 1, 7, -4, 3, -1, 0, -3, 1, 2, 7, + 5, 4, 3, -2, -3, 1, 6, -1, 6, -11, 7, 2, -6, 2, -4, 0, + 2, 3, -7, -9, 3, 0, 4, -6, 0, -21, 0, -5, -1, 0, -1, 1, + -6, -1, -1, 0, -7, 5, 7, -2, 8, -4, -1, 3, 9, -6, 10, -6, + 7, 9, 10, 9, -6, 5, -14, 6, -5, 1, 2, -3, 0, -9, -10, -14, + -2, -3, 6, -8, -15, 3, -9, 0, -3, 0, -6, -1, 3, 9, 10, 3, + 3, -10, 6, 1, 3, -1, 9, 12, 4, 4, -9, -7, -5, 8, 6, 1, + 1, -4, -5, -5, -1, -11, -3, -4, 1, -1, 1, -10, -7, -2, -3, -4, + -3, -6, 11, 5, 3, 2, -8, -5, -2, 3, 9, 13, 5, 4, 4, 0, + -5, -1, -5, 9, 2, 3, -9, -4, 3, -6, 2, 1, -9, 5, -2, 3, + -2, -9, -8, -15, -5, -3, 3, -13, 11, 6, -3, 1, -6, -6, -1, 6, + 4, 6, 7, 1, 5, 0, 8, -6, 7, 2, 6, 2, -5, 0, -3, -1, + 3, -7, -1, -3, 5, 7, 6, -18, -10, -11, -7, -3, 10, -4, 3, -4, + -8, -5, -12, -3, -4, 12, 10, 2, -4, 6, 3, 1, 2, 0, -3, 3, + 7, 7, -5, 2, -4, 1, 3, 11, 2, 3, 4, -2, -7, -5, -17, -11, + 4, -3, 5, -7, -7, -6, -1, -8, -5, -5, 1, 7, 1, 2, -1, -9, + 7, 1, 7, 3, 3, 6, 9, 6, 1, -6, -4, 2, 5, 7, 4, -2, + 1, 3, -11, -1, -16, -2, -6, 1, 3, -8, -15, -11, 4, -1, 9, -2, + -5, 0, 6, 0, -7, 0, -8, 4, 2, 6, 2, 0, 2, 6, 2, -2, + 4, -2, 4, 14, 2, 2, -6, -6, -3, 4, -4, -1, -4, 1, -3, -6, + -1, -13, -1, -2, 7, -8, -7, -10, 0, 4, 3, -8, -3, 1, 4, 6, + 4, 6, -3, 5, 3, 4, 0, 6, 1, 4, 7, -3, -10, 8, -1, 9, + -1, 1, -11, -7, -3, -3, -6, -8, -9, -6, 1, -3, -6, -6, -5, 0, + 0, 2, -3, 0, 6, 4, 3, 2, 7, 4, 11, 14, 5, -1, -5, 1, + -2, 7, 3, 0, 1, 2, -5, -7, -10, -12, -10, -5, -5, -6, -6, -9, + 1, -8, -2, -1, -9, 1, 8, 2, -5, -2, -5, 0, 5, 6, 6, 7, + 8, 10, 2, 0, -3, -1, 2, 13, 3, 0, -6, 0, 1, -3, 0, -12, + -2, 4, -4, 4, -8, -11, -1, -2, 1, -1, 2, -12, 3, -6, 1, -12, + -7, -7, 3, 0, 9, 0, 1, 6, 1, -1, 2, 1, 2, 8, 9, -3, + -1, 0, 7, 3, 8, -1, -4, -1, 1, 3, -9, -1, -17, -3, -2, -4, + -4, -3, -4, -6, -11, -15, -2, -5, 6, 10, 1, 3, -1, -3, 13, 7, + 1, 6, 4, 4, 9, 5, -3, -5, 9, 3, 5, -3, 1, -3, 3, 0, + -7, -5, -7, 0, -5, 0, -1, -15, -11, -4, -5, -10, 2, -7, 5, -4, + 1, -9, 2, 1, 8, 7, 10, 2, 2, 0, 4, 3, -2, 0, 4, 2, + 6, 8, -2, 4, 4, -2, 5, -3, -6, 3, -3, -5, -9, -8, -11, -5, + -1, -1, -5, -7, -5, -8, 0, -3, 5, -7, 11, 1, 0, 2, -3, -1, + 3, 9, 6, -3, 8, 1, 11, 2, 8, -3, -3, 6, 2, 1, 2, -7, + -3, -2, -4, -8, -3, -3, 5, -10, -10, -4, -12, -2, 3, -5, 3, -6, + -8, -2, 5, -3, 0, 1, 4, 8, 4, 5, 0, 4, 8, 1, 7, -3, + 0, 3, 4, 4, -5, -2, -7, -3, 0, 5, -5, -9, 3, -2, -1, -2, + -5, -1, -4, -3, -11, -4, -5, -6, 0, 5, 0, -5, 5, 3, 8, -1, + 3, 3, 2, 5, 7, -4, 3, 1, 3, 10, 2, -7, 1, 0, 6, -4, + -3, -5, -7, -2, -4, -3, -6, 0, -10, 4, -6, -4, -7, -2, 1, -4, + -1, -3, -1, 2, 6, 2, 4, -2, 2, 4, 2, 5, -3, 4, 2, 1, + 0, 8, -3, 2, 5, -5, 3, -5, -2, 5, -5, 3, -1, -4, -3, 4, + -10, -5, -7, -4, -4, 0, 0, -7, -1, -1, 2, 1, -2, -12, -4, -1, + 0, 4, -5, 2, 0, 3, 12, 11, 3, 11, -1, -3, 6, -6, 1, 1, + 7, 6, -7, -1, -7, -4, -4, -7, -8, -1, -6, -6, -2, -3, -5, 0, + -4, 8, -7, 1, 4, -3, 6, 1, -7, 3, 5, 6, 5, 13, 2, 2, + -4, 4, -3, 1, 4, -4, 2, -3, -10, -10, -7, -2, -2, -2, 0, -6, + -2, 1, -3, -4, -2, -5, -2, 7, 1, 6, -5, 6, -1, -1, 2, -3, + 4, 11, 2, -1, 2, -7, -5, 8, 0, 3, -3, -5, -1, -2, 3, 1, + -4, 4, 7, 0, 2, 3, -3, 0, 1, -5, -15, -5, -3, 1, 3, -3, + -11, -4, -7, 1, -2, -1, -1, 0, 1, 1, -5, -1, 3, -2, 7, 1, + -4, -1, 0, 4, 5, 3, 3, -1, 8, 11, 1, 4, 1, -5, 7, -6, + -4, -2, -4, -2, 3, -8, -3, -13, -6, 3, -3, -7, -4, -7, 3, 3, + -3, 2, -1, 1, -4, -2, -2, -5, 1, 11, 9, -2, 6, -3, 7, 7, + 1, 1, -7, 2, -3, 1, 4, -4, -4, 5, 1, 0, -3, -6, 2, -3, + 0, -8, -12, -6, -2, -3, 6, -1, -9, 0, -1, 1, 3, -2, -1, 0, + 1, 6, 0, -3, 5, 1, 6, 1, -1, 4, 1, 7, -3, -1, -1, -4, + 4, 14, -1, -1, 2, -4, -1, -6, -8, -8, -3, -2, 2, -9, -5, -7, + -12, 5, 0, -3, -4, -3, 5, 4, 3, -2, -6, 4, 7, 3, 5, 7, + -3, 8, 0, -5, -1, -1, 11, 10, 3, 4, -8, -3, -3, 1, -3, 0, + -4, -3, 1, -7, -8, -16, -7, -6, -2, 3, -7, -2, 1, -4, 0, -5, + -5, 1, 5, 10, 5, 0, 3, 0, 1, 13, 0, 5, 9, 6, 8, -1, + -4, 0, -3, 6, 4, -4, 0, -3, -15, -2, -12, -15, -3, -6, 2, 1, + -3, -4, -9, -9, -3, -3, -2, 3, 4, 9, 0, 2, 1, 2, 14, 5, + 3, 8, 2, 7, 4, -4, -4, -1, -9, 9, -5, -1, -7, -10, -2, -7, + -4, 0, -5, 2, 5, 1, 0, -5, -5, -1, -1, -3, 4, -8, 5, 3, + -4, 4, -5, -3, 9, 4, 8, 0, 0, 2, 0, -2, 0, -2, -7, 12, + -1, 5, -4, 2, -3, 0, 2, -2, -4, -2, 2, -5, 3, -7, -9, -4, + -3, -2, -6, -6, -2, -6, -1, -7, -8, 1, 3, 6, 10, 4, 5, 0, + 5, 8, 1, 3, 8, 5, 11, 12, -7, 4, 0, -3, 2, -1, -8, -7, + -4, -2, -6, -9, -6, -13, -4, -1, 0, -9, -5, -3, -4, -2, 3, 1, + 1, 9, 4, 2, 6, -1, 3, 6, 2, 0, -3, 3, 2, 6, 3, -1, + -4, 4, 1, 2, 2, -5, -8, -1, -3, -1, -9, -4, 1, -5, 5, -7, + -4, 0, 3, -10, 3, -3, -5, 1, 5, 4, 1, -5, 1, -5, 4, 1, + -6, 0, 5, 8, 8, 1, 6, 0, 3, 4, 2, -3, 1, -3, -3, 3, + -10, -6, -8, -2, -1, -3, -6, -6, -5, -6, -6, -5, 5, -3, 5, 6, + -2, -1, -1, -4, 6, -2, 6, 6, 2, 12, 8, -2, 3, -6, -2, 5, + 4, -3, -2, -5, -4, -7, -6, 1, -5, 2, 2, 0, 1, -7, 0, -4, + -2, -1, -2, -5, 7, -5, -2, -3, -2, -3, 4, 4, 9, 0, 1, 1, + -5, -3, -4, -4, 4, 3, 6, 1, -2, -2, -7, 4, 1, 1, -3, 3, + -1, 2, 0, -7, 0, 0, -1, -3, -2, -1, -5, -2, -3, -8, -5, -5, + -1, 5, 5, 2, 2, -3, 4, 3, 4, 6, 3, -1, 10, -4, -3, -2, + -3, 0, -4, 0, -2, -2, 0, 2, -5, -2, -5, -9, 8, -2, -1, -1, + -3, -3, -2, -6, 2, 1, 2, 9, 0, 1, 4, -5, 2, 4, -6, -1, + 2, -1, 6, 3, 0, -5, -3, -1, 0, 3, -3, 0, -6, -2, -3, -4, + -2, 0, 3, 2, 2, 0, -10, 1, -6, -5, -1, -2, 5, 3, 6, -2, + -6, -1, -3, 2, 4, 1, -1, 0, 1, 1, 3, -1, 5, -1, 7, 6, + 1, -2, 0, -6, -2, -2, -8, -2, -2, -3, -5, -5, -8, -3, -1, 5, + -3, 1, 2, 1, 2, -3, -2, -3, 2, 6, 2, 6, 0, 0, -2, 9, + -1, 3, -2, 3, 0, 0, 0, -6, -6, -1, -5, -7, 1, -3, -6, 2, + -2, -1, -5, -2, 1, 4, 2, 2, -3, -1, 6, -2, 2, 4, -3, 2, + 2, 2, -3, 1, 0, -4, 2, -1, -2, 3, 1, 1, -1, -5, -8, -2, + -5, 0, 1, -6, 3, -4, 2, 3, -6, 3, 0, 2, -2, -1, -4, -2, + -4, 4, 0, -3, 0, -6, -3, 10, -3, 3, 0, 4, 7, 3, 0, 5, + 1, 5, 1, -3, -2, 0, -6, 3, -1, -7, -5, -7, -1, -2, -2, -2, + -3, -2, 2, -2, -1, -3, -3, 2, -2, -6, -3, -3, 4, 3, 2, 0, + -1, 5, 5, 8, 2, 2, -2, 4, 0, 5, -5, -3, -1, -3, -3, -6, + -4, -2, 3, 0, -2, -2, -5, 5, -1, 3, -1, -1, -3, 0, 0, -5, + -4, -3, -2, 5, 0, -4, -4, 1, 2, 6, 0, -3, -1, 2, 3, 7, + -3, 0, -4, -2, 4, 3, 0, 1, 3, -3, 1, -7, -4, 0, 1, 1, + -4, -4, -4, -9, -1, -2, -3, -2, -3, -3, 4, 3, -1, -4, 2, 4, + 4, 3, 2, -1, 0, 9, -1, 4, 2, 7, -1, 6, -2, -2, -5, -1, + -9, -2, -2, -6, -1, -1, 1, -8, -6, -5, -1, -1, 1, -4, -5, 3, + 1, 5, 3, -3, 0, -2, 7, 0, 1, -2, 3, -1, 5, -1, -5, 7, + -1, 3, 2, -5, -6, -2, 4, 2, -1, -3, -1, -1, -1, -1, -2, -4, + 1, -5, 3, -1, -3, -5, 2, 6, -6, -1, -5, -4, 4, -1, -1, -2, + -1, 2, 0, 3, 1, 4, 2, 7, -1, 2, 0, -2, 1, 4, -5, -3, + -7, -2, 0, -1, -1, -3, 0, 0, -2, -6, 2, -4, 2, -4, 1, -7, + -2, -1, 5, 3, -2, -7, -4, 1, 6, 4, 5, 1, 4, 0, 5, 1, + -1, 2, 0, -3, -3, -5, -6, 3, -1, 5, -1, -2, 1, 1, 4, 2, + -6, -3, -4, -3, 2, -2, -8, -3, -6, -4, -2, -11, 0, 0, 1, 6, + -3, -2, 1, 2, 10, 8, 4, -2, -1, 2, 2, 1, -2, 3, 1, 5, + 3, -1, 0, -4, 4, -7, -2, -7, -8, -4, -3, -2, -7, -7, -3, -1, + 5, -2, 0, -7, 2, -1, 3, 1, 4, 6, 5, 8, 3, 2, -1, 3, + -3, 0, 0, -5, -1, 1, 1, -5, -3, -2, 6, 4, 5, -4, -8, -4, + -3, -2, -5, -4, -4, -4, 2, -3, -2, -4, -4, -4, 6, 1, 0, 1, + 3, 3, 5, 2, 1, 0, 6, 2, -1, 1, -3, -3, 2, -1, 0, 1, + 3, 1, 4, -4, -5, -10, -8, 1, -6, -3, -4, -6, -3, 0, 2, -3, + -1, 2, 0, 8, 1, 4, 4, 3, 6, 3, 1, 3, 5, 1, 2, -4, + -7, -3, -3, 3, 0, -7, -5, 0, -3, -1, -2, -4, 0, -5, 1, -6, + -1, -5, -3, 1, 4, -1, -3, 3, 3, 5, -1, -2, 2, -1, 2, 1, + -1, -5, 5, 1, 2, 2, -4, 0, -1, 3, 0, -2, -1, 2, 1, 5, + 4, -3, -5, 0, -2, -2, -6, -3, -3, -4, -1, -5, -4, -1, -2, 0, + 2, -2, -6, -3, 1, 1, 1, -1, 3, 4, 7, 2, 3, 4, -1, 7, + 2, 3, 1, -1, 1, -2, 0, -4, -5, -6, 0, -2, -7, -2, -5, -5, + 1, -4, -5, -5, 3, -1, 1, 2, -2, 0, 1, 4, 1, -4, 2, 2, + 0, 9, 2, 0, 4, 3, 1, 2, -4, -2, -4, 3, -4, -2, -6, 0, + -1, 5, 2, -4, 0, -4, -4, -1, -5, -4, -7, -3, 1, 0, -2, -1, + -5, 1, 0, -1, 0, 2, 4, 0, 3, -2, 1, 2, 6, 0, 1, 5, + 0, 3, 3, 2, -5, -2, 1, 5, 2, -2, -5, -9, 0, -6, -1, -6, + -7, -5, -4, 0, -2, -5, -3, 2, -2, 3, 2, 0, 9, 2, 0, 4, + -3, 4, 5, 8, 6, -2, -4, -1, 0, -2, -2, 1, -5, 2, -5, -1, + -4, -3, -4, 0, -2, -7, -3, -1, 0, -1, 0, -6, 3, -2, 5, 2, + -1, -2, 1, 0, 1, -1, -3, 2, 3, 1, 2, -4, -3, -1, 5, 5, + 3, -4, 0, 1, 2, 5, -5, 1, -5, 2, -2, 2, -4, -3, 0, -4, + -3, -9, -7, -4, 2, -2, 1, -6, -3, 0, 1, 5, 1, -5, 0, 0, + 2, 1, 2, 0, 6, 4, 6, 3, 2, 3, 1, -2, -2, -9, -4, -1, + 4, 0, -1, -5, -8, -5, -4, 0, -4, -1, -3, 0, 0, -4, -3, -1, + 1, 2, 0, -2, -3, 1, 3, 2, 3, 3, 0, 8, 2, 7, -1, 3, + -2, 4, 0, 0, 1, -4, 5, -1, -3, -3, -6, -4, 2, 1, -5, -4, + -7, -4, -4, -7, -2, -10, 1, 0, 1, -3, 4, -2, 5, 2, 1, -3, + -1, 2, 8, 4, 5, 0, 1, 4, 5, 2, 2, -2, 1, -4, 0, -3, + -3, -1, 0, 2, -4, -4, -5, -1, -7, 0, -4, -5, -1, -3, 2, -2, + 0, 3, 0, 2, 0, 1, -2, 2, 4, -1, 0, -3, -1, 1, 3, 2, + -3, 2, 0, 2, 2, -1, 2, -2, -3, 0, 0, -2, 2, -2, 4, -3, + -6, -7, -6, 2, -1, -4, -1, -7, -1, -3, 3, -1, 0, -2, 2, 2, + -3, 3, -4, 5, 7, 6, 3, 1, -1, 6, 2, 1, 0, -1, -1, 1, + -3, 1, -3, -5, -5, -3, -8, -3, -11, -1, -1, 0, -8, -2, -5, 3, + 4, 0, 1, -2, 2, 0, 6, 4, 1, 4, 1, 5, 0, 0, 1, 2, + 5, 0, 1, -10, 0, -5, 2, 0, -6, -6, -2, -2, 2, -3, 0, -4, + 2, -4, 1, -3, -4, 1, -2, 2, 1, -2, 0, 3, 2, -3, -1, -5, + -3, 4, 2, 3, -1, 4, 1, 5, -1, 2, -3, 2, -3, 0, -3, -2, + 1, 1, 5, 1, -2, -5, 1, -1, -4, -3, -7, 0, -5, -4, -4, 0, + -4, 4, 0, -1, 1, -8, 1, 0, 9, 1, 2, -2, 5, 5, 1, 6, + -1, 6, 3, 1, 1, -2, -2, -4, -3, -2, -3, -7, -4, -4, -1, -3, + -8, -1, -8, 4, -5, 0, -3, 1, 0, 4, -1, 0, 1, 3, 3, 4, + -4, 6, -2, 2, 5, 4, -3, 4, -3, 5, 0, -4, 0, 0, -1, 0, + -4, -4, 3, -1, -2, -4, -8, -9, -5, -4, 4, -4, 1, -4, 1, 1, + -1, -1, -1, 3, 2, 3, 0, 1, 2, 1, 5, 3, 1, 0, 5, 3, + 3, 0, -5, -4, -2, 5, 0, -2, -5, -2, -6, -2, -5, -8, -2, 1, + -1, -3, -7, -8, -6, 0, 4, 7, -2, 7, -1, 7, 3, 2, -5, 0, + 2, 0, 1, -3, 2, 2, 3, 3, -3, 0, -2, 3, -1, -1, -4, -6, + -2, -3, 4, -4, 0, -4, 6, -2, -6, -2, -7, 1, 2, -1, -3, -2, + -2, 3, -1, 0, -3, -1, 4, 7, 4, 0, 2, -1, 0, 6, -2, 1, + 1, 5, 4, 1, -3, -3, -2, 2, 2, 1, -6, -6, -3, -4, -2, -6, + -5, -4, -5, -2, -8, -8, -3, 0, 4, 0, 1, -1, 2, 5, 4, 2, + 2, 3, 3, 4, 10, 0, 2, 0, 3, 1, 1, 0, -3, 1, -3, 1, + -7, 0, 1, -2, 1, -6, -4, -10, -1, -4, -2, -2, -3, 2, -4, 1, + -5, -4, -4, 2, 1, 1, -4, -1, 3, 1, 6, 2, -2, -2, 3, 3, + 2, 7, -5, 5, 0, 8, 1, -1, 2, 3, -1, -6, 0, -10, 3, -1, + -1, -5, -6, -8, -2, 0, -3, -5, -8, -4, 2, -3, -1, -2, 0, -1, + 7, -1, 3, 2, 4, 7, 3, 4, -1, 5, 1, 9, 1, -2, -1, -1, + 1, -3, -2, -6, -7, 1, -3, -1, -9, -4, -6, 0, 2, -3, -2, -4, + -3, 0, -4, -1, -4, 0, 1, 6, -1, 1, -1, 3, 5, -1, 3, 4, + 5, 7, 4, -2, 0, -2, 0, 3, 1, -1, -8, -2, -1, -2, -5, -1, + -2, -2, 2, -5, -7, -9, -2, -3, -2, 1, -5, 4, -4, 5, -1, -1, + -3, 2, 3, 7, 3, -1, 3, 4, -1, 5, -4, 0, 4, 4, 3, 4, + -9, 1, -5, 2, -2, -2, -3, -7, -1, -2, -2, -5, -3, -1, 1, -2, + -1, -4, -4, 1, -1, -7, 0, -1, 2, 5, 4, -4, -5, -4, 0, 2, + 1, -1, 3, 5, 4, 0, 0, -1, 3, 8, 3, 3, -4, 0, 1, 0, + -2, -6, -2, -4, 3, -2, -3, -5, -6, -3, -1, -1, -7, 0, 0, 3, + -5, -4, -11, 0, 0, 3, 3, 1, 1, 1, 4, 6, 1, 1, 2, 9, + 3, 3, -4, -4, -3, 2, -1, -6, 1, -5, 2, 0, -1, -8, -5, -6, + 1, 0, -2, -1, -2, -1, 2, 0, -9, 0, 5, 4, 7, -3, -3, 3, + 4, 2, 4, 0, -1, 3, 1, 5, -5, -6, -7, 0, 3, 0, -2, -4, + 3, 3, -3, -4, -7, -2, 4, 1, -1, -4, -1, -6, -2, 3, -2, -3, + 1, 4, 1, -1, -4, -3, 3, 4, 5, -2, 2, -3, 4, 0, 3, -3, + -3, 0, 3, 1, -2, -1, -3, 2, 4, -2, -2, -3, -1, -1, 3, -11, + -2, -8, 5, -1, 3, -5, -2, 2, -1, 3, -3, 0, -1, -1, 5, -2, + 0, -2, 3, 2, 3, -2, -6, -3, 2, 4, -6, 5, -6, 1, 2, 3, + -6, 2, -3, -4, 3, -9, 2, -6, 3, 4, 2, -9, -1, 1, 2, 8, + -3, -4, -1, -2, 2, -2, 2, -3, 3, -1, 1, 2, -1, -6, 1, 2, + 2, 1, -2, 2, 3, 1, -3, -6, -3, 0, 1, -3, 0, -3, -1, -4, + 2, -4, -3, -1, 4, 0, 5, -6, -7, -1, 0, 0, -3, -1, 2, 4, + 0, 3, -4, -1, 1, 7, 4, 2, -1, -4, 0, 2, -4, -5, -5, -1, + 1, 4, -5, -4, -6, -3, -2, -3, 2, -2, 5, 2, 3, -4, -2, -5, + 6, 3, 4, 2, -3, 1, 0, 0, 1, -3, -1, 1, 7, 0, 6, -6, + -7, -2, -7, 0, -1, 0, 2, 1, -2, -7, -2, -5, 0, 2, 0, -3, + -5, -1, -3, 0, -1, 0, -6, 8, 4, 5, -1, 1, -4, 1, 1, 4, + 2, 5, 3, 6, 0, -2, -9, -4, -1, 0, 0, 1, -1, -4, -1, -5, + -5, -5, 0, 0, 1, -6, -5, -9, 0, -3, 0, -2, 0, 0, 3, 4, + 2, 1, -7, 1, 3, 4, 9, 1, 4, 4, 2, -4, 2, -2, 1, 5, + -2, 0, -3, -4, -3, -2, -4, -4, -4, 1, -1, 2, -6, -8, -3, -8, + -1, -2, -4, 5, 2, 3, -1, 0, -4, 2, -1, 5, 5, -1, 3, 0, + 3, 3, 0, -4, 9, 4, 2, -1, -6, -4, -2, -2, 2, -7, 0, 0, + -2, -2, -2, -10, -4, -7, 0, -2, 2, -2, 2, 1, 0, -3, 0, 1, + 6, 3, 2, 0, 0, -1, 2, 3, -1, 4, -5, 6, 2, -3, 0, -3, + 0, 1, 0, -5, -6, 1, 0, 1, -5, -2, -14, 0, -4, -1, -1, -1, + 1, -3, 0, -2, -1, -4, 4, 5, -1, 5, -1, 3, 3, 5, -3, 5, + -3, 5, 5, 6, 4, -6, 2, -9, 4, -4, 0, 1, -2, -1, -8, -6, + -11, -2, -3, 3, -6, -8, 3, -5, 1, -3, 1, -3, 1, 3, 5, 6, + 2, 1, -6, 4, -1, 1, 0, 7, 7, 2, 3, -6, -4, -4, 3, 3, + 0, 1, -1, -2, -4, 0, -8, -2, -3, 1, -2, 1, -5, -2, -1, -3, + -3, -4, -3, 7, 4, 1, -1, -6, -5, -3, 2, 5, 8, 3, 3, 2, + 1, -4, -1, -2, 6, 3, 2, -4, -1, 1, -5, -1, -1, -5, 2, -2, + 1, -2, -7, -5, -11, -4, -3, 3, -8, 8, 4, -2, -2, -4, -4, -1, + 4, 3, 5, 5, 2, 4, -1, 6, -3, 6, 2, 3, 0, -4, 0, -2, + -2, 0, -5, -2, -1, 4, 3, 1, -13, -8, -8, -5, -3, 7, -2, 3, + -2, -5, -3, -8, -2, -3, 8, 6, 1, -2, 5, 3, 1, 2, 0, -1, + 2, 4, 3, -5, 1, -3, 0, 1, 7, 1, 2, 3, -1, -4, -4, -10, + -7, 3, 0, 2, -5, -5, -4, -1, -7, -3, -3, 1, 3, 0, 0, -1, + -6, 6, 1, 4, 1, 2, 5, 6, 4, -1, -4, -3, 1, 2, 5, 2, + -1, 1, 3, -8, -1, -10, -2, -5, 0, -1, -6, -10, -7, 2, -2, 6, + -1, -2, 1, 4, -1, -5, -1, -5, 4, 1, 4, 2, 1, 3, 4, 0, + -2, 1, -1, 3, 8, 2, 1, -4, -3, -3, 3, -3, -1, -4, 0, -4, + -6, -2, -8, 1, -2, 5, -6, -5, -6, 0, 3, 1, -6, -3, 1, 2, + 4, 2, 4, -2, 3, 3, 3, 1, 5, 1, 2, 3, -2, -6, 6, -1, + 6, -2, 1, -7, -5, -2, -3, -6, -6, -6, -4, 0, -2, -4, -4, -3, + 0, -1, 1, -3, -1, 3, 1, 1, 0, 6, 4, 8, 10, 5, 0, -3, + 1, -2, 5, 2, 1, 1, 1, -4, -6, -8, -8, -8, -5, -4, -5, -4, + -5, 0, -5, -3, 0, -7, 0, 4, 1, -4, -1, -4, -2, 4, 4, 5, + 6, 6, 7, 0, 0, -1, 0, 2, 9, 2, 1, -3, 0, 1, -3, 1, + -9, -1, 3, -4, 3, -6, -7, -2, -1, -1, -1, 1, -9, 2, -5, 1, + -8, -6, -6, 1, -1, 6, 0, 2, 5, 2, 0, 2, 1, 2, 6, 5, + -2, -1, 0, 4, 1, 6, 0, -2, 1, 0, 3, -7, -1, -13, -4, -3, + -3, -3, -2, -3, -5, -9, -11, -2, -3, 4, 7, -1, 2, 0, -2, 8, + 5, 1, 4, 3, 2, 7, 3, -2, -4, 7, 2, 3, -2, 1, -1, 2, + 0, -5, -4, -4, 0, -4, 0, -1, -10, -9, -3, -5, -8, 1, -5, 3, + -3, 0, -7, 1, 0, 5, 4, 7, 1, 1, 0, 2, 2, -2, -1, 2, + 1, 4, 6, -1, 4, 3, -1, 4, -2, -3, 3, -1, -2, -6, -6, -7, + -3, -1, 0, -4, -6, -5, -6, 0, -3, 3, -5, 7, 0, -1, 1, -3, + -1, 1, 6, 3, -3, 7, 1, 10, 1, 6, -1, -2, 5, 2, 1, 1, + -4, -2, 0, -3, -7, -2, -4, 4, -8, -8, -4, -10, -2, 2, -4, 1, + -5, -7, -1, 3, -1, 1, 1, 4, 6, 2, 2, 0, 4, 7, 0, 5, + -2, 0, 3, 3, 3, -3, -1, -5, -2, 0, 3, -4, -6, 2, -1, 0, + -2, -4, 0, -4, -3, -9, -3, -4, -4, 0, 3, -1, -4, 3, 1, 5, + -2, 1, 2, 2, 4, 5, -3, 2, 1, 3, 7, 1, -5, 1, 0, 5, + -3, -2, -3, -4, 0, -3, -2, -5, 0, -8, 3, -6, -4, -6, -2, 2, + -4, -2, -3, -2, 1, 4, 2, 3, -2, 2, 4, 1, 4, -2, 3, 2, + 1, 1, 7, -1, 2, 4, -4, 2, -4, -2, 5, -4, 3, -1, -3, -2, + 3, -8, -4, -6, -3, -3, -1, 0, -6, -1, 0, 1, 1, -2, -10, -3, + -1, 0, 2, -5, 1, 1, 2, 10, 8, 2, 8, -1, -2, 4, -5, 2, + 2, 7, 6, -6, -1, -5, -4, -3, -6, -7, 0, -5, -5, -1, -2, -5, + 0, -4, 6, -6, 0, 3, -3, 4, 0, -6, 2, 5, 5, 4, 10, 0, + 2, -3, 3, -2, 0, 3, -3, 2, -3, -8, -8, -5, -1, -1, -1, 0, + -5, -2, 0, -3, -4, -1, -5, -2, 5, 0, 5, -4, 4, -1, -1, 1, + -3, 3, 9, 2, -1, 1, -6, -3, 7, 1, 3, -2, -4, 0, -1, 3, + 1, -3, 4, 6, 0, 1, 2, -3, 0, 0, -5, -13, -4, -2, 1, 2, + -3, -10, -4, -7, 1, -2, -2, -1, 0, 1, 1, -4, -1, 2, -2, 7, + 1, -3, 0, 0, 4, 5, 2, 2, -1, 6, 9, 1, 3, 1, -5, 5, + -6, -5, -2, -4, -2, 2, -7, -4, -11, -5, 3, -3, -6, -4, -6, 3, + 3, -3, 2, 0, 1, -3, -1, -2, -4, 1, 10, 8, -2, 4, -3, 6, + 6, 1, 0, -7, 2, -2, 1, 3, -4, -4, 4, 1, 0, -2, -5, 2, + -2, 0, -7, -11, -5, -2, -2, 5, -1, -8, -1, -1, 1, 2, -2, -1, + 1, 1, 5, 0, -3, 5, 1, 6, 1, -1, 3, 1, 6, -3, -1, -1, + -3, 4, 12, -1, -1, 2, -4, -1, -6, -8, -7, -3, -2, 1, -9, -5, + -6, -10, 5, 1, -2, -3, -2, 5, 4, 3, -1, -5, 4, 6, 3, 4, + 6, -2, 7, 0, -4, -1, -1, 9, 8, 2, 2, -8, -3, -3, 0, -2, + 0, -4, -2, 0, -6, -7, -14, -6, -5, -1, 3, -6, -2, 1, -3, 0, + -4, -5, 1, 5, 9, 4, 0, 3, 0, 1, 12, 0, 4, 8, 5, 7, + -1, -4, 0, -3, 5, 4, -4, 0, -3, -13, -2, -10, -14, -3, -5, 2, + 1, -3, -4, -8, -8, -3, -2, -2, 3, 4, 8, 0, 2, 1, 2, 12, + 5, 3, 8, 2, 6, 3, -4, -4, -2, -8, 8, -5, -2, -6, -10, -2, + -6, -4, 0, -4, 2, 5, 1, 0, -4, -4, -1, -1, -3, 4, -7, 4, + 3, -3, 4, -4, -3, 8, 4, 7, 0, 0, 2, -1, -2, -1, -2, -7, + 11, -1, 5, -4, 2, -2, 0, 2, -2, -4, -2, 1, -5, 3, -6, -9, + -3, -3, -2, -5, -5, -2, -6, -2, -7, -8, 1, 3, 5, 9, 4, 4, + 0, 5, 8, 1, 3, 7, 5, 10, 11, -7, 3, 0, -3, 1, -1, -7, + -7, -3, -2, -6, -9, -6, -12, -4, -1, 0, -8, -5, -3, -3, -2, 3, + 1, 1, 9, 4, 2, 5, -1, 2, 6, 2, 0, -3, 2, 2, 5, 2, + -1, -4, 4, 1, 1, 2, -5, -8, -1, -3, -1, -9, -4, 1, -4, 5, + -6, -4, 0, 3, -9, 3, -3, -5, 1, 4, 4, 1, -4, 1, -4, 4, + 1, -6, 0, 5, 7, 8, 1, 6, 0, 3, 4, 2, -3, 1, -3, -3, + 3, -9, -6, -7, -2, -1, -3, -5, -6, -5, -5, -6, -5, 4, -3, 5, + 5, -2, -1, -1, -3, 6, -2, 5, 6, 2, 11, 8, -1, 3, -6, -2, + 5, 4, -3, -3, -5, -3, -7, -5, 0, -5, 2, 1, 0, 1, -7, 0, + -3, -2, -1, -2, -5, 7, -4, -2, -3, -2, -3, 4, 4, 9, 0, 1, + 1, -5, -3, -4, -4, 4, 3, 6, 0, -2, -2, -6, 4, 1, 1, -3, + 3, -1, 2, 0, -7, 0, 0, -1, -3, -2, -1, -5, -2, -3, -8, -5, + -5, -1, 5, 5, 2, 2, -3, 4, 3, 3, 6, 3, -1, 10, -4, -3, + -2, -3, 0, -4, 0, -2, -2, 0, 1, -4, -2, -5, -9, 8, -2, -1, + -1, -3, -3, -2, -6, 2, 1, 2, 9, 0, 1, 3, -4, 2, 4, -6, + -1, 2, -1, 6, 3, 0, -5, -3, -1, 0, 3, -3, 0, -6, -2, -3, + -4, -2, 0, 3, 2, 2, 0, -10, 1, -6, -5, -1, -2, 5, 3, 6, + -2, -6, -1, -3, 2, -1, 0, 0, -1, 0, 0, 0, 1, -2, 2, -2, + -5, -1, -2, 16, 12, -18, -10, 3, -14, -10, 16, -1, -3, -16, 28, 3, + -1, -1, 12, -5, -6, 6, 7, -7, -18, -28, 11, 0, 6, -2, 26, -21, + -10, -1, 24, -3, 20, -19, 15, -14, -3, -3, 15, -35, -2, 6, -14, 30, + 6, -36, -8, 17, 0, -27, 26, 16, -38, 8, -14, 57, 3, -31, -14, 34, + -20, 33, 2, -6, -7, -28, 20, -24, 8, 13, 8, -39, 17, 40, -42, -11, + 13, -46, 1, 28, -22, 11, -3, -14, 5, 20, -12, -4, 49, -22, -24, 39, + -11, -1, -9, 37, -30, 13, 34, 4, -11, -25, 18, -22, 1, 29, -17, -3, + -26, -16, -21, 12, -18, 7, -17, -6, 51, 0, -21, 10, 24, -45, 8, 14, + 31, -10, -37, 6, 0, 24, 3, -18, -13, 14, 11, 0, 7, -1, -38, -29, + -21, 32, -30, 22, -26, 14, -40, 55, -36, 30, -12, 8, 31, -16, 19, -15, + 23, -48, 36, 1, 63, 3, 24, 0, -3, 14, 26, -21, 15, 47, -21, -80, + 14, -4, -25, -33, 11, 25, -35, -44, 13, -2, -48, -11, -23, -7, 27, -4, + -15, -22, 5, 26, -36, 50, 23, 11, -23, -14, 19, 32, 14, 38, -66, 56, + -11, 26, 18, -12, 17, -30, -6, -54, 22, 77, -62, -12, -16, 34, -25, 2, + 14, -62, 12, 20, -22, -50, 58, -29, -58, 4, 28, 30, 13, 25, -78, 38, + 45, -19, -7, 52, -61, 27, 17, -21, -4, 6, 37, -24, -38, 73, 8, -16, + 21, -2, -15, -19, -19, 18, 3, 7, -48, -10, -10, 10, 4, 13, -13, -4, + 0, 46, -12, 6, -18, -25, 4, 14, 27, -22, -37, 14, -6, -17, 55, 40, + -111, 63, 9, -38, -16, 46, -35, 4, 0, -10, -8, -12, 58, -69, 1, 66, + -38, 21, -33, -6, 10, 0, 10, -11, 18, -16, 32, -7, -10, -25, 65, -42, + 42, -62, 18, -3, -2, -8, 21, 4, -71, 13, 40, -3, 18, -19, -29, 15, + -66, 60, -50, -6, 67, -80, 17, 66, -21, -20, -15, 68, -16, 72, -4, -23, + 4, 53, -8, 8, -4, 0, 27, -26, -22, 25, -31, 7, -39, -18, 27, -43, + -25, -33, -6, 17, -16, 0, -55, 6, 26, -3, -67, 7, 60, -83, 25, 15, + 45, -8, 51, -55, 28, 42, 42, -17, 37, -6, 17, 8, 11, -1, 59, -7, + -45, 14, -41, 107, -49, -50, -25, 63, -58, -27, -57, 19, 13, -13, -27, 19, + -42, 63, -113, -1, 44, 8, 1, -10, -33, 0, 55, -41, 15, 0, 76, -17, + -39, 60, -20, 28, 54, -93, 15, 83, -30, 4, -56, 49, -58, 30, -28, 2, + 54, -64, 83, -128, 86, 24, -40, -27, -66, 51, 11, -51, 59, 6, 20, -58, + -24, 78, -7, -23, -27, 1, -3, -24, 10, -6, -16, 34, 39, -37, -17, 26, + 52, -69, -7, 11, 24, -62, 38, -13, 41, 5, -2, -5, -12, 15, 77, -49, + -10, 74, -12, -11, -38, 32, -24, 25, -6, 19, -24, -2, -38, 63, -91, 64, + -27, -11, -56, -43, 27, -41, -55, -15, 1, -4, 27, 8, 37, -57, 3, 28, + -11, -4, 46, -39, 3, 12, 100, -33, 39, 17, 6, 49, 5, 38, -12, 10, + 21, -35, 23, -6, -36, 10, -9, 3, -1, 13, -65, -40, 36, -25, -28, 5, + -37, -20, -14, 31, -16, -32, -16, 4, 15, -11, 26, -16, 29, -42, 46, 7, + 39, -1, -5, -9, 33, -31, 35, -33, -7, 17, 56, -24, 22, 14, -22, -34, + 44, 16, 11, -46, 43, -48, -27, 43, 36, -45, 21, 11, 0, -98, -22, 87, + -126, 52, -45, 34, -28, -17, -31, 23, -38, 23, 25, -11, 25, -63, 21, 13, + 19, 47, 28, -23, 20, 21, -5, -14, 112, -30, -67, 37, 43, -12, -57, 34, + -9, -29, 52, -19, 14, -51, 0, 26, -69, 3, -18, -24, -34, 31, -15, -33, + -36, 10, -20, -38, 63, 0, 44, -50, 72, 25, -16, -6, 6, 15, 23, 31, + 3, -20, -9, 19, 63, 17, -18, -5, -12, -87, 31, 26, -37, -29, 49, -42, + -15, 14, 11, -16, -31, 46, -19, -13, -37, 59, -91, 47, 4, -11, -26, 39, + -29, -24, 48, 10, 39, -11, 45, -51, -1, -24, 47, -19, 39, -34, -29, -17, + 1, 56, -25, -16, -13, 0, 48, -71, 49, 2, -2, -45, -10, 59, -17, -25, + 9, 9, 44, 42, -32, -23, -49, 46, -11, -50, 76, -43, -45, -1, 41, -8, + 2, 71, -36, -61, 35, 21, -13, -36, 44, -45, 26, -45, -21, 28, -37, 39, + -29, 15, 4, -5, 24, -7, 7, 3, 68, -80, 26, 24, -22, 8, 26, 28, + 10, -26, -3, 16, -51, 85, -8, -14, -54, 39, -28, -9, -25, 46, -39, -20, + 34, 11, -25, -7, -12, -41, 12, -17, -5, -43, -8, 0, 18, 13, 9, 28, + -40, 34, 0, 13, 40, -20, 5, 22, -25, -13, 51, 9, -34, 43, -16, -18, + 2, 35, -4, -28, 14, -37, 6, -8, 31, -49, 9, -31, 61, -55, 35, -46, + -37, -12, 32, 74, -59, -30, -21, 5, 38, 3, 48, -35, -42, 2, 29, 81, + -8, -37, 24, 42, -31, 18, -11, -21, -67, 98, -18, 11, -26, -14, -76, 11, + 71, -70, 30, -52, 37, -45, 61, 6, -33, -44, 58, 24, -16, -51, 49, -28, + 51, -6, -15, 46, 10, -24, 36, -4, 6, -30, 46, -66, 54, 27, -16, -34, + -23, 90, -61, -49, 22, -3, -22, 17, -35, -11, -59, 23, 2, -25, 69, -24, + -26, -28, 37, 12, 11, -63, 27, 18, 3, 34, -25, 9, -14, 29, 4, 24, + 21, -77, 12, 14, 37, 1, 45, -63, 1, 49, -14, -23, -7, -4, -42, 48, + -57, 18, -36, 17, 15, -37, 47, 1, -41, -14, 11, 49, -32, 32, -36, -19, + 21, -11, 39, -31, 43, 0, -24, 15, 6, 9, -46, 5, 21, -23, 2, -28, + -15, 59, -13, -29, 50, -7, -45, -12, 23, -1, 27, 6, -17, 7, -4, -3, + -3, 53, -10, 17, -52, 19, 24, -8, -7, 19, -51, -30, 55, -22, -22, 29, + -38, -25, 39, 3, 34, -84, 26, -37, 42, 15, 4, -4, -16, -33, 29, 17, + 43, -93, 24, -6, -20, -14, 107, -29, -36, 69, -21, 10, -7, 74, -67, 38, + -23, -8, 27, -35, -49, 29, -8, -4, 7, -8, 5, -38, -28, -33, 22, 70, + -37, -10, -56, 26, 5, 7, 59, -21, -58, 10, -2, 6, 49, -16, -9, -38, + 60, 13, 43, -43, 23, -14, -9, 38, 17, -38, -15, 29, 6, -5, -11, -3, + -4, -65, 45, -13, 26, -13, -4, -5, -38, 48, 0, 4, -40, 40, -48, 23, + 21, 23, -42, 5, -17, 13, -9, 12, -3, 5, -25, 34, -24, -3, -18, 16, + -44, 13, 27, -30, 44, -54, 6, -18, -3, 4, 21, -25, -13, 22, -20, -12, + 37, -10, -10, 5, 24, -17, 23, 9, 0, 4, 3, 12, 26, -27, 17, 9, + -41, 69, -1, 15, -37, 15, -6, 0, -1, 3, -13, -23, -18, 27, -5, 21, + -16, -41, -2, 20, 13, -27, 6, -21, 8, 6, 0, 6, -5, -21, -22, 73, + -40, 4, 6, 21, -8, -5, 29, -47, -1, 1, 19, 3, -10, -1, 2, -48, + -11, 45, -27, 11, -33, -21, 21, 7, 12, -22, 21, -40, 13, 27, -20, 37, + 5, -18, -18, 35, 40, -11, 20, -25, 10, -4, 33, 12, -29, 9, -20, -30, + 34, 24, -9, -10, -24, -16, 8, 22, 6, -58, -5, -13, 18, 5, -43, 10, + -16, -25, 13, 70, -25, -7, -25, -19, 16, 58, -46, -5, 6, -5, 40, -24, + 22, 50, -73, -7, 7, 32, 39, -27, -23, -23, 56, -35, 21, 17, -40, 40, + -52, 4, 0, 49, -29, -42, 24, 9, 31, 2, -46, 0, -9, -5, 9, -31, + 64, -5, -45, -26, 42, -4, -34, -8, -3, 32, -15, -8, 22, -24, 13, -31, + -2, 31, 10, -10, -18, 8, 24, 20, -29, 2, 14, 23, 25, -4, -19, 20, + -25, -5, -3, 23, -8, 52, -42, -17, -7, 29, -26, 2, -19, 55, -50, -28, + 1, -10, -7, 7, -41, 16, 21, 1, -20, 0, 16, -19, 14, -39, 86, -17, + -34, -64, 73, 0, 20, -28, 30, -22, 9, 58, -4, -8, -18, -20, 31, -21, + 1, 26, -49, 5, 41, -25, -13, -6, -7, 6, 10, 42, -30, -26, -43, 11, + 44, -54, 31, -10, -11, -17, 25, 32, -43, 64, -23, 3, -37, 33, -30, -4, + -35, 47, -29, 9, 23, -34, -5, 64, -37, 32, -11, -44, 21, 25, -19, 8, + 6, -25, 34, 2, -18, -23, 38, 20, 7, 21, 1, -32, -37, 50, -9, -25, + 34, -61, 55, -32, 7, -48, 20, 13, 0, -35, 17, 9, -42, -28, 14, 42, + -33, -25, -5, 21, 41, -60, 32, -7, 38, -9, -3, 20, -4, 29, -69, 62, + -16, 35, -64, 45, 10, 5, -1, -18, -18, -1, 5, 32, 0, -21, -12, -23, + 29, -15, 13, -39, -3, -3, 6, 35, -24, -23, -7, -2, 44, -10, -37, 25, + 25, -25, -23, 7, 40, 4, -40, -18, 21, -2, -3, 1, -16, 45, -26, -2, + -16, 18, 41, -64, 8, -26, 40, 5, -32, 8, 18, -1, 15, -1, 9, 2, + 2, -13, -12, 35, -9, 13, -62, -29, 72, 18, 7, -30, 26, -7, -29, 39, + -38, 31, -56, -25, -3, 17, 2, -3, -46, 35, 6, 27, -39, -3, 3, 31, + -25, -19, -2, 38, 26, -77, 22, 18, 40, 3, -22, 65, -48, 33, -16, -37, + 78, -34, 1, -52, 23, 16, 1, -37, 17, 12, 1, -4, 8, -27, -1, -11, + -18, 27, -23, -10, -11, -19, -6, -7, 51, -74, 16, 20, 17, -14, 7, 7, + -13, -8, -5, -11, 39, 21, -5, -44, 31, 64, -38, -18, 20, 40, -4, -10, + 10, -23, 23, -6, -20, 11, 9, 10, 6, -23, -11, 1, 17, -56, 56, -40, + 0, -17, -60, 84, -80, 16, -13, 4, -25, 12, 17, -42, -26, 54, -29, 12, + -5, 37, 16, -62, 94, -5, -2, -2, -2, -9, 5, 51, -25, -5, -11, 5, + 16, -14, -9, 43, -44, -8, 27, 2, -1, 9, -18, -6, 5, 23, -46, -9, + 13, 16, -10, -10, -23, 59, -47, -14, 23, 29, -15, -14, -30, 21, -21, 0, + 14, -3, 25, -16, -35, -2, -8, 32, -19, 22, -23, -37, 30, -33, -19, 11, + 12, -32, 47, -4, 27, 11, 9, -35, 39, 29, -18, -2, -11, 27, -2, 13, + 0, 18, -26, 15, -25, 26, -4, 21, -29, -33, 18, -8, -31, -5, 21, -1, + -38, -28, 41, -18, -4, -22, 47, -12, -44, 55, -79, -5, 19, -10, 25, 4, + 21, 15, -28, 13, -6, 45, -24, 25, 10, -26, 4, 2, 31, 3, -7, 3, + 5, -23, 51, -9, -32, -5, 35, -32, -21, -20, 35, -40, -10, 20, -8, 7, + -5, -38, -1, -24, 39, -26, 20, -16, -9, -27, 25, 34, -32, 1, 12, -13, + 3, 37, 13, 3, -31, 27, 30, 5, -15, -21, 2, 10, -13, 16, 36, -9, + -59, 41, -10, 61, -60, -35, -11, 7, 5, -28, 30, 5, -23, -66, 34, 50, + -26, -19, -10, 11, 8, 8, -35, -5, -11, 56, -24, 10, 35, 16, -10, -19, + 30, 4, -11, 23, 0, -6, 6, 36, -15, 0, 15, -14, -26, -8, -5, 15, + -31, -45, 42, -30, 0, -9, 6, -22, 9, -22, 7, -8, 15, -19, -3, -13, + 29, -14, 9, -16, 3, -5, -10, 63, 0, 4, 4, 20, 16, -21, 18, 31, + -24, -19, 31, 54, -39, -7, -16, 5, -3, 0, -29, 16, 6, -29, -25, -52, + 49, -9, -66, -3, 50, -3, -2, -14, 4, -8, 33, -40, 2, 15, -6, -17, + -4, 10, 48, -16, 14, -9, 27, 10, 2, 2, 40, -35, 5, -10, 7, 28, + 1, 4, -30, -4, 0, 1, -14, -13, -11, 26, -17, 13, -44, -9, -6, -23, + 17, 11, 11, -21, -11, 0, 9, 8, 8, -30, 29, 10, -26, -12, 15, 17, + 4, -26, 14, 19, 20, -9, -24, 39, 23, -10, -35, 8, -6, 18, -25, 15, + -17, 41, -48, -31, -5, 47, -14, -20, -4, -7, 5, -19, 3, 21, 12, -23, + 15, -24, 8, 3, -25, 2, 28, 14, 21, 25, -72, 15, 26, -6, 45, -27, + 29, -30, -17, 23, 6, -2, 27, -46, 13, 9, 15, -57, 27, 1, -18, 1, + -11, -2, -20, -16, -23, 24, 18, -21, -5, -15, -14, 26, -12, 30, -48, 37, + -24, -3, 23, 9, -5, 9, 8, -43, 23, 26, 6, 28, -29, 30, -8, -12, + 25, -18, 33, -48, -4, 29, 1, -8, -4, -20, 41, -22, 1, 12, -33, 0, + -17, -16, 29, -3, -2, -36, 6, -1, -11, 4, -24, 40, -24, -5, 26, -2, + -28, 13, -11, 35, -9, -2, -3, -6, 13, 10, 1, 11, -22, 22, -27, -5, + 20, 11, -1, 8, -23, 8, 7, -7, 17, -6, 16, -9, -10, 3, 13, -3, + -17, 19, -21, 6, -13, -15, -7, 22, -15, -7, 11, -20, -19, -6, 0, 28, + -10, -7, -13, 9, 7, 1, -11, -6, 21, -33, -4, 52, -11, -1, -2, -2, + -4, 32, 17, -31, 7, 12, 2, -5, 11, -1, -6, 1, 3, -11, 5, 4, + -15, -8, 10, 5, -18, 5, -26, -11, 22, -15, -23, 22, 19, -30, 3, 1, + -5, 10, -17, 10, -2, 10, 7, -17, -5, 36, -12, -24, 27, 22, -3, -11, + -6, -7, 20, 5, -21, 0, 23, -31, -27, 14, 2, 8, 7, -15, 0, 13, + -7, -3, -21, 33, -4, -26, 7, 5, -7, -7, 1, 3, 4, 11, -24, 6, + 11, -7, 14, -9, -11, -1, 34, -22, 11, 1, -18, 17, 4, -19, 28, -15, + -7, -11, 12, 1, -7, -9, -12, 17, -20, 6, 5, 2, -10, 12, -23, -3, + 26, -1, 4, 6, -25, 12, -3, -26, 2, 15, 14, -18, -6, -17, 14, 4, + -10, 21, -13, 5, -15, -20, 27, 6, 8, -11, 18, 15, -34, 17, -2, -13, + 41, -9, -10, -6, -2, 7, -11, -4, 28, -26, -6, 25, 17, -36, -2, 33, + -39, -15, 11, -2, 26, -32, -31, 21, 26, -11, -24, 12, -17, 4, -33, 24, + 14, -10, 12, -19, -3, 28, 11, -8, 0, 26, -17, -7, 8, -6, 20, 26, + -29, -27, 25, -14, -2, 10, -16, 39, -24, -17, -4, -13, 24, -10, -3, -20, + 25, -1, -24, 24, -20, -5, 21, -26, 7, 21, -26, 15, 17, 6, -34, 5, + 11, -27, 20, 17, -13, -8, -16, 9, 33, -36, 19, 5, 4, -2, -33, -12, + 38, -17, -10, -4, 19, 14, -4, -32, -41, 64, 5, -38, 28, 6, -2, -11, + -22, 11, 17, 17, -24, 23, -7, 9, 10, -38, 0, 25, -9, -6, -27, 20, + 2, -27, 34, -23, 17, -22, 4, 12, -43, 29, -8, 25, -19, 13, -17, -11, + 27, -8, 14, -19, 12, 9, -22, -6, 11, -10, 17, -4, 2, -3, 15, -47, + 32, -18, 11, 14, 0, 8, -33, -14, -12, 23, 17, -12, -4, 13, -27, 10, + -17, 20, -2, -11, -11, 27, 18, -21, -6, 26, -18, 9, -7, 27, -12, 3, + -9, -9, 22, 7, -38, -2, 14, -16, 12, -21, -10, 22, 1, -28, 20, 31, + -11, -49, 9, 16, -4, -7, -4, -5, 46, -39, 9, -18, 16, 22, -24, -13, + 14, 29, -10, 3, -23, 4, 11, -33, 30, 18, -9, 5, -11, 4, -20, 30, + -9, -14, -7, -9, 4, 0, 4, -15, -11, 23, 5, -24, 26, -6, -8, -17, + 21, 0, 3, 13, -10, -13, 19, -16, -10, -5, 10, 8, 22, -19, 4, -8, + 0, -24, 38, 12, -33, 10, -9, 5, -13, 11, 3, 7, -18, -12, 11, -4, + 8, -17, -7, 16, -9, -2, -9, 0, 10, -2, -1, -1, 12, -6, 13, -18, + 18, -6, 10, 1, -3, 9, -2, -30, 23, -9, 29, -11, -31, 10, 6, -21, + -19, 54, -30, 18, -12, -26, 23, -10, -31, 23, -5, 49, -34, 4, -18, 3, + 11, -24, 27, 12, -24, 3, -13, 3, 16, -6, -7, 1, 19, -8, -3, -11, + 13, -14, 19, 10, 17, -21, 14, -40, 12, 13, -5, -3, 21, -14, -29, 16, + -24, 1, 10, -1, -3, 6, -15, -16, 16, -4, 2, 23, -32, -1, 7, -5, + 13, 4, -15, 33, 1, -7, -7, -12, 13, 6, -8, 2, 21, 2, -21, 17, + -14, -19, 36, -2, -16, -4, 3, 9, 15, -39, 3, 9, -10, -3, -12, -7, + 28, -19, 8, -18, 22, -18, -11, -2, 17, 23, -15, -24, 11, 13, -14, -10, + 9, 4, 14, -10, -13, 13, -3, -12, 25, 6, -12, 12, -19, -3, 19, -10, + -13, 19, 10, 18, -31, -15, 19, -9, -14, -6, 25, -18, 2, 17, -41, 11, + 16, -20, 3, -10, 16, 9, 14, -27, -1, -3, 9, -19, 36, -6, -4, -4, + -16, 5, -7, 24, -1, -30, 13, -8, -4, -9, 47, -37, 3, 21, -24, 1, + 3, 11, 5, -10, -8, 20, -31, 16, 10, -1, 0, -9, -1, -6, 14, -6, + 6, -17, 20, 3, -23, 10, -14, 17, -16, -2, 26, 7, -20, -10, 9, -18, + 31, -35, 3, 14, -8, 13, -27, -4, -4, 26, -20, -9, 14, 22, -27, -4, + 18, 9, 9, 3, -13, -20, 15, -13, 6, 12, -5, -6, -12, 0, 4, -10, + 18, -7, -8, -15, 1, -11, 17, 5, -11, 14, -6, -11, 4, 10, -5, 13, + 0, -7, 15, -2, -16, 2, -3, 9, -6, 2, 34, -11, -17, -8, 21, 13, + -21, -4, 14, -7, -7, -19, 13, -7, 4, -25, 7, 16, -14, -40, -11, 36, + 3, -10, 4, -10, 7, -1, -1, 4, 14, 6, -14, -14, 17, 23, -13, -2, + -1, -12, 9, 8, 1, -7, 22, -29, 7, 7, 0, -24, 13, -10, 18, -1, + -3, 13, -24, 30, -32, -5, 18, -2, -6, -8, 11, -18, -12, 17, -11, 0, + 5, -4, -14, 31, -15, -16, 13, 12, -4, 4, -4, -1, -11, -15, 26, -18, + 29, -15, -3, -8, 6, 6, -34, 22, 0, 11, -18, 16, 20, -19, -21, -5, + 11, 21, 10, 10, -27, -5, 3, 2, -5, 9, -9, -1, 1, -11, -3, 8, + 4, 1, -1, -11, 19, -1, -21, -5, -2, 11, -2, -8, 10, -7, -1, 2, + -18, 3, 0, 7, 2, 7, 1, 1, -28, -14, 10, 19, 12, -21, 7, -19, + 20, -2, -3, -1, 17, -11, -13, -16, 32, 4, -5, -3, 4, -4, 18, -2, + -17, -6, 16, -3, 4, -12, 4, -2, 2, 6, -18, 20, -24, 17, -10, 19, + -16, -17, 8, -7, -5, 16, -12, -18, 11, 9, 2, -8, 17, -9, -3, -13, + 7, -6, 30, -15, -11, 5, 14, -2, -15, -5, 14, 13, -12, -24, -10, 22, + -2, -8, -1, 21, -5, -19, -16, 8, 42, -6, -27, -12, 23, 10, -17, -14, + 16, 14, -16, -2, 9, -2, 16, -9, -31, 22, 0, -2, 3, 4, -5, 20, + -24, -5, 13, -1, -5, -10, -6, 8, -11, 2, 8, -8, -5, -9, 1, -6, + 16, -1, -18, 4, 9, -3, 6, -4, 6, 9, -7, -9, -1, 10, -7, 4, + 3, -3, 4, -8, -5, 3, -4, 10, 6, -15, 2, 3, -5, -2, -3, -12, + 18, 2, -16, 7, 13, 0, -19, -8, 11, -6, -1, -9, 5, 13, -8, -6, + 6, 7, 11, -11, -6, 13, -2, -5, -1, 9, -2, -7, -15, 10, 5, -1, + -13, 8, 0, -6, -2, -2, 18, -16, -7, 2, 3, -4, 6, -11, 4, 6, + 1, -5, 22, -11, -5, -6, -3, 11, -1, -1, 4, 1, -4, -13, -4, 11, + -9, 1, 9, -1, -8, 1, -5, -7, 5, -14, 18, -1, -12, 11, -12, 16, + -5, -11, 11, -2, 15, -7, -18, -10, 0, 18, -12, 8, 3, 6, -16, -3, + 3, 6, 0, -1, -3, 4, 9, 3, -17, -7, 11, 11, -19, 5, 15, -12, + -3, -12, 4, 11, -19, 0, 0, -14, 21, -15, 2, 8, 3, 8, -8, 5, + -18, 9, -2, -8, 23, -5, -16, 5, 3, -20, 13, 11, -6, -15, 5, 4, + -12, 2, 10, -5, -12, 5, -14, -2, 18, 11, -14, 0, 28, -10, -20, 4, + 7, 9, -13, -6, 15, 11, -9, -6, 14, -8, 10, 4, -12, 11, -18, 13, + -17, -9, 16, -4, -14, -7, 17, -24, -5, 4, 6, -6, 14, 2, -24, -22, + 11, 13, 8, -16, 6, 13, -28, 10, -2, 11, 8, -1, -8, -14, 22, 3, + -5, -13, 18, 7, -26, 15, 20, -6, -10, 4, 11, 5, -8, -3, -5, 0, + -1, -6, 0, 4, 4, -14, -1, 1, 8, -14, -10, -4, 6, 4, -8, 3, + -9, 0, 11, -4, -7, 5, 4, 6, -29, 18, 22, -19, -16, -11, 17, 7, + -4, 3, -23, 20, 8, -19, 3, 13, 13, -16, -18, 15, -6, 0, 3, 17, + -7, -4, 2, -22, 21, -1, -2, -1, -15, 13, 3, -7, 4, 0, -7, 8, + -7, 11, 3, -2, -8, 10, -15, 0, 9, -14, -8, 8, -2, -9, 10, -13, + 9, 7, -6, 2, -12, -4, 6, -12, 8, 12, 3, -10, 6, 7, 1, -2, + -11, -1, 7, -7, 8, -13, -10, 11, -9, -10, -8, 20, 9, -11, 8, -5, + -4, 6, -3, 5, 13, -13, -7, -7, 6, 19, 0, -9, 9, -1, -3, 4, + -7, 0, -2, -4, -5, 5, 0, -5, 14, -19, -14, 18, -1, -5, 3, -12, + 18, -19, 4, -15, -10, 10, 10, -17, -4, 19, -6, -2, 5, 11, -4, -3, + 9, -22, 28, -6, -5, 0, -1, 11, -11, -13, 22, 3, -8, -9, 1, 3, + 0, 1, 2, 7, -5, -25, 10, 6, 6, 2, -11, 8, -16, 15, -20, 5, + 9, -6, -13, -5, 14, 6, -21, 22, -7, -14, 4, 26, -8, -13, 8, 1, + -10, -13, 11, 10, -10, 2, -13, -9, 15, 0, 10, -30, 14, 7, -13, -5, + -12, 8, 10, -4, 10, 12, -15, -7, 5, 2, 2, 10, -13, -3, 0, 21, + -2, -16, 9, 3, -1, 6, 15, -3, -21, 10, -8, 5, 1, 1, 2, -19, + 10, -7, -3, -1, 8, 6, -26, -10, 18, -28, -3, -3, 4, 0, -7, 6, + -10, -2, 25, -19, 5, -11, -2, 14, 4, -5, -3, 4, -5, 6, -2, -3, + 11, -1, 13, -12, 5, 20, -15, -3, 17, 4, -14, -5, 11, 3, 1, 6, + 11, -20, 10, -4, -4, -4, -4, -18, -7, 5, 10, -25, 7, -9, -15, 1, + -4, 4, 4, -4, -1, -18, 9, -6, 4, 7, -19, 10, 0, 3, -6, 12, + 18, -5, 2, 4, -4, 11, 2, 5, 2, 1, 3, -4, 3, 4, -3, -2, + -8, 11, 5, -10, -12, 12, -6, 6, -9, -6, 4, 9, 0, -9, 4, 3, + -7, -5, -12, 19, 2, -28, 1, 0, 9, -10, -6, 3, 3, -11, -4, 6, + 7, -7, -3, 5, -12, 9, 10, -12, 7, 5, 5, -6, -9, 16, 6, -16, + 3, 8, -17, 12, -5, 2, 1, 21, -25, -10, 5, -2, 15, -6, 1, 3, + 5, -16, -2, -16, 32, -17, 7, -13, 6, -1, -4, 0, -4, 10, -2, -17, + -7, 29, 0, -13, -1, -1, 2, 12, -4, 3, -2, 4, -19, -1, 18, 2, + -3, -15, -2, 10, -4, 1, -2, -5, 20, -5, -6, -7, 9, 0, -2, -24, + 5, 15, -2, -11, 1, 0, -2, -14, -2, -4, 7, 4, -4, -9, 2, 4, + -8, 8, -1, 2, 10, -13, 4, 10, -4, 27, -22, 17, -18, -2, 5, 8, + -1, 4, -6, 2, -1, 9, 1, -3, 16, -21, -18, 2, 10, -14, 9, 3, + -14, -9, 0, -16, 9, -10, 11, -12, -3, 1, -10, 3, -2, 2, -13, 13, + 10, -1, 4, 4, 1, -3, 9, 0, 4, 8, -14, 10, -4, 0, 8, 11, + -2, 2, -11, 3, -13, -8, 11, 4, 1, -7, 4, -21, 0, 1, -4, -22, + 17, -8, -16, 10, 4, -2, 0, -4, 2, -2, 2, -6, 10, 3, 3, 5, + -1, 6, 5, 2, -6, -3, -2, 7, -4, -4, 12, 1, -30, 12, -7, 3, + 4, -6, -7, -9, 9, -1, 7, -10, 12, -16, 2, -8, 23, -5, -5, -1, + -8, 10, 3, -14, -12, 25, 7, -13, -6, 4, 15, -3, -23, 9, 12, -9, + -13, 18, -9, 5, 1, -17, -4, 13, -10, 11, -10, -1, 6, 0, -7, -2, + 9, -4, 9, -24, 7, 6, -5, 4, 15, -15, 11, -5, -24, 9, 11, -16, + 2, 0, -9, -2, 10, 7, -12, 8, -12, -6, 10, 6, 10, -14, -5, 20, + -16, 7, 8, -1, -19, 24, 2, -10, 15, 6, -6, -21, 3, -3, 15, -9, + -3, 3, -2, -4, -3, -9, 5, 0, -5, -3, -15, -4, -1, 1, -14, 33, + -12, -18, 9, -2, -10, 9, 9, -1, -1, -5, 10, -3, 2, 4, 2, -9, + -1, 25, -2, -3, 15, -17, -7, 8, -7, 0, 10, -13, 9, -11, 0, -3, + 18, -15, -11, 5, 0, -12, -2, 7, -6, -4, -9, 11, -6, 8, 1, -14, + 3, 16, -10, -3, 2, 6, 4, 9, -9, -2, 0, 2, -3, 15, 3, -10, + -4, -8, -1, 10, -13, -9, 16, -9, -3, -2, 5, -6, -6, -9, 10, 8, + -4, 14, -7, -19, 12, 1, 2, 1, 4, -1, -6, -3, -3, 5, 7, -2, + 0, 0, -5, 0, -6, 1, 6, -5, -4, 5, -6, 5, -4, -8, 15, -5, + -7, 0, 3, -8, 0, 3, -8, -4, 6, -4, -4, 15, -5, -8, -7, 4, + 7, -10, -6, 15, -4, -13, 7, 2, 2, 1, -4, 5, 0, 0, 1, 4, + -7, 4, 4, -2, 4, 5, 1, -18, 12, 4, -3, -6, 11, 0, -13, -1, + 1, -12, 3, 13, -9, -15, 7, 0, -4, -8, 0, 5, 0, -9, 1, 1, + -3, 0, 3, 5, -10, 6, -1, -4, 4, 15, -15, -5, -9, 18, -2, 0, + 15, -11, -9, 0, 6, -2, 8, 1, -8, -9, 7, 3, -7, -3, 6, 1, + -5, 0, -5, -5, 0, -3, 11, 1, -3, -8, -4, -4, 5, 9, -6, -7, + 4, 15, -13, 5, -4, 2, -6, -2, 0, 5, 4, -4, 0, -6, 8, 3, + -2, -4, -4, -11, 4, 10, -1, -4, -2, -1, -3, 1, -4, -2, 3, 1, + -4, -11, 12, -4, 5, -2, 7, -12, -2, 4, -4, 5, 8, 1, -8, 14, + -11, -1, 1, 4, 0, 5, -5, 2, -7, -7, 10, 3, 1, -13, 0, -4, + 5, -9, -1, 1, -11, -5, 5, 2, -6, 5, -5, -8, 12, -2, 7, -1, + -10, -5, -7, 14, 9, 3, -5, -2, 5, 4, -2, 0, -5, 2, 3, 3, + -12, 6, 3, 2, -9, -1, 24, -13, -9, -1, -2, 0, 7, -6, -17, 14, + -12, -5, 10, 1, -4, -1, -1, 1, -3, 2, -2, -11, 1, -1, -1, 1, + 10, -3, 2, 1, 5, -7, 1, -1, -5, 7, 1, 7, -4, 5, -11, -8, + -8, 7, 8, 6, 0, -15, -1, 7, 0, -6, -3, 7, -4, -3, -2, 1, + 5, 8, -6, -4, 11, 3, -14, -6, -3, -6, 9, -5, 4, -5, 2, 3, + -13, -3, 1, -4, -3, 11, -1, 0, 7, -16, -6, 11, 5, 0, 4, 5, + -2, -3, -2, 8, 7, -16, 1, 2, 6, 3, -17, 11, -2, -2, -9, 6, + 0, -7, 6, -22, -2, 14, 3, -11, 0, -6, -2, -7, -7, 1, 4, 14, + -1, -6, 0, 7, 3, -14, 4, 15, -4, -9, -2, 12, 14, -10, 5, 9, + -11, -2, -9, 2, -9, 11, 2, -21, 7, 6, -11, -1, 0, 0, 1, -9, + 4, 0, -10, 1, 3, -3, -7, 12, -9, -2, 4, 6, 3, -8, 0, 1, + -2, -14, 12, 11, -5, 10, -3, -1, 3, -6, 1, 0, -3, 8, -1, -18, + 12, 5, -13, -4, 17, -1, -6, 1, -11, 0, -6, 2, -2, -2, 5, 3, + -17, 2, -5, 11, -4, 8, 8, -19, -6, 14, -6, -6, 0, 5, 0, -8, + 7, 13, -6, -5, 6, -2, -9, -1, 8, 3, -4, -4, 10, -10, -9, 7, + 2, -6, 14, 0, -15, 3, 5, -4, -10, 8, 0, -6, -11, 3, 10, -9, + 1, 8, -7, 2, -1, -6, -8, 6, 2, -8, -2, 16, -3, -3, -1, 5, + -3, -8, 6, 9, -6, 1, -1, -1, 2, -6, 6, -1, -9, 3, 9, -10, + 1, 5, -4, -14, 2, 1, 7, -5, 3, -2, -13, 5, 10, -9, -8, 14, + -6, -19, -3, 19, -3, -3, 6, -4, -10, 3, -1, -4, 5, 5, 1, 0, + -1, 11, 4, -10, 3, -5, 4, -7, 1, 8, -3, 1, 2, 0, -10, 2, + 5, -15, -3, 8, -8, -6, 5, -2, -5, -5, 11, 0, -12, -7, 5, 2, + -5, 2, -1, -4, 2, 7, -12, 5, 6, -3, 5, -1, 12, 7, -13, -3, + 0, 3, 0, 13, -1, -4, 0, -9, 5, -6, 5, -2, -10, -6, -2, 9, + -8, 5, -6, -10, 5, 4, -6, -2, 1, 1, 6, -14, 10, -3, -4, -5, + 1, 8, -16, 7, 7, -1, 0, 3, -5, 2, -1, -3, 11, -11, 9, 8, + -18, 3, 8, 13, -4, -5, -9, 4, -2, -4, 9, 5, -6, -5, -15, -3, + 17, -6, 2, -8, 4, 4, -4, -12, -3, -2, -2, -4, 5, -4, 1, 7, + -12, -6, 8, 6, -2, 1, -3, 3, 10, -3, 7, -11, 12, 4, -1, -1, + 1, 0, -11, 11, 4, 0, -2, -9, -2, -2, -8, -1, 5, -4, -5, -5, + 1, 10, -8, -11, -5, -4, 5, -1, 1, 6, -2, -5, -5, 3, 6, -2, + 6, -3, 0, 4, 5, 2, 4, -2, 1, 5, -2, -6, 11, -1, -5, 8, + -14, 6, -2, -6, -11, 4, 2, -14, 6, -9, 5, -4, -3, 4, -12, -2, + 2, -5, 4, 7, -5, 3, 6, -1, -3, -6, 0, 7, 0, 1, 6, 9, + 4, -2, -7, -4, 7, 4, 4, -5, -5, 0, 3, -6, -1, 7, -2, -18, + -1, 3, -15, 5, -2, -2, 0, 4, -10, -4, 3, 4, -10, 4, -1, 5, + 4, -7, 8, -7, 0, 3, 2, -7, 13, 0, -2, -6, -6, 5, 10, -10, + 4, -1, 2, -1, -5, 7, 5, -3, -7, 1, -5, 10, 1, -11, 7, 6, + -10, -15, 12, 2, -4, 1, 0, -5, 3, 0, -2, 6, -5, -4, -13, -2, + 3, 1, 4, 3, 3, -10, -7, -7, 11, -2, 2, 2, -7, 4, -1, 6, + 2, 0, 8, 3, 0, -7, 8, 3, 5, -8, -3, -2, 2, 3, -12, -4, + -3, 12, -12, -4, 7, -3, -10, -10, -4, 6, -2, -8, 9, 1, 1, 1, + -3, -6, 12, -5, -6, -1, 11, -7, 5, 6, 2, 9, -11, 6, -2, 8, + 1, -6, 4, 3, -6, -3, 5, -4, 4, 1, -19, -1, 3, 4, 0, 0, + -10, -1, -3, -5, -3, 0, 11, -1, -12, -2, 6, 0, -3, 3, 4, -1, + -7, 1, -2, -1, 2, -1, 0, 2, -2, 4, -5, -4, 11, -4, -5, -3, + 7, 5, -8, 3, 6, -9, 0, 9, -5, -2, 5, -4, -6, 0, 7, -1, + -2, 0, -1, -6, -9, -6, -1, 8, 4, -1, -9, -5, 13, 2, -11, -5, + 9, 0, -8, -1, 5, -2, -5, -3, -2, 7, 5, -4, -13, 3, 11, -8, + 3, 0, 2, 5, -12, -6, 6, 3, -4, -1, 8, 1, -5, -7, -6, 2, + 8, 5, -2, -9, 7, -6, -2, 13, -7, 2, 1, -1, -5, 3, 7, -1, + -11, 9, -6, -4, -2, -5, -1, 2, -1, 3, 8, -7, -1, -9, 0, 0, + -1, 2, 5, -2, 1, -2, -3, 6, 6, -3, -6, -5, 4, -1, 1, 5, + 1, -1, -2, -3, -4, 4, 3, 1, -7, 5, -1, 0, -8, -6, 1, 7, + -3, -6, -2, 3, -1, -3, 2, 2, 0, -9, 1, -2, 4, 4, -5, 1, + -1, 1, 6, -2, 2, -5, -4, -1, 14, -3, 2, -9, 1, -2, -4, 1, + -1, 7, -9, 5, 2, -3, 2, -2, -9, -2, 4, -1, 2, -2, -2, 0, + -1, -1, -2, 3, 1, -1, -3, -6, 3, 7, -5, -3, 9, -5, -4, -5, + 8, -4, 2, 2, 8, -10, -1, 8, -14, 0, 6, -7, -1, 2, -3, 2, + -4, 5, 2, -5, -4, 5, 1, -6, 3, 6, -4, -1, -3, 3, -7, 0, + 1, 0, -4, 7, 6, -13, -3, 3, 2, -15, 8, 3, -3, -6, 9, -4, + -1, 9, 1, -6, -6, 7, 1, 1, -2, 6, -1, -4, -1, -1, -7, 5, + 3, 0, -5, -2, 8, -2, -8, 6, 7, -16, -5, 6, -6, -1, 1, 7, + -4, -3, -6, 3, -10, -3, 8, -9, -1, 5, -1, -7, 5, 2, -1, 1, + 5, 1, 2, -4, -5, 1, 1, 3, 1, -5, -2, 3, 2, -7, -1, 7, + 5, -5, -7, 5, 0, 3, -1, -4, -4, 4, 0, -4, 1, 6, -3, -7, + 0, -3, -3, -1, 0, -2, -4, 2, 1, -2, 3, -1, 0, -1, -6, 9, + -5, 4, -1, -1, 4, -2, 5, -8, 2, -3, -2, 2, -3, 10, 2, -3, + -5, 2, -4, -1, -3, -7, 9, 1, 0, 0, -5, 1, -2, -12, 6, 8, + -18, 4, -1, 4, -1, 5, -5, -3, 3, -1, 4, -5, 9, -5, -4, -5, + 2, 5, -1, -4, 0, -3, -2, 8, -5, 2, 1, -13, 3, 1, 4, 5, + -8, 2, 8, 1, -1, 1, -9, 1, -2, -4, 1, 4, -3, 4, -4, -5, + 6, 5, -6, -3, -3, 1, 1, -7, 1, 2, 1, -5, -4, -2, 2, -6, + 6, 3, 7, -10, -9, 4, 1, -5, 6, 9, 3, 1, -2, -4, 3, 4, + -1, -6, 3, 1, -2, -9, 4, 4, -5, 4, -10, 2, -4, -5, -1, 1, + 2, 0, 2, -8, 1, 3, -4, -13, 0, 10, -1, -4, 5, 0, -4, 5, + -3, 2, -5, 2, 1, 2, 4, 2, 2, -10, 5, 3, -11, -2, 3, 3, + 0, -6, -2, 1, 1, 2, -1, -8, -1, -5, -4, -3, 5, 8, -4, -4, + 2, 0, -2, -2, 1, -5, 0, 13, -8, -6, 4, 8, -6, -1, 6, -2, + 4, -5, 3, 5, -7, -8, -2, -3, 7, 8, -8, -3, 1, 5, -5, -5, + 9, -4, -7, -5, 4, 3, -6, 5, 1, -1, 3, 0, -6, -9, 0, -6, + 1, 4, 10, 5, -13, 0, 6, -2, -4, 2, -2, 6, -1, -4, 0, -11, + 6, 3, -1, -3, 14, -1, -15, 1, 2, 3, -1, 4, -3, -6, 0, 3, + 0, -6, 10, -3, -14, -2, 10, -3, -9, -4, 0, 6, -1, 7, -3, -5, + -6, 1, 0, -5, 11, -2, 1, -2, 5, -1, -4, -1, -3, -4, 2, 11, + 2, -4, 1, 2, -12, 7, 3, -1, -11, 3, 15, -8, -11, 0, 0, 2, + -7, 1, -3, -4, -3, -5, -4, 6, 11, -7, -8, -1, 6, -5, -3, 6, + 8, 3, -6, 1, -1, -1, -1, -5, -3, 8, 7, 4, -9, 1, -2, -4, + -6, 9, -4, 3, -8, 0, 6, -2, -4, -2, -2, -6, 8, -7, 3, 1, + 3, -1, -3, 2, 1, -6, -9, 3, -5, 8, 5, -10, 7, 5, -3, -2, + -1, -3, -1, -4, -7, 6, 6, 3, -7, 0, 0, 1, 0, -7, 3, -1, + 0, 1, 2, 2, 2, -11, -8, 9, 6, 2, -6, -1, 1, -3, 3, 1, + -6, 2, -3, -2, -1, 2, -4, 0, -4, -2, 0, -3, -2, -6, 5, 2, + 0, -1, -3, -1, 3, 1, -2, 0, 2, 2, 0, 1, 7, 1, -4, -2, + -6, 4, 3, -1, -4, -1, 3, 3, -9, -2, 0, -2, -1, -5, 6, 1, + -5, 1, -5, 9, -10, -4, 0, -4, 6, 1, -3, -5, 9, -2, -5, 2, + 0, 6, -6, 2, 5, 10, -8, -3, -2, -1, 4, -3, -1, -4, 0, -1, + 1, -4, 0, 5, -8, -1, -5, -1, -1, 3, 3, 3, 2, -14, -5, 1, + 2, 3, 1, -1, 2, 5, -2, 2, -5, 2, 3, -2, -2, -3, 4, 4, + 4, -6, 3, 1, -10, 1, -6, 6, -2, -3, 0, -3, 1, -3, 1, -1, + -4, -5, -4, 7, -2, -2, -3, 6, -5, -5, 2, -6, 1, 4, 3, -8, + 11, 4, -4, -1, 2, 3, -5, -2, 1, 7, -4, 2, 4, -10, 7, -7, + -1, 0, -3, 5, -4, -1, -4, 5, -7, 3, 3, -11, -2, -1, 5, 1, + -1, 0, 6, -11, 0, 1, -2, 1, 0, -1, -4, 2, 9, -2, -9, -4, + 2, 0, 2, -1, 1, 1, -7, 5, -3, 4, -1, -3, -8, 5, 7, -1, + -1, -3, 3, -7, 0, 4, -3, -3, 1, 6, 0, -1, 0, -5, -1, 0, + -4, 0, 0, -3, 1, -4, 1, 7, -3, -13, -2, -2, -1, 3, 5, 2, + -6, 1, 6, -2, -6, 8, -1, -6, 0, 4, 6, -2, 0, -2, -4, 3, + 5, -4, -7, 2, 5, -3, -3, 3, 1, -10, -7, 3, 1, -3, 2, 4, + -7, -3, 0, 2, -5, -3, 3, -2, 0, 3, 5, -6, -1, 4, -2, 0, + 5, 1, -2, -2, 3, 2, -1, -3, -3, -7, 7, 3, -1, -2, 0, 0, + 1, -2, 1, 0, -15, -1, 3, 2, -3, 4, 0, -7, 0, -1, -1, -4, + -3, 2, -1, -1, 11, -3, -1, -5, -1, 2, 2, 0, 1, 2, 3, 4, + -6, -3, -2, 1, 0, -4, 2, 1, -1, -5, 1, -1, -7, 2, -2, -5, + 0, 2, -2, 3, 5, 0, -2, -6, 6, -7, 3, -4, -6, 1, 6, 3, + 1, -2, -3, -4, -6, -1, 7, -2, 0, -3, 0, 9, -3, -5, -1, 3, + 0, -1, -3, 6, 1, -6, -3, 3, 6, 0, -6, -4, 2, 1, -1, 2, + -5, 4, 1, -2, -5, 0, 7, -9, 3, -1, 1, -6, 0, -5, -1, 1, + -1, 0, -4, 2, -2, -2, 1, 6, -1, -5, 0, 0, 0, 1, 3, 2, + 2, -1, -3, 0, 1, 5, 1, -5, -7, 2, 6, -3, -3, -3, 2, -7, + -5, 5, 0, 0, -3, -4, -1, 3, -4, -5, 1, 5, -1, -2, -4, 0, + 5, 2, 0, 2, 2, -1, -1, -5, 5, 3, -1, -4, 1, 0, -1, -2, + -1, 2, 2, -4, -4, 2, -2, -3, -4, -3, 0, 3, -3, -2, -2, 4, + 1, -2, -2, 1, 2, -6, -1, 2, 6, 1, -2, 0, 4, -3, -1, -2, + -1, 5, 1, -11, 4, 3, -1, -6, 2, -2, 3, -4, -8, -2, -1, 4, + 0, 3, -2, -1, -2, -2, 1, 3, 3, -7, 0, 2, 10, 0, -4, 3, + -3, 0, 0, 3, -4, 6, -4, -8, 2, 1, 3, -14, 1, -1, -2, 0, + 0, -5, -1, 2, -6, -1, 3, 0, -5, -3, 3, 1, 6, -2, 0, 6, + 2, -7, 1, 3, -5, 5, 8, 0, -1, 1, -4, -6, -2, 6, 4, -4, + -1, 1, -10, 0, -4, 0, -3, 2, 0, -8, 3, -3, 0, 2, -1, 1, + -8, -1, -1, -3, -1, 4, 1, 6, 1, 0, 0, -2, 0, -2, 7, -4, + 3, -1, 2, 0, -2, -2, -8, 3, 2, -1, -4, 3, 0, -3, -5, 2, + -3, -3, -2, 5, 2, 1, 1, -4, 1, -1, 4, 6, -4, 0, -6, -4, + 1, 3, 3, -1, -2, -7, -1, -3, 6, -6, 2, 1, 5, -8, -5, -1, + 2, -1, -3, -1, -1, 5, -7, 3, 3, 1, 4, -4, -3, -3, 8, 1, + -2, 4, 4, -2, -8, 2, 1, 0, 2, 0, -6, 3, -2, -8, -2, 5, + -1, -6, 0, 2, -1, -5, -2, -2, 6, 0, -5, -2, 3, 0, -5, -1, + 6, 7, 2, -8, -4, 6, 2, -6, -4, 12, 2, -5, -2, -6, 1, 1, + -3, -7, -3, 11, -3, -6, -1, 3, -2, -4, -4, 4, -3, 4, -2, -3, + 1, 7, 0, -8, 7, 1, -2, -4, -6, 13, 0, -3, 1, 2, -1, -4, + -3, 1, 3, -2, -3, -1, 0, 3, -1, -10, -1, 2, -8, -3, 3, 2, + 1, 4, -6, -2, 1, -3, -1, -4, 6, 5, -1, -5, -1, 9, -2, 0, + -4, 0, 1, -3, 4, -5, 1, 3, -4, -6, 0, 4, -2, -6, 9, -1, + -3, 2, -4, 0, 4, -7, -4, -1, 1, 4, 0, -1, 6, -2, -2, 4, + -3, -1, -6, -2, 2, 3, 1, -3, 8, -10, -10, 7, 0, -2, -1, -4, + 3, -6, 0, -5, -5, 5, 3, -6, 1, 5, 0, -1, 1, -1, 0, 0, + 0, -5, 7, -2, -1, 2, -1, 3, 0, -6, 4, -3, -2, -3, -2, 1, + 3, 3, 0, -2, -1, -9, 2, 2, -1, 4, -4, 4, -10, 7, -8, 2, + 1, -1, 0, -1, 4, 2, -7, 7, -6, -4, 3, 11, -5, -6, 1, 3, + -4, -6, 2, 2, -2, -3, -7, -4, 6, 0, 7, -13, 6, 2, -9, -2, + -5, 3, 8, 0, 0, 5, -5, -4, 3, 0, 2, 4, -7, 0, -1, 10, + -3, -6, 7, 2, -1, 0, 6, -2, -7, 4, -2, -1, -2, 1, -3, -9, + 6, 0, -4, 0, 3, 3, -11, -4, 7, -16, -2, 0, 2, 1, -2, 2, + -5, -1, 12, -6, 2, -7, 2, 6, 0, -4, -1, 1, -3, 2, -1, 0, + 7, -2, 2, -6, 2, 7, -9, -4, 8, 2, -9, -3, 8, 1, -1, 4, + 5, -11, 2, 1, -1, 0, 0, -6, -2, 2, 6, -13, 2, -3, -8, 1, + 1, 3, -2, -3, -2, -7, 4, -6, -2, 3, -10, 5, -2, 1, -3, 5, + 8, -4, -1, 2, -1, 6, 2, 3, 2, -2, 0, -1, 0, 4, 1, -1, + -2, 7, 1, -7, -5, 7, -5, 2, -5, -4, 0, 3, 3, -2, 0, -1, + -9, -4, -9, 10, 1, -14, 0, -1, 6, -8, -3, 3, -1, -6, -1, 5, + 3, -5, -1, 3, -6, 5, 7, -10, 5, 5, 2, -4, -3, 9, 4, -11, + 0, 5, -11, 7, -6, 2, 2, 12, -15, -8, 2, -3, 7, -5, 3, 3, + 1, -10, 0, -9, 17, -11, 7, -6, 2, 1, -3, 0, -1, 5, -2, -10, + -4, 16, -1, -7, -1, -3, 1, 11, -3, 1, -3, 2, -12, -2, 12, 3, + -1, -10, -2, 6, -3, 1, -1, -4, 12, -1, -2, -7, 6, -1, -1, -16, + 5, 11, -3, -7, 1, -1, -2, -6, -4, -5, 3, 4, -3, -8, -1, 3, + -5, 3, 1, 2, 6, -10, 1, 7, 0, 21, -15, 11, -12, 0, 1, 4, + 1, 4, -4, -1, 3, 7, 0, -5, 10, -15, -14, 2, 6, -11, 5, 3, + -10, -6, -1, -11, 4, -9, 6, -9, -2, 2, -8, 3, 0, 2, -9, 7, + 7, 2, 2, 0, 3, 1, 6, 0, 3, 6, -10, 6, -4, 1, 7, 9, + -1, 0, -7, 1, -11, -8, 9, 4, 0, -6, 2, -16, 0, 1, -2, -16, + 10, -7, -12, 7, 4, -1, -1, -4, 2, -1, 2, -5, 8, 3, 3, 4, + -2, 4, 3, 2, -4, -2, -1, 5, -5, -3, 9, 2, -22, 8, -6, 1, + 3, -5, -4, -6, 7, 0, 5, -8, 9, -13, 0, -6, 18, -3, -3, -1, + -6, 7, 3, -11, -9, 19, 6, -10, -6, 3, 12, -2, -18, 7, 8, -7, + -10, 14, -8, 5, 1, -15, -4, 11, -6, 9, -8, -1, 5, 1, -6, -2, + 7, -3, 7, -20, 6, 5, -4, 3, 12, -12, 11, -4, -22, 7, 9, -13, + 1, 0, -8, -1, 9, 6, -10, 5, -9, -5, 8, 5, 8, -12, -4, 16, + -14, 7, 6, -1, -16, 21, 2, -9, 13, 5, -4, -19, 2, -3, 12, -7, + -2, 3, -2, -4, -3, -8, 4, 1, -4, -4, -14, -3, -1, 1, -11, 30, + -11, -16, 8, -2, -9, 8, 8, -1, -1, -5, 10, -4, 1, 4, 3, -8, + -1, 23, -2, -2, 14, -15, -7, 7, -7, 0, 9, -12, 8, -10, 0, -3, + 16, -13, -11, 5, -1, -10, -2, 6, -5, -4, -9, 10, -6, 7, 1, -13, + 2, 14, -9, -3, 2, 6, 4, 8, -8, -2, 0, 2, -3, 14, 3, -10, + -4, -8, -1, 10, -13, -8, 15, -9, -3, -2, 5, -5, -6, -9, 9, 7, + -4, 14, -7, -18, 12, 1, 2, 1, 4, -2, -6, -3, -2, 5, 7, -2, + 0, 0, -4, 0, -6, 1, 5, -5, -4, 5, -6, 5, -4, -8, 15, -5, + -6, 0, 3, -8, 0, 3, 0, -1, 0, -4, 6, -16, 22, -7, 3, -5, + 2, 2, 1, -3, 4, -8, 4, 4, 0, -5, -9, 4, -5, -4, 3, 2, + 1, 3, -4, 6, -15, -1, 4, 1, -9, 3, 1, -8, 3, -6, 11, -5, + 6, -11, 17, -15, -2, -19, -11, 1, -4, 8, 0, 5, 18, -11, 0, 13, + -4, 6, -13, 4, -11, -1, -7, -7, 11, 10, -9, 17, -11, 20, -6, 7, + -14, 23, -7, -2, -2, 7, -10, 2, 0, 2, 5, 6, -8, 5, -4, -10, + 9, -4, 6, 0, -7, 8, -7, 1, -20, -4, -1, -3, 6, -10, -6, -15, + -11, 10, -5, 19, 3, 1, -19, -11, -1, -9, 9, 22, 24, 10, -5, -18, + -8, -23, 14, 11, 0, 31, 43, -9, 0, -7, -15, -28, -35, -30, 3, 5, + -5, 11, 52, 55, 7, -5, -10, -12, -25, -43, -12, 4, -37, -47, -21, -5, + 4, -11, 1, 31, 27, 34, 46, 48, 61, 10, 16, 8, 7, -14, -40, -47, + -36, -51, -42, -15, 4, 12, -32, -42, -10, -4, 10, 1, 15, 50, 31, 5, + 15, 38, 37, 29, 15, 22, 11, -4, -35, 10, 3, -18, 1, -14, -33, -5, + -47, -25, -13, -2, 15, -6, 5, -29, -17, -19, -1, 3, 7, 2, 17, 28, + -8, -23, 7, 7, 36, 15, 2, 1, -2, -9, 1, 6, 20, 6, 14, -3, + 21, -11, -12, -35, 11, -20, -18, -36, -23, -27, -19, 1, 10, 14, 27, 6, + 44, 14, -9, 3, 20, 27, 45, -8, -13, 16, -16, 24, -10, -9, -3, -38, + -19, -14, -38, -38, -41, 13, 40, -37, 5, -7, -7, -4, 4, -31, 32, 22, + 15, 9, 13, 10, 10, -17, 22, 30, 9, -6, 27, 66, 47, -17, -21, -20, + -9, -36, -73, -3, 22, -35, -12, 6, 7, 4, -17, -45, 22, 17, -17, 3, + -9, -4, 11, -10, 13, -4, 8, 38, 3, 20, 42, -22, 9, 23, -28, -21, + 3, 10, 1, 26, -28, -18, -9, 7, -30, -41, -24, -9, 10, -6, 31, -5, + 2, 29, -9, 1, -27, -24, 7, -19, -5, 10, -13, 21, 21, 3, 30, -11, + -17, 34, -11, 8, 7, -8, 1, 11, -1, 7, -13, 1, -3, 23, -12, 8, + -19, -3, 20, -78, 42, -23, 4, -29, -16, -5, 38, -49, 30, -26, 26, 16, + 8, -33, 53, 19, -20, 12, 5, 23, -11, 4, -6, 42, -111, 67, -40, 29, + -32, -20, -77, 113, -46, -12, 8, -5, -14, 35, -52, 94, -5, -61, 58, -36, + 41, -83, 21, -19, 61, -68, 37, -37, 12, 66, -69, -16, 100, -88, 48, 21, + -39, 73, -24, -2, 45, 65, -59, 53, -103, 95, -97, 1, -14, -4, -41, 9, + -13, -18, 16, -26, 9, 26, -15, 25, -16, 6, 8, 26, -52, 35, -21, 4, + -2, -11, -4, 22, 0, 21, -40, 65, -6, -13, -11, -7, 32, -46, -48, 16, + -26, -3, 0, -42, 87, -68, 34, 17, -14, 43, 23, -15, 30, 20, 47, -19, + -33, -12, 15, 1, -37, 15, -12, -11, -7, 15, -75, 36, -41, 27, -8, -7, + -12, 10, -4, 49, -6, 42, -32, 4, 20, 33, -65, 24, -52, 10, 13, -17, + -15, 60, -14, -55, 35, -16, 50, -83, -3, 29, 58, -75, 71, -46, 47, -32, + 44, -57, 10, -43, 33, 22, -48, 51, -41, 6, 7, 39, -3, -41, 7, -9, + 37, -66, 22, 26, -13, 74, -87, 127, -39, -16, -29, -11, -8, -57, -15, -45, + 52, -74, -5, -2, 103, -126, 85, 20, 28, -7, 53, -38, 58, -10, -11, 33, + -70, 20, 1, 40, -36, 26, -58, 58, -23, 61, -71, -7, -39, 43, 22, -18, + -1, -61, 90, -37, 35, -58, 30, -62, 27, -45, 47, -59, -6, -35, 70, -49, + 9, -30, 92, -15, 21, 1, 26, 6, -19, 90, -43, 49, -46, 10, 6, 15, + -90, 67, -51, -11, 4, 28, -36, 24, 41, -68, 24, -34, 63, -40, 17, -30, + 18, -39, 14, -38, 15, 9, -54, 54, -20, 36, -21, -14, -13, 11, 23, 11, + -54, 56, -25, 37, -46, 49, -74, 81, -40, 51, -44, 57, -69, 51, -50, 61, + 27, -112, 111, -114, 106, -85, 49, -61, 75, -18, 26, -68, 32, -15, -25, 21, + -15, 38, -46, 80, -119, 126, -85, 41, -40, 77, -65, 28, -6, -39, 45, -87, + 39, -63, 81, -32, 4, -32, 44, -25, 42, -12, -15, 21, -1, -56, 21, 23, + -30, 33, -28, -3, 32, 4, -36, 60, -20, 13, -3, 22, -43, 101, -88, 59, + -53, 18, 8, 22, -33, -52, 34, -32, 35, -90, 112, -107, 56, -59, 43, -60, + -18, -4, -21, 45, 11, -48, 11, 38, -27, 58, -49, 65, 19, 54, -38, 35, + -37, 24, -11, 44, -62, 41, -16, -48, -8, 31, -68, 17, -3, -5, 52, -51, + -10, 16, -26, 18, -29, 56, -41, 3, 5, -10, -37, 61, -14, -10, -9, 20, + -8, 8, -2, -16, 44, -17, 14, -33, 30, -2, -27, 16, 3, 0, 51, -42, + 32, -20, 8, -11, -24, 10, 12, -15, 6, -32, 10, 21, -38, -11, -12, 23, + 13, -64, 19, 34, -23, -23, 16, 10, 39, 2, -36, 55, -31, 0, -29, 18, + 8, 12, -61, 73, -28, 54, -34, 21, 9, 7, 53, -34, -29, 19, -7, -44, + 7, 15, -16, -18, -31, 10, -29, 36, -69, 7, 4, 33, -72, 45, 14, 0, + -8, 35, -13, 26, 16, -28, -3, -32, 45, -4, 8, -20, 65, -24, 2, -24, + 40, -16, -16, 20, 8, 2, -3, -2, 23, -15, -11, -30, 19, -51, -19, -5, + -36, 18, 24, -4, -1, 46, -90, 60, 4, 23, -17, 16, 60, -24, 0, 18, + 0, 5, -6, -24, 27, -34, -28, -7, -4, 22, -30, -11, -3, -1, -44, 36, + -38, -6, -9, 55, -34, 16, 27, 28, -65, 62, 22, -32, 36, 7, 2, 27, + -19, 50, -71, 44, -19, -67, 13, -3, -14, -30, 33, 5, -12, -48, 60, -47, + -28, 9, -6, 24, -11, -1, 13, 62, -53, 26, 7, -9, 6, 58, -38, -10, + 0, 5, -23, 23, 8, -14, -19, 21, -9, 35, -17, -28, 14, 27, -17, -14, + -29, 24, 6, -85, 74, -16, -18, -2, -19, 47, -29, -18, -15, 52, 0, 7, + -10, -23, 45, 13, -11, 12, -28, 27, -26, 19, -69, 74, -55, 35, -21, 41, + -24, -11, 39, -19, 7, 0, 7, -31, 10, 7, -45, -17, 25, -12, 9, -19, + 3, 28, -53, 76, -19, -25, 49, -2, 6, -11, 24, -12, -23, 17, -1, -15, + -10, -36, 26, -25, 0, -44, 59, -67, 45, -31, 5, 15, 56, -12, -14, 12, + 10, 24, -52, 37, 5, -35, 52, 23, -55, -6, 24, -49, 26, 31, -24, 10, + -33, 33, -11, 1, -49, 8, 7, 6, -78, 12, -22, 10, -11, 13, 13, -18, + 38, 50, -18, -5, 64, -52, 59, 33, 3, -9, -6, -6, 26, -64, 18, -38, + -47, 18, -33, 4, -39, 40, -31, -1, -23, 48, -30, 18, 17, 32, -20, 32, + 19, 24, -58, 49, -38, -9, 15, -28, 16, -3, -2, -28, 33, -22, 23, -1, + -34, 33, -48, 67, -55, 21, 51, -66, -2, 21, -5, -17, 24, -63, 53, 8, + -19, 9, -11, 36, -37, -35, 43, -35, -3, -44, 68, -43, 53, -24, -5, 45, + -16, -7, 14, 49, 3, -16, 22, -10, 2, -28, -9, -6, -5, 32, -76, -22, + 35, -26, -35, -12, 0, 3, 13, 6, 36, 7, -32, 69, -15, 45, -20, -21, + 35, 35, 1, -25, 11, 34, -24, -33, -9, 5, -25, -49, 31, -41, 15, -42, + 25, -30, 42, -80, 32, 2, -18, 33, -12, -9, 43, -1, 4, -12, 54, -51, + 22, -1, 18, 28, -29, 18, 7, 10, -19, 8, -1, 12, -21, -6, -11, 4, + 4, -28, -8, 22, -27, -5, 9, -25, 20, -19, -36, 41, -8, 20, -32, 16, + -29, 29, -13, 13, 4, 1, 17, 8, 0, 9, 22, -1, -3, 28, -11, -39, + 36, -31, 5, -11, -27, 22, -39, 7, 15, -24, 19, 8, -37, 75, -52, 54, + -65, 22, -13, 23, -26, 32, -19, 10, -8, -3, 12, 16, -44, 25, -23, 14, + 9, -46, 20, 2, -4, -8, -6, 18, 4, -2, -3, -15, 4, 16, -9, -5, + 34, -29, 27, -54, 98, -65, 11, -18, 16, -13, 0, -2, 0, 22, -43, 31, + -46, 58, 2, -25, -2, 16, -2, -29, 17, 18, -26, 21, -17, 5, -4, -9, + 0, -34, 50, -27, -3, 4, 31, -3, -47, 32, -25, 36, 6, -47, 33, -28, + 39, -36, 42, -28, 5, -3, -2, 25, 27, -47, 20, 22, -5, -15, 1, -9, + 16, -25, -10, -43, 40, -12, -19, 22, -24, -5, 14, -44, 42, -32, 32, -45, + 40, 41, -17, 27, -44, 38, -16, 15, -36, 39, -13, -19, -4, 34, 1, -9, + 9, -16, -2, -29, 31, -31, -4, 35, -21, -52, 63, -41, 2, -7, 30, -35, + 13, 9, 15, -4, 14, -36, 18, -14, 55, -50, -6, 22, -23, -11, -5, 12, + 17, -13, -43, 44, -33, 41, -42, 45, 3, -12, 26, 11, -11, 35, -76, 39, + 2, 0, 3, -4, 15, -19, -6, -33, 11, 5, 16, -25, -2, 19, -7, -43, + 30, 20, -27, -18, 12, 14, 33, -50, 14, -15, 23, 8, 2, -10, -4, 53, + -86, 24, -9, 41, -34, -21, 22, 24, -54, 27, 13, 2, -9, 14, -29, 21, + 40, -43, -9, -3, 27, -3, -22, 18, 10, -23, -15, 1, 14, -12, 3, -30, + 30, -22, -28, 36, -15, 39, -57, 21, 3, -3, 33, -13, -2, 6, 20, -6, + 4, -13, -5, -18, 13, -7, 7, 26, -26, 16, 7, -64, 37, -7, 10, -20, + 12, -11, 7, -34, 37, -12, -24, 34, -18, -18, 39, 9, -42, -24, 43, 2, + -16, 25, 12, -16, 8, 12, -44, 32, -9, 23, 1, -37, 40, -23, -17, 18, + -42, 23, -12, -7, 10, -6, 6, -13, -13, 30, -23, 36, -4, 7, 17, -18, + 18, -3, 8, 5, -1, -13, -15, 2, -5, -16, 7, -52, 23, -38, 30, -30, + 16, -26, 21, -22, 24, 3, 20, -28, 22, 22, -31, 42, -16, -11, 32, -26, + 0, 31, -14, 11, -15, 14, -17, -9, 10, 11, 27, -38, -4, 14, -18, 36, + -44, 0, -11, 16, -14, -2, 16, -34, -23, 22, 4, -24, 14, -13, 16, 31, + -28, -10, -6, 51, -27, 13, -49, 3, 68, -38, 1, 8, -27, 26, -16, 0, + 15, -36, 7, -6, 38, -11, 0, -14, 10, -4, 22, -48, 31, -1, 23, -38, + 1, 15, -7, 10, -1, -3, 4, -1, 10, -2, -12, 3, -22, 5, 9, 8, + 4, -14, 12, -3, -7, 22, -20, 3, -6, 13, -15, -8, -7, 16, -14, -1, + -3, 6, -17, 12, 22, -44, 68, -67, 50, 13, -20, -11, -4, -20, -3, 22, + -13, -20, 28, -7, 2, 11, -9, -23, 5, 5, -26, 24, -31, 2, 20, 15, + 2, -7, 4, 19, -6, 41, -51, -3, 24, 27, -30, 25, -37, 1, -7, -2, + -4, -26, -1, 12, 5, -12, 9, -30, 5, 11, 26, -18, -32, 42, 7, 0, + -23, 10, 10, -20, 53, -49, 6, -39, 18, 3, -27, 41, -21, 16, 28, 14, + -24, -15, 19, 5, 16, -31, -1, 45, -25, -6, -16, -4, -19, 37, -47, 21, + 2, -14, -7, 30, -35, 13, -30, 14, 21, 11, -18, -28, 37, 12, -18, 9, + 5, -1, 33, -41, 3, -7, -19, 8, -14, 12, 15, -18, -4, 44, -25, 22, + -46, 19, 40, -25, -12, -5, 17, 7, -53, 25, 4, -10, 14, 16, -31, 40, + -27, -11, -4, 28, -40, -5, -9, -3, 34, -47, 33, -5, 11, -33, 33, 0, + -14, 35, -18, -27, 11, 14, -37, 35, -20, 7, 15, 2, 27, -17, 15, -31, + -1, 11, -27, 24, -26, 14, 13, -35, 20, -13, -2, 16, 16, -6, 2, 15, + -7, -22, 51, -36, -2, 20, -19, 23, -20, -19, -9, -14, 8, -4, -13, 35, + -66, 36, -37, 3, 19, -1, 15, 32, -45, 71, -15, -5, 12, 34, -33, 24, + -5, 20, -43, 42, -59, 13, -12, -69, 66, -29, -34, 17, 7, -28, 24, 5, + -27, 51, -40, -9, 46, 3, -17, 36, -56, 63, -7, -31, -19, 53, -12, -10, + 4, 19, -47, 35, 0, -40, 17, -14, 13, -11, 11, 3, -39, 22, 5, 21, + -19, -11, 25, -4, -5, 20, -13, 25, -6, -16, -16, 29, -61, 25, -33, 12, + -17, 7, -19, 34, -27, 15, -19, 32, -26, 54, -46, 6, 9, 14, -6, -6, + 23, -32, 58, -19, -5, 15, 46, -42, 39, -7, -23, -7, -14, -22, 42, -66, + 0, 4, -8, -11, -4, -3, -7, 7, -23, 30, -14, 19, 8, -9, 20, 36, + 5, -24, 25, 12, -20, 16, -53, 60, -49, -26, 24, -87, 67, -49, 13, -7, + 5, -14, 5, 11, 38, -3, -15, 27, 26, -36, 20, 30, -47, 29, -5, 9, + -10, 38, -65, 47, -49, -4, -10, -6, 1, -1, -28, 16, -14, 3, -14, 27, + -8, 1, 2, 23, 21, -53, 40, 24, -16, -12, -2, 11, 17, -8, -18, 8, + -25, 28, -10, -12, 13, -51, 10, 35, -10, -8, -9, 8, 10, 14, -20, 4, + -9, 37, -5, -2, 2, 4, -9, -5, 16, -16, -23, 13, 7, -9, 14, -49, + 13, 8, -3, -13, -9, 22, -8, 12, -13, 36, -36, 35, -17, 23, -12, 0, + -37, 50, -31, -8, -31, 43, -4, -11, 0, 3, -7, -19, 16, -16, -28, 46, + -28, 27, -13, 33, -21, -1, 39, -13, 3, -4, 4, -39, 74, -30, -17, 33, + -3, -20, -12, 24, -94, 75, -63, 54, -62, 23, 4, 12, -33, 22, -35, 16, + 12, -28, 34, 2, -12, -3, 22, 23, -31, -6, 26, 4, -41, 8, 37, -15, + 21, -7, 18, -51, 42, -27, 35, -45, 35, -30, 18, 9, -20, 1, 18, -12, + -51, 61, -61, 24, -20, 1, 11, -5, -2, -12, 11, 20, -35, -2, 37, -21, + 23, -15, -2, 19, -51, 82, -50, 20, 29, -26, -34, 49, -2, -16, 11, -17, + -4, 6, 15, -35, 13, -15, -10, -17, 15, 4, -42, 43, -31, 34, -30, 53, + -43, 40, -22, 9, 9, -24, 64, -41, 29, -17, 8, -15, 8, 2, -27, 7, + 10, -28, 0, 30, -50, 6, -13, -14, -21, 11, 9, 13, -47, 35, -11, 32, + 28, -28, 1, 32, 2, -19, 28, -24, 9, 0, 19, -6, 16, -33, 6, -23, + 33, -31, -1, -4, 26, -22, -22, -10, -11, 18, -26, 19, -8, -4, 21, -14, + 36, -2, 12, -48, 49, -1, -13, -5, 8, -3, 9, -4, -18, 15, 28, -50, + 10, 4, -7, 4, -39, 37, -39, 11, 2, -20, 13, 4, -6, 0, 35, -17, + -9, 6, 38, -21, -1, -1, 12, -2, -16, 15, 7, -22, 18, -23, 11, 3, + -9, -39, 29, -31, 44, -41, 0, 5, 21, -9, -25, 25, -6, 38, -55, 38, + -14, 6, -26, 38, -24, 39, -39, -15, 17, 16, -20, -27, 17, 24, -20, -20, + 33, 8, -31, 2, 2, 27, 11, -4, -7, 31, -20, -9, 4, -4, 17, -32, + 2, -18, 31, -35, 38, -52, 42, -1, -28, -26, 25, 3, -51, 42, -35, 35, + -39, 44, -38, 20, 20, -51, 34, 45, -10, -7, 27, -19, 33, -49, 22, 2, + -7, -5, -27, 59, -24, -20, 21, -8, -15, 24, -51, 3, 9, -23, 24, -30, + 2, 29, -26, -2, 4, 10, 0, -18, 50, 3, 9, -14, 17, -18, 24, -13, + -33, 7, 25, -50, 2, -2, 30, -58, 31, -8, 23, -11, -1, -24, 21, 1, + -41, 47, -30, 28, -39, 56, -16, -20, 51, -45, 33, 6, 23, -12, -19, -2, + 7, 1, -14, -5, -11, -20, 25, -17, 7, -22, 21, -19, 34, -47, -2, 1, + 33, -30, 14, 20, 6, -9, 17, 13, -22, 19, -58, 23, 26, -15, -52, 2, + 18, 10, -13, 46, -5, -8, -6, 4, -14, 5, 11, -13, -7, 42, -25, 8, + -37, 35, -10, 6, -25, 16, 15, -15, -9, -20, 18, -23, 26, -34, 35, -22, + -10, 9, 14, -6, -21, 27, -8, 4, 1, 3, -19, 28, 2, -7, 30, -8, + -13, 11, -9, -9, -19, 12, 0, -23, -1, -23, -6, 27, -31, 41, -28, 13, + 5, 9, -21, 6, 2, -2, 18, -16, 31, -25, 40, -38, 39, -13, 8, 14, + -3, 9, -30, 6, -12, -7, -15, 30, -64, 6, -22, 13, -8, 14, -40, 9, + 32, -35, 14, -1, 12, -25, 63, -25, 35, -2, 19, -5, -3, 20, -29, -1, + 35, -37, 53, -46, 4, -14, 22, -27, 23, -64, 8, 5, -25, 41, -18, 14, + -42, 53, -56, 35, -42, 71, -63, 45, -38, 29, -12, 33, -22, 0, 24, -13, + 3, 13, 1, -10, -19, 11, 19, -38, 5, -2, -18, -21, 33, -54, 41, 9, + 4, -1, -21, 3, 3, 37, -31, 34, -40, 34, -19, 30, -26, 23, -53, 55, + -8, -13, -16, 7, -13, 46, -38, 2, -3, 17, -1, -26, 18, -57, 68, -27, + 23, -19, 32, -39, 2, 2, -18, 12, -16, 4, -23, 38, -65, 40, -5, 13, + 19, -26, -13, 60, -25, 7, 1, 10, 22, -24, 23, -20, -16, -17, 14, -32, + 26, -4, 17, -15, 9, -29, 4, -29, 11, 36, -18, -19, -2, 5, 28, -23, + 31, 6, 4, 18, -14, 4, -7, 0, -45, 61, -31, 5, -15, -23, -21, 52, + -62, 4, 22, 1, -9, 15, -24, -27, 60, -49, 38, 0, -6, 1, 13, 7, + 4, 19, 6, 0, 27, -28, -14, -21, 17, -1, -30, 23, 10, -36, 18, -19, + 2, -18, 0, 6, -1, 7, -1, -37, 26, 15, -35, 41, -24, 10, 10, -9, + -12, 12, 7, 3, 10, -11, 11, -14, 27, -49, 71, -55, 25, 8, -11, 11, + -5, -22, 7, 15, -17, -11, 18, 4, -54, 43, -38, 27, -1, 7, -13, 19, + 10, -41, 50, -41, 13, 9, 10, -41, 38, -13, 13, -2, -2, -4, 9, -36, + -5, 22, -31, -18, 8, 21, -22, 21, -24, 12, 3, 16, -24, 25, -16, 22, + -35, 14, 3, 11, 12, -22, 40, -11, -25, 14, 0, 14, -2, 2, -10, -12, + 14, -51, 11, -21, 55, -27, 9, 3, 38, 7, -25, 5, -19, 6, -14, 0, + -10, 21, -57, 35, 18, -21, 21, -40, -13, 24, -24, -12, 10, -1, 11, 10, + -12, -5, 38, -45, 23, 26, -13, -9, 32, 6, -3, 30, -28, -28, 27, 3, + -10, -11, -10, 16, -28, 21, -12, -3, -1, -33, 14, -30, 12, -20, 40, -15, + 7, 19, -18, -1, -1, 9, 4, -23, 32, 17, -19, 12, 16, -45, 4, -6, + 18, -28, 36, -44, 44, -29, 10, 4, 14, -8, -13, 9, -30, 39, -17, -5, + 10, -10, 5, -1, -16, 17, -7, -9, -10, 15, -21, 9, 10, 8, -10, -6, + 3, -21, 34, -3, 6, -4, 15, 3, -2, 4, 26, -44, 30, -43, 2, 9, + -5, -7, -18, 16, -28, 0, 5, -7, 0, 7, 0, -7, 21, -14, 17, 15, + 2, -40, 7, 44, -30, 55, -33, -19, 40, -30, 17, -1, -20, -20, -20, 5, + 14, 1, -7, -32, 26, -11, -11, 24, -23, 17, 17, 8, -19, 18, 11, -6, + 17, -4, -13, 14, -9, 21, 9, -16, -8, 2, -16, 3, -9, -32, 6, -36, + -4, 0, 10, -36, 26, -11, 3, 31, -20, 1, 7, 4, 45, -35, 39, 0, + 4, 28, -21, 29, -39, 27, 15, -6, -14, 17, -25, -33, 16, -15, 18, -43, + 28, -61, 33, 1, -27, 13, -19, -20, 26, 11, -27, 16, -21, 33, -13, 43, + -44, 13, 24, -10, 35, -39, 36, 20, -39, 68, -68, 23, -16, -7, 0, 36, + -30, -13, -27, 42, -21, -4, -23, -2, 23, 0, -3, -3, 2, 4, -15, -5, + 28, -10, -20, 24, -7, 27, -58, 31, -7, -29, 39, -40, 41, -35, 8, -25, + 30, 31, -17, -9, 3, 36, -8, -18, -11, 29, -2, 6, -25, 21, -5, -8, + -17, -24, 20, -26, 20, -23, 46, -26, -13, 8, 13, 2, -15, 4, -9, 28, + -25, -19, 49, 18, -50, 45, -11, -17, 5, -61, 15, 4, -22, -1, 22, 23, + 33, -55, 46, -25, 37, 18, 2, -9, 11, -47, 23, -8, -25, 37, -32, 2, + 5, 12, -18, -5, 19, -27, -7, 20, -40, 32, -44, -21, -29, 58, 8, -9, + 57, -28, 29, -32, 14, -14, 4, 23, -33, 16, -4, -16, 21, 38, -37, 23, + 10, -32, 17, 17, -12, -59, 9, -3, -12, 22, -13, -8, -26, 16, 1, 33, + -9, -17, 16, -7, 21, -44, 26, 5, 35, -36, -1, 13, 36, -36, 39, -36, + 17, -13, 2, -33, 20, -13, -51, -2, 9, -2, 35, -21, 19, -20, 18, -19, + -5, 30, -39, 30, 22, -35, 74, -52, 33, -15, 17, -21, -13, 11, 6, -25, + 25, -31, 29, -18, 18, -52, 40, -11, -17, -26, 56, -56, 69, -53, -14, 32, + -10, -8, -2, 18, -14, 20, -18, 20, 22, -27, 0, -25, 56, -46, 16, -28, + 52, -5, -33, 76, -75, 36, -1, -42, 42, -46, 13, -13, 25, -7, 35, -55, + 5, 63, -56, 11, -24, 13, -8, -10, -27, 15, -15, 44, -66, 52, -3, -6, + 0, 23, -33, 79, -55, 30, -27, 37, -18, -6, -2, -19, 52, -22, -50, 60, + -32, 28, -56, 44, -28, 15, -37, -9, -28, 63, -75, 9, 39, 28, -21, 5, + -17, 15, 2, -13, 30, 13, -14, 10, -12, 30, -22, -10, 4, -8, -9, 14, + 6, -39, 34, -6, 4, 1, -5, 0, 33, -73, 34, -12, 23, -9, 53, -47, + 17, 3, -18, -6, 2, -19, -12, -7, -45, 72, -9, -71, 55, -58, 50, -18, + -36, 37, 19, -11, 13, -35, 32, 6, 5, 18, -6, 19, -26, 32, 16, 20, + -43, 20, -10, -7, 16, -7, -68, 21, -36, 7, 19, -22, 19, -3, -35, -37, + 25, 21, -57, 67, -9, 9, 32, -11, 28, -18, 35, -41, 60, -19, 29, 0, + -38, 29, -6, -35, 0, 25, -37, -1, -31, -42, 30, -19, -21, 36, -66, 53, + -33, 15, 16, -13, 20, -35, 73, -4, 18, 39, 4, 1, 3, 21, -2, -12, + -18, -51, 44, -17, -50, 48, -30, -16, -13, -35, -7, 25, -33, -14, 14, 0, + 8, -30, 45, -13, 50, -53, 28, 60, -33, 23, -7, -2, 15, 36, -11, 9, + 19, -44, 4, -21, 19, -5, -27, -45, 48, 9, -47, -23, 12, 3, -25, -8, + -21, 63, 1, -29, 31, -18, 19, 16, -24, -17, 50, -65, 65, -56, 93, -45, + -17, -25, 45, -18, 23, -53, 50, -15, -12, -39, 51, -11, 11, 13, -31, 54, + -14, -29, 22, -11, 10, -41, -19, 52, 10, -51, -60, 72, -13, 12, -38, 19, + -2, 31, -56, 37, -4, -10, 22, -14, -33, 48, -40, 38, -14, 27, -24, 19, + 29, 17, -31, -2, -41, 34, -17, 2, 5, 5, -13, -30, 14, 9, -9, 7, + -11, 15, 5, -28, -2, 0, 45, -30, -25, 1, 10, 29, -55, -24, 52, -5, + 5, 20, -25, 20, -15, 14, -64, 95, -53, 32, 13, -26, 31, -8, -27, 18, + 48, -57, -3, -10, 25, -24, -32, -9, 18, 18, -33, -15, 27, -22, 14, -5, + 10, 51, -21, -25, 19, 5, -15, -29, 16, 1, 33, -39, -12, 56, 14, -63, + 36, -2, -17, 52, -11, -37, 5, 19, -52, 38, -23, -60, 93, -75, 52, -30, + -2, -11, 49, -11, -25, 1, 42, -35, 26, -35, -9, 24, -1, 10, -6, -12, + 7, 4, 22, -10, 41, -25, -8, -4, -2, 28, -43, 19, -32, 4, -27, 9, + -47, 51, -16, 12, -52, 49, 8, 7, -37, 27, -33, 80, -44, 6, 5, 28, + -15, 16, 15, 2, -12, 50, -77, 38, -38, -45, 30, 8, -37, -13, -8, -18, + 50, 3, -54, 29, 29, -20, 4, 52, -57, 62, -52, -2, -9, 62, -64, -5, + 24, 23, 0, -7, -23, 48, 25, -78, -9, 38, 18, -46, 30, -51, 39, 4, + -48, 22, 15, 13, -39, 8, 10, 31, -20, -22, 21, -17, 17, -23, 22, 22, + -24, -36, 11, 31, -16, -28, 34, -4, 0, -20, 6, -2, 35, -13, -60, 36, + 24, -45, 21, -2, 36, 0, -73, 66, -37, 39, -66, -18, 22, 17, -17, -25, + 24, 36, -47, 3, 25, 7, 8, 0, 1, 14, 20, -21, 4, 21, 12, -77, + 17, -4, -12, 31, -57, 38, -11, -4, -31, -6, 29, -34, 11, 13, -20, 82, + -36, -36, 40, -28, 77, -68, 12, 2, 34, -23, 5, -31, 11, -5, 44, -105, + 79, -31, -29, -16, 37, 8, 18, -14, -9, 32, -10, -11, -7, 0, 41, 34, + -56, 7, 13, -2, -31, 33, -67, 42, -31, -2, 22, -49, 18, -34, -11, 38, + -40, 56, -16, 14, -2, 24, 0, 0, 41, -21, -8, 6, -11, 11, 11, -45, + 26, 4, -17, -7, -26, -30, 7, -21, -29, 56, -29, 37, -3, 2, -8, -3, + 22, 11, 40, -13, 58, -6, -38, 48, -23, 15, -52, -14, -6, 49, -66, -20, + -11, 34, -32, -44, 41, 4, 20, -59, -24, 77, 23, -24, -17, 42, 19, -3, + -19, -34, 54, 17, -22, -17, 46, -24, -9, 3, -22, 40, -47, -49, 72, 4, + -18, -48, -33, 55, -4, -41, -51, 105, -26, -3, -22, 64, 28, -51, 31, 2, + 15, 27, -62, 18, 21, 6, -15, -54, 52, -14, -46, 7, -30, 32, -1, 6, + -37, 39, -3, -23, -20, 24, 23, 17, -25, -6, 67, -36, -11, -37, 56, -79, + 3, 30, 45, -39, -17, -2, 21, 2, -4, -3, 3, 1, 16, -16, 9, 30, + -37, 8, -6, 46, -65, 3, 14, -59, 104, -60, 2, 46, -29, -30, -2, -10, + 24, -52, 63, -31, 81, -85, 18, 35, 16, -32, -18, -24, 45, -16, -15, -13, + 37, -15, -20, -42, 91, -45, -15, -9, -16, 64, -11, -23, 31, -18, 38, -42, + 3, 12, 1, 5, -5, 22, -44, 69, -31, -18, 15, 21, -64, -13, 34, -37, + 30, -26, -15, 6, -3, 44, -28, 11, -3, -1, 16, -18, 25, -14, -26, 69, + -56, -5, 31, -51, 24, 3, -36, 9, 52, -34, 31, 21, -11, -68, 31, -24, + 53, -25, -29, 31, 23, -20, 9, -15, -11, 19, 12, -47, 84, -60, -16, -11, + 17, -4, -15, 30, -45, 32, 34, -63, -7, 68, 0, -35, 17, 7, 33, -31, + -8, 7, -32, 43, -13, -18, 15, 31, -32, -34, 5, 8, -16, 20, -26, -29, + 32, -9, -20, 17, 33, -31, -13, -5, 86, -52, 23, -19, 2, 13, 14, -7, + -20, 36, -16, -3, 8, 0, 14, -69, 76, -77, 25, -14, -17, 3, 39, -14, + -46, 31, -2, -7, 37, -45, -6, 24, 28, -37, 22, 13, -35, 4, 8, 23, + 7, -43, 53, -59, 23, 16, 4, -25, -15, 23, -9, -20, 26, -18, -1, 25, + -3, -48, 53, 2, -43, 7, 14, -34, 15, 28, -33, 53, -2, -59, 31, -34, + 40, 19, -27, 20, -2, 8, 2, 3, -8, -8, 4, -57, 62, 24, -72, -4, + 17, -17, -3, -10, -26, 42, -30, 12, -29, 31, -10, 3, 24, 2, 21, -1, + -36, 52, -7, 21, 14, -32, -18, 73, -45, -6, 8, -12, -66, 21, 25, -17, + -6, -35, -14, 27, 26, -47, 40, -51, 56, -19, -24, 31, 6, 4, 11, -3, + 37, -47, 41, -32, 50, 0, -72, 25, 16, -19, -1, -2, -4, -41, 20, 6, + 9, -3, -44, 32, -54, 83, -30, -26, -8, 46, -47, 29, 5, -19, 37, -9, + -20, 65, -14, -21, -4, 10, 28, -28, 18, -29, 35, -25, 3, -17, -31, 4, + -4, 0, -9, 41, -42, -34, 40, -15, 8, -24, -8, 36, 22, -18, -27, 70, + -39, 39, 1, -5, 57, -54, 12, 36, 3, -13, -1, -32, 69, 6, -64, -50, + 13, -13, -34, 22, -13, 0, -10, -38, 41, -11, -22, -3, 11, 4, 38, 22, + -10, 24, 32, -23, 23, -6, 8, -4, 21, -61, 66, -35, -41, 7, 5, -29, + -19, -45, 23, -2, 46, -84, 78, -59, 40, -10, -18, 79, -35, -5, -1, 36, + 16, 13, -21, -31, 52, 2, -50, 34, -5, -36, -37, 65, -42, 1, 16, -42, + 35, -8, -50, -6, 41, -16, 27, -41, 22, 64, -50, -11, 31, -18, -17, 5, + -3, 34, 34, -40, -41, 66, -37, 20, -11, -20, 29, -5, -14, -15, 45, -33, + -37, -11, 36, -25, 18, -8, 20, 1, -23, 60, -32, 0, 34, -24, -32, 64, + -39, -35, 48, -7, -13, 4, -39, 32, 0, 1, -31, 2, -12, 43, -38, -8, + 26, 0, -57, 53, 19, -22, -10, 17, -30, 57, 6, -31, 33, 10, 0, -48, + 29, -4, -23, 6, -7, 31, -39, 15, -41, 38, -19, 5, -37, 23, 11, -28, + -14, 59, -48, 8, 22, -20, 50, 15, -34, -26, 67, -8, -15, -21, 53, -27, + -9, 13, -24, -35, -10, 9, -15, -13, 18, -38, 28, 22, -14, 2, -22, 42, + -20, 22, 12, -20, 45, -16, 17, -16, 22, 34, -27, -13, -7, 1, -21, -1, + 13, -44, 36, -51, -8, 16, -7, -30, -46, 90, -54, 35, 1, 11, 9, 5, + 1, -19, 20, 11, 21, -1, -49, 41, -6, 0, 37, -74, 9, 20, -12, -47, + 65, -68, 28, -5, -26, 15, 14, -3, -23, 8, 18, -22, 13, 3, 31, -21, + -5, 8, 24, -21, 48, -20, -21, 41, -43, 4, 18, 21, -60, 9, -27, 1, + 13, -15, -33, 15, 23, -48, -8, 53, -50, 1, 6, -40, 90, -10, -15, 51, + -52, 53, 29, -68, 50, 52, -30, -21, 7, -1, -8, -29, 11, -47, 6, 18, + -12, -25, 53, -34, -23, -6, 19, -7, -13, 7, 5, -2, 14, 11, -15, 51, + -29, 6, 12, 20, -27, 29, -12, 4, -18, -5, 2, -17, 10, -19, 2, -8, + -5, 56, -82, 49, 0, -42, 48, -25, 19, 6, -41, 17, 35, -18, -17, -29, + 26, 10, 4, -24, 26, -35, 47, -36, 2, 2, -23, 27, -42, 55, 0, -21, + 19, 21, -8, 1, -3, -15, 7, 12, -23, -29, 47, -12, 4, -28, 17, 16, + -7, -31, -8, 25, -6, 0, 13, -20, 6, 3, -7, 19, -21, -37, 27, 41, + 7, -14, 12, -59, 57, 6, -49, -2, -8, 0, 19, 13, -20, -5, 16, 23, + 4, -15, -33, 14, 2, 15, -26, -28, 10, 45, -17, -24, 14, 17, -39, 22, + -8, 48, -51, -1, -16, 52, -34, -21, 11, 13, 18, -57, 26, 15, 27, -36, + -12, 40, -7, -14, 15, -86, 91, -20, -13, -7, 53, -43, 33, -25, 13, 3, + -38, -19, 28, 28, -18, -74, 58, -3, 40, -27, -34, 30, 28, -1, -22, 2, + 9, -8, -12, 12, 21, -35, -2, -17, 17, 2, -27, 22, -36, 38, -11, 2, + -20, 7, 20, -29, 39, 11, -3, 9, -24, 47, -36, 28, -14, -16, 38, -37, + 12, -15, 18, -69, 56, -31, 17, -16, -18, -13, 21, -6, -9, -25, 37, 6, + -1, -2, 5, -1, -26, 39, 6, -3, -10, 0, 12, 30, -12, -31, 24, 13, + -14, 9, -23, 31, -43, -17, -2, 13, -23, -14, -21, 21, 19, -22, -12, 24, + 41, -26, 10, 12, 19, -3, 9, -12, 26, 12, -52, -4, 16, -3, 0, -43, + 7, 5, -14, -9, 12, -28, 15, -23, -2, 35, -12, -8, -10, 24, 57, -55, + 26, -18, 19, 44, -30, 0, -5, 50, -56, -1, 8, -5, -39, 9, 19, -39, + 38, -73, 30, -1, 2, 16, -24, 6, 29, -71, 70, -18, -6, 8, 31, 4, + -13, 23, -11, 31, -56, 57, -25, 10, 15, -44, -10, 16, -17, -44, 18, -28, + 10, 8, -21, -4, -9, 28, 20, -16, 17, -17, -6, 30, 0, 11, -21, 25, + 25, -1, 31, -56, 31, 14, -32, 2, -19, 4, -17, -26, -13, 42, -59, 15, + -29, 53, -4, 1, -23, 13, 31, 5, -22, 3, 30, -28, 2, -24, 37, 1, + -3, -18, 18, 41, -40, 3, -40, 48, -31, -5, -20, 5, 9, 0, -30, -1, + 26, -15, -5, -6, 51, -25, -27, 7, 44, -11, 10, -32, 14, 46, -31, 6, + -11, 37, -33, -14, 19, -4, 22, -50, 26, -45, 21, 1, -23, 10, -15, 17, + -63, 53, -14, -18, 56, -49, 21, 25, -7, 4, -21, 52, -33, 19, 3, 11, + -9, -7, 0, -49, 22, -17, 25, -10, -11, 5, -19, 35, -26, 20, -7, -21, + 37, -25, 29, -23, 3, 6, 17, -26, 27, 5, -16, 10, -9, -24, 11, -4, + -17, 9, -5, -13, 1, -2, 10, 5, -13, 21, 0, 8, 9, -22, 12, 13, + -24, -3, -22, 42, -18, 3, -4, -15, 1, -2, 8, -17, -13, -2, 1, 23, + 10, -2, -31, 23, 17, -15, -9, -24, 31, 2, 19, -24, 4, -22, 28, -5, + -20, 34, -57, 26, 71, -51, 28, -24, -12, 28, 10, -35, -4, -6, 7, -7, + 8, -52, 61, -52, 7, -9, -21, 9, 18, -19, 3, 34, -53, 56, -29, 20, + -11, 22, 4, -1, 23, 2, 1, 24, -15, 3, -32, 13, 21, -37, 6, -11, + -25, 22, 7, -2, -41, 4, 10, -30, 39, -24, -7, 8, 12, 9, -1, -35, + 13, 3, 9, -18, 21, 26, -14, 41, -8, -35, 31, -29, 17, -20, -12, 20, + -30, 27, -26, 21, -9, -6, 5, -14, 3, -11, 15, 2, 8, -14, -5, 20, + 4, 0, -31, 9, 4, 25, -24, 5, -5, -13, 27, -7, -32, 1, -5, -10, + 28, 7, -4, 11, 10, 22, -3, -22, -15, 6, -3, -3, -27, -25, 5, 8, + -10, -17, 18, -18, 12, 32, -18, 1, 25, -25, 50, 7, 2, 0, -3, -3, + 16, -20, 9, -14, -15, 21, -27, -3, -17, 23, -31, -4, -18, 31, -21, 6, + 0, 18, -16, 27, 3, -7, -17, 17, -15, -11, 19, -16, 6, 1, 12, -18, + 5, -6, 24, 0, -19, 22, -23, 43, -35, 18, 22, -40, 1, 12, -4, -18, + 26, -53, 34, 1, -10, 1, -18, 27, -25, -24, 33, -31, 9, -43, 53, -29, + 33, -17, 5, 23, -7, 2, 23, 29, 1, -8, 20, -10, -1, -22, -3, -17, + 4, 22, -61, -23, 31, -26, -29, -12, 2, -3, 12, 10, 26, 5, -29, 61, + -9, 32, -18, -14, 29, 31, 2, -19, 9, 31, -20, -31, -7, 5, -22, -47, + 31, -40, 15, -39, 22, -27, 40, -78, 31, 4, -19, 33, -13, -8, 41, -1, + 5, -12, 53, -51, 22, -1, 18, 28, -29, -1, 0, 0, 11, 13, -2, -7, + -5, -3, -3, 1, 2, -6, 0, 3, 8, 9, 5, 0, 14, -5, -28, -39, + -39, -36, -37, -27, -43, -49, -13, 4, 6, -7, 0, -1, 3, 23, 39, 29, + 35, 41, 21, 35, 0, 0, 21, 59, 67, 31, 21, 13, -3, 18, 34, 28, + 5, 3, 13, 3, 0, 12, -7, -33, -27, -39, -14, -34, -50, -30, -37, -35, + -53, -74, -70, -61, -62, -62, -50, -44, -61, -36, -3, -23, -15, -12, -17, -20, + -6, 11, -6, -12, -6, -17, 7, 46, 71, 87, 79, 70, 77, 104, 109, 66, + 37, 34, 27, 31, 40, 43, 31, 23, 17, 2, 10, 24, 32, 66, 56, 17, + -13, -55, -54, -21, 19, -19, -56, -77, -37, -27, -10, -6, -38, -36, -37, -3, + 23, 25, 25, 19, 35, 34, -7, -5, 28, 60, 66, 65, 51, 34, 22, 53, + 51, 15, 20, 11, 21, 21, 16, 24, -2, -23, -36, -35, -21, -29, -51, -51, + -47, -57, -85, -80, -70, -100, -97, -82, -78, -76, -64, -51, -56, -54, -49, -70, + -62, -53, -54, -60, -57, -65, -78, -76, -62, -39, 0, 31, 13, 6, 31, 54, + 55, 43, 30, 13, 9, 31, 23, 43, 28, 24, 36, 36, 24, 30, 54, 70, + 113, 103, 75, 4, -3, 40, 55, 50, 23, 9, 25, 29, 48, 41, 29, 14, + 6, 40, 63, 49, 39, 71, 80, 64, 21, 12, 17, 29, 68, 71, 52, 36, + 24, 37, 24, 1, 5, 3, -6, -4, 1, 13, -3, -22, -35, -31, -27, -58, + -59, -43, -55, -71, -76, -71, -88, -103, -95, -98, -85, -77, -68, -71, -58, -50, + -47, -52, -46, -40, -47, -44, -48, -56, -60, -91, -96, -68, -15, -6, -16, 9, + 3, 29, 31, 29, 8, 10, -6, 5, 10, -6, -4, -6, 15, 7, -2, 2, + -5, 30, 91, 107, 74, 8, -3, 14, 27, 32, 26, 17, 21, 18, 34, 49, + 20, -3, 2, 30, 42, 20, 36, 68, 79, 81, 52, 27, 22, 37, 80, 95, + 77, 77, 72, 74, 57, 55, 56, 41, 35, 22, 40, 58, 32, 23, 24, 26, + 0, -7, 6, -2, -16, -26, -31, -45, -46, -64, -77, -79, -73, -72, -75, -59, + -49, -56, -35, -48, -44, -50, -43, -59, -58, -40, -78, -119, -123, -95, -73, -40, + -52, -45, -29, -18, -3, -1, -11, -21, -28, -12, -24, -29, -21, -29, -16, -3, + -5, -30, -40, 1, 69, 96, 78, 31, 14, 23, 17, 19, 33, 20, 9, 9, + 45, 50, 14, 3, 12, 13, 16, 7, 14, 35, 54, 75, 56, 24, 1, 18, + 47, 47, 60, 62, 66, 69, 46, 54, 53, 38, 11, 18, 44, 41, 28, 33, + 37, 22, 14, 15, 13, 13, 1, -1, -13, -6, -11, -38, -33, -47, -40, -46, + -31, -29, -22, -9, -5, -9, 9, 4, -23, -14, -4, -3, -26, -69, -87, -74, + -60, -42, -49, -33, -28, -16, 9, 2, -16, -22, -25, -25, -33, -32, -44, -58, + -41, -11, -19, -51, -77, -43, 24, 47, 49, 34, 21, 5, -9, 5, 18, -10, + -14, 2, 23, 26, -3, -7, -4, 2, -3, -10, -4, -6, 38, 64, 50, 25, + 1, 11, 17, 21, 36, 58, 62, 46, 46, 61, 56, 27, 11, 20, 18, 27, + 15, 31, 26, 23, 17, 7, 16, 0, -9, -10, -3, -8, -14, -25, -36, -56, + -41, -39, -50, -30, -12, -23, -8, 10, 23, 17, -2, 3, 14, 26, 7, -33, + -48, -53, -52, -35, -30, -30, -23, 3, 21, 17, 8, 7, -8, -1, 0, -6, + -29, -50, -26, 10, 5, -38, -64, -41, 5, 22, 49, 63, 38, 20, 13, 26, + 15, -7, -9, -1, 28, 9, 1, -4, -12, -1, -5, -20, -38, -32, 6, 38, + 36, 16, 10, 0, -8, -13, 15, 41, 25, 30, 30, 52, 35, 17, 8, 3, + -5, -5, -6, 4, 7, 4, 4, 3, 3, -20, -25, -23, -28, -22, -18, -47, + -50, -54, -62, -67, -62, -48, -43, -44, -31, -10, 17, 10, -8, 1, 22, 24, + 17, -1, -21, -40, -39, -26, -38, -32, -21, 2, 17, 26, 29, 18, 5, 15, + 35, 19, -11, -37, -9, 33, 17, -6, -30, -23, -10, 22, 65, 73, 71, 47, + 57, 66, 38, 15, 16, 23, 34, 35, 27, 10, 11, 21, 32, -4, -26, -29, + 4, 29, 28, 38, 32, 17, -6, -6, 17, 32, 21, 31, 39, 49, 36, 27, + 25, 13, -1, -11, -8, -1, -15, -11, 4, -7, -9, -14, -38, -46, -35, -31, + -43, -53, -54, -72, -84, -88, -86, -79, -73, -86, -69, -40, -16, -23, -28, -13, + -9, 5, 5, -10, -34, -45, -48, -52, -61, -59, -42, -38, -9, 13, 19, 8, + -14, 18, 42, 28, -18, -31, -3, 11, 21, 13, -9, -17, -22, 9, 57, 71, + 62, 68, 83, 82, 65, 38, 38, 31, 52, 57, 45, 23, 25, 51, 56, 21, + -2, -8, 7, 21, 28, 55, 55, 37, 15, 17, 30, 30, 30, 48, 55, 65, + 55, 54, 61, 42, 24, 22, 13, 6, 6, 4, 4, 17, 19, 1, -20, -23, + -25, -27, -26, -44, -44, -62, -79, -91, -83, -76, -99, -104, -87, -63, -51, -40, + -42, -40, -29, -16, -6, -31, -40, -47, -63, -68, -81, -76, -81, -75, -49, -15, + -5, -34, -38, 2, 15, 8, -29, -43, -33, -18, -11, 8, -9, -42, -45, -14, + 25, 33, 41, 54, 67, 75, 71, 46, 30, 23, 52, 55, 38, 20, 25, 53, + 59, 35, 17, 6, 3, 5, 27, 64, 61, 49, 40, 40, 45, 36, 38, 63, + 69, 69, 77, 85, 78, 76, 63, 48, 38, 42, 28, 15, 30, 35, 41, 27, + 14, 0, -4, -2, -14, -16, -15, -35, -65, -63, -56, -64, -80, -94, -77, -71, + -46, -34, -42, -37, -21, -6, -5, -16, -20, -35, -44, -62, -66, -66, -96, -94, + -58, -26, -32, -44, -50, -14, 2, -9, -26, -41, -53, -49, -27, -5, -28, -59, + -65, -47, -20, -11, 7, 15, 28, 51, 57, 32, 7, 2, 30, 32, 15, 0, + 7, 30, 30, 24, 21, -2, -19, -20, 6, 37, 40, 31, 40, 45, 30, 29, + 35, 49, 52, 69, 74, 78, 89, 79, 72, 62, 60, 51, 37, 29, 29, 42, + 51, 46, 30, 32, 18, 2, 8, 13, 15, -13, -35, -35, -38, -40, -53, -71, + -70, -58, -34, -38, -32, -28, -9, 10, 10, 7, 11, -7, -28, -21, -26, -47, + -80, -84, -49, -18, -28, -38, -32, -8, -4, 4, 3, -23, -46, -44, -19, -5, + -22, -42, -55, -56, -35, -25, -12, -8, 11, 43, 51, 33, 1, 0, 24, 18, + 1, -5, 0, 1, 9, 15, 21, -2, -38, -36, -19, 2, 2, 19, 26, 19, + 20, 10, 11, 20, 31, 37, 49, 62, 64, 61, 60, 61, 50, 51, 32, 10, + 16, 27, 31, 33, 33, 36, 7, -6, 3, 14, 12, -10, -21, -40, -34, -33, + -47, -65, -67, -60, -40, -40, -44, -25, -10, -4, 14, 26, 22, 4, -7, 8, + 8, -22, -67, -65, -33, -19, -24, -20, -18, -8, 1, 26, 30, -2, -22, -25, + -6, 5, -1, -13, -38, -43, -31, -21, -16, -16, 9, 47, 61, 35, 22, 22, + 31, 24, 10, 13, 5, -2, 0, 28, 34, 1, -21, -30, -28, -18, -5, 5, + 18, 20, 14, 6, 6, 12, 9, 20, 33, 39, 51, 51, 42, 51, 51, 48, + 20, 9, 7, 5, 7, 15, 28, 19, -1, -16, -15, -4, 4, -16, -30, -41, + -45, -41, -50, -79, -77, -69, -65, -64, -56, -45, -40, -28, -4, 21, 17, -8, + -9, 21, 16, -18, -56, -58, -44, -39, -24, -22, -28, -22, -4, 29, 31, 13, + -9, -16, -3, 11, 13, 1, -18, -33, -15, -11, -23, -22, 11, 52, 58, 50, + 46, 50, 49, 36, 40, 40, 17, 6, 20, 37, 45, 29, 9, -7, -12, -11, + -6, 9, 30, 25, 26, 26, 17, 19, 15, 21, 24, 46, 55, 47, 43, 56, + 64, 52, 33, 25, 13, -3, 2, 10, 21, 26, 4, -15, -16, -13, -2, -11, + -32, -43, -37, -44, -61, -77, -78, -82, -82, -80, -71, -61, -72, -59, -21, 5, + -2, -27, -10, 15, 7, -14, -44, -59, -67, -55, -37, -38, -50, -45, -23, 5, + 23, 9, -6, -19, -15, 5, 14, 2, -22, -22, -10, -17, -35, -38, -3, 35, + 38, 43, 57, 51, 44, 49, 57, 46, 25, 14, 24, 35, 54, 41, 31, 22, + 1, -7, -4, 12, 23, 34, 37, 35, 35, 36, 26, 24, 33, 55, 62, 53, + 58, 70, 70, 73, 62, 51, 38, 14, 6, 20, 31, 32, 27, 4, -9, -1, + 9, -8, -21, -22, -27, -33, -53, -64, -67, -82, -86, -83, -67, -75, -97, -77, + -36, -15, -27, -32, -18, -1, -1, -6, -31, -62, -73, -68, -52, -52, -68, -69, + -50, -21, -2, 4, -10, -33, -29, -4, 2, -10, -29, -22, -8, -27, -55, -49, + -27, -6, 12, 31, 43, 31, 38, 44, 54, 48, 25, 11, 19, 30, 36, 41, + 41, 29, 11, -1, -9, 0, 15, 27, 34, 36, 46, 46, 26, 27, 39, 51, + 59, 62, 62, 73, 76, 77, 85, 78, 58, 35, 23, 21, 37, 53, 37, 22, + 15, 16, 20, 3, 0, -2, -2, -14, -33, -35, -45, -69, -77, -59, -53, -76, + -96, -74, -41, -30, -25, -26, -19, -4, 7, 11, -8, -40, -62, -62, -51, -55, + -69, -74, -71, -44, -15, -2, -14, -36, -38, -8, -7, -27, -33, -17, -12, -38, + -51, -57, -58, -41, -14, 8, 19, 15, 15, 31, 46, 40, 21, 9, 7, 10, + 20, 25, 33, 28, 16, 1, -18, -13, 0, 6, 12, 30, 39, 39, 26, 20, + 32, 41, 45, 53, 64, 63, 62, 80, 84, 87, 81, 51, 29, 21, 44, 52, + 41, 33, 29, 31, 27, 12, 8, 16, 10, -4, -7, -7, -29, -62, -57, -37, + -44, -68, -81, -70, -48, -33, -23, -22, -17, -5, 16, 31, 14, -15, -33, -42, + -41, -37, -53, -65, -74, -54, -16, 2, -12, -33, -19, -1, -10, -22, -17, -8, + -8, -18, -33, -48, -62, -57, -31, -1, 7, 0, 9, 22, 40, 40, 27, 14, + 4, 3, 10, 14, 21, 31, 20, 0, -13, -19, -17, -15, -7, 12, 29, 28, + 13, 20, 18, 18, 31, 38, 47, 49, 51, 56, 67, 87, 84, 56, 30, 20, + 31, 41, 31, 24, 32, 33, 20, 7, 14, 15, -2, -1, 13, 4, -28, -53, + -45, -34, -38, -59, -75, -72, -58, -44, -26, -26, -29, -8, 14, 34, 28, 10, + -9, -22, -26, -24, -30, -54, -78, -56, -13, -4, -17, -16, -5, 1, -6, -9, + -8, -1, 3, -2, -4, -28, -53, -58, -37, -10, 1, -1, 6, 20, 34, 46, + 40, 25, 19, 11, 7, 10, 23, 33, 28, 16, -3, -3, -17, -31, -14, 4, + 15, 20, 20, 16, 10, 14, 19, 23, 37, 45, 35, 37, 53, 76, 83, 62, + 34, 20, 27, 28, 13, 17, 29, 21, 7, 9, 13, -4, -17, -4, 13, 2, + -27, -53, -47, -39, -46, -56, -77, -87, -77, -58, -45, -46, -47, -33, -6, 17, + 22, 16, 1, -20, -25, -10, -21, -57, -79, -57, -32, -24, -23, -18, -3, -1, + -6, -4, -4, -5, 3, 13, 14, -6, -38, -51, -39, -22, -4, -1, 3, 14, + 32, 45, 46, 46, 33, 25, 15, 9, 28, 38, 32, 28, 26, 14, -9, -21, + -15, -5, 10, 24, 22, 22, 21, 15, 15, 23, 36, 42, 35, 31, 41, 72, + 87, 68, 46, 42, 34, 19, 14, 25, 25, 11, 14, 18, 14, -7, -24, -7, + 12, 4, -19, -41, -47, -44, -41, -52, -74, -92, -88, -72, -59, -63, -68, -53, + -34, -11, 12, 19, -7, -27, -15, -5, -22, -54, -76, -66, -52, -47, -41, -29, + -17, -12, -12, -10, -11, -19, -7, 12, 19, 3, -23, -42, -48, -31, -19, -14, + -6, 1, 20, 35, 39, 50, 51, 33, 16, 17, 30, 31, 32, 41, 39, 28, + 14, -7, -14, -5, 8, 18, 27, 34, 29, 22, 21, 26, 38, 51, 39, 27, + 43, 75, 84, 73, 75, 68, 46, 32, 31, 35, 27, 15, 23, 36, 26, 0, + -13, -4, 12, 14, 1, -23, -36, -36, -32, -36, -60, -83, -84, -70, -67, -70, + -66, -67, -62, -27, 8, 13, -11, -22, -7, 4, -16, -44, -63, -67, -63, -63, + -53, -42, -33, -25, -15, -10, -22, -27, -18, -1, 16, 9, -13, -32, -46, -42, + -31, -30, -24, -8, 5, 11, 25, 49, 50, 33, 25, 20, 21, 24, 29, 34, + 41, 41, 26, 5, -5, -7, -4, 12, 23, 33, 37, 29, 19, 24, 49, 53, + 33, 33, 49, 65, 73, 80, 89, 85, 63, 48, 50, 46, 30, 20, 35, 46, + 39, 17, 0, 2, 15, 23, 18, -2, -20, -24, -12, -19, -45, -60, -66, -70, + -66, -56, -61, -74, -74, -38, 0, 6, -8, -15, 3, 13, -1, -24, -42, -52, + -65, -64, -54, -54, -47, -31, -19, -12, -21, -32, -27, -12, 7, 13, -2, -24, + -36, -37, -44, -47, -32, -20, -18, -9, 12, 30, 38, 35, 26, 18, 17, 16, + 13, 25, 36, 37, 32, 18, 2, -11, -10, -5, 3, 28, 38, 20, 8, 25, + 42, 40, 28, 30, 40, 46, 54, 70, 87, 82, 66, 61, 59, 48, 28, 20, + 32, 43, 43, 24, 8, 1, 7, 23, 25, 3, -13, -9, -8, -15, -28, -40, + -58, -71, -60, -49, -58, -80, -82, -50, -17, -5, -13, -12, 6, 13, 8, -3, + -24, -42, -54, -59, -57, -60, -59, -43, -24, -15, -20, -30, -35, -25, 1, 11, + -2, -12, -18, -33, -48, -49, -41, -37, -32, -21, -8, 13, 27, 27, 27, 23, + 16, 8, 7, 15, 22, 32, 35, 22, 9, 0, -18, -26, -8, 20, 25, 11, + 4, 18, 32, 29, 22, 29, 30, 27, 38, 60, 75, 70, 68, 69, 67, 52, + 30, 19, 27, 36, 40, 34, 10, -2, 6, 21, 20, 4, -2, -4, -7, -9, + -12, -25, -52, -66, -53, -42, -53, -79, -86, -58, -33, -23, -16, -12, 0, 12, + 17, 13, -5, -24, -38, -44, -50, -59, -61, -51, -33, -15, -11, -28, -36, -23, + -4, 5, 5, 7, -3, -17, -31, -40, -38, -37, -36, -29, -14, 4, 15, 25, + 34, 30, 24, 19, 9, 8, 22, 33, 31, 30, 31, 16, -14, -26, -13, 14, + 17, 7, 8, 18, 24, 23, 28, 31, 23, 18, 30, 50, 62, 61, 63, 75, + 73, 59, 40, 23, 20, 30, 43, 35, 11, 0, 8, 15, 12, 6, 3, -6, + -10, -3, -1, -15, -46, -62, -47, -38, -54, -77, -84, -70, -53, -40, -30, -21, + -12, 1, 16, 20, 5, -12, -21, -33, -44, -52, -64, -64, -44, -17, -15, -27, + -30, -26, -15, -3, 6, 12, 9, -2, -17, -26, -29, -36, -41, -32, -21, -10, + 6, 18, 27, 34, 37, 25, 11, 14, 21, 26, 27, 37, 48, 33, -1, -19, + -8, 7, 8, 8, 16, 16, 17, 25, 34, 36, 23, 16, 28, 44, 53, 54, + 61, 74, 79, 75, 56, 30, 19, 31, 45, 35, 15, 9, 9, 9, 11, 9, + 5, -8, -14, 0, 9, -10, -40, -53, -44, -38, -51, -72, -84, -80, -69, -58, + -45, -38, -30, -13, 5, 13, 8, 0, -14, -25, -30, -46, -67, -72, -55, -34, + -26, -28, -31, -31, -26, -17, -4, 9, 11, 2, -4, -12, -22, -33, -38, -40, + -34, -18, -7, 2, 17, 33, 38, 29, 19, 20, 22, 17, 19, 38, 57, 43, + 15, 2, -1, 1, 3, 10, 18, 15, 14, 25, 38, 40, 27, 21, 28, 38, + 46, 50, 55, 66, 81, 90, 71, 40, 30, 37, 44, 39, 26, 18, 12, 8, + 14, 19, 8, -11, -13, 5, 15, -2, -28, -42, -36, -34, -45, -60, -76, -83, + -77, -65, -59, -55, -43, -28, -13, 5, 11, 2, -9, -11, -17, -37, -61, -71, + -65, -49, -38, -36, -34, -35, -36, -32, -16, -2, 1, 3, 0, -7, -13, -25, + -39, -46, -42, -30, -22, -15, 2, 21, 30, 24, 22, 28, 19, 5, 11, 33, + 50, 45, 31, 17, 6, -1, 0, 8, 16, 12, 11, 23, 37, 40, 33, 29, + 29, 33, 45, 48, 46, 58, 83, 97, 84, 59, 45, 46, 47, 46, 42, 31, + 16, 12, 23, 29, 16, -5, -9, 10, 21, 10, -12, -24, -25, -25, -29, -42, + -64, -73, -70, -66, -63, -58, -52, -42, -22, 0, 8, 4, 1, 3, -1, -19, + -44, -61, -63, -57, -50, -39, -33, -37, -39, -36, -27, -14, -4, 0, 0, 0, + -1, -13, -30, -42, -43, -37, -36, -30, -10, 8, 12, 15, 26, 31, 16, 1, + 4, 21, 37, 41, 38, 29, 13, 0, -1, 6, 8, 3, 7, 17, 26, 34, + 35, 27, 24, 32, 40, 37, 32, 45, 72, 89, 86, 70, 57, 48, 45, 49, + 50, 37, 16, 11, 25, 34, 20, -3, -7, 7, 18, 15, 2, -14, -20, -15, + -17, -32, -49, -61, -67, -65, -60, -61, -63, -54, -33, -12, -1, 1, 2, 10, + 12, -3, -26, -43, -57, -60, -54, -45, -38, -38, -39, -39, -35, -23, -13, -6, + -3, 2, 7, -2, -20, -30, -34, -42, -47, -38, -19, -9, -5, 7, 24, 31, + 19, 3, 0, 10, 23, 33, 40, 36, 18, 5, 4, 4, 0, 0, 0, 5, + 16, 29, 30, 22, 22, 31, 36, 27, 21, 32, 54, 74, 81, 77, 65, 49, + 44, 50, 55, 40, 16, 10, 24, 31, 20, 3, -6, -1, 11, 16, 5, -9, + -13, -12, -14, -22, -36, -53, -63, -62, -59, -63, -69, -67, -48, -25, -14, -10, + -1, 10, 16, 10, -6, -26, -45, -54, -55, -50, -42, -39, -39, -40, -39, -29, + -19, -15, -8, 4, 11, 3, -6, -11, -21, -38, -48, -40, -26, -21, -16, -3, + 18, 30, 24, 12, 6, 4, 11, 29, 41, 39, 28, 18, 11, 8, 5, 1, + -4, -2, 11, 25, 25, 19, 23, 33, 35, 25, 17, 23, 39, 57, 74, 81, + 72, 53, 47, 56, 60, 44, 23, 16, 22, 29, 25, 10, -4, -3, 7, 11, + 6, -3, -9, -11, -9, -12, -26, -42, -56, -59, -55, -61, -73, -75, -60, -42, + -32, -23, -12, 0, 12, 15, 7, -10, -30, -46, -53, -53, -46, -41, -43, -45, + -41, -32, -30, -26, -14, -1, 5, 2, 3, 3, -9, -30, -43, -40, -31, -31, + -28, -12, 8, 20, 25, 22, 9, 0, 6, 21, 34, 39, 35, 26, 18, 16, + 14, 4, -7, -5, 9, 21, 19, 16, 23, 35, 37, 28, 20, 20, 26, 43, + 67, 82, 74, 57, 54, 62, 63, 52, 33, 21, 23, 30, 28, 14, 1, -1, + 3, 8, 7, -1, -7, -9, -6, -5, -15, -34, -49, -51, -51, -60, -72, -76, + -70, -57, -46, -37, -25, -13, 3, 14, 14, 3, -15, -33, -48, -52, -47, -45, + -49, -49, -41, -37, -39, -35, -21, -10, -5, -2, 6, 12, 1, -19, -32, -34, + -36, -39, -34, -23, -9, 9, 23, 25, 14, 3, 2, 12, 25, 36, 37, 30, + 24, 25, 24, 10, -5, -4, 9, 18, 15, 14, 23, 34, 38, 36, 30, 19, + 15, 32, 61, 78, 75, 63, 60, 67, 71, 62, 42, 29, 30, 33, 32, 20, + 8, 4, 6, 8, 8, 3, -5, -9, -2, 3, -7, -25, -37, -42, -45, -54, + -66, -74, -74, -67, -58, -49, -40, -27, -9, 5, 13, 13, 0, -21, -39, -45, + -44, -49, -54, -50, -44, -44, -47, -42, -29, -21, -19, -11, 5, 12, 4, -8, + -18, -28, -36, -40, -40, -36, -24, -4, 14, 21, 17, 7, 0, 3, 17, 32, + 34, 29, 28, 34, 33, 17, 0, 0, 9, 13, 12, 14, 20, 27, 38, 46, + 39, 21, 11, 24, 51, 71, 74, 66, 64, 73, 78, 71, 54, 40, 38, 41, + 38, 28, 17, 11, 9, 12, 14, 7, -3, -5, 3, 9, 2, -12, -23, -28, + -35, -45, -55, -65, -71, -68, -62, -57, -50, -37, -22, -7, 10, 20, 12, -8, + -24, -32, -39, -48, -52, -49, -45, -49, -52, -44, -34, -33, -30, -18, -3, 5, + 5, 1, -8, -19, -29, -37, -43, -45, -37, -18, 0, 13, 18, 10, -1, -3, + 10, 24, 26, 23, 29, 38, 37, 21, 8, 5, 6, 8, 10, 12, 11, 16, + 34, 49, 46, 27, 10, 15, 38, 59, 67, 63, 63, 72, 81, 77, 61, 48, + 45, 45, 42, 35, 23, 13, 11, 17, 18, 9, -3, -5, 3, 10, 6, -3, + -12, -19, -24, -34, -46, -57, -64, -65, -66, -63, -56, -48, -39, -22, 1, 17, + 16, 3, -8, -17, -30, -44, -47, -44, -47, -53, -52, -44, -41, -41, -38, -28, + -14, -3, 3, 3, -2, -9, -17, -28, -42, -49, -46, -34, -17, 3, 14, 9, + -3, -6, 5, 15, 13, 15, 26, 36, 35, 25, 16, 8, 2, 4, 9, 6, + 1, 4, 22, 43, 48, 31, 11, 7, 24, 45, 55, 54, 55, 68, 79, 77, + 66, 54, 48, 47, 47, 41, 27, 14, 11, 18, 20, 10, -2, -6, 0, 7, + 8, 2, -6, -12, -14, -23, -38, -49, -55, -62, -66, -63, -60, -59, -53, -37, + -12, 8, 13, 10, 7, -4, -21, -35, -37, -39, -47, -53, -51, -45, -44, -44, + -42, -36, -24, -10, 0, 2, 1, 1, -3, -15, -30, -42, -49, -45, -30, -6, + 10, 7, -2, -3, 5, 9, 6, 11, 23, 32, 35, 33, 25, 14, 6, 9, + 12, 8, -2, -4, 13, 36, 48, 39, 18, 7, 17, 34, 43, 45, 50, 62, + 74, 78, 71, 59, 51, 49, 52, 48, 32, 16, 12, 19, 21, 13, 1, -6, + -5, 2, 6, 2, -4, -6, -9, -18, -29, -40, -51, -60, -65, -63, -63, -68, + -68, -53, -30, -12, 0, 10, 13, 3, -14, -25, -29, -35, -45, -52, -52, -49, + -47, -47, -47, -46, -35, -20, -10, -5, -1, 4, 4, -4, -15, -30, -47, -54, + -41, -15, 1, 0, -2, 2, 6, 4, 3, 7, 16, 26, 35, 38, 32, 20, + 12, 14, 18, 12, -1, -8, 3, 27, 46, 44, 26, 14, 17, 28, 35, 38, + 44, 55, 69, 78, 77, 66, 55, 54, 60, 58, 41, 24, 17, 19, 23, 20, + 7, -4, -4, 0, 2, 1, 0, -2, -4, -10, -17, -28, -42, -55, -59, -56, + -61, -72, -74, -63, -47, -32, -14, 5, 13, 7, -4, -12, -19, -28, -38, -46, + -51, -50, -46, -47, -51, -52, -43, -30, -20, -13, -5, 0, 4, 4, 2, -13, + -40, -55, -47, -25, -12, -8, -3, 3, 5, 4, 2, 3, 7, 18, 32, 41, + 36, 25, 18, 21, 25, 21, 5, -9, -3, 19, 41, 45, 34, 24, 23, 27, + 30, 33, 38, 47, 62, 78, 82, 72, 61, 61, 67, 66, 54, 37, 24, 23, + 28, 25, 15, 5, 0, 0, 0, 1, 2, 2, -1, -4, -5, -15, -34, -47, + -49, -49, -58, -69, -73, -70, -63, -51, -30, -8, 5, 7, 3, -4, -11, -20, + -29, -41, -49, -50, -46, -49, -54, -56, -50, -42, -33, -22, -13, -10, -6, 5, + 12, -1, -30, -50, -50, -38, -27, -18, -10, -3, 1, 2, 2, -2, -4, 6, + 24, 36, 36, 27, 19, 22, 30, 28, 10, -8, -10, 9, 30, 39, 35, 30, + 26, 26, 28, 29, 29, 35, 53, 73, 80, 74, 65, 63, 69, 72, 64, 47, + 33, 28, 29, 28, 21, 12, 6, 2, -2, 1, 4, 1, -2, 2, 6, -4, + -23, -35, -38, -42, -51, -60, -66, -70, -71, -63, -45, -23, -5, 4, 6, 3, + -2, -7, -18, -32, -42, -43, -43, -47, -52, -54, -53, -51, -42, -27, -20, -21, + -14, 4, 17, 10, -13, -35, -45, -44, -37, -26, -17, -11, -3, 3, 3, -3, + -9, -4, 13, 31, 35, 27, 19, 23, 34, 36, 19, -3, -10, 2, 19, 31, + 35, 33, 29, 30, 32, 28, 22, 26, 43, 63, 76, 75, 67, 65, 71, 75, + 70, 57, 43, 36, 34, 30, 26, 21, 14, 5, 1, 4, 3, -2, -2, 6, + 11, 3, -11, -22, -29, -36, -43, -50, -57, -67, -74, -72, -60, -40, -19, -5, + 2, 4, 6, 3, -8, -23, -32, -35, -40, -45, -47, -51, -57, -58, -47, -33, + -30, -32, -24, -5, 13, 14, 1, -18, -36, -45, -42, -35, -27, -20, -11, 0, + 3, -3, -12, -12, 1, 21, 31, 25, 16, 20, 34, 40, 26, 5, -7, -6, + 7, 21, 27, 26, 27, 31, 33, 27, 17, 15, 28, 50, 65, 68, 64, 62, + 68, 74, 72, 61, 51, 44, 35, 29, 28, 25, 15, 7, 5, 5, -1, -8, + -5, 3, 8, 4, -4, -12, -22, -32, -38, -42, -50, -61, -72, -77, -73, -57, + -36, -20, -11, -2, 7, 8, -3, -14, -22, -30, -38, -41, -42, -49, -60, -62, + -52, -41, -40, -41, -34, -18, 0, 11, 10, -3, -23, -38, -42, -40, -36, -31, + -20, -6, 2, -1, -13, -19, -9, 12, 25, 20, 12, 17, 30, 39, 34, 17, + -2, -8, 1, 13, 19, 21, 23, 31, 37, 32, 18, 10, 18, 36, 55, 62, + 60, 60, 67, 73, 72, 68, 61, 51, 41, 35, 34, 28, 18, 12, 11, 8, + -2, -9, -7, 0, 4, 5, 3, -3, -14, -24, -31, -36, -41, -50, -64, -77, + -80, -68, -51, -37, -26, -11, 3, 6, 2, -3, -13, -24, -32, -33, -34, -46, + -60, -62, -54, -47, -46, -47, -43, -31, -13, 4, 12, 6, -9, -23, -34, -39, + -40, -38, -29, -14, 0, 2, -11, -22, -15, 4, 17, 16, 11, 13, 25, 39, + 41, 28, 9, -3, 0, 9, 15, 15, 19, 30, 40, 39, 26, 12, 11, 28, + 45, 54, 56, 60, 66, 70, 73, 74, 69, 58, 49, 45, 42, 32, 22, 18, + 19, 14, 3, -6, -7, -4, 0, 5, 6, 3, -5, -14, -24, -30, -32, -38, + -53, -71, -78, -72, -63, -54, -39, -22, -8, 1, 6, 6, -4, -18, -25, -23, + -25, -39, -54, -58, -54, -49, -49, -50, -49, -42, -26, -7, 7, 9, 2, -9, + -20, -30, -38, -43, -39, -22, -2, 3, -9, -20, -16, -2, 11, 14, 10, 10, + 20, 36, 46, 40, 22, 8, 6, 11, 13, 12, 15, 26, 41, 46, 36, 20, + 14, 24, 38, 47, 54, 60, 64, 69, 76, 81, 76, 66, 60, 58, 53, 40, + 30, 27, 27, 22, 12, 3, -3, -4, -1, 4, 8, 8, 5, -4, -15, -21, + -21, -25, -41, -58, -69, -71, -70, -64, -51, -35, -23, -9, 5, 10, 1, -13, + -17, -15, -19, -32, -46, -54, -54, -51, -50, -52, -55, -53, -40, -22, -6, 3, + 4, -2, -10, -19, -32, -47, -49, -32, -11, -3, -10, -20, -20, -10, 2, 7, + 5, 2, 10, 28, 42, 41, 29, 16, 10, 11, 11, 7, 6, 17, 35, 45, + 39, 26, 18, 19, 26, 37, 47, 53, 56, 61, 73, 81, 76, 68, 65, 65, + 59, 46, 36, 31, 28, 25, 19, 9, -1, -6, -4, -1, 2, 8, 9, 0, + -10, -15, -14, -18, -32, -46, -57, -68, -74, -71, -61, -51, -41, -23, -2, 8, + 2, -8, -11, -10, -13, -23, -37, -48, -53, -51, -49, -53, -59, -60, -53, -37, + -19, -7, -3, -2, -1, -6, -22, -43, -52, -42, -21, -9, -12, -20, -23, -16, + -4, 3, -1, -6, 0, 18, 34, 40, 33, 22, 16, 16, 13, 5, 0, 9, + 27, 39, 40, 32, 24, 18, 19, 29, 40, 44, 46, 55, 69, 77, 75, 71, + 70, 70, 65, 55, 45, 37, 32, 30, 26, 17, 7, 0, -5, -6, -1, 8, + 11, 4, -5, -7, -7, -13, -21, -30, -44, -59, -69, -69, -65, -63, -56, -36, + -13, 1, 1, -4, -6, -5, -6, -12, -25, -40, -47, -47, -46, -50, -56, -62, + -61, -48, -30, -18, -12, -6, 4, 6, -7, -32, -49, -46, -30, -16, -12, -19, + -25, -20, -7, 0, -3, -9, -7, 8, 26, 36, 34, 27, 24, 24, 19, 7, + -2, 4, 18, 31, 38, 38, 30, 20, 18, 26, 34, 35, 38, 48, 62, 71, + 73, 72, 73, 72, 70, 64, 53, 43, 38, 35, 30, 23, 16, 7, -4, -10, + -4, 6, 8, 3, -1, -2, -4, -9, -12, -19, -33, -51, -61, -65, -69, -73, + -70, -52, -30, -13, -6, -5, -7, -5, -2, -5, -17, -31, -41, -45, -44, -45, + -53, -64, -67, -58, -43, -31, -26, -17, -1, 10, 3, -19, -41, -48, -39, -23, + -16, -21, -27, -24, -12, -3, -5, -13, -15, -3, 16, 28, 29, 26, 28, 31, + 24, 10, 0, 0, 8, 20, 33, 38, 32, 22, 19, 24, 28, 28, 30, 40, + 52, 61, 68, 71, 72, 73, 73, 69, 59, 51, 45, 39, 32, 28, 26, 15, + 0, -9, -5, 2, 4, 2, 1, -1, -4, -6, -5, -10, -24, -41, -50, -56, + -66, -76, -77, -66, -47, -27, -15, -11, -10, -5, 0, -1, -8, -20, -33, -40, + -40, -40, -48, -62, -70, -64, -51, -43, -39, -29, -11, 7, 10, -5, -28, -43, + -41, -28, -20, -22, -29, -28, -17, -6, -5, -14, -20, -12, 6, 19, 22, 23, + 30, 35, 31, 20, 8, 0, 1, 13, 29, 37, 33, 26, 25, 27, 27, 25, + 26, 33, 43, 54, 63, 67, 70, 74, 76, 72, 66, 61, 54, 44, 37, 36, + 34, 24, 8, -3, -4, -2, 0, 2, 3, -1, -5, -3, 2, -2, -16, -29, + -36, -44, -57, -70, -79, -76, -60, -41, -27, -19, -14, -8, -1, 3, 0, -10, + -24, -33, -33, -32, -40, -55, -65, -63, -56, -51, -48, -40, -23, -1, 12, 7, + -13, -32, -37, -29, -21, -21, -28, -29, -19, -6, -2, -12, -20, -14, 0, 11, + 16, 22, 30, 37, 38, 33, 21, 7, 0, 9, 26, 36, 35, 32, 32, 32, + 31, 28, 27, 30, 38, 50, 58, 63, 70, 78, 79, 76, 74, 72, 64, 53, + 46, 45, 44, 34, 20, 9, 3, -1, 1, 7, 7, 0, -4, 2, 8, 5, + -5, -15, -23, -30, -41, -58, -73, -77, -68, -53, -38, -28, -21, -14, -5, 4, + 7, -1, -15, -25, -25, -24, -32, -48, -59, -61, -59, -57, -57, -54, -39, -16, + 4, 8, -5, -24, -33, -30, -24, -24, -32, -35, -26, -11, -6, -14, -20, -19, + -10, -2, 5, 13, 21, 29, 37, 40, 30, 11, 0, 4, 17, 27, 30, 31, + 31, 32, 32, 29, 23, 23, 31, 40, 45, 52, 63, 72, 74, 73, 75, 75, + 67, 56, 51, 50, 46, 38, 29, 18, 6, -3, -1, 5, 3, -4, -7, -2, + 4, 5, -2, -11, -17, -21, -30, -47, -66, -78, -77, -66, -53, -42, -34, -27, + -16, -3, 6, 1, -12, -21, -21, -21, -28, -42, -54, -60, -60, -61, -65, -67, + -57, -35, -11, 1, -3, -18, -30, -30, -25, -27, -36, -41, -32, -19, -13, -17, + -22, -22, -19, -14, -6, 2, 7, 17, 31, 41, 34, 17, 3, 1, 8, 17, + 23, 25, 26, 30, 32, 28, 22, 21, 25, 30, 34, 42, 54, 63, 66, 70, + 77, 77, 69, 61, 57, 55, 49, 44, 39, 28, 11, 2, 2, 5, 3, -3, + -8, -4, 3, 6, 2, -4, -9, -11, -16, -31, -52, -68, -75, -71, -61, -50, + -43, -38, -26, -8, 5, 4, -6, -13, -14, -13, -19, -31, -44, -51, -52, -55, + -64, -71, -67, -49, -24, -4, -1, -12, -22, -21, -18, -22, -33, -39, -33, -22, + -16, -16, -17, -19, -20, -16, -9, -4, -2, 5, 18, 31, 37, 32, 21, 11, + 9, 12, 17, 20, 24, 28, 32, 31, 28, 26, 26, 26, 28, 34, 43, 51, + 57, 65, 74, 77, 75, 72, 68, 63, 59, 56, 53, 44, 31, 19, 12, 11, + 8, 3, -2, -3, 0, 4, 5, 2, 0, -1, -3, -11, -25, -42, -58, -66, + -65, -59, -54, -51, -42, -27, -11, -2, -3, -6, -7, -7, -9, -16, -27, -36, + -40, -44, -52, -63, -70, -66, -49, -28, -15, -13, -16, -16, -13, -16, -24, -31, + -33, -29, -24, -19, -17, -19, -20, -18, -14, -13, -12, -6, 7, 22, 33, 35, + 28, 18, 12, 12, 14, 17, 21, 27, 31, 31, 30, 30, 28, 25, 25, 30, + 36, 42, 49, 58, 67, 74, 76, 75, 71, 66, 62, 60, 59, 53, 41, 29, + 19, 14, 11, 7, 1, -3, -2, 1, 3, 3, 1, 0, 0, -3, -11, -26, + -44, -59, -65, -63, -60, -57, -52, -41, -25, -11, -4, -4, -6, -6, -6, -9, + -17, -27, -35, -39, -44, -53, -65, -71, -65, -47, -28, -16, -15, -16, -15, -14, + -17, -25, -32, -33, -29, -24, -19, -17, -19, -20, -18, -14, -13, -12, -6, -2, + 1, 6, 5, 21, 46, 42, 15, 0, 5, 34, 48, 29, -4, -31, -33, -17, + 26, 49, 32, 0, -21, -15, 14, 24, 24, 16, 0, 3, 11, 11, 11, 5, + 9, 9, 8, 11, 30, 27, 22, 7, -3, -3, 10, 2, -2, -4, -13, -4, + -4, -2, -2, -3, -7, -6, -14, -15, -14, -14, -13, -3, -14, -16, -18, -13, + -15, -16, -22, -20, -14, -3, -6, -4, -14, -11, -6, -10, -15, -15, -16, -9, + -10, -19, -3, -5, -17, -15, -18, -16, -14, -14, -12, -15, -7, -22, -19, -17, + -20, -11, -17, -14, -11, -8, -10, -13, -12, -11, -6, -6, -9, 1, 1, -3, + 0, 6, -2, -9, 7, -8, 8, 4, 3, 1, -6, -2, -2, 2, -5, -7, + -4, -7, -8, -9, -6, -6, 0, -8, -12, -12, -13, -8, -4, -7, -3, -11, + -6, -15, -7, -9, -9, -3, -10, -8, -9, -15, -10, -2, 2, -7, -16, -17, + -15, -13, -9, -6, -5, -7, -9, -15, -17, -12, -19, -12, -8, -8, -4, -6, + -3, 0, -4, -11, -13, -7, -6, -2, 4, 4, 8, 10, 4, 3, 3, 4, + 7, 12, 11, 14, 15, 20, 20, 18, 16, 17, 15, 14, 15, 22, 23, 28, + 34, 29, 28, 17, 22, 24, 23, 25, 28, 28, 30, 24, 19, 16, 13, 18, + 20, 15, 8, 2, 3, 0, 2, 0, -3, -2, -9, -20, -23, -25, -24, -23, + -27, -33, -38, -39, -44, -36, -42, -44, -48, -53, -54, -56, -52, -50, -40, -35, + -44, -43, -44, -39, -28, -24, -23, -22, -15, -9, 2, 11, 19, 28, 31, 31, + 32, 35, 43, 61, 70, 78, 81, 73, 78, 78, 78, 85, 82, 85, 88, 87, + 84, 83, 83, 79, 74, 62, 49, 45, 42, 43, 44, 38, 30, 18, 6, -5, + -15, -17, -15, -22, -28, -38, -46, -48, -50, -58, -59, -72, -80, -83, -89, -88, + -89, -87, -81, -84, -93, -105, -110, -109, -110, -102, -96, -82, -65, -62, -60, -60, + -60, -51, -43, -37, -28, -16, 1, 15, 28, 35, 41, 46, 53, 56, 60, 66, + 77, 91, 101, 102, 101, 99, 104, 103, 97, 91, 86, 90, 91, 86, 85, 79, + 75, 71, 59, 48, 39, 35, 33, 32, 28, 22, 15, 13, 7, 3, -7, -15, + -16, -18, -19, -23, -28, -29, -33, -37, -47, -52, -56, -63, -61, -70, -67, -70, + -72, -72, -80, -93, -91, -99, -103, -96, -108, -105, -109, -112, -94, -81, -73, -67, + -71, -77, -69, -63, -57, -38, -27, -15, 0, 4, 6, 19, 26, 41, 53, 49, + 56, 58, 69, 84, 91, 95, 101, 103, 98, 93, 85, 87, 102, 102, 103, 95, + 81, 78, 78, 71, 66, 60, 51, 50, 44, 39, 34, 34, 32, 27, 15, 0, + -6, -8, -3, -3, -11, -10, -18, -21, -26, -35, -39, -38, -44, -48, -53, -63, + -61, -61, -71, -63, -86, -89, -86, -107, -99, -109, -108, -109, -108, -121, -128, -105, + -102, -83, -67, -88, -82, -76, -78, -62, -47, -41, -19, -6, 1, 7, 13, 33, + 44, 64, 61, 59, 68, 73, 93, 98, 107, 114, 109, 123, 107, 100, 105, 100, + 111, 117, 100, 93, 92, 86, 85, 80, 70, 59, 58, 47, 38, 41, 33, 40, + 38, 25, 16, 1, -2, -3, -3, -4, -10, -16, -12, -21, -28, -28, -36, -38, + -39, -52, -61, -61, -67, -63, -65, -76, -77, -86, -95, -95, -107, -109, -112, -112, + -121, -121, -122, -105, -79, -80, -71, -80, -84, -73, -70, -56, -43, -28, -10, 6, + 11, 17, 31, 43, 63, 69, 69, 65, 77, 88, 101, 113, 112, 127, 122, 122, + 115, 104, 112, 116, 122, 117, 106, 99, 97, 96, 94, 86, 75, 70, 61, 53, + 44, 41, 46, 47, 45, 28, 19, 9, 5, 9, 1, -8, -14, -20, -24, -26, + -28, -29, -36, -39, -42, -45, -41, -42, -45, -46, -49, -47, -50, -55, -53, -61, + -63, -67, -83, -78, -89, -91, -88, -100, -93, -108, -110, -110, -115, -90, -100, -91, + -80, -91, -73, -62, -60, -41, -33, -36, -25, -16, -9, 8, 18, 35, 40, 57, + 61, 66, 95, 94, 106, 114, 105, 117, 111, 117, 118, 115, 120, 111, 109, 111, + 104, 102, 106, 93, 88, 76, 66, 63, 52, 53, 31, 27, 25, 5, 12, 1, + -5, 0, -15, -17, -23, -27, -27, -31, -31, -37, -44, -41, -43, -43, -35, -45, + -43, -41, -50, -49, -51, -57, -58, -62, -72, -76, -79, -81, -82, -86, -92, -94, + -100, -109, -110, -102, -99, -96, -83, -96, -83, -67, -73, -45, -41, -42, -27, -27, + -19, -5, 7, 14, 30, 44, 46, 57, 75, 84, 98, 108, 102, 112, 114, 110, + 120, 115, 116, 117, 108, 112, 107, 104, 108, 99, 96, 90, 73, 69, 66, 57, + 48, 36, 26, 18, 13, 6, -3, 3, -8, -14, -15, -26, -25, -26, -33, -33, + -40, -45, -45, -45, -42, -43, -44, -45, -48, -46, -55, -57, -58, -62, -67, -73, + -78, -80, -81, -82, -89, -93, -99, -106, -108, -115, -100, -95, -103, -77, -91, -85, + -59, -63, -48, -32, -36, -33, -18, -14, -6, 11, 21, 27, 47, 55, 56, 81, + 92, 96, 114, 106, 111, 116, 110, 121, 113, 115, 115, 105, 111, 106, 101, 103, + 100, 92, 84, 74, 66, 60, 58, 43, 29, 29, 13, 9, 10, -6, -2, -6, + -16, -18, -22, -27, -30, -30, -35, -44, -43, -46, -46, -42, -44, -48, -45, -46, + -50, -54, -51, -61, -63, -61, -85, -76, -80, -94, -75, -98, -97, -93, -111, -103, + -106, -97, -97, -90, -79, -93, -73, -64, -67, -39, -38, -41, -20, -20, -12, 11, + 10, 30, 40, 48, 62, 62, 85, 91, 99, 111, 101, 112, 111, 113, 120, 112, + 119, 111, 108, 114, 101, 102, 104, 89, 91, 79, 63, 67, 56, 52, 41, 29, + 26, 12, 14, 3, -5, 1, -14, -15, -19, -27, -24, -30, -31, -34, -43, -43, + -45, -48, -40, -48, -48, -45, -51, -49, -53, -56, -57, -63, -69, -76, -86, -80, + -86, -90, -87, -98, -101, -101, -108, -103, -88, -96, -88, -77, -89, -70, -60, -56, + -39, -34, -30, -26, -11, -4, 6, 26, 27, 42, 54, 57, 72, 86, 95, 105, + 107, 108, 112, 109, 116, 118, 112, 117, 108, 109, 107, 104, 103, 99, 97, 83, + 77, 71, 57, 60, 49, 35, 30, 21, 11, 11, 4, -2, -3, -13, -17, -22, + -24, -28, -29, -29, -39, -39, -44, -44, -41, -45, -44, -50, -49, -49, -56, -50, + -60, -62, -55, -82, -70, -82, -90, -80, -95, -95, -100, -105, -112, -112, -93, -102, + -91, -81, -91, -77, -60, -65, -45, -33, -40, -25, -21, -14, 5, 10, 30, 35, + 49, 61, 61, 87, 94, 102, 109, 109, 112, 112, 116, 117, 116, 118, 116, 106, + 113, 108, 101, 110, 96, 91, 84, 69, 66, 58, 54, 38, 29, 26, 12, 11, + 6, -2, -2, -8, -16, -20, -23, -27, -28, -33, -34, -44, -43, -43, -47, -39, + -44, -47, -43, -47, -49, -50, -52, -57, -58, -68, -75, -76, -83, -86, -86, -91, + -97, -98, -103, -109, -102, -91, -99, -84, -81, -93, -65, -66, -60, -37, -42, -33, + -25, -18, -9, 6, 16, 28, 41, 49, 57, 68, 84, 93, 102, 106, 106, 110, + 107, 116, 114, 111, 119, 106, 111, 108, 101, 104, 99, 94, 85, 76, 68, 61, + 56, 49, 34, 28, 21, 10, 10, 2, -3, -3, -13, -15, -24, -26, -28, -34, + -31, -42, -45, -43, -48, -44, -43, -47, -47, -47, -48, -51, -57, -57, -63, -70, + -72, -80, -86, -81, -92, -88, -96, -103, -100, -113, -110, -96, -101, -96, -79, -91, + -82, -59, -68, -47, -34, -39, -29, -18, -13, -5, 18, 22, 32, 54, 52, 64, + 83, 90, 100, 108, 109, 110, 113, 113, 116, 113, 117, 113, 106, 111, 103, 100, + 101, 98, 86, 82, 73, 59, 61, 53, 36, 34, 24, 12, 10, 5, -5, -3, + -8, -17, -18, -24, -27, -29, -30, -35, -40, -41, -45, -43, -43, -42, -45, -46, + -44, -50, -49, -55, -58, -55, -71, -70, -79, -87, -77, -92, -88, -95, -104, -100, + -115, -107, -91, -105, -85, -83, -97, -67, -68, -65, -37, -43, -33, -29, -21, -9, + 0, 18, 23, 35, 55, 48, 69, 87, 86, 108, 107, 103, 117, 106, 117, 118, + 113, 122, 109, 111, 111, 102, 110, 101, 98, 92, 77, 73, 62, 59, 54, 34, + 34, 21, 11, 15, 2, 2, 2, -14, -12, -23, -26, -26, -33, -30, -40, -44, + -42, -49, -41, -41, -44, -43, -46, -49, -51, -59, -54, -63, -67, -64, -84, -79, + -76, -91, -82, -87, -100, -100, -101, -118, -101, -89, -107, -81, -82, -93, -65, -57, + -57, -36, -26, -39, -17, -9, -13, 14, 21, 26, 45, 53, 54, 76, 88, 95, + 111, 106, 111, 114, 109, 120, 115, 115, 116, 110, 105, 109, 104, 98, 105, 94, + 83, 81, 68, 60, 62, 49, 32, 33, 18, 9, 12, 0, -3, -3, -13, -18, + -20, -24, -27, -26, -31, -37, -40, -42, -42, -43, -42, -44, -48, -48, -47, -51, + -54, -52, -56, -64, -68, -75, -84, -79, -89, -91, -93, -104, -105, -110, -114, -97, + -97, -96, -78, -89, -81, -58, -66, -47, -34, -40, -31, -23, -14, -6, 14, 22, + 31, 54, 55, 63, 87, 91, 103, 113, 105, 111, 113, 109, 119, 112, 117, 114, + 106, 113, 106, 105, 105, 99, 93, 81, 74, 61, 58, 55, 36, 30, 25, 10, + 11, 6, -5, 1, -8, -16, -19, -25, -27, -32, -32, -37, -44, -41, -47, -43, + -39, -43, -44, -45, -46, -46, -56, -53, -55, -72, -64, -74, -91, -72, -88, -97, + -80, -100, -105, -100, -111, -111, -88, -100, -99, -74, -97, -79, -54, -68, -43, -32, + -41, -26, -10, -16, 6, 22, 19, 41, 51, 49, 69, 86, 88, 103, 107, 100, + 119, 110, 111, 125, 110, 115, 115, 104, 108, 106, 99, 98, 98, 82, 76, 71, + 60, 60, 52, 34, 30, 25, 9, 11, 3, -6, 0, -15, -18, -21, -27, -27, + -30, -31, -38, -39, -43, -43, -39, -43, -44, -46, -47, -47, -54, -53, -59, -58, + -65, -71, -75, -81, -75, -90, -83, -90, -100, -95, -111, -109, -101, -97, -100, -84, + -86, -89, -62, -64, -50, -34, -37, -30, -21, -11, -8, 10, 19, 26, 47, 49, + 59, 76, 89, 99, 107, 109, 110, 115, 113, 119, 115, 114, 115, 106, 111, 103, + 103, 101, 98, 94, 81, 78, 65, 63, 59, 43, 34, 25, 17, 10, 7, -4, + -3, -6, -14, -16, -23, -24, -28, -29, -33, -41, -41, -46, -43, -40, -44, -44, + -46, -46, -47, -50, -54, -56, -58, -69, -70, -76, -83, -75, -87, -87, -91, -100, + -100, -109, -108, -97, -98, -93, -83, -88, -76, -61, -59, -43, -36, -33, -28, -18, + -11, -4, 14, 21, 31, 52, 51, 63, 84, 90, 101, 111, 104, 113, 113, 111, + 118, 112, 114, 109, 108, 109, 102, 106, 101, 98, 94, 79, 74, 66, 58, 55, + 39, 29, 24, 13, 11, 5, -4, 0, -10, -15, -17, -24, -25, -28, -29, -34, + -41, -41, -47, -42, -44, -46, -45, -50, -45, -50, -55, -48, -60, -60, -65, -76, + -77, -83, -84, -91, -92, -94, -106, -103, -109, -106, -89, -101, -82, -81, -88, -63, + -66, -54, -36, -40, -31, -25, -16, -7, 6, 17, 30, 41, 55, 56, 73, 89, + 92, 109, 104, 106, 114, 104, 117, 113, 110, 116, 105, 108, 106, 100, 102, 98, + 94, 85, 74, 67, 59, 55, 48, 31, 28, 19, 10, 12, 0, 2, -2, -11, + -11, -21, -21, -26, -30, -30, -40, -43, -43, -44, -40, -39, -41, -43, -42, -46, + -52, -52, -58, -63, -65, -75, -79, -83, -80, -89, -85, -88, -101, -94, -104, -114, + -93, -97, -104, -78, -92, -89, -60, -68, -48, -36, -36, -26, -21, -8, -5, 12, + 23, 26, 47, 50, 54, 77, 85, 96, 109, 102, 114, 112, 109, 125, 112, 114, + 118, 102, 110, 103, 99, 101, 96, 92, 79, 76, 66, 59, 61, 43, 32, 31, + 14, 10, 9, -5, -2, -9, -17, -18, -28, -25, -31, -31, -31, -42, -38, -43, + -41, -39, -43, -44, -47, -45, -48, -51, -53, -54, -61, -64, -67, -77, -76, -82, + -81, -89, -93, -97, -106, -108, -105, -96, -99, -88, -82, -92, -67, -64, -60, -38, + -38, -36, -24, -20, -16, 4, 11, 21, 36, 46, 53, 66, 85, 88, 103, 108, + 102, 115, 107, 112, 115, 109, 114, 104, 106, 106, 99, 102, 101, 92, 89, 81, + 67, 66, 58, 47, 39, 28, 21, 11, 12, 2, -2, 2, -12, -12, -17, -25, + -24, -29, -30, -36, -39, -41, -41, -41, -39, -41, -44, -44, -47, -51, -52, -54, + -59, -63, -65, -75, -79, -75, -90, -81, -89, -99, -92, -109, -109, -105, -99, -97, + -92, -80, -90, -71, -58, -60, -37, -32, -37, -19, -15, -14, 9, 14, 23, 42, + 46, 56, 67, 83, 96, 100, 111, 106, 111, 114, 111, 117, 111, 112, 109, 103, + 107, 100, 99, 103, 92, 88, 82, 65, 66, 59, 48, 39, 27, 22, 12, 9, + 5, -5, 0, -12, -16, -17, -26, -25, -26, -31, -34, -40, -41, -41, -41, -40, + -42, -47, -43, -46, -46, -52, -50, -52, -61, -59, -74, -75, -77, -83, -84, -91, + -92, -105, -100, -106, -109, -81, -103, -86, -73, -96, -64, -62, -59, -38, -39, -36, + -28, -15, -11, 3, 18, 25, 37, 53, 53, 67, 89, 85, 106, 103, 98, 115, + 99, 114, 115, 103, 116, 103, 104, 109, 98, 101, 98, 91, 84, 75, 67, 60, + 55, 50, 31, 28, 20, 7, 15, 0, -3, 2, -15, -12, -19, -25, -24, -32, + -32, -38, -44, -44, -45, -42, -41, -44, -43, -46, -44, -44, -58, -48, -63, -67, + -63, -87, -75, -83, -90, -81, -94, -95, -95, -107, -109, -99, -95, -99, -85, -85, + -90, -68, -62, -60, -36, -34, -39, -15, -13, -9, 14, 15, 29, 42, 50, 55, + 68, 87, 91, 101, 107, 106, 110, 113, 114, 115, 114, 112, 108, 105, 106, 98, + 98, 100, 88, 84, 75, 63, 63, 57, 46, 34, 28, 18, 10, 8, 0, -5, + -5, -15, -19, -20, -26, -26, -26, -31, -36, -40, -42, -43, -42, -39, -44, -44, + -42, -44, -47, -51, -52, -54, -65, -63, -76, -81, -68, -93, -84, -85, -104, -92, + -105, -109, -95, -95, -96, -84, -82, -84, -64, -64, -52, -39, -37, -33, -23, -11, + -9, 10, 20, 25, 49, 46, 60, 76, 82, 98, 101, 104, 110, 108, 108, 116, + 111, 111, 113, 104, 108, 106, 101, 98, 99, 92, 80, 79, 63, 61, 59, 41, + 35, 27, 18, 13, 9, 2, 0, -5, -12, -15, -20, -22, -26, -27, -30, -38, + -39, -42, -40, -39, -40, -40, -45, -43, -47, -49, -54, -53, -57, -70, -59, -80, + -77, -72, -93, -75, -91, -99, -93, -105, -108, -97, -92, -99, -80, -84, -84, -61, + -59, -49, -35, -28, -34, -14, -9, -10, 19, 17, 27, 47, 47, 61, 72, 87, + 95, 105, 104, 110, 111, 109, 117, 109, 111, 109, 103, 103, 102, 97, 95, 100, + 85, 81, 77, 61, 64, 55, 42, 34, 26, 17, 10, 9, -3, -2, -5, -13, + -15, -20, -23, -27, -27, -32, -37, -38, -41, -40, -41, -39, -43, -43, -40, -48, + -47, -49, -55, -61, -59, -70, -80, -69, -87, -83, -79, -97, -89, -98, -101, -107, + -96, -93, -101, -77, -90, -84, -62, -63, -49, -36, -34, -30, -15, -12, -2, 11, + 20, 32, 39, 53, 56, 71, 87, 89, 103, 101, 109, 109, 109, 118, 106, 114, + 111, 101, 107, 102, 93, 99, 94, 84, 85, 71, 65, 62, 54, 45, 32, 30, + 16, 12, 8, -5, -2, -9, -14, -16, -24, -22, -27, -29, -31, -38, -41, -38, + -44, -42, -41, -47, -45, -44, -48, -50, -50, -52, -62, -57, -69, -79, -69, -83, + -88, -78, -99, -97, -92, -109, -106, -91, -100, -93, -76, -91, -80, -60, -66, -48, + -37, -38, -32, -18, -15, -4, 11, 14, 31, 42, 48, 60, 69, 85, 94, 96, + 102, 107, 103, 109, 115, 104, 112, 109, 100, 106, 103, 95, 97, 96, 84, 82, + 73, 60, 62, 54, 41, 33, 27, 17, 14, 7, 0, 0, -8, -11, -16, -23, + -23, -29, -29, -32, -39, -40, -40, -40, -41, -40, -46, -48, -45, -50, -51, -54, + -56, -64, -63, -71, -78, -73, -84, -82, -87, -95, -93, -102, -102, -108, -95, -96, + -95, -76, -90, -77, -57, -61, -42, -33, -35, -26, -13, -14, 3, 15, 17, 36, + 45, 54, 60, 80, 89, 96, 108, 101, 111, 110, 109, 118, 107, 110, 109, 102, + 103, 103, 95, 97, 96, 83, 82, 70, 60, 61, 51, 38, 28, 23, 11, 8, + 4, -7, -3, -10, -16, -17, -22, -25, -27, -29, -35, -38, -43, -42, -41, -40, + -39, -43, -42, -44, -45, -46, -53, -51, -55, -68, -65, -75, -79, -77, -88, -83, + -94, -93, -101, -105, -96, -96, -92, -85, -85, -83, -71, -64, -57, -41, -41, -31, + -27, -17, -7, 2, 18, 23, 38, 48, 51, 68, 78, 91, 98, 102, 106, 108, + 110, 112, 115, 110, 115, 107, 107, 108, 99, 102, 97, 94, 87, 76, 70, 63, + 60, 49, 39, 30, 22, 16, 8, 4, 0, -4, -10, -14, -20, -24, -25, -31, + -30, -37, -41, -40, -41, -38, -39, -40, -42, -41, -43, -48, -44, -55, -58, -57, + -71, -71, -73, -78, -79, -80, -88, -89, -95, -99, -103, -101, -88, -98, -85, -79, + -90, -62, -60, -54, -35, -35, -27, -21, -9, -3, 7, 22, 26, 38, 52, 54, + 67, 87, 89, 101, 105, 103, 114, 107, 117, 112, 107, 116, 100, 105, 103, 94, + 98, 93, 87, 80, 73, 65, 59, 56, 45, 31, 28, 19, 6, 10, -3, -5, + -4, -17, -16, -22, -24, -25, -30, -28, -39, -37, -40, -44, -40, -44, -46, -46, + -47, -51, -50, -55, -55, -60, -67, -65, -81, -75, -78, -93, -78, -97, -101, -94, + -113, -104, -92, -96, -91, -79, -86, -79, -58, -58, -49, -34, -34, -33, -14, -12, + -5, 20, 19, 34, 49, 49, 66, 76, 91, 98, 98, 105, 104, 107, 111, 110, + 109, 108, 108, 103, 101, 102, 97, 95, 96, 80, 75, 71, 56, 58, 49, 33, + 28, 20, 13, 7, 4, -4, -7, -9, -18, -22, -22, -28, -30, -30, -38, -41, + -41, -43, -40, -41, -40, -44, -43, -45, -48, -49, -55, -55, -59, -67, -66, -82, + -70, -81, -86, -78, -101, -92, -98, -111, -98, -95, -95, -89, -76, -91, -70, -56, + -61, -38, -34, -33, -25, -12, -10, 1, 21, 15, 39, 47, 48, 68, 75, 90, + 97, 101, 103, 106, 106, 110, 111, 104, 111, 101, 99, 103, 96, 94, 95, 92, + 75, 79, 64, 55, 64, 43, 36, 30, 17, 13, 9, 3, -4, -3, -12, -16, + -18, -23, -25, -26, -29, -35, -38, -42, -40, -39, -41, -38, -48, -42, -45, -50, + -49, -52, -57, -63, -57, -78, -76, -67, -94, -75, -88, -100, -92, -103, -106, -97, + -88, -96, -81, -77, -85, -60, -55, -51, -35, -30, -33, -19, -9, -10, 17, 16, + 30, 46, 48, 64, 72, 86, 96, 101, 104, 105, 111, 104, 116, 109, 107, 110, + 104, 101, 104, 100, 93, 100, 86, 77, 78, 59, 60, 54, 40, 32, 23, 18, + 9, 9, 0, -5, -6, -14, -17, -20, -23, -25, -26, -31, -35, -39, -40, -36, + -40, -37, -40, -45, -42, -45, -48, -51, -50, -57, -64, -62, -76, -78, -71, -90, + -84, -88, -101, -97, -105, -108, -94, -97, -92, -81, -87, -76, -63, -58, -42, -36, + -33, -27, -15, -10, -2, 18, 19, 34, 49, 47, 66, 78, 86, 102, 104, 104, + 111, 109, 112, 115, 112, 110, 108, 106, 101, 102, 98, 96, 97, 86, 79, 72, + 62, 61, 51, 39, 32, 20, 15, 10, 2, 1, -4, -9, -13, -18, -22, -24, + -25, -29, -33, -37, -41, -39, -37, -39, -39, -43, -46, -46, -49, -49, -56, -54, + -57, -68, -66, -73, -77, -79, -83, -90, -96, -95, -107, -110, -98, -97, -98, -76, + -87, -83, -56, -68, -49, -34, -43, -28, -26, -18, -8, 3, 14, 22, 39, 47, + 54, 70, 83, 90, 101, 100, 104, 107, 102, 113, 103, 106, 109, 95, 106, 99, + 95, 101, 92, 93, 83, 74, 66, 60, 56, 44, 33, 26, 17, 12, 8, 1, + 2, -4, -11, -10, -21, -19, -25, -29, -28, -39, -38, -41, -41, -37, -40, -42, + -43, -42, -45, -47, -48, -56, -52, -59, -69, -67, -78, -78, -79, -88, -86, -95, + -100, -99, -112, -95, -92, -101, -77, -86, -86, -62, -65, -51, -39, -35, -31, -26, + -8, -11, 7, 26, 21, 45, 53, 50, 76, 86, 90, 105, 102, 105, 109, 108, + 115, 107, 112, 110, 100, 108, 100, 96, 100, 93, 89, 79, 72, 64, 58, 56, + 42, 31, 28, 14, 10, 9, -5, -2, -6, -14, -15, -22, -22, -27, -28, -31, + -41, -37, -41, -42, -37, -41, -45, -43, -45, -47, -48, -49, -58, -53, -64, -71, + -68, -82, -75, -83, -91, -87, -103, -97, -104, -111, -90, -98, -95, -77, -91, -76, + -61, -63, -43, -41, -35, -29, -23, -7, -7, 13, 22, 24, 50, 50, 59, 82, + 82, 99, 102, 100, 110, 105, 111, 113, 104, 114, 103, 104, 107, 96, 102, 97, + 92, 90, 77, 73, 64, 58, 53, 38, 31, 23, 13, 12, 3, 0, -2, -11, + -10, -17, -21, -20, -29, -27, -33, -40, -38, -44, -39, -39, -43, -41, -42, -42, + -46, -42, -53, -53, -52, -71, -67, -73, -83, -80, -81, -89, -93, -91, -100, -106, + -97, -96, -93, -88, -81, -85, -79, -59, -58, -48, -30, -36, -28, -11, -9, -2, + 21, 22, 32, 50, 52, 58, 79, 89, 90, 104, 104, 100, 113, 111, 109, 114, + 109, 107, 103, 104, 99, 94, 97, 91, 78, 79, 65, 58, 61, 47, 37, 30, + 23, 14, 10, 7, -7, -4, -8, -21, -17, -23, -30, -26, -30, -36, -37, -39, + -38, -38, -36, -38, -45, -41, -45, -49, -51, -56, -57, -63, -64, -69, -78, -70, + -80, -84, -84, -91, -100, -98, -106, -108, -90, -103, -90, -80, -93, -65, -64, -52, + -38, -37, -27, -26, -12, -6, 3, 18, 22, 36, 48, 54, 69, 84, 89, 105, + 103, 106, 117, 105, 117, 113, 106, 113, 101, 105, 101, 99, 98, 93, 94, 83, + 75, 70, 60, 55, 49, 33, 27, 19, 10, 8, -2, -2, -7, -13, -12, -22, + -20, -23, -28, -28, -35, -39, -40, -41, -40, -42, -40, -43, -42, -42, -44, -46, + -49, -52, -59, -60, -70, -74, -71, -84, -82, -88, -96, -98, -100, -105, -102, -88, + -95, -83, -79, -87, -62, -62, -52, -40, -39, -31, -27, -14, -10, 7, 17, 25, + 42, 49, 59, 72, 85, 92, 103, 103, 102, 111, 104, 113, 110, 104, 112, 102, + 107, 103, 101, 99, 97, 92, 81, 76, 64, 61, 54, 42, 33, 24, 17, 11, + 8, -2, -2, -5, -13, -12, -22, -23, -26, -31, -32, -38, -40, -43, -39, -40, + -41, -40, -44, -41, -44, -47, -51, -49, -62, -55, -68, -78, -68, -89, -79, -81, + -96, -85, -101, -100, -103, -98, -91, -97, -79, -83, -87, -61, -64, -55, -31, -41, + -29, -15, -19, 3, 9, 18, 33, 36, 56, 54, 71, 87, 87, 103, 103, 103, + 110, 107, 113, 112, 108, 111, 101, 104, 103, 92, 101, 92, 84, 84, 66, 65, + 59, 51, 45, 31, 27, 16, 10, 6, -3, -3, -9, -15, -16, -22, -24, -25, + -30, -28, -36, -40, -36, -42, -38, -41, -45, -44, -47, -47, -49, -51, -52, -54, + -62, -68, -73, -78, -81, -84, -83, -97, -94, -101, -113, -100, -99, -96, -87, -83, + -85, -75, -60, -60, -43, -36, -38, -27, -20, -15, 0, 14, 19, 33, 47, 49, + 67, 78, 90, 100, 103, 105, 107, 108, 110, 112, 109, 109, 107, 102, 105, 100, + 99, 98, 95, 84, 80, 69, 59, 60, 48, 36, 31, 18, 14, 9, 3, -2, + -5, -10, -15, -19, -24, -25, -28, -31, -34, -39, -41, -40, -38, -40, -38, -43, + -43, -42, -48, -47, -53, -54, -58, -67, -63, -79, -73, -78, -90, -80, -98, -97, + -101, -109, -105, -93, -98, -90, -76, -93, -66, -60, -59, -33, -42, -32, -26, -18, + -9, 0, 17, 21, 38, 48, 53, 69, 82, 93, 101, 107, 102, 112, 108, 111, + 115, 105, 112, 103, 105, 104, 96, 103, 95, 95, 85, 76, 68, 63, 59, 47, + 38, 26, 19, 13, 7, 1, -3, -4, -14, -12, -19, -23, -21, -29, -29, -35, + -40, -41, -42, -39, -43, -42, -46, -43, -47, -45, -48, -54, -47, -66, -61, -68, + -85, -66, -90, -84, -84, -103, -91, -106, -105, -96, -90, -92, -81, -79, -86, -59, + -59, -53, -34, -36, -33, -19, -10, -10, 17, 20, 26, 52, 48, 60, 75, 85, + 95, 102, 104, 102, 111, 107, 113, 110, 109, 111, 103, 107, 102, 97, 96, 95, + 85, 77, 73, 56, 60, 52, 37, 33, 22, 16, 11, 7, -3, -4, -6, -16, + -14, -21, -24, -24, -28, -32, -37, -38, -42, -36, -37, -39, -39, -43, -40, -42, + -48, -50, -50, -64, -57, -70, -84, -63, -90, -81, -77, -101, -85, -99, -105, -102, + -100, -92, -99, -79, -89, -86, -58, -65, -49, -29, -41, -26, -11, -19, 6, 12, + 14, 39, 37, 52, 60, 68, 90, 90, 104, 102, 106, 111, 108, 118, 109, 109, + 111, 98, 106, 101, 90, 101, 90, 82, 86, 63, 65, 63, 48, 47, 29, 25, + 16, 10, 6, -6, -3, -13, -18, -16, -26, -25, -25, -32, -30, -39, -43, -37, + -43, -39, -39, -48, -44, -46, -53, -50, -56, -59, -59, -67, -72, -77, -76, -84, + -83, -84, -100, -95, -103, -115, -98, -93, -103, -82, -82, -91, -60, -62, -54, -34, + -35, -31, -23, -13, -11, 7, 19, 21, 43, 48, 55, 73, 85, 94, 104, 102, + 109, 110, 105, 118, 107, 109, 113, 98, 106, 103, 96, 99, 98, 90, 82, 79, + 62, 62, 58, 41, 34, 26, 14, 10, 8, -3, -2, -5, -14, -13, -20, -20, + -24, -26, -28, -38, -39, -42, -42, -41, -41, -42, -48, -41, -43, -50, -41, -49, + -59, -50, -68, -74, -67, -82, -80, -89, -87, -101, -101, -93, -121, -85, -90, -105, + -65, -93, -82, -55, -69, -49, -38, -46, -32, -27, -19, -5, 3, 19, 26, 41, + 53, 52, 81, 81, 95, 104, 90, 113, 101, 105, 118, 99, 113, 109, 100, 109, + 104, 98, 104, 96, 89, 83, 71, 66, 57, 56, 38, 28, 29, 8, 17, 6, + -2, 3, -24, -13, -79, -103, -120, -116, -104, -87, -76, -63, 63, 82, 97, 108, + 119, 99, 70, 69, 80, 91, 92, 98, 115, 124, 127, 113, 82, 42, 4, -44, + -70, -82, -100, -87, -62, -58, -71, -65, -79, -60, -102, -113, -62, -44, -31, -31, + -22, -18, -3, 4, 11, 20, 28, 11, 15, 18, 27, 18, 7, 13, 26, 11, + -19, -69, -108, -84, -51, -21, -3, -6, -18, -17, -31, -33, -18, 2, 4, 26, + 47, 48, 77, 117, 127, 127, 127, 121, 110, 86, 72, 62, 46, 11, 17, -2, + -7, -13, -44, -60, -61, -61, -63, -72, -79, -99, -116, -127, -128, -128, -124, -81, + -51, -4, 5, -6, 7, 8, 9, 31, 31, 16, 34, 28, 34, 34, 46, 78, + 84, 93, 69, 47, 40, 64, 44, 27, 22, 0, -29, -8, 15, -6, -36, -66, + -68, -42, 0, 6, 1, 13, 24, 41, 64, 58, 50, 40, 4, 0, 3, -24, + -3, 21, 28, 26, 9, -30, -42, -61, -85, -92, -91, -96, -87, -74, -31, -20, + -38, -14, -44, -17, 18, -25, -9, 7, 1, 11, -2, -19, 12, 47, 76, 72, + 58, 68, 69, 82, 86, 76, 58, 9, -23, -12, -7, -22, -2, 0, -9, -2, + -15, -10, -3, -22, -17, -38, -44, -33, -24, -27, -16, 0, -15, 20, 19, 18, + 1, 10, 41, -1, -25, -25, -11, 30, 37, 9, 45, 37, -30, -30, 21, 5, + -26, -43, -56, -42, -48, -48, -29, -62, -76, -42, -23, -12, -14, 8, 45, 36, + 40, 25, 14, 11, 40, 46, 55, 65, 30, 17, 30, 36, 33, 18, 13, 16, + 15, 46, 37, 2, -1, -26, -36, -19, -21, -36, -62, -51, -48, -20, -2, 3, + -12, -12, -10, -35, -37, -49, -22, 14, 61, 40, 60, 75, 33, 41, 48, 38, + 29, -32, -45, -56, -64, -61, -30, -20, 30, 10, -46, -37, -35, -30, -24, -12, + -23, -34, -29, -22, -20, -14, 4, 44, 77, 49, 10, 8, 24, 20, 28, 31, + 27, 40, 35, 69, 39, 54, 38, 26, 22, 43, 36, 7, 14, 2, -25, -50, + -51, -56, -42, -55, -46, -36, -44, -36, -35, 1, 23, 11, -3, -34, -66, -33, + -12, -31, -27, -13, -1, 21, 31, 23, 0, -11, -3, -2, 9, 27, 5, -8, + -2, -17, -13, 10, 9, 3, 35, 32, 43, 24, 15, 2, -15, -9, -5, 2, + 5, 27, 25, 42, 76, 61, 17, 25, 14, -5, -17, -24, -6, 11, 23, 7, + -8, 5, -11, -23, -27, -48, -30, -12, -26, -36, -37, -39, -46, -61, -55, -23, + -20, -22, -14, -10, -16, -16, -22, -11, -3, -14, -34, -16, 9, 28, 25, 50, + 63, 52, 56, 46, 50, 54, 56, 45, 54, 29, 20, 21, 0, 0, 6, 16, + 28, 14, -1, -9, -10, -4, -9, -13, -7, -21, -27, -29, -40, -41, -35, -42, + -64, -11, 9, 2, -12, -24, -37, -40, -34, -29, -34, -12, -26, -20, -6, -4, + 5, 5, 27, 1, -17, 2, 21, 12, 8, 9, 15, 23, 24, 1, 5, 22, + 25, 28, 57, 55, 41, 33, 36, 27, 5, 1, 15, 34, 23, 4, 20, 18, + -1, -21, -22, -15, -17, -8, -6, -6, -12, -15, -26, 1, 29, -8, -40, -52, + -55, -19, -21, -36, -48, -56, -29, -15, -29, -39, -46, -35, -14, -11, -16, 1, + 27, 22, -10, -14, -7, -12, -12, 23, 55, 48, 65, 42, 20, 46, 45, 49, + 42, 38, 34, 25, 33, 21, 10, 38, 40, 26, 22, 37, 33, 12, 4, 7, + -14, -49, -41, -36, -53, -40, -35, -44, -31, -22, -19, -50, -78, -80, -78, -48, + -31, -18, -27, -28, -7, -17, -11, 5, 32, 39, 19, 14, 22, 34, 37, 23, + 20, 40, 40, 27, 14, 11, 7, 29, 34, 19, 32, 7, -15, -12, -24, -12, + 8, 6, 21, 34, 29, -6, -22, -15, 1, -1, 24, 27, 20, 36, 42, 45, + 27, -14, -50, -34, -14, -26, -25, -10, 10, -4, -28, -30, -34, -69, -91, -85, + -74, -51, -38, -24, -19, -9, -7, -30, -35, -30, -36, -12, 25, 32, 44, 50, + 45, 51, 68, 94, 90, 74, 60, 52, 64, 48, 30, 11, 11, 11, 2, 14, + 24, 16, 13, -7, -17, -9, -12, -20, -32, -45, -54, -58, -35, -23, -46, -51, + -33, -28, -29, -24, -36, -30, -24, -22, -20, -13, -9, -14, -7, 10, 26, 22, + 9, 9, 10, -2, -9, -15, -11, -1, 19, 27, 33, 28, 5, 3, 5, 6, + 10, 14, 24, 32, 36, 40, 41, 37, 19, 11, 3, -7, -10, -7, 6, 27, + 38, 28, 23, 16, 18, 15, -7, -33, -20, -13, -24, -25, -19, -15, -26, -52, + -56, -48, -41, -36, -30, -32, -30, -15, -38, -49, -47, -32, -17, -17, -11, -3, + 3, 8, 24, 28, 16, 6, 1, 7, 28, 41, 42, 69, 87, 78, 73, 62, + 30, 14, 9, 7, 15, 32, 20, 10, -8, -20, 2, 9, -2, 5, 12, -4, + -12, -19, -32, -37, -29, -24, -28, -39, -43, -40, -44, -28, -25, -33, -39, -37, + -34, -29, -28, -25, -19, -1, -5, -22, -12, 2, 6, 38, 46, 25, 30, 41, + 47, 37, 21, 7, -7, -8, 11, 39, 48, 43, 35, 27, 25, 22, -1, -22, + -11, 13, -4, -13, -3, -8, -7, -11, -17, -5, 5, 9, 8, 15, 25, 16, + 22, 20, 5, -16, -27, -29, -30, -9, 9, 9, 3, -14, -50, -56, -56, -79, + -92, -80, -57, -24, 12, 10, 11, 4, -22, -21, -13, -2, 4, 10, 15, 8, + 35, 72, 53, 44, 25, 25, 48, 56, 69, 53, 50, 75, 85, 71, 33, 12, + -16, -32, -25, -14, -5, -16, -23, -19, -22, -39, -41, -47, -45, -33, -35, -39, + -38, -35, -34, -29, -28, -28, -23, -10, -7, -9, -11, -18, -5, 13, 1, -13, + -8, -5, 6, 27, 46, 43, 25, 8, 11, 16, 18, 23, 30, 12, 5, 10, + 7, 5, -6, -4, -5, 1, 10, 9, 15, 21, 17, 10, -8, -16, 10, 33, + 34, 23, 13, 17, 17, 9, 11, 7, -4, -8, -8, -22, -27, -26, -19, -7, + -18, -16, -16, -47, -62, -55, -36, -16, -25, -33, -30, -34, -42, -49, -41, -43, + -31, -20, -3, 28, 48, 66, 64, 36, 20, 26, 21, 22, 39, 51, 45, 39, + 40, 53, 56, 39, 24, 16, 12, 16, 24, 27, 16, 13, 7, -18, -33, -50, + -47, -33, -24, -20, -26, -32, -31, -46, -53, -58, -56, -29, -13, -11, -2, 8, + -11, -24, -11, -9, -6, -2, -6, 1, 4, 5, 11, 6, 7, 16, 30, 28, + 19, 15, 7, 4, 11, 27, 22, 6, 9, 11, 3, 4, 17, 27, 18, 11, + 12, 5, 2, -2, -6, -7, -2, 10, 12, 9, 1, -2, 3, 4, 11, 21, + 30, 28, 6, -9, -18, -22, -22, -38, -41, -27, -18, -18, -27, -27, -23, -32, + -35, -32, -34, -30, -25, -24, -18, -9, -5, 5, -5, -26, -19, -11, -4, 11, + 37, 48, 46, 50, 53, 50, 45, 45, 37, 18, 24, 44, 38, 43, 47, 29, + 15, 11, 10, 12, 4, -8, -6, -4, -17, -27, -28, -36, -34, -37, -53, -53, + -46, -38, -38, -37, -28, -24, -23, -37, -42, -30, 0, 20, 18, 12, 14, 9, + 2, 6, 15, 13, 10, 14, 12, 2, 12, 29, 21, 1, 7, 21, 19, 14, + 15, 15, 4, -1, 5, -1, -4, 0, -2, 3, 6, 6, 13, 21, 15, 7, + 3, 5, 2, -3, 3, 3, 5, 8, 10, 16, 14, -1, -7, 2, 11, 12, + -10, -35, -42, -26, -21, -37, -44, -44, -47, -42, -27, -27, -23, -15, -16, -20, + -21, -14, -12, -9, -7, -6, 0, 13, 30, 32, 37, 38, 31, 24, 25, 43, + 54, 49, 46, 44, 40, 41, 30, 9, -1, 6, 22, 31, 22, 9, 0, -14, + -23, -29, -29, -28, -35, -39, -39, -39, -33, -25, -30, -44, -49, -45, -45, -35, + -19, 2, 16, 16, 9, 0, 0, 6, 2, -1, 11, 27, 40, 32, 16, -2, + -2, 1, 3, 1, 7, 12, 6, 8, 11, 5, -1, -2, -1, 1, 8, 10, + 5, 4, 14, 17, 6, -1, 0, 4, 4, 17, 23, 19, 25, 20, 5, -8, + -9, -2, -1, -6, -3, 13, 16, 1, -13, -19, -21, -26, -34, -37, -23, -13, + -13, -24, -40, -42, -40, -39, -29, -22, -21, -18, -12, -2, 18, 24, 10, 0, + -6, -4, 15, 33, 34, 34, 44, 41, 31, 33, 44, 43, 31, 22, 20, 17, + 16, 23, 22, 19, 21, 10, -5, -6, -9, -8, -2, -5, -16, -28, -36, -47, + -53, -39, -23, -21, -24, -32, -43, -39, -34, -24, -18, -14, -11, -12, -6, 10, + 29, 41, 40, 27, 14, 10, 4, 1, 3, 2, 9, 19, 21, 9, -10, -16, + -10, 8, 18, 20, 13, -3, -8, -4, -1, 2, 5, 5, -1, 3, 9, 12, + 16, 16, 14, 9, 3, 5, 10, 4, -6, 1, 6, 5, 13, 20, 11, 1, + -7, -21, -30, -25, -12, -9, -13, -19, -24, -29, -34, -30, -32, -39, -33, -24, + -20, -22, -24, -13, 3, 6, 2, 1, 3, 5, 16, 30, 35, 35, 24, 16, + 15, 19, 31, 37, 33, 28, 29, 29, 30, 26, 20, 15, 13, 10, 10, 12, + 9, 7, -3, -21, -39, -44, -43, -42, -34, -26, -23, -18, -12, -18, -32, -36, + -31, -27, -20, -10, -7, -9, -11, -5, 2, 12, 19, 19, 25, 24, 11, 3, + 15, 29, 30, 20, 9, 1, -1, 1, 5, 2, -3, -2, 0, -6, -18, -27, + -20, -3, 8, 13, 15, 11, 7, 10, 18, 16, 10, 6, 3, -1, 1, 11, + 19, 19, 15, 14, 5, -2, -2, -7, -12, -15, -20, -16, -10, -5, 2, 1, + -13, -29, -33, -24, -10, -6, -13, -18, -23, -31, -32, -26, -22, -18, -13, -3, + 2, 3, 7, 8, 10, 19, 27, 32, 33, 33, 35, 38, 43, 41, 29, 9, + -4, -9, 2, 16, 17, 13, 15, 17, 13, 10, 5, -1, -8, -18, -29, -32, + -27, -21, -22, -30, -31, -31, -33, -31, -27, -18, -7, -6, -15, -16, -8, -1, + 4, 12, 18, 22, 20, 16, 11, 10, 14, 18, 16, 15, 14, 9, 6, 4, + 3, 3, 0, -5, -13, -18, -15, -13, -9, -7, -8, -5, -2, -5, -1, 5, + 8, 10, 11, 12, 17, 19, 16, 10, 4, 4, 8, 8, 8, 13, 14, 9, + 3, 0, -1, 0, 0, -7, -19, -24, -20, -15, -12, -15, -21, -23, -24, -26, + -28, -29, -28, -21, -10, -1, 5, 6, -3, -12, -14, -11, -1, 12, 16, 17, + 28, 36, 28, 20, 25, 27, 24, 25, 28, 21, 15, 11, 3, 4, 12, 11, + 0, -7, -5, -1, -1, -5, -8, -11, -17, -23, -22, -19, -21, -20, -20, -22, + -24, -22, -17, -20, -24, -20, -10, 2, 10, 13, 14, 14, 11, 8, 8, 12, + 17, 18, 20, 20, 14, 4, -1, -2, -1, 3, 11, 12, 6, 0, -9, -20, + -25, -18, -9, -8, -13, -18, -19, -14, -6, 0, 4, 11, 19, 22, 20, 19, + 15, 13, 14, 18, 17, 12, 7, 9, 14, 9, -1, -4, -1, -5, -10, -12, + -16, -23, -19, -7, -5, -10, -10, -11, -19, -27, -24, -14, -6, -3, -10, -21, + -24, -15, -6, 0, 9, 15, 12, 8, 6, 9, 9, 11, 20, 26, 31, 35, + 30, 21, 16, 16, 13, 6, 2, 4, 5, 3, -2, -10, -13, -11, -8, -9, + -13, -16, -18, -18, -19, -22, -18, -8, -3, -1, 0, -5, -11, -10, -9, -11, + -9, -2, 2, 4, 10, 15, 18, 19, 21, 21, 22, 22, 15, 4, -4, -8, + -7, -6, -10, -14, -18, -23, -20, -15, -8, -1, 0, -4, -7, -9, -9, -6, + -2, 2, 6, 7, 4, 1, 0, 7, 13, 11, 14, 22, 22, 15, 8, 2, + 4, 10, 16, 17, 13, 10, 9, 6, -3, -13, -23, -26, -21, -17, -14, -12, + -13, -16, -14, -9, -8, -8, -11, -18, -18, -12, -4, 0, 2, 6, 6, -1, + -6, 0, 8, 11, 13, 11, 6, 6, 9, 13, 16, 16, 15, 10, 7, 10, + 10, 4, 0, -2, -3, -1, 2, 2, -1, -5, -13, -21, -27, -30, -26, -16, + -4, 5, 8, 6, 2, -3, -5, -1, 4, 8, 9, 11, 11, 6, 0, 0, + 7, 12, 13, 11, 7, 1, -4, -3, 0, 5, 6, 5, -2, -10, -13, -13, + -10, -5, -4, -9, -18, -28, -31, -24, -14, -10, -4, 2, 5, 4, 2, 4, + 13, 20, 21, 19, 14, 11, 11, 12, 13, 14, 15, 17, 18, 18, 14, 5, + -3, -5, -8, -11, -11, -12, -15, -15, -13, -13, -15, -13, -12, -15, -16, -11, + -7, -6, -4, -1, 4, 6, -1, -10, -11, -7, -4, -1, 4, 9, 11, 12, + 9, 7, 8, 8, 7, 9, 13, 15, 12, 4, 1, 1, -2, -9, -10, -7, + -1, 3, 3, -1, -9, -12, -9, -5, 1, 3, -2, -10, -10, -7, -4, 2, + 8, 6, 4, 6, 5, -1, -1, 7, 17, 20, 17, 16, 19, 16, 7, -3, + -8, -9, -9, -11, -15, -24, -27, -20, -15, -12, -11, -7, -3, -4, -6, -7, + -6, -8, -14, -18, -18, -15, -10, -5, 3, 12, 18, 20, 17, 11, 10, 16, + 21, 22, 23, 23, 22, 17, 9, 0, -3, 2, 10, 15, 16, 11, 2, -9, + -19, -23, -22, -15, -10, -8, -11, -13, -15, -17, -19, -18, -15, -10, -3, 1, + -2, -6, -3, 0, -3, -3, 0, 6, 10, 9, 7, 4, -1, -4, 0, 10, + 17, 16, 11, 5, 0, -1, 2, 5, 1, -6, -10, -10, -8, -6, -4, -2, + -4, -7, -9, -9, -6, 2, 12, 17, 16, 11, 8, 7, 6, 5, 7, 9, + 12, 14, 14, 9, 3, -1, -3, -5, -4, 0, 4, -1, -10, -18, -24, -29, + -28, -20, -14, -13, -12, -8, -5, -5, -9, -13, -14, -11, -10, -9, -4, 1, + 3, 2, 3, 8, 16, 20, 18, 13, 10, 14, 24, 29, 29, 27, 23, 17, + 14, 16, 17, 15, 9, -1, -7, -10, -14, -18, -16, -11, -8, -7, -8, -12, + -18, -26, -29, -26, -19, -11, -5, -3, -3, -2, 0, 2, 0, -3, -3, -2, + -3, -4, -2, -1, 3, 7, 9, 8, 7, 3, 1, 4, 5, 2, 3, 5, + 5, 0, -7, -9, -6, -1, 5, 9, 8, 3, -2, -6, -5, 3, 9, 12, + 11, 8, 4, 3, 4, 6, 11, 13, 8, 1, 0, 4, 9, 13, 12, 5, + 2, 3, 3, 0, -6, -16, -26, -30, -28, -26, -22, -18, -17, -19, -22, -24, + -19, -12, -7, -2, 1, 0, -2, -4, -5, -2, 4, 10, 14, 15, 15, 16, + 16, 17, 19, 22, 26, 25, 19, 13, 10, 7, 9, 11, 10, 7, 4, 1, + -5, -8, -8, -4, 0, 1, -4, -11, -16, -17, -16, -14, -12, -10, -11, -14, + -15, -16, -13, -9, -3, 1, 2, 1, 0, 0, -3, -9, -13, -10, -8, -7, + -4, 0, 3, 6, 9, 9, 5, 3, 3, 5, 8, 12, 12, 6, -1, -2, + 2, 8, 8, 4, -2, -5, -1, 4, 10, 13, 14, 13, 13, 14, 14, 12, + 10, 8, 8, 8, 6, 6, 9, 6, -1, -9, -15, -19, -22, -24, -23, -25, + -25, -23, -20, -19, -19, -21, -20, -20, -21, -19, -11, -2, 2, 1, 0, 3, + 9, 13, 15, 16, 14, 10, 5, 3, 8, 14, 16, 18, 20, 22, 24, 21, + 15, 9, 6, 8, 14, 18, 15, 9, 4, 1, 0, -2, -4, -4, -3, -3, + -4, -7, -11, -13, -12, -11, -15, -19, -22, -25, -25, -21, -14, -11, -15, -19, + -18, -14, -7, -1, 4, 2, -3, -6, -4, 0, 5, 10, 16, 17, 12, 7, + 2, -1, -3, 0, 3, 6, 10, 14, 12, 6, 2, 5, 10, 15, 18, 18, + 16, 14, 11, 6, 4, 3, 1, 1, 2, 6, 9, 9, 3, -2, -3, -4, + -6, -8, -10, -15, -19, -20, -19, -18, -17, -15, -16, -17, -18, -20, -22, -21, + -16, -11, -4, 1, 0, -4, -4, -1, 1, 2, 4, 4, 3, 3, 4, 7, + 11, 16, 21, 20, 15, 11, 9, 12, 16, 21, 24, 23, 21, 17, 13, 11, + 9, 4, 0, 0, 1, 3, 4, 0, -4, -7, -7, -9, -13, -17, -20, -22, + -23, -21, -16, -12, -12, -15, -17, -17, -15, -12, -10, -10, -11, -12, -15, -15, + -10, -4, 0, -1, -1, 1, 4, 7, 13, 19, 22, 23, 21, 19, 18, 17, + 11, 5, 2, 5, 10, 13, 15, 15, 14, 13, 10, 5, 1, 0, 2, 5, + 8, 10, 9, 6, 4, 2, -1, -5, -7, -8, -7, -8, -11, -13, -14, -16, + -19, -21, -22, -22, -24, -23, -20, -17, -16, -16, -15, -16, -16, -15, -13, -11, + -9, -5, 0, 6, 12, 15, 18, 18, 17, 17, 19, 20, 19, 19, 20, 23, + 25, 25, 23, 20, 17, 13, 11, 9, 9, 8, 6, 3, 1, -2, -5, -5, + -2, -1, -3, -7, -6, -3, 0, -2, -9, -21, -29, -32, -32, -30, -27, -27, + -29, -30, -28, -24, -23, -21, -16, -7, 0, 1, 2, 2, 4, 7, 10, 14, + 16, 14, 12, 13, 15, 18, 20, 22, 23, 20, 15, 8, 3, 2, 7, 13, + 15, 13, 7, 2, 0, 0, -1, -2, -1, 1, 2, 1, 0, 2, 3, 4, + 4, 6, 7, 5, 0, -10, -21, -30, -36, -36, -33, -28, -23, -18, -15, -14, + -17, -19, -19, -17, -12, -5, -2, -2, -3, -1, 2, 6, 10, 12, 14, 13, + 12, 13, 18, 25, 29, 28, 24, 19, 14, 10, 6, 6, 9, 12, 13, 15, + 17, 18, 18, 14, 7, 0, -1, 1, 1, -2, -6, -8, -10, -11, -13, -17, + -19, -18, -17, -16, -14, -14, -15, -17, -19, -22, -26, -26, -24, -20, -17, -14, + -13, -12, -10, -7, -4, 1, 5, 7, 9, 10, 13, 15, 17, 18, 21, 24, + 22, 21, 19, 17, 15, 13, 14, 14, 16, 17, 18, 16, 12, 10, 8, 6, + 5, 3, 0, -3, -6, -7, -5, -4, -4, -5, -5, -4, -4, -4, -8, -13, + -19, -24, -27, -28, -27, -25, -25, -27, -27, -25, -19, -14, -8, -3, 1, 6, + 9, 8, 3, -3, -6, -4, -1, 4, 9, 14, 18, 20, 22, 22, 23, 23, + 22, 21, 20, 20, 21, 21, 19, 15, 9, 3, -2, -4, -3, 0, 2, 2, + 2, 3, 3, 1, -4, -10, -15, -19, -19, -16, -11, -7, -7, -9, -13, -17, + -23, -28, -30, -29, -24, -20, -18, -19, -20, -19, -18, -19, -18, -13, -5, 1, + 6, 9, 11, 13, 16, 21, 26, 29, 30, 29, 29, 28, 26, 23, 20, 20, + 21, 21, 20, 18, 15, 9, 2, -4, -6, -5, -3, -3, -4, -6, -7, -9, + -10, -10, -10, -10, -11, -13, -12, -11, -8, -6, -6, -10, -17, -26, -32, -35, + -35, -34, -32, -27, -19, -9, -3, -1, -2, -5, -7, -6, -1, 7, 14, 18, + 21, 23, 25, 26, 26, 23, 20, 20, 23, 24, 24, 21, 19, 14, 8, 2, + -1, 0, 1, 2, 3, 6, 8, 8, 5, 2, -2, -5, -5, -4, -1, 1, + 1, -1, -6, -9, -11, -13, -17, -20, -24, -26, -27, -26, -23, -21, -20, -23, + -26, -27, -26, -24, -20, -15, -9, -2, 4, 8, 10, 13, 16, 19, 21, 23, + 25, 28, 33, 36, 38, 38, 35, 32, 29, 24, 16, 11, 6, 2, -2, -6, + -6, -5, -4, -4, -7, -11, -14, -13, -10, -8, -8, -8, -9, -11, -12, -12, + -11, -11, -12, -14, -17, -19, -19, -18, -18, -20, -22, -23, -21, -18, -14, -11, + -8, -4, -1, 5, 11, 13, 11, 8, 6, 7, 9, 11, 13, 15, 19, 22, + 23, 25, 27, 27, 22, 17, 11, 6, 4, 5, 9, 13, 15, 15, 11, 6, + 0, -4, -7, -8, -6, -3, -2, -3, -6, -9, -13, -18, -22, -23, -20, -15, + -11, -10, -11, -14, -19, -24, -27, -28, -28, -27, -26, -23, -19, -15, -10, -6, + -1, 4, 8, 10, 11, 11, 13, 15, 17, 20, 23, 24, 24, 26, 28, 28, + 28, 27, 26, 24, 22, 20, 16, 13, 10, 8, 6, 3, -3, -9, -15, -17, + -16, -15, -13, -13, -14, -17, -19, -20, -20, -17, -14, -12, -13, -14, -13, -13, + -14, -15, -14, -13, -12, -12, -12, -10, -8, -7, -8, -9, -9, -7, -4, 0, + 3, 6, 8, 10, 12, 14, 18, 22, 25, 26, 27, 28, 28, 27, 24, 20, + 16, 13, 11, 9, 6, 3, 0, -3, -3, -2, 1, 3, 5, 3, 0, -4, + -8, -12, -17, -21, -22, -20, -17, -15, -14, -14, -13, -15, -19, -22, -21, -18, + -14, -13, -15, -16, -17, -17, -19, -19, -16, -11, -4, 1, 6, 10, 13, 17, + 20, 23, 24, 24, 24, 25, 28, 33, 37, 38, 35, 30, 24, 20, 16, 13, + 9, 2, -4, -8, -8, -8, -7, -7, -9, -12, -16, -18, -18, -16, -15, -16, + -16, -16, -13, -10, -10, -11, -13, -15, -15, -15, -15, -16, -17, -16, -14, -13, + -13, -13, -13, -12, -9, -5, -2, 1, 3, 6, 12, 18, 22, 22, 21, 18, + 16, 16, 19, 23, 29, 32, 30, 24, 18, 13, 9, 6, 3, 0, -2, -4, + -6, -8, -10, -11, -10, -6, -3, -2, -3, -5, -5, -6, -6, -7, -6, -5, + -4, -5, -8, -10, -11, -12, -14, -16, -18, -20, -21, -21, -22, -23, -24, -24, + -22, -18, -11, -4, 1, 4, 5, 6, 8, 11, 15, 20, 24, 26, 27, 28, + 31, 32, 31, 30, 28, 27, 24, 20, 17, 14, 12, 9, 3, -3, -9, -12, + -15, -16, -17, -15, -13, -10, -10, -11, -13, -14, -15, -17, -19, -21, -23, -24, + -22, -18, -13, -9, -8, -8, -8, -9, -9, -9, -7, -4, 0, 2, 3, 5, + 5, 3, 3, 4, 5, 6, 7, 10, 14, 17, 20, 20, 20, 21, 22, 20, + 18, 16, 15, 14, 12, 9, 7, 6, 4, 2, -2, -5, -7, -9, -9, -8, + -5, -2, 0, 0, -1, -3, -7, -12, -16, -16, -15, -13, -12, -13, -13, -12, + -11, -11, -12, -15, -19, -23, -24, -22, -19, -16, -13, -10, -5, -1, 3, 6, + 7, 8, 8, 10, 13, 17, 21, 25, 27, 28, 28, 26, 24, 24, 25, 27, + 28, 29, 28, 25, 19, 12, 4, -3, -10, -15, -19, -22, -24, -25, -26, -25, + -23, -21, -20, -18, -17, -16, -14, -12, -11, -12, -14, -14, -13, -13, -15, -16, + -16, -16, -15, -11, -4, 0, -2, 0, 0, 3, 14, 34, 24, -3, -14, -12, + 6, 6, -11, -23, -5, 15, 20, 15, -19, -12, 3, 19, 11, -5, 1, 4, + 7, -13, -3, 5, -13, 0, -2, 8, 0, -6, 16, 23, 13, 6, 2, 14, + 25, 2, 11, 3, -7, -8, -24, -6, -4, -18, 6, 30, 14, 9, 0, 0, + 13, -7, 0, -3, 9, 8, -6, -14, -15, -23, -19, -7, 0, -3, 1, -8, + -10, -10, -17, -12, -7, -10, 1, -12, -13, 0, -15, -20, -25, -16, -6, -7, + -6, -6, -2, -4, -13, -12, -6, -6, -5, 2, 8, -5, -13, -3, -4, -11, + -16, -3, 12, -2, -8, -4, -4, 4, -15, -17, -6, -2, 5, -4, 3, -2, + -10, -4, -5, -7, -8, 4, 17, 1, -3, -14, -4, -2, -7, -4, -6, 10, + 5, -6, -7, -8, 10, -5, -3, 3, -8, 11, 7, -5, -3, -13, -7, 0, + -6, 4, 0, -7, 12, -9, -17, -7, 5, 2, -3, -4, -7, 7, -2, -13, + -5, -2, 5, 4, 0, 7, -3, 4, 1, -2, -4, 6, 8, 8, 0, -2, + 2, 3, 2, 1, -2, 5, 12, 6, 3, 2, -3, 2, 3, 1, 8, 6, + 7, 2, -5, -3, 1, 5, 2, 0, -3, 2, 7, 2, 0, -9, 0, 5, + 1, 3, 1, 4, 6, -5, -3, -2, 2, 6, 4, 6, 1, 2, 4, 4, + -2, 2, 5, 5, 7, 7, 2, 6, 0, 3, 0, -3, 8, 4, 4, 9, + -3, 2, 1, 1, 2, 1, 5, 5, 4, 6, 1, -6, -2, 3, 5, 6, + 4, 3, 4, 1, 2, -4, 0, 6, 2, 2, 4, 3, 5, -3, -2, -5, + -3, 5, 2, 1, 3, 1, -2, -3, -4, -6, 3, 5, 1, -2, 1, 2, + -2, -2, -2, -3, 3, 5, 3, 4, 2, 2, 1, 0, 1, 4, 9, 9, + 5, 2, 1, 6, 4, 4, 5, 5, 7, 8, 4, 5, 1, 2, 3, 1, + 1, 4, 2, 3, 0, -4, -7, -5, 0, -3, -3, -3, -5, 0, -8, -7, + -8, -5, -3, -6, -3, -4, -5, 0, -7, -4, -5, -3, 1, 1, -2, 1, + -2, 2, 0, 0, -2, 3, 5, 4, 5, 4, 2, 4, 2, 4, 5, 6, + 5, 6, 4, 4, 4, 4, 3, 4, 2, 4, 4, 2, -2, -2, 0, -3, + -3, -3, -4, -2, -7, -6, -7, -9, -7, -10, -9, -10, -10, -8, -11, -9, + -9, -12, -10, -13, -12, -7, -8, -6, -6, -9, -6, -5, -3, 0, 0, 1, + 1, 4, 3, 4, 8, 6, 8, 7, 6, 10, 9, 12, 12, 11, 12, 8, + 13, 10, 11, 10, 8, 9, 8, 6, 9, 4, 5, 0, -3, -5, -5, -6, + -7, -9, -12, -15, -17, -21, -18, -22, -21, -23, -25, -24, -27, -27, -26, -30, + -27, -27, -28, -20, -22, -19, -14, -15, -12, -10, -10, -2, 3, 4, 12, 12, + 14, 20, 17, 25, 27, 29, 33, 35, 35, 40, 38, 41, 39, 36, 38, 36, + 36, 38, 31, 33, 25, 21, 14, 8, 1, 2, 0, -3, -5, -15, -23, -28, + -40, -39, -43, -46, -43, -52, -53, -59, -66, -62, -69, -63, -64, -64, -50, -56, + -44, -45, -43, -38, -36, -31, -20, -8, 4, 12, 19, 18, 28, 31, 40, 52, + 57, 68, 73, 73, 77, 73, 81, 79, 82, 82, 77, 82, 77, 75, 69, 59, + 53, 42, 33, 24, 22, 17, 11, 1, -17, -25, -36, -42, -46, -55, -60, -64, + -73, -77, -88, -90, -92, -97, -98, -100, -100, -92, -85, -79, -80, -76, -79, -69, + -56, -50, -32, -24, -15, 0, -2, 11, 15, 29, 45, 55, 67, 72, 82, 88, + 95, 101, 102, 109, 109, 112, 109, 110, 110, 106, 104, 91, 81, 77, 68, 66, + 54, 42, 32, 14, 6, -6, -12, -20, -29, -43, -55, -65, -76, -76, -85, -89, + -97, -105, -107, -114, -115, -117, -117, -113, -112, -104, -101, -91, -85, -84, -70, -72, + -55, -42, -34, -14, -8, 5, 16, 22, 35, 44, 57, 69, 78, 89, 94, 101, + 104, 109, 109, 119, 118, 117, 120, 110, 114, 114, 99, 102, 84, 74, 72, 57, + 52, 43, 32, 22, 10, -7, -20, -28, -34, -47, -54, -60, -67, -71, -80, -87, + -90, -105, -105, -110, -120, -115, -120, -123, -113, -111, -109, -97, -98, -92, -83, -82, + -76, -63, -61, -48, -39, -30, -16, -3, 10, 22, 32, 42, 49, 61, 67, 76, + 84, 91, 101, 105, 115, 116, 117, 125, 115, 119, 116, 106, 111, 102, 97, 92, + 84, 79, 70, 64, 50, 45, 31, 19, 14, -2, -9, -19, -30, -35, -47, -54, + -62, -67, -73, -82, -86, -96, -100, -105, -109, -116, -118, -120, -120, -117, -111, -110, + -97, -96, -90, -84, -78, -73, -64, -55, -50, -39, -25, -20, 1, 11, 19, 37, + 40, 51, 61, 68, 76, 85, 94, 97, 105, 114, 112, 120, 122, 119, 121, 117, + 110, 106, 105, 92, 90, 84, 69, 71, 57, 48, 45, 29, 22, 14, -2, -9, + -22, -31, -40, -47, -59, -62, -68, -76, -80, -87, -97, -96, -111, -111, -116, -124, + -119, -123, -120, -109, -109, -98, -95, -93, -84, -81, -75, -66, -55, -51, -37, -28, + -16, 1, 12, 23, 39, 40, 55, 59, 68, 77, 86, 94, 103, 104, 116, 117, + 118, 125, 122, 117, 120, 107, 108, 104, 95, 92, 85, 72, 70, 60, 48, 43, + 29, 18, 10, -7, -12, -22, -30, -38, -49, -58, -63, -72, -75, -84, -90, -93, + -100, -110, -103, -121, -115, -115, -124, -110, -112, -111, -92, -98, -86, -81, -77, -69, + -61, -53, -48, -34, -27, -13, 1, 9, 28, 37, 45, 58, 59, 76, 78, 85, + 97, 98, 109, 114, 111, 123, 120, 119, 121, 116, 111, 110, 101, 93, 92, 79, + 73, 68, 55, 52, 40, 30, 21, 10, 0, -13, -23, -29, -41, -47, -58, -64, + -69, -75, -84, -89, -93, -103, -105, -110, -120, -115, -117, -128, -105, -114, -109, -88, + -102, -86, -76, -84, -64, -63, -56, -43, -37, -25, -10, 4, 11, 31, 36, 46, + 56, 58, 74, 78, 84, 100, 95, 110, 114, 110, 124, 120, 116, 121, 110, 105, + 108, 97, 96, 91, 79, 75, 66, 57, 51, 38, 29, 17, 5, -3, -13, -20, + -28, -40, -46, -55, -66, -68, -76, -85, -88, -97, -102, -106, -110, -117, -115, -120, + -122, -108, -117, -103, -98, -96, -86, -79, -77, -66, -59, -54, -46, -33, -31, -10, + -2, 11, 27, 36, 47, 58, 62, 74, 78, 86, 94, 96, 106, 109, 115, 120, + 118, 121, 119, 112, 114, 104, 98, 94, 85, 77, 72, 63, 56, 49, 37, 31, + 20, 6, -2, -15, -24, -33, -44, -50, -58, -63, -68, -76, -82, -89, -95, -105, + -105, -116, -118, -117, -126, -114, -111, -118, -92, -105, -92, -83, -88, -72, -71, -65, + -51, -50, -31, -25, -9, 2, 16, 29, 35, 50, 53, 67, 73, 75, 92, 88, + 104, 112, 108, 122, 117, 119, 123, 114, 116, 110, 104, 98, 94, 86, 80, 75, + 63, 59, 47, 36, 29, 13, 9, -5, -16, -21, -36, -40, -50, -61, -61, -73, + -77, -85, -93, -95, -103, -108, -117, -120, -118, -125, -117, -108, -116, -96, -98, -97, + -83, -82, -78, -66, -61, -54, -43, -32, -25, -2, 3, 16, 33, 36, 52, 56, + 66, 75, 78, 94, 91, 103, 113, 108, 122, 119, 119, 121, 116, 112, 110, 106, + 93, 96, 83, 76, 74, 59, 58, 47, 34, 28, 14, 6, -6, -17, -27, -36, + -44, -54, -61, -63, -70, -76, -86, -90, -99, -102, -108, -117, -115, -121, -123, -111, + -120, -102, -100, -101, -84, -91, -76, -74, -70, -54, -56, -41, -30, -20, -3, 8, + 23, 31, 46, 47, 59, 70, 71, 83, 89, 90, 108, 108, 115, 120, 121, 122, + 118, 118, 109, 110, 102, 93, 93, 82, 78, 72, 62, 57, 45, 37, 22, 15, + 4, -10, -18, -30, -36, -42, -54, -57, -63, -68, -77, -86, -91, -102, -103, -108, + -117, -114, -119, -117, -115, -110, -106, -100, -91, -99, -79, -81, -77, -59, -61, -50, + -36, -33, -16, -4, 10, 16, 35, 39, 48, 62, 64, 76, 85, 89, 98, 105, + 110, 113, 120, 119, 118, 123, 112, 111, 110, 100, 98, 93, 82, 78, 70, 58, + 54, 45, 30, 24, 12, 0, -7, -20, -28, -36, -45, -55, -61, -66, -73, -79, + -88, -93, -103, -105, -112, -119, -115, -124, -123, -109, -119, -103, -98, -102, -92, -84, + -83, -75, -62, -59, -50, -34, -34, -12, 1, 7, 26, 33, 42, 50, 62, 67, + 76, 88, 90, 101, 110, 108, 118, 121, 119, 122, 121, 111, 113, 110, 98, 98, + 91, 80, 78, 66, 58, 53, 40, 29, 20, 8, -4, -11, -22, -33, -37, -49, + -57, -61, -68, -77, -81, -90, -96, -101, -110, -112, -116, -120, -116, -121, -119, -104, + -111, -96, -91, -96, -79, -79, -76, -59, -57, -46, -33, -25, -14, 5, 11, 26, + 39, 42, 55, 61, 70, 81, 86, 94, 101, 105, 114, 116, 120, 121, 119, 119, + 115, 111, 107, 102, 94, 90, 82, 73, 68, 59, 50, 41, 28, 20, 7, -4, + -12, -22, -30, -41, -48, -56, -62, -69, -75, -83, -90, -98, -100, -107, -111, -119, + -112, -124, -120, -107, -119, -101, -93, -104, -80, -85, -83, -61, -65, -55, -40, -38, + -25, -7, -3, 13, 29, 34, 45, 57, 59, 74, 79, 87, 98, 98, 108, 111, + 112, 122, 117, 119, 119, 111, 110, 107, 96, 96, 89, 76, 74, 63, 54, 51, + 35, 27, 19, 5, -3, -12, -25, -29, -43, -52, -58, -64, -71, -78, -82, -92, + -98, -101, -108, -110, -114, -120, -119, -118, -115, -110, -106, -95, -97, -82, -84, -76, + -62, -63, -51, -42, -39, -20, -12, 2, 15, 29, 36, 47, 58, 62, 74, 80, + 85, 95, 101, 106, 111, 116, 118, 117, 122, 113, 115, 111, 99, 103, 90, 85, + 80, 68, 63, 56, 46, 36, 28, 17, 5, -5, -19, -25, -35, -43, -52, -58, + -62, -72, -75, -83, -94, -94, -105, -105, -115, -115, -116, -122, -114, -112, -108, -98, + -99, -89, -86, -82, -72, -69, -58, -52, -44, -31, -21, -6, 4, 17, 28, 39, + 48, 53, 66, 72, 80, 88, 92, 104, 108, 113, 116, 119, 121, 116, 119, 112, + 108, 107, 94, 94, 85, 79, 72, 62, 57, 48, 37, 25, 17, 8, -8, -15, + -26, -35, -42, -55, -59, -65, -73, -75, -87, -89, -97, -104, -109, -116, -116, -121, + -120, -120, -109, -108, -103, -90, -97, -78, -78, -77, -60, -64, -50, -41, -34, -16, + -7, 9, 19, 33, 42, 52, 60, 65, 77, 79, 87, 96, 99, 109, 113, 118, + 124, 117, 121, 117, 109, 110, 99, 94, 93, 83, 77, 73, 63, 55, 50, 32, + 26, 18, 0, -6, -20, -29, -34, -49, -53, -57, -63, -71, -76, -83, -91, -97, + -108, -112, -114, -122, -115, -124, -112, -105, -112, -89, -99, -90, -78, -89, -72, -66, + -61, -49, -41, -28, -16, 2, 6, 25, 35, 36, 53, 54, 67, 77, 79, 93, + 97, 105, 112, 111, 122, 118, 119, 117, 112, 109, 108, 99, 95, 92, 82, 76, + 71, 59, 56, 43, 30, 24, 10, 0, -9, -18, -26, -36, -45, -55, -59, -68, + -75, -81, -88, -94, -99, -106, -109, -110, -119, -117, -119, -116, -111, -105, -101, -91, + -92, -83, -75, -75, -61, -52, -52, -35, -29, -18, 0, 9, 22, 36, 41, 51, + 64, 68, 78, 88, 90, 101, 103, 109, 113, 115, 121, 117, 118, 116, 109, 109, + 102, 94, 90, 80, 71, 67, 57, 47, 42, 30, 19, 14, -4, -9, -19, -31, + -36, -50, -55, -61, -68, -74, -79, -87, -93, -101, -107, -107, -115, -118, -118, -123, + -112, -110, -109, -92, -93, -94, -74, -83, -71, -57, -61, -45, -34, -31, -10, 0, + 12, 27, 37, 42, 55, 61, 70, 77, 87, 95, 96, 106, 112, 113, 123, 122, + 117, 122, 112, 109, 110, 96, 96, 92, 76, 74, 68, 55, 50, 40, 28, 20, + 7, -6, -10, -23, -31, -42, -51, -59, -65, -70, -76, -82, -88, -92, -104, -104, + -105, -122, -113, -122, -126, -106, -119, -103, -91, -99, -82, -80, -76, -66, -59, -54, + -46, -34, -30, -9, 1, 13, 33, 34, 51, 57, 63, 76, 77, 91, 95, 95, + 110, 108, 115, 122, 120, 120, 123, 112, 110, 110, 94, 95, 87, 70, 74, 62, + 55, 50, 39, 29, 20, 7, -5, -13, -26, -35, -44, -56, -61, -65, -69, -75, + -83, -86, -98, -104, -104, -121, -115, -119, -128, -110, -117, -116, -92, -100, -90, -78, + -83, -75, -63, -64, -55, -41, -39, -20, -7, 1, 21, 31, 40, 51, 55, 67, + 72, 77, 91, 93, 99, 110, 109, 118, 125, 118, 124, 119, 108, 114, 101, 93, + 96, 81, 75, 73, 59, 57, 48, 35, 27, 15, 1, -7, -20, -29, -37, -49, + -56, -61, -65, -69, -74, -83, -91, -98, -107, -113, -117, -120, -122, -118, -115, -111, + -103, -101, -92, -89, -85, -80, -77, -65, -61, -51, -41, -33, -16, -4, 8, 21, + 34, 40, 49, 57, 63, 73, 82, 89, 98, 104, 109, 117, 118, 123, 122, 119, + 116, 110, 108, 100, 97, 93, 83, 80, 70, 64, 55, 45, 34, 22, 12, -2, + -10, -20, -30, -35, -48, -55, -62, -67, -71, -78, -86, -91, -101, -104, -110, -117, + -117, -120, -123, -111, -111, -110, -90, -99, -90, -76, -85, -71, -58, -63, -45, -37, + -33, -14, 1, 4, 27, 34, 41, 53, 59, 66, 79, 84, 92, 100, 103, 110, + 115, 116, 123, 118, 118, 117, 107, 110, 101, 95, 93, 79, 76, 68, 57, 52, + 43, 30, 23, 11, -3, -8, -20, -30, -34, -48, -55, -60, -69, -74, -81, -89, + -92, -101, -105, -108, -114, -117, -118, -122, -112, -113, -108, -95, -101, -87, -82, -83, + -68, -60, -56, -45, -38, -28, -17, -2, 6, 23, 33, 40, 54, 60, 68, 80, + 85, 94, 96, 103, 109, 110, 119, 118, 118, 121, 113, 112, 110, 100, 98, 90, + 77, 73, 66, 55, 51, 41, 29, 25, 8, 1, -9, -23, -28, -42, -51, -59, + -64, -67, -75, -79, -86, -94, -98, -105, -111, -115, -117, -121, -123, -111, -120, -102, + -95, -100, -79, -84, -81, -61, -69, -55, -46, -42, -27, -14, -3, 11, 30, 35, + 49, 57, 60, 76, 76, 86, 95, 95, 109, 108, 116, 122, 121, 123, 120, 116, + 114, 106, 100, 94, 88, 78, 73, 65, 59, 52, 38, 33, 20, 10, -2, -15, + -22, -32, -42, -51, -58, -62, -67, -77, -80, -86, -94, -100, -106, -113, -115, -119, + -122, -118, -117, -107, -106, -98, -89, -89, -78, -76, -71, -57, -56, -46, -36, -25, + -12, 0, 16, 26, 39, 49, 54, 67, 72, 80, 88, 94, 101, 104, 115, 113, + 121, 125, 116, 123, 116, 110, 109, 98, 93, 88, 78, 69, 65, 56, 47, 42, + 27, 20, 8, -6, -15, -27, -33, -43, -53, -58, -64, -68, -74, -86, -87, -96, + -106, -103, -117, -116, -117, -123, -117, -106, -114, -97, -96, -96, -81, -81, -80, -62, + -64, -49, -45, -34, -19, -8, 4, 17, 28, 40, 47, 54, 66, 73, 79, 93, + 95, 102, 113, 110, 117, 123, 119, 121, 117, 113, 111, 106, 96, 95, 88, 78, + 72, 63, 55, 47, 35, 26, 14, 4, -9, -19, -24, -35, -43, -51, -61, -65, + -72, -79, -88, -88, -99, -107, -107, -120, -114, -120, -122, -113, -116, -102, -106, -95, + -89, -95, -72, -80, -70, -50, -58, -37, -30, -20, -5, 6, 18, 29, 44, 45, + 57, 72, 68, 89, 89, 97, 109, 104, 120, 113, 118, 124, 112, 120, 112, 107, + 106, 96, 91, 87, 78, 66, 65, 52, 40, 39, 17, 17, 4, -13, -13, -30, + -35, -44, -58, -59, -66, -72, -78, -85, -93, -97, -106, -114, -110, -120, -120, -118, + -120, -109, -110, -98, -100, -89, -81, -87, -68, -68, -59, -44, -46, -29, -18, -5, + 5, 22, 32, 39, 54, 56, 68, 79, 79, 94, 98, 102, 110, 112, 117, 119, + 124, 117, 116, 116, 104, 106, 97, 89, 86, 74, 67, 60, 53, 41, 34, 24, + 12, 4, -9, -19, -28, -38, -47, -58, -60, -68, -73, -77, -88, -93, -96, -111, + -109, -115, -124, -118, -122, -120, -107, -109, -102, -91, -95, -82, -78, -78, -60, -59, + -51, -36, -35, -14, -3, 6, 24, 34, 41, 56, 59, 67, 81, 82, 92, 103, + 102, 112, 119, 114, 123, 123, 116, 121, 112, 106, 107, 93, 91, 84, 74, 69, + 61, 52, 43, 32, 21, 13, -2, -10, -22, -31, -38, -51, -56, -59, -69, -71, + -76, -87, -90, -100, -107, -110, -119, -118, -120, -123, -108, -118, -101, -92, -102, -77, + -85, -83, -63, -71, -58, -45, -44, -27, -15, -2, 10, 30, 32, 46, 57, 56, + 74, 73, 84, 93, 95, 109, 108, 117, 117, 124, 119, 119, 119, 112, 109, 100, + 96, 90, 81, 75, 65, 59, 51, 41, 33, 22, 12, 0, -12, -23, -30, -40, + -51, -57, -64, -71, -73, -83, -84, -95, -102, -102, -116, -117, -118, -128, -116, -114, + -116, -102, -99, -95, -86, -80, -80, -71, -58, -61, -46, -38, -30, -10, -4, 12, + 26, 37, 47, 54, 67, 68, 79, 89, 86, 104, 104, 111, 118, 118, 123, 121, + 119, 116, 112, 109, 99, 96, 88, 80, 75, 66, 58, 49, 41, 29, 19, 10, + -5, -10, -25, -35, -39, -53, -58, -64, -69, -75, -81, -87, -100, -99, -112, -116, + -118, -126, -123, -115, -120, -111, -102, -100, -93, -86, -85, -76, -69, -64, -56, -47, + -38, -25, -10, 4, 16, 31, 40, 46, 61, 65, 70, 83, 86, 93, 103, 105, + 114, 125, 118, 124, 125, 112, 120, 111, 98, 103, 91, 86, 83, 71, 66, 61, + 49, 38, 32, 16, 7, -4, -17, -26, -36, -44, -54, -60, -59, -71, -75, -79, + -94, -95, -103, -117, -112, -120, -127, -120, -118, -117, -104, -102, -99, -88, -84, -86, + -73, -70, -64, -51, -47, -37, -17, -10, 7, 19, 32, 40, 52, 56, 67, 73, + 80, 87, 92, 103, 109, 110, 123, 119, 121, 126, 111, 113, 112, 98, 98, 91, + 80, 80, 71, 60, 61, 47, 36, 30, 13, 5, -5, -19, -27, -35, -43, -52, + -58, -62, -71, -76, -84, -96, -100, -105, -118, -115, -121, -123, -121, -114, -117, -110, + -98, -105, -91, -83, -90, -71, -68, -64, -48, -43, -33, -17, -5, 3, 23, 32, + 38, 54, 59, 66, 79, 82, 92, 100, 105, 108, 116, 119, 117, 126, 116, 115, + 118, 106, 105, 99, 91, 85, 78, 67, 60, 54, 41, 33, 24, 11, 0, 3, + 10, 14, -8, 46, 7, -20, -23, -28, 17, 9, 47, -7, -15, -35, -1, -26, + 44, 34, -31, 31, -47, -32, 30, -2, 32, 15, -15, -17, -39, 16, -2, 26, + 23, 3, -43, 11, -37, 14, 37, 7, 4, -21, -30, -9, 14, 18, 38, -13, + -16, -21, -24, 8, 38, 3, 16, -29, -11, -26, 20, 15, 24, -9, 0, -34, + -21, 32, -16, 41, -1, -20, -7, -7, -7, 27, 0, -2, -2, -11, -11, 19, + -16, 32, -19, -4, 11, -40, 49, -13, -12, 12, -32, 12, 17, 1, 23, -34, + -20, 14, -20, 33, 44, -51, 7, -21, -38, 46, 19, 37, -28, -29, -17, -40, + 63, 36, -33, 42, -45, -57, 16, 37, -3, 54, 0, -64, -25, -7, 15, 37, + 34, -2, -65, -12, -3, -7, 76, -2, -6, -28, -22, -30, 40, 11, 12, 21, + -43, -6, -1, -31, 73, -35, 33, -1, -67, 29, -24, 16, 42, 4, -26, 17, + -71, 32, 0, 0, 72, -56, 4, -2, -75, 76, -25, 39, 24, -42, -6, -20, + -31, 56, 1, 3, 49, -63, -12, -16, -10, 49, 12, 29, -32, -59, 35, -39, + 35, 45, -33, -21, 46, -68, 13, 16, 12, 0, 2, 32, -70, 12, 30, -62, + 64, 5, -31, 22, -30, 11, -30, 43, 2, -8, 16, -3, -60, 39, -11, -13, + 63, -32, 8, -6, -45, 39, -38, 30, 49, -89, 96, -84, 0, 43, -51, 52, + -4, -6, 7, -31, -10, 12, -22, 62, 8, -57, 65, -101, 1, 69, -46, 76, + -18, -34, -24, -33, 50, -6, 55, 16, -70, -19, 2, -33, 59, 61, -40, 7, + -44, -33, -7, 61, 31, -15, 5, -32, -70, 47, 34, 8, 22, -16, -44, -47, + 56, -6, 12, 56, -46, -32, -3, 7, -4, 42, 19, -41, -35, 41, -59, 43, + 45, -44, 9, -9, -7, -19, 36, 2, -50, 49, -6, -34, 33, -1, -38, 17, + 44, -33, 5, 28, -68, -13, 62, -25, 15, 45, -57, -32, 23, -14, 37, 11, + 29, -56, -48, 46, -55, 48, 94, -74, 22, -40, -59, 36, 9, 75, -19, -31, + 6, -104, 39, 80, -23, 59, -12, -104, 10, -12, 24, 59, 5, 9, -78, -12, + 24, -47, 116, -6, -51, 34, -71, -26, 55, 3, 11, 38, -31, -9, -45, 21, + -11, 4, 92, -79, 16, -16, -41, 29, 27, 19, -5, -19, -13, -35, 29, 22, + -7, 20, -35, 6, -21, 30, -2, 6, -8, -20, -12, 30, -13, 8, 23, -52, + 21, 8, -16, 40, -20, -7, -15, -38, 62, -33, 48, 5, -66, 28, -25, 15, + 39, 5, -46, 8, -46, 32, 12, 37, -9, -49, 43, -78, 43, 46, -43, 39, + -41, -36, 13, 19, 48, -21, 9, -37, -54, 45, 32, -14, 41, -32, -66, 42, + -8, 37, 12, -10, -12, -74, 71, -30, 16, 65, -64, -1, -13, -12, 17, 24, + 10, -16, -31, -1, -3, 1, 68, -47, -7, -8, -41, 74, -16, 32, -27, -42, + 22, -49, 80, -11, 0, 23, -84, 34, -24, 31, 48, -37, 23, -55, -25, 22, + 14, 22, 59, -78, -11, -1, -45, 90, -35, 32, 0, -75, 63, -65, 34, 52, + -71, 70, -56, -14, 30, -22, 10, 55, -74, 41, -19, -47, 88, -62, 50, -11, + -57, 44, -54, 59, 17, -23, 12, -40, -41, 60, 3, 15, 28, -71, -1, -17, + 11, 61, -28, 47, -59, -48, 35, -18, 51, 27, -20, -35, -36, 14, 6, 44, + 23, -30, -33, -17, -1, 14, 49, -2, -32, -12, -20, 5, 29, 34, -33, 9, + -34, -26, 36, -2, 40, -28, 5, -26, -39, 65, -27, 19, 31, -54, 0, -8, + 12, 2, 30, -5, -25, -22, 24, -29, 26, 52, -57, 7, 5, -56, 46, 1, + 8, 4, -5, 1, -51, 28, 14, -21, 48, -17, -46, 4, 11, -6, 35, 7, + -16, -31, -10, 25, -49, 95, -28, -29, 19, -46, -5, 32, 21, 8, -1, -24, + -36, -17, 59, -7, 33, 10, -76, -14, 19, -1, 56, 16, -23, -64, -8, 7, + 8, 85, 0, -57, -21, -35, -7, 72, 23, 28, -66, -16, -47, 2, 68, 24, + 5, 0, -69, -26, 22, -7, 72, 0, -12, -20, -51, 15, -11, 44, 44, -46, + 36, -59, -38, 32, 19, -3, 71, -45, -28, -29, -17, 36, 8, 79, -47, -53, + 18, -65, 38, 75, -24, 20, -36, -34, -26, 38, 39, -7, -3, 7, -85, 44, + 26, -17, 42, -20, -29, -26, 26, 18, -8, 36, -17, -73, 40, 4, -1, 52, + -16, -47, -15, 14, 4, 29, 30, -41, -44, 15, -2, 16, 60, -26, -54, 17, + -33, 22, 48, -5, -15, -20, -13, -15, 31, 37, -28, 6, -17, -22, -10, 64, + -43, 16, 22, -71, 41, 3, -1, 6, -12, 12, -38, 11, 38, -49, 37, 24, + -64, 27, 18, -73, 81, -33, 14, -3, -32, 43, -60, 53, 24, -76, 70, -29, + -33, 50, -18, -34, 48, -38, 37, -15, -5, 25, -80, 70, -4, -45, 89, -72, + -3, 13, -23, 28, 21, -9, -9, -25, -11, 24, -26, 62, -14, -49, 67, -97, + 57, 12, -23, 46, -46, 9, -20, -4, 25, -1, 5, 18, -31, -25, 38, -43, + 44, 17, -42, 37, -66, 37, -16, 26, 18, -16, -17, -4, -17, 7, 38, -11, + 4, -3, -51, 32, -17, 38, 18, -34, 23, -58, 4, 25, 0, 26, 3, -35, + -11, -10, 16, 24, 8, 4, -33, -30, 22, -2, 14, 52, -61, 10, -23, -4, + 20, 10, 32, -44, -2, 1, -36, 37, 32, -25, 2, 0, -40, 14, 24, -5, + 13, -28, 20, -51, 41, 15, -23, 25, -12, -41, 30, -2, -11, 40, -34, 14, + -24, 3, 22, -31, 44, -22, -31, 57, -55, 28, 0, -9, 1, 11, -10, 8, + -13, 3, -2, -23, 60, -49, 23, 10, -59, 36, -3, -3, 35, -23, 5, -42, + 15, 7, -2, 35, 0, -45, 8, -4, -27, 63, -4, -14, 9, -39, 1, 1, + 27, 19, -27, 24, -49, -6, 34, -5, 10, 19, -32, -20, 14, -12, 16, 26, + -9, -19, -9, -8, 8, 7, 40, -29, -14, -4, -25, 7, 56, -15, 6, -20, + -36, 3, 10, 33, 20, -23, -5, -42, -18, 54, -17, 63, -5, -59, 2, -44, + 12, 57, 17, 15, -33, -44, -16, -17, 65, 40, -9, 10, -72, -51, 39, 10, + 65, 19, -25, -47, -51, 17, 20, 53, 30, -35, -35, -34, -16, 36, 48, 12, + -3, -35, -42, -9, 28, 34, 12, 15, -42, -39, 7, 8, 24, 28, 1, -31, + -36, 9, -1, 28, 29, -14, -34, 14, -43, 23, 34, -7, 24, -44, 10, -28, + -5, 53, -29, 29, -7, -33, 2, -1, 5, 19, 10, -17, 2, -33, 14, 1, + 8, 32, -36, 17, -28, -18, 36, -22, 29, 2, -25, 5, -17, 13, 1, 16, + -1, -10, -12, 3, -9, 10, 19, -22, 16, -3, -20, 24, -22, 15, -3, -14, + 22, -30, 31, -14, -11, 12, -11, 8, 17, -9, -4, -13, -13, 7, 10, 19, + -6, -7, -2, -32, 24, 8, 0, 17, -20, -10, -15, 13, 10, 11, 4, -1, + -40, 19, -4, -6, 42, -31, -1, -5, -12, 19, 6, 7, -5, -26, 10, -12, + 15, 20, -8, -19, 12, -40, 31, 15, -3, 16, -23, -27, 7, -5, 31, 6, + 3, -6, -41, 14, -2, 7, 38, -10, -29, 11, -44, 17, 29, 6, 20, -26, + 1, -45, 9, 31, -18, 40, -1, -47, 8, -10, -4, 29, 33, -25, 1, -31, + -12, -9, 35, 30, -25, 31, -48, -28, 20, 17, 9, 30, -19, -39, -13, 6, + 8, 38, 15, -10, -42, 0, -24, 15, 49, -9, -12, 5, -44, -5, 42, 4, + 6, 8, -27, -29, 5, 24, -2, 10, 28, -56, 1, 23, -29, 29, 15, -19, + -11, 1, -4, -8, 24, 6, -15, 2, 7, -27, 12, 21, -40, 36, -15, -12, + 22, -16, 17, -17, 15, -6, -18, 23, -3, -26, 39, -27, -5, 26, -20, 8, + 5, -11, 7, -21, 19, -11, -8, 35, -25, 2, 18, -35, 9, 16, -21, 29, + -16, 1, -13, -13, 28, -18, 23, 13, -36, 6, -1, -23, 26, 12, -15, 17, + -20, -2, -7, 3, 22, -22, 27, -11, -34, 36, -30, 11, 17, 2, -12, 13, + -22, -11, 11, -5, 26, -17, 26, -25, -32, 44, -47, 39, 25, -31, 16, -35, + -1, -4, 26, 16, 3, -16, -10, -23, -8, 55, -27, 26, 0, -63, 41, -26, + 28, 22, -23, 14, -42, 5, 20, -13, 28, 3, -42, 20, -6, -17, 52, -32, + 6, -2, -37, 42, -27, 29, 15, -51, 40, -38, 2, 33, -19, 6, 11, -43, + 25, 0, -19, 57, -54, 31, -9, -43, 58, -52, 36, 11, -44, 50, -44, 8, + 23, -24, 12, 6, -34, 25, -9, -15, 50, -55, 35, -7, -25, 49, -48, 32, + -23, -18, 37, -30, 28, 8, -27, 7, -2, -19, 22, 10, -11, 10, -27, 4, + -16, 18, 29, -19, 20, -22, -36, 16, -2, 18, 14, 3, -24, -15, -5, 12, + 13, 20, 4, -40, 2, -23, 8, 29, 7, 9, -23, -10, -13, 5, 19, 9, + -3, -14, -7, -19, 21, 6, 5, 10, -20, 0, -14, 12, 0, 2, 5, -13, + 1, -3, 12, -12, 20, -13, -7, 6, -11, 5, 0, 5, -5, -4, 10, -10, + 2, 6, -5, -12, 18, -13, -9, 19, -17, 11, -1, 8, -5, -22, 26, -26, + 1, 29, -17, -7, 16, -22, -8, 23, -3, 4, -3, -2, -15, -20, 42, -21, + 4, 40, -55, 8, 8, -22, 21, 20, -17, 2, -14, -7, -2, 10, 31, -25, + 10, -3, -54, 40, 5, -12, 42, -17, -37, 13, -12, 7, 24, 10, -6, -36, + 12, -9, -25, 74, -24, -19, 38, -64, 5, 25, 0, 16, 1, -9, -25, -23, + 36, -8, 6, 50, -58, -12, 22, -53, 52, 18, -12, 16, -51, 15, -30, 25, + 46, -37, 31, -26, -49, 30, 9, -1, 42, -19, -28, -13, -5, 16, 4, 42, + -18, -40, 20, -30, 1, 49, -4, -15, 0, -21, -19, 21, 26, 0, -9, 9, + -43, -1, 26, -5, 21, -7, -6, -32, 9, 12, -3, 34, -17, -12, -17, -4, + 9, 7, 28, -19, -3, -13, -11, 7, 15, 15, -19, 15, -38, -5, 17, -1, + 29, -20, 15, -39, -11, 41, -33, 45, -8, -21, -11, -3, 7, 0, 28, -7, + -19, -8, 7, -20, 23, 24, -40, 24, -17, -16, 26, -9, 21, -27, 13, -11, + -22, 29, -7, 0, 22, -22, -16, 14, -12, 12, 11, -5, -6, -17, 14, -15, + 9, 30, -28, 5, 1, -26, 8, 18, -7, 1, 6, -12, -15, 9, 13, -13, + 13, 13, -42, 14, 3, -16, 20, 7, -3, -22, 25, -26, 4, 16, -7, 3, + -8, 17, -33, 14, 9, -21, 25, -3, -11, -1, 1, -13, 1, 23, -20, 26, + -18, 0, -18, 3, 24, -25, 36, -15, -29, 22, -22, 3, 24, -5, -1, 0, + -18, 2, -11, 20, 10, -17, 30, -37, -15, 29, -33, 39, 11, -23, 7, -34, + 8, 0, 11, 36, -27, -12, 9, -47, 29, 31, -29, 40, -37, -14, 3, -17, + 45, -11, 8, 12, -60, 20, -2, -2, 41, -12, -18, 3, -37, 27, 12, -4, + 37, -56, 17, -21, -5, 44, -20, 14, -2, -40, 20, 0, 3, 22, -13, -10, + -6, -16, 29, -12, 14, 15, -49, 24, -11, -7, 39, -18, 3, -20, -12, 19, + -10, 32, 2, -34, 10, -13, -13, 37, 1, -7, 3, -33, 4, 2, 18, 25, + -25, 8, -33, -13, 34, -7, 24, 4, -33, -10, -2, 2, 25, 12, -1, -25, + -12, 3, -18, 34, 12, -15, 4, -9, -25, 10, 17, -3, 9, 2, -13, -23, + 9, 8, -13, 37, -10, -15, 1, -13, -1, 0, 31, -15, 0, 5, -29, 6, + 5, 15, -9, 16, -9, -29, 15, -10, 3, 15, 9, -11, -12, 11, -29, 17, + 14, -7, 6, -6, -7, -24, 30, -11, 9, 18, -20, -8, -6, 6, -10, 22, + 10, -29, 14, -13, -8, 13, 17, -13, 2, 1, -24, 5, 5, 12, -10, 15, + -7, -28, 21, -2, -8, 22, -9, -14, -2, 6, -5, 5, 12, -7, -15, 14, + -4, -16, 27, -10, -14, 13, -5, -9, 10, 5, -8, -5, 16, -20, 2, 13, + -14, -3, 17, -18, 2, 10, -12, 9, -6, -2, -16, 13, 10, -15, 33, -24, + -17, 10, -4, 15, 1, 9, -23, -9, 6, -5, 5, 21, -10, -13, 11, -21, + -2, 19, -10, 23, -20, 10, -16, -21, 33, -17, 17, 18, -30, 1, -14, -1, + 20, -2, 18, -15, -24, 6, -5, 6, 36, -26, 6, -18, -23, 34, -12, 25, + 1, -30, -1, -11, 10, 22, -1, 4, -19, -28, 21, -11, 22, 25, -33, 4, + -21, -7, 22, 7, 19, -23, -13, -3, -13, 21, 17, -11, 7, -19, -12, 12, + -10, 30, -13, -5, 4, -30, 27, -9, 17, -3, -25, 13, -23, 13, 27, -15, + -5, 3, -35, 17, 19, -8, 29, -37, 1, -15, -10, 48, -20, 26, -7, -49, + 22, -23, 21, 33, -10, -8, -17, -34, 11, 19, 12, 40, -39, -14, -13, -36, + 64, -4, 20, 9, -55, 3, -24, 21, 31, 10, -1, -22, -30, -7, 12, 18, + 29, -10, -7, -28, -22, 22, 3, 26, 4, -13, -18, -16, 21, -9, 28, -1, + -21, 0, -12, 5, 6, 5, 10, -20, 1, 3, -20, 21, 7, -23, 24, -25, + -6, 21, -13, 25, -19, -8, 2, -14, 20, 13, -23, 25, -31, -7, 24, -16, + 20, 6, -25, 8, -24, 12, 15, -10, 24, -25, -2, 0, -12, 14, 10, -13, + 4, 1, -17, 9, 6, -9, 9, 0, -3, -8, 11, -10, -2, 7, -1, -6, + 6, 1, -12, 1, 18, -31, 23, -2, -21, 21, -6, -8, 15, -14, 4, -6, + -1, 17, -22, 20, -6, -35, 37, -17, -6, 47, -41, 6, -6, -16, 12, 16, + 6, 1, -36, 18, -26, 4, 59, -36, -1, 16, -64, 30, 14, 1, 16, -13, + 0, -35, 17, 13, -8, 12, 14, -45, 11, 12, -24, 27, 12, -27, 10, -6, + -9, 1, 14, -7, -6, 8, -4, -8, 8, 8, -24, 13, 7, -27, 28, -1, + -28, 27, -19, -2, 17, -5, 6, -10, -5, 4, -25, 32, 2, -22, 32, -28, + -20, 35, -20, 16, 7, -18, 1, -22, 20, 0, 2, 20, -15, -25, 24, -25, + 12, 25, -23, 10, -19, -5, 8, 2, 20, -6, -13, 0, -22, 12, 15, -3, + 13, -13, -25, 12, -6, 18, 13, -3, -14, -22, 3, -2, 14, 25, -10, -16, + -5, -13, 2, 22, 9, -2, -11, -12, -20, 15, 20, 1, 14, -19, -17, -9, + 1, 19, 5, 0, 4, -35, 17, -7, 5, 20, -16, 2, -8, -11, 11, -2, + 2, 7, -19, 15, -10, 2, 12, -14, -3, 2, -9, 17, -3, 2, -7, -16, + 10, 2, 9, 10, -14, -9, -6, -11, 21, 5, 4, 6, -24, -5, -4, 6, + 18, 0, 8, -21, -18, 8, -8, 21, 16, -11, -9, -12, -15, 15, 3, 27, + -9, -16, 5, -30, 13, 23, -11, 21, -19, -15, -3, -9, 30, -9, 14, -6, + -22, -5, 15, -11, 23, -1, -14, -4, -9, 8, 4, 1, 20, -34, 9, 1, + -17, 24, -6, 1, -9, 1, -4, 3, 6, 8, -16, 0, 2, -13, 11, 21, + -31, 24, -21, -4, 13, -2, 7, -9, -3, 0, -18, 29, -4, -9, 16, -19, + -13, 25, -5, -1, 15, -24, 4, -15, 22, 4, -11, 20, -21, -25, 39, -23, + 14, 14, -23, 1, -8, 3, 12, -9, 23, -19, -18, 24, -22, 5, 30, -32, + 11, 2, -21, 18, -6, 5, 1, -9, 13, -22, 4, 19, -28, 26, 3, -28, + 21, -4, -25, 32, -15, 5, 0, -2, -4, -9, 15, 0, -13, 21, -14, -20, + 31, -19, 2, 17, -14, -9, 12, -6, 4, -1, 4, -17, -1, 12, -2, 0, + 20, -31, -8, 12, -8, 17, 14, -13, -16, -9, -7, 20, 11, 18, -13, -28, + -3, -12, 13, 40, -12, 4, -20, -32, 8, 17, 14, 21, -10, -28, -18, -2, + 11, 22, 17, 0, -34, -6, -3, -17, 50, 1, -13, 4, -22, -21, 17, 16, + 4, 7, 0, -27, -11, 4, 10, 2, 24, -6, -28, 7, -12, -2, 33, -3, + -6, 2, -37, 3, 9, 7, 24, -4, -14, -6, -24, 25, -1, 11, 16, -36, + -9, 12, -25, 45, 5, -20, 11, -36, 11, 7, 0, 30, -32, -1, 7, -33, + 37, 0, -9, 15, -21, -10, 12, -15, 24, -8, 3, 4, -20, 7, 3, -15, + 28, -14, -7, 13, -23, 2, 11, 0, 4, 7, -9, -16, 1, 7, -7, 19, + -3, -12, -14, 15, -10, 7, 30, -26, -13, 15, -30, 15, 26, -12, -1, -8, + -9, -5, 13, 22, -12, -12, 7, -36, 17, 31, -24, 27, -21, -24, 15, -10, + 26, 4, -12, 4, -36, 13, 14, -5, 27, -14, -22, 7, -12, 6, 23, -13, + 7, -19, -2, 7, -8, 25, -5, -17, 18, -25, 3, 14, -8, 4, 0, -1, + -11, 4, 12, -18, 15, 2, -23, 12, -2, -7, 12, 1, -1, -15, 11, -3, + -17, 41, -24, -7, 13, -25, 3, 22, -9, 15, -12, -9, 0, -17, 32, -5, + -5, 19, -49, 19, 3, -11, 45, -30, 2, -4, -28, 29, 0, 7, 12, -34, + 6, -10, 1, 33, -9, -6, 4, -41, 25, 2, 4, 29, -40, 8, -17, -9, + 42, -16, 16, -10, -33, 11, -7, 22, 12, -6, -6, -25, -4, 18, -3, 25, + -4, -29, 5, -17, 8, 22, 1, 4, -22, 1, -13, 2, 31, -19, 9, 2, + -36, 17, 5, -7, 20, -11, -2, -13, 4, 9, -18, 24, -3, -30, 33, -19, + -11, 31, -21, 6, 0, -5, 3, -10, 17, -7, -19, 30, -24, 0, 26, -23, + 3, 7, -17, 9, -3, 9, -1, -17, 23, -25, -3, 34, -27, 10, 15, -34, + 9, 1, 1, 7, -1, 12, -31, 4, 16, -27, 32, 10, -33, 10, -1, -27, + 29, 9, -9, 0, -1, -16, -6, 24, 2, -17, 23, -20, -24, 33, -11, -2, + 17, -7, -21, 13, 1, -7, 10, 1, -12, -9, 13, -1, -5, 20, -16, -15, + 15, -8, 5, 13, -10, -7, -9, 5, 2, 10, 7, -7, -22, 12, -13, 6, + 26, -14, -6, 0, -17, 3, 16, 6, 0, -11, 3, -26, 13, 15, -6, 7, + 4, -29, 6, 7, -3, 13, 1, -11, -9, 2, -1, 3, 9, -3, -8, 1, + -4, 0, 5, 0, 0, -2, 0, -1, 0, 0, -2, 11, 23, 22, 24, 25, + 20, 21, 15, 40, -1, -24, -42, -5, -19, -11, -8, 4, -46, -31, -14, -33, + -40, -44, -48, -89, -63, -47, -33, -27, -10, -6, 22, 25, 26, 28, 37, 11, + 15, 51, 44, 54, 66, 66, 71, 111, 84, 70, 63, 47, 39, 22, 47, -28, + -79, -111, -90, -91, -112, -81, -87, -49, -46, -5, -24, 26, 24, 47, 29, 23, + 30, 30, 13, -1, 4, -14, 17, 35, 62, 31, 53, 59, 72, 64, 27, 26, + 9, 9, -61, -44, -88, -74, -81, -83, -124, -96, -37, -78, -48, -56, -68, -60, + 7, 44, 39, 54, 77, 102, 110, 108, 89, 101, 100, 105, 64, 22, -1, 44, + 40, -19, -29, -35, -16, -27, -40, -77, -82, -113, -104, -93, -57, -72, -56, -3, + 1, 7, -1, 49, 39, 30, 31, 23, 10, 31, 11, 7, -19, -2, -2, 28, + 62, 92, 75, 33, 34, -20, -47, -61, -85, -105, -93, -119, -112, -54, -70, -67, + -32, -1, 4, 4, 20, 29, 62, 70, 54, 62, 78, 115, 92, 85, 78, 52, + 21, 19, 27, 2, -8, 13, 0, 5, 3, 9, 18, 0, -59, -61, -45, -57, + -65, -76, -89, -102, -48, -24, 17, 6, 26, 33, 35, 26, 41, 63, 20, 12, + 29, 34, 8, 7, 31, 21, 31, 39, 33, -5, -8, -55, -57, -98, -94, -88, + -64, -82, -74, -39, -14, 3, 16, 22, 8, 2, 17, 5, 36, 76, 74, 71, + 57, 73, 62, 47, 30, 32, 19, 4, 7, -14, -18, -2, 17, -5, 13, 22, + 31, 10, 8, -13, -47, -80, -85, -86, -71, -73, -60, -35, -10, 9, 19, 49, + 53, 47, 60, 73, 43, 33, 20, 13, -1, -7, -7, 7, 9, -2, 5, -14, + -40, -69, -61, -66, -67, -84, -58, -58, -33, 2, -7, -5, 12, 32, 18, 25, + 19, 24, 65, 59, 62, 64, 63, 55, 60, 52, 31, 19, -12, -26, -4, -7, + -10, -3, 6, -22, -14, 12, 19, 4, -26, -38, -40, -56, -61, -66, -59, -65, + -51, -20, 29, 40, 51, 52, 62, 61, 53, 26, 20, 6, 8, 6, 9, -14, + -14, -15, -2, -11, -23, -36, -38, -60, -77, -69, -60, -51, -56, -44, -27, 10, + -2, 14, 10, 22, 16, 41, 60, 39, 35, 60, 62, 43, 45, 63, 52, 17, + 12, 15, -1, -2, 0, -38, -48, -32, -22, -7, 3, 13, 10, -2, -1, -8, + -12, -25, -48, -46, -52, -49, -36, -17, 9, 17, 26, 48, 57, 55, 69, 60, + 32, 6, 4, -6, -20, -24, -9, -21, -25, -14, -18, -38, -38, -32, -51, -52, + -60, -34, -6, -6, -16, -11, -2, -1, 17, 19, 3, 11, 25, 31, 41, 39, + 33, 33, 41, 34, 34, 23, 21, 15, 6, -13, -24, -28, -20, -8, -12, -19, + -12, -5, 9, 14, 2, -12, -25, -28, -21, -28, -23, -22, -18, -26, -5, 24, + 45, 46, 47, 39, 33, 36, 42, 29, 7, -5, -10, -21, -29, -39, -39, -31, + -24, -29, -39, -51, -43, -27, -22, -18, -25, -26, -20, 9, 19, 18, 4, -2, + 19, 30, 38, 25, 24, 28, 33, 41, 38, 34, 32, 38, 24, 8, 4, -8, + -11, -15, -25, -31, -25, -20, -22, -15, -11, -9, -12, -17, -20, -20, -15, -6, + -11, -8, 0, 11, 29, 19, 17, 17, 18, 28, 31, 25, 18, 23, 18, 10, + 1, -7, -18, -26, -24, -30, -41, -38, -44, -32, -31, -31, -35, -25, -12, -2, + -8, -11, -13, -13, -2, 8, 15, 19, 29, 35, 37, 39, 43, 42, 40, 35, + 27, 25, 18, 15, 9, 4, -4, -15, -28, -28, -26, -28, -18, -15, -25, -23, + -12, -11, -14, -10, -2, -4, -1, 8, 15, 19, 22, 25, 16, 16, 17, 5, + 7, 13, 18, 13, 9, 6, 6, 4, -4, -21, -31, -28, -37, -39, -34, -38, + -38, -32, -17, -6, -4, -14, -19, -9, 3, -2, 3, 4, 7, 8, 13, 23, + 35, 38, 43, 42, 31, 25, 23, 17, 8, 3, 4, -7, -7, -10, -13, -20, + -19, -28, -33, -30, -23, -18, -13, -17, -12, 3, 14, 23, 31, 27, 23, 21, + 22, 19, 12, 4, 2, 2, -2, 0, 4, 11, 11, 6, 4, -2, -5, -14, + -17, -30, -38, -44, -42, -28, -21, -23, -21, -15, -15, -4, 8, 11, 4, -7, + -15, -7, 5, 10, 21, 26, 28, 27, 34, 37, 36, 28, 19, 10, 11, 8, + -2, -18, -17, -19, -19, -22, -24, -21, -24, -18, -17, -13, -19, -13, -1, 12, + 19, 22, 21, 19, 19, 30, 34, 24, 13, 7, 2, 1, 1, 2, -1, -2, + -6, 0, 0, -2, -15, -21, -17, -21, -28, -32, -31, -31, -32, -27, -24, -17, + -4, 1, -3, -1, 1, 4, 7, 8, 15, 16, 15, 15, 20, 32, 36, 38, + 32, 19, 12, 3, 2, -2, -4, -11, -19, -17, -15, -11, -16, -20, -27, -30, + -28, -22, -13, -6, -2, 2, 12, 23, 29, 45, 44, 36, 32, 21, 16, 14, + 10, 1, -9, -8, -2, -1, -7, -13, -13, -12, -9, -11, -18, -24, -26, -28, + -30, -24, -21, -21, -21, -11, -11, -10, 0, -2, 0, 4, 12, 13, 14, 12, + 17, 22, 28, 30, 28, 20, 16, 13, 8, 2, -2, -6, -15, -14, -18, -15, + -15, -16, -18, -18, -16, -19, -18, -17, -10, 0, -1, 4, 13, 22, 37, 39, + 36, 27, 27, 32, 26, 15, 6, -1, -4, -5, -7, -11, -11, -9, -15, -15, + -14, -18, -21, -19, -17, -21, -19, -15, -15, -10, -15, -14, -12, -11, -6, -2, + 1, -2, 1, 5, 14, 22, 33, 35, 23, 18, 16, 13, 11, 6, 1, -9, + -18, -11, -6, -7, -8, -9, -11, -11, -12, -13, -17, -21, -24, -24, -15, -4, + 7, 12, 17, 25, 30, 28, 31, 32, 31, 27, 22, 15, 12, 3, -2, -8, + -6, -3, -9, -13, -22, -24, -20, -18, -22, -24, -18, -14, -13, -10, -11, -9, + -3, -2, -3, -5, -10, -10, -5, -1, 4, 11, 15, 19, 22, 27, 23, 20, + 16, 14, 5, -3, -11, -15, -16, -12, -12, -11, -5, 1, -3, -10, -13, -15, + -11, -10, -10, -11, -8, -3, 2, 7, 9, 15, 25, 30, 33, 31, 25, 21, + 20, 16, 13, 7, -2, -8, -5, -4, -11, -20, -21, -22, -21, -17, -20, -21, + -22, -19, -19, -11, -4, -2, -2, -2, 2, 5, 2, 0, 0, -3, 1, 8, + 16, 13, 14, 17, 15, 13, 8, 5, -1, -6, -10, -13, -14, -14, -13, -10, + -7, -8, -8, -6, -6, -3, -1, -1, -9, -12, -7, 3, 13, 17, 14, 13, + 17, 22, 23, 24, 18, 15, 18, 18, 18, 15, 8, 0, -5, -8, -11, -15, + -17, -21, -26, -26, -24, -26, -24, -13, -9, -6, -3, -2, 3, 4, 6, 7, + 5, 2, 4, 2, -2, -4, -3, 5, 13, 17, 10, 3, -1, -2, -4, -5, + -11, -14, -13, -11, -8, -8, -8, -6, -3, 0, -1, -5, -5, 0, 4, 3, + 1, 2, 0, 0, 6, 13, 20, 17, 17, 18, 21, 18, 14, 13, 11, 11, + 7, 9, 3, -5, -12, -14, -18, -21, -23, -26, -26, -13, -3, -6, -13, -14, + -5, 5, 8, 3, 0, 1, 3, 6, 4, -1, -1, 1, 3, 7, 5, 3, + 0, 1, -1, 3, 0, -3, -11, -11, -9, -10, -9, -8, -5, -7, -7, -10, + -9, -6, -1, 4, 6, 4, 2, 5, 10, 13, 9, 12, 13, 14, 15, 16, + 13, 12, 10, 13, 14, 13, 8, 2, -1, -4, -6, -9, -15, -20, -21, -19, + -14, -16, -22, -21, -13, -5, -3, -3, -1, 3, 5, 10, 9, 9, 6, 8, + 7, 7, 7, 3, -4, -6, -4, -1, -4, -8, -10, -11, -8, -4, -6, -10, + -7, -8, -11, -11, -8, -5, -4, 0, 3, 3, 8, 10, 10, 12, 12, 11, + 10, 13, 12, 10, 6, 8, 9, 9, 11, 13, 11, 9, 10, 7, 2, -3, + -8, -9, -14, -16, -16, -19, -18, -14, -13, -11, -11, -10, -5, -1, 3, 5, + 2, 2, 9, 14, 11, 9, 10, 7, 2, 0, 2, -2, -9, -13, -15, -18, + -17, -15, -13, -10, -5, -5, -7, -7, -4, -1, 0, -2, -4, -2, 1, 4, + 9, 10, 10, 11, 11, 13, 14, 10, 11, 9, 9, 4, 6, 5, 4, 5, + 7, 8, 10, 9, 4, -4, -8, -9, -10, -11, -12, -14, -15, -17, -15, -9, + -4, -1, -6, -5, 2, 8, 8, 6, 5, 3, 4, 5, 9, 10, 10, 5, + -1, -5, -10, -12, -14, -16, -18, -17, -11, -10, -11, -8, -5, -2, -2, 0, + 3, 4, 5, 3, 2, 3, 5, 9, 12, 12, 11, 10, 12, 14, 12, 8, + 5, 0, -1, 1, 3, 0, 1, 3, 5, 6, 5, 0, -5, -11, -10, -13, + -12, -13, -15, -14, -8, -4, -3, -3, -4, 0, 4, 5, 3, 6, 4, 4, + 7, 10, 9, 9, 8, 5, 5, 2, -4, -10, -15, -17, -20, -22, -22, -19, + -14, -11, -10, -8, -6, 0, 3, 5, 3, 4, 8, 11, 11, 12, 13, 12, + 12, 15, 15, 16, 16, 13, 11, 6, 3, -2, -5, -5, -3, -2, -1, 2, + 0, -3, -4, -5, -7, -10, -12, -11, -12, -11, -8, -4, -2, 0, 1, 2, + 2, 2, 4, 3, 3, 4, 5, 9, 10, 6, 2, 1, 2, 0, -3, -7, + -13, -18, -19, -18, -16, -18, -20, -19, -14, -8, -4, -1, 3, 3, 5, 7, + 9, 9, 10, 12, 13, 13, 13, 13, 16, 15, 13, 9, 6, 3, 2, 1, + 0, -3, -5, -6, -4, -2, -2, -4, -4, -5, -5, -3, -3, -4, -6, -6, + -7, -4, 0, 2, 3, 2, 2, 1, 2, 2, 1, 4, 5, 4, 1, 0, + 2, 2, 0, -2, -6, -8, -6, -7, -9, -11, -15, -18, -19, -18, -18, -17, + -13, -9, -2, 2, 3, 5, 10, 12, 13, 14, 14, 15, 17, 17, 16, 16, + 15, 13, 11, 7, 2, -6, -10, -8, -6, -8, -8, -7, -6, -6, -3, -4, + -6, -5, -3, -2, -2, 0, 1, 0, 2, 2, 3, 2, 3, 2, 3, 3, + 5, 2, 0, 4, 6, 5, -1, -4, -2, -1, -2, -6, -8, -9, -10, -12, + -10, -14, -17, -22, -22, -21, -19, -15, -8, -3, 1, 7, 12, 12, 15, 19, + 22, 21, 18, 16, 16, 16, 13, 12, 6, 3, 3, 2, -3, -6, -7, -12, + -12, -11, -8, -9, -8, -7, -3, 0, 0, 0, 0, -2, -2, 0, 1, 2, + 2, 4, 6, 6, 7, 5, 4, 3, 4, 5, 3, 0, -2, -2, -4, -6, + -10, -8, -8, -10, -11, -12, -12, -12, -13, -16, -16, -16, -14, -11, -8, -4, + -2, 1, 6, 12, 17, 19, 20, 20, 21, 21, 19, 13, 10, 9, 5, 0, + -3, -4, -4, -5, -6, -6, -4, -7, -10, -12, -12, -12, -10, -7, -4, -2, + 4, 6, 8, 7, 7, 7, 7, 8, 8, 7, 5, 6, 6, 4, 1, -1, + -1, 0, -3, -7, -10, -10, -8, -11, -14, -14, -12, -11, -9, -6, -8, -8, + -8, -11, -13, -12, -9, -8, -5, 0, 4, 8, 11, 14, 18, 18, 20, 23, + 23, 20, 14, 9, 4, 0, -3, -6, -8, -8, -8, -8, -9, -10, -11, -10, + -9, -8, -8, -7, -6, -3, 0, 3, 6, 12, 16, 16, 14, 10, 8, 9, + 7, 4, 1, 0, 0, -2, -1, 0, 0, -3, -7, -10, -13, -13, -12, -13, + -15, -14, -13, -9, -6, -5, -5, -7, -8, -9, -7, -6, -5, -7, -5, 1, + 8, 13, 17, 19, 20, 21, 22, 22, 18, 12, 9, 5, -1, -5, -9, -11, + -13, -12, -12, -11, -10, -8, -7, -7, -6, -7, -6, -3, 0, 1, 3, 7, + 10, 11, 12, 15, 15, 14, 9, 6, 3, 1, 0, -2, -2, -2, -3, -6, + -8, -10, -11, -13, -15, -15, -15, -13, -12, -12, -7, -5, -5, -5, -4, -3, + -3, -4, -4, -1, -1, 1, 4, 7, 10, 12, 14, 17, 20, 22, 19, 14, + 8, 5, 2, -2, -5, -10, -14, -13, -11, -10, -10, -10, -10, -8, -6, -3, + -3, -3, -1, -1, 2, 6, 10, 13, 14, 15, 15, 15, 13, 11, 8, 5, + 1, -1, -3, -3, -6, -10, -12, -12, -12, -12, -13, -15, -18, -19, -15, -11, + -6, -4, -3, -4, -4, -2, 1, 4, 2, -1, -2, 1, 4, 6, 8, 7, + 7, 11, 14, 15, 15, 15, 13, 10, 6, 1, -3, -6, -9, -13, -15, -15, + -13, -11, -9, -9, -9, -7, -3, 0, 2, 2, 4, 7, 11, 15, 16, 14, + 11, 12, 13, 15, 13, 9, 4, 1, -1, -4, -6, -8, -11, -15, -17, -17, + -17, -17, -15, -13, -13, -12, -10, -7, -6, -4, 1, 2, 2, 3, 4, 5, + 4, 4, 3, 5, 6, 6, 8, 7, 7, 9, 11, 10, 9, 8, 5, 2, + 0, -2, -6, -10, -13, -13, -14, -14, -13, -11, -9, -4, -1, -1, -1, 2, + 6, 8, 10, 11, 12, 14, 14, 14, 13, 11, 10, 7, 4, 2, 3, 1, + -3, -6, -10, -14, -17, -18, -18, -19, -19, -17, -15, -13, -9, -5, -1, 1, + 0, 1, 3, 5, 6, 6, 6, 7, 8, 9, 8, 4, 1, 0, 2, 4, + 5, 6, 5, 4, 4, 4, 3, 1, -3, -7, -9, -11, -12, -12, -12, -11, + -10, -7, -4, -2, 1, 4, 5, 8, 11, 13, 14, 14, 11, 11, 11, 10, + 10, 9, 6, 5, 3, 1, -2, -5, -10, -14, -16, -17, -18, -19, -20, -19, + -17, -14, -10, -5, -1, 1, 3, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 8, 7, 6, 4, 2, 0, -1, 0, 0, 1, 2, 1, 1, 2, 1, -2, + -5, -8, -9, -10, -11, -12, -12, -10, -7, -4, -1, 2, 8, 11, 13, 15, + 15, 13, 12, 11, 10, 9, 8, 6, 5, 4, 4, 3, 0, -3, -6, -10, + -14, -18, -21, -22, -21, -18, -16, -13, -10, -6, -3, 0, 3, 5, 5, 5, + 6, 7, 8, 8, 8, 7, 8, 7, 6, 5, 4, 1, 0, -2, -4, -4, + -5, -4, -4, -3, -2, -1, -2, -3, -4, -7, -8, -9, -9, -9, -8, -5, + -2, 2, 4, 8, 11, 14, 15, 15, 14, 12, 10, 7, 5, 4, 4, 2, + 1, 1, 2, -1, -3, -7, -10, -15, -18, -18, -18, -18, -17, -15, -11, -7, + -3, 1, 3, 4, 5, 6, 7, 7, 8, 8, 9, 10, 10, 9, 6, 4, + 2, 0, -3, -4, -6, -7, -7, -6, -5, -3, -2, -2, -2, -2, -3, -4, + -5, -6, -6, -6, -6, -5, -4, -1, 4, 7, 9, 11, 12, 12, 11, 10, + 9, 8, 7, 5, 3, 3, 2, 1, 0, -1, -4, -7, -8, -10, -13, -14, + -15, -15, -15, -14, -11, -9, -6, -3, 0, 2, 4, 5, 6, 7, 8, 9, + 10, 10, 9, 8, 6, 5, 3, 1, -3, -6, -8, -8, -7, -7, -7, -6, + -4, -2, 0, -1, -2, -3, -3, -3, -3, -4, -3, -3, -1, 1, 3, 4, + 6, 7, 8, 9, 10, 10, 9, 7, 6, 6, 4, 3, 2, 1, -1, -2, + -4, -6, -9, -11, -12, -12, -12, -11, -11, -10, -9, -8, -7, -5, -4, -1, + 1, 3, 5, 7, 9, 10, 11, 10, 9, 8, 7, 6, 2, -1, -3, -4, + -6, -7, -7, -7, -7, -6, -5, -5, -4, -3, -3, -4, -4, -4, -3, -2, + 0, 0, 1, 1, 2, 4, 6, 6, 7, 7, 8, 7, 7, 7, 7, 7, + 6, 5, 2, 0, -2, -4, -5, -7, -8, -8, -8, -9, -10, -10, -9, -8, + -7, -7, -7, -5, -3, -2, 0, 1, 2, 4, 6, 9, 10, 11, 12, 10, + 8, 6, 3, 1, -2, -4, -6, -7, -7, -7, -7, -8, -7, -7, -6, -6, + -5, -4, -3, -3, -2, -1, 1, 2, 2, 3, 4, 5, 5, 5, 6, 6, + 6, 5, 5, 6, 6, 6, 4, 3, 2, 1, -1, -3, -4, -6, -8, -9, + -9, -8, -8, -6, -5, -5, -5, -6, -6, -6, -5, -4, -2, 0, 2, 4, + 6, 7, 8, 9, 9, 9, 9, 6, 4, 1, -1, -3, -5, -6, -7, -7, + -7, -6, -6, -6, -6, -6, -5, -4, -3, -3, -2, -1, 1, 3, 4, 5, + 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 1, + -1, -3, -4, -5, -6, -7, -7, -7, -7, -7, -6, -5, -4, -4, -3, -3, + -3, -3, -2, -1, 0, 1, 3, 5, 7, 8, 8, 8, 7, 6, 4, 2, + 0, -2, -3, -4, -5, -6, -7, -7, -7, -7, -6, -6, -5, -5, -5, -3, + -2, 0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 5, 4, 3, 3, 3, + 3, 3, 3, 2, 1, 1, -1, -2, -3, -4, -5, -6, -6, -7, -6, -5, + -4, -3, -3, -3, -3, -3, -2, -1, -1, 0, 1, 1, 1, 2, 3, 5, + 6, 6, 6, 5, 4, 2, 1, 0, -2, -4, -5, -5, -6, -6, -6, -7, + -7, -7, -6, -5, -4, -3, -2, -1, 0, 2, 3, 3, 4, 4, 5, 5, + 5, 4, 4, 4, 4, 3, 3, 2, 1, 1, 0, 0, -1, -1, -2, -3, + -4, -5, -5, -5, -5, -5, -4, -4, -3, -3, -2, -1, -1, -1, -1, 0, + 0, 0, 1, 2, 3, 3, 4, 4, 4, 4, 4, 3, 1, 0, 0, -2, + -3, -4, -5, -5, -6, -6, -6, -5, -4, -4, -4, -3, -2, -2, -1, 0, + 2, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, + 0, -1, -1, -2, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -2, -2, + -2, -1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, + 2, 1, 1, 0, 0, -1, -1, -2, -3, -3, -3, -4, -4, -4, -4, -3, + -3, -2, -1, -1, -1, 0, 1, 1, 1, 2, 2, 2, 3, 3, 2, 2, + 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -5, -41, -25, -37, -9, 28, 14, 6, 1, + 19, 16, -83, -53, -35, -44, -29, 8, -23, -29, -6, -20, -22, -19, -40, -2, + 14, 34, 78, 59, 73, 93, 73, 83, 124, 94, 87, 61, 98, 80, 29, 27, + 6, 8, -9, -8, -26, -33, -35, -32, -25, -32, -28, -59, -46, -31, -19, -12, + -12, 14, 14, -41, -59, -46, -33, -32, -52, -31, -29, -49, -51, -53, -85, -53, + -60, -100, -85, -84, -66, -37, -26, -11, -8, 22, 41, 33, 39, 27, 29, 75, + 59, 45, 52, 69, 66, 73, 90, 91, 103, 81, 46, 16, -21, -32, -13, -34, + -22, -42, -51, -35, -53, -62, -45, -35, -34, -29, 25, 62, 61, 39, -8, -20, + -5, -7, 2, 28, 1, -24, 8, 29, 11, -9, -54, -34, -35, -57, -41, -63, + -50, -16, -18, 26, 23, -2, 38, 9, 17, 41, 39, 82, 64, 64, 103, 64, + 43, 43, 51, 26, -3, 30, 1, 9, 14, -26, 20, -27, -50, -39, -47, -31, + -23, -33, 25, 56, 51, 20, -19, -60, -41, -27, -10, 3, -36, -30, -22, -46, + -5, -12, -7, -4, -54, 3, -25, -10, -1, -42, -75, -27, -84, -60, -88, -107, + -73, -29, -67, -53, 9, -10, 17, -29, -33, 55, 12, 7, 121, 70, 42, 123, + 96, 127, 74, 28, 51, 21, 60, 23, -10, 25, 103, 113, 65, 45, 15, -1, + 10, 2, -26, 1, -16, 19, 27, -8, -8, -24, -20, -17, -35, -86, -87, -32, + -51, -26, -60, -60, -50, -15, -31, -30, -50, -55, -19, 22, 14, 30, 49, 42, + 15, -11, -57, -15, -29, -65, -37, -56, -29, 15, 70, 69, 36, 24, 19, 21, + 19, 4, 60, 55, 18, -17, 0, -2, -21, 51, 49, -6, 22, 14, -24, -63, + -5, 4, -53, -33, -1, -37, -34, 40, 30, 12, -6, -1, 12, 12, 23, 20, + 43, 34, 11, -26, -40, 25, 56, -1, -41, -50, -37, -10, 20, -58, -65, -43, + -26, 42, 57, 77, 57, 26, -4, -10, -57, -45, -23, -49, -1, -59, -41, -26, + -27, 24, 52, -3, -12, 19, -44, -31, 33, 11, -14, 43, 31, 7, 58, 84, + 45, 35, 18, -5, 6, -21, -6, -20, -7, 41, 53, 29, 25, 55, 68, 37, + -29, -17, -41, -67, -76, -90, -112, -104, -60, -21, 25, 16, -23, -9, 30, 47, + 17, 3, 19, 4, -2, 30, 24, 1, 26, 33, 34, 10, 14, 1, -5, 16, + -2, -60, -32, -51, -48, -38, -34, -42, -20, 16, 17, -16, -32, -6, 4, -39, + -18, 1, -20, -22, 55, 70, 34, 5, -1, 13, 2, 1, 28, 20, -31, -2, + 51, 26, 24, 19, 11, -1, 2, 30, 13, 2, 70, 36, 15, 24, 5, 9, + 14, 48, 43, 8, 2, -10, 18, 33, 22, -27, -19, -17, -22, 11, 19, -5, + 0, -55, -60, -49, -63, -72, -45, -80, -55, -18, -8, 32, 52, 22, 0, -40, + -42, -30, -68, -51, -9, -67, -52, -10, 7, 35, 12, 36, 64, 23, 13, 64, + 39, 32, 73, 3, 6, -10, -6, 16, 18, 53, 51, 21, -20, -15, 13, -3, + 2, -39, -30, -7, -3, 6, 10, -4, -25, -7, -10, -10, -18, -31, -23, -38, + -48, -3, -26, -43, -7, 11, 31, 62, 41, -7, -34, -42, -24, 17, 12, 44, + 25, 24, 18, 11, 32, 51, 46, 46, 51, 33, 24, 32, 30, 40, 8, -30, + -39, -30, -44, -19, -33, -55, -41, -36, -70, -67, -64, -34, -37, -46, 1, 19, + 27, 81, 23, 13, 10, -5, -18, -19, -51, -14, -48, -75, 11, 51, 43, 63, + 37, 20, 19, 4, -23, 27, 47, 71, 29, 16, 15, -17, -11, 32, 40, 22, + 6, 16, -7, 5, 34, 61, 12, -21, -24, -13, -38, -41, -36, -33, 2, 9, + -45, -54, -36, 12, -18, -41, -25, -18, 19, 31, -11, -16, -22, -62, -65, -68, + -42, -4, -48, -49, 4, 38, 65, 47, 12, -20, -20, -8, 3, 32, 69, 84, + 44, 28, 31, 18, 36, 57, 74, 35, 19, 6, 24, 29, 36, 35, 6, -13, + -25, -43, -45, -35, -33, -44, -23, -41, -57, -52, -41, -35, -21, -16, -22, -11, + 33, 42, 14, 19, 16, 0, -6, -34, -17, -37, -25, -7, 6, 48, 47, 3, + -14, -17, -19, -11, -9, -11, 42, 42, 16, 1, 6, 15, 51, 42, 33, 29, + 20, -5, -3, 4, 54, 42, 8, -30, -19, -15, -15, -20, -6, -7, -24, -32, + -24, -17, -1, -16, -18, -36, -55, -38, -2, 8, 16, 7, -21, -35, -56, -67, + -17, -58, -67, -36, 21, 67, 48, 15, 8, 13, -9, -8, -1, 21, 107, 56, + 40, 56, 32, 33, 71, 60, 36, 30, 3, 31, 15, 4, 21, 2, -2, -25, + -30, -26, -13, -9, -26, -20, -34, -34, -51, -28, 6, -9, -24, -49, -67, -54, + -54, -52, -41, -42, -58, -37, 16, 39, 31, 16, 19, 11, -4, -23, -5, 24, + 1, 10, 24, 26, 15, 34, 70, 77, 56, 33, 43, 28, 17, 25, 12, 2, + 0, -12, -15, -2, 10, -19, -28, -45, -41, -28, -17, -3, -2, -9, -3, -25, + -45, -14, 23, 10, -5, -19, -32, -22, -10, -1, -15, -16, -6, 13, 48, 70, + 55, 23, 23, 10, -8, -14, 6, 8, -12, -5, 13, 10, -14, 0, 33, 23, + 18, 43, 21, 26, 33, 13, -14, -7, -3, -31, -29, -5, -5, -25, -27, -35, + -56, -45, -21, -17, -40, -14, 2, -23, -38, -9, 8, -16, -16, -7, -13, -25, + -4, -12, -21, -14, 3, 13, 44, 65, 60, 40, 15, 5, -20, -22, -3, 3, + 20, 39, 39, 9, 6, 21, 48, 24, 25, 25, 11, 0, 4, -5, -31, -34, + -22, -45, -40, -24, -24, -41, -38, -47, -54, -45, -16, -22, -32, -7, 16, -1, + -11, 23, 31, -1, -10, -20, -19, -9, 15, -10, -28, -21, 4, 24, 45, 60, + 56, 46, 30, 26, 23, 36, 48, 33, 46, 40, 34, 19, 12, 23, 43, 37, + 41, 43, 22, 24, 11, -11, -2, -5, 8, -28, -33, -11, -5, -26, -30, -25, + -45, -21, -8, -26, -35, -37, -39, -54, -56, -20, -23, -42, -52, -49, -63, -47, + -31, -29, -16, -21, -7, 14, 26, 48, 32, 12, -10, -22, -24, -6, 0, 33, + 44, 31, 25, 15, 10, 34, 48, 38, 14, 9, 16, 12, -23, -15, -15, -8, + -9, -19, -22, -2, -8, -10, -32, -27, 4, 12, -5, 1, -1, 4, -5, -3, + -5, 10, 37, 18, -8, -19, -3, 0, -10, -5, -31, -32, -29, -2, 18, 32, + 33, 14, -12, -15, 6, 8, 36, 66, 48, 38, 37, 42, 29, 49, 50, 42, + 28, 25, 33, 15, 2, 4, 2, 4, 2, -11, -1, 6, 3, 9, -14, -12, + -5, -12, -33, -36, -29, -26, -38, -44, -42, -38, -38, -52, -67, -70, -50, -32, + -27, -29, -38, -26, -27, 1, 21, 23, 16, -17, -34, -26, -18, -20, 2, 11, + 13, 5, 10, 13, 12, 28, 33, 35, 14, 14, 14, -8, -24, -25, -8, -16, + -23, -14, 12, 8, 21, 25, 13, 25, 29, 25, 6, 3, 36, 26, 34, 11, + 30, 29, 34, 23, 0, 1, 7, 8, 1, -10, -9, -13, 5, 17, 30, 26, + 25, 3, -11, -4, -4, 9, 13, 17, 6, 4, 17, -1, -4, 9, 16, 22, + 3, -2, -4, -16, -28, -22, -13, -34, -37, -31, -9, -7, -12, -16, -26, -12, + -14, -11, -23, -16, -24, -33, -24, -30, -17, -28, -34, -44, -51, -34, -24, -22, + -25, -2, 14, 23, 38, 46, 43, 28, 10, -6, -11, 1, 0, 5, 18, 16, + -3, 12, 27, 23, 32, 48, 42, 34, 21, 21, 10, -3, -10, -10, -20, -38, + -34, -29, -22, -16, -15, -17, -9, 7, 6, 6, -6, 1, 7, 6, 3, 11, + 30, 30, 15, 11, 11, 10, 17, 22, 23, 24, 9, 15, 5, -2, 4, 3, + -17, -21, -4, -21, -6, 8, -9, -1, 0, 8, -7, -18, -16, -3, -14, -13, + -8, -17, -10, -8, -26, -37, -28, -17, -35, -17, -10, 1, -6, 1, 25, 32, + 26, 9, -18, -19, 1, -12, -20, 2, 12, 5, -4, 15, 14, 15, 15, 17, + 14, 2, 6, 3, -18, -21, -9, -1, -15, -11, -15, -22, -1, 3, -7, 0, + 14, 14, -4, -13, 4, 18, 12, 15, 19, 25, 28, 27, 12, 9, 9, -10, + -17, -4, -5, -4, -20, -19, 11, 20, 13, 0, -19, -8, 6, -9, 6, 26, + 18, 14, 17, 22, 24, 18, 21, 37, 20, 7, 11, -8, -11, -4, -3, -8, + -22, -16, -18, -15, -4, -9, -21, -10, 5, -8, -7, -17, -7, -9, -20, -28, + -35, -31, -23, -23, -29, -28, -28, -33, -28, -24, -6, 0, -4, 7, 29, 25, + 15, -6, -19, 1, -2, -22, 4, 10, 1, 9, 10, 13, 4, 6, 21, 15, + 5, 21, 11, -18, -21, -15, -3, -4, -15, -15, -19, 4, 19, 11, 2, 17, + 16, 2, 14, 14, 17, 20, 22, 20, 10, 16, 27, 12, 8, 11, 5, -9, + -10, -6, -1, -7, -12, -3, 3, 8, 9, -5, -3, 6, -5, -6, 23, 14, + 11, 12, 21, 21, 4, 18, 30, 7, 12, 25, 3, -11, -16, -15, -10, -13, + -8, -6, -21, 2, -2, -25, -18, -8, -22, -22, -17, -12, -7, -12, -15, -20, + -41, -28, -24, -23, -12, -12, -15, -10, -7, 2, 1, 6, 18, 29, 23, 21, + 20, 9, -3, -9, -9, -10, -15, -8, -11, -2, 6, 14, 7, 7, 11, 9, + 14, 2, 3, 7, 6, 6, -21, -20, -10, -12, -15, -16, -18, -14, -11, -14, + 0, 0, -5, 3, 14, 12, 9, 0, -11, 5, 5, 12, 11, -1, 5, 3, + 1, 4, -1, -1, 13, 16, 8, 14, 9, -2, -7, -11, -17, -12, -5, -9, + -10, -13, -4, 1, 0, 4, 5, 0, 2, 3, 5, 14, 18, 9, -3, 2, + 15, 14, 6, 2, 1, -1, -5, -6, 0, 0, 0, 7, 20, 22, 23, 13, + 13, 17, 20, 35, 25, 20, 20, 14, 17, 16, 3, 7, 18, 15, 13, 17, + 6, -5, -6, -13, -23, -19, -19, -22, -22, -24, -17, -18, -22, -27, -31, -30, + -29, -30, -33, -36, -34, -37, -47, -38, -24, -28, -27, -31, -30, -28, -26, -20, + -14, -14, -9, 4, 17, 21, 15, 12, 25, 29, 33, 33, 30, 30, 31, 19, + 20, 14, 4, 10, 17, 18, 21, 28, 19, 20, 20, 5, -2, -3, -7, -10, + -2, 1, 4, 6, 4, 5, 3, 2, -1, -4, -7, -10, -3, -6, -16, -5, + -1, -8, -7, -6, -9, -10, -11, -7, -6, -10, -11, 2, 11, 7, 1, 6, + 12, 16, 18, 15, 11, 14, 16, 9, 11, 6, 5, 13, 14, 13, 11, 0, + -11, -4, -4, -8, -7, -5, -6, -3, -1, 2, -1, -6, -7, -9, -9, -9, + -15, -11, -14, -17, -16, -18, -17, -12, -7, -8, -7, -6, -2, -3, -12, -15, + -15, -18, -13, -19, -23, -24, -21, -21, -13, -12, -7, -3, -7, -6, -4, 2, + 1, 1, 3, 9, 23, 28, 23, 17, 24, 27, 22, 19, 16, 19, 10, 9, + 10, 10, 19, 8, 11, 16, 15, 11, 13, 14, 7, 5, -3, -7, -12, -15, + -16, -17, -10, -5, 4, -2, -2, -9, -13, -9, -8, -10, -10, -12, -5, 3, + 7, 3, 9, 3, 4, -1, -2, 2, -4, -9, -4, 0, 4, 4, -6, -3, + 12, 10, 15, 12, 7, 7, 1, -1, 8, 11, 9, 9, 13, 17, 17, 9, + 11, 4, 0, -3, -6, -8, -9, -10, -17, -20, -24, -17, -19, -22, -20, -21, + -15, -16, -19, -23, -21, -28, -26, -15, -14, -4, -1, -6, -3, -1, 4, 9, + 2, 4, 7, 7, 11, 15, 6, 17, 24, 16, 15, 9, 6, 6, 3, 1, + 3, 2, -2, 6, 6, 6, 3, -6, -3, -8, -7, -10, -13, -17, -18, -16, + -19, -13, -9, -3, 4, 10, 7, 7, 12, 11, 13, 10, 6, 1, 2, 4, + 4, 10, 10, 7, 4, 1, 4, -5, -12, -3, 1, 10, 7, 6, 4, 19, + 22, 20, 23, 16, 15, 19, 17, 14, 9, 7, 4, 4, 2, 5, 3, 0, + 0, -7, -7, -8, -7, -14, -15, -18, -25, -21, -21, -16, -13, -14, -17, -18, + -23, -21, -23, -29, -32, -33, -30, -23, -13, -11, -10, -8, -7, -2, 1, -3, + -1, 5, 13, 17, 13, 11, 13, 16, 14, 10, 11, 8, 16, 13, 4, 0, + 7, 13, 14, 15, 15, 17, 17, 9, 8, 9, 9, 2, 5, 11, 14, 7, + 4, 11, 10, 5, 7, 2, -1, -4, -9, -16, -15, -12, -9, -15, -23, -21, + -22, -22, -20, -22, -22, -21, -22, -22, -13, -6, 4, 2, -2, 2, 7, 6, + 10, 8, 9, 12, 21, 16, 11, 7, 11, 13, 11, 10, 11, 13, 9, 6, + 6, 5, 4, -5, 1, 4, 5, -1, -2, 6, 3, 3, -3, -10, -14, -14, + -14, -16, -8, -6, -1, -6, -7, -5, -7, -6, -9, -8, -8, -4, -5, -8, + -6, 3, 12, 4, -2, 3, 1, 1, -1, -4, -4, 5, 6, 1, -4, -3, + 5, 9, 8, 18, 20, 22, 15, 11, 11, 15, 12, 9, 11, 11, 11, 5, + 10, 12, 5, 3, -2, -4, -9, -9, -16, -17, -14, -12, -14, -20, -15, -16, + -17, -17, -19, -20, -19, -15, -17, -15, -13, -2, -3, -13, -8, 0, 4, 7, + 6, 4, 11, 13, 14, 11, 5, 6, 3, -1, -2, 2, 3, -1, -2, -6, + -4, -1, -3, 0, 3, 1, -2, -5, -5, -3, -6, -9, -7, -15, -13, -10, + -8, -4, 1, 9, 7, 2, 8, 8, 9, 12, 14, 7, 12, 12, 12, 8, + 14, 19, 11, 7, 10, 13, 10, 2, -2, -6, -1, 2, 6, 3, 1, 4, + 2, 2, 5, 8, 8, 7, 7, 2, 0, -3, -6, -3, -1, -6, -12, -9, + -6, -7, -9, -10, -14, -16, -12, -12, -11, -13, -16, -16, -20, -18, -14, -10, + -8, -9, -13, -9, -8, -9, -7, -9, -8, -3, -4, -3, -6, 0, 2, 3, + -3, 2, 5, 1, 6, 5, 5, 10, 11, 17, 15, 20, 25, 20, 15, 17, + 13, 12, 11, 7, 4, -1, -2, 6, 7, 7, 9, 10, 7, 9, 7, 5, + 5, 1, -6, -2, -5, -6, -3, -3, -1, -3, -5, -3, -6, -8, -7, -8, + -11, -12, -16, -19, -19, -14, -14, -17, -17, -11, -12, -15, -6, -8, -12, -12, + -9, -7, -6, 2, 9, 6, 8, 11, 13, 15, 14, 11, 7, 3, 3, 4, + 7, 9, 10, 6, 6, 5, 7, 11, 11, 4, 1, 1, -3, -5, -1, -1, + -1, -5, -2, -1, -1, 1, 1, -3, -7, -7, -9, -12, -11, -3, -3, -7, + -6, -6, -5, -5, 0, -3, -4, -2, 2, -1, 0, 6, 7, 7, 4, 3, + 5, -1, 0, -1, -7, -9, -8, -11, -5, 0, -1, 0, 2, 2, 5, 10, + 10, 7, 7, 7, 8, 8, 9, 11, 9, 8, 9, 6, 4, 2, 0, -3, + -5, -8, -8, -12, -8, -1, -4, -4, -5, -7, -9, -6, -5, -6, -8, -6, + -3, -7, 0, 5, 6, 3, 1, 6, 6, 4, 3, 1, -2, -4, -6, -4, + 3, 7, 3, 0, -1, -3, -2, -1, -2, -5, -8, -9, -7, -9, -8, -6, + -9, -7, -9, -7, -6, -7, -6, -7, -7, -7, -7, -8, -2, 1, 2, 4, + 3, 5, 6, 10, 11, 9, 10, 12, 9, 9, 11, 9, 10, 8, 7, 7, + 6, 7, 5, 4, 5, 4, -1, -4, -3, -5, -1, -2, -4, -4, -4, -4, + -2, -2, -3, -4, -2, -1, 0, 1, 8, 8, 4, 4, 4, 2, -2, -3, + -5, -6, -9, -10, -8, -5, 2, 1, -2, -2, -2, -2, -2, -5, -5, -7, + -7, -3, -4, -6, -4, -3, -5, -7, -5, -4, -7, -9, -6, -6, -9, -7, + -6, -2, 3, 3, 4, 5, 3, 4, 5, 2, 0, 2, 3, 2, 5, 7, + 10, 9, 7, 7, 6, 4, 1, -2, -5, -6, -10, -10, -8, 2, 8, 7, + 6, 7, 5, 5, 7, 6, 3, 4, 3, 4, 1, 3, 2, 4, 2, 1, + 1, -1, -3, -3, -4, -6, -9, -9, -9, -7, -6, -5, -5, -4, -5, -2, + -1, -2, -3, -1, -1, -3, -2, 2, 2, 3, 4, 4, 2, 0, -1, -3, + -4, -4, -5, -7, -2, 2, 2, -1, -3, -1, -4, -3, -2, -4, -4, -2, + -1, -2, -4, -2, -2, -1, -2, -2, -2, -3, -2, 0, 2, 0, -2, -2, + 0, 2, 3, 5, 4, 4, 4, 6, 3, 1, 0, 0, 0, 0, 5, 5, + 4, 6, 4, 2, 0, -2, -3, -6, -9, -8, -10, -10, -2, 3, 4, 4, + 4, 5, 4, 4, 5, 4, 4, 4, 4, 2, 3, 2, 2, 2, 1, 1, + 0, -2, -3, -3, -4, -6, -8, -7, -4, -6, -3, -3, -3, -2, 1, 0, + -1, -2, -2, -1, -1, 0, 1, 0, 0, 1, 0, 0, 0, -1, -2, -3, + -3, -4, -5, -4, -3, -3, -3, -3, -3, -3, -2, -1, 0, -1, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 2, 3, + 3, 2, 2, 0, -1, -1, -2, -3, -3, -4, -5, -4, 0, 3, 3, 3, + 3, 2, 3, 4, 6, 4, 4, 3, 2, 1, 2, 1, 0, 0, -1, -2, + -3, -3, -2, -2, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, + -2, -3, -2, -3, -2, -2, 0, 0, 0, 0, 0, -1, -1, -2, -2, -3, + -2, -4, -4, -3, 0, -1, 0, 0, 0, 0, 0, 1, 2, 1, 1, 1, + 0, 0, 0, -1, 0, -1, -1, -1, -1, -1, 0, 0, -1, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, + 0, 0, -1, -1, -2, -2, -2, -2, -2, -3, -3, -1, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, -8, -33, -24, -25, -25, -26, -27, + -32, -28, -36, -31, -36, -22, -34, 11, -74, -14, 94, 41, 28, 33, 30, 40, + 34, 23, 41, 40, 60, 56, 59, 60, 44, 39, 54, 45, 52, 17, 44, 62, + 34, 33, 19, 18, 43, 35, 22, 36, -15, -10, 32, -7, -12, -6, -8, -50, + -47, -44, -4, -25, -48, -76, -58, -75, -96, -85, -118, -114, -63, -106, -103, -83, + -110, -99, -84, -76, -58, -63, -61, -51, -53, -36, -32, -41, -27, -11, 11, 8, + 27, 19, 30, 35, 28, 57, 53, 38, 71, 51, 68, 110, 78, 89, 109, 97, + 82, 94, 115, 114, 79, 70, 79, 94, 85, 76, 84, 95, 83, 82, 55, 54, + 54, 41, 41, 27, 20, 6, -11, -21, -16, -14, -33, -33, -52, -54, -59, -62, + -71, -79, -88, -88, -78, -78, -72, -71, -94, -99, -93, -90, -78, -87, -105, -103, + -79, -62, -71, -78, -63, -61, -66, -49, -23, -10, -11, -24, -20, -4, -22, 9, + 8, 27, 43, 34, 38, 51, 83, 65, 58, 74, 75, 70, 73, 71, 65, 100, + 89, 94, 65, 84, 49, 49, 61, 54, 43, 51, 58, 53, 35, 40, 36, 38, + 34, 23, 14, -12, -10, -1, -1, -11, -12, -19, -33, -66, -52, -42, -37, -55, + -42, -28, -32, -29, -35, -41, -28, -25, -46, -85, -64, -62, -55, -49, -68, -55, + -53, -52, -47, -43, -26, -32, -41, -34, -35, -40, -26, -8, -1, -6, -11, 5, + -2, 8, 3, 8, 6, 4, 20, 29, 43, 24, 33, 20, 30, 24, 39, 38, + 40, 29, 37, 36, 39, 61, 58, 41, 51, 59, 51, 55, 58, 48, 32, 45, + 40, 27, 30, 41, 44, 26, 19, 23, -3, 7, 0, -3, 2, 3, -6, -5, + -14, -6, -10, -27, -45, -47, -41, -38, -50, -51, -46, -43, -45, -65, -65, -80, + -95, -82, -74, -66, -69, -67, -33, -31, -53, -48, -51, -43, -18, -24, -24, -33, + -26, -10, 0, -17, -6, 17, 31, 2, 23, 45, 46, 12, 75, 38, 63, 69, + 31, 38, 80, 57, 48, 59, 81, 74, 32, 52, 72, 24, 60, 44, 55, 40, + 28, 48, 33, 24, 10, -2, 21, 34, 13, 18, 7, -1, -12, -20, -18, -30, + -9, -7, -30, -27, -26, -38, -20, -54, -55, -64, -53, -36, -62, -37, -71, -47, + -42, -71, -45, -55, -50, -54, -56, -36, -37, -54, -36, -12, -38, -33, -26, -7, + -22, -44, -10, 2, 3, 15, 8, 18, 6, 12, 8, 15, 28, 22, 50, 35, + 55, 42, 36, 49, 52, 64, 48, 60, 49, 60, 62, 40, 47, 68, 52, 59, + 61, 44, 53, 44, 35, 31, 31, 47, 22, 6, 4, -7, 5, -4, -21, -13, + -9, -10, -27, -46, -32, -44, -46, -62, -44, -51, -67, -53, -59, -63, -74, -67, + -61, -61, -65, -47, -58, -57, -45, -41, -46, -41, -38, -22, -25, -34, -16, -10, + -18, 0, 1, -6, 5, 17, 15, 10, 23, 38, 28, 28, 54, 40, 19, 55, + 55, 41, 46, 53, 40, 49, 51, 52, 41, 56, 39, 53, 38, 33, 35, 18, + 15, 38, 30, 23, 27, 13, 11, 7, 16, -1, 0, 0, 13, -6, -10, -15, + -10, -10, -24, -20, -16, -38, -36, -21, -40, -32, -42, -38, -52, -53, -41, -48, + -58, -50, -47, -37, -41, -45, -29, -41, -6, -48, -24, -25, -15, -9, -10, -10, + -10, -1, -17, 4, 3, 10, -4, 9, 15, 25, 24, 19, 23, 34, 28, 33, + 37, 38, 26, 36, 47, 35, 46, 45, 28, 35, 32, 32, 24, 21, 26, 23, + 19, 37, 20, 9, 29, -2, 26, 24, 8, 4, 14, 21, 11, -9, -8, 4, + -9, -31, -11, -15, -21, -24, -29, -22, -33, -26, -29, -48, -32, -44, -28, -22, + -35, -30, -38, -31, -46, -44, -36, -27, -23, -29, -24, -11, -20, -28, -13, -34, + -19, -1, 7, -3, -1, 6, -3, 5, 4, 8, 17, 26, 19, 33, 27, 16, + 35, 14, 36, 39, 22, 32, 31, 19, 32, 23, 29, 21, 30, 29, 23, 31, + 13, 24, 17, 11, 26, 18, 12, 5, 23, 16, 9, 15, -10, 3, 18, -15, + -4, -4, 6, -14, -15, -5, -34, -11, -20, -18, -8, -17, -29, -30, -29, -19, + -34, -35, -20, -36, -20, -16, -21, -38, -16, -30, -24, -25, -19, -18, -15, -7, + -5, -5, -10, -23, -3, -14, 0, -1, -12, -9, 7, 7, 2, 12, 5, 7, + 19, 10, 21, 21, 27, 30, 22, 18, 34, 22, 11, 26, 24, 20, 21, 25, + 29, 22, 27, 27, 20, 10, 20, 16, 22, 15, 16, 16, 5, 19, 10, 3, + 22, -5, -5, -7, -16, -4, -11, -22, -7, -16, -11, -23, -16, -30, -24, -28, + -20, -29, -24, -32, -22, -22, -30, -17, -23, -28, -22, -20, -21, -21, -17, -30, + -15, -14, -20, -9, 3, 6, 5, -20, 10, 13, -2, 11, 8, -1, 7, 16, + 5, 22, 23, 13, 22, 13, 22, 25, 15, 16, 11, 15, 13, 7, 12, 19, + 18, 20, 12, 23, 11, 6, 10, 1, 11, 19, 5, 20, 0, 11, 11, 1, + 14, 15, -3, -1, -7, 6, -6, -9, -9, 4, -3, -10, -20, -14, -9, -14, + -7, -10, -5, -4, -29, -14, -12, -26, -21, -27, -18, -10, -19, -27, -18, -8, + -25, -8, -13, -15, -14, -15, 5, -13, -7, -11, -4, -12, 0, 15, 5, 4, + 1, 11, 6, 4, 3, 6, 21, 19, 8, 15, 13, 6, 14, 16, 18, 17, + 20, 15, 11, 15, 24, 13, 11, 19, 7, 17, 14, 6, 17, 7, 7, 6, + 6, 5, 11, 0, 6, 0, -6, 5, 1, -11, -6, -1, -8, -9, -15, -7, + -4, -16, -17, -13, -13, -17, -14, -12, -12, -28, -13, -19, -25, -31, -24, -17, + -17, -16, -7, -15, -12, -8, -15, -8, -16, -10, -4, -1, -2, 3, 5, 2, + -2, 5, 3, 6, 10, 8, 11, 14, 14, 13, 15, 22, 16, 14, 18, 13, + 17, 19, 16, 10, 17, 8, 17, 14, 3, 14, 7, 10, 10, 7, 6, 6, + -1, 6, 1, 0, 12, -6, 6, 12, -4, -5, -4, -2, -2, -1, -2, -8, + -11, -9, -11, -11, -18, -6, -5, -16, -9, -14, -10, -13, -10, -11, -15, -14, + -14, -12, -17, -17, -17, -7, -11, -14, -15, -12, -6, -15, -5, -13, -9, 0, + 12, -2, -2, 6, 2, -7, 4, 10, 2, 9, 8, 7, 4, 5, 11, 15, + 11, 10, 18, 9, 13, 13, 13, 21, 11, 18, 19, 13, 14, 16, 6, 8, + 1, 19, 11, 10, 11, 1, 3, -1, -1, 5, -11, 5, -1, -5, -3, -13, + -10, -6, -7, -5, -15, -10, -11, -18, -8, -16, -20, -18, -9, -12, -17, -21, + -21, -13, -21, -8, -10, -10, -5, -16, -7, 2, -6, -6, -9, -7, -2, -9, + -5, 6, -7, 1, 3, -1, 2, 1, 2, 9, 8, 5, 15, 12, 1, 11, + 9, 8, 10, 15, 14, 5, 13, 17, 14, 15, 10, 7, 16, 5, 5, 5, + 8, 9, 10, 10, 7, 0, 4, 6, 9, -10, -4, 5, 2, -1, 0, -3, + -4, -5, -10, -5, -8, -9, -10, -3, -13, -6, -9, -20, -15, -11, -18, -14, + -10, -12, -20, -14, -14, -7, -12, -21, -14, -9, -8, -11, -5, -2, -7, -4, + 4, -2, -3, -1, 0, -1, 8, 6, 9, 7, 10, 6, 3, 4, 7, 10, + 11, 6, 9, 17, 11, 9, 7, -2, 16, 13, 12, 18, 5, 16, 9, 4, + 9, 6, 8, 9, 4, 4, 3, -2, -3, 2, -6, -3, 1, -7, -6, -3, + -6, -14, -8, -9, -4, -13, -9, -8, -16, -10, -12, -13, -11, -7, -8, -12, + -9, -8, -7, -11, -4, -8, -7, -8, -3, -13, -10, -3, 6, -5, -5, 0, + -5, -3, 6, -2, -2, 4, -2, 6, 2, -2, 5, 5, -2, 5, 15, 13, + 4, 6, 6, 14, 9, 4, 8, 7, 3, 11, 12, 2, 10, 7, 10, 8, + 4, 6, 2, 0, 3, 2, 4, 2, -6, -2, 2, -4, 3, -5, -6, -5, + -5, -5, -4, -8, -7, -4, -4, -7, -8, -7, -13, -10, -10, -11, -9, -8, + -8, -7, -11, -7, -3, -9, -6, -7, -3, -4, -5, 3, -3, -1, -2, -4, + 1, 4, 0, 3, 0, 5, 2, 0, 5, 4, 1, 3, 1, 0, 1, 7, + 3, 0, 4, 3, 6, 5, 0, 9, 5, 7, 6, 3, 6, 2, 3, 5, + -4, 9, 0, 4, 10, 0, 5, 1, -2, 4, -3, -3, -2, 0, 2, -7, + 3, -10, -1, -6, -9, -2, -4, -10, -3, -7, -6, -4, -10, -6, -6, -11, + -6, 0, -6, -8, -4, -1, -9, -10, 0, -6, -7, -2, -7, 1, -5, -5, + -1, 1, -6, 2, 0, -3, -1, 7, -4, 0, 7, 0, 8, 2, 3, 4, + 4, 2, 5, -1, 6, 7, 5, 6, 4, 2, 4, 6, 8, 6, 3, 1, + 8, 9, 2, -1, 4, 3, 4, 3, -3, 7, 4, 3, -2, 2, -4, -6, + -2, -5, -2, -3, 0, -5, -6, -13, -5, -6, -11, -9, -10, -5, -4, -9, + -9, -7, -7, -8, -8, -6, -5, -7, -5, -1, -3, -4, -2, -2, 2, -3, + 1, 2, -3, 1, 2, 1, 0, 1, 5, 0, 2, 5, 2, 0, 4, 1, + 7, 3, 2, 6, 0, 5, 7, 5, 5, 1, 3, 3, 5, 10, 3, 4, + 8, 2, 7, 3, -2, 3, 0, -1, -1, 1, 0, 1, -3, -2, -5, -4, + -3, -1, -7, -8, -4, -4, -10, -2, -8, -8, -8, -8, -9, -6, -8, -9, + -4, -2, -7, -5, -2, -7, -6, -9, -2, 0, -4, 4, -6, -3, -4, -1, + 2, 1, 2, 9, 0, 3, 0, 6, 4, 0, 5, 6, 2, 7, 7, 5, + 7, 6, 8, 6, 6, 5, 5, 1, 6, 5, -1, 3, 4, -1, 4, 1, + 4, 3, -5, 0, 4, 1, 4, -2, -3, -4, 0, -4, -8, -2, -5, -4, + -8, -6, -5, -3, -3, -7, -9, -6, -10, -10, -6, -6, -5, -4, -7, -6, + -4, -10, -3, -10, 0, -2, -2, -6, -1, 3, -3, -3, 1, 2, 1, 4, + 3, 4, 3, 4, 1, 2, 6, 5, 5, 5, 7, 9, 1, 5, 4, 4, + 7, 2, 9, 2, 4, 8, 2, 5, 6, 3, -2, -2, -1, -2, -1, 1, + -2, -4, 1, -6, -2, -5, -3, -5, -5, -6, -4, -3, -4, -10, -4, -3, + -8, -4, 0, -3, -5, -6, -6, -3, -1, -7, -3, 1, -1, -4, -2, 1, + -2, 0, -1, -2, 0, 0, 5, -2, 0, 3, 3, 1, 5, 2, 4, 1, + 4, 1, 2, 3, 3, 3, 4, 3, 3, 5, 1, 4, 2, 3, 1, 2, + 0, 2, 1, -2, -2, -1, 0, -2, -1, -1, -3, -5, -2, 0, -5, -1, + 0, -5, -2, -2, -2, -3, -3, -1, -4, -1, -2, -4, -2, -1, -2, -1, + 0, -3, -1, -1, 0, 1, -1, -1, 3, -4, -2, -2, 4, -2, -1, -1, + -1, 0, 0, -1, -1, -1, -1, 2, 0, -1, 2, -1, 0, -1, 2, 0, + 3, 5, -2, 1, 2, 0, 5, 0, -3, 4, -3, 1, 2, 0, 4, -1, + -2, 1, 0, 0, 0, -1, 1, -2, 0, 1, 1, 0, -5, 1, -2, -1, + 0, -2, -3, -1, -3, 0, -2, -3, -4, 1, -2, -3, -2, -2, -1, -1, + -2, -1, -4, -5, 2, -4, 0, 1, -1, 2, -2, -1, 0, 0, 1, -3, + 3, 2, 0, -2, 2, 1, 2, -2, 5, 3, -2, -2, -1, 1, 0, 0, + 1, 3, 2, 0, 0, -1, -2, 1, 1, 2, 1, 1, -1, 0, -1, -1, + -1, -3, 1, 1, 2, -2, -1, 0, 0, -2, 0, -1, -1, 2, -2, 1, + -1, 0, 0, -1, -1, -2, 0, -1, 1, -1, -1, 2, -2, 0, -1, -1, + 2, -1, 0, -3, -1, 0, 0, 0, -3, -3, -2, 0, 0, -1, -1, 0, + -4, 2, 0, -2, 0, 1, -3, -1, 2, 1, 0, -1, 0, 0, -1, 0, + 2, -1, -1, 0, 0, -2, 1, 1, 0, 1, 0, 2, -3, -2, 2, -1, + -1, 2, -2, 1, 1, 0, 0, 1, 1, 0, -4, 3, -1, 2, 0, 2, + -1, -2, 0, 1, 1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -1, + -1, 1, 0, -5, 0, -1, -1, -1, 1, -1, 1, -1, 1, 0, -2, 0, + -2, 1, -1, 1, 0, -1, -2, 0, -1, 0, 0, 2, 0, 0, 0, 1, + 0, 0, 2, 0, -1, 0, 0, 0, 2, -1, 1, 1, -1, -1, 0, 0, + 1, 1, 0, 0, 0, 0, -1, 0, 0, -2, 0, 0, -1, 1, -2, -1, + -1, -1, -2, -1, -2, 1, -1, 0, -2, -2, 1, -2, -1, 1, 0, 1, + 1, -1, -1, 0, -1, 0, 0, 0, -2, 0, -1, 0, 0, -1, -2, -2, + -2, 1, -1, 0, 0, -1, 1, 1, -2, -1, -2, -1, 1, -1, -1, -2, + -2, 0, 0, 1, -1, -1, -1, -1, -2, 2, 0, 0, 1, 1, 1, -2, + 0, -1, 0, -1, -1, 2, 0, -1, -1, -1, 1, -1, 2, 0, -1, 1, + 1, 0, 1, 0, -1, -1, -1, -1, -3, 0, 0, -1, 1, 0, 0, -2, + -2, -2, 0, -1, 0, 0, -1, 0, -1, -2, -1, -2, 0, -2, 0, 0, + -1, -2, 1, -2, 0, -1, -2, 2, 0, -1, 2, -1, 1, -1, 0, 0, + -1, 0, 0, 0, -1, 0, 1, 0, 0, 1, 0, -1, -1, 0, -2, -1, + 0, 0, 1, 0, 0, 0, 0, -1, -1, 1, -1, -2, -1, 0, 0, -2, + 0, -1, 0, 0, 0, 1, 0, 0, -1, 1, 0, -1, 0, 1, -1, 0, + -1, -2, 0, -1, 0, -1, -1, -1, 0, -1, 0, 0, 0, -1, -1, 0, + -2, 0, 0, 0, -2, -2, 0, -2, -1, -1, -1, -2, 0, -1, -1, -1, + 0, 0, -1, -1, 0, 1, -1, -1, 0, -1, 0, 0, 1, 1, 0, 0, + -1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1, 0, 0, -1, 0, + 0, -1, -1, 0, -1, -1, 0, -1, 0, -1, -1, 0, -2, -1, 0, -1, + -1, -1, -1, 0, -1, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, -1, + 0, -1, -1, 0, 0, 0, 0, 0, -1, -1, 0, -1, -1, 0, 0, -1, + 0, -2, 0, -1, -1, -1, 0, -1, -1, 0, -1, 0, 0, 0, -2, -1, + 0, -1, -1, 0, 1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, + 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, + -1, 0, 0, -1, -1, -1, 0, 0, -1, -1, 0, -1, 0, 0, 0, -1, + 0, -1, -1, 0, -2, -1, -1, -1, 0, -1, 0, -1, -1, 0, 0, -1, + 0, -1, 0, -1, -1, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, + 0, -1, -1, 0, 0, 0, -1, 0, -1, 0, 1, -1, 0, 0, 0, 0, + 0, -1, 0, 0, 0, -1, 0, 0, -1, -1, 0, 0, 0, -1, 0, 1, + -1, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, 0, 0, 0, 0, 0, + 0, -1, -1, 0, -1, -1, 0, -1, 0, -1, -1, -1, -1, 0, -1, -1, + -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, 0, -1, -1, 0, -1, 0, + -1, 0, 0, -1, 0, -1, -1, -1, 0, -1, 0, 0, 0, 0, 0, -1, + -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, + 0, -1, 0, -1, 0, 0, 0, -1, -1, 0, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 0, 0, -1, -1, -1, 0, 0, 0, -1, 0, -1, -1, + 0, -1, 0, 0, -1, -1, -1, -1, -1, 0, 0, -1, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, + -1, 0, 0, 0, 0, -1, 0, 0, -1, 0, -1, 0, 0, -1, -1, -1, + 0, -1, -1, 0, -1, -1, 0, 0, -1, -1, -1, -1, 0, -1, -1, 0, + 0, -1, 0, 0, 0, -1, -1, 0, -1, -1, -1, 0, 0, -1, -1, -1, + -1, -1, 0, -1, 0, 0, -1, -1, 0, 0, -1, 0, 0, -1, -1, -1, + 0, -1, 0, 0, -1, -1, 0, 0, -1, -1, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, + 0, 0, 0, -1, 0, -1, 0, -1, -1, -1, -1, -1, -1, 0, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, -4, 11, 6, 16, 10, -16, -48, + -44, 2, 67, 42, -17, -51, 15, 71, 12, -22, -14, -44, -35, 11, 17, -18, + 2, -15, 19, 12, -1, -44, -15, 50, 45, -25, -61, 17, 10, -10, 31, 18, + -72, -27, 57, 26, -13, -17, -2, 6, -1, -23, -54, 17, 39, 8, 30, 28, + -6, -71, -5, 33, 27, -5, 17, 10, -23, -6, 12, -26, -6, -7, -9, -14, + 11, 37, 41, 8, -33, -14, 8, -31, -38, 13, 9, 15, 35, 33, 11, 17, + -41, -48, -33, 29, 25, 16, -9, -9, -17, -19, -29, 43, 64, -2, -55, -42, + -1, -21, -4, 29, 34, -25, -67, -29, 1, 51, 49, 25, -6, -15, -48, -76, + -3, 60, 78, 33, 19, 13, -38, -35, -35, -2, 62, 19, -4, -12, -4, -4, + -32, -30, 8, 68, -43, -66, -28, 55, 51, 20, -28, -29, -19, 20, -2, 8, + 21, -15, -43, 24, 22, -7, -2, 35, 15, -2, -24, -12, 3, 31, 13, -15, + -20, -17, -17, 26, -26, 24, -3, 7, 21, 26, -3, -17, -26, -50, -26, 33, + 58, 49, -22, -67, -17, 24, 7, -57, 5, 42, -11, -3, 32, -3, 7, 13, + -11, -9, 27, 17, 1, -5, -9, -18, -19, -3, -23, -5, 7, -8, 9, 13, + 12, -5, 7, -37, 22, 26, 21, 24, -20, -35, 23, 24, -35, -15, 46, -38, + -48, -14, -4, 0, -22, 3, 43, 38, -1, -14, -8, -5, -14, 1, 21, 23, + 29, -19, -47, -42, -49, -10, 66, 77, 48, -29, -32, 1, -11, 8, 17, -17, + 3, 43, 33, -22, -19, -41, 29, 22, -42, 9, 63, 28, -23, -59, -65, 7, + 53, -22, -10, -27, -30, 36, 48, -4, -6, -22, -16, 10, 14, -7, 22, 50, + -4, -25, -41, -55, -62, 23, 68, -16, -31, 49, 57, 21, -38, 14, 12, -43, + -49, -16, 28, 7, -12, -50, -17, 49, 65, 18, 1, -8, 28, 2, -27, -13, + 12, -11, -52, 4, 31, -32, -39, 15, 8, -19, 6, 25, -1, -23, 13, 34, + 59, 36, -16, -5, -7, -28, -30, 1, -14, -42, 10, 43, 26, -25, -37, -61, + 1, 63, 62, 1, -36, -24, 38, -7, -26, 27, 10, 4, 2, -19, -22, -27, + -24, 0, 33, -8, -57, -12, 62, 77, 51, -10, -42, -27, -28, -31, -3, 5, + 21, 10, 15, -27, -18, -18, -10, 3, 17, 19, 18, -16, -20, 25, -3, -19, + -5, 32, 17, -3, -32, -8, 2, -11, -24, -17, -11, 3, 42, 15, -12, -2, + 26, 9, -4, -30, -3, 16, 7, 13, 34, 40, 114, 11, -104, -71, 7, -14, + -34, -26, 35, 45, 47, 7, -7, -16, 11, -6, -29, -32, 1, 24, 32, 10, + 29, -10, -74, -80, -20, 18, 9, 18, 61, 38, -27, -44, 13, 16, -26, 20, + 69, 14, -14, -46, -7, -6, -35, 0, 9, 5, 58, 71, -36, -78, -15, 43, + 34, -61, -101, -27, 45, 26, -10, 23, 69, 69, 5, -72, -62, 19, 16, -37, + -60, 37, 60, 10, -49, -10, -2, -1, 43, 44, 10, -50, -5, 19, 8, -43, + -58, -17, 32, 28, 4, -1, -18, -10, 13, 8, 1, 1, 22, -3, -4, 9, + -8, -9, 17, 3, -15, -8, 14, 11, -14, -11, -5, 13, -24, -34, -1, -16, + -4, 32, 35, -32, 9, 22, 12, -27, -16, 14, 15, 0, -2, -12, -31, -24, + 14, 48, 10, -14, -7, -22, 4, -8, -14, 19, 21, -21, -25, -12, 19, 24, + 19, 27, -3, -15, -16, 10, 21, -14, 3, 8, 3, -11, -33, -16, 7, 5, + -8, 2, -3, 12, 5, -34, -19, -6, 26, 19, 0, -4, -12, 5, 12, 20, + 16, 19, 18, -13, -42, -26, -1, 0, -18, -16, 10, 27, 23, -5, -7, 9, + -8, 7, 22, 10, -28, -51, -26, 13, 44, 17, 16, 25, 14, -32, -45, -36, + -40, -3, 22, 41, 34, -12, -35, -31, 18, 3, 31, 28, 4, -21, 2, -14, + -24, -23, 19, -6, -7, -10, -1, -13, -13, 21, 52, 28, 7, 1, -25, -36, + 2, 34, 10, -37, -31, -13, 19, 11, -4, -20, 15, -5, -18, 40, -13, 15, + -36, 14, 18, 17, -21, 6, -39, 21, 7, -26, 8, -33, 24, 30, 32, -11, + -26, -47, -39, 62, 10, 11, 5, -17, -21, 10, 0, 18, 15, -22, 7, 13, + 14, -8, -9, 30, 33, -34, -41, -32, 37, 24, -19, -15, 1, 2, 10, 10, + -27, -46, -14, -9, 9, 47, 1, -22, -18, 5, 37, 29, -3, -19, -19, -18, + 8, 17, 1, -11, -6, -20, 27, 37, -2, -28, -34, -3, 22, 54, 34, -31, + -43, -28, -30, -33, 26, 49, 45, 43, -15, -58, -13, -2, -27, -7, 41, 11, + 19, -50, -74, -28, 31, 75, 39, -45, -7, 99, 44, -83, -47, 45, -1, -30, + 23, 29, -55, -30, 31, 28, -19, 2, -44, -46, -49, 30, 22, 58, 31, -50, + -20, 9, -38, -53, 49, 37, -9, 13, -25, -18, 18, -27, -7, 17, 3, 24, + 57, 26, -51, -52, -54, -43, 53, 85, 31, -36, -44, 7, 13, 19, -23, -33, + 36, 47, -38, -11, 37, -19, -6, 18, 17, 2, 31, 54, -29, -72, -80, -1, + 27, 52, 10, -29, -40, -48, -72, 24, 108, 66, -44, -76, -32, -24, 21, 69, + 54, 24, -2, -8, -28, -44, -50, 34, 95, 45, -40, -72, -32, 6, 28, -1, + 18, -7, 27, 1, -14, 21, -8, -51, -62, -24, 64, 56, 12, 19, -36, -22, + 10, 20, -10, -1, -5, -51, 36, 72, -42, -51, 70, 45, -48, -27, 54, 19, + -46, 8, 0, -46, 10, 37, 35, -21, -32, -22, -44, -82, -33, 59, 105, 48, + -32, -36, -31, 18, 60, -12, -49, 10, 89, 28, 12, 8, -45, -21, -6, -16, + -32, -17, -18, 3, 29, -3, 0, -20, -51, -31, 24, 52, 1, -17, -20, 1, + 35, 15, 5, 35, 27, 18, -19, 8, -71, -74, -8, 88, 57, -45, -37, 17, + 51, -1, -13, -4, 3, -13, -24, -7, 30, -7, -25, -1, 16, -8, -43, -70, + 11, 85, 77, 12, -62, -57, 35, 53, -33, -96, 8, 82, 21, -38, 25, 39, + -1, -27, -14, 18, -16, -45, -24, 42, 7, -9, 22, 32, -39, -5, -8, -49, + -17, 60, 88, 21, -93, -20, 82, 31, -26, -63, -17, 52, -28, -25, 13, -2, + -32, -46, 55, 56, -37, 6, -57, -33, 65, 63, 5, -25, -31, 69, 86, -32, + -34, -56, -23, -47, 14, 44, -23, 19, 6, 60, -27, -69, -37, 20, -14, -5, + 50, 44, 15, 13, -23, -60, -46, 23, 40, -5, -25, 6, 46, -4, -10, -27, + -12, 28, 45, 10, -13, -33, -19, -39, 42, 32, -23, -25, 24, -17, 13, 25, + 13, -32, 13, 48, 4, -93, -5, 40, -7, 37, -39, -37, 41, 1, -13, -33, + 43, -53, 106, 8, -57, -93, 55, 40, 56, -24, -4, -19, 7, -23, -65, -18, + 34, -30, 7, 66, 92, 3, -43, -37, -23, 12, -7, -17, 14, -15, -9, -18, + 18, 51, -1, -57, -17, 23, 19, 15, -40, -1, 0, -8, 39, -13, -43, 72, + 57, -1, -54, -17, 32, -19, 11, 0, 36, 25, -23, -86, 21, -3, 14, -17, + 76, 37, 23, 2, -23, -54, -42, -80, 61, 60, 63, -12, -57, -44, 15, 35, + 26, 11, -44, -22, 8, 33, -24, -17, 21, 38, -25, -39, 16, 43, -36, -28, + 54, 10, -52, -18, -34, -14, 76, 60, 24, -32, -19, 16, -13, -68, -5, 30, + -13, -23, -14, 61, 24, 35, 39, 4, -50, -58, -39, 0, 43, 43, 21, 24, + -20, -46, -36, 38, 8, -67, -8, 61, 38, 10, -12, 5, -4, -16, -47, -5, + -18, -20, 37, 41, 24, 4, 7, -19, 11, -52, 0, 17, 20, -30, -33, -16, + 60, 34, -15, -46, -77, 14, 29, 26, 21, 25, 8, 7, 36, 23, -39, -16, + 21, 11, -23, 11, -4, -6, -35, 13, -8, -49, -17, 44, 19, -25, -17, 9, + -5, -5, -1, -31, 11, 15, 17, -8, -31, -51, 12, 54, 85, 32, 4, -58, + -35, -31, 0, 10, 21, -20, -20, -29, 15, 26, -7, 8, 4, 0, 30, 2, + -26, 2, 19, 15, -18, -13, -20, -19, 47, 33, -6, -51, -30, -12, 12, 30, + 34, 31, 4, -45, -81, -7, -22, 1, 73, 98, 24, -67, -13, 19, -32, -86, + 6, 94, 4, -47, 21, -11, -50, 22, -3, -2, 50, 20, -37, -59, 35, 28, + -16, -36, -30, -11, 4, 69, 98, -65, -84, 73, 27, -90, -17, 84, 10, -51, + -14, 40, -24, -11, 16, -34, -26, 38, -43, -34, 58, 85, -33, -51, 17, 7, + 4, 52, 25, -35, 0, 44, -21, -47, 40, 44, -69, -65, 37, 35, -21, 4, + 32, -60, -75, 21, 64, 60, -6, -11, 6, 2, -41, -34, 19, 31, 9, 7, + -1, 11, 6, -11, -26, -23, 16, 35, -39, -68, 6, 56, -3, -42, 29, 28, + 3, 28, 14, -37, -16, 11, -8, -18, 15, -1, -8, 43, -20, -67, -12, 34, + 7, -12, -9, 5, -4, 7, -12, 27, -3, -68, 26, 96, 30, -33, -28, -25, + 19, 27, -33, -48, -3, 37, -1, -35, -11, 5, 42, 36, 6, -48, -38, 26, + 54, -23, -41, 52, 44, -32, -22, 28, -23, -32, 12, 41, -16, -6, -6, -17, + -18, -14, -12, -5, 18, 52, 45, -10, -16, 29, 11, -36, -26, 7, 36, 12, + -57, -48, 48, 70, 16, 21, -13, -46, -33, -62, -63, -21, 94, 94, 20, -110, + -47, 41, 67, -16, -57, -40, 85, 71, 7, -39, 15, -29, -50, -41, 18, -40, + -42, 38, 69, 21, -8, -58, -19, 23, 24, -20, -10, 11, 41, 7, -6, -30, + -23, 2, 16, 57, 38, -11, -50, 36, -16, -51, -51, 81, 24, -68, -84, 39, + 112, 62, -79, -104, 24, 102, 15, -38, 20, 22, -49, -91, 15, 51, 30, -1, + -15, -30, -12, 17, 42, -17, -48, 0, 49, 35, 2, -19, -16, -30, 9, 17, + -12, -4, -15, 5, 34, -1, -56, -64, 7, 48, 54, -16, -51, 20, 62, -17, + -27, -9, -10, -29, -1, 35, 44, -20, -23, -2, -12, -4, 31, 24, -24, -14, + 2, -28, -27, 49, 61, -54, -61, 6, 23, -20, 2, 41, 26, 2, 15, -5, + 6, -16, -36, -16, 2, -54, -53, -18, 62, 64, 10, -3, 91, 39, -54, -103, + -5, 16, -31, -28, 75, 105, -32, -114, -52, 68, 32, -52, -19, 25, 54, 61, + 14, -40, 12, 1, -56, -31, 74, 40, -73, -66, 0, 49, 36, 24, -20, 0, + 13, -40, -99, -11, 55, 31, -33, 39, 24, 3, -18, 7, 10, 4, -29, 17, + 19, 27, -30, -41, 9, 33, -24, -25, 30, 28, -34, -57, 8, -7, -46, 5, + 48, -22, -6, 57, 58, -31, -72, -2, 72, 44, -53, -42, 41, 1, -54, 30, + 54, -6, -79, -14, 33, -6, -22, 14, 10, -5, -8, 13, 23, 21, -47, -74, + 22, 24, -10, -7, 39, 2, 12, -7, -2, 4, 33, -20, -33, 18, 22, -88, + -71, 26, 81, 14, -37, 3, -24, 6, -8, 11, 40, 18, -7, -17, 20, -8, + -15, -41, -11, 27, 52, -27, -46, 33, 21, 46, -30, -13, 26, -91, -106, -47, + 54, 109, 67, -87, -90, 38, 92, 31, -10, -69, -73, -27, -6, 24, -6, 20, + 30, 45, 33, -13, -25, 10, 57, -16, -32, 0, -14, -55, -20, 4, 7, -4, + 3, 18, -11, 34, 11, -45, -45, -125, -38, -2, 19, 72, 82, 99, 98, 35, + -51, -81, -53, 3, -39, 23, -4, -58, -63, -24, 40, 84, 48, -7, -18, -2, + -8, -20, -10, 3, 21, 17, -39, -66, -20, -2, 37, 30, 39, 34, -5, -41, + -26, 33, 40, 18, -2, 11, 13, -20, -60, -21, 33, -25, -35, 30, 65, 22, + 13, -15, 2, 16, 11, -68, -18, 74, 10, -74, -34, -39, -17, 8, 59, 39, + -22, -38, -8, 9, 30, 23, 11, -3, -12, 10, -1, 59, 9, -28, -72, -27, + 32, 68, -11, -3, 27, 4, -33, -39, 7, -1, -5, -7, 26, -14, -26, -40, + -12, 5, 5, 1, -12, 64, 63, -41, -56, 10, 26, 40, -26, -44, -42, 25, + -6, 3, -1, 10, 9, -1, 9, 1, -28, 10, 24, 26, -33, -36, 46, 20, + -43, -52, -35, 22, 53, 30, -6, 18, -16, -49, -36, 45, 10, 21, 7, 9, + -33, -50, 21, 73, 33, -42, -46, 42, -12, -18, 5, -50, -25, 68, 55, -31, + -79, -7, 77, 25, -6, 29, 78, 24, -87, -41, -30, -41, -23, 75, 35, -32, + -65, -7, -13, 3, 41, 34, -24, -33, 25, 14, -52, -28, 19, 76, 45, -45, + -47, -5, 24, 9, -14, -41, -5, 49, 22, 10, -31, -35, -1, -6, 3, 10, + -1, -12, -20, -51, 9, 79, 53, -36, -38, -13, -14, -15, 50, 50, -36, -33, + 0, 5, 22, 23, 24, -51, -81, -27, 56, 42, -10, -16, 0, 0, -5, 16, + 12, -19, 11, 10, -15, -1, -32, -17, 1, 11, 62, -16, -21, 9, 21, -29, + -50, 16, 82, 17, -35, -4, 11, 3, 8, 8, -9, -13, 10, -39, -63, -19, + 54, 58, -16, -25, 18, 38, -8, -50, -54, -17, 18, 47, 17, -33, -45, 0, + 52, 57, -5, -34, -17, 32, 10, -28, -10, -21, -3, -9, -20, 20, 47, 22, + 5, -4, -15, -37, -22, -28, 9, 37, -18, -13, 3, 15, -33, -47, 20, 73, + 0, -36, 33, 60, -11, -77, -13, 42, 13, -20, 9, 47, 22, -27, 29, 6, + -71, -78, -20, 21, 4, 27, 23, 19, 31, 45, -29, -54, -10, 37, -78, -46, + -14, 67, 108, 57, 12, -62, -108, -15, 116, 56, -58, -110, -33, 33, 30, -39, + -26, 11, 29, 22, 8, 52, 76, 31, 0, -31, -50, -10, 59, 54, -13, -84, + -65, -60, 0, 35, 105, 61, -30, -117, -62, 35, 88, 57, 48, -38, -85, 41, + 12, -21, -6, 7, 15, 73, -30, -72, -37, 25, 0, -5, 65, 76, -90, -78, + 24, 47, 2, -14, 40, 83, 0, -32, -46, -62, -26, 50, 37, -4, -44, -40, + 55, 31, -38, -13, -17, -30, -4, 7, 68, 39, 1, -23, -38, -30, 6, -35, + 14, 52, -9, -62, -47, 45, 44, 11, -17, -9, 6, 16, 34, -3, -32, -21, + -33, -3, 21, 26, -39, 11, 65, 33, 19, -1, -49, -85, -97, 66, 58, -93, + -15, 15, 5, 81, 76, 29, -2, -52, -51, -30, 65, 38, -45, -14, 1, 28, + 22, 43, 19, -59, -109, -29, 29, -14, -22, -41, 0, 54, 76, 16, 8, 23, + 15, -47, -39, -8, 5, 36, -6, -3, -4, 13, 13, 21, -47, -53, -6, -9, + -27, -44, 8, 86, 64, 12, -5, -32, -10, -20, -27, -23, 8, 30, 1, 16, + 42, -35, -8, 4, -39, -11, -62, -29, 108, 87, -20, -104, -18, -55, 8, 47, + -16, 29, 38, 4, -44, -39, -20, 38, -13, 23, 82, 30, -67, -93, 26, 79, + 20, -79, -74, -23, 33, 59, 80, 39, -42, -100, 0, 19, 38, 9, -55, 9, + -15, 22, 68, -17, -55, -23, 1, 87, 19, -56, -60, 32, 37, 38, -67, -33, + -1, 31, 24, 15, -30, -5, -36, -29, -27, 8, 27, -9, 12, 29, 38, 33, + 0, -39, -18, 6, 19, 18, 8, 1, -33, 9, -1, 2, -29, -66, 0, 41, + 6, -50, -13, 9, 73, -28, -47, -21, 30, 68, 31, 32, 29, -46, -14, 13, + -44, -75, -3, 62, 55, 9, -49, -1, 54, 19, -6, 7, 16, 38, 13, -26, + -55, -76, -23, 16, 21, -33, -22, 16, 61, 25, -14, -35, 12, 23, -7, -17, + -32, -10, -16, -1, 7, 18, -1, 19, -2, -1, 21, -14, 1, -44, -44, -23, + -29, -1, 28, -28, 47, 64, 12, -4, -15, -37, -7, 24, 50, 6, -15, -26, + -5, 20, 12, -25, -21, -2, -18, -23, 9, 16, 24, 36, -30, -35, -12, 32, + 19, -13, 19, -6, 2, -2, -22, -11, 14, 50, 10, -21, -55, -14, 23, 6, + 6, -6, -26, -25, -8, 25, 14, 24, 14, -13, 18, 11, 23, -34, -49, -45, + 6, 39, 37, 3, 0, -29, 8, 26, -6, -7, -21, 2, -11, 6, 16, -1, + -17, 6, 32, -4, -54, -9, 22, -14, 6, 27, -1, -2, 34, 33, 8, 1, + -8, -14, -32, 23, -22, -23, -29, -12, 5, 25, 22, -4, 14, 5, 24, -39, + -29, 17, -21, -80, -60, -9, 78, 99, 81, -41, -53, 22, 11, -69, -22, -2, + 70, 80, 18, -56, -54, -79, -27, 56, 46, 28, -1, 12, -37, -76, 23, 64, + -4, -5, 4, 0, -2, -5, 10, -4, -9, 5, 3, 3, -2, 6, -2, -1, + 0, 2, 0, 1, -2, 2, -3, -2, 0, 1, -1, 0, 0, -1, -1, -1, + 0, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, -1, -1, 0, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -2, -3, -5, -6, -5, -5, + -3, 0, -1, -3, -1, 7, 16, 20, 8, -8, -24, -35, -39, -36, -35, -42, + -47, -35, -14, 0, 8, 17, 28, 45, 60, 65, 64, 66, 67, 60, 50, 39, + 26, 14, 5, -14, -40, -54, -56, -56, -55, -47, -36, -20, 1, 13, 15, 16, + 12, 2, -10, -20, -33, -43, -42, -38, -43, -40, -28, -17, -7, 6, 21, 34, + 48, 60, 63, 64, 66, 61, 54, 51, 41, 23, 10, 1, -18, -37, -46, -54, + -63, -60, -46, -30, -13, 5, 15, 16, 17, 11, -2, -11, -21, -34, -44, -45, + -43, -42, -33, -21, -17, -10, 5, 23, 39, 54, 62, 61, 62, 63, 59, 53, + 47, 38, 23, 10, -5, -23, -36, -42, -51, -61, -61, -48, -26, -2, 14, 16, + 13, 13, 9, -1, -14, -27, -36, -42, -44, -48, -44, -31, -17, -10, -8, 1, + 21, 47, 65, 67, 58, 54, 58, 61, 54, 41, 31, 23, 11, -9, -30, -41, + -44, -45, -54, -61, -52, -21, 11, 25, 19, 8, 4, 7, 2, -15, -33, -39, + -39, -44, -51, -48, -34, -12, -2, -4, -2, 19, 54, 74, 72, 58, 47, 51, + 59, 54, 40, 26, 20, 7, -16, -37, -46, -44, -42, -51, -58, -47, -15, 19, + 31, 25, 9, -1, -1, -4, -15, -30, -37, -41, -51, -55, -48, -28, -11, -4, + -2, 6, 28, 58, 73, 74, 63, 50, 45, 46, 49, 42, 31, 19, -6, -30, + -43, -44, -42, -51, -54, -49, -33, -3, 18, 30, 31, 17, 2, -13, -15, -15, + -25, -31, -45, -62, -60, -45, -24, -16, -10, 6, 20, 40, 58, 68, 74, 69, + 55, 41, 37, 44, 43, 34, 15, -17, -41, -48, -46, -51, -59, -51, -34, -16, + 3, 17, 29, 33, 23, 2, -15, -18, -18, -22, -31, -50, -64, -61, -42, -30, + -24, -8, 13, 35, 50, 57, 65, 70, 70, 58, 42, 40, 41, 40, 32, 6, + -23, -45, -53, -55, -64, -60, -45, -24, -1, 10, 19, 27, 28, 23, 4, -9, + -17, -22, -23, -36, -53, -61, -60, -47, -36, -22, -3, 19, 44, 56, 60, 65, + 65, 65, 60, 52, 45, 39, 37, 23, -2, -26, -49, -63, -66, -63, -55, -42, + -16, 3, 14, 25, 25, 22, 19, 11, -2, -17, -20, -29, -44, -50, -58, -64, + -53, -32, -13, 0, 25, 45, 53, 65, 68, 61, 60, 63, 60, 47, 42, 33, + 7, -10, -26, -56, -73, -68, -57, -53, -37, -12, -1, 14, 32, 26, 16, 17, + 16, 1, -12, -19, -38, -52, -47, -55, -65, -50, -23, -9, 4, 27, 40, 48, + 68, 72, 59, 58, 67, 64, 52, 42, 21, -5, -16, -31, -60, -73, -62, -54, + -49, -34, -17, -4, 17, 32, 24, 13, 18, 20, 6, -11, -29, -46, -48, -46, + -54, -59, -41, -17, -5, 6, 20, 35, 54, 71, 68, 55, 60, 74, 71, 53, + 27, 5, -6, -16, -35, -62, -70, -57, -49, -45, -40, -25, 4, 25, 29, 15, + 7, 23, 27, 10, -20, -46, -47, -41, -39, -47, -55, -34, -11, -1, 4, 11, + 38, 67, 72, 62, 48, 61, 83, 76, 49, 9, -9, -7, -15, -31, -59, -70, + -55, -48, -46, -43, -21, 16, 29, 22, 6, 1, 25, 32, 10, -28, -57, -47, + -34, -30, -38, -49, -33, -12, -4, 3, 17, 50, 72, 68, 55, 44, 61, 86, + 77, 41, -2, -16, -10, -13, -28, -56, -69, -58, -52, -47, -35, -7, 22, 25, + 13, -4, -2, 25, 33, 7, -35, -58, -46, -29, -22, -32, -44, -34, -16, -5, + 8, 30, 59, 72, 65, 46, 39, 62, 87, 76, 33, -8, -20, -13, -10, -28, + -57, -70, -62, -51, -42, -24, 3, 23, 23, 4, -15, -4, 25, 34, 3, -38, + -55, -45, -23, -17, -32, -43, -34, -15, -1, 14, 41, 64, 73, 59, 35, 35, + 64, 89, 73, 26, -11, -23, -14, -11, -33, -60, -69, -59, -48, -39, -14, 11, + 25, 17, -11, -24, -3, 30, 35, -3, -40, -54, -41, -18, -19, -36, -41, -28, + -10, 0, 21, 51, 70, 71, 47, 24, 36, 72, 93, 65, 17, -14, -22, -13, + -17, -43, -62, -63, -52, -48, -36, -5, 19, 26, 5, -26, -27, 5, 40, 31, + -12, -42, -50, -34, -20, -28, -37, -33, -17, -8, -1, 29, 61, 75, 64, 31, + 19, 44, 85, 93, 51, 9, -15, -18, -16, -30, -50, -57, -52, -48, -52, -32, + 3, 25, 20, -10, -34, -21, 19, 42, 20, -17, -40, -43, -35, -30, -32, -32, + -21, -12, -12, 3, 37, 67, 72, 50, 25, 24, 57, 92, 81, 42, 6, -12, + -18, -25, -39, -53, -52, -44, -49, -51, -28, 6, 25, 13, -17, -32, -11, 29, + 39, 8, -24, -38, -37, -33, -36, -39, -30, -10, -3, -9, 3, 38, 68, 71, + 46, 23, 32, 68, 92, 71, 31, 5, -7, -16, -31, -50, -55, -45, -37, -49, + -53, -27, 8, 23, 8, -20, -24, 3, 34, 28, -6, -28, -32, -30, -35, -46, + -43, -23, 0, 0, -10, 5, 41, 67, 65, 42, 30, 47, 77, 83, 52, 23, + 10, 2, -16, -43, -60, -55, -38, -36, -53, -53, -25, 8, 19, 3, -14, -8, + 17, 29, 9, -17, -24, -22, -26, -43, -53, -42, -14, 4, -3, -9, 10, 44, + 63, 58, 43, 43, 63, 77, 64, 38, 24, 20, 7, -23, -52, -62, -49, -38, + -45, -57, -49, -19, 6, 11, 2, -1, 12, 22, 13, -7, -18, -15, -17, -32, + -50, -52, -32, -11, -4, -8, -3, 21, 44, 55, 53, 52, 63, 70, 64, 49, + 35, 34, 24, 0, -29, -53, -54, -50, -51, -56, -57, -37, -17, -2, 7, 9, + 20, 21, 12, 1, -13, -11, -13, -24, -36, -49, -40, -30, -22, -12, -9, 10, + 25, 38, 51, 57, 70, 71, 62, 57, 44, 42, 34, 15, -4, -30, -42, -53, + -65, -61, -61, -49, -35, -22, -2, 10, 25, 27, 15, 11, -1, -8, -14, -22, + -27, -37, -37, -37, -40, -26, -14, -2, 10, 24, 42, 54, 68, 73, 65, 65, + 60, 49, 36, 27, 15, -7, -25, -43, -63, -69, -65, -61, -54, -36, -13, 3, + 18, 26, 23, 20, 16, 1, -16, -21, -20, -31, -37, -38, -40, -38, -25, -15, + -7, 11, 34, 48, 56, 66, 71, 72, 73, 61, 43, 34, 29, 11, -14, -31, + -46, -63, -69, -72, -69, -53, -28, -7, 3, 16, 27, 30, 28, 15, -3, -14, + -19, -25, -39, -42, -37, -38, -35, -30, -19, -2, 18, 39, 47, 56, 69, 75, + 78, 71, 60, 49, 35, 22, -1, -20, -32, -50, -65, -76, -75, -63, -49, -27, + -9, 6, 22, 28, 31, 27, 16, 6, -13, -26, -36, -43, -41, -42, -42, -36, + -27, -10, 2, 18, 38, 52, 64, 70, 73, 79, 76, 70, 50, 27, 11, -5, + -21, -41, -62, -69, -72, -68, -61, -50, -26, -4, 13, 21, 23, 32, 35, 27, + 6, -21, -33, -37, -42, -48, -53, -45, -31, -19, -8, 3, 23, 45, 59, 65, + 65, 73, 88, 88, 69, 40, 19, 10, -6, -30, -54, -69, -69, -68, -67, -59, + -43, -18, 2, 10, 15, 22, 39, 46, 27, -3, -28, -34, -37, -48, -56, -60, + -48, -29, -16, -1, 14, 35, 52, 58, 60, 64, 80, 96, 88, 64, 34, 16, + 6, -11, -36, -62, -77, -75, -68, -58, -47, -33, -14, -1, 7, 15, 28, 43, + 44, 24, -6, -30, -38, -40, -49, -63, -68, -56, -30, -5, 15, 27, 40, 51, + 59, 63, 72, 84, 91, 83, 60, 32, 12, 1, -14, -45, -73, -84, -78, -62, + -46, -36, -28, -17, 0, 11, 20, 31, 38, 35, 20, -6, -28, -40, -46, -58, + -72, -71, -52, -26, 4, 26, 37, 45, 54, 64, 69, 74, 81, 80, 73, 59, + 35, 13, -5, -28, -54, -75, -79, -74, -63, -43, -30, -21, -11, 0, 14, 23, + 29, 33, 23, 14, -2, -25, -41, -58, -69, -71, -64, -43, -24, 3, 33, 47, + 56, 60, 64, 73, 74, 75, 73, 62, 56, 38, 13, -12, -42, -57, -69, -77, + -71, -63, -44, -25, -15, -3, 2, 13, 26, 23, 24, 19, 8, -2, -24, -44, + -64, -74, -64, -60, -45, -16, 9, 34, 53, 63, 68, 66, 75, 73, 63, 66, + 62, 49, 34, 11, -17, -43, -54, -66, -82, -72, -52, -43, -28, -10, 0, 4, + 18, 27, 16, 13, 20, 8, -11, -26, -47, -66, -63, -59, -63, -47, -7, 20, + 34, 56, 69, 65, 73, 81, 67, 54, 61, 63, 44, 25, 6, -23, -37, -44, + -69, -85, -69, -48, -39, -26, -7, -4, 5, 27, 25, 9, 10, 15, 5, -17, + -34, -52, -62, -54, -54, -60, -40, -5, 21, 41, 59, 67, 66, 78, 81, 64, + 53, 58, 56, 39, 18, -3, -24, -34, -45, -64, -76, -67, -51, -37, -21, -8, + -3, 11, 22, 20, 11, 9, 11, -4, -23, -38, -56, -57, -53, -50, -42, -31, + -5, 21, 41, 63, 67, 72, 77, 69, 67, 58, 56, 49, 28, 16, -8, -28, + -35, -50, -53, -62, -65, -53, -44, -20, -2, 2, 14, 10, 14, 17, 7, 5, + -13, -27, -37, -60, -58, -55, -42, -22, -18, -2, 13, 36, 69, 73, 76, 71, + 62, 70, 60, 53, 42, 23, 16, -13, -35, -45, -51, -40, -46, -58, -60, -52, + -17, 4, 8, 11, 5, 14, 15, 4, -4, -20, -23, -37, -62, -67, -59, -27, + -2, -3, -3, 3, 36, 70, 77, 75, 66, 67, 70, 57, 46, 32, 29, 19, + -17, -49, -62, -46, -25, -33, -54, -68, -51, -15, 4, 8, 6, 11, 18, 8, + -7, -19, -16, -12, -35, -68, -83, -56, -9, 13, 7, -7, 4, 40, 66, 73, + 69, 73, 80, 69, 46, 27, 31, 42, 24, -23, -68, -69, -36, -14, -25, -57, + -66, -43, -16, -3, -2, 11, 28, 23, -2, -31, -29, -4, -1, -34, -83, -89, + -45, 3, 22, 6, -3, 16, 41, 56, 55, 68, 93, 93, 65, 23, 12, 38, + 53, 27, -38, -80, -64, -29, -12, -31, -54, -49, -34, -22, -24, -11, 28, 47, + 25, -24, -51, -27, 5, 5, -43, -90, -79, -34, 6, 11, 4, 17, 31, 39, + 34, 38, 79, 114, 105, 50, 3, 12, 44, 56, 16, -49, -72, -54, -28, -29, + -44, -37, -27, -28, -41, -45, -5, 46, 61, 17, -44, -53, -20, 7, -6, -53, + -78, -62, -27, -7, -6, 14, 41, 45, 26, 11, 38, 93, 127, 101, 34, 1, + 20, 48, 42, -1, -41, -53, -45, -40, -51, -44, -18, -9, -34, -61, -47, 7, + 57, 58, 2, -46, -43, -14, -5, -27, -52, -58, -46, -31, -26, -12, 28, 59, + 45, 10, 6, 50, 104, 124, 87, 30, 11, 30, 40, 19, -9, -26, -35, -44, + -58, -62, -38, -4, -6, -46, -67, -37, 21, 56, 43, -4, -37, -30, -15, -25, + -40, -44, -38, -38, -43, -38, -9, 40, 64, 37, 5, 14, 65, 106, 107, 75, + 36, 26, 34, 24, 4, -8, -10, -24, -53, -70, -64, -30, 0, -16, -53, -61, + -22, 28, 43, 29, -2, -21, -20, -26, -39, -43, -34, -26, -43, -54, -40, 0, + 46, 56, 30, 12, 30, 75, 97, 90, 69, 47, 38, 29, 13, 2, 0, -1, + -27, -61, -71, -55, -25, -14, -32, -50, -41, -6, 22, 25, 17, 4, -8, -19, + -31, -38, -35, -28, -35, -53, -54, -29, 7, 31, 32, 23, 28, 51, 72, 78, + 72, 65, 55, 42, 30, 19, 15, 11, -8, -36, -58, -58, -42, -35, -35, -43, + -40, -18, 0, 12, 14, 11, 9, -4, -15, -25, -31, -28, -36, -49, -53, -45, + -18, 1, 12, 19, 23, 43, 58, 64, 68, 64, 64, 57, 46, 40, 28, 22, + 9, -17, -35, -48, -47, -44, -47, -45, -44, -31, -12, -2, 7, 10, 9, 7, + -2, -8, -19, -28, -32, -44, -51, -48, -37, -21, -9, 5, 16, 26, 43, 55, + 60, 64, 63, 61, 58, 55, 48, 34, 21, 6, -13, -27, -39, -49, -53, -50, + -46, -41, -32, -16, -3, 5, 11, 9, 6, 5, -4, -17, -32, -40, -42, -44, + -42, -40, -32, -12, 5, 17, 24, 35, 50, 58, 64, 64, 60, 65, 61, 50, + 34, 18, 10, -2, -18, -38, -58, -56, -49, -45, -41, -38, -22, -4, 8, 14, + 8, 11, 10, -5, -20, -38, -41, -36, -37, -40, -48, -37, -12, 4, 14, 19, + 27, 46, 59, 66, 63, 62, 70, 64, 50, 34, 22, 17, 8, -11, -38, -59, + -57, -50, -49, -47, -43, -28, -6, 10, 16, 10, 14, 8, 1, -5, -5, -4, + -5, 5, 2, 2, 1, -1, 0, 1, 0, 2, 0, 0, -2, -1, -1, 2, + 1, 1, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, -1, + 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, + -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, + -1, 0, 1, 0, 0, 0, 1, 0, 1, 0, -3, -10, -11, -8, -13, -25, + -21, -10, 0, 2, 18, 41, 44, 42, 66, 62, 28, 10, 17, 17, -16, -10, + 25, 28, 29, 34, 47, 34, -7, 7, 25, -12, -43, -44, -40, -61, -85, -78, + -55, -42, -33, -10, 17, 31, 43, 59, 51, 25, 25, 40, 27, -1, 2, 25, + 30, 15, 12, 27, 26, 13, 16, 9, -24, -43, -37, -49, -83, -92, -62, -40, + -42, -36, 1, 33, 34, 45, 61, 46, 27, 32, 33, 10, -6, 15, 38, 26, + 4, 15, 35, 19, 7, 17, 3, -26, -41, -50, -67, -91, -82, -48, -40, -46, + -24, 18, 33, 32, 54, 62, 46, 30, 22, 20, 7, 4, 28, 33, 15, 10, + 22, 25, 9, 13, 18, -2, -29, -54, -65, -74, -86, -68, -49, -46, -32, -8, + 17, 29, 45, 65, 60, 43, 23, 13, 17, 12, 18, 28, 22, 19, 16, 13, + 14, 16, 24, 13, -13, -40, -66, -72, -75, -74, -64, -55, -36, -20, -9, 15, + 43, 63, 65, 51, 37, 17, 9, 19, 23, 21, 19, 24, 21, 3, 4, 24, + 31, 18, -2, -20, -49, -77, -74, -65, -71, -69, -47, -27, -27, -10, 38, 66, + 59, 52, 51, 34, 4, 11, 36, 26, 12, 22, 26, 2, -11, 25, 45, 18, + 0, -1, -23, -72, -83, -55, -65, -83, -61, -34, -37, -36, 23, 71, 55, 43, + 60, 55, 11, 1, 40, 37, 8, 16, 31, 6, -22, 14, 55, 27, -3, 8, + 2, -52, -83, -57, -56, -89, -79, -43, -43, -55, -4, 66, 61, 35, 56, 68, + 31, 4, 32, 46, 13, 7, 31, 16, -24, -4, 50, 42, 2, 7, 16, -25, + -67, -60, -54, -86, -95, -55, -44, -63, -32, 40, 62, 40, 47, 67, 48, 22, + 32, 42, 18, 4, 25, 25, -15, -16, 29, 44, 21, 11, 15, -5, -39, -49, + -59, -85, -96, -72, -52, -62, -50, 7, 45, 49, 50, 56, 56, 43, 42, 39, + 19, 9, 16, 21, 1, -16, 9, 32, 31, 24, 14, 5, -14, -34, -52, -81, + -94, -85, -71, -62, -55, -21, 21, 41, 53, 55, 55, 57, 51, 44, 26, 13, + 15, 11, 3, -3, 0, 19, 27, 29, 26, 11, 0, -16, -41, -70, -90, -88, + -85, -80, -57, -34, -3, 26, 42, 57, 57, 60, 64, 50, 33, 20, 17, 9, + -6, -1, 6, 10, 23, 26, 28, 22, 10, 1, -27, -60, -78, -87, -90, -94, + -74, -42, -20, 10, 34, 44, 57, 65, 71, 58, 35, 30, 23, 8, -5, -7, + 4, 7, 19, 33, 23, 19, 24, 17, -13, -53, -65, -75, -96, -98, -83, -61, + -40, -7, 32, 38, 38, 66, 83, 65, 36, 36, 37, 8, -7, 1, 0, -5, + 11, 39, 34, 10, 21, 36, 4, -45, -59, -59, -89, -106, -84, -67, -62, -32, + 21, 41, 30, 47, 85, 80, 41, 34, 45, 20, -8, 0, 9, -7, -6, 31, + 45, 21, 12, 32, 25, -27, -55, -52, -76, -104, -95, -70, -64, -57, -7, 33, + 34, 38, 67, 84, 57, 35, 46, 29, -1, -4, 7, 7, -8, 12, 41, 31, + 21, 24, 25, -5, -43, -45, -65, -98, -98, -82, -62, -58, -35, 13, 27, 38, + 59, 70, 67, 45, 49, 39, 2, -3, 2, 9, 9, 6, 30, 30, 24, 31, + 20, 3, -26, -37, -48, -91, -100, -88, -75, -53, -41, -9, 12, 23, 55, 65, + 61, 54, 51, 51, 14, -6, 1, 1, 15, 18, 26, 29, 16, 30, 28, 4, + -14, -29, -36, -71, -100, -93, -87, -64, -38, -16, 2, 6, 33, 61, 59, 56, + 54, 55, 32, 1, -3, -4, 5, 25, 36, 36, 17, 14, 25, 14, -4, -19, + -30, -53, -84, -94, -95, -82, -49, -16, 4, 2, 10, 37, 56, 61, 58, 54, + 42, 19, 3, -9, -8, 14, 41, 53, 32, 10, 7, 10, 10, -7, -25, -43, + -65, -81, -97, -99, -72, -29, 9, 11, 3, 10, 33, 61, 65, 55, 46, 30, + 19, 0, -17, -5, 29, 62, 57, 24, -1, -6, 10, 8, -16, -35, -54, -64, + -80, -105, -99, -57, -2, 26, 13, -2, 6, 42, 67, 60, 49, 36, 31, 22, + -10, -24, 1, 49, 77, 53, 9, -14, -4, 10, -4, -26, -47, -56, -58, -89, + -115, -93, -34, 23, 33, 6, -6, 16, 50, 62, 53, 39, 34, 40, 16, -24, + -26, 15, 71, 82, 38, -5, -13, -1, 3, -13, -39, -53, -48, -61, -103, -119, + -80, -6, 42, 27, -1, 2, 26, 51, 56, 43, 33, 43, 42, 4, -34, -23, + 37, 87, 70, 20, -6, -10, -3, -5, -27, -49, -48, -44, -72, -115, -118, -56, + 22, 43, 17, 3, 12, 33, 51, 45, 34, 38, 51, 38, -11, -42, -9, 59, + 86, 53, 13, -5, -5, -3, -19, -42, -50, -43, -45, -85, -127, -105, -28, 34, + 37, 15, 8, 23, 41, 42, 34, 33, 45, 55, 26, -27, -38, 12, 69, 77, + 40, 9, 1, 0, -13, -33, -48, -49, -39, -55, -102, -124, -83, -8, 37, 31, + 14, 19, 35, 39, 34, 30, 35, 51, 50, 9, -31, -25, 27, 72, 65, 30, + 12, 9, -2, -23, -42, -52, -46, -43, -71, -109, -112, -63, 7, 36, 25, 20, + 33, 42, 35, 29, 29, 40, 52, 35, -2, -28, -12, 40, 69, 51, 26, 18, + 13, -8, -33, -48, -50, -46, -57, -84, -107, -98, -43, 14, 29, 24, 30, 44, + 43, 30, 26, 34, 44, 40, 19, -8, -20, 4, 46, 59, 42, 29, 25, 10, + -18, -40, -46, -47, -57, -73, -91, -100, -78, -30, 13, 25, 30, 44, 48, 39, + 29, 31, 41, 35, 23, 9, -9, -5, 16, 43, 52, 40, 37, 25, 0, -23, + -41, -43, -54, -74, -82, -93, -86, -60, -26, 12, 26, 41, 53, 44, 40, 33, + 36, 38, 19, 12, 2, -3, 9, 18, 40, 48, 42, 41, 16, -6, -23, -41, + -45, -68, -84, -86, -90, -71, -52, -22, 15, 32, 52, 54, 45, 45, 36, 36, + 25, 6, 6, 0, 5, 15, 21, 41, 46, 46, 37, 10, -7, -24, -42, -57, + -81, -88, -88, -83, -62, -43, -14, 16, 41, 59, 55, 48, 48, 40, 27, 10, + 2, 2, 0, 8, 22, 30, 36, 45, 50, 32, 5, -9, -23, -48, -75, -86, + -86, -88, -81, -54, -26, -11, 16, 52, 65, 55, 50, 53, 39, 9, -2, 4, + 2, -4, 11, 36, 34, 27, 47, 51, 26, 0, -9, -23, -63, -91, -85, -81, + -89, -79, -38, -13, -11, 23, 62, 67, 55, 52, 56, 29, -8, -7, 7, 0, + -5, 19, 44, 30, 28, 49, 46, 21, -2, -10, -32, -79, -96, -83, -81, -87, + -67, -27, -11, 0, 36, 65, 67, 58, 54, 48, 14, -15, -7, 3, 1, 6, + 26, 35, 30, 38, 46, 37, 18, -2, -18, -48, -85, -96, -89, -81, -70, -52, + -30, -8, 20, 48, 63, 66, 59, 50, 33, 6, -14, -15, -2, 13, 20, 21, + 25, 36, 45, 42, 31, 12, -10, -31, -56, -84, -103, -96, -70, -50, -43, -31, + 0, 35, 58, 68, 65, 51, 37, 26, 8, -19, -25, 2, 27, 27, 17, 20, + 36, 45, 45, 29, 0, -27, -41, -55, -87, -111, -93, -57, -37, -33, -23, 5, + 41, 70, 77, 59, 36, 26, 24, 4, -24, -22, 7, 31, 33, 19, 14, 29, + 49, 50, 22, -16, -39, -48, -63, -92, -104, -86, -51, -25, -19, -16, 10, 53, + 82, 74, 47, 26, 19, 16, -1, -18, -16, 7, 35, 37, 18, 10, 31, 55, + 41, 4, -25, -45, -57, -73, -90, -95, -82, -42, -9, -8, -11, 20, 71, 84, + 57, 39, 27, 13, 2, -6, -9, -12, 8, 45, 41, 8, 5, 42, 56, 20, + -10, -24, -50, -73, -83, -83, -87, -76, -25, 10, -5, -9, 39, 84, 71, 44, + 38, 26, 2, -9, -2, -4, -11, 17, 52, 36, 0, 11, 50, 43, 3, -19, + -31, -57, -84, -84, -77, -82, -59, -9, 14, 1, 7, 55, 81, 61, 38, 29, + 20, -2, -10, -1, -4, 0, 26, 42, 30, 8, 20, 41, 28, -4, -31, -46, + -64, -84, -82, -79, -66, -37, -7, 15, 18, 30, 58, 68, 57, 33, 17, 9, + 0, -3, -7, 0, 15, 23, 31, 29, 23, 24, 22, 14, -12, -43, -63, -72, + -73, -83, -75, -47, -26, -2, 20, 37, 48, 50, 57, 52, 30, 6, -1, 11, + 0, -9, 7, 16, 24, 28, 32, 33, 15, 7, 2, -21, -55, -79, -66, -67, + -81, -63, -38, -12, 9, 29, 53, 48, 42, 51, 47, 22, -6, 5, 18, -4, + -7, 6, 22, 28, 26, 39, 28, 2, -2, -8, -35, -73, -76, -56, -67, -77, + -55, -20, 4, 16, 40, 54, 42, 41, 51, 37, 7, 0, 17, 13, -12, -9, + 20, 31, 25, 29, 33, 15, -5, -8, -22, -57, -74, -62, -57, -74, -71, -33, + 0, 11, 26, 44, 45, 41, 47, 45, 22, 3, 12, 19, 0, -15, 4, 30, + 32, 27, 26, 17, 3, -4, -14, -44, -69, -66, -56, -63, -74, -52, -11, 12, + 21, 29, 35, 41, 49, 51, 31, 9, 11, 19, 11, -8, -7, 20, 36, 34, + 22, 10, 6, 5, -4, -33, -64, -66, -58, -58, -67, -63, -29, 4, 20, 21, + 21, 35, 52, 57, 39, 12, 10, 18, 16, 3, -7, 8, 31, 39, 25, 5, + 3, 10, 5, -22, -58, -67, -58, -56, -60, -64, -45, -11, 15, 19, 12, 24, + 50, 62, 46, 17, 9, 18, 20, 12, 0, 2, 21, 37, 31, 7, 0, 11, + 14, -12, -51, -66, -58, -53, -54, -59, -54, -29, 3, 16, 9, 17, 44, 62, + 51, 22, 8, 17, 24, 21, 9, 1, 11, 30, 31, 14, 3, 11, 16, -4, + -43, -65, -58, -49, -50, -53, -55, -43, -16, 5, 10, 16, 38, 59, 54, 26, + 7, 18, 29, 24, 18, 8, 5, 16, 27, 23, 11, 14, 18, -1, -36, -63, + -56, -43, -48, -47, -49, -52, -36, -12, 8, 17, 35, 55, 50, 28, 9, 17, + 33, 25, 24, 20, 5, 4, 15, 27, 23, 20, 22, 0, -32, -58, -55, -40, + -47, -44, -39, -52, -54, -34, -2, 19, 35, 53, 46, 27, 12, 18, 34, 26, + 26, 33, 13, -6, 0, 22, 34, 32, 28, 3, -31, -53, -51, -39, -47, -45, + -30, -45, -66, -56, -19, 15, 38, 52, 43, 22, 13, 22, 35, 26, 26, 41, + 25, -7, -13, 10, 35, 46, 39, 10, -29, -50, -46, -37, -47, -46, -27, -35, + -65, -72, -42, 2, 38, 55, 43, 19, 11, 24, 36, 27, 26, 43, 37, 2, + -19, -6, 25, 53, 56, 20, -24, -46, -43, -36, -46, -48, -29, -28, -56, -77, + -64, -22, 31, 61, 45, 16, 10, 23, 35, 30, 26, 41, 42, 16, -14, -21, + 7, 51, 70, 36, -15, -38, -40, -35, -42, -49, -35, -29, -44, -71, -81, -49, + 14, 60, 50, 18, 10, 21, 34, 34, 26, 37, 43, 30, 0, -27, -13, 37, + 74, 54, 2, -29, -35, -32, -37, -49, -42, -32, -36, -57, -85, -73, -12, 46, + 57, 27, 9, 17, 32, 38, 28, 30, 41, 39, 18, -20, -27, 15, 62, 68, + 26, -17, -30, -28, -29, -45, -51, -40, -34, -45, -77, -86, -42, 18, 54, 43, + 14, 12, 29, 42, 34, 25, 33, 41, 30, -2, -24, -5, 36, 65, 50, 3, + -24, -24, -19, -33, -54, -52, -42, -45, -61, -75, -58, -15, 32, 48, 25, 10, + 24, 45, 45, 27, 26, 32, 28, 13, -4, -6, 14, 44, 55, 24, -11, -18, + -12, -20, -46, -57, -53, -54, -57, -63, -57, -33, 4, 35, 32, 16, 22, 40, + 49, 36, 26, 28, 23, 17, 8, 1, 10, 27, 43, 33, 5, -6, -8, -14, + -33, -53, -57, -61, -62, -61, -59, -38, -10, 15, 26, 20, 26, 40, 44, 41, + 30, 27, 25, 18, 12, 3, 9, 26, 33, 28, 13, 5, 5, -8, -25, -45, + -57, -60, -64, -66, -65, -49, -17, 6, 13, 16, 26, 43, 47, 39, 32, 27, + 27, 25, 13, 3, 6, 22, 35, 26, 13, 10, 12, 5, -17, -40, -54, -58, + -58, -68, -74, -61, -31, -1, 9, 10, 23, 40, 50, 45, 31, 24, 27, 31, + 20, 3, 2, 17, 32, 31, 16, 12, 15, 12, -4, -31, -51, -55, -54, -62, + -76, -73, -47, -17, 2, 8, 19, 37, 51, 50, 34, 24, 26, 31, 25, 9, + 4, 13, 26, 34, 25, 9, 13, 20, -2, -33, -44, -43, -58, -78, -77, -59, + -44, -33, -10, 17, 6, 12, -9, 32, 13, 4, -4, 6, -9, 27, 8, 2, + -1, -3, -2, 3, -4, -3, 2, 0, -2, 1, -2, 1, -4, 2, 1, 0, + -2, -1, -3, 2, 0, -1, -2, -2, -2, -1, -2, -2, -1, -2, -2, -2, + -2, -1, -2, -1, 0, -1, -2, -2, -2, -1, 0, -2, -2, -2, -2, -1, + -1, -2, -1, -2, -2, -2, -3, -1, -1, 0, 0, -1, -3, -2, 1, 3, + 0, 0, -2, -8, -21, -17, -2, 12, 20, 19, 6, -13, -28, -73, -67, -64, + -58, -39, -11, 19, 38, 60, 96, 80, 38, 12, 6, -20, -65, -83, -65, -61, + -56, -17, 22, 35, 49, 74, 94, 55, 16, 20, -5, -52, -89, -81, -53, -65, + -36, 21, 37, 48, 51, 85, 82, 25, 23, 9, -36, -80, -105, -58, -57, -54, + 7, 36, 54, 44, 58, 97, 48, 26, 16, -21, -61, -115, -83, -45, -57, -12, + 23, 57, 54, 36, 86, 77, 37, 21, -16, -40, -103, -110, -54, -46, -24, 6, + 43, 68, 36, 62, 86, 60, 30, -12, -34, -80, -119, -76, -44, -24, -5, 24, + 64, 51, 50, 76, 72, 48, 0, -34, -68, -106, -94, -56, -26, -7, 11, 45, + 59, 58, 66, 71, 60, 23, -27, -68, -93, -93, -72, -37, -8, 10, 25, 50, + 70, 68, 62, 62, 45, -10, -70, -88, -83, -79, -57, -15, 15, 13, 31, 73, + 80, 59, 53, 61, 15, -67, -89, -73, -75, -75, -33, 21, 11, 10, 66, 92, + 65, 42, 63, 42, -56, -92, -66, -66, -84, -57, 16, 19, -5, 50, 98, 76, + 39, 56, 60, -35, -95, -64, -53, -84, -79, 0, 28, -8, 29, 96, 89, 42, + 46, 69, -10, -90, -69, -41, -74, -95, -25, 28, -1, 13, 81, 101, 53, 37, + 69, 11, -77, -75, -38, -53, -103, -55, 22, 8, 6, 61, 104, 75, 29, 59, + 31, -61, -76, -43, -36, -91, -88, 6, 17, 1, 46, 96, 94, 34, 40, 48, + -40, -80, -47, -27, -69, -107, -27, 26, 4, 29, 87, 105, 51, 24, 46, -10, + -76, -58, -21, -49, -107, -62, 17, 16, 17, 70, 110, 67, 22, 38, 10, -60, + -71, -24, -28, -97, -85, -6, 25, 18, 50, 106, 84, 28, 31, 16, -38, -71, + -38, -17, -78, -94, -30, 15, 30, 41, 86, 92, 44, 31, 15, -25, -54, -53, + -26, -57, -88, -51, -2, 33, 45, 68, 88, 59, 35, 17, -15, -42, -55, -41, + -48, -73, -60, -19, 24, 50, 61, 74, 67, 46, 21, -8, -32, -48, -54, -53, + -57, -57, -34, 9, 50, 63, 59, 65, 58, 29, -1, -24, -38, -62, -67, -48, + -47, -40, -8, 43, 68, 48, 58, 66, 38, 6, -19, -26, -62, -85, -45, -35, + -39, -21, 28, 72, 41, 47, 74, 45, 15, -14, -17, -53, -102, -50, -24, -36, + -26, 10, 69, 42, 32, 81, 52, 21, -4, -15, -39, -109, -64, -12, -35, -26, + -1, 54, 47, 21, 79, 65, 20, 7, -12, -33, -100, -82, -8, -27, -32, -2, + 36, 47, 21, 66, 77, 25, 12, -2, -36, -88, -87, -18, -16, -36, -8, 27, + 36, 30, 56, 77, 39, 12, 6, -33, -84, -79, -30, -11, -29, -20, 19, 27, + 31, 58, 66, 50, 21, 5, -25, -81, -75, -32, -17, -17, -27, 2, 24, 28, + 61, 61, 48, 35, 4, -22, -71, -77, -31, -19, -12, -23, -18, 16, 29, 59, + 65, 45, 41, 10, -23, -59, -76, -37, -14, -11, -18, -29, -2, 29, 57, 68, + 51, 37, 16, -21, -55, -67, -44, -12, -5, -21, -29, -19, 19, 59, 68, 61, + 36, 14, -12, -55, -61, -44, -16, 3, -21, -29, -25, 0, 55, 72, 69, 43, + 8, -6, -49, -63, -39, -18, 5, -15, -31, -26, -18, 39, 78, 75, 53, 8, + -8, -40, -67, -37, -15, 2, -8, -30, -26, -29, 16, 79, 84, 59, 14, -11, + -33, -66, -42, -9, -2, -6, -23, -26, -33, -7, 66, 94, 67, 22, -9, -32, + -62, -48, -8, 0, -9, -16, -20, -35, -24, 46, 96, 78, 31, -2, -29, -59, + -51, -13, 1, -10, -13, -9, -31, -35, 23, 86, 88, 42, 5, -22, -57, -53, + -18, -3, -10, -13, 0, -19, -44, 2, 69, 90, 57, 12, -13, -50, -57, -21, + -9, -13, -13, 1, -3, -41, -17, 51, 82, 69, 23, -9, -37, -57, -25, -12, + -22, -15, 0, 10, -25, -32, 32, 69, 71, 37, -4, -25, -48, -30, -12, -32, + -23, -3, 14, -2, -33, 11, 56, 63, 49, 3, -18, -32, -31, -13, -37, -38, + -9, 11, 17, -16, -6, 41, 53, 51, 11, -17, -15, -23, -14, -35, -54, -22, + 4, 26, 10, -10, 26, 43, 46, 19, -19, -6, -5, -10, -30, -65, -42, -9, + 24, 35, 3, 12, 32, 37, 24, -20, -8, 14, 2, -23, -68, -62, -26, 10, + 50, 28, 11, 22, 27, 24, -19, -19, 24, 21, -8, -63, -78, -45, -11, 47, + 53, 23, 21, 19, 22, -17, -34, 21, 40, 15, -48, -89, -65, -34, 30, 68, + 44, 27, 16, 16, -11, -47, 3, 49, 39, -22, -89, -82, -55, 3, 68, 61, + 44, 21, 11, -6, -53, -21, 45, 56, 11, -74, -96, -72, -26, 52, 73, 60, + 39, 10, -3, -48, -44, 27, 61, 42, -43, -101, -88, -52, 27, 73, 70, 59, + 21, -1, -40, -60, 2, 52, 60, -4, -90, -100, -74, -2, 62, 72, 76, 42, + 5, -30, -66, -22, 34, 63, 33, -62, -104, -92, -31, 44, 68, 84, 66, 21, + -21, -64, -41, 13, 54, 55, -26, -94, -104, -57, 20, 56, 82, 84, 43, -6, + -57, -54, -10, 36, 60, 7, -70, -107, -78, -6, 40, 73, 92, 66, 12, -45, + -57, -27, 16, 52, 29, -41, -96, -90, -32, 20, 60, 91, 83, 34, -27, -52, + -37, -3, 34, 36, -15, -77, -91, -52, -1, 43, 83, 93, 53, -5, -42, -40, + -17, 14, 32, 1, -54, -81, -65, -21, 23, 71, 96, 67, 16, -25, -37, -24, + -5, 21, 6, -36, -64, -69, -37, 3, 54, 93, 73, 35, -6, -28, -25, -19, + 8, 4, -27, -46, -65, -46, -14, 34, 86, 73, 49, 15, -17, -19, -28, -4, + -3, -28, -32, -56, -48, -24, 15, 74, 67, 55, 36, -2, -10, -28, -14, -9, + -36, -25, -42, -50, -29, 1, 60, 59, 50, 55, 16, -3, -22, -20, -14, -46, + -29, -28, -48, -33, -5, 47, 50, 40, 64, 40, 4, -14, -17, -19, -53, -40, + -18, -40, -41, -6, 39, 39, 28, 61, 62, 17, -10, -7, -21, -59, -53, -20, + -28, -47, -11, 38, 29, 15, 52, 77, 36, -6, 1, -12, -63, -66, -25, -20, + -46, -19, 37, 28, 0, 38, 83, 54, 5, 5, -2, -57, -81, -34, -15, -44, + -22, 29, 31, -4, 16, 85, 68, 17, 15, 1, -44, -87, -54, -8, -42, -27, + 25, 24, 2, 0, 69, 88, 24, 25, 11, -42, -76, -75, -14, -25, -40, 23, + 18, -3, 3, 42, 96, 45, 22, 29, -39, -70, -75, -40, -8, -39, 7, 24, + -17, 8, 33, 79, 76, 22, 35, -21, -75, -64, -60, -15, -17, -14, 21, -21, + -4, 40, 59, 88, 45, 24, -3, -71, -61, -59, -38, 1, -14, 0, -17, -18, + 41, 54, 82, 74, 22, -3, -53, -61, -53, -54, -2, 3, -19, -25, -22, 30, + 57, 73, 92, 38, -15, -40, -51, -50, -58, -17, 17, -23, -44, -22, 19, 55, + 72, 97, 60, -22, -40, -35, -45, -55, -32, 14, -17, -60, -26, 11, 46, 75, + 97, 78, -17, -46, -23, -38, -45, -37, -1, -14, -66, -31, 3, 34, 80, 98, + 85, -4, -47, -19, -33, -33, -30, -20, -25, -63, -34, -4, 18, 79, 104, 84, + 9, -38, -18, -29, -27, -14, -30, -46, -63, -32, -5, 3, 68, 111, 84, 18, + -23, -12, -25, -28, -2, -25, -67, -75, -29, 1, -6, 46, 112, 91, 22, -11, + 0, -18, -33, -1, -9, -76, -96, -34, 9, -8, 22, 101, 102, 27, -2, 14, + -7, -36, -9, 4, -68, -114, -48, 13, -3, 5, 80, 109, 40, 4, 26, 6, + -33, -18, 6, -52, -120, -67, 7, 4, -1, 55, 103, 58, 14, 31, 17, -21, + -24, -4, -39, -110, -84, -10, 6, 2, 34, 87, 71, 29, 36, 25, -7, -23, + -16, -33, -96, -90, -29, -1, 6, 22, 68, 75, 45, 45, 31, 4, -15, -24, + -37, -84, -87, -43, -15, 3, 18, 53, 68, 57, 58, 38, 11, -7, -22, -45, + -81, -79, -48, -29, -10, 17, 45, 57, 61, 71, 50, 17, 0, -15, -49, -85, + -74, -45, -40, -25, 10, 42, 49, 55, 82, 65, 22, 7, -9, -43, -89, -80, + -34, -47, -40, -1, 35, 52, 43, 85, 84, 25, 17, -4, -38, -85, -92, -28, + -44, -55, -9, 21, 53, 42, 75, 100, 35, 22, 6, -38, -74, -99, -38, -34, + -65, -18, 12, 42, 51, 63, 102, 52, 25, 21, -36, -70, -90, -56, -30, -64, + -30, 7, 27, 55, 63, 90, 69, 33, 26, -26, -69, -79, -66, -43, -54, -37, + -1, 17, 49, 69, 79, 72, 50, 30, -15, -61, -75, -68, -58, -52, -33, -12, + 9, 42, 69, 78, 64, 60, 42, -9, -49, -71, -69, -68, -61, -25, -17, -1, + 38, 64, 77, 59, 62, 58, -3, -37, -62, -72, -72, -73, -24, -12, -11, 35, + 55, 73, 59, 58, 69, 8, -29, -48, -75, -76, -82, -31, -4, -14, 28, 49, + 63, 61, 54, 73, 22, -21, -36, -71, -82, -88, -42, 0, -9, 21, 43, 53, + 57, 56, 73, 33, -12, -25, -62, -89, -95, -49, -2, -2, 18, 37, 43, 49, + 60, 75, 38, -2, -16, -49, -89, -105, -54, -7, 1, 19, 31, 37, 38, 59, + 81, 39, 4, -7, -35, -83, -115, -62, -10, 0, 20, 27, 32, 30, 53, 87, + 43, 4, 0, -24, -70, -118, -75, -12, -2, 19, 24, 27, 27, 45, 89, 52, + 4, 1, -14, -55, -113, -87, -18, -3, 13, 20, 24, 28, 41, 85, 60, 7, + -3, -9, -40, -100, -91, -28, -4, 7, 10, 21, 30, 43, 82, 62, 13, -8, + -11, -26, -85, -87, -36, -10, 2, -4, 14, 35, 47, 81, 62, 18, -9, -21, + -20, -65, -78, -38, -19, -4, -16, 0, 39, 54, 85, 65, 20, -7, -31, -24, + -47, -62, -33, -26, -15, -25, -19, 35, 63, 90, 73, 22, -3, -39, -39, -35, + -43, -20, -26, -30, -34, -36, 24, 71, 94, 85, 29, -3, -40, -58, -34, -24, + -4, -16, -46, -47, -47, 6, 73, 100, 97, 42, -4, -39, -73, -45, -8, 12, + 0, -51, -64, -56, -13, 66, 104, 106, 64, 2, -40, -82, -63, -3, 27, 18, + -43, -82, -68, -28, 51, 104, 112, 86, 19, -42, -86, -81, -10, 40, 34, -26, + -90, -86, -41, 31, 98, 116, 104, 46, -38, -92, -95, -25, 46, 48, -6, -84, + -105, -55, 13, 84, 117, 114, 76, -20, -95, -105, -45, 41, 54, 8, -65, -112, + -70, -1, 65, 109, 115, 100, 14, -85, -106, -62, 21, 50, 13, -44, -104, -84, + -14, 45, 98, 112, 111, 53, -62, -105, -75, -3, 44, 12, -31, -85, -93, -27, + 27, 82, 110, 110, 81, -27, -95, -81, -27, 31, 11, -31, -66, -90, -39, 12, + 61, 106, 107, 94, 12, -73, -79, -48, 11, 13, -32, -57, -78, -46, -1, 38, + 97, 109, 96, 43, -41, -69, -62, -13, 13, -30, -58, -68, -46, -11, 17, 81, + 112, 97, 59, -7, -51, -67, -37, 6, -23, -62, -67, -42, -14, 2, 60, 110, + 99, 65, 20, -24, -63, -56, -7, -15, -63, -75, -40, -12, -8, 39, 102, 103, + 67, 35, 6, -48, -68, -25, -11, -56, -85, -46, -7, -10, 22, 86, 107, 72, + 41, 29, -25, -70, -42, -14, -42, -91, -62, -5, -6, 9, 67, 105, 84, 40, + 40, 3, -64, -56, -23, -30, -83, -85, -12, 3, 1, 50, 97, 96, 44, 36, + 28, -45, -69, -33, -22, -67, -101, -34, 13, 2, 31, 88, 104, 56, 28, 37, + -16, -71, -51, -18, -49, -103, -62, 9, 14, 18, 70, 109, 68, 26, 36, 6, + -58, -68, -23, -28, -97, -84, -7, 23, 19, 50, 106, 84, 28, 31, -21, -26, + -18, -30, -24, -77, -76, -48, -46, 31, 0, -1, 0, 0, 2, 0, 1, -2, + 1, 0, -6, -7, -5, -3, 0, -3, -4, -2, 2, 0, -8, -11, -14, -10, + -8, -4, 6, 13, 14, 9, 2, -6, -10, -9, -6, 9, 17, 15, 8, 0, + 1, -4, -12, -19, -14, -8, -4, 3, 6, -2, -4, -6, -7, -10, -8, -12, + -11, 3, 23, 27, 11, 4, -3, -5, 0, -9, -3, 6, 11, 19, 4, -8, + -17, -20, -21, -3, 5, 8, 2, 3, 5, 2, -3, -3, -12, 4, 1, 3, + -7, 0, 5, 6, 0, -7, -8, -5, -7, -5, -3, 4, 9, 5, -5, -5, + -5, -17, -7, 3, 17, 15, 7, -2, -5, -3, 3, -8, -5, -3, 3, 8, + 12, 5, -10, -27, -20, 1, 5, -4, -9, -17, 4, 10, 9, -2, -12, -16, + -12, -2, 8, 16, 13, 11, 16, 19, 10, -2, -16, -21, -11, 14, 15, 21, + 11, 6, -10, -8, -11, -24, -35, -31, -13, 9, 24, 17, -2, -11, -20, -11, + -19, -7, 3, 8, 22, 21, 21, 2, -7, -10, 12, 24, 18, -3, -19, -6, + 0, -5, -18, -17, 6, 12, 7, -16, -20, -22, -27, -19, -14, 12, 14, 3, + 0, 2, 8, -3, -5, -3, 21, 29, 17, 6, -8, 3, 3, 10, 10, 3, + 12, 4, -9, -18, -20, -20, -9, 6, 3, -9, -7, -14, -9, -8, -9, -23, + -19, 7, 17, 20, 9, 8, 5, 9, 18, 9, 8, -10, -10, -4, 9, 25, + -6, -19, -19, -5, -4, -7, -7, -17, -15, -7, -4, 0, 2, -2, -17, -4, + 14, 23, 15, 2, -7, -5, 9, 11, 1, 0, -3, 0, 0, 15, 14, -4, + -15, -20, -26, -22, -13, 0, 6, 12, 5, -10, 2, 8, -2, -18, -8, 6, + 20, 28, 23, 0, -16, -7, 9, 7, 10, -12, -21, -19, 7, 12, 4, -17, + -28, -24, -3, 14, 4, -19, -18, -9, 11, 22, 16, -13, -23, -15, 18, 32, + 32, 17, -4, 1, 14, 11, 1, -20, -19, -3, 9, 13, -4, -13, -16, -18, + -23, -12, -17, -16, -20, -15, -14, -4, 8, 12, 0, 8, 5, 12, 17, 26, + 25, 14, 10, 11, 11, 18, 15, 4, -9, -13, -8, -9, -14, -20, -28, -32, + -12, -9, -16, -17, -24, -18, -12, 5, 10, 4, 6, 8, 18, 35, 31, 17, + 1, 12, 21, 33, 18, 6, -10, -11, -4, -9, -13, -19, -24, -24, -24, -18, + -20, -18, -20, -13, -15, -10, -9, -5, 8, 10, 13, 23, 26, 29, 14, 13, + 13, 13, 16, 25, 19, 17, 4, -15, -18, -15, -14, -17, -34, -23, -16, -12, + -16, -26, -33, -23, -15, -4, 4, 10, 16, 19, 22, 29, 28, 7, 1, 2, + 18, 26, 30, 21, 9, 3, -4, -10, -16, -29, -31, -27, -4, -9, -11, -28, + -23, -17, -15, -13, -11, 4, 11, 9, 13, 16, 25, 18, 8, 10, 18, 17, + 8, 18, 17, 11, -5, -19, -17, -12, -19, -38, -27, -8, 0, -3, -14, -19, + -20, -14, -10, -13, -3, 6, 12, 26, 38, 34, 14, 2, -2, 11, 19, 14, + 8, 5, 16, 9, -7, -19, -24, -29, -36, -26, -13, -12, -22, -28, -20, 5, + -3, -10, -19, 7, 20, 18, 17, 24, 25, 14, 18, 19, 29, 21, 11, 10, + 9, 13, -13, -29, -27, -20, -24, -30, -22, -12, -7, -15, -22, -21, -13, -14, + -20, -8, 12, 26, 25, 21, 33, 27, 25, 16, 13, 16, 16, -2, 2, 11, + 9, -2, -17, -18, -16, -25, -25, -26, -27, -30, -35, -30, -12, -6, -6, -6, + -5, 19, 19, 11, 15, 17, 24, 23, 34, 28, 23, 13, 2, 9, 18, 16, + -14, -18, -12, -7, -9, -31, -37, -33, -24, -14, -24, -20, -16, -21, -15, -7, + 5, 9, 15, 20, 28, 38, 29, 21, 15, 22, 17, 4, 12, 6, 12, -4, + -9, -15, -16, -19, -40, -38, -34, -23, -18, -17, -8, -10, -3, -7, 1, 3, + 4, 11, 13, 36, 41, 36, 24, 9, 17, 20, 21, 14, -5, -9, -11, -8, + -19, -14, -24, -30, -23, -18, -25, -30, -24, -17, -20, -9, -3, 6, 8, 22, + 23, 20, 27, 18, 10, 10, 14, 18, 14, 23, 17, 6, 5, -4, -8, -26, + -19, -24, -25, -24, -21, -27, -28, -15, -19, -16, -9, 0, 7, 9, 17, 14, + 15, 24, 30, 29, 29, 32, 16, 10, 8, 0, -3, -10, -7, -17, -22, -25, + -30, -36, -32, -25, -26, -22, -12, -16, -11, -3, 5, 7, 13, 21, 21, 26, + 32, 28, 26, 28, 31, 17, 15, 15, 5, -4, -14, -18, -28, -25, -24, -28, + -32, -33, -32, -29, -18, -17, -20, -10, -4, 6, 6, 18, 22, 22, 37, 38, + 31, 27, 26, 23, 22, 23, 12, 4, -5, -2, -11, -19, -25, -35, -35, -36, + -36, -43, -32, -24, -20, -12, -7, -3, -7, 3, 13, 23, 29, 35, 37, 35, + 42, 33, 26, 22, 17, 12, 6, 4, -9, -23, -28, -34, -34, -33, -31, -40, + -36, -27, -25, -22, -30, -20, -11, 2, 12, 22, 22, 26, 28, 35, 47, 44, + 27, 29, 29, 29, 19, 2, 1, -9, -15, -21, -34, -35, -34, -40, -44, -42, + -34, -31, -26, -21, -9, -12, -3, 10, 17, 29, 26, 27, 34, 48, 50, 34, + 33, 25, 21, 16, 8, 3, -8, -11, -25, -30, -37, -37, -42, -51, -34, -28, + -21, -26, -25, -19, -13, 4, 9, 17, 29, 41, 33, 33, 44, 45, 32, 31, + 28, 22, 16, 5, -10, -13, -16, -23, -38, -39, -39, -45, -54, -40, -32, -24, + -22, -17, -14, 0, 6, 9, 18, 41, 43, 34, 32, 40, 40, 31, 30, 27, + 22, 19, 14, -2, -16, -21, -34, -48, -45, -41, -41, -41, -45, -38, -25, -21, + -17, -20, -7, 11, 17, 19, 36, 40, 42, 44, 47, 46, 39, 33, 26, 15, + 11, 8, -5, -19, -24, -29, -40, -44, -48, -44, -37, -37, -43, -43, -26, -19, + -14, -2, 13, 23, 31, 36, 36, 43, 41, 47, 46, 44, 40, 24, 15, 14, + 3, -12, -21, -23, -30, -36, -47, -51, -50, -47, -44, -46, -31, -19, -16, -11, + 2, 16, 20, 25, 29, 40, 53, 51, 49, 45, 41, 35, 25, 18, 7, 5, + -12, -18, -23, -34, -39, -56, -58, -54, -49, -50, -45, -35, -26, -12, -5, 6, + 17, 29, 41, 42, 47, 50, 46, 49, 50, 50, 39, 30, 16, 2, -8, -15, + -21, -30, -41, -49, -50, -46, -57, -63, -57, -41, -29, -24, -12, -3, 5, 12, + 22, 33, 41, 50, 51, 53, 57, 55, 46, 36, 29, 16, 2, -4, -11, -21, + -33, -40, -49, -47, -53, -60, -58, -51, -42, -34, -23, -13, -2, 5, 17, 27, + 39, 49, 48, 51, 56, 54, 58, 44, 37, 28, 18, 4, -3, -15, -29, -39, + -49, -49, -51, -62, -65, -64, -47, -42, -36, -26, -14, -5, 10, 24, 32, 45, + 50, 49, 62, 65, 63, 47, 42, 41, 36, 23, 7, -7, -22, -31, -41, -53, + -58, -62, -59, -62, -56, -54, -50, -44, -32, -16, 0, 11, 25, 35, 50, 54, + 55, 56, 66, 65, 62, 54, 45, 36, 23, 14, -4, -22, -44, -55, -52, -62, + -61, -66, -70, -68, -60, -54, -45, -29, -15, 4, 21, 34, 36, 44, 54, 62, + 70, 73, 68, 67, 59, 50, 37, 21, -5, -12, -25, -39, -48, -53, -63, -76, + -73, -71, -71, -67, -57, -45, -29, -12, 2, 13, 30, 42, 51, 61, 76, 71, + 63, 66, 71, 60, 50, 40, 23, -2, -9, -20, -41, -54, -59, -72, -79, -71, + -64, -73, -68, -60, -51, -36, -13, 2, 13, 27, 47, 54, 71, 78, 71, 60, + 72, 74, 65, 54, 39, 28, 7, -6, -23, -50, -59, -64, -69, -75, -70, -78, + -74, -73, -64, -52, -37, -13, 6, 18, 40, 51, 58, 64, 78, 79, 75, 68, + 64, 68, 57, 45, 21, 4, -16, -34, -50, -65, -75, -83, -80, -71, -69, -68, + -73, -63, -57, -36, -16, 6, 26, 45, 60, 70, 71, 79, 79, 81, 78, 80, + 64, 55, 36, 16, -4, -23, -38, -54, -63, -69, -81, -85, -87, -76, -72, -66, + -61, -52, -30, -12, 12, 24, 44, 55, 69, 78, 85, 84, 74, 70, 71, 71, + 62, 41, 17, -11, -25, -42, -55, -66, -75, -87, -87, -81, -74, -76, -76, -63, + -48, -32, -13, 7, 30, 51, 64, 76, 80, 82, 83, 81, 80, 82, 70, 61, + 42, 19, 0, -28, -49, -61, -72, -78, -87, -90, -89, -88, -87, -82, -69, -54, + -33, -13, 15, 36, 58, 68, 79, 90, 96, 90, 84, 86, 89, 79, 62, 38, + 22, -3, -29, -55, -69, -81, -89, -94, -94, -94, -94, -89, -74, -62, -52, -35, + -18, 14, 39, 54, 65, 76, 87, 98, 95, 94, 90, 82, 75, 69, 47, 26, + -6, -33, -57, -72, -82, -88, -97, -90, -91, -88, -83, -80, -75, -59, -33, -9, + 20, 42, 58, 68, 82, 90, 94, 93, 94, 88, 85, 77, 65, 43, 16, -10, + -37, -60, -71, -84, -89, -95, -97, -102, -95, -84, -80, -72, -57, -26, -4, 19, + 42, 62, 80, 89, 94, 97, 100, 99, 90, 83, 71, 65, 39, 14, -9, -43, + -65, -83, -90, -95, -98, -96, -100, -96, -88, -76, -66, -51, -24, -12, 21, 45, + 70, 85, 93, 95, 97, 101, 105, 92, 84, 69, 58, 35, 16, -14, -44, -68, + -86, -88, -96, -101, -101, -102, -97, -90, -74, -69, -50, -19, 9, 35, 56, 76, + 84, 92, 98, 96, 99, 97, 93, 84, 77, 59, 24, 2, -30, -52, -76, -87, + -93, -98, -100, -102, -100, -96, -89, -81, -73, -46, -18, 12, 36, 62, 82, 88, + 96, 104, 107, 105, 102, 92, 84, 77, 53, 26, -6, -35, -57, -75, -81, -92, + -103, -114, -111, -108, -98, -88, -83, -67, -35, -7, 20, 39, 60, 70, 89, 106, + 116, 107, 103, 99, 86, 90, 82, 53, 18, -13, -31, -52, -73, -92, -102, -106, + -104, -97, -106, -99, -101, -92, -72, -42, -5, 16, 38, 66, 86, 101, 99, 101, + 95, 112, 107, 99, 95, 81, 53, 16, -3, -29, -60, -81, -102, -98, -102, -102, + -112, -114, -101, -104, -88, -69, -34, -8, 14, 41, 67, 92, 94, 99, 103, 104, + 115, 109, 103, 90, 78, 52, 22, 0, -39, -65, -92, -95, -91, -103, -104, -118, + -110, -102, -93, -84, -71, -36, -15, 19, 52, 81, 94, 89, 98, 103, 115, 117, + 102, 92, 83, 80, 49, 23, -11, -43, -67, -90, -93, -102, -105, -110, -118, -104, + -100, -89, -83, -64, -36, -7, 28, 50, 74, 88, 95, 104, 103, 115, 107, 106, + 97, 87, 74, 50, 20, -17, -47, -75, -89, -93, -101, -102, -115, -117, -106, -97, + -88, -90, -73, -38, 2, 36, 60, 75, 84, 96, 104, 115, 115, 102, 98, 96, + 96, 84, 52, 10, -12, -32, -53, -71, -87, -101, -109, -112, -109, -106, -105, -102, + -92, -74, -48, -19, 7, 33, 56, 76, 91, 101, 108, 111, 111, 108, 103, 96, + 85, 63, 33, 1, -27, -51, -73, -90, -102, -109, -112, -110, -107, -103, -100, -93, + -76, -50, -19, 10, 36, 58, 76, 91, 101, 108, 111, 111, 108, 103, 96, 85, + 63, 33, 1, -27, -51, -73, -90, -102, -109, -112, -110, -107, -103, -100, -93, -76, + -50, -19, 10, 36, 58, 76, -1, -2, -15, 21, -17, 23, -30, 1, 34, -34, + 6, 5, -15, 19, 1, -25, 6, 20, -2, -28, 15, 10, -15, 0, -7, 10, + 7, -5, -9, -6, 19, -3, -21, 3, 20, -4, -20, 1, 16, -3, -8, -2, + 5, 1, -8, -6, 3, 9, 2, -13, -4, 15, -7, -9, 0, 3, 6, -7, + -7, 5, 8, -8, -4, 0, 1, 1, -6, -4, 7, 2, -2, -7, 0, 4, + -3, -4, 0, 2, 0, -2, -4, 1, 4, -2, -4, -3, 1, 3, -5, -4, + 4, 3, -6, -5, 4, -1, -2, -3, 0, 3, -3, -1, -4, 3, 3, -5, + -3, 1, 1, -2, -3, 1, 2, -2, -4, 0, 0, 0, -1, -3, 1, 1, + -3, -2, 1, 0, -2, -2, 0, 0, -2, -1, 0, -1, 1, -2, -2, 1, + 0, -2, 0, -1, 0, -1, -1, -1, 0, 0, -1, -3, 1, 1, -2, -2, + 0, 1, -1, -2, -1, 0, 0, 0, -2, -1, 1, 0, -3, 0, 2, -1, + -2, 0, 0, 0, -2, 0, -1, 0, -1, -1, 1, 0, -1, 0, -1, 1, + 0, -13, 5, 7, -11, 24, -50, 41, 4, -29, 14, -11, 8, 11, -15, -12, + 15, 18, -21, -14, 22, -2, -11, -3, -3, 18, -3, -5, -14, 9, 22, -24, + -16, 23, 12, -23, -8, 9, 10, -4, -8, -3, 11, -4, -14, 0, 8, 8, + -5, -14, 8, 10, -12, -4, -2, 10, 0, -11, -3, 11, 0, -7, -2, -1, + 7, -6, -8, 3, 6, 0, -3, -8, 7, 2, -7, -2, 2, 1, -2, -4, + -1, 3, 3, -4, -5, 1, 3, -3, -6, 2, 5, -1, -7, -1, 3, -1, + -4, -3, 5, 0, -3, -2, -1, 4, -1, -5, -1, 3, -1, -4, -1, 3, + 1, -4, -2, 1, 0, -2, -3, 0, 2, -1, -4, 1, 1, -1, -2, -2, + 1, -1, -3, 0, 0, 0, -1, -2, 0, 0, -2, -1, 0, -1, 0, -2, + -1, 0, -1, 0, -1, -2, 2, -1, -2, -1, 0, 1, -2, 0, -1, -1, + 0, -1, -2, 0, 1, -1, -3, 0, 1, -1, -3, 0, 1, -2, -1, 0, + 0, -1, -1, 0, -1, -1, -1, -1, 0, 0, -1, -1, 0, 0, -2, 0, + 0, 0, 0, -2, 1, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, + -1, 0, 0, -1, 0, -1, 1, 0, 0, 0, 1, -1, -1, 0, 0, 0, + 1, -2, 4, -3, 3, -40, 71, -73, 67, -27, -68, 127, -80, 3, 5, 1, + 17, -14, 1, -30, 53, -3, -42, 15, 19, -9, -17, -1, 13, 16, -17, 4, + -32, 43, 15, -68, 18, 54, -38, -7, -1, 11, 7, -3, -18, 5, 25, -27, + -9, 9, 19, -6, -12, -8, 20, -1, -15, -1, 1, 17, -10, -16, 12, 12, + -13, 0, -6, 10, 2, -16, -1, 14, -4, 4, -11, -2, 12, -6, -8, 4, + 4, -2, -4, 1, -2, 4, 3, -7, -5, 8, 0, -10, 1, 4, 2, -4, + -6, 4, 1, -1, -7, 1, 8, -9, 2, -5, 3, 3, -4, -3, 0, 3, + -3, -5, 4, 3, -3, -4, 0, 2, 0, -3, -4, 5, 0, -5, -1, 2, + 0, -3, 0, -1, 2, -2, -4, 3, 0, -1, -2, -1, 2, -2, -2, 1, + -1, 0, -1, -3, 1, 1, -2, 1, -3, 1, 1, -3, -1, 1, 0, -1, + -2, 1, -1, -1, 1, -2, 1, -1, -1, -1, -1, 0, 1, -3, 0, 0, + 1, -4, 0, 1, -2, 0, -2, 0, 0, 0, -2, 1, -1, 0, -2, 0, + 2, -2, -1, 0, -1, 2, -2, -1, 1, -2, 0, -1, 1, -1, -1, -1, + 1, -2, 1, -1, -1, 2, -3, 0, 0, -1, 1, -1, 0, 1, 0, -2, + 0, -1, 1, -2, 0, 0, -1, 1, 0, -2, 0, 1, -2, 1, 0, 0, + -1, 0, 1, -1, -1, -1, 1, 1, -1, 0, 0, 0, -1, 1, 0, -1, + 1, 0, 0, 1, 0, -1, 1, 0, 3, -40, 58, -39, 12, 42, -117, 108, + 1, -66, 22, 17, 0, -9, 10, -39, 42, 4, -23, -12, 28, 3, -34, 9, + 17, 3, -9, 10, -29, 13, 53, -79, 3, 64, -26, -24, 16, -9, 14, 2, + -8, -15, 31, -9, -30, 11, 29, -15, -7, 0, 3, 6, -4, -9, -6, 22, + 1, -24, 9, 11, -8, 0, -2, 2, 8, -12, -6, 10, 2, 2, -9, -4, + 11, -2, -10, 3, 2, 3, -5, -1, 1, -1, 6, -4, -8, 9, 2, -8, + -3, 6, 3, -4, -3, -1, 6, -2, -8, 0, 9, -4, -3, -2, 2, 4, + -4, -1, -1, 4, -2, -6, 4, 2, -1, -4, 0, 1, 2, -3, -5, 3, + 3, -3, -4, 3, 0, -1, 0, -2, 2, 0, -3, 0, 3, 0, -3, -1, + 2, 0, -3, 1, 0, -1, 2, -2, -2, 2, -1, 0, -1, -1, 1, -1, + -2, 0, 0, 1, -3, 1, 0, -1, 1, -2, -1, 2, -2, -1, 0, -1, + 2, -3, -1, 1, 1, -2, -2, 2, 1, -2, -1, 0, 0, 1, -3, 1, + 0, 0, 0, -2, 3, 0, -2, 0, 0, 1, 0, -1, 1, -2, 0, 0, + 0, -1, 1, 0, 0, 0, -1, 1, -1, 1, 0, -1, 1, -2, 0, 1, + 1, 0, 1, -2, 1, 0, 1, 0, 0, 3, -1, 0, 1, 0, 0, 3, + -29, 35, -12, -16, 56, -88, 39, 62, -79, 5, 29, 1, -13, 12, -29, 26, + 17, -28, -3, 12, 5, -11, -19, 28, 1, -5, 9, -21, -7, 60, -56, -20, + 57, -10, -27, 21, -21, 16, 12, -12, -21, 24, 6, -29, 4, 19, 2, -7, + -5, -3, 7, 6, -11, -9, 11, 13, -18, -4, 13, 1, -3, -6, -1, 10, + -8, -6, 5, 3, 5, -3, -11, 4, 9, -11, 0, 4, 3, -4, -1, 0, + 0, 7, 0, -14, 7, 5, -7, -4, 4, 5, -1, -4, -4, 4, 1, -4, + -4, 7, -1, -1, -3, 0, 5, -1, -4, -1, 2, 0, -3, 1, 1, 2, + -2, -4, 1, 2, 0, -5, 2, 3, -2, -2, 1, 1, -2, 2, -3, 0, + 0, -1, -1, 0, 1, 0, -3, 0, 0, -1, 1, -1, -2, 1, -1, 0, + -2, 2, 1, -2, -1, 1, 0, -1, -1, 0, 1, -1, 0, -2, 1, 1, + -1, 0, -1, -1, 0, 0, -1, -1, 0, -1, -1, 2, -2, -1, 1, 0, + 0, -1, -1, 1, 0, -1, 1, -1, 0, 1, -3, 1, 1, -1, -1, 0, + 1, 0, 0, 0, -1, 0, 0, -1, 0, 1, 0, 0, 2, -2, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, -1, -1, -7, -9, 35, -52, + 59, -33, -32, 64, -15, -41, 19, 22, -20, 9, -11, -3, 33, -27, 2, 7, + -9, 19, -37, 24, 7, -11, 11, -1, -30, 37, 8, -57, 36, 19, -33, 14, + 0, -17, 26, 1, -20, -5, 26, -18, -13, 14, 7, -6, 4, -9, -4, 11, + 3, -14, -7, 20, 0, -18, 10, 1, 4, -5, -7, 6, 0, -3, -2, -2, + 8, 5, -11, -6, 10, -1, -10, 6, -2, -1, 1, -3, 0, 3, 5, -9, + -5, 9, -3, -4, 1, 1, 3, -1, -4, -1, 2, -2, -5, 5, -3, 0, + 1, -5, 4, 2, -3, -3, 0, 0, -2, 1, 0, -2, 3, -2, -5, 2, + 2, -2, -4, 3, 0, -2, 1, -2, -2, 5, -2, -6, 1, 2, -1, -1, + 0, 1, -1, -2, -1, -1, 2, 0, -4, 0, 1, 0, -3, 0, 2, 0, + -3, 0, 0, 1, -1, -1, 1, 0, -1, -2, 1, 0, 0, -1, 0, -2, + 1, 0, -1, 1, -1, 0, -2, 1, 1, -2, -1, 2, -2, 1, -3, 1, + 1, -1, 0, 0, -1, 1, 0, -2, 2, -1, -1, 0, 0, 1, 0, 1, + 0, -2, 1, 0, 0, -1, 1, 0, 0, 0, 0, -3, -20, 45, -56, 40, + -5, -34, 27, 24, -42, -1, 29, -14, -4, 2, -7, 24, -20, -1, 18, -25, + 25, -29, 9, 21, -26, 14, 4, -20, 7, 27, -42, 5, 31, -24, -2, 19, + -30, 21, 8, -11, -17, 20, 1, -22, 11, 7, -7, 6, -5, -7, 3, 11, + -6, -18, 11, 16, -20, 1, 5, 2, -3, -3, 0, -3, 4, -1, -7, 2, + 10, -9, -8, 7, 2, -9, 5, -1, -5, 2, 1, -3, -2, 9, -5, -8, + 4, 1, -5, 0, 1, 2, -1, 0, -5, 4, -1, -5, 4, -3, 1, 1, + -5, 3, 0, 0, -3, 0, -1, -2, 1, 2, -5, 2, 1, -5, -2, 3, + -1, -5, 2, 1, -4, 2, -1, -4, 2, 3, -7, -1, 2, 0, -2, 1, + 0, -2, -1, 0, -3, 1, 2, -3, -2, 3, 0, -3, -1, 1, 0, -1, + -2, -1, 1, 0, 0, -1, 0, 0, -2, 0, 0, 1, -2, 2, -3, 1, + 0, 0, -2, 1, 0, -1, 0, 0, -1, -1, 2, -3, 0, 0, -1, 0, + 0, -1, 1, 0, -4, -13, 32, -41, 31, -10, -10, 4, 22, -25, -8, 21, + -3, -14, 5, 1, 12, -23, 8, 18, -31, 25, -26, 10, 17, -23, 8, 5, + -9, 0, 16, -25, 2, 23, -22, -2, 22, -30, 15, 7, -6, -13, 12, 1, + -17, 9, 5, -6, 4, -3, -7, 5, 7, -6, -13, 7, 10, -11, 0, 0, + 4, -3, -3, 2, -7, 4, 2, -5, 0, 6, -3, -8, 4, 2, -8, 7, + 0, -8, -1, 6, 0, -8, 6, 0, -5, 1, 0, -5, 3, 2, -3, -2, + 4, -5, -1, -1, -2, 3, -4, 1, -1, -3, 3, -1, -2, -2, 1, -2, + -2, 1, 1, -4, 1, 2, -5, -3, 5, -3, -4, 4, -1, -4, 2, -1, + -4, 3, 1, -5, -2, 2, 0, -2, 2, -1, -4, 3, -1, -3, 0, 1, + -2, -2, 1, -1, -1, -1, 0, 0, -1, -1, -1, 0, -1, 1, -1, -1, + 0, -2, 1, 0, -1, -1, 0, -1, -1, -1, 2, -2, -1, 1, -1, -2, + 1, -1, -1, 1, -2, 1, -7, -3, 15, -23, 20, -16, 9, -12, 16, -12, + -8, 11, 5, -18, 6, 8, 0, -18, 16, 4, -19, 16, -17, 10, 5, -8, + -2, 9, -5, -4, 10, -17, 5, 13, -18, 2, 12, -17, 10, 0, -2, -8, + 7, -4, -7, 6, 1, -3, 1, 3, -9, -2, 10, -7, -8, 4, 6, -6, + 1, 0, 0, -2, 1, -1, -8, 6, 1, -5, 2, 4, -2, -4, 1, 1, + -7, 5, -1, -4, -2, 4, 0, -4, 4, -3, -4, 1, 0, -3, 0, 2, + -1, -2, 2, -2, -1, -3, 0, 3, -4, 3, -3, 0, 2, 0, -3, -1, + 1, -3, -1, 2, 0, -1, 0, 0, -3, 0, 1, -4, -1, 2, 0, -2, + 0, 1, -3, 1, 1, -3, -2, 2, -1, -1, 2, -1, -2, 1, 0, -1, + -1, -1, -3, -8, -16, -20, -7, 14, 20, 19, 18, 16, 11, 3, -9, -21, + -36, -43, -39, -24, 6, 38, 57, 55, 26, 0, -7, -10, -13, -12, -11, -29, + -56, -59, -37, 0, 43, 74, 87, 75, 37, -2, -31, -51, -59, -45, -15, -16, + -34, -20, -10, -5, 29, 61, 72, 51, 18, -2, -21, -39, -35, -24, 1, 0, + -31, -29, -23, -44, -13, 48, 82, 79, 46, 16, -4, -44, -58, -26, 3, 6, + -38, -52, -24, -42, -35, 47, 95, 88, 55, 19, 12, -22, -72, -38, 4, 3, + -31, -67, -29, -24, -60, 23, 112, 111, 72, 22, 7, -20, -90, -73, -1, 19, + -4, -57, -36, 3, -54, -32, 98, 125, 71, 14, 14, 0, -82, -106, 0, 42, + 10, -48, -32, -2, -54, -63, 72, 125, 82, 24, 14, -8, -57, -104, -22, 52, + 34, -34, -46, -16, -35, -83, 32, 127, 99, 26, 19, 4, -55, -110, -48, 45, + 36, -12, -26, -22, -41, -64, -7, 107, 113, 56, 6, 4, -41, -92, -74, 35, + 57, 12, -41, -21, -39, -67, -40, 86, 114, 71, 10, 22, -31, -83, -83, 16, + 46, 34, -28, -18, -42, -58, -60, 55, 108, 97, 3, 21, -8, -77, -102, 10, + 45, 42, -26, -2, -27, -68, -73, 45, 83, 92, 29, 25, -8, -56, -104, -13, + 35, 52, -6, -7, -22, -46, -91, 10, 80, 95, 35, 26, 8, -38, -106, -34, + 34, 42, 5, 1, -23, -39, -73, -28, 61, 89, 60, 20, 2, -7, -73, -86, + 24, 52, 26, -12, -11, -19, -58, -86, 46, 91, 62, 17, 22, -15, -39, -106, + 8, 55, 45, -13, -6, -30, -21, -102, 4, 82, 87, 7, 28, -3, -9, -115, + -32, 50, 63, -23, 8, -19, -18, -94, -28, 61, 96, 14, 39, -4, 1, -85, + -60, 23, 79, -3, 2, -20, -10, -82, -65, 25, 108, 28, 31, 19, 9, -65, + -74, -5, 78, 16, -3, -9, -14, -65, -76, -3, 93, 60, 29, 22, 13, -43, + -90, -30, 61, 49, -9, -1, 4, -52, -98, -16, 68, 72, 21, 38, 15, -31, + -94, -34, 32, 67, 5, 9, 0, -28, -111, -33, 40, 85, 24, 37, 23, -6, + -104, -44, 13, 69, 9, 14, 8, -11, -110, -53, 20, 80, 32, 48, 30, 5, + -87, -66, -7, 63, 33, 12, 2, 5, -86, -94, -2, 79, 46, 26, 44, 22, + -59, -88, -19, 54, 48, 13, 14, 4, -51, -112, -37, 67, 71, 21, 38, 29, + -29, -104, -50, 44, 63, 11, 10, 14, -24, -103, -67, 49, 88, 20, 27, 43, + -10, -90, -79, 24, 69, 21, 7, 18, -8, -82, -103, 17, 94, 38, 10, 54, + 12, -70, -97, 1, 68, 37, -4, 27, -6, -56, -104, -21, 82, 67, -3, 46, + 23, -37, -108, -31, 57, 58, -13, 29, 11, -32, -106, -50, 53, 92, -6, 38, + 38, -15, -105, -54, 34, 79, -12, 20, 22, -11, -98, -70, 22, 99, 4, 16, + 48, 14, -99, -75, 15, 82, 2, 0, 44, 8, -93, -80, 0, 84, 29, -3, + 57, 32, -79, -94, 1, 66, 27, -19, 49, 29, -73, -109, -7, 54, 52, -17, + 62, 53, -46, -113, -4, 43, 51, -30, 46, 37, -42, -128, -23, 26, 69, -18, + 51, 59, -2, -122, -30, 24, 66, -27, 31, 51, 1, -128, -48, 13, 71, -11, + 33, 66, 22, -110, -57, 8, 68, -9, 12, 53, 28, -104, -87, -4, 67, 8, + 8, 72, 53, -80, -91, -4, 59, 10, -13, 63, 44, -81, -109, -19, 46, 33, + -6, 76, 57, -43, -104, -24, 36, 42, -26, 55, 51, -34, -126, -39, 19, 58, + -21, 68, 71, -8, -114, -32, 2, 62, -24, 52, 54, -4, -120, -53, -22, 71, + -8, 49, 62, 31, -102, -52, -25, 70, -5, 24, 55, 35, -109, -69, -40, 59, + 16, 25, 65, 55, -80, -70, -37, 47, 23, 7, 48, 51, -73, -97, -48, 30, + 46, 6, 57, 74, -37, -98, -34, 21, 48, -10, 44, 58, -34, -123, -46, -2, + 61, 2, 50, 69, 10, -110, -40, -5, 59, -9, 31, 53, 19, -126, -59, -20, + 62, 8, 32, 64, 49, -105, -59, -16, 58, 2, 17, 50, 45, -102, -83, -31, + 46, 24, 15, 53, 69, -65, -86, -24, 42, 25, -4, 45, 64, -58, -112, -37, + 30, 41, -6, 51, 75, -24, -105, -32, 26, 41, -19, 39, 62, -14, -117, -51, + 7, 54, -13, 35, 78, 19, -105, -47, 9, 58, -19, 21, 69, 18, -113, -66, + -10, 52, -10, 14, 75, 42, -83, -60, -5, 52, 0, -3, 69, 43, -83, -83, + -21, 35, 17, -13, 72, 57, -54, -82, -10, 29, 28, -29, 65, 52, -45, -98, + -21, 1, 40, -30, 64, 63, -7, -94, -9, 1, 51, -36, 51, 54, -8, -115, + -23, -22, 47, -30, 48, 65, 24, -90, -13, -15, 46, -26, 30, 55, 21, -100, + -37, -26, 31, -10, 24, 65, 41, -71, -35, -10, 25, -2, 4, 58, 32, -69, + -61, -16, 2, 8, 1, 67, 42, -33, -56, -1, -1, 20, -13, 59, 33, -28, + -82, -10, -20, 22, -15, 64, 40, -1, -70, 0, -17, 29, -22, 53, 33, 1, + -84, -15, -29, 22, -19, 53, 43, 22, -64, -7, -19, 25, -18, 37, 38, 16, + -73, -30, -33, 11, -14, 32, 50, 31, -45, -17, -15, 16, -4, 16, 43, 23, + -49, -43, -30, -2, -1, 8, 52, 36, -25, -32, -13, -1, 11, -1, 42, 30, + -25, -49, -25, -18, 10, -7, 44, 40, -2, -34, -11, -15, 21, -6, 29, 33, + -5, -54, -29, -30, 13, -6, 29, 46, 15, -32, -10, -18, 16, -1, 13, 36, + 9, -45, -30, -32, 0, 1, 12, 43, 28, -23, -16, -16, 6, 9, 2, 33, + 22, -33, -34, -27, -11, 2, 1, 35, 36, -14, -16, -11, -5, 8, 3, 24, + 32, -19, -30, -29, -17, -4, 1, 20, 43, -5, -14, -13, -4, 0, 7, 11, + 39, -9, -23, -28, -17, -16, 1, 9, 44, 3, -7, -15, -4, -4, 7, 5, + 38, 3, -20, -30, -19, -19, -8, 0, 40, 17, -6, -7, -3, -2, -1, 4, + 32, 16, -20, -21, -26, -17, -18, -3, 28, 32, -7, -1, -9, 4, -9, 3, + 22, 34, -19, -14, -27, -13, -27, -10, 16, 44, -8, 5, -6, 3, -12, 1, + 13, 40, -12, -11, -25, -17, -27, -15, 5, 45, 4, 2, 0, 0, -9, -5, + 6, 38, 2, -17, -14, -20, -24, -23, 0, 38, 19, -4, 11, -4, -7, -10, + 4, 27, 20, -20, -9, -23, -22, -30, -6, 26, 35, -8, 12, 2, -4, -15, + 2, 20, 32, -16, -7, -15, -22, -37, -14, 18, 39, -3, 5, 8, -5, -18, + -2, 18, 34, -4, -14, -4, -21, -35, -25, 15, 36, 8, -4, 21, -5, -17, + -14, 23, 26, 9, -22, 4, -25, -32, -40, 14, 27, 24, -12, 30, 1, -8, + -26, 24, 21, 19, -28, 9, -20, -28, -51, 7, 23, 30, -15, 27, 9, -7, + -32, 16, 25, 23, -21, 4, -8, -27, -50, -10, 25, 29, -9, 13, 24, -7, + -28, -3, 34, 20, -12, -9, 10, -31, -43, -29, 30, 23, 2, -3, 38, -9, + -19, -19, 39, 18, -1, -20, 25, -29, -36, -42, 26, 17, 12, -14, 43, -3, + -15, -29, 35, 19, 6, -28, 27, -18, -36, -48, 16, 17, 15, -15, 39, 12, + -13, -29, 24, 24, 9, -25, 19, -1, -39, -50, 1, 18, 11, -11, 25, 26, + -14, -26, 12, 32, 10, -17, 6, 17, -33, -48, -14, 20, 6, -7, 11, 36, + -9, -26, -1, 34, 11, -9, -4, 25, -25, -49, -26, 19, 4, -4, 5, 41, + 3, -21, -8, 31, 12, -7, -11, 23, -13, -47, -37, 13, 6, -3, 1, 40, + 14, -17, -14, 26, 16, -2, -12, 20, -3, -40, -44, 2, 6, -2, -4, 35, + 24, -9, -19, 19, 17, 2, -13, 16, 5, -29, -48, -7, 4, 3, -7, 28, + 28, 2, -21, 13, 14, 9, -14, 11, 9, -15, -49, -17, -3, 6, -11, 20, + 30, 14, -23, 7, 12, 14, -11, 6, 10, -4, -46, -24, -10, 6, -8, 11, + 29, 24, -15, 0, 11, 14, -4, -2, 11, 3, -37, -36, -13, -3, -2, 2, + 28, 27, -2, -10, 14, 9, 7, -8, 13, 3, -21, -42, -14, -14, 4, -6, + 24, 24, 13, -16, 12, 3, 14, -8, 12, 4, -7, -44, -18, -20, 5, -6, + 18, 22, 23, -13, 6, 2, 13, -4, 5, 5, 1, -36, -26, -20, -1, -1, + 10, 23, 25, -3, -4, 5, 9, 5, -2, 8, 1, -24, -36, -18, -10, 4, + 1, 24, 23, 11, -9, 8, 4, 12, -7, 9, 1, -12, -40, -19, -16, 4, + -4, 21, 21, 16, -9, 6, 2, 13, -4, 6, 6, -4, -33, -24, -18, -2, + -2, 10, 21, 18, 0, -3, 3, 8, 6, -1, 8, 0, -18, -31, -19, -10, + 1, 0, 19, 20, 13, -5, 4, 5, 12, -4, 5, 2, -7, -34, -24, -17, + 1, -4, 13, 20, 21, -3, 2, 5, 14, 0, 2, 4, 0, -26, -28, -20, + -6, -4, 4, 18, 23, 6, -3, 5, 9, 7, -1, 6, 3, -14, -33, -22, + -14, -1, -1, 16, 22, 17, -4, 4, 4, 10, -2, 4, 3, -4, -30, -25, + -19, -2, -2, 11, 20, 23, 0, 0, 2, 10, 3, 1, 4, 1, -23, -30, + -22, -8, -1, 4, 19, 23, 10, -3, 4, 6, 8, -2, 5, 2, -13, -33, + -23, -15, 0, -1, 16, 21, 16, -3, 3, 4, 11, 0, 5, 6, -3, -27, + -25, -19, -4, -2, 9, 19, 19, 2, -3, 2, 8, 6, -1, 8, 0, 0, + 2, 33, 42, 58, 71, 79, 85, 88, 91, 94, 79, 95, 82, 106, 86, 105, + 47, 16, -6, 13, 44, 31, -15, -38, -36, 20, 70, 41, 48, 58, 24, -57, + -127, -119, -102, -126, -128, -111, -78, -82, -88, -87, -60, -66, -98, -104, -99, -97, + -99, -104, -101, -88, -87, -91, -61, -27, -34, -54, -55, -45, -24, -10, -5, -4, + 5, 34, 63, 101, 94, 78, 52, 51, 52, 74, 81, 77, 59, 46, 17, 7, + 39, 53, 47, 42, 66, 83, 73, 52, 28, 22, 11, 8, 11, 0, -15, -23, + -15, -14, -6, 16, 46, 62, 71, 76, 90, 102, 103, 103, 101, 100, 90, 75, + 63, 67, 49, 37, 28, 12, 5, 6, 15, 15, 8, -7, -12, -4, -10, -28, + -24, -17, -25, -50, -64, -81, -103, -116, -116, -113, -95, -72, -54, -41, -47, -65, + -65, -50, -33, -24, -7, 11, 8, -4, -13, -28, -51, -75, -90, -91, -90, -90, + -87, -88, -83, -84, -82, -81, -81, -76, -65, -71, -85, -84, -79, -83, -81, -77, + -72, -70, -65, -66, -66, -65, -66, -68, -61, -56, -51, -36, -13, -3, -5, -8, + -12, -12, 3, 16, 21, 31, 50, 69, 77, 82, 90, 102, 110, 114, 116, 117, + 118, 119, 116, 112, 109, 105, 98, 99, 103, 102, 91, 73, 64, 63, 61, 57, + 51, 40, 24, 35, 57, 75, 84, 79, 65, 37, 4, -26, -45, -57, -54, -46, + -45, -54, -67, -67, -48, -16, 15, 35, 44, 45, 44, 45, 46, 38, 23, 2, + -15, -34, -52, -60, -70, -77, -80, -79, -74, -77, -84, -86, -80, -72, -68, -72, + -80, -87, -92, -96, -101, -104, -104, -101, -93, -90, -89, -86, -85, -84, -83, -82, + -81, -79, -77, -76, -73, -71, -66, -62, -55, -39, -31, -27, -25, -31, -37, -46, + -51, -53, -54, -48, -45, -38, -20, 3, 24, 35, 39, 32, 16, 5, 3, 0, + -6, -13, -13, -11, -2, 14, 28, 40, 50, 53, 50, 55, 64, 74, 90, 105, + 108, 112, 106, 104, 109, 112, 123, 127, 127, 127, 127, 127, 127, 118, 113, 107, + 110, 114, 111, 104, 101, 101, 102, 103, 99, 99, 89, 73, 53, 35, 20, 0, + -22, -43, -63, -77, -82, -76, -65, -48, -36, -29, -24, -25, -29, -37, -40, -49, + -59, -67, -73, -76, -78, -79, -75, -73, -74, -75, -68, -52, -44, -30, -19, -9, + -6, -9, -13, -24, -33, -35, -31, -30, -35, -40, -44, -45, -51, -53, -54, -50, + -50, -47, -42, -50, -55, -54, -56, -56, -54, -54, -49, -48, -41, -32, -28, -18, + -13, -5, 6, 18, 33, 49, 60, 71, 78, 88, 95, 97, 93, 88, 91, 93, + 97, 98, 97, 94, 91, 85, 81, 72, 70, 66, 61, 60, 64, 66, 74, 83, + 92, 102, 108, 109, 107, 102, 97, 95, 91, 87, 80, 74, 67, 62, 61, 58, + 61, 61, 57, 53, 43, 35, 27, 25, 24, 20, 20, 22, 27, 34, 36, 32, + 21, 8, -3, -10, -16, -18, -16, -16, -19, -15, -11, -11, -12, -20, -34, -45, + -59, -72, -80, -89, -94, -95, -102, -111, -114, -111, -111, -108, -106, -104, -101, -98, + -93, -90, -86, -86, -83, -82, -81, -79, -76, -73, -70, -72, -78, -81, -79, -79, + -72, -60, -43, -31, -25, -27, -34, -37, -40, -42, -41, -39, -36, -34, -25, -12, + -4, 5, 12, 16, 17, 15, 13, 6, -4, -7, -8, -6, -1, 4, 7, 9, + 12, 16, 19, 19, 22, 28, 29, 28, 29, 30, 34, 40, 49, 57, 71, 78, + 85, 92, 96, 95, 89, 85, 86, 93, 99, 104, 102, 100, 94, 85, 77, 73, + 69, 66, 63, 60, 60, 59, 57, 52, 47, 41, 31, 18, 6, -3, -7, -11, + -12, -14, -18, -22, -23, -22, -24, -30, -37, -41, -44, -50, -56, -64, -67, -65, + -62, -58, -58, -58, -59, -61, -62, -66, -72, -78, -79, -77, -73, -68, -64, -61, + -56, -53, -54, -52, -52, -57, -63, -69, -70, -68, -65, -62, -59, -57, -56, -58, + -60, -61, -63, -64, -62, -61, -60, -58, -54, -49, -45, -42, -39, -36, -32, -28, + -22, -13, -7, -3, 2, 13, 28, 41, 52, 64, 71, 73, 73, 70, 64, 61, + 60, 64, 66, 65, 66, 64, 61, 60, 62, 65, 64, 66, 67, 67, 68, 66, + 64, 66, 68, 73, 76, 74, 72, 66, 58, 52, 46, 42, 38, 38, 41, 47, + 52, 52, 48, 45, 42, 40, 38, 34, 29, 27, 26, 28, 29, 28, 29, 30, + 31, 28, 24, 21, 19, 17, 14, 10, 6, 3, -4, -9, -15, -19, -26, -33, + -40, -49, -55, -60, -65, -70, -73, -72, -72, -71, -70, -71, -75, -78, -81, -83, + -86, -86, -85, -84, -82, -80, -77, -72, -69, -66, -63, -61, -61, -61, -61, -61, + -60, -58, -53, -48, -42, -36, -30, -28, -30, -32, -33, -32, -31, -28, -22, -18, + -10, -5, 0, 3, 6, 11, 16, 19, 22, 24, 26, 27, 29, 34, 40, 46, + 48, 48, 48, 45, 40, 36, 33, 31, 33, 35, 40, 48, 55, 62, 68, 73, + 76, 78, 78, 77, 79, 82, 85, 87, 87, 87, 86, 86, 86, 83, 78, 71, + 63, 55, 48, 44, 39, 36, 36, 36, 35, 32, 28, 24, 18, 13, 9, 6, + 4, 1, -2, -5, -11, -17, -20, -21, -20, -21, -24, -28, -32, -34, -33, -33, + -35, -37, -40, -43, -47, -52, -58, -63, -69, -74, -77, -80, -81, -82, -81, -80, + -77, -74, -69, -62, -54, -48, -48, -51, -54, -57, -57, -57, -56, -55, -55, -56, + -57, -56, -55, -54, -54, -54, -54, -52, -49, -45, -41, -38, -34, -31, -29, -27, + -24, -20, -17, -11, -7, -3, 0, 5, 10, 16, 22, 27, 31, 34, 38, 42, + 44, 45, 48, 50, 52, 57, 61, 64, 64, 65, 65, 63, 60, 57, 55, 55, + 58, 61, 63, 65, 67, 69, 71, 74, 77, 79, 79, 77, 74, 71, 68, 66, + 63, 60, 57, 55, 51, 46, 40, 36, 30, 25, 20, 17, 16, 17, 16, 14, + 12, 10, 7, 3, -1, -5, -11, -15, -17, -18, -18, -19, -21, -25, -29, -32, + -33, -33, -36, -39, -43, -46, -50, -53, -56, -58, -59, -60, -61, -62, -63, -65, + -66, -67, -68, -70, -72, -72, -70, -67, -63, -61, -60, -60, -58, -56, -54, -53, + -52, -52, -52, -51, -50, -49, -47, -45, -43, -40, -37, -35, -34, -32, -29, -25, + -21, -18, -14, -9, -4, 0, 4, 7, 11, 15, 18, 21, 25, 28, 33, 37, + 41, 44, 46, 47, 47, 46, 46, 45, 43, 42, 42, 43, 46, 48, 49, 50, + 52, 55, 59, 62, 65, 66, 67, 68, 69, 69, 70, 72, 74, 74, 73, 72, + 71, 69, 65, 61, 57, 53, 50, 46, 43, 38, 35, 32, 28, 23, 19, 17, + 17, 15, 13, 11, 9, 5, 1, -3, -6, -9, -12, -14, -17, -19, -23, -27, + -31, -35, -38, -40, -43, -46, -48, -52, -55, -57, -61, -64, -66, -67, -68, -69, + -70, -70, -70, -69, -69, -70, -71, -70, -66, -62, -59, -55, -52, -50, -46, -43, + -41, -38, -36, -35, -35, -34, -33, -33, -33, -33, -31, -30, -28, -26, -25, -24, + -21, -20, -20, -19, -19, -18, -17, -16, -15, -13, -11, -8, -3, 2, 9, 15, + 21, 27, 33, 38, 41, 45, 48, 51, 53, 55, 56, 56, 56, 56, 56, 56, + 56, 55, 57, 58, 60, 61, 62, 62, 64, 66, 68, 69, 71, 72, 73, 74, + 72, 70, 67, 63, 60, 57, 54, 50, 46, 41, 36, 31, 27, 23, 19, 16, + 14, 12, 11, 9, 8, 5, 2, -1, -4, -8, -10, -15, -18, -19, -20, -22, + -22, -23, -23, -24, -26, -29, -31, -33, -35, -36, -37, -38, -41, -44, -46, -48, + -50, -52, -54, -56, -59, -61, -63, -63, -64, -65, -64, -63, -62, -61, -60, -59, + -58, -57, -58, -57, -57, -55, -53, -50, -49, -47, -46, -43, -40, -37, -33, -31, + -28, -26, -23, -20, -16, -14, -12, -9, -5, -2, 1, 5, 9, 13, 17, 21, + 24, 26, 29, 32, 35, 37, 37, 38, 39, 41, 43, 44, 45, 46, 48, 50, + 51, 53, 52, 52, 50, 48, 47, 46, 46, 46, 46, 47, 48, 49, 51, 54, + 56, 58, 60, 61, 62, 62, 62, 61, 59, 57, 55, 54, 53, 52, 51, 49, + 46, 41, 36, 31, 27, 22, 18, 14, 11, 9, 6, 3, 0, -2, -5, -8, + -11, -16, -20, -25, -28, -31, -34, -37, -39, -41, -41, -42, -42, -42, -43, -45, + -46, -47, -49, -50, -52, -54, -56, -57, -58, -60, -61, -63, -64, -64, -64, -63, + -63, -61, -59, -58, -57, -55, -54, -53, -52, -52, -51, -50, -49, -47, -46, -45, + -44, -42, -40, -38, -35, -32, -30, -28, -25, -22, -19, -17, -15, -12, -9, -5, + -1, 3, 7, 11, 15, 19, 23, 25, 27, 30, 34, 36, 37, 38, 39, 40, + 42, 44, 45, 46, 47, 49, 50, 52, 53, 52, 51, 49, 47, 47, 46, 46, + 46, 47, 47, 48, 50, 52, 55, 57, 59, 61, 62, 62, 62, 61, 60, 58, + 56, 54, 54, 53, 51, 50, 47, 44, 39, 34, 29, 25, 20, 16, 13, 10, + 7, 4, 2, -1, -3, -6, -9, -14, -18, -22, -26, -30, -33, -35, -38, -40, + -41, -41, -42, -42, -43, -44, -46, -47, -48, -49, -51, -53, -55, -56, -57, -59, + -60, -62, -63, -64, -64, -63, -63, -62, -60, -59, -57, -56, -55, -53, -52, -52, + -51, -51, -50, -48, -46, -45, -44, -43, -41, -39, -36, -34, -31, -29, -26, -24, + -21, -16, -1, -2, -1, -3, 1, -2, -2, -4, 2, 6, 2, -2, -2, 0, + 7, 8, 4, -2, -2, 6, 5, 6, 0, -2, 5, 12, 10, 0, -5, -3, + 5, 10, 9, -7, -8, -7, 5, 8, 3, -9, -13, -5, 3, 5, -5, -9, + -4, 0, 6, 0, -4, -11, -7, 3, 4, 0, -5, 0, -1, 5, 1, 4, + -6, -5, -3, 12, 9, -2, -10, 4, 11, 8, -4, -5, -9, -6, 1, 19, + 13, -2, -22, 4, 9, 6, -26, -4, 3, 12, -9, 0, 2, 0, -15, 4, + 8, -8, -20, 0, 15, 8, -13, -2, -4, -4, -2, 12, 3, -14, -18, 1, + 21, 13, -9, -25, -8, 17, 15, 5, -14, -17, 5, 19, 13, -15, -17, -3, + 10, 20, 10, -27, -19, 5, 11, 12, 3, -13, -17, -1, 6, -3, -2, 1, + -1, -11, -17, 7, 7, -7, -7, -13, 9, 0, -5, 9, -5, -9, 6, 5, + -2, -16, -5, 15, 17, -10, -20, 1, 11, 14, -1, 1, 10, -11, -8, -1, + 18, 13, -2, -12, 1, -16, -2, 34, 27, -28, -42, -3, 42, 26, -14, -39, + -19, 7, 26, 25, -16, -55, -26, 32, 57, 4, -69, -48, 6, 75, 29, -51, + -67, -32, 51, 56, 7, -57, -75, 14, 63, 43, -29, -82, -27, 31, 56, 28, + -43, -81, -31, 59, 85, 1, -100, -59, 8, 102, 41, -42, -92, -52, 72, 79, + 29, -103, -85, -1, 117, 49, -54, -113, 7, 24, 94, -28, -39, -84, 39, 28, + 61, -44, -28, -67, 61, 23, 35, -40, -23, -37, 6, 38, 69, -42, -61, -53, + 58, 86, 2, -93, -24, 19, 72, 17, -19, -87, 45, 10, 64, -13, -45, -57, + 38, 48, 36, -51, -35, -37, 46, 26, 37, -73, -28, -12, 44, 22, 27, -84, + -22, 6, 70, 17, -24, -82, -7, 26, 79, 9, -63, -78, 6, 90, 68, -55, + -118, -3, 92, 62, -10, -73, -50, 14, 110, 15, -5, -118, 5, 69, 53, 22, + -81, -45, 29, 47, 80, -69, -28, -52, 58, 66, -1, -25, -59, -22, 107, 2, + 43, -108, -13, 20, 59, 56, -58, -66, -7, 34, 114, -42, -63, -50, 42, 69, + 44, -63, -37, -50, 114, 27, 18, -49, -81, 20, 74, 51, -14, -102, -4, 40, + 70, 38, -64, -73, 11, 60, 76, -41, -30, -78, 42, 46, 68, -63, -48, -56, + 89, 43, 28, -100, -53, 41, 60, 11, -6, -76, -16, 44, 52, 9, -67, -48, + 10, 69, 30, -1, -84, -4, 36, 72, -23, -22, -27, -33, 55, 74, -11, -86, + -1, 27, 36, 31, -7, -101, 49, 5, 66, -7, -46, -39, 9, 64, 44, -63, + -33, -22, 55, 23, 43, -79, -24, 5, 29, 54, -14, -59, -53, 63, 32, 20, + -34, -32, -36, 93, -2, 20, -35, -38, 18, 51, 61, -94, 15, -14, 17, 69, + 5, -87, 16, 28, 34, 1, 34, -57, -53, 118, -22, 34, -10, -71, 23, 70, + 25, -29, -7, -19, -3, 117, -33, -12, -21, -19, 43, 84, -38, -57, 33, 0, + 32, 41, -7, -103, 85, 2, 2, 58, -14, -103, 103, 7, -17, 34, -32, -59, + 71, 51, -78, 76, -65, -30, 63, 48, -66, 9, -11, -28, 52, 50, -72, -37, + 73, -61, 75, 7, -51, -44, 73, -3, -11, 40, -78, 7, 63, -15, -16, 30, + -53, 12, 38, 12, -42, 39, -63, 47, 23, 0, -23, -11, 8, -25, 60, -37, + -15, -3, -9, 12, 27, -14, -40, 22, 12, 14, 15, -31, -14, 15, 23, -12, + 14, -31, 19, 13, 32, -39, 27, -51, 43, 8, 0, 5, -26, 16, 4, 19, + -24, 17, -18, 6, -2, 49, -67, 39, -1, -30, 46, -13, -16, -9, 21, -17, + 27, 2, -34, 19, -3, 24, 8, -38, 13, -10, 22, 15, -34, 2, 4, -10, + 18, 14, -15, -15, 26, -12, 28, -21, 0, -6, 0, 7, 0, -15, 6, -2, + -18, 9, 8, -18, -15, 59, -94, 81, -40, -24, 14, -18, 25, -15, 4, -21, + -9, 24, -20, 3, 3, -52, 56, -29, 4, 5, -51, 45, -50, 73, -75, 13, + 17, -48, 38, -10, -16, 5, 4, -22, 3, 17, -27, -23, 42, -30, -5, 41, + -53, 10, 23, -28, 1, 29, -47, 9, 13, -3, -18, 9, -13, -11, 18, 12, + -53, 28, 1, -41, 41, 7, -61, 32, 0, -34, 16, 9, -74, 45, -23, -33, + 22, 39, -104, 49, 23, -96, 83, 5, -46, 36, -4, -45, 54, -25, -26, 21, + 2, -39, 51, -25, -25, 43, -22, -25, 30, -2, -32, 39, 14, -69, 42, 22, + -78, 60, 23, -83, 33, 44, -74, 19, 69, -113, 43, 53, -88, 51, 17, -74, + 42, 1, -38, 4, 39, -67, 12, 35, -39, -23, 73, -82, -5, 67, -71, -5, + 42, -36, -48, 78, -64, -4, 40, -48, -7, 50, -80, 17, 31, -56, 9, 6, + -18, -36, 43, -37, -29, 47, -47, -18, 33, -29, -27, 40, -30, -37, 51, -46, + -25, 61, -66, 7, 28, -48, 30, -15, -8, -6, 17, -14, -9, 26, -23, 4, + 9, -15, 12, -9, 16, -22, 7, 22, -51, 59, -29, -23, 54, -49, 6, 20, + -19, -11, 17, -3, -30, 32, -27, -5, 16, -28, 4, 4, -27, 32, -46, 27, + -18, -8, 11, -25, 18, -6, -17, 10, 1, -18, 24, -33, 10, 8, -12, -10, + 21, -19, 0, 8, -18, 14, 11, -44, 39, -22, -4, -6, 11, -15, -13, 17, + -17, -6, 13, -22, -1, 7, -5, -8, 0, 4, -24, 29, -23, 0, 20, -25, + -8, 30, -34, 31, -29, 11, -9, 21, -15, -1, 10, -9, -11, 32, -23, -2, + -14, 27, -19, 10, -4, -23, 14, 13, -45, 48, -44, 11, -4, -7, -3, 4, + -2, -34, -8, 37, -41, 20, -24, -4, -10, 2, 4, 12, -28, -30, 9, 32, + -16, 6, -46, -23, 60, 0, -22, -3, -23, -15, 48, 12, -34, -17, -18, 10, + 46, -1, -56, -8, 12, 9, 18, 13, -72, -3, 26, 9, 28, -14, -89, 15, + 67, -18, 1, -19, -52, 45, 26, -8, -5, -25, -25, 36, 38, -13, -36, -18, + -6, 55, 23, -51, -14, 4, 6, 25, 24, -41, -44, 38, 19, 10, 10, -59, + -14, 42, 1, 6, -8, -43, -1, 43, 10, -30, -10, -36, 18, 35, -20, -14, + -11, -19, 9, 20, -5, -22, -9, -6, 13, 26, -30, -23, 4, 1, 20, 9, + -20, -22, 3, -1, 17, 28, -26, -25, 16, -2, -4, 12, -10, -16, 24, -2, + -18, 17, -27, -1, 36, -6, -7, -4, -26, 6, 29, -3, -17, -6, -4, 18, + 18, -26, -10, -4, 6, 30, -1, -6, -24, 0, 24, 12, 2, -16, -25, 13, + 32, -3, -4, -3, -24, 15, 16, -7, 8, -20, -13, 36, 9, -24, -11, -10, + 10, 20, -1, -13, -10, -9, 20, 17, -12, -9, -15, 9, 20, -11, -14, -6, + 5, 10, 6, 5, -7, -11, 7, 19, 1, 3, -11, -10, 24, 14, -16, 2, + -9, 11, 14, 7, -1, -11, -4, 15, 24, 3, -24, -4, 4, 15, 13, -3, + -15, 0, 15, 8, 2, 0, -19, 16, 12, -1, 7, -13, -2, 18, 3, -3, + 5, -9, -10, 12, 9, -2, 8, -9, 4, 9, 6, 1, -8, 10, 4, -2, + 11, -14, 3, 5, 1, 9, 4, -15, 0, 10, 1, 5, -4, -10, 3, 7, + -1, 8, -13, 1, 4, 10, 6, -9, -3, 1, 6, 14, -3, -4, 4, -10, + 10, 13, -1, -4, 5, -3, 10, 13, -13, 4, 7, 1, 8, -1, 1, 4, + 5, 4, 11, -5, -2, 1, 8, 6, 1, 3, -1, -5, 11, 3, -3, 4, + -5, -1, 17, -4, -2, 6, -10, 10, 10, -4, 2, 3, -10, 10, 5, -2, + -2, -1, 4, 3, -1, -2, -4, 1, 6, -4, 6, -4, -10, 8, 2, -4, + 6, -4, -4, 12, -2, 2, 6, -9, 3, 2, 0, 7, -5, -3, 3, 2, + 4, -4, -2, 7, 3, 5, 9, -3, 1, 12, -3, 7, 6, -9, 4, 9, + -4, 12, 1, -7, 9, 2, 1, 10, -3, 1, 0, 0, 8, 0, -1, 5, + -2, 8, 1, -3, 10, 2, 0, 11, -4, -1, 6, -3, 2, 3, -5, 4, + 0, -5, 5, -3, 1, 3, 0, 4, -3, -3, 4, -2, -2, 5, -2, -1, + 6, -5, 2, 3, -4, 4, -2, -3, 11, -8, 0, 5, -1, 1, 0, -3, + 4, 2, 2, 6, -2, 4, 5, -3, 4, 7, -4, 11, -1, 0, 3, 0, + 3, 7, -2, 5, 1, 0, 6, 3, 2, 4, -1, 2, 6, 0, 3, 5, + -4, 6, 0, 2, 7, -4, -1, 2, -2, 7, 1, -1, 1, -2, 2, 4, + -5, 0, 4, -1, 2, -1, -2, 1, -2, 3, 2, -3, 3, -1, -4, 5, + -2, -2, 3, 0, -1, 2, -5, 2, 1, -4, 0, 1, -3, 5, -2, 2, + 2, -3, 1, 3, -2, 3, 1, -2, 4, 1, 2, 5, -2, 3, 1, 2, + 5, 0, -1, 4, 0, 1, 4, 2, 4, 4, -2, 0, 2, 3, 5, 0, + 0, 0, 1, 5, -2, -3, 4, 0, 1, 2, -2, -4, -4, -5, -6, -7, + -8, -9, -10, -11, -12, -13, -13, -14, -16, -18, -21, -25, -29, -34, -36, -38, + -39, -40, -42, -44, -47, -50, -53, -56, -58, -59, -58, -55, -50, -44, -38, -31, + -24, -18, -13, -9, -6, -3, 0, 3, 6, 9, 13, 17, 21, 27, 33, 42, + 53, 63, 74, 83, 91, 98, 104, 108, 111, 113, 115, 118, 119, 121, 123, 125, + 126, 127, 127, 127, 127, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, + 126, 125, 123, 121, 118, 114, 111, 107, 104, 101, 100, 99, 98, 98, 98, 98, + 98, 99, 98, 98, 97, 95, 92, 88, 81, 73, 63, 54, 46, 39, 33, 29, + 27, 25, 24, 22, 20, 18, 14, 10, 5, 0, -5, -8, -8, -7, -3, 2, + 8, 14, 19, 23, 26, 28, 29, 30, 31, 32, 32, 31, 30, 28, 24, 20, + 14, 9, 4, -1, -4, -7, -9, -10, -12, -13, -15, -17, -19, -22, -24, -25, + -25, -23, -21, -19, -17, -15, -15, -14, -15, -15, -16, -17, -17, -17, -16, -16, + -16, -17, -19, -22, -25, -30, -35, -39, -44, -47, -50, -53, -56, -58, -61, -63, + -64, -65, -65, -63, -60, -55, -49, -43, -38, -34, -32, -31, -31, -32, -33, -35, + -36, -37, -37, -36, -35, -34, -34, -34, -36, -39, -43, -49, -55, -61, -67, -72, + -77, -81, -85, -88, -90, -92, -94, -94, -95, -94, -94, -94, -94, -95, -96, -98, + -100, -102, -104, -105, -107, -108, -108, -109, -110, -110, -110, -109, -109, -109, -108, -108, + -109, -109, -109, -109, -108, -108, -107, -106, -106, -105, -105, -105, -105, -105, -105, -104, + -103, -101, -98, -93, -88, -82, -76, -70, -64, -58, -52, -47, -42, -38, -34, -31, + -29, -27, -25, -22, -18, -13, -7, -1, 6, 13, 20, 26, 32, 37, 41, 45, + 48, 51, 55, 58, 63, 68, 73, 77, 82, 85, 89, 91, 94, 96, 97, 98, + 99, 99, 99, 100, 100, 100, 101, 101, 101, 101, 101, 101, 99, 97, 95, 93, + 90, 87, 84, 81, 77, 73, 67, 60, 51, 40, 29, 17, 6, -5, -14, -23, + -31, -38, -45, -52, -58, -65, -70, -75, -80, -84, -87, -90, -92, -94, -95, -96, + -97, -98, -100, -101, -102, -102, -103, -103, -104, -104, -103, -102, -100, -97, -93, -89, + -86, -82, -79, -77, -75, -72, -70, -67, -63, -59, -53, -47, -40, -33, -26, -20, + -14, -9, -6, -3, 0, 3, 6, 9, 13, 17, 21, 26, 31, 37, 44, 51, + 58, 64, 70, 75, 79, 83, 86, 88, 90, 92, 93, 95, 96, 97, 98, 100, + 100, 101, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 102, 102, + 102, 101, 100, 98, 96, 94, 92, 90, 89, 88, 88, 87, 87, 87, 87, 87, + 86, 85, 84, 82, 79, 76, 72, 67, 61, 55, 49, 43, 39, 35, 32, 30, + 29, 27, 25, 24, 21, 18, 15, 12, 8, 5, 3, 3, 4, 6, 9, 12, + 15, 18, 21, 23, 25, 27, 28, 30, 31, 31, 31, 30, 28, 25, 22, 18, + 14, 10, 7, 5, 3, 1, 0, -2, -4, -6, -9, -11, -14, -16, -17, -17, + -16, -14, -12, -11, -9, -9, -9, -10, -11, -12, -13, -14, -15, -15, -16, -16, + -17, -19, -22, -26, -30, -34, -38, -42, -45, -48, -50, -52, -53, -54, -55, -56, + -56, -55, -53, -50, -46, -42, -38, -35, -32, -31, -30, -31, -31, -33, -34, -35, + -36, -36, -36, -35, -35, -35, -36, -38, -41, -45, -49, -54, -59, -64, -68, -73, + -76, -80, -83, -86, -88, -89, -90, -91, -91, -91, -92, -92, -93, -95, -96, -98, + -100, -101, -102, -103, -104, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, -105, + -105, -105, -104, -104, -103, -102, -102, -101, -100, -100, -100, -99, -99, -99, -98, -96, + -94, -91, -86, -82, -76, -71, -65, -59, -53, -48, -42, -37, -32, -28, -25, -22, + -19, -16, -13, -8, -3, 3, 9, 16, 22, 28, 35, 40, 45, 49, 53, 56, + 60, 63, 67, 71, 76, 80, 85, 88, 92, 94, 97, 99, 100, 102, 103, 103, + 104, 104, 104, 104, 105, 105, 105, 105, 105, 104, 103, 101, 99, 97, 94, 91, + 87, 84, 80, 76, 71, 65, 57, 48, 39, 28, 18, 8, -2, -11, -19, -27, + -34, -41, -47, -54, -60, -65, -70, -75, -79, -82, -85, -87, -89, -91, -92, -94, + -95, -96, -97, -98, -99, -100, -100, -100, -100, -100, -98, -96, -94, -90, -87, -84, + -81, -78, -76, -73, -71, -68, -65, -61, -57, -52, -46, -40, -33, -27, -21, -15, + -11, -7, -4, 0, 3, 7, 11, 15, 20, 24, 29, 35, 41, 48, 54, 61, + 67, 72, 77, 81, 85, 88, 90, 92, 94, 95, 97, 98, 99, 101, 102, 103, + 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 104, + 104, 103, 101, 99, 98, 96, 95, 93, 93, 92, 92, 91, 91, 90, 90, 88, + 87, 86, 84, 81, 78, 74, 69, 64, 59, 54, 49, 45, 42, 39, 37, 35, + 33, 31, 29, 27, 24, 21, 18, 15, 13, 11, 11, 12, 13, 15, 17, 20, + 22, 24, 25, 27, 28, 29, 30, 31, 31, 31, 30, 28, 26, 23, 20, 17, + 14, 11, 9, 8, 6, 5, 3, 1, -1, -4, -6, -8, -10, -11, -11, -11, + -10, -9, -8, -8, -8, -9, -10, -11, -13, -14, -15, -16, -17, -17, -18, -20, + -22, -25, -28, -31, -35, -38, -41, -44, -46, -47, -49, -50, -51, -52, -52, -52, + -51, -49, -47, -44, -40, -38, -35, -33, -33, -32, -33, -33, -34, -35, -36, -37, + -38, -38, -38, -38, -39, -40, -42, -45, -49, -53, -57, -61, -65, -69, -73, -76, + -79, -82, -85, -87, -88, -89, -90, -91, -91, -92, -93, -94, -95, -97, -98, -99, + -100, -101, -102, -103, -103, -104, -104, -104, -104, -104, -104, -104, -104, -104, -103, -103, + -103, -102, -102, -101, -100, -99, -99, -98, -97, -97, -96, -96, -95, -94, -92, -89, + -86, -82, -77, -72, -67, -61, -56, -50, -45, -39, -34, -29, -25, -21, -18, -14, + -11, -5, 4, 8, 14, 19, 25, 31, 37, 42, 47, 52, 57, 61, 65, 69, + 72, 76, 79, 83, 86, 89, 92, 95, 97, 99, 101, 102, 104, 104, 105, 106, + 106, 106, 106, 106, 106, 105, 104, 104, 103, 101, 99, 97, 95, 92, 89, 85, + 81, 77, 73, 68, 62, 57, 50, 43, 35, 28, 19, 12, 4, -4, -11, -18, + -25, -32, -38, -44, -50, -55, -61, -65, -69, -73, -77, -80, -82, -85, -87, -89, + -91, -92, -93, -95, -95, -96, -97, -97, -97, -96, -96, -95, -93, -92, -90, -88, + -86, -84, -82, -79, -77, -74, -71, -68, -64, -60, -55, -51, -46, -41, -36, -31, + -26, -21, -16, -11, -7, -2, 3, 8, 14, 19, 25, 30, 36, 42, 47, 53, + 58, 63, 68, 72, 76, 79, 82, 85, 87, 89, 91, 93, 95, 96, 98, 99, + 101, 102, 103, 103, 104, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 105, + 105, 105, 104, 103, 103, 102, 101, 100, 99, 99, 98, 97, 96, 95, 93, 92, + 91, 89, 87, 85, 82, 79, 76, 73, 70, 67, 63, 60, 58, 55, 53, 50, + 48, 46, 44, 41, 39, 37, 34, 32, 31, 29, 28, 28, 27, 28, 28, 28, + 28, 29, 29, 29, 29, 30, 30, 30, 29, 29, 28, 27, 26, 25, 23, 22, + 20, 19, 17, 16, 15, 13, 12, 10, 8, 6, 4, 2, 1, -1, -2, -4, + -5, -6, -7, -9, -10, -12, -13, -15, -17, -19, -21, -22, -24, -26, -27, -29, + -31, -32, -34, -36, -38, -40, -42, -43, -45, -46, -47, -47, -48, -48, -49, -49, + -48, -48, -47, -46, -45, -44, -44, -43, -43, -43, -44, -44, -45, -46, -47, -48, + -49, -50, -51, -52, -53, -55, -57, -59, -61, -64, -67, -70, -72, -75, -78, -80, + -82, -84, -86, -88, -90, -91, -92, -94, -95, -96, -97, -98, -98, -99, -100, -101, + -101, -101, -102, -102, -102, -102, -102, -102, -102, -102, -102, -102, -101, -101, -100, -100, + -99, -98, -97, -96, -95, -94, -93, -92, -91, -89, -88, -87, -85, -83, -81, -78, + -75, -71, -67, -63, -58, -54, -49, -44, -39, -33, -28, -23, -18, -13, -8, -3, + 2, 7, 13, 18, 23, 29, 35, 40, 45, 51, 55, 60, 64, 68, 71, 75, + 78, 82, 85, 88, 91, 93, 96, 98, 100, 101, 103, 104, 105, 105, 106, 106, + 106, 106, 105, 105, 104, 104, 103, 101, 100, 98, 95, 93, 90, 86, 83, 79, + 75, 70, 65, 60, 54, 47, 40, 33, 25, 18, 10, 2, -5, -12, -19, -26, + -32, -38, -44, -50, -55, -60, -65, -69, -73, -76, -79, -82, -84, -87, -89, -90, + -92, -93, -94, -95, -96, -96, -96, -96, -96, -95, -94, -93, -91, -90, -88, -86, + -84, -81, -79, -76, -74, -70, -67, -63, -59, -54, -49, -44, -39, -34, -29, -24, + -19, -14, -10, -5, -2, -1, 3, -2, 1, -3, 4, -2, 0, 0, 8, 0, + 10, -9, -7, -128, -72, 13, -44, -13, -18, 4, -4, 12, 3, 31, 4, 66, + 74, 38, 38, 36, 30, 25, 22, 18, 13, 7, 5, 2, 1, -5, -7, -9, + -9, -11, -14, -12, -14, -12, -16, -13, -16, -13, -14, -16, -11, -14, -10, -13, + -11, -13, -8, -8, -6, -6, -5, 0, -6, -3, -3, 3, -4, 6, -13, 17, + -5, -5, 15, -1, -23, 6, 23, 28, 35, 13, 41, -3, 24, 25, -4, 6, + 30, 4, 18, 10, -32, -64, -120, -64, -91, -76, -33, -45, -58, 2, 1, -19, + -14, 18, 48, 50, 59, 51, 53, 47, 46, 41, 37, 35, 26, 28, 19, 21, + 10, 13, 9, 3, 5, -4, 2, -5, -3, -8, -5, -8, -8, -10, -9, -10, + -10, -12, -7, -17, -8, -11, -14, -5, -15, -5, -4, -10, -13, 11, -22, 3, + -3, -4, -5, -11, 13, 2, -16, -9, -5, -12, 27, 15, 17, 21, 20, 20, + 8, 14, 13, 0, 10, 35, 10, -1, -12, -52, -89, -78, -58, -85, -74, -51, + -25, -25, -28, -30, -14, 12, 29, 44, 44, 51, 46, 50, 49, 43, 38, 36, + 32, 29, 23, 19, 17, 14, 10, 6, 6, 2, 4, -8, 3, -7, -3, -6, + -7, -11, -4, -12, -7, -6, -20, 1, -15, -14, -8, -7, -10, -10, -10, 2, + -14, -12, 7, -10, -8, -5, -6, 1, 6, -2, -12, -19, -3, 3, 2, 19, + 19, 14, 19, 24, 13, 5, 12, 12, 13, 21, 29, 5, -18, -43, -48, -64, + -82, -82, -71, -44, -37, -37, -40, -33, -23, 5, 20, 33, 38, 45, 48, 51, + 46, 44, 41, 38, 36, 27, 26, 24, 19, 13, 16, 5, 11, 4, -1, 3, + -4, -3, 1, -9, -7, -2, -9, -6, -13, -4, -6, -17, -8, -6, -15, -10, + -5, -10, -8, -10, -5, -7, -5, -2, -14, -10, 3, 5, -4, -3, -10, -17, + -10, 3, 4, 5, 18, 18, 18, 16, 16, 10, 5, 11, 23, 26, 22, 7, + -9, -16, -37, -62, -80, -76, -65, -46, -43, -43, -51, -41, -24, -4, 11, 24, + 32, 41, 47, 43, 49, 45, 41, 40, 33, 31, 31, 20, 23, 18, 11, 16, + 9, 5, 3, 2, 5, -2, -7, 2, -4, -10, -3, -5, -8, -10, -7, -8, + -14, -10, -8, -11, -9, -6, -14, -10, -2, -3, -12, -10, -7, -9, 0, 6, + -1, -11, -12, -11, -10, -7, 4, 7, 12, 17, 20, 18, 13, 6, 8, 19, + 22, 24, 17, 14, 5, -8, -29, -54, -77, -71, -55, -50, -44, -54, -57, -39, + -32, -15, 3, 15, 31, 34, 39, 47, 45, 44, 44, 37, 37, 33, 28, 27, + 18, 20, 21, 10, 7, 10, 7, 1, 2, 2, 0, -5, 0, -2, -7, -3, + -5, -8, -8, -5, -13, -13, -5, -6, -14, -11, -8, -8, -5, -5, -9, -17, + -10, -2, 0, -2, -1, -9, -12, -14, -12, -6, -1, 3, 11, 19, 19, 14, + 7, 9, 13, 17, 23, 22, 19, 21, 12, 2, -21, -55, -65, -59, -52, -47, + -56, -56, -50, -53, -38, -22, -7, 10, 18, 29, 36, 40, 45, 43, 38, 41, + 40, 32, 27, 26, 26, 19, 17, 17, 12, 9, 9, 6, 2, 4, 4, -1, + -2, 2, -3, -3, 0, -2, -8, -9, -7, -7, -7, -6, -8, -12, -6, -4, + -7, -12, -13, -10, -5, -2, -2, -3, -8, -12, -15, -16, -14, -13, -7, 2, + 8, 11, 8, 4, 5, 8, 13, 20, 22, 23, 24, 23, 19, 6, -13, -23, + -29, -32, -37, -42, -46, -53, -57, -53, -49, -39, -25, -12, -1, 10, 21, 28, + 32, 35, 36, 34, 34, 32, 28, 25, 24, 21, 18, 19, 16, 10, 7, 8, + 9, 8, 6, 5, 2, 3, 6, 7, 5, 2, -2, -4, -3, -1, -3, -4, + -3, -1, -3, -8, -13, -14, -11, -4, -1, -2, -4, -6, -11, -16, -19, -21, + -21, -17, -9, -3, 0, 0, -3, -5, -2, 4, 11, 18, 23, 25, 26, 24, + 17, 10, 5, -1, -7, -12, -20, -29, -37, -44, -51, -55, -54, -47, -39, -28, + -16, -4, 9, 18, 23, 27, 31, 31, 30, 30, 28, 23, 20, 22, 23, 20, + 14, 10, 9, 9, 10, 9, 6, 4, 4, 6, 9, 10, 7, 2, 0, 1, + -1, -2, -2, -1, 1, 2, -2, -10, -14, -11, -8, -5, -2, -1, -3, -6, + -9, -14, -20, -23, -23, -18, -11, -5, -3, -4, -6, -8, -4, 2, 7, 14, + 21, 25, 25, 23, 19, 13, 8, 4, -1, -9, -15, -23, -31, -39, -48, -53, + -51, -48, -44, -34, -20, -8, 3, 12, 20, 24, 27, 30, 31, 29, 24, 22, + 22, 23, 22, 18, 13, 10, 10, 11, 11, 9, 5, 3, 5, 10, 11, 9, + 7, 5, 4, 2, 0, -3, -1, 3, 5, 2, -3, -8, -11, -10, -7, -5, + -3, -2, -2, -4, -7, -14, -20, -24, -24, -19, -12, -6, -6, -8, -8, -8, + -7, -2, 5, 12, 19, 23, 24, 22, 20, 16, 12, 7, 1, -5, -10, -17, + -27, -36, -42, -47, -52, -51, -45, -36, -26, -12, 0, 9, 15, 21, 27, 30, + 29, 26, 23, 22, 23, 23, 21, 17, 12, 9, 10, 12, 10, 6, 3, 4, + 7, 10, 11, 9, 8, 9, 7, 2, -1, 0, 2, 6, 6, 3, -2, -7, + -9, -8, -6, -4, -3, -1, -1, -2, -6, -13, -21, -26, -24, -18, -13, -10, + -9, -10, -11, -11, -10, -5, 3, 10, 17, 21, 22, 22, 21, 19, 14, 8, + 5, 1, -7, -14, -21, -29, -38, -45, -49, -50, -48, -40, -28, -16, -6, 3, + 11, 19, 26, 27, 26, 24, 22, 22, 24, 24, 20, 14, 11, 11, 12, 11, + 8, 4, 3, 6, 8, 9, 9, 10, 11, 10, 6, 2, 0, 2, 5, 8, + 7, 3, -2, -5, -6, -7, -6, -4, -3, -1, 1, 1, -5, -13, -21, -24, + -23, -18, -14, -12, -11, -12, -13, -14, -13, -8, 0, 8, 14, 17, 21, 22, + 21, 18, 15, 12, 8, 2, -3, -9, -16, -24, -32, -40, -47, -51, -49, -41, + -30, -21, -12, -1, 9, 17, 23, 25, 24, 21, 21, 24, 24, 22, 17, 12, + 11, 13, 12, 8, 4, 3, 4, 6, 7, 7, 9, 11, 12, 10, 6, 3, + 3, 6, 9, 10, 8, 5, 1, -2, -3, -3, -2, -1, 1, 3, 3, 1, + -5, -12, -18, -20, -20, -18, -16, -16, -16, -17, -19, -20, -17, -11, -5, 1, + 8, 13, 17, 18, 18, 17, 16, 14, 11, 7, 2, -3, -8, -14, -22, -34, + -43, -46, -42, -35, -28, -20, -11, -2, 7, 15, 19, 19, 19, 19, 20, 20, + 17, 14, 11, 10, 9, 7, 1, -4, -6, -4, 0, 2, 4, 6, 7, 8, + 9, 8, 7, 7, 10, 13, 15, 15, 13, 9, 6, 3, 2, 4, 7, 9, + 11, 11, 7, 1, -5, -10, -13, -14, -14, -14, -16, -19, -23, -26, -28, -27, + -23, -18, -13, -7, -1, 6, 11, 14, 15, 14, 14, 15, 15, 12, 7, 2, + -1, -4, -11, -22, -34, -41, -40, -34, -26, -19, -12, -4, 4, 10, 14, 17, + 17, 18, 19, 18, 15, 12, 10, 9, 8, 6, 0, -6, -11, -10, -6, -1, + 3, 5, 6, 6, 6, 7, 7, 8, 10, 13, 16, 18, 17, 13, 9, 5, + 3, 4, 7, 11, 13, 14, 11, 5, -2, -7, -11, -12, -12, -13, -14, -17, + -22, -26, -28, -29, -27, -22, -17, -11, -5, 1, 7, 12, 14, 14, 13, 14, + 15, 14, 11, 5, 0, -2, -6, -15, -27, -37, -42, -38, -31, -24, -17, -9, + -1, 6, 12, 15, 17, 18, 19, 19, 17, 13, 11, 9, 9, 8, 4, -2, + -8, -11, -9, -4, 1, 4, 5, 6, 6, 6, 7, 7, 9, 11, 14, 17, + 18, 16, 12, 8, 4, 3, 5, 9, 12, 14, 13, 9, 2, -4, -9, -12, + -13, -12, -13, -15, -19, -23, -27, -29, -28, -25, -20, -15, -9, -3, 3, 9, + 13, 15, 14, 13, 15, 15, 13, 9, 3, -1, -3, -9, -19, -31, -40, -41, + -36, -28, -21, -14, -6, 2, 9, 13, 16, 17, 18, 19, 18, 16, 12, 10, + 9, 9, 7, 2, -4, -10, -11, -8, -2, 2, 5, 5, 6, 6, 7, 7, + 8, 9, 12, 16, 18, 17, 14, 10, 6, 4, 4, 6, 10, 13, 14, 12, + 7, 0, -6, -10, -12, -13, -13, -14, -16, -21, -25, -28, -29, -28, -24, -18, + -13, -7, -1, 6, 11, 14, 15, 13, 14, 15, 15, 12, 7, 2, -1, -5, + -12, -23, -35, -41, -40, -34, -26, -19, -12, -3, 4, 10, 14, 17, 18, 18, + 19, 18, 14, 11, 9, 9, 8, 6, 0, -7, -11, -10, -6, 0, 2, -1, + -2, -9, -24, 4, -3, 3, -3, 10, 7, 4, 13, -4, 1, 3, 3, 0, + 2, 8, -9, -9, 2, 1, -1, 7, 17, 21, 37, 25, 13, 14, -2, 15, + 20, 5, 0, -3, -7, -27, -14, -18, -19, -29, -20, -4, -18, -32, -30, -30, + -29, -32, -22, -26, -19, -19, -1, -6, 4, 7, 5, 2, 0, -8, -16, -12, + -13, -17, -17, 19, 20, 24, 16, 8, -4, 8, 0, 13, 28, 33, 16, 11, + 5, -3, -1, 4, 12, 12, 40, 20, 11, 4, 5, 8, -1, 2, 5, 5, + 22, 13, 21, 8, 9, 18, 20, 13, 20, 26, 11, 24, 17, 10, 27, 30, + 22, 28, 30, 41, 47, 57, 36, 36, 20, -16, 4, 6, -19, -21, -41, -39, + -33, -38, -41, -46, -42, -36, -18, -37, -65, -75, -77, -78, -62, -63, -62, -68, + -63, -63, -44, -50, -30, -41, -43, -26, -34, -35, -36, -45, -49, -27, 1, -6, + -4, -7, -20, -16, -20, -21, -13, 2, -6, -1, -12, 0, -1, 15, 19, 20, + 26, 37, 40, 46, 37, 50, 35, 34, 41, 43, 51, 54, 55, 50, 56, 47, + 59, 51, 51, 75, 67, 66, 71, 59, 60, 72, 75, 72, 80, 79, 82, 98, + 99, 87, 93, 62, 49, 58, 41, 42, 28, 5, -6, -6, -18, -24, -23, -30, + -25, -20, -38, -60, -75, -77, -80, -75, -71, -75, -70, -73, -69, -76, -60, -66, + -71, -66, -57, -62, -61, -61, -87, -90, -69, -63, -46, -31, -35, -47, -42, -53, + -63, -53, -45, -33, -36, -39, -37, -43, -39, -34, -30, -19, -9, 2, -9, -1, + -3, 1, -3, 5, 7, 15, 24, 22, 23, 20, 32, 43, 33, 48, 63, 67, + 70, 68, 52, 59, 73, 73, 77, 85, 73, 81, 103, 98, 116, 115, 87, 80, + 76, 72, 69, 60, 37, 27, 29, 12, 19, 4, -12, 1, 3, -3, -31, -42, + -57, -67, -67, -61, -61, -61, -48, -58, -51, -41, -46, -48, -40, -35, -33, -26, + -36, -67, -68, -65, -59, -47, -28, -34, -37, -36, -52, -61, -61, -47, -34, -39, + -39, -42, -42, -48, -36, -38, -37, -20, -19, -16, -16, -18, -20, -22, -26, -22, + -16, -15, 1, -4, -6, 10, 12, 13, 22, 32, 41, 54, 52, 44, 54, 66, + 61, 78, 81, 71, 87, 89, 99, 119, 107, 91, 77, 76, 69, 76, 68, 47, + 49, 35, 33, 37, 22, 14, 24, 37, 26, 13, -10, -26, -41, -43, -34, -40, + -34, -33, -43, -39, -25, -27, -27, -18, -25, -15, -1, -10, -29, -42, -39, -39, + -19, -7, -10, -10, -11, -20, -35, -44, -33, -30, -28, -36, -34, -47, -41, -36, + -46, -42, -34, -27, -29, -25, -34, -30, -32, -40, -36, -36, -31, -16, -25, -25, + -15, -21, -14, -9, -11, 1, 17, 15, 9, 25, 20, 25, 46, 39, 46, 50, + 51, 68, 85, 87, 72, 65, 52, 50, 59, 44, 42, 29, 23, 22, 23, 11, + -5, 8, 14, 19, 8, -6, -23, -38, -43, -42, -48, -41, -34, -42, -38, -19, + -23, -16, -15, -19, -10, 8, 8, -9, -18, -27, -30, -10, -4, 7, 6, 15, + 8, -8, -17, -15, -8, -11, -3, -15, -17, -14, -16, -27, -30, -26, -22, -19, + -21, -22, -19, -30, -27, -26, -36, -22, -9, -13, -10, -10, -8, -9, -6, -12, + -1, 16, 6, 11, 16, 6, 19, 24, 27, 38, 38, 38, 48, 71, 72, 78, + 66, 51, 54, 52, 49, 42, 32, 21, 25, 26, 13, 1, -1, 10, 15, 8, + 1, -22, -38, -47, -56, -58, -46, -43, -46, -33, -25, -17, -11, -9, -19, -9, + 16, 18, 12, 1, -17, -18, -9, 3, 9, 17, 24, 26, 9, -4, -1, -6, + 2, 9, 0, -2, 2, -3, -13, -16, -15, -8, -8, -8, -1, -6, -17, -11, + -22, -24, -16, -12, -9, -9, -9, -9, -6, -8, -16, 2, 6, 2, 13, 9, + 7, 10, 17, 19, 30, 31, 22, 37, 49, 61, 70, 56, 43, 37, 36, 31, + 32, 15, 4, 11, 9, 4, -14, -16, -7, -5, -1, -8, -28, -46, -56, -75, + -74, -67, -70, -67, -62, -55, -47, -36, -32, -42, -28, -9, 1, 4, -4, -17, + -30, -18, -12, -2, 4, 15, 21, 7, 1, -7, -6, -1, 7, 0, 0, 3, + -3, -8, -15, -18, -6, -9, -6, 5, -2, -2, 0, -7, -12, -7, -3, 2, + 7, 3, 4, 14, 2, 1, 12, 11, 17, 20, 19, 16, 19, 20, 24, 39, + 36, 37, 42, 55, 71, 84, 76, 63, 56, 47, 49, 46, 29, 18, 14, 18, + 11, -5, -11, -8, -3, 4, 4, -16, -27, -44, -60, -64, -59, -62, -62, -55, + -55, -47, -28, -32, -35, -29, -15, -3, 4, 3, -15, -25, -24, -13, -11, -3, + 10, 14, 12, 4, -5, -9, -1, 2, -1, 1, 1, -1, -7, -17, -16, -12, + -17, -8, 0, -1, -1, -2, -8, -13, -9, -9, 0, 9, 1, 14, 16, 6, + 7, 10, 12, 18, 26, 20, 22, 22, 16, 25, 32, 36, 34, 36, 43, 60, + 75, 72, 67, 52, 44, 50, 45, 38, 17, 14, 17, 11, -2, -9, -14, -10, + 0, -4, -12, -24, -41, -59, -67, -63, -70, -69, -62, -70, -55, -40, -38, -42, + -38, -29, -16, -3, -3, -9, -29, -31, -25, -26, -20, -7, 0, 2, -1, -14, + -18, -14, -14, -12, -10, -10, -4, -13, -21, -19, -22, -24, -16, -10, -6, -2, + -2, -10, -12, -15, -17, -4, -4, -5, 7, 9, 3, 4, 7, 5, 18, 23, + 22, 28, 25, 22, 27, 34, 39, 43, 38, 41, 62, 71, 79, 78, 62, 55, + 55, 57, 49, 31, 23, 30, 21, 15, 7, -5, 1, 8, 9, 8, -3, -16, + -39, -46, -50, -60, -55, -58, -62, -53, -36, -33, -34, -34, -29, -18, -6, 5, + -2, -17, -23, -22, -24, -17, -8, 1, 9, 10, -4, -7, -8, -9, -6, -9, + -6, 0, -11, -14, -14, -21, -24, -21, -16, -10, 1, -3, -3, -5, -14, -11, + -7, -7, -5, 6, 9, 4, 8, 1, 3, 11, 16, 20, 26, 24, 20, 25, + 29, 36, 41, 32, 40, 51, 64, 77, 78, 67, 55, 54, 57, 53, 33, 27, + 25, 22, 20, 9, -3, -3, 3, 7, 6, 4, -16, -32, -42, -55, -60, -61, + -64, -70, -62, -49, -39, -41, -40, -37, -33, -18, -5, -8, -16, -24, -29, -31, + -28, -24, -15, -1, 1, -7, -11, -14, -13, -14, -18, -11, -8, -14, -16, -16, + -25, -31, -29, -31, -20, -12, -13, -6, -11, -19, -19, -14, -17, -12, -1, 2, + 6, 7, 2, 4, 8, 11, 18, 24, 21, 22, 19, 21, 33, 33, 32, 32, + 40, 55, 71, 76, 72, 58, 55, 62, 56, 42, 34, 28, 29, 26, 17, 4, + 2, 6, 4, 13, 12, -4, -18, -30, -45, -50, -51, -59, -63, -61, -47, -37, + -33, -32, -34, -32, -19, -4, -3, -5, -13, -21, -23, -22, -24, -13, 1, 5, + 5, -3, -6, -1, -7, -9, -2, 1, -2, -2, -4, -13, -16, -22, -22, -15, + -10, -4, 2, -1, -11, -8, -7, -12, -6, 1, 6, 12, 11, 8, 9, 9, + 9, 20, 23, 26, 25, 20, 24, 32, 34, 35, 33, 35, 49, 63, 74, 74, + 58, 55, 60, 54, 45, 33, 27, 25, 26, 19, 6, 4, 1, 1, 9, 12, + -1, -10, -26, -43, -50, -54, -61, -70, -69, -61, -50, -43, -40, -44, -44, -34, + -18, -12, -9, -15, -24, -25, -28, -31, -22, -12, -2, 1, -8, -8, -5, -12, + -14, -8, -8, -8, -5, -9, -11, -18, -27, -26, -22, -19, -12, -1, -4, -9, + -8, -11, -14, -12, -8, 0, 7, 5, 5, 6, 0, 3, 8, 13, 20, 18, + 13, 15, 22, 27, 29, 25, 26, 36, 51, 70, 71, 59, 56, 57, 55, 47, + 37, 25, 24, 27, 17, 9, 3, -2, -2, 8, 9, 6, -2, -16, -34, -44, + -47, -54, -63, -66, -63, -55, -44, -39, -42, -44, -35, -23, -11, -4, -10, -16, + -17, -23, -25, -22, -13, 1, 6, 1, 1, 4, -2, -4, 1, -1, 4, 3, + 2, 2, -3, -12, -15, -14, -15, -7, 3, 5, 3, 2, 1, -2, -4, -4, + 3, 9, 10, 13, 11, 9, 8, 9, 15, 22, 22, 20, 19, 21, 27, 30, + 28, 28, 28, 42, 61, 69, 65, 60, 60, 58, 55, 47, 35, 30, 30, 24, + 18, 10, 0, -1, 2, 6, 7, 3, -8, -24, -36, -43, -50, -59, -65, -66, + -62, -52, -43, -43, -44, -41, -35, -21, -12, -12, -13, -17, -23, -26, -30, -24, + -12, -4, -5, -3, -2, -5, -6, -6, -5, -3, -2, -1, 2, 2, -5, -3, + 2, 8, 17, 26, 32, 42, 50, 56, 68, 73, 64, 63, 65, 48, 56, 71, + 48, 49, 50, 26, 30, 30, 16, 25, 21, -2, 0, -13, -15, -2, -19, -17, + -16, -50, -49, -49, -81, -85, -88, -108, -112, -116, -127, -126, -113, -113, -106, -79, + -65, -48, -17, 5, 20, 41, 58, 63, 69, 59, 28, 17, 0, -32, -41, -52, + -69, -63, -61, -59, -41, -26, -19, 6, 28, 33, 52, 67, 70, 81, 87, 84, + 90, 93, 84, 72, 69, 60, 45, 56, 57, 40, 46, 39, 25, 29, 25, 16, + 21, 12, -1, -3, -11, -8, -5, -16, -12, -21, -41, -38, -48, -68, -70, -77, + -91, -93, -98, -106, -103, -93, -92, -82, -60, -47, -30, -4, 13, 27, 44, 56, + 60, 62, 47, 23, 13, -8, -32, -40, -54, -64, -59, -59, -53, -36, -26, -14, + 12, 27, 36, 56, 66, 72, 84, 86, 86, 93, 92, 82, 73, 70, 57, 49, + 59, 52, 43, 47, 37, 29, 30, 24, 18, 18, 7, -2, -6, -11, -7, -10, + -16, -14, -29, -42, -42, -57, -71, -73, -83, -93, -96, -102, -107, -101, -93, -90, + -75, -55, -41, -22, 3, 19, 33, 50, 59, 61, 60, 41, 21, 10, -14, -33, + -43, -57, -63, -60, -61, -51, -36, -27, -9, 15, 26, 40, 59, 66, 74, 85, + 85, 88, 94, 90, 80, 75, 69, 56, 54, 60, 50, 47, 46, 36, 31, 30, + 23, 19, 15, 4, -3, -7, -10, -9, -14, -17, -19, -35, -44, -47, -63, -73, + -77, -88, -96, -98, -104, -107, -99, -92, -86, -69, -50, -35, -14, 9, 24, 38, + 54, 60, 61, 56, 36, 19, 4, -20, -35, -46, -60, -62, -61, -60, -48, -35, + -25, -3, 17, 27, 45, 60, 66, 77, 85, 86, 91, 94, 88, 80, 75, 67, + 56, 58, 59, 50, 49, 45, 36, 33, 30, 23, 19, 13, 2, -5, -8, -10, + -11, -16, -18, -25, -40, -45, -53, -68, -76, -81, -91, -97, -100, -106, -106, -97, + -90, -81, -63, -44, -28, -6, 15, 28, 44, 57, 61, 61, 52, 31, 16, -1, + -24, -37, -50, -61, -62, -62, -59, -46, -35, -22, 1, 18, 30, 48, 61, 68, + 79, 85, 87, 92, 93, 86, 80, 75, 66, 58, 60, 58, 51, 50, 44, 37, + 33, 29, 23, 17, 10, 0, -6, -9, -10, -14, -18, -21, -31, -43, -48, -59, + -72, -78, -85, -94, -99, -102, -107, -104, -95, -88, -76, -56, -39, -22, 2, 20, + 33, 49, 59, 61, 60, 47, 27, 12, -7, -27, -40, -53, -62, -62, -63, -57, + -44, -34, -18, 5, 19, 33, 51, 61, 70, 81, 85, 88, 94, 92, 85, 80, + 74, 65, 60, 62, 57, 52, 50, 43, 37, 33, 28, 22, 15, 8, -2, -7, + -10, -12, -16, -20, -24, -36, -46, -52, -64, -75, -81, -89, -97, -100, -104, -107, + -102, -93, -85, -70, -50, -33, -14, 8, 25, 38, 53, 61, 61, 58, 42, 24, + 8, -12, -30, -43, -56, -62, -63, -63, -54, -43, -32, -13, 7, 20, 37, 53, + 62, 72, 82, 85, 89, 94, 90, 84, 80, 73, 64, 62, 62, 56, 53, 49, + 43, 37, 33, 27, 20, 14, 5, -3, -8, -11, -13, -18, -22, -28, -40, -49, + -57, -69, -78, -84, -92, -99, -102, -105, -106, -99, -90, -81, -64, -44, -27, -7, + 14, 29, 43, 56, 61, 61, 54, 37, 20, 4, -17, -33, -46, -58, -62, -64, + -62, -52, -42, -29, -9, 9, 23, 40, 55, 64, 74, 83, 86, 91, 93, 89, + 84, 80, 72, 65, 64, 62, 56, 53, 49, 42, 37, 33, 26, 19, 12, 3, + -5, -8, -12, -16, -20, -24, -33, -44, -52, -61, -73, -80, -87, -95, -100, -103, + -106, -104, -96, -88, -76, -57, -38, -21, 0, 20, 33, 47, 59, 62, 60, 51, + 33, 17, -1, -21, -36, -49, -59, -63, -64, -61, -51, -40, -25, -5, 11, 26, + 43, 56, 65, 76, 83, 87, 92, 93, 88, 84, 79, 71, 65, 65, 61, 56, + 53, 48, 42, 37, 32, 25, 17, 10, 1, -6, -10, -13, -18, -22, -27, -37, + -48, -55, -65, -76, -83, -90, -97, -101, -104, -106, -102, -94, -84, -71, -51, -33, + -15, 7, 24, 38, 51, 60, 62, 59, 46, 29, 13, -6, -25, -39, -52, -60, + -63, -64, -59, -49, -38, -21, -1, 14, 29, 46, 57, 67, 78, 84, 88, 92, + 92, 87, 83, 78, 70, 66, 65, 61, 57, 53, 48, 42, 37, 31, 23, 15, + 7, -1, -7, -11, -15, -20, -24, -31, -41, -51, -59, -69, -79, -85, -93, -99, + -102, -105, -106, -100, -91, -80, -65, -45, -27, -8, 13, 29, 42, 55, 61, 61, + 56, 42, 25, 8, -11, -28, -42, -54, -61, -64, -64, -57, -47, -35, -17, 1, + 16, 33, 48, 59, 69, 79, 84, 89, 93, 91, 87, 83, 77, 70, 67, 65, + 60, 57, 53, 47, 41, 36, 29, 21, 14, 5, -3, -8, -12, -17, -22, -27, + -35, -45, -54, -63, -73, -81, -88, -95, -100, -103, -105, -104, -97, -88, -76, -58, + -39, -21, -1, 18, 33, 46, 58, 62, 61, 53, 38, 21, 4, -15, -31, -45, + -56, -62, -65, -64, -56, -46, -32, -13, 4, 19, 36, 50, 61, 71, 80, 85, + 90, 92, 90, 86, 82, 76, 70, 68, 65, 60, 57, 52, 46, 41, 35, 27, + 19, 12, 3, -5, -9, -14, -19, -24, -29, -38, -48, -57, -66, -76, -84, -91, + -97, -101, -104, -105, -102, -94, -84, -71, -52, -33, -15, 5, 23, 37, 50, 60, + 62, 60, 50, 34, 17, -1, -19, -35, -48, -58, -63, -65, -62, -54, -43, -28, + -10, 7, 22, 39, 52, 62, 73, 81, 86, 91, 92, 89, 86, 82, 75, 70, + 68, 64, 60, 57, 52, 46, 40, 34, 26, 17, 9, 1, -6, -11, -15, -21, + -26, -32, -42, -52, -60, -70, -79, -86, -93, -99, -102, -104, -105, -100, -91, -80, + -65, -46, -27, -9, 11, 28, 42, 54, 61, 62, 58, 46, 30, 13, -6, -23, + -38, -51, -60, -64, -65, -61, -52, -41, -25, -6, 9, 26, 42, 54, 64, 75, + 82, 87, 91, 91, 89, 85, 81, 74, 71, 68, 64, 60, 56, 51, 45, 39, + 32, 24, 16, 7, -1, -7, -12, -17, -23, -28, -36, -45, -55, -64, -73, -82, + -88, -95, -100, -103, -105, -104, -97, -88, -76, -59, -40, -22, -2, 17, 32, 45, + 57, 62, 62, 56, 42, 26, 9, -10, -27, -41, -53, -61, -65, -65, -60, -50, + -38, -21, -3, 12, 29, 44, 55, 66, 76, 82, 88, 91, 91, 88, 85, 80, + 74, 71, 68, 63, 60, 56, 50, 44, 38, 30, 22, 14, 5, -3, -9, -14, + -19, -25, -31, -39, -49, -58, -67, -77, -84, -91, -97, -101, -103, -105, -102, -95, + -84, -71, -53, -34, -16, 4, 22, 37, 49, 59, 63, 61, 53, 38, 22, 4, + -14, -30, -44, -56, -62, -66, -65, -58, -48, -35, -17, -1, 15, 32, 46, 57, + 68, 77, 83, 88, 91, 90, 88, 84, 79, 74, 71, 67, 63, 60, 55, 49, + 43, 37, 28, 20, 12, 3, -5, -10, -15, -21, -27, -33, -43, -52, -61, -70, + -79, -86, -93, -98, -102, -104, -104, -100, -92, -81, -66, -47, -28, -10, 10, 27, + 40, 53, 61, 63, 59, 49, 34, 18, -1, -18, -34, -47, -58, -63, -66, -64, + -56, -46, -31, -14, 2, 18, 35, 48, 59, 70, 78, 84, 89, 91, 90, 87, + 83, 78, 74, 71, 67, 63, 59, 54, 49, 42, 35, 27, 18, 9, 1, -6, + -12, -17, -23, -29, -36, -46, -55, -64, -73, -82, -89, -95, -100, -102, -104, -103, + -97, -88, -76, -60, -41, -23, -4, 15, 31, 44, 55, 62, 62, 57, 46, 30, + 13, -5, -22, -37, -50, -59, -64, -66, -62, -55, -43, -28, -11, 5, 22, 37, + 50, 61, 71, 79, 85, 89, 91, 89, 87, 82, 77, 73, 70, 66, 63, 59, + 53, 47, 41, 33, 24, 16, 7, -1, -8, -14, -19, -25, -32, -40, -49, -58, + -67, -76, -84, -91, -96, -101, -103, -104, -102, -95, -85, -72, -55, -37, -18, 1, + 19, 34, 47, 57, 62, 62, 56, 43, 28, 10, -8, -25, -39, -52, -60, -65, + -66, -62, -53, -42, -25, -9, 8, 24, 39, 51, 62, 72, 80, 86, 90, 90, + 89, 86, 82, 77, 73, 70, 66, 62, 58, 53, 47, 40, 33, 24, 15, 6, + -2, -8, -14, -19, -25, -32, -40, -49, -58, -67, -72, -103, -18, -76, 0, 0, + 0, 0, 1, 2, 3, 5, 6, 0, -7, -8, -15, -9, 10, 8, 17, 33, + 14, 5, 38, 44, 31, 63, 70, 51, 73, 82, 68, 85, 100, 96, 97, 103, + 115, 114, 112, 127, 122, 110, 116, 113, 109, 120, 120, 118, 113, 91, 93, 109, + 97, 98, 115, 110, 109, 120, 112, 94, 75, 63, 69, 72, 64, 64, 59, 45, + 39, 36, 35, 42, 42, 24, 5, 2, 3, 4, 7, 9, 11, 14, 17, 19, + 14, -3, -20, -26, -30, -26, -24, -31, -32, -34, -40, -39, -33, -34, -45, -56, + -60, -66, -64, -55, -60, -62, -56, -59, -58, -50, -56, -70, -73, -76, -86, -77, + -70, -80, -76, -71, -77, -71, -66, -76, -85, -82, -90, -95, -80, -82, -92, -85, + -86, -94, -85, -79, -86, -92, -90, -94, -101, -92, -85, -90, -84, -77, -78, -74, + -73, -85, -86, -85, -95, -85, -77, -90, -88, -83, -94, -93, -83, -81, -81, -86, + -89, -89, -94, -88, -77, -77, -71, -59, -58, -59, -63, -72, -74, -77, -73, -61, + -67, -72, -67, -73, -80, -74, -68, -60, -56, -65, -70, -67, -72, -66, -52, -49, + -40, -27, -27, -32, -39, -47, -50, -42, -30, -31, -34, -32, -38, -46, -46, -43, + -35, -20, -16, -24, -30, -30, -31, -24, -13, -6, 4, 13, 11, 3, -5, -9, + -2, 12, 15, 15, 16, 9, 3, -2, -5, -1, 12, 24, 30, 29, 20, 17, + 22, 25, 30, 41, 47, 49, 46, 37, 32, 41, 52, 54, 60, 61, 52, 48, + 45, 36, 35, 43, 51, 60, 67, 69, 60, 57, 63, 63, 64, 73, 75, 72, + 69, 63, 67, 78, 78, 82, 89, 80, 73, 76, 67, 60, 64, 67, 73, 79, + 83, 88, 82, 75, 80, 81, 77, 83, 83, 76, 74, 77, 83, 85, 86, 94, + 89, 80, 82, 78, 69, 68, 68, 69, 78, 80, 81, 90, 83, 73, 79, 77, + 70, 73, 70, 62, 65, 73, 75, 76, 84, 82, 70, 71, 69, 59, 57, 54, + 48, 53, 63, 64, 68, 76, 66, 57, 58, 51, 42, 40, 33, 28, 37, 46, + 49, 55, 56, 42, 37, 37, 27, 22, 20, 10, 4, 8, 15, 24, 30, 31, + 24, 14, 8, -3, -14, -21, -26, -26, -15, -4, -1, -4, -13, -21, -26, -34, + -39, -42, -50, -57, -63, -66, -60, -47, -43, -48, -51, -57, -66, -75, -82, -88, + -91, -88, -78, -74, -81, -86, -85, -92, -101, -100, -102, -109, -109, -110, -112, -113, + -115, -109, -106, -113, -113, -107, -110, -110, -106, -108, -112, -109, -110, -114, -111, -98, + -95, -98, -93, -93, -98, -94, -89, -81, -69, -65, -71, -73, -73, -77, -73, -62, + -56, -48, -40, -41, -45, -47, -47, -37, -20, -11, -4, 5, 4, 3, 6, 9, + 16, 30, 39, 47, 51, 44, 40, 45, 47, 50, 59, 64, 66, 68, 65, 65, + 75, 80, 78, 87, 95, 91, 93, 98, 96, 98, 104, 100, 96, 99, 104, 101, + 100, 106, 107, 105, 108, 109, 109, 110, 111, 110, 101, 87, 82, 84, 81, 82, + 88, 89, 90, 91, 85, 71, 57, 49, 48, 51, 52, 55, 59, 58, 58, 60, + 61, 61, 57, 42, 24, 14, 7, 5, 9, 11, 15, 20, 21, 19, 11, -3, + -18, -27, -33, -31, -25, -24, -21, -16, -16, -14, -11, -17, -29, -40, -49, -59, + -61, -55, -54, -52, -45, -42, -41, -41, -48, -59, -65, -72, -81, -79, -72, -73, + -69, -62, -61, -59, -60, -69, -76, -79, -87, -92, -84, -81, -82, -76, -72, -71, + -67, -66, -72, -79, -81, -87, -94, -92, -87, -86, -82, -76, -75, -75, -78, -85, + -87, -91, -96, -91, -82, -83, -80, -74, -74, -71, -64, -64, -68, -73, -77, -81, + -87, -88, -82, -79, -76, -70, -69, -72, -76, -80, -84, -87, -82, -71, -67, -64, + -58, -57, -55, -49, -43, -39, -40, -47, -54, -58, -64, -66, -61, -58, -54, -49, + -50, -55, -59, -63, -65, -58, -45, -38, -32, -25, -24, -23, -18, -13, -5, 3, + 4, -2, -11, -17, -23, -26, -23, -20, -18, -15, -18, -24, -28, -28, -21, -7, + 3, 11, 18, 20, 19, 22, 24, 30, 40, 47, 51, 49, 40, 32, 28, 24, + 23, 25, 25, 23, 20, 15, 15, 23, 34, 43, 51, 59, 59, 58, 59, 58, + 60, 67, 73, 78, 84, 85, 78, 71, 68, 63, 60, 60, 57, 53, 50, 50, + 56, 65, 70, 76, 84, 84, 81, 81, 79, 76, 79, 84, 87, 91, 96, 98, + 94, 88, 85, 81, 76, 73, 70, 66, 66, 70, 76, 80, 84, 91, 92, 87, + 86, 83, 78, 76, 78, 81, 85, 88, 91, 96, 93, 86, 83, 78, 71, 68, + 64, 61, 64, 71, 74, 78, 84, 86, 80, 76, 72, 64, 59, 56, 55, 59, + 66, 69, 74, 79, 76, 69, 64, 57, 48, 43, 39, 39, 45, 52, 56, 62, + 63, 55, 47, 41, 31, 21, 15, 8, 5, 9, 16, 24, 31, 35, 33, 26, + 19, 10, 0, -6, -9, -7, -7, -13, -17, -22, -26, -31, -34, -37, -40, -42, + -44, -46, -48, -50, -51, -54, -56, -58, -61, -64, -67, -70, -74, -78, -82, -86, + -90, -93, -97, -99, -102, -104, -106, -108, -109, -110, -111, -112, -113, -113, -114, -114, + -115, -115, -115, -115, -115, -114, -113, -111, -109, -107, -104, -100, -97, -93, -90, -87, + -84, -82, -80, -78, -76, -74, -73, -71, -69, -67, -65, -61, -58, -53, -48, -42, + -35, -28, -21, -13, -6, 1, 8, 15, 21, 26, 31, 35, 38, 41, 44, 46, + 48, 50, 52, 55, 58, 61, 64, 68, 72, 76, 80, 83, 87, 90, 92, 94, + 96, 98, 99, 100, 101, 102, 102, 103, 103, 103, 103, 104, 103, 103, 103, 102, + 101, 99, 97, 94, 92, 88, 85, 81, 78, 74, 71, 67, 64, 61, 58, 55, + 53, 51, 49, 47, 46, 44, 42, 40, 37, 34, 30, 26, 22, 17, 12, 8, + 3, -1, -5, -9, -13, -16, -20, -23, -26, -29, -31, -33, -35, -37, -38, -40, + -42, -44, -46, -48, -51, -54, -56, -59, -61, -64, -65, -67, -69, -70, -72, -74, + -75, -77, -78, -80, -81, -82, -83, -84, -85, -86, -86, -87, -88, -89, -90, -90, + -91, -92, -92, -92, -92, -92, -92, -91, -91, -92, -92, -92, -93, -93, -94, -94, + -94, -95, -95, -95, -95, -95, -95, -95, -95, -95, -94, -93, -92, -91, -90, -89, + -87, -86, -85, -85, -85, -84, -84, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -84, -83, -82, -81, -79, -77, -75, -73, -70, -68, -65, -63, -62, -60, -59, -59, + -59, -59, -59, -59, -59, -60, -59, -59, -59, -58, -57, -55, -53, -50, -47, -44, + -40, -36, -32, -29, -25, -22, -20, -18, -17, -16, -15, -15, -16, -16, -16, -16, + -16, -16, -15, -13, -11, -9, -6, -2, 2, 6, 10, 15, 19, 22, 26, 29, + 31, 33, 35, 36, 36, 36, 36, 35, 35, 35, 35, 35, 36, 38, 40, 42, + 45, 48, 52, 55, 58, 61, 64, 67, 70, 72, 73, 74, 75, 76, 76, 76, + 75, 75, 74, 74, 74, 74, 74, 75, 77, 78, 80, 82, 83, 85, 87, 89, + 90, 91, 92, 93, 94, 94, 94, 94, 94, 93, 93, 92, 91, 91, 90, 90, + 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, + 93, 93, 92, 92, 91, 90, 89, 88, 87, 87, 86, 86, 85, 85, 85, 84, + 84, 83, 83, 82, 81, 80, 79, 78, 77, 77, 76, 75, 74, 72, 71, 70, + 68, 67, 65, 64, 63, 61, 60, 58, 57, 55, 53, 50, 48, 45, 43, 40, + 38, 36, 34, 32, 30, 29, 27, 25, 23, 21, 19, 17, 14, 12, 9, 6, + 3, 0, -4, -8, -12, -17, -21, -25, -29, -33, -36, -39, -42, -45, -47, -49, + -51, -53, -55, -58, -60, -63, -65, -68, -71, -74, -77, -81, -84, -87, -91, -94, + -97, -99, -102, -104, -105, -107, -108, -109, -110, -111, -111, -112, -112, -113, -113, -113, + -113, -113, -113, -112, -111, -109, -107, -105, -102, -99, -96, -93, -90, -87, -84, -82, + -79, -77, -75, -73, -70, -69, -66, -64, -60, -58, -53, -49, -44, -39, -32, -27, + -19, -14, -8, -3, 3, 11, 22, 10, 8, 1, 1, 1, 1, 1, 2, 2, + 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 5, 6, 6, 6, 6, + 6, 6, 7, 5, 7, 5, 6, 4, 6, 4, 4, 4, 4, 3, 3, 2, + 3, 1, 3, -2, 2, 0, 0, 0, 0, -2, -1, -2, -3, -3, 0, -5, + -1, -2, -2, -2, -1, 0, -3, -1, -1, 0, 1, -1, 0, -1, 0, 0, + 1, 0, 0, 1, -1, 1, -1, 1, -2, -1, -3, 0, -2, -1, -2, -2, + -2, -3, -2, -3, -4, -5, -6, -5, -9, -8, -9, -9, -9, -11, -10, -13, + -14, -14, -15, -16, -15, -17, -19, -19, -21, -18, -21, -20, -22, -20, -24, -21, + -22, -19, -20, -21, -17, -19, -16, -17, -15, -17, -13, -11, -10, -7, -5, -3, + 2, 6, 4, 8, 9, 18, 14, 31, 25, 24, 25, 24, 21, 13, 15, 15, + 11, 9, 1, 4, -20, -18, -38, -44, -57, -57, -55, -55, -52, -55, -46, -47, + -40, -32, -26, -19, -16, -2, 3, 13, 19, 28, 30, 37, 40, 44, 39, 38, + 35, 34, 37, 41, 48, 51, 53, 58, 61, 70, 74, 76, 76, 80, 81, 86, + 83, 83, 78, 78, 73, 69, 65, 55, 47, 40, 36, 29, 23, 16, 14, 8, + -2, -4, -11, -11, -19, -22, -26, -25, -34, -39, -40, -41, -45, -49, -51, -57, + -56, -58, -59, -66, -70, -70, -72, -65, -64, -59, -53, -49, -45, -34, -29, -21, + -15, -10, -6, -6, -3, -4, 2, 3, 3, 3, -1, -3, -11, -11, -13, -16, + -22, -24, -27, -32, -34, -37, -35, -31, -30, -26, -25, -22, -21, -15, -13, -15, + -10, -12, -12, -7, 2, 15, 22, 27, 24, 28, 22, 22, 21, 22, 17, 13, + 14, 9, 5, 2, -8, -12, -16, -14, -17, -17, -17, -17, -14, -8, -3, -3, + 0, 5, 3, 5, 6, 3, -2, -6, -9, -11, -13, -18, -19, -29, -42, -61, + -72, -79, -81, -83, -82, -79, -76, -65, -54, -42, -33, -24, -14, 0, 18, 33, + 48, 62, 75, 87, 93, 99, 100, 102, 102, 104, 102, 100, 100, 96, 93, 95, + 96, 105, 109, 112, 111, 110, 106, 106, 104, 102, 97, 93, 85, 80, 71, 60, + 48, 36, 26, 12, 0, -5, -13, -21, -28, -31, -36, -42, -49, -53, -56, -59, + -61, -63, -64, -64, -63, -67, -70, -77, -75, -77, -78, -79, -80, -81, -80, -75, + -69, -64, -57, -50, -43, -35, -26, -16, -6, 6, 13, 17, 22, 26, 25, 27, + 27, 26, 23, 19, 11, 5, -5, -12, -19, -24, -31, -37, -42, -45, -50, -49, + -48, -47, -43, -41, -38, -38, -37, -35, -35, -37, -42, -40, -33, -27, -20, -12, + -11, -13, -10, -9, -10, -10, -10, -13, -11, -9, -8, -11, -13, -16, -18, -17, + -15, -15, -14, -12, -8, -3, 3, 8, 16, 22, 25, 31, 34, 36, 36, 34, + 31, 25, 23, 24, 26, 23, 13, -1, -16, -29, -38, -45, -51, -56, -57, -54, + -48, -39, -34, -29, -20, -10, 0, 13, 27, 39, 54, 68, 79, 87, 92, 94, + 96, 94, 92, 89, 87, 82, 76, 72, 71, 74, 76, 81, 83, 83, 84, 84, + 85, 85, 82, 81, 82, 80, 75, 71, 66, 57, 46, 34, 24, 15, 5, -2, + -8, -13, -19, -26, -31, -37, -41, -44, -48, -53, -54, -53, -54, -54, -57, -61, + -64, -67, -70, -72, -75, -77, -79, -79, -76, -73, -70, -63, -58, -53, -47, -38, + -29, -21, -13, -6, 0, 4, 7, 7, 8, 8, 6, 5, -1, -8, -15, -22, + -30, -36, -41, -47, -51, -54, -56, -58, -59, -56, -50, -45, -42, -37, -31, -26, + -23, -23, -23, -24, -21, -14, -6, 2, 8, 12, 15, 18, 21, 20, 20, 20, + 20, 21, 23, 22, 18, 13, 10, 8, 6, 5, 4, 3, 2, 2, 4, 7, + 10, 13, 18, 22, 24, 26, 28, 27, 21, 14, 8, 5, 4, 2, -3, -12, + -24, -37, -50, -59, -67, -76, -80, -79, -75, -69, -61, -55, -47, -38, -27, -15, + -2, 11, 27, 43, 58, 71, 82, 90, 94, 96, 98, 98, 98, 95, 89, 84, + 81, 79, 81, 85, 88, 89, 91, 92, 92, 90, 89, 89, 88, 85, 82, 79, + 75, 67, 58, 48, 37, 25, 14, 4, -4, -10, -17, -24, -31, -37, -42, -47, + -51, -56, -59, -59, -59, -59, -61, -63, -65, -67, -70, -72, -74, -76, -78, -78, + -78, -75, -70, -66, -61, -56, -50, -41, -33, -23, -14, -6, 2, 10, 16, 19, + 21, 23, 24, 24, 22, 19, 13, 7, 0, -6, -14, -20, -25, -27, -32, -37, + -39, -39, -38, -36, -33, -30, -27, -22, -19, -19, -20, -23, -24, -22, -18, -13, + -8, -4, 0, 2, 5, 6, 5, 3, 2, 4, 6, 6, 5, 1, -2, -6, + -8, -9, -10, -11, -13, -12, -12, -11, -9, -4, 0, 4, 8, 13, 18, 20, + 19, 14, 10, 6, 4, 4, 4, 0, -8, -17, -28, -38, -49, -60, -68, -72, + -72, -70, -65, -59, -54, -46, -37, -27, -17, -5, 8, 22, 37, 51, 66, 77, + 84, 88, 91, 93, 94, 94, 91, 85, 79, 75, 74, 76, 77, 80, 83, 85, + 85, 85, 86, 86, 85, 85, 85, 83, 81, 77, 70, 64, 55, 44, 32, 22, + 13, 6, -1, -9, -16, -22, -27, -32, -38, -43, -46, -47, -47, -47, -48, -49, + -49, -50, -52, -54, -56, -59, -62, -64, -66, -65, -64, -61, -59, -56, -53, -48, + -41, -33, -25, -17, -10, -2, 4, 9, 13, 15, 16, 17, 17, 15, 11, 7, + 1, -7, -15, -22, -27, -33, -38, -43, -47, -49, -50, -50, -49, -46, -42, -37, + -31, -28, -28, -29, -30, -29, -26, -22, -17, -13, -8, -3, 2, 6, 7, 6, + 5, 6, 8, 10, 12, 11, 8, 5, 3, 1, -1, -2, -3, -4, -6, -7, + -6, -3, 0, 1, 5, 10, 16, 20, 21, 19, 15, 10, 8, 6, 6, 4, + 0, -5, -12, -22, -33, -45, -57, -65, -70, -72, -70, -68, -64, -58, -51, -44, + -36, -24, -13, -2, 11, 27, 43, 58, 70, 78, 83, 88, 92, 96, 97, 93, + 89, 85, 81, 80, 81, 83, 86, 88, 90, 91, 91, 91, 91, 91, 91, 91, + 89, 86, 83, 79, 72, 63, 52, 41, 30, 21, 13, 4, -5, -11, -17, -23, + -31, -38, -44, -47, -49, -50, -52, -54, -55, -57, -57, -58, -60, -63, -66, -69, + -72, -74, -73, -72, -70, -69, -67, -64, -59, -53, -45, -37, -30, -22, -14, -7, + -2, 3, 8, 10, 12, 12, 13, 12, 8, 3, -4, -10, -16, -21, -27, -33, + -37, -41, -44, -46, -48, -48, -45, -48, -43, -37, -33, -31, -32, -33, -32, -29, + -26, -22, -18, -12, -5, 1, 6, 9, 9, 9, 9, 11, 14, 16, 16, 14, + 12, 8, 5, 3, 2, 1, -1, -3, -4, -4, -2, -1, 2, 5, 11, 18, + 24, 27, 27, 24, 20, 17, 15, 13, 11, 9, 5, -1, -10, -22, -35, -49, + -61, -70, -75, -77, -76, -73, -69, -63, -56, -47, -36, -25, -13, 0, 16, 34, + 52, 67, 79, 88, 95, 101, 106, 109, 108, 105, 100, 95, 92, 90, 91, 93, + 96, 99, 100, 101, 101, 101, 101, 101, 101, 100, 97, 95, 91, 85, 78, 67, + 55, 43, 31, 21, 11, 1, -7, -14, -21, -29, -37, -45, -51, -54, -56, -58, + -60, -62, -64, -65, -66, -67, -69, -72, -76, -80, -82, -84, -83, -82, -80, -79, + -77, -73, -67, -60, -51, -42, -34, -25, -16, -8, -2, 4, 9, 12, 13, 14, + 14, 13, 9, 3, -5, -12, -18, -25, -31, -37, -42, -47, -50, -53, -54, -53, + -48, -41, -36, -32, -31, -31, -32, -31, -28, -25, -22, -17, -12, -5, 1, 1, + -2, -1, -9, -9, -6, 5, 6, -1, -10, 8, 24, 11, -2, -14, -9, -15, + -13, 5, 14, 12, -6, -1, -12, 1, -9, 12, 12, 10, 5, -19, -11, -13, + -2, 8, 5, 1, -2, -3, 9, -6, 6, 5, 6, -3, -17, -7, 3, 2, + -1, 0, 7, -7, 5, 4, 6, -18, -24, 6, 20, -1, -4, -1, 10, 3, + -10, 8, 7, -11, -17, -15, 5, 18, 4, 1, 8, -16, -4, 0, 11, 9, + -10, -15, 0, -22, -12, 19, 34, 16, -9, -16, -7, -12, -10, 13, 23, -1, + -10, -2, -3, -11, 13, 7, -6, -9, 3, 11, -10, -18, 12, 22, 7, -27, + -29, -4, 20, 20, 10, 8, -16, -26, -6, 22, 21, 7, 15, 8, -50, -50, + -7, 35, 22, -13, 32, 41, -33, -46, -10, 23, -7, -25, 23, 21, -38, -36, + 14, 44, 2, 2, 34, -14, -51, -29, 11, 19, 7, 22, 13, -23, -21, -8, + -9, 1, 14, 26, 26, -8, -34, -33, 4, 1, -6, -2, 16, -7, -23, 12, + 27, 5, 6, 6, 0, -8, 0, -1, -17, -13, -12, 3, 9, 4, 11, 23, + 36, 0, -43, -16, 4, -21, -26, 27, 16, -25, 3, 65, 4, -34, 24, -10, + -38, -14, 13, 4, -15, 36, 44, -42, -51, 20, -5, -6, 68, 20, -18, -39, + -11, 9, 17, 6, -33, -20, -13, 48, 30, 22, -4, -9, -53, -20, 32, 32, + -16, 17, -11, -36, -8, -5, 39, 28, 33, 21, -64, -48, 3, -22, 15, 62, + -26, 0, 3, 5, 73, -14, -48, -20, -59, 4, 70, 60, -7, -2, -88, -22, + -17, 39, 17, 33, -3, 15, 28, -47, -80, -37, 5, 7, 104, 16, -99, -92, + -36, 109, 78, 26, -15, -92, -21, 62, 48, -51, -81, -25, 55, 63, 35, 21, + -115, -54, 101, 73, -41, -110, -66, 50, 107, 45, -8, -109, -38, 12, 102, 3, + 17, -45, -2, -36, 39, 46, -12, -28, -27, -17, 17, -18, 82, -5, -3, -25, + -5, -14, 15, 9, -3, -17, -6, 2, 7, -36, -13, 6, 21, -23, -20, 16, + -18, 3, -2, 26, 0, 13, -23, -2, -19, -28, -18, 15, 12, 22, -4, 23, + -17, -22, -9, -18, -4, 11, 13, 0, 34, -16, -20, 26, 23, 15, -4, -25, + 7, 8, -9, 8, 44, 1, -40, 17, -32, 9, -30, -52, 52, 3, 2, -21, + 83, 58, -14, -46, -61, -12, -67, -20, 64, 72, 57, -10, 5, 1, -77, 31, + -47, -39, 12, 22, 57, 28, 0, 9, -76, 15, -74, 33, -12, 39, 114, -35, + -36, -38, -23, 27, -21, 14, 56, 47, 6, -72, -61, -4, 18, -4, 19, 13, + 45, 71, 48, -1, -125, -52, -56, -20, -18, -12, 51, 78, 68, -46, 32, -40, + -29, -28, -81, -25, 75, 42, 58, -38, 1, -29, -34, 31, -36, -14, 10, 64, + 37, 2, -31, -72, -17, -33, 30, -52, -54, 25, 43, 70, 81, -9, -73, 4, + -65, 15, -28, 25, 0, 28, 19, 51, -26, 6, 0, -37, -15, -22, -20, -16, + -5, 50, 56, 67, 25, 16, -35, -29, -14, -39, 19, -24, -52, -13, -32, -10, + 39, 33, 59, 6, 37, 55, 11, -9, -35, -15, -57, -56, -36, -34, 19, 19, + 6, 20, 17, -11, 5, 26, 19, 16, 7, -20, -26, -55, -62, -36, -18, 19, + 37, 47, 25, -6, -14, 1, -4, -13, 12, 23, 34, 38, 41, 33, 31, -10, + -56, -52, -49, -31, -40, -21, -12, 0, 5, 12, 22, 22, 21, 31, 12, 2, + -8, -4, -18, -7, 3, 1, -1, 11, 12, 18, 17, 9, -2, -12, -13, -11, + -1, 8, 3, 3, 2, 5, -5, -16, -15, -13, -8, -12, -9, -2, -1, 2, + 7, 10, 7, 11, 14, 7, -1, -4, 5, -3, -2, 0, -6, -10, -1, -5, + 3, 9, 0, -8, -9, -6, -6, 0, 6, 3, 6, 7, 10, 0, -8, -3, + -5, -1, -8, -7, -4, -3, -3, 0, -1, -6, 2, 7, 7, 5, 4, 10, + 5, 8, -1, -11, -15, -11, -15, -10, -1, -8, -12, -5, 1, 3, 6, 8, + 11, 18, 22, 26, 10, -10, -1, -15, -3, -21, -16, -14, -12, -7, -8, -18, + -20, -11, 9, 20, 27, 26, 11, 1, 21, 6, 3, -9, -15, -9, -20, 3, + 5, 21, 14, 6, 11, -21, -22, -6, -21, -23, -18, 11, 6, 5, 21, 9, + 23, 16, -3, -30, -7, -27, -4, 5, 18, 22, 16, 2, 7, -1, -2, -10, + -14, -10, -17, -10, -15, -16, 3, 12, 30, 18, -1, -6, -15, -3, 5, 11, + -18, -2, 8, 21, 11, -13, -4, -30, -7, 0, 12, 25, -3, 17, 14, -20, + -6, -27, -41, -11, -12, 23, -8, 13, 24, 18, 27, -11, -8, -12, -2, 17, + 23, 13, -20, -21, -2, -21, -34, -46, -23, 28, 48, 9, -10, 8, 29, 27, + 5, -29, -12, 13, -5, -2, -35, 1, 3, 24, 13, 17, -18, -30, -21, 14, + -1, 6, -8, 48, 45, -7, -34, -49, -32, -6, -26, 20, 29, 76, 30, -21, + -66, -36, -15, 40, -5, 29, 3, 10, -39, -25, -2, 24, 19, 19, -4, -8, + 3, -22, -23, -18, 13, 17, -3, -25, 23, 66, 26, -18, -27, -34, -30, -30, + 36, 25, 28, -22, -17, -7, -22, 21, 18, 42, 8, -25, -28, -31, -10, 15, + 18, 0, -1, -5, 16, -12, 13, 13, 12, -8, -37, -9, 13, -5, 8, -3, + 13, -8, 4, 24, -16, -43, -18, 26, 26, -11, -9, 19, 9, -15, 9, 15, + -12, -31, -27, 8, 29, 5, 7, 17, -33, -14, 14, 23, -1, -18, -18, -4, + -35, -17, 47, 71, -16, -20, -11, -16, -25, 6, 37, 14, -18, 1, -8, -14, + 10, 14, 2, -20, 0, 20, -10, -25, 14, 32, 7, -39, -38, -3, 34, 25, + 13, 3, -24, -34, 5, 38, 18, 7, 29, -30, -74, -41, 36, 40, -12, 26, + 55, -17, -59, -26, 28, -2, -31, 24, 25, -44, -39, 21, 44, -1, 10, 33, + -34, -50, -12, 18, 13, 20, 17, -6, -31, -10, -6, -1, 7, 12, 14, 6, + -16, -24, 6, 9, -16, -16, 6, 2, -10, 13, 12, -10, 0, 11, 11, 10, + -3, -22, -22, -12, -7, 19, 17, -2, -12, 6, 16, 7, -11, -1, -20, -22, + -8, 26, 16, -3, 12, 1, -33, 2, 30, -23, -5, 28, -17, -19, 21, 9, + -28, -14, 25, -1, 4, 24, 0, -26, -9, 7, 2, -2, 20, -10, -11, 5, + -3, -4, 8, -9, 14, 18, 25, -22, -15, -22, -3, -12, 27, 30, 15, -11, + -26, -4, 15, -7, -14, 23, -23, -4, 34, -2, -38, 14, -11, -24, 16, 34, + 11, -13, 3, -3, -19, -34, 0, -3, 24, 43, 1, -12, -38, -25, -11, 23, + 35, 12, -28, -25, -16, 7, 22, 1, -10, 8, 8, -3, 6, -24, -20, -13, + 9, 31, 12, -16, 7, -29, 5, 8, -28, 3, 4, 12, 26, -9, -15, -5, + -20, 9, 21, 0, 1, -9, 0, 8, -3, -7, -9, -3, 22, 8, 3, -11, + -9, -11, 3, 15, 9, -10, 1, -3, -3, -2, -5, 9, 0, 12, 7, -15, + -7, 0, -8, 5, 9, -5, 7, -7, 10, 4, -11, -2, -8, -4, 9, 9, + 0, -2, -11, -3, -4, 3, 4, 3, -2, 3, 3, -8, -9, -2, 0, 3, + 5, -1, -10, -7, 2, 8, 3, 0, -5, -5, 2, 4, -2, -5, -3, 2, + 3, 0, 2, -5, -3, 3, 2, -2, -4, -2, 1, 2, 1, 0, 0, 0, + 0, -1, -7, -9, -5, 0, 2, 2, 5, 6, 0, -11, -13, -5, 3, 1, + 0, 0, 1, -3, -9, -6, -1, 5, 3, -3, -5, -3, -1, -4, -3, -1, + 2, -2, -9, -7, -2, -5, -18, -31, -36, -36, -41, -38, -29, -21, -27, -31, + -26, -4, 37, 65, 67, 44, 22, 10, 2, -4, 8, 32, 44, 38, 24, 17, + 9, 4, 3, 12, 26, 32, 32, 23, 16, 7, 1, -7, -13, -8, 1, -5, + -39, -72, -79, -64, -49, -40, -24, -1, 12, 0, -25, -44, -43, -30, -14, 1, + 13, 13, 4, 4, 16, 34, 46, 55, 65, 73, 67, 53, 54, 58, 62, 60, + 51, 38, 33, 20, -7, -27, -40, -46, -55, -58, -41, -9, 7, 8, 2, -26, + -49, -71, -92, -101, -93, -80, -70, -71, -73, -65, -67, -69, -61, -42, -15, 15, + 18, -5, -33, -54, -54, -40, -18, 2, 21, 21, 3, -28, -52, -33, 9, 35, + 33, 30, 34, 45, 46, 43, 54, 63, 65, 61, 56, 43, 45, 59, 77, 96, + 104, 112, 115, 100, 78, 53, 22, -3, -6, 5, 24, 37, 38, 35, 25, 3, + -19, -38, -51, -46, -33, -34, -42, -47, -48, -38, -27, -30, -40, -48, -45, -30, + -24, -38, -44, -43, -47, -34, -13, 7, 27, 30, 9, -18, -38, -22, 19, 47, + 70, 83, 68, 28, -13, -41, -41, -19, -1, 10, 8, 4, 4, -7, -12, 6, + 32, 42, 31, 0, -39, -71, -99, -115, -111, -85, -56, -46, -61, -74, -66, -45, + -22, 4, 21, 27, 25, 1, -30, -51, -37, 4, 37, 40, 26, 17, 12, 12, + 5, 1, 2, 12, 29, 43, 44, 45, 54, 45, 28, 10, 13, 26, 32, 43, + 59, 67, 62, 60, 66, 72, 61, 34, 11, 0, 1, -6, -18, -12, 19, 47, + 51, 32, 9, -8, -22, -26, -27, -30, -29, -12, 7, 18, 13, -1, -11, -11, + 5, 16, 14, 11, 5, -19, -47, -54, -29, 13, 37, 42, 33, 9, -17, -31, + -21, 14, 61, 81, 68, 39, 4, -26, -46, -38, -17, -1, 1, -4, -14, -25, + -23, -4, 24, 43, 49, 37, 4, -48, -97, -123, -116, -89, -66, -65, -73, -67, + -64, -66, -69, -46, 3, 36, 27, -3, -25, -39, -38, -39, -36, -24, -9, 5, + 13, 13, 4, -1, -13, -15, 0, 22, 47, 65, 76, 67, 35, 3, -4, 6, + 27, 47, 58, 68, 72, 73, 72, 66, 59, 62, 61, 49, 28, -5, -30, -27, + 9, 40, 51, 46, 40, 28, 1, -30, -56, -57, -41, -13, 5, 12, 7, -11, + -38, -54, -40, -16, 12, 23, 13, -16, -49, -62, -55, -29, 4, 38, 45, 28, + -5, -36, -36, -5, 39, 68, 77, 73, 55, 8, -35, -46, -29, -15, -15, -16, + -12, -9, -23, -30, -18, 16, 48, 51, 24, -18, -45, -72, -96, -111, -101, -80, + -67, -71, -79, -77, -70, -46, -22, -7, -4, -5, -4, -2, -15, -37, -43, -42, + -27, -5, 9, 27, 38, 27, 4, -14, -15, 6, 30, 61, 93, 90, 52, 16, + 2, 1, 5, 11, 34, 64, 79, 71, 48, 35, 43, 61, 59, 46, 27, 1, + -22, -33, -25, -9, 15, 37, 56, 54, 28, -10, -44, -58, -49, -27, -8, 20, + 29, 0, -42, -66, -60, -34, -7, 16, 30, 15, -20, -50, -64, -49, -11, 21, + 34, 34, 17, -7, -31, -29, 3, 43, 69, 78, 73, 45, 10, -20, -32, -33, + -26, -12, -6, -18, -41, -44, -27, -6, 10, 17, 19, 18, -4, -49, -87, -108, + -100, -84, -87, -93, -83, -67, -54, -45, -45, -35, -23, -13, 6, 17, 14, 1, + -22, -40, -35, -18, 2, 28, 57, 63, 33, -7, -21, -4, 23, 57, 89, 102, + 94, 68, 37, 8, -4, 4, 37, 71, 88, 79, 54, 46, 55, 62, 55, 53, + 54, 46, 20, -14, -40, -41, -16, 15, 44, 60, 59, 30, -21, -61, -70, -54, + -26, 10, 29, 19, -16, -49, -63, -58, -33, 4, 29, 26, -1, -33, -49, -50, + -34, -9, 16, 34, 34, 9, -20, -25, -9, 13, 29, 54, 87, 91, 56, 11, + -12, -11, -12, -20, -22, -17, -11, -12, -22, -25, -15, 3, 19, 19, 9, -11, + -38, -62, -76, -92, -107, -109, -95, -68, -53, -49, -49, -58, -63, -48, -25, -5, + 12, 12, -7, -36, -56, -56, -32, 8, 50, 64, 36, 6, -10, -15, -11, 9, + 47, 94, 118, 100, 58, 14, -3, 3, 19, 44, 72, 83, 78, 75, 66, 53, + 45, 52, 66, 70, 52, 22, -8, -36, -36, -14, 21, 63, 84, 63, 14, -29, + -55, -54, -42, -12, 28, 40, 14, -24, -52, -58, -42, -22, 6, 19, 16, -5, + -34, -49, -43, -24, -12, 2, 14, 22, 10, -10, -20, -16, 3, 28, 60, 72, + 61, 42, 25, 1, -26, -44, -46, -31, -25, -26, -32, -30, -24, -12, -12, -15, + 0, 6, -3, -23, -47, -79, -112, -128, -115, -84, -61, -45, -42, -51, -64, -68, + -61, -33, 9, 29, 12, -28, -54, -64, -56, -30, 9, 36, 41, 34, 10, -18, + -38, -29, 13, 70, 105, 106, 79, 48, 31, 12, -1, 12, 51, 78, 89, 87, + 75, 66, 49, 44, 56, 73, 79, 66, 23, -23, -42, -39, -9, 31, 65, 75, + 52, 7, -32, -54, -57, -30, 3, 24, 19, 2, -18, -39, -50, -39, -10, 8, + 10, -2, -12, -18, -21, -29, -33, -16, 11, 28, 17, 1, -4, 3, -3, -6, + 13, 42, 64, 67, 56, 29, 2, -21, -36, -42, -40, -25, -15, -10, -7, -10, + -27, -38, -24, 2, 19, 14, -6, -44, -86, -115, -121, -109, -81, -45, -27, -36, + -58, -76, -81, -53, -13, 11, 8, -11, -24, -40, -58, -62, -30, 11, 42, 44, + 17, -15, -36, -38, -22, 15, 53, 84, 88, 73, 52, 19, -6, -9, 13, 44, + 71, 88, 93, 79, 54, 42, 46, 67, 82, 79, 54, 20, -10, -28, -27, 0, + 46, 70, 61, 29, 2, -18, -38, -45, -23, 7, 16, 10, -8, -22, -26, -30, + -32, -23, -13, -2, 6, -6, -15, -16, -18, -20, -9, 0, 2, 11, 19, 17, + -2, -21, -12, 14, 33, 50, 65, 61, 43, 19, -17, -44, -50, -42, -21, 1, + 11, 1, -31, -56, -45, -22, -1, 17, 18, -4, -44, -95, -126, -123, -95, -56, + -36, -41, -51, -59, -68, -60, -38, -15, 5, 14, 7, -17, -47, -61, -37, 1, + 27, 33, 24, 7, -13, -30, -43, -26, 13, 47, 70, 74, 68, 48, 12, -19, + -14, 14, 46, 74, 81, 75, 64, 52, 48, 56, 67, 82, 78, 44, 9, -12, + -20, -8, 18, 41, 57, 46, 23, 0, -23, -33, -21, -10, -10, -2, 3, 5, + -2, -19, -33, -32, -24, -16, -11, -14, -6, 7, -2, -20, -25, -16, -6, 6, + 17, 27, 22, 2, -10, -11, 0, 24, 51, 68, 79, 65, 25, -19, -49, -48, + -30, -9, 8, 10, -12, -40, -57, -57, -34, -1, 25, 24, -7, -56, -95, -111, + -102, -84, -69, -57, -44, -42, -59, -74, -71, -47, -17, 0, 3, -6, -21, -37, + -38, -27, -6, 15, 23, 22, 12, -4, -23, -32, -26, 1, 36, 63, 82, 78, + 46, 12, -1, 2, 20, 41, 64, 81, 79, 66, 59, 61, 67, 75, 76, 66, + 49, 27, 5, -7, 2, 24, 41, 44, 38, 28, 13, -5, -19, -21, -17, -11, + -2, 4, 4, -2, -14, -28, -32, -27, -21, -16, -13, -1, 6, -4, -21, -25, + -17, -7, 6, 0, 0, -4, -4, -5, -8, -4, 3, 8, 6, 1, 1, 2, + 3, 3, -2, -7, -11, -10, -5, -2, 4, 6, 0, -2, -5, -4, -4, -9, + -9, -7, -11, -11, -10, -7, 4, 0, -4, -4, -1, 4, 0, -4, -3, -5, + -6, -5, -4, 4, -1, 2, 11, 5, -13, -20, -30, -49, -50, -34, -22, -33, + -27, -20, -17, 0, 34, 70, 73, 42, 3, -26, -37, -25, -1, 25, 48, 71, + 75, 44, 22, 45, 69, 57, 44, 52, 58, 24, -23, -41, -50, -58, -67, -82, + -66, -29, -29, -41, -34, -19, -4, -4, -1, 20, 50, 56, 35, 12, 4, -8, + -15, 4, 28, 44, 46, 34, 17, 2, 0, 11, 28, 42, 22, -28, -51, -45, + -34, -39, -37, -19, -17, -30, -32, -18, -4, 9, 19, 38, 35, 3, -24, -35, + -40, -23, -11, -25, -47, -52, -51, -58, -61, -52, -47, -37, -17, -5, -5, -16, + -31, -24, -11, -1, -3, -23, -40, -48, -40, -12, 15, 25, 17, -5, -2, 14, + 21, 15, -12, -26, -18, -2, 28, 48, 55, 52, 42, 35, 35, 42, 38, 36, + 40, 53, 55, 52, 44, 36, 49, 57, 56, 57, 55, 50, 39, 27, 31, 30, + 15, 11, 12, 6, 4, 14, 28, 23, 1, -6, -17, -35, -44, -41, -33, -22, + -9, -6, -12, -15, -13, -27, -29, -7, 14, -5, -55, -71, -49, -33, -37, -46, + -33, -18, -43, -89, -96, -65, -23, 2, 8, 20, 24, -11, -50, -51, -12, 15, + 4, 1, 20, 47, 53, 43, 52, 77, 98, 114, 110, 100, 88, 53, 10, -29, + -55, -71, -83, -77, -58, -55, -57, -52, -48, -47, -46, -12, 34, 59, 52, 25, + -10, -33, -21, 18, 49, 54, 46, 18, 13, 30, 41, 48, 54, 53, 44, 24, + 1, -13, -25, -43, -38, -28, -35, -55, -71, -64, -40, -13, 10, 24, 38, 41, + 21, -1, -11, 1, 15, 7, -6, -13, -39, -57, -64, -51, -20, -12, -24, -37, + -30, -4, 17, 21, 12, -7, -16, -15, -7, 6, 1, -20, -34, -30, -1, 32, + 44, 36, 22, 25, 21, 6, 1, -2, -13, -5, 19, 28, 24, 12, 11, 16, + 19, 38, 54, 49, 38, 28, 28, 39, 52, 49, 32, 25, 33, 45, 49, 39, + 40, 46, 20, -9, -6, 6, 1, -22, -29, 10, 48, 33, -17, -51, -55, -44, + -49, -50, -36, -33, -57, -84, -71, -21, 11, 13, 4, -1, -8, -32, -45, -32, + -10, 2, -13, -37, -39, -42, -57, -65, -63, -36, -11, 10, 33, 22, -12, -34, + -28, -12, 2, 8, 6, -2, -4, 0, 10, 22, 36, 57, 82, 104, 122, 127, + 109, 70, 17, -28, -45, -36, -20, -33, -68, -102, -114, -103, -76, -45, -20, -7, + -11, -10, -2, 6, 0, -14, -5, 30, 48, 29, 3, -8, 10, 39, 67, 86, + 83, 59, 32, 17, 32, 46, 40, 11, -29, -48, -57, -68, -69, -57, -43, -26, + -13, -2, 1, 1, 3, 4, 8, 21, 20, 11, 3, -2, -6, -26, -39, -33, + -34, -36, -28, -23, -27, -28, -17, -1, 0, -6, -10, -9, -7, -12, -26, -44, + -54, -38, -16, 0, 18, 27, 17, -3, -18, -3, 19, 11, -9, -7, 10, 14, + 5, 5, 18, 29, 29, 12, 16, 38, 43, 14, 2, 24, 55, 59, 33, 17, + 24, 44, 65, 75, 77, 55, 15, -16, -20, 6, 31, 27, 17, 18, 19, 17, + 7, 0, -5, -20, -22, -25, -49, -69, -73, -58, -45, -29, -4, 9, -1, -23, + -51, -52, -24, -2, 11, 12, -16, -51, -75, -77, -67, -59, -59, -54, -35, -15, + -9, -9, -9, -7, -8, -12, -1, 15, 22, 10, -14, -34, -28, -14, 11, 64, + 113, 127, 117, 97, 87, 84, 68, 50, 37, 36, 24, -15, -58, -78, -84, -71, + -40, -14, -12, -34, -48, -41, -14, 20, 37, 35, 16, -6, 1, 14, 15, 20, + 23, 24, 38, 58, 69, 57, 40, 54, 73, 75, 65, 40, -3, -49, -68, -56, + -42, -42, -53, -59, -44, -23, -9, -3, -11, -18, -13, -11, -5, 3, 13, 4, + -25, -39, -22, -14, -16, -27, -38, -37, -42, -55, -51, -21, 8, 10, -8, -12, + -4, -10, -39, -55, -38, -13, -4, -11, -15, -3, 15, 12, 2, 11, 28, 34, + 15, -5, 3, 11, 6, 12, 25, 25, 13, 10, 15, 27, 48, 55, 38, 23, + 17, 23, 32, 23, 32, 57, 75, 75, 52, 22, 10, 5, 12, 28, 33, 23, + 2, -14, -4, 19, 30, 25, 15, 1, -27, -64, -78, -67, -49, -45, -48, -42, + -31, -25, -40, -50, -39, -18, -4, 13, 19, 12, -10, -43, -59, -53, -47, -54, + -61, -51, -20, -2, -12, -23, -25, -18, 5, 33, 51, 45, 16, -16, -46, -53, + -38, -6, 33, 57, 74, 81, 75, 77, 89, 105, 114, 110, 83, 39, -6, -25, + -28, -39, -48, -52, -55, -59, -67, -67, -57, -42, -23, -3, 10, 3, -19, -33, + -30, -8, 20, 23, 2, -18, -17, 12, 40, 58, 65, 65, 66, 71, 64, 54, + 38, 1, -41, -62, -47, -26, -31, -49, -55, -42, -21, -17, -19, -10, -2, -3, + -10, -13, 2, 13, -10, -38, -27, 3, 8, -18, -46, -61, -65, -53, -36, -18, + -5, -6, -14, -22, -18, -12, -19, -29, -28, -21, -10, -15, -24, -18, -4, 16, + 23, 17, 14, 10, 9, 13, 15, 28, 35, 19, 4, 2, -2, 9, 34, 62, + 66, 43, 13, -2, 15, 42, 50, 48, 51, 56, 56, 45, 44, 45, 48, 40, + 33, 31, 27, 10, -10, -4, 16, 41, 52, 48, 31, -1, -36, -56, -50, -27, + -14, -25, -43, -60, -67, -47, -31, -38, -47, -40, -17, 13, 32, 28, -10, -50, + -68, -62, -40, -21, -20, -33, -58, -72, -63, -45, -28, -11, 18, 48, 42, 15, + -14, -43, -54, -40, -15, 4, 2, -5, 0, 20, 55, 91, 113, 120, 109, 89, + 77, 63, 43, 26, 20, 12, -13, -47, -69, -68, -53, -49, -49, -36, -28, -27, + -27, -28, -12, 5, 1, -9, -2, 14, 10, -25, -39, -6, 21, 35, 41, 53, + 73, 82, 74, 64, 54, 39, 9, -23, -37, -30, -22, -30, -52, -62, -54, -32, + -9, 2, 5, -3, -17, -25, -17, -1, 13, 8, -7, -12, -7, -7, -21, -40, + -51, -51, -38, -21, -16, -22, -29, -33, -23, -10, -2, -9, -24, -33, -33, -29, + -21, -8, 3, 2, -10, -18, -11, 8, 26, 32, 27, 21, 14, 7, 1, 3, + 12, 22, 35, 45, 43, 29, 13, 10, 20, 37, 54, 59, 45, 28, 28, 37, + 48, 55, 60, 60, 43, 17, 0, -3, 9, 24, 31, 31, 28, 28, 26, 14, + -5, -22, -31, -30, -21, -7, -8, -34, -63, -82, -80, -63, -45, -28, -14, -5, + 3, 2, -11, -27, -39, -33, -11, 2, -8, -39, -73, -95, -91, -54, -8, 19, + 16, 4, 5, 14, 14, 2, -8, -14, -19, -33, -45, -38, -19, 2, 21, 54, + 93, 106, 90, 74, 80, 97, 98, 76, 52, 34, 10, -18, -37, -36, -27, -35, + -52, -62, -56, -44, -39, -37, -29, -17, -8, -2, 3, 4, -4, -16, -27, -32, + -19, 1, 19, 41, 60, 70, 71, 67, 64, 61, 53, 38, 14, -8, -21, -29, + -34, -38, -39, -29, -15, 0, 5, -5, -19, -25, -16, 5, 19, 17, 6, -3, + -7, 0, -1, 1, -2, -5, 0, 0, 2, 0, -3, -2, 0, 1, 0, -2, + -2, -2, 0, 3, 3, -2, -5, -1, -1, -1, -4, 3, 9, 1, -1, -2, + -11, -7, 1, 9, 11, 8, -4, -11, -12, -9, -4, 18, 15, 14, 1, -22, + -29, -14, 3, 30, 29, 14, -2, -35, -43, -11, 13, 36, 42, 15, -16, -49, + -44, -10, 28, 47, 38, 11, -25, -66, -39, 4, 36, 58, 33, -3, -44, -65, + -29, 19, 52, 54, 23, -13, -59, -65, -15, 32, 69, 49, 8, -30, -74, -51, + 3, 43, 71, 40, -5, -48, -77, -31, 16, 57, 67, 24, -15, -67, -72, -12, + 36, 66, 59, 5, -31, -80, -51, 3, 49, 75, 37, -2, -59, -81, -28, 20, + 67, 66, 22, -23, -76, -65, -10, 41, 78, 48, 4, -36, -85, -47, 6, 59, + 80, 31, -8, -69, -82, -22, 29, 73, 63, 17, -31, -81, -63, -1, 47, 79, + 47, 3, -56, -90, -40, 19, 75, 73, 28, -25, -86, -74, -10, 48, 85, 56, + 6, -51, -93, -48, 11, 67, 86, 33, -11, -78, -87, -29, 36, 89, 66, 13, + -38, -91, -60, 2, 50, 83, 48, 0, -56, -90, -41, 16, 71, 78, 30, -17, + -80, -75, -20, 31, 82, 62, 15, -32, -85, -66, -7, 48, 84, 50, 4, -53, + -87, -44, 8, 62, 78, 35, -8, -65, -83, -30, 23, 70, 71, 24, -20, -76, + -75, -12, 32, 73, 62, 15, -30, -85, -62, -2, 41, 76, 51, 9, -39, -86, + -52, 1, 45, 79, 46, 8, -49, -89, -46, 3, 54, 80, 43, 7, -55, -83, + -50, 0, 53, 76, 54, 11, -52, -83, -55, 0, 40, 67, 58, 22, -32, -79, + -67, -11, 28, 63, 52, 37, -9, -70, -63, -28, 10, 42, 49, 53, 8, -46, + -64, -41, 1, 22, 38, 51, 39, -16, -63, -46, -23, 5, 33, 38, 48, 14, + -42, -57, -29, -5, 22, 37, 40, 28, -23, -53, -39, -10, 14, 30, 40, 31, + -1, -48, -40, -18, 11, 19, 31, 26, 14, -20, -50, -25, -5, 11, 31, 30, + 14, 0, -35, -39, -4, -1, 19, 27, 17, 9, -10, -39, -21, -8, 9, 24, + 26, 13, -5, -19, -30, -12, -1, 17, 25, 16, 3, -19, -26, -13, -6, 17, + 22, 20, 5, -16, -32, -19, -1, 23, 27, 23, 4, -30, -33, -23, -1, 35, + 35, 24, -2, -41, -45, -21, 9, 45, 41, 22, -12, -50, -46, -18, 28, 55, + 45, 10, -27, -78, -42, 0, 53, 66, 32, -1, -61, -74, -28, 27, 64, 64, + 24, -28, -80, -66, -15, 53, 84, 48, 5, -59, -94, -41, 17, 75, 80, 26, + -21, -91, -79, -12, 48, 87, 55, 10, -58, -96, -46, 9, 80, 81, 30, -23, + -84, -80, -15, 49, 90, 49, 9, -57, -95, -45, 17, 76, 79, 26, -20, -91, + -75, -18, 52, 90, 52, 6, -59, -92, -41, 15, 68, 80, 31, -21, -87, -76, + -13, 45, 87, 49, 11, -60, -94, -35, 14, 80, 68, 22, -23, -89, -66, -7, + 47, 93, 44, -8, -61, -95, -31, 24, 86, 75, 10, -35, -96, -66, -1, 61, + 100, 44, -12, -77, -105, -33, 32, 97, 92, 16, -44, -111, -90, -5, 65, 121, + 65, -3, -80, -123, -59, 17, 98, 111, 46, -25, -112, -109, -33, 42, 112, 90, + 30, -55, -115, -84, -17, 66, 105, 71, 13, -73, -113, -61, 0, 77, 96, 56, + 4, -80, -108, -50, 8, 78, 93, 47, 3, -88, -98, -40, 7, 65, 76, 53, + 18, -71, -90, -44, 0, 39, 57, 43, 34, -19, -69, -54, -19, 18, 32, 31, + 34, 7, -40, -36, -21, -1, 12, 12, 25, 27, -9, -32, -14, -14, 2, 0, + 1, 20, 19, -2, -13, -11, -18, -12, -2, 18, 24, 12, -2, -14, -19, -19, + -12, 18, 24, 22, -2, -15, -32, -20, 3, 22, 26, 17, -13, -31, -27, -13, + 17, 33, 32, 5, -29, -47, -29, 2, 33, 42, 32, -6, -53, -52, -24, 22, + 51, 41, 27, -32, -74, -45, 0, 45, 59, 33, -1, -62, -66, -31, 26, 73, + 49, 17, -42, -80, -42, -8, 63, 72, 28, -10, -75, -72, -23, 32, 88, 47, + 13, -56, -93, -38, 10, 76, 69, 26, -20, -96, -66, -10, 48, 90, 47, 0, + -69, -103, -29, 25, 87, 73, 18, -35, -104, -68, -2, 61, 93, 47, -5, -83, + -98, -31, 30, 92, 68, 17, -39, -97, -63, -5, 64, 88, 35, -9, -74, -86, + -22, 31, 85, 54, 13, -44, -93, -46, 9, 65, 75, 23, -17, -75, -78, -15, + 39, 84, 54, 3, -52, -96, -46, 12, 71, 90, 29, -18, -89, -87, -26, 36, + 86, 72, 26, -37, -106, -77, -12, 45, 99, 68, 22, -46, -108, -73, -10, 43, + 87, 69, 19, -27, -92, -79, -12, 27, 63, 57, 26, 4, -53, -75, -35, 12, + 33, 37, 31, 26, -9, -53, -39, -16, 6, 20, 23, 22, 13, -8, -22, -23, + -18, -3, 9, 25, 19, 4, -8, -20, -17, -10, 6, 16, 17, 13, -8, -34, + -21, -6, 17, 33, 23, 6, -32, -51, -23, 11, 36, 46, 31, -11, -46, -65, + -31, 15, 59, 55, 28, -20, -73, -64, -26, 42, 78, 51, 14, -53, -85, -48, + -4, 70, 80, 38, -16, -80, -76, -32, 39, 90, 58, 19, -59, -99, -50, 14, + 71, 75, 36, -21, -94, -70, -23, 51, 88, 53, 9, -68, -97, -40, 16, 83, + 73, 29, -33, -100, -61, -13, 58, 87, 41, 0, -74, -81, -35, 24, 87, 55, + 20, -41, -88, -58, 0, 69, 73, 34, -5, -86, -75, -20, 38, 79, 49, 13, + -48, -90, -39, 2, 71, 68, 31, -16, -84, -67, -15, 38, 79, 42, 12, -50, + -85, -37, 2, 62, 71, 34, -5, -83, -75, -24, 27, 82, 51, 27, -30, -88, + -54, -15, 44, 73, 50, 16, -49, -81, -47, -6, 38, 58, 50, 27, -31, -69, + -52, -13, 15, 36, 45, 33, -5, -41, -44, -23, 2, 14, 27, 33, 10, -25, + -20, -18, -6, 1, -1, 17, 22, 3, -13, -10, -17, -13, -6, 13, 24, 15, + 1, -11, -19, -19, -16, 12, 24, 24, 3, -12, -29, -26, -1, 18, 27, 19, + -4, -31, -28, -19, 11, 30, 35, 12, -21, -46, -35, -6, 28, 42, 36, 5, + -46, -57, -31, 10, 50, 43, 33, -16, -71, -55, -9, 35, 62, 38, 10, -51, + -71, -40, 11, 69, 58, 24, -26, -81, -50, -18, 48, 79, 37, 1, -62, -81, + -32, 16, 84, 59, 20, -37, -96, -50, -2, 63, 78, 33, -4, -85, -80, -20, + 33, 88, 59, 10, -50, -107, -47, 14, 75, 85, 27, -19, -95, -83, -15, 47, + 94, 60, 8, -66, -105, -46, 15, 83, 81, 26, -23, -91, -76, -18, 48, 92, + 47, 1, -59, -94, -36, 18, 78, 66, 19, -27, -91, -60, -3, 53, 80, 35, + -8, -62, -86, -28, 27, 79, 66, 13, -38, -94, -62, 1, 56, 95, 42, -6, + -75, -96, -39, 22, 80, 80, 36, -20, -97, -92, -24, 30, 93, 79, 32, -27, + -102, -87, -22, 31, 81, 79, 29, -14, -81, -91, -25, 19, 56, 63, 31, 11, + -39, -77, -47, 3, 31, 37, 33, 27, 3, -48, -46, -20, 0, 18, 22, 23, + 16, -3, -20, -19, -15, -4, 2, 8, 5, 0, 0, 0, 0, 2, 2, 5, + 9, 12, 14, 12, 7, 6, 4, 0, -1, -1, 1, -2, -2, -11, -17, -32, + -41, -49, -55, -58, -61, -61, -65, -61, -57, -47, -37, -27, -22, -15, -5, 6, + 12, 16, 21, 27, 28, 32, 33, 35, 41, 44, 45, 47, 50, 54, 57, 56, + 53, 53, 54, 50, 50, 52, 54, 56, 52, 53, 54, 50, 49, 46, 43, 38, + 33, 27, 19, 8, 2, -11, -20, -27, -29, -30, -32, -35, -42, -52, -57, -57, + -59, -48, -40, -27, -13, 4, 13, 20, 18, 14, 11, 7, 3, -1, -3, -10, + -11, -20, -28, -46, -60, -72, -82, -92, -97, -97, -97, -94, -90, -81, -71, -61, + -55, -55, -53, -47, -38, -29, -23, -11, -6, -3, 1, 2, 5, 6, 3, 3, + 5, 15, 24, 28, 30, 30, 35, 37, 36, 39, 39, 44, 47, 48, 56, 62, + 73, 84, 91, 96, 95, 91, 85, 76, 72, 63, 55, 47, 44, 43, 41, 38, + 31, 19, 7, 0, -9, -7, -4, 8, 22, 40, 54, 67, 71, 70, 64, 56, + 45, 32, 24, 15, 12, 3, -3, -21, -42, -66, -84, -102, -117, -124, -128, -127, + -124, -118, -107, -96, -86, -86, -88, -86, -80, -70, -63, -50, -40, -33, -25, -23, + -20, -18, -18, -21, -25, -22, -14, -8, -3, -3, -1, 1, 0, 1, -3, -1, + 2, 4, 13, 24, 35, 49, 59, 67, 70, 69, 68, 59, 54, 46, 40, 31, + 29, 27, 25, 23, 20, 12, -1, -9, -19, -22, -21, -11, 3, 23, 41, 60, + 71, 76, 73, 71, 65, 56, 50, 44, 42, 35, 33, 24, 9, -13, -31, -48, + -65, -76, -83, -83, -82, -77, -69, -59, -46, -40, -40, -41, -38, -30, -24, -13, + -2, 8, 17, 22, 24, 25, 23, 20, 13, 9, 11, 15, 19, 16, 12, 9, + 4, 1, -6, -10, -11, -14, -12, -5, 3, 15, 26, 35, 40, 41, 41, 35, + 28, 19, 12, 3, -2, -6, -7, -10, -13, -19, -31, -39, -50, -56, -58, -52, + -41, -22, -3, 18, 34, 46, 48, 47, 45, 38, 32, 26, 24, 20, 19, 15, + 5, -14, -32, -49, -65, -79, -88, -91, -91, -88, -82, -75, -63, -52, -47, -46, + -46, -38, -31, -21, -8, 4, 17, 26, 31, 36, 39, 42, 40, 35, 36, 39, + 47, 48, 45, 43, 38, 36, 30, 24, 22, 19, 18, 23, 29, 40, 50, 61, + 68, 72, 74, 71, 66, 57, 50, 40, 32, 24, 21, 16, 12, 7, -3, -14, + -26, -38, -45, -46, -43, -31, -16, 3, 18, 33, 39, 39, 36, 31, 22, 13, + 8, 3, -1, -4, -9, -24, -42, -60, -77, -94, -107, -115, -119, -120, -116, -112, + -103, -91, -81, -78, -80, -75, -69, -61, -51, -39, -25, -13, -5, 2, 8, 14, + 17, 16, 15, 16, 24, 31, 32, 32, 29, 29, 27, 22, 21, 20, 19, 22, + 26, 35, 46, 59, 70, 77, 83, 85, 84, 79, 74, 66, 59, 50, 46, 41, + 38, 35, 29, 21, 11, 0, -9, -14, -16, -11, 0, 16, 30, 48, 58, 62, + 61, 58, 51, 40, 31, 25, 19, 15, 13, 4, -11, -28, -44, -61, -76, -87, + -95, -100, -100, -99, -95, -86, -75, -68, -69, -68, -67, -62, -56, -49, -38, -27, + -19, -13, -9, -3, 2, 1, -1, -3, 0, 7, 10, 10, 6, 5, 4, 0, + -4, -5, -7, -7, -7, -2, 5, 16, 27, 36, 44, 49, 52, 50, 46, 40, + 35, 26, 22, 18, 15, 15, 13, 9, 4, -5, -14, -19, -23, -21, -14, 0, + 15, 33, 49, 60, 63, 63, 61, 53, 44, 38, 32, 27, 27, 23, 14, 0, + -14, -29, -44, -58, -67, -74, -76, -76, -73, -67, -55, -45, -41, -41, -41, -39, + -35, -30, -23, -12, -3, 4, 9, 14, 20, 21, 20, 17, 15, 19, 24, 26, + 24, 21, 20, 18, 12, 9, 6, 3, 0, 1, 4, 11, 21, 30, 38, 43, + 47, 48, 45, 38, 32, 23, 15, 9, 5, 3, 1, -2, -5, -13, -22, -30, + -37, -41, -40, -30, -18, -3, 15, 30, 38, 41, 41, 37, 27, 19, 12, 6, + 3, 2, -2, -13, -25, -39, -53, -67, -78, -88, -92, -92, -91, -86, -77, -63, + -54, -50, -48, -47, -43, -38, -32, -23, -11, -1, 6, 11, 19, 25, 27, 26, + 24, 26, 31, 36, 38, 36, 37, 37, 34, 32, 29, 27, 24, 22, 23, 27, + 35, 45, 53, 61, 67, 70, 71, 66, 60, 51, 42, 34, 28, 24, 21, 18, + 16, 11, 2, -8, -16, -24, -28, -25, -17, -5, 10, 26, 39, 45, 47, 45, + 37, 27, 18, 9, 3, 0, -2, -10, -22, -36, -51, -67, -81, -93, -102, -107, + -108, -107, -102, -90, -78, -71, -67, -66, -63, -59, -56, -49, -39, -28, -19, -13, + -6, 1, 7, 8, 6, 5, 8, 14, 19, 19, 19, 20, 20, 19, 16, 15, + 13, 12, 11, 13, 20, 30, 39, 49, 57, 63, 68, 68, 65, 58, 51, 43, + 37, 32, 29, 27, 26, 24, 19, 11, 2, -5, -12, -14, -9, 0, 13, 30, + 46, 56, 62, 65, 61, 53, 44, 35, 26, 22, 20, 15, 6, -6, -20, -36, + -51, -66, -78, -87, -91, -92, -92, -85, -74, -65, -58, -56, -55, -52, -50, -46, + -40, -30, -20, -14, -8, -2, 5, 7, 6, 3, 2, 5, 10, 11, 10, 9, + 9, 8, 5, 2, 0, -2, -5, -5, -3, 5, 14, 23, 32, 39, 46, 50, + 49, 45, 38, 31, 24, 17, 14, 11, 10, 9, 7, 2, -5, -12, -20, -25, + -25, -19, -8, 7, 24, 40, 50, 58, 60, 56, 49, 41, 31, 24, 22, 20, + 15, 6, -5, -19, -34, -48, -61, -72, -79, -83, -85, -81, -72, -62, -52, -47, + -44, -41, -39, -35, -31, -24, -13, -5, 1, 7, 14, 20, 22, 21, 19, 18, + 22, 25, 25, 24, 23, 23, 20, 17, 15, 12, 10, 7, 5, 9, 16, 24, + 33, 40, 47, 53, 56, 54, 48, 41, 33, 25, 20, 15, 11, 9, 8, 5, + -2, -10, -19, -27, -32, -31, -25, -15, 0, 17, 30, 40, 46, 46, 42, 35, + 25, 15, 10, 9, 5, -2, -11, -23, -37, -52, -65, -79, -89, -95, -99, -100, + -95, -85, -74, -65, -60, -55, -52, -48, -44, -40, -29, -18, -10, -4, 4, 12, + 18, 20, 19, 17, 20, 24, 27, 27, 26, 26, 25, 23, 21, 19, 17, 15, + 12, 13, 17, 25, 34, 41, 49, 57, 62, 65, 63, 57, 51, 42, 35, 30, + 25, 22, 21, 19, 15, 8, 0, -9, -17, -21, -20, -14, -3, 13, 26, 38, + 48, 53, 52, 47, 39, 28, 19, 15, 13, 8, 0, -10, -22, -37, -51, -65, + -79, -88, -95, -100, -99, -94, -84, -74, -67, -61, -58, -55, -51, -49, -43, -33, + -23, -17, -10, -2, 6, 10, 11, 9, 9, 12, 15, 17, 16, 16, 16, 14, + 12, 11, 9, 8, 5, 3, 4, 10, 18, 26, 34, 42, 50, 57, 59, 57, + 52, 45, 38, 32, 27, 23, 21, 20, 19, 14, 8, 1, -9, 2, 5, 7, + 8, -1, 6, 15, 1, 20, 28, 1, 37, 41, 31, 29, 27, 61, 40, -12, + 38, 52, -16, -20, -1, -23, -48, -56, -63, -61, -77, -100, -88, -76, -103, -113, + -98, -103, -118, -120, -108, -107, -104, -110, -118, -104, -109, -128, -107, -83, -106, -86, + -94, -100, -77, -113, -88, -43, -77, -46, -44, -69, -34, -54, -39, 4, -30, 11, + 18, -25, 20, 16, 10, 52, 35, 52, 74, 33, 55, 74, 59, 70, 81, 85, + 91, 81, 72, 89, 94, 82, 80, 99, 100, 85, 86, 91, 100, 91, 81, 91, + 102, 83, 74, 92, 95, 63, 62, 75, 71, 63, 39, 54, 74, 15, 1, 31, + 6, -5, -13, -20, -8, -44, -59, -38, -69, -73, -67, -86, -90, -68, -73, -77, + -49, -82, -70, -43, -76, -27, 0, -29, 22, 25, -5, 44, 45, 29, 66, 71, + 49, 84, 92, 73, 92, 74, 72, 91, 37, 48, 99, 47, 31, 44, 36, 33, + -5, -11, 26, 6, -33, -22, -6, -32, -55, -44, -45, -52, -63, -73, -55, -51, + -77, -79, -61, -73, -91, -83, -70, -77, -74, -82, -85, -68, -88, -98, -57, -67, + -77, -58, -75, -66, -64, -78, -33, -37, -50, -19, -47, -38, -23, -41, 3, 6, + -7, 30, 0, -4, 24, 15, 31, 45, 44, 66, 44, 34, 58, 54, 59, 67, + 71, 87, 78, 60, 73, 84, 78, 76, 86, 95, 89, 76, 85, 94, 89, 73, + 82, 99, 85, 66, 75, 93, 75, 50, 56, 69, 59, 31, 31, 61, 29, -15, + 15, 5, -15, -14, -36, -25, -29, -69, -55, -53, -82, -78, -76, -95, -88, -69, + -80, -65, -63, -86, -58, -67, -59, -12, -28, -9, 29, -8, 13, 44, 22, 44, + 68, 53, 62, 91, 74, 81, 89, 64, 84, 78, 35, 78, 86, 44, 43, 47, + 45, 22, -5, 17, 21, -16, -24, -14, -14, -34, -50, -40, -36, -63, -71, -58, + -60, -69, -78, -78, -67, -81, -98, -78, -71, -89, -85, -84, -86, -82, -99, -82, + -60, -76, -75, -74, -76, -71, -86, -68, -37, -51, -34, -41, -57, -37, -51, -31, + -7, -17, -3, 1, 7, 22, 31, 46, 57, 41, 43, 56, 63, 62, 68, 85, + 86, 80, 84, 92, 96, 93, 93, 104, 105, 96, 99, 108, 106, 102, 98, 102, + 111, 99, 87, 106, 110, 85, 80, 88, 89, 79, 68, 70, 81, 48, 25, 39, + 32, 18, 9, 12, 0, -29, -31, -38, -60, -52, -63, -79, -71, -66, -62, -59, + -62, -74, -72, -73, -81, -43, -21, -28, 8, 10, -10, 16, 28, 27, 42, 50, + 47, 66, 76, 68, 81, 73, 67, 72, 39, 40, 67, 41, 23, 25, 22, 12, + -16, -22, -5, -27, -51, -44, -45, -57, -68, -73, -71, -74, -91, -89, -84, -90, + -97, -98, -98, -102, -105, -108, -103, -97, -105, -109, -101, -107, -113, -106, -92, -87, + -90, -92, -92, -92, -100, -92, -57, -56, -54, -40, -59, -58, -54, -61, -23, -9, + -12, 16, 0, -14, 4, 5, 17, 32, 41, 57, 55, 43, 54, 66, 67, 68, + 84, 89, 87, 87, 91, 98, 100, 96, 104, 109, 105, 103, 108, 111, 109, 105, + 105, 113, 111, 99, 102, 115, 104, 88, 90, 97, 93, 80, 75, 86, 75, 37, + 40, 43, 33, 20, 20, -14, -26, -36, -53, -52, -65, -75, -75, -69, -69, -69, + -74, -77, -76, -74, -59, -34, -26, -9, 9, 5, 13, 32, 39, 42, 53, 58, + 61, 73, 77, 77, 73, 61, 57, 46, 29, 37, 37, 17, 6, 2, -10, -27, + -38, -41, -46, -58, -68, -69, -75, -85, -89, -92, -97, -101, -103, -106, -107, -108, + -112, -111, -112, -115, -115, -115, -113, -111, -116, -115, -112, -116, -117, -110, -101, -98, + -101, -101, -98, -101, -101, -86, -69, -65, -59, -57, -62, -58, -54, -39, -19, -12, + 1, 7, -1, 5, 16, 24, 36, 46, 58, 64, 61, 64, 74, 79, 81, 90, + 96, 97, 100, 100, 104, 108, 107, 111, 114, 113, 115, 115, 115, 118, 117, 116, + 118, 119, 116, 115, 116, 117, 111, 104, 105, 107, 99, 93, 95, 91, 71, 57, + 53, 47, 38, 29, 23, 14, -11, -28, -38, -49, -58, -67, -73, -80, -84, -84, + -83, -82, -80, -78, -74, -67, -56, -42, -29, -16, -4, 7, 18, 29, 40, 49, + 57, 64, 70, 74, 78, 79, 77, 72, 67, 60, 53, 48, 42, 33, 23, 14, + 4, -6, -16, -24, -32, -40, -48, -55, -61, -68, -74, -78, -83, -87, -91, -94, + -96, -99, -101, -103, -104, -106, -107, -107, -107, -107, -107, -108, -107, -107, -107, -105, + -101, -98, -96, -94, -93, -91, -87, -82, -74, -67, -62, -57, -54, -49, -43, -35, + -25, -16, -7, -1, 4, 10, 17, 25, 33, 41, 49, 55, 59, 63, 69, 74, + 78, 83, 88, 91, 93, 96, 98, 100, 102, 104, 106, 107, 107, 108, 108, 109, + 109, 108, 108, 108, 107, 105, 104, 102, 99, 94, 91, 87, 83, 78, 73, 66, + 56, 46, 37, 28, 19, 9, 0, -11, -23, -35, -45, -55, -64, -71, -78, -83, + -85, -84, -83, -81, -79, -75, -70, -61, -49, -36, -23, -10, 2, 12, 24, 35, + 45, 53, 61, 67, 72, 76, 79, 78, 75, 70, 65, 58, 52, 46, 39, 29, + 20, 11, 1, -9, -18, -26, -34, -42, -50, -56, -63, -69, -74, -79, -83, -88, + -91, -94, -96, -98, -101, -102, -104, -105, -106, -106, -106, -106, -106, -106, -106, -106, + -105, -102, -98, -96, -94, -92, -90, -88, -84, -77, -70, -64, -59, -55, -51, -45, + -38, -29, -20, -11, -4, 2, 7, 13, 21, 29, 37, 44, 51, 56, 60, 65, + 70, 75, 80, 84, 88, 91, 93, 96, 98, 100, 102, 104, 105, 106, 107, 107, + 108, 108, 107, 107, 107, 106, 104, 103, 101, 99, 95, 91, 87, 83, 78, 73, + 67, 59, 49, 39, 30, 21, 12, 3, -8, -19, -31, -41, -51, -60, -68, -75, + -81, -84, -85, -84, -82, -80, -77, -73, -65, -55, -42, -29, -16, -4, 7, 18, + 29, 40, 49, 57, 64, 70, 74, 78, 79, 77, 73, 68, 62, 56, 50, 44, + 36, 26, 17, 7, -3, -12, -20, -28, -36, -44, -51, -58, -64, -70, -75, -79, + -84, -88, -91, -93, -96, -98, -100, -102, -103, -105, -105, -105, -105, -105, -105, -105, + -105, -104, -102, -99, -96, -94, -92, -90, -88, -85, -79, -72, -66, -61, -56, -52, + -47, -41, -33, -24, -15, -8, -1, 4, 10, 17, 24, 32, 40, 47, 53, 57, + 62, 67, 72, 77, 81, 85, 89, 91, 94, 96, 98, 100, 102, 104, 105, 105, + 106, 106, 107, 106, 106, 106, 105, 104, 102, 101, 99, 95, 91, 87, 83, 79, + 74, 68, 61, 52, 42, 33, 24, 15, 5, -5, -15, -27, -38, -48, -57, -66, + -72, -79, -83, -85, -85, -83, -81, -79, -75, -69, -60, -48, -35, -23, -10, 2, + 13, 24, 35, 45, 54, 61, 67, 72, 77, 78, 79, 76, 72, 66, 60, 54, + 49, 41, 32, 23, 12, 3, -4, -17, -15, 1, -1, 0, 0, 1, 3, 5, + 9, 13, 18, 24, 32, 38, 32, 18, -9, -48, -73, -41, 2, -3, -24, -34, + -44, -72, -111, -124, -62, 40, 40, -51, -35, 45, 46, -22, -79, 35, 78, -47, + -98, -88, -69, -57, -44, -31, -17, -9, -3, 6, 41, 85, 43, -91, -128, -65, + -25, -21, -19, -12, 2, 16, 29, 39, 49, 48, 10, -69, -47, 50, 8, -52, + -44, 5, 21, -40, -42, 33, 79, 66, 38, 24, 25, 26, 18, 21, 70, 117, + 98, 28, -1, 20, 22, 0, 1, 9, -10, -49, -33, 39, 68, 39, -5, -17, + -58, -76, 78, 104, 17, 6, -23, -43, -13, 58, 85, 43, 21, 35, 46, 31, + 22, 35, 14, -48, -74, -38, 6, 10, -8, -17, -24, -37, -60, -69, -41, 15, + 27, -21, -26, 18, 28, -1, -41, 5, 51, -9, -51, -48, -38, -31, -24, -16, + -8, -2, 1, 6, 23, 52, 41, -39, -83, -50, -19, -13, -12, -8, 1, 10, + 20, 27, 34, 35, 15, -40, -46, 27, 16, -35, -38, -6, 19, -18, -35, 17, + 61, 55, 33, 21, 22, 25, 21, 18, 52, 98, 92, 31, -5, 9, 17, -1, + -2, 7, -7, -47, -43, 24, 62, 39, -3, -20, -48, -88, 46, 113, 25, 4, + -20, -45, -25, 42, 82, 47, 19, 28, 42, 32, 18, 30, 19, -39, -77, -51, + -4, 10, -6, -18, -25, -37, -57, -70, -50, 4, 26, -15, -33, 9, 27, 6, + -38, -12, 50, 6, -47, -50, -40, -32, -25, -17, -10, -3, 0, 4, 17, 45, + 47, -23, -82, -60, -24, -14, -13, -10, -2, 7, 16, 24, 30, 33, 18, -32, + -56, 13, 23, -31, -41, -15, 19, -6, -35, 4, 52, 55, 35, 21, 22, 25, + 22, 15, 41, 89, 94, 38, -5, 4, 16, 2, -2, 7, -4, -41, -48, 12, + 58, 43, 2, -20, -38, -89, 14, 118, 38, 3, -15, -43, -32, 28, 78, 53, + 19, 24, 40, 34, 18, 26, 23, -28, -75, -61, -14, 10, -2, -16, -24, -34, + -53, -68, -55, -7, 25, -8, -36, 1, 27, 12, -31, -26, 45, 22, -39, -50, + -41, -32, -25, -17, -10, -4, 0, 3, 13, 38, 51, -5, -77, -69, -31, -15, + -14, -11, -4, 5, 13, 21, 27, 31, 20, -24, -61, -3, 28, -23, -43, -23, + 15, 5, -32, -6, 43, 53, 36, 22, 21, 26, 24, 14, 32, 79, 95, 46, + -3, 0, 15, 5, -1, 7, -1, -36, -52, 2, 53, 46, 7, -18, -30, -84, + -15, 114, 55, 4, -10, -40, -37, 15, 72, 59, 22, 20, 36, 36, 19, 23, + 26, -18, -70, -68, -25, 7, 2, -13, -22, -32, -49, -65, -59, -16, 22, -1, + -36, -8, 25, 17, -22, -35, 34, 36, -29, -48, -42, -32, -25, -18, -10, -4, + 0, 3, 10, 32, 52, 11, -67, -76, -38, -16, -13, -11, -6, 3, 11, 19, + 25, 30, 22, -15, -62, -19, 30, -14, -43, -30, 9, 13, -25, -15, 33, 51, + 37, 23, 21, 26, 26, 15, 24, 68, 94, 54, 0, -3, 13, 8, 1, 8, + 2, -30, -53, -8, 47, 49, 13, -16, -25, -75, -41, 102, 73, 6, -5, -36, + -40, 2, 65, 64, 25, 18, 33, 37, 21, 21, 27, -8, -63, -73, -36, 2, + 5, -10, -21, -30, -45, -62, -61, -25, 17, 5, -35, -17, 21, 21, -13, -39, + 20, 46, -16, -46, -42, -32, -25, -17, -10, -4, 0, 3, 8, 27, 50, 25, + -54, -81, -46, -19, -13, -12, -7, 1, 9, 17, 23, 28, 23, -8, -59, -35, + 27, -5, -42, -35, 2, 20, -16, -20, 24, 47, 38, 24, 21, 27, 28, 17, + 18, 58, 91, 62, 5, -6, 10, 10, 3, 9, 5, -24, -52, -17, 40, 50, + 18, -13, -22, -64, -60, 83, 90, 12, -3, -31, -41, -8, 55, 67, 30, 17, + 30, 37, 24, 19, 27, 1, -54, -75, -46, -4, 7, -7, -18, -28, -41, -58, + -61, -32, 11, 10, -31, -24, 17, 23, -4, -39, 5, 52, -2, -42, -42, -32, + -25, -17, -10, -4, 0, 3, 6, 22, 47, 35, -38, -82, -55, -23, -13, -12, + -8, -1, 7, 15, 21, 26, 23, -1, -53, -48, 20, 5, -39, -39, -6, 22, + -5, -22, 14, 43, 38, 25, 21, 27, 29, 19, 15, 47, 86, 68, 12, -7, + 7, 11, 4, 10, 7, -18, -50, -25, 33, 51, 24, -10, -20, -52, -72, 58, + 103, 21, -1, -26, -41, -17, 44, 67, 35, 16, 27, 36, 26, 18, 25, 8, + -45, -76, -55, -13, 7, -3, -16, -26, -38, -55, -61, -38, 4, 13, -26, -30, + 11, 25, 4, -36, -10, 51, 14, -37, -42, -33, -24, -17, -10, -4, 1, 3, + 6, 18, 42, 42, -22, -80, -63, -28, -14, -12, -9, -3, 5, 12, 19, 24, + 23, 3, -46, -58, 9, 14, -34, -41, -14, 21, 6, -21, 4, 36, 38, 26, + 21, 26, 30, 22, 13, 37, 78, 73, 20, -7, 4, 11, 6, 10, 10, -11, + -45, -33, 22, 49, 29, -4, -18, -40, -75, 23, 108, 40, 1, -18, -39, -26, + 28, 65, 42, 17, 22, 34, 29, 18, 23, 15, -30, -71, -65, -27, 3, 2, + -11, -22, -34, -49, -58, -45, -7, 13, -16, -35, -1, 24, 13, -23, -26, 37, + 36, -20, -39, -34, -24, -17, -10, -4, 1, 3, 5, 12, 33, 46, 6, -64, + -75, -40, -17, -12, -10, -5, 2, 9, 15, 20, 22, 10, -30, -65, -18, 20, + -19, -42, -27, 11, 21, -8, -8, 22, 34, 27, 22, 26, 31, 27, 14, 22, + 60, 75, 34, -4, -2, 8, 8, 11, 14, -2, -36, -42, 6, 44, 36, 4, + -15, -26, -66, -24, 95, 71, 8, -10, -33, -32, 7, 56, 51, 21, 17, 29, + 32, 20, 19, 20, -12, -59, -72, -45, -8, 5, -5, -17, -28, -42, -54, -50, + -21, 9, -5, -36, -16, 19, 21, -7, -34, 12, 51, 4, -33, -34, -25, -17, + -10, -4, 1, 4, 5, 9, 23, 44, 29, -39, -79, -55, -24, -13, -10, -7, + -1, 6, 12, 16, 20, 14, -15, -62, -46, 16, -2, -39, -36, -2, 29, 9, + -12, 8, 28, 27, 23, 25, 31, 31, 17, 13, 43, 72, 46, 2, -5, 5, + 8, 11, 16, 5, -26, -44, -8, 36, 40, 12, -12, -19, -52, -53, 67, 94, + 20, -5, -27, -35, -7, 45, 55, 27, 15, 25, 32, 23, 17, 21, 0, -47, + -73, -57, -19, 4, 0, -13, -24, -37, -50, -51, -29, 3, 1, -32, -26, 12, + 23, 3, -32, -6, 52, 22, -26, -34, -25, -17, -10, -4, 1, 5, 6, 8, + 18, 39, 38, -21, -76, -64, -30, -14, -10, -8, -2, 4, 10, 15, 18, 14, + -9, -56, -57, 7, 7, -35, -39, -10, 27, 18, -10, 2, 23, 26, 23, 24, + 31, 32, 20, 11, 35, 67, 51, 7, -6, 3, 8, 11, 17, 8, -20, -44, + -15, 31, 41, 16, -9, -17, -43, -61, 44, 102, 31, -2, -23, -35, -15, 36, + 56, 32, 0, -27, 1, -1, -1, 3, -4, -2, 1, -1, -2, 2, 3, -6, + 1, 2, -6, 2, 2, -4, -1, 2, -5, 1, 4, -4, 0, -1, 0, -1, + -2, 2, 2, -6, 0, 4, -3, -3, 4, -2, -3, -2, 0, 1, 1, -2, + -2, 3, -8, 27, -42, 11, 21, -35, 34, -25, 12, 9, -24, 14, 13, -38, + 53, -42, -3, 46, -73, 55, -16, -9, 28, -49, 38, -12, -21, 49, -51, 20, + 32, -73, 64, -28, -7, 32, -50, 42, -11, -30, 49, -21, -31, 46, -25, -7, + 20, -22, 18, -16, -10, 21, -23, 5, 28, -35, 8, 0, 8, -26, 19, 6, + -11, -20, 64, -46, -18, 51, -73, 119, -117, 46, 36, -80, 67, -46, 22, 0, + -24, 56, -59, 14, 26, -40, 24, -9, 20, -20, -15, 43, -26, -11, 9, 14, + -3, -31, 6, 54, -62, 3, 67, -78, 20, 21, -25, 31, -41, 18, 27, -53, + 32, 15, -48, 37, -11, 4, -12, -3, 31, -24, -21, 42, -10, -45, 55, -32, + 34, -43, -14, 86, -78, 8, 39, -35, -2, 13, 2, 5, -11, -4, 7, 5, + -31, 37, -4, -28, 28, -9, -11, 10, -1, 4, -18, 17, -9, -13, 24, -18, + 20, -18, -30, 59, -25, -29, 48, -15, -29, 23, 4, -3, -18, 14, 6, -8, + -19, 19, 8, -13, 0, 13, -18, 4, 1, 0, 0, 10, -14, -12, 39, -46, + 23, 9, -22, 23, -20, -22, 63, -42, -28, 77, -66, 12, 38, -56, 31, 27, + -77, 66, -11, -39, 59, -33, -41, 92, -54, -50, 96, -36, -46, 46, -17, 31, + -43, -28, 98, -57, -50, 84, -22, -44, 39, -8, 17, -28, -13, 63, -67, 16, + 10, 3, -15, -4, 36, -34, -1, 26, -27, -2, 13, 7, -22, 0, 27, -11, + -19, 6, 26, -42, 14, 18, -7, -14, -10, 37, -14, -24, 25, -4, -5, -10, + 3, 35, -39, -7, 31, -8, -23, 15, 4, -1, -25, 28, 7, -35, 34, -16, + -1, 9, -35, 45, -22, -17, 48, -52, 24, 22, -65, 48, 7, -45, 47, -19, + -33, 71, -70, 46, -7, -52, 68, -25, -35, 48, -13, -17, 14, 2, -12, 8, + -10, 1, 22, -32, 4, 34, -26, -18, 29, -7, -19, 15, -7, 15, -8, -29, + 50, -22, -35, 53, -19, -37, 47, -9, -40, 41, 1, -27, 7, 3, 0, 0, + -7, 13, -7, -21, 26, 14, -44, 11, 40, -51, 10, 26, -28, 16, -13, -3, + 31, -42, 11, 34, -52, 11, 34, -43, 10, 29, -19, -21, 27, -10, -5, 10, + -14, 11, 3, -35, 43, 3, -52, 37, 22, -66, 49, -12, -19, 50, -58, 16, + 42, -70, 50, -2, -42, 60, -69, 43, 11, -57, 54, -8, -31, 23, -8, -7, + 24, -32, 11, 21, -51, 60, -44, -6, 68, -87, 33, 45, -79, 50, -7, -13, + 21, -40, 31, 12, -41, 18, 24, -39, 15, 7, -17, 25, -20, -12, 43, -47, + 17, 6, -16, 10, 4, -11, -1, 14, -10, -7, 6, 9, -23, 9, 3, 13, + -30, 16, 16, -33, 17, 4, -17, 23, -29, 3, 54, -86, 50, 11, -41, 30, + -23, 15, 18, -60, 56, 7, -65, 49, -4, -12, 1, -6, 19, -4, -33, 35, + -10, -12, 13, -2, -2, -2, 2, -10, 16, -8, -11, 19, -6, -19, 24, -14, + 9, 3, -24, 24, -6, -13, 19, -11, -6, 6, -9, 16, -8, -10, 14, -10, + -1, -5, 16, -8, -25, 37, -11, -27, 37, -14, -13, 19, -17, 14, -5, -15, + 26, -27, 10, 11, -23, 22, -5, -19, 25, -7, -28, 44, -35, 0, 25, -31, + 31, -10, -26, 46, -41, 2, 33, -40, 24, 8, -43, 44, -12, -25, 37, -25, + -6, 29, -27, 5, 24, -40, 24, -1, -25, 23, -1, -6, -2, -1, 14, -24, + 8, 13, -11, 0, -13, 16, 15, -56, 43, 12, -35, 14, -9, 18, -10, -19, + 28, -3, -27, 23, -2, -14, 27, -35, 10, 35, -68, 44, 7, -43, 46, -21, + -25, 56, -35, -21, 51, -33, -8, 28, -27, 19, -2, -26, 36, -26, 3, 13, + -12, 6, -10, 8, -14, 15, -12, 0, 13, -9, -16, 32, -27, 3, 23, -49, + 49, -17, -31, 63, -64, 25, 36, -76, 61, -11, -47, 75, -54, -9, 69, -81, + 32, 29, -63, 46, -7, -26, 39, -31, 6, 18, -26, 13, -5, 5, -5, -2, + 5, -12, 17, -17, -2, 22, -25, 1, 20, -19, 3, 6, -6, 3, -9, 10, + -6, -3, 7, -7, -3, 12, -5, -5, -11, 24, -7, -23, 24, 0, -14, 0, + 12, -10, -2, 5, 0, 1, -10, 10, -2, -17, 26, -11, -16, 28, -22, 6, + 4, -17, 30, -27, -7, 46, -54, 15, 29, -42, 25, -4, -15, 26, -29, 11, + 15, -28, 19, -7, 1, 8, -20, 14, 1, -15, 11, -2, -2, 0, -10, 15, + -5, -12, 15, -1, -15, 12, 4, -15, 9, -1, -9, 9, -5, -6, 13, -12, + 1, 6, -6, -3, 6, -4, 0, -6, 11, -9, -2, 13, -12, -2, -1, 8, + -11, 4, 2, -6, 4, -4, 4, 0, -13, 15, 0, -21, 23, -5, -15, 15, + -2, -9, 6, -2, -4, 2, 3, -1, -7, 7, -2, -9, 6, 2, -9, 4, + 5, -12, 10, -9, 4, 5, -16, 12, -2, -13, 20, -13, -4, 17, -23, 14, + 2, -20, 22, -13, -3, 15, -22, 12, 4, -18, 17, -7, -7, 13, -14, 6, + 4, -10, 9, -5, -6, 7, 0, -7, 8, -4, -1, 0, -6, 4, 7, -14, + 2, 13, -16, 3, 10, -15, 7, -1, -10, 14, -10, -2, 11, -9, -4, 7, + -6, 3, -3, -5, 9, -6, -3, 5, 1, -7, 3, -2, 0, -2, 0, 4, + -3, -2, 4, -6, 4, -2, -2, 0, 1, 0, -7, 7, -2, -7, 9, -7, + -4, 11, -15, 11, -2, -9, 9, -4, -3, 2, 3, -7, 5, 0, -5, 6, + -7, 1, 7, -10, -2, 13, -9, -4, 8, -4, -2, -1, 1, 1, -7, 4, + 5, -8, 0, 6, -6, 0, 3, -4, 0, 1, -2, 2, -4, -4, 8, -7, + -1, 6, -9, 8, -3, -6, 12, -12, 1, 10, -11, 1, 5, -6, 3, -2, + -3, 7, -10, 2, 7, -12, 5, 2, -5, 3, -5, 0, 6, -10, 3, 4, + -8, 2, 2, -3, 3, -8, 8, 2, -14, 10, 3, -12, 8, 2, -11, 8, + -2, -6, 9, -7, -4, 10, -9, -1, 7, -7, 1, 3, -8, 8, -2, -8, + 10, -3, -5, 5, -6, 3, 1, -8, 10, -5, -5, 7, -4, -2, 2, -3, + 1, -1, -3, 4, -3, 0, 0, 0, 0, -4, 3, -2, -3, 3, -5, 3, + 0, -7, 5, 1, -8, 5, 1, -6, 6, -5, 0, 3, -7, 3, 2, -6, + 3, 2, -6, 3, 1, -3, -2, 5, -4, -1, 3, -4, 0, 0, -3, 5, + -5, -3, 7, -5, -3, 6, -4, 0, -1, -3, 3, -2, -1, 2, -1, -2, + 1, -2, 1, -1, -7, 8, -1, 5, -7, 13, -22, 8, -7, 8, -110, -28, + 24, 54, 36, 2, 60, -45, 57, 42, -43, 20, 41, -66, 24, -11, 18, -18, + -38, -63, -36, 30, -11, 33, 25, 30, 18, 11, -18, -5, 5, -46, 40, 1, + -13, -18, -20, -31, 20, 10, 29, -7, -18, 40, -29, -17, 42, -19, 6, -4, + 6, -8, 10, -26, -5, 3, 1, -17, 6, 0, 19, -1, 8, 0, -6, -10, + -1, -12, -1, 1, -3, 8, -7, 4, 11, 4, 14, -13, 16, -19, -4, -13, + -13, -14, 6, 4, -1, 4, 11, -1, 11, -1, 1, -4, -1, -15, 6, -9, + 1, -1, 0, 3, 1, -8, 3, -1, -1, 2, -2, 2, -2, 1, -5, -7, + 3, -3, 6, -3, 4, -1, 0, -4, 2, -7, 3, -6, -1, -1, 4, 0, + 3, -2, 2, -5, 5, -8, -3, -3, 2, -5, 7, -1, 4, -2, 4, -10, + 6, -6, -1, -4, 5, -13, 7, -6, 5, -8, 17, -20, 14, -6, 9, -40, + 71, -127, 9, -73, 127, 76, -28, 74, -32, 8, -62, -49, -38, 40, -68, 22, + -12, 68, 10, 39, -10, 0, 35, -23, 0, -59, -15, -7, -3, -23, 1, -20, + 37, 27, 2, 30, -2, 17, 2, -5, -7, -27, -29, 16, -3, -11, 1, -16, + -5, -8, -10, 7, 32, 9, 5, -4, 16, 5, -8, -17, -16, 5, -13, 8, + 11, 15, -10, -9, 0, -1, 2, 7, -3, -23, 9, 2, 3, 1, -13, -1, + -6, 11, -6, 8, 1, 12, -12, 9, -14, 8, -1, 0, -3, -13, 4, -7, + -4, 8, 5, -5, -7, 4, -2, -3, 2, 3, -6, 8, -3, 1, -3, -2, + 2, -6, 2, -4, -3, -4, 3, 1, 0, 0, 1, -1, -1, 2, -2, 0, + -4, -2, 1, 2, 0, -3, 1, -3, 0, -1, -3, -6, 2, -2, 3, -4, + 10, -8, 9, -5, 12, -19, 46, 37, -128, 60, -90, 102, -65, 40, -57, 39, + -6, 23, -8, 19, 24, 15, -17, -47, -27, -36, -16, 21, 3, 23, 14, 50, + -8, 19, 25, 7, -9, -28, -63, -37, 0, -42, 54, -17, 68, -3, 30, -12, + -4, 11, -15, 9, -25, -15, -2, -27, -25, 38, -8, -13, 33, 24, 12, -38, + 39, -12, -3, -17, -44, 38, 2, 27, 3, -5, -4, -13, -30, -56, -4, 11, + 1, 9, 17, 46, 25, -14, 6, -3, -7, -21, 2, 16, -5, -22, 2, -2, + 6, -12, -25, -15, 10, 9, 8, 11, 43, 8, -5, -22, -16, 14, -31, 16, + 7, -7, -26, -20, -2, 9, 11, 26, 7, 6, -20, -13, 0, 4, 17, -17, + -18, 10, 2, -10, 27, -8, 24, -23, -14, 1, 0, 13, -19, 14, 10, -16, + 16, -4, -20, 20, -33, 2, 2, 24, 21, -3, -26, -24, -18, -18, 10, 10, + 24, 18, 2, 9, -24, 16, -14, -8, 9, -5, -14, 8, -5, 30, -11, 11, + -13, -15, -12, 7, 4, -13, -13, 13, -13, 12, 23, 9, 0, 14, -10, -9, + -35, -2, -21, 12, -1, 17, 19, 11, -4, 0, -18, -24, 11, -10, 1, 11, + 12, -13, -16, 10, -23, 21, 9, -9, 3, 12, -6, 3, -5, 12, 0, -2, + 0, -19, -9, 5, -11, -7, 10, 1, -3, 9, 18, -6, 0, -1, 1, -13, + 2, 1, -3, -8, 17, -4, -9, 18, -15, 8, -1, -11, -5, -14, 11, -5, + -7, 12, 16, -7, 7, -3, -11, -5, -6, 1, 4, -3, -3, 15, 5, 0, + 3, 6, -16, 4, -14, -6, -9, -4, 2, 11, 11, 7, -2, 4, -12, -7, + -14, -6, -7, 9, 4, 7, -2, 6, 5, 6, -4, -3, -4, 7, -7, -11, + -9, 0, -3, 7, -2, -2, 3, 13, -4, -6, -15, 9, -7, -1, 4, 6, + 5, 8, -6, -8, 0, -11, -4, 6, -8, 4, 3, 5, 13, -4, -9, -3, + 4, -3, -3, 4, -1, -12, 6, -14, 2, 3, 15, 2, 6, -7, -8, 3, + 1, -2, 3, -3, -12, -6, -14, 7, -2, 13, 6, 10, 6, 0, -2, -10, + -12, -8, -6, -7, -6, 6, 4, -2, 5, 2, 0, -1, 3, -11, 4, 0, + 20, -8, -2, 0, -1, -3, 7, -3, -4, -2, -6, -10, -10, -8, 1, 2, + 5, 8, 2, 5, 8, 3, 4, 3, -2, -15, 0, -1, -7, -2, -5, -10, + 10, -1, 5, 3, 5, -1, -2, -8, -5, -9, 1, -8, 6, 5, 4, 1, + 1, 2, 3, -2, 4, -7, 1, -7, -9, -2, 0, 2, 3, 6, -8, 8, + 3, 0, -2, -9, -3, -2, 0, 3, -1, -2, -3, 7, -3, 10, -8, 1, + -12, 3, -7, 2, -3, 7, 4, 4, 0, 0, -6, -1, -5, -3, -4, -7, + 0, 5, 7, 0, 2, -3, 10, -1, 3, -7, -5, -4, -9, -3, -7, 5, + -4, 9, 2, 1, 4, 5, 0, -5, 1, -8, 4, -9, 5, -5, 0, 3, + -2, -1, 1, 1, -7, 7, 0, 3, -5, 0, -3, -1, -1, -5, -1, 1, + -1, 1, -1, 0, 2, 0, 2, -7, -7, 4, -1, 0, 3, 4, -1, -3, + -4, -6, 3, -2, 4, -1, 5, -2, -1, -5, -2, -4, 1, 3, 2, 2, + 0, -3, 1, 1, -3, -3, -1, 1, -3, -2, -1, -2, -3, -1, 0, 4, + 3, 5, 2, 1, -4, -9, -3, -7, 1, -2, 7, -2, 3, 3, 3, 1, + 0, -1, -6, -7, -6, -4, -1, 1, 0, 5, 2, -2, 2, -3, -1, 3, + -1, 1, -4, -4, -5, 0, -7, 2, -4, 3, 4, 1, 2, -1, -1, -2, + -2, 0, -1, 1, -1, -1, -3, 1, 1, 3, -3, -1, 1, 1, -2, -3, + -8, -5, 0, -1, 5, 2, 3, 1, -2, -1, -1, -3, 1, 1, -2, -3, + -3, -1, 0, -1, 1, 2, 2, 5, 0, -1, -2, -1, -2, 0, -4, 0, + -5, -1, -1, 0, 1, 5, 4, -2, -1, -2, 0, -6, -1, 0, 1, -1, + -2, 1, 0, 0, 3, 1, -2, 1, -2, -4, -1, 0, -1, -1, -4, -2, + -4, 2, -1, 1, 0, 3, 2, 0, 4, -1, 4, -6, 2, -4, -3, -5, + -4, -3, 0, 2, 0, 1, 4, 2, 2, -2, -2, -5, -6, -5, -3, -2, + 1, -1, 0, 0, 2, 2, 2, 0, 4, -2, 3, 2, -1, -2, -3, -3, + -3, -5, -5, -5, -1, -1, 0, 2, 2, 4, 1, 2, 1, 2, -1, -1, + -3, -4, -5, -3, -2, -2, -1, 1, 4, 2, 2, 2, 1, -1, -2, -6, + -2, -3, 2, -1, 1, -2, 0, 2, 1, 2, -2, 1, 0, -2, -2, -3, + 0, -2, -1, -1, 0, -2, -2, 1, 0, 2, -1, 1, -1, 0, -1, -1, + 0, -1, 0, -2, 2, 0, 2, 2, 5, 3, 6, 8, 12, 13, -6, -110, + -7, 51, -99, -128, 10, -28, -39, 25, -33, -27, 41, 34, -5, 17, 23, 25, + 24, 23, 20, 24, 25, 24, 21, 20, 23, 23, 16, 20, 9, 20, 18, 10, + 14, 5, 14, 11, 7, 5, 3, 10, 2, 7, -4, 0, 3, 0, -3, -5, + -6, -1, -12, -4, -17, -10, 9, -42, -40, 65, 40, -58, 29, 72, 39, 50, + 31, -1, 30, 25, -7, -4, -33, -47, -29, -49, -74, -69, -71, -79, -61, -51, + -57, -53, -34, -20, -22, -16, -10, -6, -2, 1, 3, 4, 8, 8, 12, 10, + 9, 14, 13, 12, 12, 13, 12, 12, 14, 12, 12, 12, 12, 13, 12, 9, + 11, 11, 11, 7, 8, 7, 8, 9, 2, 5, 8, -6, 2, 17, -17, -20, + 18, 5, -15, 15, 27, 21, 37, 44, 41, 46, 38, 26, 32, 26, -4, -15, + -6, -20, -44, -50, -54, -60, -59, -58, -58, -54, -46, -38, -32, -26, -19, -14, + -9, -5, -1, 2, 5, 7, 8, 10, 11, 12, 13, 13, 14, 14, 14, 13, + 13, 14, 15, 14, 11, 13, 14, 13, 12, 10, 12, 12, 10, 10, 8, 6, + 11, 9, -1, 5, 11, -1, -6, 1, -1, -4, 0, -1, 0, 14, 25, 24, + 28, 37, 38, 38, 38, 31, 22, 14, 4, -5, -15, -26, -38, -47, -52, -54, + -56, -57, -55, -51, -45, -39, -34, -28, -22, -17, -13, -8, -3, -1, 2, 5, + 7, 8, 10, 11, 12, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 12, + 13, 13, 12, 11, 12, 11, 9, 11, 9, 6, 7, 8, 5, 3, 2, 0, + 0, 0, -2, -3, 0, 3, 6, 11, 18, 23, 27, 31, 34, 35, 32, 27, + 21, 14, 5, -5, -15, -26, -35, -43, -48, -52, -53, -53, -52, -49, -44, -40, + -35, -29, -24, -19, -14, -10, -6, -3, 1, 3, 5, 7, 9, 10, 11, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 12, 11, 13, 11, 10, + 10, 9, 9, 8, 7, 7, 5, 4, 3, 2, 0, -1, -1, 0, 2, 4, + 8, 12, 17, 22, 25, 28, 30, 30, 28, 24, 19, 12, 3, -5, -14, -23, + -31, -37, -43, -46, -46, -48, -47, -43, -41, -38, -33, -29, -25, -21, -16, -12, + -8, -5, -2, 0, 3, 5, 7, 9, 10, 11, 12, 12, 13, 14, 13, 13, + 13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 9, 9, 8, 7, 7, 6, + 5, 4, 4, 3, 3, 3, 3, 5, 6, 8, 10, 12, 14, 17, 18, 19, + 20, 19, 17, 14, 10, 5, 0, -6, -11, -17, -22, -26, -29, -32, -34, -34, + -35, -34, -32, -31, -28, -26, -23, -20, -17, -14, -11, -8, -5, -3, 0, 2, + 4, 6, 7, 8, 9, 10, 11, 11, 12, 12, 12, 12, 11, 11, 11, 10, + 10, 9, 9, 8, 8, 7, 7, 6, 5, 5, 5, 4, 4, 5, 5, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 12, 10, 8, 5, 2, + -2, -6, -10, -14, -18, -21, -24, -26, -28, -29, -29, -30, -29, -28, -27, -25, + -23, -20, -18, -15, -12, -10, -7, -4, -2, 0, 2, 4, 6, 7, 9, 10, + 10, 11, 11, 12, 12, 12, 12, 11, 11, 11, 10, 10, 9, 9, 8, 8, + 7, 7, 6, 6, 5, 5, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, + 12, 13, 13, 13, 12, 11, 10, 8, 5, 2, -1, -5, -9, -13, -16, -19, + -22, -24, -26, -27, -28, -28, -28, -27, -26, -24, -22, -20, -18, -15, -13, -10, + -7, -5, -2, 0, 2, 4, 5, 7, 8, 9, 10, 11, 11, 11, 11, 11, + 11, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, + 5, 5, 6, 6, 6, 7, 8, 9, 10, 11, 11, 12, 12, 12, 11, 10, + 9, 7, 5, 2, -1, -5, -8, -12, -15, -18, -21, -23, -25, -26, -27, -27, + -27, -26, -25, -24, -22, -20, -18, -16, -13, -11, -8, -6, -3, -1, 1, 3, + 4, 6, 7, 8, 9, 10, 10, 10, 11, 11, 11, 10, 10, 10, 10, 9, + 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 5, 5, 6, 6, 6, 7, + 8, 9, 9, 10, 11, 11, 11, 11, 11, 10, 9, 7, 4, 2, -1, -4, + -7, -11, -14, -17, -19, -21, -23, -24, -25, -26, -26, -25, -24, -23, -22, -20, + -18, -16, -13, -11, -9, -6, -4, -2, 0, 2, 4, 5, 7, 8, 9, 9, + 10, 10, 11, 11, 11, 11, 10, 10, 10, 9, 9, 8, 8, 7, 7, 7, + 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, + 11, 11, 10, 10, 8, 7, 5, 2, -1, -3, -7, -10, -13, -15, -18, -20, + -22, -23, -24, -25, -25, -24, -24, -23, -21, -20, -18, -16, -14, -11, -9, -7, + -5, -2, 0, 1, 3, 5, 6, 7, 8, 9, 9, 10, 10, 10, 10, 10, + 10, 10, 9, 9, 8, 8, 8, 7, 7, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 9, 9, 8, 7, 6, 4, + 2, 0, -2, -5, -7, -10, -12, -15, -17, -18, -20, -21, -21, -22, -22, -21, + -21, -20, -18, -17, -15, -13, -12, -10, -8, -6, -4, -2, 0, 1, 3, 4, + 5, 6, 7, 8, 8, 8, 9, 9, 9, 9, 9, 8, 8, 8, 8, 7, + 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 8, 7, 6, 5, 4, 3, 1, -1, -3, -5, -7, -9, -10, + -12, -14, -15, -16, -17, -18, -18, -18, -18, -17, -17, -16, -15, -13, -12, -11, + -9, -7, -6, -4, -3, -1, 0, 1, 3, 4, 5, 5, 6, 7, 7, 7, + 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 5, + 4, 3, 2, 0, -1, -3, -5, -7, -9, -10, -12, -13, -15, -16, -17, -17, + -18, -18, -18, -17, -17, -16, -15, -14, -12, -11, -9, -8, -6, -5, -3, -2, + -1, 1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 4, 3, 2, 0, -1, -3, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, + 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 6, 7, 8, 9, 10, 10, + 11, 12, 12, 13, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 26, + 27, 29, 29, 29, 28, 28, 28, 29, 30, 31, 31, 31, 31, 28, 19, -8, + -41, -53, -57, -59, -60, -62, -62, -63, -64, -65, -65, -66, -67, -69, -69, -69, + -72, -74, -73, -74, -76, -78, -79, -81, -82, -82, -83, -81, -83, -85, -81, -81, + -88, -90, -80, -64, -47, -32, -23, -18, -15, -13, -12, -12, -12, -13, -13, -13, + -13, -13, -12, -12, -11, -9, -7, -6, -4, -2, -1, 0, 1, 2, 4, 5, + 7, 10, 12, 14, 16, 18, 19, 18, 19, 21, 19, 20, 22, 22, 22, 25, + 27, 28, 29, 29, 29, 29, 29, 30, 31, 31, 31, 33, 34, 34, 35, 34, + 33, 31, 30, 29, 26, 25, 26, 25, 22, 22, 21, 20, 20, 19, 19, 19, + 18, 18, 18, 17, 17, 17, 17, 16, 16, 16, 15, 13, 13, 14, 14, 15, + 13, 12, 13, 13, 11, 12, 14, 14, 16, 17, 15, 16, 19, 19, 19, 19, + 21, 19, 17, 18, 19, 18, 15, 15, 17, 18, 18, 13, 11, 14, 15, 14, + 11, 6, 5, 10, 13, 17, 18, 11, 2, -2, -2, -3, 2, 14, 24, 30, + 37, 47, 52, 52, 56, 63, 65, 65, 63, 65, 72, 75, 73, 71, 73, 77, + 82, 82, 77, 77, 82, 90, 99, 104, 99, 89, 84, 86, 94, 106, 119, 127, + 126, 117, 104, 87, 64, 42, 24, 10, -2, -15, -22, -25, -27, -30, -35, -37, + -36, -34, -33, -36, -40, -42, -44, -43, -44, -48, -53, -57, -59, -57, -53, -52, + -53, -57, -62, -68, -73, -75, -75, -71, -63, -56, -48, -40, -34, -29, -26, -23, + -22, -21, -19, -19, -20, -21, -22, -22, -22, -22, -22, -21, -21, -21, -20, -19, + -19, -18, -18, -17, -17, -16, -14, -14, -13, -11, -9, -9, -9, -9, -9, -8, + -8, -8, -8, -8, -7, -6, -7, -6, -4, -3, -2, -2, -3, -4, -3, -3, + -2, -1, 0, 0, -1, -1, 0, -1, -1, -1, -3, -5, -5, -8, -10, -10, + -9, -9, -10, -11, -11, -11, -11, -11, -10, -9, -10, -10, -10, -11, -12, -12, + -13, -12, -11, -12, -14, -14, -11, -10, -12, -11, -11, -12, -12, -11, -11, -13, + -12, -9, -6, -6, -7, -7, -6, -5, -4, -4, -5, -8, -12, -11, -8, -4, + -3, -5, -6, -7, -9, -12, -13, -8, -3, -2, -4, -8, -11, -14, -15, -17, + -19, -19, -15, -8, -1, 2, 4, 8, 12, 17, 23, 26, 25, 24, 25, 30, + 36, 40, 39, 36, 33, 32, 33, 37, 43, 49, 53, 53, 49, 45, 43, 43, + 46, 52, 60, 67, 76, 82, 82, 78, 69, 58, 47, 37, 26, 14, 2, -9, + -16, -21, -24, -28, -32, -35, -37, -38, -37, -36, -36, -36, -39, -43, -46, -49, + -51, -49, -47, -46, -45, -45, -48, -52, -58, -62, -65, -66, -65, -62, -58, -54, + -50, -45, -39, -34, -30, -28, -25, -23, -21, -20, -20, -20, -20, -19, -18, -19, + -20, -18, -17, -18, -17, -17, -18, -17, -16, -15, -15, -13, -12, -10, -10, -10, + -9, -8, -7, -6, -4, -4, -5, -6, -5, -4, -4, -3, -2, -2, -1, -1, + -1, 0, 2, 3, 2, 2, 3, 2, 1, 2, 4, 5, 5, 4, 4, 4, + 3, 2, 2, 1, 0, 0, -1, -4, -5, -4, -2, -2, -3, -3, -3, -2, + -1, -2, -3, -2, -3, -4, -4, -3, -4, -6, -7, -4, 0, 0, -2, -4, + -4, -3, -2, -2, -3, -4, -4, -3, -2, -1, 3, 6, 8, 6, 3, 0, + 0, 2, 4, 5, 4, 3, 2, 2, 2, 1, 0, -1, 2, 7, 11, 9, + 6, 2, -1, -3, -3, -5, -7, -8, -6, -3, 2, 8, 13, 17, 18, 18, + 19, 23, 28, 34, 40, 42, 42, 40, 39, 39, 40, 42, 46, 50, 55, 59, + 59, 55, 51, 48, 48, 51, 57, 63, 70, 76, 82, 86, 88, 89, 86, 80, + 71, 61, 51, 43, 34, 25, 18, 10, 2, -5, -9, -12, -13, -12, -12, -13, + -14, -17, -22, -26, -29, -28, -27, -25, -24, -24, -25, -27, -31, -35, -40, -43, + -46, -47, -49, -49, -46, -43, -40, -36, -32, -28, -24, -21, -18, -16, -14, -13, + -13, -12, -11, -11, -12, -11, -10, -9, -11, -11, -11, -12, -12, -12, -10, -10, + -10, -10, -9, -8, -7, -6, -5, -4, -4, -4, -4, -4, -3, -2, -2, -1, + -2, -3, -2, -1, 0, 0, 1, 2, 3, 2, 1, 1, 2, 3, 3, 4, + 5, 4, 4, 5, 6, 7, 6, 4, 3, 3, 3, 2, -1, -3, -3, -1, + -1, -2, -3, -3, -2, -1, 1, 0, -1, -1, -2, -5, -6, -5, -4, -4, + -4, -4, -6, -6, -4, -1, 0, -2, -6, -9, -10, -8, -5, -4, -3, -3, + -1, 1, 1, -1, -3, -4, -2, 0, 2, 2, 0, -3, -6, -7, -6, -4, + -3, -2, -1, -1, -1, 0, 1, 0, -3, -9, -14, -18, -18, -15, -12, -9, + -8, -7, -5, -3, -2, 0, 5, 11, 17, 22, 25, 24, 23, 21, 20, 22, + 27, 32, 37, 40, 41, 40, 39, 37, 35, 34, 34, 35, 39, 45, 52, 59, + 66, 71, 73, 75, 74, 71, 65, 60, 55, 48, 39, 28, 17, 7, -1, -7, + -11, -13, -13, -14, -17, -21, -24, -28, -31, -32, -32, -32, -32, -31, -29, -29, + -30, -33, -36, -40, -44, -47, -50, -52, -54, -55, -54, -52, -49, -47, -43, -39, + -35, -31, -28, -26, -24, -22, -21, -19, -18, -17, -17, -16, -15, -16, -18, -17, + -16, -16, -17, -18, -18, -17, -16, -16, -14, -13, -13, -12, -12, -12, -11, -10, + -10, -9, -7, -8, -9, -10, -10, -8, -6, -5, -6, -6, -5, -3, -3, -4, + -4, -4, -3, -2, -2, -1, -1, -1, 0, 2, 3, 3, 3, 2, 1, 0, + -1, -1, -1, -2, -3, -5, -5, -4, -2, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 3, 2, 0, + -1, 1, 2, 1, -1, -1, 2, 2, 0, 1, 2, 2, -1, -4, -10, -21, + -30, -36, -41, -44, -40, -30, -18, -10, -8, -11, -13, -8, 3, 18, 32, 41, + 44, 45, 48, 49, 43, 32, 23, 14, 7, 8, 16, 27, 35, 37, 30, 18, + 9, 5, 3, 2, 1, 1, -1, -6, -11, -12, -6, -2, -5, -11, -18, -28, + -39, -47, -55, -69, -86, -99, -102, -92, -70, -46, -28, -15, -3, 7, 17, 26, + 28, 24, 23, 30, 42, 53, 57, 50, 36, 21, 5, -5, -4, 6, 20, 31, + 35, 34, 29, 26, 27, 37, 56, 76, 85, 80, 71, 63, 55, 47, 34, 13, + -13, -32, -39, -40, -46, -65, -93, -117, -128, -128, -126, -120, -110, -96, -78, -58, + -36, -14, 3, 10, 20, 41, 60, 68, 63, 54, 45, 39, 36, 32, 28, 29, + 35, 41, 47, 46, 41, 39, 43, 53, 68, 80, 78, 64, 46, 28, 13, 3, + -9, -35, -64, -80, -82, -74, -66, -71, -91, -111, -121, -118, -105, -86, -68, -57, + -49, -37, -22, -7, 5, 14, 26, 42, 55, 56, 46, 35, 25, 14, 6, 2, + 1, 3, 11, 22, 32, 40, 43, 42, 46, 60, 77, 88, 90, 78, 54, 30, + 14, 2, -15, -37, -62, -82, -90, -89, -86, -90, -99, -107, -109, -101, -81, -54, + -29, -14, -5, 7, 24, 40, 49, 56, 68, 83, 92, 92, 87, 74, 54, 32, + 12, -5, -19, -25, -24, -18, -7, 1, -1, -6, -4, 13, 41, 69, 84, 80, + 63, 44, 32, 29, 25, 11, -10, -25, -31, -35, -40, -48, -65, -87, -104, -109, + -102, -87, -69, -58, -54, -42, -21, 0, 13, 29, 51, 71, 84, 89, 86, 75, + 54, 33, 14, -3, -19, -29, -27, -22, -18, -11, -8, -16, -26, -19, 2, 24, + 40, 48, 42, 27, 21, 29, 34, 24, 7, -5, -14, -23, -28, -32, -45, -67, + -82, -85, -78, -63, -46, -34, -29, -24, -13, 0, 12, 25, 44, 65, 79, 85, + 86, 78, 60, 41, 27, 12, -5, -15, -15, -14, -13, -8, -7, -17, -27, -23, + -3, 23, 44, 51, 43, 25, 12, 11, 14, 8, -3, -10, -15, -22, -28, -30, + -36, -55, -73, -78, -74, -71, -63, -51, -43, -39, -34, -25, -18, -9, 8, 28, + 46, 56, 61, 62, 58, 47, 36, 28, 20, 12, 11, 16, 19, 20, 21, 15, + 0, -6, 10, 37, 57, 63, 55, 36, 15, 2, -3, -9, -19, -27, -34, -43, + -49, -49, -52, -66, -82, -86, -81, -77, -71, -61, -51, -47, -43, -35, -22, -12, + 2, 24, 47, 58, 63, 67, 66, 58, 51, 45, 34, 18, 9, 7, 7, 7, + 8, 1, -14, -24, -12, 18, 47, 64, 68, 63, 53, 42, 37, 38, 36, 29, + 21, 16, 11, 5, -2, -17, -36, -49, -52, -56, -62, -63, -61, -61, -63, -60, + -56, -49, -37, -19, 2, 17, 25, 30, 34, 37, 37, 37, 34, 25, 15, 11, + 13, 14, 14, 8, -7, -21, -16, 9, 37, 53, 60, 61, 53, 40, 33, 34, + 32, 22, 14, 12, 10, 6, -2, -15, -32, -48, -57, -60, -63, -67, -66, -63, + -63, -65, -64, -58, -49, -34, -13, 6, 16, 21, 28, 34, 38, 41, 43, 36, + 25, 19, 21, 26, 27, 20, 4, -11, -11, 7, 31, 53, 66, 70, 66, 57, + 49, 47, 44, 33, 21, 17, 16, 10, 1, -9, -26, -46, -60, -67, -76, -84, + -84, -80, -78, -79, -78, -73, -65, -52, -32, -11, 4, 10, 17, 25, 32, 36, + 40, 37, 24, 13, 15, 23, 23, 11, -5, -19, -25, -16, 9, 38, 59, 70, + 72, 67, 63, 63, 60, 50, 39, 32, 28, 22, 14, 3, -14, -34, -53, -65, + -76, -87, -94, -93, -91, -94, -96, -93, -86, -76, -56, -30, -9, 4, 16, 29, + 40, 51, 63, 65, 52, 39, 39, 45, 42, 29, 11, -7, -22, -24, -8, 19, + 42, 54, 60, 63, 61, 58, 57, 53, 43, 36, 36, 34, 28, 21, 11, -5, + -24, -39, -52, -65, -75, -77, -75, -75, -78, -80, -78, -73, -61, -43, -23, -9, + 1, 10, 23, 39, 52, 56, 47, 36, 35, 41, 42, 33, 17, -2, -24, -35, + -26, -3, 18, 32, 42, 50, 52, 53, 52, 47, 38, 31, 30, 31, 29, 26, + 22, 14, -1, -18, -33, -46, -58, -65, -65, -65, -71, -79, -81, -79, -75, -62, + -42, -27, -21, -14, 1, 19, 34, 40, 36, 29, 27, 31, 38, 39, 29, 9, + -12, -27, -28, -14, 8, 25, 37, 50, 62, 67, 66, 62, 53, 42, 36, 37, + 36, 32, 30, 25, 12, -7, -24, -39, -54, -65, -67, -67, -72, -78, -81, -82, + -81, -70, -51, -35, -29, -23, -7, 15, 30, 37, 40, 35, 25, 25, 36, 41, + 33, 15, -6, -26, -36, -27, -9, 7, 20, 35, 50, 58, 59, 58, 52, 43, + 37, 37, 37, 36, 34, 31, 24, 8, -11, -29, -44, -57, -67, -70, -73, -79, + -86, -92, -93, -87, -72, -59, -53, -46, -29, -9, 7, 20, 28, 26, 19, 17, + 27, 38, 38, 26, 7, -12, -25, -26, -15, 1, 14, 28, 47, 61, 67, 68, + 68, 63, 54, 51, 53, 51, 49, 49, 47, 34, 14, -5, -22, -39, -56, -65, + -67, -73, -86, -96, -97, -92, -86, -77, -69, -61, -49, -28, -6, 10, 22, 27, + 25, 24, 33, 49, 56, 48, 32, 13, -5, -15, -12, -2, 7, 18, 35, 50, + 59, 63, 65, 61, 53, 48, 46, 44, 43, 46, 49, 43, 27, 10, -6, -25, + -45, -53, -53, -60, -75, -87, -90, -90, -88, -81, -75, -72, -65, -48, -25, -6, + 5, 10, 13, 18, 31, 49, 60, 58, 44, 28, 12, -1, -7, -7, -1, 8, + 23, 41, 54, 61, 65, 66, 63, 56, 48, 43, 41, 42, 44, 43, 37, 25, + 8, -12, -32, -44, -49, -53, -64, -80, -91, -95, -93, -89, -85, -82, -78, -68, + -50, -27, -6, 0, -1, 0, 0, 0, 1, 2, 3, 6, 9, 13, 17, 19, + 13, -4, -15, -10, 4, 19, 26, 15, -9, -16, 6, -2, -18, 38, 64, 21, + -48, 30, 82, -23, -63, -50, -26, -7, 12, 26, 47, 83, 100, 3, -108, -87, + -30, -6, 5, 18, 33, 46, 47, 21, -52, -46, 48, 3, -54, -32, 22, 25, + -7, 12, 9, -18, -33, -24, 2, 44, 88, 92, 10, -28, -1, 1, 20, 42, + 1, -17, 53, 72, 12, -16, -74, -31, 127, 52, 1, -35, -46, 13, 39, -13, + -13, 13, 12, 11, 8, -57, -80, -44, -5, 14, 18, 6, -13, -26, -11, -8, + -24, 3, 30, 14, -28, -12, 41, -2, -37, -35, -23, -12, -1, 6, 17, 34, + 53, 19, -55, -67, -32, -13, -5, 2, 12, 19, 24, 14, -24, -47, 12, 11, + -36, -35, -1, 18, -3, 0, 5, -13, -25, -22, -5, 19, 53, 69, 21, -28, + -10, -5, 6, 28, 8, -25, 23, 57, 17, -17, -49, -63, 84, 70, 3, -23, + -50, -6, 36, -2, -20, 8, 14, 9, 13, -37, -82, -58, -19, 8, 17, 10, + -9, -26, -19, -7, -24, -9, 25, 22, -17, -28, 33, 16, -32, -37, -27, -15, + -4, 4, 13, 27, 48, 35, -35, -72, -43, -17, -7, -1, 9, 16, 23, 17, + -12, -51, -7, 21, -27, -40, -12, 19, 6, -3, 5, -9, -22, -23, -8, 11, + 42, 68, 38, -23, -16, -6, 3, 25, 19, -24, 8, 54, 31, -13, -33, -76, + 46, 95, 13, -13, -48, -20, 32, 13, -22, 2, 15, 10, 15, -17, -77, -67, + -31, 3, 17, 15, -3, -21, -23, -7, -20, -18, 18, 27, -4, -34, 17, 33, + -21, -36, -29, -16, -6, 4, 11, 23, 42, 47, -12, -69, -54, -22, -8, -2, + 7, 15, 22, 20, -2, -46, -27, 23, -13, -41, -22, 15, 16, -2, 4, -5, + -18, -21, -10, 5, 32, 64, 53, -12, -21, -6, 0, 21, 27, -16, -6, 48, + 42, -6, -22, -71, 2, 106, 31, -6, -41, -32, 22, 25, -18, -4, 15, 12, + 14, -1, -64, -74, -42, -5, 16, 19, 4, -16, -25, -10, -14, -23, 9, 29, + 9, -31, -2, 42, -5, -33, -30, -18, -8, 3, 9, 19, 36, 51, 10, -58, + -63, -29, -11, -2, 4, 13, 20, 21, 6, -35, -44, 16, 1, -38, -30, 7, + 23, 3, 2, -2, -16, -20, -12, 2, 23, 56, 62, 3, -24, -7, -2, 17, + 30, -5, -17, 37, 49, 4, -17, -57, -37, 99, 55, 0, -31, -41, 9, 33, + -10, -11, 13, 14, 12, 9, -47, -78, -53, -15, 12, 20, 9, -10, -24, -14, + -11, -25, -2, 27, 18, -21, -20, 39, 13, -29, -31, -20, -9, 1, 8, 17, + 30, 49, 29, -41, -70, -39, -15, -4, 2, 11, 17, 21, 11, -22, -52, 0, + 14, -31, -36, -4, 25, 11, 1, -1, -13, -19, -13, 0, 15, 45, 65, 20, + -24, -10, -4, 12, 30, 8, -22, 24, 52, 17, -14, -39, -61, 71, 81, 8, + -21, -44, -5, 34, 2, -16, 9, 16, 11, 14, -29, -76, -62, -27, 6, 20, + 15, -4, -21, -19, -9, -23, -12, 22, 25, -8, -30, 26, 30, -20, -31, -23, + -11, -1, 8, 14, 25, 44, 42, -19, -69, -50, -20, -6, 1, 9, 15, 20, + 15, -11, -51, -19, 20, -20, -39, -15, 23, 20, 2, 0, -11, -17, -14, -2, + 9, 35, 63, 37, -19, -14, -5, 8, 28, 18, -22, 9, 50, 28, -11, -26, + -68, 32, 100, 22, -13, -43, -18, 30, 15, -17, 4, 16, 12, 15, -12, -69, + -69, -39, -2, 18, 19, 2, -17, -22, -10, -19, -20, 15, 27, 4, -31, 7, + 41, -7, -30, -25, -13, -3, 6, 12, 22, 38, 48, 3, -61, -60, -27, -9, + 0, 7, 13, 19, 17, -2, -44, -37, 18, -7, -39, -24, 15, 28, 7, 0, + -9, -16, -14, -3, 6, 25, 57, 49, -9, -18, -7, 3, 25, 26, -15, -4, + 45, 38, -5, -18, -61, -8, 103, 42, -6, -37, -30, 21, 25, -13, -3, 16, + 13, 14, 2, -56, -73, -49, -12, 15, 21, 8, -11, -23, -13, -15, -24, 4, + 28, 14, -25, -12, 42, 9, -26, -26, -15, -5, 5, 11, 19, 32, 48, 22, + -46, -67, -36, -12, -2, 4, 12, 17, 18, 4, -33, -50, 6, 6, -35, -31, + 4, 31, 14, 0, -8, -15, -14, -4, 4, 17, 48, 57, 4, -21, -8, -1, + 21, 30, -5, -15, 36, 44, 5, -14, -46, -40, 88, 67, 2, -29, -37, 9, + 31, -6, -9, 14, 15, 13, 11, -40, -74, -58, -24, 9, 22, 13, -6, -21, + -17, -13, -25, -6, 25, 21, -13, -25, 33, 26, -19, -27, -18, -6, 3, 10, + 16, 27, 45, 36, -26, -69, -46, -17, -4, 2, 10, 15, 18, 9, -22, -55, + -11, 15, -26, -36, -8, 30, 23, 2, -6, -14, -14, -6, 4, 11, 37, 59, + 19, -20, -10, -4, 16, 31, 7, -20, 23, 47, 15, -13, -32, -58, 58, 88, + 13, -21, -40, -5, 32, 4, -13, 10, 17, 12, 14, -23, -70, -65, -35, 1, + 20, 17, 0, -18, -20, -12, -23, -16, 19, 25, -1, -30, 16, 39, -8, -26, + -20, -8, 1, 9, 14, 23, 39, 44, -5, -63, -57, -24, -7, 1, 8, 13, + 17, 12, -12, -52, -30, 17, -15, -38, -18, 23, 32, 7, -6, -13, -14, -7, + 3, 8, 27, 55, 33, -16, -13, -6, 10, 30, 17, -20, 10, 46, 25, -9, + -21, -60, 19, 100, 31, -13, -39, -17, 27, 15, -13, 4, 17, 13, 15, -8, + -61, -69, -46, -10, 17, 21, 6, -13, -22, -13, -20, -22, 10, 27, 9, -27, + -4, 44, 6, -24, -22, -11, -1, 8, 13, 20, 33, 46, 14, -50, -65, -33, + -11, 0, 5, 12, 15, 14, -4, -43, -46, 10, -2, -36, -27, 13, 36, 15, + -4, -13, -14, -8, 3, 7, 18, 49, 43, -7, -16, -7, 5, 27, 24, -14, + -3, 42, 33, -3, -16, -51, -17, 97, 51, -3, -38, -5, -13, 1, -7, 5, + -22, -32, -35, -32, -43, -35, -55, -42, -66, -48, -80, -57, -17, -128, -59, -76, + 0, -26, 1, -33, 21, 3, 16, 15, 26, 43, 28, 66, 6, 97, 40, 103, + 67, 101, 102, 98, 94, 21, 98, 90, 57, 78, 89, 81, 61, -6, 54, 4, + 62, 19, 27, 34, 12, 16, 14, -17, 19, -5, -2, -13, -38, -24, -3, -33, + -14, -11, -16, 0, -13, 7, -26, -13, -16, 6, -57, -23, -28, -13, -9, -34, + -32, -20, -87, -62, -28, -38, -75, -37, -27, -41, -71, -48, -30, -44, -83, -67, + -52, -48, -45, -46, -45, -63, -47, -40, -32, -45, -24, -32, -43, -21, -17, 0, + 21, 26, 43, 51, 62, 47, 41, 55, 57, 68, 34, 53, 63, 62, 71, 60, + 61, 56, 53, 56, 54, 38, 50, 58, 50, 40, 28, 54, 39, 41, 38, 22, + 32, 20, -3, 19, -1, -7, -6, -16, -16, -14, -27, -29, -46, -66, -61, -51, + -54, -61, -41, -50, -47, -52, -55, -45, -44, -28, -58, -56, -31, -37, -36, -32, + -18, -16, -34, -29, -9, -21, -20, -30, -22, -17, -19, -8, -12, -14, -6, -14, + -6, -11, -2, 4, -6, 9, 8, 17, 23, 13, 31, 13, 24, 30, 28, 29, + 30, 43, 34, 37, 52, 42, 44, 50, 67, 59, 49, 54, 48, 43, 51, 45, + 42, 62, 47, 39, 37, 36, 24, 28, 13, 3, 9, -11, -3, -9, -14, -18, + -34, -27, -29, -39, -42, -38, -46, -37, -46, -43, -41, -35, -38, -31, -38, -34, + -39, -39, -34, -48, -44, -47, -49, -54, -52, -44, -53, -37, -47, -38, -31, -38, + -27, -19, -19, -15, -16, 0, 0, 2, 7, 13, 29, 22, 32, 32, 39, 47, + 41, 40, 55, 48, 41, 44, 57, 43, 36, 47, 43, 42, 37, 32, 32, 27, + 33, 36, 30, 23, 25, 25, 22, 18, 22, 20, 16, 8, 6, 12, 7, 0, + 1, 3, -5, -14, -9, -7, -8, -19, -15, -16, -23, -21, -21, -32, -31, -29, + -26, -27, -29, -33, -26, -29, -30, -39, -28, -41, -43, -35, -34, -32, -29, -28, + -28, -25, -27, -24, -27, -27, -27, -22, -23, -17, -9, -10, -14, -10, -8, -4, + -2, -1, -3, 5, 4, 10, 11, 7, 13, 11, 14, 27, 22, 22, 22, 27, + 36, 34, 36, 37, 45, 44, 47, 48, 51, 49, 52, 51, 52, 48, 50, 47, + 48, 42, 40, 29, 33, 24, 22, 12, 5, 0, -3, -5, -9, -21, -21, -25, + -19, -28, -28, -30, -33, -39, -42, -42, -46, -46, -45, -42, -43, -47, -47, -36, + -32, -30, -34, -31, -22, -29, -29, -30, -26, -28, -30, -21, -26, -27, -21, -19, + -16, -11, -12, -8, -2, 1, -4, 1, 0, 1, 9, 8, 7, 12, 10, 13, + 20, 17, 18, 21, 26, 29, 30, 30, 29, 34, 33, 34, 33, 30, 32, 33, + 28, 33, 29, 35, 32, 31, 30, 31, 30, 25, 27, 24, 21, 21, 20, 16, + 17, 12, 6, 4, -3, 1, -6, -7, -11, -13, -11, -10, -8, -13, -12, -9, + -17, -14, -19, -24, -22, -24, -30, -32, -30, -33, -37, -39, -40, -42, -39, -41, + -39, -40, -41, -35, -35, -35, -37, -36, -33, -30, -25, -25, -19, -16, -16, -10, + -6, -7, -4, -2, 1, 3, 6, 10, 9, 15, 17, 18, 17, 13, 19, 18, + 17, 19, 20, 24, 24, 27, 27, 29, 30, 26, 28, 28, 27, 28, 26, 25, + 24, 25, 20, 19, 17, 18, 15, 12, 13, 10, 6, 8, 6, 3, 4, 3, + 0, -3, 0, -1, -2, -5, -4, -5, -4, -5, -6, -8, -9, -9, -12, -11, + -16, -16, -15, -15, -13, -17, -16, -17, -17, -21, -20, -25, -24, -24, -24, -26, + -30, -30, -27, -30, -26, -26, -27, -27, -25, -24, -19, -20, -17, -13, -12, -8, + -8, -8, -6, -5, -2, -1, 0, 3, 8, 10, 12, 16, 18, 24, 25, 25, + 28, 30, 28, 32, 33, 31, 32, 31, 35, 33, 31, 31, 27, 28, 26, 23, + 23, 20, 22, 18, 16, 13, 11, 9, 5, 4, -2, -2, -3, -8, -9, -11, + -12, -13, -15, -15, -15, -15, -15, -14, -12, -12, -13, -13, -8, -11, -10, -12, + -10, -12, -12, -8, -8, -9, -9, -9, -8, -9, -10, -11, -11, -10, -13, -14, + -13, -16, -16, -17, -17, -18, -19, -18, -17, -16, -16, -15, -15, -13, -12, -10, + -12, -10, -9, -8, -6, -6, -3, 0, 0, 1, 2, 2, 3, 4, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14, 15, 15, 15, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 14, 13, 13, 12, 11, 10, + 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -1, -2, -3, -4, -5, + -5, -6, -7, -7, -8, -9, -9, -10, -11, -11, -12, -12, -13, -13, -13, -13, + -14, -14, -14, -15, -15, -15, -15, -15, -15, -16, -16, -16, -15, -15, -15, -14, + -13, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -2, -1, 0, 1, 2, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, + 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 16, 16, 15, 15, + 14, 14, 13, 12, 11, 10, 9, 7, 6, 5, 3, 1, 0, -2, -4, -5, + -7, -9, -10, -11, -13, -14, -15, -15, -16, -17, -17, -18, -18, -18, -18, -18, + -18, -18, -18, -18, -18, -18, -18, -17, -17, -16, -16, -15, -14, -14, -13, -12, + -11, -10, -9, -8, -7, -6, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 13, 14, 14, 14, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 12, 12, + 11, 10, 9, 8, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, 0, + 0, -1, 2, 1, 0, 1, 4, 2, 2, 2, 5, 2, 5, 5, 8, 4, + 13, 15, 19, -62, -65, 56, -18, -128, -39, 15, -57, -10, 19, -22, -11, 36, + 30, 5, 19, 25, 17, 21, 21, 16, 21, 18, 17, 17, 15, 14, 13, 12, + 10, 6, 8, 6, 6, -1, 1, -4, 7, -10, -36, 35, 64, -25, -18, 83, + 50, 22, 39, 21, 19, -4, -20, 28, 0, -88, -55, -5, -55, -83, -64, -58, + -77, -61, -22, -39, -57, -15, 2, -14, -9, -1, 1, 1, 2, 9, 5, 6, + 11, 9, 9, 10, 11, 12, 12, 10, 9, 9, 13, 7, 3, 14, 4, -3, + 2, 2, 17, 40, 12, 14, 55, 58, 44, 39, 38, 37, 6, 4, 31, -6, + -50, -25, -15, -49, -52, -41, -60, -68, -32, -25, -47, -36, -9, -5, -7, -3, + 3, 4, 6, 8, 11, 9, 10, 14, 14, 11, 13, 15, 14, 13, 14, 12, + 11, 12, 12, 8, 8, 3, 4, 5, -1, 8, 32, 21, 14, 43, 50, 39, + 47, 39, 20, 23, 16, 5, -9, -23, -26, -34, -48, -37, -48, -71, -56, -34, + -43, -49, -36, -20, -14, -13, -9, -4, -1, 1, 3, 6, 6, 6, 9, 10, + 8, 10, 11, 11, 11, 11, 10, 10, 10, 10, 6, 6, 4, 3, 6, -3, + 2, 25, 23, 16, 34, 38, 43, 51, 31, 19, 38, 22, -10, -7, 0, -25, + -45, -34, -32, -54, -62, -47, -39, -45, -47, -36, -24, -19, -16, -11, -6, -3, + 0, 2, 4, 6, 7, 8, 10, 11, 9, 11, 12, 11, 11, 12, 11, 10, + 10, 8, 7, 6, 3, 5, 4, 0, 13, 28, 23, 19, 36, 50, 42, 30, + 31, 39, 24, -6, -2, 7, -21, -40, -27, -34, -51, -51, -44, -42, -45, -45, + -37, -27, -22, -18, -13, -9, -6, -2, 1, 2, 5, 7, 7, 9, 11, 10, + 10, 12, 12, 11, 12, 11, 10, 10, 9, 7, 7, 4, 5, 7, 1, 7, + 27, 24, 15, 34, 47, 37, 32, 36, 36, 26, 4, -1, 4, -13, -30, -27, + -34, -47, -46, -42, -43, -45, -44, -38, -31, -25, -21, -17, -12, -8, -5, -1, + 1, 3, 5, 6, 8, 9, 10, 10, 10, 11, 11, 11, 11, 11, 10, 9, + 7, 7, 6, 3, 6, 5, 6, 17, 23, 19, 29, 40, 35, 33, 36, 34, + 26, 14, 3, 0, -6, -18, -26, -32, -39, -40, -38, -39, -41, -40, -36, -31, + -27, -23, -19, -15, -12, -8, -4, -2, 0, 3, 4, 5, 7, 8, 9, 9, + 9, 10, 10, 10, 10, 10, 9, 8, 8, 8, 7, 8, 10, 11, 14, 19, + 22, 25, 28, 29, 29, 29, 27, 21, 14, 7, -1, -5, -11, -19, -26, -29, + -31, -32, -33, -34, -33, -32, -29, -26, -24, -21, -18, -15, -12, -9, -6, -4, + -2, 0, 2, 3, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 10, 10, 11, 12, 14, 16, 18, 20, 22, 23, 24, 24, 23, 20, 17, 12, + 7, 2, -3, -8, -13, -17, -21, -23, -25, -26, -27, -27, -27, -26, -25, -23, + -21, -19, -17, -14, -12, -9, -7, -5, -3, -1, 1, 2, 4, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 15, 16, 18, 19, 21, + 22, 22, 22, 21, 19, 17, 13, 9, 4, 0, -5, -10, -14, -18, -21, -23, + -25, -26, -26, -26, -26, -25, -23, -22, -20, -18, -15, -13, -11, -9, -6, -4, + -2, 0, 1, 3, 4, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 11, + 12, 13, 14, 15, 17, 18, 20, 21, 21, 21, 21, 19, 17, 14, 11, 7, + 2, -3, -7, -11, -15, -19, -21, -23, -25, -25, -26, -25, -25, -24, -22, -21, + -19, -17, -15, -12, -10, -8, -6, -4, -2, 0, 1, 3, 4, 5, 6, 6, + 7, 8, 8, 9, 9, 10, 11, 11, 12, 13, 15, 16, 17, 19, 20, 20, + 21, 20, 19, 18, 15, 12, 8, 4, 0, -4, -9, -13, -16, -19, -21, -23, + -24, -25, -25, -25, -24, -23, -21, -20, -18, -16, -14, -12, -9, -7, -5, -3, + -2, 0, 1, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, + 13, 14, 15, 17, 18, 19, 20, 20, 20, 19, 18, 16, 13, 10, 6, 2, + -2, -6, -10, -13, -16, -19, -21, -23, -24, -24, -24, -24, -23, -22, -20, -19, + -17, -15, -13, -11, -8, -6, -5, -3, -1, 0, 2, 3, 4, 5, 6, 7, + 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, + 19, 18, 16, 14, 11, 8, 4, 0, -3, -7, -11, -14, -17, -19, -21, -22, + -23, -23, -23, -23, -22, -21, -19, -18, -16, -14, -12, -10, -8, -6, -4, -2, + -1, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 12, 13, + 14, 15, 16, 17, 18, 19, 19, 19, 18, 17, 15, 12, 9, 6, 3, -1, + -5, -9, -12, -15, -17, -19, -21, -22, -23, -23, -23, -22, -21, -20, -18, -17, + -15, -13, -11, -9, -7, -6, -4, -2, -1, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 18, 18, 17, + 16, 14, 12, 10, 7, 4, 0, -3, -6, -9, -12, -15, -17, -18, -20, -20, + -21, -21, -21, -20, -19, -18, -17, -15, -14, -12, -10, -9, -7, -5, -4, -2, + -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, + 15, 15, 16, 16, 16, 16, 16, 15, 14, 12, 11, 8, 6, 3, 0, -3, + -6, -9, -12, 1, -1, 2, -1, 4, 2, 8, 5, 10, -5, 0, 5, 17, + -11, 0, 19, -17, 26, 65, 15, 29, 3, 35, 67, 50, 88, 59, 117, 28, + -6, -16, 29, 63, 62, -40, 59, 22, -95, -49, -55, 19, 36, -15, 26, -117, + 60, 8, -101, -115, 23, 60, -32, -106, -84, -88, -127, -99, -117, -110, -56, -42, + -53, -79, -44, 43, 10, -11, 72, 22, 61, 10, -92, -106, -111, -35, -68, -128, + -67, -36, -118, -97, -96, -4, 75, 70, 113, 36, 73, 115, 37, 6, 79, 97, + 89, -8, -38, -8, -72, -8, -29, -35, 73, 98, 66, 12, 40, 113, 106, 87, + 126, 112, 127, 87, -3, -21, -23, 40, 14, -68, -20, 21, -57, -67, -67, -4, + 69, 53, 90, 17, 36, 78, -7, -54, -2, 32, 21, -71, -109, -89, -124, -103, + -114, -113, -37, -4, -30, -88, -83, 15, 13, -35, 42, 28, 33, 14, -90, -92, + -104, -37, -34, -115, -73, -9, -75, -89, -85, -29, 67, 51, 97, 55, 47, 115, + 46, -9, 42, 90, 96, 26, -36, 11, -43, -25, -6, -37, 59, 104, 88, 31, + 22, 96, 116, 69, 110, 119, 119, 109, 11, -15, -26, 18, 37, -45, -32, 34, + -13, -62, -62, -30, 61, 47, 75, 46, 14, 72, 14, -58, -35, 16, 30, -38, + -109, -78, -109, -116, -102, -123, -57, -2, -11, -58, -95, -18, 22, -41, -3, 36, + 20, 31, -69, -94, -100, -72, -21, -91, -92, -9, -33, -82, -81, -57, 48, 52, + 70, 81, 35, 97, 69, -10, 8, 66, 94, 55, -27, 4, -5, -40, -1, -33, + 30, 102, 101, 61, 19, 70, 121, 72, 77, 123, 112, 121, 36, -13, -21, -10, + 38, -18, -43, 27, 25, -40, -59, -45, 40, 54, 52, 68, 15, 56, 35, -48, + -58, -12, 25, -10, -98, -84, -83, -122, -101, -123, -81, -8, -3, -28, -85, -47, + 20, -28, -39, 23, 18, 31, -38, -99, -92, -97, -35, -66, -102, -26, -3, -60, + -77, -69, 18, 59, 47, 87, 46, 73, 86, 3, -13, 34, 80, 70, -8, -12, + 19, -32, -12, -21, 3, 91, 105, 87, 34, 51, 114, 89, 53, 106, 115, 119, + 65, -10, -13, -25, 20, 4, -45, 9, 44, -8, -49, -51, 14, 61, 39, 68, + 34, 39, 51, -30, -67, -41, 7, 5, -76, -96, -65, -111, -110, -115, -103, -20, + -1, -9, -58, -65, 8, -9, -55, -6, 17, 24, -11, -94, -89, -102, -64, -50, + -101, -51, 6, -30, -66, -71, -12, 59, 40, 72, 67, 58, 91, 24, -21, 6, + 56, 74, 14, -22, 23, -8, -24, -14, -13, 71, 106, 101, 62, 42, 101, 105, + 49, 76, 114, 114, 87, 3, -12, -23, -6, 13, -37, -11, 45, 24, -29, -49, + -8, 57, 40, 53, 54, 32, 56, -6, -65, -61, -21, 6, -52, -101, -65, -85, + -115, -109, -116, -42, 0, -1, -27, -65, -12, 7, -51, -37, 7, 17, 6, -76, + -95, -94, -91, -52, -90, -76, -2, -4, -46, -66, -35, 46, 46, 49, 78, 57, + 85, 50, -17, -13, 26, 64, 34, -22, 9, 18, -22, -14, -18, 42, 103, 105, + 88, 50, 83, 114, 63, 49, 96, 110, 99, 26, -14, -15, -23, 6, -24, -29, + 33, 45, 0, -38, -23, 44, 50, 37, 60, 38, 52, 21, -54, -70, -48, -7, + -31, -95, -78, -63, -104, -108, -117, -69, -4, -1, -5, -47, -30, 13, -33, -58, + -14, 8, 11, -50, -99, -87, -101, -70, -77, -92, -22, 10, -22, -52, -46, 23, + 55, 36, 70, 66, 74, 69, -2, -23, 1, 43, 43, -11, -8, 29, -4, -17, + -16, 18, 91, 105, 102, 71, 72, 112, 83, 40, 70, 101, 102, 50, -10, -10, + -24, -10, -13, -36, 14, 52, 27, -18, -28, 26, 58, 33, 51, 49, 46, 40, + -34, -70, -66, -31, -22, -81, -92, -56, -83, -105, -112, -91, -17, 0, 2, -22, + -37, 7, -12, -61, -39, -5, 7, -27, -93, -90, -96, -90, -72, -95, -48, 9, + -1, -33, -46, 0, 55, 37, 50, 72, 68, 77, 20, -25, -15, 17, 40, 3, + -20, 22, 19, -12, -14, 2, 70, 105, 106, 92, 72, 104, 100, 48, 46, 83, + 98, 70, 3, -12, -16, -23, -11, -34, -8, 46, 47, 11, -21, 8, 57, 41, + 36, 53, 45, 48, -6, -64, -72, -57, -28, -61, -98, -65, -60, -94, -105, -103, + -41, 1, 0, -1, -29, -6, 5, -48, -60, -26, -3, -12, -74, -97, -86, -100, + -80, -89, -74, -6, 13, -10, -35, -18, 41, 48, 33, 64, 68, 75, 46, -15, + -25, -7, 24, 16, -20, 4, 33, 5, -11, -5, 43, 98, 105, 105, 85, 93, + 110, 67, 35, 59, 87, 81, 25, -13, -9, -23, -18, -27, -25, 30, 55, 37, + -1, -3, 46, 53, 29, 44, 47, 48, 20, -48, -72, -72, -47, -48, -93, -82, + -51, -73, -96, -102, -66, -6, 0, 5, -10, -16, 10, -26, -66, -49, -20, -10, + -51, -98, -86, -93, -93, -85, -88, -32, 14, 8, -16, -23, 22, 54, 32, 45, + 67, 70, 61, 4, -27, -21, 2, 17, -13, -13, 29, 26, -1, -5, 23, 83, + 104, 106, 100, 90, 110, 87, 40, 38, 68, 80, 45, -6, -9, -14, -24, -23, + -32, 8, 52, 53, 25, 1, 31, 60, 35, 30, 45, 45, 36, -24, -68, -76, + -67, -49, -80, -94, -57, -54, -81, -95, -82, -23, 2, 1, 4, -12, 4, -5, + -57, -65, -40, -20, -36, -87, -94, -83, -97, -87, -90, -57, 2, 18, 2, -12, + 8, 10, -20, 30, 25, 21, 14, 4, 15, -48, -33, 11, -70, 54, -5, -21, + -8, -3, 73, -52, 65, -55, 80, -28, -67, -3, -13, 21, -49, -2, 11, 36, + 59, -60, 34, -28, 21, -25, -45, 54, 5, 0, -19, -12, 20, 54, -51, -23, + 22, 36, -59, -20, 8, 28, -9, -54, 127, -44, 69, -128, 5, 69, -8, -98, + 45, 69, 20, -97, 23, -7, 121, -81, -2, -21, 51, -67, -14, -24, 127, -60, + 45, -116, 127, -29, -93, -23, 107, -5, -21, -62, 37, 41, 29, -74, -63, 103, + 24, -59, -44, 62, 43, -28, -46, 7, 72, 19, -70, -47, 42, 53, -68, -13, + 37, 59, -38, -60, 39, 66, 27, -128, 36, 77, 15, -74, -15, 75, 38, -49, + -11, -39, 16, -8, -30, 35, 41, -1, -2, 17, -68, 99, -97, 60, -49, 32, + -44, -29, 82, -26, 39, -35, 10, 38, -20, -21, -92, 83, -24, 13, 31, -33, + 22, 45, -31, -24, 9, -24, -32, 42, -17, 34, 7, -27, 6, 61, -9, -34, + -5, -8, -17, -6, -34, 17, 43, -9, 35, -34, 16, 27, -24, -17, -17, 5, + -17, 42, -31, 22, 17, -26, -22, 32, 41, -27, -25, -10, -5, 16, -2, 13, + -1, 48, -33, -27, 6, 16, 13, -37, -11, 18, 25, -42, -11, 46, -7, -15, + 9, 15, 4, -3, -36, -24, 31, -8, 14, 12, 27, -19, -17, -14, -7, 42, + -5, -15, 5, 1, -15, 14, 43, -19, 1, -25, -35, 16, 16, 29, -12, 8, + -14, 1, 21, -8, -12, -22, -4, 24, 26, -16, -22, 37, 3, -41, 7, 4, + 3, 30, 4, -27, 11, -6, -26, 33, 23, -23, -14, -20, -7, -4, 36, 0, + 18, 10, -27, 1, 1, 16, -1, -4, -44, -5, 17, 9, 13, -4, -3, 31, + 24, -14, -26, 9, -27, -28, 19, 22, 32, -11, -15, 5, 15, -23, -21, 16, + 14, 18, -11, -26, 13, 10, -12, -12, 11, 14, -6, -13, -3, 6, -6, 3, + 12, 32, 14, -22, -45, -10, 37, 11, -50, -11, 50, 22, -13, -4, -4, 15, + -16, -33, 7, 34, -9, -14, -1, 21, 15, -14, -12, -6, 7, 8, 2, 0, + -5, 6, 15, 4, -9, 13, 3, -51, -18, 27, 10, 5, -11, 6, -1, 5, + 22, 2, -14, -39, -12, 19, 17, 4, 11, 5, -25, 2, 23, 8, 2, -3, + -39, -22, 4, 18, 6, 14, 25, 20, -17, -20, 17, 7, -43, -38, -18, 17, + 24, -6, 30, 44, 6, -36, -20, 7, 24, 1, -69, -25, 47, 15, -4, 35, + 19, -18, -22, -12, 20, 39, -36, -49, 9, 28, -16, 9, 34, 36, -22, -69, + -16, 39, 7, -28, -3, 33, -18, -7, 18, 53, 24, -37, -61, -10, 38, 2, + -24, -11, 12, 17, 0, 28, 50, -5, -59, -57, 22, 14, -15, -5, 22, 9, + -20, 19, 33, 31, -33, -62, -13, -2, 45, -9, -4, -3, 19, 8, -8, 40, + 8, -16, -44, -19, 16, 3, 23, -32, 22, 5, -9, 5, 26, 21, -27, -18, + -45, 3, 15, 0, 7, 7, 7, 13, 18, -10, 3, -5, -30, -30, -3, 9, + 31, 17, -10, 19, 28, -33, -20, 31, 14, -67, -27, 13, 20, 29, 1, -2, + 24, -3, -26, -12, 32, -7, -31, -17, 5, 22, 11, -6, 6, 7, 2, 7, + 5, -12, -22, -17, -24, 22, 47, 1, 2, 10, 5, -29, -5, 13, 1, -30, + -28, -5, 23, 25, 6, 5, 1, 7, 0, 5, 3, -33, -37, -6, 19, 20, + 26, -1, -15, 21, 9, -14, -13, 0, -11, -24, -9, 9, 23, 1, 1, 32, + 11, -25, -18, 5, -5, -6, -9, -10, 2, 18, 4, 12, 6, -2, -8, 2, + 2, -7, 2, -22, -5, 17, 25, 15, -5, -1, -24, -8, -10, -5, 12, 7, + -4, -10, 4, 8, 22, 11, -1, -12, -31, -17, 6, 12, 11, 5, -3, -1, + 22, 0, -4, 3, -18, -17, -3, 16, 9, 2, -5, 0, 4, -9, 18, 17, + -22, -19, -8, -6, 21, 11, -6, -16, 33, 13, -15, -3, -15, 1, -3, -10, + -7, 8, 17, -11, 9, 19, 0, 5, 0, -18, -13, 2, -20, 10, 29, -11, + -13, 5, 11, 16, 4, -25, -21, 13, -5, 1, 3, -1, 6, 13, -7, -1, + 17, -6, -6, -9, -6, -3, -1, 1, 18, 11, -22, 2, 18, -2, -15, 1, + 5, -12, -10, -7, 9, 26, 10, -11, 5, 0, -7, -3, -11, -9, -3, 2, + -10, 19, 28, -3, -3, -4, 9, -14, -5, -7, 8, -3, -27, 5, 37, 11, + -2, 3, -27, -15, 12, -2, 14, 2, -8, -16, 22, 11, -1, 10, -17, -8, + -5, -23, 2, 29, 8, -21, 8, 12, 6, 8, -17, 3, -2, -12, -27, 16, + 25, -5, -7, 2, 19, 1, -15, 7, 2, -5, -34, 2, 18, 17, -10, 2, + 18, -1, -12, -10, 5, 1, -16, -9, 12, 21, 4, -10, 2, 12, 1, -19, + -11, 20, 5, -14, -21, 5, 17, -5, 3, 17, 4, -25, -5, 5, 4, 0, + -5, 2, 2, -1, 1, 13, 0, -11, -8, 3, 2, -1, -3, -3, 11, 8, + -6, 2, 7, 4, -5, -23, -2, 14, -1, -15, -2, 15, 10, 1, -4, 16, + 1, -24, -12, 8, 8, -20, -2, 14, 13, 10, 2, 2, -9, -6, -9, -3, + 5, 7, -3, -9, 0, 2, 8, 3, -1, 2, -4, 0, -1, -1, -1, -2, + -8, -14, -19, -28, -51, -53, -49, -48, -49, -44, -37, -30, -23, -14, -8, -11, + -5, 3, 11, 2, 0, 8, 19, 10, 1, 6, 18, 15, 4, 4, 17, 19, + 13, 9, 20, 27, 26, 26, 33, 42, 45, 53, 59, 68, 69, 83, 89, 92, + 85, 88, 91, 80, 56, 37, 29, 9, -25, -54, -65, -74, -94, -113, -112, -103, + -101, -103, -93, -79, -66, -62, -50, -41, -33, -27, -17, -11, -12, -8, 0, 7, + -1, -2, 5, 15, 8, -1, 3, 15, 13, 2, 2, 12, 17, 12, 8, 15, + 23, 24, 25, 29, 38, 42, 50, 56, 65, 68, 78, 87, 91, 87, 87, 91, + 84, 64, 43, 33, 16, -14, -44, -60, -70, -87, -107, -111, -105, -101, -103, -96, + -84, -70, -64, -55, -45, -36, -30, -22, -14, -14, -11, -4, 4, 0, -3, 1, + 11, 8, -1, 0, 10, 12, 3, 0, 9, 15, 11, 7, 14, 22, 23, 24, + 28, 37, 42, 49, 55, 64, 67, 78, 87, 91, 88, 88, 93, 86, 67, 47, + 36, 20, -10, -40, -56, -67, -84, -104, -109, -105, -101, -103, -96, -85, -71, -65, + -56, -46, -38, -31, -23, -16, -15, -12, -6, 2, -1, -5, 0, 9, 6, -1, + -1, 8, 11, 3, 0, 8, 14, 11, 7, 13, 21, 23, 23, 27, 37, 41, + 48, 54, 63, 67, 77, 86, 91, 89, 89, 93, 87, 70, 51, 39, 23, -6, + -36, -53, -64, -81, -101, -107, -103, -100, -102, -96, -85, -72, -66, -57, -47, -39, + -32, -25, -17, -16, -13, -7, 0, -3, -5, -1, 7, 6, -2, -2, 7, 9, + 2, -1, 7, 13, 10, 7, 12, 20, 22, 23, 27, 36, 41, 48, 54, 63, + 68, 77, 87, 91, 91, 91, 95, 89, 73, 54, 43, 27, -1, -31, -49, -61, + -78, -98, -105, -102, -99, -101, -96, -85, -73, -66, -58, -48, -40, -33, -26, -19, + -17, -14, -9, -2, -4, -6, -3, 5, 4, -3, -3, 5, 8, 1, -1, 6, + 12, 10, 7, 11, 20, 22, 23, 27, 35, 41, 47, 54, 62, 68, 76, 86, + 91, 91, 92, 96, 91, 76, 58, 46, 30, 3, -27, -45, -57, -75, -94, -103, + -100, -98, -100, -96, -85, -74, -67, -59, -49, -41, -34, -28, -20, -19, -15, -10, + -3, -5, -7, -4, 3, 3, -4, -4, 4, 7, 1, -2, 5, 11, 9, 6, + 11, 19, 21, 22, 26, 35, 40, 46, 53, 61, 67, 76, 86, 91, 92, 93, + 97, 93, 78, 61, 49, 33, 7, -22, -41, -54, -72, -91, -100, -99, -97, -100, + -96, -86, -74, -67, -60, -51, -42, -35, -29, -22, -20, -17, -11, -5, -6, -8, + -5, 2, 1, -5, -5, 2, 5, 0, -3, 3, 10, 8, 5, 10, 18, 21, + 21, 25, 34, 39, 45, 52, 61, 67, 75, 85, 91, 92, 94, 97, 94, 81, + 64, 52, 37, 11, -18, -37, -51, -69, -88, -98, -98, -96, -99, -95, -86, -75, + -68, -61, -52, -44, -36, -30, -23, -21, -17, -13, -6, -7, -9, -6, 0, 0, + -5, -5, 1, 4, -1, -3, 2, 8, 8, 5, 10, 17, 20, 21, 25, 33, + 39, 45, 51, 60, 66, 75, 85, 91, 93, 94, 98, 95, 83, 67, 55, 40, + 15, -14, -33, -48, -66, -85, -96, -96, -95, -98, -95, -86, -75, -69, -62, -53, + -45, -38, -32, -25, -22, -19, -14, -8, -9, -10, -8, -2, -1, -6, -7, -1, + 2, -2, -4, 1, 7, 6, 5, 8, 16, 19, 20, 24, 32, 38, 44, 50, + 59, 66, 74, 84, 91, 93, 95, 99, 97, 85, 70, 58, 43, 18, -10, -30, + -45, -63, -82, -93, -95, -94, -97, -95, -87, -76, -70, -63, -54, -46, -39, -33, + -26, -23, -20, -16, -10, -10, -12, -9, -3, -3, -7, -8, -2, 1, -2, -5, + 0, 6, 6, 4, 8, 15, 18, 20, 23, 31, 37, 43, 50, 58, 65, 74, + 83, 91, 93, 96, 100, 98, 87, 72, 61, 46, 22, -6, -27, -42, -60, -79, + -91, -94, -93, -97, -95, -87, -77, -70, -64, -55, -47, -40, -34, -28, -25, -22, + -17, -12, -11, -13, -11, -5, -4, -8, -9, -3, 0, -4, -6, -1, 5, 5, + 3, 7, 14, 18, 19, 23, 30, 36, 42, 49, 57, 65, 73, 83, 90, 94, + 96, 100, 99, 89, 75, 63, 49, 25, -2, -23, -38, -56, -76, -88, -92, -92, + -95, -94, -87, -77, -71, -65, -57, -48, -41, -36, -29, -26, -23, -19, -13, -12, + -14, -12, -7, -6, -9, -10, -5, -1, -4, -7, -2, 2, 5, 4, 6, 12, + 18, 20, 24, 30, 38, 45, 52, 61, 70, 79, 89, 99, 106, 109, 113, 115, + 109, 96, 81, 66, 44, 16, -12, -32, -52, -74, -92, -101, -104, -107, -108, -103, + -94, -85, -78, -70, -60, -52, -45, -38, -33, -29, -25, -19, -16, -17, -16, -12, + -9, -10, -12, -9, -5, -5, -7, -5, 0, 3, 3, 5, 11, 17, 20, 23, + 29, 37, 44, 51, 59, 69, 78, 88, 98, 105, 110, 114, 116, 110, 98, 84, + 69, 48, 20, -7, -29, -49, -71, -89, -99, -102, -105, -107, -103, -94, -86, -79, + -71, -62, -54, -47, -40, -34, -30, -26, -21, -18, -18, -17, -14, -10, -12, -14, + -11, -5, -10, 43, -94, 44, -13, 27, -98, 1, 9, 77, 63, 4, 8, -128, + 63, -73, 78, -116, 127, -14, 111, -87, -67, -43, -45, 38, 53, 99, -37, 14, + -51, -58, -23, -32, 34, 27, 75, 9, 51, -104, -71, -33, 27, 67, 0, -1, + 25, 0, -35, 1, -70, 28, -4, 109, 3, 5, -42, -7, 42, -15, 37, -62, + 67, -14, 48, -85, -46, -94, 37, 35, 23, 15, -79, 35, -50, 91, -64, 40, + -69, 46, 20, 43, -21, -51, 8, -1, 95, -47, 69, -104, 98, -44, 74, -61, + -14, -19, 7, 52, -40, 8, -89, 58, -53, 106, -106, 42, -82, 61, -1, -8, + -10, -59, 53, -18, 85, -83, 63, -73, 89, -32, 50, -62, 10, 13, 20, 62, + -81, 41, -84, 88, -32, 41, -78, 27, -30, 51, -6, -42, 6, -49, 74, -41, + 41, -89, 27, -33, 57, 0, -16, -8, -4, 45, 8, 20, -63, 36, -29, 75, + -23, -17, -23, -14, 45, -7, 17, -56, 20, -12, 45, -16, -13, -31, 6, 31, + -7, 17, -81, 40, -35, 73, -34, 0, -31, 10, 35, -4, 19, -60, 44, -30, + 83, -66, 41, -87, 59, -6, 23, -4, -59, 34, -33, 77, -70, 49, -89, 88, + -45, 63, -62, 4, -20, 18, 46, -49, 45, -101, 91, -56, 78, -79, 35, -51, + 67, -12, -2, -14, -49, 66, -35, 72, -87, 51, -74, 83, -38, 29, -36, -10, + 23, 3, 30, -59, 27, -59, 91, -44, 41, -63, 12, 2, 23, 8, -36, 14, + -35, 66, -38, 32, -59, 25, -11, 40, -6, -25, -2, -24, 55, -25, 29, -58, + 30, -17, 41, -18, -17, -3, -13, 50, -25, 26, -63, 35, -23, 50, -22, -5, + -18, 0, 33, -19, 22, -67, 57, -39, 63, -45, 6, -27, 13, 23, -6, 15, + -55, 44, -42, 70, -59, 36, -60, 56, -13, 15, -9, -50, 49, -38, 72, -63, + 37, -65, 67, -48, 55, -51, 10, 2, -5, 45, -61, 46, -83, 91, -58, 72, + -69, 23, -27, 35, -8, -3, -2, -33, 66, -61, 79, -100, 67, -60, 66, -26, + 13, -21, -13, 23, -11, 29, -49, 40, -53, 80, -67, 52, -63, 28, 6, -1, + 23, -45, 25, -30, 42, -25, 22, -42, 33, -26, 39, -26, -9, 10, -28, 61, + -50, 33, -43, 18, 2, 6, 4, -18, 4, -8, 24, -21, 22, -49, 50, -40, + 52, -35, -10, 17, -34, 64, -53, 38, -47, 37, -28, 40, -47, 33, -32, 28, + 3, -20, 30, -69, 79, -75, 88, -72, 39, -34, 22, -7, 9, -18, 1, 19, + -27, 58, -89, 81, -90, 89, -58, 42, -27, -5, 16, -21, 29, -34, 28, -37, + 59, -65, 72, -90, 69, -45, 31, 6, -36, 40, -53, 56, -47, 39, -42, 40, + -38, 50, -52, 34, -31, 7, 32, -47, 62, -79, 66, -51, 41, -27, 12, -10, + 12, -5, 3, -5, -18, 33, -44, 70, -75, 60, -52, 27, 4, -19, 22, -29, + 27, -15, 18, -31, 26, -36, 50, -41, 35, -31, 3, 19, -37, 55, -62, 51, + -38, 25, -11, 1, -13, 12, -7, 13, 4, -33, 38, -56, 72, -64, 52, -43, + 20, 6, -20, 25, -40, 34, -25, 38, -41, 43, -68, 68, -59, 53, -28, -7, + 27, -45, 63, -70, 56, -60, 59, -41, 48, -56, 39, -43, 35, -3, -19, 40, + -70, 85, -81, 76, -75, 48, -36, 41, -20, 12, -23, 0, 16, -23, 51, -76, + 78, -82, 80, -57, 29, -23, 3, 14, -2, 9, -29, 17, -31, 55, -51, 53, + -66, 49, -27, 17, 3, -35, 36, -33, 44, -27, 11, -30, 24, -18, 37, -29, + 4, -3, -15, 45, -47, 42, -57, 46, -19, 18, -11, -20, 10, -3, 24, -18, + 14, -46, 52, -50, 64, -57, 25, -14, 1, 33, -42, 30, -52, 50, -28, 47, + -54, 32, -49, 53, -25, 14, -4, -34, 57, -54, 69, -78, 46, -45, 52, -21, + 21, -37, 7, 1, 3, 29, -57, 56, -74, 90, -66, 47, -51, 16, 6, 10, + 10, -29, 9, -32, 58, -47, 59, -84, 65, -49, 52, -24, -18, 14, -30, 61, + -39, 31, -57, 39, -38, 67, -56, 37, -46, 26, 10, -15, 18, -49, 45, -27, + 42, -37, 11, -24, 30, -15, 21, -34, 15, -5, 11, 5, -24, 11, -16, 30, + -16, 6, -20, 7, 3, 11, -9, -5, -6, 4, 16, -15, 9, -29, 22, -6, + 14, -6, -16, 9, -12, 28, -22, 15, -27, 22, -11, 21, -23, 5, -10, 8, + 17, -22, 19, -42, 41, -31, 39, -37, 20, -20, 19, -3, -7, 2, -17, 27, + -20, 30, -43, 30, -34, 38, -24, 13, -13, -1, 16, -16, 19, -36, 28, -21, + 30, -22, 7, -17, 11, 2, 1, 1, -19, 22, -21, 32, -34, 18, -21, 17, + 6, -8, 5, -25, 21, -13, 24, -24, 12, -22, 24, -11, 10, -14, -7, 15, + -11, 28, -36, 21, -30, 30, -10, 10, -13, -5, 6, -2, 14, -22, 15, -25, + 33, -22, 23, -31, 11, -6, 8, 11, -21, 14, -28, 32, -23, 25, -31, 19, + -15, 19, -7, -7, 1, -13, 26, -19, 24, -37, 25, -24, 30, -18, 6, -9, + -2, 17, -16, 17, -34, 27, -19, 28, -21, 6, -15, 10, 4, 0, 2, -20, + 22, -19, -21, 0, -3, -3, 2, 1, -1, 2, -2, -1, 4, 3, -3, -15, + -21, -20, -23, -42, -45, -31, -27, -17, -8, 9, 29, 41, 44, 33, 20, 13, + 6, 12, 16, 25, 43, 44, 33, 33, 35, 15, -5, -3, 8, 16, 8, -10, + -6, 8, 4, -4, 1, -18, -38, -43, -51, -54, -55, -71, -85, -68, -58, -61, + -50, -33, -27, -15, -5, 22, 67, 100, 109, 114, 110, 91, 69, 50, 37, 35, + 46, 48, 37, 36, 14, -24, -38, -42, -38, -38, -59, -91, -86, -57, -44, -32, + -15, -26, -44, -30, -30, -30, -16, -31, -50, -34, -43, -59, -49, -44, -52, -62, + -69, -50, -4, 47, 83, 105, 120, 111, 88, 72, 55, 57, 76, 69, 59, 55, + 41, 10, -18, -32, -28, -19, -36, -68, -76, -72, -71, -46, -35, -47, -43, -43, + -61, -48, -28, -25, -22, -19, -23, -15, -7, 3, 4, -8, -28, -37, -5, 42, + 72, 107, 127, 122, 117, 90, 48, 37, 48, 51, 54, 56, 43, 24, -8, -37, + -33, -11, -28, -55, -61, -75, -75, -51, -58, -55, -33, -33, -41, -35, -30, -21, + -16, -17, -24, -26, -20, -18, -17, -12, -36, -72, -65, -45, -6, 53, 88, 106, + 119, 107, 71, 52, 50, 59, 75, 87, 85, 76, 43, -1, -7, 9, -1, -13, + -34, -69, -80, -74, -80, -73, -65, -67, -65, -56, -44, -33, -23, -18, -24, -25, + -16, -20, -9, -1, -21, -38, -55, -64, -40, 3, 39, 82, 113, 114, 95, 71, + 54, 56, 68, 76, 87, 94, 57, 10, -9, -17, -17, -15, -35, -60, -75, -89, + -92, -85, -76, -71, -74, -70, -53, -41, -20, -9, -9, 4, 4, 10, 33, 38, + 25, 15, -17, -43, -33, -15, 3, 40, 77, 94, 91, 69, 37, 31, 33, 37, + 68, 96, 82, 53, 25, 8, 22, 28, 9, -9, -27, -46, -56, -65, -62, -61, + -60, -51, -51, -39, -25, -23, -11, -3, -15, -10, 5, 12, 20, 18, -11, -41, + -52, -47, -34, -2, 33, 65, 82, 70, 51, 45, 28, 21, 49, 74, 86, 74, + 33, 5, 10, 14, 7, -10, -28, -45, -67, -68, -73, -76, -66, -66, -65, -46, + -39, -31, -9, -3, -6, 1, 8, 22, 41, 49, 33, 8, -16, -34, -30, -17, + 7, 49, 73, 64, 63, 50, 19, 5, 13, 32, 62, 65, 37, 8, -5, 4, + -1, -8, -15, -36, -50, -57, -71, -65, -53, -58, -49, -37, -40, -28, -10, -3, + 0, 2, -2, 5, 30, 41, 36, 22, -7, -33, -39, -46, -30, 15, 44, 56, + 72, 65, 44, 21, 2, 15, 42, 59, 49, 18, 2, -3, -4, 0, -10, -25, + -34, -52, -65, -59, -56, -50, -37, -33, -33, -25, -12, -2, 10, 12, 3, 6, + 27, 42, 52, 43, 16, -3, -24, -48, -41, -11, 16, 48, 67, 78, 75, 49, + 21, 13, 36, 64, 63, 47, 25, -1, -2, 2, -12, -18, -28, -53, -65, -71, + -76, -70, -55, -53, -49, -41, -35, -24, -1, 5, 1, 4, 8, 28, 51, 43, + 26, 18, -14, -42, -51, -49, -23, 5, 31, 55, 67, 58, 26, -2, 11, 35, + 49, 55, 35, 8, 3, -2, -5, -6, -13, -30, -38, -49, -61, -56, -45, -43, + -36, -31, -37, -25, -7, 1, 6, 1, -10, 11, 33, 29, 27, 17, -6, -34, + -58, -67, -57, -34, -4, 21, 50, 63, 37, 11, 8, 17, 45, 63, 55, 39, + 26, 12, 11, 10, -1, -11, -19, -35, -51, -52, -52, -45, -35, -36, -41, -31, + -24, -9, 9, -3, -12, 2, 19, 33, 40, 37, 25, -3, -30, -51, -59, -42, + -24, -3, 38, 58, 51, 32, 8, 2, 25, 45, 50, 49, 35, 18, 16, 19, + 10, 9, 4, -13, -27, -36, -45, -36, -24, -32, -29, -31, -33, -10, 6, 1, + -4, -6, 4, 19, 30, 37, 30, 12, -13, -48, -59, -57, -56, -35, 2, 31, + 48, 41, 12, -2, 7, 25, 41, 52, 44, 29, 25, 22, 18, 20, 15, 1, + -6, -26, -38, -28, -26, -21, -17, -31, -33, -19, -4, 0, -8, -16, -15, -11, + 9, 19, 22, 24, -2, -34, -49, -61, -70, -57, -32, 4, 38, 46, 26, 5, + -1, 7, 29, 45, 44, 38, 32, 23, 27, 30, 23, 24, 14, -8, -16, -24, + -24, -12, -10, -19, -27, -26, -9, -2, -4, -6, -16, -14, -2, 8, 23, 34, + 17, -6, -26, -47, -61, -62, -50, -18, 26, 50, 48, 31, 12, 6, 24, 40, + 44, 51, 40, 29, 34, 28, 27, 32, 20, 7, -5, -23, -26, -19, -9, -12, + -25, -25, -17, -8, 1, -4, -13, -12, -16, -9, 13, 26, 23, 8, -13, -37, + -55, -71, -78, -59, -18, 16, 35, 34, 8, -3, 4, 13, 31, 40, 34, 34, + 29, 23, 30, 31, 27, 21, 7, -6, -21, -21, -10, -10, -19, -24, -28, -17, + -6, -8, -9, -9, -19, -21, -5, 12, 23, 22, 5, -16, -34, -55, -80, -78, + -56, -22, 18, 33, 24, 14, 3, 7, 25, 31, 37, 41, 33, 29, 29, 32, + 33, 30, 24, 7, -16, -22, -18, -15, -14, -24, -31, -22, -13, -12, -8, -6, + -18, -27, -22, -6, -5, -1, -1, -1, 1, 2, 7, 13, 19, 10, -12, -31, + -13, 17, 29, -4, -29, 24, 53, 18, 92, 15, -15, 23, 13, -35, -52, 127, + 9, 3, -9, 31, -63, -64, -5, -50, 14, 33, -29, -42, 0, 43, 39, -15, + -59, -45, 3, 33, 12, -35, -10, 51, 18, 49, 55, -28, 16, 4, 3, -64, + 54, 53, -12, 0, 5, -4, -72, -7, -31, -14, 26, -2, -37, -14, 17, 35, + 4, -33, -45, -12, 15, 21, -16, -23, 22, 28, 12, 55, -7, -2, 7, 7, + -34, -10, 65, -4, 1, -5, 14, -46, -28, -9, -29, 13, 13, -23, -23, 4, + 27, 18, -17, -39, -25, 5, 20, 0, -26, 1, 34, 7, 41, 24, -20, 11, + 1, -6, -45, 53, 22, -6, -4, 9, -17, -52, -4, -30, -6, 20, -9, -29, + -8, 18, 27, -2, -33, -36, -6, 16, 13, -20, -16, 27, 19, 18, 49, -17, + 3, 2, 6, -42, 9, 55, -9, 1, -3, 9, -54, -19, -16, -24, 16, 7, + -27, -19, 8, 28, 12, -22, -40, -20, 8, 19, -7, -25, 9, 31, 7, 48, + 9, -14, 9, 2, -17, -35, 62, 9, -2, -6, 13, -30, -44, -4, -31, 2, + 18, -15, -27, -3, 22, 24, -8, -36, -32, -2, 17, 8, -23, -9, 31, 13, + 28, 40, -21, 8, 1, 3, -47, 29, 43, -9, 0, 1, 1, -57, -11, -22, + -17, 19, 2, -28, -14, 12, 29, 7, -27, -39, -14, 11, 17, -13, -22, 17, + 27, 10, 51, -4, -7, 7, 5, -27, -19, 64, -1, 1, -6, 14, -41, -34, + -8, -30, 8, 15, -20, -24, 2, 25, 20, -14, -38, -27, 2, 18, 2, -25, + -1, 33, 9, 37, 29, -21, 11, 0, -3, -46, 46, 29, -7, -2, 7, -9, + -54, -6, -27, -10, 20, -4, -28, -9, 16, 28, 1, -30, -37, -8, 14, 14, + -18, -17, 25, 22, 16, 50, -13, 1, 4, 5, -37, 0, 59, -7, 2, -4, + 12, -49, -24, -13, -26, 13, 11, -23, -19, 6, 27, 15, -19, -39, -21, 6, + 18, -4, -24, 7, 32, 8, 45, 15, -16, 10, 2, -12, -39, 58, 16, -3, + -5, 11, -22, -48, -4, -30, -2, 19, -10, -26, -4, 20, 25, -5, -34, -33, + -4, 16, 10, -21, -11, 30, 16, 25, 43, -19, 7, 1, 4, -44, 20, 49, + -8, 1, -1, 6, -54, -15, -19, -20, 17, 6, -26, -15, 10, 29, 9, -23, + -39, -16, 9, 17, -10, -22, 15, 29, 10, 50, 2, -10, 8, 3, -22, -26, + 63, 5, 0, -6, 14, -34, -39, -6, -30, 4, 17, -15, -24, 0, 24, 22, + -11, -36, -28, 1, 17, 5, -23, -3, 32, 12, 34, 33, -21, 10, 0, 0, + -46, 39, 36, -7, -1, 4, -3, -54, -9, -24, -14, 19, 0, -26, -10, 14, + 28, 4, -27, -37, -11, 12, 15, -15, -18, 22, 24, 14, 50, -9, -2, 5, + 5, -32, -8, 61, -3, 2, -5, 14, -44, -29, -10, -27, 10, 13, -20, -20, + 4, 26, 17, -16, -37, -23, 4, 18, -1, -23, 5, 32, 9, 42, 20, -18, + 11, 1, -7, -41, 53, 22, -4, -3, 9, -14, -50, -6, -27, -7, 19, -6, + -26, -5, 18, 26, -2, -31, -34, -6, 14, 11, -19, -12, 28, 19, 22, 45, + -17, 4, 2, 5, -40, 11, 54, -6, 2, -3, 10, -51, -20, -16, -23, 14, + 9, -23, -15, 8, 28, 12, -20, -38, -18, 7, 17, -7, -22, 13, 30, 10, + 47, 7, -12, 9, 2, -17, -31, 61, 10, 0, -5, 13, -26, -43, -6, -29, + 0, 18, -11, -23, -1, 22, 23, -8, -34, -30, -1, 15, 7, -22, -5, 31, + 14, 30, 37, -20, 9, 0, 2, -44, 30, 42, -7, 1, 2, 2, -53, -12, + -21, -17, 17, 4, -25, -11, 12, 28, 6, -25, -37, -13, 10, 15, -13, -18, + 20, 26, 13, 49, -5, -5, 6, 4, -27, -16, 62, 1, 2, -5, 14, -38, + -34, -9, -28, 6, 15, -16, -20, 3, 25, 19, -13, -36, -25, 2, 16, 1, + -23, 3, 32, 11, 38, 25, -19, 11, 0, -4, -43, 46, 29, -4, -2, 7, + -8, -51, -8, -25, -10, 18, -2, -25, -7, 16, 27, 0, -28, -35, -8, 12, + 12, -17, -13, 26, 21, 19, 46, -14, 2, 3, 4, -36, 2, 57, -4, 3, + -4, 12, -46, -25, -13, -25, 11, 12, -20, -16, 7, 27, 14, -18, -37, -20, + 5, 16, -5, -21, 10, 31, 10, 45, 12, -14, 10, 1, -12, -36, 57, 16, + -1, -4, 11, -20, -46, -6, -28, -4, 18, -8, -23, -3, 20, 24, -5, -32, + -31, -4, 13, 8, -20, -6, 29, 17, 27, 39, -19, 7, 0, 3, -42, 21, + 47, -6, 2, 0, 7, -51, -17, -18, -20, 15, 7, -23, -12, 10, 28, 8, + -22, -37, -15, 8, 15, -10, -19, 18, 27, 13, 47, 0, -8, 8, 3, -24, + -20, 52, -36, -2, 0, -2, 3, 5, -4, -28, 22, -43, 36, -13, -127, -43, + 2, -18, 126, 78, -127, -48, 68, -74, -67, 33, 62, 83, 42, -32, -46, -70, + -26, 115, 21, -66, 72, 52, -27, 44, 50, 50, 61, 28, -12, 3, -59, 49, + 3, -19, 39, 94, 16, 31, 6, 29, 3, -100, -1, -4, -60, 19, 7, -29, + -28, -38, -3, -47, -20, -21, -1, 5, -55, -12, -55, -39, 26, 47, -22, -9, + -41, -21, -19, -37, 0, 45, -56, 24, 75, -50, -9, 31, 28, 26, 13, -3, + -15, -27, 1, 1, -31, -10, 38, -1, 7, 43, 19, 21, 41, 33, 9, -17, + -3, -42, -76, -30, -8, -9, -1, 21, 22, 38, 32, 22, 0, -18, -32, -58, + -12, 5, -48, -13, 64, 29, -2, 2, 19, 43, 25, -19, -39, -69, -92, -15, + 23, 30, 30, 51, 37, 35, 37, 30, -27, -63, 5, -30, -56, -16, 26, 52, + 20, 14, 59, 27, -9, 22, -4, -20, -37, -17, -34, -34, -1, 35, 26, 31, + 5, -16, 4, 33, 22, 8, 5, -28, -41, -20, -10, -6, -2, -16, 12, 31, + -23, 7, -2, -39, -28, -13, 8, 5, 16, -4, -6, -18, -24, -27, -50, -6, + 5, 12, 0, -2, -14, -23, 5, -28, -10, 2, 28, 15, 2, 22, 27, 41, + 31, 2, 12, 31, 5, 12, -6, 15, 40, 34, 18, 26, 26, 12, 34, 23, + 34, 30, 22, 10, -26, -22, 1, 0, -1, 12, -4, -21, -5, -5, -20, -31, + -25, -24, -42, -44, -41, -41, -37, -29, -28, -29, -40, -17, -21, -38, -42, -38, + -40, -36, -13, -14, -8, -15, -7, -6, 5, 12, -1, -17, -1, 9, 2, 16, + 30, 27, 37, 36, 38, 36, 36, 19, 45, 45, 33, 26, 33, 28, 36, 31, + 17, 12, 22, 11, 11, 17, 5, -13, 6, 10, 2, -6, 2, 9, 15, -6, + -8, -23, -44, -3, -11, -35, -25, -35, -23, -21, 0, -11, -21, -17, 11, -6, + -11, -17, -33, -16, -16, -4, -7, -7, -9, -4, 1, 1, -3, 6, 7, 4, + -17, -11, -6, -4, 1, 3, 6, 4, 5, -4, 17, 7, 3, 9, -20, 0, + -7, -3, -5, 4, 9, 16, 2, 3, 8, 15, 15, 1, -3, 8, -1, 5, + 14, 7, 4, 8, -8, 2, -3, 5, 11, 5, 3, -4, 10, 17, 13, -11, + -5, 1, -3, 0, -6, -12, 2, -3, 13, -5, -25, -15, -7, 4, 1, -8, + -4, -12, -16, 3, 9, -6, 3, -21, -4, 4, -14, 1, -1, -2, 3, -8, + -5, 0, 7, -2, -3, -1, 3, -9, 5, -4, -17, -1, 9, 3, 7, 1, + -4, -3, 5, 2, -7, -9, 12, -6, -14, -16, 2, -1, 16, 2, 2, 7, + -6, -26, 3, -2, -4, -2, 10, 3, -7, 3, 8, 9, 5, 4, 1, -5, + -5, 11, 8, 7, 11, 12, -1, -5, -16, 13, 7, 2, 11, 4, -4, 9, + -8, -8, 14, 11, -8, 0, -1, -5, -2, -1, -10, -5, -9, -9, -16, -12, + -8, -16, 5, -10, -4, -11, -3, 1, 0, -3, -5, -13, -9, -2, -8, 5, + -9, -7, -2, 2, -11, -7, 13, 8, -3, 2, 7, -2, -1, 5, 0, 11, + 6, 13, 15, 1, -4, 9, 5, 3, 8, -3, -4, 16, 4, 11, 9, 0, + 8, 1, -6, -5, -18, 3, 7, -18, -4, 0, -3, -3, -6, -4, -5, -5, + -10, -2, -9, -5, -2, -4, -11, -2, 1, -5, -2, 11, -6, -9, 1, 4, + -6, -1, -5, 1, 2, 9, 5, 0, 4, 4, -2, 7, 0, -10, 5, 2, + -3, 0, -6, 7, -4, -3, 6, -1, -6, -1, -1, 2, -2, -6, -3, 0, + 8, -6, 4, -1, -5, -3, 3, 1, -5, -6, -2, -3, 5, 6, 0, 7, + -3, 3, -1, 0, -2, 9, 1, 1, -3, 4, 5, -5, 2, -2, 2, -11, + -2, -4, 11, 4, 5, 0, -5, -12, -6, -5, -5, 3, -2, -2, 2, 2, + 1, 0, -1, -8, -5, -5, -3, 2, -1, 3, -1, 3, 0, -1, 0, -1, + 1, 1, -4, -4, 2, -2, 1, -6, 1, 2, 4, 2, 2, -5, -1, 6, + -3, -1, -4, 11, 3, -9, -2, -6, -3, 2, 4, 2, 1, 2, 4, 3, + -6, -4, -3, -2, 0, 2, -2, 5, 2, -1, 3, -9, -3, -3, -4, -4, + -1, 0, -2, 7, 3, 1, 1, -2, -4, -2, -3, -2, -4, 2, 4, -1, + 2, 3, 0, 3, -1, 0, -2, -2, -3, 1, -1, -4, 5, -1, 5, 0, + -3, -2, -1, -4, 3, -1, -3, -2, -2, -1, 0, 0, 1, -1, 0, -2, + -2, 0, -3, -1, 0, 0, 1, 1, -2, -1, 1, -3, 1, 2, 0, -1, + 0, -1, 1, 5, -2, 1, -3, -3, -1, -3, 0, 1, 3, 2, -1, -1, + -2, -2, -1, 1, 0, -1, -2, -2, -2, -3, -3, -3, -2, -2, -2, -2, + -2, -2, -2, -1, 0, 1, 1, -2, -2, 0, 0, 2, -3, -16, -22, -20, + -28, -35, -31, -17, 19, 33, 36, 33, 34, 40, 36, 25, 18, 20, 18, 14, + 17, 12, 14, 10, -24, -36, -27, -38, -55, -69, -66, -47, -33, -13, 3, 5, + 10, 22, 25, 15, 28, 43, 41, 51, 56, 58, 58, 31, -18, -52, -64, -71, + -92, -105, -98, -77, -50, -17, 23, 59, 85, 99, 94, 76, 55, 14, -9, -5, + -7, -18, -17, -35, -53, -53, -33, -23, -33, -36, -15, 17, 32, 24, 12, 19, + 37, 54, 49, 38, 21, -14, -44, -30, -22, -15, 5, 8, -1, -26, -42, -46, + -49, -51, -37, -17, 1, -4, -19, -4, 45, 84, 91, 79, 57, 3, -30, -29, + -35, -25, -8, -6, -26, -61, -75, -73, -77, -72, -54, -19, 9, 6, -10, 3, + 47, 85, 92, 103, 92, 45, 21, 6, 4, 16, 27, 27, -1, -48, -69, -78, + -80, -84, -72, -33, -10, -24, -41, -20, 40, 82, 99, 123, 102, 69, 49, 30, + 27, 34, 42, 41, -2, -58, -96, -108, -103, -106, -83, -37, -10, -18, -38, -18, + 40, 65, 92, 110, 84, 44, 1, -26, -23, -7, 21, 32, 7, -39, -78, -84, + -79, -82, -61, -19, 5, -14, -52, -25, 25, 59, 102, 127, 116, 86, 40, 13, + 4, 9, 27, 29, 4, -47, -88, -94, -87, -83, -56, -18, 15, -13, -49, -30, + -2, 29, 69, 87, 80, 50, 9, -15, -27, -10, 18, 44, 36, -9, -45, -53, + -53, -46, -33, 6, 31, -8, -36, -28, -11, 21, 54, 76, 76, 44, 4, -33, + -53, -45, -18, 13, 10, -35, -62, -70, -61, -44, -19, 38, 63, 30, 9, 4, + 9, 35, 60, 81, 75, 51, 14, -25, -44, -37, -9, 29, 24, -11, -41, -59, + -51, -54, -33, 23, 35, 6, -13, -28, -18, 8, 43, 73, 76, 63, 33, -1, + -21, -22, 10, 43, 35, 5, -32, -47, -51, -68, -44, 6, 14, 0, -21, -34, + -25, 0, 37, 65, 73, 64, 35, 5, -22, -25, 11, 40, 39, 13, -20, -28, + -42, -64, -32, 6, 15, -1, -25, -39, -39, -16, 19, 44, 58, 53, 27, -2, + -39, -38, -2, 30, 40, 13, -16, -19, -45, -60, -29, 6, 17, 1, -21, -40, + -44, -24, 9, 38, 58, 51, 38, 8, -31, -29, 0, 34, 44, 9, -11, -23, + -58, -69, -42, -6, 9, 0, -16, -33, -36, -12, 19, 55, 72, 68, 58, 18, + -22, -25, -6, 29, 31, 2, -5, -23, -57, -69, -45, -8, 12, 10, 0, -22, + -24, -7, 20, 52, 61, 65, 59, 21, -15, -28, -11, 26, 20, 2, -2, -22, + -56, -71, -49, -14, 3, 8, -5, -26, -28, -19, 14, 42, 54, 71, 67, 38, + 8, -11, 16, 47, 37, 26, 18, -10, -51, -74, -59, -35, -19, -12, -24, -37, + -44, -34, 0, 24, 44, 67, 64, 43, 3, -18, 11, 35, 28, 22, 18, -4, + -47, -68, -55, -34, -11, -7, -15, -27, -43, -32, -1, 18, 42, 58, 60, 43, + -8, -29, -6, 11, 7, 4, 4, -17, -59, -75, -66, -41, -13, -3, 1, -11, + -29, -19, 1, 19, 42, 53, 64, 45, -8, -28, -9, 7, 4, 4, 9, -13, + -51, -71, -69, -43, -19, -7, 3, -11, -25, -17, -2, 23, 43, 60, 78, 55, + 1, -19, -5, 8, 3, 7, 13, -8, -41, -66, -67, -40, -19, 3, 16, 1, + -7, -5, 10, 34, 46, 67, 87, 62, 11, -13, -1, 8, 4, 15, 20, 1, + -33, -64, -65, -48, -30, -2, 6, -5, -14, -18, 1, 21, 32, 62, 86, 66, + 20, -3, 6, 7, 5, 16, 20, 7, -29, -62, -65, -59, -39, -13, -5, -8, + -22, -27, -6, 7, 17, 49, 74, 58, 14, -5, -2, -4, -3, 7, 14, 6, + -32, -59, -66, -63, -40, -16, -2, -2, -19, -20, -1, 6, 18, 49, 77, 62, + 21, 3, -1, -5, -2, 5, 18, 10, -26, -50, -65, -64, -43, -24, -5, -6, + -24, -23, -8, -2, 10, 45, 75, 60, 25, 6, -4, -4, -5, 3, 20, 8, + -20, -43, -60, -58, -45, -24, 1, -1, -15, -12, -1, 3, 16, 53, 83, 70, + 42, 19, 9, 7, 3, 16, 29, 17, -7, -35, -55, -56, -49, -24, 2, -1, + -11, -7, 3, 4, 16, 55, 83, 75, 50, 25, 15, 6, 0, 13, 21, 13, + -9, -40, -58, -66, -62, -35, -11, -11, -18, -13, -3, -7, 9, 49, 75, 74, + 51, 28, 19, 5, 1, 13, 20, 16, -3, -28, -48, -62, -61, -37, -16, -13, + -20, -15, -12, -19, -5, 21, 50, 61, 47, 28, 15, -1, -6, 0, 9, 14, + 1, -19, -37, -55, -56, -38, -16, -11, -13, -9, -9, -16, -8, 18, 48, 59, + 44, 28, 9, 15, -3, 2, -5, 3, 3, 4, 1, 7, -2, 7, -4, 2, + -124, -37, 33, -48, 7, -27, 8, -14, 77, 26, -9, 26, 7, 20, 10, 13, + 8, 9, 7, 4, 5, 2, 3, 2, 1, -1, 0, -3, -2, -5, 1, -10, + 11, 70, -6, 21, 5, 27, -2, 41, -15, -61, -66, -128, 0, -48, -21, -46, + -6, -55, 23, 53, -6, 11, 2, 14, 11, 10, 11, 8, 9, 9, 8, 5, + 8, 5, 6, 5, 6, 2, 7, -4, 6, 5, -23, 62, 29, 24, 8, 33, + 4, 32, 36, -30, -16, -124, -58, -39, -18, -51, -3, -43, -40, 53, 19, 12, + 4, 9, 12, 13, 10, 11, 9, 8, 11, 6, 5, 8, 6, 3, 9, 1, + 7, 2, -5, 22, -33, 20, 37, 35, 7, 29, 14, 8, 52, -5, 17, -64, + -84, -70, -15, -55, -23, -12, -72, 1, 28, 16, 8, 6, 7, 12, 10, 8, + 11, 6, 8, 10, 5, 4, 10, 1, 8, 4, 2, 10, -15, 26, -16, -9, + 14, 42, 17, 19, 29, -3, 42, 14, 28, -8, -45, -92, -37, -41, -54, 0, + -53, -48, 2, 18, 10, 8, 4, 8, 12, 8, 10, 10, 6, 9, 10, 2, + 10, 5, 3, 9, -2, 18, -16, 17, 3, -9, -12, 26, 28, 13, 35, 3, + 27, 19, 31, 17, 4, -60, -67, -33, -66, -22, -22, -58, -38, 2, 11, 9, + 7, 4, 9, 10, 8, 10, 9, 5, 12, 5, 5, 9, 2, 11, -5, 21, + -8, 4, 10, 5, -17, -1, 28, 11, 34, 13, 20, 17, 28, 24, 27, -6, + -61, -41, -57, -51, -17, -36, -56, -32, -1, 7, 8, 5, 6, 8, 10, 8, + 12, 6, 9, 9, 5, 9, 1, 15, -7, 15, 5, -2, 4, 14, -3, -18, + 15, 8, 28, 21, 20, 16, 23, 23, 29, 30, -20, -38, -45, -63, -38, -23, + -43, -53, -29, -5, 5, 5, 5, 5, 9, 7, 11, 8, 8, 10, 5, 12, + -2, 16, -1, 4, 11, 4, -3, 8, 15, -16, 0, 1, 16, 23, 23, 17, + 20, 21, 21, 39, 19, -14, -28, -52, -58, -33, -28, -47, -50, -30, -6, 2, + 5, 4, 6, 6, 9, 10, 7, 12, 3, 15, 0, 10, 8, 1, 6, 11, + 2, -4, 20, -1, -6, -5, 4, 15, 24, 20, 18, 23, 15, 30, 38, 13, + -6, -27, -56, -52, -30, -34, -48, -50, -28, -8, 2, 3, 5, 5, 6, 11, + 5, 13, 3, 12, 6, 5, 10, 5, 2, 7, 13, -8, 10, 11, 0, -6, + -4, 3, 17, 23, 16, 24, 18, 17, 36, 32, 13, -1, -30, -57, -45, -31, + -36, -51, -49, -28, -7, -1, 3, 6, 2, 11, 5, 12, 6, 9, 10, 5, + 8, 8, 5, -1, 16, 1, -1, 11, 9, -1, -5, -5, 4, 20, 17, 20, + 24, 14, 23, 37, 29, 16, 2, -33, -53, -42, -30, -39, -52, -49, -27, -9, + -3, 5, 0, 8, 5, 10, 8, 6, 10, 6, 7, 6, 11, -3, 8, 11, + 0, 2, 11, 8, -1, -5, -7, 9, 18, 16, 24, 20, 14, 27, 35, 27, + 21, 1, -33, -50, -38, -32, -42, -53, -48, -25, -14, -1, -2, 4, 3, 6, + 9, 5, 9, 7, 7, 4, 12, 4, 1, 10, 6, 2, 6, 10, 4, 0, + -6, -2, 11, 14, 18, 22, 17, 20, 32, 34, 28, 20, 0, -26, -36, -34, + -37, -45, -54, -44, -30, -13, -8, -3, 1, 2, 6, 4, 7, 8, 8, 2, + 8, 10, 1, 4, 6, 5, 5, 9, 6, 1, -3, -5, 3, 10, 14, 18, + 18, 17, 26, 35, 35, 29, 17, -1, -17, -24, -32, -41, -50, -51, -44, -28, + -18, -12, -5, -2, 2, 3, 3, 6, 9, 4, 3, 9, 6, 2, 2, 4, + 5, 9, 10, 4, -2, -5, -1, 5, 10, 14, 16, 15, 19, 30, 38, 37, + 29, 15, 1, -5, -14, -31, -43, -50, -52, -42, -29, -22, -16, -9, -3, 0, + 0, 2, 6, 6, 2, 4, 7, 6, 2, 1, 2, 6, 11, 10, 2, -5, + -4, 0, 5, 10, 14, 15, 14, 21, 32, 39, 38, 29, 14, 4, 0, -3, + -19, -32, -40, -43, -41, -36, -31, -25, -19, -12, -9, -8, -6, -1, 2, 2, + 0, -3, -4, -1, 3, 6, 6, 2, -3, -6, -2, 2, 2, 1, 2, 7, + 16, 25, 32, 35, 35, 36, 36, 33, 24, 11, -3, -18, -32, -40, -42, -40, + -36, -30, -25, -18, -12, -9, -8, -5, -1, 2, 2, 0, -3, -4, -1, 3, + 7, 6, 2, -4, -5, -2, 2, 2, 1, 2, 8, 17, 25, 32, 35, 36, + 36, 36, 32, 23, 10, -4, -20, -33, -41, -42, -40, -35, -30, -24, -18, -12, + -9, -8, -5, -1, 3, 2, -1, -4, -4, -1, 4, 7, 6, 1, -4, -5, + -2, -1, 3, 1, 3, 5, 3, -3, -1, -1, 1, -15, 1, 1, -5, -7, + 7, -2, -4, 3, -2, -5, -1, -3, -3, -1, 6, 3, 2, 3, -26, -117, + 35, -8, -19, 24, 58, -7, -6, 25, -9, 7, 4, 10, 2, 7, 6, 6, + 0, 6, -2, -1, -3, -3, 8, 71, 0, 17, 27, 20, -102, -115, 39, -32, + -18, -5, 58, -15, -12, 13, -10, -4, 1, 2, 1, 0, 6, 2, 1, 2, + 0, -4, 0, -5, 2, 67, 9, 14, 28, 29, -72, -126, 27, -25, -19, -14, + 58, -6, -11, 13, -5, -3, 3, 3, 4, 1, 8, 3, 3, 3, 3, -2, + 2, -3, -3, 62, 17, 14, 27, 35, -45, -128, 11, -19, -20, -22, 53, 1, + -12, 11, -3, -4, 2, 3, 4, 1, 7, 3, 3, 3, 3, -2, 2, -2, + -9, 57, 22, 14, 25, 37, -23, -125, -8, -15, -20, -30, 46, 9, -12, 10, + -2, -3, 0, 3, 3, 1, 6, 4, 2, 3, 2, -2, 1, 0, -16, 50, + 26, 13, 22, 37, -2, -117, -27, -13, -18, -36, 36, 16, -13, 9, -2, -2, + -2, 3, 2, 2, 4, 5, 1, 4, 2, -1, 0, 4, -20, 43, 29, 15, + 20, 36, 14, -102, -43, -15, -16, -40, 26, 22, -12, 8, -2, -2, -3, 3, + 1, 3, 2, 6, 1, 5, 1, 0, -1, 7, -23, 35, 31, 18, 18, 33, + 27, -83, -57, -20, -14, -42, 14, 26, -9, 7, -2, 0, -5, 3, 1, 4, + 1, 7, 0, 5, 1, 1, -2, 10, -24, 26, 31, 20, 17, 30, 36, -62, + -65, -27, -12, -43, 2, 28, -7, 6, -2, 0, -5, 3, 0, 4, 0, 7, + 0, 5, 1, 2, -4, 11, -23, 17, 32, 22, 16, 27, 42, -44, -67, -36, + -9, -42, -8, 28, -3, 5, -1, 1, -5, 2, 0, 4, 1, 7, 1, 5, + 1, 3, -5, 13, -22, 10, 31, 23, 17, 22, 45, -25, -66, -45, -8, -40, + -18, 27, 0, 5, -1, 1, -5, 1, 0, 4, 0, 6, 2, 4, 2, 3, + -6, 14, -19, 2, 29, 25, 19, 19, 47, -10, -60, -54, -10, -37, -27, 24, + 4, 4, 0, 1, -5, 0, 0, 3, 1, 5, 2, 4, 2, 4, -7, 15, + -16, -4, 27, 25, 21, 15, 48, 4, -51, -61, -12, -33, -34, 19, 7, 4, + 1, 0, -4, -1, 0, 3, 2, 5, 3, 3, 3, 5, -8, 15, -11, -10, + 24, 25, 23, 12, 45, 15, -39, -66, -18, -28, -40, 12, 10, 4, 2, 1, + -3, -2, 0, 2, 2, 4, 3, 3, 3, 5, -8, 13, -6, -14, 19, 25, + 25, 10, 43, 24, -25, -67, -25, -24, -45, 4, 11, 5, 3, 0, -2, -3, + -1, 1, 2, 3, 3, 3, 2, 6, -9, 11, -2, -17, 15, 24, 27, 9, + 39, 31, -13, -66, -33, -19, -48, -3, 11, 5, 3, 1, -2, -3, -1, 1, + 2, 4, 3, 3, 2, 8, -9, 9, 3, -18, 10, 22, 29, 9, 35, 35, + 0, -61, -41, -17, -49, -11, 10, 6, 3, 2, -2, -3, -2, 1, 1, 4, + 3, 5, 1, 9, -9, 7, 6, -18, 5, 20, 29, 10, 32, 38, 11, -47, + -45, -18, -47, -20, 5, 6, 4, 2, -1, -3, -2, 0, 1, 5, 1, 6, + 1, 7, -7, 6, 6, -16, 1, 16, 27, 11, 29, 40, 20, -30, -43, -23, + -46, -28, -2, 4, 4, 2, -1, -3, -2, -1, 0, 6, -1, 7, 2, 5, + -6, 5, 6, -15, -3, 13, 25, 12, 26, 41, 26, -14, -36, -26, -44, -35, + -11, 1, 4, 2, 0, -4, -3, -3, -1, 7, -2, 7, 4, 4, -6, 4, + 7, -13, -6, 10, 23, 12, 24, 42, 31, 0, -24, -28, -42, -40, -19, -4, + 4, 2, 1, -4, -3, -4, -3, 8, -3, 6, 6, 3, -6, 4, 7, -11, + -8, 7, 20, 12, 21, 41, 34, -2, -31, -34, -29, -21, -12, -3, -4, -10, + -7, -5, -6, -4, 5, 8, -3, -1, 7, -1, -11, -7, 0, 1, 6, 16, + 28, 33, 33, 30, 13, -1, -26, -35, -30, -24, -14, -5, -4, -11, -7, -5, + -6, -6, 3, 8, -2, -2, 7, 1, -11, -9, -1, 0, 4, 14, 26, 32, + 33, 32, 17, 3, -22, -34, -31, -25, -16, -6, -3, -10, -8, -5, -6, -7, + 2, 9, 0, -3, 6, 3, -9, -10, -2, 0, 3, 12, 24, 32, -1, 0, + -3, -1, -8, -5, -16, -5, -14, -4, -13, -5, -1, -7, 16, -17, 28, -16, + 47, 1, 70, 35, 97, 71, 98, 66, 32, -5, -71, -69, -122, -69, -105, -33, + -67, -6, -35, 2, -12, -2, 4, -12, 16, -19, 29, -16, 44, 2, 66, 37, + 92, 76, 95, 74, 33, 5, -69, -63, -122, -69, -106, -36, -66, -11, -33, -3, + -9, -7, 7, -16, 18, -22, 29, -17, 42, 3, 61, 40, 86, 81, 91, 82, + 34, 15, -67, -57, -122, -69, -105, -40, -64, -17, -29, -9, -6, -12, 10, -20, + 20, -23, 28, -17, 39, 4, 56, 42, 80, 85, 88, 89, 35, 24, -63, -53, + -119, -70, -104, -45, -62, -22, -26, -14, -2, -16, 12, -23, 20, -25, 27, -16, + 35, 7, 51, 45, 74, 89, 85, 96, 38, 32, -58, -49, -116, -72, -102, -50, + -60, -27, -24, -19, 0, -20, 14, -24, 20, -24, 24, -14, 31, 10, 45, 48, + 69, 92, 82, 102, 40, 39, -53, -45, -112, -74, -100, -55, -57, -33, -21, -24, + 3, -24, 15, -26, 19, -24, 22, -12, 27, 12, 40, 50, 63, 95, 80, 106, + 43, 45, -47, -42, -107, -76, -97, -60, -55, -38, -18, -28, 4, -26, 15, -27, + 18, -23, 19, -10, 23, 15, 35, 53, 59, 97, 78, 110, 47, 50, -39, -39, + -102, -79, -94, -65, -52, -43, -16, -32, 5, -28, 14, -27, 16, -21, 15, -7, + 18, 18, 30, 55, 54, 98, 76, 113, 51, 55, -32, -37, -96, -81, -91, -70, + -50, -48, -15, -35, 6, -30, 13, -26, 13, -19, 11, -5, 13, 20, 25, 56, + 50, 99, 75, 115, 56, 59, -24, -35, -90, -83, -88, -75, -48, -52, -14, -38, + 5, -30, 11, -25, 10, -17, 7, -2, 9, 22, 21, 57, 47, 99, 75, 116, + 61, 62, -15, -33, -82, -86, -84, -80, -47, -56, -14, -39, 4, -30, 9, -24, + 6, -15, 3, 1, 5, 24, 17, 57, 44, 98, 75, 116, 66, 65, -6, -31, + -75, -88, -81, -83, -46, -59, -14, -41, 3, -30, 6, -22, 3, -12, -1, 3, + 1, 26, 13, 57, 41, 96, 75, 115, 72, 68, 2, -29, -69, -89, -78, -87, + -45, -62, -15, -42, 0, -29, 3, -20, -1, -10, -5, 5, -2, 26, 11, 56, + 40, 94, 76, 114, 77, 69, 12, -28, -61, -91, -75, -89, -45, -64, -16, -42, + -2, -28, 0, -18, -5, -8, -9, 7, -6, 27, 8, 55, 38, 91, 77, 112, + 82, 71, 20, -25, -55, -91, -73, -91, -46, -65, -18, -42, -5, -26, -4, -15, + -10, -5, -13, 9, -9, 27, 7, 53, 37, 88, 78, 110, 87, 72, 29, -23, + -48, -90, -71, -93, -47, -66, -21, -41, -9, -24, -8, -13, -13, -3, -16, 9, + -11, 27, 5, 51, 37, 84, 79, 108, 93, 74, 37, -20, -42, -90, -70, -94, + -49, -66, -24, -40, -12, -23, -12, -12, -16, -2, -18, 10, -12, 25, 5, 48, + 37, 80, 81, 105, 98, 75, 45, -16, -36, -88, -68, -94, -51, -66, -28, -39, + -16, -21, -15, -10, -19, -1, -21, 10, -13, 24, 4, 45, 37, 76, 82, 102, + 102, 76, 52, -13, -30, -85, -67, -94, -54, -66, -31, -38, -20, -19, -19, -9, + -22, 0, -22, 9, -14, 22, 4, 41, 37, 71, 83, 99, 105, 77, 59, -8, + -25, -82, -67, -93, -56, -65, -35, -37, -23, -18, -22, -7, -25, 0, -24, 8, + -14, 20, 5, 37, 38, 67, 84, 96, 108, 79, 65, -3, -20, -79, -66, -92, + -59, -65, -39, -36, -27, -17, -25, -7, -27, -1, -24, 6, -14, 17, 6, 34, + 39, 63, 84, 93, 111, 80, 71, 1, -15, -75, -66, -90, -62, -64, -43, -35, + -31, -16, -28, -6, -28, -1, -25, 5, -14, 14, 6, 30, 39, 58, 85, 90, + 113, 82, 76, 7, -11, -70, -66, -88, -66, -62, -46, -34, -34, -15, -30, -7, + -30, -2, -25, 2, -13, 11, 7, 26, 40, 53, 84, 87, 115, 84, 81, 13, + -7, -65, -66, -85, -68, -61, -50, -33, -37, -15, -32, -7, -30, -4, -25, 0, + -12, 7, 9, 19, 37, 52, 80, 97, 118, 113, 98, 54, 7, -41, -72, -87, + -87, -75, -65, -47, -42, -29, -30, -22, -24, -19, -19, -14, -9, -2, 8, 17, + 36, 50, 77, 95, 117, 115, 101, 60, 13, -35, -69, -85, -88, -75, -66, -49, + -44, -31, -31, -23, -25, -20, -20, -15, -9, -2, -1, 0, 0, 0, 0, -1, + -1, -1, 3, 9, 14, 14, 10, -3, -17, -13, 1, 1, 23, 33, -14, -55, + -59, -80, -75, -35, -7, 51, 40, -29, -35, -53, -128, -31, 111, 72, 46, 55, + -19, -73, -23, 14, 64, 104, 87, 105, 68, -54, -76, -1, -18, 12, 92, 23, + -79, -93, -105, -119, -64, -20, 39, 70, 2, -45, -52, -107, -82, 73, 106, 56, + 53, 12, -57, -37, 14, 52, 105, 101, 94, 85, -5, -75, -25, -1, -8, 59, + 52, -45, -89, -94, -117, -90, -42, 1, 53, 29, -29, -45, -79, -104, 3, 99, + 78, 63, 42, -25, -49, -7, 30, 83, 112, 103, 99, 40, -54, -58, -11, -7, + 36, 68, -4, -80, -98, -114, -106, -57, -15, 33, 42, -10, -46, -66, -97, -45, + 68, 90, 67, 53, 4, -40, -20, 18, 60, 103, 107, 100, 69, -15, -62, -31, + -9, 15, 60, 31, -50, -90, -108, -115, -79, -33, 11, 42, 15, -33, -58, -87, + -75, 21, 87, 79, 63, 27, -26, -33, 1, 40, 88, 111, 105, 85, 20, -50, + -49, -17, 5, 46, 49, -17, -77, -102, -115, -95, -49, -7, 31, 28, -15, -50, + -76, -84, -21, 64, 84, 71, 45, -4, -32, -13, 22, 66, 103, 108, 95, 50, + -23, -56, -32, -5, 30, 55, 14, -53, -92, -111, -107, -68, -24, 16, 34, 4, + -37, -66, -85, -53, 32, 81, 77, 58, 17, -25, -24, 6, 46, 89, 108, 101, + 71, 6, -49, -45, -16, 15, 49, 36, -26, -77, -103, -110, -85, -41, 0, 30, + 20, -21, -55, -79, -72, -5, 65, 81, 67, 36, -10, -28, -8, 27, 71, 102, + 104, 85, 34, -31, -51, -29, 1, 37, 48, 2, -57, -93, -109, -97, -58, -16, + 20, 28, -4, -42, -70, -79, -36, 39, 78, 74, 51, 9, -24, -18, 11, 51, + 91, 105, 94, 57, -6, -48, -41, -12, 22, 48, 26, -33, -79, -103, -104, -74, + -32, 6, 28, 12, -27, -60, -78, -59, 8, 66, 78, 62, 27, -13, -24, -3, + 33, 74, 100, 99, 74, 20, -35, -48, -25, 8, 40, 40, -7, -61, -94, -106, + -88, -49, -9, 21, 21, -11, -47, -72, -71, -22, 45, 76, 71, 43, 2, -22, + -13, 16, 56, 91, 101, 85, 43, -15, -47, -36, -6, 28, 45, 16, -38, -80, + -102, -97, -65, -24, 11, 25, 4, -33, -63, -75, -46, 18, 66, 75, 56, 19, + -15, -20, 2, 38, 77, 98, 93, 62, 8, -38, -44, -20, 14, 41, 32, -15, + -64, -94, -101, -79, -40, -2, 22, 15, -17, -52, -72, -61, -9, 49, 74, 66, + 36, -2, -21, -9, 22, 61, 91, 96, 76, 31, -22, -45, -32, 0, 32, 40, + 7, -43, -82, -99, -89, -56, -17, 14, 21, -2, -38, -65, -69, -33, 26, 66, + 71, 50, 13, -16, -16, 7, 43, 79, 95, 85, 50, -2, -40, -40, -14, 20, + 40, 24, -22, -66, -93, -95, -70, -32, 3, 21, 9, -23, -55, -70, -51, 1, + 52, 71, 60, 28, -6, -19, -4, 27, 64, 90, 91, 66, 19, -27, -43, -26, + 6, 34, 35, -1, -48, -83, -96, -81, -47, -10, 16, 17, -9, -43, -66, -62, + -22, 33, 66, 67, 43, 7, -16, -13, 12, 48, 80, 91, 77, 39, -10, -40, + -36, -8, 24, 38, 17, -28, -69, -92, -89, -62, -25, 7, 19, 4, -29, -58, + -67, -42, 10, 55, 70, 55, 22, -9, -17, 0, 33, 68, 90, 86, 57, 10, + -31, -41, -21, 12, 36, 30, -8, -53, -85, -94, -75, -41, -5, 17, 13, -15, + -48, -67, -57, -13, 39, 68, 64, 37, 3, -16, -9, 18, 54, 84, 91, 72, + 30, -17, -41, -33, -2, 28, 37, 10, -35, -74, -94, -86, -56, -19, 10, 17, + -2, -36, -63, -66, -34, 19, 60, 70, 51, 17, -11, -15, 5, 39, 74, 92, + 83, 49, 1, -36, -40, -16, 18, 37, 24, -17, -61, -90, -93, -70, -34, 1, + 18, 8, -22, -55, -69, -50, -2, 47, 70, 61, 31, -3, -17, -5, 26, 62, + 88, 90, 65, 19, -25, -42, -27, 5, 33, 33, 1, -45, -81, -95, -81, -48, + -11, 14, 15, -10, -43, -66, -61, -22, 31, 65, 68, 43, 9, -14, -11, 12, + 49, 80, 92, 76, 38, -10, -39, -36, -8, 24, 38, 16, -27, -70, -92, -89, + -61, -25, 7, 17, 3, -31, -59, -68, -39, 8, 55, 55, 19, 0, -9, -10, + -14, -13, -21, -30, -32, -44, -49, -57, -65, -72, -83, -98, -104, -117, -123, -128, + -127, -128, -128, -128, -128, -127, -128, -120, -117, -109, -100, -90, -83, -72, -66, -55, + -50, -33, -42, -18, -29, -18, 15, -6, 11, 7, 19, 3, 38, 5, 48, 44, + 64, 57, 97, 82, 111, 104, 110, 107, 120, 116, 125, 126, 126, 126, 126, 127, + 117, 125, 123, 100, 127, 101, 124, 102, 121, 109, 126, 96, 125, 116, 127, 90, + 119, 87, 127, 90, 118, 95, 123, 93, 106, 90, 100, 104, 74, 84, 73, 97, + 72, 71, 57, 66, 80, 36, 59, 38, 55, 35, 57, -6, 64, 10, 25, 19, + 19, -22, 65, -26, 14, 2, -17, -12, 22, -40, -3, -31, -24, -38, -1, -56, + -6, -48, -36, -54, -19, -56, -33, -49, -69, -49, -52, -53, -60, -61, -84, -76, + -85, -96, -95, -95, -114, -93, -117, -104, -93, -101, -98, -100, -101, -96, -78, -95, + -71, -70, -72, -52, -63, -70, -43, -77, -41, -48, -65, -53, -53, -59, -42, -56, + -37, -64, -54, -52, -50, -54, -56, -54, -55, -62, -51, -47, -44, -67, -60, -63, + -56, -64, -53, -48, -61, -53, -58, -38, -48, -32, -38, -34, -28, -26, -23, -25, + -22, -6, -7, -12, -1, 5, 6, 6, -7, 22, -4, 27, 15, 18, 24, 37, + 30, 47, 24, 53, 29, 63, 29, 46, 46, 51, 52, 53, 36, 54, 65, 55, + 33, 64, 36, 69, 54, 26, 62, 66, 36, 68, 30, 47, 54, 58, 20, 55, + 31, 40, 50, 35, 19, 56, 33, 25, 46, 18, 22, 42, 21, 25, 32, 19, + 19, 26, 18, 23, 29, 24, 7, 27, 6, 33, 8, 17, -2, 14, 3, 23, + 14, 7, 5, -9, -13, -10, -23, -12, -16, -27, -8, -18, -15, -3, -18, -24, + -5, -23, -9, 0, -11, 4, -1, 4, 2, 5, -2, 3, -1, -7, 4, -11, + 1, -12, -4, -7, -10, -11, -11, -16, -23, -15, -20, -22, -23, -20, -30, -23, + -31, -25, -32, -35, -41, -34, -44, -39, -34, -49, -33, -30, -36, -29, -33, -14, + -24, -32, -18, -15, -7, -9, -11, 5, -14, 27, -11, 16, -10, 13, -9, 23, + -10, 19, 10, 18, 11, 29, 1, 47, 27, -4, 45, 3, 43, 40, 14, 13, + 57, 16, 34, 27, 22, 30, 32, 14, 24, 27, 20, 20, 17, 4, 20, 20, + 8, 8, 0, 10, -3, 17, -8, -1, -4, 1, 0, 6, -7, -3, -3, -13, + -5, -6, -18, -5, -28, -12, -13, -5, -11, -5, -28, -7, -15, -10, -6, -28, + -16, -12, -17, -8, -10, -19, -10, -24, -30, -32, -26, -31, -36, -32, -33, -27, + -25, -26, -26, -25, -25, -23, -16, -22, -10, -11, -7, -7, 4, -10, 10, -9, + 11, -8, 4, -6, 4, -8, 3, -4, 2, -3, -5, -3, -11, -8, -6, -12, + -11, -7, -24, -4, -17, -9, -18, -28, -16, -29, -23, -38, -24, -34, -22, -38, + -18, -27, -10, -22, -19, -21, -2, -23, 10, -19, 0, 4, 16, 7, 0, 3, + 17, 14, 26, 8, 25, 27, 30, 25, 38, 31, 49, 37, 42, 45, 48, 55, + 63, 46, 54, 54, 56, 59, 56, 47, 50, 53, 47, 50, 44, 42, 35, 40, + 31, 37, 35, 27, 20, 23, 19, 26, 24, 18, 11, 14, 18, 24, 18, 12, + 10, 3, 12, 2, 9, 4, 0, 0, 3, -4, 11, 1, 1, -1, -5, -7, + 1, -6, -1, 2, -4, 1, -1, -7, -9, -11, -21, -19, -20, -28, -27, -22, + -29, -24, -26, -32, -22, -25, -31, -24, -19, -22, -11, -19, -15, -4, -5, -4, + 0, -6, -6, 2, -9, -5, -5, -9, -10, -7, -18, -8, -14, -14, -19, -29, + -25, -16, -25, -30, -30, -30, -21, -29, -38, -37, -36, -41, -44, -53, -48, -43, + -44, -55, -46, -40, -33, -36, -40, -40, -28, -25, -24, -23, -17, -15, 1, -3, + -1, 5, 2, 9, 1, 4, 12, 13, 14, 15, 9, 21, 26, 32, 31, 28, + 28, 41, 38, 49, 45, 46, 53, 56, 57, 57, 57, 58, 55, 48, 56, 56, + 56, 45, 39, 41, 41, 44, 42, 25, 28, 27, 24, 28, 21, 14, 17, 8, + 15, 22, 13, 15, 16, 3, 11, 10, 4, 6, 4, -8, 0, -2, -2, -3, + -2, 1, 3, -3, -3, -6, -8, -5, 4, 3, 2, -4, -2, -1, 5, 3, + -2, -2, -2, 3, 7, -2, -26, -37, -34, -30, -13, -14, -21, -24, -27, -24, + -13, -7, -15, 6, 3, -30, -50, -48, -47, -41, -26, -8, 28, 43, 38, 57, + 63, 56, 75, 118, 127, 117, 99, 86, 85, 66, 46, 59, 80, 69, 43, 27, + -6, -47, -74, -80, -71, -57, -40, -44, -56, -78, -88, -78, -59, -52, -51, -56, + -57, -47, -36, -36, -39, -39, -32, -17, 6, 24, 33, 10, -14, -14, -2, -11, + -20, -15, -24, -28, -28, -25, -28, -54, -73, -65, -43, -18, 6, 27, 21, 23, + 17, 22, 18, 16, 31, 50, 45, 25, 22, 8, -20, -17, 8, 29, 10, -22, + -41, -45, -51, -53, -31, -18, -23, -7, 37, 54, 38, 36, 60, 100, 119, 120, + 122, 125, 110, 88, 94, 99, 90, 85, 82, 54, 26, -5, -49, -83, -85, -67, + -36, -14, -30, -55, -76, -86, -65, -41, -45, -60, -53, -43, -35, -34, -41, -43, + -45, -35, 10, 40, 32, 3, -3, -14, -30, -38, -33, -23, -29, -26, -18, -10, + -17, -37, -46, -58, -61, -45, -17, -4, -2, 19, 31, 27, 13, 22, 38, 49, + 59, 69, 60, 23, -13, -11, 13, 24, 19, 24, 8, -30, -58, -58, -66, -85, + -90, -61, -19, -1, -11, -5, 25, 42, 61, 92, 109, 106, 110, 104, 93, 93, + 89, 82, 86, 81, 71, 51, 13, -40, -74, -87, -73, -35, -24, -50, -71, -73, + -53, -50, -58, -68, -60, -61, -54, -30, -25, -40, -52, -25, 13, 32, 45, 49, + 44, 28, 22, 29, 32, 20, 3, 7, 6, 0, -1, -4, -30, -63, -69, -62, + -57, -49, -25, 2, 17, 24, 27, 30, 10, 4, 38, 77, 66, 32, 13, 7, + 0, 9, 31, 43, 23, -11, -25, -23, -46, -83, -87, -63, -42, -19, -6, -3, + 6, 27, 49, 81, 108, 121, 123, 124, 115, 110, 98, 80, 78, 77, 77, 69, + 54, 8, -56, -99, -92, -53, -46, -64, -75, -73, -70, -75, -62, -67, -86, -88, + -54, -28, -33, -46, -50, -40, -24, -3, 29, 51, 48, 34, 44, 44, 30, 18, + 13, -3, -15, -7, -1, -10, -36, -56, -65, -79, -100, -91, -64, -52, -40, -5, + 20, 9, -14, -9, 21, 49, 59, 58, 49, 25, -1, 11, 39, 39, 22, 19, + 20, 8, -19, -49, -72, -69, -58, -43, -27, -24, -13, -5, 12, 38, 74, 97, + 110, 124, 126, 126, 114, 105, 100, 87, 91, 108, 115, 73, 5, -41, -49, -49, + -53, -45, -49, -69, -77, -60, -51, -71, -94, -96, -68, -49, -46, -44, -45, -60, + -60, -27, 0, 11, 26, 37, 37, 37, 40, 42, 34, 8, -1, 14, 15, -5, + -12, -18, -44, -75, -85, -88, -98, -99, -76, -36, -12, -19, -24, -11, -9, 1, + 36, 71, 58, 29, 13, 17, 33, 33, 30, 35, 44, 44, 27, -3, -39, -51, + -61, -55, -41, -31, -25, -29, -21, -1, 23, 46, 76, 102, 109, 110, 116, 118, + 92, 61, 76, 112, 120, 93, 57, 14, -28, -54, -50, -46, -60, -83, -82, -64, + -62, -82, -89, -93, -101, -88, -59, -52, -64, -75, -76, -63, -50, -30, -1, 9, + 8, 11, 32, 44, 36, 29, 32, 27, 20, 22, 28, 24, 0, -21, -30, -45, + -78, -97, -83, -66, -50, -32, -17, -16, -23, -20, 4, 38, 51, 47, 37, 28, + 29, 27, 27, 31, 42, 54, 55, 43, 20, -5, -29, -40, -37, -30, -27, -23, + -15, -12, -11, 8, 43, 67, 78, 100, 122, 126, 107, 84, 81, 92, 106, 115, + 110, 79, 31, -3, -13, -26, -47, -56, -56, -58, -58, -56, -59, -72, -86, -84, + -66, -57, -56, -56, -60, -74, -74, -51, -32, -24, -14, 3, 14, 15, 19, 28, + 33, 19, 11, 22, 29, 18, 8, 9, 0, 0, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, + -1, -1, -1, -1, -1, -1, -1, 0, -1, -3, -2, -1, 0, 2, -4, -13, + -21, -23, -19, -8, 7, 17, 23, 26, 33, 38, 32, 17, -5, -17, -24, -20, + -6, -3, -16, -29, -26, -17, -5, -1, 2, 7, 11, 17, 15, 9, 9, 3, + 10, 15, 9, -14, -33, -27, -18, -6, -7, -10, -6, 0, 12, 15, 29, 38, + 36, 32, 11, 0, -30, -45, -50, -39, -23, -27, -24, -15, 6, 25, 37, 51, + 46, 40, 0, -19, -22, -34, -30, -40, -45, -51, -34, -1, 25, 48, 40, 43, + 51, 64, 58, 5, -22, -49, -63, -69, -68, -58, -54, -16, 13, 44, 66, 61, + 68, 72, 86, 47, -17, -56, -82, -88, -93, -72, -58, -40, 4, 45, 94, 98, + 84, 65, 68, 71, 15, -46, -88, -90, -88, -85, -62, -56, -34, -4, 41, 80, + 82, 74, 54, 70, 66, 25, -29, -70, -74, -90, -87, -79, -73, -46, -10, 54, + 90, 103, 88, 76, 90, 69, 25, -38, -76, -96, -119, -111, -103, -81, -57, -12, + 50, 90, 113, 98, 100, 112, 103, 60, -11, -54, -95, -121, -124, -119, -95, -71, + -10, 53, 103, 116, 93, 91, 89, 80, 31, -28, -67, -108, -122, -128, -110, -87, + -53, 8, 60, 107, 107, 89, 83, 83, 76, 27, -14, -52, -84, -99, -103, -82, + -72, -40, 4, 53, 92, 92, 88, 85, 97, 87, 42, 3, -45, -74, -106, -111, + -105, -101, -70, -30, 27, 65, 77, 83, 87, 106, 90, 58, 16, -30, -67, -101, + -100, -101, -93, -68, -27, 29, 60, 77, 79, 93, 111, 96, 71, 24, -21, -73, + -109, -118, -127, -118, -98, -50, 6, 43, 65, 70, 99, 115, 108, 82, 40, -1, + -53, -80, -94, -105, -101, -82, -31, 18, 56, 66, 72, 95, 103, 97, 64, 29, + -15, -63, -85, -102, -105, -104, -81, -35, 13, 53, 58, 69, 86, 97, 94, 67, + 39, -12, -54, -80, -97, -102, -103, -77, -38, 9, 40, 45, 60, 77, 95, 88, + 70, 41, -8, -46, -74, -87, -99, -100, -78, -42, 10, 37, 50, 66, 89, 110, + 103, 91, 57, 9, -33, -68, -86, -105, -105, -89, -51, -2, 23, 40, 53, 80, + 99, 98, 89, 53, 8, -37, -68, -90, -107, -106, -94, -51, -5, 25, 43, 58, + 86, 95, 98, 86, 52, 9, -36, -64, -92, -105, -108, -95, -53, -11, 22, 37, + 57, 81, 90, 96, 82, 52, 6, -34, -64, -92, -104, -113, -97, -59, -18, 15, + 31, 58, 79, 92, 98, 87, 57, 9, -29, -63, -87, -100, -109, -91, -58, -13, + 16, 36, 62, 78, 93, 96, 88, 56, 12, -25, -62, -83, -101, -106, -89, -57, + -15, 6, 30, 52, 71, 87, 94, 89, 55, 18, -21, -55, -76, -96, -100, -88, + -53, -16, 6, 31, 53, 76, 93, 105, 98, 64, 26, -18, -52, -78, -99, -105, + -95, -59, -26, 0, 24, 45, 66, 81, 97, 88, 62, 28, -12, -40, -67, -84, + -95, -83, -50, -21, 4, 24, 47, 64, 81, 96, 85, 63, 26, -11, -41, -69, + -88, -102, -91, -64, -36, -12, 10, 34, 51, 74, 87, 81, 62, 26, -7, -40, + -63, -83, -95, -83, -58, -31, -10, 14, 34, 51, 75, 85, 82, 61, 30, -3, + -34, -57, -81, -92, -83, -60, -36, -15, 11, 27, 47, 69, 80, 79, 59, 30, + -5, -33, -57, -82, -93, -84, -61, -38, -15, 10, 25, 48, 68, 80, 77, 58, + 29, -4, -30, -56, -80, -89, -78, -54, -34, -8, 10, 0, 0, 1, 0, -2, + -2, -5, -8, -3, 3, -4, -10, 2, 8, 3, 4, 5, -3, -9, 10, 26, + 26, 12, -4, -40, -64, -50, 1, 55, 69, 28, -23, -65, -83, -52, 13, 67, + 67, 39, 16, -15, -48, -38, 10, 53, 44, 5, -5, -14, -43, -35, 16, 54, + 37, -1, -26, -53, -82, -37, 35, 67, 44, 2, -10, -20, -39, -19, 27, 55, + 42, 3, -26, -67, -107, -62, 43, 110, 102, 43, -18, -63, -91, -35, 73, 120, + 77, -6, -72, -113, -109, -36, 53, 78, 50, 0, -46, -72, -71, -20, 67, 112, + 100, 44, -24, -88, -123, -84, 5, 71, 97, 66, 7, -53, -100, -80, -1, 83, + 127, 108, 38, -57, -121, -119, -57, 24, 84, 97, 62, -4, -77, -97, -46, 32, + 101, 108, 56, -20, -103, -119, -69, 18, 105, 126, 90, 6, -92, -126, -90, -3, + 85, 108, 75, 0, -86, -117, -85, -6, 76, 115, 101, 30, -68, -118, -105, -33, + 57, 105, 102, 41, -46, -104, -112, -59, 25, 95, 121, 81, -5, -88, -126, -94, + -12, 63, 101, 76, 7, -67, -107, -73, 11, 94, 127, 102, 21, -74, -124, -95, + -21, 57, 101, 82, 21, -48, -89, -59, 6, 67, 95, 60, -11, -82, -115, -81, + -13, 52, 84, 52, -9, -68, -96, -56, 9, 66, 93, 63, 10, -52, -86, -54, + 1, 60, 96, 70, 19, -44, -80, -51, 0, 55, 94, 69, 20, -42, -88, -76, + -40, 24, 79, 72, 34, -28, -75, -63, -23, 35, 71, 48, 4, -57, -95, -67, + -10, 62, 103, 75, 18, -61, -110, -86, -22, 61, 110, 90, 37, -45, -100, -87, + -39, 34, 81, 70, 33, -39, -88, -76, -24, 54, 94, 76, 32, -46, -100, -92, + -42, 35, 73, 62, 26, -46, -97, -93, -44, 36, 81, 75, 35, -38, -87, -81, + -26, 58, 99, 85, 37, -44, -101, -103, -46, 47, 98, 97, 56, -27, -90, -99, + -49, 37, 88, 95, 62, -12, -74, -93, -51, 27, 69, 71, 35, -30, -78, -87, + -38, 41, 84, 90, 57, -11, -71, -96, -56, 21, 69, 86, 60, -4, -67, -97, + -61, 12, 65, 88, 65, 3, -61, -94, -60, 14, 71, 96, 68, 3, -66, -104, + -70, 3, 59, 84, 59, -1, -67, -107, -76, -3, 59, 89, 64, 3, -67, -111, + -82, -9, 57, 92, 76, 26, -43, -93, -71, -9, 50, 80, 64, 16, -51, -100, + -79, -17, 49, 88, 77, 30, -41, -95, -79, -17, 49, 87, 77, 34, -36, -92, + -78, -19, 44, 82, 73, 33, -37, -95, -84, -23, 47, 89, 83, 43, -30, -92, + -83, -28, 39, 79, 74, 40, -28, -87, -82, -31, 34, 71, 67, 35, -31, -88, + -85, -36, 28, 68, 69, 44, -20, -79, -83, -43, 19, 59, 64, 41, -25, -89, + -100, -61, 9, 60, 76, 57, -10, -75, -90, -51, 22, 74, 88, 66, 1, -61, + -78, -42, 25, 71, 84, 63, -1, -67, -90, -59, 8, 59, 81, 68, 8, -56, + -85, -62, 1, 50, 74, 63, 7, -53, -84, -60, 5, 55, 80, 70, 17, -43, + -76, -55, 4, 49, 73, 65, 17, -41, -77, -62, -9, 38, 68, 64, 17, -43, + -84, -73, -22, 23, 56, 57, 18, -36, -77, -68, -23, 20, 51, 52, 16, -36, + -77, -70, -26, 18, 54, 59, 28, -22, -64, -59, -20, 21, 56, 63, 36, -12, + -55, -52, -16, 25, 58, 63, 35, -14, -59, -57, -22, 18, 51, 57, 31, -16, + -58, -58, -27, 10, 43, 51, 30, -16, -59, -60, -28, 12, 48, 57, 35, -13, + -59, -64, -35, 7, 47, 63, 47, 1, -46, -55, -32, 7, 47, 0, 0, -1, + -1, -4, 1, -1, -3, -13, -8, -14, -3, -2, -2, 1, 8, 5, 7, -21, + -13, -2, -6, -8, -22, -6, 5, 11, 34, 41, 33, 13, 28, 33, 48, 35, + 21, -3, -26, -18, -10, 3, 7, 22, 21, 63, 40, 41, 43, 4, -8, -43, + -63, -77, -77, -59, -18, 3, 2, -21, -46, -74, -90, -108, -101, -94, -89, -84, + -85, -77, -59, -50, -33, -7, 18, 37, 47, 64, 101, 127, 125, 127, 126, 126, + 126, 122, 100, 87, 62, 37, 28, 27, 25, 27, 34, 25, -4, -45, -85, -123, + -128, -126, -128, -127, -123, -92, -73, -55, -45, -37, -33, -32, -33, -43, -53, -55, + -43, -20, 3, 20, 34, 42, 49, 55, 63, 74, 84, 93, 101, 107, 112, 117, + 109, 92, 63, 33, 8, -13, -25, -29, -30, -27, -27, -32, -46, -63, -82, -98, + -109, -116, -121, -118, -104, -80, -49, -12, 21, 45, 58, 64, 66, 66, 61, 51, + 44, 37, 32, 32, 33, 33, 28, 23, 15, 8, 3, 2, 9, 16, 20, 24, + 23, 14, -1, -20, -37, -48, -53, -52, -47, -38, -26, -13, -5, -1, -4, -10, + -22, -34, -43, -48, -46, -34, -16, 5, 25, 45, 65, 78, 84, 83, 71, 55, + 39, 24, 9, -3, -12, -23, -34, -45, -57, -65, -71, -71, -63, -49, -34, -21, + -11, -2, 2, 8, 11, 12, 14, 14, 20, 28, 38, 50, 58, 63, 61, 56, + 46, 33, 17, -1, -19, -34, -45, -48, -44, -32, -19, -5, 5, 7, 4, -2, + -7, -11, -15, -18, -21, -23, -26, -28, -30, -31, -29, -26, -20, -12, -1, 11, + 21, 32, 42, 51, 55, 55, 52, 46, 41, 37, 32, 30, 28, 27, 24, 19, + 12, -1, -21, -45, -67, -89, -103, -107, -101, -90, -70, -51, -33, -18, -2, 11, + 23, 33, 39, 44, 49, 52, 57, 59, 59, 56, 52, 48, 41, 35, 28, 20, + 15, 11, 4, 0, -5, -11, -18, -25, -34, -42, -47, -48, -46, -40, -33, -27, + -24, -21, -24, -32, -42, -51, -56, -58, -56, -47, -35, -18, 2, 24, 48, 70, + 88, 99, 104, 102, 97, 89, 79, 69, 59, 49, 37, 27, 14, 0, -14, -29, + -44, -58, -71, -81, -87, -88, -88, -85, -81, -77, -72, -63, -51, -37, -21, -5, + 12, 29, 43, 53, 59, 61, 57, 48, 36, 24, 13, 8, 8, 15, 25, 38, + 48, 54, 54, 50, 43, 33, 22, 11, 3, -6, -15, -25, -35, -46, -54, -61, + -65, -68, -69, -69, -68, -64, -59, -52, -43, -32, -20, -7, 6, 19, 31, 42, + 51, 58, 62, 64, 62, 58, 52, 44, 35, 26, 17, 9, 1, -5, -10, -15, + -18, -19, -20, -19, -18, -16, -15, -14, -14, -15, -16, -17, -18, -19, -19, -19, + -19, -18, -16, -14, -11, -9, -6, -3, 0, 3, 6, 10, 14, 18, 22, 27, + 32, 35, 37, 37, 35, 30, 23, 14, 4, -6, -15, -24, -31, -36, -39, -40, + -39, -37, -32, -26, -19, -10, -1, 8, 17, 24, 29, 32, 33, 32, 29, 25, + 20, 15, 11, 7, 3, -1, -5, -9, -14, -19, -24, -28, -31, -32, -31, -27, + -23, -16, -10, -3, 2, 7, 10, 12, 13, 13, 13, 12, 10, 8, 7, 5, + 5, 5, 5, 6, 8, 10, 13, 17, 20, 23, 25, 26, 25, 21, 16, 9, + 1, -7, -16, -24, -31, -37, -42, -47, -49, -51, -52, -51, -48, -43, -37, -30, + -20, -7, 6, 19, -1, -4, -4, 0, -1, -4, -3, 4, 4, -2, -3, 2, + 1, -4, 0, 5, 0, -4, 2, -10, -26, -29, -34, -49, -61, -44, -21, -8, + -3, -3, 1, 20, 32, 38, 32, 12, -4, 1, 14, 28, 51, 68, 78, 80, + 72, 38, 1, -6, 16, 23, 2, -14, -15, -20, -33, -62, -65, -37, -18, -27, + -29, -26, -45, -38, 8, 52, 55, 31, 26, 16, 17, 45, 80, 87, 77, 62, + 54, 24, -23, -50, -43, -28, -47, -72, -86, -86, -87, -61, -35, -38, -57, -69, + -55, -27, 1, 4, 22, 45, 54, 31, 0, -7, -5, -3, 0, -9, -21, -20, + -15, -27, -31, -10, 5, 9, 3, -21, -67, -83, -46, -3, 8, 18, 22, 4, + -3, 5, 35, 52, 67, 72, 83, 89, 71, 37, 19, 25, 8, -11, -37, -58, + -80, -85, -68, -33, -24, -57, -60, -34, -16, -14, 17, 73, 96, 77, 48, 17, + -7, -9, 4, -1, -3, 6, 3, -12, -10, 19, 33, 33, 41, 35, -29, -70, + -64, -38, -18, 3, 17, -5, -26, -35, -5, 31, 63, 73, 86, 94, 80, 64, + 50, 46, 37, 28, -2, -32, -65, -91, -84, -63, -59, -82, -97, -80, -66, -65, + -43, 8, 49, 60, 61, 42, 27, 23, 23, 14, 15, 18, 10, -12, -17, -9, + -13, 8, 35, 42, 2, -41, -76, -87, -67, -46, -31, -32, -45, -72, -53, -5, + 32, 46, 72, 92, 96, 92, 77, 75, 73, 61, 44, 12, -32, -68, -72, -54, + -58, -75, -85, -67, -57, -61, -60, -46, -11, 24, 35, 22, 15, 6, -1, -13, + 8, 23, 8, -1, -1, -6, -8, 35, 71, 86, 79, 50, -11, -46, -38, -31, + -29, -21, -30, -64, -68, -43, -12, 10, 28, 62, 89, 88, 84, 85, 90, 89, + 95, 83, 28, -32, -53, -36, -44, -62, -64, -55, -59, -54, -52, -48, -23, 19, + 48, 37, 39, 42, 31, 12, 19, 20, 5, 4, 1, -23, -40, -14, 14, 42, + 68, 64, 14, -33, -53, -52, -32, -18, -24, -43, -67, -62, -36, -18, -1, 25, + 54, 57, 58, 56, 54, 50, 66, 80, 44, -21, -50, -40, -52, -69, -77, -60, + -56, -54, -53, -62, -49, -9, 28, 41, 58, 58, 47, 43, 49, 41, 34, 37, + 18, -19, -44, -47, -36, 1, 35, 38, 19, -20, -62, -71, -59, -36, -34, -47, + -63, -63, -50, -38, -17, 7, 37, 56, 74, 80, 73, 61, 87, 116, 99, 47, + -7, -26, -22, -20, -32, -57, -72, -76, -76, -71, -47, -9, 13, 24, 29, 29, + 25, 27, 52, 68, 62, 9, -38, -67, -66, -39, -11, -4, -24, -37, -47, -51, + -49, -44, -55, -39, -6, -17, -52, -54, -19, 1, 15, 24, 31, 41, 55, 71, + 79, 89, 111, 115, 88, 54, 22, -2, -8, -5, -7, -27, -49, -57, -69, -72, + -64, -30, -3, 17, 31, 37, 29, 14, 39, 67, 73, 47, 10, -40, -72, -58, + -23, -12, -19, -19, -39, -49, -42, -46, -62, -44, -8, -11, -36, -51, -39, -15, + 0, 13, 21, 25, 40, 55, 63, 73, 95, 115, 115, 85, 53, 20, 2, -1, + -2, -10, -32, -48, -64, -73, -77, -62, -33, -9, 16, 33, 31, 18, 17, 44, + 67, 70, 49, 6, -45, -69, -53, -24, -13, -19, -24, -40, -47, -45, -50, -62, + -43, -10, -13, -37, -51, -39, -15, 0, -3, -1, 1, -1, -6, -6, -4, -1, + -2, -6, -8, -7, -4, -5, -10, -14, -16, -16, -16, -17, -18, -18, -17, -15, + -15, -16, -15, -13, -10, -9, -9, -11, -13, -14, -11, -9, -8, -9, -7, -3, + -2, -5, -8, -6, 1, 5, 4, 1, 0, 1, 4, 4, 4, 5, 7, 9, + 9, 8, 8, 9, 10, 9, 5, 2, 3, 5, 7, 7, 9, 11, 11, 12, + 14, 14, 12, 8, 7, 8, 5, 1, 3, 8, 9, 9, 10, 14, 16, 15, + 14, 12, 11, 9, 7, 3, -2, -3, 3, 5, 0, -5, -1, -1, -6, -10, + -16, -23, -28, -29, -32, -39, -36, -23, -16, -19, -19, -10, -7, -12, -11, -5, + -6, -11, -13, -11, -9, -8, -2, 6, 8, 8, 9, 6, 2, 4, 8, 9, + 4, 4, 12, 18, 17, 14, 17, 20, 20, 16, 9, 7, 7, 5, 3, 4, + 1, -2, 0, 3, 2, -1, 1, 3, 3, 1, 2, 2, 0, 3, 6, 9, + 8, 0, -5, -3, 7, 12, 8, -2, -2, 9, 10, 2, -3, 2, 5, 1, + -3, -5, -6, -2, -3, -11, -20, -26, -28, -30, -32, -37, -43, -45, -43, -40, + -42, -41, -31, -22, -20, -18, -16, -16, -19, -15, -8, -3, -3, 3, 17, 26, + 22, 16, 18, 23, 27, 26, 23, 17, 15, 21, 25, 24, 25, 31, 36, 32, + 29, 23, 17, 15, 11, 5, 1, 4, 6, 8, 6, 7, 8, 10, 14, 18, + 22, 20, 17, 14, 15, 13, 10, 15, 15, 12, 9, 10, 15, 14, 9, 3, + 6, 10, 5, -3, -9, -16, -16, -10, -11, -20, -24, -18, -20, -32, -42, -48, + -55, -70, -84, -95, -100, -92, -75, -65, -68, -67, -56, -55, -51, -41, -33, -37, + -42, -38, -33, -31, -26, -6, 19, 30, 25, 25, 28, 30, 27, 19, 16, 18, + 31, 44, 46, 48, 56, 71, 77, 74, 66, 54, 47, 37, 19, 3, 2, 3, + 3, 4, 13, 20, 21, 25, 24, 25, 19, 18, 19, 19, 14, 6, 17, 14, + 1, 3, 12, 27, 29, 25, 13, 14, 24, 22, 6, -7, -7, 0, 11, 12, + 1, 0, 10, 8, -13, -32, -46, -52, -57, -70, -88, -106, -101, -81, -74, -82, + -75, -49, -37, -42, -44, -42, -46, -51, -47, -40, -32, -27, -6, 3, 16, 32, + 29, 25, 24, 30, 54, 69, 74, 78, 90, 108, 118, 124, 117, 107, 102, 93, + 76, 61, 50, 41, 35, 31, 26, 13, 4, 0, -1, 0, -6, -12, -10, -8, + -4, 0, -3, -20, -31, -27, -18, -16, -22, -29, -28, -9, 0, -3, -1, 2, + 11, 20, 24, 18, 22, 34, 32, 16, -1, -18, -34, -46, -55, -67, -91, -102, + -91, -72, -73, -81, -68, -55, -55, -65, -74, -79, -87, -87, -83, -81, -77, -60, + -25, 4, 4, -3, 0, 13, 29, 29, 24, 23, 29, 51, 67, 72, 77, 88, + 105, 114, 122, 116, 106, 100, 93, 77, 63, 51, 42, 36, 31, 27, 15, 5, + 0, -1, 0, -4, -10, -9, -7, -3, 2, -1, -16, -28, -26, -16, -13, -18, + -25, -25, -8, 2, 1, 2, 5, 13, 21, 26, 20, 23, 35, 35, 20, 3, + -14, -32, -45, -54, -67, -91, -102, -90, -72, -75, -82, -68, -56, -56, -66, -75, + -81, -88, -88, -83, -82, -77, -59, -22, 4, 1, -1, -2, -3, -3, -1, -1, + -6, -8, -9, -12, -5, 6, 15, 21, 22, 21, 9, -8, -16, -23, -32, -22, + 4, 27, 32, 17, -2, -21, -34, -37, -30, -24, -3, 24, 47, 58, 50, 23, + -12, -41, -52, -47, -33, -2, 28, 48, 45, 28, 0, -36, -58, -53, -34, -4, + 26, 52, 75, 73, 45, -5, -66, -101, -90, -61, -14, 23, 59, 87, 89, 63, + 10, -46, -79, -80, -55, -23, -3, 27, 58, 62, 41, -6, -66, -92, -77, -29, + 19, 41, 65, 74, 69, 42, -9, -73, -109, -107, -67, -17, 23, 70, 104, 111, + 83, 21, -56, -104, -109, -62, -21, 4, 34, 68, 89, 75, 19, -46, -89, -85, + -38, -1, 23, 45, 64, 74, 62, 8, -53, -98, -93, -47, -9, 16, 36, 62, + 86, 78, 13, -67, -121, -109, -56, -9, 25, 58, 89, 109, 81, 8, -70, -119, + -106, -56, -7, 32, 63, 90, 108, 74, -3, -89, -128, -118, -70, -22, 23, 62, + 101, 126, 98, 26, -64, -117, -110, -72, -32, 6, 44, 93, 124, 100, 28, -63, + -116, -110, -71, -26, 16, 54, 101, 121, 92, 13, -86, -128, -120, -79, -28, 15, + 60, 111, 127, 95, 11, -83, -127, -116, -80, -29, 15, 67, 117, 127, 100, 17, + -75, -118, -108, -75, -31, 7, 60, 109, 123, 87, 3, -83, -118, -106, -67, -23, + 13, 62, 106, 119, 85, 3, -77, -106, -95, -61, -27, 2, 52, 103, 124, 97, + 19, -61, -95, -92, -63, -34, -4, 45, 94, 116, 87, 8, -63, -91, -85, -58, + -36, -9, 36, 81, 104, 76, 2, -60, -87, -77, -52, -32, -2, 48, 97, 119, + 86, 7, -59, -90, -85, -65, -50, -22, 26, 78, 107, 79, 11, -49, -78, -73, + -58, -46, -18, 31, 85, 112, 75, 1, -59, -84, -73, -55, -40, -12, 30, 80, + 106, 74, 10, -46, -70, -62, -49, -39, -13, 31, 86, 110, 74, 8, -49, -70, + -59, -46, -33, -6, 38, 92, 111, 76, 13, -42, -62, -56, -51, -44, -23, 19, + 75, 97, 67, 8, -44, -63, -58, -56, -48, -26, 19, 75, 94, 64, 8, -40, + -55, -50, -49, -42, -25, 18, 69, 85, 57, 4, -41, -54, -51, -50, -45, -28, + 18, 71, 88, 60, 8, -35, -46, -47, -48, -46, -30, 16, 66, 84, 59, 9, + -30, -41, -43, -42, -40, -22, 25, 73, 88, 60, 8, -30, -42, -46, -45, -42, + -21, 28, 74, 83, 52, -1, -36, -46, -45, -40, -37, -17, 26, 66, 73, 41, + -10, -42, -54, -53, -48, -43, -19, 27, 68, 76, 44, -4, -34, -44, -41, -37, + -33, -10, 34, 71, 75, 40, -7, -36, -47, -43, -39, -35, -9, 35, 72, 75, + 39, -7, -38, -49, -45, -43, -38, -11, 33, 68, 70, 36, -4, -31, -39, -36, + -35, -31, -5, 36, 69, 69, 35, -4, -31, -38, -35, -37, -33, -8, 31, 64, + 63, 31, -7, -34, -42, -40, -43, -38, -12, 28, 61, 59, 27, -10, -34, -40, + -38, -41, -35, -9, 31, 63, 60, 29, -6, -31, -37, -38, -42, -35, -10, 29, + 60, 56, 27, -8, -30, -33, -34, -38, -32, -10, 28, 56, 51, 23, -9, -29, + -32, -34, -38, -33, -10, 29, 55, 50, 23, -9, -28, -30, -33, -37, -32, -8, + 32, 56, 52, 23, 23, 0, -2, 0, -2, -6, -6, -6, -5, -2, -1, 5, + 15, 20, 11, 12, 12, 6, 0, -8, -19, -12, -4, -19, -19, -4, 4, -7, + -3, 5, 8, 11, 14, 9, 9, 8, -4, -11, -6, -8, -16, -14, -7, -1, + -3, 1, 10, 13, 24, 28, 12, 10, 14, 11, -14, -29, -19, -12, -21, -25, + -16, 2, 0, -11, -7, 7, 10, 0, 0, 5, 11, 6, 10, 21, 13, 7, + 14, 4, -4, -9, -5, -11, -16, -7, -3, 3, 15, -2, 2, 17, 6, -19, + -16, 3, 3, -14, -10, 7, 7, 4, 8, 11, 4, -5, -12, -9, -6, -14, + -13, -17, -13, -8, 5, 9, 3, 10, 12, 24, 28, 26, 35, 20, -3, 24, + 23, -19, -31, -23, -23, -38, -34, -18, -10, -8, -6, -4, -1, 5, -4, -8, + 2, 15, 12, 26, 56, 37, 10, 25, 25, -4, -21, -24, -23, -26, -30, -27, + -8, 10, -5, 3, 30, 6, -26, -7, 13, -2, -19, -2, 11, 3, 14, 21, + 8, 12, 5, -19, -26, -12, 9, 1, -8, -8, 20, 27, 17, 16, 15, 0, + 23, 39, 11, -4, -13, -21, -21, -32, -36, -27, -20, -24, -10, -4, 5, 14, + 4, -11, -10, 7, -8, -7, 7, 7, 2, 15, 29, 55, 26, 4, 22, 37, + 32, 14, 10, 18, 7, -1, -28, -49, -24, -14, -41, -53, -37, -28, -27, -15, + 1, 2, 14, 14, 13, 3, 0, 1, 18, 9, 7, 11, 23, 23, 25, 16, + -7, 1, 13, 26, 26, 9, 13, 28, 28, 1, -29, -29, -26, -27, -43, -43, + -31, -12, -26, -15, 6, 16, 6, 22, 11, -4, 0, 3, 0, -4, -20, -9, + 15, 23, 19, 7, 25, 19, 42, 63, 40, 13, 22, 24, 1, -41, -60, -55, + -63, -69, -61, -31, -7, 10, 8, 0, 7, 4, 4, 20, 5, -4, 9, 27, + 31, 27, 23, 13, 19, 12, 2, 4, 15, 20, 35, 19, 16, 26, 3, -30, + -48, -31, -40, -60, -59, -47, -13, -3, 12, 22, 11, 7, 9, 8, 3, -10, + -34, -5, 6, 24, 38, 19, 13, 21, 40, 15, 2, 27, 26, 16, 44, 47, + -7, -43, -41, -29, -44, -80, -81, -58, -26, -17, 3, 16, 30, 19, 10, 25, + 16, 6, -12, -3, 13, 30, 38, 20, 17, 22, 25, 18, 13, 16, -3, 1, + 32, 44, -11, -48, -51, -34, -38, -49, -64, -70, -23, -10, -14, -1, 20, 18, + 20, 21, 11, 3, -8, -3, 13, 14, 22, 18, 32, 37, 30, 25, 16, 27, + 27, 18, 37, 52, 12, -26, -56, -57, -46, -71, -92, -86, -50, -21, -10, 8, + 15, 15, 18, 28, 17, 1, 1, 2, 13, 13, 23, 23, 21, 29, 31, 29, + 15, 20, 33, 32, 29, 46, 21, -31, -49, -53, -51, -66, -82, -76, -54, -32, + -10, 12, 19, 29, 18, 3, 0, 16, 20, 29, 31, 20, 25, 31, 43, 41, + 34, 44, 27, 29, 65, 54, -15, -70, -79, -63, -86, -114, -114, -79, -26, -2, + 6, 18, 19, 10, 19, 26, 15, 5, 0, 16, 23, 29, 30, 21, 25, 28, + 37, 37, 38, 44, 32, 29, 66, 65, -7, -67, -74, -59, -82, -114, -117, -85, + -31, -2, 11, 20, 18, 9, 20, 30, 15, 5, 0, 0, 1, 1, 2, 3, + 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 7, 7, 7, 7, 7, 6, + 4, 3, 2, 0, -1, -2, -3, -5, -6, -8, -9, -9, -11, -12, -14, -15, + -17, -17, -17, -18, -19, -19, -19, -18, -17, -16, -15, -13, -11, -8, -7, -6, + -5, -3, -1, 0, 0, 1, 3, 5, 8, 10, 12, 14, 17, 19, 21, 23, + 26, 27, 28, 28, 28, 26, 25, 24, 23, 23, 21, 19, 18, 16, 15, 14, + 13, 12, 11, 11, 11, 10, 8, 6, 5, 5, 4, 2, 0, -2, -4, -5, + -7, -10, -11, -12, -13, -14, -15, -15, -15, -15, -15, -16, -17, -18, -18, -19, + -21, -23, -25, -27, -28, -29, -29, -30, -30, -29, -27, -25, -23, -22, -20, -18, + -16, -14, -13, -12, -11, -11, -10, -9, -8, -6, -5, -4, -3, -1, 1, 3, + 4, 6, 7, 8, 8, 9, 10, 11, 12, 13, 13, 13, 13, 15, 18, 21, + 23, 24, 25, 25, 28, 31, 33, 34, 34, 32, 31, 31, 31, 30, 27, 22, + 16, 12, 10, 9, 7, 3, -5, -13, -19, -22, -22, -23, -25, -28, -31, -33, + -33, -32, -32, -31, -32, -33, -32, -29, -25, -21, -19, -19, -19, -19, -18, -15, + -9, -3, 2, 6, 9, 12, 16, 21, 27, 32, 37, 39, 40, 40, 39, 39, + 40, 41, 40, 38, 35, 34, 34, 33, 29, 22, 16, 11, 10, 11, 12, 12, + 10, 8, 7, 5, 3, 2, 0, -6, -12, -19, -23, -23, -22, -23, -26, -30, + -33, -33, -33, -34, -35, -37, -40, -45, -50, -53, -52, -48, -42, -37, -32, -27, + -22, -20, -18, -16, -16, -18, -21, -26, -30, -33, -34, -35, -36, -38, -40, -41, + -41, -38, -36, -36, -38, -41, -40, -38, -34, -30, -27, -25, -22, -20, -16, -15, + -16, -17, -18, -16, -13, -10, -7, -4, -2, 1, 6, 11, 16, 21, 24, 25, + 26, 24, 22, 19, 18, 19, 22, 24, 26, 30, 33, 38, 44, 50, 56, 61, + 63, 68, 72, 74, 73, 68, 64, 57, 50, 47, 46, 44, 37, 21, 3, -11, + -20, -23, -25, -30, -33, -36, -36, -34, -31, -27, -22, -21, -22, -21, -18, -21, + -24, -27, -31, -33, -32, -27, -21, -14, -13, -17, -17, -10, 0, 10, 15, 16, + 14, 8, 6, 10, 16, 25, 34, 39, 43, 47, 53, 62, 72, 82, 89, 92, + 90, 84, 79, 77, 77, 76, 67, 54, 42, 33, 26, 18, 5, -11, -27, -41, + -53, -65, -73, -77, -79, -81, -86, -93, -102, -110, -116, -118, -120, -124, -127, -128, + -128, -126, -122, -116, -107, -96, -85, -78, -72, -64, -54, -45, -39, -40, -46, -49, + -49, -47, -45, -44, -45, -45, -44, -42, -38, -33, -29, -26, -23, -20, -18, -14, + -11, -8, -5, -2, 2, 7, 11, 10, 8, 7, 9, 16, 22, 26, 28, 31, + 34, 39, 44, 49, 53, 57, 60, 62, 63, 63, 65, 66, 63, 57, 51, 46, + 46, 50, 53, 54, 55, 54, 55, 57, 63, 69, 73, 75, 73, 69, 66, 64, + 65, 63, 55, 43, 30, 18, 11, 3, -6, -15, -23, -29, -32, -32, -28, -22, + -16, -13, -16, -16, -11, -2, 9, 15, 1, 0, 0, 0, -1, 0, -3, 0, + -1, 0, -18, 21, -22, 23, -41, 20, 84, -39, 50, -61, 26, -126, -19, -37, + 15, 2, 70, -33, 127, -55, 117, -73, 15, -45, -50, 8, -11, 23, 33, 1, + 26, -67, 26, -25, 14, -45, 57, -124, 12, -4, -23, 107, -54, 127, -49, 43, + 27, -59, -30, 15, -128, 5, -128, 86, -39, 82, 12, 62, 9, 51, -59, 53, + -95, 67, -92, 68, -28, 94, 21, 47, -11, -1, -41, 0, -25, -9, 18, -68, + 15, -27, 49, -27, 103, -4, 3, -36, 58, -98, 56, -116, -31, -123, 25, -58, + 89, -21, 110, -25, 73, -28, 39, -21, 35, -40, 37, -20, 50, 55, 51, 6, + 1, -47, -11, -32, -23, 38, -67, 3, -54, 34, -55, 79, 1, 32, -61, 89, + -86, 53, -67, -10, -128, -6, -68, 51, -4, 82, 15, 83, -16, 63, -24, 55, + -29, 8, 0, 6, 11, 54, 14, 16, -39, -9, -12, -47, 37, -40, -22, -60, + 21, -76, 51, -17, 74, -63, 98, -36, 44, -33, 24, -113, -37, -89, 20, -30, + 67, 18, 87, 0, 67, -6, 38, 1, -2, -18, -5, -20, 32, 17, 21, -8, + -30, 15, -47, 11, -17, 11, -97, 43, -87, 27, -36, 91, -41, 66, 3, 44, + -28, 55, -74, -37, -92, -21, -37, 33, -1, 75, 22, 36, 14, 26, 8, 8, + -12, -7, -21, -1, 27, 11, 21, -30, 21, -37, -3, -13, 23, -27, -32, -10, + -23, -44, 56, -1, 43, -12, 76, -29, 48, -9, -25, -71, -70, -48, -20, 2, + 9, 56, 8, 56, -10, 52, -12, 31, -29, 27, -60, 62, -42, 83, -45, 30, + -24, 4, -26, 33, -23, 5, -18, -25, -53, -7, -6, -6, 19, 16, 31, 3, + 58, -14, 0, -64, -33, -58, -8, -43, 42, -18, 57, -9, 54, 1, 47, -3, + 36, -18, 3, 4, 6, 2, -17, 8, -14, -27, 35, 2, -3, 1, -8, -43, + -34, -1, -22, 12, 2, 37, -6, 53, 14, 16, -43, -22, -75, -2, -67, 23, + -24, 39, -3, 39, 6, 44, 9, 37, 5, 1, 3, 5, 12, -18, 0, 0, + -31, 5, 23, 1, -3, 10, -20, -48, -6, -30, 7, -18, 35, -4, 32, 21, + 39, -26, -1, -75, -9, -65, -3, -28, 20, -5, 32, 5, 36, 20, 30, 30, + 3, 10, -1, 16, -10, -7, -1, -17, -23, 18, 14, -3, 8, 9, -45, -14, + -35, -1, -27, 18, -2, 29, 1, 61, -14, 20, -56, -19, -51, -22, -38, 9, + -14, 22, 5, 24, 27, 23, 41, 13, 20, -7, 23, -2, -8, -2, -9, -26, + -6, 14, 11, -11, 37, -33, -12, -38, -6, -33, 7, -14, 30, -12, 55, 4, + 33, -32, -14, -45, -22, -43, -7, -15, 18, 18, 33, 17, 41, 22, 15, 14, + 8, -24, -16, -18, -16, -7, 6, 16, -2, 8, -14, -6, -23, 0, -22, 1, + -23, 21, 4, 24, -1, 9, -9, -11, -14, -13, -16, -14, -15, -12, -16, -5, + 8, 28, 25, 28, 34, 27, 15, 16, 2, -20, -22, -20, -15, -8, 10, 11, + 7, -3, -5, -16, -10, -13, -5, -16, -5, 4, 17, 13, 6, 1, -9, -1, + -2, -3, -4, -4, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -6, + -6, -6, -6, -6, -5, -3, -3, -5, -5, -5, -7, -8, -5, 4, 5, 13, + 12, -12, -5, 10, 5, 4, 0, 3, 26, 33, 10, -15, -69, -89, -25, 25, + 58, 70, 22, -41, -62, -31, 18, 17, -17, -12, -9, 20, 99, 96, 0, -88, + -123, -69, 61, 116, 54, -11, -45, -28, 40, 38, -42, -59, -53, -31, 63, 78, + -9, -65, -83, -59, 48, 110, 50, -11, -51, -54, 41, 96, 9, -87, -119, -77, + 42, 118, 67, -18, -57, -46, 24, 89, 81, 22, -43, -77, -65, -41, -23, -3, + 4, 8, -13, -54, -52, -21, 30, 89, 86, 8, -49, -76, -56, 30, 55, 52, + 47, -7, -45, -49, -48, -10, 68, 74, 43, 22, -27, -25, 12, 20, -5, -43, + -69, -46, 21, 53, 51, 38, -8, -32, 6, 20, -1, -19, -56, -67, -26, 27, + 76, 95, 23, -64, -60, -15, 33, 39, -8, -37, -24, -7, 7, 4, -25, -23, + -10, -14, -7, -5, -12, 2, 28, 31, 37, 21, -18, -16, -4, -22, -37, -46, + -56, -8, 58, 64, 53, 31, -9, -9, -2, -57, -85, -52, -13, 59, 92, 21, + -42, -47, -33, 27, 75, 27, -22, -38, -44, 18, 77, 32, -21, -46, -50, 34, + 89, 22, -37, -60, -56, 31, 95, 36, -27, -57, -82, -15, 53, 15, -13, -25, + -44, 14, 66, 14, -32, -53, -62, 25, 96, 50, 3, -32, -56, 25, 98, 51, + -9, -56, -78, 7, 92, 71, 28, -31, -92, -42, 28, 20, 24, 8, -34, 22, + 70, 18, -17, -53, -88, -20, 39, 7, -2, -8, -28, 35, 80, 19, -23, -55, + -93, -22, 63, 54, 47, 19, -52, -35, 2, -36, -32, -18, -49, -9, 41, 15, + 26, 34, -22, -6, 31, 1, 8, 9, -43, -15, 30, -3, -1, -7, -73, -48, + 6, -14, 5, 13, -47, -30, 12, -13, 6, 18, -37, -13, 39, 27, 45, 38, + -37, -32, 12, 3, 32, 46, -10, 6, 48, 16, 15, 15, -32, -2, 47, 24, + 26, 18, -51, -51, -15, -29, -1, 19, -28, -15, 21, 2, 18, 22, -34, -24, + 13, -3, 15, 14, -45, -34, 7, 10, 38, 31, -34, -30, 4, 5, 43, 61, + 13, 4, 6, -22, 4, 24, -13, -13, -10, -34, 0, 23, -16, -16, -13, -42, + -18, -4, -36, -17, 5, -10, 14, 22, -21, -22, -16, -37, -6, 20, -2, 17, + 36, 19, 43, 43, -9, -15, -12, -29, 6, 31, 6, 10, 7, -23, -2, 9, + -23, -15, -10, -26, 3, 20, -5, 1, 0, -22, 5, 22, -6, -8, -16, -37, + -5, 20, 2, 11, 6, -19, 11, 33, 12, 20, 16, -7, 20, 35, 11, 11, + -3, -28, 2, 19, -1, 3, -6, -29, -5, 2, -25, -17, -12, -16, 22, 34, + 3, -4, -21, -36, 4, 26, 8, -1, -30, -54, -23, -3, -11, 0, -12, -27, + 7, 24, 13, 19, -1, -21, 10, 27, 14, 17, 0, -14, 18, 33, 19, 14, + -17, -41, -10, 9, 2, 7, -14, -30, 4, 20, 9, 9, -15, -35, -3, 16, + 9, 0, -1, -2, -3, 4, 7, 4, -2, -3, 0, 3, -1, -1, 4, 5, + -2, -13, -9, 1, 4, 2, 1, 2, 2, -2, -8, -4, 0, 4, 4, -3, + -4, -3, 1, 2, -1, 3, 14, 1, -7, -12, -4, -2, 1, 1, 9, 5, + -6, -5, -2, -1, -1, 1, 14, 6, -6, -7, 3, 8, -2, -4, 13, 12, + -10, -17, -10, -5, -4, 2, 3, 7, -6, -6, -1, -1, -4, 1, 11, 6, + -6, -9, 10, 11, 3, 1, 14, 15, -12, -20, -12, -9, -15, -1, 7, 2, + -16, -7, 6, 0, -2, 10, 26, 17, -6, -11, 24, 21, 1, 0, 18, 15, + -17, -31, -28, -23, -14, 0, -4, 0, -16, -8, 8, -4, -3, 7, 15, 5, + -3, -3, 26, 25, 12, 8, 28, 17, -15, -28, -18, -17, -18, -7, -3, -7, + -20, 0, 7, 1, -9, 6, 9, -4, -9, 2, 15, 24, 34, 31, 10, -4, + -15, -29, -17, -21, -41, -40, -5, 19, -20, 3, 11, 33, 28, 21, 18, 15, + 16, 3, -1, 18, 17, 15, 1, -15, -10, -5, -14, -42, -48, -43, -26, 4, + -29, -14, -9, 32, 20, 12, 15, 21, 39, 24, 8, 26, 33, 6, -3, 0, + 1, -7, -16, -41, -44, -51, -34, -3, -6, -6, -19, 26, 10, 15, 35, 46, + 32, 20, 16, 23, 38, 15, -4, -10, 17, -6, -41, -48, -53, -70, -52, -9, + -9, -22, -15, 19, 24, 22, 30, 49, 34, 10, 1, 15, 33, 15, 1, 17, + 46, 12, -38, -59, -50, -57, -46, -13, -16, -30, -24, 26, 37, 33, 30, 45, + 40, 2, -11, 17, 41, 24, -4, 16, 48, 15, -38, -67, -64, -65, -46, -18, + -18, -35, -32, 35, 39, 37, 21, 45, 42, -2, -19, 14, 37, 22, 7, 24, + 40, 13, -42, -68, -63, -63, -38, -6, -12, -34, -25, 39, 43, 39, 17, 47, + 45, 3, -19, 21, 45, 25, 2, 21, 31, 0, -45, -71, -78, -83, -48, 2, + 7, -27, -32, 34, 45, 49, 23, 44, 36, 5, -5, 38, 60, 27, -13, 21, + 42, -13, -69, -81, -86, -79, -38, -9, -11, -41, -36, 38, 56, 45, 10, 43, + 43, 10, -6, 36, 57, 41, 10, 36, 46, -16, -67, -66, -71, -80, -44, -8, + -5, -29, -27, 30, 43, 46, 20, 52, 39, -9, -21, 40, 68, 42, -1, 20, + 32, -14, -70, -86, -94, -90, -45, -2, 0, -31, -17, 36, 47, 46, 18, 44, + 29, -2, -11, 46, 74, 51, 14, 36, 46, -15, -78, -87, -91, -89, -46, -12, + -11, -28, -5, 41, 46, 40, 17, 51, 33, -6, -13, 49, 75, 52, 15, 30, + 34, -21, -79, -88, -93, -88, -42, -9, -4, -25, -3, 36, 40, 34, 16, 44, + 23, -8, -10, 52, 83, 55, 17, 38, 31, -31, -82, -91, -93, -82, -39, -16, + -10, -25, 5, 33, 42, 32, 20, 54, 25, -9, -3, 59, 85, 63, 24, 37, + 24, -39, -86, -92, -97, -80, -34, -17, -15, -24, 10, 35, 45, 32, 16, 45, + 12, -23, -2, 62, 78, 53, 21, 37, 26, -39, -91, -95, -96, -77, -29, -16, + -16, -25, 10, -1, 0, 3, 21, -26, 18, -30, 32, -19, -15, -27, 2, 0, + 103, -84, -53, -52, 79, 51, 36, -69, -31, 48, 71, 33, -74, -64, 10, 51, + 49, -68, -91, -16, 30, 33, -31, -58, -42, 14, 24, -25, 23, -71, 79, -22, + 123, -74, 28, 28, 115, 99, -7, 9, -15, 72, 1, 16, -47, -5, -71, -18, + -75, -26, -71, -28, -56, -24, -57, -19, -33, -5, 7, -3, 14, -8, 82, 100, + 23, -32, -15, 80, 98, 68, -30, -21, 24, 71, 28, -41, -96, -22, 32, 37, + -57, -110, -67, 28, 35, -22, -112, -79, 13, 70, 27, -55, -63, 31, 95, 86, + -4, -40, 29, 110, 110, 28, -50, -12, 66, 80, 14, -87, -81, -7, 36, -5, + -95, -118, -42, 26, 8, -69, -121, -48, 37, 60, -6, -68, -29, 67, 104, 61, + -24, -17, 70, 123, 92, -5, -43, 23, 82, 67, -28, -96, -54, 18, 30, -39, + -115, -96, -7, 25, -13, -99, -101, -13, 52, 42, -35, -62, 9, 88, 93, 28, + -32, 15, 97, 118, 58, -29, -24, 51, 82, 39, -61, -88, -26, 28, 9, -70, + -117, -63, 7, 14, -46, -109, -71, 15, 55, 16, -51, -42, 43, 94, 75, 2, + -21, 48, 107, 101, 23, -36, 4, 65, 70, 1, -81, -69, -3, 26, -19, -94, + -106, -32, 14, -3, -74, -103, -37, 34, 46, -10, -56, -12, 66, 91, 49, -15, + 1, 74, 111, 76, -4, -28, 31, 72, 50, -33, -85, -43, 11, 15, -46, -106, + -80, -11, 13, -26, -92, -84, -8, 44, 29, -30, -48, 19, 80, 81, 26, -18, + 27, 91, 103, 49, -22, -10, 48, 68, 22, -60, -75, -22, 17, -5, -71, -105, + -54, 3, 3, -49, -98, -58, 14, 44, 11, -44, -27, 45, 85, 65, 5, -8, + 53, 100, 87, 21, -26, 11, 60, 56, -6, -74, -58, -4, 13, -25, -90, -91, + -29, 7, -12, -72, -90, -29, 32, 37, -10, -46, -2, 66, 83, 47, -8, 10, + 74, 101, 68, -3, -19, 31, 62, 38, -36, -77, -40, 6, 4, -49, -100, -72, + -12, 3, -31, -86, -73, -4, 37, 25, -28, -36, 25, 75, 74, 25, -9, 34, + 88, 94, 43, -16, -4, 47, 58, 15, -57, -69, -22, 6, -12, -73, -96, -50, + -4, -7, -53, -89, -49, 13, 36, 5, -37, -17, 47, 77, 59, 9, 2, 58, + 92, 79, 19, -17, 16, 54, 45, -13, -69, -52, -8, 3, -33, -85, -82, -29, + -2, -20, -68, -79, -23, 24, 29, -11, -34, 7, 61, 73, 41, 0, 22, 73, + 90, 58, 1, -9, 32, 52, 26, -36, -69, -35, -3, -7, -53, -90, -63, -16, + -7, -36, -78, -60, -4, 29, 16, -22, -23, 29, 68, 64, 26, 2, 42, 80, + 81, 38, -8, 5, 42, 44, 4, -53, -57, -21, -2, -22, -69, -83, -43, -10, + -15, -51, -77, -38, 11, 27, 3, -27, -5, 46, 68, 52, 13, 15, 58, 83, + 68, 19, -8, 21, 46, 32, -16, -60, -44, -12, -6, -36, -76, -74, -34, -10, + -20, -57, -73, -33, 12, 27, 3, -1, -6, -11, -3, 4, 0, -7, -8, 1, + 21, 14, 28, 33, 25, -1, 7, 4, -13, -21, -44, -29, -17, -31, -32, 2, + 0, -20, 4, 3, 4, 0, -2, -5, -4, -14, 3, 14, 9, 28, 34, 54, + 43, 54, 39, 19, 17, -1, 5, -23, -31, -25, -35, -46, -60, -29, -29, -13, + -37, -22, -16, -20, -27, -21, -6, -16, 8, -5, 15, 26, 69, 65, 74, 85, + 81, 76, 51, 22, -10, -10, -19, -3, -39, -73, -55, -36, -18, -45, -49, -45, + -52, -47, -74, -73, -56, -31, -15, -16, -5, 18, 65, 86, 108, 94, 97, 90, + 79, 54, 30, 19, 10, 25, -16, -34, -37, -9, -16, -35, -44, -60, -60, -50, + -62, -70, -66, -44, -34, -34, -29, -10, 23, 61, 85, 79, 75, 70, 61, 41, + 31, 7, 8, 3, -22, -42, -28, 0, -13, -29, -39, -52, -56, -55, -58, -60, + -57, -41, -35, -37, -19, 5, 35, 71, 87, 85, 97, 112, 97, 71, 56, 52, + 53, 43, 18, -7, -3, 10, 0, -17, -39, -55, -58, -64, -80, -106, -121, -112, + -110, -113, -105, -82, -51, -8, 16, 20, 45, 66, 66, 49, 46, 59, 75, 78, + 63, 62, 74, 80, 80, 69, 51, 27, 11, 0, -14, -40, -53, -48, -55, -68, + -71, -56, -34, -1, 14, 24, 49, 62, 59, 42, 34, 43, 47, 43, 26, 30, + 33, 38, 26, 4, -17, -41, -66, -81, -92, -112, -120, -115, -116, -128, -125, -103, + -71, -36, -11, 9, 33, 56, 59, 54, 61, 67, 77, 77, 77, 79, 74, 75, + 73, 55, 30, 10, -21, -38, -46, -61, -70, -67, -70, -81, -77, -64, -45, -23, + -4, 10, 30, 44, 44, 39, 42, 48, 51, 50, 51, 58, 58, 65, 65, 47, + 29, 12, -14, -31, -41, -53, -63, -60, -62, -64, -58, -44, -26, -11, 1, 10, + 20, 22, 17, 9, 5, 6, 6, 2, 4, 10, 10, 17, 19, 9, 7, -1, + -14, -18, -13, -14, -9, 1, 7, 12, 17, 23, 31, 35, 36, 35, 38, 31, + 21, 16, 3, 0, -8, -11, -11, -13, -19, -20, -23, -34, -39, -51, -69, -78, + -81, -83, -83, -78, -70, -60, -47, -34, -19, 2, 20, 39, 57, 60, 66, 67, + 63, 61, 53, 50, 51, 47, 37, 32, 23, 13, 6, -3, -17, -23, -28, -34, + -37, -35, -27, -15, -2, 4, 12, 23, 30, 44, 47, 43, 41, 35, 29, 22, + 15, 13, 14, 7, -1, -5, -11, -19, -20, -25, -37, -43, -41, -43, -47, -47, + -40, -29, -17, -7, 5, 13, 23, 38, 44, 37, 34, 31, 23, 17, 6, 1, + -2, -10, -20, -25, -35, -45, -50, -54, -64, -68, -65, -66, -65, -59, -47, -30, + -19, -7, 5, 14, 28, 48, 62, 66, 72, 75, 78, 76, 67, 60, 56, 46, + 32, 20, 9, -2, -10, -21, -35, -43, -44, -49, -56, -57, -51, -38, -25, -13, + -2, 9, 25, 42, 56, 59, 64, 65, 67, 65, 57, 52, 49, 41, 28, 18, + 8, -2, -10, 0, 8, 13, 21, 20, 20, 17, 10, 8, -2, -6, -17, -21, + -29, -23, -25, -14, -7, -2, 7, 10, 20, 21, 22, 23, 19, 14, 9, -2, + -6, -18, -20, -28, -25, -23, -18, -10, -3, 5, 9, 22, 17, 28, 22, 21, + 17, 11, 2, -8, -18, -23, -27, -26, -24, -19, -13, -6, 3, 9, 17, 20, + 28, 24, 25, 21, 13, 6, -5, -14, -21, -29, -29, -30, -23, -19, -7, -1, + 10, 18, 25, 29, 27, 28, 20, 17, 5, -7, -13, -26, -29, -30, -30, -27, + -20, -12, 0, 11, 19, 25, 27, 30, 26, 28, 19, 11, -2, -12, -24, -30, + -35, -34, -30, -24, -14, -2, 9, 18, 23, 28, 26, 33, 31, 29, 24, 12, + 5, -12, -23, -30, -37, -36, -36, -26, -19, -5, 5, 19, 22, 32, 32, 36, + 35, 26, 21, 3, -6, -22, -34, -41, -44, -38, -31, -18, -6, 6, 15, 23, + 32, 33, 39, 34, 31, 23, 10, -2, -21, -32, -44, -47, -45, -37, -23, -12, + 6, 13, 28, 30, 38, 40, 40, 38, 23, 17, -6, -15, -35, -42, -50, -49, + -41, -31, -14, 0, 14, 26, 35, 42, 45, 45, 40, 27, 18, -4, -14, -33, + -42, -54, -52, -47, -36, -21, -5, 13, 24, 39, 43, 52, 47, 42, 36, 20, + 7, -15, -32, -45, -55, -56, -54, -43, -27, -8, 12, 26, 38, 45, 50, 51, + 48, 40, 27, 9, -11, -30, -46, -58, -62, -58, -49, -31, -11, 9, 24, 41, + 45, 54, 53, 54, 45, 30, 14, -10, -27, -48, -58, -67, -64, -56, -35, -15, + 6, 24, 37, 45, 54, 56, 56, 49, 39, 18, 0, -26, -45, -60, -74, -70, + -63, -41, -23, 4, 21, 39, 48, 53, 61, 58, 59, 43, 29, 3, -20, -46, + -64, -77, -77, -69, -50, -27, 0, 20, 36, 49, 56, 64, 64, 63, 51, 34, + 6, -17, -46, -65, -79, -83, -76, -58, -33, -6, 17, 38, 49, 60, 67, 68, + 66, 53, 37, 13, -13, -38, -65, -79, -90, -82, -68, -41, -15, 14, 36, 52, + 63, 70, 73, 69, 62, 44, 19, -8, -38, -63, -83, -93, -90, -77, -49, -20, + 12, 34, 54, 65, 72, 75, 76, 65, 51, 26, -1, -33, -62, -86, -98, -96, + -86, -58, -29, 6, 32, 54, 66, 73, 79, 76, 73, 58, 36, 4, -27, -60, + -85, -101, -104, -92, -70, -36, -1, 31, 53, 70, 75, 81, 80, 78, 65, 41, + 15, -24, -56, -84, -105, -109, -101, -79, -46, -7, 25, 56, 65, 77, 82, 85, + 83, 69, 51, 19, -14, -50, -83, -103, -115, -107, -88, -55, -17, 21, 50, 67, + 81, 86, 89, 85, 79, 55, 28, -8, -46, -77, -103, -116, -117, -97, -67, -25, + 1, 39, 66, 81, 92, 96, 97, 90, 73, 45, 11, -27, -64, -97, -120, -128, + -117, -89, -49, -5, 35, 65, 81, 93, 98, 99, 91, 75, 46, 12, -27, 28, + -9, -42, -57, -50, -18, 33, 77, 77, 17, -64, -96, -55, 22, 73, 68, 17, + -43, -77, -67, -15, 59, 102, 79, 12, -48, -71, -57, -28, -3, 11, 10, -3, + -17, -4, 44, 88, 79, 10, -69, -103, -74, -6, 54, 75, 53, -4, -63, -80, + -38, 32, 73, 59, 7, -43, -67, -57, -18, 33, 71, 71, 24, -31, -47, -17, + 20, 23, -14, -58, -73, -47, 10, 73, 110, 93, 20, -62, -97, -68, -6, 43, + 54, 28, -13, -51, -65, -35, 26, 74, 69, 12, -50, -68, -37, 9, 37, 37, + 16, -12, -26, -7, 36, 65, 45, -19, -87, -112, -75, -7, 58, 97, 92, 41, + -30, -75, -62, -3, 49, 52, 7, -44, -63, -45, -6, 37, 60, 42, -5, -42, + -41, -3, 38, 41, 8, -33, -51, -38, 3, 54, 90, 79, 12, -76, -127, -106, + -29, 47, 78, 63, 23, -19, -36, -16, 24, 50, 35, -15, -59, -64, -27, 17, + 40, 35, 11, -20, -39, -26, 19, 63, 67, 14, -61, -97, -72, -5, 64, 101, + 87, 26, -49, -96, -86, -32, 24, 40, 17, -11, -17, -3, 24, 51, 55, 29, + -20, -66, -69, -23, 35, 55, 25, -26, -59, -55, -14, 44, 86, 80, 23, -56, + -105, -87, -19, 48, 79, 67, 27, -18, -46, -43, -14, 17, 16, -20, -54, -47, + 3, 59, 83, 66, 18, -35, -64, -54, -8, 44, 59, 18, -48, -87, -72, -16, + 49, 88, 84, 37, -31, -81, -79, -26, 33, 52, 29, -5, -19, -6, 20, 34, + 27, -5, -51, -84, -71, -9, 62, 95, 71, 12, -40, -58, -37, 8, 52, 63, + 22, -53, -103, -88, -23, 47, 80, 64, 24, -14, -33, -28, -3, 21, 18, -15, + -45, -39, 5, 57, 78, 54, -1, -60, -97, -89, -29, 50, 92, 67, 0, -53, + -57, -13, 38, 64, 52, 10, -44, -82, -76, -26, 28, 49, 32, 1, -14, -1, + 24, 40, 38, 9, -43, -87, -79, -13, 69, 110, 80, 4, -65, -90, -69, -21, + 32, 58, 39, -9, -48, -45, 0, 52, 69, 46, 5, -34, -57, -50, -14, 23, + 28, -8, -48, -48, 4, 71, 99, 69, 3, -63, -99, -88, -30, 46, 92, 78, + 16, -45, -66, -44, -6, 25, 34, 16, -24, -55, -43, 10, 67, 80, 37, -22, + -48, -29, 7, 30, 27, -5, -51, -84, -73, -11, 71, 116, 95, 27, -43, -84, + -84, -43, 18, 63, 60, 10, -44, -53, -9, 41, 49, 14, -31, -57, -50, -15, + 29, 61, 57, 14, -37, -51, -14, 38, 63, 47, -1, -61, -106, -105, -47, 44, + 115, 113, 42, -36, -64, -42, -2, 23, 20, -3, -28, -39, -21, 24, 64, 59, + 7, -48, -67, -47, -7, 36, 59, 47, 2, -55, -77, -31, 55, 111, 89, 7, + -75, -113, -96, -42, 21, 62, 64, 28, -13, -18, 17, 45, 28, -2, -7, -6, + -7, -7, -8, -8, -8, -8, -7, -6, -5, -4, -3, -3, -2, -2, -1, 0, + 1, 2, 4, 5, 6, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, + 17, 17, 17, 17, 16, 16, 15, 15, 14, 14, 13, 12, 10, 10, 9, 8, + 7, 6, 5, 5, 4, 3, 2, 1, 0, -2, -3, -4, -5, -6, -7, -8, + -9, -10, -11, -12, -13, -13, -14, -14, -14, -14, -14, -15, -15, -15, -15, -16, + -16, -14, -14, -12, -10, -13, -10, -13, -7, -3, -5, -1, -1, -5, -5, 8, + 13, 10, 10, 15, 16, 17, 30, 34, 19, 17, 22, 29, 27, 22, 16, 1, + -3, 8, 18, 11, 6, 8, 8, 1, 6, 18, 5, -8, -4, 4, 5, 3, + 5, -3, -6, 12, 30, 23, 9, 5, 6, 9, 15, 27, 20, 2, 0, 10, + 17, 8, -1, -4, -8, -8, -3, -7, -19, -28, -24, -22, -31, -42, -47, -50, + -50, -42, -35, -35, -43, -41, -31, -27, -23, -17, -9, -7, 3, 26, 37, 38, + 37, 41, 39, 39, 49, 55, 50, 46, 53, 58, 51, 44, 36, 24, 9, 5, + 2, -12, -25, -28, -26, -33, -42, -44, -55, -66, -69, -62, -60, -65, -57, -42, + -33, -26, -15, -5, -6, 0, 15, 29, 34, 41, 55, 61, 62, 68, 71, 62, + 49, 49, 49, 39, 29, 24, 14, -2, -10, -16, -34, -56, -67, -70, -77, -83, + -85, -88, -93, -92, -79, -74, -78, -74, -61, -49, -41, -23, -9, -2, 11, 35, + 54, 56, 58, 64, 69, 73, 81, 91, 86, 77, 78, 77, 67, 50, 39, 24, + 6, -4, -10, -22, -41, -49, -52, -62, -73, -81, -87, -98, -97, -83, -74, -70, + -63, -46, -33, -23, -6, 9, 18, 26, 48, 69, 77, 85, 97, 106, 107, 111, + 114, 104, 89, 83, 84, 75, 60, 50, 34, 13, -5, -16, -34, -59, -74, -80, + -86, -95, -97, -96, -104, -104, -95, -86, -86, -82, -66, -49, -32, -11, 12, 26, + 36, 55, 73, 81, 84, 94, 104, 107, 114, 120, 116, 102, 92, 88, 73, 54, + 37, 21, 0, -16, -23, -37, -58, -76, -85, -94, -108, -114, -116, -120, -119, -106, + -89, -84, -78, -64, -49, -37, -21, 1, 13, 25, 46, 71, 88, 95, 105, 113, + 112, 113, 116, 112, 97, 91, 91, 83, 68, 51, 35, 11, -10, -23, -38, -60, + -80, -86, -93, -102, -107, -110, -116, -121, -114, -102, -98, -93, -77, -55, -38, -18, + 1, 13, 25, 46, 71, 88, 95, 105, 113, 112, 113, 116, 112, 97, 91, 91, + 83, 68, 51, 35, 11, -10, -23, -38, -60, -80, -86, -93, -102, -107, -110, -116, + -121, -114, -102, -98, -93, -77, -55, -38, -18, 1, -3, -7, -8, -3, 1, 0, + 3, -5, -9, -14, -15, -4, 0, 7, 12, 12, 11, 18, 16, 14, 14, 11, + 20, 14, 19, 7, 12, 8, 13, 8, 7, 9, 0, 9, -7, -4, -5, -8, + -7, -9, -7, -2, -7, -4, 1, 1, 0, -2, 3, 2, 1, 2, 1, -2, + -3, -7, -2, -2, -2, -5, -4, -4, -4, 3, 6, 8, 3, 0, -3, -2, + 3, 4, 3, 2, 2, -2, 1, 0, 2, 3, 9, 8, 2, -3, -4, -2, + 1, 4, 0, -2, 3, 1, 7, 1, -4, 0, 2, 3, 1, 1, 2, -5, + 3, -3, -4, -3, -8, 2, -7, 1, -3, -2, -5, -8, -7, -8, -7, -5, + -7, -4, -8, -10, -7, -8, -7, -5, 0, -2, 0, -2, -3, -3, -2, 0, + 1, 0, 1, 0, -3, -3, -5, -5, -9, -9, -13, -16, -21, -26, -25, -25, + -16, -16, -12, -13, -15, -9, 3, 25, 44, 66, 68, 66, 49, 17, 13, 18, + 41, 51, 40, 35, 25, 23, -2, -16, -28, -8, -4, -12, -18, -34, -29, -31, + -28, -18, -4, 2, 16, 13, 20, 9, 4, 2, -3, -4, -9, -9, -9, -8, + -9, -10, -13, -14, -15, -13, -4, 7, 13, 19, 18, 16, 9, 7, 4, 6, + 8, 7, 7, 3, -3, -15, -19, -24, -21, -16, -9, 0, 3, 7, 4, 4, + -3, -2, 6, 13, 20, 14, 16, 14, 11, 7, 0, -4, -3, -3, -7, -12, + -12, -9, -5, -5, -7, -9, -4, -2, -2, -2, -4, -9, -10, -13, -13, -14, + -15, -13, -9, -8, -9, -9, -7, -4, 2, 2, 6, 9, 8, 11, 9, 11, + 9, 8, 6, 0, -7, -13, -21, -29, -36, -45, -53, -63, -72, -73, -61, -41, + 0, 52, 98, 109, 81, 64, 54, 78, 77, 45, 39, 44, 25, 19, 6, -8, + 25, 30, 44, 62, 46, -20, -85, -89, -88, -47, -29, -30, 2, 11, 8, 12, + 24, 33, 29, 25, 22, 1, -15, -34, -37, -36, -41, -36, -28, -15, 2, 9, + 11, 14, 12, 8, 12, 17, 18, 19, 23, 20, 20, 20, 8, -5, -14, -15, + -15, -13, -13, -18, -19, -24, -29, -32, -31, -23, -12, -2, 12, 20, 23, 24, + 25, 20, 22, 18, 16, 14, 9, 7, 2, 1, -9, -10, -19, -15, -12, -13, + -8, -5, -4, -4, -7, -10, -12, -12, -16, -14, -8, -9, -13, -14, -18, -15, + -10, -5, -3, 3, 4, 6, 11, 13, 13, 16, 16, 16, 12, 6, -3, -10, + -16, -21, -28, -37, -48, -61, -77, -88, -87, -68, -34, 28, 92, 127, 99, 64, + 50, 72, 92, 55, 43, 51, 41, 32, 4, -8, -7, -17, -23, -31, -33, -35, + -32, -28, -23, -18, -12, -8, -4, -2, 0, 1, 2, 2, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 3, 4, 6, 7, 7, 7, 8, 9, 9, 8, + 8, 9, 11, 14, 18, 22, 27, 32, 33, 30, 21, 6, -12, -30, -45, -54, + -56, -51, -41, -29, -17, -9, -3, 0, 1, 1, 1, 1, 1, 1, 1, 2, + 2, 3, 3, 3, 3, 3, 2, 3, 4, 5, 8, 9, 10, 9, 8, 7, + 7, 8, 10, 15, 20, 25, 30, 35, 39, 39, 32, 19, 0, -22, -42, -56, + -62, -61, -53, -40, -27, -15, -7, -3, -1, 0, 0, 0, 0, 2, 3, 4, + 5, 5, 5, 4, 2, 0, -1, 0, 2, 5, 8, 9, 10, 10, 9, 9, + 8, 9, 10, 14, 19, 24, 28, 32, 34, 38, 36, 29, 17, -5, -28, -49, + -61, -65, -61, -52, -39, -25, -14, -7, -3, -2, -1, -2, -1, 0, 2, 4, + 6, 7, 7, 5, 3, 0, -1, -1, 0, 3, 7, 11, 13, 14, 13, 12, + 10, 8, 8, 9, 12, 17, 22, 26, 29, 31, 33, 31, 26, 18, 3, -16, + -35, -50, -59, -61, -56, -46, -35, -23, -14, -6, -2, 0, 1, 2, 3, 4, + 4, 5, 5, 5, 4, 2, 1, -1, -1, 0, 2, 5, 9, 12, 13, 13, + 12, 11, 9, 7, 7, 8, 11, 15, 20, 24, 29, 33, 35, 34, 30, 21, + 4, -16, -37, -55, -66, -68, -63, -50, -35, -21, -9, -1, 4, 5, 5, 4, + 4, 3, 3, 3, 3, 2, 2, 1, 0, -1, -1, 1, 6, 10, 13, 15, + 15, 13, 11, 8, 5, 4, 4, 7, 11, 17, 22, 27, 32, 36, 39, 39, + 36, 24, 6, -20, -48, -70, -81, -79, -67, -48, -29, -12, -1, 5, 7, 7, + 4, 2, 1, 1, 2, 2, 3, 2, 2, -1, -2, -3, -3, -1, 3, 8, + 13, 16, 17, 16, 12, 8, 3, -1, -3, -2, 2, 11, 21, 29, 36, 38, + 39, 42, 48, 57, 52, 23, -27, -76, -107, -113, -98, -71, -42, -18, -1, 8, + 12, 13, 10, 7, 3, 1, 1, 2, 3, 2, 1, 0, -2, -3, -3, -1, + 2, 8, 13, 17, 18, 17, 12, 7, 1, -3, -4, -3, 20, 30, 38, 41, + 39, 38, 46, 65, 75, 45, -23, -89, -126, -127, -101, -64, -31, -7, 5, 11, + 13, 14, 13, 9, 4, 1, 0, 1, 2, 1, -1, -3, -4, -4, -2, 2, + 6, 10, 14, 18, 18, 15, 9, 1, -6, -10, -13, -10, -4, 7, 20, 0, + 14, 19, 23, 26, 28, 28, 26, 23, 18, 11, 3, -4, -10, -16, -21, -23, + -24, -22, -20, -16, -12, -8, -3, 3, 8, 13, 19, 23, 26, 27, 26, 23, + 17, 10, 4, -3, -9, -15, -20, -24, -25, -25, -22, -17, -11, -3, 3, 9, + 14, 18, 20, 22, 23, 23, 21, 17, 13, 6, 1, -6, -11, -15, -18, -20, + -19, -19, -17, -16, -13, -11, -8, -5, -1, 2, 5, 7, 9, 9, 8, 6, + 3, 0, -3, -7, -10, -14, -17, -19, -19, -18, -16, -12, -7, -2, 3, 8, + 13, 16, 18, 19, 17, 14, 8, -1, -11, -21, -31, -38, -41, -40, -34, -25, + -12, 2, 17, 32, 45, 56, 62, 65, 63, 58, 49, 38, 25, 10, -6, -18, + -28, -37, -44, -51, -59, -64, -64, -56, -40, -17, 7, 29, 46, 56, 58, 59, + 56, 51, 45, 33, 19, 4, -13, -26, -39, -49, -56, -59, -55, -46, -34, -19, + -4, 10, 21, 30, 40, 46, 51, 52, 49, 43, 31, 18, 5, -8, -16, -21, + -23, -26, -29, -35, -39, -42, -40, -34, -22, -11, 2, 11, 18, 21, 24, 23, + 22, 19, 14, 7, -3, -13, -21, -30, -39, -46, -50, -52, -49, -42, -31, -17, + -3, 12, 26, 39, 49, 57, 60, 58, 51, 39, 22, 1, -23, -47, -68, -82, + -89, -88, -77, -60, -37, -11, 16, 43, 65, 83, 94, 100, 101, 96, 87, 71, + 51, 29, 4, -18, -38, -58, -75, -91, -104, -109, -105, -87, -61, -27, 8, 39, + 67, 87, 97, 97, 88, 71, 54, 36, 16, -2, -23, -42, -57, -70, -75, -75, + -71, -60, -43, -23, -1, 18, 31, 47, 57, 66, 71, 68, 61, 49, 32, 17, + 1, -11, -22, -33, -41, -47, -54, -59, -63, -62, -57, -46, -30, -12, 1, 17, + 30, 41, 49, 50, 47, 40, 29, 17, 3, -14, -30, -46, -60, -70, -76, -77, + -73, -63, -48, -28, -4, 20, 44, 65, 81, 91, 93, 88, 77, 60, 37, 11, + -19, -49, -76, -97, -109, -110, -100, -81, -56, -25, 7, 38, 67, 91, 109, 121, + 127, 126, 116, 96, 68, 38, 8, -18, -43, -68, -90, -110, -124, -127, -116, -91, + -59, -22, 14, 47, 77, 98, 107, 105, 93, 74, 54, 33, 13, -6, -26, -45, + -60, -71, -78, -79, -74, -61, -42, -21, 1, 18, 33, 49, 60, 68, 73, 70, + 62, 48, 32, 15, 0, -13, -24, -34, -42, -48, -55, -61, -65, -65, -60, -48, + -32, -15, 2, 19, 32, 43, 50, 51, 47, 40, 28, 16, 1, -14, 2, -2, + 2, -5, -3, -1, 0, -4, -4, -6, -4, -6, -4, -4, -7, -6, -7, -6, + -1, 0, 3, 13, 14, 16, 12, 13, 2, 1, 0, -1, -1, -1, -2, -2, + -2, -3, -3, -4, -8, -4, -4, -5, -5, -5, -7, -9, -12, -8, -14, -11, + -14, -18, -8, 1, 31, 71, 68, 24, -5, -11, -7, -5, -5, -5, -3, -2, + -5, -5, -9, -8, -7, -7, -9, -12, -11, -17, -14, -16, -15, -20, -26, -30, + -27, -15, 16, 51, 87, 101, 70, 8, -18, -11, -14, -7, -7, -1, -2, -5, + -7, -12, -14, -10, -10, -13, -14, -13, -16, -16, -17, -18, -35, -31, -30, -34, + -9, 16, 56, 84, 89, 60, 30, 5, -7, -5, -8, -3, -4, -4, -6, -12, + -14, -13, -10, -12, -12, -9, -10, -8, -12, -13, -15, -19, -23, -26, -33, -29, + -28, -9, 12, 43, 71, 88, 72, 48, 29, -2, -16, -19, -12, -12, -12, -7, + -11, -10, -10, -10, -11, -13, -15, -18, -19, -17, -16, -15, -13, -12, -13, -9, + -13, -17, -21, -18, 2, 34, 59, 87, 92, 98, 38, -30, -24, -27, -18, -16, + -11, -11, -13, -15, -12, -14, -15, -18, -17, -20, -18, -15, -10, -7, -3, -1, + 2, -8, -11, -22, -22, -20, 7, 31, 61, 97, 106, 43, -23, -28, -25, -20, + -12, -7, -5, -7, -10, -13, -13, -13, -11, -14, -15, -15, -12, -8, -7, -4, + -2, -4, -10, -15, -19, -26, -10, 12, 42, 72, 101, 90, 20, -25, -27, -22, + -18, -10, -6, -9, -11, -16, -17, -16, -14, -10, -8, -9, -9, -9, -9, -9, + -8, -5, -3, -6, -10, -17, -24, -21, 4, 30, 61, 84, 96, 79, -16, -38, + -27, -26, -17, -12, -8, -12, -13, -14, -14, -11, -8, -4, -4, -7, -9, -8, + -10, -12, -8, -5, -4, -7, -10, -18, -24, -11, 14, 42, 70, 79, 93, 36, + -32, -26, -28, -19, -15, -9, -9, -13, -16, -14, -12, -8, -5, -3, -7, -9, + -9, -9, -11, -8, -5, -1, -6, -9, -15, -24, -23, 6, 28, 63, 86, 127, + 37, -45, -27, -28, -26, -19, -4, -5, -8, -11, -12, -14, -12, -8, -4, -8, + -8, -10, -8, -13, -8, -8, -3, -8, -8, -16, -23, -17, 7, 34, 69, 83, + 113, 37, -50, -28, -25, -22, -16, 0, -3, -8, -12, -12, -14, -14, -10, -5, + -7, -6, -9, -9, -13, -9, -10, -7, -9, -9, -15, -20, -14, 8, 33, 64, + 81, 90, 57, -29, -28, 0, -4, 10, 10, 11, -15, 4, -1, 3, -11, 11, + 2, -12, 3, 18, -10, -62, 89, -16, -95, 118, -128, 122, -128, 112, -100, 109, + -121, 120, -104, 58, 10, -88, 127, -102, 6, 98, -126, 35, 89, -111, -7, 112, + -53, -94, 92, 64, -106, -53, 109, 52, -100, -75, 86, 95, -45, -119, -12, 111, + 74, -58, -118, -27, 97, 100, -4, -107, -95, 17, 109, 92, -4, -99, -109, -26, + 78, 115, 66, -27, -104, -109, -41, 55, 112, 98, 32, -53, -109, -105, -44, 41, + 102, 109, 67, -4, -74, -112, -102, -47, 27, 88, 112, 93, 45, -19, -78, -110, + -105, -65, -4, 59, 101, 110, 87, 43, -13, -67, -103, -111, -89, -44, 13, 65, + 100, 109, 93, 59, 14, -36, -78, -104, -108, -90, -53, -6, 43, 83, 104, 106, + 88, 57, 17, -27, -66, -95, -108, -102, -80, -44, -2, 41, 77, 99, 106, 98, + 77, 46, 10, -29, -64, -91, -105, -105, -91, -64, -29, 10, 48, 78, 98, 105, + 100, 84, 59, 30, -3, -36, -65, -88, -101, -105, -99, -83, -60, -32, -1, 30, + 58, 80, 96, 103, 102, 94, 80, 62, 40, 16, -10, -35, -58, -78, -92, -101, + -104, -100, -91, -77, -58, -36, -13, 12, 36, 57, 75, 89, 98, 102, 102, 97, + 88, 76, 61, 44, 25, 5, -15, -35, -54, -70, -84, -94, -101, -104, -103, -98, + -89, -77, -63, -46, -27, -8, 12, 31, 49, 65, 79, 90, 97, 102, 104, 102, + 97, 90, 81, 70, 57, 42, 27, 10, -7, -24, -40, -56, -70, -81, -91, -99, + -103, -105, -105, -101, -95, -87, -76, -63, -49, -34, -18, -1, 16, 32, 48, 62, + 74, 85, 93, 100, 104, 105, 105, 102, 97, 90, 82, 72, 61, 48, 35, 21, + 6, -9, -24, -38, -52, -65, -76, -86, -94, -101, -105, -108, -108, -106, -102, -96, + -87, -78, -66, -54, -40, -26, -11, 4, 19, 34, 48, 61, 73, 83, 92, 99, + 104, 107, 108, 108, 105, 101, 96, 89, 80, 70, 60, 48, 36, 22, 9, -5, + -19, -33, -46, -58, -69, -80, -89, -96, -102, -107, -109, -110, -110, -107, -102, -97, + -89, -80, -70, -59, -47, -33, -20, -6, 7, 19, 30, 41, 50, 58, 65, 71, + 75, 78, 79, 80, 79, 77, 74, 70, 65, 60, 54, 48, 42, 36, 29, 22, + 16, 10, 4, -2, -7, -12, -16, -19, -22, -24, -26, -27, -27, -27, -26, -25, + -23, -22, -19, -17, -14, -12, -10, -1, -1, -4, -9, -9, -7, -6, -7, -3, + 4, 8, 10, 11, 13, 10, 4, -3, -10, -15, -13, -9, -10, -11, -5, 4, + 12, 14, 12, 13, 14, 9, 1, -8, -15, -21, -23, -22, -13, -3, 7, 17, + 24, 27, 19, 11, 16, 15, -5, -24, -29, -23, -27, -32, -21, 5, 18, 20, + 21, 24, 24, 15, 11, 8, -6, -30, -31, -19, -17, -24, -14, 2, 17, 15, + 12, 17, 16, 19, 8, -5, -2, -1, -17, -17, -3, 6, 5, -4, 0, 1, + -12, -9, 9, 11, -4, -14, -8, 9, -2, -21, -14, 4, 9, 9, 11, 18, + 21, 10, 8, 16, 10, 26, 35, 6, -14, -28, -25, -24, -55, -65, -33, -17, + 1, -6, -6, 8, 23, 33, 49, 37, 19, 16, 11, 24, 42, 17, -37, -36, + 3, 7, -23, -36, -9, 9, -12, -20, -8, -2, -4, -23, -17, -6, 0, 10, + 24, 24, 40, 46, 33, 39, 26, 5, 6, 9, -12, -26, -33, -42, -61, -52, + -43, -37, -21, -4, 7, 13, 28, 36, 31, 24, 1, -1, 20, 24, 23, 21, + 26, 27, 8, -32, -44, -3, 28, -1, -36, -30, -6, 13, -12, -34, -18, -6, + 9, 21, 25, 16, 10, 38, 62, 46, 17, -11, -7, 10, -8, -44, -53, -33, + -35, -38, -29, -27, -16, 0, 1, 9, 37, 50, 36, 2, -20, -12, 15, 21, + 24, 32, 29, 20, 23, 12, -8, -3, 4, -10, -5, 2, -19, -63, -70, -21, + 20, 41, 23, 33, 57, 61, 42, 21, 15, 10, -45, -82, -60, -29, -44, -77, + -50, -7, 4, -4, 10, 32, 56, 42, 1, -10, -18, 2, 22, 28, 33, 42, + 47, 43, 47, 11, -23, 0, 10, -40, -81, -70, -28, -29, -68, -29, 19, 6, + 7, 21, 40, 41, 32, 22, 28, 47, 69, 66, 35, 21, 15, -3, -20, -34, + -24, -6, -19, -59, -47, -42, -35, -28, 15, 45, 51, 66, 78, 83, 37, 1, + 13, 7, -51, -81, -92, -83, -87, -74, -58, -73, -51, 12, 35, 26, 35, 47, + 69, 70, 63, 65, 49, 47, 68, 73, 52, 33, 15, -12, -30, -50, -51, -46, + -45, -60, -50, -50, -50, -54, -24, 38, 78, 90, 106, 99, 40, -6, -11, -46, + -110, -127, -107, -76, -67, -53, -41, -41, -23, 14, 33, 27, 34, 49, 70, 71, + 66, 65, 51, 51, 69, 72, 52, 32, 10, -12, 0, -5, -2, -5, 2, -29, + 22, 0, -27, 67, -59, 45, -13, -37, 28, 65, -4, 6, 60, 5, 58, 44, + 60, 27, 43, 96, 71, 81, 48, 96, 70, 23, 90, 66, 80, 88, 40, 20, + 61, 64, 12, 36, 24, 4, 7, 5, -27, -38, -26, -33, -49, -50, -70, -69, + -93, -92, -94, -104, -104, -101, -110, -107, -111, -111, -126, -87, -119, -100, -94, -112, + -93, -93, -80, -81, -76, -58, -56, -70, -30, -21, -42, -13, -3, 2, 8, 20, + 28, 41, 45, 59, 62, 69, 84, 85, 90, 103, 109, 111, 118, 121, 121, 123, + 121, 122, 121, 122, 121, 122, 121, 121, 120, 121, 120, 121, 120, 121, 120, 120, + 119, 120, 119, 120, 118, 105, 106, 110, 83, 89, 92, 75, 67, 61, 57, 47, + 40, 33, 24, 17, 10, 3, -2, -10, -20, -31, -31, -37, -49, -50, -63, -66, + -69, -74, -79, -91, -89, -92, -95, -102, -106, -104, -107, -113, -113, -110, -113, -116, + -114, -115, -114, -115, -114, -113, -114, -113, -114, -113, -112, -113, -109, -105, -111, -106, + -107, -103, -100, -103, -99, -97, -98, -99, -92, -92, -93, -92, -92, -90, -88, -90, + -88, -86, -89, -85, -85, -87, -85, -85, -82, -83, -82, -80, -78, -79, -76, -74, + -73, -73, -69, -68, -66, -64, -65, -62, -58, -56, -56, -52, -50, -47, -43, -42, + -39, -35, -33, -31, -27, -23, -21, -16, -16, -8, -7, -3, 1, 0, 10, 15, + 15, 19, 26, 29, 30, 38, 41, 42, 47, 54, 54, 57, 63, 68, 69, 72, + 77, 78, 80, 85, 84, 86, 87, 86, 87, 86, 85, 86, 85, 84, 85, 84, + 83, 84, 83, 82, 82, 83, 82, 81, 82, 81, 80, 81, 80, 79, 80, 79, + 79, 78, 79, 78, 78, 77, 74, 70, 66, 64, 61, 55, 52, 49, 45, 40, + 35, 32, 29, 24, 19, 15, 12, 8, 4, 0, -4, -8, -11, -15, -17, -20, + -25, -26, -29, -32, -34, -37, -39, -41, -43, -45, -46, -48, -49, -50, -50, -52, + -52, -53, -52, -53, -54, -53, -53, -52, -52, -51, -50, -50, -49, -48, -48, -46, + -45, -44, -42, -41, -40, -39, -37, -35, -34, -32, -30, -28, -27, -24, -23, -22, + -20, -19, -17, -15, -14, -13, -12, -10, -9, -8, -8, -6, -6, -5, -4, -4, + -3, -3, -2, -2, -1, -2, -1, -2, -1, -1, 0, -1, -1, 1, 0, 0, + -3, -1, 1, -4, -4, -3, -2, -5, -3, 0, -1, -1, -3, -1, 0, 2, + 0, -2, -5, 5, 4, 1, 7, 2, 2, 1, 8, 1, 6, 2, -4, 2, + 1, -4, 6, -8, -3, -7, -2, -6, -1, -9, 1, -2, -4, 1, 2, 1, + -2, 8, 2, 0, 14, 9, 10, 5, 3, 5, 6, 4, 3, -8, -2, -4, + -10, -1, -5, -3, -4, -6, -13, -5, -4, -4, -3, 2, -13, -6, 3, 6, + 6, 7, 1, 1, 6, 6, 16, 13, 9, 10, 9, 2, 7, 10, 4, -4, + -3, -17, -7, -6, -6, -10, -17, -17, -10, -11, -9, -5, -6, -8, 2, 1, + 8, 19, 15, 18, 24, 19, 16, 17, 19, 11, 7, 1, -5, -8, -9, -15, + -8, -9, -14, -20, -19, -9, -18, -10, -13, -23, -13, -12, -7, 0, -1, 5, + 16, 12, 28, 30, 32, 34, 34, 19, 24, 23, 16, 11, 5, -7, -19, -17, + -16, -21, -26, -23, -32, -31, -30, -25, -26, -24, -19, -13, -9, -1, 0, 4, + 6, 13, 15, 19, 17, 13, 8, 8, 8, 7, 0, -4, -8, -10, -7, -5, + -6, -6, -9, -12, -8, -10, -9, -9, -11, -13, -12, -9, -4, -1, 4, 9, + 19, 27, 31, 26, 16, 14, 16, 16, 12, 1, -8, -14, -11, -9, -6, -11, + -11, -12, -14, -10, -11, -13, -15, -19, -23, -19, -14, -8, -5, -1, 8, 34, + 62, 59, 12, 14, 32, 22, 6, 20, 6, -9, -54, -16, -1, -19, 7, -15, + -13, -12, -14, -15, -14, -22, -24, -30, -30, -20, -12, -6, 3, 26, 66, 88, + 39, 0, 47, 36, -2, 26, -23, 21, 13, -6, -60, -42, 6, -22, 4, -18, + -16, -4, -16, -19, -24, -39, -31, -25, -32, -26, -11, 12, 55, 104, 75, 10, + 35, 62, 9, 26, -16, -8, 19, 3, -9, -61, -46, 2, -26, -7, -16, -10, + 2, -7, -22, -23, -38, -40, -37, -44, -33, -8, 37, 101, 124, 36, -5, 89, + 20, 38, 5, -26, 3, 1, 5, -28, -65, -21, 1, -22, -12, -26, 1, -7, + -10, -24, -26, -33, -37, -48, -50, -36, 5, 63, 122, 109, 7, 35, 84, 5, + 59, -36, -4, -11, -1, -5, -40, -55, -4, -15, -21, -16, -22, 5, -10, -17, + -20, -27, -23, -44, -54, -62, -23, 29, 114, 127, 51, 7, -2, -4, -2, 4, + 11, 14, 10, 2, -7, -9, -9, -15, -16, -7, 3, 2, -10, -21, -17, 6, + 10, -8, -28, -11, 45, 66, 64, 47, 36, 49, 49, 27, 9, -12, -18, -25, + -30, -11, 0, -5, 0, -1, -18, -36, -33, -18, -10, -13, -31, -26, -25, -17, + 4, 28, 70, 89, 48, 9, -32, -58, -56, -70, -57, -17, -38, -48, -35, -32, + -7, 35, 38, 53, 62, 44, 33, 27, -6, -35, -52, -65, -54, -40, -43, -30, + -25, 2, 63, 54, 34, 17, 34, 70, 60, 8, -15, -3, 0, 39, 55, 35, + 39, 60, 75, 36, 20, -7, -25, -66, -110, -89, -89, -71, -36, -12, 9, 31, + 41, 54, 46, 45, 59, 41, 22, 3, -69, -110, -126, -116, -64, -15, 9, 29, + 33, 30, 56, 42, 12, 23, 6, -27, -36, -21, -22, -32, -21, -30, -29, -5, + 9, 16, 22, -9, -12, 31, 24, -17, -41, -23, 32, 32, 26, 34, 64, 66, + 109, 104, 51, 5, 12, 16, -36, -58, -59, -66, -63, -82, -64, -23, -9, 11, + 16, 20, 19, 13, 12, 33, 37, 41, 46, 28, 7, -58, -93, -79, -64, -33, + -1, 22, -4, 2, 19, 4, -7, -3, -3, 5, 1, -10, -3, 12, -6, -38, + -29, -17, -5, 11, 2, -33, -20, 44, 42, 20, -30, -24, 9, 44, 38, 20, + 36, 71, 61, 86, 72, 25, -8, 10, 17, -35, -54, -63, -67, -70, -78, -58, + -16, -7, 19, 22, 20, 21, 29, 21, 16, 35, 36, 16, -8, -27, -61, -58, + -67, -43, 3, 35, 38, -2, -2, 10, -9, -29, -14, -5, -1, -5, 2, 12, + -6, -32, -23, -22, -16, -5, 3, -9, -29, 27, 56, 39, 11, -27, -28, 23, + 34, 28, 18, 20, 62, 82, 71, 74, 24, -4, 16, 18, -39, -54, -65, -61, + -52, -64, -49, -11, -4, 12, 17, 16, 25, 24, 6, 23, 36, 18, 18, -1, + -42, -50, -90, -43, 3, 35, 38, -2, -2, 10, -9, -29, -14, -5, -1, -5, + 2, 12, -6, -32, -23, -22, -16, -5, 3, -9, -29, 27, 56, 39, 11, -27, + -28, 23, 34, 28, 18, 20, 62, 82, 71, 74, 24, -4, 16, 18, -39, -54, + -65, -61, -52, -64, -49, -11, -4, 12, 17, 16, 25, 24, 6, 23, 36, 18, + 18, -1, -42, -50, -90, -43, 0, 1, 6, -11, 19, -25, 24, -15, 11, -6, + 1, 9, -6, -3, 11, -18, 28, -23, 8, 6, -2, -1, 0, -5, 18, -23, + 24, -28, 27, -12, -1, -2, 6, 4, -14, 19, -29, 42, -40, 22, -6, -3, + 14, -16, 4, 8, -9, 13, -22, 17, 5, -24, 37, -34, 20, -4, -11, 19, + -20, 21, -16, 1, 17, -17, 5, -9, 25, -31, 31, -40, 32, -11, -7, 4, + -4, 13, -23, 29, -40, 51, -49, 20, 3, -20, 38, -47, 34, -21, 14, -9, + 4, -13, 20, -29, 37, -57, 59, -48, 23, -5, -7, 5, -6, -5, 13, -17, + 9, -4, -12, 22, -19, -8, 10, -5, -7, 8, -18, 19, -13, 5, -12, 6, + -10, 18, -40, 66, -91, 82, -56, 17, 19, -51, 56, -45, 30, -19, 5, -6, + 7, -9, -4, -2, -5, 13, -19, 1, 20, -28, 13, -6, 0, -17, 33, -48, + 38, -16, -20, 53, -75, 75, -61, 30, -12, -9, 2, 5, -9, -7, 15, -17, + 9, 4, -46, 70, -85, 86, -67, 29, 18, -60, 76, -70, 29, -8, -1, 1, + 14, -58, 93, -118, 127, -125, 85, -36, -2, 17, -39, 46, -61, 70, -99, 122, + -120, 56, 15, -85, 116, -101, 30, 43, -108, 127, -122, 72, -38, -3, 20, -31, + 29, -37, 42, -50, 63, -72, 40, -7, -46, 66, -82, 53, -25, 1, 1, -1, + -3, 3, -24, 24, -34, 27, -24, 36, -49, 37, -38, 35, -42, 13, -4, -14, + 14, -29, 42, -58, 58, -60, 41, -39, 27, -35, 27, -32, 25, -37, 43, -50, + 32, -20, -4, 4, -14, 16, -43, 66, -93, 79, -58, 27, -11, -21, 34, -40, + 24, -7, -25, 31, -29, 19, -18, -2, 1, -6, 4, -31, 47, -63, 62, -64, + 32, 2, -29, 23, -21, 19, -41, 59, -76, 62, -52, 26, -11, -1, -10, 6, + -10, -7, 17, -42, 34, -12, -34, 73, -106, 92, -61, 26, -24, 8, -7, -2, + 3, -24, 31, -44, 27, -9, -22, 38, -43, 15, -4, -3, -2, -12, 5, 1, + -7, 7, -25, 17, -17, 4, -15, 27, -40, 34, -18, 6, -13, 12, -3, -9, + -6, 8, -18, 18, -36, 54, -55, 30, -25, 26, -41, 38, -49, 48, -38, 8, + 16, -40, 47, -52, 34, -12, -4, 2, -13, 0, 1, 6, -11, 19, -25, 24, + -15, 11, -6, 1, 9, -6, -3, 11, -18, 28, -23, 8, 6, -2, -1, 0, + -5, 18, -23, 24, -28, 27, -12, -1, -2, 6, 4, -14, 19, -29, 42, -40, + 22, -6, -3, 14, -16, 4, 8, -9, 13, -22, 17, 5, -24, 37, -34, 20, + -4, -11, 19, -20, 21, -16, 1, 17, -17, 5, -9, 25, -31, 31, -40, 32, + -11, -7, 4, -4, 13, -23, 29, -40, 51, -49, 20, 3, -20, 38, -47, 34, + -21, 14, -9, 4, -13, 20, -29, 37, -57, 59, -48, 23, -5, -7, 5, -6, + -5, 13, -17, 9, -4, -12, 22, -19, -8, 10, -5, -7, 8, -18, 19, -13, + 5, -12, 6, -10, 18, -40, 66, -91, 82, -56, 17, 19, -51, 56, -45, 30, + -19, 5, -6, 7, -9, -4, -2, -5, 13, -19, 1, 20, -28, 13, -6, 0, + -17, 33, -48, 38, -16, -20, 53, -75, 75, -61, 30, -12, -9, 2, 5, -9, + -7, 15, -17, 9, 4, -46, 70, -85, 86, -67, 29, 18, -60, 76, -70, 29, + -8, -1, 1, 14, -58, 93, -118, 127, -125, 85, -36, -2, 17, -39, 46, -61, + 70, -99, 122, -120, 56, 15, -85, 116, -101, 30, 43, -108, 127, -122, 72, -38, + -3, 20, -31, 29, -37, 42, -50, 63, -72, 40, -7, -46, 66, -82, 53, -25, + 1, 1, -1, -3, 3, -24, 24, -34, 27, -24, 36, -49, 37, -38, 35, -42, + 13, -4, -14, 14, -29, 42, -58, 58, -60, 41, -39, 27, -35, 27, -32, 25, + -37, 43, -50, 32, -20, -4, 4, -14, 16, -43, 66, -93, 79, -58, 27, -11, + -21, 34, -40, 24, -7, -25, 31, -29, 19, -18, -2, 1, -6, 4, -31, 47, + -63, 62, -64, 32, 2, -29, 23, -21, 19, -41, 59, -76, 62, -52, 26, -11, + -1, -10, 6, -10, -7, 17, -42, 34, -12, -34, 73, -106, 92, -61, 26, -24, + 8, -7, -2, 3, -24, 31, -44, 27, -9, -22, 38, -43, 15, -4, -3, -2, + -12, 5, 1, -7, 7, -25, 17, -17, 4, -15, 27, -40, 34, -18, 6, -13, + 12, -3, -9, -6, 8, -18, 18, -36, 54, -55, 30, -25, 26, -41, 38, -49, + 48, -38, 8, 16, -40, 47, -52, 34, -12, -4, 2, -13, -1, -2, -1, -4, + -3, -25, -41, 8, 16, 27, 2, 16, 1, 13, 21, -8, -6, -29, 17, 8, + 8, 20, -13, 5, 4, 25, 17, 30, 22, 14, 15, 19, 7, 51, -16, -15, + -32, -13, 12, -8, -17, -49, -27, -29, -29, -52, -66, -55, -32, -20, -41, -21, + -36, -11, -16, 22, 3, 19, 0, -6, -10, 0, -38, -17, -35, -19, -27, 0, + -35, -27, -9, -17, -14, -2, 20, 50, 63, 57, 49, 70, 70, 97, 81, 68, + 52, 78, 93, 98, 102, 56, 34, 20, 53, 60, 45, 24, -18, 21, -10, 0, + -38, -79, -38, -37, -13, -27, -41, -50, -51, 14, 10, 16, -21, -13, -22, -20, + -48, -53, -55, -66, -76, -65, -91, -105, -92, -87, -101, -79, -56, -34, -7, -4, + 7, 20, 15, 26, 29, 32, -8, 36, 47, 50, 66, 29, 18, -33, -11, -4, + -10, -24, -42, -31, -22, 2, -23, -75, -34, -36, 5, 1, 1, -17, -47, 20, + 43, 68, 28, 30, 9, 29, 7, -9, -5, -32, -46, -36, -15, -40, -35, -15, + -26, -21, 2, 21, 49, 62, 83, 87, 106, 77, 97, 94, 67, 60, 85, 79, + 110, 80, 61, 1, 8, 16, 50, 36, 2, -22, 4, -2, 21, -35, -33, -19, + 4, 24, 19, 10, -58, -23, 18, 45, 34, 8, -12, -6, -5, -48, -51, -75, + -72, -77, -37, -65, -80, -57, -66, -68, -38, -38, 2, 10, 38, 31, 58, 22, + 39, 37, 27, -9, 23, 9, 35, 18, 15, -31, -50, -44, -5, 6, -10, -63, + -41, -56, -15, -41, -71, -45, -37, 7, -6, 5, -56, -71, -6, 21, 41, 8, + -13, -14, -40, -30, -41, -40, -56, -31, -31, -9, -15, -5, 10, 42, 27, 73, + 82, 73, 73, 79, 70, 38, 28, 31, 23, 45, 42, 44, 30, -40, 8, 28, + 52, 30, -18, -29, -40, -14, -45, -50, -55, -68, -39, -6, -29, -45, -59, -32, + 4, 31, 23, 16, 20, 11, -1, 1, -28, -45, -53, -56, -67, -60, -55, -40, + -31, -25, -16, 11, 20, 36, 67, 70, 75, 77, 81, 65, 46, 38, 34, 39, + 51, 44, 57, 7, -4, 13, 37, 46, 19, -8, -29, -1, -9, -21, -32, -43, + -55, -58, -40, -8, 15, 29, 38, 44, 59, 63, 51, 20, -20, -47, -61, -58, + -48, -42, -43, -35, -15, 15, 41, 55, 61, 62, 70, 67, 45, 11, -31, -62, + -80, -78, -71, -62, -54, -39, -15, 18, 50, 68, 79, 83, 92, 88, 57, 16, + -31, -71, -94, -95, -90, -83, -71, -55, -28, 7, 49, 77, 93, 100, 109, 107, + 78, 36, -20, -71, -99, -104, -100, -92, -83, -69, -43, -5, 42, 79, 100, 108, + 114, 112, 90, 51, -9, -65, -100, -110, -105, -95, -87, -76, -52, -11, 35, 75, + 100, 107, 111, 106, 90, 52, -4, -60, -97, -109, -99, -87, -80, -65, -35, 5, + 43, 75, 91, 95, 93, 87, 71, 31, -19, -64, -93, -99, -88, -76, -66, -44, + -9, 28, 59, 79, 84, 80, 71, 59, 35, -5, -45, -76, -96, -95, -77, -59, + -39, -9, 28, 61, 86, 98, 93, 74, 52, 28, -6, -43, -72, -94, -108, -99, + -77, -52, -20, 19, 56, 84, 106, 115, 106, 79, 45, 3, -40, -74, -93, -108, + -112, -100, -79, -46, -1, 45, 78, 100, 113, 118, 108, 81, 39, -19, -67, -93, + -103, -108, -104, -94, -74, -32, 19, 61, 88, 102, 108, 109, 100, 73, 21, -44, + -87, -102, -104, -97, -90, -78, -49, 0, 46, 78, 90, 92, 89, 87, 77, 43, + -15, -72, -101, -104, -93, -79, -69, -47, -3, 47, 84, 96, 89, 74, 65, 58, + 37, -7, -61, -99, -110, -101, -82, -62, -38, 2, 49, 92, 112, 106, 82, 59, + 41, 18, -19, -61, -95, -111, -110, -98, -74, -39, 6, 54, 99, 122, 123, 104, + 79, 50, 12, -32, -72, -100, -111, -110, -106, -90, -54, -4, 49, 99, 123, 126, + 113, 95, 69, 24, -27, -72, -102, -114, -109, -104, -94, -64, -16, 36, 87, 116, + 121, 111, 97, 76, 36, -15, -61, -94, -110, -108, -98, -86, -60, -19, 29, 77, + 104, 109, 99, 86, 67, 35, -7, -47, -82, -98, -101, -92, -77, -48, -14, 25, + 67, 92, 95, 83, 66, 45, 18, -9, -37, -62, -77, -81, -78, -54, -16, 0, + 0, 0, 12, -10, 16, -14, -18, 17, -31, -2, 3, -19, -8, 17, 28, 37, + 31, -1, -25, -16, -47, -13, -43, -22, 6, 34, 41, 49, 41, 27, 6, -33, + -62, -54, -59, -32, -13, 29, 53, 73, 60, 54, 16, -19, -58, -77, -89, -42, + -46, 17, 55, 78, 86, 81, 33, -3, -35, -84, -110, -75, -70, 0, 39, 78, + 92, 105, 70, 13, -15, -82, -107, -103, -84, -41, 20, 81, 85, 127, 86, 39, + -4, -63, -103, -99, -107, -69, 2, 68, 82, 127, 84, 58, 28, -44, -88, -104, + -108, -83, -13, 29, 69, 116, 87, 77, 40, -16, -65, -89, -104, -89, -40, -1, + 47, 96, 90, 85, 52, 9, -38, -62, -96, -95, -62, -22, 21, 73, 78, 86, + 65, 35, -15, -41, -80, -92, -69, -48, 1, 43, 65, 80, 73, 49, 8, -23, + -59, -75, -74, -60, -22, 17, 49, 69, 65, 60, 25, -1, -36, -59, -70, -61, + -40, -9, 30, 52, 57, 63, 37, 17, -12, -41, -61, -57, -50, -30, 9, 30, + 49, 60, 47, 28, 6, -20, -49, -51, -53, -42, -11, 13, 34, 53, 50, 34, + 18, -3, -35, -39, -52, -49, -23, 0, 18, 41, 47, 36, 31, 10, -21, -28, + -43, -49, -31, -13, 2, 28, 39, 35, 38, 19, -7, -18, -33, -42, -36, -26, + -12, 19, 30, 34, 36, 22, 6, -5, -25, -38, -36, -29, -17, 8, 19, 26, + 35, 28, 12, 3, -17, -30, -29, -29, -22, -3, 9, 19, 33, 26, 14, 8, + -9, -18, -22, -28, -25, -9, 3, 15, 22, 20, 18, 12, 1, -11, -22, -24, + -21, -13, -3, 8, 11, 20, 21, 12, 5, -6, -19, -16, -17, -17, -7, 3, + 8, 20, 17, 7, 7, -2, -11, -13, -16, -17, -5, 2, 5, 12, 13, 8, + 6, 3, -9, -11, -9, -14, -5, 1, -3, 6, 11, 6, 7, 2, -6, -4, + -4, -10, -6, -3, -4, 5, 8, 2, 5, 4, -2, 0, -3, -9, -4, -3, + -3, 2, 3, 0, 6, 4, 0, -1, -2, -2, 0, 0, 0, 12, -10, 16, + -14, -18, 17, -31, -2, 3, -19, -8, 17, 28, 37, 31, -1, -25, -16, -47, + -13, -43, -22, 6, 34, 41, 49, 41, 27, 6, -33, -62, -54, -59, -32, -13, + 29, 53, 73, 60, 54, 16, -19, -58, -77, -89, -42, -46, 17, 55, 78, 86, + 81, 33, -3, -35, -84, -110, -75, -70, 0, 39, 78, 92, 105, 70, 13, -15, + -82, -107, -103, -84, -41, 20, 81, 85, 127, 86, 39, -4, -63, -103, -99, -107, + -69, 2, 68, 82, 127, 84, 58, 28, -44, -88, -104, -108, -83, -13, 29, 69, + 116, 87, 77, 40, -16, -65, -89, -104, -89, -40, -1, 47, 96, 90, 85, 52, + 9, -38, -62, -96, -95, -62, -22, 21, 73, 78, 86, 65, 35, -15, -41, -80, + -92, -69, -48, 1, 43, 65, 80, 73, 49, 8, -23, -59, -75, -74, -60, -22, + 17, 49, 69, 65, 60, 25, -1, -36, -59, -70, -61, -40, -9, 30, 52, 57, + 63, 37, 17, -12, -41, -61, -57, -50, -30, 9, 30, 49, 60, 47, 28, 6, + -20, -49, -51, -53, -42, -11, 13, 34, 53, 50, 34, 18, -3, -35, -39, -52, + -49, -23, 0, 18, 41, 47, 36, 31, 10, -21, -28, -43, -49, -31, -13, 2, + 28, 39, 35, 38, 19, -7, -18, -33, -42, -36, -26, -12, 19, 30, 34, 36, + 22, 6, -5, -25, -38, -36, -29, -17, 8, 19, 26, 35, 28, 12, 3, -17, + -30, -29, -29, -22, -3, 9, 19, 33, 26, 14, 8, -9, -18, -22, -28, -25, + -9, 3, 15, 22, 20, 18, 12, 1, -11, -22, -24, -21, -13, -3, 8, 11, + 20, 21, 12, 5, -6, -19, -16, -17, -17, -7, 3, 8, 20, 17, 7, 7, + -2, -11, -13, -16, -17, -5, 2, 5, 12, 13, 8, 6, 3, -9, -11, -9, + -14, -5, 1, -3, 6, 11, 6, 7, 2, -6, -4, -4, -10, -6, -3, -4, + 5, 8, 2, 5, 4, -2, 0, -3, -9, -4, -3, -3, 2, 3, 0, 6, + 4, 0, -1, -2, -2, 0, -1, -1, -3, -7, -14, -23, -32, -45, -55, -66, + -74, -83, -88, -80, -77, -71, -64, -54, -46, -37, -31, -25, -19, -12, -6, -1, + 4, 8, 12, 17, 21, 23, 25, 25, 27, 29, 32, 35, 36, 34, 32, 31, + 32, 35, 37, 37, 35, 31, 29, 29, 31, 33, 34, 32, 29, 26, 25, 27, + 30, 32, 31, 29, 27, 27, 29, 31, 34, 35, 35, 35, 36, 38, 41, 43, + 45, 47, 49, 52, 55, 57, 59, 61, 63, 66, 69, 70, 70, 68, 66, 63, + 61, 58, 54, 47, 36, 24, 11, 1, -9, -20, -33, -48, -64, -78, -89, -97, + -103, -110, -116, -123, -128, -128, -126, -121, -116, -112, -107, -102, -95, -88, -78, -69, + -61, -54, -47, -41, -34, -27, -21, -16, -12, -7, -2, 2, 5, 6, 8, 10, + 13, 16, 19, 19, 19, 17, 18, 19, 22, 24, 24, 22, 19, 18, 19, 21, + 23, 24, 22, 19, 17, 18, 20, 22, 24, 24, 22, 21, 22, 24, 27, 29, + 30, 30, 31, 32, 35, 37, 40, 42, 45, 47, 50, 53, 56, 58, 60, 62, + 66, 68, 70, 69, 68, 65, 63, 61, 59, 54, 46, 36, 24, 13, -1, -14, + -28, -43, -57, -68, -78, -86, -94, -102, -109, -114, -117, -117, -115, -112, -109, -106, + -101, -96, -89, -81, -73, -67, -59, -53, -46, -40, -34, -28, -23, -18, -13, -9, + -5, -2, 0, 2, 5, 7, 10, 12, 14, 15, 15, 15, 16, 18, 19, 20, + 20, 19, 18, 18, 19, 21, 22, 22, 21, 20, 19, 21, 23, 24, 25, 25, + 25, 25, 26, 29, 31, 33, 34, 35, 36, 38, 40, 43, 46, 48, 51, 53, + 56, 59, 62, 65, 68, 71, 74, 77, 78, 79, 78, 77, 76, 74, 71, 66, + 58, 49, 39, 28, 17, 6, -6, -20, -35, -50, -64, -75, -85, -94, -102, -110, + -117, -122, -124, -123, -121, -118, -114, -110, -106, -99, -92, -84, -76, -69, -61, -55, + -48, -41, -34, -29, -23, -18, -13, -9, -5, -2, 0, -1, -1, 0, 2, 0, + 3, 2, 2, 4, 5, 4, 4, 4, 4, 5, 3, 4, 3, 1, 2, 0, + 0, -1, -3, -4, -2, -3, -5, -3, -4, -5, -5, -4, -3, -3, -6, -5, + -4, -2, -5, -5, -2, -3, -3, -3, 1, 4, 4, 8, 8, 8, 13, 12, + 13, 14, 12, 9, 8, 6, 6, 3, -2, -2, -5, -5, -4, -5, -11, -16, + -12, -7, -3, -5, -10, -11, -6, -2, -2, -1, -4, -6, -6, -7, -8, -5, + -2, 2, 5, 6, 8, 8, 9, 13, 16, 16, 14, 11, 7, 5, 4, 2, + 0, -2, -3, -3, 0, -3, -13, -28, -11, 7, -1, -15, -1, -5, -18, -10, + 6, 11, -11, -1, -10, -14, -13, -13, -4, 4, 6, 14, 13, 10, 10, 15, + 17, 24, 24, 13, 12, 10, 1, 0, 2, -4, 0, -6, 2, 7, -22, -68, + 2, 35, -40, 14, -24, -3, -10, -9, -20, -3, 28, 2, -9, -12, -28, -19, + -4, -1, 15, 17, 17, 16, 12, 16, 22, 25, 28, 6, 17, 9, -1, -2, + -3, 2, 12, -6, 6, -5, -35, -89, 32, 28, -39, 20, -36, 9, -20, -9, + -34, 3, 34, 8, -16, -11, -37, -15, -3, 0, 26, 18, 13, 15, 13, 25, + 27, 29, 20, 3, 21, 2, -2, 0, -8, 11, 16, -1, 8, -21, -76, -81, + 87, -25, 4, -4, -23, 6, -26, -20, -35, 23, 28, 0, -18, -16, -43, 2, + -9, 17, 25, 15, 9, 18, 17, 37, 28, 35, 3, 14, 12, -5, -1, -1, + -5, 27, 0, 16, -11, -49, -128, 36, 40, -36, 35, -41, 21, -27, -14, -45, + 4, 24, 20, -23, -6, -41, -9, -1, 6, 23, 19, 5, 15, 14, 33, 35, + 40, 16, 5, 16, -3, -5, 4, -12, 24, 10, 18, 1, -38, -128, -21, 72, + -50, 42, -38, 19, -16, -16, -43, -10, 21, 24, -22, -11, -30, -15, 6, 4, + 22, 18, 6, 11, 13, 27, 39, 42, 22, 4, -3, -2, -2, -5, -3, -5, + -3, -2, -6, -5, -5, -6, -5, -3, -5, -3, -5, -4, -6, -3, -1, -2, + -1, 0, -2, 1, 2, 1, 4, 4, 5, 5, 5, 8, 10, 11, 9, 10, + 11, 8, 5, 10, 7, 5, 5, 0, -3, 1, 0, -5, -2, -8, -9, -7, + -7, -5, -9, -11, -9, -8, -8, -7, -9, -7, -6, -7, -5, -6, -5, -3, + -3, -3, -4, -4, -2, 0, 1, 2, 5, 9, 12, 16, 19, 22, 22, 24, + 22, 22, 19, 13, 11, 7, 7, 4, -2, -7, -9, -9, -8, -10, -14, -14, + -15, -15, -13, -14, -17, -18, -14, -12, -12, -8, -9, -7, -6, -6, -6, -8, + -9, -9, -11, -13, -11, -6, -1, 3, 9, 20, 27, 33, 37, 46, 46, 42, + 37, 28, 21, 14, 11, 10, 14, 20, -2, -40, -47, -22, -5, -4, -1, 4, + -15, -53, -56, -7, -33, -14, -2, -19, -7, -8, -15, -6, -9, -8, -3, -9, + -15, -18, -26, -19, -6, -5, -6, 0, 12, 22, 29, 30, 28, 32, 29, 21, + 15, 13, 5, 5, 3, 19, 30, 3, -68, -26, 2, -17, 17, -12, 15, -1, + -12, -48, -43, -19, -1, 3, 6, -8, -4, -10, -10, -4, 0, -6, -1, -7, + -9, -17, -12, -6, -9, -14, -5, 14, 33, 33, 41, 32, 41, 35, 20, 10, + 8, 4, 10, -2, 36, 40, 3, -110, -8, -7, -6, 16, -18, 27, -2, -4, + -56, -57, -33, 16, -2, 12, -11, -5, -17, -9, -5, 10, -6, 0, -12, -11, + -20, -10, -8, -12, -17, -3, 17, 38, 34, 45, 36, 51, 37, 18, 4, -3, + 3, 8, 8, 54, 48, -34, -128, 28, -33, 28, -13, 1, 21, 3, -20, -59, + -65, -10, 17, -1, 7, -17, -10, -19, -8, 5, 11, -4, -2, -16, -17, -20, + -9, -11, -18, -11, 3, 31, 36, 41, 41, 44, 53, 30, 10, 1, -13, 12, + -5, 42, 63, 43, -127, -55, 19, -27, 28, -1, 0, 3, 5, 8, 12, 14, + 15, 15, 14, 12, 8, 5, 1, -3, -9, -14, -17, -19, -18, -16, -12, -8, + -5, -4, -2, -1, -1, -2, -3, -4, -3, -2, -1, -1, 0, 0, 0, 2, + 8, 12, 16, 19, 23, 26, 34, 40, 39, 28, 11, -8, -26, -36, -40, -39, + -35, -27, -19, -10, -5, -6, -10, -12, -15, -14, -12, -9, -5, -3, -1, 1, + 6, 8, 7, 7, 7, 8, 13, 20, 28, 35, 43, 48, 55, 57, 51, 32, + 3, -29, -56, -68, -67, -60, -46, -31, -17, -7, -4, -7, -11, -15, -16, -15, + -10, -5, -1, 1, 3, 5, 7, 9, 11, 12, 12, 10, 13, 19, 26, 36, + 43, 51, 58, 65, 61, 40, 6, -30, -60, -75, -73, -64, -49, -32, -16, -5, + -1, -4, -11, -18, -23, -23, -19, -12, -5, 2, 8, 12, 13, 11, 9, 8, + 8, 10, 15, 21, 27, 32, 37, 42, 49, 55, 63, 55, 32, -3, -39, -66, + -79, -73, -56, -39, -24, -12, -7, -7, -12, -19, -24, -24, -21, -14, -6, 3, + 8, 11, 12, 11, 10, 10, 10, 11, 14, 17, 21, 27, 33, 41, 49, 56, + 63, 66, 49, 15, -27, -61, -82, -85, -73, -52, -33, -18, -9, -5, -7, -12, + -18, -21, -20, -15, -9, -1, 4, 8, 12, 15, 15, 14, 11, 8, 7, 10, + 15, 22, 32, 45, 59, 72, 86, 95, 75, 22, -40, -93, -119, -120, -97, -64, + -32, -9, 5, 9, 5, -3, -14, -21, -23, -20, -13, -5, 4, 12, 17, 18, + 15, 10, 7, 4, 3, 6, 9, 15, 21, 30, 40, 56, 77, 99, 99, 54, + -19, -86, -123, -127, -103, -66, -27, 1, 16, 18, 11, -1, -12, -21, -23, -21, + -16, -8, 1, 9, 16, 19, 16, 11, 8, 5, 5, 7, 9, 14, 19, 27, + 35, 49, 68, 90, 101, 73, 6, -66, -114, -128, -113, -78, -39, -6, 13, 19, + 11, -1, 0, 10, 30, 35, 40, 39, 37, 28, 18, 6, -9, -20, -30, -35, + -33, -30, -28, -23, -24, -23, -19, -20, -15, -11, -8, -3, 0, 1, 0, -2, + -4, -1, 0, 10, 15, 21, 27, 25, 25, 22, 13, 10, -5, -9, -15, -19, + -17, -17, -12, -7, 0, 4, 10, 8, 5, -5, -13, -23, -31, -30, -24, -13, + 11, 36, 62, 81, 83, 78, 54, 35, 19, -11, -29, -49, -57, -47, -35, -20, + -19, -26, -27, -33, -30, -26, -22, -11, -8, 3, 11, 6, 0, -16, -23, -23, + -11, 9, 23, 35, 45, 51, 46, 49, 26, 12, -13, -26, -37, -45, -31, -35, + -17, -4, 8, 23, 24, 23, 9, -10, -22, -37, -40, -38, -33, -12, 22, 67, + 100, 119, 111, 79, 50, 10, -12, -32, -52, -69, -62, -38, -14, -9, -21, -42, + -60, -50, -39, -19, -4, -1, 3, 15, 19, 2, -16, -43, -57, -48, -21, 19, + 38, 63, 66, 69, 74, 59, 39, 4, -33, -52, -67, -58, -39, -25, 2, 10, + 32, 35, 36, 18, -7, -25, -37, -31, -28, -23, -10, 11, 53, 101, 121, 123, + 92, 48, 11, -24, -42, -60, -66, -67, -48, -20, 2, -16, -41, -67, -87, -62, + -44, -10, 8, 19, 30, 34, 35, 4, -36, -66, -78, -75, -27, 22, 49, 83, + 91, 97, 90, 69, 39, -18, -61, -104, -98, -75, -32, 19, 47, 68, 70, 56, + 16, -33, -77, -89, -76, -47, 7, 35, 64, 100, 123, 125, 107, 60, 5, -39, + -76, -94, -101, -93, -69, -36, -3, 17, 10, -15, -56, -80, -86, -69, -40, -7, + 25, 49, 66, 72, 54, 19, -19, -55, -77, -67, -40, 4, 45, 76, 96, 100, + 92, 67, 32, -11, -56, -88, -91, -73, -33, 9, 41, 61, 65, 52, 17, -28, + -67, -80, -68, -36, 6, 47, 82, 114, 126, 114, 74, 18, -32, -73, -93, -101, + -93, -70, -36, -3, 17, 10, -15, 0, -1, -2, -2, 0, 2, 3, 6, 7, + 6, 6, 3, 2, -1, -4, -8, -12, -14, -13, -13, -11, -5, -1, 5, 10, + 14, 17, 19, 18, 15, 12, 7, 3, 1, -2, -4, -4, -7, -11, -13, -16, + -16, -12, -9, -6, -3, -1, -1, -1, -4, -8, -11, -15, -16, -15, -10, -2, + 7, 18, 25, 28, 28, 24, 16, 10, 4, -2, -5, -5, -4, -4, -1, 0, + 0, 1, 1, 0, -1, -3, -6, -11, -11, -14, -16, -17, -19, -19, -16, -10, + -2, 8, 19, 27, 33, 35, 32, 26, 21, 14, 7, 0, -6, -11, -18, -25, + -31, -32, -27, -19, -9, 1, 10, 15, 14, 10, 0, -13, -28, -38, -42, -40, + -26, -4, 17, 40, 58, 66, 62, 51, 35, 17, 3, -8, -16, -18, -18, -15, + -13, -15, -17, -17, -15, -13, -11, -12, -3, -2, 1, -3, -15, -28, -36, -42, + -40, -28, -11, 14, 45, 63, 70, 69, 56, 44, 36, 21, 3, -12, -18, -26, + -37, -47, -58, -55, -41, -20, 4, 22, 34, 43, 37, 22, -7, -43, -71, -88, + -86, -64, -31, 7, 56, 99, 115, 106, 85, 48, 17, 1, -14, -28, -33, -20, + -11, -12, -18, -37, -44, -41, -29, -23, -7, 15, 31, 40, 33, 8, -27, -56, + -73, -74, -63, -33, 4, 50, 93, 101, 91, 79, 56, 43, 24, 5, -17, -32, + -31, -43, -56, -63, -72, -57, -32, 3, 26, 46, 62, 63, 45, 9, -39, -85, + -112, -106, -84, -49, 6, 60, 104, 127, 115, 83, 46, 16, -1, -16, -21, -26, + -16, -2, -8, -25, -47, -67, -62, -49, -26, 2, 34, 60, 74, 65, 33, -21, + -71, -98, -92, -77, -36, 21, 69, 106, 112, 88, 58, 29, 9, -8, -18, -24, + -17, -4, -10, -26, -47, -67, -62, -49, -26, 2, 34, 60, 74, 65, 33, 17, + 16, -38, 9, 40, -58, 27, 43, -80, 52, -2, -54, 64, -27, -17, 32, 4, + -49, 53, -22, -47, 90, -73, 17, 42, -45, 8, 23, -41, -1, 58, -74, 40, + 25, -66, 56, -19, -45, 58, -9, -39, 45, 3, -48, 55, -41, -27, 78, -66, + 13, 40, -38, 0, 29, -51, 12, 57, -79, 38, 31, -64, 40, -4, -47, 63, + -16, -40, 55, -16, -32, 45, -31, -29, 76, -64, 0, 58, -49, 4, 31, -52, + 31, 5, -35, 45, -21, 4, -5, 3, -17, -7, 55, -72, 43, 35, -88, 80, + -57, 3, 45, -62, 53, -14, -2, -17, 46, -77, 42, 23, -61, 75, -54, 39, + -40, 31, -42, 25, 11, -48, 93, -97, 62, -27, -13, 7, 0, 30, -59, 82, + -74, 28, 10, -53, 65, -47, 46, -41, 40, -48, 7, 45, -95, 127, -99, 43, + -9, -25, 40, -58, 84, -84, 78, -66, 11, 50, -96, 111, -85, 51, -26, -14, + 36, -60, 91, -84, 58, -26, -22, 56, -87, 98, -71, 47, -25, -11, 44, -84, + 103, -92, 69, -32, -3, 25, -59, 87, -90, 70, -45, 17, 16, -57, 81, -73, + 50, -33, 14, 0, -35, 75, -84, 69, -42, 8, 11, -46, 74, -69, 57, -47, + 36, -26, -20, 69, -89, 83, -58, 37, -24, -7, 41, -58, 54, -53, 53, -42, + 14, 28, -54, 52, -55, 46, -41, 22, 30, -57, 58, -64, 56, -54, 26, 31, + -55, 63, -73, 66, -68, 49, -3, -38, 61, -71, 75, -87, 69, -15, -27, 37, + -55, 74, -84, 73, -34, -5, 26, -59, 74, -85, 84, -33, -12, 30, -57, 65, + -85, 86, -40, 9, 15, -50, 69, -94, 93, -53, 15, 11, -38, 58, -86, 96, + -64, 11, 21, -30, 17, -3, -3, 0, 0, -3, -4, -4, -3, -4, -4, -5, + -6, -6, -8, -5, -6, -3, 0, 2, 4, 7, 8, 12, 12, 14, 13, 13, + 12, 8, 7, 2, 2, -4, -6, -10, -11, -12, -12, -14, -10, -9, -3, -3, + 2, 3, 3, 2, 1, 1, -3, -3, -4, -3, -3, -3, -4, 0, -3, -3, + -3, 0, -3, 0, -3, 0, 1, 0, 0, 0, 0, 0, -3, 1, -3, 1, + -3, 2, 1, 0, 0, -3, -4, -5, -9, -10, -15, -16, -17, -17, -14, -10, + -3, 4, 9, 14, 19, 24, 25, 26, 28, 30, 34, 42, 31, 9, -31, -39, + -23, -15, -17, -23, -30, -23, -12, -10, 4, 9, 19, 13, 14, 6, 0, -9, + -11, -12, -9, -8, 0, 0, 2, 1, 1, -3, -3, -5, -3, -5, -3, -4, + 0, -3, -4, -4, -3, -5, -3, -5, -3, 0, 3, 2, 7, 7, 7, 3, + 0, -14, -17, -26, -26, -28, -21, -17, -11, -10, 2, 6, 19, 18, 32, 32, + 60, 69, 98, 60, 7, -58, -8, -8, -14, -39, -30, -14, -47, -21, -45, -3, + 7, 20, 14, 31, 12, 10, -15, -5, -23, -14, -15, -4, -8, 2, 1, 7, + -3, 2, -8, -4, -6, -6, -3, 0, -6, -6, -8, -10, -11, -12, -9, -9, + -4, -3, 0, 8, 10, 12, 15, 13, 4, -10, -15, -30, -32, -30, -23, -22, + -19, -14, -4, 3, 10, 14, 26, 40, 70, 102, 127, 62, -17, -39, 9, -25, + -9, -87, -12, -16, 0, -30, -27, -19, -9, 6, 18, 21, 19, 6, 0, -9, + -17, -14, -16, -8, -6, 0, 4, 4, -5, -4, -11, -3, -6, 2, 2, 0, + -6, 0, -2, -4, -8, -14, -21, -25, -28, -32, -36, -40, -44, -48, -51, -55, + -59, -63, -67, -71, -74, -78, -82, -86, -90, -94, -98, -101, -84, -60, -38, -15, + 8, 28, 27, 23, 19, 16, 11, 21, 46, 68, 93, 109, 106, 102, 98, 95, + 91, 87, 83, 79, 75, 71, 67, 64, 60, 56, 52, 49, 45, 41, 37, 33, + 30, 26, 22, 18, 15, 11, 7, 3, -1, -5, -9, -13, -17, -20, -24, -28, + -32, -35, -39, -43, -47, -51, -54, -58, -62, -66, -69, -73, -77, -81, -85, -89, + -93, -97, -100, -105, -95, -70, -48, -23, -7, -10, -14, -17, -22, -18, 4, 26, + 50, 72, 96, 107, 103, 100, 96, 92, 88, 84, 80, 76, 72, 68, 64, 61, + 57, 53, 49, 46, 42, 38, 34, 30, 26, 23, 19, 15, 11, 8, 4, 0, + -4, -8, -11, -15, -19, -23, -27, -30, -35, -38, -43, -46, -51, -54, -58, -61, + -66, -56, -31, -9, 16, 33, 30, 26, 22, 18, 15, 11, 7, 3, -1, -5, + -9, -13, -16, -20, -24, -28, -32, -36, -40, -43, -48, -51, -55, -59, -63, -50, + -26, -4, 20, 42, 64, 67, 62, 59, 55, 51, 47, 43, 39, 35, 31, 27, + 23, 20, 16, 12, 8, 4, 0, -4, -7, -11, -15, -19, -22, -27, -17, 8, + 30, 55, 72, 69, 65, 61, 57, 54, 50, 46, 42, 38, 34, 30, 26, 22, + 18, 15, 11, 7, 3, 0, -4, -8, -12, -15, -19, -23, -27, -31, -35, -38, + -42, -46, -50, -54, -57, -61, -65, -69, -73, -77, -81, -85, -89, -92, -96, -100, + -100, -79, -64, -47, -31, -15, 0, 0, -4, -3, -6, -8, 6, 10, -8, -13, + 22, 55, 15, -58, -102, -88, -25, 51, 77, 79, 82, 19, -45, -107, -128, -88, + 19, 81, 86, 71, 35, -16, -50, -73, -55, -27, -14, 7, 77, 89, 31, -22, + -27, -61, -86, -34, 40, 55, 67, 80, 57, -1, -48, -60, -41, -46, -31, 28, + 62, 47, 43, 33, -5, -34, -45, -52, -33, 26, 66, 70, 41, 17, -34, -79, + -93, -41, -6, 22, 53, 93, 62, 17, -20, -66, -118, -88, -4, 45, 60, 69, + 67, 2, -72, -109, -95, -78, -7, 67, 101, 78, 69, 19, -56, -110, -89, -64, + -19, 45, 100, 86, 36, -11, -65, -107, -108, -41, 24, 69, 93, 111, 56, -15, + -70, -81, -88, -38, 30, 88, 90, 83, 43, -24, -81, -82, -57, -24, 38, 100, + 115, 70, 26, -25, -75, -108, -66, -20, 29, 71, 105, 67, 7, -46, -67, -83, + -60, 0, 58, 82, 81, 57, -9, -72, -99, -78, -60, -8, 54, 95, 69, 44, + 0, -51, -92, -69, -26, 18, 53, 81, 63, 6, -44, -74, -88, -79, -19, 40, + 75, 75, 72, 18, -42, -80, -74, -69, -25, 32, 76, 66, 39, 5, -41, -82, + -76, -34, 3, 42, 79, 88, 38, -12, -49, -74, -92, -48, 8, 51, 70, 83, + 50, -7, -58, -68, -65, -43, 13, 70, 82, 62, 34, -17, -72, -94, -65, -28, + 17, 69, 101, 71, 25, -21, -60, -88, -66, -13, 37, 62, 82, 68, 11, -47, + -73, -79, -66, -15, 49, 82, 76, 57, 11, -51, -88, -78, -48, -9, 49, 0, + 0, 0, 0, 0, 0, -3, -5, -5, -7, -6, -2, 5, 16, 24, 21, 17, + 12, 3, -10, -31, -44, -47, -42, -28, -2, 26, 29, 36, 35, 1, -26, -39, + -52, -53, -38, -10, -32, -41, -7, 2, 22, 65, 89, 74, 15, -16, -24, 12, + 62, 39, 6, -12, -3, 47, 48, 21, 109, 127, 119, 53, -9, 19, 9, -50, + -55, -43, -71, -46, -5, -2, -20, -12, -9, 12, -27, -66, -50, -8, -19, -58, + -22, -8, -19, -34, -42, 10, 32, -4, 4, 46, 96, 34, -51, -10, -8, -93, + -70, -58, -46, -16, -32, -30, 6, 7, -41, -29, 3, 25, 73, 67, 45, 37, + 30, 83, 0, -31, -4, -50, -28, -41, -75, -110, -53, -13, -3, 22, 14, 14, + 13, 7, 9, 38, 47, 39, 17, -8, 90, 75, -5, -29, -46, -54, -102, -66, + -35, -27, -29, -21, 32, 5, 1, 1, -2, 16, 16, 19, 30, 50, 89, 41, + 6, 40, -10, -15, -41, -46, -43, -77, -100, -100, -48, -37, -26, -4, -9, 0, + 13, 36, 70, 75, 59, 34, 12, -13, -27, 37, 71, 48, 53, 37, 7, 8, + 34, 48, 40, 31, 25, 2, -20, -15, -5, 12, -11, -49, -20, 15, -13, -42, + -29, 16, -6, -58, -28, 17, 12, -20, -11, 16, -3, -37, -14, 3, -32, -10, + 40, 54, 53, 27, -3, -5, -34, -47, -49, -90, -68, -36, -32, -31, -16, 26, + 3, 0, -2, -2, 15, 16, 19, 30, 51, 88, 40, 6, 39, -10, 3, -2, + 11, -7, 23, 19, 74, 39, 32, -13, -21, -7, -39, -44, -128, -58, -21, 52, + -86, -74, -94, 75, 61, 72, -38, 13, 59, 116, 71, -9, -33, -12, 68, -2, + -35, -128, -42, -43, 39, -78, -57, -81, 56, 59, 63, -13, 7, 69, 98, 87, + -13, -9, -24, 70, -11, -23, -128, -42, -48, 28, -68, -61, -69, 34, 64, 46, + 8, -5, 79, 82, 100, -17, 5, -29, 69, -13, -21, -122, -49, -43, 11, -55, + -72, -54, 13, 73, 30, 23, -16, 87, 72, 107, -17, 10, -26, 64, -6, -26, + -109, -61, -31, -6, -40, -86, -41, -4, 80, 17, 31, -22, 88, 70, 106, -10, + 6, -16, 53, 7, -37, -93, -76, -17, -21, -28, -99, -33, -15, 83, 12, 31, + -21, 83, 76, 98, 2, -4, -1, 41, 24, -49, -77, -89, -6, -31, -20, -106, + -32, -19, 79, 14, 23, -15, 71, 87, 87, 17, -16, 13, 30, 39, -57, -67, + -97, -1, -34, -19, -106, -38, -16, 69, 23, 11, -5, 56, 100, 75, 32, -28, + 25, 22, 50, -59, -62, -98, -2, -30, -24, -100, -52, -9, 55, 36, -4, 5, + 41, 112, 67, 43, -34, 30, 21, 55, -53, -65, -93, -11, -18, -34, -88, -69, + 0, 41, 48, -17, 12, 29, 118, 65, 49, -34, 28, 27, 53, -42, -72, -83, + -23, -6, -44, -77, -85, 5, -69, 1, -12, -29, -28, -13, 1, 9, -4, -27, + -18, -5, 11, 65, 87, 54, 59, 66, 30, 12, 8, -6, -7, 4, -7, -39, + -59, -63, -48, -23, -13, -6, 22, 61, 68, 15, -59, -87, -41, 3, 5, -10, + -17, -17, -20, -23, -20, -28, -17, -3, -10, -29, 23, 11, 25, 52, 56, 62, + 80, 54, 22, -15, -31, -38, -5, 11, -9, -7, -36, -44, -6, 52, 127, 26, + -68, -125, -105, 22, 15, -27, -27, 13, 25, 69, 28, -42, -77, -57, -70, 15, + 44, 14, 26, 57, 69, 43, 33, 41, 33, 32, 25, -50, -98, -100, -38, 24, + 7, -35, -38, -2, 76, 64, 15, -79, -93, -50, -12, 27, 45, 32, -4, 23, + 6, -36, -47, -33, -52, -15, 37, 78, 49, 40, 17, 14, 14, 70, 81, 60, + -3, -4, -12, -42, -50, -28, -20, 5, 9, 27, 46, -13, -69, -99, -88, -47, + 5, -4, -10, 17, 39, -12, -8, -21, -16, 22, 9, -9, 1, 15, 15, 33, + 29, 17, 11, 38, 72, 29, -8, -36, -27, -42, 17, -40, 25, 25, 8, -3, + 14, 15, 2, 43, 33, -2, -19, -24, -8, 2, -69, -114, -94, -77, -87, 22, + 27, 19, 24, 57, 121, 94, 40, -27, -29, 4, 28, -12, 5, -21, -28, -18, + 0, -9, 1, 36, 22, 7, 6, 12, 7, 8, 55, 6, -2, -7, -13, -12, + -12, -8, -5, -5, -1, -4, -4, -3, -1, 5, 11, 15, 18, 16, 11, 5, + -5, -12, -16, -17, -14, -10, -7, -3, -2, -3, -3, -5, -3, 2, 9, 18, + 22, 23, 18, 11, -2, -14, -20, -22, -18, -12, -8, -5, -3, -5, -6, -6, + -5, 1, 11, 22, 30, 31, 24, 15, -1, -12, -20, -23, -19, -13, -8, -3, + -3, -2, -6, -8, -9, -5, 6, 21, 32, 35, 29, 19, 1, -15, -27, -29, + -25, -15, -9, -4, -1, -2, -7, -14, -15, -10, 4, 24, 42, 48, 43, 26, + 4, -20, -36, -38, -30, -17, -7, -3, 0, -1, -4, -16, -24, -19, -3, 26, + 49, 61, 60, 40, 9, -23, -45, -52, -39, -22, -5, -2, 1, 3, -2, -18, + -32, -30, -10, 22, 55, 77, 78, 52, 15, -22, -51, -66, -52, -29, -5, 0, + 2, 9, 6, -15, -37, -42, -22, 10, 55, 89, 99, 71, 22, -20, -58, -79, + -68, -35, -8, 6, 1, 12, 13, -9, -37, -50, -35, 0, 46, 93, 116, 90, + 33, -15, -60, -89, -84, -44, -9, 10, 3, 13, 19, -3, -35, -53, -43, -12, + 34, 91, 127, 109, 46, -9, -57, -95, -96, -57, -13, 11, 7, 10, 25, 2, + -2, -35, 0, 2, 7, 12, -7, -79, -68, 2, -6, -5, 19, 40, 33, 55, + 56, 17, 32, 32, 2, -20, 5, 51, 27, -21, -13, -11, -17, -20, -6, -63, + -125, -116, -86, -59, -34, 11, 23, 20, 39, 66, 50, 47, 54, 46, 11, -4, + 44, 67, 30, 11, 16, 6, -2, 7, -4, -77, -114, -107, -70, -50, -20, 29, + 26, 12, 48, 69, 44, 47, 49, 28, -8, 9, 53, 49, 15, 9, 8, -3, + -11, 7, -33, -107, -123, -101, -62, -49, -5, 25, 6, 13, 55, 49, 32, 40, + 39, 7, -17, 18, 49, 32, 7, 8, 1, -12, -3, 7, -62, -113, -109, -74, + -50, -31, 23, 32, 13, 40, 69, 48, 46, 54, 42, 2, 1, 42, 52, 25, + 10, 11, 0, -11, 10, -10, -90, -115, -101, -64, -52, -15, 29, 16, 10, 51, + 59, 41, 46, 49, 25, -9, 15, 48, 42, 15, 10, 7, -9, -7, 16, -43, + -107, -113, -89, -60, -47, 4, 27, 4, 19, 58, 47, 38, 46, 43, 6, -9, + 28, 47, 29, 10, 11, 2, -14, 5, 5, -73, -111, -106, -73, -56, -29, 24, + 22, 6, 40, 61, 43, 43, 52, 37, -3, 6, 41, 47, 23, 12, 11, 0, + -14, 1, 3, 5, 5, 6, 8, 6, 4, 0, -4, -5, -6, -9, -9, -11, + -11, -12, -13, -13, -13, -12, -11, -9, -5, -2, -1, 1, 4, 6, 9, 11, + 12, 12, 11, 8, 5, 2, -2, -2, -2, -2, 0, -1, -1, -2, -5, -5, + -5, -1, 4, 10, 17, 20, 22, 19, 15, 7, -1, -9, -15, -19, -21, -21, + -18, -16, -13, -11, -12, -15, -19, -23, -24, -20, -13, -3, 9, 20, 34, 44, + 50, 46, 35, 21, 7, -4, -14, -20, -19, -13, -8, 2, 0, -5, -15, -28, + -32, -29, -14, 0, 11, 27, 42, 58, 59, 45, 22, 4, -15, -26, -37, -43, + -42, -37, -17, 1, 18, 23, 8, -5, -29, -47, -47, -43, -25, -5, 20, 52, + 80, 92, 76, 43, 9, -20, -35, -38, -46, -41, -29, -12, 19, 35, 22, 4, + -34, -53, -58, -40, -26, -16, 14, 47, 88, 108, 90, 50, 16, -9, -36, -51, + -64, -64, -52, -33, -1, 32, 40, 24, 3, -29, -62, -58, -65, -52, -18, 23, + 68, 114, 127, 95, 41, 1, -36, -54, -56, -68, -55, -35, -17, 19, 42, 29, + 13, -16, -46, -60, -54, -56, -47, -11, 29, 72, 116, 127, 94, 41, -3, 0, + 16, 39, 54, 46, 18, 7, -15, -36, -9, -6, -16, -5, -15, -30, -23, -35, + -20, 22, 3, -19, -20, -13, -9, 19, 23, 10, 12, 35, 66, 54, 4, -43, + -58, -15, -10, 16, 55, 18, -39, -38, -30, 2, 9, 27, 51, -32, -60, -72, + -4, 32, 71, 19, -8, 56, -2, -42, 10, 21, -6, 31, -9, -70, 8, -6, + -19, -93, -20, -5, -31, 10, 5, 56, 24, -45, 11, 66, 48, 61, 89, 49, + -57, -6, -20, -69, -104, -83, -50, 32, 10, -16, -87, -78, 30, 127, 63, -17, + -91, -2, -12, 45, 83, 30, 56, 54, 42, 7, 79, -26, -52, -64, -97, 12, + -3, -107, -99, -39, 34, 86, 19, -25, 25, 90, -8, -38, 65, 36, 10, 30, + 36, 19, -6, 38, -47, -101, -52, -45, 30, -9, -106, 18, -10, -37, 16, 100, + -94, -111, -25, -35, -12, -8, -9, 51, 24, -5, -70, -52, -52, -19, -11, 48, + 93, 61, 17, 113, 125, 73, -16, -30, -57, -78, -116, -55, -38, -10, -5, -4, + 38, 31, -3, -46, -46, -50, -20, -10, 52, 84, 48, 14, 115, 119, 64, -16, + -1, 4, 0, -9, -11, -1, 6, 2, -2, 4, -6, -10, -2, 11, 14, 3, + -10, -15, -1, 17, 4, 6, 4, -12, -18, 6, 10, 4, 6, -8, -36, 2, + 3, 3, 5, 15, -20, -17, 9, 8, 11, 17, -8, -26, 18, 2, 5, 5, + 13, -24, -8, -2, 2, 5, 7, -21, -18, 13, 5, -5, 17, 7, -14, -13, + -12, 0, 14, 3, -12, -26, 13, 3, 10, 18, 12, -15, -14, -1, 3, 19, + 0, -10, -29, 11, 4, 17, 15, 12, -24, -20, 6, 9, 22, -3, -13, -15, + 9, 1, 7, 6, 18, -19, -26, -18, 2, 22, 0, -25, -20, 15, 8, -4, + 8, 31, -12, -20, -15, 9, 33, 9, -29, -2, 27, 7, -11, 8, 20, -20, + -41, -10, 15, 35, 15, -21, 11, 49, 6, -6, 4, 3, -48, -76, -35, 14, + 37, 22, -24, 29, 68, 20, 3, 7, -5, -68, -90, -59, 19, 36, 28, -13, + 59, 93, 30, 2, 18, -25, -88, -105, -81, 13, 26, 30, -4, 88, 109, 33, + 0, 22, -30, -88, -112, -76, 17, 31, 18, 5, 94, 114, 30, -4, 0, 4, + -30, -1, 0, -2, -2, -2, -1, 4, 11, 18, 30, 7, -64, -60, -30, -7, + 0, 2, 22, 67, 117, 23, -128, -74, -30, -5, -2, 1, 19, 62, 116, 38, + -123, -82, -31, -8, -1, -1, 16, 57, 114, 52, -117, -88, -33, -10, -2, -3, + 14, 52, 112, 64, -108, -96, -35, -13, -2, -4, 12, 49, 108, 77, -99, -102, + -37, -15, -2, -5, 10, 43, 104, 86, -87, -109, -40, -18, -2, -6, 8, 40, + 100, 95, -73, -115, -42, -21, -2, -8, 7, 35, 95, 102, -59, -120, -45, -24, + -2, -8, 5, 32, 90, 109, -44, -124, -49, -26, -3, -9, 3, 28, 85, 114, + -29, -126, -53, -28, -4, -9, 2, 25, 81, 116, -13, -127, -58, -29, -6, -9, + 0, 22, 75, 119, 3, -126, -63, -31, -7, -9, -2, 19, 70, 120, 18, -124, + -69, -32, -9, -9, -3, 16, 65, 119, 34, -63, -107, -58, -23, -11, -7, 7, + 46, 107, 89, -52, -109, -62, -25, -12, -8, 5, 42, 104, 97, -41, -87, -70, + -36, -18, -11, 0, 30, 85, 100, -2, -87, -5, 11, -23, -10, -3, -20, -3, + -17, -24, -33, -26, -1, -13, -12, -6, -9, 6, 25, 19, -7, -1, 22, -6, + -20, 13, 6, -12, 26, 48, 0, -7, 34, 23, 4, 32, 23, -41, -11, 49, + -3, -30, 35, 45, -14, -2, 62, 18, -44, -2, 26, -4, -28, -6, 16, 2, + -9, -9, 2, 18, 24, 9, -25, -57, -36, 30, 38, -21, -63, -37, 9, 37, + 40, 0, -56, -56, 3, 39, 20, -23, -52, -58, -46, 8, 67, 56, -18, -61, + -18, 36, 70, 95, 73, -35, -128, -127, -73, -17, 32, 48, 29, 28, 60, 106, + 113, 91, 36, -26, -67, -90, -91, -71, -44, -25, -13, 9, 36, 51, 69, 70, + 32, -40, -92, -99, -70, -25, 12, 29, 21, 3, -9, 10, 21, 12, -11, -22, + -27, -44, -23, 10, 30, 25, 24, 39, 18, 3, 8, 19, -1, -19, -8, 6, + 5, 13, 50, 43, 37, 36, 40, 37, 4, 12, -10, -33, -31, -25, -1, 1, + 7, 14, 10, -4, -11, -10, -6, -19, -42, -28, -54, -51, -18, -5, 3, 2, + -10, -10, 10, 28, 27, 16, 5, -5, -24, -26, -7, -14, -25, -16, 53, 33, + -49, -30, 53, 50, -24, -34, 40, 82, -118, -23, 120, -56, -70, -72, 106, -10, + -48, 3, 87, 28, -126, -16, 81, 4, -84, -51, 38, 62, -32, 36, 84, -12, + -41, 72, -42, -60, -64, 4, 77, -24, -79, -9, 122, 6, -94, 52, 43, 35, + 13, -62, -7, -89, 24, -30, 16, 29, 56, -59, 83, 42, 31, 36, -76, -2, + -128, -2, 45, 27, -104, -31, 66, 21, 19, 36, 121, 11, -76, -26, -93, 34, + 24, -34, -65, -53, 53, 17, 73, 46, 75, -9, -64, -21, -103, 41, 51, -41, + -83, -43, 108, 6, -11, 28, 127, 2, -84, -38, -72, 39, 17, -23, -15, -67, + 37, 6, 29, 64, 79, 17, -39, -39, -120, 55, 23, -17, -62, -51, 81, 23, + 20, 24, 99, -38, -99, 4, 17, -66, -41, -33, 63, 62, 16, 53, 91, 56, + -65, -36, -99, -38, 14, -47, -29, -38, 35, 83, 9, 48, 83, 62, -45, -31, + -103, -49, 14, 2, 6, -33, 33, -4, -1, 34, -93, 60, -49, 68, -21, 41, + -38, -38, 27, -87, 127, -34, 38, -3, -34, -2, -85, 79, -24, 4, 75, -23, + 11, -70, 1, -6, -6, 63, -48, 76, -71, 2, -7, -15, 46, -32, 48, -25, + -5, 10, -31, 18, -23, 5, 6, 17, 11, 3, 24, -46, -21, -1, -5, 31, + 1, 36, -23, -11, -4, -29, 14, -5, 29, 9, -2, -2, -20, -2, -15, 13, + 7, 4, 15, -11, 4, -13, -1, 1, -13, 15, -6, 9, 9, -2, -4, -11, + -2, -11, 7, 12, 9, 5, -6, -6, -16, -2, 3, 6, 13, 1, 7, -14, + -3, -11, -1, 8, 0, 18, -3, -3, -6, -13, 0, 4, 2, 9, 2, 2, + -6, -4, -1, -8, 2, 4, 2, 7, -4, 2, 1, -7, -3, -2, 0, 2, + 8, -2, 2, -1, -7, -3, -1, 3, 4, 3, 3, -3, -4, -4, 0, 2, + 1, 5, -1, -2, 1, -4, -1, 1, 0, 2, -5, -8, -3, -3, -9, -2, + -2, 5, 10, 16, 11, 5, -3, -5, -1, -4, -6, -7, -15, -18, -27, -31, + -21, -11, 22, 56, 90, 66, -17, -25, -25, 0, -12, -15, -25, -32, -39, -37, + -26, 6, 33, 65, 69, 44, -1, -13, -12, 1, 0, -9, -14, -22, -40, -44, + -42, -23, 8, 39, 60, 84, 57, -16, -25, -19, 2, -8, -11, -18, -32, -51, + -45, -32, -6, 28, 54, 85, 96, -5, -29, -23, -7, -10, -17, -16, -28, -53, + -44, -40, -7, 22, 52, 82, 112, 17, -37, -25, -20, -11, -18, -10, -23, -33, + -51, -40, -23, 10, 45, 65, 96, 64, -21, -35, -34, -19, -20, -13, -5, -14, + -35, -41, -39, -17, 9, 45, 58, 82, 98, -2, -57, -47, -23, -12, -11, -2, + -18, -28, -39, -36, -24, -1, 26, 57, 84, 121, 23, -65, -50, -40, -12, -11, + -4, -14, -20, -34, -32, -27, -5, 19, 56, 80, 127, 15, -66, -50, -2, -5, + -5, 2, 10, 8, -7, -16, -9, 6, 17, 8, -19, -20, 14, 38, 34, 20, + -5, 1, 50, 37, -50, -54, -66, -32, 32, -3, -13, -18, -17, 46, 89, -17, + -62, 45, 127, 57, -57, -67, -109, -11, 88, -31, -90, -88, -27, 63, 97, -27, + -105, -44, 65, 110, 60, -12, -30, -27, 17, 49, -2, -39, -6, 30, -16, -36, + -43, 32, 67, -54, -58, -38, -21, 47, 95, 76, -33, -78, -62, 10, 107, 24, + -106, -107, 12, 52, 27, 78, 8, -75, 25, 6, -26, 59, 32, -17, -7, -19, + 11, 32, -51, -52, 41, -9, -13, 94, 2, -65, 5, -46, -86, 34, 62, 85, + 29, -93, -89, -29, 44, 35, -31, -33, -19, 56, 127, 7, -9, -62, -52, 23, + 46, 44, -56, -16, -55, -46, 22, 83, -13, -42, -7, 13, 81, 49, 3, -9, + -30, -47, -30, 3, 23, 6, -7, -20, -44, 10, 96, -13, 0, 16, 31, 47, + 61, 75, 87, 98, 107, 115, 121, 125, 127, 127, 125, 121, 116, 108, 99, 88, + 75, 62, 47, 32, 16, 0, -16, -31, -47, -61, -75, -87, -98, -108, -116, -122, + -126, -128, -128, -126, -123, -117, -109, -100, -89, -77, -64, -49, -34, -18, -2, 14, + 29, 45, 59, 73, 86, 97, 106, 114, 121, 125, 127, 127, 126, 122, 116, 109, + 100, 89, 77, 63, 49, 34, 18, 2, -14, -30, -45, -60, -73, -86, -97, -107, + -115, -121, -126, -128, -128, -127, -123, -118, -110, -101, -91, -79, -65, -51, -36, -20, + -4, 12, 28, 43, 58, 72, 84, 96, 106, 114, 120, 124, 127, 127, 126, 122, + 117, 109, 100, 90, 78, 64, 50, 35, 19, 3, -13, -29, -44, -59, -73, -85, + -97, -107, -115, -121, -125, -128, -128, -127, -123, -118, -110, -101, -91, -79, -65, -51, + -36, -20, -4, 12, 2, 5, 5, 0, -16, -9, -2, -19, 4, 18, 6, 10, + -16, -21, 22, -2, 3, -7, 21, 43, -57, -37, 46, -39, -31, 78, 23, -23, + -10, -10, -7, -52, 44, 50, -44, 9, -9, -46, 47, 12, -75, 40, 45, 32, + -10, -25, -15, -45, 24, 44, -40, -10, 18, -48, -29, 63, 44, -30, -1, 83, + -45, -94, 96, 0, -103, 21, 29, -42, 21, 80, -25, -15, 26, 39, -79, -18, + 73, -111, -45, 61, 29, 55, -22, -77, 40, 9, -72, 78, 35, -1, -1, -69, + 12, -50, -42, 123, 45, -7, -39, -86, 3, 51, 30, 28, -4, -33, -41, -66, + 54, -8, -30, 127, -7, -30, -32, -39, 48, -65, 20, 121, -33, -14, -53, -32, + 46, -24, 36, 98, -49, -39, -61, 1, 49, -54, 65, 59, -83, -11, -49, 32, + 39, -72, 113, 59, -83, -11, -49, 32, 39, -72, 113, 59, -2, -4, -4, -7, + -8, -8, -7, -4, -3, -2, 1, 4, 6, 6, 6, 4, 2, 0, -2, -3, + -4, -7, -7, -5, -3, 0, 4, 9, 11, 11, 9, 7, 4, 1, -3, -7, + -9, -12, -13, -16, -19, -19, -13, -2, 9, 17, 19, 20, 18, 13, 8, 3, + 0, -2, -3, -8, -14, -21, -25, -21, -9, 4, 15, 23, 28, 25, 20, 9, + -7, -21, -14, 3, 3, -18, -38, -49, -32, -7, 8, 14, 26, 37, 42, 37, + 26, 7, -18, -27, -5, 8, -7, -24, -34, -40, -32, -19, 1, 17, 42, 56, + 58, 40, -19, -81, 1, 67, 0, -60, -49, -27, -24, 0, -18, -24, -8, 37, + 67, 70, 59, 34, -42, -81, 7, 51, -12, -54, -37, -14, -25, -14, -16, -24, + 4, 55, 75, 102, 52, -102, -104, 90, 30, -48, -76, 1, -14, 0, -2, -2, + -3, -5, -7, -8, -8, -7, -6, -4, -2, 0, 1, 3, 4, 6, 6, 6, + 6, 5, 4, 3, 1, 0, 0, -3, -4, -7, -10, -11, -11, -8, -6, 1, + 5, 6, 8, 11, 11, 8, 5, 5, 2, 1, 0, 0, -2, 1, -4, -16, + -36, -27, -5, 6, -3, -6, 0, -6, 2, 27, 24, 19, 16, 9, 3, 0, + -4, 2, 1, 9, 19, -14, -79, -32, 22, -4, -22, -14, 25, 8, -11, 13, + 28, 16, 19, 16, 1, -2, -4, -3, -6, 28, 38, -59, -111, 25, 16, -16, + -40, 16, 24, -20, 4, 24, 29, 17, 27, 13, 1, -10, -6, -10, -8, 43, + 61, -68, -128, 28, 12, -15, -39, 12, 21, -28, 12, 37, 25, 12, 27, 11, + 0, -16, -2, -12, -11, 52, 67, -68, 35, 54, 47, 4, -60, -92, -68, -27, + 0, -2, -18, -20, -6, 2, -8, -15, -11, -3, 3, -7, -11, -6, -2, 7, + 15, 18, 19, 22, 27, 40, 40, 29, 20, 24, 28, 34, 30, 25, 32, 20, + 14, 9, 16, 19, 17, 6, -1, 3, -6, -14, -23, -18, -7, 1, -18, -18, + -24, -25, -24, -35, -35, -35, -21, -12, -14, -21, -17, -29, -24, -31, -34, -9, + -11, -9, -3, -7, -7, 6, -17, -22, 7, 16, 14, -4, -11, 10, 33, 24, + 21, 27, 3, -19, -25, -18, 17, 50, 48, 49, 61, 31, -48, -103, -73, 9, + 56, 70, 82, 109, 127, 71, -46, -127, -96, -30, -4, 9, 47, 103, 117, 60, + -39, -110, -119, -94, -64, -40, -4, 35, -8, -14, -9, -5, -4, -3, 6, 18, + 19, 6, -14, -20, -12, -3, -3, -6, 2, 21, 28, 13, -16, -26, -14, -6, + -6, -7, 1, 27, 36, 18, -15, -27, -15, -3, -2, -10, -6, 25, 41, 22, + -17, -34, -18, -4, -3, -16, -12, 29, 56, 31, -24, -44, -20, -4, -1, -19, + -22, 31, 73, 47, -27, -62, -25, -2, 4, -21, -36, 26, 91, 61, -27, -79, + -33, 0, 10, -18, -49, 14, 106, 82, -24, -94, -40, 8, 14, -12, -59, 1, + 112, 105, -19, -106, -51, 12, 16, -4, -63, -13, 110, 127, -12, -114, -51, 0, + -1, -4, -8, -11, -8, -2, 0, 7, 14, 21, 46, 92, 120, 76, -36, -121, + -119, -73, -31, -7, 3, 2, -4, -6, 2, 22, 60, 106, 116, 43, -72, -128, + -105, -57, -21, -3, 3, -1, -6, -5, 7, 33, 76, 117, 102, 5, -100, -127, + -89, -43, -13, 0, 2, -3, -7, -2, 14, 46, 92, 122, 79, -34, -118, -118, + -72, -31, -8, 1, 0, -5, -7, 2, 23, 61, 107, 118, 46, -69, -126, -104, + -56, -21, -4, 1, 0, -4, -5, 0, 16, 48, 87, 103, 60, -25, -87, -94, + -58, -20, -4, -11, 12, 24, 31, -36, 29, -9, 2, -38, -5, -5, -10, -33, + -10, -24, -20, -39, -36, -18, -38, -58, -5, -22, -15, -15, 90, -42, -3, -8, + 25, 6, 28, 25, 17, 25, -16, 28, 80, 22, 12, -6, 35, 22, 8, -7, + 28, 29, -19, 7, 8, -1, -29, -23, 10, -23, -13, -26, -17, -20, -33, -41, + -19, -28, -64, -13, -21, -13, -29, 54, 25, -20, -36, 42, -4, 13, 52, -8, + 47, -14, 9, 42, 88, -12, 20, -5, 43, 22, -11, 127, 127, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, -128, 1, 4, 7, 10, 12, 16, 19, 22, 25, 28, 31, 35, 38, 42, + 45, 49, 51, 56, 58, 63, 65, 70, 73, 78, 80, 85, 87, 93, 95, 100, + 102, 108, 109, 117, 114, 127, 85, -63, -60, -64, -60, -62, -59, -61, -59, -61, + -58, -60, -58, -59, -58, -58, -57, -57, -55, -55, -54, -54, -52, -51, -50, -49, + -47, -46, -44, -43, -41, -40, -37, -36, -34, -32, -30, -28, -25, -24, -21, -19, + -16, -14, -11, -9, -6, 1, 1, 4, 7, 10, 12, 16, 19, 22, 25, 28, + 31, 35, 38, 42, 45, 49, 51, 56, 58, 63, 65, 70, 73, 78, 80, 85, + 87, 93, 95, 100, 102, 108, 109, 117, 114, 127, 85, -63, -60, -64, -60, -62, + -59, -61, -59, -61, -58, -60, -58, -59, -58, -58, -57, -57, -55, -55, -54, -54, + -52, -51, -50, -49, -47, -46, -44, -43, -41, -40, -37, -36, -34, -32, -30, -28, + -25, -24, -21, -19, -16, -14, -11, -9, -6, 1, -3, -19, -24, -14, -8, -19, + -12, -10, -5, -12, -50, -19, 23, 35, 4, -20, -7, -26, 9, 40, 69, 16, + -88, -69, -38, -32, -27, 41, 65, 55, 18, -40, -38, -20, 66, 127, 121, 57, + -23, -55, -48, 13, 53, 31, -20, -38, -13, 10, 8, 0, 12, 17, 13, 2, + -1, -3, -3, 6, 13, 7, -17, -24, -12, 4, 3, -10, -20, -32, -22, -18, + -12, -3, 6, 16, 22, 29, 30, 27, 20, 11, 0, -7, -12, -11, -5, 0, + -3, -14, -20, -16, -9, -9, -17, -25, -29, -31, -33, -35, -33, -29, -25, -22, + -20, -17, -14, -13, -12, -11, -9, -10, -13, -15, -11, -5, 3, 9, 10, 9, + 9, 12, 18, 30, 50, 80, 119, 127, 102, 82, 77, 60, 37, 5, -34, -70, + -84, -83, -74, -60, -46, -29, -12, -2, 6, -23, 28, -20, 50, 50, -14, 14, + -28, -2, 28, 52, -25, -13, -52, 43, -41, -9, -26, 36, -25, -20, -17, 3, + -11, 38, 30, -61, 12, -6, 5, 45, 41, -4, 4, -20, -12, 45, 33, -11, + -29, -44, 27, -17, -36, -1, 17, -11, -31, -12, 4, -10, 37, 20, -39, -23, + 0, -104, -55, -11, 24, 33, 30, 7, -15, -31, -30, -25, -23, -20, -9, 10, + 31, 59, 91, 111, 115, 92, 51, 7, -33, -64, -81, -81, -71, -51, -22, 16, + 52, 74, 82, 81, 68, 38, 0, -40, -81, -112, -124, -102, -57, -11, 0, 7, + -23, -58, -85, -100, -104, -100, -92, -81, -69, -57, -45, -33, -22, -11, -1, 8, + 18, 27, 37, 49, 62, 79, 99, 118, 124, 111, 84, 53, 26, 5, -8, -14, + -15, -12, -6, 2, 12, 21, 28, 26, 9, -22, -58, -20, 7, 10, 21, -14, + 9, 22, 57, 62, 127, 56, 28, 26, -28, 10, -81, -31, -81, -35, -19, -55, + -27, -4, -4, 23, 49, 88, 85, 22, 1, 0, -3, 18, -22, -12, -39, -14, + -47, -67, -53, -53, -33, -20, 8, -22, 25, 30, 6, -19, -62, -19, 10, 83, + 57, -67, -88, -52, 63, 127, 42, -63, -121, -70, 82, 111, 46, -43, -114, -35, + 45, 73, 39, -19, -54, -41, 9, 49, 24, -16, -14, -9, -6, 10, 8, -22, + 25, 30, 6, -19, -62, -19, 10, 83, 57, -67, -88, -52, 63, 127, 42, -63, + -121, -70, 82, 111, 46, -43, -114, -35, 45, 73, 39, -19, -54, -41, 9, 49, + 24, -16, -14, -9, -6, 10, 8, -22, 25, 30, 6, -19, -62, -19, 10, 83, + 57, -67, -88, -52, 63, 127, 42, -63, -121, -70, 82, 111, 46, -43, -114, -35, + 45, 73, 39, -19, -54, -41, 9, 49, 24, -16, -14, -9, -6, 10, -18, -15, + 80, 127, 20, 18, 72, 60, -36, 22, 33, -73, -105, -27, 29, 25, 8, 43, + 23, -22, -35, -14, -8, -34, -25, -5, -18, -46, -13, -28, -3, -19, -10, -28, + -10, 17, -18, 96, 127, 123, 127, 126, 126, 95, 61, 22, -17, -56, -95, -118, + -123, -128, -128, -128, -128, -128, -128, -128, -128, -124, -93, -55, -17, 25, 62, 100, + 107, 119, 119, 127, 41, -4, -4, -10, -27, -62, -102, -128, -117, -85, -76, -49, + -25, -7, 15, 24, 14, 0, -9, -12, -3, 33, 81, 105, 111, 101, 80, 62, + 45, 30, 16, 8, 1, -4, 126, 86, -44, -68, -88, -63, 4, 84, 127, 14, + -29, -51, -127, -47, 58, 87, 82, 24, -17, -112, -113, 18, 46, 72, 102, 19, + -72, -118, -51, 9, 27, 126, 19, -53, -114, -108, 15, 122, 111, 21, -71, -70, + 5, 59, 83, 23, -72, -84, -49, 12, 37, 38, -28, -65, -26, 7, -2, 11, + 5, 23, 68, 19, 27, -54, 15, -24, -31, 46, 71, 81, -24, -33, -87, -41, + -71, -61, -70, -36, -44, -3, 12, -25, -20, 20, 68, 85, 127, 15, 50, -5, + 27, 51, 82, 106, 127, 118, 101, 92, 74, 52, 39, 37, 14, -41, -105, -108, + -94, -119, -124, -93, -57, -40, -37, -45, -51, -41, -5, 51, 127, 127, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127 +}; + +const EAS_U32 eas_sampleLengths[] = +{ + 16820, 16708, 16592, 11754, 10954, 10295, 9922, 7489, + 5779, 5462, 4452, 3779, 3115, 3093, 3057, 3024, + 2818, 2776, 2171, 2168, 2052, 1902, 1835, 1614, + 1603, 1528, 1517, 1480, 1455, 1424, 1387, 1302, + 1262, 1254, 1230, 1227, 1185, 1181, 1178, 1168, + 1132, 1120, 1034, 1033, 1018, 994, 964, 926, + 907, 886, 881, 866, 830, 817, 816, 813, + 749, 748, 739, 720, 652, 610, 610, 583, + 564, 561, 556, 549, 542, 535, 530, 530, + 516, 508, 492, 478, 461, 448, 437, 431, + 423, 418, 403, 402, 400, 394, 387, 387, + 367, 357, 347, 347, 341, 336, 334, 329, + 325, 312, 294, 284, 277, 265, 255, 233, + 230, 213, 207, 205, 194, 193, 184, 181, + 181, 167, 164, 158, 152, 152, 145, 139, + 128, 103, 100, 88, 87, 84, 84, 72, + 71, 55, 46, 45, 43, 40, 40, 40, + 37, 35, 32, 32, 30, 29, 27, 23, + 22, 21, 21, 21, 21, 20 +}; + +const EAS_U32 eas_sampleOffsets[] = +{ + 0x00000000, 0x000041b4, 0x000082f8, 0x0000c3c8, 0x0000f1b2, 0x00011c7c, 0x000144b3, 0x00016b75, + 0x000188b6, 0x00019f49, 0x0001b49f, 0x0001c603, 0x0001d4c6, 0x0001e0f1, 0x0001ed06, 0x0001f8f7, + 0x000204c7, 0x00020fc9, 0x00021aa1, 0x0002231c, 0x00022b94, 0x00023398, 0x00023b06, 0x00024231, + 0x0002487f, 0x00024ec2, 0x000254ba, 0x00025aa7, 0x0002606f, 0x0002661e, 0x00026bae, 0x00027119, + 0x0002762f, 0x00027b1d, 0x00028003, 0x000284d1, 0x0002899c, 0x00028e3d, 0x000292da, 0x00029774, + 0x00029c04, 0x0002a070, 0x0002a4d0, 0x0002a8da, 0x0002ace3, 0x0002b0dd, 0x0002b4bf, 0x0002b883, + 0x0002bc21, 0x0002bfac, 0x0002c322, 0x0002c693, 0x0002c9f5, 0x0002cd33, 0x0002d064, 0x0002d394, + 0x0002d6c1, 0x0002d9ae, 0x0002dc9a, 0x0002df7d, 0x0002e24d, 0x0002e4d9, 0x0002e73b, 0x0002e99d, + 0x0002ebe4, 0x0002ee18, 0x0002f049, 0x0002f275, 0x0002f49a, 0x0002f6b8, 0x0002f8cf, 0x0002fae1, + 0x0002fcf3, 0x0002fef7, 0x000300f3, 0x000302df, 0x000304bd, 0x0003068a, 0x0003084a, 0x000309ff, + 0x00030bae, 0x00030d55, 0x00030ef7, 0x0003108a, 0x0003121c, 0x000313ac, 0x00031536, 0x000316b9, + 0x0003183c, 0x000319ab, 0x00031b10, 0x00031c6b, 0x00031dc6, 0x00031f1b, 0x0003206b, 0x000321b9, + 0x00032302, 0x00032447, 0x0003257f, 0x000326a5, 0x000327c1, 0x000328d6, 0x000329df, 0x00032ade, + 0x00032bc7, 0x00032cad, 0x00032d82, 0x00032e51, 0x00032f1e, 0x00032fe0, 0x000330a1, 0x00033159, + 0x0003320e, 0x000332c3, 0x0003336a, 0x0003340e, 0x000334ac, 0x00033544, 0x000335dc, 0x0003366d, + 0x000336f8, 0x00033778, 0x000337df, 0x00033843, 0x0003389b, 0x000338f2, 0x00033946, 0x0003399a, + 0x000339e2, 0x00033a29, 0x00033a60, 0x00033a8e, 0x00033abb, 0x00033ae6, 0x00033b0e, 0x00033b36, + 0x00033b5e, 0x00033b83, 0x00033ba6, 0x00033bc6, 0x00033be6, 0x00033c04, 0x00033c21, 0x00033c3c, + 0x00033c53, 0x00033c69, 0x00033c7e, 0x00033c93, 0x00033ca8, 0x00033cbd +}; + +/*---------------------------------------------------------------------------- + * S_EAS + *---------------------------------------------------------------------------- +*/ +const S_EAS easSoundLib = +{ + 0x01534145, + 0x0010ac44, + eas_banks, + eas_programs, + eas_regions, + eas_articulations, + eas_sampleLengths, + eas_sampleOffsets, + eas_samples, + 0, + 1, + 1, + 377, + 185, + 150, + 0 +}; /* end S_EAS */ + +/*---------------------------------------------------------------------------- + * Statistics + * + * Number of banks: 1 + * Number of programs: 1 + * Number of regions: 377 + * Number of articulations: 185 + * Number of samples: 150 + * Size of sample pool: 212050 + *---------------------------------------------------------------------------- +*/ +/* end wt_200k_G_MAC.c */ -- cgit v1.2.3 From 8e01a4bfb5171cfd7f19f1b014ac60c0fcf7295b Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi <> Date: Thu, 16 Apr 2009 10:04:43 -0700 Subject: AI 146462: Add JetCreator demo content. BUG=1721874 Automated import of CL 146462 --- jet_tools/JetCreator_content/JetCreator_demo_1.zip | Bin 0 -> 138903 bytes jet_tools/JetCreator_content/JetCreator_demo_2.zip | Bin 0 -> 4739529 bytes jet_tools/JetCreator_content/README.txt | 11 +++++++++++ 3 files changed, 11 insertions(+) create mode 100755 jet_tools/JetCreator_content/JetCreator_demo_1.zip create mode 100755 jet_tools/JetCreator_content/JetCreator_demo_2.zip create mode 100644 jet_tools/JetCreator_content/README.txt diff --git a/jet_tools/JetCreator_content/JetCreator_demo_1.zip b/jet_tools/JetCreator_content/JetCreator_demo_1.zip new file mode 100755 index 0000000..298b108 Binary files /dev/null and b/jet_tools/JetCreator_content/JetCreator_demo_1.zip differ diff --git a/jet_tools/JetCreator_content/JetCreator_demo_2.zip b/jet_tools/JetCreator_content/JetCreator_demo_2.zip new file mode 100755 index 0000000..7702f80 Binary files /dev/null and b/jet_tools/JetCreator_content/JetCreator_demo_2.zip differ diff --git a/jet_tools/JetCreator_content/README.txt b/jet_tools/JetCreator_content/README.txt new file mode 100644 index 0000000..943c9b7 --- /dev/null +++ b/jet_tools/JetCreator_content/README.txt @@ -0,0 +1,11 @@ +JetCreator demonstration content + +The "JetCreator_content" folder contains JetCreator sample files. + +1. Open a command prompt and go to the directory where the JetCreator tool is located. + +2. Launch JET Creator by typing "Python JetCreator.py" (be sure Python and WXWidgets are installed on your system) + +3. Select the IMPORT command and import one of the JetCreator_demo_*.zip files. + +4. After importing the first time, you can use the OPEN command to open the .jtc file in the folder you selected as the target for import. -- cgit v1.2.3 From 832b53a54f52dbc573cfadd9e5bce6017e957f39 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet <> Date: Fri, 17 Apr 2009 11:10:20 -0700 Subject: AI 146747: Add the JetCreator tools and docs to the SDK (mac/windows only). BUG=1793093 Automated import of CL 146747 --- docs/JET_Authoring_Guidelines.htm | 2442 ----------------------------- docs/JET_Authoring_Guidelines.html | 2442 +++++++++++++++++++++++++++++ docs/JET_Creator_User_Manual.htm | 3032 ------------------------------------ docs/JET_Creator_User_Manual.html | 3032 ++++++++++++++++++++++++++++++++++++ docs/JET_Programming_Manual.htm | 1333 ---------------- docs/JET_Programming_Manual.html | 1333 ++++++++++++++++ 6 files changed, 6807 insertions(+), 6807 deletions(-) delete mode 100644 docs/JET_Authoring_Guidelines.htm create mode 100644 docs/JET_Authoring_Guidelines.html delete mode 100644 docs/JET_Creator_User_Manual.htm create mode 100644 docs/JET_Creator_User_Manual.html delete mode 100644 docs/JET_Programming_Manual.htm create mode 100644 docs/JET_Programming_Manual.html diff --git a/docs/JET_Authoring_Guidelines.htm b/docs/JET_Authoring_Guidelines.htm deleted file mode 100644 index 2ade2e3..0000000 --- a/docs/JET_Authoring_Guidelines.htm +++ /dev/null @@ -1,2442 +0,0 @@ - - - - - - - - -JET Authoring Guidelines - - - - - - - - -
-   Copyright (C) 2009 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
- -
- -

JET™ Content Authoring Guidelines

- -

JET Interactive Music Engine

- -

Vrs 1.0

- -

Authored by SONiVOX

- -

www.sonivoxrocks.com

- -

Copyright 2009 Sonic Network, Inc.

- -

 

- -

 

- -

1         -Introduction

- -

1.1        -Overview

- -

This document contains content creation -guidelines for composers and sound designers authoring music and sound effects -for the SONiVOX JET platform.  JET is an -interactive music player for small embedded devices, including the Google Android -platform. It allows applications to include interactive music soundtracks, in MIDI format, that respond in real-time to game play -events and user interaction.

- -

 

- -

JET works in conjunction with SONiVOX’s -Embedded Audio Synthesizer (EAS) which is the MIDI -playback device for Android.  Both the -JET and EAS engines are integrated into the Android embedded platform as well -as inherent in the JET Creator application. As such, the JET content author can -be sure that the playback will sound exactly the same in both the JET Creator -and the final Android application playing back on Android mobile devices.

- -

 

- -

The JET content author works in up to three -different applications to create JET content; a standard MIDI -sequencer (Logic, Cubase, etc.), optionally a DLS2 instrument editor (Awave), -and the JET Creator application to add and audition JET interactive elements.

- -

 

- -

The final result is a .jet file that the -content author gives to the application programmer for use in the game or -application.

- -

 

- -

 

- -

1.2        -Abbreviations and Common Terms

- -

It is important to use a common set of -terms to minimize confusion. Since JET uses MIDI -in a unique way, normal industry terms may not always suffice. Here is the -definition of terms as they are used in this document and in the JET Creator -application:

- -

 

- -

Channel: MIDI data associated with a specific MIDI -channel. Standard MIDI allows for 16 channels of MIDI -data each of which are typically associated with a specific instrument.

- -

 

- -

Controller: A MIDI event consisting of a -channel number, controller number, and a controller value. The MIDI spec associates many controller numbers with -specific functions, such as volume, expression, sustain pedal, etc. JET also -uses controller events as a means of embedding special control information in a -MIDI sequence to provide for audio -synchronization.

- -

 

- -

DAW: Digital Audio Workstation. A common term for MIDI -and audio sequencing applications such as Logic, SONAR, Cubase and others.

- -

 

- -

EAS: Embedded MIDI Synthesizer. The -name of the SONiVOX MIDI synthesizer engine.

- -

 

- -

JET: Jet Interactive Engine. The name of the SONiVOX JET interactive -music engine.

- -

 

- -

Segment: A musical section such as a chorus or verse that is a component of -the overall composition. In JET, a segment can be an entire MIDI file or a -derived from a portion of a MIDI file.

- -

 

- -

SMF-0: Standard MIDI File Type 0, a MIDI file that contains a single -track, but may be made up of multiple channels of MIDI -data.

- -

 

- -

SMF-1: Standard MIDI File Type 1, a MIDI file that contains a one more -tracks, and each track may in turn be made up of one or more channels of MIDI data. By convention, each channel is stored on a -separate track in an SMF-1 file. However, it is possible to have multiple MIDI -channels on a single track, or multiple tracks that contain data for the same MIDI channel.

- -

 

- -

Track: A single track in a DAW containing a timed sequence of MIDI events. Be careful not to confuse Tracks with -Channels. A MIDI file may contain many tracks with several tracks utilizing the -same MIDI channel.

- -

 

- -

 

- -

1         -The JET Interactive Music Concept

- -

Interactive music can be defined as music -that changes in real-time according to non-predictable events such as user -interaction or game play events. In this way, interactive music is much more -engaging as it has the ability to match the energy and mood of a game much -closer than a pre-composed composition that never changes. In some applications -and games, interactive music is central to the game play. Guitar Hero is one -such popular game. When the end user successfully ‘captures’ the musical notes -coming down the fret board, the music adapts itself and simultaneously keeps -score of successes and failures. JET allows for these types of music driven -games as well.

- -

 

- -

There are several methods for making and -controlling interactive music and JET is one such method. This section -describes the features of JET and how they might be used in a game or software -application. It also describes how JET can be used to save memory in small -footprint devices such as Android enabled mobile handsets.

- -

1.1.1       Data Compression

- -

JET supports a flexible music format that -can be used to create extended musical sequences with a minimal amount of data. -A musical composition is broken up into segments that can be sequenced to -create a longer piece. The sequencing can be fixed at the time the music file -is authored, or it can be created dynamically under program control.

- -

1.1.2       Linear Music Example

- -

- -

Figure 1: Linear Music Piece

- -

 

- -

This diagram shows how musical segments are -stored. Each segment is authored as a separate MIDI -file. A post-processing tool combines the files into a single container file. -Each segment can contain alternate music tracks that can be muted or un-muted -to create additional interest. An example might be a brass accent in the chorus -that is played only the last time through. Also, segments can be transposed up -or down.

- -

 

- -

The bottom part of the diagram shows how -the musical segments can be recombined to create a linear music piece. In this -example, the bridge might end with a half-step key modulation and the remaining -segments could be transposed up a half-step to match.

- -

1.1.3          -Non-linear Music Example

- -

- -

Figure 2: Non-linear music piece

- -

 

- -

In this diagram, we see a non-linear music -piece. The scenario is a first-person-shooter (FPS) and JET is providing the -background music. The intro plays as the level is loading and then transitions -under program control to the Searching segment. This segment is repeated -indefinitely, perhaps with small variations (using the mute/un-mute feature) -until activity in the game dictates a change.

- -

 

- -

As the player nears a monster lair, the -program starts a synchronized transition to the Danger segment, increasing the -tension level in the audio. As the player draws closer to the lair, additional -tracks are un-muted to increase the tension.

- -

 

- -

As the player enters into combat with the -monster, the program starts a synchronized transition to the Combat segment. -The segment repeats indefinitely as the combat continues. A Bonus Hit -temporarily un-mutes a decorative track that notifies the player of a -successful attack, and similarly, another track is temporarily un-muted to -signify when the player receives Special Damage.

- -

 

- -

At the end of combat, the music transitions -to a victory or defeat segment based on the outcome of battle.

- -

1.1.4          -Mute/Un-mute Synchronization

- -

JET can also synchronize the muting and -un-muting of tracks to events in the music. For example, in the FPS game, it -would probably be desirable to place the musical events relating to bonuses and -damage as close to the actual game event as possible. However, simply un-muting -a track at the moment the game event occurs might result in a music clip -starting in the middle. Alternatively, a clip could be started from the -beginning, but then it wouldn’t be synchronized with the other music tracks.

- -

 

- -

However, with the JET sync engine, a clip -can be started at the next opportune moment and maintain synchronization. This -can be accomplished by placing a number of short music clips on a decorative -track. A MIDI event in the stream signifies -the start of a clip and a second event signifies the end of a clip. When the -application calls the JET clip function, the next clip in the track is allowed -to play fully synchronized to the music. Optionally, the track can be -automatically muted by a second MIDI event.

- -

 

- -

- -

Figure 3: Synchronized Mute/Unmute

- -

1.2        -Audio Synchronization

- -

JET provides an audio synchronization API -that allows game play to be synchronized to events in the audio. The mechanism -relies on data embedded in the MIDI file at -the time the content is authored. When the JET engine senses an event during -playback it generates a callback into the application program. The timing of -the callback can be adjusted to compensate for any latency in the audio -playback system so that audio and video can be synchronized. The diagram below -shows an example of a simple music game that involves pressing the left and -right arrows in time with the music.

- -

 

- -

 

- -

- -

Figure 4: Music Game with Synchronization

- -

 

- -

The arrows represent events in the music -sequence where game events need to be synchronized. In this case, the blue -arrow represents a time where the player is supposed to press the left button, -and the red arrow is for the right button. The yellow arrow tells the game -engine that the sequence is complete. The player is allowed a certain time -window before and after the event to press the appropriate key.

- -

 

- -

If an event is received and the player has -not pressed a button, a timer is set to half the length of the window. If the -player presses the button before the timer expires, the game registers a -success, and if not, the game registers a failure.

- -

 

- -

If the player presses the button before the -event is received, a timer is set to half the length of the window. If an event -is received before the timer expires, the game registers a success, and if not, -the game registers a failure. Game play might also include bonuses for getting -close to the timing of the actual event.

- -

 

- -

2         -JET Content Authoring Overview

- -

To author JET files and hear them playback interactively, -the content author will work in two or three applications which are designed to -work together smoothly. The first is application is any off-the-shelf MIDI sequencing application or Digital Audio Workstation -that supports VST (for PC) or AU (for Mac) plugins. (Logic, SONAR, Cubase, etc) -Here the author will compose their MIDI music -files using the SONiVOX EAS Synth plugin as the playback synthesizer.

- -

 

- -

Once the composer has completed their MIDI file(s), they import them into the JET Creator application. -Here the author will setup and audition the conditions for interactive playback -within the JET enabled game.

- -

 

- -

Optionally, the author may elect to create -a custom DLS soundbank. This can be created in any off-the-shelf DLS authoring -application, such as Awave from MJSoft, and loaded into JET Creator along with -the MIDI files.

- -

 

- -

Below is an overview of this process. A -more detailed explanation of each step follows.

- -

 

- -
    -
  • Launch digital audio workstation (DAW)
  • -
      -
    • Assign the SONiVOX EAS Synth plugin as the playback - synthesizer
    • -
    • Optionally load a custom DLS2 soundset
    • -
    • Compose and save MIDI file(s)
    • -
    -
  • Launch the JET Creator application
  • -
      -
    • Create segments using the MIDI - and DLS2 source files
    • -
    • Add interactive elements
    • -
    • Audition interactive elements
    • -
    • Save and Export JET files for use in the Android application
    • -
    -
- -

 

- -

Launch DAW – Content authors will need to -use a third party MIDI authoring application to compose their MIDI -files. It is recommended they use a digital audio workstation (DAW) application -that supports VST or AU plugins as this will enable them to listen to the EAS -MIDI Synthesizer and DLS2 soundsets that will be utilized in the Android -application itself. Some examples of popular DAWs include SONAR (PC) and LOGIC -(MAC).

- -

 

- -

Assign SONiVOX EAS Synth plugin as the -playback synthesizer – The SONiVOX EAS Synth plugin is a VST and AU compatible -virtual instrument that plugs into VST or AU compatible DAWs. This software -plugin uses the same SONiVOX EAS MIDI synthesizer engine and default General -MIDI  wavetable soundset inherent in -Android. Using this plugin allows content authors to hear the exact audio -rendering of the instruments and MIDI file -that will be used in their Android applications.

- -

 

- -

Optionally Load DLS2 Soundset – The SONiVOX -EAS Synth plugin allows for the loading of any DLS2 compatible soundset for -playback. These could include a new GM wavetable set, or a small collection of -just a few custom instruments for a given application. Note, the DLS file does -not replace the internal GM wavetable used by the EAS engine. DLS soundsets -play in conjunction with the internal GM wavetable.

- -

 

- -

Compose MIDI File – Compose MIDI soundtracks for the Android application.

- -

 

- -

Launch JET Creator – Once all DLS2 and MIDI source files have been authored, the content author -should launch the JET Creator and begin creating JET Segments. The segments -will reference the MIDI files and any custom -DLS2 soundbanks.

- -

 

- -

Assign JET Segment Attributes – After -creating segments the content author interactive elements. Interactive elements -include mute and unmute settings of individual tracks in the MIDI file(s) as -well as MIDI controller numbers that serve as -“events” in the game. These attributes tell the JET engine how and when to play -the different musical segments according to the JET API commands in the Android -application. See below for more detail on this.

- -

 

- -

Audition Interactive Playback – After -assigning the segment attributes and creating the JET file, the content author -can audition all interactive playback elements in the JET Audition window.

- -

 

- -

Save .jtc File – After the author is -satisfied with the result, it is recommended they save the JET Creator .jtc -file which will save their settings, references to source files, etc.

- -

 

- -

Export Files – Exporting the JET Creator -file will bundle all source files and their attributes into a single .zip file. -The zip file will also contain a .jet file for use by the Android application.

- -

 

- -

 

- -

3         -EAS Synth Virtual Instrument Plugin

- -

Included in the JET Creator package is the -EAS software synthesizer in plug-in format. The EAS plugin synth allows the -composer to hear the instruments used in Android as they are composing their MIDI sequence. The EAS Synth plugin allows for the -loading of custom DLS2 sounds as well.

- -

 

- -

3.1        -Installing the EAS Synth Plugin

- -

Follow the instructions for your individual -DAW to install and utilize the plugin. For Mac users this will typically -involve copying the “EAS Synth.componant” file into your plugins folder which -is usually located at /Library/Audio/Plug-ins/Components. PC users will want to -install the “EAS Synth.dll” into the plugin folder that their DAW requires.

- -

 

- -

3.2        -Requirements and Settings for -using the EAS Synth Plugin

- -

The EAS Synth is an embedded synthesizer -for small mobile devices. This means it does not have the flexibility of high -end synthesizers typically utilized in a professional application such as -Logic, Digital Performer, etc. As such, only the following attributes are -supported.

- -

 

- -

Macintosh:

- -

 

- -

Mac OSX (Intel) Macs

- -

ASIO Supported Soundcards

- -

Sample Rate:    44100 hz

- -

Buffer Size:       256 kbytes

- -

 

- -

PC:

- -

 

- -

Windows 2000 or Vista -operating systems

- -

ASIO supported soundcards

- -

Sample Rate:    44100 hz

- -

Buffer Size:       256 kbytes

- -

 

- -

3.3        -Assigning MIDI -Tracks to use the EAS Synth

- -

Each DAW has its own particular method of -assigning MIDI tracks to virtual instrument -plugins such as the SONiVOX EAS Synth. Please consult the user manual for your -DAW for detailed instructions. Below are some general guidelines for Logic -(Mac) and SONAR (PC).

- -

3.3.1          -LOGIC 8

- -

The SONiVOX EAS Synth virtual instrument is -a multi-timbral synthesizer. (i.e. it plays back multiple instruments on unique -MIDI channels in a single instance) In Logic -8, however, you’ll want to set up 16 Logic Instruments, -each with their own instance of the EAS Synth. Each Instrument should be assigned -its own MIDI channel. Use Channel 10 for -Drums. The reason for this is that MIDI controller messages, such as Volume -(CC7) and Pan (CC10) will not be channelized if the plugin is assigned to only -a single Instrument and all MIDI tracks are -set to playback on that Instrument. In order for each MIDI -channel to respond to its own controller messages, you must assign 16 different -EAS Synth instances to 16 unique Logic Instruments.

- -

 

- -

A Logic 8 template file has been included -in the Android Cupcake release to facilitate the above.

- -

 

- -

Playback in Logic 8 may require you to be -in record enable mode for each track you are auditioning. To record enable -multiple tracks hold down the Option key.

- -

 

- -

To write out a standard MIDI -(type 1) file from Logic, you need to use the File Export command. IMPORTANT: -Most edits in Logic are non-destructive edits meaning they are not modifying -the actual data but rather adding an overlay onto to the data. Quantize is one -such non-destructive edit. Therefore when you export a MIDI -file, you may not see your quanitization settings.

- -

 

- -

In addition, the mix parameters for volume, -pan and program changes may not appear in the event list and therefore may not -write out with the MIDI file. Before exporting -a MIDI file in Logic it is recommended you do -the following:

- -

 

- -

Select All and use the “Insert MIDI > -Insert MIDI Settings as Events” command.

- -

 

- -

Select All and use the “Apply Quantization -Settings Destructively” command.

- -

 

- -

3.3.2          -Cakewalk SONAR 7

- -

Sonar 7 is a bit easier to set up, use and -save than Logic 8. Simply open or start a new MIDI -file. Go to the Insert menu and select Insert Soft Synth>SONiVOX>EAS -Synth. Then assign each MIDI track’s output to -the EAS Synth. There is no need to record enable a track to hear it play back. -When saving, be sure to select MIDI Type 1.

- -

 

- -

SONAR 8 works similarly to SONAR 7.

- -

 

- -

3.3.3          -Digital Performer

- -

We’ve seen some instances when creating -content with Digital Performer where notes with a release velocity of non-0 -will generate an extra note-on event in the EAS synth. If you are hearing a -doubling, editing the release velocity events to zero should fix this problem.

- -

 

- -

3.4        -Using Custom DLS2 Soundsets

- -

The SONiVOX EAS Synthesizer supports two -simultaneous soundsets or wavetables. One is the internal General MIDI wavetable -inherent to the SONiVOX EAS Synthesizer. The other is a Downloadable Sounds -Level 2 (DLS2) soundset. The internal wavetable is a GM Level 1 compliant -wavetable with 127 melodic instruments and 1 drumkit. It is in a proprietary -SONiVOX format. The DLS2 soundsets are an open format published by the MIDI -Manufactures Association.

- -

 

- -

In the Android Cupcake release, the -internal wavetable is only 200 kbytes, very small, in order to be compliant -with all Android devices which may not have a lot of memory. DLS2 soundsets can -be any size that a particular device supports. Upgraded (larger) internal -wavetables as well as custom DLS2 instruments can be licensed from SONiVOX.

- -

3.4.1          -Loading a DLS2 Soundset

- -

To load a custom soundset, click on the -Load DLS button in the EAS Synth plugin interface. Browse to the DLS2 file you -wish to load and say OK. Only DLS Level 2 formatted soundsets are -supported.

- -

 

- -

3.4.2          -Using a DLS2 Soundset

- -

Since both the internal EAS GM wavetable -and a custom DLS2 soundset are used simultaneously, you must be sure you have -your MIDI Program Changes set correctly. DLS2 instruments must be assigned to a -Bank other than the default GM bank -used by the internal synthesizer.

- -

 

- -

The internal EAS synthesizer is assigned to -Banks 121 (melodic instruments) and 120 (drum instruments). This follows the -General MIDI Level 1 specification. Note: Most MIDI -sequencers require you to use Bank 0 to select the default wavetable. Custom -DLS2 soundsets, therefore, should utilize a different Bank. We recommend Bank -1.

- -

 

- -

The EAS synth supports MSB (Controller 0), -LSB (Controller 32) Bank change messages. There are two places you need to set -this Bank and Program Change number. The first is in your DLS2 soundset. Using -Bank 1, each Instrument would be assigned MSB 1, LSB 0, then the Instrument -Program Change number. The second place to use the Bank and Program Change -number is in your MIDI sequence.

- -

 

- -

In your MIDI -track, the MSB should be sent first followed by the LSB and then the Instrument -number. For example, if your DLS2 instrument is assigned MSB 1, LSB 0, -Program1, you would send CC0, 1 followed by CC32, 0 followed by Program Change -Message 1. This might look like the following in an event window:

- -

 

- -

 

- -

- -

 

- -

 

- -

 

- -

4         -JET Creator Guidelines

- -

JET Creator is the desktop application -where you’ll edit and audition the JET interactive music elements. For details -on the JET Creator application please see the “JET Creator User Manual”. Below -are some additional guidelines to help you out.

- -

 

- -

 

- -

 

- -

4.1        -Order of Tasks

- -

As with all projects, its best to discuss and -design the interactive music scheme with the game designer and programmer -before beginning your composition. An outline and/or specification can go a -long way in saving you from having to redo things after the game is in place.

- -

 

- -

In general you’ll want to first write your -music in your DAW of choice the way you’re used to composing, then break up the -final MIDI file as needed for the application. -Next, move to JET Creator and create all of your music segments in the order -easiest to preview them when played in order. Finally, add the JET Events to -control the segments via the Android game and Audition them as needed in JET -Creator. Finally, save the project in JET Creator and hand off the .jet file to -the programmer to integrate it in the game. After previewing there will likely -be changes to the MIDI file(s) and JET Creator -attributes.

- -

 

- -

4.2        -Conserving Memory

- -

If you’re trying to conserve memory, -compose as few MIDI files as possible, and create several segments from that MIDI file. For example a 12 bar MIDI -file with three sections of 4 bars, A, B, C, can create a much longer song. -Simply create multiple segments that reference the one MIDI -file, then order them however you like. For example, A, A, B, A, C, A, B, A, A -would create a 36 bar song. Use JET to add repeats, transpose segments, and -interactively mute and unmute tracks to keep it even more interesting.

- -

 

- -

4.3        -Replicate

- -

To make adding segments or events faster, -use the Replicate command. Replicate can add multiple segments or events at one -time and uses an offset parameter and prefix naming convention to keep things -easy to read. The MOVE command is also useful for moving multiple events by a -set number of measures, beats or ticks.

- -

 

- -

4.4        -Interactive Options

- -

There are several interactive audio -concepts possible in JET. Below are a few examples although we hope developers -will come up with others we haven’t thought of! These are:

- -

4.4.1          -Multiple Segment Triggering

- -

In this method the application is -triggering specific segments based on events in the game. For example a hallway -with lots of fighting might trigger segment 1 and a hallway with no fighting -might trigger segment 2. Using JET TriggerClips in conjunction with this method -creates even more diversity.

- -

4.4.2          -Mute Arrays

- -

In this method the application is -triggering mute and unmute events to specific tracks in a single MIDI sequence. For example a hallway with lots of -fighting might play MIDI tracks 1-16 and a -hallway with no fighting might play the same midi file but mute tracks 9-16. -Using JET TriggerClips in conjunction with this method creates even more -diversity.

- -

4.4.3          -Music Driven Gameplay

- -

Music driven gaming is similar to what -Guitar Hero and JETBOY have done in that the music content determines how -graphic events are displayed. The application then queries the user response to -the graphic events and interactively modifies the music in response. In this -method the game is utilizing JET Application Events, MIDI controllers that are -embedded in the MIDI file and read by the game -in real-time. Based on the user response, multiple segment triggering and/or -mute arrays can be set.

- -

 

- -

 

- -
- - - - diff --git a/docs/JET_Authoring_Guidelines.html b/docs/JET_Authoring_Guidelines.html new file mode 100644 index 0000000..2ade2e3 --- /dev/null +++ b/docs/JET_Authoring_Guidelines.html @@ -0,0 +1,2442 @@ + + + + + + + + +JET Authoring Guidelines + + + + + + + + +
+   Copyright (C) 2009 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ +
+ +

JET™ Content Authoring Guidelines

+ +

JET Interactive Music Engine

+ +

Vrs 1.0

+ +

Authored by SONiVOX

+ +

www.sonivoxrocks.com

+ +

Copyright 2009 Sonic Network, Inc.

+ +

 

+ +

 

+ +

1         +Introduction

+ +

1.1        +Overview

+ +

This document contains content creation +guidelines for composers and sound designers authoring music and sound effects +for the SONiVOX JET platform.  JET is an +interactive music player for small embedded devices, including the Google Android +platform. It allows applications to include interactive music soundtracks, in MIDI format, that respond in real-time to game play +events and user interaction.

+ +

 

+ +

JET works in conjunction with SONiVOX’s +Embedded Audio Synthesizer (EAS) which is the MIDI +playback device for Android.  Both the +JET and EAS engines are integrated into the Android embedded platform as well +as inherent in the JET Creator application. As such, the JET content author can +be sure that the playback will sound exactly the same in both the JET Creator +and the final Android application playing back on Android mobile devices.

+ +

 

+ +

The JET content author works in up to three +different applications to create JET content; a standard MIDI +sequencer (Logic, Cubase, etc.), optionally a DLS2 instrument editor (Awave), +and the JET Creator application to add and audition JET interactive elements.

+ +

 

+ +

The final result is a .jet file that the +content author gives to the application programmer for use in the game or +application.

+ +

 

+ +

 

+ +

1.2        +Abbreviations and Common Terms

+ +

It is important to use a common set of +terms to minimize confusion. Since JET uses MIDI +in a unique way, normal industry terms may not always suffice. Here is the +definition of terms as they are used in this document and in the JET Creator +application:

+ +

 

+ +

Channel: MIDI data associated with a specific MIDI +channel. Standard MIDI allows for 16 channels of MIDI +data each of which are typically associated with a specific instrument.

+ +

 

+ +

Controller: A MIDI event consisting of a +channel number, controller number, and a controller value. The MIDI spec associates many controller numbers with +specific functions, such as volume, expression, sustain pedal, etc. JET also +uses controller events as a means of embedding special control information in a +MIDI sequence to provide for audio +synchronization.

+ +

 

+ +

DAW: Digital Audio Workstation. A common term for MIDI +and audio sequencing applications such as Logic, SONAR, Cubase and others.

+ +

 

+ +

EAS: Embedded MIDI Synthesizer. The +name of the SONiVOX MIDI synthesizer engine.

+ +

 

+ +

JET: Jet Interactive Engine. The name of the SONiVOX JET interactive +music engine.

+ +

 

+ +

Segment: A musical section such as a chorus or verse that is a component of +the overall composition. In JET, a segment can be an entire MIDI file or a +derived from a portion of a MIDI file.

+ +

 

+ +

SMF-0: Standard MIDI File Type 0, a MIDI file that contains a single +track, but may be made up of multiple channels of MIDI +data.

+ +

 

+ +

SMF-1: Standard MIDI File Type 1, a MIDI file that contains a one more +tracks, and each track may in turn be made up of one or more channels of MIDI data. By convention, each channel is stored on a +separate track in an SMF-1 file. However, it is possible to have multiple MIDI +channels on a single track, or multiple tracks that contain data for the same MIDI channel.

+ +

 

+ +

Track: A single track in a DAW containing a timed sequence of MIDI events. Be careful not to confuse Tracks with +Channels. A MIDI file may contain many tracks with several tracks utilizing the +same MIDI channel.

+ +

 

+ +

 

+ +

1         +The JET Interactive Music Concept

+ +

Interactive music can be defined as music +that changes in real-time according to non-predictable events such as user +interaction or game play events. In this way, interactive music is much more +engaging as it has the ability to match the energy and mood of a game much +closer than a pre-composed composition that never changes. In some applications +and games, interactive music is central to the game play. Guitar Hero is one +such popular game. When the end user successfully ‘captures’ the musical notes +coming down the fret board, the music adapts itself and simultaneously keeps +score of successes and failures. JET allows for these types of music driven +games as well.

+ +

 

+ +

There are several methods for making and +controlling interactive music and JET is one such method. This section +describes the features of JET and how they might be used in a game or software +application. It also describes how JET can be used to save memory in small +footprint devices such as Android enabled mobile handsets.

+ +

1.1.1       Data Compression

+ +

JET supports a flexible music format that +can be used to create extended musical sequences with a minimal amount of data. +A musical composition is broken up into segments that can be sequenced to +create a longer piece. The sequencing can be fixed at the time the music file +is authored, or it can be created dynamically under program control.

+ +

1.1.2       Linear Music Example

+ +

+ +

Figure 1: Linear Music Piece

+ +

 

+ +

This diagram shows how musical segments are +stored. Each segment is authored as a separate MIDI +file. A post-processing tool combines the files into a single container file. +Each segment can contain alternate music tracks that can be muted or un-muted +to create additional interest. An example might be a brass accent in the chorus +that is played only the last time through. Also, segments can be transposed up +or down.

+ +

 

+ +

The bottom part of the diagram shows how +the musical segments can be recombined to create a linear music piece. In this +example, the bridge might end with a half-step key modulation and the remaining +segments could be transposed up a half-step to match.

+ +

1.1.3          +Non-linear Music Example

+ +

+ +

Figure 2: Non-linear music piece

+ +

 

+ +

In this diagram, we see a non-linear music +piece. The scenario is a first-person-shooter (FPS) and JET is providing the +background music. The intro plays as the level is loading and then transitions +under program control to the Searching segment. This segment is repeated +indefinitely, perhaps with small variations (using the mute/un-mute feature) +until activity in the game dictates a change.

+ +

 

+ +

As the player nears a monster lair, the +program starts a synchronized transition to the Danger segment, increasing the +tension level in the audio. As the player draws closer to the lair, additional +tracks are un-muted to increase the tension.

+ +

 

+ +

As the player enters into combat with the +monster, the program starts a synchronized transition to the Combat segment. +The segment repeats indefinitely as the combat continues. A Bonus Hit +temporarily un-mutes a decorative track that notifies the player of a +successful attack, and similarly, another track is temporarily un-muted to +signify when the player receives Special Damage.

+ +

 

+ +

At the end of combat, the music transitions +to a victory or defeat segment based on the outcome of battle.

+ +

1.1.4          +Mute/Un-mute Synchronization

+ +

JET can also synchronize the muting and +un-muting of tracks to events in the music. For example, in the FPS game, it +would probably be desirable to place the musical events relating to bonuses and +damage as close to the actual game event as possible. However, simply un-muting +a track at the moment the game event occurs might result in a music clip +starting in the middle. Alternatively, a clip could be started from the +beginning, but then it wouldn’t be synchronized with the other music tracks.

+ +

 

+ +

However, with the JET sync engine, a clip +can be started at the next opportune moment and maintain synchronization. This +can be accomplished by placing a number of short music clips on a decorative +track. A MIDI event in the stream signifies +the start of a clip and a second event signifies the end of a clip. When the +application calls the JET clip function, the next clip in the track is allowed +to play fully synchronized to the music. Optionally, the track can be +automatically muted by a second MIDI event.

+ +

 

+ +

+ +

Figure 3: Synchronized Mute/Unmute

+ +

1.2        +Audio Synchronization

+ +

JET provides an audio synchronization API +that allows game play to be synchronized to events in the audio. The mechanism +relies on data embedded in the MIDI file at +the time the content is authored. When the JET engine senses an event during +playback it generates a callback into the application program. The timing of +the callback can be adjusted to compensate for any latency in the audio +playback system so that audio and video can be synchronized. The diagram below +shows an example of a simple music game that involves pressing the left and +right arrows in time with the music.

+ +

 

+ +

 

+ +

+ +

Figure 4: Music Game with Synchronization

+ +

 

+ +

The arrows represent events in the music +sequence where game events need to be synchronized. In this case, the blue +arrow represents a time where the player is supposed to press the left button, +and the red arrow is for the right button. The yellow arrow tells the game +engine that the sequence is complete. The player is allowed a certain time +window before and after the event to press the appropriate key.

+ +

 

+ +

If an event is received and the player has +not pressed a button, a timer is set to half the length of the window. If the +player presses the button before the timer expires, the game registers a +success, and if not, the game registers a failure.

+ +

 

+ +

If the player presses the button before the +event is received, a timer is set to half the length of the window. If an event +is received before the timer expires, the game registers a success, and if not, +the game registers a failure. Game play might also include bonuses for getting +close to the timing of the actual event.

+ +

 

+ +

2         +JET Content Authoring Overview

+ +

To author JET files and hear them playback interactively, +the content author will work in two or three applications which are designed to +work together smoothly. The first is application is any off-the-shelf MIDI sequencing application or Digital Audio Workstation +that supports VST (for PC) or AU (for Mac) plugins. (Logic, SONAR, Cubase, etc) +Here the author will compose their MIDI music +files using the SONiVOX EAS Synth plugin as the playback synthesizer.

+ +

 

+ +

Once the composer has completed their MIDI file(s), they import them into the JET Creator application. +Here the author will setup and audition the conditions for interactive playback +within the JET enabled game.

+ +

 

+ +

Optionally, the author may elect to create +a custom DLS soundbank. This can be created in any off-the-shelf DLS authoring +application, such as Awave from MJSoft, and loaded into JET Creator along with +the MIDI files.

+ +

 

+ +

Below is an overview of this process. A +more detailed explanation of each step follows.

+ +

 

+ +
    +
  • Launch digital audio workstation (DAW)
  • +
      +
    • Assign the SONiVOX EAS Synth plugin as the playback + synthesizer
    • +
    • Optionally load a custom DLS2 soundset
    • +
    • Compose and save MIDI file(s)
    • +
    +
  • Launch the JET Creator application
  • +
      +
    • Create segments using the MIDI + and DLS2 source files
    • +
    • Add interactive elements
    • +
    • Audition interactive elements
    • +
    • Save and Export JET files for use in the Android application
    • +
    +
+ +

 

+ +

Launch DAW – Content authors will need to +use a third party MIDI authoring application to compose their MIDI +files. It is recommended they use a digital audio workstation (DAW) application +that supports VST or AU plugins as this will enable them to listen to the EAS +MIDI Synthesizer and DLS2 soundsets that will be utilized in the Android +application itself. Some examples of popular DAWs include SONAR (PC) and LOGIC +(MAC).

+ +

 

+ +

Assign SONiVOX EAS Synth plugin as the +playback synthesizer – The SONiVOX EAS Synth plugin is a VST and AU compatible +virtual instrument that plugs into VST or AU compatible DAWs. This software +plugin uses the same SONiVOX EAS MIDI synthesizer engine and default General +MIDI  wavetable soundset inherent in +Android. Using this plugin allows content authors to hear the exact audio +rendering of the instruments and MIDI file +that will be used in their Android applications.

+ +

 

+ +

Optionally Load DLS2 Soundset – The SONiVOX +EAS Synth plugin allows for the loading of any DLS2 compatible soundset for +playback. These could include a new GM wavetable set, or a small collection of +just a few custom instruments for a given application. Note, the DLS file does +not replace the internal GM wavetable used by the EAS engine. DLS soundsets +play in conjunction with the internal GM wavetable.

+ +

 

+ +

Compose MIDI File – Compose MIDI soundtracks for the Android application.

+ +

 

+ +

Launch JET Creator – Once all DLS2 and MIDI source files have been authored, the content author +should launch the JET Creator and begin creating JET Segments. The segments +will reference the MIDI files and any custom +DLS2 soundbanks.

+ +

 

+ +

Assign JET Segment Attributes – After +creating segments the content author interactive elements. Interactive elements +include mute and unmute settings of individual tracks in the MIDI file(s) as +well as MIDI controller numbers that serve as +“events” in the game. These attributes tell the JET engine how and when to play +the different musical segments according to the JET API commands in the Android +application. See below for more detail on this.

+ +

 

+ +

Audition Interactive Playback – After +assigning the segment attributes and creating the JET file, the content author +can audition all interactive playback elements in the JET Audition window.

+ +

 

+ +

Save .jtc File – After the author is +satisfied with the result, it is recommended they save the JET Creator .jtc +file which will save their settings, references to source files, etc.

+ +

 

+ +

Export Files – Exporting the JET Creator +file will bundle all source files and their attributes into a single .zip file. +The zip file will also contain a .jet file for use by the Android application.

+ +

 

+ +

 

+ +

3         +EAS Synth Virtual Instrument Plugin

+ +

Included in the JET Creator package is the +EAS software synthesizer in plug-in format. The EAS plugin synth allows the +composer to hear the instruments used in Android as they are composing their MIDI sequence. The EAS Synth plugin allows for the +loading of custom DLS2 sounds as well.

+ +

 

+ +

3.1        +Installing the EAS Synth Plugin

+ +

Follow the instructions for your individual +DAW to install and utilize the plugin. For Mac users this will typically +involve copying the “EAS Synth.componant” file into your plugins folder which +is usually located at /Library/Audio/Plug-ins/Components. PC users will want to +install the “EAS Synth.dll” into the plugin folder that their DAW requires.

+ +

 

+ +

3.2        +Requirements and Settings for +using the EAS Synth Plugin

+ +

The EAS Synth is an embedded synthesizer +for small mobile devices. This means it does not have the flexibility of high +end synthesizers typically utilized in a professional application such as +Logic, Digital Performer, etc. As such, only the following attributes are +supported.

+ +

 

+ +

Macintosh:

+ +

 

+ +

Mac OSX (Intel) Macs

+ +

ASIO Supported Soundcards

+ +

Sample Rate:    44100 hz

+ +

Buffer Size:       256 kbytes

+ +

 

+ +

PC:

+ +

 

+ +

Windows 2000 or Vista +operating systems

+ +

ASIO supported soundcards

+ +

Sample Rate:    44100 hz

+ +

Buffer Size:       256 kbytes

+ +

 

+ +

3.3        +Assigning MIDI +Tracks to use the EAS Synth

+ +

Each DAW has its own particular method of +assigning MIDI tracks to virtual instrument +plugins such as the SONiVOX EAS Synth. Please consult the user manual for your +DAW for detailed instructions. Below are some general guidelines for Logic +(Mac) and SONAR (PC).

+ +

3.3.1          +LOGIC 8

+ +

The SONiVOX EAS Synth virtual instrument is +a multi-timbral synthesizer. (i.e. it plays back multiple instruments on unique +MIDI channels in a single instance) In Logic +8, however, you’ll want to set up 16 Logic Instruments, +each with their own instance of the EAS Synth. Each Instrument should be assigned +its own MIDI channel. Use Channel 10 for +Drums. The reason for this is that MIDI controller messages, such as Volume +(CC7) and Pan (CC10) will not be channelized if the plugin is assigned to only +a single Instrument and all MIDI tracks are +set to playback on that Instrument. In order for each MIDI +channel to respond to its own controller messages, you must assign 16 different +EAS Synth instances to 16 unique Logic Instruments.

+ +

 

+ +

A Logic 8 template file has been included +in the Android Cupcake release to facilitate the above.

+ +

 

+ +

Playback in Logic 8 may require you to be +in record enable mode for each track you are auditioning. To record enable +multiple tracks hold down the Option key.

+ +

 

+ +

To write out a standard MIDI +(type 1) file from Logic, you need to use the File Export command. IMPORTANT: +Most edits in Logic are non-destructive edits meaning they are not modifying +the actual data but rather adding an overlay onto to the data. Quantize is one +such non-destructive edit. Therefore when you export a MIDI +file, you may not see your quanitization settings.

+ +

 

+ +

In addition, the mix parameters for volume, +pan and program changes may not appear in the event list and therefore may not +write out with the MIDI file. Before exporting +a MIDI file in Logic it is recommended you do +the following:

+ +

 

+ +

Select All and use the “Insert MIDI > +Insert MIDI Settings as Events” command.

+ +

 

+ +

Select All and use the “Apply Quantization +Settings Destructively” command.

+ +

 

+ +

3.3.2          +Cakewalk SONAR 7

+ +

Sonar 7 is a bit easier to set up, use and +save than Logic 8. Simply open or start a new MIDI +file. Go to the Insert menu and select Insert Soft Synth>SONiVOX>EAS +Synth. Then assign each MIDI track’s output to +the EAS Synth. There is no need to record enable a track to hear it play back. +When saving, be sure to select MIDI Type 1.

+ +

 

+ +

SONAR 8 works similarly to SONAR 7.

+ +

 

+ +

3.3.3          +Digital Performer

+ +

We’ve seen some instances when creating +content with Digital Performer where notes with a release velocity of non-0 +will generate an extra note-on event in the EAS synth. If you are hearing a +doubling, editing the release velocity events to zero should fix this problem.

+ +

 

+ +

3.4        +Using Custom DLS2 Soundsets

+ +

The SONiVOX EAS Synthesizer supports two +simultaneous soundsets or wavetables. One is the internal General MIDI wavetable +inherent to the SONiVOX EAS Synthesizer. The other is a Downloadable Sounds +Level 2 (DLS2) soundset. The internal wavetable is a GM Level 1 compliant +wavetable with 127 melodic instruments and 1 drumkit. It is in a proprietary +SONiVOX format. The DLS2 soundsets are an open format published by the MIDI +Manufactures Association.

+ +

 

+ +

In the Android Cupcake release, the +internal wavetable is only 200 kbytes, very small, in order to be compliant +with all Android devices which may not have a lot of memory. DLS2 soundsets can +be any size that a particular device supports. Upgraded (larger) internal +wavetables as well as custom DLS2 instruments can be licensed from SONiVOX.

+ +

3.4.1          +Loading a DLS2 Soundset

+ +

To load a custom soundset, click on the +Load DLS button in the EAS Synth plugin interface. Browse to the DLS2 file you +wish to load and say OK. Only DLS Level 2 formatted soundsets are +supported.

+ +

 

+ +

3.4.2          +Using a DLS2 Soundset

+ +

Since both the internal EAS GM wavetable +and a custom DLS2 soundset are used simultaneously, you must be sure you have +your MIDI Program Changes set correctly. DLS2 instruments must be assigned to a +Bank other than the default GM bank +used by the internal synthesizer.

+ +

 

+ +

The internal EAS synthesizer is assigned to +Banks 121 (melodic instruments) and 120 (drum instruments). This follows the +General MIDI Level 1 specification. Note: Most MIDI +sequencers require you to use Bank 0 to select the default wavetable. Custom +DLS2 soundsets, therefore, should utilize a different Bank. We recommend Bank +1.

+ +

 

+ +

The EAS synth supports MSB (Controller 0), +LSB (Controller 32) Bank change messages. There are two places you need to set +this Bank and Program Change number. The first is in your DLS2 soundset. Using +Bank 1, each Instrument would be assigned MSB 1, LSB 0, then the Instrument +Program Change number. The second place to use the Bank and Program Change +number is in your MIDI sequence.

+ +

 

+ +

In your MIDI +track, the MSB should be sent first followed by the LSB and then the Instrument +number. For example, if your DLS2 instrument is assigned MSB 1, LSB 0, +Program1, you would send CC0, 1 followed by CC32, 0 followed by Program Change +Message 1. This might look like the following in an event window:

+ +

 

+ +

 

+ +

+ +

 

+ +

 

+ +

 

+ +

4         +JET Creator Guidelines

+ +

JET Creator is the desktop application +where you’ll edit and audition the JET interactive music elements. For details +on the JET Creator application please see the “JET Creator User Manual”. Below +are some additional guidelines to help you out.

+ +

 

+ +

 

+ +

 

+ +

4.1        +Order of Tasks

+ +

As with all projects, its best to discuss and +design the interactive music scheme with the game designer and programmer +before beginning your composition. An outline and/or specification can go a +long way in saving you from having to redo things after the game is in place.

+ +

 

+ +

In general you’ll want to first write your +music in your DAW of choice the way you’re used to composing, then break up the +final MIDI file as needed for the application. +Next, move to JET Creator and create all of your music segments in the order +easiest to preview them when played in order. Finally, add the JET Events to +control the segments via the Android game and Audition them as needed in JET +Creator. Finally, save the project in JET Creator and hand off the .jet file to +the programmer to integrate it in the game. After previewing there will likely +be changes to the MIDI file(s) and JET Creator +attributes.

+ +

 

+ +

4.2        +Conserving Memory

+ +

If you’re trying to conserve memory, +compose as few MIDI files as possible, and create several segments from that MIDI file. For example a 12 bar MIDI +file with three sections of 4 bars, A, B, C, can create a much longer song. +Simply create multiple segments that reference the one MIDI +file, then order them however you like. For example, A, A, B, A, C, A, B, A, A +would create a 36 bar song. Use JET to add repeats, transpose segments, and +interactively mute and unmute tracks to keep it even more interesting.

+ +

 

+ +

4.3        +Replicate

+ +

To make adding segments or events faster, +use the Replicate command. Replicate can add multiple segments or events at one +time and uses an offset parameter and prefix naming convention to keep things +easy to read. The MOVE command is also useful for moving multiple events by a +set number of measures, beats or ticks.

+ +

 

+ +

4.4        +Interactive Options

+ +

There are several interactive audio +concepts possible in JET. Below are a few examples although we hope developers +will come up with others we haven’t thought of! These are:

+ +

4.4.1          +Multiple Segment Triggering

+ +

In this method the application is +triggering specific segments based on events in the game. For example a hallway +with lots of fighting might trigger segment 1 and a hallway with no fighting +might trigger segment 2. Using JET TriggerClips in conjunction with this method +creates even more diversity.

+ +

4.4.2          +Mute Arrays

+ +

In this method the application is +triggering mute and unmute events to specific tracks in a single MIDI sequence. For example a hallway with lots of +fighting might play MIDI tracks 1-16 and a +hallway with no fighting might play the same midi file but mute tracks 9-16. +Using JET TriggerClips in conjunction with this method creates even more +diversity.

+ +

4.4.3          +Music Driven Gameplay

+ +

Music driven gaming is similar to what +Guitar Hero and JETBOY have done in that the music content determines how +graphic events are displayed. The application then queries the user response to +the graphic events and interactively modifies the music in response. In this +method the game is utilizing JET Application Events, MIDI controllers that are +embedded in the MIDI file and read by the game +in real-time. Based on the user response, multiple segment triggering and/or +mute arrays can be set.

+ +

 

+ +

 

+ +
+ + + + diff --git a/docs/JET_Creator_User_Manual.htm b/docs/JET_Creator_User_Manual.htm deleted file mode 100644 index 8582f5f..0000000 --- a/docs/JET_Creator_User_Manual.htm +++ /dev/null @@ -1,3032 +0,0 @@ - - - - - - - - - - - -SONiVOX JET Creator User Manual - - - - - - - - -
-   Copyright (C) 2009 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
- -
- -

JETCreator™ User Manual

- -

Vrs 1.0

- -

Content -Authoring Application for the

- -

JET -Interactive Music Engine

- -

Authored by SONiVOX

- -

www.sonivoxrocks.com

- -

Copyright 2009 Sonic Network, Inc.

- - - -

 

- -

 

- -

1         -Introduction

- -

1.1        -Overview

- -

This document contains the user guidelines -for the SONiVOX JET Creator, an authoring application for creating and -auditioning JET files. JET is an interactive music player for small embedded -devices, including the Google Android platform. It allows applications to -include interactive music soundtracks, in MIDI -format, that respond in real-time to game play events and user interaction.

- -

 

- -

JET works in conjunction with SONiVOX’s -Embedded Audio Synthesizer (EAS) which is the MIDI -playback device for Android.  Both the -JET and EAS engines are integrated into the Android embedded platform as well -as inherent in the JET Creator application. As such, the JET content author can -be sure that the playback will sound exactly the same in both the JET Creator -and the final Android application playing back on Android mobile devices.

- -

 

- -

In addition to the graphical user -interface, there are two main functionalities taking place in JET Creator. The -first involves gathering all the source data (MIDI -files and DLS file), adding JET’s real-time attributes and building a JET -(.jet) file that the Android application will use. The second functionality -involves auditioning the interactive playback elements as they will take place -in the Android application.

- -

 

- -

The JET Creator application is written in -the Python programming language, therefore you need to have the current version -of Python and WXWidgets installed. There is both a Mac and Windows version.

- -

 

- -

 

- -

1.2        -Abbreviations and Common Terms

- -

 

- -

It is important to use a common set of -terms to minimize confusion. Since JET uses MIDI -in a unique way, normal industry terms may not always suffice. Here is the -definition of terms as they are used in this document and in the JET Creator -application:

- -

 

- -

Channel: MIDI data associated with a specific MIDI -channel. Standard MIDI allows for 16 channels of MIDI -data each of which are typically associated with a specific instrument.

- -

 

- -

Controller: A MIDI event consisting of a -channel number, controller number, and a controller value. The MIDI spec associates many controller numbers with -specific functions, such as volume, expression, sustain pedal, etc. JET also -uses controller events as a means of embedding special control information in a -MIDI sequence to provide for audio synchronization.

- -

 

- -

DAW: Digital Audio Workstation. A common term for MIDI -and audio sequencing applications such as Logic, SONAR, Cubase and others.

- -

 

- -

EAS: Embedded MIDI Synthesizer. The -name of the SONiVOX MIDI synthesizer engine.

- -

 

- -

JET: Jet Interactive Engine. The name of the SONiVOX JET interactive -music engine.

- -

 

- -

M/B/T: Measures, Beats and Ticks

- -

 

- -

Segment: A musical section such as a chorus or verse that is a component of -the overall composition. In JET, a segment can be an entire MIDI file or a -derived from a portion of a MIDI file.

- -

 

- -

SMF-0: Standard MIDI File Type 0, a MIDI file that contains a single -track, but may be made up of multiple channels of MIDI -data.

- -

 

- -

SMF-1: Standard MIDI File Type 1, a MIDI file that contains a one more -tracks, and each track may in turn be made up of one or more channels of MIDI data. By convention, each channel is stored on a -separate track in an SMF-1 file. However, it is possible to have multiple MIDI -channels on a single track, or multiple tracks that contain data for the same MIDI channel.

- -

 

- -

Track: A single track in a DAW containing a timed sequence of MIDI events. Be careful not to confuse Tracks with -Channels. A MIDI file may contain many tracks with several tracks utilizing the -same MIDI channel.

- -

 

- -

 

- -

1         -The JET Interactive Music Concept

- -

Interactive music can be defined as music -that changes in real-time according to non-predictable events such as user -interaction or game play events. In this way, interactive music is much more -engaging as it has the ability to match the energy and mood of a game much -closer than a pre-composed composition that never changes. In some applications -and games, interactive music is central to the game play. Guitar Hero is one -such popular game. When the end user successfully ‘captures’ the musical notes -coming down the fret board, the music adapts itself and simultaneously keeps -score of successes and failures. JET allows for these types of music driven -games as well.

- -

 

- -

There are several methods for making and -controlling interactive music and JET is one such method. This section -describes the features of JET and how they might be used in a game or software -application. It also describes how JET can be used to save memory in small -footprint devices such as Android enabled mobile handsets.

- -

1.1.1       Data Compression

- -

JET supports a flexible music format that -can be used to create extended musical sequences with a minimal amount of data. -A musical composition is broken up into segments that can be sequenced to -create a longer piece. The sequencing can be fixed at the time the music file -is authored, or it can be created dynamically under program control.

- -

1.1.2       Linear Music Example

- -

- -

Figure 1: Linear Music Piece

- -

 

- -

This diagram shows how musical segments are -stored. Each segment is authored as a separate MIDI -file. A post-processing tool combines the files into a single container file. -Each segment can contain alternate music tracks that can be muted or un-muted -to create additional interest. An example might be a brass accent in the chorus -that is played only the last time through. Also, segments can be transposed up -or down.

- -

 

- -

The bottom part of the diagram shows how -the musical segments can be recombined to create a linear music piece. In this -example, the bridge might end with a half-step key modulation and the remaining -segments could be transposed up a half-step to match.

- -

1.1.3          -Non-linear Music Example

- -

- -

Figure 2: Non-linear music piece

- -

 

- -

In this diagram, we see a non-linear music -piece. The scenario is a first-person-shooter (FPS) and JET is providing the -background music. The intro plays as the level is loading and then transitions -under program control to the Searching segment. This segment is repeated indefinitely, -perhaps with small variations (using the mute/un-mute feature) until activity -in the game dictates a change.

- -

 

- -

As the player nears a monster lair, the -program starts a synchronized transition to the Danger segment, increasing the -tension level in the audio. As the player draws closer to the lair, additional -tracks are un-muted to increase the tension.

- -

 

- -

As the player enters into combat with the -monster, the program starts a synchronized transition to the Combat segment. -The segment repeats indefinitely as the combat continues. A Bonus Hit -temporarily un-mutes a decorative track that notifies the player of a -successful attack, and similarly, another track is temporarily un-muted to -signify when the player receives Special Damage.

- -

 

- -

At the end of combat, the music transitions -to a victory or defeat segment based on the outcome of battle.

- -

1.1.4          -Mute/Un-mute Synchronization

- -

JET can also synchronize the muting and -un-muting of tracks to events in the music. For example, in the FPS game, it would -probably be desirable to place the musical events relating to bonuses and -damage as close to the actual game event as possible. However, simply un-muting -a track at the moment the game event occurs might result in a music clip -starting in the middle. Alternatively, a clip could be started from the -beginning, but then it wouldn’t be synchronized with the other music tracks.

- -

 

- -

However, with the JET sync engine, a clip -can be started at the next opportune moment and maintain synchronization. This -can be accomplished by placing a number of short music clips on a decorative -track. A MIDI event in the stream signifies -the start of a clip and a second event signifies the end of a clip. When the -application calls the JET clip function, the next clip in the track is allowed -to play fully synchronized to the music. Optionally, the track can be -automatically muted by a second MIDI event.

- -

 

- -

- -

Figure 3: Synchronized Mute/Unmute

- -

1.2        -Audio Synchronization

- -

JET provides an audio synchronization API -that allows game play to be synchronized to events in the audio. The mechanism -relies on data embedded in the MIDI file at -the time the content is authored. When the JET engine senses an event during -playback it generates a callback into the application program. The timing of -the callback can be adjusted to compensate for any latency in the audio -playback system so that audio and video can be synchronized. The diagram below -shows an example of a simple music game that involves pressing the left and -right arrows in time with the music.

- -

 

- -

 

- -

- -

Figure 4: Music Game with Synchronization

- -

 

- -

The arrows represent events in the music sequence -where game events need to be synchronized. In this case, the blue arrow -represents a time where the player is supposed to press the left button, and -the red arrow is for the right button. The yellow arrow tells the game engine -that the sequence is complete. The player is allowed a certain time window -before and after the event to press the appropriate key.

- -

 

- -

If an event is received and the player has -not pressed a button, a timer is set to half the length of the window. If the -player presses the button before the timer expires, the game registers a -success, and if not, the game registers a failure.

- -

 

- -

If the player presses the button before the -event is received, a timer is set to half the length of the window. If an event -is received before the timer expires, the game registers a success, and if not, -the game registers a failure. Game play might also include bonuses for getting -close to the timing of the actual event.

- -

 

- -

2         -JET Content Authoring Overview

- -

To author JET files and hear them playback -interactively, the content author will work in two applications which are -designed to work together smoothly. The first is application is any -off-the-shelf MIDI sequencing application that -supports VST (for PC) or AU (for Mac) plugins. Here the author will compose -their MIDI music files using the plugin as the -synthesizer device. The second application is the JET Creator application. Here -the author will import their MIDI music files -(and optionally a DLS2 soundset) and setup the conditions for interactive -playback within the JET enabled game. Optionally the content author may create -a custom set of DLS instruments using an instrument editor that supports the -DLS Level 2 format. One such application is Awave from MJSoft.

- -

 

- -

Please see the JET Content Authoring Guidelines documentation for additional -details on content authoring.

- -

 

- -

3         -Installing and Launching JET -Creator

- -

JET Creator is a python language -application, therefore, you must have Python and wxPython installed on your -machine.

- -

 

- -

JetCreator was created and tested with:

- -

 

- -

Python Version 2.5.4

- -

wxPython Version 2.8.7.1

- -

 

- -

These can be downloaded here:

- -

 

- -

PC:

- -

http://www.python.org/download/releases/2.5.4/

- -

http://www.wxpython.org/download.php

- -

 

- -

MAC:

- -

http://wiki.python.org/moin/MacPython/Leopard

- -

http://www.wxpython.org/download.php

- -

 

- -

After installing Python and wxPython, -simply unzip or copy all the files in the JET Creator application directory to -a folder on your hard drive.

- -

                                                    

- -

To launch JET Creator go to a command -prompt and set the directory to where you’ve installed Python. Next run python -with the command:

- -

 

- -

python -jetcreator.py

- -

 

- -

 

- -

4         -Using JET Creator

- -

 

- -

4.1        -File Types

- -

There are a few different file types -associated with JET Creator.

- -

 

- -

.jtc        JET -Creator project file. This file contains all the information associated with a -JET Creator project. When you Save or Save-as out of JET Creator, this file -type is saved.

- -

 

- -

.jet        JET -File. This output file is automatically generated from JET Creator whenever you -save your JET Creator project. This is the file that bundles all JET assets -together into a single file that the Android application will use. Give this -file to the Android application developer.

- -

 

- -

.mid      MIDI File. This is the standard MIDI -type 1 file that JET Creator will use to make segments.

- -

 

- -

.seg      Segment -File. This is a JET Segment file. It has the same name as the MIDI -file which it references but contains additional Segment information.

- -

 

- -

.zip       Zip -Archive file. When you Export a JET Archive, a zip file is created that -contains all the assets (files) necessary for JET Creator. Use this to transfer -JET Creator projects to other people.

- -

 

- -

4.2        -Open Dialog

- -

When -you first launch JET Creator you are presented with an open dialog like the -following.

- -

 

- -

- -

 

- -

 

- -

Open will open an existing .jtc (JET Creator file) file. Use the browser -button to browse to the directory where you have saved your .jtc file.

- -

 

- -

New will create a new .jtc file.

- -

 

- -

Import will import a JET Archive (.zip) file.

- -

 

- -

Cancel will cancel the dialog and exit the application.

- -

 

- - - -

5         -Main Window

- -

The main window of the JET Creator -application looks like the picture below. There are three main sections from -top to bottom: segment view, event view, and timeline.

- -

 

- -

The segment view section displays a list of -the current segments, which MIDI file and -(optionally) DLS2 file each segment is derived from. It also shows each -segments start and stop time and each segments quantize, transpose, repeat and -mute flag settings.

- -

 

- -

Just below the Segment view is the event -view. The event view section displays all events associated with a given -segment. Events only display when the segment they are assigned to is -highlighted. Each event displays its type, start and end points, track and midi -channel assignment, and its event ID.

- -

 

- -

Just below the Event view is the timeline -display. The timeline shows how many measures a given segment is as well as any -events associated with that segment. The timeline changes to display the -currently selected or playing segment. You can trigger an event in this window -while the segment is play by simply clicking on the event in the timeline -display.

- -

 

- -

 

- -

- -

 

- -

JET -Creator Main Window

- -

 

- -

 

- -

The buttons along the left side of main -window do the following:

- -

 

- -

Add:                    - -Displays the segment or event window for adding a new segment or event

- -

Revise:                - -Displays the segment or event window for updating an existing segment or event

- -

Delete:                 - -Deletes the selected segment or event (will ask for confirmation)

- -

Move:                  - -Displays the move window which allows you to move selected segments or events -in time

- -

Queue All:            - Queue’s -(selects) all segments for playback

- -

Dequeue All:        - Dequeue’s -(deselects) all segments

- -

Play:                    - -Starts playback of all queue’d segments. This button changes to Stop if any -segments are playing

- -

Audition:              - -Displays the Audition window (see below)

- -

 

- -

5.1        -Segment Window

- -

The segment window is where a given -segment’s attributes are assigned and auditioned, as shown in the picture -below. The left side of the window displays the segments attributes that are -stored in the JET file. The right side of the window allows the author to set -mute flags, repeat and transpose settings and audition the segment as it will -play in the JET game.

- -

 

- -

Note: the audition attributes (mute flags, repeat and transpose) are not stored in the JET content file -(.jet) but rather are defined by the game or application itself. In programming -language, these settings correspond directly with the API calls to the JET -engine. By including them here, the JET content author can simulate how the -segment will respond to the applications API commands during game play.

- -

 

- -

 

- -

- -

 

- -

 

- -

The segment parameters do the following:

- -

 

- -

Segment Name             - Sets -the name of the segment

- -

MIDI File                       - -The name and location of the MIDI file from which -the segment is derived. The button to the immediate right will bring up a -browser for locating a midi file on the hard drive.

- -

DLS File                       - -The name and location of the DLS2 file, if any, that the MIDI -file uses for that segment.

- -

Starting M/B/T               - -Starting measure, beat and tick of the segment

- -

Ending M/B/T                - -Ending measure, beat and tick of the segment

- -

Quantize                       - -Quantize value for quantizing the current segment during playback

- -

 

- -

 

- -

The audition fields are as follows:

- -

 

- -

Track Mutes                  - -Shows the MIDI tracks (not channels) -in the MIDI file. Clicking on a track’s -checkbox will mute that track.

- -

Channel                        - -Displays the MIDI channel assigned to each -track

- -

Name                            - -Displays the track name meta event (if present) for each track

- -

Repeat                          - -Indicates the number of times a segment should repeat during playback

- -

Transpose                     - -Indicates the transposition in semi-tones or half-steps a segment should -transpose during playback

- -

 

- -

To the right of the Audition window are a few additional buttons. -These do as follows:

- -

 

- -

OK                               - -Selecting OK confirms all segment settings and closes the segment window

- -

Cancel                          - -Selecting Cancel cancels any changes and closes the segment window

- -

Replicate                      - -Displays the Replicate Segment window for entering multiple segments at once. -See below.

- -

Play/Stop Segment       - Starts -or Stops playback of the segment using the segment attributes assigned.

- -

Play/Stop MIDI File       - -Starts or Stops playback of the MIDI file -which the segment is assigned to.

- -

Pause/Resume              - -Pauses or Resumes playback.

- -

 

- -

 

- -

5.2        -Event Window

- -

The event window is where a given segment’s -event attributes are assigned and auditioned, as shown in the picture below. To -add an event to a segment, the author must first select the segment which will -contain the event, then select the Add button. This will bring up the Event -window.

- -

 

- -

- -

 

- -

 

- -

There are two main sections to the event -window. The segment section on the left side of the event window is for display -only. It shows what the segment attributes are for the given segment. The Event -section, on the right side, is where events can be assigned. The following -parameters are available:

- -

 

- -

Event Name                    - -Assigns a name to an event

- -

Event Type                     - -Selects which type of event to assign.

- -

Starting M/B/T                - -Sets the starting measure, beat, and tick for the event

- -

Ending M/B/T                 - -Sets the ending measure, beat, and tick for the event, if applicable

- -

Track                              - -Sets which track in the given segment the event will apply to

- -

Channel                          - -Sets which MIDI channel the event will apply -to. The MIDI channel should match the MIDI -channel of the track

- -

Event ID                         - -Sets the event ID for the event. Multiple events can be assigned to the same -segment and therefore the Event ID is used to identify them

- -

 

- -

To the right of the Audition window are a few additional buttons. -These do as follows:

- -

 

- -

OK                               - -Selecting OK confirms all event settings and closes the event window

- -

Cancel                          - -Selecting Cancel cancels any changes and closes the event window

- -

Replicate                      - -Displays the Replicate Event window for entering multiple events at once. See -below.

- -

Play/Stop                     - -Starts or Stops playback of the segment using the segment attributes assigned. -While the segment is playing, events can be triggered and auditioned.

- -

Trigger                          - -Triggers the event assigned. This replicates the API command that the JET game -will use to trigger the event, therefore giving the content author a method for -auditioning the behaviour of the event.

- -

Mute/UnMute                 - -Mute/UnMute will mute or unmute the track that the event is assigned to

- -

Pause/Resume              - -Pauses or Resumes playback.

- -

 

- -

To audition the behaviour of an event, you -can select the Play button. This will initiate playback. The trigger button -will send the trigger event when pressed. This is equivalent to selecting the -green trigger event in the timeline.

- -

 

- -

Note: Trigger events are meant to unmute a -single track of a segment when triggered, then mute that track at the end of -the trigger segment. Therefore you should make sure the mute flag is set to -mute the track that a trigger event will be unmuting when receiving a trigger event. -

- -

 

- -

Please read Section 7 “Under The Hood” -below for details on how trigger events work and behave.

- -

 

- -

5.3        -Replicate Windows

- -

Often in creating JET files, you’ll need to -create tens or even hundreds of events. You may also need to move events. The -Replicate and Move windows allow for this. There are two Replicate windows for -creating multiple segments or events. They look like the following:

- -

 

- -

- -

 

- -

Replicate Segment Window

- -

 

- -

 

- -

 

- -

- -

 

- -

Replicate Event Window

- -

 

- -

Both Replicate windows function the same. -After creating an initial segment or event, you can select the Replicate -button. The parameters are as follows:

- -

 

- -

Name Prefix                  - -Sets the prefix for the name of each segment or event created

- -

Starting M/B/T               - -Sets the starting time for the first segment or event

- -

Increment M/B/T            - -Sets the time between segments or events created.

- -

Number                         - -Sets the number of segments or events you wish to create. If the number -overflows the length of the MIDI file (for -segments) or segment (for events), those objects will not be created.

- -

Preview                         - -Preview allows you to examine the objects created before saying OK to insert -them.

- -

 

- -

 

- -

5.4        -Move Windows

- -

The Move function acts similarly to the -Replicate function in that it allows you to edit multiple segments or events at -one time, in this case move them in time. Like Replicate, there are two Move -windows, one for Segments and one for Events. The windows look like the -following:

- -

 

- -

- -

 

- -

Move Event Window

- -

 

- -

To use Move, first select the segments or -events you wish to move in time, then click the Move button. The parameters are -as follows:

- -

 

- -

Starting M/B/T               - -Sets the starting time for the first segment or event

- -

Increment M/B/T            - -Sets the time in M/B/T you wish to move the objects by.

- -

Preview                         - -Preview allows you to examine the objects created before saying OK to move -them.

- -

 

- -

 

- -

5.5        -Audition Window

- -

Clicking the Audition button in the main -window of the JET Creator application will open the Audition window. This is -where the content author or application programmer can simulate the interactive -playback as it may occur in the mobile application or game itself.

- -

 

- -

- -

 

- -

JET Audition Window

- -

 

- -

 

- -

There are four main sections to the -audition window. The left most section displays the available segments and -their length in seconds. The middle section displays a running list of what -segments are queued for playback and what their playback status is. The far -right section displays the mute flags for the currently playing segment. The -timeline section at the bottom is the same as in the main window. It displays -the currently playing segment as well as a visual display of any event triggers -associated with that segment.

- -

 

- -

The Audition window allows you to queue up -any segment in any order for playback. To do this simply select the segment you -wish to cue and hit Queue. That segment will appear in the queue window and -start playing (if it is the first segment). Subsequently you can select any -other segment or segments and cue them up for playback. As the segments -complete playback, the next segment in the queue will begin playing. As is the -other windows of JET Creator, you can mute, unmute, trigger event clips, etc. -in realtime as each segment is playing back.

- -

 

- -

Specifically the buttons behave as follows:

- -

 

- -

Queue                           - -loads the selected segment into the queue and starts playback

- -

Cancel and Queue         - -cancels the currently playing segment before queueing the selected segment for -playback

- -

Cancel Current               - -cancels the currently playing segment in the queue and begins playback of the -next segment

- -

Stop                             - -stops playback of all queued segments

- -

Mute All                        - -mutes all tracks in the current segment

- -

Mute None                    - -unmutes all tracks in the current segment

- -

Original Mutes               - -sets the original mute flags for the current segment

- -

 

- -

The combination of these playback options -allows an author or application programmer to audition any behaviour an -interactive music application may encounter.

- -

 

- -

 

- -

5.6        -JET Creator Menus

- -

The JET Creator menus provide access to -many of the parameters in the main window plus a few additional parameters.

- -

5.6.1          -File Menu

- -

The File Menu contains the following -elements:

- -

 

- -

New                              - -Creates a new JET Creator file (.jtc)

- -

Open                            - -Opens an existing JET Creator file

- -

Save                             - -Saves the currently opened JET Creator file

- -

Save As                        - -Saves the currently opened JET Creator file to a new file

- -

Import Project               - Imports a JET Creator archive (.zip)

- -

Export Project               - Exports a JET Creator archive (.zip)

- -

Exit                              - -Exits the application

- -

 

- -

5.6.2          -Edit Menu

- -

The Edit Menu contains the following -elements:

- -

 

- -

Undo                            - -Undo will undo the last edit made

- -

Redo                            - -Redo will redo the last undo

- -

Cut                               - -Copy selected parameter into clipboard and Delete selection

- -

Copy                            - -Copy selected parameter into clipboard and keep selection

- -

Paste                            - -Paste selected parameter

- -

 

- -

5.6.3          -JET

- -

The Edit Menu contains the following -elements:

- -

 

- -

Properties                     - -Brings up the JET Creator priorities window. This window allows you to set the -following conditions for a given JET file:

- -

Copyright Info               - Contains copyright info to be inserted into JET file

- -

Chase Controllers          - Option to chase controllers (on/off). This should usually -be ON.

- -

Delete Empty Tracks     - Deletes any empty MIDI tracks

- -

 

- -

5.6.4          -Segments

- -

The Segments Menu contains the following -elements:

- -

 

- -

Add Segment                - -Brings up the Segment window

- -

Update Segment           - Updates segment attributes

- -

Delete Segment                        - Deletes the current segment from the -Segment List

- -

 

- -

5.6.5          -Help

- -

The Help Menu will contain at least the -following elements:

- -

 

- -

JET Creator Help           - will launch PDF help document or go to on-line help

- -

About                           - -JET Creator version number, SONiVOX info

- -

 

- -

 

- -

6         -Trigger Events Explained

- -

Breaking a MIDI -file into individual (non-linear) segments and queueing up those segments for -playback in a game based on events within the game is one way JET music files are -interactive. Trigger events are an additional method for interactive playback. -Both would be used together in an interactive game or application.

- -

 

- -

Trigger events allow for the following:

- -

 

- -
    -
  1. Tracks within a MIDI segment can be turned on or off based on game - events. For example the composer could author two drum tracks, one fast - and one slow. If the action in a game is fast, the fast drum track could - play. If the action in the game is slow, the slow drum track can play.
  2. -
  3. User actions can be compared to trigger events which are - pre-inserted into a music file at musically ‘correct’ places. Based on the - results, scoring or other game actions can take place.
  4. -
  5. Musical transitions between levels or action sequences can be - synchronized to be musically seemless.
  6. -
- -

 

- -

Under the hood, JET uses standard MIDI CC -events to accomplish these actions and to synchronize audio. The controllers -used by JET are among those not defined for specific use by the MIDI specification. The specific controller definitions -are as follows:

- -

 

- -

            Controllers -80-83           Reserved for use by -application

- -

            Controller -102                JET event marker

- -

            Controller -103                JET clip marker

- -

            Controllers -104-119        Reserved for future use

- -

 

- -

6.1        -JET Clip Marker (CC103)

- -

Controller 103 is reserved for marking -clips in a MIDI track that can be triggered by -the JET_TriggerClip API call. The clip ID is encoded in the low 6 bits of the -controller value. Bit 6 is set to one to indicate the start of a clip, and set -to zero to indicate the end of a clip.

- -

 

- -

For example, to identify a clip with a clip -ID of 1, the author inserts a MIDI controller -event with controller=103 and value=65 at the start of the clip and another -event with controller=103 and value=1 at the end of the clip. When the -JET_TriggerClip() function is called with a clip ID of 1, the track will be -un-muted when the controller value 65 is encountered and muted again when the -controller value 1 is encountered.

- -

 

- -

- -

Figure 5: Synchronized Clip

- -

 

- -

In the figure above, if the -JET_TriggerClip() function is called prior to the first controller event, Track -3 will be un-muted when the first controller event occurs, the first clip will -play, and the track will be muted when the second controller event occurs. If -the JET_TriggerClip() function is called after the first controller event has -occurred, Track 3 will be un-muted when the third controller event occurs, the -second clip will play, and the track will be muted again when the fourth -controller event occurs.

- -

 

- -

Note: Normally, the track containing the clip is muted by the application -when the segment is initially queued by the call to JET_QueueSegment(). If it -is not muted, the clip will always play until Jet_TriggerClip() has been called -with the clip ID.

- -

 

- -

6.2        -JET Event Marker (CC102)

- -

Controller 102 is reserved for marking -events in the MIDI streams that are specific -to JET functionality. Currently, the only defined value is 0, which marks the -end of a segment for timing purposes.

- -

 

- -

Normally, JET starts playback of the next -segment (or repeats the current segment) when the MIDI -end-of-track meta-event is encountered. Some MIDI -authoring tools make it difficult to place the end-of-track marker accurately, -resulting in synchronization problems when segments are joined together.

- -

 

- -

To avoid this problem, the author can place -a JET end-of-segment marker (controller=102, value=0) at the point where the -segment is to be looped. When the end-of-segment marker is encountered, the -next segment will be triggered, or if the current segment is looped, playback -will resume at the start of the segment.

- -

 

- -

The end-of-segment marker can also be used -to allow for completion of a musical figure beyond the end of measure that -marks the start of the next segment. For example, the content author might -create a 4-bar segment with a drum fill that ends on beat 1 of the 5th -bar – a bar beyond the natural end of the segment. By placing an end-of-segment -marker at the end of the 4th bar, the next segment will be -triggered, but the drum fill will continue in parallel with the next segment -providing musical continuity.

- -

 

- -

- -

Figure 6: End-of-segment Marker

- -

6.3        -Application Controllers -(CC80-83)

- -

The application may use controllers in this -range for its own purposes. When a controller in this range is encountered, the -event is entered into an event queue that can be queried by the application. -Some possible uses include synchronizing video events with audio and marking a -point in a MIDI segment to queue up the next -segment. The range of controllers monitored by the application can be modified -by the application during initialization.

- -

 

- -
- - - - diff --git a/docs/JET_Creator_User_Manual.html b/docs/JET_Creator_User_Manual.html new file mode 100644 index 0000000..8582f5f --- /dev/null +++ b/docs/JET_Creator_User_Manual.html @@ -0,0 +1,3032 @@ + + + + + + + + + + + +SONiVOX JET Creator User Manual + + + + + + + + +
+   Copyright (C) 2009 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ +
+ +

JETCreator™ User Manual

+ +

Vrs 1.0

+ +

Content +Authoring Application for the

+ +

JET +Interactive Music Engine

+ +

Authored by SONiVOX

+ +

www.sonivoxrocks.com

+ +

Copyright 2009 Sonic Network, Inc.

+ + + +

 

+ +

 

+ +

1         +Introduction

+ +

1.1        +Overview

+ +

This document contains the user guidelines +for the SONiVOX JET Creator, an authoring application for creating and +auditioning JET files. JET is an interactive music player for small embedded +devices, including the Google Android platform. It allows applications to +include interactive music soundtracks, in MIDI +format, that respond in real-time to game play events and user interaction.

+ +

 

+ +

JET works in conjunction with SONiVOX’s +Embedded Audio Synthesizer (EAS) which is the MIDI +playback device for Android.  Both the +JET and EAS engines are integrated into the Android embedded platform as well +as inherent in the JET Creator application. As such, the JET content author can +be sure that the playback will sound exactly the same in both the JET Creator +and the final Android application playing back on Android mobile devices.

+ +

 

+ +

In addition to the graphical user +interface, there are two main functionalities taking place in JET Creator. The +first involves gathering all the source data (MIDI +files and DLS file), adding JET’s real-time attributes and building a JET +(.jet) file that the Android application will use. The second functionality +involves auditioning the interactive playback elements as they will take place +in the Android application.

+ +

 

+ +

The JET Creator application is written in +the Python programming language, therefore you need to have the current version +of Python and WXWidgets installed. There is both a Mac and Windows version.

+ +

 

+ +

 

+ +

1.2        +Abbreviations and Common Terms

+ +

 

+ +

It is important to use a common set of +terms to minimize confusion. Since JET uses MIDI +in a unique way, normal industry terms may not always suffice. Here is the +definition of terms as they are used in this document and in the JET Creator +application:

+ +

 

+ +

Channel: MIDI data associated with a specific MIDI +channel. Standard MIDI allows for 16 channels of MIDI +data each of which are typically associated with a specific instrument.

+ +

 

+ +

Controller: A MIDI event consisting of a +channel number, controller number, and a controller value. The MIDI spec associates many controller numbers with +specific functions, such as volume, expression, sustain pedal, etc. JET also +uses controller events as a means of embedding special control information in a +MIDI sequence to provide for audio synchronization.

+ +

 

+ +

DAW: Digital Audio Workstation. A common term for MIDI +and audio sequencing applications such as Logic, SONAR, Cubase and others.

+ +

 

+ +

EAS: Embedded MIDI Synthesizer. The +name of the SONiVOX MIDI synthesizer engine.

+ +

 

+ +

JET: Jet Interactive Engine. The name of the SONiVOX JET interactive +music engine.

+ +

 

+ +

M/B/T: Measures, Beats and Ticks

+ +

 

+ +

Segment: A musical section such as a chorus or verse that is a component of +the overall composition. In JET, a segment can be an entire MIDI file or a +derived from a portion of a MIDI file.

+ +

 

+ +

SMF-0: Standard MIDI File Type 0, a MIDI file that contains a single +track, but may be made up of multiple channels of MIDI +data.

+ +

 

+ +

SMF-1: Standard MIDI File Type 1, a MIDI file that contains a one more +tracks, and each track may in turn be made up of one or more channels of MIDI data. By convention, each channel is stored on a +separate track in an SMF-1 file. However, it is possible to have multiple MIDI +channels on a single track, or multiple tracks that contain data for the same MIDI channel.

+ +

 

+ +

Track: A single track in a DAW containing a timed sequence of MIDI events. Be careful not to confuse Tracks with +Channels. A MIDI file may contain many tracks with several tracks utilizing the +same MIDI channel.

+ +

 

+ +

 

+ +

1         +The JET Interactive Music Concept

+ +

Interactive music can be defined as music +that changes in real-time according to non-predictable events such as user +interaction or game play events. In this way, interactive music is much more +engaging as it has the ability to match the energy and mood of a game much +closer than a pre-composed composition that never changes. In some applications +and games, interactive music is central to the game play. Guitar Hero is one +such popular game. When the end user successfully ‘captures’ the musical notes +coming down the fret board, the music adapts itself and simultaneously keeps +score of successes and failures. JET allows for these types of music driven +games as well.

+ +

 

+ +

There are several methods for making and +controlling interactive music and JET is one such method. This section +describes the features of JET and how they might be used in a game or software +application. It also describes how JET can be used to save memory in small +footprint devices such as Android enabled mobile handsets.

+ +

1.1.1       Data Compression

+ +

JET supports a flexible music format that +can be used to create extended musical sequences with a minimal amount of data. +A musical composition is broken up into segments that can be sequenced to +create a longer piece. The sequencing can be fixed at the time the music file +is authored, or it can be created dynamically under program control.

+ +

1.1.2       Linear Music Example

+ +

+ +

Figure 1: Linear Music Piece

+ +

 

+ +

This diagram shows how musical segments are +stored. Each segment is authored as a separate MIDI +file. A post-processing tool combines the files into a single container file. +Each segment can contain alternate music tracks that can be muted or un-muted +to create additional interest. An example might be a brass accent in the chorus +that is played only the last time through. Also, segments can be transposed up +or down.

+ +

 

+ +

The bottom part of the diagram shows how +the musical segments can be recombined to create a linear music piece. In this +example, the bridge might end with a half-step key modulation and the remaining +segments could be transposed up a half-step to match.

+ +

1.1.3          +Non-linear Music Example

+ +

+ +

Figure 2: Non-linear music piece

+ +

 

+ +

In this diagram, we see a non-linear music +piece. The scenario is a first-person-shooter (FPS) and JET is providing the +background music. The intro plays as the level is loading and then transitions +under program control to the Searching segment. This segment is repeated indefinitely, +perhaps with small variations (using the mute/un-mute feature) until activity +in the game dictates a change.

+ +

 

+ +

As the player nears a monster lair, the +program starts a synchronized transition to the Danger segment, increasing the +tension level in the audio. As the player draws closer to the lair, additional +tracks are un-muted to increase the tension.

+ +

 

+ +

As the player enters into combat with the +monster, the program starts a synchronized transition to the Combat segment. +The segment repeats indefinitely as the combat continues. A Bonus Hit +temporarily un-mutes a decorative track that notifies the player of a +successful attack, and similarly, another track is temporarily un-muted to +signify when the player receives Special Damage.

+ +

 

+ +

At the end of combat, the music transitions +to a victory or defeat segment based on the outcome of battle.

+ +

1.1.4          +Mute/Un-mute Synchronization

+ +

JET can also synchronize the muting and +un-muting of tracks to events in the music. For example, in the FPS game, it would +probably be desirable to place the musical events relating to bonuses and +damage as close to the actual game event as possible. However, simply un-muting +a track at the moment the game event occurs might result in a music clip +starting in the middle. Alternatively, a clip could be started from the +beginning, but then it wouldn’t be synchronized with the other music tracks.

+ +

 

+ +

However, with the JET sync engine, a clip +can be started at the next opportune moment and maintain synchronization. This +can be accomplished by placing a number of short music clips on a decorative +track. A MIDI event in the stream signifies +the start of a clip and a second event signifies the end of a clip. When the +application calls the JET clip function, the next clip in the track is allowed +to play fully synchronized to the music. Optionally, the track can be +automatically muted by a second MIDI event.

+ +

 

+ +

+ +

Figure 3: Synchronized Mute/Unmute

+ +

1.2        +Audio Synchronization

+ +

JET provides an audio synchronization API +that allows game play to be synchronized to events in the audio. The mechanism +relies on data embedded in the MIDI file at +the time the content is authored. When the JET engine senses an event during +playback it generates a callback into the application program. The timing of +the callback can be adjusted to compensate for any latency in the audio +playback system so that audio and video can be synchronized. The diagram below +shows an example of a simple music game that involves pressing the left and +right arrows in time with the music.

+ +

 

+ +

 

+ +

+ +

Figure 4: Music Game with Synchronization

+ +

 

+ +

The arrows represent events in the music sequence +where game events need to be synchronized. In this case, the blue arrow +represents a time where the player is supposed to press the left button, and +the red arrow is for the right button. The yellow arrow tells the game engine +that the sequence is complete. The player is allowed a certain time window +before and after the event to press the appropriate key.

+ +

 

+ +

If an event is received and the player has +not pressed a button, a timer is set to half the length of the window. If the +player presses the button before the timer expires, the game registers a +success, and if not, the game registers a failure.

+ +

 

+ +

If the player presses the button before the +event is received, a timer is set to half the length of the window. If an event +is received before the timer expires, the game registers a success, and if not, +the game registers a failure. Game play might also include bonuses for getting +close to the timing of the actual event.

+ +

 

+ +

2         +JET Content Authoring Overview

+ +

To author JET files and hear them playback +interactively, the content author will work in two applications which are +designed to work together smoothly. The first is application is any +off-the-shelf MIDI sequencing application that +supports VST (for PC) or AU (for Mac) plugins. Here the author will compose +their MIDI music files using the plugin as the +synthesizer device. The second application is the JET Creator application. Here +the author will import their MIDI music files +(and optionally a DLS2 soundset) and setup the conditions for interactive +playback within the JET enabled game. Optionally the content author may create +a custom set of DLS instruments using an instrument editor that supports the +DLS Level 2 format. One such application is Awave from MJSoft.

+ +

 

+ +

Please see the JET Content Authoring Guidelines documentation for additional +details on content authoring.

+ +

 

+ +

3         +Installing and Launching JET +Creator

+ +

JET Creator is a python language +application, therefore, you must have Python and wxPython installed on your +machine.

+ +

 

+ +

JetCreator was created and tested with:

+ +

 

+ +

Python Version 2.5.4

+ +

wxPython Version 2.8.7.1

+ +

 

+ +

These can be downloaded here:

+ +

 

+ +

PC:

+ +

http://www.python.org/download/releases/2.5.4/

+ +

http://www.wxpython.org/download.php

+ +

 

+ +

MAC:

+ +

http://wiki.python.org/moin/MacPython/Leopard

+ +

http://www.wxpython.org/download.php

+ +

 

+ +

After installing Python and wxPython, +simply unzip or copy all the files in the JET Creator application directory to +a folder on your hard drive.

+ +

                                                    

+ +

To launch JET Creator go to a command +prompt and set the directory to where you’ve installed Python. Next run python +with the command:

+ +

 

+ +

python +jetcreator.py

+ +

 

+ +

 

+ +

4         +Using JET Creator

+ +

 

+ +

4.1        +File Types

+ +

There are a few different file types +associated with JET Creator.

+ +

 

+ +

.jtc        JET +Creator project file. This file contains all the information associated with a +JET Creator project. When you Save or Save-as out of JET Creator, this file +type is saved.

+ +

 

+ +

.jet        JET +File. This output file is automatically generated from JET Creator whenever you +save your JET Creator project. This is the file that bundles all JET assets +together into a single file that the Android application will use. Give this +file to the Android application developer.

+ +

 

+ +

.mid      MIDI File. This is the standard MIDI +type 1 file that JET Creator will use to make segments.

+ +

 

+ +

.seg      Segment +File. This is a JET Segment file. It has the same name as the MIDI +file which it references but contains additional Segment information.

+ +

 

+ +

.zip       Zip +Archive file. When you Export a JET Archive, a zip file is created that +contains all the assets (files) necessary for JET Creator. Use this to transfer +JET Creator projects to other people.

+ +

 

+ +

4.2        +Open Dialog

+ +

When +you first launch JET Creator you are presented with an open dialog like the +following.

+ +

 

+ +

+ +

 

+ +

 

+ +

Open will open an existing .jtc (JET Creator file) file. Use the browser +button to browse to the directory where you have saved your .jtc file.

+ +

 

+ +

New will create a new .jtc file.

+ +

 

+ +

Import will import a JET Archive (.zip) file.

+ +

 

+ +

Cancel will cancel the dialog and exit the application.

+ +

 

+ + + +

5         +Main Window

+ +

The main window of the JET Creator +application looks like the picture below. There are three main sections from +top to bottom: segment view, event view, and timeline.

+ +

 

+ +

The segment view section displays a list of +the current segments, which MIDI file and +(optionally) DLS2 file each segment is derived from. It also shows each +segments start and stop time and each segments quantize, transpose, repeat and +mute flag settings.

+ +

 

+ +

Just below the Segment view is the event +view. The event view section displays all events associated with a given +segment. Events only display when the segment they are assigned to is +highlighted. Each event displays its type, start and end points, track and midi +channel assignment, and its event ID.

+ +

 

+ +

Just below the Event view is the timeline +display. The timeline shows how many measures a given segment is as well as any +events associated with that segment. The timeline changes to display the +currently selected or playing segment. You can trigger an event in this window +while the segment is play by simply clicking on the event in the timeline +display.

+ +

 

+ +

 

+ +

+ +

 

+ +

JET +Creator Main Window

+ +

 

+ +

 

+ +

The buttons along the left side of main +window do the following:

+ +

 

+ +

Add:                    - +Displays the segment or event window for adding a new segment or event

+ +

Revise:                - +Displays the segment or event window for updating an existing segment or event

+ +

Delete:                 - +Deletes the selected segment or event (will ask for confirmation)

+ +

Move:                  - +Displays the move window which allows you to move selected segments or events +in time

+ +

Queue All:            - Queue’s +(selects) all segments for playback

+ +

Dequeue All:        - Dequeue’s +(deselects) all segments

+ +

Play:                    - +Starts playback of all queue’d segments. This button changes to Stop if any +segments are playing

+ +

Audition:              - +Displays the Audition window (see below)

+ +

 

+ +

5.1        +Segment Window

+ +

The segment window is where a given +segment’s attributes are assigned and auditioned, as shown in the picture +below. The left side of the window displays the segments attributes that are +stored in the JET file. The right side of the window allows the author to set +mute flags, repeat and transpose settings and audition the segment as it will +play in the JET game.

+ +

 

+ +

Note: the audition attributes (mute flags, repeat and transpose) are not stored in the JET content file +(.jet) but rather are defined by the game or application itself. In programming +language, these settings correspond directly with the API calls to the JET +engine. By including them here, the JET content author can simulate how the +segment will respond to the applications API commands during game play.

+ +

 

+ +

 

+ +

+ +

 

+ +

 

+ +

The segment parameters do the following:

+ +

 

+ +

Segment Name             - Sets +the name of the segment

+ +

MIDI File                       - +The name and location of the MIDI file from which +the segment is derived. The button to the immediate right will bring up a +browser for locating a midi file on the hard drive.

+ +

DLS File                       - +The name and location of the DLS2 file, if any, that the MIDI +file uses for that segment.

+ +

Starting M/B/T               - +Starting measure, beat and tick of the segment

+ +

Ending M/B/T                - +Ending measure, beat and tick of the segment

+ +

Quantize                       - +Quantize value for quantizing the current segment during playback

+ +

 

+ +

 

+ +

The audition fields are as follows:

+ +

 

+ +

Track Mutes                  - +Shows the MIDI tracks (not channels) +in the MIDI file. Clicking on a track’s +checkbox will mute that track.

+ +

Channel                        - +Displays the MIDI channel assigned to each +track

+ +

Name                            - +Displays the track name meta event (if present) for each track

+ +

Repeat                          - +Indicates the number of times a segment should repeat during playback

+ +

Transpose                     - +Indicates the transposition in semi-tones or half-steps a segment should +transpose during playback

+ +

 

+ +

To the right of the Audition window are a few additional buttons. +These do as follows:

+ +

 

+ +

OK                               - +Selecting OK confirms all segment settings and closes the segment window

+ +

Cancel                          - +Selecting Cancel cancels any changes and closes the segment window

+ +

Replicate                      - +Displays the Replicate Segment window for entering multiple segments at once. +See below.

+ +

Play/Stop Segment       - Starts +or Stops playback of the segment using the segment attributes assigned.

+ +

Play/Stop MIDI File       - +Starts or Stops playback of the MIDI file +which the segment is assigned to.

+ +

Pause/Resume              - +Pauses or Resumes playback.

+ +

 

+ +

 

+ +

5.2        +Event Window

+ +

The event window is where a given segment’s +event attributes are assigned and auditioned, as shown in the picture below. To +add an event to a segment, the author must first select the segment which will +contain the event, then select the Add button. This will bring up the Event +window.

+ +

 

+ +

+ +

 

+ +

 

+ +

There are two main sections to the event +window. The segment section on the left side of the event window is for display +only. It shows what the segment attributes are for the given segment. The Event +section, on the right side, is where events can be assigned. The following +parameters are available:

+ +

 

+ +

Event Name                    - +Assigns a name to an event

+ +

Event Type                     - +Selects which type of event to assign.

+ +

Starting M/B/T                - +Sets the starting measure, beat, and tick for the event

+ +

Ending M/B/T                 - +Sets the ending measure, beat, and tick for the event, if applicable

+ +

Track                              - +Sets which track in the given segment the event will apply to

+ +

Channel                          - +Sets which MIDI channel the event will apply +to. The MIDI channel should match the MIDI +channel of the track

+ +

Event ID                         - +Sets the event ID for the event. Multiple events can be assigned to the same +segment and therefore the Event ID is used to identify them

+ +

 

+ +

To the right of the Audition window are a few additional buttons. +These do as follows:

+ +

 

+ +

OK                               - +Selecting OK confirms all event settings and closes the event window

+ +

Cancel                          - +Selecting Cancel cancels any changes and closes the event window

+ +

Replicate                      - +Displays the Replicate Event window for entering multiple events at once. See +below.

+ +

Play/Stop                     - +Starts or Stops playback of the segment using the segment attributes assigned. +While the segment is playing, events can be triggered and auditioned.

+ +

Trigger                          - +Triggers the event assigned. This replicates the API command that the JET game +will use to trigger the event, therefore giving the content author a method for +auditioning the behaviour of the event.

+ +

Mute/UnMute                 - +Mute/UnMute will mute or unmute the track that the event is assigned to

+ +

Pause/Resume              - +Pauses or Resumes playback.

+ +

 

+ +

To audition the behaviour of an event, you +can select the Play button. This will initiate playback. The trigger button +will send the trigger event when pressed. This is equivalent to selecting the +green trigger event in the timeline.

+ +

 

+ +

Note: Trigger events are meant to unmute a +single track of a segment when triggered, then mute that track at the end of +the trigger segment. Therefore you should make sure the mute flag is set to +mute the track that a trigger event will be unmuting when receiving a trigger event. +

+ +

 

+ +

Please read Section 7 “Under The Hood” +below for details on how trigger events work and behave.

+ +

 

+ +

5.3        +Replicate Windows

+ +

Often in creating JET files, you’ll need to +create tens or even hundreds of events. You may also need to move events. The +Replicate and Move windows allow for this. There are two Replicate windows for +creating multiple segments or events. They look like the following:

+ +

 

+ +

+ +

 

+ +

Replicate Segment Window

+ +

 

+ +

 

+ +

 

+ +

+ +

 

+ +

Replicate Event Window

+ +

 

+ +

Both Replicate windows function the same. +After creating an initial segment or event, you can select the Replicate +button. The parameters are as follows:

+ +

 

+ +

Name Prefix                  - +Sets the prefix for the name of each segment or event created

+ +

Starting M/B/T               - +Sets the starting time for the first segment or event

+ +

Increment M/B/T            - +Sets the time between segments or events created.

+ +

Number                         - +Sets the number of segments or events you wish to create. If the number +overflows the length of the MIDI file (for +segments) or segment (for events), those objects will not be created.

+ +

Preview                         - +Preview allows you to examine the objects created before saying OK to insert +them.

+ +

 

+ +

 

+ +

5.4        +Move Windows

+ +

The Move function acts similarly to the +Replicate function in that it allows you to edit multiple segments or events at +one time, in this case move them in time. Like Replicate, there are two Move +windows, one for Segments and one for Events. The windows look like the +following:

+ +

 

+ +

+ +

 

+ +

Move Event Window

+ +

 

+ +

To use Move, first select the segments or +events you wish to move in time, then click the Move button. The parameters are +as follows:

+ +

 

+ +

Starting M/B/T               - +Sets the starting time for the first segment or event

+ +

Increment M/B/T            - +Sets the time in M/B/T you wish to move the objects by.

+ +

Preview                         - +Preview allows you to examine the objects created before saying OK to move +them.

+ +

 

+ +

 

+ +

5.5        +Audition Window

+ +

Clicking the Audition button in the main +window of the JET Creator application will open the Audition window. This is +where the content author or application programmer can simulate the interactive +playback as it may occur in the mobile application or game itself.

+ +

 

+ +

+ +

 

+ +

JET Audition Window

+ +

 

+ +

 

+ +

There are four main sections to the +audition window. The left most section displays the available segments and +their length in seconds. The middle section displays a running list of what +segments are queued for playback and what their playback status is. The far +right section displays the mute flags for the currently playing segment. The +timeline section at the bottom is the same as in the main window. It displays +the currently playing segment as well as a visual display of any event triggers +associated with that segment.

+ +

 

+ +

The Audition window allows you to queue up +any segment in any order for playback. To do this simply select the segment you +wish to cue and hit Queue. That segment will appear in the queue window and +start playing (if it is the first segment). Subsequently you can select any +other segment or segments and cue them up for playback. As the segments +complete playback, the next segment in the queue will begin playing. As is the +other windows of JET Creator, you can mute, unmute, trigger event clips, etc. +in realtime as each segment is playing back.

+ +

 

+ +

Specifically the buttons behave as follows:

+ +

 

+ +

Queue                           - +loads the selected segment into the queue and starts playback

+ +

Cancel and Queue         - +cancels the currently playing segment before queueing the selected segment for +playback

+ +

Cancel Current               - +cancels the currently playing segment in the queue and begins playback of the +next segment

+ +

Stop                             - +stops playback of all queued segments

+ +

Mute All                        - +mutes all tracks in the current segment

+ +

Mute None                    - +unmutes all tracks in the current segment

+ +

Original Mutes               - +sets the original mute flags for the current segment

+ +

 

+ +

The combination of these playback options +allows an author or application programmer to audition any behaviour an +interactive music application may encounter.

+ +

 

+ +

 

+ +

5.6        +JET Creator Menus

+ +

The JET Creator menus provide access to +many of the parameters in the main window plus a few additional parameters.

+ +

5.6.1          +File Menu

+ +

The File Menu contains the following +elements:

+ +

 

+ +

New                              - +Creates a new JET Creator file (.jtc)

+ +

Open                            - +Opens an existing JET Creator file

+ +

Save                             - +Saves the currently opened JET Creator file

+ +

Save As                        - +Saves the currently opened JET Creator file to a new file

+ +

Import Project               - Imports a JET Creator archive (.zip)

+ +

Export Project               - Exports a JET Creator archive (.zip)

+ +

Exit                              - +Exits the application

+ +

 

+ +

5.6.2          +Edit Menu

+ +

The Edit Menu contains the following +elements:

+ +

 

+ +

Undo                            - +Undo will undo the last edit made

+ +

Redo                            - +Redo will redo the last undo

+ +

Cut                               - +Copy selected parameter into clipboard and Delete selection

+ +

Copy                            - +Copy selected parameter into clipboard and keep selection

+ +

Paste                            - +Paste selected parameter

+ +

 

+ +

5.6.3          +JET

+ +

The Edit Menu contains the following +elements:

+ +

 

+ +

Properties                     - +Brings up the JET Creator priorities window. This window allows you to set the +following conditions for a given JET file:

+ +

Copyright Info               - Contains copyright info to be inserted into JET file

+ +

Chase Controllers          - Option to chase controllers (on/off). This should usually +be ON.

+ +

Delete Empty Tracks     - Deletes any empty MIDI tracks

+ +

 

+ +

5.6.4          +Segments

+ +

The Segments Menu contains the following +elements:

+ +

 

+ +

Add Segment                - +Brings up the Segment window

+ +

Update Segment           - Updates segment attributes

+ +

Delete Segment                        - Deletes the current segment from the +Segment List

+ +

 

+ +

5.6.5          +Help

+ +

The Help Menu will contain at least the +following elements:

+ +

 

+ +

JET Creator Help           - will launch PDF help document or go to on-line help

+ +

About                           - +JET Creator version number, SONiVOX info

+ +

 

+ +

 

+ +

6         +Trigger Events Explained

+ +

Breaking a MIDI +file into individual (non-linear) segments and queueing up those segments for +playback in a game based on events within the game is one way JET music files are +interactive. Trigger events are an additional method for interactive playback. +Both would be used together in an interactive game or application.

+ +

 

+ +

Trigger events allow for the following:

+ +

 

+ +
    +
  1. Tracks within a MIDI segment can be turned on or off based on game + events. For example the composer could author two drum tracks, one fast + and one slow. If the action in a game is fast, the fast drum track could + play. If the action in the game is slow, the slow drum track can play.
  2. +
  3. User actions can be compared to trigger events which are + pre-inserted into a music file at musically ‘correct’ places. Based on the + results, scoring or other game actions can take place.
  4. +
  5. Musical transitions between levels or action sequences can be + synchronized to be musically seemless.
  6. +
+ +

 

+ +

Under the hood, JET uses standard MIDI CC +events to accomplish these actions and to synchronize audio. The controllers +used by JET are among those not defined for specific use by the MIDI specification. The specific controller definitions +are as follows:

+ +

 

+ +

            Controllers +80-83           Reserved for use by +application

+ +

            Controller +102                JET event marker

+ +

            Controller +103                JET clip marker

+ +

            Controllers +104-119        Reserved for future use

+ +

 

+ +

6.1        +JET Clip Marker (CC103)

+ +

Controller 103 is reserved for marking +clips in a MIDI track that can be triggered by +the JET_TriggerClip API call. The clip ID is encoded in the low 6 bits of the +controller value. Bit 6 is set to one to indicate the start of a clip, and set +to zero to indicate the end of a clip.

+ +

 

+ +

For example, to identify a clip with a clip +ID of 1, the author inserts a MIDI controller +event with controller=103 and value=65 at the start of the clip and another +event with controller=103 and value=1 at the end of the clip. When the +JET_TriggerClip() function is called with a clip ID of 1, the track will be +un-muted when the controller value 65 is encountered and muted again when the +controller value 1 is encountered.

+ +

 

+ +

+ +

Figure 5: Synchronized Clip

+ +

 

+ +

In the figure above, if the +JET_TriggerClip() function is called prior to the first controller event, Track +3 will be un-muted when the first controller event occurs, the first clip will +play, and the track will be muted when the second controller event occurs. If +the JET_TriggerClip() function is called after the first controller event has +occurred, Track 3 will be un-muted when the third controller event occurs, the +second clip will play, and the track will be muted again when the fourth +controller event occurs.

+ +

 

+ +

Note: Normally, the track containing the clip is muted by the application +when the segment is initially queued by the call to JET_QueueSegment(). If it +is not muted, the clip will always play until Jet_TriggerClip() has been called +with the clip ID.

+ +

 

+ +

6.2        +JET Event Marker (CC102)

+ +

Controller 102 is reserved for marking +events in the MIDI streams that are specific +to JET functionality. Currently, the only defined value is 0, which marks the +end of a segment for timing purposes.

+ +

 

+ +

Normally, JET starts playback of the next +segment (or repeats the current segment) when the MIDI +end-of-track meta-event is encountered. Some MIDI +authoring tools make it difficult to place the end-of-track marker accurately, +resulting in synchronization problems when segments are joined together.

+ +

 

+ +

To avoid this problem, the author can place +a JET end-of-segment marker (controller=102, value=0) at the point where the +segment is to be looped. When the end-of-segment marker is encountered, the +next segment will be triggered, or if the current segment is looped, playback +will resume at the start of the segment.

+ +

 

+ +

The end-of-segment marker can also be used +to allow for completion of a musical figure beyond the end of measure that +marks the start of the next segment. For example, the content author might +create a 4-bar segment with a drum fill that ends on beat 1 of the 5th +bar – a bar beyond the natural end of the segment. By placing an end-of-segment +marker at the end of the 4th bar, the next segment will be +triggered, but the drum fill will continue in parallel with the next segment +providing musical continuity.

+ +

 

+ +

+ +

Figure 6: End-of-segment Marker

+ +

6.3        +Application Controllers +(CC80-83)

+ +

The application may use controllers in this +range for its own purposes. When a controller in this range is encountered, the +event is entered into an event queue that can be queried by the application. +Some possible uses include synchronizing video events with audio and marking a +point in a MIDI segment to queue up the next +segment. The range of controllers monitored by the application can be modified +by the application during initialization.

+ +

 

+ +
+ + + + diff --git a/docs/JET_Programming_Manual.htm b/docs/JET_Programming_Manual.htm deleted file mode 100644 index 198a9e6..0000000 --- a/docs/JET_Programming_Manual.htm +++ /dev/null @@ -1,1333 +0,0 @@ - - - - - - - - - - - -JET PROGRAMMING MANUAL - - - - - - - - -
-   Copyright (C) 2009 The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
- -
- -

JET™ Programming Manual

- -

JET -Interactive Music Engine

- -

Vrs 2.0

- -

Authored by SONiVOX

- -

www.sonivoxrocks.com

- -

Copyright 2009 Sonic Network, Inc.

- - - -

 

- -

 

- -

 

- -

Introduction

- -

This document contains programmer guidelines for the SONiVOX -JET Interactive Music System. JET is an interactive music player for small -embedded devices, including the Google Android platform. It allows applications -to include interactive music soundtracks, in MIDI -format, that respond in real-time to game play events and user interaction.

- -

 

- -

JET works in conjunction with SONiVOX’s Embedded Audio -Synthesizer (EAS) which is the MIDI playback -device for Android.  Both the JET and EAS -engines are integrated into the Android embedded platform as well as inherent -in JET Creator, an application for -authoring JET content files. As such, the JET content author can be sure that -the playback will sound exactly the same in both JET Creator and the final Android application playing back on -Android mobile devices.

- -

 

- -

The programmer of a JET application will want to work -closely with the content author in designing how real-time application events -and music will interactively work together. Once decided, the content author -will create the content and ultimately save a .jet file for the programmer to -include in the application.

- -

 

- -

Please see “JET Creator User Documentation” for additional -information on authoring JET content.

- -

 

- -

Abbreviations and Common Terms

- -

It is important to use a common set of terms to minimize confusion. -Since JET uses MIDI in a unique way, normal -industry terms may not always suffice. Here is the definition of terms as they -are used in this document and in the JET Creator application:

- -

 

- -

Channel: MIDI data -associated with a specific MIDI channel. -Standard MIDI allows for 16 channels of MIDI -data each of which are typically associated with a specific instrument.

- -

 

- -

Controller: A MIDI event consisting of a channel number, controller -number, and a controller value. The MIDI spec -associates many controller numbers with specific functions, such as volume, -expression, sustain pedal, etc. JET also uses controller events as a means of -embedding special control information in a MIDI -sequence to provide for audio synchronization.

- -

 

- -

DAW: Digital Audio -Workstation. A common term for MIDI and audio -sequencing applications such as Logic, SONAR, Cubase and others.

- -

 

- -

EAS: Embedded MIDI Synthesizer. The name of the SONiVOX MIDI -synthesizer engine.

- -

 

- -

JET: Jet -Interactive Engine. The name of the SONiVOX JET interactive music engine.

- -

 

- -

Segment: A musical -section such as a chorus or verse that is a component of the overall -composition. In JET, a segment can be an entire MIDI file or a derived from a -portion of a MIDI file.

- -

 

- -

SMF-0: Standard -MIDI File Type 0, a MIDI file that contains a single track, but may be made up -of multiple channels of MIDI data.

- -

 

- -

SMF-1: Standard -MIDI File Type 1, a MIDI file that contains a one more tracks, and each track -may in turn be made up of one or more channels of MIDI -data. By convention, each channel is stored on a separate track in an SMF-1 -file. However, it is possible to have multiple MIDI channels on a single track, -or multiple tracks that contain data for the same MIDI -channel.

- -

 

- -

Track: A single -track in a DAW containing a timed sequence of MIDI -events. Be careful not to confuse Tracks with Channels. A MIDI file may contain -many tracks with several tracks utilizing the same MIDI -channel.

- -

 

- -

 

- -

The JET -Interactive Music Concept

- -

Interactive music can be defined as music that changes in -real-time according to non-predictable events such as user interaction or game -play events. In this way, interactive music is much more engaging as it has the -ability to match the energy and mood of a game much closer than a pre-composed -composition that never changes. In some applications and games, interactive -music is central to the game play. Guitar Hero is one such popular game. When -the end user successfully ‘captures’ the musical notes coming down the fret -board, the music adapts itself and simultaneously keeps score of successes and -failures. JET allows for these types of music driven games as well.

- -

 

- -

There are several methods for making and controlling -interactive music and JET is one such method. This section describes the -features of JET and how they might be used in a game or software application. -It also describes how JET can be used to save memory in small footprint devices -such as Android enabled mobile handsets.

- -

 

- -

JET Operation

- -

JET supports a flexible music format that can be used to -create extended musical sequences with a minimal amount of data. A musical -composition is broken up into segments that can be sequenced to create a longer -piece. The sequencing can be fixed at the time the music file is authored, or -it can be created dynamically under program control.

- -

Linear Music -Example

- -

- -

Figure 1: Linear Music Piece

- -

 

- -

This diagram shows how musical segments are stored. Each -segment is authored as a separate MIDI file. A -post-processing tool combines the files into a single container file. Each -segment can contain alternate music tracks that can be muted or un-muted to -create additional interest. An example might be a brass accent in the chorus -that is played only the last time through. Also, segments can be transposed up -or down.

- -

 

- -

The bottom part of the diagram shows how the musical -segments can be recombined to create a linear music piece. In this example, the -bridge might end with a half-step key modulation and the remaining segments -could be transposed up a half-step to match.

- -

Non-linear Music Example

- -

- -

Figure 2: Non-linear music piece

- -

 

- -

In this diagram, we see a non-linear music piece. The -scenario is a first-person-shooter (FPS) and JET is providing the background -music. The intro plays as the level is loading and then transitions under -program control to the Searching segment. This segment is repeated -indefinitely, perhaps with small variations (using the mute/un-mute feature) -until activity in the game dictates a change.

- -

 

- -

As the player nears a monster lair, the program starts a -synchronized transition to the Danger segment, increasing the tension level in -the audio. As the player draws closer to the lair, additional tracks are -un-muted to increase the tension.

- -

 

- -

As the player enters into combat with the monster, the -program starts a synchronized transition to the Combat segment. The segment -repeats indefinitely as the combat continues. A Bonus Hit temporarily un-mutes -a decorative track that notifies the player of a successful attack, and -similarly, another track is temporarily un-muted to signify when the player -receives Special Damage.

- -

 

- -

At the end of combat, the music transitions to a victory or -defeat segment based on the outcome of battle.

- -

Mute/Un-mute Synchronization

- -

JET can also synchronize the muting and un-muting of tracks -to events in the music. For example, in the FPS game, it would probably be -desirable to place the musical events relating to bonuses and damage as close -to the actual game event as possible. However, simply un-muting a track at the -moment the game event occurs might result in a music clip starting in the -middle. Alternatively, a clip could be started from the beginning, but then it -wouldn’t be synchronized with the other music tracks.

- -

 

- -

However, with the JET sync engine, a clip can be started at -the next opportune moment and maintain synchronization. This can be -accomplished by placing a number of short music clips on a decorative track. A MIDI event in the stream signifies the start of a clip -and a second event signifies the end of a clip. When the application calls the -JET clip function, the next clip in the track is allowed to play fully -synchronized to the music. Optionally, the track can be automatically muted by -a second MIDI event.

- -

 

- -

- -

Figure 3: Synchronized Mute/Unmute

- -

Audio Synchronization

- -

JET provides an audio synchronization API that allows game -play to be synchronized to events in the audio. The mechanism relies on data -embedded in the MIDI file at the time the -content is authored. When the JET engine senses an event during playback it -generates a callback into the application program. The timing of the callback -can be adjusted to compensate for any latency in the audio playback system so -that audio and video can be synchronized. The diagram below shows an example of -a simple music game that involves pressing the left and right arrows in time -with the music.

- -

 

- -

 

- -

- -

Figure 4: Music Game with -Synchronization

- -

 

- -

The arrows represent events in the music sequence where game -events need to be synchronized. In this case, the blue arrow represents a time -where the player is supposed to press the left button, and the red arrow is for -the right button. The yellow arrow tells the game engine that the sequence is -complete. The player is allowed a certain time window before and after the -event to press the appropriate key.

- -

 

- -

If an event is received and the player has not pressed a -button, a timer is set to half the length of the window. If the player presses -the button before the timer expires, the game registers a success, and if not, -the game registers a failure.

- -

 

- -

If the player presses the button before the event is -received, a timer is set to half the length of the window. If an event is -received before the timer expires, the game registers a success, and if not, -the game registers a failure. Game play might also include bonuses for getting -close to the timing of the actual event.

- -

 

- -

Operational Details

- -

JET uses the standard EAS library calls to manage multiple MIDI streams that are synchronized to sound like a -seamless audio track. JET requires the use of the dynamic memory model, i.e. -support for malloc() and free() memory allocation functions or their -equivalent. JET also requires the DLS parser and synthesizer module to support -custom instruments in JET content files.

- -

 

- -

JET uses standard MIDI -events for audio synchronization. This simplifies the authoring process by -allowing content authors to use their favorite tools for developing content. -After the content has been developed, a simple post-processing tool pulls the -content together into a JET compatible content file.

- -

Synchronization Events

- -

JET uses MIDI controller -events to synchronize audio. The controllers used by JET are among those not -defined for specific use by the MIDI -specification. The specific controller definitions are as follows:

- -

 

- -

            Controllers -80-83                 Reserved for use by -application

- -

            Controller 102                       JET event marker

- -

            Controller -103                       JET clip marker

- -

            Controllers -104-119             Reserved for future -use

- -

 

- -

Controllers 80-83 – Application Controllers

- -

The application may use controllers in this range for its -own purposes. When a controller in this range is encountered, the event is -entered into an event queue that can be queried by the application. Some -possible uses include synchronizing video events with audio and marking a point -in a MIDI segment to queue up the next -segment. The range of controllers monitored by the application can be modified -by the application during initialization.

- -

Controller 102 – JET Event Marker

- -

Controller 102 is reserved for marking events in the MIDI streams that are specific to JET functionality. -Currently, the only defined value is 0, which marks the end of a segment for -timing purposes.

- -

 

- -

Normally, JET starts playback of the next segment (or -repeats the current segment) when the MIDI -end-of-track meta-event is encountered. Some MIDI -authoring tools make it difficult to place the end-of-track marker accurately, -resulting in synchronization problems when segments are joined together.

- -

 

- -

To avoid this problem, the author can place a JET -end-of-segment marker (controller=102, value=0) at the point where the segment is -to be looped. When the end-of-segment marker is encountered, the next segment -will be triggered, or if the current segment is looped, playback will resume at -the start of the segment.

- -

 

- -

The end-of-segment marker can also be used to allow for -completion of a musical figure beyond the end of measure that marks the start -of the next segment. For example, the content author might create a 4-bar -segment with a drum fill that ends on beat 1 of the 5th bar – a bar -beyond the natural end of the segment. By placing an end-of-segment marker at -the end of the 4th bar, the next segment will be triggered, but the -drum fill will continue in parallel with the next segment providing musical -continuity.

- -

 

- -

- -

Figure 5: End-of-segment Marker

- -

Controller 103 – JET Clip Marker

- -

Controller 103 is reserved for marking clips in a MIDI track that can be triggered by the JET_TriggerClip -API call. The clip ID is encoded in the low 6 bits of the controller value. Bit -6 is set to one to indicate the start of a clip, and set to zero to indicate -the end of a clip.

- -

 

- -

For example, to identify a clip with a clip ID of 1, the -author inserts a MIDI controller event with -controller=103 and value=65 at the start of the clip and another event with controller=103 -and value=1 at the end of the clip. When the JET_TriggerClip() function is -called with a clip ID of 1, the track will be un-muted when the controller -value 65 is encountered and muted again when the controller value 1 is -encountered.

- -

 

- -

- -

Figure 6: Synchronized Clip

- -

 

- -

In the figure above, if the JET_TriggerClip() function is -called prior to the first controller event, Track 3 will be un-muted when the -first controller event occurs, the first clip will play, and the track will be -muted when the second controller event occurs. If the JET_TriggerClip() -function is called after the first controller event has occurred, Track 3 will -be un-muted when the third controller event occurs, the second clip will play, -and the track will be muted again when the fourth controller event occurs.

- -

 

- -

Note: Normally, -the track containing the clip is muted by the application when the segment is -initially queued by the call to JET_QueueSegment(). If it is not muted, the clip -will always play until Jet_TriggerClip() has been called with the clip ID.

- -

JET Programming

- -

The JET library builds on functionality in the EAS library. -It is assumed that the reader is familiar with EAS and has implemented basic -EAS audio functionality in the application. Specifically, the application must -first initialize EAS by calling EAS_Init() and must call EAS_Render() at -appropriate times to render audio and stream it to the audio hardware. JET also -requires the use of the dynamic memory model which uses malloc() and free() or -functional equivalents.

- -

 

- -

Most JET function calls return an EAS_RESULT type which -should be checked against the EAS_SUCCESS return code. Most failures are not -fatal, i.e. they will not put the library in a state where it must be -re-initialized. However, some failures such as memory allocation or file -open/read errors will likely result in the specific open content failing to -render.

- -

JET Application Initialization

- -

The JET library is initialized by the JET_Init() function. -The application must first call EAS_Init() and then pass the EAS data handle -returned by EAS_Init() to the JET_Init() function. Currently, only a single JET -application can be active at a time.

- -

 

- -

The JET_Init function takes 3 arguments: The first is the -EAS data handle. The second is a pointer to a configuration structure -S_JET_CONFIG and the third is the size of the configuration structure. For most -applications, it is sufficient to pass a NULL pointer and size 0 for the -configuration data.

- -

 

- -

However, if desired, the configuration can be modified to -allow the application to monitor MIDI events -outside the normal range of controllers allocated for JET application events. -In this case, a configuration structure should be allocated and the data fields -initialized with the appropriate values with the low and high controller -numbers to be monitored. The size field should be the sizeof() of the data -structure. This is to allow for future enhancement of the configuration data -while maintaining compatibility.

- -

JET Application Termination

- -

When the JET application terminates, it should call -JET_Shutdown() to release the resources allocated by the JET engine.  If the application has no other use for the -EAS library, it should also call EAS_Shutdown().

- -

JET Audio Processing

- -

To start the JET engine, the content must first be opened -with the JET_OpenFile() function. Just as with EAS_OpenFile(), the file locator -is an opaque value that is passed to the EAS_HWOpenFile() function. It can -either be a pointer to a filename, or a pointer to an in-memory object, -depending on the user implementation of file I/O in the eas_host.c or -eas_hostmm.c module. Only a single JET content file can be opened at a time.

- -

 

- -

Once the JET file is opened, the application can begin -queuing up segments for playback by calling the JET_QueueSegment() function. -Generally, it is advisable to keep a minimum of two segments queued at all -times:  the currently playing segment -plus an additional segment that is ready to start playing when the current -segment finishes. However, with proper programming, it is possible to queue up -segments using a “just-in-time” technique. This technique typically involves -careful placement of application controller events near the end of a segment so -that the application is informed when a segment is about to end.

- -

 

- -

After the segment(s) are queued up, playback can begin. By -default, the segments are initialized in a paused state. To start playback, -call the JET_Play() function. Playback can be paused again by calling the JET_Pause() -function. Once initiated, playback will continue as long as the application -continues to queue up new segments before all the segments in the queue are -exhausted.

- -

 

- -

The JET_Status() function can be used to monitor progress. -It returns the number of segments queued, repeat count, current segment ID, and -play status. By monitor the number of segments queued, the application can -determine when it needs to queue another segment and when playback has -completed.

- -

 

- -

When playback has completed and the application is finished -with the contents of the currently open file, the application should call -JET_CloseFile() to close the file and release any resources associated with the -file.

- -

JET_Init

- -

EAS_PUBLIC EAS_RESULT JET_Init -(EAS_DATA_HANDLE easHandle, S_JET_CONFIG *pConfig, EAS_INT configSize)

- -

 

- -

Initializes JET library for use by application. Most -application should simply pass a NULL for pConfig and 0 for configSize, which -means that only controller events in the application range (80-83) will end up -in the application event queue. If desired, the application can instantiate an -S_JET_CONFIG data structure and set the controller range to a different range. -In this case, the configSize parameter should be set to sizeof(S_JET_CONFIG).

- -

JET_Shutdown

- -

EAS_PUBLIC EAS_RESULT JET_Shutdown -(EAS_DATA_HANDLE easHandle)

- -

 

- -

Releases resources used by the JET library. The application -should call this function when it is no longer using the JET library.

- -

JET_ OpenFile

- -

EAS_PUBLIC EAS_RESULT JET_OpenFile -(EAS_DATA_HANDLE easHandle, EAS_FILE_LOCATOR locator)

- -

 

- -

Opens a JET content file for playback. Content must be -formatted for use by the JET library, which is typically accomplished with the -jetfile.py script (see “Creating JET Content”). Only a single JET content file -can be opened at a time. However, since JET can contain many MIDI -files and DLS libraries, this limitation is normally not an issue.

- -

JET_ CloseFile

- -

EAS_PUBLIC EAS_RESULT JET_CloseFile -(EAS_DATA_HANDLE easHandle)

- -

 

- -

Closes a JET file and release the resources associated with it.

- -

JET_ Status

- -

EAS_PUBLIC EAS_RESULT JET_Status -(EAS_DATA_HANDLE easHandle, S_JET_STATUS *pStatus)

- -

 

- -

Returns the current JET status. The elements of the status -data structure are as follows:

- -

 

- -

typedef struct s_jet_status_tag

- -

{

- -

     EAS_INT   currentUserID;

- -

     EAS_INT   segmentRepeatCount;

- -

     EAS_INT   numQueuedSegments;

- -

     EAS_BOOL paused;

- -

} S_JET_STATUS;

- -

 

- -

currentUserID: An -8-bit value assigned by the application.

- -

 

- -

segmentRepeatCount: -Number of times left to repeat. Zero indicates no repeats, a negative number -indicates an infinite number of repeats. Any positive value indicates that the -segment will play n+1 times.

- -

 

- -

numQueuedSegments: -Number of segments currently queued to play including the currently playing -segment. A value of zero indicates that nothing is playing. Normally, the -application will queue a new segment each time the value is 1 so that playback -is uninterrupted.

- -

JET_ QueueSegment

- -

EAS_PUBLIC EAS_RESULT JET_QueueSegment -(EAS_DATA_HANDLE easHandle, EAS_INT segmentNum, EAS_INT libNum, EAS_INT -repeatCount, EAS_INT transpose, EAS_U32 muteFlags, EAS_U8 userID)

- -

 

- -

Queues up a JET MIDI segment for playback. The parameters -are as follows:

- -

 

- -

segmentNum: -Segment number as identified in the JET content configuration file.

- -

 

- -

libNum: The library -number as specified in the JET content configuration file. Use -1 to select the -standard General MIDI library.

- -

 

- -

repeatCount: The -number of times this segment should repeat. Zero indicates no repeat, i.e. play -only once. Any positive number indicates to play n+1 times. Set to -1 to repeat -indefinitely.

- -

 

- -

transpose: The -amount of pitch transposition. Set to 0 for normal playback. Range is -12 to -+12.

- -

 

- -

muteFlags: -Specific which MIDI tracks (not MIDI channels) -should be muted during playback. These flags can be changed dynamically using -the mute functions. Bit 0 = track 0, bit 1 = track 1, etc.

- -

 

- -

userID: 8-bit -value specified by the application that uniquely identifies the segment. This -value is returned in the JET_Status() function as well as by the application -event when an event is detected in a segment. Normally, the application keeps -an 8-bit value that is incremented each time a new segment is queued up. This -can be used to look up any special characteristics of that track including -trigger clips and mute flags.

- -

JET_ Play

- -

EAS_PUBLIC EAS_RESULT JET_Play -(EAS_DATA_HANDLE easHandle)

- -

 

- -

Starts playback of the current segment. This function must -be called once after the initial segments are queued up to start playback. It -is also called after JET_Pause() to resume playback.

- -

JET_ Pause

- -

EAS_PUBLIC EAS_RESULT JET_Pause -(EAS_DATA_HANDLE easHandle)

- -

 

- -

Pauses playback of the current segment. Call JET_Pause() to -resume playback.

- -

JET_ SetMuteFlags

- -

EAS_PUBLIC EAS_RESULT JET_SetMuteFlags -(EAS_DATA_HANDLE easHandle, EAS_U32 muteFlags, EAS_BOOL sync)

- -

 

- -

Modifies the mute flags during playback. If the sync parameter is false, the mute flags -are updated at the beginning of the next render. This means that any new notes -or controller events will be processed during the next audio frame. If the sync parameter is true, the mute flags -will be updated at the start of the next segment. If the segment is repeated, -the flags will take effect the next time segment is repeated.

- -

JET_ SetMuteFlag

- -

EAS_PUBLIC EAS_RESULT JET_SetMuteFlag -(EAS_DATA_HANDLE easHandle, EAS_INT trackNum, EAS_BOOL muteFlag, EAS_BOOL sync)

- -

Modifies a mute flag for a single track during playback. If -the sync parameter is false, the mute -flag is updated at the beginning of the next render. This means that any new -notes or controller events will be processed during the next audio frame. If -the sync parameter is true, the mute -flag will be updated at the start of the next segment. If the segment is -repeated, the flag will take effect the next time segment is repeated.

- -

JET_ TriggerClip

- -

EAS_PUBLIC EAS_RESULT JET_TriggerClip -(EAS_DATA_HANDLE easHandle, EAS_INT clipID)

- -

 

- -

Automatically updates mute flags in sync with the JET Clip -Marker (controller 103). The parameter clipID -must be in the range of 0-63. After the call to JET_TriggerClip, when JET next -encounters a controller event 103 with bits 0-5 of the value equal to clipID and bit 6 set to 1, it will automatically un-mute the track containing -the controller event. When JET encounters the complementary controller event -103 with bits 0-5 of the value equal to clipID -and bit 6 set to 0, it will mute -the track again.

- -

JET_ GetEvent

- -

EAS_BOOL JET_GetEvent (EAS_DATA_HANDLE -easHandle, EAS_U32 *pEventRaw, S_JET_EVENT *pEvent)

- -

 

- -

Attempts to read an event from the application event queue, -return EAS_TRUE if an event is found and EAS_FALSE if not. If the application -passes a valid pointer for pEventRaw, -a 32-bit compressed event code is returned. If the application passes a valid -pointer for pEvent, the event is -parsed into the S_JET_EVENT fields. The application can pass NULL for either -parameter and that variable will be ignored. Normally, the application will -call JET_GetEvent() repeatedly to retrieve events until it returns EAS_FALSE.

- -

JET_ ParseEvent

- -

EAS_PUBLIC void JET_ParseEvent (EAS_U32 -event, S_JET_EVENT *pEvent)

- -

Parses a 32-bit compressed event code into a data structure. -The application passes the event code received from JET_GetEvent(). The parsed -event data is returned in the memory pointed to by pEvent.

- -

JET_GetAppData

- -

EAS_RESULT JET_GetAppData -(EAS_DATA_HANDLE easHandle, EAS_I32 *pAppDataOffset, EAS_I32 *pAppDataSize)

- -

Returns the offset and size of the JAPP chunk in the JET -file. The application can use the file I/O functions in the eas_host module to -retrieve application specific data from the file.

- -

 

- -

 

- -

Creating JET Content

- -

JET uses standard MIDI files and DLS files that can be -created with commercially available content tools such as Logic, Cubase, -Digital Performer, or SONAR for MIDI files and -Awave for DLS2 files. These source files are then bundled into a .jet package -file suitable for use in a JET application.

- -

 

- -

To create JET file use the “JET Creator” desktop -application. The JET Creator application is written in Python and includes a -full graphical interface. It is available for MAC and PC platforms. See “JET -Creator User Manual” for more information.

- -
- - - - diff --git a/docs/JET_Programming_Manual.html b/docs/JET_Programming_Manual.html new file mode 100644 index 0000000..198a9e6 --- /dev/null +++ b/docs/JET_Programming_Manual.html @@ -0,0 +1,1333 @@ + + + + + + + + + + + +JET PROGRAMMING MANUAL + + + + + + + + +
+   Copyright (C) 2009 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ +
+ +

JET™ Programming Manual

+ +

JET +Interactive Music Engine

+ +

Vrs 2.0

+ +

Authored by SONiVOX

+ +

www.sonivoxrocks.com

+ +

Copyright 2009 Sonic Network, Inc.

+ + + +

 

+ +

 

+ +

 

+ +

Introduction

+ +

This document contains programmer guidelines for the SONiVOX +JET Interactive Music System. JET is an interactive music player for small +embedded devices, including the Google Android platform. It allows applications +to include interactive music soundtracks, in MIDI +format, that respond in real-time to game play events and user interaction.

+ +

 

+ +

JET works in conjunction with SONiVOX’s Embedded Audio +Synthesizer (EAS) which is the MIDI playback +device for Android.  Both the JET and EAS +engines are integrated into the Android embedded platform as well as inherent +in JET Creator, an application for +authoring JET content files. As such, the JET content author can be sure that +the playback will sound exactly the same in both JET Creator and the final Android application playing back on +Android mobile devices.

+ +

 

+ +

The programmer of a JET application will want to work +closely with the content author in designing how real-time application events +and music will interactively work together. Once decided, the content author +will create the content and ultimately save a .jet file for the programmer to +include in the application.

+ +

 

+ +

Please see “JET Creator User Documentation” for additional +information on authoring JET content.

+ +

 

+ +

Abbreviations and Common Terms

+ +

It is important to use a common set of terms to minimize confusion. +Since JET uses MIDI in a unique way, normal +industry terms may not always suffice. Here is the definition of terms as they +are used in this document and in the JET Creator application:

+ +

 

+ +

Channel: MIDI data +associated with a specific MIDI channel. +Standard MIDI allows for 16 channels of MIDI +data each of which are typically associated with a specific instrument.

+ +

 

+ +

Controller: A MIDI event consisting of a channel number, controller +number, and a controller value. The MIDI spec +associates many controller numbers with specific functions, such as volume, +expression, sustain pedal, etc. JET also uses controller events as a means of +embedding special control information in a MIDI +sequence to provide for audio synchronization.

+ +

 

+ +

DAW: Digital Audio +Workstation. A common term for MIDI and audio +sequencing applications such as Logic, SONAR, Cubase and others.

+ +

 

+ +

EAS: Embedded MIDI Synthesizer. The name of the SONiVOX MIDI +synthesizer engine.

+ +

 

+ +

JET: Jet +Interactive Engine. The name of the SONiVOX JET interactive music engine.

+ +

 

+ +

Segment: A musical +section such as a chorus or verse that is a component of the overall +composition. In JET, a segment can be an entire MIDI file or a derived from a +portion of a MIDI file.

+ +

 

+ +

SMF-0: Standard +MIDI File Type 0, a MIDI file that contains a single track, but may be made up +of multiple channels of MIDI data.

+ +

 

+ +

SMF-1: Standard +MIDI File Type 1, a MIDI file that contains a one more tracks, and each track +may in turn be made up of one or more channels of MIDI +data. By convention, each channel is stored on a separate track in an SMF-1 +file. However, it is possible to have multiple MIDI channels on a single track, +or multiple tracks that contain data for the same MIDI +channel.

+ +

 

+ +

Track: A single +track in a DAW containing a timed sequence of MIDI +events. Be careful not to confuse Tracks with Channels. A MIDI file may contain +many tracks with several tracks utilizing the same MIDI +channel.

+ +

 

+ +

 

+ +

The JET +Interactive Music Concept

+ +

Interactive music can be defined as music that changes in +real-time according to non-predictable events such as user interaction or game +play events. In this way, interactive music is much more engaging as it has the +ability to match the energy and mood of a game much closer than a pre-composed +composition that never changes. In some applications and games, interactive +music is central to the game play. Guitar Hero is one such popular game. When +the end user successfully ‘captures’ the musical notes coming down the fret +board, the music adapts itself and simultaneously keeps score of successes and +failures. JET allows for these types of music driven games as well.

+ +

 

+ +

There are several methods for making and controlling +interactive music and JET is one such method. This section describes the +features of JET and how they might be used in a game or software application. +It also describes how JET can be used to save memory in small footprint devices +such as Android enabled mobile handsets.

+ +

 

+ +

JET Operation

+ +

JET supports a flexible music format that can be used to +create extended musical sequences with a minimal amount of data. A musical +composition is broken up into segments that can be sequenced to create a longer +piece. The sequencing can be fixed at the time the music file is authored, or +it can be created dynamically under program control.

+ +

Linear Music +Example

+ +

+ +

Figure 1: Linear Music Piece

+ +

 

+ +

This diagram shows how musical segments are stored. Each +segment is authored as a separate MIDI file. A +post-processing tool combines the files into a single container file. Each +segment can contain alternate music tracks that can be muted or un-muted to +create additional interest. An example might be a brass accent in the chorus +that is played only the last time through. Also, segments can be transposed up +or down.

+ +

 

+ +

The bottom part of the diagram shows how the musical +segments can be recombined to create a linear music piece. In this example, the +bridge might end with a half-step key modulation and the remaining segments +could be transposed up a half-step to match.

+ +

Non-linear Music Example

+ +

+ +

Figure 2: Non-linear music piece

+ +

 

+ +

In this diagram, we see a non-linear music piece. The +scenario is a first-person-shooter (FPS) and JET is providing the background +music. The intro plays as the level is loading and then transitions under +program control to the Searching segment. This segment is repeated +indefinitely, perhaps with small variations (using the mute/un-mute feature) +until activity in the game dictates a change.

+ +

 

+ +

As the player nears a monster lair, the program starts a +synchronized transition to the Danger segment, increasing the tension level in +the audio. As the player draws closer to the lair, additional tracks are +un-muted to increase the tension.

+ +

 

+ +

As the player enters into combat with the monster, the +program starts a synchronized transition to the Combat segment. The segment +repeats indefinitely as the combat continues. A Bonus Hit temporarily un-mutes +a decorative track that notifies the player of a successful attack, and +similarly, another track is temporarily un-muted to signify when the player +receives Special Damage.

+ +

 

+ +

At the end of combat, the music transitions to a victory or +defeat segment based on the outcome of battle.

+ +

Mute/Un-mute Synchronization

+ +

JET can also synchronize the muting and un-muting of tracks +to events in the music. For example, in the FPS game, it would probably be +desirable to place the musical events relating to bonuses and damage as close +to the actual game event as possible. However, simply un-muting a track at the +moment the game event occurs might result in a music clip starting in the +middle. Alternatively, a clip could be started from the beginning, but then it +wouldn’t be synchronized with the other music tracks.

+ +

 

+ +

However, with the JET sync engine, a clip can be started at +the next opportune moment and maintain synchronization. This can be +accomplished by placing a number of short music clips on a decorative track. A MIDI event in the stream signifies the start of a clip +and a second event signifies the end of a clip. When the application calls the +JET clip function, the next clip in the track is allowed to play fully +synchronized to the music. Optionally, the track can be automatically muted by +a second MIDI event.

+ +

 

+ +

+ +

Figure 3: Synchronized Mute/Unmute

+ +

Audio Synchronization

+ +

JET provides an audio synchronization API that allows game +play to be synchronized to events in the audio. The mechanism relies on data +embedded in the MIDI file at the time the +content is authored. When the JET engine senses an event during playback it +generates a callback into the application program. The timing of the callback +can be adjusted to compensate for any latency in the audio playback system so +that audio and video can be synchronized. The diagram below shows an example of +a simple music game that involves pressing the left and right arrows in time +with the music.

+ +

 

+ +

 

+ +

+ +

Figure 4: Music Game with +Synchronization

+ +

 

+ +

The arrows represent events in the music sequence where game +events need to be synchronized. In this case, the blue arrow represents a time +where the player is supposed to press the left button, and the red arrow is for +the right button. The yellow arrow tells the game engine that the sequence is +complete. The player is allowed a certain time window before and after the +event to press the appropriate key.

+ +

 

+ +

If an event is received and the player has not pressed a +button, a timer is set to half the length of the window. If the player presses +the button before the timer expires, the game registers a success, and if not, +the game registers a failure.

+ +

 

+ +

If the player presses the button before the event is +received, a timer is set to half the length of the window. If an event is +received before the timer expires, the game registers a success, and if not, +the game registers a failure. Game play might also include bonuses for getting +close to the timing of the actual event.

+ +

 

+ +

Operational Details

+ +

JET uses the standard EAS library calls to manage multiple MIDI streams that are synchronized to sound like a +seamless audio track. JET requires the use of the dynamic memory model, i.e. +support for malloc() and free() memory allocation functions or their +equivalent. JET also requires the DLS parser and synthesizer module to support +custom instruments in JET content files.

+ +

 

+ +

JET uses standard MIDI +events for audio synchronization. This simplifies the authoring process by +allowing content authors to use their favorite tools for developing content. +After the content has been developed, a simple post-processing tool pulls the +content together into a JET compatible content file.

+ +

Synchronization Events

+ +

JET uses MIDI controller +events to synchronize audio. The controllers used by JET are among those not +defined for specific use by the MIDI +specification. The specific controller definitions are as follows:

+ +

 

+ +

            Controllers +80-83                 Reserved for use by +application

+ +

            Controller 102                       JET event marker

+ +

            Controller +103                       JET clip marker

+ +

            Controllers +104-119             Reserved for future +use

+ +

 

+ +

Controllers 80-83 – Application Controllers

+ +

The application may use controllers in this range for its +own purposes. When a controller in this range is encountered, the event is +entered into an event queue that can be queried by the application. Some +possible uses include synchronizing video events with audio and marking a point +in a MIDI segment to queue up the next +segment. The range of controllers monitored by the application can be modified +by the application during initialization.

+ +

Controller 102 – JET Event Marker

+ +

Controller 102 is reserved for marking events in the MIDI streams that are specific to JET functionality. +Currently, the only defined value is 0, which marks the end of a segment for +timing purposes.

+ +

 

+ +

Normally, JET starts playback of the next segment (or +repeats the current segment) when the MIDI +end-of-track meta-event is encountered. Some MIDI +authoring tools make it difficult to place the end-of-track marker accurately, +resulting in synchronization problems when segments are joined together.

+ +

 

+ +

To avoid this problem, the author can place a JET +end-of-segment marker (controller=102, value=0) at the point where the segment is +to be looped. When the end-of-segment marker is encountered, the next segment +will be triggered, or if the current segment is looped, playback will resume at +the start of the segment.

+ +

 

+ +

The end-of-segment marker can also be used to allow for +completion of a musical figure beyond the end of measure that marks the start +of the next segment. For example, the content author might create a 4-bar +segment with a drum fill that ends on beat 1 of the 5th bar – a bar +beyond the natural end of the segment. By placing an end-of-segment marker at +the end of the 4th bar, the next segment will be triggered, but the +drum fill will continue in parallel with the next segment providing musical +continuity.

+ +

 

+ +

+ +

Figure 5: End-of-segment Marker

+ +

Controller 103 – JET Clip Marker

+ +

Controller 103 is reserved for marking clips in a MIDI track that can be triggered by the JET_TriggerClip +API call. The clip ID is encoded in the low 6 bits of the controller value. Bit +6 is set to one to indicate the start of a clip, and set to zero to indicate +the end of a clip.

+ +

 

+ +

For example, to identify a clip with a clip ID of 1, the +author inserts a MIDI controller event with +controller=103 and value=65 at the start of the clip and another event with controller=103 +and value=1 at the end of the clip. When the JET_TriggerClip() function is +called with a clip ID of 1, the track will be un-muted when the controller +value 65 is encountered and muted again when the controller value 1 is +encountered.

+ +

 

+ +

+ +

Figure 6: Synchronized Clip

+ +

 

+ +

In the figure above, if the JET_TriggerClip() function is +called prior to the first controller event, Track 3 will be un-muted when the +first controller event occurs, the first clip will play, and the track will be +muted when the second controller event occurs. If the JET_TriggerClip() +function is called after the first controller event has occurred, Track 3 will +be un-muted when the third controller event occurs, the second clip will play, +and the track will be muted again when the fourth controller event occurs.

+ +

 

+ +

Note: Normally, +the track containing the clip is muted by the application when the segment is +initially queued by the call to JET_QueueSegment(). If it is not muted, the clip +will always play until Jet_TriggerClip() has been called with the clip ID.

+ +

JET Programming

+ +

The JET library builds on functionality in the EAS library. +It is assumed that the reader is familiar with EAS and has implemented basic +EAS audio functionality in the application. Specifically, the application must +first initialize EAS by calling EAS_Init() and must call EAS_Render() at +appropriate times to render audio and stream it to the audio hardware. JET also +requires the use of the dynamic memory model which uses malloc() and free() or +functional equivalents.

+ +

 

+ +

Most JET function calls return an EAS_RESULT type which +should be checked against the EAS_SUCCESS return code. Most failures are not +fatal, i.e. they will not put the library in a state where it must be +re-initialized. However, some failures such as memory allocation or file +open/read errors will likely result in the specific open content failing to +render.

+ +

JET Application Initialization

+ +

The JET library is initialized by the JET_Init() function. +The application must first call EAS_Init() and then pass the EAS data handle +returned by EAS_Init() to the JET_Init() function. Currently, only a single JET +application can be active at a time.

+ +

 

+ +

The JET_Init function takes 3 arguments: The first is the +EAS data handle. The second is a pointer to a configuration structure +S_JET_CONFIG and the third is the size of the configuration structure. For most +applications, it is sufficient to pass a NULL pointer and size 0 for the +configuration data.

+ +

 

+ +

However, if desired, the configuration can be modified to +allow the application to monitor MIDI events +outside the normal range of controllers allocated for JET application events. +In this case, a configuration structure should be allocated and the data fields +initialized with the appropriate values with the low and high controller +numbers to be monitored. The size field should be the sizeof() of the data +structure. This is to allow for future enhancement of the configuration data +while maintaining compatibility.

+ +

JET Application Termination

+ +

When the JET application terminates, it should call +JET_Shutdown() to release the resources allocated by the JET engine.  If the application has no other use for the +EAS library, it should also call EAS_Shutdown().

+ +

JET Audio Processing

+ +

To start the JET engine, the content must first be opened +with the JET_OpenFile() function. Just as with EAS_OpenFile(), the file locator +is an opaque value that is passed to the EAS_HWOpenFile() function. It can +either be a pointer to a filename, or a pointer to an in-memory object, +depending on the user implementation of file I/O in the eas_host.c or +eas_hostmm.c module. Only a single JET content file can be opened at a time.

+ +

 

+ +

Once the JET file is opened, the application can begin +queuing up segments for playback by calling the JET_QueueSegment() function. +Generally, it is advisable to keep a minimum of two segments queued at all +times:  the currently playing segment +plus an additional segment that is ready to start playing when the current +segment finishes. However, with proper programming, it is possible to queue up +segments using a “just-in-time” technique. This technique typically involves +careful placement of application controller events near the end of a segment so +that the application is informed when a segment is about to end.

+ +

 

+ +

After the segment(s) are queued up, playback can begin. By +default, the segments are initialized in a paused state. To start playback, +call the JET_Play() function. Playback can be paused again by calling the JET_Pause() +function. Once initiated, playback will continue as long as the application +continues to queue up new segments before all the segments in the queue are +exhausted.

+ +

 

+ +

The JET_Status() function can be used to monitor progress. +It returns the number of segments queued, repeat count, current segment ID, and +play status. By monitor the number of segments queued, the application can +determine when it needs to queue another segment and when playback has +completed.

+ +

 

+ +

When playback has completed and the application is finished +with the contents of the currently open file, the application should call +JET_CloseFile() to close the file and release any resources associated with the +file.

+ +

JET_Init

+ +

EAS_PUBLIC EAS_RESULT JET_Init +(EAS_DATA_HANDLE easHandle, S_JET_CONFIG *pConfig, EAS_INT configSize)

+ +

 

+ +

Initializes JET library for use by application. Most +application should simply pass a NULL for pConfig and 0 for configSize, which +means that only controller events in the application range (80-83) will end up +in the application event queue. If desired, the application can instantiate an +S_JET_CONFIG data structure and set the controller range to a different range. +In this case, the configSize parameter should be set to sizeof(S_JET_CONFIG).

+ +

JET_Shutdown

+ +

EAS_PUBLIC EAS_RESULT JET_Shutdown +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Releases resources used by the JET library. The application +should call this function when it is no longer using the JET library.

+ +

JET_ OpenFile

+ +

EAS_PUBLIC EAS_RESULT JET_OpenFile +(EAS_DATA_HANDLE easHandle, EAS_FILE_LOCATOR locator)

+ +

 

+ +

Opens a JET content file for playback. Content must be +formatted for use by the JET library, which is typically accomplished with the +jetfile.py script (see “Creating JET Content”). Only a single JET content file +can be opened at a time. However, since JET can contain many MIDI +files and DLS libraries, this limitation is normally not an issue.

+ +

JET_ CloseFile

+ +

EAS_PUBLIC EAS_RESULT JET_CloseFile +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Closes a JET file and release the resources associated with it.

+ +

JET_ Status

+ +

EAS_PUBLIC EAS_RESULT JET_Status +(EAS_DATA_HANDLE easHandle, S_JET_STATUS *pStatus)

+ +

 

+ +

Returns the current JET status. The elements of the status +data structure are as follows:

+ +

 

+ +

typedef struct s_jet_status_tag

+ +

{

+ +

     EAS_INT   currentUserID;

+ +

     EAS_INT   segmentRepeatCount;

+ +

     EAS_INT   numQueuedSegments;

+ +

     EAS_BOOL paused;

+ +

} S_JET_STATUS;

+ +

 

+ +

currentUserID: An +8-bit value assigned by the application.

+ +

 

+ +

segmentRepeatCount: +Number of times left to repeat. Zero indicates no repeats, a negative number +indicates an infinite number of repeats. Any positive value indicates that the +segment will play n+1 times.

+ +

 

+ +

numQueuedSegments: +Number of segments currently queued to play including the currently playing +segment. A value of zero indicates that nothing is playing. Normally, the +application will queue a new segment each time the value is 1 so that playback +is uninterrupted.

+ +

JET_ QueueSegment

+ +

EAS_PUBLIC EAS_RESULT JET_QueueSegment +(EAS_DATA_HANDLE easHandle, EAS_INT segmentNum, EAS_INT libNum, EAS_INT +repeatCount, EAS_INT transpose, EAS_U32 muteFlags, EAS_U8 userID)

+ +

 

+ +

Queues up a JET MIDI segment for playback. The parameters +are as follows:

+ +

 

+ +

segmentNum: +Segment number as identified in the JET content configuration file.

+ +

 

+ +

libNum: The library +number as specified in the JET content configuration file. Use -1 to select the +standard General MIDI library.

+ +

 

+ +

repeatCount: The +number of times this segment should repeat. Zero indicates no repeat, i.e. play +only once. Any positive number indicates to play n+1 times. Set to -1 to repeat +indefinitely.

+ +

 

+ +

transpose: The +amount of pitch transposition. Set to 0 for normal playback. Range is -12 to ++12.

+ +

 

+ +

muteFlags: +Specific which MIDI tracks (not MIDI channels) +should be muted during playback. These flags can be changed dynamically using +the mute functions. Bit 0 = track 0, bit 1 = track 1, etc.

+ +

 

+ +

userID: 8-bit +value specified by the application that uniquely identifies the segment. This +value is returned in the JET_Status() function as well as by the application +event when an event is detected in a segment. Normally, the application keeps +an 8-bit value that is incremented each time a new segment is queued up. This +can be used to look up any special characteristics of that track including +trigger clips and mute flags.

+ +

JET_ Play

+ +

EAS_PUBLIC EAS_RESULT JET_Play +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Starts playback of the current segment. This function must +be called once after the initial segments are queued up to start playback. It +is also called after JET_Pause() to resume playback.

+ +

JET_ Pause

+ +

EAS_PUBLIC EAS_RESULT JET_Pause +(EAS_DATA_HANDLE easHandle)

+ +

 

+ +

Pauses playback of the current segment. Call JET_Pause() to +resume playback.

+ +

JET_ SetMuteFlags

+ +

EAS_PUBLIC EAS_RESULT JET_SetMuteFlags +(EAS_DATA_HANDLE easHandle, EAS_U32 muteFlags, EAS_BOOL sync)

+ +

 

+ +

Modifies the mute flags during playback. If the sync parameter is false, the mute flags +are updated at the beginning of the next render. This means that any new notes +or controller events will be processed during the next audio frame. If the sync parameter is true, the mute flags +will be updated at the start of the next segment. If the segment is repeated, +the flags will take effect the next time segment is repeated.

+ +

JET_ SetMuteFlag

+ +

EAS_PUBLIC EAS_RESULT JET_SetMuteFlag +(EAS_DATA_HANDLE easHandle, EAS_INT trackNum, EAS_BOOL muteFlag, EAS_BOOL sync)

+ +

Modifies a mute flag for a single track during playback. If +the sync parameter is false, the mute +flag is updated at the beginning of the next render. This means that any new +notes or controller events will be processed during the next audio frame. If +the sync parameter is true, the mute +flag will be updated at the start of the next segment. If the segment is +repeated, the flag will take effect the next time segment is repeated.

+ +

JET_ TriggerClip

+ +

EAS_PUBLIC EAS_RESULT JET_TriggerClip +(EAS_DATA_HANDLE easHandle, EAS_INT clipID)

+ +

 

+ +

Automatically updates mute flags in sync with the JET Clip +Marker (controller 103). The parameter clipID +must be in the range of 0-63. After the call to JET_TriggerClip, when JET next +encounters a controller event 103 with bits 0-5 of the value equal to clipID and bit 6 set to 1, it will automatically un-mute the track containing +the controller event. When JET encounters the complementary controller event +103 with bits 0-5 of the value equal to clipID +and bit 6 set to 0, it will mute +the track again.

+ +

JET_ GetEvent

+ +

EAS_BOOL JET_GetEvent (EAS_DATA_HANDLE +easHandle, EAS_U32 *pEventRaw, S_JET_EVENT *pEvent)

+ +

 

+ +

Attempts to read an event from the application event queue, +return EAS_TRUE if an event is found and EAS_FALSE if not. If the application +passes a valid pointer for pEventRaw, +a 32-bit compressed event code is returned. If the application passes a valid +pointer for pEvent, the event is +parsed into the S_JET_EVENT fields. The application can pass NULL for either +parameter and that variable will be ignored. Normally, the application will +call JET_GetEvent() repeatedly to retrieve events until it returns EAS_FALSE.

+ +

JET_ ParseEvent

+ +

EAS_PUBLIC void JET_ParseEvent (EAS_U32 +event, S_JET_EVENT *pEvent)

+ +

Parses a 32-bit compressed event code into a data structure. +The application passes the event code received from JET_GetEvent(). The parsed +event data is returned in the memory pointed to by pEvent.

+ +

JET_GetAppData

+ +

EAS_RESULT JET_GetAppData +(EAS_DATA_HANDLE easHandle, EAS_I32 *pAppDataOffset, EAS_I32 *pAppDataSize)

+ +

Returns the offset and size of the JAPP chunk in the JET +file. The application can use the file I/O functions in the eas_host module to +retrieve application specific data from the file.

+ +

 

+ +

 

+ +

Creating JET Content

+ +

JET uses standard MIDI files and DLS files that can be +created with commercially available content tools such as Logic, Cubase, +Digital Performer, or SONAR for MIDI files and +Awave for DLS2 files. These source files are then bundled into a .jet package +file suitable for use in a JET application.

+ +

 

+ +

To create JET file use the “JET Creator” desktop +application. The JET Creator application is written in Python and includes a +full graphical interface. It is available for MAC and PC platforms. See “JET +Creator User Manual” for more information.

+ +
+ + + + -- cgit v1.2.3 From d24fa1d0b4b07dd99796a8a3948654ca28c0e9f4 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi <> Date: Fri, 17 Apr 2009 17:06:15 -0700 Subject: AI 146818: Add JET template for Apple Logic 8 for easier creation of MIDI files to import in JetCreator BUG=1721874 Automated import of CL 146818 --- .../JET_Logic8.logic/LgDoc/displayState | Bin 0 -> 4245 bytes .../JET_Logic8.logic/LgDoc/documentData | Bin 0 -> 678442 bytes jet_tools/logic_templates/README.txt | 1 + 3 files changed, 1 insertion(+) create mode 100755 jet_tools/logic_templates/JET_Logic8.logic/LgDoc/displayState create mode 100755 jet_tools/logic_templates/JET_Logic8.logic/LgDoc/documentData create mode 100644 jet_tools/logic_templates/README.txt diff --git a/jet_tools/logic_templates/JET_Logic8.logic/LgDoc/displayState b/jet_tools/logic_templates/JET_Logic8.logic/LgDoc/displayState new file mode 100755 index 0000000..f1c6a4a Binary files /dev/null and b/jet_tools/logic_templates/JET_Logic8.logic/LgDoc/displayState differ diff --git a/jet_tools/logic_templates/JET_Logic8.logic/LgDoc/documentData b/jet_tools/logic_templates/JET_Logic8.logic/LgDoc/documentData new file mode 100755 index 0000000..2ff5ed4 Binary files /dev/null and b/jet_tools/logic_templates/JET_Logic8.logic/LgDoc/documentData differ diff --git a/jet_tools/logic_templates/README.txt b/jet_tools/logic_templates/README.txt new file mode 100644 index 0000000..471046c --- /dev/null +++ b/jet_tools/logic_templates/README.txt @@ -0,0 +1 @@ +This directory contains Apple Logic template files to facilitate the creation of MIDI files to import in JetCreator. \ No newline at end of file -- cgit v1.2.3