Writ

From XiphWiki
Revision as of 00:54, 27 October 2004 by 60.25.121.110 (talk)
Jump to navigation Jump to search

Introduction

Ogg Writ is a text phrase codec. While its primary purpose is to embed subtitles or captions in a Theora stream, its design makes it useful for many other purposes. It could provide lyrics to song encoded in Vorbis, a transcript to a political debate encoded in Speex, or even incorporate a live chat session as part of a continuous video stream.

One of the unique aspects of Writ is its discontinuous nature, that is, unlike other Ogg codecs the granules for which seperate packets effect may overlap. See the Granules and Muxing section below for how this works.


SVN

Current Ogg Writ development is on Xiph SVN as /trunk/writ/. It's being developed to use libogg2, so you'll need both to work on it. The reference encoder and decoder are available as part of the py-ogg2 package which is available on Xiph SVN as /trunk/py-ogg2/.


This is a (near final) working draft of the spec
Writ has been designed so that encoders/decoders can support a bare minimum and be fully compatable with future subversions. Each subversion adds a new feature, some building on others, adding a new header packet and likely a new field to each body packet.

Decoders should ignore header packets beyond what they were written to support and also ignore extra fields in data packets beyond their current version. This allows new features to be added without requiring that all software, or even most software, to support them.

We will be conservative about adding future subversions.

Header Packet 0 (BOS, 16 bytes):
 0x00                                   ( 8 bit Header 0)
 "writ" (LSB 0x74697277)                (32 bit codec identification)
 version                                ( 8 bit unsigned int, 0 = Alpha)
 subversion                             ( 8 bit unsigned int)
 granulerate_numerator                  (32 bit unsigned int)
 granulerate_denominator                (32 bit unsigned int)

Data Packet (each):
 0xFF                                   ( 8 bit 0xFF = data packet)
 granule_start                          (64 bit signed integer)
 granule_duration                       (32 bit unsigned integer)
 text_length                            ( 8 bit unsigned integer)
 text_string                            (variable-length UTF-8 string)


<B>Subversion 1 adds multiple language support</B>

Header Packet 1 (Language Definition, 8+ bytes) :
 0x01                                   ( 8 bit Header 1)
 "writ" (LSB 0x74697277)                (32 bit codec identification)
 num_languages                          ( 8 bit unsigned int)
 [repeated 1+num_languages times] :
   language_length                      ( 8 bit unsigned int)
   language_string                      (0+language_length rfc3066)
   language_desc_length                 ( 8 bit unsigned int)
   language_desc_string                 (0+language_desc_length UTF-8)

Data Packet (each):
 0xFF                                   ( 8 bit 0xFF = data packet)
 granule_start                          (64 bit signed integer)
 granule_duration                       (32 bit unsigned integer)
 [repeated num_languages times] :
   text_length                          ( 8 bit unsigned integer)
   text_string                          (variable-length UTF-8 string)


<B>Subversion 2 adds text window support</B>

Header Packet 2 (Window Definition, 10+ bytes) :
 0x02                                   ( 8 bit Header 2)
 "writ" (LSB 0x74697277)                (32 bit codec identification)
 location_scale_x                       (16 bit unsigned int)
 location_scale_y                       (16 bit unsigned int)
 num_windows                            ( 8 bit unsigned int)
 [if (window_num > 0) repeated window_num times] :
   location_x                           (variable length, see below)
   location_y                           (variable length, see below)
   location_width                       (variable length, see below)
   location_height                      (variable length, see below)
   alignment_x                          ( 2 bit alignment, see below)
   alignment_y                          ( 2 bit alignment, see below)

Data Packet (each):
 0xFF                                   ( 8 bit 0xFF = data packet)
 granule_start                          (64 bit signed integer)
 granule_duration                       (32 bit unsigned integer)
 [repeated num_languages times] :
   text_length                          ( 8 bit unsigned integer)
   text_string                          (variable-length UTF-8 string)
 [if (window_num > 1)] :
   window_id                            ( 8 bit unsigned integer)


