From f482e52d9c20989ec08699efaccabf1ef5a99e9a Mon Sep 17 00:00:00 2001 From: JensLincke Date: Tue, 21 May 2024 11:40:11 +0200 Subject: [PATCH 01/47] show liniting syntax errors SQUASHED: AUTO-COMMIT-demos-javascript-double-import.js,AUTO-COMMIT-src-external-eslint-eslint-lint.js, --- demos/javascript/double-import.js | 1 + src/external/eslint/eslint-lint.js | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/demos/javascript/double-import.js b/demos/javascript/double-import.js index 08a47b3a3..42a04705b 100644 --- a/demos/javascript/double-import.js +++ b/demos/javascript/double-import.js @@ -1,4 +1,5 @@ import {value} from "./a.js" +import {value} from "./a.js" var foo =3 diff --git a/src/external/eslint/eslint-lint.js b/src/external/eslint/eslint-lint.js index da434c192..16cfa72c2 100644 --- a/src/external/eslint/eslint-lint.js +++ b/src/external/eslint/eslint-lint.js @@ -343,7 +343,7 @@ import {parse} from "./eslint-parser.js"; var error = errors[i]; result.push({message: error.message, severity: getSeverity(error), - from: getPos(error, true), + from: getPos(error, true) , to: getPos(error, false)}); } return result; @@ -352,6 +352,8 @@ import {parse} from "./eslint-parser.js"; CodeMirror.registerHelper("lint", "javascript", validator); function getPos(error, from) { + if (error.line === undefined) return CodeMirror.Pos(0, 0) + var line = error.line-1, ch = from ? error.column : error.column+1; if (error.node && error.node.loc) { line = from ? error.node.loc.start.line -1 : error.node.loc.end.line -1; From 58101fbdda781808ba67e528e176f9d573080a15 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Tue, 21 May 2024 12:13:40 +0200 Subject: [PATCH 02/47] initial version SQUASHED: AUTO-COMMIT-src-components-tools-openai-audio-chat.html,AUTO-COMMIT-src-components-tools-openai-audio-chat.js, --- src/components/tools/openai-audio-chat.html | 35 +++ src/components/tools/openai-audio-chat.js | 274 ++++++++++++++++++++ 2 files changed, 309 insertions(+) create mode 100644 src/components/tools/openai-audio-chat.html create mode 100644 src/components/tools/openai-audio-chat.js diff --git a/src/components/tools/openai-audio-chat.html b/src/components/tools/openai-audio-chat.html new file mode 100644 index 000000000..9bd29bf34 --- /dev/null +++ b/src/components/tools/openai-audio-chat.html @@ -0,0 +1,35 @@ + diff --git a/src/components/tools/openai-audio-chat.js b/src/components/tools/openai-audio-chat.js new file mode 100644 index 000000000..9fa049dda --- /dev/null +++ b/src/components/tools/openai-audio-chat.js @@ -0,0 +1,274 @@ +import OpenAI from "demos/openai/openai.js" +import Morph from 'src/components/widgets/lively-morph.js' + + +export default class Speech { + + static async playSpeech(text, voice) { + let speechKey = await OpenAI.ensureSubscriptionKey() + const speechUrl = "https://api.openai.com/v1/audio/speech"; + + let prompt = { + "model": "tts-1", + "input": text, + "voice": voice + }; + + const requestOptions = { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${speechKey}` + }, + body: JSON.stringify(prompt) + }; + + const response = await fetch(speechUrl, requestOptions); + const audioBlob = await response.blob(); + + // Create an audio element and play the speech + const audio = new Audio(URL.createObjectURL(audioBlob)); + audio.play(); + } + + static async transcript(audioFile) { + + let transcriptKey = await OpenAI.ensureSubscriptionKey() + const transcriptUrl = "https://api.openai.com/v1/audio/transcriptions"; + + let prompt = { + "file": audioFile, + "model": "whisper-1" + } + + const formData = new FormData(); + formData.append('file', audioFile, 'audio.ogg'); + formData.append('model', 'whisper-1'); + + + const requestOptions = { + method: "POST", + headers: { + "Authorization": `Bearer ${transcriptKey}`, + + }, + body: formData + }; + + let result = await fetch(transcriptUrl, requestOptions).then(r => r.json()) + return result; + } +} + + +export default class AudioRecorder { + constructor() { + this.mediaRecorder = null; + this.audioChunks = []; + this.stream = null; + this.lastAudioUrl = null; + this.lastBlob = null; + } + + async init() { + this.stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + this.mediaRecorder = new MediaRecorder(this.stream); + this.setupListeners(); + } + + setupListeners() { + this.mediaRecorder.addEventListener("dataavailable", event => { + this.audioChunks.push(event.data); + }); + + this.mediaRecorder.addEventListener("stop", () => { + const audioBlob = new Blob(this.audioChunks); + this.lastBlob = audioBlob; + if (this.lastAudioUrl) { + // Revoke the old URL to avoid memory leaks + URL.revokeObjectURL(this.lastAudioUrl); + } + this.lastAudioUrl = URL.createObjectURL(audioBlob); + this.cleanup(); // Cleanup the audio chunks for the next recording + + + this.stopRecordingResolve(this.lastBlob) + + }); + } + + startRecording() { + if (this.mediaRecorder && this.mediaRecorder.state === "inactive") { + this.audioChunks = []; // Clear previous recordings + this.mediaRecorder.start(); + } + } + + + stopRecording() { + if (this.mediaRecorder && this.mediaRecorder.state === "recording") { + this.mediaRecorder.stop(); + + + return new Promise(resolve => { + this.stopRecordingResolve = resolve + }) + } + } + + play() { + if (this.lastAudioUrl) { + const audio = new Audio(this.lastAudioUrl); + audio.play(); + } + } + + cleanup() { + if (this.stream) { + this.stream.getTracks().forEach(track => track.stop()); + } + this.audioChunks = []; + } +} +/*MD # OpenAI Text-to-Speech Tools + + + +MD*/ + +export default class OpenaiAudioChat extends Morph { + async initialize() { + this.windowTitle = "OpenaiAudioChat"; + this.registerButtons() + lively.html.registerKeys(this); // automatically installs handler for some methods + + + this.audioRecorder = new AudioRecorder(); + + this.conversation = [{ + role: 'system', + content: 'Play the role of an AI that speaks out loud with the user. He also speaks to you. what you get in text he spoke.' + }]; + + + this.setupUI() + } + + resetConversation() { + this.conversation = [{ + role: 'system', + content: 'Play the role of an AI that speaks out loud with the user. He also speaks to you. what you get in text he spoke.' + }]; + + this.responses.innerHTML = '' + } + + async setupUI() { + + this.audioRecorder.init(); + + this.recordButton = + + + this.responses = +
    ; + + this.resetButton = + this.textInput = + + ; + + this.voiceBox = await ( + ); + this.modelBox = await ( + ); + + //TEMP CODEs + + this.resetButton.addEventListener("mousedown", () => + this.resetConversation() + ) + this.recordButton.addEventListener("mousedown", () => this.audioRecorder.startRecording()) + this.recordButton.addEventListener("mouseup", async () => { + var blob = await this.audioRecorder.stopRecording(); + const text = await Speech.transcript(blob) + this.textInput.value = this.textInput.value + text.text; + this.audioRecorder.init() + 1 this.chat(this.textInput.value); + }) + + this.textInput.addEventListener("keydown", (event) => { + if (event.keyCode === 13) { + this.chat(this.textInput.value); + } + }); + + //comboboxes + this.voiceBox.setOptions(["alloy", "echo", "fable", "onyx", "nova", "shimmer"]) + this.modelBox.setOptions(["gpt-4o", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"]) + + var ui = + +
    + {this.responses} + {this.textInput} + {this.recordButton} +
    + {this.resetButton} + {this.voiceBox} + {this.modelBox} +
    +
    + + this.get("#pane").innerHMTML = "" + this.get("#pane").appendChild(ui) + } + + //respons to the question + async chat(text) { + + const key = await OpenAI.ensureSubscriptionKey() + const url = "https://api.openai.com/v1/chat/completions" + + this.textInput.value = ""; + + this.conversation.push({ "role": "user", "content": text }); + + let prompt = { + "model": this.modelBox.value, + "max_tokens": 500, + "temperature": 0.1, + "top_p": 1, + "n": 1, + "stream": false, + "stop": "VANILLA", + "messages": this.conversation, + }; + + + const requestOptions = { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${key}` + }, + body: JSON.stringify(prompt) + }; + + + + let result = await fetch(url, requestOptions).then(r => r.json()) + this.conversation.push({ "role": "system", "content": result.choices[0].message.content }) + + this.responses.appendChild(
  • You
  • ); + this.responses.appendChild(
  • {text}
  • ); + + this.responses.appendChild(
  • AI
  • ); + this.responses.appendChild(
  • {result.choices[0].message.content}
  • ); + + // Generate speech for the user message + Speech.playSpeech(result.choices[0].message.content, this.voiceBox.value); + + + } +} From bcc87dd260ce189a3ec53e644e548c8254648d14 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Tue, 21 May 2024 18:05:38 +0200 Subject: [PATCH 03/47] added F4 as a global push to talk in ai chat SQUASHED: AUTO-COMMIT-demos-openai-vision.png,AUTO-COMMIT-src-client-audio.js,AUTO-COMMIT-src-client-openai.js,AUTO-COMMIT-src-components-tools-openai-audio-chat.html,AUTO-COMMIT-src-components-tools-openai-audio-chat.js, --- demos/openai/vision.png | Bin 2091 -> 2736 bytes src/client/audio.js | 65 ++++ src/client/openai.js | 75 +++++ src/components/tools/openai-audio-chat.html | 76 ++++- src/components/tools/openai-audio-chat.js | 311 +++++++------------- 5 files changed, 311 insertions(+), 216 deletions(-) create mode 100644 src/client/audio.js create mode 100644 src/client/openai.js diff --git a/demos/openai/vision.png b/demos/openai/vision.png index 116252e498997019934f52863c04960bee741a2f..b6731b79bc0e08918023a263012e33508a6384b2 100644 GIT binary patch delta 2716 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 diff --git a/src/client/audio.js b/src/client/audio.js new file mode 100644 index 000000000..1654021e8 --- /dev/null +++ b/src/client/audio.js @@ -0,0 +1,65 @@ + +export class AudioRecorder { + constructor() { + this.mediaRecorder = null; + this.audioChunks = []; + this.stream = null; + this.lastAudioUrl = null; + this.lastBlob = null; + } + + async init() { + this.stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + this.mediaRecorder = new MediaRecorder(this.stream); + this.setupListeners(); + } + + setupListeners() { + this.mediaRecorder.addEventListener("dataavailable", event => { + this.audioChunks.push(event.data); + }) + + this.mediaRecorder.addEventListener("stop", () => { + const audioBlob = new Blob(this.audioChunks); + this.lastBlob = audioBlob; + if (this.lastAudioUrl) { + // Revoke the old URL to avoid memory leaks + URL.revokeObjectURL(this.lastAudioUrl); + } + this.lastAudioUrl = URL.createObjectURL(audioBlob); + this.cleanup(); // Cleanup the audio chunks for the next recording + + this.stopRecordingResolve(this.lastBlob) + }) + } + + startRecording() { + if (this.mediaRecorder && this.mediaRecorder.state === "inactive") { + this.audioChunks = []; // Clear previous recordings + this.mediaRecorder.start(); + } + } + + stopRecording() { + if (this.mediaRecorder && this.mediaRecorder.state === "recording") { + this.mediaRecorder.stop(); + return new Promise(resolve => { + this.stopRecordingResolve = resolve + }) + } + } + + play() { + if (this.lastAudioUrl) { + const audio = new Audio(this.lastAudioUrl); + audio.play(); + } + } + + cleanup() { + if (this.stream) { + this.stream.getTracks().forEach(track => track.stop()); + } + this.audioChunks = []; + } +} \ No newline at end of file diff --git a/src/client/openai.js b/src/client/openai.js new file mode 100644 index 000000000..19157f703 --- /dev/null +++ b/src/client/openai.js @@ -0,0 +1,75 @@ +const openAiSubscriptionKeyId = "openai-key"; + +export default class OpenAI { + static async ensureSubscriptionKey() { + var key = this.getSubscriptionKey() + if (!key) { + key = await lively.prompt(`Enter your OpenAI key`, ""); + this.setSubscriptionKey(key); + } + return key + } + + static setSubscriptionKey(key) { + return localStorage.setItem(openAiSubscriptionKeyId, key); + } + + static getSubscriptionKey() { + return localStorage.getItem(openAiSubscriptionKeyId); + } + +} + + + +export class Speech { + + static async playSpeech(text, voice) { + let speechKey = await OpenAI.ensureSubscriptionKey() + const speechUrl = "https://api.openai.com/v1/audio/speech"; + + let prompt = { + "model": "tts-1", + "input": text, + "voice": voice + }; + + const requestOptions = { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${speechKey}` + }, + body: JSON.stringify(prompt) + }; + + const response = await fetch(speechUrl, requestOptions) + const audioBlob = await response.blob() + + // Create an audio element and play the speech + const audio = new Audio(URL.createObjectURL(audioBlob)) + audio.play(); + } + + static async transcript(audioFile) { + + let transcriptKey = await OpenAI.ensureSubscriptionKey() + const transcriptUrl = "https://api.openai.com/v1/audio/transcriptions" + + const formData = new FormData(); + formData.append('file', audioFile, 'audio.ogg'); + formData.append('model', 'whisper-1'); + + const requestOptions = { + method: "POST", + headers: { + "Authorization": `Bearer ${transcriptKey}`, + + }, + body: formData + }; + + let result = await fetch(transcriptUrl, requestOptions).then(r => r.json()) + return result; + } +} \ No newline at end of file diff --git a/src/components/tools/openai-audio-chat.html b/src/components/tools/openai-audio-chat.html index 9bd29bf34..7fd2a8c12 100644 --- a/src/components/tools/openai-audio-chat.html +++ b/src/components/tools/openai-audio-chat.html @@ -2,34 +2,88 @@ -
    + :host(.recording) #recordButton { + border: 4px solid red; + } + -
    - + #resetButton { + border-radius: 100px + } + #buttonBar { + width: 100%; + height: 40px; + border: 1px solid gray; + position: absolute; + top: 0px; + } + #responses { + list-style-type: none; + width: calc(100% - 50px); + height: calc(100% - 140px) ; + overflow-y: scroll; + top: 40px; + position: absolute; + } + #pane { + height: 100%; + width: 100%; + position: absolute; + top: 0px; + left: 0px + } + +
    +
      +
      + + + +
      +
      + + +
      +
      diff --git a/src/components/tools/openai-audio-chat.js b/src/components/tools/openai-audio-chat.js index 9fa049dda..39dca13c2 100644 --- a/src/components/tools/openai-audio-chat.js +++ b/src/components/tools/openai-audio-chat.js @@ -1,230 +1,136 @@ -import OpenAI from "demos/openai/openai.js" +import OpenAI from "src/client/openai.js" +import {Speech} from "src/client/openai.js" import Morph from 'src/components/widgets/lively-morph.js' +import {AudioRecorder} from "src/client/audio.js" +/*MD # OpenAI Chat App with Speech-to-Text support +MD*/ +let CurrentChat -export default class Speech { - - static async playSpeech(text, voice) { - let speechKey = await OpenAI.ensureSubscriptionKey() - const speechUrl = "https://api.openai.com/v1/audio/speech"; - - let prompt = { - "model": "tts-1", - "input": text, - "voice": voice - }; - - const requestOptions = { - method: "POST", - headers: { - "Content-Type": "application/json", - "Authorization": `Bearer ${speechKey}` - }, - body: JSON.stringify(prompt) - }; - - const response = await fetch(speechUrl, requestOptions); - const audioBlob = await response.blob(); - - // Create an audio element and play the speech - const audio = new Audio(URL.createObjectURL(audioBlob)); - audio.play(); - } - - static async transcript(audioFile) { - - let transcriptKey = await OpenAI.ensureSubscriptionKey() - const transcriptUrl = "https://api.openai.com/v1/audio/transcriptions"; - - let prompt = { - "file": audioFile, - "model": "whisper-1" - } - - const formData = new FormData(); - formData.append('file', audioFile, 'audio.ogg'); - formData.append('model', 'whisper-1'); - - - const requestOptions = { - method: "POST", - headers: { - "Authorization": `Bearer ${transcriptKey}`, - - }, - body: formData - }; - - let result = await fetch(transcriptUrl, requestOptions).then(r => r.json()) - return result; - } -} - - -export default class AudioRecorder { - constructor() { - this.mediaRecorder = null; - this.audioChunks = []; - this.stream = null; - this.lastAudioUrl = null; - this.lastBlob = null; - } - - async init() { - this.stream = await navigator.mediaDevices.getUserMedia({ audio: true }); - this.mediaRecorder = new MediaRecorder(this.stream); - this.setupListeners(); - } - - setupListeners() { - this.mediaRecorder.addEventListener("dataavailable", event => { - this.audioChunks.push(event.data); - }); - - this.mediaRecorder.addEventListener("stop", () => { - const audioBlob = new Blob(this.audioChunks); - this.lastBlob = audioBlob; - if (this.lastAudioUrl) { - // Revoke the old URL to avoid memory leaks - URL.revokeObjectURL(this.lastAudioUrl); - } - this.lastAudioUrl = URL.createObjectURL(audioBlob); - this.cleanup(); // Cleanup the audio chunks for the next recording - - - this.stopRecordingResolve(this.lastBlob) - - }); - } - - startRecording() { - if (this.mediaRecorder && this.mediaRecorder.state === "inactive") { - this.audioChunks = []; // Clear previous recordings - this.mediaRecorder.start(); - } - } - - - stopRecording() { - if (this.mediaRecorder && this.mediaRecorder.state === "recording") { - this.mediaRecorder.stop(); - return new Promise(resolve => { - this.stopRecordingResolve = resolve - }) - } +export default class OpenaiAudioChat extends Morph { + + static get current() { + return CurrentChat } - - play() { - if (this.lastAudioUrl) { - const audio = new Audio(this.lastAudioUrl); - audio.play(); + + + get responses() { return this.get("#responses")} + get recordButton() { return this.get("#recordButton")} + get resetButton() { return this.get("#resetButton")} + get voiceBox() { return this.get("#voiceBox")} + get modelBox() { return this.get("#modelBox")} + get textInput() { return this.get("#textInput")} + + + set isRecording(bool) { + if (bool) { + this.classList.add("recording") + } else { + this.classList.remove("recording") } } - cleanup() { - if (this.stream) { - this.stream.getTracks().forEach(track => track.stop()); - } - this.audioChunks = []; + get isRecording() { + return this.classList.contains("recording") } -} -/*MD # OpenAI Text-to-Speech Tools - - - -MD*/ - -export default class OpenaiAudioChat extends Morph { + async initialize() { - this.windowTitle = "OpenaiAudioChat"; - this.registerButtons() - lively.html.registerKeys(this); // automatically installs handler for some methods - - + this.windowTitle = "OpenAI Audio Chat"; this.audioRecorder = new AudioRecorder(); - this.conversation = [{ role: 'system', content: 'Play the role of an AI that speaks out loud with the user. He also speaks to you. what you get in text he spoke.' - }]; - - + }] this.setupUI() + lively.ensureID(this) + } + + connectedCallback() { + lively.notify("connectedCallback") + + lively.removeEventListener(lively.ensureID(this), document.documentElement) + lively.addEventListener(lively.ensureID(this), document.documentElement, "keydown", evt => this.onGlobalKeyDown(evt)) + + } + + disconnectedCallback() { + lively.notify("disconnectedCallback") + lively.removeEventListener(lively.ensureID(this), document.documentElement) + if (CurrentChat === this) CurrentChat = null; + } + + + onGlobalKeyDown(evt) { + if (evt.key === "F4" && !this.isRecording && !CurrentChat && lively.isInBody(this)) { + CurrentChat = this + lively.addEventListener(lively.ensureID(this), document.documentElement, "keyup", evt => this.onGlobalKeyUp(evt)) + + + lively.showElement(this) + this.startRecording() + } + } + + onGlobalKeyUp(evt) { + if (evt.key === "F4" && this.isRecording) { + lively.removeEventListener(lively.ensureID(this), document.documentElement, "keyup") + lively.warn("stop recording") + this.stopRecording() + CurrentChat = null + } } resetConversation() { this.conversation = [{ role: 'system', content: 'Play the role of an AI that speaks out loud with the user. He also speaks to you. what you get in text he spoke.' - }]; - + }] this.responses.innerHTML = '' } + startRecording() { + this.isRecording = true + this.audioRecorder.startRecording() + } + async stopRecording() { + if (!this.isRecording) return; + this.isRecording = false + var blob = await this.audioRecorder.stopRecording() + debugger + const text = await Speech.transcript(blob) + this.textInput.value = this.textInput.value + text.text + this.audioRecorder.init() + this.chat(this.textInput.value) + } + async setupUI() { - - this.audioRecorder.init(); - - this.recordButton = - - - this.responses = -
        ; - - this.resetButton = - this.textInput = - - ; - - this.voiceBox = await ( - ); - this.modelBox = await ( - ); - - //TEMP CODEs - + this.audioRecorder.init() this.resetButton.addEventListener("mousedown", () => this.resetConversation() ) - this.recordButton.addEventListener("mousedown", () => this.audioRecorder.startRecording()) - this.recordButton.addEventListener("mouseup", async () => { - var blob = await this.audioRecorder.stopRecording(); - const text = await Speech.transcript(blob) - this.textInput.value = this.textInput.value + text.text; - this.audioRecorder.init() - 1 this.chat(this.textInput.value); - }) + this.recordButton.addEventListener("mousedown", () => this.startRecording()) + this.recordButton.addEventListener("mouseup", () => this.stopRecording() ) - this.textInput.addEventListener("keydown", (event) => { - if (event.keyCode === 13) { - this.chat(this.textInput.value); + this.textInput.addEventListener("keydown", evt => { + if (evt.key == "Enter" && !evt.shiftKey) { + this.chat(this.textInput.value) } - }); - + }) + //comboboxes - this.voiceBox.setOptions(["alloy", "echo", "fable", "onyx", "nova", "shimmer"]) + this.voiceBox.setOptions(["alloy", "echo", "fable", "onyx", "nova", "shimmer", "silent"]) + this.voiceBox.value="shimmer" this.modelBox.setOptions(["gpt-4o", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"]) - - var ui = - -
        - {this.responses} - {this.textInput} - {this.recordButton} -
        - {this.resetButton} - {this.voiceBox} - {this.modelBox} -
        -
        - - this.get("#pane").innerHMTML = "" - this.get("#pane").appendChild(ui) + this.modelBox.value="gpt-3.5-turbo" } - //respons to the question + get isSilent() { + return this.voiceBox.value == "silent" + } + + // response to the question async chat(text) { const key = await OpenAI.ensureSubscriptionKey() @@ -243,9 +149,8 @@ export default class OpenaiAudioChat extends Morph { "stream": false, "stop": "VANILLA", "messages": this.conversation, - }; - - + } + const requestOptions = { method: "POST", headers: { @@ -253,22 +158,18 @@ export default class OpenaiAudioChat extends Morph { "Authorization": `Bearer ${key}` }, body: JSON.stringify(prompt) - }; - - + } let result = await fetch(url, requestOptions).then(r => r.json()) this.conversation.push({ "role": "system", "content": result.choices[0].message.content }) - this.responses.appendChild(
      • You
      • ); - this.responses.appendChild(
      • {text}
      • ); + this.responses.appendChild(
      • You
      • ) + this.responses.appendChild(
      • {text}
      • ) - this.responses.appendChild(
      • AI
      • ); - this.responses.appendChild(
      • {result.choices[0].message.content}
      • ); + this.responses.appendChild(
      • AI
      • ) + this.responses.appendChild(
      • {result.choices[0].message.content}
      • ) // Generate speech for the user message - Speech.playSpeech(result.choices[0].message.content, this.voiceBox.value); - - + if (!this.isSilent) Speech.playSpeech(result.choices[0].message.content, this.voiceBox.value) } } From c7483076e9bd0f45a9ba48cdeb398585741bff86 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Tue, 21 May 2024 18:25:17 +0200 Subject: [PATCH 04/47] made ai audio chat use streaming SQUASHED: AUTO-COMMIT-src-client-openai.js,AUTO-COMMIT-src-components-tools-openai-audio-chat.html,AUTO-COMMIT-src-components-tools-openai-audio-chat.js, --- src/client/openai.js | 64 +++++++++++++++++++++ src/components/tools/openai-audio-chat.html | 4 +- src/components/tools/openai-audio-chat.js | 4 +- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/client/openai.js b/src/client/openai.js index 19157f703..49d8dc42a 100644 --- a/src/client/openai.js +++ b/src/client/openai.js @@ -24,6 +24,70 @@ export default class OpenAI { export class Speech { + static playSpeechStreaming(text, voice="alloy", quality="tts-1", audio=new Audio()) { + const mediaSource = new MediaSource(); + audio.controls = true; + audio.src = URL.createObjectURL(mediaSource); + + mediaSource.addEventListener('sourceopen', () => { + console.log("sourceopen") + const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg'); // Use the appropriate MIME type + + // Fetch the data and append it to the source buffer + this.fetchDataAndAppend(mediaSource, sourceBuffer, text, voice, quality); + }); + + audio.play() + + return audio; + } + + // This function fetches audio data using POST and appends chunks to the source buffer. + static async fetchDataAndAppend(mediaSource, sourceBuffer, text, voice, quality) { + let apiKey = await OpenAI.ensureSubscriptionKey() + const url = "https://api.openai.com/v1/audio/speech"; + + let prompt = { + "model": quality, + "input": text, + "voice": voice + } + + + const requestOptions = { + method: "POST", + headers: { + "Content-Type": "application/json", + "Authorization": `Bearer ${apiKey}` + }, + body: JSON.stringify(prompt) + }; + + + const response = await fetch(url, requestOptions) + const reader = response.body.getReader(); + + function process({ done, value }) { + if (done) { + mediaSource.endOfStream(); + return; + } + if (sourceBuffer.updating) { + // If buffer is still updating, wait before appending more data + setTimeout(() => reader.read().then(process), 100); + } else { + sourceBuffer.appendBuffer(value); + reader.read().then(process); + } + } + + reader.read().then(process).catch(error => { + console.error('Error fetching or processing data:', error); + mediaSource.endOfStream('network'); // Signal an error in fetching stream + }); + } + + static async playSpeech(text, voice) { let speechKey = await OpenAI.ensureSubscriptionKey() const speechUrl = "https://api.openai.com/v1/audio/speech"; diff --git a/src/components/tools/openai-audio-chat.html b/src/components/tools/openai-audio-chat.html index 7fd2a8c12..fbcfafd5d 100644 --- a/src/components/tools/openai-audio-chat.html +++ b/src/components/tools/openai-audio-chat.html @@ -7,7 +7,7 @@ flex: 1; } #pane { - width: 100%; + width: 100%; height: 100%; display: flex; flex-direction: column; @@ -52,7 +52,6 @@ } #buttonBar { width: 100%; - height: 40px; border: 1px solid gray; position: absolute; top: 0px; @@ -79,6 +78,7 @@ +
        diff --git a/src/components/tools/openai-audio-chat.js b/src/components/tools/openai-audio-chat.js index 39dca13c2..7956bbd15 100644 --- a/src/components/tools/openai-audio-chat.js +++ b/src/components/tools/openai-audio-chat.js @@ -63,6 +63,7 @@ export default class OpenaiAudioChat extends Morph { onGlobalKeyDown(evt) { + // #KeyboardShortcut Hold-F4 to use push to talk if (evt.key === "F4" && !this.isRecording && !CurrentChat && lively.isInBody(this)) { CurrentChat = this lively.addEventListener(lively.ensureID(this), document.documentElement, "keyup", evt => this.onGlobalKeyUp(evt)) @@ -170,6 +171,7 @@ export default class OpenaiAudioChat extends Morph { this.responses.appendChild(
      • {result.choices[0].message.content}
      • ) // Generate speech for the user message - if (!this.isSilent) Speech.playSpeech(result.choices[0].message.content, this.voiceBox.value) + // if (!this.isSilent) Speech.playSpeech(result.choices[0].message.content, this.voiceBox.value) + if (!this.isSilent) Speech.playSpeechStreaming(result.choices[0].message.content, this.voiceBox.value, "tts-1", this.get("#player")) } } From 2565593ede8755349eb37883a6308a675ff5d4bf Mon Sep 17 00:00:00 2001 From: onsetsu Date: Wed, 22 May 2024 00:13:02 +0200 Subject: [PATCH 05/47] started ultimate lively4 aexpr implementation SQUASHED: AUTO-COMMIT-README.md,AUTO-COMMIT-src-client-reactive-active-expression-modal-active-expression-modal.js,AUTO-COMMIT-src-client-reactive-babel-plugin-active-expression-modal-active-expression-modal.js,AUTO-COMMIT-src-client-reactive-babel-plugin-active-expression-modal-babel-plugin-active-expression-modal.js,AUTO-COMMIT-src-client-reactive-babel-plugin-active-expression-modal-babel-plugin-active-expression-modal.js.l4a,AUTO-COMMIT-src-client-reactive-babel-plugin-active-expression-modal-babel-plugin-active-expression-modal.workspace,AUTO-COMMIT-src-client-reactive-babel-plugin-active-expression-modal-example-source.js,AUTO-COMMIT-src-client-reactive-babel-plugin-active-expression-modal-new-implementation-test-plugin.js,AUTO-COMMIT-src-client-reactive-babel-plugin-active-expression-modal-new-implementation-test-plugin.workspace,AUTO-COMMIT-src-client-reactive-new-rewriting-implementation.md,AUTO-COMMIT-src-client-reactive-test-active-expression-modal-simple.spec.js, --- README.md | 2 +- .../active-expression-modal.js | 6 + .../babel-plugin-active-expression-modal.js | 131 ++++++++++++++++++ ...l-plugin-active-expression-modal.workspace | 23 +++ .../example-source.js | 9 ++ .../reactive/new-rewriting-implementation.md | 16 +++ .../active-expression-modal/simple.spec.js | 22 +++ 7 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 src/client/reactive/active-expression-modal/active-expression-modal.js create mode 100644 src/client/reactive/babel-plugin-active-expression-modal/babel-plugin-active-expression-modal.js create mode 100644 src/client/reactive/babel-plugin-active-expression-modal/babel-plugin-active-expression-modal.workspace create mode 100644 src/client/reactive/babel-plugin-active-expression-modal/example-source.js create mode 100644 src/client/reactive/test/active-expression-modal/simple.spec.js diff --git a/README.md b/README.md index 2a7878126..7f4ec6d6c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The Lively4 server and GitHub sync tools can check out arbitrary projects, such ## Authors / Contributors -- [Sofware Architecture Group](https://www.hpi.uni-potsdam.de/hirschfeld/), [Hasso Plattner Institute](https://www.hpi.de), 2015-2021 [MIT LICENSE](LICENSE) +- [Sofware Architecture Group](https://www.hpi.uni-potsdam.de/hirschfeld/), [Hasso Plattner Institute](https://www.hpi.de), 2015-2024 [MIT LICENSE](LICENSE) - Jens Lincke, Stefan Ramson, Tim Felgentreff, Fabio Niephaus, Robert Hirschfeld, Marcel Taeumel - Seminars r`hOVsc6Kb^#$g(<0oM?#NQ!*MS`%d< zBDlGD+!DC?$HG(u&}#-8ftZIuc?Xof#AzQ1nX?#hwSip%%l*?Q?NPshYDn6_Zz@5P z{iL|cy&-qXzw?Lp7qxy>Ru8c8gtj_4A#0*$K)`7PA#Dv!%zH7qKH$IrS_w(!@>OCt zIYk}{p*SHWPzJ(XXJ=GiiR z?%FSN%QVH`Lgy*g=AzTVv^A0fVkhY@wi08hk4A%%*2RV7^3wHqEG_E;MTv8+gS%C{ zHCdY4Zv2e*O3t3@ycHBE5gViYz61<0Xl_B0(f_{CZvOI*m)39SOxuH(O0jjLw^kwg zKL295z858&W$_MkPhLyyn{XHfDo1;KFym=gNMFs2wYO*~vb5=pA>i_~XJDOJuRQg7KW7b@K@XX`aH2gcX@ve;5CrhX8VQ1{^{? zo%PW>HHilE4uaG-6o`Qu?x6v6ZWOT_#ok^b2ikKW)+Z{$Ftq0}vn`K4j0wy!A7}cZ zNaTItXyQ}*Y^uk%(ppm&vz4* z^M+vr^k%{-BtSr+I$Ky6xH3RVPNWTL%@)_;`Vw&8J)hu)cM#V*#f&Z`v+e z7})-n@JP!EB{_MSF+fP<&FErhw+!BIu31x|l9^LP7^}$8K(fMf?hdNo;t~>VV9e~j zQsQ(QXq!GhK9C?^Db~-p3(pfh1c>F6Ox8s;@HmBn;RoM~Dhd9pC>lQM-TjvU{_l_A zF@*I4m*05ue`bmIlA<0Y)2||@|Ic6k^Fe#zz(T*wb^1jAKYo1s2@5>>{jP7p2l+GgzIvB27*|ATW^&;=Sg>># z%_W4@BZKO5AV#z(c{wR3aDsziWIQ;7?e7m!S{?NZ$-yRs)HCc77zu;f5BL2agAN7q z=H`qTTPb=2Bl>)iR~Y_D(jU*2wFgxQbI#Wav*XMS3=FKSvZ;Dys2TmtjY>_7jg2)l z`sxi=XldHW%Rj~9Urj4H=?c_cz%!FsD3!Z*%#}a7lM(aO=I^kUn~4jPk1dl;1bV?d zepH`EL1}&Sy;#2HW%@f?+lEi^;4h5F5Z8DoFF+rbFP&Ue@)S@Fz))yY$mG5 zb%hF#dE0`4Q$IdOSzBG_xEDDpaNVzwjn? z4D?~Q6Dev%UbZ9BSIREG-Q=>&ZFAyjF!Bon^VQ;YJkM$wu8nLc;R5F}51%EPMj250j3uCA^C+dZ+D1-UC^F`$ox z0YW8@wY2(S`iOh0z3Cu{40b-=L82cWIj)d2yV^2)w{GbAb&q)}ZU ze}s?EQZA5#Hg@YU^O(w|_J67D_;wlp@PBa?4clA;Lrq2LL5U^}2@z;QuTxPd!-OdR zWehE~fAo7lx3-ibT5%%(WvnaV09ORK@{kjp@bK#L-+SXN%NeMRZ*;#@wpZ;F2im_0 zho-7lCx|vU@HN&!ui4OWMG>gxfb4=Y&(rnhwA=`AsjaN^s)3SUR#pbRo`@VzqFU0@ z1IWX`<`P)uaZuPstFpo$`0gqLe-|If0U(S*aq)Rljr3S(-=l0ZtEv(l9e~67_iU;y zIuwpGfT18o-5M*VoB{S9sLFYf<5&%yC@0*~QkH5CQ{d#n?+<+W!u9e!n1t`*$=Idp z7aL?tW9Pzg1;%joTkiKJt8Pq=IHxpznVR$uY1pDO`}{EwI4?<87dAFF97X!Kygl+L zV!Gj#*wScLWW}W-W?QlFC#&1qLSU&cyJrL*fn%1(K|(7``~pP?BYu2fjde)KU!d~? ze;|!7z~rj+JH$Cq`Qbe&M}vPa@Ly)?_^$|`ac@adMbUCvg;%uzX&&G$csDD9ESF0i z;Tl~0kVMAEv24}XHJ6E$s20*B_2Zj?DYF>!wwrhE2Z(h#I)t}*j1D2wDjIVkA^cvf z3If>5O0F095z1g)h+;c(CR-1&`YvPlVrSSayrn%iSTDsd1FLXgvX2s~1S#P%dhlk%F7o0tu$iFhAqh!+w3UnX6VxE^lK?+|Enn=#1jrTgG6ai< zD%r@(!=WT_TTy=<*c$l=O{}xqT%!u|(>w3)65sME0G=$ko0~4Y0=kj$#}Du-AapbH zzR)$|_!krV{l5u8epT#PE!Q`H;>-^2}4x;N`9^5Q50=S2=wUI6+)5b!kO*2BU?Ok}T^ zUqZr$;v-CGv!~reYSD`W?G~syC>+j7d(hufc(1_bU>@M@b+JF-=8e92d=J3L>QGt-YjHhB&59{Sr`2V?(Yd%*c!z_edm~Ez&uX`z6I_2_m3-l&)V~ z`1X{V-Sq>gCrH7b0KgnAv9T{8x)QXg(ZqY_v8sL|kb-UUD(Kf&fUx$b9?mzK8XC55 zGY*cLY%%!1Q~jjUOF>(&`a-@oQ?{LVGftK<6Y}MpO-i z2Kgj&%F%$d0dsACA;9ljBqIHm%zgUTMz?R5)=mTaygB$%y0S0ZDe1QQB}2)(INKJ< zcboGlkK#(3FIs8Ig86V zhu-X4z^)|^AYcI<5X#RUn9B3>R(I~`9$(7sj+)hF^e_ z5RyHh>A>WJXOpoo)fbwbXJ=<8iol!>OHq)KIZwQ5WoYOQAe%WKY6b=fPbpFEFJIuK z1uG_3*QY)9EiEl@DzO`d{CfY&CEPcD7+W#C+!toe=<9<404$q-8UH}L4+N$U9tZNu zxZZbWzl_|48+Si58{to&er2X6CUDSnzHS>ZCP2~3LO`^FKp^)0FJKzf61~&@(v$Gd zW0vBuk5DdxP|BF|P0q|nKU|P4y9drpH8k*;&d<&sEHpR3fx@B+9OIR~Hdx6jCI0K8 zwp`8m?fu6kts&){Evv|xj`3e3;N=DKZoT}VMzyS&0v%9kc={!6Pki2=D zuCnnq1ONZ|m;Z9xU&7uRUxx$Xb@STHYpbW(04b@EjTl`u8Lcjd#|l;(K)3OiWqhU% zYE7MMz-nV@>x;Ji+iwsIje7XkPJ82w)*jQxjuIZ7d|0n(3(;8Ev`YHrR6~Db*&1y*5 zNXx>~9j)EixXW`Tx2?6jkIn6;$b!f3^7{G{m~2;e4syTw;#;9aUXKZ~ttI-+9Z^!s4KmFAit3)XzFkX(e5arWaC{$xmK z5Quc*iH9C9iSCKw3%#ob$snvfSRP=)dj{rA_h&amHq6NJreOQIRK+Qf@x5dG(eJBL1{z6>V|aC7 z&d@K|XXFT=Xgm?inK|0e@84hNIl;h@$EA5qO)u}Nj&noOl5_xv1Op8Wrj+kK5148wv zmWkF5l}&hRk#B)!YE!E7Zy4pgeCH3O48T<<3k`Vkzofm&7+GcorG#ltK}RDRXf%h> zbCk+&#h2IYJL@(;{o?C;;77i(k9Y>%F&fr!pDiHG+t@t3JOMqiuyv~VCCm>U)vle{ zhZPbgwERPVri7@vc+_DQPOlFxSG+*S2P9-J5gc4x6kD_jM?XulgKZWtU){&H2^-sh zQ+xf5+z^$HLD+lD#e}iX=r>RM9h(9_s)(WaSNpLuxaQ^BPw)aYQ6a73U%$5!t6)bz<3v~(HT z|9C}eH|f+65u;@b?kL*A{8d4GI`I{I0zt(PNC~-~AkPZ|EvFAzw{s46hUA_nXBAN2 zovj0G651zPxTkB?G6OYtuZ;fa`PsBtZ8l>{-An1-5li`FMIAL~8A6&ep3BZe1mlUm zWo+&6X)WVsc4jD=&L4$TEcyi}3K~V9S!o#=?xH1L30rS4T7~7pPH-uWIuH}R4Sh&z zIfp90V_)6jn8WzX(1eH5TtT@Zx;1c%HpZK;d;hD)C+UzsvJt}23Xbhtr8+Nd9f!b0 z!)FdtzQz_7-gct5gav8+BhQH68BR{a+M4&4Zh@H}P#x}meILcS#8O|Pgis5_m^W-$ zgZh7rtTp6s@D~4sJWlA4ApP8njqe0AsMw5kxScqzv{R49!CwY>Z&7U+gfv>QF?HkA z-8uxDV$y5D<^f7W_8r|rjJ@3eT)T({uI@#nF?}}a`@BqqTR!zeK-51m54(8C(hc3t z!s{RF5V~G_%Ss%PIm54$Yb-;H-gOVE-I|Doato+nK~Q=A(~H5sR;KOr8_oomcR_%* zkLv3S+_Y347LZq6%SJg&96DC5ez=sN5fvAhyZsT zh2L{t@T=WQDFjdIyzUW3B0W@5m>jT-x=wGPvj`x|*ceM1G#_yVFduZ3jpWn8i{C4X&jQF?WeI$x} z15H(DmoN>%tiY_#9>5d-Bb(g+6QqN_>HOwZp%l}aT{?{g%Rky%m+%<`)2B`oV(8}v zx`;D{9U_lXu~oaP`L^zm&(@J|bR6ME4#g-RW&g%*?7qcshzTr}GW^Iuw^houPK}Ni zyfX)Ni2U7VE5ja2p_I9t1B^Pvn-P&X49z6#n<3H-8An-HW&Q}PA1G!=zW~h}yxjn; z0+&pc%QRB#>q@cuGutU9Xqi32<3Mn_eWrEfek)R0wOC+voZ%0_%=%5_c*2;0H&z+C z>F8)Eo}maRHyn179ahE#oYn1gd7SRu`%qUm`a)5^vPo8Buvz0e=~=*A8(~amX2xST z%A^4dPSB6C@N5VwU%(L90l$@f5hDv~c5@y19=4XkKUfIh|Dw27C1|(fp!9}jq^p^54p4;r86J0 zJiDH`A&~tb50eV^80KIN^+3MNx3_rB`oBfjKJ|}10*|0VtA{%Tg<`O9@?S(GCWcOE zHyPuiR~t{A#CA0rS;Tne;kHsv=}|YLO@=4)7i#eo42GKEyuaJ(m?XU^x|1v8eyiQt z$AW>e$gg-PolQ82B#_}fUjK-ZTp6?@bnX*hc>QFZ23FKaAYRZLl|_bwzkg5q6gCO3 z#A$6(Z}gYoxD*RN)rtXBqSyW%%>MrQOkyF|!2HxGr^#B&bf3iwN%Pc|lYDuf$O1WJ z`;!UZyJYejvHY;B3|^VP0JnlfhvCE27zUL!Wv*Jg_m!HMrg@%6*YNp1q2DpLOaHJZ z&5<=e8&SN6*}e~u&J+Fej^8zwwAU~Dxn3o-hg-x@oW;b5$|vk4*%ExqPRqOCKM>zp zY+Hm{3y4;qcq@m^@P-}`bY{l^A%2Zv?^bioKtCNF-RAZ-!p&{A(TA5re<`%S{jHB! zi6=j2vsI3nOYcuU;p;;*;$6DNgqE z!ph2c-}u#hLsP@w+p}EA+5Mk@U|J<)T}bgqT(IPIT$0iY!eqlBI;{Iw^E#)ITE`{o zMBOC>h5ST;1(p>W(VZ!VQ7o)UZ-_$FT*Ip83ZvV0Qhb@NRiSI}7A8pR-{6-2oINAp zgJdI0P0@X4F&cC|(fXU-o5tK8%1U5=3j1xIw0}o3W{%V_R!|?*iEkHb0Owm z=R^K$gs*3i8jJ77e5Ho$zlUk~4Ox-1i&_RNzdhOO8|eDnX;{xo^~o!eWR~Dz;;6;e zsCLttfZWZBC}S;X@kpa_y-e@JBDm#98@MFnLGxx9yNWT3hkKi~9gqn^=463uYrZ)9 zJaiS`tl-c<+9CJYUg3d`PKPsI0(B8hEk+o zX|jL+@dNsO*pC&sYq5EY#8iwB7hG7hVtbYd3tk43Q8iLiN-{d>UFW?gX0u9$Jzf(e z7#yZ84N{74>nun(dDgZMFf>W;0IbF{W*4DE!Q-thS^9y{U>Uc)P^Bs9v1>@#)w`02 zP(1atZ!>koebEk^ShVvE)qonzIkF{o>*evF8IAFnIn(Zh9X&UjCk?#{LCy5yhX9mhOZT#WSgvCasFo^1o+(iILd3_q+6cg5X0@B?nC5?o1gHqBUut@2U5q5Ir=?ooqmQGDUCKQF0paUs`*#jmy4Dyp$ zWlrxANi=*r{{kI;$+$GCbgJNP`Argo8_DA0`7<3V4NpIH)rq6f8kF|u1mtwOKY!s^ zPP{kiJ#)4OvfN40;`@;}LfYuW+4>90P!|*7;`42j`dGoczGqO;$S+>=d#ZAlnrR|c3v52Q5 zs6{6Gvvg+mA`wFx^hxcio)elpNsMGZrs@rUZ+ectvYNvTu7tQG$^CWA6#0#u#0Z@; z44JYQ^6GkzRL+Q0GCgI@7^x5kWNoFCo*Lfo@|2IMc50K*y#xsu^j_nQF$JKc93jXI zxWQT?{`F`jM_Fa16Vym>lpkDX-oh@Buq)7FMV3CC45GtWSCgFIFsm?&mt7f=6i?~1 z@XKw#YT$5Hf@DzpE(W58RN~{f&cMUYo9~Q_QPv-pEiH4UUdzvCx}Nj{eNUwpgG(e- z9fP#J@h25Nux{2EDrB*B4LuV~s=1GMUt^(M#cKXmkz-W(v=y`g$Okwy z)NOEs;_m0IvzlQkHhDpt)scY0>h_T-(D;~yvD3;%SMkLuel;H$R(22{@r_cWmL^t>4F=Zm zas)p0s140@LCuVE2t*OD$@qX>o5zHbg!1Hh0bD(*aK;pjWb~vmq2YDHc8$!8c@-yH z?_AO=7~&e+O{HoEB71r1n`FZGDz6Pt)oSKQDWh*zm~5h6>PQ=q)gZGI*B^-*34Ein zlcCwfe(n7|)KZmWhM=w<<~E(PNOozzUtQAYj2hbO`*v4q5pv}VMRzw#QWXeA7kwhJ z7Ik+Gk%z`5|M(lm4`?D?p@l?v^i!5TEpf`q0&D-T`$w6a{Z zY8$v{e|W}UyEV5wPr%$Q9OOPtyE8(Rful4~Ia95XKg?R*G=htqm!BIDuaR^*PF0{W z`WT|?vPWbaEan)J*`aAX6fLRbUOUf&yDc6PE4Wfhg|1)_mGjN)=GbUm)b;L9-}8v9 zu?n>rZYH5_WmMzyi6B0$h(R6|cqo{7m2Oe@ahZkRDN6prI1JF+{CvznFufY>b-XcJo^s+Yk%^nIkt^@cwn-T1ie4O;6<}J&53HliVS49sOFBbfrK6 zlN))LG_;KauGwvjKcs)EPhCfnq}6ArhU$ayqpYPX``E=Sj0%H!n9EF_9Fu5wI7NwY zVJ0Tq&kXH-Hg>*jSBa}Lqs)i|r`h%O0>di85lJpD5vsPwUn}BniFy!l966O;{n7X{ zkcR&E;iSoELps2X&HiV%jXTqB%-j?{-jh3~rMUF8rUb{GTG-77XdJ-p%6V^Ygicl= zhglw)$IEpo;*sc|Ci~tHeZk^9s#b*<% zPU{sqAKG*ri0T}`DgfD`0HuXrU%XQ?V%Gsr%uIJ9^ni%dhl~-Y&_=g(bcLmLDT!;K z{R-!+rU1zMMHJ557!Pki-o2Ru!>NZU!QM_s9I*$ki`?u8KWw>p_SGC*OsysVSDlMN z*G1JSwgc$xg|rQ{yB<_FX3VR}_Yo_i$tM+uJ{0xJw25CUc(GA`k)qc0JW`S*T3%ykvbt*P?QHfiIg_>XVb{5- z2xq)hoDLc)Re|W!L#K_3M1GAEQ+R5>o<(|Z(o*L%@cGna05?z@xlOx`FmOKcFQNY0 zKj}0mK`rmIMXzV*rekdUy18r_hL8}v47uQ^%QU~kxe7;Z$*JD#L~fD_84ndgiT*>; zOdaot#>}mg_7te>Um9GmGO-1k_tQ=91l?>_5v%Qx&_^y7v~wgPb8qOru6L36-+lWj zUxn01X|28 zW^yO0!zP1F|v|p16{qeLn(nPoy>!&LU#1x^J|X~J@L2wb|Q|;=Bu!&zG8JL-$@|?*G#nN zYxQ3%YihJa9Z&zdCcMKB(!8uOS^l8t+E0AnPmbB1X?o-+Vc3m^=5GU^()LrKD{QRt!G`V$@5 za^ldovSID7&vWFH?9et4{aICa$1k0I>xz(8tu=@quqx2U%nPGn#Sh*LZy>!SJeBwN zJRmC(mo$)>tt(H0GC*h9=>t&FH9>%2N8g<}9FQq&65A;!yjCDJVDf^O1L7U&mwQw2JA4lsd}FF2#_XS zlCpPeFO0%BG``etM+8Si!oTYZ2e+n7pnb-$Hh72C)>XaQ2UDP)_A*E}9A=-%YgYuT zGA9DO?nXlNlQ}TSvrc&L(|Q9@4;Drw+OCrWL$TW|}13HVb)w6CckV*TcqU zZScu2zF6x^ADt?_=7O+>8B*%Jw7t|7o>~!izsr9lY?@;jYa??J-cm5z4SX`dlZH%G zT1|M~-?G=&fq`|aw_su)zktASZA|@>1Vs8>Cb)UfY7*ZEYP@dabsPZ0saI9-&G}VkH%gKRJ zH^xkOyVy(r03MS%*MR0P;sWM z4dpwA9*4ij&TwXa>74w^$A%(0-HkhMpBvlm-+8Jpb2H(fafn%-ENSeXTM2qfy+Wkz z>}^8~!8dxnAe4T=U*YzbYm0&O5d$B!VA2TejVUm>`wgw!bIp&ndN;T6Nh0JHDrWfc zX_>;Q9Upn2@_#jA#&n_!DRoBbXkaad;`@8Zu`}ShK2$hm=twhUaS0;ARD!MZf3%2Eg{h! z&me2|W-9+CP5v+>%iHxy`~Ja3=UR4g=fIWye;Y=*C4T@Wp7Uk;SRC-Oas;g@ef&Z; z#v|_>l56bi^z;TqPlpE>+)#(an+!gVeJiC3@o~*SjlE4qU59V>??@@bH4t4=k>t@! z^q)np|1(eeMCyYhX+X z90wTFjgMc(#0h(Ed`^AO5XcoUJo`-Z8~U!3X)8*}q}<&)&H?CUhzLf3BtJAHz9Iip zNbw;G0*I*N6BFPlr1(@Zm}o}(tV@?lQBkq)UZ)wj9>u~Ti%G|NE&e5+p=p?d_G}QV zi&D+jgbYT_t{h?Qf2Mt%3>5dT$YQiBr)hrFlcQS{gIV++p~PI3r6MbF|EEtcX_H64 zkC?FV09tym7iy`$Ia$H-2}(1VB||9<0*a2SOoiW6Fm-PVTju;x8@Rc-1s$Jq1god>ZQG7pmWMyUL#cLqiU~x4iso0y!)7#Wb;elV6hRHx``{%hqUSS`O=jL z(d^KSzOV(K!x95H!8~0I+ZR=#alcWFK5a;5AB&a}&UCb~d48>$DOo=mVv;!>czc{! z8WXmA;7Au*PR*QpL!;5zN=<$c8aLjOM5-@+N^f17z3) zG%-%e!3?4N332R6poWP0p8~v3>c}OrY4YSkpnO>VKo^b-9UX<&oB%D}D1}>9!^Nr1 z6rxw}^bls&aK4A&pI6h6P0^U3E1p8|BVm$?kA}83lRP=Nh-Ea204o$6l;K`{e|xnd zTwjFRGtUD;9e`+ZNxNWdj*TuwMRb5y3YUCxi`mCY&xgtu)0cLZIwv*HORC_ODrhv!E6STqwP^uu_WTimQ;hcj#N`T zTWL?)yZa$0=%McAnLOzi0L+(Z4SV|VyLSv=)4`Evi^opJS2Qd!fL+uPu-$6%42p>P zrNDJLxJqE6=DK&u2e@IiwMlUp0cV9Y_R{}y0XEGzGhc;`ddWJa=SwUB(VyVE&Sw_VV6KU|J+ zWMrhHFpA@et84X!8r)Bi`wk7!3XQ9b?2PSvNaKT7s;g#fQ`t-9PAfR=L;H{}0Q3um zBnx+&;1%aRxxvi4tMetUH_}0P;l!LMAE(fR+}I~j8jIg0v#DH4w$$ee$gg8>#p@9c zs&#n5b&Z{yyNHd4t`mdU?O36*TVOq(rRnJ{L?w z`97ph^q*B7;$wH|e##tB1)$Uf8%IJiAmqbTQ-oT!NpRg5P55&L>`_@bI(Wu41xT`R;UK}tO#pP}-%4o#NTryEe#z<|HLGnFgO7T(Y9LLd>U z${=tmfM?`D!7P98k658dJlvJEZ9mM7%uZPuHw5PHPrz^%uq`;W6CE~mEBY*4pjASz zx75cbtE2vY>8C1&JhZoth6u z6u(j?dW-m<)=06xi4G&p5s8uaFGGnhr7@_F3O821zeI4Pd(0TEUwCsx= zo#L4#+qZ>6)GQBYNsL9&GSaxw<%F9OvKsziG>Yjr1_pCzdq&S6M z0?oGLV6?Kj4Cp-c(cL@nyd|y=^!3r*ROT(wkgl4anZcU=1U{*6ADi%|X-(tWrYOBh zCQ}KGQ2BoJCDc--YLQG>&){{JX^rO6Uk_c~fPj0K4Ipw4lBqOU?w%jrNj)5j^&E3! zPF&yED1H69`(n|6;(A-AE4g*nBOj=7bqetld6ZHZAxMT5sg#fUv=e?<;`)095`dAJ*| zvr1`EODqel0gQz^ONVU{&f%t)MjsjbVG*?HceXtHU4&nZIc4dW(<@t#DOW_-_YXgv znE(welJ>5*tK_NN(CDE?m8zUUdAzmG!+Clic=;_0yrHr*fnUzQ-GN@?GvteVFomg@ z@SBgXE#D&-Fm7-utgrWiM*zGv)i&Rg`TLDl7<>>x^6&rh;XToj=AUnmyq*jr_%WP- zem*dq>Shc4XW?W~TlCR7{B06Jpd`RyM{ zrH1?u&)$#jd7lL`y$#qyka1L+efgxcpZGSCm#;AZ?0FV}vn=$by>UUYvP7D|0aX(} zLg91t!$2C7z-ru+8w=p5pW4Gx{PX3_f9U(SUSfcyF;K@^!1HfIp2=Jx%yuh69Nv9m zdJJ<==Gd0+{cw0lIJmaDFar@ll>pfiFGNo#k8)k5!=ei~88BHA?8ltFESdU0e(*7-c3Yn~ zJ;8mwl#bt&g#A*1L0-YmLdOiLoh9WnF1MaHTSG#Rmu_aSu71t%Epja?mpq)NN$2~S zbtYW#L$JbiXVd*t^J)SL=JP+F=Rp{^f-Wu#+%8i+g%lGL?Kie%~11AHAe*_n9%KZeRSMJ)!CXzrFZHtW4TE#zb}BIqOAqoT`$N zAM_=Vbo_a+K2`|w$>Lz52}Q=n$pyT!l@aae-z$Z8300;NPx9smGpd&Z4=+wPD`>cy|Bw<`|b$c6U##YYZ?MfO5j{(B=o`dG4Rd#(8&Mt z@7t#)M2j}1NqCl8{zxh1J(iGWv`m#NvFDRt=O-Wsk%n%h9fOqLO5Lo{-m38{F}e{o z!B+GJW-1?fdmiEj6_*w9SPjPN)aB?Af-MZv8wXN3A5KG+6923Y5k|Pt_ZV?`9*jS| zDI^_6;$k(%MABmkUWa>Ll%4CB(Ym%2lu|w_rDOyRnWI0z-@=p6rED6)4-6U+Pg6%H z`sYI7Aup8bgAWSI3m1cV7!#>QMP!0EIaM!ydsY?+ZlY3T6p{-GeFV&rg<>@g3>xhwx%~B&P!^9UBcxs%H-ofev(XXgdJqBD+lxVqtiIc? ziNlH`vxTZ6H+K;vc|=4+z4F>c6N%) ziH%AHnk8d^A!PaO_rV$6;|x+j0QWzdhNI{t}ZOl3WnUzMY;e+N4K55WtfVHi1_vE7aaN!kI-8u4^#{&gn^easV*7R z(w;zI@r|{=LIxbMy2wn%Rum2D(n8awwbc|LwcHcF?P?nocJR|S{9qiaHV4%X4Aalr z61Fe2y1ToPnGu4YHpa_(y1ShsG&bN0z&d=M;_`jIsVKW&G_z?B+qz^QC^8U#MQ`*N zs%5~}o>Zj>ay~=PhMXlb9gA^@ik4M5Okdv0Gxu~zwIXE zVU2030@x7~7nfi4JZJWbJ-4D$s!9J3n;K&M{rt|qKl$wo^{iXB zbQI|gf7D1QP~iN!{~J8Rp;GXTRc}lHUMIMXn0tFSEDPo(sGGz;ZoN?qoN#75O2HiL zlePS~^KK2+X!PgQcRiG(0C|#==>U_1Z{V{Lkmo{aOZUa5Dl03?b}JZeF9`JPZES{S z-$MM(9cnFo!iL#${^=<0mQ;m8Xh8u2{`xJUurIm_p|Pec90s)l)Pk;{agAMmWl*~T zz+iVMoWt?w@DGm)fM_JYkBhz+vRrx``%^(O=YkLFC}B5@BX0Bcg@v3+ysah8j{04N?1L_X7y*p=EshI3*1upY-)6DEEpq*x2^q0zzl+LTL?`6xeu^ z$3a)KM^M z@dIo7&?^o-&W4jfEap8xf4~sb3+AS{5| z$LnO@GDq|G<6MyUgDQQ()rpmxJ5DD5lnF|4po=~)VL6CpNTCgqRvr6sH?|sf>EIWO zqpNuZt9qrI(frSMJ~z)+w`AqH(Ad(MR9I*!2skUBwmEd_yqZ3ld|7ioS2jsDjA z(!2Sm%EEB9fB!oB!}|V7^ZPg~#2BarL?$A{SYSI1Zdskndvc6b5E#&a)Yp%mem*VH zDg|AM3RK7t3<7E1A17^ABOCzvAXRpv;%)lik=6U z=CD6UT)<9{tCaIWfv>V2bU@8wlrTdR#1a&TE`?34RE>~Wwdm!hXr)-*BU&eM5q$i@%JHfw8ZpnK&7 zU007Y2(&;21iRR)adg5J-4tjG;Z1^C8@vj7oRRw;1wmYFEC_K@(~Lub2K)JQtO3$u z`u+R&5RzC{W(U?qXdWOLs)A@Gi%x;D3o&(>ck+FYU-^RZ$E5p@UvoBU%acaG0rfjP zIDl&gb|XOYor;@1ASVk#Tn9EX=-YESPXrz57C)) zWnRIuAYAr%pY>hv?dGw}SL7RMOgo7HI5M#%^@dHsp|neuRUB_ z{=j=VY=yUmt;7g}gj#@Ly-t4RYJ=`I92`m!FZ|6BNWN$(PhBPOuk-;9$g{98%UuE@ zccZt>%|_WOBt#^-xsXNq{yT&mTXu}O&x3Y>ZL?jpgL)QXihuX(zn{5eNs1{kdxtQh zH;^&Y*pHiq z$QA=gwUPXy30ewpC;|IZ@fa-OBOfr_dsziSiuq6tg+)^A@1$wlH}*ir2DHb$LD(E_ zMuMfjwpk^#+3TfNylKFmj~s|P7J(AcAa*@45OvY^CZ4}YwomO!aP@Yh5kOjiH7|v3 ze%1hM83^g*(d0@PU9S;L2M^`C{KrxZ3MC>^)7otWdsJ_FnR^~u`H-|6FJYIY8*PFY zll!KQt=cg?VJvwPxO4vkIfvn7CZBcevLHwchR`J{F5GzbE#!05w@5_9mcvXau7$w- zo1gG%8%bu6o+8+S>j5NcX647na|$IO`HS=|AJmqp-+oy%YRkju->}s#6^CPo^ki&f zI`xCJ!jW<}NojODywWcam;t5Mwo}*c`e6e~k8|`JXFoqbcnmcxJ8^8#?gpOD%zshU z8j9D^y{=q=NKd{uH8H__DV@g%YTnJwLCH(_5u$lu#*FS5HNRClw`-cDCxB}>TW?A}^6c&bM(3#y7;)a()8>8A01 zI+xR#{kND6#2{u4f_ZXCt|fC~{2`C%mA38aUBQ(Z$d3#+DZE>Y5162leq%dB&+_sz z_?#ceQuW)7H%%c!3DuAFCPA&n%VmZboK^13b=f{sL z;-A>q6oX9S<;yG1UO6A0)fff<)N&HRlEn%{@1)@ivH9kgCV9v6s9ox@$KO|G|v&lwN4bTl5*KxZBm{YH>lO%O^=1fUyvA zPvecx27iSEFe~769UeStQ6Gq5kq3^^hXeq&HYl!6;pZ@BML+c`Bz`4IHV{}WU^ijv zfj45Wj`0@GVt4b2u&9!s66=-SV~hydvkm6>uz9P;5DguDF_Ie`FP_~o#dPCqylMV? z;T-5}1{AoJRM?n;MfPF42Z`NCT(E|MeRK ze3s|rzc9LdWdEUVqiJDk(BVGEeeOM%g)eKK3Kq8s0X>PkcUrtGh+JUXsy7R1ak+^l zkSB=$ejiI}!5zkdLGd(ECZ!cx#GP~M2QOdIlYf_8pRSA;F358t;TmpMMH$9hB5VyQ zVr~5pV0`TZj<&d0Nsr>QDe!RcCfA|n>8ewLhvp0zw2amEu~lGola)nnJ}=2XxoU@V zq92g=YA(ja^K`hiia36`WDZyUi*NVNCk0^W_?7DFN@loRxG#y=%YPrAl?Cj3Ynrx zjD#LIl&sZ7&m{0Z1O7)E<$u1{18U_&-J%;TL(d_2JbF8kta~%0NQ-@Nq^W9*taWCoV4W|f*T~ioDb3#`XL}QA7uA7rT zYy%#sirmeN--~WsSzwW!k&82pvBgFNq1R=}JPCAC-8$0eIFPr5o(#If`Qc$6Uf!jK zsETq%L}1Zt-S*Lt?u=u3-;ksRFZ?xr;v=W|YHqC}1nKHT~ zKjeJe+_b3Yp?hpIZu?XJgMc*awUBL2H$<4vpGFGW66ve z+3fwNE%HFNMGn8UwK|vYIQ??+t+VcQ?pICUSqcBXcCuSaLuHZtLM{3CDMLK8K(MDJ z4e7QPKt0slJU?a3t7au8T1^A#LQn%8*TlU}C=hLaWW+3JZXh96h6oyPjA{fW2)yiW z5<`>Q{Mm<{<12)gHpRb*zYOm-s>y1h_Ai8UNsUzEkKKRmVx$`zE*do&7lESx^J$5B z;iu&66%67}^T&rfPg#W(3A#&4C=#gKXXbB++cUh0TS%0)Vdf7k=FGkixy#u1mMt)N zaN1O3scgL(KMCK|LJz(k;yaVDI=#2I2bX5_^QkW&H%F76_Dt^nB7-xv_yW=5x+&%l zngVoGRoVMfPXjITW45wS<**%PMhEuZo#iZ4Mb*Xix-g~Beln#AocFnnb=^uV%08h@ z%~X#}2kl|lKL0D6<^3&T9l;gE=hKEY(+BanFLHBnI|cK^WS<+=uj&s^ugwIsJH@8` zu!Dxe6)=9^y9aOqVW>r6V)i4XJNWP6mq_RpPOs;6QonvWpXL5o(36Gwb;9C-7w>(m zWiGql{Elhh(ERP=3sAFl2(xg#5i2HwM$4IP|Mvu|u`g|5EeW z7js2PqGRdG`ku`^sNg}hk3(kIV%zZe%e^gvygMP;is@mjO{9WL>-9OY#b}6j0y%Ls z(jWuc)RbG=6GnSB8Lxc99R}D2-@c<2Q$)jBbv*Y$#}2I~4%8gAl=I21E$N6H(ywB4 z5=xh^P@mi6Q^{3ZYk#W^dJK!3F8PB#{dj;pGv&lq`tJBQ={ za_Z{k$%1sjScdHv*~pt=`tQwnkm4kh%Dx;Yavr@WyVl2cA-ZkoR$1OV^l|7GS*gv( ztq#$_$WM*&;b@wD875~64bWHJ1so3u+zWN&eKff#T>``0Y!U6q4$5 z(R=raW2fG(iclA19L!T2(Hv`gbLdH^uqSN*n zulzpO5FD1a_|quDQ3SVUCp<0Bu0g9Dc>_J!Op z9CUea5R8T4+^nJLjAXlyC1vnuhV5C?Wi;2X^A=Dt=!s0H8r>Aa=6goB zII9@D4D!j$d;Y?tQR{f$y&J3RDB~ZW?TxhP(~C-}X~vmKEC4_S>VBl`ZTaV^v0Gh2 z{SY6qca3-vPmwugsB5|AO(BI}f z1igQY4c+Oy3=`klofhGX#b%p+m?q)OpCqMkc^t^s0&DZdAoSk!4CaLzZ!@ zgB2^8GX|p^+6xj2+)}YP78=}+{9wJG$H&WYD~K;zvFgbeMB6W#_Ra|ELN{gAhQ@H& ze9_Ag395DIksA+v!%cY<$LHqk9~XYJ{!m95Xxc-VxbrpSW8^mO=OGEV4%V3;ud+1R z1n%AAYPm~#i{QcO<#7*^DyhnV>`An@97k8Q)fx2esr0ReLj9We9Vg|BT$IMp0jnju zKR)-$h9nWAFY|uogF%_V-7V{QWx}JWP@M4B5EgnlC15p4@HfDh=KvUXELQS(2L^n# zPM&(D_k|x@dK2@V0{L3?!z>>5PM<6i$5D#*Z+EyPR2h)??(xE<6I#;ls|)mmy9 z-g^68{`9ya6LOP4L=Vmttw%F<$lej50l)(Cn~79KoHr*pCF{3suJqe04g{d1PC@$+ zlk#}wzDUmt%NPRb-br$!$-}Q40l_V7#8y}^z1V8D-j!CqAZ$Hm7gHaaQ}OZzclofBrVz^&N#IeDnc5=6^ zi3<=NvJ!7HqXTXy_SMv>5>wnkLBV&Dmy*yz8rva*bB_@<|_Qm zrQbXC1|4k-EMKRy``c*030}KT%esC8XUZDgXO*9@G)gIzPS}o3A>rkYNIb<1=;@Lb3T*-y(0yX-dpt z-kw0F{Hl18hD+1l`KOFI?>nIAH*F6x0fUiar%Z=DpY<&3!m3f~_A3rw0J^+=`!<(e zWm|P?ezQx%j}2|B^gnZ_Hd;WlCVud(0IK(V5V851?wRl43)FWpNC2uDpRqfb8Wl@vKByvI=f)o$xTr-MACQ^&(OqdU>%uzLrsqsk0wW#m z&o;byKK8>6Hp6+~{z1N1{>t}H|7ye#&U=t?U`^c}H-y$cSWu``LFeuA>{??Q;LeNn zj6rhw^xEqmAfx+tK|dQiBJa0zZ@!8#=1JyIGneCMU^lf3g&QhvTs z?d};za_bfkd#1|3hN!XQffixM#itomlrblx$?GlfzLCBqJ`OJ*gL&2Iw`V6NtT>i?%-(=Ery$(s>TeIw*EX=X7r*td#3{`@X7 z63bslnk`iJK4cY|qrcTaw-N$cj;+!Jl7J0WPwX-W_!c-h4XO405(0AyK%RS?!AuEE z9S?9IoEN~Jo$A!FT|Xu9*8bb3VwyjRR<2GbQ`Y$NY`!(?iqzwHSyqlX-F=T|i97KF z^D+b9Kih%@of`PSIcI=&8+do%=mdZoWcjHpgAF4Lh;q0b2kTzYdoN7(&u0C}bj*AE zR=35~JgooJ&IM4g_3dq_MByt?mnJxb0gQMfu18w1L#xLbdhgHRC@~fH1ORv#9i?DY zf?0Jtr=vR{+_!IoKo&9~A%qh6<$yTvMS=yb6g29mM5#xVd`|0_$27p!%kvhYj{76y z--&y&RPS{v+DIwCnE}YlvnS_vc6RU2noomDTl!&Q1!vzh*gQma0U*Ok$rv)qJ=|Jx z1`)xKm=lA9Dc8@XrcamUb_ibW7{IS?{)5t`@WabJprj0`;2ZeX6BoyElFZ&o0%ghx(s$<&xz@3E%j`>$v}y3qpgAkso* zi_2~;E-N)3SzI9o14ySC1K;Wa)d+aZ^zlPqPG$HHY5m5nMGrW83c3y*nGz0VO3KQh zusl1$3C*Pl*f1{%DB9WFw6nKI?2gwT&N5@!21u0Hb1gLPfa%lnp5T%HE-?wK>(EhG zw35F5^xg08_(ViF9A&_Ub&kjV&ZXsOXUVb6fxq3!Q)T4Y1Od>iEY<+Zd4Q{tQJ1{Y zXMmK)#|wMZmrnYAgMHk!Mb=I;ROLaobr{x>^L2vtR!NDx;~S4(fKkN7#7IiRD&tiEcaJcF(l?JTArUUi8+ToE|eC z!Io#&0L|Lk+zJAJvTx|A76caqx@F>|9vxp7!_kS(-)xuIBpJ2Kn zG6>eu<7K+O{hpN8fKfCqp0Kg)iw@4*6CFDSx;*!QozME~&6d4xithWA>^6*2T7r~2 z8yg9Df#iA757oHvU`Yt1$qiKC<4n*UH-dSA=72#c< z6*XZ%hBel5%3xZ|KnMWhXwmwO_6^RzH~Omz@;<{92&TCInLszZeqdze@Ptd-#OuKA zmm1Oz7S!E-p8S6tnGIX~roFoHPFR?kxlCH-fO(hYsIIOKjVN?OMN!Fr$oIfUZ{gI3 zIW}~mU{RrZ0!t%5f4QV6D~O^QPD`*gYj2l03&{4h^7<`v5UMa80nH*9(*lhyq8&Ml z_WqUz{6;we%lHYs=&H~)S(to4B+JU1hk-{xGzXXS(o%NcUxH~$;EN7;pW-=pj0-S? zA|fzfy&~sk1Y(*m$ekCi=yKqxH_rGNyps&3oAODY22nliOVvQTERh4AnWpBbu8F_p z+n2;4dc@qOlBgLSFLRDc#5w8x8D*Dc5rnKkNo3SJRewDwEQH%wz_d*-$`nOy)8$jd&TTI#V3Oa#K z{tiZg8lm#iaG+g0!}bs4QKOMcWGnod*a492Lbm1g6l~YGvm)tAlON>(t`WOfR~;HX zp5o0qt2EK;V%th_l&cf!{n%Ju{&6SzsP>3pS;YwA(~&+4!tVV$0(B7^Bj=xxY9<(f zyR<%NbSwE_qN-@+t&x+T&yeCQ&vx1Tb#d`?3fbiTNYSaEYR&!skSeaDV-dA86Jko@ z{rV8v23|duQYH4id2Q$;ir<^NEO~@yWrr;B*w){L9J-TxV{>@Mw(q6#Whe2LKwuQ1&Mf zGx;>pz@AQ=IT0De(?2i(cFtQr{aok{&8NlefKT#d;^RPn{9lq#+h7b3fu@J^U|GI- zvj=|KdwwS#9%F$9r$ll^porh`2X3aQN%v7}thJmeIS`66uY?mz{7WX<)g&-QKhuo2 z5<+4KyK02+e`>d}lj#2?4(-CFHUNPAM(;FQm^lu2K|4Xw0>~_ literal 0 HcmV?d00001 diff --git a/src/components/tools/lively-image-editor.html b/src/components/tools/lively-image-editor.html index 6e5b7d228..fd2c76083 100644 --- a/src/components/tools/lively-image-editor.html +++ b/src/components/tools/lively-image-editor.html @@ -63,6 +63,11 @@ height: calc(100% - 35px); } + canvas { + + border: 1px solid gray; + } +
        diff --git a/src/components/tools/lively-image-editor.js b/src/components/tools/lively-image-editor.js index aebced70a..d7fb21857 100644 --- a/src/components/tools/lively-image-editor.js +++ b/src/components/tools/lively-image-editor.js @@ -202,6 +202,12 @@ export default class LivelyImageEditor extends Morph { return lively.rect(lively.pt(0,0), lively.getExtent(this.canvas)).containsPoint(pos) } + clear() { + this.ctx.fillStyle = 'white'; // Set the fill color to blue + this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height); + } + + // #important onPointerMove(evt) { evt.preventDefault() @@ -325,16 +331,13 @@ export default class LivelyImageEditor extends Morph { const menuElements = [ ["save", () => this.onSave()], ["save as...", () => this.onSaveAs()], + ["clear", () => this.clear()], ["open image", () => this.onOpen()], ]; const menu = new lively.contextmenu(this, menuElements) menu.openIn(document.body, evt, this) } - - livelyMigrate(other) { - this.target = other.target - } - + get lastSource() { return this._lastSource } @@ -358,13 +361,11 @@ export default class LivelyImageEditor extends Morph { } livelyMigrate(other) { - + this.target = other.target this.migrateCanvas = other.canvas } - - - async livelyExample() { - + + async livelyExample() { this.loadImage("https://lively-kernel.org/lively4/foo/test.png") } } diff --git a/src/components/tools/openai-audio-chat.js b/src/components/tools/openai-audio-chat.js index cb30fb540..bbdc4b1ea 100644 --- a/src/components/tools/openai-audio-chat.js +++ b/src/components/tools/openai-audio-chat.js @@ -39,6 +39,13 @@ export default class OpenaiAudioChat extends Morph { async initialize() { this.windowTitle = "OpenAI Audio Chat"; this.audioRecorder = new AudioRecorder(); + this.prompt = [ + { + role: 'system', + content: 'Play the role of a helpfull AI chat-bot in a JavaScript, HTML, CSS Web-based development environment.' + } + ] + if (!this.conversation) { this.conversation = [ // { @@ -153,7 +160,7 @@ export default class OpenaiAudioChat extends Morph { "n": 1, "stream": false, "stop": "VANILLA", - "messages": this.conversation, + "messages": this.prompt.concat(this.conversation), } const requestOptions = { From 6d98f15a48f101bb8378cb80668456aabbd585aa Mon Sep 17 00:00:00 2001 From: JensLincke Date: Fri, 24 May 2024 11:21:32 +0200 Subject: [PATCH 10/47] ai demo and jsx support for script tags in markdown SQUASHED: AUTO-COMMIT-demos-openai-image.md,AUTO-COMMIT-src-external-code-mirror-mode-htmlmixed-htmlmixed.js, --- demos/openai/image.md | 92 ++++++++++--------- .../code-mirror/mode/htmlmixed/htmlmixed.js | 6 +- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/demos/openai/image.md b/demos/openai/image.md index 2f2072c88..a1aa0f56d 100644 --- a/demos/openai/image.md +++ b/demos/openai/image.md @@ -1,49 +1,55 @@ # Image Generation -```javascript -import OpenAI from "demos/openai/openai.js" - - -let prompt = { - "model": "dall-e-3", - "prompt": "a white siamese cat", - "n": 1, - "size": "1024x1024" - } - - -async function imageGeneration(prompt) { - const apiKey = await OpenAI.ensureSubscriptionKey(); - const url = "https://api.openai.com/v1/images/generations"; - - const requestOptions = { - method: "POST", - headers: { - "Content-Type": "application/json", - "Authorization": `Bearer ${apiKey}` - }, - body: JSON.stringify(prompt) - }; - return fetch(url, requestOptions); - } - - -let response = await imageGeneration(prompt) - - -reso - -let json = await response.json() - - -json.data[0].url - -``` - + diff --git a/src/external/code-mirror/mode/htmlmixed/htmlmixed.js b/src/external/code-mirror/mode/htmlmixed/htmlmixed.js index eb21fcc14..21ddb4002 100644 --- a/src/external/code-mirror/mode/htmlmixed/htmlmixed.js +++ b/src/external/code-mirror/mode/htmlmixed/htmlmixed.js @@ -3,7 +3,7 @@ (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")); + mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"),require("../jsx/jsx"), require("../css/css")); else if (typeof define == "function" && define.amd) // AMD define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod); else // Plain browser env @@ -13,8 +13,8 @@ var defaultTags = { script: [ - ["lang", /(javascript|babel)/i, "javascript"], - ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "javascript"], + ["lang", /(javascript|babel)/i, "jsx"], + ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "jsx"], ["type", /./, "text/plain"], [null, null, "javascript"] ], From a928145f877d32dd9ff2b0b2940958d4eb701fa5 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Mon, 27 May 2024 13:01:26 +0200 Subject: [PATCH 11/47] javascript linting in script tags SQUASHED: AUTO-COMMIT-demos-markdown-test.html,AUTO-COMMIT-demos-markdown-test.md,AUTO-COMMIT-src-components-widgets-lively-code-mirror.js,AUTO-COMMIT-src-components-widgets-lively-code-mirror-lint.js,AUTO-COMMIT-src-external-code-mirror-addon-lint-html-lint.js,AUTO-COMMIT-src-external-eslint-eslint-lint.js,AUTO-COMMIT-src-external-htmlmixed-lint.js, --- demos/markdown/test.html | 9 + demos/markdown/test.md | 9 + .../widgets/lively-code-mirror-lint.js | 27 + src/components/widgets/lively-code-mirror.js | 2 + .../code-mirror/addon/lint/html-lint.js | 1 + src/external/eslint/eslint-lint.js | 712 +++++++++--------- src/external/htmlmixed-lint.js | 173 +++++ 7 files changed, 578 insertions(+), 355 deletions(-) create mode 100644 demos/markdown/test.html create mode 100644 demos/markdown/test.md create mode 100644 src/components/widgets/lively-code-mirror-lint.js create mode 100644 src/external/htmlmixed-lint.js diff --git a/demos/markdown/test.html b/demos/markdown/test.html new file mode 100644 index 000000000..38c17d6bf --- /dev/null +++ b/demos/markdown/test.html @@ -0,0 +1,9 @@ + + +

        + +

        + + + + \ No newline at end of file diff --git a/demos/markdown/test.md b/demos/markdown/test.md new file mode 100644 index 000000000..ddfd20f76 --- /dev/null +++ b/demos/markdown/test.md @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/components/widgets/lively-code-mirror-lint.js b/src/components/widgets/lively-code-mirror-lint.js new file mode 100644 index 000000000..bb0b77f04 --- /dev/null +++ b/src/components/widgets/lively-code-mirror-lint.js @@ -0,0 +1,27 @@ +import { validator } from "src/external/eslint/eslint-lint.js" + + +CodeMirror.registerHelper("lint", "markdown", function(text, options) { + var found = []; + + function newlines(str) { + return str.split("\n").length; + } + + function processJS(text, options, found) { + var blocks = text.split(/|<\/script>/gi); + + for (var j = 1; j < blocks.length; j += 2) { + var offset = newlines(blocks.slice(0, j).join()); + let content = blocks[j] + var jsFound = validator(content, options) + for (let message of jsFound) { + message.from.line += offset - 1 + message.to.line += offset - 1 + } + found.push(...jsFound) + } + } + processJS(text, {}, found); + return found; +}); diff --git a/src/components/widgets/lively-code-mirror.js b/src/components/widgets/lively-code-mirror.js index ffc7ba063..8829c5935 100644 --- a/src/components/widgets/lively-code-mirror.js +++ b/src/components/widgets/lively-code-mirror.js @@ -137,6 +137,7 @@ export default class LivelyCodeMirror extends HTMLElement { //await lively.loadJavaScriptThroughDOM("eslint", "http://eslint.org/js/app/eslint.js"); );await this.loadModule("addon/lint/lint.js"); await this.loadModule("addon/lint/javascript-lint.js"); + await this.loadModule("addon/lint/html-lint.js"); await System.import(lively4url + '/src/external/eslint/eslint-lint.js'); @@ -145,6 +146,7 @@ export default class LivelyCodeMirror extends HTMLElement { await this.loadModule("addon/selection/mark-selection.js"); await this.loadModule("keymap/sublime.js"); await System.import(lively4url + '/src/components/widgets/lively-code-mirror-hint.js'); + await System.import(lively4url + '/src/components/widgets/lively-code-mirror-lint.js'); this.loadCSS("addon/hint/show-hint.css"); this.loadCSS("addon/lint/lint.css"); diff --git a/src/external/code-mirror/addon/lint/html-lint.js b/src/external/code-mirror/addon/lint/html-lint.js index 1e8417098..ade7e17e6 100644 --- a/src/external/code-mirror/addon/lint/html-lint.js +++ b/src/external/code-mirror/addon/lint/html-lint.js @@ -28,6 +28,7 @@ }; CodeMirror.registerHelper("lint", "html", function(text, options) { + debugger var found = []; if (!window.HTMLHint) return found; var messages = HTMLHint.verify(text, options && options.rules || defaultRules); diff --git a/src/external/eslint/eslint-lint.js b/src/external/eslint/eslint-lint.js index 16cfa72c2..69257052d 100644 --- a/src/external/eslint/eslint-lint.js +++ b/src/external/eslint/eslint-lint.js @@ -10,366 +10,368 @@ import {parse} from "./eslint-parser.js"; -(function(CodeMirror) { - - const defaultConfig = { - parserOptions: { - ecmaVersion: 8, // only for default eslint parser - sourceType: "module", - ecmaFeatures: { - jsx: true, - modules: true, - experimentalObjectRestSpread: true // only for default eslint parser - } - }, - env: { - browser: true, - node: false, - amd: false, - mocha: true, - jasmine: false, - es6: true - }, - globals: { - lively: true, - aexpr: false, - ae: false, - lively4url: true, - System: true, - SystemJS: true, - CodeMirror: true, - a: true, - b: true, - _: true, - runZoned: true, - Zone: true, - // gs support - gs: true, - me: true, - allies: true, - enemies: true, - fallen: true, - attack: true, - defend: true, - skill: true, - item: true, - editorHistory: true, - input: true, - tsMorph: true, - }, - //extends: "eslint:recommended", // seems not to work - rules: { - // https://eslint.org/docs/rules/ - // generated using: - // Array.from(this.querySelectorAll("tr")).map(tr => { - // const ok = !!tr.querySelector(".glyphicon-ok"); - // const children = Array.from(tr.querySelectorAll("p")); - // const label = children[0].textContent - // const comment = children[1].textContent - // return `${ok ? "" : "//"} "${label}": ["error"], // ${comment}` - // }).join("\n"); - // "for-direction": 2, // enforce “for” loop update clause moving the counter in the right direction. - // "getter-return": 2, // enforce return statements in getters - // "no-await-in-loop": 2, // disallow await inside of loops - "no-compare-neg-zero": 2, // disallow comparing against -0 - "no-cond-assign": 2, // disallow assignment operators in conditional expressions - "no-console": [1, { allow: ["warn", "error"] }], // disallow the use of console - "no-constant-condition": 2, // disallow constant expressions in conditions - "no-control-regex": 2, // disallow control characters in regular expressions - "no-debugger": 2, // disallow the use of debugger - "no-dupe-args": 2, // disallow duplicate arguments in function definitions - "no-dupe-keys": 2, // disallow duplicate keys in object literals - "no-duplicate-case": 2, // disallow duplicate case labels - "no-empty": 2, // disallow empty block statements - "no-empty-character-class": 2, // disallow empty character classes in regular expressions - "no-ex-assign": 2, // disallow reassigning exceptions in catch clauses - "no-extra-boolean-cast": 2, // disallow unnecessary boolean casts - // "no-extra-parens": 2, // disallow unnecessary parentheses - "no-extra-semi": 2, // disallow unnecessary semicolons - "no-func-assign": 2, // disallow reassigning function declarations - "no-inner-declarations": 2, // disallow variable or function declarations in nested blocks - "no-invalid-regexp": 2, // disallow invalid regular expression strings in RegExp constructors - "no-irregular-whitespace": 2, // disallow irregular whitespace outside of strings and comments - "no-obj-calls": 2, // disallow calling global object properties as functions - // "no-prototype-builtins": 2, // disallow calling some Object.prototype methods directly on objects - "no-regex-spaces": 2, // disallow multiple spaces in regular expressions - "no-sparse-arrays": 2, // disallow sparse arrays - // "no-template-curly-in-string": 2, // disallow template literal placeholder syntax in regular strings - "no-unexpected-multiline": 2, // disallow confusing multiline expressions - "no-unreachable": 2, // disallow unreachable code after return, throw, continue, and break statements - "no-unsafe-finally": 2, // disallow control flow statements in finally blocks - "no-unsafe-negation": 2, // disallow negating the left operand of relational operators - "use-isnan": 2, // require calls to isNaN() when checking for NaN - // "valid-jsdoc": 2, // enforce valid JSDoc comments - "valid-typeof": 2, // enforce comparing typeof expressions against valid strings - // "accessor-pairs": 2, // enforce getter and setter pairs in objects - // "array-callback-return": 2, // enforce return statements in callbacks of array methods - // "block-scoped-var": 2, // enforce the use of variables within the scope they are defined - // "class-methods-use-this": 2, // enforce that class methods utilize this - // "complexity": 2, // enforce a maximum cyclomatic complexity allowed in a program - // "consistent-return": 2, // require return statements to either always or never specify values - // "curly": 2, // enforce consistent brace style for all control statements - // "default-case": 2, // require default cases in switch statements - // "dot-location": 2, // enforce consistent newlines before and after dots - // "dot-notation": 2, // enforce dot notation whenever possible - // "eqeqeq": 2, // require the use of === and !== - // "guard-for-in": 2, // require for-in loops to include an if statement - // "no-alert": 2, // disallow the use of alert, confirm, and prompt - // "no-caller": 2, // disallow the use of arguments.caller or arguments.callee - "no-case-declarations": 2, // disallow lexical declarations in case clauses - // "no-div-regex": 2, // disallow division operators explicitly at the beginning of regular expressions - // "no-else-return": 2, // disallow else blocks after return statements in if statements - // "no-empty-function": 2, // disallow empty functions - "no-empty-pattern": 2, // disallow empty destructuring patterns - // "no-eq-null": 2, // disallow null comparisons without type-checking operators - // "no-eval": 2, // disallow the use of eval() - // "no-extend-native": 2, // disallow extending native types - // "no-extra-bind": 2, // disallow unnecessary calls to .bind() - // "no-extra-label": 2, // disallow unnecessary labels - "no-fallthrough": 2, // disallow fallthrough of case statements - // "no-floating-decimal": 2, // disallow leading or trailing decimal points in numeric literals - "no-global-assign": 2, // disallow assignments to native objects or read-only global variables - // "no-implicit-coercion": 2, // disallow shorthand type conversions - // "no-implicit-globals": 2, // disallow variable and function declarations in the global scope - // "no-implied-eval": 2, // disallow the use of eval()-like methods - // "no-invalid-this": 2, // disallow this keywords outside of classes or class-like objects - // "no-iterator": 2, // disallow the use of the __iterator__ property - // "no-labels": 2, // disallow labeled statements - // "no-lone-blocks": 2, // disallow unnecessary nested blocks - // "no-loop-func": 2, // disallow function declarations and expressions inside loop statements - // "no-magic-numbers": 2, // disallow magic numbers - // "no-multi-spaces": 2, // disallow multiple spaces - // "no-multi-str": 2, // disallow multiline strings - // "no-new": 2, // disallow new operators outside of assignments or comparisons - // "no-new-func": 2, // disallow new operators with the Function object - // "no-new-wrappers": 2, // disallow new operators with the String, Number, and Boolean objects - "no-octal": 2, // disallow octal literals - // "no-octal-escape": 2, // disallow octal escape sequences in string literals - // "no-param-reassign": 2, // disallow reassigning function parameters - // "no-proto": 2, // disallow the use of the __proto__ property - "no-redeclare": 2, // disallow variable redeclaration - // "no-restricted-properties": 2, // disallow certain properties on certain objects - // "no-return-assign": 2, // disallow assignment operators in return statements - // "no-return-await": 2, // disallow unnecessary return await - // "no-script-url": 2, // disallow javascript: urls - "no-self-assign": 2, // disallow assignments where both sides are exactly the same - // "no-self-compare": 2, // disallow comparisons where both sides are exactly the same - // "no-sequences": 2, // disallow comma operators - "no-throw-literal": 1, // disallow throwing literals as exceptions - // "no-unmodified-loop-condition": 2, // disallow unmodified loop conditions - // "no-unused-expressions": 2, // disallow unused expressions - "no-unused-labels": 0, // disallow unused labels - // "no-useless-call": 2, // disallow unnecessary calls to .call() and .apply() - // "no-useless-concat": 2, // disallow unnecessary concatenation of literals or template literals - "no-useless-escape": 1, // disallow unnecessary escape characters - // "no-useless-return": 2, // disallow redundant return statements - // "no-void": 2, // disallow void operators - // "no-warning-comments": 2, // disallow specified warning terms in comments - "no-with": 1, // disallow with statements - // "prefer-promise-reject-errors": 2, // require using Error objects as Promise rejection reasons - // "radix": 2, // enforce the consistent use of the radix argument when using parseInt() - // "require-await": 2, // disallow async functions which have no await expression - // "vars-on-top": 2, // require var declarations be placed at the top of their containing scope - // "wrap-iife": 2, // require parentheses around immediate function invocations - // "yoda": 2, // require or disallow “Yoda” conditions - // "strict": 2, // require or disallow strict mode directives - // "init-declarations": 2, // require or disallow initialization in variable declarations - // "no-catch-shadow": 2, // disallow catch clause parameters from shadowing variables in the outer scope - "no-delete-var": 2, // disallow deleting variables - // "no-label-var": 2, // disallow labels that share a name with a variable - // "no-restricted-globals": 2, // disallow specified global variables - // "no-shadow": 2, // disallow variable declarations from shadowing variables declared in the outer scope - // "no-shadow-restricted-names": 2, // disallow identifiers from shadowing restricted names - "no-undef": 2, // disallow the use of undeclared variables unless mentioned in /*global */ comments - // "no-undef-init": 2, // disallow initializing variables to undefined - // "no-undefined": 2, // disallow the use of undefined as an identifier - "no-unused-vars": 1, // disallow unused variables - // "no-use-before-define": 2, // disallow the use of variables before they are defined - // "callback-return": 2, // require return statements after callbacks - // "global-require": 2, // require require() calls to be placed at top-level module scope - // "handle-callback-err": 2, // require error handling in callbacks - // "no-buffer-constructor": 2, // disallow use of the Buffer() constructor - // "no-mixed-requires": 2, // disallow require calls to be mixed with regular variable declarations - // "no-new-require": 2, // disallow new operators with calls to require - // "no-path-concat": 2, // disallow string concatenation with __dirname and __filename - // "no-process-env": 2, // disallow the use of process.env - // "no-process-exit": 2, // disallow the use of process.exit() - // "no-restricted-modules": 2, // disallow specified modules when loaded by require - // "no-sync": 2, // disallow synchronous methods - // "array-bracket-newline": 2, // enforce linebreaks after opening and before closing array brackets - // "array-bracket-spacing": 2, // enforce consistent spacing inside array brackets - // "array-element-newline": 2, // enforce line breaks after each array element - // "block-spacing": 2, // disallow or enforce spaces inside of blocks after opening block and before closing block - // "brace-style": 2, // enforce consistent brace style for blocks - // "camelcase": 2, // enforce camelcase naming convention - // "capitalized-comments": 2, // enforce or disallow capitalization of the first letter of a comment - // "comma-dangle": 2, // require or disallow trailing commas - // "comma-spacing": 2, // enforce consistent spacing before and after commas - // "comma-style": 2, // enforce consistent comma style - // "computed-property-spacing": 2, // enforce consistent spacing inside computed property brackets - // "consistent-this": 2, // enforce consistent naming when capturing the current execution context - // "eol-last": 2, // require or disallow newline at the end of files - // "func-call-spacing": 2, // require or disallow spacing between function identifiers and their invocations - // "func-name-matching": 2, // require function names to match the name of the variable or property to which they are assigned - // "func-names": 2, // require or disallow named function expressions - // "func-style": 2, // enforce the consistent use of either function declarations or expressions - // "function-paren-newline": 2, // enforce consistent line breaks inside function parentheses - // "id-blacklist": 2, // disallow specified identifiers - // "id-length": 2, // enforce minimum and maximum identifier lengths - // "id-match": 2, // require identifiers to match a specified regular expression - // "implicit-arrow-linebreak": 2, // enforce the location of arrow function bodies - // "indent": 2, // enforce consistent indentation - // "jsx-quotes": 2, // enforce the consistent use of either double or single quotes in JSX attributes - // "key-spacing": 2, // enforce consistent spacing between keys and values in object literal properties - // "keyword-spacing": 2, // enforce consistent spacing before and after keywords - // "line-comment-position": 2, // enforce position of line comments - // "linebreak-style": 2, // enforce consistent linebreak style - // "lines-around-comment": 2, // require empty lines around comments - // "lines-between-class-members": 2, // require or disallow an empty line between class members - // "max-depth": 2, // enforce a maximum depth that blocks can be nested - // "max-len": 2, // enforce a maximum line length - // "max-lines": 2, // enforce a maximum number of lines per file - // "max-nested-callbacks": 2, // enforce a maximum depth that callbacks can be nested - // "max-params": 2, // enforce a maximum number of parameters in function definitions - // "max-statements": 2, // enforce a maximum number of statements allowed in function blocks - // "max-statements-per-line": 2, // enforce a maximum number of statements allowed per line - // "multiline-comment-style": 2, // enforce a particular style for multiline comments - // "multiline-ternary": 2, // enforce newlines between operands of ternary expressions - // "new-cap": 2, // require constructor names to begin with a capital letter - // "new-parens": 2, // require parentheses when invoking a constructor with no arguments - // "newline-per-chained-call": 2, // require a newline after each call in a method chain - // "no-array-constructor": 2, // disallow Array constructors - // "no-bitwise": 2, // disallow bitwise operators - // "no-continue": 2, // disallow continue statements - // "no-inline-comments": 2, // disallow inline comments after code - // "no-lonely-if": 2, // disallow if statements as the only statement in else blocks - // "no-mixed-operators": 2, // disallow mixed binary operators - "no-mixed-spaces-and-tabs": 2, // disallow mixed spaces and tabs for indentation - // "no-multi-assign": 2, // disallow use of chained assignment expressions - // "no-multiple-empty-lines": 2, // disallow multiple empty lines - // "no-negated-condition": 2, // disallow negated conditions - // "no-nested-ternary": 2, // disallow nested ternary expressions - // "no-new-object": 2, // disallow Object constructors - // "no-plusplus": 2, // disallow the unary operators ++ and -- - // "no-restricted-syntax": 2, // disallow specified syntax - // "no-tabs": 2, // disallow all tabs - // "no-ternary": 2, // disallow ternary operators - // "no-trailing-spaces": 2, // disallow trailing whitespace at the end of lines - // "no-underscore-dangle": 2, // disallow dangling underscores in identifiers - // "no-unneeded-ternary": 2, // disallow ternary operators when simpler alternatives exist - // "no-whitespace-before-property": 2, // disallow whitespace before properties - // "nonblock-statement-body-position": 2, // enforce the location of single-line statements - // "object-curly-newline": 2, // enforce consistent line breaks inside braces - // "object-curly-spacing": 2, // enforce consistent spacing inside braces - // "object-property-newline": 2, // enforce placing object properties on separate lines - // "one-var": 2, // enforce variables to be declared either together or separately in functions - // "one-var-declaration-per-line": 2, // require or disallow newlines around variable declarations - // "operator-assignment": 2, // require or disallow assignment operator shorthand where possible - // "operator-linebreak": 2, // enforce consistent linebreak style for operators - // "padded-blocks": 2, // require or disallow padding within blocks - // "padding-line-between-statements": 2, // require or disallow padding lines between statements - // "quote-props": 2, // require quotes around object literal property names - // "quotes": 2, // enforce the consistent use of either backticks, double, or single quotes - // "require-jsdoc": 2, // require JSDoc comments - // "semi": 2, // require or disallow semicolons instead of ASI - // "semi-spacing": 2, // enforce consistent spacing before and after semicolons - // "semi-style": 2, // enforce location of semicolons - // "sort-keys": 2, // require object keys to be sorted - // "sort-vars": 2, // require variables within the same declaration block to be sorted - // "space-before-blocks": 2, // enforce consistent spacing before blocks - // "space-before-function-paren": 2, // enforce consistent spacing before function definition opening parenthesis - // "space-in-parens": 2, // enforce consistent spacing inside parentheses - // "space-infix-ops": 2, // require spacing around infix operators - // "space-unary-ops": 2, // enforce consistent spacing before or after unary operators - // "spaced-comment": 2, // enforce consistent spacing after the // or /* in a comment - // "switch-colon-spacing": 2, // enforce spacing around colons of switch statements - // "template-tag-spacing": 2, // require or disallow spacing between template tags and their literals - // "unicode-bom": 2, // require or disallow Unicode byte order mark (BOM) - // "wrap-regex": 2, // require parenthesis around regex literals - // "arrow-body-style": 2, // require braces around arrow function bodies - // "arrow-parens": 2, // require parentheses around arrow function arguments - // "arrow-spacing": 2, // enforce consistent spacing before and after the arrow in arrow functions - "constructor-super": 2, // require super() calls in constructors - // "generator-star-spacing": 2, // enforce consistent spacing around * operators in generator functions - "no-class-assign": 2, // disallow reassigning class members - // "no-confusing-arrow": 2, // disallow arrow functions where they could be confused with comparisons - "no-const-assign": 2, // disallow reassigning const variables - "no-dupe-class-members": 2, // disallow duplicate class members - // "no-duplicate-imports": 2, // disallow duplicate module imports - "no-new-symbol": 2, // disallow new operators with the Symbol object - // "no-restricted-imports": 2, // disallow specified modules when loaded by import - "no-this-before-super": 2, // disallow this/super before calling super() in constructors - // "no-useless-computed-key": 2, // disallow unnecessary computed property keys in object literals - // "no-useless-constructor": 2, // disallow unnecessary constructors - // "no-useless-rename": 2, // disallow renaming import, export, and destructured assignments to the same name - // "no-var": 2, // require let or const instead of var - // "object-shorthand": 2, // require or disallow method and property shorthand syntax for object literals - // "prefer-arrow-callback": 2, // require using arrow functions for callbacks - // "prefer-const": 2, // require const declarations for variables that are never reassigned after declared - // "prefer-destructuring": 2, // require destructuring from arrays and/or objects - // "prefer-numeric-literals": 2, // disallow parseInt() and Number.parseInt() in favor of binary, octal, and hexadecimal literals - // "prefer-rest-params": 2, // require rest parameters instead of arguments - // "prefer-spread": 2, // require spread operators instead of .apply() - // "prefer-template": 2, // require template literals instead of string concatenation - "require-yield": 2, // require generator functions to contain yield - // "rest-spread-spacing": 2, // enforce spacing between rest and spread operators and their expressions - // "sort-imports": 2, // enforce sorted import declarations within modules - // "symbol-description": 2, // require symbol descriptions - // "template-curly-spacing": 2, // require or disallow spacing around embedded expressions of template strings - // "yield-star-spacing": 2, // require or disallow spacing around the * in yield* expressions +const defaultConfig = { + parserOptions: { + ecmaVersion: 8, // only for default eslint parser + sourceType: "module", + ecmaFeatures: { + jsx: true, + modules: true, + experimentalObjectRestSpread: true // only for default eslint parser } + }, + env: { + browser: true, + node: false, + amd: false, + mocha: true, + jasmine: false, + es6: true + }, + globals: { + lively: true, + aexpr: false, + ae: false, + lively4url: true, + System: true, + SystemJS: true, + CodeMirror: true, + a: true, + b: true, + _: true, + runZoned: true, + Zone: true, + + // gs support + gs: true, + me: true, + allies: true, + enemies: true, + fallen: true, + attack: true, + defend: true, + skill: true, + item: true, + editorHistory: true, + input: true, + tsMorph: true, + }, + //extends: "eslint:recommended", // seems not to work + rules: { + // https://eslint.org/docs/rules/ + // generated using: + // Array.from(this.querySelectorAll("tr")).map(tr => { + // const ok = !!tr.querySelector(".glyphicon-ok"); + // const children = Array.from(tr.querySelectorAll("p")); + // const label = children[0].textContent + // const comment = children[1].textContent + // return `${ok ? "" : "//"} "${label}": ["error"], // ${comment}` + // }).join("\n"); + + // "for-direction": 2, // enforce “for” loop update clause moving the counter in the right direction. + // "getter-return": 2, // enforce return statements in getters + // "no-await-in-loop": 2, // disallow await inside of loops + "no-compare-neg-zero": 2, // disallow comparing against -0 + "no-cond-assign": 2, // disallow assignment operators in conditional expressions + "no-console": [1, { allow: ["warn", "error"] }], // disallow the use of console + "no-constant-condition": 2, // disallow constant expressions in conditions + "no-control-regex": 2, // disallow control characters in regular expressions + "no-debugger": 2, // disallow the use of debugger + "no-dupe-args": 2, // disallow duplicate arguments in function definitions + "no-dupe-keys": 2, // disallow duplicate keys in object literals + "no-duplicate-case": 2, // disallow duplicate case labels + "no-empty": 2, // disallow empty block statements + "no-empty-character-class": 2, // disallow empty character classes in regular expressions + "no-ex-assign": 2, // disallow reassigning exceptions in catch clauses + "no-extra-boolean-cast": 2, // disallow unnecessary boolean casts + // "no-extra-parens": 2, // disallow unnecessary parentheses + "no-extra-semi": 2, // disallow unnecessary semicolons + "no-func-assign": 2, // disallow reassigning function declarations + "no-inner-declarations": 2, // disallow variable or function declarations in nested blocks + "no-invalid-regexp": 2, // disallow invalid regular expression strings in RegExp constructors + "no-irregular-whitespace": 2, // disallow irregular whitespace outside of strings and comments + "no-obj-calls": 2, // disallow calling global object properties as functions + // "no-prototype-builtins": 2, // disallow calling some Object.prototype methods directly on objects + "no-regex-spaces": 2, // disallow multiple spaces in regular expressions + "no-sparse-arrays": 2, // disallow sparse arrays + // "no-template-curly-in-string": 2, // disallow template literal placeholder syntax in regular strings + "no-unexpected-multiline": 2, // disallow confusing multiline expressions + "no-unreachable": 2, // disallow unreachable code after return, throw, continue, and break statements + "no-unsafe-finally": 2, // disallow control flow statements in finally blocks + "no-unsafe-negation": 2, // disallow negating the left operand of relational operators + "use-isnan": 2, // require calls to isNaN() when checking for NaN + // "valid-jsdoc": 2, // enforce valid JSDoc comments + "valid-typeof": 2, // enforce comparing typeof expressions against valid strings + // "accessor-pairs": 2, // enforce getter and setter pairs in objects + // "array-callback-return": 2, // enforce return statements in callbacks of array methods + // "block-scoped-var": 2, // enforce the use of variables within the scope they are defined + // "class-methods-use-this": 2, // enforce that class methods utilize this + // "complexity": 2, // enforce a maximum cyclomatic complexity allowed in a program + // "consistent-return": 2, // require return statements to either always or never specify values + // "curly": 2, // enforce consistent brace style for all control statements + // "default-case": 2, // require default cases in switch statements + // "dot-location": 2, // enforce consistent newlines before and after dots + // "dot-notation": 2, // enforce dot notation whenever possible + // "eqeqeq": 2, // require the use of === and !== + // "guard-for-in": 2, // require for-in loops to include an if statement + // "no-alert": 2, // disallow the use of alert, confirm, and prompt + // "no-caller": 2, // disallow the use of arguments.caller or arguments.callee + "no-case-declarations": 2, // disallow lexical declarations in case clauses + // "no-div-regex": 2, // disallow division operators explicitly at the beginning of regular expressions + // "no-else-return": 2, // disallow else blocks after return statements in if statements + // "no-empty-function": 2, // disallow empty functions + "no-empty-pattern": 2, // disallow empty destructuring patterns + // "no-eq-null": 2, // disallow null comparisons without type-checking operators + // "no-eval": 2, // disallow the use of eval() + // "no-extend-native": 2, // disallow extending native types + // "no-extra-bind": 2, // disallow unnecessary calls to .bind() + // "no-extra-label": 2, // disallow unnecessary labels + "no-fallthrough": 2, // disallow fallthrough of case statements + // "no-floating-decimal": 2, // disallow leading or trailing decimal points in numeric literals + "no-global-assign": 2, // disallow assignments to native objects or read-only global variables + // "no-implicit-coercion": 2, // disallow shorthand type conversions + // "no-implicit-globals": 2, // disallow variable and function declarations in the global scope + // "no-implied-eval": 2, // disallow the use of eval()-like methods + // "no-invalid-this": 2, // disallow this keywords outside of classes or class-like objects + // "no-iterator": 2, // disallow the use of the __iterator__ property + // "no-labels": 2, // disallow labeled statements + // "no-lone-blocks": 2, // disallow unnecessary nested blocks + // "no-loop-func": 2, // disallow function declarations and expressions inside loop statements + // "no-magic-numbers": 2, // disallow magic numbers + // "no-multi-spaces": 2, // disallow multiple spaces + // "no-multi-str": 2, // disallow multiline strings + // "no-new": 2, // disallow new operators outside of assignments or comparisons + // "no-new-func": 2, // disallow new operators with the Function object + // "no-new-wrappers": 2, // disallow new operators with the String, Number, and Boolean objects + "no-octal": 2, // disallow octal literals + // "no-octal-escape": 2, // disallow octal escape sequences in string literals + // "no-param-reassign": 2, // disallow reassigning function parameters + // "no-proto": 2, // disallow the use of the __proto__ property + "no-redeclare": 2, // disallow variable redeclaration + // "no-restricted-properties": 2, // disallow certain properties on certain objects + // "no-return-assign": 2, // disallow assignment operators in return statements + // "no-return-await": 2, // disallow unnecessary return await + // "no-script-url": 2, // disallow javascript: urls + "no-self-assign": 2, // disallow assignments where both sides are exactly the same + // "no-self-compare": 2, // disallow comparisons where both sides are exactly the same + // "no-sequences": 2, // disallow comma operators + "no-throw-literal": 1, // disallow throwing literals as exceptions + // "no-unmodified-loop-condition": 2, // disallow unmodified loop conditions + // "no-unused-expressions": 2, // disallow unused expressions + "no-unused-labels": 0, // disallow unused labels + // "no-useless-call": 2, // disallow unnecessary calls to .call() and .apply() + // "no-useless-concat": 2, // disallow unnecessary concatenation of literals or template literals + "no-useless-escape": 1, // disallow unnecessary escape characters + // "no-useless-return": 2, // disallow redundant return statements + // "no-void": 2, // disallow void operators + // "no-warning-comments": 2, // disallow specified warning terms in comments + "no-with": 1, // disallow with statements + // "prefer-promise-reject-errors": 2, // require using Error objects as Promise rejection reasons + // "radix": 2, // enforce the consistent use of the radix argument when using parseInt() + // "require-await": 2, // disallow async functions which have no await expression + // "vars-on-top": 2, // require var declarations be placed at the top of their containing scope + // "wrap-iife": 2, // require parentheses around immediate function invocations + // "yoda": 2, // require or disallow “Yoda” conditions + // "strict": 2, // require or disallow strict mode directives + // "init-declarations": 2, // require or disallow initialization in variable declarations + // "no-catch-shadow": 2, // disallow catch clause parameters from shadowing variables in the outer scope + "no-delete-var": 2, // disallow deleting variables + // "no-label-var": 2, // disallow labels that share a name with a variable + // "no-restricted-globals": 2, // disallow specified global variables + // "no-shadow": 2, // disallow variable declarations from shadowing variables declared in the outer scope + // "no-shadow-restricted-names": 2, // disallow identifiers from shadowing restricted names + "no-undef": 2, // disallow the use of undeclared variables unless mentioned in /*global */ comments + // "no-undef-init": 2, // disallow initializing variables to undefined + // "no-undefined": 2, // disallow the use of undefined as an identifier + "no-unused-vars": 1, // disallow unused variables + // "no-use-before-define": 2, // disallow the use of variables before they are defined + // "callback-return": 2, // require return statements after callbacks + // "global-require": 2, // require require() calls to be placed at top-level module scope + // "handle-callback-err": 2, // require error handling in callbacks + // "no-buffer-constructor": 2, // disallow use of the Buffer() constructor + // "no-mixed-requires": 2, // disallow require calls to be mixed with regular variable declarations + // "no-new-require": 2, // disallow new operators with calls to require + // "no-path-concat": 2, // disallow string concatenation with __dirname and __filename + // "no-process-env": 2, // disallow the use of process.env + // "no-process-exit": 2, // disallow the use of process.exit() + // "no-restricted-modules": 2, // disallow specified modules when loaded by require + // "no-sync": 2, // disallow synchronous methods + // "array-bracket-newline": 2, // enforce linebreaks after opening and before closing array brackets + // "array-bracket-spacing": 2, // enforce consistent spacing inside array brackets + // "array-element-newline": 2, // enforce line breaks after each array element + // "block-spacing": 2, // disallow or enforce spaces inside of blocks after opening block and before closing block + // "brace-style": 2, // enforce consistent brace style for blocks + // "camelcase": 2, // enforce camelcase naming convention + // "capitalized-comments": 2, // enforce or disallow capitalization of the first letter of a comment + // "comma-dangle": 2, // require or disallow trailing commas + // "comma-spacing": 2, // enforce consistent spacing before and after commas + // "comma-style": 2, // enforce consistent comma style + // "computed-property-spacing": 2, // enforce consistent spacing inside computed property brackets + // "consistent-this": 2, // enforce consistent naming when capturing the current execution context + // "eol-last": 2, // require or disallow newline at the end of files + // "func-call-spacing": 2, // require or disallow spacing between function identifiers and their invocations + // "func-name-matching": 2, // require function names to match the name of the variable or property to which they are assigned + // "func-names": 2, // require or disallow named function expressions + // "func-style": 2, // enforce the consistent use of either function declarations or expressions + // "function-paren-newline": 2, // enforce consistent line breaks inside function parentheses + // "id-blacklist": 2, // disallow specified identifiers + // "id-length": 2, // enforce minimum and maximum identifier lengths + // "id-match": 2, // require identifiers to match a specified regular expression + // "implicit-arrow-linebreak": 2, // enforce the location of arrow function bodies + // "indent": 2, // enforce consistent indentation + // "jsx-quotes": 2, // enforce the consistent use of either double or single quotes in JSX attributes + // "key-spacing": 2, // enforce consistent spacing between keys and values in object literal properties + // "keyword-spacing": 2, // enforce consistent spacing before and after keywords + // "line-comment-position": 2, // enforce position of line comments + // "linebreak-style": 2, // enforce consistent linebreak style + // "lines-around-comment": 2, // require empty lines around comments + // "lines-between-class-members": 2, // require or disallow an empty line between class members + // "max-depth": 2, // enforce a maximum depth that blocks can be nested + // "max-len": 2, // enforce a maximum line length + // "max-lines": 2, // enforce a maximum number of lines per file + // "max-nested-callbacks": 2, // enforce a maximum depth that callbacks can be nested + // "max-params": 2, // enforce a maximum number of parameters in function definitions + // "max-statements": 2, // enforce a maximum number of statements allowed in function blocks + // "max-statements-per-line": 2, // enforce a maximum number of statements allowed per line + // "multiline-comment-style": 2, // enforce a particular style for multiline comments + // "multiline-ternary": 2, // enforce newlines between operands of ternary expressions + // "new-cap": 2, // require constructor names to begin with a capital letter + // "new-parens": 2, // require parentheses when invoking a constructor with no arguments + // "newline-per-chained-call": 2, // require a newline after each call in a method chain + // "no-array-constructor": 2, // disallow Array constructors + // "no-bitwise": 2, // disallow bitwise operators + // "no-continue": 2, // disallow continue statements + // "no-inline-comments": 2, // disallow inline comments after code + // "no-lonely-if": 2, // disallow if statements as the only statement in else blocks + // "no-mixed-operators": 2, // disallow mixed binary operators + "no-mixed-spaces-and-tabs": 2, // disallow mixed spaces and tabs for indentation + // "no-multi-assign": 2, // disallow use of chained assignment expressions + // "no-multiple-empty-lines": 2, // disallow multiple empty lines + // "no-negated-condition": 2, // disallow negated conditions + // "no-nested-ternary": 2, // disallow nested ternary expressions + // "no-new-object": 2, // disallow Object constructors + // "no-plusplus": 2, // disallow the unary operators ++ and -- + // "no-restricted-syntax": 2, // disallow specified syntax + // "no-tabs": 2, // disallow all tabs + // "no-ternary": 2, // disallow ternary operators + // "no-trailing-spaces": 2, // disallow trailing whitespace at the end of lines + // "no-underscore-dangle": 2, // disallow dangling underscores in identifiers + // "no-unneeded-ternary": 2, // disallow ternary operators when simpler alternatives exist + // "no-whitespace-before-property": 2, // disallow whitespace before properties + // "nonblock-statement-body-position": 2, // enforce the location of single-line statements + // "object-curly-newline": 2, // enforce consistent line breaks inside braces + // "object-curly-spacing": 2, // enforce consistent spacing inside braces + // "object-property-newline": 2, // enforce placing object properties on separate lines + // "one-var": 2, // enforce variables to be declared either together or separately in functions + // "one-var-declaration-per-line": 2, // require or disallow newlines around variable declarations + // "operator-assignment": 2, // require or disallow assignment operator shorthand where possible + // "operator-linebreak": 2, // enforce consistent linebreak style for operators + // "padded-blocks": 2, // require or disallow padding within blocks + // "padding-line-between-statements": 2, // require or disallow padding lines between statements + // "quote-props": 2, // require quotes around object literal property names + // "quotes": 2, // enforce the consistent use of either backticks, double, or single quotes + // "require-jsdoc": 2, // require JSDoc comments + // "semi": 2, // require or disallow semicolons instead of ASI + // "semi-spacing": 2, // enforce consistent spacing before and after semicolons + // "semi-style": 2, // enforce location of semicolons + // "sort-keys": 2, // require object keys to be sorted + // "sort-vars": 2, // require variables within the same declaration block to be sorted + // "space-before-blocks": 2, // enforce consistent spacing before blocks + // "space-before-function-paren": 2, // enforce consistent spacing before function definition opening parenthesis + // "space-in-parens": 2, // enforce consistent spacing inside parentheses + // "space-infix-ops": 2, // require spacing around infix operators + // "space-unary-ops": 2, // enforce consistent spacing before or after unary operators + // "spaced-comment": 2, // enforce consistent spacing after the // or /* in a comment + // "switch-colon-spacing": 2, // enforce spacing around colons of switch statements + // "template-tag-spacing": 2, // require or disallow spacing between template tags and their literals + // "unicode-bom": 2, // require or disallow Unicode byte order mark (BOM) + // "wrap-regex": 2, // require parenthesis around regex literals + // "arrow-body-style": 2, // require braces around arrow function bodies + // "arrow-parens": 2, // require parentheses around arrow function arguments + // "arrow-spacing": 2, // enforce consistent spacing before and after the arrow in arrow functions + "constructor-super": 2, // require super() calls in constructors + // "generator-star-spacing": 2, // enforce consistent spacing around * operators in generator functions + "no-class-assign": 2, // disallow reassigning class members + // "no-confusing-arrow": 2, // disallow arrow functions where they could be confused with comparisons + "no-const-assign": 2, // disallow reassigning const variables + "no-dupe-class-members": 2, // disallow duplicate class members + // "no-duplicate-imports": 2, // disallow duplicate module imports + "no-new-symbol": 2, // disallow new operators with the Symbol object + // "no-restricted-imports": 2, // disallow specified modules when loaded by import + "no-this-before-super": 2, // disallow this/super before calling super() in constructors + // "no-useless-computed-key": 2, // disallow unnecessary computed property keys in object literals + // "no-useless-constructor": 2, // disallow unnecessary constructors + // "no-useless-rename": 2, // disallow renaming import, export, and destructured assignments to the same name + // "no-var": 2, // require let or const instead of var + // "object-shorthand": 2, // require or disallow method and property shorthand syntax for object literals + // "prefer-arrow-callback": 2, // require using arrow functions for callbacks + // "prefer-const": 2, // require const declarations for variables that are never reassigned after declared + // "prefer-destructuring": 2, // require destructuring from arrays and/or objects + // "prefer-numeric-literals": 2, // disallow parseInt() and Number.parseInt() in favor of binary, octal, and hexadecimal literals + // "prefer-rest-params": 2, // require rest parameters instead of arguments + // "prefer-spread": 2, // require spread operators instead of .apply() + // "prefer-template": 2, // require template literals instead of string concatenation + "require-yield": 2, // require generator functions to contain yield + // "rest-spread-spacing": 2, // enforce spacing between rest and spread operators and their expressions + // "sort-imports": 2, // enforce sorted import declarations within modules + // "symbol-description": 2, // require symbol descriptions + // "template-curly-spacing": 2, // require or disallow spacing around embedded expressions of template strings + // "yield-star-spacing": 2, // require or disallow spacing around the * in yield* expressions } - - function validator(text, options) { - - var result = [], config = defaultConfig; - var linter = new eslint(); - linter.defineParser("babel-parser", {parse}); - config.parser = "babel-parser"; - try { - var errors = linter.verify(text, config); - - // lively.notify("validator ", text.slice(0,100), 2000, () => lively.openInspector(errors)) - - } catch(err) { - lively.warn("BUG error during linting ") - // console.error("ESLINT ERROR during linting", err, "source: " + text) - errors = [] - } - - for (var i = 0; i < errors.length; i++) { - var error = errors[i]; - result.push({message: error.message, - severity: getSeverity(error), - from: getPos(error, true) , - to: getPos(error, false)}); - } - return result; - } +} - CodeMirror.registerHelper("lint", "javascript", validator); +export function validator(text, options) { + var result = [], config = defaultConfig; + var linter = new eslint(); + linter.defineParser("babel-parser", {parse}); + config.parser = "babel-parser"; + try { + var errors = linter.verify(text, config); - function getPos(error, from) { - if (error.line === undefined) return CodeMirror.Pos(0, 0) - - var line = error.line-1, ch = from ? error.column : error.column+1; - if (error.node && error.node.loc) { - line = from ? error.node.loc.start.line -1 : error.node.loc.end.line -1; - ch = from ? error.node.loc.start.column : error.node.loc.end.column; - } - return CodeMirror.Pos(line, ch); + // lively.notify("validator ", text.slice(0,100), 2000, () => lively.openInspector(errors)) + + } catch(err) { + lively.warn("BUG error during linting ") + // console.error("ESLINT ERROR during linting", err, "source: " + text) + errors = [] } - - function getSeverity(error) { - switch(error.severity) { - case 1: - return "warning"; - case 2: - return "error"; - default: - return "error"; - } + + for (var i = 0; i < errors.length; i++) { + var error = errors[i]; + result.push({message: error.message, + severity: getSeverity(error), + from: getPos(error, true) , + to: getPos(error, false)}); } -})(CodeMirror); + return result; +} + +CodeMirror.registerHelper("lint", "javascript", validator); + +function getPos(error, from) { + if (error.line === undefined) return CodeMirror.Pos(0, 0) + + var line = error.line-1, ch = from ? error.column : error.column+1; + if (error.node && error.node.loc) { + line = from ? error.node.loc.start.line -1 : error.node.loc.end.line -1; + ch = from ? error.node.loc.start.column : error.node.loc.end.column; + } + return CodeMirror.Pos(line, ch); +} + +function getSeverity(error) { + switch(error.severity) { + case 1: + return "warning"; + case 2: + return "error"; + default: + return "error"; + } +} + + + + diff --git a/src/external/htmlmixed-lint.js b/src/external/htmlmixed-lint.js new file mode 100644 index 000000000..7b1ad7e6d --- /dev/null +++ b/src/external/htmlmixed-lint.js @@ -0,0 +1,173 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others, +// Initial htmlmixed-lint.js from István Király, https://github.com/LaKing +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Depends on htmlhint jshint and csshint + +(function (mod) { + if (typeof exports == "object" && typeof module == "object") + // CommonJS + mod(require("../../lib/codemirror"), require("htmlhint")); + else if (typeof define == "function" && define.amd) + // AMD + define(["../../lib/codemirror", "htmlhint"], mod); + // Plain browser env + else mod(CodeMirror, window.HTMLHint); +})(function (CodeMirror, HTMLHint) { + "use strict"; + + var defaultRules = { + "tagname-lowercase": true, + "attr-lowercase": true, + "attr-value-double-quotes": true, + "doctype-first": false, + "tag-pair": true, + "spec-char-escape": true, + "id-unique": true, + "src-not-empty": true, + "attr-no-duplication": true, + }; + + CodeMirror.registerHelper("lint", "html", function (text, options) { + // dependency verification + // htmllint + var found = []; + if (HTMLHint && !HTMLHint.verify) { + if (typeof HTMLHint.default !== "undefined") { + HTMLHint = HTMLHint.default; + console.log("HTMLHint default"); + } else { + HTMLHint = HTMLHint.HTMLHint; + console.log("HTMLHint else"); + } + } + if (!HTMLHint) HTMLHint = window.HTMLHint; + if (!HTMLHint) { + if (window.console) { + window.console.error("Error: window.HTMLHint not found, CodeMirror HTML mixed linting cannot run."); + } + return found; + } + // csslint + if (!window.CSSLint) { + if (window.console) { + window.console.error("Error: window.CSSLint not defined, CodeMirror HTML mixed linting cannot run."); + } + return found; + } + // jshint + if (!window.JSHINT) { + if (window.console) { + window.console.error("Error: window.JSHINT not defined, CodeMirror HTML mixed linting cannot run."); + } + return []; + } + if (!options.indent) + // JSHint error.character actually is a column index, this fixes underlining on lines using tabs for indentation + options.indent = 1; // JSHint default value is 4 + + // external linters may modify the options object, so for example CSSLinter adds options.errors, but then JSLint complains that it is not a valid option + // let us add an additional layer in case we want to define linter-specific option via options, otherwise take clones of the defualt options object + var CSSoptions = options.css || JSON.parse(JSON.stringify(options)); + var JSoptions = options.js || JSON.parse(JSON.stringify(options)); + var HTMLoptions = options.html || JSON.parse(JSON.stringify(options)); + + // our JS error parser is extended with the offset argument + function parseErrors(errors, output, offset) { + for (var i = 0; i < errors.length; i++) { + var error = errors[i]; + if (error) { + if (error.line <= 0) { + if (window.console) { + window.console.warn("Cannot display JSHint error (invalid line " + error.line + ")", error); + } + continue; + } + + var start = error.character - 1, + end = start + 1; + if (error.evidence) { + var index = error.evidence.substring(start).search(/.\b/); + if (index > -1) { + end += index; + } + } + + var line = error.line - 1 + offset - 1; + // Convert to format expected by validation service + var hint = { + message: error.reason, + severity: error.code ? (error.code.startsWith("W") ? "warning" : "error") : "error", + from: CodeMirror.Pos(line, start), + to: CodeMirror.Pos(line, end), + }; + + output.push(hint); + } + } + } + + function newlines(str) { + return str.split("\n").length; + } + + function processHTML(text, options, found) { + var messages = HTMLHint.verify(text, (options && options.rules) || defaultRules); + for (var i = 0; i < messages.length; i++) { + var message = messages[i]; + var startLine = message.line - 1, + endLine = message.line - 1, + startCol = message.col - 1, + endCol = message.col; + found.push({ + from: CodeMirror.Pos(startLine, startCol), + to: CodeMirror.Pos(endLine, endCol), + message: message.message, + severity: message.type, + }); + } + } + + processHTML(text, HTMLoptions, found); + + function processCSS(text, options, found) { + var blocks = text.split(/|<\/style>/gi); + for (var j = 1; j < blocks.length; j += 2) { + var offset = newlines(blocks.slice(0, j).join()); + var results = CSSLint.verify(blocks[j], options); + var messages = results.messages; + var message = null; + for (var i = 0; i < messages.length; i++) { + message = messages[i]; + var startLine = offset - 1 + message.line - 1, + endLine = offset - 1 + message.line - 1, + startCol = message.col - 1, + endCol = message.col; + found.push({ + from: CodeMirror.Pos(startLine, startCol), + to: CodeMirror.Pos(endLine, endCol), + message: message.message, + severity: message.type, + }); + } + } + } + + processCSS(text, CSSoptions, found); + + function processJS(text, options, found) { + var blocks = text.split(/|<\/script>/gi); + for (var j = 1; j < blocks.length; j += 2) { + if (blocks[j].length > 1) { + JSHINT(blocks[j], options, options.globals); + var errors = JSHINT.data().errors; + if (errors) parseErrors(errors, found, newlines(blocks.slice(0, j).join())); + } + } + } + + processJS(text, JSoptions, found); + + return found; + }); +}); \ No newline at end of file From 50fcb271e03f9270e8634f09d4c38ef213a92260 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Mon, 27 May 2024 14:33:00 +0200 Subject: [PATCH 12/47] javascript linting in script tags now with context SQUASHED: AUTO-COMMIT-demos-markdown-test.md,AUTO-COMMIT-src-components-widgets-lively-code-mirror-lint.js, --- demos/markdown/test.md | 16 ++++++++++++ .../widgets/lively-code-mirror-lint.js | 25 +++++++++++++------ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/demos/markdown/test.md b/demos/markdown/test.md index ddfd20f76..58ec89863 100644 --- a/demos/markdown/test.md +++ b/demos/markdown/test.md @@ -4,6 +4,22 @@ var foo = 3 + + + + + + + \ No newline at end of file diff --git a/src/components/widgets/lively-code-mirror-lint.js b/src/components/widgets/lively-code-mirror-lint.js index bb0b77f04..7091e8bcb 100644 --- a/src/components/widgets/lively-code-mirror-lint.js +++ b/src/components/widgets/lively-code-mirror-lint.js @@ -1,6 +1,5 @@ import { validator } from "src/external/eslint/eslint-lint.js" - CodeMirror.registerHelper("lint", "markdown", function(text, options) { var found = []; @@ -9,18 +8,30 @@ CodeMirror.registerHelper("lint", "markdown", function(text, options) { } function processJS(text, options, found) { + var blocks = text.split(/|<\/script>/gi); + let fullCode = "" + let offsets = [{line: -1, offset: 0}] + for (var j = 1; j < blocks.length; j += 2) { var offset = newlines(blocks.slice(0, j).join()); let content = blocks[j] - var jsFound = validator(content, options) - for (let message of jsFound) { - message.from.line += offset - 1 - message.to.line += offset - 1 - } - found.push(...jsFound) + offsets.push({line: newlines(fullCode), offset: offset}) + fullCode += content + } + var jsFound = validator(fullCode, options) + + // we want to search from behind + offsets.reverse() + + for (let message of jsFound) { + let offset = offsets.find(ea => (ea.line) <= message.from.line) + + message.from.line += offset.offset - offset.line + message.to.line += offset.offset - offset.line } + found.push(...jsFound) } processJS(text, {}, found); return found; From e1d661454b5851cea69acec31a66204b4d20b199 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Mon, 27 May 2024 14:45:41 +0200 Subject: [PATCH 13/47] disabled minimize, because UX is bad SQUASHED: AUTO-COMMIT-src-components-widgets-lively-window.html, --- src/components/widgets/lively-window.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/components/widgets/lively-window.html b/src/components/widgets/lively-window.html index c0e7e47ea..309d0e74a 100644 --- a/src/components/widgets/lively-window.html +++ b/src/components/widgets/lively-window.html @@ -267,6 +267,11 @@ lively-resizer { /* z-index: 10000; */ } + + .window-min { + display: none; /* disabled minimize, because UX is bad */ + } + From 567c72bed520a3895658008cd055566c0d88a2c2 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Tue, 28 May 2024 12:28:37 +0200 Subject: [PATCH 14/47] jsx syntax highlighting support in markdown script tags SQUASHED: AUTO-COMMIT-demos-markdown-test2.html,AUTO-COMMIT-demos-markdown-test2.md,AUTO-COMMIT-demos-markdown-test.html,AUTO-COMMIT-demos-markdown-test.md,AUTO-COMMIT-doc-files-index.md,AUTO-COMMIT-doc-journal-2024-05-28.md-debuggingSession.png,AUTO-COMMIT-doc-journal-2024-05-28.md-index.md,AUTO-COMMIT-src-components-widgets-lively-code-mirror.js,AUTO-COMMIT-src-external-code-mirror-addon-lint-html-lint.js,AUTO-COMMIT-src-external-code-mirror-mode-markdown-markdown.js, --- demos/markdown/test.html | 12 +- demos/markdown/test.md | 13 + demos/markdown/test2.html | 3 + demos/markdown/test2.md | 3 + doc/files/index.md | 129 +-- .../2024-05-28.md/debuggingSession.png | Bin 0 -> 1442718 bytes doc/journal/2024-05-28.md/index.md | 999 ++++++++++++++++++ src/components/widgets/lively-code-mirror.js | 1 + .../code-mirror/addon/lint/html-lint.js | 1 - .../code-mirror/mode/markdown/markdown.js | 21 +- 10 files changed, 1096 insertions(+), 86 deletions(-) create mode 100644 demos/markdown/test2.html create mode 100644 demos/markdown/test2.md create mode 100644 doc/journal/2024-05-28.md/debuggingSession.png create mode 100644 doc/journal/2024-05-28.md/index.md diff --git a/demos/markdown/test.html b/demos/markdown/test.html index 38c17d6bf..69b4361d8 100644 --- a/demos/markdown/test.html +++ b/demos/markdown/test.html @@ -1,9 +1,13 @@ -

        - -

        +

        Hello

        - + + \ No newline at end of file diff --git a/demos/markdown/test.md b/demos/markdown/test.md index 58ec89863..b02e42b71 100644 --- a/demos/markdown/test.md +++ b/demos/markdown/test.md @@ -22,4 +22,17 @@ for(let x; x < 5; x++) { } + + + + + \ No newline at end of file diff --git a/demos/markdown/test2.html b/demos/markdown/test2.html new file mode 100644 index 000000000..e256771fb --- /dev/null +++ b/demos/markdown/test2.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/demos/markdown/test2.md b/demos/markdown/test2.md new file mode 100644 index 000000000..19df87d31 --- /dev/null +++ b/demos/markdown/test2.md @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/doc/files/index.md b/doc/files/index.md index 67160764a..cc44f776d 100644 --- a/doc/files/index.md +++ b/doc/files/index.md @@ -10,96 +10,79 @@ - - diff --git a/doc/journal/2024-05-28.md/debuggingSession.png b/doc/journal/2024-05-28.md/debuggingSession.png new file mode 100644 index 0000000000000000000000000000000000000000..26d2f95e97f88de01b540b2debf671ee65c78963 GIT binary patch literal 1442718 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

        OkhgS!{KcxJ)6imW6eeA zt}~{+cfK>3{BQbv%6C;Y!!R@BhKpeEpS5)m-heJLZ$P6!@Z=Sf_Mb&0&iE-YCZXhUCa}6TZaFoe_MI)>5VK`K+q!l+)8Ipriepf;lF8hf(}G-x5(` zi=ntlBQdB^cZRtKl)1->bh0sl{<f1Fi7LLL?eEV zu_{*_R)JoJ!Ce=z(Zu^|wK!AT8WX{{dlv(R`Q99MKhgLN6^ zWF>S1dwmfiqs|t7esk$E)D7>UIL!A7ih27#?a$JiIR6%#Q~QWA!UCGWK*fzr6wP z#;tZsQ-3Qmis$O;`8wFV4mF)LRLmYP4=~!n=$9}e9S)&yJD!2q(X3h-cWv#BrDoIQ zO3ig64OqanF@dhguY{pBuJ!9S=A|vd0kZQIyAA9-fChqDYVC*+W{dC;>It(fEu;}E zyjgthks3GwW%dA=WTZAZv#iy`j|m)ahOFzIJelxTW+$tO4b)Hz z@nKWoTz}tkVyzl{obeK-|H=h@R2O^92{WeE@ntr=7ZwVL^?;eFdunZBG=29V@M<=_ z_B&3~7%JUvTeKqFY@cqtf)$_>v0M&RquA3ySV^&PN?Ks_LZl`1Nt&adJu=DN48ptQ z$R09cTAPrVsBAiAPgA>QN`sF~?tM@z+_J1iwg8mc-m7iC~BO?2%4-Ziwx zU!)0v-Z27;=HB$3JCsi_cAeV|CL_NwghLOiEQ*FY8$au(3!aS9hW1O_!4N%^iHj2+ zncHtvwr7@DgYLZWiJeo(Z!g9h=rxx3DbPY-F(IcAdDDory+XnH1E%@R$|IL#bySWiCNwD&NEj`!BoyR~|1Q6*z>w^+Q>pyB(<@xUD|dF^ zQu#lQX3RZ58AnL&@3S~rNAZ4Zsq9Qm4kO%Ug?P9d3j9gCrlBK_yg#jnXs4T2P6$1Y zyx?BdP)I2x#$y~Mk#W)q!yAZnynJ27u8-Ue;dcLnte3VwGTnS^3gBLKjUS0mJOJKo zSeq#{v#N_71hG!UXWNXA)Ph|khnSeI3v;B{Oi$FC85`l?JViO1sg)YHG+~reR3*#JSThnz6P;Ck{7PN1_lOU#}W7bdM-RS76;yG-j`s~ zJ}p!$9s#yP%@>c|+bXPW0#D^9{ZA8pZ9Okd!LX)?{AS$$mrJuRG*e7OJDhR$h}F|L^SJyI==SU zYyj9qH*)R<$WLBaiq zLwA`Suq{82f&(OCY3$;}Y_Fbh)5*AQtvu~6zizWV>#{g&GrVXsJZZB%Y0E$TMgM@g zn!{PefJjHL0JAXPJ>=2jxm1($L|^uSK#YfAZhGQD-jxU8Z0#^sn*L;E2JMI4-(0fM z;AkWxBR9?mS0Tbui$k>1lXQjSj*y%1_kJu+_;Pv5L&+*ZO;J)VQeYC1yVQAdWOIi` z8A7`x1fs;ucdQ}rhxzfxn&xuU1Un=uqgbqbo2l^uU0~yp>Oo~-T0(n?36&l^yBryJ zVxp5!vInM+0)+~TFl2My-TCq9kcFeLIDMJ-+G?#dWWMyLh)_$Mb29xD923r4f(-HW z0#)jNIhac#eu-%b+!$yNAB~Fq=elVWX6V&8A?mEM|CQcaq${#w%~klEX-@O?nh8v1 zDY8mV{ikH_lo6Q7TK#H~tBK_RFdVD9aH$IQu9Gt0KR`lF!(yG|5FLr8_X=k^go}@f zTiql0OYOGve{56@Tc)P&rIUVY(KRcUqqakjaepW8?tAK$GIQ^w zdUX5v2V#k61A-3*cS3KD5GUr!pd&N!nsC3bbE*46)oi7 zy%pF2N_c@`;XxM3X@~*e`wP4Lv*G7hh^KjcATJ-Z!&`bL1y=%~O!M09OBB*|`!PM6+<#jGH+C0f~ycWxYr*o0n zfk(+vfZJNPCuW^Cj`VRh=b5MfWgDl&J4k%|VKLBHuSso{B)>39c|BI_W|HVuTw9i# zW0|AIPHX&FKgx3|7HwVNYSd`yzVmc4^Sob(F?VbEY8)-1##vmJtHv%@fm?#^rdqEh zOka|;L{-clF=|O7M@RLU$~a?j{PU zRD)q2!!1*kxuz*{D@J4Q4FHFNaZk6dmx<_4{i^{-Q*U|d-h?h@#FV(tj#j7&AWa64 zV(b?t$F*gZsf?5tqq#}I^bioVvvR2LbN{6z_%9h*op#u&l)|cnf(8T7VnQ0i8X;1# zn|T<<)lG4f29r~<-=-B)anwrVT)Eq}Cbq|r+B$CEWOZBa#z0@8l$V2m{d{efiQXg& zy%}EN>OU%fogFakDdy?}Z1sAiam{wA5{jhm9mU*d6NZ=iV;{}??g6xB#cQ;4Q2uzVl?SJ(KRGecTkEWK$z<`S z7A0jSXbU{9C#hS^nbYhvXjrN+Pg3vL;x9rBstwy#Mh^hzZ7EIo^Bp?#p4}e&%dHt! zI@C;6M|dfB&iOj>#ER#PEKmrKUwpd6(?6$}#l+j;ywjomwv3qUnByv*OeW(_=gI5= z?dEk98f?*i75!v9&#Zi07>T=@gl>GI!xp2DrE22e@Aj$o??FsonX<+`?zb zzF==*9glLw4x?cYtoI?0@q)7eZlQuGH3H2x5oLkgC7tWfYrKaNbtu@nqMQkzc(OYRKc?|8rSv_vBeWcd!)ta zEPCZ$;^Nxw5v9@dUHjzARIw)w7k!>|vKv0!tuvX>iXs$mQxvJX&vO|pjRCg7n{`O;MHKqP?o1W@^P5F(wYBeYO%Q^1w{f`fikaG|6$MUuN_O<(x zwa@l7js?S9Uz0g1InU%tmh;+a-i!M*8_W=DGlFK#4ij8f8hWjCaZ*-B86sAOLiKd8}_bTq#*!H(A!$Sci084@>twD`rbuDX`vYbGhf86a98ssgw{X{;9~W|1 zH2JPZ4iIQ3$Ms4=`?QPe00?gt_{B{o_*IM*`6bLa>x9tQV^7;5rsX&Z)8Fp|b z<&wxQ;O~JXk)6MeKZtP6Lx$&C_A*@ghT(*{lnss%esLVoqkx+bAR7QffOMuiMSZ`a zH;iWRcZ2pv{4iqz>-v2C1aXl^`>_I>ceAD1%@;2Rv0h)V`pBQ_ep%ns3sJhck=-lV zU6kxr>N2JvWk9z>yuauQ6`UvKx6EpMmy?;ErA%M-CO7r_yjxCd{r=mbu1D%qQtqa% zgQFYy3uqo#5zzZP&j4dsnHVQri3uvYSS3rYN<$Oz$({nqDT$|5T$Cv$&D@Dr%;%A+4=H1Fw`My_q3}qESl^E5FC{ONHdjp%V z^Ns8U2vsSsv77_*3F@>}v!$wDJdZ=!Co+_C5sdMOjYN1^q@#qB|6+sRlnd0sI$PmQ z%9}gnNQrxl@duh#o-JIBCH@D&`6QqR?^=fhsmU$`AhHL5gaz(TkI7R;A;EtFT~8OO zy5u;fLuuULrF6|Y5?J~=LD6a1Hc^2EiQ=gfBrVLU%t9sl4a+XM{7=HHpJT~I^YDSp3C^pR zz7Y{H5NvO7`9{**w_qYmA7s)UI%F{&4wR?AJJCgZt32=Niu$T z@(cGY%PJG1NPCs}ry{?0>a~oE{?wbhbm%Zom6b9qr~xmEn3jK&ig1k&!z-lv@jF$Z zUz)z0fRr@jT~J|>Q)+z7OlG`fTt>BcC}K`T+#;a7Q^}=5%B4c-4})BML8p|SRvr~? z7X9RM(!r`N#w+bu;WkFkJB3{rAMaCi*e65krvRs3e1lqimsWa{Uiy&gAz8U2DhBsP zw$77+fbt*o3hHRiO;et7G#{joE{efu_PXbcG%tH7|BF!5e6{e_I?NN5-?mYwXbnC_ z)ivqoR;E|%!|#LV&lyHO@^XwqfbcET?$Y#2OecPN9Yv?khVWB}sHn?-iMLZ^oS5h4 z8de>6=jJ~dz-lzi0Elym(dI~u`vlQ)W@zi=N9~zy40W}p`8x3GK%R`WDbwZ#?yaT4 z#_+Z$)9S7eJG#S~$JxQ(T!LP65p8u+8T!tDdHrD0Q^O@Ci zz^vc`)bQ<>weM86?Ul8eR&*Lybo;l~&1*bbRNk?9KI5x-OldhxX*gtEbhh5n@!x$o zzMK}%%t!8;r4}+)S9Z2{-`#0FtR9XujGs&_7GtRwPFK_Mci{TC(mxznK8U}KDQ&gy zVOCTtqzz>u300_SpO?#{Hn;%^HY*D=o7^DULh|Z@o3dN-_Q=Xc*3wbhn7wF&nt*kf zFjj_!NH=N|OZB!^;hNe|bCK+jY`_dHjUs%2TvcE&A{>+KImnvtRfC;GB}@ri^Viz9 zwt;xW;DihTrfF-+B3S)$Qe%#7vTw!&uAw%B0n{8e7-Dz_qq@j#t$v}KWK|&a+;xHXwC3$ZqdCT}#ckFJs6>!h~nh(hi2py05lS z0+l02rT)VpJuY7k!Z-}Iq19R~RlXIdz+GjFnB8}gg!bHiK}bA0(YhERFfOO@m{wQV za{s)tAoy`EZ+mh5z8*PQYID_lglzr)T0Y#a!Om0y?W|keiJWP?@|8h4WoS+|{~bgt zb6V=LF!vKU)zjm7k==#c#>%WZR%~ad`vJzpta@sXugl>|h1IaWKL6{{*=S3uVrQH8 z-s2&fT{RddhyCTlPE+EiI!9}r73G#5^y*3lf~4LC*IVbsxmmPDtmo7BgYkDz-KSvr zGrz{hbHiIj=vj@g+V!`l(~a3?0PLC%=*Sn>^I=drqhHqh-BA{79$pPU}#r z^_;}Z39PmVC!J#Mt2sV5i|*d&)%$t^Xl{200llnHtYdC4f^nCFBOa%_EN*TwTVx?X zfm|rnczhy#BSiq7>~!shT#JeEDyw)5T|BAw!N`=WvB@ec>m|-9UfZY~VnJfMdo|qj zuK+JP-T{iSTGQ>p`Zf0Oe?;G&vam9_o(2f1ji+%mQ zSRx=HzmC_#{aFo4A?VWMzzjQ$8h0PQZ*Q!Np9b8(KZZ!7i*brdJj_D8Hbzs(X>ej5 zFIN|zjEWC1A-3lsT-f>B8QW?A-9k)KfWZ~Pg>&&l9qDImYzCx~1hDdhr>Zc|Vx;z}f< zzOOzAvKTD-F_jRXN*)hAtS%uah&<5xBF})rOTSF+4X9M=2zQne+UM$u5I)?^%R=W& z)5FhafBrL=dK?8Qg$S31mrWyw!~T4ymlGDojtKvQ0qGYYG_*&M#qoG#<~bA=^jw>h zl$Miq^?SK7F2A^#7b6BfTgKlI6-=wQjdu3xK83=T9 zSnJ@5&N6IR=tVbj)ugNBuVn%5;?)$1F*Rmo%n8 zyCOeE&w)Nscx!TM^j!NdgRBIc_uj(PCnNniTgE&x)}u4Y76L-Vax!$px(oN z#4e_D%`}%uc`x}4CPSpQx-eM%+dmb))8(-d3GOQ<9hoS4q5oydt;Eilwsu10zt zCh5+Vt=8ilE(V5aDW4+I4{!hSm2q&aQBY(8gA!)!*XN{`$Ly!a46gtBP0txz&)Mr6 zmr?RTNz@hBVH{)fgL;qL>HKR$<@q&?q=Rr&meQypfU3m62`fnCPkm zmbY_&AmFyTtdp_)B$~>zKcYIWfVJQZk(ReV4+qkmt|$rWfL`D~>>1{Ct|D_JYO);? zWf%88&LxYa@I^GFdns0qVr#XrOqIJ53sr;{;6bzu4mwS81VwtIq2pck-`S$S9MlI$ zj?{So$6(9oXqBjF6}c$2F$yqT<+1B>^hcT@-Qr3$>>=YOqk2;r@Y3mFpWPRBwQt~M?V;}C>wTXl7bre7rSP0++rssFe!qktx>|D|EHlEX)cs4B5qP1 z8svGJbAgPM>W_!CxP~nJnjHKZ%x-RxZ7>2+$USB_HHbVl^6X%P!$GOT1F1}|i@lA??+=leK-1Si*TXa$5}cbGG(mMg@3zcp`&w>_0GF=@=US>BWkeqSRa~B z-4mL2OIeI=%t;mSk!&Qr4Q%;3pMRSvvY3y%xG$&DDC&pCOpZv&8{NG{c&2G-^eWIylm^;j_wtJN;2-UJ;geK?irPKCm2wf^gyoo>W z^+){aP9T56n)zx$kBoft`37Tn-UimJWWl$XJAv!mnSR0Y3kE333%=dwPb}kE{s7sT zx)u{>Fm>0jIW$KP5eA+Miq5p4`gTYK7XOY<{}_@q#KOSp8QvaFnRxIGX@E)`T;+^0 z_Aq4HfLR|OOw`g^1T0(8`@D(rx=!_uTZ1H56(vI5rM*I{G4r1jN1#%2bc^MYGA z36CL%g26>T_Fa{nG?&N=Mo~_3x zhTEs=bDOS?o<9B+IMx{r~F%) zAt4bU2XJwg1|2a43^C?X_+rlzL7hJ(GYdEYT6t3cY}Sr^_;xEZi4(jG6X6EHGXQU& zn-t}joM9Av0AbMnyHv4%c0eN{!_n6o=hM2$iRV_F0chw-=Pof#&Q=%vJFZpmlKS1@ zOzM;|R3?Xz#>2JjMOuyh}Z+;+TIwqx)@6Xqh#_M_zG~--^9s#uv z5=?!dek{7{=WuxBy1-|PqU(pldW@j;<}JKEfJ(LPv7rit2Q=HfH{0+EtTyi_f?lwj zNZ|JZ$pgXvv`VQhxY>L-tu1&H-E|CXwtcmho#Sloa{=e1n23qx#5cgR0I>p)QPv1@ zsKj11IPV4|X`=}<*!BQzfprL+$;+GUK75$xA5yClReufow{qp$Cpoq@^M(_)ZFu*# zW>UBBPKTL1vKfuQGY+tuH|Fza_!oA8= z@i&!XLX*d%Si23?C6%LfoGW}6za8X^?L+W1SD@wtl84>={Mf{mVpMa3*J)#Wj)8Gc zh&N3tWblwR*m)Lk=4cvqpx)^rC66j7R~&5Z3V+k%_#EATKtZJZZ*4{&Y@b>{z+1;3nH$Wzf1UF)zA2L))rcNuV; z_0{?IaGczGAiUau%ahFcm>7hdI9o8kiU?CWB!UJ-tjTuS&lEbe*9T7|4bAWTQ$>%= zu;GtF?~smb2f~0q7%3dejUF)~+6^O-Gz>ps&AR-Gb>le3ohPYpPj0YRA5L>VCMiJ- zQo;oNjaeQMXe^papkl@rq0-JoCpLdwF#A*93ofvi=|sJKQ>dI(aH&VMBh0 zkdtZ#0{zfok1%xL*tz=6`&y)r`0{o(X<9bkw*RnSx@G+M7OG1x!@h5R=6DWj*DVoj zv}2SkN#alAxcnZ}C8`D+Y{=>d1*rgY{^#j&_}STP{oQCm!RcJW>D^!QKp?tF$b5@z zsa-0KEyn2h4`csGj8R#H;vtW_guwI!Z+VOE&-DbQ$Ch!7VykV8!S2!U?Wx_X0|$&Y zIq|8t>`FHb&APD*F?rhp3dTRl~!+u&km6 z*q8;wGzX&{p8I%!Utp>-B+{cl$Ylnj>wG3}^=>`&l`C7q1Mc_4^bwX5A0kL>5xJNM zSNk;#dT^m_Ry?&oGY)J!8-D#Voy23)2-+cxbYZJ(S*~e;)PQMmX0OYRzHNSU_Y$q_ zGVDU4SXx5AHaF$T*iWF4fY`uBXiZC#bp#k8=hab^X}Gct@eawkA*`>DZCXV?a#Xvj zg=*P)oH=DBr^ZWNR2JS<7M^7lo^=+!6?B~yH0@7FWSwBUez0|BBzZECH5Jp)aH)*g_OlBS8@;C~-g*Ai$qv4-EkHaxM{+Lq4D z$@;VPB23$JiT-)HvZuS@v8O??+ex7&el2Yo7~;TT9t&%IoA;Q#jQx8-ScJgUDuw@_ zo4~ziZ~Gpz*k(qpES~e}M{odzT=2Yc^O-RHKOFhsAu%n)VCicna~sc~P23sd|<)9^im;pj5t_r!7p(l zRE+$y4NZTCX9r|OIT{rW?A4P9rVkteA6yHIIxdNF(B3~`tQ`U0n?2Jj-e3P89RVaT zY`ejJHISKj4Pk+tG5koab-9W~`~ule2N(HfW+**eu!GpfRE9B~o%Sz7uWVd?yDR78 z{$V8BD~1Pnyg%|l`5}6GTv10OgB+iGI5FvbV6qqT zTV1-k0$pCZxa3;K~}^e~<6c!?Mi%+kW(Gch6^l{QaNIGg2xM_SaGGP1R?R$-6%{?c1Hr?N$r<``b7&B8Xwl zmTBeZwtysug^fTFDXljbJQ?Ny-TT=g3s=>D82I5Jo{ZTRgTkjT4V~}6c1*VMao?V9 zW-bRrw?&d2f9BOS2C(eD!tQ{yT0-161!7=Kj0!$Mo0Id)`+#T*ih>G3wk2QHb+_q7 zTlIN+`E_^sd3VWqTmEHt{%Lpj3UuLRcQuGX0MQ2!=PO9c*YY;YO|MT;uQ|UjJnmsQ zIWXp|3M3{I9GEM!k?0g&7ia#chGGB?HvMfZZ?3GKGT0(HuQvc_r7I0uJW2qp`DCe;_ulLyKB@qKj zPEm+eBJu{^W4gpzgIfJOQSp(X*<+f5T4WR#p7kUwj5@+PSWKRo26vetdi0m`dU@*a zy#Ybt;=EE>mNX3QCr@q0uX+EFSN4W+%xsX#L4nsaKCHu9@9!Fup}dB%uW$&(OkRAH zRBe$i%DtVhBwoSR{kla1;7S^%qLoEa#5J0qyIAlLY0)||Cnl$y4Rr&2uA2&b+lJy0{ z@B%1ws5;}=(!KlNv6W^Ct~kxP2B8DMdXcxpGP+80Z?J*3rec84 zWdDtP;7xq9L-y@){9lvozeT5vkx}k%9G9Cw2FIaB&p$ohuFQ_Y4bGZ)UDc5#=f6+w zqqY{rsw+e}7xFVB;}LDxv|}Ft?PXGUQ-5Juu)J}c9ws$u05M~;Fujk(2;po2*78h} zc%wRS8)?65M)1{5G~UqTxzDFELTOpCI(s8d3)>$qgn)sJl4v8d zFHQ?vmE0^=F%y5h9NBa5qZzgLVQ1t|{@|uYMu9@2?XLnE?fNnWuj#X%Q_3M#E!)=* z{N#g=3mgXK+PU#xDQR{b-{I|oe^kGmFo{F&7LSK^cq_DQhtIoC*Z{k*iH*QZDaBq= z`BcK}U-A2)Z3VBQmA1l$FNa6{$MNzveDO;!6;LE#;IoZy9qU!cGtOPD#QJJ9&jrQA{Br4&W{6G*vV zym0fFId-*k-of`R|&E05MpHu013sn&BftQpgIxLHr7GKwF<$pL5gjXkRacUUz(AU zwQnV7o5RJn$qyZRkcxDxT;wDXjy=1HmhCm>So-mE#XZwZMFhEp*ts&DPy}QASGb?X z9)acULnJ@sWKMvon;#nc$^}8ZyQCrC0R2K-8ou>!SlrP731Z+IUYsMM0gIa-|EfO9 z#)?p(U2Pw)()DG{{ljwnr%QE<%gedt@;UCAeDtwAeI5Yv@!(wR+@KU-*lU^Iu!_Yz zTmZTJvxv~`{Nklxv(3Dv!X`zt!f>o8IkV|UgPQH!h&)g6C{ywBe{v<HMM-I#XOfp8IGuv_JA2{F33XsQc3l3Mr*3=_1dvE}b)MCc8*k`3fv!=)IN8{T; z7}1e1nf3RNIKZT^J8ZyOj1O*$4MUw{qs9gVBUVe3J>bL2O9x;>equA3NvXpulW{ZU zO=91q+-4CLq>O6I!MDzWP4E6GPndP6jM;a#HVTf~RQ8a$p4O?nRHXIEQhSq2gCtjc z!us+odwHErNR^D#_tm|-(^#!2Bxgj%;uqAoc_3b($pz5~j#S^XyMZx&g1)}zx!;e8 z)4f#9F2l_rzk%&)oy)l^RJ2d?Wg?OhVr$){-;41(r9C;KrCOjPVm`p{4O=EA*O!is zArZOOSorRFP~$JyQ_hJ+|b*$jK`S??8Ts7iJopBMW1K>t@y~TDj zK8s%3_TpJcV~(8S#t<)Q<)4AvOq9<9^T|weuVNSAyqRFVxo^7L1c7Q;;O#__$mW%G z20-))zeM!;S}1t+b?hhoPW0_@s_57Kv}(rbT4Z{?mEAz8+Q>_eSDr*&u#i-ll#R2l z%;H*Pd?gpaO3mx^_wT)1G5Wo2LAGqjE~1xU`6;4Y}d)lrZRAyC6phnJBo znfS&`qUv#MwR`yPO;$wqONc_q;J-y7w@V3jxgw!=+5|eyMX?q*PKe2;bug4rF(YXi z>q0A!w|gxz$O^sy9V;S7zz#elpTbPIaEVjl8vIjJVh2@;|8Tbw%3#j%dPA(d^v5P>%)e z+lE4Nu?GGmBv&#grZ3!i{rTUZLjXOb6SlM`oCw$~m=38l>gJV8$ETDFh0Z>?bnfsz ziFE3`^e?FBt;aUFwOzPB#$iwH8&L9XK6)sp6dSgw(~|Fegt#&p3`Eir-rfGg`%Y~i z3~nRx;^uY>=O|u2g#CvOZ4hkozk*>0KGZ7A9De1dsce7$(Q{LO+I*g?XR$C0C~sBL z{7XeUmWpvaE{l-V5}^tb8*Eem>!$vbfkY>G=E01-#=@;2w+#ck>anCntBe_<&->v>I$gg z2I%aFKeaGw&&-ot-JEdablNnkmW>LlD?#$W&eBZX(6y?HY~t*dUZ^o{-(e_`9Z};L zT#^g7g(ODk{C zc=V_|g21nsTBV)lp_y9glXhLwbD7d|nw$5rc-8cLSv{O-7~jQG4`gHr$*)NSrb|l`8kvBjrL95ls@i z7=)LN40#m%U5Sk^0cp$DDrefV8ix0nwspXS!!%Ivr;6Fa8T0a;*$5^PaxB>sPX|C= z$$^yzz})yksVZl<>EkI0J$l z4@>2C=N8}m9FHj9o*>J^``44vy+tN(Z5!nObNSxny%CgEc2oHvf4th-oP6&#SA4HO zzEKCc9mF;?Kz;Vie^A3KZK8}*CH#V32ZyhujEqJ6yqQlI8@pIo$oztSC$DXy(}qYh z*u?s&AeEvOJX%+*Zwy2}yqwd5CB2=Mn95S)mi! z7BQKDkCYQ5>|7`1fe*Y6i;(1$t1$4pRgW)XUeTcl;2^#u*K7RgWYPkNI z2zYmby<)_F5%y`cyVALyn9TXFzIrs~sxRNG=I}9Fd0WNmPWCp7uRL!?H!c?Ifal&R z`_*IW!&_31Fg{l{6@6yNLnVGhH|>ySf;fUDe9yXo43=@KFH+onG&C_9D>AHKM_o9l zqSl{k!VUAt@bxzx=Xg%0$@FNy5JpP4uq_KL)*)Ae*wcgDg(*c!&fy3;cY{+_0e+~| z!O!puO-&667&**9pkux*eEe7?owjHDP0H&V`}!naFcku9wB|o{1UbOd2c4HNrdpf@ z?MUN+3AQ+=ya!Hm0-xIuXMBq1(QwY-e(pX?ENC?Q)jm`N z%yk77gNzWq>^jYUtrxupqhEb{K9J)2NEBw*O1J6*z0sFM-A#UQAP38v>{B0ko;HcO0t@e_L_ zIJLze5%2Bjr;w>o6ao5Ls(~2fwg#@$NH;f|`+IF3IbJ(b$XGmYXfgY++0ZfDWh&C< z@(dVf$u&q_=&rtO1E2TN1=YHb{I=8Nir1#&^}j>C_Wu}lmt6qeq)sKI+jor)HV)<% ze{hvR&Hihit3YKYiiN32MtYec=;7mks=}9YO1$Ub*UNH)tzmaDPT-q5N+|ofS$E~7 zf$iMidu&L}Ok5(uj#@C6BRFkdxJX(ZCB_U3sSgtsoo5!73a7#k*z6Vd^5ek|Wb73; z405vw%2yUR+(E<*n$YZ}4Y&3eAj;NNh=B4ULceSP4VEA7aKmk3#XGx0 zaeYguuD_bGSF|sK)u_wQ*|E1XXr<(u!@~`tgp%m^AkE&|b-k9-)>vvNy3qdn7=ocI ztSKoq`|Gc3a591Hye=&(|2XTWEUWJ9X?0vZKe658xK^N}w8kPxb9gJJ_Z9atXddoy z-!6zNqr_V*U&0X!m!}?@A4_>nZw6Hx&gg{7cv87$F}mV^S|zidGK-zeM#=Sm{xesi zIWw8lqPEu(vIR-Ey2S;^hT7~isYy$qAiP(x#laJTRjwQ3`dgV-F?J?HG*ttFph~h% zv1}Re^+2y*cdF!xY6$hr#=k1msD&*`l9uIT)T3k7`lD1J_&GEq{aJ~pgX3kbwy|i0 z#X0^&zSQELx)b~@*-Tbgkp2^+Ol>6vVT{I}__L`pMRAF`=(#xnnrWXur3g0;R>Z zSc=<75M)=b(8JZ%fR5X=9@f#?0hGXS@;xs>@jf^xB08=^KS=|)JOKW1KaZ=HB z!AJ!to9BbVO*9AvXlB-dE2~B!y!KALIYmeZClu7sgAB*r*P4^^`MB?L_$QRXtICs1 zF2)1y+CQfZP))4@gfj?}o$hCB6zF_5Q);)TX5bo=E6_|u&=MvWp6b7CqJGQj+MZB; z;lPLgzAD}2TQ*&zmy32Z;dN_X+DEThHmY9qaG&1)cDb<9)Aqd$j8?7n+Us`{B+ap% z9{|>RMCvwf#BUjT7lF-(=(0`s)6zGlZdS)FTsY zQznsK;hFedY_735)IHgnDug}h0VcUBnX6r#tGgI-2|KkJoH!Te5#B9@`>OFfNej={ zQP=9q35*Y;Rlh3vN{`VPo&$_1&voPfN|*`kpn=DM;qKKVO+77CT&qNcR{BJ+N??Ln ze&Z3R1PxIMM?vH$K=H$+|3Sjv#CFNl=ymz~O{Oe41r|>;Y;NV&-s;e=f(AHOMPnLg z_pqn57{9H`!lv29n8t|Mb?o7Gg@c^)@((}{#1Ax-?BHK_HH{so%7e?I|_alBUhTa#4c>fUVDlaxza^G5PHCWU_ zOY$G~!?TKKAw4O>nc?@z8 z;|H5)an?l>YEKToLm@~(X@t8;J+Vk0un8wQt+wiS=*f4DsanL#PPQnqXZAvby}i$5 zd(KP+Fo^U69DEe&xyd#yCl!Gh1$Z0e$x?i@izAxiO^fcRV4z!R;tfvjPU1n;nC#omfE6H7F$ zI}l1{3e!LfA2iuXOfSO>5dO)JLIt03mgfa!p8C7LzApI*y^zuqmaWaX`FifvXKfR# zWl^j)QUdPjBs)!PRO)=WWkKR!P-)hp(09X0ZN2 z$q&YuA~kBMZRj@4OGzqWefd-2JPR9ySnfA}NRR_Whsv)r5BI9%IBm zvf|F{tk;6}8dmuh&QwT>ZNV!9T`_O5^FqQn}gUJXG-#;B` z#GsW=x0EYs%g+jR-;BK)q;k&6M=k}EZU z20?Dx8bZ9;OR@`e{17CVC-Ka2gU*NBK8HMUSkDDhXGgCo&?IQcf$c%c5NDoW{QVB2 zCqcaqs~?Hjq}AK>_MwENGOG4yFm&@&N3?$Sb;I-uE1^al=_#=y6>)TRUrc@NDXgv$Bqm8*m8cS)_?>{?^|!R_tyKsx0!i zvi-$xrVG-W?P>T1T?6c8Df|Jm&oP>lm#s9c>R;HgxGog&Ra7rCvKqNft};#{ucvn2 zeARG3tl$q;&mJgO1T7rZoJMLbP*>i-=_xxPw!=5ddM#+{PRO*q%-+mp>{w`uPO*d< z=%IJC5O|0DOj62|CG_y5e%*K6Ur9QSw3e#|iyOe$Id`u=??w)$_ab{~VUh^D%9sPr zxviU3BB&N=a~Q~VB)!0AVzbHI8ltUBkP#Ft(kWe;rQ`^*g#$vD*S@2QfVhz?5?-N@ zGz4(vmmuTCCWM=0c0B*fpXN-=QH@E#E89>eY-l{faL><>x_Cf2EJc7P5&=0$xy|N) zxd&34Y`#blQt(CaQTr0A~KNA@b>T$z}t-}_Fbw~oTB0`Ak1P7SBNqAJ`oXZMC zkyV`~d;g5Dy0X`#=eTC3a#Zy77dpK>CdUn~F4Imf8N%bsy+);}4m#<><0B|OOzW1Z z#UG1bArX1RtByqGf7&4y>GR46N5Ce@6^|39!KB?}l}T=E1Mcd{+YPK34*>|R1gVq_ z#Y0&hBafbxt_FNNKdgbzN#FiPUHrAX>Ulu7`CrTH&}9$l`zpjozxiH4?a#iTQ2oD;>z{xR&-`=B;n7DJoo)7(^(EMq z1Yxze%IZ%vSHov86-AEF>)~td2pSMZHTH*D=DyVeD+{WthkYA!8r-PP40Vkyh%sH_z#2KO1iq_+Dhu+2kd=lgqAD% zn!$jpBM%Grka~~nVg1*q;ArpU`d=3&UqqCs_n^x*QsiR>TA#s{VHZq?EfL=pxyMwL zEnmoU2yX}F7D-v!SAxNcc@?G8Dr(zw^v=ok7iPhWb#QW4{$=|SUB?kc`NK{H+_MXH zuAvzoH*{~#iJrX4uO3|Yw*>djna>`m>&ttgWkVRMdjK(rP~i~i%wEC#vZbT9v(MLc zEt4GusNJt9cA^$7Lj32KPdSM*psjIiaEJZ=_GT)XmG6 zddSe`yf;w0-mZCdgb zId4vi0>I-m#mQ>~rZeuO3TS5usB~W0+H%htwE~>C4p9_|ZXkw{~JGML}QD9wpo=I8_;L(?pPDmQIYw%t(8( zgWMLGl{)D7Vs z7z86|N_WVXmY7Zx)RtbC;il@HCP!p()NYlAdl4J2LtEHq&1kaBb3v(`J45i`&?RG} zohr6V)K+GPYJnZ6P&TQaz0Ym7SmW3Z016E=OREsvsG&y;oYxnm&Ee74?a}q^_NSes z*1X|)VFFpIPrrUnpdwlz2G)!1z$`5iGYL_ZFvN>rDCc~3PByRQ?cAGK`IqoN@N(lG zph+Ae!vA>NH}x}hrQ-!+XOMmXa`O#0s7fAjuM;p-i#ywxlW}okrU6i=`~i`-SCSr- z`-nt65gAoCDHVAD#{%2Ce6 zpDEX&0Wrq9xE5zR3X;z#FZtM(rBPuoyBwDhj>lP!ba@0(BZ#8Ao4KX5OqUShSuH>5 zWgJ}R(84$41!=999-51}&wL9vB*7hW4B(UqKHS+VYO@^KnTkX=Ml2c}Bwe#vmZE%o zn>5s*G|^4!6c<_Q3l6Jxy-oVKh6o8%qBTd*1on)iTIw-AaIq(+eK4ncFsJ?FuP6*6 z`Jhw!CuMacg+y-yV!KNkHjWP_rYORrxh1Ly?4a>hac5l`etW;u{!b*i82uSZddH0R-iF@~$Y-X3UL*IG2;d*NY5oXTkxK z^S~uPn#)W<5u#wGjTTu-VDhE1Pil*;*6Loj z+$r6xQ|L9c2t}UH6Sa-C{ft){&N#-Sd$f1_`V}H%82&G}M_cYgG_PJEdOf~Oawc8k zj!jXuW!gSd!ui2}QaI+;eN1R!wW4T`^{+)e7(LyhgQwELEWQ%w--Rq%shqzIhsPfn zonUKI4c#0nqy(W)s{Z`e_seM?{s zX!l0vKmH@pq1b1BpGs`Nh-d#q(ZU*lV;qK8zh@3GrvMrF;Yx*!M}IW_Kyt@}#E12O zXyR)abS>r6i$ECmA`lXfAG3y49C%kJR^h4!~1!eZ;AJyXwD%0LAil3%hhaF zG2L}qc<8G$Vjr{=^-k=^b#+~+B4`-0V@33dH#r0y!dp0HNsXuP|8dz`5)qhOt}t`}aX)(v_SX zbA(xE(X4l1HFcIdNqkQbO6Sbe<+Y84eOp$h&An0+q6Ke&lm5H5Fo>!;G^qLhRm%)5i-tk+avMOhpN$gp`(c(uqfvodzA(KsXTt zZ1wH3az91^K-0^Hu<$X&;AE=^MX_Q4RZ9^^TB9?sq8M*ZLOv6hZN8O2(&7xEK-SC; zHq1AP5(w^ZUBe|`tvTOEBUx2*UXaN&0Wy`C2I>F-4x72G1uCv>{#;mGQQDy_yh5H) zO(J)aI7iefL!~$k(;yFwAkJnf3Bh{;V)r`Oeior-F7eIJk9hr#z%i%-=8eD)Vd zZ{LJSD}8-SZw~Tq@Ix80Nz1%lYiwSHPnP}bhCYqud}Z=;G}?0*lTo2JM8&R0+;Rp&t|oP~rvuu5a=-^U zl4bLmef-jFY-Rj(!!HT}3}WQQhN7p-C49=_D;mEDO@4Mi)=Z>`nGoJ)Pw>f?uh3rW zm*!z}K)EC6n{S}p@zD3{kt?^i_kXJ|e*bpXNnP>JSNb>W3yhBNpA0YQ##cu+8v{Gf z{bjyFtcA{BV_*`*eCzGrFn{f%FB#QzG)Tn05Y4bvI|Aebt_!EmbVBq@mm6Rb7oh)N?>bEv2ppNP9Rr z&#><`+c26m7(yI41^av9dNr-Mg?lpOi8x|7JA?CUA!9fI8BoT3V!N_7t$3t}z`=-s zJT9RuB|Kh;>GCCF7~zZ48*q zA4%-`38c+h@jRCj3Mt{rbmxCRb&AK9m56sliG!o;TRT|ry-`9EN`KEDxq@8zZsjPb z2r+`a!OdHH;fQb_?nK8A`Zh@57G$wWfaM)`?pe{f_!tTAm?yMvK^PQ6uOGT&de}%q zUf8RrIz@*1f>`A-3)lACT4kDP&+jGP{7Z!}X*vqmzVvP&Wh7xn++hs4yFl^*&8C`u zxJjB}jH71X)FUbuBCHqcR%NYhgA1Ef9UEmGf9v?ZmEZkrEJR)mV`MaKT!>GX^)M@| zOEfEILHcGOH?Jw?yX>;~ti<$;N9)mP|K|C@CsJ&~wAzqW>t7k!(+`nT8b*(VPS-$K z)%zCExfF!8sWiCOKl=DQg)UZDfhoT^d-*&*JZ~)SZ!|UX{XTPBRh>3mNh3MUMO>W? zBo-bDX`7{!V-i@FL38DBwjn-%d>~pI23Qv$uBOSLHBgh&R#LBQ$#P~#t$lzbl)A;Q zTGk@SH({}HFDDb(6dbLK-LMwBi}eK&NghV^_i`+CeHMk zM=lplm8|PZn30S@#AW{IiCl{^TNi~_E|uuqh`i<3Yr&JxC=YF%O}ZtvK&4fch-LHr zW%^GowXoza(8KeO=n$uewyTTg$pGedk6B-wRR&_0VTi+2HGe1Ex5Oxb*SpX0N$c?3 zt;0T)%;o%PkS787aHIOVaFC>#lGk_RVQ_wQTU&x}GQ|otJgOeY?Znq8Ng z+gQ1sTyH|`Ob{N5U%bRkt?6p07rHnvIrov#y=rT;*jPpLHzn)$RCX{0M!cWuH0Rd3 z(%K65PQxW?A*Kiqr6P{FI32aMa$2334=ih36ZDzVZQ4-URRTMAplz{$vwRgL>fqV2 zMFqeIbNbSmbEP%Jxh9d-)f6rls)^q+a$cj0S#|eS+M$a!d)Cq67%cBZ#nR9B6+z$q z&k9Hs5Pl3HT_ERqUCmX0k|&j(i_pyJxku9bi7w;eB#aYsYy{zhW&zTsJ+ zZd+%?rO`OrP|8s;@7g#6;^MjY%vdyRbBpZ@3aKEroyS6bq@bYb`4 zY;y?N5Q-P@r8pWHInPl#6bvmNg+TyL*|x2`|V!@7uelK|Dp=q+gaL%lG&Y` zUF2CXzYKkHA`uwz;lTi(zu$C)o_5B}zmWWY8N{ZWVdLK_$1CE&F20EK_R)2(a#&@y z%dNPjJZ#LJcUJS+Tb#`1KCbqx4`)4L6PCCerP_673_+bFYoN!R2 zB|)g7t(cgyYxdQSdQ4aSmnJMPT*LAF%U7?DV=5z#>b2{?pjwloq88eD^+5+LyTWK@ zR&n*2AV$!Nto8$TQ$f%k-62mzq)~2o{6$Bf<3WAq6VuTb*n|i#)B#kLPeFh_G-A#N zLj$nZRK{KLYKbdFUy|U~FrE%0Q^q~;FNF5js`uA!SoyS{s&+*yGxu05_+(LjQ)@C& zYmOIvgwBeJ(T_Rp{cI`lxL`>kYR`H1Nc7|w&1HW+;dyh;^yE+Xd=2xwp}XJ5x_=~x z)tfs!q-aR$q;_V0`FQp5_%z`U4+e|}payQM<$_Ev7X#Kl6UenEByvjd%@IZ+0z-=E zFcexj5*a(qivv_uJ^Y?j4(cnuSO0V>u0EJF7|W`f$gX?_H@R-TE}TE5cRD3)$*25# zF`TRI6dszE7gIXuIw68(CKGaL+)s!v0C5(!x_)o)skFQ0dv1v@bcILw;CxwOJFpzB zqaCdyx2xo^sH4GeR5e#x*q2}0S6tec*DMhEg~|c_=|od~C<;7?`9xC?Y_zwTWEEb{#@OouN=0l?h(_cC;6Q zCF^di{QHi+h$Os+CDrY-2T2)bO1MKSLPEG6w!c`zwz{-*QeQV+ASOrf040uxDTOFK zZHhYi?{qCScT?<8wc`cm;Em+mHS8NLkr?Bq*de@|WihbVv@Pwq`MNpm;aPd(_W9b} zjj_#0g@@s;8Q>mpR~cLNZMMrq9l^934y9m!edBta*fKwJN7ACTRvYXMX5+m#YO#^-N?-LMkRZXCEe;eAY+hTcPXn6P!hjz( zty3&(5M#MgV}78+&4PgjYO@Sqnn$UAW3$iw(4Gnk4G&h}kckvsWxxSOeuQ+S0i5Q9 z{v6rK1T`PbY7~d4GJun1bWLaRK6GbKwFf&65>e;VkazocD>t+Gp{T2KBjIgl1q6GN zcgLM%;WBYWAP5f(^qHp>DlmZk<$Q5sIgYb}{0rINZ9h~y7+3iN*J{|dsJ1uoSQsh^!`qU<2T za#$W%$j{M2qM27m+AJIS-$1G#kTd5!qK(H76hlOsvssa(H0gI8w~^U%a=o0Z$AtZ( z+H(wh(8=0tV!%YHtM zulC=no)##3iR|waRZeviJ=WQ3yt6HQLJh5Fx;0FC4k;9u{V!;}i=QG;dnxow?MDoA zZ|X%tBzVS*Csk`K*?Y99B2xm*+N8r-P+gLr38e7NtoxZ1N`;As4JlB_B$!53r6Lw) zkZmiK0}SnVg@l`kMHNIk-2I_|pVz=}ZNss&xNo#}!+U5R*STwAqVB0WQH7)VU0H_!kUjFTE;nu;NUFr3~X z3=~mxLjDbDddiO2RsWYb0A)cCYm`?YILg^Qki~BvN7~4=?*L8rRmIwLu(mC_#4Y}BBSs6=OC%N4XW(*UhwlxxpCZAWy9 z0Z}J?V*|IKt(QOIPn}o>Zthi_Y;z>3Rv42mAxG_Ew;TI<_}`ZlCja(adj`ICO=QcK zman@bTl0>zqNhG7I(GF7t)YLmsY^=zd8^>|Sj_jvx#7P;;@C7K)E@+K5uIJ;igIh4 z;M+jvgqQM0ZmliD6Oykd?Sm5e*kyz@H~(p#cpR`jSHO8F@4d|@@lsLhu<0@6TD1sa z6PUW3U0L_cKv_>EhAiZ9>!yq!O4M7;wCz9>T@(7i8q4F3kupE0Bky?QddX%0W;FGq zay+}?Y*~uMbM)!?+#!fE$%_Ay0-vcR&;BjfGh-n_&-PXxS>GQQi_6!rLF4AOo02&t zae%;0rNq4uS>}YayBB%hc*U3Lf7Ld)w$jDUYOAr5EBb0WIdE4W_ZidXtA1MxRuab3 z3xjacijs4OIB06jx?Mq%ytX08V}|YQ`V50D>@*TKKVtIGN4bhhcIZ8W+UTuhb7ToE zM-xSyQSqpN@z7YRK+HNW9O>l6IityGY8dlF!CKJtuy!D9T9uv6CGYYiE}~XUxR->q z(%UijbfmYO_EUwQpw{ia^8Hk3MK*DjyKBweNM8I32D-G@60pv=Eyj`2#^!bplluXvcV4}D z`!Ng{68Ux*ljHp`XeabGSMm$`js^n)#xDD-M zT5b(Y`UsB7y8p;`CWrpBf@ys9M~gMkdP&he@ndSG`_g2*zM(^%W3_2kTcXRsZuZSp zcbluD+uIHk6v94RacQ~un^L$1Of12F_ITL_qBA~A36Ks$s0iGyt!$&j{JUWP^0)oOq!3a@yy#*3+59w~K?0DY*;n{%IMOq5$ja#_T?w$YJEK=#X;XtaOXj6qRv0ZFBW zj<=MC-?E>}Kh&}ncQ{g3p<;2-KvBh4M+EL^ALesjk=K{Yy6+MVxxHPt_kL>kygh~Onv45qlSF6hkZ#U zK4_gICiL2Jkc&j&dChed>ze$%`8F1V9b-ui%z8Rn7Yy^O02- zjT_#`t`Ql1R{3`=;jMjT;PROe9+e-1xH0JbKI42LM~f6@O;)Nqcn8V9&ls!#%54JG zye&J^&s!zXxK${b%i4dB@ckAZl3Z1#yqH(!6J|*yZSse<(8Uv79Qz-eLYMbDTrkUDsp z;M=?+hCfvSqRt$=ZJK|Rvmf8ak|O)>#7^R}E=6QdhP4EN-)9>W*80r}0?gA2D{IN; zwn`68CC_~HV2huh`=IfZ%oTwyJ5@h5`@dNDWOrUxc3$EZMsDz)w786FyREAGLG}F> zH|$pz>}OZ(*A4u}Rs3KFizx;$5@S_xEoP)vR$d2V( zls^{u*i$ze*@oVKcW2x2@o}bZOr}`GbFyN(hjl$X91ac!2O>Kj>u<;FmTx0#HJ@sm z&s|h(b>>oQU1@BINylwvyzmc>Wmel09xf9*Y0a(_R=wiBoXO~r`=b_lyZlH73xf_> zM&SbM2FMgqKPItTlcAz=rNXW}Q`G5&{7&OrlqVjBxb#v2kV)Xhny^HhdS`O?>R=tl zgYscjVi~8|d7-?1VrxdzgX*H-wn^!5eBFaevf${tQrgRp;%pbOq4ZkYiRD)FOT&8f z>J_P_%<83e6jHV)qC7=J`3m1#v^HO&7!CR(G%>)a zGqng+k;bbC#`3YrT0NI8XSUppBV8v@`Es+fy3HaWFRElluPJBhxn%vEX#j;BObNur zgUVa6XtV^#qVpXuo?CN{#XIB%WJy*G?LM>+%cfl#9l`;Zk(g?e3nnCp~@YjuCX$~YM1 z&L}|0NsEm!(T+Dtr=rTvozL!kNg2Ebc`NvrUHkTaLA<=_|38<1%fydM<&~`9_wN-a zX95>d0KUhKH_8>zP(5kR^51>;$@+wsoSaD?SB9gfvP=v4&E?jw1H=D8M9>L?AnZ=p z2d!eUc&`3wV%0qmV&5b;-1X%_NJs5N_9$fyYS{8l_^lL8YRo=yR*O4=M;&D~3VL_x z_q&Ftp1t0;0;Rt~y9d7jx}(0OBOZklzOX9Y{A*-&C9tsRRetUz*ZMcbiL@M6^`tCf zSqJbFo1ty+7+e;YbT_Siq@f?zKh8#f9Dr+jY*W=>KXYZ>v*hmt$+1)wbs& zRMSy1jD|;G=XVV2Y8zDcs>aUvg zQ3Z(?|8XIL$F&2dwXlXJ&DT(niG^@meCeDI>dD+IWA{uQ^uA((E_Y2*DUK_hYgSy* z$Dkq~Q-VK6Gk$z{Wu&t^|MZgNEhW-bz_vBgwadV8omjVS#-vF&W}sulOka~&3-gIU zCDJ7($sHn@R+2oS1v~QSp3L@$|+uw@D_p%UD^t4cGU%h1MU!qjg)0aKssHO@61V?=tfmNaUua?~dg(fJ|*$bT!?4sf5PX zxg~Vr;DeafA3}%Yo4jO}y!prcjq7fTLa8OB9hP4^EQ#7|2s#SSrsf_Fte$V?-|)Y| z{7^8tVWblM*#O!xPT}iiYU00j=G!;3|5-bf_B~fJ=XrPL??|~IV>@;aq&oZS;RdJl zLV_1&!!&A5bbKvl#P1@pHcViHeyb!A2!EkELgURZ9Xze%J|-EY;AzSo4=R3nM6xL5 zF#ELs65z=C3*mB9v9;o1O}}8#KuMze0SpParXMVnCDMw=ih#)FsGh?c!}`-8)qVAz zNA;d2xG|2xUMdo*S?@>_M;RimJc55XdkXZ4dhZxdudYdhY<|slTLIK*(8}uHLzuo@^Eov*#`v*&P}d{1-g4STUL}#<4Oqw+sg)Y0K1DtJH9M^#snT zeI(Wh%~Bl?bUR_#lWd4!rhQigy@y|GB)1;J;H^`?SeW#MJv_ zkpjWs%-~4uqjs1OQFb>Vn^= zYJTp?fV3mY!%zM7>(i(}{(dwiF#;`Tb2>QA&-7-o0^GRS{`2gXX_*M`U(!CR;)&o$ zSTb>q1&=-L48PiY?|@;geaJe&_XW~lykj4Npe;LTdBf|{&XYzBEBcRHF%uqVc1K+W`cMn4t&>NncG$t$&CqdP?lf9Z>V z4|D!cKvX|@)<4yRt1~DWFo9 z$`U7Xm3kNbkS+n7r0L4AzadvH7@UvNTFV_qn&2`_Ws9v+AG<}TWhtCzGQlBJp*KtM zWdjd|Na7U|7m)#LAHj*RqHn6|^SQKe5stG47?oegwVE)pai_7lLEQ=LL z#!lWHev*QVl3ui{QCmYuUkj0yr7@SMvV_fgMI!$Th9KeVh`(~z=E5faU;gMy#PYgk z0M~kq>Vj9+I?`x1&SZP&7ysQ_q5DrSRLWudBy@PW=(dw9Hg2{-<6^#^P}?hVvZ5LeToMu04ohs;p?6-u5n$+yQ#`Ug>aO z`Tj1nL{NnrF5lru_^M$|j>-U22oEe(Q@`4h4cniEY3%rr~@@)^7 z{dg7?BR#W>#bqdl&6`&;7^cP9A<)zc;aN+hYw7|K76d_9X z#{{K3M#Irhsy;`mn}&~S<`1A0Rf$sf&PZxK6Rcq#5u|C;b9AzD`_OS$)!j1&^B$@M zfaGyAwvtu_adidl#GMbt3Ra-v+TOWzTKYOvFNZsA?H7Xzyzazjv5m1by|L z-NE1)xfU}1fKN!t7Dm>9ZJhZT#67WfcwD3hoeDzi@*QT`|efYMUlzI1gDGlR_=c`6?Vl*so*~o4Nn%UZ=A$1gxIJlBlAKMd``*5J%_Gg)AljP z>d$1uE+_M&bG=*n3UFaJ2N8IfVRNIv-G{Y7MWfqcm+=SKT&s!p80mR+>v`q04|V3x z5Cb{<%qy8KYvN6|MQ_~5t6fcIHcwh8MH-r4_QkOIRn!*fNwU zh$s?dR@2^(Bnry(7H(S_Av2aWgy(^b2FdKkKf5W*m=Q%I63H^S%p(#7Hp%XHaxW}N z;!rcx$rH}fK~O11@r%wW$7(j+QX8dlwqDk5FGyuXB; zMZ;MG)wQvEui7^@r$U=!qnYau4;y+9oqCgRZxR^j$*``SR7i{4wdVCt+$gOSL-tpC zcox^#+hfe58UMbQ7nDm9rVghtpTG7qf&E1Vp<_^t6pU9PsVU!wA;0&p6a&6Vz=x+0 zf;ChCJP`5r$-+>0nIKW~^7TzJk~-7xoe)=#<32Ix9q}il(9?cQPS2lzk$^Qg({ZE- zLU^=?Zm0pE`mG%WMml9jOY%E_3d(W>mdMK!wbUy4-3}=UzRlSQZv9!Y>waW@eHZe+ zX|LRRlbh^*jrsA<>FA)clGN4g;A)g%xslQjHqT__bFHa!b#%SjK7X&X{F@@t4m-Jk z858uw0h=Q0`6?`xH2z#x&I)K3wg1y=u=W#KJQ-^z06y%EY@mhKpJIq@5+HaIuZV-B z>Q1?Z37kd1znJIwkYsJY>D!)-3Pn!`C*)XbM$41 zJu3lSR}fo0C7&HdN>12=#mMPvSJSdcbwV;Gyu8m^(&xyk+H%d z`1`mF5tEj=aK0>(_6^(mR$K0vjcC3s;jRvYoFN?Y5pkYzH6=-D4%v9}oT)SCc!K25 zp#@Zg4=;PY+p<(QEJPp68`b4c{segoCJG~7N0yaSt%I8<4sYE>5qga{N}I%m=+FO3 zO|ShIvE$w&CqBI0F3og)`^kYdjEhvneO>S?%43)o8zu?@g|A-}>cFdiSPZI%&xg#< zFC%0-{a?|AqJ!amXOF05D2ULX9mYZRdwACCC!?`cxk?@qvdsj zs>!Y8JbH%hs+vzbl7F6Kg14dI8bYAt+km3Jg>6f1M&&&7!VOO93r3>E->KWW>& zQ;;UsZP&heH@A9~90^@qy%UBPXb>3^T({K+SZR~~R6uK->(3JIZ6UUr|2D#&|&%kuRpJh|82HWaQ@jhmt|c&c!Pz_PzcoNuxj82t65n2L$%#T_5Gl8 z_KS1w&<*#|1^Yg2zx5Ru65zh7;X>S*b> z*>&8d9!DMs*Y^%Re2a{{GSt)aa3z1Z{ToMX0h*emHPF-YNc#jne|j3Y?MOQE_>;pb z?l&1J*!gN)PDS0CyvSWRK0$8{I5^JF+>nuS8(m3oe5hLUTCCKsD2|53pN_63H2p2I z_1SJ7->~9wRXJ1~MI}yD7KT}-Nv?R2ON`IL=b1zS>i<&N#u_(;z-$(aIL$7K(-`D& zC6c+^DEvZr(i<~i`76H@t>pd|1J3^AHNTWuYqc68gG5_>N@;p18Sj)4Q<|Nw2Ok^E zxmBI4X`%^K6z`~?6?{9Y_=a%>U!`^bQ^V)E@z;TXmG+-A&DV6Eya4>rFVGk zm}ey;a%j_lmp9JMc^9sw_UK!vFIe!={kZ3`9=-qtCO~995S+gxT{sY&J>Z`wBSkz& z`i{Z%LVEfTbLs?jet~j%NiBFueS4AInT-3Cj^n1bg&|Y%>F6^0kHMw~$HIE8`&sg> z4z-H@`EPpY&xouf8_n;Z7+I+q7~Yb;h--&8r(W#h^2n|{l$&_jhSxU@_%sgu&^@oB zcU4c}VU+uNATh}iU6FXf@{t$OvodIpDWr!DCUn|{o_}p>teH+WG-`Jq^dMYMZU42$ zu-_63aKgv;l9e@zh=dt|YH@4$2fGaFXc@8o2Rvk=bN+(YrWFj^?l~aqNqnrzXN1*d zJe(5Ym^QR7rPk()#N$N8Ox0o|U*Jh?Xj)0kNe*cVNsNjT^n^BMPKgAb2oOjk`_nth zlRw*&Ul9^Bvj;l)Gc&$yX>P*=>)~gltP5f^NMi<%3@u(gp^!Y7?ZQVH(6~D$QGXe# zVu{0Ny1Wj;RanRk!$D9B;%b&WZ-R^_jn$Mlo9{JJ=crfRC$nn13qP;7wGr#B$$4K+ z{XZ!uH{I9eU0>9$zQ6YYC2Fs&WD6yYgRb9`S*4R{ zrK7&ONu1hA0@}40#T;J!5OoVB8}aA^d4mZL-3(5c(g5wWE3Y$B^GoliYu ztfjWBA~u~HX(8FGr0Qx9NSx@FJ#RmC7RpKxa(fqu4=Z`G6x8*|)h?9uO@0@%Zykr98ZlIe$ng8PgY{##cV73R{wy16Y2=hV4`al(_G#nfxdYpvv zxple(^T|It+$YkcS~P6rF-UbF^Fy|m{Q)0Ca zh?YoiWBwtg@Ykmpn2-F>P9Csk5=6P%IP_YDaDoJiu35wC%~Yvolx)HAWjb{En3bH{ zkL#S?N8&`l8Or9=10ok#j2()PIQ)eQMuF1#$te4IKYwJ%Z)g zzGec*N?zbO;qz8{KPM_~LMAuS6wpFTi~|zZx4D4)KwMn{na`Irk8U_9ZrB}swXJc- zclOSnbZ~t(Z2X+V$FNqsc$`!)N%%NF9dsIf>#uhc<#eN{|4ZTICRX2{2SYOY?A?vo zD7K*kfhz3ck<_?>%98X)eRPPLc%hn!ln#UT@`AVt7~Ps1a&%Gw`CTxGqKY6w8nF*M z7i8=}Djqk2*jFAG``|A#-^sI8iQ6bgePN=Kf%#QELv5Zu#o3=E!DXyyLsce4e4QS< z3FVO)&NotPo&~R2ZUClEC=vCCInl{6Sf$9Wn$DsZ<)h57lj)g|-$}?0GINAcz!)L5 zxiaL|KSucqDd^J0^%H*ehzCfTKccvZ3bJw3V*X^=fr%4_?Ght&_h-33bBa+wrYa0m zt8tjP!VsE^@-^cAYe|*&jv9$zgCB;*NKx`%bc&yRAnp^k)@Bf~Zu@EB)sO#$>C>LOYAu34j>T z4kjZ8p`|&4LcsDrAh-*$`G5pxSQcIR34BW}%R*?gLP+qf+;W+jJ%|=9{0G#{BI;_2 zNJFUtrv#6(WZ&OublXGy(M$dMoWetPN2rs4zy7O0NqClibf)UF5`9>L<8EP}n~sEU zHM-&K;0;>1x6f+?i>m~{>;%VV4|%Mmuc?Ezsk&ByF&Ktcq;3;nfAz^MipDE1`05h? z(xRWG)fzKiG>PpbVA4VVV%_)ECH6OxgELk#45SD~X~=_v2@E1}%lkjd?TD(U79b}v z1)~gP%X!nv?J#PDjyCSpnbnD(Fvqqb;~_N({y)CH0w#{IUAHX`3$(bqJH;JJan}OH z7k76lUfkW?-Q9O_cXxM++uc7oC%Gr*<|gmXe6zEgY%-ah_j|rawDkY>4_5-xqVT zyaFhbe$6B$Iy-XPph{%q{^`H0e~}DfepGOqI=@-Y3|!x@XNv{Oe_>kpfm4w^zF8*F zt&gvHB-0>~k6|_OdZ+P&W2N4{3byl|lL)lagMX0dc!$40^6U_yCaN(gz(vJ*`=;`* z^KHEil5L`bONP8FW;WJOpdw|Oc5k#rRS;y2k~E<|g^$c*#KeBV{@UMh4Eht!qm1t~ zmI-NOC%!rbFF66ZGyPQS0sHdB+UAHdvp=bJWr{l?LNz56Ui0As*<&>h%p_Q61^a19 zNf+j_7HpL@gmAbYeO)OnLQE&&p<5JmM8f@%VQ}PRHj*q~w;tkO-#>K=)l3m<9Nn_% z#QWJBX_pe2nvx zDeo)W`JR=8Sr&6vG@zp-h&l< zAXo)N=}_GL_NBF1$lvp&TJLS~Bk5)H{qC&W+ua^q^}5c-WP0Ax0W^J|AbjHM8r%GA zQ^7)CZZshG?66`)Lw_^dcJcuO!rJz?uNPx>e@LQo7l7`vjy+p zY8INh>Ih`b+nG^MvBE~?PE}W~F=J5NhvNgs7J}DSdW>=!Qz&YF4!9|m z7uEv#f@A>JrsCo#tFk&6eaoi3Co*$s*6pUeC>~$Q076z5(NUxc#iMq$-dHm$HyXf! z8jL|*Rdcn<52$+|u%U`S`(+0BF&A}S#aCN=K@mnE>Qr&D_e-bHeI-aLdVZ&N8KHRf z@Shul%i0A6D}P{JFAh6aPp2#h=bsoaflYa0=w~1=nE>Z17S$~9ZxjcSk5HsS zQf~Yd+sJW()r*nnS^7QLSB3?vg!ZjJcsqa5s0z9D*tQAyo~Py1NvmqoR+c6F`ZZi$ zUNE1ybAl*kjky;&uR3Bux5trqb0Tdlmsr-MuBnq>Qj+vbb+oLkU|wxzrEKuzX5S&I zvWP-iuic^C@VuC84}^G}y)>u5aKcOPoSFC>+xQMNIHAUJ4i}xrtlZoq;R0!PYyJ$t z-!1Slq_)MV-lWm#)NIqzyUr~PKIu#(>dI`Jt#fHMwk~kCE}`U^OCl0MiCBIAWnD1K`N{v)C4md{6TBEyXGE1L*KvViiZu8BaO0dN`WQ$-1IF_OQrC5 z48Dy0>Vko>V_9|LiM5=_XJgB{cE;t|q!a7n=au7km$Gh-`NfPgYwc5W?aR*2jn%r1 z)wYe*rj5ne9Tyc*ozm@l*SEXv2@6}cQ8nLQms@s<$ocF#QR01smr8V$l=!MPm2@bx zF(ubAzayNAR`)*p-N4;v`_;SMrfm5YA70}w_k<(9=9|Zm$Jq`@EkU-o;q=T*pYc4C z9xj$)QVv<@Cnu@1GWFbjeD()}21Yv`!;xwa4}WDHc6w$t->@@Z-wq~bGk5wbUD=c! zb=Ek@d9wkn^DED#euLXO(T`Hfxmu;bDK)hbmCV5N!U&y)QhH>kif~TXBFKUQbhp{> z$t2i-Ggc}ez>m?kc-g&_M#uG;)P^75akZ8+>s%8ihU&+2E7$*kD%Q=ZW*`JU z-l=9Ml?9&>kenu*86Uv-SnkJ|2AAZWi@Cbj63DJ{2;cv$dS;G#FYODEn0CDJ8eqH49z054qJa`w0<=D2~Ak=Gx; z-i-k(dhl;X(lByod`akxp~#=HFmmx=O>5ou%s+k7>5C?Vl_vja(_Ka5mOEYeY=F{? zsdX~c+eQw9TY@MGsW@zNiRR17X7b%ghRXt20kdX<6)s=;#>R;1QQlM|)n2-VY{$-B zgxqfmy1Tnk-!3oPY9%SYv$3&pa}QN4y8u6qgjlS)eg8jlgeKRmk43(#YD~WF$Ky#p z{H~4lwg+Yb2&5p$-F6I$G8W>CeL0(ZKP-Oe=FWWC`RDh`6qSrC>E+ewB0RF77K(Y2 z)e)Y32_iYTiOQQ9?q_Bu@CjX8It`c5J0x^>e!m)ZgwxC5`M1NM_r-H{yJ|jA8D=L_)tuLQB1!Tj(^j4C#I_&^T`=@ zFBv78KgXZFApGUaRrGG7`nFDfw*hx@2A8%5*CzTfhaD31OTy&&LP1u*i`3$B;Z0+= zgvmt}o2PvFK8!x9?#D09Z|b`8stGS6qpyX9Zsrii!jNv{+R{AQWFwk_b!>avlA0RC zn7}zHxn(4LZJ$5^;;lP!onW^%=z9*5=H^6M)l$@d+YWo1!8|Pd0*Y+a6ti)OZ7*5U z>F|RnEh5I7FtJjQZscH|lKj0qMf}Qhrp65o2sqWp?lCYu!jNjwlFE<50&WB1Zv)C{ zHr2F_7=W$i(yv_AgM7c0AA*l+;Zmu0|A4ai<)a{|LRLZcYlhEjAQ8Syq+lKxZ1xqn zTY7D8VU+=SCjdv3jW>-QD zzPwV_T>^FMg(UU)oTun_8mff;(OqK|IXK<<_m|ZZ-|VW_QKzTuVwvtV#7-Ak21745Q!F`m30bubmP3=TYcc4x8$S5Z8jSESgO|rKSh#r>@eGjM9^g=AlTrIU|L+vw#s9lQP8(4Y_+K z>x*Fg_B6i1vBr$javodDuJmVn;%cAnirYYwE6=wfn71MK^{I!p-dm3gnEov>sE53& zkG!VKyf$XrR@Ai=kJ-p$Sl=l}1He%UVN1pSdkz1P67nyN>_)1D>b?>4?l@w_QPM6M zQUC*@s7zdoJnsBR0Aw%HXs8^*9u_11ZJHK>80c%B=%K+SQIbY7v@jqujrQTeKnOun zZbT5l06zo)5C&ry#uzAnrrO?B7J;8;t(HAf`THh~&`N_)Qjlw`X{U*$9S56Su$Q+~ z{539o=aW&WRI>&S6Si9czc$lVIf+Sxw!cJ|*p-n;V}^EI3njny!~1(pM`b0*xe(0wk1e1}#_~Q`s1t1g*SRwu3nHwtsX3ve%T-eCX(itW@ZRkRO8X zQShatI3XM%2!oft@JDh=H2px!7cD^nG(QQltC4}gA3tbv%Fr4$!dOdj0>ouXf06cM z?fV4qp0P`?{Dy9Z5mvHXitM@~tD}y*2i$EemNII(F1gELd`+0HqB@D+6v`A%aZ& z(Ax`YNLzJ_YUucoSMN$5a|2NZ9FVDT66~%^F|6rmwqR$sqh}Lprgr0}6Qal=|1^OG zI`-RdWFD>AnWc?l$cY~Wi?RiLh7B7>5pySpU;;)y+z^#RR?tvwrA!MO9CP&bMW9Jb zj0Pu1Phd8y8N|S2t#jygeQM1vg^OSt75uXw;rNPgFcb4hk)Q&Hi;4K}Ur(}~jlTuV zbi3ll0pDo3D2U)g;qvOX|2nadoFIuT;UuR*U;(OKkkQ)T41D!SXpRT#8NtXJNK9R2 zjO(zmjZ#O>q7VoKj#?G*jdlxWlakur)V&_!l5I-_z27Z z<$eezDCO1Eu9hU;aE1{;u~U6(9HAsMGzhmds84t35*g@@q*#W?3qpl9hte&#Zqo|# zTs~L3`xN<2T4KF-pRFG{Vz{Raxc{b%LWHfu;cXhNsoE^jB4rH*owzH!BK#BeX z>wfv!U3i1ftmA=5GmwBJ(KS^qF|nv4xl$UND@#w>!o$R6r-Pf%-nIEJHJ!3%s^-kB zlj~QnofkseR023sxKbec_%1p2Mps!XPA9j(^s_;Ou|vz#TYGS6?Mf>u$Ia7iVC}-C zwYHA=))Er`B8}vCD>icggi~<_lV!cN?2%QD{Rrz9GRj>QyUSeHSNPS}JhHu|Pgi@7 z?{HC<>v$tOhAkv+LFl&WT{vz8+&m^L4 zFrpvhxM9@ym`cE233mOw2)E+n?cTdrP`B_gv*Ocjf^JE%s(ZcahHN3V==O-P4THq- zs1o!|Lhldb9F612EaM5;SVim7`(*O~F^69l5+`#MJ_qFS? zh!Iw#p#9??nkV}JV-|_}jAA{;0a2JGtt`@n5c^h~>|)c~`B9h~;h?qIg8O%WINk4~ zvlkqRwu47V8eTr(lcFtzDUqCf+7YhDu2}83pgV$2#FM#m)@=JE% z>yo0Pl>1k|t#v^M#sx#H8SE@JE8F!-DE{`E89t!x!ZY1)NZ2FOn&B*qd?nwX%9?+8 z64myqDIsW5M2V_Za6UKCqiN6^WMMJFRQ{MRx1`@l@*z*PW`tJ{1xn_x1hxmz{^$sg zn>_4VGyX$YW*V_OoWL;>=7c?NL`A$FJ2aa;J3qF+8S(&2>|@sAlUT>?sFz#0O|WHF zsmP>}o}C8^_xxq{*`31ulVH!I5CBrof&dRHxQxpe!poP;%NHF;<$yhOb_J?Jv&K_c z58av_E0Fs7LA>j`Iz;RjtY)?UB3#?Wc?mCjB6&8Q+a)|QFWWM0+cW#uC${Cd7GQ0x zDn^mGT-rdq8Tr;I=Ae}f;Q53S`;=bmHb}f(Cto>OGa1-`w6-MK?%b02nRP)nx?w86 z5|ZuU+%hP*X6U5~kn(vM=GmV7wkFHnsrMDD zm9^hrT*$VkH}bf4(&LRf^8y`mIn)J;)h3VG9ZmAre$b2+!DPBK5QyhD}2f6{v4S$LJ^Li5zW#-fQT0`_A*!|cM~eD()B zkriW-SjmnDa~wH3e^E8C$l;1#yt)dMGb%dhm*y;hucll68b-W(m^>(j?dqJw?+H9{ zd+YZWTYT7it)o7Ks8t#V{C~gP*q)8IrfJxbmmb}By{1EsDY4e1hq}LIds-_jBtD+$ zq1{$pj&`NRI8&0I-gKRfhPM8CINX$FXsPcmx$LGUUcc%0T@9nbDXGSp0&a?12S$D- zj0fOO)iSPjt>2iMSt0!ZZVvi9=$ugzik1SE_fjbOo4oHVbN7m_SAGK1zgXRl!CpPf zZ7k^twc^SLGePBJHBRe2{pMFD)55sKd}W$ z?`dp=dn8FLWzAE2&#;F93sEfUGa*~5SvrVk6%DJ_6tn_x zH^UX`d}5ji{+y`=3fi`LPQ2@!>6v*sXK{J2Ouu^eZ}>8q%GEqtG7EB4;!Lz7#>bbe z0)tpn3!T_!tm>u<;&TZpj&se3fdMmCY{w)t*v1g2d7Jir6;pKOFiPem;;+MC%bR}Zpz_9`QRkrC zq%vgQ1&rVhi08#?qKl7!5I`B+g=3ay^zs!R-^>6`YuPW!&bOYOfSY9sxF(FWxcQ~} zh-7UQLToT^eA&rvVMQrfPPPG@F!T$I!$)$2v@OC-{A;r7gdFG~`r)_ZoR}j*bP#v! zAs)Z`-_FnUP2FmYTdR9#bk*e(Y$Cy zHKh#$s1sHy7-<$bDmxUJI$4Z6S&UacTXVv$GwxG#Xt#Ai`|;)^G!R?}N0g=EJgT6;ARwowJ&7-a%Fj#WmC^Nh^z-Z5Qs^LDu|KN( zQ&z@(=ZJ196Sf*Qv^9FMtwAm4!cuP|>YaKk#}DAIiHd2GLj>$z zGZ9_x)X1X@v!Go5xCX}Ip8|k{EL$L6jSBRQpiy2;Q3;LBUYm#lu$v^|DOwHF#-~`5 zKOiTl~R3pD-k_hI9;tY>KK6Theo*$<)4raHACfFn{+7E4(h(NyT{A@_GLhyI{y z3t}ILg~fsk*K0<$U=sA>Vhe{gK4(BT#Tih^MC~94zccx9`W} z_3mH%7uUCD>{wgDI=>-UGW@?*B>!u$wdn!X-Bx>${XPY;orqkQTX$x@D~4#a1OzcY z{@K0O_g^dYMpE+gk>S?4*#U*YXjw#3e}bijfl_}!@>Jd2ssCOF-c70Rg=7>we7=x@ zx9;3#>hnVtq9qN0Qp^ez-Mq1{&p&7AA=Aw)Ne_3r{kuupYK6iM!PHkW`eSqBo%|y2 zhmf61{v}UGqs7Kap|>0NNsi@>)3C?Wu+GJO&+5^8?QA#&7eZyQ%X-{-8{?)k+(Gf` z4YBQr&(AW3_h7Q^w6m@K(rh?!y6Q-sPQH7mtqCI)u$Nrpi50GHszQPZ8l`5^jJAxF zpk{^y_TlgFTS(}ujCoZl`>J-VW$9SG>OLAK&reMhh^rjNA-b5mkrI(wf(+(C%vT;* zQH;G5B!{se8ruqz#gya#Q`2qS)S_&*zu9c##r1#32*~&rtK=+NzUSmgE*^|(dk`$6RSA?S)amC|wnx^Qs4fOow_biK59{m=Ni`4X}D@^ABE zKS*%{;%Ly0><;8ab^ubGw32DY?oD0ASp7gCi+s09!*Unj!^xs_$5JyVGr+4_VZ9V(JYKs$MKja6be1jM);Tp}u-)g`J&fiF zOd`1o&_5n)_C_;@yLK~0`>Lc~wSCuh09H%8bkjUvi%mmL`1sGU!jnQ=w!OGUa70;w z_)ZY!HAL2wtlCw&c3Wg|x$5Y-nYI3Mf0osJ=n_3oJ=Rb-@*Hj9!&BJmq3lhm!}A!h z;`iTN04Hq@Cjv4sY)*|b+haYRSUByo!pMsP9jrVZoUc0aTLm6(B@u5WE`L6xi1;hd zJ~TP(v{)0G?OHKBmv*wf&oaElCL@*(igoI6CGmcz+zb`Hjqp?(f_Of9i=Q#37~C+3 z1;V0r_ow2y_^`vzN(N*Cd%<)nWRL=gN9uP=4gHZuV@bY00Mj>UO242 zIHbkkO675*5b_(Y%WMjAQ)VnWuw^e+nM8U_?Ay{McH; z-7J8E%{(M zrX#@{C#W$>WRtxso{|8ZEv!W`s|Pzf&4 z&UGSH?kq^ZorvZxBI4WJyqDER@@l#8^_}PQSr)RVWVx2Hd&T}3GTyw}-&$%Mti|uG z#ebhZeUG(-Y&W*`GHhWpZQ*n-gZat-biQu&=lpcA-|^5tqYI3T6jn{~J;T1d`nnen z@deDV@5FEDzHk&tTEhGonC}_j_;^&~f{sRZm#B6VXO;omm{oP`z^J*v)PXlp+BQ%; zLaN=AmQqgFF&EqEFJjBHruDSRMXPE_CkJ9&9fpJ)-H&IP!-<*U4q*d`;a=0;^$vQWuMXjIj zoSMC=US`2eG?}k+)Gz!rFZ_@0RjxK|r@OKbU`Wc{Pq0Z5pJ@@_p-H=`68!R+?Bd$l zfz!m8)7XRy!~+i|Fugs(WCZ1``kMVcSm2{S&bgxq;L{3X8yb98ue zGzCkv1amZaX^;rg9tblZ2;-lkN4zAAHpstkD(&yskJCkX?58+fr+l|l#pTYsB36Ql zDh;4+kP$jf@?BueoMtpWN`iJz$T z3z=oM$JHMlFyFn5b0A6zMYtQ)E`mg6iStQixVpJ6Kq0ltz8^?xhz{wX92-fk*HDe* zFkb)|OsnV?-q4Gt!=iUFmX3cq~SWx(E;#+c1AM468hS3Al!#-_S&K3_P)0 zVm}aJ#6GZ1p<@wlRa5HW?b_8aaEZQy;8ChVqQ$>PZo!ZVny6u?V2D8^SDF#*S$*#nF54KsJ#G}E8HXd@U4=NCCHpYEvN_ov zZ-0ieK&t!?;m(qBtuiWCzgfIjk1OlLI!q|$KVkGAnkiV;$qY5XM!=wOu}!QcHHcHM0c>_#REKpb_3ury_- zByoZK)d$d+^d&qwKo6xkgp6R*Z+JlGjvVZtoqHe+rSZHUvPyHpCpdGOWi2)Q4bSfG zQbdU6Zc5{!mpW_nJeE(93Lz&%#aW&$)&DlCI`BPjY|h5pakE|7YPZxKt~2*`_@u;| zcOeMFcxMyW!%9|0x&CNf_1S25lCqbjZ*QY_>#utg-balX$L&bZLR|2!8l7U2E;7VRN5oUe_C+ss=(V zFdaj7#}Mt?D*sb8p%q%~rUi>x)f#_2GNG^gKBzVjV!IIaSws|D^00f^3AnmA%HF+k zKhL$={qB*kd)uD5`S!Na{ZZWi(eS3K`Y&~}=a@pn8de0-&r+!3xp&E%(q zF=$}#B4T0{Hxav8z*IukWo_b2XdrX>nhtR;@Wd!ZtaHgei$>{Z`PO2xN zB`RPbV$=naw6c!4oe+!fcKMks!NWC3F^fBT+t*~o?|%PcFwK{Kl70q@{k=8DeG=md>lxwlCe z6Q+NDZmVfAD-Sn0lXOxN&;L1)0T9KDq==FUO8nCg-)B-Qsi(z=rT?1-f6U(?MI0!0 z87H2PAw>1LS`Myh=b`%XEnJs*iamjtij;-E&NyM1;`;kBdBJz-<88qZ;PNG^2frfk zv7O{2;AV`0A`hq@J%3TVvKBFq(rPCDg=>i>Jif?`pm~=HTcj0!#Gq~pHb1-xrc*Fv z-Xx!fPn3;9B+b5FNg?G9C7e|_4GOl?+-Pq$QEx+a5s>^VDlvI7gOAU($*`@%sII{d zQf+xgZ55BA_S;TU*Q!#}Av=Agae2#iajkW6&Rpv1_q7eLj>hwcWh1R4b**LJHH|~d zDtffl_H0YEtLPEb4r@*83$`anxzsc9t0s^$CrvCJp0xHr77mLOhZSmv!4?jE96Xlu zspW^?7bZ-CClBGBgRHE3Eu7z#<=#&U9qhNh_&%YzwuW}D5p=Dg5n1d9uRvrJA$=pg zE;coUhM?!)%NqxF3Mwtwa(XH))wFYq7$@Br7q&aFzaMke4N8zrBPh&P^~i;Cq#zWWFJtOE4XEBV3ucv{Lql2`N7cC9D3e~anXu%()#Cs43W)J z=hPhKq1i!{a82<=S}(u7F{3p_W-goTBw7;>MH3HI3lCL_1d?(XwpajJQk3IZEK0Lb zj+mEnbN;TIX;mS`x=2jIOhko88ZxHrI;8A4r0v+F?K!34DXiC=eazEv40=V4dLbr2 z<>&7DcQi1Pk3Jeb6M!21OiX~lFWB^t-TUsTbl;RZNjN(5&s?npIKWQCW2^UiE8yQC z9QBun8G(n{^=Nt6&4WNwI(PTZ9P5L-%8Fb_5<}3{JIyY@1Zua8wVPlGNsQDgj;#y7u5D}(mZc9tRX6oe5qEkFq)H@+Xxt4WGF_ad& z0ST!MhI?xGpb<%b;@=I#x@x5$7>5ORQPW9Uo6=d)|MW*JP`q5q0q8N4Q-1_V_?-Xk z^~Wnx18%@6qel)<9o>LB$2)Ega-e8f(5pXvI;JHIgwF7bk_p!ZE?CIou~;a&n?qo9 zKOr{7l!c0UG+vmZqqED`<`R!r`bn>7A4VpoHtj0CscNB1NJQ)Fa=j@^2+-R495VRE zb#MEI4TwFI;QYEQYy=gH{PTYeUfVbR?12pNK3bsGmM(-)C|{k}+#lBGbRK411Z3B5 z_de|yhM;E=%eyrR{teHCu8W+j_3jpfSU+dVdN3Wc<^X8|83dkS(vqo_bu*!f?_tFq zfKo$|l%4#k0NYGi_r%P96?E51Dt&Lgoz0h*UDp@I<;1?v`?DA2NS@WhyVb+!Rm1l> zdXg>o?vsrQLOL&xyLSpg8;>2Q3w;-Sb)63w?Y8tjZL}Z9!B!7UGcR=;CHq`?FhK;i-yu=C*cdBi*70XLjjGbHY9j5}Rxg?oTBwwIrDYqtviT zjgfi=%;kd{SryITQi@sa1em)77@m)+k6ekar~iT6Jf7k|5*o0HV1>lz=oGA*HhSXD zh%9w9(3`o!oO3c;H|-?Mj{;Y2|iwYDb=jvbyrhOhD>a;!K#<2Er1YE;$9cS|$+B}<7Jr!3&3j$y^9^Aq0>*SeL+bD zgrMy)q?V4KJ}eqLEgMmrc}SfBAl4Zh;^5jYOXH2kDcjtFI6Rvo@!!L>>J|+_BC)`Q z=J9{4;d`gzJIv6+4xHPfdDkU6x6y5qQYC{zmGuYwHy))-UrPoL8y+)2EafwkWwp_G zuk{NpIc&qMKjiqvHpEO*^tON60l)mTc`JUoJES|CTuUK&9~Sd%qQGFIvik#q7TJS| zg%g0KOeCPb=^%mcAi1j9;ZOqH_$LDGnF=r#5)37gkM%l&_t_yrsRKa9UxYl7ug?4# zbN-m3p@tbGm?{=ZbW0w4OW1FTe?U_?4J_XvbIK4vO>$V!uS${=zXW?crV7Lmc7}Ez zY-S4$9A}L=2O3YS^+YHyGEru;&k+r=z6HkJSb1-%VB@E;9d`H~T8uYb&QWt)J#2t(WV( zM;A&e6{T?B))$c3@2&r-w+NbyE~Hd$<}M?iovqsDzhB^&o+}w@Y*w#UZ0?1;4Q{bg z40icZE<&n!KvFFZduE5J;JhOytO93F4m3|K za%`k?<1vNpuRRk|g{|H9@F{>v5|&Fn`6fN~NW6i8Bl&TK7mkJl#(Nmr-K%ZCqFn6mdW9s-xR{!jNs&p@KNc`EL_kwD zc4+5z=2DvVeaod9Ccvi{odi#eM-jJh{D&4o_`H>UOas{BVKvjIy&vJp$Ydt4{VZbA zrapa)$RD6ZC{o@pv3y1~W9iED6u=ZRYh!!{7>qFq>#0l_mQP>9S}W4%3E7lG1w^p3 zN2#iM(^RI=(Wf)fXVTH9G0>(k&}T3(KP&3;>*z*6s0UW&!%p_oPUhFzn#Yg=&&((o z8#@*jLMoe{PUx4KPX)sZBr8WlEzPuy;cEU@#avh8gfAIiFumP@)3mfnzp<5UPG=NV*C-^dPgEGZ zG%5_%|K!~02sIRWm%CP-MWvp$LDf_pN@#|H%3d2VzNU!e+p5;GHiFt@2Q_X+;t+9e znUsOMh&q_?Rg4N**|=n-E|Jho=hRy3+#K0L&9Q>^LI zu;sz9d&9iq^SB&f6>zz=#WpwH(>bJYngJ+C9(nvFI z{W2N0g`zEv;Xj}gk>G$SL(O=TDjs1~Vu(qj4f`DR z_s&xrhAS2U$a2)y_I1x2PzE)+nqOMa9bhx|vK4c=9lI3|Ne3xp7U1c6rSLwUzTWBw zhDXm}6N?IJUKw~?`FLzy*l%_MH(tO{3i6Cy!klIWAZHaYYb(I+wdR$#SUrrk)FjQdolR%@gN ziyOo)qdp&pIiL}v3P(FnR;giVBqDwQOt2A`+q&gl@4!-_MdnS_rJSY5{^yXYoBQ3Y z0k%`U`qwcBVkg>uST8*yK4jJpQcOIZZ5*3$QFF-EqGRtoy)(`m&0t%=gAwFocGngsX1YQ@M9dLoW z1I_#Jc3`nYPh_X00)!NRZw4>~QSdfxgX9Z3WEI>~QCNZ1^3rAuPvgUHG`0-K^TP$n z)DPXlwxnE1uN@X2@dw_hun!xp-KWp1*;PJk-gmbfmUWMoVcv_FFV&;*RikLzW8mzn z@%PcYWnx>eHE&O!OP!~#m$Jw95dqhPYe+TkU2`4mR!?5Gc3sVKJVkS}0$d=KCRE&HkQ%{mgFjm6kQFX`COcO~qjoZgPsADUtWBX}N zr5PuNxvvPb9J|T$KN{vMVmGL6;9A1Esq>>Xq|@s>vV%F}WZp$w>KwJ%3|rl9POaoV zC$rKGtJyZ8x2a91p(b57epoK>#N{gGpmjD0N}ZmOhdQ52#|@%4+xf{wztYc-eqfel z>NbscK$Ar7?&n`5neZ}reZXS5=N3=$^$T>gbspQYAs?9Bo%+ zS^#tP^LUph@5AEss?_q0(ow&Mx2|j52fO53>-Jr__BXkZUF+gqoo4G6Fz*VG@Y1p4 z(pBM~C&+Vgw+qy!NNL<``(-V~wgb$!vQK!fB>~JoXTpI;yNz;v0eJ|JcTRAvHzl9% z#hctn)t{?{IJO`ukAQe7c@GH8U88y!m6r=0D`r_&K0|R=jNdm6KEs0Uo90;~>c9oJ zmn)wlJFRm!+50=J4T66k$EsTt1mW4_ZgQ|)rloQvmn>orB_r>RdfbRXJ>|uEEtt8_ z2n$#jWV0&|MSg3ZjCVbasD`sDvq#FMV!(@=(V$5jW?)MNr!$YxeZwa>hff6pyH953K({aN5|l*m2KEp%amvBj+{ zpel?0a*r$yc>ko`Ia2jTyqQ{mk*}=ZJ~L-6BJ{Pv?#ANpLYK-Zk2?s1xkX09d3|&u zjur7zgR$q#*h@N;k+u!;!q7P&pixjHDHrJYbBQ0ON{B%W5qeGsS|6xS%TL8VBP{@j zZLsXIcUUKrw9H1fSWQT>%p*;D?{?%s->H-sm$J0Y1#?Rq^Mk{WiG6RD|B#NP={nN2`LBeOqpa8M zfHCM0&x52R#;tzCu2r-~wGn(#GpkY8>EGSq?-%VUmwysSd8t}iL({Aymv0C^)iM57 z+FQD8{&+vN-h9R5p_+y$81Dyr7vZg>s$&$I&dcvgYD%iRRx+4Fmkv68ulK~OmU!`2 zJKS!!6fT~>-&*14)LwqYdja=<;CNF}oyh*XXPaJ?mk_Daa9L}LII=d)%by$=$OsJ; zM6V}otv#w}DLHF7U$$TU4$PMagEGRFeXLd=z&?MJM)6Fd$E-VSapxU%h?(2O2EkFOF0kw@t6TLw;!7cf4F? zWsC9wdlEycc)};f8M8TB4Drk;c04Y&{tWirpM(itaX=cGfL-CY#2H4L^l@M_pII7f zx>WwO$gFM%`H>6U`o*8o{ifwL&UDmyV_sa4bv=xBRipkCuvw;PT>9%!ZLBbOEU^Da zYb9s*EJ960Ze>9b>9}Ar1rc&Cag$P}kpdqCqS zaM(@jP2KTKTx#9S@=e`x-Hc`d*hE^!L^@nZJ;A$-?n6WKzO+tNU8#U!m_vQf^K>-% zRC;OU$GaDkCxk^x+ghvL#LMg@2#GOpQtu0#JPe$w$eh&W%WiZLWOHI-^MVv7n|9*2 zvJpfz<7#zdW_9D2$^8mlI_$R7r>^iR9l8aB~ppWulh)1 z!fcD1(8TMDeSXxU3DzZ<_!da09F-{S9;@^zNIXSp=%BRxqLu!Gwt#~+RTXPQRpkX@ z_JyKtjyQZ75gUei)y#-&nZ5}sgTuJ%TUt;WyUO|J3SLaUWJCUB3&CWQDtWd=B9?i= zo|A{)o~SUFnE-xnEU$#Fe|tt-+x8!C`Mq%9BqBdlB!2#rPT!%2Eybv=ixUu_-jT!c{j+uo`dmqUx? zmsozQZK~-qmRs#8vPM2# z?OGSyq$W3;)l`A>wM~RR~lgfn&pK`kCqW9J# ztL)ylABcQ|dxvu0lL-HR@RI(Esr2~UW-EKt#~Em!*381XEwaLDx$gdOI%~FX86Mx3* z_Z(md6J`yaXHmK#eV`MpRm12GKw~}JWyZXYTUMQUT-cXVjEAuyyulr}ebVAiQC!@% z>BJ1%MoW8M+2=MLR+dW%(7Z$Pj|9 zGE2YpwaJkG>>VSo138%Jl4ziqY6c7ecf!7(Wi`=WqF=(DqeEp)>rP5WV;8Nmtw9!U z?U5gNLp%w|JDXy4Uo^5EJ0{tt4}+wozXE66sM@^I1x{@M4ufqAGIS6%FOS3uLBBOk ze8nW!!X@spW9NBo=UGjcm220zOQaJYxQ&9~fZ)_A4^J8_8RFP5%fZw+Z%lmLfacGbRop5(qLZWj5l0IVu_u*ltse`hZfB6U7$9H!*>Dg7FIbb z7I7?(~G2o}coXohOzpS6vaGpIn>*JF1K+w8d zJW+>z{McAem`Ydh1pUFXxoYJ2AU9p`bs9^t7LsLO#~fiP#N*;97BZ=x!f8-;V6jL_ zUQ0<5ZH!Z%!C{szki|Vv8{Ckq4X(#Guqo{p6shTO9c2aDD>UR$_a$_2d~^*o;1UL7fzUBSYhzrg6<*yCY?| zpI=ZWF`S4RH+p%&+}c`w1?qame?hXL#N3dl?aEYkqG$bB>FOvCb?>Iw(_Kz>OfB1UKpt!tcXtWFJ-BP*?(Q1g-66O( z?oQ+G?(XjJ^?PQ{sW~-MQ}z7VbkY21s(N30t#z-vjpSpy&00%AWxtg`7!^5xpgT&` z`kBLGG?@yX0GjOq2YkO&vI%>6Xfv||pcAd4zn^c4zOVlW|1!=uy*kb_s++t~{HzG@ z;n82&rNMuo6HJs(!D~xu3VOcWr|~ka_DX)%=s?CvtL#Ltr2{QJ2O#6-%S_b!)x7Wf zuJ3!O_ve)_$;;qp+=usE+EMD*QfdX!v_>o;c2WmGOKhx>RRIi#)}I>bM_{9PI?Y}| z!+y1Hr_uE6?+Z7_i^$zWpP-lT(`#xDpn!F!F(+&}8?TO@mx6=UWAXSXQHhySuK$2I zieB)mQU)gZywZY{fu`hiMnlXLdm5%z3JkdS&Ij2nMHvIZ%Yxs8u9bosywOl9lI>6d zJgKK>rNa_iU5Btb39{u)fv~C2-O+|GluWklixQnD7oVpTFPH;1gXXfLs2nN;s8QFJ zKGeYti7)K)XVUx+#Wu(@U8FCkY6T&+BMX8I^x%>kqXFoA~snLD$pa@A;_BU=~J zsfO1~W9N)+yK-A&M?@5PqZW@^)G0+q<>STYOU~FBXR3lE6Ht54SPXU7^mS4fyL|4i zZ>H3}-!p1!7ez&FBM>QRMv7=?K@muUh>qe&4iw=x0*RP1N!SyKDPt+htr zyt0aP=4^|yqcgsOXScTNS6hkNM-p8hJ4C9b-Q6DX!FRN1k4utkey$x~H?pTAv#srK zpMiZJp`p+*(F_9osJDA=SJObSD5yUQ&b$lqw7l%i-RvgxgdTUkZh_uhW1cSvo!9vf zJe)=zd0eeq!`0ZrLsU1WMvk>KbZE*0dO}4L zcx`Sw@n6i`V-=pv zTXN#zs6-*yQoRPsH0w$i&rXap9HwdXYN?a0%ZxKiv67}qG zEV|M#O1S)qJWH00_z~D-E=n1`cW6-PKyCS>M|LL>?_t#L1TiGh5j{s>_7`r}c8Doq zoUTC~p9-2yjwM#INHot7_si#bpE=?00SV~6v~QYbtz;;E^N|(}k_D9a64^b*JP~rH z)0PM&HOl(o*?AjXg;=jQbw6y*Y~PFbh7LvlU-t0-7{+gK>)pPLQOl~gp+_J=5Xa{o z&f3y!;I%xOKdz^X-Q;Xw8wttM?GtG;&{X_^pSSk%dAk2_5M7T@-Yc&2)BWY+kTMo4 zK{xLo%kjW)qFQmhZsyV_A3uT=O$=q1jJ!`8YGqHv_}LMK5bU-PbcJy=~|6g=;2sd+83TBIMy)(U^hxba>zM)(ggzJrMoEEjse z9lso|HyL?eQhmi&8r)PI+*GDqQv^@YOEniPd5X8ZHaa{KIp0`6_vjVLp+u?Z_;A|o z50ul!P-uFZTAr%x4=9^s>%^HdjQ2=6L>9Ir*YdT}<Y7~euyqpIGMJLM{+JL6-!dWkZeRw5_Q`2u4SH&6 zG~4NHP>zWR4-T)`iE+4OzRCocZHp*600@uRkji?=L^jCmD5BZz>3VKq1~W7^hOSe) zk406_^ENe%T`LlVFX99)C31Z01(_BuNzQMhA3Vk2w12)w#|gaJ#d!Z48C0cPF%MyaNH3GK!x@s2%po=&LPxSHQ)AeUhtw|H-$X~_I)vG@<}NhDM%m5MZ5fNM6cA{ zzV_}AQ6G)1cS2LNQ0in>aAq$_~f`o`?zJHfJM@ z8KD(Ds@;QePE`s~2lq98L!|Ai2;ZG=&;8~XVI7%^<;G5+81lR9Yq`M}34A0-B&AC0 zR$xtt)@+z1k3ANjAWqVHGp4ji6`=GbeuxHK$M4Lj)bvf$xv{X;_@2`mIqhZ`?iZ@k7 zkVI{9nZC5tpEeHL-H*eAU9TUXFN~|5tF7Ro&L(EP2W6Y!Kfsbot?nr6_Xu#faLiT9 z@ZZe{{ZN#U*1m^Ip~ztV$Hk*U*QXei(Q4PT$1A5^4_G^%6MvpxT0f65a+77JF z_hpSI2)xycuNExUKN`!?ZMR=Oc)mZ(Rh5$9626t4dDkadQXGUj zQbEML3a^8p_!k}*9*fn<)uybK&hx{P^I||g>rOt)Zlmc%r_*kSR?0>T%c0&Y7lDJ0a$!}n5v5zC=SS$HL(;QJtgzyVL2 zF{!Vp;SMa3L>(UIF1(@&6c`3f>P(Rw8ANR7wVH)6ECiBL#)*moctcEkAZ=CJ5|)Hv z3t+e76g{{p`p^z$?P6b+Q;e0keEiUfs}fl_0ofWjgH0gpk;xI$XHy_ioOIo)?NXkU zhnF!fr9dW>T7kS@J7bgXfML=kbQwE*<$8G#!qC;_W?#{6nBVO7ujIvyRL^cXMMwc3Qe%mwob@kH_0!ze4UBr8B^`0{rR=+neWvNGc?dueCN&6Wb8|cBsu4CQG7l(HW zxUzV5S>n=w&6>h8em@w=4j087T2TO=#O4jkE6wBIK zh5|WY711il35dD-tgJK+CQBxt4+zzy02OkA@-2Et6p`rd``2@CxD=91bq_D6>ucav z0l+_W@C}?XBqqKV;5qaB+rQNJQ^;s2Kt8&MPXOD^iS6oWX{G=iFdR&|Akp)P?flEb z@Qz06Kxg-;e)Yh7c@C&*8|06Xhug%e7|-0tjB0Pxm}M{C9J9#a&KO^re4Ad5{Jj+2iv_)~oh89V2 zp;_t187$pH?Q>p!$&8vRkec6eF(VQU!xR~2N3g^iEL1Ahlcto+6Bt*qXi@Leh1>c| zuq6i&E4A~IMiae)6)Kp*MKytDiwv!HU}Bv2S;&~PsFO388cv6~)Q$!h7%QvLfIAHE*ff8GQZbo0spH+AA7}3xDu7hl9moOeQ-3%E{#|-_23z1BqG2|E{4<%7d}`}XXb*@JZ2SMo6pCnKed|Fa%7iSD-xC1=1iI-mYwl*l?9{KodUhP+^#Le4?Nz`4zS%Pz4 zd$68(*N<}?HW^JRAieoXrxT8sutJkS4qo~V0~60LnEkfnHZqDa6lFaFRFbTg&ws{S zTN=d}u2u-%FSjZ!X1U(p5Ar0iIa}zhTCF9qrFB_XJ@bc>(&+t9eDJ_k@3sB)PCkA*+>#nBh`|6q-dn}INZuoG`o^+Q#Dgwd~NA7 zZqq9+^nXYi{ONoyg2hCzi1<{A+BJVr7**dRK>%jO#&o8LY=?N4929o7nZ#MEM#G?W zi8jd<;c1(Z9lu5?wW$jo7mpMomz;qU5MC2QjZ}yTFD;L%yNCUJGa*Y=$n`uEwqX>V zc+Iaty8I#dA1Lc_d`_zQT)=TsW~5L|oWTrk;`na2qw1g=DWS4d%rQDP>Ga;ru>G-$ zUo`>2SoD_p1A{w_DwV8O@OJ7FOgDTWBr!RrpQf-dC?T9k?UGwjd=d6^6F+&dQFpJX zHtO+b>I}fPR4|*tYohZ-5m;k1y$Qd3-|z0%*Ej4IWIoEkb&9#?74xXD<*mHrIq%E5 zm}ak;7Z@--5Un^2_plS*1{WHIhfe!Sm6-L_9Zv`@e6 z{J6dO@x1fHzl>&h@cwQW_C*2uy(Zdg$*%)Xzkb(5$~vE&>pLf|;3;w){ykihm3DFF zoMq8{s|G)ZDU(m{*lnt4v=U;ZGOk4M#t(5D8RObASq^p^l@oKkaKeP`L?}uu+`MiX zDgGiRE#z`b>3|`muJ6iSVSDHwDvI})w^6e250r49Bl30b^C1MUEUJ-#HNf$9<~gn5 z0zL4^SK}%J<#r zCoR?GuuSF+RHIOp4Qv4ao|tus4w5Vlo-HIgYm3xTsD%wwQk5J7Fj>L!B0YG{6t0k^ zy+~b4skgulg|h5-fP?IxV9`7B^6lT60%ZG9=3GLZG|@A(&={cJ&g=eoUWDMshl9j9Wzr;3saglpILEv)Kg6Ligc7#L_O2h~4aKGp(mC99 z>sRh*+Ekc`-Q~MzH|`U+ds*_6yw%)x0{o9>A!l{wEjTl1+S9}rZ&@y{;kF;EBmeek zF-KF%lNps5wNSTG_-KD|!ye)8fCR*7RA@;JO0_$YiRjdXTO5KB{{oXv_G#z-5-7cU zq@65wslLC^?yKE+l|EUN?u?Qn9W7DrFNr&y)diAECrPJJrTE-Mc~5xuT#KKo-{45c zZ&ODa9-|M;6owZ{Cm{t+c)^xXC)25PXBl8hZ&Tzr0wne5KHtMP|GghvHodC?)w?p2yO4tm-k+li*N6up#|k5lA# z8<~&ZBVI;jmTgPnR~E+xzN5go`Cm1Vb|Fi(UlhT;{(KO$8LlW0f;q?MPmg8xCnQ|cjQ zG^~ZsQ_9K8OOm&!yq&aZU{5k@vR#lYA6o$%;@Fqm$WZS5%(i0 zE%0QN1qcBm{kXxq0*Q5rag2zA)N8ws&tid)&-BQWwE~RN&!ptX~W)%s;U=PKcuq?S&bk!_*XICW2U z|C9|@r#ORy)?mZT#3exa66pVn6deH$+9xC*iVdr7|x@N;zp(q?jUyXe|d zd47J1XfR_0qFxeaC%5KXQN@*t`NwJP8)xCOt#oud$hAxjLg?4g>X6skU*gma8 za{;$Do=gRqX%U-i>zn?WNSM>hzaWbwZTX)8ed$jZCI;WtTe_q2Zg0v_ywF5w3LVF1 zT12`dv9C4_AX6>9ysR z+S|S_=#X4i9k!lA;-C6w2qV^&GjA+oURp)FHah5x_bwl_Okni9K%IzSYqSM&HGUCn zL*UZWg^XmRYvU#w^A&C^-r zUXf=7`Uowv0pq&@?=Y4b;af08P3oJ=ObG)3)@=@?;~F<2lU|En8L{Gxy}1l+*t%7t z-&Co?C_PdMt5((dd=Jop6w5aY<1*2?+iv&9Q_|PKAkXjsT2Uk3#gkdKM zawFt1kD58^*xp>DLcStcv7GJo8alDBgQ5z(7zuRoj}5h^#AKZ5a_>&O{J>h zo#FMCqm1G!A+)wc!r;3DTG-fVepmoGH*r*Tbl8uNk6qdrRkZ+zqEM`4yV|_L)iZTJ zD}6mR1#GxH;_4b4C>o!_YgIeTiHSVI`T=8T3nzu>K-q?F~gm8>c`+Hg5xUT!0 zhH6j>j%N(^RxsT48{dvZ6{p~&TI?b1$bHft3ppI_k@CSa>fu|M3WXdwN9@usL+CIR zGVn#W-UzG@RyzD2p&1-9FQI@tzy`#G7!}1?!7uKETk)kMBQCCyneQ{FgC$?_(&1q! z1N@lFMqEToi> z_EosQ0y0W`c%B^jP9F>;j>zw?2-kJrASn9WH~OxL<*w|0Ohmv?#$`%?$Q(4g2f3{> z2aDVv+qVv2a3~G=eh(Ub$b5zWt9C=|Kj=0w;AkUs1rIf0PwXa1<|d)F6aPzsk3m-B zz-w|)rfC^RFhnntz908><1Z>{~p2zhl6$lsi#qb26X}&+E3!|;( z2NwSTzn&L;G^?~tdEV2rumuhW@iWa4<60r1HU{f!2F7T;p%Fl%W&94L&&x}WT`TpP zLCmkEtn|-Q{nST#Z4UNc>qq4P#tr*n+69~m z%57BLZwc#GJ#slMhc;(Xg$(}&kRj#P3mMQO1qt6THK9{{4Z8d0e zlQj`j0NsLBODFdzxtT4p9)^%<6EsW6eOzOw7i5N!qoOSp90R8W3Q7|vcRB%Bl8nf3 zbhL4)IN?kTWt_Yks;dAh_&@q@oS)CGx-XoYx4tV#5nb0me^caB?VCd2Ee&kZ7~uzo z%EzXW{rwRW5||`~PATaa&&D7rB$*Erwk7(Q?>vTnD0AIRja_%c*W3?7_I=l#U{He_ zbq!FWY95AkqrMx!4$3eAfYRJ&$J*E0>h1HR60k|8A&nT^k#IN%cTJ+}?An7drv7s1 z)*=MR{#_kNmHn&noSGDq0hl3WU%w6DT6;Eny@s?N9t;1pIY|S3Aj6O^(Ed`$unx z8TRYa4i&bZ4j;sxG|;Ft@~_Y(x@0e@U5kjx^wxyrudrbfU@luAs~(*S-Lql~W`#*O zxn60fW|=zTfQ(2Dz5gy_=N|~R2hL;P+ecoX*YOS8_(xg@qSazWN0I-#YP7e zY#GHy8gA*NcD=NEHK2v7!;Nksx=wPtUV}xKgG#bgT%oFIA(ablybEP{?S5;aW?Hf8 zL22i>s#g=GMw|EiMOInhs!}*dX_=GMUm6B6O5;WJn z^wXb_U%q1PlvuFj?)`0Mc5c8fk}9u~QB$=@RKX`Lw_s5$bMAIfG2fOb&-%EfedVQjX7&fMgF&-J0 zVjr=jv1Hl1{E0&|-yLqP?QJ;QB*6qbILKKv*K6%hAl#*umMkx7uHZdp9Se^dl5qcBE0+}8T1N}X@5P?O6^=pIC5>wx= zCl*{nln^L3jNBvA@gOrdTfe+O9|~N3jbsxI*e&KKc$$%yVmy@QRlanuePIyWWlr?MLGl=8=DZvZFx zfUUH&9u7_y1A~W(_Fb7scCT7taJ4j&ZVFaAH9dq=1)J}`y_!-cG+KU4ZdEo7N24kh z+fJ)b?cP{`em(Q9t%0qFxIFTF)Bc>^2P6p(Zo~(+F>I*7!K+RFu3=eN#=W#k%t#`H zA;&=k^JU=FELFBOx+ng?g;-u)w%|`Rw_Z}o<#|kT3!ob%Cey$L#c_p9D!apw7AVL1 zV1i>{JMaXs?tH5w*bi0)FejjXgt*mG%#B+GS$dq9Oen`RU^7$J4Fh=N%&mT^W`(Jk zx>>M%`_-7n)fil|F4JrE!xAT#xmNYCa-4Ku**Gb>VuGxkGk%_+gFU02JtM3vDmxsx zLiy=Ww=sy{jZj@Lr{;vJF07z+iYtz_Gkb;;mi}T6-trr z;VkmA3+5{v!dfO~w~3QXaz3edQ8Lpn)S80hxTbH(<_mn|sU~K#gn(?*xP(aNpPQ)w zp74a!9t%%!BG-o1y@Dcl@C>`x=0RPCpUw`%2- zHkLZD159U*=rJd3M1|%I(K6N_jU;6yu&GNxUAE zQq6KK&Db%t6Y^K)k^Lg(X5@Y9EZwW*;RY$3;1+5$v0a;yUD7YCwqAO$E^e%WnX#zh{a0k=7aKZ9lqV2JWk-Xt@MmMazxALQOXxzx1 zf7bDPL?^JV&B#o~)fNrH$o0Vt&cz(g#bj-{<$B{HvaQYe=F6k&PbcIfU}Wg46WW8t z#re$IYH3T;&-aUu`j7az4Cm4gozv=vs+K4CBr5R*Z5BVPvod!uSl*T5+?S@@nWx;9 zrid-*5o*BQr5f}ZJFci$zOZ|~sH}$2nv`hihCE-)47uWf-$|(935jV;FwwcOcI)-I zY-%jXf6nLoDEBz8HhxZGVQGzJY;^st?1&VT=GM{c3-?BVb}eZr)zEjO+R}W&BB~4q zFn0UWfBKX8nEv-C*R6L5>$6W%h=ARPhttzqO4=g=-UNh&e;Ya&=oD)xe0DTvW;Qk% z)S>+KQT%v1&CH1hKOKJhTRM?(uM(uon6x+(#R*{+2pmUCDQVuy$aw7MM*n9R9~0V4 zW;pOC5dFBn`v>d~=KdfAD2DL<-vWw1$R$k%>`G)ter^W@MW916;azTXqfG)b{p`^} zl3bKK_P9SN&~JY*Q*JpzaWFOm@@W}bxwk-H17Opc&6E)ND6VX>U9a1vzcMM@<;s5- znWmLYBvZ`)B@IPCfMCABe(KrN*@f?RtMp{-dM9eScc>I+N;I9rE0zQ1M|X;+dVZ!Q zmXF)C;hag4(3L*<72!#qAB=J_om|jGKv5fHBY^zM?-G0jGaLvbFbFOT{qb}v0XQAa z9Zi)^1*$&C{dB$!?Os0siWldjt^ABx5&v$qjOw-Y#}ob;l&kdokDqIf7~cX7t)U0G z5r&upmV_gixCw%X1D+ENx#1~P(~rP&1>0?A1htVVh9GS)>TDPGL4p6ZCc8s#a-$Le z>!bf-aP*O&{E2XRzPqv79Tf+@HA4Mb(33{awBtX{UzeBc8X%}oh)lXlgRlP9C$4?* z$nfaN`9Rzk%Iviih1SN`XX6F)GsQ3#VH;Z78WvTm{q(3={>j2t6k?6#N`GC>6oakxEJxVPoGQHBLX7)bys88jKg*i)&9z2xrOm)mn%|IfV2#qiI&3(k0`V6|6M%Bws zgzc8Sq3X)Y8AbF`~&nmqGTVS#W0SfbPAbo zi^%gl&Pbu2ciY*g+9_VK7sNKPzc(qz)rC7TGu9znhBlCPjpB*0>^+-^gJ(Q`(aMt|=D$ z`d2GP$;p7Dn`CWNl3E(nX=DJiGA{E zA}?gafwx3?mk?%MKTxj(f|vr?_!ATz(F61iIS&0#Isz2fKxAQ0Z=dvQR%F@d07w@$ z!f=?k-JYqjB`zmQbDAL*I#G9K`P6Iqpq~Xj`hSbeGjWkZDEbN@8P6$8zYf57*XQKF zu?@`Vrr#(grsRA32<{di`^BUi1v(0NfVTB>_<%Z3*ZbEehXdleSchFyd^cxTc|Gmz zdC+iQ8C>=b-+nSeVA6W2C^t_P(9w8l{JG*2{B*XzUR7*S(s*nA_vCDTeL9nmGw?;9 zh?dp^MG5{+U8BeD*Z`nFtm?w0sl}(`NT!;E!`lkROWz8*2-?YSG`Ia_&|abwUdujJ zEGgAcr|Ru2oVsbFLNzRmy4mAuMiEKwZ`0ZuOrRv=!5EYAl(VR$v;EPBFyq&t8@f&w zO4T@4m28Z1#&2?qAYOS0o`qSi&2_HLc_!DQ?=D4gmjV4`o6ESoIyk&agOKX5hD^X> zp);GWZTLZ~_ix8M7s^Dgt=WRJR89?7I^)-@q{zE%8U5K5$8?cyjS5HRd!G2QfQs)6 z&={Ac8J9fVt_Mc#<=L0!*pm&{hnl;l835Ca-9!A{!&AVa+=PposMhUr>-)yax!b*o zYvF`Wp|jetwhE7{Glgp1v{D;h^?Jaf&5vkXvKZ6&1|Fs;qFE11*7hs5z>?|hdCgji zKCQZGt&VA}tm7{sbb%!!-L#NI!fUA@l{~Oabx?ZhN%7($b7xI*xys{?5s-udZUDcx ziPl}`iUzMLA<&|H=_I*aXW0Pv!L$7WtWw%qWwZmWPe6^w8LP!MRvAaDJRa7!NAu%= z#U`11>x`BL#~V;Iu+utjqjI~`dRvQ^l6Zftg9dwiP*l8Q&*Fec)?VCkZMv6x)yP*)q&?h3gGdJ`?*dDx@vWmFmPS{$qWA&4GJ`@y0sKrA?M= z1BBgy1@;>Kj|Cco%7Ah_8*u&FQNNo^HtNJYwrl;>glfVT;KqFobGyhc6bISVrT5^58$6aQsktV=d*H}}(6(%Radh%T&T&t2&o^EAcKX)l zv7<)$|CH(eH?)rL~tE=hSa+bZTJg8%R#glit7S5A}|H*f7#e0~Oo!1K7?_9m)2vl@2 z)o#asKM&`APiKE`r9V$MhQ_47w`4%|b=~g6XR~BP7GAu0yJ~g3ob~lcaX)@vAkj z^PV9lwnE{zL4aBbMmC5^e~$q>TOM=xK6BXabHuHiCtb55n`LP0)_A^N9(M-fci%{j zSgTf%)-tsm=L=*ZJ%hk!Nu>QHd$+$&z=4TFQ^DuD{lBr5LHguo!y*bh=@hN=f;N4=iXN;NIPlG~k}$*{F- z&wYJBx%rnAXYxg-LbZm0lvyOkA{^~GY~2Mc?S(x(DPFJd??VG)GaItvwpMg)dGwvx z*}m-eTZQ$|DYK}$a)J)BT2m<+4i_0wyvdaB2bN}k7_^F>ELu($X_b8oPP9qs%~;qVPg zidWj(zT$wIU$l4KUWAIY>f6WZXZ#E2=jNmDBbujAN@7B0VnSkO<)1U9vd7YS4GWb< zskj1(5mmB7s_&d>m0-i1@=}TXT!G?TmFj^;NV-uEEQMZ=f9&mPC!KVk%!hs`BxU3e zsX(&1P?1y1m-6K*6aD!R5O1-OkGEOn^mHvj^|zJL01t>vC`0lT$yS9Z@=+ z6Ba4tVgBqkm?{;yTcWg)QMEJ2auBM8Ju_xugDnDvJBb#;q6!d*7K(lMoG?;F-U!Gv zmG}*AiT(u1kQ+iYeSq2@KVZDYwCw7!niLAYKfs^2f(olK)(v)iC+Q(ghnUx}>eshvdyJC}L^ zPG;%1Yy1s3i204nPE#OfaW{_9#7h@+XzZQ)1BoT~E5Mwj@97N^Uh0KfFVz4P(DStq z=4%DE(efYCuUD_obOcv*J${0OSHkx320wgM7m|ALo}`>oQAD77Na-zShDrpvu;E#o zQyyY{dJieRD{ul*x99=pIWcz%8~T1I)8KDlxz{7fj4Wb&mK?#)8J*H_&Dd&o`NF%bjk=y4yzrrCvGe zapbB8S4rHCN!)b}p@;ZVPqPibU5OTFnKsv%Hs`;dT0{!b)k+@OV7H|=v)*f)^27Im zpCoWR@&DQ20_$|Sl;Dn*jy*19pcj|>d)m5HK>k$~{+DGqtp5S&Q@MUHwq|2rTM@W68h5r)`*a3(P4(-QWeY|tBImf4qoU`fo+lW#7wVH@SpSmM)eeW5|6EO zNE1(B(DGk3<9vxiR2v^Ue!GL$v<>eBP8T^acnYg8VKN!OW43h~=RbOiM0yLlc;6m1 z$nJuH^3FP|r2%lT5KSEv0bW)^GYO^c;yvninT(*^M0ok`Q}Or;?5r&CUKO*oAvxXT zzvgnia7M5#OUjguFAsKPn@l|gG@49I<2SJnRzxvNLz~)eWy$g_fM<2+?JJ^gGvkNk z!no+&R$$Cj8zDGDn)jy}+mPbZwnbnXkEe^6|zgEC3s}KHQa|w5Ky_(>d zn5N-c6;UIY0$gxFUZy>2XWp-+-U?(E=#2q?&Vm(AX8D;SY7onA)7TgKI>?`PfO_KE zB!NEMJd&R%35mwZ4HLj*?k@KY+iZYrU8H?FhYXZyQI4TML54|WU8MPhZFXJ{KgVv9 zEG%JxPw^nXA+V#a`A%%is-I4*X&`8sjyQB4&}69EAB7hQkCV`0XwtO2#fJOqw@K_V zGk*}ZECu*yCR`nga=3e19We|VO?({+@P14?{P9#g5o6-=teVlMl)lp-SaRF}Z7P{# z*aF=B_}3(k>b?u-X0xUU{{)8qC~j}LP#jnx69&p1&>Cj+^uLVWEM1(TF^RSahi0k_ zBF<&|x^+M!R}^e{=ef+QFDB)~=%ggrI(Ju<%C-3KEWpP{<`c#LWeops;{1c->uNE-q}&vvkt^b^a2pwm<}ZUrw#^t$ui57_TI1U0r3pJR3=z zW;P-Ud|lg2yVh^I_#i&-;7|8#o4Guf=xQSJ0zem$N^z!doKdWOg4akD z$2M|Ds%sDC7BL{!wezDI%af`-j`!Z^?f4Y`%%kk|`fpA2zdpscSAr)MyG-K(OpN>K zZ`F){mA=oA6hbS2NDNZH?#KKtjz^i*73>M3_DwV>K*q>R`t@uM4pb}-7XP^PLGH==$R*rK!(>7!4*?)5FpY$bc9=@9R#z$jJMbOb%I=QWGz)K zen@Z!1S27N6A+3~)4UZOp)PYbhLo*A9JQ5}@;6napB#_qwx1l0(%sFxhlgTQDxNQ% z%n=|bL5Odb6ke6{rX1O=!-Cdj3ddBS7^;q<|p%O9lVSKYE@ed^{@@K^v5w`Y*%{wP>14 zaFri$mHu$nJ)uO~p+tGF);(?XA0I_m?~T`atOYUhqQp(&u)Mtv@eU>YZ+FUjhqG}x z@;{v_e!jtY0Z4H@*O0*t&W>01w@{q0SyH4RD0$8IA^rn6n~FFeWqHApg3EbkXlEHg zWZo$V$6|lH67i!Y$+FLX)t`If`?%b8=$B5SQ((p9;tK6(;7^n`S{x`lujIvnFQ zwrpe&+D1jYVh_SC#7xSFiulN(1E5H7V4`u{mJA(m7n5>-8U8Mj%w-G7 zfU*WqjjMyVcON6vfb~*#5BOatLZU~CA*yznSY8GyjcH5Z5C{qBUTwD-&xbOrD?b* zX{{9xcO|&`B?3%aZJP&sUJyQ7ITi)M%wr+F! zw(WO)+Dw-HtJvFH+xw@TMxa#kP?iJ_FFhg^km8UyvX&ULrhcQVazjkcHT;#cXsKFi z1RS_jQg$y_LiH*iQ=l|0PlQvYB!RJ!iGv#f`i>}6t`%*mF6|rP$WkTl7R7eQ|EB3kuqWp7YR0D)s70P2P_2C~BN89I2D^hC_Et1UY!)Yp^ z6l0j+QMH0Ve;6>>^p7Y;@Q1G;QCQtb(zj>z=AlF{0KRnhb%W<7073ypMqmG)NA9 zAm2x-wc^4>etH+`5=2LYeYf(<>x1MV)EB11Fia!u3sUDedlZNAmmvLW_+Ek5`O7bV z@b`9@1l!mPH0F5xM)0))DK6lb9*BvpWE9sUo|MA+p}WrX!0~YN{i?67c1F#3z*g!; z51a7i`O2RX?iTjeA%~Ffs+Lrbc&jhg>P*&tI%6kaZ3`TWJTo@vInD1?3l6T12;Uf5 z!&Qv#pr`e5t>3fO0G<(es(9?_OhXC_F{pZ&ow*HLSwrf1|0)^U8L4Z&vFc<|`>$wZ zH;HN^qwWWi4IQU$95kQCvQOs^@sc4dnwuvFKhV?7nH#ko!0Xv3&#>!H8ol!VjY`XH zQVXk!`|Kd<0Kw?f1Ag8u*`f;0Wm$~#{7;Vx|5J-CUIMo?g443Y)|2Kco-|nKeRbE4 zsV{x5KWZwFs$zr}YazMnCU|tSt2}hGZJdPE_$>?<2HQ>#czw582?nxN!5FwXi+*ap zGtp!x$T60~%dw*H>$7Ii)r&v_tTh(iD_iiZXtrw}mJWAYu+#vUvR7mXDf*NO2Fhl` z0QfgxjXnBUf{Yma_!~Emm+cT${99Q0bjX6<4#1u!;#^cL1*cTmXE6(H+BkN1k=Fiy z_8h3X>aF@mdjk~+MyTdzQ)x10R z&di&tU0q$(=ky=Ua`I?QR+ye2jX6v@T9UGh>HXvmh>m1+TToIL_; z+|z)}2(MH_YXBKxI@ERnDy6B);?$t%MiunmXv2c5I{%5)1_`rYb-asn7fB(n3wNY` z$Qt*~Z={RK5r@lE0u!SYkbHLXS?Z2|!d;Xx%g>Y?i30O~sNfU?Sdu|!ab_OsufV$@ z2k!|~aFPLPH6TTTWZ8r0;jG=AaR7@5mZ;PoJgR}6>Z#!n z_FMR(8oNpLPqhywpxG<;h2LZ598Fm&^#1zx8RKuiCW)Mk9vrzVMi_i*K&>%SEDJbT zYv)-XJs?2@pwID*HsWPcj|HGiE&{%U?64vNw>WI+J!Whph|#=0+BuoXL9tBi3?IWp zu~>&Vapb5#0Me+k=P>8XRSo-G7-m2FK8&P(mbH4$U{qUTp8qAcvC`Mqcfw~s6TmLw z9^-~VE3TI!nbpOMoe>}8tf$6II==XqXZu>80i7=j)rIrv*S*G(S0hJ2%^M zj(V5EmHB9Aht%!s>p>W>9cVq<^-(i<&lvCwgu`n_zpXxm+}Rz-0YLvfV@y7B{VU$Z6RE&KRfi#gvYcHhyN zjtDn6-0vUUN34YsI!IL(pT1I!lfWgT{(z1Vh}7Gu^Oq-)VVLsb=E?NILDn<#e?(1h z*&(ay6N^S>on&c0{WnmD8wBEFk?$lCZ*FyDdw0l;AC=%ltkNEHfn zT<392BJ4`>LP2)oZkgA5=MGpyVPEy7uoy#8zuYPo#)OBF%6GZ;F-zjJ1;6Hoe+VGQ z$a!TTEp`4o#?o$)@~bXS9HUq!wVT-2o+ukxzxBNLg9O959{r26C9BEX74*Y`-Qa30 z-_c5i|D=m;NnJTN1^l&N7tsEO=-DF25TPWIi{|@yzV;vJ?bcLd#N50w9tJTi02J|ve1Z~g- ztv{l3Nsw_zqSc8bEdVje?4Bdv;G;u-u4@t4i-^Q(M^U@KO7=rx=M6vQ&Ah0Kwgg#v zit99impy~PEUD)tAy9-?VFH4ovMh+07Iic-w{^+!RX?PtL=Uj`+)?DxNw!e{=%+Gw`moW-K=kpdb^ zUwOIwE#fhiP~I!XIyv~!45#k!GT#1cCq^X3|I_`Qkxs*H87ne*2b_R!6Np8l^J)~I z-0+Vy0d~oUQGBe(zQx(gW@B1NByvR3&oJaq4ZJpZZ(-E4G{dxZCcf-l>p@Ak0z5v? zxSGz#TkzaOPO(Jgi!b?~bY#A?7BRw#1>N=4y}#t1XVf+8t2nc_G;p`YVRp9K~7)y1Ch;A$y@VW+?6x==x*Z z`U9W$2bdZgD@%N2wz@Y|R^l?MmFwIc72Y|L#xweqKJUwHCCcD@SWIFf)t-!`h&fcS1?w}(1>L=c zW=n1X04Sr^^t}=X@?7MF90B5xQP1;y(w}}F0%o5-YiR6`6|`?r1Cg2@4+E6PSNv{nb{{+S7f~#(87H4H^QcWf@I0z}t6!%h zRV`i-zJZ`FeO%HH2~G1!p?K(mQouAykFhyu)xWH%aP*x&WvkFD6jT8b$!Z|MH=tu? z%<^ZZW`A3h-}(#b1ZlVn z@yF*7TUREG_hYg+v-#u=ONk$o)eIfXW)Fb|H%$61FGFTHH8I!mX zElG`!`gLZUC~J32(agfr)7jku;%*^8h^&Ys<4!P+mo@vUyGn=;=l%E2?6aRgmq$*i zNxh!No$kh~LqikAy1#^l>BWC)V`6bl@Y(HKdn1Z;5rnoW#P9iD1H@q?6S|y$)5c8i zt*-T0mWMxD+3AOO2N>VmZ7c|mhjO5%teRUn^Ra`N9ByN=lZa2Ef2(R%fxer8n141O z&M)tHHTpU#=VKb@5wf>`DZbv5Dx(Z8AKVb(N+1z#5>~6rjBTt8)j^|-XFUr&Y>a8C z9QQiKLd7sS%hlAGd%lZlxybj}*m`ITWh!G!E%$R7Qr{d**pVe0O8(oM%CAZ7OpML1 zaIWigVG8)l&#Wt|!Y=p0cPhfKJ~bx}j1*tRZSc%d`hGUJ37w5-%QdD8Qj zYhx<;do5zQbWbtIcPB(QD=JMGX8F+Nq=~DAQ`Z^lx+|ia0Dz7ie<#ieKfd+@F>Ahw zbcG^96aMs(|8<-lb1V_~SU#DhEz%tGXSm&0Y+{{LtAvZw)?~u*q%5S>8puK#ky~wF zqq)5zhc(JMNA~f7G^uHYSz2qHnq3BFoqAPR`ukS*cBkaplXa1PSv9*Hd_SqHTrM43 zJ{lw9FC=@#N1GDyVOae2dQ7PwO!w8FVqB0>Dfydf&Yq!<7x1Qr{E+H8+qzFt|WIVBY2N@hA zbVXqtN7tCx=G^lDjT6r*lyB*mA&>L%f)Xe*V%KClUKP(1aI~Sf)?5_wjJi)FZ}j0 zn&q;xC1g(O4qaeM5<6jSW^bF}zoZ?sy4Lu}vcW$Pj2Z0daQB==#tyu=oyP@B4Vhm{ zk`~q+`0yG*un}{rqfd(_6jt){M|n%m<^O_M*~SA+*EHLX4aLC>Y;Z}@Bed?{+ImIHKf zc}ZnIE35hfA5-@iG<<66iDmzv`Pak8mkTgu8;C+nCFj#LR}^%~|Fz6q3xG1WaMHsm z!P#Pu2D**0#ak+uijD165MPvS*C{Xvn z?H&4j26t+c9^}Mb$@6|JP-cYm#dYT_OaY}jH6jc?5DJG6VuLo$|I$bjuJe?XL)tJmpSPG0zx>NQW}JVL_U; zYAg`l+65LORnv}`i)>evZ}=)TLX9aU?fX~IGhpdqdfIQh7`&&q35lBqu9!jC_`WyN z0u+PuCXZhzueA?TGe!s4*LF;EM))Lxhrc5!NFa^`ASob`xdb3Ch$_tcD`b7x^O^4# zu)ap;dPl}7M#c#hf{=Kj3ih`@sa@+adez4_&U7sEZ?*Z%`<&Fg$V;rsdzfW0vyNhU zkCGDb;kqua`^+BtjN-V?5_>KZdXHm@ENbk|(Z9rUUE6(l_%ruX(f5)CI;~Jri+D%j zIY)de%lipm>ub+rq%SF;0Vq*9l`k*CKb9rDXxr=KnfNG<&ZLuS~YBn7xe+b?I7 z>g8j+YQNijoKqKF=JWmNTwO=UQ|8hrL41vlcHmJDo`vp##(&+RlJ@_8K;l%I~}`{x0ed_8v( zYhKkY7n1XKG3nHf+E>&uBRoP*dOV5x9W~Hu!{4L5&AZUNo0OOqwwOf2lH7p}*Id6y z&{!ngc#V^aUE+}ABwsU#QlPoaGeEH8deQtd9q$nIAL(#R=!=Fa?}6+hA9nrFx$`BK z+2F5l8%&0SlyEt}tjLhaAQ8fn&&XIFI{?*NZYqFjxkDI zwl2)eGcFtCDtqU?wO_7Yrq_rt)c+20co4tRPnC&;JJ&zOm{7>{#!>caOLZ1g3c|^K>+~rGs%joLMTkr6^R^A6?TWzb-J%BPFHJU#f*^SQ z{L5&3spj`XPfra``qgUnL)0^z*hD}7D{5w+T^H-i#vcjT2 zQ(ZztRk}Pctys_c9Oy02|Q zKdi6}rvkd+Dh2;})oSkn&`Q%Ccp@G8i;fX+mz6J@8ctP}I#Odg>y5>1q(A5$$DF8Jv@MO$@2aYsl8c8bq$&!31L8D5k4za~c|=w-0KMX?RHi|1|kRo&|9uQrjn z9!xxr|MEN0v^(P4MhxQu8RHTWqkoNYGaJ8NGIn`CRDB!X?_jvadv?Cqn9J)h6}*0x z|IGtB>&7|NyX|>aLH%zwPO9OYA4%3AqNGtdWloaamEc`0S5Z3Owdc-&pA~^9| z4Q>aOu}*rFdnb=DvCSa2>L#cEfQ& z@&p}ROJ?q#xXPJGE!kJyGGw14havvYbQEVh6tgEvw?y23D(_1TeWYcG7PB|%SCE2J zQy~LM`7{P6VKd=Rwh}gya=&l+g*yJKc^<3gd`hJ>k;bq1)N-k!l2PrzM1>wM{lgU_ zWIZ0nrnB3X2U!H#uI?W#;=?-nPqG!~kQVW)!a9sIM=LE;>D=2g51+gr=eN%+wSmT( z^ur~tF__okd|h8EjE-z`xRn8#Y$2u|`~I^A(TT-IS}8`fW39}v^Y9`*QBmrHZ45gn zNIKe;S(#%UB-Q}G^l7Z}* z^l`UvZ;jr_=%pBs_?pnl&i4Y-!yg4p}m-1g>s6R=xSK*g+(FO+<%R)d{F`Q-NTgJFC z8xN{GjMNB>=D%$4wG~tmwnq|V@bDWoG}*2gnf*W)9%x613c*hEP0JsX=VOKYBS~@} z*eS0fKfDi^`%eQ+-)&;*RWBAB4Bgl86}01(RM58sjDon2MsdJYbPdT=f_lGV)NB*y zama;+99r%&-#OU`^r`Xar_b{PjVIWr@1>ahY~ladZr#@P@zFZu+=uv~N3|VVs#IV8 zP)B#O9&1_Rof{9%O8fM|22huR&W!^bQa0HKFjMp3o z#d?7un?w$|Kk_94V)c+?67_HrFUcXOEtv5vZpd+9JLE{IfI%qvGjrzu&H@0#2f%iC z>+n;}K6X0bntW5TnzE(q;OC*&Wr$JU#d|3ZeDENogVJR@JKJIiP7EE~aM98j+_CqR zLk@Y=7+5FKh7so51eOibZGt;KV9sfgCNaIZJvJHxW8Jd8_$B(rViiK>Kc}v2x{Q?#yq+C_#gmVv9hfnwI{|Z)f zw^wru+H-;6qEHT4w6r68y8Wlj&x*O1h7hmG@4{B6OQlpcne7i2XL|VOaJ!SC*j8=f z(I=wZ&0L9weGCVdd+FnkVEmk#`%g&A&}#|72GDmd^x5`9AQsIlT#5 zr}Ypf96$S`l9s|4U#M!(?99YukXti;F^|edLDBP~+l=?YZ-#zN+Cq+v$U}+9M~(z4lxqvQbt#c)xst-P zez)rw8n~c5V3cE@T%p78Co1oU^gH4ggfUh6cL=KVa{leCq~200#jAaj@zfQrCit1F z-7sM9EMujf&TP{A$+#rOuuWz{q+y1}dr6i`R4sZD$eCB1qExch#aJW;b3*MILPI6A zc)6JNgFE$zsZB}3#cLBCF%vby2GB2^qO-O0LAACq=@^2@@#ijRzH0XXXd@G8c^%A+ zSQ{VZc3nxt7>m+x{B0PT??>ccCnux=odBQLNV_ov#D)YK8`^@WU2p zz8^nwY$8Vc;`{Kv^T_tr)^q&mIy!G;E9Ly5nHm`cCMI#f=JDnI8e)LGkaG}jS_+uiIB$|fk3f=iY2P|q zXA#~@w|m%L%+N&0tWE*;7~N|NH@7H0{mna->o8YU%HEglgXMH)e)!4y(Kodv}6zv9g)z9_zEOYw-M#^H{mw8N%KjT1|s(8oGjq z*SwWB2V3{6WDh)%L0OJ3X{ZGLe&Ld3ma?Fzr3W!pRyQgoHSh8Yi5+67y8rgWVEbuA z{Ei>N0K6qZneSE%VbXH`tek=;lt?6)_~G!-ise<+In^(Cf5i8JM&$vAV6d@7QB`iV zL$K&pPbX*LpZjVnOWY|n>_%rH&m#n<+=Ok)u0PiUhv**%hj352b1TVwBb2zm^gwh% z>-58Q+VES@AmNa5V~CE4&1B_~)8G}~{k-wtQZDB!tSPmD#!B~XaY5?XrMG! z%nW_3!k3zfo7Ds-eykS>`l+6XFjODn{%lK&Pu4Ils19`jYih(37e&o7c3t<&N&pQy zu_2j>t2_C_gvq(eehH@YGVHE=L29AVp|T#Dv|213{rM4W$dT}NsH)T{A+H{l%XDuV zCtHblXxhp?ETML?-lf$C3H3|6EAe!TbrZh_Pz4?f#F;eH^$x(DAEwie>eI3#b#A*Q zi+y;S=Xk@waF}eed4?Si7pChIox=s*nHK9Z(+AI!h`{Hi4_+`+59i_Q!<5!~8-q=a z+am%smuSwJ>a^XQlA)UX;`aTYd?7>2 z-{eq`1pASh0WmY`c;~E^nal@cNJMg~;dH^DQhF1ctWm^%B{I={!|VH`($^XFb>Epv zF%PbOw@__+5>tuO&n&Q>v3!^PE-;^^{jU*p6{Fp8k`Fm%=$k`Ke=v|u8P7nz%X zesNLQYHPW;uWto+LQ5ZO`Of~U$NB%Aifs1@2N<_<_u#Kh%$KL?ir4N8ZH>uyEBsq4 z*CswLHVfNG3v~j^tygFA7+`-`m%m5X8;|ZcyyL#ab3Y?I%`!dB$~{>ngc|gPY`-E_ z>t7oQ8-gwls=1=8Hy;<@fHUNw!^h50rARyj(h8q*o5P;I1sGb|$w3 zF}J{h8WIc|S_&G{y&p=SXC_&NuR9*H%&54j!*Ed;onlyG^9Gt963%;}nFBtLV2P1~ z9_yA7#sgYu=_@fY$usk+Q+y@cLA!GddjWLblpC^*`qbOF|5AhhbLUjJ*0;@G0qdAP z<`=E>+Z)4x5h>U7j9&xXM`!Xd&+4*vzZu~jL{%=ahCHZ!13RSH;25BJ0%KO5U?)W;!Wk`&Z=laZJg)*oPV)Q>6ceE6H&m`{^5K}x zMA{-?vp8|XaDO6>>u93X$T^eTX<-L&U4Bwvrg8tLyl7S(zfL+|bbq*+M|hPAPA7=d z&v-5DI|1c21t&DmT;P*vt`a{uW|h|`Jbp-Iel2W?+}yy%JHPK^*L~C6eN!^`!3}(M z+%a(6p|v6@x@u09$TyASy8Ko({;}B%&340MdY7Q+CVUbWe9+qge1AM_U$>16`Go@?n z*lJdt5%i_bfm1mZN%799XfE>!3ETKt@;L9d_cplT!02}_`MmX%!bFTVhjf}H|n$XcFJd{ff|`1Dg_+h zq&+myFi3F_KPQ~xD>#T8{J!d*M!f#}K_WdkiYt)7l@p)+EjWtfQx1~>9LrGl^hJCg z>#e8>D%^1ZBpS!5Si%Jtx(V`0vBh0_c2k#Yd$g)=&O;y7I1_X`Yhn700{g<~%L6i3 zYHP^Clctlo&ktORd6c*F4lem4;k}(vvYAn{nXx%2=r*@eQq=?O-Cd;Pe;|il+Bxrm z=aPfZt0SvqkN_Gr%5PD2=|_1m>b@~DCADH~i)}t=-|2j*;&NKTTZOmY8gAen zaJ_#2fMt>&WWTivytX^=UlC{S|6#|}=ar^PCjpX$%kCYbwp;6Y8)0m(I`LC_)^a1r zTOHLcB+&Izn-A8LK?4gsd2hYt6vv0@23GiJY>%TTMEhD;Xpbcs;8=CzJfEo z>)0|;gft(9n%b5hxdCK6iM>Yt?q-g`<@{OBRg#*A35OWdis$w!$V;E@XpVf55r+f= z84V@IK_$js~54^HBR~1GMPy zj_CZYRIpg*hIuErs57?{>PEkEEQ57&%V%1D+I3u$b5yituN0{Bg97`{&729#DABwWhN{7w{D^{X}R3MDvJAPLy$*ROPLZmS88G}yswnIB?W5Qj) zJJnp%U*AzTleDu9Lwyg{D`qT)H3NUVU5XlP_%J2l@3lFdNT2`6f$i9H$G z{7i%wfM|nvQnYE<=gLjHegSvoR(tIRTm~4nC~se3vFOOb=QuSNq46@~x6L47Uw;S{{~k?N*p|7?YNno|2lGk+JT>nFXmvig+#`MEAT z)|H%d7L#)$c6WlJ;E+`Ev*hjK>_g0>i_Y?_YX@j(@1Nw^S@Pe`txy#VI_K@50hXBo za48n^a0hU3Rz*yv{W6pUE%OaG{OSj3XgpbH!j71PCj8m8nkxE=~wKKF|AyxNpiXtuNmX1;7acqEV=CZ8;UCgKHw8Zf8|Y)ub) zf_*wU(mGtJZO;$uCVOyU0qAglp>eVvob3XPw}9U}GhZHQ?JjYyR67)y&MZDXh51YP zm7~zBa#~vdw2}+2O|Ipro>rS4C!F96h)+zUV^MArpLPu7tYzJ%g^x>W@^G7!qAw8T zT+^bM8yu?RYk#n`HehBhX$%bNs@leHs1zr(&Kq+lEGj(w2+|gvoX4rF3o1D>*p%-& zBM%iu$3E%Yyp3_N!X!g?;~0Pp31sV#Pld5eQ5NYq)B8iF5QJJKWdmB~E7b8WcM~Ls z5VA9RR6kIkR%Iz*qnS~@w(c#~bT0aYO!H+Vp`|HGz3p(CDR$pjx#f3p!h5GtaFPR2 zv;0R3^`sJP_hM;dCAp+H>1r+GvA?BJ#07PKR88{XInz|`rK-hjMer+Zl-zHY6X&nN zw1asPmnaP=Y;YXf{QjIV3dE0zpaQW=K74<)G0P*qXDO&$vFIgYmhR$D0Q&}mp~<#k znCu<4<^}?oZ^Yr8Kh6c?i+fC1tioZVhQL}Zmg4w;HPL~RfF<#qMRJouF`F4n=KZ?V z(wFJOec{I^EXbkH{>f@c*#A)g?LvI6w_ddg3(!}67D8T}tv4@C_3>ff$UKp5JL5_qY*-0U`W;(GQsWxy2kfQA%hXfc01oqdS<5=Y`9l| z4Eobj$O(U3Dy(*o5yI5c(~!T=kT27gFZ#hjJ$5Qb{y z(BzKfsw@-k;N$6XylwUX_3fz3P{&K5>t|r53C!@zJ?`8XR*{I>2riYdf2n`!#Ii~I zzg5uxG#DLlpQ@KhEwUfkD?}UpB7fvr`zJ-Vb`2AV#Sq?3rhRmPyfpK(o}7&|dREJy zFtIiM%=|Df%7JBEs#LZaZJ5R(Gb-!pD*g%l`!iI++%()yxg<8oP7xI=*Wfdvu?Ery z$e_r?=Ye(*Dk~e^zg5;z#k&vOh>GFjIW<)MSxSh$cb|a;4eku0Ojvo=199;VV6|mv zAU+4eOwOpB6cq?1`*U12iIpcSN){2Ofo@c;_y#I;0+lqsf;CY5b3g$GpJB4Y%i+XT zYyGuZ=?rb=auPu+FSo73zKHhfb9}phLJ?glyQq3$aJhVB4X{FS7*#LX zd-1SM|DmFwmbJ~&$2zQO2Ar;hMO9YIu`HnUD%sBN7Da*4(%FJztU z=}vQ6^Nx_U1KL5w&Fs4~^lU1p2W%nn|Jz>(jU7q(nZf-oqkBnXRqSFj%!DUa)MUBv z`eVsS8n;SA^J+;)r3hPK^Js7-*ki!m|oHoRhV%qz^XVPzX|8w+2^l)dka*sTr^x&#*+O zbKehx&IGk;n>8HtohU)XKN&c^36PxN#sCa5V@~7beC$Z_rq9t2#ZSmhUx?lxOMz4G^yflR*_(xkfGWbdGB!}LCPn>RgZ)qMER1j&`E z7w3Pin{jV);{0=PKIh{2-taNukRozlUoDq&9o}nIXp_%>!6L?>CDXA3_i%+oKyXOp zut`3JpaBp`-|63n@Sg5r{~)crZMltto|}e7fn0zZXA?Q*;;odMUmO+X*cnF$D0)@0 zAKtua;}Am)YaO0r=4s`xwN0(iVJR5|dbkY0YzFbN4On#W9jM5xhGsz)lZqnCCpBpi z6)(q5ByKgDjlT@MWN;S=dq}t_xEK-+)+nA0yU=44kV(;E##NOOTZJ2$FXpMqG=k+J zXXvjydd=QY{;l0?$tZtcAe7gNYY;-k8Vm@Em+rJJ zdU$Ao@t(OfYql6@IKb#T6Kr)oWTyl@zxNFSLgPm?l4kAHw&)QGcb*eMnRpTDq*ymG zuI+O24+5`aPBApv4^q-Dhh&jV3g1-6K1-D^oY>uYvg(x&9MS5sbarQh+D6#7ZWP>G zyvGGM&PMJLR7h9y7Wjj)*=b`RBFisbAdxeAo+>}GJ`0pG36y^3De4slCHPpBRIGX# zoWVMCxZmld0e?r}BRH)apJ!d|I=)M-x!SF1C_TgcCQklCjXZ*CaWAbHm%xLsg~{Qe zt34pdGTu%bqtH{??d8I{3U**m?VZHvIyQTJ8WE!)7QX{I0^#A$OC8eRmE!`0h^U%1 zmx?uqidNlFG3kqMI%LKrz`MHDxHj%THm<`HOJ%qUK%xEop=8bFd-Sp0Dp9L$%!2dJ zs%{+0cGMbf0-lxR(?9z4VC{AKIW~F)kkjtC#G=$%P|`qU18#BHlOmF^{hPuw$l<-% z{XNaLJM$nXeiI;KI4&4Bl}0qF;aQf4**l_^wb;>5s_`!TSZ$08%Upq~n(|v1nL+VO zhaJ^S*NI7}Eb`taVg#x7MWN6uQ;0EkYd9f#3#Id9`p*15V+g5MUjK}jYfKP<%N=Cv z4#?Py#sY*6YEl&pAT=62T(AZdzZi4DlFOr93eUr3=*A}XU_odGsWeVeb`JIi&Ao2q z`m5Hg;R}l`_+|rQRp&v}0Fw7-zCO~~N8-MwbF`|o*)cqc$X`B^Y2p9m?lNe1qqDnI zISX^B^yu-NiMT7%4QqM$M7qV?#(-K}Y`D!gJ>R8O_6v)>riB(rc_8&f0t#7 z#a3!#IhEoUkf75g7E!A6JoJCmtPISKSw+jCu6JRk` zq|v2HQEs;kzQp94EaT9mz2u_Vf#XP5OPi1V`8ml@9cuGuQq($M9z4YmjuNPpUH7M! zt8}@HJ4aj)MOxN)>NB&&u~u#WU!{eblt}Tg-P+%J;EC4~)fSGw^&$yxO*w$04LEp* zFnHnbg1Q&z?%1R|`(>)o0b!qN;}Smr>dQ+tsFv6*n>5(a7oN)8FeN=(`qq$2kmtk0qiEElz~)LiUaVfC1v;{MI-mCJ!4zI*bVI;29)GQu`kF8nxW17aJ{VIW@vtD8$?`Sp14~#)_!!m} zlWx~a2OlEqu3zkABAsQp)j8&}rP_*@-6blot{ZNT1M@=jXxFCtUe11mpZydn8SlXx8pXE}8O2H@ZzHO_wXq2W=-@c{lhIu#ejO zR|GD#$@Nn(n`RbkpKH;FSl@&Qm&BBC(~$;+?e(6EG`dJ0c~S|$j;Mbmp+1iPpP)C) zb*g?$Z*SirTrD67EFnz4ZhFjPT=hHuOJDCXzLjk6R+ybS&V7)kNo$&L*7t5f=RGo9 z(agi>NNN64u2PC!74d0~nQ1t@p~H;>5E4?l8|{?Csl;4QH5_Ef_jLDbq6@J2JlK*3K^U#NeYTjVHFxU4D@5H{sCqS z{j;K|o6tZ4YT1Q$_O?d>b&T_iWaVj3TD<6>lxkA-(7H<76)bMq&nBsUU>c+y( zx0C*VX90dc?2Hv2=}mkqV=~3j3Q%ury4i0|qK~>a-%{ zPNtO=50vMI)DtBp>=-%*h{~TC_Qz-RM+QtvGg7T+Hg*m?kG#YJ0uEKr>cX=j%~^Sy zJ(^f0&JWej(;|Qgm@>A-tF2J^7?a%+uExWuq*MJtPln%N7$8IfnSfex4Ts-cOkz-x zew-Yr$UOcC5%}XkIB)NKXNh3HR%eNM^7t2Vrw^D*hFycON^-DXUib&lKf_64!$Xc@ z^h)7}WSI2I+%V{DuIw_W?9xx(PARgXf}g!jMQ^gcbn`i)8ogTPSn7iZo4kurS~C^z zRJ7`7y6z+u{}KhSo3`h99Y>pt-sFdh5&$6==>$FW-H$~~q5+VHV@k7cAue}|pO zj0i+!dN46JexW~%-Mlfvy|(6m`09P_TXMN}{Wl^`uu(tndB%yTO$TQ8G!Oj>`}!-t zO!tdlGbjnF?=5h^?cM0Taqr}*YCO;Pxg-EZ=J>DN!J3wLR^54ShV*i%wO>rXQ=2~0 zQ~Zi&<1W8y#a*`!Z-^Z7f&p_K6f#ocFIG`2W`fr&K*FOOq_JnisKbdNJRCrRG+rw{T`m5d z4Njy+?0X7VSw!~|9Rwxot(ZwTwg=S5bKf}&QW*PPiC84fnJ8iw8Ha-8cTb31lP(6= z{*^m&=a!?pWG8eZ;GeGs6IW~>1jLWY|3iUK5nW{PErNIC0(7I{jZ@D173n=%+b>cv z@`DD|BI8LtLp!k|gFuXYjYoq6!DZw2(C8Oalw`cQSwA;{6FdUrFcTbKbxGzGf~ab=H;4zClBSA>e%9 zb?}I7^FhAlOTUk{?Y`Wzl%78naGt+xj%qv?-2@iik*(k%kZ*h>@F7eTRBJblY+)9- zs@t7}t*i9sU^hMHnw^F0h5Bus$AWCZNV#c5VNb@~&bL(D&YwGLmHmhq2cU5zsEMSj zR6RL6=Q%rQO2!i4_HML)){Q9x8gtninxv}Uzsm$V)yO_1ZZT&J=`sitw*2U-Q>(P* z9J~q}92z)`ygDpJ+%9y#FXT&!BzUOIXwt-k+40Wn5w&>J+dnB^&gak8hD~0DP1c6} zSa`S3fV$)y4S{v-RSpc+^4)9cmXxy0I|Ik#wP-3lY2dZEQMi_RHl4-ojEj`G!*aEb z|3n+?q^rF z`<009R+0-rV$OqQxL_N&)uTtYr*1FeC{_?wK)N#=kr82Tq2WMf+0sdvN^dRtLl;kZ zk_D>&p23nTr70;px{{+>k`ZhZF-J%>eIHfJVpSBDw4VzPO3LSR}`hOboyZNlB1M3e~}>5HU9dvnuW7`E-E1j;gcrW_hfNYzDh^CcQLmESJ?t&qT` zo(c=F$WR2#X+WjK$^y~+WV13HD|+wt@q-@t*CaniU>{pqJ%g%Rd?$_zSUL=mvTINp zs#;oU!2vkTAbb+qvcJk5`4RL}pK9TMr*aWvCvs{JR7dTKl#*0Wt~MCLw7@e(>a5A| zf+gVNJlYHN898*g3hNS127O8xGI?P$K@MnsfxKNF%?N#|RJEYvn zvgJ-#wTIId_I*o&qP38Y5h(f-uxs0;5>%&vQjx0(NlXNDxXJnaRhPW0w?-Bx%b!95 zh#p+7>mRy$r2fD6+x(~38BuU1HSbVXiEk)CLefq9jCsTZicn^TFN zV|X|R2!r12tqS$xd$@n)s?z6+q1xI_a=guQy!~bLIrsw?KPAEEcmYV9KvVkN>e;l1 zus_kkI0X1DRlV0$y(j6O=HE!x+0=k9on0=Rw6-Lul&X)={l?ny{6;28^ ziKMSyh?_GWJe)Lj+^su@l!#V0ie7jHZ!e$?-7MV$eznbs8JEj$oio6xHK{hmc}L|A zJ@uI)`E+GsAtNETPEFf+)wGxL63#RG|IxklD6!nGkLm4cFT~0# zyqEdGwa_br9-R)pm_a|X`M5dR>G*T_Ad|+k`nSzApfe_anD+xw_y1H{)qnra40U6p z!;COY>9e|ZFailU4TKmu#?!re8Tu-hfUcW|{{0yxenNmj*83RayE|-d@hYaiFb>4^ z{;Web__uNV6F4PP{~aq+|4#$Lk1DK+VSVXRm1f~v_TBjWWb$y`ZZO*eo3U<$rhg6d zAUS3N*c3!9$xo?R)YpdRDG{n}jEXqIE{}2!FR_~JXECGPEGDpSJD5U0-Z^S5oS~H{ zLqaS=B(1w8<9HzDd_XFf6>8yoTA$y%D1J6oe^k(Zq#Al&qh0yw@A7Aie{s`ep6%{& z|8U@d{mXnoMxDGcjPIew`hIR|Z%4gQyc|)l1~Eg_z<3b~)!PE3#BSV|u!Q!oguVtM ze2WIcEDAfab8D z*0Ahrd6Y!h!HM=Q4D%FgkBg7Bc8be@t*v^Fj#U=FjF>(wvY%B_jZt{!agk zueS_}qYb+TlOVwY1cJM}4DJ#nxI=IPgUjG|SrcXuZQcZb2<-5~@E?y&vr*7xnc zwY6JyS5Hs>=$>kubD!&+bB%r@;arA|mGp#{o+#C?mA(_$SJ6Ge);i*w1YI_D|6Bit zU#raxVdLrK8v6|jDb)Hl8!F0AgrFOa4UUn$QDt7L>W5A->45$J!kWJGtV5@m$@p*Z zR`EX>I6Z>3LrhZX<=^YLg_ySi!i1s<`H#<^7x4?e`%B@=|Kvab?_+{dszb~O&BH*< zQ?NoDUR+}q@%gqs{ABtaEIa+8F^YL&6Giz1E0DQ<91=IpD!q z=TP{tIdq!ywvgs|JMgrU?o94`l&d|{;fTmgw&pb5_}Osq_iDkKr`C%n^z$&i)B%62 z>?W3xvr)#siFo4vg%wRkem5OYs}f78?&{;Yys#;dl5eG=L90?7?snhwJlv<1tBAJ*FsfQ; z2L2;9*Ucl_LU-R3J|<{9rZQ;2^@yhu2orfrqStD5f@hWOTnf$^$gzoIOVekmc%rvw zewk(@fg`&)v8T+8Td* zhDEwT!8nSQATf%MH&63XL+-7IBUM=f>=Nd82n*Iv!oO02!NK@2ad|bn`tPu}uM>P^ z_t?r9oAYFU9miq3*})#?v!GQfO+YFu=&{zxh!X!zP{KA2cEpc3Dpi0J0N~=C%x^hN z-FITT8EeJT8G+C?OK-00}wRIftOL}TlM&G z#@u48q&J@b#cS@zKiZxdDzyyCHm-b$6AAp+sxQ)IoD%BbCA<0slbyOC&=aXg!U=A4 zBur4H&zgc59Ygk?B=hF=-6|{Z+qHzB{U#tnmGs0eV#B7~nK1HTxPB6P>)JdXqL3Wc z42O^KA(TpJuGoC0iOmM^CUmOs?FAyfv(vBQB)d-1&L3&pNjq0?zPEuI z7o;A9A)OOD=S@PS$#_|gk1~TYAG$glJm_Q>BC(BNVFW=_&wms5i^+_P_+Il0?xLj- zCdGAJyz>6dKB^DUT_`h#qtJ$RS>G4cx<7X=o-YFsW__pc6GZv) z80VhgPcdv_U=69ZVvcvnrk>T)ZQ44970kRX+pssG;wnoYi=OZeyb>6NKPQtEGDS_{ zd;#x;=I?oG>=~z^ST;r`kfA4&LAA0Y4H!+*hL;*HZ69g&%~_r$?2bd1|0t#`j_HO^ zP_(LksW*CIU$7~)NiJzXtu8;vujHLjwN)bk>=MsR=7+c7cEKD-jsL;tjq&?+5@+F++~~OSf{df3aXRSOIXZCHZC5$b zIcG7GN;UZATC99lzM;J3+sG7t5657(s@O2$VxN7u4q9s!oNTnXnChOK=&yJXvVoW= zjz#8%O>_5gU4L{n(9lzUOK4+U!BSWGBivnuN9qKc&>maEqqdJYtU@+3C&lf04s^~1 zse?yn#q@{>^r+l5^+x?TL);{ZZ-d6SVvbyaK00SUoib(lZ`Btqki6=E>ax(UjNVTX z!CtAeh_ZGuDr{SftnmsYF6GGve`&rMtEllGXs}=|n>9j~Dv`aoKW4M;PQe?L#h@zb zktbYIf7Kq!tv35yznP)!z!*sSoS}C{#r4xp-`=N~CyHSdrBJH0##%$Gayn0Ig-f7y z{QF;5x5{ZW#RTgJM76#<6!|VwOj1}h?AOeqD**efR3(fH2^iVvB2f~hDy6Q@xj4#o z&4TDTL{b&Z0&FPk(YWzJ*ukNWbMZoioLjhX=G)*QG<2$L>4s%Rc4|K(0+8o-DBXZS#Rv>ajk=ND%w6_ADE)F2=s9i*48bf2M+W z!ah711Z*CKLx=D>KF+_Y|4lsOskguHtsJ#)-Alg*h(tlo?BhU!?_bX2h07rdB2Cfx zVDCcZ8`&LCaCt14pW|0C*7P9aO#mm+a4h<1{D+f7jDx|D8`;pCp=K|+!$H48^+BTe zDB>7&vKaKUWVC}Wv}Xj~hGzNNLiMp^4M=moOs8P%RO#p+je-r54WGwn_r?wTQ;mXK zOO6K@g7$|VhXzkGV`6= zJXz43XJY@~%^&aPY&WYM*iN&rA1&ZI2t;{BWJpkB3O2ag`FLyVHiM2ohPuO!)8{6b z34=g33DrRxd8*+~>|A|8AT*^Je5riUFm7R`>N06QiHh=&gC(<4-}aUKdhQZwp4mne!G6Oo%6z2((`JT!11L$y-bsA8gfa16 zptaj1+PmkJRY`IuG-Qq&n&lQ5on-tK4zQ8Q6#uXYwgfH#b01$G+UHuNvAhf+=RW)| zrv34%pXAOV%qC_M` z?61Plq)^Y=pV-o#+0uO3bbaz!0+K6d{B6_yTwT5DT;1yIUi#~o4(!y~ekny6erU5z z_i^O@cQw4LJ_(MWs8VqHkl1lBwr(*7EX4*4>)^Av@1+S>gX#f2;)Fxytrc8OHQsmF zQ@&zA@>o1uda)r790`$Knh$Vcbk9gSjtPP-LAPR+Hk)xa|FA#~AN`#IJe&f2oVvLk zVm(~e?{k(tJHtIxPP|;Qe0-)rUcENnvQ4f^jc=*0@k+hOmYU}wn@JpG5g~{ zBAHV4_nevXAlzvzFDR4jj7kG{zd;TjV&|JU5K9kJd>N{UYK0i%eFj?0!p!axD+*KX zsI)+kJiYk`DHdbGDA0Maz?+VcpiT_KVP|c8b8ikulSq;zS!>g&nPo46q778 zD)8u`cS!D{p5@If`pAB?8gxAUetY{g@+oRG5M9U7eZJZIV*33>_`r%yi`vbeZx$lt zI0Aaqxd>nDHuF$lYO@eXq}R%7_xzw}^lN8r@yx&R<<_AMH$?EmMX!hwAsncIR4ItF z`Thr~9)hXQ`eO2i&;6d<-^FF9jeq*Xy+zN2h@uYmfN|$6xE$H^-(R*>eCqIiiGHmf zn8+63d-(dwj3gCD~#cmjz8ndJa}QEx9`x5_z==U5qw7^`TvkeWPW z)nZVt9A8F)M9P2KsoGw{4~2|h)H=j!u>n3>NK17qUg?Sq^B~#~cV7=>d zP%&f0izMRceMcId-u1D(f6oO`i1b$q)@58lGIckU!jU&bn_218mill8ec;jwdisa@ zC6!hZDa<%>nK-eJg0N;#cEr_3KI6t_;u1XfIQ+j9=S!)jrH4Zdr$(~-PcO}4UGkWi z_R?4)jZB-4%3ea7b3%~hbZW;{39-h81=$DW+k}CmfiSC9-*rnDXcQr2!_Rr^sXVWT z7jUVBqr&7+*735uvi+TyUkiXlM;#45LqLr9Mvkue@6b#+H2x{N4KbZQAZu8YzF}IO zz#RUC52kO%+Px1Db${jrfohY(~L$4Y$AvqKE`yBs{X8SwFJm z#sR5}rrS?OQ3XxnLdGZrMC_j-XXPifKQJWk1loUzl~LLgRujevEOw#tO~fzdy8(?*AmF{Ym_*ZS!HyEuh0K ztivxAQdRtmSF(y%^4G!-dwulvrn*%_{xzRrgVqUE8i_KF$uyQI)by##!-l^s^JOl2 zds=`BvHi0N8=l0DX(2uWYm#x*s&&;e%E8w#3h#=~$MkqrEugl~pEcypU zk;b9?Of=)bDLN+rV^v5G=K^Y(KldydKqB*Gqg{vn3UN;LiGJ|n_}t&2IV8|}%sEXW z*;mbX96Lawb+UAWnsKvlF5c>*PoqzVyvRl(f=h+PitR)LfuC37#LY>{$qLS&<&S^X zoB155FCNg!+xt=o1ELOztPH>kD`EtMR?eK@*3T=yROXXXaQ@)`;8K^thH`-#q+x2x zL`PlF(j&^UmXe|@4z7MQCht%y`%#tfHQhsL%Mr6YN{I72d{Cl@Qhy1hg{PEUfZKAUNl+7Tuyma~_0 z@j&0s5s@Hf8VDL^;PWad;Nw`AYuPLuVhZ<#EpyP?0a;pFV z!Ld-P^2-Ot2(O+3cs1Bs2A!GMOjGNjYEZZFtTVVv!H1^sE$8_ez%8Po=O@ zW|#+;IhCE;w7IJ;b4vey-I7B(PGc&uIh8e!AdC5^t>l$-E6fzXb4vHt0`hm^MY0F_ zZ2i(Iz8&%ZndJByY6}E-2NN;!6!onwHgh)*Oak0)(Dl)RLtBC zIRrnXX6}!&N=PU3w5vDo-DvMCpY4fuY~1#yhm#qt0}Yr8PS*eQ&!5L}tPFwgN~vB$ zpB}J{sQzakm}$f=X!ASBtL-;yN0_MKVfy*KxlhV~G2L-Mv+V0J^=ED3f~2eR1BoPd zsH6@xY>}Z$8(%`u3S|ee1@LZ|M~getdfFTeMu6<)|jFA?8 zV(CB}a89#RVObpT0{Q}!*x+W(FlOd4%|1A)8ml7VICrf~p{KdMAq@KR{s8s{s#=#B z7;PF6U=AmYYZl8M5v)y(1mHqD)H*vJbKrlM;|Fu-SZoQ6G!<8blqEHOeTWs;J73># zQ`(4TU>+V5vtBK?DKYPjM_9{H@yU9uO;$J4`T+DLpr}g*b+PKJU3}H@yZp)*ysthJ z>CbGsPx&kzQ|22ZxUc0*|L$tc{zg}-SLL`k-I%ScMl>8+e0?|Z>n_XaJh}m(03Wh= z9z)XGdZFvF(ips_vC_9Q(i63`XSK8&wbB3}^!~%~vpUub9m;+GB^{1U?_HJd6B}?8 z@#uRaE<{5vrH=1y)zNDy7Qg2?HI7Js(S)*ogv0yBCm=0U)=d^j)JvxE5u^M(^x%Z; zS1a=bNbSVokhlQd`B1hh^obK%1xMw>;WWgvw2Sjw6Mowl)td0!!|1mSJrw6=^Gdb8=PNFheQuJf@9~ zxgu(vV;0A#dWaNjjBP4U2);8uD=1V)BF0yWb=@;Mv;EoY?0#Tnn9M90@G_IcWs@W% z3&r8AVIR0#0M+F2PAY~b8WCT4pNA;EPW6lp7M4E=IBtUxr-LY`=2>?PJ9jMSLxLB9 zzmD?^J;fUUA}oAb~Q}X=^T&(M_AQ*5!0P!Vf~wc>u!;G zIKtYF0jYSJx*-H=wnEpPez7-ucvb-XYw|lOV#}@NpuwTN_+MH8*ENBuWx(n@Zx1L9 zu@}B|>fJtW_$my{+XYU`4q~m;Wqkn~`CSV7z2p(?95LKu)?EJw2Fd(xTScEvM?{|> z&%8#z*6MB=OFIpywBeYU@8gaBfat4sLk3LSh~&4Gxp_6Ulw0dQo8p^bySt`XL zCe#aq-x;CVsW#S}))d;X!vQxS8MRh?qShET z$k0Xh2SA@9_9r{B{)!YeqGZNK{l=Go2vNu)Bug!k%NoA6Dsr5JKC$g5{gV~FoiXJ$D4vNukgc2ZE? zn=tM+W6L{+3M|-oa#iC)HJ;_}c6C zPs!GN<<~h)eRM7|k zrw@u!RS5Jgf}roV!Aq$-Lh<^3w$DI+-1)(PJY#cP^(_$mqm;e5wm4A?goN(`ZkT+T zt?Hp^b%1$&&dtjhT+(*{o3Vd~@$pK3y?`9cG%>UJu<|;ce%n0`_?P-jOd^QSAUrsy zLRtiPi`*jly{X-3+1${v22IRDDb1RCXUBEqq{rM76H&bWmk^18(qg8^dE^5|ZB1p$eo z)sU#wkAL2f%&sbWwTZaH(`rk1Ps6#R_2zpmEm7sDSXo03Hvkkj@(*}d${V$r8nuUK z?3f^DVnK{cKI7b6OmE zK!0&jAHzlc#YCVsr?SR-MJQXLAsi-9TO?R(-b^|2qk{z1cjdsl)}qz4HnXOg_5QOv z&w^H}@C=-Aiu1GJ!GrrafFn=WMdq4)YrGeZcO-JNCnnP(DoSIg76$5EjTP-?Rmiw` zVa#KncA@owq_y=bH~T37&&aJZ@3pMv)MYHPBbA3sJ*23l17u=}LX;j@ z)bRV-4ZiuymU8~?5jlUypK0c%S?6Gzt|oW|m6t=~)cW5W1NO{Q{D zu+n1W8x^egDMEo9%|3f1?`za1r?+2OvC3%F+K;D$SC;{HaaRMtlQc4f>dZ02G|ARW zg(z`lW@`M=P_}P76jgrRHb_k_CBFI=K7zTv!p6j3S7xnSwXEjacq5s{r;xo|EKY}8SF&^2q_n~68l8$7${&ds`Y{LJxV{;4HdF_x{4Hl{2By4u zV2E6N_kYSr+8ASLY-T(IvIbA@Vr9d_|K=h6533f# z4*vfPFVB$wAf_x%Iy~MhdD&xeU6OrgbL&gzZD(|7}nL7UI)h3Hen5JHjQp&ot@n0&nICl zB*UW+Md?O!=g^DR*6=fdgv0ih%IAklV2R07G;ur~A?S*Q3D!L{sN9XxdWt1_Jf-Wu zZTu9YhnT<45S`N%wQz0H+FMd>GpC}!mWN_(|-@`Q-2XP#bdX2 ztNlAWr~2sR|3{7fb%N*(uk?dK7DJUi?PlslGoA3MY$KCc)4O1M*hwlSd-4NYOIe|I${ z!fY^+LObN!(p)zIuEl1^zf;gMZf=F~FmCS2q$F~7xWCbhdhVxQjL&Z!YX^W9ZlCN9 zY6k8;fw+eAK2CyfXb=Mja2Zyxpdt9olDXYKS+MHA&~tqj3B)mM+eqy|cqm!dnLy04$o&a9ZIgN5x8czKou?(!QxIDk4`&Rw(Fbbr&?6gF0v&`~Y7rM-I-3JtmwYaaGtg6RS5oewe?gc}fvzvq^ z&KPsv(uD03X~Gj}cVVpns=Rf`v?y4AtmwYY3;SZ#k<8MOJO+&QDcZA3#EDw3jatOl zOX=5IM6zsN9*rY{CiqftQ1Yro@?dU6-zG4%`=~s=6K$P=QI>%Lbiu~3>4FM(Dy3!d zBjLzdgObtRiPl6SMr>$TrRhq)I99IZO0$0mx1soomin6#1zw#W2}+{AOe~i!fk2Kn zOb=}DuGb134yL~gkxQ6eam@TMqpgyNqq#z2U2b4p9R>8e&YZf_D)z6O>zpUpuz`XR zYo~XdSy?842;@3!3C>SrVv@Kc>}ZOYvS5{-LB|rlq6eI(Zf<8My*pHz#5M}OTrg9q z30Ef#M72}H98HlEgpZ3WH)R`aeqa(w_enfCY3vd;urltX?qs^WGLU^CaeS$aR2MbN>HvPz{aRcgM8~nQZTHpqOeAQf zWuk8DapVzXbQ8~FvCtqhJao!gdnU4Uur{VkjlwXb#gndWB0)tn(y&M~(9oy!j(UzL zz07VYYDv~LOtD{zQZ;OS>c@O1FY76sh->b!Ph?eUU(o$A zK_KbE3q_`8L46W?5MM9-grRgrUEM!6=^=tE2V7fV>1|7aQ=)xZe5N(0Oso@BcdS<2A!Dqnp{R2+yqGY)po2_*=qn z{Qin7O2qtxA!du}n`)g$ozZ6nn8@Te0&jv*_oWI-p8S;NX1?c*aGv61cKk{8p<#M3 z2a|TBleshjTv0--Do{0SPZ*+~Fx51zW@;!nlLGG0t1&4BX##I&DugV4&8Z2Q-;*JCfU1Fl0~lAn=B$ zb^JMIb>qa_B`}Z(qwJo{^u&Cw#}!4?G19YaK%jFzOwYIdZNCQvcoa6&3)m#~a$T58 z+|uh9lms!h0igp){~br9U$QH22<5<^O_1dLo2}dsxhBcq2vSjI0i-+jCl$;*$|C<- z*)c*8gtL~!zOmvXd8{_|?$_x#hLUh}{fUz!_F@!PLJRCzg;b6F0HcqZU$?F~&vfT3 zpvr=kBHh3cw9BRpzeb_~;%{vkDMXpaH7f?_tuv6`Or`9B9hhU|$li6+TGPl6an2$# z_Xo#=x(QBR5~PQA5w7*`Y@3&3cTW*7-z?1`%RBv`(Gw?xw)N(34$B9q9&O^;8wWSr zDb6sm6jbpn;GPGZE zPgPZ?u9P`MDGGHYXJ1YGqfH4CuST%cnH0J&zMvtAJ$4*kR396OgtL&}A>a8FGS&sm z668kdx5eiOj2DlmRnWzg<3&%{T{F1a`3v|Ux}S|W+DPbQs|Tgqq3P4k%sG%6CnD0~ zqslkqIO$yTN$>)9u_{U5M!w;C68&h4w=%RFno42MyfPhUV>iwj;l!-itfCx7$e3Gj zA(QotG%z1$Z@0gg#vj8=JKUS4pe`~W7frJLEmUP!8+BI8gym-}$#8A`?xL>KTWIdv zi1|1hkt>@s{&A-bJ=EvGAASk%=fCo8=)IZwDl?&P-_88axK=o@Ijf%REukKsxr^r> zagV991I4O^agKxW?{9u$>}j+$hccrO(^EyZYhJICuwAh+zVg%RtzwY8Bhny zvJXMFZg(O@Bjd4F=vo?%ZFm&1p4(tDNNTVUZL7?T4zv3AR~+%g1bNoOIQ5#{gkMd& z<#!svZeXP)#$Vd5Oj@hqX8Ik+ag|M`6!`bRt{sOd{aBhn`evN+bq`?-&jq98i9~x& zGYO+yG*ctre-iAfOaJI8i8(amC@D*jcU4O@44%@ zPjvy&WBjX7R-3pJ+|UPV-k4Rf|JO>Fkqew?l{Dmd@up&?bJgo+q4SRV;OpAcajrr0 z!tL(bYA=BwQKI}Q(7;a#{{Y>lpvPHqqA<{@W$>t1Tg$luWr{WPuwA(7q(22D68 zFzJYUFijgsLoI9--@h$V6wxaZP~!JLP2GC-D(e47y}T|%S97b}Z_3?n7;C)~{<}#x z&VLXuQ$K1nKbIXF(r9SkFgSW!MlK6HMgf_keVqiXc#8PUH;Jhr#H7gvi+Rg z@yYLEGe7!F|LpjFUpus^`jG8GUamvuf1H>nGv41xy!$9QA&i|Xdjpvw77n1__*v&; z0;_N1-E})ZHNdd7g^X#icsRD+bV~8dh=El!Wj|{cMnqxDSL}s1(_5w%M9>O{1>5_! zh1I)M*MA4Wk7Q8q<%val&YMG%bMLC*5%&_62V!OTunH2%nL&U0>iQUna)7#9@Lz=l zdh-bN20jgK-5q39LQe5i+2PNs^O8MDGK<~W;@ySZ3TYArjx+$DKkxAltKTG;O8T4X zyNEs#Ce%P*%T| zS(`Tx`}#-XlN6FeZTu7cHgCww%YEwmgSMTMEbo(!_ZICK0=~BbZQ#n6Db9eY`NQ+5 z)Yi-ycfoh=6!N2?r0w~3cPBIBdUR{O7Ct*CGZ^FV#j;$z&fM-!8y<7dYS!Ev$AsNr z-i<8(%!*&di_gSEZ~arkql5CAcRY=fVQ>U98AIiK%4cD0h$p zWh4jtIAkAs%Nq)%PPW^4h&lR^efg}lp{Z2JJJz2YKOZK^8vNu6mX%0hufTdpY=STp z86w$eQ7+3!l0_ey1Pdt8OU&{HcqI2x9moA6dT4TmTU{=HdPom^5Jb4{ZTqX2QC7Y> zEDkYaE3QdbpG!2lU&(;WKG3{zD0_dw_;^|N(CixY1k3%rRllali$eHo@2mKay`9wa~D*+UWjmsDtXMt2Y!B06DEA%S~4De~T(h(;Es4b7j|( zl4`hJscOusYzq??VbB$xqP7mu9&~n=cRFVZYcIaABQ~kQ7yAu|X}{W(@?kOnJqsv# z5lw7K0Kw%-7D{F!eams79h==Zdylt(t!2>1QDQ&j!!h3XDB&S2u*mDXHLb7*dLvW& zocAWMl!?xtBUPPO7)!7J*jisjrID$?b}8u*9EL0DFS@GIUdZt}Swr*|pkbYg z=hWj{j-^gx&RY-xP2`xpy?Mu&>8Y97ClC)_;p@u!7$#i_alq?eG2bAVSs*c7k1%px853YpZ?j6g=`WZ z-hJvMT)!nZP8yubk}pn~pC|N1$PlCsUZYccrV*^=2QNKrZe?(vXhZzkmql=vhWai=;1dE?g5iZ-; zlN%!58@qg=Caakdb8%d)B>+Y)L{q`$S!;i`SSPvn=#w8NcUa%3! zT57v*!F^eqc83%*Wj`iGhDBm;*hzE(tC+5OVnwUf)ptu@*!zq$8nncmGI#8>7-$$x z7T9*Ils;x$tqqlKU5Z?)h@lS=2kq5u@Dd?a9E9@=vlcJxT{Szhq5np6=W_@p$;uJO z(-me--Z(+_XcvhdICAq2fbs*F6E7FUYkuqfFEzF6cy)AiRl$Mw4=Uo5Vb#W7mh+>Q z1>XMCTef!=Z>#JbA*_F{Ju^Kfcd~B~gGgU(9lU5aZ)y3Ww)m!4O z^-Z~cSh}H*@in0vA&Q-E2WpHzL6YP z0*pwG%C$eZgmUV_FwabMPG9`ZWuVq@$!}&#W>nrJX{o*QB9t0WG783Mo&?wrv*3~p z+cI(rD_b&#Uk3$h%84KtKGspnqt5rC^x4>dBrI&FvT9+!_4 zQ{G$onxmDI?Bh$0O5NIMbOol73)WB2W;pO4UKiCU*wy-xbp4Ei-qE|1pp?CGRCSB@k+6rl z>7rY#pdW~}Xgf!hI)>^bz{y1xfkQ9tFo|IGTzfi__ffdN6jN+$2HlXH*;QF-hh2X< zohUYo4WK(`gf`#o`=rw^Fb-F9?=8N~Gt*0VCJx;~Z;-f8Dk83RD6T&Ix?Y=+*dZL@ zi*V^1crP-D<6YL5C3Lnw;dXiOhZ*#VQ#$$UbbrDX4d&7^ z&VX1P%MA|e^_lMJM*DQ9H*(x4%E1Hb{v+zX7ecK;TPoY#i~+*Tnmvor2A-#i#4rZ- zgL*+TiwPeNM@G2L^3J|n&tw*Rwxaep*8WXOGdBbh1Zsd?S;+X>eBOwibd5=CD7jG3 zUn5;G3QrY{*7fdbC@;T>)g1V0oNS5^Kdwg;f&SgZxXNpZCA(gc)#L&v*{Q!!w}0+q zqxoDZ3V*Sd;~WQVcB5=krn-tW@J{L#p>fe~DIEDF%M}+RkL#w~-}aaN7ZShO#|e$T zaUktW-Z*lYrQBlsEEPD5YU)a!^)n-a9*wTrVSbv~)nHcQea{VC+g|7@%^e8o{M z%{(K!HyAnubt*Naosy*%K%Uj=!9Gmz1agGBwdWYi<=!rV{}8upRIiVUzTYQf;>xPfMggy0nF6Y9-@nULO>tQ7f{X)Gbr+y4CjY z`&WTO*h`JShjNGB|3Fs%1B7;Ew*+wWy16_i&2)P09FP0IQlE{HijU6;-}7#aw>H1$ zmd8bw4u{W|3Y;<-&uqVMytxRGho_=JprUya^lomvae{P=v}^Wt8c^c1GT}2|qa|Oc zf@rKuf(Jn@#aJy2Uv5yOBksWcSO0QyvHk#PwCVF`Qk5pnCIa5ElJ#rF{B)If~-uphZ87dk!rp**?xgNr2 z+qn7iT;EvKxU-3tb@Dy*P80ptRF~Z*lzj%4Ui?@E_F74uTAnr>r7l$dALm+h^@Gqs z_T_uLz<~Q4e^&N(K5TuY2Xo;7gpI4b6+!U%1mQu_Sh?fipKx*OWSmKS`1%(4As1r2c- z=?Hy$jrlSs#a5@5^uinZ6DQD~z`1J8xoXV0bIrFAhfEN_tT&P3E!37fFr3=z)5A?3DB%YW5$a>LZDoD>L7Q1TTazh$n?!@8Ndb@y;vr!7_g zC~~x`nsX`ZoG{k94x7fNGjqgCS=Y$8hJ3L;kx0DBou>!sCgO(9pK=Lg?BD-5gvTi! z~R72lR)n^+y;W?>i+q!_V%m5(buPd&LHvpuJu^V18JJ= zNmRMGFnlSN{`?M^K`hh>s>T|v2B+Qmg<5ivG<()8_CYVid412&ofvOj4Ls!vGKg;BQ*5bY7 zoejxA$D_udQP*80WsjFYoIL5DZ4GfGf~q1iVf0h$whlcH=f;21;=P*U&nn_OX7i`p z38UGCc1!TJcG!QaD-vc$q3ImF9W6B1bCo}%>=YGO(vli*mTD@k81!b;8VV6nFMIx% z766#8C4Ab2scpz0&?8!zVhSZa2n-WRAS5%ad`~E}+emnj)@6J`TE#~@fz5j}sy9d= z5v-ZqUmR6Eog{Ux#WWkUm`5s+PKaK= zj=w%Eti86}uZ=}wAu2F%=6_=Nl@~eIA9bB|XVf=G#;SIk9)meDxUjnbcs@ahyeCcguwdKkF=-%==iD!Y#x zYP8h*6reqqDQQShDhsA}$OUX(W8Vw-=mh8A$0rBJCkyUeGZ{(P~)av@dd?}Oq*O2pvZ65 zC|H3TI=Ah}4`&#S=YH?dG<@dft*?ZH@66ZMG_vFL`CaPRzM}vT9q@hOAP8H(3ESED zrXH{Z0j_cQVz`;wneNma-p$)PUy&+z*pbl{LNZ*fbB9>h&UK5hNSB2OezfTK$0Ffw zAd0d=l%42bC43vFK)v1W`0QRZ8HwnPBDlS&NLNiALB~XsOi9b{4PQlrbxn&?-os}8 z-=Jt~bS1H0ivdH!aNA`;><;fFe@=y&0L+^yH+-~j>!6yxx-7=3&oloCjFu5YM8M-) zUKy~BrnDS)L6e~j<4>7r*I)Ee-mfgE{@A~mXb9!DKhPXOY(=S|$nwUP0wM2uDSM_% zN|>cXW4M!~h~!LEcy*Mz$m!=*&_Up9vww>!z~vg=(t?^*hp2hwUDKSyI6iBW+R#VL zCx;x#fj^Y|t}!-}xq2DiV$9o7+1_?E5tfP+`_All&gTdqQ(*aG`LsH9x0Juzyt8|c zU0n-U)-Ac*7+R&e$`O-E|sFi(TJ>>-R9f|W# zr{f;mboQ0?1RMLIUUbLfG0z)XFDE-i{`sQJq#|1)%sQV>=1F$Ar(E36!|x%-C;cyh zKSTzx(!B{;5X};lfg0fh3I({r9&glZ8sETB_6THIa?Aw(VV*AK2z!*0i-(gsrB#hj zw9e)&_qYE*=;2EHbfXROsg_ta{|1xxpREb^OS~4;WUrfGM0ubr-00EiB(*M?qJ*6^ zUsA|zD@4NCKs!o;41RBH8$qC#U&Ltx8J)%Dt&0t52<{NhJtCjAqqr~qSteZeN^O1u zU974U2uVJ<#XG@f8ZR}YGYzZcqxfvwU#RUQhfBPTv!Jn9iQGI(QEWX|h+?cxaiGzc zZ`hwWqSPO!UVR+MF^mZxHk9ND!UAJ6-AN)PS8Ue+*mEabGua0RE!79-FT-Ah!@-c$ z!0vDh5h~zX++G;-;^L{*&i5?|ZUcpBu*DMLI9VoX46C%H^pJlQ+fC6okCDCZ>L+&^ zB@Z&?pxT8pD4;Z}{;DYhl%vym@P;8yBc`;?+HA3ed+J(+s|7KsyH4?+O=6TRY3b^= zWitU>Dhtq~R@Q2CnX|HHFoslB3MndyLLkRfDU?717f3pq;{X0roQa09bXHuJ#zn{4 zRsgD4RZrmJ7XOwreN`)e#ny#TA!YtpWrbNCGNLhAfMnS(vd1fIq5QI$xp>C9>HnJu z^{>UU-;LGEgh(c6;@RQVPW&SM_3N@2{U>Wn%b1b9*F+JGi`plQrLM0=zOGk)rX2X5 ze0|BF(zV{Vr=9odo%aL&PhaAPu6);cJhOKZy-dbY2b`}(!8C-3_9Y5)*h66@~S>wRh8i3&MJ*H8{5A_~z5t)Ec7 zWMaK!s$qiNTPX~3DLV;?-z~YAVt?m=u#vIR5K6%%&C@6WrefU{AE#^N(t3mWm6lcB z(zrmdsFhUK`S!vvJrZ07uskB2q-FK^AUZ#e0Y8;fA2v{d?2FOO$3hRUqsfEOJOzB2 zI=Z`vbAD<&JN?l$*u3d*Fq%33W2-h|2e0Uhz*GLo%J%M-Qq5RsD(k<>#*5(+V?T|Xx{N)EWfLN zGAC}hcX6(Fygbz4YxL$q)b>L3%Bk-$_iAqjkXH1gc~&VIhG3##H=u!@OxRn`8ohqP z>lJ7|nqS*It3{u$vFw1eKPS*GAo#1nM6OoRxMmoNTRO$eokA@g-)EYX%HmY31L2ap zMhsi0=T5^hPoFl;=0-qsa+0-#b5b#+dQieVM_=Zmh=D8WLVZOc zG?+-{?}gW!bORO%Pwt@A7Mnnr;Ex_v@ih{^F&4wQ50E`>!#y0oYaH>hoE$fmHx$Nj zZOd=Pd*=-D^nUc{z1vdk_(!Yk5wzfux#9s;_ot~c{~k?9he{aYQU9D#mi07z`ZNsD z1!9&FFBrX@(A^HcUOU-5+}8)SrM>k#nfwJiY7JgMC3*`zKYEXv-Biu&08Ve{NNaFa z*VVEn^xmPpfqku2GhB zR$D-3de+NCR_P7)azPiv8e9`i)y4IRF8+Hr2~c}mAJ3H$(ea0K!gv2srAI#i;*{q% zPg|FdF$uK&x0XWK=fSLEVS*a7e;Lm`8+MPa{(~=}uj>E&Il?(O!U@=EA|usk^Ai#c zdlW*Gfr@&B&iMEn1=#m>*+C5X4gH7Z{k*ZN6Hn+lPrPQr5bH>=^KeQe3V=Per1=3< z>IMc*I4zhgqB(oaj}6uQ6?YfbUYVA}_B zF%Ujsl35;|-ZJ{>oG|ev--(M5{utAf{M9k~bDWymEsj*$uT<6&8vW{F2^OyUKaBt9CR4p`0q z2Ul+a6Ia}IdzVt&3KR+qQrz7gN^z&S76zBW-3rBFfFi}A#VPLYFcf!pcX$8J^L}}9 z?|YM-$r%VUA%Qt-uf6u~&u--l&297gyYrj0v66oaMiI-aiBrrPK84>KY-ajZvZRt~ zMmumxn}1wgoJ*@GRb`gy7#1YfnJv~iu)#%Q!$fPzsA+^>%o;2%il8l(Q~98ljm@T0 zQ%0p}g!;GS5Al+=oosFym#!9m5i1t=ksf}Vbh@>S3n_&lX0ISt-zZ7Akq~LS3x(S` z-&iGDpA{FrsCSf*dmx`bhu6)QtEK+CUSOWCg!>()1Y;$G`b`L}dXBkQO?jHu*9OBQ zB)o_J6-hDxK&Q7C^s4OWu!a`mz;+{*+&`|WklnQ<=XpF*z&8EWWINxaJw_;n^uA_l zB!g{+D$$(9qR0h8N*gOPcvS0J`TNELdy?r!;ar$zXAK80Tr7!tO6M~#^@a%-Nt#hJJQ>UB z#~}>losf5ET5imk$A&~ptxGZa_O~2s)m?yNN|go}qB;13_oOeM?bn@NGq+#dcgl`1 z3|VzN9AeeUWRsOtXE?FD!;{z5yOyN(MtiObOhP8vCsP`VFko{^1dFo1f_XLtE+p)( zeG%ErC2a)UZhc3yIU|)CyFbkOc*PnV){GcgdKt>}dlTi8UB=0EoMgHiI5x(E(!Y`` zRHDXQ#D2v-FYJaa{OV6izrd?EK}ce5?2#Yor{3L)u;B=b?1oqoB$YOqGAix=mB)8v z?1J<%uo!jbMJ9W6id60;>r1(yD|KvRx6^zW8-8>FBxmWpZkZ?DxT4&(8h+=%r+oM)vs65KS2N4f}ynX1*1z&}v6m1{Db9K(3d z%%9o08r^0ko7o~eT?eq+j~VkZ!6+KyE|>yl>F^)Nxdf&7A&Xzipl$KtAp3*j%n{u7 z!F<27@>dyNDeQ#5z{KWqRr6J}4^zZ_Yt32ug!t*A{VuE9jI4M+hT&2BdG@)`$mjeH zF!rKlu4bS4`rTg-Z9jcL)zH#vznYN0Jz18g!tu|*`sp+K`UfOKg=1h~Ao?&K6HUzj z`TZ*1)LGWk21m+KUXo$~P6!>QemrL!nXZK`=;?nBDeq>yn_i6>rEJ zLIGTy!H9P@5ZlrM93Xj=IZ&y#B7?H4gssollH_h7daFsf`(Wh&)+*b@q~M*&89JWb z!P>h-x@vr0I1*8GYezKcM&z2e+?%RQ7q@e3r)k#8ScbP`LK;gJDA&sX{>TnBw_Oy? zCa)8K&8F7BEg~9#2(8zOU(V@2=5#<*Xc5PC?|8HOs+n>-ufAd?d14Xq1Tpg)om$LN zK6%~qy98wDqsi0gWpnt_W2_S4;)>5IS-@@B-6^kqL5!~l7K!J@$P0NVnSWKzq2k?Z zZl2Z?+UogiHLu?VWupE35Z|~jH*hWQU|kwD zQGL>%-cd(K_w&o9*m8o>nJF-nt|7?zO*bh=!G);H7!UxWwEdY(O)Lpvf<%19=P=I0 z!RIn(FsAtlilkLI590sDCQUD&P$enr9aJMp2Qm%E){Lv7rIQZqp_`D5gT!6@Okh>= z+Dyojx!XW-2NWr?baF)~ie7SsB(h#Yh4ki)-*>AHTF$vK4Ge+a9` zmoIu2&-DWN_U&zlxMuvp%a>LahTv-#dWU0GUuYY=uQu=8s0HLn4? zwK(69e$Yhh6MVZ#GI={PBEl#7xP8C>xck;!@Y(%O7l%VVrAImV!Ekq|b!6XL#SVp) z%mvX(z^%R8y?oibewcIRfKU+L(zb+~ZDog$|Cm%{n^5E!B(g~+vI!D7ZiSCS|I1)c z;=KIDd6U5HI?Q)37JT-e$KxNr2SKybl)%GJX>Y9V1WbkFo++hJBIm**%tVZ@3kKGq zdWTmBj_ucT`CF4;{b8;cV62_^2qxRJf5SfAi3f+7kt%eAJ2Z3{`NbfEQCGo zQ>^q4N|krOHrD5#k>|<0HMW^qyi80sNt6#769lr!*(l4_pK&9KKdZV@{e?=o{tOc# zV(&3|(ANJ*TXWt6Z@(8GT9>Na?sqtb*LH?laN^}RjN$j3(FGgt3i%n>BpA4m7MOY% zm}-MitA%D${$a|1zObF5u)V981ZT>K(XyrAzMQn}65hrLt@oC;Y$7*2 zep8&!6v@N zf))`|Ol>Z`bQcbbto}jsTH*N6O<*c>1ivfo=*w;A?*?X|^yTpM0C!1i@;!-!MSgy3 zfE>f>cgR3NwJnl1|CC8*wHCL*b3-m6)&@&5&*+ z_2&JqD&PE|eallkum8nppugYo@hne!S{q@l8YI6|n?6#t%QS&4CC}E))7)GVzc_uE z!J?93E(#U4Q#D+k*mk2kzT>}G&A&;4U;IvvR_Af1iHQ*Jy;5Bx6WCejVdr8vZE$jO zkduQUdFa`8rcJ>dAx&q*Ki-b(@~SQq()b=$Jt)=lgz7) zdIGW|^XUK(xbAo0KN?Jlgi-xVZJXLeWUcM;MD>UZf?;BOC$O?NgKGO$6VIRp_ilL( zdjjuF*J!SzHf~a|IkRmEN-&iBQriW2o`?os5B58fDJ@fg^Nro1NtC2?63S)DAsIKW z0HZ$=v{X8yv^S=dI^K+Q$EkTv1MkaD3sdq-WfitNdDHNo7Jq93h*2|&LQ%kbwdk5*UQ;dfexN@Y4UZ2eQ z{f?s=|Ao`*M#n7Bt@n~&jNsn&2;vhb+-uF~Zm)sM3P5mALAm=O!iVerh9m9#(c(uy zAZvOeOp$)dG`NKD(Lj3Vp z+%VqMpXaGRw_!WJ?5g}EJW^o;;jk(X2|^R&|0GPaE7RWzXyV(`L1&V_%r0ruSDEFV z1Dd#viF`?#TeIhIV58QovWX-6j}Rc6%a~DSKZM%IWnXWP!+cf8?M*^4-}l+z9uJ%D z{<)j)?&$@e%hP6mjFBECgJufj90!HFl2VRlWV57)X9^SYdoy^ge>guUyqKIEkBKSK zFU&f;>+m*Vbt@cm48v-TSNskm9-~hQt=$qxt+vZ1(F815wnd7eN@Qo-Z2dI4K87#I zCDe;6>2~)0j>H4qn9c^FjcXl5&bA%BPHe`}t;Pj8?2GdWk>O6n*|yDefGxXe86r3r z#P6nVxNkX9S=LxdEdRAkGU3Mx^s2o! zP>vz#(Vg|?2Po}uxBKdR$IG)?cO%@QqUM6as z^uaH3DGFF|M}IE<41M~ls~$_2pQL2ni}OR>Izb+tBQ;tUT`gQ(t{_?#>ZGp0pI1@% z8)K4-np0_<9qdF`u09S?uvVcPVgT3xj(b;1IsJC*8|FVI3tji7HHQ;)5R%b@W37(7 z5;Y2{4!AT+N6NV8xbf2lAes$PYW0Rkvyt!%C|MUaF-LyxkCp8axM=U*c6WCtu^2oY zRgdNu6!^b#Dkv+*K%oY0KKEV0Xux-fh=?vcgxdWVvNr#bZNlgRn;3m$Kqa&>{*t^q zcc`zHHdz~-$7CP)9_|`dS7>UOwPDP9bTkxo6G)r zn!U)2eFDW7)fieD($o3NyS${e;^#?GVTiTYk(2OcE2*eoOVvd~-nOIP%jW$2>hrk& z!S$^x*@Gf(IKcO{@Vm+(b9Hrnt``I24{mmK^+`uR6}a7W3*3)W-jQi3k7hlTwwG(* zzH{9A_w)2Ht5PBqQ}}kt83O}DUS8h+fLFmV>;FmMJ`wVWHCHmzzHDC4kot{mZS z>CeaeZ<35Cih);0K$|P`gRNhgfM`S1uQx=X`N#pfNYC!PmUXq044jeDjVC>Ce!wD; z=r?xgXS4ekahKzb0G50jr&zJX{)k~w69%s==aEC*g8dszmtxC$IwEp1jJN=GEHfMh zJqQ#SWh@u;gSZ?*6z(Np>3+*2BEush*CT$eH{WS2#4k_?G_P}#T!>v7oAWzj=|$e$Iz%2Mw*k~ za0g8O#sBWre?1m)?KM6?Y0cvgA?qz@6AXYJJ^b?^UUJO}tv)h}Khk{i5%mDqL zmABaM7st2#9_oHRa__C(#FQvwz2$l=izgG!EDR7l-RsKa=f9`;U%gM8GyEvRZfhIi zl4#`PuET1{B&S^`yufOUF{HNz2SHzwiuj$Cq~*|ORW~5Tzv+f^KyUCL+m!mrvPHcM zgAkk$O3{ikk@ef>Oh`P3JxXqF{M#M_)&Th>H62+tn83u4hQU~giYYt@Pn_N2?E|9~ zuetnpf}BNKyDwcz6ueT@Y=Jd>8#9(e#LzVGJE{m(6#2Id^uuf@xCoFT0;GA92&$o< zLELc_q4d&0PG9JmcTrgKS$m{S302gC>&xclcp2|1ud#LF>z&d`%$sc4omom zEIVOu%%f?0)TRz9R$k)xrB) z4JVr)i^FZp>&bn`-Tm6!{TlKUokOwRgXZFpL*J72?$Yu|N;3(kyI}sQ+sKk2?;~(` z{&5LN`-eWk-(5~6%ntRw4~Bh5!hCjKEy8RwLGz--@!YnfBdHIJ}X4x}m>4p3GbCv90^__$I&JO$ZXQKtmNnJ5X z9D%|haWvqEkUjPkc(1+X%6DCuPR4uDBiafABzSWdu&FCoEN|A$jbAXZp*Fv)8;Uf} zuD|V2M4UWet&yytR;_Bn)1iHZQ!H-HIbbK%IQ@z9Fi)zr=Uc+TFh{G7dBq!&oIcB6 zpf}Kdbo`Wl8eYMC1-IZ%8eZ*ff%vI!ao)aliQ7Op;?Ksqhf88EGKVps{Lg3b#&A<8k`^H-QnHwm>WexG} z>p)mq%L8aB1mrVr*S3dg)vWPzV^jcdoOZu3A9d0b)LA z_8zKrkD-MCokb-o|2So|IcvB+jec>6=;`Xav|wmxkoCLGUu%;#r8#mk7Ua!sGpStn zvNg?I4jE7Y=G9f<*B8Yps}aPDaZOe>3;CsKJmZj~YsIv06FhJv@JJyWJ-;(Ku3ZZ& zmKt0)8TCHdGhMqPgS@XliU$0vJhpP!xhasS*Z3^E?KY)%Uzf==Y$!G%1j$E<%t4xv#O z`^@rj3mSfroGlbWmo$zpYR2uHG8~rLN$E}k^%X3RDoYId!ooA$J0s7q|5wfvqY04wok_jYrG@K#z+`npS2FyieJ|_Q6SDnCdx|Vr9x_UYWvSgltFe>ip zja2I(*c!?)ETI<3b()ONS~ML`qbzJC=IuR0_zWI7U};N-01NS8dU6KZv|H@q#|=e1 zRb!o+O0ETMR6?*#YrI({?7{<#a18qg1GG7lrV(&%JoG)kR5N>aTT}_FGS`VR*Ab=7 zVEBSlc3HaZk~CL>^r0MOE%ncZI1dT_@rIZWC$vGQl4+u0B*oG75rxjuVQ76OA7i@p z`S1nZx!i6nOD?rrF5kJfaXVHDyOnW!m2taOCf;o+JY9ruUt&y_o;Jp`9t#as*KaL; zIzb!4&kZbPFVAor$K;y-*7D`vO|?x?X0RgTCf^p2?BiA4D=m}b=|5_>nsqNoDE<*h zU?i@=Y_IJXh}`%j`IS_8X1+96+Dbc@J)`h* zd|jrl&~L^^LLEQS{hdaqN=>`DwU`1BwD`}SB@YTRrM_V5z~dLzKII12dN!?)+_%K-^^h)s9Z z@ZP^p63YDy2sMyppH&AOgvvzmr%9m)(ee45xkbQH-q)q z=h~B_?f9pH-PQ>^P2Vj-tD+yz)`<`|G(Aou#;HFCbwe)l{HNSAUIs5BcLKn6WuxW< zcKbmERI%(dKM($-shP(DmNv?D59Ksvr6#&vA|ep@O;Hh!JIF(g|7@NR?iwe35H6dc zU6Q15KxLBgE>ny>Puo0U@OQ5oPf@(WL9SZ2E@NKLr=-1YoFBx085F;ov?`Ru%Z|&Z zMq811wN6?(q@c6JV{(cOC2Qn#qdW9iO_(6oDi(xv$w5c*d4QX*!8XUBFQTjpYv#Bz zA~)9a0ITpsvr#(#)9!CA|Fuk|0%r$@vyI-!k7Guw`>-K%PG;Di^IqRz600C_w5Y@G z>7lfL6e!J^Df4MRZ!?X>WVHcz%1D$p924iUxFF1Tmu%$qOgw)7T=ZpgQ`BZ9x%2GK z=w;igZazM}IutAG-g5nHv(~#%^DeoDW{AG+D7kac>CX)n_1J#*6xeEERFL20P%NRRR?GNV}7; z{T?G#cTJ;2NDKMbli!XO?GWj5bLlK|+5ylYp~^01;U!XSIytk2O44fi@Zt21OR;m) z6u&`g3xwGTtg93gGFiIi!q{No1gTG7%-ISAO>SMkB^d;bIRQ8i#*im*1Em;_T{O=T zi@282yhbA#=O(kpXVj730_{c_tHqwTm*Jv=_TVbQ?Wvikm1V2zYyHcu_2ZKHYG%*>~|%4; z#rmgpcs|(y@z@(aV`x172cDZKki>0JrrZ{6Xgr8IwL%g%8aa&Jf@wX1THn!h4F{!( z5w}3*%PJk2>;pZA4E0;bE?nv}g77|ip-cx!WNE6CuwM2!m!AoYMD^uT0Q-uai2JLf z4TU*oV;j$EYZTOHi?o%?`80n1Ts~l3>D58{TP}EKrEzW9x$Ru(RJ*{wW>RzlMYL&h zy?uJ8eICDMQbc%x-}!dwYPtG9X8MvSFL0Xbm9GbB!|Xl~`+(LyNa?|E9&_Fb?3}oc zMAain>pgc{JW*Oa0a&w2%~g*y_mXK&FCsFL{Xi!6rsRu+-4XiPVca?BCQu_F+A|RC z60dTTeWt^zznGz^ z7ah?A>#(x#_3A$7j!?~{Pzl6q+y5e9;>gi3uVW-`K9q`rL|(8)*ucS0b{T*at>35f8? z)Lx<-ZJYNXMW>iPoET=+^Y^kr^bAVWGB~vwBE^4REZVc_BEHCi#~AM4L9q{~6VJA@ z=qg1=px7uJAxi|lxPcU#=X{c%;*w-~=&e(Jw}dI^cIA?PvDDmXLN*JdRWSWbMq4|c z%z{6Q8w6)a)8jm~ZO_D=bb1N$@)$$&glhT6uR0Wn@pYBA50^JppJW!F91h$`L=mG_X z90o&q-O%h$AuSrnS_XJrhRh!fSl=7MbJ4UIjyWi*xF>3P2WtubD<|9FM!z^fy2F4E zgasI64;~3q7wNpF|4RH-XEs^9=oeRaJzY~$^Wg@@b;IZ~HZUziK5kgL__=RxG< zeSN_D7b!AF(V|Zw>`ugJ#9@NmrvLwS}jiU*eT0D z_AZP86m>YL-NKc8veqkjGT&cWemV1E;E?ro`B(d+BaNB~oz)S*Zx9`MI*&Xev;Su2 zk$K;BS@My`wCzslFnE`6)c)Vn*#(I8^?9WIb@eIh`KdI^-j7$<*Iw$uaO$hhzyO^Y z`}eTQPADE{3N@2CN+d!Q5JOJy{Qg%?O3D-QOZ2!W*uFZsH>Ko)$s9qjl?&`F3)_ji z8m8XgHzOQVY0T`M9-j#~>D-7L`xzymTCkx0%u7yO}3P#xY3sRkhVD|7X`RvFYJ{2@!p$idK3Ee#Pyn5AI| zF@a*|8hDE{?E2Myy8koj) zdvs^WJAdI5gi+v@HdogDIMv-YLh=Pt$WCHurf+oEBV|u}Y#S!mD^eYYu+O}9@_$r! zejkMb+2feOa4oOGXN$l2+mWKB5Y*;_JU$H2j*jRewSuZM7{XR7_>sHB| zed+Y(u7$LD*}PuQkvJ_4BLv^vLVvDixXP4+|8zye?_qv<=hykdLb**btuYhu-d zoYgYY#=$N1G}(7hjt;>wjG>sOm|>h4`0oTZx61_RO3UIjwPgQxKxF}VgUw%4*J-gn z>*AU4Ik*HCw{K3uPz5zKLhuIQsVmmj)Jdu7QI-`UifN)j6x6gZASDOB-q(+lP%;+o zmXAfOk<)mRHn$-*H!vbO6l0x|KU9WB=rPbdc4Hm%@Jbm8*@iYgH6!9u)^PDPbzqHyHa8&Z}fvE+Iim%F;_pKOHjSKp)Bd&{v4OnEPReY)+FGYymD3CBVShn6c=_6t@vpIu7$XUPZLxBx;K&5#?Hxt_JZUFl=3L<27F z$rn$sOj-bFu#VeYBFXG4CV*!^;;q9iNu~p$B{tGvyLoKBKD}e_R9>m(%3iqCXgrpi zQ{6xvEYKnLkn82H_q)qh1hm%RL*c~lFmrE@_naXB!czZ-C}btoTh|&u0E}(HS%>^ z2~2#wgQWX^wMfqyyGZvLSRy?Vu=Rtll5Klg3@e26t3*)wdl;|y@)*CvOv&q+wtj^y zO;Fo9tvomYBHGb&inI10j#;pW5jiMWKQ38W7LmIcSeQ#ouNF;pS70)UC)Xzm`B~cZ z`=8Tvj($gh4`zz&D^%?|@AIQfcG`!-9upvOto84Ev|>LxYNZrM5w?VXo+=A(AWoXP zvXHt+`jo-|I!CZ9IqyKPE}yu0EIBUCi_|sp0A1~dbZWnJYB*4#2jM8gR2c$*-uB7y zy1Jgqk+we1)nu3%q^X^dEmePOh%v2s&;f;`kzfso20lY3T!z-T4%mNS^NOO7Px8A6 zgpOE#O=Fe|Rot#Fem1|4QsuBn7$T&x;KG9c%eov_IjYRVI{+6dXZfa~yjuU?8)AsW6g7%SRsmb;5)#6k*XOVBT#ol+` z`6g1N<^GJAf8HH$kx4BxKHi--?HafGtCG4MH@=IUrg5T)UNFfU+5Vr?Xr<gHLxG0l&)n(zkWo81^V3w8;60s%g6)jCnwuT1bqgR9+lG1pwV4ivJd(!tM`{} zCnp^Y1W)ywu!V)SHosTzEbXHlwL5%#pV7?wk@S1}4ydBC^66Y9B?AL$Hvqflz9+*r ze}M6x`j4fxOF)JI*Vwdbx>$>h&*9q(f8QF`{?pNst(VusLaj~c>*t4y&~&aEo~Zy8 zq|YSCuAlz@i#u_WFqVhqR8h#oa}jeGNZ#v_ljsh1;69#uJ9c_xyref&)KVYnXOH!K zV)(F(PP3){`HHIAjCIpc;BD`B0`L-=IwBtopBsFHq>~=1V^ykSWe3#!(G1f}HKpjo2{bSi-d)?gj5k-=8dMmW;I0orMf@W=#gAXK4+?-5D=E4CV-Hlcmu>IYZ;ipk9Rn48D4*(TwjoW;n#}n@7rRp~dx8iNK!dnK;C$BjmmC6WIEij!b zx>fg2n|Tm7c#ZB|9fqok&ExR$%mT|M6+OGA;MGc2nSbB-n^&$47(ZYB!3+|3e;`%} z|34Q~0cM)@D?2ld(uxwe$-Q|MO=dY?oAwbl-@=V0C$X`3xEh8PeCho8Zs(c^g&5uv z-HCxcm$({XTYVwc$u=BBi420%i6>a-6cY=~9nTV%)qOMl7VzJ3Xad>Z2p~%4X_$n8 z(6-cxWRQ!vJY?ZFUiRO*F|%g} zW$>->c`Of>)g_MR+T0tn>bM{TM{tnaU1-eD>TEnO;Ks?FF|6nJ!axSrC_ibsYkek} zH6xj?3wA^0_i{yuOkCwFBPC2k*eZ+MDbp>&cDl$$9IPXuZ&)=cQ!XRhuyxF4O>B`Z3F% zRKE`tMR-;Zz0U&S_^m|f!cr13;;hrxkr+)7Mw;qmQ*&^+Dl7LvUPmmUm+J#5Gr?d} zZ3t;C>5+-9gmQbOw9VeQv9CZi`UTy!@WBg2v0c45$r@wA4;+JeIG&oz@IxklKcPqv z&pIIA$b@U)sP3gG94;=II?OX&|BS*5{g2vfwPWR4GdxR_TJSRpgy~JJ>W?*H{JwXx z9Y+sl$$qHFD9Vv^EHH;~X ze`7m>>nA+i`C1l1`T{@a@6^l&YS^K!F#j?OVEnNK6Rd0Y)D zhoT#S2rK`*RH?lemsA8_*a2}Z4Byqo|=8A zVC#WOeoAJtwVShP_ddQ}?N-G;q@>{eA_a+hLgcMur+8}}P6{7|t^oFfFl`(od!Pj* zmbcfPOeeM*-Lu-f`5+PO14a>jwCWo5OTDYs!tqBPBNzjVB23QR7(F5F^0qHu)0loe z36EX@;ih4KOd}*qLkPxUz+GeJ4&TY)G|8UG0ds&&s=y}BCfU{5z|$Nz$-Wc0u+cY| zOnydh9l-N`mP~F&`bRH(Vtp^M@0&$M%#D0(m3$Q3d=xZ&nAR-A!{_aL&8T{gppgq0 zOWHn|4q*0EYMK+}xdiOA2gucm`{v5(Pn8ZOy1d@Ri48Gw*gLU^z`XbL!Cy=|w0d(Q z7;^&bnHplf(SIe9qobWM>26>@q~@SAh)j%rV}5HaFI6e|iD{jV@#kL-L{m*QTb&NB zkix1jAKXxO*easQT}q-b!DHb86Sl+HFe3k0YNt5W&m033nh~Z}VIcVM1@;}iKJE6$ z*nkV(eUv<|illo=))cz9309DNt^!zm`OXj$^;4xwhR%$JG@$!=iGZ%}J+CHeRvEv$ zWz65|Y3qrUt7jh0T!khTw!CihIz9HZUQ+;76c7L5V%ue|6u-LPvO3ug|9dkNO%5JB zZOU*I+>RM6U9))E)=iuF6S?zTk;|Ysa!E}SiCcX)CR@t1b-i{;2Q-CADyQ3))L{zmeR{oWA;YbC(#pL#1D+*x(U`<>p2na~ zC)DgqX@$@7iudzF^(HN;vu6w%ngHrW(*>3*zy@UC`@|$bx4sjBiivWG8F7Irp=4(G zVzP~L39Nu`8ymln8^0JEii zLERe<$E&H1yrgX$@cuIc+B*c#jQdc8;KtVAP>p*e_A}_VQWEKzm=Dzk4E1IN51wUb z+hX&{mbI|AgILN6wuWZ~6Ix~EdvFj9U+8Fja!56kK&a9tSsTx-Q_0B^_mP0c& zFtHOe1ShO(D#=!QpwbjfnDDZvIV%ZMpDqix9?{0L_`u%{v*vrL8Az=;KLCm(GBJb; zj7(Il1S+0q*G1@=lfm;YjN|u+7t!x0E;Wbe3bAg8;8zd+RwcJ%i2%N$0oMfbYxWYA zo5#$meCC+ZX7(mdH%;#s81caHu0h5BWKU?3D_~dX*7vQu?5DR*HA!PbO^~|JmqMlY zf8!0O>B|qIw0viB1O&_Z1Sj3ynoc*Z=4m-2%6GV~(Hl^NJl!1Lv)a&KMACRR< zt&}NDA21G8C_j$t&${{B)WbmDqcRX|;8ZCV;K1@7_T_V<%oqATbsToo{G&Km)wasa zmrPPStoLAsN*U^3Vmx^b^5kzO3GQG)2B>gsrcQ8phV&|^f@a@;y8e3?2Es*2j8jUf zkY{NcwO;1mdo&9`CTJ&KtX&n|7Q`$Hf-5LwJ9P(fwtdA~j;rnffijYp4%Iv>6c){BS zTwUM$Or`$k(naZ7b3`yj9R^}n{gOWx^DNdYtCs!&+7}zPVOzo z*Dzk=*kvCc9)4|zY;O2`WPQkg_W$>rleNXsnxo;B7joz8s#$#cd`m8L1^m?UeD##< z0YyQ9uf^zt-n0Gd&f_MTFD2z_!_%ohv535J?BD-p0my`|YHi44YYP9}w!b8mH_Y*} zuQ&S;jwGiaIXAagF2-E!Jd*V}S5}YKGHM_3vcnmDJE&yQLmaP6VqrFpW?i+;!Xh2J zt!H=GkL=c9Ble39DEBZ1 z{{HLJiPT%RlOyArBjc6D!8ew+yvHMug$!Y?f4_&m)tSEGt=j^jy$7c#eCpsxi8VnP zB)I)F7RxXX3 zEH=9uAYD*&yhsX6DDSBmF!V}HH_XYME>b(x;BrXpxB3JERs!xrk~Qh`v~F^j_VTrE zIN+q?C#^pS{(XF5P_{mT@Wh1)XMMddIa~cELRV0AOO@)WmTmuNjj2ap3JLFC5yv&l)#wVrjR?HZrG4>wlyyJw@d$%PUY9Y-o zFnKHfMC3Y})M?8~^KaT##EBfr-6;TE6q>tme--&hItyL2Nnpy)^K88LPkATV4usXc zCevM{Va-cL2a)0?-Mrk<-$klt(WLxiz5DjzLKmyr(&wE`5vuQQ$sQ9cH21b?6nMPq`9t z8}dIN(!I#zy3Cm&d0G_os1JbOTrtPvu8v5XZ!za-|7kE0tBDF>({zL{Za~rLOVtim z?117u&Qb!WKd^Z@;+7Vs^fv>ClJqe&b~82hZt!wO5bYtj4h4ECsctHrl#)m)re`C% zIl`kYnO_fWcxgHcr!D?l7gwi#W8FeS(;lumA;Vf^k;q*U!PgY;R-Xu(k8JTR20`#YNM5eK`IZhpE%z^gUiukmcBPsVstKPf8pze+C_vR|2${SSV>68)_@i`Af)?w;;~tyr07XGVUF70&oFBBNiaDj^M(lpRo@R~ZVLp#Di<_90SwDcQes!&6)yCaqibJpz4= zErCS#+!&58D)m*0XWJxVTP-%vNa@!bZ32vbSYQMD2aS|BABZrjSn0)})^D3K?H#~j zq!Lp^dBhSG3#$Hw+j`PZ4%*qPyix{iHW*^yp&qrhbvlS`JC-}secC<+9z;pMoO>X z-};D*irN!=-}NM6;7R7P)jF%;BGxsG=l26NnA5)c2D;8ME51A2SMSC)Svc+Ou{F=TUJb?HqDrs{Y zo)@u!082zt&~%gfu_X-DegF7|m2n`I^`Ac7zqgQ*_YLfUk*F?ak1f=XXK}uKtVpaQ z6cKQ8X}h~aXSa&Ko{V2S+HQ%n?(QTuCZv1vaPRWs@3trJ603V?cf)OVTe8wKo1ex_ z`Th5<#23jpqw;KpMRi73P3U|VwdxNyZdYux?`QuDjmLXeq;!ATpl%j+U?0!|5 z^#*;*f2GIc{U9Yw^V+GVbj$gy^Coo5CQQrL4D;q2cAQT2U5xf=KtH0`xwz0({}}n5 zbkebYPy8F=5&`0RBC-nOeEzQe_<8-_{o)n1?85{V<$GJ%CQ7|@vPl|7w`i@(zQ1!h zbS6$8)M)r${sIjMP!~y}f2txlH8Xe&o53}yoNB#9Qe(-Fh!~FG4_q+fB6HQHIR`xF z+&FfpcoC-`Jiw!7FLC*QzO0R5Qxd|hI+*fTJ`Jcs;}}hj-|q!@bcYGc*3qXN5D(p> z>rF>R2C2QG-$%sAY|H9<4ipO=Yh>uCWTt#g&pZ<5oOkz>JKv7_3#n^2Te))?p~~cp z+&x~t969mSx~(zbGu|iY&WuhIq_OKlDYoolBIa~cBnaj-?{86T`gWR9FSlE|?5qh` z`AO+LO*BI)oB1P-Uw3nL_^fc0h=QwkPCRW!TT0y#;}ufH%z40vnU$`i{9Zd5!jqck zxf)z%AC>v3Cf)jLG!*i*v(x3yqgvf3=s|A(J{73FU>QTYrK3l!fiQ;@+zb3$uK*j{_k=^xgVf^zkuaB!;a<)pXS4!!sQpNKMEH% zoYn8Z-X_mtZNQ?WHh~$zgV7*VwLP}089D!yH_5F zm$h)+g~?g!H^XD;Ef_NE`BqRN;NXk8msyWw1Q#J3#L+=Y;v5gZ^h~dr&H5P$b8>w2 znP(M!A%&C_qtT`B5+v}hoE1&WFCMzEj{HV<082=SnU(7Adp~*X7p{$CZNuW?eSrjh z!{6;eUq!_iX4wh%OBx5I&ZJf!eg(v_%2R>O`RW($4+V)?r;!mCr|}ub-nRy?cf-8C z=A7x#fv#0mzmN;o9xv|w-ke^4Hl$@3kZ$Y%ew(z+8#6QC%@z6@mb;(#J|YpDI;~!{ zYDGRLsYUfv`^^sP_dI~WMxHg=+?`>5(-KIg!xnqnwet>Nv=7Rxhv>5Dyt=q$+I~2) z3twn+xwAW3>v_rht^8vq`x#%Mbh|n9bd3B}WPQEuYk^OB%Z9)A!&S^uuIN1<@aBxn zzAr0D%$Fp5YqW2TJT_TvuLo<`8_-BdNPrBK=<~-KnjR>^EhiV|f9DSWGk|Cx#q4pK zh2wSe8hk)o+jWL%it^T_Ia=7W@&0Q12OU49AUg6BxD;VC9{M#TrbKP3*@Z3! zE_oD-A%`%`nMzWJzZ|cjCEMQ}%WT9YImo}ORNz}<$kF#TTIct$SGIvUfE+$)~^4f{Phj;p(f;!>aA&zpbxk`Na}-Rk{> z#=IOGjtBN~l%*C#2_ek_b6#e@k0StG-`O{dNM=NG_Yhb79GG+5a;SRWu^IV8d2A8M z0$ae%ui<%fedglN4B8K@5iAiQtRHn3oonVxhPcx3;(icXxNExCQrO#oZl>!++j8_n-THcV7Lv{ZYsy6Et3p)HuosBLqeQBh=P=vGSi#)5^{6 zk)wXU@s4Tv0j)E^RBF|E%&*QaBV0e_|1=Q$<7^~4et*pp-94$X5F6kTg5`H$J~bEY z@?%$k14gYOOP{jx|{x-xpt?N?07;3LDsC>zlMHeE+v~XA>$vX}_bY0#XP1{v;dt5d z<7vT1Yf}HX)NJCeHxWvnO5}~r14!RO4YCPPtFyp}eckE_szUc6Zmp|bTnOoIX4&T6 zCG_!=uvmg1BBrb&+V(AUkf(ZDmjxo4gC?4q?3SB|YR+hxzO!wdxqlJseH_Bz#W6zN&fgU7ONz zd>*XP>wY_{<~8Rqqp#6*^&Zdg0W1-J2{Ai)X$UN}Ar=Gq;u!Vg4|t+o`2_$M@tGGV z0UJB%YUNN!jlJCr;}dUkY|^J3Oxz3rRU-ltjlr{+m^EBd1h`dQP3_eT{5r?tp$??F zRA*;=q#m#(6$D@<)-efFK9hDkDy@<(4EWXp^?i5-$Bw%D;OR2<`}*X7FB(jSC=bpi zWLp9M2Rtv1NxD3CuK6&6^qw+A1DW05Mp0FnI!KMglm^NGKAE)&u^vDJW*D{DR~i3s zf=5kwqv0Bf#uK5BBJB3n5CZiL^%MKM_8-2yplns~7?~u`w@c&BhpXB#;Zt|Cwk%k* z_K7Gx_5y59fm584iTYB^20lCOmN|9~uESbAuy@vAlqpStc2)h?VzCw!S2OpFkNsqA z82yR@S>SFD(!#|8zi zqi6CPnNR+rUz{%V@f_!7`}$p1k%kk*We}wtYB^w;;l6BDwNDS8eRDIIy0c||*- zp>1o+3Pq1Zxwd>UvsUXW-Bh(&M<9MAb;Tz7v`dNw6i=qc)nvFp>F(9HYPhx4-?u73 z5mtEn-TY_d-a*8*OK@8#y{lqk4oZDpM}Iy{Da$4VjbcN$x|U7FQ1TH1R2rh1nq+jt z7o%fmqf?kTP+BxwIHM8QnvV!da0m!(p)_6>Q@B=BxTk5XiuX ziB&v>RYZxd$77*^W5tXG@alMTIuGyR2g9E`Fq8z4!w&-q0{`$ops}rv>Z{zr1 z-GjQ<(Rr?sT^5mDuI*(^%bLH}1~zQy*6rxl%{Co)uQY0BH8rdw>bRD5<1Lt$9d;c# zlkEb8Uzds6ZJ8)w;vb+2uoWr(1LfA{qA)LEu#(OXT(=}i)D#2Ia z!vT3qC!Scm&1gZEc0YbO=%Z%CfAxOT?zr&8Pl1ZLqeR-Q0W>}P3YrX^>k z9k#O-J@`r+al&3DR%tw0CBV-Vs&U!lD6L3xy3a%@@!6lHvw0}${w_Yvmm{1u!USz4 z>V3#d;5q7060l7cl`T?Zvp!Ada#J!0n$zA&)Z%kE2GD?VniMC99S+Q_>$6`a#F=V= zj5(zXO_0$n4?0`>jz&+V|ChRf<*2g4YGL`K8E2*K>JmS+4{}N68YNCyKb7_fse%v5 zT^XD@STaAEtXs!KrQ5JF-u(`#{gVKVdIU6m0t#7-I`wDzUQu|eWeP=LkIo@VJvv+s zRD>uuENOEY>vpeD^qZuvn6PYERgn6FnS12?+LU*D_MLmU<{At@Q=q|f#373_NHK)V z!Y#rUCI9<(4+2i3-7koTva?R0>vus(Ix@wZtbWtDdnVZvh)OMh(lNb&Qb@d zFU!CxeHr=LIKlG!$Ij{u)bJfI$qSi-B14ifFl@P~XwT6pZex$|d8UmWx%0Qr<;?1X z;1;!{&NK4ck>_hRjxThHKW2`rl1X%@-lfVAsY{O1Z_yt?tea0f4V&9HY6Pq~8eXjT z&QQ)MZ+;sTPM7aF4YU;1>Dl^7tgW8RFfxxnjHis;D{E%aZPZrrilqCqmt_Np1|c;A zYr8BW_Sgae9zKs(K(Di)z~6FlzQUhn^yrpY5OI3s?bUxYi0ao&9tRyQ&1UAGbRFX> zA+PQ35AnA~?eMnR)gQ3J_5byaJty!dLHpY5$#0b8^l5+CvUPwrK6t(NLqV+8VDPKZ zc|LT_nL+%7C-z{$u>k=?wWQ&^W4@hMUi72;-Jd@~;)=m!J&gY#ggq@EKlT>EDJLeu z`E%1?o(qseJF%0XpG%Sbv_wM)(gZ*OI9`6saN|zG9`97y$Dv5~l#%%kAJzY0`TYzd z2H^{WgxW8Z=WM@H?Hs{#G2CQL+v8&vU3ppK?c-z5GnBAY$ukym>vgYKn4I4p z_76IS=s-d{-~;QJJW?BAVs>4-covr^Gsgx0xOP^h&Hpy+bH6DEK$R}`q|y5^6PVw; zxDOkuzapPe;91}KN>O~yZ83fKuU!t$F4oXx6tRf=Z71DS)1+Ri}T!tvb~;8 zm){(1Sw;R)1}(?ygsI?BptFp>X$xr^0@SeH8Vo+xni!VM^59CH*^}KeEkNHyJ;FO6XA;qD zf?K>EJIna2?(mOB=ayQBKE6C@gd5o@X@1zc$wlAI(I(h)1vhJ@8YRB_xL9Wt&y4|8 zki3v9SCw3{dMfv*9`9lV%oWHrFH2GfX_2-A!-A`J|Ii)H*JJTLn?wR4yZt}d2s}Y> zwJcnSD^9uM#4nB~)e-iWV%HPZ2Fr+C&yXi}3U;Pg{zNdNUA6@d-lz2WE*`{$+Wt7HF<|MxYj>Xk*ohN5!@cs=>YSW=~{A!eMdp zhL!+{qo(1fGQ&`AGVhVYe!&fZke$UbWHyR@#_7vZl^cPO*~SMI1o)Zp|NGx&EDfh4;G@-woDHL2pRXu4<2 z+9alTDrR;)x3(Z81XUE|Zw|Tb-}DSYART7ao;--}`Vr!vk^O z0FKCIjcz(6Vht`I`#a1n&V(mYz%}@nOB9(bI^9qhK5!FuPVwmF5V1x3)fFzpl1APH&^k2tyOq-`>B!VVbgPdgaL8 zs>I~aS@K~}8;6%2g^+J`pX;32-5ImAPd2Sv)++ z>Nc2a4TQ*I@!~^+>YGgCPAIjZop4B?e{=j0w*-WKP0sV>;KSG+wODyTeMwaw)9+30wDIDa)UZOztXnec1y+w*wD~-FD+s z;JpC|c@%0V1fU(HEeEA72RhQCS3yU0&S^;D%eLE`7-sj7!Ba4JN>+BMh2~!;_Y5f& zO-D*AJ)^Lt%4zl*(nV)RYEH81XcTKf#Ag!-RDMMwi4MHEWDH!erussiWBX7knZf{= zIBlttyZ zT0-s{EOqWtcTc=qP}@(Zy!`;QL=2;nJwNnunTC{;h3bhz;i8}dVvJm!2nK`kp+Z%j z&G8-4S3)lu%5kg26(i6;8vi0d6&za2N>4O-k#~6(tlpRoQZRiJHdYH`jOvI zLU}QFY|rIyCd>0kCcdROAJNz!vYJqDY-+~UP`Y)7nxSx^=tyW1{?veBI&|Q%Ej~cd*|?hS zzV_2TdiV``BzXshydji+ef27=(KiV(Ku{%CT}r2-naavE9+)Xl7YlY{{&f%jzgmF3 zJ>*ZkGz_D-xO?|FMB01AY}iCZ+oajsKWckcT2yO2y4cpn0xRV*b9U$_Z?P1>ZO28Twz&G;aW`M zT6jgc2o64X3_c4E@~>|bWwuWlpwcI2=QB;GIyZCksjZR4Z@em#cGE5lZVtz48MgTpEuP#*xkqJBd4_k?Qm zn(GG_S~b}{kUTR8su@*F?ixct8#q@#50%a?TUt1(`+IG8!(r255!ap@s17>UiW&b_ zvaZ{SPU8^`ZUFQ}bP|nNGWCy&U)_4>O@mNA4!kh!$rcPN)r>wvdf6O$b>{i$LTdf^ zHFAU%Te+2T%^L#R6VQB>@!W=6tjNR?t4r~YcBKLAo(VkagG3dkF$=Z1<$9Xyd!F_L ziZF5zyeiYEMQASgRb67Bbx{(}sWygR6PzjkL#sjhlMs(~zw|oCf|LDU*}3(r730h(+=>>6W zZ$(M5Ss!Qi{H9^1lfl4Lq;RnN8-+o|yvCX8IZBnzhDZ|?fRylc6cr%=go;UKkopZr zov8?mi^ujnyO(N?uF&N#OxzUq?W!OiIo z>25SQFE=o^i}zo#(40eKGZEe*aBrKTYk>Zugu< ze?9;Jh`l}3obN*(`n`l}?b$$3Out^fBHgytL^^J3dcYP*4Q@PUS?w6WMtt#jO3OZA z;p#!R?%vU+djj-Jo0mQ4-1x&bf_{H-F?Sl4VRHI6M=*Q5yC%rta9&NY@nc$CP5xw8 z=)iuLHqwIH%5Tm5={{x?9HP23&HCf$c{>s}(D_F^A&Q~g*W4MXUs$UUkr6OB<~csz zHx!)}&f&?o2mZ>l>nA1nuSv}!Fyy0qa%yTQFvnqY6)`+A1|fg=ZgEOKE%UZ+dHUs` z@S9l54ynJ$I2K!v-@_K~HCG^M+A?ZYtEV&4XTSi$$=S8mp67-o^Kf?aLcnycz;jJRj|P;egazP1vTkV&Mu_O@88Md77EdWyaq~F_xulOLVANG z03&eo@jaZ`K4jw`_gIc4Gn;hz9!zE}h z3k&kf>SvRGij8hp+O0i2W-iW)T^K&|HmA7L5<8pw07v)y4yeB7k@U$}yzozTz$|A3 zy-h;f35#YBM{Yfy*eYJTA8ETi>2t3zNCBsUI&eOIQhF6{XF<<<4!2Qy06c$3y?9%s zd0(h~2lb#em!eKtFi-!@E#i-Wmy4UDOA%L-x_rgYd_Xf){-n+bV1{S1nR@Lc^%D7N zt-?Qj-riMF+RRG7$pM}sGs@R|TmZX5O`%4oM0-Tt;kM8?<-g@iul%SkUUO)w{ZCD* z=C}xW!-apvZ%Hl;e!?57i*f>cXeiRX+EnLl3!Kfj*jL}p8MP~Qn@{Jn_KbK2{Jahn zW0V~v#+Q-*O$>Gi?B0A_6S{04m}m6&k-QWn0hQ+(f(WaRQh3n8|HF=g==L?uws3>H zk|1kgVrvOzHp)v-x@IWMXPnA`5{Xt$0CD!1nvHb}y;u@8?K5r9TT`k@_%!>hcy1s0 zm)UKjs2HlB*eF<1QE;?sFu@^C?A`OIND!E5y!szvHdNf^G|tEz4P?0!Xrt_#5Vlp@ z0o*qBOsHNwJOn zvOH)|s7CX26YMM?+X;aVA1-&xViBZnm7QPaM zOEYR84cG)qS{-pN?Y`~{SCz@wp3a#2c~|Nbq=@2EF$C&be=0+zC{oUycC~)`C95&~ zrI8`en3fyQauT{f(`r>=ocv@VUiRe2H60!_%6>P@^wMn420X*ebq1(@&IpenI|l8v)rW|N+fVCy7k#KlX%s@|ZPs?)+Pr64iWo-97k4F~b+@g_ zdPo-a#21BgrwC}=m5J_G2j{uyK51n!%97kPBhN43#dz(f*g;3r%kyckiSc-Y(|7|i zaz=-*SPRarVCxPLS`9sTBT@VB0E_k48)%r75yy2s7ayymGvXo-_vCfCoelXN?oI>m z=e79##_f>CZFs)e4OChDmd_XrZD8wF2=Uh$;N1)+-<93K>}JR++p=}=~iqfYI&5MJ7WP)^F2W-KvE*&dXXglf?w>fL=LWaY@ac@EL$OJxCTDxB= zDAu7vm=K8ze9Zx`nw8eTN}MU6elmJKet%x*eq(~3uETa_)E?-*uIV;uvpG5bVf7|p zN$&#&`nB3vk5W8<3*3tDUx@p)zWc z27U`Ki?gGdxU{&Tw4ox%)fGq8a+5GH0z45N9=N!4SeaU?sEI!_b2L+jUw5T<70wR; z2TZfM9bjQ_U}F5M3HM`VKMouSy2s?P94a{luXWPCbsB{cnh&Pb0h~r1^=&GKw;hsD z@-`%z?Nhf@jEMOCfhPQSbIZn7%3Hn%MB%$JNU{q9G_k=hBw3tcNB$^QL$7%l>^H0! zWY)_V(Gm2W*p!OMl8VH#@(TC+gj$eAl7A#&L2ey}zArtqa4JbbYaP0tgTfJDh(B;&I~B16e8gbYgq(nxriL9!hV_N6fQff@nWzDiV0o7&vO zM{O_Tkg^iS{)BWOHs@dF)Cs$KQyNB4y}`J0MpAyeBD@fYOLro5vy>S^Kdvk z+%sMK-Q8w@^Duqp-xqySdg1r&<+%Fj06{TR5-M2|;mgy&S0jXtlSvV(Ng=Y)FLd;i zm{>&Te7>Skc?pm4eK2aq*_)T-@|-l|LVuEcY8iXLdnC!b2XZLa)IDHg3?c!tQ6V~G z$)N$bwr%lEh`@Jr*L{*tKV47(@ksDjVw7@U#Io@*Y@A&bHO-=2GM#h})ifU{MnNw1 zcwP~tEwQv01f zH2qy8YLzM~C+aEz+(AVtf+T5XDF-Q70o)ga3e7M(gHrrS9roVmJj5ObA|4spITlPx z?8#6zpiRg58{QN7b@oJi9+G8{V7digyak<WXc#Z|V0(S}xp{D`3qe_|$ z3~gV0V9%ap2fK_XYHk1}%(!evw~V}mFRAM=^s>6NGI^a?HcFhpojLNi5$S6OnRk4- zS|L$j$FTf@D%|%&n(si4$7U1YqAZxVv)OaP#E`=2K`Y!ehSq|9lyT01># zWNo?Sv~0w325tPZ&9|JCnu+$A+8eI30 z-yb-B$&yRv*E=8+V3tevNtxM&lWRnlEsZL-ZR(jEG^|&%w8hSbBSB+fO2|^HM>uwA zB>To+34J2D`^xf>&_o%1;>lOIPl4;gmigJ_fLQ2UJ#a_&#^XEx;!osokkWmdC4`dSbWv9ZM|^LE#>lue*6c#vs8;j@e~;6# zbKkGX>MPJ2`t0iuVQl66aeL&*Jm!zMYHN63b~Jf&evt!m zQE|v7-A;11e)+uTt>U?j^@buqdhJoWOo)bVZf<_uRhU?Jqo8~=CguX{eEGF!ZV}9Bmm$M!vtj(V$)ZqC=q__7Ly& z9B?13HMaX4d2l4R)+KiWhP(?x*d{!Ng;&LeK*fKso|cUkZ0A-Sq!t{cAPy4H^lOrw zGG83kZF12DM;XKY)Ul}w(5}hnF4Z_rq<53o z?~GTg`TA!>ouP;xd-hL+v3FCZUWpm6&5>LAA9=lFFv;H(^`{hd0!`i>5Nktzit&s@ z`*M~#dEVmf?6J3cc}|MgJ0Ch$yPTS&`Z=J(Skn*zE^Lb`#kHL5hWn)vRmeT zU^}L`UF3msY0kf#xk+4#WT`*ceMhLktYI+)vFhWbqx^p=u}#tn*s)d0zu|gwl?WNM zZ0Oe47&Nl^0~1gpURAA&%A4*meT);vv%A#L#QjK^Fy&DnOsVK3@JwlPfgc_|Eqmiq z7;JeFEm_{RK{0!Ly;pDD#x8`3s!i8_FBMx#TK!h{Ct-s)6HVzP)8Q##zy7pIIOiSi zpE>Pis)*e|jVL4rbr=%$4K2Vmp)it+=#5IA43fzw>Y}M%1V^iAEPgTgEacgpGQIPs z?nB7VS2KyPnU=qL_MOHh{t8kB8F@PsqA4}}gadO;`P`x05X=_zmOSkn5uaxZC_Hn^ ztZ3<+B=s(g^;f0Px!Tpf?)1vwhLRW&c)MEXzUC7i&u;E8!m8B#&Ngy(Gs6F5=qB85 z@#DJg>;xrxXm4_e6jortd(!SoK!V+Br!u>-AwW~tW$3c7Na;NL`Ydcf+ zuQ6;sIU_7Xb}kKCA!*Nw#m0eoGBp=7M}@BfW$R0}Tw_3z(K-#UfEIjv{szNbs!x+{ z&E#xJ%W#x7KS=8us4;P!S((tft#7I)k=W#t5_w%k$jD&VC z=9a(Hty%vAKQZy-7&PM)`uA7{li;-)Bual-#xBY-D6)H`Ac#(n^)kzcCcRa16 z{4t?$vF0y~&GC=hDT=GR3Br%rAEWZnH$oszsfLCUKb7t35E073#j3dTrCl1r+;vvkyIUgeL_T>S4pG4Tu~#D{_Assdg8X zz8RH5h~bp1;U+TsR)`!>LO0U27a;ULJq+z*!Y-j2?imw~X4s3I$hQ2e(pW6ZiQ2QN z+Os{|3-uAU%Ti6&gLh=;JG>WA-lvmj{+v$c0Lt)EI_=X}cJ>2k0W12YVVKn=G~=E2 zj*zw0-$qj0Ur;J$uNh~N89cCbO0H~|RCB0KC&NTnb$6e%woWMep-~K)y!*@NPbhV& zK9)?^4ZCfXQcx^PRqMBS-#wYUnDxKE4Tk*pTs}`oq2m|^G$_d$hQB(X=CV6QJz_HG zbay`CI=-9D7i(4UR7I@b3i3AFd?rSbxz(k*j#aBm^6#_LkmQpcHU?fjhvvmqYBeIK z#>efh`Tdn}@<&%2BeEhO#ezS?qtcX?Is?Odql(r&q((g)-nJfgZju!A)JwTC@$d-I z085yWMfeMgFfHI=V4x8aU=czCETLEIN9<}xj?$Krd1ML^gc8%b+KP(Wimo76P2j-Y zPEp&=PTS5<+s@bBce{%lX&LFNr(%%W;<2sn5FGWA0)M;N}So2*D%j3g}b!&wYDL`Ru4z4;+DY= zTY$+$reKAQW=AGq%o|iQW=H-kk%)&}X+Z^52A@jcWd4alP5~+bKS>PfbL^Y`toID2 zy!91zsr={ey?bz8T@Hf+c&B6_nL_)N&U_-Y^aT|kHmp(fafklZItfWePxB|uYH&9l zBI>tV$*^uoq*UmBJ$y=XHfe*r{u%P3TTfx3tCuYyfvX+p_GJ(ce-%#2JaTR-{&z9) zBIvmjw!n284*p6Ud0J3|{;7848mLK6Ok_W(L#_dibD0U?2iOzF90*;-K}Eom6JL)I z2*x~Z4n*wI7P59ORx;JHp2)hBkFTo zm$SDk+w!BlNOm>hea(9^v8}fL^H|%dm@bHm?faT8!0=jSX9$^OcJ@qMUH;qZc+Cb* ziWMVhTCnlQxc5iaUj{@4zqoFWAU7OD+)pL?vfT{%zVv;*K9(6MAyqQkN6!-a`c6mu zrEk_b;cjpRbW8Q<92ld%IB&jLp~n0;|z-z zv`K4jSr!t1<~^LaT6xf2!0I*RY0+?W$TJrjxvDEyAD3dbOHJrC0vw*vO{gcEZQ4sU z4fbs0AK0I>`VVQ=PZ*|K1oVso#_TFcJ#%rry>40#UjOJDB`V&vOnP;}y7#&k(?4Tk#uC5LBCj=ZnCLMZIdV+9RTQ$&FVw zfGyi^m&U#^o?kzUN4?>Dsl)wcR%Y5HMa(JQ%nxg^=OeoxgOz#C3$8zKd<3n1c>va+ zKCJj`tsy#_zQO_q6HNFMHDhpKj%F)LkIO1$QrvB7i7ElqTiRv5I?Zj3Md6?*=3C(0T$&%F|_lub`9K?Rrp~n%5!A$-KVZ*RD$S?SAn{;HvJ1fCQQDwFrS2M;v?d;0 z+E8<&r-Ja)%mtcClR+w0DV)jzusu{_M9yPKhJ=5R&y%Ibv87tmFKg_U`MV*J2KgXw znj$_;jq5rJXXKJ6N*|&gCb0LFOd^{z9AFp{k#g?b+=jn`WAld+G2+yjV#U6JbaF%s zvF>ereCE~Die*Yp8gB1f=eIv6ebuDK({KYb2*^BTNB_g)t;Ws4{~CWJ%hYAF8%CRGBbi<70i-85Kg7aU1iGZ|MA7 z!a06KteowAzc|D0;hU8Im%#uaEcM;J{(hw-$5te$rw-i&+2Mpi+N@!_+R+g!9qE4- z=77^cn)dFd)$La;(=ckWlu#31~4dCM?*%LJ}sB6s>q~J`%m8p02)qT>{n2N2{L_n0i0w8I< z1O(!*w1d%4om0YOAJigFqd2`d zF#Y;@n$H=P9(yyiFD)K~4~H@yZl?F4*8KCBaUGj{5E2eng*pxUSnXsXkaZKa)%>}@@6Rq?i=quv0%nS^%klr!0?<6Cu9v1y->E3x zTGKqaV!}RML7#nK;wU~MOp8@HMBobPb@qF2t^OgtQZkSJ&Gq$@J3k9Cf~z7=b&4$* zR$wO=C(qoRV0pOI!q>2R=I*4HoSBEKnz-=`s>0ZJl6!*uAweiXdk~K|FT$t6!?mEI zHw0(Pj6}oB8F2(L0Xs}oiJ+yMnoko*PUfOfpG7wDP*NeHlKWR)hQ=vl4O`cCp1v$C zj^_RC&F5>L`_}>~omur)Dh^EtS_=WIk#m`b>jMn77Rd_@@+a{Mwi>y|dV_bT+cfS+ zYZeX$^|_oy`HXwMR@Xzsr#JSe5!$jvyIl371RAZ(WgYGG9m!b!-#KdH2FuKo=h+ob zbS*#HDQh6Vv*-?e@X+v_pznZS2JCAZW3Co;um^9rbmVjEd8Q27nq8$Y(G_weEjk4l z{OIVQDQb)`@(ndoA7rUe-e0KmaZIl97kQD}eG5Yz0DrEp8-9&*+Lsv4LZurL zmYiPd3Jdd#ixZ9Nlo}6@T0??6Tv8UDK-^dgbv$3a2YK3g@`(@hp$CPMBF2P8Mn%O$ zg`qf^Z`FP2SA(*YH1w48mHcm(O48@gS8;Jy?G!ui!K7hJ_$UKQ$`n-`|0do$FMhng zBK&xVJUez=^=@1UyexFr`Pb75F&tCzGr$s=$I6H2({9MENaUIqDk7Hy(F+GuNN^f3 z>e8cB32JH_BkcT%sYLRwXla?)aOZW39MrJm7HarvJ{2?h{)Dl+@Q#CH656+7$FjsY5$ICi*HD=VT^39cHhCmw8#R$)1$6#UkX#`$LmLLNvpFI$$`%Ci1!!kNdom(@Vj<@)rij%*DrY8V))y`M z1h~p@h2i5W|fG2khSxuhC*BO(55(lX%(moCxY>c5=@F<71u7)8JPEiPf z;)Qr#m_vMqEpSxR{fGdw(-ywj;vsu%9)2Gf3CT6;b0C(P&sJNQ3?&Z|M$ zd~;DKI;?<$hucmabx^u$_Eutf{wR1v`c7IEd# z|0g8kx|dfwk(CkppMt(R6)dw}Tz+BLaIt2hxGZ%5esLH$W7oI z@iBIA;1Nsm;?pyBh(^%s6{P#)(kX};tgv61Vr8E@AUB+~3#GNsGUc8`UZAVj9GTGm zYZUG(k**el+>$L%&?hUQQ>@S+`Jh#yej$QmL4jj&tbVc8i?KsPp|61ucT{k(wVH6X zE%Ko9U=EDU)VZ0O>?3R7ud0(A=8R^V+5h`m!h6z`_#!s?hbp7&^yM~prYA8i^bRrC zCECslrS~Mckyn0nLf93#AqJIc#|I%1G1jm}l%2X!$^J))has8T(f&_dNHYmCsHIN5 zpA{@IoXl4P1sw9DGoX6#H3P()mgoc{P-37cw7n231izK?SwI=0+F7Z-NLG;n2K)uK z&$WZ8WoC*S#VURh8C^=S4wWIDs$sGo` z6btP^3OeI{w!r_m`39$=a1EwNe<5Ql>L`^-({0TP{Nh<)#lo9atE=`(doHdBY+4h#$Eikp-Vx z0kj-Zg`UsATyF*197$H3wM?*Ert<-5GU>uwRoSeyy2?H_s?fuHQ)EtoYvbb=uYOdX=|HMx-A`FJW z)zlBI>>pyw3eAc%KTu;SQSM)TJSg8ykAUGJpM~RhF!fh|vf= z(i3JV#6(D%yi?%!udZv^dGH1Clle{mcChJ8$8QgZ!=u&dghz7KXy$S$&cK)~KlJjN z_dOSLpa*?-cW2^vH=lz^U|?YI4BV>(3A00PqnVZKMQ(XtE=Isro%Bw$`Qpq5Mc2-BdVpUNrL;uzb#?64Rz-9YsaEf@I(uC?jXkjM+g} zJO!BWx6w@AK0KY2kzOL9^I2owv12d}OoYhO>_10Rjh3UH^-zC8RK>np^4y4_ortkK zi;=W{iE$H&Sxy`KHf81xsynx8xX3YgN3^ceDP`_1;MpkRzMmzK!2=ik(YI8;11>UK znR42n++rT^bcXbiQo$c@H+68lc18Z87(1bKD!8EW$+R>?&3lfo(^{|$+Sgp}BV`yN zVcvY1byMka$dMZ*5I)q*abyeJ^l$^!IVv=xY_O~JM=Et1(xt6G9v4b;S6Sb7Z&J&T ze(H5Qf2$BQos}O*%tHBT-Z`);(Zc)DBJY{qw+UB!)CNVa8MX7RPnSZ{gBg+OrLXA> zeT8`GyyySDtlbM}K~-%NEHz&JfsU=WbP?=_7@VTB6bxjgKsr!vtjstp7hcFFL&B65 z4RRP`&GHU+Tc>mj?sqRYmdzF#L1FNs%wgAUkDXUot6TzWF5QY|v==G~daoNa=KkFl zqS9PmrJQW?tv9oA&EQV&8r#P|md3ROrYtR!doyi90#1QmO%78Zutv*VeVSO%6A9%J z9&mHNw&GfVv`Kf>Fb-2Or`dDh))qH|lkVsOFv)Fy`6^sJ?H*ihP;j_`AkiWth0is--Rikl3usCpZiau zWq3=neUA>iezo{I{Pvmgy@;>6iD-C!y4_(dCRtBC?b=`3h1j82>wjU@TM_nXHc9XL z0S8Q@U-`l+@SBDIceSXU0MXh!c`#A64KcnhEBOE-g0uo+1x*b ziK%M#jnG`6>_1EUx6S?sB7~Vir&S{Wkj4cX;Q`%fqwku=ox|t4D{6L)48CgknscXx=CMLRn-tdW8%P&wKUY zGrO(M-O+!4R0Q-6F6uro+c|t^DB0t?cVK9t4))=Ni=Lp*ly>K58f3EnnhX@{>Cq_q zF(?KJUP>dY5KUu=^xQ|jZHPMG#1Nc^MzBW$<2enAK|I{V$V;(>u>?m6OIxKt+btS7 zp#pP_&}5a$77x{TLiLAkKUU^1W*aIVgVK_x=o@X02a|qVTVFo|#WkEOQz>TTQVSn363Y6}XuAIZT^$L^u}bt}l9$#-M&@)a$J%B`0RFT>nQgiZd z4hr_|p+BVWOm|tO357yOYCdGC7-4mEAHZkI8x3DRK08Q5qX4m<0ZM$o2g@=YNb~H!d2#y}Y4>iiz z2T#8VgU3}Owl$y$zDz~&Peqj#Y6NMZSr`9z^+;>dQJF??f(VF=EV+@g(xLwv`WHsxSPyVN3A2C{xo z%j9EYKdZ%ri3g@ZUq|%}BHrWGnq_RWe_i~>F8*Xp?pN~@N8&U>r3f)Ls51U@SZZYu zonpS(#`V270&~d<( zM$xg?`4S908O&vl)3D~yw9KU3ZV$4Vbzsk68wYVLJFS+^;kyZN7Pn+5p+y380sgH( z7N{?G5&vT<{!o_oN#Q)G7wjHs>Ft6MPX}(rA0qxr*`V^*9xY?gfqR8nRk?k_x@D!3 zCj;BzTZ=w3fE74}%Q9*|qRZP{2)6oO<^9~yP=6|9dmm}z?0hU43?>an7Qw*wqhg*+ z!98F^M!|wR*oAv^2?~&lL@o@5i+}mvX*CsgGbJB+y(b!o9f2|#elrz;JQ*H|EIAn5 zDFtU%_z70H617M@8GBS7#gZB>LyL}?B@qid3}q@Dc@m>1Ex$5#v%hdK_-9-%aik@+ z)F&-Hn9Q`w!rJabO08acqmeXv|2K+@TLN0!Dk}S`+g)$HeQ7TqCv(I{kGspL}cn-Rf*n>pf4sXab1 z@;&LmA#txVB_PzUfNM@Gxyd-WP2bxkD`9VYw^jZ-PelD9GUuYgPg>Y|B`5Ey?eXKs znB*VM-dhQR?UzBnBseeQn4>aE=@q7vsqjY8PsY%d5`povvgVBY8VSnSFT8goBM&|hF_94G`u6uKXx4n7aQjEiH?8p;Y5(x*$zfNU$f^W>H7jxHEwar^W)Y5|TAb&YcA3%S z@;pJa#ZkvXVm6V$uebGL3x{-~>WrK!t)J%{YX$jksOLKDK*f0kyU`BKc56{8qxta6 zeS(R0hhYK(UU6ia@i34=i_y4;!;ro5z<~RGLhLz0vfet05w}S6$6&Fv*id@<>#{<1 z#<$8iw{mq>>g6dPtCAj!LT@2P&7mQylpgj-!zDVs#!)r8Tk=Nhek$F*;R(#OhM#~S z?=(WP#qd_>2HIek=?F4g3H%Av~`Lt=QULn7v5lDHcg$iDfQMo$Y%H z(nM&JNJKsVX`M0;9fV(+6e&*1xY$9&O;69wN6(G#S{c5_@OQLkWggPRXmFL#S>|?8 zdQ|G4-9bO(VLUydf1Zf31ecGAO0}!gW0ji}7^J%^GZ6e51-*Vle~+m5eGV5cNs(4j z`YlDL5(%Tc=g_=Zma?|gkgoXL=rA0p$;Nx{?0Pb`S7&Y_!@+s)Y`P1y*Gh4nUU=yz zx~S;A9?X#4cs?`KK1IvQ$}TN0qunIY($X^ez4u;CJ{^GGeEq!U5@)?7b7xkb@LW!J zym7y|p%T{8%dDnkN%ii0o^%yaU7!!sFMY-zc74=7LUK}kN?Ff{#-2c2h482F52_3n9`s8+^(bDwy>#+aBt#SDDdVKUI9{b{U4V^N2{lrN3 zFBbpi&Yf`*ZtIf>7oBN2#hGvKK;S*m&--m@hpeo8X$OAJM7uP4-Al>%(6 zSTG`*+49Q!^YhLMrx@K&Vs*Tl<-wnHd=!{loEKbYNiM+zh&w2mfPL{j-(DqyKrwtgZ`@p@V)cqd#eE<*lb1 zEdYLN>>n4HeW_fxT-KwGuJ}o`FiC~oI|kC$c#d~Ijo`Fu+F4bNr;#jsJ4eorSJG}m z&|eL?ku_{CUF3Q+zu8Q2gEf7ty(-Kj>I#e$bT%!#T#xT+#)1B~0a26kTQ_ZxuRzdR z_ONeU;u|sJv#+kB8eu1E>Qel~g&>`#8b$R!VzsPbw_Eb^3)1`556xeUU%UdoS9ykO zvWiy!Qp5|jkR^*MVRl`>ZnRBPEi_z2Vm%MT$wSA>XOB_BBTi0OXOgnQE@qDrV$U}k zgsrws)2u96uCQaON_eC;pV`O17%mcBGNnPFfWouOD*vQiQ7 z(+ancGnSG)mcR!4d7+nU;!;G={<1fu*YdJ&NmfC|4I$qklSuCkv^(q8*u1`QGoAnAq)}dnx}vQOjpN0qn-#3~j=~jUX@oO?W{g!oGZ1ewpJNaB|FG zP!}NVDY%zJaUwblvO$(b14d6zkqWy}h zWC0nJ3InAFo(&y^yVu8Ny93#giaIQ=N%A=-ZLD|pgFkzsaLrym4_~r+qtwNVona;z zP`Q3_3dIysP8W~0w&ZdwMcrt5@pjE!`Ew`p(#2scyYTA0J~dCmn*mp>uE`l|x>~As z{9qwma*8Tv2FaK)vg>s2W800zW8v%(rB8OJFWAyf;a$VLa=Y7AzQL?+<^30cN#>VFMUm29Xq#^PkcaW+lrrGB&yCyo_l)0wcWq zgFO5z4{xUM=MJk&n31@H&;Y3wEykRGiMR3;d-?)u_QAF3)#VH}pn<3XMOpr+SvHdD zwv{L)SUiJy5W_IV;ot(vuxc)3O>Ck;bx)zWE{~ zZj63oYn*PK522UQ{l!xH3|UGZz2cd*kul!wmId4_Bxr8;F_fDmFH)wmH%?qNOlT>2 zR8zlU0$jslspI)PWHjYJ+48KC{msrVwlb@em~8dW(Lkv~q}B*ctwHj(LF%>~L$wru zR{Cuu_Bl(5G3nFqGTr2je|rD3>ogoBGa4j>&!zPIwLYDl#I72sny^5*h7{Q0wi) zK!ERr+JLJRekZ1CyJEM|`%r8g}D9}DwsZtTaM{F(r{SzKZNDMt6P@gnc3 z*S6#i1l4~Mqwd6(W1s^>RL*3UQ*1nHJ5k7&GU&cBsw_8q6CxS48E=*uY+XvtSDdZUJpj$t?7BkAKvO6B$9!QE+wjW4 zbjra+`WXa|0>stGcsi4p4Htws!{-@Irb#X9`uAbOws`fJMfl5o%QFHOjk-BCCd{5R zi-U?XCt(%q^M0~)=n(rbpSNtvj0W>cpGpK2M8<4*_p0bubs44jkCK^Fw#*Q_CIgp% zKiSraE02QUF}++8pb1!UORHL_BbQ?EF5Bip_c4R|1My&`(-&+r9eFM|5Y$KP3#ZIm zG683TkEbP?FoVNn;QlX;jko)x1ygoB2mA%CsJ1~%7j-)1Oq+Rbi&kD6)l7)r0!*mmA*f?fsON%$z?{8-oPxmZJ#YuffTAWrc$M%N z6froc{1gQ=rmVwAgc-?51Y`1_w@QI%5JhxN`nWPwamfcySlNmgN2k*A@(6diH$c!F zqpTL=k9Nfz00MNhw+q?^u+nV|BdDfC{uhtLxiAcul$rSF$hd7>zGH&5Umi5|;OO)N zpEQ{Tzz?SkGxvg;ePYj?$zSs^mNKA5{s%JT1-rg@{_(3pJ-O4xi0 zsJ0b+hx)h!lZghnV3@Cj5UmaLp%x&BTv3h*2HL~^-Uhj^35jR~=JS1_ja^73nsq|f z--Lkv_#%UXwF{y_cR&dxKZBy`O33xU`ARx)K|C!Gb@$bPZ-6tU?3joJ_Uk@|I1-8y z+zGa-gSy_A=QJJza0)(i6#OA~I8R$}knAi1GFL5;R)rx1r)yY?!k}gqRR5|qhS4Lk zQB6dB-R)pVRsy((qfZ10(8RG!&U0c{bTy{WVY7BR6)WW zEdDe0|Jp2*YSS^Sj(W(0oY#m$>Lq(D6RISOX>XeQ>E2N zfc5L?wG0~ViynNA~n*Ezk_BMq^Ok&i!fUi~hIO<_}1>H)dr2*nU@N z)w);p^$frc6Z6^ooKrULEEtWSt*Y`UX*s^Z6}3z;Q0L2@84h~7Nafq=azu2lhIDM z+6HUu|C?~>T?#Ot?!5MCxDJy3{R(KV-fSNGU(m%hevtHPV5TrE?9D^;Od05)#mxj%rNb#)t2$@3bkD=yEQi#lzHhDs%pg^> zFJxOibZ`uNbbwctL6oWh{E7M&Q!`wCW znjd+$7>Y?&Unk;5=#H-@&b@2H);@0k2T0uQb%7bs1`veo;axfkk651;Hj72RgcR6t z;AYwv2Vm=(3~ysTFX@~(dRXhytsJrX(t$vy?WsTArAZY#ea`Iu!!&m#5D+%x;SVYb z-I4*#a7xr9IOyfm#Ln~k3uI*z$Z1$bk{Jr-B>*A9vDtx?idja-XpI2}Lg6`Dau8fpn}30mq>^#|#ziGdC8>h{AwLWb4+B9fCNu(>5XpRXN#gSAt=nRQXwda7fwif3?NowOj41k#*H|bk)u{?O}fU zJFzCN$J0@h$;%L=d~pi+MK+!Jd#=2lr=CwL_WMn=R(=M1=rp_NHg9%Dar%aGdYf9m zY%aSFuX)%soM#m7M|8h8R9_}k1J}EV=6yihl<;tM{MdXLB3dY{)Hn#29KmV5A{=n+AVFr4f`P(92@7255>R00Rk}3KAt5e6O1=8CHJ)?)1 zlOz9p0d0=a=1Xxy@uVg16<0H@Q7Ni?su*ye6%$SYD(0y+G!*7xp;1B-P>Fp+j*S#&Z*Zvg zmLVfrAx*LoW@fHQOFL=YV4KNVjeSSEsuvDb@AHYC;dYbE z1&)YlsnE`A>Kbhe>H}pHOy6u(Z{FsrBd%7Gz|lG%tM*1Cd@(7QTEp6Sa2Q@#oPV(E>aveI`tTRUvNXs~o0yF8fR7&B2R z&st~mHR`BK*HImz0&vaFx)&cSKJaFDv_{8`gx$eH{V?Dvk{5+s^8KoxXg1PJc3Te7YJV?oRA^ zy=-#Z=59B88Y|nP1kBS{_hn^>EabEqSs1c`Lz3{5d~ma?8>b2ayg1ExhEza9LxBX2 zVo{<(Uz`bQNj?20Hcz@F^v!Cy`8+i|HCFj3OMEmPB@IpLE{G~=!D|fYa0C#@HvphK ziJJYql#k_c^q#rdPXbsG@-Z)36s+OW1VL^wAXW!RF_pwnRyr)Pi1G)~lz%fo(})vA z>ti$d%EIyjA0kffQ2w28lVFbp;&)s) z#zs_;Xa^&cZ~kBLfzuFJR<g4n#XpT&Z@RWNX*r`H^1%3(^EcX>1X6v@uy(eUqi%t3NStaxTwkHc%}Ym(nFAPmwB)=$%NoaJ~f z6Xjl$7ML%cWdMm%rOWbZmJ?TLb&CanBP^LuAH=%14O!&mxpV0!1+=nqGn{dmxhz14 za*;0Uf3ngu8Zu;20xj64xpu{nE1^d2d8Q!aj9ojYj2klPS${3ag)JDc$Y)Od!ZsyR zb$dTr9?q&7SpC{g)bm+cR7j6=8jCO;Aq{XB$2mv2s94z$y=s#AU2O`A%1jDMdbc_s17y(8ys>=TNM$hvD-WFeyikS42l!=AO85rWe9ShVZywT5M3y%nL zQ&5vKu?RD%HYH<=SmU4uQq%LS=(&sOq?I!AvT7;TedlVNp4z68-J$w%N;C6lf5+Fw z#|a-9Y~&9V00H4gDCUSK%uLZjsGDhFiI;yMe^CcOi=3#Z;O)^hZieGIr5?9UIOUJW zDFaPAu(sBPd`>}`&8j)|(D^CcHS@n}Zu!C+502ewZkOFPB8x3r7L;vN-|Syt_S@@U z0wG17g|c$P@4i|}?^D9>BOZ!Jbrn*4C`Nfnj7ZMjp^^9`t+LxtIYZ!0*UU=a>M!63bfLNF>aMmcSBwJ0a^!IUtA8aocmT*eUC z0rKG1vOnW+3%2? z9yy$@kga+m*!709DhsAm$)}Xb16-<(R*jeDPI1qy35Xvo~5VQR#4w zuS7>+$g~)O-K=J4)LW*|;|xo;8Lv@ku}I_^B#;LgqoU7Pd0{f&G$?jhrqm9wJy&S- z7^c*w<*CZv0t`p6WMFfYV7*C@@l?@j-F+>t31BpWXpWLrm6>O+G+d+8VUbj=j!?-o zT&hs#kV-+^BQLbxUKB9F#aDZ}e-cna{9Qzot}L6RT#@jI9FhC@dq_&6<^qo(E|#ju z5+_dAvfNOaL{Zu+nN*k+6LLUQs$P^nIhMMQAr#W6LD3%sZoMWUC`Uo00$_$QR2d2a z#qgyD-Qp%QiTTPTs5a*0gL0+K%9Q(x;vZ7+qVzb}=Xm%kh%uwk$^`-WrDr|jMtclC z@?k38eo8mywtvSi`u5xVDQ6Z7%q-^uE6i+9#x8afxr>OrI7oAFJTFepYkD4!r^~Hv zY~F8G1c2tWT4qEt^%?=T;|a#z|Gp~HwUT@G_H+z_l~q$*rR;xs2y5;o^|>2yG!jzO zuqQB_)x9^K&|6V6U9s)fYc#=q9FmbC<1^5zK_d!s;z;2*lW($1|MkL|%a0P?WoviB zqjmMMMaB~3g?!dCFyK!HSDi;SaU6s=-uv2#RTCNl^lwVQRM)=FWN+{oj39r85xwBy zf*XGoS_<9{#O}Qb{Ty3nczJ#Cr$orcr)h&9ZV#MkFxho|6?i@f!3bXxUP1lcvV9oM z2^R5U)LtJIrM5{$hlo<2n#hxx3E?mI_cX9tSLfmQ$X17j0z`zS>>cGLvc_JwA6+cLX7O+A}jfT)235z3-2-n%}gKJG)|L@qB1GP1$hWuD1y= zF&_tsKI#P6(jSJSyN?#!{0M?k?WI|RWYSbSAJ*J1{*H`@a0WVs+jv`5_BKc7$L`;_ zbK%Pw8y}30`sq^CPeq5cID2*d52+O(6Vfw<8O?gye*gaX4($GRgug%O_jj`o1|KM6 zTC$2-OlH^RS$O1Gc;y@N`Z$5@9|&$SBi+GI6QzPuAOSIeN?xwqG=k&|wL4Nii}#K4FQ%jV8}Hvi{5W^s?A5JWyAlP)h!5AnRD{mj zGZbwT0J2wb6~Zi9+h=YkIa7owU||d`U?SkpMJJbDhpoqf6zV`?;5>qEPwn3y+|*@? zL+xP}bvqS40SXs{z)MhVCZixN;;K)fh!J61WbKjeo&!w;`;+{eQNIS3HGpx3+6s+= zWa@DFnupKp-G9{i#f~)fOy&1LI#6Bj;6p)jAeUjHh~ zU)3l(Yh<>1Ib1$pl%J5qpIo$_T#f-{RE{_E!@rk!OY{oQS8$z1pQGZuLY;RjW)OXdxvqJ_%)Rd^QakPR7B zG_55fkV=4Qs*e=9r z+$uvit+ldZw!Cbr4M-!eBW7Bm1Cse$XAoNG7{i;0D_MpHA9ljgH#(O5$q>nH`FmSJ zP&c|zJU#F5-*6na&wsjS1G$i1KDN0thY#(1{H+@Z&pCv#Fdpk&d1OH-(z#xPtt}T? zX$~4uGff?9iqSsy)-r7KbHwc)%@2ivels*Lu}$;5)Q8Qxc(k=yzuqK`ZFbVxB1EoC9yJ&J)l_PyA3K~H%SuuH=mzGS zkd@_6tFz~2bfO(z-L)*zGWnyW68rPmy9_1nsq)Q|{kJ1!p-UclCn>r69K`vV zdDkGv3*&DCqhJIZ**%mrL849D8B-b73NE3j! zA^i^oxWsb?%e|C>HnGV{0tu%|6FejpMQ;)dAeEJ%q7hG{mEq^3goMdakJN=Cq1EAG z>6Kx}0=Xn;Lc&Iw`YC9|R(o?^L9jRKXd$Vhp#^9dyC8RE7C%}}u>d^OkX1VU7Hlw! zFQrgV#VGNqu-XWM7U4IZUk>)r7r?dEqEJlqLV=HA=c)u~xa4H#(eZD#e?VXa2nH+Q zYe}Obq5d2PBoOLIRLlx7igDIa;63#yw${rQnd#1gN<~wa?0XboT}{D`lNQZf)tF&W zF~3|lHWv?~7Pw7XXSlM#qJ_%H7n`>DjocSaE}qW zD3V=2k2pD}eU-lvxm|6g4Pe86Zl&RceO)dp=I3%NDLv7)>(_AT=hiUr)ss}zlZ@|b z6I9e*)zjn~r6!>&l_x5*w_e?D71j)ZWxwJ1WY5JE>1xs*pUWek6BW&r){^Y=&!Y2zs29^_2AIV*+{|&waRHxNMFl#~8)IQ@Ld9ypc;GNyuoZ;u`N2SxeL~dfE50Hx(8zDS| z<5d>O?v%*-$>x4!@ZTXpAzf{0dG@zfH<)FOUnb$(!RRSKNSU{TAsXX85TI-lSA%VAMFF*|CpN~a-4rFgJn0DjD7=|wuDjA0{yWA0DIq^kayUcf zOMW6)G&L9(>$n=?yon4N6`OAfIz3)drPvx8h3?`5!-;1K(w<79HBM?(h6&!|hf1V3 zu;@3B1IkZ0EXFf0ET)^RdOHwb5e_O6BHz`o2xH53Z*>y9l!;K2Th!623!EegW%y@_ zT*D@L{(`vJ(R?wC2<8xDbsDALMI zl)1D->$h^iqaYcp^rlSh%k%w8QSzr{x;i;Jl4K6@eZ&&WX<31r#CP0_c;tt1nB2#& ze2R|(ggEY1mwr{Lu9>1b$frTn!-eS|Bce2i^L6fuORTJa%}a9z*X^q# z$>8Aob?^0Os-H*9J|qrVD_&gEuTpR|U=Qwnt@#8phB9RsTT$NRAt3TD;BPJSyH?!( zfbybk{mdx;+VuY%7|?}Pzkh!FN;JSRFt9tv|1ui8|6$kjyx+#$yCcAT`gtq;82}N0 z7ZMgUarW`9W=8DU{c&YWdC$MikSy+m|| zwHjftU%OqWuKcYGHWlm;weQk`4jO=>f zUDegq#l%2oXJ-@Wx_+Qz2)(Vf#xKL`JMRQto#L^&m(p6gk9s|C19qBmPq(js$a|s$ zyS?2qr}PwW21pGI{%-BgwD$aO$Z&M`45UkS8;!)&)z#Sv+o5;uv?6_!tuV7gt+)UE zd)y0_FS9y}(&RRR{I6J6HpETpLckfhK6|Bg{W?r))dwK}@ zo=1>d+Uo^cj5hB6KlH(!oBx2%XZH-Uw>@xH)uy#LWT!5E7DHskEeT-@9I)YJ<5W${ zsG31n?tgE5|6Y0dz48b8p`0mmha=9D)9F_G;w$&!G@Yp%;Ko3{^TlkWO@!MS*LO9Z z)m*TsrYyIiEWZRInoTGgc@y86XrB#S$AdN(ue$biN`H0Ak-Hr4_e^OLqu6XGw6$=w#Gp?nyfuYzVhqyOIvN78$S{J zGn7Vx@(1D{eRCFV`&t}Al`C=owO;%0B=rE5fH1pO=jM2Y2)&$5XtjIs(@gJZO!%td z$L9ZS=D0+DQ*kAp+-LRZ+I=FOWoC?1>5E1^0W6V%3n3&-6aH*@E>dGS0=U2F8!fq1pai#yG3!paew`!?oSwJ>F4 z%-ogJJGp1?M1J+nKM(7hgpnIYu3q4;ZeB>XvD=3MO;ViSEdtT#g7HM;SQvx#Z5@pS zTRapfDEP3fp)VK0$Zph82o}7$J+GbMaJWF;<|akDgM4*)Yv;`*`qNi8t6R2}BS@m_ zpio~M*<;r~y0K%I?DTdg$1CiS=eR2!)2$_1LtX^$56hIjITt?YM}x078NL z;UDO}@SOE)t(-s?-}7$5UH|YHOe!UjcDlDcQqR1LPsRR=@@w>1%lY&&ZDO?=#YT-> zi;hc+PIIen3x^&XySHt{=ccw_|GN9wocFN9bwuIifA;C>{lMn;f?{BhVjww>F4|a@ zd|h6)m&TSST9#*I-TW-f0rkzwErQN@DS$CrtOzx#L?|lP%~k(UB!Br29M~7G8{>1} zg+@agBePP$*-q*!7`%{l`zpjD8ML7VNk}CFZt9FA%|dv1wNpf?Zr$If$(l0U0kk8s z6>yE717%rERP3Q71pGyu$ft-9nm)N=v|;n3;v++3g?l#+r$fOqh4Hdc(j(&Jg_d(= zQfxITCnGP`q47ZQk;_9jEe?c;K?VWa%8xjZXW*;g9=(-yv$ zJY>Z?YbT4MEpyyLhM`)X!A{=^Pd!kqq%NM^S`M>`;_kZM!!5nb6uLKk*iQ0jCq!9l zdh6TOmU4ghxBhNp11l*Lt24%{;`avn2XFL9y$PyX!<3aGd%R!c|4ob&UhExijMF(u zY{Ehu^2j>+;ZnItYvROJ-9%-AM{_wqR}7@E8CZD^a}s4uMs9vCq_#7YmZH%azPgDC zLJiQ8JzWQ`KVj~HNaO72_*ghdNij+3$R5RmuMuEGRzI@;)KkT>Fz}J`lL|(Wi(X0j zE02!~eqn~5U8Uf}M8yiAVIj3uGv3sScd+|8^fQzQb_eIxRMh)lEOPe)`cZGZd;&k$ z``zlB4@`vN6UK$t=LO7lj>p&8dYSnv#Ihgh#tJd{2jf2|B?IioWZ|&F_#l#1P|Ccf% zlx3B;32uw%&lFw+^qPuGGKmpEEuQF;(5j>0dhvq=VHq~U9%9Ff!{KD~7eM&`R3=7F z5c?y*_|5hAkUq&-t)RW}C=OGYN*>ra7_@k?a_|91%<})y0$`?rINIy|AFZ9f)_t+h z5ef)HtT%zBs5HK+hE?{*LuUfqrbV!6nVagU2g-6AQ@@Zmk_L~OH0Z@Pql_>M`z;49 zF%uU|LmD(oty^&V+9}NNVlkr7<;T%W) z+iV&pRC-JU{zDLHUG)L=*^npoWhd z$BCvh0yv?n4alYAd=v&Nu7bQUWTY7ZUj_rqjms zZR($LO)lw_V%lU-R^g zCY5Y+uH?MgP%OcxJ=eqWAmuimR5T%%5blrnoR$+25eRqljeGmodx_Ug(Wios8`i-EGxuu%ScFGnAr+WG>yN5N&68{2B4RQAp&Fj2)8ial zkzwJoLlGGCOhxQVtoC=5X|as2)rfOM+@n5>2iwP)~02YECSARWAmo0LlbSh|Fac*}PeSi~MFn)q!t}_ zLC`r;FoY8@gvgIS@Grf}e(?=qe3eajP1$D9vP=Et>8E*P-*Mf4(O39W<@#-QA^jt) z5hB(UhESHK!wiOKsyv75wWE4IW+QdRPkj5l)@K z>nc$^KYQngw10SbcyV#jy5s9*ZGGXzU#md1+3nRjhdp}vo>OV#=kuTQ`2TUu0*lrd zui%m2-@BPTR8Ci}tL6G2J=WOelJCt$3s+w_#m*=7olRK+@Ft91j2qTjS8Z@EVq{Fk zDXPg5eFeg{v!(swq%WuQw`WXUkLx;})O9q>ZzWa5p$p%?H?v3M?t)m#vT^QfQ2y%< zXcv_u2YSPnQl_jY3|)*HI~vlnkNxqiI{UlaGS?hqbw87ItBX`<%a=qJGe|VE6PEL! zZL1VzE5q<5&$9aqckX{xhMKd}Xwn-?0XAjx=)!xDqURvh>M$5F!nZWgnK+znlm_oW z6^_AjOkG@Xlp-g1n|gDEDpDFQoeH2Q+*P`yDg=H+VA?wEUt%w;VL!VC`4=Y=1-gU3 zLER=#K{fSLnfo@}K*C0Pm;}pmbv+ij@kepJ)|Y?Q6Ptcq4#(u3Ye%;mezyPH!To=| zjvto1D51nO3Nh`Q(6uuM5CmBL(fMUkj7N`WTlR=~MpXXu{@_GH4I#iu3mXTVf?6Iv ze{Obo^}R4;5e~+8Wi($#{ZT>sP_o8U--YX+!O9sV|K^SE0vizSJYB-~SYEqagJVd{ zCy)QWT)-}Y52ub;xq3x0#P%O9cW!F7a>gl~2B3`1Hc7e1$?iqh#o(Zdg`$s4(F5#j zKMWI&)FtE}jXH4Z6snwryxGZ7Hq$51OTyZ%%X*u(N!!-7t$(rU3E2@4w;uL_Kbztu$|U zpGQD|S9b0sUo$1Flk4H_^YZ6m3{d7@s#&`+u4OQ4W-_X4F=$>3YlK_2n_KjlTXyMN zbeP-p9GG|SS$CdYw4I%_Mdj5aq_oUTJu#$R>(n)U5ji^P;#+dDDY<*GetkG?sf=lf zT=vRM*YvZnekb?6{w1;jb-BN@Nk&{CR>7Wo0; zH>H?yo9(DYwt5yTBO|w}Y8If1QBy79yZRY>oIcWh;K1nh!)kZtRv64E+|e3A5o27- zru`o4C4SXG-zk6NYfP`rzL4$Y<(+lg%2tj`?acY(GY4M}d#c?ak}yl|%JG9c$MOmo z)?J5B4bsk8g`I)#l)1VxQgub>vhujf;cSPeyNf7qEr*LeZw?wk-D2`(ih^ix8t;Rb0^E? zj~2-xYE|6=wQ{GeB#xI#Z!BY-DwVjFs5djd`EEHF`~r>GX!M>;z7%=-EvL5{`aLcO zgpaNs1Ia(Dqob=j@%8bYhGbyW5T1YtYUugh?sEN8^?*Nbh}3XU@h1vLgJ9M71GNGk z6hc(2mo~kZ8KJ4INh?o4M;3194RC&Wg+iKgIZ?bcl5cj@Q=Ak zka+u^5GPhHs>|>m_28$Jdx9X$)5#eWPOvK!T2eOCg? zCnHV@lOq0)1VkO3LLR5rbTsO$I=Q`(e~iua@A9|LHLu!Zj$77iw~sG7U250a=gQfd zu@cd4JCTiq@n8}bf#1a}_(U0H8%Tf21Ju#t-#4tb&a!I3#= z+<+R4F+$IE)TG%hS2|$|w8XPXXH-)N_cjUYhnmD%tzF)BWHE&KtX;0F>j2_@ib-?U zOnlYK30t@Ii=>)KDSff60$+=M{aFoqiq7FZHZ4BY%nj>$97Nadn6&iM*Ozm=&3ObO zU-g_g`vAF4(NdM~vz4(F%FKIsXgIC%r9bFtuq!JGYHJddRi$WYC@d??aL*`elqW1{ zh4@0j8sPjvmL_VJCe7^gXO`4^Ac~4UP7WP}|C|`#I90VmUdU;So0A(lXuhLCWMhW} zUM3o#t65T>pCdyXn*xvfle|lxxTGS#s3O0tGI37RHY$yytkciv{ST2=e9M)jtz62 z!Q@0*smV+rYvR+q<}aDeTv$b*s0WFTqHu1fbCkKnAl`gEZRy{a1<=c{mlw7yzxBmO zYG=_FKf{l=sME7j_jAf`Y+?>ZvxaMs-HFg279tbWL(#>jT5%RtI-`I?#JMzh8cM>`l6S`ItimW6#T1xh- zOT(8JM9(d<{4{qG40}`SZ@By}HMY+dHeqQ&+P+DLK1qijai_re#{K!XHKX%1LnmNb z!yoV>;op(tPhw5pHFM8z;F)VoFJMr^XHvsIq3aQm)+j!CC_b4izD67Cs7iEP^J7}a zFRM|=!AM@+O1>e5DEEf%&G}gpQ~M6p>Y2ppki-h(h53*3bt2t0ddVyE!~@mFV_Dzr zMM86}i^qK~XKAht6?Dp>NDWSaIJI*nH2ye$t7=ojKSSA1(=D!+fZr=o`<2kE0X~DP z8DEMF1w+$~d4ng-a_%)s9w!rdDR2@JC0hgVAe^l?AlFEZ@x;a`D7HZTY%Td%wdbJa zRM4`^K5v?JYTD*7B`IIJJ9-V`Y}yP@w^hz+v&@V20&mK1*+l0FNSkE5VB;;Wo)RLR zd%Ss&?D-UU= ztJ5a-Mf>C7WfBr)6XIp#pihiY_OU%`lKZg>yh;h&q2=N-kA+U{kpRr;N5c#YjlC=) zFJ-89A{nitd8KxIukNpy8XB=53yfWjjNP|t)8(j<%I=?H=R3$Kk7hj^>s9NL7qnq zUPn%zn2sG-Wrk9wr5p$y)FgDfeNAgKO>6RsJaN8=$Q2s$DwCzNo@3r6;A`qInxUAD zIg0nIn|gmK+alnul6-FY53#+DKRrJa8yGu|KErVk1O)qTZuMvp1|vV8@)sMtgfDi~ zJ0sw(le4*9!L~ zXa=U~aM`+)=!7DDmO&}5;kv!CD49M&_{Ik~@tFjdA$-UfH!sz!aE$&aDzS~1Zz3a@ zwkA{XYtTPkuqP-P-}wVdIKA06tl8JMQ2!l?7sP&-rIzPpt>?+Nm)vZ|PY;uWTvf3i z9p7j9?UfxKJ>Nrbhne@=oYzBwr^pS$x|l83*iFaSP2lQ)wBrD4x0a*V`k>p&*K2## zD|D|%`Jz9v?zg~UKe6sNG4HkjTq)WPvAZs@J1((%Oo%!x@VX2zbXsAl%`ZY_-4~eM zC%BzASe;jBJI*mSUA}G#t0ea_J?M~u5xj!q{Zo26TUidlqG0_8npCY`;}KVHYEy~a zXbSe3HqM5zMO@KO!}X+rYerT(Why58W!Q$xX<^@(QrAZyjoMM*9F+rNK6e zm12sSYKr;LSZ9|6i0d2M*s2$%=osXtXC#|(Z?aSoU75EI3T&0k(w6Z6S`3G*hFFFM z@z;qn>zxxzkgjbr1D)6JDcRR6pdxsrx%qN)-Sz6q6Ffkr*Khb(>*jg+f06YTFmW|t z(z3KcW05}(&FyU;_mL&Qrz8&yL*u$i+gc*clUeVKl#6VzuaW9IU(8IusOSD z&O9^Ez`TtaI?&*+P)L>Ny#!kgAnG(?=qO1f$Mp*Rd?)d7vwH6a`=58eNjGeGuV_x< zk@=d?;*&`ke4J$SXZ?g43L^sKc%FUQp)aBy#k|||8o6@%>+*G$)EV59u88|js(joO z@)ne=xIa0c(N)TSr8)Sx-pNp6drWKZ2eI|lUty-V!ppYC+iAqev?d+2C#1D0oHkfk zin%i?&MiFGwO(Ir3j8w>@|c5x>%*@HaSOjLbr?b58Bw z+n*f{=zV9*{iTG26&bdn^8v~(Z$$V8qoE(@R3gR!g#4c}UhHJCToil$?xd#fXnt2_ z#EMZ`S!h3}&etEIw0cf(Pgoa7gbA1O#ZzQO#tXKU)#MJ-rdyYASZJRV_dHM>&P)9# zR%^-jW5(Ec1`Gx;4aO)O_>*yW)_!>2>Au(DKl<#C#e+nu_i*vByFI`lD5&K5B0h`s z{dTBeX=huFhR!8YKm9w4oUmHbv}9QHK)vOq&1Y4$ zI?Ed@KH@yH?@E%zjux~ou~A7u_L1t4pDch-OhuWK(TS5tV{taWp)1 zKe2jBDp{0JV|fnJ(%SkH@}o`^BD{}981NdG@{0?0;RHz8nMAjn$@?R za05NO9GGVLK!}wAy?EKG(YR&Nf|CG^Iv=x)W(**yHub5MW<8e8ZCP#^{W~>U$*asU zGn?Y+Y$;<+N4Gqc>L}3}r5{6PZEDlTa1V+&TZy=fd-oich|n`;?3|ZvNy=x%K2{Y{ zjUCU6y+2hqGwZfE9jQJ}^yMoaD*i4V0Hr zs;Skbmmxtll~L!K)=9e+D!Uc_+JfX7)U`=#t5H>oFPBNvR#cRxmsDn#RL0M$N-LQ( zs?})=cTxvXJ_Ea;o_@laVc)tYplK9+u9oHgCkK^?pw2;1GCql}oHArpPHk0gX3bn` zJx)l-%+#!A->7>9N&?OaWR@#kHYF;Y<>(H=&?`iGpU>D+U53Kofet=8zyK z0x3m*;!i@@02_=+z#zy~^BM(Ic5yiem#ktnnA}o%qfxa-#dc6v<+uxWcWrE^RO$^i zYnUAH4qbRoG_+z=G^26Z`OKnkw<(&(bQB-W=w!x*0C@S8L6vn)ZmIX=_FF~Nw~DcW ziYS`VMw+yrg#5vrX02z>viI&{Bqo(#N3R4&FTQ@=_8N5gDroMnZG7Bz^0A@K zz;`!EP&eyPOYP^MUzp9tljS5g7I5gMIVw~R)?wdKkcS( zjkP(s$Z@rO@!!qzJxnKYlttH~?D+s%dXr5*vNzZIKlD|sdxgk_zw>%L=eyU_dDb}T zu=mTUAkA*j(`AhR%Ixedsqlcdj!x-&|J#2o_P^RGVX}*6{$ZipJ^kwYhs*7MKmG3N zbH+wTUrN>9!7-k{E1pq`DmnjiJ-+__y3WGq?;IIf2qWvA8`oGsm00APVH)Sm$=ksK2DZ;4mWD6nd8GK}c z0p8V^y|#fC4atJR>k`9L@ho}nK(c|~vDanNalgR)i1&CLfApr#IDotiw<*_w4Yd79 zruj)?V1I@I3~0`MmD2$hTXz7VDkHS{q=z4UO0WGOTFqmGzRi@dZP&wb*Q@Z&<)i;lURsZEh_ui%F(9(V9-}la2k6gdcQ7Yb3WLW%7)BKIt z>15TT7P-xv#y8E-%+v`hKd%Uy*NtV2I-7~geAHg~YF=aE8e)a1!uWXyK{u4#4z+o7 z6PL+MnGms%L<1kGajIYn`-m#vSRVwNn@W-h<_i|JS3J0_4=W_--MR@!!FBmP>g$%;AMk*#O_%5w?uP#LfbZ?{CKXT+lj1Uk7nM@H~W-${w#Z7 z-vAv>-A8cZtjgTpeQ{ss_89~lNQ{Nd@Xo|&lT-54j7ub3`?lnUA@~d}d$O^4LE-=Y zu|Eo4G*6iJfF_U-1qOtB@gexYa8M!a?j=wlXX1Pv1x`_5_ep#3Y(YzRDQ)J=Qnmfp z;_Bj|z~jx@$<6ra=-ueaU4@fe;e4dkGe1rBI__MPYsytygf;^5QV9Hf*tkC7Xb1hE zZ7^ggh+9M{BX*UZ(GsUl2VR27H}oajnW@8k`NOy$^YDAW!)D{=?{YDT%HKh_BG6qz zIqzR{-v5;N<{lggi!5I|zf{%#F_*9vIJxVLFAwTT?)33ffc6;i8gF#T*>=y`cHO<^ zzkVcsd@%*X^17eF{;{9PXNV;BVa^dB!T z%eHCC6sYG5$y`qQKBNfBe)VU}d$IWXM@WdeEKzv}_};nA1Bzmq1AA{Bn;&)7 zR(U`t@N>6^s(qd2p^s2Wm4N=MP8NY>i_m&V+D76)Q$}5s=lc_mW7w;an&|^i&pa)S zmWgR9>$XVYp2#?(u4HRWmXhMqTl(PP2fI&yw;!~A28tnYd6WWgYGe^9u^KTIL{GO| z7elfGP?9SJT#K;QTJa5t<~Pp@FsK|^Ek8KK4{7FjbOVEeH7lDHzXHyP%Aq{GCQViy z1_YMWE#@FZ)z26+tqrn4?H&D?j})XO8`5u6mx`1!(^+?N*G5cIyn0&0Ux8a5&Pou) z9drRCZ^~!Q*wa`eyCdPk(#Fgp7DEWo&@)VJT|G@*7u&ZSJu~f^d$*lhn9K&Ie_MKa zJKx17_U9CD&r7BgW`tz9HyquvwDJgzfS_{VkyjAw=vJ6?ul`6oP zD`~52B))9qfZ`)KLBlF8utHK@2Mrn>s1>u+{JBYsN)e`bFzKgoj=4F;hY`i6$8WKKXd+_f!Df@4>A-7!9EV z{~nQ!V8YsBtC*uTYPVIXE@e^#d#q<_(pAN5f4xc9b&@YmCK}sF^)5}jxuI| zFLPL9He{I$Ag0kN728zDo}~!-WmN=s>rUVoRSKc8L4^Trd4k8{gF0bu z-;4H@!tSRCSZp`~37^kY?t?i#NjAOUFHr^}cqg{L@L0o7*0K`0T~IW3p)vy;U0@tW zW|3lVNo;QkcJC<|V53@uG4*q#=9Plux_+6Pf#s&&q`SO+11@jeGtYW^N3W4d9|*F~ z{mvfGum@n1w=KgviigQS&u0G>vBeHiX3PwJm13}bUytaaU9NH=m(dpDcCFdO4(lKKfk zyhIS}w2phMNLWrTRl9CTNS$K({;6z=ZkMOVfPN^|$3~Y|kQam`$T|iT8Pdo8QaVk* z)I|+6rl<3XyipQmC?wLRiwi;3rlZ*_GD$}&AcfsPt;!908+I&o(WN3*`)M%p&0wsP zL@he1v=2;wNz0xlrG|}NR*JM6B1@M<*FQ7NHhXgXSc=&pYZ8mh79J3bn%WO@+%m{b zU)PDNxsF%?hB;n8NZ&#eN7BmnJQPQE;Uw%4A<{&W88kzRa7K{HO>%1CbZ^O&9(T|}Z;+L2VN*g99cx+q z!YtDV)NFvfQ!_Yvh6wg{f_hPNYct=PR~8mGube-$u&Ga+r|NZ#7FVY#>@Ye6D6OOd z=ZzhZdvE{Os+WFZPQQmO;r4^CSf%&qUrk%Xq~aof&I~{4CS)%a@$-mJ8G;?^B;b2; zWv=1Fg(CL;J?;mfX#7mEmQQUIoodpO7^s(av$)P4+XcvMyBP2?doI@R-u_lo?f;vR z8o0om!@+v622gxRr5lY3&HarDPa{P%$yVZC@R`K%7lIfw8^iCvCuI02&k$ORQTfGw z^n;e%rYk5}NwVz}%s}HdMT@u)pBzFI?a4|s6AQZEM7?o=qi}L5xyhVm|G!A|&`0`2YNCW_YG_htP_RLSOmY}A7wN?gP= zUviaL&M=sWo#Zcuc>IMi6+!m8zwHHj*S!q^oh%o|bO6s+=F1~zGN8G}JK z6rc(gKTG1rX>O-pZl9SiZFaasH&Lr@=xc7_cKjdgc%SW-atuJOdK_*I1no<;XXPH} z`(gWCnnaIyBSa2>@44Pm4!1H+@erwSt)j<9JHdC&IICF;mvIih-WRi(PQ<3@S!e=J*VBzs(<3G)nB0Ky1xDXnDn7PDof&Jt!E;{ zyc%uKmwI$hXu|Gn$o`PUhJbeK7VjG2m!~iMn81EIpL0f=(?iE%B)!Irw7ywSeeZlEl8J zNRKlasT8Q93`WoID6j}#$6w@V61t*tn$rHNlLL`DOFevx9|On~{Xsxws~cD{rOIPq5` z#E4ZITPdIF6-q}k!hB!=XQ01!dyAJ-n{E&SXeceU4_JIzQ9CAuF50|VZrSoI=HfsA zfui5>6G)P!a7Nm4K>Co*#!C{ql66`o91iSaQG$A{sY*=wz3V|ZGSsNr_fO=JC+huo zWf#04NV*@%z%ysIf7l%I88d=V@L#b_bLs|@9*KwN1ufiz&WBMrecXKBgfLNiNsNz1 zf3OrSsgK4YT`ZKFSdYl>(`u3t>t}nUU-F%M|I7!C4 zR$SQBnXK6IDXZIc-lyutQ#G`hF)w={cNYCWE?a$};BPFf2m1tN3_Pd(z$g0r=&W zSo5mUY8qrN6=CdAQb%P}u4>Z^YS?I8322QfXpITCT-X}1kcuX!qNm?wbpSVA>#bhc zF}NXL*MtIUL%k(>kT@M*iFiQ<2JHOfT>QVanQU@2zz;d7oeJ%$rl z*Fd1g^i48gBFNz{R*M8h=CSq0!)IPU640bFt_9uorOf;>GI2`%O{R(5=7+KuaaX_J zO&h6A8?*(iN(l-Y*%2x@eWl3j8n~U+W;6REf~@LP+peV$hM}h?N?);f=pzahR3<|h zj*Ds3G0QOO5Pz9^IG)Sysq59{vO?goEFh?9!qnQ^u?_q3<#tAf1J z#%mksKJD|oKZ4=Z5u>#>AUn~^vG&b8nbf?B>;lCXP8!vMweJ@bMYat=9@r@CL}_mr zd+$gEv7(@a-37VZJcd1m)D%!Wbz5^(CgM`B*pt&z6&P4+yWXd+nm z***f3`RuUE*g8N|8sn`JK-KcCFNr1&h9 zlU$a3$Ql+LaY?Z)njptpDuPFU+!%g2mdiJp=WLbx4ywIG+g<>qQ7RMu78exkYJib` z1T}?{OW{+Cpd~2}<2D(6vd15oN82uMn^Gfg>6>%SCw!`9%J;B69J_iMaa}#&roK$0 zxtGO8Bqq%7T!m2ahq%l$E^|xG)z-S&*uavm!z|*%%wJsEiq?gNcRYk7q-tdn<|zG1 z9$JTbD8wgCih%)f3-KcTo8M_s=A*`o85;Pu3(l|qNY=}V&3;PRZSolzp70yz!m|3X z?|P~@)2e-Wq9rw@)nbeCm#M+N^l-MMn<(R#C?9~SCYKZ@{<3j#(`8JN-eo_m@DLRg zq$15o^D9jwno~f<#LAQU!YTugo7T;Yqa_KStN}X*00gs~I>|>}6M2VSowM90I`I$X z{$Gu|nTgt^m*-ufwbdXSFWideKhWJb&i};Hh&Md}ugm|DE&u-q?^j5aszgFlZ&K4y z976`?MepgiL&2<|J43BIMXftByh%1CsivP$$#N(wQ%jH_HmwqFWK*eayf;>S}tufU~FG(u%yC{=KfZD#gkW)-h`aq=Q`Q7z*y!sAIZ_c3#KrW!sxa^h>*4T$REgz91zy*gelxI$i< z8v&rI(U0{Ldrmo)&iswMz$-G}`afcP@%sC}K8lCqG$;pfAe3g`;Kv5FFN+J%c8qWb znz4Q8|M=6tEU{u659U_Jqb^d^lBXkU(@_vdfB%kq8B4x#!c;5~cJqkP{>NnFH_ zCf&jaHwQ>#fw5HheLbEUx2bV?SX=@1&Mo` z-|bC*m+v+K`gq)wcYGI@;kE&>BiezS{MJFAlKXK{l>c6oe;)Sw=;}PdRdGxooy!KO zmM4#RGAwWXeD6Ir>Zz5V>m|feXT1*6RZpD3>d!%|O%~3KTA4B-;3>l_9rjW@wtlRm ze9qK=lJ!d#%7hMunD8K2P*@rl0(PSIkx?MTLK$p^W;BHr@|lC)B|^p7s@C`}$?2|8 z`q9itq^X6cwuTcxYi@@2v;xavvFj5-u!tSIr7m;tUJ=Dd&C3t!cQ0#MdiU8AgoqWf zpFp^}NN_2zBHe?E=DX?ZU6@MI9aN?08=B9Gvw>it#8n}$J47^uM53gN@{{TUw@IZ2 znfN>?f~yZwLJyGdWc@xShAbP`A705>qimm(^$2;II%`@A)2=P|+|`bVTYVIm?}yA^ zuLw3EMKrL#w3G`kO82#!5|2!fUS2k~yk#$uHHMi0nyCOOfKlHtmusT>kpnYZQN&W-)GyN3N2If%u~}^V1H^xTA=N(gbjV^6n(qiQs00q zoWh1Obv*uIPRxdRyY5MT>uGxXT@EXea|<#R)Qqp7n<}5&3YjWw=y}h!E@;Bcq}9foAv` z1GXQ^#u$YVNC5;=1VE%`uf}BuLu`4WAr+W|1MHB^vNrbLf>wTq?xt zay02}zV^J>nnUG)9c>`!S9fHhd^?oDMcYUt|BpyW|MfCF9b3xvc|~(NJUwBcT)|J* zb?cxX!=f;fg6h(d=yL~SAjGuK(ZZ36^B*yR!g6&UqtWDoOG%k{o-;PqaP)L5(kBH; zS9MW;s!20P$6TWPsg|4O6?`Bl^EpGFC2uBxFdw*o3{>*t>MO+D*P*;klY)dCmG5=yH!&?+%JP|m zW`%mfkY&B6Ue)ccY4wOHD1**rG?IWA_quMR73gHjlK&X5HR_fzYsHl@77(q)NS!fj z!-j1}WMiU^T5p`%kI3(qFl5KRI7-daZ{^B&!d%>IS8t5afiz&F9x;^*`iw?W?Avd5 zZ47Ch0tI)y&2|j`dQy;2=^IGmu)rf|aPnI5?2Aew$xoq%0;!Kf*`0i)=*+})55Myp zxx_g4eHyCY`kfbnM>)xlG&(0Pw=3=%TG1w|u0mH@MbzQq_%cm3R5()iOWM+O*Q0+I zkSf{wqh?jVmoa~9sVxg%N*`*|rY#j;!RHwbzy}-!TM&pfJ*8rh7Df37SOPwMy3+E* zK&J|?D`~U_6VY|k1yE51~|OtmU1ZOf0gOodp#f9jUlzD0frMrJC7D&x4ANJ}cj# z(LF&_#jqJUa!rAeeZl9?(=`y6ipRt}Ub%VH%0xbWjZ6@*=F%0$pV}2E1$Fz?PD+Rzz!B~K&{O6^% zXXFtDsfh6j%s@*HolNKKmJYI{a~(6B9csM z=0Rctz>|cv1EXF5qmH<1$mR8JbXY84^ecu|^oQ1Qn*OsjdSHPxL;iY&f`D$usjm7B z->z?Tn&7i)m$mwi8k(otmz277?wR96l&@t*%MFv6EF`R%DL%d~4fkmlM;V%@r6 znI>9>RLlxPLWtu*Vqaf|q7l-8W(Z;MHo)q1W@4%izkyJ}%YfywDRSFd#-4jK-(-Tb z);v8RIMoB??8_RYpFhN8f^nHm3Uqmi=Hr8nXP;516XG#;VTO&*e)*aEtlyM*W^`+1 z;pRkU=%iffaUs^B}aExw4y0kLaNpN)rl1&G0Z?A&rVwr zi3sV#N>VM#iY+Ouk);X@lMa1|@;Mnh!S^XlivGoEyWKJG%^yxxpSedGTZ!TCQ!>;L(SkU5OY*@pqb z8I{h#@9)1{k2G3^x^hx3Zz}Cim_XdBVX3UlE-L7vYNpY#Sqvs(wuP|?AWb*72Os7^ z$Z*{c>G}_WOd|w4J7|s*=t;Zb(#|0(L`s(9hFWKeTH|CO?~k2h#Eb&`AwUcrGJGYz z+xoliPu|s^xT}@CGF>I_=nehx?%>SMx0AD}6M0j4Jge9fMRxu~tt|TQDfI0+3G@6p z^8zXJ0`5)bf*AC4jf<xzLo3)gQ&h!A`+Zz|m7&)HYaV@##n|;hG6Ebg_;`;x%D8*?m zV6&ih2`Pd^h;nN`?k@5TMnTKo`PxPPOyu4|Y~ZsXt0yZM#S$5~(_s{d!Hw#;?{^N`IBs4;4U)R@Hye6d}BF@9O9J_vvA7jrSJ%x z9$<>}y8e>(z>tqBeD*Dv`hb>%ZZJuR$QLZaLBJUn6lMr@{d{RSiG{l1y&UnD^*DLv zWAUxtoV2&Fi$dQY?C&{$eN^?lE0Eh6cDDGVtM2DnYG`w1&+>R)^;e4Z7KwYJ*Pn#P zZ#{P}GCwwo*zJ zd?zv)$4vqDyy8{QZUW00(YIX3XVLrz21pMnRx}Cd;QNXnS%O= zDeD@L`IL8I^gic&He-m1&WJdhV1JF9xNIOr{EK!#lzamsT95;Gj1M0Le;@SLv7sNk zg7VlTWmo`1e4s%)oW=qo^XBz7`xd6yRNNZ9Kq7cmA4H0?z<6$ z$fLA+pRotKI_EWJURFKVX1@5@LsvKFwzlV%*4MO_*VN|cZfZF?)2?DX^dX-jEQ`wcnIs15j27MYXKvVHWiZH>s&AZ2md77~hbieH7nBl+~1_ZJnItriYHOY07&0 z7QU&G`YB%iy-Wv`ium{{%A5)rKBWwoI_^gky{n<6of!HU8hsuF^%~_6&!iwi#%Qq^ z253+G$`Hx@Ndh8-EUQAsya8u?PCJ+m&N$3H2>xY1XX3-d*7t?W4Z`hd%LA*+!W$2C zfo!>aocv)KW~Rj7 z(hDOWOF~!;J%Z=}*2AdycXd%`>JHw7zau6WhB;Fn)Fk-Ttb3tuv|1VnQ8^;kLr}&i z^c2^2J@ts3$<7U2 z`ejDEQcS}GF5ZrWT(l*+^BtV+HBy|iYNG1!WgJ8AJZjV ztXD9QQ{11WP>|%?y+Kr%L_InDeym^gfA<1lAK+nOF;lV+V;`C#UG5)#W1flTB#~?J z<$JX>`fK5u)X*lau144D;#jve?czEM$Em7M(he}gEvljZkvbWi=@Fc*Un5)e!1m;T zl!hWvZ9VeJs>E5R-MuN#D7YDr@&!p@cf8n_#_T?j=dYzJ zIhHNqdtojr;LmHRRyNXeAgaR*MRQXXzQqn z9!{kM=?qaXE)*C+*9x0V#V$-z$;&w&o!~Z-OvhjwM)0oG-V(>2q{g_U`Q2~=BPB`j zxb#FX>N$X5032&S2u5Pq0Xt=4>lLl_DU$Ok67c8%W{9a%55&oL(>zvin#=XY?qlow zlEYn;ZA1U8p5$xiS*vUQRw{v3<$fQGZxt%%P}sv)U@(n$D|M(oS=ytg}g zoWfCUAlKz7AV9A+NIk2fl5Uyiq+Av&Ut+>uXkz@-=yMe+$=5=QYY6OlFdihw)Py`o z<_oleR-ZIhpYr7MOJ+E)R-S-(Wj^d4=yh-2H+jl$xuu&Lm&X)n-~{H|vu#IX=~s=` zRtImcZ|i*2ci+z6-(f*bn6KA4+1(g7IrP6{i2vWn&i`b0{?EY+74^rQZ|^l*CRW~% z()L!N_t{p3E`ImDq1KA*FY2WH-no=I-9xx!>kEonXAT6a%IJ<{!I`>7QdI$298e=y z;)Q_WF|?I!j_d~&{Sd*{4qD1?j4lsIHT%D`j?3H0MQDBRzOy(WD*~e95T@fb!iY0m z;UerxeenJSnqB}G#XhhqHwUDg!0*BJ4RJ;D?po07KBGdOw_auFMD+`H>aXyYT3Lr+ zODFGrXYV~Hpc9B^xjuGTAmv)X&W60$TCm+2y^T&ulh~P8@48hW0syZb@F>%|8c~7H zbd>wg^tajYl?$}Usfp( zDW$w)8-6=UVZ;1kE&GPGnj$=@nM#Nf=Rs>CK8fESMIc5Fj{WxxD+3+h#$t+ya{RZa z1wWj8C*mqf38fPwDy|KxHDt23kSx)VIh3poNJdfO{>I7HJn=?Px*aX zG~O*fBzhdm@(w<#Gnb@)gM!Uq@(88nh&6dPjB(^d}~0A6|`3NWs21M)b#ME~V+Yzf;; zN&f%<;yK$y0REhQTx~$HTX?EoR$>GSSnvIf2p$RxNn6-nM+_GC3{rn;^%Qg?!H3bI zrmk41W1=(J&8OOEm)owHg*Hi#{+`m|L|FcMrb($Q(*lOBp8%`d;uBLO;-mkSvsyuA zP5WChmobY_K4+03Hf79RnXSl7V1}Dqlg!Ke79Gz{TVJ3Rpbi9BGzSK` z{0+zO77*c@rJOLx)jkZC`bP{rK@-3G2~fdDJyIMjkUD{%aq9-PCRe2ZCnPd_@PUxG z$t1=ZTaLZ`O!LtiH$gM*KKH*ey{NfrEkr9^AL-NaNGFA=t0A1u#k2q)zLHcl`dyKv zF9ph>pN1zRdq9=i+36f|jL|MpzRuO>(#P0#&Uio8ReFw@?ammjj%e+U3_fcF_^N`;61k_E zt8E}Qvn_M@jpx!a_Zen)Auj%b;)F+dV1W}6{zt84F4{Krq>=@Z;2wX-Lg~fx5ww?*p#<&{C_zwLw__F?H7Fu1%MLq#Do|7Xgo>^WwJtoyS-7;u*7M z9Y*!~MYGx#A|P;ML++5Wx>vW%NZn%x>zq0ivQ52W%%M|hR^D&IhKU|wy103+HOVq&MjG-GG!S+M%{gW1uveW(EfbI|(O#7+DH_!?;c+#T1W4hD9$~{Y=FeNbX1{(gShyG7%1S z9j5Z~aJVGZIW>Sj7HU`(Xp~Wu#?MIz1FM7r4N-}}NuNR`^>DrD%ZJf4m_2mpL63Mo zW0}HYaqr%pY<7JhgvNMP7}YM5867)Rt%2bnxxz#<#-0R6Aam2{)l{9=w?2r*{WnOM zB0hoqhgJYqDpwL*Ms6|t{8=Clg=ax-)6O23ZE3X<`XsC=F}-c~?-&Oi-@y_p>s2l%5-Buk6EXxlxd2-eO0FB(_>|iE zgfGlyWxlJFN~q(T89Hh-I{Twy_P;QB8t~*b8iEl84)ttPubj-wufr~@6HdM!~l zFJ#`k&@#>||wndWyv%KFJ zNBnp4_c&G?U2+nYNSS}a@k&GsEy|*ny(Z2H)2%~}jV7{GBx=8DA?vxFBaVfd74gvw z{kd!jG5KyXw2eebF&)VEh@h)HGpg zbs|~f7FZ}1#(^q~4$-$-lHRpbB(Itn+)tSvtLDD5_TF5E{uDJaNKDlqMysDI!7zgl z0eXxzGH`B}0p?B?rgx$4W_@hrUii0B60NoGoISVePJvzN{yskizyIHG_y1;!fV{RY z1g&l6^JTvm`?grwZ|G%b**WKp`+YRwrDARClwV;8oc|Huss&wh#W3lIvy-K4mq>)DYMsnt1FgLKFVKstx zHNvx_?ax}_Nfj?8{mkCYxT#Ri$l27M%fznh7%XTGdPP&en7d2N_bmKRfr=Jy&BOY8 zLWH2m|N4kt`l&DE3ly=+@THt`2syqO;6+c;D*6z|+JyRozu%h*8*GY9hbXdgD8~hc zqR3T~JHAO11_s=Afi&a-p-}BjQM8F@o5X_c53sgJn9Q;7)u0k|9eSp|1r| z-u}&Hj=xw97V+hA(4v>LNJHKFn@fk^5Gz6`wG<@cOcrqdi01A0n!O%?&px8xeJHk~ zNoIithw9hG{IPp5xBr~u+1GdE?glKA;T z5131v{gqRBM{|A$X35z)4~>ocMTOUGjmK^6=i_x3*)k5xybd#L4kP3(r}!=4<1Sl2 zzl4Jhk()Ijk==~0+l*4pFAgFKZYC0gisjACxN35~h(-afS#FzX%iXTl?W4 z=O`-cEV8d%tN?vHdWSiGSH8c}NNzPk&0*i*K+v`8!$HsuOjDz7$89b}iWs(0*Fofx zFL6or!PGdY{M=J(=y)tUF3}?xqtzf;|Cyt-n=_0qG8Kj*Q8GbVfz~y|DO~aBBVQQ* zp5uT|2w{faKM}OTDOwP|*$p5@_9JE44I8G;9-Aj87wzxU$cA{Crd^zR4tAH>&u_2a z!nt(>uCjufIyM&;UF<5fKy#J+%h4SIDHHo^tIns7D{tL(>s?#d)c{Y#mwNg>tq?DA zjTyUr1Ba{&zB7=2o=p4fSK}Oim8oyjZI6Yi{Z-!wz)l7uIq_*%5adoD7a7 z*CeCMD4@LLWbd|$foX#IIy-yc)xkqgVl2x>AFsIZ$JjaZ7BqBNgHg}4wb(8|AG^3! zmzZfc@9R8QL&x;?Kl4XCOz@rteep98tlqa#(GaX|k6qVUSsG}iXKd#lwZr*zk&V}Q zSG)Yon}gJn69GVa3BKR=quQ1zdsjsJE(S(>m+~m1&W46(QW;jjeJ287Q;j z-UzW{Yo{W0J3$}fFz1RFvGHM?7(h8mMCTJ9fkQgC>apl}7X!Hx%Nb>Zm0XkKWb(?D zOcVblm6j_tOU|P{L%xJ29n?Li1Qmyt4WHyQRlv2dCyayH6ek4}AQQhQ*(PJ4IT1#_ z#1MC~1P@4Wn9^K0W9c|WH|`K^oBMmz7in^Fn?O*_f*h7??0_1tTD}VI;?=W;Wn%7( zS(C8TG4+4n4gpIdcloT16MwhVUX7Mf+Nv4r0h(m+s$IPn6K*|HDrWA=6ie>4-)hx2Bnx3`(6 zw^?Xjx=yl?6je2r?%U~a)qT0BZvBS%xv-0eS<@b6RmsLFKVxG$e1pS5wLVAtGKp3~ z#yq%(Z1+<}HCF=jV~GBuJ2Ylg-OQ>D%vk5IfWbN6jB|nejYiv8Lo8xB`FRz+{p{xz z=keEdSgZSqcW{6+_{m$H&;j)}OWk+hrX?QDN~Ow4uW&-YaDol42KX`;X5_sw2Pd^_ zR9zS}?`^p`zsV2qlaPdxkYL<-tgP1;5BBC;RPXy%cSvMs-`|}CLVJ^(EI&il7<-)L ze1Qb~#n0`#!-W2&Drzz6?LYO`_nwUJZrT#HcmVx`X{ihEA?ozH8`gaA&Kvi9S#NXq z?qQ><6KcZztsU~JOI_5$hKJ}u=c9LV6(^4^$Uh*$vsLR16R+Pn?hzD$rCts<UvgyqKg-=RQew2h#|8g(`HTPk$Pc;fOA&2ni?1{wDQ zjdSh!8vptgbD8{@L$H0q|HIZ>hQ-ls+rqfJTOh&R-2()-;7*`%XEtPQ9# z71he5v$uWEy5lvh;o(!$^u1&0^@7HsqmJ93`kimKKdbbA=IFP-&i217Qa*waKXCew zQa+~7JUH25)_CK6IBB=Mq#g5on~i}9T@yLMvAWz!b~KGqF|7xNhtqd$U;ux=vb6^5 z4QZ-}Ojf=oFDH^LGH^9|$6~HD?ngHsx7#lIPE~UJ#i|EMwhzB7ZWW(@XK>kCG4vGs z2#oK*GJvMMEgXLv8HRp|gf01IED)Z~kF8E+Z>=W!o-gzmhR}U^ncOWE=8#6ca zN^7oSEp4JLJq-S_4fdOp{^(@us%ER$-_x6nym2ylwNhJODYr3}gJ6susy3t%Mw>>{ z;3Z2%9K*l-rdz1`^S;MhMd67v@W%@l%rMyr zoM{cTb(|7D=15<U43C8j{1wHZ`?5$%@NZpFYd%|7lSA|Vi8|=z zQ%_bg=Dk|_>1`v?Fs)Yr^H}Bvlo=hJ8SP^D;&S-HWs^%XW;=;si)i=#89EN=YpdSp zb+N%`U+r7;A@oZZBaDvSB%-a9HB3+svLn}}%}w z!$1gW8;EF|c8lw`=^K_|A<0XkkuVE)VBR|wKKUS>J zj(l&;Erev$n$G!YY355m`WH<5-tXQX@{%F2$x6ZfUu#bgd2jG=dpKdD+9MvAoH)CZ zXIMrzd>=9>td%XTKswc9vlu=@Tr>JRtVHHgi)q?Y zOA61&XqYraRG5d@#EpN^T;rZtE{w354k@{Gr&dW?Ns`w#8YC@EM z1qP)q@?jTLy9>hWYnC~$uqY`1QFt}G*;fA3i`{G2=wPg4KHIaBO{iIH-$?BsuDw*( z;B&W%OL4lnnkR~sPa?YqgXx~C&}yPjF2l9C*HCC|fg9UKol4#mWMk^0ck1V0@uKFq zdl8~nVa}l<_P(;%TsFm0vUj7HP%{l(GY?<0*tW9a#eU-!&oPtrqGrgV##ntpCQ>|r zQg*(t^?Okp6r{yvP|gl3r5mtpIVM5a2qA3Sm~VsN_3PT&T52kCbL%T}3mQw0T^5r^5ufE6y`S)SZIU2}M} z?H^J?1?pHVHMn$={RAXP-pto28l_rm9M@yF)tD0;*P-3nwo9q5Mx`V$Bu@6EmGPL#DY3~(s#@C2Wwe_~2@|zZ z6C1S?;dCI0q!jhe}X^U2A`1a47g*(eqy%H&(Iii%E_!L{X9 zS0>BOQx)vj#Y~uW)xdbop!s|Gy!_5TD{5U=g!7LK!juXw;_*-{#a)EL77C@m`y8J> zuUb(?t>V6Q6=d}k%xvDYnT(}T_~An9vU_fEGw432nFg#^lwM0C*>)+PH-%d>6)&@! zKR70r;B^=M20J<{mQDznz7?VH7eb*_T}>84LKeK{Ji{ix+f9&gQgeRl3Xxbln^NcB zUj#THD<2;#)BW^=eemqeaz%Naz89)V8{QQ>*nvs1ztOJ{{ts6>oz*WT<#X_~s?0l~WrbJ4e+^>qr1kKYE3q|F1D!Ow zc3i1nMF>0ZP$6&Que@A>+2it}@sAA_@BdU-_u?he@fgs5%i;odDC`*`tT^p(yL<7C zh;1PutJNj1)~#~oe+uYVl#CGy@_K&rfTW6qG!}-$j#O@harJ&e0mnN_5k4eKR`!Tb zwz3>^IYy`UTDJyM$8DCZ#0_*}k6{eK5Ja-iycRgsvmJa22oITHf1G(NK?-Pm5PV~~ z=hQ@&2NH)t=Yi=Zp%kA*T1kEYMtFtJ{a=#1g)gqjIB!Ch^n%#l1I?Co#{MIod_m9( z)3=s_yhK03;@j8iVeAWavM=ab5IJj^5=JE3kFD$M&~WSe?(2wcf2@w3aayXteD;8; z#^*tMOAh-NV;5S)tlJ?odxn+-g92Z7w~pE7y-l!y)WX$vRq!q~7GtCb4o28&&8cZ< z)l(a$nj(ac1robv1zL;kviTO=)6Ex={xJrQu^gV!{%P>=OS`Am%BTal#L4fexuvG2 zK>vEKK8-E(E)8bTMS!1IK%k+Xzp0_IzNx|8 z%k#>;zDa=3gP;GJpYM8hX3pG~kn2Ca0Lv_jam@h}Q&UqT(;lOCH)TncPURgdav^$4 z^!bQwseQMjco&|dDyOYY@?3FTOpt5m9;V9j^Xk+kLsh%P=g+}C{$099ltIuNu`_Y! z*R_{C_{WpuTjr&v+Y|9|;6QS`+y4V{+sT`G-&NmLweTAW!9DHz)w(~!n=2hDP|)qI zuc+YK{aTj^$~Up4LzA7s(#6x+%~N3Q17RPV-LFkOUvE{_!IQ`Y-!r=)-7vhKHoJH4 z`fH>`pjbj*z9b0>6kYW#4`2zc%abAu2ep#mg2FSQU7@O*;sAgi+Z6u+yNDkUL`jak z&bz)_ab~S{*BbLE6!+MQ;ZrAkqcy2mHk~QP9L{ir8|F{KE;NU#f~)y+vHiN=GLt%`G4pcKP*YIU zbusUke(x38T*X`3Bv|tZY+m3WFsGKcvQhAI!5b7Srg*@ru+OY;Eq zZ8#ykP@m@dGe}V2rsDjhYxC*defuukZBB^d_s|}du1`mwdBCW%dS?|}fqDU6dI7ik zpci%c2y09jMDiqJF{d^W1U;@#2K-t%$WKs7TctGxqz#vqw?QKp*?e2r0z^UfXdswF?~sm}H+Ep4>5O~R=c)E=E=X{Z;wmbqFoHMhZd zy=~RZ%+XEA(KYy{nVF)UiC*cGn)0gIy_|Eh;_uy5eRs0F@g;|Hh3S<^&PO8u0jwx( z<~rQIb>lmD9ID`WztJe_qLkfCCsA7Xwxt0^tI%N#m(SvCYauW8%XDMg)~rb6&(Fa7 z6n=h=9BrZg9Q%VQd^Lf=t~F!c;4PR5r$6j1SUE9KdTBm`+UPa@NhnY-2rvHs0_pz` zuI@TDh4nwwF1L{l6Pa^5<6ZU{`MblNNOY*YeOwTg$rL&EotM~77|fHruRQ9UxABLB zrY8;SKucINA?ql?>o2{~UwV;v&G+1hv>`BrY&;8B%2+gs(rRA0!3p0fWPg#vH__!6 zw*Hwk-Xo=uO(qxXNlG6pD)^;7H4lJlgCZ8b5b42rB?S>h)fSW|Xab(&2d^WUZLONG z)Fp6MpeJULfTXM+L#l6U@Z|^KPz9AsXfMl3{FqcwP&m0w6^RB0;L_fxDTd*4)U+B~ z`nFE8zn9ukcrQ`V|CLYBkUsx6TuP8o;{HrEi<2*SnLo1gQwxfru{ z#0oTLuQHHv4H!oZ@r`|X^~8N-35gkus(Y_g78g%X+)+NQ*X+fT!B)ESU~ z?=f<|gWF%y6Z;W1R^XW;|2fnA$%qZ$kTw<#5>en!)$@12@4otob} zK?R+g9)aNzFyV)=Hv(`+H17pv5RbZ$7jXAMfzLRHVR8NiRsIDz&zKUk9ym91&qp** z=P1>2C@>KFfD!u_EVJNNYIZ8jO(fIpZ1iXp)VO9GA{X%(a=al-EKF=HbaX6qOsq~< z{wuq)nd-IjrEk>{(M#kKCecsvzMFC<*Gfwf(VE?2RFsr>M4s%KOe$g!o%9m(zrCBeGZOT$v+Yo>%iWe1ZWl+6<*{?dB_WygDsGRF@LQ zMpEnBgb$hv=JD#R1W~~==teNw*WDY_@q^ymNkxvEL1dd26}XE6k-wTelQ zb4`!~;gtaS1aU0~(kwgCERTOBh515R9l7JAe9lMzNV52ueDQO}{C(;-f5@?443juL zuLSuQzUvIDxMiUvIux{zXsrM;iNrd#0EBynuE*-Z3>B zfE)O#YUmq!V?8X`K1$}Bi)SN zIDKNRGin@hT@XlK^>e%)ol7>wKR-QweerpmTV1m*#tXQ6uy44##WsC?46nK#NjY$s zFm@=b8?cxlChyRzcbPEX?2CpFa~O2)MSGa~wU|v%15d=Hu&xx;^~!ifMxJb_2>)>F z$@@S~9I^$8_Tb;&OI@qcw;r_0>f=;)Cn7)GBRM=s-P=z+VB?y(pR|~uPNe&lah*)E zNkhV6;*gi$`a!KvHUHV!3;k3!H7hwslsQw=6XNhg8a7vn>rdgvDFOVOR&Av<{is~_ zKJ^r3TJnS60h~-E7N``+RL+s3Wu?-oJbZmx^zySu0@HoE9lc}f;k5>F4h3@jaAFoT z#h=0!t##&HMF)u)#jk)~>ac3%j{|zEZFV8=nOR}&2 zsS{Taq34U{FAk~xG5LOQL+rAh@r9k(ke!%Feqrn)gd<0YlC--Wy6xKYyV-0#9(Rt0 zrc%zi>cdL23lH~&mBrR|1PXhK@AJd;K!!kmULIIh_P1ud09eK-8U-8hSIl-wT$kqu z5B8K{Ol)K^-AY;KmYRu+rI=rYgdUd<9$;@hncfES__?aph-McWYVHf!>Cu7I zfq{|;`;SIocbmPWt{?d)tyzs}i+hI|2m7h)`WC+|;ujJ=7`hWVPUyF36LUPEm36X* z6?e6cnQLbCSqTdRqv(gj(KHh8jDDNtV4h=iXZ_=?#%|Io)sl_hlEbj=<*_wuV@^Z0 zAP5{VwDdIXiBsH^kyFDd0UXc%hC>ou>Uh4wUQ}~z61?uY;YpUrY+MRB2tPi1p7xBM zO6K@05rjLY2bKUeJjZO`Ox>;TAMX?g!t{KJ2Ts$#D`9U7iygw&m?vV~+cRiFv^}w@LDl6ZQo9oQ6+8G(yG4cDg!f>fim+~@ zU*Gb}wMT|il|CDGlM#_s3+vLuqH~5*OCw8jblqdRxLVmvdGy=n9ILv z(qKes*YH$!eNoOoTs6?em!gBV*g_$K~qWo6hKKJ^$fhPR|^(Bk>TDDs3*` zYf#(O`<~&qR;OjD?MO{GWW7G5y`M=}((TBhKBUWk?NNSDaYCowLg8iV`^#*wpMgOV zr~Lyz(*S}z5P8WRwb(>IYk$mE)xhPe+wV=*cf=QS&fOd;SD#|G)p3pcsFMG5Y_56~ zBieHmB15?OO+2^rXH!Xx4RD>JI+~fDM z*&^tr!4;-`fZ%D=Uhay6O;ih&@t;%2|lGKG6wTlG& z4U9fFc&G4?HDi&;+sv3Q_lqhWU zwl|*C;-Z|v7l)W5NaVNSEx#7| z?Fat5;C^YixE%Q7u1kjEg!A`bq*N)f#a%@2dQrcTdW+IBa&B3u50q+l7prCqkrGgN zGjDATe(PGR>kkxl<9*VS>{WO@EPkR^18&e&B*sMx+%rw=qift7 zG!fSz-|5E()YU@c;ecC zzR*z2XQ&Eq_P^=r>3Mm1>Fev`$^MY_ZxQ-TP95f1|4hz%Xpi#W2>R16xQE%Wu<4od z<2grQ&FeSy)uPh5GJ@)xo|B;t2HY9xSR+uIH1>K{YlCDSv7X5Ilim?$vo%H%zL~Vl z0|y|;!tGP1j^EUNjMxnzr2#1f^$we*u&*h1i&xhT~0ty|Xr zkdW^}gH}oS_`=c?lvPIyfCZ(O6PUZowJ+YsE3OI9mlR!Cx|( z+c{|*m$r>XgiDJ?y8cQiLH@4@AG`{ILl6ifjzB0fg(zYW6=gDON0v%5DL4#;SD^O) z4l+!YS}0KGXXd&`@2uh1yTJ3JvF~1}olQCI^2Yf7v$q-x1Kxv~P_adig6qzK1o3}~ z+W!dt-m3&8BtHC{R~3Pus&5qnb-mP#{GO|H{v z;iCiFf9i}#NZCh}`FTQm)eA!xOH>&S zIx(+|QTDP*7C9psb}h7aIlE;7$3(?RkGsN?kgkol?d|vP@28ON*TmFo8C)0}XwZo% zDB>%W{`f-6D2*Dy6(0j9&4`#p7s{PplFnY48!4$C%4g9rLZ3Ut|K2? zRDs!uXd5I5)S;IEj~3zyJ;pbHx1(*i-DkSzB6KT5#W=t@n^UpRVUZ84#G0m}zNcl$2QL z>32ecpk)R~vj|(qzf6i;X!gFTzs+wuTnt%|D3YM}3DDnMmVXx6fqqxqF4ZhXNsW}D zwzakGgF@{@W9R4f*x1;v>otp2nUb7_JI$OeeqS5xE9PWY27iPkwN0$gBX~-wKVNrL zxZY0*{5n%f#1*(Hih3UMOH&4{H_CCb(Zj>zc_{bK_CLOKr%u3G%WoiO+S%PbKR?(z z?^w70@{_3l=YVeN2uaEtYA>BKa-Pwo zJ-r&UUN5PMOJPN%TfBAja<$_j`JgR4N7%=?fd*9$XC1E|l721g2RYZlg z`jLa@c!@u~_Z4htXY({vS|Zl9=`&yj!n&oBA>?4{qW&~ zhr4?lrn)j{#H$B_OPg%OZrTK1HoPW3JUDQ5ch}k#`n1^JAFhYwAW2-m|4e3k+LH_I zM+glK{rmT?TpVQZ|!wDI~2Y`PxSPmrOu^jz0|=f4J>rW1DE zLb)K0|w-g$fznM_w-<;qc6DsWI2w4SKT?WdYeR78*#8{PrJ>g?e6oXOx~{ zO%0xf?-<1Dx!j38L!O}RUv(Etq%D>84r>as!|p(m43Q-Y&psX+Z~<*KhYWZYTenQ` z7~2Z+$|_m&aJP}zGLV#}=rh%feAn{XFpl~$600k_uB(BFhjt=>wDL}vzOpEyyfn`) zC>GU{_gytbezd)9oOrg}SHy^eQq=HsR(MjP75(8?= zD9I|o3|I_jTQp0W4d}|a)4-py|A#@ovI@+uu2PYclarD8T<(l+Y;2GVfJX)(*Ecss z1qIVHGnm-eaj~(DO-=oP-Gzk_5fIpLnmBEq-S$I_f4KtzO5eaBIVlMf0|NsS6NoS8 z_fP1=>^3-`s2BzKMMXy}xPe%ik)AI8J&u0`bL1+wglkh6SAajC)$R1@=YiHrXP~K) zQncif746o+;bG_f4td_*`oKU$V&arxUp9^a|7{j0Xy+8zb-v9qR0=klSio6q2Sl`YdWBf3Yf%%#WOtm&g(X|P3-2rmE?2f6@{)r zBRQrdsLB~MvSb`X;YCmRBft_VJiFV>qPdp)re;!=Qxir2s;Fv7yHa?j-#j$#tL0uWkR;Fh+*@P3x=3;{KlJKZbCI zg!YY7dl+4lD<}fEdKWKX`w*1mWOiWC-$^=-^b?z=k zPgl38prD|*7&#qcX=PPrTDTI{oC@9UeU~yEItaXz^$Bq}=C?MRQS;f>U?T9u0lXqD z9)05dc|X;7hJX_w8B9z}klCM{o{o=Ct82puS|CqoPJ%3KK;oP~ybNtimn_Wh=o2`ZB&6$nY+U;lO zA{%E5DgXM_0^}jFjQ#YQA&R12F@^iz#qj^70;U=zS4|1@lpm6hd% zc5|`{2+R!)9VDuWPfSj73kZylj`mfTu3}HM)G(-J3knO{+1h3ad)S>I8TSgRWsA1B zZbt#h(I^2r*3Vf{RyNe%j||pzbaX^U4j&p)G#>@b5DJBkj*g0piwE8hoBH|tBO@bM znY5Sv{OM?ES@Rj%poQ!3K(333ojYKKF&A#PEJlhpb~_nF#bK9e-p2O za5NHqGVqT|ff@m>Mcc-tI**J;esneTX!u1oEJOWlI?YO+@b)}tXhii-}7c(Q(dP@7%AAe+D z^Q)Jd1|Arb955DpmWf|GSNx^e`S?W&WcFIMO-pmf(<(7(IK?r4}K zok7RU+Q=9|vFp7gT>~%*NMcau0*ouQ!gXt)Sx$Yr_G9pSa0O|P!I{!ut_plLa1Xi> zoK4KyBt5|>Xj3JE+!wo(Qd&vszl~`BVHij`n6CiNg}d~j0aw)4aswM?$L;)!Z8UhD znv7!mD-;0x{^678sHw#P>F$aGFA|}pCO7vT6&2NFxh}3ZkwY7C#7k`N{G)-Ydux$@BRU~fK#CtxSRXi6O6bXuswqEKxt zEdSp5TVQihvk40wQd|5jxncA3(Pk=*z>V-p_#bO1Im1b`%seL(21lPa)nWZo5#cC79l^z~z_VsnXW~5{k5WJgt(N?9O9l zW=FqvwqE5XG^+lId^x^svW!uHDP{-s9X4}?O1S`05Flm{xhk%)v$N`^rY70gU+@&& zzVFu@yuDLLtrF!6e*E~+A`MDROmwE;;o$+$*7ZIBv1g1s*1~kvf?CrDB4cAsn!s5p zDa0c{R$5=Ev)&!g!Nv{=3CWe|6`l!Cx73wBY)xX(9ooLwr_QJRr}q&+h@ADjdUEY06(ZK4n7c;}4!Wkj5?Z2wN*{%LVl#dwLRuAkxVIn;C#A{Fu zp%E>98px>pCMSVgv4Xo=}ZDkmpK41ibX7Ibi}=3+|_G96b2~J23pWBo72FoC7Hf|L|n^audqV1KMLi8d81STq7VKQ zQMT`gssya*pR7T*Ujeouk^hS=~Z`1sa z!u_}{@^v_8+gmE7hOOV#z(v)eo@ck$YJNBE9!-eA0`S&dD~0{Ah9H zXQ0RBiWtI+XZ^ay{uHT6zUFJq#*ES*+uo&0OC=i zmBlGZKO6fP&bO%wf+#wa;n9KRXM;gcr5|DCa|Az(Q%r7k3w@CzmYHDf#V9vwO&(6d|NFH97^jlNlwYvKHii(P_?BMnFb#x-uv)kKnIwkDzJ?W2^rbY=qTWGd;$Va_Vxf3D66V6t+N{a<#Bj% zdASZpi-!u4)ik~Q^GDspBs(rn?ZXE|gtfnmi`W!`lGO1iPCNs@*bEyhnw#&ITHKs9 z#B*|zlVz#npPrv1)%bxNucD%2%lr4w9|DvQnO`9FwPSG(c$vSWazx>8t+K()vJ;8L=oG4fFoDUX$0zjLdJeC`Z3W*oqlP!qhjCl4RNNA}lPVY)Ec>2V zEb)z4QmGYzB;Jwn6&t8H{X!LA0W<-C1Ukqw?72pQ_7ectYC_onOh#Mo-4vl=Ub0%i zb=%M7n>Dn~6>2DB>tKei1+Q6J%hLMV$YVR0eKl5G<+sV*I_>uT-1_v*Bo8g#K7bZb zv9Ks9D6|*};^X6i94>P$d;Q*|9|Al+`}q7;Sy^3`5E2p+6!d<$vIQatP`sMw5fWNh zUT*g|)L~=$2}F$(@L4lJye=;yVi$VFGpkHiFiE8 z!`3@pUu0&e7HGX!SWl^tIwiB?n0ji-Uu3qOB;4Z8aA{{Hl;Fj&0O(<5^{i<0L6?3pO4?H6A83JH=Wt~BQaixpLu2pUJ#{p>!?j}7mv!bdhyz??wWqDvg zUQaI-xJV%GuA6*856iT)vt#c4U1`$JoTPYtbv5sBv&VSXvg6tU+~8uh9N>NfA}a+c zse-)xpV`^$zK^Wj+zB$&0Aaw}_<{6~M+Z~^kcsqXab?a1)Tr@!&CYE5C8QxdX&d(N zxMMb%VPN(h#*haC(yG68`dqBC+GB-S42FR0FP5&p$@vjpEFR-5a<{?_CzC%QwIt6mES7eFCHa(g^!n8TU$1<#Hz9SeQotR*$!LjL7h1M2T7MhosJPN zG#?Iz!EKRoM~{ldK5%w4|B+7Du**Fp zMn6#d6gfmJ=D@Jj_laTst2<4VLNq&LMeysb-+}m0diG0PyG`KL@PX5m6V49K0NEBa z7Ttn*hE}HGQ%xtJ=mHTg5@1eGwb?Bau?sCV`*r17iLtuTuMQluFhN!+55&VIH8Aq) zHum<#MMZeZGk^ZzKx8u}4);8kNLb5@gVUJ^(10R{M_0u7E`Uk$<>JQ7F+VtixYIDC zKtNa_8_wP|Q&5NmXji1n1F-o?d`^zUrZzxRc6N5oQk0F1DBk^!8LT>_@D?}Q^V%K1 z*+`J>8X3KK&<8s_G?0l<(T|Kl#6I(PJW2B3KfzzGQaTs2IjdG4dT*0=?(>x0cJ;6C z?Uk6M;=K%M@0Ld>SphpkwQoG#U-D&3efZF~(H9-*m=DI4!zh_}+g#J#-TmXoTf9hM z8T?37^%30I{K7&)e0*uqtAhhOfZjvQi^$OT_V@KW1H@{qO5y;FmI^;G40#pF1w5wavO5~ z8h+SLF5=7M%Eg~cKP$u>DsC1GC~F%q-WnolII>sU#IuWpQmQifdKLI`Y8daA1`&cR zoFy%O;k_SsFI0Q;i>ua%bb-Q$Jv{kPYJ8nDsDB=;GX}P56rn+Hjtqi26Ngg_|cE$u(7bFr!8mXD9 z<0~{V$Se5!yE3Z?v+3$yKGxir!Nf_tG8;eC5*wz32^o!F>WakjBu~t;Qgl2WUp}`k zDKK6SIH38RZQ0%1RA4BTq(@YdKsW-&%1Ll_AgIi80B~x%$hi++bZS`+$v-9NWc zT4#+;ph&BsyKA9}NEtDoG=!I=LZ{SDvz^hbRI8C$k{2GVJX4~@x1Q#x`6smux#xki zLbveXW9cu>3j7{t9}Ig$JmI80bfNzRmHw?ucd+G(Zj z{_Y&)(RIkyu!;{>W=^WqtNA@K@e%$E;M0Jz5QGExg1VJeQP}GIOu6ps!(6AUU}i^$ zxCg)er%!9$A;|3P>{NkIT!7g>9998J^)&vP4J}?|P!sQ%-CJ`q>-BeA?Qcc$&MUbb zz+m<))wvQIg{`~0J68SLg68JbHE6H-IZ!5Y2OoJnVV(!e%DwK*J=V(Wocm;x3S6YG zgpHDLrAU=tM6fadQc+y{-rCQhU$NFC!Tz`k-XPCZ1$bQF>&a4@0bkqi<00V()x^Ba zi_W~J`FV8ln-n@15;u9Z^q(3LKK}gr_!FQJPLbppkHC&=;G@Ahmz?IZaUrGy>NX|; zemPQWKZJv2aeNK>2ox%} zwhA;#MZM3~VtUHP;ofHgmjzUce(Ke1q`U_)Cq<3#+5?!7oE*?_0g|SN{V{7NEi?1$ z2c8rTQ?RwQ9Cdu7<03$55tR^B=Vbijrxt-)*2@6>x|&vpo1TJ;bf<82VfItq(){>| zpWxr4C6Xs5_0>-@z7MLJrYl$ceiUb@c-HIuskpvb@#GB=K(|o z;M-eMB&U*zzn7Ei2YyEY7?~nLa05WS)6Rb0rU>}5?mph$et_C^5Xg%oq)s)^^M3LW zP>_1>I5Dxx1B51YIJy;2q@})E!5{o|CS|T@G{akeri@cbD=U-* ztjNY7bjEqn`LF`X?kVi-#nH@w+mm&E8LLW{>i^WBnEN$`JPsD0y9)x#9mD>eyKm+# z-ur5q8Rg*bY3d)^jo)u;Zy>U}M02lc0I>n6Dqv-QWvdYXwm_kGMO$wtDjRlgsVB8C za6D;^x;-8`S<_2as8@ue0R5a)_3*iUbotBxeDuQgmBrYcry@Re)1W+K^lV-6N64``L?D9@Cs zH!>2i2@1>>Xz>Aif7^Et)~PDbKuQ5Or_vPrSo)w9^zQI?HCACQrf)X{QzB4IU^dO` ze(gmdzRkJrB5axbj7o0FM<8X zd&pY@!hbN`zheW?c|nCEAp6M-zz#rR9*}B3e*9=`Y%KF?XxGNDL;@>syQcp~HD(Pe zEG%rpOLo32rfz=Qsp=oZ1JmUmpf2 z_)0~(xREt141VLdr}CZXtAE(PK3c&PDAG_dk^lKRKpz}r91$igAdAC^Go#3X{HpfM z<^pmHq^NTP{q(1Ky%?eehuh%XN{O~D6b2wKkwnU*n?#&>JQ7XvOkKWHfCoYc=%;CC zN3mSp3zN&-zmx_>qG$l5Z}0BjqE{3EiVNVv08n4w*x=^n1?oD8hs@C4-T@14Ad||| zzxOH!oW7x<0Vwy>EjZ|%SGTwO1A=+o^fzr&wh5h5`ot)aD^Z>`o@e}|PKjTxHZt#N zyP!u)^G2TH6uUsN55-gQnbLX-%IhpfZ3;h;5#2*XVYdl|lMEGV~O!sj7OC5U{n zHp#JLd34Aw<>w4ogj_9Z8CJM2TmkjdU&`DCqzQ*{9vj@)m__yq87!7jNZPR~ux!h2 z^W^)V3Ro3Pb?2j22dev8eehDY0n6C1C9Kv=HpRjU`Z67 zbUZWySIC@}R#}0e>r=+ScF)LmPOa^p$c#7DchCEgR7Fp9GX-#Puuzz8c>!7(;}_=I z>L})tJk&B64WtroRB1-bC=2D97}&gYx=Jh50#*}3wvI2*s=Ua8dKpr-kFtazNJ^}W z@4o$_pFL4?64nNM)$d5Bf%$zHDszA6HlSqmpc3}@?MIaONYQGd6ymp))p*@B=g_-$ znT8k5l(Js*jrN($minb{z~Sv4P~Gq%Ql<1b*(tYlEmTD7wm$`~icqW%TUGYHjGd6E z`~$LsU)$hlBSP1K#tJxl?Vz&nqeH~asfsgs8Vws0MH&t3IuCP7TY@NWjOhkfm!0`5u46=msS~&sF9tt0eBu^ zL3oO*U#VU;Ey0xb#wtC3b>3Z8(LZW%aByd3*R;9#IdZ5oevX$vxVw%_GSy8Fm20dO z*n#g(&}tV7&}^V&qtcI_?h}TJp#E%v!eo`=167K!-(5+K&kiQMvT~R5c_TnXOnh4x z0NUK#^u0MsbJ4p-l*VD;;K0^-hk=HsQFT(BEu=(V8D0{FqGV!cZx4t-mw{rKKWL_( zA8#A#>m!7N5KJ1~cE|27cgMG_-5%foeI&VKcQ@hi?U$Bgt@X2cmc9A^>$jQi>_9lw zS2f*T@?G2fb4H$lXqz5Set3E+&}Ulr2q7dU2DH;aPmQRxnyBb#Gg8eoW&Yd6cih%X z_s+if%JXMuoQZ?elapxZ=;V}?VRLxsB&4M8IOXJ($HpL|0j9mbBcMi%!qlXE|E)N_ zXZd7f+Z_9ArI*qf)V!LSv<)^K7Hgc%wpe`DisDEl>#9Znp-)9`NYT(JE?4N{C3x<2 zth@rs>Bxw0h>qV@9d|9XthFU&kHO$)2?1dn^&64yQ`n`W^8pjKx21+Xfwh2QGyKQc z!!wO5SOs7p@4>9Ym>iCSW>&4RVHg5z08}qw@-2yk<^71F?VL44{0E^$%LFw^S8+3G z;`25}0G+gYACCOqAEy}84^VR6;ICsTZEH|kjQE&$2@@ZJ$U#x%`ckCP9EF#(7`ZWN zdOeDjAbRboJ`Ek$22EE?hEgk2*{Sm{Cx4>O=YfWzqsg|j)Qnq) zyVlz``11Yt310mW71iYIdn_2U9I#OGRMcZ8M4SziW;1i{wx1Gr%=(W+jQf#zi4qe& zh1=bU+f!|yy?+0l_LN?AXAkpQ)dE_MU&V& zb}Kh}V(%DC(Ioo2_nTZ9XHjW<_dh$sfk{TK6Qra6?fCegZ+RBXe75fTuaYVtTym$y zz_hJsYyw0dkncxEM^o4gb+ok$u|5IqPeAP>Zmk^-9)7Mue`lK#oGBLWT9o5(xqm(9D92 zgtT*aAG~Mw`1&q{+1qX8mCu&Vf80Zio9I~ekj#7g(g%e{$b^kPmEl@{=QjkA0odSc zqeTdEKx|k4j=J$&@1<@cWke;rUM`ybE!gx;rccTeNzL?}7#2VVwhX8>+hP5GCnyO= zj7^{xIu7`M38s0lPVr&q#*-eM1iT$6U>E}WYD~r@z|Cm`mX?=ij=O=9ps1J_p!=H| z8DY%fP*5mS$LHncy%4MTE|;Oe7XvC{P!J3Nf1`;xI+%o!kk>Eods)A_Oar``4sUR4 zi+0O(EL%*86=}ng7Eb|aI1>@cXuculMUtcEf5VabqW4bVCe+tJ?v+JC-#Mz~$S)N& za5h5YCmGAp9@X=2vExI3{mzb#V|TD}p$1SuiI=CX(W~G(1(c$gB@!7V;H$k(sY#TY zUi?dDbUYUGy@>(DU{zJ1C;^lv($mvDJv)+P{|{Yn9T!!%z7Hz`iXbT6f^>s)ONVrK z4I$kPBAr8bN{7^dbP6&wNcYg)E&Xnu=lGoSJLmiI;Sc!C%$~j1y4M}ob*+1;cGr^d z)Y`8CfDO;N;pS+j{idZIh*_eORGu-302lYQ6&^%4ln4Qj_uTp7?5tG34c5^i{46ca zI|Fz`pzJbuYbGyl_HQYm5MAZ0$GP~dIL6IjL8NwVW3qO=rq)3%hX`dp+jn%Xt7+J=pI0Re-*>_=Bq(<;prs~aHNXADX@ zW*0X8Vx1l!R2MI&W9`P;gw7K=xI(I)yhR*W9Oz z&le7n%Lt=l4eJ0>wiPoz4^tJ4R3h%KO2)VSLZ7EEF5-whm#-JaC&ep#ZYhNxYRM|+ z+p^XqzO4h9EbR(0iZA2(Fc|@)p~)q>`8z7bJV);mzTCa5XF+)u zji&STdtM$4_VjG+?FHNcVqn*Uc};-&Z+1Tg zpu+LE?B1Cwlm4pe>YJOJ3HevAUJV8kc>X?G#?kkJ*e!P)9oae4%Xm|Bg_oDxC@Q|u zSzhl?!eP|;-M^zko6zU~9F0+@z7jZm7&=Vz?sN?Z!9eV1Nw369YcF5txPSYe`ZFiL zAStPkwsx9uHbB+L3f@%n$0iC@6omyxWqojDlF6sF^k@X6btlhe8Z|>jSeoGBrgNBkAGc0pOft!QQ&^!%N8k zkyD;W&=_8<5+}>wX^FP^H&$8jdE%61J@IP?z)=AR?AYZ4P~x!Q&wm84*1}H1m-&6m zePpq!%`p!dC5gV*9tPi>I()kq?OrfHH)%g=BfU8e@SOlI~v+b``y@jXwo>ld0@1@ zU)8p1leKG_wYn3%3+;2D7=YrY*wlkkc=@|Cp1yZwb)4VUB=ksqPR9L(0@dZUc%>Vk zv~=EBFNp(y~QQ=94x0q)Th% zOKRlHK_Qk~9Tti8ku)Xw$R*ny_yzStqz#`Xr1v9@QyfdIY}GoCb290$$m(`f>nv6I z@SsW50ZM@yJfx-g>+0YqIx;*RabQZx%a2hPXkO+HJl;@KP z%{oZ%CjFlFlxj1~CbUPFK7BS4VCX^5G90#gpGHnCC_@U%iWs zEewg?FJF;y)VleVg>PP+g`xVLbr870fdy2Z9FV=I=(sOC*(GX^!fidA18Ai85I74= zKVFn@F-=p^Kikkv zZQNbDsQ~nPf&Zy&{Y#ARD_8>e0JKx0p`mdqn5way!pFxaX;xKGVCJWI|GuiYIP_~1 zOm7v~)By;kcHUxQ>;ueA@4ADeCOaEja#|Wjp}{Jk(~ArVAz`NfBv=r0I-#zQ01ppz z#Xx)Ys(1Yac)K}ydnX{Wv1~U4{5zlx!SB^!#F68~v9bE}DWre>QB?zaeZG zJ@03pskwfvVsHl`MORL%)s2TQI=aqvOe3Ng+7IM6_J7xMUG%=JAQ*LcIBBED{-{J6 z)@3wS;pH5c#}8-~T-JKts1Bs^&E`f4;G-bMS(#`G*e$g`L*rv^ke8P3TML!Nwg((_ z>^hmPG?8*(HI1ht)0g=8ctFUYK~MR@PwSC$gf)6* zz-1yRL?^~r5Jmu;fQOeij;yG4JYHZ&yXH%-MdA9!hTJyLtPc&?=OM$9>3q`Zpw$E;wzA>04rkLJLoap=H^%J-cPhJdsg!7TVyU7_4li$sBkJM@YS-%&UK0eX4 z{Vi-NuWVSOS~1rHlv*e_iWIYP^4M)lk%SQ9$J@2Za4(YL6R-+=>T^5P$9vv7{`vNm%WuyPY?3_-81A>~ zY90y6T@=vJYg03bIQ~TOcLXQYR67JD^%t%|PA+*#hLO=j#N%wtVItV?-8>@7zy5&L zl=EwycU>*$&Nm5duU2|-kUkuzACr-;uodt?3HQ3X_+gnlc zRieIl@|5HW`~fmtkzBr#e$`t9e^Pb&)YqOEN)=xSD}i5+)7u;_qkhGzGqKAOV@{33QG4O-%^3m{>7W<`&p~At`uM5;h$W#h&@HU|OYw zb8@VFJgIq>R=Z~1;63?Xu&v8ixcD(Gtqe2C7>MaUIOE1^(ZQK;Ovqz{$`Rvqe8WN| zYQOLEVBnlW%wR98rjp|xfRp2GnCtPgI37XE(f4A189e>_-oN~19833piw+e*#qkWnMYe&TTzkZ{?Rljs^#JSCR<_a zE%1$H?jT@G2yhos0@t6|ctj8)`&pK;Y%d?u7V~H++p-C{Z9lu76sA1Xofvz! zw+Y1az%UtaP8OI|%rx;@dd9CT-w# zPN!KJN5gUVno8R7`kb`CFonI%%X=-TB{S;LP|TAc)gW3X&U5$GrhcP9uDdtOXzie4 z{0rOpRxB);K5C|o@2bhlR(j{hL&i*W<7)M<;(jL2PGwa6jA3VmVf0*{A?Fh)ybzbe znxvfEP}cn!RgJ(ZP~mz5IezatrP=nQR_9KBea6oZZi4t`EbCrHQ zPNS3g`}T;Ub}wZL^45^E2zai9Kcb?Ufq=&-m!R@3X{nQyg0E1|B~J(V)Ko z6wBX|&N|Tqn=Plx0T>c5L7hJ6o;}m6L9hF-TXj2L5d?YwpV!Aegr-=@P!5NXya0F# zK)3dL=UYWAo#CHF(auL%$?UuwmlB@Yk?Ef3VH0Y;joeWDEqtn!R!+Nx!+S711uyNp zB>r5OiOocIGlU@pPn(ssk8PX1F+$z$);fIIF0)r#l6`Y|kh{_JTWyzLjmaD98DmS1 znOJb0Dad-p&5YRj`q=Ks*BGuyd88`U=Q`L;~1Sh-jdgkoy;-9>!UfJI$$^QGa?*CFv;e7HvF zmm#@b!ib^Xl_8RClwvFfXBTn*9W6v=UJ)KYadql$486H|<-3Y%Pr0A4SJH0-*F=OG zSg7alMzBLTX-73cUo27VO4ugbsgYgB2%454w9u(A*Frq~k!N8F7fVnVb{wk?f=&X; zz-U>WhJ~BA5|YPBOYFNUnFsSVh6}Q7F0Pr)6I9x)6UBV%GX+0g%VtjmJeNn0dKxk> zlqPEWYKtwV63PS)xLxhnM!S#~%4sJSwOTKK2Y{VANgy#F3kBq_&Eh!H(VuZFgBgb1 z`c5tiMaYsEGk3iv_?E*AXAW5l86$PVILh?%Um9zpUPMJ5O|%}{eCto$dOH%-y|@^A zHqcIx#-*(MrBfRS27fzL;HiCYQrr12p_Bw#j*eFcZXhZ7-A#I6rxLw(?H-!X@6IWG zAAa}rinjafVW0a`{reM~L=&otEct%r&yeF@sw{vh_*z+MS5?58KWqh~9DLlhFmu+1 zc2k6a{nl;Cce@7vPz2wu=P|Nt!dV;-&RB*!UVJbx`g_Qqz?(`L818gXz0VSbCEqtt zY?#nFD63=T=VO=YwYUtXzQRjM`>r)XFjw9`T`)LZ&^uqyOFxm9WRj;^I@0QgVVefN z@DfqZZY@)oOV1dw>b0sdvZgjivF#n@&}L0zXuQx_`Si3zXeP$L#%%STK8GRvLoo>3 zx;ka6Cp&UuHG>=1qCvxq7?vXM)EaX0&1tYHBr!@d3(eI_m@Sh8zo{|^Lt_=G8HX#D2C2zs0K)VK-`fd$kw1}v<#Nye4*q9W4y${PO-?sD zv$w+Lw!nebd9h3R?rl`uy$2$@Sn}Z>=bmRT_Q!Nr*J;#~8rtxMZDwTl#bMLr=6l7e zs;fdKtSAX*&`P=j_4mVj($X`5lc`9yR?Q?E$LcjZsXW7Iy?7VRS^SyuE+*gcTvGSY zkpDc+pZNdo32ge6NsWFq=fxoB;_WhEp{H37^Ru%a_qXn<$d6m}E*D(idTeEz^d~-| zQB>+yClHyd{GinMI2pmzlWqFN$cTvMOPD8eJkHvfOfY5t34n%9Y6VAJmw~~NmN;qwx6LIGWriuOlPK*jivK@XG zwYHQo(-=u_?U`81uRWLf?Yv^@yPENDy)h1-kegJyDYHEO53_jl*zML&;SfS0JjOvI zT2#4?&z%{u8;rnDOG&@X;g*3Xr_E6&ic!#A0BCayztQR93-t55>SaL36VTOFZW*fP z<8lDTn19M+AB}}JB230Gi#sAmwfD4j`S&NlaOF-p5NpH}>kw8i44Pw>@!=prP3z!{ z`wvq0TJIgbdynOn(WvujxqXgnS|G^8bk|3;SP@Njz8I#B1+Cvi4120ksM5@zXgvRy zKUzwXBiRO@hdQX3zfs)5S|^qYlU8b@e?2L+a9~tD8ZbAoz4q_ zhWIn6MPx?W^wF651QLk1RV8T0)$AJuefazWhBxD@D6g6*rKlIp5X&cRlc8VE|5(aj zhI@(d^a#2U$LX>$fQQlV_#q(Sb=n>ce)~DuFj;?# zwEg>^GHMxgf(iEL*EI4sT0S zz&>l?JNuY*i{+GKQ#2D(^uCSky@OoRduX@9)Fr=Tt=xMxGoab_|A>DdpNbt`&Y!k5 zK*pnx%X8Wrsnd}q@_lpZo?bT%0kBOT$B-ebX0nf)bvv`w&if5K4~ViKDNdlN0`I&A z18y8ge?+5V*Nr7-sI{;R^nM~@vydBiLe(-WWFY|0;p&o=)r*lHawpxW_D*`(-Wf_4g;2iC(bPp z^)@LRpi(o5KsFpnX@RUg_2Wzweg0oQl0@oBGvsRRu`am+ikF+qL!ayILLZ>`DV7@s zpav}^CE>9%K8&sc!l8(^et?a3KkmY5YHT#UJ-ep+C@uZ@;bsvB6O$Q*tpDVkcQH7t z1P0VK{1=bmAHYp7NuP2VKN=qm{O2Jbb5G;3F%1L=A5>**)2KDjBUntq?vV*f)b3}@XG1N^3^}7 zshX6!BaAhhIH+3HkF930t9g^`=N7= zM=tqRCK4PoDI!F@q`cL~7xc|!Nn7+JJe-Es6R8CY8mB^4#erwH;ZBu#&l1wcXW)`E zpcyC!#!f?DCPxy?1+(oDo#gOctGISL4Zv)$_SdyY=B3M?`^$&lgWE>fy>e}T*G}V< z@VV>^K6!XU$HDB!@Vd^qi^#V={0(2})>n6J^?^w&M`n97$xnF=h&-kscM0lc6eJgp zNLqCmyX~G|cgc8;&asX0PD41cq`JU60;UKbC%OGwgX`zYJQAp%6sDeY7GW^}eN?y} z5KUIwWa0)WgS;;WY5Zjt1e>4#8Q&~R7I$ox&wYieW9U}_)c1R0z%qF zz{~J4jFVE%4Ycxw9`zkW<{(KirQb$TWk|qahRNZ7C+nBCMe1?D8{uUn(-xA=XUSc*}6o8o7@Ow>~-E9 z4WgceS*U$_dpS{n`q?B-`y5JQyZ5s5<{j?pY|?8&fxmGaz#g8!e`%L}{lwNP(;cL2 zRdTbr&v);PNQnQRZ}_{gH$|e?IlUD7tvrm6%>-f8&b;*70h^H6(z7~Ni#N#@inxOs z2drl!%JBDHCdh$~*T)4k6J<1mk`<$Xy-c;5{n&FiRwf;ZjjG#Ny0@Co3cM;yUJSdb z4z0B+VNhRG{P6pf*@qDp6YRRNLd5O%TpFK@x2ng54rbbQ$L;1R0Bcp8(#qJL1G9U} z{MLGL+4h3he-4l61jvYR4~$>n_&34vn5h@s)kA0U9Y^ZJe-Khzq1YPqAR-E4wxhak zL+#pOvz0&kE@afX%XceJ)9FxMsY{7iM`X{tGNjaRZ5`=5VQdV3wpgVy7a zMSdQpr182lXFM0X7?XnCR^}XvC?S4L80oqZw)$T2h-DkBYlLQ@g0v@%)Pr2cUb4+z zth9znwcWkyDXV-h?sH*Ob#<<%wugO|Dqnekf3fDW`e%XPm*9IxWtSh`O{+60Jc3malXr<$M&ZZ|1ZISn zKiZPKIcg4navV|pYhC)@_fX#7KqbhPOpwFcrHvQtxK6|IAjL|a3hp@rvc>egZ zj+_dp69#aW8T3C^lK!W+X>TS0UeP&%9z@x$+r|H5LI1*@0eiDcdZDupUT>+aqIN!S z{Lao)P-xpHIhULXp-`??EnEn)P`3EUtczFvjYNTt%t;#Qqb^PMHvgvy{Nw5sO0QrcgtvY2_~*6JH4Z~P{@5f`~wZb|z&D?>%7j9%%o@D6fjhOiUA zt#R(!(`8{dMY%GxYL3}Jbp_AHk3)jWlNs7cLG&r zfmn+&OXG41SKTd(B38j0+Y*6`CW)TdXIUAUxS#s63I%x;gaz)C7HQwl`afK_R_)Dp z%FSTH;QsRePhKZ?11S`(N+eEk{8|VfEJr#}TBT5_7d@P|7<5;~_Ej1b#u8N37tKN` zA=;qcixo~iV$zZ`Pu52&q@=B(pwwM{0YxN?yfjsFx%R5zv<8=HtFP|1tUp&#bakov zxpoq9{JWgk^}-G4M)Zl%SU-lT4pmmAZrdKGK=yj8@5OY$UZBV4Ym4_<^sB||+Nk1j zh|>{sk=?Ni;XnyVVGF%9t@kF)xGKcb#Kc=h)QAgBOoW7RDIybPl6_Kf=2Ou3_K7=YBi*pEWVP(ON7K! zd6JV>dZwOpGH@Jnb86w6iwO7kin7akoxBGY!&;}K?YG#CTmLLZ)TC6Xq}q)MvQmge z6dk`7E4F=Sg_0jB8}bR5Yz9d~#RE0MDm_It*4}FjVZmWEYG>L_8QAoZc`4+TW?tFeV8GKE>Y7n;F3N0;ocdZAJxeEUukFFo%~qcShYD?;R}#5@7WL z>qA{|>a4$9BNPADOFGRZ4X z|CPAwl%S={A9OgPe5ic}p7D@JorslnG2M;Yh#}&x7kqxYX|UhW7|Ew=)>_Ul4}b@* zYl;~N#-7CM!}+)FDxSm>nesJlk~L~^vQ6iMZx`G}(i_l&Hshzld0Znlju2z(V!bO---Kd8c3vD)h)l)^n*Ih!2_$qrWYtd3C zU&zsD%k+hjjQRb>8Twk#EvSQK;@|n6Cvc1Kl<@t3MuES)y}@UU-xAjt!?D8*9Qw3BP#R-3 z{8YkgHyWwL*!p+D=CnrxFEROo5->E1XC+JHM-$%6zL(K1pHMM(W?KHO$A48m^DEif zoMF6fGiD#CQJyE{@x?~DZh$h}aZ40J@kb)@xkq035SJ*=wEBK3`k#291;UkP1(gdB-K3}Uwvz==MSoxuZYX6b2-^0bBV(WcXCR$DLE zZ4sWy9;hzqkKUiUY=@@ksABlMGLB%B!xy0!201ay1b8qgl;}qQSxAX$qp)AN?DVtr z@KDcbAo)}Tt(@MJe93+Gui>)G!jODp!cJN$FPu32WhH=y1ysUDc^T>;8tnnkLLWjZ zw1=IiN1O@M@JeH3{T2W|6Y@G%RBvUgcTFgm$0c<%kW^+15 zx2$e+pUXOE|MJHG{*5_j$pb}d);1Wy|A*lHaTLI8kVu{U48^#-!m;J@`k(v`aKOm$ z_c8ZBjqX-9W&5K!6O&T40-7ObvUqrN-|^-k5$}c7rP1@_TL(U<;vPv$D@z%x7^FJL zXa^aZaOnkky>E`_=#vD3HUPl&)udWv*ic387Zg3i{#GZsm@5B$W943_lr@S=O_GqI zofiuP{Jlp{GJ9(0!#I;EUyBpHe^vjsg<_U-sVrf(Kpj%>EO|J*L9i>GZR4vwl}Mw8 zKc{GeX2+Xf?8H;-gj80#c?=(BKjpA|U>lWY_?YShFEi90l$e>3b$2v$*%>?oU-bhQ z)=P5SFWcQBH1gvonlqT#=rNxI_aH!zEE-R72q?h(cb$4xWoM?Fdnf z(_v_ZSS=ZO6LsS+6MynJf%Bwr78!j=<}%_FR223f5)q-D&@};eZkhN_>D@Q$dWvBo zN?9Zq$keu0lJT(@xDGw>?9cpgWkXt!vejRc6$w_2DcGctoF9cAjA(3)noJ%%vEAD# zNm3wx^Phh3kt=8r0_JUQ1)NV^0YFY%gs6+zhu@j$|7UGIzE>0dcXujPCK(PB2VdKG zqnG;ua&cgBTr&$_Zv3yrXwhQ5b7+XPw7QrDt-UUVuR6LLf^QOr8=h3WqA0gme4HD1 zHeL63EFS9wIpxCs`9RQNnxt8Iahb-VUVtm+)~w_45Z{TUz(`7XU2au^v4jAyuoORh z&keenfUkPxrk!7VrCPfF1h&`JlC^9TWLF)Kmd_{T&s2H|FGU3oQ{gd><280dJVy=s zKH~A*^4KX&r*uXPr|wLJi1&Qsvh(?~W`1fCw1{OLw#}Dzf4!OzU+VjmndzToL2-Y zLeE#q0}_N0BxjizsKTv=Xmk#eaS+W#azL0$*vXPx93n!o{uLWKjt9oO9eU}a7nCK+ zG-4~EFx)9ecdk9)2qnkWnCW3O(3dy=tf;4d)!KYy%o5EIRo|aCXf~OtO2<*d&M&amh=XY6&IFm)uBM_37rKE|xcdmmXwTg!LbJsUu*zvT3#nt3)=0ow?-%^?s)HFfYi9qZlKC@rEcgxB+@HqRjj#8dhQl~^5p5r9+_7b265sUyp(P9NzhsA z>vcmZ9FYdxmT>k)e?+Q}Gv=e%%v{OzuGEVJdW-Yg?t9~zwv3-6Vxj0R9LomoRQ=p| zFd@gDXCQPr6K^sMTjLcDwMs~+IAx>4DUW)c=7u7kjYH2KUCKad(M<$4UC&c64SFMV3`IwG=vWaZXB0;_!b~xA zXd6X@Z+PntQp(DSByExTFsji;eo2SGc!Mq+znarY)`HsIbhYZhO1Yu@{OLf@;zLNv1)v6kcRR%GJQ^MRG>5Yl$O?H%57KB z5K!X~+mi=##flL3vJ;8{w4NmCgr=l3b_`LVs2S-9*#+ za2}JW8*ay7G^6;T_zv#&i`N&79WH)V&UjW&zwuW>D3mU@(QeuZ?n9)wJdK~HRgR=* zEECah8n3#fRwHon5~-&#w9jqTlTmZ|<@n1^BLzt(U=5r-$t3+uQd-3NgQ)EdhVa|&^H*pRM3I*p-DDJ8FaLY^ zH}HHtcfogOWAbl5|6Yc*cmmR}g-2F(zizR$mGff3b#Z^Lt|B{oIf%ca!f#=`u=)%N z$Xy@CmF0aoIof=xpGf>+N&c!i{xXo?Vz1rat@fIQY-WxDhahM*vUy(h<)~V6m|D~t z0(2gfKu`M3x<^&VheTx+ZYfpT9Sw@|vY+3vlGSLmLsetlxC39RC2mXAI0ing$or1P zrB^|9k$iS&MzD9ak!Y0L_GNFNi?<9;fi=@4#uu%eqz_7?{mM zBVwmRj6>Cv_V76ZU0v#7}> zyZ>^p&7^j=Ei93%k+c>4NlaP5-VUO5=Q5rIi@?5T&rwBlM|LlpX&Cl`GJX&=)i5nr zV*U4Oehk)haPr1{$0)}G)z@9&gTqXNdWl-iwBB*zO+?+&z4p#l1VZuA#&}{0yS)x! z^i;jlVWl}e`22dnMD5TbVREYpp<}6x;*!xthz35Thz8P8gzVxj=ce;6+M(2&45pQT+9J;3Ey>QQDElZ~b9C9(c`Bl; zari2h5x*{rgisd|4P-ZFYDTg+Xk!jOxCQ2{TLLXm)Kk(SNK9R_a!dzAvhe~+lwHr? zGlvTs`k6t^M}M%jk^!LMQuY2h;aI<<*T7v1LK6fSn6~t$f-E~*VKf)Gn?_um{fpmD z5pEFR{!G~coG%?L8J(MhT*^O|jpXB9)i_nZMK~=Mt*00OF?qu0Q>+o^lLn)xmWvvK zEW$$^DoD=Be`W@ZlSwK*;@$m)CRgNDV|l(ngK2Qf&9mnJcgh}JsAE(+-uhzz1hzf^ zP2PYoco;-HL9}D%Z7Wlz@YwYt$gq6zv{wGGpc!&|d+Wyc8K-rngYkc_1l+Ywc>BBk zoXxZFq~t99#FpDYzwwFPNn~5AoZ@4*sn=QR;6RiQrqi4Sti%tTh`q^%4BkeL63;>rLv< z^y#Q7p6){f9HMLcTJ~wn-em0-T~>y-VEbER1Z~O6YI_OhgO?QP^oIuSW?Y77T?BZj z2vHCu96A!+h)7SoAN^rAYIg6D0EApQ4-&nEM5)lO@x{>zJR5~J7Zt_TD6Z=?&~-$N z-8!Vd>*x0m(Yf)=H$L=TEHI6XU@1xbU3qDMqDU}S#oxs?t|9f5QSA;uvXzM@duQ=i zy}#gxsiq|=`fe7`7n1cC0vT0y*6NM8xCa0qZafp_Li`^GO7v9IJv0Y5s#`)rB13M| z`m)@Vd+FSo8SwCnhnrjn*ZgJ;O*5`(`JC9{T@m7|fP^(&u8`!#>4CKGGq`_D?w@J( z)kpCan-vRx6`rJ(Sl*)>qxGHE+S_Bp6zoC}nSicAlTAl)gziUAdX}FDq^h*k&9NPH z=WYp^Men005MQ$MtL7KdDvGSr)1ipw#}qMd_sc?+a`VTHi++JrxoZ8}FY!^{ZfZ1( zVLxbnlzKc3RZMUmveXf>)zzk^wz2*8iw~w) zKv^!3;>^9Q64(E=WrA|>1?JB8Ep%ors`>V6=CYN@#u!Lu49(mLh^krBS#c#8;_aNn zFBEcom-n{HmW(iLC=aq%WlNWk!w!z~SO67=r!W#{Kkqg!dKaAZF21u1xY2wF+|1HL zaMPu;%&holwCg^Qh>1IsKgaTvVbGXilJc&?OjtJ#r-n@@G_%B0Q_@Y)cIUIia~6n3 zipBOC!@VTfee<)38Z~6J_%BLf2PZ(_^E`p)4Ynyt+LNb$F8j}VXY)$<;`Kf-_`fQ^CvdFjZb~<6jzOE5b&R?(m%CYM+!^ zSU3)h-PEI916K|d=DQps+l$hco9P!ZW!&&!L?P~&<^!EyI5}1);OYLbBm)?5C7c{2 z{dchu@1f*0v{Egx<8&Y2XcF7@AjZA(8>f?OkuCzt3^Jr*b@MkuVK0@ksLw;GQ&8B) zC4kxxvkddOsJ&!taCAmcqZkH|l9F|j@uPO9od&!kMEvg+q^l zimKF~Wsac{DhVki@8htLxf+kb`45y)9{ zK6$r0psh>xiu4B&dIrj-ff1_dxLnk9N-}Fei7HQgGYgPSH25RgQv1es!WFrv)F;W- z&(tGh)rbz_311|~t*6TjbUMID7BM3{&4(t~ce1(BIvel~lAIz9%l|A3fF(tjj4>ex z)2PzqRuRVJ=_&3d=GjQ?#H{P75{b~_#&#+wTQPr+eocl%9#;&M57g)3VP2HI-m#^h zjFsBRUxgU8QKJG1uc|8bc#jof`H0;HzWIH-W)}C_&7lnB;LfuJZ(x-HYE#)vXuL_X z>Pf(WtQwoFzK_x4>w&_(xnB_eW3>)=!vQL0p39=kHAH6)PF>dr)BDIF+ON%W>0HNm zmy159gPavD7qffFTrgPXRMii_Ab{TbvIhrR{BcA!haL30D$vzqAe=tpJ6WHvX~v7w zPrNbyVFjMR{rlk;$iKRQhWWBuoZNqeC0Hs?S@r$0>i#}w-yBcU|Dq(FykDv`{g-Nt zXpL_Pi{b=j7XhmhyQxUVgofp$`cAPDAyZe8w6s3x*A#Ayo|@q=^^_tDRz>S~mJBK_ zfu-zk*bz$;JM>56nj(Vgss^5)RyXff-R@TNOr`OJgC$}(P5HEpf#0op(VD5(Wu9mI z!4dn`9$f^T{3r(nNI0?$c)4j1H$Mc~1#RAI*U$C``xv>e7IK;-P6E+wC^wA7i3VO+ z&=-1uE)3?eu!(+%0tpf-G~t#RRmwoxaU?x%S?5Q66Yug%GTQ;X6&<0Wd=C))A;?|c zVBFbgTBMr~WiuP(dP?}C^`G_P+ayCGhM&}u6PqUqDylcu!0e12=U)aOb*$32fx%LW zLJ=<|ag_5RA=H;Njmb)@O2o;yvLij@XUeZ{;1y-b!e1!43ZtAJAAO?t+IIN0F`dOX z3(US)?#N$zN2tSGfrGZN!^Lx_Jm{ZSr+P7NP|_)40-?3S8GSf|cWQ19=&dl5wS)lw z?|afm^#wLVUR+!ZxkY(Y*eKY#jXBHPY#eTtqK5{Myx<$|Hi7^>W@q*<=IC?>KYzEJ zF#wMHICR#hl1op%)3eFmq;G)$Jr@Me$CaS;`0q=6J^C%Ub&~hzqURtZ zqYXoD-+#H40x?-(QB$(UmR##w<;H@C;0ZLsT3=CCXtZBRFY%<(1IOBhwE^~PBhr^h zKiwyI12q`lEGpooLRETjDEIaoPlM?n5siM$y!2cmND|D;;xLWo<)0yG>uJKF1qSnl zY&d|@THIQfOfK=%3HiWo9&3Yt!QM5*6~cnUzf&OL{b)yeDz)fhkqdXM2%i6@p$_nU zG1krQ7^-cCUgeij@!*IJ6)PgK2_5d2wNT9cZ|1$CaMmyM~ag zI!d5C+%<1Z@j{p$JMEY}NSHJl`k6bb$FShvixvwGfRJnJ@BTW;HElQuV+`}%4<^M6oONy&mW7JGO+j%sErE$1FrzaOge;ierD;z3i*duwHSe7_a=Q}cC-I`nCtR_W_tQcW zE#{j(F5W_lYbM68^Ru}>9YGM8ERWusqACBHZ)tG+df$I~(i2(1klR=+MIqa<^qZFy*2ms(vo6pxXC(v}>Mp z2xFs#6o#>;~=ybw3#&AUEDq?(Ww za3Ds`3b@M;hlvGP9H|9?o|if19^wbg-?lf6ZK}}W4WXeUY~JhJbo76|8SuqRIATj$ zb(~{|zYaE1Z_Lz?*1Jw`x3;!`vze?o=4#H0d0Xza+(BcPyf>L+buEGHOW?uZ4Crcq zNM7I)e^80`bc&;>2&zn0dcBxaVT+LxRZI1Xndt19oC)jBBPBm-GO0B%UXS!MP4))7 zP}*mTCcmaqU)7ij_mYc@YSg>~tJ1+V5=IoPN2ih%-1~UQG|fh*Qe~X6Pf@>_2TxRv z<@odpHye-cj}u&)0Kk(mXIV9|Zrb?_;wjbcD~YLH-r86O_WB!k|4R{N<+z3`WMx)M z8&v$3h~ECS-+pOPD0{!JyE*X=a&59n<14GvpUoIF2d^&_b!Ax1i#xicx*{MHo=grx zTS&8uwVfd8{LDsZ5j-i$vonJya+Djwwjg4T4Wyh65uCy3gQP#Yp;)#N zS=CgSl!)+u4F1*&js~b}`<~^@Q}rkcMZR#TFp9{oWRW^ZS|`;Mpy?HfWn=3lKt@J? z-;S=Na18Yjqv6Tr42plx7CEc3T$&~yAkpwEzdvHop28LdrEFXN#?*_FlY;}Xw4fT! zb`R(LH6bPPKVLTx)*j*Ne|e#H#KWn}3d>%oNpSU>006{t)u0nFCv0nfKSS{p_}r$C zNYH@9yb4xD-hm*G@M4%zd3EY; zS%Jql`{0TCv62c-5WB|?1#81%j$pjVm4ocQSWsk5(9rotZa%b@$m5XM@-(|NQSIX? zj_F&_F$9|_ZjKP<<@EJ__w6Ms1Wow3b2)(jXOn+ARgb5LJ+SJG+;Gsl&|UEF&H&0p z@(3OSrqF={6y^X#K}f&(63V|Ez)A1c=||O*`^K*srx=t=Y&wp!mg?6`$GpSGvbTqS z%wQL@h*CqkmXn>6=q>%YlkSox2BZkcne#I1e_^aPGNA?UMc(ydd>H$F zZLpDfn|{n4XYpwv?y874P;&wE7SCP?HeE_AEkgBALS`U`UO%}%D7!$ma4~c_T)NU1 zzFH4-0s-2b!0wt^fHNc)vH#f>^#4Nl)}%*yrXxn3EBTLlOlS*a0E}-vNKxwsy_tGUi)2@RkqRGFR z>ZfNX5>7w2<`7XBP`{$ZLPhm8j&kbkZKE$MSvXmNaM?n?i40wE8n8F|d2wf={^b+_ zW6%)7P4CC)qFv693;ze`O{a){_lOn6uXvK$%Jd>OC3135OW*n7s*18q5bwSr$K;@t zeij=mQy^(dMb*(8YeM%to~=s2xijEb|8Yxa=K@d-roR)R-czg zezlMG|C0n^z{#6uX<2EU0JKZke1iGz=oqK5sTH84HPAo`O;QqV$ZT8zBU_COWan7#UCtsZnE#d%`jWmxL z%^Ol$z7lPD>KWRhM|NhL=79gwQD?Wxn?MG}fT&;A>Ryq(Pp0fx-Fw$Cfkl7jl;nic zdRyUW>kR&k8^P&<3>Jb7IWTf;yn;3h4R!vUKPw6+7TeK?cFhrGfsJL@A%a{yeiGxl z{OXi59q$Daqx3rMBa&d0z&IMPD+J)9xwjR~41S75xoNEBG~f;4;nonnbwS`_N;^V8 zU`n$aQz$&i)G4b}{<9QZLqCMk-;qcas@lpZ0el(IH90qy&(1jmz#NPJKf2xmsIBkq z8ifLd;%>o;TZ==XNO5sim*YtiTr0ej_c;q`@3pE0dYa_KV#;8W}r;sS)w;_K4jSU?JW#HhK2BqCeEVqu|( zDEHq8&dDQV@(-Q3GsMWx2FLL-J&FS6c#fV!R!3o`30S5snQssO08Q_rUc z@!>zKEm;&+7LKZ! zv(0LR*QyvqDyK$Ms~9rRsv#*G6?d5wGJ{I0rD_}dQn&@B>$3XvOWBf-r1CX#isp37 zIFcQbZf`}*0)t%!f3!*^JK)h<8L9IPRI_6nyVj?s9v3C>#JvkDN>*Z*@fDVETh5%_p} zdLy_N<#SVLuxRB!4M%MtQ^p)6Da!Y2-2emzH~o1wr!mQ1wlfOdgFrR|waY&`gtNgx zpY;Di2**I+vrUgCXR|8R`Kwsu1m=;rQ_C!l_d|p)2uTZcv;&)^OoJ?64*8B;mHp*PNEh`WV>co4%PO=v%#opPCt$hw}zj zCuO7L$>?a2{dy|mRu=3p#yv1=3u$g}$g%(B2#x*^7;=16alS%2LTasCT&Y_P=5_Rm z2imyyv;eygV?~dP2o$!SQu5mWXLm2Yw8yjW|GR*Ofc*D2_TH~Uae*Z?d^~bL{O`}$ zw$F;y>Y=~L2AEshx=c#hQ_bl6%t9;s!a`)`lEQ1T71L*{$d;Q}`hiQWOvB=8d~^B$ zv+ArRgJLGl|q%M<~}o|J+7RhHG>sB<}+51 z4l_uH{YYmHgCTZCJ9hWAg;dsA`+7J(zqM~J(ndowM5B$C)8=ZnoPkgmeav!k`b%?n zHp{^Gq@>vJtfSb^M7!aYOql2aX40fqBmTTwZamhqDCeJS&*VmY@%N3umH-I4YO9!7 zA>*)@ohd@R%J_3d!xAE)%*@1rVe1gyaFE16&gv*Rx~ib4cC&_Ib#h}2D>2ajenIk- z*99mAziH1+*l(ubjF`T^Z7n*qP0Y#}YhMnW$E~ZpoJC{pslFDJb27R?K>rV#+Ti`{ zb)-aUg=pxD6vSN2Pa_6Mg8pLvQNm=ZT_IQKCpU#)BlphQVB!x06!5PHijTSI><$W; z^0B#!A;4@8&|?JgJKFs46uGFGaN#za!`)dl_O!FGEU})&d3u!P@`+Z@Pk5OufE@bg zf-5&sW=rDEWM^rNL5x(4dA`mkmaPv~7Ah!tSs4G}#2BeQX&v7gUH#p@NzES2TzjB2 z+lUqX;(mZ_UQ_<6t9Y+o)4PL~AL$ur%=Xf2uB73zG*h=WS&-`~ow2-=(~MEQ^(|um zQH>smfqMbA6SJ|ij~&RYj?k!>r*F-6H%_@T7@N5$4jH7i!? z(T3^Vbv^PU@uN(U>$cJr6plU4Biq#V5zFsNCsxZ2JJ0DlY0k~&JE)+0zn=Vx9fZ&f zxvrvs5ExF!pnJcqH94RH23Buc^dzbt=VoVFj(y?qd;4qY)lWJ>_f>_DK81WogEl6y zsFAz^6b#@t)cM>tL(cN8Y&L)NQN652O$%g%Hn}a!43)F%s(vgzsaKszNkgo(>YMXX}f;r~> ziIE>3K_Qa*He}%bD7B*hBNo`=#}_UdQhR#ZAo)C*ysdC?!2ytBE|WYrg?ND>E1*gf z{YL`b?bAa^9w1whqjhohdt%dx?32nUNHOzuxXf@(sMYf+E8;>4sMe=2|0zHZT z?e6u{9PF$jDd$;F=Y1nK_nn1{NaN=AQ*MWo&>uTDz5j%p;Cuzx;nk?-Hjadsvj4p~ z=wCJ39-OyuQ$Yp?!_SQCt|6Zp<=&EMj$HFPlMD1T+5*J*kKpi0B`~vcY8ab{?-V5f zDGUo{m8{t3vLoe)4Lh~Wht`q}i|Uiil&nTf%9zxPrH%4@8`siqV`desm}l`uZa><# zPPTL#l(OKOA>|Vqfm@S{S#TZjN8ef1wHZd9{*aEhwpaYsTdpKya3^%jIezJ!C?p%; zs0=n@pTv}S5cs4TWn01Y9b^mb>_~lvgup9&1dwggVsP8s{BcZs$dN8xOv3n~^*3;% zn?j0=lRbUzVuaf*79+!bDFSYaNmj_$ZE_G)i1-wb25!nrIb@o2yLncB2)FLCJB(>bm=E zsVuRSDy&Ccm!}4y(}Yf)&`;F^;*ld7Z=f~L5C$l9& z{uHxJY!()zHd1F86t%Z>9t(fSk%A>+b7L{qk~H2FZu@*b1@B^X;^HV=^_5-qJ!D?v zbKT92J=I5~x79Kkxjn^?fSTi(#$gFukM6mk_N@%JFMnCSmpWw-pFVf(Ka)BgUpJ9e zKjFp2q>g<9Y5}8LIef1F*7mkB|A5e#dpXxs_P!OT))nVF75hLd@5C3YW#_Q8HuF&Frj?k(hnfKF{Jvw^{FqV`!YeU zC3#mvu!WDn3aKw;L65<9a9Hc6Dlx^U`%Bhj9pgUA<(uvb@y@c3mL}sIKEW@9@H)rq z)72Kfk=l=^viA#S}>b*B!R+k8U9n&d=(=LLg zRE`fj@%(t}Ua{aAFU`(g*|t+nH@)`)iigZ_e?20o`Xv3U7dG}|TNU1a$eIQQxZHuO zD0&ncG<|9rskj`U6|z4T6%`~Dvy}tnuBAG`#K)>O15ZMDZ1&FF35c^*1aT7;RFeZ! zURw#mLP`Zynt;zo@EPtr3-=07tIX~VEJw8l#^o=qBHrH`ajt6aOROcQG3iEbV|K@D z3y9Sv*mep68eC7E_YLiK z2`4d@>QDrMMaBY9UbHY#P#7K_cY=685l`mqZLZ4Yhvt^7edEtB$Et7NcljhDrSQoc zDKDO421T>lRwuZNj>omrszNmh%bf)QOQM*0sQRYY)rGGQPg9LdgVPS?67aYDHw8r( z#;%iV(0_}X8-k^0fgL0M@6j<;2J6b6qLd<>zs6<6Kl4VsvBsYgHW1~X>FXm`zu8ta zUaTA6T6H}*H@13C8u3WyfzeM!Qep11JaNmc6^zylEK6HEtyd?-*Ou5g_vNVGZ+}!| zrz?Zj8=>Bh#vX_}|KtQ{Jn10Bz1+iiY6~bY`Wl}f;5D0Fa5|EfrL6vPwf(!C3R=bf zdF%YJt(CV&b~|^k`gfn<2Bz&>jr(qwKV3cX6EEs-mHaOn4NlMA3*oD@v*u0^xWaC z@5v|Tbpqe_o+ECM{JS9t0r_w6c^%Y|GycBbUheWT7)FI-ip>+w(<;<%&}jcSlons) zTvP(DQh@b2*+TjnNtRi5zCC zG`QHm6|?!5%wy(dW%!$#noq0Z6#V_F(Q0&>a$|pZc+8>#*f;DI{G}C>rJE^LFVR#^ zYpkMn@718UH|H0T&O6(kFD-Aaw$$0qpI=SAZ>T%JjXSxtSl(S}S#GqByzXrsLvl?& zzW+9NZg1(f+PZ6hUN`T)eCJeue)*?vxz@hkcG&Vcf#>e8>&fyRSAFXlt@G+npO2Rb zCwCU>r)zD?wZH1Y&qT(H#~D@b8B_B-%lBOMr`FVb>C1QD>d)=tPwW$0&KB$XYwZ(l zkH7BMt(Kj-ayy=)Ka>hR{@UIXA4+UG2Om6Y10DtOC~YOr7#f1?h2r4Ye5b5vDd&rI zqIqI5E`6Ldm6?0K7Orkd$Kg`t~-}0bWpO#AL#zQ%8%H7pxNfsyZWQyt{_09 z7D*BaEpBR~7S{~0wz*vF8BFY(A;MUB^pCdO$x;ch{o$;@_TnG~puzVEsA9=3h5P`4 zV0WuxOXcDCXQSHu`TMN~)_h(K+PhcAl2b~@l*_}!qj2dn_TgPC9e2wq#WG>j@9*{= z37Xogr*~r^-``K^dUk>WcW*_l47KZ>RR|p4Ox%}xS`yk1LL+{!6x?n@NWQFXDP+^kBzr(dOp$NsFKGtU>}J6c`_O3lUI5!;r_B~4pq zOYXDNlgsMfoMqPJ>F_!0eoNYy#{F=ZHT6f(4U)N$u(-ThTx5P#E7W}V%+HmbMYy(V z4bB+#hTQu#Q1b_ey_}akE>;e%vgF7+_P?#Q<~C(nZCB;}vV8WIBJYn)uXSgL?`Yhs zEt~BVe9-UXu}apahYrU>o`RmK9@q8ZqrUZrH!CJdjSi%itm~RDF93@@-$*9mfqBZ4 zM=y$!(q~mVLQKP}*?!b_KG^3<+27={nP7B#N;l4+^^k3q;F!73 zr(9wr(^R0X_Fi66z_h#iWz-B1TTS}HVASUV*h(X#`PV)F`TO`mBy`a}{MrX-8QU7LpXr@k1y!o>}Eg4^`!5aJ!S|+v{P$ z``hpN62p(`A9wnUCXqKne?Vq{p3~p0AU$1LKK$QC`*#?lf-w)H$;?<7+YBr!J}P(1 zHW!bjEq?^tX`Dl5=9}bX5$_IiA)oJBmGlz`G_t@S7xMg#cp z4_V@Hv>@nYBl!UFhJmDHQ*^iyQg7jw0cxrFPgA!3$y~_;r9-TAILTNDUoK>0%FtnQbMfY(uAQLZ|E~OrK&{eZk(Hm2x^MSqvBlL;g)R z{AG$!+o*e7evK49EBaYwYK07FM})f5oPN%EU0MZ<1xiW4!*K>*zoOHB#omt(vDd}e zXft&V^>Hj@>p4>2S2iPKp$$lPSOpdujgpMyxgTyDuUViZqgx9dE6MTr6 z)cU0is3*6vpx{IpUp`V47P#aK6|Y{xaDp!V4Q z)${(z;B5|uP!lzwBmys#jmGbe0W2~D5sX9B4PbO4SL7)wl=&qi z2_hElPM`e4q8#v2?6n0u#SMHI z58phmcJo&C`oE41j;xMM#rKz!>>bR`YFi51chYysVwX;VUoKBu!g!6z$<80VwW(Qy zgheVRsIl>dc8s81g(!n3NU#t5@wmJvs1q~{{@|CAF^BYSC`QXMU>?Ef`^p)h8Xoy2 ze+*tA#Yr|4h!rwHN03IZRHtMf6#AGim4XTqB5~;I`sX&sJm^{BhK<^isZn9d*2Kik)1OHV-(4?TLe-x>4(2~-%1*A z1#0QgPIHns_QtH}n`#GZoyYCPOV~(~HzJ#6279W_Khhz>m#w^AnX^lyk0VU z`Sd30T%|U>`%f$muJ@4d`tD$D{A)PPz(ZJ$5WjdYeSP+If76X5uFy|(>y&Buc?C6J zN%SKC#>L&6*RunOeISZIsT9X!N$~Z=pBqnqQmlY!g9Ez-5v7HDPjDqEwKp7a>H$(! zraiO!(QbGOrOwVdyX^2KB{Ar~PYj!Q%k#NBr^&XXa$wiqAN)l^S?5xhN#14l_bs`;_n+?`5RyXo$=+5e%F67k$0 z%3W?hNgjAT+aWgb_R1jGos0n8X2e)Ei$-f_g^bpWO65dMgW5 z51UZlq8KOUX-B7J>OG2ZbxEX`{f8&~6EzX_JJ8Wutsm96SQaFT+wYKM(W2XkwPiH)g)wqt znNk*A{2sQX4GC+)anxRdm@Q!x$W{W9Lq%Y2=DQ)6SA_Vrgdvxl2jeW2-3^ERIAq^3 z(<5Df8KN&)pq1zJA6LYa)aN172H2C+<>X-bie((+c74w?*^7$g!#P!CcgNJp-3unF z2dV0P3F@6=J{2A6N6(7Z_v8}wyS+*ek)Ll!fs^U>Kf#&MI{?Q5FJj zp?!Y-hPuIBX>#-an%VA(Xu(6WYVZdIFvvA3h25(&HKpgRS2(J*1bc5c__xd?6v8lU}g5 zFw4eA!555{9{J~H6J+bxsi~=&5{;&^tbT8wG}XwT4#dkr)hhXUJgn`N$oEBkw1QXL z8@x=W5m_$xG((FBdepjnE`yE)R&okf8&*9-KbHP9jc!{m$7PC}_m8@9pS)#PYGgi< zOZkg(XVBNrvS#Kr>Cff1=TH#}KI6HnX`#7qayZoTA@bvDq&vWMN=_sBnS7Z+u)IETjTl z!G<(B3x5wYkRkZsU#1->{#|J2<1#pebb)s@7(w1`Xlt@`-jRc;HcV!^;B` z3a<3R%3&kOqSr^FVBqEpso=UM7NoyV%KjXLj&7_a;}Tz#&lDk#QCD1C3fLF)M5v+F zH_-QA{i6%tt>TJ-*LG(wi$=eJj?`(%=#SKVXuNQiB8ZB2OK9h8N;M>(%fR|_`EU%! zrail7ooS}_dB15R3dz21ZijA?{Bws(shLT^FtXXCzrQGwU0rF;SA9HxB%M23X4Z63 zQ1NZyZV%NyNNdCyq%CTkT4bi1P}jM(Dq86O=*0Yt4oL~u5R$(YZ&+fgSNaKcM`%1$ zOLX0p3t0)Y*C7nmWa&!=%TQO*oXd$uwRQO?^b0y(DI0}(beFx->>lq{j4z#oLRH(F zlIM>8PLoJ4jlC19_snc_w<`Yq+6&xRRSy5hukeqq$$LN9OL?$5t@2%N} zC1I5jeZ-{$p4i`cG8Avsi)1Oe4hQ2lTl}~%q9s8dVvjUF*C{=5p;jb?86JG?oafE@ z>+JVLy2vyZh~r>_vrg zq4OFNMa^4^Vb!7@V2&m8_@W|4+1=^wfD6%=-^C4;x{M1eD=!b*k%{r~z>2iV5d8m( zBD_>}&9EM9msn_g8pnh8Mq}S7lxs=8(7B`e^+9uG$uWEw(=(!3Affn($GpKB@VD2i z2p4*|hcbA9+&>lC+Gs<~SF996%w8avpPpSpn9_fN9w#}Ev|3CbZEys=QJr)y7}~i@ zs+D!RP|aizt3{2v%uW2(=4YMx^49Hp;$ybC_hfRkCi(Ceg(E_E!J;lXT8?kzO{DT? zp`@#!`mgZ8S#TCl`pIQN39vy-hgnX(0Jx!Fg!~(9 z^ONR+arjI0e*BP)WF9B7cmz~RNW8@L5B_}Hp<6?E!A32euk-QZwvrT$y6-a)0%3D! zKNl3gdSj|Rw10mmcQ|Vd%Bqy3w(}X$blyqj;`Hn2vj61s5c~Q=ry-Hfm32dLG-I6a ztDhWx&KdZyJT14LfH#8S68_>}H~ zqf1$qsU-uJPTb;(t480qr99#2a~31`Ze`OHu^P55rep}8-So&NCXD%(C;jwUY5FD$K4)_s3D$g^wnEbhxy#(Ipx?4wvS0IlCfBobXzGSOSIU~fMc00 z=dWZ`7IA~$xW=j1`(Ar^_UOPN)^RH#o00sRLq#r0$!IVeq`u@aB}@9H;)kctRlM=E58*exTq~Gvb$kXs4VEAks*J_wfte|`8c@A z`e!(FdxMq{8{dLrk4petz(AiS7!@1n-U)g7$1d5x-(DsrOKQX_KL?Dc$3w)5J<}5) z`At1FcE~UGX_+Gmfl#X5-d_Xm=j8sEtv&@?#G)B4TBR;S)`BLz687k(hAgP=?XAlj zPjwVqx0rcUvs(&P;$Cxo=6x6(fnpVut}GqZ*b@8>e4%*-g>E5Zx@HEqO8X_|P2n%{ z&tHueH-3zZ%ZPkQ+&5P7HWkT?U70Uz$aSdyW-`wtal}XxN{QlbM4FJ;5k-+^;{`#M zp#i)4wDGx;!J51VzM#JOuSYr^ACy*EEpnpyPo58F+?Df_558EB1CfH51>c_f!(>Hz4+X))Bg7R>GW&sP_|wqu2McjP+j!ylCb zQIyo*ZR`*BtfPwL<$nKRQ8|tcIU>ISfzHQ}VIaD(7uH|6)?5{7m&Ao(P})3l5rdVV zJ}ZToS(_ZZy*@)_&J|!(mJlZUX2cOhav4>yUiP%A%GuQG^~eWw)ZP5A8lu0&@Tr~frPWZ_?& zH`6dTTlRad_r&)Lil?y6a13`0jCMXjb4AOcl=hMv75VM-d4=LGOe`~s2iys^AiDXH zuyiDdBkC9N=Q0NEQYO#jMkOhumni7Ri_?=&HQw3WbYMBb659HtZT0K?(OLhd0NG{qfB7(6L7uF;Is#qV=sH8DGDC)3Z< zjOMU=1;r298QQovey{{Cq*OoB?(jBo#{(MsyM24E9oT^OQ;7FUyXWug6Ba#UmO#UW zh>S?GoY!r$4rOF|Gj;vMIyZLDAn7AnBa>X>1Mzbz)iW9;`w6c~Vz}0jo$E?_f$3N# z!hf-24vZM$^7nj0ciS04gtz;UQ;yy!T5hT;J=5(jbNpL< z`Rb-I-=sv^c=Fb6-`VO3_u%TS@jIu2v5`MKx=P<8?umCc5LXd`gD;5I7aGB%tHi-q zBIu!SHc#b#CaXOf+_N-OqQO<3QCiSMnxdsWG2TJ+QV=z)BF3=a~hy zt^?%i7Lkfx6U=8Ye z$%@AyMzURj$Qpce!Dc(;de-3IUfDt8JAFh$4=yBs1r9*n7(RaT2PVh{e=iz^O5w=y z$rmc@@iaA`+%8Cj!cyuFev4IX%1|-6{hqAkp4u=lVw8nA=&{%`XsmRaLu>3vjty+t zkPDEaE+_uYi_p$hXGA$F{w0@Fp2`2zs^kO9Pi>rxg)_1!g**zBQ$7tO+EME|zekoi zwh$X^gHkfTMen_1CT-`u(NACTX9n)-p?spm%JLVVqsj65Rw-?@XSlkiM+7fJb$`w~ z%4G!YNc2m7tdy|3n%%x6NuRE$IMA0IFjYkifuKy}n`fi_TJ(KA@2jPf9}$XpjJyzY zN;0cs8JUcan3R-(8he*H;k08E6Kh70BteBclomsRk960j1Hz|%e`{@PDb5a;zKmhOa9VJvsk;KRd&DNLbl1DH2_@beMQu zv4WNF(4HyXHx#2>Js>ywnBmuWTrV~{t?`NjZ#Qp`=idS0&&fh%PGzOFuCCYYXh+8n zFnIeeXkL`qy{Gt*aZLt`j+IOv1Bf=rL4U7J_HAHVbrNZK7Sy3UtQ zRePp-x&yY4gV-$wMn_wL^cJDWSK%W*eajOxl>VH!8^Fy0$Uf4n(1qkjoz9mY9vgcD za_X6wnY%(ZLmAoz#>Up_t%%Lvh1O-1zhj&xmXH6hsvZ^Ie=m33S>~H#nbX>J)gywE z>0uOTcmxB^9w^iSu!_n-$s|re8Qeo2pOU9gEoGL_$zwvbfKu$uwe#_UIY&qzQ!-p1 zfUxxghS-fW*>Q_;%&A&N@j+o9vb0I25GX{7CQ4;Ej1dwRcd+7*ZfjFgeyZD_8_%;E zSuMn?SD9x0%Inxs!j)9YS7>Y#N>QaBrAyc;i`v1IuthL*W*EAH&vW*#TEQ`#NRVoB z^5-rWDsrT~m4PAYCSZ221duI9+(0<;kQJge7}>u~3DPWq2FVcKJy~l%uA4QEnu20T zf@VH(@K(k@3-OmtRQ1)QHQ3!%USf#P)GXq5)z@~8W99ywYxEr==tOo-P)S8R1_U)o z$3!e5bGZrLjUvD}C+F!GvkW643f<{`atPrcj#MVx=IMWsg#J(Mt^%pgI>CZ}fcMD` z1-2;wDp3ULCj=n^1OihC(XkJ*0nda6VtxT)!z(1m9SD>NI`*AVo5!u816?~lzVPI< zWo$;Tx!yOauPnSeX|Ik7TbP8w7zwvvmA=mZ#g(?@eHB>!t8TCJ=2>a^3mg*W?>itZZVD^1 z<Rv(335tIzlDW*1nx^Rq=c$G4cBmi`C`%pZ!Ugg6}*SFgz=OLwmLsSDRTP=>H)6cGp zEjFLlxdnk-gqJ2RL$)i(CT>YzX5WJpz--9hE&WB-hP2v~$zM1Q1v{j4Wqk|ctIv#( z03H6gZLzSOdq=2`IbqhI)WqLCZbpbB(%_fVjO@qLthwliT-Z(WvCv$sWNa<+MR7Sw zhYGq}h+6m+R|LgUEe>mx zfm7#!B67NskcPorn(^(;voq-Qj`ArSt)sfDyo&6^6-Wu!0KI+t^7qc*CO_MQ`LghA zy&a{o(!Dh;9Qj8H3vOaZ+bQCAqcJe4gA6V0gv5E9p;%1Qc9;k(FU&^^Q!mi4*3+6J zht=B4hA#@yM;A7kR3Ph~*Xcr6P!KA+%cFl~q5FaTZP*5U!(wJ;Mhdr;^%P!PUr$yV z@|L&|J*PMT^TmdbXGuqSasT?)QcbXjLLq@End8fYwGYW$xz4-SWsWHsCcG!z3ht}h zJaC5`?ENGP?CS}U*(0En0^+cuS-#jTX78@d%-ncgN-2Lw!Tsp@?LPqM9}=yDSP^m{ zoQFe|``&p`XKKduaOozj7tbe6Dq4noE|fwfc!WMS*-#-C)5-+pahg0nIX8?;^49wsF#o>z@{Bj-#jA2TEg_LkAv zm`Zw&VVK}KIwm4IY}`LJ`?VUJ$K(0Nz0HqwpPHG1FbPio^r|(t(!WZuHvE`IBV&1D zaO&s79}i=1&7JG&RcQHc?hcLN;O2#AwmRr-wXT-~Mo}!$q&luKHT79(lJz{Y=roPV zE~fg;>b@L!z|mO+wIYjm3AYyMvj~94;8`i?PkFSG6sHZ}Y%helnW;>nPWlCTvqbWl z4?5eMoj*x^0Pil(#&i^g4 zV*9{JQU(<|c`kg`AC@NrMGz$;2LhC{WWeFSP8OdAy3&K^;7WilAxWjf8*vSag!E_s z9V>%`k*$WiNL9J6mh{HoPevN(M~hn5TZQxC)@vFiy5ZyK2g;sqIH)$xk7IGvR-q5M z07C{X_=2Vyl^)Isv2FU0VNcD)*wWrUn=Cf5!CCh}U-7AvVzawI-))m12ZcJ!dn6I| zZ)yz?U6_6pq=vQu$f5;(X%?6CMPO-sR(gvg6`p={z&LUZZVGbi;CA~k`JvI7H1z(4 zG#HeG!FU9PBYZOHtB*h}5gIjEAy*7kWTTERuBz~GTrRRKLx7Q7pteQd)FS8g_oDJK z`Yr4*o>adx3#B8aOURn6j*HE+cgLnHEu<|d7Rq3wEc4PrZ5g)6=8D~kn-jK#RsU?^ zDrpXWZ4&5qi}S%HQ@Mz`kRsU)vJMXsJsK1F!jDQY&m^nK*%C$Q>)vTj8NYy&p(F#Q zS`jC;hLi6tK^(2OX0X;Btt=x#TTyd6rjF>`(z?nG*--7*c1kaB?VaRB!daZ>xDX$q z*$*}*>2iNrlSp&)-Ckp7X{=0qw@>w`w|jqk?Ud!1vTE~yS;6ICb+{vJ9(x;8SGn14 zO>a;!FbC>{fWE0IXoeGB&*!^S(eZF+?hL>=>(_dl`~BG}5CY_U-g@7+*+&%KtVX`Y zuIvGR(A>nte*3nv0HgykGcyB@1#6z~?&b3!c>fRHKdh|Ifk3n7=H|ngx4ni+S>8u- zAiR_W)$Mjxm6v$n8#5Qz)8l?7;QMo2dXvM=fer6Z#LjVd5a`S6O02zje5*m9;OFPJ zw4@Q)j{)!R)2Zv}>FMtNn#^LX_9}yQ&Zc}?(Y3vP^&j5sfB3VW9EgoRXc}ALaUO>B zdb#vEYC0Y=&~NY-ceD^g0$!d?HGw5_N1#7P@(OuuYG?i*Swebt9YZqlkMh>wOx5o8gWonTp6O~R$yGKtdh0}NrOj{9{S7F@zVr*z z_JjxB7==GawTJ$Oc_4mD#_||}{4;rcX{ZhPui?G^_d}1#A9L0THuMJ8lXljgjXswb z{tAA5M1HW8C1OLwXL_JQ-n2{b0wHK4L$6L)0sp4A{g^K-H+RZC&Zw`hwTGR%1*n&` zg>n#ax&Efy4Xn=O&~S$|SW5*Md4=0HCrneYwXNfkRlo)f9iLiSo&WQ^speeRp|1>9Z8rB3&;14bHXy0oWZhSCU_-g9eOffpovh5Tj)L-FPxA)a2LQ0x}R8uP)gwAakHD zqPfI!#n!uB&c-^_J0PRTbr+HK5(zOkW3RBj&U5VLM=lDRhEHT2NR86YBKjV|@M2_zt<#TaBGDvW7z->!E_7{e$B!Cs!jofUp=k9FNknTR2R(ojYKp&(Dq7IFN57 zeqM56ka6HF|AJ~;X*{DL_Nt=%f9A3QjB)bZ#>Hqw|EF0`GrEBp z@gBdvi`#IG+d_Xe#Rw@PLNH08iHB!<&gz;_`8hLc<$S52Fxrv3kC_`H%q4A3!!=;1AN3 ztAT-mPG4AIQuz;VKz@!bP>F)s4z3^H9>+b4m1vbj^Auiz;GUjSAlm#b**HV5Ql-!x zbALxF0F?yYRLk!oPO(5n{qLOVbUqq%rO9M=tLuGLP@x?4%;I9B!C;J-D3d|C{ngH( zpC9yGvc9@N7U~pg=m_mbC7i#&0c#{N-`n*#U;EQh35(H)n3xz)_MRP(yypS|E@Z9hxcPr1Y_yi|xtV@qBHy-b%;8fj!0rNWHUay~R#Q zi9d}7EQmGB=bM329eC!SmgMrbr=xMc_YtmFot;x)A$edS7Cydyj3D6j2?)!BNNH94 zMj$OMJ%E4OPwZ*;jX+#n95{V+)YQ7txk(DoZf)EBkvLdbS(`y=;lObMSr@=YLbX;G zdwu<_6gKm-wbtjmWh*K`c57^`)9%5832*P{$ag)$a^sK6>1KjeZP00TSmOGUOzinR zOK#xQ0Z99hN@f4@`LlPe4=LHs{l9xM|Gw@i??}7hr13G{hgW?2&{%m>>W{Z1oIGJA zr5`mQ#q2MfRYCnDTbu=f5XvB_i&Rwu3%*3aGC@*WAy}T2DJaj2J=Qy&-GAh3;sUUl z4Raw(o!kb&tIt5Cae#iDwPgD5V)C#Bx^c46&tG@u-)-woip%;d@k&7>93%Z4Xu_0^+T7kpzA~_ zNdim6E0jhWIlf3qyj8iw%*KQ>pA`xjQ2^|PtC&2boNwdbDZY%Vum`b|4EYCqB-$H( zdp_&+{TFAvP7G(+PQjup$qSns;>+e&{@*s>dcLpFnR(~r?`g$WRBj*oM#JrAc#vpq zyUj*W9~}QHA8VI|LFI7x^c##y2)cBX_W+Y~?4jIs{T(Mh@%^e#B2Gbn^XR>(hBBfU z98~#L?d%T5CF?WZPG867YTE`y#pijZ^}Nk!$@>-@4UKxRJQ|0?`x}5RzORjgsE%y5 z{38bXd6t?m>id38gM26O8Hmd73nGUoaieq>+cGYfg)(h;U%OZ}!?2(D{!&yc6dy;R zkSHeyfi4muo?+YaCYU;_+`TG5?Ypoc@V8EB(LaI-D93adSnqp6U`2=V76kYDx=_xG zU}p(}1m73y0;K%|IB`jUhS9;FBhi-tTz*`_izszUJXcg%FTFUi76?fA!VeOXIDKPs zejC_H&%&Yxzi~*Ul0uOhZ#(WxlfQnB>NJT^`uG_k__}17YdH-9Ca2L%zRfah8`mm7 z00d?g_Y}+^?2nohrNHK(wDP(^#Nh}q2u>p(@P`8n{!kOamYI7HsS-sobd%Q*^waFD zi7!##^jumTxK`N_??Cw-`nc% zw`+G^vu?u6H@>Wg+m14T@`h7gVb5KgQxk)2OYYJ^LH2^YMTK7Hzh*Q?&-TKXWm%s5 z>qG7Piw3qEKBp-uRlK$t#T6=45G_?eztU<&Hq^0@GD!_?0JCi?_>b%FLj6y)SJH8mS%+U1TwI_eF4 zp_J9c@okw#Ep62pz*wS=&nzrF^kB%QeRo9W2t@!Ai8AfV22ECy#`phWDg^{S(B%U5 zUu4USGtZaX{ba#Rc5qvLsJ`(rF*ciBFa(UPjPjPHRaFWks1rFZZ;$({mK`;`{B!0cK+{g za*BYF4d92egdDzcB&urvA)Q7@cpL>{~!6! z4{msJhO}!fqap6imB*?5X=T&Un$RB^L)=+vC>IRLFdI5v5Y+;9BOh#3vZc)u2I-j_ zg(G<5)pr!CmGoo8!qAJ%p~ORr7g=i(vk`I@x;`S8h=QkL|JUIfv*5>YBu zN<|FvcoH)+`OI;JVI5z9hlEqRlxSf;f_ve?l~ZcjtekOu=>AzkpNiv2?WFYRmDPu4 z6X0Pg@Sws=M&oG}DNgdV4Cz(zhC7UC1p@&UAslLrQ%$-L7sdq$Vf77U(EU~)LDp^n z4SzR^JrH0`QQP9afP8kr(x_KU^NptM(|d9`}03nrfL3FMWSt zI>Iq(E$pN;ZuQ2)%{dx4roNG+a6m4M16UqIW1H|3-?h;3)6il42t5(}4=@u*2#bi3 z_Po|M@cn6S|MS0Zyf7>2`0CseX;8%)A(Y- z*=@pZ1Gq4T95Zo?pppp29$56ges=KAO*i3T2`!ZVsIcL!4&zOTdDARmP(?V>UF1kk z1+C}v*6r{0rGpi{CRJir22z|5#nbk)x-~!6z)7GFJMOQkwTeZ`CD9683O;<@jHv}@ z+T;`=^W@|Lbn;_^kU{KBUq@%$?NB(*C|67uJAX(tM@@G><9LLoX`c9PXl+YZG}uqj zoqKw604s~Of;%J&D@)wPQA3cJt2%8EfU^4xwPqS6i69GhTxQSjC;C?IcA+X#T_YoB z86jg=1@y6xsbd~}n}m)!lI&LtQsxb&uqFK}CilptIwX(@h7<>XG~lL3Sv8aqF@4S` z1bC)Bbq6!y;`O9`fT=|chl%!t(AkxX1b)yvw^7^pSdlaG*GkzPsKg%yd?XP^9Gt#T zyeE6@z8G=rP; zpRtY>EhLRoF4&#OYSfCFt6Pp-pzJlEKxSc+|A?aEs^R3FfuW zqj_avW8=@HNiK`#gDdd|yScKTp%0(u-Ub8@2>O<4%>mbL03YImKp5zNMRfnc0kzHP zQjlg)_VkhLOw z*q(myNnL1g(3$Rc$>aOo1M=qPbjAOqbH`1dpRG0zjGXwQ@QO)D(9+ThAYv~y0{ELu zG=k)X4izqq+nJeyLYN#Km_0FoUNFDKQqAD00~v@jXVU5RX!hmB?c~Yf_DGpr%)#Lf zNT?-*gI0swuBWzvp4v>m=}NU~YXmG8H0v#4HcLuMBx&PCB)s>GS&wPj*V~Oo@wo|r z#yjvHtlA#;JWr3=t=2|Trf$~McdZ#~2cp#aBd*!;Ik0W_w$Xt1Um%;AUyl3)pVGD2 z@t~xwz2>;?jsph`*d5Yi58oV4%bN{+%XmJVlQBZ9(ssZHkU0nPI7OiS78X8kz1vJqYoyKDmtFOwLCji=!o_pIv+x5ON z<6E0>AAK$BmyN17L$NFa8U78&|9veb;BAaUIX>!k<~-S=bogR7+ck26$e;0}5GR=F z%@C?iPq&)ZK!vjrSQA2}jI!1=cD+E=1Gz>G>RvgxtRUZ&BxO?OU`*_yKGJ!$c=%8W zGi6D5yO?YN(^<)*aH~BF%b6MWBD0iuHezZs6xt(X6c6 zN=2;7v|(8A;KnJXGFGnmkAX{S#Y~)RMg@I4N~vDIlBSd>ITD5tk&`DO|1g1rN91xD zv1z0!AP89!sF5hleZ{e%kc=MzlfN4tF9~@Mdo znL?smqG8)5Ab;ft*c$K%ni!D6bFFiWe*(c1K?&s|;GI$A-$#l$f|3Jd@XFqGaA3Fm zhFVz|+=xYr-vfVi9h7vAkR2SpU#H!bpDZ>2e9_AB+OdV}G|3dOx?2tc-^)IYk*%x* z&}7g3_A2^F4{*%#6r&Mm^HY)N5OulTr1l~UX}zn=hm95^Qil1=s?j6J-=l*}stQ2k z6u}GMVBf*&MsEnl^u?Z<+s(ccC4*8CQH1ArRHv|ZM({<>jVb18_(F=;q+Ic(-!9cV zqJ0teGp+~E9*AIg8@Iev$_d0`LpE877Zs*uR4+HKAl1!nr0zn1BrOb*gPFpkp!h^a zh2ZF)9}%=3AUhqy_yLalMiGn?E8etwL*y8kb0JW-le79mg)Gm9#hQ(hL@T_K(dk2v zv|{8y8COaH2Emu!Xn*P-+ren(eD@RCT>k8ajLK|WPvJ89PwzW>bj=+q^LbioU-~C! z?-fjKP0+1uZH)y{^QQAj+#(?p% z6k(SXl-27|@*M3$sZtI6jGOL&f-+_ov2}pn8#(BN7a^#bAV}e)-h`T3qD!Weo)5Lz%v(k^b;-!q?sNex` zM|>EfJ*bs`Q$GA2{!%sY6#G?otiuY2!3r|BuC?~oie>mZ1c~(-+@w(i21{Z6NqU3`4b0u@!8o{r#;ijjL?4ZI?YP;HYhC$2R1;^Wip1H z5a6)XV3C-ZXxq$>0s3Sl9_Bv<`CVfyiIISi(D=AuOj$`OU0zx{G5;2rPM-DMNOSMN)khSvOr`@njdXseo z9L>D)H6q!r<#ap!<~3j~I}6kjetj&)u(;CaCV$o6*3aF&SPzL|^wkv2A|nzK??Wx| ziJ$DnXe?5*&*#0G#|3&v`21(P>rk)w@MNK|zZk zMMr1?(E-nAQcB9!dqYmY8iMT{WaoRxs(L>1?D)oh=>$wyr#nw;@C=(*GQa2)=}OwviT0o!B`@qk@KEZ6a7r_&y{qhO>DllvtCRz2N&%CP= zk%M_noC^&%N^*a{Yy0%H^2j914zz5x))k$$!}vPU?y zSnJ7(f0iiktzzNc6+Y1l<&`bkv;M*rE19-sEqtO_5g$lR05|YMUl6VW;bHXPwN4*t z9=f%S+C^XYFhnr?bHtUH@I&Nxf7R%rU$Eo_3;g!T&u;}vuAb8E%?3E>hylS_Q1N8U z(yvW_P(x9sc*dvrJ}m`7F^Pd3L46}Ke+s?qV5o3M!(xL?Ag`d{7Pq5|a>2B!`KXEh z3h&wh^TG-BE&|)-Xmh(LgSv{Br2TfyG!h_VW_`30*4#XAM7mjfH&Oh4S)#46h942U z*g<(S*UXa$F10klr^S?7bwS)tyG_2#Wh7B4?_pN{LU9wd$b2N`{5j!0^-^eIv8#u3 zB5IXb``U*J($-#Ft7dbJdNqyHj*W~9%k@%yLzK$+`4P?|P|9@sTUPynC4CW~x8mCub_lcZ~Kwuiv-`a&S0r52L5b2IJQ*S_2f= zRSC-q*Cak3fXaV@_rN?q%If4%xCe3mTewVB)>FSf^?^B~`6HK*UMg%$?O-ZdCvHk) zs=pI%sx8J&X@PIxcp_KfOwm_7x*f-uI1J-LX#Qh5lP+ls4O(mI;h2#fuGU$)cx_|H zbY)w$uyOp{2~z!=z_L8P!=1DWIXf$^(@9UCZp$&au(tlXrT&>Ek(svsvbHaa>1mGh zoRUcMW-0WPyV8Xgg^1H2EJT1zfwG`PA^k-G-TIMOswQ+H zRl!dOZtnig0b2G#3aTN~gT@<0Uu(l_)^$TUKNP=uu|72q+iRuK zBnI8iQxFC%sOc%ic2BGbLF?{q*TCPp!?SOS{{F5;K3${>;K0s=MNRIYC?IH3r5Qg% z52Of%gw)D_UM5+EJ`J_K*ZFyf*76)M_R?dLy(YMONN{-@b>A-WoCyk;RAN)uxg}|` z9l{^-oE^B%Fh7`Po!pZJ@Ocp={#GmN*~$sfL@nt|T5q3O{z6m0OLp@Sa<_Dw7ntN1 zzl6o4;o-ZxwT|a`kX8eSCgwM|F_U%;>){;bsF_4|S9TPdIc>g_h3uAwAs?>ngn@i>T&Hk(W(X2-({A*3l?inGPB z-Q>KvsPJKw!R(7l7L%r?yUFdkhZ*-|G|EPF>Y+%Kq45Nl?vq^j>n#Gbqi~_{W0&k^ zf$Rzy2EW8j)j%q=CH#T%1+fXZu{B`qXl^mY3PY$62{G};dbzHqWU(n3 z0^y`FNaziBM%s6Z#n{-{>Hnf|?CIAPapbM>dCTn4(h0sC$@7>xW9lpq-+!b$h58ZQ zk88czFA*%GEr=c(Wln2&?%^;NE`*9hhOK?%f=N<7kU_yz%=pgqMZ}o8xP}-FhBS{i z6jdq<>LcZn^MRcX6wbreNH7+uuvzX0yarhcywyU*?2vfK77~_>{AMVQ&yhq@q3EFs zrU6#)cLa3L z?`9oJx|P+?FRp}ujH`nQgQxLp6w;-x5iu;=;|H8ZZReXFzloQFm+tJ==~orMSA}0| z-o7=fr3OIhv_h*}+%^Ix;8%;omeA|{R1^`v>+#auuU``n&ZBEl{gKCO-6X=F=BxBn zN>zh`f`A1lhu6eHz5?&xZ)}gm-=&k%*&7jlSER;X>6hZK#TU)ND3Y>2y|N^ZmY_?_ z;{$@h?BO-Q=4X3fAOtp(rLwOK-@(X>2Cp(d+t1=;M%-`5E07u@zhDhj;~03eYJV90 zNO}h7RPwK)n3BV7k%4~E?_PVVar$pYLi%%XSl$7;l`4a7AgL0X{M>0z^k838u>Lh$ z5gDif0H5+t#j;pI$n^+UkOk9Y`)(5o5C={o!gfCYasoM*?uXSH-`;!wA){pSfM5X# zZoWt7B~uF$rgRyFD%cUC(9jcKVOK|eW@#~-BF2UfIap8qXy9|TKf&kYIp6#F3{U`i zcz8eyV`5^~tdE_0RHv|$xN-RM3vdSqZ6f_sjr;Qxnn-}zkL>60yZfLEnEkS#{ez&? zMSp^L+(Nb#VB}9Mlr)2pigqGhNEB_Qbj@M{UAuH9z<46SrIWGB zP^t$llxZ7lG3ed|c38_rmFsKNzcVgbnJHN6P^i6!x=%ve(b2}#c`fqZBA+-U*_}Q5 z(YhMj-6H&1pO#CVCK3yOY?MJK@uzyCi4Fq0OrK~xX}59esA?6PhIvJzR#T$(qjY1T ztc7C<18QNbrY(bNnnnr3V2v&VJ0|^viL_JUxFQvM(umxSqe^R^a%pY#%z}p1QTbew z8l6+(k}?d2dKz6K*s(D7ia>=R6W^)zr*f7}r8_Q&RX)ABUC7rd)s*Q1m;8l;yS?V* zEJ*S#a-;oYyNJse1v~nO8zHCT!`qDC(Mztc-EMr9POs420s=R$6hYS{w_;Y@mIP05 z|2)}lZkUjd(?sz4H*mi`)LaXn*4p}=#R)CIa1VTQcsaTVn2pbTi{B34IUw21>X*Yj z9{I)@c^dS=56yUtDe{eNh12xo^S4SA%}HP(K)%rL?1ib9E$ew!;kh-xG);mpU%mis zC2zU8Hkx4Jrn=1r&@w*@pY^Stj5IjC2>kq}pHiUy<;zg2FKCDw{YQfN^@PEQSzLiE z^U>jZ5kv75D)$|s=1tT%r?=Gm+`IcijrngKKSL|6!jgQfzl~|=U7SpEfp3%cR!%VZ zA>F31VfOQc8Nd9xH0CQ=$WZ)FQ`&Al$1UF1L`7pLZ`VmlE!94uq z`vS>Ob`=yg6dR8Bt%?}Z(0spO+KST86?0n@IMwl#-!s8NRNV(35ZPpIR9ITm!MF^q zgFnh#k>=`-*Y2WX1h0QkH<0YJS1?_&Tx#Rb>BplG`bYuC9j4hR907V~#s@&a^CpgS=8%e97n zss@sltdt&!D1If}8+3_G%b7jntAE6lGoK}}KZZoc{{dU=gR(uNsS^I!C*MBcpf4yu zJe8<|LQm=``F4_Awfm}fvjsWO@;e+7XWx^=87?3Cl`+?a*&RM4Ru+aWvhKGnJotkQ zKcPR$nE@X^XgcC*a-yM(%I5|sI~S5gEgcOLoB}C>2d~@X-rnpNs2B%Z2B* zy;MYMujiTaA`34O9{sXj)NEZ1&H1lfj0-$r@lkXuHwr_|OFVr*XN9n(<-yY$JU1}3 z^XS@BM_aqeZtVrw<0sEc1Gcm$v_*c8KeR#5&;JNWP=HxpFTlE#wWX!7jrR|38Rocf z)CXVbK;GMc<3>P0AmFww;0|%r+7xgemSKo{&U=i^?MhbNVJT`O%#&fnlSDAQry2;&$ISudXaBOusJ!suy(V z4SODO2?+-nOpgZE2Ouf{yi$R(g_)Td>D!MI4p9K?-ndbEU-Y5k;rnWyKG`b_C48Wh zi>TGN#%z@~cT-;)Onh8iprfU=wUsWB?)`g1fJIU-zdl;5cfZs0*=UZ(jk;^Cb+GRI zlso;mf)Zf8&W&>v7}X`NHb4`6-h3_V=kBwXE(Nt~cO4qzsnN?M-9(eQ149=ue^>tg zE#nJ-Q}y2lCs^zsTm{h$NA8Pam}6ceZr+=UA1M77)ox&-Vq6%&;*8@fn6 z;CfqKaN4VsU%ufes)HJ1Ez~P*pv6>gT_KCt#)^Al7(r^??DIAeYjoA~(VsY3negIh zY*%xU8=ZJetR_*lwo&Ui=N1!OP}M=*n?2(0m?>fKlrz_&WK*S)!_xX$#&8Hk5p`27 zdQNPJFpCO$&Lru^R%MeiMV%h`MxgG=q?RT#n}m^AsA=e_WWzYKKuA|EV(2;?ftuK; zY*HSVPG?et*z(4fq5N~C>xj&vjQ-3*+1yVxt)>HpWxB{lX_Pn(b@NJk&RxXD(xc=v z0N_~Eab&YLAKv*Lha>`twd<4IH=;zCva<6dv?H_SQGIkx8& zYNg!-`apv8I=B(thTa6umqQ!)I&;D<#qQM*zo1xQF8azWNACwtF?hkRS=!$!1AXOc zUOxB2-MjWZUxJ;Dt?Tgw zkX!M5==)?BueQ4#511Jd>JUK0c0XOncs~ET@@7bbNQq}{ZCx-QS{y-PBrGX8u2pZU z*Wn&pkItvrul44;yJcfqqJF#@UMpqpw*T*ZU<*K99UCDU(TO37kE{_aOsE8QW3+4D zKyt-r76H*@*0=E1%T1A_@JTyZh*ad{o51l9pOOEi1%gfWX?&#=0Rm67+0s#o09uD#q?0#1C zf7^o8W{72n=9J8qxr4+iQTU9Ad&wKn6MCq_&SJp{$8B zRpRM=MM*ky7&=YHrAl2!rF9)-UN)5{jc!-fr&GV`6x8Zv-0FF(xv{8ILSecjYu zdZ?pj*I>>?GG4g|$QgCCl<6BPvGM2=cBLyj@s*7z_=+0UOqMl(FAEzr{4v08A#Hc) zoKi=RR8wWqJ2==GO9!bES1WiAijYHicmI!Uk2k@$I6zidpOmtqx+9>rzBeS*S`k?%C00U**`i4Q##W&}VeQ;b z>4ncB%&plNKN1!3l=b$uXH~r(l~tCOmsT#{f4{eiSMfT?PrGViH$yV}EC2v9xY;eD zbzA*dNeVuY=?g)1q|l66CjT~oZOT)5N%&VGQ|aTmWhuXNsO4pqjYS9{?5nywC@$UC z!Dfs!(VARF@dPNXrWtJY2x6k#i~nf>_a#CE#v7$x9aBEuoL=;j`9~rgm0M|OZycAm zo(o)J)7MphBc3a;MJ?tkOW*5$n%c;$p6gOqdGzzr7J4k(TLK89^z`&%?6$D(MxItc z&vfY8jz;ofWqP{C@AW0y?}hh;iAuu>h|F)q59h0=Mn;6qXP51|ZP-!)3((AfdsxCp z*$Vjv6zDs#!%ZHp_JL-A%X@Dim7%An7g0nl3J>gE2RbVe0*A-O4i63xp&>tHS65cr zaCy79y5_L}wfP@2Gk=VKA*WoU8W`kRQ&nXP2!@;y5!GIf>ZeR6(h@T=2vc3-U-UBM ztEO+sjphE+6_Cvg6udw9Xp_E`&Hg}i8#J5}7#IjtLe^THzWsRG??)3_X|h>Pq}NcC z9{tSX4&VZy+yls769^Jk_rZ|_2!WbF$%XpvPmq_`s9QTVs5eCseoGaPFcKn^hoi_0 zyn+B9|Ki>os6khbKx0TMgb)C~0QkbKSn?jBcbP3yd+pBq7}BIIKy}_TI)q48N{ZKE z6Izgyx~$&s)i;LvgV5U6IW%MdurwTSHVJDnK}^8>EM|i)AOi)~ss<$HuwWwQrY6P2 zC~9d*H7n;!Tp%U!#5yTa%*hw(MDWC59-SHvLA-lcD z)9!3ur`-rVcAx>{dDtU_VB^0szYfTFmG#!~g!`H9g3-O=QtSe&85my3n1UJT4Djr| zbfH{T!>AfpA-HN3vdc)iQLlKJrd!P-Sl38f4smR4d(K7hk1ty2XkIyxYk^m0k^;WQn@#;FKs(Ns$U zsJhA-O^Dc{TK}I7H;#}N<=;hEbS73h9@8UMPt83hshdXxYGcd)C zN}+zx6B@U8se7^{kCI@gwU*Z7;8!cZ5GNy6k*Dlz7eQ>et@Oj49@m8r`R9R<0%IRw z)X7+5)if|{zeWO(^kdI39_3*nj>*RLtX83?Qr!_+bY&$ zwKE{`RK0@VViJldIaz6Sx;@d09&!Rq$lxo%Be1lz$*J=XHM6`NE?Es&gI>F9ttBTX z=QA)gC|;zO%6XP&1(yw%9RAb4#4GHWhyac_38l^=h0iN18$G?vw+kH3qMmU_@QNGk zj|}>h+tkGM^-XTkAM9Yarmv{z-}+~a&hx|d(UG;f0U-PabeSZ(wNb=^VRWQ!tlet{ zYHDI{0Xe0B!^sNo(=jI|;`<(WHE;}KmA^Z)y1`Wv`d3w5-SM(`z!+6jzKl>u5B1|Y zxw^V~dGR9>I9OD;!Usx9NwwN)kwdD>^TMxURX17wEWCE|CgT6?QsfBxUcIjpxb3uEjBSWgTEA2&X=`S zr?CmEfJ|Is(pcQKj3ZD1aJNBGgLHyA?Mk)c@?08ZWgDrET8O-ogr&J?vSI72WhPTWER@?WU%MH6^QVp5*8n4xLqe z3rvavo63UC?P@XLXECtG3Hh7VKlXi@HODkBehbeL|0&V#F8Ji-6Enc8r%XQt1-6Yz zaK7K+-Pvrdh4WA+`f!tSI3gM->8;#uF{+qhztw%JY^EcU_=e040@us2E7wy(XRoLF zD1$#8B^s)W(MjwwfzMg+;m46R*Bdrw+WeaPql9bUGA1m6Vh@4Eo~c*bcZqf(Kz*20 z|6i#8H?hSi{i{P>8g@w@k@M8*(WW{Zj88w7IeGh2KI4r*3Y8fyiD98rq%8R(ShWmdeV`?$)zY zW+U7-Yx~;s^AJ=ecQe7*{XsOx9%eU zZO;H6{{n{=Ci;ii1iDv%9*oz=wO3SV$QJVKsrl*Yk8cNn+?(+&d`vP%++nw=WQaOY z*|M~Ee)e(36Mnqj)f_HM6m$~v^AOx zz?#+_*?0Tbp3Szu9sq^LR?Ke(4M2Ya^sUS+S~db{3-FyN!|xu2~A6+*yQWJO*@*urw;0x-2`-Z;xM5D7y$m%fQs1nY};I-%K0q$lVjb^MF zF}Z_b%umWhuMo%cLGb0o2oq2I+;G7$ zV%%UK7_SzX42A@1YT@Ldy;C$FFSoO!ZV*M~n*cYsbhTQgyxpyp zwf);rmy99DJfu+0|75C6Q%PqdoWy02KQdo})G+E@ z*;l2sS6+XSsC6I4(EbUEtB}edUM(h5Ehe9K+7fX#4YJTQRJ)!+M=yrH`EWp{A}$YW zsqs+G<+Zr{SFFyh@5$j~eKUs@mtW43_s46``l2p8d(d)P{VMeD6r)Sx>m(m7oiwK= z4uU2Q9j?=Oer~hfZi*>``~dUhr4D6~mXsriE2duAN+;1qq6UWrV+^uJqYw-*`|6g* zYKu2?l{S<#+to9>)uRuuN1br?1R80lV~q11OWch*I==IE(mQRp4-=hL&HU9x`jNMD zuv15w--nZo#o~r}%~<>}Jr8+-T~1f$Qe$L?LD4OvILoC}90R0$VHg zsoqQH}g7)hReS!~Wc^$RM+$B0JWyOKr@0rfPS=YRrM{v-8P22DAhD1wW6__L3Z*^Pc z%}*mY5PCZ6pGfDf)@yIN_W&`^1GuaH3wP5+pn)pU)ZN|PY4>YZ7%;R?H$Fa|E%iu9 zWSEbi-{9#O-bE4aqtQAH|gb#l=;ECwl^NaG<;jTc>ITIo%C9Ouvk9K79us zB6Hiy4;|01Ot%H}=FYrdsLZ}&Ik(NE=kkpzdi|JVNDJF5#U!~o=fy`KlV*O4^RpJk z}GKhX+`XF;zoW1G$g?0?L`m`i7PcM!2#iW%$n%-fep2V2NI<7ptBY{|I6{%9PB6pspVkTa_mvk>c&m{HbjbR6!;r<1VmFWDcoSkN0l)1QHf%cBDRb@bE< zS-_;HX}y5&{rw`vKNuMpI@T}yH{77#AopXudpEzPce2y{yxd(`UY?&ZNYo4YUuO;X z_T%cp_g{Wj4_m|!UZ?D9ul{alA;Xs}`;p(VklO+`DnEOcFJ#e0702yYQtYr4a_en~ z#e1m*L4qa_h<6sylS58Zl>1(sP8xW=sIX46r$76!At)?LhqG z-SJA(J2uvrY&j9E;u{F2O6-iUUz2Nl>6?4`n*$7adYR3!@X|$7IVA$wZ)uHCrN}Mf z?As{%fHUr#Bp{Cm=PizEHnAlYMhNGn5YieI@C7@wZb!x%f`D~agDg@m5f|W;QO#ho zV5VqO8lxByaYVCOCRyNciF@ND>af0B7eocI@8mLgu*jf~s*BeoDp{Lcp|)_YWBg^| zN4k(ScGh}MNX7+6LCd;-E)1^L7=~Iy2eX}ZCO21Cgihwyxyq>45Cpe=#bX(QU>#QL zmHm#-&3^1cuOvj7RNQw!2~Y*iba!{x_E%fu$k@N_T#gvQg)a;u;-K{8D+;hZ>!xC= z)KG{N;y=c|zVps~;cAysUU6@C*LAX_gnu1i1iC#gcL8Jp&>O^uO2-YT>yfRmA07j- z;RAt0;*+A{H2-ObNT~qOo13J`K#Y&?$V15dyTE>dNU~?c{_6I&UbCWk)ib>92O!hU zOi4-kvrdbn3F;KC#rW_43;}O#2YGt(dQ1{k;Q@-cMLR z+hL^_8GTnn4jxU)R;yrU**!36UX-1S^+Fq3?0B=o z)WNh;L-OYvwIf3dXgv&Yj93n2LL9s_PX4M^Sc=Q4CWj3AgwkLgW{D%EOu&aKuIFS6_!U_94mwyt`5@)+`zkK0yeCMK2)KYT z_QA8Pgq(!gJ*)&#T6&WX-=6!P`sOpy+(8M{4fm%6AD$h(K_~ z-;zY~vy)XfKfgOPzpJH7VxLp}-BpnesI0vHtWEMPHoLU2ol;{jS}hLa;Mx?+1RAj7 z4_r%pJ*i^a-yAUUMaFEZ)>Ls|9uAZtnSS01Z1;zQ-?>T|cgT~qWa_Rk6PgO#S)`1$ zu5@-0YP0>cCx$q#EEj2b;CCGT2-Pd%b|CiroXD)T(P6tC92dz8?E)>AtD21d10Dqr zXcc^Lk_4MctgP0orJ=M3hYIn8@_@an1C3n-X18V-ZWSMKDM(tiBd$_Z9ZzeJEx0nw zqclS-{yGoFiY$i_umXTn7HMySoa%0CQ~|p|xA$CZ>;`5q%xLk<<5~Ab3$(h`*?1&B~}V6+!mUwH!@;%#>M5in?sh^(1EJ1 zghtS4>#BsqUOmU(9$;c^wAajbp^XP~Jl-eo>B}!z9ho^##*qF-j99 zkdYrEsz$E#Rdd`@U_sB$T8#)q5AsNZRwfd$;wj^);>(f?Ga+;lkcjV@ql#yIc0AOXgL@iwjm-k_4WeL}3R33Bq)i2nC#f?yQr zzk;9u!W%T?Y%+oiu%wGMK6TNsbM0IP3mqeJXZ(iYFjPLip%X>|w`pMnE1fkmuW|Xr z!GKKyw|FUtDH+8{t|ddg9c2BYZ#QmQKQTGkW_4n{+jn$SF=4v=7CYjgi`mGkE-gLX zYoVt?{Sbgx1}`cG|Hon>ptIt7fL~XtAAWI~P395y87Q#Qi3)oF)7T*&sD7Y{1d{1t z0%UO1 zH>aZ#88oKDL#E6O=wRi8;-pd;E3#T}M)_8V!{Y3%P&quNAcusqIY1c}MPS@&5?Fy~ zE6>SY9bjvIHdYgNcAdW(ZelEcb4e=ZHF(%uY75M+xkJ`CV5HQv<74Nz73V zF#Gbrj@n9ZmHvglPVq?TIqXecSMT-8XT1M|Zxv)dTgltGE|vI_8r0X< z1Efp0ybqir zwMc)C6)rL-lv;@@>u+g%5iv7MTv^8WQWG|3hPEWJc}HB&H*)j>6^R}}&_A}~cr9Rk zlcZu)Mg;W5`SroWWkq|ltdWsVaj5!I)b!nnD%0QzJCJeqXJhU<$Mn{Fo0ULRQ+MyC$*qZmp9Zy`fwOUCkLm{M{ta8X2#NfE#x}Der;7FvUT8#+R1T^Hhlov;OcM%@bWp1)WScTuOZ(2<#Bal zdLBAzzhpp3h)Q&rWM$R$>xYp$H{ytFP0UU&YE#Md8<+ex_5fCLv&L|P3l6oANr?M3 z#?KPHU>+Req8#d^H5X0Bj}T4Ou>|YWvXsQeN{meB9U~&2Hr4eV2&lVL4Hl^A%=dP= zYMs(}g0XG&>G`WO4bAfj_;A6fMYWlk^GpoC-x8#Y;;F4}Xk|UPH*tyQM68dHw}jC| zu_gJ~<%cOF$Vwasj)Q){%wkH-mltIPmAOap1>{Sun{O(q4CMw#)B>S4 zsyxbsHjlSVvx_gFI%*HFRIr-Z*=(%09EZWX{&@iJV|OGQO8#}jvk2ax;YefV<0BF~ zZ4}Upx2#D;B4=w-M@I73I4A>42zbRkK~0T(iK+_=De<_}^9n5?v^X>0ixjtUx%Ta~ zagIPvmj=zQNdnD>{!src>-_uuN!|o{8{#%~bab?|EX>U{=JGejYXoxNJlS&dVEhlv z0U#-Cz?#pQU3>JA@7m+@^Z4_(J2*i~iO$5;tc(1tF!EJ8=C-BuLKAyuhNj>_iZ4UB z_*5ced54q_@Oi=7p6Z2eo-q8)QHeTxnfimnRa@Jf z4v1;IL5vxJ*oF?@S_)(or@>=Z8@rA6$c*DF*y6TGzox+~O{|fXM^9WzO5cX3hvgdG zgG}8IFnHSBW2wY*qBh<)S~b#9w$>cPILw`U+dvwm_x#8yU`-G&3ema-PZx;>e9-zG zKl+2R8XWQ70y(j`V3xIMnLuUeg5z9QZl#R7Nb0RQ#(f%36&;2YXvsW)OT8o#$9#)> zt3AN!pBu^?>JKL_`}wO5k;uN0>NYNAd@M<<$ZlSks*(CPtCbV{`gZWoSpdNZb8biG zk|px&M;e00N^*y5=TPsy{xETBv%cA>y)V2Jn)I8S(Rzxj!k0(-Cqn(l65KK0{K+Z@ zfaIiv0KVyekI}#9XMbw!?q6B}@{hZb&l`f(f{&?>(eP1(iGO5H@9vO*{PNLzSC4zuEA(r|-nw6+*)~ z4M>)NavBWZQ0py6sDR=D(m7QRM*r(Mx%)y3u=I(Sf!-a8*3#B-QO1p|;Nyws0IsnB z!vj>pTjNltT?nKZ0E1+b!3I`eD}Bp$6{VA`w>4IEUbutgcC_{cvAS^ih`sT*W&Ra9 z1q>k90jzlAeM-ZF|Nmhy9nO%iH@&B>B#X~kw^`2>&k|oHq9g?c6IY!XzvPX&gvkF{2Ms(jcZWYmaiBiLQYWyZy*R37fh<8uMNMlr9=e?5KtDHZ znV7)0%cL240WR4c7|LAW@f;e`m}70`-X%g(x!>&4f(rNyAij6QW=CI0T5$n>?o5xWiSri<`pm?C*$i{g?3J@x5|;Zid( z{LU*{WH~YgIXa^Qchp7qCFp<;vDGr7H@FzX81CAt264rq#Q@t9W}ZYAoKM!ts)u2a z%rIRH?=$nYYv}GzbP`*SADyR+ccD{S#Z^cj{y}lUfk2jxS!)-jm`yQFbv`F0;6i5b zj(K(v>ALolPlh56^E4HF0|N6#d7uj9e|!=IWV%=n6gl`*We8wc5&MgW0~3G$5|bqZ zA=fj3wn}0TQkDsHz`s^gCPMRdS#bu7U}8&rdR$MVg`&8r(t05jsnlc6CP|1hBGoUCcv4pr4sK(0+bpu8d`gM z>M)KwDE%78k_YX-uLbaq9n#RgerJBig`M5ewYLzDUqqh1Nc;&}9Kpf8v#eTtR60Z3 z2MfB4-- zX#<+NIw*b~JYu(n<%T%^E3ZyJpfz1%W`t4vnnvk)^a)#C|6O}dkjm^Ry~SRjG|Z(`X0IP+hsakHG0tUN%aRWvkZOr43W7<;ZPV#oebF zC-4<1=q7@l5g-{y-+Lu?fpF>nel}+b08ShxXqO-&A5)PB4RFZI#vcG!K0Aj_l}{Ih zY8@esN#4my=Vd)X&~L-Eva8MLZ9xtiw;q0f|j)KU>1RjY%vx5PgYeg+9y z4H-~dTMNhw(d@4HfU@Yq!ouce-sPM}CLm3gB33&o`4E$Ip3qGMsQDrOb%}azsLvcP z!GB1W;9%JJ5mi0C=j86E!n(Q(!_@^~$h|RF`qM=>KRq<$ zU-;!OFKo>W>Bn>R_#ELw!g5RU+0Q=4?X2VuUT%LvkzG?8R%dM8JVlpLCua}g8nR2j z=jSEf2T0GHI6SOLsj+R-^so1gn{n#GQq;{gnVDxFwUb*bd*2@6)y}=WHseuGQ~7yT$pB_V)pnPMNKRR_K;dN zKxiRdN>N^dXI55mwWkZuI7S5I>V~Q1N))huD-U#8V61_RvN>{@604=K4rabSV8$xM zDUvWxQ^HTT#uzqro%JcX za`RU}q5^c(>l4|G14-GJDV2@VJ;83|vwv~{O)Zbs)s$bhuOZ&QfbM^wg08lG*vpp) zw15IxMMY_8tLOE>7xoOCPFPdLGdP(4@c|If`izk6Xs4@FE6v%h0L9|F9T^%mjkzkz z`K8jNjuW{lxOc8D=)2}IC4`l5v~=FD8Vjq-SyCCmV(plX?2%XcjRMqxtew4${@Zq+RiOk$X= zW;~3S+MyRKp-u;k@ib*XNN?Ls_IG+PAzL;_z=z0a)O5OQex@5is@dW&pP7NKq2V16 zq+Z$rTqVw9QHb|Dv91xo7so1;NoGG-`i!w?|8tb3@a~`QDDddGBGK7#9nkyDbniHV zrz*-ocL_+@Ibo_*^s=F%we21N>8|6_M+3yv#UwrTGG11;ugE(wayct(-hC%^j67gF zMsFw&kS#j`b`#s5!8<~-`1zuBz^Og~GGXA;nI)ymhfENWIW-T@OmU;x zhkNpf>8<3+`#RuMmweHg2Gg5w?KEFpYI_7@Q^a63T!by(?=l6n>L@NT)+j=1aZk;T zFz&CX@wFDAR+WCSJHSk76CKRF$U}AUC7}K(dOKzONchfD1$xOi;DcC>!iHu19gPsc zPkHOrO;abb^_Nhvye|yjS8~Li`?{_FDO+_r5~d*hIXc`sT4gl_Fvc7i^aB->H~Y%3 zTdJ|rp(J61A_&H99JQwop$2IS++s(`6z4KYce!*)Mr#en&S*W2|Mq!*7>irJ z_dYJ6C?H68NH-4MA<`%y4Bf+kbfYwgbTEfaqqeS2hmA09 z(6mwukaAEeF?j4xFg7n>aWh>&kWuf`>%ZTm%a%Yi6B3$wLBEIW6jf*~rzO@m$Fn5`c^`$6Is>#IDss0-sJ$jAsHBQgx;HbwMmcWjc`zpgZS&}c`&AQu8y^52KQx(U*|8M)bnJq^x>9fBO9@i1#?P|*jJRt+a02^OFH_bHG8qZ%KR2T$ zwr9*HZ+#}|ye)vrn#BQLi(`0c43Rf!e-+|`-uQ&VwYq)X%6vO^&BMEOxVyU>aQQov zQ_~q66?Mj(kzvnLo^#vRvr0@n+yDNvgVL^Dae^@1z~iT%G0OdhqIlVX($BftLqOgh zxH>cFO3=@lvkbx)uiK8uDy*p8FmQdY8LlI~^$L!_PtgrrRJ9leyNqn~Fz6vZ;mN|2 zDKhlB7>V@jgd-2BHrp+Bc*^6PjBp-Xs{)LqHMk&LcQ5(Zq*KuEjZWzO>VI%V)?FfN z_PTa;a;mn-(X_GI1BRLnPr@XqHtC+>Ti## zf171t&>UO2K5T3gsVn#0V_XS%cQL;5F@E(UTXjQ)q}F5)yY&kGdwWIqiw(&y7N5*X z*HW)8Hvo7PqzNBo-Nwa#j}a#Hp^w2qGOVUSUvHj;$#R8&&nfKthkPt=i~5QZ&9@-x zBI0KW=W2b#WAojtdjwin&~<-Hr}nbUFe)qKN2VCaT)hCGWx$~i-BM#lQNs0Qc@yfX zx+M?m$(0B~*G8{lrpe$5S#r>p2((^c$WjI}aswT;6lpZ`;n=fFN}_9uq(|h8ipu!| z$dU3l6FuI{xOeJBJ}fDqI#LM3iM+vaUo8D3L;LH~zTJ%c-RA)y_?~0?o=~#W^lgVI z&qAKh%)Fj8Vacali9i&#PrWDg>Fv{jNc@p^Di5z?IZv2xdifNT4pG z2@1bRRHANfSR~6~tK?P1q>qTPiU$2D&7g>@9KQ9gf;7aZiGa8LX~dSp4Wp6DY(MHA zdYUXkTh|+Yb^o3zO{d4k3m~*zNN)GG_0mng-ZxG+7Jc?13$=sHV_ccMzUvSu$Y(bx z{;Vj-e<$T%;iv`#b|cn&{QUgit?L2;9yTv{AO7gQx^j;jblwDq3iXJ{xkfrDQl6E0P`ZDG$$=1B7tKF*)AJ5(*%lL*9maO;5$Z=Q2 zUlK~o=M+|i7$SPu-)#`q(n^=)M(J{Oux=40o`nrv^+Ip5;bMM`nnv3z1a;MpWS<_6 z;;Jee zXPj0#9(#sr7VH`8_W6U~;$8$r9I9!s=S&MoT@5!OHJ6k=g4w?c-%tCkxM@O&C%nhI zpZ<0W-l3#zl*sc!aW{kG=|D6Z^zFDwAzz*$Y=A!?l$^G;k|#zCNbv;QalLJWxb1Wy z;#EW67}_DJ=PsjBkJOkUvTtQL>B{_x(acu?DUCZ=?Kj8GP6WgTeNT6)dV}*$5Q@vyQMY&`!*4d0V=lDF1}S z1El*$bb}tOM^G412#g5t(w}83ZYezsD_yDbLS^%L&Ml{eJpnSIy(F21#j@CFS2vZY zX-(2FS>mJ!^=#OxT9kLp_j8{fzxJY0Y_IW@&;T(pQ$5qZy4avJa6qfCkXDB?)H=%# zH%lkJv6W{n$W5@aBuY399(D)d-S5~pwyMp(Y|6|`dj#=k&+STT3{~MdLw4r`Jx96bY52lvor5~J&@6WwuvR1-LrpFj~ zc1=liNsb4+uCve+Oxm48d;)vK)pmngK+-CSJqJMX2k(YiYJ_^K(R%~W_0xI(dC|9R z(TL84hH5^_%_Qf#gTQ@Pt2)A8Uq33JnozMs*kzB+(>l(|O38PIY1fy*)@s%tY&Wwy zpHQY+Lv6g^Db3w=Q8IC80`J=RgREbx3~<^9vA6zmA?nFCrHG)BI&oWkmxF zc%JwdEmzcfCPqc?bDDk{OmWCcJHeDR4#;kKtvy@HbU;A(9)R-~0i`Bt1-Ugud0`1> z7^7Y$iW#{j%5N7rISz;t&M}7FALi+Msx@~^GQ6l)WNGS6Sm>&H<82{4Hpx-r{6w)C zm7e1F4=iu_pu!qi^=Vd)1H2?`xgoT?MDKtiO)#QU{>8*cF2pS}@)By6VeA0s>opI( zOl7>wd_`og05KrI`g2V|3JRog7c@(X+Zh}fKt3^3xZ#clZTN?SfaoDkC{QAbTLh>8 z%6h~@Glk!gVO}wwGQ34TO_Sp3B65Kv;)=UrKZZ<^`txp!Oxo2!M}6@1PVLmQ(R6v5 zu-AQMYHfv1KIE@$cCvAd(r=&3DRB}uang66Jm=RopK-|{ z95ZWKJv?jn;M%9W@Z+dJz7HZk#$`X8IAT!1$^@~PzcDw*GAY)QrF1 zrgxHg>_-vTFCzhUitnz}fB2s|b%I*g#&1^tT~DaWUYanO{@mY-D6~ zGelI0$z52`UTTDWpMU;OFnvftb)~wzF_^m!atjiDC>!-F%3b~)CVgri9^5NW_GUf2 zP-3xCT{}ivXPSofAYMzTcY{OTg12G>W1B36KA)-oGSF8*X9S@R$IEgB->DDma~*x zWip(}N@g7ZEQ;-m^TUc91wp3ODDYRegRvcuSYPK#pQdl;4L#yggvrwDL4zpOaxR!5 zhD_?1HqzQAa9^bm!zL9UrQM|GPX}Tjnkgbz$=R`~;rc3o-%?D|3`JWqV7y{TVS6F< zBMAsOpdY6An=4w1Fq-2`k>Dyf7y!OVTcOKoudlySZbx{1cFf@Cvsv_?o~PogTanw# z$tpbfa^2O(w~N90&xDl-GG#m{kXA9AO)F$96YA*>ChaartdtM3>e~NoZxn~+X_;bQ z4~`fK8F@h$(HISK9ju+>5DFpT^0ST&XHBiZ!^04G+i%;;}!C_ z1$PnA)ALGOTU%PX7ic380)L2zIQ1G-0K;${9ru;403y*<0JlK)pCd5;S7{3Guq_wg zh3t#=i2h_2_`!UV%S^09k+i~U5^!M;$&ubld7C4zqt41zk3PDGt5}~~Bdaps$^6ck zl=M>CCYOJjm7Od);i=q+S9UC=q(f2#z8j?KGmiFYMPW;l-TqpNaBqTFEDT9ix;(Qa z)o^Z*`~Bk)3K~TsAv5i$+!9TlamHfuXfW0gEHFMnYVJtV%Yu`?D4Z~D^vTGxYg!9T z-n%KCxPhyegT|)Ky1ubW_{UNSOnH9VxOZ$Zc7X_SMbc>Yrz0__ra9{!oC{<-`}=%0CoHV2sh>Y* zo2g)6U;sMl^HZ+WQ7W&KaR#MIgI1V7r00)OXDD3Uw4b0E&9)+eEHpN zfXf*eI(W1KLWZ^^+q>mUYOCaM@yds$UeeqA{^1&uCu_O2PEhB7uG1i0`cf^Zp+?to zD)f}Vfm_WADupQ3gXt&2kwH_LPJ!6 z%l|AS@)6=F52Lc82C(t2p`kb2%;HM8$?QkNxYy>2$WD2Zk1UMJ=w4_NTF0Z2#Rw5b z2RIH7B!ifR%!F_UkhyaGNSF}eN}O>Iq0BEG@jDBFc~t72yJ2-~ zaix$aX|1AANl>WVo`Yfw3E|0IYNvy zyl#A(qr9Y{EMj8|`}VWQ;`al1&BL6T{Vfct`x?J1flNv4jnmCp>ITW>2~@`E!GEJ< z+!K$Nq0?7Dj;KLNbyzl~HQVi}Nl$jp{G3qufIfwvZ|jwy>BKM~JM|v)Gt^@+BY)S= zYloTYY!nxU=s`A1eQ(fUb9WVVxp@$=Q1N^B>@w7x`%_?G;5(kV%j3-qoA(GSGQ0z-d``)Z(#Oh8__l zK2L$F=!h|uk>i4&hOnRotlwlGdE<*~h_V%t;%d30LPfidDE;yj)fd@|x8uMkD%;7q zC9(#yoW;9Inolh)Wj$d*UPD)I%mm>oDB?ZTPX`h&;*cP6$1gEx+MSsdkcVT?Hsw&N zdTvv=YSLJ-hY}vGXF7wbLZW#RX)(B%ULNCTT^>b?On!{0GD4Z-XHq0dE5#g4M1#ts zaMLpZ<%lp|9tIhp1j1?1zj|GAHeN_3U6tZXeUahL?|`On{<#kWtvR<(hfz9RAhs6P zQ0V%I<-$-~wYIF>6YEmO%l7to{?|(s$Lm6*I*P^D4Vuad7Uw4mwT$Z%r?PF$RBZQ0 zxQORK4TRk`s2h3G4o4Yx_rvkV)^>{u;Xc%zV{=T?q%LfR-Q|*@8S}h8^ z2{PQpl3GAP!!b@=Ht!e3Kf2XPd7rLu{he=?2cNV!+gVRAyd3k){u4fH{0~n4`ve1M zmC7!Q&VBJJ@w#qA!$KFu9!!z-%ssIeA3wwgt|U{Pq-NbpOi}GiZYa?--HM4nl^?qL zv|(#(kyKcstG7tYaX^r8DmQd(O5ksBJ9KjN$6sGAYQ12QVa6VMi)zj~EjIKK z7!NOkgf8nz%aw^R$>O9n4=y6+`?W<_u&rAcYptSMe(yFBSAy-V0o^=h^VzF<{bZ-C z<|#3cIu83WOM#T{kAOz1ieXg!`oj!^93Ig1$UDL~1?JVMQS0_pin7P|@FEWPS4S`j zIk>Rp)$#yY_aQT8{U0@eu71O4z%B?lrm1C?CmU({6v1f>aWxr{)U$sE!SeJZsTX=t zya3gA)=AQl+)>HcsM+9Ge#q2@Y-q)K-N_!%T z1(_|fT8pf(pK6^a9);GCn+YN1!y2@zDxq~h^Y>G+yh3an_RV5y_e#ulg16)l>2 zvz$fSM2YV)*weGCIAZeD^rq>{cjGj(DnMC{VVdygd@e;J3+_(!7as`3o8(BfGarAI zCV{kV0VKQ1z%;O9Gnt24ktDVli+c#rcsLJ)!(QaDuql(6#XsCsK(2muOG0y}ByU9M z*!%M75fDEDnuKY^nA{5fRj60$@)AwoiPZu(3cDP^#*IVY$R}Sq=K7@oogQiXNG?=) zi^-2dBMlbsdz?kVu}4WY;p1CwM>QPRCxdKr-{oko^J-j5VQVn{z);Pmn~EvbIe@D> z?fOD_ovf$Gj(;IeGpYD&1bri0SRL`X`uX;B1M&V&P8}Mw%YJc-#E~tPc29omlCMX+ zHo9oQpnCs9gHby$7ACnxolnkWVLcxiHG7DW%OlgKwn%JS3z?SQyvVlld_pD*CkE9i zX;lJMt-Bx{vBt$`@jjAsu0E0fY(2@)-QE4q0qL?Fk{{X=U;Z~>#&GC)(GrEt4gnKl6x1i6oi+Y&aUgzw$YXgz@Z82h=~Uu}D1~ zpv2&Z(Hng`w5C2+xek5arQI+*_*yuG|nC|e5FtbGnutV1^+*D$Q2Y%J}mdp zr!|DHF5z5&tMvO0!-ykU6orZc0r?vvs5)F(_!qM<*cUfLi$TR{xen@SLLv)gqCoV- z#)Xns&pD)`2%0mMVKU}}JW0D5(*beB)JjW*srY;I+u_nUehoD>TEZ~Ep!_0}8`a7e zC}2@urWX^!Y;0^Nr>9y0c`>_IvZ<(3>01Y;Q9`HMwU!S4#m__2sXe zFK?Cx+dqiTua;i4$4yru?9Zyhi$c*&Halm~ew>hI}=c9St zxPCYM;ri4*>MrHNkj)%DJ$YiG)9ceU;jQ2fmF5enniljOpsxhmK@b?4CucJbKz1#uvVGSeCA7U1dLy%HyprW z>c)+qAJZ1aLx=rUrCfE464{t^ablb0-*@$o%dH$eUVL%AqlCK^AMlo}V5eoUP2QZ3 zIMplOxpQ&wDt7Kepb$r?H+!k|jaYGPO51xBBpWYrt$Q&?h0T)>&wAdYIs{Oc;aogL zZVw?0E*7|D57c)y;eKP?7hvcNa6waD29BoGxQ3c=L%lw;#6uEBF{x0fn(ItY>_pvK zm0*QDn)WhWIukwNPcI6O!+Jg-f?c@1@_YLi*+s-7m*@QLZ`J`##xqLFFP}fV12+uV z=lXW||DlGvwB4KEjfdTV%UZ&OT$3 z^TFbvgxVY+{G|6D50Mp9MuVR+!O(IET4Sqh<=vu6s+3hlGhrm~$%qTSG|WN@tdgHe z`I_k2$50%Z*YC<0Ml#WPGhcy@D5i4gCVEXJ2Y$w)tuwuJBe65bj-H2O z0-{-^#@)5;>(~TzNfL|E`3t)vKHCFTnkWH=`PFeVLUnkOL0S$gwr~2g2%RiRoxB@l zX4_)mp>UOk;n8BVg$rwSWPJN>P8Rlg--i3?yH(0zRF`0jVS^Jlh~4g==4M|6wALf& zLB>6lu~tT={Oi<=7J_;ArNc+!pyxGmd!VtVUfD3mt}f=?bb!weO`+?oyyqreS!ST2 zgNbIMeo|7UUHSz*k@sN8m_UVm^Pd)$v(W@rTGgmo8qkvH0d%1eD+srwG9=;<>pJv~$)uS8*H*aektMXaFOUeO&8sfu6Qd@bh>U&!|4 zT-|bJxf)(^1VRz-ns%DeFTMF{>btz%?*e`^k#w>8lhvW2A&Tq0{Oa1LhU$$z#)Ydb zl>3L0;|FaGzXjhc&)6Cs@*K<(+{|DL>GE%s-#JZ-&zl#NM&WtT9`S-{?~dl_(>j{J z*0zxx9|N|&KDP6X*UFY(a^KMN)|HogUMg$*+?kDxv5IrApzc$?_(!dTDElWW_uP-W zUG90*1LXUhSjXxoIwEy#+J(~QEt?&uMIt@l!s0EDF*eEk;yutt#~qFyfpbvZ3P-^f(Bp1c;sGIgFCfh z(bg`>NNz^Y8<|wuXbdU76ab`RkS10gk<5h}0#)GB30ESLa!jWAQ@u;6^FYuBNu1BL zvcrN3_~Jl3N(C@OB~wC|cWW;y^tf6IL z&fVT|wUSf^IUqpx;n3?0W+ir*a>?MA(R2PWF^tIVhE_K-kR$Mip3|Boh7>_f z;PSwfI6;5E{qK*%rxD!_w#F;PUjb@Rn>z{&VUdz%kH7mPtFV7j@#yg%l(!i$*4j;Y z(wCSP_I$62pT=-igR)W32hx4#ZXU_dPPwo8o3YzV&~*Rn-Q})e8UM++mxhK0z{y)C zX7;O^&+{}Qbsu=DXaaZSei)xdH?@R1_+|w4nQa-cSO5Qe#+0z z@4oexEbW-=;;seGRZQ1!V&P(yMT%xy@X3>_bYd_Vdx-TBuS-F~6s-x6q<$u4vQ0 z05Ze}qYQ0Jy6jcdc{{V)m1w4E^kEHepphqC<;mYf6?Z#M;mBwM;D0hRL?VD;YDEUh zH1s?tdtlO7#>NzhMS{duC2%u#RN~5D09Q?#crr%DC0CWeua4zqHMCRP5nnnnqNOsL z{PibQvXr19wMFnyv~GT+gog#q@w`pkel&mswZmdHM7{1v%(p+RF}Qu#5ggQp9dj7m zc%>KYd@9^28*o|YXdiJWnl(Pi_jErW#1QKJof7XOO@@`Y^gjA}3_Ih#DQOKsrUaU^ zA!MjxVL7h;9p$SRyyWd4jhBpp2-}Fzcf?sTDb#n(I!nj6!&;9pPD&RTB6Iq|J$w<5 zQZ4wR7^Oa@jF_u$x54HKRsAYt_#%1Oh0-bgJ%USIs>N&LuKkEvs;^L0x?>POdqs%^cvL5tnQRTQ>b&-A$ir}!M1$KOpg$M>#^7U_ok&6;8f z{B;07S<}OO2W|zj-{XLPHugerGQ^V`sSs_FCv*XOE(GsfK8ztOE@0rf{HVh|@nn5w{&yJts$G!2q z%)GtK|HX0Dk5v|l!LXx8kxLz#d6mTi-VgiRyH#?w)eRhRl3pOUHU}%dsW}qH7YsDa zFX7^{w(j!NPC9g8GZCr+~gJp-i8%s z{0R@4H7kR>gV!TE3pdRDVP>=S6~7DHeXKw7YaA6cr@+U6o(P}&sMlb{ga1UzastDj zAG`Shn0kW07r>GYm(J~SGF2yWA>!T)|y0Qi+a0vvW zL!q`{a8wmcS7V&L^k)({qHtSWo!_(2R-n{Yps0i_QT>eB@{tSU8!Iy9oj0Cq-;YAh zdV)gdaI|@2`{)R6j<%nJ7YcC`3dj?{*sPYa@uxXMSE}HfV3_x-?;qZNw}1O~oRQ-o zLF0@Sh6d)9`n-+gC0!oXDCJqA^b8s=OX^AUv~Aq&^RKBBP6Z6Lz%?c*C*Bnq^>!{E zO_JCgEdGlge2bi;7<9tO7Lc1(Bu!UlxWp6-f$?l;g|$nrBw2#&Mi5D@>Sfcsj+dUlh_{G8tjIe4U6Ebpbt8|K6k9>&;+;&FmDDjcBUZ_X(#=Z?&U7s}@A# z-~MfT@=b?rc0n}XLo=bu1x>oqRAd;@`rP#Wdq4X7wgF&QvL2z|8B%Q8N1VXp`n10s z7u7OXsLnF*PojcBhyc`uFDRq;e2EhXq2Y@fliP{?ZuMFj9BL&RL z^nX1B#Q%Knh4mi)SL5F(=$Qa9{w6`(pxjqTE&(_EHMvw?MXsdY9388jEC~eM3LBz) z{W=4duWT??UP7VD@0n{QmSb@h2V051>R|?V7nZn7fcZ;=53}-b;K--`EG6O-gbYaqtI>E3+>4ew%P-m`Ly)U_+a|ya#J;x!!^iehE zv+&I4JkbkQ1uBngeYdv@DOT7N2eomDMqAD8bfcB}?P7&vJL%pC2P$_=#QhF8YR36R z9egkVd`K;N0+3WA8ba|j?SBXZA|e3d$58R@wvw%XyGlp1~rjPuhVS+cXv1E97RZ$UAZ|5_ySP6Kw09{v~_2b!m!zCuKy`ss= z*`_;h^QHr_RdWXihgNzS8~yhD%1Tx0XCoscA`P@a6X!2Q-rsfe<6k84&2ql-kvGn1 zwa?JiHO9fj&ZBnH^$_CX$kdRX%8PMRl%=U)y!^z3tfB}>)4I;_~jJ|`&8 zZK?dz_h@T7TBnt%1=J6x37mJ#I|obQmu~Ck3~3!y3nX>-6P$=g{~&uC`;2b-2T1oj z^B&o|;`>Q;J~41e36J-juEf>I4=^twB;;2ZVXvyfa&t?n0z8YS%F8GwC$WomWO*Z~ zEK(ECloL-(;Rzi~ zOr8&%t4gG~ma38+#{BKoa{?u@go3cIGp}M#nP|g{B~8X3l5*u?PUVDieCx-jxnm>E zi&4cebsO^Zvd*&8tF-eRjBJu$Hn~SyyF7mgWs0@tfN$jvsvk}Ni(Qt$QW%8E1+xf} zq=yK{OLZ_N0?|e2=L3y6S2vR8n($FTrJZ4q%g1O;pE@d!NPLo-UcrI8s@T(jLT2b1 zDV(km)ZNq|;JtHpIeiw<3i_7d+mT4~Z?&5s)792~{@A2v?#>lX2DBhRCVPyJO>VGd z&ITv1+SM16+uxM7L)z0pu_x{gvNwh-3kyx{761#Zt&dxL_dEM4^5*RS$0e^tWbJm_ zdv9#U`1i1qAi&WYz!lv@H&5-cz2bU81Q!Z`PkeH4;w3uY-3}IPws*R5Kd-v(@&R%o z;{;XHOgHlVx&Pkle=^*n59;#vJ@fuIw7y4m_+_G&Ba~zu#jZa*;cQMbFC<*!4}M)5 z3&(P>C}_zx1dA4yQB3oEndJ2;u@cO&xlvj;Dk|GkTPjnYVlRkil$m0DQ$(g*w5>b{ zlUV};us%xtDHRJDP-T5`ZEm#`Ngz)P{i|-{v-fkG4y9gC$if2E2H1Qa@9Yx6QjIad-dF)w0dN}8;8T*k$;j7vn8 zNt5XzkAYp9l4q+wsJL*dVw7@HX zQlqbQxJSTUc65VUr5dk}zH6hyW|*URn76V;q_V-Z+2#7BZZlMIOY#LVb;a{PEqfsA z6ufWvXM`IJo&qc|e6E-&y*@GeY`d+@39`5rZ#WIRyRa3$K6Y>D_xf`vY0&O8bwj1c zxDmd4)LuSzrBnr6y2*Ih$0stgvqHH~ldK+!@MpYgJ>=K4)pv~w(z%$J+~S9Lx3yJY z3jpra9P{84hkc+!Tqk@$#b|DGzK20|zoP)|qT55(?0w_zg0S4Rf z_`Tfu(@zn-yWG;v@O)Goae&vr^Z#ZnAmBa(JobDRzf6)Ut^5^2!Mb6pa}h{tyz<0B zKDDMsQD-`*gk*X$Ff=!LiQ_MwvLhI^{;X-Mrc&)m{gCjH!1gfmw|yLsu9v^VJa`5Hi9!>1>u~z z{c`>*OPzC=?(az(B+F{MqVf8kweqTqB6g3d`~_HDYhfb20_m|D$&I>Fw<(Qbc8_EGJOeC{vYngOBz);;C0a6AB(}(6DTzPJV-KTa3J(MiNCE>E zczus$0~naGF{Q&ouvL&CBf-{=9(=Tz+9q;b7-KXPRc!9WmVQ}sL=f2_gesTWt25dY zg6_BXYx=;?gI=OL#JDQrEemmEoIC^}O;2A1F03(zfb;$84}9p zb|ZVPhAE9Lnx`v=l{t%dovk8H%=`8~m1EmvpJ<88Um2LFt&McmoD;(qp$mfDc3g(; z3cq^@pW9qkxE%E*QVmqU_((k$#AavOD#JebT|B3+=9CZ4>(dJ2U!Q#_bYBzOo}yAV z{kce`WXf{gQ4kskD7I}HwwKBO`E~y-qel8qeseJWh>BgSr=3`e5N}}BK1{ly&oH&R zW8wD9FO)Qf(2w5cmA283wn0n1Emyz5>lX6zTh|GFN_i{b+XXhq?6Rj!H|l*4YJ1Bk z*ECJARJ3o@H$i>1SKb$WGIs|KHyYC zlB#|cUL~-Vkv4ZhO^PP`XEU}N#Dks$=_8N0ACE*DCAIuHLEdFx?iEcC+k#=*KC99( zwmf#cX(pjN^$UDx$R0s{T%Q&nEi&&NwN1+XEP(rmy7n~*iFXXNBB=z-5b2?xS!k-% zDHpyOOx=c_zLFXlbS|KHkW3>~{fw9*#kAg&>rH$b9=o~p%k&|aRu*H&`<;uO^57}$ zBL|bmv@(V8IASrtpXtxg7)LgG0&w<8=3v|n%q2%G_b^F@FOUhybK4V3q_W238gpA=h0kz+%MF z&brp40`OFvpPyGNcvH%^>}}&SvY$ygt4KhIh5Fx>&Wiq*5aaKs-t$ylxxx_cC1q7l z&&=KOqoJ|mXr4M*w-5DIhsRw~KBMJ#dTt-=EOz#PB#wpYoX6Mgf$J|Vb;LP^f4j-k z!rOnAT#st(oGv&OzxKgr zi3tdOz~8_8VBm5onJsUK(RNNQ7Fla9-#vbpVyDF*mDY(V+7T%-5Go{xE&hx+5r?=b z11DzivG6kE%NU3UYLN#jlOLNz>J`A+UYzfhb!TL5h@F z;QF`jDrCA8q^uOCP&PmqSV;pdN%t>nC2B-IXIjc`7C$69Wa&R!t8P z_5IsGj-o~)mBBRXp_ajf^c2ccbRR0_^1Bwl%)^i(U@5Ao{0>J5$YgHN$msV(#}V7V zm1c!lu3uRXw}x0X(sbA*L;*GW3a3Z>zW z9+`7Lbf=pNa@~|IFjAPzjyU>TqL9xR)BoKy1q>jWgxUfvO%GQ z(py+v2b@qtp1b~M#X(!uShlH$6!%s(W)q!1rK>NcgD+(a39!i2^5&nYjAY1jgP=5; zO7U%)!MFp&INE;3DYvmGekj{2~u#MqLCmD2=PX1#8NqGl<83w4URy8c(XE=65jmbsHmJ92gI z^N<&$%4ZcHoc8>p+1i}xT3=;ce-xboOE9oSXXAgAnDa3fSj#i~+Ff>wQ?=TM@522E z`Z~~^j2Z*7EX*y0i9fpr_I-udal5$YPm`+Ho~YGkBPYT5d}>3oYPo9aI?yq22UysE zq`z2|C`$i2gB5#EgAz-Dm|zzM;ZsBb^LZVK<+LOO2692^3lXm-VXC&)WhDj*c8(N0!VZOK?)u|J9cPH zb&lgt;}olPjMabAo1bj-gHb@8Br{L}VtHweEZda)9yls_;+fXbZ~xIUhu9*#QN?Yj zQ<^*>s|6f_d*Jk=)f7&AwL^2I_lhd;+*poUY7s%RD15M;qA%cs(ozW)rN1zO-~e-# zH(z*d(^9Ca3%&rIxsT%g75{OtMA)NJO525_lc^O?0b>T(%Q8ElX8$?+Bx<(%39NrR zbPrJX`TdrTP44hxZf$ov^#_lz;TYmy-`;?Y5xVosx^oQ$7twaw)fuqf@)E(!mWZs{ z7qxsc0qhbs`Bo!Jr2$3U6Rd1Zb|v#)Cn=59Yq)D%6Wh}B>bYGKeUJE-suElCM!lgn zNb3V+kS*&%7HD3&%{%jL8_d#xGSEZV_us=hzZFt%6m^l+OACv>10HFb@U?ow8#n7R zA5$z^o;Z%d$C#s;vgB($L&Py?H}uyiFS(O(wCA-1`T6*nbiO_w%MPM2l`%yNq`-VU znj6auC|T#+75bn>@dK@jH|Fq3~N7Y$^Y(l|m3rmDV_yYfU&_1Wmt64e>1T zind=C8nTLuA`d&G4k5n(B3_*i2iM`iP$QFr%kY;LY# zSwi$+73lX!;2vQC|5=OGZ}0b~_u1S_iUZ!_(ub1n<3VV{Vqd5B*o)59c=wqtet~(f zi*bk`pB?sXuznsfzbx>OU&9ZkEJM8$Mi~fG=Av=Z z8b8X^l2*|(P$~IH!M@qU^5Mxt$x3uWAR)n3XNTBiObNNUQVG(#Lt@Z+Hyj6Efiz6{ z;!0#mh~259ML2|6g2+;b!!&<=t8|?Cf2(E`Kc8!}+&ZyLcouT}MKA_c_u=99MTE3T z5kKEDojXy;qI8QL(t#8*2>{!3O8El$7eL(m?S(K`CiSxcnKJYuG|25zS!4|N_Y^gj2Zg+D1U#o?N?DLGF4RA-i zd3A|q@sJ9d=$)*6X6$;o-$l9vm+}ZDL*^}IYkeqhM8I%%DGlpI4n=WVQ{J6Utr z$TzK@q^t_06SWgAd`*jeFiZ2F?0%p5n(`x5jZG}sty?2<>Z?!r@~3gNY)#*dDy0V) z80T8e{am+EiiiOlXWu$HYsfT$Bo>BL>K%u48hRtzwqOgDjq&`1#O}T!A3Ghj#s$L% zN;-b|?-FaPSaVo1Jz`5D3)=;~QQ}}#=nEe)2F_IG8$@h94OG&QTO$&kR*w+lj%Kg0 zXo2dM&>f+sg6FtO(D}rz^ALE2E(=K8TmM-h9Pem~gziXSF4oKm;uIhs@O)4~(nL}v z+>@dWJ^5d^Z3Gjl$RdJC8|FAE9ZqAho5;`iaV1AUOop&1O=6K4rY0Dg15fnlz-O7R z4%Rt9#vK3@JhF$7un$W#i>q`^t;ayCTMTVlcyBvJ=jUhVG=SSQA-7aUtjl&1cjdG#DGO4@MS%v+ZjoZB zLCiF@1PBNd`)~{S#(DYj+tRb@A8xbz332ONnW!fdlTQ95rB$<%88;DP&FNB_Zsw^z z86d-8vwNyu|6=@k_{b4oV&A~HcJez}+JdeTR(|v$9b~L`XAEl-5GQRM?eGdE4O1*( zoxadSP>y4A%aluqb@C%lEm=TqZGNyd2ER0Ni zM57Xs=KTW=4(M-6((q_yeFonE5dd>1q0OP`7pZ0TU&a6Z$)a|C4OfV29*tSA-0DDS7itGz@~8E8}tTU=($>RTxxy||C%Lh2CVVN9|H>UKv4@1 zhxax(gl0DA0e>Y)7!4mWlijq>hVB+xYtUJyy(0mCiDe520k|cP<<7B9$3J==-;O|P z38x=Y998i`HOHqA4z3U3f2^OQ@pcS*+zAhl>svupM)c!BxuBA$ z--Z41Ck=8IBdZakMy+aPUy6_Qlg!2pTHJI1pA)j-sE<=6O8RxF&5cgZeADue(>DLZ#F#~`ymX6-hoo#sLTc1QWZcy( zY?u+u5>vQ^7LeE{rp~Vcju249Tgl4q{MyPFHr{^nOmPA?mpf*ZJh$5ZRHLku;{`&> znJ^2M@I||lUu;R7C5RxVH*&=Il___QY3Jc(npV}msS=0dK=xW1lVDJM9|GjqSBjqC z_{N%p@eK}sxl!)`vFhvz06$CglC#$s3GG)2(ui{-D;J~&@l7wow{k;!5A+#l45kzfGP8k4y0U&gq}{L@M}jG90(k^~#b! zGoV&p$Ck*UWW>k~I5(C21#pD%-@2LP2D-t9?WMs>AEOtRD{1ZT0qryeM9< z{|h&90JwSaVD=Hn^D(b!_|we5#YiJSAE7*N*&`qmZrto3b#9j=Lhh0fA zuNI&F&j6!Oe?Oo6UN7VQd|F0o>+uLc7(Y?bY5n7s@>Kc{Hw5J5RS5>bmFy@eC|^9t zlo47U9?j;f{#zXslYvbp#-RHua1UJpW@)d9oDsz6Mf~L`>C-OuTMThI&Re=-PvtM2 z<%N6|yDCO*IX-S`zD+4*wor{^K^@itWM0?Clp@QVBtDS(sFDj=_546t#iOn7vqEI8 zUAVq<+_bV*ST6|}N7-6KY${Mm*a|73ZW!h8u2LRu7n|Gl2&DB0rT>quw*ZT>{kDe{ zK}A3Wq@}w{x}+PV8>FQix1(bm62AG_%-CRQzy%{ST^pLrahmeX zNB39xDU&M*15@?Q;>U z4yk0b%#DxdYns=IljEF0Tl0C3^c}zDC6`GeG4K*NM!`BK=EYEnI&>IfU<0~Z1QgAk zZ*pppb|UR+T+AEe%h=fmp=mEDidzD5ZC5pPd8eko$znCP@JcUsmwsITsGHoRk(Y5> zY-_d?{-!lV*Ai&0=f)S>W?SnvKCONa!HnnTsCs)(hcwjf0F~IRFg7dE;-%o@ zCtV?>pijk5?+PCPxiktWs}ru$Y@T4A_+vRV9yN9#zc4WNu@g0TugA>69)=xa^}Y%; zn9JHCW9*;8-ylWy3@EQ@2@rIVW%o2xvMV}q@zaN4#rHt_kt5=djMsl9z4;^`K`KHf zJ+w+i%XQC<^1meZ+PEGQBr|ZyO9n%Y|8^}-#(jj2i^ni(yA=e*aFae{vGJrZJjw;u z^ISeIpxG%CWYZmh9=&CD#|(C1cq@r%Qi_%&zHM}S;vQwVYmV-UUO?v@RqfgI0kxpH;06bK;od`X9aSStUcZo9l zO|F@t-d!94ivV_Vt9dQ}*7#~~5}?(0FJ0e9PP?KNBO&}h2aX>E*>CdK3XcRngTlSL z)js?Sm8aumoBQ>Ts;A}>9I8v5KkM0ROT&+GG~5YwOWgfI zZk6b@rWZpjtV>a$0cBk5oYXD>$nlMnHAhyFc15;~>CvT@>jkOFMbwh+9I7)oY9=T} zRqQpkHtD?55VUdKFK8}43R3Umq55X)>I;Z`SnVaz$)#vfIBb|GT5Jv;rd<47i9|H{ zQs!e6)zX%Xsrc~IWM;^9NER*^LT1lJ~r{z05A#tC#in1mJk8)A4^WHdNK2fCfLyLJi7mP(> zZ*1BX)L#|*L{B2Me)?otT(#c6N?q+t80F1Zt%4smez8UWMM^bMrwZ9D;}F zkMnChEzV7=ca7E-o15ku{E3`GXS+lEOgU6Ou`QKz{f$G3VeE#?z=C4oDqAl7Y)Sm< zA>aLp{phIy?}P2eZ{7>EKTuwr4Og?^`pav#`c0&ROya#0M#8^?D}i%R?C9>n`m4R6 z;C{QyMWFeYn)^Q#+(!tJFZ_1>RT}f?$qbqLG_LbEugv1F8BS5Bj5H)r#1=$n$bjHK zx1+Op1Pm{S&7NUM1lzo9WPoE96d#}g&?G`GtEsLr4}^)&Bx&<8q}rfDqq8{ei*}t_ zc`I7tbJ-jwOHaqCo0^idI327Pz7*{_m4=v9*cZ=hW8%_jB z>g=0F%E76Q3H!2wGF$oLlc*3kTP6|BX7{>-GH{{(tad-|9_QT|mo62e_N zDRw0WF4xykHB8gz_=*8hXj$X2Zo)A?o);|wy{*fizjl;u=uH~fk z^u0fS`i6&x2L}o9@EYn@`SNhei1l|vG9cHuGs_D5c?XQd*TOh9<%|(HEWdc#=hdve z{=(=4zUE~^dhp`w!^_z*&In)HuCyeM3C8$^m%kBxNO0f1`nn%SUlPH6kYZ>%Us)La zAb<5(wRs_+S%a_|qi&R!XoW!WuCeIsrNlxKTr19C%avxRajMK>@HRjtjoOKimW^(~MYX$G~eh8Ud*#Y{}MhtpDAT+}_kO%JivI2Q9IVQXjvKufEi z&AeHkCSF(5`NAMC>TLa6q!i+S!BNOVYtSDtyh;5UktPc!Cz_YY8t}SP+EPAB??*^1 zQcwS7|5Y3}EVTcnqFV4osHjSOXPl^rv5&Mv7GCb;kTkay9;nKkR ze^+8u*{nZT3^%?k0MjR<0=HbO9g40lX$b1vhc9ujTy#;yLX7c3$pQS1;NwHQlj7>a zvhqZYIvIsT65sqXYJ!uMd#PRrKAYZBxzJ(4plf!O3dx9GWYPZ^!d>U3Q>f51HV1VMRoSc>i3UGWpMv%(O7Eh@NQ0QzqVQc|s-z=iVFTW}aMy!t{mXMP$XQ?D z2@cubX8-7PI)_{NX3FYz&_I1%DAy7Flg+f32V(E<%F4R4U)SpUpCMqrqRxJCMQg3tx`BjM0e(a3k z`@~+2tFF+17j2EXCXtYGY`v@IBu`0cE~_BP*~ofN!ztySNx`WU;r#G>>Ru^y$sJG| zz&F5$J-Z0A7xsvoxDJcMGw*EKlFbXTnuFw=`rQ}LnAV|px10MJ#ICBbH{9(axaX0+ zyBdYR%Fs-v&kTtlq7T35;~V#Os!&t_rSsYu1J8rj3ugT$ro`K!lap1D_G}G>IT|)KnUEy6+jgd^=VnL-(!qfgy!6eZ$Jb zAdZuPbc zztYpuuV|p8!5bNY7TNVegsruW`5n6B4$X_(s}f2ffIXMvUjJstXY@N=@>cb@{%Eh@ zs^CWAjql3d2j#AoXEqq)K52&#Z_TE{La<0x>n(i0*P+=GB#3pLoB)KzqWqSA)q;PmJtL!iYff5$*pj@k(X!gk&*Jw+x*NG4axf$Qa z9^;FRVMBx2RPJUuxkbdI;Yd3Ya~=+^L&l4AY@iex6Z3IRu6PO_MA7jY1eXmSC?glo zh#{bQBivvJ2zd1PU$_`t{pSxq>eD}~6i(t7)o?mvI|ofcCEfLPtJ>7R3k|7~tf;+Z zKV!1dXUPA~sb#UDsnc)1N@&v&pFr9gVqI}qR8mmR$;N5R*cyP@$@7%IzDO|mmQZg2 zL(TE4b;Sw2t-oyQx1w}IN6LmWisyg@tsSr7aEM``{;YkQw*8v6{hYSE?2Dl-F1}3` z9|waJ2`Q6#{_B&NP&XM_A=&4u$NecW{&AgAuU}Kblm>8f>8WmHFJ-Q7bG+z3$dfXy zQLP`v9D`KZQSjZ2xiAr1W;_%rZ>kMs)feC!DQO)_XvKAC z71d?Or6G(|hEZ|2F)E}nILBBHAgZEk4i|hDe_Z{$a_3fp{L{`jEd~ZAFo}>OWI(<( zs-FZ_t$#%EP2vQ(DuU6NebfmYF`h635*kv>88fKBW zuiofzGDp1n@w(7Y?jsm8Lq>yp*@vsNySqC}OUu9hjFFL}z^oD2vO1n^s~;Ev*C}B8 z3t+_Z_WSGey#+@Hho{e;2~!z@F5+d-m+`)@qRX|`Gk^_P@3^U$xxjKT31sgp?`|&I zPe%BKgoMCrYM7duLLlWAemN>z`I$Z*yR&SdiCtYiIqD^Gb#YO7LO@8^ntu#OxkgX? z+va+kHV{7n#ua5Mh4&gQ&fvTEPFQ~Z(Z*wPOfpO>&&Pn)1V>sbL9(_eEN6{UvJ<#m zcfa&7Yy>19tz(rP6>eI=@%B5d8=0bY$0O+#`8VGSjo(6%s%yk<#U12I7IibfBUXV{ z#GD2q5$z4lOllJXr0we(PkW3#LGI0j!Dw47EJsM7f|Ju*s%FLqT@@9Fa+EG)J@Y{~ zkdlfmg|{|HePQ%5Bswdg5@YeoHY4D7mr+YRF!;}l;7ac`WaaIqDK+?`#H zN0EI09tt~V8}}Mz@b;TyUaO44#vPkQg9D%kQwI_={e0X!0r#fUZ7FgQp6=J0K98(T zJGEythn+9yKw593_1+H)iIo#_ZqzfbbOSyfxw*NBB2F$YpBC!&S})*$YES5PyZbZur__Qu?R(zw(23VC4p^Ic+K*>t=XVYdN*M{a ztryD$9Vca1vt2Qz-xU@deRzFLCaaTfX0uw@2+;IlqFFbcNZb+GzbnC!329l*xDD-h zN$i3z6{qmwDgM^S5`$1yX5zN^delI!UXVg;c(G;?5Q)*jA;Hvcrc-71x5?{0dt~u% zq4@6^@s}kL`S@{e)w|-Et)e2Umz-R4{KX|SaZKsR^X4HNQQxYPRi_5V>Z=A)c~j~> zlxlyd2vVy@iQ+bYIZo)#i6c@QU(Ai9UQhn#|=k~WaFJbPh(zLX0hhJPt%~3 zVTsO3JXC!V#g|a<8#dU_HUO>$qhgPD#-K=ylPgstw0riUycVZ11f))6q_+3 zMW8<73%usVKt05%_t698bt1TIUooap%MbpA^%1bMBZ0fyH-@Y zAF>ARZ+Bch?VyT?21bNHb#SM=eZ-Xg;$Ugil-$+v3N!9to83vh_eu%5igKvDsBFS0!5dt$@I;9S^Wsn;0LTwK-o~%duc};(89I z{s{u4UaXLXg@ttocYXcE-QC^!$OgBpr~J6mTK9>~A?NiQN3dTCZ@-5GlDPLw;Wo0m zJ6(MR`MxoQ+r{=!a{Ht)p(Yz1I=fO*eR@aV1DSGEMag)0zJv=I;z-SRTn}C7?cLi9 zdQ(-~zMpNxvFUV3|D-;Y%lrLh?|O&+r}~?XTj(BdyBC+oPT|pNacNXca>7T8UdhN? z>&uPygqHf>*O;p@_-#o%S9b-z8{2nExh$laVX>&g&SdiNc#e)auZyFM#S!T)XGSc}m7NS7*7AcNz`a^G z>#~ZKDzH(4{KB<;N62NDn7S=evvy%`#BvOBbe1*GLVj^-poeR_PppU@2zG7`KLF94 zy4wWH{sd0Ah~Vr2TEx@;YUKWRe7^gjj?mLHP-G=$tFLdOTHWt6>2|xjyb1`Qz2n=A zS=W+2>I_Ot1I&<>kMGx#ethnP`PWF6!TZYVo?F|J)w&qfLJcjKw}(5X>VD5t^gS)E zb1b$YJ4^pA)_dtJ+^Jhmne`mQZ?j$kBl&kD^ zq#Qv6ign~+k*&W~arX!0nPeVz?{781=_PAaYtLxb!g6}PPZ}E-6ARNBCaJt4SAP+6 z!duB(AYdk&1tKr5NPOWx?QWVIK8+$wZXjEdT#iv4KSqUCo*7j}BUCkPY@ZIPQ;n*~ zOlHe?TvTn0JvmLF_I;cNt$aTg&=X? z2fJCAVMZ+#^*@L11G33JfE@tCy2{4%AiP&gy zTOcINmo;GKxiQ}ySxRz$1)u%%=TC;9XB}h-{_`g*C@ArD;;3-2vB6Mj-HxZ=wn9nx zZZa0lWqklUT6%4DwfZ}^WWPM9&iILKyu5ymjzWNjacODkq~DvD&&*=H4?CV^B63@g z#<(ct_WSxnkM2YHIy|X4WW&nas^fmXGs(lp#ldHvfp4B5)1zzyiiRhZs8(>=qL0bs z(%w?J|A{+s$7jEhh2eVa;{{NBDkmvm;7D8=_A~*7ZUc3nDzg36+KZbGkfKJv3iVIj zWWEuu6Nn3oNfx-q<$OZrXFGbe4%WOUar{Z;@0cJAJ~#4zV&PMGplfYzp}bpOPnOFt zOKY^-2FbAbc*%+JduZ&S;azO&-$u{66=1idv*~eAOmmb_M*>MmYdo`N%Ty=K~80Gkvzv6R1(?fA=fmX_6UaTHqhXW zw3m&0KR}+Y%-PP(Ut147S<|}k?5$(sty$QsLrcks^fYJk_;u`k&=PPAGXO&#@8an{ zrOQ-Qe_lXrT2A0QmxcA*bv-kiyzsJV$KL&tr)8^FAFM!9Am#x_<-P}D9gM%=+5J?< zr>unMeU5Ez=GrzU1lP}1EuHiJq;OTXNqn*L;Onenym>6<4XZUdJb>CJ|ywsTRJ({v#Yd+YUM)iQ| zhjE{0?SG#k{`qgL9@>(>>pBWUv=33~1=hO~VSp#aCg~PmkyE5)e3^toLPcm6iPqSM z$UaU?;S6TQ;8U*4xNIxzKE(oh0k&DFFBi>hus+FJ7~j`IzAj89m&Yb zretKCC%pqCQX?ZHewSSy@9UbbWm;NVaFq=YHRCZTu7Pn4xT4kkSM~~2+OZiK``)BM zUCMfTyQ{0J@9l~`sMn!Wlap>FgUfbl0`3mI5kxp)X8kU1%@{y%!(~P)@WS;G6%^=H zLn9)}yg_Y^5;nt!qvTUF`>u;nd3H9Yh0PVKNTbp2k_5+t9Jeep!&Tm0sSTE&LD)^m zL7;pmL||*#JkwHnb7r!61aph`b5!iLn!rS~FDTvsJ#U_AxrJzEcnR(Zqr4}qoR)(r z`p0wss5$n8Kkp~MF8w0BQHPCcoWjx+E$r-Ap^~1!j5$ENoLxWA}Dg z_<8xNFv*4dLHr5BOFQF{mF&<57JEWx$)(6^i^jdr^`Z4R;u9y_!nC*9^~#%DzG4uY zy-F*Fj71_YI8ge!_+IGBGdXkn=X%%4rP>D!yQ+V=j)bFm4Qqek{u?x$pdNK!Vl16C zTqT;!J|FJ#_&>ttcO}&~MrL+3{Fg+0rZ$}OHd1_%nF3Q&6Pz9$aQ^Rg>GF^Y@$D4y zB85&X4ylDVdX}#zwZzZ%{H+KzEnbYLH0Z?s{D46)SJpgY3ky-U@IH)FH~9!15@?(#qu4TI0m%=nr17S$w=xrDnixBsOEkhLmYVSP39qG zoK53>u{*Pt5-kAp$$bx|0McM?wT>Kv@|6yFznB_=hEyvmZZvFkooY??JpTO@ea}rO z)fQD}90D1^mo!!*Suz%7jI?iH@YP)?k!4BMxrXobl!yY*9YlhVpVP;mgUG zw0}s*NTQtKasM7CW9z9pcClWxnXloFHih)?$}GiOYhy3jyOHAbU($jX;q#x*Z`r|C zJur7Q;Q_R5J2hhmRGKL^ha1E|r6^8@UN+-j65$>a5oodJcmsHj7^^^RIY8gZC{Z6M zoEml<4f6OPV;71yqcX2}pOo#-1(Xq1=g$C(%Z!YOu&@&lH_7sHr`c6i>?9;4r5c`h z*Ur(>r{@chOhM0SPgLwjbuJJ_K|$}HC+UKo=b*5~2@wZo%&t6dfQtJt_tNg4KZim% zxj>X+D_?DRfQqDJAxIH0tguP2$|hi7(}wPKsAv3NzA!FzWRnL)B}KVgPUSirZ%n!? z^&x2IQg>uIEnur$+VU?7WdSMSI5^e!&+eAol>0hE;JXQfi`Dh9)nx|G5Bshc zY1}R(4A+abin&3kBCl4tC94^4X!*BU28c2qRbb~9$W7qhbF4qhNUQi~ywL%=$OIyW zQ?;_3s_wQBZb>Rj!T%svM(!z-%UwYLSGp}Wyt4wWC7=r71-dH+ZI>t)Y_~exUo}`H z%`Y!@ug84Ud0T?Mpr_AD3=hal&6a?GWgL6*`G>pfT3Ch~Wh6{uz zf9zRgGjEJnaxSb6 zp2_CS zY`;!|hB8!L&jedj_v=&D=k#`#5+`b@0aF{Va^ke9YWHFYnhWOXi|W2kCiP6^1=Fj_ zo9Rj$m>u3@8pyVZ>)^GO^HAn~W+d09l~pGnmMeNKg965H1!D!3IkT&=CV>{X2ubc z598+3iCtiaBhMDmzf0$LGJjXxSv2F`cN-;Tz_XzMuqxXq~2@ON8 zLKQaJS_S9#1$$)gI>sZ%Y6i`F;bQuOgECPLSLva_VRszhX+*56<2_ko^~?doc5PWMl*^udS@C zgoK26COLj`@!1$yX@EJO&NLk1(_4mL>*7jb`M%?)YQ`4k`nkQdakjlBw8=a0PyMLR z$B+L|u8o~J(~OfqAR*@?1Q6ICzBnU#2Aql3{mgQ3mC&Tf$eV$97GZp1mxmc&LHWN+ znX8D*)n)=zJ}VMij{3NxUX2av9w4oNLUZ-MP?EqBS_%BNpElUGE9y^G_;7QB_taX1 znlINMrals}-h)Q4d=qG<8O)M-QlIuug%|vtrvN_@aF`Gi6PvT*E!5d^5I_eq@3xEgmzO!d5c*)hE1973(VVZgiYvgj=G{l&*kOkJtfc5H_u7x#HVUP(T2$axqRa3 zW3IzP8wkZ|7nu9FI)w5(26 znn_;8BJu4TpAdM2mEE$0=#}YE27IeUZCgE-(0f!C|4&qX7hD^KwFA%V=8k!5bLU(dY zFhb4v{dl^tMk>~sx+{Us5C{26WH*r{E$;rc?R;r=46LQBi0u-3}5Jm15YgpS-}X=pW#I%*j)<9$zc?sj%| za@UH%YhBzTkNQntPC9ZzZ0yY|-SQ1?#jE__ZYHN2$3N&tA)(fA^?RAp%MeptSY=PL z#OQggYnh=dWNH6?-*qtvz1jYaM8wo|lc5(z54&IqUwlRn7UI~ii9?&yX@J$lR%?D$ zmv{7Kh-a33)!lcNMRaWVKzna^L*rS9PfPbVe*y>;197=KEs*6cfOhXd)3*J_G9Q-K z?sWc)?co@_PBw*$KPk0ExoJ{Ny~OP*n4Va>nGjQKFSc+4*1>sNa6Sh=f3xcW95jX6 z{X-1EZg#JB259gLmXlxotu^m#yx4R$6&JQtT4uhDE86+Z6569giDDTds$<-0SBi7i)#O&tEJVg+&*WEy zZXIp+YaMado>Br3n{F{K4$iAz)#+kz z4ly0vLmJ5n14J$TNU1XAsRwa$aa4eK+KpT%yKEPSES06i_c#QR7|}Exyl7?m7@X%Z z$9=!pb4?AEFYjXx@2D`@O&A$ldAxi>cxqXBgruV47-X29D=?rcFvLlpkj!#76md@z zH+K^f#yt?&Y7=nPZNw{1v$fq25$sudoQ*$N+^6J!_WSn)A;v;@`=hC2(cw z2zw66aD{?fz+8jtx80c{i<7>gFC@H3wb2+gsaH&=RB?T(SkqkqPH+Ny^Rm~)F_?aB!Y(C>~X)`qv4BdujfZt6c6pjbdM!wn;1JgDtTP%LCxs>M%3aZL2-WF+%0r znn_{6$De%sJ0iUgQYYq zM;LdY@|a#?9*djzN*QnQ1Mbn%RGNNmHyL(r-P$DhOXzl=37))%&mObEgGcmlS3r^8 z(hG`@>+)0FHc9yG&ssl2v)kQ&5GpG&tI7EYBK~ubloKVhTd%i^yDs9;CHIxwP2h=d zrH zDnvl#n8*y)veq^>=;H?%G|Sxf4FuA`8hYxmhMF2>;-DG3wup#`s_F#Lyc2jbUG5mf zPdl0z(R{c;yA$J?6Z8j)mLiE=o=Bnzry|4#>q1Mvk4IL%^K;MKoiFU~@2``<=P`-E z;5~pJP0M){a@g_n=TGbM);h2SCdaV&POr(y62KNL?Y9n^nls!y&*z@95$GyfObczq!Ce+c@-Q!xQ%qB8S6M)Ywa&obIU3K<^ zgoG`c;Lbmjbfy`}C8-i8&_QYfkd|Q1hP1ST)W@!nL$TiIOZ6}EEHb%lYD?5?Nn$(m zV(28eoK66@60hAOQ^zsN<*k7c>zJUkX?1S%lM_bDY`-@esQ5c8a*>Hw&@)3X-V5e) zVrgPc|NZSSStB3(emttiI7H38IG3JISw2PwudbX{fT+-9($GFd1t81t zd~qfPFbaAu!}Kbjj8HztK-@O*+hGN{47eP_BBLs49`~KJa!nwT7RUV?IetI$MEVsJs7 zQ3}U?azp=)17$PcTxqMwbTIzgO%nHp9nYjyEx?pJK4|%njwYg6C13psuln zg=WCzs{PL<1ei4gI+vW4f=aA~nVE8|T<$nk=%uR~u*8 z7Ww4zAKwNOYGa_=AR<8>(|peR zcF)$YR?5-f(%wSc>(7qK2J!r`GWO7m#gIan+QmGzcHCb_HXHkGQPCX#Zmn!=*yv-Y82YkEe;eUcZG3}#0Uhny@^8r2JopRgw zw_+QCUmpRx1_yY>@8afPdp7q52C;-gq0sR2NJUhGR(G3ShxL$?X9Ro7PfdohvZK+` zWB9P&~R2MoC_SCGzRDo!2&O9}BYi02D$kzlGV9y;mHA@+v$7*Yx(?mz9**i*$1$qiO zhL;NJk~xXuyDZ4Loj;`S7;Frc)$-`6iv_rJu~M@`M(EK;X`wvtaeTh1RYeY=57LJ8 zi9^7=_?9w&R0bo#;EnS)MuAoy@@z_aRqTX_f%lT8apIJxju$4*y1e$-xqHLe-;>im?%L>IO(X1|%Q*e5KGL}l3? zyhmC8t@KOi(szZ*0)%e0L?M?8h9wGD&-=C#2y`(mV)K0ua+2MaMmeW;3lIvW*+2N?0DLwIyh;B5+ykV7{U zMKJb?Mgu~lE|_A>#w=pghxC&8 zwt!;;z;f<&hK&vql$fn&)4G6W97lfM@r=YRveDzLNSgBa=%}%p`y9-wU7VcWPecG% z;Ofd2cpTN%I=i?e%+HRERfc&1M!d3af~QF$i{Z=X&kuvmG9*MTR)I>7O*-*gc)2BR zS$a30uh`p%^yaO?LfZHGrL zJJ8Y%Wcvy#T72AxcTx2Iwd6q04>`aR>sDn*<&Dq zyEr>9mM@e}ZDA+>0OERk(r}byabvi5e0Q$r|QCX_$bxP z`ehx1%a~f`3AC-zOREB>iK8b;Pzv{6&k#X*yaZaZC~C@xB*La@!>o6W(1BLR2agSxF+=umQEKc2gSm>RlIAi8r*_2ry8df3F@iaeTXsUvQlRYH#-Jw|uJD zAWIwj$_$C9i%ZH}-mmmM$u-)NFt+rW6*B9-Ut!VpP}b7P;-O-BTgqzet1Rv@w$uqD zA1Bs><26N@H_2W>VsP*rnhRzwd`R>>;0s4pOGUcczM|JsD)h~QF}ImZ3#E->5qK{M z#k$}OR~|-YkpojN|C`cZAqlp;xk97OXzh(}HK=55W&_ZTc-En4Mu>BLOw7hnHncY3 zKx0oFtm3x^qcg4)NK>)HqTX_~1f!`?&yfo?NTc$GDC4p%cQPBz=7Lo#leQb!kc_wb zxdZpd^Z7&UGxWb(Nu2YhbM2#gZDt?c%>fVuxLwl^qwv&6_4er@O$82(^qgmE_*ad$ zHZ#rH{jG`)CsynsG+}AlE8WYvXN-n}8a4`yG?iFVM`4(~STt;<0fY^)q{yF1r9b~h z_^kCDlk#2EqYH1tS`~6SW2x*)yJy^|=MGJlcnEZ%RpQB2iZgT@-);^j^4mXQ5MA^> z2s^CxJtOh@v3djuAq?d$m>_lF;%;8tBv(X4L}W`v67xDxQd0+ZErSu)F`!fUoK0!E z9>S93&D-zxAOWITJ;uOG(}=MW%)&30d^3Ajd%C;d@H(vh8Ox@Qr8AAOJ%hn|dn1YX zrxzEAQdoC)xe;V5j9>DO5+(523Ns_(Gv;>6 zeT!M2gzx)-Pb5DaXtv(4BtLX28{9(08M z@?HWX>p(O#GzlrGYORv=C3UF`%v)6CcL+BbKQ?!uU`+2kHaI>WGqV#vJ~+)6udlC9 z9{r~?0A(579Ps+E`S9NrHptp--%|SS%Kk@~kD+_UG40gC$uqAP zYQvuR_FBsLM}B$|n_>_OXbK-!8eOK@Qx>j^ zimvuuUHerB3jN%^UL^>`N|nM&k;Ed9!XyY>4gX>f>*$7!@vI)=>mO))E7{nxG`D4z z?u2S`dQ%o%qbS)&lnabTd#5R50<(lo$DGvZM9^JmMgP#GT%*G}jyn>F;y_I@1>>6Z zRsZ9-%G=`{1cf54L7bx1tI%1!C>utZZwOZ~x8rUB2?4{5A1oG|46ANc96!(*po8%U z!r`Bg1>E(@PUZ6u3ryyyD(7sD%`Q&nM_e5h?G(k)hD#)FwO;o#*57QRZo%!nvQuKp$(`czj8Eio}47BB{mpA#jdu+z-QL zp0L{H_l7g-r759P6p z74Zh#F5A1irhyJTZv==B@`dj#)zl`zF%}aQ#mdQv?GslDPtqy9zZ&%&NwQduu4wmt z{tjZp0%wPJvCV8UFR%9YM?8et+^|ozDR@2y8oKLzmFzN%FO7t}UqwGvM&eo$DO)&N zm%G&S{8@_Hw0?7V1M!trzIibzB<^%~eFpK~(H+WkAQJQdE!I9p<(<1GhxT;R#KZ3| z=m?o6X2XIjFM|RQi9aD^Hgn^67|eGN5)u(%hlmqE%|CsL2)VeqqmM6YXmIoJ;CtIi z?EGmR%2uV>*B1Kct7*xir-`;97Q<2r8p-Bvc5>p|na+dvj){VIQLF;gzcibJ;COx* z>Dpf`NQT3CGl50@*TmBpvfOzi(MrfVi_wUCGfBz4zb4LGhFg*ds#Dk-QgH`A8Fk* zGU=3Fx)ol!CI7Ronsazl*2&^4_U7fltj*k9$@r|E`f*{ed4=Is{CO;@Q7Rmd)&PGisI>Mzo~!rXu)mJCcZkXfIskE$gxt#&-MB;?g7p7S z1pn}%_|b_>C^9ee8_J8^88R`AE2+gAWj+)h%faLR<(~ITGzWM=qnDVeTiyO&u_GU;<52GLY*9*cD}F^PO%-2#^ zSBr+#_`TOMh@N>>YA+L2OdW@3FMJDlZa$i;>RrSTuHkiYA8z4Tx7#tUv@Lq4%bLhb zN!z24bWb11^7IW~r_BB`qha-@l-6yRJM^|hWw`SX#VMf;J%S}oeoXlEOeV@P0cq?c zwBZTw`D4w?kM(;TaJ(>y)+=h~D|U%jaWitQCoj(?RbNvGE%RU#q8tbHufN;-PHSZ! zjrsiD)AHS2rHPQU)6bkCA(IH{#~^9SB^FFhDy?&bey7BI6&sHv`9ZvLK$i8G=r zY8!9B=8xiJefmUQ+E`usgiG3tOON_R_tv$E^|O%~G#GaT6&Dni8o2WL&9rM>8Ta(t zs7bzrNxqa>0n8;zXne2Zy39MCSl=|N$4InS$7=}A-``>M#!_v>(;&ymARzIV3q%`cq?OBJ(ylt@ zg6z6kEw|$EH&7`%?v7y_JHASUhP`IG;VfbPI0G31Gq79UX&U%!d5w`wpHSmX9u>=@ z;a$@{_8ZeD63XWN4+skx!}wq3weWCe1OBOF+zOB@>^fx;AVVTCFa0Z48_=?M)Y#8x z*&O(!6^+*3O2WUT;!|vS#5Fh*Re$dvQ z+#4`^Q;Lt;+Rc)lCgdNfMG$T>ADzNJ9eua+Ej2JqgWFm8D^5*wc~@pwc6loROpez> zxlj#slChbL^&UG{pM8W&bYs3KKHlKQWKiuc!av#ae|g`;OBO7B6ky=c^@Zi7@VES@ z`FB4tKf9iZd2TI-h#_QB_&w_+)Ya8J@n{8vSK~@8aTd&woZ{jgA!!q9YwKor|0Zy^ znrLk)*e_;v#tmk~w;UwM+$VZC`&9EBBTb2;GPEwsOVMs#{XinKqmuSsftq{_Sp&>Uyp6PKU@w3y~SmkwmO3L+A zxzE{3PgrIkys6hz4jLIrLlNo(_rNtri8T-JF%~?ZHL)1YNMF=>aq2?xWAFcosKZ7q z+SmarD<`zPz>&K1WxtN2qoZO?n!G%SmMvG%#IhvDYi9~Ynr#Qq_nBP*I(o##zV^Si zfO!V4Gn(mSE%mm}hc9v`Q--6nw>`|yZS|dhr7(Q*|6}Vd zz^c%;XkiJZLApZ$=|&m^5u`h$V+%-!gtWADcXxNUw6t`0Nq5&<+diV${A|=y z`ioS^6Q?PX0uRRDWv3I?O(&=I72bT5ygJEIr6K*%U7Jyq8-*Cx8(TIKka`8V0@hN# z5IX)?E$E1V<8}W#8~YTH5u;y~NYUl}7>-UErWHt(x8;z;NK|YeYSeiy)i69#P5dz5 zpjB`nz_A~7A3gI$rAf4>;aGo>w@$|o4!+CCub}<}?=uPQsZ^?IscC3w zYiP};OUq~jPttc;xYg?X+}!vCW}KG%q-mBu=lN)p=4zcgD2O_*kFoX7MSm+dIh}6_ zmB!3lg?|V`cDq45h2ml2n(&K%)>KHkS%@}FjB(Wj&quvD4Qxrk4gE!k8Q2A`mv$-V zSyH7#@&cdG0;VPX>qFI_wX|IHm_#wpUC3H-JkW106C+cW8@tLo4B?A)|Y zTF2Yn=|ZVF>szW`@#mmO8_!iP-lunLk(B)KDMdSXcB&~||E0gMuIku4Zd&T`D^@4x z>?UzEh(%bdl|&7ZO$mqX{ZWInWsvoPOlr=gg&XFwjr_YC^z%jMME|jxO+q?47=+%3 zGb$5EVZ_=V#4<_caTE4$r@>`tV z|K9fhy&gZ^DCB6PO{yn?QBbtZiD8;u$ven#nY0`1T}SmRUr~EH&D-{|)P@f6Y>G5% zj~`wPE*#zTXdcW4s!}B1&*Th!aGksEi>d1i@$O5xDoB}5SUjz627Z<0cFpC!2UiV? zu#lzeo0LzAq>Xl5<&M<|4WY%MQHYC;@E54=Bhfu+Q_2a9W_A~WF#$p68U3Aw0Sj)js#`OL* zopCqO)|!scI&DL$*;q=Qr|ae125HYINvl41cqW%hVNqk82(q%(2*%SZQEn9~co&RA z+xgbfDr!cn$b~26iY@o8e(lHjrcjf1_n;|Rd&2d*`Qh^7oRYJ)B|S}2xup8xd~$Kx z<^Hg(8<%1%9Mi#6#*<-b^TQ@pD6)6ztN)bB9)3TbAyEy&8oz?4^U$!K_g%Axra<^Q zauMg~6{p=p#d(yEvML(J4#^6ZA@N-ngon%;I!Z+3D~i{_Lqnl_CKLYC7mW(NXV8K0 z@gEnefi-5sV(G7Xt;TO+ArNShL&YEY;#CE6O|`wZzMX3WMQ3b4$O4 zevP@w{LfLoU8pHK8+q~l8PdMFjs0IO0F~wPI-fwM+YEk+hT)gTvCfVu^E{|G)c zm)E&yFx3J-${cl8o) z6cc^N5=0dU{V4*t|ONnt3veMPdVRqn{)^c%-w$ag7zcO&aneVEaHQv=@JyTgOwG zN2{e2uAU}ABe$5l%dPY1+<>!T9nXF81E)*eX{>SLG%?Xd>L`*b8okZ1i%IZLq)|;w zBhea=yBkowwH>PX1^GGr_pSaZEb-kZax4vmtR6?7K@lS~84C{%$m#wM8_ z)F|Fc+SedQ_|cDH+OrJ8f6gHGNoC7f*Jj48zk7rsOyyCl8pHHMxxRza?Xv)*$0 z-BMwpg*g9vJNvh|C+x+$CulGd*zNju&tlO@AZrQZsOrC=IQr+qWj78kE?9j-iP1Yg zu5=YS0fc=YUWd2o!t2!I-hvfG?*q=-JGK6Bxrl}OF z(Z^_)q7~1ikIl^V>X(C2byOB!OMOHYx6L2}UNqF&_y46A|HDzFU{KSAD=C{up>)U8 zOkNCKq=&DVPEi%%R3^rBH!+e0cql~eTfLM{Pl2jzc3O}4 zJ>L7)-g?J*bk|97*Euq{x%?*N^zDB6TjITj#VFr4@0-QCo5fCFkGh7G(`qeiUyGV@ zrebUAW@D~qV~T1$u4-$FOh@)YNA?c(IHj=^&4~!@nIw9)vMyx=$G&ks11F*9yl7b{ zl6|T<{&Z{Ank@T=M zouf!^jh|y1w+B>t21G&IMaV_Jp3DlMo2mK{qn;;@tC|x?tN3Sm+%tgUU+fTL!LOI5 ztO2xRBG|@0J6J2A(xmRA&y-ZINO7U5c5APFVetY`LQLN-@t2*;QyTMIvebI(KEJzi z6;DkJ(K-#LS$u>dcG4_AKMdj6RTYTmYsz)NCnEZXGye(yod@hk_gcXrszvw4qGwu+hyB`Y)mm!KuvBe}Kj3@kn0Wh(yAPw6Ztkz*fRe0Kr2ao79C|T(Y z456tF?0HBK^oOeLZf$f$(VENe52f1hON#!@tsc~}IGj$NLf!78<|6%zO#auW?eJ0e z(HSBsDXCtpLV=;Iq%^&MQC(df9gQ8>m7zpS`ojhCYN_y8(+G4gO7!pB%fITZc9xAE zjuQ$qIw_{$P!O$OAoZviwz<=G|3lg^mf7+S2_(?m)!GazlZx+A#GCI1%VXJze?^Hi zUy7Z*NrDv(gEiiDKxknK<_%+8&^JJJc-LGm_}yuXI8CFgQ%+_p*N%!@Mzb{cGi%>Q z20XOc%ye2op$8{UM3q%iK=5yC*@k!k!d(8kGp`c;J4LaIP zOzdfAE+|LOGhC^`Peic^+CGn3LVMHHVRO9N1?t5@qoJfW>*f9ZvM`GH zpuLwhr*A;K7=W|*4=3EqCz~wY=IFq8v!jHav0QcF{nIcn00;c0-=M0TsgoE`hlQEFq~c~8$cT*<+P1L)_?*o%7&oV=Ac%q{1MX~P?fZrF!0*k zDgBLjnpB_S=O46efd$~Z6hz35pMZ^4QE!w|cHmoEQI_RkgWvT%tes@6)q=?sa#`3a zpK+88#H%i^p@(IsklY;Z;G{xWCRN>zx(~T0Fz5Vrb+u1ptCN2JrJ`0Tb*&f6~7R)k;QpFqw84!2)A{k`6?45iuum>yG zmIS+wUHb7-lM@rwWo1^RB=h#Cu+^2Eq7mz#z2YB}EAUjD zcHA-Tw@^#3R6*MuME*?b01ELf>H@BGNv>bPdf7%U*=aO2ruYlpDC(jxcBD0+J&tSB z`d((*qKQTBHH5e|ttsIV=6dEM+pw!YxqnHV3A>*W)7(YTWu6S>DcayhMnpuOQEGE< zC*ox{G?YYoS_lzTeD5dvm+>(*(g*cAO<35sNJ8J=Le1BK1it&5G)Zj`td*}PvN_(o^kiPp3MP#=RGv{G!<3hF{or9 z#)g4IwW^;dHi?d)po#4Vm1o-6w#Do<>N`QpJyef2tG{*1f12C6r08M&8z3v5=@CV}&G{3|4Ff8t@PW(Nu`^xEqB8^^!xy)O9d!77_2nx-8jD0Ed{4aR<4twwx z3MWt6-_IFhfsB>*!3yKLlMoWbGW&|0h)b^no=$6gROovV1l2QNLR=jof}>loR}v{C z(c`IA&CP<*CdMh6kp}(dU=e+>+XXN$sX{Q`}p|O)PU9U zteerf@6+)JpLVR)zx%i}s4>iYa~_C3eXD#3CfG@Hnx_uG^f(i`l%51vOTT^iaO5hk z^U$13LWJ`71y2vd3OHEqJ@7qW7?eM_#vFHRAzhw7VDqTw4h!4USc0Aze~%kio{nVtsYA0@~qA(iMQmR#8=50(9Dxj=QU# z-mBG@N92Fg+`oJF;9q-Rp>66lOQ#5teRFbh7F!laj*t5>RhhJ!S-JW5ZR%Vs0PXim zhBHrT`?z8L2a?Dp&K3^N=BAgUl>JTbmElb^9wtplp_eRe2> z9HC`n)YFEb!_`GEKnEuBG&-Giqn7D*?8JzF01~7x^`mS5_cx1nfpR zH{~9mqq?4m35d8^D_E*VI6heH((37ksX8iL{QtdSb%fCLa$hhUyz?ROqIJxk;%u9p z;yqM@;;~utZtb!0p98b6 z@^nYzaF36l*I&X!;Nz1bYQJNG-`(?uh>4T$%#GaYo+k{fEX#3n&JPYAoME7si;hnF zu(?~Rs1eN|iUgbq@B%V4WR1XZ7-#GCAQ(TUYL~7mwr>37wRRQHW`s(_1!yi+@{^Q( zeFr?~|Dy2!l*6gyQ1zM?%y>bfPraJQpFgLsrn3uUnPfHVS-t{-;a@cOCE=y1A<)X(ddqZn&RHez0zw`ev;#I+<#^BUQR9mcI+;Hiq{bA|^Oe zMpzR@coHW0qDHyGX4&H=S)&$tl14a^W;h}ycp^sF;}n)+EeL)wqvYT_vF$o>o%18~ z-PC3DVTHe`73*gj+lm?gEM6ek$09FcC~pvxg;=F;uAa`rtD{Pj>FfNHu0eKppwR*9u?6IlM+|yLLnwm#yUjX-8ZY9D1;0d#-Qe>C-p5bpV5IummCKQf^6%+hu0;R7I6V|93qDYX zGuZQ)66pEebjp|Ta=9`KN{o^Da=rRcmPMHmXJ%qzVn0;kn=U4|m2;;Ka%hjA+he(C z#608Hh5Q|v4kL%#+uXK)UIuDwyBv$OF0}?G>%#v(p~mF_HcKJDP4|nL8SslDA|N0l zC2e%sIH}&nR4MH8%BXypQF|;R6k31}@N|lz_H0PDz=b{utw-Fl@LUFvSe!E)L?48^^OUz@nPX7?g? z_C|NsT|~@e#KCzetfQ@!ilxbyz+^$_E%@SB1oBU`N?z|vubXJKh@FAga;6b<#n{w4 zm6E1-szD<|aq|$G_XgmZ0MF4BgNHb-vQuCbQYh?FX$dWw1 zC0UJ(;_U~o1aTUw>7=5VE%;?^10 z=)TLn(sIW?G?mJAo0rA(s8ZkQ0(BUA^>`wAef-vpVYRl_dF0%BpR_gRtg{VoGX09_ zQNmh(mJ=UcSbn_9@$QPn4`GIwLPS_@{qF?8Dow)G(1;7qOG%0VCAzvWJhW zk2Kr;XsbeRB1XF2dwsA~ry`7F4*Kc6P%oS0diL?oy?!MT@g3rx@Lwp4#t3LM5k4mK z`?_1IJh)4a?`)4m2(Zw=F}eAU^?VwV2t9K;tcZ^vHCQv21&q?Th=y)%oW8yE)dM;P zaIb2ezN4WnN~covj*N_OF1ehR_mFrkPFwtF!~1(z{$j1vmthjwpuP4cGXLp`wGL)x zXS3%Bl?L4#HW}1AK%OPgI=5lZD^$SJ>JF>|ht^J=?ptQA)nG+58DnwJZ|1eJj(L)` z;Z_~4W2m$q+Ke0Z{@8%ZWNJLpcxTvzXuT%bdaj3?fgC^BD<1{MSlTO1%wSi}j4-xhc~K3>)fRYbgnBu@&~w7kmzRUNc%TD^TxZMeskz7Z>)EAQGgB zMfW?Daga(65gr2AB&~;nffHn5i^xK#6+J5M`58d1C*48^z0g1qI!;p6=we*5u0j;L zJ#r926N{%HLOV)<-l`08Wl^c@b7<8wCzkODAp4Si<^<7LLSOWI8yFY}HiqBQg1j5S z5Se2%9r~`rt;t}ts)Lv6I&A%zEflZh!vn$)%F=ix{v&^TO8|3&SVR<>c#6QI1G?VI z+t>J(d$l{YEj`yx-=;ao9`t6NldlVO_1|ldhhUs^KXBjwX4>cx)&nOsG}ZCLc)!t* zMeHJ;h&+WjLFo=!m-{s#jqGIt@8#+)VhFR+XcMXF_N{21SUFX9Byv{E=@ z$#T?}dIkR9?cecp`e};6r_a`zQ1#wU!UIvMJW2@^fwG3b03JuAQ$QMz7g4SsRZkfR zQ`Kftia)_Rx3#J0LoPS0T+hx5P*fO1eokNYT3W>#JNHAPbZye8NzO*hJnNmE8?4>8XBP2GRv*t0HhD$ikaGJi@tyBD9(eh98pmfAt zvm`#PvE)aHczJ#T0^Xn2&AYK7n(CNIoKSzAEC1!&hwn_QweK?Zj(J$)#&ve5o%*wA zM$W9iy(#PeTvP0{ZMVAGCzZZ)eK_oUAp$Gz9s2C{@5TBF^YQ8Ilg7WEoWDTW@o4;G)&BQu|46Q$ki3o= zG;6$6?idJ6z}wN*!2t~oO{>9Xdv^V8;Kaaq+F2UOc(BvUP(q<(na&kkZml1LBCc+! zQ@eKL7L8py72JIAJND@oox8_F4b7D@!$r@No4?p`YQ-tphawO(~vIl1?RUAQ8D!xA8(d zpF=Xsu&I16!X%|gC5;_1>YT6MqZcZMGGBs0&f_M+r(iH4BBFp^T-jb6B~qSV3--h> zJCI$9zYjd6q$oy5yN70ym8S0xk>P||M1ifmNJJW+bk-2#$Y#uhRW^@>8j5Venz&tk z_5^si#6JYOs{X9}2Q8D>K!-2liQZ}pwWCwCM+Aq1RQX0ol!aHEORQaHS%s)}IqrFf z5JWj^ZkB?q^k5~1PD;{~I$ z{ln~^hLMZ)dZu1K3XP5m^+=HR5S{93`;;$gFUPFU-50ohGpM@>Z`HQ@kqS@KGnwf+ z#v)h}?Jv4X-krkNlJhIYVUU+CDc_y+e$@&1g*A-*)6vOL-giR#kCMnn@c(~N>ZlA|_at~?YO1!T=HlWaBqUfnzRukz?99cXEOE_CL!pgHAJVPyw zM0NF+qQ+{@H&}?72UhZh6Ao)H+FW0GXgopiNe6G|syFk5nEoI1%j@#;fAVMNr zy%;beHTCuNrKOf;E_;2|g;TjD8bvr@`%0tc4@{+uGe;M zfO1tdi7|F;L-ge=)%c@h!(T1HX&riP|AtK_Nv!3NK;yR&-x|&O^gY6U(*yB|w?^?! zHX5Q81aM>0_cYy$Scb z3(Uj~Vm?LEOaee|{G8T4C5b%04}f&~f~?a3sNF!OQih^0zvwvEqg0GyJp;fw>l?`E zLuNVZX6?l0&YmD^$%~*G`)Y6lDug|ZGICXw{^;%ah*-_|7D0220x4*pSB+V;!bL+b z^D6?_xx19PDb+(hM5?5DbE5q>`?+`^lzDpNlQT%AFcW=)Op;m5kkQ*ZO6UdwK))8O z_MH^qe=5MB29fO5B5-q#xvB=NYzHw9NF%w zWwjeOIVU!O$fp9MJ*V@XOo&0zeWg@pw;k89NWPQpTaEG{lKG&KB97@l0Q;&N~FpL`t!#FQu6UGYLqLW+Ea+;=E!cS~9?{zGr#y65{})&NLu3g;ufTq0jR(3nf?!Z6FMw5SUND(!5X`AJ^eRXJ4Xz}i zQ)|Z=B&kzy2}_5k!%nVl<1p*YrEo=O-}v(8z;c1H4cpg@Joxc*`=XkRxhO*Pc@FI! z$ivffZwzT~n5a~;~X~19nqbOh^fl>*J)01M#`As4E z$+M1IY~WdH5VQMgFiUSYp5=h}GQ5AI*u3~EYJ}BGZ?9*Ic)vJ(!#Byq50M0T;4#uC zKuf|y6s)+6-}vb*qhm|Q|4Wy7KA-a<9y{ChAQ-g&_s^$vTAho{V;4Vx(HmRaGozTJ z_qbS2kT%yQO)!~LV+nOB{4CO~sG`Eg+SgtxI=V)jNN76K~ zyYMDfWcVG3dLX#DPPqE}r)tEzzB+VX+Pae+W^L$zciss`X#5H?Cnyiwsmh!!>9c0q zc%oOH>5=}Momm!o()r8@eBZx=Jtxz)( zGmfuaILg<~ZQC{yQS*3_O%eT~7*T0gL z?};Y-X5%HOhStQg9N@7U4b8(N(?a3){wN{jm#`)M-KNKNx5aIrRVXwtKvM%^yTWF)Y+B3P zNifPP&-CbD8R`~#dX8|pVcyD3bXs$0=(;}@@YrO|EotZwL4o8{2P(Ssb?x2h8{Q2| zKF0&eb5*-J5>K^yhsEi;o%#NZElcGlh3VwV4lt|Huukwuvb8Il`q)?@gf4`^3)fNn z7k2*?p!(OTT3fh4FiF+X{})$0jRq@+bq{`qB9&dYxB=HVVX~J$LPJUM@$0F2-pijA z*Dl^{a<!O@O9)vMHVe#$D;+t*?>1YQ=THXn}NRm>TETBCBBg6Pr}SD zmTuzA>T>Q@5VWp=ju7tr^^ds&tGaoM(4{R~a^Uap!Nn(FYq5BE>dfaBYBY3s=0u-2 zb)eJm*?Q_CIF|i#bJAg*{lZEE?uwW^KDgPqduTq!qv=9V=oY@zAZ(5=Y>7kjHxGr` zpS3RpZ0ptBHo}Wk(qx>^EQ_jq6_uhj)H`B#o^RM)S4oK)VHFNB6b{i$Y{n=fDW6~W z0r34+CkHcX3ef{Gr$6RPUAB5ll`qv80+yXmLic-VMIjO46mTLrk3Lt=P^L8)$QVmo z7{A>Qm_X<=tqi1dGD;zQ^RCFxOfom?; z(2AWa0it7b9sI@9??6@ohWD%08E^tWii#dwUunS24{FFpP-wi79xfww_r3qtpJi-H zDFIjr0Lgb6M(hijqW5aBHpJqM@C`1s)HMdo^hksBXg>D6Z^SE6dWvkIt}Og$0D>Ks z2tzT0Nq3)e=BV5N|5^8g#=J)Z-P_%19ufHv$GOJ7RN^4Ld+k%1muSAIALW&LZ2Q-Y zNUo=n+#7;4r&ZvQ+O9?W#+o;Wj$Ho+zh@ZV1QCF^W|v&CGXbas_PZtkH3iJXR-e?> zAhYAHxgU3HYH7KG%}g!l#g2=29k#^}NZtGPS=oT>P zv}}idoxFdD$)g@@^D?X_y7Q2D@430$=AoE-bbnvENFQs8N@C_8pniFaOGUN&aGm-V z4$aBgsofF-O9YH_+k?&&FpxYtPc0^GkOkA@MuboYc1!SknD;g3 z)nddtAG!g2^|G%oSw}xO9*31 z1gqC!#pXM_>>Us0Z#gh2EMR-_gQ{Q=G+x$P>eiruT8$WQrCl7BToZ3)7JgQBYCy6- zlE?M9IEq*_26(|ph>NSKtDoH7Q&LhkF-XeD3?*8&;A3N--|Uv^G}@cbjetG?nBv!Y zH~~MmBPA{E&aZItT-j6$Q&SCXZNpVz{mHAVD|fKC2+YWn@;k8$2)LP;(7Fh=F6n4$ z-c4#)vTP3mxs#4DdjcpJj_~|C+SZQUZpKnYMMRoU`sl!b?~2z401Zin*YYNI^75$P ztl>hsSn{XZ85%Y=HULTm!{kTc{|boPRxoR$uCD&x2#bKW3G<{oCpXuTk3@J49AF=r zTn$Z4O<+5)iOHjKMYQO4YaZD3I<{Xni3=SY+itZJA;*@?lWaf^{CB_)0Ng=QVW9_v z^pg8rHFH?&&~}xanzi$lXd4{S1G}W9r9A}6R#7&zUFPpKh7m3e-ekwPh+&k3fO|}W z*=i+q2Tks5e#>y8cm4?aci1CtosYP-2nbzp$IJ1vXs`9#zeWHi35@;ELBQ4a3D7Mu zgO!PDsyY{Zx9&Puy$nC-w|xcEk_z8KicVBu;Ex_x#(N2p+{2GYCQcVc^xO8(e-aXm zgl_6L2+-|FXE`u<^96inTw2G1ES_8(quZEWyA-ks9p>;fX(c`cYz>dn{<&y`~E z0@EwfAK^U*UYwJ2bGKl1NS;!`g6s(+`P9_Zj8 z=iOx+8!5Gm`tz)!Opv7F-(Lo}YO#mPqNByr%Z`^GwZ0yu9nk6EUkzH~)JD>mM@MgG zWK90~Q$UsSn}~1v>hMv32I~cGo6apW(ps=x%Z0j?p5DT)Iq)beexhcr8}UtXnd{)L*TXE=$w zL%+QJF}rMLkN?C#xTiUD$l_pUp>uvjNRRpNU3-RLMk%MQtquGefL+YLMvr-USe?vQ z6FLqA{uNx>E00laq|^AAg%C!LrVjfmO=+;3^P0ymj$y zk1=;H@MiPg;@!?gW(s$y(aIQ^>r-Wb*O)6XSMxnrl*@=6;P6)FYN32xUY2C8{~mQ zF$kb7ab*cy+c3&J0mU9rQ$J_jdSR%eRY}hvyL(2tqObUEY1_616sPj?^8c<+gHEwZ z*hS8kzzvS=#}rW8c!~1n}U?lTnW@aYnfyLu>6Y@Hqtb>yxPCG-M~3F}sjtYChZ5c}(b81AbtjM*(_m z;MR3pLMms7P`B25Bf;zEBMD{s`Ciz^0nfK5l++#AqJZcV9uw1TSQ$#fPk@cB{OJ=O zJS+|l4m-ghSos6)t-#eX3`uBD)Wf*;BN_x>;Liw5m6G`! zBRW=?shol9P#`W7E1b_F9_U8=S@`VDsiLl4FtrOzgbu%iH6pZR)~0~=9L+?pe2?4} zuJBrQ1J$srxBvx$4*tj`eI`xtR%`Mxw&>3r`)<|Ie>L`Ax5G!|wHDk0qWq}?r;BWA zI!)pT(LlozV7biL1#}eXjBtMr^=Sf9I93ECxQCZwu3e?9hyxX)bYdwKqT)+vDYBM zU7cZgIBp+AEA*OJT+Gdn99m6zZ9YRR7_llr@I?`s({WS#dZhbp%yokamf{l1 z2R@l`G%jpcahVwwc9~T2B-_`{ZJef6YNN^Z@a6TaS=TSfz*^VKHzJku5P`onXoBxs zv3K0MOW`Knxg^u>+<%_mzj^nyGKD+0-$?W>miWtQ_Ad54WOc|*Tf@@gD_X1F_bJw} zvGLe3*04DNia!JldqmjPs7A&Fiv1>Bto&9@e^|q%>czFy2C00=cL714mcN5E@g}_@ zWr$yePHEDAJm-CN_|VH2tbYEqLDvDZd#eHSqqHeX{gEnLy{4zp-R%K6?E&3QCr%z2 z+Ig(U2GyE!SrwvrMX^d88+1G04Bm26Dr>5%^)pP^NEW7Z+NT~WeB=6CkS_~h>K3oD zrJ>{eOJ7JX#=|V9GwJ~~(;tG)5mdI4rk;%g*BwVpMa(5eWrzxGXXcwPC+-YHw@49e zLi&aZ~b!#T<`W1AY{D4ASe$S!xHo0dF2&tp{H#A0rk6GE+ z02~Etce=cNOckWuO-yz={V~BMs+ciLFOFr@;&HpX0v<=pr`IYfD(~wD>ogh3J-`eQ z;5C84QHp@;?7n?zQ4#yww}9#gx83K&*pV;g35kFmAX1_%xnsR?%0P;jj@M1$46K9V z}@6(xGN09ja_m5<#koL0q0$qf@}2L$*~iMtrC!@C zat3d*4IeEYz&DpW_kWfBhy)7_EP94KVBjh$DmK43`%{S5&JAvzg1SjyF8y#0#XYr| z1y%?IwixrIf*0J! zcXw73`#IFKb#+`cFO~R@KXjnEm6>s{!Ko)Cu)1D0g70y5e>ly~rxDdbVx;Fn@incl zPwxf#zcwGAp(*Xc+bwtPq$K3$-aL4|Pdg=krwey|V%v`+Z-^-n}$`Od(GW|HyU^KZ@I#@fHK;M}opn73~n^QlAc zG_RZ^X2e|;+RplHF%FY3wHALmJaoOux2V?1X>>fGUDYs4l|u*DLz#TPcC5S|pFSSBT!j+MU+1swn&ssC8HzD}*}WGr_lUq5Qp$n0gLo7O$!VvS zvg70to~*ynjt@~)QOx6rR;pc(CH!XV#MZ3@i3r|^opO6IZiV~zDucpP4*nU4t$C0b zl=f~4LZpZwMng1DjL0+==$Rar8sq30Pw%%s5;>3JQI5ulD1e>8akmAmKOte~84v30 z3u|(Cg>W@yj4LBNr~uWH5)GW#T$8g1jqML^t&dFZ*OEXlUX0<-!Yi6ZImeSQ^5t&$ z@lG~p6Y_-)BIhFt`ix+WTc~_zTp1|ZgMxxUiUhv4a;VJ7GPnd384zYXaP;al4@O57 zuHMvZl7O@eKm#qT<$D1`ZvNUsZ6X4+B;NfYgu6|q9-`9r-`2|e&-9a(5 zvMcPmS@cvmX!Cpps!9O?0rqSV1T-8WE6DNb+HThy$H&LNufPhRC!5?~mR{H0phej1 zChKU~)7oE~0ts1p;yU+gqKe(ATP<6W!CZhP6G{@^zf;9efmcV@PER5`t+R@%s?N`b z3p>F8q1!keU%RA#%mhDHK|ujn#t=Pw$o zs!?mfZ@ubW5kDYZtiqctt`7XVga- zJ`#Y!2gpPDpi2{gVcy4ICbK^mN4L)aY_GLgC{V~J0gC!zfm?c#P`c2UZg^nxH`BMVL8OA`7*b#t8KDrz#Dm8QRG?`4&EC(7CGGWx1@Xsc3ZW6Kj^D^4 zqj5xyulvmlDVVnbZd(Wu4 z=I}d#x#z#%p{FmiTN!P?3T}wCtmLl7P%~psDda&6;JQ7FE0#3{aGGvkXd_w zYNS7RlR(5)1U|!Z1R5{9alFfexKhxmvR0!Nlkirv#><~G!ZwwkNi5jPp@6Xk4eS_$@9Q!0;zTotr z#ZzjzxxGa~M10!l36>t$)YdZDSB8+jOG!;7g@?7da0a^%lX)FT_`WfN?TWBL8%

        +~nK`9W>YvuP04h;cw%MZri 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%0D$&^;cz7EoqrvJ<9Mxr)>j`g)t+`U-`bF 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
        Gx_i=H)kYF{ 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

        qI1)P)FDB;-&4a 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

        Aiag@t4Tn>sD9I@kE!#=z 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 HM;Qj+6R*G^Cju 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

        q1@kDx%W3o)?{MJz#>yx7+wXsS1x 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 z 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

        RP7?3aow-%Fc=7Gk=Ro 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 P;G-a`B2y{#F7Q79>Ja>r literal 0 HcmV?d00001 diff --git a/doc/journal/2024-05-28.md/index.md b/doc/journal/2024-05-28.md/index.md new file mode 100644 index 000000000..534cb43e8 --- /dev/null +++ b/doc/journal/2024-05-28.md/index.md @@ -0,0 +1,999 @@ +## 2024-05-28*Author: @JensLincke* #Debugging Markdown HTML JavaScript JSX + +![](debuggingSession.png) + +## Logging Workspace + +```javascript +function log(s) { + document.body.querySelector("#LOG").appendChild(

        ) +} + +window.log = log + +function logStream(s, stream, other="") { + log({s} {stream.string.slice(stream.pos, -1)}, {other}); +} +window.logStream = logStream + +function logStreamState(s, stream, state) { + logStream(s, stream, state.block && state.block.name) +} +window.logStreamState = logStreamState + + +function resetLog() { + document.body.querySelector("#LOG").innerHTML = "" +} +window.resetLog = resetLog + +resetLog() + +``` + +## Markdown Mode + +```javascript +resetLog(); + + +CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { + + var htmlMode = CodeMirror.getMode(cmCfg, "text/html"); + var htmlModeMissing = htmlMode.name == "null" + + function getMode(name) { + if (CodeMirror.findModeByName) { + var found = CodeMirror.findModeByName(name); + if (found) name = found.mime || found.mimes[0]; + } + var mode = CodeMirror.getMode(cmCfg, name); + return mode.name == "null" ? null : mode; + } + + // Should characters that affect highlighting be highlighted separate? + // Does not include characters that will be output (such as `1.` and `-` for lists) + if (modeCfg.highlightFormatting === undefined) + modeCfg.highlightFormatting = false; + + // Maximum number of nested blockquotes. Set to 0 for infinite nesting. + // Excess `>` will emit `error` token. + if (modeCfg.maxBlockquoteDepth === undefined) + modeCfg.maxBlockquoteDepth = 0; + + // Should underscores in words open/close em/strong? + if (modeCfg.underscoresBreakWords === undefined) + modeCfg.underscoresBreakWords = true; + + // Use `fencedCodeBlocks` to configure fenced code blocks. false to + // disable, string to specify a precise regexp that the fence should + // match, and true to allow three or more backticks or tildes (as + // per CommonMark). + + // Turn on task lists? ("- [ ] " and "- [x] ") + if (modeCfg.taskLists === undefined) modeCfg.taskLists = false; + + // Turn on strikethrough syntax + if (modeCfg.strikethrough === undefined) + modeCfg.strikethrough = false; + + // Allow token types to be overridden by user-provided token types. + if (modeCfg.tokenTypeOverrides === undefined) + modeCfg.tokenTypeOverrides = {}; + + var tokenTypes = { + header: "header", + code: "comment", + quote: "quote", + list1: "variable-2", + list2: "variable-3", + list3: "keyword", + hr: "hr", + image: "image", + imageAltText: "image-alt-text", + imageMarker: "image-marker", + formatting: "formatting", + linkInline: "link", + linkEmail: "link", + linkText: "link", + linkHref: "string", + em: "em", + strong: "strong", + strikethrough: "strikethrough" + }; + + for (var tokenType in tokenTypes) { + if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) { + tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType]; + } + } + + var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/ + , listRE = /^(?:[*\-+]|^[0-9]+([.)]))\s+/ + , taskListRE = /^\[(x| )\](?=\s)/ // Must follow listRE + , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/ + , setextHeaderRE = /^ *(?:\={1,}|-{1,})\s*$/ + , textRE = /^[^#!\[\]*_\\<>` "'(~]+/ + , fencedCodeRE = new RegExp("^(" + (modeCfg.fencedCodeBlocks === true ? "~~~+|```+" : modeCfg.fencedCodeBlocks) + + ")[ \\t]*([\\w+#\-]*)"); + + function switchInline(stream, state, f) { + state.f = state.inline = f; + return f(stream, state); + } + + function switchBlock(stream, state, f) { + state.f = state.block = f; + return f(stream, state); + } + + function lineIsEmpty(line) { + return !line || !/\S/.test(line.string) + } + + // Blocks + + function blankLine(state) { + // Reset linkTitle state + state.linkTitle = false; + // Reset EM state + state.em = false; + // Reset STRONG state + state.strong = false; + // Reset strikethrough state + state.strikethrough = false; + // Reset state.quote + state.quote = 0; + // Reset state.indentedCode + state.indentedCode = false; + if (htmlModeMissing && state.f == htmlBlock) { + state.f = inlineNormal; + state.block = blockNormal; + } + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + // Mark this line as blank + state.prevLine = state.thisLine + state.thisLine = null + return null; + } + + function blockNormal(stream, state) { + + var sol = stream.sol(); + + var prevLineIsList = state.list !== false, + prevLineIsIndentedCode = state.indentedCode; + + state.indentedCode = false; + + if (prevLineIsList) { + if (state.indentationDiff >= 0) { // Continued list + if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block + state.indentation -= state.indentationDiff; + } + state.list = null; + } else if (state.indentation > 0) { + state.list = null; + } else { // No longer a list + state.list = false; + } + } + + var match = null; + if (state.indentationDiff >= 4) { + stream.skipToEnd(); + if (prevLineIsIndentedCode || lineIsEmpty(state.prevLine)) { + state.indentation -= 4; + state.indentedCode = true; + return tokenTypes.code; + } else { + return null; + } + } else if (stream.eatSpace()) { + return null; + } else if ((match = stream.match(atxHeaderRE)) && match[1].length <= 6) { + state.header = match[1].length; + if (modeCfg.highlightFormatting) state.formatting = "header"; + state.f = state.inline; + return getType(state); + } else if (!lineIsEmpty(state.prevLine) && !state.quote && !prevLineIsList && + !prevLineIsIndentedCode && (match = stream.match(setextHeaderRE))) { + state.header = match[0].charAt(0) == '=' ? 1 : 2; + if (modeCfg.highlightFormatting) state.formatting = "header"; + state.f = state.inline; + return getType(state); + } else if (stream.eat('>')) { + state.quote = sol ? 1 : state.quote + 1; + if (modeCfg.highlightFormatting) state.formatting = "quote"; + stream.eatSpace(); + return getType(state); + } else if (stream.peek() === '[') { + return switchInline(stream, state, footnoteLink); + } else if (stream.match(hrRE, true)) { + state.hr = true; + return tokenTypes.hr; + } else if (match = stream.match(listRE)) { + var listType = match[1] ? "ol" : "ul"; + state.indentation = stream.column() + stream.current().length; + state.list = true; + + // While this list item's marker's indentation + // is less than the deepest list item's content's indentation, + // pop the deepest list item indentation off the stack. + while (state.listStack && stream.column() < state.listStack[state.listStack.length - 1]) { + state.listStack.pop(); + } + + // Add this list item's content's indentation to the stack + state.listStack.push(state.indentation); + + if (modeCfg.taskLists && stream.match(taskListRE, false)) { + state.taskList = true; + } + state.f = state.inline; + if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; + return getType(state); + } else if (modeCfg.fencedCodeBlocks && (match = stream.match(fencedCodeRE, true))) { + state.fencedChars = match[1] + // try switching mode + state.localMode = getMode(match[2]); + if (state.localMode) state.localState = CodeMirror.startState(state.localMode); + state.f = state.block = local; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = -1 + return getType(state); + } + + return switchInline(stream, state, state.inline); + } + + function htmlBlock(stream, state) { + logStreamState("htmlBlock", stream, state); + var style = htmlMode.token(stream, state.htmlState); + if (!htmlModeMissing) { + var inner = CodeMirror.innerMode(htmlMode, state.htmlState) +// if ((inner.mode.name == "xml" && inner.state.tagStart === null && +// (!inner.state.context && inner.state.tokenize.isInText)) +// || (state.md_inside && stream.current().indexOf(">") > -1) + +// ) { +// state.f = inlineNormal; +// state.block = blockNormal; +// state.htmlState = null; +// } + } + log("=> " + style) + return style; + } + + function local(stream, state) { + if (state.fencedChars && stream.match(state.fencedChars, false)) { + state.localMode = state.localState = null; + state.f = state.block = leavingLocal; + return null; + } else if (state.localMode) { + return state.localMode.token(stream, state.localState); + } else { + stream.skipToEnd(); + return tokenTypes.code; + } + } + + function leavingLocal(stream, state) { + stream.match(state.fencedChars); + state.block = blockNormal; + state.f = inlineNormal; + state.fencedChars = null; + if (modeCfg.highlightFormatting) state.formatting = "code-block"; + state.code = 1 + var returnType = getType(state); + state.code = 0 + return returnType; + } + + // Inline + function getType(state) { + var styles = []; + + if (state.formatting) { + styles.push(tokenTypes.formatting); + + if (typeof state.formatting === "string") state.formatting = [state.formatting]; + + for (var i = 0; i < state.formatting.length; i++) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i]); + + if (state.formatting[i] === "header") { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.header); + } + + // Add `formatting-quote` and `formatting-quote-#` for blockquotes + // Add `error` instead if the maximum blockquote nesting depth is passed + if (state.formatting[i] === "quote") { + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.quote); + } else { + styles.push("error"); + } + } + } + } + + if (state.taskOpen) { + styles.push("meta"); + return styles.length ? styles.join(' ') : null; + } + if (state.taskClosed) { + styles.push("property"); + return styles.length ? styles.join(' ') : null; + } + + if (state.linkHref) { + styles.push(tokenTypes.linkHref, "url"); + } else { // Only apply inline styles to non-url text + if (state.strong) { styles.push(tokenTypes.strong); } + if (state.em) { styles.push(tokenTypes.em); } + if (state.strikethrough) { styles.push(tokenTypes.strikethrough); } + if (state.linkText) { styles.push(tokenTypes.linkText); } + if (state.code) { styles.push(tokenTypes.code); } + if (state.image) { styles.push(tokenTypes.image); } + if (state.imageAltText) { styles.push(tokenTypes.imageAltText, "link"); } + if (state.imageMarker) { styles.push(tokenTypes.imageMarker); } + } + + if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); } + + if (state.quote) { + styles.push(tokenTypes.quote); + + // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth + if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { + styles.push(tokenTypes.quote + "-" + state.quote); + } else { + styles.push(tokenTypes.quote + "-" + modeCfg.maxBlockquoteDepth); + } + } + + if (state.list !== false) { + var listMod = (state.listStack.length - 1) % 3; + if (!listMod) { + styles.push(tokenTypes.list1); + } else if (listMod === 1) { + styles.push(tokenTypes.list2); + } else { + styles.push(tokenTypes.list3); + } + } + + if (state.trailingSpaceNewLine) { + styles.push("trailing-space-new-line"); + } else if (state.trailingSpace) { + styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); + } + + return styles.length ? styles.join(' ') : null; + } + + function handleText(stream, state) { + if (stream.match(textRE, true)) { + return getType(state); + } + return undefined; + } + + function inlineNormal(stream, state) { + var style = state.text(stream, state); + if (typeof style !== 'undefined') + return style; + + if (state.list) { // List marker (*, +, -, 1., etc) + state.list = null; + return getType(state); + } + + if (state.taskList) { + var taskOpen = stream.match(taskListRE, true)[1] !== "x"; + if (taskOpen) state.taskOpen = true; + else state.taskClosed = true; + if (modeCfg.highlightFormatting) state.formatting = "task"; + state.taskList = false; + return getType(state); + } + + state.taskOpen = false; + state.taskClosed = false; + + if (state.header && stream.match(/^#+$/, true)) { + if (modeCfg.highlightFormatting) state.formatting = "header"; + return getType(state); + } + + // Get sol() value now, before character is consumed + var sol = stream.sol(); + + var ch = stream.next(); + + // Matches link titles present on next line + if (state.linkTitle) { + state.linkTitle = false; + var matchCh = ch; + if (ch === '(') { + matchCh = ')'; + } + matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); + var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; + if (stream.match(new RegExp(regex), true)) { + return tokenTypes.linkHref; + } + } + + // If this block is changed, it may need to be updated in GFM mode + if (ch === '`') { + var previousFormatting = state.formatting; + if (modeCfg.highlightFormatting) state.formatting = "code"; + stream.eatWhile('`'); + var count = stream.current().length + if (state.code == 0) { + state.code = count + return getType(state) + } else if (count == state.code) { // Must be exact + var t = getType(state) + state.code = 0 + return t + } else { + state.formatting = previousFormatting + return getType(state) + } + } else if (state.code) { + return getType(state); + } + + if (ch === '\\') { + stream.next(); + if (modeCfg.highlightFormatting) { + var type = getType(state); + var formattingEscape = tokenTypes.formatting + "-escape"; + return type ? type + " " + formattingEscape : formattingEscape; + } + } + + if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { + state.imageMarker = true; + state.image = true; + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + + if (ch === '[' && state.imageMarker && stream.match(/[^\]]*\](\(.*?\)| ?\[.*?\])/, false)) { + state.imageMarker = false; + state.imageAltText = true + if (modeCfg.highlightFormatting) state.formatting = "image"; + return getType(state); + } + + if (ch === ']' && state.imageAltText) { + if (modeCfg.highlightFormatting) state.formatting = "image"; + var type = getType(state); + state.imageAltText = false; + state.image = false; + state.inline = state.f = linkHref; + return type; + } + + if (ch === '[' && stream.match(/[^\]]*\](\(.*\)| ?\[.*?\])/, false) && !state.image) { + state.linkText = true; + if (modeCfg.highlightFormatting) state.formatting = "link"; + return getType(state); + } + + if (ch === ']' && state.linkText && stream.match(/\(.*?\)| ?\[.*?\]/, false)) { + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + state.linkText = false; + state.inline = state.f = linkHref; + return type; + } + + if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + + if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { + state.f = state.inline = linkInline; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkEmail; + } + + if (ch === '<' && stream.match(/^(!--|[a-z]+(?:\s+[a-z_:.\-]+(?:\s*=\s*[^ >]+)?)*\s*>)/i, false)) { + var end = stream.string.indexOf(">", stream.pos); + if (end != -1) { + var atts = stream.string.substring(stream.start, end); + if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true; + } + stream.backUp(1); + state.htmlState = CodeMirror.startState(htmlMode); + return switchBlock(stream, state, htmlBlock); + } + + if (ch === '<' && stream.match(/^\/\w*?>/)) { + state.md_inside = false; + return "tag"; + } + + var ignoreUnderscore = false; + if (!modeCfg.underscoresBreakWords) { + if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) { + var prevPos = stream.pos - 2; + if (prevPos >= 0) { + var prevCh = stream.string.charAt(prevPos); + if (prevCh !== '_' && prevCh.match(/(\w)/, false)) { + ignoreUnderscore = true; + } + } + } + } + if (ch === '*' || (ch === '_' && !ignoreUnderscore)) { + if (sol && stream.peek() === ' ') { + // Do nothing, surrounded by newline and space + } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG + if (modeCfg.highlightFormatting) state.formatting = "strong"; + var t = getType(state); + state.strong = false; + return t; + } else if (!state.strong && stream.eat(ch)) { // Add STRONG + state.strong = ch; + if (modeCfg.highlightFormatting) state.formatting = "strong"; + return getType(state); + } else if (state.em === ch) { // Remove EM + if (modeCfg.highlightFormatting) state.formatting = "em"; + var t = getType(state); + state.em = false; + return t; + } else if (!state.em) { // Add EM + state.em = ch; + if (modeCfg.highlightFormatting) state.formatting = "em"; + return getType(state); + } + } else if (ch === ' ') { + if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(1); + } + } + } + + if (modeCfg.strikethrough) { + if (ch === '~' && stream.eatWhile(ch)) { + if (state.strikethrough) {// Remove strikethrough + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + var t = getType(state); + state.strikethrough = false; + return t; + } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough + state.strikethrough = true; + if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; + return getType(state); + } + } else if (ch === ' ') { + if (stream.match(/^~~/, true)) { // Probably surrounded by space + if (stream.peek() === ' ') { // Surrounded by spaces, ignore + return getType(state); + } else { // Not surrounded by spaces, back up pointer + stream.backUp(2); + } + } + } + } + + if (ch === ' ') { + if (stream.match(/ +$/, false)) { + state.trailingSpace++; + } else if (state.trailingSpace) { + state.trailingSpaceNewLine = true; + } + } + + return getType(state); + } + + function linkInline(stream, state) { + var ch = stream.next(); + + if (ch === ">") { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var type = getType(state); + if (type){ + type += " "; + } else { + type = ""; + } + return type + tokenTypes.linkInline; + } + + stream.match(/^[^>]+/, true); + + return tokenTypes.linkInline; + } + + function linkHref(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + var ch = stream.next(); + if (ch === '(' || ch === '[') { + state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]", 0); + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + state.linkHref = true; + return getType(state); + } + return 'error'; + } + + var linkRE = { + ")": /^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/, + "]": /^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\\]]|\\.)*\])*?(?=\])/ + } + + function getLinkHrefInside(endChar) { + return function(stream, state) { + var ch = stream.next(); + + if (ch === endChar) { + state.f = state.inline = inlineNormal; + if (modeCfg.highlightFormatting) state.formatting = "link-string"; + var returnState = getType(state); + state.linkHref = false; + return returnState; + } + + stream.match(linkRE[endChar]) + state.linkHref = true; + return getType(state); + }; + } + + function footnoteLink(stream, state) { + if (stream.match(/^([^\]\\]|\\.)*\]:/, false)) { + state.f = footnoteLinkInside; + stream.next(); // Consume [ + if (modeCfg.highlightFormatting) state.formatting = "link"; + state.linkText = true; + return getType(state); + } + return switchInline(stream, state, inlineNormal); + } + + function footnoteLinkInside(stream, state) { + if (stream.match(/^\]:/, true)) { + state.f = state.inline = footnoteUrl; + if (modeCfg.highlightFormatting) state.formatting = "link"; + var returnType = getType(state); + state.linkText = false; + return returnType; + } + + stream.match(/^([^\]\\]|\\.)+/, true); + + return tokenTypes.linkText; + } + + function footnoteUrl(stream, state) { + // Check if space, and return NULL if so (to avoid marking the space) + if(stream.eatSpace()){ + return null; + } + // Match URL + stream.match(/^[^\s]+/, true); + // Check for link title + if (stream.peek() === undefined) { // End of line, set flag to check next line + state.linkTitle = true; + } else { // More content on line, check if link title + stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true); + } + state.f = state.inline = inlineNormal; + return tokenTypes.linkHref + " url"; + } + + var mode = { + startState: function() { + return { + f: blockNormal, + + prevLine: null, + thisLine: null, + + block: blockNormal, + htmlState: null, + indentation: 0, + + inline: inlineNormal, + text: handleText, + + formatting: false, + linkText: false, + linkHref: false, + linkTitle: false, + code: 0, + em: false, + strong: false, + header: 0, + hr: false, + taskList: false, + list: false, + listStack: [], + quote: 0, + trailingSpace: 0, + trailingSpaceNewLine: false, + strikethrough: false, + fencedChars: null + }; + }, + + copyState: function(s) { + return { + f: s.f, + + prevLine: s.prevLine, + thisLine: s.thisLine, + + block: s.block, + htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), + indentation: s.indentation, + + localMode: s.localMode, + localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, + + inline: s.inline, + text: s.text, + formatting: false, + linkTitle: s.linkTitle, + code: s.code, + em: s.em, + strong: s.strong, + strikethrough: s.strikethrough, + header: s.header, + hr: s.hr, + taskList: s.taskList, + list: s.list, + listStack: s.listStack.slice(0), + quote: s.quote, + indentedCode: s.indentedCode, + trailingSpace: s.trailingSpace, + trailingSpaceNewLine: s.trailingSpaceNewLine, + md_inside: s.md_inside, + fencedChars: s.fencedChars + }; + }, + + token: function(stream, state) { + logStreamState("token", stream, state); + if (stream.string.slice(stream.pos, -1) == "b = 3") { + debugger + } + if (stream.string.slice(stream.pos, -1) == "let a = x, b = 3") { + debugger + } + + + // Reset state.formatting + state.formatting = false; + + if (stream != state.thisLine) { + var forceBlankLine = state.header || state.hr; + + // Reset state.header and state.hr + state.header = 0; + state.hr = false; + + if (stream.match(/^\s*$/, true) || forceBlankLine) { + blankLine(state); + if (!forceBlankLine) return null + state.prevLine = null + } + + state.prevLine = state.thisLine + state.thisLine = stream + + // Reset state.taskList + state.taskList = false; + + // Reset state.trailingSpace + state.trailingSpace = 0; + state.trailingSpaceNewLine = false; + + state.f = state.block; + var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length; + state.indentationDiff = Math.min(indentation - state.indentation, 4); + state.indentation = state.indentation + state.indentationDiff; + if (indentation > 0) return null; + } + return state.f(stream, state); + }, + + innerMode: function(state) { + if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode}; + if (state.localState) return {state: state.localState, mode: state.localMode}; + return {state: state, mode: mode}; + }, + + blankLine: blankLine, + + getType: getType, + + closeBrackets: "()[]{}''\"\"``", + fold: "markdown" + }; + return mode; +}, "xml"); + +CodeMirror.defineMIME("text/x-markdown", "markdown"); +``` + +### JavaScript Workspace + + +```javascript +resetLog(); + + // Depth means the amount of open braces in JS context, in XML + // context 0 means not in tag, 1 means in tag, and 2 means in tag + // and js block comment. + function Context(state, mode, depth, prev) { + this.state = state; this.mode = mode; this.depth = depth; this.prev = prev + } + + function copyContext(context) { + return new Context(CodeMirror.copyState(context.mode, context.state), + context.mode, + context.depth, + context.prev && copyContext(context.prev)) + } + + CodeMirror.defineMode("jsx", function(config, modeConfig) { + var xmlMode = CodeMirror.getMode(config, {name: "xml", allowMissing: true, multilineTagIndentPastTag: false}) + var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || "javascript") + + function flatXMLIndent(state) { + var tagName = state.tagName + state.tagName = null + var result = xmlMode.indent(state, "") + state.tagName = tagName + return result + } + + function token(stream, state) { + if (state.context.mode == xmlMode) + return xmlToken(stream, state, state.context) + else + return jsToken(stream, state, state.context) + } + + function xmlToken(stream, state, cx) { + log("xmlToken " + stream.string.slice(stream.pos, -1)) + if (cx.depth == 2) { // Inside a JS /* */ comment + if (stream.match(/^.*?\*\//)) cx.depth = 1 + else stream.skipToEnd() + return "comment" + } + + if (stream.peek() == "{") { + xmlMode.skipAttribute(cx.state) + + var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context + // If JS starts on same line as tag + if (xmlContext && stream.match(/^[^>]*>\s*$/, false)) { + while (xmlContext.prev && !xmlContext.startOfLine) + xmlContext = xmlContext.prev + // If tag starts the line, use XML indentation level + if (xmlContext.startOfLine) indent -= config.indentUnit + // Else use JS indentation level + else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented + // Else if inside of tag + } else if (cx.depth == 1) { + indent += config.indentUnit + } + + state.context = new Context(CodeMirror.startState(jsMode, indent), + jsMode, 0, state.context) + return null + } + + if (cx.depth == 1) { // Inside of tag + if (stream.peek() == "<") { // Tag inside of tag + xmlMode.skipAttribute(cx.state) + state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)), + xmlMode, 0, state.context) + return null + } else if (stream.match("//")) { + stream.skipToEnd() + return "comment" + } else if (stream.match("/*")) { + cx.depth = 2 + return token(stream, state) + } + } + + var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop + if (/\btag\b/.test(style)) { + if (/>$/.test(cur)) { + if (cx.state.context) cx.depth = 0 + else state.context = state.context.prev + } else if (/^ -1) { + stream.backUp(cur.length - stop) + } + return style + } + + function jsToken(stream, state, cx) { + logStreamState("jsToken", stream, state) + if (stream.peek() == "<" && jsMode.expressionAllowed(stream, cx.state)) { + jsMode.skipExpression(cx.state) + state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, "")), + xmlMode, 0, state.context) + log("special < " + state.context.mode.name) + return null + } + + var style = jsMode.token(stream, cx.state) + if (!style && cx.depth != null) { + var cur = stream.current() + if (cur == "{") { + cx.depth++ + } else if (cur == "}") { + if (--cx.depth == 0) state.context = state.context.prev + } + } + log("JS => " + style) + return style + } + + return { + startState: function() { + return {context: new Context(CodeMirror.startState(jsMode), jsMode)} + }, + + copyState: function(state) { + return {context: copyContext(state.context)} + }, + + token: token, + + indent: function(state, textAfter, fullLine) { + return state.context.mode.indent(state.context.state, textAfter, fullLine) + }, + + innerMode: function(state) { + return state.context + } + } + }, "xml", "javascript") + + CodeMirror.defineMIME("text/jsx", "jsx") + CodeMirror.defineMIME("text/typescript-jsx", {name: "jsx", base: {name: "javascript", typescript: true}}) +; +``` + + diff --git a/src/components/widgets/lively-code-mirror.js b/src/components/widgets/lively-code-mirror.js index 8829c5935..1e7b6bb0a 100644 --- a/src/components/widgets/lively-code-mirror.js +++ b/src/components/widgets/lively-code-mirror.js @@ -104,6 +104,7 @@ export default class LivelyCodeMirror extends HTMLElement { await this.loadModule("mode/css/css.js"); await this.loadModule("mode/diff/diff.js"); + await this.loadModule("mode/meta.js"); await this.loadModule("mode/markdown/markdown.js"); await this.loadModule("mode/htmlmixed/htmlmixed.js"); await this.loadModule("addon/mode/overlay.js"); diff --git a/src/external/code-mirror/addon/lint/html-lint.js b/src/external/code-mirror/addon/lint/html-lint.js index ade7e17e6..1e8417098 100644 --- a/src/external/code-mirror/addon/lint/html-lint.js +++ b/src/external/code-mirror/addon/lint/html-lint.js @@ -28,7 +28,6 @@ }; CodeMirror.registerHelper("lint", "html", function(text, options) { - debugger var found = []; if (!window.HTMLHint) return found; var messages = HTMLHint.verify(text, options && options.rules || defaultRules); diff --git a/src/external/code-mirror/mode/markdown/markdown.js b/src/external/code-mirror/mode/markdown/markdown.js index 1aeb34414..dc2638ad8 100644 --- a/src/external/code-mirror/mode/markdown/markdown.js +++ b/src/external/code-mirror/mode/markdown/markdown.js @@ -224,17 +224,22 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { } function htmlBlock(stream, state) { + debugger var style = htmlMode.token(stream, state.htmlState); if (!htmlModeMissing) { var inner = CodeMirror.innerMode(htmlMode, state.htmlState) - if ((inner.mode.name == "xml" && inner.state.tagStart === null && - (!inner.state.context && inner.state.tokenize.isInText)) || - (state.md_inside && stream.current().indexOf(">") > -1)) { - state.f = inlineNormal; - state.block = blockNormal; - state.htmlState = null; - } - } + + // #JSX in Script tag requires to disable this + // if ((inner.mode.name == "xml" && inner.state.tagStart === null && + // (!inner.state.context && inner.state.tokenize.isInText)) || + // (state.md_inside && stream.current().indexOf(">") > -1)) { + // state.f = inlineNormal; + // state.block = blockNormal; + // state.htmlState = null; + // } + } + + console.log("htmlBlock " + style) return style; } From 74302a58ce814ac94896f6b145a9a810a60091c4 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Tue, 28 May 2024 15:19:31 +0200 Subject: [PATCH 15/47] make interactive eval in modules work again SQUASHED: AUTO-COMMIT-src-client-audio.js,AUTO-COMMIT-src-external-babel-plugin-var-recorder.js,AUTO-COMMIT-src-external-code-mirror-mode-markdown-markdown.js,AUTO-COMMIT-src-plugin-babel.js, --- src/external/babel-plugin-var-recorder.js | 15 ++++++++++----- .../code-mirror/mode/markdown/markdown.js | 4 +--- src/plugin-babel.js | 1 + 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/external/babel-plugin-var-recorder.js b/src/external/babel-plugin-var-recorder.js index 2332bfa65..9f01a209d 100644 --- a/src/external/babel-plugin-var-recorder.js +++ b/src/external/babel-plugin-var-recorder.js @@ -1,7 +1,7 @@ const moduleNameToVarRecorderName = new Map(); export function getScopeIdForModule(moduleName) { - // console.log("[babel-plugin-var-recorder] getScopeIdForModule", moduleName); + console.log("[babel-plugin-var-recorder] getScopeIdForModule", moduleName); if (!moduleNameToVarRecorderName.has(moduleName)) { var scopeId = (moduleName || "undefined").replace(lively4url, "").replace(/[^a-zA-Z0-9]/g, "_") moduleNameToVarRecorderName.set(moduleName, scopeId); @@ -60,15 +60,16 @@ class VarRecorder { /*MD ## Implementation MD*/ get MODULE_NAME() { + // console.log("MODULE_NAME " + this._MODULE_NAME + " " + this.filename) if (!this._MODULE_NAME) { const DOIT_MATCHER = /^\/?workspace(async)?(js)?:/; // #TODO babel7 seems to add / as prefix const MODULE_MATCHER = /.js$/; if (window.__topLevelVarRecorder_ModuleNames__ && DOIT_MATCHER.test(this.filename) && !MODULE_MATCHER.test(this.filename)) { // workspace: becomes workspacejs... e.g. and we are only interested in the id ... - var codeIdAndPath = this.filename.replace(DOIT_MATCHER, "") + let codeIdAndPath = this.filename.replace(DOIT_MATCHER, "") // strip path... that we encoded.... - var codeId = codeIdAndPath.replace(/\/.*/, "") + let codeId = codeIdAndPath.replace(/\/.*/, "") codeId = codeId + "/" // see bound-eval.js @@ -81,10 +82,14 @@ class VarRecorder { // console.log("boundEval MODULE_NAME: " + MODULE_NAME + " codeId: " + codeId) } else if (!DOIT_MATCHER.test(this.filename) && MODULE_MATCHER.test(this.filename)) { // eval a .js file + // console.log("this._MODULE_NAME " + this.filename) this._MODULE_NAME = this.filename; } else if (DOIT_MATCHER.test(this.filename) && MODULE_MATCHER.test(this.filename)) { - // doits of in modules might take this path... - // throw new Error("relative files loaded by workspace failed to resolve early: " + this.filename) + // doits of in modules take this path... + let codeIdAndPath = this.filename.replace(DOIT_MATCHER, "") + let path = location.protocol + "//" + codeIdAndPath.replace(/[^/]*\//, "") + this._MODULE_NAME = path + // console.log("this._MODULE_NAME " + this._MODULE_NAME) } else { throw new Error(`Transpiling neither a .js module nor workspace code(${this._MODULE_NAME})`); } diff --git a/src/external/code-mirror/mode/markdown/markdown.js b/src/external/code-mirror/mode/markdown/markdown.js index dc2638ad8..c9193298f 100644 --- a/src/external/code-mirror/mode/markdown/markdown.js +++ b/src/external/code-mirror/mode/markdown/markdown.js @@ -224,7 +224,7 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { } function htmlBlock(stream, state) { - debugger + var style = htmlMode.token(stream, state.htmlState); if (!htmlModeMissing) { var inner = CodeMirror.innerMode(htmlMode, state.htmlState) @@ -238,8 +238,6 @@ CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { // state.htmlState = null; // } } - - console.log("htmlBlock " + style) return style; } diff --git a/src/plugin-babel.js b/src/plugin-babel.js index f0f4496dd..c1e86969b 100644 --- a/src/plugin-babel.js +++ b/src/plugin-babel.js @@ -445,6 +445,7 @@ _export("aexprViaDirectivePlugins", aexprViaDirectivePlugins) // workspace async function workspacePlugins(options = {}) { + // console.log("workspacePlugins") var result = [ // lively4url + '/demos/swe/debugging-plugin.js', ] From 905cb729a64af8ee172875610572eef873383f20 Mon Sep 17 00:00:00 2001 From: JensLincke Date: Tue, 28 May 2024 16:41:12 +0200 Subject: [PATCH 16/47] removed old tern SQUASHED: AUTO-COMMIT-demos-markdown-test.md,AUTO-COMMIT-src-client-audio.js,AUTO-COMMIT-src-components-widgets-ast-capabilities.js,AUTO-COMMIT-src-components-widgets-lively-code-mirror-hint.js,AUTO-COMMIT-src-components-widgets-lively-code-mirror.js, --- demos/markdown/test.md | 24 +- src/components/widgets/ast-capabilities.js | 1 + .../widgets/lively-code-mirror-hint.js | 1 + src/components/widgets/lively-code-mirror.js | 94 - src/external/tern/acorn.js | 3142 --------------- src/external/tern/acorn_loose.js | 1273 ------ src/external/tern/browser.json | 3586 ----------------- src/external/tern/chai.json | 596 --- src/external/tern/comment.js | 87 - src/external/tern/def.js | 731 ---- src/external/tern/ecmascript.json | 1929 --------- src/external/tern/es_modules.js | 115 - src/external/tern/infer.js | 2169 ---------- src/external/tern/modules.js | 377 -- src/external/tern/polyfill.js | 80 - src/external/tern/signal.js | 51 - src/external/tern/tern.js | 1153 ------ src/external/tern/walk.js | 360 -- 18 files changed, 3 insertions(+), 15766 deletions(-) delete mode 100644 src/external/tern/acorn.js delete mode 100644 src/external/tern/acorn_loose.js delete mode 100644 src/external/tern/browser.json delete mode 100644 src/external/tern/chai.json delete mode 100644 src/external/tern/comment.js delete mode 100644 src/external/tern/def.js delete mode 100644 src/external/tern/ecmascript.json delete mode 100644 src/external/tern/es_modules.js delete mode 100644 src/external/tern/infer.js delete mode 100644 src/external/tern/modules.js delete mode 100644 src/external/tern/polyfill.js delete mode 100644 src/external/tern/signal.js delete mode 100644 src/external/tern/tern.js delete mode 100644 src/external/tern/walk.js diff --git a/demos/markdown/test.md b/demos/markdown/test.md index b02e42b71..63bec5aba 100644 --- a/demos/markdown/test.md +++ b/demos/markdown/test.md @@ -2,9 +2,7 @@ @@ -12,27 +10,7 @@ var foo = 3 - - - - \ No newline at end of file diff --git a/src/components/widgets/ast-capabilities.js b/src/components/widgets/ast-capabilities.js index 7320c0617..a10d7a150 100644 --- a/src/components/widgets/ast-capabilities.js +++ b/src/components/widgets/ast-capabilities.js @@ -1485,6 +1485,7 @@ ${lineContent} */ get programPath() { if (!this.myProgramPath && !this.parsingFailed) { + // #TODO #Idea to get AST navigation in scripts in markdown, we could overwrite all non script content with whitespace, because we case for correct character positions this.myProgramPath = this.programPathFor(this.sourceCode); this.parsingFailed = !this.myProgramPath; } diff --git a/src/components/widgets/lively-code-mirror-hint.js b/src/components/widgets/lively-code-mirror-hint.js index ea839e099..159a57bd6 100644 --- a/src/components/widgets/lively-code-mirror-hint.js +++ b/src/components/widgets/lively-code-mirror-hint.js @@ -634,6 +634,7 @@ return ${code} /*MD ## Tern Integration MD*/ async completeFromTern() { + debugger const lcm = lcmFromCM(this.cm); const tw = await lcm.ternWrapper; const fileName = lcm.getTargetModule(); diff --git a/src/components/widgets/lively-code-mirror.js b/src/components/widgets/lively-code-mirror.js index 1e7b6bb0a..2874c8a89 100644 --- a/src/components/widgets/lively-code-mirror.js +++ b/src/components/widgets/lively-code-mirror.js @@ -157,27 +157,6 @@ export default class LivelyCodeMirror extends HTMLElement { return self.__codeMirrorLoadingPromise__; } - // #TODO #Refactor not needed anymore - static async loadTernModules() { - if (this.ternIsLoaded) return; - - await this.loadModule("addon/tern/tern.js"); - - var terndir = lively4url + '/src/external/tern/'; - await lively.loadJavaScriptThroughDOM("tern_acorn", terndir + 'acorn.js'); - await lively.loadJavaScriptThroughDOM("tern_acorn_loose", terndir + 'acorn_loose.js'); - await lively.loadJavaScriptThroughDOM("tern_walk", terndir + 'walk.js'); - await lively.loadJavaScriptThroughDOM("tern_polyfill", terndir + 'polyfill.js'); - await lively.loadJavaScriptThroughDOM("tern_signal", terndir + 'signal.js'); - await lively.loadJavaScriptThroughDOM("tern_tern", terndir + 'tern.js'); - await lively.loadJavaScriptThroughDOM("tern_def", terndir + 'def.js'); - await lively.loadJavaScriptThroughDOM("tern_comment", terndir + 'comment.js'); - await lively.loadJavaScriptThroughDOM("tern_infer", terndir + 'infer.js'); - await lively.loadJavaScriptThroughDOM("tern_plugin_modules", terndir + 'modules.js'); - await lively.loadJavaScriptThroughDOM("tern_plugin_esmodules", terndir + 'es_modules.js'); - this.ternIsLoaded = true; - } - get astCapabilities() { if (!this.myASTCapabilities || !(this.myASTCapabilities instanceof self.__ASTCapabilities__ )) { @@ -1211,79 +1190,6 @@ export default class LivelyCodeMirror extends HTMLElement { lively.setPosition(this.shadowRoot.querySelector("#code-mirror-hints"), pt(-document.scrollingElement.scrollLeft, -document.scrollingElement.scrollTop).subPt(lively.getClientPosition(this))); } - // async enableTern() { - // await LivelyCodeMirror.loadTernModules() - - // var ecmascriptdefs = await fetch(lively4url + "/src/external/tern/ecmascript.json").then(r => r.json()) - // var browserdefs = await fetch(lively4url + "/src/external/tern/browser.json").then(r => r.json()) - // // var chaidefs = await fetch(lively4url + "/src/external/tern/chai.json").then(r => r.json()) - - // // Options supported (all optional): - // // * defs: An array of JSON definition data structures. - // // * plugins: An object mapping plugin names to configuration - // // options. - // // * getFile: A function(name, c) that can be used to access files in - // // the project that haven't been loaded yet. Simply do c(null) to - // // indicate that a file is not available. - // // * fileFilter: A function(value, docName, doc) that will be applied - // // to documents before passing them on to Tern. - // // * switchToDoc: A function(name, doc) that should, when providing a - // // multi-file view, switch the view or focus to the named file. - // // * showError: A function(editor, message) that can be used to - // // override the way errors are displayed. - // // * completionTip: Customize the content in tooltips for completions. - // // Is passed a single argument the completion's data as returned by - // // Tern and may return a string, DOM node, or null to indicate that - // // no tip should be shown. By default the docstring is shown. - // // * typeTip: Like completionTip, but for the tooltips shown for type - // // queries. - // // * responseFilter: A function(doc, query, request, error, data) that - // // will be applied to the Tern responses before treating them - - // // It is possible to run the Tern server in a web worker by specifying - // // these additional options: - // // * useWorker: Set to true to enable web worker mode. You'll probably - // // want to feature detect the actual value you use here, for example - // // !!window.Worker. - // // * workerScript: The main script of the worker. Point this to - // // wherever you are hosting worker.js from this directory. - // // * workerDeps: An array of paths pointing (relative to workerScript) - // // to the Acorn and Tern libraries and any Tern plugins you want to - // // load. Or, if you minified those into a single script and included - // // them in the workerScript, simply leave this undefined. - - // this.ternServer = new CodeMirror.TernServer({ - // defs: [ecmascriptdefs, browserdefs], // chaidefs - // plugins: { - // es_modules: {} - // }, - // getFile: (name, c) => { - // lively.notify("get file " + name) - // c(null) - // }, - // // responseFilter: (doc, query, request, error, data) => { - // // return data - // // } - - // }); - - // this.editor.setOption("extraKeys", Object.assign({}, - // this.editor.getOption("extraKeys"), - // { - // "Ctrl-Space": (cm) => { - // this.fixHintsPosition(); - // this.ternServer.complete(cm); - // }, - // "Ctrl-Alt-I": (cm) => { this.ternServer.showType(cm); }, - // "Ctrl-O": (cm) => { this.ternServer.showDocs(cm); }, - // "Alt-.": (cm) => { this.ternServer.jumpToDef(cm); }, - // "Alt-,": (cm) => { this.ternServer.jumpBack(cm); }, - // "Ctrl-Q": (cm) => { this.ternServer.rename(cm); }, - // "Ctrl-.": (cm) => { this.ternServer.selectName(cm); } - // })) - - // this.editor.on("cursorActivity", (cm) => { this.ternServer.updateArgHints(cm); }); - // } async addTernFile(name, url, text) { diff --git a/src/external/tern/acorn.js b/src/external/tern/acorn.js deleted file mode 100644 index a7cf93b04..000000000 --- a/src/external/tern/acorn.js +++ /dev/null @@ -1,3142 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.acorn = global.acorn || {}))); -}(this, function (exports) { 'use strict'; - - // Reserved word lists for various dialects of the language - - var reservedWords = { - 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", - 5: "class enum extends super const export import", - 6: "enum", - 7: "enum", - strict: "implements interface let package private protected public static yield", - strictBind: "eval arguments" - } - - // And the keywords - - var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this" - - var keywords = { - 5: ecma5AndLessKeywords, - 6: ecma5AndLessKeywords + " const class extends export import super" - } - - // ## Character categories - - // Big ugly regular expressions that match characters in the - // whitespace, identifier, and identifier-start categories. These - // are only applied when a character is found to actually have a - // code point above 128. - // Generated by `bin/generate-identifier-regex.js`. - - var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc" - var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f" - - var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]") - var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]") - - nonASCIIidentifierStartChars = nonASCIIidentifierChars = null - - // These are a run-length and offset encoded representation of the - // >0xffff code points that are a valid part of identifiers. The - // offset starts at 0x10000, and each pair of numbers represents an - // offset to the next range, and then a size of the range. They were - // generated by bin/generate-identifier-regex.js - var astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541] - var astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239] - - // This has a complexity linear to the value of the code. The - // assumption is that looking up astral identifier characters is - // rare. - function isInAstralSet(code, set) { - var pos = 0x10000 - for (var i = 0; i < set.length; i += 2) { - pos += set[i] - if (pos > code) return false - pos += set[i + 1] - if (pos >= code) return true - } - } - - // Test whether a given character code starts an identifier. - - function isIdentifierStart(code, astral) { - if (code < 65) return code === 36 - if (code < 91) return true - if (code < 97) return code === 95 - if (code < 123) return true - if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) - if (astral === false) return false - return isInAstralSet(code, astralIdentifierStartCodes) - } - - // Test whether a given character is part of an identifier. - - function isIdentifierChar(code, astral) { - if (code < 48) return code === 36 - if (code < 58) return true - if (code < 65) return false - if (code < 91) return true - if (code < 97) return code === 95 - if (code < 123) return true - if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) - if (astral === false) return false - return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) - } - - // ## Token types - - // The assignment of fine-grained, information-carrying type objects - // allows the tokenizer to store the information it has about a - // token in a way that is very cheap for the parser to look up. - - // All token type variables start with an underscore, to make them - // easy to recognize. - - // The `beforeExpr` property is used to disambiguate between regular - // expressions and divisions. It is set on all token types that can - // be followed by an expression (thus, a slash after them would be a - // regular expression). - // - // The `startsExpr` property is used to check if the token ends a - // `yield` expression. It is set on all token types that either can - // directly start an expression (like a quotation mark) or can - // continue an expression (like the body of a string). - // - // `isLoop` marks a keyword as starting a loop, which is important - // to know when parsing a label, in order to allow or disallow - // continue jumps to that label. - - var TokenType = function TokenType(label, conf) { - if ( conf === void 0 ) conf = {}; - - this.label = label - this.keyword = conf.keyword - this.beforeExpr = !!conf.beforeExpr - this.startsExpr = !!conf.startsExpr - this.isLoop = !!conf.isLoop - this.isAssign = !!conf.isAssign - this.prefix = !!conf.prefix - this.postfix = !!conf.postfix - this.binop = conf.binop || null - this.updateContext = null - }; - - function binop(name, prec) { - return new TokenType(name, {beforeExpr: true, binop: prec}) - } - var beforeExpr = {beforeExpr: true}; - var startsExpr = {startsExpr: true}; - // Map keyword names to token types. - - var keywordTypes = {} - - // Succinct definitions of keyword token types - function kw(name, options) { - if ( options === void 0 ) options = {}; - - options.keyword = name - return keywordTypes[name] = new TokenType(name, options) - } - - var tt = { - num: new TokenType("num", startsExpr), - regexp: new TokenType("regexp", startsExpr), - string: new TokenType("string", startsExpr), - name: new TokenType("name", startsExpr), - eof: new TokenType("eof"), - - // Punctuation token types. - bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}), - bracketR: new TokenType("]"), - braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}), - braceR: new TokenType("}"), - parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}), - parenR: new TokenType(")"), - comma: new TokenType(",", beforeExpr), - semi: new TokenType(";", beforeExpr), - colon: new TokenType(":", beforeExpr), - dot: new TokenType("."), - question: new TokenType("?", beforeExpr), - arrow: new TokenType("=>", beforeExpr), - template: new TokenType("template"), - ellipsis: new TokenType("...", beforeExpr), - backQuote: new TokenType("`", startsExpr), - dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}), - - // Operators. These carry several kinds of properties to help the - // parser use them properly (the presence of these properties is - // what categorizes them as operators). - // - // `binop`, when present, specifies that this operator is a binary - // operator, and will refer to its precedence. - // - // `prefix` and `postfix` mark the operator as a prefix or postfix - // unary operator. - // - // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as - // binary operators with a very low precedence, that should result - // in AssignmentExpression nodes. - - eq: new TokenType("=", {beforeExpr: true, isAssign: true}), - assign: new TokenType("_=", {beforeExpr: true, isAssign: true}), - incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}), - prefix: new TokenType("prefix", {beforeExpr: true, prefix: true, startsExpr: true}), - logicalOR: binop("||", 1), - logicalAND: binop("&&", 2), - bitwiseOR: binop("|", 3), - bitwiseXOR: binop("^", 4), - bitwiseAND: binop("&", 5), - equality: binop("==/!=", 6), - relational: binop("", 7), - bitShift: binop("<>", 8), - plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}), - modulo: binop("%", 10), - star: binop("*", 10), - slash: binop("/", 10), - starstar: new TokenType("**", {beforeExpr: true}), - - // Keyword token types. - _break: kw("break"), - _case: kw("case", beforeExpr), - _catch: kw("catch"), - _continue: kw("continue"), - _debugger: kw("debugger"), - _default: kw("default", beforeExpr), - _do: kw("do", {isLoop: true, beforeExpr: true}), - _else: kw("else", beforeExpr), - _finally: kw("finally"), - _for: kw("for", {isLoop: true}), - _function: kw("function", startsExpr), - _if: kw("if"), - _return: kw("return", beforeExpr), - _switch: kw("switch"), - _throw: kw("throw", beforeExpr), - _try: kw("try"), - _var: kw("var"), - _const: kw("const"), - _while: kw("while", {isLoop: true}), - _with: kw("with"), - _new: kw("new", {beforeExpr: true, startsExpr: true}), - _this: kw("this", startsExpr), - _super: kw("super", startsExpr), - _class: kw("class"), - _extends: kw("extends", beforeExpr), - _export: kw("export"), - _import: kw("import"), - _null: kw("null", startsExpr), - _true: kw("true", startsExpr), - _false: kw("false", startsExpr), - _in: kw("in", {beforeExpr: true, binop: 7}), - _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}), - _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}), - _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}), - _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true}) - } - - // Matches a whole line break (where CRLF is considered a single - // line break). Used to count lines. - - var lineBreak = /\r\n?|\n|\u2028|\u2029/ - var lineBreakG = new RegExp(lineBreak.source, "g") - - function isNewLine(code) { - return code === 10 || code === 13 || code === 0x2028 || code == 0x2029 - } - - var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/ - - var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g - - function isArray(obj) { - return Object.prototype.toString.call(obj) === "[object Array]" - } - - // Checks if an object has a property. - - function has(obj, propName) { - return Object.prototype.hasOwnProperty.call(obj, propName) - } - - // These are used when `options.locations` is on, for the - // `startLoc` and `endLoc` properties. - - var Position = function Position(line, col) { - this.line = line - this.column = col - }; - - Position.prototype.offset = function offset (n) { - return new Position(this.line, this.column + n) - }; - - var SourceLocation = function SourceLocation(p, start, end) { - this.start = start - this.end = end - if (p.sourceFile !== null) this.source = p.sourceFile - }; - - // The `getLineInfo` function is mostly useful when the - // `locations` option is off (for performance reasons) and you - // want to find the line/column position for a given character - // offset. `input` should be the code string that the offset refers - // into. - - function getLineInfo(input, offset) { - for (var line = 1, cur = 0;;) { - lineBreakG.lastIndex = cur - var match = lineBreakG.exec(input) - if (match && match.index < offset) { - ++line - cur = match.index + match[0].length - } else { - return new Position(line, offset - cur) - } - } - } - - // A second optional argument can be given to further configure - // the parser process. These options are recognized: - - var defaultOptions = { - // `ecmaVersion` indicates the ECMAScript version to parse. Must - // be either 3, or 5, or 6. This influences support for strict - // mode, the set of reserved words, support for getters and - // setters and other features. The default is 6. - ecmaVersion: 6, - // Source type ("script" or "module") for different semantics - sourceType: "script", - // `onInsertedSemicolon` can be a callback that will be called - // when a semicolon is automatically inserted. It will be passed - // th position of the comma as an offset, and if `locations` is - // enabled, it is given the location as a `{line, column}` object - // as second argument. - onInsertedSemicolon: null, - // `onTrailingComma` is similar to `onInsertedSemicolon`, but for - // trailing commas. - onTrailingComma: null, - // By default, reserved words are only enforced if ecmaVersion >= 5. - // Set `allowReserved` to a boolean value to explicitly turn this on - // an off. When this option has the value "never", reserved words - // and keywords can also not be used as property names. - allowReserved: null, - // When enabled, a return at the top level is not considered an - // error. - allowReturnOutsideFunction: false, - // When enabled, import/export statements are not constrained to - // appearing at the top of the program. - allowImportExportEverywhere: false, - // When enabled, hashbang directive in the beginning of file - // is allowed and treated as a line comment. - allowHashBang: false, - // When `locations` is on, `loc` properties holding objects with - // `start` and `end` properties in `{line, column}` form (with - // line being 1-based and column 0-based) will be attached to the - // nodes. - locations: false, - // A function can be passed as `onToken` option, which will - // cause Acorn to call that function with object in the same - // format as tokens returned from `tokenizer().getToken()`. Note - // that you are not allowed to call the parser from the - // callback—that will corrupt its internal state. - onToken: null, - // A function can be passed as `onComment` option, which will - // cause Acorn to call that function with `(block, text, start, - // end)` parameters whenever a comment is skipped. `block` is a - // boolean indicating whether this is a block (`/* */`) comment, - // `text` is the content of the comment, and `start` and `end` are - // character offsets that denote the start and end of the comment. - // When the `locations` option is on, two more parameters are - // passed, the full `{line, column}` locations of the start and - // end of the comments. Note that you are not allowed to call the - // parser from the callback—that will corrupt its internal state. - onComment: null, - // Nodes have their start and end characters offsets recorded in - // `start` and `end` properties (directly on the node, rather than - // the `loc` object, which holds line/column data. To also add a - // [semi-standardized][range] `range` property holding a `[start, - // end]` array with the same numbers, set the `ranges` option to - // `true`. - // - // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 - ranges: false, - // It is possible to parse multiple files into a single AST by - // passing the tree produced by parsing the first file as - // `program` option in subsequent parses. This will add the - // toplevel forms of the parsed file to the `Program` (top) node - // of an existing parse tree. - program: null, - // When `locations` is on, you can pass this to record the source - // file in every node's `loc` object. - sourceFile: null, - // This value, if given, is stored in every node, whether - // `locations` is on or off. - directSourceFile: null, - // When enabled, parenthesized expressions are represented by - // (non-standard) ParenthesizedExpression nodes - preserveParens: false, - plugins: {} - } - - // Interpret and default an options object - - function getOptions(opts) { - var options = {} - for (var opt in defaultOptions) - options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt] - if (options.allowReserved == null) - options.allowReserved = options.ecmaVersion < 5 - - if (isArray(options.onToken)) { - var tokens = options.onToken - options.onToken = function (token) { return tokens.push(token); } - } - if (isArray(options.onComment)) - options.onComment = pushComment(options, options.onComment) - - return options - } - - function pushComment(options, array) { - return function (block, text, start, end, startLoc, endLoc) { - var comment = { - type: block ? 'Block' : 'Line', - value: text, - start: start, - end: end - } - if (options.locations) - comment.loc = new SourceLocation(this, startLoc, endLoc) - if (options.ranges) - comment.range = [start, end] - array.push(comment) - } - } - - // Registered plugins - var plugins = {} - - function keywordRegexp(words) { - return new RegExp("^(" + words.replace(/ /g, "|") + ")$") - } - - var Parser = function Parser(options, input, startPos) { - this.options = options = getOptions(options) - this.sourceFile = options.sourceFile - this.keywords = keywordRegexp(keywords[options.ecmaVersion >= 6 ? 6 : 5]) - var reserved = options.allowReserved ? "" : - reservedWords[options.ecmaVersion] + (options.sourceType == "module" ? " await" : "") - this.reservedWords = keywordRegexp(reserved) - var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict - this.reservedWordsStrict = keywordRegexp(reservedStrict) - this.reservedWordsStrictBind = keywordRegexp(reservedStrict + " " + reservedWords.strictBind) - this.input = String(input) - - // Used to signal to callers of `readWord1` whether the word - // contained any escape sequences. This is needed because words with - // escape sequences must not be interpreted as keywords. - this.containsEsc = false - - // Load plugins - this.loadPlugins(options.plugins) - - // Set up token state - - // The current position of the tokenizer in the input. - if (startPos) { - this.pos = startPos - this.lineStart = Math.max(0, this.input.lastIndexOf("\n", startPos)) - this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length - } else { - this.pos = this.lineStart = 0 - this.curLine = 1 - } - - // Properties of the current token: - // Its type - this.type = tt.eof - // For tokens that include more information than their type, the value - this.value = null - // Its start and end offset - this.start = this.end = this.pos - // And, if locations are used, the {line, column} object - // corresponding to those offsets - this.startLoc = this.endLoc = this.curPosition() - - // Position information for the previous token - this.lastTokEndLoc = this.lastTokStartLoc = null - this.lastTokStart = this.lastTokEnd = this.pos - - // The context stack is used to superficially track syntactic - // context to predict whether a regular expression is allowed in a - // given position. - this.context = this.initialContext() - this.exprAllowed = true - - // Figure out if it's a module code. - this.strict = this.inModule = options.sourceType === "module" - - // Used to signify the start of a potential arrow function - this.potentialArrowAt = -1 - - // Flags to track whether we are in a function, a generator. - this.inFunction = this.inGenerator = false - // Labels in scope. - this.labels = [] - - // If enabled, skip leading hashbang line. - if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === '#!') - this.skipLineComment(2) - }; - - // DEPRECATED Kept for backwards compatibility until 3.0 in case a plugin uses them - Parser.prototype.isKeyword = function isKeyword (word) { return this.keywords.test(word) }; - Parser.prototype.isReservedWord = function isReservedWord (word) { return this.reservedWords.test(word) }; - - Parser.prototype.extend = function extend (name, f) { - this[name] = f(this[name]) - }; - - Parser.prototype.loadPlugins = function loadPlugins (pluginConfigs) { - var this$1 = this; - - for (var name in pluginConfigs) { - var plugin = plugins[name] - if (!plugin) throw new Error("Plugin '" + name + "' not found") - plugin(this$1, pluginConfigs[name]) - } - }; - - Parser.prototype.parse = function parse () { - var node = this.options.program || this.startNode() - this.nextToken() - return this.parseTopLevel(node) - }; - - var pp = Parser.prototype - - // ## Parser utilities - - // Test whether a statement node is the string literal `"use strict"`. - - pp.isUseStrict = function(stmt) { - return this.options.ecmaVersion >= 5 && stmt.type === "ExpressionStatement" && - stmt.expression.type === "Literal" && - stmt.expression.raw.slice(1, -1) === "use strict" - } - - // Predicate that tests whether the next token is of the given - // type, and if yes, consumes it as a side effect. - - pp.eat = function(type) { - if (this.type === type) { - this.next() - return true - } else { - return false - } - } - - // Tests whether parsed token is a contextual keyword. - - pp.isContextual = function(name) { - return this.type === tt.name && this.value === name - } - - // Consumes contextual keyword if possible. - - pp.eatContextual = function(name) { - return this.value === name && this.eat(tt.name) - } - - // Asserts that following token is given contextual keyword. - - pp.expectContextual = function(name) { - if (!this.eatContextual(name)) this.unexpected() - } - - // Test whether a semicolon can be inserted at the current position. - - pp.canInsertSemicolon = function() { - return this.type === tt.eof || - this.type === tt.braceR || - lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) - } - - pp.insertSemicolon = function() { - if (this.canInsertSemicolon()) { - if (this.options.onInsertedSemicolon) - this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc) - return true - } - } - - // Consume a semicolon, or, failing that, see if we are allowed to - // pretend that there is a semicolon at this position. - - pp.semicolon = function() { - if (!this.eat(tt.semi) && !this.insertSemicolon()) this.unexpected() - } - - pp.afterTrailingComma = function(tokType) { - if (this.type == tokType) { - if (this.options.onTrailingComma) - this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc) - this.next() - return true - } - } - - // Expect a token of a given type. If found, consume it, otherwise, - // raise an unexpected token error. - - pp.expect = function(type) { - this.eat(type) || this.unexpected() - } - - // Raise an unexpected token error. - - pp.unexpected = function(pos) { - this.raise(pos != null ? pos : this.start, "Unexpected token") - } - - var DestructuringErrors = function DestructuringErrors() { - this.shorthandAssign = 0 - this.trailingComma = 0 - }; - - pp.checkPatternErrors = function(refDestructuringErrors, andThrow) { - var trailing = refDestructuringErrors && refDestructuringErrors.trailingComma - if (!andThrow) return !!trailing - if (trailing) this.raise(trailing, "Comma is not permitted after the rest element") - } - - pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) { - var pos = refDestructuringErrors && refDestructuringErrors.shorthandAssign - if (!andThrow) return !!pos - if (pos) this.raise(pos, "Shorthand property assignments are valid only in destructuring patterns") - } - - var pp$1 = Parser.prototype - - // ### Statement parsing - - // Parse a program. Initializes the parser, reads any number of - // statements, and wraps them in a Program node. Optionally takes a - // `program` argument. If present, the statements will be appended - // to its body instead of creating a new node. - - pp$1.parseTopLevel = function(node) { - var this$1 = this; - - var first = true - if (!node.body) node.body = [] - while (this.type !== tt.eof) { - var stmt = this$1.parseStatement(true, true) - node.body.push(stmt) - if (first) { - if (this$1.isUseStrict(stmt)) this$1.setStrict(true) - first = false - } - } - this.next() - if (this.options.ecmaVersion >= 6) { - node.sourceType = this.options.sourceType - } - return this.finishNode(node, "Program") - } - - var loopLabel = {kind: "loop"}; - var switchLabel = {kind: "switch"}; - pp$1.isLet = function() { - if (this.type !== tt.name || this.options.ecmaVersion < 6 || this.value != "let") return false - skipWhiteSpace.lastIndex = this.pos - var skip = skipWhiteSpace.exec(this.input) - var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next) - if (nextCh === 91 || nextCh == 123) return true // '{' and '[' - if (isIdentifierStart(nextCh, true)) { - for (var pos = next + 1; isIdentifierChar(this.input.charCodeAt(pos), true); ++pos) {} - var ident = this.input.slice(next, pos) - if (!this.isKeyword(ident)) return true - } - return false - } - - // Parse a single statement. - // - // If expecting a statement and finding a slash operator, parse a - // regular expression literal. This is to handle cases like - // `if (foo) /blah/.exec(foo)`, where looking at the previous token - // does not help. - - pp$1.parseStatement = function(declaration, topLevel) { - var starttype = this.type, node = this.startNode(), kind - - if (this.isLet()) { - starttype = tt._var - kind = "let" - } - - // Most types of statements are recognized by the keyword they - // start with. Many are trivial to parse, some require a bit of - // complexity. - - switch (starttype) { - case tt._break: case tt._continue: return this.parseBreakContinueStatement(node, starttype.keyword) - case tt._debugger: return this.parseDebuggerStatement(node) - case tt._do: return this.parseDoStatement(node) - case tt._for: return this.parseForStatement(node) - case tt._function: - if (!declaration && this.options.ecmaVersion >= 6) this.unexpected() - return this.parseFunctionStatement(node) - case tt._class: - if (!declaration) this.unexpected() - return this.parseClass(node, true) - case tt._if: return this.parseIfStatement(node) - case tt._return: return this.parseReturnStatement(node) - case tt._switch: return this.parseSwitchStatement(node) - case tt._throw: return this.parseThrowStatement(node) - case tt._try: return this.parseTryStatement(node) - case tt._const: case tt._var: - kind = kind || this.value - if (!declaration && kind != "var") this.unexpected() - return this.parseVarStatement(node, kind) - case tt._while: return this.parseWhileStatement(node) - case tt._with: return this.parseWithStatement(node) - case tt.braceL: return this.parseBlock() - case tt.semi: return this.parseEmptyStatement(node) - case tt._export: - case tt._import: - if (!this.options.allowImportExportEverywhere) { - if (!topLevel) - this.raise(this.start, "'import' and 'export' may only appear at the top level") - if (!this.inModule) - this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'") - } - return starttype === tt._import ? this.parseImport(node) : this.parseExport(node) - - // If the statement does not start with a statement keyword or a - // brace, it's an ExpressionStatement or LabeledStatement. We - // simply start parsing an expression, and afterwards, if the - // next token is a colon and the expression was a simple - // Identifier node, we switch to interpreting it as a label. - default: - var maybeName = this.value, expr = this.parseExpression() - if (starttype === tt.name && expr.type === "Identifier" && this.eat(tt.colon)) - return this.parseLabeledStatement(node, maybeName, expr) - else return this.parseExpressionStatement(node, expr) - } - } - - pp$1.parseBreakContinueStatement = function(node, keyword) { - var this$1 = this; - - var isBreak = keyword == "break" - this.next() - if (this.eat(tt.semi) || this.insertSemicolon()) node.label = null - else if (this.type !== tt.name) this.unexpected() - else { - node.label = this.parseIdent() - this.semicolon() - } - - // Verify that there is an actual destination to break or - // continue to. - for (var i = 0; i < this.labels.length; ++i) { - var lab = this$1.labels[i] - if (node.label == null || lab.name === node.label.name) { - if (lab.kind != null && (isBreak || lab.kind === "loop")) break - if (node.label && isBreak) break - } - } - if (i === this.labels.length) this.raise(node.start, "Unsyntactic " + keyword) - return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") - } - - pp$1.parseDebuggerStatement = function(node) { - this.next() - this.semicolon() - return this.finishNode(node, "DebuggerStatement") - } - - pp$1.parseDoStatement = function(node) { - this.next() - this.labels.push(loopLabel) - node.body = this.parseStatement(false) - this.labels.pop() - this.expect(tt._while) - node.test = this.parseParenExpression() - if (this.options.ecmaVersion >= 6) - this.eat(tt.semi) - else - this.semicolon() - return this.finishNode(node, "DoWhileStatement") - } - - // Disambiguating between a `for` and a `for`/`in` or `for`/`of` - // loop is non-trivial. Basically, we have to parse the init `var` - // statement or expression, disallowing the `in` operator (see - // the second parameter to `parseExpression`), and then check - // whether the next token is `in` or `of`. When there is no init - // part (semicolon immediately after the opening parenthesis), it - // is a regular `for` loop. - - pp$1.parseForStatement = function(node) { - this.next() - this.labels.push(loopLabel) - this.expect(tt.parenL) - if (this.type === tt.semi) return this.parseFor(node, null) - var isLet = this.isLet() - if (this.type === tt._var || this.type === tt._const || isLet) { - var init$1 = this.startNode(), kind = isLet ? "let" : this.value - this.next() - this.parseVar(init$1, true, kind) - this.finishNode(init$1, "VariableDeclaration") - if ((this.type === tt._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1 && - !(kind !== "var" && init$1.declarations[0].init)) - return this.parseForIn(node, init$1) - return this.parseFor(node, init$1) - } - var refDestructuringErrors = new DestructuringErrors - var init = this.parseExpression(true, refDestructuringErrors) - if (this.type === tt._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) { - this.checkPatternErrors(refDestructuringErrors, true) - this.toAssignable(init) - this.checkLVal(init) - return this.parseForIn(node, init) - } else { - this.checkExpressionErrors(refDestructuringErrors, true) - } - return this.parseFor(node, init) - } - - pp$1.parseFunctionStatement = function(node) { - this.next() - return this.parseFunction(node, true) - } - - pp$1.parseIfStatement = function(node) { - this.next() - node.test = this.parseParenExpression() - node.consequent = this.parseStatement(false) - node.alternate = this.eat(tt._else) ? this.parseStatement(false) : null - return this.finishNode(node, "IfStatement") - } - - pp$1.parseReturnStatement = function(node) { - if (!this.inFunction && !this.options.allowReturnOutsideFunction) - this.raise(this.start, "'return' outside of function") - this.next() - - // In `return` (and `break`/`continue`), the keywords with - // optional arguments, we eagerly look for a semicolon or the - // possibility to insert one. - - if (this.eat(tt.semi) || this.insertSemicolon()) node.argument = null - else { node.argument = this.parseExpression(); this.semicolon() } - return this.finishNode(node, "ReturnStatement") - } - - pp$1.parseSwitchStatement = function(node) { - var this$1 = this; - - this.next() - node.discriminant = this.parseParenExpression() - node.cases = [] - this.expect(tt.braceL) - this.labels.push(switchLabel) - - // Statements under must be grouped (by label) in SwitchCase - // nodes. `cur` is used to keep the node that we are currently - // adding statements to. - - for (var cur, sawDefault = false; this.type != tt.braceR;) { - if (this$1.type === tt._case || this$1.type === tt._default) { - var isCase = this$1.type === tt._case - if (cur) this$1.finishNode(cur, "SwitchCase") - node.cases.push(cur = this$1.startNode()) - cur.consequent = [] - this$1.next() - if (isCase) { - cur.test = this$1.parseExpression() - } else { - if (sawDefault) this$1.raiseRecoverable(this$1.lastTokStart, "Multiple default clauses") - sawDefault = true - cur.test = null - } - this$1.expect(tt.colon) - } else { - if (!cur) this$1.unexpected() - cur.consequent.push(this$1.parseStatement(true)) - } - } - if (cur) this.finishNode(cur, "SwitchCase") - this.next() // Closing brace - this.labels.pop() - return this.finishNode(node, "SwitchStatement") - } - - pp$1.parseThrowStatement = function(node) { - this.next() - if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) - this.raise(this.lastTokEnd, "Illegal newline after throw") - node.argument = this.parseExpression() - this.semicolon() - return this.finishNode(node, "ThrowStatement") - } - - // Reused empty array added for node fields that are always empty. - - var empty = [] - - pp$1.parseTryStatement = function(node) { - this.next() - node.block = this.parseBlock() - node.handler = null - if (this.type === tt._catch) { - var clause = this.startNode() - this.next() - this.expect(tt.parenL) - clause.param = this.parseBindingAtom() - this.checkLVal(clause.param, true) - this.expect(tt.parenR) - clause.body = this.parseBlock() - node.handler = this.finishNode(clause, "CatchClause") - } - node.finalizer = this.eat(tt._finally) ? this.parseBlock() : null - if (!node.handler && !node.finalizer) - this.raise(node.start, "Missing catch or finally clause") - return this.finishNode(node, "TryStatement") - } - - pp$1.parseVarStatement = function(node, kind) { - this.next() - this.parseVar(node, false, kind) - this.semicolon() - return this.finishNode(node, "VariableDeclaration") - } - - pp$1.parseWhileStatement = function(node) { - this.next() - node.test = this.parseParenExpression() - this.labels.push(loopLabel) - node.body = this.parseStatement(false) - this.labels.pop() - return this.finishNode(node, "WhileStatement") - } - - pp$1.parseWithStatement = function(node) { - if (this.strict) this.raise(this.start, "'with' in strict mode") - this.next() - node.object = this.parseParenExpression() - node.body = this.parseStatement(false) - return this.finishNode(node, "WithStatement") - } - - pp$1.parseEmptyStatement = function(node) { - this.next() - return this.finishNode(node, "EmptyStatement") - } - - pp$1.parseLabeledStatement = function(node, maybeName, expr) { - var this$1 = this; - - for (var i = 0; i < this.labels.length; ++i) - if (this$1.labels[i].name === maybeName) this$1.raise(expr.start, "Label '" + maybeName + "' is already declared") - var kind = this.type.isLoop ? "loop" : this.type === tt._switch ? "switch" : null - for (var i$1 = this.labels.length - 1; i$1 >= 0; i$1--) { - var label = this$1.labels[i$1] - if (label.statementStart == node.start) { - label.statementStart = this$1.start - label.kind = kind - } else break - } - this.labels.push({name: maybeName, kind: kind, statementStart: this.start}) - node.body = this.parseStatement(true) - this.labels.pop() - node.label = expr - return this.finishNode(node, "LabeledStatement") - } - - pp$1.parseExpressionStatement = function(node, expr) { - node.expression = expr - this.semicolon() - return this.finishNode(node, "ExpressionStatement") - } - - // Parse a semicolon-enclosed block of statements, handling `"use - // strict"` declarations when `allowStrict` is true (used for - // function bodies). - - pp$1.parseBlock = function(allowStrict) { - var this$1 = this; - - var node = this.startNode(), first = true, oldStrict - node.body = [] - this.expect(tt.braceL) - while (!this.eat(tt.braceR)) { - var stmt = this$1.parseStatement(true) - node.body.push(stmt) - if (first && allowStrict && this$1.isUseStrict(stmt)) { - oldStrict = this$1.strict - this$1.setStrict(this$1.strict = true) - } - first = false - } - if (oldStrict === false) this.setStrict(false) - return this.finishNode(node, "BlockStatement") - } - - // Parse a regular `for` loop. The disambiguation code in - // `parseStatement` will already have parsed the init statement or - // expression. - - pp$1.parseFor = function(node, init) { - node.init = init - this.expect(tt.semi) - node.test = this.type === tt.semi ? null : this.parseExpression() - this.expect(tt.semi) - node.update = this.type === tt.parenR ? null : this.parseExpression() - this.expect(tt.parenR) - node.body = this.parseStatement(false) - this.labels.pop() - return this.finishNode(node, "ForStatement") - } - - // Parse a `for`/`in` and `for`/`of` loop, which are almost - // same from parser's perspective. - - pp$1.parseForIn = function(node, init) { - var type = this.type === tt._in ? "ForInStatement" : "ForOfStatement" - this.next() - node.left = init - node.right = this.parseExpression() - this.expect(tt.parenR) - node.body = this.parseStatement(false) - this.labels.pop() - return this.finishNode(node, type) - } - - // Parse a list of variable declarations. - - pp$1.parseVar = function(node, isFor, kind) { - var this$1 = this; - - node.declarations = [] - node.kind = kind - for (;;) { - var decl = this$1.startNode() - this$1.parseVarId(decl) - if (this$1.eat(tt.eq)) { - decl.init = this$1.parseMaybeAssign(isFor) - } else if (kind === "const" && !(this$1.type === tt._in || (this$1.options.ecmaVersion >= 6 && this$1.isContextual("of")))) { - this$1.unexpected() - } else if (decl.id.type != "Identifier" && !(isFor && (this$1.type === tt._in || this$1.isContextual("of")))) { - this$1.raise(this$1.lastTokEnd, "Complex binding patterns require an initialization value") - } else { - decl.init = null - } - node.declarations.push(this$1.finishNode(decl, "VariableDeclarator")) - if (!this$1.eat(tt.comma)) break - } - return node - } - - pp$1.parseVarId = function(decl) { - decl.id = this.parseBindingAtom() - this.checkLVal(decl.id, true) - } - - // Parse a function declaration or literal (depending on the - // `isStatement` parameter). - - pp$1.parseFunction = function(node, isStatement, allowExpressionBody) { - this.initFunction(node) - if (this.options.ecmaVersion >= 6) - node.generator = this.eat(tt.star) - var oldInGen = this.inGenerator - this.inGenerator = node.generator - if (isStatement || this.type === tt.name) - node.id = this.parseIdent() - this.parseFunctionParams(node) - this.parseFunctionBody(node, allowExpressionBody) - this.inGenerator = oldInGen - return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression") - } - - pp$1.parseFunctionParams = function(node) { - this.expect(tt.parenL) - node.params = this.parseBindingList(tt.parenR, false, false, true) - } - - // Parse a class declaration or literal (depending on the - // `isStatement` parameter). - - pp$1.parseClass = function(node, isStatement) { - var this$1 = this; - - this.next() - this.parseClassId(node, isStatement) - this.parseClassSuper(node) - var classBody = this.startNode() - var hadConstructor = false - classBody.body = [] - this.expect(tt.braceL) - while (!this.eat(tt.braceR)) { - if (this$1.eat(tt.semi)) continue - var method = this$1.startNode() - var isGenerator = this$1.eat(tt.star) - var isMaybeStatic = this$1.type === tt.name && this$1.value === "static" - this$1.parsePropertyName(method) - method.static = isMaybeStatic && this$1.type !== tt.parenL - if (method.static) { - if (isGenerator) this$1.unexpected() - isGenerator = this$1.eat(tt.star) - this$1.parsePropertyName(method) - } - method.kind = "method" - var isGetSet = false - if (!method.computed) { - var key = method.key; - if (!isGenerator && key.type === "Identifier" && this$1.type !== tt.parenL && (key.name === "get" || key.name === "set")) { - isGetSet = true - method.kind = key.name - key = this$1.parsePropertyName(method) - } - if (!method.static && (key.type === "Identifier" && key.name === "constructor" || - key.type === "Literal" && key.value === "constructor")) { - if (hadConstructor) this$1.raise(key.start, "Duplicate constructor in the same class") - if (isGetSet) this$1.raise(key.start, "Constructor can't have get/set modifier") - if (isGenerator) this$1.raise(key.start, "Constructor can't be a generator") - method.kind = "constructor" - hadConstructor = true - } - } - this$1.parseClassMethod(classBody, method, isGenerator) - if (isGetSet) { - var paramCount = method.kind === "get" ? 0 : 1 - if (method.value.params.length !== paramCount) { - var start = method.value.start - if (method.kind === "get") - this$1.raiseRecoverable(start, "getter should have no params") - else - this$1.raiseRecoverable(start, "setter should have exactly one param") - } - if (method.kind === "set" && method.value.params[0].type === "RestElement") - this$1.raise(method.value.params[0].start, "Setter cannot use rest params") - } - } - node.body = this.finishNode(classBody, "ClassBody") - return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") - } - - pp$1.parseClassMethod = function(classBody, method, isGenerator) { - method.value = this.parseMethod(isGenerator) - classBody.body.push(this.finishNode(method, "MethodDefinition")) - } - - pp$1.parseClassId = function(node, isStatement) { - node.id = this.type === tt.name ? this.parseIdent() : isStatement ? this.unexpected() : null - } - - pp$1.parseClassSuper = function(node) { - node.superClass = this.eat(tt._extends) ? this.parseExprSubscripts() : null - } - - // Parses module export declaration. - - pp$1.parseExport = function(node) { - var this$1 = this; - - this.next() - // export * from '...' - if (this.eat(tt.star)) { - this.expectContextual("from") - node.source = this.type === tt.string ? this.parseExprAtom() : this.unexpected() - this.semicolon() - return this.finishNode(node, "ExportAllDeclaration") - } - if (this.eat(tt._default)) { // export default ... - var parens = this.type == tt.parenL - var expr = this.parseMaybeAssign() - var needsSemi = true - if (!parens && (expr.type == "FunctionExpression" || - expr.type == "ClassExpression")) { - needsSemi = false - if (expr.id) { - expr.type = expr.type == "FunctionExpression" - ? "FunctionDeclaration" - : "ClassDeclaration" - } - } - node.declaration = expr - if (needsSemi) this.semicolon() - return this.finishNode(node, "ExportDefaultDeclaration") - } - // export var|const|let|function|class ... - if (this.shouldParseExportStatement()) { - node.declaration = this.parseStatement(true) - node.specifiers = [] - node.source = null - } else { // export { x, y as z } [from '...'] - node.declaration = null - node.specifiers = this.parseExportSpecifiers() - if (this.eatContextual("from")) { - node.source = this.type === tt.string ? this.parseExprAtom() : this.unexpected() - } else { - // check for keywords used as local names - for (var i = 0; i < node.specifiers.length; i++) { - if (this$1.keywords.test(node.specifiers[i].local.name) || this$1.reservedWords.test(node.specifiers[i].local.name)) { - this$1.unexpected(node.specifiers[i].local.start) - } - } - - node.source = null - } - this.semicolon() - } - return this.finishNode(node, "ExportNamedDeclaration") - } - - pp$1.shouldParseExportStatement = function() { - return this.type.keyword || this.isLet() - } - - // Parses a comma-separated list of module exports. - - pp$1.parseExportSpecifiers = function() { - var this$1 = this; - - var nodes = [], first = true - // export { x, y as z } [from '...'] - this.expect(tt.braceL) - while (!this.eat(tt.braceR)) { - if (!first) { - this$1.expect(tt.comma) - if (this$1.afterTrailingComma(tt.braceR)) break - } else first = false - - var node = this$1.startNode() - node.local = this$1.parseIdent(this$1.type === tt._default) - node.exported = this$1.eatContextual("as") ? this$1.parseIdent(true) : node.local - nodes.push(this$1.finishNode(node, "ExportSpecifier")) - } - return nodes - } - - // Parses import declaration. - - pp$1.parseImport = function(node) { - this.next() - // import '...' - if (this.type === tt.string) { - node.specifiers = empty - node.source = this.parseExprAtom() - } else { - node.specifiers = this.parseImportSpecifiers() - this.expectContextual("from") - node.source = this.type === tt.string ? this.parseExprAtom() : this.unexpected() - } - this.semicolon() - return this.finishNode(node, "ImportDeclaration") - } - - // Parses a comma-separated list of module imports. - - pp$1.parseImportSpecifiers = function() { - var this$1 = this; - - var nodes = [], first = true - if (this.type === tt.name) { - // import defaultObj, { x, y as z } from '...' - var node = this.startNode() - node.local = this.parseIdent() - this.checkLVal(node.local, true) - nodes.push(this.finishNode(node, "ImportDefaultSpecifier")) - if (!this.eat(tt.comma)) return nodes - } - if (this.type === tt.star) { - var node$1 = this.startNode() - this.next() - this.expectContextual("as") - node$1.local = this.parseIdent() - this.checkLVal(node$1.local, true) - nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier")) - return nodes - } - this.expect(tt.braceL) - while (!this.eat(tt.braceR)) { - if (!first) { - this$1.expect(tt.comma) - if (this$1.afterTrailingComma(tt.braceR)) break - } else first = false - - var node$2 = this$1.startNode() - node$2.imported = this$1.parseIdent(true) - if (this$1.eatContextual("as")) { - node$2.local = this$1.parseIdent() - } else { - node$2.local = node$2.imported - if (this$1.isKeyword(node$2.local.name)) this$1.unexpected(node$2.local.start) - if (this$1.reservedWordsStrict.test(node$2.local.name)) this$1.raise(node$2.local.start, "The keyword '" + node$2.local.name + "' is reserved") - } - this$1.checkLVal(node$2.local, true) - nodes.push(this$1.finishNode(node$2, "ImportSpecifier")) - } - return nodes - } - - var pp$2 = Parser.prototype - - // Convert existing expression atom to assignable pattern - // if possible. - - pp$2.toAssignable = function(node, isBinding) { - var this$1 = this; - - if (this.options.ecmaVersion >= 6 && node) { - switch (node.type) { - case "Identifier": - case "ObjectPattern": - case "ArrayPattern": - break - - case "ObjectExpression": - node.type = "ObjectPattern" - for (var i = 0; i < node.properties.length; i++) { - var prop = node.properties[i] - if (prop.kind !== "init") this$1.raise(prop.key.start, "Object pattern can't contain getter or setter") - this$1.toAssignable(prop.value, isBinding) - } - break - - case "ArrayExpression": - node.type = "ArrayPattern" - this.toAssignableList(node.elements, isBinding) - break - - case "AssignmentExpression": - if (node.operator === "=") { - node.type = "AssignmentPattern" - delete node.operator - // falls through to AssignmentPattern - } else { - this.raise(node.left.end, "Only '=' operator can be used for specifying default value.") - break - } - - case "AssignmentPattern": - if (node.right.type === "YieldExpression") - this.raise(node.right.start, "Yield expression cannot be a default value") - break - - case "ParenthesizedExpression": - node.expression = this.toAssignable(node.expression, isBinding) - break - - case "MemberExpression": - if (!isBinding) break - - default: - this.raise(node.start, "Assigning to rvalue") - } - } - return node - } - - // Convert list of expression atoms to binding list. - - pp$2.toAssignableList = function(exprList, isBinding) { - var this$1 = this; - - var end = exprList.length - if (end) { - var last = exprList[end - 1] - if (last && last.type == "RestElement") { - --end - } else if (last && last.type == "SpreadElement") { - last.type = "RestElement" - var arg = last.argument - this.toAssignable(arg, isBinding) - if (arg.type !== "Identifier" && arg.type !== "MemberExpression" && arg.type !== "ArrayPattern") - this.unexpected(arg.start) - --end - } - - if (isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") - this.unexpected(last.argument.start) - } - for (var i = 0; i < end; i++) { - var elt = exprList[i] - if (elt) this$1.toAssignable(elt, isBinding) - } - return exprList - } - - // Parses spread element. - - pp$2.parseSpread = function(refDestructuringErrors) { - var node = this.startNode() - this.next() - node.argument = this.parseMaybeAssign(false, refDestructuringErrors) - return this.finishNode(node, "SpreadElement") - } - - pp$2.parseRest = function(allowNonIdent) { - var node = this.startNode() - this.next() - - // RestElement inside of a function parameter must be an identifier - if (allowNonIdent) node.argument = this.type === tt.name ? this.parseIdent() : this.unexpected() - else node.argument = this.type === tt.name || this.type === tt.bracketL ? this.parseBindingAtom() : this.unexpected() - - return this.finishNode(node, "RestElement") - } - - // Parses lvalue (assignable) atom. - - pp$2.parseBindingAtom = function() { - if (this.options.ecmaVersion < 6) return this.parseIdent() - switch (this.type) { - case tt.name: - return this.parseIdent() - - case tt.bracketL: - var node = this.startNode() - this.next() - node.elements = this.parseBindingList(tt.bracketR, true, true) - return this.finishNode(node, "ArrayPattern") - - case tt.braceL: - return this.parseObj(true) - - default: - this.unexpected() - } - } - - pp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma, allowNonIdent) { - var this$1 = this; - - var elts = [], first = true - while (!this.eat(close)) { - if (first) first = false - else this$1.expect(tt.comma) - if (allowEmpty && this$1.type === tt.comma) { - elts.push(null) - } else if (allowTrailingComma && this$1.afterTrailingComma(close)) { - break - } else if (this$1.type === tt.ellipsis) { - var rest = this$1.parseRest(allowNonIdent) - this$1.parseBindingListItem(rest) - elts.push(rest) - if (this$1.type === tt.comma) this$1.raise(this$1.start, "Comma is not permitted after the rest element") - this$1.expect(close) - break - } else { - var elem = this$1.parseMaybeDefault(this$1.start, this$1.startLoc) - this$1.parseBindingListItem(elem) - elts.push(elem) - } - } - return elts - } - - pp$2.parseBindingListItem = function(param) { - return param - } - - // Parses assignment pattern around given atom if possible. - - pp$2.parseMaybeDefault = function(startPos, startLoc, left) { - left = left || this.parseBindingAtom() - if (this.options.ecmaVersion < 6 || !this.eat(tt.eq)) return left - var node = this.startNodeAt(startPos, startLoc) - node.left = left - node.right = this.parseMaybeAssign() - return this.finishNode(node, "AssignmentPattern") - } - - // Verify that a node is an lval — something that can be assigned - // to. - - pp$2.checkLVal = function(expr, isBinding, checkClashes) { - var this$1 = this; - - switch (expr.type) { - case "Identifier": - if (this.strict && this.reservedWordsStrictBind.test(expr.name)) - this.raiseRecoverable(expr.start, (isBinding ? "Binding " : "Assigning to ") + expr.name + " in strict mode") - if (checkClashes) { - if (has(checkClashes, expr.name)) - this.raiseRecoverable(expr.start, "Argument name clash") - checkClashes[expr.name] = true - } - break - - case "MemberExpression": - if (isBinding) this.raiseRecoverable(expr.start, (isBinding ? "Binding" : "Assigning to") + " member expression") - break - - case "ObjectPattern": - for (var i = 0; i < expr.properties.length; i++) - this$1.checkLVal(expr.properties[i].value, isBinding, checkClashes) - break - - case "ArrayPattern": - for (var i$1 = 0; i$1 < expr.elements.length; i$1++) { - var elem = expr.elements[i$1] - if (elem) this$1.checkLVal(elem, isBinding, checkClashes) - } - break - - case "AssignmentPattern": - this.checkLVal(expr.left, isBinding, checkClashes) - break - - case "RestElement": - this.checkLVal(expr.argument, isBinding, checkClashes) - break - - case "ParenthesizedExpression": - this.checkLVal(expr.expression, isBinding, checkClashes) - break - - default: - this.raise(expr.start, (isBinding ? "Binding" : "Assigning to") + " rvalue") - } - } - - var pp$3 = Parser.prototype - - // Check if property name clashes with already added. - // Object/class getters and setters are not allowed to clash — - // either with each other or with an init property — and in - // strict mode, init properties are also not allowed to be repeated. - - pp$3.checkPropClash = function(prop, propHash) { - if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) - return - var key = prop.key; - var name - switch (key.type) { - case "Identifier": name = key.name; break - case "Literal": name = String(key.value); break - default: return - } - var kind = prop.kind; - if (this.options.ecmaVersion >= 6) { - if (name === "__proto__" && kind === "init") { - if (propHash.proto) this.raiseRecoverable(key.start, "Redefinition of __proto__ property") - propHash.proto = true - } - return - } - name = "$" + name - var other = propHash[name] - if (other) { - var isGetSet = kind !== "init" - if ((this.strict || isGetSet) && other[kind] || !(isGetSet ^ other.init)) - this.raiseRecoverable(key.start, "Redefinition of property") - } else { - other = propHash[name] = { - init: false, - get: false, - set: false - } - } - other[kind] = true - } - - // ### Expression parsing - - // These nest, from the most general expression type at the top to - // 'atomic', nondivisible expression types at the bottom. Most of - // the functions will simply let the function(s) below them parse, - // and, *if* the syntactic construct they handle is present, wrap - // the AST node that the inner parser gave them in another node. - - // Parse a full expression. The optional arguments are used to - // forbid the `in` operator (in for loops initalization expressions) - // and provide reference for storing '=' operator inside shorthand - // property assignment in contexts where both object expression - // and object pattern might appear (so it's possible to raise - // delayed syntax error at correct position). - - pp$3.parseExpression = function(noIn, refDestructuringErrors) { - var this$1 = this; - - var startPos = this.start, startLoc = this.startLoc - var expr = this.parseMaybeAssign(noIn, refDestructuringErrors) - if (this.type === tt.comma) { - var node = this.startNodeAt(startPos, startLoc) - node.expressions = [expr] - while (this.eat(tt.comma)) node.expressions.push(this$1.parseMaybeAssign(noIn, refDestructuringErrors)) - return this.finishNode(node, "SequenceExpression") - } - return expr - } - - // Parse an assignment expression. This includes applications of - // operators like `+=`. - - pp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) { - if (this.inGenerator && this.isContextual("yield")) return this.parseYield() - - var ownDestructuringErrors = false - if (!refDestructuringErrors) { - refDestructuringErrors = new DestructuringErrors - ownDestructuringErrors = true - } - var startPos = this.start, startLoc = this.startLoc - if (this.type == tt.parenL || this.type == tt.name) - this.potentialArrowAt = this.start - var left = this.parseMaybeConditional(noIn, refDestructuringErrors) - if (afterLeftParse) left = afterLeftParse.call(this, left, startPos, startLoc) - if (this.type.isAssign) { - this.checkPatternErrors(refDestructuringErrors, true) - if (!ownDestructuringErrors) DestructuringErrors.call(refDestructuringErrors) - var node = this.startNodeAt(startPos, startLoc) - node.operator = this.value - node.left = this.type === tt.eq ? this.toAssignable(left) : left - refDestructuringErrors.shorthandAssign = 0 // reset because shorthand default was used correctly - this.checkLVal(left) - this.next() - node.right = this.parseMaybeAssign(noIn) - return this.finishNode(node, "AssignmentExpression") - } else { - if (ownDestructuringErrors) this.checkExpressionErrors(refDestructuringErrors, true) - } - return left - } - - // Parse a ternary conditional (`?:`) operator. - - pp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) { - var startPos = this.start, startLoc = this.startLoc - var expr = this.parseExprOps(noIn, refDestructuringErrors) - if (this.checkExpressionErrors(refDestructuringErrors)) return expr - if (this.eat(tt.question)) { - var node = this.startNodeAt(startPos, startLoc) - node.test = expr - node.consequent = this.parseMaybeAssign() - this.expect(tt.colon) - node.alternate = this.parseMaybeAssign(noIn) - return this.finishNode(node, "ConditionalExpression") - } - return expr - } - - // Start the precedence parser. - - pp$3.parseExprOps = function(noIn, refDestructuringErrors) { - var startPos = this.start, startLoc = this.startLoc - var expr = this.parseMaybeUnary(refDestructuringErrors, false) - if (this.checkExpressionErrors(refDestructuringErrors)) return expr - return this.parseExprOp(expr, startPos, startLoc, -1, noIn) - } - - // Parse binary operators with the operator precedence parsing - // algorithm. `left` is the left-hand side of the operator. - // `minPrec` provides context that allows the function to stop and - // defer further parser to one of its callers when it encounters an - // operator that has a lower precedence than the set it is parsing. - - pp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) { - var prec = this.type.binop - if (prec != null && (!noIn || this.type !== tt._in)) { - if (prec > minPrec) { - var logical = this.type === tt.logicalOR || this.type === tt.logicalAND - var op = this.value - this.next() - var startPos = this.start, startLoc = this.startLoc - var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn) - var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical) - return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn) - } - } - return left - } - - pp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) { - var node = this.startNodeAt(startPos, startLoc) - node.left = left - node.operator = op - node.right = right - return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression") - } - - // Parse unary operators, both prefix and postfix. - - pp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) { - var this$1 = this; - - var startPos = this.start, startLoc = this.startLoc, expr - if (this.type.prefix) { - var node = this.startNode(), update = this.type === tt.incDec - node.operator = this.value - node.prefix = true - this.next() - node.argument = this.parseMaybeUnary(null, true) - this.checkExpressionErrors(refDestructuringErrors, true) - if (update) this.checkLVal(node.argument) - else if (this.strict && node.operator === "delete" && - node.argument.type === "Identifier") - this.raiseRecoverable(node.start, "Deleting local variable in strict mode") - else sawUnary = true - expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression") - } else { - expr = this.parseExprSubscripts(refDestructuringErrors) - if (this.checkExpressionErrors(refDestructuringErrors)) return expr - while (this.type.postfix && !this.canInsertSemicolon()) { - var node$1 = this$1.startNodeAt(startPos, startLoc) - node$1.operator = this$1.value - node$1.prefix = false - node$1.argument = expr - this$1.checkLVal(expr) - this$1.next() - expr = this$1.finishNode(node$1, "UpdateExpression") - } - } - - if (!sawUnary && this.eat(tt.starstar)) - return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false) - else - return expr - } - - // Parse call, dot, and `[]`-subscript expressions. - - pp$3.parseExprSubscripts = function(refDestructuringErrors) { - var startPos = this.start, startLoc = this.startLoc - var expr = this.parseExprAtom(refDestructuringErrors) - var skipArrowSubscripts = expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")" - if (this.checkExpressionErrors(refDestructuringErrors) || skipArrowSubscripts) return expr - return this.parseSubscripts(expr, startPos, startLoc) - } - - pp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) { - var this$1 = this; - - for (;;) { - if (this$1.eat(tt.dot)) { - var node = this$1.startNodeAt(startPos, startLoc) - node.object = base - node.property = this$1.parseIdent(true) - node.computed = false - base = this$1.finishNode(node, "MemberExpression") - } else if (this$1.eat(tt.bracketL)) { - var node$1 = this$1.startNodeAt(startPos, startLoc) - node$1.object = base - node$1.property = this$1.parseExpression() - node$1.computed = true - this$1.expect(tt.bracketR) - base = this$1.finishNode(node$1, "MemberExpression") - } else if (!noCalls && this$1.eat(tt.parenL)) { - var node$2 = this$1.startNodeAt(startPos, startLoc) - node$2.callee = base - node$2.arguments = this$1.parseExprList(tt.parenR, false) - base = this$1.finishNode(node$2, "CallExpression") - } else if (this$1.type === tt.backQuote) { - var node$3 = this$1.startNodeAt(startPos, startLoc) - node$3.tag = base - node$3.quasi = this$1.parseTemplate() - base = this$1.finishNode(node$3, "TaggedTemplateExpression") - } else { - return base - } - } - } - - // Parse an atomic expression — either a single token that is an - // expression, an expression started by a keyword like `function` or - // `new`, or an expression wrapped in punctuation like `()`, `[]`, - // or `{}`. - - pp$3.parseExprAtom = function(refDestructuringErrors) { - var node, canBeArrow = this.potentialArrowAt == this.start - switch (this.type) { - case tt._super: - if (!this.inFunction) - this.raise(this.start, "'super' outside of function or class") - - case tt._this: - var type = this.type === tt._this ? "ThisExpression" : "Super" - node = this.startNode() - this.next() - return this.finishNode(node, type) - - case tt.name: - var startPos = this.start, startLoc = this.startLoc - var id = this.parseIdent(this.type !== tt.name) - if (canBeArrow && !this.canInsertSemicolon() && this.eat(tt.arrow)) - return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id]) - return id - - case tt.regexp: - var value = this.value - node = this.parseLiteral(value.value) - node.regex = {pattern: value.pattern, flags: value.flags} - return node - - case tt.num: case tt.string: - return this.parseLiteral(this.value) - - case tt._null: case tt._true: case tt._false: - node = this.startNode() - node.value = this.type === tt._null ? null : this.type === tt._true - node.raw = this.type.keyword - this.next() - return this.finishNode(node, "Literal") - - case tt.parenL: - return this.parseParenAndDistinguishExpression(canBeArrow) - - case tt.bracketL: - node = this.startNode() - this.next() - node.elements = this.parseExprList(tt.bracketR, true, true, refDestructuringErrors) - return this.finishNode(node, "ArrayExpression") - - case tt.braceL: - return this.parseObj(false, refDestructuringErrors) - - case tt._function: - node = this.startNode() - this.next() - return this.parseFunction(node, false) - - case tt._class: - return this.parseClass(this.startNode(), false) - - case tt._new: - return this.parseNew() - - case tt.backQuote: - return this.parseTemplate() - - default: - this.unexpected() - } - } - - pp$3.parseLiteral = function(value) { - var node = this.startNode() - node.value = value - node.raw = this.input.slice(this.start, this.end) - this.next() - return this.finishNode(node, "Literal") - } - - pp$3.parseParenExpression = function() { - this.expect(tt.parenL) - var val = this.parseExpression() - this.expect(tt.parenR) - return val - } - - pp$3.parseParenAndDistinguishExpression = function(canBeArrow) { - var this$1 = this; - - var startPos = this.start, startLoc = this.startLoc, val - if (this.options.ecmaVersion >= 6) { - this.next() - - var innerStartPos = this.start, innerStartLoc = this.startLoc - var exprList = [], first = true - var refDestructuringErrors = new DestructuringErrors, spreadStart, innerParenStart - while (this.type !== tt.parenR) { - first ? first = false : this$1.expect(tt.comma) - if (this$1.type === tt.ellipsis) { - spreadStart = this$1.start - exprList.push(this$1.parseParenItem(this$1.parseRest())) - break - } else { - if (this$1.type === tt.parenL && !innerParenStart) { - innerParenStart = this$1.start - } - exprList.push(this$1.parseMaybeAssign(false, refDestructuringErrors, this$1.parseParenItem)) - } - } - var innerEndPos = this.start, innerEndLoc = this.startLoc - this.expect(tt.parenR) - - if (canBeArrow && !this.canInsertSemicolon() && this.eat(tt.arrow)) { - this.checkPatternErrors(refDestructuringErrors, true) - if (innerParenStart) this.unexpected(innerParenStart) - return this.parseParenArrowList(startPos, startLoc, exprList) - } - - if (!exprList.length) this.unexpected(this.lastTokStart) - if (spreadStart) this.unexpected(spreadStart) - this.checkExpressionErrors(refDestructuringErrors, true) - - if (exprList.length > 1) { - val = this.startNodeAt(innerStartPos, innerStartLoc) - val.expressions = exprList - this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc) - } else { - val = exprList[0] - } - } else { - val = this.parseParenExpression() - } - - if (this.options.preserveParens) { - var par = this.startNodeAt(startPos, startLoc) - par.expression = val - return this.finishNode(par, "ParenthesizedExpression") - } else { - return val - } - } - - pp$3.parseParenItem = function(item) { - return item - } - - pp$3.parseParenArrowList = function(startPos, startLoc, exprList) { - return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList) - } - - // New's precedence is slightly tricky. It must allow its argument to - // be a `[]` or dot subscript expression, but not a call — at least, - // not without wrapping it in parentheses. Thus, it uses the noCalls - // argument to parseSubscripts to prevent it from consuming the - // argument list. - - var empty$1 = [] - - pp$3.parseNew = function() { - var node = this.startNode() - var meta = this.parseIdent(true) - if (this.options.ecmaVersion >= 6 && this.eat(tt.dot)) { - node.meta = meta - node.property = this.parseIdent(true) - if (node.property.name !== "target") - this.raiseRecoverable(node.property.start, "The only valid meta property for new is new.target") - if (!this.inFunction) - this.raiseRecoverable(node.start, "new.target can only be used in functions") - return this.finishNode(node, "MetaProperty") - } - var startPos = this.start, startLoc = this.startLoc - node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true) - if (this.eat(tt.parenL)) node.arguments = this.parseExprList(tt.parenR, false) - else node.arguments = empty$1 - return this.finishNode(node, "NewExpression") - } - - // Parse template expression. - - pp$3.parseTemplateElement = function() { - var elem = this.startNode() - elem.value = { - raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, '\n'), - cooked: this.value - } - this.next() - elem.tail = this.type === tt.backQuote - return this.finishNode(elem, "TemplateElement") - } - - pp$3.parseTemplate = function() { - var this$1 = this; - - var node = this.startNode() - this.next() - node.expressions = [] - var curElt = this.parseTemplateElement() - node.quasis = [curElt] - while (!curElt.tail) { - this$1.expect(tt.dollarBraceL) - node.expressions.push(this$1.parseExpression()) - this$1.expect(tt.braceR) - node.quasis.push(curElt = this$1.parseTemplateElement()) - } - this.next() - return this.finishNode(node, "TemplateLiteral") - } - - // Parse an object literal or binding pattern. - - pp$3.parseObj = function(isPattern, refDestructuringErrors) { - var this$1 = this; - - var node = this.startNode(), first = true, propHash = {} - node.properties = [] - this.next() - while (!this.eat(tt.braceR)) { - if (!first) { - this$1.expect(tt.comma) - if (this$1.afterTrailingComma(tt.braceR)) break - } else first = false - - var prop = this$1.startNode(), isGenerator, startPos, startLoc - if (this$1.options.ecmaVersion >= 6) { - prop.method = false - prop.shorthand = false - if (isPattern || refDestructuringErrors) { - startPos = this$1.start - startLoc = this$1.startLoc - } - if (!isPattern) - isGenerator = this$1.eat(tt.star) - } - this$1.parsePropertyName(prop) - this$1.parsePropertyValue(prop, isPattern, isGenerator, startPos, startLoc, refDestructuringErrors) - this$1.checkPropClash(prop, propHash) - node.properties.push(this$1.finishNode(prop, "Property")) - } - return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression") - } - - pp$3.parsePropertyValue = function(prop, isPattern, isGenerator, startPos, startLoc, refDestructuringErrors) { - if (this.eat(tt.colon)) { - prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors) - prop.kind = "init" - } else if (this.options.ecmaVersion >= 6 && this.type === tt.parenL) { - if (isPattern) this.unexpected() - prop.kind = "init" - prop.method = true - prop.value = this.parseMethod(isGenerator) - } else if (this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && - (prop.key.name === "get" || prop.key.name === "set") && - (this.type != tt.comma && this.type != tt.braceR)) { - if (isGenerator || isPattern) this.unexpected() - prop.kind = prop.key.name - this.parsePropertyName(prop) - prop.value = this.parseMethod(false) - var paramCount = prop.kind === "get" ? 0 : 1 - if (prop.value.params.length !== paramCount) { - var start = prop.value.start - if (prop.kind === "get") - this.raiseRecoverable(start, "getter should have no params") - else - this.raiseRecoverable(start, "setter should have exactly one param") - } - if (prop.kind === "set" && prop.value.params[0].type === "RestElement") - this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params") - } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { - if (this.keywords.test(prop.key.name) || - (this.strict ? this.reservedWordsStrictBind : this.reservedWords).test(prop.key.name) || - (this.inGenerator && prop.key.name == "yield")) - this.raiseRecoverable(prop.key.start, "'" + prop.key.name + "' can not be used as shorthand property") - prop.kind = "init" - if (isPattern) { - prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key) - } else if (this.type === tt.eq && refDestructuringErrors) { - if (!refDestructuringErrors.shorthandAssign) - refDestructuringErrors.shorthandAssign = this.start - prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key) - } else { - prop.value = prop.key - } - prop.shorthand = true - } else this.unexpected() - } - - pp$3.parsePropertyName = function(prop) { - if (this.options.ecmaVersion >= 6) { - if (this.eat(tt.bracketL)) { - prop.computed = true - prop.key = this.parseMaybeAssign() - this.expect(tt.bracketR) - return prop.key - } else { - prop.computed = false - } - } - return prop.key = this.type === tt.num || this.type === tt.string ? this.parseExprAtom() : this.parseIdent(true) - } - - // Initialize empty function node. - - pp$3.initFunction = function(node) { - node.id = null - if (this.options.ecmaVersion >= 6) { - node.generator = false - node.expression = false - } - } - - // Parse object or class method. - - pp$3.parseMethod = function(isGenerator) { - var node = this.startNode(), oldInGen = this.inGenerator - this.inGenerator = isGenerator - this.initFunction(node) - this.expect(tt.parenL) - node.params = this.parseBindingList(tt.parenR, false, false) - if (this.options.ecmaVersion >= 6) - node.generator = isGenerator - this.parseFunctionBody(node, false) - this.inGenerator = oldInGen - return this.finishNode(node, "FunctionExpression") - } - - // Parse arrow function expression with given parameters. - - pp$3.parseArrowExpression = function(node, params) { - var oldInGen = this.inGenerator - this.inGenerator = false - this.initFunction(node) - node.params = this.toAssignableList(params, true) - this.parseFunctionBody(node, true) - this.inGenerator = oldInGen - return this.finishNode(node, "ArrowFunctionExpression") - } - - // Parse function body and check parameters. - - pp$3.parseFunctionBody = function(node, isArrowFunction) { - var isExpression = isArrowFunction && this.type !== tt.braceL - - if (isExpression) { - node.body = this.parseMaybeAssign() - node.expression = true - } else { - // Start a new scope with regard to labels and the `inFunction` - // flag (restore them to their old value afterwards). - var oldInFunc = this.inFunction, oldLabels = this.labels - this.inFunction = true; this.labels = [] - node.body = this.parseBlock(true) - node.expression = false - this.inFunction = oldInFunc; this.labels = oldLabels - } - - // If this is a strict mode function, verify that argument names - // are not repeated, and it does not try to bind the words `eval` - // or `arguments`. - var useStrict = (!isExpression && node.body.body.length && this.isUseStrict(node.body.body[0])) ? node.body.body[0] : null; - if (this.strict || useStrict) { - var oldStrict = this.strict - this.strict = true - if (node.id) - this.checkLVal(node.id, true) - this.checkParams(node, useStrict) - this.strict = oldStrict - } else if (isArrowFunction) { - this.checkParams(node, useStrict) - } - } - - // Checks function params for various disallowed patterns such as using "eval" - // or "arguments" and duplicate parameters. - - pp$3.checkParams = function(node, useStrict) { - var this$1 = this; - - var nameHash = {} - for (var i = 0; i < node.params.length; i++) { - if (useStrict && this$1.options.ecmaVersion >= 7 && node.params[i].type !== "Identifier") - this$1.raiseRecoverable(useStrict.start, "Illegal 'use strict' directive in function with non-simple parameter list"); - this$1.checkLVal(node.params[i], true, nameHash) - } - } - - // Parses a comma-separated list of expressions, and returns them as - // an array. `close` is the token type that ends the list, and - // `allowEmpty` can be turned on to allow subsequent commas with - // nothing in between them to be parsed as `null` (which is needed - // for array literals). - - pp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { - var this$1 = this; - - var elts = [], first = true - while (!this.eat(close)) { - if (!first) { - this$1.expect(tt.comma) - if (allowTrailingComma && this$1.afterTrailingComma(close)) break - } else first = false - - var elt - if (allowEmpty && this$1.type === tt.comma) - elt = null - else if (this$1.type === tt.ellipsis) { - elt = this$1.parseSpread(refDestructuringErrors) - if (this$1.type === tt.comma && refDestructuringErrors && !refDestructuringErrors.trailingComma) { - refDestructuringErrors.trailingComma = this$1.lastTokStart - } - } else - elt = this$1.parseMaybeAssign(false, refDestructuringErrors) - elts.push(elt) - } - return elts - } - - // Parse the next token as an identifier. If `liberal` is true (used - // when parsing properties), it will also convert keywords into - // identifiers. - - pp$3.parseIdent = function(liberal) { - var node = this.startNode() - if (liberal && this.options.allowReserved == "never") liberal = false - if (this.type === tt.name) { - if (!liberal && (this.strict ? this.reservedWordsStrict : this.reservedWords).test(this.value) && - (this.options.ecmaVersion >= 6 || - this.input.slice(this.start, this.end).indexOf("\\") == -1)) - this.raiseRecoverable(this.start, "The keyword '" + this.value + "' is reserved") - if (!liberal && this.inGenerator && this.value === "yield") - this.raiseRecoverable(this.start, "Can not use 'yield' as identifier inside a generator") - node.name = this.value - } else if (liberal && this.type.keyword) { - node.name = this.type.keyword - } else { - this.unexpected() - } - this.next() - return this.finishNode(node, "Identifier") - } - - // Parses yield expression inside generator. - - pp$3.parseYield = function() { - var node = this.startNode() - this.next() - if (this.type == tt.semi || this.canInsertSemicolon() || (this.type != tt.star && !this.type.startsExpr)) { - node.delegate = false - node.argument = null - } else { - node.delegate = this.eat(tt.star) - node.argument = this.parseMaybeAssign() - } - return this.finishNode(node, "YieldExpression") - } - - var pp$4 = Parser.prototype - - // This function is used to raise exceptions on parse errors. It - // takes an offset integer (into the current `input`) to indicate - // the location of the error, attaches the position to the end - // of the error message, and then raises a `SyntaxError` with that - // message. - - pp$4.raise = function(pos, message) { - var loc = getLineInfo(this.input, pos) - message += " (" + loc.line + ":" + loc.column + ")" - var err = new SyntaxError(message) - err.pos = pos; err.loc = loc; err.raisedAt = this.pos - throw err - } - - pp$4.raiseRecoverable = pp$4.raise - - pp$4.curPosition = function() { - if (this.options.locations) { - return new Position(this.curLine, this.pos - this.lineStart) - } - } - - var Node = function Node(parser, pos, loc) { - this.type = "" - this.start = pos - this.end = 0 - if (parser.options.locations) - this.loc = new SourceLocation(parser, loc) - if (parser.options.directSourceFile) - this.sourceFile = parser.options.directSourceFile - if (parser.options.ranges) - this.range = [pos, 0] - }; - - // Start an AST node, attaching a start offset. - - var pp$5 = Parser.prototype - - pp$5.startNode = function() { - return new Node(this, this.start, this.startLoc) - } - - pp$5.startNodeAt = function(pos, loc) { - return new Node(this, pos, loc) - } - - // Finish an AST node, adding `type` and `end` properties. - - function finishNodeAt(node, type, pos, loc) { - node.type = type - node.end = pos - if (this.options.locations) - node.loc.end = loc - if (this.options.ranges) - node.range[1] = pos - return node - } - - pp$5.finishNode = function(node, type) { - return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc) - } - - // Finish node at given position - - pp$5.finishNodeAt = function(node, type, pos, loc) { - return finishNodeAt.call(this, node, type, pos, loc) - } - - var TokContext = function TokContext(token, isExpr, preserveSpace, override) { - this.token = token - this.isExpr = !!isExpr - this.preserveSpace = !!preserveSpace - this.override = override - }; - - var types = { - b_stat: new TokContext("{", false), - b_expr: new TokContext("{", true), - b_tmpl: new TokContext("${", true), - p_stat: new TokContext("(", false), - p_expr: new TokContext("(", true), - q_tmpl: new TokContext("`", true, true, function (p) { return p.readTmplToken(); }), - f_expr: new TokContext("function", true) - } - - var pp$6 = Parser.prototype - - pp$6.initialContext = function() { - return [types.b_stat] - } - - pp$6.braceIsBlock = function(prevType) { - if (prevType === tt.colon) { - var parent = this.curContext() - if (parent === types.b_stat || parent === types.b_expr) - return !parent.isExpr - } - if (prevType === tt._return) - return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) - if (prevType === tt._else || prevType === tt.semi || prevType === tt.eof || prevType === tt.parenR) - return true - if (prevType == tt.braceL) - return this.curContext() === types.b_stat - return !this.exprAllowed - } - - pp$6.updateContext = function(prevType) { - var update, type = this.type - if (type.keyword && prevType == tt.dot) - this.exprAllowed = false - else if (update = type.updateContext) - update.call(this, prevType) - else - this.exprAllowed = type.beforeExpr - } - - // Token-specific context update code - - tt.parenR.updateContext = tt.braceR.updateContext = function() { - if (this.context.length == 1) { - this.exprAllowed = true - return - } - var out = this.context.pop() - if (out === types.b_stat && this.curContext() === types.f_expr) { - this.context.pop() - this.exprAllowed = false - } else if (out === types.b_tmpl) { - this.exprAllowed = true - } else { - this.exprAllowed = !out.isExpr - } - } - - tt.braceL.updateContext = function(prevType) { - this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr) - this.exprAllowed = true - } - - tt.dollarBraceL.updateContext = function() { - this.context.push(types.b_tmpl) - this.exprAllowed = true - } - - tt.parenL.updateContext = function(prevType) { - var statementParens = prevType === tt._if || prevType === tt._for || prevType === tt._with || prevType === tt._while - this.context.push(statementParens ? types.p_stat : types.p_expr) - this.exprAllowed = true - } - - tt.incDec.updateContext = function() { - // tokExprAllowed stays unchanged - } - - tt._function.updateContext = function(prevType) { - if (prevType.beforeExpr && prevType !== tt.semi && prevType !== tt._else && - !((prevType === tt.colon || prevType === tt.braceL) && this.curContext() === types.b_stat)) - this.context.push(types.f_expr) - this.exprAllowed = false - } - - tt.backQuote.updateContext = function() { - if (this.curContext() === types.q_tmpl) - this.context.pop() - else - this.context.push(types.q_tmpl) - this.exprAllowed = false - } - - // Object type used to represent tokens. Note that normally, tokens - // simply exist as properties on the parser object. This is only - // used for the onToken callback and the external tokenizer. - - var Token = function Token(p) { - this.type = p.type - this.value = p.value - this.start = p.start - this.end = p.end - if (p.options.locations) - this.loc = new SourceLocation(p, p.startLoc, p.endLoc) - if (p.options.ranges) - this.range = [p.start, p.end] - }; - - // ## Tokenizer - - var pp$7 = Parser.prototype - - // Are we running under Rhino? - var isRhino = typeof Packages == "object" && Object.prototype.toString.call(Packages) == "[object JavaPackage]" - - // Move to the next token - - pp$7.next = function() { - if (this.options.onToken) - this.options.onToken(new Token(this)) - - this.lastTokEnd = this.end - this.lastTokStart = this.start - this.lastTokEndLoc = this.endLoc - this.lastTokStartLoc = this.startLoc - this.nextToken() - } - - pp$7.getToken = function() { - this.next() - return new Token(this) - } - - // If we're in an ES6 environment, make parsers iterable - if (typeof Symbol !== "undefined") - pp$7[Symbol.iterator] = function () { - var self = this - return {next: function () { - var token = self.getToken() - return { - done: token.type === tt.eof, - value: token - } - }} - } - - // Toggle strict mode. Re-reads the next number or string to please - // pedantic tests (`"use strict"; 010;` should fail). - - pp$7.setStrict = function(strict) { - var this$1 = this; - - this.strict = strict - if (this.type !== tt.num && this.type !== tt.string) return - this.pos = this.start - if (this.options.locations) { - while (this.pos < this.lineStart) { - this$1.lineStart = this$1.input.lastIndexOf("\n", this$1.lineStart - 2) + 1 - --this$1.curLine - } - } - this.nextToken() - } - - pp$7.curContext = function() { - return this.context[this.context.length - 1] - } - - // Read a single token, updating the parser object's token-related - // properties. - - pp$7.nextToken = function() { - var curContext = this.curContext() - if (!curContext || !curContext.preserveSpace) this.skipSpace() - - this.start = this.pos - if (this.options.locations) this.startLoc = this.curPosition() - if (this.pos >= this.input.length) return this.finishToken(tt.eof) - - if (curContext.override) return curContext.override(this) - else this.readToken(this.fullCharCodeAtPos()) - } - - pp$7.readToken = function(code) { - // Identifier or keyword. '\uXXXX' sequences are allowed in - // identifiers, so '\' also dispatches to that. - if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */) - return this.readWord() - - return this.getTokenFromCode(code) - } - - pp$7.fullCharCodeAtPos = function() { - var code = this.input.charCodeAt(this.pos) - if (code <= 0xd7ff || code >= 0xe000) return code - var next = this.input.charCodeAt(this.pos + 1) - return (code << 10) + next - 0x35fdc00 - } - - pp$7.skipBlockComment = function() { - var this$1 = this; - - var startLoc = this.options.onComment && this.curPosition() - var start = this.pos, end = this.input.indexOf("*/", this.pos += 2) - if (end === -1) this.raise(this.pos - 2, "Unterminated comment") - this.pos = end + 2 - if (this.options.locations) { - lineBreakG.lastIndex = start - var match - while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) { - ++this$1.curLine - this$1.lineStart = match.index + match[0].length - } - } - if (this.options.onComment) - this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, - startLoc, this.curPosition()) - } - - pp$7.skipLineComment = function(startSkip) { - var this$1 = this; - - var start = this.pos - var startLoc = this.options.onComment && this.curPosition() - var ch = this.input.charCodeAt(this.pos+=startSkip) - while (this.pos < this.input.length && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) { - ++this$1.pos - ch = this$1.input.charCodeAt(this$1.pos) - } - if (this.options.onComment) - this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, - startLoc, this.curPosition()) - } - - // Called at the start of the parse and after every token. Skips - // whitespace and comments, and. - - pp$7.skipSpace = function() { - var this$1 = this; - - loop: while (this.pos < this.input.length) { - var ch = this$1.input.charCodeAt(this$1.pos) - switch (ch) { - case 32: case 160: // ' ' - ++this$1.pos - break - case 13: - if (this$1.input.charCodeAt(this$1.pos + 1) === 10) { - ++this$1.pos - } - case 10: case 8232: case 8233: - ++this$1.pos - if (this$1.options.locations) { - ++this$1.curLine - this$1.lineStart = this$1.pos - } - break - case 47: // '/' - switch (this$1.input.charCodeAt(this$1.pos + 1)) { - case 42: // '*' - this$1.skipBlockComment() - break - case 47: - this$1.skipLineComment(2) - break - default: - break loop - } - break - default: - if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { - ++this$1.pos - } else { - break loop - } - } - } - } - - // Called at the end of every token. Sets `end`, `val`, and - // maintains `context` and `exprAllowed`, and skips the space after - // the token, so that the next one's `start` will point at the - // right position. - - pp$7.finishToken = function(type, val) { - this.end = this.pos - if (this.options.locations) this.endLoc = this.curPosition() - var prevType = this.type - this.type = type - this.value = val - - this.updateContext(prevType) - } - - // ### Token reading - - // This is the function that is called to fetch the next token. It - // is somewhat obscure, because it works in character codes rather - // than characters, and because operator parsing has been inlined - // into it. - // - // All in the name of speed. - // - pp$7.readToken_dot = function() { - var next = this.input.charCodeAt(this.pos + 1) - if (next >= 48 && next <= 57) return this.readNumber(true) - var next2 = this.input.charCodeAt(this.pos + 2) - if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.' - this.pos += 3 - return this.finishToken(tt.ellipsis) - } else { - ++this.pos - return this.finishToken(tt.dot) - } - } - - pp$7.readToken_slash = function() { // '/' - var next = this.input.charCodeAt(this.pos + 1) - if (this.exprAllowed) {++this.pos; return this.readRegexp()} - if (next === 61) return this.finishOp(tt.assign, 2) - return this.finishOp(tt.slash, 1) - } - - pp$7.readToken_mult_modulo_exp = function(code) { // '%*' - var next = this.input.charCodeAt(this.pos + 1) - var size = 1 - var tokentype = code === 42 ? tt.star : tt.modulo - - // exponentiation operator ** and **= - if (this.options.ecmaVersion >= 7 && next === 42) { - ++size - tokentype = tt.starstar - next = this.input.charCodeAt(this.pos + 2) - } - - if (next === 61) return this.finishOp(tt.assign, size + 1) - return this.finishOp(tokentype, size) - } - - pp$7.readToken_pipe_amp = function(code) { // '|&' - var next = this.input.charCodeAt(this.pos + 1) - if (next === code) return this.finishOp(code === 124 ? tt.logicalOR : tt.logicalAND, 2) - if (next === 61) return this.finishOp(tt.assign, 2) - return this.finishOp(code === 124 ? tt.bitwiseOR : tt.bitwiseAND, 1) - } - - pp$7.readToken_caret = function() { // '^' - var next = this.input.charCodeAt(this.pos + 1) - if (next === 61) return this.finishOp(tt.assign, 2) - return this.finishOp(tt.bitwiseXOR, 1) - } - - pp$7.readToken_plus_min = function(code) { // '+-' - var next = this.input.charCodeAt(this.pos + 1) - if (next === code) { - if (next == 45 && this.input.charCodeAt(this.pos + 2) == 62 && - lineBreak.test(this.input.slice(this.lastTokEnd, this.pos))) { - // A `-->` line comment - this.skipLineComment(3) - this.skipSpace() - return this.nextToken() - } - return this.finishOp(tt.incDec, 2) - } - if (next === 61) return this.finishOp(tt.assign, 2) - return this.finishOp(tt.plusMin, 1) - } - - pp$7.readToken_lt_gt = function(code) { // '<>' - var next = this.input.charCodeAt(this.pos + 1) - var size = 1 - if (next === code) { - size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2 - if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(tt.assign, size + 1) - return this.finishOp(tt.bitShift, size) - } - if (next == 33 && code == 60 && this.input.charCodeAt(this.pos + 2) == 45 && - this.input.charCodeAt(this.pos + 3) == 45) { - if (this.inModule) this.unexpected() - // `` line comment - this.skipLineComment(3) - this.skipSpace() + this.skipLineComment(3); + this.skipSpace(); return this.nextToken() } - return this.finishOp(tt.incDec, 2) + return this.finishOp(types.incDec, 2) } - if (next === 61) return this.finishOp(tt.assign, 2) - return this.finishOp(tt.plusMin, 1) - } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) + }; - pp$7.readToken_lt_gt = function(code) { // '<>' - var next = this.input.charCodeAt(this.pos + 1) - var size = 1 + pp$9.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; if (next === code) { - size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2 - if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(tt.assign, size + 1) - return this.finishOp(tt.bitShift, size) + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) } - if (next == 33 && code == 60 && this.input.charCodeAt(this.pos + 2) == 45 && - this.input.charCodeAt(this.pos + 3) == 45) { - if (this.inModule) this.unexpected() + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { // ` + * ``` + * - Does not work when tags have different cases: + * ``` + *
        broken
        + * ``` + * - Does not work when cursor is inside a broken tag: + * ``` + *
        + * ``` + */ + function expandTagUnderCursor(cm, head, inclusive) { + var cur = head; + if (!CodeMirror.findMatchingTag || !CodeMirror.findEnclosingTag) { + return { start: cur, end: cur }; + } + + var tags = CodeMirror.findMatchingTag(cm, head) || CodeMirror.findEnclosingTag(cm, head); + if (!tags || !tags.open || !tags.close) { + return { start: cur, end: cur }; + } + + if (inclusive) { + return { start: tags.open.from, end: tags.close.to }; + } + return { start: tags.open.to, end: tags.close.from }; } function recordJumpPosition(cm, oldCur, newCur) { @@ -3170,7 +3518,7 @@ }, isComplete: function(state) { if (state.nextCh === '#') { - var token = state.lineText.match(/#(\w+)/)[1]; + var token = state.lineText.match(/^#(\w+)/)[1]; if (token === 'endif') { if (state.forward && state.depth === 0) { return true; @@ -3232,12 +3580,12 @@ } } if (state.nextCh || state.curMoveThrough) { - return Pos(line, state.index); + return new Pos(line, state.index); } return cur; } - /** + /* * Returns the boundaries of the next word. If the cursor in the middle of * the word, then returns the boundaries of the current word, starting at * the cursor. If the cursor is at the start/end of a word, and we are going @@ -3344,7 +3692,7 @@ break; } words.push(word); - cur = Pos(word.line, forward ? (word.to - 1) : word.from); + cur = new Pos(word.line, forward ? (word.to - 1) : word.from); } var shortCircuit = words.length != repeat; var firstWord = words[0]; @@ -3355,20 +3703,32 @@ // We did not start in the middle of a word. Discard the extra word at the end. lastWord = words.pop(); } - return Pos(lastWord.line, lastWord.from); + return new Pos(lastWord.line, lastWord.from); } else if (forward && wordEnd) { - return Pos(lastWord.line, lastWord.to - 1); + return new Pos(lastWord.line, lastWord.to - 1); } else if (!forward && wordEnd) { // ge if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { // We did not start in the middle of a word. Discard the extra word at the end. lastWord = words.pop(); } - return Pos(lastWord.line, lastWord.to); + return new Pos(lastWord.line, lastWord.to); } else { // b - return Pos(lastWord.line, lastWord.from); + return new Pos(lastWord.line, lastWord.from); + } + } + + function moveToEol(cm, head, motionArgs, vim, keepHPos) { + var cur = head; + var retval= new Pos(cur.line + motionArgs.repeat - 1, Infinity); + var end=cm.clipPos(retval); + end.ch--; + if (!keepHPos) { + vim.lastHPos = Infinity; + vim.lastHSPos = cm.charCoords(end,'div').left; } + return retval; } function moveToCharacter(cm, repeat, forward, character) { @@ -3383,14 +3743,14 @@ } start = idx; } - return Pos(cm.getCursor().line, idx); + return new Pos(cm.getCursor().line, idx); } function moveToColumn(cm, repeat) { // repeat is always >= 1, so repeat - 1 always corresponds // to the column we want to go to. var line = cm.getCursor().line; - return clipCursorToContent(cm, Pos(line, repeat - 1)); + return clipCursorToContent(cm, new Pos(line, repeat - 1)); } function updateMark(cm, vim, markName, pos) { @@ -3471,8 +3831,316 @@ start = new Pos(i, 0); return { start: start, end: end }; } + function getSentence(cm, cur, repeat, dir, inclusive /*includes whitespace*/) { + /* + Takes an index object + { + line: the line string, + ln: line number, + pos: index in line, + dir: direction of traversal (-1 or 1) + } + and modifies the pos member to represent the + next valid position or sets the line to null if there are + no more valid positions. + */ + function nextChar(curr) { + if (curr.pos + curr.dir < 0 || curr.pos + curr.dir >= curr.line.length) { + curr.line = null; + } + else { + curr.pos += curr.dir; + } + } + /* + Performs one iteration of traversal in forward direction + Returns an index object of the new location + */ + function forward(cm, ln, pos, dir) { + var line = cm.getLine(ln); + + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; - // TODO: perhaps this finagling of start and end positions belonds + if (curr.line === "") { + return { ln: curr.ln, pos: curr.pos }; + } + + var lastSentencePos = curr.pos; + + // Move one step to skip character we start on + nextChar(curr); + + while (curr.line !== null) { + lastSentencePos = curr.pos; + if (isEndOfSentenceSymbol(curr.line[curr.pos])) { + if (!inclusive) { + return { ln: curr.ln, pos: curr.pos + 1 }; + } else { + nextChar(curr); + while (curr.line !== null ) { + if (isWhiteSpaceString(curr.line[curr.pos])) { + lastSentencePos = curr.pos; + nextChar(curr); + } else { + break; + } + } + return { ln: curr.ln, pos: lastSentencePos + 1, }; + } + } + nextChar(curr); + } + return { ln: curr.ln, pos: lastSentencePos + 1 }; + } + + /* + Performs one iteration of traversal in reverse direction + Returns an index object of the new location + */ + function reverse(cm, ln, pos, dir) { + var line = cm.getLine(ln); + + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; + + if (curr.line === "") { + return { ln: curr.ln, pos: curr.pos }; + } + + var lastSentencePos = curr.pos; + + // Move one step to skip character we start on + nextChar(curr); + + while (curr.line !== null) { + if (!isWhiteSpaceString(curr.line[curr.pos]) && !isEndOfSentenceSymbol(curr.line[curr.pos])) { + lastSentencePos = curr.pos; + } + + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) ) { + if (!inclusive) { + return { ln: curr.ln, pos: lastSentencePos }; + } else { + if (isWhiteSpaceString(curr.line[curr.pos + 1])) { + return { ln: curr.ln, pos: curr.pos + 1, }; + } else { + return {ln: curr.ln, pos: lastSentencePos}; + } + } + } + + nextChar(curr); + } + curr.line = line; + if (inclusive && isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos }; + } else { + return { ln: curr.ln, pos: lastSentencePos }; + } + + } + + var curr_index = { + ln: cur.line, + pos: cur.ch, + }; + + while (repeat > 0) { + if (dir < 0) { + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); + } + else { + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + } + repeat--; + } + + return new Pos(curr_index.ln, curr_index.pos); + } + + function findSentence(cm, cur, repeat, dir) { + + /* + Takes an index object + { + line: the line string, + ln: line number, + pos: index in line, + dir: direction of traversal (-1 or 1) + } + and modifies the line, ln, and pos members to represent the + next valid position or sets them to null if there are + no more valid positions. + */ + function nextChar(cm, idx) { + if (idx.pos + idx.dir < 0 || idx.pos + idx.dir >= idx.line.length) { + idx.ln += idx.dir; + if (!isLine(cm, idx.ln)) { + idx.line = null; + idx.ln = null; + idx.pos = null; + return; + } + idx.line = cm.getLine(idx.ln); + idx.pos = (idx.dir > 0) ? 0 : idx.line.length - 1; + } + else { + idx.pos += idx.dir; + } + } + + /* + Performs one iteration of traversal in forward direction + Returns an index object of the new location + */ + function forward(cm, ln, pos, dir) { + var line = cm.getLine(ln); + var stop = (line === ""); + + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; + + var last_valid = { + ln: curr.ln, + pos: curr.pos, + }; + + var skip_empty_lines = (curr.line === ""); + + // Move one step to skip character we start on + nextChar(cm, curr); + + while (curr.line !== null) { + last_valid.ln = curr.ln; + last_valid.pos = curr.pos; + + if (curr.line === "" && !skip_empty_lines) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (stop && curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + return { ln: curr.ln, pos: curr.pos, }; + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && !stop + && (curr.pos === curr.line.length - 1 + || isWhiteSpaceString(curr.line[curr.pos + 1]))) { + stop = true; + } + + nextChar(cm, curr); + } + + /* + Set the position to the last non whitespace character on the last + valid line in the case that we reach the end of the document. + */ + var line = cm.getLine(last_valid.ln); + last_valid.pos = 0; + for(var i = line.length - 1; i >= 0; --i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } + } + + return last_valid; + + } + + /* + Performs one iteration of traversal in reverse direction + Returns an index object of the new location + */ + function reverse(cm, ln, pos, dir) { + var line = cm.getLine(ln); + + var curr = { + line: line, + ln: ln, + pos: pos, + dir: dir, + }; + + var last_valid = { + ln: curr.ln, + pos: null, + }; + + var skip_empty_lines = (curr.line === ""); + + // Move one step to skip character we start on + nextChar(cm, curr); + + while (curr.line !== null) { + + if (curr.line === "" && !skip_empty_lines) { + if (last_valid.pos !== null) { + return last_valid; + } + else { + return { ln: curr.ln, pos: curr.pos }; + } + } + else if (isEndOfSentenceSymbol(curr.line[curr.pos]) + && last_valid.pos !== null + && !(curr.ln === last_valid.ln && curr.pos + 1 === last_valid.pos)) { + return last_valid; + } + else if (curr.line !== "" && !isWhiteSpaceString(curr.line[curr.pos])) { + skip_empty_lines = false; + last_valid = { ln: curr.ln, pos: curr.pos }; + } + + nextChar(cm, curr); + } + + /* + Set the position to the first non whitespace character on the last + valid line in the case that we reach the beginning of the document. + */ + var line = cm.getLine(last_valid.ln); + last_valid.pos = 0; + for(var i = 0; i < line.length; ++i) { + if (!isWhiteSpaceString(line[i])) { + last_valid.pos = i; + break; + } + } + return last_valid; + } + + var curr_index = { + ln: cur.line, + pos: cur.ch, + }; + + while (repeat > 0) { + if (dir < 0) { + curr_index = reverse(cm, curr_index.ln, curr_index.pos, dir); + } + else { + curr_index = forward(cm, curr_index.ln, curr_index.pos, dir); + } + repeat--; + } + + return new Pos(curr_index.ln, curr_index.pos); + } + + // TODO: perhaps this finagling of start and end positions belongs // in codemirror/replaceRange? function selectCompanionObject(cm, head, symb, inclusive) { var cur = head, start, end; @@ -3480,18 +4148,20 @@ var bracketRegexp = ({ '(': /[()]/, ')': /[()]/, '[': /[[\]]/, ']': /[[\]]/, - '{': /[{}]/, '}': /[{}]/})[symb]; + '{': /[{}]/, '}': /[{}]/, + '<': /[<>]/, '>': /[<>]/})[symb]; var openSym = ({ '(': '(', ')': '(', '[': '[', ']': '[', - '{': '{', '}': '{'})[symb]; + '{': '{', '}': '{', + '<': '<', '>': '<'})[symb]; var curChar = cm.getLine(cur.line).charAt(cur.ch); // Due to the behavior of scanForBracket, we need to add an offset if the // cursor is on a matching open bracket. var offset = curChar === openSym ? 1 : 0; - start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp}); - end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp}); + start = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), -1, undefined, {'bracketRegex': bracketRegexp}); + end = cm.scanForBracket(new Pos(cur.line, cur.ch + offset), 1, undefined, {'bracketRegex': bracketRegexp}); if (!start || !end) { return { start: cur, end: cur }; @@ -3572,8 +4242,8 @@ } return { - start: Pos(cur.line, start), - end: Pos(cur.line, end) + start: new Pos(cur.line, start), + end: new Pos(cur.line, end) }; } @@ -3610,18 +4280,16 @@ var vim = cm.state.vim; return vim.searchState_ || (vim.searchState_ = new SearchState()); } - function dialog(cm, template, shortText, onClose, options) { - if (cm.openDialog) { - cm.openDialog(template, onClose, { bottom: true, value: options.value, - onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, - selectValueOnOpen: false}); - } - else { - onClose(prompt(shortText, '')); - } - } function splitBySlash(argString) { - var slashes = findUnescapedSlashes(argString) || []; + return splitBySeparator(argString, '/'); + } + + function findUnescapedSlashes(argString) { + return findUnescapedSeparators(argString, '/'); + } + + function splitBySeparator(argString, separator) { + var slashes = findUnescapedSeparators(argString, separator) || []; if (!slashes.length) return []; var tokens = []; // in case of strings like foo/bar @@ -3633,12 +4301,15 @@ return tokens; } - function findUnescapedSlashes(str) { + function findUnescapedSeparators(str, separator) { + if (!separator) + separator = '/'; + var escapeNextChar = false; var slashes = []; for (var i = 0; i < str.length; i++) { var c = str.charAt(i); - if (!escapeNextChar && c == '/') { + if (!escapeNextChar && c == separator) { slashes.push(i); } escapeNextChar = !escapeNextChar && (c == '\\'); @@ -3726,7 +4397,7 @@ } // Unescape \ and / in the replace part, for PCRE mode. - var unescapes = {'\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t'}; + var unescapes = {'\\/': '/', '\\\\': '\\', '\\n': '\n', '\\r': '\r', '\\t': '\t', '\\&':'&'}; function unescapeRegexReplace(str) { var stream = new CodeMirror.StringStream(str); var output = []; @@ -3792,30 +4463,69 @@ ignoreCase = (/^[^A-Z]*$/).test(regexPart); } var regexp = new RegExp(regexPart, - (ignoreCase || forceIgnoreCase) ? 'i' : undefined); + (ignoreCase || forceIgnoreCase) ? 'im' : 'm'); return regexp; } - function showConfirm(cm, text) { + + /** + * dom - Document Object Manipulator + * Usage: + * dom(''|[, ...{|<$styles>}||'']) + * Examples: + * dom('div', {id:'xyz'}, dom('p', 'CM rocks!', {$color:'red'})) + * dom(document.head, dom('script', 'alert("hello!")')) + * Not supported: + * dom('p', ['arrays are objects'], Error('objects specify attributes')) + */ + function dom(n) { + if (typeof n === 'string') n = document.createElement(n); + for (var a, i = 1; i < arguments.length; i++) { + if (!(a = arguments[i])) continue; + if (typeof a !== 'object') a = document.createTextNode(a); + if (a.nodeType) n.appendChild(a); + else for (var key in a) { + if (!Object.prototype.hasOwnProperty.call(a, key)) continue; + if (key[0] === '$') n.style[key.slice(1)] = a[key]; + else n.setAttribute(key, a[key]); + } + } + return n; + } + + function showConfirm(cm, template) { + var pre = dom('div', {$color: 'red', $whiteSpace: 'pre', class: 'cm-vim-message'}, template); if (cm.openNotification) { - cm.openNotification('' + text + '', - {bottom: true, duration: 5000}); + cm.openNotification(pre, {bottom: true, duration: 5000}); } else { - alert(text); + alert(pre.innerText); } } + function makePrompt(prefix, desc) { - var raw = '' + - (prefix || "") + ''; - if (desc) - raw += ' ' + desc + ''; - return raw; + return dom(document.createDocumentFragment(), + dom('span', {$fontFamily: 'monospace', $whiteSpace: 'pre'}, + prefix, + dom('input', {type: 'text', autocorrect: 'off', + autocapitalize: 'off', spellcheck: 'false'})), + desc && dom('span', {$color: '#888'}, desc)); } - var searchPromptDesc = '(Javascript regexp)'; + function showPrompt(cm, options) { - var shortText = (options.prefix || '') + ' ' + (options.desc || ''); - var prompt = makePrompt(options.prefix, options.desc); - dialog(cm, prompt, shortText, options.onClose, options); + var template = makePrompt(options.prefix, options.desc); + if (cm.openDialog) { + cm.openDialog(template, options.onClose, { + onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp, + bottom: true, selectValueOnOpen: false, value: options.value + }); + } + else { + var shortText = ''; + if (typeof options.prefix != "string" && options.prefix) shortText += options.prefix.textContent; + if (options.desc) shortText += " " + options.desc; + options.onClose(prompt(shortText, '')); + } } + function regexEqual(r1, r2) { if (r1 instanceof RegExp && r2 instanceof RegExp) { var props = ['global', 'multiline', 'ignoreCase', 'source']; @@ -3882,23 +4592,28 @@ query: query }; } + var highlightTimeout = 0; function highlightSearchMatches(cm, query) { - var searchState = getSearchState(cm); - var overlay = searchState.getOverlay(); - if (!overlay || query != overlay.query) { - if (overlay) { - cm.removeOverlay(overlay); - } - overlay = searchOverlay(query); - cm.addOverlay(overlay); - if (cm.showMatchesOnScrollbar) { - if (searchState.getScrollbarAnnotate()) { - searchState.getScrollbarAnnotate().clear(); + clearTimeout(highlightTimeout); + highlightTimeout = setTimeout(function() { + if (!cm.state.vim) return; + var searchState = getSearchState(cm); + var overlay = searchState.getOverlay(); + if (!overlay || query != overlay.query) { + if (overlay) { + cm.removeOverlay(overlay); } - searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + overlay = searchOverlay(query); + cm.addOverlay(overlay); + if (cm.showMatchesOnScrollbar) { + if (searchState.getScrollbarAnnotate()) { + searchState.getScrollbarAnnotate().clear(); + } + searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + } + searchState.setOverlay(overlay); } - searchState.setOverlay(overlay); - } + }, 50); } function findNext(cm, prev, query, repeat) { if (repeat === undefined) { repeat = 1; } @@ -3907,12 +4622,19 @@ var cursor = cm.getSearchCursor(query, pos); for (var i = 0; i < repeat; i++) { var found = cursor.find(prev); - if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); } + if (i == 0 && found && cursorEqual(cursor.from(), pos)) { + var lastEndPos = prev ? cursor.from() : cursor.to(); + found = cursor.find(prev); + if (found && !found[0] && cursorEqual(cursor.from(), lastEndPos)) { + if (cm.getLine(lastEndPos.line).length == lastEndPos.ch) + found = cursor.find(prev); + } + } if (!found) { // SearchCursor may have returned null because it hit EOF, wrap // around and try again. cursor = cm.getSearchCursor(query, - (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) ); + (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); if (!cursor.find(prev)) { return; } @@ -3921,6 +4643,42 @@ return cursor.from(); }); } + /** + * Pretty much the same as `findNext`, except for the following differences: + * + * 1. Before starting the search, move to the previous search. This way if our cursor is + * already inside a match, we should return the current match. + * 2. Rather than only returning the cursor's from, we return the cursor's from and to as a tuple. + */ + function findNextFromAndToInclusive(cm, prev, query, repeat, vim) { + if (repeat === undefined) { repeat = 1; } + return cm.operation(function() { + var pos = cm.getCursor(); + var cursor = cm.getSearchCursor(query, pos); + + // Go back one result to ensure that if the cursor is currently a match, we keep it. + var found = cursor.find(!prev); + + // If we haven't moved, go back one more (similar to if i==0 logic in findNext). + if (!vim.visualMode && found && cursorEqual(cursor.from(), pos)) { + cursor.find(!prev); + } + + for (var i = 0; i < repeat; i++) { + found = cursor.find(prev); + if (!found) { + // SearchCursor may have returned null because it hit EOF, wrap + // around and try again. + cursor = cm.getSearchCursor(query, + (prev) ? new Pos(cm.lastLine()) : new Pos(cm.firstLine(), 0) ); + if (!cursor.find(prev)) { + return; + } + } + } + return [cursor.from(), cursor.to()]; + }); + } function clearSearchHighlight(cm) { var state = getSearchState(cm); cm.removeOverlay(getSearchState(cm).getOverlay()); @@ -3949,7 +4707,7 @@ if (start instanceof Array) { return inArray(pos, start); } else { - if (end) { + if (typeof end == 'number') { return (pos >= start && pos <= end); } else { return pos == start; @@ -3966,6 +4724,26 @@ return {top: from.line, bottom: to.line}; } + function getMarkPos(cm, vim, markName) { + if (markName == '\'' || markName == '`') { + return vimGlobalState.jumpList.find(cm, -1) || new Pos(0, 0); + } else if (markName == '.') { + return getLastEditPos(cm); + } + + var mark = vim.marks[markName]; + return mark && mark.find(); + } + + function getLastEditPos(cm) { + var done = cm.doc.history.done; + for (var i = done.length; i--;) { + if (done[i].changes) { + return copyCursor(done[i].changes[0].to); + } + } + } + var ExCommandDispatcher = function() { this.buildCommandMap_(); }; @@ -3992,7 +4770,7 @@ try { this.parseInput_(cm, inputStream, params); } catch(e) { - showConfirm(cm, e); + showConfirm(cm, e.toString()); throw e; } var command; @@ -4013,7 +4791,7 @@ if (command.type == 'exToKey') { // Handle Ex to Key mapping. for (var i = 0; i < command.toKeys.length; i++) { - CodeMirror.Vim.handleKey(cm, command.toKeys[i], 'mapping'); + vimApi.handleKey(cm, command.toKeys[i], 'mapping'); } return; } else if (command.type == 'exToEx') { @@ -4036,7 +4814,7 @@ params.callback(); } } catch(e) { - showConfirm(cm, e); + showConfirm(cm, e.toString()); throw e; } }, @@ -4054,7 +4832,7 @@ } // Parse command name. - var commandMatch = inputStream.match(/^(\w+)/); + var commandMatch = inputStream.match(/^(\w+|!!|@@|[!#&*<=>@~])/); if (commandMatch) { result.commandName = commandMatch[1]; } else { @@ -4066,24 +4844,42 @@ parseLineSpec_: function(cm, inputStream) { var numberMatch = inputStream.match(/^(\d+)/); if (numberMatch) { + // Absolute line number plus offset (N+M or N-M) is probably a typo, + // not something the user actually wanted. (NB: vim does allow this.) return parseInt(numberMatch[1], 10) - 1; } switch (inputStream.next()) { case '.': - return cm.getCursor().line; + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); case '$': - return cm.lastLine(); + return this.parseLineSpecOffset_(inputStream, cm.lastLine()); case '\'': - var mark = cm.state.vim.marks[inputStream.next()]; - if (mark && mark.find()) { - return mark.find().line; - } - throw new Error('Mark not set'); + var markName = inputStream.next(); + var markPos = getMarkPos(cm, cm.state.vim, markName); + if (!markPos) throw new Error('Mark not set'); + return this.parseLineSpecOffset_(inputStream, markPos.line); + case '-': + case '+': + inputStream.backUp(1); + // Offset is relative to current line if not otherwise specified. + return this.parseLineSpecOffset_(inputStream, cm.getCursor().line); default: inputStream.backUp(1); return undefined; } }, + parseLineSpecOffset_: function(inputStream, line) { + var offsetMatch = inputStream.match(/^([+-])?(\d+)/); + if (offsetMatch) { + var offset = parseInt(offsetMatch[2], 10); + if (offsetMatch[1] == "-") { + line -= offset; + } else { + line += offset; + } + } + return line; + }, parseCommandArgs_: function(inputStream, params, command) { if (inputStream.eol()) { return; @@ -4147,8 +4943,8 @@ var mapping = { keys: lhs, type: 'keyToEx', - exArgs: { input: rhs.substring(1) }, - user: true}; + exArgs: { input: rhs.substring(1) } + }; if (ctx) { mapping.context = ctx; } defaultKeymap.unshift(mapping); } else { @@ -4156,8 +4952,7 @@ var mapping = { keys: lhs, type: 'keyToKey', - toKeys: rhs, - user: true + toKeys: rhs }; if (ctx) { mapping.context = ctx; } defaultKeymap.unshift(mapping); @@ -4171,21 +4966,19 @@ var commandName = lhs.substring(1); if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { delete this.commandMap_[commandName]; - return; + return true; } } else { // Key to Ex or key to key mapping var keys = lhs; for (var i = 0; i < defaultKeymap.length; i++) { if (keys == defaultKeymap[i].keys - && defaultKeymap[i].context === ctx - && defaultKeymap[i].user) { + && defaultKeymap[i].context === ctx) { defaultKeymap.splice(i, 1); - return; + return true; } } } - throw Error('No such mapping.'); } }; @@ -4212,13 +5005,11 @@ vmap: function(cm, params) { this.map(cm, params, 'visual'); }, unmap: function(cm, params, ctx) { var mapArgs = params.args; - if (!mapArgs || mapArgs.length < 1) { + if (!mapArgs || mapArgs.length < 1 || !exCommandDispatcher.unmap(mapArgs[0], ctx)) { if (cm) { showConfirm(cm, 'No such mapping: ' + params.input); } - return; } - exCommandDispatcher.unmap(mapArgs[0], ctx); }, move: function(cm, params) { commandDispatcher.processCommand(cm, cm.state.vim, { @@ -4265,13 +5056,18 @@ // If no value is provided, then we assume this is a get. if (!optionIsBoolean && value === undefined || forceGet) { var oldValue = getOption(optionName, cm, setCfg); - if (oldValue === true || oldValue === false) { + if (oldValue instanceof Error) { + showConfirm(cm, oldValue.message); + } else if (oldValue === true || oldValue === false) { showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); } else { showConfirm(cm, ' ' + optionName + '=' + oldValue); } } else { - setOption(optionName, value, cm, setCfg); + var setOptionReturn = setOption(optionName, value, cm, setCfg); + if (setOptionReturn instanceof Error) { + showConfirm(cm, setOptionReturn.message); + } } }, setlocal: function (cm, params) { @@ -4287,12 +5083,12 @@ registers: function(cm, params) { var regArgs = params.args; var registers = vimGlobalState.registerController.registers; - var regInfo = '----------Registers----------

        '; + var regInfo = '----------Registers----------\n\n'; if (!regArgs) { for (var registerName in registers) { var text = registers[registerName].toString(); if (text.length) { - regInfo += '"' + registerName + ' ' + text + '
        '; + regInfo += '"' + registerName + ' ' + text + '\n'; } } } else { @@ -4304,31 +5100,33 @@ continue; } var register = registers[registerName] || new Register(); - regInfo += '"' + registerName + ' ' + register.toString() + '
        '; + regInfo += '"' + registerName + ' ' + register.toString() + '\n'; } } showConfirm(cm, regInfo); }, sort: function(cm, params) { - var reverse, ignoreCase, unique, number; + var reverse, ignoreCase, unique, number, pattern; function parseArgs() { if (params.argString) { var args = new CodeMirror.StringStream(params.argString); if (args.eat('!')) { reverse = true; } if (args.eol()) { return; } if (!args.eatSpace()) { return 'Invalid arguments'; } - var opts = args.match(/[a-z]+/); - if (opts) { - opts = opts[0]; - ignoreCase = opts.indexOf('i') != -1; - unique = opts.indexOf('u') != -1; - var decimal = opts.indexOf('d') != -1 && 1; - var hex = opts.indexOf('x') != -1 && 1; - var octal = opts.indexOf('o') != -1 && 1; + var opts = args.match(/([dinuox]+)?\s*(\/.+\/)?\s*/); + if (!opts && !args.eol()) { return 'Invalid arguments'; } + if (opts[1]) { + ignoreCase = opts[1].indexOf('i') != -1; + unique = opts[1].indexOf('u') != -1; + var decimal = opts[1].indexOf('d') != -1 || opts[1].indexOf('n') != -1 && 1; + var hex = opts[1].indexOf('x') != -1 && 1; + var octal = opts[1].indexOf('o') != -1 && 1; if (decimal + hex + octal > 1) { return 'Invalid arguments'; } number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; } - if (args.match(/\/.*\//)) { return 'patterns not supported'; } + if (opts[2]) { + pattern = new RegExp(opts[2].substr(1, opts[2].length - 2), ignoreCase ? 'i' : ''); + } } } var err = parseArgs(); @@ -4339,17 +5137,21 @@ var lineStart = params.line || cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); if (lineStart == lineEnd) { return; } - var curStart = Pos(lineStart, 0); - var curEnd = Pos(lineEnd, lineLength(cm, lineEnd)); + var curStart = new Pos(lineStart, 0); + var curEnd = new Pos(lineEnd, lineLength(cm, lineEnd)); var text = cm.getRange(curStart, curEnd).split('\n'); - var numberRegex = (number == 'decimal') ? /(-?)([\d]+)/ : + var numberRegex = pattern ? pattern : + (number == 'decimal') ? /(-?)([\d]+)/ : (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : (number == 'octal') ? /([0-7]+)/ : null; var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; var numPart = [], textPart = []; - if (number) { + if (number || pattern) { for (var i = 0; i < text.length; i++) { - if (numberRegex.exec(text[i])) { + var matchPart = pattern ? text[i].match(pattern) : null; + if (matchPart && matchPart[0] != '') { + numPart.push(matchPart); + } else if (!pattern && numberRegex.exec(text[i])) { numPart.push(text[i]); } else { textPart.push(text[i]); @@ -4368,8 +5170,17 @@ bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); return anum - bnum; } - numPart.sort(compareFn); - textPart.sort(compareFn); + function comparePatternFn(a, b) { + if (reverse) { var tmp; tmp = a; a = b; b = tmp; } + if (ignoreCase) { a[0] = a[0].toLowerCase(); b[0] = b[0].toLowerCase(); } + return (a[0] < b[0]) ? -1 : 1; + } + numPart.sort(pattern ? comparePatternFn : compareFn); + if (pattern) { + for (var i = 0; i < numPart.length; i++) { + numPart[i] = numPart[i].input; + } + } else if (!number) { textPart.sort(compareFn); } text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); if (unique) { // Remove duplicate lines var textOld = text; @@ -4384,6 +5195,10 @@ } cm.replaceRange(text.join('\n'), curStart, curEnd); }, + vglobal: function(cm, params) { + // global inspects params.commandName + this.global(cm, params); + }, global: function(cm, params) { // a global command is of the form // :[range]g/pattern/[cmd] @@ -4393,6 +5208,7 @@ showConfirm(cm, 'Regular Expression missing from global'); return; } + var inverted = params.commandName[0] === 'v'; // range is specified here var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); var lineEnd = params.lineEnd || params.line || cm.lastLine(); @@ -4417,28 +5233,33 @@ // now that we have the regexPart, search for regex matches in the // specified range of lines var query = getSearchState(cm).getQuery(); - var matchedLines = [], content = ''; + var matchedLines = []; for (var i = lineStart; i <= lineEnd; i++) { - var matched = query.test(cm.getLine(i)); - if (matched) { - matchedLines.push(i+1); - content+= cm.getLine(i) + '
        '; + var line = cm.getLineHandle(i); + var matched = query.test(line.text); + if (matched !== inverted) { + matchedLines.push(cmd ? line : line.text); } } // if there is no [cmd], just display the list of matched lines if (!cmd) { - showConfirm(cm, content); + showConfirm(cm, matchedLines.join('\n')); return; } var index = 0; var nextCommand = function() { if (index < matchedLines.length) { - var command = matchedLines[index] + cmd; + var line = matchedLines[index++]; + var lineNum = cm.getLineNumber(line); + if (lineNum == null) { + nextCommand(); + return; + } + var command = (lineNum + 1) + cmd; exCommandDispatcher.processCommand(cm, command, { callback: nextCommand }); } - index++; }; nextCommand(); }, @@ -4448,16 +5269,19 @@ 'any other getSearchCursor implementation.'); } var argString = params.argString; - var tokens = argString ? splitBySlash(argString) : []; + var tokens = argString ? splitBySeparator(argString, argString[0]) : []; var regexPart, replacePart = '', trailing, flagsPart, count; var confirm = false; // Whether to confirm each replace. var global = false; // True to replace all instances on a line, false to replace only 1. if (tokens.length) { regexPart = tokens[0]; + if (getOption('pcre') && regexPart !== '') { + regexPart = new RegExp(regexPart).source; //normalize not escaped characters + } replacePart = tokens[1]; if (replacePart !== undefined) { if (getOption('pcre')) { - replacePart = unescapeRegexReplace(replacePart); + replacePart = unescapeRegexReplace(replacePart.replace(/([^\\])&/g,"$1$$&")); } else { replacePart = translateRegexReplace(replacePart); } @@ -4482,13 +5306,15 @@ if (flagsPart) { if (flagsPart.indexOf('c') != -1) { confirm = true; - flagsPart.replace('c', ''); } if (flagsPart.indexOf('g') != -1) { global = true; - flagsPart.replace('g', ''); } - regexPart = regexPart + '/' + flagsPart; + if (getOption('pcre')) { + regexPart = regexPart + '/' + flagsPart; + } else { + regexPart = regexPart.replace(/\//g, "\\/") + '/' + flagsPart; + } } } if (regexPart) { @@ -4518,7 +5344,7 @@ lineStart = lineEnd; lineEnd = lineStart + count - 1; } - var startPos = clipCursorToContent(cm, Pos(lineStart, 0)); + var startPos = clipCursorToContent(cm, new Pos(lineStart, 0)); var cursor = cm.getSearchCursor(query, startPos); doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); }, @@ -4615,7 +5441,7 @@ * @param {Cursor} lineEnd Line to stop replacing at. * @param {RegExp} query Query for performing matches with. * @param {string} replaceWith Text to replace matches with. May contain $1, - * $2, etc for replacing captured groups using Javascript replace. + * $2, etc for replacing captured groups using JavaScript replace. * @param {function()} callback A callback for when the replace is done. */ function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, @@ -4623,7 +5449,7 @@ // Set up all the functions. cm.state.vim.exMode = true; var done = false; - var lastPos = searchCursor.from(); + var lastPos, modifiedLineNumber, joined; function replaceAll() { cm.operation(function() { while (!done) { @@ -4636,14 +5462,26 @@ function replace() { var text = cm.getRange(searchCursor.from(), searchCursor.to()); var newText = text.replace(query, replaceWith); + var unmodifiedLineNumber = searchCursor.to().line; searchCursor.replace(newText); + modifiedLineNumber = searchCursor.to().line; + lineEnd += modifiedLineNumber - unmodifiedLineNumber; + joined = modifiedLineNumber < unmodifiedLineNumber; + } + function findNextValidMatch() { + var lastMatchTo = lastPos && copyCursor(searchCursor.to()); + var match = searchCursor.findNext(); + if (match && !match[0] && lastMatchTo && cursorEqual(searchCursor.from(), lastMatchTo)) { + match = searchCursor.findNext(); + } + return match; } function next() { // The below only loops to skip over multiple occurrences on the same // line when 'global' is not true. - while(searchCursor.findNext() && + while(findNextValidMatch() && isInRange(searchCursor.from(), lineStart, lineEnd)) { - if (!global && lastPos && searchCursor.from().line == lastPos.line) { + if (!global && searchCursor.from().line == modifiedLineNumber && !joined) { continue; } cm.scrollIntoView(searchCursor.from(), 30); @@ -4704,11 +5542,11 @@ } if (!confirm) { replaceAll(); - if (callback) { callback(); }; + if (callback) { callback(); } return; } showPrompt(cm, { - prefix: 'replace with ' + replaceWith + ' (y/n/a/q/l)', + prefix: dom('span', 'replace with ', dom('strong', replaceWith), ' (y/n/a/q/l)'), onKeyDown: onPromptKeyDown }); } @@ -4725,31 +5563,7 @@ var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); var isPlaying = macroModeState.isPlaying; var lastChange = macroModeState.lastInsertModeChanges; - // In case of visual block, the insertModeChanges are not saved as a - // single word, so we convert them to a single word - // so as to update the ". register as expected in real vim. - var text = []; if (!isPlaying) { - var selLength = lastChange.inVisualBlock ? vim.lastSelection.visualBlock.height : 1; - var changes = lastChange.changes; - var text = []; - var i = 0; - // In case of multiple selections in blockwise visual, - // the inserted text, for example: 'foo', is stored as - // 'f', 'f', InsertModeKey 'o', 'o', 'o', 'o'. (if you have a block with 2 lines). - // We push the contents of the changes array as per the following: - // 1. In case of InsertModeKey, just increment by 1. - // 2. In case of a character, jump by selLength (2 in the example). - while (i < changes.length) { - // This loop will convert 'ffoooo' to 'foo'. - text.push(changes[i]); - if (changes[i] instanceof InsertModeKey) { - i++; - } else { - i+= selLength; - } - } - lastChange.changes = text; cm.off('change', onChange); CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); } @@ -4830,7 +5644,7 @@ match = (/<\w+-.+?>|<\w+>|./).exec(text); key = match[0]; text = text.substring(match.index + key.length); - CodeMirror.Vim.handleKey(cm, key, 'macro'); + vimApi.handleKey(cm, key, 'macro'); if (vim.insertMode) { var changes = register.insertModeChanges[imc++].changes; vimGlobalState.macroModeState.lastInsertModeChanges.changes = @@ -4839,7 +5653,7 @@ exitInsertMode(cm); } } - }; + } macroModeState.isPlaying = false; } @@ -4874,20 +5688,31 @@ * Listens for changes made in insert mode. * Should only be active in insert mode. */ - function onChange(_cm, changeObj) { + function onChange(cm, changeObj) { var macroModeState = vimGlobalState.macroModeState; var lastChange = macroModeState.lastInsertModeChanges; if (!macroModeState.isPlaying) { while(changeObj) { lastChange.expectCursorActivityForChange = true; - if (changeObj.origin == '+input' || changeObj.origin == 'paste' + if (lastChange.ignoreCount > 1) { + lastChange.ignoreCount--; + } else if (changeObj.origin == '+input' || changeObj.origin == 'paste' || changeObj.origin === undefined /* only in testing */) { + var selectionCount = cm.listSelections().length; + if (selectionCount > 1) + lastChange.ignoreCount = selectionCount; var text = changeObj.text.join('\n'); if (lastChange.maybeReset) { lastChange.changes = []; lastChange.maybeReset = false; } - lastChange.changes.push(text); + if (text) { + if (cm.state.overwrite && !/\n/.test(text)) { + lastChange.changes.push([text]); + } else { + lastChange.changes.push(text); + } + } } // Change objects may be chained with next. changeObj = changeObj.next; @@ -4914,18 +5739,6 @@ } else if (!cm.curOp.isVimOp) { handleExternalSelection(cm, vim); } - if (vim.visualMode) { - updateFakeCursor(cm); - } - } - function updateFakeCursor(cm) { - var vim = cm.state.vim; - var from = clipCursorToContent(cm, copyCursor(vim.sel.head)); - var to = offsetCursor(from, 0, 1); - if (vim.fakeCursor) { - vim.fakeCursor.clear(); - } - vim.fakeCursor = cm.markText(from, to, {className: 'cm-animate-fat-cursor'}); } function handleExternalSelection(cm, vim) { var anchor = cm.getCursor('anchor'); @@ -5039,7 +5852,7 @@ exitInsertMode(cm); } macroModeState.isPlaying = false; - }; + } function repeatInsertModeChanges(cm, changes, repeat) { function keyHandler(binding) { @@ -5051,38 +5864,115 @@ return true; } var head = cm.getCursor('head'); - var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock; - if (inVisualBlock) { + var visualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.visualBlock; + if (visualBlock) { // Set up block selection again for repeating the changes. - var vim = cm.state.vim; - var lastSel = vim.lastSelection; - var offset = getOffset(lastSel.anchor, lastSel.head); - selectForInsert(cm, head, offset.line + 1); + selectForInsert(cm, head, visualBlock + 1); repeat = cm.listSelections().length; cm.setCursor(head); } for (var i = 0; i < repeat; i++) { - if (inVisualBlock) { + if (visualBlock) { cm.setCursor(offsetCursor(head, i, 0)); } for (var j = 0; j < changes.length; j++) { var change = changes[j]; if (change instanceof InsertModeKey) { CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); + } else if (typeof change == "string") { + cm.replaceSelection(change); } else { - var cur = cm.getCursor(); - cm.replaceRange(change, cur, cur); + var start = cm.getCursor(); + var end = offsetCursor(start, 0, change[0].length); + cm.replaceRange(change[0], start, end); + cm.setCursor(end); } } } - if (inVisualBlock) { + if (visualBlock) { cm.setCursor(offsetCursor(head, 0, 1)); } } + // multiselect support + function cloneVimState(state) { + var n = new state.constructor(); + Object.keys(state).forEach(function(key) { + var o = state[key]; + if (Array.isArray(o)) + o = o.slice(); + else if (o && typeof o == "object" && o.constructor != Object) + o = cloneVimState(o); + n[key] = o; + }); + if (state.sel) { + n.sel = { + head: state.sel.head && copyCursor(state.sel.head), + anchor: state.sel.anchor && copyCursor(state.sel.anchor) + }; + } + return n; + } + function multiSelectHandleKey(cm, key, origin) { + var isHandled = false; + var vim = vimApi.maybeInitVimState_(cm); + var visualBlock = vim.visualBlock || vim.wasInVisualBlock; + + var wasMultiselect = cm.isInMultiSelectMode(); + if (vim.wasInVisualBlock && !wasMultiselect) { + vim.wasInVisualBlock = false; + } else if (wasMultiselect && vim.visualBlock) { + vim.wasInVisualBlock = true; + } + + if (key == '' && !vim.insertMode && !vim.visualMode && wasMultiselect && vim.status == "") { + // allow editor to exit multiselect + clearInputState(cm); + } else if (visualBlock || !wasMultiselect || cm.inVirtualSelectionMode) { + isHandled = vimApi.handleKey(cm, key, origin); + } else { + var old = cloneVimState(vim); + + cm.operation(function() { + cm.curOp.isVimOp = true; + cm.forEachSelection(function() { + var head = cm.getCursor("head"); + var anchor = cm.getCursor("anchor"); + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + cm.state.vim.sel.head = head; + cm.state.vim.sel.anchor = anchor; + + isHandled = vimApi.handleKey(cm, key, origin); + if (cm.virtualSelection) { + cm.state.vim = cloneVimState(old); + } + }); + if (cm.curOp.cursorActivity && !isHandled) + cm.curOp.cursorActivity = false; + cm.state.vim = vim; + }, true); + } + // some commands may bring visualMode and selection out of sync + if (isHandled && !vim.visualMode && !vim.insert && vim.visualMode != cm.somethingSelected()) { + handleExternalSelection(cm, vim); + } + return isHandled; + } resetVimGlobalState(); - return vimApi; - }; - // Initialize Vim and make it available as an API. - CodeMirror.Vim = Vim(); -}); + + return vimApi; +} + +function initVim(CodeMirror5) { + CodeMirror5.Vim = initVim$1(CodeMirror5); + return CodeMirror5.Vim; +} + + + + CodeMirror.Vim = initVim(CodeMirror); + }); + \ No newline at end of file diff --git a/src/external/code-mirror/lib/codemirror.css b/src/external/code-mirror/lib/codemirror.css index 2a6a26228..f4d5718a7 100644 --- a/src/external/code-mirror/lib/codemirror.css +++ b/src/external/code-mirror/lib/codemirror.css @@ -5,6 +5,7 @@ font-family: monospace; height: 300px; color: black; + direction: ltr; } /* PADDING */ @@ -12,7 +13,8 @@ .CodeMirror-lines { padding: 4px 0; /* Vertical padding around content */ } -.CodeMirror pre { +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { padding: 0 4px; /* Horizontal padding of content */ } @@ -58,15 +60,13 @@ .cm-fat-cursor div.CodeMirror-cursors { z-index: 1; } - -.cm-animate-fat-cursor { - width: auto; - border: 0; - -webkit-animation: blink 1.06s steps(1) infinite; - -moz-animation: blink 1.06s steps(1) infinite; - animation: blink 1.06s steps(1) infinite; - background-color: #7e7; -} +.cm-fat-cursor .CodeMirror-line::selection, +.cm-fat-cursor .CodeMirror-line > span::selection, +.cm-fat-cursor .CodeMirror-line > span > span::selection { background: transparent; } +.cm-fat-cursor .CodeMirror-line::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span::-moz-selection, +.cm-fat-cursor .CodeMirror-line > span > span::-moz-selection { background: transparent; } +.cm-fat-cursor { caret-color: transparent; } @-moz-keyframes blink { 0% {} 50% { background-color: transparent; } @@ -90,7 +90,7 @@ .CodeMirror-rulers { position: absolute; - left: 0; right: 0; top: -50px; bottom: -20px; + left: 0; right: 0; top: -50px; bottom: 0; overflow: hidden; } .CodeMirror-ruler { @@ -119,7 +119,7 @@ .cm-s-default .cm-property, .cm-s-default .cm-operator {} .cm-s-default .cm-variable-2 {color: #05a;} -.cm-s-default .cm-variable-3 {color: #085;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} .cm-s-default .cm-comment {color: #a50;} .cm-s-default .cm-string {color: #a11;} .cm-s-default .cm-string-2 {color: #f50;} @@ -139,8 +139,8 @@ /* Default styles for common addons */ -div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} -div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } .CodeMirror-activeline-background {background: #e8f2ff;} @@ -157,17 +157,18 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} .CodeMirror-scroll { overflow: scroll !important; /* Things will break if this is overridden */ - /* 30px is the magic margin used to hide the element's real scrollbars */ + /* 50px is the magic margin used to hide the element's real scrollbars */ /* See overflow: hidden in .CodeMirror */ - margin-bottom: -30px; margin-right: -30px; - padding-bottom: 30px; + margin-bottom: -50px; margin-right: -50px; + padding-bottom: 50px; height: 100%; outline: none; /* Prevent dragging from highlighting the element */ position: relative; + z-index: 0; } .CodeMirror-sizer { position: relative; - border-right: 30px solid transparent; + border-right: 50px solid transparent; } /* The fake, visible scrollbars. Used to force redraw during scrolling @@ -177,6 +178,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} position: absolute; z-index: 6; display: none; + outline: none; } .CodeMirror-vscrollbar { right: 0; top: 0; @@ -205,7 +207,7 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} height: 100%; display: inline-block; vertical-align: top; - margin-bottom: -30px; + margin-bottom: -50px; } .CodeMirror-gutter-wrapper { position: absolute; @@ -223,17 +225,15 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} cursor: default; z-index: 4; } -.CodeMirror-gutter-wrapper { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; -} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } .CodeMirror-lines { cursor: text; min-height: 1px; /* prevents collapsing before first draw */ } -.CodeMirror pre { +.CodeMirror pre.CodeMirror-line, +.CodeMirror pre.CodeMirror-line-like { /* Reset some styles that the rest of the page might have set */ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; @@ -252,7 +252,8 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} -webkit-font-variant-ligatures: contextual; font-variant-ligatures: contextual; } -.CodeMirror-wrap pre { +.CodeMirror-wrap pre.CodeMirror-line, +.CodeMirror-wrap pre.CodeMirror-line-like { word-wrap: break-word; white-space: pre-wrap; word-break: normal; @@ -267,11 +268,13 @@ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} .CodeMirror-linewidget { position: relative; z-index: 2; - overflow: auto; + padding: 0.1px; /* Force widget margins to stay inside of the container */ } .CodeMirror-widget {} +.CodeMirror-rtl pre { direction: rtl; } + .CodeMirror-code { outline: none; } @@ -320,8 +323,8 @@ div.CodeMirror-dragcursors { .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } .cm-searching { - background: #ffa; - background: rgba(255, 255, 0, .4); + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); } /* Used to force a border model for a node */ diff --git a/src/external/code-mirror/lib/codemirror.js b/src/external/code-mirror/lib/codemirror.js index dbf01262c..7687cd053 100644 --- a/src/external/code-mirror/lib/codemirror.js +++ b/src/external/code-mirror/lib/codemirror.js @@ -1,7 +1,7 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE +// Distributed under an MIT license: https://codemirror.net/5/LICENSE -// This is CodeMirror (http://codemirror.net), a code editor +// This is CodeMirror (https://codemirror.net/5), a code editor // implemented in JavaScript on top of the browser's DOM. // // You can find some technical background for some of the code below @@ -10,9111 +10,9875 @@ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : - (global.CodeMirror = factory()); + (global = global || self, global.CodeMirror = factory()); }(this, (function () { 'use strict'; -// Kludges for bugs and behavior differences that can't be feature -// detected are enabled based on userAgent etc sniffing. -var userAgent = navigator.userAgent -var platform = navigator.platform - -var gecko = /gecko\/\d/i.test(userAgent) -var ie_upto10 = /MSIE \d/.test(userAgent) -var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent) -var ie = ie_upto10 || ie_11up -var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]) -var webkit = /WebKit\//.test(userAgent) -var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent) -var chrome = /Chrome\//.test(userAgent) -var presto = /Opera\//.test(userAgent) -var safari = /Apple Computer/.test(navigator.vendor) -var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent) -var phantom = /PhantomJS/.test(userAgent) - -var ios = /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent) -// This is woefully incomplete. Suggestions for alternative methods welcome. -var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent) -var mac = ios || /Mac/.test(platform) -var chromeOS = /\bCrOS\b/.test(userAgent) -var windows = /win/i.test(platform) - -var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/) -if (presto_version) { presto_version = Number(presto_version[1]) } -if (presto_version && presto_version >= 15) { presto = false; webkit = true } -// Some browsers use the wrong event properties to signal cmd/ctrl on OS X -var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)) -var captureRightClick = gecko || (ie && ie_version >= 9) - -function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } - -var rmClass = function(node, cls) { - var current = node.className - var match = classTest(cls).exec(current) - if (match) { - var after = current.slice(match.index + match[0].length) - node.className = current.slice(0, match.index) + (after ? match[1] + after : "") - } -} - -function removeChildren(e) { - for (var count = e.childNodes.length; count > 0; --count) - { e.removeChild(e.firstChild) } - return e -} - -function removeChildrenAndAdd(parent, e) { - return removeChildren(parent).appendChild(e) -} - -function elt(tag, content, className, style) { - var e = document.createElement(tag) - if (className) { e.className = className } - if (style) { e.style.cssText = style } - if (typeof content == "string") { e.appendChild(document.createTextNode(content)) } - else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]) } } - return e -} - -var range -if (document.createRange) { range = function(node, start, end, endNode) { - var r = document.createRange() - r.setEnd(endNode || node, end) - r.setStart(node, start) - return r -} } -else { range = function(node, start, end) { - var r = document.body.createTextRange() - try { r.moveToElementText(node.parentNode) } - catch(e) { return r } - r.collapse(true) - r.moveEnd("character", end) - r.moveStart("character", start) - return r -} } - -function contains(parent, child) { - if (child.nodeType == 3) // Android browser always returns false when child is a textnode - { child = child.parentNode } - if (parent.contains) - { return parent.contains(child) } - do { - if (child.nodeType == 11) { child = child.host } - if (child == parent) { return true } - } while (child = child.parentNode) -} - -function activeElt() { - // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. - // IE < 10 will throw when accessed while the page is loading or in an iframe. - // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. - var activeElement - try { - activeElement = document.activeElement - } catch(e) { - activeElement = document.body || null - } - while (activeElement && activeElement.root && activeElement.root.activeElement) - { activeElement = activeElement.root.activeElement } - return activeElement -} - -function addClass(node, cls) { - var current = node.className - if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls } -} -function joinClasses(a, b) { - var as = a.split(" ") - for (var i = 0; i < as.length; i++) - { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i] } } - return b -} - -var selectInput = function(node) { node.select() } -if (ios) // Mobile Safari apparently has a bug where select() is broken. - { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length } } -else if (ie) // Suppress mysterious IE10 errors - { selectInput = function(node) { try { node.select() } catch(_e) {} } } - -function bind(f) { - var args = Array.prototype.slice.call(arguments, 1) - return function(){return f.apply(null, args)} -} - -function copyObj(obj, target, overwrite) { - if (!target) { target = {} } - for (var prop in obj) - { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) - { target[prop] = obj[prop] } } - return target -} - -// Counts the column offset in a string, taking tabs into account. -// Used mostly to find indentation. -function countColumn(string, end, tabSize, startIndex, startValue) { - if (end == null) { - end = string.search(/[^\s\u00a0]/) - if (end == -1) { end = string.length } - } - for (var i = startIndex || 0, n = startValue || 0;;) { - var nextTab = string.indexOf("\t", i) - if (nextTab < 0 || nextTab >= end) - { return n + (end - i) } - n += nextTab - i - n += tabSize - (n % tabSize) - i = nextTab + 1 - } -} - -function Delayed() {this.id = null} -Delayed.prototype.set = function(ms, f) { - clearTimeout(this.id) - this.id = setTimeout(f, ms) -} - -function indexOf(array, elt) { - for (var i = 0; i < array.length; ++i) - { if (array[i] == elt) { return i } } - return -1 -} - -// Number of pixels added to scroller and sizer to hide scrollbar -var scrollerGap = 30 - -// Returned or thrown by various protocols to signal 'I'm not -// handling this'. -var Pass = {toString: function(){return "CodeMirror.Pass"}} - -// Reused option objects for setSelection & friends -var sel_dontScroll = {scroll: false}; -var sel_mouse = {origin: "*mouse"}; -var sel_move = {origin: "+move"}; -// The inverse of countColumn -- find the offset that corresponds to -// a particular column. -function findColumn(string, goal, tabSize) { - for (var pos = 0, col = 0;;) { - var nextTab = string.indexOf("\t", pos) - if (nextTab == -1) { nextTab = string.length } - var skipped = nextTab - pos - if (nextTab == string.length || col + skipped >= goal) - { return pos + Math.min(skipped, goal - col) } - col += nextTab - pos - col += tabSize - (col % tabSize) - pos = nextTab + 1 - if (col >= goal) { return pos } - } -} - -var spaceStrs = [""] -function spaceStr(n) { - while (spaceStrs.length <= n) - { spaceStrs.push(lst(spaceStrs) + " ") } - return spaceStrs[n] -} - -function lst(arr) { return arr[arr.length-1] } - -function map(array, f) { - var out = [] - for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i) } - return out -} - -function insertSorted(array, value, score) { - var pos = 0, priority = score(value) - while (pos < array.length && score(array[pos]) <= priority) { pos++ } - array.splice(pos, 0, value) -} - -function nothing() {} - -function createObj(base, props) { - var inst - if (Object.create) { - inst = Object.create(base) - } else { - nothing.prototype = base - inst = new nothing() - } - if (props) { copyObj(props, inst) } - return inst -} - -var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/ -function isWordCharBasic(ch) { - return /\w/.test(ch) || ch > "\x80" && - (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) -} -function isWordChar(ch, helper) { - if (!helper) { return isWordCharBasic(ch) } - if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } - return helper.test(ch) -} - -function isEmpty(obj) { - for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } - return true -} - -// Extending unicode characters. A series of a non-extending char + -// any number of extending chars is treated as a single unit as far -// as editing and measuring is concerned. This is not fully correct, -// since some scripts/fonts/browsers also treat other configurations -// of code points as a group. -var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/ -function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } - -// The display handles the DOM integration, both for input reading -// and content drawing. It holds references to DOM nodes and -// display-related state. - -function Display(place, doc, input) { - var d = this - this.input = input - - // Covers bottom-right square when both scrollbars are present. - d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler") - d.scrollbarFiller.setAttribute("cm-not-content", "true") - // Covers bottom of gutter when coverGutterNextToScrollbar is on - // and h scrollbar is present. - d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler") - d.gutterFiller.setAttribute("cm-not-content", "true") - // Will contain the actual code, positioned to cover the viewport. - d.lineDiv = elt("div", null, "CodeMirror-code") - // Elements are added to these to represent selection and cursors. - d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1") - d.cursorDiv = elt("div", null, "CodeMirror-cursors") - // A visibility: hidden element used to find the size of things. - d.measure = elt("div", null, "CodeMirror-measure") - // When lines outside of the viewport are measured, they are drawn in this. - d.lineMeasure = elt("div", null, "CodeMirror-measure") - // Wraps everything that needs to exist inside the vertically-padded coordinate system - d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], - null, "position: relative; outline: none") - // Moved around its parent to cover visible view. - d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative") - // Set to the height of the document, allowing scrolling. - d.sizer = elt("div", [d.mover], "CodeMirror-sizer") - d.sizerWidth = null - // Behavior of elts with overflow: auto and padding is - // inconsistent across browsers. This is used to ensure the - // scrollable area is big enough. - d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;") - // Will contain the gutters, if any. - d.gutters = elt("div", null, "CodeMirror-gutters") - d.lineGutter = null - // Actual scrollable element. - d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll") - d.scroller.setAttribute("tabIndex", "-1") - // The element in which the editor lives. - d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror") - - // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) - if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0 } - if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true } - - if (place) { - if (place.appendChild) { place.appendChild(d.wrapper) } - else { place(d.wrapper) } - } - - // Current rendered range (may be bigger than the view window). - d.viewFrom = d.viewTo = doc.first - d.reportedViewFrom = d.reportedViewTo = doc.first - // Information about the rendered lines. - d.view = [] - d.renderedView = null - // Holds info about a single rendered line when it was rendered - // for measurement, while not in view. - d.externalMeasured = null - // Empty space (in pixels) above the view - d.viewOffset = 0 - d.lastWrapHeight = d.lastWrapWidth = 0 - d.updateLineNumbers = null - - d.nativeBarWidth = d.barHeight = d.barWidth = 0 - d.scrollbarsClipped = false - - // Used to only resize the line number gutter when necessary (when - // the amount of lines crosses a boundary that makes its width change) - d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null - // Set to true when a non-horizontal-scrolling line widget is - // added. As an optimization, line widget aligning is skipped when - // this is false. - d.alignWidgets = false - - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null - - // Tracks the maximum line length so that the horizontal scrollbar - // can be kept static when scrolling. - d.maxLine = null - d.maxLineLength = 0 - d.maxLineChanged = false - - // Used for measuring wheel scrolling granularity - d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null - - // True when shift is held down. - d.shift = false - - // Used to track whether anything happened since the context menu - // was opened. - d.selForContextMenu = null - - d.activeTouch = null - - input.init(d) -} - -// Find the line object corresponding to the given line number. -function getLine(doc, n) { - n -= doc.first - if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } - var chunk = doc - while (!chunk.lines) { - for (var i = 0;; ++i) { - var child = chunk.children[i], sz = child.chunkSize() - if (n < sz) { chunk = child; break } - n -= sz - } - } - return chunk.lines[n] -} - -// Get the part of a document between two positions, as an array of -// strings. -function getBetween(doc, start, end) { - var out = [], n = start.line - doc.iter(start.line, end.line + 1, function (line) { - var text = line.text - if (n == end.line) { text = text.slice(0, end.ch) } - if (n == start.line) { text = text.slice(start.ch) } - out.push(text) - ++n - }) - return out -} -// Get the lines between from and to, as array of strings. -function getLines(doc, from, to) { - var out = [] - doc.iter(from, to, function (line) { out.push(line.text) }) // iter aborts when callback returns truthy value - return out -} - -// Update the height of a line, propagating the height change -// upwards to parent nodes. -function updateLineHeight(line, height) { - var diff = height - line.height - if (diff) { for (var n = line; n; n = n.parent) { n.height += diff } } -} - -// Given a line object, find its line number by walking up through -// its parent links. -function lineNo(line) { - if (line.parent == null) { return null } - var cur = line.parent, no = indexOf(cur.lines, line) - for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { - for (var i = 0;; ++i) { - if (chunk.children[i] == cur) { break } - no += chunk.children[i].chunkSize() - } - } - return no + cur.first -} - -// Find the line at the given vertical position, using the height -// information in the document tree. -function lineAtHeight(chunk, h) { - var n = chunk.first - outer: do { - for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { - var child = chunk.children[i$1], ch = child.height - if (h < ch) { chunk = child; continue outer } - h -= ch - n += child.chunkSize() - } - return n - } while (!chunk.lines) - var i = 0 - for (; i < chunk.lines.length; ++i) { - var line = chunk.lines[i], lh = line.height - if (h < lh) { break } - h -= lh - } - return n + i -} - -function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} - -function lineNumberFor(options, i) { - return String(options.lineNumberFormatter(i + options.firstLineNumber)) -} - -// A Pos instance represents a position within the text. -function Pos (line, ch) { - if (!(this instanceof Pos)) { return new Pos(line, ch) } - this.line = line; this.ch = ch -} - -// Compare two positions, return 0 if they are the same, a negative -// number when a is less, and a positive number otherwise. -function cmp(a, b) { return a.line - b.line || a.ch - b.ch } - -function copyPos(x) {return Pos(x.line, x.ch)} -function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } -function minPos(a, b) { return cmp(a, b) < 0 ? a : b } - -// Most of the external API clips given positions to make sure they -// actually exist within the document. -function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} -function clipPos(doc, pos) { - if (pos.line < doc.first) { return Pos(doc.first, 0) } - var last = doc.first + doc.size - 1 - if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } - return clipToLen(pos, getLine(doc, pos.line).text.length) -} -function clipToLen(pos, linelen) { - var ch = pos.ch - if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } - else if (ch < 0) { return Pos(pos.line, 0) } - else { return pos } -} -function clipPosArray(doc, array) { - var out = [] - for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]) } - return out -} - -// Optimize some code when these features are not used. -var sawReadOnlySpans = false; -var sawCollapsedSpans = false; -function seeReadOnlySpans() { - sawReadOnlySpans = true -} - -function seeCollapsedSpans() { - sawCollapsedSpans = true -} - -// TEXTMARKER SPANS - -function MarkedSpan(marker, from, to) { - this.marker = marker - this.from = from; this.to = to -} - -// Search an array of spans for a span matching the given marker. -function getMarkedSpanFor(spans, marker) { - if (spans) { for (var i = 0; i < spans.length; ++i) { - var span = spans[i] - if (span.marker == marker) { return span } - } } -} -// Remove a span from an array, returning undefined if no spans are -// left (we don't store arrays for lines without spans). -function removeMarkedSpan(spans, span) { - var r - for (var i = 0; i < spans.length; ++i) - { if (spans[i] != span) { (r || (r = [])).push(spans[i]) } } - return r -} -// Add a span to a line. -function addMarkedSpan(line, span) { - line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span] - span.marker.attachLine(line) -} - -// Used for the algorithm that adjusts markers for a change in the -// document. These functions cut an array of spans at a given -// character position, returning an array of remaining chunks (or -// undefined if nothing remains). -function markedSpansBefore(old, startCh, isInsert) { - var nw - if (old) { for (var i = 0; i < old.length; ++i) { - var span = old[i], marker = span.marker - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh) - if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) - ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)) - } - } } - return nw -} -function markedSpansAfter(old, endCh, isInsert) { - var nw - if (old) { for (var i = 0; i < old.length; ++i) { - var span = old[i], marker = span.marker - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh) - if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) - ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, - span.to == null ? null : span.to - endCh)) - } - } } - return nw -} - -// Given a change object, compute the new set of marker spans that -// cover the line in which the change took place. Removes spans -// entirely within the change, reconnects spans belonging to the -// same marker that appear on both sides of the change, and cuts off -// spans partially within the change. Returns an array of span -// arrays with one element for each line in (after) the change. -function stretchSpansOverChange(doc, change) { - if (change.full) { return null } - var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans - var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans - if (!oldFirst && !oldLast) { return null } - - var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0 - // Get the spans that 'stick out' on both sides - var first = markedSpansBefore(oldFirst, startCh, isInsert) - var last = markedSpansAfter(oldLast, endCh, isInsert) - - // Next, merge those two ends - var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0) - if (first) { - // Fix up .to properties of first - for (var i = 0; i < first.length; ++i) { - var span = first[i] - if (span.to == null) { - var found = getMarkedSpanFor(last, span.marker) - if (!found) { span.to = startCh } - else if (sameLine) { span.to = found.to == null ? null : found.to + offset } - } - } - } - if (last) { - // Fix up .from in last (or move them into first in case of sameLine) - for (var i$1 = 0; i$1 < last.length; ++i$1) { - var span$1 = last[i$1] - if (span$1.to != null) { span$1.to += offset } - if (span$1.from == null) { - var found$1 = getMarkedSpanFor(first, span$1.marker) - if (!found$1) { - span$1.from = offset - if (sameLine) { (first || (first = [])).push(span$1) } + // Kludges for bugs and behavior differences that can't be feature + // detected are enabled based on userAgent etc sniffing. + var userAgent = navigator.userAgent; + var platform = navigator.platform; + + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\/(\d+)/.exec(userAgent); + var chrome_version = chrome && +chrome[1]; + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + + var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); + var android = /Android/.test(userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { presto_version = Number(presto_version[1]); } + if (presto_version && presto_version >= 15) { presto = false; webkit = true; } + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || (ie && ie_version >= 9); + + function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + + var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) + } + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { e.className = className; } + if (style) { e.style.cssText = style; } + if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } + else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } + return e + } + // wrapper for elt, which removes the elt from the accessibility tree + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e + } + + var range; + if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r + }; } + else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r + }; } + + function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) + } + + function activeElt(rootNode) { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var doc = rootNode.ownerDocument || rootNode; + var activeElement; + try { + activeElement = rootNode.activeElement; + } catch(e) { + activeElement = doc.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement + } + + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b + } + + var selectInput = function(node) { node.select(); }; + if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } + else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + + function doc(cm) { return cm.display.wrapper.ownerDocument } + + function root(cm) { + return rootNode(cm.display.wrapper) + } + + function rootNode(element) { + // Detect modern browsers (2017+). + return element.getRootNode ? element.getRootNode() : element.ownerDocument + } + + function win(cm) { return doc(cm).defaultView } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} + } + + function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } + } + + var Delayed = function() { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function (self) { + self.id = 0; + if (self.time <= +new Date) { + self.f(); + } else { + setTimeout(self.handler, self.time - +new Date); + } + }; + Delayed.prototype.set = function (ms, f) { + this.f = f; + var time = +new Date + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + + function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 + } + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerGap = 50; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = {toString: function(){return "CodeMirror.Pass"}}; + + // Reused option objects for setSelection & friends + var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; + + // The inverse of countColumn -- find the offset that corresponds to + // a particular column. + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } + } + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] + } + + function lst(arr) { return arr[arr.length-1] } + + function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out + } + + function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); + } + + function nothing() {} + + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst + } + + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + } + function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) + } + + function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true + } + + // Extending unicode characters. A series of a non-extending char + + // any number of extending chars is treated as a single unit as far + // as editing and measuring is concerned. This is not fully correct, + // since some scripts/fonts/browsers also treat other configurations + // of code points as a group. + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + + // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos + } + + // Returns the value from the range [`from`; `to`] that satisfies + // `pred` and is closest to `from`. Assumes that at least `to` + // satisfies `pred`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { return from } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { return pred(mid) ? from : to } + if (pred(mid)) { to = mid; } + else { from = mid + dir; } + } + } + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr", 0) } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } + } + + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; } - } else { - span$1.from += offset - if (sameLine) { (first || (first = [])).push(span$1) } - } - } - } - // Make sure we didn't create any zero-length spans - if (first) { first = clearEmptySpans(first) } - if (last && last != first) { last = clearEmptySpans(last) } - - var newMarkers = [first] - if (!sameLine) { - // Fill gap with whole-line-spans - var gap = change.text.length - 2, gapMarkers - if (gap > 0 && first) - { for (var i$2 = 0; i$2 < first.length; ++i$2) - { if (first[i$2].to == null) - { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)) } } } - for (var i$3 = 0; i$3 < gap; ++i$3) - { newMarkers.push(gapMarkers) } - newMarkers.push(last) - } - return newMarkers -} - -// Remove spans that are empty and don't have a clearWhenEmpty -// option of false. -function clearEmptySpans(spans) { - for (var i = 0; i < spans.length; ++i) { - var span = spans[i] - if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) - { spans.splice(i--, 1) } - } - if (!spans.length) { return null } - return spans -} - -// Used to 'clip' out readOnly ranges when making a change. -function removeReadOnlyRanges(doc, from, to) { - var markers = null - doc.iter(from.line, to.line + 1, function (line) { - if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { - var mark = line.markedSpans[i].marker - if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) - { (markers || (markers = [])).push(mark) } - } } - }) - if (!markers) { return null } - var parts = [{from: from, to: to}] - for (var i = 0; i < markers.length; ++i) { - var mk = markers[i], m = mk.find(0) - for (var j = 0; j < parts.length; ++j) { - var p = parts[j] - if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } - var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to) - if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) - { newParts.push({from: p.from, to: m.from}) } - if (dto > 0 || !mk.inclusiveRight && !dto) - { newParts.push({from: m.to, to: p.to}) } - parts.splice.apply(parts, newParts) - j += newParts.length - 1 - } - } - return parts -} - -// Connect or disconnect spans from a line. -function detachMarkedSpans(line) { - var spans = line.markedSpans - if (!spans) { return } - for (var i = 0; i < spans.length; ++i) - { spans[i].marker.detachLine(line) } - line.markedSpans = null -} -function attachMarkedSpans(line, spans) { - if (!spans) { return } - for (var i = 0; i < spans.length; ++i) - { spans[i].marker.attachLine(line) } - line.markedSpans = spans -} - -// Helpers used when computing which overlapping collapsed span -// counts as the larger one. -function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } -function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } - -// Returns a number indicating which of two overlapping collapsed -// spans is larger (and thus includes the other). Falls back to -// comparing ids when the spans cover exactly the same range. -function compareCollapsedMarkers(a, b) { - var lenDiff = a.lines.length - b.lines.length - if (lenDiff != 0) { return lenDiff } - var aPos = a.find(), bPos = b.find() - var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b) - if (fromCmp) { return -fromCmp } - var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b) - if (toCmp) { return toCmp } - return b.id - a.id -} - -// Find out whether a line ends or starts in a collapsed span. If -// so, return the marker for that span. -function collapsedSpanAtSide(line, start) { - var sps = sawCollapsedSpans && line.markedSpans, found - if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { - sp = sps[i] - if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && - (!found || compareCollapsedMarkers(found, sp.marker) < 0)) - { found = sp.marker } - } } - return found -} -function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } -function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } - -// Test whether there exists a collapsed span that partially -// overlaps (covers the start or end, but not both) of a new span. -// Such overlap is not allowed. -function conflictingCollapsedRange(doc, lineNo, from, to, marker) { - var line = getLine(doc, lineNo) - var sps = sawCollapsedSpans && line.markedSpans - if (sps) { for (var i = 0; i < sps.length; ++i) { - var sp = sps[i] - if (!sp.marker.collapsed) { continue } - var found = sp.marker.find(0) - var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker) - var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker) - if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } - if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || - fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) - { return true } - } } -} - -// A visual line is a line as drawn on the screen. Folding, for -// example, can cause multiple logical lines to appear on the same -// visual line. This finds the start of the visual line that the -// given line is part of (usually that is the line itself). -function visualLine(line) { - var merged - while (merged = collapsedSpanAtStart(line)) - { line = merged.find(-1, true).line } - return line -} - -// Returns an array of logical lines that continue the visual line -// started by the argument, or undefined if there are no such lines. -function visualLineContinued(line) { - var merged, lines - while (merged = collapsedSpanAtEnd(line)) { - line = merged.find(1, true).line - ;(lines || (lines = [])).push(line) - } - return lines -} - -// Get the line number of the start of the visual line that the -// given line number is part of. -function visualLineNo(doc, lineN) { - var line = getLine(doc, lineN), vis = visualLine(line) - if (line == vis) { return lineN } - return lineNo(vis) -} - -// Get the line number of the start of the next visual line after -// the given line. -function visualLineEndNo(doc, lineN) { - if (lineN > doc.lastLine()) { return lineN } - var line = getLine(doc, lineN), merged - if (!lineIsHidden(doc, line)) { return lineN } - while (merged = collapsedSpanAtEnd(line)) - { line = merged.find(1, true).line } - return lineNo(line) + 1 -} - -// Compute whether a line is hidden. Lines count as hidden when they -// are part of a visual line that starts with another line, or when -// they are entirely covered by collapsed, non-widget span. -function lineIsHidden(doc, line) { - var sps = sawCollapsedSpans && line.markedSpans - if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { - sp = sps[i] - if (!sp.marker.collapsed) { continue } - if (sp.from == null) { return true } - if (sp.marker.widgetNode) { continue } - if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) - { return true } - } } -} -function lineIsHiddenInner(doc, line, span) { - if (span.to == null) { - var end = span.marker.find(1, true) - return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) - } - if (span.marker.inclusiveRight && span.to == line.text.length) - { return true } - for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { - sp = line.markedSpans[i] - if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && - (sp.to == null || sp.to != span.from) && - (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && - lineIsHiddenInner(doc, line, sp)) { return true } - } -} - -// Find the height above the given line. -function heightAtLine(lineObj) { - lineObj = visualLine(lineObj) - - var h = 0, chunk = lineObj.parent - for (var i = 0; i < chunk.lines.length; ++i) { - var line = chunk.lines[i] - if (line == lineObj) { break } - else { h += line.height } - } - for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { - for (var i$1 = 0; i$1 < p.children.length; ++i$1) { - var cur = p.children[i$1] - if (cur == chunk) { break } - else { h += cur.height } - } - } - return h -} - -// Compute the character length of a line, taking into account -// collapsed ranges (see markText) that might hide parts, and join -// other lines onto it. -function lineLength(line) { - if (line.height == 0) { return 0 } - var len = line.text.length, merged, cur = line - while (merged = collapsedSpanAtStart(cur)) { - var found = merged.find(0, true) - cur = found.from.line - len += found.from.ch - found.to.ch - } - cur = line - while (merged = collapsedSpanAtEnd(cur)) { - var found$1 = merged.find(0, true) - len -= cur.text.length - found$1.from.ch - cur = found$1.to.line - len += cur.text.length - found$1.to.ch - } - return len -} - -// Find the longest line in the document. -function findMaxLine(cm) { - var d = cm.display, doc = cm.doc - d.maxLine = getLine(doc, doc.first) - d.maxLineLength = lineLength(d.maxLine) - d.maxLineChanged = true - doc.iter(function (line) { - var len = lineLength(line) - if (len > d.maxLineLength) { - d.maxLineLength = len - d.maxLine = line - } - }) -} - -// BIDI HELPERS - -function iterateBidiSections(order, from, to, f) { - if (!order) { return f(from, to, "ltr") } - var found = false - for (var i = 0; i < order.length; ++i) { - var part = order[i] - if (part.from < to && part.to > from || from == to && part.to == from) { - f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr") - found = true - } - } - if (!found) { f(from, to, "ltr") } -} - -function bidiLeft(part) { return part.level % 2 ? part.to : part.from } -function bidiRight(part) { return part.level % 2 ? part.from : part.to } - -function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0 } -function lineRight(line) { - var order = getOrder(line) - if (!order) { return line.text.length } - return bidiRight(lst(order)) -} - -function compareBidiLevel(order, a, b) { - var linedir = order[0].level - if (a == linedir) { return true } - if (b == linedir) { return false } - return a < b -} - -var bidiOther = null -function getBidiPartAt(order, pos) { - var found - bidiOther = null - for (var i = 0; i < order.length; ++i) { - var cur = order[i] - if (cur.from < pos && cur.to > pos) { return i } - if ((cur.from == pos || cur.to == pos)) { - if (found == null) { - found = i - } else if (compareBidiLevel(order, cur.level, order[found].level)) { - if (cur.from != cur.to) { bidiOther = found } - return i - } else { - if (cur.from != cur.to) { bidiOther = i } - return found } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + + return direction == "rtl" ? order.reverse() : order } + })(); + + // Get the bidi ordering for the given line (and cache it). Returns + // false for lines that are fully left-to-right, and an array of + // BidiSpan objects otherwise. + function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order } - return found -} - -function moveInLine(line, pos, dir, byUnit) { - if (!byUnit) { return pos + dir } - do { pos += dir } - while (pos > 0 && isExtendingChar(line.text.charAt(pos))) - return pos -} - -// This is needed in order to move 'visually' through bi-directional -// text -- i.e., pressing left should make the cursor go left, even -// when in RTL text. The tricky part is the 'jumps', where RTL and -// LTR text touch each other. This often requires the cursor offset -// to move more than one unit, in order to visually move one unit. -function moveVisually(line, start, dir, byUnit) { - var bidi = getOrder(line) - if (!bidi) { return moveLogically(line, start, dir, byUnit) } - var pos = getBidiPartAt(bidi, start), part = bidi[pos] - var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit) - - for (;;) { - if (target > part.from && target < part.to) { return target } - if (target == part.from || target == part.to) { - if (getBidiPartAt(bidi, target) == pos) { return target } - part = bidi[pos += dir] - return (dir > 0) == part.level % 2 ? part.to : part.from + + // EVENT HANDLING + + // Lightweight event framework. on/off also work on DOM nodes, + // registering native DOM handlers. + + var noHandlers = []; + + var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); } else { - part = bidi[pos += dir] - if (!part) { return null } - if ((dir > 0) == part.level % 2) - { target = moveInLine(line, part.to, -1, byUnit) } - else - { target = moveInLine(line, part.from, 1, byUnit) } - } - } -} - -function moveLogically(line, start, dir, byUnit) { - var target = start + dir - if (byUnit) { while (target > 0 && isExtendingChar(line.text.charAt(target))) { target += dir } } - return target < 0 || target > line.text.length ? null : target -} - -// Bidirectional ordering algorithm -// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm -// that this (partially) implements. - -// One-char codes used for character types: -// L (L): Left-to-Right -// R (R): Right-to-Left -// r (AL): Right-to-Left Arabic -// 1 (EN): European Number -// + (ES): European Number Separator -// % (ET): European Number Terminator -// n (AN): Arabic Number -// , (CS): Common Number Separator -// m (NSM): Non-Spacing Mark -// b (BN): Boundary Neutral -// s (B): Paragraph Separator -// t (S): Segment Separator -// w (WS): Whitespace -// N (ON): Other Neutrals - -// Returns null if characters are ordered as they appear -// (left-to-right), or an array of sections ({from, to, level} -// objects) in the order in which they occur visually. -var bidiOrdering = (function() { - // Character types for codepoints 0 to 0xff - var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN" - // Character types for codepoints 0x600 to 0x6f9 - var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111" - function charType(code) { - if (code <= 0xf7) { return lowTypes.charAt(code) } - else if (0x590 <= code && code <= 0x5f4) { return "R" } - else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } - else if (0x6ee <= code && code <= 0x8ac) { return "r" } - else if (0x2000 <= code && code <= 0x200b) { return "w" } - else if (code == 0x200c) { return "b" } - else { return "L" } - } - - var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/ - var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/ - // Browsers seem to always treat the boundaries of block elements as being L. - var outerType = "L" - - function BidiSpan(level, from, to) { - this.level = level - this.from = from; this.to = to - } - - return function(str) { - if (!bidiRE.test(str)) { return false } - var len = str.length, types = [] - for (var i = 0; i < len; ++i) - { types.push(charType(str.charCodeAt(i))) } - - // W1. Examine each non-spacing mark (NSM) in the level run, and - // change the type of the NSM to the type of the previous - // character. If the NSM is at the start of the level run, it will - // get the type of sor. - for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { - var type = types[i$1] - if (type == "m") { types[i$1] = prev } - else { prev = type } - } - - // W2. Search backwards from each instance of a European number - // until the first strong type (R, L, AL, or sor) is found. If an - // AL is found, change the type of the European number to Arabic - // number. - // W3. Change all ALs to R. - for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { - var type$1 = types[i$2] - if (type$1 == "1" && cur == "r") { types[i$2] = "n" } - else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R" } } - } - - // W4. A single European separator between two European numbers - // changes to a European number. A single common separator between - // two numbers of the same type changes to that type. - for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { - var type$2 = types[i$3] - if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1" } - else if (type$2 == "," && prev$1 == types[i$3+1] && - (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1 } - prev$1 = type$2 - } - - // W5. A sequence of European terminators adjacent to European - // numbers changes to all European numbers. - // W6. Otherwise, separators and terminators change to Other - // Neutral. - for (var i$4 = 0; i$4 < len; ++i$4) { - var type$3 = types[i$4] - if (type$3 == ",") { types[i$4] = "N" } - else if (type$3 == "%") { - var end = (void 0) - for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} - var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N" - for (var j = i$4; j < end; ++j) { types[j] = replace } - i$4 = end - 1 - } - } - - // W7. Search backwards from each instance of a European number - // until the first strong type (R, L, or sor) is found. If an L is - // found, then change the type of the European number to L. - for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { - var type$4 = types[i$5] - if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L" } - else if (isStrong.test(type$4)) { cur$1 = type$4 } - } - - // N1. A sequence of neutrals takes the direction of the - // surrounding strong text if the text on both sides has the same - // direction. European and Arabic numbers act as if they were R in - // terms of their influence on neutrals. Start-of-level-run (sor) - // and end-of-level-run (eor) are used at level run boundaries. - // N2. Any remaining neutrals take the embedding direction. - for (var i$6 = 0; i$6 < len; ++i$6) { - if (isNeutral.test(types[i$6])) { - var end$1 = (void 0) - for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} - var before = (i$6 ? types[i$6-1] : outerType) == "L" - var after = (end$1 < len ? types[end$1] : outerType) == "L" - var replace$1 = before || after ? "L" : "R" - for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1 } - i$6 = end$1 - 1 - } - } - - // Here we depart from the documented algorithm, in order to avoid - // building up an actual levels array. Since there are only three - // levels (0, 1, 2) in an implementation that doesn't take - // explicit embedding into account, we can build up the order on - // the fly, without following the level-based algorithm. - var order = [], m - for (var i$7 = 0; i$7 < len;) { - if (countsAsLeft.test(types[i$7])) { - var start = i$7 - for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} - order.push(new BidiSpan(0, start, i$7)) + var map = emitter._handlers || (emitter._handlers = {}); + map[type] = (map[type] || noHandlers).concat(f); + } + }; + + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map = emitter._handlers, arr = map && map[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } + } + + function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } + } + + // The DOM events that CodeMirror handles can be overridden by + // registering a (non-DOM) handler on the editor for the event name, + // and preventDefault-ing the event in that handler. + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore + } + + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } + } + + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 + } + + // Add on and off methods to a constructor's prototype, to make + // registering events on such objects more convenient. + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; + } + + // Due to the fact that we still support jurassic IE versions, some + // compatibility wrappers are needed. + + function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + + function e_target(e) {return e.target || e.srcElement} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b + } + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div + }(); + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node + } + + // Feature-detect IE's crummy client rect reporting for bidi text + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; } else { - var pos = i$7, at = order.length - for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} - for (var j$2 = pos; j$2 < i$7;) { - if (countsAsNum.test(types[j$2])) { - if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)) } - var nstart = j$2 - for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} - order.splice(at, 0, new BidiSpan(2, nstart, j$2)) - pos = j$2 - } else { ++j$2 } - } - if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)) } + result.push(line); + pos = nl + 1; + } + } + return result + } : function (string) { return string.split(/\r\n?|\n/); }; + + var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } + } : function (te) { + var range; + try {range = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range || range.parentElement() != te) { return false } + return range.compareEndPoints("StartToEnd", range) != 0 + }; + + var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" + })(); + + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 + } + + // Known modes, by name and by MIME + var modes = {}, mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; + } + + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; } } - if (order[0].level == 1 && (m = str.match(/^\s+/))) { - order[0].from = m[0].length - order.unshift(new BidiSpan(0, 0, m[0].length)) + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + } + + function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; } - if (lst(order).level == 1 && (m = str.match(/\s+$/))) { - lst(order).to -= m[0].length - order.push(new BidiSpan(0, len - m[0].length, len)) + return nstate + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; } - if (order[0].level == 2) - { order.unshift(new BidiSpan(1, order[0].to, order[0].to)) } - if (order[0].level != lst(order).level) - { order.push(new BidiSpan(order[0].level, len, len)) } + return info || {mode: mode, state: state} + } - return order + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true } -})() - -// Get the bidi ordering for the given line (and cache it). Returns -// false for lines that are fully left-to-right, and an array of -// BidiSpan objects otherwise. -function getOrder(line) { - var order = line.order - if (order == null) { order = line.order = bidiOrdering(line.text) } - return order -} - -// EVENT HANDLING - -// Lightweight event framework. on/off also work on DOM nodes, -// registering native DOM handlers. - -var noHandlers = [] - -var on = function(emitter, type, f) { - if (emitter.addEventListener) { - emitter.addEventListener(type, f, false) - } else if (emitter.attachEvent) { - emitter.attachEvent("on" + type, f) - } else { - var map = emitter._handlers || (emitter._handlers = {}) - map[type] = (map[type] || noHandlers).concat(f) - } -} - -function getHandlers(emitter, type) { - return emitter._handlers && emitter._handlers[type] || noHandlers -} - -function off(emitter, type, f) { - if (emitter.removeEventListener) { - emitter.removeEventListener(type, f, false) - } else if (emitter.detachEvent) { - emitter.detachEvent("on" + type, f) - } else { - var map = emitter._handlers, arr = map && map[type] - if (arr) { - var index = indexOf(arr, f) - if (index > -1) - { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)) } - } - } -} - -function signal(emitter, type /*, values...*/) { - var handlers = getHandlers(emitter, type) - if (!handlers.length) { return } - var args = Array.prototype.slice.call(arguments, 2) - for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args) } -} - -// The DOM events that CodeMirror handles can be overridden by -// registering a (non-DOM) handler on the editor for the event name, -// and preventDefault-ing the event in that handler. -function signalDOMEvent(cm, e, override) { - if (typeof e == "string") - { e = {type: e, preventDefault: function() { this.defaultPrevented = true }} } - signal(cm, override || e.type, cm, e) - return e_defaultPrevented(e) || e.codemirrorIgnore -} - -function signalCursorActivity(cm) { - var arr = cm._handlers && cm._handlers.cursorActivity - if (!arr) { return } - var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []) - for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) - { set.push(arr[i]) } } -} - -function hasHandler(emitter, type) { - return getHandlers(emitter, type).length > 0 -} - -// Add on and off methods to a constructor's prototype, to make -// registering events on such objects more convenient. -function eventMixin(ctor) { - ctor.prototype.on = function(type, f) {on(this, type, f)} - ctor.prototype.off = function(type, f) {off(this, type, f)} -} - -// Due to the fact that we still support jurassic IE versions, some -// compatibility wrappers are needed. - -function e_preventDefault(e) { - if (e.preventDefault) { e.preventDefault() } - else { e.returnValue = false } -} -function e_stopPropagation(e) { - if (e.stopPropagation) { e.stopPropagation() } - else { e.cancelBubble = true } -} -function e_defaultPrevented(e) { - return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false -} -function e_stop(e) {e_preventDefault(e); e_stopPropagation(e)} - -function e_target(e) {return e.target || e.srcElement} -function e_button(e) { - var b = e.which - if (b == null) { - if (e.button & 1) { b = 1 } - else if (e.button & 2) { b = 3 } - else if (e.button & 4) { b = 2 } - } - if (mac && e.ctrlKey && b == 1) { b = 3 } - return b -} - -// Detect drag-and-drop -var dragAndDrop = function() { - // There is *some* kind of drag-and-drop support in IE6-8, but I - // couldn't get it to work yet. - if (ie && ie_version < 9) { return false } - var div = elt('div') - return "draggable" in div || "dragDrop" in div -}() - -var zwspSupported -function zeroWidthElement(measure) { - if (zwspSupported == null) { - var test = elt("span", "\u200b") - removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])) - if (measure.firstChild.offsetHeight != 0) - { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8) } - } - var node = zwspSupported ? elt("span", "\u200b") : - elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px") - node.setAttribute("cm-text", "") - return node -} - -// Feature-detect IE's crummy client rect reporting for bidi text -var badBidiRects -function hasBadBidiRects(measure) { - if (badBidiRects != null) { return badBidiRects } - var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")) - var r0 = range(txt, 0, 1).getBoundingClientRect() - var r1 = range(txt, 1, 2).getBoundingClientRect() - removeChildren(measure) - if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) - return badBidiRects = (r1.right - r0.right < 3) -} - -// See if "".split is the broken IE version, if so, provide an -// alternative way to split lines. -var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string){ - var pos = 0, result = [], l = string.length - while (pos <= l) { - var nl = string.indexOf("\n", pos) - if (nl == -1) { nl = string.length } - var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl) - var rt = line.indexOf("\r") - if (rt != -1) { - result.push(line.slice(0, rt)) - pos += rt + 1 - } else { - result.push(line) - pos = nl + 1 - } - } - return result -} : function (string) { return string.split(/\r\n?|\n/); } - -var hasSelection = window.getSelection ? function (te) { - try { return te.selectionStart != te.selectionEnd } - catch(e) { return false } -} : function (te) { - var range - try {range = te.ownerDocument.selection.createRange()} - catch(e) {} - if (!range || range.parentElement() != te) { return false } - return range.compareEndPoints("StartToEnd", range) != 0 -} - -var hasCopyEvent = (function () { - var e = elt("div") - if ("oncopy" in e) { return true } - e.setAttribute("oncopy", "return;") - return typeof e.oncopy == "function" -})() - -var badZoomedRects = null -function hasBadZoomedRects(measure) { - if (badZoomedRects != null) { return badZoomedRects } - var node = removeChildrenAndAdd(measure, elt("span", "x")) - var normal = node.getBoundingClientRect() - var fromRange = range(node, 0, 1).getBoundingClientRect() - return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 -} - -var modes = {}; -var mimeModes = {}; -// Extra arguments are stored as the mode's dependencies, which is -// used by (legacy) mechanisms like loadmode.js to automatically -// load a mode. (Preferred mechanism is the require/define calls.) -function defineMode(name, mode) { - if (arguments.length > 2) - { mode.dependencies = Array.prototype.slice.call(arguments, 2) } - modes[name] = mode -} - -function defineMIME(mime, spec) { - mimeModes[mime] = spec -} - -// Given a MIME type, a {name, ...options} config object, or a name -// string, return a mode config object. -function resolveMode(spec) { - if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { - spec = mimeModes[spec] - } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { - var found = mimeModes[spec.name] - if (typeof found == "string") { found = {name: found} } - spec = createObj(found, spec) - spec.name = found.name - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { - return resolveMode("application/xml") - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { - return resolveMode("application/json") - } - if (typeof spec == "string") { return {name: spec} } - else { return spec || {name: "null"} } -} - -// Given a mode spec (anything that resolveMode accepts), find and -// initialize an actual mode object. -function getMode(options, spec) { - spec = resolveMode(spec) - var mfactory = modes[spec.name] - if (!mfactory) { return getMode(options, "text/plain") } - var modeObj = mfactory(options, spec) - if (modeExtensions.hasOwnProperty(spec.name)) { - var exts = modeExtensions[spec.name] - for (var prop in exts) { - if (!exts.hasOwnProperty(prop)) { continue } - if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop] } - modeObj[prop] = exts[prop] - } - } - modeObj.name = spec.name - if (spec.helperType) { modeObj.helperType = spec.helperType } - if (spec.modeProps) { for (var prop$1 in spec.modeProps) - { modeObj[prop$1] = spec.modeProps[prop$1] } } - - return modeObj -} - -// This can be used to attach properties to mode objects from -// outside the actual mode definition. -var modeExtensions = {} -function extendMode(mode, properties) { - var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}) - copyObj(properties, exts) -} - -function copyState(mode, state) { - if (state === true) { return state } - if (mode.copyState) { return mode.copyState(state) } - var nstate = {} - for (var n in state) { - var val = state[n] - if (val instanceof Array) { val = val.concat([]) } - nstate[n] = val - } - return nstate -} - -// Given a mode and a state (for that mode), find the inner mode and -// state at the position that the state refers to. -function innerMode(mode, state) { - var info - while (mode.innerMode) { - info = mode.innerMode(state) - if (!info || info.mode == mode) { break } - state = info.state - mode = info.mode - } - return info || {mode: mode, state: state} -} - -function startState(mode, a1, a2) { - return mode.startState ? mode.startState(a1, a2) : true -} - -// STRING STREAM - -// Fed to the mode parsers, provides helper functions to make -// parsers more succinct. - -var StringStream = function(string, tabSize) { - this.pos = this.start = 0 - this.string = string - this.tabSize = tabSize || 8 - this.lastColumnPos = this.lastColumnValue = 0 - this.lineStart = 0 -} - -StringStream.prototype = { - eol: function() {return this.pos >= this.string.length}, - sol: function() {return this.pos == this.lineStart}, - peek: function() {return this.string.charAt(this.pos) || undefined}, - next: function() { + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + + StringStream.prototype.eol = function () {return this.pos >= this.string.length}; + StringStream.prototype.sol = function () {return this.pos == this.lineStart}; + StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; + StringStream.prototype.next = function () { if (this.pos < this.string.length) { return this.string.charAt(this.pos++) } - }, - eat: function(match) { - var ch = this.string.charAt(this.pos) - var ok - if (typeof match == "string") { ok = ch == match } - else { ok = ch && (match.test ? match.test(ch) : match(ch)) } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } if (ok) {++this.pos; return ch} - }, - eatWhile: function(match) { - var start = this.pos + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; while (this.eat(match)){} return this.pos > start - }, - eatSpace: function() { - var this$1 = this; - - var start = this.pos - while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos } + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; } return this.pos > start - }, - skipToEnd: function() {this.pos = this.string.length}, - skipTo: function(ch) { - var found = this.string.indexOf(ch, this.pos) + }; + StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); if (found > -1) {this.pos = found; return true} - }, - backUp: function(n) {this.pos -= n}, - column: function() { + }; + StringStream.prototype.backUp = function (n) {this.pos -= n;}; + StringStream.prototype.column = function () { if (this.lastColumnPos < this.start) { - this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue) - this.lastColumnPos = this.start + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; } return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) - }, - indentation: function() { + }; + StringStream.prototype.indentation = function () { return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) - }, - match: function(pattern, consume, caseInsensitive) { + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { if (typeof pattern == "string") { - var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; } - var substr = this.string.substr(this.pos, pattern.length) + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); if (cased(substr) == cased(pattern)) { - if (consume !== false) { this.pos += pattern.length } + if (consume !== false) { this.pos += pattern.length; } return true } } else { - var match = this.string.slice(this.pos).match(pattern) + var match = this.string.slice(this.pos).match(pattern); if (match && match.index > 0) { return null } - if (match && consume !== false) { this.pos += match[0].length } + if (match && consume !== false) { this.pos += match[0].length; } return match } - }, - current: function(){return this.string.slice(this.start, this.pos)}, - hideFirstChars: function(n, inner) { - this.lineStart += n + }; + StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; try { return inner() } - finally { this.lineStart -= n } - } -} - -// Compute a style array (an array starting with a mode generation -// -- for invalidation -- followed by pairs of end positions and -// style strings), which is used to highlight the tokens on the -// line. -function highlightLine(cm, line, state, forceToEnd) { - // A styles array always starts with a number identifying the - // mode/overlays that it is based on (for easy invalidation). - var st = [cm.state.modeGen], lineClasses = {} - // Compute the base array of styles - runMode(cm, line.text, cm.doc.mode, state, function (end, style) { return st.push(end, style); }, - lineClasses, forceToEnd) - - // Run overlays, adjust style array. - var loop = function ( o ) { - var overlay = cm.state.overlays[o], i = 1, at = 0 - runMode(cm, line.text, overlay.mode, true, function (end, style) { - var start = i - // Ensure there's a token end at the current position, and that i points at it - while (at < end) { - var i_end = st[i] - if (i_end > end) - { st.splice(i, 1, end, st[i+1], i_end) } - i += 2 - at = Math.min(end, i_end) - } - if (!style) { return } - if (overlay.opaque) { - st.splice(start, i - start, end, "overlay " + style) - i = start + 2 - } else { - for (; start < i; start += 2) { - var cur = st[start+1] - st[start+1] = (cur ? cur + " " : "") + "overlay " + style - } + finally { this.lineStart -= n; } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + // Find the line object corresponding to the given line number. + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] + } + + // Get the part of a document between two positions, as an array of + // strings. + function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out + } + // Get the lines between from and to, as array of strings. + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out + } + + // Update the height of a line, propagating the height change + // upwards to parent nodes. + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } + } + + // Given a line object, find its line number by walking up through + // its parent links. + function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first + } + + // Find the line at the given vertical position, using the height + // information in the document tree. + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); } - }, lineClasses) + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i + } + + function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) + } + + // A Pos instance represents a position within the text. + function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + + // Compare two positions, return 0 if they are the same, a negative + // number when a is less, and a positive number otherwise. + function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + + function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + + function copyPos(x) {return Pos(x.line, x.ch)} + function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } + function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + + // Most of the external API clips given positions to make sure they + // actually exist within the document. + function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} + function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } + } + function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out + } + + var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; }; - for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); - - return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} -} - -function getLineStyles(cm, line, updateFrontier) { - if (!line.styles || line.styles[0] != cm.state.modeGen) { - var state = getStateBefore(cm, lineNo(line)) - var result = highlightLine(cm, line, line.text.length > cm.options.maxHighlightLength ? copyState(cm.doc.mode, state) : state) - line.stateAfter = state - line.styles = result.styles - if (result.classes) { line.styleClasses = result.classes } - else if (line.styleClasses) { line.styleClasses = null } - if (updateFrontier === cm.doc.frontier) { cm.doc.frontier++ } - } - return line.styles -} - -function getStateBefore(cm, n, precise) { - var doc = cm.doc, display = cm.display - if (!doc.mode.startState) { return true } - var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter - if (!state) { state = startState(doc.mode) } - else { state = copyState(doc.mode, state) } - doc.iter(pos, n, function (line) { - processLine(cm, line.text, state) - var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo - line.stateAfter = save ? copyState(doc.mode, state) : null - ++pos - }) - if (precise) { doc.frontier = pos } - return state -} - -// Lightweight form of highlight -- proceed over this line and -// update state, but don't save a style array. Used for lines that -// aren't currently visible. -function processLine(cm, text, state, startAt) { - var mode = cm.doc.mode - var stream = new StringStream(text, cm.options.tabSize) - stream.start = stream.pos = startAt || 0 - if (text == "") { callBlankLine(mode, state) } - while (!stream.eol()) { - readToken(mode, stream, state) - stream.start = stream.pos - } -} - -function callBlankLine(mode, state) { - if (mode.blankLine) { return mode.blankLine(state) } - if (!mode.innerMode) { return } - var inner = innerMode(mode, state) - if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } -} - -function readToken(mode, stream, state, inner) { - for (var i = 0; i < 10; i++) { - if (inner) { inner[0] = innerMode(mode, state).mode } - var style = mode.token(stream, state) - if (stream.pos > stream.start) { return style } - } - throw new Error("Mode " + mode.name + " failed to advance stream.") -} - -// Utility for getTokenAt and getLineTokens -function takeToken(cm, pos, precise, asArray) { - var getObj = function (copy) { return ({ - start: stream.start, end: stream.pos, - string: stream.current(), - type: style || null, - state: copy ? copyState(doc.mode, state) : state - }); } - - var doc = cm.doc, mode = doc.mode, style - pos = clipPos(doc, pos) - var line = getLine(doc, pos.line), state = getStateBefore(cm, pos.line, precise) - var stream = new StringStream(line.text, cm.options.tabSize), tokens - if (asArray) { tokens = [] } - while ((asArray || stream.pos < pos.ch) && !stream.eol()) { - stream.start = stream.pos - style = readToken(mode, stream, state) - if (asArray) { tokens.push(getObj(true)) } - } - return asArray ? tokens : getObj() -} - -function extractLineClasses(type, output) { - if (type) { for (;;) { - var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/) - if (!lineClass) { break } - type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length) - var prop = lineClass[1] ? "bgClass" : "textClass" - if (output[prop] == null) - { output[prop] = lineClass[2] } - else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop])) - { output[prop] += " " + lineClass[2] } - } } - return type -} - -// Run the given mode's parser over a line, calling f for each token. -function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) { - var flattenSpans = mode.flattenSpans - if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans } - var curStart = 0, curStyle = null - var stream = new StringStream(text, cm.options.tabSize), style - var inner = cm.options.addModeClass && [null] - if (text == "") { extractLineClasses(callBlankLine(mode, state), lineClasses) } - while (!stream.eol()) { - if (stream.pos > cm.options.maxHighlightLength) { - flattenSpans = false - if (forceToEnd) { processLine(cm, text, state, stream.pos) } - stream.pos = text.length - style = null - } else { - style = extractLineClasses(readToken(mode, stream, state, inner), lineClasses) - } - if (inner) { - var mName = inner[0].name - if (mName) { style = "m-" + (style ? mName + " " + style : mName) } - } - if (!flattenSpans || curStyle != style) { - while (curStart < stream.start) { - curStart = Math.min(stream.start, curStart + 5000) - f(curStart, curStyle) - } - curStyle = style - } - stream.start = stream.pos - } - while (curStart < stream.pos) { - // Webkit seems to refuse to render text nodes longer than 57444 - // characters, and returns inaccurate measurements in nodes - // starting around 5000 chars. - var pos = Math.min(stream.pos, curStart + 5000) - f(pos, curStyle) - curStart = pos - } -} - -// Finds the line to start with when starting a parse. Tries to -// find a line with a stateAfter, so that it can start with a -// valid state. If that fails, it returns the line with the -// smallest indentation, which tends to need the least context to -// parse correctly. -function findStartLine(cm, n, precise) { - var minindent, minline, doc = cm.doc - var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100) - for (var search = n; search > lim; --search) { - if (search <= doc.first) { return doc.first } - var line = getLine(doc, search - 1) - if (line.stateAfter && (!precise || search <= doc.frontier)) { return search } - var indented = countColumn(line.text, null, cm.options.tabSize) - if (minline == null || minindent > indented) { - minline = search - 1 - minindent = indented - } - } - return minline -} - -// LINE DATA STRUCTURE - -// Line objects. These hold state related to a line, including -// highlighting info (the styles array). -function Line(text, markedSpans, estimateHeight) { - this.text = text - attachMarkedSpans(this, markedSpans) - this.height = estimateHeight ? estimateHeight(this) : 1 -} -eventMixin(Line) -Line.prototype.lineNo = function() { return lineNo(this) } - -// Change the content (text, markers) of a line. Automatically -// invalidates cached information and tries to re-estimate the -// line's height. -function updateLine(line, text, markedSpans, estimateHeight) { - line.text = text - if (line.stateAfter) { line.stateAfter = null } - if (line.styles) { line.styles = null } - if (line.order != null) { line.order = null } - detachMarkedSpans(line) - attachMarkedSpans(line, markedSpans) - var estHeight = estimateHeight ? estimateHeight(line) : 1 - if (estHeight != line.height) { updateLineHeight(line, estHeight) } -} - -// Detach a line from the document tree and its markers. -function cleanUpLine(line) { - line.parent = null - detachMarkedSpans(line) -} - -// Convert a style as returned by a mode (either null, or a string -// containing one or more styles) to a CSS style. This is cached, -// and also looks for line-wide styles. -var styleToClassCache = {}; -var styleToClassCacheWithMode = {}; -function interpretTokenStyle(style, options) { - if (!style || /^\s*$/.test(style)) { return null } - var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache - return cache[style] || - (cache[style] = style.replace(/\S+/g, "cm-$&")) -} - -// Render the DOM representation of the text of a line. Also builds -// up a 'line map', which points at the DOM nodes that represent -// specific stretches of text, and is used by the measuring code. -// The returned object contains the DOM node, this map, and -// information about line-wide styles that were set by the mode. -function buildLineContent(cm, lineView) { - // The padding-right forces the element to have a 'border', which - // is needed on Webkit to be able to get line-level bounding - // rectangles for it (in measureChar). - var content = elt("span", null, null, webkit ? "padding-right: .1px" : null) - var builder = {pre: elt("pre", [content], "CodeMirror-line"), content: content, - col: 0, pos: 0, cm: cm, - trailingSpace: false, - splitSpaces: (ie || webkit) && cm.getOption("lineWrapping")} - // hide from accessibility tree - content.setAttribute("role", "presentation") - builder.pre.setAttribute("role", "presentation") - lineView.measure = {} - - // Iterate over the logical lines that make up this visual line. - for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { - var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0) - builder.pos = 0 - builder.addToken = buildToken - // Optionally wire in some hacks into the token-rendering - // algorithm, to deal with browser quirks. - if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line))) - { builder.addToken = buildTokenBadBidi(builder.addToken, order) } - builder.map = [] - var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line) - insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)) - if (line.styleClasses) { - if (line.styleClasses.bgClass) - { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "") } - if (line.styleClasses.textClass) - { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "") } - } - - // Ensure at least a single node is present, for measuring. - if (builder.map.length == 0) - { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))) } - - // Store the map and a cache object for the current logical line - if (i == 0) { - lineView.measure.map = builder.map - lineView.measure.cache = {} - } else { - ;(lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) - ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}) - } - } - - // See issue #2901 - if (webkit) { - var last = builder.content.lastChild - if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) - { builder.content.className = "cm-tab-wrap-hack" } - } - - signal(cm, "renderLine", cm, lineView.line, builder.pre) - if (builder.pre.className) - { builder.textClass = joinClasses(builder.pre.className, builder.textClass || "") } - - return builder -} - -function defaultSpecialCharPlaceholder(ch) { - var token = elt("span", "\u2022", "cm-invalidchar") - token.title = "\\u" + ch.charCodeAt(0).toString(16) - token.setAttribute("aria-label", token.title) - return token -} - -// Build up the DOM representation for a single token, and add it to -// the line map. Takes care to render special characters separately. -function buildToken(builder, text, style, startStyle, endStyle, title, css) { - if (!text) { return } - var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text - var special = builder.cm.state.specialChars, mustWrap = false - var content - if (!special.test(text)) { - builder.col += text.length - content = document.createTextNode(displayText) - builder.map.push(builder.pos, builder.pos + text.length, content) - if (ie && ie_version < 9) { mustWrap = true } - builder.pos += text.length - } else { - content = document.createDocumentFragment() - var pos = 0 - while (true) { - special.lastIndex = pos - var m = special.exec(text) - var skipped = m ? m.index - pos : text.length - pos - if (skipped) { - var txt = document.createTextNode(displayText.slice(pos, pos + skipped)) - if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])) } - else { content.appendChild(txt) } - builder.map.push(builder.pos, builder.pos + skipped, txt) - builder.col += skipped - builder.pos += skipped - } - if (!m) { break } - pos += skipped + 1 - var txt$1 = (void 0) - if (m[0] == "\t") { - var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize - txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")) - txt$1.setAttribute("role", "presentation") - txt$1.setAttribute("cm-text", "\t") - builder.col += tabWidth - } else if (m[0] == "\r" || m[0] == "\n") { - txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")) - txt$1.setAttribute("cm-text", m[0]) - builder.col += 1 - } else { - txt$1 = builder.cm.options.specialCharPlaceholder(m[0]) - txt$1.setAttribute("cm-text", m[0]) - if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])) } - else { content.appendChild(txt$1) } - builder.col += 1 - } - builder.map.push(builder.pos, builder.pos + 1, txt$1) - builder.pos++ - } - } - builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32 - if (style || startStyle || endStyle || mustWrap || css) { - var fullStyle = style || "" - if (startStyle) { fullStyle += startStyle } - if (endStyle) { fullStyle += endStyle } - var token = elt("span", [content], fullStyle, css) - if (title) { token.title = title } - return builder.content.appendChild(token) - } - builder.content.appendChild(content) -} - -function splitSpaces(text, trailingBefore) { - if (text.length > 1 && !/ /.test(text)) { return text } - var spaceBefore = trailingBefore, result = "" - for (var i = 0; i < text.length; i++) { - var ch = text.charAt(i) - if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) - { ch = "\u00a0" } - result += ch - spaceBefore = ch == " " - } - return result -} - -// Work around nonsense dimensions being reported for stretches of -// right-to-left text. -function buildTokenBadBidi(inner, order) { - return function (builder, text, style, startStyle, endStyle, title, css) { - style = style ? style + " cm-force-border" : "cm-force-border" - var start = builder.pos, end = start + text.length - for (;;) { - // Find the part that overlaps with the start of this text - var part = (void 0) - for (var i = 0; i < order.length; i++) { - part = order[i] - if (part.to > start && part.from <= start) { break } - } - if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, title, css) } - inner(builder, text.slice(0, part.to - start), style, startStyle, null, title, css) - startStyle = null - text = text.slice(part.to - start) - start = part.to - } - } -} - -function buildCollapsedSpan(builder, size, marker, ignoreWidget) { - var widget = !ignoreWidget && marker.widgetNode - if (widget) { builder.map.push(builder.pos, builder.pos + size, widget) } - if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { - if (!widget) - { widget = builder.content.appendChild(document.createElement("span")) } - widget.setAttribute("cm-marker", marker.id) - } - if (widget) { - builder.cm.display.input.setUneditable(widget) - builder.content.appendChild(widget) - } - builder.pos += size - builder.trailingSpace = false -} - -// Outputs a number of spans to make up a line, taking highlighting -// and marked text into account. -function insertLineContent(line, builder, styles) { - var spans = line.markedSpans, allText = line.text, at = 0 - if (!spans) { - for (var i$1 = 1; i$1 < styles.length; i$1+=2) - { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)) } - return - } - - var len = allText.length, pos = 0, i = 1, text = "", style, css - var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed - for (;;) { - if (nextChange == pos) { // Update current marker set - spanStyle = spanEndStyle = spanStartStyle = title = css = "" - collapsed = null; nextChange = Infinity - var foundBookmarks = [], endStyles = (void 0) - for (var j = 0; j < spans.length; ++j) { - var sp = spans[j], m = sp.marker - if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { - foundBookmarks.push(m) - } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { - if (sp.to != null && sp.to != pos && nextChange > sp.to) { - nextChange = sp.to - spanEndStyle = "" + var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line + }; + + Context.prototype.baseToken = function (n) { + if (!this.baseTokens) { return null } + while (this.baseTokens[this.baseTokenPos] <= n) + { this.baseTokenPos += 2; } + var type = this.baseTokens[this.baseTokenPos + 1]; + return {type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n} + }; + + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } + }; + + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } + }; + + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state + }; + + + // Compute a style array (an array starting with a mode generation + // -- for invalidation -- followed by pairs of end positions and + // style strings), which is used to highlight the tokens on the + // line. + function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + context.baseTokens = st; + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; } - if (m.className) { spanStyle += " " + m.className } - if (m.css) { css = (css ? css + ";" : "") + m.css } - if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle } - if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to) } - if (m.title && !title) { title = m.title } - if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) - { collapsed = sp } - } else if (sp.from > pos && nextChange > sp.from) { - nextChange = sp.from } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} + } + + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles + } + + function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. Used for lines that + // aren't currently visible. + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + + function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } + } + + function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") + } + + var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + + // Utility for getTokenAt and getLineTokens + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) + } + + function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type + } + + // Run the given mode's parser over a line, calling f for each token. + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; } - if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) - { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1] } } } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline + } - if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) - { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]) } } - if (collapsed && (collapsed.from || 0) == pos) { - buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, - collapsed.marker, collapsed.from == null) - if (collapsed.to == null) { return } - if (collapsed.to == pos) { collapsed = false } + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break } } - if (pos >= len) { break } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + + // Optimize some code when these features are not used. + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + + // TEXTMARKER SPANS + + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; + } + + // Search an array of spans for a span matching the given marker. + function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } + } + + // Remove a span from an array, returning undefined if no spans are + // left (we don't store arrays for lines without spans). + function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r + } - var upto = Math.min(len, nextChange) - while (true) { - if (text) { - var end = pos + text.length - if (!collapsed) { - var tokenText = end > upto ? text.slice(0, upto - pos) : text - builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, - spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title, css) + // Add a span to a line. + function addMarkedSpan(line, span, op) { + var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet)); + if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { + line.markedSpans.push(span); + } else { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + if (inThisOp) { inThisOp.add(line.markedSpans); } + } + span.marker.attachLine(line); + } + + // Used for the algorithm that adjusts markers for a change in the + // document. These functions cut an array of spans at a given + // character position, returning an array of remaining chunks (or + // undefined if nothing remains). + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw + } + + // Given a change object, compute the new set of marker spans that + // cover the line in which the change took place. Removes spans + // entirely within the change, reconnects spans belonging to the + // same marker that appear on both sides of the change, and cuts off + // spans partially within the change. Returns an array of span + // arrays with one element for each line in (after) the change. + function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } } - if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} - pos = end - spanStartStyle = "" - } - text = allText.slice(at, at = styles[i++]) - style = interpretTokenStyle(styles[i++], builder.cm.options) - } - } -} - - -// These objects are used to represent the visible (currently drawn) -// part of the document. A LineView may correspond to multiple -// logical lines, if those are connected by collapsed ranges. -function LineView(doc, line, lineN) { - // The starting line - this.line = line - // Continuing lines, if any - this.rest = visualLineContinued(line) - // Number of logical lines in this visual line - this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1 - this.node = this.text = null - this.hidden = lineIsHidden(doc, line) -} - -// Create a range of LineView objects for the given lines. -function buildViewArray(cm, from, to) { - var array = [], nextPos - for (var pos = from; pos < to; pos = nextPos) { - var view = new LineView(cm.doc, getLine(cm.doc, pos), pos) - nextPos = pos + view.size - array.push(view) - } - return array -} - -var operationGroup = null - -function pushOperation(op) { - if (operationGroup) { - operationGroup.ops.push(op) - } else { - op.ownsGroup = operationGroup = { - ops: [op], - delayedCallbacks: [] - } - } -} - -function fireCallbacksForOps(group) { - // Calls delayed callbacks and cursorActivity handlers until no - // new ones appear - var callbacks = group.delayedCallbacks, i = 0 - do { - for (; i < callbacks.length; i++) - { callbacks[i].call(null) } - for (var j = 0; j < group.ops.length; j++) { - var op = group.ops[j] - if (op.cursorActivityHandlers) - { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) - { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm) } } - } - } while (i < callbacks.length) -} - -function finishOperation(op, endCb) { - var group = op.ownsGroup - if (!group) { return } - - try { fireCallbacksForOps(group) } - finally { - operationGroup = null - endCb(group) - } -} - -var orphanDelayedCallbacks = null - -// Often, we want to signal events at a point where we are in the -// middle of some work, but don't want the handler to start calling -// other methods on the editor, which might be in an inconsistent -// state or simply not expect any other events to happen. -// signalLater looks whether there are any handlers, and schedules -// them to be executed when the last operation ends, or, if no -// operation is active, when a timeout fires. -function signalLater(emitter, type /*, values...*/) { - var arr = getHandlers(emitter, type) - if (!arr.length) { return } - var args = Array.prototype.slice.call(arguments, 2), list - if (operationGroup) { - list = operationGroup.delayedCallbacks - } else if (orphanDelayedCallbacks) { - list = orphanDelayedCallbacks - } else { - list = orphanDelayedCallbacks = [] - setTimeout(fireOrphanDelayed, 0) - } - var loop = function ( i ) { - list.push(function () { return arr[i].apply(null, args); }) - }; + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers + } + + // Remove spans that are empty and don't have a clearWhenEmpty + // option of false. + function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans + } + + // Used to 'clip' out readOnly ranges when making a change. + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts + } - for (var i = 0; i < arr.length; ++i) - loop( i ); -} - -function fireOrphanDelayed() { - var delayed = orphanDelayedCallbacks - orphanDelayedCallbacks = null - for (var i = 0; i < delayed.length; ++i) { delayed[i]() } -} - -// When an aspect of a line changes, a string is added to -// lineView.changes. This updates the relevant part of the line's -// DOM structure. -function updateLineForChanges(cm, lineView, lineN, dims) { - for (var j = 0; j < lineView.changes.length; j++) { - var type = lineView.changes[j] - if (type == "text") { updateLineText(cm, lineView) } - else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims) } - else if (type == "class") { updateLineClasses(lineView) } - else if (type == "widget") { updateLineWidgets(cm, lineView, dims) } - } - lineView.changes = null -} - -// Lines with gutter elements, widgets or a background class need to -// be wrapped, and have the extra elements added to the wrapper div -function ensureLineWrapped(lineView) { - if (lineView.node == lineView.text) { - lineView.node = elt("div", null, null, "position: relative") - if (lineView.text.parentNode) - { lineView.text.parentNode.replaceChild(lineView.node, lineView.text) } - lineView.node.appendChild(lineView.text) - if (ie && ie_version < 8) { lineView.node.style.zIndex = 2 } - } - return lineView.node -} - -function updateLineBackground(lineView) { - var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass - if (cls) { cls += " CodeMirror-linebackground" } - if (lineView.background) { - if (cls) { lineView.background.className = cls } - else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null } - } else if (cls) { - var wrap = ensureLineWrapped(lineView) - lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild) - } -} - -// Wrapper around buildLineContent which will reuse the structure -// in display.externalMeasured when possible. -function getLineContent(cm, lineView) { - var ext = cm.display.externalMeasured - if (ext && ext.line == lineView.line) { - cm.display.externalMeasured = null - lineView.measure = ext.measure - return ext.built - } - return buildLineContent(cm, lineView) -} - -// Redraw the line's text. Interacts with the background and text -// classes because the mode may output tokens that influence these -// classes. -function updateLineText(cm, lineView) { - var cls = lineView.text.className - var built = getLineContent(cm, lineView) - if (lineView.text == lineView.node) { lineView.node = built.pre } - lineView.text.parentNode.replaceChild(built.pre, lineView.text) - lineView.text = built.pre - if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { - lineView.bgClass = built.bgClass - lineView.textClass = built.textClass - updateLineClasses(lineView) - } else if (cls) { - lineView.text.className = cls - } -} - -function updateLineClasses(lineView) { - updateLineBackground(lineView) - if (lineView.line.wrapClass) - { ensureLineWrapped(lineView).className = lineView.line.wrapClass } - else if (lineView.node != lineView.text) - { lineView.node.className = "" } - var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass - lineView.text.className = textClass || "" -} - -function updateLineGutter(cm, lineView, lineN, dims) { - if (lineView.gutter) { - lineView.node.removeChild(lineView.gutter) - lineView.gutter = null - } - if (lineView.gutterBackground) { - lineView.node.removeChild(lineView.gutterBackground) - lineView.gutterBackground = null - } - if (lineView.line.gutterClass) { - var wrap = ensureLineWrapped(lineView) - lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, - ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")) - wrap.insertBefore(lineView.gutterBackground, lineView.text) - } - var markers = lineView.line.gutterMarkers - if (cm.options.lineNumbers || markers) { - var wrap$1 = ensureLineWrapped(lineView) - var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")) - cm.display.input.setUneditable(gutterWrap) - wrap$1.insertBefore(gutterWrap, lineView.text) - if (lineView.line.gutterClass) - { gutterWrap.className += " " + lineView.line.gutterClass } - if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) - { lineView.lineNumber = gutterWrap.appendChild( - elt("div", lineNumberFor(cm.options, lineN), - "CodeMirror-linenumber CodeMirror-gutter-elt", - ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))) } - if (markers) { for (var k = 0; k < cm.options.gutters.length; ++k) { - var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id] - if (found) - { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", - ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))) } + // Connect or disconnect spans from a line. + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; + } + + // Helpers used when computing which overlapping collapsed span + // counts as the larger one. + function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } + function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + + // Returns a number indicating which of two overlapping collapsed + // spans is larger (and thus includes the other). Falls back to + // comparing ids when the spans cover exactly the same range. + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id + } + + // Find out whether a line ends or starts in a collapsed span. If + // so, return the marker for that span. + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } } } + return found } -} - -function updateLineWidgets(cm, lineView, dims) { - if (lineView.alignable) { lineView.alignable = null } - for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { - next = node.nextSibling - if (node.className == "CodeMirror-linewidget") - { lineView.node.removeChild(node) } - } - insertLineWidgets(cm, lineView, dims) -} - -// Build a line's DOM representation from scratch -function buildLineElement(cm, lineView, lineN, dims) { - var built = getLineContent(cm, lineView) - lineView.text = lineView.node = built.pre - if (built.bgClass) { lineView.bgClass = built.bgClass } - if (built.textClass) { lineView.textClass = built.textClass } - - updateLineClasses(lineView) - updateLineGutter(cm, lineView, lineN, dims) - insertLineWidgets(cm, lineView, dims) - return lineView.node -} - -// A lineView may contain multiple logical lines (when merged by -// collapsed spans). The widgets for all of them need to be drawn. -function insertLineWidgets(cm, lineView, dims) { - insertLineWidgetsFor(cm, lineView.line, lineView, dims, true) - if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) - { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false) } } -} - -function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { - if (!line.widgets) { return } - var wrap = ensureLineWrapped(lineView) - for (var i = 0, ws = line.widgets; i < ws.length; ++i) { - var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget") - if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true") } - positionLineWidget(widget, node, lineView, dims) - cm.display.input.setUneditable(node) - if (allowAbove && widget.above) - { wrap.insertBefore(node, lineView.gutter || lineView.text) } - else - { wrap.appendChild(node) } - signalLater(widget, "redraw") - } -} - -function positionLineWidget(widget, node, lineView, dims) { - if (widget.noHScroll) { - ;(lineView.alignable || (lineView.alignable = [])).push(node) - var width = dims.wrapperWidth - node.style.left = dims.fixedPos + "px" - if (!widget.coverGutter) { - width -= dims.gutterTotalWidth - node.style.paddingLeft = dims.gutterTotalWidth + "px" - } - node.style.width = width + "px" - } - if (widget.coverGutter) { - node.style.zIndex = 5 - node.style.position = "relative" - if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px" } - } -} - -function widgetHeight(widget) { - if (widget.height != null) { return widget.height } - var cm = widget.doc.cm - if (!cm) { return 0 } - if (!contains(document.body, widget.node)) { - var parentStyle = "position: relative;" - if (widget.coverGutter) - { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;" } - if (widget.noHScroll) - { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;" } - removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)) - } - return widget.height = widget.node.parentNode.offsetHeight -} - -// Return true when the given mouse event happened in a widget -function eventInWidget(display, e) { - for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { - if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || - (n.parentNode == display.sizer && n != display.mover)) - { return true } + function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } + function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } + } } + return found } -} - -// POSITION MEASUREMENT - -function paddingTop(display) {return display.lineSpace.offsetTop} -function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} -function paddingH(display) { - if (display.cachedPaddingH) { return display.cachedPaddingH } - var e = removeChildrenAndAdd(display.measure, elt("pre", "x")) - var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle - var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)} - if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data } - return data -} - -function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } -function displayWidth(cm) { - return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth -} -function displayHeight(cm) { - return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight -} - -// Ensure the lineView.wrapping.heights array is populated. This is -// an array of bottom offsets for the lines that make up a drawn -// line. When lineWrapping is on, there might be more than one -// height. -function ensureLineHeights(cm, lineView, rect) { - var wrapping = cm.options.lineWrapping - var curWidth = wrapping && displayWidth(cm) - if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { - var heights = lineView.measure.heights = [] - if (wrapping) { - lineView.measure.width = curWidth - var rects = lineView.text.firstChild.getClientRects() - for (var i = 0; i < rects.length - 1; i++) { - var cur = rects[i], next = rects[i + 1] - if (Math.abs(cur.bottom - next.bottom) > 2) - { heights.push((cur.bottom + next.top) / 2 - rect.top) } - } - } - heights.push(rect.bottom - rect.top) - } -} - -// Find a line map (mapping character offsets to text nodes) and a -// measurement cache for the given line number. (A line view might -// contain multiple lines when collapsed ranges are present.) -function mapFromLineView(lineView, line, lineN) { - if (lineView.line == line) - { return {map: lineView.measure.map, cache: lineView.measure.cache} } - for (var i = 0; i < lineView.rest.length; i++) - { if (lineView.rest[i] == line) - { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } - for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) - { if (lineNo(lineView.rest[i$1]) > lineN) - { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } -} - -// Render a line into the hidden node display.externalMeasured. Used -// when measurement is needed for a line that's not in the viewport. -function updateExternalMeasurement(cm, line) { - line = visualLine(line) - var lineN = lineNo(line) - var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN) - view.lineN = lineN - var built = view.built = buildLineContent(cm, view) - view.text = built.pre - removeChildrenAndAdd(cm.display.lineMeasure, built.pre) - return view -} - -// Get a {top, bottom, left, right} box (in line-local coordinates) -// for a given character. -function measureChar(cm, line, ch, bias) { - return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) -} - -// Find a line view that corresponds to the given line number. -function findViewForLine(cm, lineN) { - if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) - { return cm.display.view[findViewIndex(cm, lineN)] } - var ext = cm.display.externalMeasured - if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) - { return ext } -} - -// Measurement can be split in two steps, the set-up work that -// applies to the whole line, and the measurement of the actual -// character. Functions like coordsChar, that need to do a lot of -// measurements in a row, can thus ensure that the set-up work is -// only done once. -function prepareMeasureForLine(cm, line) { - var lineN = lineNo(line) - var view = findViewForLine(cm, lineN) - if (view && !view.text) { - view = null - } else if (view && view.changes) { - updateLineForChanges(cm, view, lineN, getDimensions(cm)) - cm.curOp.forceUpdate = true - } - if (!view) - { view = updateExternalMeasurement(cm, line) } - - var info = mapFromLineView(view, line, lineN) - return { - line: line, view: view, rect: null, - map: info.map, cache: info.cache, before: info.before, - hasHeights: false - } -} - -// Given a prepared measurement object, measures the position of an -// actual character (or fetches it from the cache). -function measureCharPrepared(cm, prepared, ch, bias, varHeight) { - if (prepared.before) { ch = -1 } - var key = ch + (bias || ""), found - if (prepared.cache.hasOwnProperty(key)) { - found = prepared.cache[key] - } else { - if (!prepared.rect) - { prepared.rect = prepared.view.text.getBoundingClientRect() } - if (!prepared.hasHeights) { - ensureLineHeights(cm, prepared.view, prepared.rect) - prepared.hasHeights = true - } - found = measureCharInner(cm, prepared, ch, bias) - if (!found.bogus) { prepared.cache[key] = found } - } - return {left: found.left, right: found.right, - top: varHeight ? found.rtop : found.top, - bottom: varHeight ? found.rbottom : found.bottom} -} - -var nullRect = {left: 0, right: 0, top: 0, bottom: 0} - -function nodeAndOffsetInLineMap(map, ch, bias) { - var node, start, end, collapse, mStart, mEnd - // First, search the line map for the text node corresponding to, - // or closest to, the target character. - for (var i = 0; i < map.length; i += 3) { - mStart = map[i] - mEnd = map[i + 1] - if (ch < mStart) { - start = 0; end = 1 - collapse = "left" - } else if (ch < mEnd) { - start = ch - mStart - end = start + 1 - } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { - end = mEnd - mStart - start = end - 1 - if (ch >= mEnd) { collapse = "right" } - } - if (start != null) { - node = map[i + 2] - if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) - { collapse = bias } - if (bias == "left" && start == 0) - { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { - node = map[(i -= 3) + 2] - collapse = "left" - } } - if (bias == "right" && start == mEnd - mStart) - { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { - node = map[(i += 3) + 2] - collapse = "right" - } } - break - } - } - return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} -} - -function getUsefulRect(rects, bias) { - var rect = nullRect - if (bias == "left") { for (var i = 0; i < rects.length; i++) { - if ((rect = rects[i]).left != rect.right) { break } - } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { - if ((rect = rects[i$1]).left != rect.right) { break } - } } - return rect -} - -function measureCharInner(cm, prepared, ch, bias) { - var place = nodeAndOffsetInLineMap(prepared.map, ch, bias) - var node = place.node, start = place.start, end = place.end, collapse = place.collapse - - var rect - if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. - for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned - while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start } - while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end } - if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) - { rect = node.parentNode.getBoundingClientRect() } + + // Test whether there exists a collapsed span that partially + // overlaps (covers the start or end, but not both) of a new span. + // Such overlap is not allowed. + function conflictingCollapsedRange(doc, lineNo, from, to, marker) { + var line = getLine(doc, lineNo); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } + } + + // A visual line is a line as drawn on the screen. Folding, for + // example, can cause multiple logical lines to appear on the same + // visual line. This finds the start of the visual line that the + // given line is part of (usually that is the line itself). + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line + } + + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line + } + + // Returns an array of logical lines that continue the visual line + // started by the argument, or undefined if there are no such lines. + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines + } + + // Get the line number of the start of the visual line that the + // given line number is part of. + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) + } + + // Get the line number of the start of the next visual line after + // the given line. + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 + } + + // Compute whether a line is hidden. Lines count as hidden when they + // are part of a visual line that starts with another line, or when + // they are entirely covered by collapsed, non-widget span. + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } + } + + // Find the height above the given line. + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h + } + + // Compute the character length of a line, taking into account + // collapsed ranges (see markText) that might hide parts, and join + // other lines onto it. + function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len + } + + // Find the longest line in the document. + function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + + Line.prototype.lineNo = function () { return lineNo(this) }; + eventMixin(Line); + + // Change the content (text, markers) of a line. Automatically + // invalidates cached information and tries to re-estimate the + // line's height. + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + } + + // Detach a line from the document tree and its markers. + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Convert a style as returned by a mode (either null, or a string + // containing one or more styles) to a CSS style. This is cached, + // and also looks for line-wide styles. + var styleToClassCache = {}, styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) + } + + // Render the DOM representation of the text of a line. Also builds + // up a 'line map', which points at the DOM nodes that represent + // specific stretches of text, and is used by the measuring code. + // The returned object contains the DOM node, this map, and + // information about line-wide styles that were set by the mode. + function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder + } + + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token + } + + // Build up the DOM representation for a single token, and add it to + // the line map. Takes care to render special characters separately. + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css || attributes) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") + { token.setAttribute(attr, attributes[attr]); } } + } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result + } + + // Work around nonsense dimensions being reported for stretches of + // right-to-left text. + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } + } + + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { (attributes || (attributes = {})).title = m.title; } + if (m.attributes) { + for (var attr in m.attributes) + { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } + } + + + // These objects are used to represent the visible (currently drawn) + // part of the document. A LineView may correspond to multiple + // logical lines, if those are connected by collapsed ranges. + function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + + // Create a range of LineView objects for the given lines. + function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array + } + + var operationGroup = null; + + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + + function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) + } + + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } + } + + var orphanDelayedCallbacks = null; + + // Often, we want to signal events at a point where we are in the + // middle of some work, but don't want the handler to start calling + // other methods on the editor, which might be in an inconsistent + // state or simply not expect any other events to happen. + // signalLater looks whether there are any handlers, and schedules + // them to be executed when the last operation ends, or, if no + // operation is active, when a timeout fires. + function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); + } + + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } + } + + // When an aspect of a line changes, a string is added to + // lineView.changes. This updates the relevant part of the line's + // DOM structure. + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; + } + + // Lines with gutter elements, widgets or a background class need to + // be wrapped, and have the extra elements added to the wrapper div + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node + } + + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + + // Wrapper around buildLineContent which will reuse the structure + // in display.externalMeasured when possible. + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) + } + + // Redraw the line's text. Interacts with the background and text + // classes because the mode may output tokens that influence these + // classes. + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + gutterWrap.setAttribute("aria-hidden", "true"); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } + } + + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); + } + + // Build a line's DOM representation from scratch + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node + } + + // A lineView may contain multiple logical lines (when merged by + // collapsed spans). The widgets for all of them need to be drawn. + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } + } + + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } + } + + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } + } + + function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight + } + + // Return true when the given mouse event happened in a widget + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop} + function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} + function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data + } + + function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight + } + + // Ensure the lineView.wrapping.heights array is populated. This is + // an array of bottom offsets for the lines that make up a drawn + // line. When lineWrapping is on, there might be more than one + // height. + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } + } + + // Find a line map (mapping character offsets to text nodes) and a + // measurement cache for the given line number. (A line view might + // contain multiple lines when collapsed ranges are present.) + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + if (lineView.rest) { + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } + } + } + + // Render a line into the hidden node display.externalMeasured. Used + // when measurement is needed for a line that's not in the viewport. + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view + } + + // Get a {top, bottom, left, right} box (in line-local coordinates) + // for a given character. + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) + } + + // Find a line view that corresponds to the given line number. + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } + } + + // Measurement can be split in two steps, the set-up work that + // applies to the whole line, and the measurement of the actual + // character. Functions like coordsChar, that need to do a lot of + // measurements in a row, can thus ensure that the set-up work is + // only done once. + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } + } + + // Given a prepared measurement object, measures the position of an + // actual character (or fetches it from the cache). + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} + } + + var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + + function nodeAndOffsetInLineMap(map, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map.length; i += 3) { + mStart = map[i]; + mEnd = map[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { + node = map[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { + node = map[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} + } + + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect + } + + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result + } + + // Work around problem with bounding client rects on ranges being + // returned incorrectly when zoomed on IE10 and below. + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} + } + + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } + } + + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } + } + + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; + } + + function pageScrollX(doc) { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(doc.body.getBoundingClientRect().left - parseInt(getComputedStyle(doc.body).marginLeft)) } + return doc.defaultView.pageXOffset || (doc.documentElement || doc.body).scrollLeft + } + function pageScrollY(doc) { + if (chrome && android) { return -(doc.body.getBoundingClientRect().top - parseInt(getComputedStyle(doc.body).marginTop)) } + return doc.defaultView.pageYOffset || (doc.documentElement || doc.body).scrollTop + } + + function widgetTopHeight(lineObj) { + var ref = visualLine(lineObj); + var widgets = ref.widgets; + var height = 0; + if (widgets) { for (var i = 0; i < widgets.length; ++i) { if (widgets[i].above) + { height += widgetHeight(widgets[i]); } } } + return height + } + + // Converts a {top, bottom, left, right} box from line-local + // coordinates into another coordinate system. Context may be one of + // "line", "div" (display.lineDiv), "local"./null (editor), "window", + // or "page". + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; rect.bottom += height; + } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY(doc(cm))); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX(doc(cm))); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect + } + + // Coverts a box from "div" coords to another coordinate system. + // Context may be "window", "page", "div", or "local"./null. + function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(doc(cm)); + top -= pageScrollY(doc(cm)); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} + } + + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) + } + + // Returns a box for a given cursor position, which may have an + // 'other' property containing the position of the secondary cursor + // on a bidi boundary. + // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` + // and after `char - 1` in writing order of `char - 1` + // A cursor Pos(line, char, "after") is on the same visual line as `char` + // and before `char` in writing order of `char` + // Examples (upper-case letters are RTL, lower-case are LTR): + // Pos(0, 1, ...) + // before after + // ab a|b a|b + // aB a|B aB| + // Ab |Ab A|b + // AB B|A B|A + // Every position after the last character on a line is considered to stick + // to the last character on the line. + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = part.level == 1; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val + } + + // Used to cheaply estimate the coordinates for a position. Used for + // intermediate scroll updates. + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} + } + + // Positions returned by coordsChar contain some extra information. + // xRel is the relative x position of the input coordinates compared + // to the found position (so xRel > 0 means the coordinates are to + // the right of the character position, for example). When outside + // is true, that means the coordinates lie outside the line's + // vertical range. + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = outside; } + return pos + } + + // Compute the character position closest to the given coordinates. + // Input must be lineSpace-local ("div" coordinate system). + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { return found } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { return rangeEnd } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); + return {begin: begin, end: end} + } + + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x + } + + function coordsCharInner(cm, lineObj, lineNo, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) + (cm, lineObj, lineNo, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight; box.bottom += widgetHeight; + if (!boxIsAfter(box, x, y, false)) { return false } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true + }, begin, end); + + var baseX, sticky, outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { ch++; } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : + (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ? + "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo, ch, sticky, outside, x - baseX) + } + + function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"), + "line", lineObj, preparedMeasure), x, y, true) + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) + { part = order[index - 1]; } + } + return part + } + + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } + var part = null, closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { continue } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { part = order[order.length - 1]; } + // Clip the part to the wrapped line. + if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } + if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } + return part + } + + var measureText; + // Compute the default text height. + function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 + } + + // Compute the default character width. + function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 + } + + // Do a bulk-read of the DOM positions and sizes needed to draw the + // view, so that we don't interleave reading and writing to the DOM. + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + var id = cm.display.gutterSpecs[i].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} + } + + // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, + // but using getBoundingClientRect to get a sub-pixel-accurate + // result. + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left + } + + // Returns a function that estimates the height of a line, to use as + // first approximation until the line becomes visible (and is thus + // properly measurable). + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } + } + + function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); + } + + // Given a mouse event, find the corresponding position. If liberal + // is false, it checks whether a gutter or scrollbar was clicked, + // and returns null if it was. forRect is used by rectangular + // selections, and tries to estimate a character position even for + // coordinates beyond the right of the text. + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e$1) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords + } + + // Find the view element corresponding to a given line. Return null + // when the line isn't visible. + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } + } + + // Updates the display.view data structure for a given change to the + // document. From and to are in pre-change coordinates. Lendiff is + // the amount of lines added or subtracted by the change. This is + // used for changes that span multiple lines, or change the way + // lines are divided into visual lines. regLineChange (below) + // registers single-line changes. + function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } + } + + // Register a change to a single line. Type must be one of "text", + // "gutter", "class", "widget" + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } + } + + // Clear the view. + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} + } + + // Force the view to cover a given range, adding empty view element + // or clipping off existing ones as needed. + function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; + } + + // Count the number of lines in the view whose DOM representation is + // out of date (or nonexistent). + function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty + } + + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + + function prepareSelection(cm, primary) { + if ( primary === void 0 ) primary = true; + + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + var customCursor = cm.options.$customCursor; + if (customCursor) { primary = true; } + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (!primary && i == doc.sel.primIndex) { continue } + var range = doc.sel.ranges[i]; + if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue } + var collapsed = range.empty(); + if (customCursor) { + var head = customCursor(cm, range); + if (head) { drawSelectionCursor(cm, head, curFragment); } + } else if (collapsed || cm.options.showCursorWhenSelecting) { + drawSelectionCursor(cm, range.head, curFragment); + } + if (!collapsed) + { drawSelectionRange(cm, range, selFragment); } + } + return result + } + + // Draws a cursor for the given range + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { + var charPos = charCoords(cm, head, "div", null, null); + var width = charPos.right - charPos.left; + cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; + } + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } + } + + function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } + + // Draws the given range as a highlighted selection + function drawSelectionRange(cm, range, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop] + } + + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i == 0, last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + + if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } + if (cmpCoords(toPos, start) < 0) { start = toPos; } + if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } + if (cmpCoords(toPos, end) < 0) { end = toPos; } + }); + return {start: start, end: end} + } + + var sFrom = range.from(), sTo = range.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); + } + + // Cursor-blinking + function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { + if (!cm.hasFocus()) { onBlur(cm); } + display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } + } + + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { onFocus(cm); } + } + } + + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { onBlur(cm); } + } }, 100); + } + + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); + } + + // Read the actual heights of the rendered lines, and update their + // stored heights to match. + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); + var oldHeight = display.lineDiv.getBoundingClientRect().top; + var mustScroll = 0; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], wrapping = cm.options.lineWrapping; + var height = (void 0), width = 0; + if (cur.hidden) { continue } + oldHeight += cur.line.height; + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) + { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } + } + var diff = cur.line.height - height; + if (diff > .005 || diff < -.005) { + if (oldHeight < viewTop) { mustScroll -= diff; } + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + if (Math.abs(mustScroll) > 2) { display.scroller.scrollTop += mustScroll; } + } + + // Read and store the height of line widgets associated with the + // given line. + function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i], parent = w.node.parentNode; + if (parent) { w.height = parent.offsetHeight; } + } } + } + + // Compute the lines that are visible in a given viewport (defaults + // the the current scroll position). viewport may contain top, + // height, and ensure (see op.scrollToPos) properties. + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} + } + + // SCROLLING THINGS INTO VIEW + + // If an editor sits on the top or bottom of the window, partially + // scrolled out of view, this ensures that the cursor is visible. + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + var doc = display.wrapper.ownerDocument; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (doc.defaultView.innerHeight || doc.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + + // Scroll a given position into view (immediately), verifying that + // it actually became visible (as line heights are accurately + // measured, the position of something may 'drift' during drawing). + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect + } + + // Scroll a given set of coordinates into view (immediately). + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } + } + + // Calculate a new scroll position needed to scroll the given + // rectangle into view. Returns an object with scrollTop and + // scrollLeft properties. When these are undefined, the + // vertical/horizontal position does not need to be adjusted. + function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result + } + + // Store a relative adjustment to the scroll position in the current + // operation (to be applied when the operation finishes). + function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + + // Make sure that at the end of the operation the current cursor is + // shown. + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; + } + + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } + } + + function scrollToRange(cm, range) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range; + } + + // When an operation has its scrollToPos property set, and another + // scroll action is applied before the end of the operation, this + // 'simulates' scrolling that position into view in a cheap way, so + // that the effect of intermediate scroll commands is not ignored. + function resolveScrollToPos(cm) { + var range = cm.curOp.scrollToPos; + if (range) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to); + scrollToCoordsRange(cm, from, to, range.margin); + } + } + + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + + // Sync the scrollable area and scrollbars, ensure the viewport + // covers the visible area. + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); + } + + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } + } + + // Sync scroller and scrollbar, ensure the gutter elements are + // aligned. + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); + } + + // SCROLLBARS + + // Prepare DOM reads needed to update the scrollbars. Done in one + // shot to minimize update/measure roundtrips. + function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } + } + + var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } + }; + + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.scrollTop = 0; + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} + }; + + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } + }; + + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } + }; + + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.visibility = this.vert.style.visibility = "hidden"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; + }; + + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.visibility = ""; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt != bar) { bar.style.visibility = "hidden"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); + }; + + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + + var NullScrollbars = function () {}; + + NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + + function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } + } + + // Re-synchronize the fake scrollbars with the actual size of the + // content. + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } + } + + var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + // Operations are used to wrap a series of changes to the editor + // state in such a way that each change won't have to update the + // cursor and display (which would be awkward, slow, and + // error-prone). Instead, display updates are batched and then all + // combined and executed at once. + + var nextOpId = 0; + // Start a new operation. + function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: 0, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId, // Unique ID + markArrays: null // Used by addMarkedSpan + }; + pushOperation(cm.curOp); + } + + // Finish an operation, updating the display and signalling delayed events + function endOperation(cm) { + var op = cm.curOp; + if (op) { finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); } + } + + // The DOM updates done when an operation finishes are batched so + // that the minimum number of relayouts are required. + function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } + } + + function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); + } + + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + + function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(); } + } + + function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt(root(cm)); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } + } + + function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } + } + + // Run the given function in an operation + function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } + } + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } + } + // Used to add methods to editor and doc instances, wrapping them in + // operations. + function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } + } + function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } + } + + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } + } + + // DISPLAY DRAWING + + var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } + }; + DisplayUpdate.prototype.finish = function () { + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this.events[i]); } + }; + + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + + function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(root(cm)); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = win(cm).getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result + } + + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt(rootNode(snapshot.activeElt))) { return } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && + snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var doc = snapshot.activeElt.ownerDocument; + var sel = doc.defaultView.getSelection(), range = doc.createRange(); + range.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range.collapse(false); + sel.removeAllRanges(); + sel.addRange(range); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + + // Does the actual updating of the line display. Bails out + // (returning false) when there is nothing to be done and forced is + // false. + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true + } + + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } + } + + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + + // Sync the actual display DOM structure with display.view, removing + // nodes for lines that are no longer in view, and creating the ones + // that are not there yet, and updating the ones that are out of + // date. + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } + } + + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + // Send an event to consumers responding to changes in gutter width. + signalLater(display, "gutterChanged", display); + } + + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; + } + + // Re-align line numbers and gutter marks to compensate for + // horizontal scrolling. + function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } + } + + // Used to ensure that the line number gutter is still the right + // size for the current document size. Returns true when an update + // is needed. + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true + } + return false + } + + function getGutters(gutters, lineNumbers) { + var result = [], sawLineNumbers = false; + for (var i = 0; i < gutters.length; i++) { + var name = gutters[i], style = null; + if (typeof name != "string") { style = name.style; name = name.className; } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { continue } + else { sawLineNumbers = true; } + } + result.push({className: name, style: style}); + } + if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } + return result + } + + // Rebuild the gutter elements, ensure the margin to the left of the + // code matches their width. + function renderGutters(display) { + var gutters = display.gutters, specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i = 0; i < specs.length; ++i) { + var ref = specs[i]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { gElt.style.cssText = style; } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + + // The display handles the DOM integration, both for input reading + // and content drawing. It holds references to DOM nodes and + // display-related state. + + function Display(place, doc, input, options) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + // See #6982. FIXME remove when this has been fixed for a while in Chrome + if (chrome && chrome_version >= 105) { d.wrapper.style.clipPath = "inset(0px)"; } + + // This attribute is respected by automatic translation systems such as Google Translate, + // and may also be respected by tools used by human translators. + d.wrapper.setAttribute('translate', 'no'); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + + input.init(d); + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) { wheelPixelsPerUnit = -.53; } + else if (gecko) { wheelPixelsPerUnit = 15; } + else if (chrome) { wheelPixelsPerUnit = -.7; } + else if (safari) { wheelPixelsPerUnit = -1/3; } + + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta + } + + function onScrollWheel(cm, e) { + // On Chrome 102, viewport updates somehow stop wheel-based + // scrolling. Turning off pointer events during the scroll seems + // to avoid the issue. + if (chrome && chrome_version == 102) { + if (cm.display.chromeScrollHack == null) { cm.display.sizer.style.pointerEvents = "none"; } + else { clearTimeout(cm.display.chromeScrollHack); } + cm.display.chromeScrollHack = setTimeout(function () { + cm.display.chromeScrollHack = null; + cm.display.sizer.style.pointerEvents = ""; + }, 100); + } + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + var pixelsPerUnit = wheelPixelsPerUnit; + if (e.deltaMode === 0) { + dx = e.deltaX; + dy = e.deltaY; + pixelsPerUnit = 1; + } + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && pixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && pixelsPerUnit != null) { + var pixels = dy * pixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20 && e.deltaMode !== 0) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + // Selection objects are immutable. A new one is created every time + // the selection changes. A selection is one or more non-overlapping + // (and non-touching) ranges, sorted, and an integer that indicates + // which one is the primary selection (the one that's scrolled into + // view, that getCursor returns, etc). + var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + + Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + + Selection.prototype.equals = function (other) { + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true + }; + + Selection.prototype.deepCopy = function () { + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); } + return new Selection(out, this.primIndex) + }; + + Selection.prototype.somethingSelected = function () { + for (var i = 0; i < this.ranges.length; i++) + { if (!this.ranges[i].empty()) { return true } } + return false + }; + + Selection.prototype.contains = function (pos, end) { + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 + }; + + var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; + }; + + Range.prototype.from = function () { return minPos(this.anchor, this.head) }; + Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; + Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + + // Take an unsorted, potentially overlapping set of ranges, and + // build a selection out of it. 'Consumes' ranges array (modifying + // it). + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) + } + + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) + } + + // Compute the position of the end of a change (its 'to' property + // refers to the pre-change end). + function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) + } + + // Adjust a position to refer to the post-change position of the + // same text, or the end of the change if the change covers it. + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) + } + + function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex) + } + + function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } + } + + // Used by replaceSelections to allow moving the selection to the + // start or around the replaced test. Hint may be "start" or "around". + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) + } + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } + } + + // DOCUMENT DATA STRUCTURE + + // By default, updates that start and end at the beginning of a line + // are treated specially, in order to make the association of line + // widgets and marker elements with the text behave more intuitive. + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) + } + + // Perform a change on the document data structure. + function updateDoc(doc, change, markedSpans, estimateHeight) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); + } + + // Call f for all linked documents. + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); + } + + // Attach a document to an editor. + function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + cm.options.direction = doc.direction; + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); + } + + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + + function History(prev) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = prev ? prev.undoDepth : Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; + } + + // Create a history change event from an updateDoc-style change + // object. + function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange + } + + // Pop all selection events off the end of a history array. Stop at + // a change event. + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } + } + + // Find the top change event in the history. Pop off selection + // events that are in the way. + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } + } + + // Register a change in the history. Merges changes that are within + // a single operation, or are close together with an origin that + // allows merging (starting with "+") into a single event. + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } + } + + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) + } + + // Called whenever the selection changes, sets the new selection as + // the pending selection in the history, and pushes the old pending + // selection into the 'done' array when it was significantly + // different (in number of selected ranges, emptiness, or time). + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } + } + + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } + } + + // Used to store marked span information in the history. + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); + } + + // When un/re-doing restores text containing marked spans, those + // that have been explicitly cleared should not be restored. + function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null + } + + // Retrieve and filter the old marked spans stored in a change event. + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw + } + + // Used for un/re-doing changes from the history. Combines the + // result of computing the existing spans with the set of spans that + // existed in the history (so that deleting around a span and then + // undoing brings back the span). + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy + } + + // The 'scroll' parameter given to many of these indicated whether + // the new cursor position should be scrolled into view after + // modifying the selection. + + // If shift is held or the extend flag is set, extends a range to + // include a given position (and optionally a second position). + // Otherwise, simply returns the range between the given positions. + // Used for cursor motion and such. + function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } + } + + // Extend the primary selection range, discard the rest. + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + + // Extend all selections (pos is an array of selections with length + // equal the number of selections) + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + + // Updates a single range in the selection. + function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + + // Reset the selection to a single range. + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + + // Give beforeSelectionChange handlers a change to influence a + // selection update. + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } + else { return sel } + } + + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + + // Set a new selection. + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor") + { ensureCursorVisible(doc.cm); } + } + + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + + // Verify that the selection does not partially select any atomic + // marked ranges. + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + + // Return a selection that does not partially select any atomic + // ranges. + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = range.head == range.anchor ? newAnchor : skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel + } + + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + + // Determine if we should prevent the cursor being placed to the left/right of an atomic marker + // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it + // is with selectLeft/Right + var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; + + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? preventCursorRight : preventCursorLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos + } + + // Ensure a given position is not inside an atomic range. + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found + } + + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } + } + + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + + // UPDATING + + // Allow "beforeChange" event handlers to influence a change + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { + if (doc.cm) { doc.cm.curOp.updateInput = 2; } + return null + } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} + } + + // Apply a change to a document, and add it to the document's + // history, and propagating it to all linked documents. + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } + } else { + makeChangeInner(doc, change); + } + } + + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + // Revert a change stored in a document's history. + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } else if (suppress) { + source.push(event); + return + } else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } + } + + // Sub-views need their line numbers shifted when text is added + // above or below them in the parent document. + function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } + } + + // More lower-level change function, handling only a single document + // (not linked ones). + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) + { doc.cantEdit = false; } + } + + // Handle the interaction of a change to a document with the editor + // that this document is part of. + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; + } + + function replaceRange(doc, code, from, to, origin) { + var assign; + + if (!to) { to = from; } + if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } + } + + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // Utility for applying a change to a line by handle or number, + // returning the number and optionally registering the line as + // changed. + function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line + } + + // The document is represented as a BTree consisting of leaves, with + // chunk of lines in them, and branches, with up to ten leaves or + // other branch nodes below them. The top node is always a branch + // node, and is the document object itself (meaning it has + // additional methods and properties). + // + // All nodes have parent links. The tree is used both to go from + // line numbers to line objects, and to go from objects to numbers. + // It also indexes by height, and is used to convert between height + // and line object, and to find the total height of the document. + // + // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function(at, n) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function(at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; } + }, + + // Used to iterate over a part of the tree. + iterN: function(at, n, op) { + for (var e = at + n; at < e; ++at) + { if (op(this.lines[at])) { return true } } + } + }; + + function BranchChunk(children) { + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size }, + + removeInner: function(at, n) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { this.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function(lines) { + for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); } + }, + + insertInner: function(at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function(at, n, op) { + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } + }; + + // Line widgets are block elements displayed above or below a line. + + var LineWidget = function(doc, node, options) { + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; + }; + + LineWidget.prototype.clear = function () { + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + + LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } + } + + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } + return widget + } + + // TEXTMARKERS + + // Created with markText and setBookmark methods. A TextMarker is a + // handle that can be used to clear or find a marked position in the + // document. Line objects hold arrays (markedSpans) containing + // {from, to, marker} object pointing to such marker objects, and + // indicating that such a marker is present on that line. Multiple + // lines may point to the same marker when it spans across lines. + // The spans will have null for their from/to properties when the + // marker continues beyond the start/end of the line. Markers have + // links back to the lines they currently touch. + + // Collapsed markers have unique ids, in order to be able to order + // them, which is needed for uniquely determining an outer marker + // when they overlap (they may nest, but not partially overlap). + var nextMarkerId = 0; + + var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + + // Clear the marker. + TextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } + }; + + // Find the position of the marker in the document. Returns a {from, + // to} object by default. Side can be passed to get a specific side + // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the + // Pos objects returned contain a line object, rather than a line + // number (used to prevent looking up the same line twice). + TextMarker.prototype.find = function (side, lineObj) { + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} + }; + + // Signals that the marker's widget changed, and surrounding layout + // should be recomputed. + TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); + }; + + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); + }; + + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp + ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + + // Create a marker, wire it up to the right lines, and + function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.startStyle || marker.endStyle || marker.css || + marker.attributes || marker.title) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker + } + + // SHARED TEXTMARKERS + + // A shared marker spans multiple linked documents. It is + // implemented as a meta-marker-object controlling multiple normal + // markers. + var SharedTextMarker = function(markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this; } + }; + + SharedTextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this.markers[i].clear(); } + signalLater(this, "clear"); + }; + + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) + }; + eventMixin(SharedTextMarker); + + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) + } + + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) + } + + function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + + function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); + } + + var nextDocId = 0; + var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + if (lineSep === '') { return lines.join('') } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range.head; } + else if (start == "anchor") { pos = range.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range.to(); } + else { pos = range.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this, ranges[i].anchor), + clipPos(this, ranges[i].head || ranges[i].anchor)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() { + var this$1 = this; + + this.history = new History(this.history); + linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true); + }, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo == from.line && from.ch >= span.to || + span.from == null && lineNo != from.line || + span.from != null && lineNo == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo; + }); + return clipPos(this, Pos(lineNo, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + if (other instanceof CodeMirror) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this.linked[i]; + if (link.doc != other) { continue } + this.linked.splice(i, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) + }); + + // Public alias. + Doc.prototype.eachLine = Doc.prototype.iter; + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function () { + if (++read == n) { + operation(cm, function () { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines( + text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + var reader = new FileReader; + reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); }; + reader.onload = function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return + } + text[i] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e$1){} + } + } + + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } + } + + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + + // These must be handled carefully, because naively registering a + // handler for each editor will cause the editors to never be + // garbage collected. + + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"), editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { editors.push(cm); } + } + if (editors.length) { editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { f(editors[i]); } + }); } + } + + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); + } + // Called when the window resizes + function onResize(cm) { + var d = cm.display; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + + var keyNames = { + 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" + }; + + // Number keys + for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } + // Alphabetic keys + for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } + // Function keys + for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + + var keyMap = {}; + + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + // Note that the save and find-related commands aren't defined by + // default. User code or addons can define them. Unknown commands + // are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + // Very basic readline/emacs-style bindings, which are standard on Mac. + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", + "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", + "Ctrl-T": "transposeChars", "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + + // KEYMAP DISPATCH + + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name + } + + // This is a kludge to keep keymaps mostly working as raw objects + // (backwards compatibility) while at the same time support features + // like normalization and multi-stroke key bindings. It compiles a + // new normalized keymap, and then updates the old object to reflect + // this. + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap + } + + function lookupKey(key, map, handle, context) { + map = getKeyMap(map); + var found = map.call ? map.call(key, context) : map[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map.fallthrough) { + if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") + { return lookupKey(key, map.fallthrough, handle, context) } + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle, context); + if (result) { return result } + } + } + } + + // Modifier key presses don't count as 'real' key presses for the + // purpose of keymap fallthrough. + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" + } + + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name + } + + // Look up the name of a key as indicated by an event object. + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { name = event.code; } + return addModifierNames(name, event, noShift) + } + + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val + } + + // Helper for deleting text near the selection(s), used to implement + // backspace, delete, and similar functionality. + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); + } + + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target + } + + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") + } + + function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { dir = -dir; } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") + } + + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null + } + + // Commands are parameter-less actions that can be performed on an + // editor, mostly used for keybindings. + var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } + }; + + + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start + } + + // Run a handler that was bound to a key. + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done + } + + function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) + } + + // Note that, despite the name, this function is also used to check + // for bound mouse clicks. + + var stopSeq = new Delayed; + + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + if (/\'$/.test(name)) + { cm.state.keySeq = null; } + else + { stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } + } + return dispatchKeyInner(cm, name, e, handle) + } + + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + return !!result + } + + // Handle a key from the keydown event. + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } + } + + // Handle a key from the keypress event + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + cm.curOp.focus = activeElt(root(cm)); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) + { document.execCommand("cut"); } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } + } + + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + + function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); + } + + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { return } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); + } + + var DOUBLECLICK_DELAY = 400; + + var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button + }; + + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } + } + + // A mouse down can be a single click, double click, triple click, + // start of selection drag, start of text drag, new cursor + // (ctrl-click), rectangle drag (alt-drag), or xwin + // middle-click-paste. Or it might be a click on something we should + // not interfere with, such as a scrollbar or widget. + function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + win(cm).focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { cm.display.input.onContextMenu(e); } + else { delayBlurEvent(cm); } + } + } + + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) + } + + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value + } + + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(root(cm)); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } + } + + // Start a text drag. When it ends, see if any dragging actually + // happen, and treat as a click if it didn't. + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; } + else { delayBlurEvent(cm); } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if ((webkit && !safari) || ie && ie_version == 9) + { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + cm.state.delayingBlurEvent = true; + setTimeout(function () { return display.input.focus(); }, 20); + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + } + + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) + } + + // Normal selection, as opposed to text dragging. + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { delayBlurEvent(cm); } + var display = cm.display, doc = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); } else - { rect = getUsefulRect(range(node, start, end).getClientRects(), bias) } - if (rect.left || rect.right || start == 0) { break } - end = start - start = start - 1 - collapse = "right" - } - if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect) } - } else { // If it is a widget, simply get the box for the whole widget. - if (start > 0) { collapse = bias = "right" } - var rects - if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) - { rect = rects[bias == "right" ? rects.length - 1 : 0] } - else - { rect = node.getBoundingClientRect() } - } - if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { - var rSpan = node.parentNode.getClientRects()[0] - if (rSpan) - { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom} } - else - { rect = nullRect } - } - - var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top - var mid = (rtop + rbot) / 2 - var heights = prepared.view.measure.heights - var i = 0 - for (; i < heights.length - 1; i++) - { if (mid < heights[i]) { break } } - var top = i ? heights[i - 1] : 0, bot = heights[i] - var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, - right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, - top: top, bottom: bot} - if (!rect.left && !rect.right) { result.bogus = true } - if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot } - - return result -} - -// Work around problem with bounding client rects on ranges being -// returned incorrectly when zoomed on IE10 and below. -function maybeUpdateRectForZooming(measure, rect) { - if (!window.screen || screen.logicalXDPI == null || - screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) - { return rect } - var scaleX = screen.logicalXDPI / screen.deviceXDPI - var scaleY = screen.logicalYDPI / screen.deviceYDPI - return {left: rect.left * scaleX, right: rect.right * scaleX, - top: rect.top * scaleY, bottom: rect.bottom * scaleY} -} - -function clearLineMeasurementCacheFor(lineView) { - if (lineView.measure) { - lineView.measure.cache = {} - lineView.measure.heights = null - if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) - { lineView.measure.caches[i] = {} } } - } -} - -function clearLineMeasurementCache(cm) { - cm.display.externalMeasure = null - removeChildren(cm.display.lineMeasure) - for (var i = 0; i < cm.display.view.length; i++) - { clearLineMeasurementCacheFor(cm.display.view[i]) } -} - -function clearCaches(cm) { - clearLineMeasurementCache(cm) - cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null - if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true } - cm.display.lineNumChars = null -} - -function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft } -function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop } - -// Converts a {top, bottom, left, right} box from line-local -// coordinates into another coordinate system. Context may be one of -// "line", "div" (display.lineDiv), "local"./null (editor), "window", -// or "page". -function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { - if (!includeWidgets && lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) { - var size = widgetHeight(lineObj.widgets[i]) - rect.top += size; rect.bottom += size - } } } - if (context == "line") { return rect } - if (!context) { context = "local" } - var yOff = heightAtLine(lineObj) - if (context == "local") { yOff += paddingTop(cm.display) } - else { yOff -= cm.display.viewOffset } - if (context == "page" || context == "window") { - var lOff = cm.display.lineSpace.getBoundingClientRect() - yOff += lOff.top + (context == "window" ? 0 : pageScrollY()) - var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()) - rect.left += xOff; rect.right += xOff - } - rect.top += yOff; rect.bottom += yOff - return rect -} - -// Coverts a box from "div" coords to another coordinate system. -// Context may be "window", "page", "div", or "local"./null. -function fromCoordSystem(cm, coords, context) { - if (context == "div") { return coords } - var left = coords.left, top = coords.top - // First move into "page" coordinate system - if (context == "page") { - left -= pageScrollX() - top -= pageScrollY() - } else if (context == "local" || !context) { - var localBox = cm.display.sizer.getBoundingClientRect() - left += localBox.left - top += localBox.top - } - - var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect() - return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} -} - -function charCoords(cm, pos, context, lineObj, bias) { - if (!lineObj) { lineObj = getLine(cm.doc, pos.line) } - return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) -} - -// Returns a box for a given cursor position, which may have an -// 'other' property containing the position of the secondary cursor -// on a bidi boundary. -function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { - lineObj = lineObj || getLine(cm.doc, pos.line) - if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj) } - function get(ch, right) { - var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight) - if (right) { m.left = m.right; } else { m.right = m.left } - return intoCoordSystem(cm, lineObj, m, context) - } - function getBidi(ch, partPos) { - var part = order[partPos], right = part.level % 2 - if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) { - part = order[--partPos] - ch = bidiRight(part) - (part.level % 2 ? 0 : 1) - right = true - } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) { - part = order[++partPos] - ch = bidiLeft(part) - part.level % 2 - right = false - } - if (right && ch == part.to && ch > part.from) { return get(ch - 1) } - return get(ch, right) - } - var order = getOrder(lineObj), ch = pos.ch - if (!order) { return get(ch) } - var partPos = getBidiPartAt(order, ch) - var val = getBidi(ch, partPos) - if (bidiOther != null) { val.other = getBidi(ch, bidiOther) } - return val -} - -// Used to cheaply estimate the coordinates for a position. Used for -// intermediate scroll updates. -function estimateCoords(cm, pos) { - var left = 0 - pos = clipPos(cm.doc, pos) - if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch } - var lineObj = getLine(cm.doc, pos.line) - var top = heightAtLine(lineObj) + paddingTop(cm.display) - return {left: left, right: left, top: top, bottom: top + lineObj.height} -} - -// Positions returned by coordsChar contain some extra information. -// xRel is the relative x position of the input coordinates compared -// to the found position (so xRel > 0 means the coordinates are to -// the right of the character position, for example). When outside -// is true, that means the coordinates lie outside the line's -// vertical range. -function PosWithInfo(line, ch, outside, xRel) { - var pos = Pos(line, ch) - pos.xRel = xRel - if (outside) { pos.outside = true } - return pos -} - -// Compute the character position closest to the given coordinates. -// Input must be lineSpace-local ("div" coordinate system). -function coordsChar(cm, x, y) { - var doc = cm.doc - y += cm.display.viewOffset - if (y < 0) { return PosWithInfo(doc.first, 0, true, -1) } - var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1 - if (lineN > last) - { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1) } - if (x < 0) { x = 0 } - - var lineObj = getLine(doc, lineN) - for (;;) { - var found = coordsCharInner(cm, lineObj, lineN, x, y) - var merged = collapsedSpanAtEnd(lineObj) - var mergedPos = merged && merged.find(0, true) - if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0)) - { lineN = lineNo(lineObj = mergedPos.to.line) } - else - { return found } - } -} - -function coordsCharInner(cm, lineObj, lineNo, x, y) { - var innerOff = y - heightAtLine(lineObj) - var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth - var preparedMeasure = prepareMeasureForLine(cm, lineObj) - - function getX(ch) { - var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure) - wrongLine = true - if (innerOff > sp.bottom) { return sp.left - adjust } - else if (innerOff < sp.top) { return sp.left + adjust } - else { wrongLine = false } - return sp.left - } - - var bidi = getOrder(lineObj), dist = lineObj.text.length - var from = lineLeft(lineObj), to = lineRight(lineObj) - var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine - - if (x > toX) { return PosWithInfo(lineNo, to, toOutside, 1) } - // Do a binary search between these bounds. - for (;;) { - if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) { - var ch = x < fromX || x - fromX <= toX - x ? from : to - var outside = ch == from ? fromOutside : toOutside - var xDiff = x - (ch == from ? fromX : toX) - // This is a kludge to handle the case where the coordinates - // are after a line-wrapped line. We should replace it with a - // more general handling of cursor positions around line - // breaks. (Issue #4078) - if (toOutside && !bidi && !/\s/.test(lineObj.text.charAt(ch)) && xDiff > 0 && - ch < lineObj.text.length && preparedMeasure.view.measure.heights.length > 1) { - var charSize = measureCharPrepared(cm, preparedMeasure, ch, "right") - if (innerOff <= charSize.bottom && innerOff >= charSize.top && Math.abs(x - charSize.right) < xDiff) { - outside = false - ch++ - xDiff = x - charSize.right + { ourRange = range; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range.anchor, anchor) > 0) { + head = range.head; + anchor = minPos(oldRange.from(), range.anchor); + } else { + head = range.anchor; + anchor = maxPos(oldRange.to(), range.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); } - while (isExtendingChar(lineObj.text.charAt(ch))) { ++ch } - var pos = PosWithInfo(lineNo, ch, outside, xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0) - return pos } - var step = Math.ceil(dist / 2), middle = from + step - if (bidi) { - middle = from - for (var i = 0; i < step; ++i) { middle = moveVisually(lineObj, middle, 1) } - } - var middleX = getX(middle) - if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) { toX += 1000; } dist = step} - else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step} - } -} - -var measureText -// Compute the default text height. -function textHeight(display) { - if (display.cachedTextHeight != null) { return display.cachedTextHeight } - if (measureText == null) { - measureText = elt("pre") - // Measure a bunch of lines, for browsers that compute - // fractional heights. - for (var i = 0; i < 49; ++i) { - measureText.appendChild(document.createTextNode("x")) - measureText.appendChild(elt("br")) - } - measureText.appendChild(document.createTextNode("x")) - } - removeChildrenAndAdd(display.measure, measureText) - var height = measureText.offsetHeight / 50 - if (height > 3) { display.cachedTextHeight = height } - removeChildren(display.measure) - return height || 1 -} - -// Compute the default character width. -function charWidth(display) { - if (display.cachedCharWidth != null) { return display.cachedCharWidth } - var anchor = elt("span", "xxxxxxxxxx") - var pre = elt("pre", [anchor]) - removeChildrenAndAdd(display.measure, pre) - var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10 - if (width > 2) { display.cachedCharWidth = width } - return width || 10 -} - -// Do a bulk-read of the DOM positions and sizes needed to draw the -// view, so that we don't interleave reading and writing to the DOM. -function getDimensions(cm) { - var d = cm.display, left = {}, width = {} - var gutterLeft = d.gutters.clientLeft - for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { - left[cm.options.gutters[i]] = n.offsetLeft + n.clientLeft + gutterLeft - width[cm.options.gutters[i]] = n.clientWidth - } - return {fixedPos: compensateForHScroll(d), - gutterTotalWidth: d.gutters.offsetWidth, - gutterLeft: left, - gutterWidth: width, - wrapperWidth: d.wrapper.clientWidth} -} - -// Computes display.scroller.scrollLeft + display.gutters.offsetWidth, -// but using getBoundingClientRect to get a sub-pixel-accurate -// result. -function compensateForHScroll(display) { - return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left -} - -// Returns a function that estimates the height of a line, to use as -// first approximation until the line becomes visible (and is thus -// properly measurable). -function estimateHeight(cm) { - var th = textHeight(cm.display), wrapping = cm.options.lineWrapping - var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3) - return function (line) { - if (lineIsHidden(cm.doc, line)) { return 0 } - - var widgetsHeight = 0 - if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { - if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height } - } } - if (wrapping) - { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } - else - { return widgetsHeight + th } - } -} - -function estimateLineHeights(cm) { - var doc = cm.doc, est = estimateHeight(cm) - doc.iter(function (line) { - var estHeight = est(line) - if (estHeight != line.height) { updateLineHeight(line, estHeight) } - }) -} - -// Given a mouse event, find the corresponding position. If liberal -// is false, it checks whether a gutter or scrollbar was clicked, -// and returns null if it was. forRect is used by rectangular -// selections, and tries to estimate a character position even for -// coordinates beyond the right of the text. -function posFromMouse(cm, e, liberal, forRect) { - var display = cm.display - if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } - - var x, y, space = display.lineSpace.getBoundingClientRect() - // Fails unpredictably on IE[67] when mouse is dragged around quickly. - try { x = e.clientX - space.left; y = e.clientY - space.top } - catch (e) { return null } - var coords = coordsChar(cm, x, y), line - if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { - var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length - coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)) - } - return coords -} - -// Find the view element corresponding to a given line. Return null -// when the line isn't visible. -function findViewIndex(cm, n) { - if (n >= cm.display.viewTo) { return null } - n -= cm.display.viewFrom - if (n < 0) { return null } - var view = cm.display.view - for (var i = 0; i < view.length; i++) { - n -= view[i].size - if (n < 0) { return i } - } -} - -function updateSelection(cm) { - cm.display.input.showSelection(cm.display.input.prepareSelection()) -} - -function prepareSelection(cm, primary) { - var doc = cm.doc, result = {} - var curFragment = result.cursors = document.createDocumentFragment() - var selFragment = result.selection = document.createDocumentFragment() - - for (var i = 0; i < doc.sel.ranges.length; i++) { - if (primary === false && i == doc.sel.primIndex) { continue } - var range = doc.sel.ranges[i] - if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue } - var collapsed = range.empty() - if (collapsed || cm.options.showCursorWhenSelecting) - { drawSelectionCursor(cm, range.head, curFragment) } - if (!collapsed) - { drawSelectionRange(cm, range, selFragment) } - } - return result -} - -// Draws a cursor for the given range -function drawSelectionCursor(cm, head, output) { - var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine) - - var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")) - cursor.style.left = pos.left + "px" - cursor.style.top = pos.top + "px" - cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px" - - if (pos.other) { - // Secondary cursor, shown when on a 'jump' in bi-directional text - var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")) - otherCursor.style.display = "" - otherCursor.style.left = pos.other.left + "px" - otherCursor.style.top = pos.other.top + "px" - otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px" - } -} - -// Draws the given range as a highlighted selection -function drawSelectionRange(cm, range, output) { - var display = cm.display, doc = cm.doc - var fragment = document.createDocumentFragment() - var padding = paddingH(cm.display), leftSide = padding.left - var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right - - function add(left, top, width, bottom) { - if (top < 0) { top = 0 } - top = Math.round(top) - bottom = Math.round(bottom) - fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))) - } - - function drawForLine(line, fromArg, toArg) { - var lineObj = getLine(doc, line) - var lineLen = lineObj.text.length - var start, end - function coords(ch, bias) { - return charCoords(cm, Pos(line, ch), "div", lineObj, bias) - } - - iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir) { - var leftPos = coords(from, "left"), rightPos, left, right - if (from == to) { - rightPos = leftPos - left = right = leftPos.left - } else { - rightPos = coords(to - 1, "right") - if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp } - left = leftPos.left - right = rightPos.right - } - if (fromArg == null && from == 0) { left = leftSide } - if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part - add(left, leftPos.top, null, leftPos.bottom) - left = leftSide - if (leftPos.bottom < rightPos.top) { add(left, leftPos.bottom, null, rightPos.top) } - } - if (toArg == null && to == lineLen) { right = rightSide } - if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left) - { start = leftPos } - if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right) - { end = rightPos } - if (left < leftSide + 1) { left = leftSide } - add(left, rightPos.top, right - left, rightPos.bottom) - }) - return {start: start, end: end} - } - - var sFrom = range.from(), sTo = range.to() - if (sFrom.line == sTo.line) { - drawForLine(sFrom.line, sFrom.ch, sTo.ch) - } else { - var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line) - var singleVLine = visualLine(fromLine) == visualLine(toLine) - var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end - var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start - if (singleVLine) { - if (leftEnd.top < rightStart.top - 2) { - add(leftEnd.right, leftEnd.top, null, leftEnd.bottom) - add(leftSide, rightStart.top, rightStart.left, rightStart.bottom) + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(root(cm)); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } } else { - add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom) - } - } - if (leftEnd.bottom < rightStart.top) - { add(leftSide, leftEnd.bottom, null, rightStart.top) } - } - - output.appendChild(fragment) -} - -// Cursor-blinking -function restartBlink(cm) { - if (!cm.state.focused) { return } - var display = cm.display - clearInterval(display.blinker) - var on = true - display.cursorDiv.style.visibility = "" - if (cm.options.cursorBlinkRate > 0) - { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; }, - cm.options.cursorBlinkRate) } - else if (cm.options.cursorBlinkRate < 0) - { display.cursorDiv.style.visibility = "hidden" } -} - -function ensureFocus(cm) { - if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm) } -} - -function delayBlurEvent(cm) { - cm.state.delayingBlurEvent = true - setTimeout(function () { if (cm.state.delayingBlurEvent) { - cm.state.delayingBlurEvent = false - onBlur(cm) - } }, 100) -} - -function onFocus(cm, e) { - if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false } - - if (cm.options.readOnly == "nocursor") { return } - if (!cm.state.focused) { - signal(cm, "focus", cm, e) - cm.state.focused = true - addClass(cm.display.wrapper, "CodeMirror-focused") - // This test prevents this from firing when a context - // menu is closed (since the input reset would kill the - // select-all detection hack) - if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { - cm.display.input.reset() - if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20) } // Issue #1730 - } - cm.display.input.receivedFocus() - } - restartBlink(cm) -} -function onBlur(cm, e) { - if (cm.state.delayingBlurEvent) { return } - - if (cm.state.focused) { - signal(cm, "blur", cm, e) - cm.state.focused = false - rmClass(cm.display.wrapper, "CodeMirror-focused") - } - clearInterval(cm.display.blinker) - setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false } }, 150) -} - -// Re-align line numbers and gutter marks to compensate for -// horizontal scrolling. -function alignHorizontally(cm) { - var display = cm.display, view = display.view - if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } - var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft - var gutterW = display.gutters.offsetWidth, left = comp + "px" - for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { - if (cm.options.fixedGutter) { - if (view[i].gutter) - { view[i].gutter.style.left = left } - if (view[i].gutterBackground) - { view[i].gutterBackground.style.left = left } - } - var align = view[i].alignable - if (align) { for (var j = 0; j < align.length; j++) - { align[j].style.left = left } } - } } - if (cm.options.fixedGutter) - { display.gutters.style.left = (comp + gutterW) + "px" } -} - -// Used to ensure that the line number gutter is still the right -// size for the current document size. Returns true when an update -// is needed. -function maybeUpdateLineNumberWidth(cm) { - if (!cm.options.lineNumbers) { return false } - var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display - if (last.length != display.lineNumChars) { - var test = display.measure.appendChild(elt("div", [elt("div", last)], - "CodeMirror-linenumber CodeMirror-gutter-elt")) - var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW - display.lineGutter.style.width = "" - display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1 - display.lineNumWidth = display.lineNumInnerWidth + padding - display.lineNumChars = display.lineNumInnerWidth ? last.length : -1 - display.lineGutter.style.width = display.lineNumWidth + "px" - updateGutterSpace(cm) - return true - } - return false -} - -// Read the actual heights of the rendered lines, and update their -// stored heights to match. -function updateHeightsInViewport(cm) { - var display = cm.display - var prevBottom = display.lineDiv.offsetTop - for (var i = 0; i < display.view.length; i++) { - var cur = display.view[i], height = (void 0) - if (cur.hidden) { continue } - if (ie && ie_version < 8) { - var bot = cur.node.offsetTop + cur.node.offsetHeight - height = bot - prevBottom - prevBottom = bot - } else { - var box = cur.node.getBoundingClientRect() - height = box.bottom - box.top - } - var diff = cur.line.height - height - if (height < 2) { height = textHeight(display) } - if (diff > .001 || diff < -.001) { - updateLineHeight(cur.line, height) - updateWidgetHeight(cur.line) - if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) - { updateWidgetHeight(cur.rest[j]) } } - } - } -} - -// Read and store the height of line widgets associated with the -// given line. -function updateWidgetHeight(line) { - if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) - { line.widgets[i].height = line.widgets[i].node.parentNode.offsetHeight } } -} - -// Compute the lines that are visible in a given viewport (defaults -// the the current scroll position). viewport may contain top, -// height, and ensure (see op.scrollToPos) properties. -function visibleLines(display, doc, viewport) { - var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop - top = Math.floor(top - paddingTop(display)) - var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight - - var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom) - // Ensure is a {from: {line, ch}, to: {line, ch}} object, and - // forces those lines into the viewport (if possible). - if (viewport && viewport.ensure) { - var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line - if (ensureFrom < from) { - from = ensureFrom - to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight) - } else if (Math.min(ensureTo, doc.lastLine()) >= to) { - from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight) - to = ensureTo - } - } - return {from: from, to: Math.max(to, from + 1)} -} - -// Sync the scrollable area and scrollbars, ensure the viewport -// covers the visible area. -function setScrollTop(cm, val) { - if (Math.abs(cm.doc.scrollTop - val) < 2) { return } - cm.doc.scrollTop = val - if (!gecko) { updateDisplaySimple(cm, {top: val}) } - if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val } - cm.display.scrollbars.setScrollTop(val) - if (gecko) { updateDisplaySimple(cm) } - startWorker(cm, 100) -} -// Sync scroller and scrollbar, ensure the gutter elements are -// aligned. -function setScrollLeft(cm, val, isScroller) { - if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) { return } - val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth) - cm.doc.scrollLeft = val - alignHorizontally(cm) - if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val } - cm.display.scrollbars.setScrollLeft(val) -} - -// Since the delta values reported on mouse wheel events are -// unstandardized between browsers and even browser versions, and -// generally horribly unpredictable, this code starts by measuring -// the scroll effect that the first few mouse wheel events have, -// and, from that, detects the way it can convert deltas to pixel -// offsets afterwards. -// -// The reason we want to know the amount a wheel event will scroll -// is that it gives us a chance to update the display before the -// actual scrolling happens, reducing flickering. - -var wheelSamples = 0; -var wheelPixelsPerUnit = null; -// Fill in a browser-detected starting value on browsers where we -// know one. These don't have to be accurate -- the result of them -// being wrong would just be a slight flicker on the first wheel -// scroll (if it is large enough). -if (ie) { wheelPixelsPerUnit = -.53 } -else if (gecko) { wheelPixelsPerUnit = 15 } -else if (chrome) { wheelPixelsPerUnit = -.7 } -else if (safari) { wheelPixelsPerUnit = -1/3 } - -function wheelEventDelta(e) { - var dx = e.wheelDeltaX, dy = e.wheelDeltaY - if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail } - if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail } - else if (dy == null) { dy = e.wheelDelta } - return {x: dx, y: dy} -} -function wheelEventPixels(e) { - var delta = wheelEventDelta(e) - delta.x *= wheelPixelsPerUnit - delta.y *= wheelPixelsPerUnit - return delta -} - -function onScrollWheel(cm, e) { - var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y - - var display = cm.display, scroll = display.scroller - // Quit if there's nothing to scroll here - var canScrollX = scroll.scrollWidth > scroll.clientWidth - var canScrollY = scroll.scrollHeight > scroll.clientHeight - if (!(dx && canScrollX || dy && canScrollY)) { return } - - // Webkit browsers on OS X abort momentum scrolls when the target - // of the scroll event is removed from the scrollable element. - // This hack (see related code in patchDisplay) makes sure the - // element is kept around. - if (dy && mac && webkit) { - outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { - for (var i = 0; i < view.length; i++) { - if (view[i].node == cur) { - cm.display.currentWheelTarget = cur - break outer - } + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } } } - } - // On some browsers, horizontal scrolling will cause redraws to - // happen before the gutter has been realigned, causing it to - // wriggle around in a most unseemly way. When we have an - // estimated pixels/delta value, we just handle horizontal - // scrolling entirely here. It'll be slightly off from native, but - // better than glitching out. - if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { - if (dy && canScrollY) - { setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight))) } - setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth))) - // Only prevent default scrolling if vertical scrolling is - // actually possible. Otherwise, it causes vertical scroll - // jitter on OSX trackpads when deltaX is small and deltaY - // is large (issue #3579) - if (!dy || (dy && canScrollY)) - { e_preventDefault(e) } - display.wheelStartX = null // Abort measurement, if in progress - return - } - - // 'Project' the visible viewport to cover the area that is being - // scrolled into view (if we know enough to estimate it). - if (dy && wheelPixelsPerUnit != null) { - var pixels = dy * wheelPixelsPerUnit - var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight - if (pixels < 0) { top = Math.max(0, top + pixels - 50) } - else { bot = Math.min(cm.doc.height, bot + pixels + 50) } - updateDisplaySimple(cm, {top: top, bottom: bot}) - } - - if (wheelSamples < 20) { - if (display.wheelStartX == null) { - display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop - display.wheelDX = dx; display.wheelDY = dy - setTimeout(function () { - if (display.wheelStartX == null) { return } - var movedX = scroll.scrollLeft - display.wheelStartX - var movedY = scroll.scrollTop - display.wheelStartY - var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || - (movedX && display.wheelDX && movedX / display.wheelDX) - display.wheelStartX = display.wheelStartY = null - if (!sample) { return } - wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1) - ++wheelSamples - }, 200) + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + // If e is null or undefined we interpret this as someone trying + // to explicitly cancel the selection rather than the user + // letting go of the mouse button. + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range) { + var anchor = range.anchor; + var head = range.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range } + var order = getOrder(anchorLine); + if (!order) { return range } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { return range } + var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { return range } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; } else { - display.wheelDX += dx; display.wheelDY += dy - } - } -} - -// SCROLLBARS - -// Prepare DOM reads needed to update the scrollbars. Done in one -// shot to minimize update/measure roundtrips. -function measureForScrollbars(cm) { - var d = cm.display, gutterW = d.gutters.offsetWidth - var docH = Math.round(cm.doc.height + paddingVert(cm.display)) - return { - clientHeight: d.scroller.clientHeight, - viewHeight: d.wrapper.clientHeight, - scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, - viewWidth: d.wrapper.clientWidth, - barLeft: cm.options.fixedGutter ? gutterW : 0, - docHeight: docH, - scrollHeight: docH + scrollGap(cm) + d.barHeight, - nativeBarWidth: d.nativeBarWidth, - gutterWidth: gutterW - } -} - -var NativeScrollbars = function(place, scroll, cm) { - this.cm = cm - var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar") - var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar") - place(vert); place(horiz) - - on(vert, "scroll", function () { - if (vert.clientHeight) { scroll(vert.scrollTop, "vertical") } - }) - on(horiz, "scroll", function () { - if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal") } - }) - - this.checkedZeroWidth = false - // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). - if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px" } -}; - -NativeScrollbars.prototype.update = function (measure) { - var needsH = measure.scrollWidth > measure.clientWidth + 1 - var needsV = measure.scrollHeight > measure.clientHeight + 1 - var sWidth = measure.nativeBarWidth - - if (needsV) { - this.vert.style.display = "block" - this.vert.style.bottom = needsH ? sWidth + "px" : "0" - var totalHeight = measure.viewHeight - (needsH ? sWidth : 0) - // A bug in IE8 can cause this value to be negative, so guard it. - this.vert.firstChild.style.height = - Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px" - } else { - this.vert.style.display = "" - this.vert.firstChild.style.height = "0" - } - - if (needsH) { - this.horiz.style.display = "block" - this.horiz.style.right = needsV ? sWidth + "px" : "0" - this.horiz.style.left = measure.barLeft + "px" - var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0) - this.horiz.firstChild.style.width = - (measure.scrollWidth - measure.clientWidth + totalWidth) + "px" - } else { - this.horiz.style.display = "" - this.horiz.firstChild.style.width = "0" - } - - if (!this.checkedZeroWidth && measure.clientHeight > 0) { - if (sWidth == 0) { this.zeroWidthHack() } - this.checkedZeroWidth = true - } - - return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} -}; - -NativeScrollbars.prototype.setScrollLeft = function (pos) { - if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos } - if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz) } -}; - -NativeScrollbars.prototype.setScrollTop = function (pos) { - if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos } - if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert) } -}; - -NativeScrollbars.prototype.zeroWidthHack = function () { - var w = mac && !mac_geMountainLion ? "12px" : "18px" - this.horiz.style.height = this.vert.style.width = w - this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none" - this.disableHoriz = new Delayed - this.disableVert = new Delayed -}; - -NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay) { - bar.style.pointerEvents = "auto" - function maybeDisable() { - // To find out whether the scrollbar is still visible, we - // check whether the element under the pixel in the bottom - // left corner of the scrollbar box is the scrollbar box - // itself (when the bar is still visible) or its filler child - // (when the bar is hidden). If it is still visible, we keep - // it enabled, if it's hidden, we disable pointer events. - var box = bar.getBoundingClientRect() - var elt = document.elementFromPoint(box.left + 1, box.bottom - 1) - if (elt != bar) { bar.style.pointerEvents = "none" } - else { delay.set(1000, maybeDisable) } - } - delay.set(1000, maybeDisable) -}; - -NativeScrollbars.prototype.clear = function () { - var parent = this.horiz.parentNode - parent.removeChild(this.horiz) - parent.removeChild(this.vert) -}; - -var NullScrollbars = function () {}; - -NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; -NullScrollbars.prototype.setScrollLeft = function () {}; -NullScrollbars.prototype.setScrollTop = function () {}; -NullScrollbars.prototype.clear = function () {}; - -function updateScrollbars(cm, measure) { - if (!measure) { measure = measureForScrollbars(cm) } - var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight - updateScrollbarsInner(cm, measure) - for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { - if (startWidth != cm.display.barWidth && cm.options.lineWrapping) - { updateHeightsInViewport(cm) } - updateScrollbarsInner(cm, measureForScrollbars(cm)) - startWidth = cm.display.barWidth; startHeight = cm.display.barHeight - } -} - -// Re-synchronize the fake scrollbars with the actual size of the -// content. -function updateScrollbarsInner(cm, measure) { - var d = cm.display - var sizes = d.scrollbars.update(measure) - - d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px" - d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px" - d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent" - - if (sizes.right && sizes.bottom) { - d.scrollbarFiller.style.display = "block" - d.scrollbarFiller.style.height = sizes.bottom + "px" - d.scrollbarFiller.style.width = sizes.right + "px" - } else { d.scrollbarFiller.style.display = "" } - if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { - d.gutterFiller.style.display = "block" - d.gutterFiller.style.height = sizes.bottom + "px" - d.gutterFiller.style.width = measure.gutterWidth + "px" - } else { d.gutterFiller.style.display = "" } -} - -var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars} - -function initScrollbars(cm) { - if (cm.display.scrollbars) { - cm.display.scrollbars.clear() - if (cm.display.scrollbars.addClass) - { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass) } + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) + { leftSide = dir < 0; } + else + { leftSide = dir > 0; } + } + + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head) } - cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { - cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller) - // Prevent clicks in the scrollbars from killing focus - on(node, "mousedown", function () { - if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0) } - }) - node.setAttribute("cm-not-content", "true") - }, function (pos, axis) { - if (axis == "horizontal") { setScrollLeft(cm, pos) } - else { setScrollTop(cm, pos) } - }, cm) - if (cm.display.scrollbars.addClass) - { addClass(cm.display.wrapper, cm.display.scrollbars.addClass) } -} - -// SCROLLING THINGS INTO VIEW - -// If an editor sits on the top or bottom of the window, partially -// scrolled out of view, this ensures that the cursor is visible. -function maybeScrollWindow(cm, coords) { - if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } - - var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null - if (coords.top + box.top < 0) { doScroll = true } - else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false } - if (doScroll != null && !phantom) { - var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (coords.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (coords.bottom - coords.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (coords.left) + "px; width: 2px;")) - cm.display.lineSpace.appendChild(scrollNode) - scrollNode.scrollIntoView(doScroll) - cm.display.lineSpace.removeChild(scrollNode) - } -} - -// Scroll a given position into view (immediately), verifying that -// it actually became visible (as line heights are accurately -// measured, the position of something may 'drift' during drawing). -function scrollPosIntoView(cm, pos, end, margin) { - if (margin == null) { margin = 0 } - var coords - for (var limit = 0; limit < 5; limit++) { - var changed = false - coords = cursorCoords(cm, pos) - var endCoords = !end || end == pos ? coords : cursorCoords(cm, end) - var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left), - Math.min(coords.top, endCoords.top) - margin, - Math.max(coords.left, endCoords.left), - Math.max(coords.bottom, endCoords.bottom) + margin) - var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft - if (scrollPos.scrollTop != null) { - setScrollTop(cm, scrollPos.scrollTop) - if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true } - } - if (scrollPos.scrollLeft != null) { - setScrollLeft(cm, scrollPos.scrollLeft) - if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true } - } - if (!changed) { break } - } - return coords -} - -// Scroll a given set of coordinates into view (immediately). -function scrollIntoView(cm, x1, y1, x2, y2) { - var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2) - if (scrollPos.scrollTop != null) { setScrollTop(cm, scrollPos.scrollTop) } - if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft) } -} - -// Calculate a new scroll position needed to scroll the given -// rectangle into view. Returns an object with scrollTop and -// scrollLeft properties. When these are undefined, the -// vertical/horizontal position does not need to be adjusted. -function calculateScrollPos(cm, x1, y1, x2, y2) { - var display = cm.display, snapMargin = textHeight(cm.display) - if (y1 < 0) { y1 = 0 } - var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop - var screen = displayHeight(cm), result = {} - if (y2 - y1 > screen) { y2 = y1 + screen } - var docBottom = cm.doc.height + paddingVert(display) - var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin - if (y1 < screentop) { - result.scrollTop = atTop ? 0 : y1 - } else if (y2 > screentop + screen) { - var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen) - if (newTop != screentop) { result.scrollTop = newTop } - } - - var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0) - var tooWide = x2 - x1 > screenw - if (tooWide) { x2 = x1 + screenw } - if (x1 < 10) - { result.scrollLeft = 0 } - else if (x1 < screenleft) - { result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10)) } - else if (x2 > screenw + screenleft - 3) - { result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw } - return result -} - -// Store a relative adjustment to the scroll position in the current -// operation (to be applied when the operation finishes). -function addToScrollPos(cm, left, top) { - if (left != null || top != null) { resolveScrollToPos(cm) } - if (left != null) - { cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left } - if (top != null) - { cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top } -} - -// Make sure that at the end of the operation the current cursor is -// shown. -function ensureCursorVisible(cm) { - resolveScrollToPos(cm) - var cur = cm.getCursor(), from = cur, to = cur - if (!cm.options.lineWrapping) { - from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur - to = Pos(cur.line, cur.ch + 1) - } - cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true} -} - -// When an operation has its scrollToPos property set, and another -// scroll action is applied before the end of the operation, this -// 'simulates' scrolling that position into view in a cheap way, so -// that the effect of intermediate scroll commands is not ignored. -function resolveScrollToPos(cm) { - var range = cm.curOp.scrollToPos - if (range) { - cm.curOp.scrollToPos = null - var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to) - var sPos = calculateScrollPos(cm, Math.min(from.left, to.left), - Math.min(from.top, to.top) - range.margin, - Math.max(from.right, to.right), - Math.max(from.bottom, to.bottom) + range.margin) - cm.scrollTo(sPos.scrollLeft, sPos.scrollTop) - } -} - -// Operations are used to wrap a series of changes to the editor -// state in such a way that each change won't have to update the -// cursor and display (which would be awkward, slow, and -// error-prone). Instead, display updates are batched and then all -// combined and executed at once. - -var nextOpId = 0 -// Start a new operation. -function startOperation(cm) { - cm.curOp = { - cm: cm, - viewChanged: false, // Flag that indicates that lines might need to be redrawn - startHeight: cm.doc.height, // Used to detect need to update scrollbar - forceUpdate: false, // Used to force a redraw - updateInput: null, // Whether to reset the input textarea - typing: false, // Whether this reset should be careful to leave existing text (for compositing) - changeObjs: null, // Accumulated changes, for firing change events - cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on - cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already - selectionChanged: false, // Whether the selection needs to be redrawn - updateMaxLine: false, // Set when the widest line needs to be determined anew - scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet - scrollToPos: null, // Used to scroll to a specific position - focus: false, - id: ++nextOpId // Unique ID - } - pushOperation(cm.curOp) -} - -// Finish an operation, updating the display and signalling delayed events -function endOperation(cm) { - var op = cm.curOp - finishOperation(op, function (group) { - for (var i = 0; i < group.ops.length; i++) - { group.ops[i].cm.curOp = null } - endOperations(group) - }) -} - -// The DOM updates done when an operation finishes are batched so -// that the minimum number of relayouts are required. -function endOperations(group) { - var ops = group.ops - for (var i = 0; i < ops.length; i++) // Read DOM - { endOperation_R1(ops[i]) } - for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) - { endOperation_W1(ops[i$1]) } - for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM - { endOperation_R2(ops[i$2]) } - for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) - { endOperation_W2(ops[i$3]) } - for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM - { endOperation_finish(ops[i$4]) } -} - -function endOperation_R1(op) { - var cm = op.cm, display = cm.display - maybeClipScrollbars(cm) - if (op.updateMaxLine) { findMaxLine(cm) } - - op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || - op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || - op.scrollToPos.to.line >= display.viewTo) || - display.maxLineChanged && cm.options.lineWrapping - op.update = op.mustUpdate && - new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate) -} - -function endOperation_W1(op) { - op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update) -} - -function endOperation_R2(op) { - var cm = op.cm, display = cm.display - if (op.updatedDisplay) { updateHeightsInViewport(cm) } - - op.barMeasure = measureForScrollbars(cm) - - // If the max line changed since it was last measured, measure it, - // and ensure the document's width matches it. - // updateDisplay_W2 will use these properties to do the actual resizing - if (display.maxLineChanged && !cm.options.lineWrapping) { - op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3 - cm.display.sizerWidth = op.adjustWidthTo - op.barMeasure.scrollWidth = - Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth) - op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)) - } - - if (op.updatedDisplay || op.selectionChanged) - { op.preparedSelection = display.input.prepareSelection(op.focus) } -} - -function endOperation_W2(op) { - var cm = op.cm - - if (op.adjustWidthTo != null) { - cm.display.sizer.style.minWidth = op.adjustWidthTo + "px" - if (op.maxScrollLeft < cm.doc.scrollLeft) - { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true) } - cm.display.maxLineChanged = false - } - - var takeFocus = op.focus && op.focus == activeElt() && (!document.hasFocus || document.hasFocus()) - if (op.preparedSelection) - { cm.display.input.showSelection(op.preparedSelection, takeFocus) } - if (op.updatedDisplay || op.startHeight != cm.doc.height) - { updateScrollbars(cm, op.barMeasure) } - if (op.updatedDisplay) - { setDocumentHeight(cm, op.barMeasure) } - - if (op.selectionChanged) { restartBlink(cm) } - - if (cm.state.focused && op.updateInput) - { cm.display.input.reset(op.typing) } - if (takeFocus) { ensureFocus(op.cm) } -} - -function endOperation_finish(op) { - var cm = op.cm, display = cm.display, doc = cm.doc - - if (op.updatedDisplay) { postUpdateDisplay(cm, op.update) } - - // Abort mouse wheel delta measurement, when scrolling explicitly - if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) - { display.wheelStartX = display.wheelStartY = null } - - // Propagate the scroll position to the actual DOM scroller - if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) { - doc.scrollTop = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop)) - display.scrollbars.setScrollTop(doc.scrollTop) - display.scroller.scrollTop = doc.scrollTop - } - if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) { - doc.scrollLeft = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft)) - display.scrollbars.setScrollLeft(doc.scrollLeft) - display.scroller.scrollLeft = doc.scrollLeft - alignHorizontally(cm) - } - // If we need to scroll a specific position into view, do so. - if (op.scrollToPos) { - var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), - clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin) - if (op.scrollToPos.isCursor && cm.state.focused) { maybeScrollWindow(cm, coords) } - } - - // Fire events for markers that are hidden/unidden by editing or - // undoing - var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers - if (hidden) { for (var i = 0; i < hidden.length; ++i) - { if (!hidden[i].lines.length) { signal(hidden[i], "hide") } } } - if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) - { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide") } } } - - if (display.wrapper.offsetHeight) - { doc.scrollTop = cm.display.scroller.scrollTop } - - // Fire change events, and delayed event handlers - if (op.changeObjs) - { signal(cm, "changes", cm, op.changeObjs) } - if (op.update) - { op.update.finish() } -} - -// Run the given function in an operation -function runInOp(cm, f) { - if (cm.curOp) { return f() } - startOperation(cm) - try { return f() } - finally { endOperation(cm) } -} -// Wraps a function in an operation. Returns the wrapped function. -function operation(cm, f) { - return function() { - if (cm.curOp) { return f.apply(cm, arguments) } - startOperation(cm) - try { return f.apply(cm, arguments) } - finally { endOperation(cm) } - } -} -// Used to add methods to editor and doc instances, wrapping them in -// operations. -function methodOp(f) { - return function() { - if (this.curOp) { return f.apply(this, arguments) } - startOperation(this) - try { return f.apply(this, arguments) } - finally { endOperation(this) } - } -} -function docMethodOp(f) { - return function() { - var cm = this.cm - if (!cm || cm.curOp) { return f.apply(this, arguments) } - startOperation(cm) - try { return f.apply(this, arguments) } - finally { endOperation(cm) } - } -} - -// Updates the display.view data structure for a given change to the -// document. From and to are in pre-change coordinates. Lendiff is -// the amount of lines added or subtracted by the change. This is -// used for changes that span multiple lines, or change the way -// lines are divided into visual lines. regLineChange (below) -// registers single-line changes. -function regChange(cm, from, to, lendiff) { - if (from == null) { from = cm.doc.first } - if (to == null) { to = cm.doc.first + cm.doc.size } - if (!lendiff) { lendiff = 0 } - - var display = cm.display - if (lendiff && to < display.viewTo && - (display.updateLineNumbers == null || display.updateLineNumbers > from)) - { display.updateLineNumbers = from } - - cm.curOp.viewChanged = true - - if (from >= display.viewTo) { // Change after - if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) - { resetView(cm) } - } else if (to <= display.viewFrom) { // Change before - if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { - resetView(cm) - } else { - display.viewFrom += lendiff - display.viewTo += lendiff - } - } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap - resetView(cm) - } else if (from <= display.viewFrom) { // Top overlap - var cut = viewCuttingPoint(cm, to, to + lendiff, 1) - if (cut) { - display.view = display.view.slice(cut.index) - display.viewFrom = cut.lineN - display.viewTo += lendiff - } else { - resetView(cm) - } - } else if (to >= display.viewTo) { // Bottom overlap - var cut$1 = viewCuttingPoint(cm, from, from, -1) - if (cut$1) { - display.view = display.view.slice(0, cut$1.index) - display.viewTo = cut$1.lineN - } else { - resetView(cm) - } - } else { // Gap in the middle - var cutTop = viewCuttingPoint(cm, from, from, -1) - var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1) - if (cutTop && cutBot) { - display.view = display.view.slice(0, cutTop.index) - .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) - .concat(display.view.slice(cutBot.index)) - display.viewTo += lendiff - } else { - resetView(cm) - } - } - - var ext = display.externalMeasured - if (ext) { - if (to < ext.lineN) - { ext.lineN += lendiff } - else if (from < ext.lineN + ext.size) - { display.externalMeasured = null } - } -} - -// Register a change to a single line. Type must be one of "text", -// "gutter", "class", "widget" -function regLineChange(cm, line, type) { - cm.curOp.viewChanged = true - var display = cm.display, ext = cm.display.externalMeasured - if (ext && line >= ext.lineN && line < ext.lineN + ext.size) - { display.externalMeasured = null } - - if (line < display.viewFrom || line >= display.viewTo) { return } - var lineView = display.view[findViewIndex(cm, line)] - if (lineView.node == null) { return } - var arr = lineView.changes || (lineView.changes = []) - if (indexOf(arr, type) == -1) { arr.push(type) } -} - -// Clear the view. -function resetView(cm) { - cm.display.viewFrom = cm.display.viewTo = cm.doc.first - cm.display.view = [] - cm.display.viewOffset = 0 -} - -function viewCuttingPoint(cm, oldN, newN, dir) { - var index = findViewIndex(cm, oldN), diff, view = cm.display.view - if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) - { return {index: index, lineN: newN} } - var n = cm.display.viewFrom - for (var i = 0; i < index; i++) - { n += view[i].size } - if (n != oldN) { - if (dir > 0) { - if (index == view.length - 1) { return null } - diff = (n + view[index].size) - oldN - index++ - } else { - diff = n - oldN - } - oldN += diff; newN += diff - } - while (visualLineNo(cm.doc, newN) != newN) { - if (index == (dir < 0 ? 0 : view.length - 1)) { return null } - newN += dir * view[index - (dir < 0 ? 1 : 0)].size - index += dir - } - return {index: index, lineN: newN} -} - -// Force the view to cover a given range, adding empty view element -// or clipping off existing ones as needed. -function adjustView(cm, from, to) { - var display = cm.display, view = display.view - if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { - display.view = buildViewArray(cm, from, to) - display.viewFrom = from - } else { - if (display.viewFrom > from) - { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view) } - else if (display.viewFrom < from) - { display.view = display.view.slice(findViewIndex(cm, from)) } - display.viewFrom = from - if (display.viewTo < to) - { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)) } - else if (display.viewTo > to) - { display.view = display.view.slice(0, findViewIndex(cm, to)) } - } - display.viewTo = to -} - -// Count the number of lines in the view whose DOM representation is -// out of date (or nonexistent). -function countDirtyView(cm) { - var view = cm.display.view, dirty = 0 - for (var i = 0; i < view.length; i++) { - var lineView = view[i] - if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty } - } - return dirty -} - -// HIGHLIGHT WORKER - -function startWorker(cm, time) { - if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo) - { cm.state.highlight.set(time, bind(highlightWorker, cm)) } -} - -function highlightWorker(cm) { - var doc = cm.doc - if (doc.frontier < doc.first) { doc.frontier = doc.first } - if (doc.frontier >= cm.display.viewTo) { return } - var end = +new Date + cm.options.workTime - var state = copyState(doc.mode, getStateBefore(cm, doc.frontier)) - var changedLines = [] - - doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { - if (doc.frontier >= cm.display.viewFrom) { // Visible - var oldStyles = line.styles, tooLong = line.text.length > cm.options.maxHighlightLength - var highlighted = highlightLine(cm, line, tooLong ? copyState(doc.mode, state) : state, true) - line.styles = highlighted.styles - var oldCls = line.styleClasses, newCls = highlighted.classes - if (newCls) { line.styleClasses = newCls } - else if (oldCls) { line.styleClasses = null } - var ischange = !oldStyles || oldStyles.length != line.styles.length || - oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass) - for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i] } - if (ischange) { changedLines.push(doc.frontier) } - line.stateAfter = tooLong ? state : copyState(doc.mode, state) + + // Determines whether an event happened in the gutter, and fires the + // handlers for the corresponding event. + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; } else { - if (line.text.length <= cm.options.maxHighlightLength) - { processLine(cm, line.text, state) } - line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null - } - ++doc.frontier - if (+new Date > end) { - startWorker(cm, cm.options.workDelay) - return true + try { mX = e.clientX; mY = e.clientY; } + catch(e$1) { return false } } - }) - if (changedLines.length) { runInOp(cm, function () { - for (var i = 0; i < changedLines.length; i++) - { regLineChange(cm, changedLines[i], "text") } - }) } -} - -// DISPLAY DRAWING - -var DisplayUpdate = function(cm, viewport, force) { - var display = cm.display - - this.viewport = viewport - // Store some values that we'll need later (but don't want to force a relayout for) - this.visible = visibleLines(display, cm.doc, viewport) - this.editorIsHidden = !display.wrapper.offsetWidth - this.wrapperHeight = display.wrapper.clientHeight - this.wrapperWidth = display.wrapper.clientWidth - this.oldDisplayWidth = displayWidth(cm) - this.force = force - this.dims = getDimensions(cm) - this.events = [] -}; - -DisplayUpdate.prototype.signal = function (emitter, type) { - if (hasHandler(emitter, type)) - { this.events.push(arguments) } -}; -DisplayUpdate.prototype.finish = function () { - var this$1 = this; + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } - for (var i = 0; i < this.events.length; i++) - { signal.apply(null, this$1.events[i]) } -}; - -function maybeClipScrollbars(cm) { - var display = cm.display - if (!display.scrollbarsClipped && display.scroller.offsetWidth) { - display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth - display.heightForcer.style.height = scrollGap(cm) + "px" - display.sizer.style.marginBottom = -display.nativeBarWidth + "px" - display.sizer.style.borderRightWidth = scrollGap(cm) + "px" - display.scrollbarsClipped = true - } -} - -// Does the actual updating of the line display. Bails out -// (returning false) when there is nothing to be done and forced is -// false. -function updateDisplayIfNeeded(cm, update) { - var display = cm.display, doc = cm.doc - - if (update.editorIsHidden) { - resetView(cm) - return false - } + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); - // Bail out if the visible area is already rendered and nothing changed. - if (!update.force && - update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && - (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && - display.renderedView == display.view && countDirtyView(cm) == 0) - { return false } - - if (maybeUpdateLineNumberWidth(cm)) { - resetView(cm) - update.dims = getDimensions(cm) - } - - // Compute a suitable new viewport (from & to) - var end = doc.first + doc.size - var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first) - var to = Math.min(end, update.visible.to + cm.options.viewportMargin) - if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom) } - if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo) } - if (sawCollapsedSpans) { - from = visualLineNo(cm.doc, from) - to = visualLineEndNo(cm.doc, to) - } - - var different = from != display.viewFrom || to != display.viewTo || - display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth - adjustView(cm, from, to) - - display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)) - // Position the mover div to align with the current scroll position - cm.display.mover.style.top = display.viewOffset + "px" - - var toUpdate = countDirtyView(cm) - if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && - (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) - { return false } - - // For big changes, we hide the enclosing element during the - // update, since that speeds up the operations on most browsers. - var focused = activeElt() - if (toUpdate > 4) { display.lineDiv.style.display = "none" } - patchDisplay(cm, display.updateLineNumbers, update.dims) - if (toUpdate > 4) { display.lineDiv.style.display = "" } - display.renderedView = display.view - // There might have been a widget with a focused element that got - // hidden or updated, if so re-focus it. - - // #DEV - // console.log("[cm] /update_display focuse and activeElt", focused, activeElt() ) - - if (focused && activeElt() != focused && focused.offsetHeight) { focused.focus() } - - // Prevent selection and cursors from interfering with the scroll - // width and height. - removeChildren(display.cursorDiv) - removeChildren(display.selectionDiv) - display.gutters.style.height = display.sizer.style.minHeight = 0 - - if (different) { - display.lastWrapHeight = update.wrapperHeight - display.lastWrapWidth = update.wrapperWidth - startWorker(cm, 400) - } - - display.updateLineNumbers = null - - return true -} - -function postUpdateDisplay(cm, update) { - var viewport = update.viewport - - for (var first = true;; first = false) { - if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { - // Clip forced viewport to actual scrollable area. - if (viewport && viewport.top != null) - { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)} } - // Updated line heights might result in the drawn area not - // actually covering the viewport. Keep looping until it does. - update.visible = visibleLines(cm.display, cm.doc, viewport) - if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) - { break } - } - if (!updateDisplayIfNeeded(cm, update)) { break } - updateHeightsInViewport(cm) - var barMeasure = measureForScrollbars(cm) - updateSelection(cm) - updateScrollbars(cm, barMeasure) - setDocumentHeight(cm, barMeasure) - } - - update.signal(cm, "update", cm) - if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { - update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo) - cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo - } -} - -function updateDisplaySimple(cm, viewport) { - var update = new DisplayUpdate(cm, viewport) - if (updateDisplayIfNeeded(cm, update)) { - updateHeightsInViewport(cm) - postUpdateDisplay(cm, update) - var barMeasure = measureForScrollbars(cm) - updateSelection(cm) - updateScrollbars(cm, barMeasure) - setDocumentHeight(cm, barMeasure) - update.finish() - } -} - -// Sync the actual display DOM structure with display.view, removing -// nodes for lines that are no longer in view, and creating the ones -// that are not there yet, and updating the ones that are out of -// date. -function patchDisplay(cm, updateNumbersFrom, dims) { - var display = cm.display, lineNumbers = cm.options.lineNumbers - var container = display.lineDiv, cur = container.firstChild - - function rm(node) { - var next = node.nextSibling - // Works around a throw-scroll bug in OS X Webkit - if (webkit && mac && cm.display.currentWheelTarget == node) - { node.style.display = "none" } - else - { node.parentNode.removeChild(node) } - return next - } - - var view = display.view, lineN = display.viewFrom - // Loop over the elements in the view, syncing cur (the DOM nodes - // in display.lineDiv) with the view as we go. - for (var i = 0; i < view.length; i++) { - var lineView = view[i] - if (lineView.hidden) { - } else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet - var node = buildLineElement(cm, lineView, lineN, dims) - container.insertBefore(node, cur) - } else { // Already drawn - while (cur != lineView.node) { cur = rm(cur) } - var updateNumber = lineNumbers && updateNumbersFrom != null && - updateNumbersFrom <= lineN && lineView.lineNumber - if (lineView.changes) { - if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false } - updateLineForChanges(cm, lineView, lineN, dims) - } - if (updateNumber) { - removeChildren(lineView.lineNumber) - lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))) - } - cur = lineView.node.nextSibling - } - lineN += lineView.size - } - while (cur) { cur = rm(cur) } -} - -function updateGutterSpace(cm) { - var width = cm.display.gutters.offsetWidth - cm.display.sizer.style.marginLeft = width + "px" -} - -function setDocumentHeight(cm, measure) { - cm.display.sizer.style.minHeight = measure.docHeight + "px" - cm.display.heightForcer.style.top = measure.docHeight + "px" - cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px" -} - -// Rebuild the gutter elements, ensure the margin to the left of the -// code matches their width. -function updateGutters(cm) { - var gutters = cm.display.gutters, specs = cm.options.gutters - removeChildren(gutters) - var i = 0 - for (; i < specs.length; ++i) { - var gutterClass = specs[i] - var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass)) - if (gutterClass == "CodeMirror-linenumbers") { - cm.display.lineGutter = gElt - gElt.style.width = (cm.display.lineNumWidth || 1) + "px" - } - } - gutters.style.display = i ? "" : "none" - updateGutterSpace(cm) -} - -// Make sure the gutters options contains the element -// "CodeMirror-linenumbers" when the lineNumbers option is true. -function setGuttersForLineNumbers(options) { - var found = indexOf(options.gutters, "CodeMirror-linenumbers") - if (found == -1 && options.lineNumbers) { - options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]) - } else if (found > -1 && !options.lineNumbers) { - options.gutters = options.gutters.slice(0) - options.gutters.splice(found, 1) - } -} - -// Selection objects are immutable. A new one is created every time -// the selection changes. A selection is one or more non-overlapping -// (and non-touching) ranges, sorted, and an integer that indicates -// which one is the primary selection (the one that's scrolled into -// view, that getCursor returns, etc). -function Selection(ranges, primIndex) { - this.ranges = ranges - this.primIndex = primIndex -} - -Selection.prototype = { - primary: function() { return this.ranges[this.primIndex] }, - equals: function(other) { - var this$1 = this; + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; - if (other == this) { return true } - if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } - for (var i = 0; i < this.ranges.length; i++) { - var here = this$1.ranges[i], there = other.ranges[i] - if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) { return false } + for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e) + } } - return true - }, - deepCopy: function() { - var this$1 = this; + } - var out = [] - for (var i = 0; i < this.ranges.length; i++) - { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)) } - return new Selection(out, this.primIndex) - }, - somethingSelected: function() { - var this$1 = this; + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) + } - for (var i = 0; i < this.ranges.length; i++) - { if (!this$1.ranges[i].empty()) { return true } } - return false - }, - contains: function(pos, end) { - var this$1 = this; + // CONTEXT MENU HANDLING - if (!end) { end = pos } - for (var i = 0; i < this.ranges.length; i++) { - var range = this$1.ranges[i] - if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) - { return i } - } - return -1 + // To make the context menu work, we need to briefly unhide the + // textarea (making it as unobtrusive as possible) to let the + // right-click take effect on it. + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + if (!captureRightClick) { cm.display.input.onContextMenu(e); } } -} - -function Range(anchor, head) { - this.anchor = anchor; this.head = head -} - -Range.prototype = { - from: function() { return minPos(this.anchor, this.head) }, - to: function() { return maxPos(this.anchor, this.head) }, - empty: function() { - return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch - } -} - -// Take an unsorted, potentially overlapping set of ranges, and -// build a selection out of it. 'Consumes' ranges array (modifying -// it). -function normalizeSelection(ranges, primIndex) { - var prim = ranges[primIndex] - ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }) - primIndex = indexOf(ranges, prim) - for (var i = 1; i < ranges.length; i++) { - var cur = ranges[i], prev = ranges[i - 1] - if (cmp(prev.to(), cur.from()) >= 0) { - var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()) - var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head - if (i <= primIndex) { --primIndex } - ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)) - } - } - return new Selection(ranges, primIndex) -} - -function simpleSelection(anchor, head) { - return new Selection([new Range(anchor, head || anchor)], 0) -} - -// Compute the position of the end of a change (its 'to' property -// refers to the pre-change end). -function changeEnd(change) { - if (!change.text) { return change.to } - return Pos(change.from.line + change.text.length - 1, - lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) -} - -// Adjust a position to refer to the post-change position of the -// same text, or the end of the change if the change covers it. -function adjustForChange(pos, change) { - if (cmp(pos, change.from) < 0) { return pos } - if (cmp(pos, change.to) <= 0) { return changeEnd(change) } - - var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch - if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch } - return Pos(line, ch) -} - -function computeSelAfterChange(doc, change) { - var out = [] - for (var i = 0; i < doc.sel.ranges.length; i++) { - var range = doc.sel.ranges[i] - out.push(new Range(adjustForChange(range.anchor, change), - adjustForChange(range.head, change))) - } - return normalizeSelection(out, doc.sel.primIndex) -} - -function offsetPos(pos, old, nw) { - if (pos.line == old.line) - { return Pos(nw.line, pos.ch - old.ch + nw.ch) } - else - { return Pos(nw.line + (pos.line - old.line), pos.ch) } -} - -// Used by replaceSelections to allow moving the selection to the -// start or around the replaced test. Hint may be "start" or "around". -function computeReplacedSel(doc, changes, hint) { - var out = [] - var oldPrev = Pos(doc.first, 0), newPrev = oldPrev - for (var i = 0; i < changes.length; i++) { - var change = changes[i] - var from = offsetPos(change.from, oldPrev, newPrev) - var to = offsetPos(changeEnd(change), oldPrev, newPrev) - oldPrev = change.to - newPrev = to - if (hint == "around") { - var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0 - out[i] = new Range(inv ? to : from, inv ? from : to) - } else { - out[i] = new Range(from, from) - } - } - return new Selection(out, doc.sel.primIndex) -} - -// Used to get the editor into a consistent state again when options change. - -function loadMode(cm) { - cm.doc.mode = getMode(cm.options, cm.doc.modeOption) - resetModeState(cm) -} - -function resetModeState(cm) { - cm.doc.iter(function (line) { - if (line.stateAfter) { line.stateAfter = null } - if (line.styles) { line.styles = null } - }) - cm.doc.frontier = cm.doc.first - startWorker(cm, 100) - cm.state.modeGen++ - if (cm.curOp) { regChange(cm) } -} - -// DOCUMENT DATA STRUCTURE - -// By default, updates that start and end at the beginning of a line -// are treated specially, in order to make the association of line -// widgets and marker elements with the text behave more intuitive. -function isWholeLineUpdate(doc, change) { - return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && - (!doc.cm || doc.cm.options.wholeLineUpdateBefore) -} - -// Perform a change on the document data structure. -function updateDoc(doc, change, markedSpans, estimateHeight) { - function spansFor(n) {return markedSpans ? markedSpans[n] : null} - function update(line, text, spans) { - updateLine(line, text, spans, estimateHeight) - signalLater(line, "change", line, change) - } - function linesFor(start, end) { - var result = [] - for (var i = start; i < end; ++i) - { result.push(new Line(text[i], spansFor(i), estimateHeight)) } - return result + + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) } - var from = change.from, to = change.to, text = change.text - var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line) - var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line - - // Adjust the line structure - if (change.full) { - doc.insert(0, linesFor(0, text.length)) - doc.remove(text.length, doc.size - text.length) - } else if (isWholeLineUpdate(doc, change)) { - // This is a whole-line replace. Treated specially to make - // sure line objects move the way they are supposed to. - var added = linesFor(0, text.length - 1) - update(lastLine, lastLine.text, lastSpans) - if (nlines) { doc.remove(from.line, nlines) } - if (added.length) { doc.insert(from.line, added) } - } else if (firstLine == lastLine) { - if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans) - } else { - var added$1 = linesFor(1, text.length - 1) - added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)) - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)) - doc.insert(from.line + 1, added$1) - } - } else if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)) - doc.remove(from.line + 1, nlines) - } else { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)) - update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans) - var added$2 = linesFor(1, text.length - 1) - if (nlines > 1) { doc.remove(from.line + 1, nlines - 1) } - doc.insert(from.line + 1, added$2) - } - - signalLater(doc, "change", doc, change) -} - -// Call f for all linked documents. -function linkedDocs(doc, f, sharedHistOnly) { - function propagate(doc, skip, sharedHist) { - if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { - var rel = doc.linked[i] - if (rel.doc == skip) { continue } - var shared = sharedHist && rel.sharedHist - if (sharedHistOnly && !shared) { continue } - f(rel.doc, shared) - propagate(rel.doc, doc, shared) - } } + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); } - propagate(doc, null, true) -} - -// Attach a document to an editor. -function attachDoc(cm, doc) { - if (doc.cm) { throw new Error("This document is already in use.") } - cm.doc = doc - doc.cm = cm - estimateLineHeights(cm) - loadMode(cm) - if (!cm.options.lineWrapping) { findMaxLine(cm) } - cm.options.mode = doc.modeOption - regChange(cm) -} - -function History(startGen) { - // Arrays of change events and selections. Doing something adds an - // event to done and clears undo. Undoing moves events from done - // to undone, redoing moves them in the other direction. - this.done = []; this.undone = [] - this.undoDepth = Infinity - // Used to track when changes can be merged into a single undo - // event - this.lastModTime = this.lastSelTime = 0 - this.lastOp = this.lastSelOp = null - this.lastOrigin = this.lastSelOrigin = null - // Used by the isClean() method - this.generation = this.maxGeneration = startGen || 1 -} - -// Create a history change event from an updateDoc-style change -// object. -function historyChangeFromChange(doc, change) { - var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)} - attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1) - linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true) - return histChange -} - -// Pop all selection events off the end of a history array. Stop at -// a change event. -function clearSelectionEvents(array) { - while (array.length) { - var last = lst(array) - if (last.ranges) { array.pop() } - else { break } - } -} - -// Find the top change event in the history. Pop off selection -// events that are in the way. -function lastChangeEvent(hist, force) { - if (force) { - clearSelectionEvents(hist.done) - return lst(hist.done) - } else if (hist.done.length && !lst(hist.done).ranges) { - return lst(hist.done) - } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { - hist.done.pop() - return lst(hist.done) - } -} - -// Register a change in the history. Merges changes that are within -// a single operation, or are close together with an origin that -// allows merging (starting with "+") into a single event. -function addChangeToHistory(doc, change, selAfter, opId) { - var hist = doc.history - hist.undone.length = 0 - var time = +new Date, cur - var last - - if ((hist.lastOp == opId || - hist.lastOrigin == change.origin && change.origin && - ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) || - change.origin.charAt(0) == "*")) && - (cur = lastChangeEvent(hist, hist.lastOp == opId))) { - // Merge this change into the last event - last = lst(cur.changes) - if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { - // Optimized case for simple insertion -- don't want to add - // new changesets for every character typed - last.to = changeEnd(change) - } else { - // Add new sub-event - cur.changes.push(historyChangeFromChange(doc, change)) - } - } else { - // Can not be merged, start a new event. - var before = lst(hist.done) - if (!before || !before.ranges) - { pushSelectionToHistory(doc.sel, hist.done) } - cur = {changes: [historyChangeFromChange(doc, change)], - generation: hist.generation} - hist.done.push(cur) - while (hist.done.length > hist.undoDepth) { - hist.done.shift() - if (!hist.done[0].ranges) { hist.done.shift() } - } - } - hist.done.push(selAfter) - hist.generation = ++hist.maxGeneration - hist.lastModTime = hist.lastSelTime = time - hist.lastOp = hist.lastSelOp = opId - hist.lastOrigin = hist.lastSelOrigin = change.origin - - if (!last) { signal(doc, "historyAdded") } -} - -function selectionEventCanBeMerged(doc, origin, prev, sel) { - var ch = origin.charAt(0) - return ch == "*" || - ch == "+" && - prev.ranges.length == sel.ranges.length && - prev.somethingSelected() == sel.somethingSelected() && - new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) -} - -// Called whenever the selection changes, sets the new selection as -// the pending selection in the history, and pushes the old pending -// selection into the 'done' array when it was significantly -// different (in number of selected ranges, emptiness, or time). -function addSelectionToHistory(doc, sel, opId, options) { - var hist = doc.history, origin = options && options.origin - - // A new event is started when the previous origin does not match - // the current, or the origins don't allow matching. Origins - // starting with * are always merged, those starting with + are - // merged when similar and close together in time. - if (opId == hist.lastSelOp || - (origin && hist.lastSelOrigin == origin && - (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || - selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) - { hist.done[hist.done.length - 1] = sel } - else - { pushSelectionToHistory(sel, hist.done) } - - hist.lastSelTime = +new Date - hist.lastSelOrigin = origin - hist.lastSelOp = opId - if (options && options.clearRedo !== false) - { clearSelectionEvents(hist.undone) } -} - -function pushSelectionToHistory(sel, dest) { - var top = lst(dest) - if (!(top && top.ranges && top.equals(sel))) - { dest.push(sel) } -} - -// Used to store marked span information in the history. -function attachLocalSpans(doc, change, from, to) { - var existing = change["spans_" + doc.id], n = 0 - doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { - if (line.markedSpans) - { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans } - ++n - }) -} - -// When un/re-doing restores text containing marked spans, those -// that have been explicitly cleared should not be restored. -function removeClearedSpans(spans) { - if (!spans) { return null } - var out - for (var i = 0; i < spans.length; ++i) { - if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i) } } - else if (out) { out.push(spans[i]) } - } - return !out ? spans : out.length ? out : null -} - -// Retrieve and filter the old marked spans stored in a change event. -function getOldSpans(doc, change) { - var found = change["spans_" + doc.id] - if (!found) { return null } - var nw = [] - for (var i = 0; i < change.text.length; ++i) - { nw.push(removeClearedSpans(found[i])) } - return nw -} - -// Used for un/re-doing changes from the history. Combines the -// result of computing the existing spans with the set of spans that -// existed in the history (so that deleting around a span and then -// undoing brings back the span). -function mergeOldSpans(doc, change) { - var old = getOldSpans(doc, change) - var stretched = stretchSpansOverChange(doc, change) - if (!old) { return stretched } - if (!stretched) { return old } - - for (var i = 0; i < old.length; ++i) { - var oldCur = old[i], stretchCur = stretched[i] - if (oldCur && stretchCur) { - spans: for (var j = 0; j < stretchCur.length; ++j) { - var span = stretchCur[j] - for (var k = 0; k < oldCur.length; ++k) - { if (oldCur[k].marker == span.marker) { continue spans } } - oldCur.push(span) - } - } else if (stretchCur) { - old[i] = stretchCur - } - } - return old -} - -// Used both to provide a JSON-safe object in .getHistory, and, when -// detaching a document, to split the history in two -function copyHistoryArray(events, newGroup, instantiateSel) { - var copy = [] - for (var i = 0; i < events.length; ++i) { - var event = events[i] - if (event.ranges) { - copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event) - continue - } - var changes = event.changes, newChanges = [] - copy.push({changes: newChanges}) - for (var j = 0; j < changes.length; ++j) { - var change = changes[j], m = (void 0) - newChanges.push({from: change.from, to: change.to, text: change.text}) - if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { - if (indexOf(newGroup, Number(m[1])) > -1) { - lst(newChanges)[prop] = change[prop] - delete change[prop] - } - } } } - } - } - return copy -} - -// The 'scroll' parameter given to many of these indicated whether -// the new cursor position should be scrolled into view after -// modifying the selection. - -// If shift is held or the extend flag is set, extends a range to -// include a given position (and optionally a second position). -// Otherwise, simply returns the range between the given positions. -// Used for cursor motion and such. -function extendRange(doc, range, head, other) { - if (doc.cm && doc.cm.display.shift || doc.extend) { - var anchor = range.anchor - if (other) { - var posBefore = cmp(head, anchor) < 0 - if (posBefore != (cmp(other, anchor) < 0)) { - anchor = head - head = other - } else if (posBefore != (cmp(head, other) < 0)) { - head = other - } - } - return new Range(anchor, head) - } else { - return new Range(other || head, head) - } -} - -// Extend the primary selection range, discard the rest. -function extendSelection(doc, head, other, options) { - setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options) -} - -// Extend all selections (pos is an array of selections with length -// equal the number of selections) -function extendSelections(doc, heads, options) { - var out = [] - for (var i = 0; i < doc.sel.ranges.length; i++) - { out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null) } - var newSel = normalizeSelection(out, doc.sel.primIndex) - setSelection(doc, newSel, options) -} - -// Updates a single range in the selection. -function replaceOneSelection(doc, i, range, options) { - var ranges = doc.sel.ranges.slice(0) - ranges[i] = range - setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options) -} - -// Reset the selection to a single range. -function setSimpleSelection(doc, anchor, head, options) { - setSelection(doc, simpleSelection(anchor, head), options) -} - -// Give beforeSelectionChange handlers a change to influence a -// selection update. -function filterSelectionChange(doc, sel, options) { - var obj = { - ranges: sel.ranges, - update: function(ranges) { - var this$1 = this; - this.ranges = [] - for (var i = 0; i < ranges.length; i++) - { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), - clipPos(doc, ranges[i].head)) } - }, - origin: options && options.origin - } - signal(doc, "beforeSelectionChange", doc, obj) - if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj) } - if (obj.ranges != sel.ranges) { return normalizeSelection(obj.ranges, obj.ranges.length - 1) } - else { return sel } -} - -function setSelectionReplaceHistory(doc, sel, options) { - var done = doc.history.done, last = lst(done) - if (last && last.ranges) { - done[done.length - 1] = sel - setSelectionNoUndo(doc, sel, options) - } else { - setSelection(doc, sel, options) - } -} - -// Set a new selection. -function setSelection(doc, sel, options) { - setSelectionNoUndo(doc, sel, options) - addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options) -} - -function setSelectionNoUndo(doc, sel, options) { - if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) - { sel = filterSelectionChange(doc, sel, options) } - - var bias = options && options.bias || - (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1) - setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)) - - if (!(options && options.scroll === false) && doc.cm) - { ensureCursorVisible(doc.cm) } -} - -function setSelectionInner(doc, sel) { - if (sel.equals(doc.sel)) { return } - - doc.sel = sel - - if (doc.cm) { - doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true - signalCursorActivity(doc.cm) - } - signalLater(doc, "cursorActivity", doc) -} - -// Verify that the selection does not partially select any atomic -// marked ranges. -function reCheckSelection(doc) { - setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll) -} - -// Return a selection that does not partially select any atomic -// ranges. -function skipAtomicInSelection(doc, sel, bias, mayClear) { - var out - for (var i = 0; i < sel.ranges.length; i++) { - var range = sel.ranges[i] - var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i] - var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear) - var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear) - if (out || newAnchor != range.anchor || newHead != range.head) { - if (!out) { out = sel.ranges.slice(0, i) } - out[i] = new Range(newAnchor, newHead) - } - } - return out ? normalizeSelection(out, sel.primIndex) : sel -} - -function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { - var line = getLine(doc, pos.line) - if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { - var sp = line.markedSpans[i], m = sp.marker - if ((sp.from == null || (m.inclusiveLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && - (sp.to == null || (m.inclusiveRight ? sp.to >= pos.ch : sp.to > pos.ch))) { - if (mayClear) { - signal(m, "beforeCursorEnter") - if (m.explicitlyCleared) { - if (!line.markedSpans) { break } - else {--i; continue} + var Init = {toString: function(){return "CodeMirror.Init"}}; + + var defaults = {}; + var optionHandlers = {}; + + function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\u202d\u202e\u2066\u2067\u2069\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); + option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); } - if (!m.atomic) { continue } - - if (oldPos) { - var near = m.find(dir < 0 ? 1 : -1), diff = (void 0) - if (dir < 0 ? m.inclusiveRight : m.inclusiveLeft) - { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null) } - if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) - { return skipAtomicInner(doc, near, pos, dir, mayClear) } - } - - var far = m.find(dir < 0 ? -1 : 1) - if (dir < 0 ? m.inclusiveLeft : m.inclusiveRight) - { far = movePos(doc, far, dir, far.line == pos.line ? line : null) } - return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null - } - } } - return pos -} - -// Ensure a given position is not inside an atomic range. -function skipAtomic(doc, pos, oldPos, bias, mayClear) { - var dir = bias || 1 - var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || - (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || - skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || - (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)) - if (!found) { - doc.cantEdit = true - return Pos(doc.first, 0) - } - return found -} - -function movePos(doc, pos, dir, line) { - if (dir < 0 && pos.ch == 0) { - if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } - else { return null } - } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { - if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } - else { return null } - } else { - return new Pos(pos.line, pos.ch + dir) - } -} - -function selectAll(cm) { - cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll) -} - -// UPDATING - -// Allow "beforeChange" event handlers to influence a change -function filterChange(doc, change, update) { - var obj = { - canceled: false, - from: change.from, - to: change.to, - text: change.text, - origin: change.origin, - cancel: function () { return obj.canceled = true; } - } - if (update) { obj.update = function (from, to, text, origin) { - if (from) { obj.from = clipPos(doc, from) } - if (to) { obj.to = clipPos(doc, to) } - if (text) { obj.text = text } - if (origin !== undefined) { obj.origin = origin } - } } - signal(doc, "beforeChange", doc, obj) - if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj) } - - if (obj.canceled) { return null } - return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} -} - -// Apply a change to a document, and add it to the document's -// history, and propagating it to all linked documents. -function makeChange(doc, change, ignoreReadOnly) { - if (doc.cm) { - if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } - if (doc.cm.state.suppressEdits) { return } - } - - if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { - change = filterChange(doc, change, true) - if (!change) { return } - } - - // Possibly split or suppress the update based on the presence - // of read-only spans in its range. - var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to) - if (split) { - for (var i = split.length - 1; i >= 0; --i) - { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text}) } - } else { - makeChangeInner(doc, change) - } -} - -function makeChangeInner(doc, change) { - if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } - var selAfter = computeSelAfterChange(doc, change) - addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN) - - makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)) - var rebased = [] - - linkedDocs(doc, function (doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change) - rebased.push(doc.history) - } - makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)) - }) -} - -// Revert a change stored in a document's history. -function makeChangeFromHistory(doc, type, allowSelectionOnly) { - if (doc.cm && doc.cm.state.suppressEdits && !allowSelectionOnly) { return } - - var hist = doc.history, event, selAfter = doc.sel - var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done - - // Verify that there is a useable event (so that ctrl-z won't - // needlessly clear selection events) - var i = 0 - for (; i < source.length; i++) { - event = source[i] - if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) - { break } - } - if (i == source.length) { return } - hist.lastOrigin = hist.lastSelOrigin = null - - for (;;) { - event = source.pop() - if (event.ranges) { - pushSelectionToHistory(event, dest) - if (allowSelectionOnly && !event.equals(doc.sel)) { - setSelection(doc, event, {clearRedo: false}) - return - } - selAfter = event + cm.display.input.readOnlyChanged(val); + }); + + option("screenReaderLabel", null, function (cm, val) { + val = (val === '') ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); + option("phrases", null); + } + + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); } - else { break } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); } - // Build up a reverse change object to add to the opposite history - // stack (redo when undoing, and vice versa). - var antiChanges = [] - pushSelectionToHistory(selAfter, dest) - dest.push({changes: antiChanges, generation: hist.generation}) - hist.generation = event.generation || ++hist.maxGeneration + // A CodeMirror instance represents an editor. This is the object + // that user code is usually dealing with. - var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange") + function CodeMirror(place, options) { + var this$1 = this; - var loop = function ( i ) { - var change = event.changes[i] - change.origin = type - if (filter && !filterChange(doc, change, false)) { - source.length = 0 - return {} + if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + else if (options.mode) { doc.modeOption = options.mode; } + this.doc = doc; + + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(function () { + if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); } + }, 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } + } + + // The default configuration options. + CodeMirror.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.optionHandlers = optionHandlers; + + // Attach the necessary event handlers when initializing the editor + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); + on(d.input.getField(), "contextmenu", function (e) { + if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); } + }); + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); + } + + var initHooks = []; + CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; + + // Indent the given line. The how parameter can be "smart", + // "add"/null, "subtract", or "prev". When aggressive is false + // (typically set to true for forced single-line indents), empty + // lines are not indented, and places where the mode returns Pass + // are left alone. + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } } + } - antiChanges.push(historyChangeFromChange(doc, change)) + // This will be set to a {lineWise: bool, text: [string]} object, so + // that, when pasting, we know what kind of selections the copied + // text was made out of. + var lastCopied = null; - var after = i ? computeSelAfterChange(doc, change) : lst(source) - makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)) - if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}) } - var rebased = [] + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } - // Propagate to the linked documents - linkedDocs(doc, function (doc, sharedHist) { - if (!sharedHist && indexOf(rebased, doc.history) == -1) { - rebaseHist(doc.history, change) - rebased.push(doc.history) + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var recent = +new Date - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasting N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); } - makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)) - }) - }; + } - for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { - var returned = loop( i$1 ); - - if ( returned ) return returned.v; - } -} - -// Sub-views need their line numbers shifted when text is added -// above or below them in the parent document. -function shiftDoc(doc, distance) { - if (distance == 0) { return } - doc.first += distance - doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( - Pos(range.anchor.line + distance, range.anchor.ch), - Pos(range.head.line + distance, range.head.ch) - ); }), doc.sel.primIndex) - if (doc.cm) { - regChange(doc.cm, doc.first, doc.first - distance, distance) - for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) - { regLineChange(doc.cm, l, "gutter") } - } -} - -// More lower-level change function, handling only a single document -// (not linked ones). -function makeChangeSingleDoc(doc, change, selAfter, spans) { - if (doc.cm && !doc.cm.curOp) - { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } - - if (change.to.line < doc.first) { - shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)) - return - } - if (change.from.line > doc.lastLine()) { return } - - // Clip the change to the size of this doc - if (change.from.line < doc.first) { - var shift = change.text.length - 1 - (doc.first - change.from.line) - shiftDoc(doc, shift) - change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), - text: [lst(change.text)], origin: change.origin} - } - var last = doc.lastLine() - if (change.to.line > last) { - change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), - text: [change.text[0]], origin: change.origin} - } - - change.removed = getBetween(doc, change.from, change.to) - - if (!selAfter) { selAfter = computeSelAfterChange(doc, change) } - if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans) } - else { updateDoc(doc, change, spans) } - setSelectionNoUndo(doc, selAfter, sel_dontScroll) -} - -// Handle the interaction of a change to a document with the editor -// that this document is part of. -function makeChangeSingleDocInEditor(cm, change, spans) { - var doc = cm.doc, display = cm.display, from = change.from, to = change.to - - var recomputeMaxLength = false, checkWidthStart = from.line - if (!cm.options.lineWrapping) { - checkWidthStart = lineNo(visualLine(getLine(doc, from.line))) - doc.iter(checkWidthStart, to.line + 1, function (line) { - if (line == display.maxLine) { - recomputeMaxLength = true - return true + var updateInput = cm.curOp.updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range = sel.ranges[i$1]; + var from = range.from(), to = range.to(); + if (range.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) + { from = to = Pos(from.line, 0); } } - }) + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput && cm.hasFocus()) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } } - if (doc.sel.contains(change.from, change.to) > -1) - { signalCursorActivity(cm) } - - updateDoc(doc, change, spans, estimateHeight(cm)) - - if (!cm.options.lineWrapping) { - doc.iter(checkWidthStart, from.line + change.text.length, function (line) { - var len = lineLength(line) - if (len > display.maxLineLength) { - display.maxLine = line - display.maxLineLength = len - display.maxLineChanged = true - recomputeMaxLength = false + function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range = sel.ranges[i]; + if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue } + var mode = cm.getModeAt(range.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) + { indented = indentLine(cm, range.head.line, "smart"); } } - }) - if (recomputeMaxLength) { cm.curOp.updateMaxLine = true } - } + if (indented) { signalLater(cm, "electricInput", cm, range.head.line); } + } + } + + function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} + } + + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "on" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "on" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + return div + } + + // The publicly visible API. Note that methodOp(f) means + // 'wrap f in an operation, performed on its `this` parameter'. + + // This is not the complete set of editor methods. Most of the + // methods defined on the Doc type are also injected into + // CodeMirror.prototype, for backwards compatibility and + // convenience. + + function addEditorMethods(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){win(this).focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); + }, + removeKeyMap: function(map) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map || maps[i].name == map) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this.state.modeGen++; + regChange(this); + return + } + } + }), - // Adjust frontier, schedule worker - doc.frontier = Math.min(doc.frontier, from.line) - startWorker(cm, 400) + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (!range.empty()) { + var from = range.from(), to = range.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this, j, how); } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range.head.line > end) { + indentLine(this, range.head.line, how, true); + end = range.head.line; + if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range = this.doc.sel.primary(); + if (start == null) { pos = range.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range.from() : range.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range) { + if (this$1.display.shift || this$1.doc.extend || range.empty()) + { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range.from() : range.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range) { + var other = findPosH(doc, range.head, dir, unit, false); + return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range) { + if (collapse) + { return dir < 0 ? range.from() : range.to() } + var headPos = cursorCoords(this$1, range.head, "div"); + if (range.goalColumn != null) { headPos.left = range.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, - var lendiff = change.text.length - (to.line - from.line) - 1 - // Remember that these lines changed, for updating the display - if (change.full) - { regChange(cm) } - else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) - { regLineChange(cm, from.line, "text") } - else - { regChange(cm, from.line, to.line + 1, lendiff) } + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt(root(this)) }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range, margin) { + if (range == null) { + range = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range == "number") { + range = {from: Pos(range, 0), to: null}; + } else if (range.from == null) { + range = {from: range, to: null}; + } + if (!range.to) { range.to = range.from; } + range.margin = margin || 0; - var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change") - if (changeHandler || changesHandler) { - var obj = { - from: from, to: to, - text: change.text, - removed: change.removed, - origin: change.origin - } - if (changeHandler) { signalLater(cm, "change", cm, obj) } - if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj) } - } - cm.display.selForContextMenu = null -} - -function replaceRange(doc, code, from, to, origin) { - if (!to) { to = from } - if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp } - if (typeof code == "string") { code = doc.splitLines(code) } - makeChange(doc, {from: from, to: to, text: code, origin: origin}) -} - -// Rebasing/resetting history to deal with externally-sourced changes - -function rebaseHistSelSingle(pos, from, to, diff) { - if (to < pos.line) { - pos.line += diff - } else if (from < pos.line) { - pos.line = from - pos.ch = 0 - } -} - -// Tries to rebase an array of history events given a change in the -// document. If the change touches the same lines as the event, the -// event, and everything 'behind' it, is discarded. If the change is -// before the event, the event's positions are updated. Uses a -// copy-on-write scheme for the positions, to avoid having to -// reallocate them all on every rebase, but also avoid problems with -// shared position objects being unsafely updated. -function rebaseHistArray(array, from, to, diff) { - for (var i = 0; i < array.length; ++i) { - var sub = array[i], ok = true - if (sub.ranges) { - if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true } - for (var j = 0; j < sub.ranges.length; j++) { - rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff) - rebaseHistSelSingle(sub.ranges[j].head, from, to, diff) - } - continue - } - for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { - var cur = sub.changes[j$1] - if (to < cur.from.line) { - cur.from = Pos(cur.from.line + diff, cur.from.ch) - cur.to = Pos(cur.to.line + diff, cur.to.ch) - } else if (from <= cur.to.line) { - ok = false - break + if (range.from.line != null) { + scrollToRange(this, range); + } else { + scrollToCoordsRange(this, range.from, range.to, range.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo = this.display.viewFrom; + this.doc.iter(lineNo, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } } + ++lineNo; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + startOperation: function(){return startOperation(this)}, + endOperation: function(){return endOperation(this)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + // Cancel the current text selection if any (#5821) + if (this.state.selectingText) { this.state.selectingText(); } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText + }, + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; + } + + // Used for horizontal relative motion. Dir is -1 or 1 (left or + // right), unit can be "codepoint", "char", "column" (like char, but + // doesn't cross line boundaries), "word" (across next word), or + // "group" (to the start of next group of word or + // non-word-non-whitespace chars). The visually param controls + // whether, in right-to-left text, direction 1 means to move towards + // the next index in the string, or towards the character to the right + // of the current position. The resulting position will have a + // hitSide=true property if it reached the end of the document. + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + var lineDir = visually && doc.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); + if (isNaN(ch)) { + next = null; + } else { + var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF; + next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); + } + } else if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); } + else + { return false } + } else { + pos = next; } + return true } - if (!ok) { - array.splice(0, i + 1) - i = 0 - } - } -} - -function rebaseHist(hist, change) { - var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1 - rebaseHistArray(hist.done, from, to, diff) - rebaseHistArray(hist.undone, from, to, diff) -} - -// Utility for applying a change to a line by handle or number, -// returning the number and optionally registering the line as -// changed. -function changeLine(doc, handle, changeType, op) { - var no = handle, line = handle - if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)) } - else { no = lineNo(handle) } - if (no == null) { return null } - if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType) } - return line -} - -// The document is represented as a BTree consisting of leaves, with -// chunk of lines in them, and branches, with up to ten leaves or -// other branch nodes below them. The top node is always a branch -// node, and is the document object itself (meaning it has -// additional methods and properties). -// -// All nodes have parent links. The tree is used both to go from -// line numbers to line objects, and to go from objects to numbers. -// It also indexes by height, and is used to convert between height -// and line object, and to find the total height of the document. -// -// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html -function LeafChunk(lines) { - var this$1 = this; + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } - this.lines = lines - this.parent = null - var height = 0 - for (var i = 0; i < lines.length; ++i) { - lines[i].parent = this$1 - height += lines[i].height + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result } - this.height = height -} -LeafChunk.prototype = { - chunkSize: function() { return this.lines.length }, - // Remove the n lines at offset 'at'. - removeInner: function(at, n) { - var this$1 = this; + // For relative vertical movement. Dir may be -1 or 1. Unit can be + // "page" or "line". The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, win(cm).innerHeight || doc(cm).documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; - for (var i = at, e = at + n; i < e; ++i) { - var line = this$1.lines[i] - this$1.height -= line.height - cleanUpLine(line) - signalLater(line, "delete") - } - this.lines.splice(at, n) - }, - // Helper used to collapse a small branch into a single leaf. - collapse: function(lines) { - lines.push.apply(lines, this.lines) - }, - // Insert the given array of lines at offset 'at', count them as - // having the given height. - insertInner: function(at, lines, height) { - var this$1 = this; + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target + } - this.height += height - this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)) - for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1 } - }, - // Used to iterate over a part of the tree. - iterN: function(at, n, op) { - var this$1 = this; + // CONTENTEDITABLE INPUT STYLE - for (var e = at + n; at < e; ++at) - { if (op(this$1.lines[at])) { return true } } - } -} + var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; -function BranchChunk(children) { - var this$1 = this; + ContentEditableInput.prototype.init = function (display) { + var this$1 = this; - this.children = children - var size = 0, height = 0 - for (var i = 0; i < children.length; ++i) { - var ch = children[i] - size += ch.chunkSize(); height += ch.height - ch.parent = this$1 - } - this.size = size - this.height = height - this.parent = null -} + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + div.contentEditable = true; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); -BranchChunk.prototype = { - chunkSize: function() { return this.size }, - removeInner: function(at, n) { - var this$1 = this; + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { return true } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break } + } + return false + } + + on(div, "paste", function (e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); - this.size -= n - for (var i = 0; i < this.children.length; ++i) { - var child = this$1.children[i], sz = child.chunkSize() - if (at < sz) { - var rm = Math.min(n, sz - at), oldHeight = child.height - child.removeInner(at, rm) - this$1.height -= oldHeight - child.height - if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null } - if ((n -= rm) == 0) { break } - at = 0 - } else { at -= sz } - } - // If the result is smaller than 25 lines, ensure that it is a - // single leaf node. - if (this.size - n < 25 && - (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { - var lines = [] - this.collapse(lines) - this.children = [new LeafChunk(lines)] - this.children[0].parent = this - } - }, - collapse: function(lines) { - var this$1 = this; + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); - for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines) } - }, - insertInner: function(at, lines, height) { - var this$1 = this; + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); - this.size += lines.length - this.height += height - for (var i = 0; i < this.children.length; ++i) { - var child = this$1.children[i], sz = child.chunkSize() - if (at <= sz) { - child.insertInner(at, lines, height) - if (child.lines && child.lines.length > 50) { - // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. - // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. - var remaining = child.lines.length % 25 + 25 - for (var pos = remaining; pos < child.lines.length;) { - var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)) - child.height -= leaf.height - this$1.children.splice(++i, 0, leaf) - leaf.parent = this$1 - } - child.lines = child.lines.slice(0, remaining) - this$1.maybeSpill() + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return } - break } - at -= sz + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + disableBrowserMagic(te); + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = activeElt(rootNode(div)); + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); } - }, - // When a node has grown, check whether it should be split. - maybeSpill: function() { - if (this.children.length <= 10) { return } - var me = this - do { - var spilled = me.children.splice(me.children.length - 5, 5) - var sibling = new BranchChunk(spilled) - if (!me.parent) { // Become the parent node - var copy = new BranchChunk(me.children) - copy.parent = me - me.children = [copy, sibling] - me = copy - } else { - me.size -= sibling.size - me.height -= sibling.height - var myIndex = indexOf(me.parent.children, me) - me.parent.children.splice(myIndex + 1, 0, sibling) - } - sibling.parent = me.parent - } while (me.children.length > 10) - me.parent.maybeSpill() - }, - iterN: function(at, n, op) { - var this$1 = this; + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; - for (var i = 0; i < this.children.length; ++i) { - var child = this$1.children[i], sz = child.chunkSize() - if (at < sz) { - var used = Math.min(n, sz - at) - if (child.iterN(at, used, op)) { return true } - if ((n -= used) == 0) { break } - at = 0 - } else { at -= sz } - } - } -} - -// Line widgets are block elements displayed above or below a line. - -function LineWidget(doc, node, options) { - var this$1 = this; - - if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) - { this$1[opt] = options[opt] } } } - this.doc = doc - this.node = node -} -eventMixin(LineWidget) - -function adjustScrollWhenAboveVisible(cm, line, diff) { - if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) - { addToScrollPos(cm, null, diff) } -} - -LineWidget.prototype.clear = function() { - var this$1 = this; - - var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line) - if (no == null || !ws) { return } - for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1) } } - if (!ws.length) { line.widgets = null } - var height = widgetHeight(this) - updateLineHeight(line, Math.max(0, line.height - height)) - if (cm) { runInOp(cm, function () { - adjustScrollWhenAboveVisible(cm, line, -height) - regLineChange(cm, no, "widget") - }) } -} -LineWidget.prototype.changed = function() { - var oldH = this.height, cm = this.doc.cm, line = this.line - this.height = null - var diff = widgetHeight(this) - oldH - if (!diff) { return } - updateLineHeight(line, line.height + diff) - if (cm) { runInOp(cm, function () { - cm.curOp.forceUpdate = true - adjustScrollWhenAboveVisible(cm, line, diff) - }) } -} - -function addLineWidget(doc, handle, node, options) { - var widget = new LineWidget(doc, node, options) - var cm = doc.cm - if (cm && widget.noHScroll) { cm.display.alignWidgets = true } - changeLine(doc, handle, "widget", function (line) { - var widgets = line.widgets || (line.widgets = []) - if (widget.insertAt == null) { widgets.push(widget) } - else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget) } - widget.line = line - if (cm && !lineIsHidden(doc, line)) { - var aboveVisible = heightAtLine(line) < doc.scrollTop - updateLineHeight(line, line.height + widgetHeight(widget)) - if (aboveVisible) { addToScrollPos(cm, null, widget.height) } - cm.curOp.forceUpdate = true - } - return true - }) - return widget -} - -// TEXTMARKERS - -// Created with markText and setBookmark methods. A TextMarker is a -// handle that can be used to clear or find a marked position in the -// document. Line objects hold arrays (markedSpans) containing -// {from, to, marker} object pointing to such marker objects, and -// indicating that such a marker is present on that line. Multiple -// lines may point to the same marker when it spans across lines. -// The spans will have null for their from/to properties when the -// marker continues beyond the start/end of the line. Markers have -// links back to the lines they currently touch. - -// Collapsed markers have unique ids, in order to be able to order -// them, which is needed for uniquely determining an outer marker -// when they overlap (they may nest, but not partially overlap). -var nextMarkerId = 0 - -function TextMarker(doc, type) { - this.lines = [] - this.type = type - this.doc = doc - this.id = ++nextMarkerId -} -eventMixin(TextMarker) - -// Clear the marker. -TextMarker.prototype.clear = function() { - var this$1 = this; - - if (this.explicitlyCleared) { return } - var cm = this.doc.cm, withOp = cm && !cm.curOp - if (withOp) { startOperation(cm) } - if (hasHandler(this, "clear")) { - var found = this.find() - if (found) { signalLater(this, "clear", found.from, found.to) } - } - var min = null, max = null - for (var i = 0; i < this.lines.length; ++i) { - var line = this$1.lines[i] - var span = getMarkedSpanFor(line.markedSpans, this$1) - if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), "text") } - else if (cm) { - if (span.to != null) { max = lineNo(line) } - if (span.from != null) { min = lineNo(line) } - } - line.markedSpans = removeMarkedSpan(line.markedSpans, span) - if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm) - { updateLineHeight(line, textHeight(cm.display)) } - } - if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { - var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual) - if (len > cm.display.maxLineLength) { - cm.display.maxLine = visual - cm.display.maxLineLength = len - cm.display.maxLineChanged = true - } - } } - - if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1) } - this.lines.length = 0 - this.explicitlyCleared = true - if (this.atomic && this.doc.cantEdit) { - this.doc.cantEdit = false - if (cm) { reCheckSelection(cm.doc) } - } - if (cm) { signalLater(cm, "markerCleared", cm, this) } - if (withOp) { endOperation(cm) } - if (this.parent) { this.parent.clear() } -} - -// Find the position of the marker in the document. Returns a {from, -// to} object by default. Side can be passed to get a specific side -// -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the -// Pos objects returned contain a line object, rather than a line -// number (used to prevent looking up the same line twice). -TextMarker.prototype.find = function(side, lineObj) { - var this$1 = this; - - if (side == null && this.type == "bookmark") { side = 1 } - var from, to - for (var i = 0; i < this.lines.length; ++i) { - var line = this$1.lines[i] - var span = getMarkedSpanFor(line.markedSpans, this$1) - if (span.from != null) { - from = Pos(lineObj ? line : lineNo(line), span.from) - if (side == -1) { return from } - } - if (span.to != null) { - to = Pos(lineObj ? line : lineNo(line), span.to) - if (side == 1) { return to } - } - } - return from && {from: from, to: to} -} - -// Signals that the marker's widget changed, and surrounding layout -// should be recomputed. -TextMarker.prototype.changed = function() { - var pos = this.find(-1, true), widget = this, cm = this.doc.cm - if (!pos || !cm) { return } - runInOp(cm, function () { - var line = pos.line, lineN = lineNo(pos.line) - var view = findViewForLine(cm, lineN) - if (view) { - clearLineMeasurementCacheFor(view) - cm.curOp.selectionChanged = cm.curOp.forceUpdate = true - } - cm.curOp.updateMaxLine = true - if (!lineIsHidden(widget.doc, line) && widget.height != null) { - var oldHeight = widget.height - widget.height = null - var dHeight = widgetHeight(widget) - oldHeight - if (dHeight) - { updateLineHeight(line, line.height + dHeight) } - } - }) -} - -TextMarker.prototype.attachLine = function(line) { - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp - if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) - { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this) } - } - this.lines.push(line) -} -TextMarker.prototype.detachLine = function(line) { - this.lines.splice(indexOf(this.lines, line), 1) - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp - ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this) - } -} - -// Create a marker, wire it up to the right lines, and -function markText(doc, from, to, options, type) { - // Shared markers (across linked documents) are handled separately - // (markTextShared will call out to this again, once per - // document). - if (options && options.shared) { return markTextShared(doc, from, to, options, type) } - // Ensure we are in an operation. - if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } - - var marker = new TextMarker(doc, type), diff = cmp(from, to) - if (options) { copyObj(options, marker, false) } - // Don't connect empty markers unless clearWhenEmpty is false - if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) - { return marker } - if (marker.replacedWith) { - // Showing up as a widget implies collapsed (widget replaces text) - marker.collapsed = true - marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget") - marker.widgetNode.setAttribute("role", "presentation") // hide from accessibility tree - if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true") } - if (options.insertLeft) { marker.widgetNode.insertLeft = true } - } - if (marker.collapsed) { - if (conflictingCollapsedRange(doc, from.line, from, to, marker) || - from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) - { throw new Error("Inserting collapsed marker partially overlapping an existing one") } - seeCollapsedSpans() - } - - if (marker.addToHistory) - { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN) } - - var curLine = from.line, cm = doc.cm, updateMaxLine - doc.iter(curLine, to.line + 1, function (line) { - if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) - { updateMaxLine = true } - if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0) } - addMarkedSpan(line, new MarkedSpan(marker, - curLine == from.line ? from.ch : null, - curLine == to.line ? to.ch : null)) - ++curLine - }) - // lineIsHidden depends on the presence of the spans, so needs a second pass - if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { - if (lineIsHidden(doc, line)) { updateLineHeight(line, 0) } - }) } - - if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }) } - - if (marker.readOnly) { - seeReadOnlySpans() - if (doc.history.done.length || doc.history.undone.length) - { doc.clearHistory() } - } - if (marker.collapsed) { - marker.id = ++nextMarkerId - marker.atomic = true - } - if (cm) { - // Sync editor state - if (updateMaxLine) { cm.curOp.updateMaxLine = true } - if (marker.collapsed) - { regChange(cm, from.line, to.line + 1) } - else if (marker.className || marker.title || marker.startStyle || marker.endStyle || marker.css) - { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text") } } - if (marker.atomic) { reCheckSelection(cm.doc) } - signalLater(cm, "markerAdded", cm, marker) - } - return marker -} - -// SHARED TEXTMARKERS - -// A shared marker spans multiple linked documents. It is -// implemented as a meta-marker-object controlling multiple normal -// markers. -function SharedTextMarker(markers, primary) { - var this$1 = this; - - this.markers = markers - this.primary = primary - for (var i = 0; i < markers.length; ++i) - { markers[i].parent = this$1 } -} -eventMixin(SharedTextMarker) - -SharedTextMarker.prototype.clear = function() { - var this$1 = this; - - if (this.explicitlyCleared) { return } - this.explicitlyCleared = true - for (var i = 0; i < this.markers.length; ++i) - { this$1.markers[i].clear() } - signalLater(this, "clear") -} -SharedTextMarker.prototype.find = function(side, lineObj) { - return this.primary.find(side, lineObj) -} - -function markTextShared(doc, from, to, options, type) { - options = copyObj(options) - options.shared = false - var markers = [markText(doc, from, to, options, type)], primary = markers[0] - var widget = options.widgetNode - linkedDocs(doc, function (doc) { - if (widget) { options.widgetNode = widget.cloneNode(true) } - markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)) - for (var i = 0; i < doc.linked.length; ++i) - { if (doc.linked[i].isParent) { return } } - primary = lst(markers) - }) - return new SharedTextMarker(markers, primary) -} - -function findSharedMarkers(doc) { - return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) -} - -function copySharedMarkers(doc, markers) { - for (var i = 0; i < markers.length; i++) { - var marker = markers[i], pos = marker.find() - var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to) - if (cmp(mFrom, mTo)) { - var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type) - marker.markers.push(subMark) - subMark.parent = marker - } - } -} - -function detachSharedMarkers(markers) { - var loop = function ( i ) { - var marker = markers[i], linked = [marker.primary.doc] - linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }) - for (var j = 0; j < marker.markers.length; j++) { - var subMarker = marker.markers[j] - if (indexOf(linked, subMarker.doc) == -1) { - subMarker.parent = null - marker.markers.splice(j--, 1) - } + ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.div.setAttribute('aria-label', label); + } else { + this.div.removeAttribute('aria-label'); } }; - for (var i = 0; i < markers.length; i++) loop( i ); -} - -var nextDocId = 0 -var Doc = function(text, mode, firstLine, lineSep) { - if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep) } - if (firstLine == null) { firstLine = 0 } - - BranchChunk.call(this, [new LeafChunk([new Line("", null)])]) - this.first = firstLine - this.scrollTop = this.scrollLeft = 0 - this.cantEdit = false - this.cleanGeneration = 1 - this.frontier = firstLine - var start = Pos(firstLine, 0) - this.sel = simpleSelection(start) - this.history = new History(null) - this.id = ++nextDocId - this.modeOption = mode - this.lineSep = lineSep - this.extend = false - - if (typeof text == "string") { text = this.splitLines(text) } - updateDoc(this, {from: start, to: start, text: text}) - setSelection(this, simpleSelection(start), sel_dontScroll) -} - -Doc.prototype = createObj(BranchChunk.prototype, { - constructor: Doc, - // Iterate over the document. Supports two forms -- with only one - // argument, it calls that for each line in the document. With - // three, it iterates over the range given by the first two (with - // the second being non-inclusive). - iter: function(from, to, op) { - if (op) { this.iterN(from - this.first, to - from, op) } - else { this.iterN(this.first, this.first + this.size, from) } - }, - - // Non-public interface for adding and removing lines. - insert: function(at, lines) { - var height = 0 - for (var i = 0; i < lines.length; ++i) { height += lines[i].height } - this.insertInner(at - this.first, lines, height) - }, - remove: function(at, n) { this.removeInner(at - this.first, n) }, - - // From here, the methods are part of the public interface. Most - // are also available from CodeMirror (editor) instances. - - getValue: function(lineSep) { - var lines = getLines(this, this.first, this.first + this.size) - if (lineSep === false) { return lines } - return lines.join(lineSep || this.lineSeparator()) - }, - setValue: docMethodOp(function(code) { - var top = Pos(this.first, 0), last = this.first + this.size - 1 - makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), - text: this.splitLines(code), origin: "setValue", full: true}, true) - setSelection(this, simpleSelection(top)) - }), - replaceRange: function(code, from, to, origin) { - from = clipPos(this, from) - to = to ? clipPos(this, to) : from - replaceRange(this, code, from, to, origin) - }, - getRange: function(from, to, lineSep) { - var lines = getBetween(this, clipPos(this, from), clipPos(this, to)) - if (lineSep === false) { return lines } - return lines.join(lineSep || this.lineSeparator()) - }, - - getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, - - getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, - getLineNumber: function(line) {return lineNo(line)}, - - getLineHandleVisualStart: function(line) { - if (typeof line == "number") { line = getLine(this, line) } - return visualLine(line) - }, - - lineCount: function() {return this.size}, - firstLine: function() {return this.first}, - lastLine: function() {return this.first + this.size - 1}, - - clipPos: function(pos) {return clipPos(this, pos)}, - - getCursor: function(start) { - var range = this.sel.primary(), pos - if (start == null || start == "head") { pos = range.head } - else if (start == "anchor") { pos = range.anchor } - else if (start == "end" || start == "to" || start === false) { pos = range.to() } - else { pos = range.from() } - return pos - }, - listSelections: function() { return this.sel.ranges }, - somethingSelected: function() {return this.sel.somethingSelected()}, - - setCursor: docMethodOp(function(line, ch, options) { - setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options) - }), - setSelection: docMethodOp(function(anchor, head, options) { - setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options) - }), - extendSelection: docMethodOp(function(head, other, options) { - extendSelection(this, clipPos(this, head), other && clipPos(this, other), options) - }), - extendSelections: docMethodOp(function(heads, options) { - extendSelections(this, clipPosArray(this, heads), options) - }), - extendSelectionsBy: docMethodOp(function(f, options) { - var heads = map(this.sel.ranges, f) - extendSelections(this, clipPosArray(this, heads), options) - }), - setSelections: docMethodOp(function(ranges, primary, options) { - var this$1 = this; + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = activeElt(rootNode(this.div)) == this.div; + return result + }; - if (!ranges.length) { return } - var out = [] - for (var i = 0; i < ranges.length; i++) - { out[i] = new Range(clipPos(this$1, ranges[i].anchor), - clipPos(this$1, ranges[i].head)) } - if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex) } - setSelection(this, normalizeSelection(out, primary), options) - }), - addSelection: docMethodOp(function(anchor, head, options) { - var ranges = this.sel.ranges.slice(0) - ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))) - setSelection(this, normalizeSelection(ranges, ranges.length - 1), options) - }), - - getSelection: function(lineSep) { - var this$1 = this; + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); + }; - var ranges = this.sel.ranges, lines - for (var i = 0; i < ranges.length; i++) { - var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()) - lines = lines ? lines.concat(sel) : sel - } - if (lineSep === false) { return lines } - else { return lines.join(lineSep || this.lineSeparator()) } - }, - getSelections: function(lineSep) { - var this$1 = this; + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection() + }; - var parts = [], ranges = this.sel.ranges - for (var i = 0; i < ranges.length; i++) { - var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()) - if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()) } - parts[i] = sel - } - return parts - }, - replaceSelection: function(code, collapse, origin) { - var dup = [] - for (var i = 0; i < this.sel.ranges.length; i++) - { dup[i] = code } - this.replaceSelections(dup, collapse, origin || "+input") - }, - replaceSelections: docMethodOp(function(code, collapse, origin) { - var this$1 = this; + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); - var changes = [], sel = this.sel - for (var i = 0; i < sel.ranges.length; i++) { - var range = sel.ranges[i] - changes[i] = {from: range.from(), to: range.to(), text: this$1.splitLines(code[i]), origin: origin} - } - var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse) - for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) - { makeChange(this$1, changes[i$1]) } - if (newSel) { setSelectionReplaceHistory(this, newSel) } - else if (this.cm) { ensureCursorVisible(this.cm) } - }), - undo: docMethodOp(function() {makeChangeFromHistory(this, "undo")}), - redo: docMethodOp(function() {makeChangeFromHistory(this, "redo")}), - undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true)}), - redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true)}), - - setExtending: function(val) {this.extend = val}, - getExtending: function() {return this.extend}, - - historySize: function() { - var hist = this.history, done = 0, undone = 0 - for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done } } - for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone } } - return {undo: done, redo: undone} - }, - clearHistory: function() {this.history = new History(this.history.maxGeneration)}, - - markClean: function() { - this.cleanGeneration = this.changeGeneration(true) - }, - changeGeneration: function(forceSplit) { - if (forceSplit) - { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null } - return this.history.generation - }, - isClean: function (gen) { - return this.history.generation == (gen || this.cleanGeneration) - }, - - getHistory: function() { - return {done: copyHistoryArray(this.history.done), - undone: copyHistoryArray(this.history.undone)} - }, - setHistory: function(histData) { - var hist = this.history = new History(this.history.maxGeneration) - hist.done = copyHistoryArray(histData.done.slice(0), null, true) - hist.undone = copyHistoryArray(histData.undone.slice(0), null, true) - }, - - setGutterMarker: docMethodOp(function(line, gutterID, value) { - return changeLine(this, line, "gutter", function (line) { - var markers = line.gutterMarkers || (line.gutterMarkers = {}) - markers[gutterID] = value - if (!value && isEmpty(markers)) { line.gutterMarkers = null } - return true - }) - }), + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } - clearGutter: docMethodOp(function(gutterID) { - var this$1 = this; + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } - this.iter(function (line) { - if (line.gutterMarkers && line.gutterMarkers[gutterID]) { - changeLine(this$1, line, "gutter", function () { - line.gutterMarkers[gutterID] = null - if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null } - return true - }) - } - }) - }), - - lineInfo: function(line) { - var n - if (typeof line == "number") { - if (!isLine(this, line)) { return null } - n = line - line = getLine(this, line) - if (!line) { return null } - } else { - n = lineNo(line) - if (n == null) { return null } - } - return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, - textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, - widgets: line.widgets} - }, - - addLineClass: docMethodOp(function(handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop = where == "text" ? "textClass" - : where == "background" ? "bgClass" - : where == "gutter" ? "gutterClass" : "wrapClass" - if (!line[prop]) { line[prop] = cls } - else if (classTest(cls).test(line[prop])) { return false } - else { line[prop] += " " + cls } - return true - }) - }), - removeLineClass: docMethodOp(function(handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop = where == "text" ? "textClass" - : where == "background" ? "bgClass" - : where == "gutter" ? "gutterClass" : "wrapClass" - var cur = line[prop] - if (!cur) { return false } - else if (cls == null) { line[prop] = null } - else { - var found = cur.match(classTest(cls)) - if (!found) { return false } - var end = found.index + found[0].length - line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null - } - return true - }) - }), - - addLineWidget: docMethodOp(function(handle, node, options) { - return addLineWidget(this, handle, node, options) - }), - removeLineWidget: function(widget) { widget.clear() }, - - markText: function(from, to, options) { - return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") - }, - setBookmark: function(pos, options) { - var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), - insertLeft: options && options.insertLeft, - clearWhenEmpty: false, shared: options && options.shared, - handleMouseEvents: options && options.handleMouseEvents} - pos = clipPos(this, pos) - return markText(this, pos, pos, realOpts, "bookmark") - }, - findMarksAt: function(pos) { - pos = clipPos(this, pos) - var markers = [], spans = getLine(this, pos.line).markedSpans - if (spans) { for (var i = 0; i < spans.length; ++i) { - var span = spans[i] - if ((span.from == null || span.from <= pos.ch) && - (span.to == null || span.to >= pos.ch)) - { markers.push(span.marker.parent || span.marker) } - } } - return markers - }, - findMarks: function(from, to, filter) { - from = clipPos(this, from); to = clipPos(this, to) - var found = [], lineNo = from.line - this.iter(from.line, to.line + 1, function (line) { - var spans = line.markedSpans - if (spans) { for (var i = 0; i < spans.length; i++) { - var span = spans[i] - if (!(span.to != null && lineNo == from.line && from.ch >= span.to || - span.from == null && lineNo != from.line || - span.from != null && lineNo == to.line && span.from >= to.ch) && - (!filter || filter(span.marker))) - { found.push(span.marker.parent || span.marker) } - } } - ++lineNo - }) - return found - }, - getAllMarks: function() { - var markers = [] - this.iter(function (line) { - var sps = line.markedSpans - if (sps) { for (var i = 0; i < sps.length; ++i) - { if (sps[i].from != null) { markers.push(sps[i].marker) } } } - }) - return markers - }, - - posFromIndex: function(off) { - var ch, lineNo = this.first, sepSize = this.lineSeparator().length - this.iter(function (line) { - var sz = line.text.length + sepSize - if (sz > off) { ch = off; return true } - off -= sz - ++lineNo - }) - return clipPos(this, Pos(lineNo, ch)) - }, - indexFromPos: function (coords) { - coords = clipPos(this, coords) - var index = coords.ch - if (coords.line < this.first || coords.ch < 0) { return 0 } - var sepSize = this.lineSeparator().length - this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value - index += line.text.length + sepSize - }) - return index - }, - - copy: function(copyHistory) { - var doc = new Doc(getLines(this, this.first, this.first + this.size), - this.modeOption, this.first, this.lineSep) - doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft - doc.sel = this.sel - doc.extend = false - if (copyHistory) { - doc.history.undoDepth = this.history.undoDepth - doc.setHistory(this.getHistory()) - } - return doc - }, - - linkedDoc: function(options) { - if (!options) { options = {} } - var from = this.first, to = this.first + this.size - if (options.from != null && options.from > from) { from = options.from } - if (options.to != null && options.to < to) { to = options.to } - var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep) - if (options.sharedHist) { copy.history = this.history - ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}) - copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}] - copySharedMarkers(copy, findSharedMarkers(this)) - return copy - }, - unlinkDoc: function(other) { - var this$1 = this; + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]}; + } - if (other instanceof CodeMirror) { other = other.doc } - if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { - var link = this$1.linked[i] - if (link.doc != other) { continue } - this$1.linked.splice(i, 1) - other.unlinkDoc(this$1) - detachSharedMarkers(findSharedMarkers(this$1)) - break - } } - // If the histories were shared, split them again - if (other.history == this.history) { - var splitIds = [other.id] - linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true) - other.history = new History(null) - other.history.done = copyHistoryArray(this.history.done, splitIds) - other.history.undone = copyHistoryArray(this.history.undone, splitIds) - } - }, - iterLinkedDocs: function(f) {linkedDocs(this, f)}, - - getMode: function() {return this.mode}, - getEditor: function() {return this.cm}, - - splitLines: function(str) { - if (this.lineSep) { return str.split(this.lineSep) } - return splitLinesAuto(str) - }, - lineSeparator: function() { return this.lineSep || "\n" } -}) - -// Public alias. -Doc.prototype.eachLine = Doc.prototype.iter - -// Kludge to work around strange IE behavior where it'll sometimes -// re-fire a series of drag-related events right after the drop (#1551) -var lastDrop = 0 - -function onDrop(e) { - var cm = this - clearDragCursor(cm) - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) - { return } - e_preventDefault(e) - if (ie) { lastDrop = +new Date } - var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files - if (!pos || cm.isReadOnly()) { return } - // Might be a file drop, in which case we simply extract the text - // and insert it. - if (files && files.length && window.FileReader && window.File) { - var n = files.length, text = Array(n), read = 0 - var loadFile = function (file, i) { - if (cm.options.allowDropFileTypes && - indexOf(cm.options.allowDropFileTypes, file.type) == -1) - { return } - - var reader = new FileReader - reader.onload = operation(cm, function () { - var content = reader.result - if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { content = "" } - text[i] = content - if (++read == n) { - pos = clipPos(cm.doc, pos) - var change = {from: pos, to: pos, - text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())), - origin: "paste"} - makeChange(cm.doc, change) - setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change))) - } - }) - reader.readAsText(file) - } - for (var i = 0; i < n; ++i) { loadFile(files[i], i) } - } else { // Normal drop - // Don't do a replace if the drop happened inside of the selected text. - if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { - cm.state.draggingText(e) - // Ensure the editor is re-focused - setTimeout(function () { return cm.display.input.focus(); }, 20) + if (!start || !end) { + sel.removeAllRanges(); return } - try { - var text$1 = e.dataTransfer.getData("Text") - if (text$1) { - var selected - if (cm.state.draggingText && !cm.state.draggingText.copy) - { selected = cm.listSelections() } - setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)) - if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) - { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag") } } - cm.replaceSelection(text$1, "around", "paste") - cm.display.input.focus() - } - } - catch(e){} - } -} - -function onDragStart(cm, e) { - if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } - - e.dataTransfer.setData("Text", cm.getSelection()) - e.dataTransfer.effectAllowed = "copyMove" - - // Use dummy image instead of default browsers image. - // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. - if (e.dataTransfer.setDragImage && !safari) { - var img = elt("img", null, null, "position: fixed; left: 0; top: 0;") - img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" - if (presto) { - img.width = img.height = 1 - cm.display.wrapper.appendChild(img) - // Force a relayout, or Opera won't use our image for some obscure reason - img._top = img.offsetTop - } - e.dataTransfer.setDragImage(img, 0, 0) - if (presto) { img.parentNode.removeChild(img) } - } -} - -function onDragOver(cm, e) { - var pos = posFromMouse(cm, e) - if (!pos) { return } - var frag = document.createDocumentFragment() - drawSelectionCursor(cm, pos, frag) - if (!cm.display.dragCursor) { - cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors") - cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv) - } - removeChildrenAndAdd(cm.display.dragCursor, frag) -} - -function clearDragCursor(cm) { - if (cm.display.dragCursor) { - cm.display.lineSpace.removeChild(cm.display.dragCursor) - cm.display.dragCursor = null - } -} - -// These must be handled carefully, because naively registering a -// handler for each editor will cause the editors to never be -// garbage collected. - -function forEachCodeMirror(f) { - if (!document.body.getElementsByClassName) { return } - var byClass = document.body.getElementsByClassName("CodeMirror") - for (var i = 0; i < byClass.length; i++) { - var cm = byClass[i].CodeMirror - if (cm) { f(cm) } - } -} - -var globalsRegistered = false -function ensureGlobalHandlers() { - if (globalsRegistered) { return } - registerGlobalHandlers() - globalsRegistered = true -} -function registerGlobalHandlers() { - // When the window resizes, we need to refresh active editors. - var resizeTimer - on(window, "resize", function () { - if (resizeTimer == null) { resizeTimer = setTimeout(function () { - resizeTimer = null - forEachCodeMirror(onResize) - }, 100) } - }) - // When the window loses focus, we want to show the editor as blurred - on(window, "blur", function () { return forEachCodeMirror(onBlur); }) -} -// Called when the window resizes -function onResize(cm) { - var d = cm.display - if (d.lastWrapHeight == d.wrapper.clientHeight && d.lastWrapWidth == d.wrapper.clientWidth) - { return } - // Might be a text scaling operation, clear size caches. - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null - d.scrollbarsClipped = false - cm.setSize() -} - -var keyNames = { - 3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", - 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", - 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", - 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", - 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 127: "Delete", - 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", - 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", - 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" -} - -// Number keys -for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i) } -// Alphabetic keys -for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1) } -// Function keys -for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2 } - -var keyMap = {} - -keyMap.basic = { - "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", - "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", - "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", - "Tab": "defaultTab", "Shift-Tab": "indentAuto", - "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", - "Esc": "singleSelection" -} -// Note that the save and find-related commands aren't defined by -// default. User code or addons can define them. Unknown commands -// are simply ignored. -keyMap.pcDefault = { - "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", - "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", - "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", - "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", - "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", - "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", - "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", - fallthrough: "basic" -} -// Very basic readline/emacs-style bindings, which are standard on Mac. -keyMap.emacsy = { - "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", - "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", - "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", - "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", - "Ctrl-O": "openLine" -} -keyMap.macDefault = { - "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", - "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", - "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", - "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", - "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", - "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", - "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", - fallthrough: ["basic", "emacsy"] -} -keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault - -// KEYMAP DISPATCH - -function normalizeKeyName(name) { - var parts = name.split(/-(?!$)/) - name = parts[parts.length - 1] - var alt, ctrl, shift, cmd - for (var i = 0; i < parts.length - 1; i++) { - var mod = parts[i] - if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true } - else if (/^a(lt)?$/i.test(mod)) { alt = true } - else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true } - else if (/^s(hift)?$/i.test(mod)) { shift = true } - else { throw new Error("Unrecognized modifier name: " + mod) } - } - if (alt) { name = "Alt-" + name } - if (ctrl) { name = "Ctrl-" + name } - if (cmd) { name = "Cmd-" + name } - if (shift) { name = "Shift-" + name } - return name -} - -// This is a kludge to keep keymaps mostly working as raw objects -// (backwards compatibility) while at the same time support features -// like normalization and multi-stroke key bindings. It compiles a -// new normalized keymap, and then updates the old object to reflect -// this. -function normalizeKeyMap(keymap) { - var copy = {} - for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { - var value = keymap[keyname] - if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } - if (value == "...") { delete keymap[keyname]; continue } - - var keys = map(keyname.split(" "), normalizeKeyName) - for (var i = 0; i < keys.length; i++) { - var val = (void 0), name = (void 0) - if (i == keys.length - 1) { - name = keys.join(" ") - val = value + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } } else { - name = keys.slice(0, i + 1).join(" ") - val = "..." - } - var prev = copy[name] - if (!prev) { copy[name] = val } - else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } - } - delete keymap[keyname] - } } - for (var prop in copy) { keymap[prop] = copy[prop] } - return keymap -} - -function lookupKey(key, map, handle, context) { - map = getKeyMap(map) - var found = map.call ? map.call(key, context) : map[key] - if (found === false) { return "nothing" } - if (found === "...") { return "multi" } - if (found != null && handle(found)) { return "handled" } - - if (map.fallthrough) { - if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") - { return lookupKey(key, map.fallthrough, handle, context) } - for (var i = 0; i < map.fallthrough.length; i++) { - var result = lookupKey(key, map.fallthrough[i], handle, context) - if (result) { return result } - } - } -} - -// Modifier key presses don't count as 'real' key presses for the -// purpose of keymap fallthrough. -function isModifierKey(value) { - var name = typeof value == "string" ? value : keyNames[value.keyCode] - return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" -} - -// Look up the name of a key as indicated by an event object. -function keyName(event, noShift) { - if (presto && event.keyCode == 34 && event["char"]) { return false } - var base = keyNames[event.keyCode], name = base - if (name == null || event.altGraphKey) { return false } - if (event.altKey && base != "Alt") { name = "Alt-" + name } - if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name } - if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") { name = "Cmd-" + name } - if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name } - return name -} - -function getKeyMap(val) { - return typeof val == "string" ? keyMap[val] : val -} - -// Helper for deleting text near the selection(s), used to implement -// backspace, delete, and similar functionality. -function deleteNearSelection(cm, compute) { - var ranges = cm.doc.sel.ranges, kill = [] - // Build up a set of ranges to kill first, merging overlapping - // ranges. - for (var i = 0; i < ranges.length; i++) { - var toKill = compute(ranges[i]) - while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { - var replaced = kill.pop() - if (cmp(replaced.from, toKill.from) < 0) { - toKill.from = replaced.from - break + sel.removeAllRanges(); + sel.addRange(rng); } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); + }; + + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); + }; + + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; + }; + + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) + }; + + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || activeElt(rootNode(this.div)) != this.div) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); } - kill.push(toKill) - } - // Next, remove those actual ranges. - runInOp(cm, function () { - for (var i = kill.length - 1; i >= 0; i--) - { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete") } - ensureCursorVisible(cm) - }) -} - -// Commands are parameter-less actions that can be performed on an -// editor, mostly used for keybindings. -var commands = { - selectAll: selectAll, - singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, - killLine: function (cm) { return deleteNearSelection(cm, function (range) { - if (range.empty()) { - var len = getLine(cm.doc, range.head.line).text.length - if (range.head.ch == len && range.head.line < cm.lastLine()) - { return {from: range.head, to: Pos(range.head.line + 1, 0)} } - else - { return {from: range.head, to: Pos(range.head.line, len)} } - } else { - return {from: range.from(), to: range.to()} - } - }); }, - deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ - from: Pos(range.from().line, 0), - to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) - }); }); }, - delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ - from: Pos(range.from().line, 0), to: range.from() - }); }); }, - delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { - var top = cm.charCoords(range.head, "div").top + 5 - var leftPos = cm.coordsChar({left: 0, top: top}, "div") - return {from: leftPos, to: range.from()} - }); }, - delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { - var top = cm.charCoords(range.head, "div").top + 5 - var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") - return {from: range.from(), to: rightPos } - }); }, - undo: function (cm) { return cm.undo(); }, - redo: function (cm) { return cm.redo(); }, - undoSelection: function (cm) { return cm.undoSelection(); }, - redoSelection: function (cm) { return cm.redoSelection(); }, - goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, - goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, - goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, - {origin: "+move", bias: 1} - ); }, - goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, - {origin: "+move", bias: 1} - ); }, - goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, - {origin: "+move", bias: -1} - ); }, - goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.charCoords(range.head, "div").top + 5 - return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") - }, sel_move); }, - goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.charCoords(range.head, "div").top + 5 - return cm.coordsChar({left: 0, top: top}, "div") - }, sel_move); }, - goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { - var top = cm.charCoords(range.head, "div").top + 5 - var pos = cm.coordsChar({left: 0, top: top}, "div") - if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } - return pos - }, sel_move); }, - goLineUp: function (cm) { return cm.moveV(-1, "line"); }, - goLineDown: function (cm) { return cm.moveV(1, "line"); }, - goPageUp: function (cm) { return cm.moveV(-1, "page"); }, - goPageDown: function (cm) { return cm.moveV(1, "page"); }, - goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, - goCharRight: function (cm) { return cm.moveH(1, "char"); }, - goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, - goColumnRight: function (cm) { return cm.moveH(1, "column"); }, - goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, - goGroupRight: function (cm) { return cm.moveH(1, "group"); }, - goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, - goWordRight: function (cm) { return cm.moveH(1, "word"); }, - delCharBefore: function (cm) { return cm.deleteH(-1, "char"); }, - delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, - delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, - delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, - delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, - delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, - indentAuto: function (cm) { return cm.indentSelection("smart"); }, - indentMore: function (cm) { return cm.indentSelection("add"); }, - indentLess: function (cm) { return cm.indentSelection("subtract"); }, - insertTab: function (cm) { return cm.replaceSelection("\t"); }, - insertSoftTab: function (cm) { - var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize - for (var i = 0; i < ranges.length; i++) { - var pos = ranges[i].from() - var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize) - spaces.push(spaceStr(tabSize - col % tabSize)) - } - cm.replaceSelections(spaces) - }, - defaultTab: function (cm) { - if (cm.somethingSelected()) { cm.indentSelection("add") } - else { cm.execCommand("insertTab") } - }, - // Swap the two chars left and right of each selection's head. - // Move cursor behind the two swapped characters afterwards. - // - // Doesn't consider line feeds a character. - // Doesn't scan more than one line above to find a character. - // Doesn't do anything on an empty line. - // Doesn't do anything with non-empty selections. - transposeChars: function (cm) { return runInOp(cm, function () { - var ranges = cm.listSelections(), newSel = [] - for (var i = 0; i < ranges.length; i++) { - if (!ranges[i].empty()) { continue } - var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text - if (line) { - if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1) } - if (cur.ch > 0) { - cur = new Pos(cur.line, cur.ch + 1) - cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), - Pos(cur.line, cur.ch - 2), cur, "+transpose") - } else if (cur.line > cm.doc.first) { - var prev = getLine(cm.doc, cur.line - 1).text - if (prev) { - cur = new Pos(cur.line, 1) - cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + - prev.charAt(prev.length - 1), - Pos(cur.line - 1, prev.length - 1), cur, "+transpose") - } - } - } - newSel.push(new Range(cur, cur)) - } - cm.setSelections(newSel) - }); }, - newlineAndIndent: function (cm) { return runInOp(cm, function () { - var sels = cm.listSelections() - for (var i = sels.length - 1; i >= 0; i--) - { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input") } - sels = cm.listSelections() - for (var i$1 = 0; i$1 < sels.length; i$1++) - { cm.indentLine(sels[i$1].from().line, null, true) } - ensureCursorVisible(cm) - }); }, - openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, - toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } -} - - -function lineStart(cm, lineN) { - var line = getLine(cm.doc, lineN) - var visual = visualLine(line) - if (visual != line) { lineN = lineNo(visual) } - var order = getOrder(visual) - var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual) - return Pos(lineN, ch) -} -function lineEnd(cm, lineN) { - var merged, line = getLine(cm.doc, lineN) - while (merged = collapsedSpanAtEnd(line)) { - line = merged.find(1, true).line - lineN = null - } - var order = getOrder(line) - var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line) - return Pos(lineN == null ? lineNo(line) : lineN, ch) -} -function lineStartSmart(cm, pos) { - var start = lineStart(cm, pos.line) - var line = getLine(cm.doc, start.line) - var order = getOrder(line) - if (!order || order[0].level == 0) { - var firstNonWS = Math.max(0, line.text.search(/\S/)) - var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch - return Pos(start.line, inWS ? 0 : firstNonWS) - } - return start -} - -// Run a handler that was bound to a key. -function doHandleBinding(cm, bound, dropShift) { - if (typeof bound == "string") { - bound = commands[bound] - if (!bound) { return false } - } - // Ensure previous input has been read, so that the handler sees a - // consistent view of the document - cm.display.input.ensurePolled() - var prevShift = cm.display.shift, done = false - try { - if (cm.isReadOnly()) { cm.state.suppressEdits = true } - if (dropShift) { cm.display.shift = false } - done = bound(cm) != Pass - } finally { - cm.display.shift = prevShift - cm.state.suppressEdits = false - } - return done -} - -function lookupKeyForEditor(cm, name, handle) { - for (var i = 0; i < cm.state.keyMaps.length; i++) { - var result = lookupKey(name, cm.state.keyMaps[i], handle, cm) - if (result) { return result } - } - return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) - || lookupKey(name, cm.options.keyMap, handle, cm) -} - -var stopSeq = new Delayed -function dispatchKey(cm, name, e, handle) { - var seq = cm.state.keySeq - if (seq) { - if (isModifierKey(name)) { return "handled" } - stopSeq.set(50, function () { - if (cm.state.keySeq == seq) { - cm.state.keySeq = null - cm.display.input.reset() - } - }) - name = seq + " " + name - } - var result = lookupKeyForEditor(cm, name, handle) + }; + ContentEditableInput.prototype.blur = function () { this.div.blur(); }; + ContentEditableInput.prototype.getField = function () { return this.div }; - if (result == "multi") - { cm.state.keySeq = name } - if (result == "handled") - { signalLater(cm, "keyHandled", cm, name, e) } + ContentEditableInput.prototype.supportsTouch = function () { return true }; - if (result == "handled" || result == "multi") { - e_preventDefault(e) - restartBlink(cm) - } + ContentEditableInput.prototype.receivedFocus = function () { + var this$1 = this; - if (seq && !result && /\'$/.test(name)) { - e_preventDefault(e) - return true - } - return !!result -} - -// Handle a key from the keydown event. -function handleKeyBinding(cm, e) { - var name = keyName(e, true) - if (!name) { return false } - - if (e.shiftKey && !cm.state.keySeq) { - // First try to resolve full name (including 'Shift-'). Failing - // that, see if there is a cursor-motion command (starting with - // 'go') bound to the keyname without 'Shift-'. - return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) - || dispatchKey(cm, name, e, function (b) { - if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) - { return doHandleBinding(cm, b) } - }) - } else { - return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) - } -} - -// Handle a key from the keypress event -function handleCharBinding(cm, e, ch) { - return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) -} - -var lastStoppedKey = null -function onKeyDown(e) { - var cm = this - cm.curOp.focus = activeElt() - if (signalDOMEvent(cm, e)) { return } - // IE does strange things with escape. - if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false } - var code = e.keyCode - cm.display.shift = code == 16 || e.shiftKey - var handled = handleKeyBinding(cm, e) - if (presto) { - lastStoppedKey = handled ? code : null - // Opera has no cut event... we try to at least catch the key combo - if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) - { cm.replaceSelection("", null, "cut") } - } - - // Turn mouse into crosshair when Alt is held on Mac. - if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) - { showCrossHair(cm) } -} - -function showCrossHair(cm) { - var lineDiv = cm.display.lineDiv - addClass(lineDiv, "CodeMirror-crosshair") - - function up(e) { - if (e.keyCode == 18 || !e.altKey) { - rmClass(lineDiv, "CodeMirror-crosshair") - off(document, "keyup", up) - off(document, "mouseover", up) - } - } - on(document, "keyup", up) - on(document, "mouseover", up) -} - -function onKeyUp(e) { - if (e.keyCode == 16) { this.doc.sel.shift = false } - signalDOMEvent(this, e) -} - -function onKeyPress(e) { - var cm = this - if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } - var keyCode = e.keyCode, charCode = e.charCode - if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} - if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } - var ch = String.fromCharCode(charCode == null ? keyCode : charCode) - // Some browsers fire keypress events for backspace - if (ch == "\x08") { return } - if (handleCharBinding(cm, e, ch)) { return } - cm.display.input.onKeyPress(e) -} - -// A mouse down can be a single click, double click, triple click, -// start of selection drag, start of text drag, new cursor -// (ctrl-click), rectangle drag (alt-drag), or xwin -// middle-click-paste. Or it might be a click on something we should -// not interfere with, such as a scrollbar or widget. -function onMouseDown(e) { - var cm = this, display = cm.display - if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } - display.input.ensurePolled() - display.shift = e.shiftKey - - if (eventInWidget(display, e)) { - if (!webkit) { - // Briefly turn off draggability, to allow widgets to do - // normal dragging things. - display.scroller.draggable = false - setTimeout(function () { return display.scroller.draggable = true; }, 100) - } - return - } - if (clickInGutter(cm, e)) { return } - var start = posFromMouse(cm, e) - window.focus() - - switch (e_button(e)) { - case 1: - // #3261: make sure, that we're not starting a second selection - if (cm.state.selectingText) - { cm.state.selectingText(e) } - else if (start) - { leftButtonDown(cm, e, start) } - else if (e_target(e) == display.scroller) - { e_preventDefault(e) } - break - case 2: - if (webkit) { cm.state.lastMiddleDown = +new Date } - if (start) { extendSelection(cm.doc, start) } - setTimeout(function () { return display.input.focus(); }, 20) - e_preventDefault(e) - break - case 3: - if (captureRightClick) { onContextMenu(cm, e) } - else { delayBlurEvent(cm) } - break - } -} - -var lastClick; -var lastDoubleClick; -function leftButtonDown(cm, e, start) { - if (ie) { setTimeout(bind(ensureFocus, cm), 0) } - else { cm.curOp.focus = activeElt() } - - var now = +new Date, type - if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) { - type = "triple" - } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) { - type = "double" - lastDoubleClick = {time: now, pos: start} - } else { - type = "single" - lastClick = {time: now, pos: start} - } - - var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey, contained - if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && - type == "single" && (contained = sel.contains(start)) > -1 && - (cmp((contained = sel.ranges[contained]).from(), start) < 0 || start.xRel > 0) && - (cmp(contained.to(), start) > 0 || start.xRel < 0)) - { leftButtonStartDrag(cm, e, start, modifier) } - else - { leftButtonSelect(cm, e, start, type, modifier) } -} - -// Start a text drag. When it ends, see if any dragging actually -// happen, and treat as a click if it didn't. -function leftButtonStartDrag(cm, e, start, modifier) { - var display = cm.display, startTime = +new Date - var dragEnd = operation(cm, function (e2) { - if (webkit) { display.scroller.draggable = false } - cm.state.draggingText = false - off(document, "mouseup", dragEnd) - off(display.scroller, "drop", dragEnd) - if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) { - e_preventDefault(e2) - if (!modifier && +new Date - 200 < startTime) - { extendSelection(cm.doc, start) } - // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) - if (webkit || ie && ie_version == 9) - { setTimeout(function () {document.body.focus(); display.input.focus()}, 20) } - else - { display.input.focus() } - } - }) - // Let the drag handler handle this. - if (webkit) { display.scroller.draggable = true } - cm.state.draggingText = dragEnd - dragEnd.copy = mac ? e.altKey : e.ctrlKey - // IE's approach to draggable - if (display.scroller.dragDrop) { display.scroller.dragDrop() } - on(document, "mouseup", dragEnd) - on(display.scroller, "drop", dragEnd) -} - -// Normal selection, as opposed to text dragging. -function leftButtonSelect(cm, e, start, type, addNew) { - var display = cm.display, doc = cm.doc - e_preventDefault(e) - - var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges - if (addNew && !e.shiftKey) { - ourIndex = doc.sel.contains(start) - if (ourIndex > -1) - { ourRange = ranges[ourIndex] } - else - { ourRange = new Range(start, start) } - } else { - ourRange = doc.sel.primary() - ourIndex = doc.sel.primIndex - } - - if (chromeOS ? e.shiftKey && e.metaKey : e.altKey) { - type = "rect" - if (!addNew) { ourRange = new Range(start, start) } - start = posFromMouse(cm, e, true, true) - ourIndex = -1 - } else if (type == "double") { - var word = cm.findWordAt(start) - if (cm.display.shift || doc.extend) - { ourRange = extendRange(doc, ourRange, word.anchor, word.head) } + var input = this; + if (this.selectionInEditor()) + { setTimeout(function () { return this$1.pollSelection(); }, 20); } else - { ourRange = word } - } else if (type == "triple") { - var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0))) - if (cm.display.shift || doc.extend) - { ourRange = extendRange(doc, ourRange, line.anchor, line.head) } - else - { ourRange = line } - } else { - ourRange = extendRange(doc, ourRange, start) - } - - if (!addNew) { - ourIndex = 0 - setSelection(doc, new Selection([ourRange], 0), sel_mouse) - startSel = doc.sel - } else if (ourIndex == -1) { - ourIndex = ranges.length - setSelection(doc, normalizeSelection(ranges.concat([ourRange]), ourIndex), - {scroll: false, origin: "*mouse"}) - } else if (ranges.length > 1 && ranges[ourIndex].empty() && type == "single" && !e.shiftKey) { - setSelection(doc, normalizeSelection(ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), - {scroll: false, origin: "*mouse"}) - startSel = doc.sel - } else { - replaceOneSelection(doc, ourIndex, ourRange, sel_mouse) - } - - var lastPos = start - function extendTo(pos) { - if (cmp(lastPos, pos) == 0) { return } - lastPos = pos - - if (type == "rect") { - var ranges = [], tabSize = cm.options.tabSize - var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize) - var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize) - var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol) - for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); - line <= end; line++) { - var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize) - if (left == right) - { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))) } - else if (text.length > leftPos) - { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))) } - } - if (!ranges.length) { ranges.push(new Range(start, start)) } - setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), - {origin: "*mouse", scroll: false}) - cm.scrollIntoView(pos) - } else { - var oldRange = ourRange - var anchor = oldRange.anchor, head = pos - if (type != "single") { - var range - if (type == "double") - { range = cm.findWordAt(pos) } - else - { range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0))) } - if (cmp(range.anchor, anchor) > 0) { - head = range.head - anchor = minPos(oldRange.from(), range.anchor) - } else { - head = range.anchor - anchor = maxPos(oldRange.to(), range.head) - } + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); } - var ranges$1 = startSel.ranges.slice(0) - ranges$1[ourIndex] = new Range(clipPos(doc, anchor), head) - setSelection(doc, normalizeSelection(ranges$1, ourIndex), sel_mouse) - } - } - - var editorSize = display.wrapper.getBoundingClientRect() - // Used to ensure timeout re-tries don't fire when another extend - // happened in the meantime (clearTimeout isn't reliable -- at - // least on Chrome, the timeouts still happen even when cleared, - // if the clear happens after their scheduled firing time). - var counter = 0 - - function extend(e) { - var curCount = ++counter - var cur = posFromMouse(cm, e, true, type == "rect") - if (!cur) { return } - if (cmp(cur, lastPos) != 0) { - cm.curOp.focus = activeElt() - extendTo(cur) - var visible = visibleLines(display, doc) - if (cur.line >= visible.to || cur.line < visible.from) - { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e) }}), 150) } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset + }; + + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = this.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } + }; + + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; } else { - var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0 - if (outside) { setTimeout(operation(cm, function () { - if (counter != curCount) { return } - display.scroller.scrollTop += outside - extend(e) - }), 50) } - } - } - - function done(e) { - cm.state.selectingText = false - counter = Infinity - e_preventDefault(e) - display.input.focus() - off(document, "mousemove", move) - off(document, "mouseup", up) - doc.history.lastSelOrigin = null - } - - var move = operation(cm, function (e) { - if (!e_button(e)) { done(e) } - else { extend(e) } - }) - var up = operation(cm, done) - cm.state.selectingText = up - on(document, "mousemove", move) - on(document, "mouseup", up) -} - - -// Determines whether an event happened in the gutter, and fires the -// handlers for the corresponding event. -function gutterEvent(cm, e, type, prevent) { - var mX, mY - try { mX = e.clientX; mY = e.clientY } - catch(e) { return false } - if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } - if (prevent) { e_preventDefault(e) } - - var display = cm.display - var lineBox = display.lineDiv.getBoundingClientRect() - - if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } - mY -= lineBox.top - display.viewOffset - - for (var i = 0; i < cm.options.gutters.length; ++i) { - var g = display.gutters.childNodes[i] - if (g && g.getBoundingClientRect().right >= mX) { - var line = lineAtHeight(cm.doc, mY) - var gutter = cm.options.gutters[i] - signal(cm, type, cm, line, gutter, e) - return e_defaultPrevented(e) - } - } -} - -function clickInGutter(cm, e) { - return gutterEvent(cm, e, "gutterClick", true) -} - -// CONTEXT MENU HANDLING - -// To make the context menu work, we need to briefly unhide the -// textarea (making it as unobtrusive as possible) to let the -// right-click take effect on it. -function onContextMenu(cm, e) { - if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } - if (signalDOMEvent(cm, e, "contextmenu")) { return } - cm.display.input.onContextMenu(e) -} - -function contextMenuInGutter(cm, e) { - if (!hasHandler(cm, "gutterContextMenu")) { return false } - return gutterEvent(cm, e, "gutterContextMenu", false) -} - -function themeChanged(cm) { - cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + - cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-") - clearCaches(cm) -} - -var Init = {toString: function(){return "CodeMirror.Init"}} - -var defaults = {} -var optionHandlers = {} - -function defineOptions(CodeMirror) { - var optionHandlers = CodeMirror.optionHandlers - - function option(name, deflt, handle, notOnInit) { - CodeMirror.defaults[name] = deflt - if (handle) { optionHandlers[name] = - notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old) }} : handle } - } - - CodeMirror.defineOption = option - - // Passed to option handlers when there is no old value. - CodeMirror.Init = Init - - // These two are, on init, called from the constructor because they - // have to be initialized before the editor can start at all. - option("value", "", function (cm, val) { return cm.setValue(val); }, true) - option("mode", null, function (cm, val) { - cm.doc.modeOption = val - loadMode(cm) - }, true) - - option("indentUnit", 2, loadMode, true) - option("indentWithTabs", false) - option("smartIndent", true) - option("tabSize", 4, function (cm) { - resetModeState(cm) - clearCaches(cm) - regChange(cm) - }, true) - option("lineSeparator", null, function (cm, val) { - cm.doc.lineSep = val - if (!val) { return } - var newBreaks = [], lineNo = cm.doc.first - cm.doc.iter(function (line) { - for (var pos = 0;;) { - var found = line.text.indexOf(val, pos) - if (found == -1) { break } - pos = found + val.length - newBreaks.push(Pos(lineNo, found)) - } - lineNo++ - }) - for (var i = newBreaks.length - 1; i >= 0; i--) - { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)) } - }) - option("specialChars", /[\u0000-\u001f\u007f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff]/g, function (cm, val, old) { - cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g") - if (old != Init) { cm.refresh() } - }) - option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true) - option("electricChars", true) - option("inputStyle", mobile ? "contenteditable" : "textarea", function () { - throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME - }, true) - option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true) - option("rtlMoveVisually", !windows) - option("wholeLineUpdateBefore", true) - - option("theme", "default", function (cm) { - themeChanged(cm) - guttersChanged(cm) - }, true) - option("keyMap", "default", function (cm, val, old) { - var next = getKeyMap(val) - var prev = old != Init && getKeyMap(old) - if (prev && prev.detach) { prev.detach(cm, next) } - if (next.attach) { next.attach(cm, prev || null) } - }) - option("extraKeys", null) - - option("lineWrapping", false, wrappingChanged, true) - option("gutters", [], function (cm) { - setGuttersForLineNumbers(cm.options) - guttersChanged(cm) - }, true) - option("fixedGutter", true, function (cm, val) { - cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0" - cm.refresh() - }, true) - option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true) - option("scrollbarStyle", "native", function (cm) { - initScrollbars(cm) - updateScrollbars(cm) - cm.display.scrollbars.setScrollTop(cm.doc.scrollTop) - cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft) - }, true) - option("lineNumbers", false, function (cm) { - setGuttersForLineNumbers(cm.options) - guttersChanged(cm) - }, true) - option("firstLineNumber", 1, guttersChanged, true) - option("lineNumberFormatter", function (integer) { return integer; }, guttersChanged, true) - option("showCursorWhenSelecting", false, updateSelection, true) - - option("resetSelectionOnContextMenu", true) - option("lineWiseCopyCut", true) - - option("readOnly", false, function (cm, val) { - if (val == "nocursor") { - onBlur(cm) - cm.display.input.blur() - cm.display.disabled = true + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; } else { - cm.display.disabled = false - } - cm.display.input.readOnlyChanged(val) - }) - option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset() }}, true) - option("dragDrop", true, dragDropChanged) - option("allowDropFileTypes", null) - - option("cursorBlinkRate", 530) - option("cursorScrollMargin", 0) - option("cursorHeight", 1, updateSelection, true) - option("singleCursorHeightPerLine", true, updateSelection, true) - option("workTime", 100) - option("workDelay", 100) - option("flattenSpans", true, resetModeState, true) - option("addModeClass", false, resetModeState, true) - option("pollInterval", 100) - option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }) - option("historyEventDelay", 1250) - option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true) - option("maxHighlightLength", 10000, resetModeState, true) - option("moveInputWithCursor", true, function (cm, val) { - if (!val) { cm.display.input.resetPosition() } - }) - - option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }) - option("autofocus", null) -} - -function guttersChanged(cm) { - updateGutters(cm) - regChange(cm) - alignHorizontally(cm) -} - -function dragDropChanged(cm, value, old) { - var wasOn = old && old != Init - if (!value != !wasOn) { - var funcs = cm.display.dragFunctions - var toggle = value ? on : off - toggle(cm.display.scroller, "dragstart", funcs.start) - toggle(cm.display.scroller, "dragenter", funcs.enter) - toggle(cm.display.scroller, "dragover", funcs.over) - toggle(cm.display.scroller, "dragleave", funcs.leave) - toggle(cm.display.scroller, "drop", funcs.drop) - } -} - -function wrappingChanged(cm) { - if (cm.options.lineWrapping) { - addClass(cm.display.wrapper, "CodeMirror-wrap") - cm.display.sizer.style.minWidth = "" - cm.display.sizerWidth = null - } else { - rmClass(cm.display.wrapper, "CodeMirror-wrap") - findMaxLine(cm) - } - estimateLineHeights(cm) - regChange(cm) - clearCaches(cm) - setTimeout(function () { return updateScrollbars(cm); }, 100) -} - -// A CodeMirror instance represents an editor. This is the object -// that user code is usually dealing with. - -function CodeMirror(place, options) { - var this$1 = this; - - if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } - - this.options = options = options ? copyObj(options) : {} - // Determine effective options based on given values and defaults. - copyObj(defaults, options, false) - setGuttersForLineNumbers(options) - - var doc = options.value - if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator) } - this.doc = doc - - var input = new CodeMirror.inputStyles[options.inputStyle](this) - var display = this.display = new Display(place, doc, input) - display.wrapper.CodeMirror = this - updateGutters(this) - themeChanged(this) - if (options.lineWrapping) - { this.display.wrapper.className += " CodeMirror-wrap" } - initScrollbars(this) - - this.state = { - keyMaps: [], // stores maps added by addKeyMap - overlays: [], // highlighting overlays, as added by addOverlay - modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info - overwrite: false, - delayingBlurEvent: false, - focused: false, - suppressEdits: false, // used to disable editing during key handlers when in readOnly mode - pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in input.poll - selectingText: false, - draggingText: false, - highlight: new Delayed(), // stores highlight worker timeout - keySeq: null, // Unfinished key sequence - specialChars: null - } - - if (options.autofocus && !mobile) { display.input.focus() } - - // Override magic textarea content restore that IE sometimes does - // on our hidden textarea on reload - if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20) } - - registerEventHandlers(this) - ensureGlobalHandlers() - - startOperation(this) - this.curOp.forceUpdate = true - attachDoc(this, doc) - - if ((options.autofocus && !mobile) || this.hasFocus()) - { setTimeout(bind(onFocus, this), 20) } - else - { onBlur(this) } - - for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) - { optionHandlers[opt](this$1, options[opt], Init) } } - maybeUpdateLineNumberWidth(this) - if (options.finishInit) { options.finishInit(this) } - for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1) } - endOperation(this) - // Suppress optimizelegibility in Webkit, since it breaks text - // measuring on line wrapping boundaries. - if (webkit && options.lineWrapping && - getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") - { display.lineDiv.style.textRendering = "auto" } -} - -// The default configuration options. -CodeMirror.defaults = defaults -// Functions to run when options are changed. -CodeMirror.optionHandlers = optionHandlers - -// Attach the necessary event handlers when initializing the editor -function registerEventHandlers(cm) { - var d = cm.display - on(d.scroller, "mousedown", operation(cm, onMouseDown)) - // Older IE's will not fire a second mousedown for a double click - if (ie && ie_version < 11) - { on(d.scroller, "dblclick", operation(cm, function (e) { - if (signalDOMEvent(cm, e)) { return } - var pos = posFromMouse(cm, e) - if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } - e_preventDefault(e) - var word = cm.findWordAt(pos) - extendSelection(cm.doc, word.anchor, word.head) - })) } - else - { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }) } - // Some browsers fire contextmenu *after* opening the menu, at - // which point we can't mess with it anymore. Context menu is - // handled in onMouseDown for these browsers. - if (!captureRightClick) { on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }) } - - // Used to suppress mouse event handling when a touch happens - var touchFinished, prevTouch = {end: 0} - function finishTouch() { - if (d.activeTouch) { - touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000) - prevTouch = d.activeTouch - prevTouch.end = +new Date - } - } - function isMouseLikeTouchEvent(e) { - if (e.touches.length != 1) { return false } - var touch = e.touches[0] - return touch.radiusX <= 1 && touch.radiusY <= 1 - } - function farAway(touch, other) { - if (other.left == null) { return true } - var dx = other.left - touch.left, dy = other.top - touch.top - return dx * dx + dy * dy > 20 * 20 - } - on(d.scroller, "touchstart", function (e) { - if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e)) { - d.input.ensurePolled() - clearTimeout(touchFinished) - var now = +new Date - d.activeTouch = {start: now, moved: false, - prev: now - prevTouch.end <= 300 ? prevTouch : null} - if (e.touches.length == 1) { - d.activeTouch.left = e.touches[0].pageX - d.activeTouch.top = e.touches[0].pageY - } - } - }) - on(d.scroller, "touchmove", function () { - if (d.activeTouch) { d.activeTouch.moved = true } - }) - on(d.scroller, "touchend", function (e) { - var touch = d.activeTouch - if (touch && !eventInWidget(d, e) && touch.left != null && - !touch.moved && new Date - touch.start < 300) { - var pos = cm.coordsChar(d.activeTouch, "page"), range - if (!touch.prev || farAway(touch, touch.prev)) // Single tap - { range = new Range(pos, pos) } - else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap - { range = cm.findWordAt(pos) } - else // Triple tap - { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } - cm.setSelection(range.anchor, range.head) - cm.focus() - e_preventDefault(e) - } - finishTouch() - }) - on(d.scroller, "touchcancel", finishTouch) - - // Sync scrolling between fake scrollbars and real scrollable - // area, ensure viewport is updated when scrolling. - on(d.scroller, "scroll", function () { - if (d.scroller.clientHeight) { - setScrollTop(cm, d.scroller.scrollTop) - setScrollLeft(cm, d.scroller.scrollLeft, true) - signal(cm, "scroll", cm) - } - }) - - // Listen to wheel events in order to try and update the viewport on time. - on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }) - on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }) - - // Prevent wrapper from ever scrolling - on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }) - - d.dragFunctions = { - enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e) }}, - over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e) }}, - start: function (e) { return onDragStart(cm, e); }, - drop: operation(cm, onDrop), - leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm) }} - } - - var inp = d.input.getField() - on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }) - on(inp, "keydown", operation(cm, onKeyDown)) - on(inp, "keypress", operation(cm, onKeyPress)) - on(inp, "focus", function (e) { return onFocus(cm, e); }) - on(inp, "blur", function (e) { return onBlur(cm, e); }) -} - -var initHooks = [] -CodeMirror.defineInitHook = function (f) { return initHooks.push(f); } - -// Indent the given line. The how parameter can be "smart", -// "add"/null, "subtract", or "prev". When aggressive is false -// (typically set to true for forced single-line indents), empty -// lines are not indented, and places where the mode returns Pass -// are left alone. -function indentLine(cm, n, how, aggressive) { - var doc = cm.doc, state - if (how == null) { how = "add" } - if (how == "smart") { - // Fall back to "prev" when the mode doesn't have an indentation - // method. - if (!doc.mode.indent) { how = "prev" } - else { state = getStateBefore(cm, n) } - } - - var tabSize = cm.options.tabSize - var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize) - if (line.stateAfter) { line.stateAfter = null } - var curSpaceString = line.text.match(/^\s*/)[0], indentation - if (!aggressive && !/\S/.test(line.text)) { - indentation = 0 - how = "not" - } else if (how == "smart") { - indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text) - if (indentation == Pass || indentation > 150) { - if (!aggressive) { return } - how = "prev" - } - } - if (how == "prev") { - if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize) } - else { indentation = 0 } - } else if (how == "add") { - indentation = curSpace + cm.options.indentUnit - } else if (how == "subtract") { - indentation = curSpace - cm.options.indentUnit - } else if (typeof how == "number") { - indentation = curSpace + how - } - indentation = Math.max(0, indentation) - - var indentString = "", pos = 0 - if (cm.options.indentWithTabs) - { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t"} } - if (pos < indentation) { indentString += spaceStr(indentation - pos) } - - if (indentString != curSpaceString) { - replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input") - line.stateAfter = null - return true - } else { - // Ensure that, if the cursor was in the whitespace at the start - // of the line, it is moved to the end of that space. - for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { - var range = doc.sel.ranges[i$1] - if (range.head.line == n && range.head.ch < curSpaceString.length) { - var pos$1 = Pos(n, curSpaceString.length) - replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)) - break + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; } } - } -} - -// This will be set to a {lineWise: bool, text: [string]} object, so -// that, when pasting, we know what kind of selections the copied -// text was made out of. -var lastCopied = null - -function setLastCopied(newLastCopied) { - lastCopied = newLastCopied -} - -function applyTextInput(cm, inserted, deleted, sel, origin) { - var doc = cm.doc - cm.display.shift = false - if (!sel) { sel = doc.sel } - - var paste = cm.state.pasteIncoming || origin == "paste" - var textLines = splitLinesAuto(inserted), multiPaste = null - // When pasing N lines into N selections, insert one line per selection - if (paste && sel.ranges.length > 1) { - if (lastCopied && lastCopied.text.join("\n") == inserted) { - if (sel.ranges.length % lastCopied.text.length == 0) { - multiPaste = [] - for (var i = 0; i < lastCopied.text.length; i++) - { multiPaste.push(doc.splitLines(lastCopied.text[i])) } - } - } else if (textLines.length == sel.ranges.length) { - multiPaste = map(textLines, function (l) { return [l]; }) - } - } - - var updateInput - // Normal behavior is to insert the new text into every selection - for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { - var range = sel.ranges[i$1] - var from = range.from(), to = range.to() - if (range.empty()) { - if (deleted && deleted > 0) // Handle deletion - { from = Pos(from.line, from.ch - deleted) } - else if (cm.state.overwrite && !paste) // Handle overwrite - { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)) } - else if (lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted) - { from = to = Pos(from.line, 0) } - } - updateInput = cm.curOp.updateInput - var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, - origin: origin || (paste ? "paste" : cm.state.cutIncoming ? "cut" : "+input")} - makeChange(cm.doc, changeEvent) - signalLater(cm, "inputRead", cm, changeEvent) - } - if (inserted && !paste) - { triggerElectric(cm, inserted) } - - ensureCursorVisible(cm) - cm.curOp.updateInput = updateInput - cm.curOp.typing = true - cm.state.pasteIncoming = cm.state.cutIncoming = false -} - -function handlePaste(e, cm) { - var pasted = e.clipboardData && e.clipboardData.getData("Text") - if (pasted) { - e.preventDefault() - if (!cm.isReadOnly() && !cm.options.disableInput) - { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }) } - return true - } -} - -function triggerElectric(cm, inserted) { - // When an 'electric' character is inserted, immediately trigger a reindent - if (!cm.options.electricChars || !cm.options.smartIndent) { return } - var sel = cm.doc.sel - - for (var i = sel.ranges.length - 1; i >= 0; i--) { - var range = sel.ranges[i] - if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue } - var mode = cm.getModeAt(range.head) - var indented = false - if (mode.electricChars) { - for (var j = 0; j < mode.electricChars.length; j++) - { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { - indented = indentLine(cm, range.head.line, "smart") - break - } } - } else if (mode.electricInput) { - if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) - { indented = indentLine(cm, range.head.line, "smart") } - } - if (indented) { signalLater(cm, "electricInput", cm, range.head.line) } - } -} - -function copyableRanges(cm) { - var text = [], ranges = [] - for (var i = 0; i < cm.doc.sel.ranges.length; i++) { - var line = cm.doc.sel.ranges[i].head.line - var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)} - ranges.push(lineRange) - text.push(cm.getRange(lineRange.anchor, lineRange.head)) - } - return {text: text, ranges: ranges} -} - -function disableBrowserMagic(field, spellcheck) { - field.setAttribute("autocorrect", "off") - field.setAttribute("autocapitalize", "off") - field.setAttribute("spellcheck", !!spellcheck) -} - -function hiddenTextarea() { - var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none") - var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;") - // The textarea is kept positioned near the cursor to prevent the - // fact that it'll be scrolled into view on input from scrolling - // our fake cursor out of view. On webkit, when wrap=off, paste is - // very slow. So make the area wide instead. - if (webkit) { te.style.width = "1000px" } - else { te.setAttribute("wrap", "off") } - // If border: 0; -- iOS fails to open keyboard (issue #1287) - if (ios) { te.style.border = "1px solid black" } - disableBrowserMagic(te) - return div -} - -// The publicly visible API. Note that methodOp(f) means -// 'wrap f in an operation, performed on its `this` parameter'. - -// This is not the complete set of editor methods. Most of the -// methods defined on the Doc type are also injected into -// CodeMirror.prototype, for backwards compatibility and -// convenience. - -function addEditorMethods(CodeMirror) { - var optionHandlers = CodeMirror.optionHandlers - - var helpers = CodeMirror.helpers = {} - - CodeMirror.prototype = { - constructor: CodeMirror, - focus: function(){window.focus(); this.display.input.focus()}, - - setOption: function(option, value) { - var options = this.options, old = options[option] - if (options[option] == value && option != "mode") { return } - options[option] = value - if (optionHandlers.hasOwnProperty(option)) - { operation(this, optionHandlers[option])(this, value, old) } - signal(this, "optionChange", this, option) - }, - getOption: function(option) {return this.options[option]}, - getDoc: function() {return this.doc}, + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); - addKeyMap: function(map, bottom) { - this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)) - }, - removeKeyMap: function(map) { - var maps = this.state.keyMaps - for (var i = 0; i < maps.length; ++i) - { if (maps[i] == map || maps[i].name == map) { - maps.splice(i, 1) - return true - } } - }, + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } + }; - addOverlay: methodOp(function(spec, options) { - var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec) - if (mode.startState) { throw new Error("Overlays may not be stateful.") } - insertSorted(this.state.overlays, - {mode: mode, modeSpec: spec, opaque: options && options.opaque, - priority: (options && options.priority) || 0}, - function (overlay) { return overlay.priority; }) - this.state.modeGen++ - regChange(this) - }), - removeOverlay: methodOp(function(spec) { + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { var this$1 = this; - var overlays = this.state.overlays - for (var i = 0; i < overlays.length; ++i) { - var cur = overlays[i].modeSpec - if (cur == spec || typeof spec == "string" && cur.name == spec) { - overlays.splice(i, 1) - this$1.state.modeGen++ - regChange(this$1) - return - } + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } } - }), + this$1.updateFromDOM(); + }, 80); + }; - indentLine: methodOp(function(n, dir, aggressive) { - if (typeof dir != "string" && typeof dir != "number") { - if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev" } - else { dir = dir ? "add" : "subtract" } - } - if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive) } - }), - indentSelection: methodOp(function(how) { + ContentEditableInput.prototype.updateFromDOM = function () { var this$1 = this; - var ranges = this.doc.sel.ranges, end = -1 - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i] - if (!range.empty()) { - var from = range.from(), to = range.to() - var start = Math.max(end, from.line) - end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1 - for (var j = start; j < end; ++j) - { indentLine(this$1, j, how) } - var newRanges = this$1.doc.sel.ranges - if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) - { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll) } - } else if (range.head.line > end) { - indentLine(this$1, range.head.line, how, true) - end = range.head.line - if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1) } - } - } - }), - - // Fetch the parser token for a given character. Useful for hacks - // that want to inspect the mode state (say, for completion). - getTokenAt: function(pos, precise) { - return takeToken(this, pos, precise) - }, + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } + }; - getLineTokens: function(line, precise) { - return takeToken(this, Pos(line), precise, true) - }, + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; - getTokenTypeAt: function(pos) { - pos = clipPos(this.doc, pos) - var styles = getLineStyles(this, getLine(this.doc, pos.line)) - var before = 0, after = (styles.length - 1) / 2, ch = pos.ch - var type - if (ch == 0) { type = styles[2] } - else { for (;;) { - var mid = (before + after) >> 1 - if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid } - else if (styles[mid * 2 + 1] < ch) { before = mid + 1 } - else { type = styles[mid * 2 + 2]; break } - } } - var cut = type ? type.indexOf("overlay ") : -1 - return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) - }, + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } + }; - getModeAt: function(pos) { - var mode = this.doc.mode - if (!mode.innerMode) { return mode } - return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode - }, + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; - getHelper: function(pos, type) { - return this.getHelpers(pos, type)[0] - }, + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; - getHelpers: function(pos, type) { - var this$1 = this; + ContentEditableInput.prototype.needsContentAttribute = true; - var found = [] - if (!helpers.hasOwnProperty(type)) { return found } - var help = helpers[type], mode = this.getModeAt(pos) - if (typeof mode[type] == "string") { - if (help[mode[type]]) { found.push(help[mode[type]]) } - } else if (mode[type]) { - for (var i = 0; i < mode[type].length; i++) { - var val = help[mode[type][i]] - if (val) { found.push(val) } - } - } else if (mode.helperType && help[mode.helperType]) { - found.push(help[mode.helperType]) - } else if (help[mode.name]) { - found.push(help[mode.name]) - } - for (var i$1 = 0; i$1 < help._global.length; i$1++) { - var cur = help._global[i$1] - if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1) - { found.push(cur.val) } - } - return found - }, + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); - getStateAfter: function(line, precise) { - var doc = this.doc - line = clipLine(doc, line == null ? doc.first + doc.size - 1: line) - return getStateBefore(this, line + 1, precise) - }, + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result + } - cursorCoords: function(start, mode) { - var pos, range = this.doc.sel.primary() - if (start == null) { pos = range.head } - else if (typeof start == "object") { pos = clipPos(this.doc, start) } - else { pos = start ? range.from() : range.to() } - return cursorCoords(this, pos, mode || "page") - }, + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false + } - charCoords: function(pos, mode) { - return charCoords(this, clipPos(this.doc, pos), mode || "page") - }, + function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } - coordsChar: function(coords, mode) { - coords = fromCoordSystem(this, coords, mode || "page") - return coordsChar(this, coords.left, coords.top) - }, + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { text += lineSep; } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return + } + var markerID = node.getAttribute("cm-marker"), range; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range = found[0].find(0))) + { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } + + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + + if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + extraLinebreak = false; + } + return text + } - lineAtHeight: function(height, mode) { - height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top - return lineAtHeight(this.doc, height + this.display.viewOffset) - }, - heightAtLine: function(line, mode, includeWidgets) { - var end = false, lineObj - if (typeof line == "number") { - var last = this.doc.first + this.doc.size - 1 - if (line < this.doc.first) { line = this.doc.first } - else if (line > last) { line = last; end = true } - lineObj = getLine(this.doc, line) - } else { - lineObj = line + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } } - return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets).top + - (end ? this.doc.height - heightAtLine(lineObj) : 0) - }, + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } + } - defaultTextHeight: function() { return textHeight(this.display) }, - defaultCharWidth: function() { return charWidth(this.display) }, - - getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, - - addWidget: function(pos, node, scroll, vert, horiz) { - var display = this.display - pos = cursorCoords(this, clipPos(this.doc, pos)) - var top = pos.bottom, left = pos.left - node.style.position = "absolute" - node.setAttribute("cm-ignore-events", "true") - this.display.input.setUneditable(node) - display.sizer.appendChild(node) - if (vert == "over") { - top = pos.top - } else if (vert == "above" || vert == "near") { - var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), - hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth) - // Default to positioning above (if specified and possible); otherwise default to positioning below - if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) - { top = pos.top - node.offsetHeight } - else if (pos.bottom + node.offsetHeight <= vspace) - { top = pos.bottom } - if (left + node.offsetWidth > hspace) - { left = hspace - node.offsetWidth } - } - node.style.top = top + "px" - node.style.left = node.style.right = "" - if (horiz == "right") { - left = display.sizer.clientWidth - node.offsetWidth - node.style.right = "0px" - } else { - if (horiz == "left") { left = 0 } - else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2 } - node.style.left = left + "px" + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) } - if (scroll) - { scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight) } - }, + } - triggerOnKeyDown: methodOp(onKeyDown), - triggerOnKeyPress: methodOp(onKeyPress), - triggerOnKeyUp: onKeyUp, + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map.length; j += 3) { + var curNode = map[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } - execCommand: function(cmd) { - if (commands.hasOwnProperty(cmd)) - { return commands[cmd].call(null, this) } - }, + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } + } - triggerElectric: methodOp(function(text) { triggerElectric(this, text) }), + // TEXTAREA INPUT STYLE - findPosH: function(from, amount, unit, visually) { - var this$1 = this; + var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; - var dir = 1 - if (amount < 0) { dir = -1; amount = -amount } - var cur = clipPos(this.doc, from) - for (var i = 0; i < amount; ++i) { - cur = findPosH(this$1.doc, cur, dir, unit, visually) - if (cur.hitSide) { break } - } - return cur - }, + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; + this.resetting = false; + }; - moveH: methodOp(function(dir, unit) { + TextareaInput.prototype.init = function (display) { var this$1 = this; - this.extendSelectionsBy(function (range) { - if (this$1.display.shift || this$1.doc.extend || range.empty()) - { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) } - else - { return dir < 0 ? range.from() : range.to() } - }, sel_move) - }), + var input = this, cm = this.cm; + this.createField(display); + var te = this.textarea; - deleteH: methodOp(function(dir, unit) { - var sel = this.doc.sel, doc = this.doc - if (sel.somethingSelected()) - { doc.replaceSelection("", null, "+delete") } - else - { deleteNearSelection(this, function (range) { - var other = findPosH(doc, range.head, dir, unit, false) - return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other} - }) } - }), + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); - findPosV: function(from, amount, unit, goalColumn) { - var this$1 = this; + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } - var dir = 1, x = goalColumn - if (amount < 0) { dir = -1; amount = -amount } - var cur = clipPos(this.doc, from) - for (var i = 0; i < amount; ++i) { - var coords = cursorCoords(this$1, cur, "div") - if (x == null) { x = coords.left } - else { coords.left = x } - cur = findPosV(this$1, coords, dir, unit) - if (cur.hitSide) { break } - } - return cur - }, + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); - moveV: methodOp(function(dir, unit) { - var this$1 = this; + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } - var doc = this.doc, goals = [] - var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected() - doc.extendSelectionsBy(function (range) { - if (collapse) - { return dir < 0 ? range.from() : range.to() } - var headPos = cursorCoords(this$1, range.head, "div") - if (range.goalColumn != null) { headPos.left = range.goalColumn } - goals.push(headPos.left) - var pos = findPosV(this$1, headPos, dir, unit) - if (unit == "page" && range == doc.sel.primary()) - { addToScrollPos(this$1, null, charCoords(this$1, pos, "div").top - headPos.top) } - return pos - }, sel_move) - if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) - { doc.sel.ranges[i].goalColumn = goals[i] } } - }), + cm.state.pasteIncoming = +new Date; + input.fastPoll(); + }); - // Find the word at the given position (as returned by coordsChar). - findWordAt: function(pos) { - var doc = this.doc, line = getLine(doc, pos.line).text - var start = pos.ch, end = pos.ch - if (line) { - var helper = this.getHelper(pos, "wordChars") - if ((pos.xRel < 0 || end == line.length) && start) { --start; } else { ++end } - var startChar = line.charAt(start) - var check = isWordChar(startChar, helper) - ? function (ch) { return isWordChar(ch, helper); } - : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } - : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); } - while (start > 0 && check(line.charAt(start - 1))) { --start } - while (end < line.length && check(line.charAt(end))) { ++end } - } - return new Range(Pos(pos.line, start), Pos(pos.line, end)) - }, + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = +new Date; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); - toggleOverwrite: function(value) { - if (value != null && value == this.state.overwrite) { return } - if (this.state.overwrite = !this.state.overwrite) - { addClass(this.display.cursorDiv, "CodeMirror-overwrite") } - else - { rmClass(this.display.cursorDiv, "CodeMirror-overwrite") } + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +new Date; + input.focus(); + return + } - signal(this, "overwriteToggle", this, this.state.overwrite) - }, - hasFocus: function() { return this.display.input.getField() == activeElt() }, - isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + // Pass the `paste` event to the textarea so it's handled by its event listener. + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; - scrollTo: methodOp(function(x, y) { - if (x != null || y != null) { resolveScrollToPos(this) } - if (x != null) { this.curOp.scrollLeft = x } - if (y != null) { this.curOp.scrollTop = y } - }), - getScrollInfo: function() { - var scroller = this.display.scroller - return {left: scroller.scrollLeft, top: scroller.scrollTop, - height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, - width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, - clientHeight: displayHeight(this), clientWidth: displayWidth(this)} - }, + TextareaInput.prototype.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + var opts = this.cm.options; + disableBrowserMagic(this.textarea, opts.spellcheck, opts.autocorrect, opts.autocapitalize); + }; - scrollIntoView: methodOp(function(range, margin) { - if (range == null) { - range = {from: this.doc.sel.primary().head, to: null} - if (margin == null) { margin = this.options.cursorScrollMargin } - } else if (typeof range == "number") { - range = {from: Pos(range, 0), to: null} - } else if (range.from == null) { - range = {from: range, to: null} - } - if (!range.to) { range.to = range.from } - range.margin = margin || 0 - - if (range.from.line != null) { - resolveScrollToPos(this) - this.curOp.scrollToPos = range - } else { - var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left), - Math.min(range.from.top, range.to.top) - range.margin, - Math.max(range.from.right, range.to.right), - Math.max(range.from.bottom, range.to.bottom) + range.margin) - this.scrollTo(sPos.scrollLeft, sPos.scrollTop) - } - }), + TextareaInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if(label) { + this.textarea.setAttribute('aria-label', label); + } else { + this.textarea.removeAttribute('aria-label'); + } + }; - setSize: methodOp(function(width, height) { - var this$1 = this; + TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); - var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; } - if (width != null) { this.display.wrapper.style.width = interpret(width) } - if (height != null) { this.display.wrapper.style.height = interpret(height) } - if (this.options.lineWrapping) { clearLineMeasurementCache(this) } - var lineNo = this.display.viewFrom - this.doc.iter(lineNo, this.display.viewTo, function (line) { - if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) - { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } } - ++lineNo - }) - this.curOp.forceUpdate = true - signal(this, "refresh", this) - }), + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } - operation: function(f){return runInOp(this, f)}, - - refresh: methodOp(function() { - var oldHeight = this.display.cachedTextHeight - regChange(this) - this.curOp.forceUpdate = true - clearCaches(this) - this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop) - updateGutterSpace(this) - if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) - { estimateLineHeights(this) } - signal(this, "refresh", this) - }), + return result + }; - swapDoc: methodOp(function(doc) { - var old = this.doc - old.cm = null - attachDoc(this, doc) - clearCaches(this) - this.display.input.reset() - this.scrollTo(doc.scrollLeft, doc.scrollTop) - this.curOp.forceScroll = true - signalLater(this, "swapDoc", this, old) - return old - }), + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; - getInputField: function(){return this.display.input.getField()}, - getWrapperElement: function(){return this.display.wrapper}, - getScrollerElement: function(){return this.display.scroller}, - getGutterElement: function(){return this.display.gutters} - } - eventMixin(CodeMirror) - - CodeMirror.registerHelper = function(type, name, value) { - if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []} } - helpers[type][name] = value - } - CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { - CodeMirror.registerHelper(type, name, value) - helpers[type]._global.push({pred: predicate, val: value}) - } -} - -// Used for horizontal relative motion. Dir is -1 or 1 (left or -// right), unit can be "char", "column" (like char, but doesn't -// cross line boundaries), "word" (across next word), or "group" (to -// the start of next group of word or non-word-non-whitespace -// chars). The visually param controls whether, in right-to-left -// text, direction 1 means to move towards the next index in the -// string, or towards the character to the right of the current -// position. The resulting position will have a hitSide=true -// property if it reached the end of the document. -function findPosH(doc, pos, dir, unit, visually) { - var line = pos.line, ch = pos.ch, origDir = dir - var lineObj = getLine(doc, line) - function findNextLine() { - var l = line + dir - if (l < doc.first || l >= doc.first + doc.size) { return false } - line = l - return lineObj = getLine(doc, l) - } - function moveOnce(boundToLine) { - var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true) - if (next == null) { - if (!boundToLine && findNextLine()) { - if (visually) { ch = (dir < 0 ? lineRight : lineLeft)(lineObj) } - else { ch = dir < 0 ? lineObj.text.length : 0 } - } else { return false } - } else { ch = next } - return true - } + // Reset the input to correspond to the selection (or to be empty, + // when not typing and nothing is selected) + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing && typing) { return } + var cm = this.cm; + this.resetting = true; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + this.resetting = false; + }; - if (unit == "char") { - moveOnce() - } else if (unit == "column") { - moveOnce(true) - } else if (unit == "word" || unit == "group") { - var sawType = null, group = unit == "group" - var helper = doc.cm && doc.cm.getHelper(pos, "wordChars") - for (var first = true;; first = false) { - if (dir < 0 && !moveOnce(!first)) { break } - var cur = lineObj.text.charAt(ch) || "\n" - var type = isWordChar(cur, helper) ? "w" - : group && cur == "\n" ? "n" - : !group || /\s/.test(cur) ? null - : "p" - if (group && !first && !type) { type = "s" } - if (sawType && sawType != type) { - if (dir < 0) {dir = 1; moveOnce()} - break - } + TextareaInput.prototype.getField = function () { return this.textarea }; - if (type) { sawType = type } - if (dir > 0 && !moveOnce(!first)) { break } + TextareaInput.prototype.supportsTouch = function () { return false }; + + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt(rootNode(this.textarea)) != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM } - } - var result = skipAtomic(doc, Pos(line, ch), pos, origDir, true) - if (!cmp(pos, result)) { result.hitSide = true } - return result -} + }; -// For relative vertical movement. Dir may be -1 or 1. Unit can be -// "page" or "line". The resulting position will have a hitSide=true -// property if it reached the end of the document. -function findPosV(cm, pos, dir, unit) { - var doc = cm.doc, x = pos.left, y - if (unit == "page") { - var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight) - var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3) - y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount + TextareaInput.prototype.blur = function () { this.textarea.blur(); }; - } else if (unit == "line") { - y = dir > 0 ? pos.bottom + 3 : pos.top - 3 - } - var target - for (;;) { - target = coordsChar(cm, x, y) - if (!target.outside) { break } - if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } - y += dir * 5 - } - return target -} + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; -// CONTENTEDITABLE INPUT STYLE + TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; -var ContentEditableInput = function(cm) { - this.cm = cm - this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null - this.polling = new Delayed() - this.composing = null - this.gracePeriod = false - this.readDOMTimeout = null -}; + // Poll for input changes, using the normal rate of polling. This + // runs as long as the editor is focused. + TextareaInput.prototype.slowPoll = function () { + var this$1 = this; -ContentEditableInput.prototype.init = function (display) { - var this$1 = this; + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); + }; - var input = this, cm = input.cm - var div = input.div = display.lineDiv - disableBrowserMagic(div, cm.options.spellcheck) - - on(div, "paste", function (e) { - if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } - // IE doesn't fire input events, so we schedule a read for the pasted content in this way - if (ie_version <= 11) { setTimeout(operation(cm, function () { - if (!input.pollContent()) { regChange(cm) } - }), 20) } - }) - - on(div, "compositionstart", function (e) { - this$1.composing = {data: e.data, done: false} - }) - on(div, "compositionupdate", function (e) { - if (!this$1.composing) { this$1.composing = {data: e.data, done: false} } - }) - on(div, "compositionend", function (e) { - if (this$1.composing) { - if (e.data != this$1.composing.data) { this$1.readFromDOMSoon() } - this$1.composing.done = true - } - }) - - on(div, "touchstart", function () { return input.forceCompositionEnd(); }) - - on(div, "input", function () { - if (!this$1.composing) { this$1.readFromDOMSoon() } - }) - - function onCopyCut(e) { - if (signalDOMEvent(cm, e)) { return } - if (cm.somethingSelected()) { - setLastCopied({lineWise: false, text: cm.getSelections()}) - if (e.type == "cut") { cm.replaceSelection("", null, "cut") } - } else if (!cm.options.lineWiseCopyCut) { - return - } else { - var ranges = copyableRanges(cm) - setLastCopied({lineWise: true, text: ranges.text}) - if (e.type == "cut") { - cm.operation(function () { - cm.setSelections(ranges.ranges, 0, sel_dontScroll) - cm.replaceSelection("", null, "cut") - }) - } - } - if (e.clipboardData) { - e.clipboardData.clearData() - var content = lastCopied.text.join("\n") - // iOS exposes the clipboard API, but seems to discard content inserted into it - e.clipboardData.setData("Text", content) - if (e.clipboardData.getData("Text") == content) { - e.preventDefault() - return + // When an event has just come in that is likely to add or change + // something in the input textarea, we poll faster, to ensure that + // the change appears on the screen quickly. + TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); + }; + + // Read input from the textarea, and update the document to match. + // When something is selected, it is present in the textarea, and + // selected (unless it is huge, in which case a placeholder is + // used). When nothing is selected, the cursor sits after previously + // seen text (can be empty), which is stored in prevInput (we must + // not reset the textarea when typing, because that breaks IME). + TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || this.resetting || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true + }; + + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } + }; + + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); + }; + + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + if (input.contextMenuPending) { input.contextMenuPending(); } + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = te.ownerDocument.defaultView.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { te.ownerDocument.defaultView.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; } } - // Old-fashioned briefly-focus-a-textarea hack - var kludge = hiddenTextarea(), te = kludge.firstChild - cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild) - te.value = lastCopied.text.join("\n") - var hadFocus = document.activeElement - selectInput(te) - setTimeout(function () { - cm.display.lineSpace.removeChild(kludge) - hadFocus.focus() - if (hadFocus == div) { input.showPrimarySelection() } - }, 50) - } - on(div, "copy", onCopyCut) - on(div, "cut", onCopyCut) -}; - -ContentEditableInput.prototype.prepareSelection = function () { - var result = prepareSelection(this.cm, false) - result.focus = this.cm.state.focused - return result -}; - -ContentEditableInput.prototype.showSelection = function (info, takeFocus) { - if (!info || !this.cm.display.view.length) { return } - if (info.focus || takeFocus) { this.showPrimarySelection() } - this.showMultipleSelections(info) -}; - -ContentEditableInput.prototype.showPrimarySelection = function () { - var sel = window.getSelection(), prim = this.cm.doc.sel.primary() - var curAnchor = domToPos(this.cm, sel.anchorNode, sel.anchorOffset) - var curFocus = domToPos(this.cm, sel.focusNode, sel.focusOffset) - if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && - cmp(minPos(curAnchor, curFocus), prim.from()) == 0 && - cmp(maxPos(curAnchor, curFocus), prim.to()) == 0) - { return } - - var start = posToDOM(this.cm, prim.from()) - var end = posToDOM(this.cm, prim.to()) - if (!start && !end) { return } - - var view = this.cm.display.view - var old = sel.rangeCount && sel.getRangeAt(0) - if (!start) { - start = {node: view[0].measure.map[2], offset: 0} - } else if (!end) { // FIXME dangerously hacky - var measure = view[view.length - 1].measure - var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map - end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]} - } - - var rng - try { rng = range(start.node, start.offset, end.offset, end.node) } - catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible - if (rng) { - if (!gecko && this.cm.state.focused) { - sel.collapse(start.node, start.offset) - if (!rng.collapsed) { - sel.removeAllRanges() - sel.addRange(rng) + function rehide() { + if (input.contextMenuPending != rehide) { return } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); } - } else { - sel.removeAllRanges() - sel.addRange(rng) } - if (old && sel.anchorNode == null) { sel.addRange(old) } - else if (gecko) { this.startGracePeriod() } - } - this.rememberSelection() -}; -ContentEditableInput.prototype.startGracePeriod = function () { - var this$1 = this; + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; - clearTimeout(this.gracePeriod) - this.gracePeriod = setTimeout(function () { - this$1.gracePeriod = false - if (this$1.selectionChanged()) - { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }) } - }, 20) -}; - -ContentEditableInput.prototype.showMultipleSelections = function (info) { - removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors) - removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection) -}; - -ContentEditableInput.prototype.rememberSelection = function () { - var sel = window.getSelection() - this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset - this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset -}; - -ContentEditableInput.prototype.selectionInEditor = function () { - var sel = window.getSelection() - if (!sel.rangeCount) { return false } - var node = sel.getRangeAt(0).commonAncestorContainer - return contains(this.div, node) -}; - -ContentEditableInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor") { - if (!this.selectionInEditor()) - { this.showSelection(this.prepareSelection(), true) } - this.div.focus() - } -}; -ContentEditableInput.prototype.blur = function () { this.div.blur() }; -ContentEditableInput.prototype.getField = function () { return this.div }; - -ContentEditableInput.prototype.supportsTouch = function () { return true }; - -ContentEditableInput.prototype.receivedFocus = function () { - var input = this - if (this.selectionInEditor()) - { this.pollSelection() } - else - { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }) } - - function poll() { - if (input.cm.state.focused) { - input.pollSelection() - input.polling.set(input.cm.options.pollInterval, poll) - } - } - this.polling.set(this.cm.options.pollInterval, poll) -}; - -ContentEditableInput.prototype.selectionChanged = function () { - var sel = window.getSelection() - return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || - sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset -}; - -ContentEditableInput.prototype.pollSelection = function () { - if (!this.composing && this.readDOMTimeout == null && !this.gracePeriod && this.selectionChanged()) { - var sel = window.getSelection(), cm = this.cm - this.rememberSelection() - var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset) - var head = domToPos(cm, sel.focusNode, sel.focusOffset) - if (anchor && head) { runInOp(cm, function () { - setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll) - if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true } - }) } - } -}; - -ContentEditableInput.prototype.pollContent = function () { - if (this.readDOMTimeout != null) { - clearTimeout(this.readDOMTimeout) - this.readDOMTimeout = null - } - - var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary() - var from = sel.from(), to = sel.to() - if (from.ch == 0 && from.line > cm.firstLine()) - { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length) } - if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) - { to = Pos(to.line + 1, 0) } - if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } - - var fromIndex, fromLine, fromNode - if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { - fromLine = lineNo(display.view[0].line) - fromNode = display.view[0].node - } else { - fromLine = lineNo(display.view[fromIndex].line) - fromNode = display.view[fromIndex - 1].node.nextSibling - } - var toIndex = findViewIndex(cm, to.line) - var toLine, toNode - if (toIndex == display.view.length - 1) { - toLine = display.viewTo - 1 - toNode = display.lineDiv.lastChild - } else { - toLine = lineNo(display.view[toIndex + 1].line) - 1 - toNode = display.view[toIndex + 1].node.previousSibling - } - - if (!fromNode) { return false } - var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)) - var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)) - while (newText.length > 1 && oldText.length > 1) { - if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine-- } - else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++ } - else { break } - } - - var cutFront = 0, cutEnd = 0 - var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length) - while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) - { ++cutFront } - var newBot = lst(newText), oldBot = lst(oldText) - var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), - oldBot.length - (oldText.length == 1 ? cutFront : 0)) - while (cutEnd < maxCutEnd && - newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) - { ++cutEnd } - - newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, "") - newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, "") - - var chFrom = Pos(fromLine, cutFront) - var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0) - if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { - replaceRange(cm.doc, newText, chFrom, chTo, "+input") - return true - } -}; - -ContentEditableInput.prototype.ensurePolled = function () { - this.forceCompositionEnd() -}; -ContentEditableInput.prototype.reset = function () { - this.forceCompositionEnd() -}; -ContentEditableInput.prototype.forceCompositionEnd = function () { - if (!this.composing) { return } - clearTimeout(this.readDOMTimeout) - this.composing = null - if (!this.pollContent()) { regChange(this.cm) } - this.div.blur() - this.div.focus() -}; -ContentEditableInput.prototype.readFromDOMSoon = function () { - var this$1 = this; + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; - if (this.readDOMTimeout != null) { return } - this.readDOMTimeout = setTimeout(function () { - this$1.readDOMTimeout = null - if (this$1.composing) { - if (this$1.composing.done) { this$1.composing = null } - else { return } - } - if (this$1.cm.isReadOnly() || !this$1.pollContent()) - { runInOp(this$1.cm, function () { return regChange(this$1.cm); }) } - }, 80) -}; - -ContentEditableInput.prototype.setUneditable = function (node) { - node.contentEditable = "false" -}; - -ContentEditableInput.prototype.onKeyPress = function (e) { - e.preventDefault() - if (!this.cm.isReadOnly()) - { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0) } -}; - -ContentEditableInput.prototype.readOnlyChanged = function (val) { - this.div.contentEditable = String(val != "nocursor") -}; - -ContentEditableInput.prototype.onContextMenu = function () {}; -ContentEditableInput.prototype.resetPosition = function () {}; - -ContentEditableInput.prototype.needsContentAttribute = true - -function posToDOM(cm, pos) { - var view = findViewForLine(cm, pos.line) - if (!view || view.hidden) { return null } - var line = getLine(cm.doc, pos.line) - var info = mapFromLineView(view, line, pos.line) - - var order = getOrder(line), side = "left" - if (order) { - var partPos = getBidiPartAt(order, pos.ch) - side = partPos % 2 ? "right" : "left" - } - var result = nodeAndOffsetInLineMap(info.map, pos.ch, side) - result.offset = result.collapse == "right" ? result.end : result.start - return result -} - -function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } - -function domTextBetween(cm, from, to, fromLine, toLine) { - var text = "", closing = false, lineSep = cm.doc.lineSeparator() - function recognizeMarker(id) { return function (marker) { return marker.id == id; } } - function walk(node) { - if (node.nodeType == 1) { - var cmText = node.getAttribute("cm-text") - if (cmText != null) { - if (cmText == "") { text += node.textContent.replace(/\u200b/g, "") } - else { text += cmText } - return - } - var markerID = node.getAttribute("cm-marker"), range - if (markerID) { - var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)) - if (found.length && (range = found[0].find())) - { text += getBetween(cm.doc, range.from, range.to).join(lineSep) } - return - } - if (node.getAttribute("contenteditable") == "false") { return } - for (var i = 0; i < node.childNodes.length; i++) - { walk(node.childNodes[i]) } - if (/^(pre|div|p)$/i.test(node.nodeName)) - { closing = true } - } else if (node.nodeType == 3) { - var val = node.nodeValue - if (!val) { return } - if (closing) { - text += lineSep - closing = false - } - text += val - } - } - for (;;) { - walk(from) - if (from == to) { break } - from = from.nextSibling - } - return text -} - -function domToPos(cm, node, offset) { - var lineNode - if (node == cm.display.lineDiv) { - lineNode = cm.display.lineDiv.childNodes[offset] - if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } - node = null; offset = 0 - } else { - for (lineNode = node;; lineNode = lineNode.parentNode) { - if (!lineNode || lineNode == cm.display.lineDiv) { return null } - if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } - } - } - for (var i = 0; i < cm.display.view.length; i++) { - var lineView = cm.display.view[i] - if (lineView.node == lineNode) - { return locateNodeInLineView(lineView, node, offset) } - } -} - -function locateNodeInLineView(lineView, node, offset) { - var wrapper = lineView.text.firstChild, bad = false - if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } - if (node == wrapper) { - bad = true - node = wrapper.childNodes[offset] - offset = 0 - if (!node) { - var line = lineView.rest ? lst(lineView.rest) : lineView.line - return badPos(Pos(lineNo(line), line.text.length), bad) - } - } - - var textNode = node.nodeType == 3 ? node : null, topNode = node - if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { - textNode = node.firstChild - if (offset) { offset = textNode.nodeValue.length } - } - while (topNode.parentNode != wrapper) { topNode = topNode.parentNode } - var measure = lineView.measure, maps = measure.maps - - function find(textNode, topNode, offset) { - for (var i = -1; i < (maps ? maps.length : 0); i++) { - var map = i < 0 ? measure.map : maps[i] - for (var j = 0; j < map.length; j += 3) { - var curNode = map[j + 2] - if (curNode == textNode || curNode == topNode) { - var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]) - var ch = map[j] + offset - if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)] } - return Pos(line, ch) - } + TextareaInput.prototype.setUneditable = function () {}; + + TextareaInput.prototype.needsContentAttribute = false; + + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(rootNode(textarea)); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} } } - } - var found = find(textNode, topNode, offset) - if (found) { return badPos(found, bad) } - - // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems - for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { - found = find(after, after.firstChild, 0) - if (found) - { return badPos(Pos(found.line, found.ch - dist), bad) } - else - { dist += after.textContent.length } - } - for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { - found = find(before, before.firstChild, -1) - if (found) - { return badPos(Pos(found.line, found.ch + dist$1), bad) } - else - { dist$1 += before.textContent.length } - } -} - -// TEXTAREA INPUT STYLE - -var TextareaInput = function(cm) { - this.cm = cm - // See input.poll and input.reset - this.prevInput = "" - - // Flag that indicates whether we expect input to appear real soon - // now (after some event like 'keypress' or 'input') and are - // polling intensively. - this.pollingFast = false - // Self-resetting timeout for the poller - this.polling = new Delayed() - // Tracks when input.reset has punted to just putting a short - // string into the textarea instead of the full selection. - this.inaccurateSelection = false - // Used to work around IE issue with selection being forgotten when focus moves away from textarea - this.hasSelection = false - this.composing = null -}; - -TextareaInput.prototype.init = function (display) { - var this$1 = this; - var input = this, cm = this.cm + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm + } + + function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; + } + + // EDITOR CONSTRUCTOR + + defineOptions(CodeMirror); + + addEditorMethods(CodeMirror); + + // Set up methods on CodeMirror's prototype to redirect to the editor's document. + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + + eventMixin(Doc); + CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + CodeMirror.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } + defineMode.apply(this, arguments); + }; - // Wraps and hides input textarea - var div = this.wrapper = hiddenTextarea() - // The semihidden textarea that is focused when the editor is - // focused, and receives input. - var te = this.textarea = div.firstChild - display.wrapper.insertBefore(div, display.wrapper.firstChild) + CodeMirror.defineMIME = defineMIME; - // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) - if (ios) { te.style.width = "0px" } + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); - on(te, "input", function () { - if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null } - input.poll() - }) + // EXTENSIONS - on(te, "paste", function (e) { - if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; - cm.state.pasteIncoming = true - input.fastPoll() - }) + CodeMirror.fromTextArea = fromTextArea; - function prepareCopyCut(e) { - if (signalDOMEvent(cm, e)) { return } - if (cm.somethingSelected()) { - setLastCopied({lineWise: false, text: cm.getSelections()}) - if (input.inaccurateSelection) { - input.prevInput = "" - input.inaccurateSelection = false - te.value = lastCopied.text.join("\n") - selectInput(te) - } - } else if (!cm.options.lineWiseCopyCut) { - return - } else { - var ranges = copyableRanges(cm) - setLastCopied({lineWise: true, text: ranges.text}) - if (e.type == "cut") { - cm.setSelections(ranges.ranges, null, sel_dontScroll) - } else { - input.prevInput = "" - te.value = ranges.text.join("\n") - selectInput(te) - } - } - if (e.type == "cut") { cm.state.cutIncoming = true } - } - on(te, "cut", prepareCopyCut) - on(te, "copy", prepareCopyCut) - - on(display.scroller, "paste", function (e) { - if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } - cm.state.pasteIncoming = true - input.focus() - }) - - // Prevent normal selection in the editor (we handle our own) - on(display.lineSpace, "selectstart", function (e) { - if (!eventInWidget(display, e)) { e_preventDefault(e) } - }) - - on(te, "compositionstart", function () { - var start = cm.getCursor("from") - if (input.composing) { input.composing.range.clear() } - input.composing = { - start: start, - range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) - } - }) - on(te, "compositionend", function () { - if (input.composing) { - input.poll() - input.composing.range.clear() - input.composing = null - } - }) -}; - -TextareaInput.prototype.prepareSelection = function () { - // Redraw the selection and/or cursor - var cm = this.cm, display = cm.display, doc = cm.doc - var result = prepareSelection(cm) - - // Move the hidden textarea near the cursor to prevent scrolling artifacts - if (cm.options.moveInputWithCursor) { - var headPos = cursorCoords(cm, doc.sel.primary().head, "div") - var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect() - result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, - headPos.top + lineOff.top - wrapOff.top)) - result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, - headPos.left + lineOff.left - wrapOff.left)) - } - - return result -}; - -TextareaInput.prototype.showSelection = function (drawn) { - var cm = this.cm, display = cm.display - removeChildrenAndAdd(display.cursorDiv, drawn.cursors) - removeChildrenAndAdd(display.selectionDiv, drawn.selection) - if (drawn.teTop != null) { - this.wrapper.style.top = drawn.teTop + "px" - this.wrapper.style.left = drawn.teLeft + "px" - } -}; - -// Reset the input to correspond to the selection (or to be empty, -// when not typing and nothing is selected) -TextareaInput.prototype.reset = function (typing) { - if (this.contextMenuPending) { return } - var minimal, selected, cm = this.cm, doc = cm.doc - if (cm.somethingSelected()) { - this.prevInput = "" - var range = doc.sel.primary() - minimal = hasCopyEvent && - (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000) - var content = minimal ? "-" : selected || cm.getSelection() - this.textarea.value = content - if (cm.state.focused) { selectInput(this.textarea) } - if (ie && ie_version >= 9) { this.hasSelection = content } - } else if (!typing) { - this.prevInput = this.textarea.value = "" - if (ie && ie_version >= 9) { this.hasSelection = null } - } - this.inaccurateSelection = minimal -}; - -TextareaInput.prototype.getField = function () { return this.textarea }; - -TextareaInput.prototype.supportsTouch = function () { return false }; - -TextareaInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { - try { this.textarea.focus() } - catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM - } -}; - -TextareaInput.prototype.blur = function () { this.textarea.blur() }; - -TextareaInput.prototype.resetPosition = function () { - this.wrapper.style.top = this.wrapper.style.left = 0 -}; - -TextareaInput.prototype.receivedFocus = function () { this.slowPoll() }; - -// Poll for input changes, using the normal rate of polling. This -// runs as long as the editor is focused. -TextareaInput.prototype.slowPoll = function () { - var this$1 = this; + addLegacyProps(CodeMirror); - if (this.pollingFast) { return } - this.polling.set(this.cm.options.pollInterval, function () { - this$1.poll() - if (this$1.cm.state.focused) { this$1.slowPoll() } - }) -}; - -// When an event has just come in that is likely to add or change -// something in the input textarea, we poll faster, to ensure that -// the change appears on the screen quickly. -TextareaInput.prototype.fastPoll = function () { - var missed = false, input = this - input.pollingFast = true - function p() { - var changed = input.poll() - if (!changed && !missed) {missed = true; input.polling.set(60, p)} - else {input.pollingFast = false; input.slowPoll()} - } - input.polling.set(20, p) -}; - -// Read input from the textarea, and update the document to match. -// When something is selected, it is present in the textarea, and -// selected (unless it is huge, in which case a placeholder is -// used). When nothing is selected, the cursor sits after previously -// seen text (can be empty), which is stored in prevInput (we must -// not reset the textarea when typing, because that breaks IME). -TextareaInput.prototype.poll = function () { - var this$1 = this; + CodeMirror.version = "5.65.16"; - var cm = this.cm, input = this.textarea, prevInput = this.prevInput - // Since this is called a *lot*, try to bail out as cheaply as - // possible when it is clear that nothing happened. hasSelection - // will be the case when there is a lot of text in the textarea, - // in which case reading its value would be expensive. - if (this.contextMenuPending || !cm.state.focused || - (hasSelection(input) && !prevInput && !this.composing) || - cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) - { return false } - - var text = input.value - // If nothing changed, bail. - if (text == prevInput && !cm.somethingSelected()) { return false } - // Work around nonsensical selection resetting in IE9/10, and - // inexplicable appearance of private area unicode characters on - // some key combos in Mac (#2689). - if (ie && ie_version >= 9 && this.hasSelection === text || - mac && /[\uf700-\uf7ff]/.test(text)) { - cm.display.input.reset() - return false - } + return CodeMirror; - if (cm.doc.sel == cm.display.selForContextMenu) { - var first = text.charCodeAt(0) - if (first == 0x200b && !prevInput) { prevInput = "\u200b" } - if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } - } - // Find the part of the input that is actually new - var same = 0, l = Math.min(prevInput.length, text.length) - while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same } - - runInOp(cm, function () { - applyTextInput(cm, text.slice(same), prevInput.length - same, - null, this$1.composing ? "*compose" : null) - - // Don't leave long text in the textarea, since it makes further polling slow - if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = "" } - else { this$1.prevInput = text } - - if (this$1.composing) { - this$1.composing.range.clear() - this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), - {className: "CodeMirror-composing"}) - } - }) - return true -}; - -TextareaInput.prototype.ensurePolled = function () { - if (this.pollingFast && this.poll()) { this.pollingFast = false } -}; - -TextareaInput.prototype.onKeyPress = function () { - if (ie && ie_version >= 9) { this.hasSelection = null } - this.fastPoll() -}; - -TextareaInput.prototype.onContextMenu = function (e) { - var input = this, cm = input.cm, display = cm.display, te = input.textarea - var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop - if (!pos || presto) { return } // Opera is difficult. - - // Reset the current text selection only if the click is done outside of the selection - // and 'resetSelectionOnContextMenu' option is true. - var reset = cm.options.resetSelectionOnContextMenu - if (reset && cm.doc.sel.contains(pos) == -1) - { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll) } - - var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText - input.wrapper.style.cssText = "position: absolute" - var wrapperBox = input.wrapper.getBoundingClientRect() - te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);" - var oldScrollY - if (webkit) { oldScrollY = window.scrollY } // Work around Chrome issue (#2712) - display.input.focus() - if (webkit) { window.scrollTo(null, oldScrollY) } - display.input.reset() - // Adds "Select all" to context menu in FF - if (!cm.somethingSelected()) { te.value = input.prevInput = " " } - input.contextMenuPending = true - display.selForContextMenu = cm.doc.sel - clearTimeout(display.detectingSelectAll) - - // Select-all will be greyed out if there's nothing to select, so - // this adds a zero-width space so that we can later check whether - // it got selected. - function prepareSelectAllHack() { - if (te.selectionStart != null) { - var selected = cm.somethingSelected() - var extval = "\u200b" + (selected ? te.value : "") - te.value = "\u21da" // Used to catch context-menu undo - te.value = extval - input.prevInput = selected ? "" : "\u200b" - te.selectionStart = 1; te.selectionEnd = extval.length - // Re-set this, in case some other handler touched the - // selection in the meantime. - display.selForContextMenu = cm.doc.sel - } - } - function rehide() { - input.contextMenuPending = false - input.wrapper.style.cssText = oldWrapperCSS - te.style.cssText = oldCSS - if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos) } - - // Try to detect the user choosing select-all - if (te.selectionStart != null) { - if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack() } - var i = 0, poll = function () { - if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && - te.selectionEnd > 0 && input.prevInput == "\u200b") - { operation(cm, selectAll)(cm) } - else if (i++ < 10) { display.detectingSelectAll = setTimeout(poll, 500) } - else { display.input.reset() } - } - display.detectingSelectAll = setTimeout(poll, 200) - } - } - - if (ie && ie_version >= 9) { prepareSelectAllHack() } - if (captureRightClick) { - e_stop(e) - var mouseup = function () { - off(window, "mouseup", mouseup) - setTimeout(rehide, 20) - } - on(window, "mouseup", mouseup) - } else { - setTimeout(rehide, 50) - } -}; - -TextareaInput.prototype.readOnlyChanged = function (val) { - if (!val) { this.reset() } -}; - -TextareaInput.prototype.setUneditable = function () {}; - -TextareaInput.prototype.needsContentAttribute = false - -function fromTextArea(textarea, options) { - options = options ? copyObj(options) : {} - options.value = textarea.value - if (!options.tabindex && textarea.tabIndex) - { options.tabindex = textarea.tabIndex } - if (!options.placeholder && textarea.placeholder) - { options.placeholder = textarea.placeholder } - // Set autofocus to true if this textarea is focused, or if it has - // autofocus and no other element is focused. - if (options.autofocus == null) { - var hasFocus = activeElt() - options.autofocus = hasFocus == textarea || - textarea.getAttribute("autofocus") != null && hasFocus == document.body - } - - function save() {textarea.value = cm.getValue()} - - var realSubmit - if (textarea.form) { - on(textarea.form, "submit", save) - // Deplorable hack to make the submit method do the right thing. - if (!options.leaveSubmitMethodAlone) { - var form = textarea.form - realSubmit = form.submit - try { - var wrappedSubmit = form.submit = function () { - save() - form.submit = realSubmit - form.submit() - form.submit = wrappedSubmit - } - } catch(e) {} - } - } - - options.finishInit = function (cm) { - cm.save = save - cm.getTextArea = function () { return textarea; } - cm.toTextArea = function () { - cm.toTextArea = isNaN // Prevent this from being ran twice - save() - textarea.parentNode.removeChild(cm.getWrapperElement()) - textarea.style.display = "" - if (textarea.form) { - off(textarea.form, "submit", save) - if (typeof textarea.form.submit == "function") - { textarea.form.submit = realSubmit } - } - } - } - - textarea.style.display = "none" - var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, - options) - return cm -} - -function addLegacyProps(CodeMirror) { - CodeMirror.off = off - CodeMirror.on = on - CodeMirror.wheelEventPixels = wheelEventPixels - CodeMirror.Doc = Doc - CodeMirror.splitLines = splitLinesAuto - CodeMirror.countColumn = countColumn - CodeMirror.findColumn = findColumn - CodeMirror.isWordChar = isWordCharBasic - CodeMirror.Pass = Pass - CodeMirror.signal = signal - CodeMirror.Line = Line - CodeMirror.changeEnd = changeEnd - CodeMirror.scrollbarModel = scrollbarModel - CodeMirror.Pos = Pos - CodeMirror.cmpPos = cmp - CodeMirror.modes = modes - CodeMirror.mimeModes = mimeModes - CodeMirror.resolveMode = resolveMode - CodeMirror.getMode = getMode - CodeMirror.modeExtensions = modeExtensions - CodeMirror.extendMode = extendMode - CodeMirror.copyState = copyState - CodeMirror.startState = startState - CodeMirror.innerMode = innerMode - CodeMirror.commands = commands - CodeMirror.keyMap = keyMap - CodeMirror.keyName = keyName - CodeMirror.isModifierKey = isModifierKey - CodeMirror.lookupKey = lookupKey - CodeMirror.normalizeKeyMap = normalizeKeyMap - CodeMirror.StringStream = StringStream - CodeMirror.SharedTextMarker = SharedTextMarker - CodeMirror.TextMarker = TextMarker - CodeMirror.LineWidget = LineWidget - CodeMirror.e_preventDefault = e_preventDefault - CodeMirror.e_stopPropagation = e_stopPropagation - CodeMirror.e_stop = e_stop - CodeMirror.addClass = addClass - CodeMirror.contains = contains - CodeMirror.rmClass = rmClass - CodeMirror.keyNames = keyNames -} - -// EDITOR CONSTRUCTOR - -defineOptions(CodeMirror) - -addEditorMethods(CodeMirror) - -// Set up methods on CodeMirror's prototype to redirect to the editor's document. -var dontDelegate = "iter insert remove copy getEditor constructor".split(" ") -for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) - { CodeMirror.prototype[prop] = (function(method) { - return function() {return method.apply(this.doc, arguments)} - })(Doc.prototype[prop]) } } - -eventMixin(Doc) - -// INPUT HANDLING - -CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput} - -// MODE DEFINITION AND QUERYING - -// Extra arguments are stored as the mode's dependencies, which is -// used by (legacy) mechanisms like loadmode.js to automatically -// load a mode. (Preferred mechanism is the require/define calls.) -CodeMirror.defineMode = function(name/*, mode, …*/) { - if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name } - defineMode.apply(this, arguments) -} - -CodeMirror.defineMIME = defineMIME - -// Minimal default mode. -CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }) -CodeMirror.defineMIME("text/plain", "null") - -// EXTENSIONS - -CodeMirror.defineExtension = function (name, func) { - CodeMirror.prototype[name] = func -} -CodeMirror.defineDocExtension = function (name, func) { - Doc.prototype[name] = func -} - -CodeMirror.fromTextArea = fromTextArea - -addLegacyProps(CodeMirror) - -// Lively Hacks -CodeMirror.posToDOM = posToDOM - -CodeMirror.version = "5.23.0" - -return CodeMirror; - -}))); \ No newline at end of file +}))); diff --git a/src/external/code-mirror/mode/apl/apl.js b/src/external/code-mirror/mode/apl/apl.js index caafe4e91..667aa792e 100644 --- a/src/external/code-mirror/mode/apl/apl.js +++ b/src/external/code-mirror/mode/apl/apl.js @@ -1,5 +1,5 @@ // CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE +// Distributed under an MIT license: https://codemirror.net/5/LICENSE (function(mod) { if (typeof exports == "object" && typeof module == "object") // CommonJS diff --git a/src/external/code-mirror/mode/apl/index.html b/src/external/code-mirror/mode/apl/index.html index 53dda6b58..1946d2f81 100644 --- a/src/external/code-mirror/mode/apl/index.html +++ b/src/external/code-mirror/mode/apl/index.html @@ -12,12 +12,12 @@ .CodeMirror { border: 2px inset #dee; }

        lBN2iQG8SRNnCl^_!}77YEk_3W6?H{wf!!C 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