home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / rec / video / 16291 < prev    next >
Encoding:
Text File  |  1993-01-23  |  14.3 KB  |  489 lines

  1. Newsgroups: rec.video
  2. Path: sparky!uunet!mcsun!fuug!anon
  3. From: an7689@anon.penet.fi
  4. Subject: VCR Plus+ PlusCodes:  3 of 3
  5. Message-ID: <1993Jan23.133442.2362@fuug.fi>
  6. Sender: anon@fuug.fi (The Anon Administrator)
  7. Organization: Anonymous contact service
  8. X-Anonymously-To: rec.video
  9. Date: Sat, 23 Jan 1993 12:25:00 GMT
  10. Lines: 477
  11.  
  12.       IMPLICIT INTEGER (A-Z)
  13.       LOGICAL IAM
  14.       CHARACTER QBUFR*20
  15.       DIMENSION V(192), KEY(4), T(0:8), C(0:5), BM(10), B5(5), 
  16.      *   CO(6), KMAT(6,10), D1(6), CHMAP(100)
  17.       DATA IIN, IOUT, IFIN /0, 0, 10/,
  18.      *  KEY(4), KEY(3), KEY(2), KEY(1)
  19.      * /    9,      3,      7,      1 /
  20.       DATA
  21.      *  V(1), V(2), V(3), V(4), V(5), V(6), V(7), V(8), V(9),V(10)
  22.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,    2,  -99/,
  23.      * V(11),V(12),V(13),V(14),V(15),V(16),V(17),V(18),V(19),V(20)
  24.      * /  0,  -99,  -99,  -99,  -99,    1,  -99,  -99,  -99,  -99/,
  25.      * V(21),V(22),V(23),V(24),V(25),V(26),V(27),V(28),V(29),V(30)
  26.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/,
  27.      * V(31),V(32),V(33),V(34),V(35),V(36),V(37),V(38),V(39),V(40)
  28.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/,
  29.      * V(41),V(42),V(43),V(44),V(45),V(46),V(47),V(48),V(49),V(50)
  30.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/
  31.       DATA
  32.      * V(51),V(52),V(53),V(54),V(55),V(56),V(57),V(58),V(59),V(60)
  33.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/,
  34.      * V(61),V(62),V(63),V(64),V(65),V(66),V(67),V(68),V(69),V(70)
  35.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/,
  36.      * V(71),V(72),V(73),V(74),V(75),V(76),V(77),V(78),V(79),V(80)
  37.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/,
  38.      * V(81),V(82),V(83),V(84),V(85),V(86),V(87),V(88),V(89),V(90)
  39.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/,
  40.      * V(91),V(92),V(93),V(94),V(95),V(96),V(97),V(98),V(99),V(100)
  41.      * /-99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99/
  42.       DATA
  43.      * V(101),V(102),V(103),V(104),V(105)
  44.      * / -99,    -99,   -99,   -99,   -99/,
  45.      * V(106),V(107),V(108),V(109),V(110)
  46.      * / -99,    -99,   -99,   -99,   -99/,
  47.      * V(111),V(112),V(113),V(114),V(115)
  48.      * / -99,    -99,   -99,   -99,   -99/,
  49.      * V(116),V(117),V(118),V(119),V(120)
  50.      * / -99,    -99,   -99,   -99,   -99/,
  51.      * V(121),V(122),V(123),V(124),V(125)
  52.      * / -99,    191,   -99,   -99,   -99/,
  53.      * V(126),V(127),V(128),V(129),V(130)
  54.      * / -99,    -99,   -99,   -99,   -99/,
  55.      * V(131),V(132),V(133),V(134),V(135)
  56.      * / -99,    -99,   -99,   -99,   -99/,
  57.      * V(136),V(137),V(138),V(139),V(140)
  58.      * / -99,    -99,   -99,   -99,   -99/,
  59.      * V(141),V(142),V(143),V(144),V(145)
  60.      * / -99,    -99,   -99,   -99,   -99/,
  61.      * V(146),V(147),V(148),V(149),V(150)
  62.      * / -99,    -99,   -99,   -99,   -99/
  63.       DATA
  64.      * V(151),V(152),V(153),V(154),V(155)
  65.      * / -99,    -99,   -99,   -99,   -99/,
  66.      * V(156),V(157),V(158),V(159),V(160)
  67.      * / -99,    -99,   -99,   -99,   -99/,
  68.      * V(161),V(162),V(163),V(164),V(165)
  69.      * / -99,    -99,   -99,   -99,   -99/,
  70.      * V(166),V(167),V(168),V(169),V(170)
  71.      * / -99,    -99,   -99,   -99,   -99/,
  72.      * V(171),V(172),V(173),V(174),V(175)
  73.      * / -99,    -99,   -99,   -99,   -99/,
  74.      * V(176),V(177),V(178),V(179),V(180)
  75.      * / -99,    -99,   -99,   -99,   -99/,
  76.      * V(181),V(182),V(183),V(184),V(185)
  77.      * / -99,    -99,   -99,   -99,   -99/,
  78.      * V(186),V(187),V(188),V(189),V(190)
  79.      * / -99,    -99,   -99,   -99,   -99/,
  80.      * V(191),V(192)
  81.      * / -99,    -99/
  82. C
  83.       DO 1 I = 1, 100
  84.     1 CHMAP(I) = I            
  85.       INQUIRE (FILE='CHANNEL.MAP', EXIST=IAM)
  86.       IF (IAM) THEN
  87.          OPEN(UNIT=IFIN, FILE='CHANNEL.MAP', STATUS='OLD')
  88.     2    READ(IFIN,*,END=4) OLD, NEW
  89.          CHMAP(OLD) = NEW
  90.          GOTO 2
  91.       ENDIF
  92. C Input
  93.     4 CLOSE (IFIN)
  94.       WRITE (IOUT,5)
  95.     5 FORMAT (///
  96.      *   29X,'VCRCode, Version 1.00'/
  97.      *   15X,'A Program to Generate 1 to 6 Digit VCR Plus+ Codes'/
  98.      *   /
  99.      *   23X,'This program is brought to you by'/
  100.      *   /
  101.      *   32X,'The Good Doctor'/
  102.      *   /
  103.      *   9X,'It is based on information  appearing in Shirriff K,  Wel',
  104.      *   'ch C,'/
  105.      *   9X,'Kinsman A, "Decoding a VCR Controller Code,"  Cryptologia',
  106.      *   ',  16'/
  107.      *   27X,'(#3, July 1992), 227-234.'/
  108.      *   //)
  109.    10 WRITE (IOUT,11)
  110.    11 FORMAT (//' Enter starting month/day/year',9X,'(mm/dd/yy)   '$)
  111.       READ (IIN,'(A)') QBUFR
  112.       IF (QBUFR.EQ.' ') STOP ' '
  113.       CALL MPARSE(QBUFR, MONTH, DAY, YEAR, IERR)
  114.       IF (IERR.EQ.1) GOTO 10
  115.       IF (MONTH.LT.1 .OR. MONTH.GT.12) THEN
  116.          WRITE (IOUT,12) MONTH
  117.    12    FORMAT (' Month invalid:',I8,'   Must be in range 1 to 12.')
  118.          GOTO 10
  119.       ENDIF
  120. C
  121.       IF (DAY.LT.1 .OR. 
  122.      *        ((MONTH.EQ.1 .OR. MONTH.EQ.3 .OR. MONTH.EQ.5 .OR. 
  123.      *          MONTH.EQ.7 .OR. MONTH.EQ.8 .OR. MONTH.EQ.10 .OR. 
  124.      *          MONTH.EQ.12) .AND. DAY.GT.31) .OR.
  125.      *        ((MONTH.EQ.4 .OR. MONTH.EQ.6 .OR. MONTH.EQ.9 .OR. 
  126.      *          MONTH.EQ.11) .AND. DAY.GT.30) .OR.
  127.      *         (MONTH.EQ.2 .AND. DAY.GT.29)) THEN
  128.          WRITE (IOUT,15) DAY
  129.    15    FORMAT (' Day invalid:',I8)
  130.          GOTO 10
  131.       ENDIF
  132. C
  133.       IF (YEAR.LT.0 .OR. YEAR.GT.99) THEN
  134.          WRITE (IOUT,17) YEAR
  135.    17    FORMAT (' Year invalid:',I8,'   Must be in range 0 to 99.')
  136.          GOTO 10
  137.       ENDIF
  138.       IF (MONTH.EQ.2 .AND. MOD(YEAR,4).NE.0 .AND. DAY.EQ.29) THEN
  139.          WRITE (IOUT,18) YEAR
  140.    18    FORMAT (' There is no February 29th in year',I3)
  141.          GOTO 10
  142.       ENDIF
  143. C
  144.    29 WRITE (IOUT,30)
  145.    30 FORMAT (7X,'starting time',15X,'(hh:00|30 a|p)   '$)
  146. C
  147.       READ (IIN,'(A)') QBUFR
  148.       CALL TPARSE(QBUFR,HR,MIN,AMPM,IERR)
  149.       IF (IERR.EQ.1) GOTO 29
  150. C
  151.    38 WRITE (IOUT,39)
  152.    39 FORMAT (7X,'channel',38X,TL1,' ',$)
  153.       READ (IIN, *) CHNL
  154.       IF (CHNL.LT.1) THEN
  155.          WRITE (IOUT,40) CHNL
  156.    40    FORMAT (' Channel invalid:',I8,'   Must be positive number.')
  157.          GOTO 38
  158.       ENDIF
  159.       CHNL = CHMAP(CHNL)
  160. C
  161.    41 WRITE (IOUT,42)
  162.    42 FORMAT (7X,'duration (# of half hours)',7X,'(1 to 10)   '$)
  163.       READ (IIN, *) DUR
  164.       IF (DUR.LT.1 .OR. DUR.GT.10) THEN
  165.          WRITE (IOUT,43) DUR
  166.    43    FORMAT (' Duration invalid:',I8,'   Must be in range 1 to 10.')
  167.          GOTO 41
  168.       ENDIF
  169. C
  170.       TABL = 48 * DUR - 24 * (AMPM - 1) - 2 * MOD(HR,12) - MIN / 30
  171.       IF (TABL.GT.192) THEN
  172.          TABL = TABL - 1
  173.       ELSE
  174.          TABL = V(TABL)
  175.       ENDIF
  176. C
  177.    80 IF (TABL.EQ.-99) THEN
  178.          WRITE (IOUT,90)
  179.    90    FORMAT (/' This combination of start time and duration ',
  180.      *       'not tabled.')
  181.          GOTO 10
  182.       ENDIF
  183. C
  184.       DO 100 K = 0, 8
  185.       T(K) = MOD(TABL,2)
  186.       TABL = TABL / 2
  187.   100 CONTINUE
  188. C
  189.       CHNL = CHNL - 1
  190.       DO 110 K = 0, 5
  191.       C(K) = MOD(CHNL,2)
  192.       CHNL = CHNL / 2
  193.   110 CONTINUE
  194. C
  195.       BM(1) = T(3)
  196.       BM(2) = C(2)
  197.       BM(3) = C(3)
  198.       BM(4) = T(4)
  199.       BM(5) = T(5)
  200.       BM(6) = T(6)
  201.       BM(7) = C(4)
  202.       BM(8) = T(7)
  203.       BM(9) = C(5)
  204.       BM(10) = T(8)
  205. C
  206.       MTOP = BM(10)
  207.       DO 130 K = 9, 1, -1
  208.   130 MTOP = 2 * MTOP + BM(K)
  209. C
  210.       IF (MTOP.EQ.0) THEN
  211.          TOP = 0
  212.          OFFSET = 0
  213.          GOTO 200
  214.       ELSE
  215.          DTOP = 1 + IFIX(ALOG10(MTOP))
  216.   140    K = IMAP(DAY,YEAR,MTOP,DTOP)
  217.          IF (K.EQ.0) THEN
  218.             MTOP = K
  219.             GOTO 140
  220.          ENDIF
  221.          IF (1+IFIX(ALOG10(K)).NE.DTOP) THEN
  222.             MTOP = K
  223.             GOTO 140
  224.          ENDIF
  225.          TOP = K
  226.       ENDIF
  227. C
  228.       XTOP = TOP
  229.       OFFSET = OFF(DAY,YEAR,XTOP,DTOP)
  230. C
  231.   200 B5(1) = T(0)
  232.       B5(2) = C(0)
  233.       B5(3) = T(1)
  234.       B5(4) = C(1)
  235.       B5(5) = T(2)
  236. C
  237.       X5 = B5(5)
  238.       DO 230 K = 4, 1, -1
  239.   230 X5 = 2 * X5 + B5(K)
  240. C
  241.       REMAIN = ADDEND(DAY * (MONTH + 1) + OFFSET, 32, X5)
  242.       CODE = 1000 * TOP + 32 * (DAY - 1) + REMAIN + 1
  243.       NC = 1 + IFIX(ALOG10(CODE))
  244. C CO(), digits of CODE
  245. C Lowest order digit goes in (1)
  246.       XCODE = CODE
  247.   340 DO 350 I = 1, NC
  248.       CO(I) = MOD(XCODE, 10)
  249.       XCODE = XCODE / 10
  250.   350 CONTINUE
  251. C No carry multiply
  252.       DO 360 I = 1, NC
  253.       DO 360 J = 1, 10
  254.   360 KMAT(I,J) = 0
  255.       DO 380 I = 1, NC
  256.       DO 380 J = 1, 4
  257.   380 KMAT(I,J+I-1) = MOD(CO(I)*KEY(J),10)
  258.       DO 390 I = 1, 6
  259.   390 D1(I) = 0
  260.       DO 420 K = 1, NC
  261.       DO 410 KK = 1, NC
  262.   410 D1(K) = D1(K) + KMAT(KK,K)
  263.       D1(K) = MOD (D1(K),10)
  264.   420 CONTINUE
  265.       XCODE = D1(NC)
  266.       DO 430 I = NC-1, 1, -1
  267.   430 XCODE = 10 * XCODE + D1(I)
  268.       IF (D1(NC).EQ.0) GOTO 340
  269.       WRITE (IOUT,500) XCODE
  270.   500 FORMAT (/' The VCR Plus+ PlusCode is ',I6)
  271. C      
  272.       GOTO 10
  273.       END
  274. C***********************************************************************
  275.       INTEGER FUNCTION OFF(DAY,YEAR,TOP,NT)
  276.       IMPLICIT INTEGER (A-Z)
  277. C
  278.       OFF = MOD(TOP, 10) + MOD(TOP/10, 10) + MOD(TOP/100, 10)
  279.    40 DO 50 I = 0, MOD(YEAR,16)
  280.    50 OFF = OFF + MOD(MAP(DAY,I,TOP,NT), 10)
  281.       TOP = MAP(DAY,YEAR,TOP,NT)
  282.       IF (TOP.LT.10**(NT-1)) GOTO 40
  283. C
  284.    60 OFF = MOD(OFF,32)
  285.       RETURN
  286.       END
  287. C***********************************************************************
  288.       INTEGER FUNCTION MAP(DAY,YR,TOP,NT)
  289.       IMPLICIT INTEGER (A-Z)
  290.       DIMENSION D(0:2)
  291. C
  292.       YEAR = MOD(YR,16)
  293.       XTOP = TOP
  294.       DO 10 I = 0, 2
  295.       D(I) = MOD(XTOP,10)
  296.       XTOP = XTOP / 10
  297.    10 CONTINUE
  298. C
  299.       F0 = 1
  300.       F1 = MOD(YEAR+1,10)
  301.       F2 = MOD((YEAR+1)*(YEAR+2)/2,10)
  302.       F3 = MOD((YEAR+1)*(YEAR+2)*(YEAR+3)/6,10)
  303.       IF (NT.EQ.1) THEN
  304.          MAP = MOD(D(0)*F0+DAY*F1,10)
  305.       ELSEIF (NT.EQ.2) THEN
  306.          MAP = 10 * MOD(D(1)*F0+DAY*F1,10) + 
  307.      *               MOD(D(0)*F0+D(1)*F1+DAY*F2,10)
  308.       ELSE
  309.          MAP = 100 * MOD(D(2)*F0+DAY*F1,10) + 
  310.      *           10 * MOD(D(1)*F0+D(2)*F1+DAY*F2,10) +
  311.      *                 MOD(D(0)*F0+D(1)*F1+D(2)*F2+DAY*F3,10)
  312.       ENDIF
  313.       RETURN
  314.       END
  315. C***********************************************************************
  316.       INTEGER FUNCTION IMAP(DAY,YR,TOP,NT)
  317.       IMPLICIT INTEGER (A-Z)
  318.       DIMENSION N(0:2)
  319. C
  320.       YEAR = MOD(YR,16)
  321.       XTOP = TOP
  322.       DO 10 I = 0, 2
  323.       N(I) = MOD(XTOP,10)
  324.       XTOP = XTOP / 10
  325.    10 CONTINUE
  326. C
  327.       F0 = 1
  328.       F1 = MOD(YEAR+1,10)
  329.       F2 = MOD((YEAR+1)*(YEAR+2)/2,10)
  330.       F3 = MOD((YEAR+1)*(YEAR+2)*(YEAR+3)/6,10)
  331. C
  332.       X1 = ADDEND(DAY*F1,10,N(NT-1))
  333.       IF (NT.EQ.1) THEN
  334.          IMAP = X1
  335.          RETURN
  336.       ENDIF
  337. C
  338.       X2 = ADDEND(X1*F1+DAY*F2,10,N(NT-2))
  339.       IF (NT.EQ.2) THEN
  340.          IMAP = 10 * X1 + X2
  341.          RETURN
  342.       ENDIF
  343. C
  344.       X3 = ADDEND(X2*F1+X1*F2+DAY*F3,10,N(0))
  345.       IMAP = 100 * X1 + 10 * X2 + X3
  346.       RETURN
  347.       END
  348. C***********************************************************************
  349.       INTEGER FUNCTION ADDEND(A,B,R)
  350.       IMPLICIT INTEGER (A-Z)
  351. C Returns X such that  R = (A+X) mod B
  352.       Y = MOD(A,B)
  353.       IF (Y.LE.R) THEN
  354.          ADDEND = R - Y
  355.       ELSE
  356.          ADDEND = B - (Y - R)
  357.       ENDIF
  358.       RETURN
  359.       END
  360. C***********************************************************************
  361.       SUBROUTINE TPARSE(QTC,HR,MIN,AMPM,IERR)
  362.       IMPLICIT INTEGER (A-Z)
  363.       CHARACTER QTC*20, QT*20, QT1(20)*1
  364.       EQUIVALENCE (QT,QT1)
  365.       DATA IOUT /0/
  366. C
  367.       IERR = 1
  368.       QT = QTC
  369.       IF (QT.EQ.' ') RETURN
  370. C Strip spaces : -
  371.       LQ = 0
  372.       DO 10 I = 1, 20
  373.       IF (QT1(I).NE.' ' .AND. QT1(I).NE.':' .AND. QT1(I).NE.'-') THEN
  374.          LQ = LQ + 1
  375.          QT1(LQ) = QT1(I)
  376.       ENDIF
  377.    10 CONTINUE
  378. C AM/PM
  379.       IF (QT1(LQ).EQ.'a' .OR. QT1(LQ).EQ.'A') THEN
  380.          AMPM = 1
  381.       ELSEIF (QT1(LQ).EQ.'p' .OR. QT1(LQ).EQ.'P') THEN
  382.          AMPM = 2
  383.       ELSE
  384.          WRITE (IOUT,20) 
  385.    20    FORMAT (' Starting time must end in A or P.')
  386.          RETURN
  387.       ENDIF
  388. C
  389.       LQ = LQ - 1 
  390.       DO 30 I = 1, LQ
  391.       IF (QT1(I).LT.'0' .OR. QT1(I).GT.'9') THEN
  392.          WRITE (IOUT,40) QTC
  393.    40    FORMAT (' Starting time must be of the form  hh:00|30 a|p:  ',
  394.      *     A10)
  395.          RETURN
  396.       ENDIF
  397.    30 CONTINUE
  398. C Minutes
  399.       IF (LQ.EQ.4 .AND. QT(3:4).EQ.'00') THEN
  400.          MIN = 0
  401.          LQ = 2
  402.       ELSEIF (LQ.EQ.4 .AND. QT(3:4).EQ.'30') THEN
  403.          MIN = 30
  404.          LQ = 2
  405.       ELSEIF (LQ.EQ.4) THEN
  406.          WRITE (IOUT,50) QT(3:4)
  407.    50    FORMAT (' Minutes invalid:',''A2'','   Must be 00 or 30.')
  408.          RETURN
  409.       ELSEIF (LQ.EQ.3 .AND. QT(2:3).EQ.'00') THEN
  410.          MIN = 0
  411.          LQ = 1
  412.       ELSEIF (LQ.EQ.3 .AND. QT(2:3).EQ.'30') THEN
  413.          MIN = 30
  414.          LQ = 1
  415.       ELSEIF (LQ.EQ.3) THEN
  416.          WRITE (IOUT,50) QT(2:3)
  417.          RETURN
  418.       ELSE
  419.          MIN = 0
  420.       ENDIF
  421. C Hour
  422.       READ (QT(1:LQ),'(I2)') HR
  423.       IF (HR.LT.1 .OR.HR.GT.12) THEN
  424.          WRITE (IOUT,60) HR
  425.    60    FORMAT (' Hour invalid:',I8,'   Must be in range 1 to 12.')
  426.          RETURN
  427.       ENDIF
  428.       IERR = 0
  429.       RETURN
  430.       END
  431. C***********************************************************************
  432.       SUBROUTINE MPARSE(QDC,MO,DA,YR,IERR)
  433.       IMPLICIT INTEGER (A-Z)
  434.       DIMENSION NSL(2)
  435.       CHARACTER QDC*20, QD*20, QD1(20)*1
  436.       EQUIVALENCE (QD,QD1)
  437.       DATA IOUT /0/
  438. C
  439.       IERR = 1
  440.       QD = QDC
  441.       IF (QD.EQ.' ') RETURN
  442. C Must have embedded slashes
  443.       KSL = 0
  444.       DO 10 I = 1, 20
  445.       IF (QD1(I).EQ.'/') KSL = KSL + 1
  446.    10 CONTINUE
  447.       IF (KSL.NE.2) THEN
  448.          WRITE (IOUT,20)
  449.    20    FORMAT (' Month, day, and year must be separated by /''s.')
  450.          RETURN
  451.       ENDIF
  452. C Strip spaces; check digits
  453.       LQ = 0
  454.       ISL = 0
  455.       DO 40 I = 1, 20
  456.       IF (QD1(I).NE.' ') THEN
  457.          IF (QD1(I).EQ.'/') THEN
  458.             LQ = LQ + 1
  459.             QD1(LQ) = QD1(I)
  460.             ISL = ISL + 1
  461.             NSL(ISL) = LQ
  462.          ELSEIF (QD1(I).GE.'0' .AND. QD1(I).LE.'9') THEN
  463.             LQ = LQ + 1
  464.             QD1(LQ) = QD1(I)
  465.          ELSE
  466.             WRITE (IOUT,30) QDC
  467.    30       FORMAT (' Starting date must be of the form  mm/dd/yy:'
  468.      *        A20)
  469.             RETURN
  470.          ENDIF
  471.       ENDIF
  472.    40 CONTINUE
  473.       IF (LQ.NE.NSL(2)+2) THEN
  474.         WRITE (IOUT,30) QDC
  475.         RETURN
  476.       ENDIF
  477. C Month
  478.       READ (QD(1:NSL(1)-1),'(I2)') MO
  479.       READ (QD(NSL(1)+1:NSL(2)-1),'(I2)') DA
  480.       READ (QD(LQ-1:LQ),'(I2)') YR
  481.       IERR = 0
  482.       RETURN
  483.       END
  484. C***********************************************************************
  485. -------------------------------------------------------------------------
  486. To find out more about the anon service, send mail to help@anon.penet.fi.
  487. Due to the double-blind system, any replies to this message will be anonymized,
  488. and an anonymous id will be allocated automatically. You have been warned.
  489.