<B>Example Stream</B>
 Header Packet 0
  version 0
  subversion 2
  granulenum 1
  granuledom 1
 \x00writ\x00\x02\x01\x00\x00\x00\x01\x00\x00\x00

 Header Packet 1
  num_languages 2
   Language 0:
    language en
    language_desc English
   Language 1:
    language es
    language_desc Spanish
 \x01writ\x01\x02en\x07English\x02es\x07Spanish

 Header Packet 2
  location_scale_x 4000 (12 bits)
  location_scale_y 270  ( 9 bits)
  num_windows 2
   Window 0:
    location_x 1
    location_y 2
    location_width 3
    location_height 1
    alignment_x 3 (Full)
    alignment_y 3 (Full)
   Window 1:
    location_x 5
    location_y 6
    location_width 7
    location_height 1
    alignment_x 3 (Full)
    alignment_y 3 (Full)
 \x02writ\xa0\x0f\x0e\x01\x02\x01\x20\x60\x00\x02\x7c\x01\x18\x38\x80\x00\x0f

 Phrase Packet:
  granule_start 5
  granule_duration 10
  Language 0: "Hello World!"
  Language 1: "Hola, Mundo!"
  window_id 0
 \xff\x05\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0cHello World!\x0cHola, Mundo!\x00

 Phrase Packet:
  granule_start 12
  granule_duration 15
  Language 0: "It's a beautiful day to be born."
  Language 1: "Es un día hermoso para que se llevará."
  window_id 1
 \xff\x0c\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x20It's a beautiful day to be born.\x26Es un d\xeda hermoso para que se llevar\xe1.\x01


Granules and Muxing

Granulepos in Writ (as well as future discontinuous codecs) will be by start time, not end time, that the data in a given page is tagged for. This greatly simplifies this specification (see the old method below).

All Writ phrases will be provided at and given the granulepos of their start time, ordered by their start time within the logical bitstream.

Phrase packets with long durations should be repeated in the logical bitstream at regular intervals to ensure that a player seeking to the middle of their duration will still see them. These packet copies will be identical to their original, including the start and duration fields, the granulepos of the page they reside on will be incremented for each copy to place it forward on the logical bitstream.

No two phrases can start on the same granule. On decoding, each packets' start granule is checked against already known packets. If a match is found the new packet is ignored. This prevents phrase copies from being interpreted as new phrases.

Seeking Example


Here is a timeline (granule numbers at top, read down) of a sample stream:

                        <- Granules ->
0000000000111111111122222222223333333333444444444455555555556666666666
0123456789012345678901234567890123456789012345678901234567890123456789
 ___________  ____________  ____________  ____________  _____________
|_Vorbis____||_Vorbis_____||_Vorbis_____||_Vorbis_____||_Vorbis______|
 ____________________   ____________________________________
|_A____________>_____| |_D____________>______________>______|
     _________      ___    __________     ___________
    |_B_______|    |_C_|  |_E________|   |_F_________|

 (note: these have been seperated vertically for easy viewing only)

Packet  Granule Description
 V H0   0       Vorbis Header 0x01 (page by itself)
 W H0   0       Writ Header 0 (page by itself)
 V H1   0       Vorbis Header 0x03
 V H2   0       Vorbis Header 0x05
 W H1   0       Writ Header 1 (Language Defs)
 W H2   0       Writ Header 2 (Window Defs)
 W A    0       Writ Phrase A
 W B    4       Writ Phrase B
 V      12      Vorbis 0-12
 W A    15      Writ Phrase A
 W C    19      Writ Phrase C
 W D    23      Writ Phrase D
 V      26      Vorbis 13-26
 W E    26      Writ Phrase E
 W D    38      Writ Phrase D
 V      40      Vorbis 27-40
 W F    41      Writ Phrase F
 W D    53      Writ Phrase D (EOF)
 V      54      Vorbis 41-54
 V      69      Vorbis 55-69 (EOF)

Player begins decoding at beginning of stream. It reads the BOS pages for both codecs, then receives a non-BOS page. At this point it knows that it has two bitstreams to decode and has resolved that one is Writ and the other Vorbis. It'll continue processing the headers for both.

Next it's going to find two Writ packets (phrases A and B) and toss them into libwrit. Then it'll get to the first Vorbis data page. It now has data from both bitstreams, and it knows (from the granulepos on the Vorbis page) that it has enough data to run until 12. If there were any Writ packets before 12 they would have appeared first.

