├── .gitignore
├── LICENSE
├── README.markdown
├── img_prep.py
├── index.html
├── inputs
├── content.png
└── style.png
├── lbfgs.py
├── neural_style.py
├── requirements-full.txt
├── requirements.txt
├── result.json
├── result
├── 0.png
├── 1.png
├── 10.png
├── 11.png
├── 12.png
├── 13.png
├── 14.png
├── 15.png
├── 2.png
├── 3.png
├── 4.png
├── 5.png
├── 6.png
├── 7.png
└── 9.png
├── settings.py
├── snapshots
├── 1000.png
├── 1700.png
├── 188.png
├── 2000.png
├── 200x200
│ ├── 2804.png
│ ├── overall.png
│ └── vc.png
├── 287.png
├── 340.png
├── 400x400
│ ├── 1005.png
│ └── 607.png
├── 992.png
├── default.png
├── logarithm.png
├── neural_style_board.png
├── percent.png
├── percent2.png
├── value.png
└── very-high-lr.png
├── start_training.py
├── static
├── board.js
├── highslide.config.js
├── highslide
│ ├── graphics
│ │ ├── close.png
│ │ ├── closeX.png
│ │ ├── controlbar-black-border.gif
│ │ ├── controlbar-text-buttons.png
│ │ ├── controlbar-white-small.gif
│ │ ├── controlbar-white.gif
│ │ ├── controlbar2.gif
│ │ ├── controlbar3.gif
│ │ ├── controlbar4-hover.gif
│ │ ├── controlbar4.gif
│ │ ├── fullexpand.gif
│ │ ├── geckodimmer.png
│ │ ├── icon.gif
│ │ ├── loader.gif
│ │ ├── loader.white.gif
│ │ ├── outlines
│ │ │ ├── Outlines.psd
│ │ │ ├── beveled.png
│ │ │ ├── drop-shadow.png
│ │ │ ├── glossy-dark.png
│ │ │ ├── outer-glow.png
│ │ │ ├── rounded-black.png
│ │ │ └── rounded-white.png
│ │ ├── resize.gif
│ │ ├── scrollarrows.png
│ │ ├── zoomin.cur
│ │ └── zoomout.cur
│ ├── highslide-full.js
│ ├── highslide-full.min.js
│ ├── highslide-full.packed.js
│ ├── highslide-ie6.css
│ ├── highslide-with-gallery.js
│ ├── highslide-with-gallery.min.js
│ ├── highslide-with-gallery.packed.js
│ ├── highslide-with-html.js
│ ├── highslide-with-html.min.js
│ ├── highslide-with-html.packed.js
│ ├── highslide.css
│ ├── highslide.js
│ ├── highslide.min.js
│ └── highslide.packed.js
├── jquery.min.js
└── stock
│ ├── highstock.js
│ ├── modules
│ └── exporting.js
│ └── themes
│ ├── dark-unica-nofont.js
│ └── dark-unica.js
├── training.py
├── training_record.py
├── vgg16_cnn_only_weights.h5
└── vgg16_cnnonly_model.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Example user template template
3 | ### Example user template
4 |
5 | *.lua
6 | .DS_Store
7 |
8 | # IntelliJ project files
9 | .idea
10 | *.iml
11 | out
12 | gen### Python template
13 | # Byte-compiled / optimized / DLL files
14 | __pycache__/
15 | *.py[cod]
16 | *$py.class
17 |
18 | # C extensions
19 | *.so
20 |
21 | # Distribution / packaging
22 | .Python
23 | env/
24 | build/
25 | develop-eggs/
26 | dist/
27 | downloads/
28 | eggs/
29 | .eggs/
30 | lib/
31 | lib64/
32 | parts/
33 | sdist/
34 | var/
35 | *.egg-info/
36 | .installed.cfg
37 | *.egg
38 |
39 | # PyInstaller
40 | # Usually these files are written by a python script from a template
41 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
42 | *.manifest
43 | *.spec
44 |
45 | # Installer logs
46 | pip-log.txt
47 | pip-delete-this-directory.txt
48 |
49 | # Unit test / coverage reports
50 | htmlcov/
51 | .tox/
52 | .coverage
53 | .coverage.*
54 | .cache
55 | nosetests.xml
56 | coverage.xml
57 | *,cover
58 |
59 | # Translations
60 | *.mo
61 | *.pot
62 |
63 | # Django stuff:
64 | *.log
65 |
66 | # Sphinx documentation
67 | docs/_build/
68 |
69 | # PyBuilder
70 | target/
71 |
72 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 suquark
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.markdown:
--------------------------------------------------------------------------------
1 | # Neural-Style Visualization
2 |
3 | This project aims at visualize loss and other important metrics for analysis.
4 |
5 | This project also implement an instance of neural-style, follows the idea of a keras example `keras/examples/neural_style_transfer.py`,
6 | but with a mostly different design.
7 |
8 | Visualization is important and fun. It tells us what's going on.
9 |
10 | ## Requirements
11 |
12 | - python 3
13 | - keras
14 | - tensorflow >= 0.9.0 / Theano
15 | - h5py
16 | - Pillow
17 | - requests
18 | - tornado
19 |
20 |
21 |
22 | ## Usage
23 |
24 | make sure you have the requirements above, or type this in your command line:
25 |
26 | sudo pip install -r requirements.txt
27 |
28 | if you want to use tensorflow as backend, follow the [instruction](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3doc/get_started/os_setup.md) to install tensorflow first
29 |
30 | then
31 |
32 | python neural_style.py
33 |
34 | now you can see the neural style board in `localhost:8000`
35 |
36 | 
37 |
38 | ## Loss analysis
39 |
40 | For example, you may find an bad output
41 |
42 | 
43 |
44 | after comparing the loss, you will found negative correlation between style loss and content loss(against the assumption of neural-style):
45 |
46 | 
47 |
48 | so a very small picture may not be very suitable for neural-style task.
49 |
50 | Here's a better result with nearly independent loss:
51 |
52 | 
53 | 
54 |
55 | A very high learning rate:
56 |
57 | 
58 |
59 | ## Realtime watch
60 |
61 | 
62 |
63 | ## Headstart
64 |
65 | You can stop your training at any time and continue at the last epoch.
66 |
67 | ## Realtime hyperparameter adjusting
68 |
69 | You are free to adjust hyperparameter
70 |
71 | ## Speed
72 |
73 | Using TensorFlow as backend.
74 |
75 | CPU: about 30 seconds/iter on Macbook Pro
76 |
77 | GPU: about 0.3 s/iter on an K20
78 |
--------------------------------------------------------------------------------
/img_prep.py:
--------------------------------------------------------------------------------
1 | from __future__ import print_function
2 | from os.path import exists
3 | import numpy as np
4 | from settings import img_width, img_height
5 | from scipy.misc import imread, imresize, imsave
6 |
7 |
8 | def preprocess_image(image_path):
9 | """
10 | util function to open, resize and format pictures into appropriate tensors
11 | :param image_path: PAth to read the image
12 | :return:
13 | """
14 | img = imresize(imread(image_path), (img_width, img_height))
15 | img = img.transpose((2, 0, 1)).astype('float64')
16 | img = np.expand_dims(img, axis=0)
17 | return img
18 |
19 |
20 | def deprocess_image(x):
21 | """
22 | util function to convert a tensor into a valid image
23 | :param x: numpy array for image
24 | :return: a tuned array
25 | """
26 | x = x.transpose((1, 2, 0))
27 | x = np.clip(x, 0, 255).astype('uint8')
28 | return x
29 |
30 |
31 | # def random_image():
32 | # """
33 | # Create a random image
34 | # :return: A random image
35 | # """
36 | # return np.random.uniform(0, 255, (1, 3, img_width, img_height))
37 |
38 |
39 | def grey_image():
40 | """
41 | Create a random image
42 | :return: A random image
43 | """
44 | return np.ones((1, 3, img_width, img_height)) * 128.0
45 |
46 |
47 | def img_in(content_path, style_path):
48 | content = preprocess_image(content_path)
49 | style = preprocess_image(style_path)
50 | return content, style
51 |
52 |
53 | def img_save(x, fname, allow_override=False):
54 | """
55 | Save image
56 | :param x: numpy array of image
57 | :param fname: filename
58 | :param allow_override: if a image exist, override it only when it is necessary
59 | :return:
60 | """
61 | img = deprocess_image(x.reshape((3, img_width, img_height)))
62 | if not allow_override and exists(fname):
63 | raise Exception('Image exists')
64 | imsave(fname, img)
65 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
neural style board
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
74 |
75 |
102 |
103 |
--------------------------------------------------------------------------------
/inputs/content.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/inputs/content.png
--------------------------------------------------------------------------------
/inputs/style.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/inputs/style.png
--------------------------------------------------------------------------------
/lbfgs.py:
--------------------------------------------------------------------------------
1 | # TODO: implement the l-bfgs algorithm
2 | # local x, losses = optim.lbfgs(feval, img, {})
3 |
4 |
--------------------------------------------------------------------------------
/neural_style.py:
--------------------------------------------------------------------------------
1 | from __future__ import print_function
2 | import os
3 | from tornado.ioloop import IOLoop
4 | from tornado.web import RequestHandler, Application
5 | from tornado.escape import json_decode
6 | import json
7 | # from main import start_training
8 | import multiprocessing
9 | from tornado.concurrent import Future
10 | from tornado import gen
11 | import uuid
12 | # from training_record import TrainingRecorder
13 |
14 | __author__ = 'xymeow'
15 |
16 | # TODO: show training messages on the front end
17 |
18 | start = False
19 | trained = False
20 | stop = False
21 | lr = 1.0
22 |
23 | p = None
24 | record_cache = None
25 | # use long polling to update the training results
26 | # I copied these codes from tornado/demo/chat
27 | class MessageBuffer(object):
28 | def __init__(self):
29 | self.waiters = set()
30 | self.cache = []
31 | self.cache_size = 200
32 |
33 | def wait_for_messages(self, cursor=None):
34 | # Construct a Future to return to our caller. This allows
35 | # wait_for_messages to be yielded from a coroutine even though
36 | # it is not a coroutine itself. We will set the result of the
37 | # Future when results are available.
38 | result_future = Future()
39 | if cursor:
40 | new_count = 0
41 | for msg in reversed(self.cache):
42 | if msg["id"] == cursor:
43 | break
44 | new_count += 1
45 | if new_count:
46 | result_future.set_result(self.cache[-new_count:])
47 | return result_future
48 | self.waiters.add(result_future)
49 | return result_future
50 |
51 | def cancel_wait(self, future):
52 | self.waiters.remove(future)
53 | # Set an empty result to unblock any coroutines waiting.
54 | future.set_result([])
55 |
56 | def new_messages(self, messages):
57 | # logging.info("Sending new message to %r listeners", len(self.waiters))
58 | for future in self.waiters:
59 | future.set_result(messages)
60 | self.waiters = set()
61 | self.cache.extend(messages)
62 | if len(self.cache) > self.cache_size:
63 | self.cache = self.cache[-self.cache_size:]
64 |
65 |
66 | record_pool = MessageBuffer()
67 | message_pool = MessageBuffer()
68 |
69 | class MainHandler(RequestHandler):
70 | def get(self):
71 | self.render('index.html', json='/json')
72 |
73 | def post(self):
74 | json = json_decode(self.request.body)
75 | self.render('index.html', json=json)
76 |
77 |
78 | class RecordHandler(RequestHandler):
79 |
80 | def post(self):
81 | global record_cache
82 | json_dict = json_decode(self.request.body)
83 | print(self.request.body)
84 | record_cache = json_dict['cache']
85 | json_dict.pop('cache')
86 | myjson = {
87 | 'id': str(uuid.uuid4()),
88 | 'json': json_dict
89 | }
90 |
91 | record_pool.new_messages([myjson])
92 |
93 |
94 | class PullRecordHandler(RequestHandler):
95 | def get(self):
96 | return
97 |
98 | @gen.coroutine
99 | def post(self):
100 | cursor = self.get_argument("cursor", None)
101 | # Save the future returned by wait_for_messages so we can cancel
102 | # it in wait_for_messages
103 | self.future = record_pool.wait_for_messages(cursor=cursor)
104 | messages = yield self.future
105 | if self.request.connection.stream.closed():
106 | return
107 | self.write(dict(messages=messages))
108 |
109 | def on_connection_close(self):
110 | record_pool.cancel_wait(self.future)
111 |
112 |
113 | class TrainHandler(RequestHandler):
114 | def get(self):
115 | global trained
116 | global start
117 | global p
118 | if not start:
119 | start = True
120 | trained = True
121 | p = multiprocessing.Process(target=start_training)
122 | p.start()
123 | elif trained:
124 | trained = False
125 | elif not trained:
126 | trained = True
127 | self.write(json.dumps(trained))
128 |
129 |
130 | class StatusHandler(RequestHandler):
131 | def get(self):
132 | global trained
133 | status = 'training'
134 | if not trained and not stop:
135 | status = 'pause'
136 | if stop or not start:
137 | status = 'stop'
138 | self.write(status)
139 |
140 |
141 | class StopHandler(RequestHandler):
142 | def get(self):
143 | global stop
144 | global start
145 | global p
146 | stop = True
147 | start = False
148 | if p != None:
149 | p.terminate()
150 |
151 |
152 | class PictureHandler(RequestHandler):
153 | def get(self):
154 | print(self.get_argument('path'))
155 | p = open(self.get_argument('path'), 'rb')
156 | self.write(p.read())
157 | p.close()
158 |
159 |
160 | class InitJSONHandler(RequestHandler):
161 | def get(self):
162 | global record_cache
163 | if record_cache == None:
164 | with open('result.json', 'rb') as f:
165 | self.write(f.read())
166 | else:
167 | self.write(record_cache)
168 |
169 |
170 | class LearningRateHandler(RequestHandler):
171 | def get(self):
172 | global lr
173 | self.write(str(lr))
174 |
175 | def post(self):
176 | global lr
177 | # print(self.get_argument('lr'))
178 | lr = float(self.get_argument('lr'))
179 | print('set learnig rate to {}'.format(lr))
180 |
181 |
182 | class PullMessageHandler(RequestHandler):
183 |
184 | @gen.coroutine
185 | def post(self):
186 | cursor = self.get_argument("cursor", None)
187 | # Save the future returned by wait_for_messages so we can cancel
188 | # it in wait_for_messages
189 | self.future = message_pool.wait_for_messages(cursor=cursor)
190 | messages = yield self.future
191 | if self.request.connection.stream.closed():
192 | return
193 | self.write(dict(messages=messages))
194 |
195 | def on_connection_close(self):
196 | message_pool.cancel_wait(self.future)
197 |
198 |
199 | class SetMessageHandler(RequestHandler):
200 | def post(self):
201 | # global record_cache
202 | json_dict = json_decode(self.request.body)
203 | print(self.request.body)
204 | myjson = {
205 | 'id': str(uuid.uuid4()),
206 | 'json': json_dict
207 | }
208 | message_pool.new_messages([myjson])
209 |
210 |
211 |
212 | settings = {
213 | "static_path": os.path.join(os.path.dirname(__file__), "static")
214 | }
215 |
216 | application = Application([
217 | (r"/", MainHandler),
218 | (r"/json", PullRecordHandler),
219 | (r"/stop", StopHandler),
220 | (r"/record", RecordHandler),
221 | (r"/status", StatusHandler),
222 | (r"/picture", PictureHandler),
223 | (r"/init", InitJSONHandler),
224 | (r"/lr", LearningRateHandler),
225 | (r"/train", TrainHandler),
226 | (r"/setmsg", SetMessageHandler),
227 | (r"/getmsg", PullMessageHandler)
228 | ], **settings)
229 |
230 | if __name__ == "__main__":
231 | print('server start at localhost:8000')
232 | application.listen(8000)
233 | IOLoop.instance().start()
234 |
--------------------------------------------------------------------------------
/requirements-full.txt:
--------------------------------------------------------------------------------
1 | Keras==1.0.6
2 | Pillow==3.0.0
3 | requests==2.10.0
4 | h5py==2.5.0
5 | Theano==0.7.0
6 | tornado==4.4
7 | tensorflow==0.9.0
8 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | Keras==1.0.6
2 | Pillow==3.0.0
3 | requests==2.10.0
4 | h5py==2.5.0
5 | tornado==4.4
6 |
--------------------------------------------------------------------------------
/result.json:
--------------------------------------------------------------------------------
1 | {"output": [[0, "result/0.png"], [1, "result/1.png"], [2, "result/2.png"], [3, "result/3.png"], [4, "result/4.png"], [5, "result/5.png"], [6, "result/6.png"], [7, "result/7.png"], [9, "result/9.png"], [10, "result/10.png"], [11, "result/11.png"], [12, "result/12.png"], [13, "result/13.png"], [14, "result/14.png"], [15, "result/15.png"]], "loss": {"total": [[0, 2871786471424.0], [1, 2848126140416.0], [2, 2824304328704.0], [3, 2787302178816.0], [4, 2728991653888.0], [5, 2667188584448.0], [6, 2557790912512.0], [7, 2466287190016.0], [9, 2378919051264.0], [10, 2291293749248.0], [11, 2202746224640.0], [12, 2113198227456.0], [13, 2023123845120.0], [14, 1933020889088.0], [15, 1843270647808.0]], "content": [[0, 32352552960.0], [1, 32260364288.0], [2, 32087347200.0], [3, 31683610624.0], [4, 32703326208.0], [5, 33826881536.0], [6, 35298365440.0], [7, 36299169792.0], [9, 37217050624.0], [10, 38147252224.0], [11, 39084449792.0], [12, 40074539008.0], [13, 41224269824.0], [14, 42584903680.0], [15, 44183437312.0]], "total variation": [[0, 0.0], [1, 0.0], [2, 0.0], [3, 0.0], [4, 0.0], [5, 0.0], [6, 0.0], [7, 0.0], [9, 0.0], [10, 0.0], [11, 0.0], [12, 0.0], [13, 0.0], [14, 0.0], [15, 0.0]], "style": [[0, 2839433969664.0], [1, 2815865651200.0], [2, 2792216854528.0], [3, 2755618668544.0], [4, 2696288403456.0], [5, 2633361784832.0], [6, 2522492436480.0], [7, 2429988110336.0], [9, 2341701943296.0], [10, 2253146554368.0], [11, 2163661733888.0], [12, 2073123749888.0], [13, 1981899603968.0], [14, 1890435989504.0], [15, 1799087194112.0]]}}
--------------------------------------------------------------------------------
/result/0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/0.png
--------------------------------------------------------------------------------
/result/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/1.png
--------------------------------------------------------------------------------
/result/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/10.png
--------------------------------------------------------------------------------
/result/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/11.png
--------------------------------------------------------------------------------
/result/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/12.png
--------------------------------------------------------------------------------
/result/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/13.png
--------------------------------------------------------------------------------
/result/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/14.png
--------------------------------------------------------------------------------
/result/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/15.png
--------------------------------------------------------------------------------
/result/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/2.png
--------------------------------------------------------------------------------
/result/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/3.png
--------------------------------------------------------------------------------
/result/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/4.png
--------------------------------------------------------------------------------
/result/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/5.png
--------------------------------------------------------------------------------
/result/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/6.png
--------------------------------------------------------------------------------
/result/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/7.png
--------------------------------------------------------------------------------
/result/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/result/9.png
--------------------------------------------------------------------------------
/settings.py:
--------------------------------------------------------------------------------
1 | # dimensions of the generated picture.
2 | img_width = 500
3 | img_height = 500
4 | input_shape = (None, 3, img_width, img_height)
5 | # You can resize the picture later if necessary
6 | assert img_height == img_width, 'Due to the use of the Gram matrix, width and height must match.'
7 |
8 | # where the output should be released
9 | result_dir = "result"
10 |
11 | # The path of content & style image
12 | content_path = 'inputs/content.png'
13 | style_path = 'inputs/style.png'
14 |
15 |
16 | learning_rate = 1.0
17 | # layers which provide us with features
18 | content_feature_layers = ['conv4_2']
19 | style_feature_layers = ['conv1_1', 'conv2_1', 'conv3_1', 'conv4_1', 'conv5_1']
20 |
21 | # these are the weights of the different loss components
22 | loss_set = [('content', 1.0),
23 | ('style', 50.0),
24 | ('total variation', 0.0)]
25 |
--------------------------------------------------------------------------------
/snapshots/1000.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/1000.png
--------------------------------------------------------------------------------
/snapshots/1700.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/1700.png
--------------------------------------------------------------------------------
/snapshots/188.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/188.png
--------------------------------------------------------------------------------
/snapshots/2000.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/2000.png
--------------------------------------------------------------------------------
/snapshots/200x200/2804.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/200x200/2804.png
--------------------------------------------------------------------------------
/snapshots/200x200/overall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/200x200/overall.png
--------------------------------------------------------------------------------
/snapshots/200x200/vc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/200x200/vc.png
--------------------------------------------------------------------------------
/snapshots/287.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/287.png
--------------------------------------------------------------------------------
/snapshots/340.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/340.png
--------------------------------------------------------------------------------
/snapshots/400x400/1005.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/400x400/1005.png
--------------------------------------------------------------------------------
/snapshots/400x400/607.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/400x400/607.png
--------------------------------------------------------------------------------
/snapshots/992.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/992.png
--------------------------------------------------------------------------------
/snapshots/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/default.png
--------------------------------------------------------------------------------
/snapshots/logarithm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/logarithm.png
--------------------------------------------------------------------------------
/snapshots/neural_style_board.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/neural_style_board.png
--------------------------------------------------------------------------------
/snapshots/percent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/percent.png
--------------------------------------------------------------------------------
/snapshots/percent2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/percent2.png
--------------------------------------------------------------------------------
/snapshots/value.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/value.png
--------------------------------------------------------------------------------
/snapshots/very-high-lr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/snapshots/very-high-lr.png
--------------------------------------------------------------------------------
/start_training.py:
--------------------------------------------------------------------------------
1 | """Neural style transfer with Keras.
2 |
3 | # References
4 | - [A Neural Algorithm of Artistic Style](http://arxiv.org/abs/1508.06576)
5 | """
6 |
7 | from __future__ import print_function
8 | from training import Model
9 | from training_record import TrainingRecorder
10 | from img_prep import img_in, img_save, preprocess_image, grey_image
11 | from settings import content_path, style_path, loss_set, result_dir
12 | import requests, time, signal, sys
13 |
14 |
15 | # load content and style image
16 | # record_cache = None
17 | tr = None
18 |
19 |
20 | def signal_term_handler(signal, frame):
21 | global tr
22 | if tr == None:
23 | print('stop training.')
24 | requests.post('http://localhost:8000/setmsg', None,
25 | {'msg': 'stop training.'})
26 | # sys.exit(0)
27 | else:
28 | print('stop training and save weights into json file.')
29 | requests.post('http://localhost:8000/setmsg', None,
30 | {'msg': 'stop training and save weights into json file.'})
31 | tr.export_file()
32 | sys.exit(0)
33 |
34 | signal.signal(signal.SIGTERM, signal_term_handler)
35 |
36 |
37 | def start_training():
38 |
39 | content, style = img_in(content_path, style_path)
40 | global tr
41 | tr = TrainingRecorder(loss_set, result_dir, img_save, '.png')
42 |
43 | idx = tr.get_head() - 1
44 | if idx > 0:
45 | x = preprocess_image(tr.get_name(idx))
46 | else:
47 | x = content
48 |
49 | idx += 1
50 |
51 | model = Model(content, style, x)
52 |
53 | lst_lr = 1.0
54 | try:
55 | for i in range(idx, 10000):
56 | status = requests.get('http://localhost:8000/status').text
57 | lr = float(requests.get('http://localhost:8000/lr').text)
58 | if status == 'pause':
59 | i -= 1
60 | requests.post('http://localhost:8000/setmsg', None,
61 | {'msg': 'pause'})
62 | while True:
63 | time.sleep(1)
64 | status = requests.get('http://localhost:8000/status').text
65 | if status != 'pause':
66 | break
67 | elif status == 'training':
68 | print('Start of iteration', i)
69 | requests.post('http://localhost:8000/setmsg', None, {'msg': 'Start of iteration ' + str(i)})
70 | # msg = 'Start of iteration ' + str(i)
71 | if lst_lr != lr:
72 | # if learning rate has changes, set a new lr for the optimizer
73 | model.set_lr(lr)
74 | loss, result = model.update()
75 | # save current generated image
76 | tr.record(i, loss, result)
77 | lst_lr = lr
78 | elif status == 'stop':
79 | print('stop training and save weights into json file.')
80 | requests.post('http://localhost:8000/setmsg', None,
81 | {'msg': 'stop training and save weights into json file.'})
82 | # msg = 'stop training and save weights into json file.'
83 | tr.export_file()
84 | break
85 |
86 | except KeyboardInterrupt:
87 | print('stop training and save weights into json file.')
88 | requests.post('http://localhost:8000/setmsg', None,
89 | {'msg': 'stop training and save weights into json file.'})
90 | tr.export_file()
91 |
--------------------------------------------------------------------------------
/static/board.js:
--------------------------------------------------------------------------------
1 | var seriesOptions = [],
2 | seriesCounter = 0,
3 | names = ['total', 'style', 'content', 'total variation']; //['MSFT', 'AAPL', 'GOOG'];
4 |
5 |
6 | var outputs = []
7 | var title = {
8 | text: 'neural-style board'
9 | };
10 | var compare = undefined;
11 |
12 | var options = {
13 | title: title,
14 |
15 | subtitle: {
16 |
17 | },
18 |
19 | chart: {
20 | zoomType: 'x'
21 | },
22 |
23 | rangeSelector: {
24 | selected: 4
25 | },
26 |
27 | yAxis: {
28 | //type: 'logarithmic',
29 | labels: {
30 | formatter: function () {
31 | return this.value.toExponential(2) // (this.value > 0 ? ' + ' : '') + this.value + '%';
32 | }
33 | },
34 |
35 | plotLines: [{
36 | value: 0,
37 | width: 2,
38 | color: 'silver'
39 | }]
40 | },
41 |
42 | xAxis: {
43 | //floor : 10,
44 | tickInterval: 1,
45 | labels: {
46 | formatter: function () {
47 | return this.value
48 | }
49 | },
50 | plotLines: [{
51 | value: 0,
52 | width: 2,
53 | color: 'silver'
54 | }]
55 | },
56 |
57 | plotOptions: {
58 | series: {
59 | //compare: 'percent', //'value',undefined
60 | //compare: 'percent',
61 | cursor: 'pointer',
62 | point: {
63 | events: {
64 | click: function (e) {
65 |
66 | hs.htmlExpand(null, {
67 | pageOrigin: {
68 | x: e.pageX || e.clientX,
69 | y: e.pageY || e.clientY
70 | },
71 | headingText: this.series.name + ' loss@' + this.x+'=' + this.y.toExponential(3),
72 | maincontentText: '
' ,
73 | width: 200,
74 | height: 200
75 | });
76 | }
77 | }
78 | },
79 | marker: {
80 | lineWidth: 1
81 | }
82 | }
83 | },
84 |
85 | tooltip: {
86 | shared: true,
87 | crosshairs: true,
88 | pointFormatter: function () {
89 | var change = '';
90 | if (compare === 'percent')
91 | change = '('+this.change.toFixed(2)+'% )';
92 | else if (compare === 'value')
93 | change = '('+this.change.toExponential(3)+')'
94 | return ''+ this.series.name +': '+
95 | this.y.toExponential(3) +change +'
';
96 | },
97 | //pointFormat: '{series.name}: {point.y} ({point.change}%)
',
98 | //valueDecimals: 2
99 | },
100 | series: seriesOptions
101 | }
102 |
103 |
104 |
105 | /**
106 | * Create the chart when all data is loaded
107 | * @returns {undefined}
108 | */
109 | function createChart() {
110 | $('#container').highcharts(options);
111 | }
112 |
113 | /**
114 | TODO: fix the bug in logarithmic view
115 | */
116 | //function toLogarithmic() {
117 | // //options.subtitle.text = 'Logarithmic View';
118 | // options.yAxis.type = 'logarithmic';
119 | // createChart()
120 | // //options.plotOptions.series.compare = undefined;
121 | // //options.tooltip.pointFormatter = function () {
122 | // // return ''+ this.series.name +': '+
123 | // // this.y.toExponential(3) + '
'
124 | // //}
125 | // //createChart();
126 | // var chart = $('#container').highcharts();
127 | // chart.setTitle(title, {'text': 'Logarithmic View'});
128 | // chart.yAxis[0].setCompare('null');
129 | // compare = undefined
130 | //
131 | //}
132 |
133 | function toPercent() {
134 | var chart = $('#container').highcharts();
135 | chart.setTitle(title, {'text': 'Percent compare View'});
136 | chart.yAxis[0].setCompare('percent');
137 | chart.series[3].hide();
138 | compare = 'percent'
139 | }
140 |
141 | function toValue() {
142 | var chart = $('#container').highcharts();
143 | chart.setTitle(title, {'text': 'Value compare View'});
144 | chart.series[3].hide();
145 | chart.yAxis[0].setCompare('value');
146 | compare = 'value'
147 | }
148 |
149 | function toDefault() {
150 | var chart = $('#container').highcharts();
151 | chart.setTitle(title);
152 | chart.series[3].show();
153 | chart.yAxis[0].setCompare('null');
154 | compare = undefined
155 | }
156 |
157 | function loadjson(json) {
158 | $(function () {
159 | $.each(names, function (i, name) {
160 |
161 | //$.getJSON(fname, function(data) {
162 |
163 | seriesOptions[i] = {
164 | name: name,
165 | data: json['loss'][name],
166 | };
167 |
168 | for(var item in json.output)
169 | {
170 | outputs[json.output[item][0]] = json.output[item][1];
171 | }
172 |
173 | // As we're loading the data asynchronously, we don't know what order it will arrive. So
174 | // we keep a counter and create the chart when all the data is loaded.
175 | seriesCounter += 1;
176 |
177 | if (seriesCounter === names.length) {
178 | createChart();
179 | toDefault();
180 | }
181 | //});
182 |
183 | });
184 | });
185 | }
186 |
187 | function getOutputs() {
188 | return outputs;
189 | }
190 |
191 | function setOutputs(output) {
192 | outputs = output;
193 | }
194 |
195 | var updater = {
196 | errorSleepTime: 500,
197 | cursor: null,
198 |
199 | poll: function() {
200 | $.ajax({url: "/json", type: "POST", dataType: "text",
201 | success: updater.onSuccess,
202 | error: updater.onError});
203 | },
204 |
205 | onSuccess: function(response) {
206 | try {
207 | updater.newMessages(eval("(" + response + ")"));
208 | } catch (e) {
209 | updater.onError();
210 | return;
211 | }
212 | updater.errorSleepTime = 500;
213 | window.setTimeout(updater.poll, 0);
214 | },
215 |
216 | onError: function(response) {
217 | updater.errorSleepTime *= 2;
218 | console.log("Poll error; sleeping for", updater.errorSleepTime, "ms");
219 | window.setTimeout(updater.poll, updater.errorSleepTime);
220 | },
221 |
222 | newMessages: function(response) {
223 | if (!response.messages) return;
224 | updater.cursor = response.cursor;
225 | var messages = response.messages;
226 | updater.cursor = messages[messages.length - 1].id;
227 | //console.log(messages.length, "new messages, cursor:", updater.cursor);
228 | for (var i = 0; i < messages.length; i++) {
229 | updater.showMessage(messages[i]);
230 | }
231 | },
232 |
233 | showMessage: function(message) {
234 | var existing = $("#m" + message.id);
235 | if (existing.length > 0) return;
236 | json = message.json;
237 | //console.log(json)
238 | var chart = $('#container').highcharts();
239 | if (json !== undefined) {
240 | chart.series[0].addPoint([json['iter'], json['losses'][0]]);
241 | chart.series[1].addPoint([json['iter'], json['losses'][2]]);
242 | chart.series[2].addPoint([json['iter'], json['losses'][1]]);
243 | chart.series[3].addPoint([json['iter'], json['losses'][3]]);
244 | var outputs = getOutputs();
245 | outputs[json['output'][0]] = json['output'][1];
246 | setOutputs(outputs);
247 | }
248 | }
249 | };
250 |
251 |
--------------------------------------------------------------------------------
/static/highslide.config.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Site-specific configuration settings for Highslide JS
3 | */
4 | hs.graphicsDir = 'https://www.highcharts.com/samples/graphics/highslide/';
5 | hs.outlineType = 'rounded-white';
6 | hs.wrapperClassName = 'draggable-header';
7 | hs.captionEval = 'this.a.title';
8 | hs.showCredits = false;
9 | hs.marginTop = 20;
10 | hs.marginRight = 20;
11 | hs.marginBottom = 20;
12 | hs.marginLeft = 20;
13 | //hs.allowMultipleInstances = false;
--------------------------------------------------------------------------------
/static/highslide/graphics/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/close.png
--------------------------------------------------------------------------------
/static/highslide/graphics/closeX.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/closeX.png
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar-black-border.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-black-border.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar-text-buttons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-text-buttons.png
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar-white-small.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-white-small.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar-white.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar-white.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar2.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar3.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar4-hover.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar4-hover.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/controlbar4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/controlbar4.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/fullexpand.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/fullexpand.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/geckodimmer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/geckodimmer.png
--------------------------------------------------------------------------------
/static/highslide/graphics/icon.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/icon.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/loader.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/loader.white.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/loader.white.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/outlines/Outlines.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/Outlines.psd
--------------------------------------------------------------------------------
/static/highslide/graphics/outlines/beveled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/beveled.png
--------------------------------------------------------------------------------
/static/highslide/graphics/outlines/drop-shadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/drop-shadow.png
--------------------------------------------------------------------------------
/static/highslide/graphics/outlines/glossy-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/glossy-dark.png
--------------------------------------------------------------------------------
/static/highslide/graphics/outlines/outer-glow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/outer-glow.png
--------------------------------------------------------------------------------
/static/highslide/graphics/outlines/rounded-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/rounded-black.png
--------------------------------------------------------------------------------
/static/highslide/graphics/outlines/rounded-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/outlines/rounded-white.png
--------------------------------------------------------------------------------
/static/highslide/graphics/resize.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/resize.gif
--------------------------------------------------------------------------------
/static/highslide/graphics/scrollarrows.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/scrollarrows.png
--------------------------------------------------------------------------------
/static/highslide/graphics/zoomin.cur:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/zoomin.cur
--------------------------------------------------------------------------------
/static/highslide/graphics/zoomout.cur:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/suquark/neural-style-visualizer/ce3eabaff64a625169831169dc097015fc91c756/static/highslide/graphics/zoomout.cur
--------------------------------------------------------------------------------
/static/highslide/highslide-ie6.css:
--------------------------------------------------------------------------------
1 | .closebutton {
2 | /* NOTE! This URL is relative to the HTML page, not the CSS */
3 | filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(
4 | src='../highslide/graphics/close.png', sizingMethod='scale');
5 |
6 | background: none;
7 | cursor: hand;
8 | }
9 |
10 | /* Viewport fixed hack */
11 | .highslide-viewport {
12 | position: absolute;
13 | left: expression( ( ( ignoreMe1 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
14 | top: expression( ( ignoreMe2 = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) + 'px' );
15 | width: expression( ( ( ignoreMe3 = document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) ) + 'px' );
16 | height: expression( ( ( ignoreMe4 = document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) ) + 'px' );
17 | }
18 |
19 | /* Thumbstrip PNG fix */
20 | .highslide-scroll-down, .highslide-scroll-up {
21 | position: relative;
22 | overflow: hidden;
23 | }
24 | .highslide-scroll-down div, .highslide-scroll-up div {
25 | /* NOTE! This URL is relative to the HTML page, not the CSS */
26 | filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(
27 | src='../highslide/graphics/scrollarrows.png', sizingMethod='scale');
28 | background: none !important;
29 | position: absolute;
30 | cursor: hand;
31 | width: 75px;
32 | height: 75px !important;
33 | }
34 | .highslide-thumbstrip-horizontal .highslide-scroll-down div {
35 | left: -50px;
36 | top: -15px;
37 | }
38 | .highslide-thumbstrip-horizontal .highslide-scroll-up div {
39 | top: -15px;
40 | }
41 | .highslide-thumbstrip-vertical .highslide-scroll-down div {
42 | top: -50px;
43 | }
44 |
45 | /* Thumbstrip marker arrow trasparent background fix */
46 | .highslide-thumbstrip .highslide-marker {
47 | border-color: white; /* match the background */
48 | }
49 | .dark .highslide-thumbstrip-horizontal .highslide-marker {
50 | border-color: #111;
51 | }
52 | .highslide-viewport .highslide-marker {
53 | border-color: #333;
54 | }
55 | .highslide-thumbstrip {
56 | float: left;
57 | }
58 |
59 | /* Positioning fixes for the control bar */
60 | .text-controls .highslide-controls {
61 | width: 480px;
62 | }
63 | .text-controls a span {
64 | width: 4em;
65 | }
66 | .text-controls .highslide-full-expand a span {
67 | width: 0;
68 | }
69 | .text-controls .highslide-close a span {
70 | width: 0;
71 | }
72 |
73 | /* Special */
74 | .in-page .highslide-thumbstrip-horizontal .highslide-marker {
75 | border-bottom: gray;
76 | }
77 |
--------------------------------------------------------------------------------
/static/highslide/highslide-with-gallery.packed.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Name: Highslide JS
3 | * Version: 5.0.0 (2016-05-24)
4 | * Config: default +slideshow +positioning +transitions +viewport +thumbstrip +packed
5 | * Author: Torstein Hønsi
6 | * Support: www.highslide.com/support
7 | * License: MIT
8 | */
9 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={18:{9D:\'9t\',9f:\'b6...\',9g:\'8o 1L b7\',9X:\'8o 1L bg 1L bx\',7p:\'bw 1L bl B (f)\',aR:\'bs by 8H 8I\',aY:\'bm 1L bj 8H 8I bv\',8T:\'8C\',8U:\'8D\',8v:\'8E\',8z:\'8J\',8r:\'8J (br)\',bh:\'ba\',8P:\'8G\',8A:\'8G 1g (8B)\',8N:\'8F\',8M:\'8F 1g (8B)\',8S:\'8C (8l 11)\',8O:\'8D (8l 2W)\',8w:\'8E\',8u:\'1:1\',3n:\'b9 %1 b3 %2\',84:\'8o 1L 26 2I, c4 8L c5 1L 3g. c7 8l c0 K 1p 8L 31.\'},4u:\'L/c9/\',5P:\'bX.4J\',5h:\'bH.4J\',7h:54,8n:54,4s:15,9H:15,4n:15,9L:15,4H:bJ,91:0.75,9j:J,7A:5,3G:2,bL:3,59:1f,at:\'42 2W\',aq:1,a3:J,aF:\'bP://L.bQ/\',aE:\'c2\',8V:J,8e:[\'a\'],2X:[],aG:54,3P:0,7G:50,3K:\'2k\',76:\'2k\',8y:H,8x:H,7v:J,4S:8R,5l:8R,5y:J,1B:\'bN-bR\',a7:{2A:\'<7V>\'+\'<1R 2s="L-31">\'+\'\'+\'<23>{m.18.8T}23>\'+\'1R>\'+\'<1R 2s="L-3i">\'+\'\'+\'<23>{m.18.8P}23>\'+\'1R>\'+\'<1R 2s="L-2N">\'+\'\'+\'<23>{m.18.8N}23>\'+\'1R>\'+\'<1R 2s="L-1p">\'+\'\'+\'<23>{m.18.8U}23>\'+\'1R>\'+\'<1R 2s="L-3g">\'+\'\'+\'<23>{m.18.8v}23>\'+\'1R>\'+\'<1R 2s="L-19-2D">\'+\'\'+\'<23>{m.18.8u}23>\'+\'1R>\'+\'<1R 2s="L-26">\'+\'\'+\'<23>{m.18.8z}23>\'+\'1R>\'+\'7V>\'},4O:[],7e:J,V:[],6Q:[\'5y\',\'36\',\'3K\',\'76\',\'8y\',\'8x\',\'1B\',\'3G\',\'bB\',\'bF\',\'bG\',\'8s\',\'bI\',\'bW\',\'ce\',\'8t\',\'aZ\',\'7v\',\'3D\',\'5b\',\'2X\',\'3P\',\'M\',\'1a\',\'7B\',\'4S\',\'5l\',\'6a\',\'73\',\'9i\',\'2t\',\'2r\',\'aS\',\'aD\',\'1G\'],1x:[],4R:0,7q:{x:[\'9G\',\'11\',\'3W\',\'2W\',\'9M\'],y:[\'51\',\'14\',\'8h\',\'42\',\'6H\']},6m:{},8t:{},8s:{},3v:[],5m:[],45:{},7I:{},5D:[],21:R.cd||8p((5w.6C.5H().2K(/.+(?:8Q|cc|ca|2m)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),2m:(R.5r&&!1A.3r),4t:/cf/.1b(5w.6C),5O:/cg.+8Q:1\\.[0-8].+ci/.1b(5w.6C),$:z(1M){q(1M)D R.ch(1M)},2q:z(2o,3k){2o[2o.T]=3k},1c:z(9y,4m,3J,8b,9m){u C=R.1c(9y);q(4m)m.3a(C,4m);q(9m)m.W(C,{bZ:0,aL:\'1F\',74:0});q(3J)m.W(C,3J);q(8b)8b.2E(C);D C},3a:z(C,4m){K(u x 2Q 4m)C[x]=4m[x];D C},W:z(C,3J){K(u x 2Q 3J){q(m.44&&x==\'1n\'){q(3J[x]>0.99)C.G.c3(\'5A\');I C.G.5A=\'9o(1n=\'+(3J[x]*28)+\')\'}I C.G[x]=3J[x]}},2b:z(C,X,30){u 43,4A,49;q(1q 30!=\'61\'||30===H){u 2Z=9Q;30={3I:2Z[2],2r:2Z[3],6f:2Z[4]}}q(1q 30.3I!=\'3n\')30.3I=54;30.2r=1d[30.2r]||1d.93;30.5J=m.3a({},X);K(u 35 2Q X){u e=24 m.1E(C,30,35);43=8p(m.7U(C,35))||0;4A=8p(X[35]);49=35!=\'1n\'?\'F\':\'\';e.3F(43,4A,49)}},7U:z(C,X){q(C.G[X]){D C.G[X]}I q(R.6O){D R.6O.9P(C,H).9V(X)}I{q(X==\'1n\')X=\'5A\';u 3k=C.ck[X.2j(/\\-(\\w)/g,z(a,b){D b.92()})];q(X==\'5A\')3k=3k.2j(/9o\\(1n=([0-9]+)\\)/,z(a,b){D b/28});D 3k===\'\'?1:3k}},6D:z(){u d=R,w=1A,4T=d.6z&&d.6z!=\'7P\'?d.4k:d.3y,44=m.2m&&(m.21<9||1q 9l==\'1C\');u M=44?4T.8m:(d.4k.8m||5Z.bc),1a=44?4T.aK:5Z.bd;m.41={M:M,1a:1a,5d:44?4T.5d:9l,5u:44?4T.5u:b5};D m.41},6E:z(C){u p={x:C.4d,y:C.9h};4o(C.9k){C=C.9k;p.x+=C.4d;p.y+=C.9h;q(C!=R.3y&&C!=R.4k){p.x-=C.5d;p.y-=C.5u}}D p},2D:z(a,2S,3F,S){q(!a)a=m.1c(\'a\',H,{1u:\'1F\'},m.22);q(1q a.52==\'z\')D 2S;2d{24 m.56(a,2S,3F);D 1f}1W(e){D J}},a6:z(C,4G,U){u 1i=C.2J(4G);K(u i=0;i<1i.T;i++){q((24 5I(U)).1b(1i[i].U)){D 1i[i]}}D H},a9:z(s){s=s.2j(/\\s/g,\' \');u 1T=/{m\\.18\\.([^}]+)\\}/g,58=s.2K(1T),18;q(58)K(u i=0;i<58.T;i++){18=58[i].2j(1T,"$1");q(1q m.18[18]!=\'1C\')s=s.2j(58[i],m.18[18])}D s},9w:z(){u 7J=0,6y=-1,V=m.V,A,1r;K(u i=0;i7J){7J=1r;6y=i}}}q(6y==-1)m.3w=-1;I V[6y].4b()},4Z:z(a,55){a.52=a.2F;u p=a.52?a.52():H;a.52=H;D(p&&1q p[55]!=\'1C\')?p[55]:(1q m[55]!=\'1C\'?m[55]:H)},78:z(a){u 1G=m.4Z(a,\'1G\');q(1G)D 1G;D a.1Y},4N:z(1M){u 3x=m.$(1M),47=m.7I[1M],a={};q(!3x&&!47)D H;q(!47){47=3x.77(J);47.1M=\'\';m.7I[1M]=47;D 3x}I{D 47.77(J)}},3H:z(d){q(d)m.8j.2E(d);m.8j.2T=\'\'},1m:z(A){q(!m.2a){7E=J;m.2a=m.1c(\'Z\',{U:\'L-bp L-1Z-B\',4E:\'\',2F:z(){m.26()}},{1e:\'1D\',1n:0},m.22,J);q(/(bk|bi|bo|bn)/.1b(5w.6C)){u 3y=R.3y;z 7H(){m.W(m.2a,{M:3y.bq+\'F\',1a:3y.bu+\'F\'})}7H();m.1Q(1A,\'3O\',7H)}}m.2a.G.1u=\'\';u 7E=m.2a.4E==\'\';m.2a.4E+=\'|\'+A.P;q(7E){q(m.5O&&m.9q)m.W(m.2a,{9e:\'5W(\'+m.4u+\'b4.97)\',1n:1});I m.2b(m.2a,{1n:A.3P},m.7G)}},7Q:z(P){q(!m.2a)D;q(1q P!=\'1C\')m.2a.4E=m.2a.4E.2j(\'|\'+P,\'\');q((1q P!=\'1C\'&&m.2a.4E!=\'\')||(m.1U&&m.4Z(m.1U,\'3P\')))D;q(m.5O&&m.9q)m.2a.G.1u=\'1F\';I m.2b(m.2a,{1n:0},m.7G,H,z(){m.2a.G.1u=\'1F\'})},83:z(6i,A){u Y=A||m.2h();A=Y;q(m.1U)D 1f;I m.Y=Y;m.3U(R,1A.3r?\'5X\':\'5Y\',m.5t);2d{m.1U=6i;6i.2F()}1W(e){m.Y=m.1U=H}2d{q(!6i||A.2X[1]!=\'4i\')A.26()}1W(e){}D 1f},6g:z(C,1P){u A=m.2h(C);q(A)D m.83(A.6Y(1P),A);I D 1f},31:z(C){D m.6g(C,-1)},1p:z(C){D m.6g(C,1)},5t:z(e){q(!e)e=1A.29;q(!e.2i)e.2i=e.7l;q(1q e.2i.9x!=\'1C\')D J;u A=m.2h();u 1P=H;8Y(e.bK){1I 70:q(A)A.6q();D J;1I 32:1P=2;4P;1I 34:1I 39:1I 40:1P=1;4P;1I 8:1I 33:1I 37:1I 38:1P=-1;4P;1I 27:1I 13:1P=0}q(1P!==H){q(1P!=2)m.3U(R,1A.3r?\'5X\':\'5Y\',m.5t);q(!m.8V)D J;q(e.4F)e.4F();I e.9W=1f;q(A){q(1P==0){A.26()}I q(1P==2){q(A.1g)A.1g.ac()}I{q(A.1g)A.1g.2N();m.6g(A.P,1P)}D 1f}}D J},d1:z(O){m.2q(m.1x,m.3a(O,{1H:\'1H\'+m.4R++}))},cW:z(1h){u 2C=1h.2t;q(1q 2C==\'61\'){K(u i=0;i<2C.T;i++){u o={};K(u x 2Q 1h)o[x]=1h[x];o.2t=2C[i];m.2q(m.5m,o)}}I{m.2q(m.5m,1h)}},86:z(7N,6e){u C,1T=/^L-Q-([0-9]+)$/;C=7N;4o(C.1O){q(C.5B!==1C)D C.5B;q(C.1M&&1T.1b(C.1M))D C.1M.2j(1T,"$1");C=C.1O}q(!6e){C=7N;4o(C.1O){q(C.4G&&m.5U(C)){K(u P=0;P1)D J;q(!e.2i)e.2i=e.7l;u C=e.2i;4o(C.1O&&!(/L-(2I|3g|5S|3O)/.1b(C.U))){C=C.1O}u A=m.2h(C);q(A&&(A.8c||!A.5e))D J;q(A&&e.S==\'aB\'){q(e.2i.9x)D J;u 2K=C.U.2K(/L-(2I|3g|3O)/);q(2K){m.2R={A:A,S:2K[1],11:A.x.E,M:A.x.B,14:A.y.E,1a:A.y.B,9v:e.6d,9u:e.66};m.1Q(R,\'6o\',m.5T);q(e.4F)e.4F();q(/L-(2I|5S)-89/.1b(A.17.U)){A.4b();m.7R=J}D 1f}}I q(e.S==\'aA\'){m.3U(R,\'6o\',m.5T);q(m.2R){q(m.4C&&m.2R.S==\'2I\')m.2R.A.17.G.4c=m.4C;u 3z=m.2R.3z;q(!3z&&!m.7R&&!/(3g|3O)/.1b(m.2R.S)){A.26()}I q(3z||(!3z&&m.cY)){m.2R.A.5f(\'1s\')}m.7R=1f;m.2R=H}I q(/L-2I-89/.1b(C.U)){C.G.4c=m.4C}}D 1f},5T:z(e){q(!m.2R)D J;q(!e)e=1A.29;u a=m.2R,A=a.A;a.5K=e.6d-a.9v;a.7o=e.66-a.9u;u 7s=1d.cl(1d.9r(a.5K,2)+1d.9r(a.7o,2));q(!a.3z)a.3z=(a.S!=\'2I\'&&7s>0)||(7s>(m.da||5));q(a.3z&&e.6d>5&&e.66>5){q(a.S==\'3O\')A.3O(a);I{A.7C(a.11+a.5K,a.14+a.7o);q(a.S==\'2I\')A.17.G.4c=\'3g\'}}D 1f},9n:z(e){2d{q(!e)e=1A.29;u 6p=/di/i.1b(e.S);q(!e.2i)e.2i=e.7l;q(!e.69)e.69=6p?e.do:e.dm;u A=m.2h(e.2i);q(!A.5e)D;q(!A||!e.69||m.2h(e.69,J)==A||m.2R)D;K(u i=0;i=k.1h.3I+k.80){k.4a=k.4A;k.E=k.7X=1;k.85();k.1h.5J[k.X]=J;u 8d=J;K(u i 2Q k.1h.5J)q(k.1h.5J[i]!==J)8d=1f;q(8d){q(k.1h.6f)k.1h.6f.95(k.2G)}D 1f}I{u n=t-k.80;k.7X=n/k.1h.3I;k.E=k.1h.2r(n,0,1,k.1h.3I);k.4a=k.43+((k.4A-k.43)*k.E);k.85()}D J}};m.3a(m.1E,{3l:{1n:z(1E){m.W(1E.2G,{1n:1E.4a})},96:z(1E){2d{q(1E.2G.G&&1E.2G.G[1E.X]!=H)1E.2G.G[1E.X]=1E.4a+1E.49;I 1E.2G[1E.X]=1E.4a}1W(e){}}}});m.5q=z(1B,3Y){k.3Y=3Y;k.1B=1B;u v=m.21,3M;k.7j=m.2m&&m.21<7;q(!1B){q(3Y)3Y();D}m.7c();k.1V=m.1c(\'1V\',{cP:0},{1e:\'1s\',1j:\'2v\',cR:\'cL\',M:0},m.22,J);u 3S=m.1c(\'3S\',H,H,k.1V,1);k.2e=[];K(u i=0;i<=8;i++){q(i%3==0)3M=m.1c(\'3M\',H,{1a:\'2k\'},3S,J);k.2e[i]=m.1c(\'2e\',H,H,3M,J);u G=i!=4?{cK:0,cF:0}:{1j:\'8i\'};m.W(k.2e[i],G)}k.2e[4].U=1B+\' L-16\';k.98()};m.5q.5s={98:z(){u 1G=m.4u+(m.cE||"cD/")+k.1B+".97";u 9a=m.4t&&m.21<6B?m.22:H;k.3f=m.1c(\'1y\',H,{1j:\'2v\',14:\'-4W\'},9a,J);u 7T=k;k.3f.6A=z(){7T.9b()};k.3f.1G=1G},9b:z(){u o=k.1k=k.3f.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1m={1a:(2*o)+\'F\',M:(2*o)+\'F\'};K(u i=0;i<=8;i++){q(E[i]){q(k.7j){u w=(i==1||i==7)?\'28%\':k.3f.M+\'F\';u Z=m.1c(\'Z\',H,{M:\'28%\',1a:\'28%\',1j:\'8i\',3c:\'1s\'},k.2e[i],J);m.1c(\'Z\',H,{5A:"cJ:cn.cv.cw(cS=dk, 1G=\'"+k.3f.1G+"\')",1j:\'2v\',M:w,1a:k.3f.1a+\'F\',11:(E[i][0]*o)+\'F\',14:(E[i][1]*o)+\'F\'},Z,J)}I{m.W(k.2e[i],{9e:\'5W(\'+k.3f.1G+\') \'+(E[i][0]*o)+\'F \'+(E[i][1]*o)+\'F\'})}q(1A.3r&&(i==3||i==5))m.1c(\'Z\',H,1m,k.2e[i],J);m.W(k.2e[i],1m)}}k.3f=H;q(m.45[k.1B])m.45[k.1B].5j();m.45[k.1B]=k;q(k.3Y)k.3Y()},4g:z(E,1k,9d,3t,2r){u A=k.A,dp=A.Q.G,1k=1k||0,E=E||{x:A.x.E+1k,y:A.y.E+1k,w:A.x.N(\'1N\')-2*1k,h:A.y.N(\'1N\')-2*1k};q(9d)k.1V.G.1e=(E.h>=4*k.1k)?\'1D\':\'1s\';m.W(k.1V,{11:(E.x-k.1k)+\'F\',14:(E.y-k.1k)+\'F\',M:(E.w+2*k.1k)+\'F\'});E.w-=2*k.1k;E.h-=2*k.1k;m.W(k.2e[4],{M:E.w>=0?E.w+\'F\':0,1a:E.h>=0?E.h+\'F\':0});q(k.7j)k.2e[3].G.1a=k.2e[5].G.1a=k.2e[4].G.1a},5j:z(9c){q(9c)k.1V.G.1e=\'1s\';I m.3H(k.1V)}};m.68=z(A,1m){k.A=A;k.1m=1m;k.3o=1m==\'x\'?\'au\':\'ao\';k.3A=k.3o.5H();k.5i=1m==\'x\'?\'ag\':\'ab\';k.6s=k.5i.5H();k.71=1m==\'x\'?\'a4\':\'ah\';k.90=k.71.5H();k.1o=k.2z=0};m.68.5s={N:z(P){8Y(P){1I\'6U\':D k.1K+k.3p+(k.t-m.1S[\'1k\'+k.3o])/2;1I\'6J\':D k.E+k.cb+k.1o+(k.B-m.1S[\'1k\'+k.3o])/2;1I\'1N\':D k.B+2*k.cb+k.1o+k.2z;1I\'4r\':D k.3X-k.2O-k.3V;1I\'6V\':D k.N(\'4r\')-2*k.cb-k.1o-k.2z;1I\'53\':D k.E-(k.A.16?k.A.16.1k:0);1I\'7M\':D k.N(\'1N\')+(k.A.16?2*k.A.16.1k:0);1I\'2f\':D k.1z?1d.2y((k.B-k.1z)/2):0}},7f:z(){k.cb=(k.A.17[\'1k\'+k.3o]-k.t)/2;k.3V=m[\'74\'+k.71]},72:z(){k.t=k.A.C[k.3A]?7L(k.A.C[k.3A]):k.A.C[\'1k\'+k.3o];k.1K=k.A.1K[k.1m];k.3p=(k.A.C[\'1k\'+k.3o]-k.t)/2;q(k.1K==0||k.1K==-1){k.1K=(m.41[k.3A]/2)+m.41[\'1J\'+k.5i]}},6S:z(){u A=k.A;k.2p=\'2k\';q(A.76==\'3W\')k.2p=\'3W\';I q(24 5I(k.6s).1b(A.3K))k.2p=H;I q(24 5I(k.90).1b(A.3K))k.2p=\'5n\';k.E=k.1K-k.cb+k.3p;q(k.73&&k.1m==\'x\')A.6a=1d.2Y(A.6a||k.19,A.73*k.19/A.y.19);k.B=1d.2Y(k.19,A[\'5n\'+k.3o]||k.19);k.2n=A.5y?1d.2Y(A[\'2Y\'+k.3o],k.19):k.19;q(A.3B&&A.36){k.B=A[k.3A];k.1z=k.19}q(k.1m==\'x\'&&m.59)k.2n=A.4S;k.2i=A[\'2i\'+k.1m.92()];k.2O=m[\'74\'+k.5i];k.1J=m.41[\'1J\'+k.5i];k.3X=m.41[k.3A]},82:z(i){u A=k.A;q(A.3B&&(A.36||m.59)){k.1z=i;k.B=1d.5n(k.B,k.1z);A.17.G[k.6s]=k.N(\'2f\')+\'F\'}I k.B=i;A.17.G[k.3A]=i+\'F\';A.Q.G[k.3A]=k.N(\'1N\')+\'F\';q(A.16)A.16.4g();q(k.1m==\'x\'&&A.1l)A.4j(J);q(k.1m==\'x\'&&A.1g&&A.3B){q(i==k.19)A.1g.4B(\'19-2D\');I A.1g.3Z(\'19-2D\')}},7Z:z(i){k.E=i;k.A.Q.G[k.6s]=i+\'F\';q(k.A.16)k.A.16.4g()}};m.56=z(a,2S,3F,2P){q(R.cG&&m.2m&&!m.7i){m.1Q(R,\'3u\',z(){24 m.56(a,2S,3F,2P)});D}k.a=a;k.3F=3F;k.2P=2P||\'2I\';k.3B=!k.cQ;m.7e=1f;k.1x=[];k.Y=m.Y;m.Y=H;m.7c();u P=k.P=m.V.T;K(u i=0;ip.1J+p.3X-p.3V)p.E=p.1J+p.3X-p.B-p.2O-p.3V-p.1o-p.2z;q(p.E(k.x.1z||k.x.B)){k.ap();q(k.1x.T==1)k.4j()}}k.b1()}1W(e){k.7D(e)}},2p:z(p,4w){u 46,2l=p.2i,1m=p==k.x?\'x\':\'y\';q(2l&&2l.2K(/ /)){46=2l.d3(\' \');2l=46[0]}q(2l&&m.$(2l)){p.E=m.6E(m.$(2l))[1m];q(46&&46[1]&&46[1].2K(/^[-]?[0-9]+F$/))p.E+=7L(46[1]);q(p.Bp.1J+p.3X-p.3V){q(!4w&&7a&&4K){p.B=1d.2Y(p.B,p.N(1m==\'y\'?\'4r\':\'6V\'))}I q(p.N(\'1N\')2x){ 2B=3b*2x;q(2Bk.5l&&x.B>k.4S&&y.N(\'1N\')>y.N(\'4r\')){y.B-=10;q(2x)x.B=y.B*2x;k.4j(0,1);3e=J}}D 3e},b1:z(){u x=k.x,y=k.y;k.5f(\'1s\');q(k.1g&&k.1g.2g)k.1g.2g.4z();k.8f(1,{Q:{M:x.N(\'1N\'),1a:y.N(\'1N\'),11:x.E,14:y.E},17:{11:x.1o+x.N(\'2f\'),14:y.1o+y.N(\'2f\'),M:x.1z||x.B,1a:y.1z||y.B}},m.7h)},8f:z(1t,1L,3t){u 5p=k.2X,6I=1t?(k.Y?k.Y.a:H):m.1U,t=(5p[1]&&6I&&m.4Z(6I,\'2X\')[1]==5p[1])?5p[1]:5p[0];q(k[t]&&t!=\'2D\'){k[t](1t,1L);D}q(k.16&&!k.3G){q(1t)k.16.4g();I k.16.5j()}q(!1t)k.6l();u A=k,x=A.x,y=A.y,2r=k.2r;q(!1t)2r=k.aS||2r;u ay=1t?z(){q(A.16)A.16.1V.G.1e="1D";4q(z(){A.6n()},50)}:z(){A.5g()};q(1t)m.W(k.Q,{M:x.t+\'F\',1a:y.t+\'F\'});q(k.aD){m.W(k.Q,{1n:1t?0:1});m.3a(1L.Q,{1n:1t})}m.2b(k.Q,1L.Q,{3I:3t,2r:2r,3l:z(3k,2Z){q(A.16&&A.3G&&2Z.X==\'14\'){u 5o=1t?2Z.E:1-2Z.E;u E={w:x.t+(x.N(\'1N\')-x.t)*5o,h:y.t+(y.N(\'1N\')-y.t)*5o,x:x.1K+(x.E-x.1K)*5o,y:y.1K+(y.E-y.1K)*5o};A.16.4g(E,0,1)}}});m.2b(k.17,1L.17,3t,2r,ay);q(1t){k.Q.G.1e=\'1D\';k.17.G.1e=\'1D\';k.a.U+=\' L-48-3K\'}},4U:z(1t,1L){k.3G=1f;u A=k,t=1t?m.7h:0;q(1t){m.2b(k.Q,1L.Q,0);m.W(k.Q,{1n:0,1e:\'1D\'});m.2b(k.17,1L.17,0);k.17.G.1e=\'1D\';m.2b(k.Q,{1n:1},t,H,z(){A.6n()})}q(k.16){k.16.1V.G.1r=k.Q.G.1r;u 5R=1t||-1,1k=k.16.1k,6R=1t?3:1k,6K=1t?1k:3;K(u i=6R;5R*i<=5R*6K;i+=5R,t+=25){(z(){u o=1t?6K-i:6R-i;4q(z(){A.16.4g(0,o,1)},t)})()}}q(1t){}I{4q(z(){q(A.16)A.16.5j(A.cm);A.6l();m.2b(A.Q,{1n:0},m.8n,H,z(){A.5g()})},t)}},4i:z(1t,1L,7b){q(!1t)D;u A=k,Y=k.Y,x=k.x,y=k.y,2V=Y.x,2U=Y.y,Q=k.Q,17=k.17,1l=k.1l;m.3U(R,\'6o\',m.5T);m.W(17,{M:(x.1z||x.B)+\'F\',1a:(y.1z||y.B)+\'F\'});q(1l)1l.G.3c=\'1D\';k.16=Y.16;q(k.16)k.16.A=A;Y.16=H;u 4x=m.1c(\'Z\',{U:\'L-\'+k.2P},{1j:\'2v\',1r:4,3c:\'1s\',1u:\'1F\'});u 64={aN:Y,aQ:k};K(u n 2Q 64){k[n]=64[n].17.77(!64[n].cq);m.W(k[n],{1j:\'2v\',aL:0,1e:\'1D\'});4x.2E(k[n])}Q.2E(4x);q(1l){1l.U=\'\';Q.2E(1l)}4x.G.1u=\'\';Y.17.G.1u=\'1F\';q(m.4t&&m.21<6B){k.Q.G.1e=\'1D\'}m.2b(Q,{M:x.B},{3I:m.aG,3l:z(3k,2Z){u E=2Z.E,4f=1-E;u X,B={},6P=[\'E\',\'B\',\'1o\',\'2z\'];K(u n 2Q 6P){X=6P[n];B[\'x\'+X]=1d.2y(4f*2V[X]+E*x[X]);B[\'y\'+X]=1d.2y(4f*2U[X]+E*y[X]);B.aJ=1d.2y(4f*(2V.1z||2V.B)+E*(x.1z||x.B));B.65=1d.2y(4f*2V.N(\'2f\')+E*x.N(\'2f\'));B.aM=1d.2y(4f*(2U.1z||2U.B)+E*(y.1z||y.B));B.6G=1d.2y(4f*2U.N(\'2f\')+E*y.N(\'2f\'))}q(A.16)A.16.4g({x:B.2H,y:B.2L,w:B.4V+B.3s+B.6L+2*x.cb,h:B.4X+B.3C+B.6T+2*y.cb});Y.Q.G.cB=\'cC(\'+(B.2L-2U.E)+\'F, \'+(B.4V+B.3s+B.6L+B.2H+2*2V.cb-2V.E)+\'F, \'+(B.4X+B.3C+B.6T+B.2L+2*2U.cb-2U.E)+\'F, \'+(B.2H-2V.E)+\'F)\';m.W(17,{14:(B.3C+y.N(\'2f\'))+\'F\',11:(B.3s+x.N(\'2f\'))+\'F\',4n:(y.E-B.2L)+\'F\',4s:(x.E-B.2H)+\'F\'});m.W(Q,{14:B.2L+\'F\',11:B.2H+\'F\',M:(B.3s+B.6L+B.4V+2*x.cb)+\'F\',1a:(B.3C+B.6T+B.4X+2*y.cb)+\'F\'});m.W(4x,{M:(B.aJ||B.4V)+\'F\',1a:(B.aM||B.4X)+\'F\',11:(B.3s+B.65)+\'F\',14:(B.3C+B.6G)+\'F\',1e:\'1D\'});m.W(A.aN,{14:(2U.E-B.2L+2U.1o-B.3C+2U.N(\'2f\')-B.6G)+\'F\',11:(2V.E-B.2H+2V.1o-B.3s+2V.N(\'2f\')-B.65)+\'F\'});m.W(A.aQ,{1n:E,14:(y.E-B.2L+y.1o-B.3C+y.N(\'2f\')-B.6G)+\'F\',11:(x.E-B.2H+x.1o-B.3s+x.N(\'2f\')-B.65)+\'F\'});q(1l)m.W(1l,{M:B.4V+\'F\',1a:B.4X+\'F\',11:(B.3s+x.cb)+\'F\',14:(B.3C+y.cb)+\'F\'})},6f:z(){Q.G.1e=17.G.1e=\'1D\';17.G.1u=\'4D\';m.3H(4x);A.6n();Y.5g();A.Y=H}})},9N:z(o,C){q(!k.Y)D 1f;K(u i=0;i\'+s+\'\'+k[k.5b].2T}}},aH:z(){q(!k.Y){K(u i=0;ik.x.N(\'53\')+k.x.N(\'7M\'));u a0=(3h.y+3h.hk.y.N(\'53\')+k.y.N(\'7M\'))}u 5M=m.86(1i[i]);q(!a1&&!a0&&5M!=k.P){q(!2u){1i[i].4M(\'1s-by\',\'[\'+k.P+\']\');1i[i].88=1i[i].G[X];1i[i].G[X]=\'1s\'}I q(2u.9Z(\'[\'+k.P+\']\')==-1){1i[i].4M(\'1s-by\',2u+\'[\'+k.P+\']\')}}I q((2u==\'[\'+k.P+\']\'||m.3w==5M)&&5M!=k.P){1i[i].4M(\'1s-by\',\'\');1i[i].G[X]=1i[i].88||\'\'}I q(2u&&2u.9Z(\'[\'+k.P+\']\')>-1){1i[i].4M(\'1s-by\',2u.2j(\'[\'+k.P+\']\',\'\'))}}}}},4b:z(){k.Q.G.1r=m.4H+=2;K(u i=0;iO.1O.2c)O.G.M=\'28%\'}I q(O.1O!=k.1l)k.1l.2E(O);q(/11$/.1b(p))O.G.11=5E+\'F\';q(/3W$/.1b(p))m.W(O,{11:\'50%\',4s:(5E-1d.2y(O.2c/2))+\'F\'});q(/2W$/.1b(p))O.G.2W=-5E+\'F\';q(/^9G$/.1b(p)){m.W(O,{2W:\'28%\',9H:k.x.cb+\'F\',14:-k.y.cb+\'F\',42:-k.y.cb+\'F\',3c:\'2k\'});k.x.1o=O.2c}I q(/^9M$/.1b(p)){m.W(O,{11:\'28%\',4s:k.x.cb+\'F\',14:-k.y.cb+\'F\',42:-k.y.cb+\'F\',3c:\'2k\'});k.x.2z=O.2c}u 8g=O.1O.3j;O.G.1a=\'2k\';q(4y&&O.3j>8g)O.G.1a=m.3E?8g+\'F\':\'28%\';q(/^14/.1b(p))O.G.14=5C+\'F\';q(/^8h/.1b(p))m.W(O,{14:\'50%\',4n:(5C-1d.2y(O.3j/2))+\'F\'});q(/^42/.1b(p))O.G.42=-5C+\'F\';q(/^51$/.1b(p)){m.W(O,{11:(-k.x.1o-k.x.cb)+\'F\',2W:(-k.x.2z-k.x.cb)+\'F\',42:\'28%\',9L:k.y.cb+\'F\',M:\'2k\'});k.y.1o=O.3j}I q(/^6H$/.1b(p)){m.W(O,{1j:\'8i\',11:(-k.x.1o-k.x.cb)+\'F\',2W:(-k.x.2z-k.x.cb)+\'F\',14:\'28%\',4n:k.y.cb+\'F\',M:\'2k\'});k.y.2z=O.3j;O.G.1j=\'2v\'}},9I:z(){k.9J([\'6x\',\'dh\'],J);k.a2();q(k.6x&&k.7v)k.6x.U+=\' L-3g\';q(m.a3)k.an();K(u i=0;i0)4I=0;q(2w>0)2w=0;q(2w<4I)2w=4I}I{K(u j=0;j0?as[i-1].1O[4d]:3L[4d],7x=3L[4d]+3L[2c]+(as[i+1]?as[i+1].1O[2c]:0);q(7x>6u-4L)2w=6u-7x;I q(7F<-4L)2w=-7F}u 7r=3L[4d]+(3L[2c]-63[2c])/2+2w;m.2b(1V,3q?{11:2w}:{14:2w},H,\'7n\');m.2b(63,3q?{11:7r}:{14:7r},H,\'7n\');7Y.G.1u=2w<0?\'4D\':\'1F\';8a.G.1u=(2w>4I)?\'4D\':\'1F\'};u 5c=m.3T.2M[m.V[1g.3N].2t||\'1F\'],1h=1g.2g,4v=1h.4v||\'ak\',81=(4v==\'bz\'),3Q=81?[\'Z\',\'7V\',\'1R\',\'23\']:[\'1V\',\'3S\',\'3M\',\'2e\'],3q=(4v==\'ak\'),3R=m.1c(\'Z\',{U:\'L-2g L-2g-\'+4v,2T:\'\'+\'<\'+3Q[0]+\'><\'+3Q[1]+\'>\'+3Q[1]+\'>\'+3Q[0]+\'>\'+\'\'+\'\'+\'\'},{1u:\'1F\'},m.22),5z=3R.6b,Z=5z[0],7Y=5z[1],8a=5z[2],63=5z[3],1V=Z.bb,3S=3R.2J(3Q[1])[0],3M;K(u i=0;i<5c.T;i++){q(i==0||!3q)3M=m.1c(3Q[2],H,H,3S);(z(){u a=5c[i],3L=m.1c(3Q[3],H,H,3M),c6=i;m.1c(\'a\',{1Y:a.1Y,1X:a.1X,2F:z(){q(/L-48-3K/.1b(k.U))D 1f;m.2h(k).4b();D m.83(a)},2T:m.9K?m.9K(a):a.2T},H,3L)})()}q(!81){7Y.2F=z(){1J(-1)};8a.2F=z(){1J(1)};m.1Q(3S,R.bA!==1C?\'bY\':\'c8\',z(e){u 3d=0;e=e||1A.29;q(e.9F){3d=e.9F/cj;q(m.3r)3d=-3d}I q(e.9O){3d=-e.9O/3}q(3d)1J(-3d*0.2);q(e.4F)e.4F();e.9W=1f})}D{6c:6c,4z:4z}};m.5L=m.18;u bC=m.56;q(m.2m&&1A==1A.14){(z(){2d{R.4k.bD(\'11\')}1W(e){4q(9Q.bE,50);D}m.3u()})()}m.1Q(R,\'bM\',m.3u);m.1Q(1A,\'az\',m.3u);m.1Q(R,\'3u\',z(){q(m.5P||m.3P){u G=m.1c(\'G\',{S:\'bT/7U\'},H,R.2J(\'bU\')[0]),8k=R.6z==\'7P\';z 5k(7w,7W){q(m.2m&&(m.21<9||8k)){u Y=R.9S[R.9S.T-1];q(1q(Y.5k)=="61")Y.5k(7w,7W)}I{G.2E(R.bV(7w+" {"+7W+"}"))}}z 5x(X){D\'bS( ( ( bO = R.4k.\'+X+\' ? R.4k.\'+X+\' : R.3y.\'+X+\' ) ) + \\\'F\\\' );\'}q(m.5P)5k(\'.L 1y\',\'4c: 5W(\'+m.4u+m.5P+\'), 5F !c1;\');5k(\'.L-1Z-B\',m.2m&&(m.21<7||8k)?\'1j: 2v; \'+\'11:\'+5x(\'5d\')+\'14:\'+5x(\'5u\')+\'M:\'+5x(\'8m\')+\'1a:\'+5x(\'aK\'):\'1j: be; M: 28%; 1a: 28%; 11: 0; 14: 0\')}});m.1Q(1A,\'3O\',z(){m.6D();q(m.1Z)K(u i=0;i35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1e:{77:\'9f\',8z:\'cp...\',92:\'7e 2d cB\',9r:\'7e 2d cD 2d bY\',9Z:\'bX 2d bV G (f)\',9G:\'cF by 8d 8j\',9K:\'d5 2d d7 8d 8j dg\',8A:\'8o\',8Z:\'9h\',96:\'93\',9e:\'8u\',97:\'8u (dj)\',9c:\'de\',d2:\'8k\',d3:\'8k 8s (8h)\',cO:\'8v\',bS:\'8v 8s (8h)\',91:\'8o (7o 1f)\',8Y:\'9h (7o 2H)\',90:\'93\',aO:\'1:1\',7B:\'7e 2d 2a 2E, aP 94 aL 2d 3z. aK 7o aJ Y 1L 94 5I.\'},4D:\'U/aH/\',5V:\'bE.6y\',52:\'bQ.6y\',6N:6d,a6:6d,4j:15,6B:15,3F:15,6h:15,3Y:bu,8g:0.75,6o:J,7D:5,3k:2,aR:3,58:1m,a0:\'3S 2H\',9V:1,a2:J,9F:\'b9://U.b3/\',ah:\'aX\',8U:J,87:[\'a\'],5h:1m,5n:J,4g:J,2S:\'57\',6L:J,7M:J,3E:95,4F:95,53:J,1y:\'aY-aZ\',8L:{8S:\'<1h 3s="U-b1"><9d>\'+\'<3m 3s="U-5I">\'+\'\'+\'<2o>{m.1e.8A}2o>\'+\'3m>\'+\'<3m 3s="U-1L">\'+\'\'+\'<2o>{m.1e.8Z}2o>\'+\'3m>\'+\'<3m 3s="U-3z">\'+\'\'+\'<2o>{m.1e.96}2o>\'+\'3m>\'+\'<3m 3s="U-2a">\'+\'\'+\'<2o>{m.1e.9e}2o>\'+\'3m>\'+\'9d>1h>\'+\'<1h 3s="U-V">1h>\'+\'<1h 3s="U-b8"><1h>\'+\'<2o 3s="U-3q" 2D="{m.1e.9c}"><2o>2o>2o>\'+\'1h>1h>\'},4A:[],7m:J,P:[],7k:[\'53\',\'2K\',\'1y\',\'3k\',\'b7\',\'aI\',\'aQ\',\'8W\',\'aM\',\'aN\',\'b5\',\'9a\',\'9J\',\'7M\',\'K\',\'M\',\'6W\',\'5h\',\'5n\',\'4g\',\'bG\',\'be\',\'bC\',\'2b\',\'6L\',\'3b\',\'3D\',\'2S\',\'6R\',\'8a\',\'3E\',\'4F\',\'5l\',\'6p\',\'8x\',\'3U\',\'2c\',\'an\',\'aF\',\'S\'],1P:[],4t:0,bJ:{x:[\'ae\',\'1f\',\'6I\',\'2H\',\'ad\'],y:[\'54\',\'18\',\'7T\',\'3S\',\'5M\']},5Y:{},9a:{},8W:{},6R:{aA:{},1E:{},aB:{}},3d:[],3x:{},3L:[],5T:[],3Z:[],65:{},7f:{},5u:[],29:N.bK||6J((4G.6u.5x().2Z(/.+(?:8V|bL|bM|1M)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1M:(N.4r&&!1w.36),56:/bz/.1a(4G.6u),8b:/bx.+8V:1\\.[0-8].+bk/.1a(4G.6u),$:B(1i){q(1i)D N.6m(1i)},22:B(1R,2P){1R[1R.1c]=2P},14:B(8I,3g,3o,4y,8G){u C=N.14(8I);q(3g)m.3r(C,3g);q(8G)m.Q(C,{7i:0,aj:\'2e\',6q:0});q(3o)m.Q(C,3o);q(4y)4y.1F(C);D C},3r:B(C,3g){Y(u x 3C 3g)C[x]=3g[x];D C},Q:B(C,3o){Y(u x 3C 3o){q(m.31&&x==\'1C\'){q(3o[x]>0.99)C.F.bv(\'4W\');L C.F.4W=\'8F(1C=\'+(3o[x]*2t)+\')\'}L C.F[x]=3o[x]}},43:B(C,1b,2M){u 3G,4e,3J;q(1t 2M!=\'6O\'||2M===H){u 2L=ak;2M={3y:2L[2],2c:2L[3],7P:2L[4]}}q(1t 2M.3y!=\'4o\')2M.3y=6d;2M.2c=1r[2M.2c]||1r.8D;2M.5m=m.3r({},1b);Y(u 2C 3C 1b){u e=1x m.1B(C,2M,2C);3G=6J(m.6s(C,2C))||0;4e=6J(1b[2C]);3J=2C!=\'1C\'?\'E\':\'\';e.2G(3G,4e,3J)}},6s:B(C,1b){q(C.F[1b]){D C.F[1b]}L q(N.7O){D N.7O.9j(C,H).9k(1b)}L{q(1b==\'1C\')1b=\'4W\';u 2P=C.4s[1b.2h(/\\-(\\w)/g,B(a,b){D b.br()})];q(1b==\'4W\')2P=2P.2h(/8F\\(1C=([0-9]+)\\)/,B(a,b){D b/2t});D 2P===\'\'?1:2P}},5X:B(){u d=N,w=1w,4P=d.61&&d.61!=\'6H\'?d.45:d.V,31=m.1M&&(m.29<9||1t 8C==\'1X\');u K=31?4P.8B:(d.45.8B||5r.bs),M=31?4P.bt:5r.bw;m.3t={K:K,M:M,5k:31?4P.5k:8C,5f:31?4P.5f:bh};D m.3t},7K:B(C){u p={x:C.8K,y:C.7l};4a(C.8E){C=C.8E;p.x+=C.8K;p.y+=C.7l;q(C!=N.V&&C!=N.45){p.x-=C.5k;p.y-=C.5f}}D p},4N:B(a,1E,2G,T){q(!a)a=m.14(\'a\',H,{1N:\'2e\'},m.1S);q(1t a.4T==\'B\')D 1E;q(T==\'2O\'){Y(u i=0;i6C){6C=1s;6a=i}}}q(6a==-1)m.2n=-1;L P[6a].3h()},4k:B(a,4U){a.4T=a.2Q;u p=a.4T?a.4T():H;a.4T=H;D(p&&1t p[4U]!=\'1X\')?p[4U]:(1t m[4U]!=\'1X\'?m[4U]:H)},5G:B(a){u S=m.4k(a,\'S\');q(S)D S;D a.2y},3R:B(1i){u 1D=m.$(1i),3H=m.7f[1i],a={};q(!1D&&!3H)D H;q(!3H){3H=1D.5b(J);3H.1i=\'\';m.7f[1i]=3H;D 1D}L{D 3H.5b(J)}},3f:B(d){q(d)m.6x.1F(d);m.6x.2r=\'\'},8M:B(8c,A){u 3i=A||m.3n();A=3i;q(m.3I)D 1m;L m.3i=3i;m.3V(N,1w.36?\'5v\':\'5q\',m.4E);1k{m.3I=8c;8c.2Q()}1l(e){m.3i=m.3I=H}1k{A.2a()}1l(e){}D 1m},5C:B(C,2w){u A=m.3n(C);q(A)D m.8M(A.6D(2w),A);L D 1m},5I:B(C){D m.5C(C,-1)},1L:B(C){D m.5C(C,1)},4E:B(e){q(!e)e=1w.1Z;q(!e.2j)e.2j=e.7R;q(1t e.2j.6K!=\'1X\')D J;u A=m.3n();u 2w=H;9b(e.bR){1H 70:q(A)A.7H();D J;1H 32:1H 34:1H 39:1H 40:2w=1;7A;1H 8:1H 33:1H 37:1H 38:2w=-1;7A;1H 27:1H 13:2w=0}q(2w!==H){m.3V(N,1w.36?\'5v\':\'5q\',m.4E);q(!m.8U)D J;q(e.5R)e.5R();L e.bd=1m;q(A){q(2w==0){A.2a()}L{m.5C(A.R,2w)}D 1m}}D J},b4:B(16){m.22(m.1P,m.3r(16,{2R:\'2R\'+m.4t++}))},7I:B(7z,5E){u C,2A=/^U-11-([0-9]+)$/;C=7z;4a(C.2W){q(C.1i&&2A.1a(C.1i))D C.1i.2h(2A,"$1");C=C.2W}q(!5E){C=7z;4a(C.2W){q(C.4b&&m.5w(C)){Y(u R=0;R1)D J;q(!e.2j)e.2j=e.7R;u C=e.2j;4a(C.2W&&!(/U-(2E|3z|2O|3q)/.1a(C.1p))){C=C.2W}u A=m.3n(C);q(A&&(A.4v||!A.4l))D J;q(A&&e.T==\'74\'){q(e.2j.6K)D J;u 2Z=C.1p.2Z(/U-(2E|3z|3q)/);q(2Z){m.2g={A:A,T:2Z[1],1f:A.x.I,K:A.x.G,18:A.y.I,M:A.y.G,8w:e.60,8r:e.5Z};m.1Q(N,\'6T\',m.7s);q(e.5R)e.5R();q(/U-(2E|2O)-7r/.1a(A.O.1p)){A.3h();m.7t=J}D 1m}L q(/U-2O/.1a(C.1p)&&m.2n!=A.R){A.3h();A.4m(\'1n\')}}L q(e.T==\'9t\'){m.3V(N,\'6T\',m.7s);q(m.2g){q(m.44&&m.2g.T==\'2E\')m.2g.A.O.F.3A=m.44;u 3p=m.2g.3p;q(!3p&&!m.7t&&!/(3z|3q)/.1a(m.2g.T)){A.2a()}L q(3p||(!3p&&m.8t)){m.2g.A.4m(\'1n\')}q(m.2g.A.2V)m.2g.A.2V.F.1N=\'2e\';m.7t=1m;m.2g=H}L q(/U-2E-7r/.1a(C.1p)){C.F.3A=m.44}}D 1m},7s:B(e){q(!m.2g)D J;q(!e)e=1w.1Z;u a=m.2g,A=a.A;q(A.W){q(!A.2V)A.2V=m.14(\'1h\',H,{1d:\'21\',K:A.x.G+\'E\',M:A.y.G+\'E\',1f:A.x.cb+\'E\',18:A.y.cb+\'E\',1s:4,8P:(m.31?\'b0\':\'2e\'),1C:0.bi},A.11,J);q(A.2V.F.1N==\'2e\')A.2V.F.1N=\'\'}a.59=e.60-a.8w;a.5e=e.5Z-a.8r;u 7y=1r.cE(1r.8n(a.59,2)+1r.8n(a.5e,2));q(!a.3p)a.3p=(a.T!=\'2E\'&&7y>0)||(7y>(m.cT||5));q(a.3p&&e.60>5&&e.5Z>5){q(a.T==\'3q\')A.3q(a);L{A.7E(a.1f+a.59,a.18+a.5e);q(a.T==\'2E\')A.O.F.3A=\'3z\'}}D 1m},8l:B(e){1k{q(!e)e=1w.1Z;u 5N=/cW/i.1a(e.T);q(!e.2j)e.2j=e.7R;q(!e.5L)e.5L=5N?e.d1:e.d0;u A=m.3n(e.2j);q(!A.4l)D;q(!A||!e.5L||m.3n(e.5L,J)==A||m.2g)D;Y(u i=0;i=k.1O.3y+k.7v){k.3N=k.4e;k.I=k.7q=1;k.7C();k.1O.5m[k.1b]=J;u 7Q=J;Y(u i 3C k.1O.5m)q(k.1O.5m[i]!==J)7Q=1m;q(7Q){q(k.1O.7P)k.1O.7P.8X(k.2k)}D 1m}L{u n=t-k.7v;k.7q=n/k.1O.3y;k.I=k.1O.2c(n,0,1,k.1O.3y);k.3N=k.3G+((k.4e-k.3G)*k.I);k.7C()}D J}};m.3r(m.1B,{3c:{1C:B(1B){m.Q(1B.2k,{1C:1B.3N})},8H:B(1B){1k{q(1B.2k.F&&1B.2k.F[1B.1b]!=H)1B.2k.F[1B.1b]=1B.3N+1B.3J;L 1B.2k[1B.1b]=1B.3N}1l(e){}}}});m.55=B(1y,2F){k.2F=2F;k.1y=1y;u v=m.29,5d;k.6M=m.1M&&m.29<7;q(!1y){q(2F)2F();D}m.64();k.2m=m.14(\'2m\',{d4:0},{1q:\'1n\',1d:\'21\',d8:\'d9\',K:0},m.1S,J);u 80=m.14(\'80\',H,H,k.2m,1);k.24=[];Y(u i=0;i<=8;i++){q(i%3==0)5d=m.14(\'5d\',H,{M:\'1J\'},80,J);k.24[i]=m.14(\'24\',H,H,5d,J);u F=i!=4?{dd:0,dc:0}:{1d:\'3w\'};m.Q(k.24[i],F)}k.24[4].1p=1y+\' U-1o\';k.8R()};m.55.4Q={8R:B(){u S=m.4D+(m.db||"da/")+k.1y+".cM";u 8N=m.56&&m.29<8p?m.1S:H;k.30=m.14(\'1u\',H,{1d:\'21\',18:\'-3P\'},8N,J);u 3a=k;k.30.3O=B(){3a.8O()};k.30.S=S},8O:B(){u o=k.1v=k.30.K/4,I=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1G={M:(2*o)+\'E\',K:(2*o)+\'E\'};Y(u i=0;i<=8;i++){q(I[i]){q(k.6M){u w=(i==1||i==7)?\'2t%\':k.30.K+\'E\';u 1h=m.14(\'1h\',H,{K:\'2t%\',M:\'2t%\',1d:\'3w\',1T:\'1n\'},k.24[i],J);m.14(\'1h\',H,{4W:"c8:c7.a7.c6(c5=c9, S=\'"+k.30.S+"\')",1d:\'21\',K:w,M:k.30.M+\'E\',1f:(I[i][0]*o)+\'E\',18:(I[i][1]*o)+\'E\'},1h,J)}L{m.Q(k.24[i],{8P:\'7h(\'+k.30.S+\') \'+(I[i][0]*o)+\'E \'+(I[i][1]*o)+\'E\'})}q(1w.36&&(i==3||i==5))m.14(\'1h\',H,1G,k.24[i],J);m.Q(k.24[i],1G)}}k.30=H;q(m.3x[k.1y])m.3x[k.1y].5D();m.3x[k.1y]=k;q(k.2F)k.2F()},4J:B(I,1v,8Q,3u,2c){u A=k.A,4x=A.11.F,1v=1v||0,I=I||{x:A.x.I+1v,y:A.y.I+1v,w:A.x.19(\'1K\')-2*1v,h:A.y.19(\'1K\')-2*1v};q(8Q)k.2m.F.1q=(I.h>=4*k.1v)?\'2l\':\'1n\';m.Q(k.2m,{1f:(I.x-k.1v)+\'E\',18:(I.y-k.1v)+\'E\',K:(I.w+2*k.1v)+\'E\'});I.w-=2*k.1v;I.h-=2*k.1v;m.Q(k.24[4],{K:I.w>=0?I.w+\'E\':0,M:I.h>=0?I.h+\'E\':0});q(k.6M)k.24[3].F.M=k.24[5].F.M=k.24[4].F.M},5D:B(8J){q(8J)k.2m.F.1q=\'1n\';L m.3f(k.2m)}};m.5t=B(A,1G){k.A=A;k.1G=1G;k.2T=1G==\'x\'?\'cf\':\'ce\';k.2x=k.2T.5x();k.4Z=1G==\'x\'?\'cd\':\'cc\';k.7a=k.4Z.5x();k.6v=1G==\'x\'?\'c4\':\'c3\';k.bW=k.6v.5x();k.1V=k.2Y=0};m.5t.4Q={19:B(R){9b(R){1H\'6S\':D k.1z+k.2s+(k.t-m.20[\'1v\'+k.2T])/2;1H\'1K\':D k.G+2*k.cb+k.1V+k.2Y;1H\'4p\':D k.5c-k.3B-k.5j;1H\'6w\':D k.19(\'4p\')-2*k.cb-k.1V-k.2Y;1H\'4M\':D k.I-(k.A.1o?k.A.1o.1v:0);1H\'7J\':D k.19(\'1K\')+(k.A.1o?2*k.A.1o.1v:0);1H\'5z\':D k.1U?1r.6e((k.G-k.1U)/2):0}},6Z:B(){k.cb=(k.A.O[\'1v\'+k.2T]-k.t)/2;k.5j=m[\'6q\'+k.6v]},78:B(){k.t=k.A.C[k.2x]?3X(k.A.C[k.2x]):k.A.C[\'1v\'+k.2T];k.1z=k.A.1z[k.1G];k.2s=(k.A.C[\'1v\'+k.2T]-k.t)/2;q(k.1z==0||k.1z==-1){k.1z=(m.3t[k.2x]/2)+m.3t[\'3e\'+k.4Z]}},6Y:B(){u A=k.A;k.49=\'1J\';k.I=k.1z-k.cb+k.2s;q(k.6p&&k.1G==\'x\')A.5l=1r.2I(A.5l||k.Z,A.6p*k.Z/A.y.Z);k.G=1r.2I(k.Z,A[\'7W\'+k.2T]||k.Z);k.2B=A.53?1r.2I(A[\'2I\'+k.2T],k.Z):k.Z;q(A.2p&&A.2K){k.G=A[k.2x];k.1U=k.Z}q(k.1G==\'x\'&&m.58)k.2B=A.3E;k.3B=m[\'6q\'+k.4Z];k.3e=m.3t[\'3e\'+k.4Z];k.5c=m.3t[k.2x]},89:B(i){u A=k.A;q(A.2p&&(A.2K||m.58)){k.1U=i;k.G=1r.7W(k.G,k.1U);A.O.F[k.7a]=k.19(\'5z\')+\'E\'}L k.G=i;A.O.F[k.2x]=i+\'E\';A.11.F[k.2x]=k.19(\'1K\')+\'E\';q(A.1o)A.1o.4J();q(A.2V)A.2V.F[k.2x]=i+\'E\';q(k.1G==\'y\'&&A.4C&&A.V.F.M!=\'1J\')1k{A.4C.V.F.1T=\'1J\'}1l(e){}q(A.1Y){u d=A.26;q(k.79===1X)k.79=A.1g[\'1v\'+k.2T]-d[\'1v\'+k.2T];d.F[k.2x]=(k.G-k.79)+\'E\';q(k.1G==\'x\')A.3K.F.K=\'1J\';q(A.V)A.V.F[k.2x]=\'1J\'}q(k.1G==\'x\'&&A.1A)A.48(J)},88:B(i){k.I=i;k.A.11.F[k.7a]=i+\'E\';q(k.A.1o)k.A.1o.4J()}};m.4H=B(a,1E,2G,2z){q(N.9M&&m.1M&&!m.7b){m.1Q(N,\'3l\',B(){1x m.4H(a,1E,2G,2z)});D}k.a=a;k.2G=2G;k.2z=2z||\'2E\';k.1Y=(2z==\'2O\');k.2p=!k.1Y;m.7m=1m;k.1P=[];m.64();u R=k.R=m.P.1c;Y(u i=0;i(k.x.1U||k.x.G)){k.9X();q(k.1P.1c==1)k.48()}}k.6P()}1l(e){k.7w(e)}},7g:B(4y,1J){u c=m.3T(4y,\'67\',\'U-V\');q(/(W|3j)/.1a(k.2b)){q(k.3b)c.F.K=k.3b+\'E\';q(k.3D)c.F.M=k.3D+\'E\'}},5a:B(){q(k.aD)D;u A=k;k.V=m.3T(k.1g,\'67\',\'U-V\');q(k.2b==\'W\'){k.4u();u 4q=m.2J.5b(1);k.V.1F(4q);k.co=k.1g.28;q(!k.3b)k.3b=4q.28;u 3W=k.1g.1I-k.V.1I,h=k.3D||m.3t.M-3W-m.3F-m.6h,3O=k.2S==\'57\'?\' 3O="q (m.P[\'+k.R+\']) m.P[\'+k.R+\'].4z()" \':\'\';k.V.2r+=\'\';k.4q=k.V.3M(\'1h\')[0];k.W=k.V.3M(\'W\')[0];q(k.2S==\'4c\')k.6r()}q(k.2b==\'3j\'){k.V.1i=k.V.1i||\'m-cm-1i-\'+k.R;u a=k.6R;q(!a.1E)a.1E={};q(1t a.1E.aw==\'1X\')a.1E.aw=\'ck\';q(6G)6G.cl(k.S,k.V.1i,k.3b,k.3D,a.cC||\'7\',a.cz,a.aA,a.1E,a.aB)}k.aD=J},7j:B(){q(k.W&&!k.3D){k.W.F.M=k.V.F.M=k.ax()+\'E\'}k.1g.1F(m.2J);q(!k.x.Z)k.x.Z=k.1g.28;k.y.Z=k.1g.1I;k.1g.ar(m.2J);q(m.1M&&k.az>3X(k.1g.4s.M)){k.az=3X(k.1g.4s.M)}m.Q(k.11,{1d:\'21\',7i:\'0\'});m.Q(k.O,{K:k.x.t+\'E\',M:k.y.t+\'E\'})},ax:B(){u h;1k{u 1W=k.4C=k.W.6l||k.W.4L.N;u 2J=1W.14(\'1h\');2J.F.aC=\'ay\';1W.V.1F(2J);h=2J.7l;q(m.1M)h+=3X(1W.V.4s.3F)+3X(1W.V.4s.6h)-1}1l(e){h=c0}D h},6r:B(){u 4d=k.1g.28-k.4q.28;m.3f(k.4q);q(4d<0)4d=0;u 3W=k.1g.1I-k.W.1I;q(k.4C&&!k.3D&&!k.M&&k.y.G==k.y.Z)1k{k.4C.V.F.1T=\'1n\'}1l(e){}m.Q(k.W,{K:1r.7V(k.x.G-4d)+\'E\',M:1r.7V(k.y.G-3W)+\'E\'});m.Q(k.V,{K:k.W.F.K,M:k.W.F.M});k.4h=k.W;k.26=k.4h},ai:B(){k.7g(k.1g);q(k.2b==\'3j\'&&k.2S==\'57\')k.5a();q(k.x.G1D.1I){1D.F.K=(3X(1D.F.K)+5s)+\'E\'}k.4h=1D;k.26=k.4h}q(k.W&&k.2S==\'57\')k.6r();q(!k.4h&&k.y.Gk.26.2W.1I){51("1k { m.P["+k.R+"].26.F.1T = \'1J\'; } 1l(e) {}",m.6N)}},49:B(p,46){u bT,bU=p.2j,1G=p==k.x?\'x\':\'y\';u 6t=1m;u 42=p.A.53;p.I=1r.6e(p.I-((p.19(\'1K\')-p.t)/2));q(p.Ip.3e+p.5c-p.5j){q(!46&&6t&&42){p.G=1r.2I(p.G,p.19(1G==\'y\'?\'4p\':\'6w\'))}L q(p.19(\'1K\')2i){ 2q=2N*2i;q(2qk.4F&&x.G>k.3E&&y.19(\'1K\')>y.19(\'4p\')){y.G-=10;q(2i)x.G=y.G*2i;k.48(0,1);35=J}}D 35},6P:B(){u x=k.x,y=k.y;k.4m(\'1n\');k.7G(1,{11:{K:x.19(\'1K\'),M:y.19(\'1K\'),1f:x.I,18:y.I},O:{1f:x.1V+x.19(\'5z\'),18:y.1V+y.19(\'5z\'),K:x.1U||x.G,M:y.1U||y.G}},m.6N)},7G:B(2v,2d,3u){q(k.1o&&!k.3k){q(2v)k.1o.4J();L k.1o.5D((k.1Y&&k.4g))}q(!2v)k.9W();u A=k,x=A.x,y=A.y,2c=k.2c;q(!2v)2c=k.an||2c;u 4c=2v?B(){q(A.1o)A.1o.2m.F.1q="2l";51(B(){A.aE()},50)}:B(){A.7x()};q(2v)m.Q(k.11,{K:x.t+\'E\',M:y.t+\'E\'});q(2v&&k.1Y){m.Q(k.11,{1f:(x.1z-x.cb+x.2s)+\'E\',18:(y.1z-y.cb+y.2s)+\'E\'})}q(k.aF){m.Q(k.11,{1C:2v?0:1});m.3r(2d.11,{1C:2v})}m.43(k.11,2d.11,{3y:3u,2c:2c,3c:B(2P,2L){q(A.1o&&A.3k&&2L.1b==\'18\'){u 4I=2v?2L.I:1-2L.I;u I={w:x.t+(x.19(\'1K\')-x.t)*4I,h:y.t+(y.19(\'1K\')-y.t)*4I,x:x.1z+(x.I-x.1z)*4I,y:y.1z+(y.I-y.1z)*4I};A.1o.4J(I,0,1)}q(A.1Y){q(2L.1b==\'1f\')A.3K.F.1f=(x.I-2P)+\'E\';q(2L.1b==\'18\')A.3K.F.18=(y.I-2P)+\'E\'}}});m.43(k.O,2d.O,3u,2c,4c);q(2v){k.11.F.1q=\'2l\';k.O.F.1q=\'2l\';q(k.1Y)k.1g.F.1q=\'2l\';k.a.1p+=\' U-9U-9R\'}},aE:B(){k.4l=J;k.3h();q(k.1Y&&k.2S==\'4c\')k.5a();q(k.W){1k{u A=k,1W=k.W.6l||k.W.4L.N;m.1Q(1W,\'74\',B(){q(m.2n!=A.R)A.3h()})}1l(e){}q(m.1M&&1t k.4v!=\'ca\')k.W.F.K=(k.3b-1)+\'E\'}q(m.3I&&m.3I==k.a)m.3I=H;k.ag();u p=m.3t,6A=m.5Y.x+p.5k,6z=m.5Y.y+p.5f;k.7S=k.x.I<6A&&6Ak.x.19(\'4M\')+k.x.19(\'7J\'));u 9w=(2U.y+2U.hk.y.19(\'4M\')+k.y.19(\'7J\'));u 5p=m.7I(1j[i]);q(!9q&&!9w&&5p!=k.R){q(!2f){1j[i].4X(\'1n-by\',\'[\'+k.R+\']\');1j[i].7u=1j[i].F[1b];1j[i].F[1b]=\'1n\'}L q(2f.9u(\'[\'+k.R+\']\')==-1){1j[i].4X(\'1n-by\',2f+\'[\'+k.R+\']\')}}L q((2f==\'[\'+k.R+\']\'||m.2n==5p)&&5p!=k.R){1j[i].4X(\'1n-by\',\'\');1j[i].F[1b]=1j[i].7u||\'\'}L q(2f&&2f.9u(\'[\'+k.R+\']\')>-1){1j[i].4X(\'1n-by\',2f.2h(\'[\'+k.R+\']\',\'\'))}}}}},3h:B(){k.11.F.1s=m.3Y+=2;Y(u i=0;i=5.5){s=s.2h(1x 66(\']*>\',\'al\'),\'\').2h(1x 66(\']*>.*?\',\'al\'),\'\');q(k.W){u 1W=k.W.6l;q(!1W&&k.W.4L)1W=k.W.4L.N;q(!1W){u 3a=k;51(B(){3a.4Y()},25);D}1W.aq();1W.bP(s);1W.2a();1k{s=1W.6m(k.1i).2r}1l(e){1k{s=k.W.N.6m(k.1i).2r}1l(e){}}m.3f(k.W)}L{68=/(]*>|<\\/V>)/b6;q(68.1a(s))s=s.at(68)[m.31?1:2]}}m.3T(k.O,\'67\',\'U-V\').2r=s;k.2F();Y(u x 3C k)k[x]=H}};m.62=m.1e;u bc=m.4H;q(m.1M&&1w==1w.18){(B(){1k{N.45.bb(\'1f\')}1l(e){51(ak.ba,50);D}m.3l()})()}m.1Q(N,\'aU\',m.3l);m.1Q(1w,\'71\',m.3l);m.1Q(N,\'3l\',B(){q(m.5V){u F=m.14(\'F\',{T:\'aS/6s\'},H,N.3M(\'aW\')[0]),a3=N.61==\'6H\';B 5W(7d,7c){q(m.1M&&(m.29<9||a3)){u 3i=N.a4[N.a4.1c-1];q(1t(3i.5W)=="6O")3i.5W(7d,7c)}L{F.1F(N.aG(7d+" {"+7c+"}"))}}B cV(1b){D\'cU( ( ( cS = N.45.\'+1b+\' ? N.45.\'+1b+\' : N.V.\'+1b+\' ) ) + \\\'E\\\' );\'}q(m.5V)5W(\'.U 1u\',\'3A: 7h(\'+m.4D+m.5V+\'), 5U !cX;\')}});m.1Q(1w,\'3q\',B(){m.5X()});m.1Q(N,\'6T\',B(e){m.5Y={x:e.60,y:e.5Z}});m.1Q(N,\'74\',m.73);m.1Q(N,\'9t\',m.73);m.1Q(N,\'3l\',m.4w);m.1Q(1w,\'71\',m.9v);m.1Q(1w,\'71\',m.9D)}',62,828,'||||||||||||||||||||this||hs||||if||||var||||||exp|function|el|return|px|style|size|null|pos|true|width|else|height|document|content|expanders|setStyles|key|src|type|highslide|body|iframe||for|full||wrapper|||createElement||overlay||top|get|test|prop|length|position|lang|left|innerContent|div|id|els|try|catch|false|hidden|outline|className|visibility|Math|zIndex|typeof|img|offset|window|new|outlineType|tpos|overlayBox|fx|opacity|node|params|appendChild|dim|case|offsetHeight|auto|wsize|next|ie|display|options|overlays|addEventListener|arr|container|overflow|imgSize|p1|doc|undefined|isHtml|event|loading|absolute|push|xhr|td||scrollerDiv||offsetWidth|uaVersion|close|objectType|easing|to|none|hiddenBy|dragArgs|replace|ratio|target|elem|visible|table|focusKey|span|isImage|xSize|innerHTML|tb|100|ajax|up|op|wh|href|contentType|re|minSize|name|title|image|onLoad|custom|right|min|clearing|useBox|args|opt|ySize|html|val|onclick|hsId|objectLoadTime|ucwh|elPos|releaseMask|parentNode|func|p2|match|graphic|ieLt9||||changed|opera||||pThis|objectWidth|step|timers|scroll|discardElement|attribs|focus|last|swf|outlineWhileAnimating|ready|li|getExpander|styles|hasDragged|resize|extend|class|page|dur|groups|relative|pendingOutlines|duration|move|cursor|marginMin|in|objectHeight|minWidth|marginTop|start|clone|upcoming|unit|mediumContent|sleeping|getElementsByTagName|now|onload|9999px|ieLt7|getNode|bottom|getElementByClass|slideshowGroup|removeEventListener|hDiff|parseInt|zIndexCounter|cacheBindings||cNode|allowReduce|animate|styleRestoreCursor|documentElement|moveOnly|blurExp|sizeOverlayBox|justify|while|tagName|after|wDiff|end|Id|preserveContent|scrollingContent|images|marginLeft|getParam|isExpanded|doShowHide|htmls|number|fitsize|ruler|all|currentStyle|idCounter|showLoading|isClosing|getAnchors|stl|parent|contentLoaded|preloadTheseImages|on|iDoc|graphicsDir|keyHandler|minHeight|navigator|Expander|fac|setPosition|mask|contentWindow|opos|expand|createOverlay|iebody|prototype|cache|block|getParams|param|matches|filter|setAttribute|loadHTML|uclt||setTimeout|restoreCursor|allowSizeReduction|above|Outline|safari|before|padToMinWidth|dX|writeExtendedContent|cloneNode|clientSize|tr|dY|scrollTop|onLoadStarted|allowWidthReduction|anchors|marginMax|scrollLeft|maxWidth|curAnim|allowHeightReduction|gotoEnd|wrapperKey|keydown|self|kdeBugCorr|Dimension|onReady|keypress|isHsAnchor|toLowerCase|showHideElements|imgPad|maincontent|tId|previousOrNext|destroy|expOnly|Ajax|getSrc|Date|previous|ypos|xpos|relatedTarget|below|over|overlayId|hideOnMouseOut|fullExpandLabel|preventDefault|getTime|preloadTheseAjax|pointer|expandCursor|addRule|getPageSize|mouse|clientY|clientX|compatMode|langDefaults|pre|init|cachedGets|RegExp|DIV|regBody|os|topmostKey|positionOverlay|offY|250|round|heading|preloadFullImage|marginBottom|sg|offX|thumbsUserSetId|contentDocument|getElementById|fitOverlayBox|allowMultipleInstances|maxHeight|margin|correctIframeSize|css|hasMovedMin|userAgent|ucrb|maxsize|garbageBin|cur|mY|mX|marginRight|topZ|getAdjacentAnchor|string|preloadAjaxElement|swfobject|BackCompat|center|parseFloat|form|cacheAjax|hasAlphaImageLoader|expandDuration|object|show|direction|swfOptions|loadingPos|mousemove|Create|connectOutline|contentId|getSelfRendered|calcExpanded|calcBorders||load|location|mouseClickHandler|mousedown||getCacheBinding|cssDirection|calcThumb|sizeDiff|lt|isReady|dec|sel|Click|clones|setObjContainerSize|url|padding|htmlGetSize|overrides|offsetTop|continuePreloading|fade|arrow|getElementContent|state|blur|dragHandler|hasFocused|origProp|startTime|error|afterClose|distance|element|break|restoreTitle|update|numberOfImagesToPreload|moveTo|getInline|changeSize|doFullExpand|getWrapperKey|osize|getPosition|resizeTo|dragByHeading|onError|defaultView|complete|done|srcElement|mouseIsOver|middle|cancelLoading|abs|max|doWrapper|types|run|tbody|credits|panel|ie6|thumbnailId|destroyObject|Text|openerTagNames|setPos|setSize|wrapperClassName|geckoMac|adj|Highslide|updateAnchors|detachEvent|loadingOpacity|spacebar|timerId|JS|Play|wrapperMouseHandler|from|pow|Previous|525|orig|clickY|slideshow|hasHtmlExpanders|Close|Pause|clickX|pageOrigin|thumb|loadingText|previousText|clientWidth|pageXOffset|easeInQuad|offsetParent|alpha|nopad|_default|tag|hide|offsetLeft|skin|transit|appendTo|onGraphicLoad|background|vis|preloadGraphic|contentWrapper|replaceLang|enableKeyListener|rv|captionOverlay|call|nextTitle|nextText|moveTitle|previousTitle|loadingTitle|Move|and|200|moveText|closeTitle|focusTopmost||headingOverlay|switch|resizeTitle|ul|closeText|ltr|htmlExpand|Next|preloadNext|getComputedStyle|getPropertyValue|hideIframes|hideSelects|addOverlay|Overlay|getAttribute|clearsX|focusTitle|hand|mouseup|indexOf|preloadImages|clearsY|nextSibling|_|getAnchorIndex|ie6SSL|current|cachedGet|preloadAjax|toString|creditsHref|creditsText|XMLHttpRequest|Eval|creditsPosition|creditsTitle|setRequestHeader|readyState|XMLHTTP|doPanels|showOverlays|genOverlayBox|anchor|sleep|gotOverlays|active|fullExpandOpacity|destroyOverlays|createFullExpand|javascript|fullExpandTitle|fullExpandPosition|writeCredits|showCredits|backCompat|styleSheets|htmlPrepareClose|restoreDuration|Microsoft|ActiveXObject|awake|offsetX|reOrder|getOverlays|rightpanel|leftpanel|offsetY|prepareNextOutline|creditsTarget|htmlSizeOperations|border|arguments|gi|vendor|easingClose|correctRatio|KDE|open|removeChild||split|tmpMin|script|wmode|getIframePageHeight|both|newHeight|flashvars|attributes|clear|hasExtendedContent|afterExpand|fadeInOut|createTextNode|graphics|captionText|keys|Use|drag|headingId|headingText|fullExpandText|click|captionEval|outlineStartOffset|text|button|DOMContentLoaded|xpand|HEAD|_self|drop|shadow|white|header|htmlE|com|registerOverlay|headingEval|ig|captionId|footer|http|callee|doScroll|HsExpander|returnValue|maincontentText|www|urlencoded|pageYOffset|01|application|Gecko|Content|Type|send|link|about|blank|toUpperCase|innerWidth|clientHeight|1001|removeAttribute|innerHeight|Macintosh||Safari|forceAjaxReload|dummy|maincontentEval|responseText|zoomin|Msxml2|maincontentId|onreadystatechange|GET|oPos|documentMode|it|ra|With|Requested|write|zoomout|keyCode|pauseTitle|tgtArr|tgt|actual|rb|Expand|front|allowSimultaneousLoading|300|nodeName|insertBefore|Bottom|Right|sizingMethod|AlphaImageLoader|DXImageTransform|progid|scale|boolean||Top|Left|Height|Width|onmouseover|onmouseout|htmlCreate|flushImgSize|transparent|embedSWF|flash|allowfullscreen|newWidth|Loading|static|frameborder|oncontextmenu|blockRightClick|lineNumber|Line|alert|debug|message|expressInstallSwfurl|imageCreate|cancel|version|bring|sqrt|Powered|1px|paddingTop|200px|https|linearTween|removeSWF|png|default|pauseText|StopPlay|protocol|caption|ignoreMe|dragSensitivity|expression|fix|mouseover|important|useOnHtml|attachEvent|toElement|fromElement|playText|playTitle|cellSpacing|Go|eval|the|borderCollapse|collapse|outlines|outlinesDir|fontSize|lineHeight|Resize|SELECT|homepage|clearInterval|splice|esc|setInterval|IFRAME'.split('|'),0,{}))
10 |
--------------------------------------------------------------------------------
/static/highslide/highslide.css:
--------------------------------------------------------------------------------
1 | /**
2 | * @file: highslide.css
3 | * @version: 5.0.0
4 | */
5 | .highslide-container div {
6 | font-family: Verdana, Helvetica;
7 | font-size: 10pt;
8 | }
9 | .highslide-container table {
10 | background: none;
11 | table-layout: auto;
12 | }
13 | .highslide {
14 | outline: none;
15 | text-decoration: none;
16 | }
17 | .highslide img {
18 | border: 2px solid silver;
19 | }
20 | .highslide:hover img {
21 | border-color: gray;
22 | }
23 | .highslide-active-anchor img {
24 | visibility: hidden;
25 | }
26 | .highslide-gallery .highslide-active-anchor img {
27 | border-color: black;
28 | visibility: visible;
29 | cursor: default;
30 | }
31 | .highslide-image {
32 | border-width: 2px;
33 | border-style: solid;
34 | border-color: white;
35 | }
36 | .highslide-wrapper, .highslide-outline {
37 | background: white;
38 | }
39 | .glossy-dark {
40 | background: #111;
41 | }
42 |
43 | .highslide-image-blur {
44 | }
45 | .highslide-number {
46 | font-weight: bold;
47 | color: gray;
48 | font-size: .9em;
49 | }
50 | .highslide-caption {
51 | display: none;
52 | font-size: 1em;
53 | padding: 5px;
54 | /*background: white;*/
55 | }
56 | .highslide-heading {
57 | display: none;
58 | font-weight: bold;
59 | margin: 0.4em;
60 | }
61 | .highslide-dimming {
62 | /*position: absolute;*/
63 | background: black;
64 | }
65 | a.highslide-full-expand {
66 | background: url(graphics/fullexpand.gif) no-repeat;
67 | display: block;
68 | margin: 0 10px 10px 0;
69 | width: 34px;
70 | height: 34px;
71 | }
72 | .highslide-loading {
73 | display: block;
74 | color: black;
75 | font-size: 9px;
76 | font-weight: bold;
77 | text-transform: uppercase;
78 | text-decoration: none;
79 | padding: 3px;
80 | border: 1px solid white;
81 | background-color: white;
82 | padding-left: 22px;
83 | background-image: url(graphics/loader.white.gif);
84 | background-repeat: no-repeat;
85 | background-position: 3px 1px;
86 | }
87 | a.highslide-credits,
88 | a.highslide-credits i {
89 | padding: 2px;
90 | color: silver;
91 | text-decoration: none;
92 | font-size: 10px;
93 | }
94 | a.highslide-credits:hover,
95 | a.highslide-credits:hover i {
96 | color: white;
97 | background-color: gray;
98 | }
99 | .highslide-move, .highslide-move * {
100 | cursor: move;
101 | }
102 |
103 | .highslide-viewport {
104 | display: none;
105 | position: fixed;
106 | width: 100%;
107 | height: 100%;
108 | z-index: 1;
109 | background: none;
110 | left: 0;
111 | top: 0;
112 | }
113 | .highslide-overlay {
114 | display: none;
115 | }
116 | .hidden-container {
117 | display: none;
118 | }
119 | /* Example of a semitransparent, offset closebutton */
120 | .closebutton {
121 | position: relative;
122 | top: -15px;
123 | left: 15px;
124 | width: 30px;
125 | height: 30px;
126 | cursor: pointer;
127 | background: url(graphics/close.png);
128 | /* NOTE! For IE6, you also need to update the highslide-ie6.css file. */
129 | }
130 |
131 | /*****************************************************************************/
132 | /* Thumbnail boxes for the galleries. */
133 | /* Remove these if you are not using a gallery. */
134 | /*****************************************************************************/
135 | .highslide-gallery ul {
136 | list-style-type: none;
137 | margin: 0;
138 | padding: 0;
139 | }
140 | .highslide-gallery ul li {
141 | display: block;
142 | position: relative;
143 | float: left;
144 | width: 106px;
145 | height: 106px;
146 | border: 1px solid silver;
147 | background: #ededed;
148 | margin: 2px;
149 | padding: 0;
150 | line-height: 0;
151 | overflow: hidden;
152 | }
153 | .highslide-gallery ul a {
154 | position: absolute;
155 | top: 50%;
156 | left: 50%;
157 | }
158 | .highslide-gallery ul img {
159 | position: relative;
160 | top: -50%;
161 | left: -50%;
162 | }
163 | html>/**/body .highslide-gallery ul li {
164 | display: table;
165 | text-align: center;
166 | }
167 | html>/**/body .highslide-gallery ul li {
168 | text-align: center;
169 | }
170 | html>/**/body .highslide-gallery ul a {
171 | position: static;
172 | display: table-cell;
173 | vertical-align: middle;
174 | }
175 | html>/**/body .highslide-gallery ul img {
176 | position: static;
177 | }
178 |
179 | /*****************************************************************************/
180 | /* Controls for the galleries. */
181 | /* Remove these if you are not using a gallery */
182 | /*****************************************************************************/
183 | .highslide-controls {
184 | width: 195px;
185 | height: 40px;
186 | background: url(graphics/controlbar-white.gif) 0 -90px no-repeat;
187 | margin: 20px 15px 10px 0;
188 | }
189 | .highslide-controls ul {
190 | position: relative;
191 | left: 15px;
192 | height: 40px;
193 | list-style: none;
194 | margin: 0;
195 | padding: 0;
196 | background: url(graphics/controlbar-white.gif) right -90px no-repeat;
197 |
198 | }
199 | .highslide-controls li {
200 | float: left;
201 | padding: 5px 0;
202 | margin:0;
203 | list-style: none;
204 | }
205 | .highslide-controls a {
206 | background-image: url(graphics/controlbar-white.gif);
207 | display: block;
208 | float: left;
209 | height: 30px;
210 | width: 30px;
211 | outline: none;
212 | }
213 | .highslide-controls a.disabled {
214 | cursor: default;
215 | }
216 | .highslide-controls a.disabled span {
217 | cursor: default;
218 | }
219 | .highslide-controls a span {
220 | /* hide the text for these graphic buttons */
221 | display: none;
222 | cursor: pointer;
223 | }
224 |
225 |
226 | /* The CSS sprites for the controlbar - see http://www.google.com/search?q=css+sprites */
227 | .highslide-controls .highslide-previous a {
228 | background-position: 0 0;
229 | }
230 | .highslide-controls .highslide-previous a:hover {
231 | background-position: 0 -30px;
232 | }
233 | .highslide-controls .highslide-previous a.disabled {
234 | background-position: 0 -60px !important;
235 | }
236 | .highslide-controls .highslide-play a {
237 | background-position: -30px 0;
238 | }
239 | .highslide-controls .highslide-play a:hover {
240 | background-position: -30px -30px;
241 | }
242 | .highslide-controls .highslide-play a.disabled {
243 | background-position: -30px -60px !important;
244 | }
245 | .highslide-controls .highslide-pause a {
246 | background-position: -60px 0;
247 | }
248 | .highslide-controls .highslide-pause a:hover {
249 | background-position: -60px -30px;
250 | }
251 | .highslide-controls .highslide-next a {
252 | background-position: -90px 0;
253 | }
254 | .highslide-controls .highslide-next a:hover {
255 | background-position: -90px -30px;
256 | }
257 | .highslide-controls .highslide-next a.disabled {
258 | background-position: -90px -60px !important;
259 | }
260 | .highslide-controls .highslide-move a {
261 | background-position: -120px 0;
262 | }
263 | .highslide-controls .highslide-move a:hover {
264 | background-position: -120px -30px;
265 | }
266 | .highslide-controls .highslide-full-expand a {
267 | background-position: -150px 0;
268 | }
269 | .highslide-controls .highslide-full-expand a:hover {
270 | background-position: -150px -30px;
271 | }
272 | .highslide-controls .highslide-full-expand a.disabled {
273 | background-position: -150px -60px !important;
274 | }
275 | .highslide-controls .highslide-close a {
276 | background-position: -180px 0;
277 | }
278 | .highslide-controls .highslide-close a:hover {
279 | background-position: -180px -30px;
280 | }
281 |
282 | /*****************************************************************************/
283 | /* Styles for the HTML popups */
284 | /* Remove these if you are not using Highslide HTML */
285 | /*****************************************************************************/
286 | .highslide-maincontent {
287 | display: none;
288 | }
289 | .highslide-html {
290 | background-color: white;
291 | }
292 | .mobile .highslide-html {
293 | border: 1px solid silver;
294 | }
295 | .highslide-html-content {
296 | display: none;
297 | width: 400px;
298 | padding: 0 5px 5px 5px;
299 | }
300 | .highslide-header {
301 | padding-bottom: 5px;
302 | }
303 | .highslide-header ul {
304 | margin: 0;
305 | padding: 0;
306 | text-align: right;
307 | }
308 | .highslide-header ul li {
309 | display: inline;
310 | padding-left: 1em;
311 | }
312 | .highslide-header ul li.highslide-previous, .highslide-header ul li.highslide-next {
313 | display: none;
314 | }
315 | .highslide-header a {
316 | font-weight: bold;
317 | color: gray;
318 | text-transform: uppercase;
319 | text-decoration: none;
320 | }
321 | .highslide-header a:hover {
322 | color: black;
323 | }
324 | .highslide-header .highslide-move a {
325 | cursor: move;
326 | }
327 | .highslide-footer {
328 | height: 16px;
329 | }
330 | .highslide-footer .highslide-resize {
331 | display: block;
332 | float: right;
333 | margin-top: 5px;
334 | height: 11px;
335 | width: 11px;
336 | background: url(graphics/resize.gif) no-repeat;
337 | }
338 | .highslide-footer .highslide-resize span {
339 | display: none;
340 | }
341 | .highslide-body {
342 | }
343 | .highslide-resize {
344 | cursor: nw-resize;
345 | }
346 |
347 | /*****************************************************************************/
348 | /* Styles for the Individual wrapper class names. */
349 | /* See www.highslide.com/ref/hs.wrapperClassName */
350 | /* You can safely remove the class name themes you don't use */
351 | /*****************************************************************************/
352 |
353 | /* hs.wrapperClassName = 'draggable-header' */
354 | .draggable-header .highslide-header {
355 | height: 18px;
356 | border-bottom: 1px solid #dddddd;
357 | }
358 | .draggable-header .highslide-heading {
359 | position: absolute;
360 | margin: 2px 0.4em;
361 | }
362 |
363 | .draggable-header .highslide-header .highslide-move {
364 | cursor: move;
365 | display: block;
366 | height: 16px;
367 | position: absolute;
368 | right: 24px;
369 | top: 0;
370 | width: 100%;
371 | z-index: 1;
372 | }
373 | .draggable-header .highslide-header .highslide-move * {
374 | display: none;
375 | }
376 | .draggable-header .highslide-header .highslide-close {
377 | position: absolute;
378 | right: 2px;
379 | top: 2px;
380 | z-index: 5;
381 | padding: 0;
382 | }
383 | .draggable-header .highslide-header .highslide-close a {
384 | display: block;
385 | height: 16px;
386 | width: 16px;
387 | background-image: url(graphics/closeX.png);
388 | }
389 | .draggable-header .highslide-header .highslide-close a:hover {
390 | background-position: 0 16px;
391 | }
392 | .draggable-header .highslide-header .highslide-close span {
393 | display: none;
394 | }
395 | .draggable-header .highslide-maincontent {
396 | padding-top: 1em;
397 | }
398 |
399 | /* hs.wrapperClassName = 'titlebar' */
400 | .titlebar .highslide-header {
401 | height: 18px;
402 | border-bottom: 1px solid #dddddd;
403 | }
404 | .titlebar .highslide-heading {
405 | position: absolute;
406 | width: 90%;
407 | margin: 1px 0 1px 5px;
408 | color: #666666;
409 | }
410 |
411 | .titlebar .highslide-header .highslide-move {
412 | cursor: move;
413 | display: block;
414 | height: 16px;
415 | position: absolute;
416 | right: 24px;
417 | top: 0;
418 | width: 100%;
419 | z-index: 1;
420 | }
421 | .titlebar .highslide-header .highslide-move * {
422 | display: none;
423 | }
424 | .titlebar .highslide-header li {
425 | position: relative;
426 | top: 3px;
427 | z-index: 2;
428 | padding: 0 0 0 1em;
429 | }
430 | .titlebar .highslide-maincontent {
431 | padding-top: 1em;
432 | }
433 |
434 | /* hs.wrapperClassName = 'no-footer' */
435 | .no-footer .highslide-footer {
436 | display: none;
437 | }
438 |
439 | /* hs.wrapperClassName = 'wide-border' */
440 | .wide-border {
441 | background: white;
442 | }
443 | .wide-border .highslide-image {
444 | border-width: 10px;
445 | }
446 | .wide-border .highslide-caption {
447 | padding: 0 10px 10px 10px;
448 | }
449 |
450 | /* hs.wrapperClassName = 'borderless' */
451 | .borderless .highslide-image {
452 | border: none;
453 | }
454 | .borderless .highslide-caption {
455 | border-bottom: 1px solid white;
456 | border-top: 1px solid white;
457 | background: silver;
458 | }
459 |
460 | /* hs.wrapperClassName = 'outer-glow' */
461 | .outer-glow {
462 | background: #444;
463 | }
464 | .outer-glow .highslide-image {
465 | border: 5px solid #444444;
466 | }
467 | .outer-glow .highslide-caption {
468 | border: 5px solid #444444;
469 | border-top: none;
470 | padding: 5px;
471 | background-color: gray;
472 | }
473 |
474 | /* hs.wrapperClassName = 'colored-border' */
475 | .colored-border {
476 | background: white;
477 | }
478 | .colored-border .highslide-image {
479 | border: 2px solid green;
480 | }
481 | .colored-border .highslide-caption {
482 | border: 2px solid green;
483 | border-top: none;
484 | }
485 |
486 | /* hs.wrapperClassName = 'dark' */
487 | .dark {
488 | background: #111;
489 | }
490 | .dark .highslide-image {
491 | border-color: black black #202020 black;
492 | background: gray;
493 | }
494 | .dark .highslide-caption {
495 | color: white;
496 | background: #111;
497 | }
498 | .dark .highslide-controls,
499 | .dark .highslide-controls ul,
500 | .dark .highslide-controls a {
501 | background-image: url(graphics/controlbar-black-border.gif);
502 | }
503 |
504 | /* hs.wrapperClassName = 'floating-caption' */
505 | .floating-caption .highslide-caption {
506 | position: absolute;
507 | padding: 1em 0 0 0;
508 | background: none;
509 | color: white;
510 | border: none;
511 | font-weight: bold;
512 | }
513 |
514 | /* hs.wrapperClassName = 'controls-in-heading' */
515 | .controls-in-heading .highslide-heading {
516 | color: gray;
517 | font-weight: bold;
518 | height: 20px;
519 | overflow: hidden;
520 | cursor: default;
521 | padding: 0 0 0 22px;
522 | margin: 0;
523 | background: url(graphics/icon.gif) no-repeat 0 1px;
524 | }
525 | .controls-in-heading .highslide-controls {
526 | width: 105px;
527 | height: 20px;
528 | position: relative;
529 | margin: 0;
530 | top: -23px;
531 | left: 7px;
532 | background: none;
533 | }
534 | .controls-in-heading .highslide-controls ul {
535 | position: static;
536 | height: 20px;
537 | background: none;
538 | }
539 | .controls-in-heading .highslide-controls li {
540 | padding: 0;
541 | }
542 | .controls-in-heading .highslide-controls a {
543 | background-image: url(graphics/controlbar-white-small.gif);
544 | height: 20px;
545 | width: 20px;
546 | }
547 |
548 | .controls-in-heading .highslide-controls .highslide-move {
549 | display: none;
550 | }
551 |
552 | .controls-in-heading .highslide-controls .highslide-previous a {
553 | background-position: 0 0;
554 | }
555 | .controls-in-heading .highslide-controls .highslide-previous a:hover {
556 | background-position: 0 -20px;
557 | }
558 | .controls-in-heading .highslide-controls .highslide-previous a.disabled {
559 | background-position: 0 -40px !important;
560 | }
561 | .controls-in-heading .highslide-controls .highslide-play a {
562 | background-position: -20px 0;
563 | }
564 | .controls-in-heading .highslide-controls .highslide-play a:hover {
565 | background-position: -20px -20px;
566 | }
567 | .controls-in-heading .highslide-controls .highslide-play a.disabled {
568 | background-position: -20px -40px !important;
569 | }
570 | .controls-in-heading .highslide-controls .highslide-pause a {
571 | background-position: -40px 0;
572 | }
573 | .controls-in-heading .highslide-controls .highslide-pause a:hover {
574 | background-position: -40px -20px;
575 | }
576 | .controls-in-heading .highslide-controls .highslide-next a {
577 | background-position: -60px 0;
578 | }
579 | .controls-in-heading .highslide-controls .highslide-next a:hover {
580 | background-position: -60px -20px;
581 | }
582 | .controls-in-heading .highslide-controls .highslide-next a.disabled {
583 | background-position: -60px -40px !important;
584 | }
585 | .controls-in-heading .highslide-controls .highslide-full-expand a {
586 | background-position: -100px 0;
587 | }
588 | .controls-in-heading .highslide-controls .highslide-full-expand a:hover {
589 | background-position: -100px -20px;
590 | }
591 | .controls-in-heading .highslide-controls .highslide-full-expand a.disabled {
592 | background-position: -100px -40px !important;
593 | }
594 | .controls-in-heading .highslide-controls .highslide-close a {
595 | background-position: -120px 0;
596 | }
597 | .controls-in-heading .highslide-controls .highslide-close a:hover {
598 | background-position: -120px -20px;
599 | }
600 |
601 | /*****************************************************************************/
602 | /* Styles for text based controls. */
603 | /* You can safely remove this if you don't use text based controls */
604 | /*****************************************************************************/
605 |
606 | .text-controls .highslide-controls {
607 | width: auto;
608 | height: auto;
609 | margin: 0;
610 | text-align: center;
611 | background: none;
612 | }
613 | .text-controls ul {
614 | position: static;
615 | background: none;
616 | height: auto;
617 | left: 0;
618 | }
619 | .text-controls .highslide-move {
620 | display: none;
621 | }
622 | .text-controls li {
623 | background-image: url(graphics/controlbar-text-buttons.png);
624 | background-position: right top !important;
625 | padding: 0;
626 | margin-left: 15px;
627 | display: block;
628 | width: auto;
629 | }
630 | .text-controls a {
631 | background: url(graphics/controlbar-text-buttons.png) no-repeat;
632 | background-position: left top !important;
633 | position: relative;
634 | left: -10px;
635 | display: block;
636 | width: auto;
637 | height: auto;
638 | text-decoration: none !important;
639 | }
640 | .text-controls a span {
641 | background: url(graphics/controlbar-text-buttons.png) no-repeat;
642 | margin: 1px 2px 1px 10px;
643 | display: block;
644 | min-width: 4em;
645 | height: 18px;
646 | line-height: 18px;
647 | padding: 1px 0 1px 18px;
648 | color: #333;
649 | font-family: "Trebuchet MS", Arial, sans-serif;
650 | font-size: 12px;
651 | font-weight: bold;
652 | white-space: nowrap;
653 | }
654 | .text-controls .highslide-next {
655 | margin-right: 1em;
656 | }
657 | .text-controls .highslide-full-expand a span {
658 | min-width: 0;
659 | margin: 1px 0;
660 | padding: 1px 0 1px 10px;
661 | }
662 | .text-controls .highslide-close a span {
663 | min-width: 0;
664 | }
665 | .text-controls a:hover span {
666 | color: black;
667 | }
668 | .text-controls a.disabled span {
669 | color: #999;
670 | }
671 |
672 | .text-controls .highslide-previous span {
673 | background-position: 0 -40px;
674 | }
675 | .text-controls .highslide-previous a.disabled {
676 | background-position: left top !important;
677 | }
678 | .text-controls .highslide-previous a.disabled span {
679 | background-position: 0 -140px;
680 | }
681 | .text-controls .highslide-play span {
682 | background-position: 0 -60px;
683 | }
684 | .text-controls .highslide-play a.disabled {
685 | background-position: left top !important;
686 | }
687 | .text-controls .highslide-play a.disabled span {
688 | background-position: 0 -160px;
689 | }
690 | .text-controls .highslide-pause span {
691 | background-position: 0 -80px;
692 | }
693 | .text-controls .highslide-next span {
694 | background-position: 0 -100px;
695 | }
696 | .text-controls .highslide-next a.disabled {
697 | background-position: left top !important;
698 | }
699 | .text-controls .highslide-next a.disabled span {
700 | background-position: 0 -200px;
701 | }
702 | .text-controls .highslide-full-expand span {
703 | background: none;
704 | }
705 | .text-controls .highslide-full-expand a.disabled {
706 | background-position: left top !important;
707 | }
708 | .text-controls .highslide-close span {
709 | background-position: 0 -120px;
710 | }
711 |
712 |
713 | /*****************************************************************************/
714 | /* Styles for the thumbstrip. */
715 | /* See www.highslide.com/ref/hs.addSlideshow */
716 | /* You can safely remove this if you don't use a thumbstrip */
717 | /*****************************************************************************/
718 |
719 | .highslide-thumbstrip {
720 | height: 100%;
721 | direction: ltr;
722 | }
723 | .highslide-thumbstrip div {
724 | overflow: hidden;
725 | }
726 | .highslide-thumbstrip table {
727 | position: relative;
728 | padding: 0;
729 | border-collapse: collapse;
730 | }
731 | .highslide-thumbstrip td {
732 | padding: 1px;
733 | /*text-align: center;*/
734 | }
735 | .highslide-thumbstrip a {
736 | outline: none;
737 | }
738 | .highslide-thumbstrip img {
739 | display: block;
740 | border: 1px solid gray;
741 | margin: 0 auto;
742 | }
743 | .highslide-thumbstrip .highslide-active-anchor img {
744 | visibility: visible;
745 | }
746 | .highslide-thumbstrip .highslide-marker {
747 | position: absolute;
748 | width: 0;
749 | height: 0;
750 | border-width: 0;
751 | border-style: solid;
752 | border-color: transparent; /* change this to actual background color in highslide-ie6.css */
753 | }
754 | .highslide-thumbstrip-horizontal div {
755 | width: auto;
756 | /* width: 100% breaks in small strips in IE */
757 | }
758 | .highslide-thumbstrip-horizontal .highslide-scroll-up {
759 | display: none;
760 | position: absolute;
761 | top: 3px;
762 | left: 3px;
763 | width: 25px;
764 | height: 42px;
765 | }
766 | .highslide-thumbstrip-horizontal .highslide-scroll-up div {
767 | margin-bottom: 10px;
768 | cursor: pointer;
769 | background: url(graphics/scrollarrows.png) left center no-repeat;
770 | height: 42px;
771 | }
772 | .highslide-thumbstrip-horizontal .highslide-scroll-down {
773 | display: none;
774 | position: absolute;
775 | top: 3px;
776 | right: 3px;
777 | width: 25px;
778 | height: 42px;
779 | }
780 | .highslide-thumbstrip-horizontal .highslide-scroll-down div {
781 | margin-bottom: 10px;
782 | cursor: pointer;
783 | background: url(graphics/scrollarrows.png) center right no-repeat;
784 | height: 42px;
785 | }
786 | .highslide-thumbstrip-horizontal table {
787 | margin: 2px 0 10px 0;
788 | }
789 | .highslide-viewport .highslide-thumbstrip-horizontal table {
790 | margin-left: 10px;
791 | }
792 | .highslide-thumbstrip-horizontal img {
793 | width: auto;
794 | height: 40px;
795 | }
796 | .highslide-thumbstrip-horizontal .highslide-marker {
797 | top: 47px;
798 | border-left-width: 6px;
799 | border-right-width: 6px;
800 | border-bottom: 6px solid gray;
801 | }
802 | .highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker {
803 | margin-left: 10px;
804 | }
805 | .dark .highslide-thumbstrip-horizontal .highslide-marker, .highslide-viewport .highslide-thumbstrip-horizontal .highslide-marker {
806 | border-bottom-color: white !important;
807 | }
808 |
809 | .highslide-thumbstrip-vertical-overlay {
810 | overflow: hidden !important;
811 | }
812 | .highslide-thumbstrip-vertical div {
813 | height: 100%;
814 | }
815 | .highslide-thumbstrip-vertical a {
816 | display: block;
817 | }
818 | .highslide-thumbstrip-vertical .highslide-scroll-up {
819 | display: none;
820 | position: absolute;
821 | top: 0;
822 | left: 0;
823 | width: 100%;
824 | height: 25px;
825 | }
826 | .highslide-thumbstrip-vertical .highslide-scroll-up div {
827 | margin-left: 10px;
828 | cursor: pointer;
829 | background: url(graphics/scrollarrows.png) top center no-repeat;
830 | height: 25px;
831 | }
832 | .highslide-thumbstrip-vertical .highslide-scroll-down {
833 | display: none;
834 | position: absolute;
835 | bottom: 0;
836 | left: 0;
837 | width: 100%;
838 | height: 25px;
839 | }
840 | .highslide-thumbstrip-vertical .highslide-scroll-down div {
841 | margin-left: 10px;
842 | cursor: pointer;
843 | background: url(graphics/scrollarrows.png) bottom center no-repeat;
844 | height: 25px;
845 | }
846 | .highslide-thumbstrip-vertical table {
847 | margin: 10px 0 0 10px;
848 | }
849 | .highslide-thumbstrip-vertical img {
850 | width: 60px; /* t=5481 */
851 | }
852 | .highslide-thumbstrip-vertical .highslide-marker {
853 | left: 0;
854 | margin-top: 8px;
855 | border-top-width: 6px;
856 | border-bottom-width: 6px;
857 | border-left: 6px solid gray;
858 | }
859 | .dark .highslide-thumbstrip-vertical .highslide-marker, .highslide-viewport .highslide-thumbstrip-vertical .highslide-marker {
860 | border-left-color: white;
861 | }
862 |
863 | .highslide-viewport .highslide-thumbstrip-float {
864 | overflow: auto;
865 | }
866 | .highslide-thumbstrip-float ul {
867 | margin: 2px 0;
868 | padding: 0;
869 | }
870 | .highslide-thumbstrip-float li {
871 | display: block;
872 | height: 60px;
873 | margin: 0 2px;
874 | list-style: none;
875 | float: left;
876 | }
877 | .highslide-thumbstrip-float img {
878 | display: inline;
879 | border-color: silver;
880 | max-height: 56px;
881 | }
882 | .highslide-thumbstrip-float .highslide-active-anchor img {
883 | border-color: black;
884 | }
885 | .highslide-thumbstrip-float .highslide-scroll-up div, .highslide-thumbstrip-float .highslide-scroll-down div {
886 | display: none;
887 | }
888 | .highslide-thumbstrip-float .highslide-marker {
889 | display: none;
890 | }
--------------------------------------------------------------------------------
/static/highslide/highslide.packed.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Name: Highslide JS
3 | * Version: 5.0.0 (2016-05-24)
4 | * Config: default +packed
5 | * Author: Torstein Hønsi
6 | * Support: www.highslide.com/support
7 | * License: MIT
8 | */
9 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('q(!m){u m={1E:{8k:\'6Y\',6T:\'93...\',6S:\'6b 1K 92\',7S:\'6b 1K 91 1K 8Z\',7H:\'90 1K 94 I (f)\',8z:\'95 2u 6U 6Q\',8x:\'9a 1K 98 6U 6Q 97\',5U:\'6b 1K 2g 1W, 96 6V 8Y 1K 3c. 8X 8Q 8P Q 1z 6V 6I.\'},43:\'1d/8O/\',4B:\'8M.6v\',3R:\'8N.6v\',7T:59,7L:59,42:15,8s:15,47:15,81:15,3L:8R,7f:0.75,8j:G,5T:5,30:2,8S:3,3W:19,7M:\'2S 2o\',7Y:1,85:G,8o:\'8W://1d.8V/\',8u:\'8U\',6H:G,5h:[\'a\'],68:G,3X:6W,3V:6W,3N:G,1g:\'8T-9b\',3U:[],5i:G,N:[],5m:[\'3N\',\'2e\',\'1g\',\'30\',\'9c\',\'9u\',\'9t\',\'6Z\',\'9s\',\'9q\',\'9r\',\'71\',\'8w\',\'68\',\'M\',\'14\',\'60\',\'3X\',\'3V\',\'57\',\'5r\',\'86\',\'3a\',\'1J\',\'7R\',\'7Q\',\'1k\'],1x:[],3B:0,9v:{x:[\'8a\',\'18\',\'6d\',\'2o\',\'7z\'],y:[\'46\',\'Y\',\'6a\',\'2S\',\'4l\']},4v:{},71:{},6Z:{},2z:[],2M:{},6m:{},4w:[],1R:K.9A||6h((4x.6e.5a().2X(/.+(?:6P|9z|9y|1Q)[\\/: ]([\\d.]+)/)||[0,\'0\'])[1]),1Q:(K.3S&&!1m.2q),4D:/9x/.17(4x.6e),8t:/9p.+6P:1\\.[0-8].+9o/.17(4x.6e),$:A(1t){q(1t)C K.9h(1t)},2c:A(24,2x){24[24.W]=2x},11:A(6G,35,2E,6k,6E){u B=K.11(6G);q(35)m.2p(B,35);q(6E)m.U(B,{9f:0,9d:\'3q\',5s:0});q(2E)m.U(B,2E);q(6k)6k.2k(B);C B},2p:A(B,35){Q(u x 3v 35)B[x]=35[x];C B},U:A(B,2E){Q(u x 3v 2E){q(m.31&&x==\'1p\'){q(2E[x]>0.99)B.F.9e(\'3P\');L B.F.3P=\'7o(1p=\'+(2E[x]*1X)+\')\'}L B.F[x]=2E[x]}},3p:A(B,R,26){u 2P,3h,2O;q(1o 26!=\'5R\'||26===H){u 2v=7A;26={2T:2v[2],1J:2v[3],5w:2v[4]}}q(1o 26.2T!=\'3g\')26.2T=59;26.1J=1b[26.1J]||1b.6R;26.4g=m.2p({},R);Q(u 2d 3v R){u e=1Z m.1j(B,26,2d);2P=6h(m.5j(B,2d))||0;3h=6h(R[2d]);2O=2d!=\'1p\'?\'D\':\'\';e.2y(2P,3h,2O)}},5j:A(B,R){q(B.F[R]){C B.F[R]}L q(K.6l){C K.6l.8m(B,H).7F(R)}L{q(R==\'1p\')R=\'3P\';u 2x=B.8L[R.2Y(/\\-(\\w)/g,A(a,b){C b.9j()})];q(R==\'3P\')2x=2x.2Y(/7o\\(1p=([0-9]+)\\)/,A(a,b){C b/1X});C 2x===\'\'?1:2x}},4u:A(){u d=K,w=1m,3E=d.5c&&d.5c!=\'5d\'?d.3e:d.4q,31=m.1Q&&(m.1R<9||1o 7q==\'1V\');u M=31?3E.7r:(d.3e.7r||4a.9n),14=31?3E.9m:4a.9l;m.2I={M:M,14:14,4I:31?3E.4I:7q,4L:31?3E.4L:9k};C m.2I},63:A(B){u p={x:B.7g,y:B.78};3t(B.7h){B=B.7h;p.x+=B.7g;p.y+=B.78;q(B!=K.4q&&B!=K.3e){p.x-=B.4I;p.y-=B.4L}}C p},4z:A(a,21,2y,J){q(!a)a=m.11(\'a\',H,{3r:\'3q\'},m.1S);q(1o a.3G==\'A\')C 21;1A{1Z m.45(a,21,2y);C 19}1B(e){C G}},6K:A(){u 5W=0,4X=-1,N=m.N,z,1n;Q(u i=0;i5W){5W=1n;4X=i}}}q(4X==-1)m.2r=-1;L N[4X].3x()},5e:A(a,3I){a.3G=a.3y;u p=a.3G?a.3G():H;a.3G=H;C(p&&1o p[3I]!=\'1V\')?p[3I]:(1o m[3I]!=\'1V\'?m[3I]:H)},5k:A(a){u 1k=m.5e(a,\'1k\');q(1k)C 1k;C a.3u},3F:A(1t){u 4h=m.$(1t),2U=m.6m[1t],a={};q(!4h&&!2U)C H;q(!2U){2U=4h.7c(G);2U.1t=\'\';m.6m[1t]=2U;C 4h}L{C 2U.7c(G)}},3k:A(d){q(d)m.5F.2k(d);m.5F.3H=\'\'},7b:A(66,z){u 2F=z||m.2A();z=2F;q(m.2V)C 19;L m.2F=2F;m.3i(K,1m.2q?\'4O\':\'4R\',m.3A);1A{m.2V=66;66.3y()}1B(e){m.2F=m.2V=H}1A{z.2g()}1B(e){}C 19},49:A(B,20){u z=m.2A(B);q(z)C m.7b(z.5l(20),z);L C 19},6I:A(B){C m.49(B,-1)},1z:A(B){C m.49(B,1)},3A:A(e){q(!e)e=1m.1F;q(!e.1P)e.1P=e.6A;q(1o e.1P.7i!=\'1V\')C G;u z=m.2A();u 20=H;7u(e.8C){1q 70:q(z)z.5L();C G;1q 32:1q 34:1q 39:1q 40:20=1;6q;1q 8:1q 33:1q 37:1q 38:20=-1;6q;1q 27:1q 13:20=0}q(20!==H){m.3i(K,1m.2q?\'4O\':\'4R\',m.3A);q(!m.6H)C G;q(e.4M)e.4M();L e.8K=19;q(z){q(20==0){z.2g()}L{m.49(z.S,20)}C 19}}C G},8I:A(O){m.2c(m.1x,m.2p(O,{22:\'22\'+m.3B++}))},65:A(6C,4c){u B,2R=/^1d-V-([0-9]+)$/;B=6C;3t(B.2W){q(B.1t&&2R.17(B.1t))C B.1t.2Y(2R,"$1");B=B.2W}q(!4c){B=6C;3t(B.2W){q(B.4f&&m.4H(B)){Q(u S=0;S1)C G;q(!e.1P)e.1P=e.6A;u B=e.1P;3t(B.2W&&!(/1d-(1W|3c|51|2Z)/.17(B.1h))){B=B.2W}u z=m.2A(B);q(z&&(z.6i||!z.3Y))C G;q(z&&e.J==\'7a\'){q(e.1P.7i)C G;u 2X=B.1h.2X(/1d-(1W|3c|2Z)/);q(2X){m.1U={z:z,J:2X[1],18:z.x.E,M:z.x.I,Y:z.y.E,14:z.y.I,7m:e.4J,7e:e.4i};m.1D(K,\'6y\',m.6z);q(e.4M)e.4M();q(/1d-(1W|51)-5V/.17(z.Z.1h)){z.3x();m.6D=G}C 19}}L q(e.J==\'7p\'){m.3i(K,\'6y\',m.6z);q(m.1U){q(m.3f&&m.1U.J==\'1W\')m.1U.z.Z.F.2K=m.3f;u 2C=m.1U.2C;q(!2C&&!m.6D&&!/(3c|2Z)/.17(m.1U.J)){z.2g()}L q(2C||(!2C&&m.8F)){m.1U.z.44(\'1i\')}m.6D=19;m.1U=H}L q(/1d-1W-5V/.17(B.1h)){B.F.2K=m.3f}}C 19},6z:A(e){q(!m.1U)C G;q(!e)e=1m.1F;u a=m.1U,z=a.z;a.58=e.4J-a.7m;a.6n=e.4i-a.7e;u 6p=1b.a7(1b.74(a.58,2)+1b.74(a.6n,2));q(!a.2C)a.2C=(a.J!=\'1W\'&&6p>0)||(6p>(m.aj||5));q(a.2C&&e.4J>5&&e.4i>5){q(a.J==\'2Z\')z.2Z(a);L{z.5I(a.18+a.58,a.Y+a.6n);q(a.J==\'1W\')z.Z.F.2K=\'3c\'}}C 19},88:A(e){1A{q(!e)e=1m.1F;u 4C=/ao/i.17(e.J);q(!e.1P)e.1P=e.6A;q(!e.4K)e.4K=4C?e.ai:e.9C;u z=m.2A(e.1P);q(!z.3Y)C;q(!z||!e.4K||m.2A(e.4K,G)==z||m.1U)C;Q(u i=0;i=k.1w.2T+k.5E){k.2N=k.3h;k.E=k.5C=1;k.5x();k.1w.4g[k.R]=G;u 5v=G;Q(u i 3v k.1w.4g)q(k.1w.4g[i]!==G)5v=19;q(5v){q(k.1w.5w)k.1w.5w.7d(k.1M)}C 19}L{u n=t-k.5E;k.5C=n/k.1w.2T;k.E=k.1w.1J(n,0,1,k.1w.2T);k.2N=k.2P+((k.3h-k.2P)*k.E);k.5x()}C G}};m.2p(m.1j,{2w:{1p:A(1j){m.U(1j.1M,{1p:1j.2N})},79:A(1j){1A{q(1j.1M.F&&1j.1M.F[1j.R]!=H)1j.1M.F[1j.R]=1j.2N+1j.2O;L 1j.1M[1j.R]=1j.2N}1B(e){}}}});m.3Z=A(1g,2Q){k.2Q=2Q;k.1g=1g;u v=m.1R,4V;k.5J=m.1Q&&m.1R<7;q(!1g){q(2Q)2Q();C}m.6x();k.2a=m.11(\'2a\',{9W:0},{1c:\'1i\',1e:\'23\',9V:\'9X\',M:0},m.1S,G);u 5N=m.11(\'5N\',H,H,k.2a,1);k.1I=[];Q(u i=0;i<=8;i++){q(i%3==0)4V=m.11(\'4V\',H,{14:\'2j\'},5N,G);k.1I[i]=m.11(\'1I\',H,H,4V,G);u F=i!=4?{a0:0,9Z:0}:{1e:\'6j\'};m.U(k.1I[i],F)}k.1I[4].1h=1g+\' 1d-1a\';k.7l()};m.3Z.55={7l:A(){u 1k=m.43+(m.9L||"9O/")+k.1g+".9N";u 73=m.4D&&m.1R<7Z?m.1S:H;k.2m=m.11(\'1f\',H,{1e:\'23\',Y:\'-3K\'},73,G);u 7t=k;k.2m.4U=A(){7t.6X()};k.2m.1k=1k},6X:A(){u o=k.1l=k.2m.M/4,E=[[0,0],[0,-4],[-2,0],[0,-8],0,[-2,-8],[0,-2],[0,-6],[-2,-2]],1v={14:(2*o)+\'D\',M:(2*o)+\'D\'};Q(u i=0;i<=8;i++){q(E[i]){q(k.5J){u w=(i==1||i==7)?\'1X%\':k.2m.M+\'D\';u 1N=m.11(\'1N\',H,{M:\'1X%\',14:\'1X%\',1e:\'6j\',2L:\'1i\'},k.1I[i],G);m.11(\'1N\',H,{3P:"af:9Y.9U.a1(a8=9I, 1k=\'"+k.2m.1k+"\')",1e:\'23\',M:w,14:k.2m.14+\'D\',18:(E[i][0]*o)+\'D\',Y:(E[i][1]*o)+\'D\'},1N,G)}L{m.U(k.1I[i],{9J:\'5S(\'+k.2m.1k+\') \'+(E[i][0]*o)+\'D \'+(E[i][1]*o)+\'D\'})}q(1m.2q&&(i==3||i==5))m.11(\'1N\',H,1v,k.1I[i],G);m.U(k.1I[i],1v)}}k.2m=H;q(m.2M[k.1g])m.2M[k.1g].4p();m.2M[k.1g]=k;q(k.2Q)k.2Q()},3C:A(E,1l,6N,2t,1J){u z=k.z,9F=z.V.F,1l=1l||0,E=E||{x:z.x.E+1l,y:z.y.E+1l,w:z.x.P(\'1u\')-2*1l,h:z.y.P(\'1u\')-2*1l};q(6N)k.2a.F.1c=(E.h>=4*k.1l)?\'1T\':\'1i\';m.U(k.2a,{18:(E.x-k.1l)+\'D\',Y:(E.y-k.1l)+\'D\',M:(E.w+2*k.1l)+\'D\'});E.w-=2*k.1l;E.h-=2*k.1l;m.U(k.1I[4],{M:E.w>=0?E.w+\'D\':0,14:E.h>=0?E.h+\'D\':0});q(k.5J)k.1I[3].F.14=k.1I[5].F.14=k.1I[4].F.14},4p:A(6O){q(6O)k.2a.F.1c=\'1i\';L m.3k(k.2a)}};m.4W=A(z,1v){k.z=z;k.1v=1v;k.2H=1v==\'x\'?\'ax\':\'av\';k.2D=k.2H.5a();k.3O=1v==\'x\'?\'ar\':\'au\';k.5o=k.3O.5a();k.5g=1v==\'x\'?\'az\':\'aA\';k.aG=k.5g.5a();k.1C=k.2l=0};m.4W.55={P:A(S){7u(S){1q\'5M\':C k.1r+k.2i+(k.t-m.1G[\'1l\'+k.2H])/2;1q\'1u\':C k.I+2*k.X+k.1C+k.2l;1q\'3o\':C k.56-k.2J-k.54;1q\'5D\':C k.P(\'3o\')-2*k.X-k.1C-k.2l;1q\'3Q\':C k.E-(k.z.1a?k.z.1a.1l:0);1q\'64\':C k.P(\'1u\')+(k.z.1a?2*k.z.1a.1l:0);1q\'4e\':C k.1y?1b.5b((k.I-k.1y)/2):0}},5z:A(){k.X=(k.z.Z[\'1l\'+k.2H]-k.t)/2;k.54=m[\'5s\'+k.5g]},5p:A(){k.t=k.z.B[k.2D]?aC(k.z.B[k.2D]):k.z.B[\'1l\'+k.2H];k.1r=k.z.1r[k.1v];k.2i=(k.z.B[\'1l\'+k.2H]-k.t)/2;q(k.1r==0||k.1r==-1){k.1r=(m.2I[k.2D]/2)+m.2I[\'2B\'+k.3O]}},5y:A(){u z=k.z;k.3n=\'2j\';k.E=k.1r-k.X+k.2i;q(k.5r&&k.1v==\'x\')z.57=1b.29(z.57||k.T,z.5r*k.T/z.y.T);k.I=1b.29(k.T,z[\'5Z\'+k.2H]||k.T);k.1Y=z.3N?1b.29(z[\'29\'+k.2H],k.T):k.T;q(z.3d&&z.2e){k.I=z[k.2D];k.1y=k.T}q(k.1v==\'x\'&&m.3W)k.1Y=z.3X;k.2J=m[\'5s\'+k.3O];k.2B=m.2I[\'2B\'+k.3O];k.56=m.2I[k.2D]},67:A(i){u z=k.z;q(z.3d&&(z.2e||m.3W)){k.1y=i;k.I=1b.5Z(k.I,k.1y);z.Z.F[k.5o]=k.P(\'4e\')+\'D\'}L k.I=i;z.Z.F[k.2D]=i+\'D\';z.V.F[k.2D]=k.P(\'1u\')+\'D\';q(z.1a)z.1a.3C();q(k.1v==\'x\'&&z.1s)z.3b(G)},5X:A(i){k.E=i;k.z.V.F[k.5o]=i+\'D\';q(k.z.1a)k.z.1a.3C()}};m.45=A(a,21,2y,2b){q(K.ad&&m.1Q&&!m.5n){m.1D(K,\'2G\',A(){1Z m.45(a,21,2y,2b)});C}k.a=a;k.2y=2y;k.2b=2b||\'1W\';k.3d=!k.ak;m.5i=19;k.1x=[];m.6x();u S=k.S=m.N.W;Q(u i=0;i(k.x.1y||k.x.I)){k.8r();q(k.1x.W==1)k.3b()}}k.7E()}1B(e){k.5P(e)}},3n:A(p,3l){u a5,a3=p.1P,1v=p==k.x?\'x\':\'y\';u 5B=19;u 3m=p.z.3N;p.E=1b.5b(p.E-((p.P(\'1u\')-p.t)/2));q(p.Ep.2B+p.56-p.54){q(!3l&&5B&&3m){p.I=1b.29(p.I,p.P(1v==\'y\'?\'3o\':\'5D\'))}L q(p.P(\'1u\')1H){ 1O=25*1H;q(1Ok.3V&&x.I>k.3X&&y.P(\'1u\')>y.P(\'3o\')){y.I-=10;q(1H)x.I=y.I*1H;k.3b(0,1);2n=G}}C 2n},7E:A(){u x=k.x,y=k.y;k.44(\'1i\');k.6f(1,{V:{M:x.P(\'1u\'),14:y.P(\'1u\'),18:x.E,Y:y.E},Z:{18:x.1C+x.P(\'4e\'),Y:y.1C+y.P(\'4e\'),M:x.1y||x.I,14:y.1y||y.I}},m.7T)},6f:A(28,1K,2t){q(k.1a&&!k.30){q(28)k.1a.3C();L k.1a.4p()}q(!28)k.8q();u z=k,x=z.x,y=z.y,1J=k.1J;q(!28)1J=k.7R||1J;u 80=28?A(){q(z.1a)z.1a.2a.F.1c="1T";5A(A(){z.7W()},50)}:A(){z.5G()};q(28)m.U(k.V,{M:x.t+\'D\',14:y.t+\'D\'});q(k.7Q){m.U(k.V,{1p:28?0:1});m.2p(1K.V,{1p:28})}m.3p(k.V,1K.V,{2T:2t,1J:1J,2w:A(2x,2v){q(z.1a&&z.30&&2v.R==\'Y\'){u 3J=28?2v.E:1-2v.E;u E={w:x.t+(x.P(\'1u\')-x.t)*3J,h:y.t+(y.P(\'1u\')-y.t)*3J,x:x.1r+(x.E-x.1r)*3J,y:y.1r+(y.E-y.1r)*3J};z.1a.3C(E,0,1)}}});m.3p(k.Z,1K.Z,2t,1J,80);q(28){k.V.F.1c=\'1T\';k.Z.F.1c=\'1T\';k.a.1h+=\' 1d-8l-8y\'}},7W:A(){k.3Y=G;k.3x();q(m.2V&&m.2V==k.a)m.2V=H;k.7B();u p=m.2I,5t=m.4v.x+p.4I,5q=m.4v.y+p.4L;k.6w=k.x.E<5t&&5tk.x.P(\'3Q\')+k.x.P(\'64\'));u 7C=(2f.y+2f.hk.y.P(\'3Q\')+k.y.P(\'64\'));u 4m=m.65(16[i]);q(!7K&&!7C&&4m!=k.S){q(!1L){16[i].3T(\'1i-2u\',\'[\'+k.S+\']\');16[i].61=16[i].F[R];16[i].F[R]=\'1i\'}L q(1L.7x(\'[\'+k.S+\']\')==-1){16[i].3T(\'1i-2u\',1L+\'[\'+k.S+\']\')}}L q((1L==\'[\'+k.S+\']\'||m.2r==4m)&&4m!=k.S){16[i].3T(\'1i-2u\',\'\');16[i].F[R]=16[i].61||\'\'}L q(1L&&1L.7x(\'[\'+k.S+\']\')>-1){16[i].3T(\'1i-2u\',1L.2Y(\'[\'+k.S+\']\',\'\'))}}}}},3x:A(){k.V.F.1n=m.3L+=2;Q(u i=0;i.*?$/,"").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1="rgb($2)" $1-opacity="$3"').replace(/ /g,"\u00a0").replace(//g,"\u00ad").replace(/
/g,"<$1title>").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/ id=([^" >]+)/g,
14 | ' id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(a){var b=this,e,c,g,j,h,d=l(b.options,a),m=d.exporting.allowHTML;if(!k.createElementNS)k.createElementNS=function(a,b){return k.createElement(b)};c=s("div",null,{position:"absolute",top:"-9999em",width:b.chartWidth+"px",height:b.chartHeight+"px"},k.body);
15 | g=b.renderTo.style.width;h=b.renderTo.style.height;g=d.exporting.sourceWidth||d.chart.width||/px$/.test(g)&&parseInt(g,10)||600;h=d.exporting.sourceHeight||d.chart.height||/px$/.test(h)&&parseInt(h,10)||400;r(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:g,height:h});d.exporting.enabled=!1;delete d.data;d.series=[];q(b.series,function(a){j=l(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});j.isInternal||d.series.push(j)});a&&q(["xAxis",
16 | "yAxis"],function(b){q(F(a[b]),function(a,c){d[b][c]=l(d[b][c],a)})});e=new f.Chart(d,b.callback);q(["xAxis","yAxis"],function(a){q(b[a],function(b,c){var d=e[a][c],f=b.getExtremes(),g=f.userMin,f=f.userMax;d&&(g!==void 0||f!==void 0)&&d.setExtremes(g,f,!0,!1)})});g=e.getChartHTML();d=null;e.destroy();u(c);if(m&&(c=g.match(/<\/svg>(.*?$)/)))c=''+c[1]+"",g=g.replace("",c+"");
17 | g=this.sanitizeSVG(g);return g=g.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'")},getSVGForExport:function(a,b){var e=this.options.exporting;return this.getSVG(l({chart:{borderRadius:0}},e.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||e.sourceWidth,sourceHeight:a&&a.sourceHeight||e.sourceHeight}}))},exportChart:function(a,b){var e=this.getSVGForExport(a,b),a=l(this.options.exporting,a);f.post(a.url,{filename:a.filename||"chart",type:a.type,width:a.width||0,scale:a.scale||
18 | 2,svg:e},a.formAttributes)},print:function(){var a=this,b=a.container,e=[],c=b.parentNode,f=k.body,j=f.childNodes,h=a.options.exporting.printMaxWidth,d,m,n;if(!a.isPrinting){a.isPrinting=!0;a.pointer.reset(null,0);E(a,"beforePrint");if(n=h&&a.chartWidth>h)d=a.hasUserSize,m=[a.chartWidth,a.chartHeight,!1],a.setSize(h,a.chartHeight,!1);q(j,function(a,b){if(a.nodeType===1)e[b]=a.style.display,a.style.display="none"});f.appendChild(b);t.focus();t.print();setTimeout(function(){c.appendChild(b);q(j,function(a,
19 | b){if(a.nodeType===1)a.style.display=e[b]});a.isPrinting=!1;if(n)a.setSize.apply(a,m),a.hasUserSize=d;E(a,"afterPrint")},1E3)}},contextMenu:function(a,b,e,c,f,j,h){var d=this,m=d.options.navigation,n=m.menuItemStyle,o=d.chartWidth,p=d.chartHeight,l="cache-"+a,i=d[l],w=G(f,j),y,z,t,u=function(b){d.pointer.inClass(b.target,a)||z()};if(!i)d[l]=i=s("div",{className:a},{position:"absolute",zIndex:1E3,padding:w+"px"},d.container),y=s("div",null,r({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",
20 | boxShadow:"3px 3px 10px #888"},m.menuStyle),i),z=function(){x(i,{display:"none"});h&&h.setState(0);d.openMenu=!1},v(i,"mouseleave",function(){t=setTimeout(z,500)}),v(i,"mouseenter",function(){clearTimeout(t)}),v(k,"mouseup",u),v(d,"destroy",function(){D(k,"mouseup",u)}),q(b,function(a){if(a){var b=a.separator?s("hr",null,null,y):s("div",{onmouseover:function(){x(this,m.menuItemHoverStyle)},onmouseout:function(){x(this,n)},onclick:function(b){b&&b.stopPropagation();z();a.onclick&&a.onclick.apply(d,
21 | arguments)},innerHTML:a.text||d.options.lang[a.textKey]},r({cursor:"pointer"},n),y);d.exportDivElements.push(b)}}),d.exportDivElements.push(y,i),d.exportMenuWidth=i.offsetWidth,d.exportMenuHeight=i.offsetHeight;b={display:"block"};e+d.exportMenuWidth>o?b.right=o-e-f-w+"px":b.left=e-w+"px";c+j+d.exportMenuHeight>p&&h.alignOptions.verticalAlign!=="top"?b.bottom=p-c-w+"px":b.top=c+j-w+"px";x(i,b);d.openMenu=!0},addButton:function(a){var b=this,e=b.renderer,c=l(b.options.navigation.buttonOptions,a),g=
22 | c.onclick,j=c.menuItems,h,d,m={stroke:c.symbolStroke,fill:c.symbolFill},n=c.symbolSize||12;if(!b.btnCount)b.btnCount=0;if(!b.exportDivElements)b.exportDivElements=[],b.exportSVGElements=[];if(c.enabled!==!1){var o=c.theme,p=o.states,k=p&&p.hover,p=p&&p.select,i;delete o.states;g?i=function(a){a.stopPropagation();g.call(b,a)}:j&&(i=function(){b.contextMenu(d.menuClassName,j,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?o.paddingLeft=f.pick(o.paddingLeft,25):c.text||
23 | r(o,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,i,o,k,p).attr({title:b.options.lang[c._titleKey],"stroke-linecap":"round",zIndex:3});d.menuClassName=a.menuClassName||"highcharts-menu-"+b.btnCount++;c.symbol&&(h=e.symbol(c.symbol,c.symbolX-n/2,c.symbolY-n/2,n,n).attr(r(m,{"stroke-width":c.symbolStrokeWidth||1,zIndex:1})).add(d));d.add().align(r(c,{width:d.width,x:f.pick(c.x,B)}),!0,"spacingBox");B+=(d.width+c.buttonSpacing)*(c.align==="right"?-1:1);b.exportSVGElements.push(d,h)}},
24 | destroyExport:function(a){var a=a.target,b,e;for(b=0;b= len(model.layers):
76 | # we don't look at the last (fully-connected) layers in the savefile
77 | break
78 | g = f['layer_{}'.format(k)]
79 | weights = [g['param_{}'.format(p)] for p in range(g.attrs['nb_params'])]
80 | model.layers[k].set_weights(weights)
81 | f.close()
82 | model.save_weights('vgg16_cnn_only_weights.h5')
83 |
84 |
85 | def load_vgg16_cnn_model(input_layer, weights_path='vgg16_cnn_only_weights.h5'):
86 | model = vgg16_cnn_model(input_layer)
87 | model.load_weights(weights_path)
88 | print('Model loaded.')
89 | return model
90 |
--------------------------------------------------------------------------------