At around granule 9 the listener seeks forward to 24. This will cause a rapid seek through the file to find the first page with a granulepos greater than the seek position and begin decoding at that point.

It'll find a Vorbis packet containing 13-26 (and not use 13-23) and Writ phrase E. Again, having data from both bitstreams it can begin playing. D would normally appear at granule 24 but is not known about yet. The player knows that this is only enough to decode until 26 so, knowing enough to prebuffer, continues reading the file as it plays the media.

The next packet it finds is Writ phrase D, and passing it to libwrit, is found that the current granulepos is within the duration. It is thus displayed immediatly, as it's prebuffered, without waiting for granulepos 38. It'll keep reading (because the maximum decoded Vorbis is still 26) and find a Vorbis packet with a 40 granulepos.

As it nears 38 it'll read the file again and find Writ phrase F, which takes it out to 41. Vorbis only goes until 40, so it'll have to keep reading until the next Vorbis packet.

Next it'll find Writ phrase D, which will be ignored by libwrit because phrase D is already known (matches start granule of earlier D), and the EOF on that page marks this as the last of the Writ stream.

It'll continue reading for the next Vorbis data and find the packet for granule 54, followed by the Vorbis packet for granule 69. With that it's EOS, EOF, finished.

This is of course a simplistic example, Writ and Vorbis will rarely have granules which equal the same amount of time. Each bitstream has its' own granule -> time mapping which is calculated when muxing concurrent bitstreams within the file. So if there are 44100 Vorbis granules per second and only 4 Writ granules per second, pages would be ordered as W25 V297892 W31 V385932 W39 W41 V463057 etc. The logic used in the above example works after this granule-time mapping is calculated.


Ongoing Discussion

  • How does this get "encoded" and "merged"?
    • <purple_haese> The muxing rule is pages are arranged in ascending order by the timestamp that is represented by their granulepos.
  • For what reason is the 0x00 and 0xFF byte at the beginning of header and data packet respectively?
    • <xiphmont> If, after a seek, I hand your codec a header packet, what does the codec do?
    • <xiphmont> It does *nothing*. If I haven't told it to reset, the header is not data, *it must ignore the header*.
    • <xiphmont> this eliminates a huge raft of special cases in Ogg seeking.


"The Old Way"

The section below is for historical purposes only!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2003/08/17
  In a lengthy discussion with Monty and Derf the decidion to change the
  behavior of discontinuous bitstreams in Ogg, or rather, extend the
  current Ogg specification to handle discontinuous codecs, was made.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The Ogg granulepos of each page is equal to the expiration of the text, packets are ordered by expiration time and may overlap. So, at or before text A is to be displayed, the following sequence is included:

Physical        Text    Text    Text
Location        Packet  Start   Expire  (text expire = page granulepos)
---------------------------------------
00              B       04      14
00              D       19      23
00              C       09      24
00              F       27      34
00              E       26      37
00              G       35      47
00              H       42      54
00              A       00      59
51              I       51      66

So B, D, C, F, E, G, and H are all defined before A, building a FIFO (first in first out) buffer in the player. Encoders should limit the extend of this behavior to reduce nessesary buffer size on the player side by prematurly expiring captions and recreating them periodically.

The screen should not be updated with the new captions until they've all been processed to prevent "flicker". New caption data to the same position will scroll the previous data upwards with no line breaks seperating them (unless present in text). 107粘合剂 内墙涂料 内外浸塑防腐管道 内外墙涂料 内外墙专用腻子粉 纳米丙稀酸外墙乳胶漆 纳米材料 纳米改性氟碳涂料 纳米涂料 纳米余辉自发光涂料 耐腐蚀树脂 耐高温特种涂料 耐磨地坪骨料 耐磨地坪漆 偶联剂 哌啶系列衍生物 膨胀型过氯乙烯 皮带运输机自动纠偏装置 皮具边油 偏苯三酸酐 企口漆 汽车门窗密封条植绒胶粘剂 汽车密封胶 汽车漆 汽车涂料 汽车修补漆 汽油辛烷 强膜防水漆 羟基硅油 羟基乙腈 清漆 全丙高弹性外墙乳胶漆 全天候硅丙外墙漆 全息铝箔 全息烟膜 热固化阻焊油墨 热固性半光无光型粉末 热固性粉末 热固性粉末涂料 热固性环氧 热固性环氧聚酯粉末涂料 热固性环氧型粉末涂料 重防腐油漆 助流剂 转炉喷补料 转移膜 装饰美术纹理型粉末涂料 装饰纸色浆 装修漆 紫外固化 紫外光固化 紫外光固化产品 紫外光固化涂料 紫外光硬化阻焊油墨 自动涂装生产 自乳化丙烯酸环氧树脂 阻聚剂 阻燃剂 阻燃两用装修漆 阻燃吸音装饰板 钻井泥浆助剂 醋酸丁酯和乙酯 醋酸乙烯无光乳胶漆 大孔螯合型离子交换树脂 单力建筑胶 弹性凹凸漆 弹性建筑密封胶 弹性胶浆 弹性涂料 弹性质感涂料 导电漆 导静电地坪涂料 道路沥青 灯用卤磷酸钙荧光粉 低温固化粉末型 底色漆 地板漆 地坪涂料 电线瓷瓶 饺子模 结构胶 界面剂 金刚石磨轮 金属防腐蚀专用涂料 金属漆 金属闪光漆 金属外壳涂装 金属装饰漆 浸渍料 静电喷涂 静电涂装成套设备 静电植绒胶 聚氨脂灌封料 聚氨酯 聚氨酯单组份防腐漆 聚氨酯粉末涂料 聚氨酯互穿网络防腐涂料 硬胶漆 硬脂酸 硬脂酸锌 硬质UV哑光涂料 硬质UV罩光涂 硬质UV罩光涂料 硬质聚氨酯泡沫 钢结构防火涂料 钢结构隔热 钢性抗渗腻子 高档环保水性建筑涂料 高档聚酯漆 高分子助剂 高光外墙专用乳液 高级彩色瓦面漆 高级彩色屋面防水涂料 高级防火涂料 高级聚氨酯漆 高级闪光雨线 高级丝光乳胶漆 蓝色粉末材料 镭射烟用衬纸 冷库硬质聚氨酯泡沫 冷施工橡塑防水防腐涂料 连铸保护渣 亮光耐酒精硬胶油墨 邻苯二甲酸二丁酯 磷化液 流平剂 流态化石灰粉 热固性聚酯型粉末涂料 热固性美术纹理型粉末涂料 热喷涂锌 热熔反光标线涂料 热熔性树脂 热塑涂料 人造大理石 溶剂型工业涂料 溶剂型聚酰 溶剂型聚酰胺 有机硅改性丙烯酸外墙涂料 鞣剂 乳胶漆 乳液 锐钛型钛白粉 三聚氯氰 三片金属罐外涂料 三羟甲基丙烷三丙烯酸酯 三嗪类除草剂 三烷基 三元乙丙橡胶 色标卡 深酞兰氨基面漆 石材防护剂 石头漆 食品级氟涂料 室内乳胶漆 室温固化31570X 兽用抗生素原料药 叔丙乳液 叔醋乳液 树脂 树脂胶版油墨 树脂类地坪 双组份烤漆 水不漏 水处理产品 水墨 水性氟碳漆 水性工业涂料 水性光油 水性环保型功能性涂料 水性涂料 水性助剂 水性自乳化双酚A环氧树脂 丝光乳胶漆 丝面漆专用乳液 丝网油墨 塑胶UV上光油 塑料薄膜油墨 塑料助剂 碳钢食品容器内壁防腐涂料 陶瓷粉 特富龙涂料 特种工业涂料 特种油墨 天然真石漆 填眼灰 铁沟捣打料 涂料色浆 涂料用丙烯酸树脂 涂料用树脂 脱塑剂 外墙平涂类 外墙普通面涂料 外墙涂料 外墙有色底涂料 万能胶 网版印刷油墨 微型球铝粉 无苯稀释剂 无毒固化剂 无毒玩具漆 无毒无溶剂涂料 五氧化二钒 吸附树脂 象牙白氨基面漆 橡胶金属热硫化胶粘剂 橡胶漆 消泡剂 硝基类系列涂料 硝基漆 鞋材油漆 仿瓷涂料 水性防瓷釉涂料 压裂弹 压敏陶瓷 哑光厚质高弹弹性乳胶漆 亚光内墙乳胶 亚光内墙乳胶漆 岩棉制品 颜料糊 氧化络绿 液体氰化钠 乙烯基异丁基醚 乙烯基酯 乙氧基化 异氰酸酯 印花色浆 印花粘合剂 印刷包装胶粘剂 油封 油漆催干剂 油漆专用稀释剂 油田污水处理系列药剂 油性丙烯酸树脂 油性高抗碱底漆 有机膨润土 有机锡 玉石钢化涂料 原子灰 增稠剂 增密双层胶辊 粘合粘合剂 珍珠白氨基面漆 振利保温材料 振利涂料 整体耐磨防腐地面涂料 纸品UV涂料 制革助剂 中间包喷涂料 中密度纤维板 中涂漆 种子包衣剂 本色漆 http://www.shop263.com/i-45/1.htm http://www.shop263.com/i-45/2.htm http://www.shop263.com/i-45/3.htm http://www.shop263.com/i-45/4.htm http://www.shop263.com/i-45/5.htm http://www.shop263.com/i-45/6.htm http://www.shop263.com/i-45/7.htm http://www.shop263.com/i-45/8.htm http://www.shop263.com/i-45/9.htm http://www.shop263.com/i-45/10.htm http://www.shop263.com/i-45/11.htm http://www.shop263.com/i-45/12.htm http://www.shop263.com/i-45/13.htm http://www.shop263.com/i-45/14.htm http://www.shop263.com/i-45/15.htm http://www.shop263.com/i-45/16.htm http://www.shop263.com/i-45/17.htm http://www.shop263.com/i-45/18.htm http://www.shop263.com/i-45/19.htm http://www.shop263.com/i-45/20.htm http://www.shop263.com/i-45/21.htm http://www.shop263.com/i-45/22.htm http://www.shop263.com/i-45/23.htm http://www.shop263.com/i-45/24.htm http://www.shop263.com/i-45/25.htm http://www.shop263.com/i-45/26.htm http://www.shop263.com/i-45/27.htm http://www.shop263.com/i-45/28.htm http://www.shop263.com/i-45/29.htm http://www.shop263.com/i-45/30.htm http://www.shop263.com/i-45/31.htm http://www.shop263.com/i-45/32.htm http://www.shop263.com/i-45/33.htm http://www.shop263.com/i-45/34.htm http://www.shop263.com/i-45/35.htm http://www.shop263.com/i-45/36.htm http://www.shop263.com/i-45/37.htm http://www.shop263.com/i-45/38.htm http://www.shop263.com/i-45/39.htm http://www.shop263.com/i-45/40.htm http://www.shop263.com/i-45/41.htm http://www.shop263.com/i-45/42.htm http://www.shop263.com/i-45/43.htm http://www.shop263.com/i-45/44.htm http://www.shop263.com/i-45/45.htm http://www.shop263.com/i-45/46.htm http://www.shop263.com/i-45/47.htm http://www.shop263.com/i-45/48.htm http://www.shop263.com/i-45/49.htm http://www.shop263.com/i-45/50.htm http://www.shop263.com/i-45/51.htm http://www.shop263.com/i-45/52.htm http://www.shop263.com/i-45/53.htm http://www.shop263.com/i-45/54.htm http://www.shop263.com/i-45/55.htm http://www.shop263.com/i-45/56.htm http://www.shop263.com/i-45/57.htm http://www.shop263.com/i-45/58.htm http://www.shop263.com/i-45/59.htm http://www.shop263.com/i-45/60.htm http://www.shop263.com/i-45/61.htm http://www.shop263.com/i-45/62.htm http://www.shop263.com/i-45/63.htm http://www.shop263.com/i-45/64.htm http://www.shop263.com/i-45/65.htm http://www.shop263.com/i-45/66.htm http://www.shop263.com/i-45/67.htm http://www.shop263.com/i-45/68.htm http://www.shop263.com/i-45/69.htm http://www.shop263.com/i-45/70.htm http://www.shop263.com/i-45/71.htm http://www.shop263.com/i-45/72.htm http://www.shop263.com/i-45/73.htm http://www.shop263.com/i-45/74.htm http://www.shop263.com/i-45/75.htm http://www.shop263.com/i-45/76.htm http://www.shop263.com/i-45/77.htm http://www.shop263.com/i-45/78.htm http://www.shop263.com/i-45/79.htm http://www.shop263.com/i-45/80.htm http://www.shop263.com/i-45/81.htm http://www.shop263.com/i-45/82.htm http://www.shop263.com/i-45/83.htm http://www.shop263.com/i-45/84.htm http://www.shop263.com/i-45/85.htm http://www.shop263.com/i-45/86.htm http://www.shop263.com/i-45/87.htm http://www.shop263.com/i-45/88.htm http://www.shop263.com/i-45/89.htm http://www.shop263.com/i-45/90.htm http://www.shop263.com/i-45/91.htm http://www.shop263.com/i-45/92.htm http://www.shop263.com/i-45/93.htm http://www.shop263.com/i-45/94.htm http://www.shop263.com/i-45/95.htm http://www.shop263.com/i-45/96.htm http://www.shop263.com/i-45/97.htm http://www.shop263.com/i-45/98.htm http://www.shop263.com/i-45/99.htm http://www.shop263.com/i-45/100.htm http://www.shop263.com/i-45/101.htm http://www.shop263.com/i-45/102.htm http://www.shop263.com/i-45/103.htm http://www.shop263.com/i-45/104.htm http://www.shop263.com/i-45/105.htm http://www.shop263.com/i-45/106.htm http://www.shop263.com/i-45/107.htm http://www.shop263.com/i-45/108.htm http://www.shop263.com/i-45/109.htm http://www.shop263.com/i-45/110.htm http://www.shop263.com/i-45/111.htm http://www.shop263.com/i-45/112.htm http://www.shop263.com/i-45/113.htm http://www.shop263.com/i-45/114.htm http://www.shop263.com/i-45/115.htm http://www.shop263.com/i-45/116.htm http://www.shop263.com/i-45/117.htm http://www.shop263.com/i-45/118.htm http://www.shop263.com/i-45/119.htm http://www.shop263.com/i-45/120.htm http://www.shop263.com/i-45/121.htm http://www.shop263.com/i-45/122.htm http://www.shop263.com/i-45/123.htm http://www.shop263.com/i-45/124.htm http://www.shop263.com/i-45/125.htm http://www.shop263.com/i-45/126.htm http://www.shop263.com/i-45/127.htm http://www.shop263.com/i-45/128.htm http://www.shop263.com/i-45/129.htm http://www.shop263.com/i-45/130.htm http://www.shop263.com/i-45/131.htm http://www.shop263.com/i-45/132.htm http://www.shop263.com/i-45/133.htm http://www.shop263.com/i-45/134.htm http://www.shop263.com/i-45/135.htm http://www.shop263.com/i-45/136.htm http://www.shop263.com/i-45/137.htm http://www.shop263.com/i-45/138.htm http://www.shop263.com/i-45/139.htm http://www.shop263.com/i-45/140.htm http://www.shop263.com/i-45/141.htm http://www.shop263.com/i-45/142.htm http://www.shop263.com/i-45/143.htm http://www.shop263.com/i-45/144.htm http://www.shop263.com/i-45/145.htm http://www.shop263.com/i-45/146.htm http://www.shop263.com/i-45/147.htm http://www.shop263.com/i-45/148.htm http://www.shop263.com/i-45/149.htm http://www.shop263.com/i-45/150.htm http://www.shop263.com/i-45/151.htm http://www.shop263.com/i-45/152.htm http://www.shop263.com/i-45/153.htm http://www.shop263.com/i-45/154.htm http://www.shop263.com/i-45/155.htm http://www.shop263.com/i-45/156.htm http://www.shop263.com/i-45/157.htm http://www.shop263.com/i-45/158.htm http://www.shop263.com/i-45/159.htm http://www.shop263.com/i-45/160.htm http://www.shop263.com/i-45/161.htm http://www.shop263.com/i-45/162.htm http://www.shop263.com/i-45/163.htm http://www.shop263.com/i-45/164.htm http://www.shop263.com/i-45/165.htm http://www.shop263.com/i-45/166.htm http://www.shop263.com/i-45/167.htm http://www.shop263.com/i-45/168.htm http://www.shop263.com/i-45/169.htm http://www.shop263.com/i-45/170.htm http://www.shop263.com/i-45/171.htm http://www.shop263.com/i-45/172.htm http://www.shop263.com/i-45/173.htm http://www.shop263.com/i-45/174.htm http://www.shop263.com/i-45/175.htm http://www.shop263.com/i-45/176.htm http://www.shop263.com/i-45/177.htm http://www.shop263.com/i-45/178.htm http://www.shop263.com/i-45/179.htm http://www.shop263.com/i-45/180.htm http://www.shop263.com/i-45/181.htm http://www.shop263.com/i-45/182.htm http://www.shop263.com/i-45/183.htm http://www.shop263.com/i-45/184.htm http://www.shop263.com/i-45/185.htm http://www.shop263.com/i-45/186.htm http://www.shop263.com/i-45/187.htm http://www.shop263.com/i-45/188.htm http://www.shop263.com/i-45/189.htm http://www.shop263.com/i-45/190.htm http://www.shop263.com/i-45/191.htm http://www.shop263.com/i-45/192.htm http://www.shop263.com/i-45/193.htm http://www.shop263.com/i-45/194.htm http://www.shop263.com/i-45/195.htm http://www.shop263.com/i-45/196.htm http://www.shop263.com/i-45/197.htm http://www.shop263.com/i-45/198.htm http://www.shop263.com/i-45/199.htm http://www.shop263.com/i-45/200.htm http://www.shop263.com/i-45/201.htm http://www.shop263.com/i-45/202.htm http://www.shop263.com/i-45/203.htm http://www.shop263.com/i-45/204.htm http://www.shop263.com/i-45/205.htm http://www.shop263.com/i-45/206.htm http://www.shop263.com/i-45/207.htm http://www.shop263.com/i-45/208.htm http://www.shop263.com/i-45/209.htm http://www.shop263.com/i-45/210.htm http://www.shop263.com/i-45/211.htm http://www.shop263.com/i-45/212.htm http://www.shop263.com/i-45/213.htm http://www.shop263.com/i-45/214.htm http://www.shop263.com/i-45/215.htm http://www.shop263.com/i-45/216.htm http://www.shop263.com/i-45/217.htm http://www.shop263.com/i-45/218.htm http://www.shop263.com/i-45/219.htm http://www.shop263.com/i-45/220.htm http://www.shop263.com/i-45/221.htm http://www.shop263.com/i-45/222.htm http://www.shop263.com/i-45/223.htm http://www.shop263.com/i-45/224.htm http://www.shop263.com/i-45/225.htm http://www.shop263.com/i-45/226.htm http://www.shop263.com/i-45/227.htm http://www.shop263.com/i-45/228.htm http://www.shop263.com/i-45/229.htm http://www.shop263.com/i-45/230.htm http://www.shop263.com/i-45/231.htm http://www.shop263.com/i-45/232.htm http://www.shop263.com/i-45/233.htm http://www.shop263.com/i-45/234.htm http://www.shop263.com/i-45/235.htm http://www.shop263.com/i-45/236.htm http://www.shop263.com/i-45/237.htm http://www.shop263.com/i-45/238.htm http://www.shop263.com/i-45/239.htm http://www.shop263.com/i-45/240.htm http://www.shop263.com/i-45/241.htm http://www.shop263.com/i-45/242.htm http://www.shop263.com/i-45/243.htm http://www.shop263.com/i-45/244.htm http://www.shop263.com/i-45/245.htm http://www.shop263.com/i-45/246.htm http://www.shop263.com/i-45/247.htm http://www.shop263.com/i-45/248.htm http://www.shop263.com/i-45/249.htm http://www.shop263.com/i-45/250.htm http://www.shop263.com/i-45/251.htm http://www.shop263.com/i-45/252.htm